Commit e328a6cc authored by Robert Schmidt's avatar Robert Schmidt

Make multiple passes over RLC to get all data

parent 76d154f0
...@@ -821,10 +821,15 @@ void nr_schedule_ue_spec(module_id_t module_id, ...@@ -821,10 +821,15 @@ void nr_schedule_ue_spec(module_id_t module_id,
NULL); // contention res id NULL); // contention res id
buf += written; buf += written;
int size = TBS - written; int size = TBS - written;
DevAssert(size >= 0);
DevAssert(size > 3);
/* next, get RLC data */ /* next, get RLC data */
const int lcid = DL_SCH_LCID_DTCH;
int dlsch_total_bytes = 0;
if (sched_ctrl->num_total_bytes > 0) {
tbs_size_t len = 0;
while (size > 3) {
// we do not know how much data we will get from RLC, i.e., whether it // we do not know how much data we will get from RLC, i.e., whether it
// will be longer than 256B or not. Therefore, reserve space for long header, then // will be longer than 256B or not. Therefore, reserve space for long header, then
// fetch data, then fill real length // fetch data, then fill real length
...@@ -832,13 +837,10 @@ void nr_schedule_ue_spec(module_id_t module_id, ...@@ -832,13 +837,10 @@ void nr_schedule_ue_spec(module_id_t module_id,
buf += 3; buf += 3;
size -= 3; size -= 3;
const int lcid = DL_SCH_LCID_DTCH; /* limit requested number of bytes to what preprocessor specified, or
int dlsch_total_bytes = 0; * such that TBS is full */
if (sched_ctrl->num_total_bytes > 0) {
/* this is the data from the RLC we would like to request (e.g., only
* some bytes for first LC and some more from a second one */
const rlc_buffer_occupancy_t ndata = min(sched_ctrl->rlc_status[lcid].bytes_in_buffer, size); const rlc_buffer_occupancy_t ndata = min(sched_ctrl->rlc_status[lcid].bytes_in_buffer, size);
const tbs_size_t len = mac_rlc_data_req(module_id, len = mac_rlc_data_req(module_id,
rnti, rnti,
module_id, module_id,
frame, frame,
...@@ -859,6 +861,8 @@ void nr_schedule_ue_spec(module_id_t module_id, ...@@ -859,6 +861,8 @@ void nr_schedule_ue_spec(module_id_t module_id,
lcid, lcid,
ndata, ndata,
size); size);
if (len == 0)
break;
header->R = 0; header->R = 0;
header->F = 1; header->F = 1;
...@@ -869,7 +873,19 @@ void nr_schedule_ue_spec(module_id_t module_id, ...@@ -869,7 +873,19 @@ void nr_schedule_ue_spec(module_id_t module_id,
buf += len; buf += len;
dlsch_total_bytes += len; dlsch_total_bytes += len;
} }
if (len == 0) {
/* RLC did not have data anymore, mark buffer as unused */
buf -= 3;
size += 3;
}
}
else if (get_softmodem_params()->phy_test || get_softmodem_params()->do_ra) { else if (get_softmodem_params()->phy_test || get_softmodem_params()->do_ra) {
/* we will need the large header, phy-test typically allocates all
* resources and fills to the last byte below */
NR_MAC_SUBHEADER_LONG *header = (NR_MAC_SUBHEADER_LONG *) buf;
buf += 3;
size -= 3;
DevAssert(size > 0);
LOG_D(MAC, "Configuring DL_TX in %d.%d: TBS %d with %d B of random data\n", frame, slot, TBS, size); LOG_D(MAC, "Configuring DL_TX in %d.%d: TBS %d with %d B of random data\n", frame, slot, TBS, size);
// fill dlsch_buffer with random data // fill dlsch_buffer with random data
for (int i = 0; i < size; i++) for (int i = 0; i < size; i++)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment