]> git.puffer.fish Git - matthieu/frr.git/commitdiff
ospfd: fix show ip ospf neigh json
authorChirag Shah <chirag@cumulusnetworks.com>
Fri, 5 Jul 2019 22:45:56 +0000 (15:45 -0700)
committerChirag Shah <chirag@cumulusnetworks.com>
Wed, 10 Jul 2019 01:13:22 +0000 (18:13 -0700)
Same ospf neigbor can be learnt via multiple
interfaces, ospf detail json only displayed
last instance only.

Fix json output format to contain "neighbors"
keyword, under which to display all neighbors
for a given vrf.

Fix
show ip ospf neighbor detail json
show ip ospf neighbor detail all json
show ip ospf neighbor <intf name> detail json

Ticket:CM-25528
Reviewed By:
Testing Done:

Run the output with JSON formatter and the output
has passed.

switch1# show ip ospf vrf all neighbor detail json
{
  "default":{
    "vrfName":"default",
    "vrfId":0,
    "neighbors":{
      "0.0.0.2":[
        {
          "ifaceAddress":"14.0.0.22",
          "areaId":"0.0.0.0",
          "ifaceName":"Bridge1.510",
          "nbrPriority":1,
          "nbrState":"Full",
          "stateChangeCounter":6,
          "lastPrgrsvChangeMsec":82668,
          "routerDesignatedId":"14.0.0.22",
          "routerDesignatedBackupId":"14.0.0.21",
          "optionsCounter":2,
          "optionsList":"*|-|-|-|-|-|E|-",
          "routerDeadIntervalTimerDueMsec":36195,
          "databaseSummaryListCounter":0,
          "linkStateRequestListCounter":0,
          "linkStateRetransmissionListCounter":0,
          "threadInactivityTimer":"on",
          "threadLinkStateRequestRetransmission":"on",
          "threadLinkStateUpdateRetransmission":"on",
          "peerBfdInfo":{
            "type":"single hop",
            "detectMultiplier":4,
            "rxMinInterval":600,
            "txMinInterval":800,
            "status":"Down",
            "lastUpdate":"0:00:00:29"
          }
        },
        {
          "ifaceAddress":"14.0.0.26",
          "areaId":"0.0.0.0",
          "ifaceName":"Bridge1.511",
          "nbrPriority":1,
          "nbrState":"Full",
          "stateChangeCounter":6,
          "lastPrgrsvChangeMsec":82658,
          "routerDesignatedId":"14.0.0.26",
          "routerDesignatedBackupId":"14.0.0.25",
          "optionsCounter":2,
          "optionsList":"*|-|-|-|-|-|E|-",
          "routerDeadIntervalTimerDueMsec":36196,
          "databaseSummaryListCounter":0,
          "linkStateRequestListCounter":0,
          "linkStateRetransmissionListCounter":0,
          "threadInactivityTimer":"on",
          "threadLinkStateRequestRetransmission":"on",
          "threadLinkStateUpdateRetransmission":"on"
        },
     ]
    }
  }
}

Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
ospfd/ospf_vty.c

