From a621d59ea825bbfc2423ce03bd4b8773af53e522 Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol Date: Tue, 13 Dec 2022 17:35:04 +0100 Subject: Refactor code rejecting UL-TBF upon rx of PktResourceReq * Make it similar to the already existing TBF allocation procedures * Pass pdch pointer instead of trx and ts numbers Change-Id: I04b3b65942732cc652adeaa507529b849292ff61 --- src/gprs_ms.c | 16 ++++++++++++++++ src/gprs_ms.h | 1 + src/pdch.cpp | 2 +- src/tbf_ul.cpp | 14 ++++++-------- src/tbf_ul.h | 4 ++-- tests/tbf/TbfTest.cpp | 2 +- 6 files changed, 27 insertions(+), 12 deletions(-) diff --git a/src/gprs_ms.c b/src/gprs_ms.c index c9eaf975..073dd4a7 100644 --- a/src/gprs_ms.c +++ b/src/gprs_ms.c @@ -1160,6 +1160,22 @@ struct gprs_rlcmac_ul_tbf *ms_new_ul_tbf_assigned_agch(struct GprsMs *ms) return ul_tbf; } +/* Create a temporary dummy TBF to Tx a ImmAssReject if allocating a new one during + * packet resource Request failed. This is similar as ul_tbf_alloc() but without + * calling tbf->setup() (in charge of TFI/USF allocation), and reusing resources + * from Packet Resource Request we received. See TS 44.060 sec 7.1.3.2.1 */ +struct gprs_rlcmac_ul_tbf *ms_new_ul_tbf_rejected_pacch(struct GprsMs *ms, struct gprs_rlcmac_pdch *pdch) +{ + struct gprs_rlcmac_ul_tbf *ul_tbf; + ul_tbf = ul_tbf_alloc_rejected(ms->bts, ms, pdch); + if (!ul_tbf) + return NULL; + osmo_fsm_inst_dispatch(tbf_state_fi(ul_tbf_as_tbf(ul_tbf)), TBF_EV_ASSIGN_ADD_PACCH, NULL); + osmo_fsm_inst_dispatch(tbf_ul_ass_fi(ul_tbf_as_tbf(ul_tbf)), TBF_UL_ASS_EV_SCHED_ASS_REJ, NULL); + + return ul_tbf; +} + /* A new DL-TBF is allocated and assigned through PACCH using "tbf". * "tbf" may be either a UL-TBF or a DL-TBF. * Note: This should be called only when MS is reachable, see ms_is_reachable_for_dl_ass(). diff --git a/src/gprs_ms.h b/src/gprs_ms.h index 716ad74e..92292e39 100644 --- a/src/gprs_ms.h +++ b/src/gprs_ms.h @@ -151,6 +151,7 @@ struct msgb *ms_nacc_create_rlcmac_msg(struct GprsMs *ms, struct gprs_rlcmac_tbf struct gprs_rlcmac_ul_tbf *ms_new_ul_tbf_assigned_pacch(struct GprsMs *ms, int8_t use_trx); struct gprs_rlcmac_ul_tbf *ms_new_ul_tbf_assigned_agch(struct GprsMs *ms); +struct gprs_rlcmac_ul_tbf *ms_new_ul_tbf_rejected_pacch(struct GprsMs *ms, struct gprs_rlcmac_pdch *pdch); int ms_new_dl_tbf_assigned_on_pacch(struct GprsMs *ms, struct gprs_rlcmac_tbf *tbf); int ms_new_dl_tbf_assigned_on_pch(struct GprsMs *ms); int ms_append_llc_dl_data(struct GprsMs *ms, uint16_t pdu_delay_csec, const uint8_t *data, uint16_t len); diff --git a/src/pdch.cpp b/src/pdch.cpp index 75afc889..5a683ff7 100644 --- a/src/pdch.cpp +++ b/src/pdch.cpp @@ -825,7 +825,7 @@ void gprs_rlcmac_pdch::rcv_resource_request(Packet_Resource_Request_t *request, new_ul_tbf = ms_new_ul_tbf_assigned_pacch(ms, trx_no()); if (!new_ul_tbf) { - handle_tbf_reject(bts, ms, trx_no(), ts_no); + ms_new_ul_tbf_rejected_pacch(ms, this); goto return_unref; } diff --git a/src/tbf_ul.cpp b/src/tbf_ul.cpp index 8333a2f0..b04c5117 100644 --- a/src/tbf_ul.cpp +++ b/src/tbf_ul.cpp @@ -151,11 +151,11 @@ struct gprs_rlcmac_ul_tbf *ul_tbf_alloc(struct gprs_rlcmac_bts *bts, struct Gprs * packet resource Request failed. This is similar as tbf_alloc_ul() but without * calling tbf->setup() (in charge of TFI/USF allocation), and reusing resources * from Packet Resource Request we received. See TS 44.060 sec 7.1.3.2.1 */ -struct gprs_rlcmac_ul_tbf *handle_tbf_reject(struct gprs_rlcmac_bts *bts, - GprsMs *ms, uint8_t trx_no, uint8_t ts) +struct gprs_rlcmac_ul_tbf *ul_tbf_alloc_rejected(struct gprs_rlcmac_bts *bts, struct GprsMs *ms, + struct gprs_rlcmac_pdch *pdch) { struct gprs_rlcmac_ul_tbf *ul_tbf = NULL; - struct gprs_rlcmac_trx *trx = &bts->trx[trx_no]; + struct gprs_rlcmac_trx *trx = pdch->trx; OSMO_ASSERT(ms); ul_tbf = talloc(tall_pcu_ctx, struct gprs_rlcmac_ul_tbf); @@ -166,7 +166,7 @@ struct gprs_rlcmac_ul_tbf *handle_tbf_reject(struct gprs_rlcmac_bts *bts, ul_tbf->trx = trx; /* The only one TS is the common, control TS */ - ms_set_first_common_ts(ms, ts); + ms_set_first_common_ts(ms, pdch->ts_no); tbf_assign_control_ts(ul_tbf); ul_tbf->m_ctrs = rate_ctr_group_alloc(ul_tbf, &tbf_ctrg_desc, next_tbf_ctr_group_id++); ul_tbf->m_ul_egprs_ctrs = rate_ctr_group_alloc(ul_tbf, @@ -176,17 +176,15 @@ struct gprs_rlcmac_ul_tbf *handle_tbf_reject(struct gprs_rlcmac_bts *bts, &tbf_ul_gprs_ctrg_desc, ul_tbf->m_ctrs->idx); if (!ul_tbf->m_ctrs || !ul_tbf->m_ul_egprs_ctrs || !ul_tbf->m_ul_gprs_ctrs) { - LOGPTBF(ul_tbf, LOGL_ERROR, "Cound not allocate TBF UL rate counters\n"); + LOGPTBF(ul_tbf, LOGL_ERROR, "Could not allocate TBF UL rate counters\n"); talloc_free(ul_tbf); return NULL; } tbf_update_state_fsm_name(ul_tbf); ms_attach_tbf(ms, ul_tbf); - llist_add(tbf_trx_list((struct gprs_rlcmac_tbf *)ul_tbf), &trx->ul_tbfs); + llist_add(tbf_trx_list(ul_tbf), &trx->ul_tbfs); bts_do_rate_ctr_inc(ul_tbf->bts, CTR_TBF_UL_ALLOCATED); - osmo_fsm_inst_dispatch(ul_tbf->state_fi, TBF_EV_ASSIGN_ADD_PACCH, NULL); - osmo_fsm_inst_dispatch(ul_tbf->ul_ass_fsm.fi, TBF_UL_ASS_EV_SCHED_ASS_REJ, NULL); return ul_tbf; } diff --git a/src/tbf_ul.h b/src/tbf_ul.h index c5c55f7a..aa54c8fb 100644 --- a/src/tbf_ul.h +++ b/src/tbf_ul.h @@ -123,8 +123,6 @@ inline uint16_t gprs_rlcmac_ul_tbf::window_size() const return m_window.ws(); } -struct gprs_rlcmac_ul_tbf *handle_tbf_reject(struct gprs_rlcmac_bts *bts, - GprsMs *ms, uint8_t trx_no, uint8_t ts_no); #else /* ifdef __cplusplus */ struct gprs_rlcmac_ul_tbf; @@ -135,6 +133,8 @@ struct gprs_rlcmac_ul_tbf; extern "C" { #endif struct gprs_rlcmac_ul_tbf *ul_tbf_alloc(struct gprs_rlcmac_bts *bts, struct GprsMs *ms, int8_t use_trx, bool single_slot); +struct gprs_rlcmac_ul_tbf *ul_tbf_alloc_rejected(struct gprs_rlcmac_bts *bts, struct GprsMs *ms, + struct gprs_rlcmac_pdch *pdch); void update_tbf_ta(struct gprs_rlcmac_ul_tbf *tbf, int8_t ta_delta); void set_tbf_ta(struct gprs_rlcmac_ul_tbf *tbf, uint8_t ta); struct gprs_rlcmac_ul_tbf *tbf_as_ul_tbf(struct gprs_rlcmac_tbf *tbf); diff --git a/tests/tbf/TbfTest.cpp b/tests/tbf/TbfTest.cpp index 314d2d9f..80dfc2fa 100644 --- a/tests/tbf/TbfTest.cpp +++ b/tests/tbf/TbfTest.cpp @@ -3240,7 +3240,7 @@ static void test_packet_access_rej_prr_no_other_tbfs() ms = bts_alloc_ms(bts, 0, 0); ms_set_tlli(ms, tlli); - ul_tbf = handle_tbf_reject(bts, ms, trx_no, ts_no); + ul_tbf = ms_new_ul_tbf_rejected_pacch(ms, &bts->trx[trx_no].pdch[ts_no]); OSMO_ASSERT(ul_tbf != 0); -- cgit v1.2.3