aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPau Espin Pedrol <pespin@sysmocom.de>2023-07-20 13:27:23 +0200
committerPau Espin Pedrol <pespin@sysmocom.de>2023-07-20 14:17:32 +0200
commit12311c25613688dbed1c7c4ca24b443009ac3725 (patch)
treec5697ff5d2990974b668420676774a54cf0ed6af
parentb688cdf727ea0b962b2e737c0dba8ed600bc6d8d (diff)
rlcmac: tbf_ul: Free TBF if submitting RACH.req fails
-rw-r--r--include/osmocom/gprs/rlcmac/tbf_ul_fsm.h1
-rw-r--r--src/rlcmac/tbf_ul_ass_fsm.c8
-rw-r--r--src/rlcmac/tbf_ul_fsm.c7
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",