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
}