Change in osmo-sgsn[master]: sgsn: Don't attempt to delete GTP pdp ctx if GGSN was restarted

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.

Harald Welte gerrit-no-reply at lists.osmocom.org
Mon Jul 16 17:53:45 UTC 2018


Harald Welte has submitted this change and it was merged. ( https://gerrit.osmocom.org/9993 )

Change subject: sgsn: Don't attempt to delete GTP pdp ctx if GGSN was restarted
......................................................................

sgsn: Don't attempt to delete GTP pdp ctx if GGSN was restarted

Scenario and behaviour before this commit:
- Received Echo Reply from GGSN has incremented RestartCounter
- func sgsn_ggsn_ctx_drop_all_pdp() is called to dettach all pdp ctx
from GGSN and request the MS to deact all related ctx.
- DEACT ACCEPT is received from MS, and then it tries to send DEL PDP CTX
to GGSN, expecting to receive a Confirmation and only then freeing the
pdp ctx.

The problem is that since the initial cause of triggering was a GGSN
restart, the GGSN doesn't know anything about that pdp ctx anymore, so
it's not useful sending it. We can instead dettach the GGSN and libgtp
ref at drop_all_pdp() time and then when we receive DEACT ACCEPT from MS
we can free the pdp ctx directly.

Change-Id: I1c74098e181552c218e152bf4ac5035cea770428
---
M src/gprs/gprs_gmm.c
M src/gprs/gprs_sgsn.c
2 files changed, 21 insertions(+), 7 deletions(-)

Approvals:
  Jenkins Builder: Verified
  Harald Welte: Looks good to me, approved



diff --git a/src/gprs/gprs_gmm.c b/src/gprs/gprs_gmm.c
index d06fa6c..ad56c60 100644
--- a/src/gprs/gprs_gmm.c
+++ b/src/gprs/gprs_gmm.c
@@ -2699,7 +2699,11 @@
 	}
 	/* stop timer 3395 */
 	pdpctx_timer_stop(pdp, 3395);
-	return sgsn_delete_pdp_ctx(pdp);
+	if (pdp->ggsn)
+		return sgsn_delete_pdp_ctx(pdp);
+	/* GTP side already detached, freeing */
+	sgsn_pdp_ctx_free(pdp);
+	return 0;
 }
 
 static int gsm48_rx_gsm_status(struct sgsn_mm_ctx *ctx, struct msgb *msg)
@@ -2723,7 +2727,10 @@
 		if (pdp->num_T_exp >= 4) {
 			LOGPDPCTXP(LOGL_NOTICE, pdp, "T3395 expired >= 5 times\n");
 			pdp->state = PDP_STATE_INACTIVE;
-			sgsn_delete_pdp_ctx(pdp);
+			if (pdp->ggsn)
+				sgsn_delete_pdp_ctx(pdp);
+			else
+				sgsn_pdp_ctx_free(pdp);
 			break;
 		}
 		gsm48_tx_gsm_deact_pdp_req(pdp, GSM_CAUSE_NET_FAIL, true);
diff --git a/src/gprs/gprs_sgsn.c b/src/gprs/gprs_sgsn.c
index 35479fb..ef0cc23 100644
--- a/src/gprs/gprs_sgsn.c
+++ b/src/gprs/gprs_sgsn.c
@@ -444,7 +444,8 @@
 
 	/* Detach from MM context */
 	pdp_ctx_detach_mm_ctx(pdp);
-	sgsn_delete_pdp_ctx(pdp);
+	if (pdp->ggsn)
+		sgsn_delete_pdp_ctx(pdp);
 }
 
 /*
@@ -479,8 +480,6 @@
 		lib->priv = NULL;
 	}
 
-	if (pdp->destroy_ggsn)
-		sgsn_ggsn_ctx_free(pdp->ggsn);
 	talloc_free(pdp);
 }
 
@@ -702,9 +701,10 @@
 
 static void drop_one_pdp(struct sgsn_pdp_ctx *pdp)
 {
-	if (pdp->mm->gmm_state == GMM_REGISTERED_NORMAL)
+	if (pdp->mm->gmm_state == GMM_REGISTERED_NORMAL) {
 		gsm48_tx_gsm_deact_pdp_req(pdp, GSM_CAUSE_NET_FAIL, true);
-	else  {
+		sgsn_ggsn_ctx_remove_pdp(pdp->ggsn, pdp);
+	} else  {
 		/* FIXME: GPRS paging in case MS is SUSPENDED */
 		LOGPDPCTXP(LOGL_NOTICE, pdp, "Hard-dropping PDP ctx due to GGSN "
 			"recovery\n");
@@ -739,6 +739,13 @@
 	llist_del(&pdp->ggsn_list);
 	if (llist_empty(&ggc->pdp_list) && osmo_timer_pending(&ggc->echo_timer))
 		osmo_timer_del(&ggc->echo_timer);
+	if (pdp->destroy_ggsn)
+		sgsn_ggsn_ctx_free(pdp->ggsn);
+	pdp->ggsn = NULL;
+	/* Drop references to libgtp since the conn is down */
+	if (pdp->lib)
+		pdp_freepdp(pdp->lib);
+	pdp->lib = NULL;
 }
 
 void sgsn_update_subscriber_data(struct sgsn_mm_ctx *mmctx)

-- 
To view, visit https://gerrit.osmocom.org/9993
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-sgsn
Gerrit-Branch: master
Gerrit-MessageType: merged
Gerrit-Change-Id: I1c74098e181552c218e152bf4ac5035cea770428
Gerrit-Change-Number: 9993
Gerrit-PatchSet: 2
Gerrit-Owner: Pau Espin Pedrol <pespin at sysmocom.de>
Gerrit-Reviewer: Harald Welte <laforge at gnumonks.org>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: Pau Espin Pedrol <pespin at sysmocom.de>
Gerrit-CC: Holger Freyther <holger at freyther.de>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20180716/c57f375a/attachment.htm>


More information about the gerrit-log mailing list