mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-06 00:41:20 +00:00
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>
This commit is contained in:
parent
2b42623bd3
commit
8dfdf2355c
@ -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))
|
if (me && (map->label == NO_LABEL || map->label == me->map.label))
|
||||||
/* LWd.4: remove record of previously received lbl mapping */
|
/* LWd.4: remove record of previously received lbl mapping */
|
||||||
lde_map_del(ln, me, 0);
|
lde_map_del(ln, me, 0);
|
||||||
|
else
|
||||||
|
/* LWd.13 done */
|
||||||
|
return;
|
||||||
|
|
||||||
/* Ordered Control: additional withdraw steps */
|
/* Ordered Control: additional withdraw steps */
|
||||||
if (ldeconf->flags & F_LDPD_ORDERED_CONTROL) {
|
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 */
|
/* LWd.9: check if previously sent a label mapping */
|
||||||
me = (struct lde_map *)fec_find(&lnbr->sent_map,
|
me = (struct lde_map *)fec_find(&lnbr->sent_map,
|
||||||
&fn->fec);
|
&fn->fec);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* LWd.10: does label sent to peer "map" to withdraw
|
* LWd.10: does label sent to peer "map" to withdraw
|
||||||
* label
|
* label
|
||||||
*/
|
*/
|
||||||
if (me)
|
if (me && lde_nbr_is_nexthop(fn, lnbr))
|
||||||
/* LWd.11: send label withdraw */
|
/* LWd.11: send label withdraw */
|
||||||
lde_send_labelwithdraw(lnbr, fn, NULL, NULL);
|
lde_send_labelwithdraw(lnbr, fn, NULL, NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -933,24 +938,33 @@ lde_check_withdraw_wcard(struct map *map, struct lde_nbr *ln)
|
|||||||
* label mapping
|
* label mapping
|
||||||
*/
|
*/
|
||||||
lde_map_del(ln, me, 0);
|
lde_map_del(ln, me, 0);
|
||||||
|
else
|
||||||
|
/* LWd.13 done */
|
||||||
|
continue;
|
||||||
|
|
||||||
/* Ordered Control: additional withdraw steps */
|
/* Ordered Control: additional withdraw steps */
|
||||||
if (ldeconf->flags & F_LDPD_ORDERED_CONTROL) {
|
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) {
|
RB_FOREACH(lnbr, nbr_tree, &lde_nbrs) {
|
||||||
if (ln->peerid == lnbr->peerid)
|
if (ln->peerid == lnbr->peerid)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* LWd.9: check if previously sent a label mapping */
|
/* LWd.9: check if previously sent a label
|
||||||
me = (struct lde_map *)fec_find(&lnbr->sent_map,
|
* mapping
|
||||||
&fn->fec);
|
|
||||||
/*
|
|
||||||
* LWd.10: does label sent to peer "map" to withdraw
|
|
||||||
* label
|
|
||||||
*/
|
*/
|
||||||
if (me)
|
me = (struct lde_map *)fec_find(
|
||||||
|
&lnbr->sent_map, &fn->fec);
|
||||||
|
/*
|
||||||
|
* LWd.10: does label sent to peer "map" to
|
||||||
|
* withdraw label
|
||||||
|
*/
|
||||||
|
if (me && lde_nbr_is_nexthop(fn, lnbr))
|
||||||
/* LWd.11: send label withdraw */
|
/* LWd.11: send label withdraw */
|
||||||
lde_send_labelwithdraw(lnbr, fn, NULL, NULL);
|
lde_send_labelwithdraw(lnbr, fn, NULL,
|
||||||
|
NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user