index dfa34f15efa47d25a789eaf3ed94bfd8a9580197..98ddd6a79eb54faad184c97e87ecc257e5a8761e 100644 (file)
@@ -4884,14 +4884,36 @@ static void show_ip_ospf_nbr_nbma_detail_sub(struct vty *vty,
 static void show_ip_ospf_neighbor_detail_sub(struct vty *vty,
                                             struct ospf_interface *oi,
                                             struct ospf_neighbor *nbr,
+                                            struct ospf_neighbor *prev_nbr,
                                             json_object *json, bool use_json)
 {
        char timebuf[OSPF_TIME_DUMP_SIZE];
-       json_object *json_sub = NULL;
+       json_object *json_neigh = NULL, *json_neigh_array = NULL;
+       char neigh_str[INET_ADDRSTRLEN] = {0};
 
-       if (use_json)
-               json_sub = json_object_new_object();
-       else {
+       if (use_json) {
+               if (prev_nbr &&
+                   !IPV4_ADDR_SAME(&prev_nbr->src, &nbr->src)) {
+                       json_neigh_array = NULL;
+               }
+
+               if (nbr->state == NSM_Attempt && nbr->router_id.s_addr == 0)
+                       strlcpy(neigh_str, "noNbrId", sizeof(neigh_str));
+               else
+                       strlcpy(neigh_str, inet_ntoa(nbr->router_id),
+                               sizeof(neigh_str));
+
+               json_object_object_get_ex(json, neigh_str, &json_neigh_array);
+
+               if (!json_neigh_array) {
+                       json_neigh_array = json_object_new_array();
+                       json_object_object_add(json, neigh_str,
+                                              json_neigh_array);
+               }
+
+               json_neigh = json_object_new_object();
+
+       } else {
                /* Show neighbor ID. */
                if (nbr->state == NSM_Attempt && nbr->router_id.s_addr == 0)
                        vty_out(vty, " Neighbor %s,", "-");
@@ -4902,7 +4924,7 @@ static void show_ip_ospf_neighbor_detail_sub(struct vty *vty,
 
        /* Show interface address. */
        if (use_json)
-               json_object_string_add(json_sub, "ifaceAddress",
+               json_object_string_add(json_neigh, "ifaceAddress",
                                       inet_ntoa(nbr->address.u.prefix4));
        else
                vty_out(vty, " interface address %s\n",
@@ -4910,18 +4932,18 @@ static void show_ip_ospf_neighbor_detail_sub(struct vty *vty,
 
        /* Show Area ID. */
        if (use_json) {
-               json_object_string_add(json_sub, "areaId",
+               json_object_string_add(json_neigh, "areaId",
                                       ospf_area_desc_string(oi->area));
-               json_object_string_add(json_sub, "ifaceName", oi->ifp->name);
+               json_object_string_add(json_neigh, "ifaceName", oi->ifp->name);
        } else
                vty_out(vty, "    In the area %s via interface %s\n",
                        ospf_area_desc_string(oi->area), oi->ifp->name);
 
        /* Show neighbor priority and state. */
        if (use_json) {
-               json_object_int_add(json_sub, "nbrPriority", nbr->priority);
+               json_object_int_add(json_neigh, "nbrPriority", nbr->priority);
                json_object_string_add(
-                       json_sub, "nbrState",
+                       json_neigh, "nbrState",
                        lookup_msg(ospf_nsm_state_msg, nbr->state, NULL));
        } else
                vty_out(vty, "    Neighbor priority is %d, State is %s,",
@@ -4930,7 +4952,7 @@ static void show_ip_ospf_neighbor_detail_sub(struct vty *vty,
 
        /* Show state changes. */
        if (use_json)
-               json_object_int_add(json_sub, "stateChangeCounter",
+               json_object_int_add(json_neigh, "stateChangeCounter",
                                    nbr->state_change);
        else
                vty_out(vty, " %d state changes\n", nbr->state_change);
@@ -4942,7 +4964,7 @@ static void show_ip_ospf_neighbor_detail_sub(struct vty *vty,
                time_store =
                        monotime_since(&nbr->ts_last_progress, &res) / 1000LL;
                if (use_json) {
-                       json_object_int_add(json_sub, "lastPrgrsvChangeMsec",
+                       json_object_int_add(json_neigh, "lastPrgrsvChangeMsec",
                                            time_store);
                } else {
                        vty_out(vty,
@@ -4960,12 +4982,13 @@ static void show_ip_ospf_neighbor_detail_sub(struct vty *vty,
                time_store =
                        monotime_since(&nbr->ts_last_regress, &res) / 1000LL;
                if (use_json) {
-                       json_object_int_add(json_sub,
+                       json_object_int_add(json_neigh,
                                            "lastRegressiveChangeMsec",
                                            time_store);
                        if (nbr->last_regress_str)
                                json_object_string_add(
-                                       json_sub, "lastRegressiveChangeReason",
+                                       json_neigh,
+                                       "lastRegressiveChangeReason",
                                        nbr->last_regress_str);
                } else {
                        vty_out(vty,
@@ -4979,22 +5002,22 @@ static void show_ip_ospf_neighbor_detail_sub(struct vty *vty,
 
        /* Show Designated Rotuer ID. */
        if (use_json)
-               json_object_string_add(json_sub, "routerDesignatedId",
+               json_object_string_add(json_neigh, "routerDesignatedId",
                                       inet_ntoa(nbr->d_router));
        else
                vty_out(vty, "    DR is %s,", inet_ntoa(nbr->d_router));
 
        /* Show Backup Designated Rotuer ID. */
        if (use_json)
-               json_object_string_add(json_sub, "routerDesignatedBackupId",
+               json_object_string_add(json_neigh, "routerDesignatedBackupId",
                                       inet_ntoa(nbr->bd_router));
        else
                vty_out(vty, " BDR is %s\n", inet_ntoa(nbr->bd_router));
 
        /* Show options. */
        if (use_json) {
-               json_object_int_add(json_sub, "optionsCounter", nbr->options);
-               json_object_string_add(json_sub, "optionsList",
+               json_object_int_add(json_neigh, "optionsCounter", nbr->options);
+               json_object_string_add(json_neigh, "optionsList",
                                       ospf_options_dump(nbr->options));
        } else
                vty_out(vty, "    Options %d %s\n", nbr->options,
@@ -5007,12 +5030,13 @@ static void show_ip_ospf_neighbor_detail_sub(struct vty *vty,
                        time_store = monotime_until(&nbr->t_inactivity->u.sands,
                                                    NULL)
                                     / 1000LL;
-                       json_object_int_add(json_sub,
+                       json_object_int_add(json_neigh,
                                            "routerDeadIntervalTimerDueMsec",
                                            time_store);
                } else
                        json_object_int_add(
-                               json_sub, "routerDeadIntervalTimerDueMsec", -1);
+                               json_neigh,
+                               "routerDeadIntervalTimerDueMsec", -1);
        } else
                vty_out(vty, "    Dead timer due in %s\n",
                        ospf_timer_dump(nbr->t_inactivity, timebuf,
@@ -5020,7 +5044,7 @@ static void show_ip_ospf_neighbor_detail_sub(struct vty *vty,
 
        /* Show Database Summary list. */
        if (use_json)
-               json_object_int_add(json_sub, "databaseSummaryListCounter",
+               json_object_int_add(json_neigh, "databaseSummaryListCounter",
                                    ospf_db_summary_count(nbr));
        else
                vty_out(vty, "    Database Summary List %d\n",
@@ -5028,7 +5052,7 @@ static void show_ip_ospf_neighbor_detail_sub(struct vty *vty,
 
        /* Show Link State Request list. */
        if (use_json)
-               json_object_int_add(json_sub, "linkStateRequestListCounter",
+               json_object_int_add(json_neigh, "linkStateRequestListCounter",
                                    ospf_ls_request_count(nbr));
        else
                vty_out(vty, "    Link State Request List %ld\n",
@@ -5036,7 +5060,7 @@ static void show_ip_ospf_neighbor_detail_sub(struct vty *vty,
 
        /* Show Link State Retransmission list. */
        if (use_json)
-               json_object_int_add(json_sub,
+               json_object_int_add(json_neigh,
                                    "linkStateRetransmissionListCounter",
                                    ospf_ls_retransmit_count(nbr));
        else
@@ -5046,7 +5070,7 @@ static void show_ip_ospf_neighbor_detail_sub(struct vty *vty,
        /* Show inactivity timer thread. */
        if (use_json) {
                if (nbr->t_inactivity != NULL)
-                       json_object_string_add(json_sub,
+                       json_object_string_add(json_neigh,
                                               "threadInactivityTimer", "on");
        } else
                vty_out(vty, "    Thread Inactivity Timer %s\n",
@@ -5056,7 +5080,7 @@ static void show_ip_ospf_neighbor_detail_sub(struct vty *vty,
        if (use_json) {
                if (nbr->t_db_desc != NULL)
                        json_object_string_add(
-                               json_sub,
+                               json_neigh,
                                "threadDatabaseDescriptionRetransmission",
                                "on");
        } else
@@ -5068,7 +5092,7 @@ static void show_ip_ospf_neighbor_detail_sub(struct vty *vty,
        if (use_json) {
                if (nbr->t_ls_req != NULL)
                        json_object_string_add(
-                               json_sub,
+                               json_neigh,
                                "threadLinkStateRequestRetransmission", "on");
        } else
                vty_out(vty,
@@ -5079,22 +5103,19 @@ static void show_ip_ospf_neighbor_detail_sub(struct vty *vty,
        if (use_json) {
                if (nbr->t_ls_upd != NULL)
                        json_object_string_add(
-                               json_sub, "threadLinkStateUpdateRetransmission",
+                               json_neigh,
+                               "threadLinkStateUpdateRetransmission",
                                "on");
        } else
                vty_out(vty,
                        "    Thread Link State Update Retransmission %s\n\n",
                        nbr->t_ls_upd != NULL ? "on" : "off");
 
-       if (use_json) {
-               if (nbr->state == NSM_Attempt && nbr->router_id.s_addr == 0)
-                       json_object_object_add(json, "noNbrId", json_sub);
-               else
-                       json_object_object_add(json, inet_ntoa(nbr->router_id),
-                                              json_sub);
-       }
+       ospf_bfd_show_info(vty, nbr->bfd_info, json_neigh, use_json, 0);
+
+       if (use_json)
+               json_object_array_add(json_neigh_array, json_neigh);
 
-       ospf_bfd_show_info(vty, nbr->bfd_info, json, use_json, 0);
 }
 
 static int show_ip_ospf_neighbor_id_common(struct vty *vty, struct ospf *ospf,
@@ -5121,8 +5142,8 @@ static int show_ip_ospf_neighbor_id_common(struct vty *vty, struct ospf *ospf,
 
        for (ALL_LIST_ELEMENTS_RO(ospf->oiflist, node, oi)) {
                if ((nbr = ospf_nbr_lookup_by_routerid(oi->nbrs, router_id))) {
-                       show_ip_ospf_neighbor_detail_sub(vty, oi, nbr, json,
-                                                        use_json);
+                       show_ip_ospf_neighbor_detail_sub(vty, oi, nbr, NULL,
+                                                        json, use_json);
                }
        }
 
@@ -5192,16 +5213,20 @@ static int show_ip_ospf_neighbor_detail_common(struct vty *vty,
        struct ospf_interface *oi;
        struct listnode *node;
        json_object *json_vrf = NULL;
+       json_object *json_nbr_sub = NULL;
 
        if (use_json) {
                if (use_vrf)
                        json_vrf = json_object_new_object();
                else
                        json_vrf = json;
+
+               json_nbr_sub = json_object_new_object();
        }
+
        if (ospf->instance) {
                if (use_json)
-                       json_object_int_add(json_vrf, "ospfInstance",
+                       json_object_int_add(json, "ospfInstance",
                                            ospf->instance);
                else
                        vty_out(vty, "\nOSPF Instance: %d\n\n", ospf->instance);
@@ -5211,22 +5236,25 @@ static int show_ip_ospf_neighbor_detail_common(struct vty *vty,
 
        for (ALL_LIST_ELEMENTS_RO(ospf->oiflist, node, oi)) {
                struct route_node *rn;
-               struct ospf_neighbor *nbr;
+               struct ospf_neighbor *nbr, *prev_nbr = NULL;
 
                for (rn = route_top(oi->nbrs); rn; rn = route_next(rn)) {
                        if ((nbr = rn->info)) {
                                if (nbr != oi->nbr_self) {
                                        if (nbr->state != NSM_Down) {
                                                show_ip_ospf_neighbor_detail_sub(
-                                                       vty, oi, nbr, json_vrf,
-                                                       use_json);
+                                                       vty, oi, nbr, prev_nbr,
+                                                       json_nbr_sub, use_json);
                                        }
                                }
+                               prev_nbr = nbr;
                        }
                }
        }
 
        if (use_json) {
+               json_object_object_add(json_vrf, "neighbors",
+                                      json_nbr_sub);
                if (use_vrf) {
                        if (ospf->vrf_id == VRF_DEFAULT)
                                json_object_object_add(json, "default",
@@ -5389,16 +5417,20 @@ static int show_ip_ospf_neighbor_detail_all_common(struct vty *vty,
 
        for (ALL_LIST_ELEMENTS_RO(ospf->oiflist, node, oi)) {
                struct route_node *rn;
-               struct ospf_neighbor *nbr;
+               struct ospf_neighbor *nbr, *prev_nbr = NULL;
                struct ospf_nbr_nbma *nbr_nbma;
 
-               for (rn = route_top(oi->nbrs); rn; rn = route_next(rn))
-                       if ((nbr = rn->info))
+               for (rn = route_top(oi->nbrs); rn; rn = route_next(rn)) {
+                       if ((nbr = rn->info)) {
                                if (nbr != oi->nbr_self)
                                        if (nbr->state != NSM_Down)
                                                show_ip_ospf_neighbor_detail_sub(
                                                        vty, oi, rn->info,
+                                                       prev_nbr,
                                                        json_vrf, use_json);
+                               prev_nbr = nbr;
+                       }
+               }
 
                if (oi->type == OSPF_IFTYPE_NBMA) {
                        struct listnode *nd;
@@ -5594,6 +5626,7 @@ static int show_ip_ospf_neighbor_int_detail_common(struct vty *vty,
                                                if (nbr->state != NSM_Down)
                                                        show_ip_ospf_neighbor_detail_sub(
                                                                vty, oi, nbr,
+                                                               NULL,
                                                                json, use_json);
                                        }
                                }
@@ -5632,7 +5665,7 @@ DEFUN (show_ip_ospf_neighbor_int_detail,
                if (!ospf->oi_running)
                        continue;
                ospf_output = true;
-               ret = show_ip_ospf_neighbor_int_detail_common(vty, ospf, 0,
+               ret = show_ip_ospf_neighbor_int_detail_common(vty, ospf, 4,
                                                              argv, uj);
        }