From a6d6efa5ca824ac28d9b6ac8e9a73949db097b81 Mon Sep 17 00:00:00 2001 From: Lionel Jouin Date: Fri, 30 Aug 2024 15:51:32 +0200 Subject: [PATCH] Use of Scope for routes in IPAM Add Scope for routes for cni spec v1.1 Signed-off-by: Lionel Jouin --- pkg/ipam/ipam_linux.go | 6 +++++- pkg/ipam/ipam_linux_test.go | 17 ++++++++++++++--- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/pkg/ipam/ipam_linux.go b/pkg/ipam/ipam_linux.go index 013fe7f5..049f0b54 100644 --- a/pkg/ipam/ipam_linux.go +++ b/pkg/ipam/ipam_linux.go @@ -123,8 +123,12 @@ func ConfigureIface(ifName string, res *current.Result) error { route.Table = *r.Table } + if r.Scope != nil { + route.Scope = netlink.Scope(*r.Scope) + } + if err = netlink.RouteAddEcmp(&route); err != nil { - return fmt.Errorf("failed to add route '%v via %v dev %v (Table: %d)': %v", r.Dst, gw, ifName, route.Table, err) + return fmt.Errorf("failed to add route '%v via %v dev %v (Scope: %v, Table: %d)': %v", r.Dst, gw, ifName, route.Scope, route.Table, err) } } diff --git a/pkg/ipam/ipam_linux_test.go b/pkg/ipam/ipam_linux_test.go index d1e94d66..e5824746 100644 --- a/pkg/ipam/ipam_linux_test.go +++ b/pkg/ipam/ipam_linux_test.go @@ -41,8 +41,9 @@ func ipNetEqual(a, b *net.IPNet) bool { var _ = Describe("ConfigureIface", func() { var originalNS ns.NetNS - var ipv4, ipv6, routev4, routev6 *net.IPNet + var ipv4, ipv6, routev4, routev6, routev4Scope *net.IPNet var ipgw4, ipgw6, routegwv4, routegwv6 net.IP + var routeScope int var result *current.Result var routeTable int @@ -78,6 +79,10 @@ var _ = Describe("ConfigureIface", func() { routegwv4 = net.ParseIP("1.2.3.5") Expect(routegwv4).NotTo(BeNil()) + _, routev4Scope, err = net.ParseCIDR("1.2.3.4/32") + Expect(err).NotTo(HaveOccurred()) + Expect(routev4Scope).NotTo(BeNil()) + ipgw4 = net.ParseIP("1.2.3.1") Expect(ipgw4).NotTo(BeNil()) @@ -95,6 +100,7 @@ var _ = Describe("ConfigureIface", func() { Expect(ipgw6).NotTo(BeNil()) routeTable := 5000 + routeScope = 200 result = ¤t.Result{ Interfaces: []*current.Interface{ @@ -125,6 +131,7 @@ var _ = Describe("ConfigureIface", func() { {Dst: *routev4, GW: routegwv4}, {Dst: *routev6, GW: routegwv6}, {Dst: *routev4, GW: routegwv4, Table: &routeTable}, + {Dst: *routev4Scope, Scope: &routeScope}, }, } }) @@ -166,7 +173,7 @@ var _ = Describe("ConfigureIface", func() { routes, err := netlink.RouteList(link, 0) Expect(err).NotTo(HaveOccurred()) - var v4found, v6found bool + var v4found, v6found, v4Scopefound bool for _, route := range routes { isv4 := route.Dst.IP.To4() != nil if isv4 && ipNetEqual(route.Dst, routev4) && route.Gw.Equal(routegwv4) { @@ -175,13 +182,17 @@ var _ = Describe("ConfigureIface", func() { if !isv4 && ipNetEqual(route.Dst, routev6) && route.Gw.Equal(routegwv6) { v6found = true } + if isv4 && ipNetEqual(route.Dst, routev4Scope) && int(route.Scope) == routeScope { + v4Scopefound = true + } - if v4found && v6found { + if v4found && v6found && v4Scopefound { break } } Expect(v4found).To(BeTrue()) Expect(v6found).To(BeTrue()) + Expect(v4Scopefound).To(BeTrue()) return nil })