func()

in cmd/routed-eni-cni-plugin/driver/driver.go [403:457]


func (n *linuxNetwork) setupVlan(vlanID int, eniMAC string, subnetGW string, parentIfIndex int, rtTable int, log logger.Logger) (netlink.Link, error) {
	vlanLinkName := buildVlanLinkName(vlanID)
	// 1. clean up if vlan already exists (necessary when trunk ENI changes).
	if oldVlan, err := n.netLink.LinkByName(vlanLinkName); err == nil {
		if err := n.netLink.LinkDel(oldVlan); err != nil {
			return nil, errors.Wrapf(err, "failed to delete old vlan link %s", vlanLinkName)
		}
		log.Debugf("Successfully deleted old vlan link: %s", vlanLinkName)
	}

	// 2. add new vlan link
	vlanLink := buildVlanLink(vlanLinkName, vlanID, parentIfIndex, eniMAC)
	if err := n.netLink.LinkAdd(vlanLink); err != nil {
		return nil, errors.Wrapf(err, "failed to add vlan link %s", vlanLinkName)
	}

	// 3. Set IPv6 sysctls
	//    accept_ra=0
	//    accept_redirects=1
	//    forwarding=0
	if err := n.procSys.Set(fmt.Sprintf("net/ipv6/conf/%s/accept_ra", vlanLinkName), "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", vlanLinkName), "1"); err != nil {
		if !os.IsNotExist(err) {
			return nil, errors.Wrapf(err, "failed to enable 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", vlanLinkName), "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)
	}

	// 4. bring up the vlan
	if err := n.netLink.LinkSetUp(vlanLink); err != nil {
		return nil, errors.Wrapf(err, "failed to setUp vlan link %s", vlanLinkName)
	}

	// 5. create default routes for vlan
	routes := buildRoutesForVlan(rtTable, vlanLink.Index, net.ParseIP(subnetGW))
	for _, r := range routes {
		if err := n.netLink.RouteReplace(&r); err != nil {
			return nil, errors.Wrapf(err, "failed to replace route entry %s via %s", r.Dst.IP.String(), subnetGW)
		}
	}
	return vlanLink, nil
}