]> git.puffer.fish Git - matthieu/frr.git/commitdiff
zebra: include backup nexthops for pseudowires
authorMark Stapp <mjs@voltanet.io>
Fri, 17 Jul 2020 17:55:23 +0000 (13:55 -0400)
committerMark Stapp <mjs@voltanet.io>
Mon, 20 Jul 2020 19:09:04 +0000 (15:09 -0400)
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>
zebra/zebra_dplane.c
zebra/zebra_pw.c

index aabfcc84222b79f66a404e8b633032732dcc2d7f..28b3a99d52205fd4e92a2d6daf440655bedb2cd9 100644 (file)
@@ -2116,6 +2116,12 @@ static int dplane_ctx_pw_init(struct zebra_dplane_ctx *ctx,
                                if (nhg && nhg->nexthop)
                                        copy_nexthops(&(ctx->u.pw.nhg.nexthop),
                                                      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);
                }
index 2328ab650af74e162947e48275db4a1cb6345e5d..84162374fd6738282732436209ab98fb7e23f620 100644 (file)
@@ -518,6 +518,7 @@ static void vty_show_mpls_pseudowire_detail(struct vty *vty)
        struct zebra_pw *pw;
        struct route_entry *re;
        struct nexthop *nexthop;
+       struct nexthop_group *nhg;
 
        zvrf = vrf_info_lookup(VRF_DEFAULT);
        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, "  Status: %s \n",
                        (zebra_pw_enabled(pw) && pw->status == PW_FORWARDING)
-                               ? "Up"
-                               : "Down");
+                       ? "Up"
+                       : "Down");
                re = rib_match(family2afi(pw->af), SAFI_UNICAST, pw->vrf_id,
                               &pw->nexthop, NULL);
-               if (re) {
-                       for (ALL_NEXTHOPS_PTR(rib_get_fib_nhg(re), 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",
-                                               "-");
-                       }
+               if (re == NULL)
+                       continue;
+
+               nhg = rib_get_fib_nhg(re);
+               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",
+                                       "-");
+               }
+
+               /* 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 nexthop *nexthop;
+       struct nexthop_group *nhg;
        char buf_nbr[INET6_ADDRSTRLEN];
        char buf_nh[100];
        json_object *json_pw = NULL;
@@ -603,23 +624,48 @@ static void vty_show_mpls_pseudowire(struct zebra_pw *pw, json_object *json_pws)
                                                                      : "Down");
        re = rib_match(family2afi(pw->af), SAFI_UNICAST, pw->vrf_id,
                       &pw->nexthop, NULL);
-       if (re) {
-               for (ALL_NEXTHOPS_PTR(rib_get_fib_nhg(re), 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",
-                                                      "-");
+       if (re == NULL)
+               goto done;
+
+       nhg = rib_get_fib_nhg(re);
+       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);
-               }
-               json_object_object_add(json_pw, "nexthops", json_nexthops);
+               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);
 }