]> git.puffer.fish Git - mirror/frr.git/commitdiff
ospf6d: ASBR summarisation per VRF
authorMobashshera Rasool <mrasool@vmware.com>
Tue, 20 Jul 2021 05:25:10 +0000 (05:25 +0000)
committerMobashshera Rasool <mrasool@vmware.com>
Wed, 21 Jul 2021 05:20:33 +0000 (05:20 +0000)
Added code to support the ASBR summarisation per VRF.

Signed-off-by: Mobashshera Rasool <mrasool@vmware.com>
ospf6d/ospf6_asbr.c
ospf6d/ospf6_top.c

index 6862d05d9cb461ef82c467f424eac1bc30fb8891..ccb0c1724211f49d171d3c4362376b26bb62a763 100644 (file)
@@ -2978,7 +2978,7 @@ static void ospf6_aggr_handle_external_info(void *data)
                                        __func__,
                                        &rt->prefix);
 
-       ospf6 = ospf6_lookup_by_vrf_name(VRF_DEFAULT_NAME);
+       ospf6 = rt->ospf6;
        assert(ospf6);
 
        aggr = ospf6_external_aggr_match(ospf6,
index 3497d71869b980e3d1e2cbe7259d3f0aacd11ef5..65c1eee7601b6326685cd0fc5e0b0ac8e38c6661 100644 (file)
@@ -1941,6 +1941,26 @@ ospf6_print_json_external_routes_walkcb(struct hash_bucket *bucket, void *arg)
        return HASHWALK_CONTINUE;
 }
 
+static void
+ospf6_show_vrf_name(struct vty *vty, struct ospf6 *ospf6,
+                   json_object *json)
+{
+       if (json) {
+               if (ospf6->vrf_id == VRF_DEFAULT)
+                       json_object_string_add(json, "vrfName",
+                                              "default");
+               else
+                       json_object_string_add(json, "vrfName",
+                                              ospf6->name);
+               json_object_int_add(json, "vrfId", ospf6->vrf_id);
+       } else {
+               if (ospf6->vrf_id == VRF_DEFAULT)
+                       vty_out(vty, "VRF Name: %s\n", "default");
+               else if (ospf6->name)
+                       vty_out(vty, "VRF Name: %s\n", ospf6->name);
+       }
+}
+
 static int
 ospf6_show_summary_address(struct vty *vty, struct ospf6 *ospf6,
                        json_object *json,
@@ -1948,16 +1968,23 @@ ospf6_show_summary_address(struct vty *vty, struct ospf6 *ospf6,
 {
        struct route_node *rn;
        static const char header[] = "Summary-address       Metric-type     Metric     Tag         External_Rt_count\n";
+       json_object *json_vrf = NULL;
 
        if (!uj) {
+               ospf6_show_vrf_name(vty, ospf6, json_vrf);
                vty_out(vty, "aggregation delay interval :%d(in seconds)\n\n",
                                ospf6->aggr_delay_interval);
                vty_out(vty, "%s\n", header);
        } else {
-               json_object_int_add(json, "aggregation delay interval",
+               json_vrf = json_object_new_object();
+
+               ospf6_show_vrf_name(vty, ospf6, json_vrf);
+
+               json_object_int_add(json_vrf, "aggregation delay interval",
                                ospf6->aggr_delay_interval);
        }
 
+
        for (rn = route_top(ospf6->rt_aggr_tbl); rn; rn = route_next(rn)) {
                if (!rn->info)
                        continue;
@@ -1972,7 +1999,7 @@ ospf6_show_summary_address(struct vty *vty, struct ospf6 *ospf6,
 
                        json_aggr = json_object_new_object();
 
-                       json_object_object_add(json,
+                       json_object_object_add(json_vrf,
                                                buf,
                                                json_aggr);
 
@@ -2036,15 +2063,21 @@ ospf6_show_summary_address(struct vty *vty, struct ospf6 *ospf6,
                }
        }
 
+       if (uj)
+               json_object_object_add(json, ospf6->name,
+                                       json_vrf);
+
        return CMD_SUCCESS;
 }
 
 DEFPY (show_ipv6_ospf6_external_aggregator,
        show_ipv6_ospf6_external_aggregator_cmd,
-       "show ipv6 ospf6 summary-address [detail$detail] [json]",
+       "show ipv6 ospf6 [vrf <NAME|all>] summary-address [detail$detail] [json]",
        SHOW_STR
        IP6_STR
        OSPF6_STR
+       VRF_CMD_HELP_STR
+       "All VRFs\n"
        "Show external summary addresses\n"
        "detailed informtion\n"
        JSON_STR)
@@ -2052,25 +2085,27 @@ DEFPY (show_ipv6_ospf6_external_aggregator,
        bool uj = use_json(argc, argv);
        struct ospf6 *ospf6 = NULL;
        json_object *json = NULL;
+       const char *vrf_name = NULL;
+       struct listnode *node;
+       bool all_vrf = false;
+       int idx_vrf = 0;
 
        if (uj)
                json = json_object_new_object();
 
-               /* Default Vrf */
-       ospf6 = ospf6_lookup_by_vrf_name(VRF_DEFAULT_NAME);
-       if (ospf6 == NULL) {
-               if (uj) {
-                       vty_out(vty, "%s\n",
-                               json_object_to_json_string_ext(
-                                       json, JSON_C_TO_STRING_PRETTY));
-                       json_object_free(json);
-               } else
-                       vty_out(vty, "OSPFv3 is not running\n");
+       OSPF6_CMD_CHECK_RUNNING();
+       OSPF6_FIND_VRF_ARGS(argv, argc, idx_vrf, vrf_name, all_vrf);
 
-               return CMD_SUCCESS;
-       }
+       for (ALL_LIST_ELEMENTS_RO(om6->ospf6, node, ospf6)) {
+               if (all_vrf || strcmp(ospf6->name, vrf_name) == 0) {
 
-       ospf6_show_summary_address(vty, ospf6, json, uj, detail);
+                       ospf6_show_summary_address(vty, ospf6, json, uj,
+                                                  detail);
+
+                       if (!all_vrf)
+                               break;
+               }
+       }
 
        if (uj) {
                vty_out(vty, "%s\n", json_object_to_json_string_ext(