mirror of
https://github.com/vyos/vyos-build.git
synced 2025-10-01 20:28:40 +02:00
frr: T5123: Add patch to support show detailed ospf route table
This commit is contained in:
parent
c3f11ba39c
commit
e1188a1f93
@ -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
|
||||||
|
|
||||||
@ -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
|
||||||
|
|
||||||
@ -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
|
||||||
|
|
||||||
Loading…
x
Reference in New Issue
Block a user