]> git.puffer.fish Git - matthieu/frr.git/commitdiff
zebra: fix handling of failed route install via notification
authorMark Stapp <mjs@voltanet.io>
Mon, 10 Feb 2020 18:12:58 +0000 (13:12 -0500)
committerMark Stapp <mjs@voltanet.io>
Mon, 27 Apr 2020 14:24:55 +0000 (10:24 -0400)
An async route notification can indicate that installation
has failed, but the handling code wasn't dealing with that
possibility correctly.

Signed-off-by: Mark Stapp <mjs@voltanet.io>
zebra/zebra_rib.c

index 2dbe907751e1f21a15b5948c3f5ea6d4fd18520c..b979de9ab73c381ab939582a2c279530f4abc3a2 100644 (file)
@@ -1334,19 +1334,15 @@ static bool rib_update_re_from_ctx(struct route_entry *re,
         * we use the fib-specific nexthop-group to record the actual FIB
         * status.
         */
+       matched = false;
+       ctxnhg = dplane_ctx_get_ng(ctx);
 
        /* Check both fib group and notif group for equivalence.
         *
         * Let's assume the nexthops are ordered here to save time.
         */
-       if (nexthop_group_equal(&re->fib_ng, dplane_ctx_get_ng(ctx)) == false) {
-               if (IS_ZEBRA_DEBUG_RIB_DETAILED)
-                       zlog_debug(
-                               "%s(%u):%s update_from_ctx: notif nh and fib nh mismatch",
-                               VRF_LOGNAME(vrf), re->vrf_id, dest_str);
-
-               matched = false;
-       } else
+       if (re->fib_ng.nexthop && ctxnhg->nexthop &&
+           nexthop_group_equal(&re->fib_ng, ctxnhg))
                matched = true;
 
        /* If the new FIB set matches the existing FIB set, we're done. */
@@ -1387,7 +1383,7 @@ static bool rib_update_re_from_ctx(struct route_entry *re,
         */
        matched = true;
 
-       ctx_nexthop = dplane_ctx_get_ng(ctx)->nexthop;
+       ctx_nexthop = ctxnhg->nexthop;
 
        /* Nothing installed - we can skip some of the checking/comparison
         * of nexthops.
@@ -1471,8 +1467,6 @@ no_nexthops:
                        VRF_LOGNAME(vrf), re->vrf_id, dest_str,
                        (changed_p ? "true" : "false"));
 
-       ctxnhg = dplane_ctx_get_ng(ctx);
-
        if (ctxnhg->nexthop)
                copy_nexthops(&(re->fib_ng.nexthop), ctxnhg->nexthop, NULL);
        else {