From: Donald Sharp Date: Mon, 9 Apr 2018 18:16:00 +0000 (-0400) Subject: zebra: Only send down pertinent information on RTM_DELROUTE X-Git-Tag: frr-4.0.1~13^2 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=c8c34e5234a0aacf14b66256f888d3512abb8260;p=matthieu%2Ffrr.git zebra: Only send down pertinent information on RTM_DELROUTE Background: v6 does not have route replace semantics. If you want to add a nexthop to an existing route, you just send RTM_NEWROUTE and the new nexthop. If you want to delete a nexthop you should just send RTM_DELROUTE with the removed nexthop. This leads to situations where if zebra is processing a route and has lost track of intermediate nexthops( yes this sucks ) then v6 routes will get out of sync when we try to implement route replace semantics. So notice when we are doing a route delete and the route is not being updated, just send the prefix and tell it too delete. Ticket: CM-20391 Signed-off-by: Donald Sharp --- diff --git a/zebra/rt_netlink.c b/zebra/rt_netlink.c index fbe2bbb815..3206ba7240 100644 --- a/zebra/rt_netlink.c +++ b/zebra/rt_netlink.c @@ -1305,7 +1305,6 @@ static int netlink_route_multipath(int cmd, struct prefix *p, struct sockaddr_nl snl; struct nexthop *nexthop = NULL; unsigned int nexthop_num; - int discard = 0; int family = PREFIX_FAMILY(p); const char *routedesc; int setsrc = 0; @@ -1373,7 +1372,13 @@ static int netlink_route_multipath(int cmd, struct prefix *p, addattr32(&req.n, sizeof req, RTA_TABLE, re->table); } - if (discard) + /* + * If we are not updating the route and we have received + * a route delete, then all we need to fill in is the + * prefix information to tell the kernel to schwack + * it. + */ + if (!update && cmd == RTM_DELROUTE) goto skip; if (re->mtu || re->nexthop_mtu) {