diff options
| author | Olivier Dugeon <olivier.dugeon@orange.com> | 2021-01-12 19:25:15 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-01-12 19:25:15 +0100 |
| commit | 4683138cdabe97db182d35147d74b6fb01a8e557 (patch) | |
| tree | 3aa64eae0e8c5aceca0991fd1db3fd72143542b3 /ldpd/lde_lib.c | |
| parent | 484eabb1d70fe00478ce30cc866f219df5c183ab (diff) | |
| parent | 27cb633df6c9fa9113a858dceb9528f2524c425d (diff) | |
Merge pull request #7707 from opensourcerouting/isisd-rlfa
isisd, ldpd: add Remote LFA support
Diffstat (limited to 'ldpd/lde_lib.c')
| -rw-r--r-- | ldpd/lde_lib.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/ldpd/lde_lib.c b/ldpd/lde_lib.c index 9db931677d..68b721e213 100644 --- a/ldpd/lde_lib.c +++ b/ldpd/lde_lib.c @@ -23,6 +23,7 @@ #include "ldpe.h" #include "lde.h" #include "log.h" +#include "rlfa.h" #include "mpls.h" @@ -339,6 +340,8 @@ lde_kernel_insert(struct fec *fec, int af, union ldpd_addr *nexthop, fnh = fec_nh_find(fn, af, nexthop, ifindex, route_type, route_instance); if (fnh == NULL) { + fn->flags |= F_FEC_NHS_CHANGED; + fnh = fec_nh_add(fn, af, nexthop, ifindex, route_type, route_instance); /* @@ -415,11 +418,17 @@ lde_kernel_update(struct fec *fec) } else fnh->flags |= F_FEC_NH_NO_LDP; } else { + fn->flags |= F_FEC_NHS_CHANGED; lde_send_delete_klabel(fn, fnh); fec_nh_del(fnh); } } + if (!(fn->flags & F_FEC_NHS_CHANGED)) + /* return earlier if nothing has changed */ + return; + fn->flags &= ~F_FEC_NHS_CHANGED; + if (LIST_EMPTY(&fn->nexthops)) { RB_FOREACH(ln, nbr_tree, &lde_nbrs) lde_send_labelwithdraw(ln, fn, NULL, NULL); @@ -601,6 +610,10 @@ lde_check_mapping(struct map *map, struct lde_nbr *ln, int rcvd_label_mapping) break; } } + + /* Update RLFA clients. */ + lde_rlfa_update_clients(&fec, ln, map->label); + /* LMp.13 & LMp.16: Record the mapping from this peer */ if (me == NULL) me = lde_map_add(ln, fn, 0); @@ -858,6 +871,9 @@ lde_check_withdraw(struct map *map, struct lde_nbr *ln) fnh->remote_label = NO_LABEL; } + /* Update RLFA clients. */ + lde_rlfa_update_clients(&fec, ln, MPLS_INVALID_LABEL); + /* LWd.2: send label release */ lde_send_labelrelease(ln, fn, NULL, map->label); @@ -940,6 +956,9 @@ lde_check_withdraw_wcard(struct map *map, struct lde_nbr *ln) fnh->remote_label = NO_LABEL; } + /* Update RLFA clients. */ + lde_rlfa_update_clients(f, ln, MPLS_INVALID_LABEL); + /* LWd.3: check previously received label mapping */ if (me && (map->label == NO_LABEL || map->label == me->map.label)) |
