]> git.puffer.fish Git - matthieu/frr.git/commitdiff
zebra: [7.0] remove vrf LSPs when vrf is deleted
authorMark Stapp <mjs@voltanet.io>
Tue, 14 May 2019 15:28:30 +0000 (11:28 -0400)
committerMark Stapp <mjs@voltanet.io>
Tue, 14 May 2019 15:28:30 +0000 (11:28 -0400)
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>
zebra/zebra_mpls.c

index c0764cd4b8c6090226be791dac19a3d0af8ff7dc..c210176563a169152da2ac6964e81d3e803fb117 100644 (file)
@@ -2799,7 +2799,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:
@@ -2924,11 +2928,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]);
+               }
+       }
 }
 
 /*