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
This commit is contained in:
Pau Espin 2020-10-23 21:00:23 +02:00
parent 834cbab97d
commit b3f239785c
11 changed files with 38 additions and 27 deletions

View File

@ -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<gprs_rlc_ul_window *>(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<gprs_rlc_ul_window *>(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

View File

@ -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<gprs_rlc_dl_window *>(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);

View File

@ -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<gprs_rlc_ul_window *>(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<gprs_rlc_dl_window *>(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" : "");

View File

@ -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<gprs_rlc_dl_window *>(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<gprs_rlc_dl_window *>(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), "

View File

@ -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;

View File

@ -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;
}

View File

@ -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 */

View File

@ -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;
}

View File

@ -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();

View File

@ -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<gprs_rlc_dl_window *>(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<gprs_rlc_ul_window *>(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<gprs_rlc_ul_window *>(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<gprs_rlc_dl_window *>(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<gprs_rlc_dl_window *>(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<gprs_rlc_dl_window *>(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<gprs_rlc_dl_window *>(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)

View File

@ -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<gprs_rlc_ul_window *>(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<gprs_rlc_ul_window *>(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<gprs_rlc_ul_window *>(tbf->window());
fprintf(stderr, "************** Test with empty window\n");
win->reset_state();