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
}