X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=bgpd%2Fbgp_evpn_private.h;h=76cf8b2cd618e6990dd8fac3d1bbd0a7d7fa3a98;hb=b6cac82ed9643f8bd6c0644205f5673e4ac8efa0;hp=c7f2671b78377ca2e9c4446044f4a9976f52cbd0;hpb=24864e4497d29a29fc4f940492d199febf5c2f58;p=mirror_frr.git diff --git a/bgpd/bgp_evpn_private.h b/bgpd/bgp_evpn_private.h index c7f2671b7..76cf8b2cd 100644 --- a/bgpd/bgp_evpn_private.h +++ b/bgpd/bgp_evpn_private.h @@ -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 */