]> git.proxmox.com Git - mirror_frr.git/commitdiff
zebra: evpn update remote rmac and nexhop
authorChirag Shah <chirag@cumulusnetworks.com>
Mon, 28 Oct 2019 20:47:05 +0000 (13:47 -0700)
committerChirag Shah <chirag@cumulusnetworks.com>
Thu, 7 Nov 2019 18:49:18 +0000 (10:49 -0800)
In symmetric routing case for evpn (type-2/type-5)
routes, nexthop and Router mac fields can change from
the originating VTEP.

At the receiving VTEP, bgp path info may points to different
nexthop IP (nh1->nh2) and Remote MAC remain the same.
When the bgp sync the route with nexthop and RMAC fields.
For the exisitng rmac entry update/replace with the new
nexthop (VTEP) IP in remote rmac db in Zebra.

Similarly, bgp path info may points different Router-mac
(RMAC1->RMAC2) and the nexthop value remains the same.
In this case, update to the new RMAC value for the
existing remote nexthop in the Zebra' nexthop cache db.

Ticket:CM-26917
Reviewed By:CCR-9435
Testing Done:

Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
zebra/zebra_vxlan.c

index 1d2748c8efc3d9a5c54ec89edf5f67c8e62dfcf6..3efb407faecb4e6faa7f3309c914f24a3c3a489d 100644 (file)
@@ -4615,18 +4615,21 @@ static int zl3vni_remote_rmac_add(zebra_l3vni_t *zl3vni, struct ethaddr *rmac,
 {
        char buf[ETHER_ADDR_STRLEN];
        char buf1[INET6_ADDRSTRLEN];
+       char buf2[PREFIX_STRLEN];
        zebra_mac_t *zrmac = NULL;
 
        zrmac = zl3vni_rmac_lookup(zl3vni, rmac);
        if (!zrmac) {
 
+                /* Create the RMAC entry, or update its vtep, if necessary. */
                zrmac = zl3vni_rmac_add(zl3vni, rmac);
                if (!zrmac) {
                        zlog_debug(
-                               "Failed to add RMAC %s L3VNI %u Remote VTEP %s",
+                               "Failed to add RMAC %s L3VNI %u Remote VTEP %s, prefix %s",
                                prefix_mac2str(rmac, buf, sizeof(buf)),
                                zl3vni->vni,
-                               ipaddr2str(vtep_ip, buf1, sizeof(buf1)));
+                               ipaddr2str(vtep_ip, buf1, sizeof(buf1)),
+                               prefix2str(host_prefix, buf2, sizeof(buf2)));
                        return -1;
                }
                memset(&zrmac->fwd_info, 0, sizeof(zrmac->fwd_info));
@@ -4636,6 +4639,21 @@ static int zl3vni_remote_rmac_add(zebra_l3vni_t *zl3vni, struct ethaddr *rmac,
                hook_call(zebra_rmac_update, zrmac, zl3vni, false,
                          "new RMAC added");
 
+               /* install rmac in kernel */
+               zl3vni_rmac_install(zl3vni, zrmac);
+       } else if (!IPV4_ADDR_SAME(&zrmac->fwd_info.r_vtep_ip,
+                                  &vtep_ip->ipaddr_v4)) {
+               if (IS_ZEBRA_DEBUG_VXLAN)
+                       zlog_debug(
+                               "L3VNI %u Remote VTEP change(%s -> %s) for RMAC %s, prefix %s",
+                               zl3vni->vni,
+                               inet_ntoa(zrmac->fwd_info.r_vtep_ip),
+                               ipaddr2str(vtep_ip, buf1, sizeof(buf1)),
+                               prefix_mac2str(rmac, buf, sizeof(buf)),
+                               prefix2str(host_prefix, buf2, sizeof(buf2)));
+
+               zrmac->fwd_info.r_vtep_ip = vtep_ip->ipaddr_v4;
+
                /* install rmac in kernel */
                zl3vni_rmac_install(zl3vni, zrmac);
        }
@@ -4786,24 +4804,39 @@ static int zl3vni_remote_nh_add(zebra_l3vni_t *zl3vni, struct ipaddr *vtep_ip,
                                struct prefix *host_prefix)
 {
        char buf[ETHER_ADDR_STRLEN];
-       char buf1[INET6_ADDRSTRLEN];
+       char buf1[ETHER_ADDR_STRLEN];
+       char buf2[INET6_ADDRSTRLEN];
+       char buf3[PREFIX_STRLEN];
        zebra_neigh_t *nh = NULL;
 
+       /* Create the next hop entry, or update its mac, if necessary. */
        nh = zl3vni_nh_lookup(zl3vni, vtep_ip);
        if (!nh) {
                nh = zl3vni_nh_add(zl3vni, vtep_ip, rmac);
                if (!nh) {
-
                        zlog_debug(
-                               "Failed to add NH as Neigh (IP %s MAC %s L3-VNI %u)",
-                               ipaddr2str(vtep_ip, buf1, sizeof(buf1)),
+                               "Failed to add NH %s as Neigh (RMAC %s L3-VNI %u prefix %s)",
+                               ipaddr2str(vtep_ip, buf1, sizeof(buf2)),
                                prefix_mac2str(rmac, buf, sizeof(buf)),
-                               zl3vni->vni);
+                               zl3vni->vni,
+                               prefix2str(host_prefix, buf2, sizeof(buf2)));
                        return -1;
                }
 
                /* install the nh neigh in kernel */
                zl3vni_nh_install(zl3vni, nh);
+       } else if (memcmp(&nh->emac, rmac, ETH_ALEN) != 0) {
+               if (IS_ZEBRA_DEBUG_VXLAN)
+                       zlog_debug("L3VNI %u RMAC change(%s --> %s) for nexthop %s, prefix %s",
+                                  zl3vni->vni,
+                                  prefix_mac2str(&nh->emac, buf, sizeof(buf)),
+                                  prefix_mac2str(rmac, buf1, sizeof(buf1)),
+                                  ipaddr2str(vtep_ip, buf2, sizeof(buf2)),
+                                  prefix2str(host_prefix, buf3, sizeof(buf3)));
+
+               memcpy(&nh->emac, rmac, ETH_ALEN);
+               /* install (update) the nh neigh in kernel */
+               zl3vni_nh_install(zl3vni, nh);
        }
 
        rb_find_or_add_host(&nh->host_rb, host_prefix);