]> git.proxmox.com Git - mirror_frr.git/commitdiff
bgpd: handle export rt change for vrf
authorMitesh Kanjariya <mitesh@cumulusnetworks.com>
Mon, 9 Oct 2017 09:06:34 +0000 (02:06 -0700)
committerMitesh Kanjariya <mitesh@marvel-07.cumulusnetworks.com>
Thu, 14 Dec 2017 18:57:05 +0000 (10:57 -0800)
Signed-off-by: Mitesh Kanjariya <mitesh@cumulusnetworks.com>
bgpd/bgp_evpn.c

index b738d0642da6177e8ef8e13d978937439bebcd9a..f93a0e44d4d6cf922d242e691fd5f9b16c06e4b3 100644 (file)
@@ -457,8 +457,11 @@ static void build_evpn_route_extcomm(struct bgpevpn *vpn, struct attr *attr)
 
        /* Add the export RTs for L3VNI */
        vrf_export_rtl = bgpevpn_get_vrf_export_rtl(vpn);
-       for (ALL_LIST_ELEMENTS(vrf_export_rtl, node, nnode, ecom))
-               attr->ecommunity = ecommunity_merge(attr->ecommunity, ecom);
+       if (vrf_export_rtl) {
+               for (ALL_LIST_ELEMENTS(vrf_export_rtl, node, nnode, ecom))
+                       attr->ecommunity = ecommunity_merge(attr->ecommunity,
+                                                           ecom);
+       }
 
        if (attr->sticky) {
                seqnum = 0;
@@ -2147,6 +2150,20 @@ static void evpn_auto_rt_export_delete_for_vrf(struct bgp *bgp_vrf)
        evpn_rt_delete_auto(bgp_vrf, bgp_vrf->l3vni, bgp_vrf->vrf_export_rtl);
 }
 
+static void bgp_evpn_handle_export_rt_change_for_vrf(struct bgp *bgp_vrf)
+{
+       struct bgp *bgp_def = NULL;
+       struct listnode *node = NULL;
+       struct bgpevpn *vpn = NULL;
+
+       bgp_def = bgp_get_default();
+       if (!bgp_def)
+               return;
+
+       for (ALL_LIST_ELEMENTS_RO(bgp_vrf->l2vnis, node, vpn))
+               update_routes_for_vni(bgp_def, vpn);
+}
+
 /*
  * Public functions.
  */
@@ -2229,7 +2246,8 @@ void bgp_evpn_configure_export_rt_for_vrf(struct bgp *bgp_vrf,
        listnode_add_sort(bgp_vrf->vrf_export_rtl, ecomadd);
        SET_FLAG(bgp_vrf->vrf_flags, BGP_VRF_EXPORT_RT_CFGD);
 
-       /* TODO_MITESH: update all routes */
+       bgp_evpn_handle_export_rt_change_for_vrf(bgp_vrf);
+
 }
 
 void bgp_evpn_unconfigure_export_rt_for_vrf(struct bgp *bgp_vrf,
@@ -2256,7 +2274,7 @@ void bgp_evpn_unconfigure_export_rt_for_vrf(struct bgp *bgp_vrf,
                evpn_auto_rt_export_add_for_vrf(bgp_vrf);
        }
 
-       //TODO_MITESH: update all mac-ip routes
+       bgp_evpn_handle_export_rt_change_for_vrf(bgp_vrf);
 }
 
 /*
@@ -2944,6 +2962,8 @@ int bgp_evpn_local_l3vni_add(vni_t l3vni,
 {
        struct bgp *bgp_vrf = NULL; /* bgp VRF instance */
        struct bgp *bgp_def = NULL; /* default bgp instance */
+       struct listnode *node = NULL;
+       struct bgpevpn *vpn = NULL;
        as_t as = 0;
 
        /* get the default instamce - required to get the AS number for VRF
@@ -2998,7 +3018,9 @@ int bgp_evpn_local_l3vni_add(vni_t l3vni,
                        link_l2vni_hash_to_l3vni,
                     bgp_vrf);
 
-       //TODO_MITESH: update all the local mac-ip routes with l3vni/rmac info
+       /* updates all corresponding local mac-ip routes */
+       for (ALL_LIST_ELEMENTS_RO(bgp_vrf->l2vnis, node, vpn))
+               update_routes_for_vni(bgp_def, vpn);
 
        //TODO_MITESH: import all the remote routes to VRF
 
@@ -3009,6 +3031,9 @@ int bgp_evpn_local_l3vni_del(vni_t l3vni,
                             vrf_id_t vrf_id)
 {
        struct bgp *bgp_vrf = NULL; /* bgp vrf instance */
+       struct bgp *bgp_def = NULL; /* default bgp instance */
+       struct listnode *node = NULL;
+       struct bgpevpn *vpn = NULL;
 
        bgp_vrf = bgp_lookup_by_vrf_id(vrf_id);
        if (!bgp_vrf) {
@@ -3017,6 +3042,13 @@ int bgp_evpn_local_l3vni_del(vni_t l3vni,
                return -1;
        }
 
+       bgp_def = bgp_get_default();
+       if (!bgp_def) {
+               zlog_err("Cannot process L3VNI %u Del - Could not find default BGP instance",
+                        l3vni);
+               return -1;
+       }
+
        /* remove the l3vni from vrf instance */
        bgp_vrf->l3vni = 0;
 
@@ -3029,7 +3061,9 @@ int bgp_evpn_local_l3vni_del(vni_t l3vni,
        if (bgp_vrf->vrf_export_rtl && !list_isempty(bgp_vrf->vrf_export_rtl))
                list_delete(bgp_vrf->vrf_export_rtl);
 
-       /* TODO_MITESH: update all local mac-ip routes */
+       /* update all corresponding local mac-ip routes */
+       for (ALL_LIST_ELEMENTS_RO(bgp_vrf->l2vnis, node, vpn))
+               update_routes_for_vni(bgp_def, vpn);
 
        /* TODO_MITESH: unimport remote routes from VRF */