summaryrefslogtreecommitdiff
path: root/zebra
diff options
context:
space:
mode:
authorDmytro Shytyi <dmytro.shytyi@6wind.com>2025-03-06 16:58:24 +0100
committerDmytro Shytyi <dmytro.shytyi@6wind.com>2025-03-17 11:19:58 +0100
commite6d08a89c7348d1af045b752473ad571020a8de9 (patch)
tree268ed48940f7c8aef8f73cea5eee0a439015879d /zebra
parent942a7c916cc35a2ab1d7da6257810e58ab001552 (diff)
zebra: add rtadv information output in vtysh json
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>
Diffstat (limited to 'zebra')
-rw-r--r--zebra/interface.c8
-rw-r--r--zebra/interface.h4
-rw-r--r--zebra/rtadv.c61
3 files changed, 66 insertions, 7 deletions
diff --git a/zebra/interface.c b/zebra/interface.c
index 8080ba01de..fd1ea380a5 100644
--- a/zebra/interface.c
+++ b/zebra/interface.c
@@ -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;
diff --git a/zebra/interface.h b/zebra/interface.h
index 0f5c997403..5b45656bd5 100644
--- a/zebra/interface.h
+++ b/zebra/interface.h
@@ -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)
diff --git a/zebra/rtadv.c b/zebra/rtadv.c
index 467bcb6b16..a767bda72e 100644
--- a/zebra/rtadv.c
+++ b/zebra/rtadv.c
@@ -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;
}