aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPau Espin Pedrol <pespin@sysmocom.de>2023-06-09 17:43:57 +0200
committerPau Espin Pedrol <pespin@sysmocom.de>2023-06-09 18:38:28 +0200
commit365728d5794ce837dff18e45cf4241c65f10eed5 (patch)
tree85779bfa23a065f7e17de08b30ed1965cd6edb1f /src
parent89fbf87abf9d99ec7a6d8df5a42cef79d3fa964a (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.cpp8
-rw-r--r--src/tbf.cpp8
-rw-r--r--src/tbf_ul_fsm.c34
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,