]> git.proxmox.com Git - mirror_frr.git/blobdiff - bgpd/bgp_evpn_private.h
Merge pull request #5703 from ton31337/feature/limit_outgoing_prefixes
[mirror_frr.git] / bgpd / bgp_evpn_private.h
index c7f2671b78377ca2e9c4446044f4a9976f52cbd0..76cf8b2cd618e6990dd8fac3d1bbd0a7d7fa3a98 100644 (file)
@@ -30,8 +30,9 @@
 
 #define RT_ADDRSTRLEN 28
 
-/* EVPN prefix lengths. This reprsent the sizeof struct prefix_evpn  */
-#define EVPN_ROUTE_PREFIXLEN     224
+/* EVPN prefix lengths. This represents the sizeof struct evpn_addr
+ * in bits  */
+#define EVPN_ROUTE_PREFIXLEN (sizeof(struct evpn_addr) * 8)
 
 /* EVPN route types. */
 typedef enum {
@@ -86,6 +87,9 @@ struct bgpevpn {
        /* Route type 3 field */
        struct in_addr originator_ip;
 
+       /* PIM-SM MDT group for BUM flooding */
+       struct in_addr mcast_grp;
+
        /* Import and Export RTs. */
        struct list *import_rtl;
        struct list *export_rtl;
@@ -184,6 +188,16 @@ struct bgp_evpn_info {
        /* EVPN enable - advertise svi macip routes */
        int advertise_svi_macip;
 
+       /* PIP feature knob */
+       bool advertise_pip;
+       /* PIP IP (sys ip) */
+       struct in_addr pip_ip;
+       struct in_addr pip_ip_static;
+       /* PIP MAC (sys MAC) */
+       struct ethaddr pip_rmac;
+       struct ethaddr pip_rmac_static;
+       struct ethaddr pip_rmac_zebra;
+       bool is_anycast_mac;
 };
 
 static inline int is_vrf_rd_configured(struct bgp *bgp_vrf)
@@ -236,6 +250,7 @@ static inline void bgpevpn_unlink_from_l3vni(struct bgpevpn *vpn)
        listnode_delete(vpn->bgp_vrf->l2vnis, vpn);
 
        /* remove the backpointer to the vrf instance */
+       bgp_unlock(vpn->bgp_vrf);
        vpn->bgp_vrf = NULL;
 }
 
@@ -252,7 +267,7 @@ static inline void bgpevpn_link_to_l3vni(struct bgpevpn *vpn)
                return;
 
        /* associate the vpn to the bgp_vrf instance */
-       vpn->bgp_vrf = bgp_vrf;
+       vpn->bgp_vrf = bgp_lock(bgp_vrf);
        listnode_add_sort(bgp_vrf->l2vnis, vpn);
 
        /* check if we are advertising two labels for this vpn */
@@ -270,6 +285,11 @@ static inline int is_vni_live(struct bgpevpn *vpn)
        return (CHECK_FLAG(vpn->flags, VNI_FLAG_LIVE));
 }
 
+static inline int is_l3vni_live(struct bgp *bgp_vrf)
+{
+       return (bgp_vrf->l3vni && bgp_vrf->l3vni_svi_ifindex);
+}
+
 static inline int is_rd_configured(struct bgpevpn *vpn)
 {
        return (CHECK_FLAG(vpn->flags, VNI_FLAG_RD_CFGD));
@@ -491,6 +511,16 @@ static inline int is_es_local(struct evpnes *es)
        return CHECK_FLAG(es->flags, EVPNES_LOCAL) ? 1 : 0;
 }
 
+static inline bool bgp_evpn_is_svi_macip_enabled(struct bgpevpn *vpn)
+{
+       struct bgp *bgp_evpn = NULL;
+
+       bgp_evpn = bgp_get_evpn();
+
+       return (bgp_evpn->evpn_info->advertise_svi_macip ||
+               vpn->advertise_svi_macip);
+}
+
 extern void bgp_evpn_install_uninstall_default_route(struct bgp *bgp_vrf,
                                                     afi_t afi, safi_t safi,
                                                     bool add);
@@ -524,12 +554,14 @@ extern void bgp_evpn_derive_auto_rd(struct bgp *bgp, struct bgpevpn *vpn);
 extern void bgp_evpn_derive_auto_rd_for_vrf(struct bgp *bgp);
 extern struct bgpevpn *bgp_evpn_lookup_vni(struct bgp *bgp, vni_t vni);
 extern struct bgpevpn *bgp_evpn_new(struct bgp *bgp, vni_t vni,
-                                   struct in_addr originator_ip,
-                                   vrf_id_t tenant_vrf_id);
+               struct in_addr originator_ip,
+               vrf_id_t tenant_vrf_id,
+               struct in_addr mcast_grp);
 extern void bgp_evpn_free(struct bgp *bgp, struct bgpevpn *vpn);
 extern struct evpnes *bgp_evpn_lookup_es(struct bgp *bgp, esi_t *esi);
 extern struct evpnes *bgp_evpn_es_new(struct bgp *bgp, esi_t *esi,
                                      struct ipaddr *originator_ip);
 extern void bgp_evpn_es_free(struct bgp *bgp, struct evpnes *es);
 extern bool bgp_evpn_lookup_l3vni_l2vni_table(vni_t vni);
+extern int update_routes_for_vni(struct bgp *bgp, struct bgpevpn *vpn);
 #endif /* _BGP_EVPN_PRIVATE_H */