summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlynne <lynne@voltanet.io>2020-08-05 15:22:08 -0400
committerlynne <lynne@voltanet.io>2020-08-05 16:01:52 -0400
commit8dfdf2355c24ba489d63b0ecefbe67f5ecc413f6 (patch)
treebfd78c3e8a3f00c559392ae1dc7c2a4e464b7574
parent2b42623bd3c8b11b5b7fc1c0a22d1d6826262c3c (diff)
ldpd: ldp-oc withdraw fix
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. Signed-off-by: Lynne Morrison <lynne@voltanet.io>
-rw-r--r--ldpd/lde_lib.c32
1 files changed, 23 insertions, 9 deletions
diff --git a/ldpd/lde_lib.c b/ldpd/lde_lib.c
index 71fb0c7bf2..11d85b7449 100644
--- a/ldpd/lde_lib.c
+++ b/ldpd/lde_lib.c
@@ -856,6 +856,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) {
@@ -867,15 +870,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
@@ -933,24 +938,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);
}
}
}