Commit 11eeafd3 authored by hardy's avatar hardy

Merge remote-tracking branch 'origin/repair-TA' into integration_2020_wk48_2

parents 865888b3 d116c608
...@@ -304,9 +304,8 @@ int nr_generate_dlsch_pdu(module_id_t module_idP, ...@@ -304,9 +304,8 @@ int nr_generate_dlsch_pdu(module_id_t module_idP,
// 2) Generation of DLSCH MAC subPDUs including subheaders and MAC SDUs // 2) Generation of DLSCH MAC subPDUs including subheaders and MAC SDUs
for (i = 0; i < num_sdus; i++) { for (i = 0; i < num_sdus; i++) {
LOG_D(MAC, "[gNB] Generate DLSCH header num sdu %d len sdu %d\n", num_sdus, sdu_lengths[i]);
if (sdu_lengths[i] < 128) { if (sdu_lengths[i] < 256) {
((NR_MAC_SUBHEADER_SHORT *) mac_pdu_ptr)->R = 0; ((NR_MAC_SUBHEADER_SHORT *) mac_pdu_ptr)->R = 0;
((NR_MAC_SUBHEADER_SHORT *) mac_pdu_ptr)->F = 0; ((NR_MAC_SUBHEADER_SHORT *) mac_pdu_ptr)->F = 0;
((NR_MAC_SUBHEADER_SHORT *) mac_pdu_ptr)->LCID = sdu_lcids[i]; ((NR_MAC_SUBHEADER_SHORT *) mac_pdu_ptr)->LCID = sdu_lcids[i];
...@@ -316,7 +315,7 @@ int nr_generate_dlsch_pdu(module_id_t module_idP, ...@@ -316,7 +315,7 @@ int nr_generate_dlsch_pdu(module_id_t module_idP,
((NR_MAC_SUBHEADER_LONG *) mac_pdu_ptr)->R = 0; ((NR_MAC_SUBHEADER_LONG *) mac_pdu_ptr)->R = 0;
((NR_MAC_SUBHEADER_LONG *) mac_pdu_ptr)->F = 1; ((NR_MAC_SUBHEADER_LONG *) mac_pdu_ptr)->F = 1;
((NR_MAC_SUBHEADER_LONG *) mac_pdu_ptr)->LCID = sdu_lcids[i]; ((NR_MAC_SUBHEADER_LONG *) mac_pdu_ptr)->LCID = sdu_lcids[i];
((NR_MAC_SUBHEADER_LONG *) mac_pdu_ptr)->L1 = ((unsigned short) sdu_lengths[i] >> 8) & 0x7f; ((NR_MAC_SUBHEADER_LONG *) mac_pdu_ptr)->L1 = ((unsigned short) sdu_lengths[i] >> 8) & 0xff;
((NR_MAC_SUBHEADER_LONG *) mac_pdu_ptr)->L2 = (unsigned short) sdu_lengths[i] & 0xff; ((NR_MAC_SUBHEADER_LONG *) mac_pdu_ptr)->L2 = (unsigned short) sdu_lengths[i] & 0xff;
last_size = 3; last_size = 3;
} }
...@@ -326,6 +325,7 @@ int nr_generate_dlsch_pdu(module_id_t module_idP, ...@@ -326,6 +325,7 @@ int nr_generate_dlsch_pdu(module_id_t module_idP,
memcpy((void *) mac_pdu_ptr, (void *) dlsch_buffer_ptr, sdu_lengths[i]); memcpy((void *) mac_pdu_ptr, (void *) dlsch_buffer_ptr, sdu_lengths[i]);
dlsch_buffer_ptr += sdu_lengths[i]; dlsch_buffer_ptr += sdu_lengths[i];
mac_pdu_ptr += sdu_lengths[i]; mac_pdu_ptr += sdu_lengths[i];
LOG_D(MAC, "Generate DLSCH header num sdu %d len header %d len sdu %d -> offset %ld\n", num_sdus, last_size, sdu_lengths[i], (unsigned char *)mac_pdu_ptr - mac_pdu);
} }
// 4) Compute final offset for padding // 4) Compute final offset for padding
...@@ -333,6 +333,7 @@ int nr_generate_dlsch_pdu(module_id_t module_idP, ...@@ -333,6 +333,7 @@ int nr_generate_dlsch_pdu(module_id_t module_idP,
((NR_MAC_SUBHEADER_FIXED *) mac_pdu_ptr)->R = 0; ((NR_MAC_SUBHEADER_FIXED *) mac_pdu_ptr)->R = 0;
((NR_MAC_SUBHEADER_FIXED *) mac_pdu_ptr)->LCID = DL_SCH_LCID_PADDING; ((NR_MAC_SUBHEADER_FIXED *) mac_pdu_ptr)->LCID = DL_SCH_LCID_PADDING;
mac_pdu_ptr++; mac_pdu_ptr++;
LOG_D(MAC, "Generate Padding -> offset %ld\n", (unsigned char *)mac_pdu_ptr - mac_pdu);
} else { } else {
// no MAC subPDU with padding // no MAC subPDU with padding
} }
...@@ -361,6 +362,7 @@ void nr_rx_acknack(nfapi_nr_uci_pusch_pdu_t *uci_pusch, ...@@ -361,6 +362,7 @@ void nr_rx_acknack(nfapi_nr_uci_pusch_pdu_t *uci_pusch,
for (int harq_idx = harq_idx_s; harq_idx < NR_MAX_NB_HARQ_PROCESSES; harq_idx++) { for (int harq_idx = harq_idx_s; harq_idx < NR_MAX_NB_HARQ_PROCESSES; harq_idx++) {
// if the gNB received ack with a good confidence // if the gNB received ack with a good confidence
if ((UL_info->slot-1) == sched_ctrl->harq_processes[harq_idx].feedback_slot) { if ((UL_info->slot-1) == sched_ctrl->harq_processes[harq_idx].feedback_slot) {
sched_ctrl->harq_processes[harq_idx].feedback_slot = -1;
if ((uci_01->harq->harq_list[harq_bit].harq_value == 1) && if ((uci_01->harq->harq_list[harq_bit].harq_value == 1) &&
(uci_01->harq->harq_confidence_level == 0)) { (uci_01->harq->harq_confidence_level == 0)) {
// toggle NDI and reset round // toggle NDI and reset round
...@@ -380,8 +382,10 @@ void nr_rx_acknack(nfapi_nr_uci_pusch_pdu_t *uci_pusch, ...@@ -380,8 +382,10 @@ void nr_rx_acknack(nfapi_nr_uci_pusch_pdu_t *uci_pusch,
break; break;
} }
// if feedback slot processing is aborted // if feedback slot processing is aborted
else if (((UL_info->slot-1) > sched_ctrl->harq_processes[harq_idx].feedback_slot) && else if (sched_ctrl->harq_processes[harq_idx].feedback_slot != -1
(sched_ctrl->harq_processes[harq_idx].is_waiting)) { && (UL_info->slot-1) > sched_ctrl->harq_processes[harq_idx].feedback_slot
&& sched_ctrl->harq_processes[harq_idx].is_waiting) {
sched_ctrl->harq_processes[harq_idx].feedback_slot = -1;
sched_ctrl->harq_processes[harq_idx].round++; sched_ctrl->harq_processes[harq_idx].round++;
if (sched_ctrl->harq_processes[harq_idx].round == max_harq_rounds) { if (sched_ctrl->harq_processes[harq_idx].round == max_harq_rounds) {
sched_ctrl->harq_processes[harq_idx].ndi ^= 1; sched_ctrl->harq_processes[harq_idx].ndi ^= 1;
...@@ -405,6 +409,7 @@ void nr_rx_acknack(nfapi_nr_uci_pusch_pdu_t *uci_pusch, ...@@ -405,6 +409,7 @@ void nr_rx_acknack(nfapi_nr_uci_pusch_pdu_t *uci_pusch,
// if the gNB received ack with a good confidence or if the max harq rounds was reached // if the gNB received ack with a good confidence or if the max harq rounds was reached
if ((UL_info->slot-1) == sched_ctrl->harq_processes[harq_idx].feedback_slot) { if ((UL_info->slot-1) == sched_ctrl->harq_processes[harq_idx].feedback_slot) {
// TODO add some confidence level for when there is no CRC // TODO add some confidence level for when there is no CRC
sched_ctrl->harq_processes[harq_idx].feedback_slot = -1;
if ((uci_234->harq.harq_crc != 1) && acknack) { if ((uci_234->harq.harq_crc != 1) && acknack) {
// toggle NDI and reset round // toggle NDI and reset round
sched_ctrl->harq_processes[harq_idx].ndi ^= 1; sched_ctrl->harq_processes[harq_idx].ndi ^= 1;
...@@ -423,8 +428,10 @@ void nr_rx_acknack(nfapi_nr_uci_pusch_pdu_t *uci_pusch, ...@@ -423,8 +428,10 @@ void nr_rx_acknack(nfapi_nr_uci_pusch_pdu_t *uci_pusch,
break; break;
} }
// if feedback slot processing is aborted // if feedback slot processing is aborted
else if (((UL_info->slot-1) > sched_ctrl->harq_processes[harq_idx].feedback_slot) && else if (sched_ctrl->harq_processes[harq_idx].feedback_slot != -1
(sched_ctrl->harq_processes[harq_idx].is_waiting)) { && (UL_info->slot-1) > sched_ctrl->harq_processes[harq_idx].feedback_slot
&& sched_ctrl->harq_processes[harq_idx].is_waiting) {
sched_ctrl->harq_processes[harq_idx].feedback_slot = -1;
sched_ctrl->harq_processes[harq_idx].round++; sched_ctrl->harq_processes[harq_idx].round++;
if (sched_ctrl->harq_processes[harq_idx].round == max_harq_rounds) { if (sched_ctrl->harq_processes[harq_idx].round == max_harq_rounds) {
sched_ctrl->harq_processes[harq_idx].ndi ^= 1; sched_ctrl->harq_processes[harq_idx].ndi ^= 1;
...@@ -503,11 +510,12 @@ void nr_simple_dlsch_preprocessor(module_id_t module_id, ...@@ -503,11 +510,12 @@ void nr_simple_dlsch_preprocessor(module_id_t module_id,
&& !sched_ctrl->ta_apply) /* If TA should be applied, give at least one RB */ && !sched_ctrl->ta_apply) /* If TA should be applied, give at least one RB */
return; return;
LOG_D(MAC, LOG_D(MAC,
"%d.%d, DTCH%d->DLSCH, RLC status %d bytes\n", "%d.%d, DTCH%d->DLSCH, RLC status %d bytes TA %d\n",
frame, frame,
slot, slot,
lcid, lcid,
sched_ctrl->rlc_status[lcid].bytes_in_buffer); sched_ctrl->rlc_status[lcid].bytes_in_buffer,
sched_ctrl->ta_apply);
/* Find a free CCE */ /* Find a free CCE */
const int target_ss = NR_SearchSpace__searchSpaceType_PR_ue_Specific; const int target_ss = NR_SearchSpace__searchSpaceType_PR_ue_Specific;
...@@ -598,6 +606,8 @@ void nr_simple_dlsch_preprocessor(module_id_t module_id, ...@@ -598,6 +606,8 @@ void nr_simple_dlsch_preprocessor(module_id_t module_id,
sched_ctrl->time_domain_allocation); sched_ctrl->time_domain_allocation);
int rbSize = 0; int rbSize = 0;
const int oh = 2 + (sched_ctrl->num_total_bytes >= 256)
+ 2 * (frame == (sched_ctrl->ta_frame + 10) % 1024);
uint32_t TBS = 0; uint32_t TBS = 0;
do { do {
rbSize++; rbSize++;
...@@ -611,7 +621,7 @@ void nr_simple_dlsch_preprocessor(module_id_t module_id, ...@@ -611,7 +621,7 @@ void nr_simple_dlsch_preprocessor(module_id_t module_id,
0 /* tb_scaling */, 0 /* tb_scaling */,
1 /* nrOfLayers */) 1 /* nrOfLayers */)
>> 3; >> 3;
} while (rbStart + rbSize < bwpSize && !vrb_map[rbStart + rbSize] && TBS < sched_ctrl->num_total_bytes); } while (rbStart + rbSize < bwpSize && !vrb_map[rbStart + rbSize] && TBS < sched_ctrl->num_total_bytes + oh);
sched_ctrl->rbSize = rbSize; sched_ctrl->rbSize = rbSize;
sched_ctrl->rbStart = rbStart; sched_ctrl->rbStart = rbStart;
} }
...@@ -642,7 +652,7 @@ void nr_schedule_ue_spec(module_id_t module_id, ...@@ -642,7 +652,7 @@ void nr_schedule_ue_spec(module_id_t module_id,
* If such UE is not scheduled now, it will be by the preprocessor later. * If such UE is not scheduled now, it will be by the preprocessor later.
* If we add the CE, ta_apply will be reset */ * If we add the CE, ta_apply will be reset */
if (frame == (sched_ctrl->ta_frame + 10) % 1024) if (frame == (sched_ctrl->ta_frame + 10) % 1024)
sched_ctrl->ta_apply = false; /* the timer is reset once TA CE is scheduled */ sched_ctrl->ta_apply = true; /* the timer is reset once TA CE is scheduled */
if (sched_ctrl->rbSize <= 0) if (sched_ctrl->rbSize <= 0)
continue; continue;
...@@ -683,6 +693,10 @@ void nr_schedule_ue_spec(module_id_t module_id, ...@@ -683,6 +693,10 @@ void nr_schedule_ue_spec(module_id_t module_id,
harq->is_waiting = 1; harq->is_waiting = 1;
UE_info->mac_stats[UE_id].dlsch_rounds[harq->round]++; UE_info->mac_stats[UE_id].dlsch_rounds[harq->round]++;
LOG_D(MAC, "%4d.%2d RNTI %04x start %d RBS %d MCS %d TBS %d HARQ PID %d round %d NDI %d\n",
frame, slot, rnti, sched_ctrl->rbStart, sched_ctrl->rbSize, sched_ctrl->mcs,
TBS, current_harq_pid, harq->round, harq->ndi);
nfapi_nr_dl_tti_request_body_t *dl_req = &gNB_mac->DL_req[CC_id].dl_tti_request_body; nfapi_nr_dl_tti_request_body_t *dl_req = &gNB_mac->DL_req[CC_id].dl_tti_request_body;
nr_fill_nfapi_dl_pdu(module_id, nr_fill_nfapi_dl_pdu(module_id,
dl_req, dl_req,
...@@ -742,12 +756,17 @@ void nr_schedule_ue_spec(module_id_t module_id, ...@@ -742,12 +756,17 @@ void nr_schedule_ue_spec(module_id_t module_id,
unsigned char sdu_lcids[NB_RB_MAX] = {0}; unsigned char sdu_lcids[NB_RB_MAX] = {0};
const int lcid = DL_SCH_LCID_DTCH; const int lcid = DL_SCH_LCID_DTCH;
if (sched_ctrl->num_total_bytes > 0) { 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 = sched_ctrl->rlc_status[lcid].bytes_in_buffer;
/* this is the maximum data we can transport based on TBS minus headers */
const int mindata = min(ndata, TBS - ta_len - header_length_total - sdu_length_total - 2 - (ndata >= 256));
LOG_D(MAC, LOG_D(MAC,
"[gNB %d][USER-PLANE DEFAULT DRB] Frame %d : DTCH->DLSCH, Requesting " "[gNB %d][USER-PLANE DEFAULT DRB] Frame %d : DTCH->DLSCH, Requesting "
"%d bytes from RLC (lcid %d total hdr len %d), TBS: %d \n \n", "%d bytes from RLC (lcid %d total hdr len %d), TBS: %d \n \n",
module_id, module_id,
frame, frame,
TBS - ta_len - header_length_total - sdu_length_total - 3, mindata,
lcid, lcid,
header_length_total, header_length_total,
TBS); TBS);
...@@ -759,7 +778,7 @@ void nr_schedule_ue_spec(module_id_t module_id, ...@@ -759,7 +778,7 @@ void nr_schedule_ue_spec(module_id_t module_id,
ENB_FLAG_YES, ENB_FLAG_YES,
MBMS_FLAG_NO, MBMS_FLAG_NO,
lcid, lcid,
TBS - ta_len - header_length_total - sdu_length_total - 3, mindata,
(char *)&mac_sdus[sdu_length_total], (char *)&mac_sdus[sdu_length_total],
0, 0,
0); 0);
...@@ -783,7 +802,7 @@ void nr_schedule_ue_spec(module_id_t module_id, ...@@ -783,7 +802,7 @@ void nr_schedule_ue_spec(module_id_t module_id,
mac_sdus[i] = (unsigned char) (lrand48()&0xff); mac_sdus[i] = (unsigned char) (lrand48()&0xff);
sdu_lcids[0] = 0x3f; // DRB sdu_lcids[0] = 0x3f; // DRB
sdu_lengths[0] = TBS - ta_len - 3; sdu_lengths[0] = TBS - ta_len - 3;
header_length_total += 2 + (sdu_lengths[0] >= 128); header_length_total += 2 + (sdu_lengths[0] >= 256);
sdu_length_total += sdu_lengths[0]; sdu_length_total += sdu_lengths[0];
num_sdus +=1; num_sdus +=1;
} }
...@@ -791,7 +810,7 @@ void nr_schedule_ue_spec(module_id_t module_id, ...@@ -791,7 +810,7 @@ void nr_schedule_ue_spec(module_id_t module_id,
UE_info->mac_stats[UE_id].dlsch_total_bytes += TBS; UE_info->mac_stats[UE_id].dlsch_total_bytes += TBS;
UE_info->mac_stats[UE_id].lc_bytes_tx[lcid] += sdu_length_total; UE_info->mac_stats[UE_id].lc_bytes_tx[lcid] += sdu_length_total;
const int post_padding = TBS >= 2 + header_length_total + sdu_length_total + ta_len; const int post_padding = TBS > header_length_total + sdu_length_total + ta_len;
const int ntx_req = gNB_mac->TX_req[CC_id].Number_of_PDUs; const int ntx_req = gNB_mac->TX_req[CC_id].Number_of_PDUs;
nfapi_nr_pdu_t *tx_req = &gNB_mac->TX_req[CC_id].pdu_list[ntx_req]; nfapi_nr_pdu_t *tx_req = &gNB_mac->TX_req[CC_id].pdu_list[ntx_req];
......
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