ospfd: Support show advertise router in 'show ip ospf route' command

Users can now use 'show ip ospf route [detail]' command to show the
originator of each OSPF route item.

Signed-off-by: Zhiyuan Wan <h@iloli.bid>
This commit is contained in:
Zhiyuan Wan 2023-03-29 23:05:20 +08:00
parent 788cf6e892
commit 0ce2d1aaa1
2 changed files with 48 additions and 15 deletions

View File

@ -884,10 +884,11 @@ Showing Information
Show detailed information about the OSPF link-state database. Show detailed information about the OSPF link-state database.
.. clicmd:: show ip ospf route [json] .. clicmd:: show ip ospf route [detail] [json]
Show the OSPF routing table, as determined by the most recent SPF Show the OSPF routing table, as determined by the most recent SPF
calculation. calculation. If detail is specified, each routing item's
advertiser will be show up.
.. clicmd:: show ip ospf [vrf <NAME|all>] border-routers [json] .. clicmd:: show ip ospf [vrf <NAME|all>] border-routers [json]
@ -898,7 +899,7 @@ Showing Information
.. clicmd:: show ip ospf graceful-restart helper [detail] [json] .. clicmd:: show ip ospf graceful-restart helper [detail] [json]
Displays the Grcaeful Restart Helper details including helper Displays the Graceful Restart Helper details including helper
config changes. config changes.
.. _opaque-lsa: .. _opaque-lsa:

View File

