zebra: include backup nexthops for pseudowires

Include any installed backup nexthops when installing
pseudowires; include installed backups in vty and json
pw show output.

Signed-off-by: Mark Stapp <mjs@voltanet.io>
This commit is contained in:
Mark Stapp 2020-07-17 13:55:23 -04:00
parent 3c0e16228d
commit 8b117ff02b
2 changed files with 81 additions and 29 deletions

View File

@ -2116,6 +2116,12 @@ static int dplane_ctx_pw_init(struct zebra_dplane_ctx *ctx,
if (nhg && nhg->nexthop) if (nhg && nhg->nexthop)
copy_nexthops(&(ctx->u.pw.nhg.nexthop), copy_nexthops(&(ctx->u.pw.nhg.nexthop),
nhg->nexthop, NULL); nhg->nexthop, NULL);
/* Include any installed backup nexthops */
nhg = rib_get_fib_backup_nhg(re);
if (nhg && nhg->nexthop)
copy_nexthops(&(ctx->u.pw.nhg.nexthop),
nhg->nexthop, NULL);
} }
route_unlock_node(rn); route_unlock_node(rn);
} }

View File

@ -518,6 +518,7 @@ static void vty_show_mpls_pseudowire_detail(struct vty *vty)
struct zebra_pw *pw; struct zebra_pw *pw;
struct route_entry *re; struct route_entry *re;
struct nexthop *nexthop; struct nexthop *nexthop;
struct nexthop_group *nhg;
zvrf = vrf_info_lookup(VRF_DEFAULT); zvrf = vrf_info_lookup(VRF_DEFAULT);
if (!zvrf) if (!zvrf)
@ -545,22 +546,41 @@ static void vty_show_mpls_pseudowire_detail(struct vty *vty)
vty_out(vty, " VC-ID: %u\n", pw->data.ldp.pwid); vty_out(vty, " VC-ID: %u\n", pw->data.ldp.pwid);
vty_out(vty, " Status: %s \n", vty_out(vty, " Status: %s \n",
(zebra_pw_enabled(pw) && pw->status == PW_FORWARDING) (zebra_pw_enabled(pw) && pw->status == PW_FORWARDING)
? "Up" ? "Up"
: "Down"); : "Down");
re = rib_match(family2afi(pw->af), SAFI_UNICAST, pw->vrf_id, re = rib_match(family2afi(pw->af), SAFI_UNICAST, pw->vrf_id,
&pw->nexthop, NULL); &pw->nexthop, NULL);
if (re) { if (re == NULL)
for (ALL_NEXTHOPS_PTR(rib_get_fib_nhg(re), nexthop)) { continue;
snprintfrr(buf_nh, sizeof(buf_nh), "%pNHv",
nexthop); nhg = rib_get_fib_nhg(re);
vty_out(vty, " Next Hop: %s\n", buf_nh); for (ALL_NEXTHOPS_PTR(nhg, nexthop)) {
if (nexthop->nh_label) snprintfrr(buf_nh, sizeof(buf_nh), "%pNHv",
vty_out(vty, " Next Hop label: %u\n", nexthop);
nexthop->nh_label->label[0]); vty_out(vty, " Next Hop: %s\n", buf_nh);
else if (nexthop->nh_label)
vty_out(vty, " Next Hop label: %s\n", vty_out(vty, " Next Hop label: %u\n",
"-"); nexthop->nh_label->label[0]);
} else
vty_out(vty, " Next Hop label: %s\n",
"-");
}
/* Include any installed backups */
nhg = rib_get_fib_backup_nhg(re);
if (nhg == NULL)
continue;
for (ALL_NEXTHOPS_PTR(nhg, nexthop)) {
snprintfrr(buf_nh, sizeof(buf_nh), "%pNHv",
nexthop);
vty_out(vty, " Next Hop: %s\n", buf_nh);
if (nexthop->nh_label)
vty_out(vty, " Next Hop label: %u\n",
nexthop->nh_label->label[0]);
else
vty_out(vty, " Next Hop label: %s\n",
"-");
} }
} }
} }
@ -569,6 +589,7 @@ static void vty_show_mpls_pseudowire(struct zebra_pw *pw, json_object *json_pws)
{ {
struct route_entry *re; struct route_entry *re;
struct nexthop *nexthop; struct nexthop *nexthop;
struct nexthop_group *nhg;
char buf_nbr[INET6_ADDRSTRLEN]; char buf_nbr[INET6_ADDRSTRLEN];
char buf_nh[100]; char buf_nh[100];
json_object *json_pw = NULL; json_object *json_pw = NULL;
@ -603,23 +624,48 @@ static void vty_show_mpls_pseudowire(struct zebra_pw *pw, json_object *json_pws)
: "Down"); : "Down");
re = rib_match(family2afi(pw->af), SAFI_UNICAST, pw->vrf_id, re = rib_match(family2afi(pw->af), SAFI_UNICAST, pw->vrf_id,
&pw->nexthop, NULL); &pw->nexthop, NULL);
if (re) { if (re == NULL)
for (ALL_NEXTHOPS_PTR(rib_get_fib_nhg(re), nexthop)) { goto done;
json_nexthop = json_object_new_object();
snprintfrr(buf_nh, sizeof(buf_nh), "%pNHv", nexthop);
json_object_string_add(json_nexthop, "nexthop", buf_nh);
if (nexthop->nh_label)
json_object_int_add(
json_nexthop, "nhLabel",
nexthop->nh_label->label[0]);
else
json_object_string_add(json_nexthop, "nhLabel",
"-");
json_object_array_add(json_nexthops, json_nexthop); nhg = rib_get_fib_nhg(re);
} for (ALL_NEXTHOPS_PTR(nhg, nexthop)) {
json_object_object_add(json_pw, "nexthops", json_nexthops); json_nexthop = json_object_new_object();
snprintfrr(buf_nh, sizeof(buf_nh), "%pNHv", nexthop);
json_object_string_add(json_nexthop, "nexthop", buf_nh);
if (nexthop->nh_label)
json_object_int_add(
json_nexthop, "nhLabel",
nexthop->nh_label->label[0]);
else
json_object_string_add(json_nexthop, "nhLabel",
"-");
json_object_array_add(json_nexthops, json_nexthop);
} }
/* Include installed backup nexthops also */
nhg = rib_get_fib_backup_nhg(re);
if (nhg == NULL)
goto done;
for (ALL_NEXTHOPS_PTR(nhg, nexthop)) {
json_nexthop = json_object_new_object();
snprintfrr(buf_nh, sizeof(buf_nh), "%pNHv", nexthop);
json_object_string_add(json_nexthop, "nexthop", buf_nh);
if (nexthop->nh_label)
json_object_int_add(
json_nexthop, "nhLabel",
nexthop->nh_label->label[0]);
else
json_object_string_add(json_nexthop, "nhLabel",
"-");
json_object_array_add(json_nexthops, json_nexthop);
}
done:
json_object_object_add(json_pw, "nexthops", json_nexthops);
json_object_array_add(json_pws, json_pw); json_object_array_add(json_pws, json_pw);
} }