]> git.puffer.fish Git - matthieu/frr.git/commitdiff
zebra: Fix connected route deletion when multiple entry exists
authorXiao Liang <shaw.leon@gmail.com>
Thu, 20 Apr 2023 03:40:04 +0000 (11:40 +0800)
committerMergify <37929162+mergify[bot]@users.noreply.github.com>
Fri, 13 Oct 2023 12:54:27 +0000 (12:54 +0000)
When multiple interfaces have addresses in the same network, deleting
one of them may cause the wrong connected route being deleted.
For example:

    ip link add veth1 type veth peer veth2
    ip link set veth1 up
    ip link set veth2 up
    ip addr add dev veth1 192.168.0.1/24
    ip addr add dev veth2 192.168.0.2/24
    ip addr flush dev veth1

Zebra deletes the route of interface veth2 rather than veth1.

Should match nexthop against ere->re_nhe instead of ere->re->nhe.

Signed-off-by: Xiao Liang <shaw.leon@gmail.com>
(cherry picked from commit a35ba7ba602f87390cc9cbce3f0ceb61977f0949)

zebra/zebra_rib.c

index 40397e587a2530797541b9f6a590ccb09c02d136..e38ccba5165c5b9fa072f0a691765983a885efd7 100644 (file)
@@ -2849,8 +2849,8 @@ static void process_subq_early_route_delete(struct zebra_early_route *ere)
 
        struct nexthop *nh = NULL;
 
-       if (ere->re->nhe)
-               nh = ere->re->nhe->nhg.nexthop;
+       if (ere->re_nhe)
+               nh = ere->re_nhe->nhg.nexthop;
 
        /* Lookup same type route. */
        RNODE_FOREACH_RE (rn, re) {
@@ -2868,7 +2868,8 @@ static void process_subq_early_route_delete(struct zebra_early_route *ere)
                if (re->type == ZEBRA_ROUTE_KERNEL &&
                    re->metric != ere->re->metric)
                        continue;
-               if (re->type == ZEBRA_ROUTE_CONNECT && (rtnh = nh) &&
+               if (re->type == ZEBRA_ROUTE_CONNECT &&
+                   (rtnh = re->nhe->nhg.nexthop) &&
                    rtnh->type == NEXTHOP_TYPE_IFINDEX && nh) {
                        if (rtnh->ifindex != nh->ifindex)
                                continue;