diff options
author | Pau Espin Pedrol <pespin@sysmocom.de> | 2023-06-09 17:43:57 +0200 |
---|---|---|
committer | Pau Espin Pedrol <pespin@sysmocom.de> | 2023-06-09 18:38:28 +0200 |
commit | 365728d5794ce837dff18e45cf4241c65f10eed5 (patch) | |
tree | 85779bfa23a065f7e17de08b30ed1965cd6edb1f /src | |
parent | 89fbf87abf9d99ec7a6d8df5a42cef79d3fa964a (diff) |
Avoid using N3105 in UL TBFs
This counter is only used in DL TBFs as per TS 44.060.
section 13.4 "N3105":
"When the network after sending a RRBP field in the _downlink RLC data block_ ..."
(DL data blocks are only sent in DL TBFs).
section 8.1.2.1:
"If N3105 = N3105max, the network shall release the downlink TBF internally
and start timer T3195 for that TBF. When T3195 expires, the network may reuse
the TFI"
Change-Id: I4d4f4d4d3e6e0539ea8ec2395bed00d059b84e04
Diffstat (limited to 'src')
-rw-r--r-- | src/pdch.cpp | 8 | ||||
-rw-r--r-- | src/tbf.cpp | 8 | ||||
-rw-r--r-- | src/tbf_ul_fsm.c | 34 |
3 files changed, 15 insertions, 35 deletions
diff --git a/src/pdch.cpp b/src/pdch.cpp index 2cee011d..f871d1de 100644 --- a/src/pdch.cpp +++ b/src/pdch.cpp @@ -391,8 +391,8 @@ void gprs_rlcmac_pdch::rcv_control_ack(Packet_Control_Acknowledgement_t *packet, } LOGPTBF(tbf, LOGL_DEBUG, "[DOWNLINK] UPLINK ASSIGNED\n"); pdch_ulc_release_fn(ulc, fn); - /* reset N3105 */ - tbf->n_reset(N3105); + if (tbf_direction(tbf) == GPRS_RLCMAC_DL_TBF) + tbf->n_reset(N3105); osmo_fsm_inst_dispatch(tbf->ul_ass_fsm.fi, TBF_UL_ASS_EV_RX_ASS_CTRL_ACK, NULL); new_tbf = ms_ul_tbf(ms); @@ -422,8 +422,8 @@ void gprs_rlcmac_pdch::rcv_control_ack(Packet_Control_Acknowledgement_t *packet, } LOGPTBF(tbf, LOGL_DEBUG, "[UPLINK] DOWNLINK ASSIGNED\n"); pdch_ulc_release_fn(ulc, fn); - /* reset N3105 */ - tbf->n_reset(N3105); + if (tbf_direction(tbf) == GPRS_RLCMAC_DL_TBF) + tbf->n_reset(N3105); osmo_fsm_inst_dispatch(tbf->dl_ass_fsm.fi, TBF_DL_ASS_EV_RX_ASS_CTRL_ACK, NULL); new_tbf = ms_dl_tbf(ms); diff --git a/src/tbf.cpp b/src/tbf.cpp index 47256f87..885c6029 100644 --- a/src/tbf.cpp +++ b/src/tbf.cpp @@ -316,6 +316,9 @@ void gprs_rlcmac_tbf::n_reset(enum tbf_counters n) case N3103: OSMO_ASSERT(direction == GPRS_RLCMAC_UL_TBF); break; + case N3105: + OSMO_ASSERT(direction == GPRS_RLCMAC_DL_TBF); + break; default: break; } @@ -342,6 +345,7 @@ bool gprs_rlcmac_tbf::n_inc(enum tbf_counters n) chk = bts->n3103; break; case N3105: + OSMO_ASSERT(direction == GPRS_RLCMAC_DL_TBF); chk = bts->n3105; break; default: @@ -513,7 +517,7 @@ void gprs_rlcmac_tbf::poll_timeout(struct gprs_rlcmac_pdch *pdch, uint32_t poll_ } bts_do_rate_ctr_inc(bts, CTR_RLC_ASS_TIMEDOUT); bts_do_rate_ctr_inc(bts, CTR_PUA_POLL_TIMEDOUT); - if (n_inc(N3105)) { + if (this->direction == GPRS_RLCMAC_DL_TBF && n_inc(N3105)) { osmo_fsm_inst_dispatch(this->state_fi, TBF_EV_MAX_N3105, NULL); bts_do_rate_ctr_inc(bts, CTR_RLC_ASS_FAILED); bts_do_rate_ctr_inc(bts, CTR_PUA_POLL_FAILED); @@ -532,7 +536,7 @@ void gprs_rlcmac_tbf::poll_timeout(struct gprs_rlcmac_pdch *pdch, uint32_t poll_ } bts_do_rate_ctr_inc(bts, CTR_RLC_ASS_TIMEDOUT); bts_do_rate_ctr_inc(bts, CTR_PDA_POLL_TIMEDOUT); - if (n_inc(N3105)) { + if (this->direction == GPRS_RLCMAC_DL_TBF && n_inc(N3105)) { osmo_fsm_inst_dispatch(this->state_fi, TBF_EV_MAX_N3105, NULL); bts_do_rate_ctr_inc(bts, CTR_RLC_ASS_FAILED); bts_do_rate_ctr_inc(bts, CTR_PDA_POLL_FAILED); diff --git a/src/tbf_ul_fsm.c b/src/tbf_ul_fsm.c index 13dc9fba..231ccd23 100644 --- a/src/tbf_ul_fsm.c +++ b/src/tbf_ul_fsm.c @@ -152,12 +152,6 @@ static void st_assign(struct osmo_fsm_inst *fi, uint32_t event, void *data) } tbf_ul_fsm_state_chg(fi, TBF_ST_FLOW); break; - case TBF_EV_MAX_N3105: - /* We are going to release, so abort any Pkt Ul Ass pending to be scheduled: */ - osmo_fsm_inst_dispatch(tbf_ul_ass_fi(ctx->tbf), TBF_UL_ASS_EV_ABORT, NULL); - ctx->T_release = 3195; - tbf_ul_fsm_state_chg(fi, TBF_ST_RELEASING); - break; default: OSMO_ASSERT(0); } @@ -199,10 +193,6 @@ static void st_flow(struct osmo_fsm_inst *fi, uint32_t event, void *data) ctx->T_release = 3169; tbf_ul_fsm_state_chg(fi, TBF_ST_RELEASING); break; - case TBF_EV_MAX_N3105: - ctx->T_release = 3195; - tbf_ul_fsm_state_chg(fi, TBF_ST_RELEASING); - break; default: OSMO_ASSERT(0); } @@ -246,10 +236,6 @@ static void st_finished(struct osmo_fsm_inst *fi, uint32_t event, void *data) ctx->T_release = 3169; tbf_ul_fsm_state_chg(fi, TBF_ST_RELEASING); break; - case TBF_EV_MAX_N3105: - ctx->T_release = 3195; - tbf_ul_fsm_state_chg(fi, TBF_ST_RELEASING); - break; default: OSMO_ASSERT(0); } @@ -278,11 +264,6 @@ static void st_releasing_on_enter(struct osmo_fsm_inst *fi, uint32_t prev_state) static void st_releasing(struct osmo_fsm_inst *fi, uint32_t event, void *data) { switch (event) { - case TBF_EV_MAX_N3105: - /* This may be received here if the TBF had several polls - * allocated concurrently and several failed each increasing N3105 - * over MAX_N3015. We are already releasing, ignore.*/ - break; default: OSMO_ASSERT(0); } @@ -320,8 +301,7 @@ static struct osmo_fsm_state tbf_ul_fsm_states[] = { .in_event_mask = X(TBF_EV_ASSIGN_ADD_CCCH) | X(TBF_EV_ASSIGN_ADD_PACCH) | - X(TBF_EV_ASSIGN_ACK_PACCH) | - X(TBF_EV_MAX_N3105), + X(TBF_EV_ASSIGN_ACK_PACCH), .out_state_mask = X(TBF_ST_FLOW) | X(TBF_ST_FINISHED), @@ -334,8 +314,7 @@ static struct osmo_fsm_state tbf_ul_fsm_states[] = { X(TBF_EV_FIRST_UL_DATA_RECVD) | X(TBF_EV_CONTENTION_RESOLUTION_MS_SUCCESS) | X(TBF_EV_LAST_UL_DATA_RECVD) | - X(TBF_EV_MAX_N3101) | - X(TBF_EV_MAX_N3105), + X(TBF_EV_MAX_N3101), .out_state_mask = X(TBF_ST_ASSIGN) | X(TBF_ST_FINISHED) | @@ -347,18 +326,15 @@ static struct osmo_fsm_state tbf_ul_fsm_states[] = { .in_event_mask = X(TBF_EV_CONTENTION_RESOLUTION_MS_SUCCESS) | X(TBF_EV_FINAL_UL_ACK_CONFIRMED) | - X(TBF_EV_MAX_N3103) | - X(TBF_EV_MAX_N3105), + X(TBF_EV_MAX_N3103), .out_state_mask = X(TBF_ST_RELEASING), .name = "FINISHED", .action = st_finished, }, [TBF_ST_RELEASING] = { - .in_event_mask = - X(TBF_EV_MAX_N3105), - .out_state_mask = - 0, + .in_event_mask = 0, + .out_state_mask = 0, .name = "RELEASING", .action = st_releasing, .onenter = st_releasing_on_enter, |