Skip to content

Add EUI on IPv6 L2VNIs for IPv6 ND #146

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 15 additions & 13 deletions pkg/nl/create.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
if err := n.toolkit.LinkAdd(&netlinkVrf); err != nil {
return nil, fmt.Errorf("error adding link: %w", err)
}
if err := n.disableEUIAutogeneration(vrfName); err != nil {
if err := n.setEUIAutogeneration(vrfName, false); err != nil {
return nil, err
}
if err := n.toolkit.LinkSetUp(&netlinkVrf); err != nil {
Expand All @@ -36,7 +36,7 @@
return &netlinkVrf, nil
}

func (n *Manager) createBridge(bridgeName string, macAddress *net.HardwareAddr, masterIdx, mtu int, underlayRMAC bool) (*netlink.Bridge, error) {
func (n *Manager) createBridge(bridgeName string, macAddress *net.HardwareAddr, masterIdx, mtu int, underlayRMAC bool, assignEUI bool) (*netlink.Bridge, error) {

Check failure on line 39 in pkg/nl/create.go

View workflow job for this annotation

GitHub Actions / lint

paramTypeCombine: func(bridgeName string, macAddress *net.HardwareAddr, masterIdx, mtu int, underlayRMAC bool, assignEUI bool) (*netlink.Bridge, error) could be replaced with func(bridgeName string, macAddress *net.HardwareAddr, masterIdx, mtu int, underlayRMAC, assignEUI bool) (*netlink.Bridge, error) (gocritic)
netlinkBridge := netlink.Bridge{
LinkAttrs: netlink.LinkAttrs{
Name: bridgeName,
Expand Down Expand Up @@ -64,7 +64,7 @@
if err := n.toolkit.LinkAdd(&netlinkBridge); err != nil {
return nil, fmt.Errorf("error adding link: %w", err)
}
if err := n.disableEUIAutogeneration(bridgeName); err != nil {
if err := n.setEUIAutogeneration(bridgeName, assignEUI); err != nil {
return nil, fmt.Errorf("error disabling EUI autogeneration: %w", err)
}

Expand Down Expand Up @@ -109,21 +109,25 @@
return nil, fmt.Errorf("error setting link's hairpin mode: %w", err)
}
}
if err := n.disableEUIAutogeneration(vxlanName); err != nil {
if err := n.setEUIAutogeneration(vxlanName, false); err != nil {
return nil, err
}

return &netlinkVXLAN, nil
}

func (*Manager) disableEUIAutogeneration(intfName string) error {
func (*Manager) setEUIAutogeneration(intfName string, generateEUI bool) error {
fileName := fmt.Sprintf("%s/ipv6/conf/%s/addr_gen_mode", procSysNetPath, intfName)
file, err := os.OpenFile(fileName, os.O_WRONLY, 0)
if err != nil {
return fmt.Errorf("error opening file: %w", err)
}
defer file.Close()
if _, err := file.WriteString("1\n"); err != nil {
value := "1"
if generateEUI {
value = "0"
}
if _, err := file.WriteString(fmt.Sprintf("%s\n", value)); err != nil {

Check failure on line 130 in pkg/nl/create.go

View workflow job for this annotation

GitHub Actions / lint

preferFprint: suggestion: fmt.Fprintf(file, "%s\n", value) (gocritic)
return fmt.Errorf("error writing to file: %w", err)
}
return nil
Expand All @@ -142,13 +146,11 @@
return nil, fmt.Errorf("error adding link: %w", err)
}

if !generateEUI {
if err := n.disableEUIAutogeneration(vethName); err != nil {
return nil, err
}
if err := n.disableEUIAutogeneration(peerName); err != nil {
return nil, err
}
if err := n.setEUIAutogeneration(vethName, generateEUI); err != nil {
return nil, err
}
if err := n.setEUIAutogeneration(peerName, generateEUI); err != nil {
return nil, err
}

return &netlinkVeth, nil
Expand Down
19 changes: 18 additions & 1 deletion pkg/nl/layer2.go
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@
}

func (n *Manager) setupBridge(info *Layer2Information, masterIdx int) (*netlink.Bridge, error) {
bridge, err := n.createBridge(fmt.Sprintf("%s%d", layer2Prefix, info.VlanID), info.AnycastMAC, masterIdx, info.MTU, false)
bridge, err := n.createBridge(fmt.Sprintf("%s%d", layer2Prefix, info.VlanID), info.AnycastMAC, masterIdx, info.MTU, false, len(info.AnycastGateways) > 0)
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -229,7 +229,7 @@
return false
}

func (n *Manager) reconcileIPAddresses(intf netlink.Link, current, desired []*netlink.Addr) error {

Check failure on line 232 in pkg/nl/layer2.go

View workflow job for this annotation

GitHub Actions / lint

cognitive-complexity: function (*Manager).reconcileIPAddresses has cognitive complexity 25 (> max enabled 24) (revive)
for _, addr := range desired {
if !containsNetlinkAddress(current, addr) {
if err := n.toolkit.AddrAdd(intf, addr); err != nil {
Expand All @@ -244,6 +244,23 @@
}
}
}
enableEUI := len(desired) > 0
if err := n.setEUIAutogeneration(intf.Attrs().Name, enableEUI); err != nil {
return fmt.Errorf("error setting EUI autogeneration: %w", err)
}
if !enableEUI {
addresses, err := n.toolkit.AddrList(intf, unix.AF_INET6)
if err != nil {
return fmt.Errorf("error listing link's IPv6 addresses: %w", err)
}
for _, addr := range addresses {
if addr.IP.IsLinkLocalUnicast() {
if err := n.toolkit.AddrDel(intf, &addr); err != nil {

Check failure on line 258 in pkg/nl/layer2.go

View workflow job for this annotation

GitHub Actions / lint

G601: Implicit memory aliasing in for loop. (gosec)
return fmt.Errorf("error removing link local IPv6 address: %w", err)
}
}
}
}
return nil
}

Expand Down
2 changes: 1 addition & 1 deletion pkg/nl/layer3.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ func (n *Manager) CreateL3(info VRFInformation) error {
return err
}

bridge, err := n.createBridge(bridgePrefix+info.Name, nil, vrf.Attrs().Index, defaultMtu, true)
bridge, err := n.createBridge(bridgePrefix+info.Name, nil, vrf.Attrs().Index, defaultMtu, true, false)
if err != nil {
return err
}
Expand Down
Loading