Skip to content

Commit e098d08

Browse files
fix: Remove NLM_F_EXCL flag from Netlink Delete call (#2150) (#2157)
* fix: Remove unix.NLM_F_EXCL from Netlink Delete Route api call unix.NLM_F_EXCL is not expected to set in netlink delete route calls. It's no-op in older kernel and didnt return error. From kernel 5.19+, new flag NLM_F_BULK was defined with same value and serves a purpose in delete route call. This changes breaks azure cni and netlink calls fails in 5.19 kernel and onwards. The fix is to remove setting unix.NLM_F_EXCL in netlink delete route request. * fix: Remove unix.NLM_F_EXCL from Netlink Delete Route api call unix.NLM_F_EXCL is not expected to set in netlink delete route calls. It's no-op in older kernel and didnt return error. From kernel 5.19+, new flag NLM_F_BULK was defined with same value and serves a purpose in delete route call. This changes breaks azure cni and netlink calls fails in 5.19 kernel and onwards. The fix is to remove setting unix.NLM_F_EXCL in netlink delete route request. * Add unit tests for netlink add/delete address and add/delete routes Co-authored-by: tamilmani1989 <[email protected]>
1 parent 879b644 commit e098d08

File tree

2 files changed

+66
-2
lines changed

2 files changed

+66
-2
lines changed

netlink/ip_linux.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ func (Netlink) setIPAddress(ifName string, ipAddress net.IP, ipNet *net.IPNet, a
4343
flags = unix.NLM_F_CREATE | unix.NLM_F_EXCL | unix.NLM_F_ACK
4444
} else {
4545
msgType = unix.RTM_DELADDR
46-
flags = unix.NLM_F_EXCL | unix.NLM_F_ACK
46+
flags = unix.NLM_F_ACK
4747
}
4848

4949
req := newRequest(msgType, flags)
@@ -225,7 +225,7 @@ func setIpRoute(route *Route, add bool) error {
225225
flags = unix.NLM_F_CREATE | unix.NLM_F_EXCL | unix.NLM_F_ACK
226226
} else {
227227
msgType = unix.RTM_DELROUTE
228-
flags = unix.NLM_F_EXCL | unix.NLM_F_ACK
228+
flags = unix.NLM_F_ACK
229229
}
230230

231231
req := newRequest(msgType, flags)

netlink/netlink_test.go

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"testing"
1212

1313
"github.com/stretchr/testify/require"
14+
"golang.org/x/sys/unix"
1415
)
1516

1617
const (
@@ -311,3 +312,66 @@ func TestAddRemoveStaticArp(t *testing.T) {
311312
t.Errorf("DeleteLink failed: %+v", err)
312313
}
313314
}
315+
316+
func TestAddRemoveIPAddress(t *testing.T) {
317+
_, err := addDummyInterface(ifName)
318+
if err != nil {
319+
t.Errorf("addDummyInterface failed: %v", err)
320+
}
321+
322+
ip := net.ParseIP("192.168.0.4")
323+
_, ipNet, _ := net.ParseCIDR("192.168.0.4/24")
324+
nl := NewNetlink()
325+
326+
err = nl.setIPAddress(ifName, ip, ipNet, true)
327+
if err != nil {
328+
t.Errorf("ret val %v", err)
329+
}
330+
331+
err = nl.setIPAddress(ifName, ip, ipNet, false)
332+
if err != nil {
333+
t.Errorf("ret val %v", err)
334+
}
335+
336+
err = nl.DeleteLink(ifName)
337+
if err != nil {
338+
t.Errorf("DeleteLink failed: %+v", err)
339+
}
340+
}
341+
342+
func TestAddDeleteRoute(t *testing.T) {
343+
_, err := addDummyInterface(ifName)
344+
if err != nil {
345+
t.Errorf("addDummyInterface failed: %v", err)
346+
}
347+
348+
nl := NewNetlink()
349+
err = nl.SetLinkState(ifName, true)
350+
if err != nil {
351+
t.Errorf("ret val %v", err)
352+
}
353+
_, dstIPNet, _ := net.ParseCIDR("192.168.0.4/24")
354+
netif, _ := net.InterfaceByName(ifName)
355+
356+
route := Route{
357+
Family: unix.AF_INET,
358+
Dst: dstIPNet,
359+
LinkIndex: netif.Index,
360+
Scope: RT_SCOPE_LINK,
361+
}
362+
363+
err = setIpRoute(&route, true)
364+
if err != nil {
365+
t.Errorf("ret val %v", err)
366+
}
367+
368+
err = setIpRoute(&route, false)
369+
if err != nil {
370+
t.Errorf("ret val %v", err)
371+
}
372+
373+
err = nl.DeleteLink(ifName)
374+
if err != nil {
375+
t.Errorf("DeleteLink failed: %+v", err)
376+
}
377+
}

0 commit comments

Comments
 (0)