bgpd: Set MED using a helper bgp_attr_set_med()

Signed-off-by: Donatas Abraitis <donatas@opensourcerouting.org>
This commit is contained in:
Donatas Abraitis 2024-10-08 17:15:00 +03:00
parent ecb7b78d30
commit 5a05dbeb13
7 changed files with 30 additions and 31 deletions

View file

@ -1177,8 +1177,7 @@ struct attr *bgp_attr_aggregate_intern(
SET_FLAG(attr.flag, ATTR_FLAG_BIT(BGP_ATTR_ORIGIN)); SET_FLAG(attr.flag, ATTR_FLAG_BIT(BGP_ATTR_ORIGIN));
/* MED */ /* MED */
attr.med = 0; bgp_attr_set_med(&attr, 0);
SET_FLAG(attr.flag, ATTR_FLAG_BIT(BGP_ATTR_MULTI_EXIT_DISC));
/* AS path attribute. */ /* AS path attribute. */
if (aspath) if (aspath)
@ -1933,9 +1932,7 @@ static enum bgp_attr_parse_ret bgp_attr_med(struct bgp_attr_parser_args *args)
args->total); args->total);
} }
attr->med = stream_getl(peer->curr); bgp_attr_set_med(attr, stream_getl(peer->curr));
SET_FLAG(attr->flag, ATTR_FLAG_BIT(BGP_ATTR_MULTI_EXIT_DISC));
return BGP_ATTR_PARSE_PROCEED; return BGP_ATTR_PARSE_PROCEED;
} }

View file

@ -608,6 +608,12 @@ static inline uint64_t bgp_aigp_metric_total(struct bgp_path_info *bpi)
return aigp; return aigp;
} }
static inline void bgp_attr_set_med(struct attr *attr, uint32_t med)
{
attr->med = med;
SET_FLAG(attr->flag, ATTR_FLAG_BIT(BGP_ATTR_MULTI_EXIT_DISC));
}
static inline struct cluster_list *bgp_attr_get_cluster(const struct attr *attr) static inline struct cluster_list *bgp_attr_get_cluster(const struct attr *attr)
{ {
return attr->cluster1; return attr->cluster1;

View file

@ -6747,8 +6747,8 @@ void bgp_static_update(struct bgp *bgp, const struct prefix *p,
bgp_attr_default_set(&attr, bgp, BGP_ORIGIN_IGP); bgp_attr_default_set(&attr, bgp, BGP_ORIGIN_IGP);
attr.nexthop = bgp_static->igpnexthop; attr.nexthop = bgp_static->igpnexthop;
attr.med = bgp_static->igpmetric;
attr.flag |= ATTR_FLAG_BIT(BGP_ATTR_MULTI_EXIT_DISC); bgp_attr_set_med(&attr, bgp_static->igpmetric);
if (afi == AFI_IP) if (afi == AFI_IP)
attr.mp_nexthop_len = BGP_ATTR_NHLEN_IPV4; attr.mp_nexthop_len = BGP_ATTR_NHLEN_IPV4;
@ -9015,9 +9015,8 @@ void bgp_redistribute_add(struct bgp *bgp, struct prefix *p,
else else
UNSET_FLAG(attr.nh_flags, BGP_ATTR_NH_IF_OPERSTATE); UNSET_FLAG(attr.nh_flags, BGP_ATTR_NH_IF_OPERSTATE);
attr.med = metric; bgp_attr_set_med(&attr, metric);
attr.distance = distance; attr.distance = distance;
attr.flag |= ATTR_FLAG_BIT(BGP_ATTR_MULTI_EXIT_DISC);
attr.tag = tag; attr.tag = tag;
if (metric) if (metric)

View file

@ -2222,8 +2222,7 @@ route_set_metric(void *rule, const struct prefix *prefix, void *object)
if (path->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_MULTI_EXIT_DISC)) if (path->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_MULTI_EXIT_DISC))
med = path->attr->med; med = path->attr->med;
path->attr->med = route_value_adjust(rv, med, path->peer); bgp_attr_set_med(path->attr, route_value_adjust(rv, med, path->peer));
path->attr->flag |= ATTR_FLAG_BIT(BGP_ATTR_MULTI_EXIT_DISC);
return RMAP_OKAY; return RMAP_OKAY;
} }

View file

