From e1188a1f938fd6fa34012a4859f443776d3f89c4 Mon Sep 17 00:00:00 2001
From: Zhiyuan Wan <h@iloli.bid>
Date: Thu, 30 Mar 2023 16:20:27 +0800
Subject: frr: T5123: Add patch to support show detailed ospf route table

---
 ...rt-show-advertise-router-in-show-ip-ospf-.patch | 232 +++++++++++++++++++++
 ...rong-advertise-router-calculation-in-tran.patch |  30 +++
 ...rt-show-intra-area-network-type-in-show-i.patch | 103 +++++++++
 3 files changed, 365 insertions(+)
 create mode 100644 packages/frr/patches/0001-ospfd-Support-show-advertise-router-in-show-ip-ospf-.patch
 create mode 100644 packages/frr/patches/0002-ospfd-Fix-wrong-advertise-router-calculation-in-tran.patch
 create mode 100644 packages/frr/patches/0003-ospfd-Support-show-intra-area-network-type-in-show-i.patch

(limited to 'packages/frr/patches')

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
+
-- 
cgit v1.2.3