diff options
author | Zhiyuan Wan <h@iloli.bid> | 2023-03-30 16:20:27 +0800 |
---|---|---|
committer | Zhiyuan Wan <h@iloli.bid> | 2023-04-10 16:29:23 +0800 |
commit | e1188a1f938fd6fa34012a4859f443776d3f89c4 (patch) | |
tree | e92dd223ebc8cd28ff918c6fadf4eb4b062925f4 /packages/frr | |
parent | c3f11ba39c50a3bd1c69e61c38f1c82960a15ee7 (diff) | |
download | vyos-build-e1188a1f938fd6fa34012a4859f443776d3f89c4.tar.gz vyos-build-e1188a1f938fd6fa34012a4859f443776d3f89c4.zip |
frr: T5123: Add patch to support show detailed ospf route table
Diffstat (limited to 'packages/frr')
3 files changed, 365 insertions, 0 deletions
diff --git a/packages/frr/patches/0001-ospfd-Support-show-advertise-router-in-show-ip-ospf-.patch b/packages/frr/patches/0001-ospfd-Support-show-advertise-router-in-show-ip-ospf-.patch new file mode 100644 index 00000000..d759c8e6 --- /dev/null +++ b/packages/frr/patches/0001-ospfd-Support-show-advertise-router-in-show-ip-ospf-.patch @@ -0,0 +1,232 @@ +From fa263896c413f0a31425743a38d426dc3cfd659f Mon Sep 17 00:00:00 2001 +From: Zhiyuan Wan <h@iloli.bid> +Date: Wed, 29 Mar 2023 23:05:20 +0800 +Subject: [PATCH 1/3] 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> +--- + doc/user/ospfd.rst | 7 +++--- + ospfd/ospf_vty.c | 56 ++++++++++++++++++++++++++++++++++++---------- + 2 files changed, 48 insertions(+), 15 deletions(-) + +diff --git a/doc/user/ospfd.rst b/doc/user/ospfd.rst +index 30d55f34a..69db359bd 100644 +--- a/doc/user/ospfd.rst ++++ b/doc/user/ospfd.rst +@@ -824,10 +824,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. If detail is specified, each routing item's ++ advertiser will be show up. + + .. clicmd:: show ip ospf [vrf <NAME|all>] border-routers [json] + +@@ -838,7 +839,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_vty.c b/ospfd/ospf_vty.c +index 8c0afd852..3de36d49c 100644 +--- a/ospfd/ospf_vty.c ++++ b/ospfd/ospf_vty.c +@@ -10401,7 +10401,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 ; +@@ -10526,6 +10526,10 @@ 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, ++ "adv", "%pI4", ++ &path->adv_router); + } else { + vty_out(vty, + "%24s via %pI4, %s\n", +@@ -10535,6 +10539,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); + } + } + } +@@ -10689,7 +10698,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; +@@ -10793,6 +10802,10 @@ 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, "adv", ++ "%pI4", ++ &path->adv_router); + } else { + vty_out(vty, + "%24s via %pI4, %s\n", +@@ -10802,6 +10815,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); + } + } + } +@@ -11088,7 +11105,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; + +@@ -11116,7 +11134,8 @@ static int show_ip_ospf_route_common(struct vty *vty, struct ospf *ospf, + } + + /* 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); +@@ -11127,7 +11146,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) { +@@ -11145,13 +11164,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 <NAME|all>] route [json]", ++ "show ip ospf [vrf <NAME|all>] 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; +@@ -11160,14 +11180,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*/ +@@ -11181,8 +11206,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) { +@@ -11219,7 +11244,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", +@@ -11235,16 +11261,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) +@@ -11254,7 +11286,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); + } + + +-- +2.30.2 + diff --git a/packages/frr/patches/0002-ospfd-Fix-wrong-advertise-router-calculation-in-tran.patch b/packages/frr/patches/0002-ospfd-Fix-wrong-advertise-router-calculation-in-tran.patch new file mode 100644 index 00000000..941bbb94 --- /dev/null +++ b/packages/frr/patches/0002-ospfd-Fix-wrong-advertise-router-calculation-in-tran.patch @@ -0,0 +1,30 @@ +From 2c6087bec2e4e9360f6c9e1b3df88021f839f35e Mon Sep 17 00:00:00 2001 +From: Zhiyuan Wan <h@iloli.bid> +Date: Mon, 3 Apr 2023 14:35:14 +0800 +Subject: [PATCH 2/3] ospfd: Fix wrong advertise router calculation in transit + network + +The ospfd mistakenly copy advertise router from vertex->id, which may +not be correct in an OSPF transit network. + +Signed-off-by: Zhiyuan Wan <h@iloli.bid> +--- + ospfd/ospf_route.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/ospfd/ospf_route.c b/ospfd/ospf_route.c +index 5f18bff1c..744d47dc2 100644 +--- a/ospfd/ospf_route.c ++++ b/ospfd/ospf_route.c +@@ -849,7 +849,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; +-- +2.30.2 + diff --git a/packages/frr/patches/0003-ospfd-Support-show-intra-area-network-type-in-show-i.patch b/packages/frr/patches/0003-ospfd-Support-show-intra-area-network-type-in-show-i.patch new file mode 100644 index 00000000..3724f4b3 --- /dev/null +++ b/packages/frr/patches/0003-ospfd-Support-show-intra-area-network-type-in-show-i.patch @@ -0,0 +1,103 @@ +From bfb64fc1ba595e6f45df776d61f302ca080928ca Mon Sep 17 00:00:00 2001 +From: Zhiyuan Wan <h@iloli.bid> +Date: Mon, 3 Apr 2023 16:21:15 +0800 +Subject: [PATCH 3/3] ospfd: Support show intra-area network type in 'show ip + ospf route' command + +User can now use 'show ip ospf route detail' command to distinguish +intra-area stub network and transit network. +Transit network will be displayed as 'N T prefix ...'. + +NOTICE: Json output format has been changed, intra-area stub networks +still has 'N' routeType, transit networks has 'N T' routeType. And +'adv' (means advertise router) change to 'advertisedRouter'. + +Signed-off-by: Zhiyuan Wan <h@iloli.bid> +--- + ospfd/ospf_route.c | 2 ++ + ospfd/ospf_route.h | 2 ++ + ospfd/ospf_vty.c | 15 +++++++++------ + 3 files changed, 13 insertions(+), 6 deletions(-) + +diff --git a/ospfd/ospf_route.c b/ospfd/ospf_route.c +index 744d47dc2..073daca78 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); + +diff --git a/ospfd/ospf_route.h b/ospfd/ospf_route.h +index 2582067ae..d90e26222 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; + }; + + struct route_external { +diff --git a/ospfd/ospf_vty.c b/ospfd/ospf_vty.c +index 3de36d49c..92dfef763 100644 +--- a/ospfd/ospf_vty.c ++++ b/ospfd/ospf_vty.c +@@ -10460,16 +10460,17 @@ static void show_ip_ospf_route_network(struct vty *vty, struct ospf *ospf, + case OSPF_PATH_INTRA_AREA: + if (json) { + json_object_string_add(json_route, "routeType", +- "N"); ++ or->u.std.transit ? "N T" ++ : "N"); + 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: +@@ -10528,7 +10529,8 @@ static void show_ip_ospf_route_network(struct vty *vty, struct ospf *ospf, + ospf->vrf_id)); + json_object_string_addf( + json_nexthop, +- "adv", "%pI4", ++ "advertisedRouter", ++ "%pI4", + &path->adv_router); + } else { + vty_out(vty, +@@ -10803,7 +10805,8 @@ static void show_ip_ospf_route_external(struct vty *vty, struct ospf *ospf, + path->ifindex, + ospf->vrf_id)); + json_object_string_addf( +- json_nexthop, "adv", ++ json_nexthop, ++ "advertisedRouter", + "%pI4", + &path->adv_router); + } else { +-- +2.30.2 + |