SET_FLAG(attr.flag, ATTR_FLAG_BIT(BGP_ATTR_ORIGIN));
/* MED */
- attr.med = 0;
- SET_FLAG(attr.flag, ATTR_FLAG_BIT(BGP_ATTR_MULTI_EXIT_DISC));
+ bgp_attr_set_med(&attr, 0);
/* AS path attribute. */
if (aspath)
args->total);
}
- attr->med = stream_getl(peer->curr);
-
- SET_FLAG(attr->flag, ATTR_FLAG_BIT(BGP_ATTR_MULTI_EXIT_DISC));
+ bgp_attr_set_med(attr, stream_getl(peer->curr));
return BGP_ATTR_PARSE_PROCEED;
}
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)
{
return attr->cluster1;
bgp_attr_default_set(&attr, bgp, BGP_ORIGIN_IGP);
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)
attr.mp_nexthop_len = BGP_ATTR_NHLEN_IPV4;
else
UNSET_FLAG(attr.nh_flags, BGP_ATTR_NH_IF_OPERSTATE);
- attr.med = metric;
+ bgp_attr_set_med(&attr, metric);
attr.distance = distance;
- attr.flag |= ATTR_FLAG_BIT(BGP_ATTR_MULTI_EXIT_DISC);
attr.tag = tag;
if (metric)
if (path->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_MULTI_EXIT_DISC))
med = path->attr->med;
- path->attr->med = route_value_adjust(rv, med, path->peer);
- path->attr->flag |= ATTR_FLAG_BIT(BGP_ATTR_MULTI_EXIT_DISC);
+ bgp_attr_set_med(path->attr, route_value_adjust(rv, med, path->peer));
return RMAP_OKAY;
}
assert(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)) {
/* IPv6 global nexthop must be included. */
attr.flag |= ATTR_FLAG_BIT(BGP_ATTR_LOCAL_PREF);
}
- if (med) {
- attr.med = *med;
- attr.flag |= ATTR_FLAG_BIT(BGP_ATTR_MULTI_EXIT_DISC);
- }
+ if (med)
+ bgp_attr_set_med(&attr, *med);
/* override default weight assigned by bgp_attr_default_set() */
attr.weight = rfd->peer ? rfd->peer->weight[afi][safi] : 0;
red = bgp_redist_lookup(bgp, afi, type, 0);
- if (red && red->redist_metric_flag) {
- attr.med = red->redist_metric;
- attr.flag |= ATTR_FLAG_BIT(BGP_ATTR_MULTI_EXIT_DISC);
- }
+ if (red && red->redist_metric_flag)
+ bgp_attr_set_med(&attr, red->redist_metric);
bn = bgp_afi_node_get(bgp->rib[afi][safi], afi, safi, p, prd);
* neighbor NEIGHBOR attribute-unchanged med
*/
if (!CHECK_FLAG(new->flag, BGP_ATTR_MULTI_EXIT_DISC)) {
+ uint32_t med = 255;
+
if (CHECK_FLAG(new->flag, BGP_ATTR_LOCAL_PREF)) {
if (new->local_pref > 255)
- new->med = 0;
+ med = 0;
else
- new->med = 255 - new->local_pref;
- } else {
- new->med = 255; /* shouldn't happen */
+ med = 255 - new->local_pref;
}
- new->flag |= ATTR_FLAG_BIT(BGP_ATTR_MULTI_EXIT_DISC);
+
+ bgp_attr_set_med(new, med);
}
/*
* neighbor NEIGHBOR attribute-unchanged med
*/
if (!CHECK_FLAG(new->flag, BGP_ATTR_MULTI_EXIT_DISC)) {
+ uint32_t med = 255;
+
if (CHECK_FLAG(new->flag, BGP_ATTR_LOCAL_PREF)) {
if (new->local_pref > 255)
- new->med = 0;
+ med = 0;
else
- new->med = 255 - new->local_pref;
- } else {
- new->med = 255; /* shouldn't happen */
+ med = 255 - new->local_pref;
}
- new->flag |= ATTR_FLAG_BIT(BGP_ATTR_MULTI_EXIT_DISC);
+
+ bgp_attr_set_med(new, med);
}
/*