From e6d08a89c7348d1af045b752473ad571020a8de9 Mon Sep 17 00:00:00 2001 From: Dmytro Shytyi Date: Thu, 6 Mar 2025 16:58:24 +0100 Subject: [PATCH] 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 --- zebra/interface.c | 8 ++++--- zebra/interface.h | 4 ++-- zebra/rtadv.c | 61 +++++++++++++++++++++++++++++++++++++++++++++-- 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; }