pespin has uploaded this change for review.

View Change

gmm: Implement submitting GMMSM-RELEASE.ind when MS becomes detached

Change-Id: I74176eba870b19b30666ab5deef5eb56f0f0fd83
---
M include/osmocom/gprs/gmm/gmm_private.h
M src/gmm/gmm.c
M src/gmm/gmm_ms_fsm.c
M tests/gmm/gmm_prim_test.c
M tests/gmm/gmm_prim_test.ok
5 files changed, 30 insertions(+), 7 deletions(-)

git pull ssh://gerrit.osmocom.org:29418/libosmo-gprs refs/changes/00/33000/1
diff --git a/include/osmocom/gprs/gmm/gmm_private.h b/include/osmocom/gprs/gmm/gmm_private.h
index d93f724..df3f496 100644
--- a/include/osmocom/gprs/gmm/gmm_private.h
+++ b/include/osmocom/gprs/gmm/gmm_private.h
@@ -102,7 +102,7 @@
struct osmo_gprs_gmm_prim *gprs_gmm_prim_alloc_gmmrr_assign_req(uint32_t old_tlli, uint32_t new_tlli);

struct osmo_gprs_gmm_prim *gprs_gmm_prim_alloc_gmmsm_establish_cnf(uint32_t id, uint8_t cause);
-struct osmo_gprs_gmm_prim *gprs_gmm_prim_alloc_gmmrr_release_ind(uint32_t id);
+struct osmo_gprs_gmm_prim *gprs_gmm_prim_alloc_gmmsm_release_ind(uint32_t id);
struct osmo_gprs_gmm_prim *gprs_gmm_prim_alloc_gmmsm_unitdata_ind(uint32_t id, uint8_t *smpdu, unsigned int smpdu_len);

/* gmm.c: */
@@ -131,6 +131,7 @@

int gprs_gmm_submit_gmmreg_attach_cnf(struct gprs_gmm_entity *gmme, bool accepted, uint8_t cause);
int gprs_gmm_submit_gmmsm_establish_cnf(struct gprs_gmm_entity *gmme, bool accepted, uint8_t cause);
+int gprs_gmm_submit_gmmsm_release_ind(struct gprs_gmm_entity *gmme);
int gprs_gmm_submit_llgmm_assing_req(const struct gprs_gmm_entity *gmme);

/* misc.c */
diff --git a/src/gmm/gmm.c b/src/gmm/gmm.c
index 2511c96..be1ea8c 100644
--- a/src/gmm/gmm.c
+++ b/src/gmm/gmm.c
@@ -453,6 +453,16 @@
return rc;
}

+int gprs_gmm_submit_gmmsm_release_ind(struct gprs_gmm_entity *gmme)
+{
+ struct osmo_gprs_gmm_prim *gmm_prim_tx;
+ int rc;
+
+ gmm_prim_tx = gprs_gmm_prim_alloc_gmmsm_release_ind(gmme->sess_id);
+ rc = gprs_gmm_prim_call_up_cb(gmm_prim_tx);
+ return rc;
+}
+
static int gprs_gmm_submit_gmmrr_assing_req(struct gprs_gmm_entity *gmme)
{
struct osmo_gprs_gmm_prim *gmm_prim_tx;
@@ -906,8 +916,6 @@
LOGGMME(gmme, LOGL_INFO, "Rx GMM DETACH ACCEPT (MO) force_standby_indicated=%s\n",
force_standby_indicated ? "true" : "false");

- /* TODO: submit GMMSM-RELEASE-IND */
-
/* Submit LLGMM-ASSIGN-REQ as per TS 24.007 Annex C.3 */
gmme->old_tlli = gmme->tlli;
gmme->tlli = GPRS_GMM_TLLI_UNASSIGNED;
diff --git a/src/gmm/gmm_ms_fsm.c b/src/gmm/gmm_ms_fsm.c
index 95e421b..a344494 100644
--- a/src/gmm/gmm_ms_fsm.c
+++ b/src/gmm/gmm_ms_fsm.c
@@ -89,6 +89,10 @@

memset(&ctx->attach, 0, sizeof(ctx->attach));
gprs_gmm_gmme_t3312_stop(ctx->gmme);
+
+ /* TS 24.007 9.5.1.4: informs SM layerthat the MS has been GPRS detached, e.g. by timer expiry */
+ if (prev_state != GPRS_GMM_MS_ST_NULL)
+ gprs_gmm_submit_gmmsm_release_ind(ctx->gmme);
}

static void st_gmm_ms_deregistered(struct osmo_fsm_inst *fi, uint32_t event, void *data)
diff --git a/tests/gmm/gmm_prim_test.c b/tests/gmm/gmm_prim_test.c
index 50d40d8..27b9336 100644
--- a/tests/gmm/gmm_prim_test.c
+++ b/tests/gmm/gmm_prim_test.c
@@ -294,10 +294,10 @@
osmo_hexdump(gmm_prim->gmmsm.unitdata_ind.smpdu,
gmm_prim->gmmsm.unitdata_ind.smpdu_len));
break;
- //case OSMO_PRIM(OSMO_GPRS_GMM_GMMSM_DETACH, PRIM_OP_CONFIRM):
- // printf("%s(): Rx %s detach_type='%s'\n", __func__, pdu_name,
- // osmo_gprs_gmm_detach_ms_type_name(gmm_prim->gmmsm.detach_cnf.detach_type));
- // break;
+ case OSMO_PRIM(OSMO_GPRS_GMM_GMMSM_RELEASE, PRIM_OP_INDICATION):
+ printf("%s(): Rx %s sess_id=%u\n", __func__, pdu_name,
+ gmm_prim->gmmsm.sess_id);
+ break;
default:
printf("%s(): Unexpected Rx %s\n", __func__, pdu_name);
OSMO_ASSERT(0)
diff --git a/tests/gmm/gmm_prim_test.ok b/tests/gmm/gmm_prim_test.ok
index 6cf672a..2ff27f6 100644
--- a/tests/gmm/gmm_prim_test.ok
+++ b/tests/gmm/gmm_prim_test.ok
@@ -23,6 +23,7 @@
test_gmm_prim_llc_down_cb(): Rx LL-UNITDATA.request TLLI=0xec999002 SAPI=GMM l3=[08 05 20 0a 00 05 f4 ec 99 90 02 ]
test_gmm_prim_llc_down_cb(): Rx LLGMM-ASSIGN.request old_TLLI=0xec999002 new_TLLI=0xffffffff
test_gmm_prim_up_cb(): Rx GMMREG-DETACH.confirm detach_type='GPRS detach'
+test_gmm_prim_up_cb(): Rx GMMSM-RELEASE.indication sess_id=4294967295
==== test_gmm_prim_ms_gmmreg() [end] ====
==== test_gmm_prim_ms_gmmsm() [start] ====
sys={0.000000}, mono={0.000000}: clock_override_set

To view, visit change 33000. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-Project: libosmo-gprs
Gerrit-Branch: master
Gerrit-Change-Id: I74176eba870b19b30666ab5deef5eb56f0f0fd83
Gerrit-Change-Number: 33000
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <pespin@sysmocom.de>
Gerrit-MessageType: newchange