]> git.puffer.fish Git - matthieu/frr.git/commitdiff
ldpd: ldp-oc withdraw fix
authorlynne <lynne@voltanet.io>
Wed, 5 Aug 2020 20:54:43 +0000 (16:54 -0400)
committerlynne <lynne@voltanet.io>
Wed, 5 Aug 2020 21:11:28 +0000 (17:11 -0400)
When LDP is configured in Order Control mode and we receive a
label withdraw message, we should only resend label withdraws to
peers that are the NH for that fec being withdrawn.  This is a
double commit.   Original fix in master is #6864.

Signed-off-by: Lynne Morrison <lynne@voltanet.io>
ldpd/lde_lib.c

index 8f524e0aa97a6a1f21a406ccd1c48d6cec7b4bcb..a1b2845c7fe61b7392251563444c8d765bf67fed 100644 (file)
@@ -847,6 +847,9 @@ lde_check_withdraw(struct map *map, struct lde_nbr *ln)
        if (me && (map->label == NO_LABEL || map->label == me->map.label))
                /* LWd.4: remove record of previously received lbl mapping */
                lde_map_del(ln, me, 0);
+       else
+               /* LWd.13 done */
+               return;
 
        /* Ordered Control: additional withdraw steps */
        if (ldeconf->flags & F_LDPD_ORDERED_CONTROL) {
@@ -858,15 +861,17 @@ lde_check_withdraw(struct map *map, struct lde_nbr *ln)
                        /* LWd.9: check if previously sent a label mapping */
                        me = (struct lde_map *)fec_find(&lnbr->sent_map,
                            &fn->fec);
+
                        /*
                         * LWd.10: does label sent to peer "map" to withdraw
                         * label
                         */
-                       if (me)
+                       if (me && lde_nbr_is_nexthop(fn, lnbr))
                                /* LWd.11: send label withdraw */
                                lde_send_labelwithdraw(lnbr, fn, NULL, NULL);
                }
        }
+
 }
 
 void
@@ -924,24 +929,33 @@ lde_check_withdraw_wcard(struct map *map, struct lde_nbr *ln)
                         * label mapping
                         */
                        lde_map_del(ln, me, 0);
+               else
+                       /* LWd.13 done */
+                       continue;
 
                /* Ordered Control: additional withdraw steps */
                if (ldeconf->flags & F_LDPD_ORDERED_CONTROL) {
-                       /* LWd.8: for each neighbor other that src of withdraw msg */
+                       /*
+                        * LWd.8: for each neighbor other that src of
+                        *  withdraw msg
+                        */
                        RB_FOREACH(lnbr, nbr_tree, &lde_nbrs) {
                                if (ln->peerid == lnbr->peerid)
                                        continue;
 
-                               /* LWd.9: check if previously sent a label mapping */
-                               me = (struct lde_map *)fec_find(&lnbr->sent_map,
-                                       &fn->fec);
+                               /* LWd.9: check if previously sent a label
+                                * mapping
+                                */
+                               me = (struct lde_map *)fec_find(
+                                   &lnbr->sent_map, &fn->fec);
                                /*
-                                * LWd.10: does label sent to peer "map" to withdraw
-                                * label
+                                * LWd.10: does label sent to peer "map" to
+                                * withdraw label
                                 */
-                               if (me)
+                               if (me && lde_nbr_is_nexthop(fn, lnbr))
                                        /* LWd.11: send label withdraw */
-                                       lde_send_labelwithdraw(lnbr, fn, NULL, NULL);
+                                       lde_send_labelwithdraw(lnbr, fn, NULL,
+                                           NULL);
                        }
                }
        }