configure_linux.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package sandbox
  2. import (
  3. "fmt"
  4. "net"
  5. "os"
  6. "runtime"
  7. "github.com/vishvananda/netlink"
  8. "github.com/vishvananda/netns"
  9. )
  10. func configureInterface(iface netlink.Link, settings *Interface) error {
  11. ifaceName := iface.Attrs().Name
  12. ifaceConfigurators := []struct {
  13. Fn func(netlink.Link, *Interface) error
  14. ErrMessage string
  15. }{
  16. {setInterfaceName, fmt.Sprintf("error renaming interface %q to %q", ifaceName, settings.DstName)},
  17. {setInterfaceIP, fmt.Sprintf("error setting interface %q IP to %q", ifaceName, settings.Address)},
  18. {setInterfaceIPv6, fmt.Sprintf("error setting interface %q IPv6 to %q", ifaceName, settings.AddressIPv6)},
  19. }
  20. for _, config := range ifaceConfigurators {
  21. if err := config.Fn(iface, settings); err != nil {
  22. return fmt.Errorf("%s: %v", config.ErrMessage, err)
  23. }
  24. }
  25. return nil
  26. }
  27. func setGatewayIP(path string, gw net.IP) error {
  28. runtime.LockOSThread()
  29. defer runtime.UnlockOSThread()
  30. origns, err := netns.Get()
  31. if err != nil {
  32. return err
  33. }
  34. defer origns.Close()
  35. f, err := os.OpenFile(path, os.O_RDONLY, 0)
  36. if err != nil {
  37. return fmt.Errorf("failed get network namespace %q: %v", path, err)
  38. }
  39. defer f.Close()
  40. nsFD := f.Fd()
  41. if err = netns.Set(netns.NsHandle(nsFD)); err != nil {
  42. return err
  43. }
  44. defer netns.Set(origns)
  45. return netlink.RouteAdd(&netlink.Route{
  46. Scope: netlink.SCOPE_UNIVERSE,
  47. Gw: gw,
  48. })
  49. }
  50. func setInterfaceIP(iface netlink.Link, settings *Interface) error {
  51. ipAddr := &netlink.Addr{IPNet: settings.Address, Label: ""}
  52. return netlink.AddrAdd(iface, ipAddr)
  53. }
  54. func setInterfaceIPv6(iface netlink.Link, settings *Interface) error {
  55. if settings.AddressIPv6 == nil {
  56. return nil
  57. }
  58. ipAddr := &netlink.Addr{IPNet: settings.AddressIPv6, Label: ""}
  59. return netlink.AddrAdd(iface, ipAddr)
  60. }
  61. func setInterfaceName(iface netlink.Link, settings *Interface) error {
  62. return netlink.LinkSetName(iface, settings.DstName)
  63. }