diff --git a/doc/user/ospfd.rst b/doc/user/ospfd.rst index 232b1c3934..4e30ef2aec 100644 --- a/doc/user/ospfd.rst +++ b/doc/user/ospfd.rst @@ -884,10 +884,11 @@ Showing Information 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 - calculation. + calculation. When detail option is used, it shows more information + to the CLI like advertising router ID for each route, etc. .. clicmd:: show ip ospf [vrf ] border-routers [json] @@ -898,7 +899,7 @@ Showing Information .. 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. .. _opaque-lsa: diff --git a/ospfd/ospf_route.c b/ospfd/ospf_route.c index cdb1eb0095..3ffa7c0bb1 100644 --- a/ospfd/ospf_route.c +++ b/ospfd/ospf_route.c @@ -48,6 +48,7 @@ struct ospf_route *ospf_route_new(void) new->paths = list_new(); new->paths->del = (void (*)(void *))ospf_path_free; + new->u.std.transit = false; return new; } @@ -500,6 +501,7 @@ void ospf_intra_add_transit(struct route_table *rt, struct vertex *v, or->cost = v->distance; or->type = OSPF_DESTINATION_NETWORK; or->u.std.origin = (struct lsa_header *)lsa; + or->u.std.transit = true; ospf_route_copy_nexthops_from_vertex(area, or, v); @@ -851,7 +853,7 @@ void ospf_route_copy_nexthops_from_vertex(struct ospf_area *area, || area->spf_dry_run) { path = ospf_path_new(); path->nexthop = nexthop->router; - path->adv_router = v->id; + path->adv_router = v->lsa->adv_router; if (oi) { path->ifindex = oi->ifp->ifindex; diff --git a/ospfd/ospf_route.h b/ospfd/ospf_route.h index 7639a0049e..44e80216d7 100644 --- a/ospfd/ospf_route.h +++ b/ospfd/ospf_route.h @@ -69,6 +69,8 @@ struct route_standard { /* */ uint8_t flags; /* From router-LSA */ + + bool transit; /* Transit network or not */ }; struct route_external { diff --git a/ospfd/ospf_vty.c b/ospfd/ospf_vty.c index 54fd60af23..a23802719b 100644 --- a/ospfd/ospf_vty.c +++ b/ospfd/ospf_vty.c @@ -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, struct route_table *rt, - json_object *json) + json_object *json, bool detail) { struct route_node *rn; struct ospf_route * or ; @@ -10792,15 +10792,17 @@ static void show_ip_ospf_route_network(struct vty *vty, struct ospf *ospf, if (json) { json_object_string_add(json_route, "routeType", "N"); + json_object_boolean_add(json_route, "transit", + or->u.std.transit); json_object_int_add(json_route, "cost", or->cost); json_object_string_addf(json_route, "area", "%pI4", &or->u.std.area_id); } else { - vty_out(vty, "N %-18s [%d] area: %pI4\n", - buf1, or->cost, - &or->u.std.area_id); + vty_out(vty, "N %s %-18s [%d] area: %pI4\n", + or->u.std.transit && detail ? "T" : " ", + buf1, or->cost, &or->u.std.area_id); } break; default: @@ -10857,6 +10859,11 @@ static void show_ip_ospf_route_network(struct vty *vty, struct ospf *ospf, ifindex2ifname( path->ifindex, ospf->vrf_id)); + json_object_string_addf( + json_nexthop, + "advertisedRouter", + "%pI4", + &path->adv_router); } else { vty_out(vty, "%24s via %pI4, %s\n", @@ -10866,6 +10873,11 @@ static void show_ip_ospf_route_network(struct vty *vty, struct ospf *ospf, path->ifindex, ospf->vrf_id)); } + if (detail && !json) + vty_out(vty, + "%24s adv %pI4\n", + "", + &path->adv_router); } } } @@ -11020,7 +11032,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, struct route_table *rt, - json_object *json) + json_object *json, bool detail) { struct route_node *rn; struct ospf_route *er; @@ -11124,6 +11136,11 @@ static void show_ip_ospf_route_external(struct vty *vty, struct ospf *ospf, ifindex2ifname( path->ifindex, ospf->vrf_id)); + json_object_string_addf( + json_nexthop, + "advertisedRouter", + "%pI4", + &path->adv_router); } else { vty_out(vty, "%24s via %pI4, %s\n", @@ -11133,6 +11150,10 @@ static void show_ip_ospf_route_external(struct vty *vty, struct ospf *ospf, path->ifindex, ospf->vrf_id)); } + if (detail && !json) + vty_out(vty, + "%24s adv %pI4\n", "", + &path->adv_router); } } } @@ -11419,7 +11440,8 @@ DEFUN (show_ip_ospf_instance_border_routers, } 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; @@ -11446,8 +11468,15 @@ static int show_ip_ospf_route_common(struct vty *vty, struct ospf *ospf, return CMD_SUCCESS; } + if (detail && json == NULL) { + vty_out(vty, "Codes: N - network T - transitive\n"); + vty_out(vty, " IA - inter-area E - external route\n"); + vty_out(vty, " D - destination R - router\n\n"); + } + /* 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_ip_ospf_route_router(vty, ospf, ospf->new_rtrs, json_vrf); @@ -11458,7 +11487,7 @@ static int show_ip_ospf_route_common(struct vty *vty, struct ospf *ospf, /* Show AS External routes. */ show_ip_ospf_route_external(vty, ospf, ospf->old_external_route, - json_vrf); + json_vrf, detail); if (json) { if (use_vrf) { @@ -11476,13 +11505,14 @@ static int show_ip_ospf_route_common(struct vty *vty, struct ospf *ospf, DEFUN (show_ip_ospf_route, show_ip_ospf_route_cmd, - "show ip ospf [vrf ] route [json]", + "show ip ospf [vrf ] route [detail] [json]", SHOW_STR IP_STR "OSPF information\n" VRF_CMD_HELP_STR "All VRFs\n" "OSPF routing table\n" + "Detailed information\n" JSON_STR) { struct ospf *ospf = NULL; @@ -11491,14 +11521,19 @@ DEFUN (show_ip_ospf_route, bool all_vrf = false; int ret = CMD_SUCCESS; int inst = 0; + int idx = 0; int idx_vrf = 0; uint8_t use_vrf = 0; bool uj = use_json(argc, argv); + bool detail = false; json_object *json = NULL; if (uj) 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); /* vrf input is provided could be all or specific vrf*/ @@ -11512,8 +11547,8 @@ DEFUN (show_ip_ospf_route, if (!ospf->oi_running) continue; ospf_output = true; - ret = show_ip_ospf_route_common(vty, ospf, json, - use_vrf); + ret = show_ip_ospf_route_common( + vty, ospf, json, use_vrf, detail); } if (uj) { @@ -11550,7 +11585,8 @@ DEFUN (show_ip_ospf_route, } 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 */ if (uj) vty_out(vty, "%s\n", @@ -11566,16 +11602,22 @@ DEFUN (show_ip_ospf_route, DEFUN (show_ip_ospf_instance_route, show_ip_ospf_instance_route_cmd, - "show ip ospf (1-65535) route", + "show ip ospf (1-65535) route [detail]", SHOW_STR IP_STR "OSPF information\n" "Instance ID\n" - "OSPF routing table\n") + "OSPF routing table\n" + "Detailed information\n") { int idx_number = 3; + int idx = 0; struct ospf *ospf; unsigned short instance = 0; + bool detail = false; + + if (argv_find(argv, argc, "detail", &idx)) + detail = true; instance = strtoul(argv[idx_number]->arg, NULL, 10); if (instance != ospf_instance) @@ -11585,7 +11627,7 @@ DEFUN (show_ip_ospf_instance_route, if (!ospf || !ospf->oi_running) return CMD_SUCCESS; - return show_ip_ospf_route_common(vty, ospf, NULL, 0); + return show_ip_ospf_route_common(vty, ospf, NULL, 0, detail); }