]> git.proxmox.com Git - mirror_frr.git/blobdiff - zebra/zebra_vxlan.c
Merge pull request #4294 from adharkar/frr-master-fpm_rmac
[mirror_frr.git] / zebra / zebra_vxlan.c
index abd076bc829242c8fec740d88f6af626802b93a2..4289f4b6fa444d5c21ae256a7dc246eca5b22f19 100644 (file)
@@ -60,6 +60,9 @@ DEFINE_MTYPE_STATIC(ZEBRA, MAC, "VNI MAC");
 DEFINE_MTYPE_STATIC(ZEBRA, NEIGH, "VNI Neighbor");
 DEFINE_MTYPE_STATIC(ZEBRA, ZVXLAN_SG, "zebra VxLAN multicast group");
 
+DEFINE_HOOK(zebra_rmac_update, (zebra_mac_t *rmac, zebra_l3vni_t *zl3vni,
+           bool delete, const char *reason), (rmac, zl3vni, delete, reason))
+
 /* definitions */
 /* PMSI strings. */
 #define VXLAN_FLOOD_STR_NO_INFO "-"
@@ -143,8 +146,6 @@ static zebra_l3vni_t *zl3vni_lookup(vni_t vni);
 static void *zl3vni_alloc(void *p);
 static zebra_l3vni_t *zl3vni_add(vni_t vni, vrf_id_t vrf_id);
 static int zl3vni_del(zebra_l3vni_t *zl3vni);
-static struct interface *zl3vni_map_to_svi_if(zebra_l3vni_t *zl3vni);
-static struct interface *zl3vni_map_to_vxlan_if(zebra_l3vni_t *zl3vni);
 static void zebra_vxlan_process_l3vni_oper_up(zebra_l3vni_t *zl3vni);
 static void zebra_vxlan_process_l3vni_oper_down(zebra_l3vni_t *zl3vni);
 
@@ -4463,6 +4464,10 @@ static int zl3vni_remote_rmac_add(zebra_l3vni_t *zl3vni, struct ethaddr *rmac,
                memset(&zrmac->fwd_info, 0, sizeof(zrmac->fwd_info));
                zrmac->fwd_info.r_vtep_ip = vtep_ip->ipaddr_v4;
 
+               /* Send RMAC for FPM processing */
+               hook_call(zebra_rmac_update, zrmac, zl3vni, false,
+                         "new RMAC added");
+
                /* install rmac in kernel */
                zl3vni_rmac_install(zl3vni, zrmac);
        }
@@ -4483,6 +4488,10 @@ static void zl3vni_remote_rmac_del(zebra_l3vni_t *zl3vni, zebra_mac_t *zrmac,
                /* uninstall from kernel */
                zl3vni_rmac_uninstall(zl3vni, zrmac);
 
+               /* Send RMAC for FPM processing */
+               hook_call(zebra_rmac_update, zrmac, zl3vni, true,
+                         "RMAC deleted");
+
                /* del the rmac entry */
                zl3vni_rmac_del(zl3vni, zrmac);
        }
@@ -4794,7 +4803,7 @@ static int zl3vni_del(zebra_l3vni_t *zl3vni)
        return 0;
 }
 
-static struct interface *zl3vni_map_to_vxlan_if(zebra_l3vni_t *zl3vni)
+struct interface *zl3vni_map_to_vxlan_if(zebra_l3vni_t *zl3vni)
 {
        struct zebra_ns *zns = NULL;
        struct route_node *rn = NULL;
@@ -4825,7 +4834,7 @@ static struct interface *zl3vni_map_to_vxlan_if(zebra_l3vni_t *zl3vni)
        return NULL;
 }
 
-static struct interface *zl3vni_map_to_svi_if(zebra_l3vni_t *zl3vni)
+struct interface *zl3vni_map_to_svi_if(zebra_l3vni_t *zl3vni)
 {
        struct zebra_if *zif = NULL;       /* zebra_if for vxlan_if */
        struct zebra_l2info_vxlan *vxl = NULL; /* l2 info for vxlan_if */
@@ -5093,6 +5102,10 @@ static void zl3vni_del_rmac_hash_entry(struct hash_bucket *bucket, void *ctx)
        zrmac = (zebra_mac_t *)bucket->data;
        zl3vni = (zebra_l3vni_t *)ctx;
        zl3vni_rmac_uninstall(zl3vni, zrmac);
+
+       /* Send RMAC for FPM processing */
+       hook_call(zebra_rmac_update, zrmac, zl3vni, true, "RMAC deleted");
+
        zl3vni_rmac_del(zl3vni, zrmac);
 }