Skip to content

Commit 69a2dda

Browse files
committed
route: Fix table assignment of nexthop route
The nexthop route was injected into the default table instead of the table specified. This code path was not used so far, this is a fix for a potential future usage. Fixes: fec5499 ("route: Fix route replacement logic for IPv6") Signed-off-by: Thomas Graf <thomas@cilium.io>
1 parent 5337067 commit 69a2dda

2 files changed

Lines changed: 16 additions & 14 deletions

File tree

pkg/datapath/linux/route/route_linux.go

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -172,12 +172,13 @@ func lookup(route *netlink.Route) *netlink.Route {
172172
return nil
173173
}
174174

175-
func createNexthopRoute(link netlink.Link, routerNet *net.IPNet) *netlink.Route {
175+
func createNexthopRoute(route Route, link netlink.Link, routerNet *net.IPNet) *netlink.Route {
176176
// This is the L2 route which makes router IP available behind the
177177
// interface.
178178
rt := &netlink.Route{
179179
LinkIndex: link.Attrs().Index,
180180
Dst: routerNet,
181+
Table: route.Table,
181182
}
182183

183184
// Known issue: scope for IPv6 routes is not propagated correctly. If
@@ -193,19 +194,17 @@ func createNexthopRoute(link netlink.Link, routerNet *net.IPNet) *netlink.Route
193194
// replaceNexthopRoute verifies that the L2 route for the router IP which is
194195
// used as nexthop for all node routes is properly installed. If unavailable or
195196
// incorrect, it will be replaced with the proper L2 route.
196-
func replaceNexthopRoute(link netlink.Link, routerNet *net.IPNet) (bool, error) {
197-
route := createNexthopRoute(link, routerNet)
198-
if err := netlink.RouteReplace(route); err != nil {
197+
func replaceNexthopRoute(route Route, link netlink.Link, routerNet *net.IPNet) (bool, error) {
198+
if err := netlink.RouteReplace(createNexthopRoute(route, link, routerNet)); err != nil {
199199
return false, fmt.Errorf("unable to add L2 nexthop route: %s", err)
200200
}
201201

202202
return true, nil
203203
}
204204

205205
// deleteNexthopRoute deletes
206-
func deleteNexthopRoute(link netlink.Link, routerNet *net.IPNet) error {
207-
route := createNexthopRoute(link, routerNet)
208-
if err := netlink.RouteDel(route); err != nil {
206+
func deleteNexthopRoute(route Route, link netlink.Link, routerNet *net.IPNet) error {
207+
if err := netlink.RouteDel(createNexthopRoute(route, link, routerNet)); err != nil {
209208
return fmt.Errorf("unable to delete L2 nexthop route: %s", err)
210209
}
211210

@@ -245,7 +244,7 @@ func Upsert(route Route, mtuConfig *mtu.Configuration) (bool, error) {
245244

246245
routerNet := route.getNexthopAsIPNet()
247246
if routerNet != nil {
248-
if _, err := replaceNexthopRoute(link, routerNet); err != nil {
247+
if _, err := replaceNexthopRoute(route, link, routerNet); err != nil {
249248
return false, fmt.Errorf("unable to add nexthop route: %s", err)
250249
}
251250

@@ -279,7 +278,7 @@ func Upsert(route Route, mtuConfig *mtu.Configuration) (bool, error) {
279278

280279
if err != nil {
281280
if nexthopRouteCreated {
282-
deleteNexthopRoute(link, routerNet)
281+
deleteNexthopRoute(route, link, routerNet)
283282
}
284283
return false, err
285284
}

pkg/datapath/linux/route/route_linux_test.go

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,22 +41,25 @@ func parseIP(ip string) *net.IP {
4141
}
4242

4343
func testReplaceNexthopRoute(c *C, link netlink.Link, routerNet *net.IPNet) {
44+
route := Route{
45+
Table: 10,
46+
}
4447
// delete route in case it exists from a previous failed run
45-
deleteNexthopRoute(link, routerNet)
48+
deleteNexthopRoute(route, link, routerNet)
4649

4750
// defer cleanup in case of failure
48-
defer deleteNexthopRoute(link, routerNet)
51+
defer deleteNexthopRoute(route, link, routerNet)
4952

50-
replaced, err := replaceNexthopRoute(link, routerNet)
53+
replaced, err := replaceNexthopRoute(route, link, routerNet)
5154
c.Assert(err, IsNil)
5255
c.Assert(replaced, Equals, true)
5356

5457
// We expect routes to always be replaced
55-
replaced, err = replaceNexthopRoute(link, routerNet)
58+
replaced, err = replaceNexthopRoute(route, link, routerNet)
5659
c.Assert(err, IsNil)
5760
c.Assert(replaced, Equals, true)
5861

59-
err = deleteNexthopRoute(link, routerNet)
62+
err = deleteNexthopRoute(route, link, routerNet)
6063
c.Assert(err, IsNil)
6164
}
6265

0 commit comments

Comments
 (0)