Pass gprs_rlcmac_pdch to create_dl_acked_block()
This allows having full TS information, not only ts_no, which will be
needed later on followup patches.
Change-Id: I1efccb32c5afa4fe62233bf114ea95b6fbbe1a06
diff --git a/src/gprs_rlcmac_sched.cpp b/src/gprs_rlcmac_sched.cpp
index 87a3733..0a72e3b 100644
--- a/src/gprs_rlcmac_sched.cpp
+++ b/src/gprs_rlcmac_sched.cpp
@@ -278,7 +278,6 @@
struct msgb *msg = NULL;
struct gprs_rlcmac_dl_tbf *tbf, *prio_tbf = NULL;
enum tbf_dl_prio prio, max_prio = DL_PRIO_NONE;
- uint8_t ts = pdch->ts_no;
uint8_t i, tfi, prio_tfi;
int age;
@@ -334,7 +333,7 @@
/* next TBF to handle resource is the next one */
pdch->next_dl_tfi = (prio_tfi + 1) & 31;
/* generate DL data block */
- msg = prio_tbf->create_dl_acked_block(fn, ts, req_mcs_kind);
+ msg = prio_tbf->create_dl_acked_block(fn, pdch, req_mcs_kind);
*is_egprs = prio_tbf->is_egprs_enabled();
}
diff --git a/src/tbf_dl.cpp b/src/tbf_dl.cpp
index 16dc47b..9214aae 100644
--- a/src/tbf_dl.cpp
+++ b/src/tbf_dl.cpp
@@ -391,7 +391,7 @@
* Create DL data block
* The messages are fragmented and forwarded as data blocks.
*/
-struct msgb *gprs_rlcmac_dl_tbf::create_dl_acked_block(uint32_t fn, uint8_t ts, enum mcs_kind req_mcs_kind)
+struct msgb *gprs_rlcmac_dl_tbf::create_dl_acked_block(uint32_t fn, const struct gprs_rlcmac_pdch *pdch, enum mcs_kind req_mcs_kind)
{
int bsn, bsn2 = -1;
bool may_combine;
@@ -406,7 +406,7 @@
if (may_combine)
bsn2 = take_next_bsn(fn, bsn, req_mcs_kind, &may_combine);
- return create_dl_acked_block(fn, ts, bsn, bsn2);
+ return create_dl_acked_block(fn, pdch, bsn, bsn2);
}
/* old_tbf (UL TBF or DL TBF) will send a Pkt Dl Ass on PACCH to assign tbf.
@@ -621,7 +621,7 @@
}
struct msgb *gprs_rlcmac_dl_tbf::create_dl_acked_block(
- const uint32_t fn, const uint8_t ts,
+ const uint32_t fn, const struct gprs_rlcmac_pdch *pdch,
int index, int index2)
{
uint8_t *msg_data;
@@ -803,12 +803,12 @@
POLL_ACK_AFTER_FRAMES);
}
- rc = check_polling(fn, ts, &new_poll_fn, &rrbp);
+ rc = check_polling(fn, pdch->ts_no, &new_poll_fn, &rrbp);
if (rc >= 0) {
- set_polling(new_poll_fn, ts, PDCH_ULC_POLL_DL_ACK);
+ set_polling(new_poll_fn, pdch->ts_no, PDCH_ULC_POLL_DL_ACK);
LOGPTBFDL(this, LOGL_DEBUG,
"Scheduled DL Acknowledgement polling on PACCH (FN=%d, TS=%d)\n",
- new_poll_fn, ts);
+ new_poll_fn, pdch->ts_no);
m_tx_counter = 0;
/* start timer whenever we send the final block */
@@ -828,7 +828,7 @@
LOGPTBFDL(this, LOGL_INFO,
"Scheduled Ack/Nack polling on FN=%d, TS=%d\n",
- new_poll_fn, ts);
+ new_poll_fn, pdch->ts_no);
}
}
diff --git a/src/tbf_dl.h b/src/tbf_dl.h
index 2fc4f5f..4fdfbed 100644
--- a/src/tbf_dl.h
+++ b/src/tbf_dl.h
@@ -48,7 +48,8 @@
gprs_rlc_window *window();
int rcvd_dl_ack(bool final_ack, unsigned first_bsn, struct bitvec *rbb);
- struct msgb *create_dl_acked_block(uint32_t fn, uint8_t ts, enum mcs_kind req_mcs_kind = EGPRS);
+ struct msgb *create_dl_acked_block(uint32_t fn, const gprs_rlcmac_pdch *pdch,
+ enum mcs_kind req_mcs_kind = EGPRS);
void request_dl_ack();
bool need_poll_for_dl_ack_nack() const;
@@ -100,8 +101,8 @@
bool *may_combine);
bool restart_bsn_cycle();
int create_new_bsn(const uint32_t fn, enum CodingScheme cs);
- struct msgb *create_dl_acked_block(const uint32_t fn, const uint8_t ts,
- int index, int index2 = -1);
+ struct msgb *create_dl_acked_block(const uint32_t fn, const struct gprs_rlcmac_pdch *pdch,
+ int index, int index2 = -1);
int update_window(unsigned first_bsn, const struct bitvec *rbb);
int rcvd_dl_final_ack();
bool dl_window_stalled() const;
diff --git a/tests/tbf/TbfTest.cpp b/tests/tbf/TbfTest.cpp
index ba357e3..6d57843 100644
--- a/tests/tbf/TbfTest.cpp
+++ b/tests/tbf/TbfTest.cpp
@@ -535,6 +535,7 @@
{
the_pcu = prepare_pcu();
struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);
+ struct gprs_rlcmac_pdch *pdch;
uint8_t ts_no = 4;
uint8_t ms_class = 45;
int rc = 0;
@@ -554,6 +555,7 @@
fprintf(stderr, "=== start %s ===\n", __func__);
setup_bts(bts, ts_no);
+ pdch = &bts->trx[0].pdch[ts_no];
/* keep the MS object 10 seconds */
OSMO_ASSERT(osmo_tdef_set(the_pcu->T_defs, -2030, 10, OSMO_TDEF_S) == 0);
@@ -612,7 +614,7 @@
};
while (ms_dl_tbf(ms)->have_data()) {
- msg = ms_dl_tbf(ms)->create_dl_acked_block(fn += 4, ts_no);
+ msg = ms_dl_tbf(ms)->create_dl_acked_block(fn += 4, pdch);
fprintf(stderr, "MSG = %s\n", msgb_hexdump(msg));
if (!msgb_eq_data_print(msg, exp[expected_data - 1], GSM_MACBLOCK_LEN))
fprintf(stderr, "%s failed at %u\n", __func__, expected_data);
@@ -2865,7 +2867,7 @@
} while(0)
#define MAKE_ACKED(m, tbf, fn, cs, check_unacked) do { \
- m = tbf->create_dl_acked_block(fn, tbf->control_ts->ts_no); \
+ m = tbf->create_dl_acked_block(fn, tbf->control_ts); \
OSMO_ASSERT(m); \
if (check_unacked) \
CHECK_UNACKED(tbf, cs, 0); \
@@ -2940,7 +2942,7 @@
NACK(dl_tbf, 0);
- msg = dl_tbf->create_dl_acked_block(fn, dl_tbf->control_ts->ts_no);
+ msg = dl_tbf->create_dl_acked_block(fn, dl_tbf->control_ts);
egprs2 = (struct gprs_rlc_dl_header_egprs_2 *) msg->data;
/* Table 10.4.8a.3.1 of 44.060 */