diff options
| author | Mark Stapp <mjs@voltanet.io> | 2019-04-26 17:06:24 -0400 |
|---|---|---|
| committer | Mark Stapp <mjs@voltanet.io> | 2019-05-07 08:54:05 -0400 |
| commit | c2e1064474fdba9229e09e8fbf69deacb116ac68 (patch) | |
| tree | 061745de1edd2f00187e5b11bcbf5a03fb03aec0 /zebra/zebra_mpls.c | |
| parent | b0a973b94a6858f6c8826f7a561e771866fa1da5 (diff) | |
zebra: remove vrf LSPs when vrf is deleted
Try to remove any LSPs associated with a vrf when the vrf is
deleted. The vrf code was calling a helpful zebra_mpls api,
but that api was basically a no-op for vrfs other than
the default.
Signed-off-by: Mark Stapp <mjs@voltanet.io>
Diffstat (limited to 'zebra/zebra_mpls.c')
| -rw-r--r-- | zebra/zebra_mpls.c | 29 |
1 files changed, 26 insertions, 3 deletions
diff --git a/zebra/zebra_mpls.c b/zebra/zebra_mpls.c index 5c375a6bef..f1082a5996 100644 --- a/zebra/zebra_mpls.c +++ b/zebra/zebra_mpls.c @@ -2874,7 +2874,11 @@ void zebra_mpls_print_lsp_table(struct vty *vty, struct zebra_vrf *zvrf, ifp = if_lookup_by_index_per_ns( zns, nexthop->ifindex); - vty_out(vty, "%15s", ifp->name); + if (ifp) + vty_out(vty, "%15s", ifp->name); + else + vty_out(vty, "%15s", "Null"); + break; } case NEXTHOP_TYPE_IPV4: @@ -2999,11 +3003,30 @@ int zebra_mpls_write_label_block_config(struct vty *vty, struct zebra_vrf *zvrf) /* * Called when VRF becomes inactive, cleans up information but keeps * the table itself. - * NOTE: Currently supported only for default VRF. */ void zebra_mpls_cleanup_tables(struct zebra_vrf *zvrf) { - hash_iterate(zvrf->lsp_table, lsp_uninstall_from_kernel, NULL); + struct zebra_vrf *def_zvrf; + afi_t afi; + + if (zvrf_id(zvrf) == VRF_DEFAULT) + hash_iterate(zvrf->lsp_table, lsp_uninstall_from_kernel, NULL); + else { + /* + * For other vrfs, we try to remove associated LSPs; we locate + * the LSPs in the default vrf. + */ + def_zvrf = zebra_vrf_lookup_by_id(VRF_DEFAULT); + + /* At shutdown, the default may be gone already */ + if (def_zvrf == NULL) + return; + + for (afi = AFI_IP; afi < AFI_MAX; afi++) { + if (zvrf->label[afi] != MPLS_LABEL_NONE) + lsp_uninstall(def_zvrf, zvrf->label[afi]); + } + } } /* |
