func()

in cmd/routed-eni-cni-plugin/driver/driver.go [351:400]


func (n *linuxNetwork) setupVeth(hostVethName string, contVethName string, netnsPath string, v4Addr *net.IPNet, v6Addr *net.IPNet, mtu int, log logger.Logger) (netlink.Link, error) {
	// Clean up if hostVeth exists.
	if oldHostVeth, err := n.netLink.LinkByName(hostVethName); err == nil {
		if err = n.netLink.LinkDel(oldHostVeth); err != nil {
			return nil, errors.Wrapf(err, "failed to delete old hostVeth %s", hostVethName)
		}
		log.Debugf("Successfully deleted old hostVeth %s", hostVethName)
	}

	createVethContext := newCreateVethPairContext(contVethName, hostVethName, v4Addr, v6Addr, mtu)
	if err := n.ns.WithNetNSPath(netnsPath, createVethContext.run); err != nil {
		return nil, errors.Wrap(err, "failed to setup veth network")
	}

	hostVeth, err := n.netLink.LinkByName(hostVethName)
	if err != nil {
		return nil, errors.Wrapf(err, "failed to find hostVeth %s", hostVethName)
	}

	// For IPv6, host veth sysctls must be set to:
	// 1. accept_ra=0
	// 2. accept_redirects=1
	// 3. forwarding=0
	if err := n.procSys.Set(fmt.Sprintf("net/ipv6/conf/%s/accept_ra", hostVethName), "0"); err != nil {
		if !os.IsNotExist(err) {
			return nil, errors.Wrapf(err, "failed to disable IPv6 router advertisements")
		}
		log.Debugf("Ignoring '%v' writing to accept_ra: Assuming kernel lacks IPv6 support", err)
	}
	if err := n.procSys.Set(fmt.Sprintf("net/ipv6/conf/%s/accept_redirects", hostVethName), "1"); err != nil {
		if !os.IsNotExist(err) {
			return nil, errors.Wrapf(err, "failed to disable IPv6 ICMP redirects")
		}
		log.Debugf("Ignoring '%v' writing to accept_redirects: Assuming kernel lacks IPv6 support", err)
	}
	if err := n.procSys.Set(fmt.Sprintf("net/ipv6/conf/%s/forwarding", hostVethName), "0"); err != nil {
		if !os.IsNotExist(err) {
			return nil, errors.Wrapf(err, "failed to disable IPv6 forwarding")
		}
		log.Debugf("Ignoring '%v' writing to forwarding: Assuming kernel lacks IPv6 support", err)
	}
	log.Debugf("Successfully set IPv6 sysctls on hostVeth %s", hostVethName)

	// Explicitly set the veth to UP state, because netlink doesn't always do that on all the platforms with net.FlagUp.
	// veth won't get a link local address unless it's set to UP state.
	if err = n.netLink.LinkSetUp(hostVeth); err != nil {
		return nil, errors.Wrapf(err, "failed to setup hostVeth %s", hostVethName)
	}
	return hostVeth, nil
}