tun.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. package overlay
  2. import (
  3. "net/netip"
  4. "github.com/sirupsen/logrus"
  5. "github.com/slackhq/nebula/config"
  6. "github.com/slackhq/nebula/util"
  7. )
  8. const DefaultMTU = 1300
  9. // TODO: We may be able to remove routines
  10. type DeviceFactory func(c *config.C, l *logrus.Logger, vpnNetworks []netip.Prefix, routines int) (Device, error)
  11. func NewDeviceFromConfig(c *config.C, l *logrus.Logger, vpnNetworks []netip.Prefix, routines int) (Device, error) {
  12. switch {
  13. case c.GetBool("tun.disabled", false):
  14. tun := newDisabledTun(vpnNetworks, c.GetInt("tun.tx_queue", 500), c.GetBool("stats.message_metrics", false), l)
  15. return tun, nil
  16. default:
  17. return newTun(c, l, vpnNetworks, routines > 1)
  18. }
  19. }
  20. func NewFdDeviceFromConfig(fd *int) DeviceFactory {
  21. return func(c *config.C, l *logrus.Logger, vpnNetworks []netip.Prefix, routines int) (Device, error) {
  22. return newTunFromFd(c, l, *fd, vpnNetworks)
  23. }
  24. }
  25. func getAllRoutesFromConfig(c *config.C, vpnNetworks []netip.Prefix, initial bool) (bool, []Route, error) {
  26. if !initial && !c.HasChanged("tun.routes") && !c.HasChanged("tun.unsafe_routes") {
  27. return false, nil, nil
  28. }
  29. routes, err := parseRoutes(c, vpnNetworks)
  30. if err != nil {
  31. return true, nil, util.NewContextualError("Could not parse tun.routes", nil, err)
  32. }
  33. unsafeRoutes, err := parseUnsafeRoutes(c, vpnNetworks)
  34. if err != nil {
  35. return true, nil, util.NewContextualError("Could not parse tun.unsafe_routes", nil, err)
  36. }
  37. routes = append(routes, unsafeRoutes...)
  38. return true, routes, nil
  39. }
  40. // findRemovedRoutes will return all routes that are not present in the newRoutes list and would affect the system route table.
  41. // Via is not used to evaluate since it does not affect the system route table.
  42. func findRemovedRoutes(newRoutes, oldRoutes []Route) []Route {
  43. var removed []Route
  44. has := func(entry Route) bool {
  45. for _, check := range newRoutes {
  46. if check.Equal(entry) {
  47. return true
  48. }
  49. }
  50. return false
  51. }
  52. for _, oldEntry := range oldRoutes {
  53. if !has(oldEntry) {
  54. removed = append(removed, oldEntry)
  55. }
  56. }
  57. return removed
  58. }