]> git.proxmox.com Git - mirror_frr.git/blobdiff - bgpd/bgp_evpn.h
Merge pull request #5703 from ton31337/feature/limit_outgoing_prefixes
[mirror_frr.git] / bgpd / bgp_evpn.h
index c2fed76a0a21624513f60b2ef07536c782595db8..b030f0a33ec811d0b053d5756249272f72afdcca 100644 (file)
 #define EVPN_ROUTE_STRLEN 200 /* Must be >> MAC + IPv6 strings. */
 #define EVPN_AUTORT_VXLAN 0x10000000
 
+#define EVPN_ENABLED(bgp)  (bgp)->advertise_all_vni
 static inline int is_evpn_enabled(void)
 {
        struct bgp *bgp = NULL;
 
-       bgp = bgp_get_default();
-       return bgp ? bgp->advertise_all_vni : 0;
+       bgp = bgp_get_evpn();
+       return bgp ? EVPN_ENABLED(bgp) : 0;
 }
 
 static inline void vni2label(vni_t vni, mpls_label_t *label)
@@ -88,8 +89,13 @@ static inline int is_route_parent_evpn(struct bgp_path_info *ri)
            !ri->extra->parent)
                return 0;
 
-       /* See if the parent is of family L2VPN/EVPN */
-       parent_ri = (struct bgp_path_info *)ri->extra->parent;
+       /* Determine parent recursively */
+       for (parent_ri = ri->extra->parent;
+            parent_ri->extra && parent_ri->extra->parent;
+            parent_ri = parent_ri->extra->parent)
+               ;
+
+       /* See if of family L2VPN/EVPN */
        rn = parent_ri->net;
        if (!rn)
                return 0;
@@ -107,6 +113,32 @@ static inline bool is_pi_family_evpn(struct bgp_path_info *pi)
        return is_pi_family_matching(pi, AFI_L2VPN, SAFI_EVPN);
 }
 
+/* Flag if the route is injectable into EVPN. This would be either a
+ * non-imported route or a non-EVPN imported route.
+ */
+static inline bool is_route_injectable_into_evpn(struct bgp_path_info *pi)
+{
+       struct bgp_path_info *parent_pi;
+       struct bgp_table *table;
+       struct bgp_node *rn;
+
+       if (pi->sub_type != BGP_ROUTE_IMPORTED ||
+           !pi->extra ||
+           !pi->extra->parent)
+               return true;
+
+       parent_pi = (struct bgp_path_info *)pi->extra->parent;
+       rn = parent_pi->net;
+       if (!rn)
+               return true;
+       table = bgp_node_table(rn);
+       if (table &&
+           table->afi == AFI_L2VPN &&
+           table->safi == SAFI_EVPN)
+               return false;
+       return true;
+}
+
 extern void bgp_evpn_advertise_type5_route(struct bgp *bgp_vrf,
                                           struct prefix *p,
                                           struct attr *src_attr, afi_t afi,
@@ -142,12 +174,15 @@ extern int bgp_evpn_local_macip_add(struct bgp *bgp, vni_t vni,
                                    uint8_t flags, uint32_t seq);
 extern int bgp_evpn_local_l3vni_add(vni_t vni, vrf_id_t vrf_id,
                                    struct ethaddr *rmac,
-                                   struct in_addr originator_ip, int filter);
+                                   struct ethaddr *vrr_rmac,
+                                   struct in_addr originator_ip, int filter,
+                                   ifindex_t svi_ifindex, bool is_anycast_mac);
 extern int bgp_evpn_local_l3vni_del(vni_t vni, vrf_id_t vrf_id);
 extern int bgp_evpn_local_vni_del(struct bgp *bgp, vni_t vni);
 extern int bgp_evpn_local_vni_add(struct bgp *bgp, vni_t vni,
                                  struct in_addr originator_ip,
-                                 vrf_id_t tenant_vrf_id);
+                                 vrf_id_t tenant_vrf_id,
+                                 struct in_addr mcast_grp);
 extern int bgp_evpn_local_es_add(struct bgp *bgp, esi_t *esi,
                                 struct ipaddr *originator_ip);
 extern int bgp_evpn_local_es_del(struct bgp *bgp, esi_t *esi,
@@ -156,5 +191,8 @@ extern void bgp_evpn_flood_control_change(struct bgp *bgp);
 extern void bgp_evpn_cleanup_on_disable(struct bgp *bgp);
 extern void bgp_evpn_cleanup(struct bgp *bgp);
 extern void bgp_evpn_init(struct bgp *bgp);
+extern int bgp_evpn_get_type5_prefixlen(struct prefix *pfx);
+extern bool bgp_evpn_is_prefix_nht_supported(struct prefix *pfx);
+extern void update_advertise_vrf_routes(struct bgp *bgp_vrf);
 
 #endif /* _QUAGGA_BGP_EVPN_H */