mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
96 lines
2.9 KiB
Go
96 lines
2.9 KiB
Go
|
package libnetwork
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"net"
|
||
|
|
||
|
"github.com/vishvananda/netlink"
|
||
|
)
|
||
|
|
||
|
func configureInterface(iface netlink.Link, settings *Interface) error {
|
||
|
ifaceName := iface.Attrs().Name
|
||
|
ifaceConfigurators := []struct {
|
||
|
Fn func(netlink.Link, *Interface) error
|
||
|
ErrMessage string
|
||
|
}{
|
||
|
{setInterfaceName, fmt.Sprintf("error renaming interface %q to %q", ifaceName, settings.DstName)},
|
||
|
{setInterfaceMAC, fmt.Sprintf("error setting interface %q MAC address to %q", ifaceName, settings.MacAddress)},
|
||
|
{setInterfaceIP, fmt.Sprintf("error setting interface %q IP to %q", ifaceName, settings.Address)},
|
||
|
{setInterfaceIPv6, fmt.Sprintf("error setting interface %q IPv6 to %q", ifaceName, settings.AddressIPv6)},
|
||
|
{setInterfaceMTU, fmt.Sprintf("error setting interface %q MTU to %q", ifaceName, settings.MTU)},
|
||
|
{setInterfaceGateway, fmt.Sprintf("error setting interface %q gateway to %q", ifaceName, settings.Gateway)},
|
||
|
{setInterfaceGatewayIPv6, fmt.Sprintf("error setting interface %q IPv6 gateway to %q", ifaceName, settings.GatewayIPv6)},
|
||
|
}
|
||
|
|
||
|
for _, config := range ifaceConfigurators {
|
||
|
if err := config.Fn(iface, settings); err != nil {
|
||
|
return fmt.Errorf("%s: %v", config.ErrMessage, err)
|
||
|
}
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func setGatewayIP(iface netlink.Link, ip net.IP) error {
|
||
|
return netlink.RouteAdd(&netlink.Route{
|
||
|
LinkIndex: iface.Attrs().Index,
|
||
|
Scope: netlink.SCOPE_UNIVERSE,
|
||
|
Gw: ip,
|
||
|
})
|
||
|
}
|
||
|
|
||
|
func setInterfaceGateway(iface netlink.Link, settings *Interface) error {
|
||
|
ip := net.ParseIP(settings.Gateway)
|
||
|
if ip == nil {
|
||
|
return fmt.Errorf("bad address format %q", settings.Gateway)
|
||
|
}
|
||
|
return setGatewayIP(iface, ip)
|
||
|
}
|
||
|
|
||
|
func setInterfaceGatewayIPv6(iface netlink.Link, settings *Interface) error {
|
||
|
if settings.GatewayIPv6 != "" {
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
ip := net.ParseIP(settings.GatewayIPv6)
|
||
|
if ip == nil {
|
||
|
return fmt.Errorf("bad address format %q", settings.GatewayIPv6)
|
||
|
}
|
||
|
return setGatewayIP(iface, ip)
|
||
|
}
|
||
|
|
||
|
func setInterfaceIP(iface netlink.Link, settings *Interface) (err error) {
|
||
|
var ipAddr *netlink.Addr
|
||
|
if ipAddr, err = netlink.ParseAddr(settings.Address); err == nil {
|
||
|
err = netlink.AddrAdd(iface, ipAddr)
|
||
|
}
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
func setInterfaceIPv6(iface netlink.Link, settings *Interface) (err error) {
|
||
|
if settings.AddressIPv6 != "" {
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
var ipAddr *netlink.Addr
|
||
|
if ipAddr, err = netlink.ParseAddr(settings.AddressIPv6); err == nil {
|
||
|
err = netlink.AddrAdd(iface, ipAddr)
|
||
|
}
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
func setInterfaceMAC(iface netlink.Link, settings *Interface) (err error) {
|
||
|
var hwAddr net.HardwareAddr
|
||
|
if hwAddr, err = net.ParseMAC(settings.MacAddress); err == nil {
|
||
|
err = netlink.LinkSetHardwareAddr(iface, hwAddr)
|
||
|
}
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
func setInterfaceMTU(iface netlink.Link, settings *Interface) error {
|
||
|
return netlink.LinkSetMTU(iface, settings.MTU)
|
||
|
}
|
||
|
|
||
|
func setInterfaceName(iface netlink.Link, settings *Interface) error {
|
||
|
return netlink.LinkSetName(iface, settings.DstName)
|
||
|
}
|