From b3f239785ccba762d8ebbf704a3da21208bc9dca Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol Date: Fri, 23 Oct 2020 21:00:23 +0200 Subject: [PATCH] tbf: Make window() available to tbf base class Return an interface to the window base class so that the tbf base class can access the common window methods, such as set_ws(). It will be used in next commit to get rid of duplicated function enable_egprs in both dl_tbf and ul_tbf subclasses. The user of the function can then decide to access more specific functionaltiites of the window class by static casting it to the specific direction (which is known by the caller since it operates on a ul_tbf or a dl_tbf). Change-Id: Ia2e1decf91be1184668e28297c2126affb9c7ae4 --- src/encoding.cpp | 7 +++++-- src/gprs_rlcmac_sched.cpp | 2 +- src/pcu_vty_functions.cpp | 4 ++-- src/pdch.cpp | 10 ++++++---- src/tbf.h | 2 ++ src/tbf_dl.cpp | 2 +- src/tbf_dl.h | 2 +- src/tbf_ul.cpp | 2 +- src/tbf_ul.h | 2 +- tests/tbf/TbfTest.cpp | 26 +++++++++++++++----------- tests/types/TypesTest.cpp | 6 +++--- 11 files changed, 38 insertions(+), 27 deletions(-) diff --git a/src/encoding.cpp b/src/encoding.cpp index d581fe9d..ecfca512 100644 --- a/src/encoding.cpp +++ b/src/encoding.cpp @@ -886,9 +886,10 @@ static void write_packet_uplink_ack_gprs( bitvec * dest, unsigned& wp, struct gprs_rlcmac_ul_tbf *tbf, bool is_final) { + gprs_rlc_ul_window *window = static_cast(tbf->window()); bitvec_write_field(dest, &wp, mcs_chan_code(tbf->current_cs()), 2); // CHANNEL_CODING_COMMAND - write_packet_ack_nack_desc_gprs(dest, wp, tbf->window(), is_final); + write_packet_ack_nack_desc_gprs(dest, wp, window, is_final); bitvec_write_field(dest, &wp, 1, 1); // 1: have CONTENTION_RESOLUTION_TLLI bitvec_write_field(dest, &wp, tbf->tlli(), 32); // CONTENTION_RESOLUTION_TLLI @@ -1061,6 +1062,8 @@ static void write_packet_uplink_ack_egprs( bitvec * dest, unsigned& wp, struct gprs_rlcmac_ul_tbf *tbf, bool is_final) { + gprs_rlc_ul_window *window = static_cast(tbf->window()); + bitvec_write_field(dest, &wp, 0, 2); // fixed 00 /* CHANNEL_CODING_COMMAND */ bitvec_write_field(dest, &wp, @@ -1080,7 +1083,7 @@ static void write_packet_uplink_ack_egprs( /* -2 for last bit 0 mandatory and REL5 not supported */ unsigned bits_ack_nack = dest->data_len * 8 - wp - 2; - write_packet_ack_nack_desc_egprs(dest, wp, tbf->window(), is_final, bits_ack_nack); + write_packet_ack_nack_desc_egprs(dest, wp, window, is_final, bits_ack_nack); bitvec_write_field(dest, &wp, 0, 1); // fixed 0 bitvec_write_field(dest, &wp, 0, 1); // 0: don't have REL 5 diff --git a/src/gprs_rlcmac_sched.cpp b/src/gprs_rlcmac_sched.cpp index 3db33650..40b2f915 100644 --- a/src/gprs_rlcmac_sched.cpp +++ b/src/gprs_rlcmac_sched.cpp @@ -247,7 +247,7 @@ static struct msgb *sched_select_ctrl_msg( static inline enum tbf_dl_prio tbf_compute_priority(const struct gprs_rlcmac_bts *bts, struct gprs_rlcmac_dl_tbf *tbf, uint8_t ts, uint32_t fn, int age) { - const gprs_rlc_dl_window *w = tbf->window(); + const gprs_rlc_dl_window *w = static_cast(tbf->window()); unsigned long msecs_t3190 = osmo_tdef_get(bts->T_defs_pcu, 3190, OSMO_TDEF_MS, -1); unsigned long dl_tbf_idle_msec = osmo_tdef_get(bts->T_defs_pcu, -2031, OSMO_TDEF_MS, -1); int age_thresh1 = msecs_to_frames(200); diff --git a/src/pcu_vty_functions.cpp b/src/pcu_vty_functions.cpp index 33a4637e..28a15595 100644 --- a/src/pcu_vty_functions.cpp +++ b/src/pcu_vty_functions.cpp @@ -74,7 +74,7 @@ static void tbf_print_vty_info(struct vty *vty, gprs_rlcmac_tbf *tbf) vty_out(vty, " CS=%s", mcs_name(tbf->current_cs())); if (ul_tbf) { - gprs_rlc_ul_window *win = ul_tbf->window(); + gprs_rlc_ul_window *win = static_cast(ul_tbf->window()); vty_out(vty, " WS=%u V(Q)=%d V(R)=%d", ul_tbf->window_size(), win->v_q(), win->v_r()); vty_out(vty, "%s", VTY_NEWLINE); @@ -86,7 +86,7 @@ static void tbf_print_vty_info(struct vty *vty, gprs_rlcmac_tbf *tbf) } } if (dl_tbf) { - gprs_rlc_dl_window *win = dl_tbf->window(); + gprs_rlc_dl_window *win = static_cast(dl_tbf->window()); vty_out(vty, " WS=%u V(A)=%d V(S)=%d nBSN=%d%s", dl_tbf->window_size(), win->v_a(), win->v_s(), win->resend_needed(), win->window_stalled() ? " STALLED" : ""); diff --git a/src/pdch.cpp b/src/pdch.cpp index 7986373f..26604bcc 100644 --- a/src/pdch.cpp +++ b/src/pdch.cpp @@ -436,7 +436,7 @@ void gprs_rlcmac_pdch::rcv_control_dl_ack_nack(Packet_Downlink_Ack_Nack_t *ack_n num_blocks = Decoding::decode_gprs_acknack_bits( &ack_nack->Ack_Nack_Description, &bits, - &bsn_begin, &bsn_end, tbf->window()); + &bsn_begin, &bsn_end, static_cast(tbf->window())); LOGP(DRLCMAC, LOGL_DEBUG, "Got GPRS DL ACK bitmap: SSN: %d, BSN %d to %d - 1 (%d blocks), " @@ -467,6 +467,7 @@ void gprs_rlcmac_pdch::rcv_control_egprs_dl_ack_nack(EGPRS_PD_AckNack_t *ack_nac { int8_t tfi = 0; /* must be signed */ struct gprs_rlcmac_dl_tbf *tbf; + gprs_rlc_dl_window *window; int rc; int num_blocks; uint8_t bits_data[RLC_EGPRS_MAX_WS/8]; @@ -497,6 +498,7 @@ void gprs_rlcmac_pdch::rcv_control_egprs_dl_ack_nack(EGPRS_PD_AckNack_t *ack_nac LOGPTBF(tbf, LOGL_DEBUG, "RX: [PCU <- BTS] EGPRS Packet Downlink Ack/Nack\n"); + window = static_cast(tbf->window()); LOGP(DRLCMAC, LOGL_DEBUG, "EGPRS ACK/NACK: " "ut: %d, final: %d, bow: %d, eow: %d, ssn: %d, have_crbb: %d, " "urbb_len:%d, %p, %p, %d, %d, win: %d-%d, urbb: %s\n", @@ -511,8 +513,8 @@ void gprs_rlcmac_pdch::rcv_control_egprs_dl_ack_nack(EGPRS_PD_AckNack_t *ack_nac (void *)&ack_nack->EGPRS_AckNack.Desc, (int)offsetof(EGPRS_AckNack_t, Desc), (int)offsetof(EGPRS_AckNack_w_len_t, Desc), - tbf->window()->v_a(), - tbf->window()->v_s(), + window->v_a(), + window->v_s(), osmo_hexdump((const uint8_t *)&ack_nack->EGPRS_AckNack.Desc.URBB, sizeof(ack_nack->EGPRS_AckNack.Desc.URBB))); @@ -522,7 +524,7 @@ void gprs_rlcmac_pdch::rcv_control_egprs_dl_ack_nack(EGPRS_PD_AckNack_t *ack_nac num_blocks = Decoding::decode_egprs_acknack_bits( &ack_nack->EGPRS_AckNack.Desc, &bits, - &bsn_begin, &bsn_end, tbf->window()); + &bsn_begin, &bsn_end, window); LOGP(DRLCMAC, LOGL_DEBUG, "Got EGPRS DL ACK bitmap: SSN: %d, BSN %d to %d - 1 (%d blocks), " diff --git a/src/tbf.h b/src/tbf.h index 936ff653..bf51a8d5 100644 --- a/src/tbf.h +++ b/src/tbf.h @@ -185,6 +185,8 @@ struct gprs_rlcmac_tbf { static void free_all(struct gprs_rlcmac_trx *trx); static void free_all(struct gprs_rlcmac_pdch *pdch); + virtual gprs_rlc_window *window() = 0; + bool state_is(enum gprs_rlcmac_tbf_state rhs) const; bool state_is_not(enum gprs_rlcmac_tbf_state rhs) const; bool dl_ass_state_is(enum gprs_rlcmac_tbf_dl_ass_state rhs) const; diff --git a/src/tbf_dl.cpp b/src/tbf_dl.cpp index fc03c0b8..cbefb1ba 100644 --- a/src/tbf_dl.cpp +++ b/src/tbf_dl.cpp @@ -1000,7 +1000,7 @@ int gprs_rlcmac_dl_tbf::analyse_errors(char *show_rbb, uint8_t ssn, return lost * 100 / (lost + received); } -gprs_rlc_dl_window *gprs_rlcmac_dl_tbf::window() +gprs_rlc_window *gprs_rlcmac_dl_tbf::window() { return &m_window; } diff --git a/src/tbf_dl.h b/src/tbf_dl.h index bac524a4..51e170a1 100644 --- a/src/tbf_dl.h +++ b/src/tbf_dl.h @@ -40,7 +40,7 @@ enum tbf_dl_prio { struct gprs_rlcmac_dl_tbf : public gprs_rlcmac_tbf { gprs_rlcmac_dl_tbf(BTS *bts); - gprs_rlc_dl_window *window(); + gprs_rlc_window *window(); void cleanup(); void enable_egprs(); /* dispatch Unitdata.DL messages */ diff --git a/src/tbf_ul.cpp b/src/tbf_ul.cpp index 39e4e955..c347885e 100644 --- a/src/tbf_ul.cpp +++ b/src/tbf_ul.cpp @@ -615,7 +615,7 @@ void gprs_rlcmac_ul_tbf::set_window_size() m_window.set_ws(ws); } -gprs_rlc_ul_window *gprs_rlcmac_ul_tbf::window() +gprs_rlc_window *gprs_rlcmac_ul_tbf::window() { return &m_window; } diff --git a/src/tbf_ul.h b/src/tbf_ul.h index c6df0cd8..cbaffa5c 100644 --- a/src/tbf_ul.h +++ b/src/tbf_ul.h @@ -51,7 +51,7 @@ enum tbf_egprs_ul_counters { struct gprs_rlcmac_ul_tbf : public gprs_rlcmac_tbf { gprs_rlcmac_ul_tbf(BTS *bts); - gprs_rlc_ul_window *window(); + gprs_rlc_window *window(); struct msgb *create_ul_ack(uint32_t fn, uint8_t ts); bool ctrl_ack_to_toggle(); bool handle_ctrl_ack(); diff --git a/tests/tbf/TbfTest.cpp b/tests/tbf/TbfTest.cpp index 15a79d0c..2b5bda51 100644 --- a/tests/tbf/TbfTest.cpp +++ b/tests/tbf/TbfTest.cpp @@ -322,10 +322,11 @@ static void test_tbf_final_ack(enum test_tbf_final_ack_mode test_mode) } /* Receive an ACK */ -#define RCV_ACK(fin, tbf, rbb) do { \ - tbf->rcvd_dl_ack(fin, tbf->window()->v_s(), rbb); \ +#define RCV_ACK(fin, tbf, rbb) do { \ + gprs_rlc_dl_window *w = static_cast(tbf->window()); \ + tbf->rcvd_dl_ack(fin, w->v_s(), rbb); \ if (!fin) \ - OSMO_ASSERT(tbf->window()->window_empty()); \ + OSMO_ASSERT(w->window_empty()); \ } while(0) static void test_tbf_delayed_release() @@ -1748,7 +1749,7 @@ static void test_tbf_egprs_two_phase_puan(void) print_ta_tlli(ul_tbf, true); send_dl_data(&the_bts, tlli, imsi, test_data, sizeof(test_data)); - ul_tbf->window()->reset_state(); + static_cast(ul_tbf->window())->reset_state(); /* Function to generate URBB with length */ ul_tbf = establish_ul_tbf_two_phase_puan_URBB_with_length(&the_bts, ts_no, tlli, &fn, qta, ms_class, egprs_ms_class, ul_tbf); @@ -1756,7 +1757,7 @@ static void test_tbf_egprs_two_phase_puan(void) print_ta_tlli(ul_tbf, true); send_dl_data(&the_bts, tlli, imsi, test_data, sizeof(test_data)); - ul_tbf->window()->reset_state(); + static_cast(ul_tbf->window())->reset_state(); /* Function to generate CRBB */ bts->ws_base = 128; bts->ws_pdch = 64; @@ -2529,7 +2530,7 @@ static void test_tbf_epdan_out_of_rx_window(void) dl_tbf = create_dl_tbf(&the_bts, ms_class, egprs_ms_class, &trx_no); dl_tbf->update_ms(tlli, GPRS_RLCMAC_DL_TBF); - prlcdlwindow = dl_tbf->window(); + prlcdlwindow = static_cast(dl_tbf->window()); prlcmvb = &prlcdlwindow->m_v_b; prlcdlwindow->m_v_s = 1288; prlcdlwindow->m_v_a = 1176; @@ -2562,7 +2563,7 @@ static void test_tbf_epdan_out_of_rx_window(void) Decoding::decode_egprs_acknack_bits( &ack_nack->EGPRS_AckNack.Desc, &bits, - &bsn_begin, &bsn_end, dl_tbf->window()); + &bsn_begin, &bsn_end, prlcdlwindow); dl_tbf->rcvd_dl_ack( ack_nack->EGPRS_AckNack.Desc.FINAL_ACK_INDICATION, @@ -2747,17 +2748,20 @@ static void tbf_cleanup(gprs_rlcmac_dl_tbf *dl_tbf) } #define NACK(tbf, x) do { \ - tbf->window()->m_v_b.mark_nacked(x); \ - OSMO_ASSERT(tbf->window()->m_v_b.is_nacked(x)); \ + gprs_rlc_dl_window *w = static_cast(tbf->window()); \ + w->m_v_b.mark_nacked(x); \ + OSMO_ASSERT(w->m_v_b.is_nacked(x)); \ } while(0) #define CHECK_UNACKED(tbf, cs, bsn) do { \ - OSMO_ASSERT(tbf->window()->m_v_b.is_unacked(bsn)); \ + gprs_rlc_dl_window *w = static_cast(tbf->window()); \ + OSMO_ASSERT(w->m_v_b.is_unacked(bsn)); \ OSMO_ASSERT(mcs_chan_code(tbf->m_rlc.block(bsn)->cs_current_trans) == cs - 1); \ } while(0) #define CHECK_NACKED(tbf, cs, bsn) do { \ - OSMO_ASSERT(tbf->window()->m_v_b.is_nacked(bsn)); \ + gprs_rlc_dl_window *w = static_cast(tbf->window()); \ + OSMO_ASSERT(w->m_v_b.is_nacked(bsn)); \ OSMO_ASSERT(mcs_chan_code(tbf->m_rlc.block(bsn)->cs_current_trans) == cs - 1); \ } while(0) diff --git a/tests/types/TypesTest.cpp b/tests/types/TypesTest.cpp index 353d8212..1c846e11 100644 --- a/tests/types/TypesTest.cpp +++ b/tests/types/TypesTest.cpp @@ -559,7 +559,7 @@ static void extract_egprs_ul_ack_nack( *ssn = bitvec_get_uint(dest, 11); if (bow) { - OSMO_ASSERT(*ssn == tbf->window()->v_q() + 1); + OSMO_ASSERT(*ssn == static_cast(tbf->window())->v_q() + 1); } crbb_test->has_crbb = bitvec_get_uint(dest, 1); @@ -596,7 +596,7 @@ static void extract_egprs_ul_ack_nack( static void check_egprs_bitmap(struct gprs_rlcmac_ul_tbf *tbf, uint16_t ssn, struct crbb_test *crbb_test, bitvec *urbb, unsigned int *rbb_size) { - gprs_rlc_ul_window *win = tbf->window(); + gprs_rlc_ul_window *win = static_cast(tbf->window()); uint8_t rbb_should[RLC_EGPRS_MAX_WS] = {0}; bitvec rbb_should_bv; rbb_should_bv.data = rbb_should; @@ -680,7 +680,7 @@ static void test_egprs_ul_ack_nack() bitvec *rbb = NULL; unsigned int rbb_size; uint16_t ssn = 0; - gprs_rlc_ul_window *win = tbf->window(); + gprs_rlc_ul_window *win = static_cast(tbf->window()); fprintf(stderr, "************** Test with empty window\n"); win->reset_state();