@ -906,8 +906,8 @@ void subgroup_default_originate(struct update_subgroup *subgrp, bool withdraw)
assert(attr.aspath); assert(attr.aspath);
aspath = attr.aspath; aspath = attr.aspath;
attr.med = 0;
attr.flag |= ATTR_FLAG_BIT(BGP_ATTR_MULTI_EXIT_DISC); bgp_attr_set_med(&attr, 0);
if ((afi == AFI_IP6) || peer_cap_enhe(peer, afi, safi)) { if ((afi == AFI_IP6) || peer_cap_enhe(peer, afi, safi)) {
/* IPv6 global nexthop must be included. */ /* IPv6 global nexthop must be included. */

View file

@ -667,10 +667,8 @@ void add_vnc_route(struct rfapi_descriptor *rfd, /* cookie, VPN UN addr, peer */
attr.flag |= ATTR_FLAG_BIT(BGP_ATTR_LOCAL_PREF); attr.flag |= ATTR_FLAG_BIT(BGP_ATTR_LOCAL_PREF);
} }
if (med) { if (med)
attr.med = *med; bgp_attr_set_med(&attr, *med);
attr.flag |= ATTR_FLAG_BIT(BGP_ATTR_MULTI_EXIT_DISC);
}
/* override default weight assigned by bgp_attr_default_set() */ /* override default weight assigned by bgp_attr_default_set() */
attr.weight = rfd->peer ? rfd->peer->weight[afi][safi] : 0; attr.weight = rfd->peer ? rfd->peer->weight[afi][safi] : 0;
@ -863,10 +861,8 @@ void add_vnc_route(struct rfapi_descriptor *rfd, /* cookie, VPN UN addr, peer */
red = bgp_redist_lookup(bgp, afi, type, 0); red = bgp_redist_lookup(bgp, afi, type, 0);
if (red && red->redist_metric_flag) { if (red && red->redist_metric_flag)
attr.med = red->redist_metric; bgp_attr_set_med(&attr, red->redist_metric);
attr.flag |= ATTR_FLAG_BIT(BGP_ATTR_MULTI_EXIT_DISC);
}
bn = bgp_afi_node_get(bgp->rib[afi][safi], afi, safi, p, prd); bn = bgp_afi_node_get(bgp->rib[afi][safi], afi, safi, p, prd);

View file

@ -96,15 +96,16 @@ static void encap_attr_export_ce(struct attr *new, struct attr *orig,
* neighbor NEIGHBOR attribute-unchanged med * neighbor NEIGHBOR attribute-unchanged med
*/ */
if (!CHECK_FLAG(new->flag, BGP_ATTR_MULTI_EXIT_DISC)) { if (!CHECK_FLAG(new->flag, BGP_ATTR_MULTI_EXIT_DISC)) {
uint32_t med = 255;
if (CHECK_FLAG(new->flag, BGP_ATTR_LOCAL_PREF)) { if (CHECK_FLAG(new->flag, BGP_ATTR_LOCAL_PREF)) {
if (new->local_pref > 255) if (new->local_pref > 255)
new->med = 0; med = 0;
else else
new->med = 255 - new->local_pref; med = 255 - new->local_pref;
} else {
new->med = 255; /* shouldn't happen */
} }
new->flag |= ATTR_FLAG_BIT(BGP_ATTR_MULTI_EXIT_DISC);
bgp_attr_set_med(new, med);
} }
/* /*
@ -642,15 +643,16 @@ encap_attr_export(struct attr *new, struct attr *orig,
* neighbor NEIGHBOR attribute-unchanged med * neighbor NEIGHBOR attribute-unchanged med
*/ */
if (!CHECK_FLAG(new->flag, BGP_ATTR_MULTI_EXIT_DISC)) { if (!CHECK_FLAG(new->flag, BGP_ATTR_MULTI_EXIT_DISC)) {
uint32_t med = 255;
if (CHECK_FLAG(new->flag, BGP_ATTR_LOCAL_PREF)) { if (CHECK_FLAG(new->flag, BGP_ATTR_LOCAL_PREF)) {
if (new->local_pref > 255) if (new->local_pref > 255)
new->med = 0; med = 0;
else else
new->med = 255 - new->local_pref; med = 255 - new->local_pref;
} else {
new->med = 255; /* shouldn't happen */
} }
new->flag |= ATTR_FLAG_BIT(BGP_ATTR_MULTI_EXIT_DISC);
bgp_attr_set_med(new, med);
} }
/* /*