@ -10732,7 +10732,7 @@ static void config_write_stub_router(struct vty *vty, struct ospf *ospf)
static void show_ip_ospf_route_network(struct vty *vty, struct ospf *ospf, static void show_ip_ospf_route_network(struct vty *vty, struct ospf *ospf,
struct route_table *rt, struct route_table *rt,
json_object *json) json_object *json, bool detail)
{ {
struct route_node *rn; struct route_node *rn;
struct ospf_route * or ; struct ospf_route * or ;
@ -10857,6 +10857,10 @@ static void show_ip_ospf_route_network(struct vty *vty, struct ospf *ospf,
ifindex2ifname( ifindex2ifname(
path->ifindex, path->ifindex,
ospf->vrf_id)); ospf->vrf_id));
json_object_string_addf(
json_nexthop,
"adv", "%pI4",
&path->adv_router);
} else { } else {
vty_out(vty, vty_out(vty,
"%24s via %pI4, %s\n", "%24s via %pI4, %s\n",
@ -10866,6 +10870,11 @@ static void show_ip_ospf_route_network(struct vty *vty, struct ospf *ospf,
path->ifindex, path->ifindex,
ospf->vrf_id)); ospf->vrf_id));
} }
if (detail && !json)
vty_out(vty,
"%24s adv %pI4\n",
"",
&path->adv_router);
} }
} }
} }
@ -11020,7 +11029,7 @@ static void show_ip_ospf_route_router(struct vty *vty, struct ospf *ospf,
static void show_ip_ospf_route_external(struct vty *vty, struct ospf *ospf, static void show_ip_ospf_route_external(struct vty *vty, struct ospf *ospf,
struct route_table *rt, struct route_table *rt,
json_object *json) json_object *json, bool detail)
{ {
struct route_node *rn; struct route_node *rn;
struct ospf_route *er; struct ospf_route *er;
@ -11124,6 +11133,10 @@ static void show_ip_ospf_route_external(struct vty *vty, struct ospf *ospf,
ifindex2ifname( ifindex2ifname(
path->ifindex, path->ifindex,
ospf->vrf_id)); ospf->vrf_id));
json_object_string_addf(
json_nexthop, "adv",
"%pI4",
&path->adv_router);
} else { } else {
vty_out(vty, vty_out(vty,
"%24s via %pI4, %s\n", "%24s via %pI4, %s\n",
@ -11133,6 +11146,10 @@ static void show_ip_ospf_route_external(struct vty *vty, struct ospf *ospf,
path->ifindex, path->ifindex,
ospf->vrf_id)); ospf->vrf_id));
} }
if (detail && !json)
vty_out(vty,
"%24s adv %pI4\n", "",
&path->adv_router);
} }
} }
} }
@ -11419,7 +11436,8 @@ DEFUN (show_ip_ospf_instance_border_routers,
} }
static int show_ip_ospf_route_common(struct vty *vty, struct ospf *ospf, static int show_ip_ospf_route_common(struct vty *vty, struct ospf *ospf,
json_object *json, uint8_t use_vrf) json_object *json, uint8_t use_vrf,
bool detail)
{ {
json_object *json_vrf = NULL; json_object *json_vrf = NULL;
@ -11447,7 +11465,8 @@ static int show_ip_ospf_route_common(struct vty *vty, struct ospf *ospf,
} }
/* Show Network routes. */ /* Show Network routes. */
show_ip_ospf_route_network(vty, ospf, ospf->new_table, json_vrf); show_ip_ospf_route_network(vty, ospf, ospf->new_table, json_vrf,
detail);
/* Show Router routes. */ /* Show Router routes. */
show_ip_ospf_route_router(vty, ospf, ospf->new_rtrs, json_vrf); show_ip_ospf_route_router(vty, ospf, ospf->new_rtrs, json_vrf);
@ -11458,7 +11477,7 @@ static int show_ip_ospf_route_common(struct vty *vty, struct ospf *ospf,
/* Show AS External routes. */ /* Show AS External routes. */
show_ip_ospf_route_external(vty, ospf, ospf->old_external_route, show_ip_ospf_route_external(vty, ospf, ospf->old_external_route,
json_vrf); json_vrf, detail);
if (json) { if (json) {
if (use_vrf) { if (use_vrf) {
@ -11476,13 +11495,14 @@ static int show_ip_ospf_route_common(struct vty *vty, struct ospf *ospf,
DEFUN (show_ip_ospf_route, DEFUN (show_ip_ospf_route,
show_ip_ospf_route_cmd, show_ip_ospf_route_cmd,
"show ip ospf [vrf <NAME|all>] route [json]", "show ip ospf [vrf <NAME|all>] route [detail] [json]",
SHOW_STR SHOW_STR
IP_STR IP_STR
"OSPF information\n" "OSPF information\n"
VRF_CMD_HELP_STR VRF_CMD_HELP_STR
"All VRFs\n" "All VRFs\n"
"OSPF routing table\n" "OSPF routing table\n"
"Detailed information\n"
JSON_STR) JSON_STR)
{ {
struct ospf *ospf = NULL; struct ospf *ospf = NULL;
@ -11491,14 +11511,19 @@ DEFUN (show_ip_ospf_route,
bool all_vrf = false; bool all_vrf = false;
int ret = CMD_SUCCESS; int ret = CMD_SUCCESS;
int inst = 0; int inst = 0;
int idx = 0;
int idx_vrf = 0; int idx_vrf = 0;
uint8_t use_vrf = 0; uint8_t use_vrf = 0;
bool uj = use_json(argc, argv); bool uj = use_json(argc, argv);
bool detail = false;
json_object *json = NULL; json_object *json = NULL;
if (uj) if (uj)
json = json_object_new_object(); json = json_object_new_object();
if (argv_find(argv, argc, "detail", &idx))
detail = true;
OSPF_FIND_VRF_ARGS(argv, argc, idx_vrf, vrf_name, all_vrf); OSPF_FIND_VRF_ARGS(argv, argc, idx_vrf, vrf_name, all_vrf);
/* vrf input is provided could be all or specific vrf*/ /* vrf input is provided could be all or specific vrf*/
@ -11512,8 +11537,8 @@ DEFUN (show_ip_ospf_route,
if (!ospf->oi_running) if (!ospf->oi_running)
continue; continue;
ospf_output = true; ospf_output = true;
ret = show_ip_ospf_route_common(vty, ospf, json, ret = show_ip_ospf_route_common(
use_vrf); vty, ospf, json, use_vrf, detail);
} }
if (uj) { if (uj) {
@ -11550,7 +11575,8 @@ DEFUN (show_ip_ospf_route,
} }
if (ospf) { if (ospf) {
ret = show_ip_ospf_route_common(vty, ospf, json, use_vrf); ret = show_ip_ospf_route_common(vty, ospf, json, use_vrf,
detail);
/* Keep Non-pretty format */ /* Keep Non-pretty format */
if (uj) if (uj)
vty_out(vty, "%s\n", vty_out(vty, "%s\n",
@ -11566,16 +11592,22 @@ DEFUN (show_ip_ospf_route,
DEFUN (show_ip_ospf_instance_route, DEFUN (show_ip_ospf_instance_route,
show_ip_ospf_instance_route_cmd, show_ip_ospf_instance_route_cmd,
"show ip ospf (1-65535) route", "show ip ospf (1-65535) route [detail]",
SHOW_STR SHOW_STR
IP_STR IP_STR
"OSPF information\n" "OSPF information\n"
"Instance ID\n" "Instance ID\n"
"OSPF routing table\n") "OSPF routing table\n"
"Detailed information\n")
{ {
int idx_number = 3; int idx_number = 3;
int idx = 0;
struct ospf *ospf; struct ospf *ospf;
unsigned short instance = 0; unsigned short instance = 0;
bool detail = false;
if (argv_find(argv, argc, "detail", &idx))
detail = true;
instance = strtoul(argv[idx_number]->arg, NULL, 10); instance = strtoul(argv[idx_number]->arg, NULL, 10);
if (instance != ospf_instance) if (instance != ospf_instance)
@ -11585,7 +11617,7 @@ DEFUN (show_ip_ospf_instance_route,
if (!ospf || !ospf->oi_running) if (!ospf || !ospf->oi_running)
return CMD_SUCCESS; return CMD_SUCCESS;
return show_ip_ospf_route_common(vty, ospf, NULL, 0); return show_ip_ospf_route_common(vty, ospf, NULL, 0, detail);
} }