Skip to content

Commit

Permalink
bgpd: Fix display when using missing-as-worst
Browse files Browse the repository at this point in the history
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: FRRouting#15718
Signed-off-by: Donald Sharp <[email protected]>
  • Loading branch information
donaldsharp committed Apr 15, 2024
1 parent 572b6f3 commit bc9885b
Show file tree
Hide file tree
Showing 5 changed files with 65 additions and 38 deletions.
75 changes: 48 additions & 27 deletions bgpd/bgp_route.c
Original file line number Diff line number Diff line change
Expand Up @@ -553,6 +553,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)
Expand Down Expand Up @@ -9407,14 +9416,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
Expand Down Expand Up @@ -9535,7 +9546,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)
{
Expand Down Expand Up @@ -9594,10 +9605,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",
Expand Down Expand Up @@ -9637,13 +9649,15 @@ void route_vty_out_tmp(struct vty *vty, struct bgp_dest *dest,
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, " ");
Expand Down Expand Up @@ -10640,11 +10654,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)) {
Expand Down Expand Up @@ -14288,7 +14304,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);
Expand Down Expand Up @@ -14351,11 +14367,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)++;
Expand Down Expand Up @@ -14393,9 +14413,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)++;
}
}
Expand Down
8 changes: 4 additions & 4 deletions bgpd/bgp_route.h
Original file line number Diff line number Diff line change
Expand Up @@ -845,10 +845,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);
Expand Down
13 changes: 7 additions & 6 deletions bgpd/bgp_updgrp_adv.c
Original file line number Diff line number Diff line change
Expand Up @@ -328,15 +328,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++;
}
}
Expand Down
2 changes: 1 addition & 1 deletion bgpd/bgp_vpn.c
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,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++;
Expand Down
5 changes: 5 additions & 0 deletions doc/user/bgp.rst
Original file line number Diff line number Diff line change
Expand Up @@ -425,6 +425,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
Expand Down

0 comments on commit bc9885b

Please sign in to comment.