func()

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
}