]> git.proxmox.com Git - mirror_frr.git/blobdiff - bgpd/bgp_evpn_private.h
Merge pull request #3394 from karamalla0406/frr3360
[mirror_frr.git] / bgpd / bgp_evpn_private.h
index bafe81b253756034757f89040fdcf4b96bc41560..43b1f05b3db49fa94b3ea141a0be580850729e96 100644 (file)
@@ -106,8 +106,10 @@ struct evpnes {
 #define EVPNES_LOCAL   0x01
 #define EVPNES_REMOTE  0x02
 
-       /* Id for deriving the RD
-        * automatically for this ESI */
+       /*
+        * Id for deriving the RD
+        * automatically for this ESI
+        */
        uint16_t rd_id;
 
        /* RD for this VNI. */
@@ -119,8 +121,10 @@ struct evpnes {
        /* list of VTEPs in the same site */
        struct list *vtep_list;
 
-       /* Route table for EVPN routes for
-        * this ESI. - type4 routes */
+       /*
+        * Route table for EVPN routes for
+        * this ESI. - type4 routes
+        */
        struct bgp_table *route_table;
 
        QOBJ_FIELDS
@@ -157,6 +161,24 @@ struct vrf_irt_node {
 #define RT_TYPE_EXPORT 2
 #define RT_TYPE_BOTH   3
 
+#define EVPN_DAD_DEFAULT_TIME 180 /* secs */
+#define EVPN_DAD_DEFAULT_MAX_MOVES 5 /* default from RFC 7432 */
+#define EVPN_DAD_DEFAULT_AUTO_RECOVERY_TIME 1800 /* secs */
+
+struct bgp_evpn_info {
+       /* enable disable dup detect */
+       bool dup_addr_detect;
+
+       /* Detection time(M) */
+       int dad_time;
+       /* Detection max moves(N) */
+       uint32_t dad_max_moves;
+       /* Permanent freeze */
+       bool dad_freeze;
+       /* Recovery time */
+       uint32_t dad_freeze_time;
+};
+
 static inline int is_vrf_rd_configured(struct bgp *bgp_vrf)
 {
        return (CHECK_FLAG(bgp_vrf->vrf_flags, BGP_VRF_RD_CFGD));
@@ -307,6 +329,16 @@ static inline void encode_mac_mobility_extcomm(int static_mac, uint32_t seq,
        eval->val[7] = seq & 0xff;
 }
 
+static inline void encode_na_flag_extcomm(struct ecommunity_val *eval,
+                                         uint8_t na_flag)
+{
+       memset(eval, 0, sizeof(*eval));
+       eval->val[0] = ECOMMUNITY_ENCODE_EVPN;
+       eval->val[1] = ECOMMUNITY_EVPN_SUBTYPE_ND;
+       if (na_flag)
+               eval->val[2] |= ECOMMUNITY_EVPN_SUBTYPE_ND_ROUTER_FLAG;
+}
+
 static inline void ip_prefix_from_type5_prefix(struct prefix_evpn *evp,
                                               struct prefix *ip)
 {
@@ -324,7 +356,7 @@ static inline void ip_prefix_from_type5_prefix(struct prefix_evpn *evp,
        }
 }
 
-static inline int is_evpn_prefix_default(struct prefix *evp)
+static inline int is_evpn_prefix_default(const struct prefix *evp)
 {
        if (evp->family != AF_EVPN)
                return 0;
@@ -440,8 +472,9 @@ static inline int evpn_default_originate_set(struct bgp *bgp, afi_t afi,
 static inline void es_get_system_mac(esi_t *esi,
                                     struct ethaddr *mac)
 {
-       /* for type-1 and type-3 ESIs,
-          the system mac starts at val[1]
+       /*
+        * for type-1 and type-3 ESIs,
+        * the system mac starts at val[1]
         */
        memcpy(mac, &esi->val[1], ETH_ALEN);
 }
@@ -451,6 +484,9 @@ static inline int is_es_local(struct evpnes *es)
        return CHECK_FLAG(es->flags, EVPNES_LOCAL) ? 1 : 0;
 }
 
+extern void bgp_evpn_install_uninstall_default_route(struct bgp *bgp_vrf,
+                                                    afi_t afi, safi_t safi,
+                                                    bool add);
 extern void evpn_rt_delete_auto(struct bgp *, vni_t, struct list *);
 extern void bgp_evpn_configure_export_rt_for_vrf(struct bgp *bgp_vrf,
                                                 struct ecommunity *ecomadd);
@@ -488,4 +524,5 @@ 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);
 #endif /* _BGP_EVPN_PRIVATE_H */