Skip to content

Commit afcb977

Browse files
vipul-21root
andauthored
fix: Adding a constant hardware address to the veth (#1524)
* Adding constant hardware address to the veth * update the variable and error log message * Removing the shadow variable * Removing the shadow variable * Adding the hardware ad address while endpoint creation * Refactoring based on the comments * Updated based on comments * removing merge conflicts * update the function parameter * Addressing comments * go lint errors * updating the IPAddr variable * updating the state to NUD PROBE for transparent endpoint Co-authored-by: root <[email protected]>
1 parent 0743278 commit afcb977

13 files changed

+126
-53
lines changed

netlink/link_linux.go

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ type LinkInfo struct {
5151
MTU uint
5252
TxQLen uint
5353
ParentIndex int
54+
MacAddress net.HardwareAddr
55+
IPAddr net.IP
5456
}
5557

5658
func (linkInfo *LinkInfo) Info() *LinkInfo {
@@ -123,6 +125,11 @@ func (Netlink) AddLink(link Link) error {
123125
req.addPayload(newAttributeUint32(unix.IFLA_LINK, uint32(info.ParentIndex)))
124126
}
125127

128+
// Set the mac address on the interface
129+
if info.MacAddress != nil {
130+
req.addPayload(newRtAttr(unix.IFLA_ADDRESS, []byte(info.MacAddress)))
131+
}
132+
126133
// Set link info.
127134
attrLinkInfo := newAttribute(unix.IFLA_LINKINFO, nil)
128135
attrLinkInfo.addNested(newAttributeString(IFLA_INFO_KIND, info.Type))
@@ -415,8 +422,8 @@ func (Netlink) SetLinkHairpin(bridgeName string, on bool) error {
415422
return s.sendAndWaitForAck(req)
416423
}
417424

418-
// AddOrRemoveStaticArp sets/removes static arp entry based on mode
419-
func (Netlink) AddOrRemoveStaticArp(mode int, name string, ipaddr net.IP, mac net.HardwareAddr, isProxy bool) error {
425+
// SetOrRemoveLinkAddress sets/removes static arp entry based on mode
426+
func (Netlink) SetOrRemoveLinkAddress(linkInfo LinkInfo, mode, linkState int) error {
420427
s, err := getSocket()
421428
if err != nil {
422429
return err
@@ -426,39 +433,33 @@ func (Netlink) AddOrRemoveStaticArp(mode int, name string, ipaddr net.IP, mac ne
426433
state := 0
427434
if mode == ADD {
428435
req = newRequest(unix.RTM_NEWNEIGH, unix.NLM_F_CREATE|unix.NLM_F_REPLACE|unix.NLM_F_ACK)
429-
state = NUD_PERMANENT
430436
} else {
431437
req = newRequest(unix.RTM_DELNEIGH, unix.NLM_F_ACK)
432-
state = NUD_INCOMPLETE
433438
}
439+
state = linkState
434440

435-
iface, err := net.InterfaceByName(name)
441+
iface, err := net.InterfaceByName(linkInfo.Name)
436442
if err != nil {
437443
return err
438444
}
439445

440446
msg := neighMsg{
441-
Family: uint8(GetIPAddressFamily(ipaddr)),
447+
Family: uint8(GetIPAddressFamily(linkInfo.IPAddr)),
442448
Index: uint32(iface.Index),
443449
State: uint16(state),
444450
}
445451

446-
// NTF_PROXY is for setting neighbor proxy
447-
if isProxy {
448-
msg.Flags = msg.Flags | NTF_PROXY
449-
}
450-
451452
req.addPayload(&msg)
452453

453-
ipData := ipaddr.To4()
454+
ipData := linkInfo.IPAddr.To4()
454455
if ipData == nil {
455-
ipData = ipaddr.To16()
456+
ipData = linkInfo.IPAddr.To16()
456457
}
457458

458459
dstData := newRtAttr(NDA_DST, ipData)
459460
req.addPayload(dstData)
460461

461-
hwData := newRtAttr(NDA_LLADDR, []byte(mac))
462+
hwData := newRtAttr(NDA_LLADDR, []byte(linkInfo.MacAddress))
462463
req.addPayload(hwData)
463464

464465
return s.sendAndWaitForAck(req)

netlink/mocknetlink.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ func (f *MockNetlink) SetLinkHairpin(string, bool) error {
7272
return f.error()
7373
}
7474

75-
func (f *MockNetlink) AddOrRemoveStaticArp(int, string, net.IP, net.HardwareAddr, bool) error {
75+
func (f *MockNetlink) SetOrRemoveLinkAddress(LinkInfo, int, int) error {
7676
return f.error()
7777
}
7878

netlink/netlink_test.go

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -284,12 +284,24 @@ func TestAddRemoveStaticArp(t *testing.T) {
284284
mac, _ := net.ParseMAC("aa:b3:4d:5e:e2:4a")
285285
nl := NewNetlink()
286286

287-
err = nl.AddOrRemoveStaticArp(ADD, ifName, ip, mac, false)
287+
linkInfo := LinkInfo{
288+
Name: ifName,
289+
IPAddr: ip,
290+
MacAddress: mac,
291+
}
292+
293+
err = nl.SetOrRemoveLinkAddress(linkInfo, ADD, NUD_PERMANENT)
288294
if err != nil {
289295
t.Errorf("ret val %v", err)
290296
}
291297

292-
err = nl.AddOrRemoveStaticArp(REMOVE, ifName, ip, mac, false)
298+
linkInfo = LinkInfo{
299+
Name: ifName,
300+
IPAddr: ip,
301+
MacAddress: mac,
302+
}
303+
304+
err = nl.SetOrRemoveLinkAddress(linkInfo, REMOVE, NUD_INCOMPLETE)
293305
if err != nil {
294306
t.Errorf("ret val %v", err)
295307
}

netlink/netlink_windows.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ func (Netlink) SetLinkHairpin(bridgeName string, on bool) error {
6262
return nil
6363
}
6464

65-
func (Netlink) AddOrRemoveStaticArp(mode int, name string, ipaddr net.IP, mac net.HardwareAddr, isProxy bool) error {
65+
func (Netlink) SetOrRemoveLinkAddress(linkInfo LinkInfo, mode, linkState int) error {
6666
return nil
6767
}
6868

netlink/netlinkinterface.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ type NetlinkInterface interface {
1818
SetLinkAddress(ifName string, hwAddress net.HardwareAddr) error
1919
SetLinkPromisc(ifName string, on bool) error
2020
SetLinkHairpin(bridgeName string, on bool) error
21-
AddOrRemoveStaticArp(mode int, name string, ipaddr net.IP, mac net.HardwareAddr, isProxy bool) error
21+
SetOrRemoveLinkAddress(linkInfo LinkInfo, mode, linkState int) error
2222
AddIPAddress(ifName string, ipAddress net.IP, ipNet *net.IPNet) error
2323
DeleteIPAddress(ifName string, ipAddress net.IP, ipNet *net.IPNet) error
2424
GetIPRoute(filter *Route) ([]*Route, error)

netlink/socket.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// Copyright 2017 Microsoft. All rights reserved.
22
// MIT License
33

4+
//go:build linux
45
// +build linux
56

67
package netlink

network/bridge_endpointclient_linux.go

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ func NewLinuxBridgeEndpointClient(
6060
}
6161

6262
func (client *LinuxBridgeEndpointClient) AddEndpoints(epInfo *EndpointInfo) error {
63-
if err := client.nuc.CreateEndpoint(client.hostVethName, client.containerVethName); err != nil {
63+
if err := client.nuc.CreateEndpoint(client.hostVethName, client.containerVethName, nil); err != nil {
6464
return err
6565
}
6666

@@ -98,7 +98,13 @@ func (client *LinuxBridgeEndpointClient) AddEndpointRules(epInfo *EndpointInfo)
9898

9999
if client.mode != opModeTunnel && ipAddr.IP.To4() != nil {
100100
log.Printf("[net] Adding static arp for IP address %v and MAC %v in VM", ipAddr.String(), client.containerMac.String())
101-
if err := client.netlink.AddOrRemoveStaticArp(netlink.ADD, client.bridgeName, ipAddr.IP, client.containerMac, false); err != nil {
101+
linkInfo := netlink.LinkInfo{
102+
Name: client.bridgeName,
103+
IPAddr: ipAddr.IP,
104+
MacAddress: client.containerMac,
105+
}
106+
107+
if err := client.netlink.SetOrRemoveLinkAddress(linkInfo, netlink.ADD, netlink.NUD_PERMANENT); err != nil {
102108
log.Printf("Failed setting arp in vm: %v", err)
103109
}
104110
}
@@ -136,7 +142,12 @@ func (client *LinuxBridgeEndpointClient) DeleteEndpointRules(ep *endpoint) {
136142

137143
if client.mode != opModeTunnel && ipAddr.IP.To4() != nil {
138144
log.Printf("[net] Removing static arp for IP address %v and MAC %v from VM", ipAddr.String(), ep.MacAddress.String())
139-
err := client.netlink.AddOrRemoveStaticArp(netlink.REMOVE, client.bridgeName, ipAddr.IP, ep.MacAddress, false)
145+
linkInfo := netlink.LinkInfo{
146+
Name: client.bridgeName,
147+
IPAddr: ipAddr.IP,
148+
MacAddress: ep.MacAddress,
149+
}
150+
err := client.netlink.SetOrRemoveLinkAddress(linkInfo, netlink.REMOVE, netlink.NUD_INCOMPLETE)
140151
if err != nil {
141152
log.Printf("Failed removing arp from vm: %v", err)
142153
}
@@ -290,8 +301,12 @@ func (client *LinuxBridgeEndpointClient) setIPV6NeighEntry(epInfo *EndpointInfo)
290301
log.Printf("[net] Add neigh entry for host gw ip")
291302
hardwareAddr, _ := net.ParseMAC(defaultHostGwMac)
292303
hostGwIp := net.ParseIP(defaultV6HostGw)
293-
if err := client.netlink.AddOrRemoveStaticArp(netlink.ADD, client.containerVethName,
294-
hostGwIp, hardwareAddr, false); err != nil {
304+
linkInfo := netlink.LinkInfo{
305+
Name: client.containerVethName,
306+
IPAddr: hostGwIp,
307+
MacAddress: hardwareAddr,
308+
}
309+
if err := client.netlink.SetOrRemoveLinkAddress(linkInfo, netlink.ADD, netlink.NUD_PERMANENT); err != nil {
295310
log.Printf("Failed setting neigh entry in container: %v", err)
296311
return err
297312
}

network/networkutils/networkutils_linux.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,13 +55,14 @@ func NewNetworkUtils(nl netlink.NetlinkInterface, plClient platform.ExecClient)
5555
}
5656
}
5757

58-
func (nu NetworkUtils) CreateEndpoint(hostVethName, containerVethName string) error {
58+
func (nu NetworkUtils) CreateEndpoint(hostVethName, containerVethName string, macAddress net.HardwareAddr) error {
5959
log.Printf("[net] Creating veth pair %v %v.", hostVethName, containerVethName)
6060

6161
link := netlink.VEthLink{
6262
LinkInfo: netlink.LinkInfo{
63-
Type: netlink.LINK_TYPE_VETH,
64-
Name: hostVethName,
63+
Type: netlink.LINK_TYPE_VETH,
64+
Name: hostVethName,
65+
MacAddress: macAddress,
6566
},
6667
PeerName: containerVethName,
6768
}

network/ovs_endpointclient_linux.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ func NewOVSEndpointClient(
7979

8080
func (client *OVSEndpointClient) AddEndpoints(epInfo *EndpointInfo) error {
8181
epc := networkutils.NewNetworkUtils(client.netlink, client.plClient)
82-
if err := epc.CreateEndpoint(client.hostVethName, client.containerVethName); err != nil {
82+
if err := epc.CreateEndpoint(client.hostVethName, client.containerVethName, nil); err != nil {
8383
return err
8484
}
8585

network/ovsinfravnet/infravnet_linux.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ func NewInfraVnetClient(hostIfName, contIfName string, nl netlink.NetlinkInterfa
4949
func (client *OVSInfraVnetClient) CreateInfraVnetEndpoint(bridgeName string) error {
5050
ovs := ovsctl.NewOvsctl()
5151
epc := networkutils.NewNetworkUtils(client.netlink, client.plClient)
52-
if err := epc.CreateEndpoint(client.hostInfraVethName, client.ContainerInfraVethName); err != nil {
52+
if err := epc.CreateEndpoint(client.hostInfraVethName, client.ContainerInfraVethName, nil); err != nil {
5353
log.Printf("Creating infraep failed with error %v", err)
5454
return err
5555
}

0 commit comments

Comments
 (0)