pespin has submitted this change. ( https://gerrit.osmocom.org/c/libosmo-gprs/+/33112 )
Change subject: sm: Handle GMMSM-Release.ind ......................................................................
sm: Handle GMMSM-Release.ind
Change-Id: Ia2ac9dbffe29c3509f1088ceb327569a331ec598 --- M include/osmocom/gprs/sm/sm_ms_fsm.h M include/osmocom/gprs/sm/sm_prim.h M src/sm/sm_ms_fsm.c M src/sm/sm_prim.c 4 files changed, 54 insertions(+), 7 deletions(-)
Approvals: Jenkins Builder: Verified pespin: Looks good to me, approved
diff --git a/include/osmocom/gprs/sm/sm_ms_fsm.h b/include/osmocom/gprs/sm/sm_ms_fsm.h index d1d4689..2ea9bd8 100644 --- a/include/osmocom/gprs/sm/sm_ms_fsm.h +++ b/include/osmocom/gprs/sm/sm_ms_fsm.h @@ -29,6 +29,7 @@ GPRS_SM_MS_EV_TX_MOD_PDP_CTX_REQ, GPRS_SM_MS_EV_RX_MOD_PDP_CTX_REJ, GPRS_SM_MS_EV_RX_MOD_PDP_CTX_ACC, + GPRS_SM_MS_EV_GMM_RELEASE_IND, /* TS 24.007 9.5.1.4 GMMSM-RELEASE-IND */ };
struct gprs_sm_ms_fsm_ctx { diff --git a/include/osmocom/gprs/sm/sm_prim.h b/include/osmocom/gprs/sm/sm_prim.h index d4e17a4..127dd35 100644 --- a/include/osmocom/gprs/sm/sm_prim.h +++ b/include/osmocom/gprs/sm/sm_prim.h @@ -128,7 +128,7 @@ uint8_t pco[OSMO_GPRS_SM_PCO_MAXLEN]; uint8_t pco_len; /* TODO: MBMS protocol configuration options*/ - } deact_req; + } pdp_deact_req;
/* OSMO_GPRS_SM_SMREG_PDP_DEACTIVATE | Cnf, 6.5.1.6 */ @@ -138,7 +138,7 @@ uint8_t pco[OSMO_GPRS_SM_PCO_MAXLEN]; uint8_t pco_len; /* TODO: MBMS protocol configuration options*/ - } deact_cnf; + } pdp_deact_cnf;
/* OSMO_GPRS_SM_SMREG_PDP_DEACTIVATE | Ind, 6.5.1.7 */ struct { @@ -149,7 +149,7 @@ uint8_t pco[OSMO_GPRS_SM_PCO_MAXLEN]; uint8_t pco_len; /* TODO: MBMS protocol configuration options */ - } deact_ind; + } pdp_deact_ind;
/* OSMO_GPRS_SM_SMREG_PDP_MODIFY | Ind, 6.5.1.8 */ struct { diff --git a/src/sm/sm_ms_fsm.c b/src/sm/sm_ms_fsm.c index aaaa008..dc063b9 100644 --- a/src/sm/sm_ms_fsm.c +++ b/src/sm/sm_ms_fsm.c @@ -98,6 +98,9 @@ sm_ms_fsm_state_chg(fi, GPRS_SM_MS_ST_PDP_ACTIVE); gprs_sm_submit_smreg_pdp_act_cnf(ctx->sme, (enum gsm48_gsm_cause)0); break; + case GPRS_SM_MS_EV_GMM_RELEASE_IND: + sm_ms_fsm_state_chg(fi, GPRS_SM_MS_ST_PDP_INACTIVE); + break; default: OSMO_ASSERT(0); } @@ -116,6 +119,9 @@ case GPRS_SM_MS_EV_TX_MOD_PDP_CTX_REQ: sm_ms_fsm_state_chg(fi, GPRS_SM_MS_ST_PDP_MODIFY_PENDING); break; + case GPRS_SM_MS_EV_GMM_RELEASE_IND: + sm_ms_fsm_state_chg(fi, GPRS_SM_MS_ST_PDP_INACTIVE); + break; default: OSMO_ASSERT(0); } @@ -134,6 +140,9 @@ case GPRS_SM_MS_EV_RX_MOD_PDP_CTX_ACC: sm_ms_fsm_state_chg(fi, GPRS_SM_MS_ST_PDP_ACTIVE); break; + case GPRS_SM_MS_EV_GMM_RELEASE_IND: + sm_ms_fsm_state_chg(fi, GPRS_SM_MS_ST_PDP_INACTIVE); + break; default: OSMO_ASSERT(0); } @@ -145,6 +154,9 @@ case GPRS_SM_MS_EV_RX_DEACT_PDP_CTX_ACC: sm_ms_fsm_state_chg(fi, GPRS_SM_MS_ST_PDP_INACTIVE); break; + case GPRS_SM_MS_EV_GMM_RELEASE_IND: + sm_ms_fsm_state_chg(fi, GPRS_SM_MS_ST_PDP_INACTIVE); + break; default: OSMO_ASSERT(0); } @@ -201,7 +213,8 @@ X(GPRS_SM_MS_EV_RX_GMM_ESTABLISH_REJ) | X(GPRS_SM_MS_EV_RX_ACT_PDP_CTX_REJ) | X(GPRS_SM_MS_EV_RX_ACT_PDP_CTX_ACC) | - X(GPRS_SM_MS_EV_NSAPI_ACTIVATED), + X(GPRS_SM_MS_EV_NSAPI_ACTIVATED) | + X(GPRS_SM_MS_EV_GMM_RELEASE_IND), .out_state_mask = X(GPRS_SM_MS_ST_PDP_INACTIVE) | X(GPRS_SM_MS_ST_PDP_ACTIVE_PENDING) | @@ -214,7 +227,8 @@ .in_event_mask = X(GPRS_SM_MS_EV_RX_DEACT_PDP_CTX_REQ) | X(GPRS_SM_MS_EV_TX_DEACT_PDP_CTX_REQ)| - X(GPRS_SM_MS_EV_TX_MOD_PDP_CTX_REQ), + X(GPRS_SM_MS_EV_TX_MOD_PDP_CTX_REQ) | + X(GPRS_SM_MS_EV_GMM_RELEASE_IND), .out_state_mask = X(GPRS_SM_MS_ST_PDP_INACTIVE) | X(GPRS_SM_MS_ST_PDP_INACTIVE_PENDING) | @@ -226,7 +240,8 @@ .in_event_mask = X(GPRS_SM_MS_EV_RX_DEACT_PDP_CTX_REQ) | X(GPRS_SM_MS_EV_RX_MOD_PDP_CTX_REJ) | - X(GPRS_SM_MS_EV_RX_MOD_PDP_CTX_ACC), + X(GPRS_SM_MS_EV_RX_MOD_PDP_CTX_ACC) | + X(GPRS_SM_MS_EV_GMM_RELEASE_IND), .out_state_mask = X(GPRS_SM_MS_ST_PDP_INACTIVE) | X(GPRS_SM_MS_ST_PDP_ACTIVE) | @@ -236,7 +251,8 @@ }, [GPRS_SM_MS_ST_PDP_INACTIVE_PENDING] = { .in_event_mask = - X(GPRS_SM_MS_EV_RX_DEACT_PDP_CTX_ACC), + X(GPRS_SM_MS_EV_RX_DEACT_PDP_CTX_ACC) | + X(GPRS_SM_MS_EV_GMM_RELEASE_IND), .out_state_mask = X(GPRS_SM_MS_ST_PDP_INACTIVE), .name = "PDP_INACTIVE_PENDING", @@ -257,6 +273,7 @@ { GPRS_SM_MS_EV_TX_MOD_PDP_CTX_REQ, "TX_MOD_PDP_CTX_REQ" }, { GPRS_SM_MS_EV_RX_MOD_PDP_CTX_REJ, "RX_MOD_PDP_CTX_REJ" }, { GPRS_SM_MS_EV_RX_MOD_PDP_CTX_ACC, "RX_MOD_PDP_CTX_ACC" }, + { GPRS_SM_MS_EV_GMM_RELEASE_IND, "GMM_RELEASE_IND"}, { 0, NULL } };
diff --git a/src/sm/sm_prim.c b/src/sm/sm_prim.c index 158959e..b513aa7 100644 --- a/src/sm/sm_prim.c +++ b/src/sm/sm_prim.c @@ -493,6 +493,23 @@ return rc; }
+/* TS 24.007 9.5.1.2 GMMSM-RELEASE-IND */ +static int gprs_sm_prim_handle_gmmsm_release_ind(struct osmo_gprs_gmm_prim *gmm_prim) +{ + struct osmo_gprs_gmm_gmmsm_prim *gmmsm = &gmm_prim->gmmsm; + struct gprs_sm_entity *sme; + int rc; + + sme = gprs_sm_find_sme_by_sess_id(gmmsm->sess_id); + if (!sme) { + LOGSM(LOGL_ERROR, "Rx GMMSM-RELEASE.ind for non existing SM Entity sess_id=%u\n", gmmsm->sess_id); + return -EINVAL; + } + rc = osmo_fsm_inst_dispatch(sme->ms_fsm.fi, GPRS_SM_MS_EV_GMM_RELEASE_IND, NULL); + + return rc; +} + /* TS 24.007 9.5.1.6 GMMSM-UNITDATA-IND */ static int gprs_sm_prim_handle_gmmsm_unitdata_ind(struct osmo_gprs_gmm_prim *gmm_prim) { @@ -520,6 +537,9 @@ case OSMO_PRIM(OSMO_GPRS_GMM_GMMSM_ESTABLISH, PRIM_OP_CONFIRM): rc = gprs_sm_prim_handle_gmmsm_establish_cnf(gmm_prim); break; + case OSMO_PRIM(OSMO_GPRS_GMM_GMMSM_RELEASE, PRIM_OP_INDICATION): + rc = gprs_sm_prim_handle_gmmsm_release_ind(gmm_prim); + break; case OSMO_PRIM(OSMO_GPRS_GMM_GMMSM_UNITDATA, PRIM_OP_INDICATION): rc = gprs_sm_prim_handle_gmmsm_unitdata_ind(gmm_prim); break;