]> git.puffer.fish Git - matthieu/frr.git/commitdiff
bgpd: Fix display when using `missing-as-worst`
authorDonald Sharp <sharpd@nvidia.com>
Thu, 11 Apr 2024 14:46:46 +0000 (10:46 -0400)
committerMergify <37929162+mergify[bot]@users.noreply.github.com>
Tue, 16 Apr 2024 14:15:33 +0000 (14:15 +0000)
The usage of the `bgp bestpath med missing-as-worst` command
was being accepted and applied during bestpath, but during output
of the routes affected by this it would not give any indication
that this was happening or what med value was being used.

Fixes: #15718
Signed-off-by: Donald Sharp <sharpd@nvidia.com>
(cherry picked from commit bc9885b22e79ac14fd931517582d0d6d80f68c85)

bgpd/bgp_route.c
bgpd/bgp_route.h
bgpd/bgp_updgrp_adv.c
bgpd/bgp_vpn.c
doc/user/bgp.rst

index 378b941e7faf7ff707a14d59bb795817a4ac58b9..3c4367cdac5eccde85462548c15cdbc589a800da 100644 (file)
@@ -503,6 +503,15 @@ void bgp_path_info_unset_flag(struct bgp_dest *dest, struct bgp_path_info *pi,
        bgp_pcount_adjust(dest, pi);
 }
 
+static bool use_bgp_med_value(struct attr *attr, struct bgp *bgp)
+{
+       if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_MULTI_EXIT_DISC) ||
+           CHECK_FLAG(bgp->flags, BGP_FLAG_MED_MISSING_AS_WORST))
+               return true;
+
+       return false;
+}
+
 /* Get MED value.  If MED value is missing and "bgp bestpath
    missing-as-worst" is specified, treat it as the worst value. */
 static uint32_t bgp_med_value(struct attr *attr, struct bgp *bgp)
@@ -9483,14 +9492,16 @@ void route_vty_out(struct vty *vty, const struct prefix *p,
        }
 
        /* MED/Metric */
-       if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_MULTI_EXIT_DISC))
+       if (use_bgp_med_value(attr, path->peer->bgp)) {
+               uint32_t value = bgp_med_value(attr, path->peer->bgp);
+
                if (json_paths)
-                       json_object_int_add(json_path, "metric", attr->med);
+                       json_object_int_add(json_path, "metric", value);
                else if (wide)
-                       vty_out(vty, "%7u", attr->med);
+                       vty_out(vty, "%7u", value);
                else
-                       vty_out(vty, "%10u", attr->med);
-       else if (!json_paths) {
+                       vty_out(vty, "%10u", value);
+       else if (!json_paths) {
                if (wide)
                        vty_out(vty, "%*s", 7, " ");
                else
@@ -9611,7 +9622,7 @@ void route_vty_out(struct vty *vty, const struct prefix *p,
 }
 
 /* called from terminal list command */
-void route_vty_out_tmp(struct vty *vty, struct bgp_dest *dest,
+void route_vty_out_tmp(struct vty *vty, struct bgp *bgp, struct bgp_dest *dest,
                       const struct prefix *p, struct attr *attr, safi_t safi,
                       bool use_json, json_object *json_ar, bool wide)
 {
@@ -9672,10 +9683,11 @@ void route_vty_out_tmp(struct vty *vty, struct bgp_dest *dest,
                                        &attr->mp_nexthop_global_in);
                        }
 
-                       if (attr->flag
-                           & ATTR_FLAG_BIT(BGP_ATTR_MULTI_EXIT_DISC))
-                               json_object_int_add(json_net, "metric",
-                                                   attr->med);
+                       if (use_bgp_med_value(attr, bgp)) {
+                               uint32_t value = bgp_med_value(attr, bgp);
+
+                               json_object_int_add(json_net, "metric", value);
+                       }
 
                        if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_LOCAL_PREF))
                                json_object_int_add(json_net, "locPrf",
@@ -9720,13 +9732,15 @@ CPP_NOTICE("Drop `bgpOriginCodes` from JSON outputs")
                                else
                                        vty_out(vty, "%*s", len, " ");
                        }
-                       if (attr->flag
-                           & ATTR_FLAG_BIT(BGP_ATTR_MULTI_EXIT_DISC))
+
+                       if (use_bgp_med_value(attr, bgp)) {
+                               uint32_t value = bgp_med_value(attr, bgp);
+
                                if (wide)
-                                       vty_out(vty, "%7u", attr->med);
+                                       vty_out(vty, "%7u", value);
                                else
-                                       vty_out(vty, "%10u", attr->med);
-                       else if (wide)
+                                       vty_out(vty, "%10u", value);
+                       else if (wide)
                                vty_out(vty, "       ");
                        else
                                vty_out(vty, "          ");
@@ -10727,11 +10741,13 @@ void route_vty_out_detail(struct vty *vty, struct bgp *bgp, struct bgp_dest *bn,
                vty_out(vty, "      Origin %s",
                        bgp_origin_long_str[attr->origin]);
 
-       if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_MULTI_EXIT_DISC)) {
+       if (use_bgp_med_value(attr, bgp)) {
+               uint32_t value = bgp_med_value(attr, bgp);
+
                if (json_paths)
-                       json_object_int_add(json_path, "metric", attr->med);
+                       json_object_int_add(json_path, "metric", value);
                else
-                       vty_out(vty, ", metric %u", attr->med);
+                       vty_out(vty, ", metric %u", value);
        }
 
        if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_LOCAL_PREF)) {
@@ -14374,7 +14390,7 @@ show_adj_route(struct vty *vty, struct peer *peer, struct bgp_table *table,
                                                        json_ar, json_net,
                                                        "%pFX", rn_p);
                                } else
-                                       route_vty_out_tmp(vty, dest, rn_p,
+                                       route_vty_out_tmp(vty, bgp, dest, rn_p,
                                                          &attr, safi, use_json,
                                                          json_ar, wide);
                                bgp_attr_flush(&attr);
@@ -14437,11 +14453,15 @@ show_adj_route(struct vty *vty, struct peer *peer, struct bgp_table *table,
                                                                        "%pFX",
                                                                        rn_p);
                                                } else
-                                                       route_vty_out_tmp(
-                                                               vty, dest, rn_p,
-                                                               &attr, safi,
-                                                               use_json,
-                                                               json_ar, wide);
+                                                       route_vty_out_tmp(vty,
+                                                                         bgp,
+                                                                         dest,
+                                                                         rn_p,
+                                                                         &attr,
+                                                                         safi,
+                                                                         use_json,
+                                                                         json_ar,
+                                                                         wide);
                                                (*output_count)++;
                                        } else {
                                                (*filtered_count)++;
@@ -14480,9 +14500,10 @@ show_adj_route(struct vty *vty, struct peer *peer, struct bgp_table *table,
                                                        json_ar, json_net,
                                                        "%pFX", rn_p);
                                } else
