configure.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package libnetwork
  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. {setInterfaceGateway, fmt.Sprintf("error setting interface %q gateway to %q", ifaceName, settings.Gateway)},
  17. {setInterfaceGatewayIPv6, fmt.Sprintf("error setting interface %q IPv6 gateway to %q", ifaceName, settings.GatewayIPv6)},
  18. }
  19. for _, config := range ifaceConfigurators {
  20. if err := config.Fn(iface, settings); err != nil {
  21. return fmt.Errorf("%s: %v", config.ErrMessage, err)
  22. }
  23. }
  24. return nil
  25. }
  26. func setGatewayIP(iface netlink.Link, ip net.IP) error {
  27. return netlink.RouteAdd(&netlink.Route{
  28. LinkIndex: iface.Attrs().Index,
  29. Scope: netlink.SCOPE_UNIVERSE,
  30. Gw: ip,
  31. })
  32. }
  33. func setInterfaceGateway(iface netlink.Link, settings *Interface) error {
  34. ip := net.ParseIP(settings.Gateway)
  35. if ip == nil {
  36. return fmt.Errorf("bad address format %q", settings.Gateway)
  37. }
  38. return setGatewayIP(iface, ip)
  39. }
  40. func setInterfaceGatewayIPv6(iface netlink.Link, settings *Interface) error {
  41. if settings.GatewayIPv6 != "" {
  42. return nil
  43. }
  44. ip := net.ParseIP(settings.GatewayIPv6)
  45. if ip == nil {
  46. return fmt.Errorf("bad address format %q", settings.GatewayIPv6)
  47. }
  48. return setGatewayIP(iface, ip)
  49. }
  50. func setInterfaceIP(iface netlink.Link, settings *Interface) (err error) {
  51. var ipAddr *netlink.Addr
  52. if ipAddr, err = netlink.ParseAddr(settings.Address); err == nil {
  53. err = netlink.AddrAdd(iface, ipAddr)
  54. }
  55. return err
  56. }
  57. func setInterfaceIPv6(iface netlink.Link, settings *Interface) (err error) {
  58. if settings.AddressIPv6 != "" {
  59. return nil
  60. }
  61. var ipAddr *netlink.Addr
  62. if ipAddr, err = netlink.ParseAddr(settings.AddressIPv6); err == nil {
  63. err = netlink.AddrAdd(iface, ipAddr)
  64. }
  65. return err
  66. }
  67. func setInterfaceName(iface netlink.Link, settings *Interface) error {
  68. return netlink.LinkSetName(iface, settings.DstName)
  69. }