configure_linux.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. package sandbox
  2. import (
  3. "fmt"
  4. "net"
  5. "github.com/vishvananda/netlink"
  6. )
  7. func configureInterface(iface netlink.Link, settings *Interface) error {
  8. ifaceName := iface.Attrs().Name
  9. ifaceConfigurators := []struct {
  10. Fn func(netlink.Link, *Interface) error
  11. ErrMessage string
  12. }{
  13. {setInterfaceName, fmt.Sprintf("error renaming interface %q to %q", ifaceName, settings.DstName)},
  14. {setInterfaceIP, fmt.Sprintf("error setting interface %q IP to %q", ifaceName, settings.Address)},
  15. {setInterfaceIPv6, fmt.Sprintf("error setting interface %q IPv6 to %q", ifaceName, settings.AddressIPv6)},
  16. }
  17. for _, config := range ifaceConfigurators {
  18. if err := config.Fn(iface, settings); err != nil {
  19. return fmt.Errorf("%s: %v", config.ErrMessage, err)
  20. }
  21. }
  22. return nil
  23. }
  24. func setGatewayIP(gw net.IP) error {
  25. return netlink.RouteAdd(&netlink.Route{
  26. Scope: netlink.SCOPE_UNIVERSE,
  27. Gw: gw,
  28. })
  29. }
  30. func setInterfaceIP(iface netlink.Link, settings *Interface) error {
  31. ipAddr := &netlink.Addr{IPNet: settings.Address, Label: ""}
  32. return netlink.AddrAdd(iface, ipAddr)
  33. }
  34. func setInterfaceIPv6(iface netlink.Link, settings *Interface) error {
  35. ipAddr := &netlink.Addr{IPNet: settings.Address, Label: ""}
  36. return netlink.AddrAdd(iface, ipAddr)
  37. }
  38. func setInterfaceName(iface netlink.Link, settings *Interface) error {
  39. return netlink.LinkSetName(iface, settings.DstName)
  40. }