pespin has submitted this change. ( https://gerrit.osmocom.org/c/libosmo-gprs/+/33846 )
Change subject: rlcmac: tbf_ul: Free TBF if submitting RACH.req fails ......................................................................
rlcmac: tbf_ul: Free TBF if submitting RACH.req fails
Change-Id: I63d68e524629a90931497d1181f134830b4819f9 --- M include/osmocom/gprs/rlcmac/tbf_ul_fsm.h M src/rlcmac/tbf_ul_ass_fsm.c M src/rlcmac/tbf_ul_fsm.c 3 files changed, 23 insertions(+), 2 deletions(-)
Approvals: Jenkins Builder: Verified pespin: Looks good to me, approved
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 @@ 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(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 @@ 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 @@ }, [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",