-                                       route_vty_out_tmp(
-                                               vty, dest, rn_p, pi->attr, safi,
-                                               use_json, json_ar, wide);
+                                       route_vty_out_tmp(vty, bgp, dest, rn_p,
+                                                         pi->attr, safi,
+                                                         use_json, json_ar,
+                                                         wide);
                                (*output_count)++;
                        }
                }
index b429578b0d8662056f0d682cdc507a4499dab5ee..0de3d1e88cb3fa525c0f62e73ba4c27be381b2fd 100644 (file)
@@ -801,10 +801,10 @@ extern void route_vty_out(struct vty *vty, const struct prefix *p,
 extern void route_vty_out_tag(struct vty *vty, const struct prefix *p,
                              struct bgp_path_info *path, int display,
                              safi_t safi, json_object *json);
-extern void route_vty_out_tmp(struct vty *vty, struct bgp_dest *dest,
-                             const struct prefix *p, struct attr *attr,
-                             safi_t safi, bool use_json, json_object *json_ar,
-                             bool wide);
+extern void route_vty_out_tmp(struct vty *vty, struct bgp *bgp,
+                             struct bgp_dest *dest, const struct prefix *p,
+                             struct attr *attr, safi_t safi, bool use_json,
+                             json_object *json_ar, bool wide);
 extern void route_vty_out_overlay(struct vty *vty, const struct prefix *p,
                                  struct bgp_path_info *path, int display,
                                  json_object *json);
index 89469ffee3d871412761f29f2772cb0f2a26fa3c..d37433a38ced30d452f35a4ee1df6673beddf772 100644 (file)
@@ -257,15 +257,16 @@ static void subgrp_show_adjq_vty(struct update_subgroup *subgrp,
                        }
                        if ((flags & UPDWALK_FLAGS_ADVQUEUE) && adj->adv &&
                            adj->adv->baa) {
-                               route_vty_out_tmp(
-                                       vty, dest, dest_p, adj->adv->baa->attr,
-                                       SUBGRP_SAFI(subgrp), 0, NULL, false);
+                               route_vty_out_tmp(vty, bgp, dest, dest_p,
+                                                 adj->adv->baa->attr,
+                                                 SUBGRP_SAFI(subgrp), 0, NULL,
+                                                 false);
                                output_count++;
                        }
                        if ((flags & UPDWALK_FLAGS_ADVERTISED) && adj->attr) {
-                               route_vty_out_tmp(vty, dest, dest_p, adj->attr,
-                                                 SUBGRP_SAFI(subgrp), 0, NULL,
-                                                 false);
+                               route_vty_out_tmp(vty, bgp, dest, dest_p,
+                                                 adj->attr, SUBGRP_SAFI(subgrp),
+                                                 0, NULL, false);
                                output_count++;
                        }
                }
index 0ed1d04d83eab4f0f9ece783c838e11d1f8f3673..20a3b5b63950c618e9e01b1d8d1345b750ac0938 100644 (file)
@@ -212,7 +212,7 @@ int show_adj_route_vpn(struct vty *vty, struct peer *peer,
                                }
                                rd_header = 0;
                        }
-                       route_vty_out_tmp(vty, rm, bgp_dest_get_prefix(rm),
+                       route_vty_out_tmp(vty, bgp, rm, bgp_dest_get_prefix(rm),
                                          attr, safi, use_json, json_routes,
                                          false);
                        output_count++;
index 8512907b3a6cc5a8d6082461531d57da1c141936..2a3a8c5fe509db846516c4b577dd6ed22ae4273c 100644 (file)
@@ -419,6 +419,11 @@ Route Selection
 
    Disabled by default.
 
+.. clicmd:: bgp bestpath med missing-as-worst
+
+   If the paths MED value is missing and this command is configured
+   then treat it as the worse possible value that it can be.
+
 .. clicmd:: maximum-paths (1-128)
 
    Sets the maximum-paths value used for ecmp calculations for this