@@ -68,6 +68,8 @@ esi_t zero_esi_buf, *zero_esi = &zero_esi_buf;
68
68
static void bgp_evpn_run_consistency_checks (struct event * t );
69
69
static void bgp_evpn_path_nh_info_free (struct bgp_path_evpn_nh_info * nh_info );
70
70
static void bgp_evpn_path_nh_unlink (struct bgp_path_evpn_nh_info * nh_info );
71
+ static void bgp_evpn_es_vrf_delete (struct bgp_evpn_es_vrf * es_vrf );
72
+ static struct bgp_evpn_es_evi * bgp_evpn_es_evi_free (struct bgp_evpn_es_evi * es_evi );
71
73
72
74
/******************************************************************************
73
75
* per-ES (Ethernet Segment) routing table
@@ -1948,9 +1950,33 @@ static void bgp_evpn_es_free(struct bgp_evpn_es *es, const char *caller)
1948
1950
if (BGP_DEBUG (evpn_mh , EVPN_MH_ES ))
1949
1951
zlog_debug ("%s: es %s free" , caller , es -> esi_str );
1950
1952
1951
- /* cleanup resources maintained against the ES */
1952
- list_delete (& es -> es_evi_list );
1953
- list_delete (& es -> es_vrf_list );
1953
+ /* Clean up any remaining ES-VRFs */
1954
+ if (es -> es_vrf_list ) {
1955
+ struct listnode * node , * next ;
1956
+ struct bgp_evpn_es_vrf * es_vrf ;
1957
+
1958
+ for (ALL_LIST_ELEMENTS (es -> es_vrf_list , node , next , es_vrf )) {
1959
+ if (BGP_DEBUG (evpn_mh , EVPN_MH_ES ))
1960
+ zlog_debug ("es %s vrf %u cleanup with evi ref_cnt %d" , es -> esi_str ,
1961
+ es_vrf -> bgp_vrf -> vrf_id , es_vrf -> ref_cnt );
1962
+ bgp_evpn_es_vrf_delete (es_vrf );
1963
+ }
1964
+ list_delete (& es -> es_vrf_list );
1965
+ }
1966
+
1967
+ /* Clean up any remaining ES-EVIs */
1968
+ if (es -> es_evi_list ) {
1969
+ struct listnode * node , * next ;
1970
+ struct bgp_evpn_es_evi * es_evi ;
1971
+
1972
+ for (ALL_LIST_ELEMENTS (es -> es_evi_list , node , next , es_evi )) {
1973
+ if (BGP_DEBUG (evpn_mh , EVPN_MH_ES ))
1974
+ zlog_debug ("es %s cleanup ES-EVI VNI %u flags 0x%x" , es -> esi_str ,
1975
+ es_evi -> vpn -> vni , es_evi -> flags );
1976
+ bgp_evpn_es_evi_free (es_evi );
1977
+ }
1978
+ list_delete (& es -> es_evi_list );
1979
+ }
1954
1980
list_delete (& es -> es_vtep_list );
1955
1981
list_delete (& es -> macip_evi_path_list );
1956
1982
list_delete (& es -> macip_global_path_list );
@@ -2996,6 +3022,8 @@ static struct bgp_evpn_es_vrf *bgp_evpn_es_vrf_create(struct bgp_evpn_es *es,
2996
3022
2997
3023
es_vrf -> es = es ;
2998
3024
es_vrf -> bgp_vrf = bgp_vrf ;
3025
+ es_vrf -> ref_cnt = 0 ;
3026
+ es_vrf -> flags = 0 ;
2999
3027
3000
3028
/* insert into the VRF-ESI rb tree */
3001
3029
RB_INSERT (bgp_es_vrf_rb_head , & bgp_vrf -> es_vrf_rb_tree , es_vrf );
@@ -3068,7 +3096,7 @@ void bgp_evpn_es_vrf_deref(struct bgp_evpn_es_evi *es_evi)
3068
3096
es_vrf -> bgp_vrf -> vrf_id );
3069
3097
3070
3098
es_evi -> es_vrf = NULL ;
3071
- if (es_vrf -> ref_cnt )
3099
+ if (es_vrf -> ref_cnt > 0 )
3072
3100
-- es_vrf -> ref_cnt ;
3073
3101
3074
3102
if (!es_vrf -> ref_cnt )
@@ -3105,6 +3133,10 @@ void bgp_evpn_es_vrf_ref(struct bgp_evpn_es_evi *es_evi, struct bgp *bgp_vrf)
3105
3133
3106
3134
es_evi -> es_vrf = es_vrf ;
3107
3135
++ es_vrf -> ref_cnt ;
3136
+
3137
+ if (BGP_DEBUG (evpn_mh , EVPN_MH_ES ))
3138
+ zlog_debug ("es-vrf %s vrf %u evi ref_cnt incremented to %d" , es_vrf -> es -> esi_str ,
3139
+ es_vrf -> bgp_vrf -> vrf_id , es_vrf -> ref_cnt );
3108
3140
}
3109
3141
3110
3142
/* When the L2-VNI is associated with a L3-VNI/VRF update all the
@@ -3535,12 +3567,18 @@ static struct bgp_evpn_es_evi *bgp_evpn_es_evi_new(struct bgp_evpn_es *es,
3535
3567
struct bgp_evpn_es_evi * es_evi ;
3536
3568
3537
3569
es_evi = XCALLOC (MTYPE_BGP_EVPN_ES_EVI , sizeof (* es_evi ));
3538
-
3539
3570
es_evi -> es = es ;
3540
3571
es_evi -> vpn = vpn ;
3572
+ es_evi -> flags = 0 ;
3541
3573
3542
3574
/* Initialise the VTEP list */
3543
3575
es_evi -> es_evi_vtep_list = list_new ();
3576
+ if (!es_evi -> es_evi_vtep_list ) {
3577
+ flog_err (EC_BGP_ES_CREATE , "Failed to create VTEP list for ES-EVI ES %s VNI %u" ,
3578
+ es -> esi_str , vpn -> vni );
3579
+ XFREE (MTYPE_BGP_EVPN_ES_EVI , es_evi );
3580
+ return NULL ;
3581
+ }
3544
3582
listset_app_node_mem (es_evi -> es_evi_vtep_list );
3545
3583
es_evi -> es_evi_vtep_list -> cmp = bgp_evpn_es_evi_vtep_cmp ;
3546
3584
@@ -3553,6 +3591,9 @@ static struct bgp_evpn_es_evi *bgp_evpn_es_evi_new(struct bgp_evpn_es *es,
3553
3591
3554
3592
bgp_evpn_es_vrf_ref (es_evi , vpn -> bgp_vrf );
3555
3593
3594
+ if (BGP_DEBUG (evpn_mh , EVPN_MH_ES ))
3595
+ zlog_debug ("Created ES-EVI for ES %s VNI %u" , es -> esi_str , vpn -> vni );
3596
+
3556
3597
return es_evi ;
3557
3598
}
3558
3599
@@ -3565,6 +3606,10 @@ bgp_evpn_es_evi_free(struct bgp_evpn_es_evi *es_evi)
3565
3606
struct bgp_evpn_es * es = es_evi -> es ;
3566
3607
struct bgpevpn * vpn = es_evi -> vpn ;
3567
3608
3609
+ if (BGP_DEBUG (evpn_mh , EVPN_MH_ES ))
3610
+ zlog_debug ("Freeing ES-EVI for ES %s VNI %u flags 0x%x" , es -> esi_str , vpn -> vni ,
3611
+ es_evi -> flags );
3612
+
3568
3613
/* cannot free the element as long as there is a local or remote
3569
3614
* reference
3570
3615
*/
@@ -3582,6 +3627,9 @@ bgp_evpn_es_evi_free(struct bgp_evpn_es_evi *es_evi)
3582
3627
/* free the VTEP list */
3583
3628
list_delete (& es_evi -> es_evi_vtep_list );
3584
3629
3630
+ /* Set flags max value */
3631
+ es_evi -> flags = 0xFFFF ;
3632
+
3585
3633
/* remove from the VNI-ESI rb tree */
3586
3634
XFREE (MTYPE_BGP_EVPN_ES_EVI , es_evi );
3587
3635
@@ -3596,6 +3644,10 @@ static void bgp_evpn_es_evi_local_info_set(struct bgp_evpn_es_evi *es_evi)
3596
3644
if (CHECK_FLAG (es_evi -> flags , BGP_EVPNES_EVI_LOCAL ))
3597
3645
return ;
3598
3646
3647
+ if (BGP_DEBUG (evpn_mh , EVPN_MH_ES ))
3648
+ zlog_debug ("Setting local info for ES-EVI ES %s VNI %u" , es_evi -> es -> esi_str ,
3649
+ vpn -> vni );
3650
+
3599
3651
SET_FLAG (es_evi -> flags , BGP_EVPNES_EVI_LOCAL );
3600
3652
listnode_init (& es_evi -> l2vni_listnode , es_evi );
3601
3653
listnode_add (vpn -> local_es_evi_list , & es_evi -> l2vni_listnode );
@@ -3758,8 +3810,14 @@ int bgp_evpn_local_es_evi_add(struct bgp *bgp, esi_t *esi, vni_t vni)
3758
3810
if (CHECK_FLAG (es_evi -> flags , BGP_EVPNES_EVI_LOCAL ))
3759
3811
/* dup */
3760
3812
return 0 ;
3761
- } else
3813
+ } else {
3762
3814
es_evi = bgp_evpn_es_evi_new (es , vpn );
3815
+ if (!es_evi ) {
3816
+ flog_err (EC_BGP_ES_CREATE , "%u: Failed to create ES-EVI for ES %s VNI %u" ,
3817
+ bgp -> vrf_id , es -> esi_str , vni );
3818
+ return -1 ;
3819
+ }
3820
+ }
3763
3821
3764
3822
bgp_evpn_es_evi_local_info_set (es_evi );
3765
3823
0 commit comments