Skip to content

Commit 655a638

Browse files
KanjiMonsterthom311
authored andcommitted
route: treat nhid changes as full route replacements
When updating a route targeting a nexthoup group with id changing its nexthop to a single nexthop, we treat this as an update and instead add that nexthop to the group instead of replacing the route in the cache. So e.g. with nexthop id 10 fe80::1 dev eth1 nexthop id 11 fe80::2 dev eth2 nexthop id 12 fe80::3 dev eth3 nexthop id 20 grp 10/11 adding a route dst 2001:db8:1:/64 nhid 20 libnl will store this as 2001:db8:1:/64 via fe80::1, fe80::2 if we now update the route with dst 2001:db8:1:/64 nhid 12 libnl will see a new route with a single nexthop. Since the existing route for dst 2001:db8:1:/64 is a multipath route, and the new route has a single nexthop, libnl assumes this is a new nexthop for the route, and merges it to 2001:db8:1:/64 via fe80::1, fe80::2, fe80::3 instead of replacing it. Fix this by checking the nhid of the routes, and only merge if they match. Fixes: 29b7137 ("route cache: Fix handling of ipv6 multipath routes") Signed-off-by: Jonas Gorski <[email protected]> #449
1 parent 1ac4b32 commit 655a638

File tree

1 file changed

+7
-0
lines changed

1 file changed

+7
-0
lines changed

lib/route/route_obj.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -528,6 +528,13 @@ static int route_update(struct nl_object *old_obj, struct nl_object *new_obj)
528528
if (rtnl_route_get_nnexthops(new_route) != 1)
529529
return -NLE_OPNOTSUPP;
530530

531+
/*
532+
* If the route's nexthop id has changed, the new route replaces the
533+
* old one
534+
*/
535+
if (rtnl_route_get_nhid(old_route) != rtnl_route_get_nhid(new_route))
536+
return -NLE_OPNOTSUPP;
537+
531538
/*
532539
* Get the only nexthop entry from the new route. For
533540
* IPv6 we always get a route with a 0th NH

0 commit comments

Comments
 (0)