configure_linux.go 1.4 KB

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