in plugins/vpc-shared-eni/network/bridge_linux.go [756:850]
func (nb *BridgeBuilder) setupVethLink(
vethPeerName string,
ifName string,
ipAddresses []net.IPNet,
gatewayIPAddresses []net.IP,
gatewayMACAddress net.HardwareAddr) error {
var link netlink.Link
// Rename the veth link to the requested interface name.
log.Infof("Renaming link %s to %s.", vethPeerName, ifName)
la := netlink.NewLinkAttrs()
la.Name = vethPeerName
link = &netlink.Dummy{LinkAttrs: la}
err := netlink.LinkSetName(link, ifName)
if err != nil {
log.Errorf("Failed to set veth link %s name: %v.", vethPeerName, err)
return err
}
// Set the link operational state up.
la = netlink.NewLinkAttrs()
la.Name = ifName
link = &netlink.Dummy{LinkAttrs: la}
err = netlink.LinkSetUp(link)
if err != nil {
log.Errorf("Failed to set veth link state up: %v.", err)
return err
}
// Assign IP addresses.
for _, ipAddress := range ipAddresses {
if ipAddress.IP.To4() == nil {
// Disable IPv6 duplicate address detection to speed up address assignment.
// Linux does not implement DAD for IPv4 addresses.
log.Infof("Disabling IPv6 accept DAD on %s.", ifName)
err = ipcfg.SetIPv6AcceptDAD(ifName, 0)
if err != nil {
log.Errorf("Failed to disable IPv6 accept DAD on %s: %v.", ifName, err)
return err
}
}
log.Infof("Assigning IP address %v to link %s.", ipAddress, ifName)
address := &netlink.Addr{IPNet: &ipAddress}
err = netlink.AddrAdd(link, address)
if err != nil {
log.Errorf("Failed to assign IP address to link %v: %v.", ifName, err)
return err
}
}
iface, err := net.InterfaceByName(ifName)
if err != nil {
log.Errorf("Failed to find link index: %v.", err)
return err
}
// Set default routes.
for _, gatewayIPAddress := range gatewayIPAddresses {
// Add default route to the specified gateway on the veth link.
route := &netlink.Route{
LinkIndex: iface.Index,
Gw: gatewayIPAddress,
Flags: int(netlink.FLAG_ONLINK),
}
log.Infof("Adding default IP route %+v.", route)
err = netlink.RouteAdd(route)
if err != nil {
log.Errorf("Failed to add IP route %+v: %v.", route, err)
return err
}
// Add a permanent neighbor entry for the IPv4 gateway if a MAC address is specified.
if gatewayMACAddress != nil && gatewayIPAddress.To4() != nil {
neigh := &netlink.Neigh{
LinkIndex: iface.Index,
Family: netlink.FAMILY_V4,
State: netlink.NUD_PERMANENT,
IP: gatewayIPAddress,
HardwareAddr: gatewayMACAddress,
}
log.Infof("Adding neighbor entry for gateway %+v.", neigh)
err = netlink.NeighAdd(neigh)
if err != nil {
log.Errorf("Failed to add neighbor %+v: %v.", neigh, err)
return err
}
}
}
return nil
}