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