tun.go 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. package overlay
  2. import (
  3. "fmt"
  4. "net"
  5. "runtime"
  6. "github.com/sirupsen/logrus"
  7. "github.com/slackhq/nebula/cidr"
  8. "github.com/slackhq/nebula/config"
  9. "github.com/slackhq/nebula/util"
  10. )
  11. const DefaultMTU = 1300
  12. func NewDeviceFromConfig(c *config.C, l *logrus.Logger, tunCidr *net.IPNet, fd *int, routines int) (Device, error) {
  13. routes, err := parseRoutes(c, tunCidr)
  14. if err != nil {
  15. return nil, util.NewContextualError("Could not parse tun.routes", nil, err)
  16. }
  17. unsafeRoutes, err := parseUnsafeRoutes(c, tunCidr)
  18. if err != nil {
  19. return nil, util.NewContextualError("Could not parse tun.unsafe_routes", nil, err)
  20. }
  21. routes = append(routes, unsafeRoutes...)
  22. switch {
  23. case c.GetBool("tun.disabled", false):
  24. tun := newDisabledTun(tunCidr, c.GetInt("tun.tx_queue", 500), c.GetBool("stats.message_metrics", false), l)
  25. return tun, nil
  26. case fd != nil:
  27. return newTunFromFd(
  28. l,
  29. *fd,
  30. tunCidr,
  31. c.GetInt("tun.mtu", DefaultMTU),
  32. routes,
  33. c.GetInt("tun.tx_queue", 500),
  34. )
  35. default:
  36. return newTun(
  37. l,
  38. c.GetString("tun.dev", ""),
  39. tunCidr,
  40. c.GetInt("tun.mtu", DefaultMTU),
  41. routes,
  42. c.GetInt("tun.tx_queue", 500),
  43. routines > 1,
  44. )
  45. }
  46. }
  47. func makeCidrTree(routes []Route, allowMTU bool) (*cidr.Tree4, error) {
  48. cidrTree := cidr.NewTree4()
  49. for _, r := range routes {
  50. if !allowMTU && r.MTU > 0 {
  51. return nil, fmt.Errorf("route MTU is not supported in %s", runtime.GOOS)
  52. }
  53. if r.Via != nil {
  54. cidrTree.AddCIDR(r.Cidr, r.Via)
  55. }
  56. }
  57. return cidrTree, nil
  58. }