diff options
author | Pau Espin Pedrol <pespin@sysmocom.de> | 2023-07-20 13:27:23 +0200 |
---|---|---|
committer | Pau Espin Pedrol <pespin@sysmocom.de> | 2023-07-20 14:17:32 +0200 |
commit | 12311c25613688dbed1c7c4ca24b443009ac3725 (patch) | |
tree | c5697ff5d2990974b668420676774a54cf0ed6af | |
parent | b688cdf727ea0b962b2e737c0dba8ed600bc6d8d (diff) |
rlcmac: tbf_ul: Free TBF if submitting RACH.req fails
Change-Id: I63d68e524629a90931497d1181f134830b4819f9
-rw-r--r-- | include/osmocom/gprs/rlcmac/tbf_ul_fsm.h | 1 | ||||
-rw-r--r-- | src/rlcmac/tbf_ul_ass_fsm.c | 8 | ||||
-rw-r--r-- | src/rlcmac/tbf_ul_fsm.c | 7 |
3 files changed, 14 insertions, 2 deletions
diff --git a/include/osmocom/gprs/rlcmac/tbf_ul_fsm.h b/include/osmocom/gprs/rlcmac/tbf_ul_fsm.h index b1f82e3..059dad4 100644 --- a/include/osmocom/gprs/rlcmac/tbf_ul_fsm.h +++ b/include/osmocom/gprs/rlcmac/tbf_ul_fsm.h @@ -34,6 +34,7 @@ struct gprs_rlcmac_tbf_ul_fsm_ctx { enum tbf_ul_fsm_event { GPRS_RLCMAC_TBF_UL_EV_UL_ASS_START, GPRS_RLCMAC_TBF_UL_EV_UL_ASS_COMPL, + GPRS_RLCMAC_TBF_UL_EV_UL_ASS_REJ, GPRS_RLCMAC_TBF_UL_EV_FIRST_UL_DATA_SENT, GPRS_RLCMAC_TBF_UL_EV_N3104_MAX, GPRS_RLCMAC_TBF_UL_EV_RX_UL_ACK_NACK, /* data: struct tbf_ul_ass_ev_rx_ul_ack_nack* */ diff --git a/src/rlcmac/tbf_ul_ass_fsm.c b/src/rlcmac/tbf_ul_ass_fsm.c index da6e7a7..35b6ca7 100644 --- a/src/rlcmac/tbf_ul_ass_fsm.c +++ b/src/rlcmac/tbf_ul_ass_fsm.c @@ -262,12 +262,18 @@ static void st_idle_on_enter(struct osmo_fsm_inst *fi, uint32_t prev_state) static void st_idle(struct osmo_fsm_inst *fi, uint32_t event, void *data) { struct gprs_rlcmac_tbf_ul_ass_fsm_ctx *ctx = (struct gprs_rlcmac_tbf_ul_ass_fsm_ctx *)fi->priv; + int rc; + switch (event) { case GPRS_RLCMAC_TBF_UL_ASS_EV_START: /* Inform the main TBF state about the assignment starting: */ osmo_fsm_inst_dispatch(ctx->ul_tbf->state_fsm.fi, GPRS_RLCMAC_TBF_UL_EV_UL_ASS_START, NULL); ctx->ass_type = *(enum gprs_rlcmac_tbf_ul_ass_type *)data; - submit_rach_req(ctx); + rc = submit_rach_req(ctx); + if (rc < 0) { + osmo_fsm_inst_dispatch(ctx->ul_tbf->state_fsm.fi, GPRS_RLCMAC_TBF_UL_EV_UL_ASS_REJ, NULL); + break; + } tbf_ul_ass_fsm_state_chg(fi, GPRS_RLCMAC_TBF_UL_ASS_ST_WAIT_CCCH_IMM_ASS); break; case GPRS_RLCMAC_TBF_UL_ASS_EV_START_DIRECT_2PHASE: diff --git a/src/rlcmac/tbf_ul_fsm.c b/src/rlcmac/tbf_ul_fsm.c index 37d2e4a..2265aa4 100644 --- a/src/rlcmac/tbf_ul_fsm.c +++ b/src/rlcmac/tbf_ul_fsm.c @@ -33,6 +33,7 @@ static const struct value_string tbf_ul_fsm_event_names[] = { { GPRS_RLCMAC_TBF_UL_EV_UL_ASS_START, "UL_ASS_START" }, { GPRS_RLCMAC_TBF_UL_EV_UL_ASS_COMPL, "UL_ASS_COMPL" }, + { GPRS_RLCMAC_TBF_UL_EV_UL_ASS_REJ, "UL_ASS_REJ" }, { GPRS_RLCMAC_TBF_UL_EV_FIRST_UL_DATA_SENT, "FIRST_UL_DATA_SENT" }, { GPRS_RLCMAC_TBF_UL_EV_N3104_MAX, "N3104_MAX" }, { GPRS_RLCMAC_TBF_UL_EV_RX_UL_ACK_NACK, "RX_UL_ACK_NACK" }, @@ -164,6 +165,9 @@ static void st_wait_assign(struct osmo_fsm_inst *fi, uint32_t event, void *data) configure_ul_tbf(ctx); tbf_ul_fsm_state_chg(fi, GPRS_RLCMAC_TBF_UL_ST_FLOW); break; + case GPRS_RLCMAC_TBF_UL_EV_UL_ASS_REJ: + gprs_rlcmac_ul_tbf_free(ctx->ul_tbf); + break; default: OSMO_ASSERT(0); } @@ -282,7 +286,8 @@ static struct osmo_fsm_state tbf_ul_fsm_states[] = { }, [GPRS_RLCMAC_TBF_UL_ST_WAIT_ASSIGN] = { .in_event_mask = - X(GPRS_RLCMAC_TBF_UL_EV_UL_ASS_COMPL), + X(GPRS_RLCMAC_TBF_UL_EV_UL_ASS_COMPL) | + X(GPRS_RLCMAC_TBF_UL_EV_UL_ASS_REJ), .out_state_mask = X(GPRS_RLCMAC_TBF_UL_ST_FLOW), .name = "ASSIGN", |