diff --git a/bgpd/bgp_evpn_mh.c b/bgpd/bgp_evpn_mh.c index 5cca3f210d..0b3e8c89cf 100644 --- a/bgpd/bgp_evpn_mh.c +++ b/bgpd/bgp_evpn_mh.c @@ -1796,8 +1796,8 @@ bgp_evpn_es_find_frag_with_space(struct bgp_evpn_es *es) struct bgp_evpn_es_frag *es_frag; for (ALL_LIST_ELEMENTS_RO(es->es_frag_list, node, es_frag)) { - if (listcount(es_frag->es_evi_frag_list) - < BGP_EVPN_MAX_EVI_PER_ES_FRAG) + if (listcount(es_frag->es_evi_frag_list) < + bgp_mh_info->evi_per_es_frag) return es_frag; } @@ -4989,6 +4989,7 @@ void bgp_evpn_mh_init(void) bgp_mh_info->host_routes_use_l3nhg = BGP_EVPN_MH_USE_ES_L3NHG_DEF; bgp_mh_info->suppress_l3_ecomm_on_inactive_es = true; bgp_mh_info->bgp_evpn_nh_setup = true; + bgp_mh_info->evi_per_es_frag = BGP_EVPN_MAX_EVI_PER_ES_FRAG; memset(&zero_esi_buf, 0, sizeof(esi_t)); } diff --git a/bgpd/bgp_evpn_mh.h b/bgpd/bgp_evpn_mh.h index 7a3a4bde94..d9e2e72e4f 100644 --- a/bgpd/bgp_evpn_mh.h +++ b/bgpd/bgp_evpn_mh.h @@ -341,6 +341,11 @@ struct bgp_evpn_mh_info { * sending the ead-per-es route instead of the L2-VNI(s) RTs */ struct list *ead_es_export_rtl; + + /* Number of EVIs in an ES fragment - used of EAD-per-ES route + * construction + */ + uint32_t evi_per_es_frag; }; /****************************************************************************/ diff --git a/bgpd/bgp_evpn_vty.c b/bgpd/bgp_evpn_vty.c index 4ab188832c..4da3fa8f3b 100644 --- a/bgpd/bgp_evpn_vty.c +++ b/bgpd/bgp_evpn_vty.c @@ -5992,6 +5992,19 @@ DEFUN (no_bgp_evpn_vrf_rt, return CMD_SUCCESS; } +DEFPY(bgp_evpn_ead_ess_frag_evi_limit, bgp_evpn_ead_es_frag_evi_limit_cmd, + "[no$no] ead-es-frag evi-limit (1-1000)$limit", + NO_STR + "EAD ES fragment config\n" + "EVIs per-fragment\n" + "limit\n") +{ + bgp_mh_info->evi_per_es_frag = + no ? BGP_EVPN_MAX_EVI_PER_ES_FRAG : limit; + + return CMD_SUCCESS; +} + DEFUN(bgp_evpn_ead_es_rt, bgp_evpn_ead_es_rt_cmd, "ead-es-route-target export RT", "EAD ES Route Target\n" @@ -6326,6 +6339,10 @@ void bgp_config_write_evpn_info(struct vty *vty, struct bgp *bgp, afi_t afi, if (bgp->resolve_overlay_index) vty_out(vty, " enable-resolve-overlay-index\n"); + if (bgp_mh_info->evi_per_es_frag != BGP_EVPN_MAX_EVI_PER_ES_FRAG) + vty_out(vty, " ead-es-frag evi-limit %u\n", + bgp_mh_info->evi_per_es_frag); + if (bgp_mh_info->host_routes_use_l3nhg != BGP_EVPN_MH_USE_ES_L3NHG_DEF) { if (bgp_mh_info->host_routes_use_l3nhg) @@ -6593,6 +6610,7 @@ void bgp_ethernetvpn_init(void) install_element(BGP_EVPN_NODE, &no_bgp_evpn_vrf_rt_cmd); install_element(BGP_EVPN_NODE, &bgp_evpn_ead_es_rt_cmd); install_element(BGP_EVPN_NODE, &no_bgp_evpn_ead_es_rt_cmd); + install_element(BGP_EVPN_NODE, &bgp_evpn_ead_es_frag_evi_limit_cmd); install_element(BGP_EVPN_VNI_NODE, &bgp_evpn_advertise_svi_ip_vni_cmd); install_element(BGP_EVPN_VNI_NODE, &bgp_evpn_advertise_default_gw_vni_cmd);