Commit f0a1c099 authored by Robert Schmidt's avatar Robert Schmidt Committed by ChiehChun

Make multiple passes over RLC to get all data

parent aa326433
...@@ -815,10 +815,15 @@ void nr_schedule_ue_spec(module_id_t module_id, ...@@ -815,10 +815,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
...@@ -826,13 +831,10 @@ void nr_schedule_ue_spec(module_id_t module_id, ...@@ -826,13 +831,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,
...@@ -853,6 +855,8 @@ void nr_schedule_ue_spec(module_id_t module_id, ...@@ -853,6 +855,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;
...@@ -863,7 +867,19 @@ void nr_schedule_ue_spec(module_id_t module_id, ...@@ -863,7 +867,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) { else if (get_softmodem_params()->phy_test) {
/* 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