sm: Handle GMMSM-Release.ind

Change-Id: Ia2ac9dbffe29c3509f1088ceb327569a331ec598
This commit is contained in:
Pau Espin 2023-05-31 14:34:54 +02:00
parent 4c225a7912
commit 7b9654c4d0
4 changed files with 45 additions and 7 deletions

View File

@ -29,6 +29,7 @@ enum gprs_sm_ms_fsm_events {
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 {

View File

@ -128,7 +128,7 @@ struct osmo_gprs_sm_smreg_prim {
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 @@ struct osmo_gprs_sm_smreg_prim {
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 @@ struct osmo_gprs_sm_smreg_prim {
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 {

View File

@ -98,6 +98,9 @@ static void st_sm_ms_pdp_active_pending(struct osmo_fsm_inst *fi, uint32_t event
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 @@ static void st_sm_ms_pdp_active(struct osmo_fsm_inst *fi, uint32_t event, void *
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 @@ static void st_sm_ms_pdp_modify_pending(struct osmo_fsm_inst *fi, uint32_t event
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 @@ static void st_sm_ms_pdp_inactive_pending(struct osmo_fsm_inst *fi, uint32_t eve
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 @@ static struct osmo_fsm_state sm_ms_fsm_states[] = {
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 @@ static struct osmo_fsm_state sm_ms_fsm_states[] = {
.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 @@ static struct osmo_fsm_state sm_ms_fsm_states[] = {
.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 @@ static struct osmo_fsm_state sm_ms_fsm_states[] = {
},
[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 @@ const struct value_string sm_ms_fsm_event_names[] = {
{ 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 }
};

View File

@ -493,6 +493,23 @@ static int gprs_sm_prim_handle_gmmsm_establish_cnf(struct osmo_gprs_gmm_prim *gm
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 @@ static int gprs_sm_prim_handle_gmmsm(struct osmo_gprs_gmm_prim *gmm_prim)
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;