struct peer *const peer = args->peer;
struct attr *const attr = args->attr;
const bgp_size_t length = args->length;
- uint8_t sticky = 0;
bool proxy = false;
struct ecommunity *ecomm;
attr->df_pref = bgp_attr_df_pref_from_ec(attr, &attr->df_alg);
/* Extract MAC mobility sequence number, if any. */
- attr->mm_seqnum = bgp_attr_mac_mobility_seqnum(attr, &sticky);
- attr->sticky = sticky;
+ attr->mm_seqnum = bgp_attr_mac_mobility_seqnum(attr);
/* Check if this is a Gateway MAC-IP advertisement */
- attr->default_gw = bgp_attr_default_gw(attr);
+ bgp_attr_default_gw(attr);
/* Handle scenario where router flag ecommunity is not
* set but default gw ext community is present.
* Use default gateway, set and propogate R-bit.
*/
- if (attr->default_gw)
- attr->router_flag = 1;
+ if (CHECK_FLAG(attr->evpn_flags, ATTR_EVPN_FLAG_DEFAULT_GW))
+ SET_FLAG(attr->evpn_flags, ATTR_EVPN_FLAG_ROUTER);
/* Check EVPN Neighbor advertisement flags, R-bit */
- bgp_attr_evpn_na_flag(attr, &attr->router_flag, &proxy);
+ bgp_attr_evpn_na_flag(attr, &proxy);
if (proxy)
attr->es_flags |= ATTR_ES_PROXY_ADVERT;
#define ATTR_ES_L3_NHG_ACTIVE (1 << 6)
#define ATTR_ES_L3_NHG (ATTR_ES_L3_NHG_USE | ATTR_ES_L3_NHG_ACTIVE)
- /* NA router flag (R-bit) support in EVPN */
- uint8_t router_flag;
-
/* Distance as applied by Route map */
uint8_t distance;
/* MP Nexthop length */
uint8_t mp_nexthop_len;
- /* Static MAC for EVPN */
- uint8_t sticky;
-
- /* Flag for default gateway extended community in EVPN */
- uint8_t default_gw;
+ /* EVPN flags */
+ uint8_t evpn_flags;
+#define ATTR_EVPN_FLAG_STICKY (1 << 0)
+#define ATTR_EVPN_FLAG_DEFAULT_GW (1 << 1)
+/* NA router flag (R-bit) support in EVPN */
+#define ATTR_EVPN_FLAG_ROUTER (1 << 2)
/* route tag */
route_tag_t tag;
/*
* return true if attr contains default gw extended community
*/
-uint8_t bgp_attr_default_gw(struct attr *attr)
+void bgp_attr_default_gw(struct attr *attr)
{
struct ecommunity *ecom;
uint32_t i;
ecom = bgp_attr_get_ecommunity(attr);
if (!ecom || !ecom->size)
- return 0;
+ return;
/* If there is a default gw extendd community return true otherwise
* return 0 */
if ((type == ECOMMUNITY_ENCODE_OPAQUE
&& sub_type == ECOMMUNITY_EVPN_SUBTYPE_DEF_GW))
- return 1;
+ SET_FLAG(attr->evpn_flags, ATTR_EVPN_FLAG_DEFAULT_GW);
}
-
- return 0;
+ UNSET_FLAG(attr->evpn_flags, ATTR_EVPN_FLAG_DEFAULT_GW);
}
/*
* Fetch and return the sequence number from MAC Mobility extended
* community, if present, else 0.
*/
-uint32_t bgp_attr_mac_mobility_seqnum(struct attr *attr, uint8_t *sticky)
+uint32_t bgp_attr_mac_mobility_seqnum(struct attr *attr)
{
struct ecommunity *ecom;
uint32_t i;
flags = *pnt++;
if (flags & ECOMMUNITY_EVPN_SUBTYPE_MACMOBILITY_FLAG_STICKY)
- *sticky = 1;
+ SET_FLAG(attr->evpn_flags, ATTR_EVPN_FLAG_STICKY);
else
- *sticky = 0;
+ UNSET_FLAG(attr->evpn_flags, ATTR_EVPN_FLAG_STICKY);
pnt++;
pnt = ptr_get_be32(pnt, &seq_num);
/*
* return true if attr contains router flag extended community
*/
-void bgp_attr_evpn_na_flag(struct attr *attr,
- uint8_t *router_flag, bool *proxy)
+void bgp_attr_evpn_na_flag(struct attr *attr, bool *proxy)
{
struct ecommunity *ecom;
uint32_t i;
val = *pnt++;
if (val & ECOMMUNITY_EVPN_SUBTYPE_ND_ROUTER_FLAG)
- *router_flag = 1;
+ SET_FLAG(attr->evpn_flags,
+ ATTR_EVPN_FLAG_ROUTER);
if (val & ECOMMUNITY_EVPN_SUBTYPE_PROXY_FLAG)
*proxy = true;
extern int bgp_build_evpn_prefix(int type, uint32_t eth_tag,
struct prefix *dst);
extern bool bgp_attr_rmac(struct attr *attr, struct ethaddr *rmac);
-extern uint32_t bgp_attr_mac_mobility_seqnum(struct attr *attr,
- uint8_t *sticky);
-extern uint8_t bgp_attr_default_gw(struct attr *attr);
+extern uint32_t bgp_attr_mac_mobility_seqnum(struct attr *attr);
+extern void bgp_attr_default_gw(struct attr *attr);
-extern void bgp_attr_evpn_na_flag(struct attr *attr, uint8_t *router_flag,
- bool *proxy);
+extern void bgp_attr_evpn_na_flag(struct attr *attr, bool *proxy);
extern uint16_t bgp_attr_df_pref_from_ec(struct attr *attr, uint8_t *alg);
}
/* Add MAC mobility (sticky) if needed. */
- if (attr->sticky) {
+ if (CHECK_FLAG(attr->evpn_flags, ATTR_EVPN_FLAG_STICKY)) {
seqnum = 0;
encode_mac_mobility_extcomm(1, seqnum, &eval_sticky);
ecom_sticky.size = 1;
}
/* Add default gateway, if needed. */
- if (attr->default_gw) {
+ if (CHECK_FLAG(attr->evpn_flags, ATTR_EVPN_FLAG_DEFAULT_GW)) {
encode_default_gw_extcomm(&eval_default_gw);
ecom_default_gw.size = 1;
ecom_default_gw.unit_size = ECOMMUNITY_SIZE;
}
proxy = !!(attr->es_flags & ATTR_ES_PROXY_ADVERT);
- if (attr->router_flag || proxy) {
- encode_na_flag_extcomm(&eval_na, attr->router_flag, proxy);
+ if (CHECK_FLAG(attr->evpn_flags, ATTR_EVPN_FLAG_ROUTER) || proxy) {
+ encode_na_flag_extcomm(&eval_na,
+ CHECK_FLAG(attr->evpn_flags,
+ ATTR_EVPN_FLAG_ROUTER),
+ proxy);
ecom_na.size = 1;
ecom_na.unit_size = ECOMMUNITY_SIZE;
ecom_na.val = (uint8_t *)eval_na.val;
flags = 0;
if (pi->sub_type == BGP_ROUTE_IMPORTED) {
- if (pi->attr->sticky)
+ if (CHECK_FLAG(pi->attr->evpn_flags,
+ ATTR_EVPN_FLAG_STICKY))
SET_FLAG(flags, ZEBRA_MACIP_TYPE_STICKY);
- if (pi->attr->default_gw)
+ if (CHECK_FLAG(pi->attr->evpn_flags,
+ ATTR_EVPN_FLAG_DEFAULT_GW))
SET_FLAG(flags, ZEBRA_MACIP_TYPE_GW);
if (is_evpn_prefix_ipaddr_v6(p) &&
- pi->attr->router_flag)
+ CHECK_FLAG(pi->attr->evpn_flags,
+ ATTR_EVPN_FLAG_ROUTER))
SET_FLAG(flags, ZEBRA_MACIP_TYPE_ROUTER_FLAG);
seq = mac_mobility_seqnum(pi->attr);
*active_on_peer = true;
}
- if (second_best_path->attr->router_flag)
+ if (CHECK_FLAG(second_best_path->attr->evpn_flags,
+ ATTR_EVPN_FLAG_ROUTER))
*peer_router = true;
/* we use both proxy and non-proxy imports to
struct attr local_attr;
struct bgp_labels bgp_labels = {};
int route_change = 1;
- uint8_t sticky = 0;
const struct prefix_evpn *evp;
*pi = NULL;
local_attr = *attr;
/* Extract MAC mobility sequence number, if any. */
- local_attr.mm_seqnum =
- bgp_attr_mac_mobility_seqnum(&local_attr, &sticky);
- local_attr.sticky = sticky;
+ local_attr.mm_seqnum = bgp_attr_mac_mobility_seqnum(&local_attr);
/* Add (or update) attribute to hash. */
attr_new = bgp_attr_intern(&local_attr);
BGP_PATH_ATTR_CHANGED);
/* Extract MAC mobility sequence number, if any. */
- local_attr.mm_seqnum = bgp_attr_mac_mobility_seqnum(
- &local_attr, &sticky);
- local_attr.sticky = sticky;
+ local_attr.mm_seqnum =
+ bgp_attr_mac_mobility_seqnum(&local_attr);
attr_new = bgp_attr_intern(&local_attr);
attr.nexthop = vpn->originator_ip;
attr.mp_nexthop_global_in = vpn->originator_ip;
attr.mp_nexthop_len = BGP_ATTR_NHLEN_IPV4;
- attr.sticky = CHECK_FLAG(flags, ZEBRA_MACIP_TYPE_STICKY) ? 1 : 0;
- attr.default_gw = CHECK_FLAG(flags, ZEBRA_MACIP_TYPE_GW) ? 1 : 0;
- attr.router_flag = CHECK_FLAG(flags,
- ZEBRA_MACIP_TYPE_ROUTER_FLAG) ? 1 : 0;
+ if (CHECK_FLAG(flags, ZEBRA_MACIP_TYPE_STICKY))
+ SET_FLAG(attr.evpn_flags, ATTR_EVPN_FLAG_STICKY);
+ if (CHECK_FLAG(flags, ZEBRA_MACIP_TYPE_GW))
+ SET_FLAG(attr.evpn_flags, ATTR_EVPN_FLAG_DEFAULT_GW);
+ if (CHECK_FLAG(flags, ZEBRA_MACIP_TYPE_ROUTER_FLAG))
+ SET_FLAG(attr.evpn_flags, ATTR_EVPN_FLAG_ROUTER);
if (CHECK_FLAG(flags, ZEBRA_MACIP_TYPE_PROXY_ADVERT))
attr.es_flags |= ATTR_ES_PROXY_ADVERT;
attr.nexthop = vpn->originator_ip;
attr.mp_nexthop_global_in = vpn->originator_ip;
attr.mp_nexthop_len = BGP_ATTR_NHLEN_IPV4;
- attr.sticky = (local_pi->attr->sticky) ? 1 : 0;
- attr.router_flag = (local_pi->attr->router_flag) ? 1 : 0;
+ attr.evpn_flags = local_pi->attr->evpn_flags;
attr.es_flags = local_pi->attr->es_flags;
- if (local_pi->attr->default_gw) {
- attr.default_gw = 1;
+ if (CHECK_FLAG(local_pi->attr->evpn_flags, ATTR_EVPN_FLAG_DEFAULT_GW)) {
+ SET_FLAG(attr.evpn_flags, ATTR_EVPN_FLAG_DEFAULT_GW);
if (is_evpn_prefix_ipaddr_v6(&evp))
- attr.router_flag = 1;
+ SET_FLAG(attr.evpn_flags, ATTR_EVPN_FLAG_ROUTER);
}
memcpy(&attr.esi, &local_pi->attr->esi, sizeof(esi_t));
bgp_evpn_get_rmac_nexthop(vpn, &evp, &attr,
}
static inline void encode_na_flag_extcomm(struct ecommunity_val *eval,
- uint8_t na_flag, bool proxy)
+ bool na_flag, bool proxy)
{
memset(eval, 0, sizeof(*eval));
eval->val[0] = ECOMMUNITY_ENCODE_EVPN;
* with the
* sticky flag.
*/
- if (newattr->sticky != existattr->sticky) {
- if (newattr->sticky && !existattr->sticky) {
+ bool new_sticky = CHECK_FLAG(newattr->evpn_flags,
+ ATTR_EVPN_FLAG_STICKY);
+ bool exist_sticky = CHECK_FLAG(existattr->evpn_flags,
+ ATTR_EVPN_FLAG_STICKY);
+
+ if (new_sticky != exist_sticky) {
+ if (new_sticky && !exist_sticky) {
*reason = bgp_path_selection_evpn_sticky_mac;
if (debug)
zlog_debug(
return 1;
}
- if (!newattr->sticky && existattr->sticky) {
+ if (!new_sticky && exist_sticky) {
*reason = bgp_path_selection_evpn_sticky_mac;
if (debug)
zlog_debug(