]> git.puffer.fish Git - matthieu/frr.git/commitdiff
zebra: add rtadv information output in vtysh json
authorDmytro Shytyi <dmytro.shytyi@6wind.com>
Thu, 6 Mar 2025 15:58:24 +0000 (16:58 +0100)
committerDmytro Shytyi <dmytro.shytyi@6wind.com>
Mon, 17 Mar 2025 10:19:58 +0000 (11:19 +0100)
Add to "show interface json" output multiple rtadv parameters.

if_dump_vty() calls => hook_call(zebra_if_extra_info, vty, ifp);

if_dump_vty_json() now do the same call, with additional parameter:
hook_call(zebra_if_extra_info, vty, json_if, ifp);

Signed-off-by: Dmytro Shytyi <dmytro.shytyi@6wind.com>
zebra/interface.c
zebra/interface.h
zebra/rtadv.c

index 8080ba01de0c3e20efb6a7687de6b45e573c8ed5..fd1ea380a55d9f386cc60321bf8a4201292a71b2 100644 (file)
@@ -40,8 +40,8 @@ DEFINE_MTYPE_STATIC(ZEBRA, ZINFO, "Zebra Interface Information");
 
 #define ZEBRA_PTM_SUPPORT
 
-DEFINE_HOOK(zebra_if_extra_info, (struct vty * vty, struct interface *ifp),
-           (vty, ifp));
+DEFINE_HOOK(zebra_if_extra_info, (struct vty * vty, json_object *json_if, struct interface *ifp),
+           (vty, json_if, ifp));
 
 DEFINE_MTYPE_STATIC(ZEBRA, ZIF_DESC, "Intf desc");
 
@@ -2846,7 +2846,7 @@ static void if_dump_vty(struct vty *vty, struct interface *ifp)
                                &iflp->rmt_ip, iflp->rmt_as);
        }
 
-       hook_call(zebra_if_extra_info, vty, ifp);
+       hook_call(zebra_if_extra_info, vty, NULL, ifp);
 
        if (listhead(ifp->nbr_connected))
                vty_out(vty, "  Neighbor address(s):\n");
@@ -3252,6 +3252,8 @@ static void if_dump_vty_json(struct vty *vty, struct interface *ifp,
                json_object_int_add(json_te, "neighborAsbrAs", iflp->rmt_as);
        }
 
+       hook_call(zebra_if_extra_info, vty, json_if, ifp);
+
        if (listhead(ifp->nbr_connected)) {
                json_object *json_nbr_addrs;
 
index 0f5c9974039d1ab1be685f4513bb7a3e29ad1cdb..5b45656bd5ace9b65ae221dcd5db025ba6436657 100644 (file)
@@ -223,8 +223,8 @@ struct zebra_if {
        char *desc;
 };
 
-DECLARE_HOOK(zebra_if_extra_info, (struct vty * vty, struct interface *ifp),
-            (vty, ifp));
+DECLARE_HOOK(zebra_if_extra_info, (struct vty * vty, json_object *json_if, struct interface *ifp),
+            (vty, json_if, ifp));
 
 #define IS_ZEBRA_IF_VRF(ifp)                                                   \
        (((struct zebra_if *)(ifp->info))->zif_type == ZEBRA_IF_VRF)
index 467bcb6b16089f53f9e81a244759aae3db76806c..a767bda72e2197b58f9b35310683c026f491a600 100644 (file)
@@ -1726,7 +1726,7 @@ int rtadv_dnssl_encode(uint8_t *out, const char *in)
 }
 
 /* Dump interface ND information to vty. */
-static int nd_dump_vty(struct vty *vty, struct interface *ifp)
+static int nd_dump_vty(struct vty *vty, json_object *json_if, struct interface *ifp)
 {
        struct zebra_if *zif;
        struct rtadvconf *rtadv;
@@ -1735,7 +1735,7 @@ static int nd_dump_vty(struct vty *vty, struct interface *ifp)
        zif = (struct zebra_if *)ifp->info;
        rtadv = &zif->rtadv;
 
-       if (rtadv->AdvSendAdvertisements) {
+       if (!json_if && rtadv->AdvSendAdvertisements) {
                vty_out(vty,
                        "  ND advertised reachable time is %d milliseconds\n",
                        rtadv->AdvReachableTime);
@@ -1792,6 +1792,63 @@ static int nd_dump_vty(struct vty *vty, struct interface *ifp)
                        vty_out(vty,
                                "  ND router advertisements with Adv. Interval option.\n");
        }
+
+       if (json_if && rtadv->AdvSendAdvertisements) {
+               json_object_int_add(json_if, "ndAdvertisedReachableTimeMsecs",
+                                   rtadv->AdvReachableTime);
+               json_object_int_add(json_if, "ndAdvertisedRetransmitIntervalMsecs",
+                                   rtadv->AdvRetransTimer);
+               json_object_int_add(json_if, "ndAdvertisedHopCountLimitHops", rtadv->AdvCurHopLimit);
+               json_object_int_add(json_if, "ndRouterAdvertisementsSent", zif->ra_sent);
+               json_object_int_add(json_if, "ndRouterAdvertisementsRcvd", zif->ra_rcvd);
+
+               interval = rtadv->MaxRtrAdvInterval;
+               if (interval % 1000)
+                       json_object_int_add(json_if, "ndRouterAdvertisementsIntervalMsecs",
+                                           interval);
+               else
+                       json_object_int_add(json_if, "ndRouterAdvertisementsIntervalSecs",
+                                           interval / 1000);
+
+               json_object_boolean_add(json_if, "ndRouterAdvertisementsDoNotUseFastRetransmit",
+                                       !rtadv->UseFastRexmit);
+
+               if (rtadv->AdvDefaultLifetime != -1)
+                       json_object_int_add(json_if, "ndRouterAdvertisementsLiveForSecs",
+                                           rtadv->AdvDefaultLifetime);
+               else
+                       json_object_boolean_add(json_if,
+                                               "ndRouterAdvertisementsLifetimeTracksRaInterval",
+                                               true);
+
+               json_object_string_add(json_if, "ndRouterAdvertisementDefaultRouterPreference",
+                                      rtadv_pref_strs[rtadv->DefaultPreference]);
+
+               if (rtadv->AdvManagedFlag)
+                       json_object_boolean_add(json_if, "hostsUseDhcpToObtainRoutableAddresses",
+                                               true);
+               else
+                       json_object_boolean_add(json_if, "hostsUseStatelessAutoconfigForAddresses",
+                                               true);
+
+               if (rtadv->AdvHomeAgentFlag) {
+                       json_object_boolean_add(json_if,
+                                               "ndRouterAdvertisementsWithHomeAgentFlagBit", true);
+                       if (rtadv->HomeAgentLifetime != -1)
+                               json_object_int_add(json_if, "homeAgentLifetimeSecs",
+                                                   rtadv->HomeAgentLifetime);
+                       else
+                               json_object_boolean_add(json_if,
+                                                       "homeAgentLifetimeTracksRaLifetime", true);
+
+                       json_object_int_add(json_if, "homeAgentPreference",
+                                           rtadv->HomeAgentLifetime);
+               }
+               if (rtadv->AdvIntervalOption)
+                       json_object_boolean_add(json_if,
+                                               "ndRouterAdvertisementsWithAdvIntervalOption", true);
+       }
+
        return 0;
 }