]> git.puffer.fish Git - matthieu/frr.git/commitdiff
bgpd: Use BGP_ROUTE_IMPORTED for EVPN
authorvivek <vivek@cumulusnetworks.com>
Fri, 16 Mar 2018 23:22:17 +0000 (23:22 +0000)
committervivek <vivek@cumulusnetworks.com>
Fri, 16 Mar 2018 23:22:17 +0000 (23:22 +0000)
Set EVPN routes imported into a VRF to (sub)type BGP_ROUTE_IMPORTED and
use this for passing appropriate information to zebra. This is needed
because relying on the Router MAC for this purpose was incorrect and
impacted routing to/from external destinations, particularly for IPv6.

Signed-off-by: Vivek Venkatraman <vivek@cumulusnetworks.com>
bgpd/bgp_evpn.c
bgpd/bgp_route.c
bgpd/bgp_zebra.c

index 94d9cb465be9c5c3c9fa0ef11bd10e36c19b92f6..aa4036851147313a2085ffa77e127dbefb65f4eb 100644 (file)
@@ -865,7 +865,7 @@ static int evpn_route_select_install(struct bgp *bgp, struct bgpevpn *vpn,
         */
        if (old_select && old_select == new_select
            && old_select->type == ZEBRA_ROUTE_BGP
-           && old_select->sub_type == BGP_ROUTE_NORMAL
+           && old_select->sub_type == BGP_ROUTE_IMPORTED
            && !CHECK_FLAG(rn->flags, BGP_NODE_USER_CLEAR)
            && !CHECK_FLAG(old_select->flags, BGP_INFO_ATTR_CHANGED)
            && !bgp->addpath_tx_used[afi][safi]) {
@@ -901,7 +901,7 @@ static int evpn_route_select_install(struct bgp *bgp, struct bgpevpn *vpn,
        }
 
        if (new_select && new_select->type == ZEBRA_ROUTE_BGP
-           && new_select->sub_type == BGP_ROUTE_NORMAL) {
+           && new_select->sub_type == BGP_ROUTE_IMPORTED) {
                flags = 0;
                if (new_select->attr->sticky)
                        SET_FLAG(flags, ZEBRA_MACIP_TYPE_STICKY);
@@ -922,7 +922,7 @@ static int evpn_route_select_install(struct bgp *bgp, struct bgpevpn *vpn,
                        evpn_delete_old_local_route(bgp, vpn, rn, old_select);
        } else {
                if (old_select && old_select->type == ZEBRA_ROUTE_BGP
-                   && old_select->sub_type == BGP_ROUTE_NORMAL)
+                   && old_select->sub_type == BGP_ROUTE_IMPORTED)
                        ret = evpn_zebra_uninstall(bgp, vpn,
                                                   (struct prefix_evpn *)&rn->p,
                                                   old_select->attr->nexthop);
@@ -1142,7 +1142,7 @@ static int update_evpn_route_entry(struct bgp *bgp, struct bgpevpn *vpn,
                        local_ri = tmp_ri;
                if (vni_table) {
                        if (tmp_ri->type == ZEBRA_ROUTE_BGP
-                           && tmp_ri->sub_type == BGP_ROUTE_NORMAL
+                           && tmp_ri->sub_type == BGP_ROUTE_IMPORTED
                            && CHECK_FLAG(tmp_ri->flags, BGP_INFO_VALID)) {
                                if (!remote_ri)
                                        remote_ri = tmp_ri;
@@ -1843,7 +1843,7 @@ static int install_evpn_route_entry_in_vrf(struct bgp *bgp_vrf,
                attr_new = bgp_attr_intern(&attr);
 
                /* Create new route with its attribute. */
-               ri = info_make(parent_ri->type, parent_ri->sub_type, 0,
+               ri = info_make(parent_ri->type, BGP_ROUTE_IMPORTED, 0,
                               parent_ri->peer, attr_new, rn);
                SET_FLAG(ri->flags, BGP_INFO_VALID);
                bgp_info_extra_get(ri);
@@ -1915,7 +1915,7 @@ static int install_evpn_route_entry(struct bgp *bgp, struct bgpevpn *vpn,
                attr_new = bgp_attr_intern(parent_ri->attr);
 
                /* Create new route with its attribute. */
-               ri = info_make(parent_ri->type, parent_ri->sub_type, 0,
+               ri = info_make(parent_ri->type, BGP_ROUTE_IMPORTED, 0,
                               parent_ri->peer, attr_new, rn);
                SET_FLAG(ri->flags, BGP_INFO_VALID);
                bgp_info_extra_get(ri);
index 032b33229cdec58b92a89b08990c064925f4a9b3..ee6e4c0e142a2fac3f381fa218bad7721b615c30 100644 (file)
@@ -557,7 +557,8 @@ static int bgp_info_cmp(struct bgp *bgp, struct bgp_info *new,
         *  - BGP_ROUTE_AGGREGATE
         *  - BGP_ROUTE_REDISTRIBUTE
         */
-       if (!(new->sub_type == BGP_ROUTE_NORMAL)) {
+       if (!(new->sub_type == BGP_ROUTE_NORMAL ||
+             new->sub_type == BGP_ROUTE_IMPORTED)) {
                if (debug)
                        zlog_debug(
                                "%s: %s wins over %s due to preferred BGP_ROUTE type",
@@ -565,7 +566,8 @@ static int bgp_info_cmp(struct bgp *bgp, struct bgp_info *new,
                return 1;
        }
 
-       if (!(exist->sub_type == BGP_ROUTE_NORMAL)) {
+       if (!(exist->sub_type == BGP_ROUTE_NORMAL ||
+             new->sub_type == BGP_ROUTE_IMPORTED)) {
                if (debug)
                        zlog_debug(
                                "%s: %s loses to %s due to preferred BGP_ROUTE type",
index 22284fd28d9bd294930c10988008ee93574982be..c4d19215f331aa63338ff9cbcf06aefe7fb30237 100644 (file)
@@ -1043,7 +1043,7 @@ void bgp_zebra_announce(struct bgp_node *rn, struct prefix *p,
         * Currently presence of rmac in attr denotes
         * this is an EVPN type-2 route
         */
-       if (!is_zero_mac(&(info->attr->rmac)))
+       if (info->sub_type == BGP_ROUTE_IMPORTED)
                SET_FLAG(api.flags, ZEBRA_FLAG_EVPN_ROUTE);
 
        if (peer->sort == BGP_PEER_IBGP || peer->sort == BGP_PEER_CONFED
@@ -1349,7 +1349,7 @@ void bgp_zebra_withdraw(struct prefix *p, struct bgp_info *info, safi_t safi)
         * Currently presence of rmac in attr denotes
         * this is an EVPN type-2 route
         */
-       if (!is_zero_mac(&(info->attr->rmac)))
+       if (info->sub_type == BGP_ROUTE_IMPORTED)
                SET_FLAG(api.flags, ZEBRA_FLAG_EVPN_ROUTE);
 
        if (peer->sort == BGP_PEER_IBGP) {