aboutsummaryrefslogtreecommitdiffstats
path: root/src/gb/gprs_ns2.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gb/gprs_ns2.c')
-rw-r--r--src/gb/gprs_ns2.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/src/gb/gprs_ns2.c b/src/gb/gprs_ns2.c
index fb2965a3..45cdfcc1 100644
--- a/src/gb/gprs_ns2.c
+++ b/src/gb/gprs_ns2.c
@@ -639,9 +639,9 @@ err:
* \param[in] nsvc NS-VC to destroy */
void gprs_ns2_free_nsvc(struct gprs_ns2_vc *nsvc)
{
- if (!nsvc)
+ if (!nsvc || nsvc->freed)
return;
-
+ nsvc->freed = true;
ns2_prim_status_ind(nsvc->nse, nsvc, 0, GPRS_NS2_AFF_CAUSE_VC_FAILURE);
llist_del(&nsvc->list);
@@ -671,7 +671,7 @@ void gprs_ns2_free_nsvcs(struct gprs_ns2_nse *nse)
{
struct gprs_ns2_vc *nsvc, *tmp;
- if (!nse)
+ if (!nse || nse->freed)
return;
llist_for_each_entry_safe(nsvc, tmp, &nse->nsvc, list) {
@@ -889,9 +889,11 @@ uint16_t gprs_ns2_nse_nsei(struct gprs_ns2_nse *nse)
* \param[in] nse NS Entity to destroy */
void gprs_ns2_free_nse(struct gprs_ns2_nse *nse)
{
- if (!nse)
+ struct gprs_ns2_vc *nsvc, *nsvc2;
+ if (!nse || nse->freed)
return;
+ nse->freed = true;
nse->alive = false;
if (nse->bss_sns_fi) {
osmo_fsm_inst_term(nse->bss_sns_fi, OSMO_FSM_TERM_REQUEST, NULL);
@@ -901,6 +903,9 @@ void gprs_ns2_free_nse(struct gprs_ns2_nse *nse)
gprs_ns2_free_nsvcs(nse);
ns2_prim_status_ind(nse, NULL, 0, GPRS_NS2_AFF_CAUSE_FAILURE);
rate_ctr_group_free(nse->ctrg);
+ llist_for_each_entry_safe(nsvc, nsvc2, &nse->nsvc, list) {
+ gprs_ns2_free_nsvc(nsvc);
+ }
llist_del(&nse->list);
talloc_free(nse);
@@ -1466,9 +1471,10 @@ void gprs_ns2_free_bind(struct gprs_ns2_vc_bind *bind)
{
struct gprs_ns2_vc *nsvc, *tmp;
struct gprs_ns2_nse *nse;
- if (!bind)
+ if (!bind || bind->freed)
return;
+ bind->freed = true;
llist_for_each_entry_safe(nsvc, tmp, &bind->nsvc, blist) {
gprs_ns2_free_nsvc(nsvc);
}