summaryrefslogtreecommitdiff
path: root/bgpd/bgp_evpn.c
diff options
context:
space:
mode:
Diffstat (limited to 'bgpd/bgp_evpn.c')
-rw-r--r--bgpd/bgp_evpn.c415
1 files changed, 191 insertions, 224 deletions
diff --git a/bgpd/bgp_evpn.c b/bgpd/bgp_evpn.c
index 9e814516b7..41aceae9f7 100644
--- a/bgpd/bgp_evpn.c
+++ b/bgpd/bgp_evpn.c
@@ -173,8 +173,8 @@ static struct vrf_irt_node *vrf_import_rt_new(struct ecommunity_val *rt)
bgp_def = bgp_get_default();
if (!bgp_def) {
- flog_err(BGP_ERR_NO_DFLT,
- "vrf import rt new - def instance not created yet");
+ flog_err(EC_BGP_NO_DFLT,
+ "vrf import rt new - def instance not created yet");
return NULL;
}
@@ -204,8 +204,8 @@ static void vrf_import_rt_free(struct vrf_irt_node *irt)
bgp_def = bgp_get_default();
if (!bgp_def) {
- flog_err(BGP_ERR_NO_DFLT,
- "vrf import rt free - def instance not created yet");
+ flog_err(EC_BGP_NO_DFLT,
+ "vrf import rt free - def instance not created yet");
return;
}
@@ -226,9 +226,8 @@ static struct vrf_irt_node *lookup_vrf_import_rt(struct ecommunity_val *rt)
bgp_def = bgp_get_default();
if (!bgp_def) {
- flog_err(
- BGP_ERR_NO_DFLT,
- "vrf import rt lookup - def instance not created yet");
+ flog_err(EC_BGP_NO_DFLT,
+ "vrf import rt lookup - def instance not created yet");
return NULL;
}
@@ -543,7 +542,7 @@ static void evpn_convert_nexthop_to_ipv6(struct attr *attr)
static int bgp_zebra_send_remote_macip(struct bgp *bgp, struct bgpevpn *vpn,
struct prefix_evpn *p,
struct in_addr remote_vtep_ip, int add,
- uint8_t flags)
+ uint8_t flags, uint32_t seq)
{
struct stream *s;
int ipa_len;
@@ -579,19 +578,22 @@ static int bgp_zebra_send_remote_macip(struct bgp *bgp, struct bgpevpn *vpn,
stream_put_in_addr(s, &remote_vtep_ip);
/* TX flags - MAC sticky status and/or gateway mac */
- if (add)
+ /* Also TX the sequence number of the best route. */
+ if (add) {
stream_putc(s, flags);
+ stream_putl(s, seq);
+ }
stream_putw_at(s, 0, stream_get_endp(s));
if (bgp_debug_zebra(NULL))
zlog_debug(
- "Tx %s MACIP, VNI %u MAC %s IP %s (flags: 0x%x) remote VTEP %s",
+ "Tx %s MACIP, VNI %u MAC %s IP %s flags 0x%x seq %u remote VTEP %s",
add ? "ADD" : "DEL", vpn->vni,
prefix_mac2str(&p->prefix.macip_addr.mac,
buf1, sizeof(buf1)),
ipaddr2str(&p->prefix.macip_addr.ip,
- buf3, sizeof(buf3)), flags,
+ buf3, sizeof(buf3)), flags, seq,
inet_ntop(AF_INET, &remote_vtep_ip, buf2,
sizeof(buf2)));
@@ -625,7 +627,7 @@ static int bgp_zebra_send_remote_vtep(struct bgp *bgp, struct bgpevpn *vpn,
stream_put_in_addr(s, &p->prefix.imet_addr.ip.ipaddr_v4);
else if (is_evpn_prefix_ipaddr_v6(p)) {
flog_err(
- BGP_ERR_VTEP_INVALID,
+ EC_BGP_VTEP_INVALID,
"Bad remote IP when trying to %s remote VTEP for VNI %u",
add ? "ADD" : "DEL", vpn->vni);
return -1;
@@ -875,13 +877,14 @@ static void add_mac_mobility_to_attr(uint32_t seq_num, struct attr *attr)
/* Install EVPN route into zebra. */
static int evpn_zebra_install(struct bgp *bgp, struct bgpevpn *vpn,
struct prefix_evpn *p,
- struct in_addr remote_vtep_ip, uint8_t flags)
+ struct in_addr remote_vtep_ip, uint8_t flags,
+ uint32_t seq)
{
int ret;
if (p->prefix.route_type == BGP_EVPN_MAC_IP_ROUTE)
ret = bgp_zebra_send_remote_macip(bgp, vpn, p, remote_vtep_ip,
- 1, flags);
+ 1, flags, seq);
else
ret = bgp_zebra_send_remote_vtep(bgp, vpn, p, 1);
@@ -897,7 +900,7 @@ static int evpn_zebra_uninstall(struct bgp *bgp, struct bgpevpn *vpn,
if (p->prefix.route_type == BGP_EVPN_MAC_IP_ROUTE)
ret = bgp_zebra_send_remote_macip(bgp, vpn, p, remote_vtep_ip,
- 0, 0);
+ 0, 0, 0);
else
ret = bgp_zebra_send_remote_vtep(bgp, vpn, p, 0);
@@ -1141,7 +1144,8 @@ static int evpn_route_select_install(struct bgp *bgp, struct bgpevpn *vpn,
ret = evpn_zebra_install(
bgp, vpn, (struct prefix_evpn *)&rn->p,
- old_select->attr->nexthop, flags);
+ old_select->attr->nexthop, flags,
+ mac_mobility_seqnum(old_select->attr));
}
UNSET_FLAG(old_select->flags, BGP_INFO_MULTIPATH_CHG);
bgp_zebra_clear_route_change_flags(rn);
@@ -1177,7 +1181,8 @@ static int evpn_route_select_install(struct bgp *bgp, struct bgpevpn *vpn,
SET_FLAG(flags, ZEBRA_MACIP_TYPE_ROUTER_FLAG);
ret = evpn_zebra_install(bgp, vpn, (struct prefix_evpn *)&rn->p,
- new_select->attr->nexthop, flags);
+ new_select->attr->nexthop, flags,
+ mac_mobility_seqnum(new_select->attr));
/* If an old best existed and it was a "local" route, the only
* reason
* it would be supplanted is due to MAC mobility procedures. So,
@@ -1296,7 +1301,7 @@ static int update_evpn_type4_route_entry(struct bgp *bgp,
*/
if (remote_ri) {
flog_err(
- BGP_ERR_ES_INVALID,
+ EC_BGP_ES_INVALID,
"%u ERROR: local es route for ESI: %s Vtep %s also learnt from remote",
bgp->vrf_id,
esi_to_str(&evp->prefix.es_addr.esi, buf, sizeof(buf)),
@@ -1383,12 +1388,11 @@ static int update_evpn_type4_route(struct bgp *bgp,
&attr, 1, &ri,
&route_changed);
if (ret != 0) {
- flog_err(
- BGP_ERR_ES_INVALID,
- "%u ERROR: Failed to updated ES route ESI: %s VTEP %s",
- bgp->vrf_id,
- esi_to_str(&p->prefix.es_addr.esi, buf, sizeof(buf)),
- ipaddr2str(&es->originator_ip, buf1, sizeof(buf1)));
+ flog_err(EC_BGP_ES_INVALID,
+ "%u ERROR: Failed to updated ES route ESI: %s VTEP %s",
+ bgp->vrf_id,
+ esi_to_str(&p->prefix.es_addr.esi, buf, sizeof(buf)),
+ ipaddr2str(&es->originator_ip, buf1, sizeof(buf1)));
}
assert(ri);
@@ -1557,11 +1561,12 @@ static int update_evpn_type5_route(struct bgp *bgp_vrf, struct prefix_evpn *evp,
*/
static int update_evpn_route_entry(struct bgp *bgp, struct bgpevpn *vpn,
afi_t afi, safi_t safi, struct bgp_node *rn,
- struct attr *attr, int add, int vni_table,
- struct bgp_info **ri, uint8_t flags)
+ struct attr *attr, int add,
+ struct bgp_info **ri, uint8_t flags,
+ uint32_t seq)
{
struct bgp_info *tmp_ri;
- struct bgp_info *local_ri, *remote_ri;
+ struct bgp_info *local_ri;
struct attr *attr_new;
mpls_label_t label[BGP_MAX_LABELS];
uint32_t num_labels = 1;
@@ -1573,28 +1578,13 @@ static int update_evpn_route_entry(struct bgp *bgp, struct bgpevpn *vpn,
evp = (struct prefix_evpn *)&rn->p;
memset(&label, 0, sizeof(label));
- /* See if this is an update of an existing route, or a new add. Also,
- * identify if already known from remote, and if so, the one with the
- * highest sequence number; this is only when adding to the VNI routing
- * table.
- */
- local_ri = remote_ri = NULL;
+ /* See if this is an update of an existing route, or a new add. */
+ local_ri = NULL;
for (tmp_ri = rn->info; tmp_ri; tmp_ri = tmp_ri->next) {
if (tmp_ri->peer == bgp->peer_self
&& tmp_ri->type == ZEBRA_ROUTE_BGP
&& tmp_ri->sub_type == BGP_ROUTE_STATIC)
local_ri = tmp_ri;
- if (vni_table) {
- if (tmp_ri->type == ZEBRA_ROUTE_BGP
- && tmp_ri->sub_type == BGP_ROUTE_IMPORTED
- && CHECK_FLAG(tmp_ri->flags, BGP_INFO_VALID)) {
- if (!remote_ri)
- remote_ri = tmp_ri;
- else if (mac_mobility_seqnum(tmp_ri->attr)
- > mac_mobility_seqnum(remote_ri->attr))
- remote_ri = tmp_ri;
- }
- }
}
/* If route doesn't exist already, create a new one, if told to.
@@ -1604,22 +1594,11 @@ static int update_evpn_route_entry(struct bgp *bgp, struct bgpevpn *vpn,
if (!local_ri && !add)
return 0;
- if (!local_ri) {
- /* When learnt locally for the first time but already known from
- * remote, we have to initiate appropriate MAC mobility steps.
- * This is applicable when updating the VNI routing table.
- * We need to skip mobility steps for g/w macs (local mac on g/w
- * SVI) advertised in EVPN.
- * This will ensure that local routes are preferred for g/w macs
- */
- if (remote_ri && !CHECK_FLAG(flags, ZEBRA_MACIP_TYPE_GW)) {
- uint32_t cur_seqnum;
-
- /* Add MM extended community to route. */
- cur_seqnum = mac_mobility_seqnum(remote_ri->attr);
- add_mac_mobility_to_attr(cur_seqnum + 1, attr);
- }
+ /* For non-GW MACs, update MAC mobility seq number, if needed. */
+ if (seq && !CHECK_FLAG(flags, ZEBRA_MACIP_TYPE_GW))
+ add_mac_mobility_to_attr(seq, attr);
+ if (!local_ri) {
/* Add (or update) attribute to hash. */
attr_new = bgp_attr_intern(attr);
@@ -1685,6 +1664,11 @@ static int update_evpn_route_entry(struct bgp *bgp, struct bgpevpn *vpn,
attr_new = bgp_attr_intern(attr);
bgp_info_set_flag(rn, tmp_ri, BGP_INFO_ATTR_CHANGED);
+ /* Extract MAC mobility sequence number, if any. */
+ attr_new->mm_seqnum =
+ bgp_attr_mac_mobility_seqnum(attr_new, &sticky);
+ attr_new->sticky = sticky;
+
/* Restore route, if needed. */
if (CHECK_FLAG(tmp_ri->flags, BGP_INFO_REMOVED))
bgp_info_restore(rn, tmp_ri);
@@ -1706,7 +1690,8 @@ static int update_evpn_route_entry(struct bgp *bgp, struct bgpevpn *vpn,
* and schedule for processing.
*/
static int update_evpn_route(struct bgp *bgp, struct bgpevpn *vpn,
- struct prefix_evpn *p, uint8_t flags)
+ struct prefix_evpn *p, uint8_t flags,
+ uint32_t seq)
{
struct bgp_node *rn;
struct attr attr;
@@ -1758,7 +1743,7 @@ static int update_evpn_route(struct bgp *bgp, struct bgpevpn *vpn,
/* Create or update route entry. */
route_change = update_evpn_route_entry(bgp, vpn, afi, safi, rn, &attr,
- 1, 1, &ri, flags);
+ 1, &ri, flags, seq);
assert(ri);
attr_new = ri->attr;
@@ -1778,8 +1763,8 @@ static int update_evpn_route(struct bgp *bgp, struct bgpevpn *vpn,
rn = bgp_afi_node_get(bgp->rib[afi][safi], afi, safi,
(struct prefix *)p, &vpn->prd);
- update_evpn_route_entry(bgp, vpn, afi, safi, rn, attr_new, 1, 0,
- &global_ri, flags);
+ update_evpn_route_entry(bgp, vpn, afi, safi, rn, attr_new, 1,
+ &global_ri, flags, seq);
/* Schedule for processing and unlock node. */
bgp_process(bgp, rn, afi, safi);
@@ -1954,58 +1939,14 @@ static int update_all_type2_routes(struct bgp *bgp, struct bgpevpn *vpn)
afi_t afi;
safi_t safi;
struct bgp_node *rn;
- struct bgp_info *ri;
+ struct bgp_info *ri, *tmp_ri;
struct attr attr;
- struct attr attr_sticky;
- struct attr attr_def_gw;
- struct attr attr_ip6_ll;
struct attr *attr_new;
+ uint32_t seq;
int add_l3_ecomm = 0;
afi = AFI_L2VPN;
safi = SAFI_EVPN;
- memset(&attr, 0, sizeof(struct attr));
- memset(&attr_sticky, 0, sizeof(struct attr));
- memset(&attr_def_gw, 0, sizeof(struct attr));
- memset(&attr_ip6_ll, 0, sizeof(struct attr));
-
- /* Build path-attribute - multiple type-2 routes for this VNI will share
- * the same path attribute, but we need separate structures for sticky
- * MACs, default gateway and IPv6 link-local addresses (no L3 RT/RMAC).
- */
- bgp_attr_default_set(&attr, BGP_ORIGIN_IGP);
- bgp_attr_default_set(&attr_sticky, BGP_ORIGIN_IGP);
- bgp_attr_default_set(&attr_def_gw, BGP_ORIGIN_IGP);
- attr.nexthop = vpn->originator_ip;
- attr.mp_nexthop_global_in = vpn->originator_ip;
- attr.mp_nexthop_len = BGP_ATTR_NHLEN_IPV4;
- bgpevpn_get_rmac(vpn, &attr.rmac);
- attr_sticky.nexthop = vpn->originator_ip;
- attr_sticky.mp_nexthop_global_in = vpn->originator_ip;
- attr_sticky.mp_nexthop_len = BGP_ATTR_NHLEN_IPV4;
- attr_sticky.sticky = 1;
- bgpevpn_get_rmac(vpn, &attr_sticky.rmac);
- attr_def_gw.nexthop = vpn->originator_ip;
- attr_def_gw.mp_nexthop_global_in = vpn->originator_ip;
- attr_def_gw.mp_nexthop_len = BGP_ATTR_NHLEN_IPV4;
- attr_def_gw.default_gw = 1;
- bgpevpn_get_rmac(vpn, &attr_def_gw.rmac);
- bgp_attr_default_set(&attr_ip6_ll, BGP_ORIGIN_IGP);
- attr_ip6_ll.nexthop = vpn->originator_ip;
- attr_ip6_ll.mp_nexthop_global_in = vpn->originator_ip;
- attr_ip6_ll.mp_nexthop_len = BGP_ATTR_NHLEN_IPV4;
-
- /* Add L3 VNI RTs and RMAC for non IPv6 link-local attributes if
- * using L3 VNI for type-2 routes also.
- */
- if (CHECK_FLAG(vpn->flags, VNI_FLAG_USE_TWO_LABELS) &&
- bgpevpn_get_l3vni(vpn))
- add_l3_ecomm = 1;
-
- build_evpn_route_extcomm(vpn, &attr, add_l3_ecomm);
- build_evpn_route_extcomm(vpn, &attr_sticky, add_l3_ecomm);
- build_evpn_route_extcomm(vpn, &attr_def_gw, add_l3_ecomm);
- build_evpn_route_extcomm(vpn, &attr_ip6_ll, 0);
/* Walk this VNI's route table and update local type-2 routes. For any
* routes updated, update corresponding entry in the global table too.
@@ -2019,35 +1960,57 @@ static int update_all_type2_routes(struct bgp *bgp, struct bgpevpn *vpn)
if (evp->prefix.route_type != BGP_EVPN_MAC_IP_ROUTE)
continue;
- if (is_evpn_prefix_ipaddr_v6(evp) &&
- IN6_IS_ADDR_LINKLOCAL(&evp->prefix.macip_addr.ip.ipaddr_v6))
- update_evpn_route_entry(bgp, vpn, afi, safi, rn,
- &attr_ip6_ll, 0, 1, &ri, 0);
- else {
- if (evpn_route_is_sticky(bgp, rn))
- update_evpn_route_entry(bgp, vpn, afi, safi, rn,
- &attr_sticky, 0, 1, &ri,
- 0);
- else if (evpn_route_is_def_gw(bgp, rn)) {
- if (is_evpn_prefix_ipaddr_v6(evp))
- attr_def_gw.router_flag = 1;
- update_evpn_route_entry(bgp, vpn, afi, safi, rn,
- &attr_def_gw, 0, 1, &ri,
- 0);
- } else
- update_evpn_route_entry(bgp, vpn, afi, safi, rn,
- &attr, 0, 1, &ri, 0);
+ /* Identify local route. */
+ for (tmp_ri = rn->info; tmp_ri; tmp_ri = tmp_ri->next) {
+ if (tmp_ri->peer == bgp->peer_self
+ && tmp_ri->type == ZEBRA_ROUTE_BGP
+ && tmp_ri->sub_type == BGP_ROUTE_STATIC)
+ break;
}
- /* If a local route exists for this prefix, we need to update
- * the global routing table too.
- */
- if (!ri)
+ if (!tmp_ri)
continue;
+ /*
+ * Build attribute per local route as the MAC mobility and
+ * some other values could differ for different routes. The
+ * attributes will be shared in the hash table.
+ */
+ bgp_attr_default_set(&attr, BGP_ORIGIN_IGP);
+ attr.nexthop = vpn->originator_ip;
+ attr.mp_nexthop_global_in = vpn->originator_ip;
+ attr.mp_nexthop_len = BGP_ATTR_NHLEN_IPV4;
+ bgpevpn_get_rmac(vpn, &attr.rmac);
+
+ if (evpn_route_is_sticky(bgp, rn))
+ attr.sticky = 1;
+ else if (evpn_route_is_def_gw(bgp, rn)) {
+ attr.default_gw = 1;
+ if (is_evpn_prefix_ipaddr_v6(evp))
+ attr.router_flag = 1;
+ }
+
+ /* Add L3 VNI RTs and RMAC for non IPv6 link-local if
+ * using L3 VNI for type-2 routes also.
+ */
+ if ((is_evpn_prefix_ipaddr_v4(evp) ||
+ !IN6_IS_ADDR_LINKLOCAL(
+ &evp->prefix.macip_addr.ip.ipaddr_v6)) &&
+ CHECK_FLAG(vpn->flags, VNI_FLAG_USE_TWO_LABELS) &&
+ bgpevpn_get_l3vni(vpn))
+ add_l3_ecomm = 1;
+
+ /* Set up extended community. */
+ build_evpn_route_extcomm(vpn, &attr, add_l3_ecomm);
+
+ seq = mac_mobility_seqnum(tmp_ri->attr);
+
+ /* Update the route entry. */
+ update_evpn_route_entry(bgp, vpn, afi, safi, rn,
+ &attr, 0, &ri, 0, seq);
+
/* Perform route selection; this is just to set the flags
- * correctly
- * as local route in the VNI always wins.
+ * correctly as local route in the VNI always wins.
*/
evpn_route_select_install(bgp, vpn, rn);
@@ -2058,18 +2021,17 @@ static int update_all_type2_routes(struct bgp *bgp, struct bgpevpn *vpn)
(struct prefix *)evp, &vpn->prd);
assert(rd_rn);
update_evpn_route_entry(bgp, vpn, afi, safi, rd_rn, attr_new, 0,
- 0, &global_ri, 0);
+ &global_ri, 0,
+ mac_mobility_seqnum(attr_new));
/* Schedule for processing and unlock node. */
bgp_process(bgp, rd_rn, afi, safi);
bgp_unlock_node(rd_rn);
- }
- /* Unintern temporary. */
- aspath_unintern(&attr.aspath);
- aspath_unintern(&attr_sticky.aspath);
- aspath_unintern(&attr_def_gw.aspath);
- aspath_unintern(&attr_ip6_ll.aspath);
+ /* Unintern temporary. */
+ aspath_unintern(&attr.aspath);
+
+ }
return 0;
}
@@ -2206,7 +2168,7 @@ static int update_routes_for_vni(struct bgp *bgp, struct bgpevpn *vpn)
* locally learnt type-2 routes (MACIP) - for this VNI.
*/
build_evpn_type3_prefix(&p, vpn->originator_ip);
- ret = update_evpn_route(bgp, vpn, &p, 0);
+ ret = update_evpn_route(bgp, vpn, &p, 0, 0);
if (ret)
return ret;
@@ -2227,9 +2189,9 @@ static int delete_routes_for_es(struct bgp *bgp, struct evpnes *es)
build_evpn_type4_prefix(&p, &es->esi, es->originator_ip.ipaddr_v4);
ret = delete_evpn_type4_route(bgp, es, &p);
if (ret) {
- flog_err(BGP_ERR_EVPN_ROUTE_DELETE,
- "%u failed to delete type-4 route for ESI %s",
- bgp->vrf_id, esi_to_str(&es->esi, buf, sizeof(buf)));
+ flog_err(EC_BGP_EVPN_ROUTE_DELETE,
+ "%u failed to delete type-4 route for ESI %s",
+ bgp->vrf_id, esi_to_str(&es->esi, buf, sizeof(buf)));
}
/* Delete all routes from per ES table */
@@ -2887,7 +2849,7 @@ static int install_uninstall_routes_for_es(struct bgp *bgp,
if (ret) {
flog_err(
- BGP_ERR_EVPN_FAIL,
+ EC_BGP_EVPN_FAIL,
"Failed to %s EVPN %s route in ESI %s",
install ? "install"
: "uninstall",
@@ -2967,7 +2929,7 @@ static int install_uninstall_routes_for_vrf(struct bgp *bgp_vrf, int install)
if (ret) {
flog_err(
- BGP_ERR_EVPN_FAIL,
+ EC_BGP_EVPN_FAIL,
"Failed to %s EVPN %s route in VRF %s",
install ? "install"
: "uninstall",
@@ -3041,7 +3003,7 @@ static int install_uninstall_routes_for_vni(struct bgp *bgp,
if (ret) {
flog_err(
- BGP_ERR_EVPN_FAIL,
+ EC_BGP_EVPN_FAIL,
"%u: Failed to %s EVPN %s route in VNI %u",
bgp->vrf_id,
install ? "install"
@@ -3144,7 +3106,7 @@ static int install_uninstall_route_in_es(struct bgp *bgp, struct evpnes *es,
if (ret) {
flog_err(
- BGP_ERR_EVPN_FAIL,
+ EC_BGP_EVPN_FAIL,
"%u: Failed to %s EVPN %s route in ESI %s", bgp->vrf_id,
install ? "install" : "uninstall", "ES",
esi_to_str(&evp->prefix.es_addr.esi, buf, sizeof(buf)));
@@ -3186,12 +3148,12 @@ static int install_uninstall_route_in_vrfs(struct bgp *bgp_def, afi_t afi,
ri);
if (ret) {
- flog_err(BGP_ERR_EVPN_FAIL,
- "%u: Failed to %s prefix %s in VRF %s",
- bgp_def->vrf_id,
- install ? "install" : "uninstall",
- prefix2str(evp, buf, sizeof(buf)),
- vrf_id_to_name(bgp_vrf->vrf_id));
+ flog_err(EC_BGP_EVPN_FAIL,
+ "%u: Failed to %s prefix %s in VRF %s",
+ bgp_def->vrf_id,
+ install ? "install" : "uninstall",
+ prefix2str(evp, buf, sizeof(buf)),
+ vrf_id_to_name(bgp_vrf->vrf_id));
return ret;
}
}
@@ -3222,14 +3184,13 @@ static int install_uninstall_route_in_vnis(struct bgp *bgp, afi_t afi,
ret = uninstall_evpn_route_entry(bgp, vpn, evp, ri);
if (ret) {
- flog_err(
- BGP_ERR_EVPN_FAIL,
- "%u: Failed to %s EVPN %s route in VNI %u",
- bgp->vrf_id, install ? "install" : "uninstall",
- evp->prefix.route_type == BGP_EVPN_MAC_IP_ROUTE
- ? "MACIP"
- : "IMET",
- vpn->vni);
+ flog_err(EC_BGP_EVPN_FAIL,
+ "%u: Failed to %s EVPN %s route in VNI %u",
+ bgp->vrf_id, install ? "install" : "uninstall",
+ evp->prefix.route_type == BGP_EVPN_MAC_IP_ROUTE
+ ? "MACIP"
+ : "IMET",
+ vpn->vni);
return ret;
}
}
@@ -3451,8 +3412,8 @@ static int update_advertise_vni_routes(struct bgp *bgp, struct bgpevpn *vpn)
global_rn = bgp_afi_node_get(bgp->rib[afi][safi], afi, safi,
(struct prefix *)&p, &vpn->prd);
- update_evpn_route_entry(bgp, vpn, afi, safi, global_rn, attr, 1, 0, &ri,
- 0);
+ update_evpn_route_entry(bgp, vpn, afi, safi, global_rn, attr, 1, &ri,
+ 0, mac_mobility_seqnum(attr));
/* Schedule for processing and unlock node. */
bgp_process(bgp, global_rn, afi, safi);
@@ -3485,7 +3446,8 @@ static int update_advertise_vni_routes(struct bgp *bgp, struct bgpevpn *vpn)
(struct prefix *)evp, &vpn->prd);
assert(global_rn);
update_evpn_route_entry(bgp, vpn, afi, safi, global_rn, attr, 1,
- 0, &global_ri, 0);
+ &global_ri, 0,
+ mac_mobility_seqnum(attr));
/* Schedule for processing and unlock node. */
bgp_process(bgp, global_rn, afi, safi);
@@ -3594,9 +3556,9 @@ static int process_type2_route(struct peer *peer, afi_t afi, safi_t safi,
*/
if (psize != 33 && psize != 37 && psize != 49 && psize != 36
&& psize != 40 && psize != 52) {
- flog_err(BGP_ERR_EVPN_ROUTE_INVALID,
- "%u:%s - Rx EVPN Type-2 NLRI with invalid length %d",
- peer->bgp->vrf_id, peer->host, psize);
+ flog_err(EC_BGP_EVPN_ROUTE_INVALID,
+ "%u:%s - Rx EVPN Type-2 NLRI with invalid length %d",
+ peer->bgp->vrf_id, peer->host, psize);
return -1;
}
@@ -3632,7 +3594,7 @@ static int process_type2_route(struct peer *peer, afi_t afi, safi_t safi,
pfx += ETH_ALEN;
} else {
flog_err(
- BGP_ERR_EVPN_ROUTE_INVALID,
+ EC_BGP_EVPN_ROUTE_INVALID,
"%u:%s - Rx EVPN Type-2 NLRI with unsupported MAC address length %d",
peer->bgp->vrf_id, peer->host, macaddr_len);
return -1;
@@ -3644,7 +3606,7 @@ static int process_type2_route(struct peer *peer, afi_t afi, safi_t safi,
if (ipaddr_len != 0 && ipaddr_len != IPV4_MAX_BITLEN
&& ipaddr_len != IPV6_MAX_BITLEN) {
flog_err(
- BGP_ERR_EVPN_ROUTE_INVALID,
+ EC_BGP_EVPN_ROUTE_INVALID,
"%u:%s - Rx EVPN Type-2 NLRI with unsupported IP address length %d",
peer->bgp->vrf_id, peer->host, ipaddr_len);
return -1;
@@ -3705,9 +3667,9 @@ static int process_type3_route(struct peer *peer, afi_t afi, safi_t safi,
* IP len (1) and IP (4 or 16).
*/
if (psize != 17 && psize != 29) {
- flog_err(BGP_ERR_EVPN_ROUTE_INVALID,
- "%u:%s - Rx EVPN Type-3 NLRI with invalid length %d",
- peer->bgp->vrf_id, peer->host, psize);
+ flog_err(EC_BGP_EVPN_ROUTE_INVALID,
+ "%u:%s - Rx EVPN Type-3 NLRI with invalid length %d",
+ peer->bgp->vrf_id, peer->host, psize);
return -1;
}
@@ -3718,9 +3680,11 @@ static int process_type3_route(struct peer *peer, afi_t afi, safi_t safi,
if (attr &&
(attr->flag & ATTR_FLAG_BIT(BGP_ATTR_PMSI_TUNNEL))) {
if (attr->pmsi_tnl_type != PMSI_TNLTYPE_INGR_REPL) {
- zlog_warn("%u:%s - Rx EVPN Type-3 NLRI with unsupported PTA %d",
- peer->bgp->vrf_id, peer->host,
- attr->pmsi_tnl_type);
+ flog_warn(
+ EC_BGP_EVPN_PMSI_PRESENT,
+ "%u:%s - Rx EVPN Type-3 NLRI with unsupported PTA %d",
+ peer->bgp->vrf_id, peer->host,
+ attr->pmsi_tnl_type);
}
}
@@ -3748,7 +3712,7 @@ static int process_type3_route(struct peer *peer, afi_t afi, safi_t safi,
memcpy(&p.prefix.imet_addr.ip.ip.addr, pfx, IPV4_MAX_BYTELEN);
} else {
flog_err(
- BGP_ERR_EVPN_ROUTE_INVALID,
+ EC_BGP_EVPN_ROUTE_INVALID,
"%u:%s - Rx EVPN Type-3 NLRI with unsupported IP address length %d",
peer->bgp->vrf_id, peer->host, ipaddr_len);
return -1;
@@ -3784,9 +3748,9 @@ static int process_type4_route(struct peer *peer, afi_t afi, safi_t safi,
* RD (8), ESI (10), ip-len (1), ip (4 or 16)
*/
if (psize != 23 && psize != 35) {
- flog_err(BGP_ERR_EVPN_ROUTE_INVALID,
- "%u:%s - Rx EVPN Type-4 NLRI with invalid length %d",
- peer->bgp->vrf_id, peer->host, psize);
+ flog_err(EC_BGP_EVPN_ROUTE_INVALID,
+ "%u:%s - Rx EVPN Type-4 NLRI with invalid length %d",
+ peer->bgp->vrf_id, peer->host, psize);
return -1;
}
@@ -3807,7 +3771,7 @@ static int process_type4_route(struct peer *peer, afi_t afi, safi_t safi,
memcpy(&vtep_ip, pfx, IPV4_MAX_BYTELEN);
} else {
flog_err(
- BGP_ERR_EVPN_ROUTE_INVALID,
+ EC_BGP_EVPN_ROUTE_INVALID,
"%u:%s - Rx EVPN Type-4 NLRI with unsupported IP address length %d",
peer->bgp->vrf_id, peer->host, ipaddr_len);
return -1;
@@ -3849,9 +3813,9 @@ static int process_type5_route(struct peer *peer, afi_t afi, safi_t safi,
* Note that the IP and GW should both be IPv4 or both IPv6.
*/
if (psize != 34 && psize != 58) {
- flog_err(BGP_ERR_EVPN_ROUTE_INVALID,
- "%u:%s - Rx EVPN Type-5 NLRI with invalid length %d",
- peer->bgp->vrf_id, peer->host, psize);
+ flog_err(EC_BGP_EVPN_ROUTE_INVALID,
+ "%u:%s - Rx EVPN Type-5 NLRI with invalid length %d",
+ peer->bgp->vrf_id, peer->host, psize);
return -1;
}
@@ -3883,7 +3847,7 @@ static int process_type5_route(struct peer *peer, afi_t afi, safi_t safi,
ippfx_len = *pfx++;
if (ippfx_len > IPV6_MAX_BITLEN) {
flog_err(
- BGP_ERR_EVPN_ROUTE_INVALID,
+ EC_BGP_EVPN_ROUTE_INVALID,
"%u:%s - Rx EVPN Type-5 NLRI with invalid IP Prefix length %d",
peer->bgp->vrf_id, peer->host, ippfx_len);
return -1;
@@ -4110,7 +4074,7 @@ void bgp_evpn_withdraw_type5_route(struct bgp *bgp_vrf, struct prefix *p,
ret = delete_evpn_type5_route(bgp_vrf, &evp);
if (ret) {
flog_err(
- BGP_ERR_EVPN_ROUTE_DELETE,
+ EC_BGP_EVPN_ROUTE_DELETE,
"%u failed to delete type-5 route for prefix %s in vrf %s",
bgp_vrf->vrf_id, prefix2str(p, buf, sizeof(buf)),
vrf_id_to_name(bgp_vrf->vrf_id));
@@ -4156,9 +4120,9 @@ void bgp_evpn_advertise_type5_route(struct bgp *bgp_vrf, struct prefix *p,
build_type5_prefix_from_ip_prefix(&evp, p);
ret = update_evpn_type5_route(bgp_vrf, &evp, src_attr);
if (ret)
- flog_err(BGP_ERR_EVPN_ROUTE_CREATE,
- "%u: Failed to create type-5 route for prefix %s",
- bgp_vrf->vrf_id, prefix2str(p, buf, sizeof(buf)));
+ flog_err(EC_BGP_EVPN_ROUTE_CREATE,
+ "%u: Failed to create type-5 route for prefix %s",
+ bgp_vrf->vrf_id, prefix2str(p, buf, sizeof(buf)));
}
/* Inject all prefixes of a particular address-family (currently, IPv4 or
@@ -4717,7 +4681,7 @@ int bgp_nlri_parse_evpn(struct peer *peer, struct attr *attr,
withdraw ? NULL : attr, pnt,
psize, addpath_id)) {
flog_err(
- BGP_ERR_EVPN_FAIL,
+ EC_BGP_EVPN_FAIL,
"%u:%s - Error in processing EVPN type-2 NLRI size %d",
peer->bgp->vrf_id, peer->host, psize);
return -1;
@@ -4729,7 +4693,7 @@ int bgp_nlri_parse_evpn(struct peer *peer, struct attr *attr,
withdraw ? NULL : attr, pnt,
psize, addpath_id)) {
flog_err(
- BGP_ERR_PKT_PROCESS,
+ EC_BGP_PKT_PROCESS,
"%u:%s - Error in processing EVPN type-3 NLRI size %d",
peer->bgp->vrf_id, peer->host, psize);
return -1;
@@ -4741,7 +4705,7 @@ int bgp_nlri_parse_evpn(struct peer *peer, struct attr *attr,
withdraw ? NULL : attr, pnt,
psize, addpath_id)) {
flog_err(
- BGP_ERR_PKT_PROCESS,
+ EC_BGP_PKT_PROCESS,
"%u:%s - Error in processing EVPN type-4 NLRI size %d",
peer->bgp->vrf_id, peer->host, psize);
return -1;
@@ -4752,7 +4716,7 @@ int bgp_nlri_parse_evpn(struct peer *peer, struct attr *attr,
if (process_type5_route(peer, afi, safi, attr, pnt,
psize, addpath_id, withdraw)) {
flog_err(
- BGP_ERR_PKT_PROCESS,
+ EC_BGP_PKT_PROCESS,
"%u:%s - Error in processing EVPN type-5 NLRI size %d",
peer->bgp->vrf_id, peer->host, psize);
return -1;
@@ -5197,7 +5161,8 @@ int bgp_evpn_local_macip_del(struct bgp *bgp, vni_t vni, struct ethaddr *mac,
/* Lookup VNI hash - should exist. */
vpn = bgp_evpn_lookup_vni(bgp, vni);
if (!vpn || !is_vni_live(vpn)) {
- zlog_warn("%u: VNI hash entry for VNI %u %s at MACIP DEL",
+ flog_warn(EC_BGP_EVPN_VPN_VNI,
+ "%u: VNI hash entry for VNI %u %s at MACIP DEL",
bgp->vrf_id, vni, vpn ? "not live" : "not found");
return -1;
}
@@ -5213,7 +5178,7 @@ int bgp_evpn_local_macip_del(struct bgp *bgp, vni_t vni, struct ethaddr *mac,
* Handle add of a local MACIP.
*/
int bgp_evpn_local_macip_add(struct bgp *bgp, vni_t vni, struct ethaddr *mac,
- struct ipaddr *ip, uint8_t flags)
+ struct ipaddr *ip, uint8_t flags, uint32_t seq)
{
struct bgpevpn *vpn;
struct prefix_evpn p;
@@ -5221,19 +5186,20 @@ int bgp_evpn_local_macip_add(struct bgp *bgp, vni_t vni, struct ethaddr *mac,
/* Lookup VNI hash - should exist. */
vpn = bgp_evpn_lookup_vni(bgp, vni);
if (!vpn || !is_vni_live(vpn)) {
- zlog_warn("%u: VNI hash entry for VNI %u %s at MACIP ADD",
+ flog_warn(EC_BGP_EVPN_VPN_VNI,
+ "%u: VNI hash entry for VNI %u %s at MACIP ADD",
bgp->vrf_id, vni, vpn ? "not live" : "not found");
return -1;
}
/* Create EVPN type-2 route and schedule for processing. */
build_evpn_type2_prefix(&p, mac, ip);
- if (update_evpn_route(bgp, vpn, &p, flags)) {
+ if (update_evpn_route(bgp, vpn, &p, flags, seq)) {
char buf[ETHER_ADDR_STRLEN];
char buf2[INET6_ADDRSTRLEN];
flog_err(
- BGP_ERR_EVPN_ROUTE_CREATE,
+ EC_BGP_EVPN_ROUTE_CREATE,
"%u:Failed to create Type-2 route, VNI %u %s MAC %s IP %s (flags: 0x%x)",
bgp->vrf_id, vpn->vni,
CHECK_FLAG(flags, ZEBRA_MACIP_TYPE_STICKY)
@@ -5275,7 +5241,7 @@ int bgp_evpn_local_l3vni_add(vni_t l3vni, vrf_id_t vrf_id, struct ethaddr *rmac,
bgp_def = bgp_get_default();
if (!bgp_def) {
flog_err(
- BGP_ERR_NO_DFLT,
+ EC_BGP_NO_DFLT,
"Cannot process L3VNI %u ADD - default BGP instance not yet created",
l3vni);
return -1;
@@ -5292,16 +5258,16 @@ int bgp_evpn_local_l3vni_add(vni_t l3vni, vrf_id_t vrf_id, struct ethaddr *rmac,
BGP_INSTANCE_TYPE_VRF);
switch (ret) {
case BGP_ERR_MULTIPLE_INSTANCE_NOT_SET:
- flog_err(BGP_ERR_MULTI_INSTANCE,
- "'bgp multiple-instance' not present\n");
+ flog_err(EC_BGP_MULTI_INSTANCE,
+ "'bgp multiple-instance' not present\n");
return -1;
case BGP_ERR_AS_MISMATCH:
- flog_err(BGP_ERR_EVPN_AS_MISMATCH,
- "BGP is already running; AS is %u\n", as);
+ flog_err(EC_BGP_EVPN_AS_MISMATCH,
+ "BGP is already running; AS is %u\n", as);
return -1;
case BGP_ERR_INSTANCE_MISMATCH:
- flog_err(BGP_ERR_EVPN_INSTANCE_MISMATCH,
- "BGP instance name and AS number mismatch\n");
+ flog_err(EC_BGP_EVPN_INSTANCE_MISMATCH,
+ "BGP instance name and AS number mismatch\n");
return -1;
}
@@ -5363,7 +5329,7 @@ int bgp_evpn_local_l3vni_del(vni_t l3vni, vrf_id_t vrf_id)
bgp_vrf = bgp_lookup_by_vrf_id(vrf_id);
if (!bgp_vrf) {
flog_err(
- BGP_ERR_NO_DFLT,
+ EC_BGP_NO_DFLT,
"Cannot process L3VNI %u Del - Could not find BGP instance",
l3vni);
return -1;
@@ -5372,7 +5338,7 @@ int bgp_evpn_local_l3vni_del(vni_t l3vni, vrf_id_t vrf_id)
bgp_def = bgp_get_default();
if (!bgp_def) {
flog_err(
- BGP_ERR_NO_DFLT,
+ EC_BGP_NO_DFLT,
"Cannot process L3VNI %u Del - Could not find default BGP instance",
l3vni);
return -1;
@@ -5433,7 +5399,8 @@ int bgp_evpn_local_vni_del(struct bgp *bgp, vni_t vni)
vpn = bgp_evpn_lookup_vni(bgp, vni);
if (!vpn) {
if (bgp_debug_zebra(NULL))
- zlog_warn(
+ flog_warn(
+ EC_BGP_EVPN_VPN_VNI,
"%u: VNI hash entry for VNI %u not found at DEL",
bgp->vrf_id, vni);
return 0;
@@ -5503,7 +5470,7 @@ int bgp_evpn_local_vni_add(struct bgp *bgp, vni_t vni,
vpn = bgp_evpn_new(bgp, vni, originator_ip, tenant_vrf_id);
if (!vpn) {
flog_err(
- BGP_ERR_VNI,
+ EC_BGP_VNI,
"%u: Failed to allocate VNI entry for VNI %u - at Add",
bgp->vrf_id, vni);
return -1;
@@ -5525,10 +5492,10 @@ int bgp_evpn_local_vni_add(struct bgp *bgp, vni_t vni,
/* Create EVPN type-3 route and schedule for processing. */
build_evpn_type3_prefix(&p, vpn->originator_ip);
- if (update_evpn_route(bgp, vpn, &p, 0)) {
- flog_err(BGP_ERR_EVPN_ROUTE_CREATE,
- "%u: Type3 route creation failure for VNI %u",
- bgp->vrf_id, vni);
+ if (update_evpn_route(bgp, vpn, &p, 0, 0)) {
+ flog_err(EC_BGP_EVPN_ROUTE_CREATE,
+ "%u: Type3 route creation failure for VNI %u",
+ bgp->vrf_id, vni);
return -1;
}
@@ -5556,17 +5523,17 @@ int bgp_evpn_local_es_del(struct bgp *bgp,
struct evpnes *es = NULL;
if (!bgp->esihash) {
- flog_err(BGP_ERR_ES_CREATE, "%u: ESI hash not yet created",
- bgp->vrf_id);
+ flog_err(EC_BGP_ES_CREATE, "%u: ESI hash not yet created",
+ bgp->vrf_id);
return -1;
}
/* Lookup ESI hash - should exist. */
es = bgp_evpn_lookup_es(bgp, esi);
if (!es) {
- zlog_warn("%u: ESI hash entry for ESI %s at Local ES DEL",
- bgp->vrf_id,
- esi_to_str(esi, buf, sizeof(buf)));
+ flog_warn(EC_BGP_EVPN_ESI,
+ "%u: ESI hash entry for ESI %s at Local ES DEL",
+ bgp->vrf_id, esi_to_str(esi, buf, sizeof(buf)));
return -1;
}
@@ -5593,8 +5560,8 @@ int bgp_evpn_local_es_add(struct bgp *bgp,
struct prefix_evpn p;
if (!bgp->esihash) {
- flog_err(BGP_ERR_ES_CREATE, "%u: ESI hash not yet created",
- bgp->vrf_id);
+ flog_err(EC_BGP_ES_CREATE, "%u: ESI hash not yet created",
+ bgp->vrf_id);
return -1;
}
@@ -5604,7 +5571,7 @@ int bgp_evpn_local_es_add(struct bgp *bgp,
es = bgp_evpn_es_new(bgp, esi, originator_ip);
if (!es) {
flog_err(
- BGP_ERR_ES_CREATE,
+ EC_BGP_ES_CREATE,
"%u: Failed to allocate ES entry for ESI %s - at Local ES Add",
bgp->vrf_id, esi_to_str(esi, buf, sizeof(buf)));
return -1;
@@ -5615,9 +5582,9 @@ int bgp_evpn_local_es_add(struct bgp *bgp,
build_evpn_type4_prefix(&p, esi, originator_ip->ipaddr_v4);
if (update_evpn_type4_route(bgp, es, &p)) {
- flog_err(BGP_ERR_EVPN_ROUTE_CREATE,
- "%u: Type4 route creation failure for ESI %s",
- bgp->vrf_id, esi_to_str(esi, buf, sizeof(buf)));
+ flog_err(EC_BGP_EVPN_ROUTE_CREATE,
+ "%u: Type4 route creation failure for ESI %s",
+ bgp->vrf_id, esi_to_str(esi, buf, sizeof(buf)));
return -1;
}