Commit df9cd171 authored by Laurent THOMAS's avatar Laurent THOMAS

remove a useless copy and specific buffer for all UE UL payload

parent 74977924
...@@ -534,8 +534,7 @@ void free_nr_ue_ul_harq(NR_UL_UE_HARQ_t harq_list[NR_MAX_ULSCH_HARQ_PROCESSES], ...@@ -534,8 +534,7 @@ void free_nr_ue_ul_harq(NR_UL_UE_HARQ_t harq_list[NR_MAX_ULSCH_HARQ_PROCESSES],
} }
for (int i = 0; i < number_of_processes; i++) { for (int i = 0; i < number_of_processes; i++) {
free_and_zero(harq_list[i].a); free_and_zero(harq_list[i].payload_AB);
free_and_zero(harq_list[i].b);
for (int r = 0; r < a_segments; r++) { for (int r = 0; r < a_segments; r++) {
free_and_zero(harq_list[i].c[r]); free_and_zero(harq_list[i].c[r]);
free_and_zero(harq_list[i].d[r]); free_and_zero(harq_list[i].d[r]);
...@@ -598,13 +597,9 @@ void nr_init_ul_harq_processes(NR_UL_UE_HARQ_t harq_list[NR_MAX_ULSCH_HARQ_PROCE ...@@ -598,13 +597,9 @@ void nr_init_ul_harq_processes(NR_UL_UE_HARQ_t harq_list[NR_MAX_ULSCH_HARQ_PROCE
memset(harq_list + i, 0, sizeof(NR_UL_UE_HARQ_t)); memset(harq_list + i, 0, sizeof(NR_UL_UE_HARQ_t));
harq_list[i].a = malloc16(ulsch_bytes); harq_list[i].payload_AB = malloc16(ulsch_bytes);
DevAssert(harq_list[i].a); DevAssert(harq_list[i].payload_AB);
bzero(harq_list[i].a, ulsch_bytes); bzero(harq_list[i].payload_AB, ulsch_bytes);
harq_list[i].b = malloc16(ulsch_bytes);
DevAssert(harq_list[i].b);
bzero(harq_list[i].b, ulsch_bytes);
harq_list[i].c = malloc16(a_segments*sizeof(uint8_t *)); harq_list[i].c = malloc16(a_segments*sizeof(uint8_t *));
harq_list[i].d = malloc16(a_segments*sizeof(uint16_t *)); harq_list[i].d = malloc16(a_segments*sizeof(uint16_t *));
......
...@@ -55,9 +55,7 @@ typedef struct { ...@@ -55,9 +55,7 @@ typedef struct {
/// Index of current HARQ round for this ULSCH /// Index of current HARQ round for this ULSCH
uint8_t round; uint8_t round;
/// pointer to pdu from MAC interface (TS 36.212 V15.4.0, Sec 5.1 p. 8) /// pointer to pdu from MAC interface (TS 36.212 V15.4.0, Sec 5.1 p. 8)
unsigned char *a; unsigned char *payload_AB;
/// Pointer to the payload + CRC
uint8_t *b;
/// Pointers to transport block segments /// Pointers to transport block segments
uint8_t **c; uint8_t **c;
/// LDPC-code outputs /// LDPC-code outputs
......
...@@ -87,21 +87,19 @@ int nr_ulsch_encoding(PHY_VARS_NR_UE *ue, ...@@ -87,21 +87,19 @@ int nr_ulsch_encoding(PHY_VARS_NR_UE *ue,
int B; int B;
if (A > NR_MAX_PDSCH_TBS) { if (A > NR_MAX_PDSCH_TBS) {
// Add 24-bit crc (polynomial A) to payload // Add 24-bit crc (polynomial A) to payload
crc = crc24a(harq_process->a,A)>>8; crc = crc24a(harq_process->payload_AB, A) >> 8;
harq_process->a[A>>3] = ((uint8_t*)&crc)[2]; harq_process->payload_AB[A >> 3] = ((uint8_t *)&crc)[2];
harq_process->a[1+(A>>3)] = ((uint8_t*)&crc)[1]; harq_process->payload_AB[1 + (A >> 3)] = ((uint8_t *)&crc)[1];
harq_process->a[2 + (A >> 3)] = ((uint8_t *)&crc)[0]; harq_process->payload_AB[2 + (A >> 3)] = ((uint8_t *)&crc)[0];
B = A + 24; B = A + 24;
AssertFatal((A / 8) + 4 <= max_payload_bytes, "A %d is too big (A/8+4 = %d > %d)\n", A, (A / 8) + 4, max_payload_bytes); AssertFatal((A / 8) + 4 <= max_payload_bytes, "A %d is too big (A/8+4 = %d > %d)\n", A, (A / 8) + 4, max_payload_bytes);
memcpy(harq_process->b,harq_process->a,(A/8)+4);
} else { } else {
// Add 16-bit crc (polynomial A) to payload // Add 16-bit crc (polynomial A) to payload
crc = crc16(harq_process->a,A)>>16; crc = crc16(harq_process->payload_AB, A) >> 16;
harq_process->a[A>>3] = ((uint8_t*)&crc)[1]; harq_process->payload_AB[A >> 3] = ((uint8_t *)&crc)[1];
harq_process->a[1 + (A >> 3)] = ((uint8_t *)&crc)[0]; harq_process->payload_AB[1 + (A >> 3)] = ((uint8_t *)&crc)[0];
B = A + 16; B = A + 16;
AssertFatal((A / 8) + 3 <= max_payload_bytes, "A %d is too big (A/8+3 = %d > %d)\n", A, (A / 8) + 3, max_payload_bytes); AssertFatal((A / 8) + 3 <= max_payload_bytes, "A %d is too big (A/8+3 = %d > %d)\n", A, (A / 8) + 3, max_payload_bytes);
memcpy(harq_process->b,harq_process->a,(A/8)+3); // using 3 bytes to mimic the case of 24 bit crc
} }
///////////////////////// b---->| block segmentation |---->c ///////////////////////// ///////////////////////// b---->| block segmentation |---->c /////////////////////////
...@@ -110,7 +108,7 @@ int nr_ulsch_encoding(PHY_VARS_NR_UE *ue, ...@@ -110,7 +108,7 @@ int nr_ulsch_encoding(PHY_VARS_NR_UE *ue,
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_NR_SEGMENTATION, VCD_FUNCTION_IN); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_NR_SEGMENTATION, VCD_FUNCTION_IN);
start_meas(&ue->ulsch_segmentation_stats); start_meas(&ue->ulsch_segmentation_stats);
impp.Kb = nr_segmentation(harq_process->b, impp.Kb = nr_segmentation(harq_process->payload_AB,
harq_process->c, harq_process->c,
B, B,
&harq_process->C, &harq_process->C,
......
...@@ -191,10 +191,7 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE, ...@@ -191,10 +191,7 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
mod_order, mod_order,
Nl); Nl);
trace_NRpdu(DIRECTION_UPLINK, trace_NRpdu(DIRECTION_UPLINK, harq_process_ul_ue->payload_AB, tb_size, WS_C_RNTI, rnti, frame, slot, 0, 0);
harq_process_ul_ue->a,
tb_size,
WS_C_RNTI, rnti, frame, slot, 0, 0);
if (nr_ulsch_encoding(UE, ulsch_ue, frame_parms, harq_pid, tb_size, G) == -1) if (nr_ulsch_encoding(UE, ulsch_ue, frame_parms, harq_pid, tb_size, G) == -1)
return; return;
......
...@@ -468,7 +468,7 @@ static void nr_ue_scheduled_response_ul(PHY_VARS_NR_UE *phy, fapi_nr_ul_config_r ...@@ -468,7 +468,7 @@ static void nr_ue_scheduled_response_ul(PHY_VARS_NR_UE *phy, fapi_nr_ul_config_r
ul_config->slot, ul_config->slot,
pdu->pusch_config_pdu.tx_request_body.pdu_length, pdu->pusch_config_pdu.tx_request_body.pdu_length,
current_harq_pid); current_harq_pid);
memcpy(harq_process_ul_ue->a, memcpy(harq_process_ul_ue->payload_AB,
pdu->pusch_config_pdu.tx_request_body.pdu, pdu->pusch_config_pdu.tx_request_body.pdu,
pdu->pusch_config_pdu.tx_request_body.pdu_length); pdu->pusch_config_pdu.tx_request_body.pdu_length);
} }
......
...@@ -507,7 +507,7 @@ int main(int argc, char **argv) ...@@ -507,7 +507,7 @@ int main(int argc, char **argv)
ulsch_ue->pusch_pdu.target_code_rate = code_rate; ulsch_ue->pusch_pdu.target_code_rate = code_rate;
ulsch_ue->pusch_pdu.qam_mod_order = mod_order; ulsch_ue->pusch_pdu.qam_mod_order = mod_order;
ulsch_ue->pusch_pdu.ldpcBaseGraph = get_BG(TBS, code_rate); ulsch_ue->pusch_pdu.ldpcBaseGraph = get_BG(TBS, code_rate);
unsigned char *test_input = harq_process_ul_ue->a; unsigned char *test_input = harq_process_ul_ue->payload_AB;
/////////// ///////////
//////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////
......
...@@ -1141,7 +1141,7 @@ int main(int argc, char *argv[]) ...@@ -1141,7 +1141,7 @@ int main(int argc, char *argv[])
} }
for (int i = 0; i < (TBS / 8); i++) for (int i = 0; i < (TBS / 8); i++)
UE->ul_harq_processes[harq_pid].a[i] = i & 0xff; UE->ul_harq_processes[harq_pid].payload_AB[i] = i & 0xff;
if (input_fd == NULL) { if (input_fd == NULL) {
// set FAPI parameters for UE, put them in the scheduled response and call // set FAPI parameters for UE, put them in the scheduled response and call
...@@ -1457,7 +1457,7 @@ int main(int argc, char *argv[]) ...@@ -1457,7 +1457,7 @@ int main(int argc, char *argv[])
for (i = 0; i < TBS; i++) { for (i = 0; i < TBS; i++) {
uint8_t estimated_output_bit = (ulsch_gNB->harq_process->b[i / 8] & (1 << (i & 7))) >> (i & 7); uint8_t estimated_output_bit = (ulsch_gNB->harq_process->b[i / 8] & (1 << (i & 7))) >> (i & 7);
uint8_t test_input_bit = (UE->ul_harq_processes[harq_pid].b[i / 8] & (1 << (i & 7))) >> (i & 7); uint8_t test_input_bit = (UE->ul_harq_processes[harq_pid].payload_AB[i / 8] & (1 << (i & 7))) >> (i & 7);
if (estimated_output_bit != test_input_bit) { if (estimated_output_bit != test_input_bit) {
/*if(errors_decoding == 0) /*if(errors_decoding == 0)
......
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