Skip to content

Commit

Permalink
Merge pull request #3848 from chiragshah6/evpn_dev2
Browse files Browse the repository at this point in the history
bgpd: evpn reject bgp update to overwrite self mac as part of router-mac ext. community
  • Loading branch information
srimohans committed Mar 5, 2019
2 parents 94b4f08 + 5c14a19 commit 1ac2926
Show file tree
Hide file tree
Showing 6 changed files with 47 additions and 11 deletions.
14 changes: 13 additions & 1 deletion bgpd/bgp_attr.c
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@
#include "bgp_encap_types.h"
#include "bgp_evpn.h"
#include "bgp_flowspec_private.h"
#include "bgp_mac.h"

/* Attribute strings for logging. */
static const struct message attr_str[] = {
Expand Down Expand Up @@ -1944,7 +1945,18 @@ bgp_attr_ext_communities(struct bgp_attr_parser_args *args)
bgp_attr_evpn_na_flag(attr, &attr->router_flag);

/* Extract the Rmac, if any */
bgp_attr_rmac(attr, &attr->rmac);
if (bgp_attr_rmac(attr, &attr->rmac)) {
if (bgp_debug_update(peer, NULL, NULL, 1) &&
bgp_mac_exist(&attr->rmac)) {
char buf1[ETHER_ADDR_STRLEN];

zlog_debug("%s: router mac %s is self mac",
__func__,
prefix_mac2str(&attr->rmac, buf1,
sizeof(buf1)));
}

}

return BGP_ATTR_PARSE_PROCEED;
}
Expand Down
6 changes: 4 additions & 2 deletions bgpd/bgp_attr_evpn.c
Original file line number Diff line number Diff line change
Expand Up @@ -106,14 +106,14 @@ char *ecom_mac2str(char *ecom_mac)
}

/* Fetch router-mac from extended community */
void bgp_attr_rmac(struct attr *attr, struct ethaddr *rmac)
bool bgp_attr_rmac(struct attr *attr, struct ethaddr *rmac)
{
int i = 0;
struct ecommunity *ecom;

ecom = attr->ecommunity;
if (!ecom || !ecom->size)
return;
return false;

/* If there is a router mac extended community, set RMAC in attr */
for (i = 0; i < ecom->size; i++) {
Expand All @@ -130,7 +130,9 @@ void bgp_attr_rmac(struct attr *attr, struct ethaddr *rmac)
continue;

memcpy(rmac, pnt, ETH_ALEN);
return true;
}
return false;
}

/*
Expand Down
2 changes: 1 addition & 1 deletion bgpd/bgp_attr_evpn.h
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ extern void bgp_add_routermac_ecom(struct attr *attr,
struct ethaddr *routermac);
extern int bgp_build_evpn_prefix(int type, uint32_t eth_tag,
struct prefix *dst);
extern void bgp_attr_rmac(struct attr *attr, struct ethaddr *rmac);
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);
Expand Down
33 changes: 27 additions & 6 deletions bgpd/bgp_mac.c
Original file line number Diff line number Diff line change
Expand Up @@ -311,22 +311,43 @@ void bgp_mac_del_mac_entry(struct interface *ifp)
bgp_mac_remove_ifp_internal(bsm, ifp->name);
}

bool bgp_mac_entry_exists(struct prefix *p)
/* This API checks MAC address against any of local
* assigned (SVIs) MAC address.
* An example: router-mac attribute in any of evpn update
* requires to compare against local mac.
*/
bool bgp_mac_exist(struct ethaddr *mac)
{
struct prefix_evpn *pevpn = (struct prefix_evpn *)p;
struct bgp_self_mac lookup;
struct bgp_self_mac *bsm;
static uint8_t tmp [ETHER_ADDR_STRLEN] = {0};

if (memcmp(mac, &tmp, ETH_ALEN) == 0)
return false;

memcpy(&lookup.macaddr, mac, ETH_ALEN);
bsm = hash_lookup(bm->self_mac_hash, &lookup);
if (!bsm)
return false;

return true;
}

/* This API checks EVPN type-2 prefix and comapares
* mac against any of local assigned (SVIs) MAC
* address.
*/
bool bgp_mac_entry_exists(struct prefix *p)
{
struct prefix_evpn *pevpn = (struct prefix_evpn *)p;

if (pevpn->family != AF_EVPN)
return false;

if (pevpn->prefix.route_type != BGP_EVPN_MAC_IP_ROUTE)
return false;

memcpy(&lookup.macaddr, &p->u.prefix_evpn.macip_addr.mac, ETH_ALEN);
bsm = hash_lookup(bm->self_mac_hash, &lookup);
if (!bsm)
return false;
return bgp_mac_exist(&p->u.prefix_evpn.macip_addr.mac);

return true;
}
Expand Down
1 change: 1 addition & 0 deletions bgpd/bgp_mac.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,5 +37,6 @@ void bgp_mac_dump_table(struct vty *vty);
* Function to lookup the prefix and see if we have a matching mac
*/
bool bgp_mac_entry_exists(struct prefix *p);
bool bgp_mac_exist(struct ethaddr *mac);

#endif
2 changes: 1 addition & 1 deletion bgpd/bgp_route.c
Original file line number Diff line number Diff line change
Expand Up @@ -3094,7 +3094,7 @@ int bgp_update(struct peer *peer, struct prefix *p, uint32_t addpath_id,
goto filtered;
}

if (bgp_mac_entry_exists(p)) {
if (bgp_mac_entry_exists(p) || bgp_mac_exist(&attr->rmac)) {
reason = "self mac;";
goto filtered;
}
Expand Down

0 comments on commit 1ac2926

Please sign in to comment.