]> git.proxmox.com Git - mirror_frr.git/blobdiff - zebra/zebra_vxlan_private.h
Merge pull request #13403 from anlancs/fix/zebra-missing-vrf-flag
[mirror_frr.git] / zebra / zebra_vxlan_private.h
index 0556c4adced13b03c1eb6f92425307772b9a974c..002fc7db832c7b80b1ec8cc7b05e5b35969f697c 100644 (file)
@@ -1,24 +1,8 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
 /*
  * Zebra VxLAN (EVPN) Data structures and definitions
  * These are "internal" to this function.
  * Copyright (C) 2016, 2017 Cumulus Networks, Inc.
- *
- * This file is part of FRR.
- *
- * FRR is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2, or (at your option) any
- * later version.
- *
- * FRR is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with FRR; see the file COPYING.  If not, write to the Free
- * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
  */
 
 #ifndef _ZEBRA_VXLAN_PRIVATE_H
@@ -29,6 +13,7 @@
 #include "if.h"
 #include "linklist.h"
 #include "zebra_vxlan.h"
+#include "zebra_vxlan_if.h"
 #include "zebra_evpn.h"
 #include "zebra_evpn_mac.h"
 
@@ -38,12 +23,8 @@ extern "C" {
 
 #define ERR_STR_SZ 256
 
-/* definitions */
-typedef struct zebra_l3vni_t_ zebra_l3vni_t;
-
-
 /* L3 VNI hash table */
-struct zebra_l3vni_t_ {
+struct zebra_l3vni {
 
        /* VNI key */
        vni_t vni;
@@ -54,6 +35,10 @@ struct zebra_l3vni_t_ {
        uint32_t filter;
 #define PREFIX_ROUTES_ONLY     (1 << 0) /* l3-vni used for prefix routes only */
 
+       /* Corresponding Bridge information */
+       vlanid_t vid;
+       struct interface *bridge_if;
+
        /* Local IP */
        struct in_addr local_vtep_ip;
 
@@ -75,26 +60,30 @@ struct zebra_l3vni_t_ {
        struct hash *nh_table;
 };
 
+#define IS_ZL3VNI_SVD_BACKED(zl3vni)                                           \
+       (zl3vni->vxlan_if && zl3vni->vxlan_if->info &&                         \
+        IS_ZEBRA_VXLAN_IF_SVD((struct zebra_if *)zl3vni->vxlan_if->info))
+
 /* get the vx-intf name for l3vni */
-static inline const char *zl3vni_vxlan_if_name(zebra_l3vni_t *zl3vni)
+static inline const char *zl3vni_vxlan_if_name(struct zebra_l3vni *zl3vni)
 {
        return zl3vni->vxlan_if ? zl3vni->vxlan_if->name : "None";
 }
 
 /* get the svi intf name for l3vni */
-static inline const char *zl3vni_svi_if_name(zebra_l3vni_t *zl3vni)
+static inline const char *zl3vni_svi_if_name(struct zebra_l3vni *zl3vni)
 {
        return zl3vni->svi_if ? zl3vni->svi_if->name : "None";
 }
 
 /* get the vrf name for l3vni */
-static inline const char *zl3vni_vrf_name(zebra_l3vni_t *zl3vni)
+static inline const char *zl3vni_vrf_name(struct zebra_l3vni *zl3vni)
 {
        return vrf_id_to_name(zl3vni->vrf_id);
 }
 
 /* get the rmac string */
-static inline const char *zl3vni_rmac2str(zebra_l3vni_t *zl3vni, char *buf,
+static inline const char *zl3vni_rmac2str(struct zebra_l3vni *zl3vni, char *buf,
                                          int size)
 {
        char *ptr;
@@ -131,8 +120,8 @@ static inline const char *zl3vni_rmac2str(zebra_l3vni_t *zl3vni, char *buf,
 }
 
 /* get the sys mac string */
-static inline const char *zl3vni_sysmac2str(zebra_l3vni_t *zl3vni, char *buf,
-                                           int size)
+static inline const char *zl3vni_sysmac2str(struct zebra_l3vni *zl3vni,
+                                           char *buf, int size)
 {
        char *ptr;
 
@@ -166,14 +155,14 @@ static inline const char *zl3vni_sysmac2str(zebra_l3vni_t *zl3vni, char *buf,
  * 3. it is associated to an SVI
  * 4. associated SVI is oper up
  */
-static inline int is_l3vni_oper_up(zebra_l3vni_t *zl3vni)
+static inline int is_l3vni_oper_up(struct zebra_l3vni *zl3vni)
 {
        return (is_evpn_enabled() && zl3vni && (zl3vni->vrf_id != VRF_UNKNOWN)
                && zl3vni->vxlan_if && if_is_operative(zl3vni->vxlan_if)
                && zl3vni->svi_if && if_is_operative(zl3vni->svi_if));
 }
 
-static inline const char *zl3vni_state2str(zebra_l3vni_t *zl3vni)
+static inline const char *zl3vni_state2str(struct zebra_l3vni *zl3vni)
 {
        if (!zl3vni)
                return NULL;
@@ -186,12 +175,12 @@ static inline const char *zl3vni_state2str(zebra_l3vni_t *zl3vni)
        return NULL;
 }
 
-static inline vrf_id_t zl3vni_vrf_id(zebra_l3vni_t *zl3vni)
+static inline vrf_id_t zl3vni_vrf_id(struct zebra_l3vni *zl3vni)
 {
        return zl3vni->vrf_id;
 }
 
-static inline void zl3vni_get_svi_rmac(zebra_l3vni_t *zl3vni,
+static inline void zl3vni_get_svi_rmac(struct zebra_l3vni *zl3vni,
                                       struct ethaddr *rmac)
 {
        if (!zl3vni)
@@ -208,8 +197,8 @@ static inline void zl3vni_get_svi_rmac(zebra_l3vni_t *zl3vni,
 /* context for neigh hash walk - update l3vni and rmac */
 struct neigh_l3info_walk_ctx {
 
-       zebra_evpn_t *zevpn;
-       zebra_l3vni_t *zl3vni;
+       struct zebra_evpn *zevpn;
+       struct zebra_l3vni *zl3vni;
        int add;
 };
 
@@ -219,14 +208,17 @@ struct nh_walk_ctx {
        struct json_object *json;
 };
 
-extern zebra_l3vni_t *zl3vni_from_vrf(vrf_id_t vrf_id);
-extern struct interface *zl3vni_map_to_vxlan_if(zebra_l3vni_t *zl3vni);
-extern struct interface *zl3vni_map_to_svi_if(zebra_l3vni_t *zl3vni);
-extern struct interface *zl3vni_map_to_mac_vlan_if(zebra_l3vni_t *zl3vni);
-extern zebra_l3vni_t *zl3vni_lookup(vni_t vni);
+extern struct zebra_l3vni *zl3vni_from_vrf(vrf_id_t vrf_id);
+extern struct interface *zl3vni_map_to_vxlan_if(struct zebra_l3vni *zl3vni);
+extern struct interface *zl3vni_map_to_svi_if(struct zebra_l3vni *zl3vni);
+extern struct interface *zl3vni_map_to_mac_vlan_if(struct zebra_l3vni *zl3vni);
+extern struct zebra_l3vni *zl3vni_lookup(vni_t vni);
+extern vni_t vni_id_from_svi(struct interface *ifp, struct interface *br_if);
 
-DECLARE_HOOK(zebra_rmac_update, (zebra_mac_t *rmac, zebra_l3vni_t *zl3vni,
-            bool delete, const char *reason), (rmac, zl3vni, delete, reason));
+DECLARE_HOOK(zebra_rmac_update,
+            (struct zebra_mac * rmac, struct zebra_l3vni *zl3vni, bool delete,
+             const char *reason),
+            (rmac, zl3vni, delete, reason));
 
 
 #ifdef __cplusplus
@@ -244,7 +236,7 @@ DECLARE_HOOK(zebra_rmac_update, (zebra_mac_t *rmac, zebra_l3vni_t *zl3vni,
  * an aggregated table that pimd can consume without much
  * re-interpretation.
  */
-typedef struct zebra_vxlan_sg_ {
+struct zebra_vxlan_sg {
        struct zebra_vrf *zvrf;
 
        struct prefix_sg sg;
@@ -253,11 +245,20 @@ typedef struct zebra_vxlan_sg_ {
        /* For SG - num of L2 VNIs using this entry for sending BUM traffic */
        /* For XG - num of SG using this as parent */
        uint32_t ref_cnt;
-} zebra_vxlan_sg_t;
+};
 
-extern zebra_evpn_t *zevpn_lookup(vni_t vni);
-extern void zebra_vxlan_sync_mac_dp_install(zebra_mac_t *mac, bool set_inactive,
-               bool force_clear_static, const char *caller);
+extern struct zebra_evpn *zevpn_lookup(vni_t vni);
+extern void zebra_vxlan_sync_mac_dp_install(struct zebra_mac *mac,
+                                           bool set_inactive,
+                                           bool force_clear_static,
+                                           const char *caller);
 extern bool zebra_evpn_do_dup_addr_detect(struct zebra_vrf *zvrf);
+extern void zebra_vxlan_sg_ref(struct in_addr local_vtep_ip,
+                              struct in_addr mcast_grp);
+extern void zebra_vxlan_sg_deref(struct in_addr local_vtep_ip,
+                                struct in_addr mcast_grp);
+extern void zebra_vxlan_process_l3vni_oper_up(struct zebra_l3vni *zl3vni);
+extern void zebra_vxlan_process_l3vni_oper_down(struct zebra_l3vni *zl3vni);
+extern int zebra_evpn_vxlan_del(struct zebra_evpn *zevpn);
 
 #endif /* _ZEBRA_VXLAN_PRIVATE_H */