From 1dd8c67fc2c1cae82b2829138efe0e366eeecdb7 Mon Sep 17 00:00:00 2001 From: francescomani Date: Tue, 7 Dec 2021 14:35:42 +0100 Subject: [PATCH 01/96] block ul prbs in map with prbbl --- openair2/GNB_APP/gnb_config.c | 6 +++--- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c | 2 +- openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/openair2/GNB_APP/gnb_config.c b/openair2/GNB_APP/gnb_config.c index 9851d14b91..4a13aec400 100644 --- a/openair2/GNB_APP/gnb_config.c +++ b/openair2/GNB_APP/gnb_config.c @@ -675,13 +675,13 @@ void RCconfig_nr_macrlc() { config_getlist( &GNBParamList,GNBParams,sizeof(GNBParams)/sizeof(paramdef_t),NULL); char *ulprbbl = *GNBParamList.paramarray[0][GNB_ULPRBBLACKLIST_IDX].strptr; char *pt = strtok(ulprbbl,","); - int prbbl[275]; + uint16_t prbbl[275]; int num_prbbl=0; int prb; - memset(prbbl,0,275*sizeof(int)); + memset(prbbl,0,275*sizeof(uint16_t)); while (pt) { prb=atoi(pt); - prbbl[prb] = 1; + prbbl[prb] = 0x3FFF; // all symbols taken pt = strtok(NULL,","); num_prbbl++; } diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c index ae52f8cc60..9516c9a347 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c @@ -323,7 +323,7 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP, const int num_slots = nr_slots_per_frame[*scc->ssbSubcarrierSpacing]; const int last_slot = (slot + num_slots - 1) % num_slots; uint16_t *vrb_map_UL = cc[CC_id].vrb_map_UL; - memset(&vrb_map_UL[last_slot * MAX_BWP_SIZE], 0, sizeof(uint16_t) * MAX_BWP_SIZE); + memcpy(&vrb_map_UL[last_slot * MAX_BWP_SIZE], &RC.nrmac[module_idP]->ulprbbl, MAX_BWP_SIZE); clear_nr_nfapi_information(RC.nrmac[module_idP], CC_id, frame, slot); diff --git a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h index 45e0a5b52b..32fdce60d3 100644 --- a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h +++ b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h @@ -697,7 +697,7 @@ typedef struct gNB_MAC_INST_s { /// current PDU index (BCH,DLSCH) uint16_t pdu_index[NFAPI_CC_MAX]; int num_ulprbbl; - int ulprbbl[275]; + uint16_t ulprbbl[275]; /// NFAPI Config Request Structure nfapi_nr_config_request_scf_t config[NFAPI_CC_MAX]; /// NFAPI DL Config Request Structure From 7cb3739cf6918029414f43b095db14e842b143fc Mon Sep 17 00:00:00 2001 From: francescomani Date: Tue, 7 Dec 2021 14:54:48 +0100 Subject: [PATCH 02/96] bitmap occupation function --- common/utils/nr/nr_common.c | 5 +++++ common/utils/nr/nr_common.h | 1 + 2 files changed, 6 insertions(+) diff --git a/common/utils/nr/nr_common.c b/common/utils/nr/nr_common.c index a704a66c76..42c7ef9c7e 100644 --- a/common/utils/nr/nr_common.c +++ b/common/utils/nr/nr_common.c @@ -472,6 +472,11 @@ int get_subband_size(int NPRB,int size) { } +// from start symbol index and nb or symbols to symbol occupation bitmap in a slot +uint16_t startandlength_to_bitmat(int startSymbolIndex, int nrOfSymbols) { + return (((1< Date: Wed, 8 Dec 2021 09:27:33 +0100 Subject: [PATCH 03/96] symbol level occupation for ULSCH and msg3 --- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c | 15 ++- .../LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c | 5 +- .../LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c | 94 ++++++++++--------- openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h | 2 + 4 files changed, 66 insertions(+), 50 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c index 25aeea70a6..0d0c8980ce 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c @@ -729,6 +729,8 @@ void nr_generate_Msg3_retransmission(module_id_t module_idP, int CC_id, frame_t int scs = scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.subcarrierSpacing; int fh = 0; int startSymbolAndLength = scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list.array[ra->Msg3_tda_id]->startSymbolAndLength; + int StartSymbolIndex, NrOfSymbols; + SLIV2SL(startSymbolAndLength, &StartSymbolIndex, &NrOfSymbols); int mappingtype = scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list.array[ra->Msg3_tda_id]->mappingType; uint16_t *vrb_map_UL = &RC.nrmac[module_idP]->common_channels[CC_id].vrb_map_UL[sched_slot * MAX_BWP_SIZE]; @@ -737,7 +739,7 @@ void nr_generate_Msg3_retransmission(module_id_t module_idP, int CC_id, frame_t int BWPSize = nr_mac->type0_PDCCH_CSS_config[ra->beam_id].num_rbs; int rbStart = 0; for (int i = 0; (i < ra->msg3_nb_rb) && (rbStart <= (BWPSize - ra->msg3_nb_rb)); i++) { - if (vrb_map_UL[rbStart + BWPStart + i]) { + if (vrb_map_UL[rbStart + BWPStart + i]&startandlength_to_bitmat(StartSymbolIndex, NrOfSymbols)) { rbStart += i; i = 0; } @@ -842,7 +844,7 @@ void nr_generate_Msg3_retransmission(module_id_t module_idP, int CC_id, frame_t // Mark the corresponding RBs as used for (int rb = 0; rb < ra->msg3_nb_rb; rb++) { - vrb_map_UL[rbStart + BWPStart + rb] = 1; + vrb_map_UL[rbStart + BWPStart + rb] |= startandlength_to_bitmat(StartSymbolIndex, NrOfSymbols); } // reset state to wait msg3 @@ -891,6 +893,8 @@ void nr_get_Msg3alloc(module_id_t module_id, ra->Msg3_slot = temp_slot%nr_slots_per_frame[mu]; if (is_xlsch_in_slot(RC.nrmac[module_id]->ulsch_slot_bitmap[ra->Msg3_slot / 64], ra->Msg3_slot)) { ra->Msg3_tda_id = i; + ra->msg3_startsymb = StartSymbolIndex; + ra->msg3_nrsymb = NrOfSymbols; break; } } @@ -938,11 +942,12 @@ void nr_get_Msg3alloc(module_id_t module_id, while (rbSize < msg3_nb_rb) { rbStart += rbSize; /* last iteration rbSize was not enough, skip it */ rbSize = 0; - while (rbStart < bwpSize && vrb_map_UL[rbStart + bwpStart]) + while (rbStart < bwpSize && + (vrb_map_UL[rbStart + bwpStart]&startandlength_to_bitmat(StartSymbolIndex, NrOfSymbols))) rbStart++; AssertFatal(rbStart < bwpSize - msg3_nb_rb, "no space to allocate Msg 3 for RA!\n"); while (rbStart + rbSize < bwpSize - && !vrb_map_UL[rbStart + bwpStart + rbSize] + && !(vrb_map_UL[rbStart + bwpStart + rbSize]&startandlength_to_bitmat(StartSymbolIndex, NrOfSymbols)) && rbSize < msg3_nb_rb) rbSize++; } @@ -1039,7 +1044,7 @@ void nr_add_msg3(module_id_t module_idP, int CC_id, frame_t frameP, sub_frame_t i + ra->msg3_first_rb, ra->Msg3_frame, ra->Msg3_slot); - vrb_map_UL[i + ra->msg3_first_rb + ra->msg3_bwp_start] = 1; + vrb_map_UL[i + ra->msg3_first_rb + ra->msg3_bwp_start] |= startandlength_to_bitmat(ra->msg3_startsymb, ra->msg3_nrsymb); } LOG_D(NR_MAC, "[gNB %d][RAPROC] Frame %d, Slot %d : CC_id %d RA is active, Msg3 in (%d,%d)\n", module_idP, frameP, slotP, CC_id, ra->Msg3_frame, ra->Msg3_slot); diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c index c0107c5fc6..d939ed8139 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c @@ -473,9 +473,8 @@ bool nr_ul_preprocessor_phytest(module_id_t module_id, frame_t frame, sub_frame_ uint16_t *vrb_map_UL = &RC.nrmac[module_id]->common_channels[CC_id].vrb_map_UL[sched_slot * MAX_BWP_SIZE]; - const uint16_t symb = ((1 << ps->nrOfSymbols) - 1) << ps->startSymbolIndex; for (int i = rbStart; i < rbStart + rbSize; ++i) { - if ((vrb_map_UL[i+BWPStart] & symb) != 0) { + if ((vrb_map_UL[i+BWPStart] & startandlength_to_bitmat(ps->startSymbolIndex, ps->nrOfSymbols)) != 0) { LOG_E(MAC, "%s(): %4d.%2d RB %d is already reserved, cannot schedule UE\n", __func__, @@ -544,6 +543,6 @@ bool nr_ul_preprocessor_phytest(module_id_t module_id, frame_t frame, sub_frame_ /* mark the corresponding RBs as used */ for (int rb = rbStart; rb < rbStart + rbSize; rb++) - vrb_map_UL[rb+BWPStart] = 1; + vrb_map_UL[rb+BWPStart] |= startandlength_to_bitmat(ps->startSymbolIndex, ps->nrOfSymbols); return true; } diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c index d14cf09f99..949f148121 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c @@ -938,13 +938,6 @@ bool allocate_ul_retransmission(module_id_t module_id, LOG_D(NR_MAC,"retInfo->time_domain_allocation = %d, tda = %d\n", retInfo->time_domain_allocation, tda); LOG_D(NR_MAC,"num_dmrs_cdm_grps_no_data %d, tbs %d\n",num_dmrs_cdm_grps_no_data, retInfo->tb_size); if (tda == retInfo->time_domain_allocation) { - /* Check the resource is enough for retransmission */ - while (rbStart < bwpSize && !rballoc_mask[rbStart]) - rbStart++; - if (rbStart + retInfo->rbSize > bwpSize) { - LOG_W(NR_MAC, "cannot allocate retransmission of UE %d/RNTI %04x: no resources (rbStart %d, retInfo->rbSize %d, bwpSize %d\n", UE_id, UE_info->rnti[UE_id], rbStart, retInfo->rbSize, bwpSize); - return false; - } /* check whether we need to switch the TDA allocation since tha last * (re-)transmission */ NR_pusch_semi_static_t *ps = &sched_ctrl->pusch_semi_static; @@ -955,18 +948,30 @@ bool allocate_ul_retransmission(module_id_t module_id, || ps->dci_format != dci_format || ps->num_dmrs_cdm_grps_no_data != num_dmrs_cdm_grps_no_data) nr_set_pusch_semi_static(scc, sched_ctrl->active_ubwp, ubwpd, dci_format, tda, num_dmrs_cdm_grps_no_data, ps); + + /* Check the resource is enough for retransmission */ + while (rbStart < bwpSize && + !(rballoc_mask[rbStart]&startandlength_to_bitmat(ps->startSymbolIndex, ps->nrOfSymbols))) + rbStart++; + if (rbStart + retInfo->rbSize > bwpSize) { + LOG_W(NR_MAC, "cannot allocate retransmission of UE %d/RNTI %04x: no resources (rbStart %d, retInfo->rbSize %d, bwpSize %d\n", UE_id, UE_info->rnti[UE_id], rbStart, retInfo->rbSize, bwpSize); + return false; + } + LOG_D(NR_MAC, "%s(): retransmission keeping TDA %d and TBS %d\n", __func__, tda, retInfo->tb_size); } else { - /* the retransmission will use a different time domain allocation, check - * that we have enough resources */ - while (rbStart < bwpSize && !rballoc_mask[rbStart]) - rbStart++; - int rbSize = 0; - while (rbStart + rbSize < bwpSize && rballoc_mask[rbStart + rbSize]) - rbSize++; NR_pusch_semi_static_t temp_ps; int dci_format = get_dci_format(sched_ctrl); nr_set_pusch_semi_static(scc, sched_ctrl->active_ubwp,ubwpd, dci_format, tda, num_dmrs_cdm_grps_no_data, &temp_ps); + /* the retransmission will use a different time domain allocation, check + * that we have enough resources */ + while (rbStart < bwpSize && + !(rballoc_mask[rbStart]&startandlength_to_bitmat(temp_ps.startSymbolIndex, temp_ps.nrOfSymbols))) + rbStart++; + int rbSize = 0; + while (rbStart + rbSize < bwpSize && + (rballoc_mask[rbStart + rbSize]&startandlength_to_bitmat(temp_ps.startSymbolIndex, temp_ps.nrOfSymbols))) + rbSize++; uint32_t new_tbs; uint16_t new_rbSize; bool success = nr_find_nb_rb(retInfo->Qm, @@ -1022,7 +1027,7 @@ bool allocate_ul_retransmission(module_id_t module_id, /* Mark the corresponding RBs as used */ n_rb_sched -= sched_pusch->rbSize; for (int rb = 0; rb < sched_ctrl->sched_pusch.rbSize; rb++) - rballoc_mask[rb + sched_ctrl->sched_pusch.rbStart] = 0; + rballoc_mask[rb + sched_ctrl->sched_pusch.rbStart] -= startandlength_to_bitmat(sched_ctrl->pusch_semi_static.startSymbolIndex, sched_ctrl->pusch_semi_static.nrOfSymbols); return true; } @@ -1121,14 +1126,6 @@ void pf_ul(module_id_t module_id, if (max_num_ue < 0) return; - LOG_D(NR_MAC,"Looking for min_rb %d RBs, starting at %d\n", min_rb, rbStart); - while (rbStart < bwpSize && !rballoc_mask[rbStart]) rbStart++; - if (rbStart + min_rb >= bwpSize) { - LOG_W(NR_MAC, "cannot allocate continuous UL data for UE %d/RNTI %04x: no resources (rbStart %d, min_rb %d, bwpSize %d\n", - UE_id, UE_info->rnti[UE_id],rbStart,min_rb,bwpSize); - return; - } - /* Save PUSCH field */ /* we want to avoid a lengthy deduction of DMRS and other parameters in * every TTI if we can save it, so check whether dci_format, TDA, or @@ -1140,6 +1137,17 @@ void pf_ul(module_id_t module_id, || ps->dci_format != dci_format || ps->num_dmrs_cdm_grps_no_data != num_dmrs_cdm_grps_no_data) nr_set_pusch_semi_static(scc, sched_ctrl->active_ubwp, ubwpd, dci_format, tda, num_dmrs_cdm_grps_no_data, ps); + + LOG_D(NR_MAC,"Looking for min_rb %d RBs, starting at %d\n", min_rb, rbStart); + while (rbStart < bwpSize && + !(rballoc_mask[rbStart]&startandlength_to_bitmat(ps->startSymbolIndex, ps->nrOfSymbols))) + rbStart++; + if (rbStart + min_rb >= bwpSize) { + LOG_W(NR_MAC, "cannot allocate continuous UL data for UE %d/RNTI %04x: no resources (rbStart %d, min_rb %d, bwpSize %d\n", + UE_id, UE_info->rnti[UE_id],rbStart,min_rb,bwpSize); + return; + } + NR_sched_pusch_t *sched_pusch = &sched_ctrl->sched_pusch; sched_pusch->mcs = 9; update_ul_ue_R_Qm(sched_pusch, ps); @@ -1158,7 +1166,7 @@ void pf_ul(module_id_t module_id, /* Mark the corresponding RBs as used */ n_rb_sched -= sched_pusch->rbSize; for (int rb = 0; rb < sched_ctrl->sched_pusch.rbSize; rb++) - rballoc_mask[rb + sched_ctrl->sched_pusch.rbStart] = 0; + rballoc_mask[rb + sched_ctrl->sched_pusch.rbStart] -= startandlength_to_bitmat(ps->startSymbolIndex, ps->nrOfSymbols); continue; } @@ -1215,19 +1223,6 @@ void pf_ul(module_id_t module_id, NR_sched_pusch_t *sched_pusch = &sched_ctrl->sched_pusch; NR_pusch_semi_static_t *ps = &sched_ctrl->pusch_semi_static; - while (rbStart < bwpSize && !rballoc_mask[rbStart]) rbStart++; - sched_pusch->rbStart = rbStart; - uint16_t max_rbSize = 1; - while (rbStart + max_rbSize < bwpSize && rballoc_mask[rbStart + max_rbSize]) - max_rbSize++; - - if (rbStart + min_rb >= bwpSize) { - LOG_W(NR_MAC, "cannot allocate UL data for UE %d/RNTI %04x: no resources (rbStart %d, min_rb %d, bwpSize %d\n", - UE_id, UE_info->rnti[UE_id],rbStart,min_rb,bwpSize); - return; - } - else LOG_D(NR_MAC,"allocating UL data for UE %d/RNTI %04x (rbStsart %d, min_rb %d, bwpSize %d\n",UE_id, UE_info->rnti[UE_id],rbStart,min_rb,bwpSize); - /* Save PUSCH field */ /* we want to avoid a lengthy deduction of DMRS and other parameters in * every TTI if we can save it, so check whether dci_format, TDA, or @@ -1241,6 +1236,23 @@ void pf_ul(module_id_t module_id, nr_set_pusch_semi_static(scc, sched_ctrl->active_ubwp, ubwpd, dci_format, tda, num_dmrs_cdm_grps_no_data, ps); update_ul_ue_R_Qm(sched_pusch, ps); + while (rbStart < bwpSize && + !(rballoc_mask[rbStart]&startandlength_to_bitmat(ps->startSymbolIndex, ps->nrOfSymbols))) + rbStart++; + sched_pusch->rbStart = rbStart; + uint16_t max_rbSize = 1; + while (rbStart + max_rbSize < bwpSize && + (rballoc_mask[rbStart + max_rbSize]&&startandlength_to_bitmat(ps->startSymbolIndex, ps->nrOfSymbols))) + max_rbSize++; + + if (rbStart + min_rb >= bwpSize) { + LOG_W(NR_MAC, "cannot allocate UL data for UE %d/RNTI %04x: no resources (rbStart %d, min_rb %d, bwpSize %d\n", + UE_id, UE_info->rnti[UE_id],rbStart,min_rb,bwpSize); + return; + } + else LOG_D(NR_MAC,"allocating UL data for UE %d/RNTI %04x (rbStsart %d, min_rb %d, bwpSize %d\n",UE_id, UE_info->rnti[UE_id],rbStart,min_rb,bwpSize); + + /* Calculate the current scheduling bytes and the necessary RBs */ const int B = cmax(sched_ctrl->estimated_ul_buffer - sched_ctrl->sched_ul_bytes, 0); uint16_t rbSize = 0; @@ -1261,7 +1273,7 @@ void pf_ul(module_id_t module_id, /* Mark the corresponding RBs as used */ n_rb_sched -= sched_pusch->rbSize; for (int rb = 0; rb < sched_ctrl->sched_pusch.rbSize; rb++) - rballoc_mask[rb + sched_ctrl->sched_pusch.rbStart] = 0; + rballoc_mask[rb + sched_ctrl->sched_pusch.rbStart] -= startandlength_to_bitmat(ps->startSymbolIndex, ps->nrOfSymbols); } } @@ -1330,11 +1342,9 @@ bool nr_fr1_ulsch_preprocessor(module_id_t module_id, frame_t frame, sub_frame_t const int startSymbolAndLength = tdaList->list.array[tda]->startSymbolAndLength; int startSymbolIndex, nrOfSymbols; SLIV2SL(startSymbolAndLength, &startSymbolIndex, &nrOfSymbols); - const uint16_t symb = ((1 << nrOfSymbols) - 1) << startSymbolIndex; + const uint16_t symb = startandlength_to_bitmat(startSymbolIndex, nrOfSymbols); int st = 0, e = 0, len = 0; - for (int i = 0; i < bwpSize; i++) - if (RC.nrmac[module_id]->ulprbbl[i] == 1) vrb_map_UL[i]=symb; for (int i = 0; i < bwpSize; i++) { while ((vrb_map_UL[bwpStart + i] & symb) != 0 && i < bwpSize) @@ -1355,7 +1365,7 @@ bool nr_fr1_ulsch_preprocessor(module_id_t module_id, frame_t frame, sub_frame_t /* Calculate mask: if any RB in vrb_map_UL is blocked (1), the current RB will be 0 */ for (int i = 0; i < bwpSize; i++) - rballoc_mask[i] = i >= st && i <= e; + rballoc_mask[i] = (i >= st && i <= e)*startandlength_to_bitmat(startSymbolIndex, nrOfSymbols); /* proportional fair scheduling algorithm */ pf_ul(module_id, diff --git a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h index 32fdce60d3..3944cb34f9 100644 --- a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h +++ b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h @@ -157,6 +157,8 @@ typedef struct { uint8_t msg3_round; /// Flag to indicate if Msg3 carries a DCCH or DTCH message bool msg3_dcch_dtch; + int msg3_startsymb; + int msg3_nrsymb; /// TBS used for Msg4 int msg4_TBsize; /// MCS used for Msg4 From 366c42e6fa030b7f81c8d91509949bbfbe6377f7 Mon Sep 17 00:00:00 2001 From: francescomani Date: Wed, 15 Dec 2021 09:31:30 +0100 Subject: [PATCH 04/96] fix in prach vrb occupation --- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c index 0d0c8980ce..d1fcdc7c05 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c @@ -389,7 +389,7 @@ void schedule_nr_prach(module_id_t module_idP, frame_t frameP, sub_frame_t slotP const int16_t N_RA_RB = get_N_RA_RB(cfg->prach_config.prach_sub_c_spacing.value, mu_pusch); uint16_t *vrb_map_UL = &cc->vrb_map_UL[slotP * MAX_BWP_SIZE]; for (int i = 0; i < N_RA_RB * fdm; ++i) - vrb_map_UL[bwp_start + rach_ConfigGeneric->msg1_FrequencyStart + i] = 0xff; // all symbols + vrb_map_UL[bwp_start + rach_ConfigGeneric->msg1_FrequencyStart + i] = 0x3fff; // all symbols } } } From 909f0ad44f38e4dc90b20185df64a9c5f57f8690 Mon Sep 17 00:00:00 2001 From: francescomani Date: Wed, 15 Dec 2021 09:43:08 +0100 Subject: [PATCH 05/96] changing the name of a function --- common/utils/nr/nr_common.c | 2 +- common/utils/nr/nr_common.h | 2 +- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c | 10 ++++----- .../LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c | 4 ++-- .../LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c | 22 +++++++++---------- 5 files changed, 20 insertions(+), 20 deletions(-) diff --git a/common/utils/nr/nr_common.c b/common/utils/nr/nr_common.c index 42c7ef9c7e..dbe3d218f3 100644 --- a/common/utils/nr/nr_common.c +++ b/common/utils/nr/nr_common.c @@ -473,7 +473,7 @@ int get_subband_size(int NPRB,int size) { } // from start symbol index and nb or symbols to symbol occupation bitmap in a slot -uint16_t startandlength_to_bitmat(int startSymbolIndex, int nrOfSymbols) { +uint16_t SL_to_bitmap(int startSymbolIndex, int nrOfSymbols) { return (((1<type0_PDCCH_CSS_config[ra->beam_id].num_rbs; int rbStart = 0; for (int i = 0; (i < ra->msg3_nb_rb) && (rbStart <= (BWPSize - ra->msg3_nb_rb)); i++) { - if (vrb_map_UL[rbStart + BWPStart + i]&startandlength_to_bitmat(StartSymbolIndex, NrOfSymbols)) { + if (vrb_map_UL[rbStart + BWPStart + i]&SL_to_bitmap(StartSymbolIndex, NrOfSymbols)) { rbStart += i; i = 0; } @@ -844,7 +844,7 @@ void nr_generate_Msg3_retransmission(module_id_t module_idP, int CC_id, frame_t // Mark the corresponding RBs as used for (int rb = 0; rb < ra->msg3_nb_rb; rb++) { - vrb_map_UL[rbStart + BWPStart + rb] |= startandlength_to_bitmat(StartSymbolIndex, NrOfSymbols); + vrb_map_UL[rbStart + BWPStart + rb] |= SL_to_bitmap(StartSymbolIndex, NrOfSymbols); } // reset state to wait msg3 @@ -943,11 +943,11 @@ void nr_get_Msg3alloc(module_id_t module_id, rbStart += rbSize; /* last iteration rbSize was not enough, skip it */ rbSize = 0; while (rbStart < bwpSize && - (vrb_map_UL[rbStart + bwpStart]&startandlength_to_bitmat(StartSymbolIndex, NrOfSymbols))) + (vrb_map_UL[rbStart + bwpStart]&SL_to_bitmap(StartSymbolIndex, NrOfSymbols))) rbStart++; AssertFatal(rbStart < bwpSize - msg3_nb_rb, "no space to allocate Msg 3 for RA!\n"); while (rbStart + rbSize < bwpSize - && !(vrb_map_UL[rbStart + bwpStart + rbSize]&startandlength_to_bitmat(StartSymbolIndex, NrOfSymbols)) + && !(vrb_map_UL[rbStart + bwpStart + rbSize]&SL_to_bitmap(StartSymbolIndex, NrOfSymbols)) && rbSize < msg3_nb_rb) rbSize++; } @@ -1044,7 +1044,7 @@ void nr_add_msg3(module_id_t module_idP, int CC_id, frame_t frameP, sub_frame_t i + ra->msg3_first_rb, ra->Msg3_frame, ra->Msg3_slot); - vrb_map_UL[i + ra->msg3_first_rb + ra->msg3_bwp_start] |= startandlength_to_bitmat(ra->msg3_startsymb, ra->msg3_nrsymb); + vrb_map_UL[i + ra->msg3_first_rb + ra->msg3_bwp_start] |= SL_to_bitmap(ra->msg3_startsymb, ra->msg3_nrsymb); } LOG_D(NR_MAC, "[gNB %d][RAPROC] Frame %d, Slot %d : CC_id %d RA is active, Msg3 in (%d,%d)\n", module_idP, frameP, slotP, CC_id, ra->Msg3_frame, ra->Msg3_slot); diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c index d939ed8139..5afdfcbbf3 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c @@ -474,7 +474,7 @@ bool nr_ul_preprocessor_phytest(module_id_t module_id, frame_t frame, sub_frame_ uint16_t *vrb_map_UL = &RC.nrmac[module_id]->common_channels[CC_id].vrb_map_UL[sched_slot * MAX_BWP_SIZE]; for (int i = rbStart; i < rbStart + rbSize; ++i) { - if ((vrb_map_UL[i+BWPStart] & startandlength_to_bitmat(ps->startSymbolIndex, ps->nrOfSymbols)) != 0) { + if ((vrb_map_UL[i+BWPStart] & SL_to_bitmap(ps->startSymbolIndex, ps->nrOfSymbols)) != 0) { LOG_E(MAC, "%s(): %4d.%2d RB %d is already reserved, cannot schedule UE\n", __func__, @@ -543,6 +543,6 @@ bool nr_ul_preprocessor_phytest(module_id_t module_id, frame_t frame, sub_frame_ /* mark the corresponding RBs as used */ for (int rb = rbStart; rb < rbStart + rbSize; rb++) - vrb_map_UL[rb+BWPStart] |= startandlength_to_bitmat(ps->startSymbolIndex, ps->nrOfSymbols); + vrb_map_UL[rb+BWPStart] |= SL_to_bitmap(ps->startSymbolIndex, ps->nrOfSymbols); return true; } diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c index 949f148121..7892da4128 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c @@ -951,7 +951,7 @@ bool allocate_ul_retransmission(module_id_t module_id, /* Check the resource is enough for retransmission */ while (rbStart < bwpSize && - !(rballoc_mask[rbStart]&startandlength_to_bitmat(ps->startSymbolIndex, ps->nrOfSymbols))) + !(rballoc_mask[rbStart]&SL_to_bitmap(ps->startSymbolIndex, ps->nrOfSymbols))) rbStart++; if (rbStart + retInfo->rbSize > bwpSize) { LOG_W(NR_MAC, "cannot allocate retransmission of UE %d/RNTI %04x: no resources (rbStart %d, retInfo->rbSize %d, bwpSize %d\n", UE_id, UE_info->rnti[UE_id], rbStart, retInfo->rbSize, bwpSize); @@ -966,11 +966,11 @@ bool allocate_ul_retransmission(module_id_t module_id, /* the retransmission will use a different time domain allocation, check * that we have enough resources */ while (rbStart < bwpSize && - !(rballoc_mask[rbStart]&startandlength_to_bitmat(temp_ps.startSymbolIndex, temp_ps.nrOfSymbols))) + !(rballoc_mask[rbStart]&SL_to_bitmap(temp_ps.startSymbolIndex, temp_ps.nrOfSymbols))) rbStart++; int rbSize = 0; while (rbStart + rbSize < bwpSize && - (rballoc_mask[rbStart + rbSize]&startandlength_to_bitmat(temp_ps.startSymbolIndex, temp_ps.nrOfSymbols))) + (rballoc_mask[rbStart + rbSize]&SL_to_bitmap(temp_ps.startSymbolIndex, temp_ps.nrOfSymbols))) rbSize++; uint32_t new_tbs; uint16_t new_rbSize; @@ -1027,7 +1027,7 @@ bool allocate_ul_retransmission(module_id_t module_id, /* Mark the corresponding RBs as used */ n_rb_sched -= sched_pusch->rbSize; for (int rb = 0; rb < sched_ctrl->sched_pusch.rbSize; rb++) - rballoc_mask[rb + sched_ctrl->sched_pusch.rbStart] -= startandlength_to_bitmat(sched_ctrl->pusch_semi_static.startSymbolIndex, sched_ctrl->pusch_semi_static.nrOfSymbols); + rballoc_mask[rb + sched_ctrl->sched_pusch.rbStart] -= SL_to_bitmap(sched_ctrl->pusch_semi_static.startSymbolIndex, sched_ctrl->pusch_semi_static.nrOfSymbols); return true; } @@ -1140,7 +1140,7 @@ void pf_ul(module_id_t module_id, LOG_D(NR_MAC,"Looking for min_rb %d RBs, starting at %d\n", min_rb, rbStart); while (rbStart < bwpSize && - !(rballoc_mask[rbStart]&startandlength_to_bitmat(ps->startSymbolIndex, ps->nrOfSymbols))) + !(rballoc_mask[rbStart]&SL_to_bitmap(ps->startSymbolIndex, ps->nrOfSymbols))) rbStart++; if (rbStart + min_rb >= bwpSize) { LOG_W(NR_MAC, "cannot allocate continuous UL data for UE %d/RNTI %04x: no resources (rbStart %d, min_rb %d, bwpSize %d\n", @@ -1166,7 +1166,7 @@ void pf_ul(module_id_t module_id, /* Mark the corresponding RBs as used */ n_rb_sched -= sched_pusch->rbSize; for (int rb = 0; rb < sched_ctrl->sched_pusch.rbSize; rb++) - rballoc_mask[rb + sched_ctrl->sched_pusch.rbStart] -= startandlength_to_bitmat(ps->startSymbolIndex, ps->nrOfSymbols); + rballoc_mask[rb + sched_ctrl->sched_pusch.rbStart] -= SL_to_bitmap(ps->startSymbolIndex, ps->nrOfSymbols); continue; } @@ -1237,12 +1237,12 @@ void pf_ul(module_id_t module_id, update_ul_ue_R_Qm(sched_pusch, ps); while (rbStart < bwpSize && - !(rballoc_mask[rbStart]&startandlength_to_bitmat(ps->startSymbolIndex, ps->nrOfSymbols))) + !(rballoc_mask[rbStart]&SL_to_bitmap(ps->startSymbolIndex, ps->nrOfSymbols))) rbStart++; sched_pusch->rbStart = rbStart; uint16_t max_rbSize = 1; while (rbStart + max_rbSize < bwpSize && - (rballoc_mask[rbStart + max_rbSize]&&startandlength_to_bitmat(ps->startSymbolIndex, ps->nrOfSymbols))) + (rballoc_mask[rbStart + max_rbSize]&&SL_to_bitmap(ps->startSymbolIndex, ps->nrOfSymbols))) max_rbSize++; if (rbStart + min_rb >= bwpSize) { @@ -1273,7 +1273,7 @@ void pf_ul(module_id_t module_id, /* Mark the corresponding RBs as used */ n_rb_sched -= sched_pusch->rbSize; for (int rb = 0; rb < sched_ctrl->sched_pusch.rbSize; rb++) - rballoc_mask[rb + sched_ctrl->sched_pusch.rbStart] -= startandlength_to_bitmat(ps->startSymbolIndex, ps->nrOfSymbols); + rballoc_mask[rb + sched_ctrl->sched_pusch.rbStart] -= SL_to_bitmap(ps->startSymbolIndex, ps->nrOfSymbols); } } @@ -1342,7 +1342,7 @@ bool nr_fr1_ulsch_preprocessor(module_id_t module_id, frame_t frame, sub_frame_t const int startSymbolAndLength = tdaList->list.array[tda]->startSymbolAndLength; int startSymbolIndex, nrOfSymbols; SLIV2SL(startSymbolAndLength, &startSymbolIndex, &nrOfSymbols); - const uint16_t symb = startandlength_to_bitmat(startSymbolIndex, nrOfSymbols); + const uint16_t symb = SL_to_bitmap(startSymbolIndex, nrOfSymbols); int st = 0, e = 0, len = 0; @@ -1365,7 +1365,7 @@ bool nr_fr1_ulsch_preprocessor(module_id_t module_id, frame_t frame, sub_frame_t /* Calculate mask: if any RB in vrb_map_UL is blocked (1), the current RB will be 0 */ for (int i = 0; i < bwpSize; i++) - rballoc_mask[i] = (i >= st && i <= e)*startandlength_to_bitmat(startSymbolIndex, nrOfSymbols); + rballoc_mask[i] = (i >= st && i <= e)*SL_to_bitmap(startSymbolIndex, nrOfSymbols); /* proportional fair scheduling algorithm */ pf_ul(module_id, From f2f6850b33008686f94c84c29999ad62219242c1 Mon Sep 17 00:00:00 2001 From: francescomani Date: Wed, 15 Dec 2021 18:03:43 +0100 Subject: [PATCH 06/96] first version to check pucch vrb occupation --- .../NR_MAC_gNB/gNB_scheduler_primitives.c | 47 ++++- .../LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c | 189 +++++++++++++----- openair2/LAYER2/NR_MAC_gNB/mac_proto.h | 8 + 3 files changed, 181 insertions(+), 63 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c index 33cb2b1b1d..bda19f252a 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c @@ -1035,23 +1035,26 @@ void nr_configure_pucch(nfapi_nr_pucch_pdu_t* pucch_pdu, else { // this is the default PUCCH configuration, PUCCH format 0 or 1 LOG_D(NR_MAC,"pucch_acknak: Filling default PUCCH configuration from Tables (r_pucch %d, bwp %p)\n",r_pucch,bwp); int rsetindex = *scc->uplinkConfigCommon->initialUplinkBWP->pucch_ConfigCommon->choice.setup->pucch_ResourceCommon; - int prboffset = r_pucch/default_pucch_csset[rsetindex]; - int prboffsetm8 = (r_pucch-8)/default_pucch_csset[rsetindex]; - pucch_pdu->prb_start = (r_pucch>>3)==0 ? - default_pucch_prboffset[rsetindex] + prboffset: - pucch_pdu->bwp_size-1-default_pucch_prboffset[rsetindex]-prboffsetm8; + int prb_start, second_hop_prb, nr_of_symb, start_symb; + set_r_pucch_parms(rsetindex, + r_pucch, + pucch_pdu->bwp_size, + &prb_start, + &second_hop_prb, + &nr_of_symb, + &start_symb); + + pucch_pdu->prb_start = prb_start; pucch_pdu->rnti = rnti; pucch_pdu->freq_hop_flag = 1; - pucch_pdu->second_hop_prb = (r_pucch>>3)==0? - pucch_pdu->bwp_size-1-default_pucch_prboffset[rsetindex]-prboffset: - default_pucch_prboffset[rsetindex] + prboffsetm8; + pucch_pdu->second_hop_prb = second_hop_prb; pucch_pdu->format_type = default_pucch_fmt[rsetindex]; pucch_pdu->initial_cyclic_shift = r_pucch%default_pucch_csset[rsetindex]; if (rsetindex==3||rsetindex==7||rsetindex==11) pucch_pdu->initial_cyclic_shift*=6; else if (rsetindex==1||rsetindex==2) pucch_pdu->initial_cyclic_shift*=3; else pucch_pdu->initial_cyclic_shift*=4; - pucch_pdu->nr_of_symbols = default_pucch_numbsymb[rsetindex]; - pucch_pdu->start_symbol_index = default_pucch_firstsymb[rsetindex]; + pucch_pdu->nr_of_symbols = nr_of_symb; + pucch_pdu->start_symbol_index = start_symb; if (pucch_pdu->format_type == 1) pucch_pdu->time_domain_occ_idx = 0; // check this!! pucch_pdu->sr_flag = O_sr; pucch_pdu->prb_size=1; @@ -1059,6 +1062,30 @@ void nr_configure_pucch(nfapi_nr_pucch_pdu_t* pucch_pdu, } +void set_r_pucch_parms(int rsetindex, + int r_pucch, + int bwp_size, + int *prb_start, + int *second_hop_prb, + int *nr_of_symbols, + int *start_symbol_index) { + + int prboffset = r_pucch/default_pucch_csset[rsetindex]; + int prboffsetm8 = (r_pucch-8)/default_pucch_csset[rsetindex]; + + *prb_start = (r_pucch>>3)==0 ? + default_pucch_prboffset[rsetindex] + prboffset: + bwp_size-1-default_pucch_prboffset[rsetindex]-prboffsetm8; + + *second_hop_prb = (r_pucch>>3)==0? + bwp_size-1-default_pucch_prboffset[rsetindex]-prboffset: + default_pucch_prboffset[rsetindex] + prboffsetm8; + + *nr_of_symbols = default_pucch_numbsymb[rsetindex]; + *start_symbol_index = default_pucch_firstsymb[rsetindex]; +} + + void prepare_dci(const NR_CellGroupConfig_t *CellGroup, dci_pdu_rel15_t *dci_pdu_rel15, nr_dci_format_t format, diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c index a94559769d..d0c2f16157 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c @@ -32,6 +32,7 @@ #include "NR_MAC_COMMON/nr_mac_extern.h" #include "NR_MAC_gNB/mac_proto.h" #include "common/ran_context.h" +#include "common/utils/nr/nr_common.h" #include "nfapi/oai_integration/vendor_ext.h" extern RAN_CONTEXT_t RC; @@ -539,16 +540,16 @@ void nr_csi_meas_reporting(int Mod_idP, switch(pucchres->format.present){ case NR_PUCCH_Resource__format_PR_format2: len = pucchres->format.choice.format2->nrofPRBs; - mask = ((1 << pucchres->format.choice.format2->nrofSymbols) - 1) << pucchres->format.choice.format2->startingSymbolIndex; + mask = SL_to_bitmap(pucchres->format.choice.format2->startingSymbolIndex, pucchres->format.choice.format2->nrofSymbols); curr_pucch->simultaneous_harqcsi = pucch_Config->format2->choice.setup->simultaneousHARQ_ACK_CSI; break; case NR_PUCCH_Resource__format_PR_format3: len = pucchres->format.choice.format3->nrofPRBs; - mask = ((1 << pucchres->format.choice.format3->nrofSymbols) - 1) << pucchres->format.choice.format3->startingSymbolIndex; + mask = SL_to_bitmap(pucchres->format.choice.format3->startingSymbolIndex, pucchres->format.choice.format3->nrofSymbols); curr_pucch->simultaneous_harqcsi = pucch_Config->format3->choice.setup->simultaneousHARQ_ACK_CSI; break; case NR_PUCCH_Resource__format_PR_format4: - mask = ((1 << pucchres->format.choice.format4->nrofSymbols) - 1) << pucchres->format.choice.format4->startingSymbolIndex; + mask = SL_to_bitmap(pucchres->format.choice.format4->startingSymbolIndex, pucchres->format.choice.format4->nrofSymbols); curr_pucch->simultaneous_harqcsi = pucch_Config->format4->choice.setup->simultaneousHARQ_ACK_CSI; break; default: @@ -556,7 +557,12 @@ void nr_csi_meas_reporting(int Mod_idP, } // verify resources are free for (int i = start; i < start + len; ++i) { - vrb_map_UL[i+bwp_start] |= mask; + if((vrb_map_UL[i+bwp_start] & mask) != 0) { + LOG_E(NR_MAC, "%s(): VRB MAP not free. Can't schedule CSI reporting on PUCCH.\n", __func__); + memset(curr_pucch, 0, sizeof(*curr_pucch)); + } + else + vrb_map_UL[i+bwp_start] |= mask; } } } @@ -1170,6 +1176,63 @@ void handle_nr_uci_pucch_2_3_4(module_id_t mod_id, } } +bool test_acknack_vrb_occupation(NR_UE_sched_ctrl_t *sched_ctrl, + NR_sched_pucch_t *pucch, + uint16_t *vrb_map_UL, + const NR_ServingCellConfigCommon_t *scc, + NR_PUCCH_Config_t *pucch_Config, + int r_pucch, + int bwp_start, + int bwp_size) { + + // We assume initial cyclic shift is always 0 so different pucch resources can't overlap + + NR_sched_pucch_t *csi_pucch = &sched_ctrl->sched_pucch[1]; + if (csi_pucch && + csi_pucch->csi_bits > 0 && + csi_pucch->frame == pucch->frame && + csi_pucch->ul_slot == pucch->ul_slot && + csi_pucch->simultaneous_harqcsi && + (csi_pucch->csi_bits + csi_pucch->dai_c) < 11) + return true; // available resources for csi_pucch already verified + + int prb_start, second_hop_prb, nr_of_symb, start_symb; + if(r_pucch<0){ + const NR_PUCCH_Resource_t *resource = pucch_Config->resourceToAddModList->list.array[0]; + DevAssert(resource->format.present == NR_PUCCH_Resource__format_PR_format0); + second_hop_prb = resource->secondHopPRB!= NULL ? *resource->secondHopPRB : 0; + nr_of_symb = resource->format.choice.format0->nrofSymbols; + start_symb = resource->format.choice.format0->startingSymbolIndex; + prb_start = resource->startingPRB; + } + else{ + int rsetindex = *scc->uplinkConfigCommon->initialUplinkBWP->pucch_ConfigCommon->choice.setup->pucch_ResourceCommon; + set_r_pucch_parms(rsetindex, + r_pucch, + bwp_size, + &prb_start, + &second_hop_prb, + &nr_of_symb, + &start_symb); + } + + // verifying occupation of PRBs for ACK/NACK on dedicated pucch + bool ret = true; + for (int l=0; lUE_info.UE_sched_ctrl[UE_id]; + + NR_PUCCH_Config_t *pucch_Config = NULL; + if (sched_ctrl->active_ubwp) { + pucch_Config = sched_ctrl->active_ubwp->bwp_Dedicated->pucch_Config->choice.setup; + } else if (RC.nrmac[mod_id]->UE_info.CellGroup[UE_id] && + RC.nrmac[mod_id]->UE_info.CellGroup[UE_id]->spCellConfig && + RC.nrmac[mod_id]->UE_info.CellGroup[UE_id]->spCellConfig->spCellConfigDedicated && + RC.nrmac[mod_id]->UE_info.CellGroup[UE_id]->spCellConfig->spCellConfigDedicated->uplinkConfig && + RC.nrmac[mod_id]->UE_info.CellGroup[UE_id]->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP && + RC.nrmac[mod_id]->UE_info.CellGroup[UE_id]->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup) { + pucch_Config = RC.nrmac[mod_id]->UE_info.CellGroup[UE_id]->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup; + } + NR_BWP_t *genericParameters = sched_ctrl->active_ubwp ? + &sched_ctrl->active_ubwp->bwp_Common->genericParameters: + &scc->uplinkConfigCommon->initialUplinkBWP->genericParameters; + int bwp_start = NRRIV2PRBOFFSET(genericParameters->locationAndBandwidth,MAX_BWP_SIZE); + int bwp_size = NRRIV2BW(genericParameters->locationAndBandwidth, MAX_BWP_SIZE); + NR_sched_pucch_t *pucch = &sched_ctrl->sched_pucch[0]; LOG_D(NR_MAC,"pucch_acknak %d.%d Trying to allocate pucch, current DAI %d\n",frame,slot,pucch->dai_c); pucch->r_pucch=r_pucch; @@ -1321,21 +1402,32 @@ int nr_acknack_scheduling(int mod_id, int ind_found = -1; // while we are within the feedback limits while ((n_slots_frame + pucch->ul_slot - slot) % n_slots_frame <= max_fb_time) { - int i = 0; - while (i < 8) { - LOG_D(NR_MAC,"pdsch_to_harq_feedback[%d] = %d (pucch->ul_slot %d - slot %d)\n", - i,pdsch_to_harq_feedback[i],pucch->ul_slot,slot); - int diff = pucch->ul_slot - slot; - if (diff<0) - diff += n_slots_frame; - if (pdsch_to_harq_feedback[i] == diff) { - ind_found = i; - break; + // checking if in ul_slot the resources potentially to be assigned to this PUCCH are available + bool ret = test_acknack_vrb_occupation(sched_ctrl, + pucch, + &RC.nrmac[mod_id]->common_channels[CC_id].vrb_map_UL[pucch->ul_slot * MAX_BWP_SIZE], + scc, + pucch_Config, + r_pucch, + bwp_start, + bwp_size); + if (ret) { + int i = 0; + while (i < 8) { + LOG_D(NR_MAC,"pdsch_to_harq_feedback[%d] = %d (pucch->ul_slot %d - slot %d)\n", + i,pdsch_to_harq_feedback[i],pucch->ul_slot,slot); + int diff = pucch->ul_slot - slot; + if (diff<0) + diff += n_slots_frame; + if (pdsch_to_harq_feedback[i] == diff) { + ind_found = i; + break; + } + ++i; } - ++i; + if (ind_found!=-1) + break; } - if (ind_found!=-1) - break; // advance to the next ul slot const int f = pucch->frame; const int s = pucch->ul_slot; @@ -1396,45 +1488,36 @@ int nr_acknack_scheduling(int mod_id, pucch->dai_c++; pucch->resource_indicator = 0; // each UE has dedicated PUCCH resources pucch->r_pucch=r_pucch; - NR_PUCCH_Config_t *pucch_Config = NULL; - if (sched_ctrl->active_ubwp) { - pucch_Config = sched_ctrl->active_ubwp->bwp_Dedicated->pucch_Config->choice.setup; - } else if (RC.nrmac[mod_id]->UE_info.CellGroup[UE_id] && - RC.nrmac[mod_id]->UE_info.CellGroup[UE_id]->spCellConfig && - RC.nrmac[mod_id]->UE_info.CellGroup[UE_id]->spCellConfig->spCellConfigDedicated && - RC.nrmac[mod_id]->UE_info.CellGroup[UE_id]->spCellConfig->spCellConfigDedicated->uplinkConfig && - RC.nrmac[mod_id]->UE_info.CellGroup[UE_id]->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP && - RC.nrmac[mod_id]->UE_info.CellGroup[UE_id]->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup) { - pucch_Config = RC.nrmac[mod_id]->UE_info.CellGroup[UE_id]->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup; - } - NR_BWP_t *genericParameters = sched_ctrl->active_ubwp ? - &sched_ctrl->active_ubwp->bwp_Common->genericParameters: - &scc->uplinkConfigCommon->initialUplinkBWP->genericParameters; - int bwp_start = NRRIV2PRBOFFSET(genericParameters->locationAndBandwidth,MAX_BWP_SIZE); - - /* verify that at that slot and symbol, resources are free. We only do this - * for initialCyclicShift 0 (we assume it always has that one), so other - * initialCyclicShifts can overlap with ICS 0!*/ - if (pucch_Config) { + int prb_start, second_hop_prb, nr_of_symb, start_symb; + if(r_pucch<0){ const NR_PUCCH_Resource_t *resource = pucch_Config->resourceToAddModList->list.array[pucch->resource_indicator]; DevAssert(resource->format.present == NR_PUCCH_Resource__format_PR_format0); - int second_hop_prb = resource->secondHopPRB!= NULL ? *resource->secondHopPRB : 0; - int nr_of_symbols = resource->format.choice.format0->nrofSymbols; - if (resource->format.choice.format0->initialCyclicShift == 0) { - uint16_t *vrb_map_UL = &RC.nrmac[mod_id]->common_channels[CC_id].vrb_map_UL[pucch->ul_slot * MAX_BWP_SIZE]; - for (int l=0; lformat.choice.format0->startingSymbolIndex + l); - int prb; - if (l==1 && second_hop_prb != 0) - prb = second_hop_prb; - else - prb = resource->startingPRB; - if ((vrb_map_UL[bwp_start+prb] & symb) != 0) - LOG_W(MAC, "symbol 0x%x is not free for PUCCH alloc in vrb_map_UL at RB %ld and slot %d.%d\n", symb, resource->startingPRB, pucch->frame, pucch->ul_slot); - vrb_map_UL[bwp_start+prb] |= symb; - } - } + second_hop_prb = resource->secondHopPRB!= NULL ? *resource->secondHopPRB : 0; + nr_of_symb = resource->format.choice.format0->nrofSymbols; + start_symb = resource->format.choice.format0->startingSymbolIndex; + prb_start = resource->startingPRB; + } + else{ + int rsetindex = *scc->uplinkConfigCommon->initialUplinkBWP->pucch_ConfigCommon->choice.setup->pucch_ResourceCommon; + set_r_pucch_parms(rsetindex, + r_pucch, + bwp_size, + &prb_start, + &second_hop_prb, + &nr_of_symb, + &start_symb); + } + + uint16_t *vrb_map_UL = &RC.nrmac[mod_id]->common_channels[CC_id].vrb_map_UL[pucch->ul_slot * MAX_BWP_SIZE]; + for (int l=0; l Date: Thu, 16 Dec 2021 14:44:40 +0100 Subject: [PATCH 07/96] additional parameters in pucch structure to avoid double computation --- .../LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c | 57 ++++++------------- openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h | 4 ++ 2 files changed, 22 insertions(+), 39 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c index d0c2f16157..61efbdb941 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c @@ -1196,35 +1196,34 @@ bool test_acknack_vrb_occupation(NR_UE_sched_ctrl_t *sched_ctrl, (csi_pucch->csi_bits + csi_pucch->dai_c) < 11) return true; // available resources for csi_pucch already verified - int prb_start, second_hop_prb, nr_of_symb, start_symb; if(r_pucch<0){ const NR_PUCCH_Resource_t *resource = pucch_Config->resourceToAddModList->list.array[0]; DevAssert(resource->format.present == NR_PUCCH_Resource__format_PR_format0); - second_hop_prb = resource->secondHopPRB!= NULL ? *resource->secondHopPRB : 0; - nr_of_symb = resource->format.choice.format0->nrofSymbols; - start_symb = resource->format.choice.format0->startingSymbolIndex; - prb_start = resource->startingPRB; + pucch->second_hop_prb = resource->secondHopPRB!= NULL ? *resource->secondHopPRB : 0; + pucch->nr_of_symb = resource->format.choice.format0->nrofSymbols; + pucch->start_symb = resource->format.choice.format0->startingSymbolIndex; + pucch->prb_start = resource->startingPRB; } else{ int rsetindex = *scc->uplinkConfigCommon->initialUplinkBWP->pucch_ConfigCommon->choice.setup->pucch_ResourceCommon; set_r_pucch_parms(rsetindex, r_pucch, bwp_size, - &prb_start, - &second_hop_prb, - &nr_of_symb, - &start_symb); + &pucch->prb_start, + &pucch->second_hop_prb, + &pucch->nr_of_symb, + &pucch->start_symb); } // verifying occupation of PRBs for ACK/NACK on dedicated pucch bool ret = true; - for (int l=0; lnr_of_symb; l++) { + uint16_t symb = SL_to_bitmap(pucch->start_symb+l, 1); int prb; - if (l==1 && second_hop_prb != 0) - prb = second_hop_prb; + if (l==1 && pucch->second_hop_prb != 0) + prb = pucch->second_hop_prb; else - prb = prb_start; + prb = pucch->prb_start; if ((vrb_map_UL[bwp_start+prb] & symb) != 0) { ret = false; break; @@ -1489,34 +1488,14 @@ int nr_acknack_scheduling(int mod_id, pucch->resource_indicator = 0; // each UE has dedicated PUCCH resources pucch->r_pucch=r_pucch; - int prb_start, second_hop_prb, nr_of_symb, start_symb; - if(r_pucch<0){ - const NR_PUCCH_Resource_t *resource = pucch_Config->resourceToAddModList->list.array[pucch->resource_indicator]; - DevAssert(resource->format.present == NR_PUCCH_Resource__format_PR_format0); - second_hop_prb = resource->secondHopPRB!= NULL ? *resource->secondHopPRB : 0; - nr_of_symb = resource->format.choice.format0->nrofSymbols; - start_symb = resource->format.choice.format0->startingSymbolIndex; - prb_start = resource->startingPRB; - } - else{ - int rsetindex = *scc->uplinkConfigCommon->initialUplinkBWP->pucch_ConfigCommon->choice.setup->pucch_ResourceCommon; - set_r_pucch_parms(rsetindex, - r_pucch, - bwp_size, - &prb_start, - &second_hop_prb, - &nr_of_symb, - &start_symb); - } - uint16_t *vrb_map_UL = &RC.nrmac[mod_id]->common_channels[CC_id].vrb_map_UL[pucch->ul_slot * MAX_BWP_SIZE]; - for (int l=0; lnr_of_symb; l++) { + uint16_t symb = SL_to_bitmap(pucch->start_symb+l, 1); int prb; - if (l==1 && second_hop_prb != 0) - prb = second_hop_prb; + if (l==1 && pucch->second_hop_prb != 0) + prb = pucch->second_hop_prb; else - prb = prb_start; + prb = pucch->prb_start; vrb_map_UL[bwp_start+prb] |= symb; } return 0; diff --git a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h index 3944cb34f9..83eee7f827 100644 --- a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h +++ b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h @@ -313,6 +313,10 @@ typedef struct NR_sched_pucch { uint8_t timing_indicator; uint8_t resource_indicator; int r_pucch; + int prb_start; + int second_hop_prb; + int nr_of_symb; + int start_symb; } NR_sched_pucch_t; /* PUSCH semi-static configuration: as long as the TDA and DCI format remain From 5e3e1e42a5390e07cf7dbcf38090517dd41f217d Mon Sep 17 00:00:00 2001 From: francescomani Date: Mon, 20 Dec 2021 16:31:49 +0100 Subject: [PATCH 08/96] remove softmodem param for 256 qam --- executables/softmodem-common.h | 11 ++++------- openair1/SIMULATION/NR_PHY/dlsim.c | 6 ------ openair2/RRC/NR/rrc_gNB_reconfig.c | 21 +++------------------ 3 files changed, 7 insertions(+), 31 deletions(-) diff --git a/executables/softmodem-common.h b/executables/softmodem-common.h index 3a7022a502..f51d9c4724 100644 --- a/executables/softmodem-common.h +++ b/executables/softmodem-common.h @@ -119,7 +119,6 @@ extern "C" #define TIMING_SOURCE softmodem_params.timing_source #define SEND_DMRSSYNC softmodem_params.send_dmrs_sync #define USIM_TEST softmodem_params.usim_test -#define USE_256QAM_TABLE softmodem_params.use_256qam_table #define PRB_INTERPOLATION softmodem_params.prb_interpolation #define NFAPI softmodem_params.nfapi #define NON_STOP softmodem_params.non_stop @@ -154,11 +153,10 @@ extern int usrp_tx_thread; {"basicsim", CONFIG_HLP_RFSIM, PARAMFLAG_BOOL, uptr:&basicsim, defintval:0, TYPE_INT, 0}, \ {"nokrnmod", CONFIG_HLP_NOKRNMOD, PARAMFLAG_BOOL, uptr:&nokrnmod, defintval:0, TYPE_INT, 0}, \ {"nbiot-disable", CONFIG_HLP_DISABLNBIOT, PARAMFLAG_BOOL, uptr:&nonbiot, defuintval:0, TYPE_INT, 0}, \ - {"use-256qam-table", CONFIG_HLP_256QAM, PARAMFLAG_BOOL, iptr:&USE_256QAM_TABLE, defintval:0, TYPE_INT, 0}, \ - {"do-prb-interpolation", CONFIG_HLP_PRBINTER, PARAMFLAG_BOOL, iptr:&PRB_INTERPOLATION, defintval:0, TYPE_INT, 0}, \ - {"usrp-tx-thread-config", CONFIG_HLP_USRP_THREAD, 0, iptr:&usrp_tx_thread, defstrval:0, TYPE_INT, 0}, \ - {"nfapi", CONFIG_HLP_NFAPI, 0, u8ptr:&nfapi_mode, defintval:0, TYPE_UINT8, 0}, \ - {"non-stop", CONFIG_HLP_NONSTOP, PARAMFLAG_BOOL, iptr:&NON_STOP, defintval:0, TYPE_INT, 0}, \ + {"do-prb-interpolation", CONFIG_HLP_PRBINTER, PARAMFLAG_BOOL, iptr:&PRB_INTERPOLATION, defintval:0, TYPE_INT, 0}, \ + {"usrp-tx-thread-config", CONFIG_HLP_USRP_THREAD, 0, iptr:&usrp_tx_thread, defstrval:0, TYPE_INT, 0}, \ + {"nfapi", CONFIG_HLP_NFAPI, 0, u8ptr:&nfapi_mode, defintval:0, TYPE_UINT8, 0}, \ + {"non-stop", CONFIG_HLP_NONSTOP, PARAMFLAG_BOOL, iptr:&NON_STOP, defintval:0, TYPE_INT, 0}, \ } @@ -248,7 +246,6 @@ typedef struct { uint32_t timing_source; int hw_timing_advance; uint32_t send_dmrs_sync; - int use_256qam_table; int prb_interpolation; uint8_t nfapi; int non_stop; diff --git a/openair1/SIMULATION/NR_PHY/dlsim.c b/openair1/SIMULATION/NR_PHY/dlsim.c index dc46215d1b..d5ff44a484 100644 --- a/openair1/SIMULATION/NR_PHY/dlsim.c +++ b/openair1/SIMULATION/NR_PHY/dlsim.c @@ -605,11 +605,6 @@ int main(int argc, char **argv) g_mcsIndex = atoi(optarg); break; - case 'q': - g_mcsTableIdx = 1; - get_softmodem_params()->use_256qam_table = 1; - break; - case 'm': mu = atoi(optarg); break; @@ -665,7 +660,6 @@ int main(int argc, char **argv) printf("-c Start symbol for PDSCH (fixed for now)\n"); printf("-j Number of symbols for PDSCH (fixed for now)\n"); printf("-e MSC index\n"); - printf("-q Use 2nd MCS table (256 QAM table) for PDSCH\n"); printf("-t Acceptable effective throughput (in percentage)\n"); printf("-T Enable PTRS, arguments list L_PTRS{0,1,2} K_PTRS{2,4}, e.g. -T 2 0 2 \n"); printf("-U Change DMRS Config, arguments list DMRS TYPE{0=A,1=B} DMRS AddPos{0:2} DMRS ConfType{1:2}, e.g. -U 3 0 2 1 \n"); diff --git a/openair2/RRC/NR/rrc_gNB_reconfig.c b/openair2/RRC/NR/rrc_gNB_reconfig.c index 30604cd015..9329ff17ac 100644 --- a/openair2/RRC/NR/rrc_gNB_reconfig.c +++ b/openair2/RRC/NR/rrc_gNB_reconfig.c @@ -330,12 +330,7 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->rateMatchPatternGroup1=NULL; secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->rateMatchPatternGroup2=NULL; secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->rbg_Size=NR_PDSCH_Config__rbg_Size_config1; - if (!get_softmodem_params()->use_256qam_table) { - secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->mcs_Table=NULL; - } else { - secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->mcs_Table = calloc(1, sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->mcs_Table)); - *secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->mcs_Table = NR_PDSCH_Config__mcs_Table_qam256; - } + secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->mcs_Table=NULL; secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->maxNrofCodeWordsScheduledByDCI = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->maxNrofCodeWordsScheduledByDCI)); *secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->maxNrofCodeWordsScheduledByDCI = NR_PDSCH_Config__maxNrofCodeWordsScheduledByDCI_n1; secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->prb_BundlingType.present = NR_PDSCH_Config__prb_BundlingType_PR_staticBundling; @@ -597,12 +592,7 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco bwp->bwp_Dedicated->pdsch_Config->choice.setup->rateMatchPatternGroup1=NULL; bwp->bwp_Dedicated->pdsch_Config->choice.setup->rateMatchPatternGroup2=NULL; bwp->bwp_Dedicated->pdsch_Config->choice.setup->rbg_Size=NR_PDSCH_Config__rbg_Size_config1; - if (!get_softmodem_params()->use_256qam_table) { - bwp->bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table=NULL; - } else { - bwp->bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table = calloc(1, sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table)); - *bwp->bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table = NR_PDSCH_Config__mcs_Table_qam256; - } + bwp->bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table=NULL; bwp->bwp_Dedicated->pdsch_Config->choice.setup->maxNrofCodeWordsScheduledByDCI = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->maxNrofCodeWordsScheduledByDCI)); *bwp->bwp_Dedicated->pdsch_Config->choice.setup->maxNrofCodeWordsScheduledByDCI = NR_PDSCH_Config__maxNrofCodeWordsScheduledByDCI_n1; bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.present = NR_PDSCH_Config__prb_BundlingType_PR_staticBundling; @@ -628,12 +618,7 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco bwp->bwp_Dedicated->pdsch_Config->choice.setup->rateMatchPatternGroup1=NULL; bwp->bwp_Dedicated->pdsch_Config->choice.setup->rateMatchPatternGroup2=NULL; bwp->bwp_Dedicated->pdsch_Config->choice.setup->rbg_Size=NR_PDSCH_Config__rbg_Size_config1; - if (!get_softmodem_params()->use_256qam_table) { - bwp->bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table=NULL; - } else { - bwp->bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table = calloc(1, sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table)); - *bwp->bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table = NR_PDSCH_Config__mcs_Table_qam256; - } + bwp->bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table=NULL; bwp->bwp_Dedicated->pdsch_Config->choice.setup->maxNrofCodeWordsScheduledByDCI = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->maxNrofCodeWordsScheduledByDCI)); *bwp->bwp_Dedicated->pdsch_Config->choice.setup->maxNrofCodeWordsScheduledByDCI = NR_PDSCH_Config__maxNrofCodeWordsScheduledByDCI_n1; bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.present = NR_PDSCH_Config__prb_BundlingType_PR_staticBundling; From ae29f64419adfa54a1e6cdefb4303a042d44cc63 Mon Sep 17 00:00:00 2001 From: francescomani Date: Tue, 21 Dec 2021 10:57:35 +0100 Subject: [PATCH 09/96] adapting function for dl 256 qam --- common/utils/nr/nr_common.c | 21 +++++++++++ common/utils/nr/nr_common.h | 1 + openair2/RRC/NR/nr_rrc_config.c | 67 ++++++++++++++++++++++++++++++++- openair2/RRC/NR/nr_rrc_config.h | 1 + openair2/RRC/NR/rrc_gNB.c | 28 +------------- 5 files changed, 90 insertions(+), 28 deletions(-) diff --git a/common/utils/nr/nr_common.c b/common/utils/nr/nr_common.c index 34a86f860a..25af02ba4b 100644 --- a/common/utils/nr/nr_common.c +++ b/common/utils/nr/nr_common.c @@ -36,6 +36,27 @@ const char *duplex_mode[]={"FDD","TDD"}; +int tables_5_3_2[5][11] = { + {25, 52, 79, 106, 133, 160, 216, 270, -1, -1, -1}, // 15 FR1 + {11, 24, 38, 51, 65, 78, 106, 133, 162, 217, 273}, // 30 FR1 + {-1, 11, 18, 24, 31, 38, 51, 65, 79, 107, 135}, // 60 FR1 + {66, 132, 264, -1 , -1, -1, -1, -1, -1, -1, -1}, // 60 FR2 + {32, 66, 132, 264, -1, -1, -1, -1, -1, -1, -1} // 120FR2 +}; + +int get_supported_band_index(int scs, int band, int n_rbs){ + + int scs_index = scs; + if (band>256) + scs_index++; + for (int i=0; i<11; i++) { + if(n_rbs == tables_5_3_2[scs][i]) + return i; + } + return (-1); // not found +} + + // Table 5.2-1 NR operating bands in FR1 & FR2 (3GPP TS 38.101) // Table 5.4.2.3-1 Applicable NR-ARFCN per operating band in FR1 & FR2 (3GPP TS 38.101) // Notes: diff --git a/common/utils/nr/nr_common.h b/common/utils/nr/nr_common.h index d16c8fbb19..5d8cdf06bf 100644 --- a/common/utils/nr/nr_common.h +++ b/common/utils/nr/nr_common.h @@ -72,6 +72,7 @@ int get_subband_size(int NPRB,int size); void SLIV2SL(int SLIV,int *S,int *L); int get_dmrs_port(int nl, uint16_t dmrs_ports); int get_nb_periods_per_frame(uint8_t tdd_period); +int get_supported_band_index(int scs, int band, int n_rbs); #define CEILIDIV(a,b) ((a+b-1)/b) #define ROUNDIDIV(a,b) (((a<<1)+b)/(b<<1)) diff --git a/openair2/RRC/NR/nr_rrc_config.c b/openair2/RRC/NR/nr_rrc_config.c index b4cbe7b8bc..73f91622f5 100644 --- a/openair2/RRC/NR/nr_rrc_config.c +++ b/openair2/RRC/NR/nr_rrc_config.c @@ -98,6 +98,71 @@ void nr_rrc_config_ul_tda(NR_ServingCellConfigCommon_t *scc, int min_fb_delay){ ASN_SEQUENCE_ADD(&scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list,pusch_timedomainresourceallocation_msg3); } } - } + +void set_dl_mcs_table(NR_BWP_Downlink_t *bwp, NR_ServingCellConfigCommon_t *scc, NR_UE_NR_Capability_t *cap) { + + int band = *scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0]; + int scs = bwp->bwp_Common->genericParameters.subcarrierSpacing; + struct NR_FrequencyInfoDL__scs_SpecificCarrierList scs_list = scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList; + int bw_rb = -1; + for(int i=0; isubcarrierSpacing){ + bw_rb = scs_list.list.array[i]->carrierBandwidth; + break; + } + } + AssertFatal(bw_rb>0,"Could not find scs-SpecificCarrierList element for scs %d",scs); + int bw = get_supported_band_index(scs, band, bw_rb); + AssertFatal(bw>0,"Supported band corresponding to %d RBs not found\n", bw_rb); + + bool supported = false; + if (band>256) { + for (int i=0;irf_Parameters.supportedBandListNR.list.count;i++) { + NR_BandNR_t *bandNRinfo = cap->rf_Parameters.supportedBandListNR.list.array[i]; + if(bandNRinfo->bandNR == band && bandNRinfo->pdsch_256QAM_FR2) { + supported = true; + break; + } + } + } + else if (cap->phy_Parameters.phy_ParametersFR1 && cap->phy_Parameters.phy_ParametersFR1->pdsch_256QAM_FR1) + supported = true; + + // check featureSet + NR_FeatureSets_t *fs=cap->featureSets; + NR_ModulationOrder_t supported_mo = 0; + if (fs && supported) { + // go through DL feature sets and look for one with current SCS + for (int i=0;ifeatureSetsDownlinkPerCC->list.count;i++) { + int supported_bw; + NR_FeatureSetDownlinkPerCC_t *fs_cc = fs->featureSetsDownlinkPerCC->list.array[i]; + switch (fs_cc->supportedBandwidthDL.present) { + case NR_SupportedBandwidth_PR_fr1: + supported_bw = fs_cc->supportedBandwidthDL.choice.fr1; + break; + case NR_SupportedBandwidth_PR_fr2: + supported_bw = fs_cc->supportedBandwidthDL.choice.fr2; + break; + default: + AssertFatal(1==0,"Invalid parameter for supported bandwith choice\n"); + } + if (fs_cc->supportedSubcarrierSpacingDL == scs && + supported_bw == bw && + fs_cc->supportedModulationOrderDL) + supported_mo = *fs_cc->supportedModulationOrderDL ; + } + } + if (supported && (supported_mo == NR_ModulationOrder_qam256)) { + long *mcs_Table = bwp->bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table; + if(mcs_Table == NULL) + mcs_Table = calloc(1, sizeof(*mcs_Table)); + *mcs_Table = NR_PDSCH_Config__mcs_Table_qam256; + } + else + bwp->bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table = NULL; +} + + + diff --git a/openair2/RRC/NR/nr_rrc_config.h b/openair2/RRC/NR/nr_rrc_config.h index 192fee754e..7daf08b547 100644 --- a/openair2/RRC/NR/nr_rrc_config.h +++ b/openair2/RRC/NR/nr_rrc_config.h @@ -113,6 +113,7 @@ typedef struct physicalcellgroup_s{ void nr_rrc_config_dl_tda(NR_ServingCellConfigCommon_t *scc); void nr_rrc_config_ul_tda(NR_ServingCellConfigCommon_t *scc, int min_fb_delay); +void set_dl_mcs_table(NR_BWP_Downlink_t *bwp, NR_ServingCellConfigCommon_t *scc, NR_UE_NR_Capability_t *cap); #endif diff --git a/openair2/RRC/NR/rrc_gNB.c b/openair2/RRC/NR/rrc_gNB.c index 7f7353f9af..9562d671e6 100755 --- a/openair2/RRC/NR/rrc_gNB.c +++ b/openair2/RRC/NR/rrc_gNB.c @@ -2891,30 +2891,6 @@ unsigned int get_ul_bw_mask(gNB_RRC_INST *rrc,NR_UE_NR_Capability_t *cap) { return(0); } -int is_dl_256QAM_supported(gNB_RRC_INST *rrc,NR_UE_NR_Capability_t *cap) { - int common_band = *rrc->carrier.servingcellconfigcommon->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0]; - int common_scs = rrc->carrier.servingcellconfigcommon->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing; - if (common_band>256) { - for (int i=0;irf_Parameters.supportedBandListNR.list.count;i++) { - NR_BandNR_t *bandNRinfo = cap->rf_Parameters.supportedBandListNR.list.array[i]; - if (bandNRinfo->bandNR == common_band && !bandNRinfo->pdsch_256QAM_FR2) return (0); - } - } - else if (cap->phy_Parameters.phy_ParametersFR1 && !cap->phy_Parameters.phy_ParametersFR1->pdsch_256QAM_FR1) return(0); - - // check featureSet - NR_FeatureSets_t *fs=cap->featureSets; - if (fs) { - // go through DL feature sets and look for one with current SCS - for (int i=0;ifeatureSetsDownlinkPerCC->list.count;i++) { - if (fs->featureSetsDownlinkPerCC->list.array[i]->supportedSubcarrierSpacingDL == common_scs && - fs->featureSetsDownlinkPerCC->list.array[i]->supportedModulationOrderDL && - *fs->featureSetsDownlinkPerCC->list.array[i]->supportedModulationOrderDL == NR_ModulationOrder_qam256) return(1); - } - } - return(0); -} - int is_ul_256QAM_supported(gNB_RRC_INST *rrc,NR_UE_NR_Capability_t *cap) { int common_band = *rrc->carrier.servingcellconfigcommon->uplinkConfigCommon->frequencyInfoUL->frequencyBandList->list.array[0]; int common_scs = rrc->carrier.servingcellconfigcommon->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing; @@ -3005,11 +2981,9 @@ void nr_rrc_subframe_process(protocol_ctxt_t *const ctxt_pP, const int CC_id) { } if (ue_context_p->ue_context.UE_Capability_nr) { - fprintf(fd,"NR RRC UE cap: BW DL %x. BW UL %x, 256 QAM DL %s, 256 QAM UL %s, DL MIMO Layers %d UL MIMO Layers (CB) %d UL MIMO Layers (nonCB) %d\n", + fprintf(fd,"NR RRC UE cap: BW DL %x. BW UL %x, DL MIMO Layers %d UL MIMO Layers (CB) %d UL MIMO Layers (nonCB) %d\n", get_dl_bw_mask(RC.nrrrc[0],ue_context_p->ue_context.UE_Capability_nr), get_ul_bw_mask(RC.nrrrc[0],ue_context_p->ue_context.UE_Capability_nr), - is_dl_256QAM_supported(RC.nrrrc[0],ue_context_p->ue_context.UE_Capability_nr) == 1 ? "yes" : "no", - is_ul_256QAM_supported(RC.nrrrc[0],ue_context_p->ue_context.UE_Capability_nr) == 1 ? "yes" : "no", get_dl_mimo_layers(RC.nrrrc[0],ue_context_p->ue_context.UE_Capability_nr), get_ul_mimo_layersCB(RC.nrrrc[0],ue_context_p->ue_context.UE_Capability_nr), get_ul_mimo_layers(RC.nrrrc[0],ue_context_p->ue_context.UE_Capability_nr)); From dfc53049678b0dc6a6e5d6d146872ee271f61436 Mon Sep 17 00:00:00 2001 From: francescomani Date: Wed, 22 Dec 2021 10:43:08 +0100 Subject: [PATCH 10/96] passing UECAP structure to RRC reconfiguration functions --- openair1/SIMULATION/NR_PHY/dlsim.c | 3 ++- openair1/SIMULATION/NR_PHY/ulsim.c | 3 ++- openair2/RRC/NR/MESSAGES/asn1_msg.c | 21 ++++++++++++--------- openair2/RRC/NR/MESSAGES/asn1_msg.h | 6 ++++++ openair2/RRC/NR/nr_rrc_proto.h | 2 ++ openair2/RRC/NR/rrc_gNB.c | 8 ++++++++ openair2/RRC/NR/rrc_gNB_nsa.c | 2 ++ openair2/RRC/NR/rrc_gNB_reconfig.c | 3 +++ 8 files changed, 37 insertions(+), 11 deletions(-) diff --git a/openair1/SIMULATION/NR_PHY/dlsim.c b/openair1/SIMULATION/NR_PHY/dlsim.c index d5ff44a484..32a05f060a 100644 --- a/openair1/SIMULATION/NR_PHY/dlsim.c +++ b/openair1/SIMULATION/NR_PHY/dlsim.c @@ -762,7 +762,8 @@ int main(int argc, char **argv) prepare_scd(scd); - fill_default_secondaryCellGroup(scc, scd, secondaryCellGroup, 0, 1, n_tx, 6, 0, 0, 0); + // TODO do a UECAP for phy-sim + fill_default_secondaryCellGroup(scc, scd, secondaryCellGroup, NULL, 0, 1, n_tx, 6, 0, 0, 0); /* RRC parameter validation for secondaryCellGroup */ fix_scd(scd); diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c index c9d863c6b5..f30e6393a7 100644 --- a/openair1/SIMULATION/NR_PHY/ulsim.c +++ b/openair1/SIMULATION/NR_PHY/ulsim.c @@ -713,7 +713,8 @@ int main(int argc, char **argv) prepare_scd(scd); - fill_default_secondaryCellGroup(scc, scd, secondaryCellGroup, 0, 1, n_tx, 0, 0, 0, 0); + // TODO do a UECAP for phy-sim + fill_default_secondaryCellGroup(scc, scd, secondaryCellGroup, NULL, 0, 1, n_tx, 0, 0, 0, 0); // xer_fprint(stdout, &asn_DEF_NR_CellGroupConfig, (const void*)secondaryCellGroup); diff --git a/openair2/RRC/NR/MESSAGES/asn1_msg.c b/openair2/RRC/NR/MESSAGES/asn1_msg.c index bdd1cf5261..cad40cd05a 100755 --- a/openair2/RRC/NR/MESSAGES/asn1_msg.c +++ b/openair2/RRC/NR/MESSAGES/asn1_msg.c @@ -1407,6 +1407,13 @@ void fill_mastercellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig, NR_CellGr ASN_SEQUENCE_ADD(&ue_context_mastercellGroup->rlc_BearerToAddModList->list, rlc_BearerConfig_drb); } + +void update_cellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig, + rrc_gNB_carrier_data_t *carrier, + NR_UE_NR_Capability_t *uecap) { + +} + void fill_initial_cellGroupConfig(rnti_t rnti, NR_CellGroupConfig_t *cellGroupConfig, NR_ServingCellConfigCommon_t *scc, @@ -1824,6 +1831,8 @@ int16_t do_RRCReconfiguration( NR_SDAP_Config_t *sdap_config, NR_MeasConfig_t *meas_config, struct NR_RRCReconfiguration_v1530_IEs__dedicatedNAS_MessageList *dedicatedNAS_MessageList, + rrc_gNB_ue_context_t *const ue_context_pP, + rrc_gNB_carrier_data_t *carrier, NR_MAC_CellGroupConfig_t *mac_CellGroupConfig, NR_CellGroupConfig_t *cellGroupConfig) //------------------------------------------------------------------------------ @@ -1860,15 +1869,6 @@ int16_t do_RRCReconfiguration( ie->radioBearerConfig->srb3_ToRelease = NULL; ie->radioBearerConfig->drb_ToReleaseList = DRB_releaseList; } - /******************** Secondary Cell Group ********************/ - // rrc_gNB_carrier_data_t *carrier = &(gnb_rrc_inst->carrier); - // fill_default_secondaryCellGroup( carrier->servingcellconfigcommon, - // ue_context_pP->ue_context.secondaryCellGroup, - // 1, - // 1, - // carrier->pdsch_AntennaPorts, - // carrier->initial_csi_index[ue_context_p->local_uid + 1], - // ue_context_pP->local_uid); /******************** Meas Config ********************/ // measConfig @@ -1884,6 +1884,9 @@ int16_t do_RRCReconfiguration( } if(cellGroupConfig!=NULL){ + update_cellGroupConfig(cellGroupConfig, + carrier, + ue_context_pP->ue_context.UE_Capability_nr); enc_rval = uper_encode_to_buffer(&asn_DEF_NR_CellGroupConfig, NULL, (void *)cellGroupConfig, diff --git a/openair2/RRC/NR/MESSAGES/asn1_msg.h b/openair2/RRC/NR/MESSAGES/asn1_msg.h index 7b38de2bb9..8585e82af8 100644 --- a/openair2/RRC/NR/MESSAGES/asn1_msg.h +++ b/openair2/RRC/NR/MESSAGES/asn1_msg.h @@ -99,6 +99,10 @@ void fill_initial_cellGroupConfig(rnti_t rnti, NR_ServingCellConfigCommon_t *scc, rrc_gNB_carrier_data_t *carrier); +void update_cellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig, + rrc_gNB_carrier_data_t *carrier, + NR_UE_NR_Capability_t *uecap); + void fill_mastercellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig, NR_CellGroupConfig_t *ue_context_mastercellGroup); uint8_t do_RRCSetup(rrc_gNB_ue_context_t *const ue_context_pP, @@ -133,6 +137,8 @@ int16_t do_RRCReconfiguration( NR_SDAP_Config_t *sdap_config, NR_MeasConfig_t *meas_config, struct NR_RRCReconfiguration_v1530_IEs__dedicatedNAS_MessageList *dedicatedNAS_MessageList, + rrc_gNB_ue_context_t *const ue_context_pP, + rrc_gNB_carrier_data_t *carrier, NR_MAC_CellGroupConfig_t *mac_CellGroupConfig, NR_CellGroupConfig_t *cellGroupConfig); diff --git a/openair2/RRC/NR/nr_rrc_proto.h b/openair2/RRC/NR/nr_rrc_proto.h index 22109c3029..7309bcf2d9 100644 --- a/openair2/RRC/NR/nr_rrc_proto.h +++ b/openair2/RRC/NR/nr_rrc_proto.h @@ -76,6 +76,7 @@ void rrc_remove_nsa_user(gNB_RRC_INST *rrc, int rnti); void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellconfigcommon, NR_ServingCellConfig_t *servingcellconfigdedicated, NR_CellGroupConfig_t *secondaryCellGroup, + NR_UE_NR_Capability_t *uecap, int scg_id, int servCellIndex, int dl_antenna_ports, @@ -90,6 +91,7 @@ void fill_default_reconfig(NR_ServingCellConfigCommon_t *servingcellconfigcommon NR_ServingCellConfig_t *servingcellconfigdedicated, NR_RRCReconfiguration_IEs_t *reconfig, NR_CellGroupConfig_t *secondaryCellGroup, + NR_UE_NR_Capability_t *uecap, int dl_antenna_ports, int minRXTXTIMEpdsch, int do_csirs, diff --git a/openair2/RRC/NR/rrc_gNB.c b/openair2/RRC/NR/rrc_gNB.c index 9562d671e6..8a9d4cf566 100755 --- a/openair2/RRC/NR/rrc_gNB.c +++ b/openair2/RRC/NR/rrc_gNB.c @@ -777,6 +777,8 @@ rrc_gNB_generate_defaultRRCReconfiguration( NULL, dedicatedNAS_MessageList, NULL, + NULL, + NULL, NULL); free(ue_context_pP->ue_context.nas_pdu.buffer); @@ -1046,6 +1048,8 @@ rrc_gNB_generate_dedicatedRRCReconfiguration( NULL, NULL, dedicatedNAS_MessageList, + ue_context_pP, + &rrc->carrier, NULL, cellGroupConfig); LOG_DUMPMSG(NR_RRC,DEBUG_RRC,(char *)buffer,size,"[MSG] RRC Reconfiguration\n"); @@ -1155,6 +1159,8 @@ rrc_gNB_generate_dedicatedRRCReconfiguration_release( NULL, dedicatedNAS_MessageList, NULL, + NULL, + NULL, NULL); ue_context_pP->ue_context.pdu_session_release_command_flag = 1; @@ -1680,6 +1686,8 @@ rrc_gNB_process_RRCConnectionReestablishmentComplete( NULL, // MeasObj_list, NULL, NULL, + NULL, + NULL, NULL); LOG_DUMPMSG(NR_RRC,DEBUG_RRC,(char *)buffer,size, "[MSG] RRC Reconfiguration\n"); diff --git a/openair2/RRC/NR/rrc_gNB_nsa.c b/openair2/RRC/NR/rrc_gNB_nsa.c index 643a2eb506..174f6aec99 100644 --- a/openair2/RRC/NR/rrc_gNB_nsa.c +++ b/openair2/RRC/NR/rrc_gNB_nsa.c @@ -262,6 +262,7 @@ void rrc_add_nsa_user(gNB_RRC_INST *rrc,struct rrc_gNB_ue_context_s *ue_context_ ue_context_p->ue_context.spCellConfig->spCellConfigDedicated, reconfig_ies, ue_context_p->ue_context.secondaryCellGroup, + ue_context_p->ue_context.UE_Capability_nr, carrier->pdsch_AntennaPorts, carrier->minRXTXTIME, carrier->do_CSIRS, @@ -272,6 +273,7 @@ void rrc_add_nsa_user(gNB_RRC_INST *rrc,struct rrc_gNB_ue_context_s *ue_context_ NULL, reconfig_ies, ue_context_p->ue_context.secondaryCellGroup, + ue_context_p->ue_context.UE_Capability_nr, carrier->pdsch_AntennaPorts, carrier->minRXTXTIME, carrier->do_CSIRS, diff --git a/openair2/RRC/NR/rrc_gNB_reconfig.c b/openair2/RRC/NR/rrc_gNB_reconfig.c index 9329ff17ac..39d02df73e 100644 --- a/openair2/RRC/NR/rrc_gNB_reconfig.c +++ b/openair2/RRC/NR/rrc_gNB_reconfig.c @@ -52,6 +52,7 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellconfigcommon, NR_ServingCellConfig_t *servingcellconfigdedicated, NR_CellGroupConfig_t *secondaryCellGroup, + NR_UE_NR_Capability_t *uecap, int scg_id, int servCellIndex, int dl_antenna_ports, @@ -1333,6 +1334,7 @@ void fill_default_reconfig(NR_ServingCellConfigCommon_t *servingcellconfigcommon NR_ServingCellConfig_t *servingcellconfigdedicated, NR_RRCReconfiguration_IEs_t *reconfig, NR_CellGroupConfig_t *secondaryCellGroup, + NR_UE_NR_Capability_t *uecap, int dl_antenna_ports, int minRXTXTIME, int do_csirs, @@ -1347,6 +1349,7 @@ void fill_default_reconfig(NR_ServingCellConfigCommon_t *servingcellconfigcommon fill_default_secondaryCellGroup(servingcellconfigcommon, servingcellconfigdedicated, secondaryCellGroup, + uecap, 1, 1, dl_antenna_ports, From a8d5595272ea304fe85324cadbba11de14d2c26b Mon Sep 17 00:00:00 2001 From: francescomani Date: Wed, 22 Dec 2021 13:58:32 +0100 Subject: [PATCH 11/96] calling set mcs table function --- cmake_targets/CMakeLists.txt | 1 + openair2/RRC/NR/MESSAGES/asn1_msg.c | 6 ++++++ openair2/RRC/NR/rrc_gNB_reconfig.c | 29 ++--------------------------- 3 files changed, 9 insertions(+), 27 deletions(-) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 6e960cce23..d3215de430 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -2097,6 +2097,7 @@ set(NR_L2_SRC_UE ${NR_SDAP_SRC} ${NR_UE_RRC_DIR}/L2_interface_ue.c ${NR_UE_RRC_DIR}/main_ue.c + ${NR_RRC_DIR}/nr_rrc_config.c ${NR_UE_RRC_DIR}/rrc_UE.c ) diff --git a/openair2/RRC/NR/MESSAGES/asn1_msg.c b/openair2/RRC/NR/MESSAGES/asn1_msg.c index cad40cd05a..8ad62c5fb2 100755 --- a/openair2/RRC/NR/MESSAGES/asn1_msg.c +++ b/openair2/RRC/NR/MESSAGES/asn1_msg.c @@ -1412,6 +1412,12 @@ void update_cellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig, rrc_gNB_carrier_data_t *carrier, NR_UE_NR_Capability_t *uecap) { + NR_SpCellConfig_t *SpCellConfig = cellGroupConfig->spCellConfig; + struct NR_ServingCellConfig__downlinkBWP_ToAddModList *DL_BWP_list = SpCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList; + for (int i=0; ilist.count; i++){ + NR_BWP_Downlink_t *bwp = DL_BWP_list->list.array[i]; + set_dl_mcs_table(bwp, carrier->servingcellconfigcommon, uecap); + } } void fill_initial_cellGroupConfig(rnti_t rnti, diff --git a/openair2/RRC/NR/rrc_gNB_reconfig.c b/openair2/RRC/NR/rrc_gNB_reconfig.c index 39d02df73e..cba56b116d 100644 --- a/openair2/RRC/NR/rrc_gNB_reconfig.c +++ b/openair2/RRC/NR/rrc_gNB_reconfig.c @@ -45,6 +45,7 @@ #include "SIMULATION/TOOLS/sim.h" #include "executables/softmodem-common.h" #include "LAYER2/nr_rlc/nr_rlc_oai_api.h" +#include "nr_rrc_config.h" #define false 0 #define true 1 @@ -593,33 +594,7 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco bwp->bwp_Dedicated->pdsch_Config->choice.setup->rateMatchPatternGroup1=NULL; bwp->bwp_Dedicated->pdsch_Config->choice.setup->rateMatchPatternGroup2=NULL; bwp->bwp_Dedicated->pdsch_Config->choice.setup->rbg_Size=NR_PDSCH_Config__rbg_Size_config1; - bwp->bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table=NULL; - bwp->bwp_Dedicated->pdsch_Config->choice.setup->maxNrofCodeWordsScheduledByDCI = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->maxNrofCodeWordsScheduledByDCI)); - *bwp->bwp_Dedicated->pdsch_Config->choice.setup->maxNrofCodeWordsScheduledByDCI = NR_PDSCH_Config__maxNrofCodeWordsScheduledByDCI_n1; - bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.present = NR_PDSCH_Config__prb_BundlingType_PR_staticBundling; - bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling)); - bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling->bundleSize = - calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling->bundleSize)); - *bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling->bundleSize = NR_PDSCH_Config__prb_BundlingType__staticBundling__bundleSize_wideband; - bwp->bwp_Dedicated->pdsch_Config->choice.setup->zp_CSI_RS_ResourceToAddModList=NULL; - bwp->bwp_Dedicated->pdsch_Config->choice.setup->zp_CSI_RS_ResourceToReleaseList=NULL; - bwp->bwp_Dedicated->pdsch_Config->choice.setup->aperiodic_ZP_CSI_RS_ResourceSetsToAddModList=NULL; - bwp->bwp_Dedicated->pdsch_Config->choice.setup->aperiodic_ZP_CSI_RS_ResourceSetsToReleaseList=NULL; - bwp->bwp_Dedicated->pdsch_Config->choice.setup->sp_ZP_CSI_RS_ResourceSetsToAddModList=NULL; - bwp->bwp_Dedicated->pdsch_Config->choice.setup->sp_ZP_CSI_RS_ResourceSetsToReleaseList=NULL; - bwp->bwp_Dedicated->pdsch_Config->choice.setup->p_ZP_CSI_RS_ResourceSet=NULL; - - bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToReleaseList=NULL; - bwp->bwp_Dedicated->pdsch_Config->choice.setup->vrb_ToPRB_Interleaver=NULL; - bwp->bwp_Dedicated->pdsch_Config->choice.setup->resourceAllocation=NR_PDSCH_Config__resourceAllocation_resourceAllocationType1; - bwp->bwp_Dedicated->pdsch_Config->choice.setup->pdsch_TimeDomainAllocationList=NULL; - bwp->bwp_Dedicated->pdsch_Config->choice.setup->pdsch_AggregationFactor=NULL; - bwp->bwp_Dedicated->pdsch_Config->choice.setup->rateMatchPatternToAddModList=NULL; - bwp->bwp_Dedicated->pdsch_Config->choice.setup->rateMatchPatternToReleaseList=NULL; - bwp->bwp_Dedicated->pdsch_Config->choice.setup->rateMatchPatternGroup1=NULL; - bwp->bwp_Dedicated->pdsch_Config->choice.setup->rateMatchPatternGroup2=NULL; - bwp->bwp_Dedicated->pdsch_Config->choice.setup->rbg_Size=NR_PDSCH_Config__rbg_Size_config1; - bwp->bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table=NULL; + set_dl_mcs_table(bwp, servingcellconfigcommon, uecap); bwp->bwp_Dedicated->pdsch_Config->choice.setup->maxNrofCodeWordsScheduledByDCI = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->maxNrofCodeWordsScheduledByDCI)); *bwp->bwp_Dedicated->pdsch_Config->choice.setup->maxNrofCodeWordsScheduledByDCI = NR_PDSCH_Config__maxNrofCodeWordsScheduledByDCI_n1; bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.present = NR_PDSCH_Config__prb_BundlingType_PR_staticBundling; From a33457aa62ce61d4f2b989ca7ce9ce5eda382cdf Mon Sep 17 00:00:00 2001 From: francescomani Date: Thu, 23 Dec 2021 14:27:49 +0100 Subject: [PATCH 12/96] fix in allocation of mcs_table in bwp structure --- openair2/RRC/NR/nr_rrc_config.c | 9 ++++----- openair2/RRC/NR/rrc_gNB.c | 21 --------------------- openair2/RRC/NR/rrc_gNB_reconfig.c | 2 +- 3 files changed, 5 insertions(+), 27 deletions(-) diff --git a/openair2/RRC/NR/nr_rrc_config.c b/openair2/RRC/NR/nr_rrc_config.c index 73f91622f5..8ba2ecfcbe 100644 --- a/openair2/RRC/NR/nr_rrc_config.c +++ b/openair2/RRC/NR/nr_rrc_config.c @@ -155,13 +155,12 @@ void set_dl_mcs_table(NR_BWP_Downlink_t *bwp, NR_ServingCellConfigCommon_t *scc, } } if (supported && (supported_mo == NR_ModulationOrder_qam256)) { - long *mcs_Table = bwp->bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table; - if(mcs_Table == NULL) - mcs_Table = calloc(1, sizeof(*mcs_Table)); - *mcs_Table = NR_PDSCH_Config__mcs_Table_qam256; + if(bwp->bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table == NULL) + bwp->bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table = calloc(1, sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table)); + *bwp->bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table = NR_PDSCH_Config__mcs_Table_qam256; } else - bwp->bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table = NULL; + bwp->bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table = NULL; } diff --git a/openair2/RRC/NR/rrc_gNB.c b/openair2/RRC/NR/rrc_gNB.c index 8a9d4cf566..5334c748f3 100755 --- a/openair2/RRC/NR/rrc_gNB.c +++ b/openair2/RRC/NR/rrc_gNB.c @@ -2899,27 +2899,6 @@ unsigned int get_ul_bw_mask(gNB_RRC_INST *rrc,NR_UE_NR_Capability_t *cap) { return(0); } -int is_ul_256QAM_supported(gNB_RRC_INST *rrc,NR_UE_NR_Capability_t *cap) { - int common_band = *rrc->carrier.servingcellconfigcommon->uplinkConfigCommon->frequencyInfoUL->frequencyBandList->list.array[0]; - int common_scs = rrc->carrier.servingcellconfigcommon->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing; - for (int i=0;irf_Parameters.supportedBandListNR.list.count;i++) { - NR_BandNR_t *bandNRinfo = cap->rf_Parameters.supportedBandListNR.list.array[i]; - if (bandNRinfo->bandNR == common_band && !bandNRinfo->pusch_256QAM) return (0); - } - - // check featureSet - NR_FeatureSets_t *fs=cap->featureSets; - if (fs) { - // go through UL feature sets and look for one with current SCS - for (int i=0;ifeatureSetsUplinkPerCC->list.count;i++) { - if (fs->featureSetsUplinkPerCC->list.array[i]->supportedSubcarrierSpacingUL == common_scs && - fs->featureSetsUplinkPerCC->list.array[i]->supportedModulationOrderUL && - *fs->featureSetsUplinkPerCC->list.array[i]->supportedModulationOrderUL == NR_ModulationOrder_qam256) return(1); - } - } - return(0); -} - int get_ul_mimo_layersCB(gNB_RRC_INST *rrc,NR_UE_NR_Capability_t *cap) { int common_scs = rrc->carrier.servingcellconfigcommon->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing; diff --git a/openair2/RRC/NR/rrc_gNB_reconfig.c b/openair2/RRC/NR/rrc_gNB_reconfig.c index cba56b116d..3b013ac88b 100644 --- a/openair2/RRC/NR/rrc_gNB_reconfig.c +++ b/openair2/RRC/NR/rrc_gNB_reconfig.c @@ -697,8 +697,8 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco pusch_Config->pusch_TimeDomainAllocationList = NULL; pusch_Config->pusch_AggregationFactor=NULL; pusch_Config->mcs_Table=NULL; - pusch_Config->mcs_TableTransformPrecoder=NULL; pusch_Config->transformPrecoder= NULL; + pusch_Config->mcs_TableTransformPrecoder=NULL; /* if msg3_transformprecoding is set in conf file - pusch config should not disable it */ if (servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->msg3_transformPrecoder == NULL) { pusch_Config->transformPrecoder=calloc(1,sizeof(*pusch_Config->transformPrecoder)); From 62e540e6e66a025e46af1669dad0bb043b6264ba Mon Sep 17 00:00:00 2001 From: francescomani Date: Thu, 23 Dec 2021 14:47:41 +0100 Subject: [PATCH 13/96] fix in case uecap is null --- openair2/RRC/NR/nr_rrc_config.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/openair2/RRC/NR/nr_rrc_config.c b/openair2/RRC/NR/nr_rrc_config.c index 8ba2ecfcbe..c77d245af3 100644 --- a/openair2/RRC/NR/nr_rrc_config.c +++ b/openair2/RRC/NR/nr_rrc_config.c @@ -103,6 +103,11 @@ void nr_rrc_config_ul_tda(NR_ServingCellConfigCommon_t *scc, int min_fb_delay){ void set_dl_mcs_table(NR_BWP_Downlink_t *bwp, NR_ServingCellConfigCommon_t *scc, NR_UE_NR_Capability_t *cap) { + if (cap == NULL){ + bwp->bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table = NULL; + return; + } + int band = *scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0]; int scs = bwp->bwp_Common->genericParameters.subcarrierSpacing; struct NR_FrequencyInfoDL__scs_SpecificCarrierList scs_list = scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList; From 3a78c66e00ccd650ab44470b0179a1a17bbbfa23 Mon Sep 17 00:00:00 2001 From: francescomani Date: Tue, 28 Dec 2021 10:40:19 +0100 Subject: [PATCH 14/96] add 256qam test case to dlsim --- cmake_targets/autotests/test_case_list.xml | 30 ++++++++------- openair1/SIMULATION/NR_PHY/dlsim.c | 18 +++++++-- openair2/RRC/NR/nr_rrc_config.c | 44 ++++++++++++++++++++++ openair2/RRC/NR/nr_rrc_config.h | 5 +++ 4 files changed, 79 insertions(+), 18 deletions(-) diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml index 3472b14efc..19421a97ab 100755 --- a/cmake_targets/autotests/test_case_list.xml +++ b/cmake_targets/autotests/test_case_list.xml @@ -1093,17 +1093,18 @@ (Test8: 217 PRB 100 PDSCH-PRBs 110 PDSCH-Offset), (Test9: 106 PRBs 50 PDSCH-PRBs MCS Index 27), (Test10: 106 PRBs 50 PDSCH-PRBs MCS Index 16), - (Test11: HARQ test 25% TP (4 rounds), - (Test12: HARQ test 33% TP (3 rounds), - (Test13: HARQ test 50% TP (2 rounds), - (Test14: 3 PTRS, 8 Interpolated Symbols), - (Test15: 6 PTRS, 5 Interpolated Symbols), - (Test16: 11 PTRS, 0 Interpolated Symbols), - (Test17: Mapping type A, 2 DMRS Symbols), - (Test18: Mapping type A, 3 DMRS Symbols), - (Test19: Mapping type B, 4 DMRS Symbols), - (Test20: 4x4 MIMO, 1 Layer), - (Test21: 4x4 MIMO, 2 Layers) + (Test11: 106 MCS-TABLE 256 QAM MCS Index 26), + (Test12: HARQ test 25% TP (4 rounds), + (Test13: HARQ test 33% TP (3 rounds), + (Test14: HARQ test 50% TP (2 rounds), + (Test15: 3 PTRS, 8 Interpolated Symbols), + (Test16: 6 PTRS, 5 Interpolated Symbols), + (Test17: 11 PTRS, 0 Interpolated Symbols), + (Test18: Mapping type A, 2 DMRS Symbols), + (Test19: Mapping type A, 3 DMRS Symbols), + (Test20: Mapping type B, 4 DMRS Symbols), + (Test21: 4x4 MIMO, 1 Layer), + (Test22: 4x4 MIMO, 2 Layers) $OPENAIR_DIR/cmake_targets/build_oai --phy_simulators -c @@ -1118,8 +1119,9 @@ -n100 -R217 -b100 -s5 -n100 -R217 -a80 -s5 -n100 -R217 -a110 -s5 -b100 - -n100 -e27 -s30 - -n100 -e16 -s10 + -n100 -e27 -s30 + -n100 -e16 -s10 + -n100 -q1 -e26 -s30 -n100 -s1 -t25 -n100 -s1 -t33 -n100 -s1 -t50 @@ -1131,7 +1133,7 @@ -n100 -s2 -U 2 1 3 -n10 -s20 -U 3 0 0 2 -gR -x1 -y4 -z4 -n10 -s20 -U 3 0 0 2 -gR -x2 -y4 -z4 - nr_dlsim.test1 nr_dlsim.test2 nr_dlsim.test3 nr_dlsim.test4 nr_dlsim.test5 nr_dlsim.test6 nr_dlsim.test7 nr_dlsim.test8 nr_dlsim.test9 nr_dlsim.test10 nr_dlsim.test11 nr_dlsim.test12 nr_dlsim.test13 nr_dlsim.test14 nr_dlsim.test15 nr_dlsim.test16 nr_dlsim.test17 nr_dlsim.test18 nr_dlsim.test19 nr_dlsim.test20 nr_dlsim.test21 + nr_dlsim.test1 nr_dlsim.test2 nr_dlsim.test3 nr_dlsim.test4 nr_dlsim.test5 nr_dlsim.test6 nr_dlsim.test7 nr_dlsim.test8 nr_dlsim.test9 nr_dlsim.test10 nr_dlsim.test11 nr_dlsim.test12 nr_dlsim.test13 nr_dlsim.test14 nr_dlsim.test15 nr_dlsim.test16 nr_dlsim.test17 nr_dlsim.test18 nr_dlsim.test19 nr_dlsim.test20 nr_dlsim.test21 nr_dlsim.test22 PDSCH test OK segmentation fault|assertion|exiting|fatal 3 diff --git a/openair1/SIMULATION/NR_PHY/dlsim.c b/openair1/SIMULATION/NR_PHY/dlsim.c index 32a05f060a..c1c8e2894c 100644 --- a/openair1/SIMULATION/NR_PHY/dlsim.c +++ b/openair1/SIMULATION/NR_PHY/dlsim.c @@ -431,7 +431,7 @@ int main(int argc, char **argv) FILE *scg_fd=NULL; - while ((c = getopt (argc, argv, "f:hA:pf:g:in:s:S:t:x:y:z:M:N:F:GR:dPIL:Ea:b:D:e:m:w:T:U:q")) != -1) { + while ((c = getopt (argc, argv, "f:hA:pf:g:in:s:S:t:x:y:z:M:N:F:GR:dPIL:Ea:b:D:e:q:m:w:T:U")) != -1) { switch (c) { case 'f': @@ -598,13 +598,19 @@ int main(int argc, char **argv) case 'b': g_rbSize = atoi(optarg); break; + case 'D': dlsch_threads = atoi(optarg); - break; + break; + case 'e': g_mcsIndex = atoi(optarg); break; + case 'q': + g_mcsTableIdx = atoi(optarg); + break; + case 'm': mu = atoi(optarg); break; @@ -660,6 +666,7 @@ int main(int argc, char **argv) printf("-c Start symbol for PDSCH (fixed for now)\n"); printf("-j Number of symbols for PDSCH (fixed for now)\n"); printf("-e MSC index\n"); + printf("-q MCS Table index\n"); printf("-t Acceptable effective throughput (in percentage)\n"); printf("-T Enable PTRS, arguments list L_PTRS{0,1,2} K_PTRS{2,4}, e.g. -T 2 0 2 \n"); printf("-U Change DMRS Config, arguments list DMRS TYPE{0=A,1=B} DMRS AddPos{0:2} DMRS ConfType{1:2}, e.g. -U 3 0 2 1 \n"); @@ -759,11 +766,14 @@ int main(int argc, char **argv) fill_scc_sim(rrc.carrier.servingcellconfigcommon,&ssb_bitmap,N_RB_DL,N_RB_DL,mu,mu); ssb_bitmap = 1;// Enable only first SSB with index ssb_indx=0 fix_scc(scc,ssb_bitmap); - prepare_scd(scd); + NR_UE_NR_Capability_t* UE_Capability_nr = CALLOC(1,sizeof(NR_UE_NR_Capability_t)); + prepare_sim_uecap(UE_Capability_nr,scc,mu, + N_RB_DL,g_mcsTableIdx); + // TODO do a UECAP for phy-sim - fill_default_secondaryCellGroup(scc, scd, secondaryCellGroup, NULL, 0, 1, n_tx, 6, 0, 0, 0); + fill_default_secondaryCellGroup(scc, scd, secondaryCellGroup, UE_Capability_nr, 0, 1, n_tx, 6, 0, 0, 0); /* RRC parameter validation for secondaryCellGroup */ fix_scd(scd); diff --git a/openair2/RRC/NR/nr_rrc_config.c b/openair2/RRC/NR/nr_rrc_config.c index c77d245af3..97c801b352 100644 --- a/openair2/RRC/NR/nr_rrc_config.c +++ b/openair2/RRC/NR/nr_rrc_config.c @@ -31,6 +31,50 @@ #include "nr_rrc_config.h" #include "common/utils/nr/nr_common.h" +void prepare_sim_uecap(NR_UE_NR_Capability_t *cap, + NR_ServingCellConfigCommon_t *scc, + int numerology, + int rbsize, + int mcs_table) { + + int band = *scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0]; + NR_BandNR_t *nr_bandnr = CALLOC(1,sizeof(NR_BandNR_t)); + nr_bandnr->bandNR = band; + ASN_SEQUENCE_ADD(&cap->rf_Parameters.supportedBandListNR.list, + nr_bandnr); + if (mcs_table == 1) { + int bw = get_supported_band_index(numerology, band, rbsize); + if (band>256) { + NR_BandNR_t *bandNRinfo = cap->rf_Parameters.supportedBandListNR.list.array[0]; + bandNRinfo->pdsch_256QAM_FR2 = CALLOC(1,sizeof(*bandNRinfo->pdsch_256QAM_FR2)); + *bandNRinfo->pdsch_256QAM_FR2 = NR_BandNR__pdsch_256QAM_FR2_supported; + } + else{ + cap->phy_Parameters.phy_ParametersFR1 = CALLOC(1,sizeof(*cap->phy_Parameters.phy_ParametersFR1)); + NR_Phy_ParametersFR1_t *phy_fr1 = cap->phy_Parameters.phy_ParametersFR1; + phy_fr1->pdsch_256QAM_FR1 = CALLOC(1,sizeof(*phy_fr1->pdsch_256QAM_FR1)); + *phy_fr1->pdsch_256QAM_FR1 = NR_Phy_ParametersFR1__pdsch_256QAM_FR1_supported; + } + cap->featureSets = CALLOC(1,sizeof(*cap->featureSets)); + NR_FeatureSets_t *fs=cap->featureSets; + fs->featureSetsDownlinkPerCC = CALLOC(1,sizeof(*fs->featureSetsDownlinkPerCC)); + NR_FeatureSetDownlinkPerCC_t *fs_cc = CALLOC(1,sizeof(NR_FeatureSetDownlinkPerCC_t)); + fs_cc->supportedSubcarrierSpacingDL = numerology; + if(band>256) { + fs_cc->supportedBandwidthDL.present = NR_SupportedBandwidth_PR_fr2; + fs_cc->supportedBandwidthDL.choice.fr2 = bw; + } + else{ + fs_cc->supportedBandwidthDL.present = NR_SupportedBandwidth_PR_fr1; + fs_cc->supportedBandwidthDL.choice.fr1 = bw; + } + fs_cc->supportedModulationOrderDL = CALLOC(1,sizeof(*fs_cc->supportedModulationOrderDL)); + *fs_cc->supportedModulationOrderDL = NR_ModulationOrder_qam256; + ASN_SEQUENCE_ADD(&fs->featureSetsDownlinkPerCC->list, + fs_cc); + } +} + void nr_rrc_config_dl_tda(NR_ServingCellConfigCommon_t *scc){ lte_frame_type_t frame_type = get_frame_type(*scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0], *scc->ssbSubcarrierSpacing); diff --git a/openair2/RRC/NR/nr_rrc_config.h b/openair2/RRC/NR/nr_rrc_config.h index 7daf08b547..e8a2ab4518 100644 --- a/openair2/RRC/NR/nr_rrc_config.h +++ b/openair2/RRC/NR/nr_rrc_config.h @@ -114,6 +114,11 @@ typedef struct physicalcellgroup_s{ void nr_rrc_config_dl_tda(NR_ServingCellConfigCommon_t *scc); void nr_rrc_config_ul_tda(NR_ServingCellConfigCommon_t *scc, int min_fb_delay); void set_dl_mcs_table(NR_BWP_Downlink_t *bwp, NR_ServingCellConfigCommon_t *scc, NR_UE_NR_Capability_t *cap); +void prepare_sim_uecap(NR_UE_NR_Capability_t *cap, + NR_ServingCellConfigCommon_t *scc, + int numerology, + int rbsize, + int mcs_table); #endif From c4f88781e56437f49e6927cf3c7fa5bb1bd67580 Mon Sep 17 00:00:00 2001 From: Laurent THOMAS Date: Mon, 24 Jan 2022 14:19:31 +0100 Subject: [PATCH 15/96] ue sync, assert in wrong PUCCH decoded values --- openair1/SCHED/phy_procedures_lte_eNb.c | 130 ++++++++++++++---------- targets/RT/USER/lte-ue.c | 12 ++- 2 files changed, 88 insertions(+), 54 deletions(-) diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index 569d2a464a..3d655bc464 100644 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -1939,6 +1939,8 @@ void fill_ulsch_harq_indication (PHY_VARS_eNB *eNB, LTE_UL_eNB_HARQ_t *ulsch_har pthread_mutex_unlock(&eNB->UL_INFO_mutex); } +#define packetError(ConD, fmt, args...) if (!(ConD)) { LOG_E(PHY, fmt, args); discard=true; } + void fill_uci_harq_indication (int UEid, PHY_VARS_eNB *eNB, LTE_eNB_UCI *uci, int frame, int subframe, uint8_t *harq_ack, uint8_t tdd_mapping_mode, uint16_t tdd_multiplexing_mask) { if ( split73 == SPLIT73_DU ) { sendFs6Ulharq(fs6ULindicationHarq, UEid, eNB, uci, frame, subframe, harq_ack, tdd_mapping_mode, tdd_multiplexing_mask, 0, 0); @@ -1954,6 +1956,7 @@ void fill_uci_harq_indication (int UEid, PHY_VARS_eNB *eNB, LTE_eNB_UCI *uci, in } pthread_mutex_lock(&eNB->UL_INFO_mutex); + bool discard=false; nfapi_harq_indication_t *ind = &eNB->UL_INFO.harq_ind; nfapi_harq_indication_body_t *body = &ind->harq_indication_body; assert(eNB->UL_INFO.harq_ind.harq_indication_body.number_of_harqs <= NFAPI_HARQ_IND_MAX_PDU); @@ -1986,73 +1989,87 @@ void fill_uci_harq_indication (int UEid, PHY_VARS_eNB *eNB, LTE_eNB_UCI *uci, in pdu->harq_indication_fdd_rel13.tl.tag = NFAPI_HARQ_INDICATION_FDD_REL13_TAG; pdu->harq_indication_fdd_rel13.mode = 0; pdu->harq_indication_fdd_rel13.number_of_ack_nack = 1; - AssertFatal (harq_ack[0] == 1 || harq_ack[0] == 2 || harq_ack[0] == 4, "harq_ack[0] is %d, should be 1,2 or 4\n", harq_ack[0]); - pdu->harq_indication_fdd_rel13.harq_tb_n[0] = harq_ack[0]; - // release DLSCH if needed - release_harq(eNB,DLSCH_id,0,frame,subframe,0xffff, harq_ack[0] == 1); + packetError (harq_ack[0] == 1 || harq_ack[0] == 2 || harq_ack[0] == 4, "harq_ack[0] is %d, should be 1,2 or 4\n", harq_ack[0]); + if (!discard) { + pdu->harq_indication_fdd_rel13.harq_tb_n[0] = harq_ack[0]; + // release DLSCH if needed + release_harq(eNB,DLSCH_id,0,frame,subframe,0xffff, harq_ack[0] == 1); + } } else if (uci->pucch_fmt == pucch_format1b) { pdu->harq_indication_fdd_rel13.tl.tag = NFAPI_HARQ_INDICATION_FDD_REL13_TAG; pdu->harq_indication_fdd_rel13.mode = 0; pdu->harq_indication_fdd_rel13.number_of_ack_nack = 2; - AssertFatal (harq_ack[0] == 1 || harq_ack[0] == 2 || harq_ack[1] == 4, "harq_ack[0] is %d, should be 0,1 or 4\n", harq_ack[0]); - AssertFatal (harq_ack[1] == 1 || harq_ack[1] == 2 || harq_ack[1] == 4, "harq_ack[1] is %d, should be 0,1 or 4\n", harq_ack[1]); - pdu->harq_indication_fdd_rel13.harq_tb_n[0] = harq_ack[0]; - pdu->harq_indication_fdd_rel13.harq_tb_n[1] = harq_ack[1]; - // release DLSCH if needed - release_harq(eNB,DLSCH_id,0,frame,subframe,0xffff, harq_ack[0] == 1); - release_harq(eNB,DLSCH_id,1,frame,subframe,0xffff, harq_ack[1] == 1); - } else AssertFatal(1==0,"only format 1a/b for now, received %d\n",uci->pucch_fmt); + packetError (harq_ack[0] == 1 || harq_ack[0] == 2 || harq_ack[1] == 4, "harq_ack[0] is %d, should be 0,1 or 4\n", harq_ack[0]); + packetError (harq_ack[1] == 1 || harq_ack[1] == 2 || harq_ack[1] == 4, "harq_ack[1] is %d, should be 0,1 or 4\n", harq_ack[1]); + if (!discard) { + pdu->harq_indication_fdd_rel13.harq_tb_n[0] = harq_ack[0]; + pdu->harq_indication_fdd_rel13.harq_tb_n[1] = harq_ack[1]; + // release DLSCH if needed + release_harq(eNB,DLSCH_id,0,frame,subframe,0xffff, harq_ack[0] == 1); + release_harq(eNB,DLSCH_id,1,frame,subframe,0xffff, harq_ack[1] == 1); + } + } else + packetError(1==0,"only format 1a/b for now, received %d\n",uci->pucch_fmt); } else { // TDD - AssertFatal (tdd_mapping_mode == 0 || tdd_mapping_mode == 1 || tdd_mapping_mode == 2, "Illegal tdd_mapping_mode %d\n", tdd_mapping_mode); - pdu->harq_indication_tdd_rel13.tl.tag = NFAPI_HARQ_INDICATION_TDD_REL13_TAG; - pdu->harq_indication_tdd_rel13.mode = tdd_mapping_mode; - LOG_D(PHY,"%s(eNB, uci_harq format %d, rnti:%04x, frame:%d, subframe:%d, tdd_mapping_mode:%d) harq_ack[0]:%d harq_ack[1]:%d\n", __FUNCTION__, uci->pucch_fmt,uci->rnti, frame, subframe, - tdd_mapping_mode,harq_ack[0],harq_ack[1]); + packetError (tdd_mapping_mode == 0 || tdd_mapping_mode == 1 || tdd_mapping_mode == 2, "Illegal tdd_mapping_mode %d\n", tdd_mapping_mode); + if (!discard) { + pdu->harq_indication_tdd_rel13.tl.tag = NFAPI_HARQ_INDICATION_TDD_REL13_TAG; + pdu->harq_indication_tdd_rel13.mode = tdd_mapping_mode; + LOG_D(PHY,"%s(eNB, uci_harq format %d, rnti:%04x, frame:%d, subframe:%d, tdd_mapping_mode:%d) harq_ack[0]:%d harq_ack[1]:%d\n", __FUNCTION__, uci->pucch_fmt,uci->rnti, frame, subframe, + tdd_mapping_mode,harq_ack[0],harq_ack[1]); - switch (tdd_mapping_mode) { + switch (tdd_mapping_mode) { case 0: // bundling if (uci->pucch_fmt == pucch_format1a) { pdu->harq_indication_tdd_rel13.tl.tag = NFAPI_HARQ_INDICATION_TDD_REL13_TAG; pdu->harq_indication_tdd_rel13.number_of_ack_nack = 1; LOG_D(PHY,"bundling, pucch1a, number of ack nack %d\n",pdu->harq_indication_tdd_rel13.number_of_ack_nack); - AssertFatal(harq_ack[0] == 1 || harq_ack[0] == 2 || harq_ack[0] == 4, "harq_ack[0] is %d, should be 1,2 or 4\n",harq_ack[0]); - pdu->harq_indication_tdd_rel13.harq_data[0].bundling.value_0 = harq_ack[0]; - // release all bundled DLSCH if needed - release_harq(eNB,DLSCH_id,0,frame,subframe,0xffff, harq_ack[0] == 1); + packetError(harq_ack[0] == 1 || harq_ack[0] == 2 || harq_ack[0] == 4, "harq_ack[0] is %d, should be 1,2 or 4\n",harq_ack[0]); + if (!discard) { + pdu->harq_indication_tdd_rel13.harq_data[0].bundling.value_0 = harq_ack[0]; + // release all bundled DLSCH if needed + release_harq(eNB,DLSCH_id,0,frame,subframe,0xffff, harq_ack[0] == 1); + } } else if (uci->pucch_fmt == pucch_format1b) { pdu->harq_indication_tdd_rel13.number_of_ack_nack = 2; - AssertFatal(harq_ack[0] == 1 || harq_ack[0] == 2 || harq_ack[1] == 4, "harq_ack[0] is %d, should be 0,1 or 4\n",harq_ack[0]); - AssertFatal(harq_ack[1] == 1 || harq_ack[1] == 2 || harq_ack[1] == 4, "harq_ack[1] is %d, should be 0,1 or 4\n",harq_ack[1]); - pdu->harq_indication_tdd_rel13.tl.tag = NFAPI_HARQ_INDICATION_TDD_REL13_TAG; - pdu->harq_indication_tdd_rel13.harq_data[0].bundling.value_0 = harq_ack[0]; - pdu->harq_indication_tdd_rel13.harq_data[1].bundling.value_0 = harq_ack[1]; - // release all DLSCH if needed - release_harq(eNB,DLSCH_id,0,frame,subframe,0xffff, harq_ack[0] == 1); - release_harq(eNB,DLSCH_id,1,frame,subframe,0xffff, harq_ack[1] == 1); + packetError(harq_ack[0] == 1 || harq_ack[0] == 2 || harq_ack[1] == 4, "harq_ack[0] is %d, should be 0,1 or 4\n",harq_ack[0]); + packetError(harq_ack[1] == 1 || harq_ack[1] == 2 || harq_ack[1] == 4, "harq_ack[1] is %d, should be 0,1 or 4\n",harq_ack[1]); + if (!discard) { + pdu->harq_indication_tdd_rel13.tl.tag = NFAPI_HARQ_INDICATION_TDD_REL13_TAG; + pdu->harq_indication_tdd_rel13.harq_data[0].bundling.value_0 = harq_ack[0]; + pdu->harq_indication_tdd_rel13.harq_data[1].bundling.value_0 = harq_ack[1]; + // release all DLSCH if needed + release_harq(eNB,DLSCH_id,0,frame,subframe,0xffff, harq_ack[0] == 1); + release_harq(eNB,DLSCH_id,1,frame,subframe,0xffff, harq_ack[1] == 1); + } } break; case 1: // multiplexing - AssertFatal (uci->pucch_fmt == pucch_format1b, "uci->pucch_format %d is not format1b\n", uci->pucch_fmt); - - if (uci->num_pucch_resources == 1 && uci->pucch_fmt == pucch_format1a) { - pdu->harq_indication_tdd_rel13.tl.tag = NFAPI_HARQ_INDICATION_TDD_REL13_TAG; - pdu->harq_indication_tdd_rel13.number_of_ack_nack = 1; - AssertFatal(harq_ack[0] == 1 || harq_ack[0] == 2 || harq_ack[0] == 4, "harq_ack[0] is %d, should be 1,2 or 4\n",harq_ack[0]); - pdu->harq_indication_tdd_rel13.harq_data[0].multiplex.value_0 = harq_ack[0]; - // release all DLSCH if needed - release_harq(eNB,DLSCH_id,0,frame,subframe,0xffff, harq_ack[0] == 1); + packetError (uci->pucch_fmt == pucch_format1b, "uci->pucch_format %d is not format1b\n", uci->pucch_fmt); + if (!discard) { + if (uci->num_pucch_resources == 1 && uci->pucch_fmt == pucch_format1a) { + pdu->harq_indication_tdd_rel13.tl.tag = NFAPI_HARQ_INDICATION_TDD_REL13_TAG; + pdu->harq_indication_tdd_rel13.number_of_ack_nack = 1; + packetError(harq_ack[0] == 1 || harq_ack[0] == 2 || harq_ack[0] == 4, "harq_ack[0] is %d, should be 1,2 or 4\n",harq_ack[0]); + if (!discard) { + pdu->harq_indication_tdd_rel13.harq_data[0].multiplex.value_0 = harq_ack[0]; + // release all DLSCH if needed + release_harq(eNB,DLSCH_id,0,frame,subframe,0xffff, harq_ack[0] == 1); + } } else if (uci->num_pucch_resources == 1 && uci->pucch_fmt == pucch_format1b) { - pdu->harq_indication_tdd_rel13.tl.tag = NFAPI_HARQ_INDICATION_TDD_REL13_TAG; - pdu->harq_indication_tdd_rel13.number_of_ack_nack = 2; - AssertFatal(harq_ack[0] == 1 || harq_ack[0] == 2 || harq_ack[1] == 4, "harq_ack[0] is %d, should be 0,1 or 4\n",harq_ack[0]); - AssertFatal(harq_ack[1] == 1 || harq_ack[1] == 2 || harq_ack[1] == 4, "harq_ack[1] is %d, should be 0,1 or 4\n",harq_ack[1]); - pdu->harq_indication_tdd_rel13.harq_data[0].multiplex.value_0 = harq_ack[0]; - pdu->harq_indication_tdd_rel13.harq_data[1].multiplex.value_0 = harq_ack[1]; - // release all DLSCH if needed - release_harq(eNB,DLSCH_id,0,frame,subframe,0xffff, harq_ack[0] == 1); - release_harq(eNB,DLSCH_id,1,frame,subframe,0xffff, harq_ack[1] == 1); + pdu->harq_indication_tdd_rel13.tl.tag = NFAPI_HARQ_INDICATION_TDD_REL13_TAG; + pdu->harq_indication_tdd_rel13.number_of_ack_nack = 2; + packetError(harq_ack[0] == 1 || harq_ack[0] == 2 || harq_ack[1] == 4, "harq_ack[0] is %d, should be 0,1 or 4\n",harq_ack[0]); + packetError(harq_ack[1] == 1 || harq_ack[1] == 2 || harq_ack[1] == 4, "harq_ack[1] is %d, should be 0,1 or 4\n",harq_ack[1]); + if (!discard) { + pdu->harq_indication_tdd_rel13.harq_data[0].multiplex.value_0 = harq_ack[0]; + pdu->harq_indication_tdd_rel13.harq_data[1].multiplex.value_0 = harq_ack[1]; + // release all DLSCH if needed + release_harq(eNB,DLSCH_id,0,frame,subframe,0xffff, harq_ack[0] == 1); + release_harq(eNB,DLSCH_id,1,frame,subframe,0xffff, harq_ack[1] == 1); + } } else { // num_pucch_resources (M) > 1 pdu->harq_indication_tdd_rel13.tl.tag = NFAPI_HARQ_INDICATION_TDD_REL13_TAG; pdu->harq_indication_tdd_rel13.number_of_ack_nack = uci->num_pucch_resources; @@ -2068,7 +2085,7 @@ void fill_uci_harq_indication (int UEid, PHY_VARS_eNB *eNB, LTE_eNB_UCI *uci, in release_harq(eNB,DLSCH_id,1,frame,subframe,tdd_multiplexing_mask, 1 /* force release? previous code was unconditional */); } - break; + break; case 2: // special bundling (SR collision) pdu->harq_indication_tdd_rel13.tl.tag = NFAPI_HARQ_INDICATION_TDD_REL13_TAG; @@ -2118,16 +2135,23 @@ void fill_uci_harq_indication (int UEid, PHY_VARS_eNB *eNB, LTE_eNB_UCI *uci, in } else { pdu->harq_indication_tdd_rel13.harq_data[0].bundling.value_0 = 0; } - + break; } break; + } + } } } //TDD - - eNB->UL_INFO.harq_ind.harq_indication_body.number_of_harqs++; - LOG_D(PHY,"Incremented eNB->UL_INFO.harq_ind.harq_indication_body.number_of_harqs:%d\n", eNB->UL_INFO.harq_ind.harq_indication_body.number_of_harqs); + + if (!discard) { + eNB->UL_INFO.harq_ind.harq_indication_body.number_of_harqs++; + LOG_D(PHY,"Incremented eNB->UL_INFO.harq_ind.harq_indication_body.number_of_harqs:%d\n", eNB->UL_INFO.harq_ind.harq_indication_body.number_of_harqs); + } else { + LOG_W(PHY,"discarded a PUCCH because the decoded values are impossible\n"); + } + pthread_mutex_unlock(&eNB->UL_INFO_mutex); } diff --git a/targets/RT/USER/lte-ue.c b/targets/RT/USER/lte-ue.c index 1643ca36ca..a48bef64b6 100644 --- a/targets/RT/USER/lte-ue.c +++ b/targets/RT/USER/lte-ue.c @@ -2023,8 +2023,18 @@ void *UE_thread(void *arg) if (is_synchronized == 0) { if (instance_cnt_synch < 0) { // we can invoke the synch - // grab 10 ms of signal and wakeup synch thread + // we shift in time flow because the UE doesn't detect sync when frame alignment is not easy + for (int i=0; iframe_parms.nb_antennas_rx; i++) + rxp[i] = (void *)&dummy_rx[i][0]; + UE->rfdevice.trx_read_func(&UE->rfdevice, + ×tamp, + rxp, + UE->frame_parms.samples_per_tti/2, + UE->frame_parms.nb_antennas_rx); + + // grab 10 ms of signal and wakeup synch thread + if (UE->mode != loop_through_memory) { if (IS_SOFTMODEM_RFSIM ) { for(int sf=0; sf<10; sf++) { From 0e106543efc2872cff068042a3d29bcbbafc348c Mon Sep 17 00:00:00 2001 From: francescomani Date: Tue, 25 Jan 2022 18:54:33 +0100 Subject: [PATCH 16/96] clean up of ulsch ue structures --- executables/nr-ue.c | 2 + openair1/PHY/INIT/nr_init_ue.c | 6 +- openair1/PHY/MODULATION/nr_modulation.c | 96 +------ openair1/PHY/MODULATION/nr_modulation.h | 2 +- openair1/PHY/NR_TRANSPORT/pucch_rx.c | 2 +- .../PHY/NR_UE_TRANSPORT/nr_transport_ue.h | 44 +-- .../PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c | 90 +++--- openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c | 266 +++++++++--------- openair1/PHY/defs_nr_UE.h | 2 +- openair1/PHY/defs_nr_common.h | 2 - openair1/SCHED_NR_UE/fapi_nr_ue_l1.c | 6 +- openair1/SCHED_NR_UE/harq_nr.c | 8 +- openair1/SCHED_NR_UE/phy_procedures_nr_ue.c | 4 +- openair1/SIMULATION/NR_PHY/ulschsim.c | 17 +- openair1/SIMULATION/NR_PHY/ulsim.c | 22 +- 15 files changed, 204 insertions(+), 365 deletions(-) diff --git a/executables/nr-ue.c b/executables/nr-ue.c index 2e7b2ea0e1..cbe87f665c 100644 --- a/executables/nr-ue.c +++ b/executables/nr-ue.c @@ -19,6 +19,8 @@ * contact@openairinterface.org */ +#define _GNU_SOURCE +#include #include #include "executables/nr-uesoftmodem.h" #include "PHY/phy_extern_nr_ue.h" diff --git a/openair1/PHY/INIT/nr_init_ue.c b/openair1/PHY/INIT/nr_init_ue.c index c193733aef..99f869c9b7 100644 --- a/openair1/PHY/INIT/nr_init_ue.c +++ b/openair1/PHY/INIT/nr_init_ue.c @@ -470,8 +470,10 @@ void init_nr_ue_transport(PHY_VARS_NR_UE *ue, for (int k=0; kdlsch[k][i][j] = new_nr_ue_dlsch(1,NR_MAX_DLSCH_HARQ_PROCESSES,NSOFT,MAX_LDPC_ITERATIONS,ue->frame_parms.N_RB_DL, abstraction_flag))!=NULL,"Can't get ue dlsch structures\n"); LOG_D(PHY,"dlsch[%d][%d][%d] => %p\n",k,i,j,ue->dlsch[k][i][j]); - AssertFatal((ue->ulsch[k][i][j] = new_nr_ue_ulsch(ue->frame_parms.N_RB_UL, NR_MAX_ULSCH_HARQ_PROCESSES, abstraction_flag))!=NULL,"Can't get ue ulsch structures\n"); - LOG_D(PHY,"ulsch[%d][%d][%d] => %p\n",k,i,j,ue->ulsch[k][i][j]); + if (j==0) { + AssertFatal((ue->ulsch[k][i] = new_nr_ue_ulsch(ue->frame_parms.N_RB_UL, NR_MAX_ULSCH_HARQ_PROCESSES, abstraction_flag))!=NULL,"Can't get ue ulsch structures\n"); + LOG_D(PHY,"ulsch[%d][%d] => %p\n",k,i,ue->ulsch[k][i]); + } } } diff --git a/openair1/PHY/MODULATION/nr_modulation.c b/openair1/PHY/MODULATION/nr_modulation.c index c81a88ff30..4cb3185b67 100644 --- a/openair1/PHY/MODULATION/nr_modulation.c +++ b/openair1/PHY/MODULATION/nr_modulation.c @@ -320,98 +320,16 @@ void nr_layer_mapping(int16_t **mod_symbs, } } -void nr_ue_layer_mapping(NR_UE_ULSCH_t **ulsch_ue, +void nr_ue_layer_mapping(int16_t *mod_symbs, uint8_t n_layers, uint16_t n_symbs, - int16_t **tx_layers) -{ - int16_t *mod_symbs; + int16_t **tx_layers) { - switch (n_layers) { - - case 1: - mod_symbs = (int16_t *)ulsch_ue[0]->d_mod; - for (int i=0; i>15; - tx_layers[0][(i<<1)+1] = (mod_symbs[(i<<1)+1]*AMP)>>15; - } - break; - - case 2: - case 3: - case 4: - mod_symbs = (int16_t *)ulsch_ue[0]->d_mod; - - for (int i=0; i>15; - tx_layers[l][(i<<1)+1] = (mod_symbs[((n_layers*i+l)<<1)+1]*AMP)>>15; - } - } - break; - - case 5: - mod_symbs = (int16_t *)ulsch_ue[0]->d_mod; - - for (int i=0; i>1; i++) - for (int l=0; l<2; l++) { - tx_layers[l][i<<1] = (mod_symbs[((i<<1)+l)<<1]*AMP)>>15; - tx_layers[l][(i<<1)+1] = (mod_symbs[(((i<<1)+l)<<1)+1]*AMP)>>15; - } - - mod_symbs = (int16_t *)ulsch_ue[1]->d_mod; - - for (int i=0; i>15; - tx_layers[l][(i<<1)+1] = (mod_symbs[((3*i+l)<<1)+1]*AMP)>>15; - } - break; - - case 6: - for (int q=0; q<2; q++) { - mod_symbs = (int16_t *)ulsch_ue[q]->d_mod; - - for (int i=0; i>15; - tx_layers[l][(i<<1)+1] = (mod_symbs[((3*i+l)<<1)+1]*AMP)>>15; - } - } - break; - - case 7: - mod_symbs = (int16_t *)ulsch_ue[1]->d_mod; - - for (int i=0; i>15; - tx_layers[l][(i<<1)+1] = (mod_symbs[((3*i+l)<<1)+1]*AMP)>>15; - } - - mod_symbs = (int16_t *)ulsch_ue[0]->d_mod; - - for (int i=0; i>15; - tx_layers[l][(i<<1)+1] = (mod_symbs[(((i<<2)+l)<<1)+1]*AMP)>>15; - } - break; - - case 8: - for (int q=0; q<2; q++) { - mod_symbs = (int16_t *)ulsch_ue[q]->d_mod; - - for (int i=0; i>2; i++) - for (int l=0; l<3; l++) { - tx_layers[l][i<<1] = (mod_symbs[((i<<2)+l)<<1]*AMP)>>15; - tx_layers[l][(i<<1)+1] = (mod_symbs[(((i<<2)+l)<<1)+1]*AMP)>>15; - } - } - break; - - default: - AssertFatal(0, "Invalid number of layers %d\n", n_layers); + for (int i=0; i>15; + tx_layers[l][(i<<1)+1] = (mod_symbs[((n_layers*i+l)<<1)+1]*AMP)>>15; + } } } diff --git a/openair1/PHY/MODULATION/nr_modulation.h b/openair1/PHY/MODULATION/nr_modulation.h index 75541a1361..db15e3d9ef 100644 --- a/openair1/PHY/MODULATION/nr_modulation.h +++ b/openair1/PHY/MODULATION/nr_modulation.h @@ -66,7 +66,7 @@ void nr_layer_mapping(int16_t **mod_symbs, @param[out] tx_layers, modulated symbols for each layer */ -void nr_ue_layer_mapping(NR_UE_ULSCH_t **ulsch_ue, +void nr_ue_layer_mapping(int16_t *mod_symbs, uint8_t n_layers, uint16_t n_symbs, int16_t **tx_layers); diff --git a/openair1/PHY/NR_TRANSPORT/pucch_rx.c b/openair1/PHY/NR_TRANSPORT/pucch_rx.c index 22c8ff0b0e..b44f7e3b02 100644 --- a/openair1/PHY/NR_TRANSPORT/pucch_rx.c +++ b/openair1/PHY/NR_TRANSPORT/pucch_rx.c @@ -449,7 +449,7 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB, uci_pdu->harq->harq_list = (nfapi_nr_harq_t*)malloc(2); uci_pdu->harq->harq_list[1].harq_value = !(index&0x01); uci_pdu->harq->harq_list[0].harq_value = !((index>>1)&0x01); - LOG_D(PHY, "[DLSCH/PDSCH/PUCCH] %d.%d HARQ values %d (0 pass, 1 fail) and %d with confidence level %d (0 is good, 1 is bad), xrt_mag %d xrt_mag_next %d n0 %d (%d,%d) pucch0_thres %d, cqi %d, SNRtimes10 %d,sync_pos %d\n", + LOG_D(PHY, "[DLSCH/PDSCH/PUCCH] %d.%d HARQ values %d and %d (0 pass, 1 fail) with confidence level %d (0 is good, 1 is bad), xrt_mag %d xrt_mag_next %d n0 %d (%d,%d) pucch0_thres %d, cqi %d, SNRtimes10 %d,sync_pos %d\n", frame,slot,uci_pdu->harq->harq_list[1].harq_value,uci_pdu->harq->harq_list[0].harq_value,uci_pdu->harq->harq_confidence_level,xrtmag_dBtimes10,xrtmag_next_dBtimes10,max_n0,uci_stats->pucch0_n00,uci_stats->pucch0_n01,uci_stats->pucch0_thres,cqi,SNRtimes10,gNB->ulsch_stats[0].sync_pos); if (pucch_pdu->sr_flag == 1) { uci_pdu->sr = calloc(1,sizeof(*uci_pdu->sr)); diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h index b4ee4f5b41..76b68a265f 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h @@ -88,9 +88,9 @@ typedef struct { /// LDPC-code outputs uint8_t *d[MAX_NUM_NR_ULSCH_SEGMENTS]; /// LDPC-code outputs (TS 36.212 V15.4.0, Sec 5.3.2 p. 17) - uint8_t *e; + uint8_t *e; /// Rate matching (Interleaving) outputs (TS 36.212 V15.4.0, Sec 5.4.2.2 p. 30) - uint8_t *f; + uint8_t *f; /// Number of code segments uint32_t C; /// Number of bits in code segments @@ -122,55 +122,15 @@ typedef struct { typedef struct { /// SRS active flag uint8_t srs_active; -//#if defined(UPGRADE_RAT_NR) -#if 1 // Pointers to HARQ processes for the ULSCH NR_UL_UE_HARQ_t *harq_processes[NR_MAX_ULSCH_HARQ_PROCESSES]; int harq_process_id[NR_MAX_SLOTS_PER_FRAME]; // UL number of harq processes uint8_t number_harq_processes_for_pusch; -#endif - /* - /// Pointer to CQI data (+1 for 8 bits crc) - uint8_t o[1+MAX_CQI_BYTES]; - /// Length of CQI data (bits) - uint8_t O; - /// Format of CQI data - UCI_format_t uci_format; - /// Rank information - uint8_t o_RI[2]; - /// Length of rank information (bits) - uint8_t O_RI; - /// Pointer to ACK - uint8_t o_ACK[4]; - */ /// Minimum number of CQI bits for PUSCH (36-212 r8.6, Sec 5.2.4.1 p. 37) uint8_t O_CQI_MIN; /// ACK/NAK Bundling flag uint8_t bundling; - /// Concatenated "g"-sequences (for definition see 36-212 V15.4.0 2018-12, p.31) - uint8_t g[MAX_NUM_NR_CHANNEL_BITS]; - /// Interleaved "h"-sequences (for definition see 36-212 V8.6 2009-03, p.17-18) - uint8_t h[MAX_NUM_NR_CHANNEL_BITS]; - /// Scrambled "b"-sequences (for definition see 36-211 V8.6 2009-03, p.14) - uint8_t b_tilde[MAX_NUM_NR_CHANNEL_BITS]; - /// Modulated "d"-sequences (for definition see 36-211 V8.6 2009-03, p.14) - int32_t d_mod[MAX_NUM_NR_RE] __attribute__ ((aligned(16))); - /// Transform-coded "y"-sequences (for definition see 38-211 V15.3.0 2018-09, subsection 6.3.1.4) - int32_t y[MAX_NUM_NR_RE] __attribute__ ((aligned(16))); - /* - /// "q" sequences for CQI/PMI (for definition see 36-212 V8.6 2009-03, p.27) - uint8_t q[MAX_CQI_PAYLOAD]; - - /// coded and interleaved CQI bits - uint8_t o_w[(MAX_CQI_BITS+8)*3]; - /// coded CQI bits - uint8_t o_d[96+((MAX_CQI_BITS+8)*3)]; - /// coded ACK bits - uint8_t q_ACK[MAX_ACK_PAYLOAD]; - /// coded RI bits - uint8_t q_RI[MAX_RI_PAYLOAD]; - */ /// beta_offset_cqi times 8 uint16_t beta_offset_cqi_times8; /// beta_offset_ri times 8 diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c index b2e2476670..5a9fbd9648 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c @@ -221,43 +221,23 @@ int nr_ulsch_encoding(PHY_VARS_NR_UE *ue, unsigned int G) { start_meas(&ue->ulsch_encoding_stats); -/////////////////////////parameters and variables declaration///////////////////////// -/////////// - - unsigned int crc; - NR_UL_UE_HARQ_t *harq_process; - uint16_t nb_rb ; - uint32_t A, F; - uint32_t *pz; - uint8_t mod_order; - uint16_t Kr,r; - uint32_t r_offset; - uint32_t E,Kb; - uint8_t Ilbrm; - uint32_t Tbslbrm; - uint16_t R; - float Coderate; - -/////////// -/////////////////////////////////////////////////////////////////////////////////////// - /////////////////////////parameters and variables initialization///////////////////////// /////////// - crc = 1; - harq_process = ulsch->harq_processes[harq_pid]; - nb_rb = harq_process->pusch_pdu.rb_size; - A = harq_process->pusch_pdu.pusch_data.tb_size*8; - pz = &harq_process->Z; - mod_order = nr_get_Qm_ul(harq_process->pusch_pdu.mcs_index, harq_process->pusch_pdu.mcs_table); - R = nr_get_code_rate_ul(harq_process->pusch_pdu.mcs_index, harq_process->pusch_pdu.mcs_table); - Kr=0; - r_offset=0; - F=0; - Ilbrm = 0; - Tbslbrm = 950984; //max tbs - Coderate = 0.0; + unsigned int crc = 1; + NR_UL_UE_HARQ_t *harq_process = ulsch->harq_processes[harq_pid]; + uint16_t nb_rb = harq_process->pusch_pdu.rb_size; + uint32_t A = harq_process->pusch_pdu.pusch_data.tb_size*8; + uint32_t *pz = &harq_process->Z; + uint8_t mod_order = nr_get_Qm_ul(harq_process->pusch_pdu.mcs_index, harq_process->pusch_pdu.mcs_table); + uint16_t R = nr_get_code_rate_ul(harq_process->pusch_pdu.mcs_index, harq_process->pusch_pdu.mcs_table); + uint16_t Kr=0; + uint32_t r_offset=0; + uint32_t F=0; + uint8_t Ilbrm = 0; + uint32_t Tbslbrm = 950984; //max tbs + float Coderate = 0.0; /////////// ///////////////////////////////////////////////////////////////////////////////////////// @@ -333,14 +313,14 @@ 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); start_meas(&ue->ulsch_segmentation_stats); - Kb=nr_segmentation(harq_process->b, - harq_process->c, - harq_process->B, - &harq_process->C, - &harq_process->K, - pz, - &harq_process->F, - harq_process->BG); + uint32_t Kb=nr_segmentation(harq_process->b, + harq_process->c, + harq_process->B, + &harq_process->C, + &harq_process->K, + pz, + &harq_process->F, + harq_process->BG); stop_meas(&ue->ulsch_segmentation_stats); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_NR_SEGMENTATION, VCD_FUNCTION_OUT); @@ -357,7 +337,7 @@ int nr_ulsch_encoding(PHY_VARS_NR_UE *ue, //printf("segment Z %d k %d Kr %d BG %d\n", *pz,harq_process->K,Kr,BG); //start_meas(te_stats); - for (r=0; rC; r++) { + for (int r=0; rC; r++) { //channel_input[r] = &harq_process->d[r][0]; #ifdef DEBUG_ULSCH_CODING printf("Encoder: B %d F %d \n",harq_process->B, harq_process->F); @@ -392,8 +372,7 @@ int nr_ulsch_encoding(PHY_VARS_NR_UE *ue, VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_LDPC_ENCODER_OPTIM, VCD_FUNCTION_IN); start_meas(&ue->ulsch_ldpc_encoding_stats); - for(int j = 0; j < (harq_process->C/8 + 1); j++) - { + for(int j = 0; j < (harq_process->C/8 + 1); j++) { impp.macro_num = j; nrLDPC_encoder(harq_process->c,harq_process->d,*pz,Kb,Kr,harq_process->BG,&impp); } @@ -416,14 +395,13 @@ int nr_ulsch_encoding(PHY_VARS_NR_UE *ue, F = harq_process->F; Kr = harq_process->K; - for (r=0; rC; r++) { // looping over C segments - + for (int r=0; rC; r++) { // looping over C segments if (harq_process->F>0) { - for (int k=(Kr-F-2*(*pz)); kd[r][k] = NR_NULL; - //if (k<(Kr-F+8)) - //printf("r %d filler bits [%d] = %d \n", r,k, harq_process->d[r][k]); - } + for (int k=(Kr-F-2*(*pz)); kd[r][k] = NR_NULL; + //if (k<(Kr-F+8)) + //printf("r %d filler bits [%d] = %d \n", r,k, harq_process->d[r][k]); + } } @@ -438,7 +416,7 @@ int nr_ulsch_encoding(PHY_VARS_NR_UE *ue, ///////////////////////// d---->| Rate matching bit selection |---->e ///////////////////////// /////////// - E = nr_get_E(G, harq_process->C, mod_order, harq_process->pusch_pdu.nrOfLayers, r); + uint32_t E = nr_get_E(G, harq_process->C, mod_order, harq_process->pusch_pdu.nrOfLayers, r); Tbslbrm = nr_compute_tbslbrm(0,nb_rb,harq_process->pusch_pdu.nrOfLayers); @@ -481,9 +459,9 @@ int nr_ulsch_encoding(PHY_VARS_NR_UE *ue, start_meas(&ue->ulsch_interleaving_stats); nr_interleaving_ldpc(E, - mod_order, - harq_process->e+r_offset, - harq_process->f+r_offset); + mod_order, + harq_process->e+r_offset, + harq_process->f+r_offset); stop_meas(&ue->ulsch_interleaving_stats); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_NR_INTERLEAVING_LDPC, VCD_FUNCTION_OUT); @@ -505,8 +483,6 @@ int nr_ulsch_encoding(PHY_VARS_NR_UE *ue, } - memcpy(ulsch->g,harq_process->f,G); // g is the concatenated code block - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_NR_UE_ULSCH_ENCODING, VCD_FUNCTION_OUT); stop_meas(&ue->ulsch_encoding_stats); diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c index 73615ffb6e..13ca3bde6b 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c @@ -93,17 +93,16 @@ void nr_pusch_codeword_scrambling(uint8_t *in, } void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE, - unsigned char harq_pid, - uint32_t frame, - uint8_t slot, - uint8_t thread_id, - int gNB_id) { + unsigned char harq_pid, + uint32_t frame, + uint8_t slot, + uint8_t thread_id, + int gNB_id) { LOG_D(PHY,"nr_ue_ulsch_procedures hard_id %d %d.%d\n",harq_pid,frame,slot); uint32_t available_bits; - uint8_t cwd_index, l; - uint32_t scrambled_output[NR_MAX_NB_CODEWORDS][NR_MAX_PDSCH_ENCODED_LENGTH>>5]; + uint32_t scrambled_output[NR_MAX_PDSCH_ENCODED_LENGTH>>5]; int16_t **tx_layers; int32_t **txdataF; int8_t Wf[2], Wt[2]; @@ -115,96 +114,96 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE, NR_DL_FRAME_PARMS *frame_parms = &UE->frame_parms; NR_UE_PUSCH *pusch_ue = UE->pusch_vars[thread_id][gNB_id]; - uint8_t num_of_codewords = 1; // tmp assumption int Nid_cell = 0; int N_PRB_oh = 0; // higher layer (RRC) parameter xOverhead in PUSCH-ServingCellConfig uint16_t number_dmrs_symbols = 0; - for (cwd_index = 0;cwd_index < num_of_codewords; cwd_index++) { + NR_UE_ULSCH_t *ulsch_ue = UE->ulsch[thread_id][gNB_id]; + NR_UL_UE_HARQ_t *harq_process_ul_ue = ulsch_ue->harq_processes[harq_pid]; + nfapi_nr_ue_pusch_pdu_t *pusch_pdu = &harq_process_ul_ue->pusch_pdu; - NR_UE_ULSCH_t *ulsch_ue = UE->ulsch[thread_id][gNB_id][cwd_index]; - NR_UL_UE_HARQ_t *harq_process_ul_ue = ulsch_ue->harq_processes[harq_pid]; - nfapi_nr_ue_pusch_pdu_t *pusch_pdu = &harq_process_ul_ue->pusch_pdu; + int start_symbol = pusch_pdu->start_symbol_index; + uint16_t ul_dmrs_symb_pos = pusch_pdu->ul_dmrs_symb_pos; + uint8_t number_of_symbols = pusch_pdu->nr_of_symbols; + uint8_t dmrs_type = pusch_pdu->dmrs_config_type; + uint16_t start_rb = pusch_pdu->rb_start; + uint16_t nb_rb = pusch_pdu->rb_size; + uint8_t Nl = pusch_pdu->nrOfLayers; + uint8_t mod_order = pusch_pdu->qam_mod_order; + uint16_t rnti = pusch_pdu->rnti; + uint8_t cdm_grps_no_data = pusch_pdu->num_dmrs_cdm_grps_no_data; + uint16_t start_sc = frame_parms->first_carrier_offset + (start_rb+pusch_pdu->bwp_start)*NR_NB_SC_PER_RB; - int start_symbol = pusch_pdu->start_symbol_index; - uint16_t ul_dmrs_symb_pos = pusch_pdu->ul_dmrs_symb_pos; - uint8_t number_of_symbols = pusch_pdu->nr_of_symbols; - uint8_t dmrs_type = pusch_pdu->dmrs_config_type; - uint16_t start_rb = pusch_pdu->rb_start; - uint16_t nb_rb = pusch_pdu->rb_size; - uint8_t Nl = pusch_pdu->nrOfLayers; - uint8_t mod_order = pusch_pdu->qam_mod_order; - uint16_t rnti = pusch_pdu->rnti; - uint8_t cdm_grps_no_data = pusch_pdu->num_dmrs_cdm_grps_no_data; - uint16_t start_sc = frame_parms->first_carrier_offset + (start_rb+pusch_pdu->bwp_start)*NR_NB_SC_PER_RB; + if (start_sc >= frame_parms->ofdm_symbol_size) + start_sc -= frame_parms->ofdm_symbol_size; - if (start_sc >= frame_parms->ofdm_symbol_size) - start_sc -= frame_parms->ofdm_symbol_size; + ulsch_ue->Nid_cell = Nid_cell; - ulsch_ue->Nid_cell = Nid_cell; + for (int i = start_symbol; i < start_symbol + number_of_symbols; i++) { + if((ul_dmrs_symb_pos >> i) & 0x01) + number_dmrs_symbols += 1; + } - for (int i = start_symbol; i < start_symbol + number_of_symbols; i++) { - if((ul_dmrs_symb_pos >> i) & 0x01) - number_dmrs_symbols += 1; - } + nb_dmrs_re_per_rb = ((dmrs_type == pusch_dmrs_type1) ? 6:4)*cdm_grps_no_data; - nb_dmrs_re_per_rb = ((dmrs_type == pusch_dmrs_type1) ? 6:4)*cdm_grps_no_data; + LOG_D(PHY,"ulsch %x : start_rb %d bwp_start %d start_sc %d start_symbol %d num_symbols %d cdmgrpsnodata %d num_dmrs %d dmrs_re_per_rb %d\n", + rnti,start_rb,pusch_pdu->bwp_start,start_sc,start_symbol,number_of_symbols,cdm_grps_no_data,number_dmrs_symbols,nb_dmrs_re_per_rb); - LOG_D(PHY,"ulsch %x : start_rb %d bwp_start %d start_sc %d start_symbol %d num_symbols %d cdmgrpsnodata %d num_dmrs %d dmrs_re_per_rb %d\n", - rnti,start_rb,pusch_pdu->bwp_start,start_sc,start_symbol,number_of_symbols,cdm_grps_no_data,number_dmrs_symbols,nb_dmrs_re_per_rb); + // TbD num_of_mod_symbols is set but never used + N_RE_prime = NR_NB_SC_PER_RB*number_of_symbols - nb_dmrs_re_per_rb*number_dmrs_symbols - N_PRB_oh; + harq_process_ul_ue->num_of_mod_symbols = N_RE_prime*nb_rb; - // TbD num_of_mod_symbols is set but never used - N_RE_prime = NR_NB_SC_PER_RB*number_of_symbols - nb_dmrs_re_per_rb*number_dmrs_symbols - N_PRB_oh; - harq_process_ul_ue->num_of_mod_symbols = N_RE_prime*nb_rb*num_of_codewords; + /////////////////////////ULSCH coding///////////////////////// + /////////// - /////////////////////////ULSCH coding///////////////////////// - /////////// - - unsigned int G = nr_get_G(nb_rb, number_of_symbols, - nb_dmrs_re_per_rb, number_dmrs_symbols, mod_order, Nl); + unsigned int G = nr_get_G(nb_rb, number_of_symbols, + nb_dmrs_re_per_rb, number_dmrs_symbols, mod_order, Nl); - trace_NRpdu(DIRECTION_UPLINK, - ulsch_ue->harq_processes[harq_pid]->a, - ulsch_ue->harq_processes[harq_pid]->pusch_pdu.pusch_data.tb_size, - 0, WS_C_RNTI, rnti, frame, slot, 0, 0); + trace_NRpdu(DIRECTION_UPLINK, + harq_process_ul_ue->a, + harq_process_ul_ue->pusch_pdu.pusch_data.tb_size, + 0, WS_C_RNTI, rnti, frame, slot, 0, 0); - if (nr_ulsch_encoding(UE, ulsch_ue, frame_parms, harq_pid, G) == -1) - return; + if (nr_ulsch_encoding(UE, ulsch_ue, frame_parms, harq_pid, G) == -1) + return; - /////////// - //////////////////////////////////////////////////////////////////// + /////////// + //////////////////////////////////////////////////////////////////// - /////////////////////////ULSCH scrambling///////////////////////// - /////////// + /////////////////////////ULSCH scrambling///////////////////////// + /////////// - available_bits = G; + available_bits = G; - memset(scrambled_output[cwd_index], 0, ((available_bits>>5)+1)*sizeof(uint32_t)); + memset(scrambled_output, 0, ((available_bits>>5)+1)*sizeof(uint32_t)); - nr_pusch_codeword_scrambling(ulsch_ue->g, - available_bits, - ulsch_ue->Nid_cell, - rnti, - scrambled_output[cwd_index]); // assume one codeword for the moment + nr_pusch_codeword_scrambling(harq_process_ul_ue->f, + available_bits, + ulsch_ue->Nid_cell, + rnti, + scrambled_output); // assume one codeword for the moment - ///////////// - ////////////////////////////////////////////////////////////////////////// + ///////////// + ////////////////////////////////////////////////////////////////////////// - /////////////////////////ULSCH modulation///////////////////////// - /////////// + /////////////////////////ULSCH modulation///////////////////////// + /////////// - nr_modulation(scrambled_output[cwd_index], // assume one codeword for the moment - available_bits, - mod_order, - (int16_t *)ulsch_ue->d_mod); + int max_num_re = number_of_symbols*nb_rb*NR_NB_SC_PER_RB; + int32_t d_mod[max_num_re] __attribute__ ((aligned(16))); + + nr_modulation(scrambled_output, // assume one codeword for the moment + available_bits, + mod_order, + (int16_t *)d_mod); - /////////// - //////////////////////////////////////////////////////////////////////// + /////////// + //////////////////////////////////////////////////////////////////////// /////////////////////////DMRS Modulation///////////////////////// /////////// @@ -246,7 +245,7 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE, tx_layers = (int16_t **)pusch_ue->txdataF_layers; - nr_ue_layer_mapping(UE->ulsch[thread_id][gNB_id], + nr_ue_layer_mapping((int16_t *)d_mod, Nl, available_bits/mod_order, tx_layers); @@ -264,13 +263,16 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE, uint8_t u = 0, v = 0; int16_t *dmrs_seq = NULL; + /// Transform-coded "y"-sequences (for definition see 38-211 V15.3.0 2018-09, subsection 6.3.1.4) + int32_t y[max_num_re] __attribute__ ((aligned(16))); + // if transform precoding is enbaled (value 0) if (pusch_pdu->transform_precoding == 0) { uint32_t nb_re_pusch=nb_rb * NR_NB_SC_PER_RB; uint32_t y_offset = 0; uint16_t num_dmrs_res_per_symbol = nb_rb*(NR_NB_SC_PER_RB/2); - + // Calculate index to dmrs seq array based on number of DMRS Subcarriers on this symbol index = get_index_for_dmrs_lowpapr_seq(num_dmrs_res_per_symbol); u = pusch_pdu->dfts_ofdm.low_papr_group_number; @@ -279,60 +281,52 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE, AssertFatal(index >= 0, "Num RBs not configured according to 3GPP 38.211 section 6.3.1.4. For PUSCH with transform precoding, num RBs cannot be multiple of any other primenumber other than 2,3,5\n"); AssertFatal(dmrs_seq != NULL, "DMRS low PAPR seq not found, check if DMRS sequences are generated"); - + LOG_D(PHY,"Transform Precoding params. u: %d, v: %d, index for dmrsseq: %d\n", u, v, index); - for (l = start_symbol; l < start_symbol + number_of_symbols; l++) { + for (int l = start_symbol; l < start_symbol + number_of_symbols; l++) { if((ul_dmrs_symb_pos >> l) & 0x01) /* In the symbol with DMRS no data would be transmitted CDM groups is 2*/ continue; - nr_dft(&ulsch_ue->y[y_offset], &((int32_t*)tx_layers[0])[y_offset], nb_re_pusch); + nr_dft(&y[y_offset], &((int32_t*)tx_layers[0])[y_offset], nb_re_pusch); y_offset = y_offset + nb_re_pusch; LOG_D(PHY,"Transform precoding being done on data- symbol: %d, nb_re_pusch: %d, y_offset: %d\n", l, nb_re_pusch, y_offset); - #ifdef DEBUG_PUSCH_MAPPING - printf("NR_ULSCH_UE: y_offset %d\t nb_re_pusch %d \t Symbol %d \t nb_rb %d \n", - y_offset, nb_re_pusch, l, nb_rb); - #endif +#ifdef DEBUG_PUSCH_MAPPING + printf("NR_ULSCH_UE: y_offset %d\t nb_re_pusch %d \t Symbol %d \t nb_rb %d \n", + y_offset, nb_re_pusch, l, nb_rb); +#endif } - #ifdef DEBUG_DFT_IDFT - int32_t debug_symbols[MAX_NUM_NR_RE] __attribute__ ((aligned(16))); - int offset = 0; - printf("NR_ULSCH_UE: available_bits: %d, mod_order: %d", available_bits,mod_order); +#ifdef DEBUG_DFT_IDFT + int32_t debug_symbols[max_num_re] __attribute__ ((aligned(16))); + int offset = 0; + printf("NR_ULSCH_UE: available_bits: %d, mod_order: %d", available_bits,mod_order); - for (int ll = 0; ll < (available_bits/mod_order); ll++) { - debug_symbols[ll] = ulsch_ue->y[ll]; - } - - printf("NR_ULSCH_UE: numSym: %d, num_dmrs_sym: %d", number_of_symbols,number_dmrs_symbols); - for (int ll = 0; ll < (number_of_symbols-number_dmrs_symbols); ll++) { + for (int ll = 0; ll < (available_bits/mod_order); ll++) { + debug_symbols[ll] = y[ll]; + } - nr_idft(&debug_symbols[offset], nb_re_pusch); - - offset = offset + nb_re_pusch; - - } - LOG_M("preDFT_all_symbols.m","UE_preDFT", tx_layers[0],number_of_symbols*nb_re_pusch,1,1); - LOG_M("postDFT_all_symbols.m","UE_postDFT", ulsch_ue->y,number_of_symbols*nb_re_pusch,1,1); - LOG_M("DEBUG_IDFT_SYMBOLS.m","UE_Debug_IDFT", debug_symbols,number_of_symbols*nb_re_pusch,1,1); - LOG_M("UE_DMRS_SEQ.m","UE_DMRS_SEQ", dmrs_seq,nb_re_pusch,1,1); - #endif + printf("NR_ULSCH_UE: numSym: %d, num_dmrs_sym: %d", number_of_symbols,number_dmrs_symbols); + for (int ll = 0; ll < (number_of_symbols-number_dmrs_symbols); ll++) { + nr_idft(&debug_symbols[offset], nb_re_pusch); + offset = offset + nb_re_pusch; + } + LOG_M("preDFT_all_symbols.m","UE_preDFT", tx_layers[0],number_of_symbols*nb_re_pusch,1,1); + LOG_M("postDFT_all_symbols.m","UE_postDFT", y,number_of_symbols*nb_re_pusch,1,1); + LOG_M("DEBUG_IDFT_SYMBOLS.m","UE_Debug_IDFT", debug_symbols,number_of_symbols*nb_re_pusch,1,1); + LOG_M("UE_DMRS_SEQ.m","UE_DMRS_SEQ", dmrs_seq,nb_re_pusch,1,1); +#endif } else - memcpy(ulsch_ue->y, tx_layers[0], (available_bits/mod_order)*sizeof(int32_t)); + memcpy(y, tx_layers[0], (available_bits/mod_order)*sizeof(int32_t)); - /////////// - //////////////////////////////////////////////////////////////////////// - - - /////////////////////////ULSCH RE mapping///////////////////////// /////////// @@ -344,18 +338,16 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE, uint16_t m = 0; - #ifdef DEBUG_PUSCH_MAPPING - printf("NR_ULSCH_UE: Value of CELL ID %d /t, u %d \n", frame_parms->Nid_cell, u); - #endif - - +#ifdef DEBUG_PUSCH_MAPPING + printf("NR_ULSCH_UE: Value of CELL ID %d /t, u %d \n", frame_parms->Nid_cell, u); +#endif // DMRS params for this ap get_Wt(Wt, ap, dmrs_type); get_Wf(Wf, ap, dmrs_type); delta = get_delta(ap, dmrs_type); - for (l=start_symbol; lpdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_PTRS) { AssertFatal(pusch_pdu->transform_precoding == 1, "PTRS NOT SUPPORTED IF TRANSFORM PRECODING IS ENABLED\n"); @@ -405,15 +394,15 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE, if (k == ((start_sc+get_dmrs_freq_idx_ul(n, k_prime, delta, dmrs_type))%frame_parms->ofdm_symbol_size)) is_dmrs = 1; } else if (is_ptrs_sym) { - is_ptrs = is_ptrs_subcarrier(k, - rnti, - ap, - dmrs_type, - K_ptrs, - nb_rb, - pusch_pdu->pusch_ptrs.ptrs_ports_list[0].ptrs_re_offset, - start_sc, - frame_parms->ofdm_symbol_size); + is_ptrs = is_ptrs_subcarrier(k, + rnti, + ap, + dmrs_type, + K_ptrs, + nb_rb, + pusch_pdu->pusch_ptrs.ptrs_ports_list[0].ptrs_re_offset, + start_sc, + frame_parms->ofdm_symbol_size); } if (is_dmrs == 1) { @@ -422,19 +411,19 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE, ((int16_t*)txdataF[ap])[(sample_offsetF)<<1] = (Wt[l_prime[0]]*Wf[k_prime]*AMP*dmrs_seq[2*dmrs_idx]) >> 15; ((int16_t*)txdataF[ap])[((sample_offsetF)<<1) + 1] = (Wt[l_prime[0]]*Wf[k_prime]*AMP*dmrs_seq[(2*dmrs_idx) + 1]) >> 15; - + } else { - ((int16_t*)txdataF[ap])[(sample_offsetF)<<1] = (Wt[l_prime[0]]*Wf[k_prime]*AMP*mod_dmrs[dmrs_idx<<1]) >> 15; - ((int16_t*)txdataF[ap])[((sample_offsetF)<<1) + 1] = (Wt[l_prime[0]]*Wf[k_prime]*AMP*mod_dmrs[(dmrs_idx<<1) + 1]) >> 15; + ((int16_t*)txdataF[ap])[(sample_offsetF)<<1] = (Wt[l_prime[0]]*Wf[k_prime]*AMP*mod_dmrs[dmrs_idx<<1]) >> 15; + ((int16_t*)txdataF[ap])[((sample_offsetF)<<1) + 1] = (Wt[l_prime[0]]*Wf[k_prime]*AMP*mod_dmrs[(dmrs_idx<<1) + 1]) >> 15; - } + } - #ifdef DEBUG_PUSCH_MAPPING - printf("dmrs_idx %d\t l %d \t k %d \t k_prime %d \t n %d \t dmrs: %d %d\n", - dmrs_idx, l, k, k_prime, n, ((int16_t*)txdataF[ap])[(sample_offsetF)<<1], - ((int16_t*)txdataF[ap])[((sample_offsetF)<<1) + 1]); - #endif +#ifdef DEBUG_PUSCH_MAPPING + printf("dmrs_idx %d\t l %d \t k %d \t k_prime %d \t n %d \t dmrs: %d %d\n", + dmrs_idx, l, k, k_prime, n, ((int16_t*)txdataF[ap])[(sample_offsetF)<<1], + ((int16_t*)txdataF[ap])[((sample_offsetF)<<1) + 1]); +#endif dmrs_idx++; @@ -451,14 +440,14 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE, } else if (!is_dmrs_sym || allowed_xlsch_re_in_dmrs_symbol(k, start_sc, frame_parms->ofdm_symbol_size, cdm_grps_no_data, dmrs_type)) { - ((int16_t*)txdataF[ap])[(sample_offsetF)<<1] = ((int16_t *) ulsch_ue->y)[m<<1]; - ((int16_t*)txdataF[ap])[((sample_offsetF)<<1) + 1] = ((int16_t *) ulsch_ue->y)[(m<<1) + 1]; + ((int16_t*)txdataF[ap])[(sample_offsetF)<<1] = ((int16_t *) y)[m<<1]; + ((int16_t*)txdataF[ap])[((sample_offsetF)<<1) + 1] = ((int16_t *) y)[(m<<1) + 1]; - #ifdef DEBUG_PUSCH_MAPPING +#ifdef DEBUG_PUSCH_MAPPING printf("m %d\t l %d \t k %d \t txdataF: %d %d\n", - m, l, k, ((int16_t*)txdataF[ap])[(sample_offsetF)<<1], - ((int16_t*)txdataF[ap])[((sample_offsetF)<<1) + 1]); - #endif + m, l, k, ((int16_t*)txdataF[ap])[(sample_offsetF)<<1], + ((int16_t*)txdataF[ap])[((sample_offsetF)<<1) + 1]); +#endif m++; @@ -474,10 +463,9 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE, } } } - } NR_UL_UE_HARQ_t *harq_process_ulsch=NULL; - harq_process_ulsch = UE->ulsch[thread_id][gNB_id][0]->harq_processes[harq_pid]; + harq_process_ulsch = UE->ulsch[thread_id][gNB_id]->harq_processes[harq_pid]; harq_process_ulsch->status = SCH_IDLE; /////////// diff --git a/openair1/PHY/defs_nr_UE.h b/openair1/PHY/defs_nr_UE.h index 69978f5548..7aca95cb1e 100644 --- a/openair1/PHY/defs_nr_UE.h +++ b/openair1/PHY/defs_nr_UE.h @@ -818,7 +818,7 @@ typedef struct { NR_UE_PUSCH *pusch_vars[RX_NB_TH_MAX][NUMBER_OF_CONNECTED_gNB_MAX]; NR_UE_PUCCH *pucch_vars[RX_NB_TH_MAX][NUMBER_OF_CONNECTED_gNB_MAX]; NR_UE_DLSCH_t *dlsch[RX_NB_TH_MAX][NUMBER_OF_CONNECTED_gNB_MAX][NR_MAX_NB_CODEWORDS]; // two RxTx Threads - NR_UE_ULSCH_t *ulsch[RX_NB_TH_MAX][NUMBER_OF_CONNECTED_gNB_MAX][NR_MAX_NB_CODEWORDS]; // two code words + NR_UE_ULSCH_t *ulsch[RX_NB_TH_MAX][NUMBER_OF_CONNECTED_gNB_MAX]; NR_UE_DLSCH_t *dlsch_SI[NUMBER_OF_CONNECTED_gNB_MAX]; NR_UE_DLSCH_t *dlsch_ra[NUMBER_OF_CONNECTED_gNB_MAX]; NR_UE_DLSCH_t *dlsch_p[NUMBER_OF_CONNECTED_gNB_MAX]; diff --git a/openair1/PHY/defs_nr_common.h b/openair1/PHY/defs_nr_common.h index c385d323e3..8245da9737 100644 --- a/openair1/PHY/defs_nr_common.h +++ b/openair1/PHY/defs_nr_common.h @@ -107,8 +107,6 @@ #define MAX_NUM_NR_ULSCH_SEGMENTS 34 #define MAX_NR_ULSCH_PAYLOAD_BYTES (MAX_NUM_NR_ULSCH_SEGMENTS*1056) -#define MAX_NUM_NR_CHANNEL_BITS (14*273*12*8) // 14 symbols, 273 RB -#define MAX_NUM_NR_RE (14*273*12) #define NR_RX_NB_TH 1 #define NR_NB_TH_SLOT 2 diff --git a/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c b/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c index 4fd337eb09..b0b1a0f261 100644 --- a/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c +++ b/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c @@ -224,7 +224,7 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){ thread_id = scheduled_response->thread_id; NR_UE_DLSCH_t *dlsch0 = NULL; NR_UE_PDCCH *pdcch_vars = PHY_vars_UE_g[module_id][cc_id]->pdcch_vars[thread_id][0]; - NR_UE_ULSCH_t *ulsch0 = PHY_vars_UE_g[module_id][cc_id]->ulsch[thread_id][0][0]; + NR_UE_ULSCH_t *ulsch = PHY_vars_UE_g[module_id][cc_id]->ulsch[thread_id][0]; NR_UE_PUCCH *pucch_vars = PHY_vars_UE_g[module_id][cc_id]->pucch_vars[thread_id][0]; if(scheduled_response->dl_config != NULL){ @@ -343,7 +343,7 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){ // pusch config pdu pusch_config_pdu = &ul_config->ul_config_list[i].pusch_config_pdu; current_harq_pid = pusch_config_pdu->pusch_data.harq_process_id; - NR_UL_UE_HARQ_t *harq_process_ul_ue = ulsch0->harq_processes[current_harq_pid]; + NR_UL_UE_HARQ_t *harq_process_ul_ue = ulsch->harq_processes[current_harq_pid]; harq_process_ul_ue->status = 0; if (harq_process_ul_ue){ @@ -352,7 +352,7 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){ memcpy(pusch_pdu, pusch_config_pdu, sizeof(nfapi_nr_ue_pusch_pdu_t)); - ulsch0->f_pusch = pusch_config_pdu->absolute_delta_PUSCH; + ulsch->f_pusch = pusch_config_pdu->absolute_delta_PUSCH; if (scheduled_response->tx_request) { for (int j=0; jtx_request->number_of_pdus; j++) { diff --git a/openair1/SCHED_NR_UE/harq_nr.c b/openair1/SCHED_NR_UE/harq_nr.c index 5b65131934..9dc82ee358 100644 --- a/openair1/SCHED_NR_UE/harq_nr.c +++ b/openair1/SCHED_NR_UE/harq_nr.c @@ -123,7 +123,7 @@ void config_uplink_harq_process(PHY_VARS_NR_UE *ue, int gNB_id, int thread_id, i memset(ulsch,0,sizeof(NR_UE_ULSCH_t)); - ue->ulsch[thread_id][gNB_id][code_word_idx] = ulsch; + ue->ulsch[thread_id][gNB_id] = ulsch; } else { LOG_E(PHY, "Fatal memory allocation problem at line %d in function %s of file %s \n", __LINE__ , __func__, __FILE__); @@ -148,7 +148,7 @@ void config_uplink_harq_process(PHY_VARS_NR_UE *ue, int gNB_id, int thread_id, i } for (int slot_tx = 0; slot_tx < NR_MAX_SLOTS_PER_FRAME; slot_tx++) { - ue->ulsch[thread_id][gNB_id][code_word_idx]->harq_process_id[slot_tx] = NR_MAX_HARQ_PROCESSES; + ue->ulsch[thread_id][gNB_id]->harq_process_id[slot_tx] = NR_MAX_HARQ_PROCESSES; } } @@ -167,7 +167,7 @@ void config_uplink_harq_process(PHY_VARS_NR_UE *ue, int gNB_id, int thread_id, i void release_uplink_harq_process(PHY_VARS_NR_UE *ue, int gNB_id, int thread_id, int code_word_idx) { - NR_UE_ULSCH_t *ulsch = ue->ulsch[thread_id][gNB_id][code_word_idx]; + NR_UE_ULSCH_t *ulsch = ue->ulsch[thread_id][gNB_id]; for (int process_id = 0; process_id < ulsch->number_harq_processes_for_pusch; process_id++) { @@ -178,7 +178,7 @@ void release_uplink_harq_process(PHY_VARS_NR_UE *ue, int gNB_id, int thread_id, free16(ulsch, sizeof(NR_UE_ULSCH_t)); - ue->ulsch[thread_id][gNB_id][code_word_idx] = NULL; + ue->ulsch[thread_id][gNB_id] = NULL; } /******************************************************************* diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c index b0ad4b4a83..81b747e950 100644 --- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c +++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c @@ -291,8 +291,8 @@ void phy_procedures_nrUE_TX(PHY_VARS_NR_UE *ue, if (ue->UE_mode[gNB_id] <= PUSCH){ - for (uint8_t harq_pid = 0; harq_pid < ue->ulsch[proc->thread_id][gNB_id][0]->number_harq_processes_for_pusch; harq_pid++) { - if (ue->ulsch[proc->thread_id][gNB_id][0]->harq_processes[harq_pid]->status == ACTIVE) + for (uint8_t harq_pid = 0; harq_pid < ue->ulsch[proc->thread_id][gNB_id]->number_harq_processes_for_pusch; harq_pid++) { + if (ue->ulsch[proc->thread_id][gNB_id]->harq_processes[harq_pid]->status == ACTIVE) nr_ue_ulsch_procedures(ue, harq_pid, frame_tx, slot_tx, proc->thread_id, gNB_id); } diff --git a/openair1/SIMULATION/NR_PHY/ulschsim.c b/openair1/SIMULATION/NR_PHY/ulschsim.c index 94aea36a67..007fd18ac6 100644 --- a/openair1/SIMULATION/NR_PHY/ulschsim.c +++ b/openair1/SIMULATION/NR_PHY/ulschsim.c @@ -407,15 +407,10 @@ int main(int argc, char **argv) } for (sf = 0; sf < 2; sf++) { - for (i = 0; i < 2; i++) { - - UE->ulsch[sf][0][i] = new_nr_ue_ulsch(N_RB_UL, 8, 0); - - if (!UE->ulsch[sf][0][i]) { - printf("Can't get ue ulsch structures.\n"); - exit(-1); - } - + UE->ulsch[sf][0] = new_nr_ue_ulsch(N_RB_UL, 8, 0); + if (!UE->ulsch[sf][0]) { + printf("Can't get ue ulsch structures.\n"); + exit(-1); } } @@ -435,7 +430,7 @@ int main(int argc, char **argv) NR_UL_gNB_HARQ_t *harq_process_gNB = ulsch_gNB->harq_processes[harq_pid]; nfapi_nr_pusch_pdu_t *rel15_ul = &harq_process_gNB->ulsch_pdu; - NR_UE_ULSCH_t *ulsch_ue = UE->ulsch[0][0][0]; + NR_UE_ULSCH_t *ulsch_ue = UE->ulsch[0][0]; mod_order = nr_get_Qm_ul(Imcs, 0); code_rate = nr_get_code_rate_ul(Imcs, 0); @@ -532,7 +527,7 @@ int main(int argc, char **argv) } */ - if (ulsch_ue->g[i] == 0) + if (ulsch_ue->harq_processes[harq_pid]->f[i] == 0) modulated_input[i] = 1.0; ///sqrt(2); //QPSK else modulated_input[i] = -1.0; ///sqrt(2); diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c index ac991ae940..329415a87c 100644 --- a/openair1/SIMULATION/NR_PHY/ulsim.c +++ b/openair1/SIMULATION/NR_PHY/ulsim.c @@ -814,7 +814,7 @@ int main(int argc, char **argv) nfapi_nr_pusch_pdu_t *pusch_pdu = &UL_tti_req->pdus_list[0].pusch_pdu; - NR_UE_ULSCH_t **ulsch_ue = UE->ulsch[0][0]; + NR_UE_ULSCH_t *ulsch_ue = UE->ulsch[0][0]; unsigned char *estimated_output_bit; unsigned char *test_input_bit; @@ -1045,7 +1045,7 @@ int main(int argc, char **argv) memset((void*)roundStats,0,50*sizeof(roundStats[0])); while (roundharq_processes[harq_pid]->round = round; + ulsch_ue->harq_processes[harq_pid]->round = round; gNB->ulsch[0][0]->harq_processes[harq_pid]->round = round; rv_index = nr_rv_round_map[round]; @@ -1187,7 +1187,7 @@ int main(int argc, char **argv) //nr_fill_ulsch(gNB,frame,slot,pusch_pdu); // Not needed as its its already filled as apart of "nr_schedule_response(Sched_INFO);" - for (int i=0;i<(TBS/8);i++) ulsch_ue[0]->harq_processes[harq_pid]->a[i]=i&0xff; + for (int i=0;i<(TBS/8);i++) ulsch_ue->harq_processes[harq_pid]->a[i]=i&0xff; if (input_fd == NULL) { // set FAPI parameters for UE, put them in the scheduled response and call @@ -1388,8 +1388,8 @@ int main(int argc, char **argv) for (i = 0; i < available_bits; i++) { - if(((ulsch_ue[0]->g[i] == 0) && (gNB->pusch_vars[UE_id]->llr[i] <= 0)) || - ((ulsch_ue[0]->g[i] == 1) && (gNB->pusch_vars[UE_id]->llr[i] >= 0))) + if(((ulsch_ue->harq_processes[harq_pid]->f[i] == 0) && (gNB->pusch_vars[UE_id]->llr[i] <= 0)) || + ((ulsch_ue->harq_processes[harq_pid]->f[i] == 1) && (gNB->pusch_vars[UE_id]->llr[i] >= 0))) { /*if(errors_scrambling == 0) printf("\x1B[34m" "[frame %d][trial %d]\t1st bit in error in unscrambling = %d\n" "\x1B[0m", frame, trial, i);*/ @@ -1407,7 +1407,7 @@ int main(int argc, char **argv) for (i = 0; i < TBS; i++) { estimated_output_bit[i] = (ulsch_gNB->harq_processes[harq_pid]->b[i/8] & (1 << (i & 7))) >> (i & 7); - test_input_bit[i] = (ulsch_ue[0]->harq_processes[harq_pid]->b[i/8] & (1 << (i & 7))) >> (i & 7); + test_input_bit[i] = (ulsch_ue->harq_processes[harq_pid]->b[i/8] & (1 << (i & 7))) >> (i & 7); if (estimated_output_bit[i] != test_input_bit[i]) { /*if(errors_decoding == 0) @@ -1416,13 +1416,13 @@ int main(int argc, char **argv) } } if (n_trials == 1) { - for (int r=0;rharq_processes[harq_pid]->C;r++) - for (int i=0;iharq_processes[harq_pid]->K>>3;i++) { - if ((ulsch_ue[0]->harq_processes[harq_pid]->c[r][i]^ulsch_gNB->harq_processes[harq_pid]->c[r][i]) != 0) printf("************"); + for (int r=0;rharq_processes[harq_pid]->C;r++) + for (int i=0;iharq_processes[harq_pid]->K>>3;i++) { + if ((ulsch_ue->harq_processes[harq_pid]->c[r][i]^ulsch_gNB->harq_processes[harq_pid]->c[r][i]) != 0) printf("************"); /*printf("r %d: in[%d] %x, out[%d] %x (%x)\n",r, - i,ulsch_ue[0]->harq_processes[harq_pid]->c[r][i], + i,ulsch_ue->harq_processes[harq_pid]->c[r][i], i,ulsch_gNB->harq_processes[harq_pid]->c[r][i], - ulsch_ue[0]->harq_processes[harq_pid]->c[r][i]^ulsch_gNB->harq_processes[harq_pid]->c[r][i]);*/ + ulsch_ue->harq_processes[harq_pid]->c[r][i]^ulsch_gNB->harq_processes[harq_pid]->c[r][i]);*/ } } if (errors_decoding > 0 && error_flag == 0) { From 467172f44d141385520c926a24c580c8529f7a31 Mon Sep 17 00:00:00 2001 From: francescomani Date: Thu, 27 Jan 2022 11:59:55 +0100 Subject: [PATCH 17/96] removing pusch 2nd codeword also at gnb --- executables/nr-gnb.c | 13 ++++++------- openair1/PHY/INIT/nr_init.c | 14 ++++---------- openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c | 2 +- openair1/PHY/NR_TRANSPORT/nr_transport_proto.h | 2 +- openair1/PHY/NR_TRANSPORT/nr_ulsch.c | 13 ++++++------- openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c | 2 +- openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c | 6 +++--- openair1/PHY/defs_gNB.h | 2 +- openair1/SCHED_NR/phy_procedures_nr_gNB.c | 12 ++++++------ openair1/SIMULATION/NR_PHY/ulschsim.c | 2 +- openair1/SIMULATION/NR_PHY/ulsim.c | 8 ++++---- 11 files changed, 34 insertions(+), 42 deletions(-) diff --git a/executables/nr-gnb.c b/executables/nr-gnb.c index 9551a71921..ba488d5170 100644 --- a/executables/nr-gnb.c +++ b/executables/nr-gnb.c @@ -177,15 +177,14 @@ void rx_func(void *param) { void clean_gNB_dlsch(NR_gNB_DLSCH_t *dlsch); int j; for (j = 0; j < NUMBER_OF_NR_ULSCH_MAX; j++) - if (gNB->ulsch[j][0]->rnti == rnti_to_remove[i]) { - gNB->ulsch[j][0]->rnti = 0; - gNB->ulsch[j][0]->harq_mask = 0; - //clean_gNB_ulsch(gNB->ulsch[j][0]); + if (gNB->ulsch[j]->rnti == rnti_to_remove[i]) { + gNB->ulsch[j]->rnti = 0; + gNB->ulsch[j]->harq_mask = 0; int h; for (h = 0; h < NR_MAX_ULSCH_HARQ_PROCESSES; h++) { - gNB->ulsch[j][0]->harq_processes[h]->status = SCH_IDLE; - gNB->ulsch[j][0]->harq_processes[h]->round = 0; - gNB->ulsch[j][0]->harq_processes[h]->handled = 0; + gNB->ulsch[j]->harq_processes[h]->status = SCH_IDLE; + gNB->ulsch[j]->harq_processes[h]->round = 0; + gNB->ulsch[j]->harq_processes[h]->handled = 0; } up_removed++; } diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c index 9e1e472fd6..aa09f84028 100644 --- a/openair1/PHY/INIT/nr_init.c +++ b/openair1/PHY/INIT/nr_init.c @@ -550,21 +550,15 @@ void init_nr_transport(PHY_VARS_gNB *gNB) { LOG_I(PHY,"Allocating Transport Channel Buffer for ULSCH %d/%d\n",i,gNB->number_of_nr_ulsch_max); - for (int j=0; j<2; j++) { - // ULSCH for data - gNB->ulsch[i][j] = new_gNB_ulsch(MAX_LDPC_ITERATIONS, fp->N_RB_UL, 0); - - if (!gNB->ulsch[i][j]) { - LOG_E(PHY,"Can't get gNB ulsch structures\n"); - exit(-1); - } + gNB->ulsch[i] = new_gNB_ulsch(MAX_LDPC_ITERATIONS, fp->N_RB_UL, 0); + if (!gNB->ulsch[i]) { + LOG_E(PHY,"Can't get gNB ulsch structures\n"); + exit(-1); } - } gNB->rx_total_gain_dB=130; - //fp->pucch_config_common.deltaPUCCH_Shift = 1; } diff --git a/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c b/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c index cfb5a2e56e..f4761489f5 100644 --- a/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c +++ b/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c @@ -184,7 +184,7 @@ void nr_gnb_measurements(PHY_VARS_gNB *gNB, uint8_t ulsch_id, unsigned char harq PHY_MEASUREMENTS_gNB *meas = &gNB->measurements; NR_DL_FRAME_PARMS *fp = &gNB->frame_parms; int ch_offset = fp->ofdm_symbol_size * symbol; - int N_RB_UL = gNB->ulsch[ulsch_id][0]->harq_processes[harq_pid]->ulsch_pdu.rb_size; + int N_RB_UL = gNB->ulsch[ulsch_id]->harq_processes[harq_pid]->ulsch_pdu.rb_size; rx_power_tot[ulsch_id] = 0; diff --git a/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h b/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h index 4fed3a468f..d9cc2be07c 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h +++ b/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h @@ -147,7 +147,7 @@ void nr_ulsch_extract_rbs_single(int32_t **rxdataF, void nr_ulsch_scale_channel(int32_t **ul_ch_estimates_ext, NR_DL_FRAME_PARMS *frame_parms, - NR_gNB_ULSCH_t **ulsch_gNB, + NR_gNB_ULSCH_t *ulsch_gNB, uint8_t symbol, uint8_t start_symbol, uint16_t nb_rb, diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch.c index 4278338dbc..c7c7fdd2d4 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_ulsch.c +++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch.c @@ -43,15 +43,14 @@ int16_t find_nr_ulsch(uint16_t rnti, PHY_VARS_gNB *gNB,find_type_t type) { AssertFatal(gNB!=NULL,"gNB is null\n"); for (i=0; inumber_of_nr_ulsch_max; i++) { AssertFatal(gNB->ulsch[i]!=NULL,"gNB->ulsch[%d] is null\n",i); - AssertFatal(gNB->ulsch[i][0]!=NULL,"gNB->ulsch[%d][0] is null\n",i); - LOG_D(PHY,"searching for rnti %x : ulsch_index %d=> harq_mask %x, rnti %x, first_free_index %d\n", rnti,i,gNB->ulsch[i][0]->harq_mask,gNB->ulsch[i][0]->rnti,first_free_index); - if ((gNB->ulsch[i][0]->harq_mask >0) && - (gNB->ulsch[i][0]->rnti==rnti)) return i; - else if ((gNB->ulsch[i][0]->harq_mask == 0) && (first_free_index==-1)) first_free_index=i; + LOG_D(PHY,"searching for rnti %x : ulsch_index %d=> harq_mask %x, rnti %x, first_free_index %d\n", rnti,i,gNB->ulsch[i]->harq_mask,gNB->ulsch[i]->rnti,first_free_index); + if ((gNB->ulsch[i]->harq_mask >0) && + (gNB->ulsch[i]->rnti==rnti)) return i; + else if ((gNB->ulsch[i]->harq_mask == 0) && (first_free_index==-1)) first_free_index=i; } if (type == SEARCH_EXIST) return -1; if (first_free_index != -1) - gNB->ulsch[first_free_index][0]->rnti = 0; + gNB->ulsch[first_free_index]->rnti = 0; return first_free_index; } @@ -65,7 +64,7 @@ void nr_fill_ulsch(PHY_VARS_gNB *gNB, AssertFatal( (ulsch_id>=0) && (ulsch_idnumber_of_nr_ulsch_max), "illegal or no ulsch_id found!!! rnti %04x ulsch_id %d\n",ulsch_pdu->rnti,ulsch_id); - NR_gNB_ULSCH_t *ulsch = gNB->ulsch[ulsch_id][0]; + NR_gNB_ULSCH_t *ulsch = gNB->ulsch[ulsch_id]; int harq_pid = ulsch_pdu->pusch_data.harq_process_id; ulsch->rnti = ulsch_pdu->rnti; //ulsch->rnti_type; diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c index 5286fe8780..08592daccc 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c +++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c @@ -428,7 +428,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, #endif - NR_gNB_ULSCH_t *ulsch = phy_vars_gNB->ulsch[ULSCH_id][0]; + NR_gNB_ULSCH_t *ulsch = phy_vars_gNB->ulsch[ULSCH_id]; NR_gNB_PUSCH *pusch = phy_vars_gNB->pusch_vars[ULSCH_id]; NR_UL_gNB_HARQ_t *harq_process = ulsch->harq_processes[harq_pid]; diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c index 681a9eae16..03cee5afa1 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c +++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c @@ -403,7 +403,7 @@ void nr_ulsch_extract_rbs_single(int32_t **rxdataF, void nr_ulsch_scale_channel(int **ul_ch_estimates_ext, NR_DL_FRAME_PARMS *frame_parms, - NR_gNB_ULSCH_t **ulsch_gNB, + NR_gNB_ULSCH_t *ulsch_gNB, uint8_t symbol, uint8_t is_dmrs_symbol, unsigned short nb_rb, @@ -418,7 +418,7 @@ void nr_ulsch_scale_channel(int **ul_ch_estimates_ext, // Determine scaling amplitude based the symbol - ch_amp = 1024*8; //((pilots) ? (ulsch_gNB[0]->sqrt_rho_b) : (ulsch_gNB[0]->sqrt_rho_a)); + ch_amp = 1024*8; //((pilots) ? (ulsch_gNB->sqrt_rho_b) : (ulsch_gNB->sqrt_rho_a)); LOG_D(PHY,"Scaling PUSCH Chest in OFDM symbol %d by %d, pilots %d nb_rb %d NCP %d symbol %d\n", symbol, ch_amp, is_dmrs_symbol, nb_rb, frame_parms->Ncp, symbol); // printf("Scaling PUSCH Chest in OFDM symbol %d by %d\n",symbol_mod,ch_amp); @@ -1177,7 +1177,7 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB, int avgs = 0; NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms; - nfapi_nr_pusch_pdu_t *rel15_ul = &gNB->ulsch[ulsch_id][0]->harq_processes[harq_pid]->ulsch_pdu; + nfapi_nr_pusch_pdu_t *rel15_ul = &gNB->ulsch[ulsch_id]->harq_processes[harq_pid]->ulsch_pdu; int avg[frame_parms->nb_antennas_rx*rel15_ul->nrOfLayers]; gNB->pusch_vars[ulsch_id]->dmrs_symbol = INVALID_VALUE; diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h index edcac7a91d..68e8bf0fd2 100644 --- a/openair1/PHY/defs_gNB.h +++ b/openair1/PHY/defs_gNB.h @@ -761,7 +761,7 @@ typedef struct PHY_VARS_gNB_s { NR_gNB_PDCCH_t pdcch_pdu[NUMBER_OF_NR_PDCCH_MAX]; NR_gNB_UL_PDCCH_t ul_pdcch_pdu[NUMBER_OF_NR_PDCCH_MAX]; NR_gNB_DLSCH_t *dlsch[NUMBER_OF_NR_DLSCH_MAX][2]; // Nusers times two spatial streams - NR_gNB_ULSCH_t *ulsch[NUMBER_OF_NR_ULSCH_MAX][2]; // [Nusers times][2 codewords] + NR_gNB_ULSCH_t *ulsch[NUMBER_OF_NR_ULSCH_MAX]; // [Nusers times] NR_gNB_DLSCH_t *dlsch_SI,*dlsch_ra,*dlsch_p; NR_gNB_DLSCH_t *dlsch_PCH; /// statistics for DLSCH measurement collection diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index c86f5bd682..581ab626cd 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -225,7 +225,7 @@ void nr_postDecode(PHY_VARS_gNB *gNB, notifiedFIFO_elt_t *req) { NR_UL_gNB_HARQ_t *ulsch_harq = rdata->ulsch_harq; NR_gNB_ULSCH_t *ulsch = rdata->ulsch; int r = rdata->segment_r; - nfapi_nr_pusch_pdu_t *pusch_pdu = &gNB->ulsch[rdata->ulsch_id][0]->harq_processes[rdata->harq_pid]->ulsch_pdu; + nfapi_nr_pusch_pdu_t *pusch_pdu = &gNB->ulsch[rdata->ulsch_id]->harq_processes[rdata->harq_pid]->ulsch_pdu; bool decodeSuccess = (rdata->decodeIterations <= rdata->decoderParms.numMaxIter); ulsch_harq->processedSegments++; @@ -330,7 +330,7 @@ void nr_postDecode(PHY_VARS_gNB *gNB, notifiedFIFO_elt_t *req) { void nr_ulsch_procedures(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx, int ULSCH_id, uint8_t harq_pid) { NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms; - nfapi_nr_pusch_pdu_t *pusch_pdu = &gNB->ulsch[ULSCH_id][0]->harq_processes[harq_pid]->ulsch_pdu; + nfapi_nr_pusch_pdu_t *pusch_pdu = &gNB->ulsch[ULSCH_id]->harq_processes[harq_pid]->ulsch_pdu; uint8_t l, number_dmrs_symbols = 0; uint32_t G; @@ -407,13 +407,13 @@ void nr_fill_indication(PHY_VARS_gNB *gNB, int frame, int slot_rx, int ULSCH_id, pthread_mutex_lock(&gNB->UL_INFO_mutex); - NR_gNB_ULSCH_t *ulsch = gNB->ulsch[ULSCH_id][0]; + NR_gNB_ULSCH_t *ulsch = gNB->ulsch[ULSCH_id]; NR_UL_gNB_HARQ_t *harq_process = ulsch->harq_processes[harq_pid]; NR_gNB_SCH_STATS_t *stats=get_ulsch_stats(gNB,ulsch); nfapi_nr_pusch_pdu_t *pusch_pdu = &harq_process->ulsch_pdu; - // pdu->data = gNB->ulsch[ULSCH_id+1][0]->harq_processes[harq_pid]->b; + // pdu->data = gNB->ulsch[ULSCH_id+1]->harq_processes[harq_pid]->b; int sync_pos = nr_est_timing_advance_pusch(gNB, ULSCH_id); // estimate timing advance for MAC // scale the 16 factor in N_TA calculation in 38.213 section 4.2 according to the used FFT size @@ -576,7 +576,7 @@ void fill_ul_rb_mask(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) { } for (int ULSCH_id=0;ULSCH_idnumber_of_nr_ulsch_max;ULSCH_id++) { - NR_gNB_ULSCH_t *ulsch = gNB->ulsch[ULSCH_id][0]; + NR_gNB_ULSCH_t *ulsch = gNB->ulsch[ULSCH_id]; int harq_pid; NR_UL_gNB_HARQ_t *ulsch_harq; if ((ulsch) && @@ -722,7 +722,7 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) { } for (int ULSCH_id=0;ULSCH_idnumber_of_nr_ulsch_max;ULSCH_id++) { - NR_gNB_ULSCH_t *ulsch = gNB->ulsch[ULSCH_id][0]; + NR_gNB_ULSCH_t *ulsch = gNB->ulsch[ULSCH_id]; int harq_pid; int no_sig; NR_UL_gNB_HARQ_t *ulsch_harq; diff --git a/openair1/SIMULATION/NR_PHY/ulschsim.c b/openair1/SIMULATION/NR_PHY/ulschsim.c index 007fd18ac6..aaf37c9fd1 100644 --- a/openair1/SIMULATION/NR_PHY/ulschsim.c +++ b/openair1/SIMULATION/NR_PHY/ulschsim.c @@ -426,7 +426,7 @@ int main(int argc, char **argv) uint8_t rvidx = 0; uint8_t UE_id = 0; - NR_gNB_ULSCH_t *ulsch_gNB = gNB->ulsch[UE_id][0]; + NR_gNB_ULSCH_t *ulsch_gNB = gNB->ulsch[UE_id]; NR_UL_gNB_HARQ_t *harq_process_gNB = ulsch_gNB->harq_processes[harq_pid]; nfapi_nr_pusch_pdu_t *rel15_ul = &harq_process_gNB->ulsch_pdu; diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c index 329415a87c..3028db21e4 100644 --- a/openair1/SIMULATION/NR_PHY/ulsim.c +++ b/openair1/SIMULATION/NR_PHY/ulsim.c @@ -805,7 +805,7 @@ int main(int argc, char **argv) unsigned char harq_pid = 0; - NR_gNB_ULSCH_t *ulsch_gNB = gNB->ulsch[UE_id][0]; + NR_gNB_ULSCH_t *ulsch_gNB = gNB->ulsch[UE_id]; //nfapi_nr_ul_config_ulsch_pdu *rel15_ul = &ulsch_gNB->harq_processes[harq_pid]->ulsch_pdu; nfapi_nr_ul_tti_request_t *UL_tti_req = malloc(sizeof(*UL_tti_req)); NR_Sched_Rsp_t *Sched_INFO = malloc(sizeof(*Sched_INFO)); @@ -1046,7 +1046,7 @@ int main(int argc, char **argv) while (roundharq_processes[harq_pid]->round = round; - gNB->ulsch[0][0]->harq_processes[harq_pid]->round = round; + gNB->ulsch[0]->harq_processes[harq_pid]->round = round; rv_index = nr_rv_round_map[round]; UE_proc.thread_id = 0; @@ -1362,8 +1362,8 @@ int main(int argc, char **argv) } //////////////////////////////////////////////////////////// - if ((gNB->ulsch[0][0]->last_iteration_cnt >= - gNB->ulsch[0][0]->max_ldpc_iterations+1) || ul_proc_error == 1) { + if ((gNB->ulsch[0]->last_iteration_cnt >= + gNB->ulsch[0]->max_ldpc_iterations+1) || ul_proc_error == 1) { error_flag = 1; n_errors[round][snrRun]++; crc_status = 1; From 2cad62ad54260fc7870c76ec4a7a4c53bc967ca5 Mon Sep 17 00:00:00 2001 From: francescomani Date: Thu, 27 Jan 2022 14:36:44 +0100 Subject: [PATCH 18/96] fix for 256qam in initialDownlinkBWP --- openair2/RRC/NR/MESSAGES/asn1_msg.c | 21 +++++++++++++++------ openair2/RRC/NR/nr_rrc_config.c | 15 ++++++++------- openair2/RRC/NR/nr_rrc_config.h | 4 +++- openair2/RRC/NR/rrc_gNB_reconfig.c | 2 +- 4 files changed, 27 insertions(+), 15 deletions(-) diff --git a/openair2/RRC/NR/MESSAGES/asn1_msg.c b/openair2/RRC/NR/MESSAGES/asn1_msg.c index 3fcd4a2d42..116f1e1ba2 100755 --- a/openair2/RRC/NR/MESSAGES/asn1_msg.c +++ b/openair2/RRC/NR/MESSAGES/asn1_msg.c @@ -1401,12 +1401,21 @@ void update_cellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig, rrc_gNB_carrier_data_t *carrier, NR_UE_NR_Capability_t *uecap) { - NR_SpCellConfig_t *SpCellConfig = cellGroupConfig->spCellConfig; - struct NR_ServingCellConfig__downlinkBWP_ToAddModList *DL_BWP_list = SpCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList; - for (int i=0; ilist.count; i++){ - NR_BWP_Downlink_t *bwp = DL_BWP_list->list.array[i]; - set_dl_mcs_table(bwp, carrier->servingcellconfigcommon, uecap); - } + NR_SpCellConfig_t *SpCellConfig = cellGroupConfig->spCellConfig; + NR_ServingCellConfigCommon_t *scc = carrier->servingcellconfigcommon; + + NR_BWP_DownlinkDedicated_t *bwp_Dedicated = SpCellConfig->spCellConfigDedicated->initialDownlinkBWP; + set_dl_mcs_table(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.subcarrierSpacing, + uecap, bwp_Dedicated, scc); + + struct NR_ServingCellConfig__downlinkBWP_ToAddModList *DL_BWP_list = SpCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList; + if (DL_BWP_list) { + for (int i=0; ilist.count; i++){ + NR_BWP_Downlink_t *bwp = DL_BWP_list->list.array[i]; + int scs = bwp->bwp_Common->genericParameters.subcarrierSpacing; + set_dl_mcs_table(scs, uecap, bwp->bwp_Dedicated, carrier->servingcellconfigcommon); + } + } } void fill_initial_cellGroupConfig(rnti_t rnti, diff --git a/openair2/RRC/NR/nr_rrc_config.c b/openair2/RRC/NR/nr_rrc_config.c index e3d7a6430c..06aa32cb44 100644 --- a/openair2/RRC/NR/nr_rrc_config.c +++ b/openair2/RRC/NR/nr_rrc_config.c @@ -149,15 +149,16 @@ void nr_rrc_config_ul_tda(NR_ServingCellConfigCommon_t *scc, int min_fb_delay){ } -void set_dl_mcs_table(NR_BWP_Downlink_t *bwp, NR_ServingCellConfigCommon_t *scc, NR_UE_NR_Capability_t *cap) { +void set_dl_mcs_table(int scs, NR_UE_NR_Capability_t *cap, + NR_BWP_DownlinkDedicated_t *bwp_Dedicated, + NR_ServingCellConfigCommon_t *scc) { if (cap == NULL){ - bwp->bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table = NULL; + bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table = NULL; return; } int band = *scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0]; - int scs = bwp->bwp_Common->genericParameters.subcarrierSpacing; struct NR_FrequencyInfoDL__scs_SpecificCarrierList scs_list = scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList; int bw_rb = -1; for(int i=0; ibwp_Dedicated->pdsch_Config->choice.setup->mcs_Table == NULL) - bwp->bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table = calloc(1, sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table)); - *bwp->bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table = NR_PDSCH_Config__mcs_Table_qam256; + if(bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table == NULL) + bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table = calloc(1, sizeof(*bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table)); + *bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table = NR_PDSCH_Config__mcs_Table_qam256; } else - bwp->bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table = NULL; + bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table = NULL; } diff --git a/openair2/RRC/NR/nr_rrc_config.h b/openair2/RRC/NR/nr_rrc_config.h index e8a2ab4518..1a0d091e35 100644 --- a/openair2/RRC/NR/nr_rrc_config.h +++ b/openair2/RRC/NR/nr_rrc_config.h @@ -113,7 +113,9 @@ typedef struct physicalcellgroup_s{ void nr_rrc_config_dl_tda(NR_ServingCellConfigCommon_t *scc); void nr_rrc_config_ul_tda(NR_ServingCellConfigCommon_t *scc, int min_fb_delay); -void set_dl_mcs_table(NR_BWP_Downlink_t *bwp, NR_ServingCellConfigCommon_t *scc, NR_UE_NR_Capability_t *cap); +void set_dl_mcs_table(int scs, NR_UE_NR_Capability_t *cap, + NR_BWP_DownlinkDedicated_t *bwp_Dedicated, + NR_ServingCellConfigCommon_t *scc); void prepare_sim_uecap(NR_UE_NR_Capability_t *cap, NR_ServingCellConfigCommon_t *scc, int numerology, diff --git a/openair2/RRC/NR/rrc_gNB_reconfig.c b/openair2/RRC/NR/rrc_gNB_reconfig.c index 3b013ac88b..df29995be0 100644 --- a/openair2/RRC/NR/rrc_gNB_reconfig.c +++ b/openair2/RRC/NR/rrc_gNB_reconfig.c @@ -594,7 +594,7 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco bwp->bwp_Dedicated->pdsch_Config->choice.setup->rateMatchPatternGroup1=NULL; bwp->bwp_Dedicated->pdsch_Config->choice.setup->rateMatchPatternGroup2=NULL; bwp->bwp_Dedicated->pdsch_Config->choice.setup->rbg_Size=NR_PDSCH_Config__rbg_Size_config1; - set_dl_mcs_table(bwp, servingcellconfigcommon, uecap); + set_dl_mcs_table(bwp->bwp_Common->genericParameters.subcarrierSpacing, uecap, bwp->bwp_Dedicated, servingcellconfigcommon); bwp->bwp_Dedicated->pdsch_Config->choice.setup->maxNrofCodeWordsScheduledByDCI = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->maxNrofCodeWordsScheduledByDCI)); *bwp->bwp_Dedicated->pdsch_Config->choice.setup->maxNrofCodeWordsScheduledByDCI = NR_PDSCH_Config__maxNrofCodeWordsScheduledByDCI_n1; bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.present = NR_PDSCH_Config__prb_BundlingType_PR_staticBundling; From c95f54456353f3b99c978c99570493fd4c11a68b Mon Sep 17 00:00:00 2001 From: francescomani Date: Mon, 31 Jan 2022 11:17:45 +0100 Subject: [PATCH 19/96] dynamic dmrs length initialization depending on actual RBs --- openair1/PHY/INIT/nr_init.c | 18 ++++++++++---- openair1/PHY/INIT/nr_init_ue.c | 28 ++++++++++++---------- openair1/PHY/INIT/nr_parms.c | 1 - openair1/PHY/NR_REFSIG/nr_gold.c | 15 +++++++----- openair1/PHY/NR_REFSIG/nr_gold_ue.c | 18 +++++++------- openair1/PHY/NR_TRANSPORT/nr_csi_rs.c | 6 +++-- openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c | 6 ++--- openair1/PHY/defs_nr_UE.h | 2 +- openair1/PHY/defs_nr_common.h | 13 ---------- 9 files changed, 56 insertions(+), 51 deletions(-) diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c index aa09f84028..9a2e8c91cb 100644 --- a/openair1/PHY/INIT/nr_init.c +++ b/openair1/PHY/INIT/nr_init.c @@ -118,12 +118,15 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB, gNB->bad_pucch = 0; + // ceil(((NB_RB<<1)*3)/32) // 3 RE *2(QPSK) + int pdcch_dmrs_init_length = (((fp->N_RB_DL<<1)*3)>>5)+1; + for (int slot=0; slotslots_per_frame; slot++) { pdcch_dmrs[slot] = (uint32_t **)malloc16(fp->symbols_per_slot*sizeof(uint32_t *)); AssertFatal(pdcch_dmrs[slot]!=NULL, "NR init: pdcch_dmrs for slot %d - malloc failed\n", slot); for (int symb=0; symbsymbols_per_slot; symb++) { - pdcch_dmrs[slot][symb] = (uint32_t *)malloc16(NR_MAX_PDCCH_DMRS_INIT_LENGTH_DWORD*sizeof(uint32_t)); + pdcch_dmrs[slot][symb] = (uint32_t *)malloc16(pdcch_dmrs_init_length*sizeof(uint32_t)); LOG_D(PHY,"pdcch_dmrs[%d][%d] %p\n",slot,symb,pdcch_dmrs[slot][symb]); AssertFatal(pdcch_dmrs[slot][symb]!=NULL, "NR init: pdcch_dmrs for slot %d symbol %d - malloc failed\n", slot, symb); } @@ -137,6 +140,8 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB, gNB->nr_gold_pdsch_dmrs = (uint32_t ****)malloc16(fp->slots_per_frame*sizeof(uint32_t ***)); uint32_t ****pdsch_dmrs = gNB->nr_gold_pdsch_dmrs; + // ceil(((NB_RB*6(k)*2(QPSK)/32) // 3 RE *2(QPSK) + int pdsch_dmrs_init_length = ((fp->N_RB_DL*12)>>5)+1; for (int slot=0; slotslots_per_frame; slot++) { pdsch_dmrs[slot] = (uint32_t ***)malloc16(fp->symbols_per_slot*sizeof(uint32_t **)); AssertFatal(pdsch_dmrs[slot]!=NULL, "NR init: pdsch_dmrs for slot %d - malloc failed\n", slot); @@ -146,7 +151,7 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB, AssertFatal(pdsch_dmrs[slot][symb]!=NULL, "NR init: pdsch_dmrs for slot %d symbol %d - malloc failed\n", slot, symb); for (int q=0; qnr_gold_pusch_dmrs; + // ceil(((NB_RB*6(k)*2(QPSK)/32) // 3 RE *2(QPSK) + int pusch_dmrs_init_length = ((fp->N_RB_UL*12)>>5)+1; for(int nscid=0; nscid<2; nscid++) { pusch_dmrs[nscid] = (uint32_t ***)malloc16(fp->slots_per_frame*sizeof(uint32_t **)); AssertFatal(pusch_dmrs[nscid]!=NULL, "NR init: pusch_dmrs for nscid %d - malloc failed\n", nscid); @@ -168,7 +175,7 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB, AssertFatal(pusch_dmrs[nscid][slot]!=NULL, "NR init: pusch_dmrs for slot %d - malloc failed\n", slot); for (int symb=0; symbsymbols_per_slot; symb++) { - pusch_dmrs[nscid][slot][symb] = (uint32_t *)malloc16(NR_MAX_PUSCH_DMRS_INIT_LENGTH_DWORD*sizeof(uint32_t)); + pusch_dmrs[nscid][slot][symb] = (uint32_t *)malloc16(pusch_dmrs_init_length*sizeof(uint32_t)); AssertFatal(pusch_dmrs[nscid][slot][symb]!=NULL, "NR init: pusch_dmrs for slot %d symbol %d - malloc failed\n", slot, symb); } } @@ -183,12 +190,15 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB, uint32_t ***csi_rs = gNB->nr_gold_csi_rs; AssertFatal(csi_rs!=NULL, "NR init: csi reference signal malloc failed\n"); + // ceil((NB_RB*8(max allocation per RB)*2(QPSK))/32) + int csi_dmrs_init_length = ((fp->N_RB_DL<<4)>>5)+1; + for (int slot=0; slotslots_per_frame; slot++) { csi_rs[slot] = (uint32_t **)malloc16(fp->symbols_per_slot*sizeof(uint32_t *)); AssertFatal(csi_rs[slot]!=NULL, "NR init: csi reference signal for slot %d - malloc failed\n", slot); for (int symb=0; symbsymbols_per_slot; symb++) { - csi_rs[slot][symb] = (uint32_t *)malloc16(NR_MAX_CSI_RS_INIT_LENGTH_DWORD*sizeof(uint32_t)); + csi_rs[slot][symb] = (uint32_t *)malloc16(csi_dmrs_init_length*sizeof(uint32_t)); AssertFatal(csi_rs[slot][symb]!=NULL, "NR init: csi reference signal for slot %d symbol %d - malloc failed\n", slot, symb); } } diff --git a/openair1/PHY/INIT/nr_init_ue.c b/openair1/PHY/INIT/nr_init_ue.c index 99f869c9b7..a38cb1d93f 100644 --- a/openair1/PHY/INIT/nr_init_ue.c +++ b/openair1/PHY/INIT/nr_init_ue.c @@ -137,10 +137,9 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, NR_UE_COMMON *const common_vars = &ue->common_vars; NR_UE_PBCH **const pbch_vars = ue->pbch_vars; NR_UE_PRACH **const prach_vars = ue->prach_vars; - int i,j,k,l,slot,symb,q; + int i,j,k,l,slot,symb; int gNB_id; int th_id; - uint32_t ****pusch_dmrs; uint16_t N_n_scid[2] = {0,1}; // [HOTFIX] This is a temporary implementation of scramblingID0 and scramblingID1 which are given by DMRS-UplinkConfig int n_scid; abstraction_flag = 0; @@ -197,22 +196,22 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, /////////////////////////PUSCH DMRS init///////////////////////// /////////// - ue->nr_gold_pusch_dmrs = (uint32_t ****)malloc16(fp->slots_per_frame*sizeof(uint32_t ***)); - pusch_dmrs = ue->nr_gold_pusch_dmrs; + + // ceil(((NB_RB*6(k)*2(QPSK)/32) // 3 RE *2(QPSK) + int pusch_dmrs_init_length = ((fp->N_RB_UL*12)>>5)+1; + + ue->nr_gold_pusch_dmrs = (uint32_t ***)malloc16(fp->slots_per_frame*sizeof(uint32_t **)); + uint32_t ***pusch_dmrs = ue->nr_gold_pusch_dmrs; n_scid = 0; // This quantity is indicated by higher layer parameter dmrs-SeqInitialization for (slot=0; slotslots_per_frame; slot++) { - pusch_dmrs[slot] = (uint32_t ***)malloc16(fp->symbols_per_slot*sizeof(uint32_t **)); + pusch_dmrs[slot] = (uint32_t **)malloc16(fp->symbols_per_slot*sizeof(uint32_t *)); AssertFatal(pusch_dmrs[slot]!=NULL, "init_nr_ue_signal: pusch_dmrs for slot %d - malloc failed\n", slot); for (symb=0; symbsymbols_per_slot; symb++) { - pusch_dmrs[slot][symb] = (uint32_t **)malloc16(NR_MAX_NB_CODEWORDS*sizeof(uint32_t *)); + pusch_dmrs[slot][symb] = (uint32_t *)malloc16(pusch_dmrs_init_length*sizeof(uint32_t)); AssertFatal(pusch_dmrs[slot][symb]!=NULL, "init_nr_ue_signal: pusch_dmrs for slot %d symbol %d - malloc failed\n", slot, symb); - for (q=0; qN_RB_DL<<1)*3)>>5)+1; //PDCCH DMRS init (gNB offset = 0) ue->nr_gold_pdcch[0] = (uint32_t ***)malloc16(fp->slots_per_frame*sizeof(uint32_t **)); uint32_t ***pdcch_dmrs = ue->nr_gold_pdcch[0]; @@ -274,7 +275,7 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, AssertFatal(pdcch_dmrs[slot]!=NULL, "NR init: pdcch_dmrs for slot %d - malloc failed\n", slot); for (int symb=0; symbsymbols_per_slot; symb++) { - pdcch_dmrs[slot][symb] = (uint32_t *)malloc16(NR_MAX_PDCCH_DMRS_INIT_LENGTH_DWORD*sizeof(uint32_t)); + pdcch_dmrs[slot][symb] = (uint32_t *)malloc16(pdcch_dmrs_init_length*sizeof(uint32_t)); AssertFatal(pdcch_dmrs[slot][symb]!=NULL, "NR init: pdcch_dmrs for slot %d symbol %d - malloc failed\n", slot, symb); } } @@ -282,6 +283,9 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, ue->scramblingID_pdcch = fp->Nid_cell; nr_gold_pdcch(ue,fp->Nid_cell); + // ceil(((NB_RB*6(k)*2(QPSK)/32) // 3 RE *2(QPSK) + int pdsch_dmrs_init_length = ((fp->N_RB_DL*12)>>5)+1; + //PDSCH DMRS init (eNB offset = 0) ue->nr_gold_pdsch[0] = (uint32_t ****)malloc16(fp->slots_per_frame*sizeof(uint32_t ***)); uint32_t ****pdsch_dmrs = ue->nr_gold_pdsch[0]; @@ -295,7 +299,7 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, AssertFatal(pdsch_dmrs[slot][symb]!=NULL, "NR init: pdsch_dmrs for slot %d symbol %d - malloc failed\n", slot, symb); for (int q=0; qN_RB_DL, Ncp); - if (Ncp == NFAPI_CP_EXTENDED) AssertFatal(mu == NR_MU_2,"Invalid cyclic prefix %d for numerology index %d\n", Ncp, mu); diff --git a/openair1/PHY/NR_REFSIG/nr_gold.c b/openair1/PHY/NR_REFSIG/nr_gold.c index 7930839832..7f81529964 100644 --- a/openair1/PHY/NR_REFSIG/nr_gold.c +++ b/openair1/PHY/NR_REFSIG/nr_gold.c @@ -60,6 +60,7 @@ void nr_init_pdcch_dmrs(PHY_VARS_gNB* gNB, uint32_t Nid) uint8_t reset; NR_DL_FRAME_PARMS *fp = &gNB->frame_parms; uint32_t ***pdcch_dmrs = gNB->nr_gold_pdcch_dmrs; + int pdcch_dmrs_init_length = (((fp->N_RB_DL<<1)*3)>>5)+1; for (uint8_t slot=0; slotslots_per_frame; slot++) { for (uint8_t symb=0; symbsymbols_per_slot; symb++) { @@ -67,7 +68,7 @@ void nr_init_pdcch_dmrs(PHY_VARS_gNB* gNB, uint32_t Nid) reset = 1; x2 = ((1<<17) * (fp->symbols_per_slot*slot+symb+1) * ((Nid<<1)+1) + (Nid<<1)); LOG_D(PHY,"PDCCH DMRS slot %d, symb %d, Nid %d, x2 %x\n",slot,symb,Nid,x2); - for (uint32_t n=0; nframe_parms; uint32_t ****pdsch_dmrs = gNB->nr_gold_pdsch_dmrs; - + int pdsch_dmrs_init_length = ((fp->N_RB_DL*12)>>5)+1; uint16_t N_n_scid[NR_MAX_NB_CODEWORDS]={Nid, Nid}; // Not correct, appropriate scrambling IDs have to be updated to support DCI 1_1 uint8_t n_scid=0; // again works only for 1_0 for (uint8_t slot=0; slotslots_per_frame; slot++) { @@ -93,13 +94,13 @@ void nr_init_pdsch_dmrs(PHY_VARS_gNB* gNB, uint32_t Nid) reset = 1; x2 = ((1<<17) * (fp->symbols_per_slot*slot+symb+1) * ((N_n_scid[n_scid]<<1)+1) +((N_n_scid[n_scid]<<1)+n_scid)); LOG_D(PHY,"PDSCH DMRS slot %d, symb %d x2 %x, N_n_scid %d,n_scid %d\n",slot,symb,x2,N_n_scid[n_scid],n_scid); - for (uint32_t n=0; nframe_parms; unsigned short l; + int pusch_dmrs_init_length = ((fp->N_RB_UL*12)>>5)+1; for (nscid=0; nscid<2; nscid++) { nid = Nid[nscid]; @@ -122,7 +124,7 @@ void nr_gold_pusch(PHY_VARS_gNB* gNB, uint32_t *Nid) { x2 = ((1<<17) * (fp->symbols_per_slot*ns+l+1) * ((nid<<1)+1) +((nid<<1)+nscid)); LOG_D(PHY,"DMRS slot %d, symb %d x2 %x\n",ns,l,x2); - for (n=0; nnr_gold_pusch_dmrs[nscid][ns][l][n] = lte_gold_generic(&x1, &x2, reset); reset = 0; } @@ -138,6 +140,7 @@ void nr_init_csi_rs(PHY_VARS_gNB* gNB, uint32_t Nid) uint32_t ***csi_rs = gNB->nr_gold_csi_rs; uint32_t x1, x2; uint8_t reset; + int csi_dmrs_init_length = ((fp->N_RB_DL<<4)>>5)+1; for (uint8_t slot=0; slotslots_per_frame; slot++) { for (uint8_t symb=0; symbsymbols_per_slot; symb++) { @@ -145,7 +148,7 @@ void nr_init_csi_rs(PHY_VARS_gNB* gNB, uint32_t Nid) reset = 1; x2 = ((1<<10) * (fp->symbols_per_slot*slot+symb+1) * ((Nid<<1)+1) + (Nid)); - for (uint32_t n=0; nframe_parms.N_RB_DL<<1)*3)>>5)+1; for (ns=0; nsframe_parms.slots_per_frame; ns++) { @@ -66,7 +67,7 @@ void nr_gold_pdcch(PHY_VARS_NR_UE* ue, x2tmp0 = ((ue->frame_parms.symbols_per_slot*ns+l+1)*((nid<<1)+1))<<17; x2 = (x2tmp0+(nid<<1))%(1<<31); //cinit - for (n=0; nnr_gold_pdcch[0][ns][l][n] = lte_gold_generic(&x1, &x2, reset); reset = 0; } @@ -82,6 +83,7 @@ void nr_gold_pdsch(PHY_VARS_NR_UE* ue, int nscid; unsigned int nid; uint8_t reset; + int pdsch_dmrs_init_length = ((ue->frame_parms.N_RB_DL*12)>>5)+1; /// to be updated from higher layer //unsigned short lbar = 0; @@ -98,7 +100,7 @@ void nr_gold_pdsch(PHY_VARS_NR_UE* ue, x2 = (x2tmp0+(nid<<1)+nscid)%(1<<31); //cinit LOG_D(PHY,"UE DMRS slot %d, symb %d, x2 %x, nscid %d\n",ns,l,x2,nscid); - for (n=0; nnr_gold_pdsch[0][ns][l][nscid][n] = lte_gold_generic(&x1, &x2, reset); reset = 0; } @@ -112,9 +114,10 @@ void nr_init_pusch_dmrs(PHY_VARS_NR_UE* ue, uint8_t n_scid) { uint32_t x1, x2, n; - uint8_t reset, slot, symb, q; + uint8_t reset, slot, symb; NR_DL_FRAME_PARMS *fp = &ue->frame_parms; - uint32_t ****pusch_dmrs = ue->nr_gold_pusch_dmrs; + uint32_t ***pusch_dmrs = ue->nr_gold_pusch_dmrs; + int pusch_dmrs_init_length = ((fp->N_RB_UL*12)>>5)+1; for (slot=0; slotslots_per_frame; slot++) { @@ -123,13 +126,10 @@ void nr_init_pusch_dmrs(PHY_VARS_NR_UE* ue, reset = 1; x2 = ((1<<17) * (fp->symbols_per_slot*slot+symb+1) * ((N_n_scid[n_scid]<<1)+1) +((N_n_scid[n_scid]<<1)+n_scid)); - for (n=0; ncommon_vars.txdataF; int txdataF_offset = (slot%2)*frame_parms.samples_per_slot_wCP; uint32_t **gold_csi_rs = gNB->nr_gold_csi_rs[slot]; - int16_t mod_csi[frame_parms.symbols_per_slot][NR_MAX_CSI_RS_LENGTH>>1] __attribute__((aligned(16)));; + //*8(max allocation per RB)*2(QPSK)) + int csi_rs_length = frame_parms.N_RB_DL<<4; + int16_t mod_csi[frame_parms.symbols_per_slot][csi_rs_length>>1] __attribute__((aligned(16)));; uint16_t b = csi_params.freq_domain; uint16_t n, csi_bw, csi_start, p, k, l, mprime, na, kpn, csi_length; uint8_t size, ports, kprime, lprime, i, gs; @@ -59,7 +61,7 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB, for (uint8_t symb=0; symb>5)+1; n++) { gold_csi_rs[symb][n] = lte_gold_generic(&x1, &x2, reset); reset = 0; } diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c index 13ca3bde6b..c1de1648ef 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c @@ -207,7 +207,7 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE, /////////////////////////DMRS Modulation///////////////////////// /////////// - uint32_t ***pusch_dmrs = UE->nr_gold_pusch_dmrs[slot]; + uint32_t **pusch_dmrs = UE->nr_gold_pusch_dmrs[slot]; uint16_t n_dmrs = (pusch_pdu->bwp_start + start_rb + nb_rb)*((dmrs_type == pusch_dmrs_type1) ? 6:4); int16_t mod_dmrs[n_dmrs<<1] __attribute((aligned(16))); /////////// @@ -369,7 +369,7 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE, // TODO: performance improvement, we can skip the modulation of DMRS symbols outside the bandwidth part // Perform this on gold sequence, not required when SC FDMA operation is done, LOG_D(PHY,"DMRS in symbol %d\n",l); - nr_modulation(pusch_dmrs[l][0], n_dmrs*2, DMRS_MOD_ORDER, mod_dmrs); // currently only codeword 0 is modulated. Qm = 2 as DMRS is QPSK modulated + nr_modulation(pusch_dmrs[l], n_dmrs*2, DMRS_MOD_ORDER, mod_dmrs); // Qm = 2 as DMRS is QPSK modulated } else { dmrs_idx = 0; } @@ -379,7 +379,7 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE, if(is_ptrs_symbol(l, ulsch_ue->ptrs_symbols)) { is_ptrs_sym = 1; - nr_modulation(pusch_dmrs[l][0], nb_rb, DMRS_MOD_ORDER, mod_ptrs); + nr_modulation(pusch_dmrs[l], nb_rb, DMRS_MOD_ORDER, mod_ptrs); } } diff --git a/openair1/PHY/defs_nr_UE.h b/openair1/PHY/defs_nr_UE.h index 7aca95cb1e..65a9fea786 100644 --- a/openair1/PHY/defs_nr_UE.h +++ b/openair1/PHY/defs_nr_UE.h @@ -862,7 +862,7 @@ typedef struct { uint16_t scramblingID_pdcch; /// PUSCH DMRS sequence - uint32_t ****nr_gold_pusch_dmrs; + uint32_t ***nr_gold_pusch_dmrs; uint32_t X_u[64][839]; diff --git a/openair1/PHY/defs_nr_common.h b/openair1/PHY/defs_nr_common.h index 8245da9737..1b99160a23 100644 --- a/openair1/PHY/defs_nr_common.h +++ b/openair1/PHY/defs_nr_common.h @@ -67,22 +67,9 @@ #define NR_PBCH_DMRS_LENGTH 144 // in mod symbols #define NR_PBCH_DMRS_LENGTH_DWORD 10 // ceil(2(QPSK)*NR_PBCH_DMRS_LENGTH/32) -/*These max values are for the gold sequences which are generated at init for the - * full carrier bandwidth*/ -#define NR_MAX_PDCCH_DMRS_INIT_LENGTH ((NR_MAX_NB_RB<<1)*3) // 3 symbols *2(QPSK) -#define NR_MAX_PDCCH_DMRS_INIT_LENGTH_DWORD 52 // ceil(NR_MAX_PDCCH_DMRS_LENGTH/32) /*used for the resource mapping*/ #define NR_MAX_PDCCH_DMRS_LENGTH 576 // 16(L)*2(QPSK)*3(3 DMRS symbs per REG)*6(REG per CCE) -#define NR_MAX_PDSCH_DMRS_LENGTH 3300 //275*6(k)*2(QPSK real+imag) -#define NR_MAX_PDSCH_DMRS_INIT_LENGTH_DWORD 104 // ceil(NR_MAX_PDSCH_DMRS_LENGTH/32) - -#define NR_MAX_CSI_RS_LENGTH 4400 //275*8(max allocation per RB)*2(QPSK) -#define NR_MAX_CSI_RS_INIT_LENGTH_DWORD 138 // ceil(NR_MAX_CSI_RS_LENGTH/32) - -#define NR_MAX_PUSCH_DMRS_LENGTH NR_MAX_PDSCH_DMRS_LENGTH -#define NR_MAX_PUSCH_DMRS_INIT_LENGTH_DWORD NR_MAX_PDSCH_DMRS_INIT_LENGTH_DWORD - #define NR_MAX_DCI_PAYLOAD_SIZE 64 #define NR_MAX_DCI_SIZE 1728 //16(L)*2(QPSK)*9(12 RE per REG - 3(DMRS))*6(REG per CCE) #define NR_MAX_DCI_SIZE_DWORD 54 // ceil(NR_MAX_DCI_SIZE/32) From 9e2185aa17fb3f8e2d80b0bb4d63c9a9bd12cc74 Mon Sep 17 00:00:00 2001 From: francescomani Date: Mon, 31 Jan 2022 18:52:50 +0100 Subject: [PATCH 20/96] some more cleanup in memory allocation --- openair1/PHY/CODING/TESTBENCH/ldpctest.c | 2 +- openair1/PHY/CODING/nrLDPC_defs.h | 2 +- openair1/PHY/CODING/nr_segmentation.c | 5 -- openair1/PHY/INIT/nr_init_ue.c | 7 +- openair1/PHY/NR_TRANSPORT/nr_dlsch.c | 6 +- openair1/PHY/NR_TRANSPORT/nr_dlsch.h | 2 +- openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c | 53 ++++++++----- openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c | 2 +- .../PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c | 76 +++++++------------ .../PHY/NR_UE_TRANSPORT/nr_transport_ue.h | 10 +-- openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c | 3 +- openair1/PHY/defs_gNB.h | 10 +-- openair1/PHY/defs_nr_UE.h | 2 +- openair1/PHY/defs_nr_common.h | 10 +-- openair1/SIMULATION/NR_PHY/dlschsim.c | 2 +- .../LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c | 2 +- .../LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c | 2 - 17 files changed, 86 insertions(+), 110 deletions(-) diff --git a/openair1/PHY/CODING/TESTBENCH/ldpctest.c b/openair1/PHY/CODING/TESTBENCH/ldpctest.c index 371deba3f2..3f343c2c4b 100644 --- a/openair1/PHY/CODING/TESTBENCH/ldpctest.c +++ b/openair1/PHY/CODING/TESTBENCH/ldpctest.c @@ -116,7 +116,7 @@ int test_ldpc(short No_iteration, sigma = 1.0/sqrt(2*SNR); opp_enabled=1; //short test_input[block_length]; - unsigned char *test_input[MAX_NUM_NR_DLSCH_SEGMENTS]={NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL};; + unsigned char *test_input[MAX_NUM_NR_DLSCH_SEGMENTS_PER_LAYER*NR_MAX_NB_LAYERS]={NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL};; //short *c; //padded codeword unsigned char *estimated_output[MAX_NUM_DLSCH_SEGMENTS]; unsigned char *estimated_output_bit[MAX_NUM_DLSCH_SEGMENTS]; diff --git a/openair1/PHY/CODING/nrLDPC_defs.h b/openair1/PHY/CODING/nrLDPC_defs.h index 0d7ff9ef9f..a6fb44cb0d 100644 --- a/openair1/PHY/CODING/nrLDPC_defs.h +++ b/openair1/PHY/CODING/nrLDPC_defs.h @@ -57,7 +57,7 @@ typedef struct { /// Number of "Filler" bits uint32_t F; /// LDPC-code outputs - uint8_t *d[MAX_NUM_NR_DLSCH_SEGMENTS]; + uint8_t *d[MAX_NUM_NR_DLSCH_SEGMENTS_PER_LAYER*NR_MAX_NB_LAYERS]; } encoder_implemparams_t; #define INIT0_LDPCIMPLEMPARAMS {0,0,0,NULL,NULL,NULL,NULL} typedef void(*nrLDPC_initcallfunc_t)(t_nrLDPC_dec_params *p_decParams, int8_t *p_llr, int8_t *p_out); diff --git a/openair1/PHY/CODING/nr_segmentation.c b/openair1/PHY/CODING/nr_segmentation.c index 0eede23766..281e61cda5 100644 --- a/openair1/PHY/CODING/nr_segmentation.c +++ b/openair1/PHY/CODING/nr_segmentation.c @@ -63,11 +63,6 @@ int32_t nr_segmentation(unsigned char *input_buffer, #endif } - if ((*C)>MAX_NUM_NR_DLSCH_SEGMENTS) { - LOG_E(PHY,"nr_segmentation.c: too many segments %d, B %d, L %d, Bprime %d\n",*C,B,L,Bprime); - return(-1); - } - // Find K+ Kprime = Bprime/(*C); diff --git a/openair1/PHY/INIT/nr_init_ue.c b/openair1/PHY/INIT/nr_init_ue.c index a38cb1d93f..93339b4cd2 100644 --- a/openair1/PHY/INIT/nr_init_ue.c +++ b/openair1/PHY/INIT/nr_init_ue.c @@ -123,9 +123,10 @@ void phy_init_nr_ue__PDSCH(NR_UE_PDSCH *const pdsch, void phy_init_nr_ue_PUSCH(NR_UE_PUSCH *const pusch, const NR_DL_FRAME_PARMS *const fp) { AssertFatal( pusch, "pusch==0" ); - - for (int i=0; itxdataF_layers[i] = (int32_t *)malloc16_clear(NR_MAX_PUSCH_ENCODED_LENGTH*sizeof(int32_t)); + int max_pusch_length = fp->N_RB_UL*NR_SYMBOLS_PER_SLOT*NR_NB_SC_PER_RB*8*fp->nb_antennas_tx; + pusch->txdataF_layers = (int32_t **)malloc16_clear(fp->nb_antennas_tx*sizeof(int32_t *)); + for (int i=0; inb_antennas_tx; i++) { + pusch->txdataF_layers[i] = (int32_t *)malloc16_clear(max_pusch_length*sizeof(int32_t)); } } diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c index 9bbc61d4b6..1061444f68 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c @@ -138,7 +138,6 @@ void nr_generate_pdsch(processingData_L1tx_t *msgTx, NR_DL_gNB_HARQ_t *harq = &dlsch->harq_process; nfapi_nr_dl_tti_pdsch_pdu_rel15_t *rel15 = &harq->pdsch_pdu.pdsch_pdu_rel15; - uint32_t scrambled_output[NR_MAX_NB_CODEWORDS][NR_MAX_PDSCH_ENCODED_LENGTH>>5]; int16_t **mod_symbs = (int16_t**)dlsch->mod_symbs; int16_t **tx_layers = (int16_t**)dlsch->txdataF; int16_t **txdataF_precoding = (int16_t**)dlsch->txdataF_precoding; @@ -159,6 +158,7 @@ void nr_generate_pdsch(processingData_L1tx_t *msgTx, uint16_t nb_re = ((12*rel15->NrOfSymbols)-nb_re_dmrs*dmrs_len-xOverhead)*rel15->rbSize*rel15->nrOfLayers; uint8_t Qm = rel15->qamModOrder[0]; uint32_t encoded_length = nb_re*Qm; + uint32_t scrambled_output[rel15->NrOfCodewords][encoded_length>>5]; int16_t mod_dmrs[n_dmrs<<1] __attribute__ ((aligned(16))); /* PTRS */ @@ -180,8 +180,8 @@ void nr_generate_pdsch(processingData_L1tx_t *msgTx, /// CRC, coding, interleaving and rate matching AssertFatal(harq->pdu!=NULL,"harq->pdu is null\n"); - unsigned char output[rel15->rbSize * NR_SYMBOLS_PER_SLOT * NR_NB_SC_PER_RB * 8 * NR_MAX_NB_LAYERS] __attribute__((aligned(32))); - bzero(output,rel15->rbSize * NR_SYMBOLS_PER_SLOT * NR_NB_SC_PER_RB * 8 * NR_MAX_NB_LAYERS); + unsigned char output[rel15->rbSize * NR_SYMBOLS_PER_SLOT * NR_NB_SC_PER_RB * 8 * rel15->nrOfLayers] __attribute__((aligned(32))); + bzero(output,rel15->rbSize * NR_SYMBOLS_PER_SLOT * NR_NB_SC_PER_RB * 8 * rel15->nrOfLayers); start_meas(dlsch_encoding_stats); nr_dlsch_encoding(gNB, harq->pdu, frame, slot, dlsch, frame_parms, output, diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h index 77db12672f..b864b36875 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h @@ -68,7 +68,7 @@ void nr_fill_dlsch(processingData_L1tx_t *msgTx, void nr_generate_pdsch(processingData_L1tx_t *msgTx, int frame, int slot); -void free_gNB_dlsch(NR_gNB_DLSCH_t **dlschptr, uint16_t N_RB); +void free_gNB_dlsch(NR_gNB_DLSCH_t **dlschptr, uint16_t N_RB, NR_DL_FRAME_PARMS* frame_parms); void clean_gNB_dlsch(NR_gNB_DLSCH_t *dlsch); diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c index 819fccc588..cdcd0e0ba1 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c @@ -50,10 +50,12 @@ //#define DEBUG_DLSCH_FREE 1 -void free_gNB_dlsch(NR_gNB_DLSCH_t **dlschptr, uint16_t N_RB) { - int r; +void free_gNB_dlsch(NR_gNB_DLSCH_t **dlschptr, uint16_t N_RB, NR_DL_FRAME_PARMS* frame_parms) { + NR_gNB_DLSCH_t *dlsch = *dlschptr; - uint16_t a_segments = MAX_NUM_NR_DLSCH_SEGMENTS; //number of segments to be allocated + + int max_layers = (frame_parms->nb_antennas_txnb_antennas_tx : NR_MAX_NB_LAYERS; + uint16_t a_segments = MAX_NUM_NR_DLSCH_SEGMENTS_PER_LAYER*max_layers; if (dlsch) { if (N_RB != 273) { @@ -78,7 +80,7 @@ void free_gNB_dlsch(NR_gNB_DLSCH_t **dlschptr, uint16_t N_RB) { LOG_D(PHY, "Freeing dlsch process %d c (%p)\n", i, harq->c); #endif - for (r = 0; r < a_segments; r++) { + for (int r = 0; r < a_segments; r++) { #ifdef DEBUG_DLSCH_FREE LOG_D(PHY, "Freeing dlsch process %d c[%d] (%p)\n", i, r, harq->c[r]); #endif @@ -99,9 +101,9 @@ NR_gNB_DLSCH_t *new_gNB_dlsch(NR_DL_FRAME_PARMS *frame_parms, uint32_t Nsoft, uint8_t abstraction_flag, uint16_t N_RB) { - unsigned char i,r,aa,layer; - int re; - uint16_t a_segments = MAX_NUM_NR_DLSCH_SEGMENTS; //number of segments to be allocated + + int max_layers = (frame_parms->nb_antennas_txnb_antennas_tx : NR_MAX_NB_LAYERS; + uint16_t a_segments = MAX_NUM_NR_DLSCH_SEGMENTS_PER_LAYER*max_layers; //number of segments to be allocated if (N_RB != 273) { a_segments = a_segments*N_RB; @@ -117,31 +119,35 @@ NR_gNB_DLSCH_t *new_gNB_dlsch(NR_DL_FRAME_PARMS *frame_parms, dlsch->Mlimit = 4; dlsch->Nsoft = Nsoft; - for (layer=0; layerN_RB_DL*NR_SYMBOLS_PER_SLOT*NR_NB_SC_PER_RB*8; // max pdsch encoded length for each layer + + dlsch->txdataF = (int32_t **)malloc16(max_layers*sizeof(int32_t *)); + dlsch->txdataF_precoding = (int32_t **)malloc16(max_layers*sizeof(int32_t *)); + dlsch->ue_spec_bf_weights = (int32_t ***)malloc16(max_layers*sizeof(int32_t **)); + for (int layer=0; layerue_spec_bf_weights[layer] = (int32_t **)malloc16(64*sizeof(int32_t *)); - for (aa=0; aa<64; aa++) { + for (int aa=0; aa<64; aa++) { dlsch->ue_spec_bf_weights[layer][aa] = (int32_t *)malloc16(OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES*sizeof(int32_t)); - for (re=0; reue_spec_bf_weights[layer][aa][re] = 0x00007fff; } } - - dlsch->txdataF[layer] = (int32_t *)malloc16((NR_MAX_PDSCH_ENCODED_LENGTH/NR_MAX_NB_LAYERS)*sizeof(int32_t)); // NR_MAX_NB_LAYERS is already included in NR_MAX_PDSCH_ENCODED_LENGTH + dlsch->txdataF[layer] = (int32_t *)malloc16((txdataf_size)*sizeof(int32_t)); dlsch->txdataF_precoding[layer] = (int32_t *)malloc16(2*14*frame_parms->ofdm_symbol_size*sizeof(int32_t)); } for (int q=0; qmod_symbs[q] = (int32_t *)malloc16(NR_MAX_PDSCH_ENCODED_LENGTH*sizeof(int32_t)); + dlsch->mod_symbs[q] = (int32_t *)malloc16(txdataf_size*max_layers*sizeof(int32_t)); dlsch->calib_dl_ch_estimates = (int32_t **)malloc16(64*sizeof(int32_t *)); - for (aa=0; aa<64; aa++) { + for (int aa=0; aa<64; aa++) { dlsch->calib_dl_ch_estimates[aa] = (int32_t *)malloc16(OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES*sizeof(int32_t)); } - for (i=0; i<20; i++) { + for (int i=0; i<20; i++) { dlsch->harq_ids[0][i] = 0; dlsch->harq_ids[1][i] = 0; } @@ -156,7 +162,8 @@ NR_gNB_DLSCH_t *new_gNB_dlsch(NR_DL_FRAME_PARMS *frame_parms, nr_emulate_dlsch_payload(harq->pdu, (dlsch_bytes) >> 3); bzero(harq->b, dlsch_bytes); - for (r = 0; r < a_segments; r++) { + harq->c = (uint8_t **)malloc16(a_segments*sizeof(uint8_t *)); + for (int r = 0; r < a_segments; r++) { // account for filler in first segment and CRCs for multiple segment case // [hna] 8448 is the maximum CB size in NR // 68*348 = 68*(maximum size of Zc) @@ -319,6 +326,7 @@ int nr_dlsch_encoding(PHY_VARS_gNB *gNB, stats->current_Qm = rel15->qamModOrder[0]; } + int max_bytes = MAX_NUM_NR_DLSCH_SEGMENTS_PER_LAYER*rel15->nrOfLayers*1056; if (A > 3824) { // Add 24-bit crc (polynomial A) to payload crc = crc24a(a,A)>>8; @@ -329,11 +337,11 @@ int nr_dlsch_encoding(PHY_VARS_gNB *gNB, //printf("a0 %d a1 %d a2 %d\n", a[A>>3], a[1+(A>>3)], a[2+(A>>3)]); harq->B = A+24; // harq->b = a; - AssertFatal((A / 8) + 4 <= MAX_NR_DLSCH_PAYLOAD_BYTES, + AssertFatal((A / 8) + 4 <= max_bytes, "A %d is too big (A/8+4 = %d > %d)\n", A, (A / 8) + 4, - MAX_NR_DLSCH_PAYLOAD_BYTES); + max_bytes); memcpy(harq->b, a, (A / 8) + 4); // why is this +4 if the CRC is only 3 bytes? } else { // Add 16-bit crc (polynomial A) to payload @@ -344,11 +352,11 @@ int nr_dlsch_encoding(PHY_VARS_gNB *gNB, //printf("a0 %d a1 %d \n", a[A>>3], a[1+(A>>3)]); harq->B = A+16; // harq->b = a; - AssertFatal((A / 8) + 3 <= MAX_NR_DLSCH_PAYLOAD_BYTES, + AssertFatal((A / 8) + 3 <= max_bytes, "A %d is too big (A/8+3 = %d > %d)\n", A, (A / 8) + 3, - MAX_NR_DLSCH_PAYLOAD_BYTES); + max_bytes); memcpy(harq->b, a, (A / 8) + 3); // using 3 bytes to mimic the case of 24 bit crc } @@ -366,6 +374,11 @@ int nr_dlsch_encoding(PHY_VARS_gNB *gNB, impp.Kb = nr_segmentation(harq->b, harq->c, harq->B, &impp.n_segments, &impp.K, impp.Zc, &impp.F, impp.BG); stop_meas(dlsch_segmentation_stats); + if (impp.n_segments>MAX_NUM_NR_DLSCH_SEGMENTS_PER_LAYER*rel15->nrOfLayers) { + LOG_E(PHY,"nr_segmentation.c: too many segments %d, B %d\n",impp.n_segments,harq->B); + return(-1); + } + for (int r=0; rd[r][0]; //channel_input[r] = &harq->d[r][0]; diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c index 08592daccc..01b6be91ab 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c +++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c @@ -197,7 +197,7 @@ void clean_gNB_ulsch(NR_gNB_ULSCH_t *ulsch) //t_nrLDPC_procBuf* p_nrLDPC_procBuf[MAX_NUM_NR_ULSCH_SEGMENTS]; ulsch->harq_processes[i]->Z=0; /// code blocks after bit selection in rate matching for LDPC code (38.212 V15.4.0 section 5.4.2.1) - //int16_t e[MAX_NUM_NR_DLSCH_SEGMENTS][3*8448]; + //int16_t e[MAX_NUM_NR_ULSCH_SEGMENTS][3*8448]; ulsch->harq_processes[i]->E=0; diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c index 95c451fa1a..b73441d116 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c @@ -80,8 +80,8 @@ void init_dlsch_tpool(uint8_t num_dlsch_threads) { } void free_nr_ue_dlsch(NR_UE_DLSCH_t **dlschptr,uint8_t N_RB_DL) { - int i,r; - uint16_t a_segments = MAX_NUM_NR_DLSCH_SEGMENTS; //number of segments to be allocated + + uint16_t a_segments = MAX_NUM_NR_DLSCH_SEGMENTS_PER_LAYER*NR_MAX_NB_LAYERS; NR_UE_DLSCH_t *dlsch=*dlschptr; if (dlsch) { @@ -90,37 +90,18 @@ void free_nr_ue_dlsch(NR_UE_DLSCH_t **dlschptr,uint8_t N_RB_DL) { a_segments = a_segments/273 +1; } - for (i=0; iMdlharq; i++) { + for (int i=0; iMdlharq; i++) { if (dlsch->harq_processes[i]) { if (dlsch->harq_processes[i]->b) { free16(dlsch->harq_processes[i]->b,a_segments*1056); dlsch->harq_processes[i]->b = NULL; } - for (r=0; rharq_processes[i]->c[r],1056); dlsch->harq_processes[i]->c[r] = NULL; } - for (r=0; rharq_processes[i]->d[r]) { - free16(dlsch->harq_processes[i]->d[r],(5*8448)*sizeof(short)); - dlsch->harq_processes[i]->d[r] = NULL; - } - - for (r=0; rharq_processes[i]->w[r]) { - free16(dlsch->harq_processes[i]->w[r],(5*8448)*sizeof(short)); - dlsch->harq_processes[i]->w[r] = NULL; - } - - for (r=0; rharq_processes[i]->p_nrLDPC_procBuf[r]) { - nrLDPC_free_mem(dlsch->harq_processes[i]->p_nrLDPC_procBuf[r]); - dlsch->harq_processes[i]->p_nrLDPC_procBuf[r] = NULL; - } - } - free16(dlsch->harq_processes[i],sizeof(NR_DL_UE_HARQ_t)); dlsch->harq_processes[i] = NULL; } @@ -132,9 +113,11 @@ void free_nr_ue_dlsch(NR_UE_DLSCH_t **dlschptr,uint8_t N_RB_DL) { } NR_UE_DLSCH_t *new_nr_ue_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint32_t Nsoft,uint8_t max_ldpc_iterations,uint16_t N_RB_DL, uint8_t abstraction_flag) { + NR_UE_DLSCH_t *dlsch; - uint8_t exit_flag = 0,i,r; - uint16_t a_segments = MAX_NUM_NR_DLSCH_SEGMENTS; //number of segments to be allocated + uint8_t exit_flag = 0; + + uint16_t a_segments = MAX_NUM_NR_DLSCH_SEGMENTS_PER_LAYER*NR_MAX_NB_LAYERS; //number of segments to be allocated if (N_RB_DL != 273) { a_segments = a_segments*N_RB_DL; @@ -153,7 +136,7 @@ NR_UE_DLSCH_t *new_nr_ue_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint32_t Nsoft,uint dlsch->Mlimit = 4; dlsch->max_ldpc_iterations = max_ldpc_iterations; - for (i=0; iharq_processes[i] = (NR_DL_UE_HARQ_t *)malloc16(sizeof(NR_DL_UE_HARQ_t)); if (dlsch->harq_processes[i]) { @@ -168,7 +151,9 @@ NR_UE_DLSCH_t *new_nr_ue_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint32_t Nsoft,uint exit_flag=3; if (abstraction_flag == 0) { - for (r=0; rharq_processes[i]->c = (uint8_t **)malloc16(a_segments*sizeof(uint8_t *)); + dlsch->harq_processes[i]->p_nrLDPC_procBuf = (uint8_t **)malloc16(a_segments*sizeof(uint8_t *)); + for (int r=0; rharq_processes[i]->p_nrLDPC_procBuf[r] = nrLDPC_init_mem(); dlsch->harq_processes[i]->c[r] = (uint8_t *)malloc16(1056); @@ -176,20 +161,6 @@ NR_UE_DLSCH_t *new_nr_ue_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint32_t Nsoft,uint memset(dlsch->harq_processes[i]->c[r],0,1056); else exit_flag=2; - - dlsch->harq_processes[i]->d[r] = (short *)malloc16((5*8448)*sizeof(short)); - - if (dlsch->harq_processes[i]->d[r]) - memset(dlsch->harq_processes[i]->d[r],0,(5*8448)*sizeof(short)); - else - exit_flag=2; - - dlsch->harq_processes[i]->w[r] = (short *)malloc16((5*8448)*sizeof(short)); - - if (dlsch->harq_processes[i]->w[r]) - memset(dlsch->harq_processes[i]->w[r],0,(5*8448)*sizeof(short)); - else - exit_flag=2; } } } else { @@ -344,10 +315,12 @@ void nr_processDLSegment(void* arg) { #if UE_TIMING_TRACE start_meas(dlsch_deinterleaving_stats); #endif + int16_t w[5*8448]; + memset(w,0,(5*8448)*sizeof(short)); //VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_DEINTERLEAVING, VCD_FUNCTION_IN); nr_deinterleaving_ldpc(E, Qm, - harq_process->w[r], // [hna] w is e + w, // [hna] w is e dlsch_llr+r_offset); //VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_DEINTERLEAVING, VCD_FUNCTION_OUT); #if UE_TIMING_TRACE @@ -367,12 +340,14 @@ void nr_processDLSegment(void* arg) { harq_process->round); */ //VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_RATE_MATCHING, VCD_FUNCTION_IN); + int16_t d[5*8448]; + memset(d,0,(5*8448)*sizeof(short)); if (nr_rate_matching_ldpc_rx(Ilbrm, Tbslbrm, p_decoderParms->BG, p_decoderParms->Z, - harq_process->d[r], - harq_process->w[r], + d, + w, harq_process->C, harq_process->rvidx, (harq_process->first_rx==1)?1:0, @@ -398,7 +373,7 @@ void nr_processDLSegment(void* arg) { LOG_I(PHY,"decoder input(segment %u) :",r); for (int i=0; id[r][i]); + LOG_D(PHY,"%d : %d\n",i,d[i]); LOG_D(PHY,"\n"); } @@ -426,9 +401,9 @@ void nr_processDLSegment(void* arg) { //set Filler bits memset((&z[0]+K_bits_F),127,harq_process->F*sizeof(int16_t)); //Move coded bits before filler bits - memcpy((&z[0]+2*harq_process->Z),harq_process->d[r],(K_bits_F-2*harq_process->Z)*sizeof(int16_t)); + memcpy((&z[0]+2*harq_process->Z),d,(K_bits_F-2*harq_process->Z)*sizeof(int16_t)); //skip filler bits - memcpy((&z[0]+Kr),harq_process->d[r]+(Kr-2*harq_process->Z),(kc*harq_process->Z-Kr)*sizeof(int16_t)); + memcpy((&z[0]+Kr),d+(Kr-2*harq_process->Z),(kc*harq_process->Z-Kr)*sizeof(int16_t)); //Saturate coded bits before decoding into 8 bits values for (i=0, j=0; j < ((kc*harq_process->Z)>>4)+1; i+=2, j++) { @@ -612,6 +587,11 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, &harq_process->F, p_decParams->BG); + if (harq_process->C>MAX_NUM_NR_DLSCH_SEGMENTS_PER_LAYER*harq_process->Nl) { + LOG_E(PHY,"nr_segmentation.c: too many segments %d, B %d\n",harq_process->C,harq_process->B); + return(-1); + } + if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD) && (!frame%100)) LOG_I(PHY,"K %d C %d Z %d nl %d \n", harq_process->K, harq_process->C, p_decParams->Z, harq_process->Nl); } @@ -627,7 +607,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, p_decParams->numMaxIter = dlsch->max_ldpc_iterations; p_decParams->outMode= 0; r_offset = 0; - uint16_t a_segments = MAX_NUM_NR_DLSCH_SEGMENTS; //number of segments to be allocated + uint16_t a_segments = MAX_NUM_NR_DLSCH_SEGMENTS_PER_LAYER*harq_process->Nl; //number of segments to be allocated if (nb_rb != 273) { a_segments = a_segments*nb_rb; diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h index 76b68a265f..5871db3d21 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h @@ -179,7 +179,7 @@ typedef struct { /// Pointer to the payload uint8_t *b; /// Pointers to transport block segments - uint8_t *c[MAX_NUM_NR_DLSCH_SEGMENTS]; + uint8_t **c; /// Index of current HARQ round for this DLSCH uint8_t round; /// MCS table for this DLSCH @@ -194,14 +194,8 @@ typedef struct { uint8_t rvidx; /// MIMO mode for this DLSCH MIMO_nrmode_t mimo_mode; - /// soft bits for each received segment ("w"-sequence)(for definition see 36-212 V8.6 2009-03, p.15) - int16_t *w[MAX_NUM_NR_DLSCH_SEGMENTS]; - /// for abstraction soft bits for each received segment ("w"-sequence)(for definition see 36-212 V8.6 2009-03, p.15) - //double w_abs[MAX_NUM_NR_DLSCH_SEGMENTS][3*8448]; - /// soft bits for each received segment ("d"-sequence)(for definition see 36-212 V8.6 2009-03, p.15) - int16_t *d[MAX_NUM_NR_DLSCH_SEGMENTS]; /// LDPC processing buffers - t_nrLDPC_procBuf* p_nrLDPC_procBuf[MAX_NUM_NR_DLSCH_SEGMENTS]; + t_nrLDPC_procBuf **p_nrLDPC_procBuf; /// Number of code segments uint32_t C; /// Number of bits in code segments diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c index c1de1648ef..3cdd07dc43 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c @@ -102,7 +102,6 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE, LOG_D(PHY,"nr_ue_ulsch_procedures hard_id %d %d.%d\n",harq_pid,frame,slot); uint32_t available_bits; - uint32_t scrambled_output[NR_MAX_PDSCH_ENCODED_LENGTH>>5]; int16_t **tx_layers; int32_t **txdataF; int8_t Wf[2], Wt[2]; @@ -176,7 +175,7 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE, /////////// available_bits = G; - + uint32_t scrambled_output[(available_bits>>5)+1]; memset(scrambled_output, 0, ((available_bits>>5)+1)*sizeof(uint32_t)); nr_pusch_codeword_scrambling(harq_process_ul_ue->f, diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h index 68e8bf0fd2..9217e566ae 100644 --- a/openair1/PHY/defs_gNB.h +++ b/openair1/PHY/defs_gNB.h @@ -89,7 +89,7 @@ typedef struct { /// Pointer to the payload uint8_t *b; /// Pointers to transport block segments - uint8_t *c[MAX_NUM_NR_DLSCH_SEGMENTS]; + uint8_t **c; /// Frame where current HARQ round was sent uint32_t frame; /// Subframe where current HARQ round was sent @@ -157,13 +157,13 @@ typedef struct { /// Pointers to variables related to DLSCH harq process NR_DL_gNB_HARQ_t harq_process; /// TX buffers for UE-spec transmission (antenna layers 1,...,4 after to precoding) - int32_t *txdataF[NR_MAX_NB_LAYERS]; + int32_t **txdataF; /// TX buffers for UE-spec transmission (antenna ports 1000 or 1001,...,1007, before precoding) - int32_t *txdataF_precoding[NR_MAX_NB_LAYERS]; + int32_t **txdataF_precoding; /// Modulated symbols buffer int32_t *mod_symbs[NR_MAX_NB_CODEWORDS]; /// beamforming weights for UE-spec transmission (antenna ports 5 or 7..14), for each codeword, maximum 4 layers? - int32_t **ue_spec_bf_weights[NR_MAX_NB_LAYERS]; + int32_t ***ue_spec_bf_weights; /// dl channel estimates (estimated from ul channel estimates) int32_t **calib_dl_ch_estimates; /// Allocated RNTI (0 means DLSCH_t is not currently used) @@ -287,7 +287,7 @@ typedef struct { /// LDPC lifting size (38.212 V15.4.0 table 5.3.2-1) uint32_t Z; /// code blocks after bit selection in rate matching for LDPC code (38.212 V15.4.0 section 5.4.2.1) - int16_t e[MAX_NUM_NR_DLSCH_SEGMENTS][3*8448]; + int16_t e[MAX_NUM_NR_ULSCH_SEGMENTS][3*8448]; /// Number of bits in each code block after rate matching for LDPC code (38.212 V15.4.0 section 5.4.2.1) uint32_t E; /// Number of segments processed so far diff --git a/openair1/PHY/defs_nr_UE.h b/openair1/PHY/defs_nr_UE.h index 65a9fea786..c2a83e7362 100644 --- a/openair1/PHY/defs_nr_UE.h +++ b/openair1/PHY/defs_nr_UE.h @@ -228,7 +228,7 @@ typedef struct { typedef struct { /// TX buffers for multiple layers - int32_t *txdataF_layers[NR_MAX_NB_LAYERS]; + int32_t **txdataF_layers; } NR_UE_PUSCH; typedef struct { diff --git a/openair1/PHY/defs_nr_common.h b/openair1/PHY/defs_nr_common.h index 1b99160a23..7645bf8e96 100644 --- a/openair1/PHY/defs_nr_common.h +++ b/openair1/PHY/defs_nr_common.h @@ -44,8 +44,6 @@ #define MAX_NUM_SUBCARRIER_SPACING 5 -#define NR_MAX_NB_RB 275 - #define NR_NB_SC_PER_RB 12 #define NR_NB_REG_PER_CCE 6 @@ -80,16 +78,14 @@ #define NR_MAX_CSET_DURATION 3 #define NR_MAX_NB_RBG 18 -#define NR_MAX_NB_LAYERS 2 // 8 // SU-MIMO (3GPP TS 38.211 V15.4.0 section 7.3.1.3) +#define NR_MAX_NB_LAYERS 4 // 8 #define NR_MAX_NB_CODEWORDS 2 #define NR_MAX_NB_HARQ_PROCESSES 16 -#define NR_MAX_PDSCH_ENCODED_LENGTH (NR_MAX_NB_RB*NR_SYMBOLS_PER_SLOT*NR_NB_SC_PER_RB*8*NR_MAX_NB_LAYERS) // 8 is the maximum modulation order (it was 950984 before !!) -#define NR_MAX_PUSCH_ENCODED_LENGTH NR_MAX_PDSCH_ENCODED_LENGTH + #define NR_MAX_PDSCH_TBS 3824 #define NR_MAX_SIB_LENGTH 2976 // 3GPP TS 38.331 section 5.2.1 - The physical layer imposes a limit to the maximum size a SIB can take. The maximum SIB1 or SI message size is 2976 bits. -#define MAX_NUM_NR_DLSCH_SEGMENTS (NR_MAX_NB_LAYERS*34) -#define MAX_NR_DLSCH_PAYLOAD_BYTES (MAX_NUM_NR_DLSCH_SEGMENTS*1056) +#define MAX_NUM_NR_DLSCH_SEGMENTS_PER_LAYER 34 #define MAX_NUM_NR_ULSCH_SEGMENTS 34 #define MAX_NR_ULSCH_PAYLOAD_BYTES (MAX_NUM_NR_ULSCH_SEGMENTS*1056) diff --git a/openair1/SIMULATION/NR_PHY/dlschsim.c b/openair1/SIMULATION/NR_PHY/dlschsim.c index ff07422c6b..060edc77f5 100644 --- a/openair1/SIMULATION/NR_PHY/dlschsim.c +++ b/openair1/SIMULATION/NR_PHY/dlschsim.c @@ -644,7 +644,7 @@ int main(int argc, char **argv) for (i = 0; i < 2; i++) { printf("gNB %d\n", i); - free_gNB_dlsch(&(msgDataTx.dlsch[0][i]),N_RB_DL); + free_gNB_dlsch(&(msgDataTx.dlsch[0][i]),N_RB_DL,frame_parms); printf("UE %d\n", i); free_nr_ue_dlsch(&(UE->dlsch[0][0][i]),N_RB_DL); } diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c index df25b085e6..b6e335466d 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c @@ -629,7 +629,7 @@ void schedule_nr_sib1(module_id_t module_idP, frame_t frameP, sub_frame_t slotP) nfapi_nr_pdu_t *tx_req = &gNB_mac->TX_req[CC_id].pdu_list[ntx_req]; // Data to be transmitted - bzero(tx_req->TLVs[0].value.direct,MAX_NR_DLSCH_PAYLOAD_BYTES); + bzero(tx_req->TLVs[0].value.direct,MAX_NUM_NR_DLSCH_SEGMENTS_PER_LAYER*1056); memcpy(tx_req->TLVs[0].value.direct, sib1_payload, sib1_sdu_length); tx_req->PDU_length = TBS; diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c index c0107c5fc6..26898550f4 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c @@ -56,8 +56,6 @@ extern RAN_CONTEXT_t RC; const uint8_t nr_rv_round_map[4] = {0, 2, 3, 1}; //#define ENABLE_MAC_PAYLOAD_DEBUG 1 -//uint8_t mac_pdu[MAX_NR_DLSCH_PAYLOAD_BYTES]; - /*Scheduling of DLSCH with associated DCI in common search space * current version has only a DCI for type 1 PDCCH for C_RNTI*/ void nr_schedule_css_dlsch_phytest(module_id_t module_idP, From aa6f6361983c000416bea3540e278e81c42ca9b7 Mon Sep 17 00:00:00 2001 From: francescomani Date: Tue, 1 Feb 2022 10:25:39 +0100 Subject: [PATCH 21/96] adding log_e for ulsch segmentation --- openair1/PHY/INIT/nr_init_ue.c | 1 + openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c | 6 ++++++ openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c | 5 +++++ 3 files changed, 12 insertions(+) diff --git a/openair1/PHY/INIT/nr_init_ue.c b/openair1/PHY/INIT/nr_init_ue.c index 93339b4cd2..853240b3eb 100644 --- a/openair1/PHY/INIT/nr_init_ue.c +++ b/openair1/PHY/INIT/nr_init_ue.c @@ -66,6 +66,7 @@ extern uint16_t beta_cqi[16]; */ void phy_init_nr_ue__PDSCH(NR_UE_PDSCH *const pdsch, const NR_DL_FRAME_PARMS *const fp) { + AssertFatal( pdsch, "pdsch==0" ); pdsch->pmi_ext = (uint8_t *)malloc16_clear( fp->N_RB_DL ); pdsch->llr[0] = (int16_t *)malloc16_clear( (8*(3*8*6144))*sizeof(int16_t) ); diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c index 01b6be91ab..38b4465de8 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c +++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c @@ -554,6 +554,12 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, &harq_process->F, p_decParams->BG); + if (harq_process->C>MAX_NUM_NR_DLSCH_SEGMENTS_PER_LAYER*n_layers) { + LOG_E(PHY,"nr_segmentation.c: too many segments %d, B %d\n",harq_process->C,harq_process->B); + return(-1); + } + + #ifdef DEBUG_ULSCH_DECODING printf("ulsch decoding nr segmentation Z %d\n", harq_process->Z); if (!frame%100) diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c index 5a9fbd9648..f275304185 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c @@ -321,6 +321,11 @@ int nr_ulsch_encoding(PHY_VARS_NR_UE *ue, pz, &harq_process->F, harq_process->BG); + + if (harq_process->C>MAX_NUM_NR_DLSCH_SEGMENTS_PER_LAYER*harq_process->pusch_pdu.nrOfLayers) { + LOG_E(PHY,"nr_segmentation.c: too many segments %d, B %d\n",harq_process->C,harq_process->B); + return(-1); + } stop_meas(&ue->ulsch_segmentation_stats); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_NR_SEGMENTATION, VCD_FUNCTION_OUT); From 19bb8fd537b1a950d1faa727da0844f756aa4737 Mon Sep 17 00:00:00 2001 From: francescomani Date: Tue, 1 Feb 2022 15:27:20 +0100 Subject: [PATCH 22/96] tentative fix for RRC reconfiguration after UE capabilities --- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c | 1 + openair2/RRC/NR/MESSAGES/asn1_msg.c | 2 ++ openair2/RRC/NR/rrc_gNB.c | 8 +++++--- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c index 7b7b5c771b..300fc66ada 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c @@ -336,6 +336,7 @@ void nr_set_pdsch_semi_static(const NR_ServingCellConfigCommon_t *scc, ps->mcsTableIdx = 2; } else ps->mcsTableIdx = 0; + LOG_D(NR_MAC,"MCS Table Index: %d\n",ps->mcsTableIdx); if(dci_format == 0) // format 1_0 ps->numDmrsCdmGrpsNoData = (ps->nrOfSymbols == 2 ? 1 : 2); diff --git a/openair2/RRC/NR/MESSAGES/asn1_msg.c b/openair2/RRC/NR/MESSAGES/asn1_msg.c index 116f1e1ba2..b5b5d51b51 100755 --- a/openair2/RRC/NR/MESSAGES/asn1_msg.c +++ b/openair2/RRC/NR/MESSAGES/asn1_msg.c @@ -1402,6 +1402,8 @@ void update_cellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig, NR_UE_NR_Capability_t *uecap) { NR_SpCellConfig_t *SpCellConfig = cellGroupConfig->spCellConfig; + if (SpCellConfig == NULL) return; + NR_ServingCellConfigCommon_t *scc = carrier->servingcellconfigcommon; NR_BWP_DownlinkDedicated_t *bwp_Dedicated = SpCellConfig->spCellConfigDedicated->initialDownlinkBWP; diff --git a/openair2/RRC/NR/rrc_gNB.c b/openair2/RRC/NR/rrc_gNB.c index d7556b3290..bf2c42bd83 100755 --- a/openair2/RRC/NR/rrc_gNB.c +++ b/openair2/RRC/NR/rrc_gNB.c @@ -748,6 +748,8 @@ rrc_gNB_generate_defaultRRCReconfiguration( dedicatedNAS_MessageList = NULL; } + gNB_RRC_INST *rrc = RC.nrrrc[ctxt_pP->module_id]; + gNB_RRC_UE_t *ue_p = &ue_context_pP->ue_context; memset(buffer, 0, sizeof(buffer)); size = do_RRCReconfiguration(ctxt_pP, buffer, sizeof(buffer), xid, @@ -758,10 +760,10 @@ rrc_gNB_generate_defaultRRCReconfiguration( NULL, NULL, dedicatedNAS_MessageList, + ue_context_pP, + &rrc->carrier, NULL, - NULL, - NULL, - NULL); + ue_p->masterCellGroup); free(ue_context_pP->ue_context.nas_pdu.buffer); From f056f0c170f8df1c42c89140e5babf1019abea05 Mon Sep 17 00:00:00 2001 From: francescomani Date: Thu, 3 Feb 2022 19:35:30 +0100 Subject: [PATCH 23/96] txdataF_precoding local --- openair1/PHY/NR_TRANSPORT/nr_dlsch.c | 7 ++++++- openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c | 3 +-- openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c | 2 +- openair1/PHY/defs_gNB.h | 2 -- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c index 1061444f68..17c729e5ae 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c @@ -140,7 +140,6 @@ void nr_generate_pdsch(processingData_L1tx_t *msgTx, nfapi_nr_dl_tti_pdsch_pdu_rel15_t *rel15 = &harq->pdsch_pdu.pdsch_pdu_rel15; int16_t **mod_symbs = (int16_t**)dlsch->mod_symbs; int16_t **tx_layers = (int16_t**)dlsch->txdataF; - int16_t **txdataF_precoding = (int16_t**)dlsch->txdataF_precoding; int8_t Wf[2], Wt[2], l0, l_prime, l_overline, delta; uint8_t dmrs_Type = rel15->dmrsConfigType; int nb_re_dmrs; @@ -277,6 +276,9 @@ void nr_generate_pdsch(processingData_L1tx_t *msgTx, start_sc -= frame_parms->ofdm_symbol_size; int txdataF_offset = (slot%2)*frame_parms->samples_per_slot_wCP; + int16_t **txdataF_precoding = (int16_t **)malloc16(rel15->nrOfLayers*sizeof(int16_t *)); + for (int layer = 0; layernrOfLayers; layer++) + txdataF_precoding[layer] = (int16_t *)malloc16(2*14*frame_parms->ofdm_symbol_size*sizeof(int16_t)); #ifdef DEBUG_DLSCH_MAPPING printf("PDSCH resource mapping started (start SC %d\tstart symbol %d\tN_PRB %d\tnb_re %d,nb_layers %d)\n", @@ -591,6 +593,9 @@ void nr_generate_pdsch(processingData_L1tx_t *msgTx, else { LOG_D(PHY,"beam index for PDSCH allocation already taken\n"); } + for (int layer = 0; layernrOfLayers; layer++) + free16(txdataF_precoding[layer],2*14*frame_parms->ofdm_symbol_size); + free16(txdataF_precoding,rel15->nrOfLayers); }// dlsch loop } diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c index cdcd0e0ba1..8a1dd57c48 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c @@ -122,7 +122,7 @@ NR_gNB_DLSCH_t *new_gNB_dlsch(NR_DL_FRAME_PARMS *frame_parms, int txdataf_size = frame_parms->N_RB_DL*NR_SYMBOLS_PER_SLOT*NR_NB_SC_PER_RB*8; // max pdsch encoded length for each layer dlsch->txdataF = (int32_t **)malloc16(max_layers*sizeof(int32_t *)); - dlsch->txdataF_precoding = (int32_t **)malloc16(max_layers*sizeof(int32_t *)); + dlsch->ue_spec_bf_weights = (int32_t ***)malloc16(max_layers*sizeof(int32_t **)); for (int layer=0; layerue_spec_bf_weights[layer] = (int32_t **)malloc16(64*sizeof(int32_t *)); @@ -135,7 +135,6 @@ NR_gNB_DLSCH_t *new_gNB_dlsch(NR_DL_FRAME_PARMS *frame_parms, } } dlsch->txdataF[layer] = (int32_t *)malloc16((txdataf_size)*sizeof(int32_t)); - dlsch->txdataF_precoding[layer] = (int32_t *)malloc16(2*14*frame_parms->ofdm_symbol_size*sizeof(int32_t)); } for (int q=0; qharq_processes[i]->c = (uint8_t **)malloc16(a_segments*sizeof(uint8_t *)); - dlsch->harq_processes[i]->p_nrLDPC_procBuf = (uint8_t **)malloc16(a_segments*sizeof(uint8_t *)); + dlsch->harq_processes[i]->p_nrLDPC_procBuf = (t_nrLDPC_procBuf **)malloc16(a_segments*sizeof(t_nrLDPC_procBuf *)); for (int r=0; rharq_processes[i]->p_nrLDPC_procBuf[r] = nrLDPC_init_mem(); dlsch->harq_processes[i]->c[r] = (uint8_t *)malloc16(1056); diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h index 9217e566ae..df8340dd8c 100644 --- a/openair1/PHY/defs_gNB.h +++ b/openair1/PHY/defs_gNB.h @@ -158,8 +158,6 @@ typedef struct { NR_DL_gNB_HARQ_t harq_process; /// TX buffers for UE-spec transmission (antenna layers 1,...,4 after to precoding) int32_t **txdataF; - /// TX buffers for UE-spec transmission (antenna ports 1000 or 1001,...,1007, before precoding) - int32_t **txdataF_precoding; /// Modulated symbols buffer int32_t *mod_symbs[NR_MAX_NB_CODEWORDS]; /// beamforming weights for UE-spec transmission (antenna ports 5 or 7..14), for each codeword, maximum 4 layers? From e27ce4db1ef4a70af0feb81fcb1c0dfdceee5da7 Mon Sep 17 00:00:00 2001 From: francescomani Date: Sun, 6 Feb 2022 12:04:36 +0100 Subject: [PATCH 24/96] fix in max mcs for table1 --- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c index ea298494c4..7d61cd1cf6 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c @@ -384,12 +384,17 @@ int nr_write_ce_dlsch_pdu(module_id_t module_idP, #define BLER_UPDATE_FRAME 10 #define BLER_FILTER 0.9f -int get_mcs_from_bler(module_id_t mod_id, int CC_id, frame_t frame, sub_frame_t slot, int UE_id) +int get_mcs_from_bler(module_id_t mod_id, int CC_id, frame_t frame, sub_frame_t slot, int UE_id, int mcs_table) { gNB_MAC_INST *nrmac = RC.nrmac[mod_id]; const NR_ServingCellConfigCommon_t *scc = nrmac->common_channels[CC_id].ServingCellConfigCommon; const int n = nr_slots_per_frame[*scc->ssbSubcarrierSpacing]; + int max_allowed_mcs = (mcs_table == 1) ? 27 : 28; + int max_mcs = nrmac->dl_max_mcs; + if (nrmac->dl_max_mcs>max_allowed_mcs) + max_mcs = max_allowed_mcs; + NR_DL_bler_stats_t *bler_stats = &nrmac->UE_info.UE_sched_ctrl[UE_id].dl_bler_stats; /* first call: everything is zero. Initialize to sensible default */ if (bler_stats->last_frame_slot == 0 && bler_stats->mcs == 0) { @@ -435,7 +440,7 @@ int get_mcs_from_bler(module_id_t mod_id, int CC_id, frame_t frame, sub_frame_t if (bler_stats->rd2_bler > nrmac->dl_rd2_bler_threshold && old_mcs > 6) { new_mcs -= 2; } else if (bler_stats->rd2_bler < nrmac->dl_rd2_bler_threshold) {*/ - if (bler_stats->bler < nrmac->dl_bler_target_lower && old_mcs < nrmac->dl_max_mcs && dtx > 9) + if (bler_stats->bler < nrmac->dl_bler_target_lower && old_mcs < max_mcs && dtx > 9) new_mcs += 1; else if (bler_stats->bler > nrmac->dl_bler_target_upper && old_mcs > 6) new_mcs -= 1; @@ -699,7 +704,7 @@ void pf_dl(module_id_t module_id, /* Calculate coeff */ ps->nrOfLayers = 1; - sched_pdsch->mcs = get_mcs_from_bler(module_id, /* CC_id = */ 0, frame, slot, UE_id); + sched_pdsch->mcs = get_mcs_from_bler(module_id, /* CC_id = */ 0, frame, slot, UE_id, ps->mcs_Table); uint32_t tbs = pf_tbs[ps->mcsTableIdx][sched_pdsch->mcs]; coeff_ue[UE_id] = (float) tbs / thr_ue[UE_id]; LOG_D(NR_MAC,"b %d, thr_ue[%d] %f, tbs %d, coeff_ue[%d] %f\n", From 9056bfa92627c8aced2d2c5a660c5eab82084102 Mon Sep 17 00:00:00 2001 From: francescomani Date: Mon, 7 Feb 2022 09:19:51 +0100 Subject: [PATCH 25/96] flag to update ps structure --- openair2/LAYER2/NR_MAC_gNB/config.c | 1 + openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c | 10 +++++++--- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c | 15 ++++++++++++--- openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h | 2 +- 4 files changed, 21 insertions(+), 7 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_gNB/config.c b/openair2/LAYER2/NR_MAC_gNB/config.c index ae3a3bba24..b740277f41 100644 --- a/openair2/LAYER2/NR_MAC_gNB/config.c +++ b/openair2/LAYER2/NR_MAC_gNB/config.c @@ -614,6 +614,7 @@ int rrc_mac_config_req_gNB(module_id_t Mod_idP, process_CellGroup(CellGroup,&UE_info->UE_sched_ctrl[UE_id]); const NR_ServingCellConfig_t *servingCellConfig = CellGroup ? CellGroup->spCellConfig->spCellConfigDedicated : NULL; NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id]; + sched_ctrl->update_ps = TRUE; const NR_PDSCH_ServingCellConfig_t *pdsch = servingCellConfig ? servingCellConfig->pdsch_ServingCellConfig->choice.setup : NULL; if (sched_ctrl->available_dl_harq.len == 0) { // add all available DL HARQ processes for this UE in SA diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c index 7d61cd1cf6..ca140d4673 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c @@ -577,8 +577,10 @@ bool allocate_dl_retransmission(module_id_t module_id, } /* check whether we need to switch the TDA allocation since the last * (re-)transmission */ - if (ps->time_domain_allocation != tda) + if (ps->time_domain_allocation != tda || sched_ctrl->update_ps) { nr_set_pdsch_semi_static(scc, cg, sched_ctrl->active_bwp, bwpd, tda, f, ps); + sched_ctrl->update_ps = FALSE; + } } else { /* the retransmission will use a different time domain allocation, check * that we have enough resources */ @@ -704,7 +706,7 @@ void pf_dl(module_id_t module_id, /* Calculate coeff */ ps->nrOfLayers = 1; - sched_pdsch->mcs = get_mcs_from_bler(module_id, /* CC_id = */ 0, frame, slot, UE_id, ps->mcs_Table); + sched_pdsch->mcs = get_mcs_from_bler(module_id, /* CC_id = */ 0, frame, slot, UE_id, ps->mcsTableIdx); uint32_t tbs = pf_tbs[ps->mcsTableIdx][sched_pdsch->mcs]; coeff_ue[UE_id] = (float) tbs / thr_ue[UE_id]; LOG_D(NR_MAC,"b %d, thr_ue[%d] %f, tbs %d, coeff_ue[%d] %f\n", @@ -794,8 +796,10 @@ void pf_dl(module_id_t module_id, NR_sched_pdsch_t *sched_pdsch = &sched_ctrl->sched_pdsch; NR_pdsch_semi_static_t *ps = &sched_ctrl->pdsch_semi_static; const long f = (sched_ctrl->active_bwp || bwpd) ? sched_ctrl->search_space->searchSpaceType->choice.ue_Specific->dci_Formats : 0; - if (ps->time_domain_allocation != tda) + if (ps->time_domain_allocation != tda || sched_ctrl->update_ps) { nr_set_pdsch_semi_static(scc, UE_info->CellGroup[UE_id], sched_ctrl->active_bwp, bwpd, tda, f, ps); + sched_ctrl->update_ps = FALSE; + } sched_pdsch->Qm = nr_get_Qm_dl(sched_pdsch->mcs, ps->mcsTableIdx); sched_pdsch->R = nr_get_code_rate_dl(sched_pdsch->mcs, ps->mcsTableIdx); sched_pdsch->pucch_allocation = alloc; diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c index bde6c6109d..f845d17bac 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c @@ -973,8 +973,11 @@ bool allocate_ul_retransmission(module_id_t module_id, if (ps->time_domain_allocation != tda || ps->dci_format != dci_format - || ps->num_dmrs_cdm_grps_no_data != num_dmrs_cdm_grps_no_data) + || ps->num_dmrs_cdm_grps_no_data != num_dmrs_cdm_grps_no_data + || sched_ctrl->update_ps) { nr_set_pusch_semi_static(scc, sched_ctrl->active_ubwp, ubwpd, dci_format, tda, num_dmrs_cdm_grps_no_data, ps); + sched_ctrl->update_ps = FALSE; + } LOG_D(NR_MAC, "%s(): retransmission keeping TDA %d and TBS %d\n", __func__, tda, retInfo->tb_size); } else { /* the retransmission will use a different time domain allocation, check @@ -1158,8 +1161,11 @@ void pf_ul(module_id_t module_id, const int tda = sched_ctrl->active_ubwp ? nrmac->preferred_ul_tda[sched_ctrl->active_ubwp->bwp_Id][slot] : 0; if (ps->time_domain_allocation != tda || ps->dci_format != dci_format - || ps->num_dmrs_cdm_grps_no_data != num_dmrs_cdm_grps_no_data) + || ps->num_dmrs_cdm_grps_no_data != num_dmrs_cdm_grps_no_data + || sched_ctrl->update_ps) { nr_set_pusch_semi_static(scc, sched_ctrl->active_ubwp, ubwpd, dci_format, tda, num_dmrs_cdm_grps_no_data, ps); + sched_ctrl->update_ps = FALSE; + } NR_sched_pusch_t *sched_pusch = &sched_ctrl->sched_pusch; sched_pusch->mcs = 9; update_ul_ue_R_Qm(sched_pusch, ps); @@ -1257,8 +1263,11 @@ void pf_ul(module_id_t module_id, const int tda = sched_ctrl->active_ubwp ? nrmac->preferred_ul_tda[sched_ctrl->active_ubwp->bwp_Id][slot] : 0; if (ps->time_domain_allocation != tda || ps->dci_format != dci_format - || ps->num_dmrs_cdm_grps_no_data != num_dmrs_cdm_grps_no_data) + || ps->num_dmrs_cdm_grps_no_data != num_dmrs_cdm_grps_no_data + || sched_ctrl->update_ps) { nr_set_pusch_semi_static(scc, sched_ctrl->active_ubwp, ubwpd, dci_format, tda, num_dmrs_cdm_grps_no_data, ps); + sched_ctrl->update_ps = FALSE; + } update_ul_ue_R_Qm(sched_pusch, ps); /* Calculate the current scheduling bytes and the necessary RBs */ diff --git a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h index 45e0a5b52b..3c1c87d8a3 100644 --- a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h +++ b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h @@ -594,7 +594,7 @@ typedef struct { int ul_failure; struct CSI_Report CSI_report[MAX_CSI_REPORTS]; bool SR; - + bool update_ps; /// information about every HARQ process NR_UE_harq_t harq_processes[NR_MAX_NB_HARQ_PROCESSES]; /// HARQ processes that are free From c1dd5da1551312d2e615b5d12744150814b58bca Mon Sep 17 00:00:00 2001 From: rmagueta Date: Mon, 7 Feb 2022 12:45:14 +0000 Subject: [PATCH 26/96] Fix update_ps flag for PDSCH and PUSCH --- openair2/LAYER2/NR_MAC_gNB/config.c | 3 ++- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c | 8 ++++---- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c | 12 ++++++------ openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h | 3 ++- 4 files changed, 14 insertions(+), 12 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_gNB/config.c b/openair2/LAYER2/NR_MAC_gNB/config.c index b740277f41..94d9864844 100644 --- a/openair2/LAYER2/NR_MAC_gNB/config.c +++ b/openair2/LAYER2/NR_MAC_gNB/config.c @@ -614,7 +614,8 @@ int rrc_mac_config_req_gNB(module_id_t Mod_idP, process_CellGroup(CellGroup,&UE_info->UE_sched_ctrl[UE_id]); const NR_ServingCellConfig_t *servingCellConfig = CellGroup ? CellGroup->spCellConfig->spCellConfigDedicated : NULL; NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id]; - sched_ctrl->update_ps = TRUE; + sched_ctrl->update_pdsch_ps = TRUE; + sched_ctrl->update_pusch_ps = TRUE; const NR_PDSCH_ServingCellConfig_t *pdsch = servingCellConfig ? servingCellConfig->pdsch_ServingCellConfig->choice.setup : NULL; if (sched_ctrl->available_dl_harq.len == 0) { // add all available DL HARQ processes for this UE in SA diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c index ca140d4673..236890e690 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c @@ -577,9 +577,9 @@ bool allocate_dl_retransmission(module_id_t module_id, } /* check whether we need to switch the TDA allocation since the last * (re-)transmission */ - if (ps->time_domain_allocation != tda || sched_ctrl->update_ps) { + if (ps->time_domain_allocation != tda || sched_ctrl->update_pdsch_ps) { nr_set_pdsch_semi_static(scc, cg, sched_ctrl->active_bwp, bwpd, tda, f, ps); - sched_ctrl->update_ps = FALSE; + sched_ctrl->update_pdsch_ps = FALSE; } } else { /* the retransmission will use a different time domain allocation, check @@ -796,9 +796,9 @@ void pf_dl(module_id_t module_id, NR_sched_pdsch_t *sched_pdsch = &sched_ctrl->sched_pdsch; NR_pdsch_semi_static_t *ps = &sched_ctrl->pdsch_semi_static; const long f = (sched_ctrl->active_bwp || bwpd) ? sched_ctrl->search_space->searchSpaceType->choice.ue_Specific->dci_Formats : 0; - if (ps->time_domain_allocation != tda || sched_ctrl->update_ps) { + if (ps->time_domain_allocation != tda || sched_ctrl->update_pdsch_ps) { nr_set_pdsch_semi_static(scc, UE_info->CellGroup[UE_id], sched_ctrl->active_bwp, bwpd, tda, f, ps); - sched_ctrl->update_ps = FALSE; + sched_ctrl->update_pdsch_ps = FALSE; } sched_pdsch->Qm = nr_get_Qm_dl(sched_pdsch->mcs, ps->mcsTableIdx); sched_pdsch->R = nr_get_code_rate_dl(sched_pdsch->mcs, ps->mcsTableIdx); diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c index f845d17bac..b3c7711208 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c @@ -974,9 +974,9 @@ bool allocate_ul_retransmission(module_id_t module_id, if (ps->time_domain_allocation != tda || ps->dci_format != dci_format || ps->num_dmrs_cdm_grps_no_data != num_dmrs_cdm_grps_no_data - || sched_ctrl->update_ps) { + || sched_ctrl->update_pusch_ps) { nr_set_pusch_semi_static(scc, sched_ctrl->active_ubwp, ubwpd, dci_format, tda, num_dmrs_cdm_grps_no_data, ps); - sched_ctrl->update_ps = FALSE; + sched_ctrl->update_pusch_ps = FALSE; } LOG_D(NR_MAC, "%s(): retransmission keeping TDA %d and TBS %d\n", __func__, tda, retInfo->tb_size); } else { @@ -1162,9 +1162,9 @@ void pf_ul(module_id_t module_id, if (ps->time_domain_allocation != tda || ps->dci_format != dci_format || ps->num_dmrs_cdm_grps_no_data != num_dmrs_cdm_grps_no_data - || sched_ctrl->update_ps) { + || sched_ctrl->update_pusch_ps) { nr_set_pusch_semi_static(scc, sched_ctrl->active_ubwp, ubwpd, dci_format, tda, num_dmrs_cdm_grps_no_data, ps); - sched_ctrl->update_ps = FALSE; + sched_ctrl->update_pusch_ps = FALSE; } NR_sched_pusch_t *sched_pusch = &sched_ctrl->sched_pusch; sched_pusch->mcs = 9; @@ -1264,9 +1264,9 @@ void pf_ul(module_id_t module_id, if (ps->time_domain_allocation != tda || ps->dci_format != dci_format || ps->num_dmrs_cdm_grps_no_data != num_dmrs_cdm_grps_no_data - || sched_ctrl->update_ps) { + || sched_ctrl->update_pusch_ps) { nr_set_pusch_semi_static(scc, sched_ctrl->active_ubwp, ubwpd, dci_format, tda, num_dmrs_cdm_grps_no_data, ps); - sched_ctrl->update_ps = FALSE; + sched_ctrl->update_pusch_ps = FALSE; } update_ul_ue_R_Qm(sched_pusch, ps); diff --git a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h index 3c1c87d8a3..8c7b9f10f1 100644 --- a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h +++ b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h @@ -594,7 +594,8 @@ typedef struct { int ul_failure; struct CSI_Report CSI_report[MAX_CSI_REPORTS]; bool SR; - bool update_ps; + bool update_pdsch_ps; + bool update_pusch_ps; /// information about every HARQ process NR_UE_harq_t harq_processes[NR_MAX_NB_HARQ_PROCESSES]; /// HARQ processes that are free From f47131639469b91923e5d7966e63e19963a0fda9 Mon Sep 17 00:00:00 2001 From: francescomani Date: Mon, 7 Feb 2022 14:27:33 +0100 Subject: [PATCH 27/96] fix TRUE FALSE --- openair2/LAYER2/NR_MAC_gNB/config.c | 4 ++-- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c | 4 ++-- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_gNB/config.c b/openair2/LAYER2/NR_MAC_gNB/config.c index 94d9864844..b2d8ab774e 100644 --- a/openair2/LAYER2/NR_MAC_gNB/config.c +++ b/openair2/LAYER2/NR_MAC_gNB/config.c @@ -614,8 +614,8 @@ int rrc_mac_config_req_gNB(module_id_t Mod_idP, process_CellGroup(CellGroup,&UE_info->UE_sched_ctrl[UE_id]); const NR_ServingCellConfig_t *servingCellConfig = CellGroup ? CellGroup->spCellConfig->spCellConfigDedicated : NULL; NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id]; - sched_ctrl->update_pdsch_ps = TRUE; - sched_ctrl->update_pusch_ps = TRUE; + sched_ctrl->update_pdsch_ps = true; + sched_ctrl->update_pusch_ps = true; const NR_PDSCH_ServingCellConfig_t *pdsch = servingCellConfig ? servingCellConfig->pdsch_ServingCellConfig->choice.setup : NULL; if (sched_ctrl->available_dl_harq.len == 0) { // add all available DL HARQ processes for this UE in SA diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c index 236890e690..ad3846c578 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c @@ -579,7 +579,7 @@ bool allocate_dl_retransmission(module_id_t module_id, * (re-)transmission */ if (ps->time_domain_allocation != tda || sched_ctrl->update_pdsch_ps) { nr_set_pdsch_semi_static(scc, cg, sched_ctrl->active_bwp, bwpd, tda, f, ps); - sched_ctrl->update_pdsch_ps = FALSE; + sched_ctrl->update_pdsch_ps = false; } } else { /* the retransmission will use a different time domain allocation, check @@ -798,7 +798,7 @@ void pf_dl(module_id_t module_id, const long f = (sched_ctrl->active_bwp || bwpd) ? sched_ctrl->search_space->searchSpaceType->choice.ue_Specific->dci_Formats : 0; if (ps->time_domain_allocation != tda || sched_ctrl->update_pdsch_ps) { nr_set_pdsch_semi_static(scc, UE_info->CellGroup[UE_id], sched_ctrl->active_bwp, bwpd, tda, f, ps); - sched_ctrl->update_pdsch_ps = FALSE; + sched_ctrl->update_pdsch_ps = false; } sched_pdsch->Qm = nr_get_Qm_dl(sched_pdsch->mcs, ps->mcsTableIdx); sched_pdsch->R = nr_get_code_rate_dl(sched_pdsch->mcs, ps->mcsTableIdx); diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c index b3c7711208..41b49f7b1c 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c @@ -976,7 +976,7 @@ bool allocate_ul_retransmission(module_id_t module_id, || ps->num_dmrs_cdm_grps_no_data != num_dmrs_cdm_grps_no_data || sched_ctrl->update_pusch_ps) { nr_set_pusch_semi_static(scc, sched_ctrl->active_ubwp, ubwpd, dci_format, tda, num_dmrs_cdm_grps_no_data, ps); - sched_ctrl->update_pusch_ps = FALSE; + sched_ctrl->update_pusch_ps = false; } LOG_D(NR_MAC, "%s(): retransmission keeping TDA %d and TBS %d\n", __func__, tda, retInfo->tb_size); } else { @@ -1164,7 +1164,7 @@ void pf_ul(module_id_t module_id, || ps->num_dmrs_cdm_grps_no_data != num_dmrs_cdm_grps_no_data || sched_ctrl->update_pusch_ps) { nr_set_pusch_semi_static(scc, sched_ctrl->active_ubwp, ubwpd, dci_format, tda, num_dmrs_cdm_grps_no_data, ps); - sched_ctrl->update_pusch_ps = FALSE; + sched_ctrl->update_pusch_ps = false; } NR_sched_pusch_t *sched_pusch = &sched_ctrl->sched_pusch; sched_pusch->mcs = 9; @@ -1266,7 +1266,7 @@ void pf_ul(module_id_t module_id, || ps->num_dmrs_cdm_grps_no_data != num_dmrs_cdm_grps_no_data || sched_ctrl->update_pusch_ps) { nr_set_pusch_semi_static(scc, sched_ctrl->active_ubwp, ubwpd, dci_format, tda, num_dmrs_cdm_grps_no_data, ps); - sched_ctrl->update_pusch_ps = FALSE; + sched_ctrl->update_pusch_ps = false; } update_ul_ue_R_Qm(sched_pusch, ps); From ebfea5a0c94a532af67cba45b82c663ef6ace5ea Mon Sep 17 00:00:00 2001 From: francescomani Date: Tue, 8 Feb 2022 13:45:20 +0100 Subject: [PATCH 28/96] fix in txdataF_precoding initialization --- openair1/PHY/NR_TRANSPORT/nr_dlsch.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c index 17c729e5ae..b70b07f215 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c @@ -278,7 +278,7 @@ void nr_generate_pdsch(processingData_L1tx_t *msgTx, int txdataF_offset = (slot%2)*frame_parms->samples_per_slot_wCP; int16_t **txdataF_precoding = (int16_t **)malloc16(rel15->nrOfLayers*sizeof(int16_t *)); for (int layer = 0; layernrOfLayers; layer++) - txdataF_precoding[layer] = (int16_t *)malloc16(2*14*frame_parms->ofdm_symbol_size*sizeof(int16_t)); + txdataF_precoding[layer] = (int16_t *)malloc16(2*2*14*frame_parms->ofdm_symbol_size*sizeof(int16_t)); #ifdef DEBUG_DLSCH_MAPPING printf("PDSCH resource mapping started (start SC %d\tstart symbol %d\tN_PRB %d\tnb_re %d,nb_layers %d)\n", From 76885758aaf1f8acaff1f4fc13841fb287f4e7ba Mon Sep 17 00:00:00 2001 From: Thomas Schlichter Date: Mon, 7 Feb 2022 16:24:37 +0100 Subject: [PATCH 29/96] add support for continuous transmission In case of TDD we usually disable TX during RX. Unfortunately some USRPs create self-interference after disabling TX. To be able to work-around this issue, we add the flag "--continuous-tx". --- executables/nr-gnb.c | 21 +++++++++--- executables/nr-ru.c | 61 +++++++++++++++++++--------------- executables/nr-ue.c | 6 ++-- executables/softmodem-common.h | 4 +++ 4 files changed, 58 insertions(+), 34 deletions(-) diff --git a/executables/nr-gnb.c b/executables/nr-gnb.c index 2b1c36407b..e4170210e0 100644 --- a/executables/nr-gnb.c +++ b/executables/nr-gnb.c @@ -210,7 +210,6 @@ void rx_func(void *param) { if (pthread_mutex_unlock(&rnti_to_remove_mutex)) exit(1); // RX processing - int tx_slot_type = nr_slot_select(cfg,frame_tx,slot_tx); int rx_slot_type = nr_slot_select(cfg,frame_rx,slot_rx); if (rx_slot_type == NR_UPLINK_SLOT || rx_slot_type == NR_MIXED_SLOT) { // UE-specific RX processing for subframe n @@ -244,7 +243,8 @@ void rx_func(void *param) { gNB->if_inst->NR_UL_indication(&gNB->UL_INFO); pthread_mutex_unlock(&gNB->UL_INFO_mutex); stop_meas(&gNB->ul_indication_stats); - + + int tx_slot_type = nr_slot_select(cfg,frame_rx,slot_tx); if (tx_slot_type == NR_DOWNLINK_SLOT || tx_slot_type == NR_MIXED_SLOT) { notifiedFIFO_elt_t *res; processingData_L1tx_t *syncMsg; @@ -256,8 +256,17 @@ void rx_func(void *param) { syncMsg->timestamp_tx = info->timestamp_tx; res->key = slot_tx; pushTpool(gNB->threadPool, res); + } else if (get_softmodem_params()->continuous_tx) { + notifiedFIFO_elt_t *res = pullTpool(gNB->L1_tx_free, gNB->threadPool); + processingData_L1tx_t *syncMsg = (processingData_L1tx_t *)NotifiedFifoData(res); + syncMsg->gNB = gNB; + syncMsg->timestamp_tx = info->timestamp_tx; + syncMsg->frame = frame_tx; + syncMsg->slot = slot_tx; + res->key = slot_tx; + pushNotifiedFIFO(gNB->L1_tx_out, res); } - + #if 0 LOG_D(PHY, "rxtx:%lld nfapi:%lld phy:%lld tx:%lld rx:%lld prach:%lld ofdm:%lld ", softmodem_stats_rxtx_sf.diff_now, nfapi_meas.diff_now, @@ -397,7 +406,11 @@ void *tx_reorder_thread(void* param) { syncMsgRU.slot_tx = syncMsgL1->slot; syncMsgRU.timestamp_tx = syncMsgL1->timestamp_tx; syncMsgRU.ru = gNB->RU_list[0]; - next_tx_slot = get_next_downlink_slot(gNB, &gNB->gNB_config, syncMsgRU.frame_tx, syncMsgRU.slot_tx); + if (get_softmodem_params()->continuous_tx) { + int slots_per_frame = gNB->frame_parms.slots_per_frame; + next_tx_slot = (syncMsgRU.slot_tx + 1) % slots_per_frame; + } else + next_tx_slot = get_next_downlink_slot(gNB, &gNB->gNB_config, syncMsgRU.frame_tx, syncMsgRU.slot_tx); pushNotifiedFIFO(gNB->L1_tx_free, resL1); if (resL1==resL1Reserve) resL1Reserve=NULL; diff --git a/executables/nr-ru.c b/executables/nr-ru.c index 08decf0f67..45ef0f9baf 100644 --- a/executables/nr-ru.c +++ b/executables/nr-ru.c @@ -703,46 +703,53 @@ void tx_rf(RU_t *ru,int frame,int slot, uint64_t timestamp) { nfapi_nr_config_request_scf_t *cfg = &ru->config; void *txp[ru->nb_tx]; unsigned int txs; - int i,txsymb=fp->symbols_per_slot; + int i; T(T_ENB_PHY_OUTPUT_SIGNAL, T_INT(0), T_INT(0), T_INT(frame), T_INT(slot), T_INT(0), T_BUFFER(&ru->common.txdata[0][fp->get_samples_slot_timestamp(slot,fp,0)], fp->samples_per_subframe * 4)); - int slot_type = nr_slot_select(cfg,frame,slot%fp->slots_per_frame); - int prevslot_type = nr_slot_select(cfg,frame,(slot+(fp->slots_per_frame-1))%fp->slots_per_frame); - int nextslot_type = nr_slot_select(cfg,frame,(slot+1)%fp->slots_per_frame); int sf_extension = 0; int siglen=fp->get_samples_per_slot(slot,fp); - int flags=1; + int flags = 0; - //nr_subframe_t SF_type = nr_slot_select(cfg,slot%fp->slots_per_frame); - if (slot_type == NR_DOWNLINK_SLOT || slot_type == NR_MIXED_SLOT || IS_SOFTMODEM_RFSIM) { - if (cfg->cell_config.frame_duplex_type.value == TDD) { - if(slot_type == NR_MIXED_SLOT) { - txsymb = 0; + if (cfg->cell_config.frame_duplex_type.value == TDD && !get_softmodem_params()->continuous_tx) { + int slot_type = nr_slot_select(cfg,frame,slot%fp->slots_per_frame); + if(slot_type == NR_MIXED_SLOT) { + int txsymb = 0; - for(int symbol_count = 0; symbol_counttdd_table.max_tdd_periodicity_list[slot].max_num_of_symbol_per_slot_list[symbol_count].slot_config.value == 0) - txsymb++; - } - - AssertFatal(txsymb>0,"illegal txsymb %d\n",txsymb); - - if(slot%(fp->slots_per_subframe/2)) - siglen = txsymb * (fp->ofdm_symbol_size + fp->nb_prefix_samples); - else - siglen = (fp->ofdm_symbol_size + fp->nb_prefix_samples0) + (txsymb - 1) * (fp->ofdm_symbol_size + fp->nb_prefix_samples); - - //+ ru->end_of_burst_delay; - flags = 3; // end of burst + for(int symbol_count = 0; symbol_counttdd_table.max_tdd_periodicity_list[slot].max_num_of_symbol_per_slot_list[symbol_count].slot_config.value == 0) + txsymb++; } - if (slot_type == NR_DOWNLINK_SLOT && prevslot_type == NR_UPLINK_SLOT) { + AssertFatal(txsymb>0,"illegal txsymb %d\n",txsymb); + + if(slot%(fp->slots_per_subframe/2)) + siglen = txsymb * (fp->ofdm_symbol_size + fp->nb_prefix_samples); + else + siglen = (fp->ofdm_symbol_size + fp->nb_prefix_samples0) + (txsymb - 1) * (fp->ofdm_symbol_size + fp->nb_prefix_samples); + + //+ ru->end_of_burst_delay; + flags = 3; // end of burst + } else if (slot_type == NR_DOWNLINK_SLOT) { + int prevslot_type = nr_slot_select(cfg,frame,(slot+(fp->slots_per_frame-1))%fp->slots_per_frame); + int nextslot_type = nr_slot_select(cfg,frame,(slot+1)%fp->slots_per_frame); + if (prevslot_type == NR_UPLINK_SLOT) { flags = 2; // start of burst sf_extension = ru->sf_extension; - } - if (slot_type == NR_DOWNLINK_SLOT && nextslot_type == NR_UPLINK_SLOT) + } else if (nextslot_type == NR_UPLINK_SLOT) { flags = 3; // end of burst + } else { + flags = 1; // middle of burst + } } + } else { // FDD + if (proc->first_tx == 1) { + flags = 2; // start of burst + } else { + flags = 1; // middle of burst + } + } + if (flags) { if (fp->freq_range==nr_FR2) { // the beam index is written in bits 8-10 of the flags // bit 11 enables the gpio programming diff --git a/executables/nr-ue.c b/executables/nr-ue.c index 2e7b2ea0e1..0270486686 100644 --- a/executables/nr-ue.c +++ b/executables/nr-ue.c @@ -1091,9 +1091,8 @@ void *UE_thread(void *arg) { } int flags = 0; - int slot_tx_usrp = slot_nr + DURATION_RX_TO_TX - NR_RX_NB_TH; - if (openair0_cfg[0].duplex_mode == duplex_mode_TDD) { + if (openair0_cfg[0].duplex_mode == duplex_mode_TDD && !get_softmodem_params()->continuous_tx) { uint8_t tdd_period = mac->phy_config.config_req.tdd_table.tdd_period_in_slots; int nrofUplinkSlots, nrofUplinkSymbols; @@ -1105,8 +1104,9 @@ void *UE_thread(void *arg) { nrofUplinkSlots = mac->scc_SIB->tdd_UL_DL_ConfigurationCommon->pattern1.nrofUplinkSlots; nrofUplinkSymbols = mac->scc_SIB->tdd_UL_DL_ConfigurationCommon->pattern1.nrofUplinkSymbols; } - uint8_t num_UL_slots = nrofUplinkSlots + (nrofUplinkSymbols != 0); + int slot_tx_usrp = slot_nr + DURATION_RX_TO_TX - NR_RX_NB_TH; + uint8_t num_UL_slots = nrofUplinkSlots + (nrofUplinkSymbols != 0); uint8_t first_tx_slot = tdd_period - num_UL_slots; if (slot_tx_usrp % tdd_period == first_tx_slot) diff --git a/executables/softmodem-common.h b/executables/softmodem-common.h index 9aca677473..9512199cd3 100644 --- a/executables/softmodem-common.h +++ b/executables/softmodem-common.h @@ -99,6 +99,7 @@ extern "C" #define CONFIG_HLP_USRP_THREAD "having extra thead for usrp tx\n" #define CONFIG_HLP_NFAPI "Change the nFAPI mode for NR\n" #define CONFIG_L1_EMULATOR "Run in L1 emulated mode (disable PHY layer)\n" +#define CONFIG_HLP_CONTINUOUS_TX "perform continuous transmission, even in TDD mode (to work around USRP issues)\n" /*-----------------------------------------------------------------------------------------------------------------------------------------------------*/ /* command line parameters common to eNodeB and UE */ @@ -127,6 +128,7 @@ extern "C" #define NODE_NUMBER softmodem_params.node_number #define NON_STOP softmodem_params.non_stop #define EMULATE_L1 softmodem_params.emulate_l1 +#define CONTINUOUS_TX softmodem_params.continuous_tx #define DEFAULT_RFCONFIG_FILE "/usr/local/etc/syriq/ue.band7.tm1.PRB100.NR40.dat"; @@ -166,6 +168,7 @@ extern int usrp_tx_thread; {"nfapi", CONFIG_HLP_NFAPI, 0, u8ptr:&nfapi_mode, defintval:0, TYPE_UINT8, 0}, \ {"non-stop", CONFIG_HLP_NONSTOP, PARAMFLAG_BOOL, iptr:&NON_STOP, defintval:0, TYPE_INT, 0}, \ {"emulate-l1", CONFIG_L1_EMULATOR, PARAMFLAG_BOOL, iptr:&EMULATE_L1, defintval:0, TYPE_INT, 0}, \ + {"continuous-tx", CONFIG_HLP_CONTINUOUS_TX,PARAMFLAG_BOOL, iptr:&CONTINUOUS_TX, defintval:0, TYPE_INT, 0}, \ } #define CONFIG_HLP_NSA "Enable NSA mode \n" @@ -262,6 +265,7 @@ typedef struct { uint16_t node_number; int non_stop; int emulate_l1; + int continuous_tx; } softmodem_params_t; extern uint64_t get_softmodem_optmask(void); From 67ca2759b2d16af25ecea9d6c17c40ea47791101 Mon Sep 17 00:00:00 2001 From: Laurent THOMAS Date: Tue, 15 Feb 2022 13:13:15 +0100 Subject: [PATCH 30/96] remove-NR_UE_PBCH scope to finish --- openair1/PHY/INIT/nr_init_ue.c | 19 -- .../PHY/NR_UE_ESTIMATION/nr_adjust_synch_ue.c | 5 +- .../nr_dl_channel_estimation.c | 120 ++++++------ openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h | 7 +- .../PHY/NR_UE_TRANSPORT/nr_initial_sync.c | 13 +- openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c | 185 +++++++++--------- .../NR_UE_TRANSPORT/nr_transport_proto_ue.h | 5 +- openair1/PHY/TOOLS/nr_phy_scope.c | 82 +++++--- openair1/PHY/TOOLS/phy_scope_interface.h | 12 +- openair1/PHY/defs_UE.h | 1 + openair1/PHY/defs_nr_UE.h | 38 +--- openair1/SCHED_NR_UE/defs.h | 8 +- openair1/SCHED_NR_UE/phy_procedures_nr_ue.c | 36 ++-- .../SIMULATION/NR_PHY/nr_dummy_functions.c | 4 +- openair1/SIMULATION/NR_PHY/pbchsim.c | 18 +- 15 files changed, 288 insertions(+), 265 deletions(-) diff --git a/openair1/PHY/INIT/nr_init_ue.c b/openair1/PHY/INIT/nr_init_ue.c index b571afe416..9266a1fecd 100644 --- a/openair1/PHY/INIT/nr_init_ue.c +++ b/openair1/PHY/INIT/nr_init_ue.c @@ -416,29 +416,10 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, } // PBCH - pbch_vars[gNB_id]->rxdataF_ext = (int32_t **)malloc16( fp->nb_antennas_rx*sizeof(int32_t *) ); - pbch_vars[gNB_id]->rxdataF_comp = (int32_t **)malloc16_clear( 4*fp->nb_antennas_rx*sizeof(int32_t *) ); - pbch_vars[gNB_id]->dl_ch_estimates = (int32_t **)malloc16_clear( 4*fp->nb_antennas_rx*sizeof(int32_t *) ); - pbch_vars[gNB_id]->dl_ch_estimates_ext = (int32_t **)malloc16_clear( 4*fp->nb_antennas_rx*sizeof(int32_t *) ); - pbch_vars[gNB_id]->dl_ch_estimates_time = (int32_t **)malloc16_clear( 4*fp->nb_antennas_rx*sizeof(int32_t *) ); - pbch_vars[gNB_id]->llr = (int16_t *)malloc16_clear( 1920 ); // prach_vars[gNB_id]->prachF = (int16_t *)malloc16_clear( sizeof(int)*(7*2*sizeof(int)*(fp->ofdm_symbol_size*12)) ); prach_vars[gNB_id]->prach = (int16_t *)malloc16_clear( sizeof(int)*(7*2*sizeof(int)*(fp->ofdm_symbol_size*12)) ); - for (i=0; inb_antennas_rx; i++) { - pbch_vars[gNB_id]->rxdataF_ext[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*20*12*4 ); - - for (j=0; j<4; j++) {//fp->nb_antennas_tx;j++) { - int idx = (j*fp->nb_antennas_rx)+i; - pbch_vars[gNB_id]->rxdataF_comp[idx] = (int32_t *)malloc16_clear( sizeof(int32_t)*20*12*4 ); - pbch_vars[gNB_id]->dl_ch_estimates[idx] = (int32_t *)malloc16_clear( sizeof(int32_t)*7*2*sizeof(int)*(fp->ofdm_symbol_size) ); - pbch_vars[gNB_id]->dl_ch_estimates_time[idx]= (int32_t *)malloc16_clear( sizeof(int32_t)*7*2*sizeof(int)*(fp->ofdm_symbol_size) ); - pbch_vars[gNB_id]->dl_ch_estimates_ext[idx] = (int32_t *)malloc16_clear( sizeof(int32_t)*20*12*4 ); - } - } } - - pbch_vars[gNB_id]->decoded_output = (uint8_t *)malloc16_clear(64); } // initialization for the last instance of pdsch_vars (used for MU-MIMO) diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_adjust_synch_ue.c b/openair1/PHY/NR_UE_ESTIMATION/nr_adjust_synch_ue.c index 19d4bf5079..89d67408e1 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_adjust_synch_ue.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_adjust_synch_ue.c @@ -36,6 +36,7 @@ void nr_adjust_synch_ue(NR_DL_FRAME_PARMS *frame_parms, PHY_VARS_NR_UE *ue, module_id_t gNB_id, + const int estimateSz, struct complex16 dl_ch_estimates_time[][estimateSz], uint8_t frame, uint8_t subframe, unsigned char clear, @@ -60,8 +61,8 @@ void nr_adjust_synch_ue(NR_DL_FRAME_PARMS *frame_parms, int j = (i < 0) ? (i + frame_parms->ofdm_symbol_size) : i; for (int aa = 0; aa < frame_parms->nb_antennas_rx; aa++) { - int Re = ((int16_t*)ue->pbch_vars[gNB_id]->dl_ch_estimates_time[aa])[(j<<1)]; - int Im = ((int16_t*)ue->pbch_vars[gNB_id]->dl_ch_estimates_time[aa])[1+(j<<1)]; + int Re = dl_ch_estimates_time[aa][j].r; + int Im = dl_ch_estimates_time[aa][j].i; temp += (Re*Re/2) + (Im*Im/2); } diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c index 30eae2d30f..8efe85b222 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -29,6 +29,7 @@ #include "PHY/NR_REFSIG/ptrs_nr.h" #include "PHY/NR_TRANSPORT/nr_sch_dmrs.h" #include "filt16a_32.h" +#include //#define DEBUG_PDSCH //#define DEBUG_PDCCH @@ -43,7 +44,6 @@ int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue, NR_UE_SSB *current_ssb) { int pilot[200] __attribute__((aligned(16))); - unsigned char aarx; unsigned short k; unsigned int pilot_cnt; int16_t ch[2],*pil,*rxF; @@ -77,7 +77,7 @@ int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue, // generate pilot nr_pbch_dmrs_rx(dmrss,ue->nr_gold_pbch[n_hf][ssb_index], &pilot[0]); - for (aarx=0; aarxframe_parms.nb_antennas_rx; aarx++) { + for (int aarx=0; aarxframe_parms.nb_antennas_rx; aarx++) { int re_offset = ssb_offset; pil = (int16_t *)&pilot[0]; @@ -197,6 +197,9 @@ int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue, int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue, + int estimateSz, + struct complex16 dl_ch_estimates [][estimateSz], + struct complex16 dl_ch_estimates_time [][estimateSz], UE_nr_rxtx_proc_t *proc, uint8_t gNB_id, unsigned char Ns, @@ -206,16 +209,14 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue, uint8_t n_hf) { int pilot[200] __attribute__((aligned(16))); - unsigned char aarx,p; unsigned short k; unsigned int pilot_cnt; - int16_t ch[2],*pil,*rxF,*dl_ch,*fl,*fm,*fr; + int16_t *pil,*rxF,*dl_ch,*fl,*fm,*fr; int ch_offset,symbol_offset; //int slot_pbch; uint8_t nushift; - int **dl_ch_estimates =ue->pbch_vars[gNB_id]->dl_ch_estimates; - int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[proc->thread_id].rxdataF; + int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[proc->thread_id].rxdataF; nushift = ue->frame_parms.Nid_cell%4; ue->frame_parms.nushift = nushift; @@ -269,17 +270,57 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue, break; } + idft_size_idx_t idftsizeidx; + + switch (ue->frame_parms.ofdm_symbol_size) { + case 128: + idftsizeidx = IDFT_128; + break; + + case 256: + idftsizeidx = IDFT_256; + break; + + case 512: + idftsizeidx = IDFT_512; + break; + + case 1024: + idftsizeidx = IDFT_1024; + break; + + case 1536: + idftsizeidx = IDFT_1536; + break; + + case 2048: + idftsizeidx = IDFT_2048; + break; + + case 3072: + idftsizeidx = IDFT_3072; + break; + + case 4096: + idftsizeidx = IDFT_4096; + break; + + default: + printf("unsupported ofdm symbol size \n"); + assert(0); + } + // generate pilot nr_pbch_dmrs_rx(dmrss,ue->nr_gold_pbch[n_hf][ssb_index], &pilot[0]); - for (aarx=0; aarxframe_parms.nb_antennas_rx; aarx++) { + for (int aarx=0; aarxframe_parms.nb_antennas_rx; aarx++) { int re_offset = ssb_offset; pil = (int16_t *)&pilot[0]; rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)]; dl_ch = (int16_t *)&dl_ch_estimates[aarx][ch_offset]; - memset(dl_ch,0,4*(ue->frame_parms.ofdm_symbol_size)); + memset(dl_ch,0,sizeof(*dl_ch)*(ue->frame_parms.ofdm_symbol_size)); #ifdef DEBUG_CH printf("pbch ch est pilot addr %p RB_DL %d\n",&pilot[0], ue->frame_parms.N_RB_DL); @@ -289,6 +330,7 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue, #endif // Treat first 2 pilots specially (left edge) + int16_t ch[2]; ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); @@ -402,62 +444,18 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue, } - idft_size_idx_t idftsizeidx; - - switch (ue->frame_parms.ofdm_symbol_size) { - case 128: - idftsizeidx = IDFT_128; - break; - - case 256: - idftsizeidx = IDFT_256; - break; - - case 512: - idftsizeidx = IDFT_512; - break; - - case 1024: - idftsizeidx = IDFT_1024; - break; - - case 1536: - idftsizeidx = IDFT_1536; - break; - - case 2048: - idftsizeidx = IDFT_2048; - break; - - case 3072: - idftsizeidx = IDFT_3072; - break; - - case 4096: - idftsizeidx = IDFT_4096; - break; - - default: - printf("unsupported ofdm symbol size \n"); - assert(0); - } - if( dmrss == 2) // update time statistics for last PBCH symbol { // do ifft of channel estimate - for (aarx=0; aarxframe_parms.nb_antennas_rx; aarx++) - for (p=0; pframe_parms.nb_antenna_ports_gNB; p++) { - if (ue->pbch_vars[gNB_id]->dl_ch_estimates[(p*ue->frame_parms.nb_antennas_rx)+aarx]) - { - LOG_D(PHY,"Channel Impulse Computation Slot %d ThreadId %d Symbol %d ch_offset %d\n", Ns, proc->thread_id, symbol, ch_offset); - idft(idftsizeidx, - (int16_t*) &ue->pbch_vars[gNB_id]->dl_ch_estimates[(p*ue->frame_parms.nb_antennas_rx)+aarx][ch_offset], - (int16_t*) ue->pbch_vars[gNB_id]->dl_ch_estimates_time[(p*ue->frame_parms.nb_antennas_rx)+aarx],1); - } - } - } - - } + LOG_D(PHY,"Channel Impulse Computation Slot %d Symbol %d ch_offset %d\n", Ns, symbol, ch_offset); + idft(idftsizeidx, + (int16_t*) &dl_ch_estimates[aarx][ch_offset], + (int16_t*) dl_ch_estimates_time[aarx], + 1); +} +} + if (dmrss == 2) + scopeCopy(ue, pbchDlChEstimateTime, dl_ch_estimates_time, sizeof(struct complex16), idftsizeidx, ue->frame_parms.nb_antennas_rx); return(0); } diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h b/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h index c5330ce2f2..450631774e 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h @@ -56,7 +56,10 @@ int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue, NR_UE_SSB *current_ssb); int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue, - UE_nr_rxtx_proc_t *proc, + int estimateSz, + struct complex16 dl_ch_estimates [][estimateSz], + struct complex16 dl_ch_estimates_time [][estimateSz], + UE_nr_rxtx_proc_t *proc, uint8_t gNB_id, unsigned char Ns, unsigned char symbol, @@ -78,6 +81,8 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, void nr_adjust_synch_ue(NR_DL_FRAME_PARMS *frame_parms, PHY_VARS_NR_UE *ue, module_id_t gNB_id, + int estimateSz, + struct complex16 dl_ch_estimates_time [][estimateSz], uint8_t frame, uint8_t subframe, unsigned char clear, diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c b/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c index 8917a8bc1b..39dc183bc3 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c @@ -149,17 +149,22 @@ int nr_pbch_detection(UE_nr_rxtx_proc_t * proc, PHY_VARS_NR_UE *ue, int pbch_ini start_meas(&ue->dlsch_channel_estimation_stats); // computing channel estimation for selected best ssb + const int estimateSz=7*2*sizeof(int)*frame_parms->ofdm_symbol_size; + struct complex16 dl_ch_estimates[frame_parms->nb_antennas_rx][estimateSz]; + struct complex16 dl_ch_estimates_time[frame_parms->nb_antennas_rx][estimateSz]; for(int i=pbch_initial_symbol; ii_ssb,temp_ptr->n_hf); + nr_pbch_channel_estimation(ue,estimateSz, dl_ch_estimates, dl_ch_estimates_time, proc,0,0,i,i-pbch_initial_symbol,temp_ptr->i_ssb,temp_ptr->n_hf); stop_meas(&ue->dlsch_channel_estimation_stats); - + fapiPbch_t result; ret = nr_rx_pbch(ue, proc, - ue->pbch_vars[0], + estimateSz, dl_ch_estimates, + ue->pbch_vars[0], frame_parms, 0, temp_ptr->i_ssb, - SISO); + SISO, + &result); temp_ptr=temp_ptr->next_ssb; } diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c b/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c index dff347f7c0..2b5cc6c3d6 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c @@ -36,6 +36,7 @@ #include "PHY/LTE_REFSIG/lte_refsig.h" #include "PHY/INIT/phy_init.h" #include "openair1/SCHED_NR_UE/defs.h" +#include //#define DEBUG_PBCH //#define DEBUG_PBCH_ENCODING @@ -46,16 +47,16 @@ #define print_shorts(s,x) printf("%s : %d,%d,%d,%d,%d,%d,%d,%d\n",s,((int16_t*)x)[0],((int16_t*)x)[1],((int16_t*)x)[2],((int16_t*)x)[3],((int16_t*)x)[4],((int16_t*)x)[5],((int16_t*)x)[6],((int16_t*)x)[7]) -uint16_t nr_pbch_extract(int **rxdataF, - int **dl_ch_estimates, - int **rxdataF_ext, - int **dl_ch_estimates_ext, +static uint16_t nr_pbch_extract(int **rxdataF, + const int estimateSz, + struct complex16 dl_ch_estimates[][estimateSz], + struct complex16 rxdataF_ext[][20*12*4], + struct complex16 dl_ch_estimates_ext[][20*12*4], uint32_t symbol, uint32_t s_offset, NR_DL_FRAME_PARMS *frame_parms) { uint16_t rb; uint8_t i,j,aarx; - int32_t *dl_ch0,*dl_ch0_ext,*rxF,*rxF_ext; int nushiftmod4 = frame_parms->nushift; AssertFatal(symbol>=1 && symbol<5, @@ -66,8 +67,8 @@ uint16_t nr_pbch_extract(int **rxdataF, unsigned int rx_offset = frame_parms->first_carrier_offset + frame_parms->ssb_start_subcarrier; rx_offset = (rx_offset)%(frame_parms->ofdm_symbol_size); - rxF = &rxdataF[aarx][(symbol+s_offset)*frame_parms->ofdm_symbol_size]; - rxF_ext = &rxdataF_ext[aarx][symbol*20*12]; + struct complex16 *rxF = (struct complex16 *)&rxdataF[aarx][(symbol+s_offset)*frame_parms->ofdm_symbol_size]; + struct complex16 *rxF_ext = rxdataF_ext[aarx]; #ifdef DEBUG_PBCH printf("extract_rbs (nushift %d): rx_offset=%d, symbol %u\n",frame_parms->nushift, (rx_offset + ((symbol+s_offset)*(frame_parms->ofdm_symbol_size))),symbol); @@ -76,7 +77,6 @@ uint16_t nr_pbch_extract(int **rxdataF, for (int i =0; i<8; i++) { printf("rxF [%d]= %d\n",i,rxF[i]); printf("pbch extract rxF %d %d addr %p\n", p[2*i], p[2*i+1], &p[2*i]); - printf("rxF ext addr %p\n", &rxF_ext[i]); } #endif @@ -134,11 +134,10 @@ uint16_t nr_pbch_extract(int **rxdataF, } } } - - dl_ch0 = &dl_ch_estimates[aarx][((symbol+s_offset)*(frame_parms->ofdm_symbol_size))]; + struct complex16 *dl_ch0 = &dl_ch_estimates[aarx][((symbol+s_offset)*(frame_parms->ofdm_symbol_size))]; //printf("dl_ch0 addr %p\n",dl_ch0); - dl_ch0_ext = &dl_ch_estimates_ext[aarx][symbol*20*12]; + struct complex16 *dl_ch0_ext = &dl_ch_estimates_ext[aarx][symbol*20*12]; for (rb=0; rb<20; rb++) { j=0; @@ -199,7 +198,7 @@ uint16_t nr_pbch_extract(int **rxdataF, //__m128i avg128; //compute average channel_level on each (TX,RX) antenna pair -int nr_pbch_channel_level(int **dl_ch_estimates_ext, +int nr_pbch_channel_level(struct complex16 dl_ch_estimates_ext[][20*12*4], NR_DL_FRAME_PARMS *frame_parms, uint32_t symbol) { int16_t rb, nb_rb=20; @@ -258,13 +257,13 @@ int nr_pbch_channel_level(int **dl_ch_estimates_ext, return(avg2); } -void nr_pbch_channel_compensation(int **rxdataF_ext, - int **dl_ch_estimates_ext, - int **rxdataF_comp, - NR_DL_FRAME_PARMS *frame_parms, - uint32_t symbol, - uint8_t output_shift) { - const uint16_t nb_re=symbol == 2 ? 72 : 180; +static void nr_pbch_channel_compensation(struct complex16 rxdataF_ext[][20*12*4], + struct complex16 dl_ch_estimates_ext[][20*12*4], + int cols, + struct complex16 rxdataF_comp[][cols], + NR_DL_FRAME_PARMS *frame_parms, + uint32_t symbol, + uint8_t output_shift) { AssertFatal((symbol > 0 && symbol < 4), "symbol %d is illegal for PBCH DM-RS\n", symbol); @@ -273,15 +272,15 @@ void nr_pbch_channel_compensation(int **rxdataF_ext, for (int aarx=0; aarxnb_antennas_rx; aarx++) { vect128 *dl_ch128 = (vect128 *)&dl_ch_estimates_ext[aarx][symbol*20*12]; - vect128 *rxdataF128 = (vect128 *)&rxdataF_ext[aarx][symbol*20*12]; - vect128 *rxdataF_comp128 = (vect128 *)&rxdataF_comp[aarx][symbol*20*12]; + vect128 *rxdataF128 = (vect128 *)rxdataF_ext[aarx]; + vect128 *rxdataF_comp128 = (vect128 *)rxdataF_comp[aarx]; /* printf("ch compensation dl_ch ext addr %p \n", &dl_ch_estimates_ext[aarx][symbol*20*12]); - printf("rxdataf ext addr %p symbol %d\n", &rxdataF_ext[aarx][symbol*20*12], symbol); + printf("rxdataf ext addr %p symbol %d\n", rxdataF_ext[aarx], symbol); printf("rxdataf_comp addr %p\n",&rxdataF_comp[aarx][symbol*20*12]); */ - for (int re=0; rellr; reset = 1; // x1 is set in first call to lte_gold_generic x2 = Nid; //this is c_init @@ -361,10 +362,10 @@ static void nr_pbch_unscrambling(NR_UE_PBCH *pbch, reset = 0; } - (pbch->pbch_a_interleaved) ^= ((unscrambling_mask>>i)&1)? ((pbch->pbch_a_prime>>i)&1)<pbch_a_prime>>i)&1) ^ ((s>>((k+offset)&0x1f))&1))<>i)&1)); + *pbch_a_interleaved ^= ((unscrambling_mask>>i)&1)? ((pbch_a_prime>>i)&1)<>i)&1) ^ ((s>>((k+offset)&0x1f))&1))<>i)&1)); #ifdef DEBUG_PBCH_ENCODING - printf("i %d k %d offset %d (unscrambling_mask>>i)&1) %d s: %08x\t pbch_a_interleaved 0x%08x (!((unscrambling_mask>>i)&1)) %d\n", i, k, offset, (unscrambling_mask>>i)&1, s, pbch->pbch_a_interleaved, + printf("i %d k %d offset %d (unscrambling_mask>>i)&1) %d s: %08x\t pbch_a_interleaved 0x%08x (!((unscrambling_mask>>i)&1)) %d\n", i, k, offset, (unscrambling_mask>>i)&1, s, *pbch_a_interleaved, (!((unscrambling_mask>>i)&1))); #endif } else { @@ -386,7 +387,7 @@ static void nr_pbch_unscrambling(NR_UE_PBCH *pbch, } } -void nr_pbch_quantize(int16_t *pbch_llr8, +static void nr_pbch_quantize(int16_t *pbch_llr8, int16_t *pbch_llr, uint16_t len) { uint16_t i; @@ -410,11 +411,13 @@ uint8_t pbch_deinterleaving_pattern[32] = {28,0,31,30,7,29,25,27,5,8,24,9,10,11, int nr_rx_pbch( PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, + int estimateSz, struct complex16 dl_ch_estimates [][estimateSz], NR_UE_PBCH *nr_ue_pbch_vars, NR_DL_FRAME_PARMS *frame_parms, uint8_t gNB_id, uint8_t i_ssb, - MIMO_mode_t mimo_mode) { + MIMO_mode_t mimo_mode, + fapiPbch_t* result) { NR_UE_COMMON *nr_ue_common_vars = &ue->common_vars; int max_h=0; @@ -422,9 +425,6 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue, //uint8_t pbch_a[64]; //FT ?? cppcheck doesn't like pbch_a allocation because of line 525..and i don't get what this variable is for.. //uint8_t *pbch_a = malloc(sizeof(uint8_t) * NR_POLAR_PBCH_PAYLOAD_BITS); - //uint32_t pbch_a_prime; - int16_t *pbch_e_rx; - uint8_t *decoded_output = nr_ue_pbch_vars->decoded_output; uint8_t nushift; uint16_t M; uint8_t Lmax=frame_parms->Lmax; @@ -437,9 +437,8 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue, // FT ?? cppcheck fix memset(&pbch_a[0], 0, sizeof(uint8_t) * NR_POLAR_PBCH_PAYLOAD_BITS); //printf("nr_pbch_ue nid_cell %d\n",frame_parms->Nid_cell); - pbch_e_rx = &nr_ue_pbch_vars->llr[0]; - // clear LLR buffer - memset(nr_ue_pbch_vars->llr,0,NR_POLAR_PBCH_E); + int16_t pbch_e_rx[960]={0}; //Fixme: previous version erase only NR_POLAR_PBCH_E bytes + int pbch_e_rx_idx=0; int symbol_offset=1; if (ue->is_synchronized > 0) @@ -455,12 +454,19 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue, #endif // symbol refers to symbol within SSB. symbol_offset is the offset of the SSB wrt start of slot + double log2_maxh; for (symbol=1; symbol<4; symbol++) { - + const uint16_t nb_re=symbol == 2 ? 72 : 180; + struct complex16 rxdataF_ext[frame_parms->nb_antennas_rx][20*12*4]; + struct complex16 rxdataF_comp[frame_parms->nb_antennas_rx][nb_re]; + //was dl_ch_estimates[idx] = (int32_t *)malloc16_clear( sizeof(int32_t)*7*2*sizeof(int)*(fp->ofdm_symbol_size) ); + struct complex16 dl_ch_estimates_ext[frame_parms->nb_antennas_rx][20*12*4]; + nr_pbch_extract(nr_ue_common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF, - nr_ue_pbch_vars->dl_ch_estimates, - nr_ue_pbch_vars->rxdataF_ext, - nr_ue_pbch_vars->dl_ch_estimates_ext, + estimateSz, + dl_ch_estimates, + rxdataF_ext, + dl_ch_estimates_ext, symbol, symbol_offset, frame_parms); @@ -470,115 +476,113 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue, #endif if (symbol == 1) { - max_h = nr_pbch_channel_level(nr_ue_pbch_vars->dl_ch_estimates_ext, + max_h = nr_pbch_channel_level(dl_ch_estimates_ext, frame_parms, symbol); - nr_ue_pbch_vars->log2_maxh = 3+(log2_approx(max_h)/2); + log2_maxh = 3+(log2_approx(max_h)/2); } #ifdef DEBUG_PBCH LOG_I(PHY,"[PHY] PBCH log2_maxh = %d (%d)\n",nr_ue_pbch_vars->log2_maxh,max_h); #endif - nr_pbch_channel_compensation(nr_ue_pbch_vars->rxdataF_ext, - nr_ue_pbch_vars->dl_ch_estimates_ext, - nr_ue_pbch_vars->rxdataF_comp, + nr_pbch_channel_compensation(rxdataF_ext, + dl_ch_estimates_ext, + nb_re, + rxdataF_comp, frame_parms, symbol, - nr_ue_pbch_vars->log2_maxh); // log2_maxh+I0_shift + log2_maxh); // log2_maxh+I0_shift /*if (frame_parms->nb_antennas_rx > 1) pbch_detection_mrc(frame_parms, - nr_ue_pbch_vars->rxdataF_comp, + rxdataF_comp, symbol);*/ /* if (mimo_mode == ALAMOUTI) { - nr_pbch_alamouti(frame_parms,nr_ue_pbch_vars->rxdataF_comp,symbol); + nr_pbch_alamouti(frame_parms,rxdataF_comp,symbol); } else if (mimo_mode != SISO) { LOG_I(PHY,"[PBCH][RX] Unsupported MIMO mode\n"); return(-1); } */ if (symbol==2) { - nr_pbch_quantize(pbch_e_rx, - (short *)&(nr_ue_pbch_vars->rxdataF_comp[0][symbol*240]), + nr_pbch_quantize(pbch_e_rx+pbch_e_rx_idx, + (short *)rxdataF_comp[0], 144); - pbch_e_rx+=144; + pbch_e_rx_idx+=144; } else { - nr_pbch_quantize(pbch_e_rx, - (short *)&(nr_ue_pbch_vars->rxdataF_comp[0][symbol*240]), + nr_pbch_quantize(pbch_e_rx+pbch_e_rx_idx, + (short *)rxdataF_comp[0], 360); - pbch_e_rx+=360; + pbch_e_rx_idx+=360; } } #ifdef DEBUG_PBCH - write_output("rxdataF_comp.m","rxFcomp",&nr_ue_pbch_vars->rxdataF_comp[0][240],240*3,1,1); + write_output("rxdataF_comp.m","rxFcomp",rxdataF_comp[0],240*3,1,1); #endif - pbch_e_rx = nr_ue_pbch_vars->llr; //demod_pbch_e = nr_ue_pbch_vars->demod_pbch_e; // FT?? cppcheck fix - pbch_a = nr_ue_pbch_vars->pbch_a; #ifdef DEBUG_PBCH - //pbch_e_rx = &nr_ue_pbch_vars->llr[0]; - short *p = (short *)&(nr_ue_pbch_vars->rxdataF_comp[0][20*12]); + short *p = (short *)rxdataF_comp[0]); - for (int cnt = 0; cnt < 864 ; cnt++) +for (int cnt = 0; cnt < 864 ; cnt++) printf("pbch rx llr %d\n",*(pbch_e_rx+cnt)); #endif //un-scrambling - M = NR_POLAR_PBCH_E; - nushift = (Lmax==4)? i_ssb&3 : i_ssb&7; +M = NR_POLAR_PBCH_E; +nushift = (Lmax==4)? i_ssb&3 : i_ssb&7; uint32_t unscrambling_mask = (Lmax==64)?0x100006D:0x1000041; - - nr_pbch_unscrambling(nr_ue_pbch_vars,frame_parms->Nid_cell,nushift,M,NR_POLAR_PBCH_E,0,0); + uint32_t pbch_a_interleaved=0; +uint32_t pbch_a_prime=0; +nr_pbch_unscrambling(nr_ue_pbch_vars,pbch_e_rx,frame_parms->Nid_cell,nushift,M,NR_POLAR_PBCH_E,0,0, pbch_a_prime, &pbch_a_interleaved); //polar decoding de-rate matching const t_nrPolar_params *currentPtr = nr_polar_params( NR_POLAR_PBCH_MESSAGE_TYPE, NR_POLAR_PBCH_PAYLOAD_BITS, NR_POLAR_PBCH_AGGREGATION_LEVEL,1,&ue->polarList); - decoderState = polar_decoder_int16(pbch_e_rx,(uint64_t *)&nr_ue_pbch_vars->pbch_a_prime,0,currentPtr); + decoderState = polar_decoder_int16(pbch_e_rx,(uint64_t *)&pbch_a_prime,0,currentPtr); if(decoderState) return(decoderState); - // printf("polar decoder output 0x%08x\n",nr_ue_pbch_vars->pbch_a_prime); + // printf("polar decoder output 0x%08x\n",pbch_a_prime); // Decoder reversal uint32_t a_reversed=0; for (int i=0; ipbch_a_prime>>i)&1)<<(31-i); + a_reversed |= (((uint64_t)pbch_a_prime>>i)&1)<<(31-i); - nr_ue_pbch_vars->pbch_a_prime = a_reversed; + pbch_a_prime = a_reversed; //payload un-scrambling - nr_ue_pbch_vars->pbch_a_interleaved=0; M = (Lmax == 64)? (NR_POLAR_PBCH_PAYLOAD_BITS - 6) : (NR_POLAR_PBCH_PAYLOAD_BITS - 3); - nushift = ((nr_ue_pbch_vars->pbch_a_prime>>24)&1) ^ (((nr_ue_pbch_vars->pbch_a_prime>>6)&1)<<1); - nr_pbch_unscrambling(nr_ue_pbch_vars,frame_parms->Nid_cell,nushift,M,NR_POLAR_PBCH_PAYLOAD_BITS,1,unscrambling_mask); - //printf("nushift %d sfn 3rd %d 2nd %d", nushift,((nr_ue_pbch_vars->pbch_a_prime>>6)&1), ((nr_ue_pbch_vars->pbch_a_prime>>24)&1) ); + nushift = ((pbch_a_prime>>24)&1) ^ (((pbch_a_prime>>6)&1)<<1); +nr_pbch_unscrambling(nr_ue_pbch_vars,pbch_e_rx,frame_parms->Nid_cell,nushift,M,NR_POLAR_PBCH_PAYLOAD_BITS,1,unscrambling_mask,pbch_a_prime, &pbch_a_interleaved); + //printf("nushift %d sfn 3rd %d 2nd %d", nushift,((pbch_a_prime>>6)&1), ((pbch_a_prime>>24)&1) ); //payload deinterleaving //uint32_t in=0; uint32_t out=0; for (int i=0; i<32; i++) { - out |= ((nr_ue_pbch_vars->pbch_a_interleaved>>i)&1)<<(pbch_deinterleaving_pattern[i]); + out |= ((pbch_a_interleaved>>i)&1)<<(pbch_deinterleaving_pattern[i]); #ifdef DEBUG_PBCH - printf("i %d in 0x%08x out 0x%08x ilv %d (in>>i)&1) 0x%08x\n", i, nr_ue_pbch_vars->pbch_a_interleaved, out, pbch_deinterleaving_pattern[i], (nr_ue_pbch_vars->pbch_a_interleaved>>i)&1); + printf("i %d in 0x%08x out 0x%08x ilv %d (in>>i)&1) 0x%08x\n", i, pbch_a_interleaved, out, pbch_deinterleaving_pattern[i], (pbch_a_interleaved>>i)&1); #endif } uint32_t payload = 0; - //uint8_t xtra_byte = 0; - nr_ue_pbch_vars->xtra_byte = (out>>24)&0xff; + result->xtra_byte = (out>>24)&0xff; for (int i=0; i>i)&1)<<(NR_POLAR_PBCH_PAYLOAD_BITS-i-1); for (int i=0; i<3; i++) - decoded_output[i] = (uint8_t)((payload>>((3-i)<<3))&0xff); + result->decoded_output[i] = (uint8_t)((payload>>((3-i)<<3))&0xff); - frame_parms->half_frame_bit = ((nr_ue_pbch_vars->xtra_byte>>4)&0x01); // computing the half frame index from the extra byte +frame_parms->half_frame_bit = (result->xtra_byte>>4)&0x01; // computing the half frame index from the extra byte frame_parms->ssb_index = i_ssb; // ssb index corresponds to i_ssb for Lmax = 4,8 if (Lmax == 64) { // for Lmax = 64 ssb index 4th,5th and 6th bits are in extra byte for (int i=0; i<3; i++) - frame_parms->ssb_index += (((nr_ue_pbch_vars->xtra_byte>>(7-i))&0x01)<<(3+i)); + frame_parms->ssb_index += (((result->xtra_byte>>(7-i))&0x01)<<(3+i)); } ue->symbol_offset = nr_get_ssb_start_symbol(frame_parms,frame_parms->ssb_index); @@ -587,25 +591,26 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue, uint8_t frame_number_4lsb = 0; for (int i=0; i<4; i++) - frame_number_4lsb |= ((nr_ue_pbch_vars->xtra_byte>>i)&1)<<(3-i); + frame_number_4lsb |= ((result->xtra_byte>>i)&1)<<(3-i); proc->decoded_frame_rx = frame_number_4lsb; #ifdef DEBUG_PBCH - printf("xtra_byte %x payload %x\n", nr_ue_pbch_vars->xtra_byte, payload); + printf("xtra_byte %x payload %x\n", xtra_byte, payload); for (int i=0; i<(NR_POLAR_PBCH_PAYLOAD_BITS>>3); i++) { // printf("unscrambling pbch_a[%d] = %x \n", i,pbch_a[i]); - printf("[PBCH] decoder payload[%d] = %x\n",i,decoded_output[i]); + printf("[PBCH] decoder payload[%d] = %x\n",i,result->decoded_output[i]); } #endif nr_downlink_indication_t dl_indication; - fapi_nr_rx_indication_t *rx_ind = calloc(1, sizeof(*rx_ind)); - uint16_t number_pdus = 1; +fapi_nr_rx_indication_t *rx_ind = calloc(1, sizeof(*rx_ind)); +uint16_t number_pdus = 1; - nr_fill_dl_indication(&dl_indication, NULL, rx_ind, proc, ue, gNB_id); - nr_fill_rx_indication(rx_ind, FAPI_NR_RX_PDU_TYPE_SSB, gNB_id, ue, NULL, NULL, number_pdus, proc); +nr_fill_dl_indication(&dl_indication, NULL, rx_ind, proc, ue, gNB_id); + +nr_fill_rx_indication(rx_ind, FAPI_NR_RX_PDU_TYPE_SSB, gNB_id, ue, NULL, NULL, number_pdus, proc,(void*)result); if (ue->if_inst && ue->if_inst->dl_indication) ue->if_inst->dl_indication(&dl_indication, NULL); diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h index 239731208e..e53cfde51b 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h @@ -1153,11 +1153,14 @@ int rx_sss(PHY_VARS_NR_UE *phy_vars_ue,int32_t *tot_metric,uint8_t *flip_max,uin */ int nr_rx_pbch( PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, + const int estimateSz, + struct complex16 dl_ch_estimates[][estimateSz], NR_UE_PBCH *nr_ue_pbch_vars, NR_DL_FRAME_PARMS *frame_parms, uint8_t eNB_id, uint8_t i_ssb, - MIMO_mode_t mimo_mode); + MIMO_mode_t mimo_mode, + fapiPbch_t* result); int nr_pbch_detection(UE_nr_rxtx_proc_t *proc, PHY_VARS_NR_UE *ue, diff --git a/openair1/PHY/TOOLS/nr_phy_scope.c b/openair1/PHY/TOOLS/nr_phy_scope.c index 5594d56693..a31414946f 100644 --- a/openair1/PHY/TOOLS/nr_phy_scope.c +++ b/openair1/PHY/TOOLS/nr_phy_scope.c @@ -40,6 +40,9 @@ const FL_COLOR water_colors[4] = {FL_BLUE,FL_GREEN,FL_YELLOW,FL_RED}; typedef struct complex16 scopeSample_t; #define SquaredNorm(VaR) ((VaR).r*(VaR).r+(VaR).i*(VaR).i) +typedef struct { +} scopeGraphData_t; + typedef struct OAIgraph { FL_OBJECT *graph; FL_OBJECT *text; @@ -56,7 +59,7 @@ typedef struct OAIgraph { boolean_t initDone; int iteration; void (*gNBfunct) (struct OAIgraph *graph, scopeData_t *p, int UE_id); - void (*nrUEfunct)(struct OAIgraph *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id); + void (*nrUEfunct)(scopeGraphData_t** data, struct OAIgraph *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id); } OAIgraph_t; /* Forms and Objects */ @@ -140,7 +143,7 @@ static OAIgraph_t gNBcommonGraph( void (*funct) (OAIgraph_t *graph, scopeData_t return graph; } -static OAIgraph_t nrUEcommonGraph( void (*funct) (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id), +static OAIgraph_t nrUEcommonGraph( void (*funct) (scopeGraphData_t **data, OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id), int type, FL_Coord x, FL_Coord y, FL_Coord w, FL_Coord h, const char *label, FL_COLOR pointColor) { OAIgraph_t graph; commonGraph(&graph, type, x, y, w, h, label, pointColor); @@ -341,7 +344,7 @@ static void timeResponse (OAIgraph_t *graph, scopeData_t *p, int nb_UEs) { static void gNBfreqWaterFall (OAIgraph_t *graph, scopeData_t *p, int nb_UEs) { NR_DL_FRAME_PARMS *frame_parms=&p->gNB->frame_parms; //use 1st antenna - genericWaterFall(graph, (scopeSample_t *)p->rxdataF, frame_parms->samples_per_frame_wCP, + genericWaterFall(graph, (scopeSample_t *)p->liveData, frame_parms->samples_per_frame_wCP, frame_parms->slots_per_frame, "X axis: Frequency domain, one subframe"); } @@ -515,6 +518,7 @@ void phy_scope_gNB(OAI_phy_scope_t *form, //fl_check_forms(); } + static void *scope_thread_gNB(void *arg) { scopeData_t *p=(scopeData_t *) arg; size_t stksize=0; @@ -539,11 +543,12 @@ static void *scope_thread_gNB(void *arg) { return NULL; } + static void copyRxdataF(int32_t *data, int slot, void *scopeData) { scopeData_t *scope=(scopeData_t *)scopeData; - memcpy(scope->rxdataF + slot*scope->gNB->frame_parms.samples_per_slot_wCP, + memcpy(((int32_t*)scope->liveData) + slot*scope->gNB->frame_parms.samples_per_slot_wCP, data, - scope->gNB->frame_parms.samples_per_slot_wCP); + scope->gNB->frame_parms.samples_per_slot_wCP*sizeof(int32_t)); } void gNBinitScope(scopeParms_t *p) { @@ -554,11 +559,11 @@ void gNBinitScope(scopeParms_t *p) { scope->ru=p->ru; scope->gNB=p->gNB; scope->slotFunc=copyRxdataF; - AssertFatal(scope->rxdataF=(int32_t *) calloc(p->gNB->frame_parms.samples_per_frame_wCP*sizeof(int32_t),1),""); + AssertFatal(scope->liveData= calloc(p->gNB->frame_parms.samples_per_frame_wCP*sizeof(int32_t),1),""); pthread_t forms_thread; threadCreate(&forms_thread, scope_thread_gNB, p->gNB->scopeData, "scope", -1, OAI_PRIORITY_RT_LOW); } -static void ueWaterFall (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) { +static void ueWaterFall (scopeGraphData_t **data, OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) { // Received signal in time domain of receive antenna 0 genericWaterFall(graph, (scopeSample_t *) phy_vars_ue->common_vars.rxdata[0], @@ -574,13 +579,18 @@ static void ueTimeResponse (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int phy_vars_ue->frame_parms.samples_per_frame); } */ -static void ueChannelResponse (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) { + +static void ueChannelResponse (scopeGraphData_t **data, OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) { // Channel Impulse Response + if (!data[pbchDlChEstimateTime]) + return; + genericPowerPerAntena(graph, phy_vars_ue->frame_parms.nb_antennas_rx, - (const scopeSample_t **) phy_vars_ue->pbch_vars[eNB_id]->dl_ch_estimates_time, + (const scopeSample_t **) &data[pbchDlChEstimateTime], phy_vars_ue->frame_parms.ofdm_symbol_size>>3); } -static void ueFreqWaterFall (OAIgraph_t *graph,PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id ) { + +static void ueFreqWaterFall (scopeGraphData_t **data, OAIgraph_t *graph,PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id ) { NR_DL_FRAME_PARMS *frame_parms=&phy_vars_ue->frame_parms; //use 1st antenna genericWaterFall(graph, @@ -624,12 +634,12 @@ static void uePbchFrequencyResp (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue oai_xygraph(graph,freq,chest_f_abs,frame_parms->ofdm_symbol_size,0,10); } */ -static void uePbchLLR (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) { +static void uePbchLLR (scopeGraphData_t **data, OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) { // PBCH LLRs - if ( !phy_vars_ue->pbch_vars[eNB_id]->llr) + if ( !data[pbchLlr]) return; - int16_t *pbch_llr = (int16_t *) phy_vars_ue->pbch_vars[eNB_id]->llr; + int16_t *pbch_llr = (int16_t *)data[pbchLlr]; float *llr_pbch, *bit_pbch; oai_xygraph_getbuff(graph, &bit_pbch, &llr_pbch, 864, 0); @@ -639,12 +649,13 @@ static void uePbchLLR (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_ oai_xygraph(graph,bit_pbch,llr_pbch,864,0,10); } -static void uePbchIQ (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) { +static void uePbchIQ (scopeGraphData_t **data, OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) { // PBCH I/Q of MF Output - if (!phy_vars_ue->pbch_vars[eNB_id]->rxdataF_comp[0]) - return; - scopeSample_t *pbch_comp = (scopeSample_t *) phy_vars_ue->pbch_vars[eNB_id]->rxdataF_comp[0]; + if (!data[pbchRxdataF_comp]) + return; + + scopeSample_t *pbch_comp = (scopeSample_t *) data[pbchRxdataF_comp]; float *I, *Q; oai_xygraph_getbuff(graph, &I, &Q, 180*3, 0); memset(I,0,180*3*sizeof(*I)); @@ -673,7 +684,7 @@ static void uePbchIQ (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_i AssertFatal(base <= 180*3,""); oai_xygraph(graph,I,Q,base,0, 10); } -static void uePcchLLR (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) { +static void uePcchLLR (scopeGraphData_t **data, OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) { // PDCCH LLRs if (!phy_vars_ue->pdcch_vars[0][eNB_id]->llr) return; @@ -698,7 +709,7 @@ static void uePcchLLR (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_ AssertFatal(base <= coded_bits_per_codeword*RX_NB_TH_MAX, ""); oai_xygraph(graph,bit,llr,base,0,10); } -static void uePcchIQ (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) { +static void uePcchIQ (scopeGraphData_t **data, OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) { // PDCCH I/Q of MF Output if (!phy_vars_ue->pdcch_vars[0][eNB_id]->rxdataF_comp[0]) return; @@ -722,7 +733,7 @@ static void uePcchIQ (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_i AssertFatal(base <= nb*RX_NB_TH_MAX, ""); oai_xygraph(graph,I,Q,base,0,10); } -static void uePdschLLR (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) { +static void uePdschLLR (scopeGraphData_t **data, OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) { // PDSCH LLRs if (!phy_vars_ue->pdsch_vars[0][eNB_id]->llr[0]) return; @@ -749,7 +760,7 @@ static void uePdschLLR (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB //fl_set_xyplot_xbounds(form->pdsch_llr,0,coded_bits_per_codeword); oai_xygraph(graph,bit,llr,base,0,10); } -static void uePdschIQ (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) { +static void uePdschIQ (scopeGraphData_t **data, OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) { // PDSCH I/Q of MF Output if (!phy_vars_ue->pdsch_vars[0][eNB_id]->rxdataF_comp0[0]) return; @@ -776,7 +787,7 @@ static void uePdschIQ (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_ AssertFatal(base <= sz*RX_NB_TH_MAX, ""); oai_xygraph(graph,I,Q,sz*RX_NB_TH_MAX,0,10); } -static void uePdschThroughput (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) { +static void uePdschThroughput (scopeGraphData_t **data, OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) { /* float tput_time_ue[NUMBER_OF_UE_MAX][TPUT_WINDOW_LENGTH] = {{0}}; float tput_ue[NUMBER_OF_UE_MAX][TPUT_WINDOW_LENGTH] = {{0}}; @@ -869,7 +880,9 @@ static OAI_phy_scope_t *create_phy_scope_nrue( int ID ) { fl_show_form (fdui->phy_scope, FL_PLACE_HOTSPOT, FL_FULLBORDER, buf); return fdui; } -void phy_scope_nrUE(OAI_phy_scope_t *form, + +void phy_scope_nrUE(scopeGraphData_t **UEliveData, + OAI_phy_scope_t *form, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) { @@ -886,12 +899,13 @@ void phy_scope_nrUE(OAI_phy_scope_t *form, int i=0; while (form->graph[i].graph) { - form->graph[i].nrUEfunct(form->graph+i, phy_vars_ue, eNB_id, UE_id); + form->graph[i].nrUEfunct(UEliveData, form->graph+i, phy_vars_ue, eNB_id, UE_id); i++; } //fl_check_forms(); } + static void *nrUEscopeThread(void *arg) { PHY_VARS_NR_UE *ue=(PHY_VARS_NR_UE *)arg; size_t stksize; @@ -903,9 +917,12 @@ static void *nrUEscopeThread(void *arg) { fl_initialize (&fl_argc, &name, NULL, 0, 0); OAI_phy_scope_t *form_nrue=create_phy_scope_nrue(0); + scopeGraphData_t *UEliveData[UEdataTypeNumberOfItems]; + while (!oai_exit) { fl_freeze_form(form_nrue->phy_scope); - phy_scope_nrUE(form_nrue, + phy_scope_nrUE(UEliveData, + form_nrue, ue, 0,0); fl_unfreeze_form(form_nrue->phy_scope); @@ -915,10 +932,19 @@ static void *nrUEscopeThread(void *arg) { pthread_exit((void *)arg); } -void nrUEinitScope(PHY_VARS_NR_UE *ue) { - pthread_t forms_thread; - threadCreate(&forms_thread, nrUEscopeThread, ue, "scope", -1, OAI_PRIORITY_RT_LOW); + +void UEcopyData(enum UEdataType type, void * data, int elementSz, int colSz, int lineSz) { + } + +void nrUEinitScope(PHY_VARS_NR_UE *ue) { + AssertFatal(ue->scopeData=malloc(sizeof(scopeData_t)),""); + scopeData_t *scope=(scopeData_t *) ue->scopeData; + scope->copyData=UEcopyData; + pthread_t forms_thread; + threadCreate(&forms_thread, nrUEscopeThread, ue, "scope", -1, OAI_PRIORITY_RT_LOW); +} + void nrscope_autoinit(void *dataptr) { AssertFatal( (IS_SOFTMODEM_GNB_BIT||IS_SOFTMODEM_5GUE_BIT),"Scope cannot find NRUE or GNB context"); diff --git a/openair1/PHY/TOOLS/phy_scope_interface.h b/openair1/PHY/TOOLS/phy_scope_interface.h index 8b747d575d..1ba6bb558d 100644 --- a/openair1/PHY/TOOLS/phy_scope_interface.h +++ b/openair1/PHY/TOOLS/phy_scope_interface.h @@ -32,6 +32,7 @@ #ifndef __PHY_SCOPE_INTERFACE_H__ #define __PHY_SCOPE_INTERFACE_H__ #include + typedef struct { int *argc; char **argv; @@ -39,16 +40,25 @@ typedef struct { PHY_VARS_gNB *gNB; } scopeParms_t; +enum UEdataType { + pbchDlChEstimateTime, + pbchLlr, + pbchRxdataF_comp, + UEdataTypeNumberOfItems +}; typedef struct scopeData_s { int *argc; char **argv; RU_t *ru; PHY_VARS_gNB *gNB; - int32_t * rxdataF; + void * liveData; void (*slotFunc)(int32_t* data, int slot, void * scopeData); + void (*copyData)(enum UEdataType, void * data, int elementSz, int colSz, int lineSz); } scopeData_t; int load_softscope(char *exectype, void *initarg); int end_forms(void) ; + +#define scopeCopy(ue, type, ...) if(ue->scopeData) ((scopeData_t*)ue->scopeData)->copyData(type, ##__VA_ARGS__); #endif diff --git a/openair1/PHY/defs_UE.h b/openair1/PHY/defs_UE.h index 2d2697a4b7..6a855d3af6 100644 --- a/openair1/PHY/defs_UE.h +++ b/openair1/PHY/defs_UE.h @@ -839,6 +839,7 @@ typedef struct { /// RF and Interface devices per CC openair0_device rfdevice; + void *scopeData; } PHY_VARS_UE; /* this structure is used to pass both UE phy vars and diff --git a/openair1/PHY/defs_nr_UE.h b/openair1/PHY/defs_nr_UE.h index bca956bf75..d8c274de45 100644 --- a/openair1/PHY/defs_nr_UE.h +++ b/openair1/PHY/defs_nr_UE.h @@ -655,40 +655,6 @@ typedef struct { #define PBCH_A 24 typedef struct { - /// \brief Pointers to extracted PBCH symbols in frequency-domain. - /// - first index: rx antenna [0..nb_antennas_rx[ - /// - second index: ? [0..287] (hard coded) - int32_t **rxdataF_ext; - /// \brief Pointers to extracted and compensated PBCH symbols in frequency-domain. - /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx - /// - second index: ? [0..287] (hard coded) - int32_t **rxdataF_comp; - /// \brief Hold the channel estimates in frequency domain. - /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx - /// - second index: samples? [0..symbols_per_tti*(ofdm_symbol_size+LTE_CE_FILTER_LENGTH)[ - int32_t **dl_ch_estimates; - /// \brief Pointers to downlink channel estimates in frequency-domain extracted in PRBS. - /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx - /// - second index: ? [0..287] (hard coded) - int32_t **dl_ch_estimates_ext; - /// \brief Hold the channel estimates in time domain (used for tracking). - /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx - /// - second index: samples? [0..2*ofdm_symbol_size[ - int32_t **dl_ch_estimates_time; - int log2_maxh; - uint8_t pbch_a[NR_POLAR_PBCH_PAYLOAD_BITS>>3]; - uint32_t pbch_a_interleaved; - uint32_t pbch_a_prime; - uint8_t pbch_e[NR_POLAR_PBCH_E]; - int16_t demod_pbch_e[NR_POLAR_PBCH_E]; - /// \brief Pointer to PBCH llrs. - /// - first index: ? [0..1919] (hard coded) - int16_t *llr; - /// \brief Pointer to PBCH decoded output. - /// - first index: ? [0..63] (hard coded) - uint8_t *decoded_output; - /// \brief PBCH additional bits - uint8_t xtra_byte; /// \brief Total number of PDU errors. uint32_t pdu_errors; /// \brief Total number of PDU errors 128 frames ago. @@ -696,7 +662,7 @@ typedef struct { /// \brief Total number of consecutive PDU errors. uint32_t pdu_errors_conseq; /// \brief FER (in percent) . - uint32_t pdu_fer; + //uint32_t pdu_fer; } NR_UE_PBCH; typedef struct { @@ -1075,7 +1041,7 @@ typedef struct { #endif int dl_stats[5]; - + void* scopeData; } PHY_VARS_NR_UE; /* this structure is used to pass both UE phy vars and diff --git a/openair1/SCHED_NR_UE/defs.h b/openair1/SCHED_NR_UE/defs.h index b85d4c1b50..acdf88018a 100644 --- a/openair1/SCHED_NR_UE/defs.h +++ b/openair1/SCHED_NR_UE/defs.h @@ -82,6 +82,11 @@ #define DAQ_AGC_OFF 0 +typedef struct { + uint8_t decoded_output[64]; + uint8_t xtra_byte; +} fapiPbch_t; + /** @addtogroup _PHY_PROCEDURES_ * @{ */ @@ -398,7 +403,8 @@ void nr_fill_rx_indication(fapi_nr_rx_indication_t *rx_ind, NR_UE_DLSCH_t *dlsch0, NR_UE_DLSCH_t *dlsch1, uint16_t n_pdus, - UE_nr_rxtx_proc_t *proc); + UE_nr_rxtx_proc_t *proc, + void * typeSpecific); bool nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c index 97a7e2e489..12a8ce0d08 100644 --- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c +++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c @@ -118,7 +118,8 @@ void nr_fill_rx_indication(fapi_nr_rx_indication_t *rx_ind, NR_UE_DLSCH_t *dlsch0, NR_UE_DLSCH_t *dlsch1, uint16_t n_pdus, - UE_nr_rxtx_proc_t *proc ){ + UE_nr_rxtx_proc_t *proc, + void * typeSpecific){ NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; @@ -162,8 +163,11 @@ void nr_fill_rx_indication(fapi_nr_rx_indication_t *rx_ind, rx_ind->rx_indication_body[n_pdus - 1].pdsch_pdu.pdu_length = dlsch0->harq_processes[dlsch0->current_harq_pid]->TBS / 8; break; case FAPI_NR_RX_PDU_TYPE_SSB: - rx_ind->rx_indication_body[n_pdus - 1].ssb_pdu.pdu = ue->pbch_vars[gNB_id]->decoded_output; - rx_ind->rx_indication_body[n_pdus - 1].ssb_pdu.additional_bits = ue->pbch_vars[gNB_id]->xtra_byte; + rx_ind->rx_indication_body[n_pdus - 1].ssb_pdu.pdu=malloc(sizeof(((fapiPbch_t*)typeSpecific)->decoded_output)); + memcpy(rx_ind->rx_indication_body[n_pdus - 1].ssb_pdu.pdu, + ((fapiPbch_t*)typeSpecific)->decoded_output, + sizeof(((fapiPbch_t*)typeSpecific)->decoded_output)); + rx_ind->rx_indication_body[n_pdus - 1].ssb_pdu.additional_bits = ((fapiPbch_t*)typeSpecific)->xtra_byte; rx_ind->rx_indication_body[n_pdus - 1].ssb_pdu.ssb_index = (frame_parms->ssb_index)&0x7; rx_ind->rx_indication_body[n_pdus - 1].ssb_pdu.ssb_length = frame_parms->Lmax; rx_ind->rx_indication_body[n_pdus - 1].ssb_pdu.cell_id = frame_parms->Nid_cell; @@ -353,10 +357,9 @@ void nr_ue_measurement_procedures(uint16_t l, VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_MEASUREMENT_PROCEDURES, VCD_FUNCTION_OUT); } -void nr_ue_pbch_procedures(uint8_t gNB_id, +static void nr_ue_pbch_procedures(uint8_t gNB_id, PHY_VARS_NR_UE *ue, - UE_nr_rxtx_proc_t *proc, - uint8_t abstraction_flag) + UE_nr_rxtx_proc_t *proc,int estimateSz, struct complex16 dl_ch_estimates[][estimateSz]) { int ret = 0; @@ -368,13 +371,15 @@ void nr_ue_pbch_procedures(uint8_t gNB_id, VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PBCH_PROCEDURES, VCD_FUNCTION_IN); LOG_D(PHY,"[UE %d] Frame %d Slot %d, Trying PBCH (NidCell %d, gNB_id %d)\n",ue->Mod_id,frame_rx,nr_slot_rx,ue->frame_parms.Nid_cell,gNB_id); - + fapiPbch_t result; ret = nr_rx_pbch(ue, proc, + estimateSz, dl_ch_estimates, ue->pbch_vars[gNB_id], &ue->frame_parms, gNB_id, (ue->frame_parms.ssb_index)&7, - SISO); + SISO, + &result); if (ret==0) { @@ -444,7 +449,6 @@ void nr_ue_pbch_procedures(uint8_t gNB_id, } if (frame_rx % 100 == 0) { - ue->pbch_vars[gNB_id]->pdu_fer = ue->pbch_vars[gNB_id]->pdu_errors - ue->pbch_vars[gNB_id]->pdu_errors_last; ue->pbch_vars[gNB_id]->pdu_errors_last = ue->pbch_vars[gNB_id]->pdu_errors; } @@ -794,16 +798,16 @@ bool nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue, switch (pdsch) { case RA_PDSCH: nr_fill_dl_indication(&dl_indication, NULL, rx_ind, proc, ue, gNB_id); - nr_fill_rx_indication(rx_ind, FAPI_NR_RX_PDU_TYPE_RAR, gNB_id, ue, dlsch0, NULL, number_pdus, proc); + nr_fill_rx_indication(rx_ind, FAPI_NR_RX_PDU_TYPE_RAR, gNB_id, ue, dlsch0, NULL, number_pdus, proc, NULL); ue->UE_mode[gNB_id] = RA_RESPONSE; break; case PDSCH: nr_fill_dl_indication(&dl_indication, NULL, rx_ind, proc, ue, gNB_id); - nr_fill_rx_indication(rx_ind, FAPI_NR_RX_PDU_TYPE_DLSCH, gNB_id, ue, dlsch0, NULL, number_pdus, proc); + nr_fill_rx_indication(rx_ind, FAPI_NR_RX_PDU_TYPE_DLSCH, gNB_id, ue, dlsch0, NULL, number_pdus, proc, NULL); break; case SI_PDSCH: nr_fill_dl_indication(&dl_indication, NULL, rx_ind, proc, ue, gNB_id); - nr_fill_rx_indication(rx_ind, FAPI_NR_RX_PDU_TYPE_SIB, gNB_id, ue, dlsch0, NULL, number_pdus, proc); + nr_fill_rx_indication(rx_ind, FAPI_NR_RX_PDU_TYPE_SIB, gNB_id, ue, dlsch0, NULL, number_pdus, proc, NULL); break; default: break; @@ -1399,6 +1403,9 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue, if (slot_ssb) { VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP_PBCH, VCD_FUNCTION_IN); LOG_D(PHY," ------ PBCH ChannelComp/LLR: frame.slot %d.%d ------ \n", frame_rx%1024, nr_slot_rx); + const int estimateSz=7*2*sizeof(int)*fp->ofdm_symbol_size; + struct complex16 dl_ch_estimates[fp->nb_antennas_rx][estimateSz]; + struct complex16 dl_ch_estimates_time[fp->nb_antennas_rx][estimateSz]; for (int i=1; i<4; i++) { nr_slot_fep(ue, @@ -1408,7 +1415,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue, start_meas(&ue->dlsch_channel_estimation_stats); - nr_pbch_channel_estimation(ue,proc,gNB_id,nr_slot_rx,(ue->symbol_offset+i)%(fp->symbols_per_slot),i-1,(fp->ssb_index)&7,fp->half_frame_bit); + nr_pbch_channel_estimation(ue, estimateSz, dl_ch_estimates, dl_ch_estimates_time,proc,gNB_id,nr_slot_rx,(ue->symbol_offset+i)%(fp->symbols_per_slot),i-1,(fp->ssb_index)&7,fp->half_frame_bit); stop_meas(&ue->dlsch_channel_estimation_stats); } @@ -1417,13 +1424,14 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue, if ((ue->decode_MIB == 1) && slot_pbch) { LOG_D(PHY," ------ Decode MIB: frame.slot %d.%d ------ \n", frame_rx%1024, nr_slot_rx); - nr_ue_pbch_procedures(gNB_id, ue, proc, 0); + nr_ue_pbch_procedures(gNB_id, ue, proc, estimateSz, dl_ch_estimates); if (ue->no_timing_correction==0) { LOG_D(PHY,"start adjust sync slot = %d no timing %d\n", nr_slot_rx, ue->no_timing_correction); nr_adjust_synch_ue(fp, ue, gNB_id, + estimateSz, dl_ch_estimates_time, frame_rx, nr_slot_rx, 0, diff --git a/openair1/SIMULATION/NR_PHY/nr_dummy_functions.c b/openair1/SIMULATION/NR_PHY/nr_dummy_functions.c index 7a47410129..351c2f33c4 100644 --- a/openair1/SIMULATION/NR_PHY/nr_dummy_functions.c +++ b/openair1/SIMULATION/NR_PHY/nr_dummy_functions.c @@ -1,5 +1,6 @@ #include "nfapi/oai_integration/vendor_ext.h" + int oai_nfapi_hi_dci0_req(nfapi_hi_dci0_request_t *hi_dci0_req) { return(0); } int oai_nfapi_tx_req(nfapi_tx_request_t *tx_req) { return(0); } int oai_nfapi_dl_config_req(nfapi_dl_config_request_t *dl_config_req) { return(0); } @@ -35,4 +36,5 @@ void nr_fill_rx_indication(fapi_nr_rx_indication_t *rx_ind, NR_UE_DLSCH_t *dlsch0, NR_UE_DLSCH_t *dlsch1, uint16_t n_pdus, - UE_nr_rxtx_proc_t *proc) {} + UE_nr_rxtx_proc_t *proc, + void * typeSpecific ) {} diff --git a/openair1/SIMULATION/NR_PHY/pbchsim.c b/openair1/SIMULATION/NR_PHY/pbchsim.c index c6b547cd79..692d1bac20 100644 --- a/openair1/SIMULATION/NR_PHY/pbchsim.c +++ b/openair1/SIMULATION/NR_PHY/pbchsim.c @@ -720,6 +720,9 @@ int main(int argc, char **argv) UE_nr_rxtx_proc_t proc={0}; UE->rx_offset=0; uint8_t ssb_index = 0; + const int estimateSz=7*2*sizeof(int)*frame_parms->ofdm_symbol_size; + struct complex16 dl_ch_estimates[frame_parms->nb_antennas_rx][estimateSz]; + struct complex16 dl_ch_estimates_time[frame_parms->nb_antennas_rx][estimateSz]; while (!((SSB_positions >> ssb_index) & 0x01)) ssb_index++; // to select the first transmitted ssb UE->symbol_offset = nr_get_ssb_start_symbol(frame_parms,ssb_index); @@ -730,17 +733,20 @@ int main(int argc, char **argv) i%frame_parms->symbols_per_slot, ssb_slot); - nr_pbch_channel_estimation(UE,&proc,0,ssb_slot,i%frame_parms->symbols_per_slot,i-(UE->symbol_offset+1),ssb_index%8,n_hf); + nr_pbch_channel_estimation(UE,estimateSz, dl_ch_estimates, dl_ch_estimates_time, &proc, + 0,ssb_slot,i%frame_parms->symbols_per_slot,i-(UE->symbol_offset+1),ssb_index%8,n_hf); } - + fapiPbch_t result; ret = nr_rx_pbch(UE, &proc, - UE->pbch_vars[0], + estimateSz, dl_ch_estimates, + UE->pbch_vars[0], frame_parms, 0, ssb_index%8, - SISO); + SISO, + &result); if (ret==0) { //UE->rx_ind.rx_indication_body->mib_pdu.ssb_index; //not yet detected automatically @@ -749,9 +755,9 @@ int main(int argc, char **argv) for (int i=0; i<8; i++) gNB_xtra_byte |= ((gNB->pbch.pbch_a>>(31-i))&1)<<(7-i); - payload_ret = (UE->pbch_vars[0]->xtra_byte == gNB_xtra_byte); + payload_ret = (result.xtra_byte == gNB_xtra_byte); for (i=0;i<3;i++){ - payload_ret += (UE->pbch_vars[0]->decoded_output[i] == ((msgDataTx.ssb[ssb_index].ssb_pdu.ssb_pdu_rel15.bchPayload>>(8*i)) & 0xff)); + payload_ret += (result.decoded_output[i] == ((msgDataTx.ssb[ssb_index].ssb_pdu.ssb_pdu_rel15.bchPayload>>(8*i)) & 0xff)); } //printf("xtra byte gNB: 0x%02x UE: 0x%02x\n",gNB_xtra_byte, UE->pbch_vars[0]->xtra_byte); //printf("ret %d\n", payload_ret); From 50b0abc18d4ea0fbf6b905878a618a2e309ee478 Mon Sep 17 00:00:00 2001 From: francescomani Date: Tue, 15 Feb 2022 15:29:48 +0100 Subject: [PATCH 31/96] testing highest mcs for 256qam --- cmake_targets/autotests/test_case_list.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml index 19421a97ab..380f80f46d 100755 --- a/cmake_targets/autotests/test_case_list.xml +++ b/cmake_targets/autotests/test_case_list.xml @@ -1121,7 +1121,7 @@ -n100 -R217 -a110 -s5 -b100 -n100 -e27 -s30 -n100 -e16 -s10 - -n100 -q1 -e26 -s30 + -n100 -q1 -e27 -s30 -n100 -s1 -t25 -n100 -s1 -t33 -n100 -s1 -t50 From 6054d3aecc19c366a21ca45b33e8ade18ac09e7d Mon Sep 17 00:00:00 2001 From: Laurent THOMAS Date: Tue, 15 Feb 2022 17:44:24 +0100 Subject: [PATCH 32/96] finish remove global vars for UE PBCH --- .../nr_dl_channel_estimation.c | 2 +- .../PHY/NR_UE_TRANSPORT/nr_initial_sync.c | 3 +- openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c | 147 +++++++++--------- openair1/PHY/TOOLS/nr_phy_scope.c | 105 +++++++------ openair1/PHY/TOOLS/phy_scope_interface.h | 9 +- openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c | 2 +- 6 files changed, 141 insertions(+), 127 deletions(-) diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c index 8efe85b222..12c78a08fb 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -455,7 +455,7 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue, } } if (dmrss == 2) - scopeCopy(ue, pbchDlChEstimateTime, dl_ch_estimates_time, sizeof(struct complex16), idftsizeidx, ue->frame_parms.nb_antennas_rx); + UEscopeCopy(ue, pbchDlChEstimateTime, (void*)dl_ch_estimates_time, sizeof(struct complex16), ue->frame_parms.nb_antennas_rx, idftsizeidx); return(0); } diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c b/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c index 39dc183bc3..3dc0d79e35 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c @@ -153,7 +153,8 @@ int nr_pbch_detection(UE_nr_rxtx_proc_t * proc, PHY_VARS_NR_UE *ue, int pbch_ini struct complex16 dl_ch_estimates[frame_parms->nb_antennas_rx][estimateSz]; struct complex16 dl_ch_estimates_time[frame_parms->nb_antennas_rx][estimateSz]; for(int i=pbch_initial_symbol; ii_ssb,temp_ptr->n_hf); + nr_pbch_channel_estimation(ue,estimateSz, dl_ch_estimates, dl_ch_estimates_time, + proc,0,0,i,i-pbch_initial_symbol,temp_ptr->i_ssb,temp_ptr->n_hf); stop_meas(&ue->dlsch_channel_estimation_stats); fapiPbch_t result; ret = nr_rx_pbch(ue, diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c b/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c index 2b5cc6c3d6..0073e8344d 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c @@ -37,28 +37,28 @@ #include "PHY/INIT/phy_init.h" #include "openair1/SCHED_NR_UE/defs.h" #include +#include -//#define DEBUG_PBCH +//#define DEBUG_PBCH //#define DEBUG_PBCH_ENCODING - //#include "PHY_INTERFACE/defs.h" +//#include "PHY_INTERFACE/defs.h" #define PBCH_A 24 #define print_shorts(s,x) printf("%s : %d,%d,%d,%d,%d,%d,%d,%d\n",s,((int16_t*)x)[0],((int16_t*)x)[1],((int16_t*)x)[2],((int16_t*)x)[3],((int16_t*)x)[4],((int16_t*)x)[5],((int16_t*)x)[6],((int16_t*)x)[7]) static uint16_t nr_pbch_extract(int **rxdataF, - const int estimateSz, - struct complex16 dl_ch_estimates[][estimateSz], - struct complex16 rxdataF_ext[][20*12*4], - struct complex16 dl_ch_estimates_ext[][20*12*4], - uint32_t symbol, - uint32_t s_offset, - NR_DL_FRAME_PARMS *frame_parms) { + const int estimateSz, + struct complex16 dl_ch_estimates[][estimateSz], + struct complex16 rxdataF_ext[][20*12*4], + struct complex16 dl_ch_estimates_ext[][20*12*4], + uint32_t symbol, + uint32_t s_offset, + NR_DL_FRAME_PARMS *frame_parms) { uint16_t rb; uint8_t i,j,aarx; int nushiftmod4 = frame_parms->nushift; - AssertFatal(symbol>=1 && symbol<5, "symbol %d illegal for PBCH extraction\n", symbol); @@ -66,7 +66,6 @@ static uint16_t nr_pbch_extract(int **rxdataF, for (aarx=0; aarxnb_antennas_rx; aarx++) { unsigned int rx_offset = frame_parms->first_carrier_offset + frame_parms->ssb_start_subcarrier; rx_offset = (rx_offset)%(frame_parms->ofdm_symbol_size); - struct complex16 *rxF = (struct complex16 *)&rxdataF[aarx][(symbol+s_offset)*frame_parms->ofdm_symbol_size]; struct complex16 *rxF_ext = rxdataF_ext[aarx]; #ifdef DEBUG_PBCH @@ -103,7 +102,7 @@ static uint16_t nr_pbch_extract(int **rxdataF, rx_offset=(rx_offset+1)%(frame_parms->ofdm_symbol_size); //rx_offset = (rx_offset >= frame_parms->ofdm_symbol_size) ? (rx_offset - frame_parms->ofdm_symbol_size + 1) : (rx_offset+1); - } + } rxF_ext+=9; } else { //symbol 2 @@ -129,11 +128,12 @@ static uint16_t nr_pbch_extract(int **rxdataF, } rxF_ext+=9; - } else{ //rx_offset = (rx_offset >= frame_parms->ofdm_symbol_size) ? (rx_offset - frame_parms->ofdm_symbol_size + 12) : (rx_offset+12); - rx_offset = (rx_offset+12)%(frame_parms->ofdm_symbol_size); - } + } else { //rx_offset = (rx_offset >= frame_parms->ofdm_symbol_size) ? (rx_offset - frame_parms->ofdm_symbol_size + 12) : (rx_offset+12); + rx_offset = (rx_offset+12)%(frame_parms->ofdm_symbol_size); + } } } + struct complex16 *dl_ch0 = &dl_ch_estimates[aarx][((symbol+s_offset)*(frame_parms->ofdm_symbol_size))]; //printf("dl_ch0 addr %p\n",dl_ch0); @@ -258,12 +258,12 @@ int nr_pbch_channel_level(struct complex16 dl_ch_estimates_ext[][20*12*4], } static void nr_pbch_channel_compensation(struct complex16 rxdataF_ext[][20*12*4], - struct complex16 dl_ch_estimates_ext[][20*12*4], - int cols, - struct complex16 rxdataF_comp[][cols], - NR_DL_FRAME_PARMS *frame_parms, - uint32_t symbol, - uint8_t output_shift) { + struct complex16 dl_ch_estimates_ext[][20*12*4], + int cols, + struct complex16 rxdataF_comp[][cols], + NR_DL_FRAME_PARMS *frame_parms, + uint32_t symbol, + uint8_t output_shift) { AssertFatal((symbol > 0 && symbol < 4), "symbol %d is illegal for PBCH DM-RS\n", symbol); @@ -326,15 +326,15 @@ void nr_pbch_detection_mrc(NR_DL_FRAME_PARMS *frame_parms, } static void nr_pbch_unscrambling(NR_UE_PBCH *pbch, - int16_t *demod_pbch_e, + int16_t *demod_pbch_e, uint16_t Nid, uint8_t nushift, uint16_t M, uint16_t length, uint8_t bitwise, - uint32_t unscrambling_mask, - uint32_t pbch_a_prime, - uint32_t *pbch_a_interleaved) { + uint32_t unscrambling_mask, + uint32_t pbch_a_prime, + uint32_t *pbch_a_interleaved) { uint8_t reset, offset; uint32_t x1, x2, s=0; uint8_t k=0; @@ -362,10 +362,10 @@ static void nr_pbch_unscrambling(NR_UE_PBCH *pbch, reset = 0; } - *pbch_a_interleaved ^= ((unscrambling_mask>>i)&1)? ((pbch_a_prime>>i)&1)<>i)&1) ^ ((s>>((k+offset)&0x1f))&1))<>i)&1)); + *pbch_a_interleaved ^= ((unscrambling_mask>>i)&1)? ((pbch_a_prime>>i)&1)<>i)&1) ^ ((s>>((k+offset)&0x1f))&1))<>i)&1)); #ifdef DEBUG_PBCH_ENCODING - printf("i %d k %d offset %d (unscrambling_mask>>i)&1) %d s: %08x\t pbch_a_interleaved 0x%08x (!((unscrambling_mask>>i)&1)) %d\n", i, k, offset, (unscrambling_mask>>i)&1, s, *pbch_a_interleaved, + printf("i %d k %d offset %d (unscrambling_mask>>i)&1) %d s: %08x\t pbch_a_interleaved 0x%08x (!((unscrambling_mask>>i)&1)) %d\n", i, k, offset, (unscrambling_mask>>i)&1, s, *pbch_a_interleaved, (!((unscrambling_mask>>i)&1))); #endif } else { @@ -388,17 +388,15 @@ static void nr_pbch_unscrambling(NR_UE_PBCH *pbch, } static void nr_pbch_quantize(int16_t *pbch_llr8, - int16_t *pbch_llr, - uint16_t len) { - uint16_t i; - - for (i=0; i31) pbch_llr8[i]=32; else if (pbch_llr[i]<-31) pbch_llr8[i]=-32; else - pbch_llr8[i] = (char)(pbch_llr[i]); + pbch_llr8[i]=pbch_llr[i]; } } /* @@ -411,33 +409,32 @@ uint8_t pbch_deinterleaving_pattern[32] = {28,0,31,30,7,29,25,27,5,8,24,9,10,11, int nr_rx_pbch( PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, - int estimateSz, struct complex16 dl_ch_estimates [][estimateSz], + int estimateSz, struct complex16 dl_ch_estimates [][estimateSz], NR_UE_PBCH *nr_ue_pbch_vars, NR_DL_FRAME_PARMS *frame_parms, uint8_t gNB_id, uint8_t i_ssb, MIMO_mode_t mimo_mode, - fapiPbch_t* result) { - + fapiPbch_t *result) { NR_UE_COMMON *nr_ue_common_vars = &ue->common_vars; int max_h=0; int symbol; //uint8_t pbch_a[64]; -//FT ?? cppcheck doesn't like pbch_a allocation because of line 525..and i don't get what this variable is for.. -//uint8_t *pbch_a = malloc(sizeof(uint8_t) * NR_POLAR_PBCH_PAYLOAD_BITS); + //FT ?? cppcheck doesn't like pbch_a allocation because of line 525..and i don't get what this variable is for.. + //uint8_t *pbch_a = malloc(sizeof(uint8_t) * NR_POLAR_PBCH_PAYLOAD_BITS); uint8_t nushift; uint16_t M; - uint8_t Lmax=frame_parms->Lmax; + uint8_t Lmax=frame_parms->Lmax; //uint16_t crc; //unsigned short idx_demod =0; uint32_t decoderState=0; //uint8_t decoderListSize = 8, pathMetricAppr = 0; //time_stats_t polar_decoder_init,polar_rate_matching,decoding,bit_extraction,deinterleaving; //time_stats_t path_metric,sorting,update_LLR; -// FT ?? cppcheck fix memset(&pbch_a[0], 0, sizeof(uint8_t) * NR_POLAR_PBCH_PAYLOAD_BITS); + // FT ?? cppcheck fix memset(&pbch_a[0], 0, sizeof(uint8_t) * NR_POLAR_PBCH_PAYLOAD_BITS); //printf("nr_pbch_ue nid_cell %d\n",frame_parms->Nid_cell); - - int16_t pbch_e_rx[960]={0}; //Fixme: previous version erase only NR_POLAR_PBCH_E bytes + int16_t pbch_e_rx[960]= {0}; //Fixme: previous version erase only NR_POLAR_PBCH_E bytes + int16_t pbch_unClipped[960]= {0}; int pbch_e_rx_idx=0; int symbol_offset=1; @@ -446,24 +443,22 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue, else symbol_offset=0; - #ifdef DEBUG_PBCH //printf("address dataf %p",nr_ue_common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF); write_output("rxdataF0_pbch.m","rxF0pbch", &nr_ue_common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[0][(symbol_offset+1)*frame_parms->ofdm_symbol_size],frame_parms->ofdm_symbol_size*3,1,1); #endif - // symbol refers to symbol within SSB. symbol_offset is the offset of the SSB wrt start of slot double log2_maxh; + for (symbol=1; symbol<4; symbol++) { const uint16_t nb_re=symbol == 2 ? 72 : 180; struct complex16 rxdataF_ext[frame_parms->nb_antennas_rx][20*12*4]; struct complex16 rxdataF_comp[frame_parms->nb_antennas_rx][nb_re]; //was dl_ch_estimates[idx] = (int32_t *)malloc16_clear( sizeof(int32_t)*7*2*sizeof(int)*(fp->ofdm_symbol_size) ); struct complex16 dl_ch_estimates_ext[frame_parms->nb_antennas_rx][20*12*4]; - nr_pbch_extract(nr_ue_common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF, - estimateSz, + estimateSz, dl_ch_estimates, rxdataF_ext, dl_ch_estimates_ext, @@ -487,7 +482,7 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue, #endif nr_pbch_channel_compensation(rxdataF_ext, dl_ch_estimates_ext, - nb_re, + nb_re, rxdataF_comp, frame_parms, symbol, @@ -510,34 +505,39 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue, nr_pbch_quantize(pbch_e_rx+pbch_e_rx_idx, (short *)rxdataF_comp[0], 144); + memcpy(pbch_unClipped+pbch_e_rx_idx, rxdataF_comp[0], 144*sizeof(int16_t)); pbch_e_rx_idx+=144; } else { nr_pbch_quantize(pbch_e_rx+pbch_e_rx_idx, (short *)rxdataF_comp[0], 360); + memcpy(pbch_unClipped+pbch_e_rx_idx, rxdataF_comp[0], 144*sizeof(int16_t)); pbch_e_rx_idx+=360; } } + // legacy code use int16, but it is complex16 + UEscopeCopy(ue, pbchRxdataF_comp, pbch_unClipped, sizeof(struct complex16), frame_parms->nb_antennas_rx, pbch_e_rx_idx/2); + UEscopeCopy(ue, pbchLlr, pbch_e_rx, sizeof(int16_t), frame_parms->nb_antennas_rx, pbch_e_rx_idx); #ifdef DEBUG_PBCH write_output("rxdataF_comp.m","rxFcomp",rxdataF_comp[0],240*3,1,1); #endif //demod_pbch_e = nr_ue_pbch_vars->demod_pbch_e; -// FT?? cppcheck fix - pbch_a = nr_ue_pbch_vars->pbch_a; + // FT?? cppcheck fix - pbch_a = nr_ue_pbch_vars->pbch_a; #ifdef DEBUG_PBCH short *p = (short *)rxdataF_comp[0]); -for (int cnt = 0; cnt < 864 ; cnt++) - printf("pbch rx llr %d\n",*(pbch_e_rx+cnt)); + for (int cnt = 0; cnt < 864 ; cnt++) +printf("pbch rx llr %d\n",*(pbch_e_rx+cnt)); #endif //un-scrambling -M = NR_POLAR_PBCH_E; -nushift = (Lmax==4)? i_ssb&3 : i_ssb&7; + M = NR_POLAR_PBCH_E; + nushift = (Lmax==4)? i_ssb&3 : i_ssb&7; uint32_t unscrambling_mask = (Lmax==64)?0x100006D:0x1000041; uint32_t pbch_a_interleaved=0; -uint32_t pbch_a_prime=0; -nr_pbch_unscrambling(nr_ue_pbch_vars,pbch_e_rx,frame_parms->Nid_cell,nushift,M,NR_POLAR_PBCH_E,0,0, pbch_a_prime, &pbch_a_interleaved); + uint32_t pbch_a_prime=0; + nr_pbch_unscrambling(nr_ue_pbch_vars,pbch_e_rx,frame_parms->Nid_cell,nushift,M,NR_POLAR_PBCH_E,0,0, pbch_a_prime, &pbch_a_interleaved); //polar decoding de-rate matching const t_nrPolar_params *currentPtr = nr_polar_params( NR_POLAR_PBCH_MESSAGE_TYPE, NR_POLAR_PBCH_PAYLOAD_BITS, NR_POLAR_PBCH_AGGREGATION_LEVEL,1,&ue->polarList); decoderState = polar_decoder_int16(pbch_e_rx,(uint64_t *)&pbch_a_prime,0,currentPtr); @@ -549,20 +549,20 @@ nr_pbch_unscrambling(nr_ue_pbch_vars,pbch_e_rx,frame_parms->Nid_cell,nushift,M,N uint32_t a_reversed=0; for (int i=0; i>i)&1)<<(31-i); +a_reversed |= (((uint64_t)pbch_a_prime>>i)&1)<<(31-i); pbch_a_prime = a_reversed; //payload un-scrambling M = (Lmax == 64)? (NR_POLAR_PBCH_PAYLOAD_BITS - 6) : (NR_POLAR_PBCH_PAYLOAD_BITS - 3); nushift = ((pbch_a_prime>>24)&1) ^ (((pbch_a_prime>>6)&1)<<1); -nr_pbch_unscrambling(nr_ue_pbch_vars,pbch_e_rx,frame_parms->Nid_cell,nushift,M,NR_POLAR_PBCH_PAYLOAD_BITS,1,unscrambling_mask,pbch_a_prime, &pbch_a_interleaved); + nr_pbch_unscrambling(nr_ue_pbch_vars,pbch_e_rx,frame_parms->Nid_cell,nushift,M,NR_POLAR_PBCH_PAYLOAD_BITS,1,unscrambling_mask,pbch_a_prime, &pbch_a_interleaved); //printf("nushift %d sfn 3rd %d 2nd %d", nushift,((pbch_a_prime>>6)&1), ((pbch_a_prime>>24)&1) ); //payload deinterleaving //uint32_t in=0; uint32_t out=0; for (int i=0; i<32; i++) { - out |= ((pbch_a_interleaved>>i)&1)<<(pbch_deinterleaving_pattern[i]); + out |= ((pbch_a_interleaved>>i)&1)<<(pbch_deinterleaving_pattern[i]); #ifdef DEBUG_PBCH printf("i %d in 0x%08x out 0x%08x ilv %d (in>>i)&1) 0x%08x\n", i, pbch_a_interleaved, out, pbch_deinterleaving_pattern[i], (pbch_a_interleaved>>i)&1); #endif @@ -572,29 +572,30 @@ nr_pbch_unscrambling(nr_ue_pbch_vars,pbch_e_rx,frame_parms->Nid_cell,nushift,M,N result->xtra_byte = (out>>24)&0xff; for (int i=0; i>i)&1)<<(NR_POLAR_PBCH_PAYLOAD_BITS-i-1); +payload |= ((out>>i)&1)<<(NR_POLAR_PBCH_PAYLOAD_BITS-i-1); for (int i=0; i<3; i++) - result->decoded_output[i] = (uint8_t)((payload>>((3-i)<<3))&0xff); - -frame_parms->half_frame_bit = (result->xtra_byte>>4)&0x01; // computing the half frame index from the extra byte +result->decoded_output[i] = (uint8_t)((payload>>((3-i)<<3))&0xff); + frame_parms->half_frame_bit = (result->xtra_byte>>4)&0x01; // computing the half frame index from the extra byte frame_parms->ssb_index = i_ssb; // ssb index corresponds to i_ssb for Lmax = 4,8 + if (Lmax == 64) { // for Lmax = 64 ssb index 4th,5th and 6th bits are in extra byte - for (int i=0; i<3; i++) + for (int i=0; i<3; i++) frame_parms->ssb_index += (((result->xtra_byte>>(7-i))&0x01)<<(3+i)); } ue->symbol_offset = nr_get_ssb_start_symbol(frame_parms,frame_parms->ssb_index); + if (frame_parms->half_frame_bit) - ue->symbol_offset += (frame_parms->slots_per_frame>>1)*frame_parms->symbols_per_slot; + ue->symbol_offset += (frame_parms->slots_per_frame>>1)*frame_parms->symbols_per_slot; uint8_t frame_number_4lsb = 0; + for (int i=0; i<4; i++) - frame_number_4lsb |= ((result->xtra_byte>>i)&1)<<(3-i); +frame_number_4lsb |= ((result->xtra_byte>>i)&1)<<(3-i); proc->decoded_frame_rx = frame_number_4lsb; - #ifdef DEBUG_PBCH printf("xtra_byte %x payload %x\n", xtra_byte, payload); @@ -602,18 +603,16 @@ frame_parms->half_frame_bit = (result->xtra_byte>>4)&0x01; // computing the half // printf("unscrambling pbch_a[%d] = %x \n", i,pbch_a[i]); printf("[PBCH] decoder payload[%d] = %x\n",i,result->decoded_output[i]); } + #endif - nr_downlink_indication_t dl_indication; -fapi_nr_rx_indication_t *rx_ind = calloc(1, sizeof(*rx_ind)); -uint16_t number_pdus = 1; - -nr_fill_dl_indication(&dl_indication, NULL, rx_ind, proc, ue, gNB_id); - -nr_fill_rx_indication(rx_ind, FAPI_NR_RX_PDU_TYPE_SSB, gNB_id, ue, NULL, NULL, number_pdus, proc,(void*)result); + fapi_nr_rx_indication_t *rx_ind = calloc(1, sizeof(*rx_ind)); + uint16_t number_pdus = 1; + nr_fill_dl_indication(&dl_indication, NULL, rx_ind, proc, ue, gNB_id); + nr_fill_rx_indication(rx_ind, FAPI_NR_RX_PDU_TYPE_SSB, gNB_id, ue, NULL, NULL, number_pdus, proc,(void *)result); if (ue->if_inst && ue->if_inst->dl_indication) - ue->if_inst->dl_indication(&dl_indication, NULL); + ue->if_inst->dl_indication(&dl_indication, NULL); return 0; } diff --git a/openair1/PHY/TOOLS/nr_phy_scope.c b/openair1/PHY/TOOLS/nr_phy_scope.c index a31414946f..fe0f785ef4 100644 --- a/openair1/PHY/TOOLS/nr_phy_scope.c +++ b/openair1/PHY/TOOLS/nr_phy_scope.c @@ -41,6 +41,10 @@ typedef struct complex16 scopeSample_t; #define SquaredNorm(VaR) ((VaR).r*(VaR).r+(VaR).i*(VaR).i) typedef struct { + int dataSize; + int elementSz; + int colSz; + int lineSz; } scopeGraphData_t; typedef struct OAIgraph { @@ -59,7 +63,7 @@ typedef struct OAIgraph { boolean_t initDone; int iteration; void (*gNBfunct) (struct OAIgraph *graph, scopeData_t *p, int UE_id); - void (*nrUEfunct)(scopeGraphData_t** data, struct OAIgraph *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id); + void (*nrUEfunct)(scopeGraphData_t **data, struct OAIgraph *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id); } OAIgraph_t; /* Forms and Objects */ @@ -546,7 +550,7 @@ static void *scope_thread_gNB(void *arg) { static void copyRxdataF(int32_t *data, int slot, void *scopeData) { scopeData_t *scope=(scopeData_t *)scopeData; - memcpy(((int32_t*)scope->liveData) + slot*scope->gNB->frame_parms.samples_per_slot_wCP, + memcpy(((int32_t *)scope->liveData) + slot*scope->gNB->frame_parms.samples_per_slot_wCP, data, scope->gNB->frame_parms.samples_per_slot_wCP*sizeof(int32_t)); } @@ -584,10 +588,11 @@ static void ueChannelResponse (scopeGraphData_t **data, OAIgraph_t *graph, PHY_ // Channel Impulse Response if (!data[pbchDlChEstimateTime]) return; - - genericPowerPerAntena(graph, phy_vars_ue->frame_parms.nb_antennas_rx, - (const scopeSample_t **) &data[pbchDlChEstimateTime], - phy_vars_ue->frame_parms.ofdm_symbol_size>>3); + + const scopeSample_t *tmp=(scopeSample_t *)(data[pbchDlChEstimateTime]+1); + genericPowerPerAntena(graph, data[pbchDlChEstimateTime]->colSz, + &tmp, + data[pbchDlChEstimateTime]->lineSz); } static void ueFreqWaterFall (scopeGraphData_t **data, OAIgraph_t *graph,PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id ) { @@ -639,51 +644,38 @@ static void uePbchLLR (scopeGraphData_t **data, OAIgraph_t *graph, PHY_VARS_NR_ if ( !data[pbchLlr]) return; - int16_t *pbch_llr = (int16_t *)data[pbchLlr]; + const int sz=data[pbchLlr]->lineSz; + //const int antennas=data[pbchLlr]->colSz; + // We take the first antenna only for now + int16_t *llrs = (int16_t *) (data[pbchLlr]+1); float *llr_pbch, *bit_pbch; - oai_xygraph_getbuff(graph, &bit_pbch, &llr_pbch, 864, 0); + oai_xygraph_getbuff(graph, &bit_pbch, &llr_pbch, sz, 0); - for (int i=0; i<864; i++) { - llr_pbch[i] = (float) pbch_llr[i]; + for (int i=0; ilineSz; float *I, *Q; - oai_xygraph_getbuff(graph, &I, &Q, 180*3, 0); - memset(I,0,180*3*sizeof(*I)); - memset(Q,0,180*3*sizeof(*Q)); - int first_symbol=1; - int base=0; + oai_xygraph_getbuff(graph, &I, &Q, sz, 0); - for (int symbol=first_symbol; symbol<(first_symbol+3); symbol++) { - int nb_re; - - if (symbol == 2 || symbol == 6) - nb_re = 72; - else - nb_re = 180; - - AssertFatal(base+nb_re<180*3,""); - - for (int i=0; ipdcch_vars[0][eNB_id]->llr) @@ -882,7 +874,7 @@ static OAI_phy_scope_t *create_phy_scope_nrue( int ID ) { } void phy_scope_nrUE(scopeGraphData_t **UEliveData, - OAI_phy_scope_t *form, + OAI_phy_scope_t *form, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) { @@ -909,20 +901,19 @@ void phy_scope_nrUE(scopeGraphData_t **UEliveData, static void *nrUEscopeThread(void *arg) { PHY_VARS_NR_UE *ue=(PHY_VARS_NR_UE *)arg; size_t stksize; - pthread_attr_t atr={0}; + pthread_attr_t atr= {0}; pthread_attr_getstacksize(&atr, &stksize); pthread_attr_setstacksize(&atr,32*1024*1024 ); int fl_argc=1; char *name="5G-UE-scope"; fl_initialize (&fl_argc, &name, NULL, 0, 0); OAI_phy_scope_t *form_nrue=create_phy_scope_nrue(0); + (( scopeData_t *)ue->scopeData)->liveData=calloc(sizeof(scopeGraphData_t *), UEdataTypeNumberOfItems); - scopeGraphData_t *UEliveData[UEdataTypeNumberOfItems]; - while (!oai_exit) { fl_freeze_form(form_nrue->phy_scope); - phy_scope_nrUE(UEliveData, - form_nrue, + phy_scope_nrUE((( scopeData_t *)ue->scopeData)->liveData, + form_nrue, ue, 0,0); fl_unfreeze_form(form_nrue->phy_scope); @@ -933,8 +924,30 @@ static void *nrUEscopeThread(void *arg) { pthread_exit((void *)arg); } -void UEcopyData(enum UEdataType type, void * data, int elementSz, int colSz, int lineSz) { - +void UEcopyData(PHY_VARS_NR_UE *ue, enum UEdataType type, void *dataIn, int elementSz, int colSz, int lineSz) { + scopeData_t *tmp=(scopeData_t *)ue->scopeData; + + if (tmp) { + scopeGraphData_t *live= ((scopeGraphData_t **)tmp->liveData)[type]; + + if (live == NULL || live->dataSize < elementSz*colSz*lineSz) { + scopeGraphData_t *ptr=realloc(live, sizeof(scopeGraphData_t) + elementSz*colSz*lineSz); + + if (!ptr) { + LOG_E(PHY,"can't realloc\n"); + return; + } else { + live=ptr; + } + } + + live->dataSize=elementSz*colSz*lineSz; + live->elementSz=elementSz; + live->colSz=colSz; + live->lineSz=lineSz; + memcpy(live+1, dataIn, elementSz*colSz*lineSz); + ((scopeGraphData_t **)tmp->liveData)[type]=live; + } } void nrUEinitScope(PHY_VARS_NR_UE *ue) { @@ -942,7 +955,7 @@ void nrUEinitScope(PHY_VARS_NR_UE *ue) { scopeData_t *scope=(scopeData_t *) ue->scopeData; scope->copyData=UEcopyData; pthread_t forms_thread; - threadCreate(&forms_thread, nrUEscopeThread, ue, "scope", -1, OAI_PRIORITY_RT_LOW); + threadCreate(&forms_thread, nrUEscopeThread, ue, "scope", -1, OAI_PRIORITY_RT_LOW); } void nrscope_autoinit(void *dataptr) { diff --git a/openair1/PHY/TOOLS/phy_scope_interface.h b/openair1/PHY/TOOLS/phy_scope_interface.h index 1ba6bb558d..9cd8e1dc40 100644 --- a/openair1/PHY/TOOLS/phy_scope_interface.h +++ b/openair1/PHY/TOOLS/phy_scope_interface.h @@ -32,6 +32,7 @@ #ifndef __PHY_SCOPE_INTERFACE_H__ #define __PHY_SCOPE_INTERFACE_H__ #include +#include typedef struct { int *argc; @@ -52,13 +53,13 @@ typedef struct scopeData_s { char **argv; RU_t *ru; PHY_VARS_gNB *gNB; - void * liveData; - void (*slotFunc)(int32_t* data, int slot, void * scopeData); - void (*copyData)(enum UEdataType, void * data, int elementSz, int colSz, int lineSz); + void *liveData; + void (*slotFunc)(int32_t *data, int slot, void *scopeData); + void (*copyData)(PHY_VARS_NR_UE *,enum UEdataType, void *data, int elementSz, int colSz, int lineSz); } scopeData_t; int load_softscope(char *exectype, void *initarg); int end_forms(void) ; -#define scopeCopy(ue, type, ...) if(ue->scopeData) ((scopeData_t*)ue->scopeData)->copyData(type, ##__VA_ARGS__); +#define UEscopeCopy(ue, type, ...) if(ue->scopeData) ((scopeData_t*)ue->scopeData)->copyData(ue, type, ##__VA_ARGS__); #endif diff --git a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c index c7b54950d7..3f263c08fe 100644 --- a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c +++ b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c @@ -1170,7 +1170,7 @@ int nr_ue_dl_indication(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_ (dl_info->rx_ind->rx_indication_body+i)->ssb_pdu.ssb_length, (dl_info->rx_ind->rx_indication_body+i)->ssb_pdu.ssb_start_subcarrier, (dl_info->rx_ind->rx_indication_body+i)->ssb_pdu.cell_id)) << FAPI_NR_RX_PDU_TYPE_SSB; - + free((dl_info->rx_ind->rx_indication_body+i)->ssb_pdu.pdu); break; case FAPI_NR_RX_PDU_TYPE_SIB: ret_mask |= (handle_bcch_dlsch(dl_info->module_id, From 83cd94cf6a4c1b3eb8f002df241c2237343bdaa8 Mon Sep 17 00:00:00 2001 From: francescomani Date: Wed, 16 Feb 2022 11:18:15 +0100 Subject: [PATCH 33/96] dynamic selection of codewords for DL init --- openair1/PHY/INIT/nr_init.c | 5 +++-- openair1/PHY/INIT/nr_init_ue.c | 9 ++++++--- openair1/PHY/NR_REFSIG/nr_gold.c | 9 +++++---- openair1/PHY/NR_REFSIG/nr_gold_ue.c | 15 +++++++-------- openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c | 4 +++- .../PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c | 3 ++- openair1/PHY/defs_gNB.h | 2 +- openair1/PHY/defs_nr_UE.h | 2 +- openair1/PHY/defs_nr_common.h | 1 - openair1/SCHED_NR_UE/phy_procedures_nr_ue.c | 6 +++++- 10 files changed, 33 insertions(+), 23 deletions(-) diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c index 9a2e8c91cb..fb7e89c9ce 100644 --- a/openair1/PHY/INIT/nr_init.c +++ b/openair1/PHY/INIT/nr_init.c @@ -146,11 +146,12 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB, pdsch_dmrs[slot] = (uint32_t ***)malloc16(fp->symbols_per_slot*sizeof(uint32_t **)); AssertFatal(pdsch_dmrs[slot]!=NULL, "NR init: pdsch_dmrs for slot %d - malloc failed\n", slot); + int nb_codewords = NR_MAX_NB_LAYERS > 4 ? 2 : 1; for (int symb=0; symbsymbols_per_slot; symb++) { - pdsch_dmrs[slot][symb] = (uint32_t **)malloc16(NR_MAX_NB_CODEWORDS*sizeof(uint32_t *)); + pdsch_dmrs[slot][symb] = (uint32_t **)malloc16(nb_codewords*sizeof(uint32_t *)); AssertFatal(pdsch_dmrs[slot][symb]!=NULL, "NR init: pdsch_dmrs for slot %d symbol %d - malloc failed\n", slot, symb); - for (int q=0; qsymbols_per_slot*sizeof(uint32_t **)); AssertFatal(pdsch_dmrs[slot]!=NULL, "NR init: pdsch_dmrs for slot %d - malloc failed\n", slot); + int nb_codewords = NR_MAX_NB_LAYERS > 4 ? 2 : 1; for (int symb=0; symbsymbols_per_slot; symb++) { - pdsch_dmrs[slot][symb] = (uint32_t **)malloc16(NR_MAX_NB_CODEWORDS*sizeof(uint32_t *)); + pdsch_dmrs[slot][symb] = (uint32_t **)malloc16(nb_codewords*sizeof(uint32_t *)); AssertFatal(pdsch_dmrs[slot][symb]!=NULL, "NR init: pdsch_dmrs for slot %d symbol %d - malloc failed\n", slot, symb); - for (int q=0; q 4? 2:1; for (int i = 0; i < NUMBER_OF_CONNECTED_gNB_MAX; i++) { - for (int j=0; j<2; j++) { + for (int j=0; jdlsch[k][i][j] = new_nr_ue_dlsch(1,NR_MAX_DLSCH_HARQ_PROCESSES,NSOFT,MAX_LDPC_ITERATIONS,ue->frame_parms.N_RB_DL, abstraction_flag))!=NULL,"Can't get ue dlsch structures\n"); LOG_D(PHY,"dlsch[%d][%d][%d] => %p\n",k,i,j,ue->dlsch[k][i][j]); diff --git a/openair1/PHY/NR_REFSIG/nr_gold.c b/openair1/PHY/NR_REFSIG/nr_gold.c index 7f81529964..b593dcbb47 100644 --- a/openair1/PHY/NR_REFSIG/nr_gold.c +++ b/openair1/PHY/NR_REFSIG/nr_gold.c @@ -82,11 +82,12 @@ void nr_init_pdsch_dmrs(PHY_VARS_gNB* gNB, uint32_t Nid) { uint32_t x1, x2; - uint8_t reset, q; + uint8_t reset; NR_DL_FRAME_PARMS *fp = &gNB->frame_parms; uint32_t ****pdsch_dmrs = gNB->nr_gold_pdsch_dmrs; int pdsch_dmrs_init_length = ((fp->N_RB_DL*12)>>5)+1; - uint16_t N_n_scid[NR_MAX_NB_CODEWORDS]={Nid, Nid}; // Not correct, appropriate scrambling IDs have to be updated to support DCI 1_1 + int nb_codewords = NR_MAX_NB_LAYERS > 4 ? 2 : 1; + uint16_t N_n_scid[2]={Nid, Nid}; uint8_t n_scid=0; // again works only for 1_0 for (uint8_t slot=0; slotslots_per_frame; slot++) { @@ -99,8 +100,8 @@ void nr_init_pdsch_dmrs(PHY_VARS_gNB* gNB, uint32_t Nid) reset = 0; } - for (q = 1; q < NR_MAX_NB_CODEWORDS; q++) - memcpy(pdsch_dmrs[slot][symb][q],pdsch_dmrs[slot][symb][0],sizeof(uint32_t)*pdsch_dmrs_init_length); + if(nb_codewords>1) + memcpy(pdsch_dmrs[slot][symb][1],pdsch_dmrs[slot][symb][0],sizeof(uint32_t)*pdsch_dmrs_init_length); } } } diff --git a/openair1/PHY/NR_REFSIG/nr_gold_ue.c b/openair1/PHY/NR_REFSIG/nr_gold_ue.c index 558e41ba44..e3c2af5fb3 100644 --- a/openair1/PHY/NR_REFSIG/nr_gold_ue.c +++ b/openair1/PHY/NR_REFSIG/nr_gold_ue.c @@ -78,29 +78,28 @@ void nr_gold_pdcch(PHY_VARS_NR_UE* ue, void nr_gold_pdsch(PHY_VARS_NR_UE* ue, unsigned short *n_idDMRS) { - unsigned char l; - unsigned int n,x1,x2,x2tmp0,ns; - int nscid; + + unsigned int x1,x2,x2tmp0; unsigned int nid; uint8_t reset; int pdsch_dmrs_init_length = ((ue->frame_parms.N_RB_DL*12)>>5)+1; - + int nb_codewords = NR_MAX_NB_LAYERS > 4 ? 2 : 1; /// to be updated from higher layer //unsigned short lbar = 0; - for (nscid=0; nscid<2; nscid++) { - for (ns=0; nsframe_parms.slots_per_frame; ns++) { + for (int nscid=0; nscidframe_parms.slots_per_frame; ns++) { nid = n_idDMRS[nscid]; - for (l=0; lframe_parms.symbols_per_slot; l++) { + for (int l=0; lframe_parms.symbols_per_slot; l++) { reset = 1; x2tmp0 = ((ue->frame_parms.symbols_per_slot*ns+l+1)*((nid<<1)+1))<<17; x2 = (x2tmp0+(nid<<1)+nscid)%(1<<31); //cinit LOG_D(PHY,"UE DMRS slot %d, symb %d, x2 %x, nscid %d\n",ns,l,x2,nscid); - for (n=0; nnr_gold_pdsch[0][ns][l][nscid][n] = lte_gold_generic(&x1, &x2, reset); reset = 0; } diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c index 8a1dd57c48..b47deec646 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c @@ -137,7 +137,9 @@ NR_gNB_DLSCH_t *new_gNB_dlsch(NR_DL_FRAME_PARMS *frame_parms, dlsch->txdataF[layer] = (int32_t *)malloc16((txdataf_size)*sizeof(int32_t)); } - for (int q=0; q 4 ? 2 : 1; + dlsch->mod_symbs = (int32_t **)malloc16(nb_codewords*sizeof(int32_t *)); + for (int q=0; qmod_symbs[q] = (int32_t *)malloc16(txdataf_size*max_layers*sizeof(int32_t)); dlsch->calib_dl_ch_estimates = (int32_t **)malloc16(64*sizeof(int32_t *)); diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c index b4edae972a..c6fa85e726 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c @@ -205,7 +205,8 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, pdsch_vars = ue->pdsch_vars[proc->thread_id]; dlsch = ue->dlsch[proc->thread_id][gNB_id]; dlsch0_harq = dlsch[0]->harq_processes[harq_pid]; - dlsch1_harq = dlsch[1]->harq_processes[harq_pid]; + if (NR_MAX_NB_LAYERS>4) + dlsch1_harq = dlsch[1]->harq_processes[harq_pid]; beamforming_mode = ue->transmission_mode[gNB_id] < 7 ? 0 :ue->transmission_mode[gNB_id]; break; diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h index df8340dd8c..6959052f74 100644 --- a/openair1/PHY/defs_gNB.h +++ b/openair1/PHY/defs_gNB.h @@ -159,7 +159,7 @@ typedef struct { /// TX buffers for UE-spec transmission (antenna layers 1,...,4 after to precoding) int32_t **txdataF; /// Modulated symbols buffer - int32_t *mod_symbs[NR_MAX_NB_CODEWORDS]; + int32_t **mod_symbs; /// beamforming weights for UE-spec transmission (antenna ports 5 or 7..14), for each codeword, maximum 4 layers? int32_t ***ue_spec_bf_weights; /// dl channel estimates (estimated from ul channel estimates) diff --git a/openair1/PHY/defs_nr_UE.h b/openair1/PHY/defs_nr_UE.h index c2a83e7362..06d066fb51 100644 --- a/openair1/PHY/defs_nr_UE.h +++ b/openair1/PHY/defs_nr_UE.h @@ -817,7 +817,7 @@ typedef struct { NR_UE_PRACH *prach_vars[NUMBER_OF_CONNECTED_gNB_MAX]; NR_UE_PUSCH *pusch_vars[RX_NB_TH_MAX][NUMBER_OF_CONNECTED_gNB_MAX]; NR_UE_PUCCH *pucch_vars[RX_NB_TH_MAX][NUMBER_OF_CONNECTED_gNB_MAX]; - NR_UE_DLSCH_t *dlsch[RX_NB_TH_MAX][NUMBER_OF_CONNECTED_gNB_MAX][NR_MAX_NB_CODEWORDS]; // two RxTx Threads + NR_UE_DLSCH_t *dlsch[RX_NB_TH_MAX][NUMBER_OF_CONNECTED_gNB_MAX][NR_MAX_NB_LAYERS>4 ? 2:1]; // two RxTx Threads NR_UE_ULSCH_t *ulsch[RX_NB_TH_MAX][NUMBER_OF_CONNECTED_gNB_MAX]; NR_UE_DLSCH_t *dlsch_SI[NUMBER_OF_CONNECTED_gNB_MAX]; NR_UE_DLSCH_t *dlsch_ra[NUMBER_OF_CONNECTED_gNB_MAX]; diff --git a/openair1/PHY/defs_nr_common.h b/openair1/PHY/defs_nr_common.h index 7645bf8e96..a3f143c733 100644 --- a/openair1/PHY/defs_nr_common.h +++ b/openair1/PHY/defs_nr_common.h @@ -79,7 +79,6 @@ #define NR_MAX_NB_RBG 18 #define NR_MAX_NB_LAYERS 4 // 8 -#define NR_MAX_NB_CODEWORDS 2 #define NR_MAX_NB_HARQ_PROCESSES 16 #define NR_MAX_PDSCH_TBS 3824 diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c index 81b747e950..b9fd217b27 100644 --- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c +++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c @@ -1847,13 +1847,17 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue, start_meas(&ue->dlsch_procedures_stat[proc->thread_id]); + NR_UE_DLSCH_t *dlsch1 = NULL; + if (NR_MAX_NB_LAYERS>4) + dlsch1 = ue->dlsch[proc->thread_id][gNB_id][1]; + if (ret_pdsch >= 0) nr_ue_dlsch_procedures(ue, proc, gNB_id, PDSCH, ue->dlsch[proc->thread_id][gNB_id][0], - ue->dlsch[proc->thread_id][gNB_id][1], + dlsch1, &ue->dlsch_errors[gNB_id], dlsch_parallel); From 96f2b4e2f36105e923030b80e66ebfb91ac6fe68 Mon Sep 17 00:00:00 2001 From: Laurent THOMAS Date: Wed, 16 Feb 2022 14:49:19 +0100 Subject: [PATCH 34/96] fix unaligned mem for SIMD --- common/utils/LOG/log.h | 2 +- openair1/PHY/CODING/crc_byte.c | 4 +-- openair1/PHY/NR_REFSIG/nr_gold_ue.c | 4 +-- .../PHY/NR_UE_TRANSPORT/nr_initial_sync.c | 6 ++-- openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c | 5 +++- openair1/PHY/NR_UE_TRANSPORT/pss_nr.c | 2 +- openair1/SCHED_NR_UE/phy_procedures_nr_ue.c | 4 +-- openair1/SIMULATION/NR_PHY/pbchsim.c | 29 ++++++++----------- openair2/UTIL/LISTS/list.c | 2 +- openair2/UTIL/LISTS/list2.c | 2 +- 10 files changed, 29 insertions(+), 31 deletions(-) diff --git a/common/utils/LOG/log.h b/common/utils/LOG/log.h index 46c73427c1..9a2c92bb10 100644 --- a/common/utils/LOG/log.h +++ b/common/utils/LOG/log.h @@ -346,7 +346,7 @@ typedef struct { @param format data format (0 = real 16-bit, 1 = complex 16-bit,2 real 32-bit, 3 complex 32-bit,4 = real 8-bit, 5 = complex 8-bit) @param multiVec create new file or append to existing (useful for writing multiple vectors to same file. Just call the function multiple times with same file name and with this parameter set to 1) */ -#define MATLAB_RAW (1<<31) +#define MATLAB_RAW (1U<<31) #define MATLAB_SHORT 0 #define MATLAB_CSHORT 1 #define MATLAB_INT 2 diff --git a/openair1/PHY/CODING/crc_byte.c b/openair1/PHY/CODING/crc_byte.c index 7e37abcf81..9ad18cc1a6 100644 --- a/openair1/PHY/CODING/crc_byte.c +++ b/openair1/PHY/CODING/crc_byte.c @@ -72,10 +72,10 @@ unsigned int crcbit (unsigned char * inputptr, unsigned int i, crc = 0, c; while (octetlen-- > 0) { - c = (*inputptr++) << 24; + c = ((unsigned int)(*inputptr++)) << 24; for (i = 8; i != 0; i--) { - if ((1 << 31) & (c ^ crc)) + if ((1U << 31) & (c ^ crc)) crc = (crc << 1) ^ poly; else crc <<= 1; diff --git a/openair1/PHY/NR_REFSIG/nr_gold_ue.c b/openair1/PHY/NR_REFSIG/nr_gold_ue.c index 623b86edfb..e949faeaf0 100644 --- a/openair1/PHY/NR_REFSIG/nr_gold_ue.c +++ b/openair1/PHY/NR_REFSIG/nr_gold_ue.c @@ -64,7 +64,7 @@ void nr_gold_pdcch(PHY_VARS_NR_UE* ue, reset = 1; x2tmp0 = ((ue->frame_parms.symbols_per_slot*ns+l+1)*((nid<<1)+1))<<17; - x2 = (x2tmp0+(nid<<1))%(1<<31); //cinit + x2 = (x2tmp0+(nid<<1))%(1U<<31); //cinit for (n=0; nnr_gold_pdcch[0][ns][l][n] = lte_gold_generic(&x1, &x2, reset); @@ -95,7 +95,7 @@ void nr_gold_pdsch(PHY_VARS_NR_UE* ue, reset = 1; x2tmp0 = ((ue->frame_parms.symbols_per_slot*ns+l+1)*((nid<<1)+1))<<17; - x2 = (x2tmp0+(nid<<1)+nscid)%(1<<31); //cinit + x2 = (x2tmp0+(nid<<1)+nscid)%(1U<<31); //cinit LOG_D(PHY,"UE DMRS slot %d, symb %d, x2 %x, nscid %d\n",ns,l,x2,nscid); for (n=0; ndlsch_channel_estimation_stats); // computing channel estimation for selected best ssb - const int estimateSz=7*2*sizeof(int)*frame_parms->ofdm_symbol_size; - struct complex16 dl_ch_estimates[frame_parms->nb_antennas_rx][estimateSz]; - struct complex16 dl_ch_estimates_time[frame_parms->nb_antennas_rx][estimateSz]; + const int estimateSz=7*2*frame_parms->ofdm_symbol_size; + __attribute__ ((aligned(32))) struct complex16 dl_ch_estimates[frame_parms->nb_antennas_rx][estimateSz]; + __attribute__ ((aligned(32))) struct complex16 dl_ch_estimates_time[frame_parms->nb_antennas_rx][estimateSz]; for(int i=pbch_initial_symbol; ii_ssb,temp_ptr->n_hf); diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c b/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c index 0073e8344d..c06dec7fcb 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c @@ -457,6 +457,7 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue, struct complex16 rxdataF_comp[frame_parms->nb_antennas_rx][nb_re]; //was dl_ch_estimates[idx] = (int32_t *)malloc16_clear( sizeof(int32_t)*7*2*sizeof(int)*(fp->ofdm_symbol_size) ); struct complex16 dl_ch_estimates_ext[frame_parms->nb_antennas_rx][20*12*4]; + memset(dl_ch_estimates_ext,0, sizeof dl_ch_estimates_ext); nr_pbch_extract(nr_ue_common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF, estimateSz, dl_ch_estimates, @@ -540,7 +541,9 @@ printf("pbch rx llr %d\n",*(pbch_e_rx+cnt)); nr_pbch_unscrambling(nr_ue_pbch_vars,pbch_e_rx,frame_parms->Nid_cell,nushift,M,NR_POLAR_PBCH_E,0,0, pbch_a_prime, &pbch_a_interleaved); //polar decoding de-rate matching const t_nrPolar_params *currentPtr = nr_polar_params( NR_POLAR_PBCH_MESSAGE_TYPE, NR_POLAR_PBCH_PAYLOAD_BITS, NR_POLAR_PBCH_AGGREGATION_LEVEL,1,&ue->polarList); - decoderState = polar_decoder_int16(pbch_e_rx,(uint64_t *)&pbch_a_prime,0,currentPtr); +uint64_t tmp=pbch_a_prime; +decoderState = polar_decoder_int16(pbch_e_rx,&tmp,0,currentPtr); +pbch_a_prime=tmp; if(decoderState) return(decoderState); diff --git a/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c b/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c index 28b6677b2c..0b1f374a52 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c +++ b/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c @@ -883,7 +883,7 @@ int pss_search_time_nr(int **rxdata, ///rx data in time domain /* perform correlation of rx data and pss sequence ie it is a dot product */ result = dot_product64((short*)primary_synchro_time_nr[pss_index], - (short*) &(rxdata[ar][n+is*frame_parms->samples_per_frame]), + (short*)&(rxdata[ar][n+is*frame_parms->samples_per_frame]), frame_parms->ofdm_symbol_size, shift); pss_corr_ue[pss_index][n] += abs64(result); diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c index 12a8ce0d08..bbf4617207 100644 --- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c +++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c @@ -1404,8 +1404,8 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue, VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP_PBCH, VCD_FUNCTION_IN); LOG_D(PHY," ------ PBCH ChannelComp/LLR: frame.slot %d.%d ------ \n", frame_rx%1024, nr_slot_rx); const int estimateSz=7*2*sizeof(int)*fp->ofdm_symbol_size; - struct complex16 dl_ch_estimates[fp->nb_antennas_rx][estimateSz]; - struct complex16 dl_ch_estimates_time[fp->nb_antennas_rx][estimateSz]; + __attribute__ ((aligned(32))) struct complex16 dl_ch_estimates[fp->nb_antennas_rx][estimateSz]; + __attribute__ ((aligned(32))) struct complex16 dl_ch_estimates_time[fp->nb_antennas_rx][estimateSz]; for (int i=1; i<4; i++) { nr_slot_fep(ue, diff --git a/openair1/SIMULATION/NR_PHY/pbchsim.c b/openair1/SIMULATION/NR_PHY/pbchsim.c index 692d1bac20..a314f7b397 100644 --- a/openair1/SIMULATION/NR_PHY/pbchsim.c +++ b/openair1/SIMULATION/NR_PHY/pbchsim.c @@ -430,13 +430,14 @@ int main(int argc, char **argv) printf("Initializing gNodeB for mu %d, N_RB_DL %d\n",mu,N_RB_DL); - RC.gNB = (PHY_VARS_gNB**) malloc(sizeof(PHY_VARS_gNB *)); + RC.gNB = (PHY_VARS_gNB**) calloc(sizeof(PHY_VARS_gNB *),1); RC.gNB[0] = malloc(sizeof(PHY_VARS_gNB)); gNB = RC.gNB[0]; gNB->ofdm_offset_divisor = UINT_MAX; frame_parms = &gNB->frame_parms; //to be initialized I suppose (maybe not necessary for PBCH) frame_parms->nb_antennas_tx = n_tx; frame_parms->nb_antennas_rx = n_rx; + frame_parms->nb_antenna_ports_gNB=n_rx; frame_parms->N_RB_DL = N_RB_DL; frame_parms->Nid_cell = Nid_cell; frame_parms->nushift = Nid_cell%4; @@ -522,23 +523,17 @@ int main(int argc, char **argv) s_im = malloc(2*sizeof(double*)); r_re = malloc(2*sizeof(double*)); r_im = malloc(2*sizeof(double*)); - txdata = malloc(2*sizeof(int*)); + txdata = calloc(2,sizeof(int*)); for (i=0; i<2; i++) { - s_re[i] = malloc(frame_length_complex_samples*sizeof(double)); - bzero(s_re[i],frame_length_complex_samples*sizeof(double)); - s_im[i] = malloc(frame_length_complex_samples*sizeof(double)); - bzero(s_im[i],frame_length_complex_samples*sizeof(double)); - - r_re[i] = malloc(frame_length_complex_samples*sizeof(double)); - bzero(r_re[i],frame_length_complex_samples*sizeof(double)); - r_im[i] = malloc(frame_length_complex_samples*sizeof(double)); - bzero(r_im[i],frame_length_complex_samples*sizeof(double)); + s_re[i] = calloc(frame_length_complex_samples, sizeof(double)); + s_im[i] = calloc(frame_length_complex_samples, sizeof(double)); + r_re[i] = calloc(frame_length_complex_samples, sizeof(double)); + r_im[i] = calloc(frame_length_complex_samples, sizeof(double)); printf("Allocating %d samples for txdata\n",frame_length_complex_samples); - txdata[i] = malloc(frame_length_complex_samples*sizeof(int)); - bzero(r_re[i],frame_length_complex_samples*sizeof(int)); + txdata[i] = calloc(frame_length_complex_samples, sizeof(int)); } if (pbch_file_fd!=NULL) { @@ -547,8 +542,8 @@ int main(int argc, char **argv) //configure UE - UE = malloc(sizeof(PHY_VARS_NR_UE)); - memcpy(&UE->frame_parms,frame_parms,sizeof(NR_DL_FRAME_PARMS)); + UE = calloc(1,sizeof(*UE)); + memcpy(&UE->frame_parms,frame_parms,sizeof(*frame_parms)); //phy_init_nr_top(UE); //called from init_nr_ue_signal if (run_initial_sync==1) UE->is_synchronized = 0; else UE->is_synchronized = 1; @@ -721,8 +716,8 @@ int main(int argc, char **argv) UE->rx_offset=0; uint8_t ssb_index = 0; const int estimateSz=7*2*sizeof(int)*frame_parms->ofdm_symbol_size; - struct complex16 dl_ch_estimates[frame_parms->nb_antennas_rx][estimateSz]; - struct complex16 dl_ch_estimates_time[frame_parms->nb_antennas_rx][estimateSz]; + __attribute__ ((aligned(32))) struct complex16 dl_ch_estimates[frame_parms->nb_antennas_rx][estimateSz]; + __attribute__ ((aligned(32))) struct complex16 dl_ch_estimates_time[frame_parms->nb_antennas_rx][estimateSz]; while (!((SSB_positions >> ssb_index) & 0x01)) ssb_index++; // to select the first transmitted ssb UE->symbol_offset = nr_get_ssb_start_symbol(frame_parms,ssb_index); diff --git a/openair2/UTIL/LISTS/list.c b/openair2/UTIL/LISTS/list.c index 65f70c0786..578833edba 100644 --- a/openair2/UTIL/LISTS/list.c +++ b/openair2/UTIL/LISTS/list.c @@ -43,7 +43,7 @@ list_init (list_t * listP, char *nameP) { //----------------------------------------------------------------------------- if (nameP) { - strncpy( listP->name, nameP, LIST_NAME_MAX_CHAR ); + strncpy( listP->name, nameP, LIST_NAME_MAX_CHAR-1 ); listP->name[LIST_NAME_MAX_CHAR-1] = 0; // terminate string } diff --git a/openair2/UTIL/LISTS/list2.c b/openair2/UTIL/LISTS/list2.c index 3f0a59df53..d9aa1b6a90 100644 --- a/openair2/UTIL/LISTS/list2.c +++ b/openair2/UTIL/LISTS/list2.c @@ -53,7 +53,7 @@ list2_init (list2_t * listP, char *nameP) { //----------------------------------------------------------------------------- if (nameP) { - strncpy( listP->name, nameP, LIST_NAME_MAX_CHAR ); + strncpy( listP->name, nameP, LIST_NAME_MAX_CHAR-1 ); listP->name[LIST_NAME_MAX_CHAR-1] = 0; // terminate string } From 2ea133ffa47b699153bf6092a3a53106ea3842df Mon Sep 17 00:00:00 2001 From: Laurent THOMAS Date: Mon, 24 Jan 2022 14:19:31 +0100 Subject: [PATCH 35/96] ue sync, assert in wrong PUCCH decoded values --- openair1/SCHED/phy_procedures_lte_eNb.c | 130 ++++++++++++++---------- targets/RT/USER/lte-ue.c | 12 ++- 2 files changed, 88 insertions(+), 54 deletions(-) diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index 569d2a464a..3d655bc464 100644 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -1939,6 +1939,8 @@ void fill_ulsch_harq_indication (PHY_VARS_eNB *eNB, LTE_UL_eNB_HARQ_t *ulsch_har pthread_mutex_unlock(&eNB->UL_INFO_mutex); } +#define packetError(ConD, fmt, args...) if (!(ConD)) { LOG_E(PHY, fmt, args); discard=true; } + void fill_uci_harq_indication (int UEid, PHY_VARS_eNB *eNB, LTE_eNB_UCI *uci, int frame, int subframe, uint8_t *harq_ack, uint8_t tdd_mapping_mode, uint16_t tdd_multiplexing_mask) { if ( split73 == SPLIT73_DU ) { sendFs6Ulharq(fs6ULindicationHarq, UEid, eNB, uci, frame, subframe, harq_ack, tdd_mapping_mode, tdd_multiplexing_mask, 0, 0); @@ -1954,6 +1956,7 @@ void fill_uci_harq_indication (int UEid, PHY_VARS_eNB *eNB, LTE_eNB_UCI *uci, in } pthread_mutex_lock(&eNB->UL_INFO_mutex); + bool discard=false; nfapi_harq_indication_t *ind = &eNB->UL_INFO.harq_ind; nfapi_harq_indication_body_t *body = &ind->harq_indication_body; assert(eNB->UL_INFO.harq_ind.harq_indication_body.number_of_harqs <= NFAPI_HARQ_IND_MAX_PDU); @@ -1986,73 +1989,87 @@ void fill_uci_harq_indication (int UEid, PHY_VARS_eNB *eNB, LTE_eNB_UCI *uci, in pdu->harq_indication_fdd_rel13.tl.tag = NFAPI_HARQ_INDICATION_FDD_REL13_TAG; pdu->harq_indication_fdd_rel13.mode = 0; pdu->harq_indication_fdd_rel13.number_of_ack_nack = 1; - AssertFatal (harq_ack[0] == 1 || harq_ack[0] == 2 || harq_ack[0] == 4, "harq_ack[0] is %d, should be 1,2 or 4\n", harq_ack[0]); - pdu->harq_indication_fdd_rel13.harq_tb_n[0] = harq_ack[0]; - // release DLSCH if needed - release_harq(eNB,DLSCH_id,0,frame,subframe,0xffff, harq_ack[0] == 1); + packetError (harq_ack[0] == 1 || harq_ack[0] == 2 || harq_ack[0] == 4, "harq_ack[0] is %d, should be 1,2 or 4\n", harq_ack[0]); + if (!discard) { + pdu->harq_indication_fdd_rel13.harq_tb_n[0] = harq_ack[0]; + // release DLSCH if needed + release_harq(eNB,DLSCH_id,0,frame,subframe,0xffff, harq_ack[0] == 1); + } } else if (uci->pucch_fmt == pucch_format1b) { pdu->harq_indication_fdd_rel13.tl.tag = NFAPI_HARQ_INDICATION_FDD_REL13_TAG; pdu->harq_indication_fdd_rel13.mode = 0; pdu->harq_indication_fdd_rel13.number_of_ack_nack = 2; - AssertFatal (harq_ack[0] == 1 || harq_ack[0] == 2 || harq_ack[1] == 4, "harq_ack[0] is %d, should be 0,1 or 4\n", harq_ack[0]); - AssertFatal (harq_ack[1] == 1 || harq_ack[1] == 2 || harq_ack[1] == 4, "harq_ack[1] is %d, should be 0,1 or 4\n", harq_ack[1]); - pdu->harq_indication_fdd_rel13.harq_tb_n[0] = harq_ack[0]; - pdu->harq_indication_fdd_rel13.harq_tb_n[1] = harq_ack[1]; - // release DLSCH if needed - release_harq(eNB,DLSCH_id,0,frame,subframe,0xffff, harq_ack[0] == 1); - release_harq(eNB,DLSCH_id,1,frame,subframe,0xffff, harq_ack[1] == 1); - } else AssertFatal(1==0,"only format 1a/b for now, received %d\n",uci->pucch_fmt); + packetError (harq_ack[0] == 1 || harq_ack[0] == 2 || harq_ack[1] == 4, "harq_ack[0] is %d, should be 0,1 or 4\n", harq_ack[0]); + packetError (harq_ack[1] == 1 || harq_ack[1] == 2 || harq_ack[1] == 4, "harq_ack[1] is %d, should be 0,1 or 4\n", harq_ack[1]); + if (!discard) { + pdu->harq_indication_fdd_rel13.harq_tb_n[0] = harq_ack[0]; + pdu->harq_indication_fdd_rel13.harq_tb_n[1] = harq_ack[1]; + // release DLSCH if needed + release_harq(eNB,DLSCH_id,0,frame,subframe,0xffff, harq_ack[0] == 1); + release_harq(eNB,DLSCH_id,1,frame,subframe,0xffff, harq_ack[1] == 1); + } + } else + packetError(1==0,"only format 1a/b for now, received %d\n",uci->pucch_fmt); } else { // TDD - AssertFatal (tdd_mapping_mode == 0 || tdd_mapping_mode == 1 || tdd_mapping_mode == 2, "Illegal tdd_mapping_mode %d\n", tdd_mapping_mode); - pdu->harq_indication_tdd_rel13.tl.tag = NFAPI_HARQ_INDICATION_TDD_REL13_TAG; - pdu->harq_indication_tdd_rel13.mode = tdd_mapping_mode; - LOG_D(PHY,"%s(eNB, uci_harq format %d, rnti:%04x, frame:%d, subframe:%d, tdd_mapping_mode:%d) harq_ack[0]:%d harq_ack[1]:%d\n", __FUNCTION__, uci->pucch_fmt,uci->rnti, frame, subframe, - tdd_mapping_mode,harq_ack[0],harq_ack[1]); + packetError (tdd_mapping_mode == 0 || tdd_mapping_mode == 1 || tdd_mapping_mode == 2, "Illegal tdd_mapping_mode %d\n", tdd_mapping_mode); + if (!discard) { + pdu->harq_indication_tdd_rel13.tl.tag = NFAPI_HARQ_INDICATION_TDD_REL13_TAG; + pdu->harq_indication_tdd_rel13.mode = tdd_mapping_mode; + LOG_D(PHY,"%s(eNB, uci_harq format %d, rnti:%04x, frame:%d, subframe:%d, tdd_mapping_mode:%d) harq_ack[0]:%d harq_ack[1]:%d\n", __FUNCTION__, uci->pucch_fmt,uci->rnti, frame, subframe, + tdd_mapping_mode,harq_ack[0],harq_ack[1]); - switch (tdd_mapping_mode) { + switch (tdd_mapping_mode) { case 0: // bundling if (uci->pucch_fmt == pucch_format1a) { pdu->harq_indication_tdd_rel13.tl.tag = NFAPI_HARQ_INDICATION_TDD_REL13_TAG; pdu->harq_indication_tdd_rel13.number_of_ack_nack = 1; LOG_D(PHY,"bundling, pucch1a, number of ack nack %d\n",pdu->harq_indication_tdd_rel13.number_of_ack_nack); - AssertFatal(harq_ack[0] == 1 || harq_ack[0] == 2 || harq_ack[0] == 4, "harq_ack[0] is %d, should be 1,2 or 4\n",harq_ack[0]); - pdu->harq_indication_tdd_rel13.harq_data[0].bundling.value_0 = harq_ack[0]; - // release all bundled DLSCH if needed - release_harq(eNB,DLSCH_id,0,frame,subframe,0xffff, harq_ack[0] == 1); + packetError(harq_ack[0] == 1 || harq_ack[0] == 2 || harq_ack[0] == 4, "harq_ack[0] is %d, should be 1,2 or 4\n",harq_ack[0]); + if (!discard) { + pdu->harq_indication_tdd_rel13.harq_data[0].bundling.value_0 = harq_ack[0]; + // release all bundled DLSCH if needed + release_harq(eNB,DLSCH_id,0,frame,subframe,0xffff, harq_ack[0] == 1); + } } else if (uci->pucch_fmt == pucch_format1b) { pdu->harq_indication_tdd_rel13.number_of_ack_nack = 2; - AssertFatal(harq_ack[0] == 1 || harq_ack[0] == 2 || harq_ack[1] == 4, "harq_ack[0] is %d, should be 0,1 or 4\n",harq_ack[0]); - AssertFatal(harq_ack[1] == 1 || harq_ack[1] == 2 || harq_ack[1] == 4, "harq_ack[1] is %d, should be 0,1 or 4\n",harq_ack[1]); - pdu->harq_indication_tdd_rel13.tl.tag = NFAPI_HARQ_INDICATION_TDD_REL13_TAG; - pdu->harq_indication_tdd_rel13.harq_data[0].bundling.value_0 = harq_ack[0]; - pdu->harq_indication_tdd_rel13.harq_data[1].bundling.value_0 = harq_ack[1]; - // release all DLSCH if needed - release_harq(eNB,DLSCH_id,0,frame,subframe,0xffff, harq_ack[0] == 1); - release_harq(eNB,DLSCH_id,1,frame,subframe,0xffff, harq_ack[1] == 1); + packetError(harq_ack[0] == 1 || harq_ack[0] == 2 || harq_ack[1] == 4, "harq_ack[0] is %d, should be 0,1 or 4\n",harq_ack[0]); + packetError(harq_ack[1] == 1 || harq_ack[1] == 2 || harq_ack[1] == 4, "harq_ack[1] is %d, should be 0,1 or 4\n",harq_ack[1]); + if (!discard) { + pdu->harq_indication_tdd_rel13.tl.tag = NFAPI_HARQ_INDICATION_TDD_REL13_TAG; + pdu->harq_indication_tdd_rel13.harq_data[0].bundling.value_0 = harq_ack[0]; + pdu->harq_indication_tdd_rel13.harq_data[1].bundling.value_0 = harq_ack[1]; + // release all DLSCH if needed + release_harq(eNB,DLSCH_id,0,frame,subframe,0xffff, harq_ack[0] == 1); + release_harq(eNB,DLSCH_id,1,frame,subframe,0xffff, harq_ack[1] == 1); + } } break; case 1: // multiplexing - AssertFatal (uci->pucch_fmt == pucch_format1b, "uci->pucch_format %d is not format1b\n", uci->pucch_fmt); - - if (uci->num_pucch_resources == 1 && uci->pucch_fmt == pucch_format1a) { - pdu->harq_indication_tdd_rel13.tl.tag = NFAPI_HARQ_INDICATION_TDD_REL13_TAG; - pdu->harq_indication_tdd_rel13.number_of_ack_nack = 1; - AssertFatal(harq_ack[0] == 1 || harq_ack[0] == 2 || harq_ack[0] == 4, "harq_ack[0] is %d, should be 1,2 or 4\n",harq_ack[0]); - pdu->harq_indication_tdd_rel13.harq_data[0].multiplex.value_0 = harq_ack[0]; - // release all DLSCH if needed - release_harq(eNB,DLSCH_id,0,frame,subframe,0xffff, harq_ack[0] == 1); + packetError (uci->pucch_fmt == pucch_format1b, "uci->pucch_format %d is not format1b\n", uci->pucch_fmt); + if (!discard) { + if (uci->num_pucch_resources == 1 && uci->pucch_fmt == pucch_format1a) { + pdu->harq_indication_tdd_rel13.tl.tag = NFAPI_HARQ_INDICATION_TDD_REL13_TAG; + pdu->harq_indication_tdd_rel13.number_of_ack_nack = 1; + packetError(harq_ack[0] == 1 || harq_ack[0] == 2 || harq_ack[0] == 4, "harq_ack[0] is %d, should be 1,2 or 4\n",harq_ack[0]); + if (!discard) { + pdu->harq_indication_tdd_rel13.harq_data[0].multiplex.value_0 = harq_ack[0]; + // release all DLSCH if needed + release_harq(eNB,DLSCH_id,0,frame,subframe,0xffff, harq_ack[0] == 1); + } } else if (uci->num_pucch_resources == 1 && uci->pucch_fmt == pucch_format1b) { - pdu->harq_indication_tdd_rel13.tl.tag = NFAPI_HARQ_INDICATION_TDD_REL13_TAG; - pdu->harq_indication_tdd_rel13.number_of_ack_nack = 2; - AssertFatal(harq_ack[0] == 1 || harq_ack[0] == 2 || harq_ack[1] == 4, "harq_ack[0] is %d, should be 0,1 or 4\n",harq_ack[0]); - AssertFatal(harq_ack[1] == 1 || harq_ack[1] == 2 || harq_ack[1] == 4, "harq_ack[1] is %d, should be 0,1 or 4\n",harq_ack[1]); - pdu->harq_indication_tdd_rel13.harq_data[0].multiplex.value_0 = harq_ack[0]; - pdu->harq_indication_tdd_rel13.harq_data[1].multiplex.value_0 = harq_ack[1]; - // release all DLSCH if needed - release_harq(eNB,DLSCH_id,0,frame,subframe,0xffff, harq_ack[0] == 1); - release_harq(eNB,DLSCH_id,1,frame,subframe,0xffff, harq_ack[1] == 1); + pdu->harq_indication_tdd_rel13.tl.tag = NFAPI_HARQ_INDICATION_TDD_REL13_TAG; + pdu->harq_indication_tdd_rel13.number_of_ack_nack = 2; + packetError(harq_ack[0] == 1 || harq_ack[0] == 2 || harq_ack[1] == 4, "harq_ack[0] is %d, should be 0,1 or 4\n",harq_ack[0]); + packetError(harq_ack[1] == 1 || harq_ack[1] == 2 || harq_ack[1] == 4, "harq_ack[1] is %d, should be 0,1 or 4\n",harq_ack[1]); + if (!discard) { + pdu->harq_indication_tdd_rel13.harq_data[0].multiplex.value_0 = harq_ack[0]; + pdu->harq_indication_tdd_rel13.harq_data[1].multiplex.value_0 = harq_ack[1]; + // release all DLSCH if needed + release_harq(eNB,DLSCH_id,0,frame,subframe,0xffff, harq_ack[0] == 1); + release_harq(eNB,DLSCH_id,1,frame,subframe,0xffff, harq_ack[1] == 1); + } } else { // num_pucch_resources (M) > 1 pdu->harq_indication_tdd_rel13.tl.tag = NFAPI_HARQ_INDICATION_TDD_REL13_TAG; pdu->harq_indication_tdd_rel13.number_of_ack_nack = uci->num_pucch_resources; @@ -2068,7 +2085,7 @@ void fill_uci_harq_indication (int UEid, PHY_VARS_eNB *eNB, LTE_eNB_UCI *uci, in release_harq(eNB,DLSCH_id,1,frame,subframe,tdd_multiplexing_mask, 1 /* force release? previous code was unconditional */); } - break; + break; case 2: // special bundling (SR collision) pdu->harq_indication_tdd_rel13.tl.tag = NFAPI_HARQ_INDICATION_TDD_REL13_TAG; @@ -2118,16 +2135,23 @@ void fill_uci_harq_indication (int UEid, PHY_VARS_eNB *eNB, LTE_eNB_UCI *uci, in } else { pdu->harq_indication_tdd_rel13.harq_data[0].bundling.value_0 = 0; } - + break; } break; + } + } } } //TDD - - eNB->UL_INFO.harq_ind.harq_indication_body.number_of_harqs++; - LOG_D(PHY,"Incremented eNB->UL_INFO.harq_ind.harq_indication_body.number_of_harqs:%d\n", eNB->UL_INFO.harq_ind.harq_indication_body.number_of_harqs); + + if (!discard) { + eNB->UL_INFO.harq_ind.harq_indication_body.number_of_harqs++; + LOG_D(PHY,"Incremented eNB->UL_INFO.harq_ind.harq_indication_body.number_of_harqs:%d\n", eNB->UL_INFO.harq_ind.harq_indication_body.number_of_harqs); + } else { + LOG_W(PHY,"discarded a PUCCH because the decoded values are impossible\n"); + } + pthread_mutex_unlock(&eNB->UL_INFO_mutex); } diff --git a/targets/RT/USER/lte-ue.c b/targets/RT/USER/lte-ue.c index 1643ca36ca..a48bef64b6 100644 --- a/targets/RT/USER/lte-ue.c +++ b/targets/RT/USER/lte-ue.c @@ -2023,8 +2023,18 @@ void *UE_thread(void *arg) if (is_synchronized == 0) { if (instance_cnt_synch < 0) { // we can invoke the synch - // grab 10 ms of signal and wakeup synch thread + // we shift in time flow because the UE doesn't detect sync when frame alignment is not easy + for (int i=0; iframe_parms.nb_antennas_rx; i++) + rxp[i] = (void *)&dummy_rx[i][0]; + UE->rfdevice.trx_read_func(&UE->rfdevice, + ×tamp, + rxp, + UE->frame_parms.samples_per_tti/2, + UE->frame_parms.nb_antennas_rx); + + // grab 10 ms of signal and wakeup synch thread + if (UE->mode != loop_through_memory) { if (IS_SOFTMODEM_RFSIM ) { for(int sf=0; sf<10; sf++) { From d8dccbad598c42863f605a86648358a45522364f Mon Sep 17 00:00:00 2001 From: hardy Date: Wed, 16 Feb 2022 17:14:01 +0100 Subject: [PATCH 36/96] update of sa tests requirements aligned with 256qam --- ci-scripts/xml_files/fr1_sa_quectel_162prb.xml | 4 ++-- ci-scripts/xml_files/fr1_sa_quectel_stages.xml | 13 ++++++++++++- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/ci-scripts/xml_files/fr1_sa_quectel_162prb.xml b/ci-scripts/xml_files/fr1_sa_quectel_162prb.xml index 23cc6d25b8..f756083ea6 100644 --- a/ci-scripts/xml_files/fr1_sa_quectel_162prb.xml +++ b/ci-scripts/xml_files/fr1_sa_quectel_162prb.xml @@ -96,8 +96,8 @@ Iperf - iperf (DL/140Mbps/UDP)(60 sec)(single-ue profile) - -u -b 140M -t 60 + iperf (DL/200Mbps/UDP)(60 sec)(single-ue profile) + -u -b 200M -t 60 DL nrmodule2_quectel 50 diff --git a/ci-scripts/xml_files/fr1_sa_quectel_stages.xml b/ci-scripts/xml_files/fr1_sa_quectel_stages.xml index 3e497ede13..0ab8bf6b08 100644 --- a/ci-scripts/xml_files/fr1_sa_quectel_stages.xml +++ b/ci-scripts/xml_files/fr1_sa_quectel_stages.xml @@ -42,6 +42,8 @@ 000001 071004 000001 + 071005 + 000001 011002 081000 @@ -148,7 +150,16 @@ 90 single-ue - + + Iperf + iperf (DL/130Mbps/UDP)(30 sec)(single-ue profile) + -u -b 130M -t 30 + DL + nrmodule2_quectel + 50 + 50 + single-ue + From bcbafdf094e5140740c45a9c80288018ec88569d Mon Sep 17 00:00:00 2001 From: francescomani Date: Thu, 17 Feb 2022 10:31:16 +0100 Subject: [PATCH 37/96] fix for ulprbbl memcpy --- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c index 544f62a599..e9490c9fb2 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c @@ -319,7 +319,7 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP, const int num_slots = nr_slots_per_frame[*scc->ssbSubcarrierSpacing]; const int last_slot = (slot + num_slots - 1) % num_slots; uint16_t *vrb_map_UL = cc[CC_id].vrb_map_UL; - memcpy(&vrb_map_UL[last_slot * MAX_BWP_SIZE], &RC.nrmac[module_idP]->ulprbbl, MAX_BWP_SIZE); + memcpy(&vrb_map_UL[last_slot * MAX_BWP_SIZE], &RC.nrmac[module_idP]->ulprbbl, sizeof(uint16_t) * MAX_BWP_SIZE); clear_nr_nfapi_information(RC.nrmac[module_idP], CC_id, frame, slot); From ba27a018279cbed58bf53d169b94ad929038c687 Mon Sep 17 00:00:00 2001 From: francescomani Date: Thu, 17 Feb 2022 10:43:37 +0100 Subject: [PATCH 38/96] fix dlschsim --- openair1/SIMULATION/NR_PHY/dlschsim.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/openair1/SIMULATION/NR_PHY/dlschsim.c b/openair1/SIMULATION/NR_PHY/dlschsim.c index 0c26989c29..b6769f6152 100644 --- a/openair1/SIMULATION/NR_PHY/dlschsim.c +++ b/openair1/SIMULATION/NR_PHY/dlschsim.c @@ -419,8 +419,9 @@ int main(int argc, char **argv) //nr_init_frame_parms_ue(&UE->frame_parms); //init_nr_ue_transport(UE, 0); + int num_codeword = NR_MAX_NB_LAYERS > 4? 2:1; for (int sf = 0; sf < 2; sf++) { - for (i = 0; i < 2; i++) { + for (i = 0; i < num_codeword; i++) { UE->dlsch[sf][0][i] = new_nr_ue_dlsch(Kmimo, 8, Nsoft, 5, N_RB_DL, 0); From 9f02206b8a1357ceef7292b131e168a0041af2f6 Mon Sep 17 00:00:00 2001 From: francescomani Date: Thu, 17 Feb 2022 17:43:24 +0100 Subject: [PATCH 39/96] error message if no uecap in fill_default_secondaryCellGroup --- openair2/RRC/NR/rrc_gNB_reconfig.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/openair2/RRC/NR/rrc_gNB_reconfig.c b/openair2/RRC/NR/rrc_gNB_reconfig.c index 9b051933a1..b8d2f036bd 100644 --- a/openair2/RRC/NR/rrc_gNB_reconfig.c +++ b/openair2/RRC/NR/rrc_gNB_reconfig.c @@ -65,6 +65,9 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco AssertFatal(servingcellconfigcommon!=NULL,"servingcellconfigcommon is null\n"); AssertFatal(secondaryCellGroup!=NULL,"secondaryCellGroup is null\n"); + if(uecap == NULL) + LOG_E(RRC,"No UE Capabilities available when programming default CellGroup in NSA\n"); + // This assert will never happen in the current implementation because NUMBER_OF_UE_MAX = 4. // However, if in the future NUMBER_OF_UE_MAX is increased, it will be necessary to improve the allocation of SRS resources, // where the startPosition = 2 or 3 and sl160 = 17, 17, 27 ... 157 only give us 30 different allocations. From 53001d0d100a40c9f2f60f3d39c681492aa44923 Mon Sep 17 00:00:00 2001 From: Laurent THOMAS Date: Tue, 15 Feb 2022 13:13:15 +0100 Subject: [PATCH 40/96] remove-NR_UE_PBCH scope to finish --- openair1/PHY/INIT/nr_init_ue.c | 19 -- .../PHY/NR_UE_ESTIMATION/nr_adjust_synch_ue.c | 5 +- .../nr_dl_channel_estimation.c | 120 ++++++------ openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h | 7 +- .../PHY/NR_UE_TRANSPORT/nr_initial_sync.c | 13 +- openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c | 185 +++++++++--------- .../NR_UE_TRANSPORT/nr_transport_proto_ue.h | 5 +- openair1/PHY/TOOLS/nr_phy_scope.c | 82 +++++--- openair1/PHY/TOOLS/phy_scope_interface.h | 12 +- openair1/PHY/defs_UE.h | 1 + openair1/PHY/defs_nr_UE.h | 38 +--- openair1/SCHED_NR_UE/defs.h | 8 +- openair1/SCHED_NR_UE/phy_procedures_nr_ue.c | 36 ++-- .../SIMULATION/NR_PHY/nr_dummy_functions.c | 4 +- openair1/SIMULATION/NR_PHY/pbchsim.c | 18 +- 15 files changed, 288 insertions(+), 265 deletions(-) diff --git a/openair1/PHY/INIT/nr_init_ue.c b/openair1/PHY/INIT/nr_init_ue.c index b571afe416..9266a1fecd 100644 --- a/openair1/PHY/INIT/nr_init_ue.c +++ b/openair1/PHY/INIT/nr_init_ue.c @@ -416,29 +416,10 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, } // PBCH - pbch_vars[gNB_id]->rxdataF_ext = (int32_t **)malloc16( fp->nb_antennas_rx*sizeof(int32_t *) ); - pbch_vars[gNB_id]->rxdataF_comp = (int32_t **)malloc16_clear( 4*fp->nb_antennas_rx*sizeof(int32_t *) ); - pbch_vars[gNB_id]->dl_ch_estimates = (int32_t **)malloc16_clear( 4*fp->nb_antennas_rx*sizeof(int32_t *) ); - pbch_vars[gNB_id]->dl_ch_estimates_ext = (int32_t **)malloc16_clear( 4*fp->nb_antennas_rx*sizeof(int32_t *) ); - pbch_vars[gNB_id]->dl_ch_estimates_time = (int32_t **)malloc16_clear( 4*fp->nb_antennas_rx*sizeof(int32_t *) ); - pbch_vars[gNB_id]->llr = (int16_t *)malloc16_clear( 1920 ); // prach_vars[gNB_id]->prachF = (int16_t *)malloc16_clear( sizeof(int)*(7*2*sizeof(int)*(fp->ofdm_symbol_size*12)) ); prach_vars[gNB_id]->prach = (int16_t *)malloc16_clear( sizeof(int)*(7*2*sizeof(int)*(fp->ofdm_symbol_size*12)) ); - for (i=0; inb_antennas_rx; i++) { - pbch_vars[gNB_id]->rxdataF_ext[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*20*12*4 ); - - for (j=0; j<4; j++) {//fp->nb_antennas_tx;j++) { - int idx = (j*fp->nb_antennas_rx)+i; - pbch_vars[gNB_id]->rxdataF_comp[idx] = (int32_t *)malloc16_clear( sizeof(int32_t)*20*12*4 ); - pbch_vars[gNB_id]->dl_ch_estimates[idx] = (int32_t *)malloc16_clear( sizeof(int32_t)*7*2*sizeof(int)*(fp->ofdm_symbol_size) ); - pbch_vars[gNB_id]->dl_ch_estimates_time[idx]= (int32_t *)malloc16_clear( sizeof(int32_t)*7*2*sizeof(int)*(fp->ofdm_symbol_size) ); - pbch_vars[gNB_id]->dl_ch_estimates_ext[idx] = (int32_t *)malloc16_clear( sizeof(int32_t)*20*12*4 ); - } - } } - - pbch_vars[gNB_id]->decoded_output = (uint8_t *)malloc16_clear(64); } // initialization for the last instance of pdsch_vars (used for MU-MIMO) diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_adjust_synch_ue.c b/openair1/PHY/NR_UE_ESTIMATION/nr_adjust_synch_ue.c index 19d4bf5079..89d67408e1 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_adjust_synch_ue.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_adjust_synch_ue.c @@ -36,6 +36,7 @@ void nr_adjust_synch_ue(NR_DL_FRAME_PARMS *frame_parms, PHY_VARS_NR_UE *ue, module_id_t gNB_id, + const int estimateSz, struct complex16 dl_ch_estimates_time[][estimateSz], uint8_t frame, uint8_t subframe, unsigned char clear, @@ -60,8 +61,8 @@ void nr_adjust_synch_ue(NR_DL_FRAME_PARMS *frame_parms, int j = (i < 0) ? (i + frame_parms->ofdm_symbol_size) : i; for (int aa = 0; aa < frame_parms->nb_antennas_rx; aa++) { - int Re = ((int16_t*)ue->pbch_vars[gNB_id]->dl_ch_estimates_time[aa])[(j<<1)]; - int Im = ((int16_t*)ue->pbch_vars[gNB_id]->dl_ch_estimates_time[aa])[1+(j<<1)]; + int Re = dl_ch_estimates_time[aa][j].r; + int Im = dl_ch_estimates_time[aa][j].i; temp += (Re*Re/2) + (Im*Im/2); } diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c index 30eae2d30f..8efe85b222 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -29,6 +29,7 @@ #include "PHY/NR_REFSIG/ptrs_nr.h" #include "PHY/NR_TRANSPORT/nr_sch_dmrs.h" #include "filt16a_32.h" +#include //#define DEBUG_PDSCH //#define DEBUG_PDCCH @@ -43,7 +44,6 @@ int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue, NR_UE_SSB *current_ssb) { int pilot[200] __attribute__((aligned(16))); - unsigned char aarx; unsigned short k; unsigned int pilot_cnt; int16_t ch[2],*pil,*rxF; @@ -77,7 +77,7 @@ int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue, // generate pilot nr_pbch_dmrs_rx(dmrss,ue->nr_gold_pbch[n_hf][ssb_index], &pilot[0]); - for (aarx=0; aarxframe_parms.nb_antennas_rx; aarx++) { + for (int aarx=0; aarxframe_parms.nb_antennas_rx; aarx++) { int re_offset = ssb_offset; pil = (int16_t *)&pilot[0]; @@ -197,6 +197,9 @@ int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue, int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue, + int estimateSz, + struct complex16 dl_ch_estimates [][estimateSz], + struct complex16 dl_ch_estimates_time [][estimateSz], UE_nr_rxtx_proc_t *proc, uint8_t gNB_id, unsigned char Ns, @@ -206,16 +209,14 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue, uint8_t n_hf) { int pilot[200] __attribute__((aligned(16))); - unsigned char aarx,p; unsigned short k; unsigned int pilot_cnt; - int16_t ch[2],*pil,*rxF,*dl_ch,*fl,*fm,*fr; + int16_t *pil,*rxF,*dl_ch,*fl,*fm,*fr; int ch_offset,symbol_offset; //int slot_pbch; uint8_t nushift; - int **dl_ch_estimates =ue->pbch_vars[gNB_id]->dl_ch_estimates; - int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[proc->thread_id].rxdataF; + int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[proc->thread_id].rxdataF; nushift = ue->frame_parms.Nid_cell%4; ue->frame_parms.nushift = nushift; @@ -269,17 +270,57 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue, break; } + idft_size_idx_t idftsizeidx; + + switch (ue->frame_parms.ofdm_symbol_size) { + case 128: + idftsizeidx = IDFT_128; + break; + + case 256: + idftsizeidx = IDFT_256; + break; + + case 512: + idftsizeidx = IDFT_512; + break; + + case 1024: + idftsizeidx = IDFT_1024; + break; + + case 1536: + idftsizeidx = IDFT_1536; + break; + + case 2048: + idftsizeidx = IDFT_2048; + break; + + case 3072: + idftsizeidx = IDFT_3072; + break; + + case 4096: + idftsizeidx = IDFT_4096; + break; + + default: + printf("unsupported ofdm symbol size \n"); + assert(0); + } + // generate pilot nr_pbch_dmrs_rx(dmrss,ue->nr_gold_pbch[n_hf][ssb_index], &pilot[0]); - for (aarx=0; aarxframe_parms.nb_antennas_rx; aarx++) { + for (int aarx=0; aarxframe_parms.nb_antennas_rx; aarx++) { int re_offset = ssb_offset; pil = (int16_t *)&pilot[0]; rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)]; dl_ch = (int16_t *)&dl_ch_estimates[aarx][ch_offset]; - memset(dl_ch,0,4*(ue->frame_parms.ofdm_symbol_size)); + memset(dl_ch,0,sizeof(*dl_ch)*(ue->frame_parms.ofdm_symbol_size)); #ifdef DEBUG_CH printf("pbch ch est pilot addr %p RB_DL %d\n",&pilot[0], ue->frame_parms.N_RB_DL); @@ -289,6 +330,7 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue, #endif // Treat first 2 pilots specially (left edge) + int16_t ch[2]; ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); @@ -402,62 +444,18 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue, } - idft_size_idx_t idftsizeidx; - - switch (ue->frame_parms.ofdm_symbol_size) { - case 128: - idftsizeidx = IDFT_128; - break; - - case 256: - idftsizeidx = IDFT_256; - break; - - case 512: - idftsizeidx = IDFT_512; - break; - - case 1024: - idftsizeidx = IDFT_1024; - break; - - case 1536: - idftsizeidx = IDFT_1536; - break; - - case 2048: - idftsizeidx = IDFT_2048; - break; - - case 3072: - idftsizeidx = IDFT_3072; - break; - - case 4096: - idftsizeidx = IDFT_4096; - break; - - default: - printf("unsupported ofdm symbol size \n"); - assert(0); - } - if( dmrss == 2) // update time statistics for last PBCH symbol { // do ifft of channel estimate - for (aarx=0; aarxframe_parms.nb_antennas_rx; aarx++) - for (p=0; pframe_parms.nb_antenna_ports_gNB; p++) { - if (ue->pbch_vars[gNB_id]->dl_ch_estimates[(p*ue->frame_parms.nb_antennas_rx)+aarx]) - { - LOG_D(PHY,"Channel Impulse Computation Slot %d ThreadId %d Symbol %d ch_offset %d\n", Ns, proc->thread_id, symbol, ch_offset); - idft(idftsizeidx, - (int16_t*) &ue->pbch_vars[gNB_id]->dl_ch_estimates[(p*ue->frame_parms.nb_antennas_rx)+aarx][ch_offset], - (int16_t*) ue->pbch_vars[gNB_id]->dl_ch_estimates_time[(p*ue->frame_parms.nb_antennas_rx)+aarx],1); - } - } - } - - } + LOG_D(PHY,"Channel Impulse Computation Slot %d Symbol %d ch_offset %d\n", Ns, symbol, ch_offset); + idft(idftsizeidx, + (int16_t*) &dl_ch_estimates[aarx][ch_offset], + (int16_t*) dl_ch_estimates_time[aarx], + 1); +} +} + if (dmrss == 2) + scopeCopy(ue, pbchDlChEstimateTime, dl_ch_estimates_time, sizeof(struct complex16), idftsizeidx, ue->frame_parms.nb_antennas_rx); return(0); } diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h b/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h index c5330ce2f2..450631774e 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h @@ -56,7 +56,10 @@ int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue, NR_UE_SSB *current_ssb); int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue, - UE_nr_rxtx_proc_t *proc, + int estimateSz, + struct complex16 dl_ch_estimates [][estimateSz], + struct complex16 dl_ch_estimates_time [][estimateSz], + UE_nr_rxtx_proc_t *proc, uint8_t gNB_id, unsigned char Ns, unsigned char symbol, @@ -78,6 +81,8 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, void nr_adjust_synch_ue(NR_DL_FRAME_PARMS *frame_parms, PHY_VARS_NR_UE *ue, module_id_t gNB_id, + int estimateSz, + struct complex16 dl_ch_estimates_time [][estimateSz], uint8_t frame, uint8_t subframe, unsigned char clear, diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c b/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c index 8917a8bc1b..39dc183bc3 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c @@ -149,17 +149,22 @@ int nr_pbch_detection(UE_nr_rxtx_proc_t * proc, PHY_VARS_NR_UE *ue, int pbch_ini start_meas(&ue->dlsch_channel_estimation_stats); // computing channel estimation for selected best ssb + const int estimateSz=7*2*sizeof(int)*frame_parms->ofdm_symbol_size; + struct complex16 dl_ch_estimates[frame_parms->nb_antennas_rx][estimateSz]; + struct complex16 dl_ch_estimates_time[frame_parms->nb_antennas_rx][estimateSz]; for(int i=pbch_initial_symbol; ii_ssb,temp_ptr->n_hf); + nr_pbch_channel_estimation(ue,estimateSz, dl_ch_estimates, dl_ch_estimates_time, proc,0,0,i,i-pbch_initial_symbol,temp_ptr->i_ssb,temp_ptr->n_hf); stop_meas(&ue->dlsch_channel_estimation_stats); - + fapiPbch_t result; ret = nr_rx_pbch(ue, proc, - ue->pbch_vars[0], + estimateSz, dl_ch_estimates, + ue->pbch_vars[0], frame_parms, 0, temp_ptr->i_ssb, - SISO); + SISO, + &result); temp_ptr=temp_ptr->next_ssb; } diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c b/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c index dff347f7c0..2b5cc6c3d6 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c @@ -36,6 +36,7 @@ #include "PHY/LTE_REFSIG/lte_refsig.h" #include "PHY/INIT/phy_init.h" #include "openair1/SCHED_NR_UE/defs.h" +#include //#define DEBUG_PBCH //#define DEBUG_PBCH_ENCODING @@ -46,16 +47,16 @@ #define print_shorts(s,x) printf("%s : %d,%d,%d,%d,%d,%d,%d,%d\n",s,((int16_t*)x)[0],((int16_t*)x)[1],((int16_t*)x)[2],((int16_t*)x)[3],((int16_t*)x)[4],((int16_t*)x)[5],((int16_t*)x)[6],((int16_t*)x)[7]) -uint16_t nr_pbch_extract(int **rxdataF, - int **dl_ch_estimates, - int **rxdataF_ext, - int **dl_ch_estimates_ext, +static uint16_t nr_pbch_extract(int **rxdataF, + const int estimateSz, + struct complex16 dl_ch_estimates[][estimateSz], + struct complex16 rxdataF_ext[][20*12*4], + struct complex16 dl_ch_estimates_ext[][20*12*4], uint32_t symbol, uint32_t s_offset, NR_DL_FRAME_PARMS *frame_parms) { uint16_t rb; uint8_t i,j,aarx; - int32_t *dl_ch0,*dl_ch0_ext,*rxF,*rxF_ext; int nushiftmod4 = frame_parms->nushift; AssertFatal(symbol>=1 && symbol<5, @@ -66,8 +67,8 @@ uint16_t nr_pbch_extract(int **rxdataF, unsigned int rx_offset = frame_parms->first_carrier_offset + frame_parms->ssb_start_subcarrier; rx_offset = (rx_offset)%(frame_parms->ofdm_symbol_size); - rxF = &rxdataF[aarx][(symbol+s_offset)*frame_parms->ofdm_symbol_size]; - rxF_ext = &rxdataF_ext[aarx][symbol*20*12]; + struct complex16 *rxF = (struct complex16 *)&rxdataF[aarx][(symbol+s_offset)*frame_parms->ofdm_symbol_size]; + struct complex16 *rxF_ext = rxdataF_ext[aarx]; #ifdef DEBUG_PBCH printf("extract_rbs (nushift %d): rx_offset=%d, symbol %u\n",frame_parms->nushift, (rx_offset + ((symbol+s_offset)*(frame_parms->ofdm_symbol_size))),symbol); @@ -76,7 +77,6 @@ uint16_t nr_pbch_extract(int **rxdataF, for (int i =0; i<8; i++) { printf("rxF [%d]= %d\n",i,rxF[i]); printf("pbch extract rxF %d %d addr %p\n", p[2*i], p[2*i+1], &p[2*i]); - printf("rxF ext addr %p\n", &rxF_ext[i]); } #endif @@ -134,11 +134,10 @@ uint16_t nr_pbch_extract(int **rxdataF, } } } - - dl_ch0 = &dl_ch_estimates[aarx][((symbol+s_offset)*(frame_parms->ofdm_symbol_size))]; + struct complex16 *dl_ch0 = &dl_ch_estimates[aarx][((symbol+s_offset)*(frame_parms->ofdm_symbol_size))]; //printf("dl_ch0 addr %p\n",dl_ch0); - dl_ch0_ext = &dl_ch_estimates_ext[aarx][symbol*20*12]; + struct complex16 *dl_ch0_ext = &dl_ch_estimates_ext[aarx][symbol*20*12]; for (rb=0; rb<20; rb++) { j=0; @@ -199,7 +198,7 @@ uint16_t nr_pbch_extract(int **rxdataF, //__m128i avg128; //compute average channel_level on each (TX,RX) antenna pair -int nr_pbch_channel_level(int **dl_ch_estimates_ext, +int nr_pbch_channel_level(struct complex16 dl_ch_estimates_ext[][20*12*4], NR_DL_FRAME_PARMS *frame_parms, uint32_t symbol) { int16_t rb, nb_rb=20; @@ -258,13 +257,13 @@ int nr_pbch_channel_level(int **dl_ch_estimates_ext, return(avg2); } -void nr_pbch_channel_compensation(int **rxdataF_ext, - int **dl_ch_estimates_ext, - int **rxdataF_comp, - NR_DL_FRAME_PARMS *frame_parms, - uint32_t symbol, - uint8_t output_shift) { - const uint16_t nb_re=symbol == 2 ? 72 : 180; +static void nr_pbch_channel_compensation(struct complex16 rxdataF_ext[][20*12*4], + struct complex16 dl_ch_estimates_ext[][20*12*4], + int cols, + struct complex16 rxdataF_comp[][cols], + NR_DL_FRAME_PARMS *frame_parms, + uint32_t symbol, + uint8_t output_shift) { AssertFatal((symbol > 0 && symbol < 4), "symbol %d is illegal for PBCH DM-RS\n", symbol); @@ -273,15 +272,15 @@ void nr_pbch_channel_compensation(int **rxdataF_ext, for (int aarx=0; aarxnb_antennas_rx; aarx++) { vect128 *dl_ch128 = (vect128 *)&dl_ch_estimates_ext[aarx][symbol*20*12]; - vect128 *rxdataF128 = (vect128 *)&rxdataF_ext[aarx][symbol*20*12]; - vect128 *rxdataF_comp128 = (vect128 *)&rxdataF_comp[aarx][symbol*20*12]; + vect128 *rxdataF128 = (vect128 *)rxdataF_ext[aarx]; + vect128 *rxdataF_comp128 = (vect128 *)rxdataF_comp[aarx]; /* printf("ch compensation dl_ch ext addr %p \n", &dl_ch_estimates_ext[aarx][symbol*20*12]); - printf("rxdataf ext addr %p symbol %d\n", &rxdataF_ext[aarx][symbol*20*12], symbol); + printf("rxdataf ext addr %p symbol %d\n", rxdataF_ext[aarx], symbol); printf("rxdataf_comp addr %p\n",&rxdataF_comp[aarx][symbol*20*12]); */ - for (int re=0; rellr; reset = 1; // x1 is set in first call to lte_gold_generic x2 = Nid; //this is c_init @@ -361,10 +362,10 @@ static void nr_pbch_unscrambling(NR_UE_PBCH *pbch, reset = 0; } - (pbch->pbch_a_interleaved) ^= ((unscrambling_mask>>i)&1)? ((pbch->pbch_a_prime>>i)&1)<pbch_a_prime>>i)&1) ^ ((s>>((k+offset)&0x1f))&1))<>i)&1)); + *pbch_a_interleaved ^= ((unscrambling_mask>>i)&1)? ((pbch_a_prime>>i)&1)<>i)&1) ^ ((s>>((k+offset)&0x1f))&1))<>i)&1)); #ifdef DEBUG_PBCH_ENCODING - printf("i %d k %d offset %d (unscrambling_mask>>i)&1) %d s: %08x\t pbch_a_interleaved 0x%08x (!((unscrambling_mask>>i)&1)) %d\n", i, k, offset, (unscrambling_mask>>i)&1, s, pbch->pbch_a_interleaved, + printf("i %d k %d offset %d (unscrambling_mask>>i)&1) %d s: %08x\t pbch_a_interleaved 0x%08x (!((unscrambling_mask>>i)&1)) %d\n", i, k, offset, (unscrambling_mask>>i)&1, s, *pbch_a_interleaved, (!((unscrambling_mask>>i)&1))); #endif } else { @@ -386,7 +387,7 @@ static void nr_pbch_unscrambling(NR_UE_PBCH *pbch, } } -void nr_pbch_quantize(int16_t *pbch_llr8, +static void nr_pbch_quantize(int16_t *pbch_llr8, int16_t *pbch_llr, uint16_t len) { uint16_t i; @@ -410,11 +411,13 @@ uint8_t pbch_deinterleaving_pattern[32] = {28,0,31,30,7,29,25,27,5,8,24,9,10,11, int nr_rx_pbch( PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, + int estimateSz, struct complex16 dl_ch_estimates [][estimateSz], NR_UE_PBCH *nr_ue_pbch_vars, NR_DL_FRAME_PARMS *frame_parms, uint8_t gNB_id, uint8_t i_ssb, - MIMO_mode_t mimo_mode) { + MIMO_mode_t mimo_mode, + fapiPbch_t* result) { NR_UE_COMMON *nr_ue_common_vars = &ue->common_vars; int max_h=0; @@ -422,9 +425,6 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue, //uint8_t pbch_a[64]; //FT ?? cppcheck doesn't like pbch_a allocation because of line 525..and i don't get what this variable is for.. //uint8_t *pbch_a = malloc(sizeof(uint8_t) * NR_POLAR_PBCH_PAYLOAD_BITS); - //uint32_t pbch_a_prime; - int16_t *pbch_e_rx; - uint8_t *decoded_output = nr_ue_pbch_vars->decoded_output; uint8_t nushift; uint16_t M; uint8_t Lmax=frame_parms->Lmax; @@ -437,9 +437,8 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue, // FT ?? cppcheck fix memset(&pbch_a[0], 0, sizeof(uint8_t) * NR_POLAR_PBCH_PAYLOAD_BITS); //printf("nr_pbch_ue nid_cell %d\n",frame_parms->Nid_cell); - pbch_e_rx = &nr_ue_pbch_vars->llr[0]; - // clear LLR buffer - memset(nr_ue_pbch_vars->llr,0,NR_POLAR_PBCH_E); + int16_t pbch_e_rx[960]={0}; //Fixme: previous version erase only NR_POLAR_PBCH_E bytes + int pbch_e_rx_idx=0; int symbol_offset=1; if (ue->is_synchronized > 0) @@ -455,12 +454,19 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue, #endif // symbol refers to symbol within SSB. symbol_offset is the offset of the SSB wrt start of slot + double log2_maxh; for (symbol=1; symbol<4; symbol++) { - + const uint16_t nb_re=symbol == 2 ? 72 : 180; + struct complex16 rxdataF_ext[frame_parms->nb_antennas_rx][20*12*4]; + struct complex16 rxdataF_comp[frame_parms->nb_antennas_rx][nb_re]; + //was dl_ch_estimates[idx] = (int32_t *)malloc16_clear( sizeof(int32_t)*7*2*sizeof(int)*(fp->ofdm_symbol_size) ); + struct complex16 dl_ch_estimates_ext[frame_parms->nb_antennas_rx][20*12*4]; + nr_pbch_extract(nr_ue_common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF, - nr_ue_pbch_vars->dl_ch_estimates, - nr_ue_pbch_vars->rxdataF_ext, - nr_ue_pbch_vars->dl_ch_estimates_ext, + estimateSz, + dl_ch_estimates, + rxdataF_ext, + dl_ch_estimates_ext, symbol, symbol_offset, frame_parms); @@ -470,115 +476,113 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue, #endif if (symbol == 1) { - max_h = nr_pbch_channel_level(nr_ue_pbch_vars->dl_ch_estimates_ext, + max_h = nr_pbch_channel_level(dl_ch_estimates_ext, frame_parms, symbol); - nr_ue_pbch_vars->log2_maxh = 3+(log2_approx(max_h)/2); + log2_maxh = 3+(log2_approx(max_h)/2); } #ifdef DEBUG_PBCH LOG_I(PHY,"[PHY] PBCH log2_maxh = %d (%d)\n",nr_ue_pbch_vars->log2_maxh,max_h); #endif - nr_pbch_channel_compensation(nr_ue_pbch_vars->rxdataF_ext, - nr_ue_pbch_vars->dl_ch_estimates_ext, - nr_ue_pbch_vars->rxdataF_comp, + nr_pbch_channel_compensation(rxdataF_ext, + dl_ch_estimates_ext, + nb_re, + rxdataF_comp, frame_parms, symbol, - nr_ue_pbch_vars->log2_maxh); // log2_maxh+I0_shift + log2_maxh); // log2_maxh+I0_shift /*if (frame_parms->nb_antennas_rx > 1) pbch_detection_mrc(frame_parms, - nr_ue_pbch_vars->rxdataF_comp, + rxdataF_comp, symbol);*/ /* if (mimo_mode == ALAMOUTI) { - nr_pbch_alamouti(frame_parms,nr_ue_pbch_vars->rxdataF_comp,symbol); + nr_pbch_alamouti(frame_parms,rxdataF_comp,symbol); } else if (mimo_mode != SISO) { LOG_I(PHY,"[PBCH][RX] Unsupported MIMO mode\n"); return(-1); } */ if (symbol==2) { - nr_pbch_quantize(pbch_e_rx, - (short *)&(nr_ue_pbch_vars->rxdataF_comp[0][symbol*240]), + nr_pbch_quantize(pbch_e_rx+pbch_e_rx_idx, + (short *)rxdataF_comp[0], 144); - pbch_e_rx+=144; + pbch_e_rx_idx+=144; } else { - nr_pbch_quantize(pbch_e_rx, - (short *)&(nr_ue_pbch_vars->rxdataF_comp[0][symbol*240]), + nr_pbch_quantize(pbch_e_rx+pbch_e_rx_idx, + (short *)rxdataF_comp[0], 360); - pbch_e_rx+=360; + pbch_e_rx_idx+=360; } } #ifdef DEBUG_PBCH - write_output("rxdataF_comp.m","rxFcomp",&nr_ue_pbch_vars->rxdataF_comp[0][240],240*3,1,1); + write_output("rxdataF_comp.m","rxFcomp",rxdataF_comp[0],240*3,1,1); #endif - pbch_e_rx = nr_ue_pbch_vars->llr; //demod_pbch_e = nr_ue_pbch_vars->demod_pbch_e; // FT?? cppcheck fix - pbch_a = nr_ue_pbch_vars->pbch_a; #ifdef DEBUG_PBCH - //pbch_e_rx = &nr_ue_pbch_vars->llr[0]; - short *p = (short *)&(nr_ue_pbch_vars->rxdataF_comp[0][20*12]); + short *p = (short *)rxdataF_comp[0]); - for (int cnt = 0; cnt < 864 ; cnt++) +for (int cnt = 0; cnt < 864 ; cnt++) printf("pbch rx llr %d\n",*(pbch_e_rx+cnt)); #endif //un-scrambling - M = NR_POLAR_PBCH_E; - nushift = (Lmax==4)? i_ssb&3 : i_ssb&7; +M = NR_POLAR_PBCH_E; +nushift = (Lmax==4)? i_ssb&3 : i_ssb&7; uint32_t unscrambling_mask = (Lmax==64)?0x100006D:0x1000041; - - nr_pbch_unscrambling(nr_ue_pbch_vars,frame_parms->Nid_cell,nushift,M,NR_POLAR_PBCH_E,0,0); + uint32_t pbch_a_interleaved=0; +uint32_t pbch_a_prime=0; +nr_pbch_unscrambling(nr_ue_pbch_vars,pbch_e_rx,frame_parms->Nid_cell,nushift,M,NR_POLAR_PBCH_E,0,0, pbch_a_prime, &pbch_a_interleaved); //polar decoding de-rate matching const t_nrPolar_params *currentPtr = nr_polar_params( NR_POLAR_PBCH_MESSAGE_TYPE, NR_POLAR_PBCH_PAYLOAD_BITS, NR_POLAR_PBCH_AGGREGATION_LEVEL,1,&ue->polarList); - decoderState = polar_decoder_int16(pbch_e_rx,(uint64_t *)&nr_ue_pbch_vars->pbch_a_prime,0,currentPtr); + decoderState = polar_decoder_int16(pbch_e_rx,(uint64_t *)&pbch_a_prime,0,currentPtr); if(decoderState) return(decoderState); - // printf("polar decoder output 0x%08x\n",nr_ue_pbch_vars->pbch_a_prime); + // printf("polar decoder output 0x%08x\n",pbch_a_prime); // Decoder reversal uint32_t a_reversed=0; for (int i=0; ipbch_a_prime>>i)&1)<<(31-i); + a_reversed |= (((uint64_t)pbch_a_prime>>i)&1)<<(31-i); - nr_ue_pbch_vars->pbch_a_prime = a_reversed; + pbch_a_prime = a_reversed; //payload un-scrambling - nr_ue_pbch_vars->pbch_a_interleaved=0; M = (Lmax == 64)? (NR_POLAR_PBCH_PAYLOAD_BITS - 6) : (NR_POLAR_PBCH_PAYLOAD_BITS - 3); - nushift = ((nr_ue_pbch_vars->pbch_a_prime>>24)&1) ^ (((nr_ue_pbch_vars->pbch_a_prime>>6)&1)<<1); - nr_pbch_unscrambling(nr_ue_pbch_vars,frame_parms->Nid_cell,nushift,M,NR_POLAR_PBCH_PAYLOAD_BITS,1,unscrambling_mask); - //printf("nushift %d sfn 3rd %d 2nd %d", nushift,((nr_ue_pbch_vars->pbch_a_prime>>6)&1), ((nr_ue_pbch_vars->pbch_a_prime>>24)&1) ); + nushift = ((pbch_a_prime>>24)&1) ^ (((pbch_a_prime>>6)&1)<<1); +nr_pbch_unscrambling(nr_ue_pbch_vars,pbch_e_rx,frame_parms->Nid_cell,nushift,M,NR_POLAR_PBCH_PAYLOAD_BITS,1,unscrambling_mask,pbch_a_prime, &pbch_a_interleaved); + //printf("nushift %d sfn 3rd %d 2nd %d", nushift,((pbch_a_prime>>6)&1), ((pbch_a_prime>>24)&1) ); //payload deinterleaving //uint32_t in=0; uint32_t out=0; for (int i=0; i<32; i++) { - out |= ((nr_ue_pbch_vars->pbch_a_interleaved>>i)&1)<<(pbch_deinterleaving_pattern[i]); + out |= ((pbch_a_interleaved>>i)&1)<<(pbch_deinterleaving_pattern[i]); #ifdef DEBUG_PBCH - printf("i %d in 0x%08x out 0x%08x ilv %d (in>>i)&1) 0x%08x\n", i, nr_ue_pbch_vars->pbch_a_interleaved, out, pbch_deinterleaving_pattern[i], (nr_ue_pbch_vars->pbch_a_interleaved>>i)&1); + printf("i %d in 0x%08x out 0x%08x ilv %d (in>>i)&1) 0x%08x\n", i, pbch_a_interleaved, out, pbch_deinterleaving_pattern[i], (pbch_a_interleaved>>i)&1); #endif } uint32_t payload = 0; - //uint8_t xtra_byte = 0; - nr_ue_pbch_vars->xtra_byte = (out>>24)&0xff; + result->xtra_byte = (out>>24)&0xff; for (int i=0; i>i)&1)<<(NR_POLAR_PBCH_PAYLOAD_BITS-i-1); for (int i=0; i<3; i++) - decoded_output[i] = (uint8_t)((payload>>((3-i)<<3))&0xff); + result->decoded_output[i] = (uint8_t)((payload>>((3-i)<<3))&0xff); - frame_parms->half_frame_bit = ((nr_ue_pbch_vars->xtra_byte>>4)&0x01); // computing the half frame index from the extra byte +frame_parms->half_frame_bit = (result->xtra_byte>>4)&0x01; // computing the half frame index from the extra byte frame_parms->ssb_index = i_ssb; // ssb index corresponds to i_ssb for Lmax = 4,8 if (Lmax == 64) { // for Lmax = 64 ssb index 4th,5th and 6th bits are in extra byte for (int i=0; i<3; i++) - frame_parms->ssb_index += (((nr_ue_pbch_vars->xtra_byte>>(7-i))&0x01)<<(3+i)); + frame_parms->ssb_index += (((result->xtra_byte>>(7-i))&0x01)<<(3+i)); } ue->symbol_offset = nr_get_ssb_start_symbol(frame_parms,frame_parms->ssb_index); @@ -587,25 +591,26 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue, uint8_t frame_number_4lsb = 0; for (int i=0; i<4; i++) - frame_number_4lsb |= ((nr_ue_pbch_vars->xtra_byte>>i)&1)<<(3-i); + frame_number_4lsb |= ((result->xtra_byte>>i)&1)<<(3-i); proc->decoded_frame_rx = frame_number_4lsb; #ifdef DEBUG_PBCH - printf("xtra_byte %x payload %x\n", nr_ue_pbch_vars->xtra_byte, payload); + printf("xtra_byte %x payload %x\n", xtra_byte, payload); for (int i=0; i<(NR_POLAR_PBCH_PAYLOAD_BITS>>3); i++) { // printf("unscrambling pbch_a[%d] = %x \n", i,pbch_a[i]); - printf("[PBCH] decoder payload[%d] = %x\n",i,decoded_output[i]); + printf("[PBCH] decoder payload[%d] = %x\n",i,result->decoded_output[i]); } #endif nr_downlink_indication_t dl_indication; - fapi_nr_rx_indication_t *rx_ind = calloc(1, sizeof(*rx_ind)); - uint16_t number_pdus = 1; +fapi_nr_rx_indication_t *rx_ind = calloc(1, sizeof(*rx_ind)); +uint16_t number_pdus = 1; - nr_fill_dl_indication(&dl_indication, NULL, rx_ind, proc, ue, gNB_id); - nr_fill_rx_indication(rx_ind, FAPI_NR_RX_PDU_TYPE_SSB, gNB_id, ue, NULL, NULL, number_pdus, proc); +nr_fill_dl_indication(&dl_indication, NULL, rx_ind, proc, ue, gNB_id); + +nr_fill_rx_indication(rx_ind, FAPI_NR_RX_PDU_TYPE_SSB, gNB_id, ue, NULL, NULL, number_pdus, proc,(void*)result); if (ue->if_inst && ue->if_inst->dl_indication) ue->if_inst->dl_indication(&dl_indication, NULL); diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h index 239731208e..e53cfde51b 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h @@ -1153,11 +1153,14 @@ int rx_sss(PHY_VARS_NR_UE *phy_vars_ue,int32_t *tot_metric,uint8_t *flip_max,uin */ int nr_rx_pbch( PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, + const int estimateSz, + struct complex16 dl_ch_estimates[][estimateSz], NR_UE_PBCH *nr_ue_pbch_vars, NR_DL_FRAME_PARMS *frame_parms, uint8_t eNB_id, uint8_t i_ssb, - MIMO_mode_t mimo_mode); + MIMO_mode_t mimo_mode, + fapiPbch_t* result); int nr_pbch_detection(UE_nr_rxtx_proc_t *proc, PHY_VARS_NR_UE *ue, diff --git a/openair1/PHY/TOOLS/nr_phy_scope.c b/openair1/PHY/TOOLS/nr_phy_scope.c index 5594d56693..a31414946f 100644 --- a/openair1/PHY/TOOLS/nr_phy_scope.c +++ b/openair1/PHY/TOOLS/nr_phy_scope.c @@ -40,6 +40,9 @@ const FL_COLOR water_colors[4] = {FL_BLUE,FL_GREEN,FL_YELLOW,FL_RED}; typedef struct complex16 scopeSample_t; #define SquaredNorm(VaR) ((VaR).r*(VaR).r+(VaR).i*(VaR).i) +typedef struct { +} scopeGraphData_t; + typedef struct OAIgraph { FL_OBJECT *graph; FL_OBJECT *text; @@ -56,7 +59,7 @@ typedef struct OAIgraph { boolean_t initDone; int iteration; void (*gNBfunct) (struct OAIgraph *graph, scopeData_t *p, int UE_id); - void (*nrUEfunct)(struct OAIgraph *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id); + void (*nrUEfunct)(scopeGraphData_t** data, struct OAIgraph *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id); } OAIgraph_t; /* Forms and Objects */ @@ -140,7 +143,7 @@ static OAIgraph_t gNBcommonGraph( void (*funct) (OAIgraph_t *graph, scopeData_t return graph; } -static OAIgraph_t nrUEcommonGraph( void (*funct) (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id), +static OAIgraph_t nrUEcommonGraph( void (*funct) (scopeGraphData_t **data, OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id), int type, FL_Coord x, FL_Coord y, FL_Coord w, FL_Coord h, const char *label, FL_COLOR pointColor) { OAIgraph_t graph; commonGraph(&graph, type, x, y, w, h, label, pointColor); @@ -341,7 +344,7 @@ static void timeResponse (OAIgraph_t *graph, scopeData_t *p, int nb_UEs) { static void gNBfreqWaterFall (OAIgraph_t *graph, scopeData_t *p, int nb_UEs) { NR_DL_FRAME_PARMS *frame_parms=&p->gNB->frame_parms; //use 1st antenna - genericWaterFall(graph, (scopeSample_t *)p->rxdataF, frame_parms->samples_per_frame_wCP, + genericWaterFall(graph, (scopeSample_t *)p->liveData, frame_parms->samples_per_frame_wCP, frame_parms->slots_per_frame, "X axis: Frequency domain, one subframe"); } @@ -515,6 +518,7 @@ void phy_scope_gNB(OAI_phy_scope_t *form, //fl_check_forms(); } + static void *scope_thread_gNB(void *arg) { scopeData_t *p=(scopeData_t *) arg; size_t stksize=0; @@ -539,11 +543,12 @@ static void *scope_thread_gNB(void *arg) { return NULL; } + static void copyRxdataF(int32_t *data, int slot, void *scopeData) { scopeData_t *scope=(scopeData_t *)scopeData; - memcpy(scope->rxdataF + slot*scope->gNB->frame_parms.samples_per_slot_wCP, + memcpy(((int32_t*)scope->liveData) + slot*scope->gNB->frame_parms.samples_per_slot_wCP, data, - scope->gNB->frame_parms.samples_per_slot_wCP); + scope->gNB->frame_parms.samples_per_slot_wCP*sizeof(int32_t)); } void gNBinitScope(scopeParms_t *p) { @@ -554,11 +559,11 @@ void gNBinitScope(scopeParms_t *p) { scope->ru=p->ru; scope->gNB=p->gNB; scope->slotFunc=copyRxdataF; - AssertFatal(scope->rxdataF=(int32_t *) calloc(p->gNB->frame_parms.samples_per_frame_wCP*sizeof(int32_t),1),""); + AssertFatal(scope->liveData= calloc(p->gNB->frame_parms.samples_per_frame_wCP*sizeof(int32_t),1),""); pthread_t forms_thread; threadCreate(&forms_thread, scope_thread_gNB, p->gNB->scopeData, "scope", -1, OAI_PRIORITY_RT_LOW); } -static void ueWaterFall (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) { +static void ueWaterFall (scopeGraphData_t **data, OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) { // Received signal in time domain of receive antenna 0 genericWaterFall(graph, (scopeSample_t *) phy_vars_ue->common_vars.rxdata[0], @@ -574,13 +579,18 @@ static void ueTimeResponse (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int phy_vars_ue->frame_parms.samples_per_frame); } */ -static void ueChannelResponse (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) { + +static void ueChannelResponse (scopeGraphData_t **data, OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) { // Channel Impulse Response + if (!data[pbchDlChEstimateTime]) + return; + genericPowerPerAntena(graph, phy_vars_ue->frame_parms.nb_antennas_rx, - (const scopeSample_t **) phy_vars_ue->pbch_vars[eNB_id]->dl_ch_estimates_time, + (const scopeSample_t **) &data[pbchDlChEstimateTime], phy_vars_ue->frame_parms.ofdm_symbol_size>>3); } -static void ueFreqWaterFall (OAIgraph_t *graph,PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id ) { + +static void ueFreqWaterFall (scopeGraphData_t **data, OAIgraph_t *graph,PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id ) { NR_DL_FRAME_PARMS *frame_parms=&phy_vars_ue->frame_parms; //use 1st antenna genericWaterFall(graph, @@ -624,12 +634,12 @@ static void uePbchFrequencyResp (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue oai_xygraph(graph,freq,chest_f_abs,frame_parms->ofdm_symbol_size,0,10); } */ -static void uePbchLLR (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) { +static void uePbchLLR (scopeGraphData_t **data, OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) { // PBCH LLRs - if ( !phy_vars_ue->pbch_vars[eNB_id]->llr) + if ( !data[pbchLlr]) return; - int16_t *pbch_llr = (int16_t *) phy_vars_ue->pbch_vars[eNB_id]->llr; + int16_t *pbch_llr = (int16_t *)data[pbchLlr]; float *llr_pbch, *bit_pbch; oai_xygraph_getbuff(graph, &bit_pbch, &llr_pbch, 864, 0); @@ -639,12 +649,13 @@ static void uePbchLLR (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_ oai_xygraph(graph,bit_pbch,llr_pbch,864,0,10); } -static void uePbchIQ (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) { +static void uePbchIQ (scopeGraphData_t **data, OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) { // PBCH I/Q of MF Output - if (!phy_vars_ue->pbch_vars[eNB_id]->rxdataF_comp[0]) - return; - scopeSample_t *pbch_comp = (scopeSample_t *) phy_vars_ue->pbch_vars[eNB_id]->rxdataF_comp[0]; + if (!data[pbchRxdataF_comp]) + return; + + scopeSample_t *pbch_comp = (scopeSample_t *) data[pbchRxdataF_comp]; float *I, *Q; oai_xygraph_getbuff(graph, &I, &Q, 180*3, 0); memset(I,0,180*3*sizeof(*I)); @@ -673,7 +684,7 @@ static void uePbchIQ (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_i AssertFatal(base <= 180*3,""); oai_xygraph(graph,I,Q,base,0, 10); } -static void uePcchLLR (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) { +static void uePcchLLR (scopeGraphData_t **data, OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) { // PDCCH LLRs if (!phy_vars_ue->pdcch_vars[0][eNB_id]->llr) return; @@ -698,7 +709,7 @@ static void uePcchLLR (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_ AssertFatal(base <= coded_bits_per_codeword*RX_NB_TH_MAX, ""); oai_xygraph(graph,bit,llr,base,0,10); } -static void uePcchIQ (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) { +static void uePcchIQ (scopeGraphData_t **data, OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) { // PDCCH I/Q of MF Output if (!phy_vars_ue->pdcch_vars[0][eNB_id]->rxdataF_comp[0]) return; @@ -722,7 +733,7 @@ static void uePcchIQ (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_i AssertFatal(base <= nb*RX_NB_TH_MAX, ""); oai_xygraph(graph,I,Q,base,0,10); } -static void uePdschLLR (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) { +static void uePdschLLR (scopeGraphData_t **data, OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) { // PDSCH LLRs if (!phy_vars_ue->pdsch_vars[0][eNB_id]->llr[0]) return; @@ -749,7 +760,7 @@ static void uePdschLLR (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB //fl_set_xyplot_xbounds(form->pdsch_llr,0,coded_bits_per_codeword); oai_xygraph(graph,bit,llr,base,0,10); } -static void uePdschIQ (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) { +static void uePdschIQ (scopeGraphData_t **data, OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) { // PDSCH I/Q of MF Output if (!phy_vars_ue->pdsch_vars[0][eNB_id]->rxdataF_comp0[0]) return; @@ -776,7 +787,7 @@ static void uePdschIQ (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_ AssertFatal(base <= sz*RX_NB_TH_MAX, ""); oai_xygraph(graph,I,Q,sz*RX_NB_TH_MAX,0,10); } -static void uePdschThroughput (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) { +static void uePdschThroughput (scopeGraphData_t **data, OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) { /* float tput_time_ue[NUMBER_OF_UE_MAX][TPUT_WINDOW_LENGTH] = {{0}}; float tput_ue[NUMBER_OF_UE_MAX][TPUT_WINDOW_LENGTH] = {{0}}; @@ -869,7 +880,9 @@ static OAI_phy_scope_t *create_phy_scope_nrue( int ID ) { fl_show_form (fdui->phy_scope, FL_PLACE_HOTSPOT, FL_FULLBORDER, buf); return fdui; } -void phy_scope_nrUE(OAI_phy_scope_t *form, + +void phy_scope_nrUE(scopeGraphData_t **UEliveData, + OAI_phy_scope_t *form, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) { @@ -886,12 +899,13 @@ void phy_scope_nrUE(OAI_phy_scope_t *form, int i=0; while (form->graph[i].graph) { - form->graph[i].nrUEfunct(form->graph+i, phy_vars_ue, eNB_id, UE_id); + form->graph[i].nrUEfunct(UEliveData, form->graph+i, phy_vars_ue, eNB_id, UE_id); i++; } //fl_check_forms(); } + static void *nrUEscopeThread(void *arg) { PHY_VARS_NR_UE *ue=(PHY_VARS_NR_UE *)arg; size_t stksize; @@ -903,9 +917,12 @@ static void *nrUEscopeThread(void *arg) { fl_initialize (&fl_argc, &name, NULL, 0, 0); OAI_phy_scope_t *form_nrue=create_phy_scope_nrue(0); + scopeGraphData_t *UEliveData[UEdataTypeNumberOfItems]; + while (!oai_exit) { fl_freeze_form(form_nrue->phy_scope); - phy_scope_nrUE(form_nrue, + phy_scope_nrUE(UEliveData, + form_nrue, ue, 0,0); fl_unfreeze_form(form_nrue->phy_scope); @@ -915,10 +932,19 @@ static void *nrUEscopeThread(void *arg) { pthread_exit((void *)arg); } -void nrUEinitScope(PHY_VARS_NR_UE *ue) { - pthread_t forms_thread; - threadCreate(&forms_thread, nrUEscopeThread, ue, "scope", -1, OAI_PRIORITY_RT_LOW); + +void UEcopyData(enum UEdataType type, void * data, int elementSz, int colSz, int lineSz) { + } + +void nrUEinitScope(PHY_VARS_NR_UE *ue) { + AssertFatal(ue->scopeData=malloc(sizeof(scopeData_t)),""); + scopeData_t *scope=(scopeData_t *) ue->scopeData; + scope->copyData=UEcopyData; + pthread_t forms_thread; + threadCreate(&forms_thread, nrUEscopeThread, ue, "scope", -1, OAI_PRIORITY_RT_LOW); +} + void nrscope_autoinit(void *dataptr) { AssertFatal( (IS_SOFTMODEM_GNB_BIT||IS_SOFTMODEM_5GUE_BIT),"Scope cannot find NRUE or GNB context"); diff --git a/openair1/PHY/TOOLS/phy_scope_interface.h b/openair1/PHY/TOOLS/phy_scope_interface.h index 8b747d575d..1ba6bb558d 100644 --- a/openair1/PHY/TOOLS/phy_scope_interface.h +++ b/openair1/PHY/TOOLS/phy_scope_interface.h @@ -32,6 +32,7 @@ #ifndef __PHY_SCOPE_INTERFACE_H__ #define __PHY_SCOPE_INTERFACE_H__ #include + typedef struct { int *argc; char **argv; @@ -39,16 +40,25 @@ typedef struct { PHY_VARS_gNB *gNB; } scopeParms_t; +enum UEdataType { + pbchDlChEstimateTime, + pbchLlr, + pbchRxdataF_comp, + UEdataTypeNumberOfItems +}; typedef struct scopeData_s { int *argc; char **argv; RU_t *ru; PHY_VARS_gNB *gNB; - int32_t * rxdataF; + void * liveData; void (*slotFunc)(int32_t* data, int slot, void * scopeData); + void (*copyData)(enum UEdataType, void * data, int elementSz, int colSz, int lineSz); } scopeData_t; int load_softscope(char *exectype, void *initarg); int end_forms(void) ; + +#define scopeCopy(ue, type, ...) if(ue->scopeData) ((scopeData_t*)ue->scopeData)->copyData(type, ##__VA_ARGS__); #endif diff --git a/openair1/PHY/defs_UE.h b/openair1/PHY/defs_UE.h index 2d2697a4b7..6a855d3af6 100644 --- a/openair1/PHY/defs_UE.h +++ b/openair1/PHY/defs_UE.h @@ -839,6 +839,7 @@ typedef struct { /// RF and Interface devices per CC openair0_device rfdevice; + void *scopeData; } PHY_VARS_UE; /* this structure is used to pass both UE phy vars and diff --git a/openair1/PHY/defs_nr_UE.h b/openair1/PHY/defs_nr_UE.h index bca956bf75..d8c274de45 100644 --- a/openair1/PHY/defs_nr_UE.h +++ b/openair1/PHY/defs_nr_UE.h @@ -655,40 +655,6 @@ typedef struct { #define PBCH_A 24 typedef struct { - /// \brief Pointers to extracted PBCH symbols in frequency-domain. - /// - first index: rx antenna [0..nb_antennas_rx[ - /// - second index: ? [0..287] (hard coded) - int32_t **rxdataF_ext; - /// \brief Pointers to extracted and compensated PBCH symbols in frequency-domain. - /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx - /// - second index: ? [0..287] (hard coded) - int32_t **rxdataF_comp; - /// \brief Hold the channel estimates in frequency domain. - /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx - /// - second index: samples? [0..symbols_per_tti*(ofdm_symbol_size+LTE_CE_FILTER_LENGTH)[ - int32_t **dl_ch_estimates; - /// \brief Pointers to downlink channel estimates in frequency-domain extracted in PRBS. - /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx - /// - second index: ? [0..287] (hard coded) - int32_t **dl_ch_estimates_ext; - /// \brief Hold the channel estimates in time domain (used for tracking). - /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx - /// - second index: samples? [0..2*ofdm_symbol_size[ - int32_t **dl_ch_estimates_time; - int log2_maxh; - uint8_t pbch_a[NR_POLAR_PBCH_PAYLOAD_BITS>>3]; - uint32_t pbch_a_interleaved; - uint32_t pbch_a_prime; - uint8_t pbch_e[NR_POLAR_PBCH_E]; - int16_t demod_pbch_e[NR_POLAR_PBCH_E]; - /// \brief Pointer to PBCH llrs. - /// - first index: ? [0..1919] (hard coded) - int16_t *llr; - /// \brief Pointer to PBCH decoded output. - /// - first index: ? [0..63] (hard coded) - uint8_t *decoded_output; - /// \brief PBCH additional bits - uint8_t xtra_byte; /// \brief Total number of PDU errors. uint32_t pdu_errors; /// \brief Total number of PDU errors 128 frames ago. @@ -696,7 +662,7 @@ typedef struct { /// \brief Total number of consecutive PDU errors. uint32_t pdu_errors_conseq; /// \brief FER (in percent) . - uint32_t pdu_fer; + //uint32_t pdu_fer; } NR_UE_PBCH; typedef struct { @@ -1075,7 +1041,7 @@ typedef struct { #endif int dl_stats[5]; - + void* scopeData; } PHY_VARS_NR_UE; /* this structure is used to pass both UE phy vars and diff --git a/openair1/SCHED_NR_UE/defs.h b/openair1/SCHED_NR_UE/defs.h index b85d4c1b50..acdf88018a 100644 --- a/openair1/SCHED_NR_UE/defs.h +++ b/openair1/SCHED_NR_UE/defs.h @@ -82,6 +82,11 @@ #define DAQ_AGC_OFF 0 +typedef struct { + uint8_t decoded_output[64]; + uint8_t xtra_byte; +} fapiPbch_t; + /** @addtogroup _PHY_PROCEDURES_ * @{ */ @@ -398,7 +403,8 @@ void nr_fill_rx_indication(fapi_nr_rx_indication_t *rx_ind, NR_UE_DLSCH_t *dlsch0, NR_UE_DLSCH_t *dlsch1, uint16_t n_pdus, - UE_nr_rxtx_proc_t *proc); + UE_nr_rxtx_proc_t *proc, + void * typeSpecific); bool nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c index 97a7e2e489..12a8ce0d08 100644 --- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c +++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c @@ -118,7 +118,8 @@ void nr_fill_rx_indication(fapi_nr_rx_indication_t *rx_ind, NR_UE_DLSCH_t *dlsch0, NR_UE_DLSCH_t *dlsch1, uint16_t n_pdus, - UE_nr_rxtx_proc_t *proc ){ + UE_nr_rxtx_proc_t *proc, + void * typeSpecific){ NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; @@ -162,8 +163,11 @@ void nr_fill_rx_indication(fapi_nr_rx_indication_t *rx_ind, rx_ind->rx_indication_body[n_pdus - 1].pdsch_pdu.pdu_length = dlsch0->harq_processes[dlsch0->current_harq_pid]->TBS / 8; break; case FAPI_NR_RX_PDU_TYPE_SSB: - rx_ind->rx_indication_body[n_pdus - 1].ssb_pdu.pdu = ue->pbch_vars[gNB_id]->decoded_output; - rx_ind->rx_indication_body[n_pdus - 1].ssb_pdu.additional_bits = ue->pbch_vars[gNB_id]->xtra_byte; + rx_ind->rx_indication_body[n_pdus - 1].ssb_pdu.pdu=malloc(sizeof(((fapiPbch_t*)typeSpecific)->decoded_output)); + memcpy(rx_ind->rx_indication_body[n_pdus - 1].ssb_pdu.pdu, + ((fapiPbch_t*)typeSpecific)->decoded_output, + sizeof(((fapiPbch_t*)typeSpecific)->decoded_output)); + rx_ind->rx_indication_body[n_pdus - 1].ssb_pdu.additional_bits = ((fapiPbch_t*)typeSpecific)->xtra_byte; rx_ind->rx_indication_body[n_pdus - 1].ssb_pdu.ssb_index = (frame_parms->ssb_index)&0x7; rx_ind->rx_indication_body[n_pdus - 1].ssb_pdu.ssb_length = frame_parms->Lmax; rx_ind->rx_indication_body[n_pdus - 1].ssb_pdu.cell_id = frame_parms->Nid_cell; @@ -353,10 +357,9 @@ void nr_ue_measurement_procedures(uint16_t l, VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_MEASUREMENT_PROCEDURES, VCD_FUNCTION_OUT); } -void nr_ue_pbch_procedures(uint8_t gNB_id, +static void nr_ue_pbch_procedures(uint8_t gNB_id, PHY_VARS_NR_UE *ue, - UE_nr_rxtx_proc_t *proc, - uint8_t abstraction_flag) + UE_nr_rxtx_proc_t *proc,int estimateSz, struct complex16 dl_ch_estimates[][estimateSz]) { int ret = 0; @@ -368,13 +371,15 @@ void nr_ue_pbch_procedures(uint8_t gNB_id, VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PBCH_PROCEDURES, VCD_FUNCTION_IN); LOG_D(PHY,"[UE %d] Frame %d Slot %d, Trying PBCH (NidCell %d, gNB_id %d)\n",ue->Mod_id,frame_rx,nr_slot_rx,ue->frame_parms.Nid_cell,gNB_id); - + fapiPbch_t result; ret = nr_rx_pbch(ue, proc, + estimateSz, dl_ch_estimates, ue->pbch_vars[gNB_id], &ue->frame_parms, gNB_id, (ue->frame_parms.ssb_index)&7, - SISO); + SISO, + &result); if (ret==0) { @@ -444,7 +449,6 @@ void nr_ue_pbch_procedures(uint8_t gNB_id, } if (frame_rx % 100 == 0) { - ue->pbch_vars[gNB_id]->pdu_fer = ue->pbch_vars[gNB_id]->pdu_errors - ue->pbch_vars[gNB_id]->pdu_errors_last; ue->pbch_vars[gNB_id]->pdu_errors_last = ue->pbch_vars[gNB_id]->pdu_errors; } @@ -794,16 +798,16 @@ bool nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue, switch (pdsch) { case RA_PDSCH: nr_fill_dl_indication(&dl_indication, NULL, rx_ind, proc, ue, gNB_id); - nr_fill_rx_indication(rx_ind, FAPI_NR_RX_PDU_TYPE_RAR, gNB_id, ue, dlsch0, NULL, number_pdus, proc); + nr_fill_rx_indication(rx_ind, FAPI_NR_RX_PDU_TYPE_RAR, gNB_id, ue, dlsch0, NULL, number_pdus, proc, NULL); ue->UE_mode[gNB_id] = RA_RESPONSE; break; case PDSCH: nr_fill_dl_indication(&dl_indication, NULL, rx_ind, proc, ue, gNB_id); - nr_fill_rx_indication(rx_ind, FAPI_NR_RX_PDU_TYPE_DLSCH, gNB_id, ue, dlsch0, NULL, number_pdus, proc); + nr_fill_rx_indication(rx_ind, FAPI_NR_RX_PDU_TYPE_DLSCH, gNB_id, ue, dlsch0, NULL, number_pdus, proc, NULL); break; case SI_PDSCH: nr_fill_dl_indication(&dl_indication, NULL, rx_ind, proc, ue, gNB_id); - nr_fill_rx_indication(rx_ind, FAPI_NR_RX_PDU_TYPE_SIB, gNB_id, ue, dlsch0, NULL, number_pdus, proc); + nr_fill_rx_indication(rx_ind, FAPI_NR_RX_PDU_TYPE_SIB, gNB_id, ue, dlsch0, NULL, number_pdus, proc, NULL); break; default: break; @@ -1399,6 +1403,9 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue, if (slot_ssb) { VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP_PBCH, VCD_FUNCTION_IN); LOG_D(PHY," ------ PBCH ChannelComp/LLR: frame.slot %d.%d ------ \n", frame_rx%1024, nr_slot_rx); + const int estimateSz=7*2*sizeof(int)*fp->ofdm_symbol_size; + struct complex16 dl_ch_estimates[fp->nb_antennas_rx][estimateSz]; + struct complex16 dl_ch_estimates_time[fp->nb_antennas_rx][estimateSz]; for (int i=1; i<4; i++) { nr_slot_fep(ue, @@ -1408,7 +1415,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue, start_meas(&ue->dlsch_channel_estimation_stats); - nr_pbch_channel_estimation(ue,proc,gNB_id,nr_slot_rx,(ue->symbol_offset+i)%(fp->symbols_per_slot),i-1,(fp->ssb_index)&7,fp->half_frame_bit); + nr_pbch_channel_estimation(ue, estimateSz, dl_ch_estimates, dl_ch_estimates_time,proc,gNB_id,nr_slot_rx,(ue->symbol_offset+i)%(fp->symbols_per_slot),i-1,(fp->ssb_index)&7,fp->half_frame_bit); stop_meas(&ue->dlsch_channel_estimation_stats); } @@ -1417,13 +1424,14 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue, if ((ue->decode_MIB == 1) && slot_pbch) { LOG_D(PHY," ------ Decode MIB: frame.slot %d.%d ------ \n", frame_rx%1024, nr_slot_rx); - nr_ue_pbch_procedures(gNB_id, ue, proc, 0); + nr_ue_pbch_procedures(gNB_id, ue, proc, estimateSz, dl_ch_estimates); if (ue->no_timing_correction==0) { LOG_D(PHY,"start adjust sync slot = %d no timing %d\n", nr_slot_rx, ue->no_timing_correction); nr_adjust_synch_ue(fp, ue, gNB_id, + estimateSz, dl_ch_estimates_time, frame_rx, nr_slot_rx, 0, diff --git a/openair1/SIMULATION/NR_PHY/nr_dummy_functions.c b/openair1/SIMULATION/NR_PHY/nr_dummy_functions.c index 7a47410129..351c2f33c4 100644 --- a/openair1/SIMULATION/NR_PHY/nr_dummy_functions.c +++ b/openair1/SIMULATION/NR_PHY/nr_dummy_functions.c @@ -1,5 +1,6 @@ #include "nfapi/oai_integration/vendor_ext.h" + int oai_nfapi_hi_dci0_req(nfapi_hi_dci0_request_t *hi_dci0_req) { return(0); } int oai_nfapi_tx_req(nfapi_tx_request_t *tx_req) { return(0); } int oai_nfapi_dl_config_req(nfapi_dl_config_request_t *dl_config_req) { return(0); } @@ -35,4 +36,5 @@ void nr_fill_rx_indication(fapi_nr_rx_indication_t *rx_ind, NR_UE_DLSCH_t *dlsch0, NR_UE_DLSCH_t *dlsch1, uint16_t n_pdus, - UE_nr_rxtx_proc_t *proc) {} + UE_nr_rxtx_proc_t *proc, + void * typeSpecific ) {} diff --git a/openair1/SIMULATION/NR_PHY/pbchsim.c b/openair1/SIMULATION/NR_PHY/pbchsim.c index c6b547cd79..692d1bac20 100644 --- a/openair1/SIMULATION/NR_PHY/pbchsim.c +++ b/openair1/SIMULATION/NR_PHY/pbchsim.c @@ -720,6 +720,9 @@ int main(int argc, char **argv) UE_nr_rxtx_proc_t proc={0}; UE->rx_offset=0; uint8_t ssb_index = 0; + const int estimateSz=7*2*sizeof(int)*frame_parms->ofdm_symbol_size; + struct complex16 dl_ch_estimates[frame_parms->nb_antennas_rx][estimateSz]; + struct complex16 dl_ch_estimates_time[frame_parms->nb_antennas_rx][estimateSz]; while (!((SSB_positions >> ssb_index) & 0x01)) ssb_index++; // to select the first transmitted ssb UE->symbol_offset = nr_get_ssb_start_symbol(frame_parms,ssb_index); @@ -730,17 +733,20 @@ int main(int argc, char **argv) i%frame_parms->symbols_per_slot, ssb_slot); - nr_pbch_channel_estimation(UE,&proc,0,ssb_slot,i%frame_parms->symbols_per_slot,i-(UE->symbol_offset+1),ssb_index%8,n_hf); + nr_pbch_channel_estimation(UE,estimateSz, dl_ch_estimates, dl_ch_estimates_time, &proc, + 0,ssb_slot,i%frame_parms->symbols_per_slot,i-(UE->symbol_offset+1),ssb_index%8,n_hf); } - + fapiPbch_t result; ret = nr_rx_pbch(UE, &proc, - UE->pbch_vars[0], + estimateSz, dl_ch_estimates, + UE->pbch_vars[0], frame_parms, 0, ssb_index%8, - SISO); + SISO, + &result); if (ret==0) { //UE->rx_ind.rx_indication_body->mib_pdu.ssb_index; //not yet detected automatically @@ -749,9 +755,9 @@ int main(int argc, char **argv) for (int i=0; i<8; i++) gNB_xtra_byte |= ((gNB->pbch.pbch_a>>(31-i))&1)<<(7-i); - payload_ret = (UE->pbch_vars[0]->xtra_byte == gNB_xtra_byte); + payload_ret = (result.xtra_byte == gNB_xtra_byte); for (i=0;i<3;i++){ - payload_ret += (UE->pbch_vars[0]->decoded_output[i] == ((msgDataTx.ssb[ssb_index].ssb_pdu.ssb_pdu_rel15.bchPayload>>(8*i)) & 0xff)); + payload_ret += (result.decoded_output[i] == ((msgDataTx.ssb[ssb_index].ssb_pdu.ssb_pdu_rel15.bchPayload>>(8*i)) & 0xff)); } //printf("xtra byte gNB: 0x%02x UE: 0x%02x\n",gNB_xtra_byte, UE->pbch_vars[0]->xtra_byte); //printf("ret %d\n", payload_ret); From 18a421578f8905fbd1da7d17e3d60a3837ba65e9 Mon Sep 17 00:00:00 2001 From: Laurent THOMAS Date: Tue, 15 Feb 2022 17:44:24 +0100 Subject: [PATCH 41/96] finish remove global vars for UE PBCH --- .../nr_dl_channel_estimation.c | 2 +- .../PHY/NR_UE_TRANSPORT/nr_initial_sync.c | 3 +- openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c | 147 +++++++++--------- openair1/PHY/TOOLS/nr_phy_scope.c | 105 +++++++------ openair1/PHY/TOOLS/phy_scope_interface.h | 9 +- openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c | 2 +- 6 files changed, 141 insertions(+), 127 deletions(-) diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c index 8efe85b222..12c78a08fb 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -455,7 +455,7 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue, } } if (dmrss == 2) - scopeCopy(ue, pbchDlChEstimateTime, dl_ch_estimates_time, sizeof(struct complex16), idftsizeidx, ue->frame_parms.nb_antennas_rx); + UEscopeCopy(ue, pbchDlChEstimateTime, (void*)dl_ch_estimates_time, sizeof(struct complex16), ue->frame_parms.nb_antennas_rx, idftsizeidx); return(0); } diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c b/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c index 39dc183bc3..3dc0d79e35 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c @@ -153,7 +153,8 @@ int nr_pbch_detection(UE_nr_rxtx_proc_t * proc, PHY_VARS_NR_UE *ue, int pbch_ini struct complex16 dl_ch_estimates[frame_parms->nb_antennas_rx][estimateSz]; struct complex16 dl_ch_estimates_time[frame_parms->nb_antennas_rx][estimateSz]; for(int i=pbch_initial_symbol; ii_ssb,temp_ptr->n_hf); + nr_pbch_channel_estimation(ue,estimateSz, dl_ch_estimates, dl_ch_estimates_time, + proc,0,0,i,i-pbch_initial_symbol,temp_ptr->i_ssb,temp_ptr->n_hf); stop_meas(&ue->dlsch_channel_estimation_stats); fapiPbch_t result; ret = nr_rx_pbch(ue, diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c b/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c index 2b5cc6c3d6..0073e8344d 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c @@ -37,28 +37,28 @@ #include "PHY/INIT/phy_init.h" #include "openair1/SCHED_NR_UE/defs.h" #include +#include -//#define DEBUG_PBCH +//#define DEBUG_PBCH //#define DEBUG_PBCH_ENCODING - //#include "PHY_INTERFACE/defs.h" +//#include "PHY_INTERFACE/defs.h" #define PBCH_A 24 #define print_shorts(s,x) printf("%s : %d,%d,%d,%d,%d,%d,%d,%d\n",s,((int16_t*)x)[0],((int16_t*)x)[1],((int16_t*)x)[2],((int16_t*)x)[3],((int16_t*)x)[4],((int16_t*)x)[5],((int16_t*)x)[6],((int16_t*)x)[7]) static uint16_t nr_pbch_extract(int **rxdataF, - const int estimateSz, - struct complex16 dl_ch_estimates[][estimateSz], - struct complex16 rxdataF_ext[][20*12*4], - struct complex16 dl_ch_estimates_ext[][20*12*4], - uint32_t symbol, - uint32_t s_offset, - NR_DL_FRAME_PARMS *frame_parms) { + const int estimateSz, + struct complex16 dl_ch_estimates[][estimateSz], + struct complex16 rxdataF_ext[][20*12*4], + struct complex16 dl_ch_estimates_ext[][20*12*4], + uint32_t symbol, + uint32_t s_offset, + NR_DL_FRAME_PARMS *frame_parms) { uint16_t rb; uint8_t i,j,aarx; int nushiftmod4 = frame_parms->nushift; - AssertFatal(symbol>=1 && symbol<5, "symbol %d illegal for PBCH extraction\n", symbol); @@ -66,7 +66,6 @@ static uint16_t nr_pbch_extract(int **rxdataF, for (aarx=0; aarxnb_antennas_rx; aarx++) { unsigned int rx_offset = frame_parms->first_carrier_offset + frame_parms->ssb_start_subcarrier; rx_offset = (rx_offset)%(frame_parms->ofdm_symbol_size); - struct complex16 *rxF = (struct complex16 *)&rxdataF[aarx][(symbol+s_offset)*frame_parms->ofdm_symbol_size]; struct complex16 *rxF_ext = rxdataF_ext[aarx]; #ifdef DEBUG_PBCH @@ -103,7 +102,7 @@ static uint16_t nr_pbch_extract(int **rxdataF, rx_offset=(rx_offset+1)%(frame_parms->ofdm_symbol_size); //rx_offset = (rx_offset >= frame_parms->ofdm_symbol_size) ? (rx_offset - frame_parms->ofdm_symbol_size + 1) : (rx_offset+1); - } + } rxF_ext+=9; } else { //symbol 2 @@ -129,11 +128,12 @@ static uint16_t nr_pbch_extract(int **rxdataF, } rxF_ext+=9; - } else{ //rx_offset = (rx_offset >= frame_parms->ofdm_symbol_size) ? (rx_offset - frame_parms->ofdm_symbol_size + 12) : (rx_offset+12); - rx_offset = (rx_offset+12)%(frame_parms->ofdm_symbol_size); - } + } else { //rx_offset = (rx_offset >= frame_parms->ofdm_symbol_size) ? (rx_offset - frame_parms->ofdm_symbol_size + 12) : (rx_offset+12); + rx_offset = (rx_offset+12)%(frame_parms->ofdm_symbol_size); + } } } + struct complex16 *dl_ch0 = &dl_ch_estimates[aarx][((symbol+s_offset)*(frame_parms->ofdm_symbol_size))]; //printf("dl_ch0 addr %p\n",dl_ch0); @@ -258,12 +258,12 @@ int nr_pbch_channel_level(struct complex16 dl_ch_estimates_ext[][20*12*4], } static void nr_pbch_channel_compensation(struct complex16 rxdataF_ext[][20*12*4], - struct complex16 dl_ch_estimates_ext[][20*12*4], - int cols, - struct complex16 rxdataF_comp[][cols], - NR_DL_FRAME_PARMS *frame_parms, - uint32_t symbol, - uint8_t output_shift) { + struct complex16 dl_ch_estimates_ext[][20*12*4], + int cols, + struct complex16 rxdataF_comp[][cols], + NR_DL_FRAME_PARMS *frame_parms, + uint32_t symbol, + uint8_t output_shift) { AssertFatal((symbol > 0 && symbol < 4), "symbol %d is illegal for PBCH DM-RS\n", symbol); @@ -326,15 +326,15 @@ void nr_pbch_detection_mrc(NR_DL_FRAME_PARMS *frame_parms, } static void nr_pbch_unscrambling(NR_UE_PBCH *pbch, - int16_t *demod_pbch_e, + int16_t *demod_pbch_e, uint16_t Nid, uint8_t nushift, uint16_t M, uint16_t length, uint8_t bitwise, - uint32_t unscrambling_mask, - uint32_t pbch_a_prime, - uint32_t *pbch_a_interleaved) { + uint32_t unscrambling_mask, + uint32_t pbch_a_prime, + uint32_t *pbch_a_interleaved) { uint8_t reset, offset; uint32_t x1, x2, s=0; uint8_t k=0; @@ -362,10 +362,10 @@ static void nr_pbch_unscrambling(NR_UE_PBCH *pbch, reset = 0; } - *pbch_a_interleaved ^= ((unscrambling_mask>>i)&1)? ((pbch_a_prime>>i)&1)<>i)&1) ^ ((s>>((k+offset)&0x1f))&1))<>i)&1)); + *pbch_a_interleaved ^= ((unscrambling_mask>>i)&1)? ((pbch_a_prime>>i)&1)<>i)&1) ^ ((s>>((k+offset)&0x1f))&1))<>i)&1)); #ifdef DEBUG_PBCH_ENCODING - printf("i %d k %d offset %d (unscrambling_mask>>i)&1) %d s: %08x\t pbch_a_interleaved 0x%08x (!((unscrambling_mask>>i)&1)) %d\n", i, k, offset, (unscrambling_mask>>i)&1, s, *pbch_a_interleaved, + printf("i %d k %d offset %d (unscrambling_mask>>i)&1) %d s: %08x\t pbch_a_interleaved 0x%08x (!((unscrambling_mask>>i)&1)) %d\n", i, k, offset, (unscrambling_mask>>i)&1, s, *pbch_a_interleaved, (!((unscrambling_mask>>i)&1))); #endif } else { @@ -388,17 +388,15 @@ static void nr_pbch_unscrambling(NR_UE_PBCH *pbch, } static void nr_pbch_quantize(int16_t *pbch_llr8, - int16_t *pbch_llr, - uint16_t len) { - uint16_t i; - - for (i=0; i31) pbch_llr8[i]=32; else if (pbch_llr[i]<-31) pbch_llr8[i]=-32; else - pbch_llr8[i] = (char)(pbch_llr[i]); + pbch_llr8[i]=pbch_llr[i]; } } /* @@ -411,33 +409,32 @@ uint8_t pbch_deinterleaving_pattern[32] = {28,0,31,30,7,29,25,27,5,8,24,9,10,11, int nr_rx_pbch( PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, - int estimateSz, struct complex16 dl_ch_estimates [][estimateSz], + int estimateSz, struct complex16 dl_ch_estimates [][estimateSz], NR_UE_PBCH *nr_ue_pbch_vars, NR_DL_FRAME_PARMS *frame_parms, uint8_t gNB_id, uint8_t i_ssb, MIMO_mode_t mimo_mode, - fapiPbch_t* result) { - + fapiPbch_t *result) { NR_UE_COMMON *nr_ue_common_vars = &ue->common_vars; int max_h=0; int symbol; //uint8_t pbch_a[64]; -//FT ?? cppcheck doesn't like pbch_a allocation because of line 525..and i don't get what this variable is for.. -//uint8_t *pbch_a = malloc(sizeof(uint8_t) * NR_POLAR_PBCH_PAYLOAD_BITS); + //FT ?? cppcheck doesn't like pbch_a allocation because of line 525..and i don't get what this variable is for.. + //uint8_t *pbch_a = malloc(sizeof(uint8_t) * NR_POLAR_PBCH_PAYLOAD_BITS); uint8_t nushift; uint16_t M; - uint8_t Lmax=frame_parms->Lmax; + uint8_t Lmax=frame_parms->Lmax; //uint16_t crc; //unsigned short idx_demod =0; uint32_t decoderState=0; //uint8_t decoderListSize = 8, pathMetricAppr = 0; //time_stats_t polar_decoder_init,polar_rate_matching,decoding,bit_extraction,deinterleaving; //time_stats_t path_metric,sorting,update_LLR; -// FT ?? cppcheck fix memset(&pbch_a[0], 0, sizeof(uint8_t) * NR_POLAR_PBCH_PAYLOAD_BITS); + // FT ?? cppcheck fix memset(&pbch_a[0], 0, sizeof(uint8_t) * NR_POLAR_PBCH_PAYLOAD_BITS); //printf("nr_pbch_ue nid_cell %d\n",frame_parms->Nid_cell); - - int16_t pbch_e_rx[960]={0}; //Fixme: previous version erase only NR_POLAR_PBCH_E bytes + int16_t pbch_e_rx[960]= {0}; //Fixme: previous version erase only NR_POLAR_PBCH_E bytes + int16_t pbch_unClipped[960]= {0}; int pbch_e_rx_idx=0; int symbol_offset=1; @@ -446,24 +443,22 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue, else symbol_offset=0; - #ifdef DEBUG_PBCH //printf("address dataf %p",nr_ue_common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF); write_output("rxdataF0_pbch.m","rxF0pbch", &nr_ue_common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[0][(symbol_offset+1)*frame_parms->ofdm_symbol_size],frame_parms->ofdm_symbol_size*3,1,1); #endif - // symbol refers to symbol within SSB. symbol_offset is the offset of the SSB wrt start of slot double log2_maxh; + for (symbol=1; symbol<4; symbol++) { const uint16_t nb_re=symbol == 2 ? 72 : 180; struct complex16 rxdataF_ext[frame_parms->nb_antennas_rx][20*12*4]; struct complex16 rxdataF_comp[frame_parms->nb_antennas_rx][nb_re]; //was dl_ch_estimates[idx] = (int32_t *)malloc16_clear( sizeof(int32_t)*7*2*sizeof(int)*(fp->ofdm_symbol_size) ); struct complex16 dl_ch_estimates_ext[frame_parms->nb_antennas_rx][20*12*4]; - nr_pbch_extract(nr_ue_common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF, - estimateSz, + estimateSz, dl_ch_estimates, rxdataF_ext, dl_ch_estimates_ext, @@ -487,7 +482,7 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue, #endif nr_pbch_channel_compensation(rxdataF_ext, dl_ch_estimates_ext, - nb_re, + nb_re, rxdataF_comp, frame_parms, symbol, @@ -510,34 +505,39 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue, nr_pbch_quantize(pbch_e_rx+pbch_e_rx_idx, (short *)rxdataF_comp[0], 144); + memcpy(pbch_unClipped+pbch_e_rx_idx, rxdataF_comp[0], 144*sizeof(int16_t)); pbch_e_rx_idx+=144; } else { nr_pbch_quantize(pbch_e_rx+pbch_e_rx_idx, (short *)rxdataF_comp[0], 360); + memcpy(pbch_unClipped+pbch_e_rx_idx, rxdataF_comp[0], 144*sizeof(int16_t)); pbch_e_rx_idx+=360; } } + // legacy code use int16, but it is complex16 + UEscopeCopy(ue, pbchRxdataF_comp, pbch_unClipped, sizeof(struct complex16), frame_parms->nb_antennas_rx, pbch_e_rx_idx/2); + UEscopeCopy(ue, pbchLlr, pbch_e_rx, sizeof(int16_t), frame_parms->nb_antennas_rx, pbch_e_rx_idx); #ifdef DEBUG_PBCH write_output("rxdataF_comp.m","rxFcomp",rxdataF_comp[0],240*3,1,1); #endif //demod_pbch_e = nr_ue_pbch_vars->demod_pbch_e; -// FT?? cppcheck fix - pbch_a = nr_ue_pbch_vars->pbch_a; + // FT?? cppcheck fix - pbch_a = nr_ue_pbch_vars->pbch_a; #ifdef DEBUG_PBCH short *p = (short *)rxdataF_comp[0]); -for (int cnt = 0; cnt < 864 ; cnt++) - printf("pbch rx llr %d\n",*(pbch_e_rx+cnt)); + for (int cnt = 0; cnt < 864 ; cnt++) +printf("pbch rx llr %d\n",*(pbch_e_rx+cnt)); #endif //un-scrambling -M = NR_POLAR_PBCH_E; -nushift = (Lmax==4)? i_ssb&3 : i_ssb&7; + M = NR_POLAR_PBCH_E; + nushift = (Lmax==4)? i_ssb&3 : i_ssb&7; uint32_t unscrambling_mask = (Lmax==64)?0x100006D:0x1000041; uint32_t pbch_a_interleaved=0; -uint32_t pbch_a_prime=0; -nr_pbch_unscrambling(nr_ue_pbch_vars,pbch_e_rx,frame_parms->Nid_cell,nushift,M,NR_POLAR_PBCH_E,0,0, pbch_a_prime, &pbch_a_interleaved); + uint32_t pbch_a_prime=0; + nr_pbch_unscrambling(nr_ue_pbch_vars,pbch_e_rx,frame_parms->Nid_cell,nushift,M,NR_POLAR_PBCH_E,0,0, pbch_a_prime, &pbch_a_interleaved); //polar decoding de-rate matching const t_nrPolar_params *currentPtr = nr_polar_params( NR_POLAR_PBCH_MESSAGE_TYPE, NR_POLAR_PBCH_PAYLOAD_BITS, NR_POLAR_PBCH_AGGREGATION_LEVEL,1,&ue->polarList); decoderState = polar_decoder_int16(pbch_e_rx,(uint64_t *)&pbch_a_prime,0,currentPtr); @@ -549,20 +549,20 @@ nr_pbch_unscrambling(nr_ue_pbch_vars,pbch_e_rx,frame_parms->Nid_cell,nushift,M,N uint32_t a_reversed=0; for (int i=0; i>i)&1)<<(31-i); +a_reversed |= (((uint64_t)pbch_a_prime>>i)&1)<<(31-i); pbch_a_prime = a_reversed; //payload un-scrambling M = (Lmax == 64)? (NR_POLAR_PBCH_PAYLOAD_BITS - 6) : (NR_POLAR_PBCH_PAYLOAD_BITS - 3); nushift = ((pbch_a_prime>>24)&1) ^ (((pbch_a_prime>>6)&1)<<1); -nr_pbch_unscrambling(nr_ue_pbch_vars,pbch_e_rx,frame_parms->Nid_cell,nushift,M,NR_POLAR_PBCH_PAYLOAD_BITS,1,unscrambling_mask,pbch_a_prime, &pbch_a_interleaved); + nr_pbch_unscrambling(nr_ue_pbch_vars,pbch_e_rx,frame_parms->Nid_cell,nushift,M,NR_POLAR_PBCH_PAYLOAD_BITS,1,unscrambling_mask,pbch_a_prime, &pbch_a_interleaved); //printf("nushift %d sfn 3rd %d 2nd %d", nushift,((pbch_a_prime>>6)&1), ((pbch_a_prime>>24)&1) ); //payload deinterleaving //uint32_t in=0; uint32_t out=0; for (int i=0; i<32; i++) { - out |= ((pbch_a_interleaved>>i)&1)<<(pbch_deinterleaving_pattern[i]); + out |= ((pbch_a_interleaved>>i)&1)<<(pbch_deinterleaving_pattern[i]); #ifdef DEBUG_PBCH printf("i %d in 0x%08x out 0x%08x ilv %d (in>>i)&1) 0x%08x\n", i, pbch_a_interleaved, out, pbch_deinterleaving_pattern[i], (pbch_a_interleaved>>i)&1); #endif @@ -572,29 +572,30 @@ nr_pbch_unscrambling(nr_ue_pbch_vars,pbch_e_rx,frame_parms->Nid_cell,nushift,M,N result->xtra_byte = (out>>24)&0xff; for (int i=0; i>i)&1)<<(NR_POLAR_PBCH_PAYLOAD_BITS-i-1); +payload |= ((out>>i)&1)<<(NR_POLAR_PBCH_PAYLOAD_BITS-i-1); for (int i=0; i<3; i++) - result->decoded_output[i] = (uint8_t)((payload>>((3-i)<<3))&0xff); - -frame_parms->half_frame_bit = (result->xtra_byte>>4)&0x01; // computing the half frame index from the extra byte +result->decoded_output[i] = (uint8_t)((payload>>((3-i)<<3))&0xff); + frame_parms->half_frame_bit = (result->xtra_byte>>4)&0x01; // computing the half frame index from the extra byte frame_parms->ssb_index = i_ssb; // ssb index corresponds to i_ssb for Lmax = 4,8 + if (Lmax == 64) { // for Lmax = 64 ssb index 4th,5th and 6th bits are in extra byte - for (int i=0; i<3; i++) + for (int i=0; i<3; i++) frame_parms->ssb_index += (((result->xtra_byte>>(7-i))&0x01)<<(3+i)); } ue->symbol_offset = nr_get_ssb_start_symbol(frame_parms,frame_parms->ssb_index); + if (frame_parms->half_frame_bit) - ue->symbol_offset += (frame_parms->slots_per_frame>>1)*frame_parms->symbols_per_slot; + ue->symbol_offset += (frame_parms->slots_per_frame>>1)*frame_parms->symbols_per_slot; uint8_t frame_number_4lsb = 0; + for (int i=0; i<4; i++) - frame_number_4lsb |= ((result->xtra_byte>>i)&1)<<(3-i); +frame_number_4lsb |= ((result->xtra_byte>>i)&1)<<(3-i); proc->decoded_frame_rx = frame_number_4lsb; - #ifdef DEBUG_PBCH printf("xtra_byte %x payload %x\n", xtra_byte, payload); @@ -602,18 +603,16 @@ frame_parms->half_frame_bit = (result->xtra_byte>>4)&0x01; // computing the half // printf("unscrambling pbch_a[%d] = %x \n", i,pbch_a[i]); printf("[PBCH] decoder payload[%d] = %x\n",i,result->decoded_output[i]); } + #endif - nr_downlink_indication_t dl_indication; -fapi_nr_rx_indication_t *rx_ind = calloc(1, sizeof(*rx_ind)); -uint16_t number_pdus = 1; - -nr_fill_dl_indication(&dl_indication, NULL, rx_ind, proc, ue, gNB_id); - -nr_fill_rx_indication(rx_ind, FAPI_NR_RX_PDU_TYPE_SSB, gNB_id, ue, NULL, NULL, number_pdus, proc,(void*)result); + fapi_nr_rx_indication_t *rx_ind = calloc(1, sizeof(*rx_ind)); + uint16_t number_pdus = 1; + nr_fill_dl_indication(&dl_indication, NULL, rx_ind, proc, ue, gNB_id); + nr_fill_rx_indication(rx_ind, FAPI_NR_RX_PDU_TYPE_SSB, gNB_id, ue, NULL, NULL, number_pdus, proc,(void *)result); if (ue->if_inst && ue->if_inst->dl_indication) - ue->if_inst->dl_indication(&dl_indication, NULL); + ue->if_inst->dl_indication(&dl_indication, NULL); return 0; } diff --git a/openair1/PHY/TOOLS/nr_phy_scope.c b/openair1/PHY/TOOLS/nr_phy_scope.c index a31414946f..fe0f785ef4 100644 --- a/openair1/PHY/TOOLS/nr_phy_scope.c +++ b/openair1/PHY/TOOLS/nr_phy_scope.c @@ -41,6 +41,10 @@ typedef struct complex16 scopeSample_t; #define SquaredNorm(VaR) ((VaR).r*(VaR).r+(VaR).i*(VaR).i) typedef struct { + int dataSize; + int elementSz; + int colSz; + int lineSz; } scopeGraphData_t; typedef struct OAIgraph { @@ -59,7 +63,7 @@ typedef struct OAIgraph { boolean_t initDone; int iteration; void (*gNBfunct) (struct OAIgraph *graph, scopeData_t *p, int UE_id); - void (*nrUEfunct)(scopeGraphData_t** data, struct OAIgraph *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id); + void (*nrUEfunct)(scopeGraphData_t **data, struct OAIgraph *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id); } OAIgraph_t; /* Forms and Objects */ @@ -546,7 +550,7 @@ static void *scope_thread_gNB(void *arg) { static void copyRxdataF(int32_t *data, int slot, void *scopeData) { scopeData_t *scope=(scopeData_t *)scopeData; - memcpy(((int32_t*)scope->liveData) + slot*scope->gNB->frame_parms.samples_per_slot_wCP, + memcpy(((int32_t *)scope->liveData) + slot*scope->gNB->frame_parms.samples_per_slot_wCP, data, scope->gNB->frame_parms.samples_per_slot_wCP*sizeof(int32_t)); } @@ -584,10 +588,11 @@ static void ueChannelResponse (scopeGraphData_t **data, OAIgraph_t *graph, PHY_ // Channel Impulse Response if (!data[pbchDlChEstimateTime]) return; - - genericPowerPerAntena(graph, phy_vars_ue->frame_parms.nb_antennas_rx, - (const scopeSample_t **) &data[pbchDlChEstimateTime], - phy_vars_ue->frame_parms.ofdm_symbol_size>>3); + + const scopeSample_t *tmp=(scopeSample_t *)(data[pbchDlChEstimateTime]+1); + genericPowerPerAntena(graph, data[pbchDlChEstimateTime]->colSz, + &tmp, + data[pbchDlChEstimateTime]->lineSz); } static void ueFreqWaterFall (scopeGraphData_t **data, OAIgraph_t *graph,PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id ) { @@ -639,51 +644,38 @@ static void uePbchLLR (scopeGraphData_t **data, OAIgraph_t *graph, PHY_VARS_NR_ if ( !data[pbchLlr]) return; - int16_t *pbch_llr = (int16_t *)data[pbchLlr]; + const int sz=data[pbchLlr]->lineSz; + //const int antennas=data[pbchLlr]->colSz; + // We take the first antenna only for now + int16_t *llrs = (int16_t *) (data[pbchLlr]+1); float *llr_pbch, *bit_pbch; - oai_xygraph_getbuff(graph, &bit_pbch, &llr_pbch, 864, 0); + oai_xygraph_getbuff(graph, &bit_pbch, &llr_pbch, sz, 0); - for (int i=0; i<864; i++) { - llr_pbch[i] = (float) pbch_llr[i]; + for (int i=0; ilineSz; float *I, *Q; - oai_xygraph_getbuff(graph, &I, &Q, 180*3, 0); - memset(I,0,180*3*sizeof(*I)); - memset(Q,0,180*3*sizeof(*Q)); - int first_symbol=1; - int base=0; + oai_xygraph_getbuff(graph, &I, &Q, sz, 0); - for (int symbol=first_symbol; symbol<(first_symbol+3); symbol++) { - int nb_re; - - if (symbol == 2 || symbol == 6) - nb_re = 72; - else - nb_re = 180; - - AssertFatal(base+nb_re<180*3,""); - - for (int i=0; ipdcch_vars[0][eNB_id]->llr) @@ -882,7 +874,7 @@ static OAI_phy_scope_t *create_phy_scope_nrue( int ID ) { } void phy_scope_nrUE(scopeGraphData_t **UEliveData, - OAI_phy_scope_t *form, + OAI_phy_scope_t *form, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) { @@ -909,20 +901,19 @@ void phy_scope_nrUE(scopeGraphData_t **UEliveData, static void *nrUEscopeThread(void *arg) { PHY_VARS_NR_UE *ue=(PHY_VARS_NR_UE *)arg; size_t stksize; - pthread_attr_t atr={0}; + pthread_attr_t atr= {0}; pthread_attr_getstacksize(&atr, &stksize); pthread_attr_setstacksize(&atr,32*1024*1024 ); int fl_argc=1; char *name="5G-UE-scope"; fl_initialize (&fl_argc, &name, NULL, 0, 0); OAI_phy_scope_t *form_nrue=create_phy_scope_nrue(0); + (( scopeData_t *)ue->scopeData)->liveData=calloc(sizeof(scopeGraphData_t *), UEdataTypeNumberOfItems); - scopeGraphData_t *UEliveData[UEdataTypeNumberOfItems]; - while (!oai_exit) { fl_freeze_form(form_nrue->phy_scope); - phy_scope_nrUE(UEliveData, - form_nrue, + phy_scope_nrUE((( scopeData_t *)ue->scopeData)->liveData, + form_nrue, ue, 0,0); fl_unfreeze_form(form_nrue->phy_scope); @@ -933,8 +924,30 @@ static void *nrUEscopeThread(void *arg) { pthread_exit((void *)arg); } -void UEcopyData(enum UEdataType type, void * data, int elementSz, int colSz, int lineSz) { - +void UEcopyData(PHY_VARS_NR_UE *ue, enum UEdataType type, void *dataIn, int elementSz, int colSz, int lineSz) { + scopeData_t *tmp=(scopeData_t *)ue->scopeData; + + if (tmp) { + scopeGraphData_t *live= ((scopeGraphData_t **)tmp->liveData)[type]; + + if (live == NULL || live->dataSize < elementSz*colSz*lineSz) { + scopeGraphData_t *ptr=realloc(live, sizeof(scopeGraphData_t) + elementSz*colSz*lineSz); + + if (!ptr) { + LOG_E(PHY,"can't realloc\n"); + return; + } else { + live=ptr; + } + } + + live->dataSize=elementSz*colSz*lineSz; + live->elementSz=elementSz; + live->colSz=colSz; + live->lineSz=lineSz; + memcpy(live+1, dataIn, elementSz*colSz*lineSz); + ((scopeGraphData_t **)tmp->liveData)[type]=live; + } } void nrUEinitScope(PHY_VARS_NR_UE *ue) { @@ -942,7 +955,7 @@ void nrUEinitScope(PHY_VARS_NR_UE *ue) { scopeData_t *scope=(scopeData_t *) ue->scopeData; scope->copyData=UEcopyData; pthread_t forms_thread; - threadCreate(&forms_thread, nrUEscopeThread, ue, "scope", -1, OAI_PRIORITY_RT_LOW); + threadCreate(&forms_thread, nrUEscopeThread, ue, "scope", -1, OAI_PRIORITY_RT_LOW); } void nrscope_autoinit(void *dataptr) { diff --git a/openair1/PHY/TOOLS/phy_scope_interface.h b/openair1/PHY/TOOLS/phy_scope_interface.h index 1ba6bb558d..9cd8e1dc40 100644 --- a/openair1/PHY/TOOLS/phy_scope_interface.h +++ b/openair1/PHY/TOOLS/phy_scope_interface.h @@ -32,6 +32,7 @@ #ifndef __PHY_SCOPE_INTERFACE_H__ #define __PHY_SCOPE_INTERFACE_H__ #include +#include typedef struct { int *argc; @@ -52,13 +53,13 @@ typedef struct scopeData_s { char **argv; RU_t *ru; PHY_VARS_gNB *gNB; - void * liveData; - void (*slotFunc)(int32_t* data, int slot, void * scopeData); - void (*copyData)(enum UEdataType, void * data, int elementSz, int colSz, int lineSz); + void *liveData; + void (*slotFunc)(int32_t *data, int slot, void *scopeData); + void (*copyData)(PHY_VARS_NR_UE *,enum UEdataType, void *data, int elementSz, int colSz, int lineSz); } scopeData_t; int load_softscope(char *exectype, void *initarg); int end_forms(void) ; -#define scopeCopy(ue, type, ...) if(ue->scopeData) ((scopeData_t*)ue->scopeData)->copyData(type, ##__VA_ARGS__); +#define UEscopeCopy(ue, type, ...) if(ue->scopeData) ((scopeData_t*)ue->scopeData)->copyData(ue, type, ##__VA_ARGS__); #endif diff --git a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c index c7b54950d7..3f263c08fe 100644 --- a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c +++ b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c @@ -1170,7 +1170,7 @@ int nr_ue_dl_indication(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_ (dl_info->rx_ind->rx_indication_body+i)->ssb_pdu.ssb_length, (dl_info->rx_ind->rx_indication_body+i)->ssb_pdu.ssb_start_subcarrier, (dl_info->rx_ind->rx_indication_body+i)->ssb_pdu.cell_id)) << FAPI_NR_RX_PDU_TYPE_SSB; - + free((dl_info->rx_ind->rx_indication_body+i)->ssb_pdu.pdu); break; case FAPI_NR_RX_PDU_TYPE_SIB: ret_mask |= (handle_bcch_dlsch(dl_info->module_id, From 8e3f720b7db6786c8358560f93884f86a3d2181e Mon Sep 17 00:00:00 2001 From: Laurent THOMAS Date: Wed, 16 Feb 2022 14:49:19 +0100 Subject: [PATCH 42/96] fix unaligned mem for SIMD --- common/utils/LOG/log.h | 2 +- openair1/PHY/CODING/crc_byte.c | 4 +-- openair1/PHY/NR_REFSIG/nr_gold_ue.c | 4 +-- .../PHY/NR_UE_TRANSPORT/nr_initial_sync.c | 6 ++-- openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c | 5 +++- openair1/PHY/NR_UE_TRANSPORT/pss_nr.c | 2 +- openair1/SCHED_NR_UE/phy_procedures_nr_ue.c | 4 +-- openair1/SIMULATION/NR_PHY/pbchsim.c | 29 ++++++++----------- openair2/UTIL/LISTS/list.c | 2 +- openair2/UTIL/LISTS/list2.c | 2 +- 10 files changed, 29 insertions(+), 31 deletions(-) diff --git a/common/utils/LOG/log.h b/common/utils/LOG/log.h index 46c73427c1..9a2c92bb10 100644 --- a/common/utils/LOG/log.h +++ b/common/utils/LOG/log.h @@ -346,7 +346,7 @@ typedef struct { @param format data format (0 = real 16-bit, 1 = complex 16-bit,2 real 32-bit, 3 complex 32-bit,4 = real 8-bit, 5 = complex 8-bit) @param multiVec create new file or append to existing (useful for writing multiple vectors to same file. Just call the function multiple times with same file name and with this parameter set to 1) */ -#define MATLAB_RAW (1<<31) +#define MATLAB_RAW (1U<<31) #define MATLAB_SHORT 0 #define MATLAB_CSHORT 1 #define MATLAB_INT 2 diff --git a/openair1/PHY/CODING/crc_byte.c b/openair1/PHY/CODING/crc_byte.c index 7e37abcf81..9ad18cc1a6 100644 --- a/openair1/PHY/CODING/crc_byte.c +++ b/openair1/PHY/CODING/crc_byte.c @@ -72,10 +72,10 @@ unsigned int crcbit (unsigned char * inputptr, unsigned int i, crc = 0, c; while (octetlen-- > 0) { - c = (*inputptr++) << 24; + c = ((unsigned int)(*inputptr++)) << 24; for (i = 8; i != 0; i--) { - if ((1 << 31) & (c ^ crc)) + if ((1U << 31) & (c ^ crc)) crc = (crc << 1) ^ poly; else crc <<= 1; diff --git a/openair1/PHY/NR_REFSIG/nr_gold_ue.c b/openair1/PHY/NR_REFSIG/nr_gold_ue.c index 623b86edfb..e949faeaf0 100644 --- a/openair1/PHY/NR_REFSIG/nr_gold_ue.c +++ b/openair1/PHY/NR_REFSIG/nr_gold_ue.c @@ -64,7 +64,7 @@ void nr_gold_pdcch(PHY_VARS_NR_UE* ue, reset = 1; x2tmp0 = ((ue->frame_parms.symbols_per_slot*ns+l+1)*((nid<<1)+1))<<17; - x2 = (x2tmp0+(nid<<1))%(1<<31); //cinit + x2 = (x2tmp0+(nid<<1))%(1U<<31); //cinit for (n=0; nnr_gold_pdcch[0][ns][l][n] = lte_gold_generic(&x1, &x2, reset); @@ -95,7 +95,7 @@ void nr_gold_pdsch(PHY_VARS_NR_UE* ue, reset = 1; x2tmp0 = ((ue->frame_parms.symbols_per_slot*ns+l+1)*((nid<<1)+1))<<17; - x2 = (x2tmp0+(nid<<1)+nscid)%(1<<31); //cinit + x2 = (x2tmp0+(nid<<1)+nscid)%(1U<<31); //cinit LOG_D(PHY,"UE DMRS slot %d, symb %d, x2 %x, nscid %d\n",ns,l,x2,nscid); for (n=0; ndlsch_channel_estimation_stats); // computing channel estimation for selected best ssb - const int estimateSz=7*2*sizeof(int)*frame_parms->ofdm_symbol_size; - struct complex16 dl_ch_estimates[frame_parms->nb_antennas_rx][estimateSz]; - struct complex16 dl_ch_estimates_time[frame_parms->nb_antennas_rx][estimateSz]; + const int estimateSz=7*2*frame_parms->ofdm_symbol_size; + __attribute__ ((aligned(32))) struct complex16 dl_ch_estimates[frame_parms->nb_antennas_rx][estimateSz]; + __attribute__ ((aligned(32))) struct complex16 dl_ch_estimates_time[frame_parms->nb_antennas_rx][estimateSz]; for(int i=pbch_initial_symbol; ii_ssb,temp_ptr->n_hf); diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c b/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c index 0073e8344d..c06dec7fcb 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c @@ -457,6 +457,7 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue, struct complex16 rxdataF_comp[frame_parms->nb_antennas_rx][nb_re]; //was dl_ch_estimates[idx] = (int32_t *)malloc16_clear( sizeof(int32_t)*7*2*sizeof(int)*(fp->ofdm_symbol_size) ); struct complex16 dl_ch_estimates_ext[frame_parms->nb_antennas_rx][20*12*4]; + memset(dl_ch_estimates_ext,0, sizeof dl_ch_estimates_ext); nr_pbch_extract(nr_ue_common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF, estimateSz, dl_ch_estimates, @@ -540,7 +541,9 @@ printf("pbch rx llr %d\n",*(pbch_e_rx+cnt)); nr_pbch_unscrambling(nr_ue_pbch_vars,pbch_e_rx,frame_parms->Nid_cell,nushift,M,NR_POLAR_PBCH_E,0,0, pbch_a_prime, &pbch_a_interleaved); //polar decoding de-rate matching const t_nrPolar_params *currentPtr = nr_polar_params( NR_POLAR_PBCH_MESSAGE_TYPE, NR_POLAR_PBCH_PAYLOAD_BITS, NR_POLAR_PBCH_AGGREGATION_LEVEL,1,&ue->polarList); - decoderState = polar_decoder_int16(pbch_e_rx,(uint64_t *)&pbch_a_prime,0,currentPtr); +uint64_t tmp=pbch_a_prime; +decoderState = polar_decoder_int16(pbch_e_rx,&tmp,0,currentPtr); +pbch_a_prime=tmp; if(decoderState) return(decoderState); diff --git a/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c b/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c index 28b6677b2c..0b1f374a52 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c +++ b/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c @@ -883,7 +883,7 @@ int pss_search_time_nr(int **rxdata, ///rx data in time domain /* perform correlation of rx data and pss sequence ie it is a dot product */ result = dot_product64((short*)primary_synchro_time_nr[pss_index], - (short*) &(rxdata[ar][n+is*frame_parms->samples_per_frame]), + (short*)&(rxdata[ar][n+is*frame_parms->samples_per_frame]), frame_parms->ofdm_symbol_size, shift); pss_corr_ue[pss_index][n] += abs64(result); diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c index 12a8ce0d08..bbf4617207 100644 --- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c +++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c @@ -1404,8 +1404,8 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue, VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP_PBCH, VCD_FUNCTION_IN); LOG_D(PHY," ------ PBCH ChannelComp/LLR: frame.slot %d.%d ------ \n", frame_rx%1024, nr_slot_rx); const int estimateSz=7*2*sizeof(int)*fp->ofdm_symbol_size; - struct complex16 dl_ch_estimates[fp->nb_antennas_rx][estimateSz]; - struct complex16 dl_ch_estimates_time[fp->nb_antennas_rx][estimateSz]; + __attribute__ ((aligned(32))) struct complex16 dl_ch_estimates[fp->nb_antennas_rx][estimateSz]; + __attribute__ ((aligned(32))) struct complex16 dl_ch_estimates_time[fp->nb_antennas_rx][estimateSz]; for (int i=1; i<4; i++) { nr_slot_fep(ue, diff --git a/openair1/SIMULATION/NR_PHY/pbchsim.c b/openair1/SIMULATION/NR_PHY/pbchsim.c index 692d1bac20..a314f7b397 100644 --- a/openair1/SIMULATION/NR_PHY/pbchsim.c +++ b/openair1/SIMULATION/NR_PHY/pbchsim.c @@ -430,13 +430,14 @@ int main(int argc, char **argv) printf("Initializing gNodeB for mu %d, N_RB_DL %d\n",mu,N_RB_DL); - RC.gNB = (PHY_VARS_gNB**) malloc(sizeof(PHY_VARS_gNB *)); + RC.gNB = (PHY_VARS_gNB**) calloc(sizeof(PHY_VARS_gNB *),1); RC.gNB[0] = malloc(sizeof(PHY_VARS_gNB)); gNB = RC.gNB[0]; gNB->ofdm_offset_divisor = UINT_MAX; frame_parms = &gNB->frame_parms; //to be initialized I suppose (maybe not necessary for PBCH) frame_parms->nb_antennas_tx = n_tx; frame_parms->nb_antennas_rx = n_rx; + frame_parms->nb_antenna_ports_gNB=n_rx; frame_parms->N_RB_DL = N_RB_DL; frame_parms->Nid_cell = Nid_cell; frame_parms->nushift = Nid_cell%4; @@ -522,23 +523,17 @@ int main(int argc, char **argv) s_im = malloc(2*sizeof(double*)); r_re = malloc(2*sizeof(double*)); r_im = malloc(2*sizeof(double*)); - txdata = malloc(2*sizeof(int*)); + txdata = calloc(2,sizeof(int*)); for (i=0; i<2; i++) { - s_re[i] = malloc(frame_length_complex_samples*sizeof(double)); - bzero(s_re[i],frame_length_complex_samples*sizeof(double)); - s_im[i] = malloc(frame_length_complex_samples*sizeof(double)); - bzero(s_im[i],frame_length_complex_samples*sizeof(double)); - - r_re[i] = malloc(frame_length_complex_samples*sizeof(double)); - bzero(r_re[i],frame_length_complex_samples*sizeof(double)); - r_im[i] = malloc(frame_length_complex_samples*sizeof(double)); - bzero(r_im[i],frame_length_complex_samples*sizeof(double)); + s_re[i] = calloc(frame_length_complex_samples, sizeof(double)); + s_im[i] = calloc(frame_length_complex_samples, sizeof(double)); + r_re[i] = calloc(frame_length_complex_samples, sizeof(double)); + r_im[i] = calloc(frame_length_complex_samples, sizeof(double)); printf("Allocating %d samples for txdata\n",frame_length_complex_samples); - txdata[i] = malloc(frame_length_complex_samples*sizeof(int)); - bzero(r_re[i],frame_length_complex_samples*sizeof(int)); + txdata[i] = calloc(frame_length_complex_samples, sizeof(int)); } if (pbch_file_fd!=NULL) { @@ -547,8 +542,8 @@ int main(int argc, char **argv) //configure UE - UE = malloc(sizeof(PHY_VARS_NR_UE)); - memcpy(&UE->frame_parms,frame_parms,sizeof(NR_DL_FRAME_PARMS)); + UE = calloc(1,sizeof(*UE)); + memcpy(&UE->frame_parms,frame_parms,sizeof(*frame_parms)); //phy_init_nr_top(UE); //called from init_nr_ue_signal if (run_initial_sync==1) UE->is_synchronized = 0; else UE->is_synchronized = 1; @@ -721,8 +716,8 @@ int main(int argc, char **argv) UE->rx_offset=0; uint8_t ssb_index = 0; const int estimateSz=7*2*sizeof(int)*frame_parms->ofdm_symbol_size; - struct complex16 dl_ch_estimates[frame_parms->nb_antennas_rx][estimateSz]; - struct complex16 dl_ch_estimates_time[frame_parms->nb_antennas_rx][estimateSz]; + __attribute__ ((aligned(32))) struct complex16 dl_ch_estimates[frame_parms->nb_antennas_rx][estimateSz]; + __attribute__ ((aligned(32))) struct complex16 dl_ch_estimates_time[frame_parms->nb_antennas_rx][estimateSz]; while (!((SSB_positions >> ssb_index) & 0x01)) ssb_index++; // to select the first transmitted ssb UE->symbol_offset = nr_get_ssb_start_symbol(frame_parms,ssb_index); diff --git a/openair2/UTIL/LISTS/list.c b/openair2/UTIL/LISTS/list.c index 65f70c0786..578833edba 100644 --- a/openair2/UTIL/LISTS/list.c +++ b/openair2/UTIL/LISTS/list.c @@ -43,7 +43,7 @@ list_init (list_t * listP, char *nameP) { //----------------------------------------------------------------------------- if (nameP) { - strncpy( listP->name, nameP, LIST_NAME_MAX_CHAR ); + strncpy( listP->name, nameP, LIST_NAME_MAX_CHAR-1 ); listP->name[LIST_NAME_MAX_CHAR-1] = 0; // terminate string } diff --git a/openair2/UTIL/LISTS/list2.c b/openair2/UTIL/LISTS/list2.c index 3f0a59df53..d9aa1b6a90 100644 --- a/openair2/UTIL/LISTS/list2.c +++ b/openair2/UTIL/LISTS/list2.c @@ -53,7 +53,7 @@ list2_init (list2_t * listP, char *nameP) { //----------------------------------------------------------------------------- if (nameP) { - strncpy( listP->name, nameP, LIST_NAME_MAX_CHAR ); + strncpy( listP->name, nameP, LIST_NAME_MAX_CHAR-1 ); listP->name[LIST_NAME_MAX_CHAR-1] = 0; // terminate string } From 2cc96f5025fa49981f73abc11b4aab481712d932 Mon Sep 17 00:00:00 2001 From: francescomani Date: Fri, 18 Feb 2022 11:11:48 +0100 Subject: [PATCH 43/96] log level fix for ptrs in dlsim --- openair1/PHY/NR_TRANSPORT/nr_dlsch.c | 2 +- openair1/SIMULATION/NR_PHY/dlsim.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c index 104aee94f0..e6e53c20b3 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c @@ -295,7 +295,7 @@ void nr_generate_pdsch(processingData_L1tx_t *msgTx, ptrs_symbol = is_ptrs_symbol(l,dlPtrsSymPos); if(ptrs_symbol) { /* PTRS QPSK Modulation for each OFDM symbol in a slot */ - printf("Doing ptrs modulation for symbol %d, n_ptrs %d\n",l,n_ptrs); + LOG_D(PHY,"Doing ptrs modulation for symbol %d, n_ptrs %d\n",l,n_ptrs); nr_modulation(pdsch_dmrs[l][0], (n_ptrs<<1), DMRS_MOD_ORDER, mod_ptrs); } } diff --git a/openair1/SIMULATION/NR_PHY/dlsim.c b/openair1/SIMULATION/NR_PHY/dlsim.c index b8f51f8e95..a152760ac2 100644 --- a/openair1/SIMULATION/NR_PHY/dlsim.c +++ b/openair1/SIMULATION/NR_PHY/dlsim.c @@ -1091,7 +1091,7 @@ int main(int argc, char **argv) pdsch_pdu_rel15->dlDmrsSymbPos); ptrsSymbPerSlot = get_ptrs_symbols_in_slot(dlPtrsSymPos, pdsch_pdu_rel15->StartSymbolIndex, pdsch_pdu_rel15->NrOfSymbols); ptrsRePerSymb = ((rel15->rbSize + rel15->PTRSFreqDensity - 1)/rel15->PTRSFreqDensity); - printf("[DLSIM] PTRS Symbols in a slot: %2u, RE per Symbol: %3u, RE in a slot %4d\n", ptrsSymbPerSlot,ptrsRePerSymb, ptrsSymbPerSlot*ptrsRePerSymb ); + LOG_D(PHY,"[DLSIM] PTRS Symbols in a slot: %2u, RE per Symbol: %3u, RE in a slot %4d\n", ptrsSymbPerSlot,ptrsRePerSymb, ptrsSymbPerSlot*ptrsRePerSymb ); } msgDataTx->ssb[0].ssb_pdu.ssb_pdu_rel15.bchPayload=0x001234; @@ -1248,7 +1248,7 @@ int main(int argc, char **argv) available_bits = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs, mod_order, rel15->nrOfLayers); if(pdu_bit_map & 0x1) { available_bits-= (ptrsSymbPerSlot * ptrsRePerSymb *rel15->nrOfLayers* 2); - printf("[DLSIM][PTRS] Available bits are: %5u, removed PTRS bits are: %5u \n",available_bits, (ptrsSymbPerSlot * ptrsRePerSymb *rel15->nrOfLayers* 2) ); + LOG_D(PHY,"[DLSIM][PTRS] Available bits are: %5u, removed PTRS bits are: %5u \n",available_bits, (ptrsSymbPerSlot * ptrsRePerSymb *rel15->nrOfLayers* 2) ); } /* From dca9be3c33fb7853056a10192fb677c915b7472c Mon Sep 17 00:00:00 2001 From: Laurent THOMAS Date: Fri, 18 Feb 2022 16:10:10 +0100 Subject: [PATCH 44/96] code review comments (incl. actual bugs) --- openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c | 166 ++++++++++--------------- 1 file changed, 67 insertions(+), 99 deletions(-) diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c b/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c index c06dec7fcb..5072741981 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c @@ -45,14 +45,15 @@ //#include "PHY_INTERFACE/defs.h" #define PBCH_A 24 - +#define PBCH_MAX_RE_PER_SYMBOL (20*12) +#define PBCH_MAX_RE (PBCH_MAX_RE_PER_SYMBOL*4) #define print_shorts(s,x) printf("%s : %d,%d,%d,%d,%d,%d,%d,%d\n",s,((int16_t*)x)[0],((int16_t*)x)[1],((int16_t*)x)[2],((int16_t*)x)[3],((int16_t*)x)[4],((int16_t*)x)[5],((int16_t*)x)[6],((int16_t*)x)[7]) static uint16_t nr_pbch_extract(int **rxdataF, const int estimateSz, struct complex16 dl_ch_estimates[][estimateSz], - struct complex16 rxdataF_ext[][20*12*4], - struct complex16 dl_ch_estimates_ext[][20*12*4], + struct complex16 rxdataF_ext[][PBCH_MAX_RE_PER_SYMBOL], + struct complex16 dl_ch_estimates_ext[][PBCH_MAX_RE_PER_SYMBOL], uint32_t symbol, uint32_t s_offset, NR_DL_FRAME_PARMS *frame_parms) { @@ -90,12 +91,11 @@ static uint16_t nr_pbch_extract(int **rxdataF, (i!=(nushiftmod4+8))) { rxF_ext[j]=rxF[rx_offset]; #ifdef DEBUG_PBCH - printf("rxF ext[%d] = (%d,%d) rxF [%u]= (%d,%d)\n",(9*rb) + j, - ((int16_t *)&rxF_ext[j])[0], - ((int16_t *)&rxF_ext[j])[1], + printf("rxF ext[%d] = (%d,%d) rxF [%u]= (%d,%d)\n", + (9*rb) + j, + rxF_ext[j].r, rxF_ext[j].i, rx_offset, - ((int16_t *)&rxF[rx_offset])[0], - ((int16_t *)&rxF[rx_offset])[1]); + rxF[rx_offset].r,rxF[rx_offset].j; #endif j++; } @@ -114,11 +114,9 @@ static uint16_t nr_pbch_extract(int **rxdataF, rxF_ext[j]=rxF[rx_offset]; #ifdef DEBUG_PBCH printf("rxF ext[%d] = (%d,%d) rxF [%u]= (%d,%d)\n",(rb<4) ? (9*rb) + j : (9*(rb-12))+j, - ((int16_t *)&rxF_ext[j])[0], - ((int16_t *)&rxF_ext[j])[1], + rxF_ext[j].r, rxF_ext[j].i, rx_offset, - ((int16_t *)&rxF[rx_offset])[0], - ((int16_t *)&rxF[rx_offset])[1]); + rxF[rx_offset].r,rxF[rx_offset].j; #endif j++; } @@ -137,7 +135,7 @@ static uint16_t nr_pbch_extract(int **rxdataF, struct complex16 *dl_ch0 = &dl_ch_estimates[aarx][((symbol+s_offset)*(frame_parms->ofdm_symbol_size))]; //printf("dl_ch0 addr %p\n",dl_ch0); - struct complex16 *dl_ch0_ext = &dl_ch_estimates_ext[aarx][symbol*20*12]; + struct complex16 *dl_ch0_ext = dl_ch_estimates_ext[aarx]; for (rb=0; rb<20; rb++) { j=0; @@ -149,15 +147,11 @@ static uint16_t nr_pbch_extract(int **rxdataF, (i!=(nushiftmod4+8))) { dl_ch0_ext[j]=dl_ch0[i]; #ifdef DEBUG_PBCH - if ((rb==0) && (i<2)) printf("dl ch0 ext[%d] = (%d,%d) dl_ch0 [%d]= (%d,%d)\n",j, - ((int16_t *)&dl_ch0_ext[j])[0], - ((int16_t *)&dl_ch0_ext[j])[1], + dl_ch0_ext[j].r, dl_ch0_ext[j].i, i, - ((int16_t *)&dl_ch0[i])[0], - ((int16_t *)&dl_ch0[i])[1]); - + dl_ch0[j].r, dl_ch0[j].i, #endif j++; } @@ -174,11 +168,9 @@ static uint16_t nr_pbch_extract(int **rxdataF, dl_ch0_ext[j]=dl_ch0[i]; #ifdef DEBUG_PBCH printf("dl ch0 ext[%d] = (%d,%d) dl_ch0 [%d]= (%d,%d)\n",j, - ((int16_t *)&dl_ch0_ext[j])[0], - ((int16_t *)&dl_ch0_ext[j])[1], + dl_ch0_ext[j].r, dl_ch0_ext[j].i, i, - ((int16_t *)&dl_ch0[i])[0], - ((int16_t *)&dl_ch0[i])[1]); + dl_ch0[j].r, dl_ch0[j].i, #endif j++; } @@ -198,11 +190,10 @@ static uint16_t nr_pbch_extract(int **rxdataF, //__m128i avg128; //compute average channel_level on each (TX,RX) antenna pair -int nr_pbch_channel_level(struct complex16 dl_ch_estimates_ext[][20*12*4], +int nr_pbch_channel_level(struct complex16 dl_ch_estimates_ext[][PBCH_MAX_RE_PER_SYMBOL], NR_DL_FRAME_PARMS *frame_parms, - uint32_t symbol) { - int16_t rb, nb_rb=20; - uint8_t aarx; + int nb_re) { + int16_t nb_rb=nb_re/12; #if defined(__x86_64__) || defined(__i386__) __m128i avg128; __m128i *dl_ch128; @@ -212,22 +203,23 @@ int nr_pbch_channel_level(struct complex16 dl_ch_estimates_ext[][20*12*4], #endif int avg1=0,avg2=0; - for (aarx=0; aarxnb_antennas_rx; aarx++) { + for (int aarx=0; aarxnb_antennas_rx; aarx++) { //clear average level #if defined(__x86_64__) || defined(__i386__) avg128 = _mm_setzero_si128(); - dl_ch128=(__m128i *)&dl_ch_estimates_ext[aarx][symbol*20*12]; + dl_ch128=(__m128i *)dl_ch_estimates_ext[aarx]; #elif defined(__arm__) avg128 = vdupq_n_s32(0); - dl_ch128=(int16x8_t *)&dl_ch_estimates_ext[aarx][symbol*20*12]; + dl_ch128=(int16x8_t *)dl_ch_estimates_ext[aarx]; #endif - for (rb=0; rb 0 && symbol < 4), - "symbol %d is illegal for PBCH DM-RS\n", - symbol); - - // printf("comp: symbol %d : nb_re %d\n",symbol,nb_re); - +static void nr_pbch_channel_compensation(struct complex16 rxdataF_ext[][PBCH_MAX_RE_PER_SYMBOL], + struct complex16 dl_ch_estimates_ext[][PBCH_MAX_RE_PER_SYMBOL], + int nb_re, + struct complex16 rxdataF_comp[][PBCH_MAX_RE_PER_SYMBOL], + NR_DL_FRAME_PARMS *frame_parms, + uint8_t output_shift) { for (int aarx=0; aarxnb_antennas_rx; aarx++) { - vect128 *dl_ch128 = (vect128 *)&dl_ch_estimates_ext[aarx][symbol*20*12]; + vect128 *dl_ch128 = (vect128 *)dl_ch_estimates_ext[aarx]; vect128 *rxdataF128 = (vect128 *)rxdataF_ext[aarx]; vect128 *rxdataF_comp128 = (vect128 *)rxdataF_comp[aarx]; - /* - printf("ch compensation dl_ch ext addr %p \n", &dl_ch_estimates_ext[aarx][symbol*20*12]); - printf("rxdataf ext addr %p symbol %d\n", rxdataF_ext[aarx], symbol); - printf("rxdataf_comp addr %p\n",&rxdataF_comp[aarx][symbol*20*12]); - */ - for (int re=0; renb_antennas_rx][20*12*4]; - struct complex16 rxdataF_comp[frame_parms->nb_antennas_rx][nb_re]; - //was dl_ch_estimates[idx] = (int32_t *)malloc16_clear( sizeof(int32_t)*7*2*sizeof(int)*(fp->ofdm_symbol_size) ); - struct complex16 dl_ch_estimates_ext[frame_parms->nb_antennas_rx][20*12*4]; + struct complex16 rxdataF_ext[frame_parms->nb_antennas_rx][PBCH_MAX_RE_PER_SYMBOL]; + struct complex16 dl_ch_estimates_ext[frame_parms->nb_antennas_rx][PBCH_MAX_RE_PER_SYMBOL]; memset(dl_ch_estimates_ext,0, sizeof dl_ch_estimates_ext); nr_pbch_extract(nr_ue_common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF, estimateSz, @@ -474,20 +448,20 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue, if (symbol == 1) { max_h = nr_pbch_channel_level(dl_ch_estimates_ext, frame_parms, - symbol); + nb_re); log2_maxh = 3+(log2_approx(max_h)/2); } #ifdef DEBUG_PBCH LOG_I(PHY,"[PHY] PBCH log2_maxh = %d (%d)\n",nr_ue_pbch_vars->log2_maxh,max_h); #endif + struct complex16 rxdataF_comp[frame_parms->nb_antennas_rx][PBCH_MAX_RE_PER_SYMBOL]; nr_pbch_channel_compensation(rxdataF_ext, dl_ch_estimates_ext, nb_re, rxdataF_comp, frame_parms, - symbol, - log2_maxh); // log2_maxh+I0_shift + log2_maxh); // log2_maxh+I0_shift /*if (frame_parms->nb_antennas_rx > 1) pbch_detection_mrc(frame_parms, @@ -502,19 +476,12 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue, return(-1); } */ - if (symbol==2) { - nr_pbch_quantize(pbch_e_rx+pbch_e_rx_idx, - (short *)rxdataF_comp[0], - 144); - memcpy(pbch_unClipped+pbch_e_rx_idx, rxdataF_comp[0], 144*sizeof(int16_t)); - pbch_e_rx_idx+=144; - } else { - nr_pbch_quantize(pbch_e_rx+pbch_e_rx_idx, - (short *)rxdataF_comp[0], - 360); - memcpy(pbch_unClipped+pbch_e_rx_idx, rxdataF_comp[0], 144*sizeof(int16_t)); - pbch_e_rx_idx+=360; - } + int nb=symbol==2 ? 144 : 360; + nr_pbch_quantize(pbch_e_rx+pbch_e_rx_idx, + (short *)rxdataF_comp[0], + nb); + memcpy(pbch_unClipped+pbch_e_rx_idx, rxdataF_comp[0], nb*sizeof(int16_t)); + pbch_e_rx_idx+=nb; } // legacy code use int16, but it is complex16 @@ -522,15 +489,11 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue, UEscopeCopy(ue, pbchLlr, pbch_e_rx, sizeof(int16_t), frame_parms->nb_antennas_rx, pbch_e_rx_idx); #ifdef DEBUG_PBCH write_output("rxdataF_comp.m","rxFcomp",rxdataF_comp[0],240*3,1,1); -#endif - //demod_pbch_e = nr_ue_pbch_vars->demod_pbch_e; - // FT?? cppcheck fix - pbch_a = nr_ue_pbch_vars->pbch_a; -#ifdef DEBUG_PBCH short *p = (short *)rxdataF_comp[0]); - + for (int cnt = 0; cnt < 864 ; cnt++) -printf("pbch rx llr %d\n",*(pbch_e_rx+cnt)); - + printf("pbch rx llr %d\n",*(pbch_e_rx+cnt)); + #endif //un-scrambling M = NR_POLAR_PBCH_E; @@ -538,34 +501,39 @@ printf("pbch rx llr %d\n",*(pbch_e_rx+cnt)); uint32_t unscrambling_mask = (Lmax==64)?0x100006D:0x1000041; uint32_t pbch_a_interleaved=0; uint32_t pbch_a_prime=0; - nr_pbch_unscrambling(nr_ue_pbch_vars,pbch_e_rx,frame_parms->Nid_cell,nushift,M,NR_POLAR_PBCH_E,0,0, pbch_a_prime, &pbch_a_interleaved); + nr_pbch_unscrambling(nr_ue_pbch_vars, pbch_e_rx, frame_parms->Nid_cell, nushift, M, NR_POLAR_PBCH_E, + 0, 0, pbch_a_prime, &pbch_a_interleaved); //polar decoding de-rate matching - const t_nrPolar_params *currentPtr = nr_polar_params( NR_POLAR_PBCH_MESSAGE_TYPE, NR_POLAR_PBCH_PAYLOAD_BITS, NR_POLAR_PBCH_AGGREGATION_LEVEL,1,&ue->polarList); -uint64_t tmp=pbch_a_prime; -decoderState = polar_decoder_int16(pbch_e_rx,&tmp,0,currentPtr); -pbch_a_prime=tmp; + const t_nrPolar_params *currentPtr = nr_polar_params( NR_POLAR_PBCH_MESSAGE_TYPE, NR_POLAR_PBCH_PAYLOAD_BITS, + NR_POLAR_PBCH_AGGREGATION_LEVEL,1,&ue->polarList); + uint64_t tmp=pbch_a_prime; + decoderState = polar_decoder_int16(pbch_e_rx,&tmp,0,currentPtr); + pbch_a_prime=tmp; - if(decoderState) return(decoderState); + if(decoderState) + return(decoderState); // printf("polar decoder output 0x%08x\n",pbch_a_prime); // Decoder reversal uint32_t a_reversed=0; for (int i=0; i>i)&1)<<(31-i); + a_reversed |= (((uint64_t)pbch_a_prime>>i)&1)<<(31-i); pbch_a_prime = a_reversed; //payload un-scrambling M = (Lmax == 64)? (NR_POLAR_PBCH_PAYLOAD_BITS - 6) : (NR_POLAR_PBCH_PAYLOAD_BITS - 3); nushift = ((pbch_a_prime>>24)&1) ^ (((pbch_a_prime>>6)&1)<<1); - nr_pbch_unscrambling(nr_ue_pbch_vars,pbch_e_rx,frame_parms->Nid_cell,nushift,M,NR_POLAR_PBCH_PAYLOAD_BITS,1,unscrambling_mask,pbch_a_prime, &pbch_a_interleaved); + pbch_a_interleaved=0; + nr_pbch_unscrambling(nr_ue_pbch_vars, pbch_e_rx, frame_parms->Nid_cell, nushift, M, NR_POLAR_PBCH_PAYLOAD_BITS, + 1, unscrambling_mask, pbch_a_prime, &pbch_a_interleaved); //printf("nushift %d sfn 3rd %d 2nd %d", nushift,((pbch_a_prime>>6)&1), ((pbch_a_prime>>24)&1) ); //payload deinterleaving //uint32_t in=0; uint32_t out=0; for (int i=0; i<32; i++) { - out |= ((pbch_a_interleaved>>i)&1)<<(pbch_deinterleaving_pattern[i]); + out |= ((pbch_a_interleaved>>i)&1)<<(pbch_deinterleaving_pattern[i]); #ifdef DEBUG_PBCH printf("i %d in 0x%08x out 0x%08x ilv %d (in>>i)&1) 0x%08x\n", i, pbch_a_interleaved, out, pbch_deinterleaving_pattern[i], (pbch_a_interleaved>>i)&1); #endif @@ -575,16 +543,16 @@ a_reversed |= (((uint64_t)pbch_a_prime>>i)&1)<<(31-i); result->xtra_byte = (out>>24)&0xff; for (int i=0; i>i)&1)<<(NR_POLAR_PBCH_PAYLOAD_BITS-i-1); - + payload |= ((out>>i)&1)<<(NR_POLAR_PBCH_PAYLOAD_BITS-i-1); + for (int i=0; i<3; i++) -result->decoded_output[i] = (uint8_t)((payload>>((3-i)<<3))&0xff); - + result->decoded_output[i] = (uint8_t)((payload>>((3-i)<<3))&0xff); + frame_parms->half_frame_bit = (result->xtra_byte>>4)&0x01; // computing the half frame index from the extra byte frame_parms->ssb_index = i_ssb; // ssb index corresponds to i_ssb for Lmax = 4,8 - + if (Lmax == 64) { // for Lmax = 64 ssb index 4th,5th and 6th bits are in extra byte - for (int i=0; i<3; i++) + for (int i=0; i<3; i++) frame_parms->ssb_index += (((result->xtra_byte>>(7-i))&0x01)<<(3+i)); } @@ -596,8 +564,8 @@ result->decoded_output[i] = (uint8_t)((payload>>((3-i)<<3))&0xff); uint8_t frame_number_4lsb = 0; for (int i=0; i<4; i++) -frame_number_4lsb |= ((result->xtra_byte>>i)&1)<<(3-i); - + frame_number_4lsb |= ((result->xtra_byte>>i)&1)<<(3-i); + proc->decoded_frame_rx = frame_number_4lsb; #ifdef DEBUG_PBCH printf("xtra_byte %x payload %x\n", xtra_byte, payload); From c4547c7afd79c37216301b1f1a7982c95e1f910a Mon Sep 17 00:00:00 2001 From: francescomani Date: Fri, 18 Feb 2022 18:38:51 +0100 Subject: [PATCH 45/96] fixing wrong interpretation of support for 256qam table --- openair2/RRC/NR/nr_rrc_config.c | 26 +------------------------- 1 file changed, 1 insertion(+), 25 deletions(-) diff --git a/openair2/RRC/NR/nr_rrc_config.c b/openair2/RRC/NR/nr_rrc_config.c index 06aa32cb44..97d91702d6 100644 --- a/openair2/RRC/NR/nr_rrc_config.c +++ b/openair2/RRC/NR/nr_rrc_config.c @@ -184,31 +184,7 @@ void set_dl_mcs_table(int scs, NR_UE_NR_Capability_t *cap, else if (cap->phy_Parameters.phy_ParametersFR1 && cap->phy_Parameters.phy_ParametersFR1->pdsch_256QAM_FR1) supported = true; - // check featureSet - NR_FeatureSets_t *fs=cap->featureSets; - NR_ModulationOrder_t supported_mo = 0; - if (fs && supported) { - // go through DL feature sets and look for one with current SCS - for (int i=0;ifeatureSetsDownlinkPerCC->list.count;i++) { - int supported_bw; - NR_FeatureSetDownlinkPerCC_t *fs_cc = fs->featureSetsDownlinkPerCC->list.array[i]; - switch (fs_cc->supportedBandwidthDL.present) { - case NR_SupportedBandwidth_PR_fr1: - supported_bw = fs_cc->supportedBandwidthDL.choice.fr1; - break; - case NR_SupportedBandwidth_PR_fr2: - supported_bw = fs_cc->supportedBandwidthDL.choice.fr2; - break; - default: - AssertFatal(1==0,"Invalid parameter for supported bandwith choice\n"); - } - if (fs_cc->supportedSubcarrierSpacingDL == scs && - supported_bw == bw && - fs_cc->supportedModulationOrderDL) - supported_mo = *fs_cc->supportedModulationOrderDL ; - } - } - if (supported && (supported_mo == NR_ModulationOrder_qam256)) { + if (supported) { if(bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table == NULL) bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table = calloc(1, sizeof(*bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table)); *bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table = NR_PDSCH_Config__mcs_Table_qam256; From c3d0d6d82a8d3c3c523a11cc91502a44a1e7deda Mon Sep 17 00:00:00 2001 From: francescomani Date: Tue, 22 Feb 2022 14:39:04 +0100 Subject: [PATCH 46/96] addressing review comments --- openair2/GNB_APP/gnb_config.c | 2 +- .../LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c | 24 ++++++++++--------- .../LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c | 14 +++++------ 3 files changed, 21 insertions(+), 19 deletions(-) diff --git a/openair2/GNB_APP/gnb_config.c b/openair2/GNB_APP/gnb_config.c index f4433ba1ca..ccd26a62ea 100644 --- a/openair2/GNB_APP/gnb_config.c +++ b/openair2/GNB_APP/gnb_config.c @@ -740,7 +740,7 @@ void RCconfig_nr_macrlc() { uint16_t prbbl[275]; int num_prbbl=0; int prb; - memset(prbbl,0,275*sizeof(uint16_t)); + memset(prbbl,0,prbbl); while (pt) { prb=atoi(pt); prbbl[prb] = 0x3FFF; // all symbols taken diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c index fcab2ab968..61cfb986dc 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c @@ -557,7 +557,7 @@ void nr_csi_meas_reporting(int Mod_idP, // verify resources are free for (int i = start; i < start + len; ++i) { if((vrb_map_UL[i+bwp_start] & mask) != 0) { - LOG_E(NR_MAC, "%s(): VRB MAP not free. Can't schedule CSI reporting on PUCCH.\n", __func__); + LOG_E(NR_MAC, "%4d.%2d VRB MAP in %4d.%2d not free. Can't schedule CSI reporting on PUCCH.\n", frame, slot, frame, sched_slot); memset(curr_pucch, 0, sizeof(*curr_pucch)); } else @@ -1273,17 +1273,18 @@ int nr_acknack_scheduling(int mod_id, * later) * * each UE has dedicated PUCCH Format 0 resources, and we use index 0! */ NR_UE_sched_ctrl_t *sched_ctrl = &RC.nrmac[mod_id]->UE_info.UE_sched_ctrl[UE_id]; + NR_CellGroupConfig_t *cg = RC.nrmac[mod_id]->UE_info.CellGroup[UE_id]; NR_PUCCH_Config_t *pucch_Config = NULL; if (sched_ctrl->active_ubwp) { pucch_Config = sched_ctrl->active_ubwp->bwp_Dedicated->pucch_Config->choice.setup; - } else if (RC.nrmac[mod_id]->UE_info.CellGroup[UE_id] && - RC.nrmac[mod_id]->UE_info.CellGroup[UE_id]->spCellConfig && - RC.nrmac[mod_id]->UE_info.CellGroup[UE_id]->spCellConfig->spCellConfigDedicated && - RC.nrmac[mod_id]->UE_info.CellGroup[UE_id]->spCellConfig->spCellConfigDedicated->uplinkConfig && - RC.nrmac[mod_id]->UE_info.CellGroup[UE_id]->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP && - RC.nrmac[mod_id]->UE_info.CellGroup[UE_id]->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup) { - pucch_Config = RC.nrmac[mod_id]->UE_info.CellGroup[UE_id]->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup; + } else if (cg && + cg->spCellConfig && + cg->spCellConfig->spCellConfigDedicated && + cg->spCellConfig->spCellConfigDedicated->uplinkConfig && + cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP && + cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup) { + pucch_Config = cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup; } NR_BWP_t *genericParameters = sched_ctrl->active_ubwp ? &sched_ctrl->active_ubwp->bwp_Common->genericParameters: @@ -1336,7 +1337,6 @@ int nr_acknack_scheduling(int mod_id, LOG_D(NR_MAC, "In %s: pucch_acknak 1. DL %d.%d, UL_ACK %d.%d, DAI_C %d\n", __FUNCTION__, frame, slot, pucch->frame, pucch->ul_slot, pucch->dai_c); // this is hardcoded for now as ue specific only if we are not on the initialBWP (to be fixed to allow ue_Specific also on initialBWP - NR_CellGroupConfig_t *cg = RC.nrmac[mod_id]->UE_info.CellGroup[UE_id]; NR_BWP_UplinkDedicated_t *ubwpd=NULL; if (cg && @@ -1410,11 +1410,13 @@ int nr_acknack_scheduling(int mod_id, // Find the right timing_indicator value. int ind_found = -1; // while we are within the feedback limits + uint16_t *vrb_map_UL; while ((n_slots_frame + pucch->ul_slot - slot) % n_slots_frame <= max_fb_time) { // checking if in ul_slot the resources potentially to be assigned to this PUCCH are available + vrb_map_UL = &RC.nrmac[mod_id]->common_channels[CC_id].vrb_map_UL[pucch->ul_slot * MAX_BWP_SIZE]; bool ret = test_acknack_vrb_occupation(sched_ctrl, pucch, - &RC.nrmac[mod_id]->common_channels[CC_id].vrb_map_UL[pucch->ul_slot * MAX_BWP_SIZE], + vrb_map_UL, scc, pucch_Config, r_pucch, @@ -1499,7 +1501,7 @@ int nr_acknack_scheduling(int mod_id, pucch->resource_indicator = 0; // each UE has dedicated PUCCH resources pucch->r_pucch=r_pucch; - uint16_t *vrb_map_UL = &RC.nrmac[mod_id]->common_channels[CC_id].vrb_map_UL[pucch->ul_slot * MAX_BWP_SIZE]; + vrb_map_UL = &RC.nrmac[mod_id]->common_channels[CC_id].vrb_map_UL[pucch->ul_slot * MAX_BWP_SIZE]; for (int l=0; lnr_of_symb; l++) { uint16_t symb = SL_to_bitmap(pucch->start_symb+l, 1); int prb; diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c index c57218cc33..5f34c10b3b 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c @@ -1209,13 +1209,6 @@ void pf_ul(module_id_t module_id, if (max_num_ue < 0) return; - sched_ctrl->cce_index = CCEIndex; - fill_pdcch_vrb_map(RC.nrmac[module_id], - CC_id, - &sched_ctrl->sched_pdcch, - CCEIndex, - sched_ctrl->aggregation_level); - /* Save PUSCH field */ /* we want to avoid a lengthy deduction of DMRS and other parameters in * every TTI if we can save it, so check whether dci_format, TDA, or @@ -1238,6 +1231,13 @@ void pf_ul(module_id_t module_id, return; } + sched_ctrl->cce_index = CCEIndex; + fill_pdcch_vrb_map(RC.nrmac[module_id], + CC_id, + &sched_ctrl->sched_pdcch, + CCEIndex, + sched_ctrl->aggregation_level); + NR_sched_pusch_t *sched_pusch = &sched_ctrl->sched_pusch; sched_pusch->mcs = 9; update_ul_ue_R_Qm(sched_pusch, ps); From d4ce30c54d7801fb52eec7f3721bc0043eed54fa Mon Sep 17 00:00:00 2001 From: francescomani Date: Wed, 23 Feb 2022 16:52:13 +0100 Subject: [PATCH 47/96] additional review fixes --- openair2/GNB_APP/gnb_config.c | 2 +- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c | 4 ++-- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c | 2 ++ openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c | 3 +-- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c | 6 +++--- 5 files changed, 9 insertions(+), 8 deletions(-) diff --git a/openair2/GNB_APP/gnb_config.c b/openair2/GNB_APP/gnb_config.c index ccd26a62ea..ec666f9415 100644 --- a/openair2/GNB_APP/gnb_config.c +++ b/openair2/GNB_APP/gnb_config.c @@ -740,7 +740,7 @@ void RCconfig_nr_macrlc() { uint16_t prbbl[275]; int num_prbbl=0; int prb; - memset(prbbl,0,prbbl); + memset(prbbl,0,sizeof(prbbl)); while (pt) { prb=atoi(pt); prbbl[prb] = 0x3FFF; // all symbols taken diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c index cd34a543c7..3c441b7c6c 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c @@ -681,7 +681,7 @@ bool allocate_dl_retransmission(module_id_t module_id, /* retransmissions: directly allocate */ *n_rb_sched -= sched_ctrl->sched_pdsch.rbSize; for (int rb = 0; rb < sched_ctrl->sched_pdsch.rbSize; rb++) - rballoc_mask[rb + sched_ctrl->sched_pdsch.rbStart] -= SL_to_bitmap(ps->startSymbolIndex, ps->nrOfSymbols); + rballoc_mask[rb + sched_ctrl->sched_pdsch.rbStart] ^= SL_to_bitmap(ps->startSymbolIndex, ps->nrOfSymbols); return true; } @@ -878,7 +878,7 @@ void pf_dl(module_id_t module_id, /* transmissions: directly allocate */ n_rb_sched -= sched_pdsch->rbSize; for (int rb = 0; rb < sched_pdsch->rbSize; rb++) - rballoc_mask[rb + sched_pdsch->rbStart] -= slbitmap; + rballoc_mask[rb + sched_pdsch->rbStart] ^= slbitmap; } } diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c index 8480e22a60..5c1ef2128f 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c @@ -1149,6 +1149,8 @@ void set_r_pucch_parms(int rsetindex, int *nr_of_symbols, int *start_symbol_index) { + // procedure described in 38.213 section 9.2.1 + int prboffset = r_pucch/default_pucch_csset[rsetindex]; int prboffsetm8 = (r_pucch-8)/default_pucch_csset[rsetindex]; diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c index 61cfb986dc..5880f59655 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c @@ -1282,8 +1282,7 @@ int nr_acknack_scheduling(int mod_id, cg->spCellConfig && cg->spCellConfig->spCellConfigDedicated && cg->spCellConfig->spCellConfigDedicated->uplinkConfig && - cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP && - cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup) { + cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP) { pucch_Config = cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup; } NR_BWP_t *genericParameters = sched_ctrl->active_ubwp ? diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c index 5f34c10b3b..e77fa0ef29 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c @@ -1091,7 +1091,7 @@ bool allocate_ul_retransmission(module_id_t module_id, /* Mark the corresponding RBs as used */ n_rb_sched -= sched_pusch->rbSize; for (int rb = 0; rb < sched_ctrl->sched_pusch.rbSize; rb++) - rballoc_mask[rb + sched_ctrl->sched_pusch.rbStart] -= SL_to_bitmap(sched_ctrl->pusch_semi_static.startSymbolIndex, sched_ctrl->pusch_semi_static.nrOfSymbols); + rballoc_mask[rb + sched_ctrl->sched_pusch.rbStart] ^= SL_to_bitmap(sched_ctrl->pusch_semi_static.startSymbolIndex, sched_ctrl->pusch_semi_static.nrOfSymbols); return true; } @@ -1256,7 +1256,7 @@ void pf_ul(module_id_t module_id, /* Mark the corresponding RBs as used */ n_rb_sched -= sched_pusch->rbSize; for (int rb = 0; rb < sched_ctrl->sched_pusch.rbSize; rb++) - rballoc_mask[rb + sched_ctrl->sched_pusch.rbStart] -= SL_to_bitmap(ps->startSymbolIndex, ps->nrOfSymbols); + rballoc_mask[rb + sched_ctrl->sched_pusch.rbStart] ^= SL_to_bitmap(ps->startSymbolIndex, ps->nrOfSymbols); continue; } @@ -1389,7 +1389,7 @@ void pf_ul(module_id_t module_id, n_rb_sched -= sched_pusch->rbSize; for (int rb = 0; rb < sched_ctrl->sched_pusch.rbSize; rb++) - rballoc_mask[rb + sched_ctrl->sched_pusch.rbStart] -= SL_to_bitmap(ps->startSymbolIndex, ps->nrOfSymbols); + rballoc_mask[rb + sched_ctrl->sched_pusch.rbStart] ^= SL_to_bitmap(ps->startSymbolIndex, ps->nrOfSymbols); } } From a4216b44ef4eee2398270b726d36de894f3a297e Mon Sep 17 00:00:00 2001 From: Laurent THOMAS Date: Mon, 24 Jan 2022 14:19:31 +0100 Subject: [PATCH 48/96] ue sync, assert in wrong PUCCH decoded values --- openair1/SCHED/phy_procedures_lte_eNb.c | 130 ++++++++++++++---------- targets/RT/USER/lte-ue.c | 12 ++- 2 files changed, 88 insertions(+), 54 deletions(-) diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index ee1e0be49a..1c13ef4f11 100644 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -1938,6 +1938,8 @@ void fill_ulsch_harq_indication (PHY_VARS_eNB *eNB, LTE_UL_eNB_HARQ_t *ulsch_har pthread_mutex_unlock(&eNB->UL_INFO_mutex); } +#define packetError(ConD, fmt, args...) if (!(ConD)) { LOG_E(PHY, fmt, args); discard=true; } + void fill_uci_harq_indication (int UEid, PHY_VARS_eNB *eNB, LTE_eNB_UCI *uci, int frame, int subframe, uint8_t *harq_ack, uint8_t tdd_mapping_mode, uint16_t tdd_multiplexing_mask) { if ( split73 == SPLIT73_DU ) { sendFs6Ulharq(fs6ULindicationHarq, UEid, eNB, uci, frame, subframe, harq_ack, tdd_mapping_mode, tdd_multiplexing_mask, 0, 0); @@ -1953,6 +1955,7 @@ void fill_uci_harq_indication (int UEid, PHY_VARS_eNB *eNB, LTE_eNB_UCI *uci, in } pthread_mutex_lock(&eNB->UL_INFO_mutex); + bool discard=false; nfapi_harq_indication_t *ind = &eNB->UL_INFO.harq_ind; nfapi_harq_indication_body_t *body = &ind->harq_indication_body; assert(eNB->UL_INFO.harq_ind.harq_indication_body.number_of_harqs <= NFAPI_HARQ_IND_MAX_PDU); @@ -1985,73 +1988,87 @@ void fill_uci_harq_indication (int UEid, PHY_VARS_eNB *eNB, LTE_eNB_UCI *uci, in pdu->harq_indication_fdd_rel13.tl.tag = NFAPI_HARQ_INDICATION_FDD_REL13_TAG; pdu->harq_indication_fdd_rel13.mode = 0; pdu->harq_indication_fdd_rel13.number_of_ack_nack = 1; - AssertFatal (harq_ack[0] == 1 || harq_ack[0] == 2 || harq_ack[0] == 4, "harq_ack[0] is %d, should be 1,2 or 4\n", harq_ack[0]); - pdu->harq_indication_fdd_rel13.harq_tb_n[0] = harq_ack[0]; - // release DLSCH if needed - release_harq(eNB,DLSCH_id,0,frame,subframe,0xffff, harq_ack[0] == 1); + packetError (harq_ack[0] == 1 || harq_ack[0] == 2 || harq_ack[0] == 4, "harq_ack[0] is %d, should be 1,2 or 4\n", harq_ack[0]); + if (!discard) { + pdu->harq_indication_fdd_rel13.harq_tb_n[0] = harq_ack[0]; + // release DLSCH if needed + release_harq(eNB,DLSCH_id,0,frame,subframe,0xffff, harq_ack[0] == 1); + } } else if (uci->pucch_fmt == pucch_format1b) { pdu->harq_indication_fdd_rel13.tl.tag = NFAPI_HARQ_INDICATION_FDD_REL13_TAG; pdu->harq_indication_fdd_rel13.mode = 0; pdu->harq_indication_fdd_rel13.number_of_ack_nack = 2; - AssertFatal (harq_ack[0] == 1 || harq_ack[0] == 2 || harq_ack[1] == 4, "harq_ack[0] is %d, should be 0,1 or 4\n", harq_ack[0]); - AssertFatal (harq_ack[1] == 1 || harq_ack[1] == 2 || harq_ack[1] == 4, "harq_ack[1] is %d, should be 0,1 or 4\n", harq_ack[1]); - pdu->harq_indication_fdd_rel13.harq_tb_n[0] = harq_ack[0]; - pdu->harq_indication_fdd_rel13.harq_tb_n[1] = harq_ack[1]; - // release DLSCH if needed - release_harq(eNB,DLSCH_id,0,frame,subframe,0xffff, harq_ack[0] == 1); - release_harq(eNB,DLSCH_id,1,frame,subframe,0xffff, harq_ack[1] == 1); - } else AssertFatal(1==0,"only format 1a/b for now, received %d\n",uci->pucch_fmt); + packetError (harq_ack[0] == 1 || harq_ack[0] == 2 || harq_ack[1] == 4, "harq_ack[0] is %d, should be 0,1 or 4\n", harq_ack[0]); + packetError (harq_ack[1] == 1 || harq_ack[1] == 2 || harq_ack[1] == 4, "harq_ack[1] is %d, should be 0,1 or 4\n", harq_ack[1]); + if (!discard) { + pdu->harq_indication_fdd_rel13.harq_tb_n[0] = harq_ack[0]; + pdu->harq_indication_fdd_rel13.harq_tb_n[1] = harq_ack[1]; + // release DLSCH if needed + release_harq(eNB,DLSCH_id,0,frame,subframe,0xffff, harq_ack[0] == 1); + release_harq(eNB,DLSCH_id,1,frame,subframe,0xffff, harq_ack[1] == 1); + } + } else + packetError(1==0,"only format 1a/b for now, received %d\n",uci->pucch_fmt); } else { // TDD - AssertFatal (tdd_mapping_mode == 0 || tdd_mapping_mode == 1 || tdd_mapping_mode == 2, "Illegal tdd_mapping_mode %d\n", tdd_mapping_mode); - pdu->harq_indication_tdd_rel13.tl.tag = NFAPI_HARQ_INDICATION_TDD_REL13_TAG; - pdu->harq_indication_tdd_rel13.mode = tdd_mapping_mode; - LOG_D(PHY,"%s(eNB, uci_harq format %d, rnti:%04x, frame:%d, subframe:%d, tdd_mapping_mode:%d) harq_ack[0]:%d harq_ack[1]:%d\n", __FUNCTION__, uci->pucch_fmt,uci->rnti, frame, subframe, - tdd_mapping_mode,harq_ack[0],harq_ack[1]); + packetError (tdd_mapping_mode == 0 || tdd_mapping_mode == 1 || tdd_mapping_mode == 2, "Illegal tdd_mapping_mode %d\n", tdd_mapping_mode); + if (!discard) { + pdu->harq_indication_tdd_rel13.tl.tag = NFAPI_HARQ_INDICATION_TDD_REL13_TAG; + pdu->harq_indication_tdd_rel13.mode = tdd_mapping_mode; + LOG_D(PHY,"%s(eNB, uci_harq format %d, rnti:%04x, frame:%d, subframe:%d, tdd_mapping_mode:%d) harq_ack[0]:%d harq_ack[1]:%d\n", __FUNCTION__, uci->pucch_fmt,uci->rnti, frame, subframe, + tdd_mapping_mode,harq_ack[0],harq_ack[1]); - switch (tdd_mapping_mode) { + switch (tdd_mapping_mode) { case 0: // bundling if (uci->pucch_fmt == pucch_format1a) { pdu->harq_indication_tdd_rel13.tl.tag = NFAPI_HARQ_INDICATION_TDD_REL13_TAG; pdu->harq_indication_tdd_rel13.number_of_ack_nack = 1; LOG_D(PHY,"bundling, pucch1a, number of ack nack %d\n",pdu->harq_indication_tdd_rel13.number_of_ack_nack); - AssertFatal(harq_ack[0] == 1 || harq_ack[0] == 2 || harq_ack[0] == 4, "harq_ack[0] is %d, should be 1,2 or 4\n",harq_ack[0]); - pdu->harq_indication_tdd_rel13.harq_data[0].bundling.value_0 = harq_ack[0]; - // release all bundled DLSCH if needed - release_harq(eNB,DLSCH_id,0,frame,subframe,0xffff, harq_ack[0] == 1); + packetError(harq_ack[0] == 1 || harq_ack[0] == 2 || harq_ack[0] == 4, "harq_ack[0] is %d, should be 1,2 or 4\n",harq_ack[0]); + if (!discard) { + pdu->harq_indication_tdd_rel13.harq_data[0].bundling.value_0 = harq_ack[0]; + // release all bundled DLSCH if needed + release_harq(eNB,DLSCH_id,0,frame,subframe,0xffff, harq_ack[0] == 1); + } } else if (uci->pucch_fmt == pucch_format1b) { pdu->harq_indication_tdd_rel13.number_of_ack_nack = 2; - AssertFatal(harq_ack[0] == 1 || harq_ack[0] == 2 || harq_ack[1] == 4, "harq_ack[0] is %d, should be 0,1 or 4\n",harq_ack[0]); - AssertFatal(harq_ack[1] == 1 || harq_ack[1] == 2 || harq_ack[1] == 4, "harq_ack[1] is %d, should be 0,1 or 4\n",harq_ack[1]); - pdu->harq_indication_tdd_rel13.tl.tag = NFAPI_HARQ_INDICATION_TDD_REL13_TAG; - pdu->harq_indication_tdd_rel13.harq_data[0].bundling.value_0 = harq_ack[0]; - pdu->harq_indication_tdd_rel13.harq_data[1].bundling.value_0 = harq_ack[1]; - // release all DLSCH if needed - release_harq(eNB,DLSCH_id,0,frame,subframe,0xffff, harq_ack[0] == 1); - release_harq(eNB,DLSCH_id,1,frame,subframe,0xffff, harq_ack[1] == 1); + packetError(harq_ack[0] == 1 || harq_ack[0] == 2 || harq_ack[1] == 4, "harq_ack[0] is %d, should be 0,1 or 4\n",harq_ack[0]); + packetError(harq_ack[1] == 1 || harq_ack[1] == 2 || harq_ack[1] == 4, "harq_ack[1] is %d, should be 0,1 or 4\n",harq_ack[1]); + if (!discard) { + pdu->harq_indication_tdd_rel13.tl.tag = NFAPI_HARQ_INDICATION_TDD_REL13_TAG; + pdu->harq_indication_tdd_rel13.harq_data[0].bundling.value_0 = harq_ack[0]; + pdu->harq_indication_tdd_rel13.harq_data[1].bundling.value_0 = harq_ack[1]; + // release all DLSCH if needed + release_harq(eNB,DLSCH_id,0,frame,subframe,0xffff, harq_ack[0] == 1); + release_harq(eNB,DLSCH_id,1,frame,subframe,0xffff, harq_ack[1] == 1); + } } break; case 1: // multiplexing - AssertFatal (uci->pucch_fmt == pucch_format1b, "uci->pucch_format %d is not format1b\n", uci->pucch_fmt); - - if (uci->num_pucch_resources == 1 && uci->pucch_fmt == pucch_format1a) { - pdu->harq_indication_tdd_rel13.tl.tag = NFAPI_HARQ_INDICATION_TDD_REL13_TAG; - pdu->harq_indication_tdd_rel13.number_of_ack_nack = 1; - AssertFatal(harq_ack[0] == 1 || harq_ack[0] == 2 || harq_ack[0] == 4, "harq_ack[0] is %d, should be 1,2 or 4\n",harq_ack[0]); - pdu->harq_indication_tdd_rel13.harq_data[0].multiplex.value_0 = harq_ack[0]; - // release all DLSCH if needed - release_harq(eNB,DLSCH_id,0,frame,subframe,0xffff, harq_ack[0] == 1); + packetError (uci->pucch_fmt == pucch_format1b, "uci->pucch_format %d is not format1b\n", uci->pucch_fmt); + if (!discard) { + if (uci->num_pucch_resources == 1 && uci->pucch_fmt == pucch_format1a) { + pdu->harq_indication_tdd_rel13.tl.tag = NFAPI_HARQ_INDICATION_TDD_REL13_TAG; + pdu->harq_indication_tdd_rel13.number_of_ack_nack = 1; + packetError(harq_ack[0] == 1 || harq_ack[0] == 2 || harq_ack[0] == 4, "harq_ack[0] is %d, should be 1,2 or 4\n",harq_ack[0]); + if (!discard) { + pdu->harq_indication_tdd_rel13.harq_data[0].multiplex.value_0 = harq_ack[0]; + // release all DLSCH if needed + release_harq(eNB,DLSCH_id,0,frame,subframe,0xffff, harq_ack[0] == 1); + } } else if (uci->num_pucch_resources == 1 && uci->pucch_fmt == pucch_format1b) { - pdu->harq_indication_tdd_rel13.tl.tag = NFAPI_HARQ_INDICATION_TDD_REL13_TAG; - pdu->harq_indication_tdd_rel13.number_of_ack_nack = 2; - AssertFatal(harq_ack[0] == 1 || harq_ack[0] == 2 || harq_ack[1] == 4, "harq_ack[0] is %d, should be 0,1 or 4\n",harq_ack[0]); - AssertFatal(harq_ack[1] == 1 || harq_ack[1] == 2 || harq_ack[1] == 4, "harq_ack[1] is %d, should be 0,1 or 4\n",harq_ack[1]); - pdu->harq_indication_tdd_rel13.harq_data[0].multiplex.value_0 = harq_ack[0]; - pdu->harq_indication_tdd_rel13.harq_data[1].multiplex.value_0 = harq_ack[1]; - // release all DLSCH if needed - release_harq(eNB,DLSCH_id,0,frame,subframe,0xffff, harq_ack[0] == 1); - release_harq(eNB,DLSCH_id,1,frame,subframe,0xffff, harq_ack[1] == 1); + pdu->harq_indication_tdd_rel13.tl.tag = NFAPI_HARQ_INDICATION_TDD_REL13_TAG; + pdu->harq_indication_tdd_rel13.number_of_ack_nack = 2; + packetError(harq_ack[0] == 1 || harq_ack[0] == 2 || harq_ack[1] == 4, "harq_ack[0] is %d, should be 0,1 or 4\n",harq_ack[0]); + packetError(harq_ack[1] == 1 || harq_ack[1] == 2 || harq_ack[1] == 4, "harq_ack[1] is %d, should be 0,1 or 4\n",harq_ack[1]); + if (!discard) { + pdu->harq_indication_tdd_rel13.harq_data[0].multiplex.value_0 = harq_ack[0]; + pdu->harq_indication_tdd_rel13.harq_data[1].multiplex.value_0 = harq_ack[1]; + // release all DLSCH if needed + release_harq(eNB,DLSCH_id,0,frame,subframe,0xffff, harq_ack[0] == 1); + release_harq(eNB,DLSCH_id,1,frame,subframe,0xffff, harq_ack[1] == 1); + } } else { // num_pucch_resources (M) > 1 pdu->harq_indication_tdd_rel13.tl.tag = NFAPI_HARQ_INDICATION_TDD_REL13_TAG; pdu->harq_indication_tdd_rel13.number_of_ack_nack = uci->num_pucch_resources; @@ -2067,7 +2084,7 @@ void fill_uci_harq_indication (int UEid, PHY_VARS_eNB *eNB, LTE_eNB_UCI *uci, in release_harq(eNB,DLSCH_id,1,frame,subframe,tdd_multiplexing_mask, 1 /* force release? previous code was unconditional */); } - break; + break; case 2: // special bundling (SR collision) pdu->harq_indication_tdd_rel13.tl.tag = NFAPI_HARQ_INDICATION_TDD_REL13_TAG; @@ -2117,16 +2134,23 @@ void fill_uci_harq_indication (int UEid, PHY_VARS_eNB *eNB, LTE_eNB_UCI *uci, in } else { pdu->harq_indication_tdd_rel13.harq_data[0].bundling.value_0 = 0; } - + break; } break; + } + } } } //TDD - - eNB->UL_INFO.harq_ind.harq_indication_body.number_of_harqs++; - LOG_D(PHY,"Incremented eNB->UL_INFO.harq_ind.harq_indication_body.number_of_harqs:%d\n", eNB->UL_INFO.harq_ind.harq_indication_body.number_of_harqs); + + if (!discard) { + eNB->UL_INFO.harq_ind.harq_indication_body.number_of_harqs++; + LOG_D(PHY,"Incremented eNB->UL_INFO.harq_ind.harq_indication_body.number_of_harqs:%d\n", eNB->UL_INFO.harq_ind.harq_indication_body.number_of_harqs); + } else { + LOG_W(PHY,"discarded a PUCCH because the decoded values are impossible\n"); + } + pthread_mutex_unlock(&eNB->UL_INFO_mutex); } diff --git a/targets/RT/USER/lte-ue.c b/targets/RT/USER/lte-ue.c index 1643ca36ca..a48bef64b6 100644 --- a/targets/RT/USER/lte-ue.c +++ b/targets/RT/USER/lte-ue.c @@ -2023,8 +2023,18 @@ void *UE_thread(void *arg) if (is_synchronized == 0) { if (instance_cnt_synch < 0) { // we can invoke the synch - // grab 10 ms of signal and wakeup synch thread + // we shift in time flow because the UE doesn't detect sync when frame alignment is not easy + for (int i=0; iframe_parms.nb_antennas_rx; i++) + rxp[i] = (void *)&dummy_rx[i][0]; + UE->rfdevice.trx_read_func(&UE->rfdevice, + ×tamp, + rxp, + UE->frame_parms.samples_per_tti/2, + UE->frame_parms.nb_antennas_rx); + + // grab 10 ms of signal and wakeup synch thread + if (UE->mode != loop_through_memory) { if (IS_SOFTMODEM_RFSIM ) { for(int sf=0; sf<10; sf++) { From db1cc4cf5f0a5e635f5f6b00f387603c1b3e7400 Mon Sep 17 00:00:00 2001 From: Laurent THOMAS Date: Wed, 23 Feb 2022 20:37:30 +0100 Subject: [PATCH 49/96] better variable name --- openair1/SCHED/phy_procedures_lte_eNb.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index 1c13ef4f11..1a35f6ee68 100644 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -1938,7 +1938,7 @@ void fill_ulsch_harq_indication (PHY_VARS_eNB *eNB, LTE_UL_eNB_HARQ_t *ulsch_har pthread_mutex_unlock(&eNB->UL_INFO_mutex); } -#define packetError(ConD, fmt, args...) if (!(ConD)) { LOG_E(PHY, fmt, args); discard=true; } +#define packetError(ConD, fmt, args...) if (!(ConD)) { LOG_E(PHY, fmt, args); goodPacket=false; } void fill_uci_harq_indication (int UEid, PHY_VARS_eNB *eNB, LTE_eNB_UCI *uci, int frame, int subframe, uint8_t *harq_ack, uint8_t tdd_mapping_mode, uint16_t tdd_multiplexing_mask) { if ( split73 == SPLIT73_DU ) { @@ -1955,7 +1955,7 @@ void fill_uci_harq_indication (int UEid, PHY_VARS_eNB *eNB, LTE_eNB_UCI *uci, in } pthread_mutex_lock(&eNB->UL_INFO_mutex); - bool discard=false; + bool goodPacket=true; nfapi_harq_indication_t *ind = &eNB->UL_INFO.harq_ind; nfapi_harq_indication_body_t *body = &ind->harq_indication_body; assert(eNB->UL_INFO.harq_ind.harq_indication_body.number_of_harqs <= NFAPI_HARQ_IND_MAX_PDU); @@ -1989,7 +1989,7 @@ void fill_uci_harq_indication (int UEid, PHY_VARS_eNB *eNB, LTE_eNB_UCI *uci, in pdu->harq_indication_fdd_rel13.mode = 0; pdu->harq_indication_fdd_rel13.number_of_ack_nack = 1; packetError (harq_ack[0] == 1 || harq_ack[0] == 2 || harq_ack[0] == 4, "harq_ack[0] is %d, should be 1,2 or 4\n", harq_ack[0]); - if (!discard) { + if (goodPacket) { pdu->harq_indication_fdd_rel13.harq_tb_n[0] = harq_ack[0]; // release DLSCH if needed release_harq(eNB,DLSCH_id,0,frame,subframe,0xffff, harq_ack[0] == 1); @@ -2000,7 +2000,7 @@ void fill_uci_harq_indication (int UEid, PHY_VARS_eNB *eNB, LTE_eNB_UCI *uci, in pdu->harq_indication_fdd_rel13.number_of_ack_nack = 2; packetError (harq_ack[0] == 1 || harq_ack[0] == 2 || harq_ack[1] == 4, "harq_ack[0] is %d, should be 0,1 or 4\n", harq_ack[0]); packetError (harq_ack[1] == 1 || harq_ack[1] == 2 || harq_ack[1] == 4, "harq_ack[1] is %d, should be 0,1 or 4\n", harq_ack[1]); - if (!discard) { + if (goodPacket) { pdu->harq_indication_fdd_rel13.harq_tb_n[0] = harq_ack[0]; pdu->harq_indication_fdd_rel13.harq_tb_n[1] = harq_ack[1]; // release DLSCH if needed @@ -2011,7 +2011,7 @@ void fill_uci_harq_indication (int UEid, PHY_VARS_eNB *eNB, LTE_eNB_UCI *uci, in packetError(1==0,"only format 1a/b for now, received %d\n",uci->pucch_fmt); } else { // TDD packetError (tdd_mapping_mode == 0 || tdd_mapping_mode == 1 || tdd_mapping_mode == 2, "Illegal tdd_mapping_mode %d\n", tdd_mapping_mode); - if (!discard) { + if (goodPacket) { pdu->harq_indication_tdd_rel13.tl.tag = NFAPI_HARQ_INDICATION_TDD_REL13_TAG; pdu->harq_indication_tdd_rel13.mode = tdd_mapping_mode; LOG_D(PHY,"%s(eNB, uci_harq format %d, rnti:%04x, frame:%d, subframe:%d, tdd_mapping_mode:%d) harq_ack[0]:%d harq_ack[1]:%d\n", __FUNCTION__, uci->pucch_fmt,uci->rnti, frame, subframe, @@ -2024,7 +2024,7 @@ void fill_uci_harq_indication (int UEid, PHY_VARS_eNB *eNB, LTE_eNB_UCI *uci, in pdu->harq_indication_tdd_rel13.number_of_ack_nack = 1; LOG_D(PHY,"bundling, pucch1a, number of ack nack %d\n",pdu->harq_indication_tdd_rel13.number_of_ack_nack); packetError(harq_ack[0] == 1 || harq_ack[0] == 2 || harq_ack[0] == 4, "harq_ack[0] is %d, should be 1,2 or 4\n",harq_ack[0]); - if (!discard) { + if (goodPacket) { pdu->harq_indication_tdd_rel13.harq_data[0].bundling.value_0 = harq_ack[0]; // release all bundled DLSCH if needed release_harq(eNB,DLSCH_id,0,frame,subframe,0xffff, harq_ack[0] == 1); @@ -2033,7 +2033,7 @@ void fill_uci_harq_indication (int UEid, PHY_VARS_eNB *eNB, LTE_eNB_UCI *uci, in pdu->harq_indication_tdd_rel13.number_of_ack_nack = 2; packetError(harq_ack[0] == 1 || harq_ack[0] == 2 || harq_ack[1] == 4, "harq_ack[0] is %d, should be 0,1 or 4\n",harq_ack[0]); packetError(harq_ack[1] == 1 || harq_ack[1] == 2 || harq_ack[1] == 4, "harq_ack[1] is %d, should be 0,1 or 4\n",harq_ack[1]); - if (!discard) { + if (goodPacket) { pdu->harq_indication_tdd_rel13.tl.tag = NFAPI_HARQ_INDICATION_TDD_REL13_TAG; pdu->harq_indication_tdd_rel13.harq_data[0].bundling.value_0 = harq_ack[0]; pdu->harq_indication_tdd_rel13.harq_data[1].bundling.value_0 = harq_ack[1]; @@ -2047,12 +2047,12 @@ void fill_uci_harq_indication (int UEid, PHY_VARS_eNB *eNB, LTE_eNB_UCI *uci, in case 1: // multiplexing packetError (uci->pucch_fmt == pucch_format1b, "uci->pucch_format %d is not format1b\n", uci->pucch_fmt); - if (!discard) { + if (goodPacket) { if (uci->num_pucch_resources == 1 && uci->pucch_fmt == pucch_format1a) { pdu->harq_indication_tdd_rel13.tl.tag = NFAPI_HARQ_INDICATION_TDD_REL13_TAG; pdu->harq_indication_tdd_rel13.number_of_ack_nack = 1; packetError(harq_ack[0] == 1 || harq_ack[0] == 2 || harq_ack[0] == 4, "harq_ack[0] is %d, should be 1,2 or 4\n",harq_ack[0]); - if (!discard) { + if (goodPacket) { pdu->harq_indication_tdd_rel13.harq_data[0].multiplex.value_0 = harq_ack[0]; // release all DLSCH if needed release_harq(eNB,DLSCH_id,0,frame,subframe,0xffff, harq_ack[0] == 1); @@ -2062,7 +2062,7 @@ void fill_uci_harq_indication (int UEid, PHY_VARS_eNB *eNB, LTE_eNB_UCI *uci, in pdu->harq_indication_tdd_rel13.number_of_ack_nack = 2; packetError(harq_ack[0] == 1 || harq_ack[0] == 2 || harq_ack[1] == 4, "harq_ack[0] is %d, should be 0,1 or 4\n",harq_ack[0]); packetError(harq_ack[1] == 1 || harq_ack[1] == 2 || harq_ack[1] == 4, "harq_ack[1] is %d, should be 0,1 or 4\n",harq_ack[1]); - if (!discard) { + if (goodPacket) { pdu->harq_indication_tdd_rel13.harq_data[0].multiplex.value_0 = harq_ack[0]; pdu->harq_indication_tdd_rel13.harq_data[1].multiplex.value_0 = harq_ack[1]; // release all DLSCH if needed @@ -2144,7 +2144,7 @@ void fill_uci_harq_indication (int UEid, PHY_VARS_eNB *eNB, LTE_eNB_UCI *uci, in } } //TDD - if (!discard) { + if (goodPacket) { eNB->UL_INFO.harq_ind.harq_indication_body.number_of_harqs++; LOG_D(PHY,"Incremented eNB->UL_INFO.harq_ind.harq_indication_body.number_of_harqs:%d\n", eNB->UL_INFO.harq_ind.harq_indication_body.number_of_harqs); } else { From 866311ac1524afa35530f024c2eb5a1d543bd17f Mon Sep 17 00:00:00 2001 From: Sakthivel Velumani Date: Tue, 22 Feb 2022 12:11:35 +0530 Subject: [PATCH 50/96] enabled second tx thread stats --- executables/nr-gnb.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/executables/nr-gnb.c b/executables/nr-gnb.c index 2b1c36407b..7ca416b209 100644 --- a/executables/nr-gnb.c +++ b/executables/nr-gnb.c @@ -301,7 +301,7 @@ void rx_func(void *param) { static void dump_L1_meas_stats(PHY_VARS_gNB *gNB, RU_t *ru, char *output) { int stroff = 0; stroff += print_meas_log(gNB->phy_proc_tx[0], "L1 Tx processing thread 0", NULL, NULL, output); - //stroff += print_meas_log(gNB->phy_proc_tx[1], "L1 Tx processing thread 1", NULL, NULL, output+stroff); + stroff += print_meas_log(gNB->phy_proc_tx[1], "L1 Tx processing thread 1", NULL, NULL, output+stroff); stroff += print_meas_log(&gNB->dlsch_encoding_stats, "DLSCH encoding", NULL, NULL, output+stroff); stroff += print_meas_log(&gNB->phy_proc_rx, "L1 Rx processing", NULL, NULL, output+stroff); stroff += print_meas_log(&gNB->ul_indication_stats, "UL Indication", NULL, NULL, output+stroff); @@ -338,7 +338,7 @@ void *nrL1_stats_thread(void *param) { AssertFatal(fd!=NULL,"Cannot open nrL1_stats.log\n"); reset_meas(gNB->phy_proc_tx[0]); - //reset_meas(gNB->phy_proc_tx[1]); + reset_meas(gNB->phy_proc_tx[1]); reset_meas(&gNB->dlsch_encoding_stats); reset_meas(&gNB->phy_proc_rx); reset_meas(&gNB->ul_indication_stats); From 57c480a8a3d49fa8d39f045b131c83d82e593a28 Mon Sep 17 00:00:00 2001 From: Sakthivel Velumani Date: Tue, 22 Feb 2022 21:09:59 +0530 Subject: [PATCH 51/96] Merged the two thread stats into a global one --- executables/nr-gnb.c | 8 ++------ openair1/PHY/defs_gNB.h | 2 +- openair1/SCHED_NR/fapi_nr_l1.c | 2 ++ openair1/SCHED_NR/phy_procedures_nr_gNB.c | 5 ++++- 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/executables/nr-gnb.c b/executables/nr-gnb.c index 7ca416b209..cf48a1c3fd 100644 --- a/executables/nr-gnb.c +++ b/executables/nr-gnb.c @@ -300,8 +300,7 @@ void rx_func(void *param) { } static void dump_L1_meas_stats(PHY_VARS_gNB *gNB, RU_t *ru, char *output) { int stroff = 0; - stroff += print_meas_log(gNB->phy_proc_tx[0], "L1 Tx processing thread 0", NULL, NULL, output); - stroff += print_meas_log(gNB->phy_proc_tx[1], "L1 Tx processing thread 1", NULL, NULL, output+stroff); + stroff += print_meas_log(&gNB->phy_proc_tx, "L1 Tx processing", NULL, NULL, output); stroff += print_meas_log(&gNB->dlsch_encoding_stats, "DLSCH encoding", NULL, NULL, output+stroff); stroff += print_meas_log(&gNB->phy_proc_rx, "L1 Rx processing", NULL, NULL, output+stroff); stroff += print_meas_log(&gNB->ul_indication_stats, "UL Indication", NULL, NULL, output+stroff); @@ -337,8 +336,7 @@ void *nrL1_stats_thread(void *param) { fd=fopen("nrL1_stats.log","w"); AssertFatal(fd!=NULL,"Cannot open nrL1_stats.log\n"); - reset_meas(gNB->phy_proc_tx[0]); - reset_meas(gNB->phy_proc_tx[1]); + reset_meas(&gNB->phy_proc_tx); reset_meas(&gNB->dlsch_encoding_stats); reset_meas(&gNB->phy_proc_rx); reset_meas(&gNB->ul_indication_stats); @@ -450,8 +448,6 @@ void init_gNB_Tpool(int inst) { processingData_L1tx_t *msgDataTx = (processingData_L1tx_t *)NotifiedFifoData(msgL1Tx); init_DLSCH_struct(gNB, msgDataTx); memset(msgDataTx->ssb, 0, 64*sizeof(NR_gNB_SSB_t)); - reset_meas(&msgDataTx->phy_proc_tx); - gNB->phy_proc_tx[i] = &msgDataTx->phy_proc_tx; pushNotifiedFIFO(gNB->L1_tx_free,msgL1Tx); // to unblock the process in the beginning } diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h index 7c7d30a6e2..7d5cb285b5 100644 --- a/openair1/PHY/defs_gNB.h +++ b/openair1/PHY/defs_gNB.h @@ -856,7 +856,7 @@ typedef struct PHY_VARS_gNB_s { /* time_stats_t phy_proc; */ - time_stats_t *phy_proc_tx[2]; + time_stats_t phy_proc_tx; time_stats_t phy_proc_rx; time_stats_t rx_prach; /* diff --git a/openair1/SCHED_NR/fapi_nr_l1.c b/openair1/SCHED_NR/fapi_nr_l1.c index 2dbaa738dc..78e722c4b5 100644 --- a/openair1/SCHED_NR/fapi_nr_l1.c +++ b/openair1/SCHED_NR/fapi_nr_l1.c @@ -166,6 +166,8 @@ void nr_schedule_response(NR_Sched_Rsp_t *Sched_INFO){ res = pullTpool(gNB->L1_tx_free, gNB->threadPool); processingData_L1tx_t *msgTx = (processingData_L1tx_t *)NotifiedFifoData(res); + merge_meas(&gNB->phy_proc_tx, &msgTx->phy_proc_tx); + msgTx->num_pdsch_slot=0; msgTx->num_dl_pdcch=0; msgTx->num_ul_pdcch=number_ul_dci_pdu; diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index 41f395c090..bc4493cd1c 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -134,7 +134,10 @@ void phy_procedures_gNB_TX(processingData_L1tx_t *msgTx, VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_gNB_TX+offset,1); - if (do_meas==1) start_meas(&msgTx->phy_proc_tx); + if (do_meas==1) { + reset_meas(&msgTx->phy_proc_tx); + start_meas(&msgTx->phy_proc_tx); + } // clear the transmit data array and beam index for the current slot for (aa=0; aacarrier_config.num_tx_ant.value; aa++) { From b9b2eb007aa77c8a6362157fc3942be7fc1ef8c6 Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Wed, 23 Feb 2022 22:34:35 +0100 Subject: [PATCH 52/96] Fix for nr_dlsim --- openair1/SIMULATION/NR_PHY/dlsim.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/openair1/SIMULATION/NR_PHY/dlsim.c b/openair1/SIMULATION/NR_PHY/dlsim.c index 046f410bd4..7363d1abd5 100644 --- a/openair1/SIMULATION/NR_PHY/dlsim.c +++ b/openair1/SIMULATION/NR_PHY/dlsim.c @@ -1000,7 +1000,6 @@ int main(int argc, char **argv) msgDataTx->frame = frame; memset(msgDataTx->ssb, 0, 64*sizeof(NR_gNB_SSB_t)); reset_meas(&msgDataTx->phy_proc_tx); - gNB->phy_proc_tx[0] = &msgDataTx->phy_proc_tx; for (SNR = snr0; SNR < snr1; SNR += .2) { @@ -1314,7 +1313,7 @@ int main(int argc, char **argv) printf("\ngNB TX function statistics (per %d us slot, NPRB %d, mcs %d, block %d)\n", 1000>>*scc->ssbSubcarrierSpacing, g_rbSize, g_mcsIndex, msgDataTx->dlsch[0][0]->harq_process.pdsch_pdu.pdsch_pdu_rel15.TBSize[0]<<3); - printDistribution(gNB->phy_proc_tx[0],table_tx,"PHY proc tx"); + printDistribution(&gNB->phy_proc_tx,table_tx,"PHY proc tx"); printStatIndent2(&gNB->dlsch_encoding_stats,"DLSCH encoding time"); printStatIndent3(&gNB->dlsch_segmentation_stats,"DLSCH segmentation time"); printStatIndent3(&gNB->tinput,"DLSCH LDPC input processing time"); From 8a43a0306fea55049ea79d2e003167b070d3d9c6 Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Thu, 24 Feb 2022 20:55:38 +0100 Subject: [PATCH 53/96] fix nr_ulsim --- openair1/SIMULATION/NR_PHY/ulsim.c | 1 - 1 file changed, 1 deletion(-) diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c index 6e9b88593c..1f17c3adce 100644 --- a/openair1/SIMULATION/NR_PHY/ulsim.c +++ b/openair1/SIMULATION/NR_PHY/ulsim.c @@ -683,7 +683,6 @@ int main(int argc, char **argv) notifiedFIFO_elt_t *msgL1Tx = newNotifiedFIFO_elt(sizeof(processingData_L1tx_t),0,gNB->L1_tx_free,NULL); processingData_L1tx_t *msgDataTx = (processingData_L1tx_t *)NotifiedFifoData(msgL1Tx); msgDataTx->slot = -1; - gNB->phy_proc_tx[0] = &msgDataTx->phy_proc_tx; //gNB_config = &gNB->gNB_config; //memset((void *)&gNB->UL_INFO,0,sizeof(gNB->UL_INFO)); From a0ac75a45bd40878563d44d525d2c49b41ccc3b9 Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Thu, 24 Feb 2022 19:07:50 +0100 Subject: [PATCH 54/96] Delete unused files --- targets/RT/USER/lte-hwlat.c | 944 ------------------------- targets/RT/USER/lte-hwlat2.c | 1282 ---------------------------------- 2 files changed, 2226 deletions(-) delete mode 100755 targets/RT/USER/lte-hwlat.c delete mode 100644 targets/RT/USER/lte-hwlat2.c diff --git a/targets/RT/USER/lte-hwlat.c b/targets/RT/USER/lte-hwlat.c deleted file mode 100755 index 20482adf87..0000000000 --- a/targets/RT/USER/lte-hwlat.c +++ /dev/null @@ -1,944 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.1 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -#define _GNU_SOURCE -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "assertions.h" -#include "PHY/types.h" - -#include "PHY/defs.h" - -#include -#define GET_TIME_INIT(num) struct timeval _timers[num] -#define GET_TIME_VAL(num) gettimeofday(&_timers[num], NULL) -#define TIME_VAL_TO_MS(num) (((double)_timers[num].tv_sec*1000.0) + ((double)_timers[num].tv_usec/1000.0)) - -#undef MALLOC //there are two conflicting definitions, so we better make sure we don't use it at all -//#undef FRAME_LENGTH_COMPLEX_SAMPLES //there are two conflicting definitions, so we better make sure we don't use it at all - -#include "../../ARCH/COMMON/common_lib.h" - -#include "PHY/extern.h" -#include "SCHED/extern.h" -#include "LAYER2/MAC/extern.h" -#include "LAYER2/MAC/proto.h" - -#define SYRIQ_CHANNEL_TESTER 0 -#define SYRIQ_CHANNEL_TESTER2 0 -#define SYRIQ_CHANNEL_DATA1 1 - -volatile int oai_exit = 0; - -openair0_config_t openair0_cfg[MAX_CARDS]; - -#if 0 -#define NB_ANTENNAS_RX 4 - -#define DevAssert(cOND) _Assert_(cOND, _Assert_Exit_, "") -#define malloc16(x) memalign(16,x) - -#ifdef 0 -static inline void* malloc16_clear( size_t size ) -{ -#ifdef __AVX2__ - void* ptr = memalign(32, size); -#else - void* ptr = memalign(16, size); -#endif - if(ptr) - memset( ptr, 0, size ); - return ptr; -} -#endif - -#endif - -typedef struct latency_stat { - uint64_t counter; - - uint64_t stat250; - uint64_t stat500; - uint64_t stat600; - uint64_t stat700; - uint64_t stat800; - - uint64_t stat1300; - uint64_t stat1500; - uint64_t stat2000; - uint64_t stat2500; - uint64_t stat3000; - - uint64_t stat880; - uint64_t stat960; - uint64_t stat1040; - uint64_t stat1120; - uint64_t stat1200; -} latency_stat_t; - - -typedef struct timing_stats { - char *name; - double min; - double max; - double total; - unsigned int count; -} timing_stats_t; - - -//static struct timespec get_timespec_diff( -// struct timespec *start, -// struct timespec *stop ) -//{ -// struct timespec result; -// -// if ( ( stop->tv_nsec - start->tv_nsec ) < 0 ) { -// result.tv_sec = stop->tv_sec - start->tv_sec - 1; -// result.tv_nsec = stop->tv_nsec - start->tv_nsec + 1000000000; -// } -// else { -// result.tv_sec = stop->tv_sec - start->tv_sec; -// result.tv_nsec = stop->tv_nsec - start->tv_nsec; -// } -// -// return result; -//} - - -//static void measure_time ( -// openair0_device *rf_device, -// struct timespec *start, -// struct timespec *stop, -// timing_stats_t *stats, -// boolean_t START, -// uint8_t PRINT_INTERVAL ) -//{ -// if ( START ) { -// clock_gettime( CLOCK_MONOTONIC, start ); -// } -// else { -// clock_gettime( CLOCK_MONOTONIC, stop ); -// -// struct timespec diff; -// double current = 0; -//// boolean_t show_stats = false; -// -// diff = get_timespec_diff( start, stop ); -// current = (double)diff.tv_sec * 1000000 + (double)diff.tv_nsec / 1000; -// -// if ( current > stats->max ) { -// stats->max = current; -//// show_stats = true; -// } -// if ( stats->min == 0 || current < stats->min ) { -// stats->min = current; -//// show_stats = true; -// } -// stats->total += current; -// -//// if ( show_stats ) { -//// rf_device.trx_get_stats_func( &rf_device ); -//// } -// -//// if ( stats->count % PRINT_INTERVAL == 0 ) { -//// double avg = stats->total / ( stats->count + 1 ); -//// printf( "[%s][%d] Current : %.2lf µs, Min : %.2lf µs, Max : %.2lf µs, Avg : %.2lf µs\n", -//// stats->count, stats->name, current, stats->min, stats->max, avg ); -//// } -// -// stats->count++; -// } -//} -int32_t **rxdata; -int32_t **txdata; - -int setup_ue_buffers(PHY_VARS_UE **phy_vars_ue, openair0_config_t *openair0_cfg); - -static inline void saif_meas(unsigned int frame_rx, unsigned int subframe_rx) { - static latency_stat_t __thread latency_stat; - static struct timespec __thread last= {0}; - struct timespec now; - clock_gettime(CLOCK_MONOTONIC_RAW, &now); - if ( last.tv_sec ) { - uint64_t diffTime = ((uint64_t)now.tv_sec *1000 *1000 *1000 + now.tv_nsec) - - ((uint64_t)last.tv_sec *1000 *1000 *1000 + last.tv_nsec); - diffTime/=1000; - latency_stat.counter++; - - if ( diffTime <= 800 ) { - if (diffTime < 250 ) - latency_stat.stat250++; - else if (diffTime < 500 ) - latency_stat.stat500++; - else if (diffTime < 600 ) - latency_stat.stat600++; - else if (diffTime < 700 ) - latency_stat.stat700++; - else - latency_stat.stat800++; - } - else if ( diffTime > 1200 ) { - if (diffTime < 1500 ) - latency_stat.stat1300++; - else if ( diffTime < 2000 ) - latency_stat.stat1500++; - else if ( diffTime < 2500 ) - latency_stat.stat2000++; - else if ( diffTime < 3000 ) - latency_stat.stat2500++; - else - latency_stat.stat3000++; - } - else - if (diffTime <= 880 ) - latency_stat.stat880++; - else if (diffTime <= 960 ) - latency_stat.stat960++; - else if (diffTime <= 1040 ) - latency_stat.stat1040++; - else if (diffTime < 1120 ) - latency_stat.stat1120++; - else - latency_stat.stat1200++; - - - if ( (diffTime>=1500) || ( !(frame_rx%1024) && subframe_rx == 0 ) ) { - time_t current=time(NULL); - printf("\n"); - printf("%.2f Period stats cnt=%7.7ld 0.. 250=%7.7ld 250.. 500=%7.7ld 500.. 600=%7.7ld 600.. 700=%7.7ld 700.. 800=%7.7ld - (frame_rx=%u) - %s", - now.tv_sec+(double)now.tv_nsec/1e9, - latency_stat.counter, - latency_stat.stat250, latency_stat.stat500, - latency_stat.stat600, latency_stat.stat700, - latency_stat.stat800, - frame_rx, - ctime(¤t)); - printf("%.2f Period stats cnt=%7.7ld 800.. 880=%7.7ld 880.. 960=%7.7ld 960..1040=%7.7ld 1040..1120=%7.7ld 1120..1200=%7.7ld - (frame_rx=%u) - %s", - now.tv_sec+(double)now.tv_nsec/1e9, - latency_stat.counter, - latency_stat.stat880, latency_stat.stat960, - latency_stat.stat1040, latency_stat.stat1120, - latency_stat.stat1200, - frame_rx, - ctime(¤t)); - printf("%.2f Period stats cnt=%7.7ld 1200..1300=%7.7ld 1300..1500=%7.7ld 1500..2000=%7.7ld 2000..2500=%7.7ld >3000=%7.7ld - (frame_rx=%u) - %s", - now.tv_sec+(double)now.tv_nsec/1e9, - latency_stat.counter, - latency_stat.stat1300, latency_stat.stat1500, - latency_stat.stat2000, latency_stat.stat2500, - latency_stat.stat3000, - frame_rx, - ctime(¤t)); - fflush(stdout); - } - } - last=now; -} -/* End of Changed by SYRTEM */ - -void exit_fun(const char* s) -{ - - if (s != NULL) { - printf("%s %s() Exiting OAI softmodem: %s\n",__FILE__, __FUNCTION__, s); - } - - oai_exit = 1; - -} - - -void init_thread(int sched_runtime, int sched_deadline, int sched_fifo, char * name) { - -#ifdef DEADLINE_SCHEDULER - if (sched_runtime!=0) { - struct sched_attr attr= {0}; - attr.size = sizeof(attr); - // This creates a .5 ms fpga_recv_cnt reservation - attr.sched_policy = SCHED_DEADLINE; - attr.sched_runtime = sched_runtime; - attr.sched_deadline = sched_deadline; - attr.sched_period = 0; - AssertFatal(sched_setattr(0, &attr, 0) == 0, - "[SCHED] main eNB thread: sched_setattr failed %s \n",perror(errno)); - LOG_I(HW,"[SCHED][eNB] eNB main deadline thread %lu started on CPU %d\n", - (unsigned long)gettid(), sched_getcpu()); - } - -#else -#ifdef CPU_AFFINITY - if (get_nprocs() >2) { - for (j = 1; j < get_nprocs(); j++) - CPU_SET(j, &cpuset); - } - AssertFatal( 0 == pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset)==0,""); -#endif - struct sched_param sp; - sp.sched_priority = sched_fifo; - AssertFatal(pthread_setschedparam(pthread_self(),SCHED_FIFO,&sp)==0, - "Can't set thread priority, Are you root?\n"); -#endif - - // Lock memory from swapping. This is a process wide call (not constraint to this thread). - mlockall(MCL_CURRENT | MCL_FUTURE); - pthread_setname_np( pthread_self(), name ); - -} - - -int main(void) -{ - int ret; - uint64_t i; - openair0_device rf_device; - openair0_timestamp timestamp = 0; - - unsigned int sub_frame = 0; - unsigned int frame_rx = 0; - - unsigned int nb_antennas_tx = 1; - unsigned int nb_antennas_rx = 1; - - - openair0_cfg[0].mmapped_dma = 0; - openair0_cfg[0].configFilename = NULL; - openair0_cfg[0].duplex_mode = duplex_mode_FDD; - - uint32_t **sendbuff = NULL; - uint32_t **recvbuff = NULL; - uint32_t expected_value = 0; - uint32_t received_value = 0; - int nsamp = 0; // 1 ms - int antenna_id = 1; - int c = 0; - int numIter = 0; - int fpga_loop = 0; -#if SYRIQ_CHANNEL_DATA1 - uint64_t first_ts = 0; - uint8_t is_first_ts = 0; - uint64_t trx_read_cnt = 0; - uint32_t j = 0; - uint32_t err_cnt = 0; -#else - int failure = 0; -#endif -#if 0 // 5MHz BW - unsigned int nb_sample_per_tti = 7680; - openair0_cfg[0].sample_rate = 7.68e6; - openair0_cfg[0].samples_per_frame = nb_sample_per_tti*10; - openair0_cfg[0].rx_bw = 2.5e6; - openair0_cfg[0].tx_bw = 2.5e6; - openair0_cfg[0].num_rb_dl = 25; -#endif - -#if 0 // 10MHz BW - unsigned int nb_sample_per_tti = 15360; - openair0_cfg[0].sample_rate = 15.36e6; - openair0_cfg[0].samples_per_frame = nb_sample_per_tti*10; - openair0_cfg[0].rx_bw = 5.0e6; - openair0_cfg[0].tx_bw = 5.0e6; - openair0_cfg[0].num_rb_dl = 50; -#endif - -#if 1 // 20MHz BW - unsigned int nb_sample_per_tti = 30720; - openair0_cfg[0].sample_rate = 30.72e6; - openair0_cfg[0].samples_per_frame = nb_sample_per_tti*10; - openair0_cfg[0].rx_bw = 10.0e6; - openair0_cfg[0].tx_bw = 10.0e6; - openair0_cfg[0].num_rb_dl = 100; -#endif - - const char *openair_dir = getenv("OPENAIR_DIR"); - const char *ini_file = "/usr/local/etc/syriq/ue.band7.tm1.PRB100.NR20.dat"; - - int readBlockSize; - void* rxp[nb_antennas_rx]; - void* txp[nb_antennas_tx]; - -// int32_t rxdata[1][nb_sample_per_tti*10+2048]; -#if 0 - int32_t **rxdata; -#endif -// init_thread(100000, 500000, sched_get_priority_max(SCHED_FIFO),"main UE"); - - printf("LTE HARDWARE Latency debug utility \n"); - printf("INIT data buffers \n"); - -#if 0 - rxdata = (int32_t**)memalign(32, nb_antennas_rx*sizeof(int32_t*) ); - rxdata[0] = (int32_t*)memalign(32,(nb_sample_per_tti*10+2048)*sizeof(int32_t)); -#else - rxdata = (int32_t**)malloc16( nb_antennas_rx*sizeof(int32_t*) ); - txdata = (int32_t**)malloc16( nb_antennas_tx*sizeof(int32_t*) ); - rxdata[0] = (int32_t*)malloc16_clear( 307200*sizeof(int32_t) ); - txdata[0] = (int32_t*)malloc16_clear( 307200*sizeof(int32_t) ); -#endif - - printf("INIT done\n"); - - memset(&rf_device, 0, sizeof(openair0_device)); - - rf_device.host_type = BBU_HOST; - openair0_cfg[0].duplex_mode = duplex_mode_FDD; - openair0_cfg[0].rx_num_channels = 1; - openair0_cfg[0].tx_num_channels = 1; - - // configure channel 0 - for (i=0; i= 2-307200 -> check expected value + status (RxoVer TxUnder) - - rxp[0] = (void*)&rxdata[0][0]; - txp[0] = (void*)&txdata[0][0]; - timestamp = 0; - nsamp = 30720; // 30720 => 1ms buffer - trx_read_cnt = 100000; // 1 loop => 1ms (10sec=10000; 15min = 900000) - antenna_id = 1; - int diff = 0; - int compare_start = 0; - - uint32_t looploop=0; - uint64_t error_cnt = 0; - uint64_t error_ts_start; - - for (i = 0; i < trx_read_cnt; i++) - { - -// printf("\n\n"); - - -// ret = rf_device.trx_read_func( &rf_device, ×tamp, &(rxp[0][(i*30720)%307200]), nsamp, antenna_id ); -// ret = rf_device.trx_read_func( &rf_device, ×tamp, recvbuff[0][(i*30720)%307200], nsamp, antenna_id ); - rxp[0] = (void*)&rxdata[0][(i*30720)%307200]; - GET_TIME_VAL(0); - ret = rf_device.trx_read_func( &rf_device, ×tamp, rxp, nsamp, antenna_id ); - GET_TIME_VAL(1); - - if (ret != nsamp) - { - printf("Error: nsamp received (%d) != nsamp required (%d)\n", ret, nsamp); - fflush(stdout); - return (-1); - } - if (!is_first_ts) - { - first_ts = timestamp; - is_first_ts = 1; - } - -// printf("%d - trx_read_func ret=%d - ts = %d - @=0x%08lx\n", i, ret, timestamp, rxp[0] ); - - txp[0] = (void*)&(txdata[0][ ((i*30720)%307200+2*30720)%307200 ]); -// printf(" i=%d @txp[0][0] = 0x%016lx\n", i, &(((uint32_t *)txp[0])[0]) ); -// printf(" i=%d @txp[0][1] = 0x%016lx\n", i, &(((uint32_t *)txp[0])[1]) ); - - for ( c = 0; c < nsamp; c++ ) - { - (((uint32_t *)txp[0])[c]) = ( (((timestamp+c+2*30720)<<4)&0x0000FFF0) + (((timestamp+c+2*30720)<<8)&0xFFF00000) ); - } - -// printf(" txp[0][%d] = 0x%x\n",0,((uint32_t *)(txp[0]))[0]); -// printf(" txp[0][%d] = 0x%x\n",1,((uint32_t *)(txp[0]))[1]); -// printf(" ...\n"); -// printf(" txp[0][%d] = 0x%x\n",nsamp-2,((uint32_t *)(txp[0]))[nsamp-2]); -// printf(" txp[0][%d] = 0x%x\n",nsamp-1,((uint32_t *)(txp[0]))[nsamp-1]); - - - ret = rf_device.trx_write_func( &rf_device, (timestamp+2*30720), txp, nsamp, antenna_id, false ); - if (ret != nsamp) - { - printf("Error: nsamp sent (%d) != nsamp required (%d)\n", ret, nsamp); - fflush(stdout); - return (-1); - } - -// printf("%d - trx_write_func ret=%d - ts = %d - @=0x%08lx\n", i, ret, (timestamp+2*30720), txp[0] ); - - - if (timestamp >= (first_ts + 2 * 307200)) - { - - // check Rx Overflow - - // check Tx Underflow - - // check Expected Value - for ( c = 0; c < nsamp; c++ ) - { - -// LOOPBACK -#if 1 - expected_value = ((timestamp + c)&0xFFFFFF); - received_value = ((uint32_t *)(rxp[0]))[c]; - received_value = ((received_value)&0xFFF) + ((received_value>>4)&0xFFF000); - - if (compare_start == 0) - { - compare_start = 1; - diff = expected_value - received_value; - } - received_value = (received_value + diff)&0xFFFFFF; - -#if 1 - - if (expected_value != received_value) - { - if(!error_cnt) - error_ts_start = (timestamp + c); - else - { - if (looploop < 32) - printf("%d - %d != %d - ts %d - raw 0x%x - diff %d\n", - looploop, - expected_value, received_value, - (timestamp + c), ((uint32_t *)(rxp[0]))[c], - diff); - looploop++; - } - - error_cnt++; - - if(!(error_cnt%102400)) - printf(" -> error detected : cnt=%d - start=%ld - stop=... diff=%d\n", - error_cnt, - error_ts_start, - diff); - - } - else - { - if(error_cnt) - { - printf(" -> error detected : cnt=%d - start=%ld - stop=%ld\n\n", - error_cnt, - error_ts_start, - (timestamp + c) ); - looploop=0; - } - error_cnt=0; - } -#endif -#endif - -// DEBUG mode 0 -#if 0 - received_value = ((uint32_t *)(rxp[0]))[c]; - received_value = ((received_value)&0xFFF) + ((received_value>>4)&0xFFF000); - received_value = (received_value&0xFFFFFF); - if (compare_start == 0) - { - compare_start = 1; - expected_value = received_value; - } - else - { - expected_value++; - expected_value = (expected_value&0xFFFFFF); - } - - if (expected_value != received_value) - { - if(!error_cnt) - error_ts_start = (timestamp + c); - error_cnt++; - } - else - { - if(error_cnt) - { - printf(" -> error detected : cnt=%d - start=%ld - stop=%ld\n\n", - error_cnt, - error_ts_start, - (timestamp + c) ); - } - error_cnt=0; - } - - - -// if (expected_value != received_value) -// { -// printf("%d -> %d != %d (ts+c=%ld)(raw=0x%08x)\n", -// looploop, -// expected_value, received_value, -// (timestamp + c), -// ((uint32_t *)(rxp[0]))[c] ); -// -// if (received_value) -// expected_value = received_value; -// } -#endif - - } - } - } - - printf("HwLat Application returns !!!\n"); - fflush(stdout); - sleep(1); - - - printf("\n"); - rf_device.trx_end_func( &rf_device ); - - sleep(1); - free(sendbuff[0]); - free(sendbuff); - free(recvbuff[0]); - free(recvbuff); - - exit(0); - - - - return(0); - - - -// puts( "* Frequency modification test" ); -// rf_device.trx_set_freq_func( &rf_device, &openair0_cfg[0], 0 ); - -// puts( "* Gain modification test" ); -// rf_device.trx_set_gains_func( &rf_device, &openair0_cfg[0] ); // NOT working (cf. initialization) - -//#if LTE_UE -// sleep(1); - GET_TIME_VAL(0); - for (i = 0; i < trx_read_cnt; i++) - { - printf("\n"); - ret = rf_device.trx_read_func( &rf_device, ×tamp, rxp, nsamp, antenna_id ); - printf("* timestamp=%ld\n", timestamp); -#if 1 - for (j = 0; j < nsamp; j++) - { - if ( ((uint32_t *)rxp[0])[j] != ((expected_value + j + timestamp)%307200) ) - { - err_cnt++; - printf("rxp[%06d]=0x%08x (expected 0x%08lx)\n", j, ((uint32_t *)rxp[0])[j], ((expected_value + j + timestamp)%307200) ); - } - if (err_cnt >= 128) - { - printf("Error: more than 128 expected value failed !\n"); - i = (trx_read_cnt - 1); - j = nsamp; - break; - } - } - //expected_value = (expected_value + nsamp)%307200; - expected_value = (expected_value)%307200; -#endif - } - GET_TIME_VAL(1); -//#endif - -/* ********** ********** */ -/* SYRIQ_CHANNEL_DATA1 */ -/* ********** ********** */ -#if SYRIQ_CHANNEL_DATA1 - -// rf_device.trx_get_stats_func( &rf_device ); - - rf_device.trx_end_func( &rf_device ); - - printf("\n* rf_device.trx_read_func(%d) x %d: %.6lf s\n\n", nsamp, i, ((TIME_VAL_TO_MS(1) - TIME_VAL_TO_MS(0)))/1000.0 ); - -// rf_device.trx_get_stats_func( &rf_device ); - -#if 0 - for (i = 0; i < nsamp; i++) - { -// if ( ((uint32_t *)rxp[0])[i] != i) -// { - err_cnt++; - printf("rxp[%06d]=0x%08x (expected 0x%08x)\n", i, ((uint32_t *)rxp[0])[i], i); -// } -// if (err_cnt > 256) -// { -// i = 307200; -// break; -// } - } -#endif -// for (i = 1024-32; i < 1024+32; i++) -// { -//// if ( ((uint32_t *)rxp[0])[i] != i) -//// { -// err_cnt++; -// printf("rxp[%06d]=0x%08x (expected 0x%08x)\n", i, ((uint32_t *)rxp[0])[i], i); -//// } -// if (err_cnt > 256) -// { -// i = 307200; -// break; -// } -// } - printf("SYRIQ CHANNEL DATA1 done !!!\n"); - sleep(1); - return(0); -#endif -/* ********** ********** */ -/* SYRIQ_CHANNEL_DATA1 */ -/* ********** ********** */ - - - - timestamp = 0; - ret = rf_device.trx_write_func( &rf_device, timestamp, (void**)sendbuff, nsamp, antenna_id, false ); - printf("* rf_device.trx_write_func returns %d\n", ret); - - sleep(1); - - nsamp = 30720; - numIter = 100000; - for ( c = 0; c < numIter; c++ ) - { - fpga_loop ++; - if ( !(fpga_loop % 1000) ) - { - printf("\rtest loop %d / %d", fpga_loop, numIter); - fflush(stdout); - } - -// printf("* TEST : %08d\n", (c+1)); -// measure_time( &rf_device, &start, &stop, &tx_stats, true, 10 ); -// ret = rf_device.trx_write_func( &rf_device, timestamp, (void**)sendbuff, nsamp, antenna_id, false ); -// printf("* rf_device.trx_write_func returns %d\n", ret); -// measure_time( &rf_device, &start, &stop, &tx_stats, false, 10 ); - -// sleep(1); - -// measure_time( &rf_device, &start, &stop, &tx_stats, true, 10 ); - ret = rf_device.trx_read_func( &rf_device, ×tamp, (void**)recvbuff, nsamp, antenna_id ); -// measure_time( &rf_device, &start, &stop, &tx_stats, false, 10 ); - - // Check the data - if (ret > 0) - { -/* ********** ********** */ -/* SYRIQ_CHANNEL_TESTER */ -/* ********** ********** */ -#if SYRIQ_CHANNEL_TESTER - failure = 0; - for (i = 0; i < ret; i++) - { - if ( ((i%1024) == 0) || ((i%1024) == 1) || ((i%1024) == 2) || ((i%1024) == 3) ) - { - if ( (recvbuff[0])[i] != (1020 + ((i%1024)+1)) ) - { - printf("* ERROR (buff[0])[%d]: %d, expected %d\n", i, (uint32_t)(recvbuff[0])[i], ((i%1024)+1) ); - failure = 1; - } - } - else if ( (recvbuff[0])[i] != ((i%1024)+1) ) - { - printf("* ERROR (buff[0])[%d]: %d, expected %d\n", i, (uint32_t)(recvbuff[0])[i], ((i%1024)+1) ); - failure = 1; - } - else - { - printf("* DONE (buff[0])[%d]: %d, expected %d\n", i, (uint32_t)(recvbuff[0])[i], ((i%1024)+1) ); - } - if(failure) - break; - } - if (failure) - printf("* ERROR recv %08d checked FAILURE ret=%d\n", (c+1), ret); - else - { -// printf("* DONE recv %08d checked SUCCESSFULLY ret=%d\n", (c+1), ret); - } -#endif -/* ********** ********** */ -/* SYRIQ_CHANNEL_TESTER2*/ -/* ********** ********** */ -#if SYRIQ_CHANNEL_TESTER2 -// printf("* ret=%d timestamp=%ld (%ld)\n", ret, timestamp, (timestamp%307200)); - failure = 0; - for (i = 0; i < ret; i++) - { -// printf("* (recvbuff[0])[%d]: %d\n", i, (uint32_t)(recvbuff[0])[i]); -// printf("* timestamp+(i/1024+1)*1024 - 3 + i%1024: %d\n", (timestamp-nsamp+(i/1024+1)*1024 - 3 + i%1024)%307200 ); - expected_value = ((((i%1024)+1)/*>>4*/)&0x00000FFF); - if ( ((i%1024) == 0) || ((i%1024) == 1) || ((i%1024) == 2) || ((i%1024) == 3) ) - { - expected_value = ((((timestamp-nsamp+(i/1024+1)*1024 - 3 + i%1024))%307200)); - if ( (recvbuff[0])[i] != expected_value) - { - if ( (expected_value == 0) && ((recvbuff[0])[i] != 4915200) ) - { - printf("* ERROR (buff[0])[%d]: %d, expected %d\n", i, (uint32_t)(recvbuff[0])[i], expected_value ); - failure = 1; - } - if ( (expected_value == 0) && ((recvbuff[0])[i] == 4915200) ) - { -// printf("* DONE loop in circular buffer\n"); - } - } - } - else if ( (recvbuff[0])[i] != expected_value ) - { - printf("* ERROR (buff[0])[%d]: %d, expected %d\n", i, (uint32_t)(recvbuff[0])[i], ((i%1024)+1) ); - failure = 1; - } - else - { -// printf("* DONE (buff[0])[%d]: %d, expected %d\n", i, (uint32_t)(recvbuff[0])[i], ((i%1024)+1) ); - } -// if(failure) -// break; - } - if (failure) - printf("* ERROR recv %08d checked FAILURE ret=%d\n", (c+1), ret); - else - { -// printf("* DONE recv %08d checked SUCCESSFULLY ret=%d\n", (c+1), ret); - } -#endif -#if LOOPBACK - -#endif - } - else - { - printf("* ERROR rf_device.trx_read_func returns %d\n", ret); - } - - } - printf("\n"); - rf_device.trx_end_func( &rf_device ); - - sleep(1); - free(sendbuff[0]); - free(sendbuff); - free(recvbuff[0]); - free(recvbuff); - - exit(0); - -// END IS HERE ! - - rf_device.trx_set_freq_func(&rf_device,&openair0_cfg[0],0); - - if (rf_device.trx_start_func(&rf_device) != 0 ) { - printf("Could not start the device\n"); - oai_exit=1; - } - - while(!oai_exit){ - - rxp[0] = (void*)&rxdata[0][sub_frame*nb_sample_per_tti]; - - readBlockSize = rf_device.trx_read_func(&rf_device, - ×tamp, - rxp, - nb_sample_per_tti, - 0); - - if ( readBlockSize != nb_sample_per_tti ) - oai_exit = 1; - - sub_frame++; - sub_frame%=10; - - if( sub_frame == 0) - frame_rx++; - - saif_meas(frame_rx, sub_frame); - } - - return(0); -} diff --git a/targets/RT/USER/lte-hwlat2.c b/targets/RT/USER/lte-hwlat2.c deleted file mode 100644 index 85ec61e44f..0000000000 --- a/targets/RT/USER/lte-hwlat2.c +++ /dev/null @@ -1,1282 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.1 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - - -/* ************************************************************************************************* - - USER GUIDE - - 1 - CONFIGURE TEST SESSION - see TESTS PARAMETERS section below - - 2 - COMPILATION CMD LINE (same as openair compilation) - - NO AVX SUPPORT - /usr/bin/cc -msse4.1 -mssse3 -std=gnu99 -Wall -Wstrict-prototypes -fno-strict-aliasing -rdynamic -funroll-loops -Wno-packed-bitfield-compat -fPIC -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_FCNTL_H=1 -DHAVE_ARPA_INET_H=1 -DHAVE_SYS_TIME_H=1 -DHAVE_SYS_SOCKET_H=1 -DHAVE_STRERROR=1 -DHAVE_SOCKET=1 -DHAVE_MEMSET=1 -DHAVE_GETTIMEOFDAY=1 -DHAVE_STDLIB_H=1 -DHAVE_MALLOC=1 -DHAVE_LIBSCTP -g -DMALLOC_CHECK_=3 -O2 -o lte-hwlat-test lte-hwlat2.c -lrt -lpthread -lm -ldl - - AVX2 Support - /usr/bin/cc -mavx2 -msse4.1 -mssse3 -std=gnu99 -Wall -Wstrict-prototypes -fno-strict-aliasing -rdynamic -funroll-loops -Wno-packed-bitfield-compat -fPIC -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_FCNTL_H=1 -DHAVE_ARPA_INET_H=1 -DHAVE_SYS_TIME_H=1 -DHAVE_SYS_SOCKET_H=1 -DHAVE_STRERROR=1 -DHAVE_SOCKET=1 -DHAVE_MEMSET=1 -DHAVE_GETTIMEOFDAY=1 -DHAVE_STDLIB_H=1 -DHAVE_MALLOC=1 -DHAVE_LIBSCTP -g -DMALLOC_CHECK_=3 -O2 -o lte-hwlat-test lte-hwlat2.c -lrt -lpthread -lm -ldl - - - 3 - RUN - sudo cset shield --force --kthread on -c 1-3 // for 4 cores - sudo cset shield --force --kthread on -c 1-7 // for 8 cores - sudo cset shield ./lte-hwlat-test - - 4 - remove cset shield - sudo cset shield --reset - - ***************************************************************************************************/ - -/* ************************************************************************************************* - * TESTS PARAMETERS - */ -#define HWLAT_LOOP_CNT 1000000 /* measurment loop count for each thread*/ -#define HWLAT_TTI_SLEEP_US 250 /* usleep duration -> IQ capture simulation (in µ seconds) */ - -#define RX_NB_TH 6 - -#define CALIB_RT_INTRUMENTATION 0 - -/* Laurent Thpmas instrumentation -> see openair2/UTIL/LOG/log.h for full implementation - -> This is a copy and paste implementation in this file for a self contained source */ -#define INSTRUMENTATION_LT_RDTSC 1 -/* SYRTEM rdtsc instrumentation implementation (see below for more infaormation) */ -#define INSTRUMENTATION_SYR_RDTSC 2 -/* SYRTEM instrumentation using clock_gettime MONOTONIC */ -#define INSTRUMENTATION_SYR_CLOCK_MONO 3 -/* SYRTEM instrumentation using clock_gettime REALTIME */ -#define INSTRUMENTATION_SYR_CLOCK_REALTIME 4 - -#define HWLAT_INSTRUMENTATION INSTRUMENTATION_LT_RDTSC - - -/* Statistics histogram output */ -#define HISTOGRAM_MIN_VALUE 0 -#define HISTOGRAM_MAX_VALUE 2000 -#define HISTOGRAM_STEP 1 -#define HISTOGRAM_SIZE ( ( ( HISTOGRAM_MAX_VALUE - HISTOGRAM_MIN_VALUE ) / HISTOGRAM_STEP ) + 1 ) - - - -/* *************************************************************************************************/ - - -/* - * INCLUDES - */ -#define _GNU_SOURCE -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include /* For SYS_xxx definitions */ -#ifndef __STDC_FORMAT_MACROS -#define __STDC_FORMAT_MACROS -#endif -#include - - -/* From rt_wrapper.h -****************************************************************************************/ -#define gettid() syscall(__NR_gettid) // for gettid - -/* From common/utils/itti/assertions.h -****************************************************************************************/ -# define display_backtrace() - -#define _Assert_Exit_ \ -{ \ - fprintf(stderr, "\nExiting execution\n"); \ - display_backtrace(); \ - fflush(stdout); \ - fflush(stderr); \ - exit(EXIT_FAILURE); \ -} - -#define _Assert_(cOND, aCTION, fORMAT, aRGS...) \ -do { \ - if (!(cOND)) { \ - fprintf(stderr, "\nAssertion ("#cOND") failed!\n" \ - "In %s() %s:%d\n" fORMAT, \ - __FUNCTION__, __FILE__, __LINE__, ##aRGS); \ - aCTION; \ - } \ -} while(0) - -#define AssertFatal(cOND, fORMAT, aRGS...) _Assert_(cOND, _Assert_Exit_, fORMAT, ##aRGS) - - -/* From "openair1/PHY/TOOLS/time_meas.h" -****************************************************************************************/ -double cpu_freq_GHz; - - -typedef struct { - - long long in; - long long diff; - long long diff_now; - long long p_time; /*!< \brief absolute process duration */ - long long diff_square; /*!< \brief process duration square */ - long long max; - int trials; - int meas_flag; -} time_stats_t; - -static inline unsigned long long rdtsc_oai(void) __attribute__((always_inline)); -static inline unsigned long long rdtsc_oai(void) -{ - unsigned long long a, d; - __asm__ volatile ("rdtsc" : "=a" (a), "=d" (d)); - return (d<<32) | a; -} - -double get_cpu_freq_GHz(void); - -static inline void reset_meas(time_stats_t *ts) { - - ts->trials=0; - ts->diff=0; - ts->diff_now=0; - ts->p_time=0; - ts->diff_square=0; - ts->max=0; - ts->meas_flag=0; - -} - -double estimate_MHz_syr(void); -static __inline__ uint64_t pickCyclesStart(void); -static __inline__ uint64_t pickCyclesStop(void); - - -/* From "openair2/UTIL/LOG/log.h" -****************************************************************************************/ -extern double cpuf; -extern double cpu_mhz_syr; - - -static __inline__ uint64_t rdtsc(void) { - uint64_t a, d; - __asm__ volatile ("rdtsc" : "=a" (a), "=d" (d)); - return (d<<32) | a; -} - -typedef struct m { - uint64_t iterations; - uint64_t sum; - uint64_t maxArray[11]; -} Meas; - -static inline void printMeas(char * txt, Meas *M, int period) { - if (M->iterations%period == 0 ) { - char txt2[512]; - sprintf(txt2,"%s avg=%" PRIu64 " iterations=%" PRIu64 " max=%" - PRIu64 ":%" PRIu64 ":%" PRIu64 ":%" PRIu64 ":%" PRIu64 ":%" PRIu64 ":%" PRIu64 ":%" PRIu64 ":%" PRIu64 ":%" PRIu64 "\n", - txt, - M->sum/M->iterations, - M->iterations, - M->maxArray[1],M->maxArray[2], M->maxArray[3],M->maxArray[4], M->maxArray[5], - M->maxArray[6],M->maxArray[7], M->maxArray[8],M->maxArray[9],M->maxArray[10]); -// SYRTEM : just use printf do not include all LOG_X for this test -//#if DISABLE_LOG_X - printf("%s",txt2); -//#else -// LOG_W(PHY, "%s",txt2); -//#endif - } -} - -static inline int cmpint(const void* a, const void* b) { - uint64_t* aa=(uint64_t*)a; - uint64_t* bb=(uint64_t*)b; - return (int)(*aa-*bb); -} - -static inline uint64_t updateTimes(uint64_t start, Meas *M, int period, char * txt) { - if (start!=0) { - uint64_t end=rdtsc(); - long long diff=(end-start)/(cpuf*1000); - M->maxArray[0]=diff; - M->sum+=diff; - M->iterations++; - qsort(M->maxArray, 11, sizeof(uint64_t), cmpint); -// printMeas(txt,M,period); // SYRTEM : Printed only a the end of the measurment loop - return diff; - } - return 0; -} - -static inline uint64_t updateTimes_syr(uint64_t start, Meas *M, int period, char * txt) { - if (start!=0) { -// uint64_t end=rdtsc(); - uint64_t end=pickCyclesStop(); - long long diff=(long long)((double)(end-start)/(cpu_mhz_syr)); -// long long diff=(end-start)/(cpuf*1000); - M->maxArray[0]=diff; - M->sum+=diff; - M->iterations++; - qsort(M->maxArray, 11, sizeof(uint64_t), cmpint); -// printMeas(txt,M,period); // SYRTEM : Printed only a the end of the measurment loop - return diff; - } - return 0; -} - - - - -#define initRefTimes(a) static __thread Meas a= {0} -#define pickTime(a) uint64_t a=rdtsc() -#define pickTime_syr(a) uint64_t a=pickCyclesStart() -#define readTime(a) a - - - - - - -/* - * DEFINES - */ - -#define TIMESPEC_TO_DOUBLE_US( t ) ( ( (double)t.tv_sec * 1000000 ) + ( (double)t.tv_nsec / 1000 ) ) - -typedef struct histo_time { - double max; - unsigned int count; -} histo_time_t; - -static void measure_time ( struct timespec *start, struct timespec *stop, uint8_t START, uint16_t PRINT_INTERVAL ); -static struct timespec get_timespec_diff( struct timespec *start, struct timespec *stop ); -void histogram_save_in_csv( histo_time_t *histo , char *file_prefix); -histo_time_t *histogram_init( histo_time_t *histo ); -void histogram_store_value( histo_time_t *histo, double value ); - - -#define FIFO_PRIORITY 40 - - - -#define true 1 -#define false 0 - - - - -/* - * STRUCTURES - */ - - -/* stub of UE_rxtx_proc full structure in openair1/PHY/defs.h -*/ -typedef struct UE_rxtx_proc { - int instance_cnt_rxtx; - pthread_t pthread_rxtx; - pthread_cond_t cond_rxtx; - pthread_mutex_t mutex_rxtx; - - - int sub_frame_start; - int sub_frame_step; - unsigned long long gotIQs; - - - unsigned long syr_rdtsc_rxtx_th_unlock_iteration; - uint64_t syr_rdtsc_ue_th_got_iq; - double syr_rdtsc_rxtx_th_unlock; - double syr_rdtsc_rxtx_th_unlock_max; - double syr_rdtsc_rxtx_th_unlock_mean; - double syr_rdtsc_rxtx_th_unlock_min; - histo_time_t *syr_rdtsc_rxtx_th_unlock_histogram; - -} UE_rxtx_proc_t; - - - -/* this structure is used to pass both UE phy vars and - * proc to the function UE_thread_rxn_txnp4 - */ -struct rx_tx_thread_data { - /* PHY_VARS_UE *UE; */ // UE phy vars not used for this test - UE_rxtx_proc_t *proc; // We use a stub of rxtx_proc see definition above -}; - - -// ODD / EVEN Scheduling -#if 0 -typedef struct threads_s { - int iq; - int odd; - int even; -} threads_t; -threads_t threads = { -1, -1, -1 }; // Core number for each thread (iq=3, even=2, odd=1) -#endif - -// SLOT 0 / SLOT 1 parallelization -typedef struct threads_s { - int iq; - int one; - int two; - int three; - int four; - int five; - int six; - int slot1_proc_one; - int slot1_proc_two; - int slot1_proc_three; -} threads_t; -threads_t threads= {7,6,5,4,3,2,1,-1,-1,-1}; - -/* - * FUNCTIONS DEFINITION - */ - -void *UE_thread(void *arg); -void init_UE(int nb_inst); - - - -/* - * GLOBALS VARIABLES - */ - -volatile int oai_exit = 0; -int th_count = 0; -double cpuf; -double cpu_mhz_syr; - - - - - - - -pthread_t pthread_ue; -pthread_attr_t attr_ue; - -UE_rxtx_proc_t **rxtx_proc; - -struct timespec even_start, even_stop; -struct timespec odd_start, odd_stop; - -histo_time_t *th_wake_histogram; - - -/* - * FUNCTIONS - */ - - - -void exit_fun(const char* s) { - if ( s != NULL ) { - printf("%s %s() Exiting OAI softmodem: %s\n",__FILE__, __FUNCTION__, s); - } - - oai_exit = 1; -} - - - - -void init_thread(int sched_runtime, int sched_deadline, int sched_fifo, cpu_set_t *cpuset, char * name) { - -#ifdef DEADLINE_SCHEDULER - if (sched_runtime!=0) { - struct sched_attr attr= {0}; - attr.size = sizeof(attr); - attr.sched_policy = SCHED_DEADLINE; - attr.sched_runtime = sched_runtime; - attr.sched_deadline = sched_deadline; - attr.sched_period = 0; - AssertFatal(sched_setattr(0, &attr, 0) == 0, - "[SCHED] %s thread: sched_setattr failed %s \n", name, strerror(errno)); - LOG_I(HW,"[SCHED][eNB] %s deadline thread %lu started on CPU %d\n", - name, (unsigned long)gettid(), sched_getcpu()); - } - -#else - if (CPU_COUNT(cpuset) > 0) - AssertFatal( 0 == pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), cpuset), ""); - struct sched_param sp; - sp.sched_priority = sched_fifo; - AssertFatal(pthread_setschedparam(pthread_self(),SCHED_FIFO,&sp)==0, - "Can't set thread priority, Are you root?\n"); - /* Check the actual affinity mask assigned to the thread */ - cpu_set_t *cset=CPU_ALLOC(CPU_SETSIZE); - if (0 == pthread_getaffinity_np(pthread_self(), CPU_ALLOC_SIZE(CPU_SETSIZE), cset)) { - char txt[512]={0}; - for (int j = 0; j < CPU_SETSIZE; j++) - if (CPU_ISSET(j, cset)) - sprintf(txt+strlen(txt), " %d ", j); - printf("CPU Affinity of thread %s is %s\n", name, txt); - } - CPU_FREE(cset); -#endif - - // Lock memory from swapping. This is a process wide call (not constraint to this thread). - mlockall(MCL_CURRENT | MCL_FUTURE); - pthread_setname_np( pthread_self(), name ); - -// SYRTEM : Synchronization thread is not simulated -> just ignore this part of code -// // LTS: this sync stuff should be wrong -// printf("waiting for sync (%s)\n",name); -// pthread_mutex_lock(&sync_mutex); -// printf("Locked sync_mutex, waiting (%s)\n",name); -// while (sync_var<0) -// pthread_cond_wait(&sync_cond, &sync_mutex); -// pthread_mutex_unlock(&sync_mutex); - printf("started %s as PID: %ld\n",name, gettid()); -} - -void init_UE(int nb_inst) -{ - int inst; - for (inst=0; inst < nb_inst; inst++) { - // UE->rfdevice.type = NONE_DEV; -// SYRTEM : we use a stub of phy_var_ue -// PHY_VARS_UE *UE = PHY_vars_UE_g[inst][0]; -// AssertFatal(0 == pthread_create(&UE->proc.pthread_ue, &UE->proc.attr_ue, UE_thread, (void*)UE), ""); - AssertFatal( 0 == pthread_create( &pthread_ue, &attr_ue, UE_thread, NULL ), "" ); - } - - printf("UE threads created by %ld\n", gettid()); -} - - -// SYRTEM - UE synchronization thread is not used in this latency test program -//static void *UE_thread_synch(void *arg) { -// ... -//} - - -// SYRTEM - Stub of UE_thread_rxn_txnp4 -// -> No DSP scheduled -// -> Only thread initialization and thread wake up are kept - -static void *UE_thread_rxn_txnp4(void *arg){ - static __thread int UE_thread_rxtx_retval; - struct rx_tx_thread_data *rtd = arg; - UE_rxtx_proc_t *proc = rtd->proc; - - proc->instance_cnt_rxtx=-1; - - char threadname[256]; - sprintf(threadname,"UE_%d_proc_%d", 0, proc->sub_frame_start); - - cpu_set_t cpuset; - CPU_ZERO(&cpuset); - - if ( (proc->sub_frame_start)%RX_NB_TH == 0 && threads.one != -1 ) - CPU_SET(threads.one, &cpuset); - if ( (proc->sub_frame_start)%RX_NB_TH == 1 && threads.two != -1 ) - CPU_SET(threads.two, &cpuset); - if ( (proc->sub_frame_start)%RX_NB_TH == 2 && threads.three != -1 ) - CPU_SET(threads.three, &cpuset); - if ( (proc->sub_frame_start)%RX_NB_TH == 3 && threads.four != -1 ) - CPU_SET(threads.four, &cpuset); - if ( (proc->sub_frame_start)%RX_NB_TH == 4 && threads.five != -1 ) - CPU_SET(threads.five, &cpuset); - if ( (proc->sub_frame_start)%RX_NB_TH == 5 && threads.six != -1 ) - CPU_SET(threads.six, &cpuset); - //CPU_SET(threads.three, &cpuset); - init_thread(900000,1000000 , FIFO_PRIORITY-1, &cpuset, - threadname); - - - proc->syr_rdtsc_rxtx_th_unlock_iteration=0; - proc->syr_rdtsc_rxtx_th_unlock_max=0; - proc->syr_rdtsc_rxtx_th_unlock_mean=0; - proc->syr_rdtsc_rxtx_th_unlock_min=1000; - proc->syr_rdtsc_rxtx_th_unlock_histogram = NULL; - proc->syr_rdtsc_rxtx_th_unlock_histogram = histogram_init (proc->syr_rdtsc_rxtx_th_unlock_histogram); - - while (!oai_exit) { - if (pthread_mutex_lock(&proc->mutex_rxtx) != 0) { - printf("[SCHED][UE] error locking mutex for UE RXTX\n" ); - exit_fun("nothing to add"); - } - while (proc->instance_cnt_rxtx < 0) { - // most of the time, the thread is waiting here - pthread_cond_wait( &proc->cond_rxtx, &proc->mutex_rxtx ); - } - if (pthread_mutex_unlock(&proc->mutex_rxtx) != 0) { - printf("[SCHED][UE] error unlocking mutex for UE RXn_TXnp4\n" ); - exit_fun("nothing to add"); - } - - - proc->syr_rdtsc_rxtx_th_unlock = (double)(pickCyclesStop()-proc->syr_rdtsc_ue_th_got_iq )/cpu_mhz_syr; - - proc->syr_rdtsc_rxtx_th_unlock_iteration++; - - proc->syr_rdtsc_rxtx_th_unlock_mean += proc->syr_rdtsc_rxtx_th_unlock; - if ( proc->syr_rdtsc_rxtx_th_unlock_max < proc->syr_rdtsc_rxtx_th_unlock ) - proc->syr_rdtsc_rxtx_th_unlock_max = proc->syr_rdtsc_rxtx_th_unlock; - if ( proc->syr_rdtsc_rxtx_th_unlock_min > proc->syr_rdtsc_rxtx_th_unlock ) - proc->syr_rdtsc_rxtx_th_unlock_min = proc->syr_rdtsc_rxtx_th_unlock; - histogram_store_value( proc->syr_rdtsc_rxtx_th_unlock_histogram, proc->syr_rdtsc_rxtx_th_unlock ); - - - if (pthread_mutex_lock(&proc->mutex_rxtx) != 0) { - printf("[SCHED][UE] error locking mutex for UE RXTX\n" ); - exit_fun("noting to add"); - } - proc->instance_cnt_rxtx--; - if (pthread_mutex_unlock(&proc->mutex_rxtx) != 0) { - printf("[SCHED][UE] error unlocking mutex for UE RXTX\n" ); - exit_fun("noting to add"); - } - } - -// thread finished - free(arg); - return &UE_thread_rxtx_retval; -} - - - - -void *UE_thread(void *arg) { - - int i = 0; - int hw_loop_cnt = 0; - - int nb_threads = RX_NB_TH; - char threadname[128]; - cpu_set_t cpuset; - struct rx_tx_thread_data *rtd; - UE_rxtx_proc_t *proc; - - CPU_ZERO( &cpuset ); - - if ( threads.iq != -1 ) - CPU_SET( threads.iq, &cpuset ); - init_thread( 100000, 500000, FIFO_PRIORITY, &cpuset, "HDW Threads" ); - - sprintf( threadname, "Main UE %d", 0 ); - pthread_setname_np( pthread_self(), threadname ); - - -// init_UE_threads(UE) - pthread_attr_init( &attr_ue ); - pthread_attr_setstacksize( &attr_ue, 8192 );//5*PTHREAD_STACK_MIN); - - for ( i = 0; i < nb_threads; i++ ) { - - printf("\n"); - - rtd = calloc( 1, sizeof( struct rx_tx_thread_data ) ); - if ( rtd == NULL ) - abort(); - - rtd->proc = rxtx_proc[i]; // &UE->proc.proc_rxtx[i]; - - pthread_mutex_init( &rxtx_proc[i]->mutex_rxtx ,NULL ); // pthread_mutex_init( &UE->proc.proc_rxtx[i].mutex_rxtx,NULL ); - pthread_cond_init( &rxtx_proc[i]->cond_rxtx, NULL ); // pthread_cond_init(&UE->proc.proc_rxtx[i].cond_rxtx,NULL); - rtd->proc->sub_frame_start=i; - rtd->proc->sub_frame_step=nb_threads; - printf("Init_UE_threads rtd %d proc %d nb_threads %d i %d\n",rtd->proc->sub_frame_start, rxtx_proc[i]->sub_frame_start,nb_threads, i); - pthread_create( &rxtx_proc[i]->pthread_rxtx, NULL, UE_thread_rxn_txnp4, rtd ); // pthread_create( &UE->proc.proc_rxtx[i].pthread_rxtx, NULL, UE_thread_rxn_txnp4, rtd); - - usleep(1000); - - } -// init_UE_threads(UE) - - - - int sub_frame=-1; - while ( !oai_exit ) { - - sub_frame++; - sub_frame %= 10; - - proc = rxtx_proc[hw_loop_cnt%RX_NB_TH]; - - // Simulate IQ reception - usleep( HWLAT_TTI_SLEEP_US ); - - proc->syr_rdtsc_ue_th_got_iq = pickCyclesStart(); - - AssertFatal(pthread_mutex_lock(&proc->mutex_rxtx) ==0,""); - - proc->instance_cnt_rxtx++; - if ( proc->instance_cnt_rxtx == 0 ) { - if ( pthread_cond_signal( &proc->cond_rxtx) != 0 ) { - exit_fun( "nothing to add" ); - } - } else { - if ( proc->instance_cnt_rxtx > 2 ) - exit_fun( "instance_cnt_rxtx > 2" ); - } - - AssertFatal( pthread_cond_signal( &proc->cond_rxtx ) == 0 ,"" ); - AssertFatal(pthread_mutex_unlock(&proc->mutex_rxtx) ==0,""); - - - /* Do not go indefinitely */ - hw_loop_cnt++; - - if ( hw_loop_cnt%1000 == 0 ) - { - printf("\r%d/%d",hw_loop_cnt,HWLAT_LOOP_CNT*RX_NB_TH); - fflush(stdout); - } - - if (hw_loop_cnt >= HWLAT_LOOP_CNT*RX_NB_TH) - { - printf("\n\n"); - for (i=0 ; ipthread_rxtx,threadname,128 ); - printf("RxTX Thread unlock latency on thread %s (it. %lu) (us) : max=%8.3f - mean=%8.3f - min=%8.3f\n", - threadname, - proc->syr_rdtsc_rxtx_th_unlock_iteration, - proc->syr_rdtsc_rxtx_th_unlock_max, - proc->syr_rdtsc_rxtx_th_unlock_mean/proc->syr_rdtsc_rxtx_th_unlock_iteration, - proc->syr_rdtsc_rxtx_th_unlock_min); - - histogram_save_in_csv(proc->syr_rdtsc_rxtx_th_unlock_histogram, threadname ); - - } - printf("\n\n"); - oai_exit = 1; - } - - } // while !oai_exit - - oai_exit = 1; - - return NULL; -} - -#define CALIB_LOOP_CNT 1000000 //2000000000 -#define CALIB_LOOP_REPORT_PERIOD 1000 -#define CALIB_LOOP_UP_THRESHOLD 20 // 20 -> for NG Intel flat model -#define CALIB_USLEEP 250 - -int main( void ) -{ - - int i; - - -#if CALIB_RT_INTRUMENTATION - uint32_t calib_loop_count; - - - uint64_t lt_overhead_cur; - uint64_t lt_overhead_min; - uint64_t lt_overhead_max; - uint64_t lt_overhead_mean; - histo_time_t *lt_overhead_histogram = NULL; - - uint64_t lt_syr_overhead_cur; - uint64_t lt_syr_overhead_min; - uint64_t lt_syr_overhead_max; - uint64_t lt_syr_overhead_mean; - histo_time_t *lt_syr_overhead_histogram = NULL; - - double syr_rdtsc_overhead_cur; - double syr_rdtsc_overhead_min; - double syr_rdtsc_overhead_max; - double syr_rdtsc_overhead_mean; - histo_time_t *syr_rdtsc_overhead_histogram = NULL; - - double syr_clock_gettime_overhead_cur; - double syr_clock_gettime_overhead_min; - double syr_clock_gettime_overhead_max; - double syr_clock_gettime_overhead_mean; - histo_time_t *syr_clock_gettime_overhead_histogram = NULL; - - - uint64_t cycles_start; - uint64_t cycles_stop; - - uint64_t cycles_diff; - uint64_t cycles_diff_max = 0; - - - struct timespec start; - struct timespec stop; -#endif - - cpuf = get_cpu_freq_GHz(); - cpu_mhz_syr = estimate_MHz_syr(); - - printf("\n\ncpuf %f - cpu_mhz_syr %f\n\n", cpuf, cpu_mhz_syr); - -#if CALIB_RT_INTRUMENTATION - - /* ********************************************************************************************** */ - /* CALIBRATION */ - /* ********************************************************************************************** */ - - /* ************************************************************* - Laurent Thomas instrumentation overhead - */ - printf("\nCalibrating OAI Realtime Instrumentation (Laurent Thomas imp.)\n"); - calib_loop_count = CALIB_LOOP_CNT; - initRefTimes(lt_instru_calib); // Laurent Thomas realtime instrumentation calibration measurments - lt_overhead_min = 1000; - lt_overhead_max = 0; - lt_overhead_mean = 0; - lt_overhead_histogram = histogram_init( lt_overhead_histogram ); - while(calib_loop_count) - { - pickTime(lt_start); - -// asm volatile(""); // Nop instruction - usleep(CALIB_USLEEP); - - lt_overhead_cur = updateTimes( readTime(lt_start), - <_instru_calib, - CALIB_LOOP_CNT, - "Laurent Thomas realtime instrumentation calibration measurments"); - - lt_overhead_mean += lt_overhead_cur; - if ( lt_overhead_max < lt_overhead_cur ) - lt_overhead_max = lt_overhead_cur; - if ( lt_overhead_min > lt_overhead_cur ) - lt_overhead_min = lt_overhead_cur; - histogram_store_value( lt_overhead_histogram, (double)lt_overhead_cur ); - - if ( calib_loop_count%CALIB_LOOP_REPORT_PERIOD == 0 ) - { - printf("\r%d/%d",calib_loop_count,CALIB_LOOP_CNT); - fflush(stdout); - } - - calib_loop_count--; - } - lt_overhead_mean = lt_overhead_mean/CALIB_LOOP_CNT; - -// printMeas("\nLaurent Thomas realtime instrumentation calibration measurments",<_instru_calib,CALIB_LOOP_CNT); - - - /* ************************************************************* - Laurent Thomas instrumentation overhead - */ - printf("\nCalibrating OAI Realtime Instrumentation - SYRTEM revisited\n"); - calib_loop_count = CALIB_LOOP_CNT; - initRefTimes(lt_instru_calib_syr); // Laurent Thomas realtime instrumentation calibration measurments - lt_syr_overhead_min = 1000; - lt_syr_overhead_max = 0; - lt_syr_overhead_mean = 0; - lt_syr_overhead_histogram = histogram_init( lt_syr_overhead_histogram ); - while(calib_loop_count) - { - pickTime_syr(lt_start_syr); - -// asm volatile(""); // Nop instruction - usleep(CALIB_USLEEP); - - lt_syr_overhead_cur = updateTimes_syr(readTime(lt_start_syr), <_instru_calib_syr, CALIB_LOOP_CNT, "Laurent Thomas realtime instrumentation calibration measurments (SYRTEM Update)"); - - lt_syr_overhead_mean += lt_syr_overhead_cur; - if ( lt_syr_overhead_max < lt_syr_overhead_cur ) - lt_syr_overhead_max = lt_syr_overhead_cur; - if ( lt_syr_overhead_min > lt_syr_overhead_cur ) - lt_syr_overhead_min = lt_syr_overhead_cur; - histogram_store_value( lt_syr_overhead_histogram, (double)lt_syr_overhead_cur ); - - if ( calib_loop_count%CALIB_LOOP_REPORT_PERIOD == 0 ) - { - printf("\r%d/%d",calib_loop_count,CALIB_LOOP_CNT); - fflush(stdout); - } - - calib_loop_count--; - } - lt_syr_overhead_mean = lt_syr_overhead_mean / CALIB_LOOP_CNT; - -// printMeas("\nLaurent Thomas realtime instrumentation calibration measurments (SYRTEM Update)",<_instru_calib_syr,CALIB_LOOP_CNT); - - - - /* ************************************************************* - SYRTEM RDTSC instrumentation overhead - */ - printf("\nCalibrating SYRTEM RDTSC Realtime Instrumentation\n"); - calib_loop_count = CALIB_LOOP_CNT; - syr_rdtsc_overhead_min = 1000; - syr_rdtsc_overhead_max = 0; - syr_rdtsc_overhead_mean = 0; - syr_rdtsc_overhead_histogram = histogram_init( syr_rdtsc_overhead_histogram ); - while(calib_loop_count) - { - - cycles_start = pickCyclesStart(); - -// asm volatile(""); // Nop instruction - usleep(CALIB_USLEEP); - - cycles_stop = pickCyclesStop(); - - cycles_diff = cycles_stop - cycles_start; - if(cycles_diff_max < cycles_diff) - cycles_diff_max = cycles_diff; - - syr_rdtsc_overhead_cur = (double)cycles_diff/cpu_mhz_syr; - - syr_rdtsc_overhead_mean += syr_rdtsc_overhead_cur; - if ( syr_rdtsc_overhead_max < syr_rdtsc_overhead_cur ) - syr_rdtsc_overhead_max = syr_rdtsc_overhead_cur; - if ( syr_rdtsc_overhead_min > syr_rdtsc_overhead_cur ) - syr_rdtsc_overhead_min = syr_rdtsc_overhead_cur; - histogram_store_value( syr_rdtsc_overhead_histogram, (double)syr_rdtsc_overhead_cur ); - - if ( calib_loop_count%CALIB_LOOP_REPORT_PERIOD == 0 ) - { - printf("\r%d/%d",calib_loop_count,CALIB_LOOP_CNT); - fflush(stdout); - } - - calib_loop_count--; - } - syr_rdtsc_overhead_mean = syr_rdtsc_overhead_mean / CALIB_LOOP_CNT; - -// printf("\nSYRTEM RDTSV realtime instrumentation calibration : cycles_diff_max %ld - tsc_duration_max %f us\n ", cycles_diff_max, tsc_duration_max); - - - - /* ************************************************************* - SYRTEM Clock_gettime MONOTONIC instrumentation overhead - */ - printf("\nCalibrating SYRTEM clock_gettime Realtime Instrumentation\n"); - calib_loop_count = CALIB_LOOP_CNT; - syr_clock_gettime_overhead_min = 1000; - syr_clock_gettime_overhead_max = 0; - syr_clock_gettime_overhead_mean = 0; - syr_clock_gettime_overhead_histogram = histogram_init( syr_clock_gettime_overhead_histogram ); - while(calib_loop_count) - { - - clock_gettime( CLOCK_MONOTONIC, &start ); - -// asm volatile(""); // Nop instruction - usleep(CALIB_USLEEP); - - clock_gettime( CLOCK_MONOTONIC, &stop ); - syr_clock_gettime_overhead_cur = TIMESPEC_TO_DOUBLE_US( get_timespec_diff( &start, &stop ) ); - - syr_clock_gettime_overhead_mean += syr_clock_gettime_overhead_cur; - if ( syr_clock_gettime_overhead_max < syr_clock_gettime_overhead_cur ) - syr_clock_gettime_overhead_max = syr_clock_gettime_overhead_cur; - if ( syr_clock_gettime_overhead_min > syr_clock_gettime_overhead_cur ) - syr_clock_gettime_overhead_min = syr_clock_gettime_overhead_cur; - histogram_store_value( syr_clock_gettime_overhead_histogram, (double)syr_clock_gettime_overhead_cur ); - - if ( calib_loop_count%CALIB_LOOP_REPORT_PERIOD == 0 ) - { - printf("\r%d/%d",calib_loop_count,CALIB_LOOP_CNT); - fflush(stdout); - } - - calib_loop_count--; - } - syr_clock_gettime_overhead_mean = syr_clock_gettime_overhead_mean / CALIB_LOOP_CNT; - -// printf("\nSYRTEM clock_gettime MONOTONIC calibration : clock_gettime duration_max %f us\n ", max); - - - printf("\n"); - - printf("OAI LT RT profiling overhead (it. %d) (us) : max=%8ld - mean=%8ld - min=%8ld\n", - CALIB_LOOP_CNT, - lt_overhead_max, lt_overhead_mean, lt_overhead_min); - printf("OAI SYR RT profiling overhead (it. %d) (us) : max=%8ld - mean=%8ld - min=%8ld\n", - CALIB_LOOP_CNT, - lt_syr_overhead_max, lt_syr_overhead_mean, lt_syr_overhead_min); - printf("SYR RDTSC profiling overhead (it. %d) (us) : max=%8.3f - mean=%8.3f - min=%8.3f\n", - CALIB_LOOP_CNT, - syr_rdtsc_overhead_max, syr_rdtsc_overhead_mean, syr_rdtsc_overhead_min); - printf("SYR clock_gettime profiling overhead (it. %d) (us): max=%8.3f - mean=%8.3f - min=%8.3f\n", - CALIB_LOOP_CNT, - syr_clock_gettime_overhead_max, syr_clock_gettime_overhead_mean, syr_clock_gettime_overhead_min); - - return 0; -#endif - - rxtx_proc = calloc( RX_NB_TH, sizeof( UE_rxtx_proc_t* ) ); - for (i=0 ; i - * Small changes by David Sterba - * - */ - - struct timespec start; - struct timespec stop; - - unsigned long long int cycles[2]; /* must be 64 bit */ - double microseconds; /* total time taken */ - - - /* get this function in cached memory */ - cycles[0] = rdtsc (); - clock_gettime( CLOCK_REALTIME, &start ); - - /* we don't trust that this is any specific length of time */ - usleep (100000); - - cycles[1] = rdtsc (); - clock_gettime( CLOCK_REALTIME, &stop ); - microseconds = TIMESPEC_TO_DOUBLE_US( get_timespec_diff( &start, &stop ) ); - - unsigned long long int elapsed = 0; - if (cycles[1] < cycles[0]) - { - //printf("c0 = %llu c1 = %llu",cycles[0],cycles[1]); - elapsed = UINT32_MAX - cycles[0]; - elapsed = elapsed + cycles[1]; - //printf("c0 = %llu c1 = %llu max = %llu elapsed=%llu\n",cycles[0], cycles[1], UINT32_MAX,elapsed); - } - else - { - elapsed = cycles[1] - cycles[0]; - // printf("\nc0 = %llu c1 = %llu elapsed=%llu\n",cycles[0], cycles[1],elapsed); - } - - double mhz = elapsed / microseconds; - - - //printf("%llg MHz processor (estimate). diff cycles=%llu microseconds=%llu \n", mhz, elapsed, microseconds); - //printf("%g elapsed %llu microseconds %llu\n",mhz, elapsed, microseconds); - return (mhz); -} - - - -/** TSC Timestamp references - - - http://oliveryang.net/2015/09/pitfalls-of-TSC-usage/#312-tsc-sync-behaviors-on-smp-system - - https://www.intel.com/content/www/us/en/embedded/training/ia-32-ia-64-benchmark-code-execution-paper.html - - https://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-vol-3b-part-2-manual.pdf - - - http://blog.tinola.com/?e=54 - - https://stackoverflow.com/questions/24392392/getting-tsc-frequency-from-proc-cpuinfo !! warning on turbo - - https://gist.github.com/nfarring/1624742 - - https://www.lmax.com/blog/staff-blogs/2015/10/25/time-stamp-counters/ - - https://github.com/cyring/CoreFreq - - https://patchwork.kernel.org/patch/9438133/ --> TSC_ADJUST - to be checked - -> https://software.intel.com/en-us/forums/software-tuning-performance-optimization-platform-monitoring/topic/388964 - - https://www.google.fr/url?sa=t&rct=j&q=&esrc=s&source=web&cd=11&ved=0ahUKEwjwpJbem5DVAhWBDpoKHXv0Dt04ChAWCCIwAA&url=https%3A%2F%2Fsigarra.up.pt%2Ffeup%2Fpt%2Fpub_geral.show_file%3Fpi_gdoc_id%3D809041&usg=AFQjCNFHTMjmjWMG6QSVnLDflEoU0RavKw&cad=rja - - https://unix4lyfe.org/benchmarking/ - - https://stackoverflow.com/questions/27693145/rdtscp-versus-rdtsc-cpuid - - https://github.com/dterei/tsc/blob/master/tsc.h - - https://software.intel.com/en-us/forums/intel-isa-extensions/topic/280440 - - https://stackoverflow.com/questions/19941588/wrong-clock-cycle-measurements-with-rdtsc - - - -*/ - - - - - - -static __inline__ uint64_t pickCyclesStart(void) { - unsigned cycles_low, cycles_high; - asm volatile( "CPUID\n\t" // serialize - "RDTSC\n\t" // read clock - "MOV %%edx, %0\n\t" - "MOV %%eax, %1\n\t" - : "=r" (cycles_high), "=r" (cycles_low) - :: "%rax", "%rbx", "%rcx", "%rdx" ); -return ((uint64_t) cycles_high << 32) | cycles_low; -} - -static __inline__ uint64_t pickCyclesStop(void) { - uint32_t eax, edx; - - __asm__ __volatile__("rdtscp" - : "=a" (eax), "=d" (edx) - : - : "%ecx", "memory"); - -return (((uint64_t)edx << 32) | eax); -} - - - - - - - - -/************************************************************************************** - EXTRACT from openair1/PHY/TOOLS/time_meas.c -***************************************************************************************/ -double get_cpu_freq_GHz(void) { - - time_stats_t ts = {0}; - reset_meas(&ts); - ts.trials++; - ts.in = rdtsc_oai(); - sleep(1); - ts.diff = (rdtsc_oai()-ts.in); - cpu_freq_GHz = (double)ts.diff/1000000000; - printf("CPU Freq is %f \n", cpu_freq_GHz); - return cpu_freq_GHz; -} - - - -/************************************************************************************** - SYRTEM STATISTICS HELPER -***************************************************************************************/ - - - -histo_time_t *histogram_init(histo_time_t *histo ) -{ - int i = 0; - double max_val = HISTOGRAM_MIN_VALUE + HISTOGRAM_STEP; - - histo = calloc( HISTOGRAM_SIZE, sizeof( histo_time_t ) ); - if ( histo == NULL ) { - printf( "ERROR allocating histogram structure !\n" ); - return NULL; - } - - for ( i = 0; i < HISTOGRAM_SIZE; i++ ) { - histo[i].max = max_val; - max_val += HISTOGRAM_STEP; - } - - return histo; -} - - -void histogram_store_value( histo_time_t *histo, double value ) -{ - int i = 0; - - for ( i = 0; i < HISTOGRAM_SIZE; i++ ) { - if ( histo[i].max >= value || ( i + 1 ) == HISTOGRAM_SIZE ) { - histo[i].count++; - break; - } - } -} - - -void histogram_save_in_csv( histo_time_t *histo , char *file_sufix) -{ - char *csv_filename; - char month[3], day[3], hour[3], min[3], sec[3]; - time_t curr_time; - struct tm *datetime; - - curr_time = time( NULL ); - datetime = localtime( &curr_time ); - - csv_filename = calloc( sizeof( char ), 64 ); - if ( csv_filename == NULL ) { - return; - } - - memset( csv_filename, 0x00, 64 ); - memset( month, 0x00, 3 ); - memset( day, 0x00, 3 ); - memset( hour, 0x00, 3 ); - memset( min, 0x00, 3 ); - memset( sec, 0x00, 3 ); - -/* Month. */ - if ( datetime->tm_mon < 9 ) - snprintf( month, 3, "0%d", datetime->tm_mon + 1 ); - else - snprintf( month, 3, "%d", datetime->tm_mon + 1 ); - -/* Day. */ - if ( datetime->tm_mday < 10 ) - snprintf( day, 3, "0%d", datetime->tm_mday ); - else - snprintf( day, 3, "%d", datetime->tm_mday ); - -/* Hour. */ - if ( datetime->tm_hour < 10 ) - snprintf( hour, 3, "0%d", datetime->tm_hour ); - else - snprintf( hour, 3, "%d", datetime->tm_hour ); - -/* Minute. */ - if ( datetime->tm_min < 10 ) - snprintf( min, 3, "0%d", datetime->tm_min ); - else - snprintf( min, 3, "%d", datetime->tm_min ); - -/* Second. */ - if ( datetime->tm_sec < 10 ) - snprintf( sec, 3, "0%d", datetime->tm_sec ); - else - snprintf( sec, 3, "%d", datetime->tm_sec ); - - snprintf( csv_filename, 63, "ADRV9371_ZC706_HISTO_UEtoRXTX_%d%s%s%s%s%s_%s.csv", - datetime->tm_year + 1900, month, day, hour, min, sec, file_sufix ); - - FILE *fp; - int i = 0; - int min_val = 0; - - fp = fopen( csv_filename, "w+" ); - - fprintf( fp, "range;count\n" ); - - for ( i = 0; i < HISTOGRAM_SIZE; i++ ) { - if ( i + 1 == HISTOGRAM_SIZE ) - fprintf( fp, "%d+;%u\n", min_val, histo[i].count ); - else - fprintf( fp, "%d-%.0f;%u\n", min_val, histo[i].max, histo[i].count ); - min_val = histo[i].max; - } - free(csv_filename); - fclose( fp ); -} - - - -static struct timespec get_timespec_diff( - struct timespec *start, - struct timespec *stop ) -{ - struct timespec result; - - if ( ( stop->tv_nsec - start->tv_nsec ) < 0 ) { - result.tv_sec = stop->tv_sec - start->tv_sec - 1; - result.tv_nsec = stop->tv_nsec - start->tv_nsec + 1000000000; - } - else { - result.tv_sec = stop->tv_sec - start->tv_sec; - result.tv_nsec = stop->tv_nsec - start->tv_nsec; - } - - return result; -} - - -static void measure_time ( - struct timespec *start, - struct timespec *stop, - uint8_t START, - uint16_t PRINT_INTERVAL ) -{ - static double max = 0; - static double min = 0; - static double total = 0; - static int count = 0; - - if ( START ) { - clock_gettime( CLOCK_REALTIME, start ); - } - else { - clock_gettime( CLOCK_REALTIME, stop ); - - struct timespec diff; - double current = 0; - - diff = get_timespec_diff( start, stop ); -// current = ( (double)diff.tv_sec * 1000000 ) + ( (double)diff.tv_nsec / 1000 ); - current = TIMESPEC_TO_DOUBLE_US( diff ); - - if ( current > max ) { - max = current; - } - if ( min == 0 || current < min ) { - min = current; - } - total += current; - - histogram_store_value( th_wake_histogram, current ); - - if ( count % PRINT_INTERVAL == 0 && count != 0 ) { - double avg = total / ( count + 1 ); - printf( "[%d] Current : %.2lf µs, Min : %.2lf µs, Max : %.2lf µs, Moy : %.2lf µs\n", - count, current, min, max, avg ); - } - count++; - } -} - - - - - - - - - - - - - - - - From b742717fb8ebc5299b7bd1c569babb72e4ead2ea Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Thu, 24 Feb 2022 20:47:03 +0100 Subject: [PATCH 55/96] Remove timing functions from logging module --- common/utils/LOG/log.h | 124 ------------------------ common/utils/threadPool/thread-pool.h | 7 ++ executables/main-fs6.c | 61 +++++++++++- executables/nr-ue.c | 4 +- executables/transport_split.c | 2 +- openair1/PHY/defs_L1_NB_IoT.h | 3 - openair1/PHY/defs_UE.h | 1 - openair1/PHY/thread_NR_UE.h | 1 - openair1/SIMULATION/LTE_PHY/dlsim.c | 1 - openair1/SIMULATION/LTE_PHY/dlsim_tm4.c | 1 - openair1/SIMULATION/LTE_PHY/framegen.c | 1 - openair1/SIMULATION/LTE_PHY/mbmssim.c | 1 - targets/RT/USER/lte-ue.c | 24 ----- 13 files changed, 67 insertions(+), 164 deletions(-) diff --git a/common/utils/LOG/log.h b/common/utils/LOG/log.h index 8299c48fbb..7c81088454 100644 --- a/common/utils/LOG/log.h +++ b/common/utils/LOG/log.h @@ -472,130 +472,6 @@ int32_t write_file_matlab(const char *fname, const char *vname, void *data, int /* @}*/ -static __inline__ uint64_t rdtsc(void) { - uint32_t a, d; - __asm__ volatile ("rdtsc" : "=a" (a), "=d" (d)); - return (((uint64_t)d)<<32) | ((uint64_t)a); -} - -#define DEBUG_REALTIME 1 -#if DEBUG_REALTIME - -extern double cpuf; - -static inline uint64_t checkTCPU(int timeout, - char *file, - int line) -{ - static uint64_t __thread lastCPUTime=0; - static uint64_t __thread last=0; - uint64_t cur=rdtsc(); - struct timespec CPUt; - clock_gettime(CLOCK_THREAD_CPUTIME_ID, &CPUt); - uint64_t CPUTime=CPUt.tv_sec*1000*1000+CPUt.tv_nsec/1000; - double microCycles=(double)(cpuf*1000); - int duration=(int)((cur-last)/microCycles); - - if ( last!=0 && duration > timeout ) { - //struct timespec ts; - //clock_gettime(CLOCK_MONOTONIC, &ts); - printf("%s:%d lte-ue delay %d (exceed %d), CPU for this period: %lld\n", file, line, - duration, timeout, (long long)CPUTime-lastCPUTime ); - } - - last=cur; - lastCPUTime=CPUTime; - return cur; -} - -static inline unsigned long long checkT(int timeout, - char *file, - int line) -{ - static unsigned long long __thread last=0; - unsigned long long cur=rdtsc(); - int microCycles=(int)(cpuf*1000); - int duration=(int)((cur-last)/microCycles); - - if ( last!=0 && duration > timeout ) - printf("%s:%d lte-ue delay %d (exceed %d)\n", file, line, - duration, timeout); - - last=cur; - return cur; -} - -typedef struct m { - uint64_t iterations; - uint64_t sum; - uint64_t maxArray[11]; -} Meas; - -static inline void printMeas(char *txt, - Meas *M, - int period) -{ - if (M->iterations%period == 0 ) { - char txt2[512]; - sprintf(txt2,"%s avg=%" PRIu64 " iterations=%" PRIu64 " max=%" - PRIu64 ":%" PRIu64 ":%" PRIu64 ":%" PRIu64 ":%" PRIu64 ":%" PRIu64 ":%" PRIu64 ":%" PRIu64 ":%" PRIu64 ":%" PRIu64 "\n", - txt, - M->sum/M->iterations, - M->iterations, - M->maxArray[1],M->maxArray[2], M->maxArray[3],M->maxArray[4], M->maxArray[5], - M->maxArray[6],M->maxArray[7], M->maxArray[8],M->maxArray[9],M->maxArray[10]); -#if T_TRACER - LOG_W(PHY,"%s",txt2); -#else - printf("%s",txt2); -#endif - } -} - -static inline int cmpint(const void *a, - const void *b) -{ - uint64_t *aa=(uint64_t *)a; - uint64_t *bb=(uint64_t *)b; - return (int)(*aa-*bb); -} - -static inline void updateTimes(uint64_t start, - Meas *M, - int period, - char *txt) -{ - if (start!=0) { - uint64_t end=rdtsc(); - long long diff=(end-start)/(cpuf*1000); - M->maxArray[0]=diff; - M->sum+=diff; - M->iterations++; - qsort(M->maxArray, 11, sizeof(uint64_t), cmpint); - printMeas(txt,M,period); - } -} - -#define check(a) do { checkT(a,__FILE__,__LINE__); } while (0) -#define checkcpu(a) do { checkTCPU(a,__FILE__,__LINE__); } while (0) -#define initRefTimes(a) static __thread Meas a= {0} -#define pickTime(a) uint64_t a=rdtsc() -#define readTime(a) a -#define initStaticTime(a) static __thread uint64_t a={0} -#define pickStaticTime(a) do { a=rdtsc(); } while (0) - -#else -#define check(a) do {} while (0) -#define checkcpu(a) do {} while (0) -#define initRefTimes(a) do {} while (0) -#define initStaticTime(a) do {} while (0) -#define pickTime(a) do {} while (0) -#define readTime(a) 0 -#define pickStaticTime(a) do {} while (0) -#define updateTimes(a,b,c,d) do {} while (0) -#define printMeas(a,b,c) do {} while (0) -#endif - #ifdef __cplusplus } #endif diff --git a/common/utils/threadPool/thread-pool.h b/common/utils/threadPool/thread-pool.h index a8f8572cfe..2ca152bb02 100644 --- a/common/utils/threadPool/thread-pool.h +++ b/common/utils/threadPool/thread-pool.h @@ -27,12 +27,19 @@ #include #include #include +#include #include #include #include #include //#include +static __inline__ uint64_t rdtsc(void) { + uint32_t a, d; + __asm__ volatile ("rdtsc" : "=a" (a), "=d" (d)); + return (((uint64_t)d)<<32) | ((uint64_t)a); +} + #ifdef DEBUG #define THREADINIT PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP #else diff --git a/executables/main-fs6.c b/executables/main-fs6.c index 9e92f2e41a..e708d9c761 100644 --- a/executables/main-fs6.c +++ b/executables/main-fs6.c @@ -55,6 +55,59 @@ int sum(uint8_t *b, int s) { return sum; } + +extern double cpuf; + +typedef struct m { + uint64_t iterations; + uint64_t sum; + uint64_t maxArray[11]; +} Meas; + +int cmpint(const void *a, const void *b) +{ + uint64_t *aa=(uint64_t *)a; + uint64_t *bb=(uint64_t *)b; + return (int)(*aa-*bb); +} + +static inline void printMeas(char *txt, + Meas *M, + int period) +{ + if (M->iterations%period == 0 ) { + char txt2[512]; + sprintf(txt2,"%s avg=%" PRIu64 " iterations=%" PRIu64 " max=%" + PRIu64 ":%" PRIu64 ":%" PRIu64 ":%" PRIu64 ":%" PRIu64 ":%" PRIu64 ":%" PRIu64 ":%" PRIu64 ":%" PRIu64 ":%" PRIu64 "\n", + txt, + M->sum/M->iterations, + M->iterations, + M->maxArray[1],M->maxArray[2], M->maxArray[3],M->maxArray[4], M->maxArray[5], + M->maxArray[6],M->maxArray[7], M->maxArray[8],M->maxArray[9],M->maxArray[10]); +#if T_TRACER + LOG_W(PHY,"%s",txt2); +#else + printf("%s",txt2); +#endif + } +} + +void updateTimes(uint64_t start, Meas *M, int period, char *txt) +{ + if (start!=0) { + uint64_t end=rdtsc_oai(); + long long diff=(end-start)/(cpuf*1000); + M->maxArray[0]=diff; + M->sum+=diff; + M->iterations++; + qsort(M->maxArray, 11, sizeof(uint64_t), cmpint); + printMeas(txt,M,period); + } +} + +#define initStaticTime(a) static __thread uint64_t a={0} +#define pickStaticTime(a) do { a=rdtsc_oai(); } while (0) +#define initRefTimes(a) static __thread Meas a= {0} static inline int cmpintRev(const void *a, const void *b) { uint64_t *aa=(uint64_t *)a; uint64_t *bb=(uint64_t *)b; @@ -82,7 +135,7 @@ static inline void printMeas2(char *txt, Meas *M, int period, bool MaxMin) { static inline void updateTimesReset(uint64_t start, Meas *M, int period, bool MaxMin, char *txt) { if (start!=0) { - uint64_t end=rdtsc(); + uint64_t end=rdtsc_oai(); long long diff=(end-start)/(cpuf*1000); M->maxArray[0]=diff; M->sum+=diff; @@ -107,7 +160,7 @@ static inline void updateTimesReset(uint64_t start, Meas *M, int period, bool Ma static inline void measTransportTime(uint64_t DuSend, uint64_t CuMicroSec, Meas *M, int period, bool MaxMin, char *txt) { if (DuSend!=0) { - uint64_t end=rdtsc(); + uint64_t end=rdtsc_oai(); long long diff=(end-DuSend)/(cpuf*1000)-CuMicroSec; M->maxArray[0]=diff; M->sum+=diff; @@ -1463,7 +1516,7 @@ void DL_cu_fs6(RU_t *ru, L1_rxtx_proc_t *proc, uint64_t DuClock, uint64_t start } hDL(bufferZone)->DuClock=DuClock; - hDL(bufferZone)->CuSpentMicroSec=(rdtsc()-startCycle)/(cpuf*1000); + hDL(bufferZone)->CuSpentMicroSec=(rdtsc_oai()-startCycle)/(cpuf*1000); updateTimesReset(startCycle, &CUprocessing, 1000, true,"CU entire processing from recv to send"); sendSubFrame(&sockFS6, bufferZone, sizeof(fs6_dl_t), CTsentCUv0 ); return; @@ -1476,7 +1529,7 @@ void UL_cu_fs6(RU_t *ru, L1_rxtx_proc_t *proc, uint64_t *TS, uint64_t *DuClock, pickStaticTime(begingWait); int nb_blocks=receiveSubFrame(&sockFS6, bufferZone, sizeof(bufferZone), CTsentDUv0 ); * DuClock=hUDP(bufferZone)->senderClock; - * startProcessing=rdtsc(); + * startProcessing=rdtsc_oai(); updateTimesReset(begingWait, &fullLoop, 1000, false, "CU wait DU"); if (nb_blocks ==0) { diff --git a/executables/nr-ue.c b/executables/nr-ue.c index d1b26601b4..ecadef1ac2 100644 --- a/executables/nr-ue.c +++ b/executables/nr-ue.c @@ -766,9 +766,9 @@ void processSlotRX(void *arg) { #ifdef UE_SLOT_PARALLELISATION phy_procedures_slot_parallelization_nrUE_RX( UE, proc, 0, 0, 1, no_relay, NULL ); #else - uint64_t a=rdtsc(); + uint64_t a=rdtsc_oai(); phy_procedures_nrUE_RX(UE, proc, gNB_id, get_nrUE_params()->nr_dlsch_parallel, &rxtxD->txFifo); - LOG_D(PHY, "In %s: slot %d, time %lu\n", __FUNCTION__, proc->nr_slot_rx, (rdtsc()-a)/3500); + LOG_D(PHY, "In %s: slot %d, time %llu\n", __FUNCTION__, proc->nr_slot_rx, (rdtsc_oai()-a)/3500); #endif if(IS_SOFTMODEM_NOS1 || get_softmodem_params()->sa){ diff --git a/executables/transport_split.c b/executables/transport_split.c index f380eb90e3..e7199637cc 100644 --- a/executables/transport_split.c +++ b/executables/transport_split.c @@ -156,7 +156,7 @@ int receiveSubFrame(UDPsock_t *sock, void *bufferZone, int bufferSize, uint16_t int sendSubFrame(UDPsock_t *sock, void *bufferZone, ssize_t secondHeaderSize, uint16_t contentType) { commonUDP_t *UDPheader=(commonUDP_t *)bufferZone ; UDPheader->contentType=contentType; - UDPheader->senderClock=rdtsc(); + UDPheader->senderClock=rdtsc_oai(); int nbBlocks=UDPheader->nbBlocks; int blockId=0; diff --git a/openair1/PHY/defs_L1_NB_IoT.h b/openair1/PHY/defs_L1_NB_IoT.h index a4552c8c27..51b7c63b72 100644 --- a/openair1/PHY/defs_L1_NB_IoT.h +++ b/openair1/PHY/defs_L1_NB_IoT.h @@ -452,9 +452,6 @@ typedef struct { int sub_frame_start; /// int sub_frame_step; - /// - unsigned long long gotIQs; - } UE_rxtx_proc_NB_IoT_t; /// Context data structure for eNB subframe processing diff --git a/openair1/PHY/defs_UE.h b/openair1/PHY/defs_UE.h index fc3d939f65..06aad301ca 100644 --- a/openair1/PHY/defs_UE.h +++ b/openair1/PHY/defs_UE.h @@ -154,7 +154,6 @@ typedef struct { int sub_frame_start; int sub_frame_step; - unsigned long long gotIQs; } UE_rxtx_proc_t; /// Context data structure for eNB subframe processing diff --git a/openair1/PHY/thread_NR_UE.h b/openair1/PHY/thread_NR_UE.h index 901d8faec9..a3cc2d9782 100644 --- a/openair1/PHY/thread_NR_UE.h +++ b/openair1/PHY/thread_NR_UE.h @@ -62,7 +62,6 @@ typedef struct { int sub_frame_start; int sub_frame_step; - unsigned long long gotIQs; uint8_t decoder_thread_available1; int dci_err_cnt; } UE_nr_rxtx_proc_t; diff --git a/openair1/SIMULATION/LTE_PHY/dlsim.c b/openair1/SIMULATION/LTE_PHY/dlsim.c index c1443700f3..9f176ae768 100644 --- a/openair1/SIMULATION/LTE_PHY/dlsim.c +++ b/openair1/SIMULATION/LTE_PHY/dlsim.c @@ -122,7 +122,6 @@ void do_OFDM_mod_l(int32_t **txdataF, int32_t **txdata, uint16_t next_slot, LTE_ slot_offset = (next_slot)*(frame_parms->samples_per_tti>>1); for (aa=0; aanb_antennas_tx; aa++) { - // printf("Thread %d starting ... aa %d (%llu)\n",omp_get_thread_num(),aa,rdtsc()); if (frame_parms->Ncp == 1) PHY_ofdm_mod(&txdataF[aa][slot_offset_F], // input &txdata[aa][slot_offset], // output diff --git a/openair1/SIMULATION/LTE_PHY/dlsim_tm4.c b/openair1/SIMULATION/LTE_PHY/dlsim_tm4.c index 3b4e6782da..57c06e3b13 100644 --- a/openair1/SIMULATION/LTE_PHY/dlsim_tm4.c +++ b/openair1/SIMULATION/LTE_PHY/dlsim_tm4.c @@ -112,7 +112,6 @@ void do_OFDM_mod_l(int32_t **txdataF, int32_t **txdata, uint16_t next_slot, LTE_ slot_offset = (next_slot)*(frame_parms->samples_per_tti>>1); for (aa=0; aanb_antennas_tx; aa++) { - // printf("Thread %d starting ... aa %d (%llu)\n",omp_get_thread_num(),aa,rdtsc()); if (frame_parms->Ncp == 1) PHY_ofdm_mod(&txdataF[aa][slot_offset_F], // input diff --git a/openair1/SIMULATION/LTE_PHY/framegen.c b/openair1/SIMULATION/LTE_PHY/framegen.c index f5b1e6d45e..b9f0221b2d 100644 --- a/openair1/SIMULATION/LTE_PHY/framegen.c +++ b/openair1/SIMULATION/LTE_PHY/framegen.c @@ -333,7 +333,6 @@ void do_OFDM_mod(mod_sym_t **txdataF, int32_t **txdata, uint16_t next_slot, LTE_ slot_offset = (next_slot)*(frame_parms->samples_per_tti>>1); for (aa=0; aanb_antennas_tx; aa++) { - // printf("Thread %d starting ... aa %d (%llu)\n",omp_get_thread_num(),aa,rdtsc()); if (frame_parms->Ncp == 1) PHY_ofdm_mod(&txdataF[aa][slot_offset_F], // input diff --git a/openair1/SIMULATION/LTE_PHY/mbmssim.c b/openair1/SIMULATION/LTE_PHY/mbmssim.c index 31c3b47227..7efe9f4530 100644 --- a/openair1/SIMULATION/LTE_PHY/mbmssim.c +++ b/openair1/SIMULATION/LTE_PHY/mbmssim.c @@ -121,7 +121,6 @@ void do_OFDM_mod_l(int32_t **txdataF, int32_t **txdata, uint16_t next_slot, LTE_ slot_offset = (next_slot)*(frame_parms->samples_per_tti>>1); for (aa=0; aanb_antennas_tx; aa++) { - // printf("Thread %d starting ... aa %d (%llu)\n",omp_get_thread_num(),aa,rdtsc()); if (frame_parms->Ncp == 1) PHY_ofdm_mod(&txdataF[aa][slot_offset_F], // input &txdata[aa][slot_offset], // output diff --git a/targets/RT/USER/lte-ue.c b/targets/RT/USER/lte-ue.c index 1643ca36ca..2e95e56d85 100644 --- a/targets/RT/USER/lte-ue.c +++ b/targets/RT/USER/lte-ue.c @@ -815,11 +815,6 @@ static void *UE_thread_rxn_txnp4(void *arg) pthread_cond_wait( &proc->cond_rxtx, &proc->mutex_rxtx ); } - //printf("Processing sub frqme %d in %s\n", proc->subframe_rx, threadname); - initRefTimes(t2); - initRefTimes(t3); - pickTime(current); - updateTimes(proc->gotIQs, &t2, 10000, "Delay to wake up UE_Thread_Rx (case 2)"); // Process Rx data for one sub-frame lte_subframe_t sf_type = subframe_select( &UE->frame_parms, proc->subframe_rx); @@ -886,7 +881,6 @@ static void *UE_thread_rxn_txnp4(void *arg) if (UE->mode != loop_through_memory) phy_procedures_UE_S_TX(UE,0,0); - updateTimes(current, &t3, 10000, "Delay to process sub-frame (case 3)"); proc->instance_cnt_rxtx--; if ( IS_SOFTMODEM_BASICSIM || IS_SOFTMODEM_RFSIM ) { @@ -1470,12 +1464,6 @@ static void *UE_phy_stub_single_thread_rxn_txnp4(void *arg) oai_subframe_ind(proc->frame_rx, proc->subframe_rx); } - //Guessing that the next 4 lines are not needed for the phy_stub mode. - /*initRefTimes(t2); - initRefTimes(t3); - pickTime(current); - updateTimes(proc->gotIQs, &t2, 10000, "Delay to wake up UE_Thread_Rx (case 2)");*/ - if (pthread_mutex_lock(&phy_stub_ticking->mutex_single_thread) != 0) { LOG_E( MAC, "[SCHED][UE] error locking mutex for ue_thread_id %d (mutex_single_thread)\n",ue_thread_id); exit_fun("nothing to add"); @@ -2225,8 +2213,6 @@ void *UE_thread(void *arg) LOG_E(PHY,"can't compensate: diff =%d\n", first_symbols); } - pickTime(gotIQs); - /* no timeout in IS_SOFTMODEM_BASICSIM or IS_SOFTMODEM_RFSIM mode */ if (IS_SOFTMODEM_BASICSIM || IS_SOFTMODEM_RFSIM) { ret = pthread_mutex_lock(&proc->mutex_rxtx); @@ -2264,12 +2250,6 @@ void *UE_thread(void *arg) } } - //UE->proc.proc_rxtx[0].gotIQs=readTime(gotIQs); - //UE->proc.proc_rxtx[1].gotIQs=readTime(gotIQs); - for (th_id=0; th_id < RX_NB_TH; th_id++) { - UE->proc.proc_rxtx[th_id].gotIQs=readTime(gotIQs); - } - proc->subframe_rx=sub_frame; proc->subframe_tx=(sub_frame+4)%10; proc->frame_tx = proc->frame_rx + (proc->subframe_rx>5?1:0); @@ -2281,10 +2261,6 @@ void *UE_thread(void *arg) T(T_UE_MASTER_TICK, T_INT(0), T_INT(proc->frame_rx%1024), T_INT(proc->subframe_rx)); AssertFatal (pthread_cond_signal(&proc->cond_rxtx) ==0,""); AssertFatal(pthread_mutex_unlock(&proc->mutex_rxtx) ==0,""); - initRefTimes(t1); - initStaticTime(lastTime); - updateTimes(lastTime, &t1, 20000, "Delay between two IQ acquisitions (case 1)"); - pickStaticTime(lastTime); } else { printf("Processing subframe %d",proc->subframe_rx); getchar(); From d20ff45fc6086da492c4e226258748f05caf1fda Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Thu, 24 Feb 2022 20:55:53 +0100 Subject: [PATCH 56/96] Remove logging module dependency from Tpool --- common/utils/threadPool/thread-pool.h | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/common/utils/threadPool/thread-pool.h b/common/utils/threadPool/thread-pool.h index 2ca152bb02..7d2365fb52 100644 --- a/common/utils/threadPool/thread-pool.h +++ b/common/utils/threadPool/thread-pool.h @@ -30,7 +30,6 @@ #include #include #include -#include #include //#include @@ -103,13 +102,9 @@ static inline void *NotifiedFifoData(notifiedFIFO_elt_t *elt) { } static inline void delNotifiedFIFO_elt(notifiedFIFO_elt_t *elt) { - if (elt->malloced) { - elt->malloced=false; - free(elt); - } else - printf("delNotifiedFIFO on something not allocated by newNotifiedFIFO\n"); - - //LOG_W(UTIL,"delNotifiedFIFO on something not allocated by newNotifiedFIFO\n"); + AssertFatal(elt->malloced, "delNotifiedFIFO on something not allocated by newNotifiedFIFO\n"); + elt->malloced=false; + free(elt); } static inline void initNotifiedFIFO_nothreadSafe(notifiedFIFO_t *nf) { @@ -148,8 +143,7 @@ static inline notifiedFIFO_elt_t *pullNotifiedFIFO_nothreadSafe(notifiedFIFO_t notifiedFIFO_elt_t *ret=nf->outF; - if (nf->outF==nf->outF->next) - LOG_E(UTIL,"Circular list in thread pool: push several times the same buffer is forbidden\n"); + AssertFatal(nf->outF != nf->outF->next,"Circular list in thread pool: push several times the same buffer is forbidden\n"); nf->outF=nf->outF->next; From 76d609f7fa4bde2351e03ce7b9c66e98d907477a Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Fri, 25 Feb 2022 13:00:04 +0100 Subject: [PATCH 57/96] Delete unused code --- cmake_targets/CMakeLists.txt | 41 +- .../nrLDPC_encoder/ldpc_encode_parity_check.c | 1 - .../PHY/CODING/nrLDPC_encoder/ldpc_encoder.c | 3 +- .../nrLDPC_encoder/ldpc_encoder_optim.c | 1 - .../nrLDPC_encoder/ldpc_encoder_optim8seg.c | 1 - .../ldpc_encoder_optim8segmulti.c | 1 - openair1/SIMULATION/TOOLS/channel_sim.c | 1 - openair2/UTIL/FIFO/pad_list.c | 607 ------------------ openair2/UTIL/FIFO/pad_list.h | 87 --- openair2/UTIL/FIFO/types.h | 127 ---- 10 files changed, 2 insertions(+), 868 deletions(-) delete mode 100644 openair2/UTIL/FIFO/pad_list.c delete mode 100644 openair2/UTIL/FIFO/pad_list.h delete mode 100644 openair2/UTIL/FIFO/types.h diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 82022da78f..d059a34247 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -1281,55 +1281,16 @@ add_library(HASHTABLE include_directories(${OPENAIR_DIR}/common/utils/hashtable) set(UTIL_SRC - # ${OPENAIR2_DIR}/UTIL/CLI/cli.c - # ${OPENAIR2_DIR}/UTIL/CLI/cli_cmd.c - # ${OPENAIR2_DIR}/UTIL/CLI/cli_server.c - ${OPENAIR2_DIR}/UTIL/FIFO/pad_list.c ${OPENAIR2_DIR}/UTIL/LISTS/list.c ${OPENAIR2_DIR}/UTIL/LISTS/list2.c ${OPENAIR_DIR}/common/utils/LOG/log.c ${OPENAIR_DIR}/common/utils/LOG/vcd_signal_dumper.c ${OPENAIR2_DIR}/UTIL/MATH/oml.c - # ${OPENAIR2_DIR}/UTIL/MEM/mem_block.c - # ${OPENAIR2_DIR}/UTIL/OCG/OCG.c - # ${OPENAIR2_DIR}/UTIL/OCG/OCG_create_dir.c - # ${OPENAIR2_DIR}/UTIL/OCG/OCG_detect_file.c - # ${OPENAIR2_DIR}/UTIL/OCG/OCG_generate_report.c - # ${OPENAIR2_DIR}/UTIL/OCG/OCG_parse_filename.c - # ${OPENAIR2_DIR}/UTIL/OCG/OCG_parse_XML.c - # ${OPENAIR2_DIR}/UTIL/OCG/OCG_save_XML.c - # ${OPENAIR2_DIR}/UTIL/OMG/common.c - # ${OPENAIR2_DIR}/UTIL/OMG/grid.c - # ${OPENAIR2_DIR}/UTIL/OMG/job.c - # ${OPENAIR2_DIR}/UTIL/OMG/mobility_parser.c - # ${OPENAIR2_DIR}/UTIL/OMG/omg.c - # ${OPENAIR2_DIR}/UTIL/OMG/omg_hashtable.c - # ${OPENAIR2_DIR}/UTIL/OMG/rwalk.c - # ${OPENAIR2_DIR}/UTIL/OMG/rwp.c - # ${OPENAIR2_DIR}/UTIL/OMG/static.c - # ${OPENAIR2_DIR}/UTIL/OMG/steadystaterwp.c - # ${OPENAIR2_DIR}/UTIL/OMG/trace.c - # ${OPENAIR2_DIR}/UTIL/OMG/trace_hashtable.c ${OPENAIR2_DIR}/UTIL/OPT/probe.c - # ${OPENAIR2_DIR}/UTIL/OTG/otg_tx.c - # ${OPENAIR2_DIR}/UTIL/OTG/otg.c - # ${OPENAIR2_DIR}/UTIL/OTG/otg_kpi.c - # ${OPENAIR2_DIR}/UTIL/OTG/otg_models.c - # ${OPENAIR2_DIR}/UTIL/OTG/otg_form.c - # ${OPENAIR2_DIR}/UTIL/OTG/otg_rx.c - ) +) add_library(UTIL ${UTIL_SRC}) add_dependencies(UTIL rrc_flag) -#set(OMG_SUMO_SRC -# ${OPENAIR2_DIR}/UTIL/OMG/client_traci_OMG.c -# ${OPENAIR2_DIR}/UTIL/OMG/id_manager.c -# ${OPENAIR2_DIR}/UTIL/OMG/sumo.c -# ${OPENAIR2_DIR}/UTIL/OMG/socket_traci_OMG.c -# ${OPENAIR2_DIR}/UTIL/OMG/storage_traci_OMG.c -# ) -#add_library(OMG_SUMO ${OMG_SUMO_SRC}) - set(SECU_OSA_SRC ${OPENAIR2_DIR}/UTIL/OSA/osa_key_deriver.c ${OPENAIR2_DIR}/UTIL/OSA/osa_rijndael.c diff --git a/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encode_parity_check.c b/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encode_parity_check.c index 69d2ac4972..d36398a13a 100644 --- a/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encode_parity_check.c +++ b/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encode_parity_check.c @@ -33,7 +33,6 @@ #include #include #include -#include #include "assertions.h" #include "common/utils/LOG/log.h" diff --git a/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder.c b/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder.c index 76f92574ba..d5669fbbab 100644 --- a/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder.c +++ b/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder.c @@ -35,7 +35,6 @@ #include #include #include -#include #include "defs.h" #include "assertions.h" #include "openair1/PHY/CODING/nrLDPC_defs.h" @@ -280,4 +279,4 @@ int ldpc_encoder_orig(unsigned char *test_input,unsigned char *channel_input,int int nrLDPC_encod(unsigned char **test_input,unsigned char **channel_input,int Zc,int Kb,short block_length, short BG, encoder_implemparams_t *impp) { return ldpc_encoder_orig(test_input[0],channel_input[0],Zc,Kb,block_length,BG,impp->gen_code); -} \ No newline at end of file +} diff --git a/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder_optim.c b/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder_optim.c index 07062f6123..0537d0c1ef 100644 --- a/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder_optim.c +++ b/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder_optim.c @@ -33,7 +33,6 @@ #include #include #include -#include #include "assertions.h" #include "common/utils/LOG/log.h" #include "PHY/TOOLS/time_meas.h" diff --git a/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder_optim8seg.c b/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder_optim8seg.c index 6fa9c5ff53..5fa7a9e125 100644 --- a/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder_optim8seg.c +++ b/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder_optim8seg.c @@ -33,7 +33,6 @@ #include #include #include -#include #include "assertions.h" #include "common/utils/LOG/log.h" #include "PHY/TOOLS/time_meas.h" diff --git a/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder_optim8segmulti.c b/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder_optim8segmulti.c index 15d4481eb6..5b8c5cb205 100644 --- a/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder_optim8segmulti.c +++ b/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder_optim8segmulti.c @@ -33,7 +33,6 @@ #include #include #include -#include #include "assertions.h" #include "common/utils/LOG/log.h" #include "PHY/TOOLS/time_meas.h" diff --git a/openair1/SIMULATION/TOOLS/channel_sim.c b/openair1/SIMULATION/TOOLS/channel_sim.c index 197a296a51..de8db5d7cb 100644 --- a/openair1/SIMULATION/TOOLS/channel_sim.c +++ b/openair1/SIMULATION/TOOLS/channel_sim.c @@ -40,7 +40,6 @@ #include "PHY_INTERFACE/phy_interface_extern.h" #include "UTIL/OCG/OCG.h" #include "UTIL/OPT/opt.h" // to test OPT -#include "UTIL/FIFO/types.h" #define RF diff --git a/openair2/UTIL/FIFO/pad_list.c b/openair2/UTIL/FIFO/pad_list.c deleted file mode 100644 index 124893a756..0000000000 --- a/openair2/UTIL/FIFO/pad_list.c +++ /dev/null @@ -1,607 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.1 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -/*! \file pad_list.c -* \brief list management primimtives -* \author Mohamed Said MOSLI BOUKSIAA, Lionel GAUTHIER, Navid Nikaein -* \date 2012 - 2014 -* \version 0.5 -* @ingroup util -*/ -//#define LIST_C -//#define NULL 0 - -#include -#include -#include "pad_list.h" -//#include - - -void job_list_init (Job_List_t *listP) { - listP->tail = NULL; - listP->head = NULL; - listP->nb_elements = 0; -} - -void event_list_init (Event_List_t *listP) { - listP->tail = NULL; - listP->head = NULL; - listP->nb_elements = 0; -} - -void pkt_list_init (Packet_OTG_List_t *listP) { - listP->tail = NULL; - listP->head = NULL; - listP->nb_elements = 0; -} - -//----------------------------------------------------------------------------- - -void job_list_free (Job_List_t *listP) { - Job_elt_t *le; - - while ((le = job_list_remove_head (listP))) { - free(le); - } -} - -void event_list_free (Event_List_t *listP) { - Event_elt_t *le; - - while ((le = event_list_remove_head (listP))) { - free(le); - } -} - -void pkt_list_free (Packet_OTG_List_t *listP) { - Packet_otg_elt_t *le; - - while ((le = pkt_list_remove_head (listP))) { - free(le); - } -} - -//----------------------------------------------------------------------------- - -Job_elt_t *job_list_get_head (Job_List_t *listP) { - return listP->head; -} - -Event_elt_t *event_list_get_head (Event_List_t *listP) { - return listP->head; -} - -Packet_otg_elt_t *pkt_list_get_head (Packet_OTG_List_t *listP) { - return listP->head; -} - -//----------------------------------------------------------------------------- - -/* - * remove an element from head of a list - * @param pointer on targeted list - * @return pointer on removed Job_elt_t - */ -Job_elt_t *job_list_remove_head (Job_List_t *listP) { - // access optimisation - Job_elt_t *head; - head = listP->head; - - // almost one element - if (head != NULL) { - listP->head = head->next; - listP->nb_elements = listP->nb_elements - 1; - - // if only one element, update tail - if (listP->head == NULL) { - listP->tail = NULL; - } else { - head->next = NULL; - } - } else { - //msg("[MEM_MGT][WARNING] remove_head_from_list(%s) no elements\n",listP->name); - } - - return head; -} - -Event_elt_t *event_list_remove_head (Event_List_t *listP) { - // access optimisation - Event_elt_t *head; - head = listP->head; - - // almost one element - if (head != NULL) { - listP->head = head->next; - listP->nb_elements = listP->nb_elements - 1; - - // if only one element, update tail - if (listP->head == NULL) { - listP->tail = NULL; - } else { - head->next = NULL; - } - } else { - //msg("[MEM_MGT][WARNING] remove_head_from_list(%s) no elements\n",listP->name); - } - - return head; -} - -Packet_otg_elt_t *pkt_list_remove_head (Packet_OTG_List_t *listP) { - // access optimisation - Packet_otg_elt_t *head; - head = listP->head; - - // almost one element - if (head != NULL) { - listP->head = head->next; - listP->nb_elements = listP->nb_elements - 1; - - // if only one element, update tail - if (listP->head == NULL) { - listP->tail = NULL; - } else { - head->next = NULL; - } - } else { - //msg("[MEM_MGT][WARNING] remove_head_from_list(%s) no elements\n",listP->name); - } - - return head; -} - -//----------------------------------------------------------------------------- - -Job_elt_t *job_list_remove_element (Job_elt_t *elementP, Job_List_t *listP) { - // access optimisation; - Job_elt_t *head; - - if (elementP != NULL) { - // test head - head = listP->head; - - if (listP->head == elementP) { - // almost one element - if (head != NULL) { - listP->head = head->next; - listP->nb_elements = listP->nb_elements - 1; - - // if only one element, update tail - if (listP->head == NULL) { - listP->tail = NULL; - } else { - head->next = NULL; - } - } - } else { - while (head) { - if (head->next == elementP) { - head->next = elementP->next; - listP->nb_elements = listP->nb_elements - 1; - - if (listP->tail == elementP) { - listP->tail = head; - } - - return elementP; - } else { - head = head->next; - } - } - } - } - - return elementP; -} - -Event_elt_t *event_list_remove_element (Event_elt_t *elementP, Event_List_t *listP) { - // access optimisation; - Event_elt_t *head; - - if (elementP != NULL) { - // test head - head = listP->head; - - if (listP->head == elementP) { - // almost one element - if (head != NULL) { - listP->head = head->next; - listP->nb_elements = listP->nb_elements - 1; - - // if only one element, update tail - if (listP->head == NULL) { - listP->tail = NULL; - } else { - head->next = NULL; - } - } - } else { - while (head) { - if (head->next == elementP) { - head->next = elementP->next; - listP->nb_elements = listP->nb_elements - 1; - - if (listP->tail == elementP) { - listP->tail = head; - } - - return elementP; - } else { - head = head->next; - } - } - } - } - - return elementP; -} - -Packet_otg_elt_t *pkt_list_remove_element (Packet_otg_elt_t *elementP, Packet_OTG_List_t *listP) { - // access optimisation; - Packet_otg_elt_t *head; - - if (elementP != NULL) { - // test head - head = listP->head; - - if (listP->head == elementP) { - // almost one element - if (head != NULL) { - listP->head = head->next; - listP->nb_elements = listP->nb_elements - 1; - - // if only one element, update tail - if (listP->head == NULL) { - listP->tail = NULL; - } else { - head->next = NULL; - } - } - } else { - while (head) { - if (head->next == elementP) { - head->next = elementP->next; - listP->nb_elements = listP->nb_elements - 1; - - if (listP->tail == elementP) { - listP->tail = head; - } - - return elementP; - } else { - head = head->next; - } - } - } - } - - return elementP; -} - -//----------------------------------------------------------------------------- -/* - * add an element to the beginning of a list - * @param pointer on targeted list - * @return pointer on removed Job_elt_t - */ - -void job_list_add_head (Job_elt_t *elementP, Job_List_t *listP) { - // access optimisation; - Job_elt_t *head; - - if (elementP != NULL) { - head = listP->head; - listP->nb_elements = listP->nb_elements + 1; - - // almost one element - if (head == NULL) { - listP->head = elementP; - listP->tail = elementP; - } else { - elementP->next = head; - listP->head = elementP; - } - } -} - -void event_list_add_head (Event_elt_t *elementP, Event_List_t *listP) { - // access optimisation; - Event_elt_t *head; - - if (elementP != NULL) { - head = listP->head; - listP->nb_elements = listP->nb_elements + 1; - - // almost one element - if (head == NULL) { - listP->head = elementP; - listP->tail = elementP; - } else { - elementP->next = head; - listP->head = elementP; - } - } -} - -void pkt_list_add_head (Packet_otg_elt_t *elementP, Packet_OTG_List_t *listP) { - // access optimisation; - Packet_otg_elt_t *head; - - if (elementP != NULL) { - head = listP->head; - listP->nb_elements = listP->nb_elements + 1; - - // almost one element - if (head == NULL) { - listP->head = elementP; - listP->tail = elementP; - } else { - elementP->next = head; - listP->head = elementP; - } - } -} - -void event_list_add_element (Event_elt_t *elementP, Event_elt_t *previous, Event_List_t *listP) { - // access optimisation; - Event_elt_t *next; - - if (elementP != NULL && previous != NULL) { - elementP->next = NULL; - next = previous->next; - listP->nb_elements = listP->nb_elements + 1; - - // almost one element - if (next == NULL) { - previous->next = elementP; - listP->tail = elementP; - } else { - elementP->next = previous->next; - previous->next = elementP; - } - } -} - - -//----------------------------------------------------------------------------- -/* - * add an element to the end of a list - * @param pointer on targeted list - * @return pointer on removed Job_elt_t - */ -void job_list_add_tail_eurecom (Job_elt_t *elementP, Job_List_t *listP) { - Job_elt_t *tail; - - if (elementP != NULL) { - // access optimisation - listP->nb_elements = listP->nb_elements + 1; - elementP->next = NULL; - tail = listP->tail; - - // almost one element - if (tail == NULL) { - listP->head = elementP; - } else { - tail->next = elementP; - } - - listP->tail = elementP; - } else { - //msg("[CNT_LIST][ERROR] add_cnt_tail() element NULL\n"); - } -} - -void event_list_add_tail_eurecom (Event_elt_t *elementP, Event_List_t *listP) { - Event_elt_t *tail; - - if (elementP != NULL) { - // access optimisation - listP->nb_elements = listP->nb_elements + 1; - elementP->next = NULL; - tail = listP->tail; - - // almost one element - if (tail == NULL) { - listP->head = elementP; - } else { - tail->next = elementP; - } - - listP->tail = elementP; - } else { - //msg("[CNT_LIST][ERROR] add_cnt_tail() element NULL\n"); - } -} - -void pkt_list_add_tail_eurecom (Packet_otg_elt_t *elementP, Packet_OTG_List_t *listP) { - Packet_otg_elt_t *tail; - - if (elementP != NULL) { - // access optimisation - listP->nb_elements = listP->nb_elements + 1; - elementP->next = NULL; - tail = listP->tail; - - // almost one element - if (tail == NULL) { - listP->head = elementP; - } else { - tail->next = elementP; - } - - listP->tail = elementP; - } else { - //msg("[CNT_LIST][ERROR] add_cnt_tail() element NULL\n"); - } -} - -//----------------------------------------------------------------------------- -void job_list_add_list (Job_List_t *sublistP, Job_List_t *listP) { - if (sublistP) { - if (sublistP->head) { - // access optimisation - Job_elt_t *tail; - tail = listP->tail; - - // almost one element - if (tail == NULL) { - listP->head = sublistP->head; - } else { - tail->next = sublistP->head; - } - - listP->tail = sublistP->tail; - // clear sublist - sublistP->head = NULL; - sublistP->tail = NULL; - listP->nb_elements = listP->nb_elements + sublistP->nb_elements; - sublistP->nb_elements = 0; - } - } -} - -void event_list_add_list (Event_List_t *sublistP, Event_List_t *listP) { - if (sublistP) { - if (sublistP->head) { - // access optimisation - Event_elt_t *tail; - tail = listP->tail; - - // almost one element - if (tail == NULL) { - listP->head = sublistP->head; - } else { - tail->next = sublistP->head; - } - - listP->tail = sublistP->tail; - // clear sublist - sublistP->head = NULL; - sublistP->tail = NULL; - listP->nb_elements = listP->nb_elements + sublistP->nb_elements; - sublistP->nb_elements = 0; - } - } -} - -void pkt_list_add_list (Packet_OTG_List_t *sublistP, Packet_OTG_List_t *listP) { - if (sublistP) { - if (sublistP->head) { - // access optimisation - Packet_otg_elt_t *tail; - tail = listP->tail; - - // almost one element - if (tail == NULL) { - listP->head = sublistP->head; - } else { - tail->next = sublistP->head; - } - - listP->tail = sublistP->tail; - // clear sublist - sublistP->head = NULL; - sublistP->tail = NULL; - listP->nb_elements = listP->nb_elements + sublistP->nb_elements; - sublistP->nb_elements = 0; - } - } -} - -//----------------------------------------------------------------------------- -void job_list_display (Job_List_t *listP) { - //Correct the output once the content of struct Job is fixed - /*Job_elt_t *cursor; - unsigned short nb_elements = 0; - - if (listP) { - cursor = listP->head; - if (cursor) { - while (cursor != NULL) { - if (cursor->job.type == eNB_DL) - printf ("DL eNB From (%d,%d)\n", (cursor->job).nid, (cursor->job).mid); - else if (cursor->job.type == UE_DL) - printf ("DL UE From (%d,%d)\n", (cursor->job).nid, (cursor->job).mid); - else if (cursor->job.type == UE_UL) - printf ("UL UE From (%d,%d)\n", (cursor->job).nid, (cursor->job).mid); - else if (cursor->job.type == eNB_UL) - printf ("UL eNB From (%d,%d)\n", (cursor->job).nid, (cursor->job).mid); - //msg ("From (%d,%d) To (%d,%d)\n", (cursor->job).node1, (cursor->job).master1, (cursor->job).node2, (cursor->job).master2); - cursor = cursor->next; - nb_elements++; - } - printf ("Found nb_elements %d nb_elements %d\n", nb_elements, listP->nb_elements); - //msg ("Found nb_elements %d nb_elements %d\n", nb_elements, listP->nb_elements); - } - } else { - printf ("[SDU_MNGT][WARNING] display_cnt_dbl_lk_list_up() : list is NULL\n"); - //msg ("[SDU_MNGT][WARNING] display_cnt_dbl_lk_list_up() : list is NULL\n"); - }*/ -} - -void event_list_display (Event_List_t *listP) { - Event_elt_t *cursor; - unsigned short nb_elements = 0; - - if (listP) { - cursor = listP->head; - - if (cursor) { - while (cursor != NULL) { - printf ("Ev (%d,%d)\n", (cursor->event).type, (cursor->event).frame); - //msg ("From (%d,%d) To (%d,%d)\n", (cursor->job).node1, (cursor->job).master1, (cursor->job).node2, (cursor->job).master2); - cursor = cursor->next; - nb_elements++; - } - - printf ("Found nb_elements %d nb_elements %d\n", nb_elements, listP->nb_elements); - //msg ("Found nb_elements %d nb_elements %d\n", nb_elements, listP->nb_elements); - } - } else { - printf ("[SDU_MNGT][WARNING] display_cnt_dbl_lk_list_up() : list is NULL\n"); - //msg ("[SDU_MNGT][WARNING] display_cnt_dbl_lk_list_up() : list is NULL\n"); - } -} - -void pkt_list_display (Packet_OTG_List_t *listP) { - Packet_otg_elt_t *cursor; - unsigned short nb_elements = 0; - - if (listP) { - cursor = listP->head; - - if (cursor) { - while (cursor != NULL) { - printf ("Pkt (DST %d, RB %ld)\n", (cursor->otg_pkt).dst_id, (cursor->otg_pkt).rb_id); - //msg ("From (%d,%d) To (%d,%d)\n", (cursor->job).node1, (cursor->job).master1, (cursor->job).node2, (cursor->job).master2); - cursor = cursor->next; - nb_elements++; - } - - printf ("Found nb_elements %d nb_elements %d\n", nb_elements, listP->nb_elements); - //msg ("Found nb_elements %d nb_elements %d\n", nb_elements, listP->nb_elements); - } - } else { - printf ("[SDU_MNGT][WARNING] display_cnt_dbl_lk_list_up() : list is NULL\n"); - //msg ("[SDU_MNGT][WARNING] display_cnt_dbl_lk_list_up() : list is NULL\n"); - } -} diff --git a/openair2/UTIL/FIFO/pad_list.h b/openair2/UTIL/FIFO/pad_list.h deleted file mode 100644 index 2a9ef9893f..0000000000 --- a/openair2/UTIL/FIFO/pad_list.h +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.1 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -/*! \file pad_list.c -* \brief list management primimtives -* \author Mohamed Said MOSLI BOUKSIAA, Lionel GAUTHIER, Navid Nikaein -* \date 2012 - 2014 -* \version 0.5 -* @ingroup util -*/ - -#ifndef __list_H__ -#define __list_H__ - -#include "types.h" -//----------------------------------------------------------------------------- - -typedef struct Job_List_s { - Job_elt_t *head; - Job_elt_t *tail; - int nb_elements; -} Job_List_t; - -typedef struct Event_List_s { - Event_elt_t *head; - Event_elt_t *tail; - int nb_elements; -} Event_List_t; - -typedef struct Packet_OTG_List_s { - Packet_otg_elt_t *head; - Packet_otg_elt_t *tail; - int nb_elements; -} Packet_OTG_List_t; - -//----------------------------------------------------------------------------- -void job_list_init (Job_List_t*); -void job_list_free (Job_List_t* listP); -Job_elt_t* job_list_get_head (Job_List_t*); -Job_elt_t* job_list_remove_head (Job_List_t* ); -Job_elt_t* job_list_remove_element (Job_elt_t*, Job_List_t*); -void job_list_add_head (Job_elt_t* , Job_List_t* ); -void job_list_add_tail_eurecom (Job_elt_t* , Job_List_t* ); -void job_list_add_list (Job_List_t* , Job_List_t* ); -void job_list_display (Job_List_t* ); - -void event_list_init (Event_List_t*); -void event_list_free (Event_List_t* listP); -Event_elt_t* event_list_get_head (Event_List_t*); -Event_elt_t* event_list_remove_head (Event_List_t* ); -Event_elt_t* event_list_remove_element (Event_elt_t*, Event_List_t*); -void event_list_add_head (Event_elt_t* , Event_List_t* ); -void event_list_add_element (Event_elt_t* , Event_elt_t* , Event_List_t* ); -void event_list_add_tail_eurecom (Event_elt_t* , Event_List_t* ); -void event_list_add_list (Event_List_t* , Event_List_t* ); -void event_list_display (Event_List_t* ); - -void pkt_list_init (Packet_OTG_List_t*); -void pkt_list_free (Packet_OTG_List_t* listP); -Packet_otg_elt_t* pkt_list_get_head (Packet_OTG_List_t*); -Packet_otg_elt_t* pkt_list_remove_head (Packet_OTG_List_t* ); -Packet_otg_elt_t* pkt_list_remove_element (Packet_otg_elt_t*, Packet_OTG_List_t*); -void pkt_list_add_head (Packet_otg_elt_t* , Packet_OTG_List_t* ); -void pkt_list_add_element (Packet_otg_elt_t* , Packet_otg_elt_t* , Packet_OTG_List_t* ); -void pkt_list_add_tail_eurecom (Packet_otg_elt_t* , Packet_OTG_List_t* ); -void pkt_list_add_list (Packet_OTG_List_t* , Packet_OTG_List_t* ); -void pkt_list_display (Packet_OTG_List_t* ); - -#endif diff --git a/openair2/UTIL/FIFO/types.h b/openair2/UTIL/FIFO/types.h deleted file mode 100644 index f949b2b72b..0000000000 --- a/openair2/UTIL/FIFO/types.h +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.1 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -/*! \file pad_list.c -* \brief list management primimtives -* \author Mohamed Said MOSLI BOUKSIAA, Lionel GAUTHIER, Navid Nikaein -* \date 2012 - 2014 -* \version 0.5 -* @ingroup util -*/ - -#ifndef __FIFO_TYPES_H__ -#define __FIFO_TYPES_H__ -#include "platform_types.h" - -/* Types regrouping both user-defined and regular events */ -typedef enum { - MIN_ET=0, - OAI_ET=MIN_ET, // config events - SYS_ET, - TOPO_ET, - APP_ET, - EMU_ET, - DL_ET, // frame events - UL_ET, - S_ET, - PHY_ET, // protocol events - MAC_ET, - RLC_ET, - PDCP_ET, - RRC_ET, - MAX_ET -} Event_Type_t; - -/* decomposition of node functions into jobs for a given event */ -typedef enum Job_type_e { JT_OTG, JT_PDCP, JT_PHY_MAC, JT_INIT_SYNC, JT_DL, JT_UL, RN_DL, RN_UL, JT_END} Job_Type_t; - -typedef enum Operation_Type_e { READ, WRITE, RESET} Operation_Type_t; - -typedef struct Job_s { - enum Job_type_e type; - int exe_time; /* execution time at the worker*/ - int nid; /* node id*/ - eNB_flag_t eNB_flag; - frame_t frame; - int last_slot; - int next_slot; - int ctime; -} Job_t; - -typedef struct Signal_buffers_s { // (s = transmit, r,r0 = receive) - double **s_re; - double **s_im; - double **r_re; - double **r_im; - double **r_re0; - double **r_im0; -} Signal_buffers_t; - -/*!\brief sybframe type : DL, UL, SF, */ - -typedef struct Packet_otg_s { - unsigned int sdu_buffer_size; - unsigned char *sdu_buffer; - module_id_t module_id; - rb_id_t rb_id; - module_id_t dst_id; - boolean_t is_ue; - pdcp_transmission_mode_t mode; -} Packet_otg_t; - -typedef struct { - Event_Type_t type; - enum Operation_Type_e optype; //op - char *key; - void *value; - frame_t frame; - int ue; - int lcid; -} Event_t; - -/*typedef struct Global_Time { - uint32_t frame; - int32_t slot; - int32_t last_slot; - int32_t next_slot; - double time_s; - double time_ms; -};*/ - - - -typedef struct Packet_otg_elt_s { - struct Packet_otg_elt_s *next; - struct Packet_otg_elt_s *previous; - Packet_otg_t otg_pkt; -} Packet_otg_elt_t; - -typedef struct Job_element_s { - struct Job_element_s *next; - Job_t job; -} Job_elt_t; - -typedef struct Event_element_s { - struct Event_element_s *next; - struct Event_element_s *previous; - Event_t event; -} Event_elt_t; -#endif From 9ead3d7ad2c4e54abbb1ceed0a405b72664b0da1 Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Fri, 25 Feb 2022 13:33:26 +0100 Subject: [PATCH 58/96] Clean up CMakeLists.txt (no functional changes) --- cmake_targets/CMakeLists.txt | 137 +++++++---------------------------- 1 file changed, 25 insertions(+), 112 deletions(-) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index d059a34247..ad5594d393 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -790,19 +790,13 @@ add_list2_option(RF_BOARD "EXMIMO" "RF head type" "None" "OAI_USRP" "OAI_BLADERF add_list2_option(TRANSP_PRO "None" "Transport protocol type" "None" "ETHERNET") #NOKIA config enhancement -set (CONFIG_ROOTDIR - ${OPENAIR_DIR}/common/config - ) -set (CONFIG_SOURCES +set (CONFIG_ROOTDIR ${OPENAIR_DIR}/common/config) +add_library(CONFIG_LIB ${CONFIG_ROOTDIR}/config_load_configmodule.c ${CONFIG_ROOTDIR}/config_userapi.c ${CONFIG_ROOTDIR}/config_cmdline.c - ) -set (CONFIG_LIBCONFIG_SOURCES - ${CONFIG_ROOTDIR}/libconfig/config_libconfig.c - ) -add_library(CONFIG_LIB ${CONFIG_SOURCES}) -add_library(params_libconfig MODULE ${CONFIG_LIBCONFIG_SOURCES} ) +) +add_library(params_libconfig MODULE ${CONFIG_ROOTDIR}/libconfig/config_libconfig.c) target_link_libraries(params_libconfig config) # shared library loader set (SHLIB_LOADER_SOURCES @@ -1261,15 +1255,6 @@ set(FSPT_MSG_LIB FSPT_MSG) message("fspt c dir is : ${FSPT_C_DIR}") include_directories (${FSPT_C_DIR}) -# add_library(ASYNC_IF -# ${OPENAIR2_DIR}/UTIL/ASYNC_IF/socket_link.c -# ${OPENAIR2_DIR}/UTIL/ASYNC_IF/link_manager.c -# ${OPENAIR2_DIR}/UTIL/ASYNC_IF/message_queue.c -# ${OPENAIR2_DIR}/UTIL/ASYNC_IF/ringbuffer_queue.c -# ) -# set(ASYNC_IF_LIB ASYNC_IF) -# include_directories(${OPENAIR2_DIR}/UTIL/ASYNC_IF) - set(PROTOBUF_LIB "protobuf-c") #set(PROTOBUF_LIB "protobuf") #for Cpp @@ -1280,16 +1265,18 @@ add_library(HASHTABLE ) include_directories(${OPENAIR_DIR}/common/utils/hashtable) -set(UTIL_SRC +add_library(UTIL ${OPENAIR2_DIR}/UTIL/LISTS/list.c ${OPENAIR2_DIR}/UTIL/LISTS/list2.c ${OPENAIR_DIR}/common/utils/LOG/log.c ${OPENAIR_DIR}/common/utils/LOG/vcd_signal_dumper.c ${OPENAIR2_DIR}/UTIL/MATH/oml.c ${OPENAIR2_DIR}/UTIL/OPT/probe.c + ${OPENAIR_DIR}/common/utils/threadPool/thread-pool.c + ${OPENAIR_DIR}/common/utils/utils.c + ${OPENAIR_DIR}/common/utils/system.c + ${OPENAIR_DIR}/common/utils/backtrace.c ) -add_library(UTIL ${UTIL_SRC}) -add_dependencies(UTIL rrc_flag) set(SECU_OSA_SRC ${OPENAIR2_DIR}/UTIL/OSA/osa_key_deriver.c @@ -2662,7 +2649,7 @@ add_library(minimal_lib ${OPENAIR_DIR}/common/utils/minimal_stub.c ${T_SOURCE} ) -target_link_libraries(minimal_lib pthread dl ${T_LIB} ${CONFIG_LIB}) +target_link_libraries(minimal_lib pthread dl ${T_LIB} CONFIG_LIB) add_executable(nfapi_test ${OPENAIR_DIR}/openair2/NR_PHY_INTERFACE/nfapi_5g_test.c @@ -2691,7 +2678,6 @@ add_executable(lte-softmodem ${OPENAIR_TARGETS}/RT/USER/lte-ru.c ${OPENAIR_TARGETS}/RT/USER/ru_control.c ${OPENAIR_TARGETS}/RT/USER/lte-softmodem.c - ${OPENAIR_DIR}/common/utils/threadPool/thread-pool.c ${OPENAIR_DIR}/executables/softmodem-common.c ${OPENAIR2_DIR}/ENB_APP/NB_IoT_interface.c ${OPENAIR1_DIR}/SIMULATION/TOOLS/taus.c @@ -2706,14 +2692,11 @@ add_executable(lte-softmodem ${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/multicast_link.c ${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/socket.c ${OPENAIR3_DIR}/NAS/UE/nas_ue_task.c - ${OPENAIR_DIR}/common/utils/utils.c - ${OPENAIR_DIR}/common/utils/system.c ${PHY_INTERFACE_DIR}/queue_t.c ${OPENAIR_DIR}/common/utils/lte/ue_power.c ${OPENAIR_DIR}/common/utils/lte/prach_utils.c ${XFORMSINTERFACE_SOURCE} ${T_SOURCE} - ${CONFIG_SOURCES} ${SHLIB_LOADER_SOURCES} ) add_dependencies(lte-softmodem rrc_flag s1ap_flag x2_flag oai_iqplayer) @@ -2726,14 +2709,13 @@ target_link_libraries (lte-softmodem -Wl,--end-group z dl) target_link_libraries (lte-softmodem ${LIBXML2_LIBRARIES}) -target_link_libraries (lte-softmodem pthread m ${CONFIG_LIB} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} sctp ${PROTOBUF_LIB} ${CMAKE_DL_LIBS} ${LIBYAML_LIBRARIES}) +target_link_libraries (lte-softmodem pthread m CONFIG_LIB rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} sctp ${PROTOBUF_LIB} ${CMAKE_DL_LIBS} ${LIBYAML_LIBRARIES}) target_link_libraries (lte-softmodem ${LIB_LMS_LIBRARIES}) target_link_libraries (lte-softmodem ${T_LIB}) add_executable(ocp-enb ${OPENAIR_DIR}/executables/main-ocp.c - ${OPENAIR_DIR}/common/utils/threadPool/thread-pool.c ${OPENAIR_DIR}/executables/softmodem-common.c ${OPENAIR_DIR}/executables/main-fs6.c ${OPENAIR_DIR}/executables/transport_split.c @@ -2749,14 +2731,11 @@ add_executable(ocp-enb ${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/multicast_link.c ${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/socket.c ${OPENAIR3_DIR}/NAS/UE/nas_ue_task.c - ${OPENAIR_DIR}/common/utils/utils.c - ${OPENAIR_DIR}/common/utils/system.c ${OPENAIR_DIR}/common/utils/lte/ue_power.c ${OPENAIR_DIR}/common/utils/lte/prach_utils.c ${PHY_INTERFACE_DIR}/queue_t.c ${XFORMSINTERFACE_SOURCE} ${T_SOURCE} - ${CONFIG_SOURCES} ${SHLIB_LOADER_SOURCES} ) add_dependencies(ocp-enb rrc_flag s1ap_flag x2_flag oai_iqplayer coding params_libconfig rfsimulator) @@ -2768,7 +2747,7 @@ target_link_libraries (ocp-enb PHY_COMMON PHY PHY_RU LFDS L2 L2_LTE NFAPI_COMMON_LIB NFAPI_LIB MISC_NFAPI_LTE_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB LFDS7 SIMU_COMMON ${RAL_LIB} ${NAS_UE_LIB} ITTI ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} ${FSPT_MSG_LIB} -Wl,--end-group z dl) -target_link_libraries (ocp-enb ${LIBXML2_LIBRARIES} pthread m ${CONFIG_LIBRARIES} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} sctp ${PROTOBUF_LIB} ${CMAKE_DL_LIBS} ${LIBYAML_LIBRARIES} ${LIB_LMS_LIBRARIES} ${T_LIB}) +target_link_libraries (ocp-enb ${LIBXML2_LIBRARIES} pthread m CONFIG_LIB rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} sctp ${PROTOBUF_LIB} ${CMAKE_DL_LIBS} ${LIBYAML_LIBRARIES} ${LIB_LMS_LIBRARIES} ${T_LIB}) add_executable(oairu ${OPENAIR_TARGETS}/RT/USER/lte-ru.c @@ -2777,23 +2756,18 @@ add_executable(oairu ${OPENAIR_TARGETS}/ARCH/COMMON/record_player.c ${OPENAIR_DIR}/executables/softmodem-common.c ${OPENAIR_DIR}/openair1/SCHED/phy_procedures_lte_common.c - ${OPENAIR_DIR}/common/utils/threadPool/thread-pool.c ${OPENAIR_DIR}/executables/main_ru.c ${T_SOURCE} - ${OPENAIR_DIR}/common/utils/LOG/log.c - ${CONFIG_SOURCES} - ${OPENAIR_DIR}/common/utils/utils.c - ${OPENAIR_DIR}/common/utils/system.c ${OPENAIR_DIR}/common/utils/lte/prach_utils.c ${SHLIB_LOADER_SOURCES} ) target_link_libraries (oairu -Wl,--start-group SCHED_RU_LIB - PHY_COMMON PHY_RU + PHY_COMMON PHY_RU UTIL -Wl,--end-group z dl) -target_link_libraries (oairu pthread m ${CONFIG_LIB} rt ${CMAKE_DL_LIBS} ${T_LIB}) +target_link_libraries (oairu pthread m CONFIG_LIB rt ${CMAKE_DL_LIBS} ${T_LIB}) # lte-uesoftmodem is UE implementation @@ -2812,13 +2786,10 @@ add_executable(lte-uesoftmodem ${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/multicast_link.c ${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/socket.c ${OPENAIR3_DIR}/NAS/UE/nas_ue_task.c - ${OPENAIR_DIR}/common/utils/utils.c - ${OPENAIR_DIR}/common/utils/system.c ${OPENAIR_DIR}/common/utils/lte/ue_power.c ${OPENAIR_DIR}/common/utils/lte/prach_utils.c ${XFORMSINTERFACE_SOURCE} ${T_SOURCE} - ${CONFIG_SOURCES} ${SHLIB_LOADER_SOURCES} ) @@ -2836,7 +2807,7 @@ target_link_libraries (lte-uesoftmodem -Wl,--end-group z dl) target_link_libraries (lte-uesoftmodem ${LIBXML2_LIBRARIES}) -target_link_libraries (lte-uesoftmodem pthread m ${CONFIG_LIB} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} sctp ${CMAKE_DL_LIBS} ${LIBYAML_LIBRARIES} ${ATLAS_LIBRARIES}) +target_link_libraries (lte-uesoftmodem pthread m CONFIG_LIB rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} sctp ${CMAKE_DL_LIBS} ${LIBYAML_LIBRARIES} ${ATLAS_LIBRARIES}) target_link_libraries (lte-uesoftmodem ${LIB_LMS_LIBRARIES}) target_link_libraries (lte-uesoftmodem ${T_LIB}) @@ -2849,7 +2820,6 @@ add_executable(nr-softmodem ${s1ap_h} # ${OPENAIR_BIN_DIR}/messages_xml.h ${OPENAIR_DIR}/executables/nr-gnb.c - ${OPENAIR_DIR}/common/utils/threadPool/thread-pool.c ${OPENAIR_DIR}/executables/nr-ru.c ${OPENAIR_DIR}/executables/nr-softmodem.c ${OPENAIR_DIR}/executables/softmodem-common.c @@ -2859,15 +2829,12 @@ add_executable(nr-softmodem ${OPENAIR2_DIR}/RRC/NAS/nas_config.c ${OPENAIR2_DIR}/RRC/NAS/rb_config.c ${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c - ${OPENAIR_DIR}/common/utils/utils.c - ${OPENAIR_DIR}/common/utils/system.c ${OPENAIR_DIR}/common/utils/lte/ue_power.c ${OPENAIR_DIR}/common/utils/lte/prach_utils.c ${OPENAIR_DIR}/common/utils/nr/nr_common.c ${PHY_INTERFACE_DIR}/queue_t.c ${XFORMSINTERFACE_SOURCE} ${T_SOURCE} - ${CONFIG_SOURCES} ${SHLIB_LOADER_SOURCES} ${OPENAIR2_DIR}/ENB_APP/flexran_agent_ran_api_to_fix.c ) @@ -2881,7 +2848,7 @@ target_link_libraries (nr-softmodem -Wl,--end-group z dl) target_link_libraries (nr-softmodem ${LIBXML2_LIBRARIES}) -target_link_libraries (nr-softmodem pthread m ${CONFIG_LIB} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} sctp ${XFORMS_LIBRARIES} ${PROTOBUF_LIB} ${CMAKE_DL_LIBS} ${LIBYAML_LIBRARIES} ${ATLAS_LIBRARIES}) +target_link_libraries (nr-softmodem pthread m CONFIG_LIB rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} sctp ${XFORMS_LIBRARIES} ${PROTOBUF_LIB} ${CMAKE_DL_LIBS} ${LIBYAML_LIBRARIES} ${ATLAS_LIBRARIES}) target_link_libraries (nr-softmodem ${LIB_LMS_LIBRARIES}) target_link_libraries (nr-softmodem ${T_LIB}) @@ -2893,7 +2860,6 @@ add_executable(ocp-gnb ${s1ap_h} # ${OPENAIR_BIN_DIR}/messages_xml.h ${OPENAIR_DIR}/executables/ocp-gnb.c - ${OPENAIR_DIR}/common/utils/threadPool/thread-pool.c ${OPENAIR_DIR}/executables/softmodem-common.c ${OPENAIR1_DIR}/SIMULATION/TOOLS/taus.c ${OPENAIR_TARGETS}/ARCH/COMMON/common_lib.c @@ -2902,12 +2868,9 @@ add_executable(ocp-gnb ${OPENAIR2_DIR}/RRC/NAS/rb_config.c ${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c ${OPENAIR_DIR}/common/utils/nr/nr_common.c - ${OPENAIR_DIR}/common/utils/utils.c - ${OPENAIR_DIR}/common/utils/system.c ${PHY_INTERFACE_DIR}/queue_t.c ${XFORMS_SOURCE_NR} ${T_SOURCE} - ${CONFIG_SOURCES} ${SHLIB_LOADER_SOURCES} ${XFORMSINTERFACE_SOURCE} ) @@ -2921,7 +2884,7 @@ target_link_libraries (ocp-gnb -Wl,--end-group z dl) target_link_libraries (ocp-gnb ${LIBXML2_LIBRARIES} ) -target_link_libraries (ocp-gnb pthread m ${CONFIG_LIB} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} sctp ${XFORMS_LIBRARIES} ${PROTOBUF_LIB} ${CMAKE_DL_LIBS} ${LIBYAML_LIBRARIES} ${ATLAS_LIBRARIES}) +target_link_libraries (ocp-gnb pthread m CONFIG_LIB rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} sctp ${XFORMS_LIBRARIES} ${PROTOBUF_LIB} ${CMAKE_DL_LIBS} ${LIBYAML_LIBRARIES} ${ATLAS_LIBRARIES}) target_link_libraries (ocp-gnb ${LIB_LMS_LIBRARIES}) target_link_libraries (ocp-gnb ${T_LIB}) add_dependencies(ocp-gnb ldpc_orig ldpc_optim ldpc_optim8seg ldpc params_libconfig rfsimulator oai_usrpdevif rfsimulator nrscope) @@ -2934,7 +2897,6 @@ add_executable(nr-uesoftmodem ${rrc_h} ${s1ap_h} # ${OPENAIR_BIN_DIR}/messages_xml.h - ${OPENAIR_DIR}/common/utils/threadPool/thread-pool.c ${OPENAIR_DIR}/executables/nr-uesoftmodem.c ${OPENAIR_DIR}/executables/nr-ue.c ${OPENAIR_DIR}/executables/softmodem-common.c @@ -2946,13 +2908,9 @@ add_executable(nr-uesoftmodem ${OPENAIR2_DIR}/RRC/NAS/rb_config.c ${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c ${OPENAIR3_DIR}/NAS/UE/nas_ue_task.c - ${OPENAIR_DIR}/common/utils/utils.c - ${OPENAIR_DIR}/common/utils/system.c ${OPENAIR_DIR}/common/utils/nr/nr_common.c ${XFORMSINTERFACE_SOURCE} ${T_SOURCE} - ${UTIL_SRC} - ${CONFIG_SOURCES} ${SHLIB_LOADER_SOURCES} ) @@ -2967,7 +2925,7 @@ target_link_libraries (nr-uesoftmodem -Wl,--end-group z dl) target_link_libraries (nr-uesoftmodem ${LIBXML2_LIBRARIES}) -target_link_libraries (nr-uesoftmodem pthread m ${CONFIG_LIB} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} sctp ${XFORMS_LIBRARIES} ${CMAKE_DL_LIBS} ${LIBYAML_LIBRARIES} ${ATLAS_LIBRARIES}) +target_link_libraries (nr-uesoftmodem pthread m CONFIG_LIB rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} sctp ${XFORMS_LIBRARIES} ${CMAKE_DL_LIBS} ${LIBYAML_LIBRARIES} ${ATLAS_LIBRARIES}) target_link_libraries (nr-uesoftmodem ${LIB_LMS_LIBRARIES}) target_link_libraries (nr-uesoftmodem ${T_LIB}) @@ -2989,30 +2947,25 @@ endif (CUDA_FOUND) add_executable(dlsim_tm4 ${OPENAIR1_DIR}/SIMULATION/LTE_PHY/dlsim_tm4.c ${OPENAIR1_DIR}/PHY/TOOLS/lte_phy_scope_tm4.c - ${OPENAIR_DIR}/common/utils/system.c ${T_SOURCE} ) target_link_libraries (dlsim_tm4 -Wl,--start-group SIMU_COMMON SIMU UTIL SCHED_LIB SCHED_RU_LIB PHY LFDS ITTI -Wl,--end-group - pthread m rt ${CONFIG_LIB} ${ATLAS_LIBRARIES} ${T_LIB} + pthread m rt CONFIG_LIB ${ATLAS_LIBRARIES} ${T_LIB} ) add_executable(rftest ${OPENAIR_DIR}/openair1/PHY/TOOLS/calibration_test.c ${OPENAIR_DIR}/openair1/PHY/TOOLS/calibration_scope.c - ${OPENAIR_DIR}/common/utils/system.c ${OPENAIR_TARGETS}/ARCH/COMMON/common_lib.c ${OPENAIR_DIR}/executables/softmodem-common.c - ${CONFIG_SOURCES} ${SHLIB_LOADER_SOURCES} ) -target_link_libraries(rftest minimal_lib PHY_NR_COMMON pthread dl m forms ${T_LIB} ) +target_link_libraries(rftest minimal_lib CONFIG_LIB PHY_NR_COMMON UTIL pthread dl m forms ${T_LIB} ) add_executable(polartest ${OPENAIR1_DIR}/PHY/CODING/TESTBENCH/polartest.c - ${OPENAIR_DIR}/common/utils/backtrace.c ${OPENAIR_DIR}/common/utils/nr/nr_common.c - ${OPENAIR_DIR}/common/utils/system.c ${T_SOURCE} ${SHLIB_LOADER_SOURCES} ) @@ -3023,9 +2976,7 @@ target_link_libraries(polartest add_executable(smallblocktest ${OPENAIR1_DIR}/PHY/CODING/TESTBENCH/smallblocktest.c - ${OPENAIR_DIR}/common/utils/backtrace.c ${OPENAIR_DIR}/common/utils/nr/nr_common.c - ${OPENAIR_DIR}/common/utils/system.c ${T_SOURCE} ${SHLIB_LOADER_SOURCES} ) @@ -3055,11 +3006,7 @@ target_link_libraries(ldpctest add_executable(nr_dlschsim ${OPENAIR1_DIR}/SIMULATION/NR_PHY/dlschsim.c - ${OPENAIR_DIR}/common/utils/system.c ${OPENAIR_DIR}/common/utils/nr/nr_common.c - ${OPENAIR_DIR}/common/utils/utils.c - ${OPENAIR_DIR}/common/utils/threadPool/thread-pool.c - ${UTIL_SRC} ${T_SOURCE} ${SHLIB_LOADER_SOURCES} ) @@ -3070,11 +3017,7 @@ target_link_libraries(nr_dlschsim add_executable(nr_pbchsim ${OPENAIR1_DIR}/SIMULATION/NR_PHY/pbchsim.c - ${OPENAIR_DIR}/common/utils/system.c ${OPENAIR_DIR}/common/utils/nr/nr_common.c - ${OPENAIR_DIR}/common/utils/utils.c - ${OPENAIR_DIR}/common/utils/threadPool/thread-pool.c - ${UTIL_SRC} ${T_SOURCE} ${SHLIB_LOADER_SOURCES} ) @@ -3086,12 +3029,7 @@ target_link_libraries(nr_pbchsim #PUCCH ---> Prashanth add_executable(nr_pucchsim ${OPENAIR1_DIR}/SIMULATION/NR_PHY/pucchsim.c - ${OPENAIR_DIR}/common/utils/backtrace.c ${OPENAIR_DIR}/common/utils/nr/nr_common.c - ${OPENAIR_DIR}/common/utils/system.c - ${OPENAIR_DIR}/common/utils/utils.c - ${OPENAIR_DIR}/common/utils/threadPool/thread-pool.c - ${UTIL_SRC} ${T_SOURCE} ${SHLIB_LOADER_SOURCES} ) @@ -3102,17 +3040,13 @@ target_link_libraries(nr_pucchsim add_executable(nr_dlsim ${OPENAIR1_DIR}/SIMULATION/NR_PHY/dlsim.c - ${OPENAIR_DIR}/common/utils/utils.c - ${OPENAIR_DIR}/common/utils/system.c ${OPENAIR_DIR}/common/utils/nr/nr_common.c ${OPENAIR_DIR}/executables/softmodem-common.c ${OPENAIR2_DIR}/RRC/NAS/nas_config.c ${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c ${NR_UE_RRC_DIR}/rrc_nsa.c ${NFAPI_USER_DIR}/nfapi.c - ${OPENAIR_DIR}/common/utils/threadPool/thread-pool.c ${PHY_INTERFACE_DIR}/queue_t.c - ${UTIL_SRC} ${T_SOURCE} ${SHLIB_LOADER_SOURCES} ) @@ -3124,17 +3058,13 @@ target_compile_definitions(nr_dlsim PUBLIC -DPHYSICAL_SIMULATOR) add_executable(nr_prachsim ${OPENAIR1_DIR}/SIMULATION/NR_PHY/prachsim.c - ${OPENAIR_DIR}/common/utils/utils.c - ${OPENAIR_DIR}/common/utils/system.c ${OPENAIR_DIR}/common/utils/nr/nr_common.c ${OPENAIR1_DIR}/SCHED_NR/phy_procedures_nr_common.c ${OPENAIR2_DIR}/RRC/NAS/nas_config.c ${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c ${NR_UE_RRC_DIR}/rrc_nsa.c ${NFAPI_USER_DIR}/nfapi.c - ${OPENAIR_DIR}/common/utils/threadPool/thread-pool.c ${PHY_INTERFACE_DIR}/queue_t.c - ${UTIL_SRC} ${T_SOURCE} ${SHLIB_LOADER_SOURCES}) target_link_libraries(nr_prachsim @@ -3143,12 +3073,8 @@ target_link_libraries(nr_prachsim add_executable(nr_ulschsim ${OPENAIR1_DIR}/SIMULATION/NR_PHY/ulschsim.c - ${OPENAIR_DIR}/common/utils/threadPool/thread-pool.c - ${OPENAIR_DIR}/common/utils/utils.c - ${OPENAIR_DIR}/common/utils/system.c ${OPENAIR_DIR}/common/utils/nr/nr_common.c ${PHY_INTERFACE_DIR}/queue_t.c - ${UTIL_SRC} ${T_SOURCE} ${SHLIB_LOADER_SOURCES} ) @@ -3159,9 +3085,6 @@ target_link_libraries(nr_ulschsim add_executable(nr_ulsim ${OPENAIR1_DIR}/SIMULATION/NR_PHY/ulsim.c - ${OPENAIR_DIR}/common/utils/threadPool/thread-pool.c - ${OPENAIR_DIR}/common/utils/utils.c - ${OPENAIR_DIR}/common/utils/system.c ${OPENAIR_DIR}/common/utils/nr/nr_common.c ${OPENAIR_DIR}/executables/softmodem-common.c ${OPENAIR2_DIR}/RRC/NAS/nas_config.c @@ -3169,7 +3092,6 @@ add_executable(nr_ulsim ${NR_UE_RRC_DIR}/rrc_nsa.c ${NFAPI_USER_DIR}/nfapi.c ${PHY_INTERFACE_DIR}/queue_t.c - ${UTIL_SRC} ${T_SOURCE} ${SHLIB_LOADER_SOURCES} ) @@ -3183,22 +3105,17 @@ foreach(myExe dlsim dlsim_tm7 ulsim pbchsim scansim mbmssim pdcchsim pucchsim pr add_executable(${myExe} ${OPENAIR1_DIR}/SIMULATION/LTE_PHY/${myExe}.c - ${OPENAIR_DIR}/common/utils/threadPool/thread-pool.c - ${OPENAIR_DIR}/common/utils/backtrace.c - ${OPENAIR_DIR}/common/utils/system.c - ${OPENAIR_DIR}/common/utils/utils.c ${OPENAIR_DIR}/common/utils/lte/ue_power.c ${OPENAIR_DIR}/common/utils/lte/prach_utils.c ${OPENAIR1_DIR}/PHY/INIT/lte_param_init.c ${XFORMS_SOURCE} ${T_SOURCE} - ${CONFIG_SOURCES} ${SHLIB_LOADER_SOURCES} ${NFAPI_USER_DIR}/nfapi.c ) target_link_libraries (${myExe} -Wl,--start-group SIMU_COMMON SIMU UTIL SCHED_LIB SCHED_RU_LIB SCHED_UE_LIB PHY_COMMON PHY_NR_COMMON PHY PHY_UE PHY_RU LFDS ITTI LFDS7 -Wl,--end-group - pthread m rt ${CONFIG_LIB} ${ATLAS_LIBRARIES} ${XFORMS_LIBRARIES} ${T_LIB} dl + pthread m rt CONFIG_LIB ${ATLAS_LIBRARIES} ${XFORMS_LIBRARIES} ${T_LIB} dl ) endforeach(myExe) @@ -3212,7 +3129,7 @@ add_executable(test_epc_generate_scenario ${OPENAIR3_DIR}/S1AP/s1ap_eNB_defs.h ) target_link_libraries (test_epc_generate_scenario - -Wl,--start-group RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB X2AP_ENB M2AP_LIB M2AP_ENB M3AP_LIB M3AP_ENB F1AP_LIB F1AP GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT MME_APP SCHED_LIB PHY LFDS ITTI L2 -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${LIBXSLT_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${CONFIG_LIB} + -Wl,--start-group RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB X2AP_ENB M2AP_LIB M2AP_ENB M3AP_LIB M3AP_ENB F1AP_LIB F1AP GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT MME_APP SCHED_LIB PHY LFDS ITTI L2 -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${LIBXSLT_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} CONFIG_LIB ) add_executable(test_epc_play_scenario @@ -3231,7 +3148,7 @@ add_executable(test_epc_play_scenario ) target_include_directories(test_epc_play_scenario PUBLIC /usr/local/share/asn1c) target_link_libraries (test_epc_play_scenario - -Wl,--start-group RRC_LIB S1AP_LIB X2AP_LIB X2AP_ENB M3AP_LIB M3AP_ENB F1AP_LIB F1AP GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT MME_APP SCHED_LIB PHY_NR_COMMON PHY_COMMON PHY PHY_UE LFDS ITTI -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${LIBXSLT_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${CONFIG_LIB} + -Wl,--start-group RRC_LIB S1AP_LIB X2AP_LIB X2AP_ENB M3AP_LIB M3AP_ENB F1AP_LIB F1AP GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT MME_APP SCHED_LIB PHY_NR_COMMON PHY_COMMON PHY PHY_UE LFDS ITTI -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${LIBXSLT_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} CONFIG_LIB ) @@ -3251,7 +3168,7 @@ foreach(myExe s1ap ${OPENAIR3_DIR}/TEST/test_${myExe}.c ) target_link_libraries (test_${myExe} - -Wl,--start-group SECU_CN UTIL LFDS -Wl,--end-group m rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${CONFIG_LIB} + -Wl,--start-group SECU_CN UTIL LFDS -Wl,--end-group m rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} CONFIG_LIB ) endforeach(myExe) @@ -3370,16 +3287,12 @@ add_executable(nr-ittisim ${OPENAIR2_DIR}/RRC/NAS/rb_config.c ${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c ${OPENAIR3_DIR}/NAS/UE/nas_ue_task.c - ${OPENAIR_DIR}/common/utils/utils.c - ${OPENAIR_DIR}/common/utils/system.c ${OPENAIR_DIR}/common/utils/nr/nr_common.c - ${OPENAIR_DIR}/common/utils/threadPool/thread-pool.c ${OPENAIR_DIR}/common/utils/lte/ue_power.c ${OPENAIR_DIR}/common/utils/lte/prach_utils.c ${OPENAIR2_DIR}/ENB_APP/flexran_agent_ran_api_to_fix.c ${XFORMSINTERFACE_SOURCE} ${T_SOURCE} - ${CONFIG_SOURCES} ${SHLIB_LOADER_SOURCES} ) @@ -3393,7 +3306,7 @@ target_link_libraries (nr-ittisim -Wl,--end-group z dl) target_link_libraries (nr-ittisim ${LIBXML2_LIBRARIES}) -target_link_libraries (nr-ittisim pthread m ${CONFIG_LIB} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} sctp ${XFORMS_LIBRARIES} ${PROTOBUF_LIB} ${CMAKE_DL_LIBS} ${LIBYAML_LIBRARIES} ${ATLAS_LIBRARIES}) +target_link_libraries (nr-ittisim pthread m CONFIG_LIB rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} sctp ${XFORMS_LIBRARIES} ${PROTOBUF_LIB} ${CMAKE_DL_LIBS} ${LIBYAML_LIBRARIES} ${ATLAS_LIBRARIES}) target_link_libraries (nr-ittisim ${LIB_LMS_LIBRARIES}) target_link_libraries (nr-ittisim ${T_LIB}) From 8419166fc47252040de44ad335bea3b30e59960b Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Fri, 25 Feb 2022 16:52:49 +0100 Subject: [PATCH 59/96] Move time_meas.{c,h} to common/utils/ --- cmake_targets/CMakeLists.txt | 4 +--- {openair1/PHY/TOOLS => common/utils}/time_meas.c | 0 {openair1/PHY/TOOLS => common/utils}/time_meas.h | 0 executables/nr-softmodem.c | 2 -- executables/nr-uesoftmodem.c | 1 - openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_types.h | 2 +- openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder2.c | 2 +- openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder_optim.c | 2 +- openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder_optim8seg.c | 2 +- .../PHY/CODING/nrLDPC_encoder/ldpc_encoder_optim8segmulti.c | 2 +- openair1/PHY/defs_L1_NB_IoT.h | 2 +- openair1/PHY/defs_RU.h | 2 +- openair1/PHY/defs_UE.h | 2 +- openair1/PHY/defs_common.h | 2 +- openair1/PHY/defs_eNB.h | 4 ++-- openair1/PHY/defs_nr_UE.h | 2 +- openair2/LAYER2/MAC/mac.h | 2 +- openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h | 2 +- targets/RT/USER/lte-ru.c | 1 - targets/RT/USER/lte-softmodem.c | 1 - 20 files changed, 15 insertions(+), 22 deletions(-) rename {openair1/PHY/TOOLS => common/utils}/time_meas.c (100%) rename {openair1/PHY/TOOLS => common/utils}/time_meas.h (100%) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index ad5594d393..742dfa67fe 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -1276,6 +1276,7 @@ add_library(UTIL ${OPENAIR_DIR}/common/utils/utils.c ${OPENAIR_DIR}/common/utils/system.c ${OPENAIR_DIR}/common/utils/backtrace.c + ${OPENAIR_DIR}/common/utils/time_meas.c ) set(SECU_OSA_SRC @@ -1539,7 +1540,6 @@ set(PHY_SRC_COMMON ${OPENAIR1_DIR}/PHY/TOOLS/signal_energy.c ${OPENAIR1_DIR}/PHY/TOOLS/dB_routines.c ${OPENAIR1_DIR}/PHY/TOOLS/sqrt.c - ${OPENAIR1_DIR}/PHY/TOOLS/time_meas.c ${OPENAIR1_DIR}/PHY/TOOLS/lut.c ) @@ -1676,7 +1676,6 @@ set(PHY_SRC_UE ${OPENAIR1_DIR}/PHY/TOOLS/signal_energy.c ${OPENAIR1_DIR}/PHY/TOOLS/dB_routines.c ${OPENAIR1_DIR}/PHY/TOOLS/sqrt.c - ${OPENAIR1_DIR}/PHY/TOOLS/time_meas.c ${OPENAIR1_DIR}/PHY/TOOLS/lut.c ${PHY_POLARSRC} ${PHY_SMALLBLOCKSRC} @@ -1730,7 +1729,6 @@ set(PHY_SRC_UE ${OPENAIR1_DIR}/PHY/TOOLS/signal_energy.c ${OPENAIR1_DIR}/PHY/TOOLS/dB_routines.c ${OPENAIR1_DIR}/PHY/TOOLS/sqrt.c - ${OPENAIR1_DIR}/PHY/TOOLS/time_meas.c ${OPENAIR1_DIR}/PHY/TOOLS/lut.c ${OPENAIR1_DIR}/PHY/INIT/nr_init_ue.c # ${OPENAIR1_DIR}/SIMULATION/NR_UE_PHY/unit_tests/src/pucch_uci_test.c diff --git a/openair1/PHY/TOOLS/time_meas.c b/common/utils/time_meas.c similarity index 100% rename from openair1/PHY/TOOLS/time_meas.c rename to common/utils/time_meas.c diff --git a/openair1/PHY/TOOLS/time_meas.h b/common/utils/time_meas.h similarity index 100% rename from openair1/PHY/TOOLS/time_meas.h rename to common/utils/time_meas.h diff --git a/executables/nr-softmodem.c b/executables/nr-softmodem.c index 7410e303b1..551e22d19f 100644 --- a/executables/nr-softmodem.c +++ b/executables/nr-softmodem.c @@ -62,8 +62,6 @@ unsigned short config_frames[4] = {2,9,11,13}; #include "common/utils/LOG/vcd_signal_dumper.h" #include "UTIL/OPT/opt.h" -//#include "PHY/TOOLS/time_meas.h" - #include "intertask_interface.h" #include "PHY/INIT/phy_init.h" diff --git a/executables/nr-uesoftmodem.c b/executables/nr-uesoftmodem.c index 7663e9ebd8..76c21bb422 100644 --- a/executables/nr-uesoftmodem.c +++ b/executables/nr-uesoftmodem.c @@ -61,7 +61,6 @@ unsigned short config_frames[4] = {2,9,11,13}; #include "UTIL/OPT/opt.h" #include "enb_config.h" -//#include "PHY/TOOLS/time_meas.h" #include "intertask_interface.h" diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_types.h b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_types.h index 99b6f75f93..b7b15b5d33 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_types.h +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_types.h @@ -31,7 +31,7 @@ #ifndef __NR_LDPC_TYPES__H__ #define __NR_LDPC_TYPES__H__ -#include "PHY/TOOLS/time_meas.h" +#include "time_meas.h" #include "nrLDPCdecoder_defs.h" // ============================================================================== // TYPES diff --git a/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder2.c b/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder2.c index bef5b291dc..73c165a2c8 100644 --- a/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder2.c +++ b/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder2.c @@ -36,7 +36,7 @@ #include #include "assertions.h" #include "common/utils/LOG/log.h" -#include "PHY/TOOLS/time_meas.h" +#include "time_meas.h" #include "defs.h" #include "ldpc384_byte.c" diff --git a/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder_optim.c b/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder_optim.c index 0537d0c1ef..d05ced18c6 100644 --- a/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder_optim.c +++ b/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder_optim.c @@ -35,7 +35,7 @@ #include #include "assertions.h" #include "common/utils/LOG/log.h" -#include "PHY/TOOLS/time_meas.h" +#include "time_meas.h" #include "openair1/PHY/CODING/nrLDPC_defs.h" #include "ldpc_encode_parity_check.c" #include "ldpc_generate_coefficient.c" diff --git a/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder_optim8seg.c b/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder_optim8seg.c index 5fa7a9e125..958ef5aca7 100644 --- a/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder_optim8seg.c +++ b/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder_optim8seg.c @@ -35,7 +35,7 @@ #include #include "assertions.h" #include "common/utils/LOG/log.h" -#include "PHY/TOOLS/time_meas.h" +#include "time_meas.h" #include "openair1/PHY/CODING/nrLDPC_defs.h" #include "ldpc_encode_parity_check.c" #include "ldpc_generate_coefficient.c" diff --git a/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder_optim8segmulti.c b/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder_optim8segmulti.c index 5b8c5cb205..9ef8cbfe65 100644 --- a/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder_optim8segmulti.c +++ b/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder_optim8segmulti.c @@ -35,7 +35,7 @@ #include #include "assertions.h" #include "common/utils/LOG/log.h" -#include "PHY/TOOLS/time_meas.h" +#include "time_meas.h" #include "openair1/PHY/CODING/nrLDPC_defs.h" #include "ldpc_encode_parity_check.c" diff --git a/openair1/PHY/defs_L1_NB_IoT.h b/openair1/PHY/defs_L1_NB_IoT.h index 51b7c63b72..b4aee78310 100644 --- a/openair1/PHY/defs_L1_NB_IoT.h +++ b/openair1/PHY/defs_L1_NB_IoT.h @@ -122,7 +122,7 @@ static inline void* malloc16_clear( size_t size ) #include "PHY/impl_defs_top_NB_IoT.h" #include "PHY/impl_defs_lte_NB_IoT.h" -#include "PHY/TOOLS/time_meas.h" +#include "time_meas.h" //#include "PHY/CODING/defs.h" #include "PHY/CODING/defs_NB_IoT.h" #include "openair2/PHY_INTERFACE/IF_Module_NB_IoT.h" diff --git a/openair1/PHY/defs_RU.h b/openair1/PHY/defs_RU.h index 76dd92ef5d..6b18e55c4b 100644 --- a/openair1/PHY/defs_RU.h +++ b/openair1/PHY/defs_RU.h @@ -36,7 +36,7 @@ #include "common_lib.h" #include "openairinterface5g_limits.h" -#include "PHY/TOOLS/time_meas.h" +#include "time_meas.h" #include "defs_common.h" #include "nfapi_nr_interface_scf.h" diff --git a/openair1/PHY/defs_UE.h b/openair1/PHY/defs_UE.h index 06aad301ca..fa55384093 100644 --- a/openair1/PHY/defs_UE.h +++ b/openair1/PHY/defs_UE.h @@ -59,7 +59,7 @@ #include "defs_common.h" #include "impl_defs_top.h" -#include "PHY/TOOLS/time_meas.h" +#include "time_meas.h" #include "PHY/CODING/coding_defs.h" #include "PHY/TOOLS/tools_defs.h" #include "platform_types.h" diff --git a/openair1/PHY/defs_common.h b/openair1/PHY/defs_common.h index c79530434a..86df85db5c 100644 --- a/openair1/PHY/defs_common.h +++ b/openair1/PHY/defs_common.h @@ -58,7 +58,7 @@ #include "assertions.h" //#include -#include "PHY/TOOLS/time_meas.h" +#include "time_meas.h" #include "platform_types.h" #define MAX_NUM_RU_PER_eNB 64 diff --git a/openair1/PHY/defs_eNB.h b/openair1/PHY/defs_eNB.h index 995a4a934e..3a48dc51d6 100644 --- a/openair1/PHY/defs_eNB.h +++ b/openair1/PHY/defs_eNB.h @@ -58,7 +58,7 @@ #include "defs_common.h" #include "defs_RU.h" #include "impl_defs_top.h" -#include "PHY/TOOLS/time_meas.h" +#include "time_meas.h" //#include "PHY/CODING/coding_defs.h" #include "PHY/TOOLS/tools_defs.h" #include "platform_types.h" @@ -202,7 +202,7 @@ typedef struct { int repetition_number[4]; } LTE_eNB_PRACH; -#include "PHY/TOOLS/time_meas.h" +#include "time_meas.h" #include "PHY/CODING/coding_defs.h" #include "PHY/TOOLS/tools_defs.h" #include "PHY/LTE_TRANSPORT/transport_eNB.h" diff --git a/openair1/PHY/defs_nr_UE.h b/openair1/PHY/defs_nr_UE.h index 0fa839f104..72755374ce 100644 --- a/openair1/PHY/defs_nr_UE.h +++ b/openair1/PHY/defs_nr_UE.h @@ -96,7 +96,7 @@ #include "impl_defs_top.h" #include "impl_defs_nr.h" -#include "PHY/TOOLS/time_meas.h" +#include "time_meas.h" #include "PHY/CODING/coding_defs.h" #include "PHY/TOOLS/tools_defs.h" #include "platform_types.h" diff --git a/openair2/LAYER2/MAC/mac.h b/openair2/LAYER2/MAC/mac.h index cb93c2feb8..6637d05a8a 100644 --- a/openair2/LAYER2/MAC/mac.h +++ b/openair2/LAYER2/MAC/mac.h @@ -69,7 +69,7 @@ #include "nfapi_interface.h" #include "PHY_INTERFACE/IF_Module.h" -#include "PHY/TOOLS/time_meas.h" +#include "time_meas.h" #include "PHY/defs_common.h" // for PRACH_RESOURCES_t #include "PHY/LTE_TRANSPORT/transport_common.h" diff --git a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h index 22a0932c3f..be7a58154d 100644 --- a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h +++ b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h @@ -55,7 +55,7 @@ /* PHY */ #include "PHY/defs_gNB.h" -#include "PHY/TOOLS/time_meas.h" +#include "time_meas.h" /* Interface */ #include "nfapi_nr_interface_scf.h" diff --git a/targets/RT/USER/lte-ru.c b/targets/RT/USER/lte-ru.c index 15b4319260..7e897c7deb 100644 --- a/targets/RT/USER/lte-ru.c +++ b/targets/RT/USER/lte-ru.c @@ -61,7 +61,6 @@ #include "common/utils/LOG/vcd_signal_dumper.h" #include "targets/ARCH/COMMON/common_lib.h" #include "targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h" -//#include "PHY/TOOLS/time_meas.h" /* these variables have to be defined before including ENB_APP/enb_paramdef.h */ static int DEFBANDS[] = {7}; diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index 61e2982626..07f900b641 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -75,7 +75,6 @@ unsigned short config_frames[4] = {2,9,11,13}; #include "common/utils/LOG/vcd_signal_dumper.h" #include "UTIL/OPT/opt.h" #include "enb_config.h" -//#include "PHY/TOOLS/time_meas.h" #include "create_tasks.h" From 7d70d45d13f09d38973b2abefd59fe41fff2da3d Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Fri, 25 Feb 2022 16:55:48 +0100 Subject: [PATCH 60/96] Remove dead code --- ci-scripts/cppcheck_suppressions.list | 4 - cmake_targets/CMakeLists.txt | 32 - .../attach_complete.pdml | 4242 ---------------- .../enb.band7.tm1.usrpb210.epc.local.conf | 162 - .../TEST_1MME_1ENB_1UE_ATTACH_GUTI/enb1.conf | 159 - .../TEST_1MME_1ENB_1UE_ATTACH_GUTI/trace.pdml | 4411 ----------------- openair3/TEST/EPC_TEST/generate_scenario.c | 684 --- openair3/TEST/EPC_TEST/generate_scenario.h | 119 - openair3/TEST/EPC_TEST/play_scenario.c | 1240 ----- openair3/TEST/EPC_TEST/play_scenario.h | 499 -- openair3/TEST/EPC_TEST/play_scenario_decode.c | 68 - .../TEST/EPC_TEST/play_scenario_display.c | 348 -- openair3/TEST/EPC_TEST/play_scenario_fsm.c | 586 --- openair3/TEST/EPC_TEST/play_scenario_parse.c | 592 --- openair3/TEST/EPC_TEST/play_scenario_s1ap.c | 1168 ----- .../EPC_TEST/play_scenario_s1ap_compare_ie.c | 231 - .../EPC_TEST/play_scenario_s1ap_eNB_defs.h | 242 - openair3/TEST/EPC_TEST/play_scenario_sctp.c | 112 - openair3/TEST/oaisim_mme_client_test.c | 122 - openair3/TEST/oaisim_mme_itti_test.c | 93 - openair3/TEST/oaisim_mme_list_benchmark.c | 261 - openair3/TEST/oaisim_mme_s1ap_test.c | 179 - openair3/TEST/oaisim_mme_sctp_test.c | 74 - openair3/TEST/oaisim_mme_test_s1c.c | 339 -- openair3/TEST/oaisim_mme_test_s1c.h | 30 - openair3/TEST/oaisim_mme_test_s1c_s1ap.c | 291 -- openair3/TEST/oaisim_mme_test_s1c_s1ap.h | 60 - openair3/TEST/oaisim_mme_test_s1c_scenario.c | 279 -- openair3/TEST/oaisim_mme_test_s1c_scenario.h | 56 - openair3/TEST/oaisim_mme_test_s1c_scenario1.c | 181 - 30 files changed, 16864 deletions(-) delete mode 100644 openair3/TEST/EPC_TEST/TEST_1MME_1ENB_1UE_ATTACH_GUTI/attach_complete.pdml delete mode 100644 openair3/TEST/EPC_TEST/TEST_1MME_1ENB_1UE_ATTACH_GUTI/enb.band7.tm1.usrpb210.epc.local.conf delete mode 100644 openair3/TEST/EPC_TEST/TEST_1MME_1ENB_1UE_ATTACH_GUTI/enb1.conf delete mode 100644 openair3/TEST/EPC_TEST/TEST_1MME_1ENB_1UE_ATTACH_GUTI/trace.pdml delete mode 100644 openair3/TEST/EPC_TEST/generate_scenario.c delete mode 100644 openair3/TEST/EPC_TEST/generate_scenario.h delete mode 100644 openair3/TEST/EPC_TEST/play_scenario.c delete mode 100644 openair3/TEST/EPC_TEST/play_scenario.h delete mode 100644 openair3/TEST/EPC_TEST/play_scenario_decode.c delete mode 100644 openair3/TEST/EPC_TEST/play_scenario_display.c delete mode 100644 openair3/TEST/EPC_TEST/play_scenario_fsm.c delete mode 100644 openair3/TEST/EPC_TEST/play_scenario_parse.c delete mode 100644 openair3/TEST/EPC_TEST/play_scenario_s1ap.c delete mode 100644 openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c delete mode 100644 openair3/TEST/EPC_TEST/play_scenario_s1ap_eNB_defs.h delete mode 100644 openair3/TEST/EPC_TEST/play_scenario_sctp.c delete mode 100644 openair3/TEST/oaisim_mme_client_test.c delete mode 100644 openair3/TEST/oaisim_mme_itti_test.c delete mode 100644 openair3/TEST/oaisim_mme_list_benchmark.c delete mode 100644 openair3/TEST/oaisim_mme_s1ap_test.c delete mode 100644 openair3/TEST/oaisim_mme_sctp_test.c delete mode 100644 openair3/TEST/oaisim_mme_test_s1c.c delete mode 100644 openair3/TEST/oaisim_mme_test_s1c.h delete mode 100644 openair3/TEST/oaisim_mme_test_s1c_s1ap.c delete mode 100644 openair3/TEST/oaisim_mme_test_s1c_s1ap.h delete mode 100644 openair3/TEST/oaisim_mme_test_s1c_scenario.c delete mode 100644 openair3/TEST/oaisim_mme_test_s1c_scenario.h delete mode 100644 openair3/TEST/oaisim_mme_test_s1c_scenario1.c diff --git a/ci-scripts/cppcheck_suppressions.list b/ci-scripts/cppcheck_suppressions.list index f8438a4276..ff4cac20b3 100644 --- a/ci-scripts/cppcheck_suppressions.list +++ b/ci-scripts/cppcheck_suppressions.list @@ -50,10 +50,6 @@ memleak:openair1/PHY/CODING/TESTBENCH/ltetest.c invalidPrintfArgType_sint:openair1/PHY/CODING/TESTBENCH/pdcch_test.c // //----------------------------------------------------------------------------- -// oaisim deprecated, remove? -doubleFree:openair3/TEST/oaisim_mme_list_benchmark.c -// -//----------------------------------------------------------------------------- // is itti analyzer deprecated nullPointer:common/utils/itti_analyzer/itti_analyzer.c nullPointerRedundantCheck:common/utils/itti_analyzer/libbuffers/buffers.c diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 742dfa67fe..d3041f9112 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -3118,38 +3118,6 @@ foreach(myExe dlsim dlsim_tm7 ulsim pbchsim scansim mbmssim pdcchsim pucchsim pr endforeach(myExe) -add_executable(test_epc_generate_scenario - ${OPENAIR3_DIR}/TEST/EPC_TEST/generate_scenario.c - ${OPENAIR3_DIR}/TEST/EPC_TEST/generate_scenario.h - ${OPENAIR2_DIR}/ENB_APP/enb_config.h - ${OPENAIR2_DIR}/COMMON/commonDef.h - ${OPENAIR2_DIR}/COMMON/messages_def.h - ${OPENAIR3_DIR}/S1AP/s1ap_eNB_defs.h - ) -target_link_libraries (test_epc_generate_scenario - -Wl,--start-group RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB X2AP_ENB M2AP_LIB M2AP_ENB M3AP_LIB M3AP_ENB F1AP_LIB F1AP GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT MME_APP SCHED_LIB PHY LFDS ITTI L2 -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${LIBXSLT_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} CONFIG_LIB - ) - -add_executable(test_epc_play_scenario - ${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario.c - ${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario_decode.c - ${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario_display.c - ${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario_fsm.c - ${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario_parse.c - ${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario_s1ap.c - ${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c - ${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario_s1ap_eNB_defs.h - ${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario_sctp.c - ${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario.h - ${OPENAIR2_DIR}/COMMON/commonDef.h - ${OPENAIR2_DIR}/COMMON/messages_def.h - ) -target_include_directories(test_epc_play_scenario PUBLIC /usr/local/share/asn1c) -target_link_libraries (test_epc_play_scenario - -Wl,--start-group RRC_LIB S1AP_LIB X2AP_LIB X2AP_ENB M3AP_LIB M3AP_ENB F1AP_LIB F1AP GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT MME_APP SCHED_LIB PHY_NR_COMMON PHY_COMMON PHY PHY_UE LFDS ITTI -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${LIBXSLT_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} CONFIG_LIB - ) - - #unitary tests for Core NEtwork pieces ################################# foreach(myExe s1ap diff --git a/openair3/TEST/EPC_TEST/TEST_1MME_1ENB_1UE_ATTACH_GUTI/attach_complete.pdml b/openair3/TEST/EPC_TEST/TEST_1MME_1ENB_1UE_ATTACH_GUTI/attach_complete.pdml deleted file mode 100644 index f7c27272aa..0000000000 --- a/openair3/TEST/EPC_TEST/TEST_1MME_1ENB_1UE_ATTACH_GUTI/attach_complete.pdml +++ /dev/null @@ -1,4242 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/openair3/TEST/EPC_TEST/TEST_1MME_1ENB_1UE_ATTACH_GUTI/enb.band7.tm1.usrpb210.epc.local.conf b/openair3/TEST/EPC_TEST/TEST_1MME_1ENB_1UE_ATTACH_GUTI/enb.band7.tm1.usrpb210.epc.local.conf deleted file mode 100644 index ad6c81f56b..0000000000 --- a/openair3/TEST/EPC_TEST/TEST_1MME_1ENB_1UE_ATTACH_GUTI/enb.band7.tm1.usrpb210.epc.local.conf +++ /dev/null @@ -1,162 +0,0 @@ -Active_eNBs = ( "eNB_Eurecom_LTEBox"); -# Asn1_verbosity, choice in: none, info, annoying -Asn1_verbosity = "none"; - -eNBs = -( - { - ////////// Identification parameters: - eNB_ID = 0xe00; - - cell_type = "CELL_MACRO_ENB"; - - eNB_name = "eNB_Eurecom_LTEBox"; - - // Tracking area code, 0x0000 and 0xfffe are reserved values - tracking_area_code = 1; - plmn_list = ( { mcc = 208; mnc = 95; mnc_length = 2; } ); - - ////////// Physical parameters: - - component_carriers = ( - { - frame_type = "FDD"; - tdd_config = 3; - tdd_config_s = 0; - prefix_type = "NORMAL"; - eutra_band = 7; - downlink_frequency = 2660000000L; - uplink_frequency_offset = -120000000; - Nid_cell = 0; - N_RB_DL = 25; - Nid_cell_mbsfn = 0; - nb_antennas_tx = 1; - nb_antennas_rx = 1; - tx_gain = 90; - rx_gain = 120; - prach_root = 0; - prach_config_index = 0; - prach_high_speed = "DISABLE"; - prach_zero_correlation = 1; - prach_freq_offset = 2; - pucch_delta_shift = 1; - pucch_nRB_CQI = 1; - pucch_nCS_AN = 0; - pucch_n1_AN = 0; - pdsch_referenceSignalPower = -26; - pdsch_p_b = 0; - pusch_n_SB = 1; - pusch_enable64QAM = "DISABLE"; - pusch_hoppingMode = "interSubFrame"; - pusch_hoppingOffset = 0; - pusch_groupHoppingEnabled = "ENABLE"; - pusch_groupAssignment = 0; - pusch_sequenceHoppingEnabled = "DISABLE"; - pusch_nDMRS1 = 1; - phich_duration = "NORMAL"; - phich_resource = "ONESIXTH"; - srs_enable = "DISABLE"; - /* srs_BandwidthConfig =; - srs_SubframeConfig =; - srs_ackNackST =; - srs_MaxUpPts =;*/ - - pusch_p0_Nominal = -90; - pusch_alpha = "AL1"; - pucch_p0_Nominal = -108; - msg3_delta_Preamble = 6; - pucch_deltaF_Format1 = "deltaF2"; - pucch_deltaF_Format1b = "deltaF3"; - pucch_deltaF_Format2 = "deltaF0"; - pucch_deltaF_Format2a = "deltaF0"; - pucch_deltaF_Format2b = "deltaF0"; - - rach_numberOfRA_Preambles = 64; - rach_preamblesGroupAConfig = "DISABLE"; - /* - rach_sizeOfRA_PreamblesGroupA = ; - rach_messageSizeGroupA = ; - rach_messagePowerOffsetGroupB = ; - */ - rach_powerRampingStep = 4; - rach_preambleInitialReceivedTargetPower = -108; - rach_preambleTransMax = 10; - rach_raResponseWindowSize = 10; - rach_macContentionResolutionTimer = 48; - rach_maxHARQ_Msg3Tx = 4; - - pcch_default_PagingCycle = 128; - pcch_nB = "oneT"; - bcch_modificationPeriodCoeff = 2; - ue_TimersAndConstants_t300 = 1000; - ue_TimersAndConstants_t301 = 1000; - ue_TimersAndConstants_t310 = 1000; - ue_TimersAndConstants_t311 = 10000; - ue_TimersAndConstants_n310 = 20; - ue_TimersAndConstants_n311 = 1; - } - ); - - srb1_parameters : - { - # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] - timer_poll_retransmit = 80; - - # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] - timer_reordering = 35; - - # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] - timer_status_prohibit = 0; - - # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] - poll_pdu = 4; - - # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] - poll_byte = 99999; - - # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] - max_retx_threshold = 4; - } - - # ------- SCTP definitions - SCTP : - { - # Number of streams to use in input/output - SCTP_INSTREAMS = 2; - SCTP_OUTSTREAMS = 2; - }; - - - ////////// MME parameters: - mme_ip_address = ( { ipv4 = "192.188.2.2"; - ipv6 = "192:168:30::17"; - active = "yes"; - preference = "ipv4"; - } - ); - - NETWORK_INTERFACES : - { - ENB_INTERFACE_NAME_FOR_S1_MME = "tun2"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.188.2.2/24"; - - ENB_INTERFACE_NAME_FOR_S1U = "lo"; - ENB_IPV4_ADDRESS_FOR_S1U = "127.0.0.1/24"; - ENB_PORT_FOR_S1U = 2153; # Spec 2152 - }; - - log_config : - { - global_log_level ="info"; - hw_log_level ="info"; - phy_log_level ="info"; - mac_log_level ="info"; - rlc_log_level ="info"; - pdcp_log_level ="info"; - rrc_log_level ="info"; - gtpu_log_level ="info"; - udp_log_level ="info"; - }; - - } -); diff --git a/openair3/TEST/EPC_TEST/TEST_1MME_1ENB_1UE_ATTACH_GUTI/enb1.conf b/openair3/TEST/EPC_TEST/TEST_1MME_1ENB_1UE_ATTACH_GUTI/enb1.conf deleted file mode 100644 index 9ffed9c5fe..0000000000 --- a/openair3/TEST/EPC_TEST/TEST_1MME_1ENB_1UE_ATTACH_GUTI/enb1.conf +++ /dev/null @@ -1,159 +0,0 @@ -Active_eNBs = ( "eNB_Eurecom_LTEBox"); -# Asn1_verbosity, choice in: none, info, annoying -Asn1_verbosity = "none"; - -eNBs = -( - { - ////////// Identification parameters: - eNB_ID = 0xe00; - - cell_type = "CELL_MACRO_ENB"; - - eNB_name = "eNB_Eurecom_LTEBox"; - - // Tracking area code, 0x0000 and 0xfffe are reserved values - tracking_area_code = 1; - plmn_list = ( { mcc = 208; mnc = 95; mnc_length = 2; } ); - - ////////// Physical parameters: - - component_carriers = ( - { - frame_type = "FDD"; - tdd_config = 3; - tdd_config_s = 0; - prefix_type = "NORMAL"; - eutra_band = 7; - downlink_frequency = 2660000000L; - uplink_frequency_offset = -120000000; - Nid_cell = 0; - N_RB_DL = 25; - Nid_cell_mbsfn = 0; - nb_antennas_tx = 1; - nb_antennas_rx = 1; - tx_gain = 90; - rx_gain = 120; - prach_root = 0; - prach_config_index = 0; - prach_high_speed = "DISABLE"; - prach_zero_correlation = 1; - prach_freq_offset = 2; - pucch_delta_shift = 1; - pucch_nRB_CQI = 1; - pucch_nCS_AN = 0; - pucch_n1_AN = 0; - pdsch_referenceSignalPower = -26; - pdsch_p_b = 0; - pusch_n_SB = 1; - pusch_enable64QAM = "DISABLE"; - pusch_hoppingMode = "interSubFrame"; - pusch_hoppingOffset = 0; - pusch_groupHoppingEnabled = "ENABLE"; - pusch_groupAssignment = 0; - pusch_sequenceHoppingEnabled = "DISABLE"; - pusch_nDMRS1 = 1; - phich_duration = "NORMAL"; - phich_resource = "ONESIXTH"; - srs_enable = "DISABLE"; - /* srs_BandwidthConfig =; - srs_SubframeConfig =; - srs_ackNackST =; - srs_MaxUpPts =;*/ - - pusch_p0_Nominal = -90; - pusch_alpha = "AL1"; - pucch_p0_Nominal = -108; - msg3_delta_Preamble = 6; - pucch_deltaF_Format1 = "deltaF2"; - pucch_deltaF_Format1b = "deltaF3"; - pucch_deltaF_Format2 = "deltaF0"; - pucch_deltaF_Format2a = "deltaF0"; - pucch_deltaF_Format2b = "deltaF0"; - - rach_numberOfRA_Preambles = 64; - rach_preamblesGroupAConfig = "DISABLE"; - /* - rach_sizeOfRA_PreamblesGroupA = ; - rach_messageSizeGroupA = ; - rach_messagePowerOffsetGroupB = ; - */ - rach_powerRampingStep = 4; - rach_preambleInitialReceivedTargetPower = -108; - rach_preambleTransMax = 10; - rach_raResponseWindowSize = 10; - rach_macContentionResolutionTimer = 48; - rach_maxHARQ_Msg3Tx = 4; - - pcch_default_PagingCycle = 128; - pcch_nB = "oneT"; - bcch_modificationPeriodCoeff = 2; - ue_TimersAndConstants_t300 = 1000; - ue_TimersAndConstants_t301 = 1000; - ue_TimersAndConstants_t310 = 1000; - ue_TimersAndConstants_t311 = 10000; - ue_TimersAndConstants_n310 = 20; - ue_TimersAndConstants_n311 = 1; - } - ); - - - srb1_parameters : - { - # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] - timer_poll_retransmit = 80; - - # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] - timer_reordering = 35; - - # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] - timer_status_prohibit = 0; - - # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] - poll_pdu = 4; - - # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] - poll_byte = 99999; - - # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] - max_retx_threshold = 4; - } - - # ------- SCTP definitions - SCTP : - { - # Number of streams to use in input/output - SCTP_INSTREAMS = 2; - SCTP_OUTSTREAMS = 2; - }; - - ////////// MME parameters: - mme_ip_address = ( { ipv4 = "192.168.12.17"; - ipv6 = "192:168:30::17"; - active = "yes"; - preference = "ipv4"; - } - ); - - NETWORK_INTERFACES : - { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.213/24"; - - ENB_INTERFACE_NAME_FOR_S1U = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.213/24"; - ENB_PORT_FOR_S1U = 2152; # Spec 2152 - }; - - log_config : - { - global_log_level ="debug"; - hw_log_level ="info"; - phy_log_level ="info"; - rlc_log_level ="info"; - pdcp_log_level ="info"; - rrc_log_level ="info"; - }; - - } -); diff --git a/openair3/TEST/EPC_TEST/TEST_1MME_1ENB_1UE_ATTACH_GUTI/trace.pdml b/openair3/TEST/EPC_TEST/TEST_1MME_1ENB_1UE_ATTACH_GUTI/trace.pdml deleted file mode 100644 index d2d2598de6..0000000000 --- a/openair3/TEST/EPC_TEST/TEST_1MME_1ENB_1UE_ATTACH_GUTI/trace.pdml +++ /dev/null @@ -1,4411 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/openair3/TEST/EPC_TEST/generate_scenario.c b/openair3/TEST/EPC_TEST/generate_scenario.c deleted file mode 100644 index a8a3590945..0000000000 --- a/openair3/TEST/EPC_TEST/generate_scenario.c +++ /dev/null @@ -1,684 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.1 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -/* - generate_scenario.c - ------------------- - AUTHOR : Lionel GAUTHIER - COMPANY : EURECOM - EMAIL : Lionel.Gauthier@eurecom.fr - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "assertions.h" -#include "generate_scenario.h" -#include "s1ap_eNB.h" -#include "intertask_interface.h" - -#define ENB_CONFIG_STRING_ACTIVE_ENBS "Active_eNBs" - -#define ENB_CONFIG_STRING_ENB_LIST "eNBs" -#define ENB_CONFIG_STRING_ENB_ID "eNB_ID" -#define ENB_CONFIG_STRING_CELL_TYPE "cell_type" -#define ENB_CONFIG_STRING_ENB_NAME "eNB_name" - -#define ENB_CONFIG_STRING_TRACKING_AREA_CODE "tracking_area_code" -#define ENB_CONFIG_STRING_MOBILE_COUNTRY_CODE "mobile_country_code" -#define ENB_CONFIG_STRING_MOBILE_NETWORK_CODE "mobile_network_code" - - -#define ENB_CONFIG_STRING_MME_IP_ADDRESS "mme_ip_address" -#define ENB_CONFIG_STRING_MME_IPV4_ADDRESS "ipv4" -#define ENB_CONFIG_STRING_MME_IPV6_ADDRESS "ipv6" -#define ENB_CONFIG_STRING_MME_IP_ADDRESS_ACTIVE "active" -#define ENB_CONFIG_STRING_MME_IP_ADDRESS_PREFERENCE "preference" - -#define ENB_CONFIG_STRING_SCTP_CONFIG "SCTP" -#define ENB_CONFIG_STRING_SCTP_INSTREAMS "SCTP_INSTREAMS" -#define ENB_CONFIG_STRING_SCTP_OUTSTREAMS "SCTP_OUTSTREAMS" - -#define ENB_CONFIG_STRING_NETWORK_INTERFACES_CONFIG "NETWORK_INTERFACES" -#define ENB_CONFIG_STRING_ENB_INTERFACE_NAME_FOR_S1_MME "ENB_INTERFACE_NAME_FOR_S1_MME" -#define ENB_CONFIG_STRING_ENB_IPV4_ADDRESS_FOR_S1_MME "ENB_IPV4_ADDRESS_FOR_S1_MME" -#define ENB_CONFIG_STRING_ENB_INTERFACE_NAME_FOR_S1U "ENB_INTERFACE_NAME_FOR_S1U" -#define ENB_CONFIG_STRING_ENB_IPV4_ADDR_FOR_S1U "ENB_IPV4_ADDRESS_FOR_S1U" -#define ENB_CONFIG_STRING_ENB_PORT_FOR_S1U "ENB_PORT_FOR_S1U" - - -#define ENB_CONFIG_MAX_XSLT_PARAMS 32 - -Enb_properties_array_t g_enb_properties; -char *g_test_dir = NULL; -char *g_pdml_in_origin = NULL; -extern int xmlLoadExtDtdDefaultValue; - -#define GENERATE_PDML_FILE 1 -#define GENERATE_SCENARIO 2 - -#define GS_IS_FILE 1 -#define GS_IS_DIR 2 - -//------------------------------------------------------------------------------ -// test if file exist in current directory -int is_file_exists( const char const * file_nameP, const char const *file_roleP) -{ - struct stat s; - int err = stat(file_nameP, &s); - if(-1 == err) { - if(ENOENT == errno) { - fprintf(stderr, "Please provide a valid %s, %s does not exist\n", file_roleP, file_nameP); - } else { - perror("stat"); - exit(1); - } - } else { - if(S_ISREG(s.st_mode)) { - return GS_IS_FILE; - } else if(S_ISDIR(s.st_mode)) { - return GS_IS_DIR; - } else { - fprintf(stderr, "Please provide a valid test %s, %s exists but is not found valid\n", file_roleP, file_nameP); - } - } - return 0; -} - - -//------------------------------------------------------------------------------ -int strip_extension(char *in_filename) -{ - static const uint8_t name_min_len = 1; - static const uint8_t max_ext_len = 5; // .pdml ! - fprintf(stdout, "strip_extension %s\n", in_filename); - - if (NULL != in_filename) { - /* Check chars starting at end of string to find last '.' */ - for (ssize_t i = strlen(in_filename); i >= name_min_len; i--) { - if (in_filename[i] == '.') { - in_filename[i] = '\0'; - return i; - } - } - } - return -1; -} -//------------------------------------------------------------------------------ -// return number of splitted items -int split_path( char * pathP, char *** resP) -{ - char * saveptr1; - char * p = strtok_r (pathP, "/", &saveptr1); - int n_spaces = 0; - - /// split string and append tokens to 'res' - while (p) { - *resP = realloc (*resP, sizeof (char*) * ++n_spaces); - AssertFatal (*resP, "realloc failed"); - (*resP)[n_spaces-1] = p; - p = strtok_r (NULL, "/", &saveptr1); - } - return n_spaces; -} - -//------------------------------------------------------------------------------ -int generate_test_scenario(const char const * test_nameP, const char const * pdml_in_basenameP) -//------------------------------------------------------------------------------ -{ - //int fd_pdml_in; - xsltStylesheetPtr cur = NULL; - xmlDocPtr doc, res; - FILE *test_scenario_file = NULL; - const char test_scenario_filename[NAME_MAX]; - const char *params[2*ENB_CONFIG_MAX_XSLT_PARAMS]; - int nb_params = 0; - int i,j; - char astring[1024]; - char *astring2 = NULL; - struct in_addr addr; - - memset(test_scenario_filename, 0, sizeof(test_scenario_filename)); - memset(astring, 0, sizeof(astring)); - if (getcwd(astring, sizeof(astring)) != NULL) { - fprintf(stdout, "working in %s directory\n", astring); - } else { - perror("getcwd() error"); - exit(1); - } - - xmlSubstituteEntitiesDefault(1); - xmlLoadExtDtdDefaultValue = 1; - cur = xsltParseStylesheetFile("/usr/share/oai/xsl/generic_scenario.xsl"); - if (NULL == cur) { - AssertFatal (0, "Could not parse stylesheet file /usr/share/oai/xsl/generic_scenario.xsl!\n"); - } else { - fprintf(stdout, "XSLT style sheet: /usr/share/oai/xsl/generic_scenario.xsl\n"); - } - - doc = xmlParseFile(pdml_in_basenameP); - if (NULL == doc) { - AssertFatal (0, "Could not parse pdml file %s!\n", pdml_in_basenameP); - } else { - fprintf(stdout, "pdml file: %s\n", pdml_in_basenameP); - } - params[nb_params++] = "test_name"; - sprintf(astring, "%s", pdml_in_basenameP); - if (strip_extension(astring) > 0) { - astring2 = strdup(astring); - sprintf(astring, "\"%s\"", astring2); - free(astring2); - astring2 = NULL; - } else { - fprintf(stderr, "Assigning test name failed: %s\n", astring); - } - params[nb_params++] = strdup(astring); - - for (i = 0; i < g_enb_properties.number; i++) { - // eNB S1-C IPv4 address - sprintf(astring, "enb%d_s1c", i); - params[nb_params++] = strdup(astring); - addr.s_addr = g_enb_properties.properties[i]->enb_ipv4_address_for_S1_MME; - sprintf(astring, "\"%s\"", inet_ntoa(addr)); - params[nb_params++] = strdup(astring); - - // MME S1-C IPv4 address - for (j = 0; j < g_enb_properties.properties[i]->nb_mme; j++) { - sprintf(astring, "mme%d_s1c_%d", i, j); - params[nb_params++] = strdup(astring); - AssertFatal (g_enb_properties.properties[i]->mme_ip_address[j].ipv4_address, - "Only support MME IPv4 address\n"); - sprintf(astring, "\"%s\"", g_enb_properties.properties[i]->mme_ip_address[j].ipv4_address); - params[nb_params++] = strdup(astring); - } - } - params[nb_params] = NULL; - res = xsltApplyStylesheet(cur, doc, params); - if (NULL != res) { - // since pdml filename is not relative (no path), just filename in current directory we can safely remove - sprintf(test_scenario_filename,"%s",pdml_in_basenameP); - if (strip_extension(test_scenario_filename) > 0) { - strcat(test_scenario_filename, ".xml"); - test_scenario_file = fopen( test_scenario_filename, "w+"); - if (NULL != test_scenario_file) { - xsltSaveResultToFile(test_scenario_file, res, cur); - fclose(test_scenario_file); - fprintf(stdout, "Wrote test scenario to %s\n", test_scenario_filename); - } else { - fprintf(stderr, "Error in fopen(%s)\n", test_scenario_filename); - } - } else { - fprintf(stderr, "Error in strip_extension()\n"); - } - } else { - fprintf(stderr, "Error in xsltApplyStylesheet()\n"); - } - xsltFreeStylesheet(cur); - xmlFreeDoc(res); - xmlFreeDoc(doc); - - xsltCleanupGlobals(); - xmlCleanupParser(); -} - -//------------------------------------------------------------------------------ -static void enb_config_display(void) -//------------------------------------------------------------------------------ -{ - int i; - - printf( "\n----------------------------------------------------------------------\n"); - printf( " ENB CONFIG FILE CONTENT LOADED:\n"); - printf( "----------------------------------------------------------------------\n"); - for (i = 0; i < g_enb_properties.number; i++) { - printf( "ENB CONFIG for instance %d:\n\n", i); - printf( "\teNB name: \t%s\n",g_enb_properties.properties[i]->eNB_name); - printf( "\teNB ID: \t%"PRIu32"\n",g_enb_properties.properties[i]->eNB_id); - printf( "\tCell type: \t%s\n",g_enb_properties.properties[i]->cell_type == CELL_MACRO_ENB ? "CELL_MACRO_ENB":"CELL_HOME_ENB"); - printf( "\tTAC: \t%"PRIu16"\n",g_enb_properties.properties[i]->tac); - printf( "\tMCC: \t%"PRIu16"\n",g_enb_properties.properties[i]->mcc); - - if (g_enb_properties.properties[i]->mnc_digit_length == 3) { - printf( "\tMNC: \t%03"PRIu16"\n",g_enb_properties.properties[i]->mnc); - } else { - printf( "\tMNC: \t%02"PRIu16"\n",g_enb_properties.properties[i]->mnc); - } - printf( "\n--------------------------------------------------------\n"); - } -} - - -#ifdef LIBCONFIG_LONG -#define libconfig_int long -#else -#define libconfig_int int -#endif -//------------------------------------------------------------------------------ -void enb_config_init(const char const * lib_config_file_name_pP) -//------------------------------------------------------------------------------ -{ - config_t cfg; - config_setting_t *setting = NULL; - config_setting_t *subsetting = NULL; - config_setting_t *setting_mme_addresses = NULL; - config_setting_t *setting_mme_address = NULL; - config_setting_t *setting_enb = NULL; - int num_enb_properties = 0; - int enb_properties_index = 0; - int num_enbs = 0; - int num_mme_address = 0; - int i = 0; - int j = 0; - int parse_errors = 0; - libconfig_int enb_id = 0; - const char* cell_type = NULL; - const char* tac = 0; - const char* enb_name = NULL; - const char* mcc = 0; - const char* mnc = 0; - char* ipv4 = NULL; - char* ipv6 = NULL; - char* active = NULL; - char* preference = NULL; - const char* active_enb[EPC_TEST_SCENARIO_MAX_ENB]; - char* enb_interface_name_for_S1U = NULL; - char* enb_ipv4_address_for_S1U = NULL; - libconfig_int enb_port_for_S1U = 0; - char* enb_interface_name_for_S1_MME = NULL; - char* enb_ipv4_address_for_S1_MME = NULL; - char *address = NULL; - char *cidr = NULL; - - - AssertFatal (lib_config_file_name_pP != NULL, - "Bad parameter lib_config_file_name_pP %s , must reference a valid eNB config file\n", - lib_config_file_name_pP); - - memset((char*)active_enb, 0 , EPC_TEST_SCENARIO_MAX_ENB * sizeof(char*)); - - config_init(&cfg); - - /* Read the file. If there is an error, report it and exit. */ - if (! config_read_file(&cfg, lib_config_file_name_pP)) { - config_destroy(&cfg); - AssertFatal (0, "Failed to parse eNB configuration file %s!\n", lib_config_file_name_pP); - } - - // Get list of active eNBs, (only these will be configured) - setting = config_lookup(&cfg, ENB_CONFIG_STRING_ACTIVE_ENBS); - - if (setting != NULL) { - num_enbs = config_setting_length(setting); - - for (i = 0; i < num_enbs; i++) { - setting_enb = config_setting_get_elem(setting, i); - active_enb[i] = config_setting_get_string (setting_enb); - AssertFatal (active_enb[i] != NULL, - "Failed to parse config file %s, %dth attribute %s \n", - lib_config_file_name_pP, i, ENB_CONFIG_STRING_ACTIVE_ENBS); - active_enb[i] = strdup(active_enb[i]); - num_enb_properties += 1; - } - } - - /* Output a list of all eNBs. */ - setting = config_lookup(&cfg, ENB_CONFIG_STRING_ENB_LIST); - - if (setting != NULL) { - enb_properties_index = g_enb_properties.number; - parse_errors = 0; - num_enbs = config_setting_length(setting); - - for (i = 0; i < num_enbs; i++) { - setting_enb = config_setting_get_elem(setting, i); - - if (! config_setting_lookup_int(setting_enb, ENB_CONFIG_STRING_ENB_ID, &enb_id)) { - /* Calculate a default eNB ID */ -# if defined(ENABLE_USE_MME) - uint32_t hash; - - hash = s1ap_generate_eNB_id (); - enb_id = i + (hash & 0xFFFF8); -# else - enb_id = i; -# endif - } - - if ( !( config_setting_lookup_string(setting_enb, ENB_CONFIG_STRING_CELL_TYPE, &cell_type) - && config_setting_lookup_string(setting_enb, ENB_CONFIG_STRING_ENB_NAME, &enb_name) - && config_setting_lookup_string(setting_enb, ENB_CONFIG_STRING_TRACKING_AREA_CODE, &tac) - && config_setting_lookup_string(setting_enb, ENB_CONFIG_STRING_MOBILE_COUNTRY_CODE, &mcc) - && config_setting_lookup_string(setting_enb, ENB_CONFIG_STRING_MOBILE_NETWORK_CODE, &mnc) - - - ) - ) { - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, %d th enb\n", - lib_config_file_name_pP, i); - continue; // FIXME this prevents segfaults below, not sure what happens after function exit - } - - // search if in active list - for (j=0; j < num_enb_properties; j++) { - if (strcmp(active_enb[j], enb_name) == 0) { - g_enb_properties.properties[enb_properties_index] = calloc(1, sizeof(Enb_properties_t)); - - g_enb_properties.properties[enb_properties_index]->eNB_id = enb_id; - - if (strcmp(cell_type, "CELL_MACRO_ENB") == 0) { - g_enb_properties.properties[enb_properties_index]->cell_type = CELL_MACRO_ENB; - } else if (strcmp(cell_type, "CELL_HOME_ENB") == 0) { - g_enb_properties.properties[enb_properties_index]->cell_type = CELL_HOME_ENB; - } else { - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for cell_type choice: CELL_MACRO_ENB or CELL_HOME_ENB !\n", - lib_config_file_name_pP, i, cell_type); - } - - g_enb_properties.properties[enb_properties_index]->eNB_name = strdup(enb_name); - g_enb_properties.properties[enb_properties_index]->tac = (uint16_t)atoi(tac); - g_enb_properties.properties[enb_properties_index]->mcc = (uint16_t)atoi(mcc); - g_enb_properties.properties[enb_properties_index]->mnc = (uint16_t)atoi(mnc); - g_enb_properties.properties[enb_properties_index]->mnc_digit_length = strlen(mnc); - AssertFatal((g_enb_properties.properties[enb_properties_index]->mnc_digit_length == 2) || - (g_enb_properties.properties[enb_properties_index]->mnc_digit_length == 3), - "BAD MNC DIGIT LENGTH %d", - g_enb_properties.properties[i]->mnc_digit_length); - - - setting_mme_addresses = config_setting_get_member (setting_enb, ENB_CONFIG_STRING_MME_IP_ADDRESS); - num_mme_address = config_setting_length(setting_mme_addresses); - g_enb_properties.properties[enb_properties_index]->nb_mme = 0; - - for (j = 0; j < num_mme_address; j++) { - setting_mme_address = config_setting_get_elem(setting_mme_addresses, j); - - if ( !( - config_setting_lookup_string(setting_mme_address, ENB_CONFIG_STRING_MME_IPV4_ADDRESS, (const char **)&ipv4) - && config_setting_lookup_string(setting_mme_address, ENB_CONFIG_STRING_MME_IPV6_ADDRESS, (const char **)&ipv6) - && config_setting_lookup_string(setting_mme_address, ENB_CONFIG_STRING_MME_IP_ADDRESS_ACTIVE, (const char **)&active) - && config_setting_lookup_string(setting_mme_address, ENB_CONFIG_STRING_MME_IP_ADDRESS_PREFERENCE, (const char **)&preference) - ) - ) { - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, %d th enb %d th mme address !\n", - lib_config_file_name_pP, i, j); - continue; // FIXME will prevent segfaults below, not sure what happens at function exit... - } - - g_enb_properties.properties[enb_properties_index]->nb_mme += 1; - - g_enb_properties.properties[enb_properties_index]->mme_ip_address[j].ipv4_address = strdup(ipv4); - g_enb_properties.properties[enb_properties_index]->mme_ip_address[j].ipv6_address = strdup(ipv6); - - if (strcmp(active, "yes") == 0) { - g_enb_properties.properties[enb_properties_index]->mme_ip_address[j].active = 1; - } // else { (calloc) - - if (strcmp(preference, "ipv4") == 0) { - g_enb_properties.properties[enb_properties_index]->mme_ip_address[j].ipv4 = 1; - } else if (strcmp(preference, "ipv6") == 0) { - g_enb_properties.properties[enb_properties_index]->mme_ip_address[j].ipv6 = 1; - } else if (strcmp(preference, "no") == 0) { - g_enb_properties.properties[enb_properties_index]->mme_ip_address[j].ipv4 = 1; - g_enb_properties.properties[enb_properties_index]->mme_ip_address[j].ipv6 = 1; - } - } - - - // NETWORK_INTERFACES - subsetting = config_setting_get_member (setting_enb, ENB_CONFIG_STRING_NETWORK_INTERFACES_CONFIG); - - if (subsetting != NULL) { - if ( ( - config_setting_lookup_string( subsetting, ENB_CONFIG_STRING_ENB_INTERFACE_NAME_FOR_S1_MME, - (const char **)&enb_interface_name_for_S1_MME) - && config_setting_lookup_string( subsetting, ENB_CONFIG_STRING_ENB_IPV4_ADDRESS_FOR_S1_MME, - (const char **)&enb_ipv4_address_for_S1_MME) - && config_setting_lookup_string( subsetting, ENB_CONFIG_STRING_ENB_INTERFACE_NAME_FOR_S1U, - (const char **)&enb_interface_name_for_S1U) - && config_setting_lookup_string( subsetting, ENB_CONFIG_STRING_ENB_IPV4_ADDR_FOR_S1U, - (const char **)&enb_ipv4_address_for_S1U) - && config_setting_lookup_int(subsetting, ENB_CONFIG_STRING_ENB_PORT_FOR_S1U, - &enb_port_for_S1U) - ) - ) { - g_enb_properties.properties[enb_properties_index]->enb_interface_name_for_S1U = strdup(enb_interface_name_for_S1U); - cidr = enb_ipv4_address_for_S1U; - address = strtok(cidr, "/"); - - if (address) { - IPV4_STR_ADDR_TO_INT_NWBO ( address, g_enb_properties.properties[enb_properties_index]->enb_ipv4_address_for_S1U, "BAD IP ADDRESS FORMAT FOR eNB S1_U !\n" ); - } - - g_enb_properties.properties[enb_properties_index]->enb_port_for_S1U = enb_port_for_S1U; - - g_enb_properties.properties[enb_properties_index]->enb_interface_name_for_S1_MME = strdup(enb_interface_name_for_S1_MME); - cidr = enb_ipv4_address_for_S1_MME; - address = strtok(cidr, "/"); - - if (address) { - IPV4_STR_ADDR_TO_INT_NWBO ( address, g_enb_properties.properties[enb_properties_index]->enb_ipv4_address_for_S1_MME, "BAD IP ADDRESS FORMAT FOR eNB S1_MME !\n" ); - } - } - } // if (subsetting != NULL) { - enb_properties_index += 1; - } // if (strcmp(active_enb[j], enb_name) == 0) - } // for (j=0; j < num_enb_properties; j++) - } // for (i = 0; i < num_enbs; i++) - } // if (setting != NULL) { - - g_enb_properties.number += num_enb_properties; - - - AssertFatal (parse_errors == 0, - "Failed to parse eNB configuration file %s, found %d error%s !\n", - lib_config_file_name_pP, parse_errors, parse_errors > 1 ? "s" : ""); -} - - -//------------------------------------------------------------------------------ -static void usage ( - int argc, - char *argv[]) -//------------------------------------------------------------------------------ -{ - fprintf (stdout, "Please report any bug to: %s\n",PACKAGE_BUGREPORT); - fprintf (stdout, "Usage: %s [options]\n\n", argv[0]); - fprintf (stdout, "\n"); - fprintf (stdout, "Mandatory options:\n"); - fprintf (stdout, "\t-c | --enb-conf-file Provide the old eNB config file for generating a copy of the original test\n"); - fprintf (stdout, "\t-d | --test-dir Directory where a set of files related to a particular test are located\n"); - fprintf (stdout, "\t-p | --pdml File name (with no path) in 'test-dir' directory of an original scenario that has to be reworked (IP addresses) with new testbed\n"); - fprintf (stdout, "\n"); - fprintf (stdout, "Other options:\n"); - fprintf (stdout, "\t-h | --help Print this help and return\n"); - fprintf (stdout, "\t-v | --version Print informations about the version of this executable\n"); - fprintf (stdout, "\n"); - fprintf (stdout, "Example of generate_scenario use case: \n"); - fprintf (stdout, "\n"); - fprintf (stdout, " Generate a generix xml scenario from a captured pcap file: \n"); - fprintf (stdout, " +---------------------+ \n"); - fprintf (stdout, " |captured pcap-ng file| \n"); - fprintf (stdout, " +----------+----------+ \n"); - fprintf (stdout, " |\n"); - fprintf (stdout, " mme_test_s1_pcap2pdml --pcap_file <`captured pcap-ng file`>\n"); - fprintf (stdout, " |\n"); - fprintf (stdout, " +--------V----------+ +--------------------+\n"); - fprintf (stdout, " |'pdml-in-orig' file| |'enb-conf-file' file|\n"); - fprintf (stdout, " +--------+----------+ +--------------------+\n"); - fprintf (stdout, " | |\n"); - fprintf (stdout, " +----------------------------+\n"); - fprintf (stdout, " |\n"); - fprintf (stdout, " generate_scenario -d -p <'pdml-in-orig' file> -c <'enb-conf-file' file> \n"); - fprintf (stdout, " |\n"); - fprintf (stdout, " +------------V--------------+\n"); - fprintf (stdout, " +'xml-test-scenario' file |\n"); - fprintf (stdout, " +---------------------------+\n"); - fprintf (stdout, "\n"); -} - -//------------------------------------------------------------------------------ -int -config_parse_opt_line ( - int argc, - char *argv[]) -//------------------------------------------------------------------------------ -{ - int option; - int rv = 0; - char *enb_config_file_name = NULL; - char *pdml_in_file_name = NULL; - char *test_dir_name = NULL; - - enum long_option_e { - LONG_OPTION_START = 0x100, /* Start after regular single char options */ - LONG_OPTION_ENB_CONF_FILE, - LONG_OPTION_PDML, - LONG_OPTION_TEST_DIR, - LONG_OPTION_HELP, - LONG_OPTION_VERSION, - }; - - static struct option long_options[] = { - {"enb-conf-file", required_argument, 0, LONG_OPTION_ENB_CONF_FILE}, - {"pdml ", required_argument, 0, LONG_OPTION_PDML}, - {"test-dir", required_argument, 0, LONG_OPTION_TEST_DIR}, - {"help", no_argument, 0, LONG_OPTION_HELP}, - {"version", no_argument, 0, LONG_OPTION_VERSION}, - {NULL, 0, NULL, 0} - }; - - /* - * Parsing command line - */ - while ((option = getopt_long (argc, argv, "vhp:n:c:s:d:", long_options, NULL)) != -1) { - switch (option) { - case LONG_OPTION_ENB_CONF_FILE: - case 'c': - if (optarg) { - enb_config_file_name = optarg; - printf("eNB config file name is %s\n", enb_config_file_name); - rv |= GENERATE_SCENARIO; - } - break; - - case LONG_OPTION_PDML: - case 'p': - if (optarg) { - pdml_in_file_name = strdup(optarg); - printf("PDML input file name is %s\n", pdml_in_file_name); - rv |= GENERATE_SCENARIO; - } - break; - - case LONG_OPTION_TEST_DIR: - case 'd': - if (optarg) { - test_dir_name = strdup(optarg); - if (is_file_exists(test_dir_name, "test dirname") != GS_IS_DIR) { - fprintf(stderr, "Please provide a valid test dirname, %s is not a valid directory name\n", test_dir_name); - exit(1); - } - printf("Test dir name is %s\n", test_dir_name); - } - break; - - case LONG_OPTION_VERSION: - case 'v': - printf("Version %s\n", PACKAGE_VERSION); - exit (0); - break; - - case LONG_OPTION_HELP: - case 'h': - default: - usage (argc, argv); - exit (0); - } - } - if (NULL == test_dir_name) { - fprintf(stderr, "Please provide a valid test dirname\n"); - exit(1); - } - g_test_dir = test_dir_name; test_dir_name = NULL; - if (chdir(g_test_dir) != 0) { - fprintf(stderr, "Error: chdir %s returned %s\n", g_test_dir, strerror(errno)); - exit(1); - } - if (rv & GENERATE_SCENARIO) { - if (NULL == enb_config_file_name) { - fprintf(stderr, "Error: please provide the original eNB config file name that should be in %s\n", g_test_dir); - } - if (is_file_exists(enb_config_file_name, "ENB config file") != GS_IS_FILE) { - fprintf(stderr, "Error: eNB config file name %s is not found in dir %s\n", enb_config_file_name, g_test_dir); - } - enb_config_init(enb_config_file_name); - //enb_config_display(); - - if (NULL == pdml_in_file_name) { - fprintf(stderr, "Error: please provide the PDML file name that should be in %s\n", g_test_dir); - } - if (is_file_exists(pdml_in_file_name, "PDML file") != GS_IS_FILE) { - fprintf(stderr, "Error: PDML file name %s is not found in dir %s\n", pdml_in_file_name, g_test_dir); - } - g_pdml_in_origin = pdml_in_file_name; pdml_in_file_name = NULL; - } - return rv; -} - -//------------------------------------------------------------------------------ -int main( int argc, char **argv ) -//------------------------------------------------------------------------------ -{ - int actions = 0; - - memset((char*) &g_enb_properties, 0 , sizeof(g_enb_properties)); - - actions = config_parse_opt_line (argc, argv); //Command-line options - if (actions & GENERATE_SCENARIO) { - generate_test_scenario(g_test_dir, g_pdml_in_origin); - } - - return 0; -} diff --git a/openair3/TEST/EPC_TEST/generate_scenario.h b/openair3/TEST/EPC_TEST/generate_scenario.h deleted file mode 100644 index 8deded3f52..0000000000 --- a/openair3/TEST/EPC_TEST/generate_scenario.h +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.1 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -/* - generate_scenario.h - ------------------- - AUTHOR : Lionel GAUTHIER - COMPANY : EURECOM - EMAIL : Lionel.Gauthier@eurecom.fr -*/ - -#ifndef GENERATE_SCENARIO_H_ -#define GENERATE_SCENARIO_H_ -#include -#include -#include - -#include "commonDef.h" -#include "platform_types.h" -#include "platform_constants.h" -#include "s1ap_messages_types.h" -#include "SystemInformationBlockType2.h" - -#define IPV4_STR_ADDR_TO_INT_NWBO(AdDr_StR,NwBo,MeSsAgE ) do {\ - struct in_addr inp;\ - if ( inet_aton(AdDr_StR, &inp ) < 0 ) {\ - AssertFatal (0, MeSsAgE);\ - } else {\ - NwBo = inp.s_addr;\ - }\ - } while (0); - -/** @defgroup _enb_app ENB APP - * @ingroup _oai2 - * @{ - */ - -// Hard to find a defined value for max enb... -#define EPC_TEST_SCENARIO_MAX_ENB 4 - - -typedef struct mme_ip_address_s { - unsigned ipv4:1; - unsigned ipv6:1; - unsigned active:1; - char *ipv4_address; - char *ipv6_address; -} mme_ip_address_t; - -typedef struct Enb_properties_s { - /* Unique eNB_id to identify the eNB within EPC. - * For macro eNB ids this field should be 20 bits long. - * For home eNB ids this field should be 28 bits long. - */ - uint32_t eNB_id; - - /* The type of the cell */ - enum cell_type_e cell_type; - - /* Optional name for the cell - * NOTE: the name can be NULL (i.e no name) and will be cropped to 150 - * characters. - */ - char *eNB_name; - - /* Tracking area code */ - uint16_t tac; - - /* Mobile Country Code - * Mobile Network Code - */ - uint16_t mcc; - uint16_t mnc; - uint8_t mnc_digit_length; - - /* Nb of MME to connect to */ - uint8_t nb_mme; - /* List of MME to connect to */ - mme_ip_address_t mme_ip_address[S1AP_MAX_NB_MME_IP_ADDRESS]; - - int sctp_in_streams; - int sctp_out_streams; - - char *enb_interface_name_for_S1U; - in_addr_t enb_ipv4_address_for_S1U; - tcp_udp_port_t enb_port_for_S1U; - - char *enb_interface_name_for_S1_MME; - in_addr_t enb_ipv4_address_for_S1_MME; - -} Enb_properties_t; - -typedef struct Enb_properties_array_s { - int number; - Enb_properties_t *properties[EPC_TEST_SCENARIO_MAX_ENB]; -} Enb_properties_array_t; - -void enb_config_init(const char const * lib_config_file_name_pP); - -#endif /* ENB_CONFIG_H_ */ -/** @} */ diff --git a/openair3/TEST/EPC_TEST/play_scenario.c b/openair3/TEST/EPC_TEST/play_scenario.c deleted file mode 100644 index ebaffdb39e..0000000000 --- a/openair3/TEST/EPC_TEST/play_scenario.c +++ /dev/null @@ -1,1240 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.1 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -/* - play_scenario.c - ------------------- - AUTHOR : Lionel GAUTHIER - COMPANY : EURECOM - EMAIL : Lionel.Gauthier@eurecom.fr - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -#include "assertions.h" -#include "s1ap_common.h" -#include "intertask_interface.h" -#include "play_scenario.h" -#include "sctp_eNB_task.h" -#include "sctp_default_values.h" -#include "log.h" -//------------------------------------------------------------------------------ -#define PLAY_SCENARIO 1 -#define GS_IS_FILE 1 -#define GS_IS_DIR 2 -//------------------------------------------------------------------------------ -Enb_properties_array_t g_enb_properties; -int g_max_speed = 0; -//------------------------------------------------------------------------------ -extern et_scenario_t *g_scenario; -extern int xmlLoadExtDtdDefaultValue; -extern int asn_debug; -extern int asn1_xer_print; -extern pthread_mutex_t g_fsm_lock; - -//------------------------------------------------------------------------------ -// MEMO: -// Scenario with several eNBs: We may have to create ethx.y interfaces -// - - - -//------------------------------------------------------------------------------ -// test if file exist in current directory -int is_file_exists( const char const * file_nameP, const char const *file_roleP) -{ - struct stat s; - int err = stat(file_nameP, &s); - if(-1 == err) { - if(ENOENT == errno) { - fprintf(stderr, "Please provide a valid %s, %s does not exist\n", file_roleP, file_nameP); - } else { - perror("stat"); - exit(1); - } - } else { - if(S_ISREG(s.st_mode)) { - return GS_IS_FILE; - } else if(S_ISDIR(s.st_mode)) { - return GS_IS_DIR; - } else { - fprintf(stderr, "Please provide a valid test %s, %s exists but is not found valid\n", file_roleP, file_nameP); - } - } - return 0; -} - - -//------------------------------------------------------------------------------ -int et_strip_extension(char *in_filename) -{ - static const uint8_t name_min_len = 1; - static const uint8_t max_ext_len = 5; // .pdml ! - fprintf(stdout, "strip_extension %s\n", in_filename); - - if (NULL != in_filename) { - /* Check chars starting at end of string to find last '.' */ - for (ssize_t i = strlen(in_filename); i > name_min_len; i--) { - if (in_filename[i] == '.') { - in_filename[i] = '\0'; - return i; - } - } - } - return -1; -} -//------------------------------------------------------------------------------ -// return number of splitted items -void et_get_shift_arg( char * line_argument, shift_packet_t * const shift) -{ - int len = strlen(line_argument); - int i = 0; - int j = 0; - int num_milli = 0; - char my_num[64]; - int negative = 0; - - - while ((line_argument[i] != ':') && (i < len)) { - if (isdigit(line_argument[i])) { // may occur '\"' - my_num[j++] = line_argument[i]; - } - i += 1; - } - AssertFatal(':' == line_argument[i], "Bad format"); - i += 1; // ':' - my_num[j++] = '\0'; - shift->frame_number = atoi(my_num); - AssertFatal(ishift_seconds = atoi(my_num); - // may omit .mmm, accept .m or .mm or .mmm or ... - while ((i < len) && (num_milli++ < 3)){ - my_num[j++] = line_argument[i++]; - } - while (num_milli++ < 6){ - my_num[j++] = '0'; - } - my_num[j] = '\0'; - shift->shift_microseconds = atoi(my_num); - if (negative == 1) { - shift->shift_seconds = - shift->shift_seconds; - shift->shift_microseconds = - shift->shift_microseconds; - } -} -//------------------------------------------------------------------------------ -// return number of splitted items -int split_path( char * pathP, char *** resP) -{ - char * saveptr1; - char * p = strtok_r (pathP, "/", &saveptr1); - int n_spaces = 0; - - /// split string and append tokens to 'res' - while (p) { - *resP = realloc (*resP, sizeof (char*) * ++n_spaces); - AssertFatal (*resP, "realloc failed"); - (*resP)[n_spaces-1] = p; - p = strtok_r (NULL, "/", &saveptr1); - } - return n_spaces; -} -//------------------------------------------------------------------------------ -void et_free_packet(et_packet_t* packet) -{ - if (packet) { - switch (packet->sctp_hdr.chunk_type) { - case SCTP_CID_DATA: - et_free_pointer(packet->sctp_hdr.u.data_hdr.payload.binary_stream); - break; - default: - ; - } - et_free_pointer(packet); - } -} - -//------------------------------------------------------------------------------ -void et_free_scenario(et_scenario_t* scenario) -{ - et_packet_t *packet = NULL; - et_packet_t *next_packet = NULL; - if (scenario) { - packet = scenario->list_packet; - while (packet) { - next_packet = packet->next; - et_free_packet(packet); - packet = next_packet->next; - } - et_free_pointer(scenario); - pthread_mutex_destroy(&g_fsm_lock); - } -} - -//------------------------------------------------------------------------------ -char * et_ip2ip_str(const et_ip_t * const ip) -{ - static char str[INET6_ADDRSTRLEN]; - - sprintf(str, "ERROR"); - switch (ip->address_family) { - case AF_INET6: - inet_ntop(AF_INET6, &(ip->address.ipv6), str, INET6_ADDRSTRLEN); - break; - case AF_INET: - inet_ntop(AF_INET, &(ip->address.ipv4), str, INET_ADDRSTRLEN); - break; - default: - ; - } - return str; -} -//------------------------------------------------------------------------------ -//convert hexstring to len bytes of data -//returns 0 on success, negative on error -//data is a buffer of at least len bytes -//hexstring is upper or lower case hexadecimal, NOT prepended with "0x" -int et_hex2data(unsigned char * const data, const unsigned char * const hexstring, const unsigned int len) -{ - unsigned const char *pos = hexstring; - char *endptr = NULL; - size_t count = 0; - - fprintf(stdout, "%s(%s,%u)\n", __FUNCTION__, hexstring, len); - - if ((len > 1) && (strlen((const char*)hexstring) % 2)) { - //or hexstring has an odd length - return -3; - } - - if (len == 1) { - char buf[5] = {'0', 'x', 0, pos[0], '\0'}; - data[0] = strtol(buf, &endptr, 16); - /* Check for various possible errors */ - AssertFatal ((errno == 0) || (data[0] != 0), "ERROR %s() strtol: %s\n", __FUNCTION__, strerror(errno)); - AssertFatal (endptr != buf, "ERROR %s() No digits were found\n", __FUNCTION__); - return 0; - } - - for(count = 0; count < len/2; count++) { - char buf[5] = {'0', 'x', pos[0], pos[1], 0}; - data[count] = strtol(buf, &endptr, 16); - pos += 2 * sizeof(char); - AssertFatal (endptr[0] == '\0', "ERROR %s() non-hexadecimal character encountered buf %p endptr %p buf %s count %zu pos %p\n", __FUNCTION__, buf, endptr, buf, count, pos); - AssertFatal (endptr != buf, "ERROR %s() No digits were found\n", __FUNCTION__); - } - return 0; -} -//------------------------------------------------------------------------------ -sctp_cid_t et_chunk_type_str2cid(const xmlChar * const chunk_type_str) -{ - if ((!xmlStrcmp(chunk_type_str, (const xmlChar *)"DATA"))) { return SCTP_CID_DATA;} - if ((!xmlStrcmp(chunk_type_str, (const xmlChar *)"INIT"))) { return SCTP_CID_INIT;} - if ((!xmlStrcmp(chunk_type_str, (const xmlChar *)"INIT_ACK"))) { return SCTP_CID_INIT_ACK;} - if ((!xmlStrcmp(chunk_type_str, (const xmlChar *)"SACK"))) { return SCTP_CID_SACK;} - if ((!xmlStrcmp(chunk_type_str, (const xmlChar *)"HEARTBEAT"))) { return SCTP_CID_HEARTBEAT;} - if ((!xmlStrcmp(chunk_type_str, (const xmlChar *)"HEARTBEAT_ACK"))) { return SCTP_CID_HEARTBEAT_ACK;} - if ((!xmlStrcmp(chunk_type_str, (const xmlChar *)"ABORT"))) { return SCTP_CID_ABORT;} - if ((!xmlStrcmp(chunk_type_str, (const xmlChar *)"SHUTDOWN"))) { return SCTP_CID_SHUTDOWN;} - if ((!xmlStrcmp(chunk_type_str, (const xmlChar *)"SHUTDOWN_ACK"))) { return SCTP_CID_SHUTDOWN_ACK;} - if ((!xmlStrcmp(chunk_type_str, (const xmlChar *)"ERROR"))) { return SCTP_CID_ERROR;} - if ((!xmlStrcmp(chunk_type_str, (const xmlChar *)"COOKIE_ECHO"))) { return SCTP_CID_COOKIE_ECHO;} - if ((!xmlStrcmp(chunk_type_str, (const xmlChar *)"COOKIE_ACK"))) { return SCTP_CID_COOKIE_ACK;} - if ((!xmlStrcmp(chunk_type_str, (const xmlChar *)"ECN_ECNE"))) { return SCTP_CID_ECN_ECNE;} - if ((!xmlStrcmp(chunk_type_str, (const xmlChar *)"ECN_CWR"))) { return SCTP_CID_ECN_CWR;} - if ((!xmlStrcmp(chunk_type_str, (const xmlChar *)"SHUTDOWN_COMPLETE"))) { return SCTP_CID_SHUTDOWN_COMPLETE;} - if ((!xmlStrcmp(chunk_type_str, (const xmlChar *)"AUTH"))) { return SCTP_CID_AUTH;} - if ((!xmlStrcmp(chunk_type_str, (const xmlChar *)"FWD_TSN"))) { return SCTP_CID_FWD_TSN;} - if ((!xmlStrcmp(chunk_type_str, (const xmlChar *)"ASCONF"))) { return SCTP_CID_ASCONF;} - if ((!xmlStrcmp(chunk_type_str, (const xmlChar *)"ASCONF_ACK"))) { return SCTP_CID_ASCONF_ACK;} - AssertFatal (0, "ERROR: %s() cannot convert: %s\n", __FUNCTION__, chunk_type_str); -} -//------------------------------------------------------------------------------ -const char * const et_chunk_type_cid2str(const sctp_cid_t chunk_type) -{ - switch (chunk_type) { - case SCTP_CID_DATA: return "DATA"; break; - case SCTP_CID_INIT: return "INIT"; break; - case SCTP_CID_INIT_ACK: return "INIT_ACK"; break; - case SCTP_CID_SACK: return "SACK"; break; - case SCTP_CID_HEARTBEAT: return "HEARTBEAT"; break; - case SCTP_CID_HEARTBEAT_ACK: return "HEARTBEAT_ACK"; break; - case SCTP_CID_ABORT: return "ABORT"; break; - case SCTP_CID_SHUTDOWN: return "SHUTDOWN"; break; - case SCTP_CID_SHUTDOWN_ACK: return "SHUTDOWN_ACK"; break; - case SCTP_CID_ERROR: return "ERROR"; break; - case SCTP_CID_COOKIE_ECHO: return "COOKIE_ECHO"; break; - case SCTP_CID_COOKIE_ACK: return "COOKIE_ACK"; break; - case SCTP_CID_ECN_ECNE: return "ECN_ECNE"; break; - case SCTP_CID_ECN_CWR: return "ECN_CWR"; break; - case SCTP_CID_SHUTDOWN_COMPLETE: return "SHUTDOWN_COMPLETE"; break; - case SCTP_CID_AUTH: return "AUTH"; break; - case SCTP_CID_FWD_TSN: return "FWD_TSN"; break; - case SCTP_CID_ASCONF: return "ASCONF"; break; - case SCTP_CID_ASCONF_ACK: return "ASCONF_ACK"; break; - default: - AssertFatal (0, "ERROR: Unknown chunk_type %d!\n", chunk_type); - } -} -//------------------------------------------------------------------------------ -const char * const et_error_match2str(const int err) -{ - switch (err) { - // from asn_compare.h - case COMPARE_ERR_CODE_NO_MATCH: return "CODE_NO_MATCH"; break; - case COMPARE_ERR_CODE_TYPE_MISMATCH: return "TYPE_MISMATCH"; break; - case COMPARE_ERR_CODE_TYPE_ARG_NULL: return "TYPE_ARG_NULL"; break; - case COMPARE_ERR_CODE_VALUE_NULL: return "VALUE_NULL"; break; - case COMPARE_ERR_CODE_VALUE_ARG_NULL: return "VALUE_ARG_NULL"; break; - case COMPARE_ERR_CODE_CHOICE_NUM: return "CHOICE_NUM"; break; - case COMPARE_ERR_CODE_CHOICE_PRESENT: return "CHOICE_PRESENT"; break; - case COMPARE_ERR_CODE_CHOICE_MALFORMED: return "CHOICE_MALFORMED"; break; - case COMPARE_ERR_CODE_SET_MALFORMED: return "SET_MALFORMED"; break; - case COMPARE_ERR_CODE_COLLECTION_NUM_ELEMENTS: return "COLLECTION_NUM_ELEMENTS"; break; - // from play_scenario.h - case ET_ERROR_MATCH_PACKET_SCTP_CHUNK_TYPE: return "SCTP_CHUNK_TYPE"; break; - case ET_ERROR_MATCH_PACKET_SCTP_PPID: return "SCTP_PPID"; break; - case ET_ERROR_MATCH_PACKET_SCTP_ASSOC_ID: return "SCTP_ASSOC_ID"; break; - case ET_ERROR_MATCH_PACKET_SCTP_STREAM_ID: return "SCTP_STREAM_ID"; break; - case ET_ERROR_MATCH_PACKET_SCTP_SSN: return "SCTP_SSN"; break; - case ET_ERROR_MATCH_PACKET_S1AP_PRESENT: return "S1AP_PRESENT"; break; - case ET_ERROR_MATCH_PACKET_S1AP_PROCEDURE_CODE: return "S1AP_PROCEDURE_CODE"; break; - case ET_ERROR_MATCH_PACKET_S1AP_CRITICALITY: return "S1AP_CRITICALITY"; break; - default: - AssertFatal (0, "ERROR: Unknown match error %d!(TODO handle an1c error codes)\n", err); - } -} -//------------------------------------------------------------------------------ -et_packet_action_t et_action_str2et_action_t(const xmlChar * const action) -{ - if ((!xmlStrcmp(action, (const xmlChar *)"SEND"))) { return ET_PACKET_ACTION_S1C_SEND;} - if ((!xmlStrcmp(action, (const xmlChar *)"RECEIVE"))) { return ET_PACKET_ACTION_S1C_RECEIVE;} - AssertFatal (0, "ERROR: cannot convert: %s\n", action); - //if (NULL == action) {return ACTION_S1C_NULL;} -} -//------------------------------------------------------------------------------ -void et_ip_str2et_ip(const xmlChar * const ip_str, et_ip_t * const ip) -{ - AssertFatal (NULL != ip_str, "ERROR Cannot convert null string to ip address!\n"); - AssertFatal (NULL != ip, "ERROR out parameter pointer is NULL!\n"); - // store this IP address in sa: - if (inet_pton(AF_INET, (const char*)ip_str, (void*)&(ip->address.ipv4)) > 0) { - ip->address_family = AF_INET; - strncpy((char *)ip->str, (const char *)ip_str, INET_ADDRSTRLEN+1); - } else if (inet_pton(AF_INET6, (const char*)ip_str, (void*)&(ip->address.ipv6)) > 0) { - ip->address_family = AF_INET6; - strncpy((char *)ip->str, (const char *)ip_str, INET6_ADDRSTRLEN+1); - } else { - ip->address_family = AF_UNSPEC; - AssertFatal (0, "ERROR %s() Could not parse ip address %s!\n", __FUNCTION__, ip_str); - } -} -//------------------------------------------------------------------------------ -int et_compare_et_ip_to_net_ip_address(const et_ip_t * const ip, const net_ip_address_t * const net_ip) -{ - AssertFatal (NULL != ip, "ERROR ip parameter\n"); - AssertFatal (NULL != net_ip, "ERROR net_ip parameter\n"); - switch (ip->address_family) { - case AF_INET: - if (net_ip->ipv4) { - //S1AP_DEBUG("%s(%s,%s)=%d\n",__FUNCTION__,ip->str, net_ip->ipv4_address, strcmp(ip->str, net_ip->ipv4_address)); - return strcmp(ip->str, net_ip->ipv4_address); - } - //S1AP_DEBUG("%s(%s,%s)=-1 (IP version (4) not matching)\n",__FUNCTION__,ip->str, net_ip->ipv4_address); - return -1; - break; - case AF_INET6: - if (net_ip->ipv6) { - //S1AP_DEBUG("%s(%s,%s)=%d\n",__FUNCTION__,ip->str, net_ip->ipv4_address, strcmp(ip->str, net_ip->ipv6_address)); - return strcmp(ip->str, net_ip->ipv6_address); - } - //S1AP_DEBUG("%s(%s,%s)=-1 (IP version (6) not matching)\n",__FUNCTION__,ip->str, net_ip->ipv6_address); - return -1; - break; - default: - S1AP_DEBUG("%s(%s,...)=-1 (unknown IP version)\n",__FUNCTION__,ip->str); - return -1; - } -} - -#ifdef LIBCONFIG_LONG -#define libconfig_int long -#else -#define libconfig_int int -#endif -//------------------------------------------------------------------------------ -void et_enb_config_init(const char const * lib_config_file_name_pP) -//------------------------------------------------------------------------------ -{ - config_t cfg; - config_setting_t *setting = NULL; - config_setting_t *subsetting = NULL; - config_setting_t *setting_mme_addresses = NULL; - config_setting_t *setting_mme_address = NULL; - config_setting_t *setting_enb = NULL; - libconfig_int my_int; - int num_enb_properties = 0; - int enb_properties_index = 0; - int num_enbs = 0; - int num_mme_address = 0; - int i = 0; - int j = 0; - int parse_errors = 0; - libconfig_int enb_id = 0; - const char* cell_type = NULL; - const char* tac = 0; - const char* enb_name = NULL; - const char* mcc = 0; - const char* mnc = 0; - char* ipv4 = NULL; - char* ipv6 = NULL; - char* active = NULL; - char* preference = NULL; - const char* active_enb[MAX_ENB]; - char* enb_interface_name_for_S1U = NULL; - char* enb_ipv4_address_for_S1U = NULL; - libconfig_int enb_port_for_S1U = 0; - char* enb_interface_name_for_S1_MME = NULL; - char* enb_ipv4_address_for_S1_MME = NULL; - char *address = NULL; - char *cidr = NULL; - - - AssertFatal (lib_config_file_name_pP != NULL, - "Bad parameter lib_config_file_name_pP %s , must reference a valid eNB config file\n", - lib_config_file_name_pP); - - memset((char*)active_enb, 0 , MAX_ENB * sizeof(char*)); - - config_init(&cfg); - - /* Read the file. If there is an error, report it and exit. */ - if (! config_read_file(&cfg, lib_config_file_name_pP)) { - config_destroy(&cfg); - AssertFatal (0, "Failed to parse eNB configuration file %s!\n", lib_config_file_name_pP); - } - - // Get list of active eNBs, (only these will be configured) - setting = config_lookup(&cfg, ENB_CONFIG_STRING_ACTIVE_ENBS); - - if (setting != NULL) { - num_enbs = config_setting_length(setting); - - for (i = 0; i < num_enbs; i++) { - setting_enb = config_setting_get_elem(setting, i); - active_enb[i] = config_setting_get_string (setting_enb); - AssertFatal (active_enb[i] != NULL, - "Failed to parse config file %s, %dth attribute %s \n", - lib_config_file_name_pP, i, ENB_CONFIG_STRING_ACTIVE_ENBS); - active_enb[i] = strdup(active_enb[i]); - num_enb_properties += 1; - } - } - - /* Output a list of all eNBs. */ - setting = config_lookup(&cfg, ENB_CONFIG_STRING_ENB_LIST); - - if (setting != NULL) { - enb_properties_index = g_enb_properties.number; - parse_errors = 0; - num_enbs = config_setting_length(setting); - - for (i = 0; i < num_enbs; i++) { - setting_enb = config_setting_get_elem(setting, i); - - if (! config_setting_lookup_int(setting_enb, ENB_CONFIG_STRING_ENB_ID, &enb_id)) { - /* Calculate a default eNB ID */ -# if defined(ENABLE_USE_MME) - uint32_t hash; - - hash = et_s1ap_generate_eNB_id (); - enb_id = i + (hash & 0xFFFF8); -# else - enb_id = i; -# endif - } - - if ( !( config_setting_lookup_string(setting_enb, ENB_CONFIG_STRING_CELL_TYPE, &cell_type) - && config_setting_lookup_string(setting_enb, ENB_CONFIG_STRING_ENB_NAME, &enb_name) - && config_setting_lookup_string(setting_enb, ENB_CONFIG_STRING_TRACKING_AREA_CODE, &tac) - && config_setting_lookup_string(setting_enb, ENB_CONFIG_STRING_MOBILE_COUNTRY_CODE, &mcc) - && config_setting_lookup_string(setting_enb, ENB_CONFIG_STRING_MOBILE_NETWORK_CODE, &mnc) - - - ) - ) { - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, %d th enb\n", - lib_config_file_name_pP, i); - continue; // FIXME this prevents segfaults below, not sure what happens after function exit - } - - // search if in active list - for (j=0; j < num_enb_properties; j++) { - if (strcmp(active_enb[j], enb_name) == 0) { - g_enb_properties.properties[enb_properties_index] = calloc(1, sizeof(Enb_properties_t)); - - g_enb_properties.properties[enb_properties_index]->eNB_id = enb_id; - - if (strcmp(cell_type, "CELL_MACRO_ENB") == 0) { - g_enb_properties.properties[enb_properties_index]->cell_type = CELL_MACRO_ENB; - } else if (strcmp(cell_type, "CELL_HOME_ENB") == 0) { - g_enb_properties.properties[enb_properties_index]->cell_type = CELL_HOME_ENB; - } else { - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for cell_type choice: CELL_MACRO_ENB or CELL_HOME_ENB !\n", - lib_config_file_name_pP, i, cell_type); - } - - g_enb_properties.properties[enb_properties_index]->eNB_name = strdup(enb_name); - g_enb_properties.properties[enb_properties_index]->tac = (uint16_t)atoi(tac); - g_enb_properties.properties[enb_properties_index]->mcc = (uint16_t)atoi(mcc); - g_enb_properties.properties[enb_properties_index]->mnc = (uint16_t)atoi(mnc); - g_enb_properties.properties[enb_properties_index]->mnc_digit_length = strlen(mnc); - AssertFatal((g_enb_properties.properties[enb_properties_index]->mnc_digit_length == 2) || - (g_enb_properties.properties[enb_properties_index]->mnc_digit_length == 3), - "BAD MNC DIGIT LENGTH %d", - g_enb_properties.properties[i]->mnc_digit_length); - - - setting_mme_addresses = config_setting_get_member (setting_enb, ENB_CONFIG_STRING_MME_IP_ADDRESS); - num_mme_address = config_setting_length(setting_mme_addresses); - g_enb_properties.properties[enb_properties_index]->nb_mme = 0; - - for (j = 0; j < num_mme_address; j++) { - setting_mme_address = config_setting_get_elem(setting_mme_addresses, j); - - if ( !( - config_setting_lookup_string(setting_mme_address, ENB_CONFIG_STRING_MME_IPV4_ADDRESS, (const char **)&ipv4) - && config_setting_lookup_string(setting_mme_address, ENB_CONFIG_STRING_MME_IPV6_ADDRESS, (const char **)&ipv6) - && config_setting_lookup_string(setting_mme_address, ENB_CONFIG_STRING_MME_IP_ADDRESS_ACTIVE, (const char **)&active) - && config_setting_lookup_string(setting_mme_address, ENB_CONFIG_STRING_MME_IP_ADDRESS_PREFERENCE, (const char **)&preference) - ) - ) { - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, %d th enb %d th mme address !\n", - lib_config_file_name_pP, i, j); - continue; // FIXME will prevent segfaults below, not sure what happens at function exit... - } - - g_enb_properties.properties[enb_properties_index]->nb_mme += 1; - - g_enb_properties.properties[enb_properties_index]->mme_ip_address[j].ipv4_address = strdup(ipv4); - g_enb_properties.properties[enb_properties_index]->mme_ip_address[j].ipv6_address = strdup(ipv6); - - if (strcmp(active, "yes") == 0) { - g_enb_properties.properties[enb_properties_index]->mme_ip_address[j].active = 1; - } // else { (calloc) - - if (strcmp(preference, "ipv4") == 0) { - g_enb_properties.properties[enb_properties_index]->mme_ip_address[j].ipv4 = 1; - } else if (strcmp(preference, "ipv6") == 0) { - g_enb_properties.properties[enb_properties_index]->mme_ip_address[j].ipv6 = 1; - } else if (strcmp(preference, "no") == 0) { - g_enb_properties.properties[enb_properties_index]->mme_ip_address[j].ipv4 = 1; - g_enb_properties.properties[enb_properties_index]->mme_ip_address[j].ipv6 = 1; - } - } - // SCTP SETTING - g_enb_properties.properties[enb_properties_index]->sctp_out_streams = SCTP_OUT_STREAMS; - g_enb_properties.properties[enb_properties_index]->sctp_in_streams = SCTP_IN_STREAMS; - subsetting = config_setting_get_member (setting_enb, ENB_CONFIG_STRING_SCTP_CONFIG); - - if (subsetting != NULL) { - if ( (config_setting_lookup_int( subsetting, ENB_CONFIG_STRING_SCTP_INSTREAMS, &my_int) )) { - g_enb_properties.properties[enb_properties_index]->sctp_in_streams = (uint16_t)my_int; - } - - if ( (config_setting_lookup_int( subsetting, ENB_CONFIG_STRING_SCTP_OUTSTREAMS, &my_int) )) { - g_enb_properties.properties[enb_properties_index]->sctp_out_streams = (uint16_t)my_int; - } - } - - - // NETWORK_INTERFACES - subsetting = config_setting_get_member (setting_enb, ENB_CONFIG_STRING_NETWORK_INTERFACES_CONFIG); - - if (subsetting != NULL) { - if ( ( - config_setting_lookup_string( subsetting, ENB_CONFIG_STRING_ENB_INTERFACE_NAME_FOR_S1_MME, - (const char **)&enb_interface_name_for_S1_MME) - && config_setting_lookup_string( subsetting, ENB_CONFIG_STRING_ENB_IPV4_ADDRESS_FOR_S1_MME, - (const char **)&enb_ipv4_address_for_S1_MME) - && config_setting_lookup_string( subsetting, ENB_CONFIG_STRING_ENB_INTERFACE_NAME_FOR_S1U, - (const char **)&enb_interface_name_for_S1U) - && config_setting_lookup_string( subsetting, ENB_CONFIG_STRING_ENB_IPV4_ADDR_FOR_S1U, - (const char **)&enb_ipv4_address_for_S1U) - && config_setting_lookup_int(subsetting, ENB_CONFIG_STRING_ENB_PORT_FOR_S1U, - &enb_port_for_S1U) - ) - ) { - g_enb_properties.properties[enb_properties_index]->enb_interface_name_for_S1U = strdup(enb_interface_name_for_S1U); - cidr = enb_ipv4_address_for_S1U; - address = strtok(cidr, "/"); - - if (address) { - IPV4_STR_ADDR_TO_INT_NWBO ( address, g_enb_properties.properties[enb_properties_index]->enb_ipv4_address_for_S1U, "BAD IP ADDRESS FORMAT FOR eNB S1_U !\n" ); - } - - g_enb_properties.properties[enb_properties_index]->enb_port_for_S1U = enb_port_for_S1U; - - g_enb_properties.properties[enb_properties_index]->enb_interface_name_for_S1_MME = strdup(enb_interface_name_for_S1_MME); - cidr = enb_ipv4_address_for_S1_MME; - address = strtok(cidr, "/"); - - if (address) { - IPV4_STR_ADDR_TO_INT_NWBO ( address, g_enb_properties.properties[enb_properties_index]->enb_ipv4_address_for_S1_MME, "BAD IP ADDRESS FORMAT FOR eNB S1_MME !\n" ); - } - } - } // if (subsetting != NULL) { - enb_properties_index += 1; - } // if (strcmp(active_enb[j], enb_name) == 0) - } // for (j=0; j < num_enb_properties; j++) - } // for (i = 0; i < num_enbs; i++) - } // if (setting != NULL) { - - g_enb_properties.number += num_enb_properties; - - - AssertFatal (parse_errors == 0, - "Failed to parse eNB configuration file %s, found %d error%s !\n", - lib_config_file_name_pP, parse_errors, parse_errors > 1 ? "s" : ""); -} -/*------------------------------------------------------------------------------*/ -const Enb_properties_array_t *et_enb_config_get(void) -{ - return &g_enb_properties; -} -/*------------------------------------------------------------------------------*/ -void et_eNB_app_register(const Enb_properties_array_t *enb_properties) -{ - uint32_t enb_id = 0; - uint32_t mme_id = 0; - MessageDef *msg_p = NULL; - char *str = NULL; - struct in_addr addr = {.s_addr = 0}; - - - g_scenario->register_enb_pending = 0; - for (enb_id = 0; (enb_id < enb_properties->number) ; enb_id++) { - { - s1ap_register_enb_req_t *s1ap_register_eNB = NULL; - - /* note: there is an implicit relationship between the data structure and the message name */ - msg_p = itti_alloc_new_message (TASK_ENB_APP, S1AP_REGISTER_ENB_REQ); - - s1ap_register_eNB = &S1AP_REGISTER_ENB_REQ(msg_p); - - /* Some default/random parameters */ - s1ap_register_eNB->eNB_id = enb_properties->properties[enb_id]->eNB_id; - s1ap_register_eNB->cell_type = enb_properties->properties[enb_id]->cell_type; - s1ap_register_eNB->eNB_name = enb_properties->properties[enb_id]->eNB_name; - s1ap_register_eNB->tac = enb_properties->properties[enb_id]->tac; - s1ap_register_eNB->mcc = enb_properties->properties[enb_id]->mcc; - s1ap_register_eNB->mnc = enb_properties->properties[enb_id]->mnc; - s1ap_register_eNB->mnc_digit_length = enb_properties->properties[enb_id]->mnc_digit_length; - - s1ap_register_eNB->nb_mme = enb_properties->properties[enb_id]->nb_mme; - AssertFatal (s1ap_register_eNB->nb_mme <= S1AP_MAX_NB_MME_IP_ADDRESS, "Too many MME for eNB %d (%d/%d)!", enb_id, s1ap_register_eNB->nb_mme, - S1AP_MAX_NB_MME_IP_ADDRESS); - - for (mme_id = 0; mme_id < s1ap_register_eNB->nb_mme; mme_id++) { - s1ap_register_eNB->mme_ip_address[mme_id].ipv4 = enb_properties->properties[enb_id]->mme_ip_address[mme_id].ipv4; - s1ap_register_eNB->mme_ip_address[mme_id].ipv6 = enb_properties->properties[enb_id]->mme_ip_address[mme_id].ipv6; - strncpy (s1ap_register_eNB->mme_ip_address[mme_id].ipv4_address, - enb_properties->properties[enb_id]->mme_ip_address[mme_id].ipv4_address, - sizeof(s1ap_register_eNB->mme_ip_address[0].ipv4_address)); - strncpy (s1ap_register_eNB->mme_ip_address[mme_id].ipv6_address, - enb_properties->properties[enb_id]->mme_ip_address[mme_id].ipv6_address, - sizeof(s1ap_register_eNB->mme_ip_address[0].ipv6_address)); - } - - s1ap_register_eNB->sctp_in_streams = enb_properties->properties[enb_id]->sctp_in_streams; - s1ap_register_eNB->sctp_out_streams = enb_properties->properties[enb_id]->sctp_out_streams; - - - s1ap_register_eNB->enb_ip_address.ipv6 = 0; - s1ap_register_eNB->enb_ip_address.ipv4 = 1; - addr.s_addr = enb_properties->properties[enb_id]->enb_ipv4_address_for_S1_MME; - str = inet_ntoa(addr); - strcpy(s1ap_register_eNB->enb_ip_address.ipv4_address, str); - - g_scenario->register_enb_pending++; - itti_send_msg_to_task (TASK_S1AP, ENB_MODULE_ID_TO_INSTANCE(enb_id), msg_p); - } - } -} -/*------------------------------------------------------------------------------*/ -void *et_eNB_app_task(void *args_p) -{ - et_scenario_t *scenario = (et_scenario_t*)args_p; - MessageDef *msg_p = NULL; - const char *msg_name = NULL; - instance_t instance = 0; - int result = 0; - - itti_mark_task_ready (TASK_ENB_APP); - - do { - // Wait for a message - itti_receive_msg (TASK_ENB_APP, &msg_p); - - msg_name = ITTI_MSG_NAME (msg_p); - instance = ITTI_MSG_DESTINATION_INSTANCE (msg_p); - - switch (ITTI_MSG_ID(msg_p)) { - case TERMINATE_MESSAGE: - itti_exit_task (); - break; - - case S1AP_REGISTER_ENB_CNF: - LOG_I(ENB_APP, "[eNB %d] Received %s: associated MME %d\n", instance, msg_name, - S1AP_REGISTER_ENB_CNF(msg_p).nb_mme); - - DevAssert(scenario->register_enb_pending > 0); - scenario->register_enb_pending--; - - /* Check if at least eNB is registered with one MME */ - if (S1AP_REGISTER_ENB_CNF(msg_p).nb_mme > 0) { - scenario->registered_enb++; - } - - /* Check if all register eNB requests have been processed */ - if (scenario->register_enb_pending == 0) { - timer_remove(scenario->enb_register_retry_timer_id); - if (scenario->registered_enb == scenario->enb_properties->number) { - /* If all eNB are registered, start scenario */ - LOG_D(ENB_APP, " All eNB are now associated with a MME\n"); - et_event_t event; - event.code = ET_EVENT_S1C_CONNECTED; - et_scenario_fsm_notify_event(event); - } else { - uint32_t not_associated = scenario->enb_properties->number - scenario->registered_enb; - - LOG_W(ENB_APP, " %d eNB %s not associated with a MME, retrying registration in %d seconds ...\n", - not_associated, not_associated > 1 ? "are" : "is", ET_ENB_REGISTER_RETRY_DELAY); - - /* Restart the eNB registration process in ENB_REGISTER_RETRY_DELAY seconds */ - if (timer_setup (ET_ENB_REGISTER_RETRY_DELAY, 0, TASK_ENB_APP, INSTANCE_DEFAULT, TIMER_ONE_SHOT, - NULL, &scenario->enb_register_retry_timer_id) < 0) { - LOG_E(ENB_APP, " Can not start eNB register retry timer, use \"sleep\" instead!\n"); - - sleep(ET_ENB_REGISTER_RETRY_DELAY); - /* Restart the registration process */ - scenario->registered_enb = 0; - et_eNB_app_register (scenario->enb_properties); - } - } - } - - break; - - case S1AP_DEREGISTERED_ENB_IND: - LOG_W(ENB_APP, "[eNB %d] Received %s: associated MME %d\n", instance, msg_name, - S1AP_DEREGISTERED_ENB_IND(msg_p).nb_mme); - - /* TODO handle recovering of registration */ - break; - - case TIMER_HAS_EXPIRED: - LOG_I(ENB_APP, " Received %s: timer_id %d\n", msg_name, TIMER_HAS_EXPIRED(msg_p).timer_id); - - if (TIMER_HAS_EXPIRED (msg_p).timer_id == scenario->enb_register_retry_timer_id) { - /* Restart the registration process */ - scenario->registered_enb = 0; - et_eNB_app_register (scenario->enb_properties); - } - break; - - default: - LOG_E(ENB_APP, "Received unexpected message %s\n", msg_name); - break; - } - - result = itti_free (ITTI_MSG_ORIGIN_ID(msg_p), msg_p); - AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result); - } while (1); - return NULL; -} - -//------------------------------------------------------------------------------ -int et_play_scenario(et_scenario_t* const scenario, const struct shift_packet_s *shifts) -{ - et_event_t event; - struct shift_packet_s *shift = shifts; - et_packet_t *packet = NULL; - et_packet_t *next_packet = NULL; - struct timeval shift_all_packets = { .tv_sec = 0, .tv_usec = 0 }; - struct timeval relative_last_sent_packet = { .tv_sec = 0, .tv_usec = 0 }; - struct timeval relative_last_received_packet = { .tv_sec = 0, .tv_usec = 0 }; - struct timeval initial_time = { .tv_sec = 0, .tv_usec = 0 }; - char first_packet = 1; - char first_sent_packet = 1; - char first_received_packet = 1; - - // first apply timing shifts if requested - while (shift) { - packet = scenario->list_packet; - while (packet) { - //fprintf(stdout, "*shift: %p\n", shift); - //fprintf(stdout, "\tframe_number: %d\n", shift->frame_number); - //fprintf(stdout, "\tshift_seconds: %ld\n", shift->shift_seconds); - //fprintf(stdout, "\tshift_microseconds: %ld\n", shift->shift_microseconds); - //fprintf(stdout, "\tsingle: %d\n\n", shift->single); - //fprintf(stdout, "\tshift_all_packets_seconds: %ld\n", shift_all_packets.tv_sec); - //fprintf(stdout, "\tshift_all_packets_microseconds: %ld\n", shift_all_packets.tv_usec); - - AssertFatal((packet->time_relative_to_first_packet.tv_sec >= 0) && (packet->time_relative_to_first_packet.tv_usec >= 0), - "Bad timing result time_relative_to_first_packet=%d.%d packet num %u, original frame number %u", - packet->time_relative_to_first_packet.tv_sec, - packet->time_relative_to_first_packet.tv_usec, - packet->packet_number, - packet->original_frame_number); - AssertFatal((packet->time_relative_to_last_received_packet.tv_sec >= 0) && (packet->time_relative_to_last_received_packet.tv_usec >= 0), - "Bad timing result time_relative_to_last_received_packet=%d.%d packet num %u, original frame number %u", - packet->time_relative_to_last_received_packet.tv_sec, - packet->time_relative_to_last_received_packet.tv_usec, - packet->packet_number, - packet->original_frame_number); - AssertFatal((packet->time_relative_to_last_sent_packet.tv_sec >= 0) && (packet->time_relative_to_last_sent_packet.tv_usec >= 0), - "Bad timing result time_relative_to_last_sent_packet=%d.%d packet num %u, original frame number %u", - packet->time_relative_to_last_sent_packet.tv_sec, - packet->time_relative_to_last_sent_packet.tv_usec, - packet->packet_number, - packet->original_frame_number); -// fprintf(stdout, "\tpacket num %u, original frame number %u time_relative_to_first_packet=%d.%d\n", -// packet->packet_number, -// packet->original_frame_number, -// packet->time_relative_to_first_packet.tv_sec, -// packet->time_relative_to_first_packet.tv_usec); -// fprintf(stdout, "\tpacket num %u, original frame number %u time_relative_to_last_received_packet=%d.%d\n", -// packet->packet_number, -// packet->original_frame_number, -// packet->time_relative_to_last_received_packet.tv_sec, -// packet->time_relative_to_last_received_packet.tv_usec); -// fprintf(stdout, "\tpacket num %u, original frame number %u time_relative_to_last_sent_packet=%d.%d\n", -// packet->packet_number, -// packet->original_frame_number, -// packet->time_relative_to_last_sent_packet.tv_sec, -// packet->time_relative_to_last_sent_packet.tv_usec); - - if ((shift->single) && (shift->frame_number == packet->original_frame_number)) { - struct timeval t_offset = { .tv_sec = shift->shift_seconds, .tv_usec = shift->shift_microseconds }; - et_packet_shift_timing(packet, &t_offset); - next_packet = packet->next; - if (next_packet) { - t_offset.tv_sec = -t_offset.tv_sec; - t_offset.tv_usec = -t_offset.tv_usec; - - if (packet->action == ET_PACKET_ACTION_S1C_SEND) { - timeval_add(&next_packet->time_relative_to_last_sent_packet, &next_packet->time_relative_to_last_sent_packet, &t_offset); - } else if (packet->action == ET_PACKET_ACTION_S1C_RECEIVE) { - timeval_add(&next_packet->time_relative_to_last_received_packet, &next_packet->time_relative_to_last_received_packet, &t_offset); - } - } - } - if ((0 == shift->single) && (shift->frame_number == packet->original_frame_number)) { - shift_all_packets.tv_sec = shift->shift_seconds; - shift_all_packets.tv_usec = shift->shift_microseconds; - timeval_add(&packet->time_relative_to_first_packet, &packet->time_relative_to_first_packet, &shift_all_packets); - fprintf(stdout, "\tpacket num %u, now original frame number %u time_relative_to_first_packet=%d.%d\n", - packet->packet_number, - packet->original_frame_number, - packet->time_relative_to_first_packet.tv_sec, - packet->time_relative_to_first_packet.tv_usec); - AssertFatal((packet->time_relative_to_first_packet.tv_sec >= 0) && (packet->time_relative_to_first_packet.tv_usec >= 0), - "Bad timing result time_relative_to_first_packet=%d.%d packet num %u, original frame number %u", - packet->time_relative_to_first_packet.tv_sec, - packet->time_relative_to_first_packet.tv_usec, - packet->packet_number, - packet->original_frame_number); - } else if ((0 == shift->single) && (shift->frame_number < packet->original_frame_number)) { - timeval_add(&packet->time_relative_to_first_packet, &packet->time_relative_to_first_packet, &shift_all_packets); - fprintf(stdout, "\tpacket num %u, now original frame number %u time_relative_to_first_packet=%d.%d\n", - packet->packet_number, - packet->original_frame_number, - packet->time_relative_to_first_packet.tv_sec, - packet->time_relative_to_first_packet.tv_usec); - AssertFatal((packet->time_relative_to_first_packet.tv_sec >= 0) && (packet->time_relative_to_first_packet.tv_usec >= 0), - "Bad timing result time_relative_to_first_packet=%d.%d packet num %u, original frame number %u", - packet->time_relative_to_first_packet.tv_sec, - packet->time_relative_to_first_packet.tv_usec, - packet->packet_number, - packet->original_frame_number); - } - packet = packet->next; - } - shift = shift->next; - } - // now recompute time_relative_to_last_received_packet, time_relative_to_last_sent_packet - packet = scenario->list_packet; - while (packet) { - if (first_packet > 0) { - initial_time = packet->time_relative_to_first_packet; - packet->time_relative_to_first_packet.tv_sec = 0; - packet->time_relative_to_first_packet.tv_usec = 0; - first_packet = 0; - } else { - timersub(&packet->time_relative_to_first_packet, &initial_time, - &packet->time_relative_to_first_packet); - } - if (packet->action == ET_PACKET_ACTION_S1C_SEND) { - if (first_sent_packet > 0) { - relative_last_sent_packet = packet->time_relative_to_first_packet; - packet->time_relative_to_last_sent_packet.tv_sec = 0; - packet->time_relative_to_last_sent_packet.tv_usec = 0; - first_sent_packet = 0; - } else { - timersub(&packet->time_relative_to_first_packet, &relative_last_sent_packet, - &packet->time_relative_to_last_sent_packet); - relative_last_sent_packet = packet->time_relative_to_first_packet; - } - if (first_received_packet > 0) { - packet->time_relative_to_last_received_packet.tv_sec = 0; - packet->time_relative_to_last_received_packet.tv_usec = 0; - } else { - timersub(&packet->time_relative_to_first_packet, &relative_last_received_packet, - &packet->time_relative_to_last_received_packet); - } - } else if (packet->action == ET_PACKET_ACTION_S1C_RECEIVE) { - if (first_received_packet > 0) { - relative_last_received_packet.tv_sec = packet->time_relative_to_first_packet.tv_sec; - relative_last_received_packet.tv_usec = packet->time_relative_to_first_packet.tv_usec; - packet->time_relative_to_last_received_packet.tv_sec = 0; - packet->time_relative_to_last_received_packet.tv_usec = 0; - first_received_packet = 0; - } else { - timersub(&packet->time_relative_to_first_packet, &relative_last_received_packet, - &packet->time_relative_to_last_received_packet); - relative_last_received_packet = packet->time_relative_to_first_packet; - } - if (first_sent_packet > 0) { - packet->time_relative_to_last_sent_packet.tv_sec = 0; - packet->time_relative_to_last_sent_packet.tv_usec = 0; - } else { - timersub(&packet->time_relative_to_first_packet, &relative_last_sent_packet, - &packet->time_relative_to_last_sent_packet); - } - } - packet = packet->next; - } - //et_display_scenario(scenario); - - // create SCTP ITTI task: same as eNB code - if (itti_create_task (TASK_SCTP, sctp_eNB_task, NULL) < 0) { - LOG_E(SCTP, "Create task for SCTP failed\n"); - return -1; - } - - // create S1AP ITTI task: not as same as eNB code - if (itti_create_task (TASK_S1AP, et_s1ap_eNB_task, NULL) < 0) { - LOG_E(S1AP, "Create task for S1AP failed\n"); - return -1; - } - - // create ENB_APP ITTI task: not as same as eNB code - if (itti_create_task (TASK_ENB_APP, et_eNB_app_task, scenario) < 0) { - LOG_E(ENB_APP, "Create task for ENB_APP failed\n"); - return -1; - } - - event.code = ET_EVENT_INIT; - event.u.init.scenario = scenario; - et_scenario_fsm_notify_event(event); - - - return 0; -} - -//------------------------------------------------------------------------------ -static void et_usage ( - int argc, - char *argv[]) -//------------------------------------------------------------------------------ -{ - fprintf (stdout, "Please report any bug to: %s\n",PACKAGE_BUGREPORT); - fprintf (stdout, "Usage: %s [options]\n\n", argv[0]); - fprintf (stdout, "\n"); - fprintf (stdout, "\t-d | --test-dir Directory where a set of files related to a particular test are located\n"); - fprintf (stdout, "\t-c | --enb-conf-file Provide an eNB config file, valid for the testbed\n"); - fprintf (stdout, "\t-D | --delay-on-exit Wait delay-in-sec before exiting\n"); - fprintf (stdout, "\t-f | --shift-packet Shift the timing of a packet'\n"); - fprintf (stdout, "\t-F | --shift-packets Shift the timing of packets starting at frame 'frame' included\n"); - fprintf (stdout, "\t-m | --max-speed Play scenario as fast as possible without respecting frame timings\n"); - fprintf (stdout, "\t-s | --scenario File name (with no path) of a test scenario that has to be replayed ()\n"); - fprintf (stdout, "\n"); - fprintf (stdout, "Other options:\n"); - fprintf (stdout, "\t-h | --help Print this help and return\n"); - fprintf (stdout, "\t-v | --version Print informations about the version of this executable\n"); - fprintf (stdout, "\n"); -} - -//------------------------------------------------------------------------------ -int -et_config_parse_opt_line ( - int argc, - char *argv[], - char **et_dir_name, - char **scenario_file_name, - char **enb_config_file_name, - shift_packet_t **shifts, - int *delay_on_exit) -//------------------------------------------------------------------------------ -{ - int option = 0; - int rv = 0; - shift_packet_t *shift = NULL; - - enum long_option_e { - LONG_OPTION_START = 0x100, /* Start after regular single char options */ - LONG_OPTION_ENB_CONF_FILE, - LONG_OPTION_SCENARIO_FILE, - LONG_OPTION_MAX_SPEED, - LONG_OPTION_TEST_DIR, - LONG_OPTION_DELAY_EXIT, - LONG_OPTION_SHIFT_PACKET, - LONG_OPTION_SHIFT_PACKETS, - LONG_OPTION_HELP, - LONG_OPTION_VERSION - }; - - static struct option long_options[] = { - {"enb-conf-file", required_argument, 0, LONG_OPTION_ENB_CONF_FILE}, - {"scenario ", required_argument, 0, LONG_OPTION_SCENARIO_FILE}, - {"max-speed ", no_argument, 0, LONG_OPTION_MAX_SPEED}, - {"test-dir", required_argument, 0, LONG_OPTION_TEST_DIR}, - {"delay-on-exit", required_argument, 0, LONG_OPTION_DELAY_EXIT}, - {"shift-packet", required_argument, 0, LONG_OPTION_SHIFT_PACKET}, - {"shift-packets", required_argument, 0, LONG_OPTION_SHIFT_PACKETS}, - {"help", no_argument, 0, LONG_OPTION_HELP}, - {"version", no_argument, 0, LONG_OPTION_VERSION}, - {NULL, 0, NULL, 0} - }; - - /* - * Parsing command line - */ - while ((option = getopt_long (argc, argv, "vhmc:s:d:f:F", long_options, NULL)) != -1) { - switch (option) { - case LONG_OPTION_ENB_CONF_FILE: - case 'c': - if (optarg) { - *enb_config_file_name = strdup(optarg); - printf("eNB config file name is %s\n", *enb_config_file_name); - rv |= PLAY_SCENARIO; - } - break; - - case LONG_OPTION_SCENARIO_FILE: - case 's': - if (optarg) { - *scenario_file_name = strdup(optarg); - printf("Scenario file name is %s\n", *scenario_file_name); - rv |= PLAY_SCENARIO; - } - break; - - case LONG_OPTION_TEST_DIR: - case 'd': - if (optarg) { - *et_dir_name = strdup(optarg); - if (is_file_exists(*et_dir_name, "test dirname") != GS_IS_DIR) { - fprintf(stderr, "Please provide a valid test dirname, %s is not a valid directory name\n", *et_dir_name); - exit(1); - } - printf("Test dir name is %s\n", *et_dir_name); - } - break; - - case LONG_OPTION_DELAY_EXIT: - case 'D': - if (optarg) { - delay_on_exit = atoi(optarg); - if (0 > delay_on_exit) { - fprintf(stderr, "Please provide a valid -D/--delay-on-exit argument, %s is not a valid value\n", delay_on_exit); - exit(1); - } - printf("Delay on exit is %d\n", (int) delay_on_exit); - } - break; - - - case LONG_OPTION_SHIFT_PACKET: - case 'f': - if (optarg) { - if (NULL == *shifts) { - shift = calloc(1, sizeof (*shift)); - *shifts = shift; - } else { - shift->next = calloc(1, sizeof (*shift)); - shift = shift->next; - } - shift->single = 1; - printf("Arg Shift packet %s\n", optarg); - et_get_shift_arg(optarg, shift); - } - break; - - case LONG_OPTION_SHIFT_PACKETS: - case 'F': - if (optarg) { - if (NULL == *shifts) { - shift = calloc(1, sizeof (*shift)); - *shifts = shift; - } else { - shift->next = calloc(1, sizeof (*shift)); - shift = shift->next; - } - et_get_shift_arg(optarg, shift); - printf("Arg Shift packets %s\n", optarg); - } - break; - - case LONG_OPTION_MAX_SPEED: - case 'm': - g_max_speed = 1; - break; - - case LONG_OPTION_VERSION: - case 'v': - printf("Version %s\n", PACKAGE_VERSION); - exit (0); - break; - - case LONG_OPTION_HELP: - case 'h': - default: - et_usage (argc, argv); - exit (0); - } - } - if (NULL == *et_dir_name) { - fprintf(stderr, "Please provide a valid test dirname\n"); - exit(1); - } - if (chdir(*et_dir_name) != 0) { - fprintf(stderr, "ERROR: chdir %s returned %s\n", *et_dir_name, strerror(errno)); - exit(1); - } - if (rv & PLAY_SCENARIO) { - if (NULL == *enb_config_file_name) { - fprintf(stderr, "ERROR: please provide the original eNB config file name that should be in %s\n", *et_dir_name); - } - if (is_file_exists(*enb_config_file_name, "eNB config file") != GS_IS_FILE) { - fprintf(stderr, "ERROR: original eNB config file name %s is not found in dir %s\n", *enb_config_file_name, *et_dir_name); - } - et_enb_config_init(*enb_config_file_name); - - if (NULL == *scenario_file_name) { - fprintf(stderr, "ERROR: please provide the scenario file name that should be in %s\n", *et_dir_name); - } - if (is_file_exists(*scenario_file_name, "Scenario file") != GS_IS_FILE) { - fprintf(stderr, "ERROR: Scenario file name %s is not found in dir %s\n", *scenario_file_name, *et_dir_name); - } - } - return rv; -} - -//------------------------------------------------------------------------------ -int main( int argc, char **argv ) -//------------------------------------------------------------------------------ -{ - int actions = 0; - char *et_dir_name = NULL; - char *scenario_file_name = NULL; - char *enb_config_file_name = NULL; - struct shift_packet_s *shifts = NULL; - int ret = 0; - int delay_on_exit = 0; - et_scenario_t *scenario = NULL; - char play_scenario_filename[NAME_MAX]; - - memset(play_scenario_filename, 0, sizeof(play_scenario_filename)); - - // logging - logInit(); - set_glog(LOG_TRACE, LOG_MED); - - itti_init(TASK_MAX, tasks_info); - - set_comp_log(ENB_APP, LOG_TRACE, LOG_MED, 1); - set_comp_log(S1AP, LOG_TRACE, LOG_MED, 1); - set_comp_log(SCTP, LOG_TRACE, LOG_FULL, 1); - asn_debug = 0; - asn1_xer_print = 1; - - //parameters - actions = et_config_parse_opt_line (argc, argv, &et_dir_name, &scenario_file_name, &enb_config_file_name, &shifts, &delay_on_exit); //Command-line options - if (actions & PLAY_SCENARIO) { - if (et_generate_xml_scenario(et_dir_name, scenario_file_name,enb_config_file_name, play_scenario_filename) == 0) { - if (NULL != (scenario = et_generate_scenario(play_scenario_filename))) { - ret = et_play_scenario(scenario, shifts); - } else { - fprintf(stderr, "ERROR: Could not generate scenario from tsml file\n"); - ret = -1; - } - } else { - fprintf(stderr, "ERROR: Could not generate tsml scenario from xml file\n"); - ret = -1; - } - et_free_pointer(et_dir_name); - et_free_pointer(scenario_file_name); - et_free_pointer(enb_config_file_name); - } - itti_wait_tasks_end(); - if (0 < delay_on_exit) { - sleep(delay_on_exit); - } - return ret; -} - - diff --git a/openair3/TEST/EPC_TEST/play_scenario.h b/openair3/TEST/EPC_TEST/play_scenario.h deleted file mode 100644 index 6a2264f8ba..0000000000 --- a/openair3/TEST/EPC_TEST/play_scenario.h +++ /dev/null @@ -1,499 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.1 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -/* - play_scenario.h - ------------------- - AUTHOR : Lionel GAUTHIER - COMPANY : EURECOM - EMAIL : Lionel.Gauthier@eurecom.fr -*/ - -#ifndef PLAY_SCENARIO_H_ -#define PLAY_SCENARIO_H_ -# include -# include -# include -# include -# include - -#include "S1AP-PDU.h" -#include "s1ap_ies_defs.h" -#include "play_scenario_s1ap_eNB_defs.h" -#include "hashtable.h" -#include "asn_compare.h" - -#define ET_XPATH_EXPRESSION_MAX_LENGTH 400 - - -// powers of 2 -#define ET_BIT_MASK_MATCH_SCTP_STREAM 1 -#define ET_BIT_MASK_MATCH_SCTP_SSN 2 -//#define ET_BIT_MASK_MATCH_S1AP_ 2 - -#define MAX_ENB 16 - -#define ENB_CONFIG_STRING_ACTIVE_ENBS "Active_eNBs" - -#define ENB_CONFIG_STRING_ENB_LIST "eNBs" -#define ENB_CONFIG_STRING_ENB_ID "eNB_ID" -#define ENB_CONFIG_STRING_CELL_TYPE "cell_type" -#define ENB_CONFIG_STRING_ENB_NAME "eNB_name" - -#define ENB_CONFIG_STRING_TRACKING_AREA_CODE "tracking_area_code" -#define ENB_CONFIG_STRING_MOBILE_COUNTRY_CODE "mobile_country_code" -#define ENB_CONFIG_STRING_MOBILE_NETWORK_CODE "mobile_network_code" - - -#define ENB_CONFIG_STRING_MME_IP_ADDRESS "mme_ip_address" -#define ENB_CONFIG_STRING_MME_IPV4_ADDRESS "ipv4" -#define ENB_CONFIG_STRING_MME_IPV6_ADDRESS "ipv6" -#define ENB_CONFIG_STRING_MME_IP_ADDRESS_ACTIVE "active" -#define ENB_CONFIG_STRING_MME_IP_ADDRESS_PREFERENCE "preference" - -#define ENB_CONFIG_STRING_SCTP_CONFIG "SCTP" -#define ENB_CONFIG_STRING_SCTP_INSTREAMS "SCTP_INSTREAMS" -#define ENB_CONFIG_STRING_SCTP_OUTSTREAMS "SCTP_OUTSTREAMS" - -#define ENB_CONFIG_STRING_NETWORK_INTERFACES_CONFIG "NETWORK_INTERFACES" -#define ENB_CONFIG_STRING_ENB_INTERFACE_NAME_FOR_S1_MME "ENB_INTERFACE_NAME_FOR_S1_MME" -#define ENB_CONFIG_STRING_ENB_IPV4_ADDRESS_FOR_S1_MME "ENB_IPV4_ADDRESS_FOR_S1_MME" -#define ENB_CONFIG_STRING_ENB_INTERFACE_NAME_FOR_S1U "ENB_INTERFACE_NAME_FOR_S1U" -#define ENB_CONFIG_STRING_ENB_IPV4_ADDR_FOR_S1U "ENB_IPV4_ADDRESS_FOR_S1U" -#define ENB_CONFIG_STRING_ENB_PORT_FOR_S1U "ENB_PORT_FOR_S1U" - - -typedef struct shift_packet_s { - unsigned int frame_number; // original frame number - int shift_seconds; - int shift_microseconds; - int single; // shift timing only for this packet (not also following packets) - struct shift_packet_s *next; -} shift_packet_t; - - -typedef struct mme_ip_address_s { - unsigned ipv4:1; - unsigned ipv6:1; - unsigned active:1; - char *ipv4_address; - char *ipv6_address; -} mme_ip_address_t; - -#define IPV4_STR_ADDR_TO_INT_NWBO(AdDr_StR,NwBo,MeSsAgE ) do {\ - struct in_addr inp;\ - if ( inet_aton(AdDr_StR, &inp ) < 0 ) {\ - AssertFatal (0, MeSsAgE);\ - } else {\ - NwBo = inp.s_addr;\ - }\ - } while (0); - - -typedef struct Enb_properties_s { - /* Unique eNB_id to identify the eNB within EPC. - * For macro eNB ids this field should be 20 bits long. - * For home eNB ids this field should be 28 bits long. - */ - uint32_t eNB_id; - - /* The type of the cell */ - enum cell_type_e cell_type; - - /* Optional name for the cell - * NOTE: the name can be NULL (i.e no name) and will be cropped to 150 - * characters. - */ - char *eNB_name; - - /* Tracking area code */ - uint16_t tac; - - /* Mobile Country Code - * Mobile Network Code - */ - uint16_t mcc; - uint16_t mnc; - uint8_t mnc_digit_length; - - - - /* Physical parameters */ - - int16_t Nid_cell[1+MAX_NUM_CCs];// for testing, change later - /* Nb of MME to connect to */ - uint8_t nb_mme; - /* List of MME to connect to */ - mme_ip_address_t mme_ip_address[S1AP_MAX_NB_MME_IP_ADDRESS]; - - int sctp_in_streams; - int sctp_out_streams; - - char *enb_interface_name_for_S1U; - in_addr_t enb_ipv4_address_for_S1U; - tcp_udp_port_t enb_port_for_S1U; - - char *enb_interface_name_for_S1_MME; - in_addr_t enb_ipv4_address_for_S1_MME; - -} Enb_properties_t; - -typedef struct Enb_properties_array_s { - int number; - Enb_properties_t *properties[MAX_ENB]; -} Enb_properties_array_t; - -# define ET_ENB_REGISTER_RETRY_DELAY 3 -# define ET_FSM_STATE_WAITING_RX_EVENT_DELAY_SEC 15 - -typedef enum { - ET_PACKET_STATUS_START = 0, - ET_PACKET_STATUS_NONE = ET_PACKET_STATUS_START, - ET_PACKET_STATUS_NOT_TAKEN_IN_ACCOUNT, - ET_PACKET_STATUS_SCHEDULED_FOR_SENDING, - ET_PACKET_STATUS_SENT, - ET_PACKET_STATUS_SCHEDULED_FOR_RECEIVING, - ET_PACKET_STATUS_RECEIVED, - ET_PACKET_STATUS_END -} et_packet_status_t; - -typedef enum { - ET_FSM_STATE_START = 0, - ET_FSM_STATE_NULL = ET_FSM_STATE_START, - ET_FSM_STATE_CONNECTING_S1C, - ET_FSM_STATE_WAITING_RX_EVENT, - ET_FSM_STATE_WAITING_TX_EVENT, - ET_FSM_STATE_RUNNING, - ET_FSM_STATE_END -} et_fsm_state_t; - -enum COMPARE_ERR_CODE_e; - -typedef enum { - ET_ERROR_MATCH_START = COMPARE_ERR_CODE_END, - ET_ERROR_MATCH_PACKET_SCTP_CHUNK_TYPE = ET_ERROR_MATCH_START, - ET_ERROR_MATCH_PACKET_SCTP_PPID, - ET_ERROR_MATCH_PACKET_SCTP_ASSOC_ID, - ET_ERROR_MATCH_PACKET_SCTP_STREAM_ID, - ET_ERROR_MATCH_PACKET_SCTP_SSN, - ET_ERROR_MATCH_PACKET_S1AP_PRESENT, - ET_ERROR_MATCH_PACKET_S1AP_PROCEDURE_CODE, - ET_ERROR_MATCH_PACKET_S1AP_CRITICALITY, - ET_ERROR_MATCH_END -} et_error_match_code_t; - - - - -typedef enum { - ET_PACKET_ACTION_S1C_START = 0, - ET_PACKET_ACTION_S1C_NULL = ET_PACKET_ACTION_S1C_START, - ET_PACKET_ACTION_S1C_SEND, - ET_PACKET_ACTION_S1C_RECEIVE, - ET_PACKET_ACTION_S1C_END -} et_packet_action_t; - -// from kernel source file 3.19/include/linux/sctp.h -typedef enum { - SCTP_CID_DATA = 0, - SCTP_CID_INIT = 1, - SCTP_CID_INIT_ACK = 2, - SCTP_CID_SACK = 3, - SCTP_CID_HEARTBEAT = 4, - SCTP_CID_HEARTBEAT_ACK = 5, - SCTP_CID_ABORT = 6, - SCTP_CID_SHUTDOWN = 7, - SCTP_CID_SHUTDOWN_ACK = 8, - SCTP_CID_ERROR = 9, - SCTP_CID_COOKIE_ECHO = 10, - SCTP_CID_COOKIE_ACK = 11, - SCTP_CID_ECN_ECNE = 12, - SCTP_CID_ECN_CWR = 13, - SCTP_CID_SHUTDOWN_COMPLETE = 14, - - /* AUTH Extension Section 4.1 */ - SCTP_CID_AUTH = 0x0F, - - /* PR-SCTP Sec 3.2 */ - SCTP_CID_FWD_TSN = 0xC0, - - /* Use hex, as defined in ADDIP sec. 3.1 */ - SCTP_CID_ASCONF = 0xC1, - SCTP_CID_ASCONF_ACK = 0x80, -} sctp_cid_t; /* enum */ - -typedef enum { - TEST_S1AP_PDU_TYPE_START = 0, - TEST_S1AP_PDU_TYPE_UNKNOWN = TEST_S1AP_PDU_TYPE_START, - TEST_S1AP_PDU_TYPE_INITIATING, - TEST_S1AP_PDU_TYPE_SUCCESSFUL_OUTCOME, - TEST_S1AP_PDU_TYPE_UNSUCCESSFUL_OUTCOME, - TEST_S1AP_PDU_TYPE_END -} et_s1ap_pdu_type_t; - - -typedef struct et_s1ap_s { - //et_s1ap_pdu_type_t pdu_type; - S1AP_S1AP_PDU_t pdu; // decoded ASN1 C type: choice of initiatingMessage, successfulOutcome, unsuccessfulOutcome - uint16_t xml_stream_pos_offset; - uint16_t binary_stream_pos; - uint16_t binary_stream_allocated_size; - uint8_t *binary_stream; - xmlDocPtr doc; // XML representation of the S1AP PDU -} et_s1ap_t; - - -// from kernel source file 3.19/include/linux/sctp.h, Big Endians -typedef struct sctp_datahdr_s { - uint32_t tsn; - uint16_t stream; - uint16_t ssn; - uint32_t ppid; - uint32_t assoc_id; // filled when running scenario - et_s1ap_t payload; -} sctp_datahdr_t; - -// from kernel source file 3.19/include/linux/sctp.h, Big Endians -typedef struct sctp_inithdr { - uint32_t init_tag; - uint32_t a_rwnd; - uint16_t num_outbound_streams; - uint16_t num_inbound_streams; - uint32_t initial_tsn; - uint8_t params[0]; -} sctp_inithdr_t; - -typedef sctp_inithdr_t sctp_initackhdr_t; - -typedef struct et_sctp_hdr_s { - unsigned int src_port; - unsigned int dst_port; - sctp_cid_t chunk_type; - union { - sctp_datahdr_t data_hdr; - sctp_inithdr_t init_hdr; - sctp_initackhdr_t init_ack_hdr; - } u; -} et_sctp_hdr_t; - -typedef struct et_ip_s { - unsigned int address_family; // AF_INET, AF_INET6 - union { - struct in6_addr ipv6; - in_addr_t ipv4; - } address; - char str[INET6_ADDRSTRLEN+1]; -} et_ip_t; - -typedef struct et_ip_hdr_s { - et_ip_t src; - et_ip_t dst; -} et_ip_hdr_t; - -typedef struct et_packet_s { - et_packet_action_t action; - struct timeval time_relative_to_first_packet; - struct timeval time_relative_to_last_sent_packet; - struct timeval time_relative_to_last_received_packet; - unsigned int original_frame_number; - unsigned int packet_number; - instance_t enb_instance; - et_ip_hdr_t ip_hdr; - et_sctp_hdr_t sctp_hdr; - struct et_packet_s *next; - - //scenario running vars - et_packet_status_t status; - long timer_id; // ITTI timer id for waiting rx packets - struct timeval timestamp_packet; // timestamp when rx or tx packet -} et_packet_t; - - -typedef struct sctp_epoll_s { - /* Array of events monitored by the task. - * By default only one fd is monitored (the one used to received messages - * from other tasks). - * More events can be suscribed later by the task itself. - */ - struct epoll_event *events; - - int epoll_nb_events; - -} thread_desc_t; - -typedef struct et_scenario_s { - xmlChar *name; - et_packet_t *list_packet; - //-------------------------- - // playing scenario - //-------------------------- - Enb_properties_array_t *enb_properties; - uint32_t register_enb_pending; - uint32_t registered_enb; - long enb_register_retry_timer_id; - - - hash_table_t *hash_mme2association_id; - hash_table_t *hash_old_ue_mme_id2ue_mme_id; - struct timeval time_last_tx_packet; // Time last sent packet - struct timeval time_last_rx_packet; // Time last packet received with all previous scenario RX packet received. - et_packet_t *last_rx_packet; // Last packet received with all previous scenario RX packet received. - et_packet_t *last_tx_packet; // Last sent packet - et_packet_t *next_packet; // Next packet to be handled in the scenario (RX or TX packet) - - int timer_count; -} et_scenario_t; - - -typedef enum { - ET_EVENT_START = 0, - ET_EVENT_INIT = ET_EVENT_START, - ET_EVENT_S1C_CONNECTED, - ET_EVENT_RX_SCTP_EVENT, - ET_EVENT_RX_S1AP, - ET_EVENT_RX_PACKET_TIME_OUT, - ET_EVENT_TX_TIMED_PACKET, - ET_EVENT_TICK, - ET_EVENT_END -} et_event_code_t; - -typedef struct et_event_init_s { - et_scenario_t *scenario; -} et_event_init_t; - -typedef struct et_event_s1ap_data_ind_s { - sctp_datahdr_t sctp_datahdr; -} et_event_s1ap_data_ind_t; - -typedef struct et_event_s1ap_data_req_s { - -} et_event_s1ap_data_req_t; - -typedef struct et_event_s { - et_event_code_t code; - union { - et_event_init_t init; - et_event_s1ap_data_ind_t s1ap_data_ind; - et_packet_t *tx_timed_packet; - et_packet_t *rx_packet_time_out; - } u; -} et_event_t; - -inline void et_free_pointer(void *p) {if (NULL != p) {free(p);}}; - -//------------------------- -void et_free_packet(et_packet_t *packet); -void et_free_scenario(et_scenario_t *scenario); -//------------------------- -void et_display_packet_s1ap_data(const et_s1ap_t *const s1ap); -void et_display_packet_sctp_init(const sctp_inithdr_t *const sctp); -void et_display_packet_sctp_initack(const sctp_initackhdr_t *const sctp); -void et_display_packet_sctp_data(const sctp_datahdr_t *const sctp); -void et_display_packet_sctp(const et_sctp_hdr_t *const sctp); -void et_display_packet_ip(const et_ip_hdr_t *const ip); -void et_display_packet(const et_packet_t *const packet); -void et_display_scenario(const et_scenario_t *const scenario); -//------------------------- -int et_s1ap_decode_initiating_message(s1ap_message *message, S1AP_InitiatingMessage_t *initiating_p); -int et_s1ap_decode_successful_outcome(s1ap_message *message, S1AP_SuccessfulOutcome_t *successfullOutcome_p); -int et_s1ap_decode_unsuccessful_outcome(s1ap_message *message, S1AP_UnsuccessfulOutcome_t *unSuccessfullOutcome_p); -int et_s1ap_decode_pdu(S1AP_PDU_t *const pdu, s1ap_message *const message, const uint8_t *const buffer, const uint32_t length); -void et_decode_s1ap(et_s1ap_t *const s1ap); -//------------------------- -int et_s1ap_eNB_compare_assoc_id( struct s1ap_eNB_mme_data_s *p1, struct s1ap_eNB_mme_data_s *p2); -uint32_t et_s1ap_generate_eNB_id(void); -uint16_t et_s1ap_eNB_fetch_add_global_cnx_id(void); -void et_s1ap_eNB_prepare_internal_data(void); -void et_s1ap_eNB_insert_new_instance(s1ap_eNB_instance_t *new_instance_p); -struct s1ap_eNB_mme_data_s *et_s1ap_eNB_get_MME(s1ap_eNB_instance_t *instance_p,int32_t assoc_id, uint16_t cnx_id); -s1ap_eNB_instance_t *et_s1ap_eNB_get_instance(instance_t instance); -void et_s1ap_eNB_itti_send_sctp_data_req(instance_t instance, int32_t assoc_id, uint8_t *buffer,uint32_t buffer_length, uint16_t stream); -int et_handle_s1ap_mismatch_mme_ue_s1ap_id(et_packet_t *const spacket, et_packet_t *const rx_packet); -asn_comp_rval_t *et_s1ap_is_matching(et_s1ap_t *const s1ap1, et_s1ap_t *const s1ap2, const uint32_t constraints); -et_packet_t *et_build_packet_from_s1ap_data_ind(et_event_s1ap_data_ind_t *const s1ap_data_ind); -int et_scenario_set_packet_received(et_packet_t *const packet); -int et_s1ap_process_rx_packet(et_event_s1ap_data_ind_t *const sctp_data_ind); -void et_s1ap_eNB_handle_sctp_data_ind(sctp_data_ind_t *const sctp_data_ind); -void et_s1ap_eNB_register_mme(s1ap_eNB_instance_t *instance_p, - net_ip_address_t *mme_ip_address, - net_ip_address_t *local_ip_addr, - uint16_t in_streams, - uint16_t out_streams); -void et_s1ap_handle_s1_setup_message(s1ap_eNB_mme_data_t *mme_desc_p, int sctp_shutdown); -void et_s1ap_eNB_handle_register_eNB(instance_t instance, s1ap_register_enb_req_t *s1ap_register_eNB); -void et_s1ap_eNB_handle_sctp_association_resp(instance_t instance, sctp_new_association_resp_t *sctp_new_association_resp); -void *et_s1ap_eNB_task(void *arg); -//------------------------- -int et_generate_xml_scenario( - const char const *xml_in_dir_name, - const char const *xml_in_scenario_filename, - const char const *enb_config_filename, - char const *tsml_out_scenario_filename); -//------------------------- -void timeval_add (struct timeval *const result, const struct timeval *const a, const struct timeval *const b); -int timeval_subtract (struct timeval *const result, struct timeval *const a, struct timeval *const b); -void et_scenario_wait_rx_packet(et_packet_t *const packet); -void et_scenario_schedule_tx_packet(et_packet_t *packet); -et_fsm_state_t et_scenario_fsm_notify_event_state_running(et_event_t event); -et_fsm_state_t et_scenario_fsm_notify_event_state_waiting_tx(et_event_t event); -et_fsm_state_t et_scenario_fsm_notify_event_state_waiting_rx(et_event_t event); -et_fsm_state_t et_scenario_fsm_notify_event_state_connecting_s1c(et_event_t event); -et_fsm_state_t et_scenario_fsm_notify_event_state_null(et_event_t event); -et_fsm_state_t et_scenario_fsm_notify_event(et_event_t event); -//------------------------- -void et_parse_s1ap(xmlDocPtr doc, const xmlNode const *s1ap_node, et_s1ap_t *const s1ap); -void et_parse_sctp_data_chunk(xmlDocPtr doc, const xmlNode const *sctp_node, sctp_datahdr_t *const sctp_hdr); -void et_parse_sctp_init_chunk(xmlDocPtr doc, const xmlNode const *sctp_node, sctp_inithdr_t *const sctp_hdr); -void et_parse_sctp_init_ack_chunk(xmlDocPtr doc, const xmlNode const *sctp_node, sctp_initackhdr_t *const sctp_hdr); -void et_parse_sctp(xmlDocPtr doc, const xmlNode const *sctp_node, et_sctp_hdr_t *const sctp_hdr); -et_packet_t *et_parse_xml_packet(xmlDocPtr doc, xmlNodePtr node); -et_scenario_t *et_generate_scenario(const char *const et_scenario_filename); -//------------------------- -asn_comp_rval_t *et_s1ap_ies_is_matching(const S1AP_PDU_PR present, s1ap_message *const m1, s1ap_message *const m2, const uint32_t constraints); -void update_xpath_node_mme_ue_s1ap_id(et_s1ap_t *const s1ap, xmlNode *node, const S1AP_MME_UE_S1AP_ID_t new_id); -void update_xpath_nodes_mme_ue_s1ap_id(et_s1ap_t *const s1ap_payload, xmlNodeSetPtr nodes, const S1AP_MME_UE_S1AP_ID_t new_id); -int et_s1ap_update_mme_ue_s1ap_id(et_packet_t *const packet, const S1AP_MME_UE_S1AP_ID_t old_id, const S1AP_MME_UE_S1AP_ID_t new_id); -//------------------------- -asn_comp_rval_t *et_sctp_data_is_matching(sctp_datahdr_t *const sctp1, sctp_datahdr_t *const sctp2, const uint32_t constraints); -asn_comp_rval_t *et_sctp_is_matching(et_sctp_hdr_t *const sctp1, et_sctp_hdr_t *const sctp2, const uint32_t constraints); -//------------------------------------------------------------------------------ -void et_print_hex_octets(const unsigned char *const byte_stream, const unsigned long int num); -int et_is_file_exists ( const char const *file_nameP, const char const *file_roleP); -int et_strip_extension( char *in_filename); -void et_get_shift_arg( char *line_argument, shift_packet_t *const shift); -int et_split_path ( char *pathP, char *** resP); -void et_display_node ( xmlNodePtr node, unsigned int indent); -void et_display_tree ( xmlNodePtr node, unsigned int indent); -char *et_ip2ip_str(const et_ip_t *const ip); -int et_compare_et_ip_to_net_ip_address(const et_ip_t *const ip, const net_ip_address_t *const net_ip); -int et_hex2data(unsigned char *const data, const unsigned char *const hexstring, const unsigned int len); -sctp_cid_t et_chunk_type_str2cid(const xmlChar *const chunk_type_str); -const char *const et_chunk_type_cid2str(const sctp_cid_t chunk_type); -const char *const et_error_match2str(const int err); -et_packet_action_t et_action_str2et_action_t(const xmlChar *const action); -void et_ip_str2et_ip(const xmlChar *const ip_str, et_ip_t *const ip); -void et_enb_config_init(const char const *lib_config_file_name_pP); -const Enb_properties_array_t *et_enb_config_get(void); -void et_eNB_app_register(const Enb_properties_array_t *enb_properties); -void *et_eNB_app_task(void *args_p); -int et_play_scenario(et_scenario_t *const scenario, const struct shift_packet_s *shifts); - -#endif /* PLAY_SCENARIO_H_ */ diff --git a/openair3/TEST/EPC_TEST/play_scenario_decode.c b/openair3/TEST/EPC_TEST/play_scenario_decode.c deleted file mode 100644 index f6b983bf73..0000000000 --- a/openair3/TEST/EPC_TEST/play_scenario_decode.c +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.1 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -/* - play_scenario_decode.c - ------------------- - AUTHOR : Lionel GAUTHIER - COMPANY : EURECOM - EMAIL : Lionel.Gauthier@eurecom.fr - */ - -#include "intertask_interface.h" -#include "platform_types.h" -#include "s1ap_eNB_decoder.h" -#include "assertions.h" -#include "play_scenario.h" - -//------------------------------------------------------------------------------ -int et_s1ap_decode_pdu(S1AP_PDU_t *const pdu, const uint8_t *const buffer, const uint32_t length) -{ - asn_dec_rval_t dec_ret; - - DevAssert(buffer != NULL); - - memset((void *)pdu, 0, sizeof(S1AP_S1AP_PDU_t)); - dec_ret = aper_decode(NULL, - &asn_DEF_S1AP_S1AP_PDU, - (void **)&pdu, - buffer, - length, - 0, - 0); - - if (dec_ret.code != RC_OK) { - S1AP_ERROR("Failed to decode pdu\n"); - return -1; - } - - return dec_ret.code; -} - -//------------------------------------------------------------------------------ -void et_decode_s1ap(et_s1ap_t *const s1ap) -{ - if (NULL != s1ap) { - if (et_s1ap_decode_pdu(&s1ap->pdu, s1ap->binary_stream, s1ap->binary_stream_allocated_size) < 0) { - AssertFatal (0, "ERROR %s() Cannot decode S1AP message!\n", __FUNCTION__); - } - } -} diff --git a/openair3/TEST/EPC_TEST/play_scenario_display.c b/openair3/TEST/EPC_TEST/play_scenario_display.c deleted file mode 100644 index b29c0758c4..0000000000 --- a/openair3/TEST/EPC_TEST/play_scenario_display.c +++ /dev/null @@ -1,348 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.1 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -/* - play_scenario_display.c - ------------------- - AUTHOR : Lionel GAUTHIER - COMPANY : EURECOM - EMAIL : Lionel.Gauthier@eurecom.fr - */ -#include -#include - -#include "intertask_interface.h" -#include "platform_types.h" -#include "assertions.h" -#include "s1ap_eNB_decoder.h" -#include "play_scenario.h" -//----------------------------------------------------------------------------- -void et_print_hex_octets(const unsigned char *const byte_stream, const unsigned long int num) -{ - unsigned long octet_index = 0; - - if (byte_stream == NULL) { - return; - } - - fprintf(stdout, "+-----+-------------------------------------------------+\n"); - fprintf(stdout, "| | 0 1 2 3 4 5 6 7 8 9 a b c d e f |\n"); - fprintf(stdout, "+-----+-------------------------------------------------+\n"); - - for (octet_index = 0; octet_index < num; octet_index++) { - if ((octet_index % 16) == 0) { - if (octet_index != 0) { - fprintf(stdout, " |\n"); - } - - fprintf(stdout, " %04lu |", octet_index); - } - - /* - * Print every single octet in hexadecimal form - */ - fprintf(stdout, " %02x", byte_stream[octet_index]); - /* - * Align newline and pipes according to the octets in groups of 2 - */ - } - - /* - * Append enough spaces and put final pipe - */ - unsigned char index; - - for (index = octet_index; index < 16; ++index) { - fprintf(stdout, " "); - } - - fprintf(stdout, " |\n"); -} - -//------------------------------------------------------------------------------ -void et_display_node(xmlNodePtr node, unsigned int indent) -{ - int i = 0; - - if (node->type == XML_ELEMENT_NODE) { - xmlChar *path = xmlGetNodePath(node); - - for (i=0; ichildren != NULL && node->children->type == XML_TEXT_NODE) { - xmlChar *content = xmlNodeGetContent(node); - printf("%s -> %s\n", path, content); - xmlFree(content); - } else { - printf("%s\n", path); - } - - xmlFree(path); - } -} -//------------------------------------------------------------------------------ -void et_display_tree(xmlNodePtr node, unsigned int indent) -{ - xmlNode *cur_node = NULL; - - for (cur_node = node; cur_node; cur_node = cur_node->next) { - if (cur_node->type == XML_ELEMENT_NODE) { - et_display_node(cur_node, indent); - } - - et_display_tree(cur_node->children, indent++); - } -} -//------------------------------------------------------------------------------ -void et_display_packet_S1AP_data(const et_S1AP_t *const s1ap) -{ - char *message_string = NULL; - - if (s1ap) { - message_string = calloc(20000, sizeof(char)); - AssertFatal (NULL != message_string, "ERROR malloc()failed!\n"); - - switch(s1ap->pdu.present) { - case S1AP_S1AP_PDU_PR_initiatingMessage: - switch(s1ap->pdu.choice.initiatingMessage.procedureCode) { - case S1AP_ProcedureCode_id_downlinkNASTransport: s1ap_xer_print_s1ap_downlinknastransport(s1ap_xer__print2sp, message_string, (S1AP_message *)&s1ap->message); break; - - case S1AP_ProcedureCode_id_InitialContextSetup: s1ap_xer_print_s1ap_initialcontextsetuprequest(s1ap_xer__print2sp, message_string, (S1AP_message *)&s1ap->message); break; - - case S1AP_ProcedureCode_id_UEContextRelease: s1ap_xer_print_s1ap_uecontextreleasecommand(s1ap_xer__print2sp, message_string, (S1AP_message *)&s1ap->message); break; - - case S1AP_ProcedureCode_id_Paging: s1ap_xer_print_s1ap_paging(s1ap_xer__print2sp, message_string, (S1AP_message *)&s1ap->message); break; - - case S1AP_ProcedureCode_id_uplinkNASTransport: s1ap_xer_print_s1ap_uplinknastransport(s1ap_xer__print2sp, message_string, (S1AP_message *)&s1ap->message); break; - - case S1AP_ProcedureCode_id_S1Setup: s1ap_xer_print_s1ap_s1setuprequest(s1ap_xer__print2sp, message_string, (S1AP_message *)&s1ap->message); break; - - case S1AP_ProcedureCode_id_initialUEMessage: s1ap_xer_print_s1ap_initialuemessage(s1ap_xer__print2sp, message_string, (S1AP_message *)&s1ap->message); break; - - case S1AP_ProcedureCode_id_UEContextReleaseRequest: s1ap_xer_print_s1ap_uecontextreleaserequest(s1ap_xer__print2sp, message_string, (S1AP_message *)&s1ap->message); break; - - case S1AP_ProcedureCode_id_UECapabilityInfoIndication:s1ap_xer_print_s1ap_uecapabilityinfoindication(s1ap_xer__print2sp, message_string, (S1AP_message *)&s1ap->message); break; - - case S1AP_ProcedureCode_id_NASNonDeliveryIndication: s1ap_xer_print_s1ap_nasnondeliveryindication_(s1ap_xer__print2sp, message_string, (S1AP_message *)&s1ap->message); break; - - default: - AssertFatal( 0, "Unknown procedure ID (%d) for initiating message\n", - (int)s1ap->pdu.choice.initiatingMessage.procedureCode); - } - - break; - - case S1AP_S1AP_PDU_PR_successfulOutcome: - switch(s1ap->pdu.choice.successfulOutcome.procedureCode) { - case S1AP_ProcedureCode_id_S1Setup: s1ap_xer_print_s1ap_s1setupresponse(s1ap_xer__print2sp, message_string, (S1AP_message *)&s1ap->message); break; - - case S1AP_ProcedureCode_id_InitialContextSetup: s1ap_xer_print_s1ap_initialcontextsetupresponse(s1ap_xer__print2sp, message_string, (S1AP_message *)&s1ap->message); break; - - case S1AP_ProcedureCode_id_UEContextRelease: s1ap_xer_print_s1ap_uecontextreleasecomplete(s1ap_xer__print2sp, message_string, (S1AP_message *)&s1ap->message); break; - - default: - AssertFatal(0, "Unknown procedure ID (%d) for successfull outcome message\n", - (int)s1ap->pdu.choice.successfulOutcome.procedureCode); - } - - break; - - case S1AP_S1AP_PDU_PR_unsuccessfulOutcome: - switch(s1ap->pdu.choice.unsuccessfulOutcome.procedureCode) { - case S1AP_ProcedureCode_id_S1Setup: s1ap_xer_print_s1ap_s1setupfailure(s1ap_xer__print2sp, message_string, (S1AP_message *)&s1ap->message); break; - - case S1AP_ProcedureCode_id_InitialContextSetup: s1ap_xer_print_s1ap_initialcontextsetupfailure(s1ap_xer__print2sp, message_string, (S1AP_message *)&s1ap->message); break; - - default: - et_free_pointer(message_string); - AssertFatal(0,"Unknown procedure ID (%d) for unsuccessfull outcome message\n", - (int)s1ap->pdu.choice.unsuccessfulOutcome.procedureCode); - break; - } - - break; - - default: - AssertFatal(0, "Unknown presence (%d) or not implemented\n", (int)s1ap->pdu.present); - break; - } - - fprintf(stdout, "\t\tSCTP.data XML dump:\n%s\n", message_string); - et_free_pointer(message_string); - } -} -//------------------------------------------------------------------------------ -void et_display_packet_sctp_init(const sctp_inithdr_t *const sctp) -{ - if (sctp) { - fprintf(stdout, "\t\tSCTP.init.init_tag : %u\n", sctp->init_tag); - fprintf(stdout, "\t\tSCTP.init.a_rwnd : %u\n", sctp->a_rwnd); - fprintf(stdout, "\t\tSCTP.init.num_inbound_streams : %u\n", sctp->num_inbound_streams); - fprintf(stdout, "\t\tSCTP.init.num_outbound_streams : %u\n", sctp->num_outbound_streams); - fprintf(stdout, "\t\tSCTP.init.initial_tsn : %u\n", sctp->initial_tsn); - } -} -//------------------------------------------------------------------------------ -void et_display_packet_sctp_initack(const sctp_initackhdr_t *const sctp) -{ - if (sctp) { - fprintf(stdout, "\t\tSCTP.initack.init_tag : %u\n", sctp->init_tag); - fprintf(stdout, "\t\tSCTP.initack.a_rwnd : %u\n", sctp->a_rwnd); - fprintf(stdout, "\t\tSCTP.initack.num_inbound_streams : %u\n", sctp->num_inbound_streams); - fprintf(stdout, "\t\tSCTP.initack.num_outbound_streams : %u\n", sctp->num_outbound_streams); - fprintf(stdout, "\t\tSCTP.initack.initial_tsn : %u\n", sctp->initial_tsn); - } -} -//------------------------------------------------------------------------------ -void et_display_packet_sctp_data(const sctp_datahdr_t *const sctp) -{ - if (sctp) { - fprintf(stdout, "\t\tSCTP.data.tsn : %u\n", sctp->tsn); - fprintf(stdout, "\t\tSCTP.data.stream : %u\n", sctp->stream); - fprintf(stdout, "\t\tSCTP.data.ssn : %u\n", sctp->ssn); - fprintf(stdout, "\t\tSCTP.data.ppid : %u\n", sctp->ppid); - - if (sctp->ppid == 18) { - et_display_packet_s1ap_data(&sctp->payload); - } - - fprintf(stdout, "\t\tSCTP.data.binary_stream_allocated_size : %u\n", sctp->payload.binary_stream_allocated_size); - - if (NULL != sctp->payload.binary_stream) { - fprintf(stdout, "\t\tSCTP.data.binary_stream :\n"); - et_print_hex_octets(sctp->payload.binary_stream, sctp->payload.binary_stream_allocated_size); - } else { - fprintf(stdout, "\t\tSCTP.data.binary_stream : NULL\n"); - } - } -} - -//------------------------------------------------------------------------------ -void et_display_packet_sctp(const et_sctp_hdr_t *const sctp) -{ - if (sctp) { - fprintf(stdout, "\t\tSCTP.src_port : %u\n", sctp->src_port); - fprintf(stdout, "\t\tSCTP.dst_port : %u\n", sctp->dst_port); - fprintf(stdout, "\t\tSCTP.chunk_type : %s\n", et_chunk_type_cid2str(sctp->chunk_type)); - - switch (sctp->chunk_type) { - case SCTP_CID_DATA: - et_display_packet_sctp_data(&sctp->u.data_hdr); - break; - - case SCTP_CID_INIT: - et_display_packet_sctp_initack(&sctp->u.init_hdr); - break; - - case SCTP_CID_INIT_ACK: - et_display_packet_sctp_initack(&sctp->u.init_ack_hdr); - break; - - default: - ; - } - } -} -//------------------------------------------------------------------------------ -void et_display_packet_ip(const et_ip_hdr_t *const ip) -{ - if (ip) { - fprintf(stdout, "\t\tSource address : %s\n", et_ip2ip_str(&ip->src)); - fprintf(stdout, "\t\tDestination address : %s\n", et_ip2ip_str(&ip->dst)); - } -} - -//------------------------------------------------------------------------------ -void et_display_packet(const et_packet_t *const packet) -{ - if (packet) { - fprintf(stdout, "-------------------------------------------------------------------------------\n"); - fprintf(stdout, "\tPacket:\tnum %u | original frame number %u \n", packet->packet_number, packet->original_frame_number); - fprintf(stdout, "\tPacket:\ttime relative to 1st packet %ld.%06lu\n", - packet->time_relative_to_first_packet.tv_sec, packet->time_relative_to_first_packet.tv_usec); - fprintf(stdout, "\tPacket:\ttime relative to last tx packet %ld.%06lu\n", - packet->time_relative_to_last_sent_packet.tv_sec, packet->time_relative_to_last_sent_packet.tv_usec); - fprintf(stdout, "\tPacket:\ttime relative to last_received packet %ld.%06lu\n", - packet->time_relative_to_last_received_packet.tv_sec, packet->time_relative_to_last_received_packet.tv_usec); - - switch(packet->action) { - case ET_PACKET_ACTION_S1C_SEND: - fprintf(stdout, "\tPacket:\tAction SEND\n"); - break; - - case ET_PACKET_ACTION_S1C_RECEIVE: - fprintf(stdout, "\tPacket:\tAction RECEIVE\n"); - break; - - default: - fprintf(stdout, "\tPacket:\tAction UNKNOWN\n"); - } - - switch(packet->status) { - case ET_PACKET_STATUS_NONE: - fprintf(stdout, "\tPacket:\tStatus NONE\n"); - break; - - case ET_PACKET_STATUS_NOT_TAKEN_IN_ACCOUNT: - fprintf(stdout, "\tPacket:\tStatus NOT_TAKEN_IN_ACCOUNT\n"); - break; - - case ET_PACKET_STATUS_SCHEDULED_FOR_SENDING: - fprintf(stdout, "\tPacket:\tStatus SCHEDULED_FOR_SENDING\n"); - break; - - case ET_PACKET_STATUS_SENT: - fprintf(stdout, "\tPacket:\tStatus SENT\n"); - break; - - case ET_PACKET_STATUS_SCHEDULED_FOR_RECEIVING: - fprintf(stdout, "\tPacket:\tStatus SCHEDULED_FOR_RECEIVING\n"); - break; - - case ET_PACKET_STATUS_RECEIVED: - fprintf(stdout, "\tPacket:\tStatus RECEIVED\n"); - break; - - default: - fprintf(stdout, "\tPacket:\tStatus UNKNOWN\n"); - } - - et_display_packet_ip(&packet->ip_hdr); - et_display_packet_sctp(&packet->sctp_hdr); - } -} -//------------------------------------------------------------------------------ -void et_display_scenario(const et_scenario_t *const scenario) -{ - et_packet_t *packet = NULL; - - if (scenario) { - fprintf(stdout, "Scenario: %s\n", (scenario->name != NULL) ? (char *)scenario->name:"UNKNOWN NAME"); - packet = scenario->list_packet; - - while (packet) { - et_display_packet(packet); - packet = packet->next; - } - } -} diff --git a/openair3/TEST/EPC_TEST/play_scenario_fsm.c b/openair3/TEST/EPC_TEST/play_scenario_fsm.c deleted file mode 100644 index 0459f4d5dd..0000000000 --- a/openair3/TEST/EPC_TEST/play_scenario_fsm.c +++ /dev/null @@ -1,586 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.1 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -/* - play_scenario_fsm.c - ------------------- - AUTHOR : Lionel GAUTHIER - COMPANY : EURECOM - EMAIL : Lionel.Gauthier@eurecom.fr - */ -#include -#include -#include - -#include "intertask_interface.h" -#include "platform_types.h" -#include "assertions.h" -#include "play_scenario.h" -#include "play_scenario_s1ap_eNB_defs.h" - -//------------------------------------------------------------------------------ -extern int g_max_speed; -//------------------------------------------------------------------------------ -et_scenario_t *g_scenario = NULL; -pthread_mutex_t g_fsm_lock = PTHREAD_MUTEX_INITIALIZER; -et_fsm_state_t g_fsm_state = ET_FSM_STATE_NULL; -uint32_t g_constraints = ET_BIT_MASK_MATCH_SCTP_STREAM | ET_BIT_MASK_MATCH_SCTP_SSN; -//------------------------------------------------------------------------------ -// it is assumed that if a time is negative tv_sec and tv_usec are both negative -void timeval_add (struct timeval *const result, const struct timeval *const a, const struct timeval *const b) -{ - AssertFatal(((a->tv_sec <= 0) && (a->tv_usec <= 0)) || ((a->tv_sec >= 0) && (a->tv_usec >= 0)), " Bad time format arg a\n"); - AssertFatal(((b->tv_sec <= 0) && (b->tv_usec <= 0)) || ((b->tv_sec >= 0) && (b->tv_usec >= 0)), " Bad time format arg b\n"); - // may happen overflows but were are not dealing with very large timings - long long int r = a->tv_usec + b->tv_usec + (a->tv_sec + b->tv_sec) * 1000000; - result->tv_sec = r / (long long int)1000000; - result->tv_usec = r % (long long int)1000000; - - if ((result != a) && (result != b)) { - LOG_D(ENB_APP, "timeval_add(%ld.%06d, %ld.%06d)=%ld.%06d\n", a->tv_sec, a->tv_usec, b->tv_sec, b->tv_usec, result->tv_sec, result->tv_usec); - } -} - -//------------------------------------------------------------------------------ -// it is assumed that if a time is negative tv_sec and tv_usec are both negative -// return true if result is positive -int timeval_subtract (struct timeval *const result, struct timeval *const a, struct timeval *const b) -{ - AssertFatal(((a->tv_sec <= 0) && (a->tv_usec <= 0)) || ((a->tv_sec >= 0) && (a->tv_usec >= 0)), " Bad time format arg a\n"); - AssertFatal(((b->tv_sec <= 0) && (b->tv_usec <= 0)) || ((b->tv_sec >= 0) && (b->tv_usec >= 0)), " Bad time format arg b\n"); - // may happen overflows but were are not dealing with very large timings - long long int r = a->tv_usec - b->tv_usec + (a->tv_sec - b->tv_sec) * 1000000; - result->tv_sec = r / (long long int)1000000; - result->tv_usec = r % (long long int)1000000; - - if ((result != a) && (result != b)) { - LOG_D(ENB_APP, "timeval_subtract(%ld.%06d, %ld.%06d)=%ld.%06d\n", a->tv_sec, a->tv_usec, b->tv_sec, b->tv_usec, result->tv_sec, result->tv_usec); - } - - return (result->tv_sec >= 0) && (result->tv_usec >= 0); -} - -//------------------------------------------------------------------------------ -void et_scenario_wait_rx_packet(et_packet_t *const packet) -{ - packet->status = ET_PACKET_STATUS_SCHEDULED_FOR_RECEIVING; - g_fsm_state = ET_FSM_STATE_WAITING_RX_EVENT; - - if (timer_setup (ET_FSM_STATE_WAITING_RX_EVENT_DELAY_SEC, 0, TASK_S1AP, INSTANCE_DEFAULT, TIMER_ONE_SHOT, - packet, &packet->timer_id) < 0) { - AssertFatal(0, " Can not start waiting RX event timer\n"); - } - - g_scenario->timer_count++; - LOG_D(ENB_APP, "Waiting RX packet num %d original frame number %u\n", packet->packet_number, packet->original_frame_number); -} -//------------------------------------------------------------------------------ -void et_scenario_schedule_tx_packet(et_packet_t *packet) -{ - s1ap_eNB_instance_t *s1ap_eNB_instance = NULL; - struct timeval now = { .tv_sec = 0, .tv_usec = 0 }; - struct timeval offset_last_tx_packet = { .tv_sec = 0, .tv_usec = 0 }; - struct timeval offset_last_rx_packet = { .tv_sec = 0, .tv_usec = 0 }; - struct timeval offset_tx_rx = { .tv_sec = 0, .tv_usec = 0 }; - struct timeval offset = { .tv_sec = 0, .tv_usec = 0 }; - int last_packet_was_rx = 0; - int we_are_too_late = 0; - int original_frame_number = -1; - AssertFatal(NULL != packet, "packet argument is NULL"); - s1ap_eNB_instance = et_s1ap_eNB_get_instance(packet->enb_instance); - AssertFatal(NULL != s1ap_eNB_instance, "Cannot get s1ap_eNB_instance_t for eNB instance %d", packet->enb_instance); - LOG_D(ENB_APP, "%s\n", __FUNCTION__); - g_fsm_state = ET_FSM_STATE_WAITING_TX_EVENT; - - switch (packet->sctp_hdr.chunk_type) { - case SCTP_CID_DATA: - // check if we can send it now - // TODO: BUG we have to discard in scenario all packets that cannot be processed (SACK, COOKIEs, etc) - AssertFatal(gettimeofday(&now, NULL) == 0, "gettimeofday failed"); - timeval_subtract(&offset_last_tx_packet,&now,&g_scenario->time_last_tx_packet); - timeval_subtract(&offset_last_rx_packet,&now,&g_scenario->time_last_rx_packet); - LOG_D(ENB_APP, "offset_last_tx_packet=%ld.%06d\n", offset_last_tx_packet.tv_sec, offset_last_tx_packet.tv_usec); - LOG_D(ENB_APP, "offset_last_rx_packet=%ld.%06d\n", offset_last_rx_packet.tv_sec, offset_last_rx_packet.tv_usec); - last_packet_was_rx = timeval_subtract(&offset_tx_rx,&offset_last_tx_packet,&offset_last_rx_packet); - - if (last_packet_was_rx) { - LOG_D(ENB_APP, "last_packet_was_rx\n"); - we_are_too_late = timeval_subtract(&offset,&offset_last_rx_packet,&packet->time_relative_to_last_received_packet); - LOG_D(ENB_APP, "we_are_too_late=%d, offset=%ld.%06d\n", we_are_too_late, offset.tv_sec, offset.tv_usec); - } else { - LOG_D(ENB_APP, "last_packet_was_tx\n"); - we_are_too_late = timeval_subtract(&offset,&offset_last_tx_packet,&packet->time_relative_to_last_sent_packet); - LOG_D(ENB_APP, "we_are_too_late=%d, offset=%ld.%06d\n", we_are_too_late, offset.tv_sec, offset.tv_usec); - } - - if ((0 == we_are_too_late) && (0 == g_max_speed)) { - // set timer - if ((offset.tv_sec <= 0) || (offset.tv_usec <= 0)) { - offset.tv_sec = -offset.tv_sec; - offset.tv_usec = -offset.tv_usec; - } - - LOG_D(ENB_APP, "Send packet num %u original frame number %u in %ld.%06d sec\n", - packet->packet_number, packet->original_frame_number, offset.tv_sec, offset.tv_usec); - packet->status = ET_PACKET_STATUS_SCHEDULED_FOR_SENDING; - - if (timer_setup (offset.tv_sec, offset.tv_usec, TASK_S1AP, INSTANCE_DEFAULT, TIMER_ONE_SHOT,packet, &packet->timer_id) < 0) { - AssertFatal(0, " Can not start TX event timer\n"); - } - - g_scenario->timer_count++; - // Done g_fsm_state = ET_FSM_STATE_WAITING_TX_EVENT; - } else { - // send immediately - AssertFatal(0 == gettimeofday(&packet->timestamp_packet, NULL), "gettimeofday() Failed"); - original_frame_number = packet->original_frame_number; - - do { - g_scenario->time_last_tx_packet.tv_sec = packet->timestamp_packet.tv_sec; - g_scenario->time_last_tx_packet.tv_usec = packet->timestamp_packet.tv_usec; - LOG_D(ENB_APP, "Sending packet num %d original frame number %u immediately\n",packet->packet_number, packet->original_frame_number); - et_s1ap_eNB_itti_send_sctp_data_req( - packet->enb_instance, - packet->sctp_hdr.u.data_hdr.assoc_id, - packet->sctp_hdr.u.data_hdr.payload.binary_stream, - packet->sctp_hdr.u.data_hdr.payload.binary_stream_allocated_size, - packet->sctp_hdr.u.data_hdr.stream); - packet->status = ET_PACKET_STATUS_SENT; - g_scenario->next_packet = g_scenario->next_packet->next; - packet = packet->next; - } while ((NULL != packet) && (packet->original_frame_number == original_frame_number)); - - g_fsm_state = ET_FSM_STATE_RUNNING; - } - - break; - - case SCTP_CID_INIT: - case SCTP_CID_INIT_ACK: - AssertFatal(0, "Invalid case TX packet SCTP_CID_INIT or SCTP_CID_INIT_ACK"); - break; - - default: - AssertFatal(0, "Invalid case TX packet SCTP_CID %d", packet->sctp_hdr.chunk_type); - } -} -//------------------------------------------------------------------------------ -et_fsm_state_t et_scenario_fsm_notify_event_state_running(et_event_t event) -{ - switch (event.code) { - case ET_EVENT_TICK: - while (NULL != g_scenario->next_packet) { - LOG_D(ENB_APP, "EVENT_TICK: Considering packet num %d original frame number %u\n", g_scenario->next_packet->packet_number, g_scenario->next_packet->original_frame_number); - - switch (g_scenario->next_packet->sctp_hdr.chunk_type) { - case SCTP_CID_DATA : - - // no init in this scenario, may be sub-scenario - if (g_scenario->next_packet->action == ET_PACKET_ACTION_S1C_SEND) { - if (g_scenario->next_packet->status == ET_PACKET_STATUS_NONE) { - et_scenario_schedule_tx_packet(g_scenario->next_packet); - pthread_mutex_unlock(&g_fsm_lock); - et_event_t continue_event; - continue_event.code = ET_EVENT_TICK; - et_scenario_fsm_notify_event(continue_event); - return g_fsm_state; - } else if (g_scenario->next_packet->status != ET_PACKET_STATUS_SCHEDULED_FOR_SENDING) { - AssertFatal(0, "Invalid packet status %d", g_scenario->next_packet->status); - } - } else if (g_scenario->next_packet->action == ET_PACKET_ACTION_S1C_RECEIVE) { - if (g_scenario->next_packet->status == ET_PACKET_STATUS_RECEIVED) { - g_scenario->next_packet = g_scenario->next_packet->next; - } else if (g_scenario->next_packet->status == ET_PACKET_STATUS_NONE) { - et_scenario_wait_rx_packet(g_scenario->next_packet); - pthread_mutex_unlock(&g_fsm_lock); - return g_fsm_state; - } else { - AssertFatal(0, "Invalid packet status %d", g_scenario->next_packet->status); - } - } else { - AssertFatal(0, "Invalid packet action %d", g_scenario->next_packet->action); - } - - break; - - case SCTP_CID_INIT: - case SCTP_CID_INIT_ACK: - case SCTP_CID_HEARTBEAT: - case SCTP_CID_HEARTBEAT_ACK: - case SCTP_CID_COOKIE_ECHO: - case SCTP_CID_COOKIE_ACK: - case SCTP_CID_ECN_ECNE: - case SCTP_CID_ECN_CWR: - LOG_D(ENB_APP, "EVENT_TICK: Ignoring packet num %d SCTP CID %s\n", - g_scenario->next_packet->packet_number, - et_chunk_type_cid2str(g_scenario->next_packet->sctp_hdr.chunk_type)); - g_scenario->next_packet->status = ET_PACKET_STATUS_NOT_TAKEN_IN_ACCOUNT; - g_scenario->next_packet = g_scenario->next_packet->next; - break; - - case SCTP_CID_ABORT: - case SCTP_CID_SHUTDOWN: - case SCTP_CID_SHUTDOWN_ACK: - case SCTP_CID_ERROR: - case SCTP_CID_SHUTDOWN_COMPLETE: - AssertFatal(0, "The scenario should be cleaned (packet %s cannot be processed at this time)", - et_chunk_type_cid2str(g_scenario->next_packet->sctp_hdr.chunk_type)); - break; - - default: - LOG_D(ENB_APP, "EVENT_TICK: Ignoring packet num %d SCTP CID %s\n", - g_scenario->next_packet->packet_number, - et_chunk_type_cid2str(g_scenario->next_packet->sctp_hdr.chunk_type)); - g_scenario->next_packet->status = ET_PACKET_STATUS_NOT_TAKEN_IN_ACCOUNT; - g_scenario->next_packet = g_scenario->next_packet->next; - } - } - - fprintf(stderr, "No Packet found in this scenario: %s\n", g_scenario->name); - g_fsm_state = ET_FSM_STATE_NULL; - pthread_mutex_unlock(&g_fsm_lock); - - if (0 == g_scenario->timer_count) { - fprintf(stderr, "End of scenario: %s\n", g_scenario->name); - fflush(stderr); - fflush(stdout); - return 0; - //exit(0); - } - - fprintf(stderr, "Remaining timers running: %d\n", g_scenario->timer_count); - return g_fsm_state; - break; - - case ET_EVENT_RX_PACKET_TIME_OUT: - AssertFatal(0, "Event ET_EVENT_RX_PACKET_TIME_OUT not handled in FSM state ET_FSM_STATE_RUNNING"); - break; - - case ET_EVENT_TX_TIMED_PACKET: - AssertFatal(0, "Event ET_EVENT_TX_TIMED_PACKET not handled in FSM state ET_FSM_STATE_RUNNING"); - break; - - case ET_EVENT_RX_S1AP: - et_s1ap_process_rx_packet(&event.u.s1ap_data_ind); - break; - - default: - AssertFatal(0, "Case event %d not handled in ET_FSM_STATE_RUNNING", event.code); - } - - pthread_mutex_unlock(&g_fsm_lock); - return 0; -} - -//------------------------------------------------------------------------------ -et_fsm_state_t et_scenario_fsm_notify_event_state_waiting_tx(et_event_t event) -{ - int rv = 0; - int original_frame_number = -1; - et_packet_t *packet = NULL; - - switch (event.code) { - case ET_EVENT_TICK: - fprintf(stdout, "EVENT_TICK: waiting for tx event\n"); - break; - - case ET_EVENT_RX_S1AP: - rv = et_s1ap_process_rx_packet(&event.u.s1ap_data_ind); - break; - - case ET_EVENT_TX_TIMED_PACKET: - // send immediately - packet = event.u.tx_timed_packet; - AssertFatal(0 == gettimeofday(&packet->timestamp_packet, NULL), "gettimeofday() Failed"); - original_frame_number = packet->original_frame_number; - - do { - g_scenario->time_last_tx_packet.tv_sec = packet->timestamp_packet.tv_sec; - g_scenario->time_last_tx_packet.tv_usec = packet->timestamp_packet.tv_usec; - LOG_D(ENB_APP, "Sending packet num %d original frame number %u immediately\n",packet->packet_number, packet->original_frame_number); - et_s1ap_eNB_itti_send_sctp_data_req( - packet->enb_instance, - packet->sctp_hdr.u.data_hdr.assoc_id, - packet->sctp_hdr.u.data_hdr.payload.binary_stream, - packet->sctp_hdr.u.data_hdr.payload.binary_stream_allocated_size, - packet->sctp_hdr.u.data_hdr.stream); - packet->status = ET_PACKET_STATUS_SENT; - packet = packet->next; - g_scenario->next_packet = packet; - } while ( (NULL != packet) && (packet->original_frame_number == original_frame_number)); - - g_fsm_state = ET_FSM_STATE_RUNNING; - break; - - case ET_EVENT_RX_PACKET_TIME_OUT: - default: - AssertFatal(0, "Case event %d not handled in ET_FSM_STATE_WAITING_TX", event.code); - } - - pthread_mutex_unlock(&g_fsm_lock); - return 0; -} - -//------------------------------------------------------------------------------ -et_fsm_state_t et_scenario_fsm_notify_event_state_waiting_rx(et_event_t event) -{ - int rv = 0; - - switch (event.code) { - case ET_EVENT_TICK: - fprintf(stdout, "EVENT_TICK: waiting for rx event\n"); - break; - - case ET_EVENT_RX_PACKET_TIME_OUT: - fprintf(stderr, "Error The following packet is not received:\n"); - //et_display_packet(event.u.rx_packet_time_out); - AssertFatal(0, "Waited packet not received"); - break; - - case ET_EVENT_RX_S1AP: - rv = et_s1ap_process_rx_packet(&event.u.s1ap_data_ind); - - // waited packet - if (rv == 0) { - g_fsm_state = ET_FSM_STATE_RUNNING; - } - - break; - - case ET_EVENT_TX_TIMED_PACKET: - default: - AssertFatal(0, "Case event %d not handled in ET_FSM_STATE_WAITING_RX", event.code); - } - - pthread_mutex_unlock(&g_fsm_lock); - return 0; -} - -//------------------------------------------------------------------------------ -et_fsm_state_t et_scenario_fsm_notify_event_state_connecting_s1c(et_event_t event) -{ - switch (event.code) { - case ET_EVENT_TICK: - break; - - case ET_EVENT_S1C_CONNECTED: - // hack simulate we have been able to get the right timing values for STCP connect - AssertFatal(gettimeofday(&g_scenario->time_last_rx_packet, NULL) == 0, "gettimeofday failed"); - - while (NULL != g_scenario->next_packet) { - switch (g_scenario->next_packet->sctp_hdr.chunk_type) { - case SCTP_CID_DATA : - - // no init in this scenario, may be sub-scenario - if (g_scenario->next_packet->action == ET_PACKET_ACTION_S1C_SEND) { - et_scenario_schedule_tx_packet(g_scenario->next_packet); - pthread_mutex_unlock(&g_fsm_lock); - et_event_t continue_event; - continue_event.code = ET_EVENT_TICK; - et_scenario_fsm_notify_event(continue_event); - return g_fsm_state; - } else if (g_scenario->next_packet->action == ET_PACKET_ACTION_S1C_RECEIVE) { - if (g_scenario->next_packet->status == ET_PACKET_STATUS_RECEIVED) { - g_scenario->last_rx_packet = g_scenario->next_packet; - g_scenario->time_last_rx_packet = g_scenario->last_rx_packet->timestamp_packet; - g_scenario->next_packet = g_scenario->next_packet->next; - } else if (g_scenario->next_packet->status == ET_PACKET_STATUS_NONE) { - et_scenario_wait_rx_packet(g_scenario->next_packet); - pthread_mutex_unlock(&g_fsm_lock); - return g_fsm_state; - } else { - AssertFatal(0, "Invalid packet status %d", g_scenario->next_packet->status); - } - } else { - AssertFatal(0, "Invalid packet action %d", g_scenario->next_packet->action); - } - - break; - - case SCTP_CID_INIT: - case SCTP_CID_INIT_ACK: - case SCTP_CID_HEARTBEAT: - case SCTP_CID_HEARTBEAT_ACK: - case SCTP_CID_COOKIE_ECHO: - case SCTP_CID_COOKIE_ACK: - case SCTP_CID_ECN_ECNE: - case SCTP_CID_ECN_CWR: - g_scenario->next_packet->status = ET_PACKET_STATUS_NOT_TAKEN_IN_ACCOUNT; - g_scenario->next_packet = g_scenario->next_packet->next; - break; - - case SCTP_CID_ABORT: - case SCTP_CID_SHUTDOWN: - case SCTP_CID_SHUTDOWN_ACK: - case SCTP_CID_ERROR: - case SCTP_CID_SHUTDOWN_COMPLETE: - AssertFatal(0, "The scenario should be cleaned (packet %s cannot be processed at this time)", - et_chunk_type_cid2str(g_scenario->next_packet->sctp_hdr.chunk_type)); - break; - - default: - g_scenario->next_packet->status = ET_PACKET_STATUS_NOT_TAKEN_IN_ACCOUNT; - g_scenario->next_packet = g_scenario->next_packet->next; - } - } - - fprintf(stderr, "No Packet found in this scenario: %s\n", g_scenario->name); - g_fsm_state = ET_FSM_STATE_NULL; - pthread_mutex_unlock(&g_fsm_lock); - - if (0 == g_scenario->timer_count) { - fprintf(stderr, "End of scenario: %s\n", g_scenario->name); - fflush(stderr); - fflush(stdout); - exit(0); - } - - fprintf(stderr, "Remaining timers running: %d\n", g_scenario->timer_count); - return g_fsm_state; - break; - - default: - AssertFatal(0, "Case event %d not handled in ET_FSM_STATE_CONNECTING_S1C", event.code); - } - - pthread_mutex_unlock(&g_fsm_lock); - return 0; -} -//------------------------------------------------------------------------------ -et_fsm_state_t et_scenario_fsm_notify_event_state_null(et_event_t event) -{ - switch (event.code) { - case ET_EVENT_TICK: - break; - - case ET_EVENT_INIT: - AssertFatal(NULL == g_scenario, "Current scenario not ended"); - g_scenario = event.u.init.scenario; - g_scenario->next_packet = g_scenario->list_packet; - g_scenario->last_rx_packet = NULL; - g_scenario->last_tx_packet = NULL; - - while (NULL != g_scenario->next_packet) { - switch (g_scenario->next_packet->sctp_hdr.chunk_type) { - case SCTP_CID_DATA : - - // no init in this scenario, may be sub-scenario, ... - if (g_scenario->next_packet->action == ET_PACKET_ACTION_S1C_SEND) { - et_scenario_schedule_tx_packet(g_scenario->next_packet); - pthread_mutex_unlock(&g_fsm_lock); - et_event_t continue_event; - continue_event.code = ET_EVENT_TICK; - et_scenario_fsm_notify_event(continue_event); - return g_fsm_state; - } else if (g_scenario->next_packet->action == ET_PACKET_ACTION_S1C_RECEIVE) { - if (g_scenario->next_packet->status == ET_PACKET_STATUS_RECEIVED) { - g_scenario->last_rx_packet = g_scenario->next_packet; - g_scenario->time_last_rx_packet = g_scenario->last_rx_packet->timestamp_packet; - g_scenario->next_packet = g_scenario->next_packet->next; - } else if (g_scenario->next_packet->status == ET_PACKET_STATUS_NONE) { - et_scenario_wait_rx_packet(g_scenario->next_packet); - pthread_mutex_unlock(&g_fsm_lock); - return g_fsm_state; - } else { - AssertFatal(0, "Invalid packet status %d", g_scenario->next_packet->status); - } - } else { - AssertFatal(0, "Invalid packet action %d", g_scenario->next_packet->action); - } - - break; - - case SCTP_CID_INIT: - case SCTP_CID_INIT_ACK: - g_scenario->enb_properties = (Enb_properties_array_t *)et_enb_config_get(); - g_scenario->hash_old_ue_mme_id2ue_mme_id = hashtable_create (256,NULL,NULL); - g_scenario->hash_mme2association_id = hashtable_create (256,NULL,NULL); - // Try to register each eNB - g_scenario->registered_enb = 0; - g_fsm_state = ET_FSM_STATE_CONNECTING_S1C; - AssertFatal(gettimeofday(&g_scenario->time_last_tx_packet, NULL) == 0, "gettimeofday failed"); - et_eNB_app_register (g_scenario->enb_properties); - pthread_mutex_unlock(&g_fsm_lock); - return g_fsm_state; - break; - - case SCTP_CID_HEARTBEAT: - case SCTP_CID_HEARTBEAT_ACK: - case SCTP_CID_COOKIE_ECHO: - case SCTP_CID_COOKIE_ACK: - case SCTP_CID_ECN_ECNE: - case SCTP_CID_ECN_CWR: - g_scenario->next_packet->status = ET_PACKET_STATUS_NOT_TAKEN_IN_ACCOUNT; - g_scenario->next_packet = g_scenario->next_packet->next; - break; - - case SCTP_CID_ABORT: - case SCTP_CID_SHUTDOWN: - case SCTP_CID_SHUTDOWN_ACK: - case SCTP_CID_ERROR: - case SCTP_CID_SHUTDOWN_COMPLETE: - AssertFatal(0, "The scenario should be cleaned (packet %s cannot be processed at this time)", - et_chunk_type_cid2str(g_scenario->next_packet->sctp_hdr.chunk_type)); - break; - - default: - g_scenario->next_packet->status = ET_PACKET_STATUS_NOT_TAKEN_IN_ACCOUNT; - g_scenario->next_packet = g_scenario->next_packet->next; - } - } - - fprintf(stderr, "No Useful packet found in this scenario: %s\n", g_scenario->name); - g_fsm_state = ET_FSM_STATE_NULL; - pthread_mutex_unlock(&g_fsm_lock); - return g_fsm_state; - break; - - default: - AssertFatal(0, "Case event %d not handled in ET_FSM_STATE_NULL", event.code); - } - - return 0; -} - -//------------------------------------------------------------------------------ -et_fsm_state_t et_scenario_fsm_notify_event(et_event_t event) -{ - AssertFatal((event.code >= ET_EVENT_START) && (event.code < ET_EVENT_END), "Unknown et_event_t.code %d", event.code); - pthread_mutex_lock(&g_fsm_lock); - - switch (g_fsm_state) { - case ET_FSM_STATE_NULL: return et_scenario_fsm_notify_event_state_null(event); break; - - case ET_FSM_STATE_CONNECTING_S1C: return et_scenario_fsm_notify_event_state_connecting_s1c(event); break; - - case ET_FSM_STATE_WAITING_TX_EVENT: return et_scenario_fsm_notify_event_state_waiting_tx(event); break; - - case ET_FSM_STATE_WAITING_RX_EVENT: return et_scenario_fsm_notify_event_state_waiting_rx(event); break; - - case ET_FSM_STATE_RUNNING: return et_scenario_fsm_notify_event_state_running(event); break; - - default: - AssertFatal(0, "Case fsm_state %d not handled", g_fsm_state); - } - - pthread_mutex_unlock(&g_fsm_lock); - return g_fsm_state; -} diff --git a/openair3/TEST/EPC_TEST/play_scenario_parse.c b/openair3/TEST/EPC_TEST/play_scenario_parse.c deleted file mode 100644 index 607ec34dfc..0000000000 --- a/openair3/TEST/EPC_TEST/play_scenario_parse.c +++ /dev/null @@ -1,592 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.1 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -/* - play_scenario_parse.c - ------------------- - AUTHOR : Lionel GAUTHIER - COMPANY : EURECOM - EMAIL : Lionel.Gauthier@eurecom.fr - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "intertask_interface.h" -#include "platform_types.h" -#include "assertions.h" -#include "play_scenario.h" -//------------------------------------------------------------------------------ -#define ENB_CONFIG_MAX_XSLT_PARAMS 32 -//------------------------------------------------------------------------------ -extern Enb_properties_array_t g_enb_properties; -//------------------------------------------------------------------------------ -void et_parse_s1ap(xmlDocPtr doc, const xmlNode const *s1ap_node, et_s1ap_t * const s1ap) -{ - xmlNodePtr cur_node = NULL; - xmlChar *xml_char = NULL; - xmlChar *xml_char2 = NULL; - unsigned int size = 0; - int rc = 0; - unsigned int go_deeper_in_tree = 1; - - if ((NULL != s1ap_node) && (NULL != s1ap)) { - // see http://www.xmlsoft.org/html/libxml-tree.html#xmlCopyNode - if (NULL == s1ap->doc) { - xmlUnlinkNode(s1ap_node); - //cur_node = xmlCopyNodeList(s1ap_node); - // arg2: if 1 do a recursive copy (properties, namespaces and children when applicable) if 2 copy properties and namespaces (when applicable) - //cur_node = xmlCopyNode(s1ap_node, 1); - //AssertFatal(NULL != cur_node, "xmlCopyNode Failed"); - s1ap->doc = xmlNewDoc(BAD_CAST "1.0"); - xmlDocSetRootElement(s1ap->doc, s1ap_node); - } - - for (cur_node = (xmlNode *)s1ap_node; cur_node; cur_node = cur_node->next) { - go_deeper_in_tree = 1; - if ((!xmlStrcmp(cur_node->name, (const xmlChar *)"field"))) { - // do not get hidden fields - xml_char = xmlGetProp((xmlNode *)cur_node, (const xmlChar *)"hide"); - if (NULL != xml_char) { - if ((!xmlStrcmp(xml_char, (const xmlChar *)"yes"))) { - go_deeper_in_tree = 0; - } - xmlFree(xml_char); - } - if (0 < go_deeper_in_tree) { - // first get size - xml_char = xmlGetProp((xmlNode *)cur_node, (const xmlChar *)"size"); - if (NULL != xml_char) { - size = strtoul((const char *)xml_char, NULL, 0); - xmlFree(xml_char); - // second: try to get value (always hex) - xml_char = xmlGetProp((xmlNode *)cur_node, (const xmlChar *)"value"); - if (NULL != xml_char) { - xml_char2 = xmlGetProp((xmlNode *)cur_node, (const xmlChar *)"name"); - fprintf(stdout, "s1ap %p field name %s size %u value %s\n",s1ap, xml_char2, size, xml_char); - xmlFree(xml_char2); - // if success to get value, do not parse children - //AssertFatal ((xmlStrlen(xml_char) == size), "ERROR %s() mismatch in size %d and strlen %d\n", __FUNCTION__, size, xmlStrlen(xml_char)); - //if (xmlStrlen(xml_char) == size) { - AssertFatal ((s1ap->binary_stream_pos+xmlStrlen(xml_char)/2) <= s1ap->binary_stream_allocated_size, - "ERROR in buffer size: binary_stream_pos %d xmlStrlen(xml_char)/2=%d\n", s1ap->binary_stream_pos, xmlStrlen(xml_char)/2); - rc = et_hex2data( &s1ap->binary_stream[s1ap->binary_stream_pos], xml_char, xmlStrlen(xml_char)); - s1ap->binary_stream_pos += xmlStrlen(xml_char)/2; - //et_display_node(cur_node, 0); - AssertFatal (rc >= 0, "ERROR in converting hex string %s len %d size %u rc %d\n", xml_char, xmlStrlen(xml_char), size, rc); - go_deeper_in_tree = 0; - //} - xmlFree(xml_char); - } - } - } - } - if (0 < go_deeper_in_tree) { - et_parse_s1ap(doc, cur_node->children, s1ap); - } - } - } -} - -//------------------------------------------------------------------------------ -void et_parse_sctp_data_chunk(xmlDocPtr doc, const xmlNode const *sctp_node, sctp_datahdr_t * const sctp_hdr) -{ - xmlNode *cur_node = NULL; - xmlChar *xml_char = NULL; - xmlChar *xml_char2 = NULL; - - if ((NULL != sctp_node) && (NULL != sctp_hdr)) { - xml_char = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"name"); - if (NULL != xml_char) { - if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.data_payload_proto_id"))) { - xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"show"); - if (NULL != xml_char2) { - sctp_hdr->ppid = strtoul((const char *)xml_char2, NULL, 0); - xmlFree(xml_char2); - } - } else if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.data_sid"))) { - xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"show"); - if (NULL != xml_char2) { - sctp_hdr->stream = strtoul((const char *)xml_char2, NULL, 16); - xmlFree(xml_char2); - } - } else if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.data_tsn"))) { - xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"show"); - if (NULL != xml_char2) { - sctp_hdr->tsn = strtoul((const char *)xml_char2, NULL, 0); - xmlFree(xml_char2); - } - } else if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.data_ssn"))) { - xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"show"); - if (NULL != xml_char2) { - sctp_hdr->ssn = strtoul((const char *)xml_char2, NULL, 0); - xmlFree(xml_char2); - } - } - xmlFree(xml_char); - } - for (cur_node = sctp_node->children; cur_node; cur_node = cur_node->next) { - et_parse_sctp_data_chunk(doc, cur_node, sctp_hdr); - } - } - -} -//------------------------------------------------------------------------------ -void et_parse_sctp_init_chunk(xmlDocPtr doc, const xmlNode const *sctp_node, sctp_inithdr_t * const sctp_hdr) -{ - xmlNode *cur_node = NULL; - xmlChar *xml_char = NULL; - xmlChar *xml_char2 = NULL; - - if ((NULL != sctp_node) && (NULL != sctp_hdr)) { - xml_char = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"name"); - if (NULL != xml_char) { - if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.init_nr_out_streams"))) { - xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"value"); - if (NULL != xml_char2) { - sctp_hdr->num_outbound_streams = strtoul((const char *)xml_char2, NULL, 0); - xmlFree(xml_char2); - } - } else if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.init_nr_in_streams"))) { - xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"value"); - if (NULL != xml_char2) { - sctp_hdr->num_inbound_streams = strtoul((const char *)xml_char2, NULL, 0); - xmlFree(xml_char2); - } - } else if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.init_credit"))) { - xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"value"); - if (NULL != xml_char2) { - sctp_hdr->a_rwnd = strtoul((const char *)xml_char2, NULL, 0); - xmlFree(xml_char2); - } - } else if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.init_initial_tsn"))) { - xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"show"); - if (NULL != xml_char2) { - sctp_hdr->initial_tsn = strtoul((const char *)xml_char2, NULL, 0); - xmlFree(xml_char2); - } - } else if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.init_initiate_tag"))) { - xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"show"); - if (NULL != xml_char2) { - sctp_hdr->init_tag = strtoul((const char *)xml_char2, NULL, 16); - xmlFree(xml_char2); - } - } - xmlFree(xml_char); - } - for (cur_node = sctp_node->children; cur_node; cur_node = cur_node->next) { - et_parse_sctp_init_chunk(doc, cur_node, sctp_hdr); - } - } -} -//------------------------------------------------------------------------------ -void et_parse_sctp_init_ack_chunk(xmlDocPtr doc, const xmlNode const *sctp_node, sctp_initackhdr_t * const sctp_hdr) -{ - xmlNode *cur_node = NULL; - xmlChar *xml_char = NULL; - xmlChar *xml_char2 = NULL; - - if ((NULL != sctp_node) && (NULL != sctp_hdr)) { - xml_char = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"name"); - if (NULL != xml_char) { - if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.initack_nr_out_streams"))) { - xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"value"); - if (NULL != xml_char2) { - sctp_hdr->num_outbound_streams = strtoul((const char *)xml_char2, NULL, 0); - xmlFree(xml_char2); - } - } else if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.initack_nr_in_streams"))) { - xml_char2 = xmlGetProp((xmlNode *)(xmlNode *)sctp_node, (const xmlChar *)"value"); - if (NULL != xml_char2) { - sctp_hdr->num_inbound_streams = strtoul((const char *)xml_char2, NULL, 0); - xmlFree(xml_char2); - } - } else if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.initack_credit"))) { - xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"value"); - if (NULL != xml_char2) { - sctp_hdr->a_rwnd = strtoul((const char *)xml_char2, NULL, 0); - xmlFree(xml_char2); - } - } else if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.initack_initial_tsn"))) { - xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"show"); - if (NULL != xml_char2) { - sctp_hdr->initial_tsn = strtoul((const char *)xml_char2, NULL, 0); - xmlFree(xml_char2); - } - } else if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.initack_initiate_tag"))) { - xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"show"); - if (NULL != xml_char2) { - sctp_hdr->init_tag = strtoul((const char *)xml_char2, NULL, 16); - xmlFree(xml_char2); - } - } - xmlFree(xml_char); - } - for (cur_node = sctp_node->children; cur_node; cur_node = cur_node->next) { - et_parse_sctp_init_ack_chunk(doc, cur_node, sctp_hdr); - } - } -} -//------------------------------------------------------------------------------ -void et_parse_sctp(xmlDocPtr doc, const xmlNode const *sctp_node, et_sctp_hdr_t * const sctp_hdr) -{ - xmlNode *cur_node = NULL; - xmlChar *xml_char = NULL; - xmlChar *xml_char2 = NULL; - - if ((NULL != sctp_node) && (NULL != sctp_hdr)) { - if ((!xmlStrcmp(sctp_node->name, (const xmlChar *)"proto"))) { - xml_char = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"name"); - if (NULL != xml_char) { - if ((!xmlStrcmp(xml_char, (const xmlChar *)"s1ap"))) { - xmlFree(xml_char); - xml_char = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"pos"); - if (NULL != xml_char) { - sctp_hdr->u.data_hdr.payload.xml_stream_pos_offset = strtoul((const char *)xml_char, NULL, 0); - xmlFree(xml_char); - - xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"size"); - if (NULL != xml_char2) { - sctp_hdr->u.data_hdr.payload.binary_stream_allocated_size = strtoul((const char *)xml_char2, NULL, 0); - sctp_hdr->u.data_hdr.payload.binary_stream = calloc(1, sctp_hdr->u.data_hdr.payload.binary_stream_allocated_size); - sctp_hdr->u.data_hdr.payload.binary_stream_pos = 0; - fprintf(stdout, "Allocating payload of sctp_hdr %p %u bytes\n", sctp_hdr, sctp_hdr->u.data_hdr.payload.binary_stream_allocated_size); - xmlFree(xml_char2); - } - et_parse_s1ap(doc, sctp_node, &sctp_hdr->u.data_hdr.payload); - et_decode_s1ap(&sctp_hdr->u.data_hdr.payload); - return; - } - } - xmlFree(xml_char); - } - } - //if ((cur_node->type == XML_ATTRIBUTE_NODE) || (cur_node->type == XML_ELEMENT_NODE)) { - xml_char = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"name"); - if (NULL != xml_char) { - if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.srcport"))) { - xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"value"); - if (NULL != xml_char2) { - sctp_hdr->src_port = strtoul((const char *)xml_char2, NULL, 16); - xmlFree(xml_char2); - } - } else if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.dstport"))) { - xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"value"); - if (NULL != xml_char2) { - sctp_hdr->dst_port = strtoul((const char *)xml_char2, NULL, 16); - xmlFree(xml_char2); - } - } else if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.chunk_type"))) { - xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"value"); - if (NULL != xml_char2) { - sctp_hdr->chunk_type = strtoul((const char *)xml_char2, NULL, 0); - xmlFree(xml_char2); - switch (sctp_hdr->chunk_type) { - case SCTP_CID_DATA: - et_parse_sctp_data_chunk(doc, sctp_node->parent, &sctp_hdr->u.data_hdr); - break; - case SCTP_CID_INIT: - et_parse_sctp_init_chunk(doc, sctp_node->parent, &sctp_hdr->u.init_hdr); - break; - case SCTP_CID_INIT_ACK: - et_parse_sctp_init_ack_chunk(doc, sctp_node->parent, &sctp_hdr->u.init_ack_hdr); - break; - default: - ; - } - } - } - } - for (cur_node = sctp_node->children; cur_node; cur_node = cur_node->next) { - et_parse_sctp(doc, cur_node, sctp_hdr); - } - } -} -//------------------------------------------------------------------------------ -void et_packet_shift_timing(et_packet_t * const packet, const struct timeval * const shift) -{ - timeval_add(&packet->time_relative_to_first_packet, &packet->time_relative_to_first_packet, shift); - AssertFatal((packet->time_relative_to_first_packet.tv_sec >= 0) && (packet->time_relative_to_first_packet.tv_usec >= 0), - "Bad timing result time_relative_to_first_packet=%d.%d packet num %u, original frame number %u", - packet->time_relative_to_first_packet.tv_sec, - packet->time_relative_to_first_packet.tv_usec, - packet->packet_number, - packet->original_frame_number); - - timeval_add(&packet->time_relative_to_last_received_packet, &packet->time_relative_to_last_received_packet, shift); - AssertFatal((packet->time_relative_to_last_received_packet.tv_sec >= 0) && (packet->time_relative_to_last_received_packet.tv_usec >= 0), - "Bad timing result time_relative_to_last_received_packet=%d.%d packet num %u, original frame number %u", - packet->time_relative_to_last_received_packet.tv_sec, - packet->time_relative_to_last_received_packet.tv_usec, - packet->packet_number, - packet->original_frame_number); - - timeval_add(&packet->time_relative_to_last_sent_packet, &packet->time_relative_to_last_sent_packet, shift); - AssertFatal((packet->time_relative_to_last_sent_packet.tv_sec >= 0) && (packet->time_relative_to_last_sent_packet.tv_usec >= 0), - "Bad timing result time_relative_to_last_sent_packet=%d.%d packet num %u, original frame number %u", - packet->time_relative_to_last_sent_packet.tv_sec, - packet->time_relative_to_last_sent_packet.tv_usec, - packet->packet_number, - packet->original_frame_number); -} - -//------------------------------------------------------------------------------ -et_packet_t* et_parse_xml_packet(xmlDocPtr doc, xmlNodePtr node) -{ - - et_packet_t *packet = NULL; - xmlNode *cur_node = NULL; - xmlChar *xml_char = NULL; - float afloat = (float)0.0; - static struct timeval initial_time = { .tv_sec = 0, .tv_usec = 0 }; - static struct timeval relative_last_sent_packet = { .tv_sec = 0, .tv_usec = 0 }; - static struct timeval relative_last_received_packet = { .tv_sec = 0, .tv_usec = 0 }; - static char first_packet = 1; - static char first_sent_packet = 1; - static char first_received_packet = 1; - static unsigned int packet_number = 1; - - - if (NULL != node) { - packet = calloc(1, sizeof(*packet)); - - xml_char = xmlGetProp(node, (const xmlChar *)"action"); - packet->action = et_action_str2et_action_t(xml_char); - packet->status = ET_PACKET_STATUS_NONE; - xmlFree(xml_char); - packet->packet_number = packet_number++; - - for (cur_node = node->children; cur_node; cur_node = cur_node->next) { - //if (cur_node->type == XML_ELEMENT_NODE) { - if ((!xmlStrcmp(cur_node->name, (const xmlChar *)"frame.time_relative"))) { - xml_char = xmlGetProp((xmlNode *)cur_node, (const xmlChar *)"value"); - afloat = atof((const char*)xml_char); - xmlFree(xml_char); - fprintf(stdout, "Parsing packet frame.time_relative: %f\n", afloat); - packet->time_relative_to_first_packet.tv_sec = (int)afloat; - packet->time_relative_to_first_packet.tv_usec = (int)((afloat - packet->time_relative_to_first_packet.tv_sec)*1000000.0); - - if (first_packet > 0) { - initial_time = packet->time_relative_to_first_packet; - packet->time_relative_to_first_packet.tv_sec = 0; - packet->time_relative_to_first_packet.tv_usec = 0; - first_packet = 0; - } else { - timersub(&packet->time_relative_to_first_packet, &initial_time, - &packet->time_relative_to_first_packet); - } - } else if ((!xmlStrcmp(cur_node->name, (const xmlChar *)"frame.number"))) { - xml_char = xmlGetProp((xmlNode *)cur_node, (const xmlChar *)"value"); - packet->original_frame_number = strtoul((const char *)xml_char, NULL, 0); - fprintf(stdout, "Parsing packet frame.number: %u\n", packet->original_frame_number); - xmlFree(xml_char); - } else if ((!xmlStrcmp(cur_node->name, (const xmlChar *)"ip.src"))) { - xml_char = xmlNodeListGetString(doc, cur_node->xmlChildrenNode, 1); - et_ip_str2et_ip(xml_char, &packet->ip_hdr.src); - xmlFree(xml_char); - } else if ((!xmlStrcmp(cur_node->name, (const xmlChar *)"ip.dst"))) { - xml_char = xmlNodeListGetString(doc, cur_node->xmlChildrenNode, 1); - et_ip_str2et_ip(xml_char, &packet->ip_hdr.dst); - xmlFree(xml_char); - } else if ((!xmlStrcmp(cur_node->name, (const xmlChar *)"proto"))) { - xml_char = xmlGetProp((xmlNode *)cur_node, (const xmlChar *)"name"); - if (NULL != xml_char) { - if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp"))) { - et_parse_sctp(doc, cur_node, &packet->sctp_hdr); - } - xmlFree(xml_char); - } - } else if ((!xmlStrcmp(cur_node->name, (const xmlChar *)"eNB.instance"))) { - xml_char = xmlGetProp((xmlNode *)cur_node, (const xmlChar *)"value"); - packet->enb_instance = strtoul((const char *)xml_char, NULL, 0); - xmlFree(xml_char); - } - //} - } - } - return packet; -} -//------------------------------------------------------------------------------ -et_scenario_t* et_generate_scenario( - const char * const tsml_out_scenario_filename) -{ - xmlDocPtr doc = NULL; - xmlNodePtr root = NULL; - xmlNodePtr node = NULL; - xmlChar *xml_char = NULL; - et_scenario_t *scenario = NULL; - et_packet_t *last_packet = NULL; - et_packet_t *packet = NULL; - et_packet_t **next_packet = NULL; - - doc = xmlParseFile(tsml_out_scenario_filename); - if (NULL == doc) { - AssertFatal (0, "Could not parse scenario xml file %s!\n", tsml_out_scenario_filename); - } else { - fprintf(stdout, "Test scenario file to play: %s\n", tsml_out_scenario_filename); - //xmlDebugDumpDocument(NULL, doc); - } - - // Get root - root = xmlDocGetRootElement(doc); - if (NULL != root) { - if ((!xmlStrcmp(root->name, (const xmlChar *)"scenario"))) { - xml_char = xmlGetProp(root, (const xmlChar *)"name"); - printf("scenario name: %s\n", xml_char); - scenario = calloc(1, sizeof(*scenario)); - scenario->name = xml_char; // nodup nofree - - next_packet = &scenario->list_packet; - for (node = root->children; node != NULL; node = node->next) { - if ((!xmlStrcmp(node->name, (const xmlChar *)"packet"))) { - packet = et_parse_xml_packet(doc, node); - if (NULL != packet) { - // special case: S1AP same frame for 2 packets - if (NULL != last_packet) { - if (last_packet->original_frame_number == packet->original_frame_number) { - // updating because these informations are not in 2nd sctp header (same IP packet) - packet->sctp_hdr.dst_port = last_packet->sctp_hdr.dst_port; - packet->sctp_hdr.src_port = last_packet->sctp_hdr.src_port; - } - } - *next_packet = packet; - next_packet = &packet->next; - } else { - fprintf(stdout, "WARNING omitted packet\n"); - } - } - last_packet = packet; - } - } - } else { - fprintf(stderr, "Empty xml document\n"); - } - xmlFreeDoc(doc); - xmlCleanupParser(); - return scenario; -} -//------------------------------------------------------------------------------ -int et_generate_xml_scenario( - const char const * xml_in_dir_name, - const char const * xml_in_scenario_filename, - const char const * enb_config_filename, - char const * tsml_out_scenario_filename) -//------------------------------------------------------------------------------ -{ - //int fd_pdml_in; - xsltStylesheetPtr cur = NULL; - xmlDocPtr doc, res; - FILE *play_scenario_file = NULL; - const char *params[2*ENB_CONFIG_MAX_XSLT_PARAMS]; - int nb_params = 0; - int i,j; - char astring[1024]; - struct in_addr addr; - int ret = 0; - - memset(astring, 0, sizeof(astring)); - if (getcwd(astring, sizeof(astring)) != NULL) { - fprintf(stdout, "working in %s directory\n", astring); - } else { - perror("getcwd() ERROR"); - exit(1); - } - - - xmlSubstituteEntitiesDefault(1); - xmlLoadExtDtdDefaultValue = 1; - cur = xsltParseStylesheetFile((const xmlChar *)"/usr/share/oai/xsl/play_scenario.xsl"); - if (NULL == cur) { - AssertFatal (0, "Could not parse stylesheet file /usr/share/oai/xsl/play_scenario.xsl!\n"); - } else { - fprintf(stdout, "XSLT style sheet: /usr/share/oai/xsl/play_scenario.xsl\n"); - } - - doc = xmlParseFile(xml_in_scenario_filename); - if (NULL == doc) { - AssertFatal (0, "Could not parse scenario xml file %s!\n", xml_in_scenario_filename); - } else { - fprintf(stdout, "Test scenario file: %s\n", xml_in_scenario_filename); - } - - for (i = 0; i < g_enb_properties.number; i++) { - // eNB S1-C IPv4 address - sprintf(astring, "enb%d_s1c", i); - params[nb_params++] = strdup(astring); - addr.s_addr = g_enb_properties.properties[i]->enb_ipv4_address_for_S1_MME; - sprintf(astring, "\"%s\"", inet_ntoa(addr)); - params[nb_params++] = strdup(astring); - - // MME S1-C IPv4 address - for (j = 0; j < g_enb_properties.properties[i]->nb_mme; j++) { - sprintf(astring, "mme%d_s1c_%d", i, j); - params[nb_params++] = strdup(astring); - AssertFatal (g_enb_properties.properties[i]->mme_ip_address[j].ipv4_address, - "Only support MME IPv4 address\n"); - sprintf(astring, "\"%s\"", g_enb_properties.properties[i]->mme_ip_address[j].ipv4_address); - params[nb_params++] = strdup(astring); - } - } - params[nb_params] = NULL; - res = xsltApplyStylesheet(cur, doc, params); - if (NULL != res) { - sprintf((char *)tsml_out_scenario_filename,"%s",xml_in_scenario_filename); - if (et_strip_extension((char *)tsml_out_scenario_filename) > 0) { - strcat((char *)tsml_out_scenario_filename, ".tsml"); - play_scenario_file = fopen( tsml_out_scenario_filename, "w+"); - if (NULL != play_scenario_file) { - xsltSaveResultToFile(play_scenario_file, res, cur); - fclose(play_scenario_file); - fprintf(stdout, "Wrote test scenario to %s\n", tsml_out_scenario_filename); - } else { - fprintf(stderr, "ERROR in fopen(%s)\n", tsml_out_scenario_filename); - ret = -1; - } - } else { - fprintf(stderr, "ERROR in strip_extension()\n"); - ret = -1; - } - } else { - fprintf(stderr, "ERROR in xsltApplyStylesheet()\n"); - ret = -1; - } - xsltFreeStylesheet(cur); - xmlFreeDoc(doc); - xmlFreeDoc(res); - - xsltCleanupGlobals(); - xmlCleanupParser(); - return ret; -} - diff --git a/openair3/TEST/EPC_TEST/play_scenario_s1ap.c b/openair3/TEST/EPC_TEST/play_scenario_s1ap.c deleted file mode 100644 index fe132fd2f5..0000000000 --- a/openair3/TEST/EPC_TEST/play_scenario_s1ap.c +++ /dev/null @@ -1,1168 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.1 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -/* - play_scenario_s1ap.c - ------------------- - AUTHOR : Lionel GAUTHIER - COMPANY : EURECOM - EMAIL : Lionel.Gauthier@eurecom.fr - */ -#include -#include -#include -#include -#include -#include -#include -#include "tree.h" -#include "queue.h" - - -#include "intertask_interface.h" -#include "platform_types.h" -#include "assertions.h" -#include "conversions.h" -#include "s1ap_common.h" -#include "play_scenario_s1ap_eNB_defs.h" -#include "play_scenario.h" -//------------------------------------------------------------------------------ -s1ap_eNB_internal_data_t s1ap_eNB_internal_data; -RB_GENERATE(s1ap_mme_map, s1ap_eNB_mme_data_s, entry, et_s1ap_eNB_compare_assoc_id); -//------------------------------------------------------------------------------ -extern et_scenario_t *g_scenario; -extern uint32_t g_constraints; -//------------------------------------------------------------------------------ -int et_s1ap_eNB_compare_assoc_id( - struct s1ap_eNB_mme_data_s *p1, struct s1ap_eNB_mme_data_s *p2) -{ - if (p1->assoc_id == -1) { - if (p1->cnx_id < p2->cnx_id) { - return -1; - } - if (p1->cnx_id > p2->cnx_id) { - return 1; - } - } else { - if (p1->assoc_id < p2->assoc_id) { - return -1; - } - if (p1->assoc_id > p2->assoc_id) { - return 1; - } - } - - /* Matching reference */ - return 0; -} -//------------------------------------------------------------------------------ -uint32_t et_s1ap_generate_eNB_id(void) -{ - char *out; - char hostname[50]; - int ret; - uint32_t eNB_id; - - /* Retrieve the host name */ - ret = gethostname(hostname, sizeof(hostname)); - DevAssert(ret == 0); - - out = crypt(hostname, "eurecom"); - DevAssert(out != NULL); - - eNB_id = ((out[0] << 24) | (out[1] << 16) | (out[2] << 8) | out[3]); - - return eNB_id; -} -//------------------------------------------------------------------------------ -uint16_t et_s1ap_eNB_fetch_add_global_cnx_id(void) -{ - return ++s1ap_eNB_internal_data.global_cnx_id; -} - -//------------------------------------------------------------------------------ -void et_s1ap_eNB_prepare_internal_data(void) -{ - memset(&s1ap_eNB_internal_data, 0, sizeof(s1ap_eNB_internal_data)); - STAILQ_INIT(&s1ap_eNB_internal_data.s1ap_eNB_instances_head); -} - -//------------------------------------------------------------------------------ -void et_s1ap_eNB_insert_new_instance(s1ap_eNB_instance_t *new_instance_p) -{ - DevAssert(new_instance_p != NULL); - - STAILQ_INSERT_TAIL(&s1ap_eNB_internal_data.s1ap_eNB_instances_head, - new_instance_p, s1ap_eNB_entries); -} - -//------------------------------------------------------------------------------ -struct s1ap_eNB_mme_data_s *et_s1ap_eNB_get_MME( - s1ap_eNB_instance_t *instance_p, - int32_t assoc_id, uint16_t cnx_id) -{ - struct s1ap_eNB_mme_data_s temp; - struct s1ap_eNB_mme_data_s *found; - - memset(&temp, 0, sizeof(struct s1ap_eNB_mme_data_s)); - - temp.assoc_id = assoc_id; - temp.cnx_id = cnx_id; - - if (instance_p == NULL) { - STAILQ_FOREACH(instance_p, &s1ap_eNB_internal_data.s1ap_eNB_instances_head, - s1ap_eNB_entries) { - found = RB_FIND(s1ap_mme_map, &instance_p->s1ap_mme_head, &temp); - - if (found != NULL) { - return found; - } - } - } else { - return RB_FIND(s1ap_mme_map, &instance_p->s1ap_mme_head, &temp); - } - - return NULL; -} - -//------------------------------------------------------------------------------ -s1ap_eNB_instance_t *et_s1ap_eNB_get_instance(instance_t instance) -{ - s1ap_eNB_instance_t *temp = NULL; - - STAILQ_FOREACH(temp, &s1ap_eNB_internal_data.s1ap_eNB_instances_head, - s1ap_eNB_entries) { - if (temp->instance == instance) { - /* Matching occurence */ - return temp; - } - } - - return NULL; -} -//------------------------------------------------------------------------------ -void et_s1ap_eNB_itti_send_sctp_data_req(instance_t instance, int32_t assoc_id, uint8_t *buffer, - uint32_t buffer_length, uint16_t stream) -{ - MessageDef *message_p; - sctp_data_req_t *sctp_data_req; - - message_p = itti_alloc_new_message(TASK_S1AP, SCTP_DATA_REQ); - - sctp_data_req = &message_p->ittiMsg.sctp_data_req; - - sctp_data_req->assoc_id = assoc_id; - sctp_data_req->buffer = buffer; - sctp_data_req->buffer_length = buffer_length; - sctp_data_req->stream = stream; - - itti_send_msg_to_task(TASK_SCTP, instance, message_p); -} -//------------------------------------------------------------------------------ -int et_handle_s1ap_mismatch_mme_ue_s1ap_id(et_packet_t * const spacket, et_packet_t * const rx_packet) -{ - S1AP_MME_UE_S1AP_ID_t scenario_mme_ue_s1ap_id = 0; - S1AP_MME_UE_S1AP_ID_t rx_mme_ue_s1ap_id = 0; - S1AP_PDU_PR present; - - present = rx_packet->sctp_hdr.u.data_hdr.payload.pdu.present; - - switch (rx_packet->sctp_hdr.u.data_hdr.payload.message.procedureCode) { - case S1AP_ProcedureCode_id_HandoverPreparation: - if (present == S1AP_S1AP_PDU_PR_initiatingMessage) { - rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_HandoverRequiredIEs.mme_ue_s1ap_id; - scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_HandoverRequiredIEs.mme_ue_s1ap_id; - } else { - rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_HandoverCommandIEs.mme_ue_s1ap_id; - scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_HandoverCommandIEs.mme_ue_s1ap_id; - } - break; - - case S1AP_ProcedureCode_id_HandoverResourceAllocation: - if (present == S1AP_S1AP_PDU_PR_initiatingMessage) { - rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_HandoverRequestIEs.mme_ue_s1ap_id; - scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_HandoverRequestIEs.mme_ue_s1ap_id; - } else if (present == S1AP_S1AP_PDU_PR_successfulOutcome) { - rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_HandoverRequestAcknowledgeIEs.mme_ue_s1ap_id; - scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_HandoverRequestAcknowledgeIEs.mme_ue_s1ap_id; - } else if (present == S1AP_S1AP_PDU_PR_unsuccessfulOutcome) { - rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_HandoverFailureIEs.mme_ue_s1ap_id; - scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_HandoverFailureIEs.mme_ue_s1ap_id; - } - break; - - case S1AP_ProcedureCode_id_HandoverNotification: - rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_HandoverNotifyIEs.mme_ue_s1ap_id; - scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_HandoverNotifyIEs.mme_ue_s1ap_id; - break; - - case S1AP_ProcedureCode_id_PathSwitchRequest: - //rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_PathSwitchRequestIEs.mme_ue_s1ap_id; - //scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_PathSwitchRequestIEs.mme_ue_s1ap_id; - break; - - case S1AP_ProcedureCode_id_HandoverCancel: - rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_HandoverCancelIEs.mme_ue_s1ap_id; - scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_HandoverCancelIEs.mme_ue_s1ap_id; - break; - - case S1AP_ProcedureCode_id_E_RABSetup: - if (present == S1AP_S1AP_PDU_PR_initiatingMessage) { - rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_E_RABSetupRequestIEs.mme_ue_s1ap_id; - scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_E_RABSetupRequestIEs.mme_ue_s1ap_id; - } else { - rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_E_RABSetupResponseIEs.mme_ue_s1ap_id; - scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_E_RABSetupResponseIEs.mme_ue_s1ap_id; - } - break; - - case S1ap_ProcedureCode_id_E_RABModify: - if (present == S1AP_PDU_PR_initiatingMessage) { - rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_E_RABModifyRequestIEs.mme_ue_s1ap_id; - scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_E_RABModifyRequestIEs.mme_ue_s1ap_id; - } else { - rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_E_RABModifyResponseIEs.mme_ue_s1ap_id; - scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_E_RABModifyResponseIEs.mme_ue_s1ap_id; - } - break; - - case S1ap_ProcedureCode_id_E_RABRelease: - if (present == S1AP_PDU_PR_initiatingMessage) { - rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_E_RABReleaseCommandIEs.mme_ue_s1ap_id; - scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_E_RABReleaseCommandIEs.mme_ue_s1ap_id; - } else { - rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_E_RABReleaseResponseIEs.mme_ue_s1ap_id; - scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_E_RABReleaseResponseIEs.mme_ue_s1ap_id; - } - break; - - case S1ap_ProcedureCode_id_E_RABReleaseIndication: - rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_E_RABReleaseIndicationIEs.mme_ue_s1ap_id; - scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_E_RABReleaseIndicationIEs.mme_ue_s1ap_id; - break; - - case S1ap_ProcedureCode_id_InitialContextSetup: - if (present == S1AP_PDU_PR_initiatingMessage) { - rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_InitialContextSetupRequestIEs.mme_ue_s1ap_id; - scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_InitialContextSetupRequestIEs.mme_ue_s1ap_id; - } else { - rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_InitialContextSetupResponseIEs.mme_ue_s1ap_id; - scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_InitialContextSetupResponseIEs.mme_ue_s1ap_id; - } - break; - - case S1ap_ProcedureCode_id_Paging: - //rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_PagingIEs.mme_ue_s1ap_id; - //scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_PagingIEs.mme_ue_s1ap_id; - break; - - case S1ap_ProcedureCode_id_downlinkNASTransport: - rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_DownlinkNASTransportIEs.mme_ue_s1ap_id; - scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_DownlinkNASTransportIEs.mme_ue_s1ap_id; - break; - - case S1ap_ProcedureCode_id_initialUEMessage: - //rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_InitialUEMessageIEs.mme_ue_s1ap_id; - //scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_InitialUEMessageIEs.mme_ue_s1ap_id; - break; - - case S1ap_ProcedureCode_id_uplinkNASTransport: - rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UplinkNASTransportIEs.mme_ue_s1ap_id; - scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UplinkNASTransportIEs.mme_ue_s1ap_id; - break; - - case S1ap_ProcedureCode_id_Reset: - //rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_ResetIEs.mme_ue_s1ap_id; - //scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_ResetIEs.mme_ue_s1ap_id; - break; - - case S1ap_ProcedureCode_id_ErrorIndication: - rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_ErrorIndicationIEs.mme_ue_s1ap_id; - scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_ErrorIndicationIEs.mme_ue_s1ap_id; - break; - - case S1ap_ProcedureCode_id_NASNonDeliveryIndication: - rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_NASNonDeliveryIndication_IEs.mme_ue_s1ap_id; - scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_NASNonDeliveryIndication_IEs.mme_ue_s1ap_id; - break; - - case S1ap_ProcedureCode_id_S1Setup: - /*if (present == S1AP_PDU_PR_initiatingMessage) { - rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_S1SetupRequestIEs.mme_ue_s1ap_id; - scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_S1SetupRequestIEs.mme_ue_s1ap_id; - } else if (present == S1AP_PDU_PR_successfulOutcome) { - rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_S1SetupResponseIEs.mme_ue_s1ap_id; - scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_S1SetupResponseIEs.mme_ue_s1ap_id; - } else if (present == S1AP_PDU_PR_unsuccessfulOutcome) { - rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_S1SetupFailureIEs.mme_ue_s1ap_id; - scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_S1SetupFailureIEs.mme_ue_s1ap_id; - }*/ - break; - - case S1ap_ProcedureCode_id_UEContextReleaseRequest: - rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UEContextReleaseRequestIEs.mme_ue_s1ap_id; - scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UEContextReleaseRequestIEs.mme_ue_s1ap_id; - break; - - case S1ap_ProcedureCode_id_DownlinkS1cdma2000tunneling: - rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_DownlinkS1cdma2000tunnelingIEs.mme_ue_s1ap_id; - scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_DownlinkS1cdma2000tunnelingIEs.mme_ue_s1ap_id; - break; - - case S1ap_ProcedureCode_id_UplinkS1cdma2000tunneling: - rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UplinkS1cdma2000tunnelingIEs.mme_ue_s1ap_id; - scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UplinkS1cdma2000tunnelingIEs.mme_ue_s1ap_id; - break; - - case S1ap_ProcedureCode_id_UEContextModification: - if (present == S1AP_PDU_PR_initiatingMessage) { - rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UEContextModificationRequestIEs.mme_ue_s1ap_id; - scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UEContextModificationRequestIEs.mme_ue_s1ap_id; - } else if (present == S1AP_PDU_PR_successfulOutcome) { - rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UEContextModificationResponseIEs.mme_ue_s1ap_id; - scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UEContextModificationResponseIEs.mme_ue_s1ap_id; - } else if (present == S1AP_PDU_PR_unsuccessfulOutcome) { - rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UEContextModificationFailureIEs.mme_ue_s1ap_id; - scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UEContextModificationFailureIEs.mme_ue_s1ap_id; - } - break; - - case S1ap_ProcedureCode_id_UECapabilityInfoIndication: - rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UECapabilityInfoIndicationIEs.mme_ue_s1ap_id; - scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UECapabilityInfoIndicationIEs.mme_ue_s1ap_id; - break; - - case S1ap_ProcedureCode_id_UEContextRelease: - if (present == S1AP_PDU_PR_initiatingMessage) { - switch (rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UEContextReleaseCommandIEs.uE_S1AP_IDs.present) { - case S1ap_UE_S1AP_IDs_PR_uE_S1AP_ID_pair: - rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UEContextReleaseCommandIEs.uE_S1AP_IDs.choice.uE_S1AP_ID_pair.mME_UE_S1AP_ID; - scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UEContextReleaseCommandIEs.uE_S1AP_IDs.choice.uE_S1AP_ID_pair.mME_UE_S1AP_ID; - break; - case S1ap_UE_S1AP_IDs_PR_mME_UE_S1AP_ID: - rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UEContextReleaseCommandIEs.uE_S1AP_IDs.choice.mME_UE_S1AP_ID; - scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UEContextReleaseCommandIEs.uE_S1AP_IDs.choice.mME_UE_S1AP_ID; - break; - } - } else { - rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UEContextReleaseCompleteIEs.mme_ue_s1ap_id; - scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UEContextReleaseCompleteIEs.mme_ue_s1ap_id; - } - break; - - case S1ap_ProcedureCode_id_eNBStatusTransfer: - rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_ENBStatusTransferIEs.mme_ue_s1ap_id; - scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_ENBStatusTransferIEs.mme_ue_s1ap_id; - break; - - case S1ap_ProcedureCode_id_MMEStatusTransfer: - rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_MMEStatusTransferIEs.mme_ue_s1ap_id; - scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_MMEStatusTransferIEs.mme_ue_s1ap_id; - break; - - case S1ap_ProcedureCode_id_DeactivateTrace: - rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_DeactivateTraceIEs.mme_ue_s1ap_id; - scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_DeactivateTraceIEs.mme_ue_s1ap_id; - break; - - case S1ap_ProcedureCode_id_TraceStart: - rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_TraceStartIEs.mme_ue_s1ap_id; - scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_TraceStartIEs.mme_ue_s1ap_id; - break; - - case S1ap_ProcedureCode_id_TraceFailureIndication: - rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_TraceFailureIndicationIEs.mme_ue_s1ap_id; - scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_TraceFailureIndicationIEs.mme_ue_s1ap_id; - break; - - case S1ap_ProcedureCode_id_ENBConfigurationUpdate: - /*if (present == S1AP_PDU_PR_initiatingMessage) { - rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_ENBConfigurationUpdateIEs.mme_ue_s1ap_id; - scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_ENBConfigurationUpdateIEs.mme_ue_s1ap_id; - } else if (present == S1AP_PDU_PR_successfulOutcome) { - rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_ENBConfigurationUpdateAcknowledgeIEs.mme_ue_s1ap_id; - scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_ENBConfigurationUpdateAcknowledgeIEs.mme_ue_s1ap_id; - } else { - rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_ENBConfigurationUpdateFailureIEs.mme_ue_s1ap_id; - scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_ENBConfigurationUpdateFailureIEs.mme_ue_s1ap_id; - }*/ - break; - - case S1ap_ProcedureCode_id_MMEConfigurationUpdate: - /*if (present == S1AP_PDU_PR_initiatingMessage) { - rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_MMEConfigurationUpdateIEs.mme_ue_s1ap_id; - scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_MMEConfigurationUpdateIEs.mme_ue_s1ap_id; - } else if (present == S1AP_PDU_PR_successfulOutcome) { - rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_MMEConfigurationUpdateAcknowledgeIEs.mme_ue_s1ap_id; - scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_MMEConfigurationUpdateAcknowledgeIEs.mme_ue_s1ap_id; - } else { - rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_MMEConfigurationUpdateFailureIEs.mme_ue_s1ap_id; - scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_MMEConfigurationUpdateFailureIEs.mme_ue_s1ap_id; - }*/ - break; - - case S1ap_ProcedureCode_id_LocationReportingControl: - rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_LocationReportingControlIEs.mme_ue_s1ap_id; - scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_LocationReportingControlIEs.mme_ue_s1ap_id; - break; - - case S1ap_ProcedureCode_id_LocationReportingFailureIndication: - rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_LocationReportingFailureIndicationIEs.mme_ue_s1ap_id; - scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_LocationReportingFailureIndicationIEs.mme_ue_s1ap_id; - break; - - case S1ap_ProcedureCode_id_LocationReport: - rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_LocationReportIEs.mme_ue_s1ap_id; - scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_LocationReportIEs.mme_ue_s1ap_id; - break; - - case S1ap_ProcedureCode_id_OverloadStart: - //rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_OverloadStartIEs.mme_ue_s1ap_id; - //scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_OverloadStartIEs.mme_ue_s1ap_id; - break; - - case S1ap_ProcedureCode_id_OverloadStop: - //rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_OverloadStopIEs.mme_ue_s1ap_id; - //scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_OverloadStopIEs.mme_ue_s1ap_id; - break; - - case S1ap_ProcedureCode_id_WriteReplaceWarning: - /*if (present == S1AP_PDU_PR_initiatingMessage) { - rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_WriteReplaceWarningRequestIEs.mme_ue_s1ap_id; - scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_WriteReplaceWarningRequestIEs.mme_ue_s1ap_id; - } else { - rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_WriteReplaceWarningResponseIEs.mme_ue_s1ap_id; - scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_WriteReplaceWarningResponseIEs.mme_ue_s1ap_id; - }*/ - break; - - case S1AP_ProcedureCode_id_eNBDirectInformationTransfer: - //rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_ENBDirectInformationTransferIEs.mme_ue_s1ap_id; - //scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_ENBDirectInformationTransferIEs.mme_ue_s1ap_id; - break; - - case S1AP_ProcedureCode_id_MMEDirectInformationTransfer: - //rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_MMEDirectInformationTransferIEs.mme_ue_s1ap_id; - //scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_MMEDirectInformationTransferIEs.mme_ue_s1ap_id; - break; - - case S1AP_ProcedureCode_id_PrivateMessage: - case S1AP_ProcedureCode_id_eNBConfigurationTransfer: - case S1AP_ProcedureCode_id_MMEConfigurationTransfer: - AssertFatal(0, "TODO"); - break; - - case S1AP_ProcedureCode_id_CellTrafficTrace: - rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_CellTrafficTraceIEs.mme_ue_s1ap_id; - scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_CellTrafficTraceIEs.mme_ue_s1ap_id; - break; - - case S1AP_ProcedureCode_id_Kill: - /*if (present == S1AP_S1AP_PDU_PR_initiatingMessage) { - rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_KillRequestIEs.mme_ue_s1ap_id; - scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_KillRequestIEs.mme_ue_s1ap_id; - } else { - rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_KillResponseIEs.mme_ue_s1ap_id; - scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_KillResponseIEs.mme_ue_s1ap_id; - }*/ - break; - - case S1AP_ProcedureCode_id_downlinkUEAssociatedLPPaTransport: - rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_DownlinkUEAssociatedLPPaTransport_IEs.mme_ue_s1ap_id; - scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_DownlinkUEAssociatedLPPaTransport_IEs.mme_ue_s1ap_id; - break; - - case S1AP_ProcedureCode_id_uplinkUEAssociatedLPPaTransport: - rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UplinkUEAssociatedLPPaTransport_IEs.mme_ue_s1ap_id; - scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UplinkUEAssociatedLPPaTransport_IEs.mme_ue_s1ap_id; - break; - - case S1AP_ProcedureCode_id_downlinkNonUEAssociatedLPPaTransport: - //rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_DownlinkNonUEAssociatedLPPaTransport_IEs.mme_ue_s1ap_id; - //scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_DownlinkNonUEAssociatedLPPaTransport_IEs.mme_ue_s1ap_id; - break; - - case S1AP_ProcedureCode_id_uplinkNonUEAssociatedLPPaTransport: - //rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UplinkNonUEAssociatedLPPaTransport_IEs.mme_ue_s1ap_id; - //scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UplinkNonUEAssociatedLPPaTransport_IEs.mme_ue_s1ap_id; - break; - - default: - AssertFatal(0, "Unknown procedure code %ld", rx_packet->sctp_hdr.u.data_hdr.payload.message.procedureCode); - } - - if (scenario_mme_ue_s1ap_id != rx_mme_ue_s1ap_id) { - S1AP_DEBUG("%s() Updating mme_ue_s1ap_id %u -> %u \n", __FUNCTION__, scenario_mme_ue_s1ap_id, rx_mme_ue_s1ap_id); - et_packet_t *p = spacket; - - while (p) { - et_s1ap_update_mme_ue_s1ap_id(p, scenario_mme_ue_s1ap_id, rx_mme_ue_s1ap_id); - p = p->next; - } - return 0; - } - return 1; -} -//------------------------------------------------------------------------------ -asn_comp_rval_t * et_s1ap_is_matching(et_s1ap_t * const s1ap1, et_s1ap_t * const s1ap2, const uint32_t constraints) -{ - asn_comp_rval_t *rv = NULL; - if (s1ap1->pdu.present != s1ap2->pdu.present) {rv = calloc(1, sizeof(asn_comp_rval_t)); rv->err_code = ET_ERROR_MATCH_PACKET_S1AP_PRESENT; return rv;} - switch (s1ap1->pdu.present) { - case S1AP_PDU_PR_NOTHING: - break; - case S1AP_PDU_PR_initiatingMessage: - if (s1ap1->pdu.choice.initiatingMessage.procedureCode != s1ap2->pdu.choice.initiatingMessage.procedureCode) - {rv = calloc(1, sizeof(asn_comp_rval_t)); rv->err_code = ET_ERROR_MATCH_PACKET_S1AP_PROCEDURE_CODE; return rv;} - if (s1ap1->pdu.choice.initiatingMessage.criticality != s1ap2->pdu.choice.initiatingMessage.criticality) - {rv = calloc(1, sizeof(asn_comp_rval_t)); rv->err_code = ET_ERROR_MATCH_PACKET_S1AP_CRITICALITY; return rv;} - break; - case S1AP_PDU_PR_successfulOutcome: - if (s1ap1->pdu.choice.successfulOutcome.procedureCode != s1ap2->pdu.choice.successfulOutcome.procedureCode) - {rv = calloc(1, sizeof(asn_comp_rval_t)); rv->err_code = ET_ERROR_MATCH_PACKET_S1AP_PROCEDURE_CODE; return rv;} - if (s1ap1->pdu.choice.successfulOutcome.criticality != s1ap2->pdu.choice.successfulOutcome.criticality) - {rv = calloc(1, sizeof(asn_comp_rval_t)); rv->err_code = ET_ERROR_MATCH_PACKET_S1AP_CRITICALITY; return rv;} - break; - case S1AP_PDU_PR_unsuccessfulOutcome: - if (s1ap1->pdu.choice.unsuccessfulOutcome.procedureCode != s1ap2->pdu.choice.unsuccessfulOutcome.procedureCode) - {rv = calloc(1, sizeof(asn_comp_rval_t)); rv->err_code = ET_ERROR_MATCH_PACKET_S1AP_PROCEDURE_CODE; return rv;} - if (s1ap1->pdu.choice.unsuccessfulOutcome.criticality != s1ap2->pdu.choice.unsuccessfulOutcome.criticality) - {rv = calloc(1, sizeof(asn_comp_rval_t)); rv->err_code = ET_ERROR_MATCH_PACKET_S1AP_CRITICALITY; return rv;} - break; - default: - AssertFatal(0, "Unknown pdu.present %d", s1ap1->pdu.present); - } - - if (s1ap1->binary_stream_allocated_size == s1ap2->binary_stream_allocated_size) { - if (memcmp((void*)s1ap1->binary_stream, (void*)s1ap2->binary_stream, s1ap1->binary_stream_allocated_size) == 0) return NULL; - } - // if no matching, may be the scenario need minor corrections (same enb_ue_s1ap_id but need to update mme_ue_s1ap_id) - return et_s1ap_ies_is_matching(s1ap1->pdu.present, &s1ap1->message, &s1ap2->message, constraints); -} - -//------------------------------------------------------------------------------ -et_packet_t* et_build_packet_from_s1ap_data_ind(et_event_s1ap_data_ind_t * const s1ap_data_ind) -{ - et_packet_t * packet = NULL; - AssertFatal (NULL != s1ap_data_ind, "Bad parameter sctp_data_ind\n"); - packet = calloc(1, sizeof(*packet)); - packet->action = ET_PACKET_ACTION_S1C_NULL; - //packet->time_relative_to_first_packet.tv_sec = 0; - //packet->time_relative_to_first_packet.tv_usec = 0; - //packet->time_relative_to_last_sent_packet.tv_sec = 0; - //packet->time_relative_to_last_sent_packet.tv_usec = 0; - //packet->time_relative_to_last_received_packet.tv_sec = 0; - //packet->time_relative_to_last_received_packet.tv_usec = 0; - //packet->original_frame_number = 0; - //packet->packet_number = 0; - packet->enb_instance = 0; //TODO - //packet->ip_hdr; - // keep in mind: allocated buffer: sctp_datahdr.payload.binary_stream - packet->sctp_hdr.chunk_type = SCTP_CID_DATA; - memcpy((void*)&packet->sctp_hdr.u.data_hdr, (void*)&s1ap_data_ind->sctp_datahdr, sizeof(packet->sctp_hdr)); - //packet->next = NULL; - packet->status = ET_PACKET_STATUS_RECEIVED; - //packet->timer_id = 0; - AssertFatal(0 == gettimeofday(&packet->timestamp_packet, NULL), "gettimeofday() Failed"); - return packet; -} - - -//------------------------------------------------------------------------------ -// return 0 if packet was waited -int et_scenario_set_packet_received(et_packet_t * const packet) -{ - et_packet_t * p = NULL; - int rc = 0; - - packet->status = ET_PACKET_STATUS_RECEIVED; - S1AP_DEBUG("Packet received: num %u | original frame number %u \n", packet->packet_number, packet->original_frame_number); - S1AP_DEBUG("Last Packet received: num %u | original frame number %u \n", g_scenario->last_rx_packet->packet_number, g_scenario->last_rx_packet->original_frame_number); - - p = g_scenario->last_rx_packet; - while (NULL != p) { - if (ET_PACKET_ACTION_S1C_RECEIVE == p->action) { - if ((ET_PACKET_STATUS_RECEIVED == p->status) || (ET_PACKET_STATUS_NOT_TAKEN_IN_ACCOUNT == p->status)) { - g_scenario->last_rx_packet = p; - g_scenario->time_last_rx_packet.tv_sec = p->timestamp_packet.tv_sec; - g_scenario->time_last_rx_packet.tv_usec = p->timestamp_packet.tv_usec; - S1AP_DEBUG("Set Last Packet received: num %u | original frame number %u \n", g_scenario->last_rx_packet->packet_number, g_scenario->last_rx_packet->original_frame_number); - S1AP_DEBUG("Set time_last_rx_packet %ld.%06d\n", g_scenario->time_last_rx_packet.tv_sec, g_scenario->time_last_rx_packet.tv_usec); - } else { - break; - } - } - p = p->next; - } - - if (0 != packet->timer_id) { - rc = timer_remove(packet->timer_id); - AssertFatal(rc == 0, "TODO: Debug Timer on Rx packet num %u unknown", packet->packet_number); - g_scenario->timer_count--; - return rc; - } - return 1; -} - -//------------------------------------------------------------------------------ -int et_s1ap_process_rx_packet(et_event_s1ap_data_ind_t * const s1ap_data_ind) -{ - et_packet_t *packet = NULL; - et_packet_t *rx_packet = NULL; - unsigned long int not_found = 1; - asn_comp_rval_t *comp_results = NULL; - asn_comp_rval_t *comp_results2 = NULL; - unsigned char error_code = 0; - - AssertFatal (NULL != s1ap_data_ind, "Bad parameter sctp_data_ind\n"); - rx_packet = et_build_packet_from_s1ap_data_ind(s1ap_data_ind); - - if (NULL == g_scenario->last_rx_packet) { - packet = g_scenario->list_packet; - while (NULL != packet) { - if (packet->action == ET_PACKET_ACTION_S1C_RECEIVE) { - if ((ET_PACKET_STATUS_RECEIVED == packet->status) || (ET_PACKET_STATUS_NOT_TAKEN_IN_ACCOUNT == packet->status)) { - g_scenario->last_rx_packet = packet; - if (ET_PACKET_STATUS_NOT_TAKEN_IN_ACCOUNT != packet->status) { - g_scenario->time_last_rx_packet.tv_sec = packet->timestamp_packet.tv_sec; - g_scenario->time_last_rx_packet.tv_usec = packet->timestamp_packet.tv_usec; - } - S1AP_DEBUG("Set Last Packet received: num %u | original frame number %u \n", g_scenario->last_rx_packet->packet_number, g_scenario->last_rx_packet->original_frame_number); - S1AP_DEBUG("Set time_last_rx_packet %ld.%06d\n", g_scenario->time_last_rx_packet.tv_sec, g_scenario->time_last_rx_packet.tv_usec); - } else { - break; - } - } - packet = packet->next; - } - packet = g_scenario->list_packet; - } else { - packet = g_scenario->last_rx_packet->next; - } - // not_found threshold may sure depend on number of mme, may be not sure on number of UE - while ((NULL != packet) && (not_found < 9)) { - S1AP_DEBUG("%s() Considering packet num %d original frame number %u\n", __FUNCTION__, packet->packet_number, packet->original_frame_number); - if (packet->action == ET_PACKET_ACTION_S1C_RECEIVE) { - comp_results = et_sctp_is_matching(&packet->sctp_hdr, &rx_packet->sctp_hdr, g_constraints); - if (NULL == comp_results) { - S1AP_DEBUG("Compare RX packet with packet: num %u | original frame number %u \n", packet->packet_number, packet->original_frame_number); - packet->timestamp_packet.tv_sec = rx_packet->timestamp_packet.tv_sec; - packet->timestamp_packet.tv_usec = rx_packet->timestamp_packet.tv_usec; - return et_scenario_set_packet_received(packet); - } else { - S1AP_DEBUG("Compare RX packet with packet: num %u | original frame number %u failed\n", - packet->packet_number, packet->original_frame_number); - while (comp_results) { - S1AP_DEBUG("Result err code %s(%u) ASN1 struct name %s\n", - et_error_match2str(comp_results->err_code), comp_results->err_code, comp_results->name); - - // (each asn1 rc <= 166 (enum e_S1AP_ProtocolIE_ID, in generated file S1AP_ProtocolIE_ID.h)) - if (comp_results->err_code == COMPARE_ERR_CODE_NO_MATCH) { - //TODO MME_UE_S1AP_ID, etc. - // get latest error code - if (strcmp(comp_results->name, "S1ap-MME-UE-S1AP-ID") == 0) { - if (0 == et_handle_s1ap_mismatch_mme_ue_s1ap_id((et_packet_t *const)packet, (et_packet_t *const)rx_packet)) { - packet->timestamp_packet.tv_sec = rx_packet->timestamp_packet.tv_sec; - packet->timestamp_packet.tv_usec = rx_packet->timestamp_packet.tv_usec; - return et_scenario_set_packet_received(packet); - } - } else if (strcmp(comp_results->name, "S1ap-TransportLayerAddress") == 0) { - S1AP_WARN("Some work needed there for %s, TODO in generic_scenario.xsl, add sgw conf file in the process, anyway continuing...\n",comp_results->name); - packet->timestamp_packet.tv_sec = rx_packet->timestamp_packet.tv_sec; - packet->timestamp_packet.tv_usec = rx_packet->timestamp_packet.tv_usec; - return et_scenario_set_packet_received(packet); - } else { - S1AP_WARN("\n\nRX PACKET:\n"); - et_display_packet_sctp(&rx_packet->sctp_hdr); - S1AP_WARN("\n\nWAITED PACKET:\n"); - et_display_packet_sctp(&packet->sctp_hdr); - AssertFatal(0,"Some work needed there"); - } - } - comp_results2 = comp_results; - comp_results = comp_results2->next; - et_free_pointer(comp_results2); - } - } - } - not_found += 1; - packet = packet->next; - } - et_display_packet_sctp(&rx_packet->sctp_hdr); - AssertFatal(0, "Rx packet not found in scenario (see dump above)"); - return -1; -} - -//------------------------------------------------------------------------------ -void et_s1ap_eNB_handle_sctp_data_ind(sctp_data_ind_t * const sctp_data_ind) -{ - int result = 0; - et_event_t event; - - DevAssert(sctp_data_ind != NULL); - - memset((void*)&event, 0, sizeof(event)); - - event.code = ET_EVENT_RX_S1AP; - event.u.s1ap_data_ind.sctp_datahdr.tsn = 0; - event.u.s1ap_data_ind.sctp_datahdr.stream = sctp_data_ind->stream; - event.u.s1ap_data_ind.sctp_datahdr.ssn = 0; - event.u.s1ap_data_ind.sctp_datahdr.ppid = S1AP_SCTP_PPID; - event.u.s1ap_data_ind.sctp_datahdr.assoc_id = sctp_data_ind->assoc_id; - - event.u.s1ap_data_ind.sctp_datahdr.payload.binary_stream_pos = 0; - event.u.s1ap_data_ind.sctp_datahdr.payload.binary_stream_allocated_size = sctp_data_ind->buffer_length; - event.u.s1ap_data_ind.sctp_datahdr.payload.binary_stream = NULL; - if ((sctp_data_ind->buffer_length > 0) && (NULL != sctp_data_ind->buffer)) { - event.u.s1ap_data_ind.sctp_datahdr.payload.binary_stream = calloc(1, sctp_data_ind->buffer_length); - memcpy(event.u.s1ap_data_ind.sctp_datahdr.payload.binary_stream, - sctp_data_ind->buffer, - sctp_data_ind->buffer_length); - - if (et_s1ap_decode_pdu( - &event.u.s1ap_data_ind.sctp_datahdr.payload.pdu, - &event.u.s1ap_data_ind.sctp_datahdr.payload.message, - event.u.s1ap_data_ind.sctp_datahdr.payload.binary_stream, - event.u.s1ap_data_ind.sctp_datahdr.payload.binary_stream_allocated_size) < 0) { - AssertFatal (0, "ERROR Cannot decode RX S1AP message!\n"); - } - - } - - result = itti_free(TASK_UNKNOWN, sctp_data_ind->buffer); - AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result); - - et_scenario_fsm_notify_event(event); - - memset((void*)&event, 0, sizeof(event)); - event.code = ET_EVENT_TICK; - et_scenario_fsm_notify_event(event); - -} -//------------------------------------------------------------------------------ -void et_s1ap_eNB_register_mme(s1ap_eNB_instance_t *instance_p, - net_ip_address_t *mme_ip_address, - net_ip_address_t *local_ip_addr, - uint16_t in_streams, - uint16_t out_streams) -{ - MessageDef *message_p = NULL; - sctp_new_association_req_t *sctp_new_association_req_p = NULL; - s1ap_eNB_mme_data_t *s1ap_mme_data_p = NULL; - - DevAssert(instance_p != NULL); - DevAssert(mme_ip_address != NULL); - - message_p = itti_alloc_new_message(TASK_S1AP, SCTP_NEW_ASSOCIATION_REQ); - - sctp_new_association_req_p = &message_p->ittiMsg.sctp_new_association_req; - - sctp_new_association_req_p->port = S1AP_PORT_NUMBER; - sctp_new_association_req_p->ppid = S1AP_SCTP_PPID; - - sctp_new_association_req_p->in_streams = in_streams; - sctp_new_association_req_p->out_streams = out_streams; - - memcpy(&sctp_new_association_req_p->remote_address, - mme_ip_address, - sizeof(*mme_ip_address)); - - memcpy(&sctp_new_association_req_p->local_address, - local_ip_addr, - sizeof(*local_ip_addr)); - - /* Create new MME descriptor */ - s1ap_mme_data_p = calloc(1, sizeof(*s1ap_mme_data_p)); - DevAssert(s1ap_mme_data_p != NULL); - - s1ap_mme_data_p->cnx_id = et_s1ap_eNB_fetch_add_global_cnx_id(); - sctp_new_association_req_p->ulp_cnx_id = s1ap_mme_data_p->cnx_id; - - s1ap_mme_data_p->assoc_id = -1; - s1ap_mme_data_p->s1ap_eNB_instance = instance_p; - - memcpy((void*)&s1ap_mme_data_p->mme_net_ip_address, mme_ip_address, sizeof(*mme_ip_address)); - - - STAILQ_INIT(&s1ap_mme_data_p->served_gummei); - - /* Insert the new descriptor in list of known MME - * but not yet associated. - */ - RB_INSERT(s1ap_mme_map, &instance_p->s1ap_mme_head, s1ap_mme_data_p); - s1ap_mme_data_p->state = S1AP_ENB_STATE_WAITING; - instance_p->s1ap_mme_nb ++; - instance_p->s1ap_mme_pending_nb ++; - - itti_send_msg_to_task(TASK_SCTP, instance_p->instance, message_p); -} -//------------------------------------------------------------------------------ -void et_s1ap_update_assoc_id_of_packets(const int32_t assoc_id, - struct s1ap_eNB_instance_s * const s1ap_eNB_instance, - s1ap_eNB_mme_data_t * const mme_desc_p) -{ - et_packet_t *packet = NULL; - int ret; - unsigned int old_enb_port = 0; - unsigned int old_mme_port = 0; - - S1AP_DEBUG("%s for SCTP association (%u)\n",__FUNCTION__,assoc_id); - - packet = g_scenario->list_packet; - while (NULL != packet) { - switch (packet->sctp_hdr.chunk_type) { - - case SCTP_CID_DATA : - S1AP_DEBUG("%s for SCTP association (%u) SCTP_CID_DATA\n",__FUNCTION__,assoc_id); - if ((ET_PACKET_STATUS_NONE == packet->status) || (ET_PACKET_STATUS_SCHEDULED_FOR_RECEIVING == packet->status)) { - if (0 < old_mme_port) { - if (packet->action == ET_PACKET_ACTION_S1C_SEND) { - ret = et_compare_et_ip_to_net_ip_address(&packet->ip_hdr.dst, &mme_desc_p->mme_net_ip_address); - if (0 == ret) { - ret = et_compare_et_ip_to_net_ip_address(&packet->ip_hdr.src, &s1ap_eNB_instance->s1c_net_ip_address); - if (0 == ret) { - // same IP src, same IP dst - if ((packet->sctp_hdr.dst_port == old_mme_port) && (packet->sctp_hdr.src_port == old_enb_port)) { - packet->sctp_hdr.u.data_hdr.assoc_id = assoc_id; - S1AP_DEBUG("tPacket:\tnum %u | original frame number %u \n", packet->packet_number, packet->original_frame_number); - S1AP_DEBUG("\tUpdated assoc id: %u\n", assoc_id); - } - } - } - } else if (packet->action == ET_PACKET_ACTION_S1C_RECEIVE) { - ret = et_compare_et_ip_to_net_ip_address(&packet->ip_hdr.src, &mme_desc_p->mme_net_ip_address); - if (0 == ret) { - ret = et_compare_et_ip_to_net_ip_address(&packet->ip_hdr.dst, &s1ap_eNB_instance->s1c_net_ip_address); - if (0 == ret) { - // same IP src, same IP dst - if ((packet->sctp_hdr.src_port == old_mme_port) && (packet->sctp_hdr.dst_port == old_enb_port)) { - packet->sctp_hdr.u.data_hdr.assoc_id = assoc_id; - S1AP_DEBUG("tPacket:\tnum %u | original frame number %u \n", packet->packet_number, packet->original_frame_number); - S1AP_DEBUG("\tUpdated assoc id: %u\n", assoc_id); - } - } - } - } - } - } - break; - - // Strong assumption - // in replayed scenario, the order of SCTP INIT packets is supposed to be the same as in the catched scenario - case SCTP_CID_INIT: - S1AP_DEBUG("%s for SCTP association (%u) SCTP_CID_INIT\n",__FUNCTION__,assoc_id); - ret = et_compare_et_ip_to_net_ip_address(&packet->ip_hdr.dst, &mme_desc_p->mme_net_ip_address); - if (0 == ret) { - ret = et_compare_et_ip_to_net_ip_address(&packet->ip_hdr.src, &s1ap_eNB_instance->s1c_net_ip_address); - if (0 == ret) { - if (0 == old_enb_port) { - if (ET_PACKET_STATUS_NONE == packet->status) { - packet->status = ET_PACKET_STATUS_SENT; - old_enb_port = packet->sctp_hdr.src_port; - S1AP_DEBUG("%s for SCTP association (%u) SCTP_CID_INIT SUCCESS\n",__FUNCTION__,assoc_id); - } - } - } - } - break; - - case SCTP_CID_INIT_ACK: - S1AP_DEBUG("%s for SCTP association (%u) SCTP_CID_INIT_ACK\n",__FUNCTION__,assoc_id); - ret = et_compare_et_ip_to_net_ip_address(&packet->ip_hdr.src, &mme_desc_p->mme_net_ip_address); - if (0 == ret) { - ret = et_compare_et_ip_to_net_ip_address(&packet->ip_hdr.dst, &s1ap_eNB_instance->s1c_net_ip_address); - if (0 == ret) { - if (old_enb_port == packet->sctp_hdr.dst_port) { - if (ET_PACKET_STATUS_NONE == packet->status) { - packet->status = ET_PACKET_STATUS_RECEIVED; - old_mme_port = packet->sctp_hdr.dst_port; - S1AP_DEBUG("%s for SCTP association (%u) SCTP_CID_INIT_ACK SUCCESS\n",__FUNCTION__,assoc_id); - } - } - } - } - break; - - case SCTP_CID_HEARTBEAT: - case SCTP_CID_HEARTBEAT_ACK: - case SCTP_CID_COOKIE_ECHO: - case SCTP_CID_COOKIE_ACK: - case SCTP_CID_ECN_ECNE: - case SCTP_CID_ECN_CWR: - break; - - case SCTP_CID_ABORT: - case SCTP_CID_SHUTDOWN: - case SCTP_CID_SHUTDOWN_ACK: - case SCTP_CID_ERROR: - case SCTP_CID_SHUTDOWN_COMPLETE: - //TODO - break; - - default: - AssertFatal(0, "Unknown chunk_type %d packet num %u", packet->sctp_hdr.chunk_type, packet->packet_number); - ; - } - packet = packet->next; - } -} -//------------------------------------------------------------------------------ -void et_s1ap_handle_s1_setup_message(s1ap_eNB_mme_data_t *mme_desc_p, int sctp_shutdown) -{ - if (sctp_shutdown) { - /* A previously connected MME has been shutdown */ - - /* TODO check if it was used by some eNB and send a message to inform these eNB if there is no more associated MME */ - if (mme_desc_p->state == S1AP_ENB_STATE_CONNECTED) { - mme_desc_p->state = S1AP_ENB_STATE_DISCONNECTED; - - if (mme_desc_p->s1ap_eNB_instance->s1ap_mme_associated_nb > 0) { - /* Decrease associated MME number */ - mme_desc_p->s1ap_eNB_instance->s1ap_mme_associated_nb --; - } - - /* If there are no more associated MME, inform eNB app */ - if (mme_desc_p->s1ap_eNB_instance->s1ap_mme_associated_nb == 0) { - MessageDef *message_p; - - message_p = itti_alloc_new_message(TASK_S1AP, S1AP_DEREGISTERED_ENB_IND); - S1AP_DEREGISTERED_ENB_IND(message_p).nb_mme = 0; - itti_send_msg_to_task(TASK_ENB_APP, mme_desc_p->s1ap_eNB_instance->instance, message_p); - } - } - } else { - /* Check that at least one setup message is pending */ - DevCheck(mme_desc_p->s1ap_eNB_instance->s1ap_mme_pending_nb > 0, mme_desc_p->s1ap_eNB_instance->instance, - mme_desc_p->s1ap_eNB_instance->s1ap_mme_pending_nb, 0); - - if (mme_desc_p->s1ap_eNB_instance->s1ap_mme_pending_nb > 0) { - /* Decrease pending messages number */ - mme_desc_p->s1ap_eNB_instance->s1ap_mme_pending_nb --; - mme_desc_p->s1ap_eNB_instance->s1ap_mme_associated_nb++; - } - - et_s1ap_update_assoc_id_of_packets(mme_desc_p->assoc_id, - mme_desc_p->s1ap_eNB_instance, - mme_desc_p); - - - /* If there are no more pending messages, inform eNB app */ - if (mme_desc_p->s1ap_eNB_instance->s1ap_mme_pending_nb == 0) { - MessageDef *message_p; - - message_p = itti_alloc_new_message(TASK_S1AP, S1AP_REGISTER_ENB_CNF); - S1AP_REGISTER_ENB_CNF(message_p).nb_mme = mme_desc_p->s1ap_eNB_instance->s1ap_mme_associated_nb; - itti_send_msg_to_task(TASK_ENB_APP, mme_desc_p->s1ap_eNB_instance->instance, message_p); - } - } -} -//------------------------------------------------------------------------------ -void et_s1ap_eNB_handle_register_eNB(instance_t instance, s1ap_register_enb_req_t *s1ap_register_eNB) -{ - s1ap_eNB_instance_t *new_instance; - uint8_t index; - - DevAssert(s1ap_register_eNB != NULL); - - /* Look if the provided instance already exists */ - new_instance = et_s1ap_eNB_get_instance(instance); - - if (new_instance != NULL) { - /* Checks if it is a retry on the same eNB */ - DevCheck(new_instance->eNB_id == s1ap_register_eNB->eNB_id, new_instance->eNB_id, s1ap_register_eNB->eNB_id, 0); - DevCheck(new_instance->cell_type == s1ap_register_eNB->cell_type, new_instance->cell_type, s1ap_register_eNB->cell_type, 0); - DevCheck(new_instance->tac == s1ap_register_eNB->tac, new_instance->tac, s1ap_register_eNB->tac, 0); - DevCheck(new_instance->mcc == s1ap_register_eNB->mcc, new_instance->mcc, s1ap_register_eNB->mcc, 0); - DevCheck(new_instance->mnc == s1ap_register_eNB->mnc, new_instance->mnc, s1ap_register_eNB->mnc, 0); - DevCheck(new_instance->mnc_digit_length == s1ap_register_eNB->mnc_digit_length, new_instance->mnc_digit_length, s1ap_register_eNB->mnc_digit_length, 0); - DevCheck(memcmp((void*)&new_instance->s1c_net_ip_address, (void*)&s1ap_register_eNB->enb_ip_address, sizeof(new_instance->s1c_net_ip_address)) == 0, 0,0,0); - } else { - new_instance = calloc(1, sizeof(s1ap_eNB_instance_t)); - DevAssert(new_instance != NULL); - - RB_INIT(&new_instance->s1ap_ue_head); - RB_INIT(&new_instance->s1ap_mme_head); - - /* Copy usefull parameters */ - new_instance->instance = instance; - new_instance->eNB_name = s1ap_register_eNB->eNB_name; - new_instance->eNB_id = s1ap_register_eNB->eNB_id; - new_instance->cell_type = s1ap_register_eNB->cell_type; - new_instance->tac = s1ap_register_eNB->tac; - new_instance->mcc = s1ap_register_eNB->mcc; - new_instance->mnc = s1ap_register_eNB->mnc; - new_instance->mnc_digit_length = s1ap_register_eNB->mnc_digit_length; - memcpy((void*)&new_instance->s1c_net_ip_address, (void*)&s1ap_register_eNB->enb_ip_address, sizeof(new_instance->s1c_net_ip_address)); - - /* Add the new instance to the list of eNB (meaningfull in virtual mode) */ - et_s1ap_eNB_insert_new_instance(new_instance); - - S1AP_DEBUG("Registered new eNB[%d] and %s eNB id %u\n", - instance, - s1ap_register_eNB->cell_type == CELL_MACRO_ENB ? "macro" : "home", - s1ap_register_eNB->eNB_id); - } - - DevCheck(s1ap_register_eNB->nb_mme <= S1AP_MAX_NB_MME_IP_ADDRESS, - S1AP_MAX_NB_MME_IP_ADDRESS, s1ap_register_eNB->nb_mme, 0); - - /* Trying to connect to provided list of MME ip address */ - for (index = 0; index < s1ap_register_eNB->nb_mme; index++) { - et_s1ap_eNB_register_mme(new_instance, - &s1ap_register_eNB->mme_ip_address[index], - &s1ap_register_eNB->enb_ip_address, - s1ap_register_eNB->sctp_in_streams, - s1ap_register_eNB->sctp_out_streams); - } -} - -//------------------------------------------------------------------------------ -void et_s1ap_eNB_handle_sctp_association_resp(instance_t instance, sctp_new_association_resp_t *sctp_new_association_resp) -{ - s1ap_eNB_instance_t *instance_p = NULL; - s1ap_eNB_mme_data_t *s1ap_mme_data_p = NULL; - - DevAssert(sctp_new_association_resp != NULL); - - instance_p = et_s1ap_eNB_get_instance(instance); - DevAssert(instance_p != NULL); - - s1ap_mme_data_p = et_s1ap_eNB_get_MME(instance_p, -1, - sctp_new_association_resp->ulp_cnx_id); - DevAssert(s1ap_mme_data_p != NULL); - - if (sctp_new_association_resp->sctp_state != SCTP_STATE_ESTABLISHED) { - S1AP_WARN("Received unsuccessful result for SCTP association (%u), instance %d, cnx_id %u\n", - sctp_new_association_resp->sctp_state, - instance, - sctp_new_association_resp->ulp_cnx_id); - - et_s1ap_handle_s1_setup_message(s1ap_mme_data_p, sctp_new_association_resp->sctp_state == SCTP_STATE_SHUTDOWN); - - return; - } - - S1AP_DEBUG("Received successful result for SCTP association (%u), instance %d, cnx_id %u\n", - sctp_new_association_resp->sctp_state, - instance, - sctp_new_association_resp->ulp_cnx_id); - /* Update parameters */ - s1ap_mme_data_p->assoc_id = sctp_new_association_resp->assoc_id; - s1ap_mme_data_p->in_streams = sctp_new_association_resp->in_streams; - s1ap_mme_data_p->out_streams = sctp_new_association_resp->out_streams; - - et_s1ap_handle_s1_setup_message(s1ap_mme_data_p, sctp_new_association_resp->sctp_state == SCTP_STATE_SHUTDOWN); -} - -//------------------------------------------------------------------------------ -void *et_s1ap_eNB_task(void *arg) -{ - MessageDef *received_msg = NULL; - int result; - - S1AP_DEBUG("Starting S1AP layer\n"); - - et_s1ap_eNB_prepare_internal_data(); - - itti_mark_task_ready(TASK_S1AP); - - while (1) { - itti_receive_msg(TASK_S1AP, &received_msg); - - switch (ITTI_MSG_ID(received_msg)) { - case TERMINATE_MESSAGE: - S1AP_WARN("*** Exiting S1AP thread\n"); - itti_exit_task(); - break; - - case S1AP_REGISTER_ENB_REQ: { - /* Register a new eNB. - * in Virtual mode eNBs will be distinguished using the mod_id/ - * Each eNB has to send an S1AP_REGISTER_ENB message with its - * own parameters. - */ - et_s1ap_eNB_handle_register_eNB(ITTI_MSG_DESTINATION_INSTANCE(received_msg), - &S1AP_REGISTER_ENB_REQ(received_msg)); - } - break; - - case SCTP_NEW_ASSOCIATION_RESP: { - et_s1ap_eNB_handle_sctp_association_resp(ITTI_MSG_DESTINATION_INSTANCE(received_msg), - &received_msg->ittiMsg.sctp_new_association_resp); - } - break; - - case SCTP_DATA_IND: { - et_s1ap_eNB_handle_sctp_data_ind(&received_msg->ittiMsg.sctp_data_ind); - } - break; - - case TIMER_HAS_EXPIRED: - LOG_I(S1AP, " Received TIMER_HAS_EXPIRED: timer_id %d\n", TIMER_HAS_EXPIRED(received_msg).timer_id); - { - et_packet_t * packet = (et_packet_t*)TIMER_HAS_EXPIRED (received_msg).arg; - et_event_t event; - g_scenario->timer_count--; - if (NULL != packet) { - if (packet->status == ET_PACKET_STATUS_SCHEDULED_FOR_RECEIVING) { - memset((void*)&event, 0, sizeof(event)); - event.code = ET_EVENT_RX_PACKET_TIME_OUT; - event.u.rx_packet_time_out = packet; - et_scenario_fsm_notify_event(event); - } else if (packet->status == ET_PACKET_STATUS_SCHEDULED_FOR_SENDING) { - memset((void*)&event, 0, sizeof(event)); - event.code = ET_EVENT_TX_TIMED_PACKET; - event.u.tx_timed_packet = packet; - et_scenario_fsm_notify_event(event); - - et_event_t continue_event; - continue_event.code = ET_EVENT_TICK; - et_scenario_fsm_notify_event(continue_event); - } else if ((packet->status != ET_PACKET_STATUS_SENT) && ((packet->status != ET_PACKET_STATUS_RECEIVED))) { - AssertFatal (0, "Bad status %d of packet timed out!\n", packet->status); - } - } else { - LOG_W(S1AP, " Received TIMER_HAS_EXPIRED: timer_id %d, no packet attached to timer\n", TIMER_HAS_EXPIRED(received_msg).timer_id); - } - } - if (TIMER_HAS_EXPIRED (received_msg).timer_id == g_scenario->enb_register_retry_timer_id) { - /* Restart the registration process */ - g_scenario->registered_enb = 0; - et_eNB_app_register (g_scenario->enb_properties); - } - break; - - default: - S1AP_ERROR("Received unhandled message: %d:%s\n", - ITTI_MSG_ID(received_msg), ITTI_MSG_NAME(received_msg)); - break; - } - - result = itti_free (ITTI_MSG_ORIGIN_ID(received_msg), received_msg); - AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result); - - received_msg = NULL; - } - - return NULL; -} - - diff --git a/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c b/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c deleted file mode 100644 index 40654fc771..0000000000 --- a/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c +++ /dev/null @@ -1,231 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.1 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -/* - play_scenario_s1ap_compare_ie.c - ------------------- - AUTHOR : Lionel GAUTHIER - COMPANY : EURECOM - EMAIL : Lionel.Gauthier@eurecom.fr - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "tree.h" -#include "queue.h" - - -#include "intertask_interface.h" -#include "platform_types.h" -#include "assertions.h" -#include "conversions.h" -#include "s1ap_common.h" -#include "play_scenario_s1ap_eNB_defs.h" -#include "play_scenario.h" -//------------------------------------------------------------------------------ -extern et_scenario_t *g_scenario; -extern uint32_t g_constraints; -//------------------------------------------------------------------------------ - -//asn_comp_rval_t * et_s1ap_ies_is_matching(const S1AP_PDU_PR present, s1ap_message * const m1, s1ap_message * const m2, const uint32_t constraints) -//{ -//} - -void update_xpath_node_mme_ue_s1ap_id(et_s1ap_t * const s1ap, xmlNode *node, const S1ap_MME_UE_S1AP_ID_t new_id) -{ - xmlNode *cur_node = NULL; - xmlAttrPtr attr = NULL; - xmlChar *xml_char = NULL; - int size = 0; - int pos = 0; - int go_deeper_in_tree = 1; - //S1AP_INFO("%s() mme_ue_s1ap_id %u\n", __FUNCTION__, new_id); - - // modify - for (cur_node = (xmlNode *)node; cur_node; cur_node = cur_node->next) { - go_deeper_in_tree = 1; - if ((!xmlStrcmp(cur_node->name, (const xmlChar *)"field"))) { - // do not get hidden fields - xml_char = xmlGetProp((xmlNode *)cur_node, (const xmlChar *)"hide"); - if (NULL != xml_char) { - if ((!xmlStrcmp(xml_char, (const xmlChar *)"yes"))) { - go_deeper_in_tree = 0; - } - xmlFree(xml_char); - } - if (0 < go_deeper_in_tree) { - // first get size - xml_char = xmlGetProp((xmlNode *)cur_node, (const xmlChar *)"pos"); - if (NULL != xml_char) { - pos = strtoul((const char *)xml_char, NULL, 0); - pos -= s1ap->xml_stream_pos_offset; - AssertFatal(pos >= 0, "Bad pos %d xml_stream_pos_offset %d", pos, s1ap->xml_stream_pos_offset); - xmlFree(xml_char); - xml_char = xmlGetProp((xmlNode *)cur_node, (const xmlChar *)"size"); - if (NULL != xml_char) { - const xmlChar value_d[32]; - const xmlChar value_h[20]; - const xmlChar showname[64]; - int ret = 0; - int pos2 = 0; - unsigned long int uli = 0; - char hex[3] = {0,0,0}; - char *end_ptr = NULL; - - size = strtoul((const char *)xml_char, NULL, 0); - xmlFree(xml_char); - // second: try to set value (always hex) - ret = snprintf((char *)value_d, 32, "%ld", new_id); - AssertFatal((ret > 0) && (ret < 32), "Could not convert int to dec str"); - ret = snprintf((char *)value_h, 20, "C0%08X", new_id); - AssertFatal((ret > 0) && (ret < 20), "Could not convert int to hex str"); - ret = snprintf((char *)showname, 64, "MME-UE-S1AP-ID: %d", new_id); - AssertFatal((ret > 0) && (ret < 64), "Could not convert int to dec str"); - - attr = xmlSetProp((xmlNode *)cur_node, (const xmlChar *)"value", value_h); - attr = xmlSetProp((xmlNode *)cur_node, (const xmlChar *)"show", value_d); - attr = xmlSetProp((xmlNode *)cur_node, (const xmlChar *)"showname", showname); - //TODO update s1ap->binary_stream @pos with new_id_hex, size - AssertFatal((pos+size) < s1ap->binary_stream_allocated_size, "Rewrite of mme_ue_s1ap_id out of bounds of binary_stream"); - //avoid endianess issues - do { - hex[0] = value_h[pos2++]; - hex[1] = value_h[pos2++]; - hex[2] = '\0'; - end_ptr = hex; - uli = strtoul(hex, &end_ptr, 16); - AssertFatal((uli != ULONG_MAX) && (end_ptr != NULL) && (*end_ptr == '\0'), "Conversion of hexstring %s failed returned %lu errno %d", hex, uli, errno); - s1ap->binary_stream[pos++] = (unsigned char)uli; - } while (pos2 < (2*5)); - // update ASN1 - et_decode_s1ap(s1ap); - //S1AP_INFO("Updated ASN1 for %s\n", showname); - } - } - } - } - if (0 < go_deeper_in_tree) { - update_xpath_node_mme_ue_s1ap_id(s1ap, cur_node->children, new_id); - } - } -} - -/** - * update_xpath_nodes: - * @nodes: the nodes set. - * @value: the new value for the node(s) - * - * Prints the @nodes content to @output. - * From http://www.xmlsoft.org/examples/#xpath2.c - */ -void update_xpath_nodes_mme_ue_s1ap_id(et_s1ap_t * const s1ap_payload, xmlNodeSetPtr nodes, const S1ap_MME_UE_S1AP_ID_t new_id) -{ - int size = 0; - int i = 0; - xmlNode *s1ap_node = NULL; - - size = (nodes) ? nodes->nodeNr : 0; - //S1AP_DEBUG("%s() num nodes %u\n", __FUNCTION__, size); - - /* - * NOTE: the nodes are processed in reverse order, i.e. reverse document - * order because xmlNodeSetContent can actually free up descendant - * of the node and such nodes may have been selected too ! Handling - * in reverse order ensure that descendant are accessed first, before - * they get removed. Mixing XPath and modifications on a tree must be - * done carefully ! - */ - for(i = size - 1; i >= 0; i--) { - s1ap_node = nodes->nodeTab[i]; - AssertFatal(NULL != s1ap_node, "One element of resultset of XPATH expression is NULL\n"); - update_xpath_node_mme_ue_s1ap_id(s1ap_payload, s1ap_node, new_id); - /* - * All the elements returned by an XPath query are pointers to - * elements from the tree *except* namespace nodes where the XPath - * semantic is different from the implementation in libxml2 tree. - * As a result when a returned node set is freed when - * xmlXPathFreeObject() is called, that routine must check the - * element type. But node from the returned set may have been removed - * by xmlNodeSetContent() resulting in access to freed data. - * This can be exercised by running valgrind - * There is 2 ways around it: - * - make a copy of the pointers to the nodes from the result set - * then call xmlXPathFreeObject() and then modify the nodes - * or - * - remove the reference to the modified nodes from the node set - * as they are processed, if they are not namespace nodes. - */ - if (nodes->nodeTab[i]->type != XML_NAMESPACE_DECL) { - nodes->nodeTab[i] = NULL; - } - } -} -//------------------------------------------------------------------------------ -int et_s1ap_update_mme_ue_s1ap_id(et_packet_t * const packet, const S1ap_MME_UE_S1AP_ID_t old_id, const S1ap_MME_UE_S1AP_ID_t new_id) -{ - xmlChar xpath_expression[ET_XPATH_EXPRESSION_MAX_LENGTH]; - int ret = 0; - xmlDocPtr doc = NULL; - xmlXPathContextPtr xpath_ctx = NULL; - xmlXPathObjectPtr xpath_obj = NULL; - - //S1AP_DEBUG("%s() packet num %u original frame number %u, mme_ue_s1ap_id %u -> %u\n", __FUNCTION__, packet->packet_number, packet->original_frame_number, old_id, new_id); - - ret = snprintf(xpath_expression, ET_XPATH_EXPRESSION_MAX_LENGTH, "//field[@name=\"s1ap.MME_UE_S1AP_ID\"][@show=\"%u\"]", old_id); - AssertFatal((ret > 0) && (ret < ET_XPATH_EXPRESSION_MAX_LENGTH), "Could not build XPATH expression err=%d", ret); - - doc = packet->sctp_hdr.u.data_hdr.payload.doc; - // Create xpath evaluation context - xpath_ctx = xmlXPathNewContext(doc); - if(xpath_ctx == NULL) { - fprintf(stderr,"Error: unable to create new XPath context\n"); - xmlFreeDoc(doc); - return(-1); - } - - // Evaluate xpath expression - xpath_obj = xmlXPathEvalExpression(xpath_expression, xpath_ctx); - xmlXPathFreeContext(xpath_ctx); - AssertFatal(xpath_obj != NULL, "Unable to evaluate XPATH expression \"%s\"\n", xpath_expression); - - if(xmlXPathNodeSetIsEmpty(xpath_obj->nodesetval)){ - xmlXPathFreeObject(xpath_obj); - S1AP_DEBUG("%s() No match \"%s\"packet num %u original frame number %u, mme_ue_s1ap_id %u -> %u\n", - __FUNCTION__, xpath_expression, packet->packet_number, packet->original_frame_number, old_id, new_id); - return -1; - } - // update selected nodes - update_xpath_nodes_mme_ue_s1ap_id(&packet->sctp_hdr.u.data_hdr.payload, xpath_obj->nodesetval, new_id); - - // Cleanup of XPath data - xmlXPathFreeObject(xpath_obj); - - return 0; -} diff --git a/openair3/TEST/EPC_TEST/play_scenario_s1ap_eNB_defs.h b/openair3/TEST/EPC_TEST/play_scenario_s1ap_eNB_defs.h deleted file mode 100644 index 532e14bb1d..0000000000 --- a/openair3/TEST/EPC_TEST/play_scenario_s1ap_eNB_defs.h +++ /dev/null @@ -1,242 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.1 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -#include - -#include "queue.h" -#include "tree.h" - -#include "sctp_eNB_defs.h" - -#ifndef PLAY_SCENARIO_S1AP_ENB_DEFS_H_ -#define PLAY_SCENARIO_S1AP_ENB_DEFS_H_ - -#define ENB_TAC (1) -#define ENB_MCC (208) -#define ENB_MNC (92) - -#define ENB_NAME "Eurecom ENB" -#define ENB_NAME_FORMAT (ENB_NAME" %u") - -#define S1AP_PORT_NUMBER (36412) -#define S1AP_SCTP_PPID (18) - -#define X2AP_PORT_NUMBER (36422) -#define X2AP_SCTP_PPID (27) - -#define S1AP_ENB_NAME_LENGTH_MAX (150) - -typedef enum { - /* Disconnected state: initial state for any association. */ - S1AP_ENB_STATE_DISCONNECTED = 0x0, - /* State waiting for S1 Setup response message if eNB is MME accepted or - * S1 Setup failure if MME rejects the eNB. - */ - S1AP_ENB_STATE_WAITING = 0x1, - /* The eNB is successfully connected to MME, UE contexts can be created. */ - S1AP_ENB_STATE_CONNECTED = 0x2, - /* The MME has sent an overload start message. Once the MME disables the - * OVERLOAD marker, the state of the association will be - * S1AP_ENB_STATE_CONNECTED. - */ - S1AP_ENB_OVERLOAD = 0x3, - /* Max number of states available */ - S1AP_ENB_STATE_MAX, -} s1ap_eNB_state_t; - - -/* If the Overload Action IE in the OVERLOAD START message is set to - * - “reject all RRC connection establishments for non-emergency mobile - * originated data transfer “ (i.e. reject traffic corresponding to RRC cause - * “mo-data “ (TS 36.331 [16])), or - * - “reject all RRC connection establishments for signalling “ (i.e. reject - * traffic corresponding to RRC cause “modata” and “mo-signalling” - * (TS 36.331 [16])),or - * - “only permit RRC connection establishments for emergency sessions and - * mobile terminated services” (i.e. only permit traffic corresponding to RRC - * cause “emergency” and “mt-Access” (TS 36.331 [16])). - * - * NOTE: When the Overload Action IE is set to “only permit RRC connection - * establishments for emergency sessions and mobile terminated services”, - * emergency calls with RRC cause “highPriorityAcess” from high priority users - * are rejected (TS 24.301 [24]). - */ -typedef enum { - S1AP_OVERLOAD_REJECT_MO_DATA = 0x0, - S1AP_OVERLOAD_REJECT_ALL_SIGNALLING = 0x1, - S1AP_OVERLOAD_ONLY_EMERGENCY_AND_MT = 0x2, - S1AP_NO_OVERLOAD = 0x3, - S1AP_OVERLOAD_MAX, -} s1ap_overload_state_t; - -/* Served PLMN identity element */ -struct plmn_identity_s { - uint16_t mcc; - uint16_t mnc; - uint8_t mnc_digit_length; - STAILQ_ENTRY(plmn_identity_s) next; -}; - -/* Served group id element */ -struct served_group_id_s { - uint16_t mme_group_id; - STAILQ_ENTRY(served_group_id_s) next; -}; - -/* Served mme code for a particular MME */ -struct mme_code_s { - uint8_t mme_code; - STAILQ_ENTRY(mme_code_s) next; -}; - -/* Served gummei element */ -struct served_gummei_s { - /* Number of MME served PLMNs */ - uint8_t nb_served_plmns; - /* List of served PLMNs by MME */ - STAILQ_HEAD(served_plmns_s, plmn_identity_s) served_plmns; - - /* Number of group id in list */ - uint8_t nb_group_id; - /* Served group id list */ - STAILQ_HEAD(served_group_ids_s, served_group_id_s) served_group_ids; - - /* Number of MME code */ - uint8_t nb_mme_code; - /* MME Code to uniquely identify an MME within an MME pool area */ - STAILQ_HEAD(mme_codes_s, mme_code_s) mme_codes; - - /* Next GUMMEI element */ - STAILQ_ENTRY(served_gummei_s) next; -}; - -struct s1ap_eNB_instance_s; - -/* This structure describes association of a eNB to a MME */ -typedef struct s1ap_eNB_mme_data_s { - /* MME descriptors tree, ordered by sctp assoc id */ - RB_ENTRY(s1ap_eNB_mme_data_s) entry; - - /* This is the optional name provided by the MME */ - char *mme_name; - net_ip_address_t mme_net_ip_address; // useful for joining assoc_id and ip address of packets - - /* List of served GUMMEI per MME. There is one GUMMEI per RAT with a max - * number of 8 RATs but in our case only one is used. The LTE related pool - * configuration is included on the first place in the list. - */ - STAILQ_HEAD(served_gummeis_s, served_gummei_s) served_gummei; - - /* Relative processing capacity of an MME with respect to the other MMEs - * in the pool in order to load-balance MMEs within a pool as defined - * in TS 23.401. - */ - uint8_t relative_mme_capacity; - - /* Current MME overload information (if any). */ - s1ap_overload_state_t overload_state; - /* Current eNB->MME S1AP association state */ - s1ap_eNB_state_t state; - - /* Next usable stream for UE signalling */ - int32_t nextstream; - - /* Number of input/ouput streams */ - uint16_t in_streams; - uint16_t out_streams; - - /* Connexion id used between SCTP/S1AP */ - uint16_t cnx_id; - - /* SCTP association id */ - int32_t assoc_id; - - /* Only meaningfull in virtual mode */ - struct s1ap_eNB_instance_s *s1ap_eNB_instance; -} s1ap_eNB_mme_data_t; - -typedef struct s1ap_eNB_instance_s { - /* Next s1ap eNB association. - * Only used for virtual mode. - */ - STAILQ_ENTRY(s1ap_eNB_instance_s) s1ap_eNB_entries; - - /* Number of MME requested by eNB (tree size) */ - uint32_t s1ap_mme_nb; - /* Number of MME for which association is pending */ - uint32_t s1ap_mme_pending_nb; - /* Number of MME successfully associated to eNB */ - uint32_t s1ap_mme_associated_nb; - /* Tree of S1AP MME associations ordered by association ID */ - RB_HEAD(s1ap_mme_map, s1ap_eNB_mme_data_s) s1ap_mme_head; - - /* TODO: add a map ordered by relative MME capacity */ - - /* Tree of UE ordered by eNB_ue_s1ap_id's */ - RB_HEAD(s1ap_ue_map, s1ap_eNB_ue_context_s) s1ap_ue_head; - - /* For virtual mode, mod_id as defined in the rest of the L1/L2 stack */ - instance_t instance; - - /* Displayable name of eNB */ - char *eNB_name; - net_ip_address_t s1c_net_ip_address; - - /* Unique eNB_id to identify the eNB within EPC. - * In our case the eNB is a macro eNB so the id will be 20 bits long. - * For Home eNB id, this field should be 28 bits long. - */ - uint32_t eNB_id; - /* The type of the cell */ - enum cell_type_e cell_type; - - /* Tracking area code */ - uint16_t tac; - - /* Mobile Country Code - * Mobile Network Code - */ - uint16_t mcc; - uint16_t mnc; - uint8_t mnc_digit_length; - -} s1ap_eNB_instance_t; - -typedef struct { - /* List of served eNBs - * Only used for virtual mode - */ - STAILQ_HEAD(s1ap_eNB_instances_head_s, s1ap_eNB_instance_s) s1ap_eNB_instances_head; - /* Nb of registered eNBs */ - uint8_t nb_registered_eNBs; - - /* Generate a unique connexion id used between S1AP and SCTP */ - uint16_t global_cnx_id; -} s1ap_eNB_internal_data_t; - -int s1ap_eNB_compare_assoc_id( - struct s1ap_eNB_mme_data_s *p1, struct s1ap_eNB_mme_data_s *p2); - -/* Generate the tree management functions */ -RB_PROTOTYPE(s1ap_mme_map, s1ap_eNB_mme_data_s, entry, - s1ap_eNB_compare_assoc_id); - -#endif /* PLAY_SCENARIO_S1AP_ENB_DEFS_H_ */ diff --git a/openair3/TEST/EPC_TEST/play_scenario_sctp.c b/openair3/TEST/EPC_TEST/play_scenario_sctp.c deleted file mode 100644 index c126608598..0000000000 --- a/openair3/TEST/EPC_TEST/play_scenario_sctp.c +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.1 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -/* - play_scenario_sctp.c - ------------------- - AUTHOR : Lionel GAUTHIER - COMPANY : EURECOM - EMAIL : Lionel.Gauthier@eurecom.fr - */ - - -#include - -#include "intertask_interface.h" -#include "platform_types.h" -#include "assertions.h" -#include "play_scenario.h" - -//------------------------------------------------------------------------------ -asn_comp_rval_t *et_sctp_data_is_matching(sctp_datahdr_t *const sctp1, sctp_datahdr_t *const sctp2, const uint32_t constraints) -{ - asn_comp_rval_t *rv = NULL; - - // no comparison for ports - if (sctp1->ppid != sctp2->ppid) { - S1AP_WARN("No Matching SCTP PPID %u %u\n", sctp1->ppid, sctp2->ppid); - rv = calloc(1, sizeof(asn_comp_rval_t)); - rv->err_code = ET_ERROR_MATCH_PACKET_SCTP_PPID; - return rv; - } - - if (sctp1->assoc_id != sctp2->assoc_id) { - S1AP_WARN("No Matching SCTP assoc id %u %u\n", sctp1->assoc_id, sctp2->assoc_id); - rv = calloc(1, sizeof(asn_comp_rval_t)); - rv->err_code = ET_ERROR_MATCH_PACKET_SCTP_ASSOC_ID; - return rv; - } - - if (sctp1->stream != sctp2->stream) { - if (constraints & ET_BIT_MASK_MATCH_SCTP_STREAM) { - rv = calloc(1, sizeof(asn_comp_rval_t)); - rv->err_code = ET_ERROR_MATCH_PACKET_SCTP_STREAM_ID; - return rv; - } else { - S1AP_WARN("No Matching SCTP stream %u %u\n", sctp1->stream, sctp2->stream); - } - } - - // We do not have SSN from lower layers - // if (sctp1->ssn != sctp2->ssn) { - // if (constraints & ET_BIT_MASK_MATCH_SCTP_SSN) { - // rv = calloc(1, sizeof(asn_comp_rval_t)); - // rv->err_code = ET_ERROR_MATCH_PACKET_SCTP_SSN; - // return rv; - // } else { - // S1AP_WARN("No Matching SCTP STREAM SN %u %u\n", sctp1->ssn, sctp2->ssn); - // } - // } - return et_s1ap_is_matching(&sctp1->payload, &sctp2->payload, constraints); -} - -//------------------------------------------------------------------------------ -asn_comp_rval_t *et_sctp_is_matching(et_sctp_hdr_t *const sctp1, et_sctp_hdr_t *const sctp2, const uint32_t constraints) -{ - // no comparison for ports - asn_comp_rval_t *rv = NULL; - - if (sctp1->chunk_type != sctp2->chunk_type) { - S1AP_WARN("No Matching chunk_type %u %u\n", sctp1->chunk_type, sctp2->chunk_type); - rv = calloc(1, sizeof(asn_comp_rval_t)); - rv->err_code = ET_ERROR_MATCH_PACKET_SCTP_CHUNK_TYPE; - return rv; - } - - switch (sctp1->chunk_type) { - case SCTP_CID_DATA: - return et_sctp_data_is_matching(&sctp1->u.data_hdr, &sctp2->u.data_hdr, constraints); - break; - - case SCTP_CID_INIT: - AssertFatal(0, "Not needed now"); - break; - - case SCTP_CID_INIT_ACK: - AssertFatal(0, "Not needed now"); - break; - - default: - AssertFatal(0, "Not needed now cid %d", sctp1->chunk_type); - } - - return NULL; -} diff --git a/openair3/TEST/oaisim_mme_client_test.c b/openair3/TEST/oaisim_mme_client_test.c deleted file mode 100644 index 8fcda8a5ad..0000000000 --- a/openair3/TEST/oaisim_mme_client_test.c +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.1 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include "sctp_primitives_client.h" - -#include "s1ap_common.h" -#include "s1ap_eNB.h" -#include "s1ap_mme.h" - -char ip_addr[] = "127.0.0.1"; - -int assoc[2]; -uint8_t id[] = { 0x03, 0x56, 0xf0, 0xd8 }; -char identity[] = { 0x02, 0x08, 0x34 }; -char tac[] = { 0x00, 0x01 }; -char infoNAS[] = { 0x07, 0x42, 0x01, 0xE0, 0x06, 0x00, 0x00, 0xF1, 0x10, 0x00, 0x01, 0x00, 0x2C, - 0x52, 0x01, 0xC1, 0x01, 0x09, 0x10, 0x03, 0x77, 0x77, 0x77, 0x07, 0x61, 0x6E, 0x72, 0x69, 0x74, - 0x73, 0x75, 0x03, 0x63, 0x6F, 0x6D, 0x05, 0x01, 0x0A, 0x01, 0x20, 0x37, 0x27, 0x0E, 0x80, 0x80, - 0x21, 0x0A, 0x03, 0x00, 0x00, 0x0A, 0x81, 0x06, 0x0A, 0x00, 0x00, 0x01, 0x50, 0x0B, 0xF6, - 0x00, 0xF1, 0x10, 0x80, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01 - }; - -uint32_t eNB_UE_S1AP_ID = 0; - -int s1ap_eNB_generate_initial_ue_message(uint8_t **buffer, - uint32_t *length); - -int s1ap_eNB_generate_initial_ue_message(uint8_t **buffer, - uint32_t *length) -{ - InitialUEMessageIEs initialUEmessageIEs; - InitialUEMessageIEs *initialUEmessageIEs_p = &initialUEmessageIEs; - memset(initialUEmessageIEs_p, 0, sizeof(InitialUEMessageIEs)); - initialUEmessageIEs.eNB_UE_S1AP_ID = eNB_UE_S1AP_ID; - initialUEmessageIEs.nas_pdu.buf = infoNAS; - initialUEmessageIEs.nas_pdu.size = sizeof(infoNAS); - initialUEmessageIEs.tai.tAC.buf = tac; - initialUEmessageIEs.tai.tAC.size = 2; - initialUEmessageIEs.tai.pLMNidentity.buf = identity; - initialUEmessageIEs.tai.pLMNidentity.size = 3; - initialUEmessageIEs.eutran_cgi.pLMNidentity.buf = identity; - initialUEmessageIEs.eutran_cgi.pLMNidentity.size = 3; - initialUEmessageIEs.eutran_cgi.cell_ID.buf = id; - initialUEmessageIEs.eutran_cgi.cell_ID.size = 4; - initialUEmessageIEs.eutran_cgi.cell_ID.bits_unused = 4; - initialUEmessageIEs.rrC_Establishment_Cause = RRC_Establishment_Cause_mo_Data; - return s1ap_eNB_encode_initial_ue_message(initialUEmessageIEs_p, buffer, length); -} - -void recv_callback(uint8_t *buffer, uint32_t length) -{ - uint8_t *bufferS; - uint32_t len; - s1ap_eNB_generate_initial_ue_message(&bufferS, &len); - sctp_send_msg(assoc[0], 1, bufferS, len); -} - -int main(int argc, char *argv[]) -{ - asn_enc_rval_t retVal; - uint8_t *buffer; - uint32_t len; - SupportedTAs_Item_t ta; - PLMNidentity_t plmnIdentity; - asn_debug = 0; - asn1_xer_print = 0; - S1SetupRequestIEs s1SetupRequest; - memset(&s1SetupRequest, 0, sizeof(S1SetupRequestIEs)); - s1SetupRequest.global_ENB_ID.eNB_ID.present = ENB_ID_PR_macroENB_ID; - s1SetupRequest.global_ENB_ID.eNB_ID.choice.macroENB_ID.buf = id; - s1SetupRequest.global_ENB_ID.eNB_ID.choice.macroENB_ID.size = 3; - s1SetupRequest.global_ENB_ID.eNB_ID.choice.macroENB_ID.bits_unused = 4; - OCTET_STRING_fromBuf(&s1SetupRequest.global_ENB_ID.pLMNidentity, identity, 3); - s1SetupRequest.presenceMask |= S1SETUPREQUESTIES_ENBNAME_PRESENT; - OCTET_STRING_fromBuf(&s1SetupRequest.eNBname, "ENB 1 eurecom", - strlen("ENB 1 eurecom")); - memset(&ta, 0, sizeof(SupportedTAs_Item_t)); - memset(&plmnIdentity, 0, sizeof(PLMNidentity_t)); - OCTET_STRING_fromBuf(&ta.tAC, tac, 2); - OCTET_STRING_fromBuf(&plmnIdentity, identity, 3); - ASN_SEQUENCE_ADD(&ta.broadcastPLMNs, &plmnIdentity); - ASN_SEQUENCE_ADD(&s1SetupRequest.supportedTAs, &ta); - s1SetupRequest.defaultPagingDRX = PagingDRX_v64; - s1ap_eNB_encode_s1setuprequest(&s1SetupRequest, &buffer, &len); - assoc[0] = sctp_connect_to_remote_host(ip_addr, 36412, &recv_callback); - sctp_send_msg(0, 0, buffer, len); - free(buffer); - // generateUplinkNASTransport(&buffer, &len); - // sctp_send_msg(assoc[0], 0, buffer, len); - // s1ap_mme_decode_pdu(buffer, len); - pthread_join(sctp_get_receiver_thread(assoc[0]), NULL); - return(0); -} diff --git a/openair3/TEST/oaisim_mme_itti_test.c b/openair3/TEST/oaisim_mme_itti_test.c deleted file mode 100644 index ecfbdb0acb..0000000000 --- a/openair3/TEST/oaisim_mme_itti_test.c +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.1 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -#include -#include -#include -#include - -#include -#include - -#include - -#include "mme_config.h" -#include "gtpv1u_sgw_defs.h" - -#include "intertask_interface.h" - -#include "sctp_primitives_server.h" -#include "udp_primitives_server.h" -#include "s1ap_mme.h" -#include "log.h" -#include "sgw_lite_defs.h" -#include "ipv4_defs.h" - -int main(int argc, char *argv[]) -{ - int i = 0; - int prio = 0; - mme_config_t mme_config; - MessageDef *message_p; - struct sched_param param = { - .sched_priority = 10, - }; - - config_parse_opt_line(argc, argv, &mme_config); - fprintf(stdout, "Starting %s ITTI test\n", PACKAGE_STRING); - - if (setpriority(PRIO_PROCESS, 0, prio) < 0) { - fprintf(stderr, "Cannot assign requested prio: %d\n" - "%d:%s\n", prio, errno, strerror(errno)); - return -1; - } - - if (sched_setscheduler(0, SCHED_RR, ¶m) < 0) { - fprintf(stderr, "Cannot assign requested scheduler policy\n" - "%d:%s\n", errno, strerror(errno)); - return -1; - } - - /* Calling each layer init function */ - log_init(&mme_config); - itti_init(TASK_MAX, tasks_info); - sctp_init(&mme_config); - udp_init(&mme_config); - s1ap_mme_init(&mme_config); - gtpv1u_init(&mme_config); - ipv4_init(&mme_config); - - sgw_lite_init(&mme_config); - - message_p = itti_alloc_new_message(TASK_S1AP, MESSAGE_TEST); - - while(i < (1 << 15)) { - if (send_broadcast_message(message_p) < 0) { - fprintf(stderr, "Failed to send broadcast message %d\n", i); - } - - i++; - } - - fprintf(stderr, "Successfully sent %lu messages", get_current_message_number()); - - return 0; -} diff --git a/openair3/TEST/oaisim_mme_list_benchmark.c b/openair3/TEST/oaisim_mme_list_benchmark.c deleted file mode 100644 index 633e83aace..0000000000 --- a/openair3/TEST/oaisim_mme_list_benchmark.c +++ /dev/null @@ -1,261 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.1 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include "sctp_primitives_client.h" - -#include "s1ap_common.h" -#include "s1ap_eNB.h" -#include "s1ap_mme.h" - -#include "s1ap_eNB_encoder.h" -#include "s1ap_eNB_decoder.h" - -#define NB_OF_ENB 10 -#define NB_OF_UES 100 - -static int connected_eNB = 0; -static char ip_addr[] = "127.0.0.1"; -uint32_t ipv4_local = 0x7F000001; -static uint8_t id[] = { 0x03, 0x56, 0xf0, 0xd8 }; -static char identity[] = { 0x02, 0x08, 0x34 }; -static char tac[] = { 0x00, 0x01 }; -static char infoNAS[] = { 0x07, 0x42, 0x01, 0xE0, 0x06, 0x00, 0x00, 0xF1, 0x10, 0x00, 0x01, 0x00, 0x2C, - 0x52, 0x01, 0xC1, 0x01, 0x09, 0x10, 0x03, 0x77, 0x77, 0x77, 0x07, 0x61, 0x6E, 0x72, 0x69, 0x74, - 0x73, 0x75, 0x03, 0x63, 0x6F, 0x6D, 0x05, 0x01, 0x0A, 0x01, 0x20, 0x37, 0x27, 0x0E, 0x80, 0x80, - 0x21, 0x0A, 0x03, 0x00, 0x00, 0x0A, 0x81, 0x06, 0x0A, 0x00, 0x00, 0x01, 0x50, 0x0B, 0xF6, - 0x00, 0xF1, 0x10, 0x80, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01 - }; -uint32_t nb_eNB = NB_OF_ENB; -uint32_t nb_ue = NB_OF_UES; - -void s1ap_test_generate_s1_setup_request(uint32_t eNB_id, uint8_t **buffer, - uint32_t *length); -int s1ap_test_generate_initial_ue_message(uint32_t eNB_UE_S1AP_ID, - uint8_t **buffer, - uint32_t *length); -int recv_callback(uint32_t assocId, - uint32_t stream, - uint8_t *buffer, - uint32_t length); -int sctp_connected(void *args, - uint32_t assocId, - uint32_t instreams, - uint32_t outstreams); - -void s1ap_test_generate_s1_setup_request(uint32_t eNB_id, uint8_t **buffer, - uint32_t *length) -{ - S1SetupRequestIEs_t s1SetupRequest; - SupportedTAs_Item_t ta; - PLMNidentity_t plmnIdentity; - uint8_t *id_p = (uint8_t *)(&eNB_id + 1); - memset(&s1SetupRequest, 0, sizeof(S1SetupRequestIEs_t)); - s1SetupRequest.global_ENB_ID.eNB_ID.present = ENB_ID_PR_macroENB_ID; - s1SetupRequest.global_ENB_ID.eNB_ID.choice.macroENB_ID.buf = id_p; - s1SetupRequest.global_ENB_ID.eNB_ID.choice.macroENB_ID.size = 3; - s1SetupRequest.global_ENB_ID.eNB_ID.choice.macroENB_ID.bits_unused = 4; - OCTET_STRING_fromBuf(&s1SetupRequest.global_ENB_ID.pLMNidentity, identity, 3); - s1SetupRequest.presenceMask |= S1SETUPREQUESTIES_ENBNAME_PRESENT; - OCTET_STRING_fromBuf(&s1SetupRequest.eNBname, "ENB 1 eurecom", - strlen("ENB 1 eurecom")); - memset(&ta, 0, sizeof(SupportedTAs_Item_t)); - memset(&plmnIdentity, 0, sizeof(PLMNidentity_t)); - OCTET_STRING_fromBuf(&ta.tAC, tac, 2); - OCTET_STRING_fromBuf(&plmnIdentity, identity, 3); - ASN_SEQUENCE_ADD(&ta.broadcastPLMNs, &plmnIdentity); - ASN_SEQUENCE_ADD(&s1SetupRequest.supportedTAs, &ta); - s1SetupRequest.defaultPagingDRX = PagingDRX_v64; - s1ap_eNB_encode_s1_setup_request(&s1SetupRequest, buffer, length); -} - -int s1ap_test_generate_initial_ue_message(uint32_t eNB_UE_S1AP_ID, - uint8_t **buffer, - uint32_t *length) -{ - InitialUEMessageIEs_t initialUEmessageIEs; - InitialUEMessageIEs_t *initialUEmessageIEs_p = &initialUEmessageIEs; - memset(initialUEmessageIEs_p, 0, sizeof(InitialUEMessageIEs_t)); - initialUEmessageIEs.eNB_UE_S1AP_ID = eNB_UE_S1AP_ID & 0x00ffffff; - initialUEmessageIEs.nas_pdu.buf = (uint8_t *)infoNAS; - initialUEmessageIEs.nas_pdu.size = sizeof(infoNAS); - initialUEmessageIEs.tai.tAC.buf = (uint8_t *)tac; - initialUEmessageIEs.tai.tAC.size = 2; - initialUEmessageIEs.tai.pLMNidentity.buf = (uint8_t *)identity; - initialUEmessageIEs.tai.pLMNidentity.size = 3; - initialUEmessageIEs.eutran_cgi.pLMNidentity.buf = (uint8_t *)identity; - initialUEmessageIEs.eutran_cgi.pLMNidentity.size = 3; - initialUEmessageIEs.eutran_cgi.cell_ID.buf = (uint8_t *)id; - initialUEmessageIEs.eutran_cgi.cell_ID.size = 4; - initialUEmessageIEs.eutran_cgi.cell_ID.bits_unused = 4; - initialUEmessageIEs.rrC_Establishment_Cause = RRC_Establishment_Cause_mo_Data; - return s1ap_eNB_encode_initial_ue_message(initialUEmessageIEs_p, buffer, length); -} - -int s1ap_test_generate_initial_setup_resp(uint32_t eNB_UE_S1AP_ID, - uint32_t mme_UE_S1AP_ID, - uint8_t eRAB_id, - uint32_t teid, - uint8_t **buffer, - uint32_t *length) -{ - InitialContextSetupResponseIEs_t initialResponseIEs; - InitialContextSetupResponseIEs_t *initialResponseIEs_p = &initialResponseIEs; - E_RABSetupItemCtxtSURes_t e_RABSetupItemCtxtSURes; - memset(initialResponseIEs_p, 0, sizeof(InitialContextSetupResponseIEs_t)); - memset(&e_RABSetupItemCtxtSURes, 0, sizeof(E_RABSetupItemCtxtSURes_t)); - initialResponseIEs_p->mme_ue_s1ap_id = mme_UE_S1AP_ID; - initialResponseIEs_p->eNB_UE_S1AP_ID = eNB_UE_S1AP_ID; - e_RABSetupItemCtxtSURes.e_RAB_ID = eRAB_id; - e_RABSetupItemCtxtSURes.transportLayerAddress.buf = (uint8_t *)&ipv4_local; - e_RABSetupItemCtxtSURes.transportLayerAddress.size = 4; - e_RABSetupItemCtxtSURes.gTP_TEID.buf = (uint8_t *)&teid; - e_RABSetupItemCtxtSURes.gTP_TEID.size = 4; - ASN_SEQUENCE_ADD( - &initialResponseIEs_p->e_RABSetupListCtxtSURes.e_RABSetupItemCtxtSURes, - &e_RABSetupItemCtxtSURes); - return s1ap_eNB_encode_initial_context_setup_response(initialResponseIEs_p, - buffer, length); -} - -int recv_callback(uint32_t assocId, - uint32_t stream, - uint8_t *buffer, - uint32_t length) -{ - S1AP_S1AP_PDU_t pdu; - uint8_t *buffer2; - uint32_t len; - int j; - - if (s1ap_eNB_decode_pdu(&pdu, buffer, length) < 0) { - fprintf(stderr, "s1ap_eNB_decode_pdu returned status < 0\n"); - free(buffer); - return -1; - } - - if (pdu.initiatingMessage.procedureCode == S1AP_ProcedureCode_id_S1Setup - && pdu.present == S1AP_S1AP_PDU_PR_successfulOutcome) { - for (j = 0; j < nb_ue; j++) { - s1ap_test_generate_initial_ue_message(j, &buffer2, &len); - - if (sctp_send_msg(assocId, j % 64 + 1, buffer2, len) < 0) { - fprintf(stderr, - "sctp_send_msg returned status < 0\nSomething bad happened on SCTP layer\n"); - free(buffer2); - break; - } - - free(buffer2); - } - } else if (pdu.initiatingMessage.procedureCode == S1AP_ProcedureCode_id_InitialContextSetup - && pdu.present == S1AP_PDU_PR_initiatingMessage) { - fprintf(stdout, "Received InitialContextSetup request\n"); - s1ap_test_generate_initial_setup_resp( - message.msg.initialContextSetupRequestIEs.eNB_UE_S1AP_ID, - message.msg.initialContextSetupRequestIEs.mme_ue_s1ap_id, - 0x5, - 0x1, - &buffer2, - &len); - - if (sctp_send_msg(assocId, stream, buffer2, len) < 0) { - fprintf(stderr, - "sctp_send_msg returned status < 0\nSomething bad happened on SCTP layer\n"); - free(buffer2); - } - - free(buffer2); - } else { - fprintf(stderr, "Received unexpected message %d %d\n", message.procedureCode, - message.direction); - free(buffer); - return -1; - } - - free(buffer); - return 0; -} - -int sctp_connected(void *args, - uint32_t assocId, - uint32_t instreams, - uint32_t outstreams) -{ - uint8_t *buffer; - uint32_t len; - fprintf(stdout, "New association %d\n", assocId); - s1ap_test_generate_s1_setup_request(assocId * nb_eNB, &buffer, &len); - - if (sctp_send_msg(assocId, 0, buffer, len) < 0) { - free(buffer); - fprintf(stderr, - "sctp_send_msg returned status < 0. Something bad happened on SCTP layer\n"); - exit(0); - } - - free(buffer); - connected_eNB++; - return 0; -} - -int main(int argc, char *argv[]) -{ - asn_enc_rval_t retVal; - int i; - SupportedTAs_Item_t ta; - PLMNidentity_t plmnIdentity; - asn_debug = 0; - asn1_xer_print = 0; - - if (argc > 1) { - nb_eNB = atoi(argv[1]); - - if (argc > 2) { - nb_ue = atoi(argv[2]); - } - } - - for (i = 0; i < nb_eNB; i++) { - sctp_connect_to_remote_host(ip_addr, 36412, 18, NULL, sctp_connected, - recv_callback); - } - - while (1) { - sleep(1); - } - - // generateUplinkNASTransport(&buffer, &len); - // sctp_send_msg(assoc[0], 0, buffer, len); - // s1ap_mme_decode_pdu(buffer, len); - sctp_terminate(); - return(0); -} diff --git a/openair3/TEST/oaisim_mme_s1ap_test.c b/openair3/TEST/oaisim_mme_s1ap_test.c deleted file mode 100644 index aa8f92aee1..0000000000 --- a/openair3/TEST/oaisim_mme_s1ap_test.c +++ /dev/null @@ -1,179 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.1 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -#include -#include -#include - -#include "s1ap_common.h" -#include "s1ap_eNB_decoder.h" -#include "s1ap_mme_decoder.h" -#include "s1ap_eNB_encoder.h" - -#define MAX_BUF_LENGTH (1024) - -typedef struct { - char *procedure_name; - uint8_t buffer[MAX_BUF_LENGTH]; - uint32_t buf_len; -} s1ap_test_t; - -s1ap_test_t s1ap_test[] = { - // { - // .procedure_name = "Downlink NAS transport", - // .buffer = { - // 0x00, 0x0B, 0x40, 0x21, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - // 0x05, 0xC0, 0x01, 0x10, 0xCE, 0xCC, 0x00, 0x08, 0x00, 0x03, - // 0x40, 0x01, 0xB3, 0x00, 0x1A, 0x00, 0x0A, 0x09, 0x27, 0xAB, - // 0x1F, 0x7C, 0xEC, 0x01, 0x02, 0x01, 0xD9 - // }, - // .buf_len = 37, - // }, - { - .procedure_name = "Uplink NAS transport", - .buffer = { - 0x00, 0x0D, 0x40, 0x41, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x05, 0xC0, 0x01, 0x10, 0xCE, 0xCC, 0x00, 0x08, 0x00, 0x03, - 0x40, 0x01, 0xB3, 0x00, 0x1A, 0x00, 0x14, 0x13, 0x27, 0xD3, - 0x77, 0xED, 0x4C, 0x01, 0x02, 0x01, 0xDA, 0x28, 0x08, 0x03, - 0x69, 0x6D, 0x73, 0x03, 0x70, 0x66, 0x74, 0x00, 0x64, 0x40, - 0x08, 0x00, 0x02, 0xF8, 0x29, 0x00, 0x00, 0x20, 0x40, 0x00, - 0x43, 0x40, 0x06, 0x00, 0x02, 0xF8, 0x29, 0x00, 0x04, - }, - .buf_len = 69, - }, - { - .procedure_name = "UE capability info indication", - .buffer = { - 0x00, 0x16, 0x40, 0x37, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x05, 0xC0, 0x01, 0x10, 0xCE, 0xCC, 0x00, 0x08, 0x00, 0x03, - 0x40, 0x01, 0xB3, 0x00, 0x4A, 0x40, 0x20, 0x1F, 0x00, 0xE8, - 0x01, 0x01, 0xA8, 0x13, 0x80, 0x00, 0x20, 0x83, 0x13, 0x05, - 0x0B, 0x8B, 0xFC, 0x2E, 0x2F, 0xF0, 0xB8, 0xBF, 0xAF, 0x87, - 0xFE, 0x40, 0x44, 0x04, 0x07, 0x0C, 0xA7, 0x4A, 0x80, - }, - .buf_len = 59, - }, - { - .procedure_name = "Initial Context Setup Request", - .buffer = { - 0x00, 0x09, 0x00, 0x80, 0xD4, 0x00, 0x00, 0x06, 0x00, 0x00, - 0x00, 0x05, 0xC0, 0x01, 0x10, 0xCE, 0xCC, 0x00, 0x08, 0x00, - 0x03, 0x40, 0x01, 0xB3, 0x00, 0x42, 0x00, 0x0A, 0x18, 0x08, - 0xF0, 0xD1, 0x80, 0x60, 0x02, 0xFA, 0xF0, 0x80, 0x00, 0x18, - 0x00, 0x80, 0x81, 0x00, 0x00, 0x34, 0x00, 0x7C, 0x45, 0x00, - 0x09, 0x3D, 0x0F, 0x80, 0x0A, 0x05, 0x00, 0x02, 0x03, 0x78, - 0x48, 0x86, 0x6D, 0x27, 0xC7, 0x97, 0x8E, 0xA1, 0x02, 0x07, - 0x42, 0x01, 0x49, 0x06, 0x00, 0x02, 0xF8, 0x29, 0x00, 0x04, - 0x00, 0x48, 0x52, 0x01, 0xC1, 0x01, 0x09, 0x1B, 0x03, 0x69, - 0x6D, 0x73, 0x03, 0x70, 0x66, 0x74, 0x06, 0x6D, 0x6E, 0x63, - 0x30, 0x39, 0x32, 0x06, 0x6D, 0x63, 0x63, 0x32, 0x30, 0x38, - 0x04, 0x67, 0x70, 0x72, 0x73, 0x05, 0x01, 0x0A, 0x80, 0x00, - 0x24, 0x5D, 0x01, 0x00, 0x30, 0x10, 0x23, 0x93, 0x1F, 0x93, - 0x96, 0xFE, 0xFE, 0x74, 0x4B, 0xFF, 0xFF, 0x00, 0xC5, 0x00, - 0x6C, 0x00, 0x32, 0x0B, 0x84, 0x34, 0x01, 0x08, 0x5E, 0x04, - 0xFE, 0xFE, 0xC5, 0x6C, 0x50, 0x0B, 0xF6, 0x02, 0xF8, 0x29, - 0x80, 0x00, 0x01, 0xF0, 0x00, 0x70, 0x8A, 0x53, 0x12, 0x64, - 0x01, 0x01, 0x00, 0x6B, 0x00, 0x05, 0x18, 0x00, 0x0C, 0x00, - 0x00, 0x00, 0x49, 0x00, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - }, - .buf_len = 217, - }, - { - .procedure_name = "Initial context setup response", - .buffer = { - 0x20, 0x09, 0x00, 0x26, 0x00, 0x00, 0x03, 0x00, 0x00, 0x40, - 0x05, 0xC0, 0x01, 0x10, 0xCE, 0xCC, 0x00, 0x08, 0x40, 0x03, - 0x40, 0x01, 0xB3, 0x00, 0x33, 0x40, 0x0F, 0x00, 0x00, 0x32, - 0x40, 0x0A, 0x0A, 0x1F, 0x0A, 0x05, 0x02, 0x05, 0x00, 0x0F, - 0x7A, 0x03, - }, - .buf_len = 42, - } -}; - -static int compare_buffer(uint8_t *buffer, uint32_t length_buffer, - uint8_t *pattern, - uint32_t length_pattern) -{ - int i; - - if (length_buffer != length_pattern) { - printf("Length mismatch, expecting %d bytes, got %d bytes\n", length_pattern, - length_buffer); - return -1; - } - - for (i = 0; i < length_buffer; i++) { - if (pattern[i] != buffer[i]) { - printf("Mismatch fount in bytes %d\nExpecting 0x%02x, got 0x%02x\n", - i, pattern[i], buffer[i]); - } - } - - return 0; -} - -int main(int argc, char *argv[]) -{ - int i; - asn1_xer_print = 2; - - if (argc > 1) { - asn_debug = 1; - } - - for (i = 0; i < sizeof(s1ap_test) / sizeof(s1ap_test_t); i++) { - S1AP_S1AP_PDU_t pdu; - uint8_t *buffer; - uint32_t length; - memset(&pdu, 0, sizeof(pdu)); - printf("Trying to decode %s procedure with asn1c decoder\n", - s1ap_test[i].procedure_name); - - if (s1ap_mme_decode_pdu(&pdu, s1ap_test[i].buffer, - s1ap_test[i].buf_len) < 0) { - if (s1ap_eNB_decode_pdu(&pdu, s1ap_test[i].buffer, - s1ap_test[i].buf_len) < 0) { - printf("Failed to decode this message\n"); - } else { - printf("Succesfully decoded %s with eNB decoder\n", s1ap_test[i].procedure_name); - } - } else { - printf("Succesfully decoded %s with MME decoder\n", s1ap_test[i].procedure_name); - } - - printf("Trying to encode %s procedure with asn1c encoder\n", - s1ap_test[i].procedure_name); - - if (s1ap_eNB_encode_pdu(&pdu, &buffer, &length) < 0) { - printf("Failed to encode this message on MME side, trying eNB side\n"); - } else { - compare_buffer(buffer, length, s1ap_test[i].buffer, s1ap_test[i].buf_len); - free(buffer); - } - } - - return 0; -} diff --git a/openair3/TEST/oaisim_mme_sctp_test.c b/openair3/TEST/oaisim_mme_sctp_test.c deleted file mode 100644 index b8be3e185c..0000000000 --- a/openair3/TEST/oaisim_mme_sctp_test.c +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.1 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include "sctp_primitives_client.h" - -#include "s1ap_common.h" -#include "s1ap_eNB.h" -#include "s1ap_mme.h" - -#include "s1ap_eNB_encoder.h" -#include "s1ap_eNB_decoder.h" - -int recv_callback(uint32_t assocId, - uint32_t stream, - uint8_t *buffer, - uint32_t length) -{ - free(buffer); - return 0; -} - -int sctp_connected(void *args, - uint32_t assocId, - uint32_t instreams, - uint32_t outstreams) -{ - return 0; -} - -int main(int argc, char *argv[]) -{ - asn_enc_rval_t retVal; - int i; - - for (i = 0; i < nb_eNB; i++) { - sctp_connect_to_remote_host(ip_addr, 36412, NULL, sctp_connected, recv_callback); - } - - while (1) { - sleep(1); - } - - sctp_terminate(); - return(0); -} diff --git a/openair3/TEST/oaisim_mme_test_s1c.c b/openair3/TEST/oaisim_mme_test_s1c.c deleted file mode 100644 index 94a554ab5f..0000000000 --- a/openair3/TEST/oaisim_mme_test_s1c.c +++ /dev/null @@ -1,339 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.1 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -#define _GNU_SOURCE -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -#include "UTIL/LOG/log_extern.h" -#include "assertions.h" -#include "intertask_interface.h" -#include "sctp_eNB_task.h" -#include "s1ap_eNB.h" -#include "enb_config.h" - -#include "oaisim_mme_test_s1c.h" - -# define ENB_REGISTER_RETRY_DELAY 5 -//------------------------------------------------------------------------------ -static void get_options (int argc, char **argv); -static uint32_t eNB_app_register(const uint32_t enb_id_start, const uint32_t enb_id_end, const Enb_properties_array_t *enb_properties); -static void *eNB_app_task (void *args_p); -void mme_test_s1_start_test(instance_t instance); -//------------------------------------------------------------------------------ -static char *conf_config_file_name = NULL; -const Enb_properties_array_t *enb_properties = NULL; -int16_t glog_level = LOG_INFO; -int16_t glog_verbosity = LOG_MED; -s1c_test_t s1c_test = { - 0, // scenario_index - 0, // tx_next_message_index - 0, // rx_next_message_index - 0 // assoc_id - }; - -//------------------------------------------------------------------------------ -static void get_options (int argc, char **argv) -//------------------------------------------------------------------------------ -{ - int c; - - - while ((c = getopt_long (argc, argv, "K:g:G:O:",NULL,NULL)) != -1) { - switch (c) { - case 'O': - conf_config_file_name = optarg; - break; - - case 'g': - glog_level=atoi(optarg); // value between 1 - 9 - break; - - case 'G': - glog_verbosity=atoi(optarg);// value from 0, 0x5, 0x15, 0x35, 0x75 - break; - - default: - break; - } - } - - AssertFatal(conf_config_file_name != NULL,"Please provide a configuration file\n"); - - -} - - -//------------------------------------------------------------------------------ -static uint32_t eNB_app_register(const uint32_t enb_id_start, const uint32_t enb_id_end, const Enb_properties_array_t *enb_properties) -//------------------------------------------------------------------------------ -{ - uint32_t enb_id; - uint32_t mme_id; - MessageDef *msg_p; - uint32_t register_enb_pending = 0; - char *str = NULL; - struct in_addr addr; - - // 1 eNB should be max. - // 1 eNB should be max. - for (enb_id = enb_id_start; (enb_id < enb_id_end) ; enb_id++) { - { - s1ap_register_enb_req_t *s1ap_register_eNB; - - /* note: there is an implicit relationship between the data structure and the message name */ - msg_p = itti_alloc_new_message (TASK_ENB_APP, S1AP_REGISTER_ENB_REQ); - - s1ap_register_eNB = &S1AP_REGISTER_ENB_REQ(msg_p); - - /* Some default/random parameters */ - s1ap_register_eNB->eNB_id = enb_properties->properties[enb_id]->eNB_id; - s1ap_register_eNB->cell_type = enb_properties->properties[enb_id]->cell_type; - s1ap_register_eNB->eNB_name = enb_properties->properties[enb_id]->eNB_name; - s1ap_register_eNB->tac = enb_properties->properties[enb_id]->tac; - s1ap_register_eNB->mcc = enb_properties->properties[enb_id]->mcc; - s1ap_register_eNB->mnc = enb_properties->properties[enb_id]->mnc; - s1ap_register_eNB->mnc_digit_length = enb_properties->properties[enb_id]->mnc_digit_length; - s1ap_register_eNB->default_drx = enb_properties->properties[enb_id]->pcch_defaultPagingCycle[0]; - - s1ap_register_eNB->nb_mme = enb_properties->properties[enb_id]->nb_mme; - AssertFatal (s1ap_register_eNB->nb_mme <= S1AP_MAX_NB_MME_IP_ADDRESS, "Too many MME for eNB %d (%d/%d)!", enb_id, s1ap_register_eNB->nb_mme, - S1AP_MAX_NB_MME_IP_ADDRESS); - - for (mme_id = 0; mme_id < s1ap_register_eNB->nb_mme; mme_id++) { - s1ap_register_eNB->mme_ip_address[mme_id].ipv4 = enb_properties->properties[enb_id]->mme_ip_address[mme_id].ipv4; - s1ap_register_eNB->mme_ip_address[mme_id].ipv6 = enb_properties->properties[enb_id]->mme_ip_address[mme_id].ipv6; - strncpy (s1ap_register_eNB->mme_ip_address[mme_id].ipv4_address, - enb_properties->properties[enb_id]->mme_ip_address[mme_id].ipv4_address, - sizeof(s1ap_register_eNB->mme_ip_address[0].ipv4_address)); - strncpy (s1ap_register_eNB->mme_ip_address[mme_id].ipv6_address, - enb_properties->properties[enb_id]->mme_ip_address[mme_id].ipv6_address, - sizeof(s1ap_register_eNB->mme_ip_address[0].ipv6_address)); - } - - s1ap_register_eNB->enb_ip_address.ipv6 = 0; - s1ap_register_eNB->enb_ip_address.ipv4 = 1; - addr.s_addr = enb_properties->properties[enb_id]->enb_ipv4_address_for_S1_MME; - str = inet_ntoa(addr); - strcpy(s1ap_register_eNB->enb_ip_address.ipv4_address, str); - - itti_send_msg_to_task (TASK_S1AP, ENB_MODULE_ID_TO_INSTANCE(enb_id), msg_p); - - register_enb_pending++; - } - } - - return register_enb_pending; -} - -//------------------------------------------------------------------------------ -static void *eNB_app_task(void *args_p) -//------------------------------------------------------------------------------ -{ - const Enb_properties_array_t *enb_properties_p = NULL; - uint32_t enb_nb = 1; /* Default number of eNB is 1 */ - uint32_t enb_id_start = 0; - uint32_t enb_id_end = enb_id_start + enb_nb; - uint32_t register_enb_pending; - uint32_t registered_enb; - long enb_register_retry_timer_id; - MessageDef *msg_p = NULL; - const char *msg_name = NULL; - instance_t instance; - int result; - - itti_mark_task_ready (TASK_ENB_APP); - - enb_properties_p = enb_config_get(); - - AssertFatal (enb_nb <= enb_properties_p->number, - "Number of eNB is greater than eNB defined in configuration file (%d/%d)!", - enb_nb, enb_properties_p->number); - - - /* Try to register each eNB */ - registered_enb = 0; - register_enb_pending = eNB_app_register (enb_id_start, enb_id_end, enb_properties_p); - - do { - // Wait for a message - itti_receive_msg (TASK_ENB_APP, &msg_p); - - msg_name = ITTI_MSG_NAME (msg_p); - instance = ITTI_MSG_DESTINATION_INSTANCE (msg_p); - - switch (ITTI_MSG_ID(msg_p)) { - case TERMINATE_MESSAGE: - itti_exit_task (); - break; - - case MESSAGE_TEST: - LOG_I(ENB_APP, "Received %s\n", ITTI_MSG_NAME(msg_p)); - break; - - - case S1AP_REGISTER_ENB_CNF: - LOG_I(ENB_APP, "[eNB %d] Received %s: associated MME %d\n", instance, msg_name, - S1AP_REGISTER_ENB_CNF(msg_p).nb_mme); - - DevAssert(register_enb_pending > 0); - register_enb_pending--; - - /* Check if at least eNB is registered with one MME */ - if (S1AP_REGISTER_ENB_CNF(msg_p).nb_mme > 0) { - registered_enb++; - } - - /* Check if all register eNB requests have been processed */ - if (register_enb_pending == 0) { - if (registered_enb == enb_nb) { - mme_test_s1_start_test(instance); - - - } else { - uint32_t not_associated = enb_nb - registered_enb; - - LOG_W(ENB_APP, " %d eNB %s not associated with a MME, retrying registration in %d seconds ...\n", - not_associated, not_associated > 1 ? "are" : "is", ENB_REGISTER_RETRY_DELAY); - - /* Restart the eNB registration process in ENB_REGISTER_RETRY_DELAY seconds */ - if (timer_setup (ENB_REGISTER_RETRY_DELAY, 0, TASK_ENB_APP, INSTANCE_DEFAULT, TIMER_ONE_SHOT, - NULL, &enb_register_retry_timer_id) < 0) { - LOG_E(ENB_APP, " Can not start eNB register retry timer, use \"sleep\" instead!\n"); - - sleep(ENB_REGISTER_RETRY_DELAY); - /* Restart the registration process */ - registered_enb = 0; - register_enb_pending = eNB_app_register (enb_id_start, enb_id_end, enb_properties_p); - } - } - } - - break; - - case S1AP_DEREGISTERED_ENB_IND: - LOG_W(ENB_APP, "[eNB %d] Received %s: associated MME %d\n", instance, msg_name, - S1AP_DEREGISTERED_ENB_IND(msg_p).nb_mme); - - /* TODO handle recovering of registration */ - break; - - case TIMER_HAS_EXPIRED: - LOG_I(ENB_APP, " Received %s: timer_id %d\n", msg_name, TIMER_HAS_EXPIRED(msg_p).timer_id); - - if (TIMER_HAS_EXPIRED (msg_p).timer_id == enb_register_retry_timer_id) { - /* Restart the registration process */ - registered_enb = 0; - register_enb_pending = eNB_app_register (enb_id_start, enb_id_end, enb_properties_p); - } - - break; - - default: - LOG_E(ENB_APP, "Received unexpected message %s\n", msg_name); - break; - } - - result = itti_free (ITTI_MSG_ORIGIN_ID(msg_p), msg_p); - AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result); - } while (1); - - return NULL; -} - - -//------------------------------------------------------------------------------ -void mme_test_s1_start_test(instance_t instance) -//------------------------------------------------------------------------------ -{ - s1ap_eNB_itti_send_sctp_data_req(instance, - s1c_test.assoc_id, - s1ap_scenarios[s1c_test.scenario_index][s1c_test.tx_next_message_index].buffer, - s1ap_scenarios[s1c_test.scenario_index][s1c_test.tx_next_message_index].buf_len, - s1ap_scenarios[s1c_test.scenario_index][s1c_test.tx_next_message_index].sctp_stream_id); -} - - -//------------------------------------------------------------------------------ -void mme_test_s1_notify_sctp_data_ind(uint32_t assoc_id, int32_t stream, const uint8_t * const data, const uint32_t data_length) -//------------------------------------------------------------------------------ -{ - -} - - -//------------------------------------------------------------------------------ -int main( int argc, char **argv ) -//------------------------------------------------------------------------------ -{ - // initialize the log (see log.h for details) - logInit(); - - get_options (argc, argv); //Command-line options - set_glog(glog_level, glog_verbosity); - log_set_instance_type (LOG_INSTANCE_ENB); - - /* Read eNB configuration file */ - enb_properties = enb_config_init(conf_config_file_name); - - itti_init(TASK_MAX, tasks_info); - - itti_wait_ready(1); - - if (itti_create_task (TASK_SCTP, sctp_eNB_task, NULL) < 0) { - LOG_E(SCTP, "Create task for SCTP failed\n"); - return -1; - } - - if (itti_create_task (TASK_S1AP, s1ap_eNB_task, NULL) < 0) { - LOG_E(S1AP, "Create task for S1AP failed\n"); - return -1; - } - - if (itti_create_task (TASK_ENB_APP, eNB_app_task, NULL) < 0) { - LOG_E(S1AP, "Create task for S1AP failed\n"); - return -1; - } - - itti_wait_ready(0); - - - - sleep(30); - - logClean(); - return 0; -} diff --git a/openair3/TEST/oaisim_mme_test_s1c.h b/openair3/TEST/oaisim_mme_test_s1c.h deleted file mode 100644 index 91e4472caf..0000000000 --- a/openair3/TEST/oaisim_mme_test_s1c.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.1 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -typedef struct s1c_test_s { - int scenario_index; - int tx_next_message_index; - int rx_next_message_index; - int32_t assoc_id; -}s1c_test_t; - -void mme_test_s1_start_test(instance_t instance); -void mme_test_s1_notify_sctp_data_ind(uint32_t assoc_id, int32_t stream, const uint8_t * const data, const uint32_t data_length); diff --git a/openair3/TEST/oaisim_mme_test_s1c_s1ap.c b/openair3/TEST/oaisim_mme_test_s1c_s1ap.c deleted file mode 100644 index 60da125073..0000000000 --- a/openair3/TEST/oaisim_mme_test_s1c_s1ap.c +++ /dev/null @@ -1,291 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.1 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -#define _GNU_SOURCE -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -#include "tree.h" -#include "queue.h" -#include "intertask_interface.h" -#include "s1ap_eNB_default_values.h" -#include "s1ap_common.h" -#include "s1ap_eNB_defs.h" -#include "s1ap_eNB_management_procedures.h" -#include "assertions.h" - -#include "platform_types.h" -#include "oaisim_mme_test_s1c.h" - - -void s1ap_eNB_handle_sctp_data_ind(sctp_data_ind_t *sctp_data_ind) -{ - int result; - DevAssert(sctp_data_ind != NULL); - mme_test_s1_notify_sctp_data_ind(sctp_data_ind->assoc_id, sctp_data_ind->stream, - sctp_data_ind->buffer, sctp_data_ind->buffer_length); - result = itti_free(TASK_UNKNOWN, sctp_data_ind->buffer); - AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result); -} - - -void s1ap_eNB_itti_send_sctp_data_req(instance_t instance, int32_t assoc_id, uint8_t *buffer, - uint32_t buffer_length, uint16_t stream) -{ - MessageDef *message_p; - sctp_data_req_t *sctp_data_req; - message_p = itti_alloc_new_message(TASK_S1AP, SCTP_DATA_REQ); - sctp_data_req = &message_p->ittiMsg.sctp_data_req; - sctp_data_req->assoc_id = assoc_id; - sctp_data_req->buffer = buffer; - sctp_data_req->buffer_length = buffer_length; - sctp_data_req->stream = stream; - itti_send_msg_to_task(TASK_SCTP, instance, message_p); -} - -void s1ap_handle_s1_setup_message(s1ap_eNB_mme_data_t *mme_desc_p, int sctp_shutdown) -{ - if (sctp_shutdown) { - /* A previously connected MME has been shutdown */ - - /* TODO check if it was used by some eNB and send a message to inform these eNB if there is no more associated MME */ - if (mme_desc_p->state == S1AP_ENB_STATE_CONNECTED) { - mme_desc_p->state = S1AP_ENB_STATE_DISCONNECTED; - - if (mme_desc_p->s1ap_eNB_instance->s1ap_mme_associated_nb > 0) { - /* Decrease associated MME number */ - mme_desc_p->s1ap_eNB_instance->s1ap_mme_associated_nb --; - } - - /* If there are no more associated MME, inform eNB app */ - if (mme_desc_p->s1ap_eNB_instance->s1ap_mme_associated_nb == 0) { - MessageDef *message_p; - message_p = itti_alloc_new_message(TASK_S1AP, S1AP_DEREGISTERED_ENB_IND); - S1AP_DEREGISTERED_ENB_IND(message_p).nb_mme = 0; - itti_send_msg_to_task(TASK_ENB_APP, mme_desc_p->s1ap_eNB_instance->instance, message_p); - } - } - } else { - /* Check that at least one setup message is pending */ - DevCheck(mme_desc_p->s1ap_eNB_instance->s1ap_mme_pending_nb > 0, mme_desc_p->s1ap_eNB_instance->instance, - mme_desc_p->s1ap_eNB_instance->s1ap_mme_pending_nb, 0); - - if (mme_desc_p->s1ap_eNB_instance->s1ap_mme_pending_nb > 0) { - /* Decrease pending messages number */ - mme_desc_p->s1ap_eNB_instance->s1ap_mme_pending_nb --; - } - - /* If there are no more pending messages, inform eNB app */ - if (mme_desc_p->s1ap_eNB_instance->s1ap_mme_pending_nb == 0) { - MessageDef *message_p; - message_p = itti_alloc_new_message(TASK_S1AP, S1AP_REGISTER_ENB_CNF); - S1AP_REGISTER_ENB_CNF(message_p).nb_mme = mme_desc_p->s1ap_eNB_instance->s1ap_mme_associated_nb; - itti_send_msg_to_task(TASK_ENB_APP, mme_desc_p->s1ap_eNB_instance->instance, message_p); - } - } -} - -void s1ap_eNB_handle_sctp_association_resp(instance_t instance, sctp_new_association_resp_t *sctp_new_association_resp) -{ - s1ap_eNB_instance_t *instance_p; - s1ap_eNB_mme_data_t *s1ap_mme_data_p; - DevAssert(sctp_new_association_resp != NULL); - instance_p = s1ap_eNB_get_instance(instance); - DevAssert(instance_p != NULL); - s1ap_mme_data_p = s1ap_eNB_get_MME(instance_p, -1, - sctp_new_association_resp->ulp_cnx_id); - DevAssert(s1ap_mme_data_p != NULL); - - if (sctp_new_association_resp->sctp_state != SCTP_STATE_ESTABLISHED) { - S1AP_WARN("Received unsuccessful result for SCTP association (%u), instance %d, cnx_id %u\n", - sctp_new_association_resp->sctp_state, - instance, - sctp_new_association_resp->ulp_cnx_id); - s1ap_handle_s1_setup_message(s1ap_mme_data_p, sctp_new_association_resp->sctp_state == SCTP_STATE_SHUTDOWN); - return; - } - - /* Update parameters */ - s1ap_mme_data_p->assoc_id = sctp_new_association_resp->assoc_id; - s1ap_mme_data_p->in_streams = sctp_new_association_resp->in_streams; - s1ap_mme_data_p->out_streams = sctp_new_association_resp->out_streams; - /* Prepare new S1 Setup Request */ - mme_test_s1_start_test(instance_p, s1ap_mme_data_p); -} - -void s1ap_eNB_register_mme(s1ap_eNB_instance_t *instance_p, - net_ip_address_t *mme_ip_address, - net_ip_address_t *local_ip_addr) -{ - MessageDef *message_p = NULL; - sctp_new_association_req_t *sctp_new_association_req_p = NULL; - s1ap_eNB_mme_data_t *s1ap_mme_data_p = NULL; - DevAssert(instance_p != NULL); - DevAssert(mme_ip_address != NULL); - message_p = itti_alloc_new_message(TASK_S1AP, SCTP_NEW_ASSOCIATION_REQ); - sctp_new_association_req_p = &message_p->ittiMsg.sctp_new_association_req; - sctp_new_association_req_p->port = S1AP_PORT_NUMBER; - sctp_new_association_req_p->ppid = S1AP_SCTP_PPID; - memcpy(&sctp_new_association_req_p->remote_address, - mme_ip_address, - sizeof(*mme_ip_address)); - memcpy(&sctp_new_association_req_p->local_address, - local_ip_addr, - sizeof(*local_ip_addr)); - /* Create new MME descriptor */ - s1ap_mme_data_p = calloc(1, sizeof(*s1ap_mme_data_p)); - DevAssert(s1ap_mme_data_p != NULL); - s1ap_mme_data_p->cnx_id = s1ap_eNB_fetch_add_global_cnx_id(); - sctp_new_association_req_p->ulp_cnx_id = s1ap_mme_data_p->cnx_id; - s1ap_mme_data_p->assoc_id = -1; - s1ap_mme_data_p->s1ap_eNB_instance = instance_p; - STAILQ_INIT(&s1ap_mme_data_p->served_gummei); - /* Insert the new descriptor in list of known MME - * but not yet associated. - */ - RB_INSERT(s1ap_mme_map, &instance_p->s1ap_mme_head, s1ap_mme_data_p); - s1ap_mme_data_p->state = S1AP_ENB_STATE_WAITING; - instance_p->s1ap_mme_nb ++; - instance_p->s1ap_mme_pending_nb ++; - itti_send_msg_to_task(TASK_SCTP, instance_p->instance, message_p); -} - - - -void s1ap_eNB_handle_register_eNB(instance_t instance, s1ap_register_enb_req_t *s1ap_register_eNB) -{ - s1ap_eNB_instance_t *new_instance; - uint8_t index; - DevAssert(s1ap_register_eNB != NULL); - /* Look if the provided instance already exists */ - new_instance = s1ap_eNB_get_instance(instance); - - if (new_instance != NULL) { - /* Checks if it is a retry on the same eNB */ - DevCheck(new_instance->eNB_id == s1ap_register_eNB->eNB_id, new_instance->eNB_id, s1ap_register_eNB->eNB_id, 0); - DevCheck(new_instance->cell_type == s1ap_register_eNB->cell_type, new_instance->cell_type, s1ap_register_eNB->cell_type, 0); - DevCheck(new_instance->tac == s1ap_register_eNB->tac, new_instance->tac, s1ap_register_eNB->tac, 0); - DevCheck(new_instance->mcc == s1ap_register_eNB->mcc, new_instance->mcc, s1ap_register_eNB->mcc, 0); - DevCheck(new_instance->mnc == s1ap_register_eNB->mnc, new_instance->mnc, s1ap_register_eNB->mnc, 0); - DevCheck(new_instance->mnc_digit_length == s1ap_register_eNB->mnc_digit_length, new_instance->mnc_digit_length, s1ap_register_eNB->mnc_digit_length, 0); - DevCheck(new_instance->default_drx == s1ap_register_eNB->default_drx, new_instance->default_drx, s1ap_register_eNB->default_drx, 0); - } else { - new_instance = calloc(1, sizeof(s1ap_eNB_instance_t)); - DevAssert(new_instance != NULL); - RB_INIT(&new_instance->s1ap_ue_head); - RB_INIT(&new_instance->s1ap_mme_head); - /* Copy usefull parameters */ - new_instance->instance = instance; - new_instance->eNB_name = s1ap_register_eNB->eNB_name; - new_instance->eNB_id = s1ap_register_eNB->eNB_id; - new_instance->cell_type = s1ap_register_eNB->cell_type; - new_instance->tac = s1ap_register_eNB->tac; - new_instance->mcc = s1ap_register_eNB->mcc; - new_instance->mnc = s1ap_register_eNB->mnc; - new_instance->mnc_digit_length = s1ap_register_eNB->mnc_digit_length; - new_instance->default_drx = s1ap_register_eNB->default_drx; - /* Add the new instance to the list of eNB (meaningfull in virtual mode) */ - s1ap_eNB_insert_new_instance(new_instance); - S1AP_DEBUG("Registered new eNB[%d] and %s eNB id %u\n", - instance, - s1ap_register_eNB->cell_type == CELL_MACRO_ENB ? "macro" : "home", - s1ap_register_eNB->eNB_id); - } - - DevCheck(s1ap_register_eNB->nb_mme <= S1AP_MAX_NB_MME_IP_ADDRESS, - S1AP_MAX_NB_MME_IP_ADDRESS, s1ap_register_eNB->nb_mme, 0); - - /* Trying to connect to provided list of MME ip address */ - for (index = 0; index < s1ap_register_eNB->nb_mme; index++) { - s1ap_eNB_register_mme(new_instance, &s1ap_register_eNB->mme_ip_address[index], - &s1ap_register_eNB->enb_ip_address); - } -} - - - - -void *s1ap_eNB_task(void *arg) -{ - MessageDef *received_msg = NULL; - int result; - S1AP_DEBUG("Starting S1AP layer\n"); - s1ap_eNB_prepare_internal_data(); - itti_mark_task_ready(TASK_S1AP); - - while (1) { - itti_receive_msg(TASK_S1AP, &received_msg); - - switch (ITTI_MSG_ID(received_msg)) { - case TERMINATE_MESSAGE: - itti_exit_task(); - break; - - case S1AP_REGISTER_ENB_REQ: { - /* Register a new eNB. - * in Virtual mode eNBs will be distinguished using the mod_id/ - * Each eNB has to send an S1AP_REGISTER_ENB message with its - * own parameters. - */ - s1ap_eNB_handle_register_eNB(ITTI_MSG_DESTINATION_INSTANCE(received_msg), - &S1AP_REGISTER_ENB_REQ(received_msg)); - } - break; - - case SCTP_NEW_ASSOCIATION_RESP: { - s1ap_eNB_handle_sctp_association_resp(ITTI_MSG_DESTINATION_INSTANCE(received_msg), - &received_msg->ittiMsg.sctp_new_association_resp); - } - break; - - case SCTP_DATA_IND: { - s1ap_eNB_handle_sctp_data_ind(&received_msg->ittiMsg.sctp_data_ind); - } - break; - - default: - S1AP_ERROR("Received unhandled message: %d:%s\n", - ITTI_MSG_ID(received_msg), ITTI_MSG_NAME(received_msg)); - break; - } - - result = itti_free (ITTI_MSG_ORIGIN_ID(received_msg), received_msg); - AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result); - received_msg = NULL; - } - - return NULL; -} diff --git a/openair3/TEST/oaisim_mme_test_s1c_s1ap.h b/openair3/TEST/oaisim_mme_test_s1c_s1ap.h deleted file mode 100644 index 4faec0e66e..0000000000 --- a/openair3/TEST/oaisim_mme_test_s1c_s1ap.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.1 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -#ifndef __TEST_OAISIM_MME_TEST_S1C_S1AP__H__ -#define __TEST_OAISIM_MME_TEST_S1C_S1AP__H__ - -#define _GNU_SOURCE -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -void s1ap_eNB_handle_sctp_data_ind(sctp_data_ind_t *sctp_data_ind); - -void s1ap_eNB_itti_send_sctp_data_req(instance_t instance, int32_t assoc_id, uint8_t *buffer, - uint32_t buffer_length, uint16_t stream); - -void s1ap_handle_s1_setup_message(s1ap_eNB_mme_data_t *mme_desc_p, int sctp_shutdown); - -void s1ap_eNB_handle_sctp_association_resp(instance_t instance, sctp_new_association_resp_t *sctp_new_association_resp); - -void s1ap_eNB_register_mme(s1ap_eNB_instance_t *instance_p, - net_ip_address_t *mme_ip_address, - net_ip_address_t *local_ip_addr, - uint16_t in_streams, - uint16_t out_streams); -void s1ap_eNB_handle_register_eNB(instance_t instance, s1ap_register_enb_req_t *s1ap_register_eNB); -void *s1ap_eNB_task(void *arg); - -#endif diff --git a/openair3/TEST/oaisim_mme_test_s1c_scenario.c b/openair3/TEST/oaisim_mme_test_s1c_scenario.c deleted file mode 100644 index 60d74866c8..0000000000 --- a/openair3/TEST/oaisim_mme_test_s1c_scenario.c +++ /dev/null @@ -1,279 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.1 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -#include -#include -#include -#include - -#include "oaisim_mme_test_s1c_scenario.h" - -int scenario_index = 0; -int scenario_message_index = 0; -int debug = 0; -int error_count = 0; -int break_on_error = 0; - - -extern s1ap_message_test_t s1ap_scenario1[]; - -s1ap_message_test_t s1ap_scenarios[][] = {s1ap_scenario1}; - -/* -1 means invalid */ -static const signed char hex_digits[0x100] = { - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1, - -1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 -}; - -//------------------------------------------------------------------------------ -void -fail (const char *format, ...) -//------------------------------------------------------------------------------ -{ - char str[1024]; - va_list arg_ptr; - - va_start (arg_ptr, format); - vsnprintf ( str, sizeof(str), format, arg_ptr); - va_end (arg_ptr); - fputs(str, stderr); - error_count++; - - if (break_on_error) - exit (1); -} - -//------------------------------------------------------------------------------ -void -success (const char *format, ...) -//------------------------------------------------------------------------------ -{ - char str[1024]; - va_list arg_ptr; - - va_start (arg_ptr, format); - vsnprintf ( str, sizeof(str), format, arg_ptr); - va_end (arg_ptr); - fputs(str, stderr); -} - -//------------------------------------------------------------------------------ -void -escapeprint (const char *str, size_t len) -//------------------------------------------------------------------------------ -{ - size_t i; - - printf (" (length %d bytes):\n\t", (int) len); - - for (i = 0; i < len; i++) { - if (((str[i] & 0xFF) >= 'A' && (str[i] & 0xFF) <= 'Z') || - ((str[i] & 0xFF) >= 'a' && (str[i] & 0xFF) <= 'z') || - ((str[i] & 0xFF) >= '0' && (str[i] & 0xFF) <= '9') - || (str[i] & 0xFF) == ' ' || (str[i] & 0xFF) == '.') - printf ("%c", (str[i] & 0xFF)); - else - printf ("\\x%02X", (str[i] & 0xFF)); - - if ((i + 1) % 16 == 0 && (i + 1) < len) - printf ("'\n\t'"); - } - - printf ("\n"); -} - -//------------------------------------------------------------------------------ -void -hexprint (const void *_str, size_t len) -//------------------------------------------------------------------------------ -{ - size_t i; - const char* str = _str; - - printf ("\t;; "); - - for (i = 0; i < len; i++) { - printf ("%02x ", (str[i] & 0xFF)); - - if ((i + 1) % 8 == 0) - printf (" "); - - if ((i + 1) % 16 == 0 && i + 1 < len) - printf ("\n\t;; "); - } - - printf ("\n"); -} - -//------------------------------------------------------------------------------ -void -binprint (const void *_str, size_t len) -//------------------------------------------------------------------------------ -{ - size_t i; - const char* str = _str; - - printf ("\t;; "); - - for (i = 0; i < len; i++) { - printf ("%d%d%d%d%d%d%d%d ", - (str[i] & 0xFF) & 0x80 ? 1 : 0, - (str[i] & 0xFF) & 0x40 ? 1 : 0, - (str[i] & 0xFF) & 0x20 ? 1 : 0, - (str[i] & 0xFF) & 0x10 ? 1 : 0, - (str[i] & 0xFF) & 0x08 ? 1 : 0, - (str[i] & 0xFF) & 0x04 ? 1 : 0, - (str[i] & 0xFF) & 0x02 ? 1 : 0, (str[i] & 0xFF) & 0x01 ? 1 : 0); - - if ((i + 1) % 3 == 0) - printf (" "); - - if ((i + 1) % 6 == 0 && i + 1 < len) - printf ("\n\t;; "); - } - - printf ("\n"); -} - -//------------------------------------------------------------------------------ -int -compare_buffer(const uint8_t *buffer, const uint32_t length_buffer, - const uint8_t *pattern, const uint32_t length_pattern) -//------------------------------------------------------------------------------ -{ - int i; - - if (length_buffer != length_pattern) { - printf("Length mismatch, expecting %d bytes, got %d bytes\n", length_pattern, - length_buffer); - hexprint(buffer, length_buffer); - return -1; - } - - for (i = 0; i < length_buffer; i++) { - if (pattern[i] != buffer[i]) { - printf("Expecting:\n"); - hexprint(pattern, length_pattern); - printf("Received:\n"); - hexprint(buffer, length_buffer); - printf("Mismatch fount in byte %d\nExpecting 0x%02x, got 0x%02x\n", - i, pattern[i], buffer[i]); - return -1; - } - } - - return 0; -} - -//------------------------------------------------------------------------------ -unsigned -decode_hex_length(const char *h) -//------------------------------------------------------------------------------ -{ - const unsigned char *hex = (const unsigned char *) h; - unsigned count; - unsigned i; - - for (count = i = 0; hex[i]; i++) { - if (isspace(hex[i])) - continue; - - if (hex_digits[hex[i]] < 0) - abort(); - - count++; - } - - if (count % 2) - abort(); - - return count / 2; -} - -//------------------------------------------------------------------------------ -int -decode_hex(uint8_t *dst, const char *h) -//------------------------------------------------------------------------------ -{ - const unsigned char *hex = (const unsigned char *) h; - unsigned i = 0; - - for (;;) { - int high, low; - - while (*hex && isspace(*hex)) - hex++; - - if (!*hex) - return 1; - - high = hex_digits[*hex++]; - - if (high < 0) - return 0; - - while (*hex && isspace(*hex)) - hex++; - - if (!*hex) - return 0; - - low = hex_digits[*hex++]; - - if (low < 0) - return 0; - - dst[i++] = (high << 4) | low; - } -} - -//------------------------------------------------------------------------------ -uint8_t * -decode_hex_dup(const char *hex) -//------------------------------------------------------------------------------ -{ - uint8_t *p; - unsigned length = decode_hex_length(hex); - - p = malloc(length * sizeof(uint8_t)); - - if (decode_hex(p, hex)) - return p; - else { - free(p); - return NULL; - } -} - diff --git a/openair3/TEST/oaisim_mme_test_s1c_scenario.h b/openair3/TEST/oaisim_mme_test_s1c_scenario.h deleted file mode 100644 index 8b9a8dd54a..0000000000 --- a/openair3/TEST/oaisim_mme_test_s1c_scenario.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.1 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -#ifndef __TEST_OAISIM_MME_TEST_S1C_SCENARIO__H__ -#define __TEST_OAISIM_MME_TEST_S1C_SCENARIO__H__ - -#include -#include - -#define MME_TEST_S1_MAX_BUF_LENGTH (1024) -#define MME_TEST_S1_MAX_BYTES_TEST (32) - -typedef enum entity_s{ - MME, - ENB -} entity_t; - -typedef struct s1ap_message_test_s{ - char *procedure_name; - uint8_t buffer[MME_TEST_S1_MAX_BUF_LENGTH]; - uint16_t dont_check[MME_TEST_S1_MAX_BYTES_TEST]; // bytes index test that can be omitted - uint32_t buf_len; - entity_t originating; - uint16_t sctp_stream_id; - uint32_t assoc_id; -} s1ap_message_test_t; - -void fail (const char *format, ...); -void success (const char *format, ...); -void escapeprint (const char *str, size_t len); -void hexprint (const void *_str, size_t len); -void binprint (const void *_str, size_t len); -int compare_buffer(const uint8_t *buffer, const uint32_t length_buffer, const uint8_t *pattern, const uint32_t length_pattern); -unsigned decode_hex_length(const char *h); -int decode_hex(uint8_t *dst, const char *h); -uint8_t *decode_hex_dup(const char *hex); - -#endif diff --git a/openair3/TEST/oaisim_mme_test_s1c_scenario1.c b/openair3/TEST/oaisim_mme_test_s1c_scenario1.c deleted file mode 100644 index 87a63b876a..0000000000 --- a/openair3/TEST/oaisim_mme_test_s1c_scenario1.c +++ /dev/null @@ -1,181 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.1 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -#include -#include "oaisim_mme_test_s1c_scenario.h" - - -// Description succesfull attach of UE, release UE. - -s1ap_message_test_t s1ap_scenario1[] = { - { - .procedure_name = "id-initialUEMessage", - .buffer = { - 0x00, 0x0C, - 0x00, 0x5C, 0x00, 0x00, 0x05, 0x00, 0x08, 0x00, 0x04, 0x80, 0x06, 0x69, 0x2D, 0x00, 0x1A, 0x00, - 0x32, 0x31, 0x07, 0x41, 0x71, 0x08, 0x29, 0x80, 0x39, 0x00, 0x00, 0x00, 0x00, 0x10, 0x02, 0xE0, - 0xE0, 0x00, 0x20, 0x02, 0x01, 0xD0, 0x11, 0x27, 0x1A, 0x80, 0x80, 0x21, 0x10, 0x01, 0x00, 0x00, - 0x10, 0x81, 0x06, 0x00, 0x00, 0x00, 0x00, 0x83, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, - 0x00, 0x0A, 0x00, 0x00, 0x43, 0x00, 0x06, 0x00, 0x02, 0xF8, 0x39, 0x00, 0x01, 0x00, 0x64, 0x40, - 0x08, 0x00, 0x02, 0xF8, 0x39, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x86, 0x40, 0x01, 0x30 - }, - .dont_check = { - -1 - }, - .buf_len = 96, - .sctp_stream_id = 1, - .originating = ENB, - }, - { - .procedure_name = "id-downlinkNASTransport, Authentication request", - .buffer = { - 0x00, 0x0B, - 0x00, 0x3D, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05, 0xC0, 0x80, 0x00, 0x15, 0x20, 0x00, 0x08, - 0x00, 0x04, 0x80, 0x06, 0x69, 0x2D, 0x00, 0x1A, 0x00, 0x25, 0x24, 0x07, 0x52, 0x00, 0xD3, 0xB5, - 0xF0, 0x89, 0x68, 0x02, 0x66, 0x5A, 0x08, 0xE6, 0x51, 0xC7, 0x29, 0x6B, 0x4D, 0xA0, 0x10, 0xDD, - 0x04, 0x53, 0xC8, 0x3F, 0x94, 0x80, 0x00, 0x03, 0xAF, 0x2F, 0x49, 0xF3, 0xC8, 0x38, 0x90, 0x00, - 0x00, 0x00 - }, - .dont_check = { - -1 - }, - .buf_len = 65, - .sctp_stream_id = 1, - .originating = MME, - }, - { - .procedure_name = "id-uplinkNASTransport, 0xAuthentication response", - .buffer = { - 0x00, 0x0d, - 0x40, 0x3a, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0xc0, 0x80, 0x00, 0x15, 0x20, 0x00, 0x08, - 0x00, 0x04, 0x80, 0x06, 0x69, 0x2d, 0x00, 0x1a, 0x00, 0x0C, 0x0b, 0x07, 0x53, 0x08, 0x11, 0x82, - 0x98, 0x98, 0x3b, 0xca, 0xF2, 0x97, 0x00, 0x64, 0x40, 0x08, 0x00, 0x02, 0xF8, 0x39, 0x00, 0x00, - 0xe0, 0x00, 0x00, 0x43, 0x40, 0x06, 0x00, 0x02, 0xF8, 0x39, 0x00, 0x01, 0x00, 0x00 - }, - .dont_check = { - -1 - }, - .buf_len = 62, - .sctp_stream_id = 1, - .originating = ENB, - }, - { - .procedure_name = "id-downlinkNASTransport, Security mode command", - .buffer = { - 0x00, 0x0b, - 0x00, 0x26, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05, 0xc0, 0x80, 0x00, 0x15, 0x20, 0x00, 0x08, - 0x00, 0x04, 0x80, 0x06, 0x69, 0x2d, 0x00, 0x1a, 0x00, 0x0e, 0x0d, 0x37, 0xFC, 0xc1, 0xda, 0xd9, - 0x00, 0x07, 0x5d, 0x02, 0x00, 0x02, 0xe0, 0xe0, 0x00, 0x00 - }, - .dont_check = { - -1 - }, - .buf_len = 42, - .sctp_stream_id = 1, - .originating = MME, - }, - { - .procedure_name = "id-uplinkNASTransport, Security mode complete", - .buffer = { - 0x00, 0x0d, - 0x40, 0x37, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0xc0, 0x80, 0x00, 0x15, 0x20, 0x00, 0x08, - 0x00, 0x04, 0x80, 0x06, 0x69, 0x2d, 0x00, 0x1a, 0x00, 0x09, 0x08, 0x47, 0x1d, 0xd0, 0xbb, 0xad, - 0x00, 0x07, 0x5e, 0x00, 0x64, 0x40, 0x08, 0x00, 0x02, 0xF8, 0x39, 0x00, 0x00, 0xe0, 0x00, 0x00, - 0x43, 0x40, 0x06, 0x00, 0x02, 0xF8, 0x39, 0x00, 0x01, 0x00 - }, - .dont_check = { - -1 - }, - .buf_len = 59, - .sctp_stream_id = 1, - .originating = ENB, - }, - { - .procedure_name = "id-InitialContextSetup, InitialContextSetupRequest , Attach accept, Activate default EPS bearer context request", - .buffer = { - 0x00, 0x09, - 0x00, 0x80, 0xba, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x05, 0xc0, 0x80, 0x00, 0x15, 0x20, 0x00, - 0x08, 0x00, 0x04, 0x80, 0x06, 0x69, 0x2d, 0x00, 0x42, 0x00, 0x0a, 0x18, 0x05, 0xF5, 0xe1, 0x00, - 0x60, 0x02, 0xFa, 0xF0, 0x80, 0x00, 0x18, 0x00, 0x67, 0x00, 0x00, 0x34, 0x00, 0x62, 0x45, 0x00, - 0x09, 0x04, 0x0f, 0x80, 0x7f, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x53, 0x27, 0x8b, 0xe6, - 0x60, 0xb5, 0x01, 0x07, 0x42, 0x01, 0x4a, 0x06, 0x20, 0x02, 0xF8, 0x39, 0x00, 0x01, 0x00, 0x31, - 0x52, 0x01, 0xc1, 0x01, 0x09, 0x09, 0x03, 0x6f, 0x61, 0x69, 0x04, 0x69, 0x70, 0x76, 0x34, 0x05, - 0x01, 0xc0, 0xbb, 0x00, 0x02, 0x5e, 0x04, 0xFe, 0xFe, 0xde, 0x9e, 0x27, 0x14, 0x80, 0x80, 0x21, - 0x10, 0x03, 0x00, 0x00, 0x10, 0x81, 0x06, 0xc0, 0xa8, 0x0C, 0x64, 0x83, 0x06, 0xc0, 0xa8, 0x6a, - 0x0C, 0x50, 0x0b, 0xF6, 0x02, 0xF8, 0x39, 0x80, 0x00, 0x01, 0x78, 0x00, 0x0C, 0x20, 0x17, 0x2C, - 0x00, 0x6b, 0x00, 0x05, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x49, 0x00, 0x20, 0xFa, 0x59, 0x15, - 0x4e, 0x32, 0x95, 0x04, 0x2d, 0x35, 0xa4, 0x47, 0xc3, 0x80, 0xab, 0x63, 0xd8, 0xe6, 0x91, 0x83, - 0x6C, 0x9a, 0xF0, 0xed, 0x85, 0x38, 0xa8, 0x27, 0x41, 0x6b, 0x2b, 0x64, 0x86, 0x00 - }, - .dont_check = { - -1 - }, - .buf_len = 191, - .sctp_stream_id = 1, - .originating = MME, - }, - { - .procedure_name = "id-UECapabilityInfoIndication", - .buffer = { - 0x00, 0x16, - 0x40, 0x2C, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05, 0xc0, 0x80, 0x00, 0x15, 0x20, 0x00, 0x08, - 0x00, 0x04, 0x80, 0x06, 0x69, 0x2d, 0x00, 0x4a, 0x40, 0x14, 0x13, 0x81, 0x20, 0x00, 0x03, 0x00, - 0x10, 0x60, 0xe0, 0xc1, 0xF8, 0x3f, 0x07, 0xe0 ,0xfd, 0x78, 0x37, 0x62, 0x00, 0x00 - }, - .dont_check = { - -1 - }, - .buf_len = 48, - .originating = ENB, - }, - { - .procedure_name = "id-InitialContextSetup, InitialContextSetupResponse ", - .buffer = { - 0x20, 0x09, - 0x00, 0x27, 0x00, 0x00, 0x03, 0x00, 0x00, 0x40, 0x05, 0xc0, 0x80, 0x00, 0x15, 0x20, 0x00, 0x08, - 0x40, 0x04, 0x80, 0x06, 0x69, 0x2d, 0x00, 0x33, 0x40, 0x0f, 0x00, 0x00, 0x32, 0x40, 0x0a, 0x0a, - 0x1f, 0x7f, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01 - }, - .dont_check = { - -1 - }, - .buf_len = 64, - .sctp_stream_id = 1, - .originating = ENB, - }, - { - .procedure_name = "id-uplinkNASTransport, Attach complete, Activate default EPS bearer context accept", - .buffer = { - - 0x00, 0x0d, - 0x05, 0x00, 0x00, 0x00, 0x05, 0xc0, 0x80, 0x00, 0x15, 0x20, 0x00, 0x08, 0x00, 0x04, 0x80, 0x06, - 0x69, 0x2d, 0x00, 0x1a, 0x00, 0x0e, 0x0d, 0x27, 0xc7, 0x8f, 0x5a, 0xd2, 0x01, 0x07, 0x43, 0x00, - 0x03, 0x52, 0x00, 0xc2, 0x00, 0x64, 0x40, 0x08, 0x00, 0x02, 0xF8, 0x39, 0x00, 0x00, 0xe0, 0x00, - 0x00, 0x43, 0x40, 0x06, 0x00, 0x02, 0xF8, 0x39, 0x00, 0x01 - }, - .dont_check = { - -1 - }, - .buf_len = 64, - .sctp_stream_id = 1, - .originating = ENB, - } -}; From cf815ffbce3f89ce6c7d3eb0f39a78b6ee6cafb1 Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Fri, 25 Feb 2022 17:54:13 +0100 Subject: [PATCH 61/96] Fix compilation error in ocp-enb --- executables/main-ocp.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/executables/main-ocp.c b/executables/main-ocp.c index 04315a4d57..c9388e179d 100644 --- a/executables/main-ocp.c +++ b/executables/main-ocp.c @@ -87,10 +87,10 @@ AGENT_RRC_xface *agent_rrc_xface[NUM_MAX_ENB]= {0}; AGENT_MAC_xface *agent_mac_xface[NUM_MAX_ENB]= {0}; void flexran_agent_slice_update(mid_t module_idP) { } -int proto_agent_start(mod_id_t mod_id, const cudu_params_t *p) { +int proto_agent_start(mid_t mod_id, const cudu_params_t *p) { return 0; } -void proto_agent_stop(mod_id_t mod_id) { +void proto_agent_stop(mid_t mod_id) { } static void *ru_thread( void *param ); From c6ac88ffa61e99b915af18d425d5c997ddd9abfe Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Fri, 25 Feb 2022 17:15:05 +0100 Subject: [PATCH 62/96] Remove deprecated ocp-gnb --- cmake_targets/CMakeLists.txt | 37 -- doc/5Gnas.md | 1 - doc/SW_archi.md | 4 - executables/ocp-gnb.c | 1006 ---------------------------------- 4 files changed, 1048 deletions(-) delete mode 100644 executables/ocp-gnb.c diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index d3041f9112..9710d3a8ca 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -2852,42 +2852,6 @@ target_link_libraries (nr-softmodem ${T_LIB}) add_dependencies( nr-softmodem ldpc_orig ldpc_optim ldpc_optim8seg ldpc ) -add_executable(ocp-gnb - ${rrc_h} - ${nr_rrc_h} - ${s1ap_h} -# ${OPENAIR_BIN_DIR}/messages_xml.h - ${OPENAIR_DIR}/executables/ocp-gnb.c - ${OPENAIR_DIR}/executables/softmodem-common.c - ${OPENAIR1_DIR}/SIMULATION/TOOLS/taus.c - ${OPENAIR_TARGETS}/ARCH/COMMON/common_lib.c - ${OPENAIR_TARGETS}/ARCH/COMMON/record_player.c - ${OPENAIR2_DIR}/RRC/NAS/nas_config.c - ${OPENAIR2_DIR}/RRC/NAS/rb_config.c - ${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c - ${OPENAIR_DIR}/common/utils/nr/nr_common.c - ${PHY_INTERFACE_DIR}/queue_t.c - ${XFORMS_SOURCE_NR} - ${T_SOURCE} - ${SHLIB_LOADER_SOURCES} - ${XFORMSINTERFACE_SOURCE} - ) - -target_link_libraries (ocp-gnb - -Wl,--start-group - UTIL HASHTABLE SCTP_CLIENT SCHED_LIB SCHED_RU_LIB SCHED_NR_LIB PHY_NR PHY PHY_COMMON PHY_NR_COMMON PHY_RU LFDS GTPV1U SECU_CN SECU_OSA - ITTI ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} LFDS7 ${RAL_LIB} ${NAS_UE_LIB} RRC_LIB NR_RRC_LIB - NGAP_LIB NGAP_GNB S1AP_LIB S1AP_ENB L2_LTE_NR L2_NR MAC_NR_COMMON NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB - X2AP_LIB X2AP_ENB F1AP_LIB F1AP M2AP_LIB M2AP_ENB M3AP_LIB M3AP_ENB SIMU_COMMON - -Wl,--end-group z dl) - -target_link_libraries (ocp-gnb ${LIBXML2_LIBRARIES} ) -target_link_libraries (ocp-gnb pthread m CONFIG_LIB rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} sctp ${XFORMS_LIBRARIES} ${PROTOBUF_LIB} ${CMAKE_DL_LIBS} ${LIBYAML_LIBRARIES} ${ATLAS_LIBRARIES}) -target_link_libraries (ocp-gnb ${LIB_LMS_LIBRARIES}) -target_link_libraries (ocp-gnb ${T_LIB}) -add_dependencies(ocp-gnb ldpc_orig ldpc_optim ldpc_optim8seg ldpc params_libconfig rfsimulator oai_usrpdevif rfsimulator nrscope) - - # nr-uesoftmodem is UE implementation ####################################### @@ -2931,7 +2895,6 @@ add_dependencies( nr-uesoftmodem ldpc_orig ldpc_optim ldpc_optim8seg ldpc ) if (CUDA_FOUND) add_dependencies( nr-uesoftmodem ldpc_cuda) add_dependencies( nr-softmodem ldpc_cuda) - add_dependencies( ocp-gnb ldpc_cuda) endif (CUDA_FOUND) ###################################" # Addexecutables for tests diff --git a/doc/5Gnas.md b/doc/5Gnas.md index 3d33af426c..db0c19f07e 100644 --- a/doc/5Gnas.md +++ b/doc/5Gnas.md @@ -23,7 +23,6 @@ This tuto for 5G gNB NAS design # source files -executables/ocp-gnb.c: a main loop to create a debuggable gNB, see document SW_archi.md openair2/RRC/NR/nr_ngap_gNB.c: skeleton for interface with NGAP openair3/NAS/COMMON/milenage.h: a simple milenage implementation, depend only on crypto library openair3/NAS/COMMON/NR_NAS_defs.h: messages defined for NAS implemented in C: C struct, C enums and automatic conversion to labels for debug messages diff --git a/doc/SW_archi.md b/doc/SW_archi.md index 7648fb2e16..0a53bf3793 100644 --- a/doc/SW_archi.md +++ b/doc/SW_archi.md @@ -85,10 +85,6 @@ end This tuto for 5G gNB design, with Open Cells main {: .text-center} -# Top file: executables/ocp-gnb.c - -the function main() initializes the data from configuration file - # The main thread is in ru_thread() The infinite loop: ## rx_rf() diff --git a/executables/ocp-gnb.c b/executables/ocp-gnb.c deleted file mode 100644 index 23fd3ae132..0000000000 --- a/executables/ocp-gnb.c +++ /dev/null @@ -1,1006 +0,0 @@ -/* - * Author: Laurent Thomas, Open Cells Project - * all rights reserved - */ - -#define _GNU_SOURCE -#include -#include "assertions.h" -#include -#include - -#include "PHY/types.h" - -#include "PHY/INIT/phy_init.h" - -#include "PHY/defs_gNB.h" -#include "SCHED/sched_eNB.h" -#include "SCHED_NR/sched_nr.h" -#include "SCHED_NR/fapi_nr_l1.h" -#include "PHY/LTE_TRANSPORT/transport_proto.h" -#include "../../ARCH/COMMON/common_lib.h" - -#include "PHY/phy_extern.h" -#include "LAYER2/MAC/mac.h" -#include "LAYER2/NR_MAC_COMMON/nr_mac_extern.h" -#include "LAYER2/MAC/mac_proto.h" -#include "RRC/LTE/rrc_extern.h" -#include "PHY_INTERFACE/phy_interface.h" -#include "common/utils/LOG/log_extern.h" -#include "UTIL/OTG/otg_tx.h" -#include "UTIL/OTG/otg_externs.h" -#include "UTIL/MATH/oml.h" -#include "common/utils/LOG/vcd_signal_dumper.h" -#include "UTIL/OPT/opt.h" -#include "enb_config.h" -#include "s1ap_eNB.h" -#include "SIMULATION/ETH_TRANSPORT/proto.h" -#include -#include -#include -#include -#include -#include -#include -#include - -// should be in a shared lib -#include -#include -#include -#include - -// Global vars -#include -#include -#include -#include -volatile int oai_exit; -int single_thread_flag=1; -uint32_t do_forms=0; -unsigned int mmapped_dma=0; -int8_t threequarter_fs=0; - -int chain_offset=0; -uint16_t sl_ahead=6; -uint16_t sf_ahead=6; -uint32_t timing_advance = 0; -int transmission_mode=1; -int emulate_rf = 0; -int numerology = 0; - - -int config_sync_var=-1; -pthread_mutex_t nfapi_sync_mutex; -pthread_cond_t nfapi_sync_cond; -int nfapi_sync_var=-1; -double cpuf; - -THREAD_STRUCT thread_struct; - -pthread_cond_t sync_cond; -pthread_mutex_t sync_mutex; -int sync_var=-1; //!< protected by mutex \ref sync_mutex. - - -uint64_t downlink_frequency[MAX_NUM_CCs][4]; -int32_t uplink_frequency_offset[MAX_NUM_CCs][4]; -time_stats_t softmodem_stats_mt; // main thread -time_stats_t softmodem_stats_hw; // hw acquisition -time_stats_t softmodem_stats_rxtx_sf; // total tx time -time_stats_t nfapi_meas; // total tx time -time_stats_t softmodem_stats_rx_sf; // total rx time -// not used but needed for link -openair0_config_t openair0_cfg[MAX_CARDS]; -uint16_t slot_ahead=6; -AGENT_RRC_xface *agent_rrc_xface[NUM_MAX_ENB]; -AGENT_MAC_xface *agent_mac_xface[NUM_MAX_ENB]; -int flexran_agent_start(mid_t mod_id) { - memset (agent_rrc_xface, 0, sizeof(agent_rrc_xface)); - memset (agent_mac_xface, 0, sizeof(agent_mac_xface)); - return 0; -} -void flexran_agent_slice_update(mid_t module_idP) { -} -int proto_agent_start(mod_id_t mod_id, const cudu_params_t *p) { - return 0; -} -void proto_agent_stop(mod_id_t mod_id) { -} -int split73=0; -void sendFs6Ul(PHY_VARS_eNB *eNB, int UE_id, int harq_pid, int segmentID, int16_t *data, int dataLen, int r_offset) { - AssertFatal(false, "Must not be called in this context\n"); -} -int stop_L1L2(module_id_t gnb_id) { - AssertFatal(false, "Must not be called in this context\n"); -} -int restart_L1L2(module_id_t gnb_id) { - AssertFatal(false, "Must not be called in this context\n"); -} - -static int wait_for_sync = 0; -static double snr_dB=20; -static int DEFBANDS[] = {7}; -static int DEFENBS[] = {0}; -static int DEFBFW[] = {0x00007fff}; - -extern double cpuf; - -short nr_mod_table[NR_MOD_TABLE_SIZE_SHORT] = {0,0,16384,16384,-16384,-16384,16384,16384,16384,-16384,-16384,16384,-16384,-16384,7327,7327,7327,21981,21981,7327,21981,21981,7327,-7327,7327,-21981,21981,-7327,21981,-21981,-7327,7327,-7327,21981,-21981,7327,-21981,21981,-7327,-7327,-7327,-21981,-21981,-7327,-21981,-21981,10726,10726,10726,3576,3576,10726,3576,3576,10726,17876,10726,25027,3576,17876,3576,25027,17876,10726,17876,3576,25027,10726,25027,3576,17876,17876,17876,25027,25027,17876,25027,25027,10726,-10726,10726,-3576,3576,-10726,3576,-3576,10726,-17876,10726,-25027,3576,-17876,3576,-25027,17876,-10726,17876,-3576,25027,-10726,25027,-3576,17876,-17876,17876,-25027,25027,-17876,25027,-25027,-10726,10726,-10726,3576,-3576,10726,-3576,3576,-10726,17876,-10726,25027,-3576,17876,-3576,25027,-17876,10726,-17876,3576,-25027,10726,-25027,3576,-17876,17876,-17876,25027,-25027,17876,-25027,25027,-10726,-10726,-10726,-3576,-3576,-10726,-3576,-3576,-10726,-17876,-10726,-25027,-3576,-17876,-3576,-25027,-17876,-10726,-17876,-3576,-25027,-10726,-25027,-3576,-17876,-17876,-17876,-25027,-25027,-17876,-25027,-25027,8886,8886,8886,12439,12439,8886,12439,12439,8886,5332,8886,1778,12439,5332,12439,1778,5332,8886,5332,12439,1778,8886,1778,12439,5332,5332,5332,1778,1778,5332,1778,1778,8886,19547,8886,15993,12439,19547,12439,15993,8886,23101,8886,26655,12439,23101,12439,26655,5332,19547,5332,15993,1778,19547,1778,15993,5332,23101,5332,26655,1778,23101,1778,26655,19547,8886,19547,12439,15993,8886,15993,12439,19547,5332,19547,1778,15993,5332,15993,1778,23101,8886,23101,12439,26655,8886,26655,12439,23101,5332,23101,1778,26655,5332,26655,1778,19547,19547,19547,15993,15993,19547,15993,15993,19547,23101,19547,26655,15993,23101,15993,26655,23101,19547,23101,15993,26655,19547,26655,15993,23101,23101,23101,26655,26655,23101,26655,26655,8886,-8886,8886,-12439,12439,-8886,12439,-12439,8886,-5332,8886,-1778,12439,-5332,12439,-1778,5332,-8886,5332,-12439,1778,-8886,1778,-12439,5332,-5332,5332,-1778,1778,-5332,1778,-1778,8886,-19547,8886,-15993,12439,-19547,12439,-15993,8886,-23101,8886,-26655,12439,-23101,12439,-26655,5332,-19547,5332,-15993,1778,-19547,1778,-15993,5332,-23101,5332,-26655,1778,-23101,1778,-26655,19547,-8886,19547,-12439,15993,-8886,15993,-12439,19547,-5332,19547,-1778,15993,-5332,15993,-1778,23101,-8886,23101,-12439,26655,-8886,26655,-12439,23101,-5332,23101,-1778,26655,-5332,26655,-1778,19547,-19547,19547,-15993,15993,-19547,15993,-15993,19547,-23101,19547,-26655,15993,-23101,15993,-26655,23101,-19547,23101,-15993,26655,-19547,26655,-15993,23101,-23101,23101,-26655,26655,-23101,26655,-26655,-8886,8886,-8886,12439,-12439,8886,-12439,12439,-8886,5332,-8886,1778,-12439,5332,-12439,1778,-5332,8886,-5332,12439,-1778,8886,-1778,12439,-5332,5332,-5332,1778,-1778,5332,-1778,1778,-8886,19547,-8886,15993,-12439,19547,-12439,15993,-8886,23101,-8886,26655,-12439,23101,-12439,26655,-5332,19547,-5332,15993,-1778,19547,-1778,15993,-5332,23101,-5332,26655,-1778,23101,-1778,26655,-19547,8886,-19547,12439,-15993,8886,-15993,12439,-19547,5332,-19547,1778,-15993,5332,-15993,1778,-23101,8886,-23101,12439,-26655,8886,-26655,12439,-23101,5332,-23101,1778,-26655,5332,-26655,1778,-19547,19547,-19547,15993,-15993,19547,-15993,15993,-19547,23101,-19547,26655,-15993,23101,-15993,26655,-23101,19547,-23101,15993,-26655,19547,-26655,15993,-23101,23101,-23101,26655,-26655,23101,-26655,26655,-8886,-8886,-8886,-12439,-12439,-8886,-12439,-12439,-8886,-5332,-8886,-1778,-12439,-5332,-12439,-1778,-5332,-8886,-5332,-12439,-1778,-8886,-1778,-12439,-5332,-5332,-5332,-1778,-1778,-5332,-1778,-1778,-8886,-19547,-8886,-15993,-12439,-19547,-12439,-15993,-8886,-23101,-8886,-26655,-12439,-23101,-12439,-26655,-5332,-19547,-5332,-15993,-1778,-19547,-1778,-15993,-5332,-23101,-5332,-26655,-1778,-23101,-1778,-26655,-19547,-8886,-19547,-12439,-15993,-8886,-15993,-12439,-19547,-5332,-19547,-1778,-15993,-5332,-15993,-1778,-23101,-8886,-23101,-12439,-26655,-8886,-26655,-12439,-23101,-5332,-23101,-1778,-26655,-5332,-26655,-1778,-19547,-19547,-19547,-15993,-15993,-19547,-15993,-15993,-19547,-23101,-19547,-26655,-15993,-23101,-15993,-26655,-23101,-19547,-23101,-15993,-26655,-19547,-26655,-15993,-23101,-23101,-23101,-26655,-26655,-23101,-26655,-26655}; - -static inline int ocp_rxtx(PHY_VARS_gNB *gNB, gNB_L1_rxtx_proc_t *proc) { - nfapi_nr_config_request_scf_t *cfg = &gNB->gNB_config; - start_meas(&softmodem_stats_rxtx_sf); - - // ******************************************************************* - - if (nfapi_mode == NFAPI_MODE_PNF) { - // I am a PNF and I need to let nFAPI know that we have a (sub)frame tick - //add_subframe(&frame, &subframe, 4); - //oai_subframe_ind(proc->frame_tx, proc->subframe_tx); - //LOG_D(PHY, "oai_subframe_ind(frame:%u, subframe:%d) - NOT CALLED ********\n", frame, subframe); - start_meas(&nfapi_meas); - oai_subframe_ind(proc->frame_rx, proc->slot_rx); - stop_meas(&nfapi_meas); - /*if (gNB->UL_INFO.rx_ind.rx_indication_body.number_of_pdus|| - gNB->UL_INFO.harq_ind.harq_indication_body.number_of_harqs || - gNB->UL_INFO.crc_ind.crc_indication_body.number_of_crcs || - gNB->UL_INFO.rach_ind.rach_indication_body.number_of_preambles || - gNB->UL_INFO.cqi_ind.number_of_cqis - ) { - LOG_D(PHY, "UL_info[rx_ind:%05d:%d harqs:%05d:%d crcs:%05d:%d preambles:%05d:%d cqis:%d] RX:%04d%d TX:%04d%d \n", - NFAPI_SFNSF2DEC(gNB->UL_INFO.rx_ind.sfn_sf), gNB->UL_INFO.rx_ind.rx_indication_body.number_of_pdus, - NFAPI_SFNSF2DEC(gNB->UL_INFO.harq_ind.sfn_sf), gNB->UL_INFO.harq_ind.harq_indication_body.number_of_harqs, - NFAPI_SFNSF2DEC(gNB->UL_INFO.crc_ind.sfn_sf), gNB->UL_INFO.crc_ind.crc_indication_body.number_of_crcs, - NFAPI_SFNSF2DEC(gNB->UL_INFO.rach_ind.sfn_sf), gNB->UL_INFO.rach_ind.rach_indication_body.number_of_preambles, - gNB->UL_INFO.cqi_ind.number_of_cqis, - frame_rx, slot_rx, - frame_tx, slot_tx); - }*/ - } - - /// NR disabling - // **************************************** - // Common RX procedures subframe n - pthread_mutex_lock(&gNB->UL_INFO_mutex); - gNB->UL_INFO.frame = proc->frame_rx; - gNB->UL_INFO.slot = proc->slot_rx; - gNB->UL_INFO.module_id = gNB->Mod_id; - gNB->UL_INFO.CC_id = gNB->CC_id; - gNB->if_inst->NR_UL_indication(&gNB->UL_INFO); - pthread_mutex_unlock(&gNB->UL_INFO_mutex); - // RX processing - int tx_slot_type = nr_slot_select(cfg,proc->frame_tx,proc->slot_tx); - int rx_slot_type = nr_slot_select(cfg,proc->frame_rx,proc->slot_rx); - - if (rx_slot_type == NR_UPLINK_SLOT || rx_slot_type == NR_MIXED_SLOT) { - // Do PRACH RU processing - L1_nr_prach_procedures(gNB,proc->frame_rx,proc->slot_rx); - phy_procedures_gNB_uespec_RX(gNB, proc->frame_rx, proc->slot_rx); - } - - if (oai_exit) return(-1); - - // ***************************************** - // TX processing for subframe n+sf_ahead - // run PHY TX procedures the one after the other for all CCs to avoid race conditions - // (may be relaxed in the future for performance reasons) - // ***************************************** - - if (tx_slot_type == NR_DOWNLINK_SLOT || tx_slot_type == NR_MIXED_SLOT) { - phy_procedures_gNB_TX(gNB, proc->frame_tx,proc->slot_tx, 1); - } - - stop_meas( &softmodem_stats_rxtx_sf ); - LOG_D(PHY,"%s() Exit proc[rx:%d%d tx:%d%d]\n", __FUNCTION__, proc->frame_rx, proc->slot_rx, proc->frame_tx, proc->slot_tx); - return(0); -} - - -static void *process_stats_thread(void *param) { - PHY_VARS_gNB *gNB = (PHY_VARS_gNB *)param; - reset_meas(&gNB->dlsch_encoding_stats); - reset_meas(&gNB->dlsch_scrambling_stats); - reset_meas(&gNB->dlsch_modulation_stats); - - while(!oai_exit) { - sleep(1); - print_meas(&gNB->dlsch_encoding_stats, "pdsch_encoding", NULL, NULL); - print_meas(&gNB->dlsch_scrambling_stats, "pdsch_scrambling", NULL, NULL); - print_meas(&gNB->dlsch_modulation_stats, "pdsch_modulation", NULL, NULL); - } - - return(NULL); -} - -void init_gNB_proc(int inst) { - PHY_VARS_gNB *gNB = RC.gNB[inst]; - gNB_L1_proc_t *proc = &gNB->proc; - gNB_L1_rxtx_proc_t *L1_proc = &proc->L1_proc; - gNB_L1_rxtx_proc_t *L1_proc_tx = &proc->L1_proc_tx; - L1_proc->instance_cnt = -1; - L1_proc_tx->instance_cnt = -1; - L1_proc->instance_cnt_RUs = 0; - L1_proc_tx->instance_cnt_RUs = 0; - proc->instance_cnt_prach = -1; - proc->instance_cnt_asynch_rxtx = -1; - proc->CC_id = 0; - proc->first_rx =1; - proc->first_tx =1; - proc->RU_mask =0; - proc->RU_mask_tx = (1<num_RU)-1; - proc->RU_mask_prach =0; - pthread_mutex_init( &gNB->UL_INFO_mutex, NULL); - gNB->threadPool = (tpool_t *)malloc(sizeof(tpool_t)); - gNB->respDecode = (notifiedFIFO_t *) malloc(sizeof(notifiedFIFO_t)); - char ul_pool[] = "-1,-1"; - initTpool(ul_pool, gNB->threadPool, false); - initNotifiedFIFO(gNB->respDecode); -} - -/// eNB kept in function name for nffapi calls, TO FIX -void init_gNB_phase2(RU_t *ru) { - int inst; - LOG_I(PHY,"%s() RC.nb_nr_inst:%d\n", __FUNCTION__, RC.nb_nr_inst); - - for (inst=0; instnum_RU:%d\n", gNB->num_RU); - phy_init_nr_gNB(gNB,0,0); - RC.gNB[inst]->num_RU=1; - RC.gNB[inst]->RU_list[0]=ru; - //init_precoding_weights(RC.gNB[inst][CC_id]); - } -} - -void init_gNB(int single_thread_flag,int wait_for_sync) { - for (int inst=0; instRCconfig_NR_L1\n"); - PHY_VARS_gNB *gNB= RC.gNB[inst]; - gNB->abstraction_flag = false; - gNB->single_thread_flag = true; - /*nr_polar_init(&gNB->nrPolar_params, - NR_POLAR_PBCH_MESSAGE_TYPE, - NR_POLAR_PBCH_PAYLOAD_BITS, - NR_POLAR_PBCH_AGGREGATION_LEVEL);*/ - LOG_I(PHY,"Registering with MAC interface module\n"); - AssertFatal((gNB->if_inst = NR_IF_Module_init(inst))!=NULL,"Cannot register interface"); - gNB->if_inst->NR_Schedule_response = nr_schedule_response; - gNB->if_inst->NR_PHY_config_req = nr_phy_config_request; - memset((void *)&gNB->UL_INFO,0,sizeof(gNB->UL_INFO)); - memset((void *)&gNB->UL_tti_req,0,sizeof(nfapi_nr_ul_tti_request_t)); - //memset((void *)&gNB->Sched_INFO,0,sizeof(gNB->Sched_INFO)); - LOG_I(PHY,"Setting indication lists\n"); - gNB->UL_INFO.rx_ind.pdu_list = gNB->rx_pdu_list; - gNB->UL_INFO.crc_ind.crc_list = gNB->crc_pdu_list; - /*gNB->UL_INFO.sr_ind.sr_indication_body.sr_pdu_list = gNB->sr_pdu_list; - gNB->UL_INFO.harq_ind.harq_indication_body.harq_pdu_list = gNB->harq_pdu_list; - gNB->UL_INFO.cqi_ind.cqi_pdu_list = gNB->cqi_pdu_list; - gNB->UL_INFO.cqi_ind.cqi_raw_pdu_list = gNB->cqi_raw_pdu_list;*/ - gNB->prach_energy_counter = 0; - } - - LOG_I(PHY,"[nr-softmodem.c] gNB structure allocated\n"); -} - - -void stop_gNB(int nb_inst) { -} - -static void get_options(void) { - paramdef_t cmdline_params[] = CMDLINE_PARAMS_DESC_GNB ; - config_process_cmdline( cmdline_params,sizeof(cmdline_params)/sizeof(paramdef_t),NULL); - - if ( !(CONFIG_ISFLAGSET(CONFIG_ABORT)) ) { - memset((void *)&RC,0,sizeof(RC)); - /* Read RC configuration file */ - NRRCConfig(); - printf("Configuration: nb_rrc_inst %d, nb_nr_L1_inst %d, nb_ru %hhd\n", RC.nb_nr_inst,RC.nb_nr_L1_inst,RC.nb_RU); - } - - AssertFatal(RC.nb_nr_L1_inst == 1 && RC.nb_RU == 1, "Only one gNB, one RU and one carrier is supported\n"); -} - -void set_default_frame_parms(nfapi_nr_config_request_t *config[MAX_NUM_CCs], - NR_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs]) { - for (int CC_id=0; CC_idsubframe_config.numerology_index_mu.value =1; - config[CC_id]->subframe_config.duplex_mode.value = 1; //FDD - config[CC_id]->subframe_config.dl_cyclic_prefix_type.value = 0; //NORMAL - config[CC_id]->rf_config.dl_carrier_bandwidth.value = 106; - config[CC_id]->rf_config.ul_carrier_bandwidth.value = 106; - config[CC_id]->sch_config.physical_cell_id.value = 0; - } -} - -static void init_pdcp(void) { - //if (!NODE_IS_DU(RC.rrc[0]->node_type)) { - pdcp_layer_init(); - uint32_t pdcp_initmask = (IS_SOFTMODEM_NOS1) ? - (PDCP_USE_NETLINK_BIT | LINK_ENB_PDCP_TO_IP_DRIVER_BIT) : LINK_ENB_PDCP_TO_GTPV1U_BIT; - - if (IS_SOFTMODEM_NOS1) { - printf("IS_SOFTMODEM_NOS1 option enabled \n"); - pdcp_initmask = pdcp_initmask | ENB_NAS_USE_TUN_BIT | SOFTMODEM_NOKRNMOD_BIT ; - } - - nr_pdcp_module_init(pdcp_initmask, 0); - pdcp_set_rlc_data_req_func(rlc_data_req); - pdcp_set_pdcp_data_ind_func(pdcp_data_ind); -} - -void init_main_gNB(void) { - RCconfig_NR_L1(); - RCconfig_nr_macrlc(); - - if (RC.nb_nr_L1_inst>0) - AssertFatal(l1_north_init_gNB()==0,"could not initialize L1 north interface\n"); - - LOG_I(GNB_APP,"Allocating gNB_RRC_INST for %d instances\n",RC.nb_nr_inst); - RC.nrrrc = (gNB_RRC_INST **)calloc(RC.nb_nr_inst*sizeof(gNB_RRC_INST *),1); - LOG_I(PHY, "%s() RC.nb_nr_inst:%d RC.nrrrc:%p\n", __FUNCTION__, RC.nb_nr_inst, RC.nrrrc); - int gnb_id=0; // only 1 gnb per process, index 0 for now - RC.nrrrc[gnb_id] = (gNB_RRC_INST *)calloc(sizeof(gNB_RRC_INST),1); - MessageDef *msg_p = itti_alloc_new_message (TASK_GNB_APP, 0, NRRRC_CONFIGURATION_REQ); - RCconfig_NRRRC(msg_p,gnb_id, RC.nrrrc[gnb_id]); - openair_rrc_gNB_configuration(GNB_INSTANCE_TO_MODULE_ID(ITTI_MSG_DESTINATION_INSTANCE(msg_p)), &NRRRC_CONFIGURATION_REQ(msg_p)); - //AssertFatal(itti_create_task(TASK_GNB_APP, gNB_app_task, NULL) >= 0, ""); - AssertFatal(itti_create_task(TASK_RRC_GNB, rrc_gnb_task, NULL) >= 0, ""); - //AssertFatal(itti_create_task(TASK_X2AP, x2ap_task, NULL) >= 0, ""); -} - -static void wait_nfapi_init(char *thread_name) { - printf( "waiting for NFAPI PNF connection and population of global structure (%s)\n",thread_name); - pthread_mutex_lock( &nfapi_sync_mutex ); - - while (nfapi_sync_var<0) - pthread_cond_wait( &nfapi_sync_cond, &nfapi_sync_mutex ); - - pthread_mutex_unlock(&nfapi_sync_mutex); - printf( "NFAPI: got sync (%s)\n", thread_name); -} - -void exit_function(const char *file, const char *function, const int line, const char *s) { - if (s != NULL) { - printf("%s:%d %s() Exiting OAI softmodem: %s\n",file,line, function, s); - } - - oai_exit = 1; - sleep(1); //allow lte-softmodem threads to exit first - exit(1); -} - -void stop_RU(int nb_ru) { - return; -} - -void OCPconfig_RU(RU_t *ru) { - int i = 0, j = 0; // Ru and gNB cardinality - paramdef_t RUParams[] = RUPARAMS_DESC; - paramlist_def_t RUParamList = {CONFIG_STRING_RU_LIST,NULL,0}; - config_getlist( &RUParamList, RUParams, sizeof(RUParams)/sizeof(paramdef_t), NULL); - AssertFatal( RUParamList.numelt == 1 && RC.nb_nr_L1_inst ==1,"" ); - ru->idx=0; - ru->nr_frame_parms = (NR_DL_FRAME_PARMS *)calloc(sizeof(NR_DL_FRAME_PARMS),1); - ru->frame_parms = (LTE_DL_FRAME_PARMS *)calloc(sizeof(LTE_DL_FRAME_PARMS),1); - ru->if_timing = synch_to_ext_device; - ru->num_gNB = RUParamList.paramarray[j][RU_ENB_LIST_IDX].numelt; - ru->gNB_list[i] = &RC.gNB[RUParamList.paramarray[j][RU_ENB_LIST_IDX].iptr[i]][0]; - - if (config_isparamset(RUParamList.paramarray[j], RU_SDR_ADDRS)) { - ru->openair0_cfg.sdr_addrs = strdup(*(RUParamList.paramarray[j][RU_SDR_ADDRS].strptr)); - } - - if (config_isparamset(RUParamList.paramarray[j], RU_SDR_CLK_SRC)) { - if (strcmp(*(RUParamList.paramarray[j][RU_SDR_CLK_SRC].strptr), "internal") == 0) { - ru->openair0_cfg.clock_source = internal; - LOG_D(PHY, "RU clock source set as internal\n"); - } else if (strcmp(*(RUParamList.paramarray[j][RU_SDR_CLK_SRC].strptr), "external") == 0) { - ru->openair0_cfg.clock_source = external; - LOG_D(PHY, "RU clock source set as external\n"); - } else if (strcmp(*(RUParamList.paramarray[j][RU_SDR_CLK_SRC].strptr), "gpsdo") == 0) { - ru->openair0_cfg.clock_source = gpsdo; - LOG_D(PHY, "RU clock source set as gpsdo\n"); - } else { - LOG_E(PHY, "Erroneous RU clock source in the provided configuration file: '%s'\n", *(RUParamList.paramarray[j][RU_SDR_CLK_SRC].strptr)); - } - } else { - ru->openair0_cfg.clock_source = unset; - } - - if (strcmp(*(RUParamList.paramarray[j][RU_LOCAL_RF_IDX].strptr), "yes") == 0) { - if ( !(config_isparamset(RUParamList.paramarray[j],RU_LOCAL_IF_NAME_IDX)) ) { - ru->if_south = REMOTE_IF5; //TBD: max value to avoid to call "ru" functions - ru->function = gNodeB_3GPP; - printf("Setting function for RU %d to gNodeB_3GPP\n",j); - } else { - } - - ru->max_pdschReferenceSignalPower = *(RUParamList.paramarray[j][RU_MAX_RS_EPRE_IDX].uptr);; - ru->max_rxgain = *(RUParamList.paramarray[j][RU_MAX_RXGAIN_IDX].uptr); - ru->num_bands = RUParamList.paramarray[j][RU_BAND_LIST_IDX].numelt; - - for (i=0; inum_bands; i++) ru->band[i] = RUParamList.paramarray[j][RU_BAND_LIST_IDX].iptr[i]; - } //strcmp(local_rf, "yes") == 0 - else { - } - - ru->nb_tx = *(RUParamList.paramarray[j][RU_NB_TX_IDX].uptr); - ru->nb_rx = *(RUParamList.paramarray[j][RU_NB_RX_IDX].uptr); - ru->att_tx = *(RUParamList.paramarray[j][RU_ATT_TX_IDX].uptr); - ru->att_rx = *(RUParamList.paramarray[j][RU_ATT_RX_IDX].uptr); - - if (config_isparamset(RUParamList.paramarray[j], RU_BF_WEIGHTS_LIST_IDX)) { - ru->nb_bfw = RUParamList.paramarray[j][RU_BF_WEIGHTS_LIST_IDX].numelt; - - for (i=0; inum_gNB; i++) { - ru->bw_list[i] = (int32_t *)malloc16_clear((ru->nb_bfw)*sizeof(int32_t)); - - for (int b=0; bnb_bfw; b++) ru->bw_list[i][b] = RUParamList.paramarray[j][RU_BF_WEIGHTS_LIST_IDX].iptr[b]; - } - } - - return; -} - -// this is for RU with local RF unit -void fill_rf_config(RU_t *ru, char *rf_config_file) { - int i; - NR_DL_FRAME_PARMS *fp = ru->nr_frame_parms; - nfapi_nr_config_request_scf_t *gNB_config = &ru->gNB_list[0]->gNB_config; //tmp index - openair0_config_t *cfg = &ru->openair0_cfg; - int mu = gNB_config->ssb_config.scs_common.value; - int N_RB = gNB_config->carrier_config.dl_grid_size[gNB_config->ssb_config.scs_common.value].value; - fp->threequarter_fs=threequarter_fs; - - if (mu == NR_MU_0) { //or if LTE - if(N_RB == 100) { - if (fp->threequarter_fs) { - cfg->sample_rate=23.04e6; - cfg->samples_per_frame = 230400; - cfg->tx_bw = 10e6; - cfg->rx_bw = 10e6; - } else { - cfg->sample_rate=30.72e6; - cfg->samples_per_frame = 307200; - cfg->tx_bw = 10e6; - cfg->rx_bw = 10e6; - } - } else if(N_RB == 50) { - cfg->sample_rate=15.36e6; - cfg->samples_per_frame = 153600; - cfg->tx_bw = 5e6; - cfg->rx_bw = 5e6; - } else if (N_RB == 25) { - cfg->sample_rate=7.68e6; - cfg->samples_per_frame = 76800; - cfg->tx_bw = 2.5e6; - cfg->rx_bw = 2.5e6; - } else if (N_RB == 6) { - cfg->sample_rate=1.92e6; - cfg->samples_per_frame = 19200; - cfg->tx_bw = 1.5e6; - cfg->rx_bw = 1.5e6; - } else AssertFatal(1==0,"Unknown N_RB %d\n",N_RB); - } else if (mu == NR_MU_1) { - if(N_RB == 273) { - if (fp->threequarter_fs) { - AssertFatal(0 == 1,"three quarter sampling not supported for N_RB 273\n"); - } else { - cfg->sample_rate=122.88e6; - cfg->samples_per_frame = 1228800; - cfg->tx_bw = 100e6; - cfg->rx_bw = 100e6; - } - } else if(N_RB == 217) { - if (fp->threequarter_fs) { - cfg->sample_rate=92.16e6; - cfg->samples_per_frame = 921600; - cfg->tx_bw = 80e6; - cfg->rx_bw = 80e6; - } else { - cfg->sample_rate=122.88e6; - cfg->samples_per_frame = 1228800; - cfg->tx_bw = 80e6; - cfg->rx_bw = 80e6; - } - } else if(N_RB == 106) { - if (fp->threequarter_fs) { - cfg->sample_rate=46.08e6; - cfg->samples_per_frame = 460800; - cfg->tx_bw = 40e6; - cfg->rx_bw = 40e6; - } else { - cfg->sample_rate=61.44e6; - cfg->samples_per_frame = 614400; - cfg->tx_bw = 40e6; - cfg->rx_bw = 40e6; - } - } else { - AssertFatal(0==1,"N_RB %d not yet supported for numerology %d\n",N_RB,mu); - } - } else if (mu == NR_MU_3) { - if (N_RB == 66) { - cfg->sample_rate = 122.88e6; - cfg->samples_per_frame = 1228800; - cfg->tx_bw = 100e6; - cfg->rx_bw = 100e6; - } else if(N_RB == 32) { - cfg->sample_rate=61.44e6; - cfg->samples_per_frame = 614400; - cfg->tx_bw = 50e6; - cfg->rx_bw = 50e6; - } - } else { - AssertFatal(0 == 1,"Numerology %d not supported for the moment\n",mu); - } - - if (gNB_config->cell_config.frame_duplex_type.value==TDD) - cfg->duplex_mode = duplex_mode_TDD; - else //FDD - cfg->duplex_mode = duplex_mode_FDD; - - cfg->Mod_id = 0; - cfg->num_rb_dl=N_RB; - cfg->tx_num_channels=ru->nb_tx; - cfg->rx_num_channels=ru->nb_rx; - - for (i=0; inb_tx; i++) { - if (ru->if_frequency == 0) { - cfg->tx_freq[i] = (double)fp->dl_CarrierFreq; - cfg->rx_freq[i] = (double)fp->ul_CarrierFreq; - } else { - cfg->tx_freq[i] = (double)ru->if_frequency; - cfg->rx_freq[i] = (double)(ru->if_frequency+fp->ul_CarrierFreq-fp->dl_CarrierFreq); - } - - cfg->tx_gain[i] = ru->att_tx; - cfg->rx_gain[i] = ru->max_rxgain-ru->att_rx; - cfg->configFilename = rf_config_file; - printf("channel %d, Setting tx_gain offset %f, rx_gain offset %f, tx_freq %f, rx_freq %f\n", - i, cfg->tx_gain[i], - cfg->rx_gain[i], - cfg->tx_freq[i], - cfg->rx_freq[i]); - } -} - -/* this function maps the RU tx and rx buffers to the available rf chains. - Each rf chain is is addressed by the card number and the chain on the card. The - rf_map specifies for each antenna port, on which rf chain the mapping should start. Multiple - antennas are mapped to successive RF chains on the same card. */ -int setup_RU_buffers(RU_t *ru) { - int i,j; - int card,ant; - //uint16_t N_TA_offset = 0; - NR_DL_FRAME_PARMS *frame_parms; - nfapi_nr_config_request_scf_t *config = &ru->config; - - if (ru) { - frame_parms = ru->nr_frame_parms; - printf("setup_RU_buffers: frame_parms = %p\n",frame_parms); - } else { - printf("ru pointer is NULL\n"); - return(-1); - } - - int mu = config->ssb_config.scs_common.value; - int N_RB = config->carrier_config.dl_grid_size[config->ssb_config.scs_common.value].value; - - if (config->cell_config.frame_duplex_type.value == TDD) { - int N_TA_offset = config->carrier_config.uplink_frequency.value < 6000000 ? 400 : 431; // reference samples for 25600Tc @ 30.72 Ms/s for FR1, same @ 61.44 Ms/s for FR2 - double factor=1; - - switch (mu) { - case 0: //15 kHz scs - AssertFatal(N_TA_offset == 400,"scs_common 15kHz only for FR1\n"); - - if (N_RB <= 25) factor = .25; // 7.68 Ms/s - else if (N_RB <=50) factor = .5; // 15.36 Ms/s - else if (N_RB <=75) factor = 1.0; // 30.72 Ms/s - else if (N_RB <=100) factor = 1.0; // 30.72 Ms/s - else AssertFatal(1==0,"Too many PRBS for mu=0\n"); - - break; - - case 1: //30 kHz sc - AssertFatal(N_TA_offset == 400,"scs_common 30kHz only for FR1\n"); - - if (N_RB <= 106) factor = 2.0; // 61.44 Ms/s - else if (N_RB <= 275) factor = 4.0; // 122.88 Ms/s - - break; - - case 2: //60 kHz scs - AssertFatal(1==0,"scs_common should not be 60 kHz\n"); - break; - - case 3: //120 kHz scs - AssertFatal(N_TA_offset == 431,"scs_common 120kHz only for FR2\n"); - break; - - case 4: //240 kHz scs - AssertFatal(1==0,"scs_common should not be 60 kHz\n"); - - if (N_RB <= 32) factor = 1.0; // 61.44 Ms/s - else if (N_RB <= 66) factor = 2.0; // 122.88 Ms/s - else AssertFatal(1==0,"N_RB %d is too big for curretn FR2 implementation\n",N_RB); - - break; - - if (N_RB == 100) ru->N_TA_offset = 624; - else if (N_RB == 50) ru->N_TA_offset = 624/2; - else if (N_RB == 25) ru->N_TA_offset = 624/4; - } - - if (frame_parms->threequarter_fs == 1) factor = factor*.75; - - ru->N_TA_offset = (int)(N_TA_offset * factor); - LOG_I(PHY,"RU %d Setting N_TA_offset to %d samples (factor %f, UL Freq %d, N_RB %d)\n",ru->idx,ru->N_TA_offset,factor, - config->carrier_config.uplink_frequency.value, N_RB); - } else ru->N_TA_offset = 0; - - if (ru->openair0_cfg.mmapped_dma == 1) { - // replace RX signal buffers with mmaped HW versions - for (i=0; inb_rx; i++) { - card = i/4; - ant = i%4; - printf("Mapping RU id %u, rx_ant %d, on card %d, chain %d\n",ru->idx,i,ru->rf_map.card+card, ru->rf_map.chain+ant); - free(ru->common.rxdata[i]); - ru->common.rxdata[i] = ru->openair0_cfg.rxbase[ru->rf_map.chain+ant]; - printf("rxdata[%d] @ %p\n",i,ru->common.rxdata[i]); - - for (j=0; j<16; j++) { - printf("rxbuffer %d: %x\n",j,ru->common.rxdata[i][j]); - ru->common.rxdata[i][j] = 16-j; - } - } - - for (i=0; inb_tx; i++) { - card = i/4; - ant = i%4; - printf("Mapping RU id %u, tx_ant %d, on card %d, chain %d\n",ru->idx,i,ru->rf_map.card+card, ru->rf_map.chain+ant); - free(ru->common.txdata[i]); - ru->common.txdata[i] = ru->openair0_cfg.txbase[ru->rf_map.chain+ant]; - printf("txdata[%d] @ %p\n",i,ru->common.txdata[i]); - - for (j=0; j<16; j++) { - printf("txbuffer %d: %x\n",j,ru->common.txdata[i][j]); - ru->common.txdata[i][j] = 16-j; - } - } - } else { // not memory-mapped DMA - //nothing to do, everything already allocated in lte_init - } - - return(0); -} -int rx_rf(int rxBufOffet, int nbSamples, int nb_rx, int32_t **rxdata, openair0_device *rfdevice, openair0_timestamp *HWtimeStamp) { - void *rxp[nb_rx]; - - for (int i=0; itrx_read_func(rfdevice, - HWtimeStamp, - rxp, - nbSamples, - nb_rx); - - if (rxs != nbSamples ) - LOG_E(PHY, "rx_rf: Asked for %d samples, got %d from USRP\n",nbSamples,rxs); - - return rxs; -} - -void tx_rf(RU_t *ru,int frame,int slot, uint64_t timestamp) { - RU_proc_t *proc = &ru->proc; - NR_DL_FRAME_PARMS *fp = ru->nr_frame_parms; - nfapi_nr_config_request_scf_t *cfg = &ru->gNB_list[0]->gNB_config; - int i,txsymb; - int slot_type = nr_slot_select(cfg,frame,slot%fp->slots_per_frame); - int prevslot_type = nr_slot_select(cfg,frame,(slot+(fp->slots_per_frame-1))%fp->slots_per_frame); - int nextslot_type = nr_slot_select(cfg,frame,(slot+1)%fp->slots_per_frame); - int sf_extension = 0; //sf_extension = ru->sf_extension; - int siglen=fp->get_samples_per_slot(slot,fp); - int flags=1; - - //nr_subframe_t SF_type = nr_slot_select(cfg,slot%fp->slots_per_frame); - if (slot_type == NR_DOWNLINK_SLOT || slot_type == NR_MIXED_SLOT || IS_SOFTMODEM_RFSIM) { - if(slot_type == NR_MIXED_SLOT) { - txsymb = 0; - - for(int symbol_count =0; symbol_counttdd_table.max_tdd_periodicity_list[slot].max_num_of_symbol_per_slot_list[symbol_count].slot_config.value==0) - txsymb++; - } - - AssertFatal(txsymb>0,"illegal txsymb %d\n",txsymb); - - if(slot%(fp->slots_per_subframe/2)) - siglen = txsymb * (fp->ofdm_symbol_size + fp->nb_prefix_samples); - else - siglen = (fp->ofdm_symbol_size + fp->nb_prefix_samples0) + (txsymb - 1) * (fp->ofdm_symbol_size + fp->nb_prefix_samples); - - //+ ru->end_of_burst_delay; - flags=3; // end of burst - } - - if (cfg->cell_config.frame_duplex_type.value == TDD && - slot_type == NR_DOWNLINK_SLOT && - prevslot_type == NR_UPLINK_SLOT) { - flags = 2; // start of burst - } - - if (cfg->cell_config.frame_duplex_type.value == TDD && - slot_type == NR_DOWNLINK_SLOT && - nextslot_type == NR_UPLINK_SLOT) { - flags = 3; // end of burst - } - - if (fp->freq_range==nr_FR2) { - // the beam index is written in bits 8-10 of the flags - // bit 11 enables the gpio programming - int beam=0; - - if (slot==0) beam = 11; //3 for boresight & 8 to enable - - /* - if (slot==0 || slot==40) beam=0&8; - if (slot==10 || slot==50) beam=1&8; - if (slot==20 || slot==60) beam=2&8; - if (slot==30 || slot==70) beam=3&8; - */ - flags |= beam<<8; - } - - void *txp[ru->nb_tx]; - - for (i=0; inb_tx; i++) - txp[i] = (void *)&ru->common.txdata[i][fp->get_samples_slot_timestamp(slot,fp,0)-sf_extension]; - - // prepare tx buffer pointers - unsigned int txs = ru->rfdevice.trx_write_func(&ru->rfdevice, - timestamp+ru->ts_offset-ru->openair0_cfg.tx_sample_advance-sf_extension, - txp, - siglen+sf_extension, - ru->nb_tx, - flags); - LOG_D(PHY,"[TXPATH] RU %d tx_rf, writing to TS %llu, frame %d, unwrapped_frame %d, slot %d\n",ru->idx, - (long long unsigned int)timestamp,frame,proc->frame_tx_unwrap,slot); - AssertFatal(txs == siglen+sf_extension,"TX : Timeout (sent %u/%d)\n", txs, siglen); - } -} - -static void *ru_thread( void *param ) { - RU_t *ru = (RU_t *)param; - NR_DL_FRAME_PARMS *fp = ru->nr_frame_parms; - LOG_I(PHY,"Starting RU %d (%s,%s),\n",ru->idx,NB_functions[ru->function],NB_timing[ru->if_timing]); - nr_dump_frame_parms(fp); - AssertFatal(openair0_device_load(&ru->rfdevice,&ru->openair0_cfg)==0,"Cannot connect to local radio\n"); - AssertFatal(ru->rfdevice.trx_start_func(&ru->rfdevice) == 0,"Could not start the RF device\n"); - int64_t slot=-1; - int64_t nextHWTSshouldBe=0, nextRxTSlogical=0; - // weird globals, used in NR_IF_Module.c - sf_ahead = (uint16_t) ceil((float)6/(0x01<numerology_index)); - sl_ahead = sf_ahead*fp->slots_per_subframe; - - // This is a forever while loop, it loops over subframes which are scheduled by incoming samples from HW devices - - while (!oai_exit) { - int nextSlot=(slot+1)%fp->slots_per_frame; - uint32_t samples_per_slot = fp->get_samples_per_slot(nextSlot,fp); - int rxBuffOffset=fp->get_samples_slot_timestamp(nextSlot,fp,0); - AssertFatal(rxBuffOffset + samples_per_slot <= fp->samples_per_frame, "Will read outside allocated buffer\n"); - int samples=fp->get_samples_per_slot(nextSlot,fp); - openair0_timestamp HWtimeStamp=0; //for multi RU - int rxs=rx_rf(rxBuffOffset, - samples, - ru->nb_rx, - ru->common.rxdata, - &ru->rfdevice, - &HWtimeStamp); - LOG_D(PHY,"Reading %d samples for slot %d\n",samples_per_slot,nextSlot); - - if ( HWtimeStamp != nextHWTSshouldBe) - LOG_E(HW,"reading a stream must be continuous, %ld, %ld\n", HWtimeStamp, nextHWTSshouldBe); - - nextHWTSshouldBe=HWtimeStamp+rxs; - ru->proc.timestamp_rx=nextRxTSlogical; - nextRxTSlogical+=samples_per_slot; - int64_t HW_to_logical_RxTSoffset=(int64_t)HWtimeStamp-(int64_t)ru->proc.timestamp_rx; - ru->proc.frame_rx = (ru->proc.timestamp_rx / (fp->samples_per_subframe*10))&1023; - uint32_t idx_sf = ru->proc.timestamp_rx / fp->samples_per_subframe; - float offsetInSubframe=ru->proc.timestamp_rx % fp->samples_per_subframe; - ru->proc.tti_rx = (idx_sf * fp->slots_per_subframe + - lroundf(offsetInSubframe / fp->samples_per_slot0))% - fp->slots_per_frame; - LOG_D(PHY,"RU %d/%d TS %llu (off %d), frame %d, slot %d.%d / %d\n", - ru->idx, 0, - (unsigned long long int)ru->proc.timestamp_rx, - (int)ru->ts_offset,ru->proc.frame_rx,ru->proc.tti_rx,ru->proc.tti_tx,fp->slots_per_frame); - int slot_type = nr_slot_select(&ru->gNB_list[0]->gNB_config,ru->proc.frame_rx,ru->proc.tti_rx); - - if (slot_type == NR_UPLINK_SLOT || slot_type == NR_MIXED_SLOT) { - nr_fep_full(ru,ru->proc.tti_rx); - - for (int aa=0; aanb_rx; aa++) - memcpy((void *)RC.gNB[0]->common_vars.rxdataF[aa], - (void *)ru->common.rxdataF[aa], fp->symbols_per_slot*fp->ofdm_symbol_size*sizeof(int32_t)); - - LOG_D(PHY, "rxdataF energy: %d\n", signal_energy(ru->common.rxdataF[0], fp->symbols_per_slot*fp->ofdm_symbol_size)); - } - - gNB_L1_proc_t *gNBproc=&RC.gNB[0][0].proc; - gNB_L1_rxtx_proc_t *L1_proc = &gNBproc->L1_proc; - NR_DL_FRAME_PARMS *fp = ru->nr_frame_parms; - gNBproc->timestamp_rx = ru->proc.timestamp_rx; - L1_proc->frame_rx = gNBproc->frame_rx = gNBproc->frame_prach = ru->proc.frame_rx = - (ru->proc.timestamp_rx / (fp->samples_per_subframe*10))&1023; - L1_proc->slot_rx = gNBproc->slot_rx = gNBproc->slot_prach = - ru->proc.tti_rx; // computed before in caller function - L1_proc->timestamp_tx = gNBproc->timestamp_tx = ru->proc.timestamp_tx = - ru->proc.timestamp_rx + - sf_ahead*fp->samples_per_subframe; - L1_proc->frame_tx = gNBproc->frame_tx = ru->proc.frame_tx = - (gNBproc->timestamp_tx / (fp->samples_per_subframe*10))&1023; - L1_proc->slot_tx = ru->proc.tti_tx = - (L1_proc->slot_rx + sl_ahead)%fp->slots_per_frame; - - if (ocp_rxtx(&RC.gNB[0][0],L1_proc) < 0) - LOG_E(PHY,"gNB %d CC_id %d failed during execution\n",RC.gNB[0][0].Mod_id,RC.gNB[0][0].CC_id); - - // do TX front-end processing if needed (precoding and/or IDFTs) - //ru->feptx_prec(ru,proc->frame_tx,proc->tti_tx); - nr_feptx_prec(ru,ru->proc.frame_tx,ru->proc.tti_tx); - // do OFDM with/without TX front-end processing if needed - //ru->feptx_ofdm - nfapi_nr_config_request_scf_t *cfg = &ru->gNB_list[0]->gNB_config; - - if (nr_slot_select(cfg,ru->proc.frame_tx, ru->proc.tti_tx ) != NR_UPLINK_SLOT) { - int aa=0; // antenna 0 hardcoded - NR_DL_FRAME_PARMS *fp=ru->nr_frame_parms; - nr_feptx0(ru,ru->proc.tti_tx,0,fp->symbols_per_slot,aa); - int *txdata = &ru->common.txdata[aa][fp->get_samples_slot_timestamp(ru->proc.tti_tx,fp,0)]; - int slot_sizeF = (fp->ofdm_symbol_size)* - ((NFAPI_CP_NORMAL == 1) ? 12 : 14); - LOG_D(PHY,"feptx_ofdm (TXPATH): frame %d, slot %d: txp (time %ld) %d dB, txp (freq) %d dB\n", - ru->proc.frame_tx,ru->proc.tti_tx,ru->proc.timestamp_tx, - dB_fixed(signal_energy((int32_t *)txdata,fp->get_samples_per_slot(ru->proc.tti_tx,fp))), - dB_fixed(signal_energy_nodc(ru->common.txdataF_BF[aa],2*slot_sizeF))); - } - - // do outgoing fronthaul (south) if needed - tx_rf(ru,ru->proc.frame_tx,ru->proc.tti_tx,ru->proc.timestamp_tx+HW_to_logical_RxTSoffset); - slot++; - } - - printf( "Exiting ru_thread \n"); - ru->rfdevice.trx_end_func(&ru->rfdevice); - static int ru_thread_status = 0; - return &ru_thread_status; -} - -void launch_NR_RU(RU_t *ru, char *rf_config_file) { - LOG_I(PHY,"number of L1 instances %d, number of RU %d, number of CPU cores %d\n", - RC.nb_nr_L1_inst,RC.nb_RU,get_nprocs()); - LOG_D(PHY,"Process RUs RC.nb_RU:%d\n",RC.nb_RU); - - for (int ru_id=0; ru_idrf_config_file = rf_config_file; - ru->idx = ru_id; - ru->ts_offset = 0; - // use gNB_list[0] as a reference for RU frame parameters - // NOTE: multiple CC_id are not handled here yet! - LOG_D(PHY, "%s() RC.ru[%d].num_gNB:%d ru->gNB_list[0]:%p rf_config_file:%s\n", - __FUNCTION__, ru_id, ru->num_gNB, ru->gNB_list[0], ru->rf_config_file); - LOG_E(PHY,"ru->gNB_list ru->num_gNB hardcoded: one RU connected to carrier 0 of gNB 0\n"); - ru->gNB_list[0] = &RC.gNB[0][0]; - ru->num_gNB=1; - LOG_I(PHY,"Copying frame parms from gNB in RC to ru %d and frame_parms in ru\n",ru->idx); - RU_proc_t *proc = &ru->proc; - threadCreate( &proc->pthread_FH, ru_thread, (void *)ru, "MainLoop", -1, OAI_PRIORITY_RT_MAX ); - } -} - -void init_eNB_afterRU(void) { - AssertFatal(false,""); -} - -int main( int argc, char **argv ) { - AssertFatal(load_configmodule(argc,argv,CONFIG_ENABLECMDLINEONLY), - "[SOFTMODEM] Error, configuration module init failed\n"); - logInit(); -#ifndef PACKAGE_VERSION -# define PACKAGE_VERSION "UNKNOWN" -#endif - LOG_I(HW, "Version: %s\n", PACKAGE_VERSION); - set_latency_target(); - get_options (); - get_common_options(SOFTMODEM_GNB_BIT ); - AssertFatal(!CONFIG_ISFLAGSET(CONFIG_ABORT),"Getting configuration failed\n"); - cpuf=get_cpu_freq_GHz(); - itti_init(TASK_MAX, tasks_info); - set_taus_seed (0); - init_opt(); - init_pdcp(); - init_main_gNB(); - init_gNB(true, wait_for_sync); - /* Start the agent. If it is turned off in the configuration, it won't start */ - RCconfig_nr_flexran(); - - for (int i = 0; i < RC.nb_nr_L1_inst; i++) { - flexran_agent_start(i); - } - - /* - *nfapi stuff very buggy in 4G, not yet implemented in 5G - */ - // init UE_PF_PO and mutex lock (paging from S1AP) - pthread_mutex_init(&ue_pf_po_mutex, NULL); - printf("NFAPI*** - mutex and cond created - will block shortly for completion of PNF connection\n"); - pthread_cond_init(&nfapi_sync_cond,NULL); - pthread_mutex_init(&nfapi_sync_mutex, NULL); - const char *nfapi_mode_str[] = { - "MONOLITHIC", "PNF", "VNF", - }; - AssertFatal(nfapi_mode < 3,""); - printf("NFAPI MODE:%s\n", nfapi_mode_str[nfapi_mode]); - - if (nfapi_mode==NFAPI_MODE_VNF) // VNF - wait_nfapi_init("main?"); - - for (int i=0; iconfigured, "Remain threads to manage\n"); - - printf("About to Init RU threads RC.nb_RU:%d\n", RC.nb_RU); - config_sync_var=0; - - if (nfapi_mode==NFAPI_MODE_PNF) { // PNF - wait_nfapi_init("main?"); - } - - printf("wait RUs\n"); - printf("ALL RUs READY!\n"); - printf("RC.nb_RU:%d\n", RC.nb_RU); - // once all RUs are ready initialize the rest of the gNBs ((dependence on final RU parameters after configuration) - printf("ALL RUs ready - init gNBs\n"); - LOG_E(PHY,"configuring RU from file, hardcoded one gNB for one RU, one carrier\n"); - RU_t ru= {0}; - OCPconfig_RU(&ru); - ru.nr_frame_parms->threequarter_fs=threequarter_fs; - fill_rf_config(&ru,ru.rf_config_file); - init_gNB_phase2(&ru); - memcpy((void *)ru.nr_frame_parms,&RC.gNB[0][0].frame_parms,sizeof(NR_DL_FRAME_PARMS)); - memcpy((void *)&ru.config,(void *)&RC.gNB[0]->gNB_config,sizeof(ru.config)); - AssertFatal(setup_RU_buffers(&ru)==0,"Inconsistent configuration"); - nr_phy_init_RU(&ru); - init_gNB_proc(0); // only instance 0 (one gNB per process) - - if (RC.nb_RU >0) { - printf("Initializing RU threads\n"); - launch_NR_RU(&ru, get_softmodem_params()->rf_config_file); - } - - if (opp_enabled ==1) { - pthread_t t; - threadCreate(&t, process_stats_thread, - (void *)NULL, "time_meas", -1, OAI_PRIORITY_RT_LOW); - } - - if(IS_SOFTMODEM_DOSCOPE) { - scopeParms_t tmp= {&argc, argv, &ru, RC.gNB[0]}; - load_softscope("nr",&tmp); - } - - while(!oai_exit) - sleep(1); - - logClean(); - printf("Bye.\n"); - return 0; -} From 211b6feadf9e1ebc1ab38134ad2a96f3e9c7425b Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Fri, 25 Feb 2022 17:09:24 +0100 Subject: [PATCH 63/96] Use (portable) rdtsc_oai() in tpool --- .../utils/telnetsrv/telnetsrv_measurements.c | 1 + common/utils/threadPool/measurement_display.c | 4 +-- common/utils/threadPool/thread-pool.c | 4 +-- common/utils/threadPool/thread-pool.h | 30 ++++++++----------- common/utils/time_meas.c | 9 ++++++ common/utils/time_meas.h | 27 ++++++----------- 6 files changed, 35 insertions(+), 40 deletions(-) diff --git a/common/utils/telnetsrv/telnetsrv_measurements.c b/common/utils/telnetsrv/telnetsrv_measurements.c index 786cbd094c..2af76753b8 100644 --- a/common/utils/telnetsrv/telnetsrv_measurements.c +++ b/common/utils/telnetsrv/telnetsrv_measurements.c @@ -51,6 +51,7 @@ static char *grouptypes[] = {"ltestats","cpustats"}; static double cpufreq; +extern notifiedFIFO_t measur_fifo; #define TELNET_NUM_MEASURTYPES (sizeof(grouptypes)/sizeof(char *)) #define HDR "---------------------------------" diff --git a/common/utils/threadPool/measurement_display.c b/common/utils/threadPool/measurement_display.c index 0f5a3e0f69..cf2febaf33 100644 --- a/common/utils/threadPool/measurement_display.c +++ b/common/utils/threadPool/measurement_display.c @@ -43,9 +43,9 @@ int main(int argc, char *argv[]) { exit(1); } - uint64_t deb=rdtsc(); + uint64_t deb=rdtsc_oai(); usleep(100000); - cpuCyclesMicroSec=(rdtsc()-deb)/100000; + cpuCyclesMicroSec=(rdtsc_oai()-deb)/100000; printf("Cycles per µs: %lu\n",cpuCyclesMicroSec); printf("Key" SEP "delay to process" SEP "processing time" SEP "delay to be read answer\n"); notifiedFIFO_elt_t doneRequest; diff --git a/common/utils/threadPool/thread-pool.c b/common/utils/threadPool/thread-pool.c index fff09528a8..4a5485e89e 100644 --- a/common/utils/threadPool/thread-pool.c +++ b/common/utils/threadPool/thread-pool.c @@ -72,11 +72,11 @@ void *one_thread(void *arg) { do { notifiedFIFO_elt_t *elt=pullNotifiedFifoRemember(&tp->incomingFifo, myThread); - if (tp->measurePerf) elt->startProcessingTime=rdtsc(); + if (tp->measurePerf) elt->startProcessingTime=rdtsc_oai(); elt->processingFunc(NotifiedFifoData(elt)); - if (tp->measurePerf) elt->endProcessingTime=rdtsc(); + if (tp->measurePerf) elt->endProcessingTime=rdtsc_oai(); if (elt->reponseFifo) { // Check if the job is still alive, else it has been aborted diff --git a/common/utils/threadPool/thread-pool.h b/common/utils/threadPool/thread-pool.h index 7d2365fb52..da4e9cb04c 100644 --- a/common/utils/threadPool/thread-pool.h +++ b/common/utils/threadPool/thread-pool.h @@ -29,15 +29,9 @@ #include #include #include -#include -#include -//#include - -static __inline__ uint64_t rdtsc(void) { - uint32_t a, d; - __asm__ volatile ("rdtsc" : "=a" (a), "=d" (d)); - return (((uint64_t)d)<<32) | ((uint64_t)a); -} +#include "assertions.h" +#include "common/utils/time_meas.h" +#include "common/utils/system.h" #ifdef DEBUG #define THREADINIT PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP @@ -66,10 +60,10 @@ typedef struct notifiedFIFO_elt_s { struct notifiedFIFO_s *reponseFifo; void (*processingFunc)(void *); bool malloced; - uint64_t creationTime; - uint64_t startProcessingTime; - uint64_t endProcessingTime; - uint64_t returnTime; + OAI_CPUTIME_TYPE creationTime; + OAI_CPUTIME_TYPE startProcessingTime; + OAI_CPUTIME_TYPE endProcessingTime; + OAI_CPUTIME_TYPE returnTime; void *msgData; } notifiedFIFO_elt_t; @@ -225,18 +219,18 @@ typedef struct thread_pool { } tpool_t; static inline void pushTpool(tpool_t *t, notifiedFIFO_elt_t *msg) { - if (t->measurePerf) msg->creationTime=rdtsc(); + if (t->measurePerf) msg->creationTime=rdtsc_oai(); if ( t->activated) pushNotifiedFIFO(&t->incomingFifo, msg); else { if (t->measurePerf) - msg->startProcessingTime=rdtsc(); + msg->startProcessingTime=rdtsc_oai(); msg->processingFunc(NotifiedFifoData(msg)); if (t->measurePerf) - msg->endProcessingTime=rdtsc(); + msg->endProcessingTime=rdtsc_oai(); if (msg->reponseFifo) pushNotifiedFIFO(msg->reponseFifo, msg); @@ -247,7 +241,7 @@ static inline notifiedFIFO_elt_t *pullTpool(notifiedFIFO_t *responseFifo, tpool_ notifiedFIFO_elt_t *msg= pullNotifiedFIFO(responseFifo); AssertFatal(t->traceFd, "Thread pool used while not initialized"); if (t->measurePerf) - msg->returnTime=rdtsc(); + msg->returnTime=rdtsc_oai(); if (t->traceFd > 0) if(write(t->traceFd, msg, sizeof(*msg))); @@ -262,7 +256,7 @@ static inline notifiedFIFO_elt_t *tryPullTpool(notifiedFIFO_t *responseFifo, tpo return NULL; if (t->measurePerf) - msg->returnTime=rdtsc(); + msg->returnTime=rdtsc_oai(); if (t->traceFd) if(write(t->traceFd, msg, sizeof(*msg))); diff --git a/common/utils/time_meas.c b/common/utils/time_meas.c index 353f170434..df2bfd64de 100644 --- a/common/utils/time_meas.c +++ b/common/utils/time_meas.c @@ -267,6 +267,15 @@ void init_meas(void) { AssertFatal(rt==0, "couldn't create cpu measurment thread: %s\n",strerror(errno)); } +void send_meas(time_stats_t *ts, int msgid) { + if (MEASURE_ENABLED(ts) ) { + ts->tstatptr->timestat_id=ts->meas_index; + ts->tstatptr->msgid = msgid ; + ts->tstatptr->ts = rdtsc_oai(); + pushNotifiedFIFO(&measur_fifo, ts->tpoolmsg); + } + } + void end_meas(void) { notifiedFIFO_elt_t *nfe = newNotifiedFIFO_elt(sizeof(time_stats_msg_t),0,NULL,NULL); time_stats_msg_t *msg = (time_stats_msg_t *)NotifiedFifoData(nfe); diff --git a/common/utils/time_meas.h b/common/utils/time_meas.h index ed4e9a125f..98c4b3fe8a 100644 --- a/common/utils/time_meas.h +++ b/common/utils/time_meas.h @@ -31,7 +31,6 @@ #include #include #include -#include "common/utils/threadPool/thread-pool.h" // global var to enable openair performance profiler extern int opp_enabled; extern double cpu_freq_GHz __attribute__ ((aligned(32)));; @@ -58,8 +57,8 @@ typedef struct { meas_printfunc_t displayFunc; /*!< \brief function to call when DISPLAY message is received*/ } time_stats_msg_t; - -typedef struct { +struct notifiedFIFO_elt_s; +typedef struct time_stats { OAI_CPUTIME_TYPE in; /*!< \brief time at measure starting point */ OAI_CPUTIME_TYPE diff; /*!< \brief average difference between time at starting point and time at endpoint*/ OAI_CPUTIME_TYPE p_time; /*!< \brief absolute process duration */ @@ -70,7 +69,7 @@ typedef struct { char *meas_name; /*!< \brief name to use when printing the measure (not used for PHY simulators)*/ int meas_index; /*!< \brief index of this measure in the measure array (not used for PHY simulators)*/ int meas_enabled; /*!< \brief per measure enablement flag. send_meas tests this flag, unused today in start_meas and stop_meas*/ - notifiedFIFO_elt_t *tpoolmsg; /*!< \brief message pushed to the cpu measurment queue to report a measure START or STOP */ + struct notifiedFIFO_elt_s *tpoolmsg; /*!< \brief message pushed to the cpu measurment queue to report a measure START or STOP */ time_stats_msg_t *tstatptr; /*!< \brief pointer to the time_stats_msg_t data in the tpoolmsg, stored here for perf considerations*/ } time_stats_t; #define MEASURE_ENABLED(X) (X->meas_enabled) @@ -189,25 +188,17 @@ static inline void merge_meas(time_stats_t *dst_ts, time_stats_t *src_ts) dst_ts->max = src_ts->max; } -extern notifiedFIFO_t measur_fifo; #define CPUMEASUR_SECTION "cpumeasur" #define CPUMEASUR_PARAMS_DESC { \ {"max_cpumeasur", "Max number of cpu measur entries", 0, uptr:&max_cpumeasur, defintval:100, TYPE_UINT, 0},\ } - void init_meas(void); - time_stats_t *register_meas(char *name); - #define START_MEAS(X) send_meas(X, TIMESTAT_MSGID_START) - #define STOP_MEAS(X) send_meas(X, TIMESTAT_MSGID_STOP) - static inline void send_meas(time_stats_t *ts, int msgid) { - if (MEASURE_ENABLED(ts) ) { - ts->tstatptr->timestat_id=ts->meas_index; - ts->tstatptr->msgid = msgid ; - ts->tstatptr->ts = rdtsc_oai(); - pushNotifiedFIFO(&measur_fifo, ts->tpoolmsg); - } - } - void end_meas(void); +void init_meas(void); +time_stats_t *register_meas(char *name); +#define START_MEAS(X) send_meas(X, TIMESTAT_MSGID_START) +#define STOP_MEAS(X) send_meas(X, TIMESTAT_MSGID_STOP) +void send_meas(time_stats_t *ts, int msgid); +void end_meas(void); #endif From 26d0d65747ee04d2677da5ed1857cbe309ccd4ce Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Fri, 25 Feb 2022 17:55:12 +0100 Subject: [PATCH 64/96] get execution time_stats_t from Tpool job --- common/utils/threadPool/thread-pool.h | 12 ++++++++++++ common/utils/time_meas.h | 2 +- executables/nr-gnb.c | 2 +- openair1/PHY/defs_gNB.h | 1 - openair1/SCHED_NR/fapi_nr_l1.c | 4 ++-- openair1/SCHED_NR/phy_procedures_nr_gNB.c | 7 ------- openair1/SIMULATION/NR_PHY/dlsim.c | 1 - 7 files changed, 16 insertions(+), 13 deletions(-) diff --git a/common/utils/threadPool/thread-pool.h b/common/utils/threadPool/thread-pool.h index da4e9cb04c..6df98e2ba4 100644 --- a/common/utils/threadPool/thread-pool.h +++ b/common/utils/threadPool/thread-pool.h @@ -169,6 +169,18 @@ static inline notifiedFIFO_elt_t *pollNotifiedFIFO(notifiedFIFO_t *nf) { return ret; } +static inline time_stats_t exec_time_stats_NotifiedFIFO(const notifiedFIFO_elt_t* elt) +{ + time_stats_t ts = {0}; + ts.in = elt->startProcessingTime; + ts.diff = elt->endProcessingTime - ts.in; + ts.p_time = ts.diff; + ts.diff_square = ts.diff * ts.diff; + ts.max = ts.diff; + ts.trials = 1; + return ts; +} + // This function aborts all messages matching the key // If the queue is used in thread pools, it doesn't cancels already running processing // because the message has already been picked diff --git a/common/utils/time_meas.h b/common/utils/time_meas.h index 98c4b3fe8a..81a1a893cd 100644 --- a/common/utils/time_meas.h +++ b/common/utils/time_meas.h @@ -178,7 +178,7 @@ static inline void copy_meas(time_stats_t *dst_ts,time_stats_t *src_ts) { } } -static inline void merge_meas(time_stats_t *dst_ts, time_stats_t *src_ts) +static inline void merge_meas(time_stats_t *dst_ts, const time_stats_t *src_ts) { if (!opp_enabled) return; diff --git a/executables/nr-gnb.c b/executables/nr-gnb.c index cf48a1c3fd..9f3f2e36bf 100644 --- a/executables/nr-gnb.c +++ b/executables/nr-gnb.c @@ -423,7 +423,7 @@ void init_gNB_Tpool(int inst) { s_offset += 3; } if (getenv("noThreads")) strcpy(pool, "n"); - initTpool(pool, gNB->threadPool, false); + initTpool(pool, gNB->threadPool, true); // ULSCH decoder result FIFO gNB->respDecode = (notifiedFIFO_t*) malloc(sizeof(notifiedFIFO_t)); initNotifiedFIFO(gNB->respDecode); diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h index 7d5cb285b5..78ed890aef 100644 --- a/openair1/PHY/defs_gNB.h +++ b/openair1/PHY/defs_gNB.h @@ -973,7 +973,6 @@ typedef struct processingData_L1tx { uint16_t num_pdsch_slot; int num_dl_pdcch; int num_ul_pdcch; - time_stats_t phy_proc_tx; } processingData_L1tx_t; #endif diff --git a/openair1/SCHED_NR/fapi_nr_l1.c b/openair1/SCHED_NR/fapi_nr_l1.c index 78e722c4b5..4b9f9534f0 100644 --- a/openair1/SCHED_NR/fapi_nr_l1.c +++ b/openair1/SCHED_NR/fapi_nr_l1.c @@ -165,8 +165,8 @@ void nr_schedule_response(NR_Sched_Rsp_t *Sched_INFO){ notifiedFIFO_elt_t *res; res = pullTpool(gNB->L1_tx_free, gNB->threadPool); processingData_L1tx_t *msgTx = (processingData_L1tx_t *)NotifiedFifoData(res); - - merge_meas(&gNB->phy_proc_tx, &msgTx->phy_proc_tx); + const time_stats_t ts = exec_time_stats_NotifiedFIFO(res); + merge_meas(&gNB->phy_proc_tx, &ts); msgTx->num_pdsch_slot=0; msgTx->num_dl_pdcch=0; diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index bc4493cd1c..1ddf4b0d07 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -134,11 +134,6 @@ void phy_procedures_gNB_TX(processingData_L1tx_t *msgTx, VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_gNB_TX+offset,1); - if (do_meas==1) { - reset_meas(&msgTx->phy_proc_tx); - start_meas(&msgTx->phy_proc_tx); - } - // clear the transmit data array and beam index for the current slot for (aa=0; aacarrier_config.num_tx_ant.value; aa++) { memset(&gNB->common_vars.txdataF[aa][txdataF_offset],0,fp->samples_per_slot_wCP*sizeof(int32_t)); @@ -196,8 +191,6 @@ void phy_procedures_gNB_TX(processingData_L1tx_t *msgTx, } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_gNB_TX+offset,0); - - if (do_meas==1) stop_meas(&msgTx->phy_proc_tx); } void nr_postDecode(PHY_VARS_gNB *gNB, notifiedFIFO_elt_t *req) { diff --git a/openair1/SIMULATION/NR_PHY/dlsim.c b/openair1/SIMULATION/NR_PHY/dlsim.c index 7363d1abd5..98b9e03a7e 100644 --- a/openair1/SIMULATION/NR_PHY/dlsim.c +++ b/openair1/SIMULATION/NR_PHY/dlsim.c @@ -999,7 +999,6 @@ int main(int argc, char **argv) msgDataTx->slot = slot; msgDataTx->frame = frame; memset(msgDataTx->ssb, 0, 64*sizeof(NR_gNB_SSB_t)); - reset_meas(&msgDataTx->phy_proc_tx); for (SNR = snr0; SNR < snr1; SNR += .2) { From 823aaa70dd8668a76b1f33ee779d4d213c7158fa Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Fri, 25 Feb 2022 18:00:10 +0100 Subject: [PATCH 65/96] Fix warning in lte UE scope and ocp-enb --- executables/main-fs6.c | 2 +- openair1/PHY/TOOLS/lte_ue_scope.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/executables/main-fs6.c b/executables/main-fs6.c index e708d9c761..fff4c51155 100644 --- a/executables/main-fs6.c +++ b/executables/main-fs6.c @@ -947,7 +947,7 @@ void phy_procedures_eNB_TX_fromsplit(uint8_t *bufferZone, int nbBlocks, PHY_VARS memcpy(eNB->pbch_pdu,hDL(bufferZone)->pbch_pdu, 4); // Remove all scheduled DL, we will populate from the CU sending - for (int UE_id=0; UE_iddlsch[UE_id][0]; if ( dlsch0 && dlsch0->rnti>0 ) { diff --git a/openair1/PHY/TOOLS/lte_ue_scope.c b/openair1/PHY/TOOLS/lte_ue_scope.c index 00560f2d74..9b3f65d7d1 100644 --- a/openair1/PHY/TOOLS/lte_ue_scope.c +++ b/openair1/PHY/TOOLS/lte_ue_scope.c @@ -51,7 +51,7 @@ void reset_stats(FL_OBJECT *button, long arg) { int i,j,k; PHY_VARS_eNB *phy_vars_eNB = RC.eNB[0][0]; - for (i=0; idlsch[i][0]->Mlimit; j++) { phy_vars_eNB->UE_stats[i].dlsch_NAK[k][j]=0; From 368819310d3cce2a8ad3aabca8d6e62358a4ea7e Mon Sep 17 00:00:00 2001 From: matzakos Date: Mon, 28 Feb 2022 10:14:29 +0100 Subject: [PATCH 66/96] Synchronize config files of CU/DU with the ones of the CI --- .../PROJECTS/GENERIC-NR-5GC/CONF/cu_gnb.conf | 194 +++++++++++++++++- .../PROJECTS/GENERIC-NR-5GC/CONF/du_gnb.conf | 77 ++++--- 2 files changed, 233 insertions(+), 38 deletions(-) diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/cu_gnb.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/cu_gnb.conf index 43c2ab20ad..5e8527b4d1 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/cu_gnb.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/cu_gnb.conf @@ -13,7 +13,6 @@ gNBs = gNB_name = "gNB-Eurecom-CU"; - // Tracking area code, 0x0000 and 0xfffe are reserved values // Tracking area code, 0x0000 and 0xfffe are reserved values tracking_area_code = 1; plmn_list = ({ @@ -27,14 +26,14 @@ gNBs = }, { sst = 1; - sd = 0x1; #112233; // 0 false, else true + sd = 0x112233; // 0 false, else true } ); }); - nr_cellid = 12345678L + nr_cellid = 12345678L; tr_s_preference = "f1"; @@ -43,9 +42,170 @@ gNBs = remote_s_address = "127.0.0.3"; local_s_portc = 501; local_s_portd = 2152; - remote_s_portc = 501; + remote_s_portc = 500; remote_s_portd = 2152; + ssb_SubcarrierOffset = 0; + pdsch_AntennaPorts = 1; + pusch_AntennaPorts = 1; + min_rxtxtime = 6; + sib1_tda = 0; + pdcch_ConfigSIB1 = ( + { + controlResourceSetZero = 12; + searchSpaceZero = 0; + } + ); + + servingCellConfigCommon = ( + { + #spCellConfigCommon + + physCellId = 0; + +# downlinkConfigCommon + #frequencyInfoDL + # this is 3600 MHz + 43 PRBs@30kHz SCS (same as initial BWP) + absoluteFrequencySSB = 641280; + dl_frequencyBand = 78; + # this is 3600 MHz + dl_absoluteFrequencyPointA = 640008; + #scs-SpecificCarrierList + dl_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + dl_subcarrierSpacing = 1; + dl_carrierBandwidth = 106; + #initialDownlinkBWP + #genericParameters + # this is RBstart=27,L=48 (275*(L-1))+RBstart + initialDLBWPlocationAndBandwidth = 28875; # 6366 12925 12956 28875 12952 +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + initialDLBWPsubcarrierSpacing = 1; + #pdcch-ConfigCommon + initialDLBWPcontrolResourceSetZero = 12; + initialDLBWPsearchSpaceZero = 0; + #pdsch-ConfigCommon + #pdschTimeDomainAllocationList (up to 16 entries) + initialDLBWPk0_0 = 0; #for DL slot + initialDLBWPmappingType_0 = 0; #0=typeA,1=typeB + initialDLBWPstartSymbolAndLength_0 = 40; #this is SS=1,L=13 + + initialDLBWPk0_1 = 0; #for mixed slot + initialDLBWPmappingType_1 = 0; + initialDLBWPstartSymbolAndLength_1 = 57; #this is SS=1,L=5 + + #uplinkConfigCommon + #frequencyInfoUL + ul_frequencyBand = 78; + #scs-SpecificCarrierList + ul_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + ul_subcarrierSpacing = 1; + ul_carrierBandwidth = 106; + pMax = 20; + #initialUplinkBWP + #genericParameters + initialULBWPlocationAndBandwidth = 28875; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + initialULBWPsubcarrierSpacing = 1; + #rach-ConfigCommon + #rach-ConfigGeneric + prach_ConfigurationIndex = 98; +#prach_msg1_FDM +#0 = one, 1=two, 2=four, 3=eight + prach_msg1_FDM = 0; + prach_msg1_FrequencyStart = 0; + zeroCorrelationZoneConfig = 13; + preambleReceivedTargetPower = -96; +#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200) + preambleTransMax = 6; +#powerRampingStep +# 0=dB0,1=dB2,2=dB4,3=dB6 + powerRampingStep = 1; +#ra_ReponseWindow +#1,2,4,8,10,20,40,80 + ra_ResponseWindow = 4; +#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR +#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen + ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 4; +#oneHalf (0..15) 4,8,12,16,...60,64 + ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 14; +#ra_ContentionResolutionTimer +#(0..7) 8,16,24,32,40,48,56,64 + ra_ContentionResolutionTimer = 7; + rsrp_ThresholdSSB = 19; +#prach-RootSequenceIndex_PR +#1 = 839, 2 = 139 + prach_RootSequenceIndex_PR = 2; + prach_RootSequenceIndex = 1; + # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex + # + msg1_SubcarrierSpacing = 1, +# restrictedSetConfig +# 0=unrestricted, 1=restricted type A, 2=restricted type B + restrictedSetConfig = 0, + + # pusch-ConfigCommon (up to 16 elements) + initialULBWPk2_0 = 6; # used for UL slot + initialULBWPmappingType_0 = 1 + initialULBWPstartSymbolAndLength_0 = 41; # this is SS=0 L=13 + + initialULBWPk2_1 = 6; # used for mixed slot + initialULBWPmappingType_1 = 1; + initialULBWPstartSymbolAndLength_1 = 52; # this is SS=10 L=4 + + initialULBWPk2_2 = 7; # used for Msg.3 during RA + initialULBWPmappingType_2 = 1; + initialULBWPstartSymbolAndLength_2 = 52; # this is SS=10 L=4 + + msg3_DeltaPreamble = 1; + p0_NominalWithGrant =-90; + +# pucch-ConfigCommon setup : +# pucchGroupHopping +# 0 = neither, 1= group hopping, 2=sequence hopping + pucchGroupHopping = 0; + hoppingId = 40; + p0_nominal = -90; +# ssb_PositionsInBurs_BitmapPR +# 1=short, 2=medium, 3=long + ssb_PositionsInBurst_PR = 2; + ssb_PositionsInBurst_Bitmap = 1; + +# ssb_periodicityServingCell +# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1 + ssb_periodicityServingCell = 2; + +# dmrs_TypeA_position +# 0 = pos2, 1 = pos3 + dmrs_TypeA_Position = 0; + +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + subcarrierSpacing = 1; + + + #tdd-UL-DL-ConfigurationCommon +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + referenceSubcarrierSpacing = 1; + # pattern1 + # dl_UL_TransmissionPeriodicity + # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10 + dl_UL_TransmissionPeriodicity = 6; + nrofDownlinkSlots = 7; + nrofDownlinkSymbols = 6; + nrofUplinkSlots = 2; + nrofUplinkSymbols = 4; + + ssPBCH_BlockPower = -25; + } + + ); # ------- SCTP definitions SCTP : { @@ -56,7 +216,7 @@ gNBs = ////////// AMF parameters: - amf_ip_address = ( { ipv4 = "192.168.69.131"; + amf_ip_address = ( { ipv4 = "192.168.69.131"; ipv6 = "192:168:30::17"; active = "yes"; preference = "ipv4"; @@ -66,15 +226,31 @@ gNBs = NETWORK_INTERFACES : { - GNB_INTERFACE_NAME_FOR_NG_AMF = "bond0"; - GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.18.207/24"; - GNB_INTERFACE_NAME_FOR_NGU = "bond0"; - GNB_IPV4_ADDRESS_FOR_NGU = "192.168.18.207/24"; + GNB_INTERFACE_NAME_FOR_NG_AMF = "eth0"; + GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.18.207"; + GNB_INTERFACE_NAME_FOR_NGU = "eth0"; + GNB_IPV4_ADDRESS_FOR_NGU = "192.168.18.207"; GNB_PORT_FOR_S1U = 2152; # Spec 2152 }; } ); +security = { + # preferred ciphering algorithms + # the first one of the list that an UE supports in chosen + # valid values: nea0, nea1, nea2, nea3 + ciphering_algorithms = ( "nea0" ); + + # preferred integrity algorithms + # the first one of the list that an UE supports in chosen + # valid values: nia0, nia1, nia2, nia3 + integrity_algorithms = ( "nia2", "nia0" ); + + # setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter + # what 'ciphering_algorithms' configures; same thing for 'drb_integrity' + drb_ciphering = "yes"; + drb_integrity = "no"; +}; log_config : { global_log_level ="info"; diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/du_gnb.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/du_gnb.conf index 0b6d7cd7c8..95fa75bc1d 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/du_gnb.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/du_gnb.conf @@ -12,7 +12,6 @@ gNBs = gNB_name = "gNB-Eurecom-DU"; - // Tracking area code, 0x0000 and 0xfffe are reserved values // Tracking area code, 0x0000 and 0xfffe are reserved values tracking_area_code = 1; plmn_list = ({ @@ -26,25 +25,23 @@ gNBs = }, { sst = 1; - sd = 0x1; #112233; // 0 false, else true + sd = 0x112233; // 0 false, else true } ); }); - nr_cellid = 12345678L - -# tr_s_preference = "local_mac" + nr_cellid = 12345678L; ////////// Physical parameters: ssb_SubcarrierOffset = 0; pdsch_AntennaPorts = 1; pusch_AntennaPorts = 1; + min_rxtxtime = 6; sib1_tda = 0; - pdcch_ConfigSIB1 = ( { controlResourceSetZero = 12; @@ -74,14 +71,22 @@ gNBs = #initialDownlinkBWP #genericParameters # this is RBstart=27,L=48 (275*(L-1))+RBstart - initialDLBWPlocationAndBandwidth = 12952; + initialDLBWPlocationAndBandwidth = 28875; # 6366 12925 12956 28875 12952 # subcarrierSpacing # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 initialDLBWPsubcarrierSpacing = 1; #pdcch-ConfigCommon - initialDLBWPcontrolResourceSetZero = 11; + initialDLBWPcontrolResourceSetZero = 12; initialDLBWPsearchSpaceZero = 0; + #pdsch-ConfigCommon + #pdschTimeDomainAllocationList (up to 16 entries) + initialDLBWPk0_0 = 0; #for DL slot + initialDLBWPmappingType_0 = 0; #0=typeA,1=typeB + initialDLBWPstartSymbolAndLength_0 = 40; #this is SS=1,L=13 + initialDLBWPk0_1 = 0; #for mixed slot + initialDLBWPmappingType_1 = 0; + initialDLBWPstartSymbolAndLength_1 = 57; #this is SS=1,L=5 #uplinkConfigCommon #frequencyInfoUL @@ -95,7 +100,7 @@ gNBs = pMax = 20; #initialUplinkBWP #genericParameters - initialULBWPlocationAndBandwidth = 12952; + initialULBWPlocationAndBandwidth = 28875; # subcarrierSpacing # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 initialULBWPsubcarrierSpacing = 1; @@ -107,7 +112,7 @@ gNBs = prach_msg1_FDM = 0; prach_msg1_FrequencyStart = 0; zeroCorrelationZoneConfig = 13; - preambleReceivedTargetPower = -118; + preambleReceivedTargetPower = -96; #preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200) preambleTransMax = 6; #powerRampingStep @@ -118,9 +123,9 @@ gNBs = ra_ResponseWindow = 4; #ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR #1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen - ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 3; + ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 4; #oneHalf (0..15) 4,8,12,16,...60,64 - ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 15; + ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 14; #ra_ContentionResolutionTimer #(0..7) 8,16,24,32,40,48,56,64 ra_ContentionResolutionTimer = 7; @@ -136,6 +141,18 @@ gNBs = # 0=unrestricted, 1=restricted type A, 2=restricted type B restrictedSetConfig = 0, + # pusch-ConfigCommon (up to 16 elements) + initialULBWPk2_0 = 6; # used for UL slot + initialULBWPmappingType_0 = 1 + initialULBWPstartSymbolAndLength_0 = 41; # this is SS=0 L=13 + + initialULBWPk2_1 = 6; # used for mixed slot + initialULBWPmappingType_1 = 1; + initialULBWPstartSymbolAndLength_1 = 52; # this is SS=10 L=4 + + initialULBWPk2_2 = 7; # used for Msg.3 during RA + initialULBWPmappingType_2 = 1; + initialULBWPstartSymbolAndLength_2 = 52; # this is SS=10 L=4 msg3_DeltaPreamble = 1; p0_NominalWithGrant =-90; @@ -177,7 +194,7 @@ gNBs = nrofUplinkSlots = 2; nrofUplinkSymbols = 4; - ssPBCH_BlockPower = 10; + ssPBCH_BlockPower = -25; } ); @@ -201,9 +218,9 @@ MACRLCs = ( local_n_if_name = "lo"; local_n_address = "127.0.0.3"; remote_n_address = "127.0.0.4"; - local_n_portc = 601; + local_n_portc = 500; local_n_portd = 2152; - remote_n_portc = 600; + remote_n_portc = 501; remote_n_portd = 2152; } @@ -214,6 +231,9 @@ L1s = ( num_cc = 1; tr_n_preference = "local_mac"; thread_pool_size = 8; + prach_dtx_threshold = 120; + pucch0_dtx_threshold = 150; + ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0 } ); @@ -224,21 +244,13 @@ RUs = ( nb_rx = 1 att_tx = 0 att_rx = 0; - bands = [7]; + bands = [78]; max_pdschReferenceSignalPower = -27; - max_rxgain = 75; + max_rxgain = 114; eNB_instances = [0]; - ##beamforming 1x2 matrix: 1 layer x 2 antennas - bf_weights = [0x00007fff, 0x0000]; - ##beamforming 1x4 matrix: 1 layer x 4 antennas - #bf_weights = [0x00007fff, 0x0000,0x0000, 0x0000]; - ## beamforming 2x2 matrix: - # bf_weights = [0x00007fff, 0x00000000, 0x00000000, 0x00007fff]; - ## beamforming 4x4 matrix: - #bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000, 0x00000000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff]; - - sdr_addrs = "addr=192.168.10.2,mgmt_addr=192.168.10.2,second_addr=192.168.20.2"; - clock_src = "external"; + #beamforming 1x4 matrix: + bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000]; + clock_src = "internal"; } ); @@ -250,6 +262,13 @@ THREAD_STRUCT = ( worker_config = "WORKER_ENABLE"; } ); +rfsimulator: { +serveraddr = "server"; + serverport = "4043"; + options = (); #("saviq"); or/and "chanmod" + modelname = "AWGN"; + IQfile = "/tmp/rfsimulator.iqs" +} log_config : { @@ -257,7 +276,7 @@ THREAD_STRUCT = ( hw_log_level ="info"; phy_log_level ="info"; mac_log_level ="info"; - rlc_log_level ="debug"; + rlc_log_level ="info"; pdcp_log_level ="info"; rrc_log_level ="info"; f1ap_log_level ="debug"; From d90f9d8d6fadab3145a9f0bc9ac833820b299dc1 Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Mon, 28 Feb 2022 14:13:01 +0100 Subject: [PATCH 67/96] CI: show correct Tx Processing in HTML, add processing count number --- ci-scripts/datalog_rt_stats.2x2.yaml | 11 ++++------- ci-scripts/datalog_rt_stats.default.yaml | 11 ++++------- ci-scripts/html.py | 14 ++++++-------- ci-scripts/ran.py | 5 +++-- ci-scripts/stats_monitor_conf.yaml | 8 +++----- 5 files changed, 20 insertions(+), 29 deletions(-) diff --git a/ci-scripts/datalog_rt_stats.2x2.yaml b/ci-scripts/datalog_rt_stats.2x2.yaml index 9e2b66862d..a93ef6aa8c 100644 --- a/ci-scripts/datalog_rt_stats.2x2.yaml +++ b/ci-scripts/datalog_rt_stats.2x2.yaml @@ -4,16 +4,14 @@ Title : Processing Time (us) ColNames : - Metric - - Average - - Max - - Average vs Reference Deviation (Reference Value ; Acceptability Threshold) + - Average; Max; Count + - Average vs Reference Deviation (Reference Value; Acceptability Threshold) Ref : feprx : 120.0 feptx_prec : 8.0 feptx_ofdm : 50.0 feptx_total : 75.0 - L1 Tx processing thread 0 : 300.0 - L1 Tx processing thread 1 : 300.0 + L1 Tx processing : 300.0 DLSCH encoding : 230.0 L1 Rx processing : 175.0 PUSCH inner-receiver : 100.0 @@ -25,8 +23,7 @@ Threshold : feptx_prec : 1.25 feptx_ofdm : 1.25 feptx_total : 1.25 - L1 Tx processing thread 0 : 1.25 - L1 Tx processing thread 1 : 1.25 + L1 Tx processing : 1.25 DLSCH encoding : 1.25 L1 Rx processing : 1.25 PUSCH inner-receiver : 1.25 diff --git a/ci-scripts/datalog_rt_stats.default.yaml b/ci-scripts/datalog_rt_stats.default.yaml index a2d4768752..02a90c86f4 100644 --- a/ci-scripts/datalog_rt_stats.default.yaml +++ b/ci-scripts/datalog_rt_stats.default.yaml @@ -4,16 +4,14 @@ Title : Processing Time (us) ColNames : - Metric - - Average - - Max - - Average vs Reference Deviation (Reference Value ; Acceptability Threshold) + - Average; Max; Count + - Average vs Reference Deviation (Reference Value; Acceptability Threshold) Ref : feprx : 60.0 feptx_prec : 8.0 feptx_ofdm : 50.0 feptx_total : 75.0 - L1 Tx processing thread 0 : 300.0 - L1 Tx processing thread 1 : 300.0 + L1 Tx processing : 300.0 DLSCH encoding : 230.0 L1 Rx processing : 175.0 PUSCH inner-receiver : 100.0 @@ -25,8 +23,7 @@ Threshold : feptx_prec : 1.25 feptx_ofdm : 1.25 feptx_total : 1.25 - L1 Tx processing thread 0 : 1.25 - L1 Tx processing thread 1 : 1.25 + L1 Tx processing : 1.25 DLSCH encoding : 1.25 L1 Rx processing : 1.25 PUSCH inner-receiver : 1.25 diff --git a/ci-scripts/html.py b/ci-scripts/html.py index b172ffb711..c618ea5abc 100644 --- a/ci-scripts/html.py +++ b/ci-scripts/html.py @@ -478,21 +478,19 @@ class HTMLManagement(): self.htmlFile.write(' \n') self.htmlFile.write(' \n') self.htmlFile.write(' '+ DataLog['ColNames'][0] +'\n') - self.htmlFile.write(' ' + DataLog['ColNames'][1] + '\n') - self.htmlFile.write(' ' + DataLog['ColNames'][2] + '\n') - self.htmlFile.write(' '+ DataLog['ColNames'][3] +'\n') + self.htmlFile.write(' ' + DataLog['ColNames'][1] + '\n') + self.htmlFile.write(' '+ DataLog['ColNames'][2] +'\n') self.htmlFile.write(' \n') for k in DataLog['Data']: # TestRow self.htmlFile.write(' \n') self.htmlFile.write(' ' + k + ' \n') - self.htmlFile.write(' ' + DataLog['Data'][k][0] + ' \n') - self.htmlFile.write(' ' + DataLog['Data'][k][1] + ' \n') - if float(DataLog['Data'][k][2])> DataLog['Threshold'][k]: - self.htmlFile.write(' ' + DataLog['Data'][k][2] + ' (Ref = ' + str(DataLog['Ref'][k]) + ' ; Thres = ' +str(DataLog['Threshold'][k])+') ' + '\n') + self.htmlFile.write(' ' + DataLog['Data'][k][0] + '; ' + DataLog['Data'][k][1] + '; ' + DataLog['Data'][k][2] + ' \n') + if float(DataLog['Data'][k][3])> DataLog['Threshold'][k]: + self.htmlFile.write(' ' + DataLog['Data'][k][3] + ' (Ref = ' + str(DataLog['Ref'][k]) + ' ; Thres = ' +str(DataLog['Threshold'][k])+') ' + '\n') else: - self.htmlFile.write(' ' + DataLog['Data'][k][2] + ' (Ref = ' + str(DataLog['Ref'][k]) + ' ; Thres = ' +str(DataLog['Threshold'][k])+') ' + '\n') + self.htmlFile.write(' ' + DataLog['Data'][k][3] + ' (Ref = ' + str(DataLog['Ref'][k]) + ' ; Thres = ' +str(DataLog['Threshold'][k])+') ' + '\n') self.htmlFile.write(' \n') self.htmlFile.close() diff --git a/ci-scripts/ran.py b/ci-scripts/ran.py index ad360d2179..d295339cca 100644 --- a/ci-scripts/ran.py +++ b/ci-scripts/ran.py @@ -1125,12 +1125,13 @@ class RANManagement(): datalog_rt_stats['Data']={} if len(real_time_stats)!=0: #check if dictionary is not empty for k in real_time_stats: - tmp=re.match(r'^(?P.*):\s+(?P\d+\.\d+) us;\s+\d+;\s+(?P\d+\.\d+) us;',real_time_stats[k]) + tmp=re.match(r'^(?P.*):\s+(?P\d+\.\d+) us;\s+(?P\d+);\s+(?P\d+\.\d+) us;',real_time_stats[k]) if tmp is not None: metric=tmp.group('metric') avg=float(tmp.group('avg')) max=float(tmp.group('max')) - datalog_rt_stats['Data'][metric]=["{:.0f}".format(avg),"{:.0f}".format(max),"{:.2f}".format(avg/datalog_rt_stats['Ref'][metric])] + count=float(tmp.group('count')) + datalog_rt_stats['Data'][metric]=["{:.0f}".format(avg),"{:.0f}".format(max),"{:d}".format(count),"{:.2f}".format(avg/datalog_rt_stats['Ref'][metric])] #once all metrics are collected, store the data as a class attribute to build a dedicated HTML table afterward self.datalog_rt_stats=datalog_rt_stats #check if there is a fail => will render the test as failed diff --git a/ci-scripts/stats_monitor_conf.yaml b/ci-scripts/stats_monitor_conf.yaml index 8760c067fc..9a2ececd18 100644 --- a/ci-scripts/stats_monitor_conf.yaml +++ b/ci-scripts/stats_monitor_conf.yaml @@ -20,8 +20,7 @@ gnb : feptx_prec: feptx_ofdm: feptx_total: - L1 Tx processing thread 0: - L1 Tx processing thread 1: + L1 Tx processing: DLSCH encoding: L1 Rx processing: PUSCH inner-receiver: @@ -40,12 +39,11 @@ gnb : rt.feptx_ofdm: rt.feptx_total: page3: - rt.L1 Tx processing thread 0: - rt.L1 Tx processing thread 1: + rt.L1 Tx processing: rt.DLSCH encoding: rt.L1 Rx processing: page4: rt.PUSCH inner-receiver: rt.PUSCH decoding: rt.DL & UL scheduling timing stats: - rt.UL Indication: \ No newline at end of file + rt.UL Indication: From 63dea20c64c043e71be54777c41b85491818e62e Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Mon, 28 Feb 2022 14:35:18 +0100 Subject: [PATCH 68/96] Address review comments --- common/utils/threadPool/thread-pool.h | 17 ++++++++++------- common/utils/time_meas.h | 16 ++++++++-------- executables/nr-gnb.c | 2 +- 3 files changed, 19 insertions(+), 16 deletions(-) diff --git a/common/utils/threadPool/thread-pool.h b/common/utils/threadPool/thread-pool.h index 6df98e2ba4..dc2655f741 100644 --- a/common/utils/threadPool/thread-pool.h +++ b/common/utils/threadPool/thread-pool.h @@ -60,10 +60,10 @@ typedef struct notifiedFIFO_elt_s { struct notifiedFIFO_s *reponseFifo; void (*processingFunc)(void *); bool malloced; - OAI_CPUTIME_TYPE creationTime; - OAI_CPUTIME_TYPE startProcessingTime; - OAI_CPUTIME_TYPE endProcessingTime; - OAI_CPUTIME_TYPE returnTime; + oai_cputime_t creationTime; + oai_cputime_t startProcessingTime; + oai_cputime_t endProcessingTime; + oai_cputime_t returnTime; void *msgData; } notifiedFIFO_elt_t; @@ -96,9 +96,12 @@ static inline void *NotifiedFifoData(notifiedFIFO_elt_t *elt) { } static inline void delNotifiedFIFO_elt(notifiedFIFO_elt_t *elt) { - AssertFatal(elt->malloced, "delNotifiedFIFO on something not allocated by newNotifiedFIFO\n"); - elt->malloced=false; - free(elt); + if (elt->malloced) { + elt->malloced = false; + free(elt); + } + /* it is allowed to call delNotifiedFIFO_elt when the memory is managed by + * the caller */ } static inline void initNotifiedFIFO_nothreadSafe(notifiedFIFO_t *nf) { diff --git a/common/utils/time_meas.h b/common/utils/time_meas.h index 81a1a893cd..382dd7455a 100644 --- a/common/utils/time_meas.h +++ b/common/utils/time_meas.h @@ -36,9 +36,9 @@ extern int opp_enabled; extern double cpu_freq_GHz __attribute__ ((aligned(32)));; // structure to store data to compute cpu measurment #if defined(__x86_64__) || defined(__i386__) - #define OAI_CPUTIME_TYPE long long + typedef long long oai_cputime_t; #elif defined(__arm__) - #define OAI_CPUTIME_TYPE uint32_t + typedef uint32_t oai_cputime_t; #else #error "building on unsupported CPU architecture" #endif @@ -53,17 +53,17 @@ typedef void(*meas_printfunc_t)(const char* format, ...); typedef struct { int msgid; /*!< \brief message id, as defined by TIMESTAT_MSGID_X macros */ int timestat_id; /*!< \brief points to the time_stats_t entry in cpumeas table */ - OAI_CPUTIME_TYPE ts; /*!< \brief time stamp */ + oai_cputime_t ts; /*!< \brief time stamp */ meas_printfunc_t displayFunc; /*!< \brief function to call when DISPLAY message is received*/ } time_stats_msg_t; struct notifiedFIFO_elt_s; typedef struct time_stats { - OAI_CPUTIME_TYPE in; /*!< \brief time at measure starting point */ - OAI_CPUTIME_TYPE diff; /*!< \brief average difference between time at starting point and time at endpoint*/ - OAI_CPUTIME_TYPE p_time; /*!< \brief absolute process duration */ - OAI_CPUTIME_TYPE diff_square; /*!< \brief process duration square */ - OAI_CPUTIME_TYPE max; /*!< \brief maximum difference between time at starting point and time at endpoint*/ + oai_cputime_t in; /*!< \brief time at measure starting point */ + oai_cputime_t diff; /*!< \brief average difference between time at starting point and time at endpoint*/ + oai_cputime_t p_time; /*!< \brief absolute process duration */ + oai_cputime_t diff_square; /*!< \brief process duration square */ + oai_cputime_t max; /*!< \brief maximum difference between time at starting point and time at endpoint*/ int trials; /*!< \brief number of start point - end point iterations */ int meas_flag; /*!< \brief 1: stop_meas not called (consecutive calls of start_meas) */ char *meas_name; /*!< \brief name to use when printing the measure (not used for PHY simulators)*/ diff --git a/executables/nr-gnb.c b/executables/nr-gnb.c index 9f3f2e36bf..fa0c3a1f63 100644 --- a/executables/nr-gnb.c +++ b/executables/nr-gnb.c @@ -423,7 +423,7 @@ void init_gNB_Tpool(int inst) { s_offset += 3; } if (getenv("noThreads")) strcpy(pool, "n"); - initTpool(pool, gNB->threadPool, true); + initTpool(pool, gNB->threadPool, cpumeas(CPUMEAS_GETSTATE)); // ULSCH decoder result FIFO gNB->respDecode = (notifiedFIFO_t*) malloc(sizeof(notifiedFIFO_t)); initNotifiedFIFO(gNB->respDecode); From f2ffe3f9b05842d7e1f9794ab4778bb0babd5641 Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Mon, 28 Feb 2022 16:58:11 +0100 Subject: [PATCH 69/96] Fix CI code --- ci-scripts/ran.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci-scripts/ran.py b/ci-scripts/ran.py index d295339cca..44626dba74 100644 --- a/ci-scripts/ran.py +++ b/ci-scripts/ran.py @@ -1130,7 +1130,7 @@ class RANManagement(): metric=tmp.group('metric') avg=float(tmp.group('avg')) max=float(tmp.group('max')) - count=float(tmp.group('count')) + count=int(tmp.group('count')) datalog_rt_stats['Data'][metric]=["{:.0f}".format(avg),"{:.0f}".format(max),"{:d}".format(count),"{:.2f}".format(avg/datalog_rt_stats['Ref'][metric])] #once all metrics are collected, store the data as a class attribute to build a dedicated HTML table afterward self.datalog_rt_stats=datalog_rt_stats From c8abd3c0bf16fd6973df5122172dba30bb50de91 Mon Sep 17 00:00:00 2001 From: Laurent Thomas Date: Mon, 28 Feb 2022 20:47:27 +0100 Subject: [PATCH 70/96] remove lfds v6, lfds v7 for flexran only --- cmake_targets/CMakeLists.txt | 129 ++- .../LFDS/liblfds6.1.1/liblfds611/building.txt | 40 - .../UTIL/LFDS/liblfds6.1.1/liblfds611/dirs | 2 - .../liblfds6.1.1/liblfds611/inc/liblfds611.h | 334 -------- .../liblfds6.1.1/liblfds611/liblfds611.def | 57 -- .../liblfds6.1.1/liblfds611/liblfds611.sln | 38 - .../liblfds6.1.1/liblfds611/liblfds611.vcproj | 800 ------------------ .../liblfds6.1.1/liblfds611/makefile.linux | 111 --- .../liblfds6.1.1/liblfds611/makefile.windows | 97 --- .../LFDS/liblfds6.1.1/liblfds611/readme.txt | 147 ---- .../runme_before_win_kernel_build_readme.txt | 32 - ...me_before_win_kernel_dynamic_lib_build.bat | 15 - ...nme_before_win_kernel_static_lib_build.bat | 15 - .../liblfds6.1.1/liblfds611/sources.dynamic | 37 - .../liblfds6.1.1/liblfds611/sources.static | 35 - .../LFDS/liblfds6.1.1/liblfds611/src/dirs | 3 - .../liblfds611/src/driver_entry.c | 16 - .../liblfds611/src/driver_entry_readme.txt | 4 - .../lfds611_abstraction_cas.c | 71 -- .../lfds611_abstraction_dcas.c | 157 ---- .../lfds611_abstraction_free.c | 44 - .../lfds611_abstraction_increment.c | 98 --- .../lfds611_abstraction_internal_body.h | 2 - .../lfds611_abstraction_internal_wrapper.h | 6 - .../lfds611_abstraction_malloc.c | 40 - .../lfds611_freelist_delete.c | 35 - .../lfds611_freelist_get_and_set.c | 37 - .../lfds611_freelist_internal.h | 40 - .../lfds611_freelist/lfds611_freelist_new.c | 136 --- .../lfds611_freelist_pop_push.c | 87 -- .../lfds611_freelist/lfds611_freelist_query.c | 110 --- ...lfds611_liblfds_abstraction_test_helpers.c | 106 --- .../lfds611_liblfds_aligned_free.c | 17 - .../lfds611_liblfds_aligned_malloc.c | 31 - .../lfds611_liblfds_internal.h | 4 - .../lfds611_liblfds_readme.txt | 2 - .../src/lfds611_queue/lfds611_queue_delete.c | 57 -- .../lfds611_queue/lfds611_queue_internal.h | 59 -- .../src/lfds611_queue/lfds611_queue_new.c | 158 ---- .../src/lfds611_queue/lfds611_queue_query.c | 150 ---- .../src/lfds611_queue/lfds611_queue_queue.c | 184 ---- .../lfds611_ringbuffer_delete.c | 22 - .../lfds611_ringbuffer_get_and_put.c | 105 --- .../lfds611_ringbuffer_internal.h | 24 - .../lfds611_ringbuffer_new.c | 63 -- .../lfds611_ringbuffer_query.c | 64 -- .../src/lfds611_slist/lfds611_slist_delete.c | 83 -- .../lfds611_slist/lfds611_slist_get_and_set.c | 133 --- .../lfds611_slist/lfds611_slist_internal.h | 53 -- .../src/lfds611_slist/lfds611_slist_link.c | 53 -- .../src/lfds611_slist/lfds611_slist_new.c | 114 --- .../src/lfds611_stack/lfds611_stack_delete.c | 67 -- .../lfds611_stack/lfds611_stack_internal.h | 51 -- .../src/lfds611_stack/lfds611_stack_new.c | 156 ---- .../lfds611_stack/lfds611_stack_push_pop.c | 110 --- .../src/lfds611_stack/lfds611_stack_query.c | 154 ---- .../liblfds611/src/liblfds611_internal.h | 25 - .../UTIL/LFDS/liblfds6.1.1/test/building.txt | 51 -- .../LFDS/liblfds6.1.1/test/makefile.linux | 82 -- .../LFDS/liblfds6.1.1/test/makefile.windows | 64 -- .../LFDS/liblfds6.1.1/test/src/abstraction.h | 50 -- .../test/src/abstraction_cpu_count.c | 81 -- .../test/src/abstraction_thread_start.c | 141 --- .../test/src/abstraction_thread_wait.c | 71 -- .../test/src/benchmark_freelist.c | 134 --- .../liblfds6.1.1/test/src/benchmark_queue.c | 138 --- .../test/src/benchmark_ringbuffer.c | 137 --- .../liblfds6.1.1/test/src/benchmark_stack.c | 134 --- .../LFDS/liblfds6.1.1/test/src/internal.h | 123 --- .../UTIL/LFDS/liblfds6.1.1/test/src/main.c | 83 -- .../UTIL/LFDS/liblfds6.1.1/test/src/misc.c | 119 --- .../LFDS/liblfds6.1.1/test/src/structures.h | 205 ----- .../liblfds6.1.1/test/src/test_abstraction.c | 323 ------- .../liblfds6.1.1/test/src/test_freelist.c | 673 --------------- .../LFDS/liblfds6.1.1/test/src/test_queue.c | 515 ----------- .../liblfds6.1.1/test/src/test_ringbuffer.c | 472 ----------- .../LFDS/liblfds6.1.1/test/src/test_slist.c | 388 --------- .../LFDS/liblfds6.1.1/test/src/test_stack.c | 582 ------------- openair2/UTIL/LFDS/liblfds6.1.1/test/test.sln | 79 -- .../UTIL/LFDS/liblfds6.1.1/test/test.vcproj | 415 --------- 80 files changed, 55 insertions(+), 9825 deletions(-) delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/building.txt delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/dirs delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/inc/liblfds611.h delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/liblfds611.def delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/liblfds611.sln delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/liblfds611.vcproj delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/makefile.linux delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/makefile.windows delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/readme.txt delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/runme_before_win_kernel_build_readme.txt delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/runme_before_win_kernel_dynamic_lib_build.bat delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/runme_before_win_kernel_static_lib_build.bat delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/sources.dynamic delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/sources.static delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/dirs delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/driver_entry.c delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/driver_entry_readme.txt delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_abstraction/lfds611_abstraction_cas.c delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_abstraction/lfds611_abstraction_dcas.c delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_abstraction/lfds611_abstraction_free.c delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_abstraction/lfds611_abstraction_increment.c delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_abstraction/lfds611_abstraction_internal_body.h delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_abstraction/lfds611_abstraction_internal_wrapper.h delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_abstraction/lfds611_abstraction_malloc.c delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_freelist/lfds611_freelist_delete.c delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_freelist/lfds611_freelist_get_and_set.c delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_freelist/lfds611_freelist_internal.h delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_freelist/lfds611_freelist_new.c delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_freelist/lfds611_freelist_pop_push.c delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_freelist/lfds611_freelist_query.c delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_liblfds/lfds611_liblfds_abstraction_test_helpers.c delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_liblfds/lfds611_liblfds_aligned_free.c delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_liblfds/lfds611_liblfds_aligned_malloc.c delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_liblfds/lfds611_liblfds_internal.h delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_liblfds/lfds611_liblfds_readme.txt delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_queue/lfds611_queue_delete.c delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_queue/lfds611_queue_internal.h delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_queue/lfds611_queue_new.c delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_queue/lfds611_queue_query.c delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_queue/lfds611_queue_queue.c delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_ringbuffer/lfds611_ringbuffer_delete.c delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_ringbuffer/lfds611_ringbuffer_get_and_put.c delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_ringbuffer/lfds611_ringbuffer_internal.h delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_ringbuffer/lfds611_ringbuffer_new.c delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_ringbuffer/lfds611_ringbuffer_query.c delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_slist/lfds611_slist_delete.c delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_slist/lfds611_slist_get_and_set.c delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_slist/lfds611_slist_internal.h delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_slist/lfds611_slist_link.c delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_slist/lfds611_slist_new.c delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_stack/lfds611_stack_delete.c delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_stack/lfds611_stack_internal.h delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_stack/lfds611_stack_new.c delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_stack/lfds611_stack_push_pop.c delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_stack/lfds611_stack_query.c delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/liblfds611_internal.h delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/test/building.txt delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/test/makefile.linux delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/test/makefile.windows delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/test/src/abstraction.h delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/test/src/abstraction_cpu_count.c delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/test/src/abstraction_thread_start.c delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/test/src/abstraction_thread_wait.c delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/test/src/benchmark_freelist.c delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/test/src/benchmark_queue.c delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/test/src/benchmark_ringbuffer.c delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/test/src/benchmark_stack.c delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/test/src/internal.h delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/test/src/main.c delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/test/src/misc.c delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/test/src/structures.h delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/test/src/test_abstraction.c delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/test/src/test_freelist.c delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/test/src/test_queue.c delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/test/src/test_ringbuffer.c delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/test/src/test_slist.c delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/test/src/test_stack.c delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/test/test.sln delete mode 100644 openair2/UTIL/LFDS/liblfds6.1.1/test/test.vcproj diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 82022da78f..d6c70ebdc8 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -1103,8 +1103,6 @@ include_directories("${OPENAIR2_DIR}/ENB_APP/CONTROL_MODULES/RRC") include_directories("${OPENAIR2_DIR}/ENB_APP/CONTROL_MODULES/PDCP") include_directories("${OPENAIR2_DIR}/ENB_APP/CONTROL_MODULES/S1AP") include_directories("${OPENAIR2_DIR}/UTIL/OSA") -include_directories("${OPENAIR2_DIR}/UTIL/LFDS/liblfds6.1.1/liblfds611/inc") -include_directories("${OPENAIR2_DIR}/UTIL/LFDS/liblfds7.0.0/liblfds700/inc") include_directories("${OPENAIR2_DIR}/UTIL/MEM") include_directories("${OPENAIR2_DIR}/UTIL/LISTS") include_directories("${OPENAIR2_DIR}/UTIL/FIFO") @@ -1119,8 +1117,29 @@ include_directories("${OPENAIR2_DIR}/UTIL/OMV") include_directories("${OPENAIR2_DIR}/RRC/LTE/MESSAGES") include_directories("${OPENAIR_DIR}") -# Utilities Library +# flexran ################ +# Make lfds as a own source code (even if it is a outside library) +# only user: Flexran, please don't use lfds in any other component +################################################################### + +set(lfds7 ${OPENAIR2_DIR}/UTIL/LFDS/liblfds7.0.0/liblfds700/src/) +file(GLOB lfds7_queue ${lfds7}/lfds700_queue/*.c) +file(GLOB lfds7_ring ${lfds7}/lfds700_ringbuffer/*.c) +file(GLOB lfds7_qbss ${lfds7}/lfds700_queue_bounded_singleconsumer_singleproducer/*.c) +file(GLOB lfds7_stack ${lfds7}/lfds700_stack/*.c) +file(GLOB lfds7_freelist ${lfds7}/lfds700_freelist/*.c) +file(GLOB lfds7_btree ${lfds7}/lfds700_btree_addonly_unbalanced/*.c) +file(GLOB lfds7_hash ${lfds7}/lfds700_hash_addonly/*.c) +file(GLOB lfds7_ordered_list ${lfds7}/lfds700_list_addonly_ordered_singlylinked/*.c) +file(GLOB lfds7_unordered_list ${lfds7}/lfds700_list_addonly_singlylinked_unordered/*.c) +file(GLOB lfds7_misc ${lfds7}/lfds700_misc/*.c) + +add_library(LFDS7 + ${lfds7_queue} ${lfds7_ring} ${lfds7_qbss} ${lfds7_stack} ${lfds7_freelist} ${lfds7_btree} ${lfds7_hash} ${lfds7_ordered_list} ${lfds7_unordered_list} ${lfds7_misc} +) + +target_include_directories(LFDS7 PRIVATE "${lfds7}") # set the version of protobuf messages, V3 not supported yet add_list1_option(FLPT_VERSION V2 "FLPT MSG protobuf grammar version" V2 V3) @@ -1168,6 +1187,9 @@ add_library(FLPT_MSG ${FLPT_OAI_generated} ${FLPT_source} ) +target_link_libraries(FLPT_MSG LFDS7) +add_dependencies(FLPT_MSG LFDS7) + set(FLPT_MSG_LIB FLPT_MSG) #message("prpt c dir is : ${FLPT_C_DIR}") include_directories (${FLPT_C_DIR}) @@ -1179,6 +1201,7 @@ add_library(ASYNC_IF ${OPENAIR2_DIR}/UTIL/ASYNC_IF/ringbuffer_queue.c ) set(ASYNC_IF_LIB ASYNC_IF) +target_include_directories(ASYNC_IF PRIVATE "${OPENAIR2_DIR}/UTIL/LFDS/liblfds7.0.0/liblfds700/inc") include_directories(${OPENAIR2_DIR}/UTIL/ASYNC_IF) add_library(FLEXRAN_AGENT @@ -1201,7 +1224,9 @@ add_library(FLEXRAN_AGENT ${OPENAIR2_DIR}/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac_slice_verification.c ${OPENAIR2_DIR}/ENB_APP/flexran_agent_app.c ) -add_dependencies(FLEXRAN_AGENT rrc_flag) +add_dependencies(FLEXRAN_AGENT rrc_flag ASYNC_IF) +target_link_libraries(FLEXRAN_AGENT ASYNC_IF LFDS7) +target_include_directories(FLEXRAN_AGENT PRIVATE "${OPENAIR2_DIR}/UTIL/LFDS/liblfds7.0.0/liblfds700/inc") set(FLEXRAN_AGENT_LIB FLEXRAN_AGENT) add_library(flapp_sample SHARED ${OPENAIR2_DIR}/ENB_APP/flexran_apps/sample.c @@ -1261,19 +1286,14 @@ set(FSPT_MSG_LIB FSPT_MSG) message("fspt c dir is : ${FSPT_C_DIR}") include_directories (${FSPT_C_DIR}) -# add_library(ASYNC_IF -# ${OPENAIR2_DIR}/UTIL/ASYNC_IF/socket_link.c -# ${OPENAIR2_DIR}/UTIL/ASYNC_IF/link_manager.c -# ${OPENAIR2_DIR}/UTIL/ASYNC_IF/message_queue.c -# ${OPENAIR2_DIR}/UTIL/ASYNC_IF/ringbuffer_queue.c -# ) -# set(ASYNC_IF_LIB ASYNC_IF) -# include_directories(${OPENAIR2_DIR}/UTIL/ASYNC_IF) - set(PROTOBUF_LIB "protobuf-c") #set(PROTOBUF_LIB "protobuf") #for Cpp +########### +# Utilities +############### + add_library(HASHTABLE ${OPENAIR_DIR}/common/utils/hashtable/hashtable.c ${OPENAIR_DIR}/common/utils/hashtable/obj_hashtable.c @@ -1935,7 +1955,6 @@ set(L2_SRC ${PDCP_DIR}/pdcp_primitives.c ${PDCP_DIR}/pdcp_util.c ${PDCP_DIR}/pdcp_security.c - ${PDCP_DIR}/pdcp_netlink.c ${OPENAIR2_DIR}/LAYER2/openair2_proc.c # ${RRC_DIR}/rrc_UE.c ${RRC_DIR}/rrc_eNB.c @@ -1990,7 +2009,6 @@ set(L2_SRC_UE ${PDCP_DIR}/pdcp_primitives.c ${PDCP_DIR}/pdcp_util.c ${PDCP_DIR}/pdcp_security.c - ${PDCP_DIR}/pdcp_netlink.c ${RRC_DIR}/rrc_UE.c ${RRC_DIR}/rrc_common.c ${RRC_DIR}/L2_interface_common.c @@ -2530,43 +2548,6 @@ add_library(LIB_5GNAS_GNB ) target_link_libraries(LIB_5GNAS_GNB SECU_CN ${CRYPTO_LIBRARIES}) -# Make lfds as a own source code (even if it is a outside library) -# For better intergration with compilation flags & structure of cmake -################################################################### -set(lfds ${OPENAIR2_DIR}/UTIL/LFDS/liblfds6.1.1/liblfds611/src/) -file(GLOB lfds_queue ${lfds}/lfds611_queue/*.c) -file(GLOB lfds_ring ${lfds}/lfds611_ringbuffer/*.c) -file(GLOB lfds_slist ${lfds}/lfds611_slist/*.c) -file(GLOB lfds_stack ${lfds}/lfds611_stack/*.c) -file(GLOB lfds_freelist ${lfds}/lfds611_freelist/*.c) - -include_directories(${lfds}) -add_library(LFDS - ${lfds_queue} ${lfds_ring} ${lfds_slist} ${lfds_stack} ${lfds_freelist} - ${lfds}/lfds611_liblfds/lfds611_liblfds_abstraction_test_helpers.c - ${lfds}/lfds611_liblfds/lfds611_liblfds_aligned_free.c - ${lfds}/lfds611_liblfds/lfds611_liblfds_aligned_malloc.c - ${lfds}/lfds611_abstraction/lfds611_abstraction_free.c - ${lfds}/lfds611_abstraction/lfds611_abstraction_malloc.c -) - -set(lfds7 ${OPENAIR2_DIR}/UTIL/LFDS/liblfds7.0.0/liblfds700/src/) -file(GLOB lfds7_queue ${lfds7}/lfds700_queue/*.c) -file(GLOB lfds7_ring ${lfds7}/lfds700_ringbuffer/*.c) -file(GLOB lfds7_qbss ${lfds7}/lfds700_queue_bounded_singleconsumer_singleproducer/*.c) -file(GLOB lfds7_stack ${lfds7}/lfds700_stack/*.c) -file(GLOB lfds7_freelist ${lfds7}/lfds700_freelist/*.c) -file(GLOB lfds7_btree ${lfds7}/lfds700_btree_addonly_unbalanced/*.c) -file(GLOB lfds7_hash ${lfds7}/lfds700_hash_addonly/*.c) -file(GLOB lfds7_ordered_list ${lfds7}/lfds700_list_addonly_ordered_singlylinked/*.c) -file(GLOB lfds7_unordered_list ${lfds7}/lfds700_list_addonly_singlylinked_unordered/*.c) -file(GLOB lfds7_misc ${lfds7}/lfds700_misc/*.c) - -include_directories(${lfds7}) -add_library(LFDS7 - ${lfds7_queue} ${lfds7_ring} ${lfds7_qbss} ${lfds7_stack} ${lfds7_freelist} ${lfds7_btree} ${lfds7_hash} ${lfds7_ordered_list} ${lfds7_unordered_list} ${lfds7_misc} -) - add_library(SIMU_COMMON ${OPENAIR1_DIR}/SIMULATION/TOOLS/random_channel.c ${OPENAIR1_DIR}/SIMULATION/TOOLS/rangen_double.c @@ -2760,8 +2741,8 @@ add_dependencies(lte-softmodem rrc_flag s1ap_flag x2_flag oai_iqplayer) target_link_libraries (lte-softmodem -Wl,--start-group RRC_LIB NR_RRC_LIB S1AP_LIB S1AP_ENB M2AP_LIB M2AP_ENB X2AP_LIB X2AP_ENB M3AP_LIB M3AP_ENB GTPV1U F1AP_LIB F1AP SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT MME_APP SCHED_LIB SCHED_RU_LIB - PHY_COMMON PHY PHY_RU LFDS L2 L2_LTE NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB MISC_NFAPI_LTE_LIB LFDS7 - ${RAL_LIB} ${NAS_UE_LIB} ITTI ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} ${FSPT_MSG_LIB} + PHY_COMMON PHY PHY_RU L2 L2_LTE NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB MISC_NFAPI_LTE_LIB + ${RAL_LIB} ${NAS_UE_LIB} ITTI ${FLPT_MSG_LIB} ${FLEXRAN_AGENT_LIB} ${FSPT_MSG_LIB} -Wl,--end-group z dl) target_link_libraries (lte-softmodem ${LIBXML2_LIBRARIES}) @@ -2804,8 +2785,8 @@ target_link_libraries (ocp-enb -Wl,--start-group RRC_LIB NR_RRC_LIB S1AP_LIB S1AP_ENB F1AP_LIB F1AP M2AP_LIB M2AP_ENB X2AP_LIB X2AP_ENB M3AP_LIB M3AP_ENB GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT MME_APP SCHED_LIB SCHED_RU_LIB - PHY_COMMON PHY PHY_RU LFDS L2 L2_LTE NFAPI_COMMON_LIB NFAPI_LIB MISC_NFAPI_LTE_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB LFDS7 SIMU_COMMON - ${RAL_LIB} ${NAS_UE_LIB} ITTI ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} ${FSPT_MSG_LIB} + PHY_COMMON PHY PHY_RU L2 L2_LTE NFAPI_COMMON_LIB NFAPI_LIB MISC_NFAPI_LTE_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB SIMU_COMMON + ${RAL_LIB} ${NAS_UE_LIB} ITTI ${FLPT_MSG_LIB} ${FLEXRAN_AGENT_LIB} ${FSPT_MSG_LIB} -Wl,--end-group z dl) target_link_libraries (ocp-enb ${LIBXML2_LIBRARIES} pthread m ${CONFIG_LIBRARIES} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} sctp ${PROTOBUF_LIB} ${CMAKE_DL_LIBS} ${LIBYAML_LIBRARIES} ${LIB_LMS_LIBRARIES} ${T_LIB}) @@ -2870,8 +2851,8 @@ target_link_libraries (lte-uesoftmodem -Wl,--start-group RRC_LIB NR_RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB X2AP_ENB M2AP_LIB M2AP_ENB M3AP_LIB M3AP_ENB SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT MME_APP SCHED_RU_LIB SCHED_UE_LIB PHY_COMMON - PHY_UE PHY_RU LFDS L2_UE L2_LTE LFDS7 SIMU_COMMON SIMU NFAPI_COMMON_LIB NFAPI_LIB NFAPI_PNF_LIB NFAPI_USER_LIB MISC_NFAPI_LTE_LIB - ${RAL_LIB} ${NAS_UE_LIB} ITTI ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${ATLAS_LIBRARIES} + PHY_UE PHY_RU L2_UE L2_LTE SIMU_COMMON SIMU NFAPI_COMMON_LIB NFAPI_LIB NFAPI_PNF_LIB NFAPI_USER_LIB MISC_NFAPI_LTE_LIB + ${RAL_LIB} ${NAS_UE_LIB} ITTI ${FLPT_MSG_LIB} ${ATLAS_LIBRARIES} -Wl,--end-group z dl) target_link_libraries (lte-uesoftmodem ${LIBXML2_LIBRARIES}) @@ -2913,8 +2894,8 @@ add_executable(nr-softmodem target_link_libraries (nr-softmodem -Wl,--start-group - UTIL HASHTABLE SCTP_CLIENT SCHED_LIB SCHED_RU_LIB SCHED_NR_LIB PHY_NR PHY PHY_COMMON PHY_NR_COMMON PHY_RU LFDS GTPV1U SECU_CN SECU_OSA - ITTI ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} LFDS7 ${RAL_LIB} ${NAS_UE_LIB} RRC_LIB NR_RRC_LIB + UTIL HASHTABLE SCTP_CLIENT SCHED_LIB SCHED_RU_LIB SCHED_NR_LIB PHY_NR PHY PHY_COMMON PHY_NR_COMMON PHY_RU GTPV1U SECU_CN SECU_OSA + ITTI ${FLPT_MSG_LIB} ${FLEXRAN_AGENT_LIB} ${RAL_LIB} ${NAS_UE_LIB} RRC_LIB NR_RRC_LIB NGAP_LIB NGAP_GNB S1AP_LIB S1AP_ENB L2_LTE_NR L2_NR MAC_NR_COMMON NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB X2AP_LIB X2AP_ENB F1AP_LIB F1AP M2AP_LIB M2AP_ENB M3AP_LIB M3AP_ENB ${FSPT_MSG_LIB} -Wl,--end-group z dl) @@ -2953,8 +2934,8 @@ add_executable(ocp-gnb target_link_libraries (ocp-gnb -Wl,--start-group - UTIL HASHTABLE SCTP_CLIENT SCHED_LIB SCHED_RU_LIB SCHED_NR_LIB PHY_NR PHY PHY_COMMON PHY_NR_COMMON PHY_RU LFDS GTPV1U SECU_CN SECU_OSA - ITTI ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} LFDS7 ${RAL_LIB} ${NAS_UE_LIB} RRC_LIB NR_RRC_LIB + UTIL HASHTABLE SCTP_CLIENT SCHED_LIB SCHED_RU_LIB SCHED_NR_LIB PHY_NR PHY PHY_COMMON PHY_NR_COMMON PHY_RU GTPV1U SECU_CN SECU_OSA + ITTI ${FLPT_MSG_LIB} ${RAL_LIB} ${NAS_UE_LIB} RRC_LIB NR_RRC_LIB NGAP_LIB NGAP_GNB S1AP_LIB S1AP_ENB L2_LTE_NR L2_NR MAC_NR_COMMON NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB X2AP_LIB X2AP_ENB F1AP_LIB F1AP M2AP_LIB M2AP_ENB M3AP_LIB M3AP_ENB SIMU_COMMON -Wl,--end-group z dl) @@ -2998,11 +2979,11 @@ add_executable(nr-uesoftmodem target_link_libraries (nr-uesoftmodem -Wl,--start-group RRC_LIB NR_RRC_LIB NGAP_LIB NGAP_GNB SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT SCHED_RU_LIB SCHED_UE_LIB SCHED_NR_UE_LIB - PHY_COMMON PHY_NR_COMMON PHY_UE PHY_NR_UE PHY_RU LFDS NR_L2_UE L2_UE_LTE_NR MAC_NR_COMMON NFAPI_COMMON_LIB NFAPI_LIB NFAPI_PNF_LIB + PHY_COMMON PHY_NR_COMMON PHY_UE PHY_NR_UE PHY_RU NR_L2_UE L2_UE_LTE_NR MAC_NR_COMMON NFAPI_COMMON_LIB NFAPI_LIB NFAPI_PNF_LIB NFAPI_USER_LIB MISC_NFAPI_NR_LIB S1AP_LIB S1AP_ENB - ${RAL_LIB} ${NAS_UE_LIB} ITTI ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} LFDS7 ${ATLAS_LIBRARIES} + ${RAL_LIB} ${NAS_UE_LIB} ITTI ${FLPT_MSG_LIB} ${ATLAS_LIBRARIES} NFAPI_USER_LIB S1AP_LIB S1AP_ENB - ${RAL_LIB} ${NAS_UE_LIB} ITTI ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} LFDS7 ${ATLAS_LIBRARIES} LIB_5GNAS_GNB LIB_NAS_SIMUE ${NAS_SIM_LIB} + ${RAL_LIB} ${NAS_UE_LIB} ITTI ${FLPT_MSG_LIB} ${ATLAS_LIBRARIES} LIB_5GNAS_GNB LIB_NAS_SIMUE ${NAS_SIM_LIB} -Wl,--end-group z dl) target_link_libraries (nr-uesoftmodem ${LIBXML2_LIBRARIES}) @@ -3032,7 +3013,7 @@ add_executable(dlsim_tm4 ${T_SOURCE} ) target_link_libraries (dlsim_tm4 - -Wl,--start-group SIMU_COMMON SIMU UTIL SCHED_LIB SCHED_RU_LIB PHY LFDS ITTI -Wl,--end-group + -Wl,--start-group SIMU_COMMON SIMU UTIL SCHED_LIB SCHED_RU_LIB PHY ITTI -Wl,--end-group pthread m rt ${CONFIG_LIB} ${ATLAS_LIBRARIES} ${T_LIB} ) @@ -3236,7 +3217,7 @@ foreach(myExe dlsim dlsim_tm7 ulsim pbchsim scansim mbmssim pdcchsim pucchsim pr ${NFAPI_USER_DIR}/nfapi.c ) target_link_libraries (${myExe} - -Wl,--start-group SIMU_COMMON SIMU UTIL SCHED_LIB SCHED_RU_LIB SCHED_UE_LIB PHY_COMMON PHY_NR_COMMON PHY PHY_UE PHY_RU LFDS ITTI LFDS7 -Wl,--end-group + -Wl,--start-group SIMU_COMMON SIMU UTIL SCHED_LIB SCHED_RU_LIB SCHED_UE_LIB PHY_COMMON PHY_NR_COMMON PHY PHY_UE PHY_RU ITTI -Wl,--end-group pthread m rt ${CONFIG_LIB} ${ATLAS_LIBRARIES} ${XFORMS_LIBRARIES} ${T_LIB} dl ) @@ -3251,7 +3232,7 @@ add_executable(test_epc_generate_scenario ${OPENAIR3_DIR}/S1AP/s1ap_eNB_defs.h ) target_link_libraries (test_epc_generate_scenario - -Wl,--start-group RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB X2AP_ENB M2AP_LIB M2AP_ENB M3AP_LIB M3AP_ENB F1AP_LIB F1AP GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT MME_APP SCHED_LIB PHY LFDS ITTI L2 -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${LIBXSLT_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${CONFIG_LIB} + -Wl,--start-group RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB X2AP_ENB M2AP_LIB M2AP_ENB M3AP_LIB M3AP_ENB F1AP_LIB F1AP GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT MME_APP SCHED_LIB PHY ITTI L2 -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${LIBXSLT_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${CONFIG_LIB} ) add_executable(test_epc_play_scenario @@ -3270,7 +3251,7 @@ add_executable(test_epc_play_scenario ) target_include_directories(test_epc_play_scenario PUBLIC /usr/local/share/asn1c) target_link_libraries (test_epc_play_scenario - -Wl,--start-group RRC_LIB S1AP_LIB X2AP_LIB X2AP_ENB M3AP_LIB M3AP_ENB F1AP_LIB F1AP GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT MME_APP SCHED_LIB PHY_NR_COMMON PHY_COMMON PHY PHY_UE LFDS ITTI -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${LIBXSLT_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${CONFIG_LIB} + -Wl,--start-group RRC_LIB S1AP_LIB X2AP_LIB X2AP_ENB M3AP_LIB M3AP_ENB F1AP_LIB F1AP GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT MME_APP SCHED_LIB PHY_NR_COMMON PHY_COMMON PHY PHY_UE ITTI -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${LIBXSLT_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${CONFIG_LIB} ) @@ -3290,7 +3271,7 @@ foreach(myExe s1ap ${OPENAIR3_DIR}/TEST/test_${myExe}.c ) target_link_libraries (test_${myExe} - -Wl,--start-group SECU_CN UTIL LFDS -Wl,--end-group m rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${CONFIG_LIB} + -Wl,--start-group SECU_CN UTIL -Wl,--end-group m rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${CONFIG_LIB} ) endforeach(myExe) @@ -3311,12 +3292,12 @@ if (${T_TRACER}) ITTI RRC_LIB NR_RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB X2AP_ENB M2AP_LIB M2AP_ENB M3AP_LIB M3AP_ENB F1AP_LIB F1AP params_libconfig oai_exmimodevif oai_usrpdevif oai_bladerfdevif oai_lmssdrdevif oai_iqplayer oai_eth_transpro oai_mobipass tcp_bridge tcp_bridge_oai - coding FLPT_MSG ASYNC_IF FLEXRAN_AGENT HASHTABLE UTIL OMG_SUMO + coding FLPT_MSG FLEXRAN_AGENT HASHTABLE UTIL OMG_SUMO SECU_OSA SECU_CN SCHED_LIB SCHED_NR_LIB SCHED_RU_LIB SCHED_UE_LIB SCHED_NR_UE_LIB default_sched remote_sched RAL NFAPI_COMMON_LIB NFAPI_LIB NFAPI_PNF_LIB NFAPI_VNF_LIB NFAPI_USER_LIB PHY_COMMON PHY PHY_UE PHY_NR PHY_NR_COMMON PHY_NR_UE PHY_RU PHY_MEX L2 L2_LTE L2_NR L2_LTE_NR L2_UE NR_L2_UE L2_UE_LTE_NR MAC_NR_COMMON MAC_NR MAC_UE_NR NGAP_GNB - CN_UTILS GTPV1U SCTP_CLIENT MME_APP LIB_NAS_UE NB_IoT LFDS LFDS7 SIMU_COMMON SIMU SIMU_ETH OPENAIR0_LIB + CN_UTILS GTPV1U SCTP_CLIENT MME_APP LIB_NAS_UE NB_IoT SIMU_COMMON SIMU SIMU_ETH OPENAIR0_LIB ldpc_orig ldpc_optim ldpc_optim8seg ldpc dfts) if (TARGET ${i}) add_dependencies(${i} generate_T) @@ -3424,8 +3405,8 @@ add_executable(nr-ittisim target_link_libraries (nr-ittisim -Wl,--start-group - UTIL HASHTABLE SCTP_CLIENT SCHED_LIB SCHED_RU_LIB SCHED_NR_LIB PHY_NR PHY PHY_COMMON PHY_NR_COMMON PHY_RU LFDS GTPV1U SECU_CN SECU_OSA - ITTI ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} LFDS7 ${RAL_LIB} ${NAS_SIM_LIB} RRC_LIB NR_RRC_LIB + UTIL HASHTABLE SCTP_CLIENT SCHED_LIB SCHED_RU_LIB SCHED_NR_LIB PHY_NR PHY PHY_COMMON PHY_NR_COMMON PHY_RU GTPV1U SECU_CN SECU_OSA + ITTI ${FLPT_MSG_LIB} ${FLEXRAN_AGENT_LIB} ${RAL_LIB} ${NAS_SIM_LIB} RRC_LIB NR_RRC_LIB NGAP_LIB NGAP_GNB S1AP_LIB S1AP_ENB L2_LTE_NR L2_NR MAC_NR_COMMON NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB X2AP_LIB X2AP_ENB F1AP_LIB F1AP M2AP_LIB M2AP_ENB M3AP_LIB M3AP_ENB ${FSPT_MSG_LIB} PHY_NR_UE SCHED_NR_UE_LIB NR_L2_UE diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/building.txt b/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/building.txt deleted file mode 100644 index 56b4be609f..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/building.txt +++ /dev/null @@ -1,40 +0,0 @@ -building liblfds -================ - -Windows (user-mode) -=================== -1. Use Microsoft Visual Studio 2008 or Visual C++ 2008 Express Edition (or - later versions) to load "liblfds.sln". The "Win32" platform is x86, - the "x64" platform is x64. - -2. Use Microsoft Windows SDK and GNUmake to run makefile.windows (obviously - you'll need to have run setenv.bat or the appropriate vcvars*.bat first; - you can build for x64/64-bit and x86/32-bit - just run the correct batch - file). - - Targets are "librel", "libdbg", "dllrel", "dlldbg" and "clean". You need - to clean between switching targets. - -Windows (kernel) -================ -Use the Windows Driver Kit "build" command. Prior to running "build", -if you wish to build a static library, run the batch file -"runme_before_win_kernel_static_lib_build.bat"; if you wish to -build a dynamic library, instead run "runme_before_win_kernel_dynamic_lib_build.bat". - -The Windows kernel build system is rather limited and rather than -really rather messing up the directory/file structure just for the -Windows kernel platform, I've instead arranged it that these batch -files do the necessary work so that "build" will work. - -The batch files are idempotent; you can run them as often as you -like, in any order, at any time (before or after builds), and they'll -do the right thing. You need to clean between switching targets. - -Linux -===== -Use GNUmake to run "makefile.linux". Targets are "arrel", "ardbg", -"sorel", "sodbg" and "clean". You need to clean between switching -targets. - - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/dirs b/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/dirs deleted file mode 100644 index 0be5295378..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/dirs +++ /dev/null @@ -1,2 +0,0 @@ -DIRS = src - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/inc/liblfds611.h b/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/inc/liblfds611.h deleted file mode 100644 index f2c05ee5e3..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/inc/liblfds611.h +++ /dev/null @@ -1,334 +0,0 @@ -#ifndef __LIBLFDS611_H - -/***** library header *****/ -#define LFDS611_RELEASE_NUMBER_STRING "6.1.1" - - - - -/***** lfds611_abstraction *****/ - -/***** defines *****/ -#if (defined _WIN64 && defined _MSC_VER && !defined WIN_KERNEL_BUILD) -// TRD : 64-bit Windows user-mode with the Microsoft C compiler, any CPU -#include -#include -#include -#include -#include -typedef unsigned __int64 lfds611_atom_t; -#define LFDS611_INLINE __forceinline -#define LFDS611_ALIGN(alignment) __declspec( align(alignment) ) -#define LFDS611_ALIGN_SINGLE_POINTER 8 -#define LFDS611_ALIGN_DOUBLE_POINTER 16 -#define LFDS611_BARRIER_COMPILER_LOAD _ReadBarrier() -#define LFDS611_BARRIER_COMPILER_STORE _WriteBarrier() -#define LFDS611_BARRIER_COMPILER_FULL _ReadWriteBarrier() -#define LFDS611_BARRIER_PROCESSOR_LOAD _mm_lfence() -#define LFDS611_BARRIER_PROCESSOR_STORE _mm_sfence() -#define LFDS611_BARRIER_PROCESSOR_FULL _mm_mfence() -#endif - -#if (!defined _WIN64 && defined _WIN32 && defined _MSC_VER && !defined WIN_KERNEL_BUILD) -// TRD : 32-bit Windows user-mode with the Microsoft C compiler, any CPU -#include -#include -#include -#include -#include -typedef unsigned long int lfds611_atom_t; -#define LFDS611_INLINE __forceinline -#define LFDS611_ALIGN(alignment) __declspec( align(alignment) ) -#define LFDS611_ALIGN_SINGLE_POINTER 4 -#define LFDS611_ALIGN_DOUBLE_POINTER 8 -#define LFDS611_BARRIER_COMPILER_LOAD _ReadBarrier() -#define LFDS611_BARRIER_COMPILER_STORE _WriteBarrier() -#define LFDS611_BARRIER_COMPILER_FULL _ReadWriteBarrier() -#define LFDS611_BARRIER_PROCESSOR_LOAD _mm_lfence() -#define LFDS611_BARRIER_PROCESSOR_STORE _mm_sfence() -#define LFDS611_BARRIER_PROCESSOR_FULL _mm_mfence() - -// TRD : this define is documented but missing in Microsoft Platform SDK v7.0 -#define _InterlockedCompareExchangePointer(destination, exchange, compare) _InterlockedCompareExchange((volatile long *) destination, (long) exchange, (long) compare) -#endif - -#if (defined _WIN64 && defined _MSC_VER && defined WIN_KERNEL_BUILD) -// TRD : 64-bit Windows kernel with the Microsoft C compiler, any CPU -#include -#include -#include -#include -typedef unsigned __int64 lfds611_atom_t; -#define LFDS611_INLINE __forceinline -#define LFDS611_ALIGN(alignment) __declspec( align(alignment) ) -#define LFDS611_ALIGN_SINGLE_POINTER 8 -#define LFDS611_ALIGN_DOUBLE_POINTER 16 -#define LFDS611_BARRIER_COMPILER_LOAD _ReadBarrier() -#define LFDS611_BARRIER_COMPILER_STORE _WriteBarrier() -#define LFDS611_BARRIER_COMPILER_FULL _ReadWriteBarrier() -#define LFDS611_BARRIER_PROCESSOR_LOAD _mm_lfence() -#define LFDS611_BARRIER_PROCESSOR_STORE _mm_sfence() -#define LFDS611_BARRIER_PROCESSOR_FULL _mm_mfence() -#endif - -#if (!defined _WIN64 && defined _WIN32 && defined _MSC_VER && defined WIN_KERNEL_BUILD) -// TRD : 32-bit Windows kernel with the Microsoft C compiler, any CPU -#include -#include -#include -#include -typedef unsigned long int lfds611_atom_t; -#define LFDS611_INLINE __forceinline -#define LFDS611_ALIGN(alignment) __declspec( align(alignment) ) -#define LFDS611_ALIGN_SINGLE_POINTER 4 -#define LFDS611_ALIGN_DOUBLE_POINTER 8 -#define LFDS611_BARRIER_COMPILER_LOAD _ReadBarrier() -#define LFDS611_BARRIER_COMPILER_STORE _WriteBarrier() -#define LFDS611_BARRIER_COMPILER_FULL _ReadWriteBarrier() -#define LFDS611_BARRIER_PROCESSOR_LOAD _mm_lfence() -#define LFDS611_BARRIER_PROCESSOR_STORE _mm_sfence() -#define LFDS611_BARRIER_PROCESSOR_FULL _mm_mfence() - -// TRD : this define is documented but missing in Microsoft Platform SDK v7.0 -#define _InterlockedCompareExchangePointer(destination, exchange, compare) _InterlockedCompareExchange((volatile long *) destination, (long) exchange, (long) compare) -#endif - -#if (defined __unix__ && defined __x86_64__ && __GNUC__) -// TRD : any UNIX with GCC on x64 -#include -#include -#include -typedef unsigned long long int lfds611_atom_t; -#define LFDS611_INLINE inline -#define LFDS611_ALIGN(alignment) __attribute__( (aligned(alignment)) ) -#define LFDS611_ALIGN_SINGLE_POINTER 8 -#define LFDS611_ALIGN_DOUBLE_POINTER 16 -#define LFDS611_BARRIER_COMPILER_LOAD __asm__ __volatile__ ( "" : : : "memory" ) -#define LFDS611_BARRIER_COMPILER_STORE __asm__ __volatile__ ( "" : : : "memory" ) -#define LFDS611_BARRIER_COMPILER_FULL __asm__ __volatile__ ( "" : : : "memory" ) -#define LFDS611_BARRIER_PROCESSOR_LOAD __sync_synchronize() -#define LFDS611_BARRIER_PROCESSOR_STORE __sync_synchronize() -#define LFDS611_BARRIER_PROCESSOR_FULL __sync_synchronize() -#endif - -#if (defined __unix__ && defined __i386__ && __GNUC__) -// TRD : any UNIX with GCC on x86 -#include -#include -#include -typedef unsigned long int lfds611_atom_t; -#define LFDS611_INLINE inline -#define LFDS611_ALIGN(alignment) __attribute__( (aligned(alignment)) ) -#define LFDS611_ALIGN_SINGLE_POINTER 4 -#define LFDS611_ALIGN_DOUBLE_POINTER 8 -#define LFDS611_BARRIER_COMPILER_LOAD __asm__ __volatile__ ( "" : : : "memory" ) -#define LFDS611_BARRIER_COMPILER_STORE __asm__ __volatile__ ( "" : : : "memory" ) -#define LFDS611_BARRIER_COMPILER_FULL __asm__ __volatile__ ( "" : : : "memory" ) -#define LFDS611_BARRIER_PROCESSOR_LOAD __sync_synchronize() -#define LFDS611_BARRIER_PROCESSOR_STORE __sync_synchronize() -#define LFDS611_BARRIER_PROCESSOR_FULL __sync_synchronize() -#endif - -#if (defined __unix__ && defined __arm__ && __GNUC__) -// TRD : any UNIX with GCC on ARM -#include -#include -#include -typedef unsigned long int lfds611_atom_t; -#define LFDS611_INLINE inline -#define LFDS611_ALIGN(alignment) __attribute__( (aligned(alignment)) ) -#define LFDS611_ALIGN_SINGLE_POINTER 4 -#define LFDS611_ALIGN_DOUBLE_POINTER 8 -#define LFDS611_BARRIER_COMPILER_LOAD __asm__ __volatile__ ( "" : : : "memory" ) -#define LFDS611_BARRIER_COMPILER_STORE __asm__ __volatile__ ( "" : : : "memory" ) -#define LFDS611_BARRIER_COMPILER_FULL __asm__ __volatile__ ( "" : : : "memory" ) -#define LFDS611_BARRIER_PROCESSOR_LOAD __sync_synchronize() -#define LFDS611_BARRIER_PROCESSOR_STORE __sync_synchronize() -#define LFDS611_BARRIER_PROCESSOR_FULL __sync_synchronize() -#endif - -#define LFDS611_BARRIER_LOAD LFDS611_BARRIER_COMPILER_LOAD; LFDS611_BARRIER_PROCESSOR_LOAD; LFDS611_BARRIER_COMPILER_LOAD -#define LFDS611_BARRIER_STORE LFDS611_BARRIER_COMPILER_STORE; LFDS611_BARRIER_PROCESSOR_STORE; LFDS611_BARRIER_COMPILER_STORE -#define LFDS611_BARRIER_FULL LFDS611_BARRIER_COMPILER_FULL; LFDS611_BARRIER_PROCESSOR_FULL; LFDS611_BARRIER_COMPILER_FULL - -/***** enums *****/ -enum lfds611_data_structure_validity { - LFDS611_VALIDITY_VALID, - LFDS611_VALIDITY_INVALID_LOOP, - LFDS611_VALIDITY_INVALID_MISSING_ELEMENTS, - LFDS611_VALIDITY_INVALID_ADDITIONAL_ELEMENTS, - LFDS611_VALIDITY_INVALID_TEST_DATA -}; - -/***** structs *****/ -struct lfds611_validation_info { - lfds611_atom_t - min_elements, - max_elements; -}; - -/***** public prototypes *****/ -void *lfds611_abstraction_malloc( size_t size ); -void lfds611_abstraction_free( void *memory ); - - - - - -/***** lfds611_freelist *****/ - -/***** enums *****/ -enum lfds611_freelist_query_type { - LFDS611_FREELIST_QUERY_ELEMENT_COUNT, - LFDS611_FREELIST_QUERY_VALIDATE -}; - -/***** incomplete types *****/ -struct lfds611_freelist_state; -struct lfds611_freelist_element; - -/***** public prototypes *****/ -int lfds611_freelist_new( struct lfds611_freelist_state **fs, lfds611_atom_t number_elements, int (*user_data_init_function)(void **user_data, void *user_state), void *user_state ); -void lfds611_freelist_use( struct lfds611_freelist_state *fs ); -void lfds611_freelist_delete( struct lfds611_freelist_state *fs, void (*user_data_delete_function)(void *user_data, void *user_state), void *user_state ); - -lfds611_atom_t lfds611_freelist_new_elements( struct lfds611_freelist_state *fs, lfds611_atom_t number_elements ); - -struct lfds611_freelist_element *lfds611_freelist_pop( struct lfds611_freelist_state *fs, struct lfds611_freelist_element **fe ); -struct lfds611_freelist_element *lfds611_freelist_guaranteed_pop( struct lfds611_freelist_state *fs, struct lfds611_freelist_element **fe ); -void lfds611_freelist_push( struct lfds611_freelist_state *fs, struct lfds611_freelist_element *fe ); - -void *lfds611_freelist_get_user_data_from_element( struct lfds611_freelist_element *fe, void **user_data ); -void lfds611_freelist_set_user_data_in_element( struct lfds611_freelist_element *fe, void *user_data ); - -void lfds611_freelist_query( struct lfds611_freelist_state *fs, enum lfds611_freelist_query_type query_type, void *query_input, void *query_output ); - - - - - -/***** lfds611_liblfds *****/ - -/***** public prototypes *****/ -void lfds611_liblfds_abstraction_test_helper_increment_non_atomic( lfds611_atom_t *shared_counter ); -void lfds611_liblfds_abstraction_test_helper_increment_atomic( volatile lfds611_atom_t *shared_counter ); -void lfds611_liblfds_abstraction_test_helper_cas( volatile lfds611_atom_t *shared_counter, lfds611_atom_t *local_counter ); -void lfds611_liblfds_abstraction_test_helper_dcas( volatile lfds611_atom_t *shared_counter, lfds611_atom_t *local_counter ); - - - - - -/***** lfds611_queue *****/ - -/***** enums *****/ -enum lfds611_queue_query_type { - LFDS611_QUEUE_QUERY_ELEMENT_COUNT, - LFDS611_QUEUE_QUERY_VALIDATE -}; - -/***** incomplete types *****/ -struct lfds611_queue_state; - -/***** public prototypes *****/ -int lfds611_queue_new( struct lfds611_queue_state **sq, lfds611_atom_t number_elements ); -void lfds611_queue_use( struct lfds611_queue_state *qs ); -void lfds611_queue_delete( struct lfds611_queue_state *qs, void (*user_data_delete_function)(void *user_data, void *user_state), void *user_state ); - -int lfds611_queue_enqueue( struct lfds611_queue_state *qs, void *user_data ); -int lfds611_queue_guaranteed_enqueue( struct lfds611_queue_state *qs, void *user_data ); -int lfds611_queue_dequeue( struct lfds611_queue_state *qs, void **user_data ); - -void lfds611_queue_query( struct lfds611_queue_state *qs, enum lfds611_queue_query_type query_type, void *query_input, void *query_output ); - - - - - -/***** lfds611_ringbuffer *****/ - -/***** enums *****/ -enum lfds611_ringbuffer_query_type { - LFDS611_RINGBUFFER_QUERY_VALIDATE -}; - -/***** incomplete types *****/ -struct lfds611_ringbuffer_state; - -/***** public prototypes *****/ -int lfds611_ringbuffer_new( struct lfds611_ringbuffer_state **rs, lfds611_atom_t number_elements, int (*user_data_init_function)(void **user_data, void *user_state), void *user_state ); -void lfds611_ringbuffer_use( struct lfds611_ringbuffer_state *rs ); -void lfds611_ringbuffer_delete( struct lfds611_ringbuffer_state *rs, void (*user_data_delete_function)(void *user_data, void *user_state), void *user_state ); - -struct lfds611_freelist_element *lfds611_ringbuffer_get_read_element( struct lfds611_ringbuffer_state *rs, struct lfds611_freelist_element **fe ); -struct lfds611_freelist_element *lfds611_ringbuffer_get_write_element( struct lfds611_ringbuffer_state *rs, struct lfds611_freelist_element **fe, int *overwrite_flag ); - -void lfds611_ringbuffer_put_read_element( struct lfds611_ringbuffer_state *rs, struct lfds611_freelist_element *fe ); -void lfds611_ringbuffer_put_write_element( struct lfds611_ringbuffer_state *rs, struct lfds611_freelist_element *fe ); - -void lfds611_ringbuffer_query( struct lfds611_ringbuffer_state *rs, enum lfds611_ringbuffer_query_type query_type, void *query_input, void *query_output ); - - - - - -/***** lfds611_slist *****/ - -/***** incomplete types *****/ -struct lfds611_slist_state; -struct lfds611_slist_element; - -/***** public prototypes *****/ -int lfds611_slist_new( struct lfds611_slist_state **ss, void (*user_data_delete_function)(void *user_data, void *user_state), void *user_state ); -void lfds611_slist_use( struct lfds611_slist_state *ss ); -void lfds611_slist_delete( struct lfds611_slist_state *ss ); - -struct lfds611_slist_element *lfds611_slist_new_head( struct lfds611_slist_state *ss, void *user_data ); -struct lfds611_slist_element *lfds611_slist_new_next( struct lfds611_slist_element *se, void *user_data ); - -int lfds611_slist_logically_delete_element( struct lfds611_slist_state *ss, struct lfds611_slist_element *se ); -void lfds611_slist_single_threaded_physically_delete_all_elements( struct lfds611_slist_state *ss ); - -int lfds611_slist_get_user_data_from_element( struct lfds611_slist_element *se, void **user_data ); -int lfds611_slist_set_user_data_in_element( struct lfds611_slist_element *se, void *user_data ); - -struct lfds611_slist_element *lfds611_slist_get_head( struct lfds611_slist_state *ss, struct lfds611_slist_element **se ); -struct lfds611_slist_element *lfds611_slist_get_next( struct lfds611_slist_element *se, struct lfds611_slist_element **next_se ); -struct lfds611_slist_element *lfds611_slist_get_head_and_then_next( struct lfds611_slist_state *ss, struct lfds611_slist_element **se ); - - - - - -/***** lfds611_stack *****/ - -/***** enums *****/ -enum lfds611_stack_query_type { - LFDS611_STACK_QUERY_ELEMENT_COUNT, - LFDS611_STACK_QUERY_VALIDATE -}; - -/***** incomplete types *****/ -struct lfds611_stack_state; - -/***** public prototypes *****/ -int lfds611_stack_new( struct lfds611_stack_state **ss, lfds611_atom_t number_elements ); -void lfds611_stack_use( struct lfds611_stack_state *ss ); -void lfds611_stack_delete( struct lfds611_stack_state *ss, void (*user_data_delete_function)(void *user_data, void *user_state), void *user_state ); - -void lfds611_stack_clear( struct lfds611_stack_state *ss, void (*user_data_clear_function)(void *user_data, void *user_state), void *user_state ); - -int lfds611_stack_push( struct lfds611_stack_state *ss, void *user_data ); -int lfds611_stack_guaranteed_push( struct lfds611_stack_state *ss, void *user_data ); -int lfds611_stack_pop( struct lfds611_stack_state *ss, void **user_data ); - -void lfds611_stack_query( struct lfds611_stack_state *ss, enum lfds611_stack_query_type query_type, void *query_input, void *query_output ); - - - - - -#define __LIBLFDS611_H - -#endif - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/liblfds611.def b/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/liblfds611.def deleted file mode 100644 index b9c92b0cf9..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/liblfds611.def +++ /dev/null @@ -1,57 +0,0 @@ -EXPORTS - -lfds611_liblfds_abstraction_test_helper_increment_non_atomic = lfds611_liblfds_abstraction_test_helper_increment_non_atomic @1 -lfds611_liblfds_abstraction_test_helper_increment_atomic = lfds611_liblfds_abstraction_test_helper_increment_atomic @2 -lfds611_liblfds_abstraction_test_helper_cas = lfds611_liblfds_abstraction_test_helper_cas @3 -lfds611_liblfds_abstraction_test_helper_dcas = lfds611_liblfds_abstraction_test_helper_dcas @4 - -lfds611_freelist_delete = lfds611_freelist_delete @5 -lfds611_freelist_get_user_data_from_element = lfds611_freelist_get_user_data_from_element @6 -lfds611_freelist_guaranteed_pop = lfds611_freelist_guaranteed_pop @7 -lfds611_freelist_new = lfds611_freelist_new @8 -lfds611_freelist_new_elements = lfds611_freelist_new_elements @9 -lfds611_freelist_pop = lfds611_freelist_pop @10 -lfds611_freelist_push = lfds611_freelist_push @11 -lfds611_freelist_query = lfds611_freelist_query @12 -lfds611_freelist_set_user_data_in_element = lfds611_freelist_set_user_data_in_element @13 -lfds611_freelist_use = lfds611_freelist_use @14 - -lfds611_queue_delete = lfds611_queue_delete @15 -lfds611_queue_dequeue = lfds611_queue_dequeue @16 -lfds611_queue_enqueue = lfds611_queue_enqueue @17 -lfds611_queue_guaranteed_enqueue = lfds611_queue_guaranteed_enqueue @18 -lfds611_queue_new = lfds611_queue_new @19 -lfds611_queue_query = lfds611_queue_query @20 -lfds611_queue_use = lfds611_queue_use @21 - -lfds611_ringbuffer_delete = lfds611_ringbuffer_delete @22 -lfds611_ringbuffer_get_read_element = lfds611_ringbuffer_get_read_element @23 -lfds611_ringbuffer_get_write_element = lfds611_ringbuffer_get_write_element @24 -lfds611_ringbuffer_new = lfds611_ringbuffer_new @25 -lfds611_ringbuffer_put_read_element = lfds611_ringbuffer_put_read_element @26 -lfds611_ringbuffer_put_write_element = lfds611_ringbuffer_put_write_element @27 -lfds611_ringbuffer_query = lfds611_ringbuffer_query @28 -lfds611_ringbuffer_use = lfds611_ringbuffer_use @29 - -lfds611_slist_delete = lfds611_slist_delete @30 -lfds611_slist_get_head = lfds611_slist_get_head @31 -lfds611_slist_get_head_and_then_next = lfds611_slist_get_head_and_then_next @32 -lfds611_slist_get_next = lfds611_slist_get_next @33 -lfds611_slist_get_user_data_from_element = lfds611_slist_get_user_data_from_element @34 -lfds611_slist_logically_delete_element = lfds611_slist_logically_delete_element @35 -lfds611_slist_new = lfds611_slist_new @36 -lfds611_slist_new_head = lfds611_slist_new_head @37 -lfds611_slist_new_next = lfds611_slist_new_next @38 -lfds611_slist_set_user_data_in_element = lfds611_slist_set_user_data_in_element @39 -lfds611_slist_single_threaded_physically_delete_all_elements = lfds611_slist_single_threaded_physically_delete_all_elements @40 -lfds611_slist_use = lfds611_slist_use @41 - -lfds611_stack_clear = lfds611_stack_clear @42 -lfds611_stack_delete = lfds611_stack_delete @43 -lfds611_stack_guaranteed_push = lfds611_stack_guaranteed_push @44 -lfds611_stack_new = lfds611_stack_new @45 -lfds611_stack_pop = lfds611_stack_pop @46 -lfds611_stack_push = lfds611_stack_push @47 -lfds611_stack_query = lfds611_stack_query @48 -lfds611_stack_use = lfds611_stack_use @49 - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/liblfds611.sln b/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/liblfds611.sln deleted file mode 100644 index de51b657c4..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/liblfds611.sln +++ /dev/null @@ -1,38 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 10.00 -# Visual Studio 2008 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "liblfds611", "liblfds611.vcproj", "{F73AE755-F6D8-4C3A-977D-FBB40DC0ED05}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug DLL|Win32 = Debug DLL|Win32 - Debug DLL|x64 = Debug DLL|x64 - Debug Lib|Win32 = Debug Lib|Win32 - Debug Lib|x64 = Debug Lib|x64 - Release DLL|Win32 = Release DLL|Win32 - Release DLL|x64 = Release DLL|x64 - Release Lib|Win32 = Release Lib|Win32 - Release Lib|x64 = Release Lib|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {F73AE755-F6D8-4C3A-977D-FBB40DC0ED05}.Debug DLL|Win32.ActiveCfg = Debug DLL|Win32 - {F73AE755-F6D8-4C3A-977D-FBB40DC0ED05}.Debug DLL|Win32.Build.0 = Debug DLL|Win32 - {F73AE755-F6D8-4C3A-977D-FBB40DC0ED05}.Debug DLL|x64.ActiveCfg = Debug DLL|x64 - {F73AE755-F6D8-4C3A-977D-FBB40DC0ED05}.Debug DLL|x64.Build.0 = Debug DLL|x64 - {F73AE755-F6D8-4C3A-977D-FBB40DC0ED05}.Debug Lib|Win32.ActiveCfg = Debug Lib|Win32 - {F73AE755-F6D8-4C3A-977D-FBB40DC0ED05}.Debug Lib|Win32.Build.0 = Debug Lib|Win32 - {F73AE755-F6D8-4C3A-977D-FBB40DC0ED05}.Debug Lib|x64.ActiveCfg = Debug Lib|x64 - {F73AE755-F6D8-4C3A-977D-FBB40DC0ED05}.Debug Lib|x64.Build.0 = Debug Lib|x64 - {F73AE755-F6D8-4C3A-977D-FBB40DC0ED05}.Release DLL|Win32.ActiveCfg = Release DLL|Win32 - {F73AE755-F6D8-4C3A-977D-FBB40DC0ED05}.Release DLL|Win32.Build.0 = Release DLL|Win32 - {F73AE755-F6D8-4C3A-977D-FBB40DC0ED05}.Release DLL|x64.ActiveCfg = Release DLL|x64 - {F73AE755-F6D8-4C3A-977D-FBB40DC0ED05}.Release DLL|x64.Build.0 = Release DLL|x64 - {F73AE755-F6D8-4C3A-977D-FBB40DC0ED05}.Release Lib|Win32.ActiveCfg = Release Lib|Win32 - {F73AE755-F6D8-4C3A-977D-FBB40DC0ED05}.Release Lib|Win32.Build.0 = Release Lib|Win32 - {F73AE755-F6D8-4C3A-977D-FBB40DC0ED05}.Release Lib|x64.ActiveCfg = Release Lib|x64 - {F73AE755-F6D8-4C3A-977D-FBB40DC0ED05}.Release Lib|x64.Build.0 = Release Lib|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/liblfds611.vcproj b/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/liblfds611.vcproj deleted file mode 100644 index 96d5028eb8..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/liblfds611.vcproj +++ /dev/null @@ -1,800 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/makefile.linux b/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/makefile.linux deleted file mode 100644 index 2655d8ec5e..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/makefile.linux +++ /dev/null @@ -1,111 +0,0 @@ -##### paths ##### -OUTDIR := . -BINDIR = $(OUTDIR)/bin -OBJDIR = $(OUTDIR)/obj -INCDIR = inc -SRCDIR = src - -##### misc ##### -QUIETLY = 1>/dev/null 2>/dev/null - -##### sources, objects and libraries ##### -BINNAME = liblfds611 -AR_BINARY = $(BINDIR)/$(BINNAME).a -$(info $(AR_BINARY)) -SO_BINARY = $(BINDIR)/$(BINNAME).so -SRCDIRS = lfds611_abstraction lfds611_freelist lfds611_liblfds lfds611_queue lfds611_ringbuffer lfds611_slist lfds611_stack -# TRD : be aware - in the linux makefile, with the one-pass linking behaviour of the GNU linker, the order -# of source files matters! this is because it leads to the ordering of objects in the library and -# that in turn, since the data structures all use the freelist API and the abstraction API, has to be -# correct -# TRD : lfds611_abstraction_cas.c lfds611_abstraction_dcas.c lfds611_abstraction_increment.c are inlined and are compiled by every C file -SOURCES = lfds611_queue_delete.c lfds611_queue_new.c lfds611_queue_query.c lfds611_queue_queue.c \ - lfds611_ringbuffer_delete.c lfds611_ringbuffer_get_and_put.c lfds611_ringbuffer_new.c lfds611_ringbuffer_query.c \ - lfds611_slist_delete.c lfds611_slist_get_and_set.c lfds611_slist_link.c lfds611_slist_new.c \ - lfds611_stack_delete.c lfds611_stack_new.c lfds611_stack_push_pop.c lfds611_stack_query.c \ - lfds611_freelist_delete.c lfds611_freelist_get_and_set.c lfds611_freelist_new.c lfds611_freelist_query.c lfds611_freelist_pop_push.c \ - lfds611_liblfds_abstraction_test_helpers.c lfds611_liblfds_aligned_free.c lfds611_liblfds_aligned_malloc.c \ - lfds611_abstraction_free.c lfds611_abstraction_malloc.c -OBJECTS = $(patsubst %.c,$(OBJDIR)/%.o,$(notdir $(SOURCES))) - -##### CPU variants ##### -UNAME = $(shell uname -m) -GCCARCH = -march=$(UNAME) - -ifeq ($(UNAME),x86_64) - GCCARCH = -march=core2 -endif - -ifeq ($(findstring arm,$(UNAME)),arm) - GCCARCH = -march=armv6k -marm -endif - -##### tools ##### -MAKE = make -MFLAGS = - -DG = gcc -DGFLAGS = -MM -std=c99 -I"$(SRCDIR)" -I"$(INCDIR)" - -CC = gcc -CBASE = -Wall -Wno-unknown-pragmas -std=c99 $(GCCARCH) -pthread -c -I"$(SRCDIR)" -I"$(INCDIR)" -CFREL = -O2 -finline-functions -Wno-strict-aliasing -CFDBG = -O0 -g - -AR = ar -AFLAGS = -rcs - -LD = gcc -LFBASE = -Wall -std=c99 -shared -LFREL = -O2 -s -LFDBG = -O0 -g - -##### rel/dbg .a/.so variants ##### -ifeq ($(findstring so,$(MAKECMDGOALS)),so) - CBASE := $(CBASE) -fpic -endif - -CFLAGS = $(CBASE) $(CFDBG) -LFLAGS = $(LFBASE) $(LFDBG) - -ifeq ($(findstring rel,$(MAKECMDGOALS)),rel) - CFLAGS = $(CBASE) $(CFREL) - LFLAGS = $(LFBASE) $(LFREL) -endif - -##### search paths ##### -vpath %.c $(patsubst %,$(SRCDIR)/%:,$(SRCDIRS)) - -##### implicit rules ##### -$(OBJDIR)/%.o : %.c - @echo "Compiling $<" - @$(DG) $(DGFLAGS) $< >$(OBJDIR)/$*.d - @$(CC) $(CFLAGS) -o $@ $< - -##### explicit rules ##### -$(AR_BINARY) : $(OBJECTS) - @echo "Creating $(AR_BINARY)" - @$(AR) $(AFLAGS) $(AR_BINARY) $(OBJECTS) - -$(SO_BINARY) : $(OBJECTS) - @echo "Creating $(SO_BINARY)" - $(LD) $(LFLAGS) $(SYSLIBS) $(OBJECTS) -o $(SO_BINARY) - -##### phony ##### -.PHONY : clean arrel ardbg sorel sodbg - -clean : - @rm -f $(BINDIR)/$(BINNAME).* $(OBJDIR)/*.o $(OBJDIR)/*.d - -arrel : $(AR_BINARY) -ardbg : $(AR_BINARY) - -sorel : $(SO_BINARY) -sodbg : $(SO_BINARY) - -##### dependencies ##### --include $(DEPENDS) - -##### notes ##### -# TRD : we use -std=c99 purely to permit C++ style comments - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/makefile.windows b/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/makefile.windows deleted file mode 100644 index 9948e7cea7..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/makefile.windows +++ /dev/null @@ -1,97 +0,0 @@ -##### paths ##### -BINDIR = bin -INCDIR = inc -OBJDIR = obj -SRCDIR = src - -##### misc ##### -QUIETLY = 1>nul 2>nul - -##### sources, objects and libraries ##### -BINNAME = liblfds611 -LIB_BINARY = $(BINDIR)\$(BINNAME).lib -DLL_BINARY = $(BINDIR)\$(BINNAME).dll -SRCDIRS = lfds611_abstraction lfds611_freelist lfds611_liblfds lfds611_queue lfds611_ringbuffer lfds611_slist lfds611_stack -# TRD : lfds611_abstraction_cas.c lfds611_abstraction_dcas.c lfds611_abstraction_increment.c are inlined and are compiled by every C file -SOURCES = lfds611_abstraction_free.c lfds611_abstraction_malloc.c \ - lfds611_freelist_delete.c lfds611_freelist_get_and_set.c lfds611_freelist_new.c lfds611_freelist_query.c lfds611_freelist_pop_push.c \ - lfds611_liblfds_abstraction_test_helpers.c lfds611_liblfds_aligned_free.c lfds611_liblfds_aligned_malloc.c \ - lfds611_queue_delete.c lfds611_queue_new.c lfds611_queue_query.c lfds611_queue_queue.c \ - lfds611_ringbuffer_delete.c lfds611_ringbuffer_get_and_put.c lfds611_ringbuffer_new.c lfds611_ringbuffer_query.c \ - lfds611_slist_delete.c lfds611_slist_get_and_set.c lfds611_slist_link.c lfds611_slist_new.c \ - lfds611_stack_delete.c lfds611_stack_new.c lfds611_stack_push_pop.c lfds611_stack_query.c -OBJECTS = $(patsubst %.c,$(OBJDIR)/%.obj,$(notdir $(SOURCES))) -SYSLIBS = kernel32.lib - -##### tools ##### -MAKE = make -MFLAGS = - -CC = cl -CBASE = /nologo /W4 /WX /c "-I$(SRCDIR)" "-I$(INCDIR)" "/Fd$(BINDIR)\$(BINNAME).pdb" /DUNICODE /D_UNICODE /DWIN32_LEAN_AND_MEAN -CFREL = /Ox /DNDEBUG -CFDBG = /Od /Gm /Zi /D_DEBUG - -AR = lib -AFLAGS = /nologo /subsystem:console /wx /verbose - -LD = link -LFBASE = /dll /def:$(BINNAME).def /nologo /subsystem:console /wx /nodefaultlib /nxcompat -LFREL = /incremental:no -LFDBG = /debug "/pdb:$(BINDIR)\$(BINNAME).pdb" - -##### variants ##### -CFLAGS = $(CBASE) $(CFDBG) /MTd -LFLAGS = $(LFBASE) $(LFDBG) -CLIB = libcmtd.lib - -ifeq ($(MAKECMDGOALS),librel) - CFLAGS = $(CBASE) $(CFREL) /MT - LFLAGS = $(LFBASE) $(LFREL) - CLIB = libcmt.lib -endif - -ifeq ($(MAKECMDGOALS),libdbg) - CFLAGS = $(CBASE) $(CFDBG) /MTd - LFLAGS = $(LFBASE) $(LFDBG) - CLIB = libcmtd.lib -endif - -ifeq ($(MAKECMDGOALS),dllrel) - CFLAGS = $(CBASE) $(CFREL) /MD - LFLAGS = $(LFBASE) $(LFREL) - CLIB = msvcrt.lib -endif - -ifeq ($(MAKECMDGOALS),dlldbg) - CFLAGS = $(CBASE) $(CFDBG) /MDd - LFLAGS = $(LFBASE) $(LFDBG) - CLIB = msvcrtd.lib -endif - -##### search paths ##### -vpath %.c $(patsubst %,$(SRCDIR)/%;,$(SRCDIRS)) - -##### implicit rules ##### -$(OBJDIR)/%.obj : %.c - $(CC) $(CFLAGS) "/Fo$@" $< - -##### explicit rules ##### -$(LIB_BINARY) : $(OBJECTS) - $(AR) $(AFLAGS) $(OBJECTS) /out:$(LIB_BINARY) - -$(DLL_BINARY) : $(OBJECTS) - $(LD) $(LFLAGS) $(CLIB) $(SYSLIBS) $(OBJECTS) /out:$(DLL_BINARY) - -##### phony ##### -.PHONY : clean librel libdbg dllrel dlldbg - -clean : - @erase /Q $(BINDIR)\$(BINNAME).* $(OBJDIR)\*.obj $(QUIETLY) - -librel : $(LIB_BINARY) -libdbg : $(LIB_BINARY) - -dllrel : $(DLL_BINARY) -dlldbg : $(DLL_BINARY) - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/readme.txt b/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/readme.txt deleted file mode 100644 index cbe196238c..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/readme.txt +++ /dev/null @@ -1,147 +0,0 @@ -introduction -============ -Welcome to liblfds, a portable, license-free, lock-free data structure library -written in C. - -supported platforms -=================== -Out-of-the-box ports are provided for; - -Operating System CPU Toolchain Choices -================ ============= ================= -Windows 64-bit x64 1. Microsoft Visual Studio - 2. Microsoft Windows SDK and GNUmake - -Windows 32-bit x64, x86 1. Microsoft Visual Studio - 2. Visual C++ Express Edition - 3. Microsoft Windows SDK and GNUmake - -Windows Kernel x64, x86 1. Windows Driver Kit - -Linux 64-bit x64 1. GCC and GNUmake - -Linux 32-bit ARM, x64, x86 1. GCC and GNUmake - -For more information including version requirements, see the building guide (lfds). - -data structures -=============== -This release of liblfds provides the following; - - * Freelist - * Queue - * Ringbuffer (each element read by a single reader) - * Singly-linked list (logical delete only) - * Stack - -These are all many-readers, many-writers. - -liblfds on-line -=============== -On the liblfds home page, you will find the blog, a bugzilla, a forum, a -mediawiki and the current and all historical releases. - -The mediawiki contains comprehensive documentation for development, building, -testing and porting. - -http://www.liblfds.org - -license -======= -There is no license. You are free to use this code in any way. - -using -===== -Once built, there is a single header file, /inc/liblfds.h, which you must include -in your source code, and a single library file /bin/liblfds.*, where the suffix -depends on your platform and your build choice (static or dynamic), to which, -if statically built, you must link directly or, if dynamically built, you must -arrange your system such that the library can be found by the loader at run-time. - -testing -======= -The library comes with a command line test and benchmark program. This program -requires threads. As such, it is only suitable for platforms which can execute -a command line binary and provide thread support. Currently this means the test -and benchmark program works for all platforms except the Windows Kernel. - -For documentation, see the testing and benchmarking guide in the mediawiki. - -porting -======= -Both the test program and liblfds provide an abstraction layer which acts to -mask platform differences. Porting is the act of implementing on your platform -the functions which make up the abstraction layers. You do not need to port -the test program to port liblfds, but obviously it is recommended, so you can -test your port. - -To support liblfds, your platform MUST support; - - * atomic single-word* increment - * atomic single-word compare-and-swap - * atomic contiguous double-word compare-and-swap* - * malloc and free - * compiler directive for alignment of variables declared on the stack - * compiler directives for compiler barriers and processor barriers - -* A ''word'' here means a type equal in length to the platform pointer size. -* This requirement excludes the Alpha, IA64, MIPS, PowerPC and SPARC platforms. - -Also, your platform MAY support; - - * compiler keyword for function inlining - -To support the test programme, your platform MUST support; - - * determining the number of logical cores - * threads (starting and waiting on for completion) - -For documentation, see the porting guide (lfds) in the mediawiki. - -release history -=============== -release 1, 25th September 2009, svn revision 1574. - - initial release - -release 2, 5th October 2009, svn revision 1599. - - added abstraction layer for Windows kernel - - minor code tidyups/fixes - -release 3, 25th October 2009, svn revision 1652. - - added singly linked list (logical delete only) - - minor code tidyups/fixes - -release 4, 7th December 2009, svn revision 1716. - - added ARM support - - added benchmarking functionality to the test program - - fixed a profound and pervasive pointer - declaration bug; earlier releases of liblfds - *should not be used* - -release 5, 19th December 2009, svn revision 1738. - - fixed subtle queue bug, which also affected ringbuffer - and caused data re-ordering under high load - - added benchmarks for freelist, ringbuffer and stack - -release 6, 29th December 2009, svn revision 1746. - - fixed two implementation errors, which reduced performance, - spotted by Codeplug from "http://cboard.cprogramming.com". - -release 6.0.0, 18th December 2012, svn revision 2537 - - introduction of namespaces, e.g. the "lfds600_" prefix - code otherwise COMPLETELY AND WHOLLY UNCHANGED - this release is a stepping-stone to 6.1.0 - -release 6.0.1, 2nd January 2013, svn revision 3296 - - bug fix where an enum wasn't moved into the new namespacing policy - -release 6.1.0, 31th December 2012, svn revision 2600 - - fixed all existing non-enhancement bugs - - discovered some new bugs and fixed them too - - a very few minor changes/enhancements - -release 6.1.1, 2nd January 2013, svn revision 3297 - - crucial bug fix where compiler barriers for atomic operations - were not brought over from 7.0.0 during backporting - - minor fix for abstraction tests, two missing store barriers - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/runme_before_win_kernel_build_readme.txt b/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/runme_before_win_kernel_build_readme.txt deleted file mode 100644 index d7087ecd48..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/runme_before_win_kernel_build_readme.txt +++ /dev/null @@ -1,32 +0,0 @@ -The Windows kernel build environment is primitive and has a number -of severe limitations; in particular, all source files must be in -one directory and it is not possible to choose the output binary type -(static or dynamic library) from the build command line; rather, -a string has to be modified in a text file used by the build (!) - -To deal with these limitations, it is necessary for a Windows kernel -build to run a batch file prior to building. - -There are two batch files, one for static library builds and the other -for dynamic library builds. - -They are both idempotent; you can run them as often as you like and -switch between them as often as you want. It's all fine; whenever -you run one of them, it will take you from whatever state you were -previously in, into the state you want to be in. - -Both batch files copy all the sources file into a single directory, -"/src/single_dir_for_windows_kernel/". - -The static library batch file will then copy "/sources.static" into -"/src/single_dir_for_windows_kernel/", which will cause a static -library to be built. - -The dynamic library batch file will then copy "/sources.dynamic" into -"/src/single_dir_for_windows_kernel/", which will cause a dynamic -library to be built. It will also copy "src/driver_entry.c" into -"/src/single_dir_for_windows_kernel/", since the linker requires -the DriverEntry function to exist for dynamic libraries, even -though it's not used. - - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/runme_before_win_kernel_dynamic_lib_build.bat b/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/runme_before_win_kernel_dynamic_lib_build.bat deleted file mode 100644 index 6a9f68b428..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/runme_before_win_kernel_dynamic_lib_build.bat +++ /dev/null @@ -1,15 +0,0 @@ -@echo off -rmdir /q /s src\single_dir_for_windows_kernel 1>nul 2>nul -mkdir src\single_dir_for_windows_kernel 1>nul 2>nul -copy /y src\lfds611_abstraction\* src\single_dir_for_windows_kernel 1>nul 2>nul -copy /y src\lfds611_freelist\* src\single_dir_for_windows_kernel 1>nul 2>nul -copy /y src\lfds611_liblfds\* src\single_dir_for_windows_kernel 1>nul 2>nul -copy /y src\lfds611_queue\* src\single_dir_for_windows_kernel 1>nul 2>nul -copy /y src\lfds611_ringbuffer\* src\single_dir_for_windows_kernel 1>nul 2>nul -copy /y src\lfds611_slist\* src\single_dir_for_windows_kernel 1>nul 2>nul -copy /y src\lfds611_stack\* src\single_dir_for_windows_kernel 1>nul 2>nul -copy /y sources.dynamic src\single_dir_for_windows_kernel\sources 1>nul 2>nul -copy /y src\driver_entry.c src\single_dir_for_windows_kernel 1>nul 2>nul -echo Windows kernel dynamic library build directory structure created. -echo (Note the effects of this batch file are idempotent). - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/runme_before_win_kernel_static_lib_build.bat b/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/runme_before_win_kernel_static_lib_build.bat deleted file mode 100644 index a3b9362b0e..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/runme_before_win_kernel_static_lib_build.bat +++ /dev/null @@ -1,15 +0,0 @@ -@echo off -rmdir /q /s src\single_dir_for_windows_kernel 1>nul 2>nul -mkdir src\single_dir_for_windows_kernel 1>nul 2>nul -copy /y src\lfds611_abstraction\* src\single_dir_for_windows_kernel 1>nul 2>nul -copy /y src\lfds611_freelist\* src\single_dir_for_windows_kernel 1>nul 2>nul -copy /y src\lfds611_liblfds\* src\single_dir_for_windows_kernel 1>nul 2>nul -copy /y src\lfds611_queue\* src\single_dir_for_windows_kernel 1>nul 2>nul -copy /y src\lfds611_ringbuffer\* src\single_dir_for_windows_kernel 1>nul 2>nul -copy /y src\lfds611_slist\* src\single_dir_for_windows_kernel 1>nul 2>nul -copy /y src\lfds611_stack\* src\single_dir_for_windows_kernel 1>nul 2>nul -copy /y sources.static src\single_dir_for_windows_kernel\sources 1>nul 2>nul -erase /f src\single_dir_for_windows_kernel\driver_entry.c 1>nul 2>nul -echo Windows kernel static library build directory structure created. -echo (Note the effects of this batch file are idempotent). - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/sources.dynamic b/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/sources.dynamic deleted file mode 100644 index 0ed73dc06e..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/sources.dynamic +++ /dev/null @@ -1,37 +0,0 @@ -MSC_WARNING_LEVEL = /WX /W4 -DLLDEF = ../../liblfds611.def -TARGETNAME = liblfds611 -TARGETPATH = ../../bin/ -TARGETTYPE = EXPORT_DRIVER -UMTYPE = nt -USER_C_FLAGS = /DWIN_KERNEL_BUILD - -INCLUDES = ..;../../inc/ -SOURCES = lfds611_abstraction_free.c \ - lfds611_abstraction_malloc.c \ - lfds611_freelist_delete.c \ - lfds611_freelist_get_and_set.c \ - lfds611_freelist_new.c \ - lfds611_freelist_pop_push.c \ - lfds611_freelist_query.c \ - lfds611_liblfds_abstraction_test_helpers.c \ - lfds611_liblfds_aligned_free.c \ - lfds611_liblfds_aligned_malloc.c \ - lfds611_queue_delete.c \ - lfds611_queue_new.c \ - lfds611_queue_query.c \ - lfds611_queue_queue.c \ - lfds611_ringbuffer_delete.c \ - lfds611_ringbuffer_get_and_put.c \ - lfds611_ringbuffer_new.c \ - lfds611_ringbuffer_query.c \ - lfds611_slist_delete.c \ - lfds611_slist_get_and_set.c \ - lfds611_slist_link.c \ - lfds611_slist_new.c \ - lfds611_stack_delete.c \ - lfds611_stack_new.c \ - lfds611_stack_push_pop.c \ - lfds611_stack_query.c \ - driver_entry.c - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/sources.static b/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/sources.static deleted file mode 100644 index 64965033ed..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/sources.static +++ /dev/null @@ -1,35 +0,0 @@ -MSC_WARNING_LEVEL = /WX /W4 -TARGETNAME = liblfds611 -TARGETPATH = ../../bin/ -TARGETTYPE = DRIVER_LIBRARY -UMTYPE = nt -USER_C_FLAGS = /DWIN_KERNEL_BUILD - -INCLUDES = ..;../../inc/ -SOURCES = lfds611_abstraction_free.c \ - lfds611_abstraction_malloc.c \ - lfds611_freelist_delete.c \ - lfds611_freelist_get_and_set.c \ - lfds611_freelist_new.c \ - lfds611_freelist_pop_push.c \ - lfds611_freelist_query.c \ - lfds611_liblfds_abstraction_test_helpers.c \ - lfds611_liblfds_aligned_free.c \ - lfds611_liblfds_aligned_malloc.c \ - lfds611_queue_delete.c \ - lfds611_queue_new.c \ - lfds611_queue_query.c \ - lfds611_queue_queue.c \ - lfds611_ringbuffer_delete.c \ - lfds611_ringbuffer_get_and_put.c \ - lfds611_ringbuffer_new.c \ - lfds611_ringbuffer_query.c \ - lfds611_slist_delete.c \ - lfds611_slist_get_and_set.c \ - lfds611_slist_link.c \ - lfds611_slist_new.c \ - lfds611_stack_delete.c \ - lfds611_stack_new.c \ - lfds611_stack_push_pop.c \ - lfds611_stack_query.c - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/dirs b/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/dirs deleted file mode 100644 index 64e002cc57..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/dirs +++ /dev/null @@ -1,3 +0,0 @@ -DIRS = single_dir_for_windows_kernel - - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/driver_entry.c b/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/driver_entry.c deleted file mode 100644 index a2dac56f2d..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/driver_entry.c +++ /dev/null @@ -1,16 +0,0 @@ -#include "liblfds611_internal.h" - - - - - -/****************************************************************************/ -#pragma warning( disable : 4100 ) - -NTSTATUS DriverEntry( struct _DRIVER_OBJECT *DriverObject, PUNICODE_STRING RegistryPath ) -{ - return( STATUS_SUCCESS ); -} - -#pragma warning( default : 4100 ) - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/driver_entry_readme.txt b/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/driver_entry_readme.txt deleted file mode 100644 index a3979772f2..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/driver_entry_readme.txt +++ /dev/null @@ -1,4 +0,0 @@ -This C file (driver_entry.c) is used when building a dynamic library for -the Windows kernel. It exists to work around one of the limitations of -that build environment. It is not used by any other build; just ignore it. - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_abstraction/lfds611_abstraction_cas.c b/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_abstraction/lfds611_abstraction_cas.c deleted file mode 100644 index ed3d7d7d26..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_abstraction/lfds611_abstraction_cas.c +++ /dev/null @@ -1,71 +0,0 @@ -#include "lfds611_abstraction_internal_body.h" - - - - - -/****************************************************************************/ -#if (defined _WIN32 && defined _MSC_VER) - -/* TRD : 64 bit and 32 bit Windows (user-mode or kernel) on any CPU with the Microsoft C compiler - - _WIN32 indicates 64-bit or 32-bit Windows - _MSC_VER indicates Microsoft C compiler -*/ - -static LFDS611_INLINE lfds611_atom_t lfds611_abstraction_cas( volatile lfds611_atom_t *destination, lfds611_atom_t exchange, lfds611_atom_t compare ) -{ - lfds611_atom_t - rv; - - assert( destination != NULL ); - // TRD : exchange can be any value in its range - // TRD : compare can be any value in its range - - LFDS611_BARRIER_COMPILER_FULL; - - rv = (lfds611_atom_t) _InterlockedCompareExchangePointer( (void * volatile *) destination, (void *) exchange, (void *) compare ); - - LFDS611_BARRIER_COMPILER_FULL; - - return( rv ); -} - -#endif - - - - - -/****************************************************************************/ -#if (__GNUC__ >= 4 && __GNUC_MINOR__ >= 1 && __GNUC_PATCHLEVEL__ >= 0) - -/* TRD : any OS on any CPU with GCC 4.1.0 or better - - GCC 4.1.0 introduced the __sync_*() atomic intrinsics - - __GNUC__ / __GNUC_MINOR__ / __GNUC_PATCHLEVEL__ indicates GCC and which version -*/ - -static LFDS611_INLINE lfds611_atom_t lfds611_abstraction_cas( volatile lfds611_atom_t *destination, lfds611_atom_t exchange, lfds611_atom_t compare ) -{ - lfds611_atom_t - rv; - - assert( destination != NULL ); - // TRD : exchange can be any value in its range - // TRD : compare can be any value in its range - - // TRD : note the different argument order for the GCC instrinsic to the MSVC instrinsic - - LFDS611_BARRIER_COMPILER_FULL; - - rv = (lfds611_atom_t) __sync_val_compare_and_swap( destination, compare, exchange ); - - LFDS611_BARRIER_COMPILER_FULL; - - return( rv ); -} - -#endif - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_abstraction/lfds611_abstraction_dcas.c b/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_abstraction/lfds611_abstraction_dcas.c deleted file mode 100644 index 61f243735b..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_abstraction/lfds611_abstraction_dcas.c +++ /dev/null @@ -1,157 +0,0 @@ -#include "lfds611_abstraction_internal_body.h" - - - - - -/****************************************************************************/ -#if (defined _WIN64 && defined _MSC_VER) - -/* TRD : 64 bit Windows (user-mode or kernel) on any CPU with the Microsoft C compiler - - _WIN64 indicates 64 bit Windows - _MSC_VER indicates Microsoft C compiler -*/ - -static LFDS611_INLINE unsigned char lfds611_abstraction_dcas( volatile lfds611_atom_t *destination, lfds611_atom_t *exchange, lfds611_atom_t *compare ) -{ - unsigned char - cas_result; - - assert( destination != NULL ); - assert( exchange != NULL ); - assert( compare != NULL ); - - LFDS611_BARRIER_COMPILER_FULL; - - cas_result = _InterlockedCompareExchange128( (volatile __int64 *) destination, (__int64) *(exchange+1), (__int64) *exchange, (__int64 *) compare ); - - LFDS611_BARRIER_COMPILER_FULL; - - return( cas_result ) ; -} - -#endif - - - - - -/****************************************************************************/ -#if (!defined _WIN64 && defined _WIN32 && defined _MSC_VER) - -/* TRD : 32 bit Windows (user-mode or kernel) on any CPU with the Microsoft C compiler - - (!defined _WIN64 && defined _WIN32) indicates 32 bit Windows - _MSC_VER indicates Microsoft C compiler -*/ - -static LFDS611_INLINE unsigned char lfds611_abstraction_dcas( volatile lfds611_atom_t *destination, lfds611_atom_t *exchange, lfds611_atom_t *compare ) -{ - __int64 - original_compare; - - assert( destination != NULL ); - assert( exchange != NULL ); - assert( compare != NULL ); - - *(__int64 *) &original_compare = *(__int64 *) compare; - - LFDS611_BARRIER_COMPILER_FULL; - - *(__int64 *) compare = _InterlockedCompareExchange64( (volatile __int64 *) destination, *(__int64 *) exchange, *(__int64 *) compare ); - - LFDS611_BARRIER_COMPILER_FULL; - - return( (unsigned char) (*(__int64 *) compare == *(__int64 *) &original_compare) ); -} - -#endif - - - - - -/****************************************************************************/ -#if (defined __x86_64__ && defined __GNUC__) - -/* TRD : any OS on x64 with GCC - - __x86_64__ indicates x64 - __GNUC__ indicates GCC -*/ - -static LFDS611_INLINE unsigned char lfds611_abstraction_dcas( volatile lfds611_atom_t *destination, lfds611_atom_t *exchange, lfds611_atom_t *compare ) -{ - unsigned char - cas_result; - - assert( destination != NULL ); - assert( exchange != NULL ); - assert( compare != NULL ); - - // TRD : __asm__ with "memory" in the clobber list is for GCC a full compiler barrier - __asm__ __volatile__ - ( - "lock;" // make cmpxchg16b atomic - "cmpxchg16b %0;" // cmpxchg16b sets ZF on success - "setz %3;" // if ZF set, set cas_result to 1 - - // output - : "+m" (*(volatile lfds611_atom_t (*)[2]) destination), "+a" (*compare), "+d" (*(compare+1)), "=q" (cas_result) - - // input - : "b" (*exchange), "c" (*(exchange+1)) - - // clobbered - : "cc", "memory" - ); - - return( cas_result ); -} - -#endif - - - - - -/****************************************************************************/ -#if ((defined __i686__ || defined __arm__) && __GNUC__ >= 4 && __GNUC_MINOR__ >= 1 && __GNUC_PATCHLEVEL__ >= 0) - -/* TRD : any OS on x86 or ARM with GCC 4.1.0 or better - - GCC 4.1.0 introduced the __sync_*() atomic intrinsics - - __GNUC__ / __GNUC_MINOR__ / __GNUC_PATCHLEVEL__ indicates GCC and which version -*/ - -static LFDS611_INLINE unsigned char lfds611_abstraction_dcas( volatile lfds611_atom_t *destination, lfds611_atom_t *exchange, lfds611_atom_t *compare ) -{ - unsigned char - cas_result = 0; - - unsigned long long int - original_destination; - - assert( destination != NULL ); - assert( exchange != NULL ); - assert( compare != NULL ); - - LFDS611_BARRIER_COMPILER_FULL; - - original_destination = __sync_val_compare_and_swap( (volatile unsigned long long int *) destination, *(unsigned long long int *) compare, *(unsigned long long int *) exchange ); - - LFDS611_BARRIER_COMPILER_FULL; - - if( original_destination == *(unsigned long long int *) compare ) - cas_result = 1; - - *(unsigned long long int *) compare = original_destination; - - return( cas_result ); -} - -#endif - - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_abstraction/lfds611_abstraction_free.c b/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_abstraction/lfds611_abstraction_free.c deleted file mode 100644 index e582374c98..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_abstraction/lfds611_abstraction_free.c +++ /dev/null @@ -1,44 +0,0 @@ -#include "lfds611_abstraction_internal_wrapper.h" - - - - - -/****************************************************************************/ -#if (!defined WIN_KERNEL_BUILD) - -/* TRD : any OS except Windows kernel on any CPU with any compiler - - !WIN_KERNEL_BUILD indicates not Windows kernel -*/ - -void lfds611_abstraction_free( void *memory ) -{ - free( memory ); - - return; -} - -#endif - - - - - -/****************************************************************************/ -#if (defined WIN_KERNEL_BUILD) - -/* TRD : any Windows (kernel) on any CPU with the Microsoft C compiler - - WIN_KERNEL_BUILD indicates Windows kernel -*/ - -void lfds611_abstraction_free( void *memory ) -{ - ExFreePoolWithTag( memory, 'sdfl' ); - - return; -} - -#endif - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_abstraction/lfds611_abstraction_increment.c b/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_abstraction/lfds611_abstraction_increment.c deleted file mode 100644 index 4cdd068d02..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_abstraction/lfds611_abstraction_increment.c +++ /dev/null @@ -1,98 +0,0 @@ -#include "lfds611_abstraction_internal_body.h" - - - - - -/****************************************************************************/ -#if (defined _WIN64 && defined _MSC_VER) - -/* TRD : 64 bit Windows (user-mode or kernel) on any CPU with the Microsoft C compiler - - _WIN64 indicates 64 bit Windows - _MSC_VER indicates Microsoft C compiler -*/ - -static LFDS611_INLINE lfds611_atom_t lfds611_abstraction_increment( volatile lfds611_atom_t *value ) -{ - lfds611_atom_t - rv; - - assert( value != NULL ); - - LFDS611_BARRIER_COMPILER_FULL; - - rv = (lfds611_atom_t) _InterlockedIncrement64( (__int64 *) value ); - - LFDS611_BARRIER_COMPILER_FULL; - - return( rv ); -} - -#endif - - - - - -/****************************************************************************/ -#if (!defined _WIN64 && defined _WIN32 && defined _MSC_VER) - -/* TRD : 32 bit Windows (user-mode or kernel) on any CPU with the Microsoft C compiler - - (!defined _WIN64 && defined _WIN32) indicates 32 bit Windows - _MSC_VER indicates Microsoft C compiler -*/ - -static LFDS611_INLINE lfds611_atom_t lfds611_abstraction_increment( volatile lfds611_atom_t *value ) -{ - lfds611_atom_t - rv; - - assert( value != NULL ); - - LFDS611_BARRIER_COMPILER_FULL; - - rv = (lfds611_atom_t) _InterlockedIncrement( (long int *) value ); - - LFDS611_BARRIER_COMPILER_FULL; - - return( rv ); -} - -#endif - - - - - -/****************************************************************************/ -#if (__GNUC__ >= 4 && __GNUC_MINOR__ >= 1 && __GNUC_PATCHLEVEL__ >= 0) - -/* TRD : any OS on any CPU with GCC 4.1.0 or better - - GCC 4.1.0 introduced the __sync_*() atomic intrinsics - - __GNUC__ / __GNUC_MINOR__ / __GNUC_PATCHLEVEL__ indicates GCC and which version -*/ - -static LFDS611_INLINE lfds611_atom_t lfds611_abstraction_increment( volatile lfds611_atom_t *value ) -{ - lfds611_atom_t - rv; - - assert( value != NULL ); - - // TRD : no need for casting here, GCC has a __sync_add_and_fetch() for all native types - - LFDS611_BARRIER_COMPILER_FULL; - - rv = (lfds611_atom_t) __sync_add_and_fetch( value, 1 ); - - LFDS611_BARRIER_COMPILER_FULL; - - return( rv ); -} - -#endif - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_abstraction/lfds611_abstraction_internal_body.h b/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_abstraction/lfds611_abstraction_internal_body.h deleted file mode 100644 index ac10143514..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_abstraction/lfds611_abstraction_internal_body.h +++ /dev/null @@ -1,2 +0,0 @@ -/***** private prototypes *****/ - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_abstraction/lfds611_abstraction_internal_wrapper.h b/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_abstraction/lfds611_abstraction_internal_wrapper.h deleted file mode 100644 index c9129c2748..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_abstraction/lfds611_abstraction_internal_wrapper.h +++ /dev/null @@ -1,6 +0,0 @@ -/***** the library wide include file *****/ -#include "liblfds611_internal.h" - -/***** the internal header body *****/ -#include "lfds611_abstraction_internal_body.h" - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_abstraction/lfds611_abstraction_malloc.c b/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_abstraction/lfds611_abstraction_malloc.c deleted file mode 100644 index d97b820872..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_abstraction/lfds611_abstraction_malloc.c +++ /dev/null @@ -1,40 +0,0 @@ -#include "lfds611_abstraction_internal_wrapper.h" - - - - - -/****************************************************************************/ -#if (!defined WIN_KERNEL_BUILD) - -/* TRD : any OS except Windows kernel on any CPU with any compiler - - !WIN_KERNEL_BUILD indicates not Windows kernel -*/ - -void *lfds611_abstraction_malloc( size_t size ) -{ - return( malloc(size) ); -} - -#endif - - - - - -/****************************************************************************/ -#if (defined WIN_KERNEL_BUILD) - -/* TRD : any Windows (kernel) on any CPU with the Microsoft C compiler - - WIN_KERNEL_BUILD indicates Windows kernel -*/ - -void *lfds611_abstraction_malloc( size_t size ) -{ - return( ExAllocatePoolWithTag(NonPagedPool, size, 'sdfl') ); -} - -#endif - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_freelist/lfds611_freelist_delete.c b/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_freelist/lfds611_freelist_delete.c deleted file mode 100644 index b5de6f6ac2..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_freelist/lfds611_freelist_delete.c +++ /dev/null @@ -1,35 +0,0 @@ -#include "lfds611_freelist_internal.h" - - - - - -/****************************************************************************/ -void lfds611_freelist_delete( struct lfds611_freelist_state *fs, void (*user_data_delete_function)(void *user_data, void *user_state), void *user_state ) -{ - struct lfds611_freelist_element - *fe; - - void - *user_data; - - assert( fs != NULL ); - // TRD : user_data_delete_function can be NULL - // TRD : user_state can be NULL - - // TRD : leading load barrier not required as it will be performed by the pop - - while( lfds611_freelist_pop(fs, &fe) ) { - if( user_data_delete_function != NULL ) { - lfds611_freelist_get_user_data_from_element( fe, &user_data ); - user_data_delete_function( user_data, user_state ); - } - - lfds611_liblfds_aligned_free( fe ); - } - - lfds611_liblfds_aligned_free( fs ); - - return; -} - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_freelist/lfds611_freelist_get_and_set.c b/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_freelist/lfds611_freelist_get_and_set.c deleted file mode 100644 index 9e5108c5b5..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_freelist/lfds611_freelist_get_and_set.c +++ /dev/null @@ -1,37 +0,0 @@ -#include "lfds611_freelist_internal.h" - - - - - -/****************************************************************************/ -void *lfds611_freelist_get_user_data_from_element( struct lfds611_freelist_element *fe, void **user_data ) -{ - assert( fe != NULL ); - // TRD : user_data can be NULL - - LFDS611_BARRIER_LOAD; - - if( user_data != NULL ) - *user_data = fe->user_data; - - return( fe->user_data ); -} - - - - - -/****************************************************************************/ -void lfds611_freelist_set_user_data_in_element( struct lfds611_freelist_element *fe, void *user_data ) -{ - assert( fe != NULL ); - // TRD : user_data can be NULL - - fe->user_data = user_data; - - LFDS611_BARRIER_STORE; - - return; -} - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_freelist/lfds611_freelist_internal.h b/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_freelist/lfds611_freelist_internal.h deleted file mode 100644 index a593a4d959..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_freelist/lfds611_freelist_internal.h +++ /dev/null @@ -1,40 +0,0 @@ -/***** the library wide include file *****/ -#include "liblfds611_internal.h" - -/***** defines *****/ -#define LFDS611_FREELIST_POINTER 0 -#define LFDS611_FREELIST_COUNTER 1 -#define LFDS611_FREELIST_PAC_SIZE 2 - -/***** structures *****/ -#pragma pack( push, LFDS611_ALIGN_DOUBLE_POINTER ) - -struct lfds611_freelist_state { - struct lfds611_freelist_element - *volatile top[LFDS611_FREELIST_PAC_SIZE]; - - int - (*user_data_init_function)( void **user_data, void *user_state ); - - void - *user_state; - - lfds611_atom_t - aba_counter, - element_count; -}; - -struct lfds611_freelist_element { - struct lfds611_freelist_element - *next[LFDS611_FREELIST_PAC_SIZE]; - - void - *user_data; -}; - -#pragma pack( pop ) - -/***** private prototypes *****/ -lfds611_atom_t lfds611_freelist_internal_new_element( struct lfds611_freelist_state *fs, struct lfds611_freelist_element **fe ); -void lfds611_freelist_internal_validate( struct lfds611_freelist_state *fs, struct lfds611_validation_info *vi, enum lfds611_data_structure_validity *lfds611_freelist_validity ); - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_freelist/lfds611_freelist_new.c b/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_freelist/lfds611_freelist_new.c deleted file mode 100644 index 2eeae80097..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_freelist/lfds611_freelist_new.c +++ /dev/null @@ -1,136 +0,0 @@ -#include "lfds611_freelist_internal.h" - - - - - -/****************************************************************************/ -int lfds611_freelist_new( struct lfds611_freelist_state **fs, lfds611_atom_t number_elements, int (*user_data_init_function)(void **user_data, void *user_state), void *user_state ) -{ - int - rv = 0; - - lfds611_atom_t - element_count; - - assert( fs != NULL ); - // TRD : number_elements can be any value in its range - // TRD : user_data_init_function can be NULL - - *fs = (struct lfds611_freelist_state *) lfds611_liblfds_aligned_malloc( sizeof(struct lfds611_freelist_state), LFDS611_ALIGN_DOUBLE_POINTER ); - - if( (*fs) != NULL ) { - (*fs)->top[LFDS611_FREELIST_POINTER] = NULL; - (*fs)->top[LFDS611_FREELIST_COUNTER] = 0; - (*fs)->user_data_init_function = user_data_init_function; - (*fs)->user_state = user_state; - (*fs)->aba_counter = 0; - (*fs)->element_count = 0; - - element_count = lfds611_freelist_new_elements( *fs, number_elements ); - - if( element_count == number_elements ) - rv = 1; - - if( element_count != number_elements ) { - lfds611_liblfds_aligned_free( (*fs) ); - *fs = NULL; - } - } - - LFDS611_BARRIER_STORE; - - return( rv ); -} - - - - - -/****************************************************************************/ -//#pragma warning( disable : 4100 ) - -void lfds611_freelist_use( struct lfds611_freelist_state *fs ) -{ - assert( fs != NULL ); - - LFDS611_BARRIER_LOAD; - - return; -} - -//#pragma warning( default : 4100 ) - - - - - -/****************************************************************************/ -lfds611_atom_t lfds611_freelist_new_elements( struct lfds611_freelist_state *fs, lfds611_atom_t number_elements ) -{ - struct lfds611_freelist_element - *fe; - - lfds611_atom_t - loop, - count = 0; - - assert( fs != NULL ); - // TRD : number_elements can be any value in its range - // TRD : user_data_init_function can be NULL - - for( loop = 0 ; loop < number_elements ; loop++ ) - if( lfds611_freelist_internal_new_element(fs, &fe) ) { - lfds611_freelist_push( fs, fe ); - count++; - } - - return( count ); -} - - - - - -/****************************************************************************/ -lfds611_atom_t lfds611_freelist_internal_new_element( struct lfds611_freelist_state *fs, struct lfds611_freelist_element **fe ) -{ - lfds611_atom_t - rv = 0; - - assert( fs != NULL ); - assert( fe != NULL ); - - /* TRD : basically, does what you'd expect; - - allocates an element - calls the user init function - if anything fails, cleans up, - sets *fe to NULL - and returns 0 - */ - - *fe = (struct lfds611_freelist_element *) lfds611_liblfds_aligned_malloc( sizeof(struct lfds611_freelist_element), LFDS611_ALIGN_DOUBLE_POINTER ); - - if( *fe != NULL ) { - if( fs->user_data_init_function == NULL ) { - (*fe)->user_data = NULL; - rv = 1; - } - - if( fs->user_data_init_function != NULL ) { - rv = fs->user_data_init_function( &(*fe)->user_data, fs->user_state ); - - if( rv == 0 ) { - lfds611_liblfds_aligned_free( *fe ); - *fe = NULL; - } - } - } - - if( rv == 1 ) - lfds611_abstraction_increment( (lfds611_atom_t *) &fs->element_count ); - - return( rv ); -} - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_freelist/lfds611_freelist_pop_push.c b/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_freelist/lfds611_freelist_pop_push.c deleted file mode 100644 index c0e2282414..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_freelist/lfds611_freelist_pop_push.c +++ /dev/null @@ -1,87 +0,0 @@ -#include "lfds611_freelist_internal.h" - - - - - -/****************************************************************************/ -struct lfds611_freelist_element *lfds611_freelist_pop( struct lfds611_freelist_state *fs, struct lfds611_freelist_element **fe ) -{ - LFDS611_ALIGN(LFDS611_ALIGN_DOUBLE_POINTER) struct lfds611_freelist_element - *fe_local[LFDS611_FREELIST_PAC_SIZE]; - - assert( fs != NULL ); - assert( fe != NULL ); - - LFDS611_BARRIER_LOAD; - - fe_local[LFDS611_FREELIST_COUNTER] = fs->top[LFDS611_FREELIST_COUNTER]; - fe_local[LFDS611_FREELIST_POINTER] = fs->top[LFDS611_FREELIST_POINTER]; - - /* TRD : note that lfds611_abstraction_dcas loads the original value of the destination (fs->top) into the compare (fe_local) - (this happens of course after the CAS itself has occurred inside lfds611_abstraction_dcas) - */ - - do { - if( fe_local[LFDS611_FREELIST_POINTER] == NULL ) { - *fe = NULL; - return( *fe ); - } - } while( 0 == lfds611_abstraction_dcas((volatile lfds611_atom_t *) fs->top, (lfds611_atom_t *) fe_local[LFDS611_FREELIST_POINTER]->next, (lfds611_atom_t *) fe_local) ); - - *fe = (struct lfds611_freelist_element *) fe_local[LFDS611_FREELIST_POINTER]; - - return( *fe ); -} - - - - - -/****************************************************************************/ -struct lfds611_freelist_element *lfds611_freelist_guaranteed_pop( struct lfds611_freelist_state *fs, struct lfds611_freelist_element **fe ) -{ - assert( fs != NULL ); - assert( fe != NULL ); - - lfds611_freelist_internal_new_element( fs, fe ); - - return( *fe ); -} - - - - - -/****************************************************************************/ -void lfds611_freelist_push( struct lfds611_freelist_state *fs, struct lfds611_freelist_element *fe ) -{ - LFDS611_ALIGN(LFDS611_ALIGN_DOUBLE_POINTER) struct lfds611_freelist_element - *fe_local[LFDS611_FREELIST_PAC_SIZE], - *original_fe_next[LFDS611_FREELIST_PAC_SIZE]; - - assert( fs != NULL ); - assert( fe != NULL ); - - LFDS611_BARRIER_LOAD; - - fe_local[LFDS611_FREELIST_POINTER] = fe; - fe_local[LFDS611_FREELIST_COUNTER] = (struct lfds611_freelist_element *) lfds611_abstraction_increment( (lfds611_atom_t *) &fs->aba_counter ); - - original_fe_next[LFDS611_FREELIST_POINTER] = fs->top[LFDS611_FREELIST_POINTER]; - original_fe_next[LFDS611_FREELIST_COUNTER] = fs->top[LFDS611_FREELIST_COUNTER]; - - /* TRD : note that lfds611_abstraction_dcas loads the original value of the destination (fs->top) into the compare (original_fe_next) - (this happens of course after the CAS itself has occurred inside lfds611_abstraction_dcas) - this then causes us in our loop, should we repeat it, to update fe_local->next to a more - up-to-date version of the head of the lfds611_freelist - */ - - do { - fe_local[LFDS611_FREELIST_POINTER]->next[LFDS611_FREELIST_POINTER] = original_fe_next[LFDS611_FREELIST_POINTER]; - fe_local[LFDS611_FREELIST_POINTER]->next[LFDS611_FREELIST_COUNTER] = original_fe_next[LFDS611_FREELIST_COUNTER]; - } while( 0 == lfds611_abstraction_dcas((volatile lfds611_atom_t *) fs->top, (lfds611_atom_t *) fe_local, (lfds611_atom_t *) original_fe_next) ); - - return; -} - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_freelist/lfds611_freelist_query.c b/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_freelist/lfds611_freelist_query.c deleted file mode 100644 index 9e42ee0361..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_freelist/lfds611_freelist_query.c +++ /dev/null @@ -1,110 +0,0 @@ -#include "lfds611_freelist_internal.h" - - - - - -/****************************************************************************/ -void lfds611_freelist_query( struct lfds611_freelist_state *fs, enum lfds611_freelist_query_type query_type, void *query_input, void *query_output ) -{ - assert( fs != NULL ); - // TRD : query type can be any value in its range - // TRD : query_input can be NULL in some cases - assert( query_output != NULL ); - - LFDS611_BARRIER_LOAD; - - switch( query_type ) { - case LFDS611_FREELIST_QUERY_ELEMENT_COUNT: - assert( query_input == NULL ); - - *(lfds611_atom_t *) query_output = fs->element_count; - break; - - case LFDS611_FREELIST_QUERY_VALIDATE: - // TRD : query_input can be NULL - - lfds611_freelist_internal_validate( fs, (struct lfds611_validation_info *) query_input, (enum lfds611_data_structure_validity *) query_output ); - break; - } - - return; -} - - - - - -/****************************************************************************/ -void lfds611_freelist_internal_validate( struct lfds611_freelist_state *fs, struct lfds611_validation_info *vi, enum lfds611_data_structure_validity *lfds611_freelist_validity ) -{ - struct lfds611_freelist_element - *fe, - *fe_slow, - *fe_fast; - - lfds611_atom_t - element_count = 0; - - assert( fs != NULL ); - // TRD : vi can be NULL - assert( lfds611_freelist_validity != NULL ); - - *lfds611_freelist_validity = LFDS611_VALIDITY_VALID; - - fe_slow = fe_fast = (struct lfds611_freelist_element *) fs->top[LFDS611_FREELIST_POINTER]; - - /* TRD : first, check for a loop - we have two pointers - both of which start at the top of the lfds611_freelist - we enter a loop - and on each iteration - we advance one pointer by one element - and the other by two - - we exit the loop when both pointers are NULL - (have reached the end of the lfds611_freelist) - - or - - if we fast pointer 'sees' the slow pointer - which means we have a loop - */ - - if( fe_slow != NULL ) - do { - fe_slow = fe_slow->next[LFDS611_FREELIST_POINTER]; - - if( fe_fast != NULL ) - fe_fast = fe_fast->next[LFDS611_FREELIST_POINTER]; - - if( fe_fast != NULL ) - fe_fast = fe_fast->next[LFDS611_FREELIST_POINTER]; - } while( fe_slow != NULL and fe_fast != fe_slow ); - - if( fe_fast != NULL and fe_slow != NULL and fe_fast == fe_slow ) - *lfds611_freelist_validity = LFDS611_VALIDITY_INVALID_LOOP; - - /* TRD : now check for expected number of elements - vi can be NULL, in which case we do not check - we know we don't have a loop from our earlier check - */ - - if( *lfds611_freelist_validity == LFDS611_VALIDITY_VALID and vi != NULL ) { - fe = (struct lfds611_freelist_element *) fs->top[LFDS611_FREELIST_POINTER]; - - while( fe != NULL ) { - element_count++; - fe = (struct lfds611_freelist_element *) fe->next[LFDS611_FREELIST_POINTER]; - } - - if( element_count < vi->min_elements ) - *lfds611_freelist_validity = LFDS611_VALIDITY_INVALID_MISSING_ELEMENTS; - - if( element_count > vi->max_elements ) - *lfds611_freelist_validity = LFDS611_VALIDITY_INVALID_ADDITIONAL_ELEMENTS; - } - - return; -} - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_liblfds/lfds611_liblfds_abstraction_test_helpers.c b/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_liblfds/lfds611_liblfds_abstraction_test_helpers.c deleted file mode 100644 index a015159b7f..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_liblfds/lfds611_liblfds_abstraction_test_helpers.c +++ /dev/null @@ -1,106 +0,0 @@ -#include "lfds611_liblfds_internal.h" - - - - - -/****************************************************************************/ -void lfds611_liblfds_abstraction_test_helper_increment_non_atomic( lfds611_atom_t *shared_counter ) -{ - /* TRD : lfds611_atom_t must be volatile or the compiler - optimizes it away into a single store - */ - - volatile lfds611_atom_t - count = 0; - - assert( shared_counter != NULL ); - - while( count++ < 10000000 ) - (*(lfds611_atom_t *) shared_counter)++; - - return; -} - - - - - -/****************************************************************************/ -void lfds611_liblfds_abstraction_test_helper_increment_atomic( volatile lfds611_atom_t *shared_counter ) -{ - lfds611_atom_t - count = 0; - - assert( shared_counter != NULL ); - - while( count++ < 10000000 ) - lfds611_abstraction_increment( shared_counter ); - - return; -} - - - - - -/****************************************************************************/ -void lfds611_liblfds_abstraction_test_helper_cas( volatile lfds611_atom_t *shared_counter, lfds611_atom_t *local_counter ) -{ - lfds611_atom_t - loop = 0, - original_destination; - - LFDS611_ALIGN(LFDS611_ALIGN_SINGLE_POINTER) lfds611_atom_t - exchange, - compare; - - assert( shared_counter != NULL ); - assert( local_counter != NULL ); - - while( loop++ < 1000000 ) { - do { - compare = *shared_counter; - exchange = compare + 1; - - original_destination = lfds611_abstraction_cas( shared_counter, exchange, compare ); - } while( original_destination != compare ); - - (*local_counter)++; - } - - return; -} - - - - - -/****************************************************************************/ -void lfds611_liblfds_abstraction_test_helper_dcas( volatile lfds611_atom_t *shared_counter, lfds611_atom_t *local_counter ) -{ - lfds611_atom_t - loop = 0; - - LFDS611_ALIGN(LFDS611_ALIGN_DOUBLE_POINTER) lfds611_atom_t - exchange[2], - compare[2]; - - assert( shared_counter != NULL ); - assert( local_counter != NULL ); - - while( loop++ < 1000000 ) { - compare[0] = *shared_counter; - compare[1] = *(shared_counter+1); - - do { - exchange[0] = compare[0] + 1; - exchange[1] = compare[1]; - } while( 0 == lfds611_abstraction_dcas(shared_counter, exchange, compare) ); - - (*local_counter)++; - } - - return; -} - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_liblfds/lfds611_liblfds_aligned_free.c b/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_liblfds/lfds611_liblfds_aligned_free.c deleted file mode 100644 index 0449f8b244..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_liblfds/lfds611_liblfds_aligned_free.c +++ /dev/null @@ -1,17 +0,0 @@ -#include "lfds611_liblfds_internal.h" - - - - - -/****************************************************************************/ -void lfds611_liblfds_aligned_free( void *memory ) -{ - assert( memory != NULL ); - - // TRD : the "void *" stored above memory points to the root of the allocation - lfds611_abstraction_free( *( (void **) memory - 1 ) ); - - return; -} - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_liblfds/lfds611_liblfds_aligned_malloc.c b/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_liblfds/lfds611_liblfds_aligned_malloc.c deleted file mode 100644 index ef6ee57426..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_liblfds/lfds611_liblfds_aligned_malloc.c +++ /dev/null @@ -1,31 +0,0 @@ -#include "lfds611_liblfds_internal.h" - - - - - -/****************************************************************************/ -void *lfds611_liblfds_aligned_malloc( size_t size, size_t align_in_bytes ) -{ - void - *original_memory, - *memory; - - size_t - offset; - - // TRD : size can be any value in its range - // TRD : align_in_bytes can be any value in its range - - original_memory = memory = lfds611_abstraction_malloc( size + sizeof(void *) + align_in_bytes ); - - if( memory != NULL ) { - memory = (void **) memory + 1; - offset = align_in_bytes - (size_t) memory % align_in_bytes; - memory = (unsigned char *) memory + offset; - *( (void **) memory - 1 ) = original_memory; - } - - return( memory ); -} - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_liblfds/lfds611_liblfds_internal.h b/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_liblfds/lfds611_liblfds_internal.h deleted file mode 100644 index d6fa122759..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_liblfds/lfds611_liblfds_internal.h +++ /dev/null @@ -1,4 +0,0 @@ -/***** the library wide include file *****/ -#include "liblfds611_internal.h" - - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_liblfds/lfds611_liblfds_readme.txt b/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_liblfds/lfds611_liblfds_readme.txt deleted file mode 100644 index aa3327028c..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_liblfds/lfds611_liblfds_readme.txt +++ /dev/null @@ -1,2 +0,0 @@ -This is not a data structure but rather functions internal to the library. - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_queue/lfds611_queue_delete.c b/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_queue/lfds611_queue_delete.c deleted file mode 100644 index a11b501e56..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_queue/lfds611_queue_delete.c +++ /dev/null @@ -1,57 +0,0 @@ -#include "lfds611_queue_internal.h" - - - - - -/****************************************************************************/ -void lfds611_queue_delete( struct lfds611_queue_state *qs, void (*user_data_delete_function)(void *user_data, void *user_state), void *user_state ) -{ - void - *user_data; - - assert( qs != NULL ); - // TRD : user_data_delete_function can be NULL - // TRD : user_state can be NULL - - // TRD : leading load barrier not required as it will be performed by the dequeue - - while( lfds611_queue_dequeue(qs, &user_data) ) - if( user_data_delete_function != NULL ) - user_data_delete_function( user_data, user_state ); - - /* TRD : fully dequeuing will leave us - with a single dummy element - which both qs->enqueue and qs->dequeue point at - we push this back onto the lfds611_freelist - before we delete the lfds611_freelist - */ - - lfds611_freelist_push( qs->fs, qs->enqueue[LFDS611_QUEUE_POINTER]->fe ); - - lfds611_freelist_delete( qs->fs, lfds611_queue_internal_freelist_delete_function, NULL ); - - lfds611_liblfds_aligned_free( qs ); - - return; -} - - - - - -/****************************************************************************/ -//#pragma warning( disable : 4100 ) - -void lfds611_queue_internal_freelist_delete_function( void *user_data, void *user_state ) -{ - assert( user_data != NULL ); - assert( user_state == NULL ); - - lfds611_liblfds_aligned_free( user_data ); - - return; -} - -//#pragma warning( default : 4100 ) - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_queue/lfds611_queue_internal.h b/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_queue/lfds611_queue_internal.h deleted file mode 100644 index e84e35035a..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_queue/lfds611_queue_internal.h +++ /dev/null @@ -1,59 +0,0 @@ -/***** the library wide include file *****/ -#include "liblfds611_internal.h" - -/***** pragmas *****/ - -/***** defines *****/ -#define LFDS611_QUEUE_STATE_UNKNOWN -1 -#define LFDS611_QUEUE_STATE_EMPTY 0 -#define LFDS611_QUEUE_STATE_ENQUEUE_OUT_OF_PLACE 1 -#define LFDS611_QUEUE_STATE_ATTEMPT_DELFDS611_QUEUE 2 - -#define LFDS611_QUEUE_POINTER 0 -#define LFDS611_QUEUE_COUNTER 1 -#define LFDS611_QUEUE_PAC_SIZE 2 - -/***** structures *****/ -#pragma pack( push, LFDS611_ALIGN_DOUBLE_POINTER ) - -struct lfds611_queue_state { - struct lfds611_queue_element - *volatile enqueue[LFDS611_QUEUE_PAC_SIZE], - *volatile dequeue[LFDS611_QUEUE_PAC_SIZE]; - - lfds611_atom_t - aba_counter; - - struct lfds611_freelist_state - *fs; -}; - -struct lfds611_queue_element { - // TRD : next in a lfds611_queue requires volatile as it is target of CAS - struct lfds611_queue_element - *volatile next[LFDS611_QUEUE_PAC_SIZE]; - - struct lfds611_freelist_element - *fe; - - void - *user_data; -}; - -#pragma pack( pop ) - -/***** externs *****/ - -/***** private prototypes *****/ -int lfds611_queue_internal_freelist_init_function( void **user_data, void *user_state ); -void lfds611_queue_internal_freelist_delete_function( void *user_data, void *user_state ); - -void lfds611_queue_internal_new_element_from_freelist( struct lfds611_queue_state *qs, struct lfds611_queue_element *qe[LFDS611_QUEUE_PAC_SIZE], void *user_data ); -void lfds611_queue_internal_guaranteed_new_element_from_freelist( struct lfds611_queue_state *qs, struct lfds611_queue_element * qe[LFDS611_QUEUE_PAC_SIZE], void *user_data ); -void lfds611_queue_internal_init_element( struct lfds611_queue_state *qs, struct lfds611_queue_element *qe[LFDS611_QUEUE_PAC_SIZE], struct lfds611_freelist_element *fe, void *user_data ); - -void lfds611_queue_internal_queue( struct lfds611_queue_state *qs, struct lfds611_queue_element *qe[LFDS611_QUEUE_PAC_SIZE] ); - -void lfds611_queue_internal_validate( struct lfds611_queue_state *qs, struct lfds611_validation_info *vi, enum lfds611_data_structure_validity *lfds611_queue_validity, - enum lfds611_data_structure_validity *lfds611_freelist_validity ); - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_queue/lfds611_queue_new.c b/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_queue/lfds611_queue_new.c deleted file mode 100644 index 7fec0a2e90..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_queue/lfds611_queue_new.c +++ /dev/null @@ -1,158 +0,0 @@ -#include "lfds611_queue_internal.h" - - - - - -/****************************************************************************/ -int lfds611_queue_new( struct lfds611_queue_state **qs, lfds611_atom_t number_elements ) -{ - int - rv = 0; - - struct lfds611_queue_element - *qe[LFDS611_QUEUE_PAC_SIZE]; - - assert( qs != NULL ); - // TRD : number_elements can be any value in its range - - *qs = (struct lfds611_queue_state *) lfds611_liblfds_aligned_malloc( sizeof(struct lfds611_queue_state), LFDS611_ALIGN_DOUBLE_POINTER ); - - if( *qs != NULL ) { - // TRD : the size of the lfds611_freelist is the size of the lfds611_queue (+1 for the leading dummy element, which is hidden from the caller) - lfds611_freelist_new( &(*qs)->fs, number_elements+1, lfds611_queue_internal_freelist_init_function, NULL ); - - if( (*qs)->fs != NULL ) { - lfds611_queue_internal_new_element_from_freelist( *qs, qe, NULL ); - (*qs)->enqueue[LFDS611_QUEUE_POINTER] = (*qs)->dequeue[LFDS611_QUEUE_POINTER] = qe[LFDS611_QUEUE_POINTER]; - (*qs)->enqueue[LFDS611_QUEUE_COUNTER] = (*qs)->dequeue[LFDS611_QUEUE_COUNTER] = 0; - (*qs)->aba_counter = 0; - rv = 1; - } - - if( (*qs)->fs == NULL ) { - lfds611_liblfds_aligned_free( *qs ); - *qs = NULL; - } - } - - LFDS611_BARRIER_STORE; - - return( rv ); -} - - - - - -/****************************************************************************/ -//#pragma warning( disable : 4100 ) - -void lfds611_queue_use( struct lfds611_queue_state *qs ) -{ - assert( qs != NULL ); - - LFDS611_BARRIER_LOAD; - - return; -} - -//#pragma warning( default : 4100 ) - - - - - -/****************************************************************************/ -//#pragma warning( disable : 4100 ) - -int lfds611_queue_internal_freelist_init_function( void **user_data, void *user_state ) -{ - int - rv = 0; - - assert( user_data != NULL ); - assert( user_state == NULL ); - - *user_data = lfds611_liblfds_aligned_malloc( sizeof(struct lfds611_queue_element), LFDS611_ALIGN_DOUBLE_POINTER ); - - if( *user_data != NULL ) - rv = 1; - - return( rv ); -} - -//#pragma warning( default : 4100 ) - - - - - -/****************************************************************************/ -void lfds611_queue_internal_new_element_from_freelist( struct lfds611_queue_state *qs, struct lfds611_queue_element *qe[LFDS611_QUEUE_PAC_SIZE], void *user_data ) -{ - struct lfds611_freelist_element - *fe; - - assert( qs != NULL ); - assert( qe != NULL ); - // TRD : user_data can be any value in its range - - qe[LFDS611_QUEUE_POINTER] = NULL; - - lfds611_freelist_pop( qs->fs, &fe ); - - if( fe != NULL ) - lfds611_queue_internal_init_element( qs, qe, fe, user_data ); - - return; -} - - - - - -/****************************************************************************/ -void lfds611_queue_internal_guaranteed_new_element_from_freelist( struct lfds611_queue_state *qs, struct lfds611_queue_element *qe[LFDS611_QUEUE_PAC_SIZE], void *user_data ) -{ - struct lfds611_freelist_element - *fe; - - assert( qs != NULL ); - assert( qe != NULL ); - // TRD : user_data can be any value in its range - - qe[LFDS611_QUEUE_POINTER] = NULL; - - lfds611_freelist_guaranteed_pop( qs->fs, &fe ); - - if( fe != NULL ) - lfds611_queue_internal_init_element( qs, qe, fe, user_data ); - - return; -} - - - - - -/****************************************************************************/ -void lfds611_queue_internal_init_element( struct lfds611_queue_state *qs, struct lfds611_queue_element *qe[LFDS611_QUEUE_PAC_SIZE], struct lfds611_freelist_element *fe, void *user_data ) -{ - assert( qs != NULL ); - assert( qe != NULL ); - assert( fe != NULL ); - // TRD : user_data can be any value in its range - - lfds611_freelist_get_user_data_from_element( fe, (void **) &qe[LFDS611_QUEUE_POINTER] ); - qe[LFDS611_QUEUE_COUNTER] = (struct lfds611_queue_element *) lfds611_abstraction_increment( (lfds611_atom_t *) &qs->aba_counter ); - - qe[LFDS611_QUEUE_POINTER]->next[LFDS611_QUEUE_POINTER] = NULL; - qe[LFDS611_QUEUE_POINTER]->next[LFDS611_QUEUE_COUNTER] = (struct lfds611_queue_element *) lfds611_abstraction_increment( (lfds611_atom_t *) &qs->aba_counter ); - - qe[LFDS611_QUEUE_POINTER]->fe = fe; - qe[LFDS611_QUEUE_POINTER]->user_data = user_data; - - return; -} - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_queue/lfds611_queue_query.c b/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_queue/lfds611_queue_query.c deleted file mode 100644 index 504485d7b5..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_queue/lfds611_queue_query.c +++ /dev/null @@ -1,150 +0,0 @@ -#include "lfds611_queue_internal.h" - - - - - -/****************************************************************************/ -//#pragma warning( disable : 4100 ) - -void lfds611_queue_query( struct lfds611_queue_state *qs, enum lfds611_queue_query_type query_type, void *query_input, void *query_output ) -{ - assert( qs != NULL ); - // TRD : query_type can be any value in its range - // TRD : query_input can be NULL - assert( query_output != NULL ); - - switch( query_type ) { - case LFDS611_QUEUE_QUERY_ELEMENT_COUNT: - assert( query_input == NULL ); - - lfds611_freelist_query( qs->fs, LFDS611_FREELIST_QUERY_ELEMENT_COUNT, NULL, query_output ); - break; - - case LFDS611_QUEUE_QUERY_VALIDATE: - // TRD : query_input can be NULL - - lfds611_queue_internal_validate( qs, (struct lfds611_validation_info *) query_input, (enum lfds611_data_structure_validity *) query_output, ((enum lfds611_data_structure_validity *) query_output)+1 ); - break; - } - - return; -} - -//#pragma warning( default : 4100 ) - - - - - -/****************************************************************************/ -void lfds611_queue_internal_validate( struct lfds611_queue_state *qs, struct lfds611_validation_info *vi, enum lfds611_data_structure_validity *lfds611_queue_validity, - enum lfds611_data_structure_validity *lfds611_freelist_validity ) -{ - struct lfds611_queue_element - *qe, - *qe_slow, - *qe_fast; - - lfds611_atom_t - element_count = 0, - total_elements; - - struct lfds611_validation_info - lfds611_freelist_vi; - - assert( qs != NULL ); - // TRD : vi can be NULL - assert( lfds611_queue_validity != NULL ); - assert( lfds611_freelist_validity != NULL ); - - *lfds611_queue_validity = LFDS611_VALIDITY_VALID; - - LFDS611_BARRIER_LOAD; - - qe_slow = qe_fast = (struct lfds611_queue_element *) qs->dequeue[LFDS611_QUEUE_POINTER]; - - /* TRD : first, check for a loop - we have two pointers - both of which start at the dequeue end of the lfds611_queue - we enter a loop - and on each iteration - we advance one pointer by one element - and the other by two - - we exit the loop when both pointers are NULL - (have reached the end of the lfds611_queue) - - or - - if we fast pointer 'sees' the slow pointer - which means we have a loop - */ - - if( qe_slow != NULL ) - do { - qe_slow = qe_slow->next[LFDS611_QUEUE_POINTER]; - - if( qe_fast != NULL ) - qe_fast = qe_fast->next[LFDS611_QUEUE_POINTER]; - - if( qe_fast != NULL ) - qe_fast = qe_fast->next[LFDS611_QUEUE_POINTER]; - } while( qe_slow != NULL and qe_fast != qe_slow ); - - if( qe_fast != NULL and qe_slow != NULL and qe_fast == qe_slow ) - *lfds611_queue_validity = LFDS611_VALIDITY_INVALID_LOOP; - - /* TRD : now check for expected number of elements - vi can be NULL, in which case we do not check - we know we don't have a loop from our earlier check - */ - - if( *lfds611_queue_validity == LFDS611_VALIDITY_VALID and vi != NULL ) { - qe = (struct lfds611_queue_element *) qs->dequeue[LFDS611_QUEUE_POINTER]; - - while( qe != NULL ) { - element_count++; - qe = (struct lfds611_queue_element *) qe->next[LFDS611_QUEUE_POINTER]; - } - - /* TRD : remember there is a dummy element in the lfds611_queue */ - element_count--; - - if( element_count < vi->min_elements ) - *lfds611_queue_validity = LFDS611_VALIDITY_INVALID_MISSING_ELEMENTS; - - if( element_count > vi->max_elements ) - *lfds611_queue_validity = LFDS611_VALIDITY_INVALID_ADDITIONAL_ELEMENTS; - } - - /* TRD : now we validate the lfds611_freelist - - we may be able to check for the expected number of - elements in the lfds611_freelist - - if the caller has given us an expected min and max - number of elements in the lfds611_queue, then the total number - of elements in the lfds611_freelist, minus that min and max, - gives us the expected number of elements in the - lfds611_freelist - */ - - if( vi != NULL ) { - lfds611_freelist_query( qs->fs, LFDS611_FREELIST_QUERY_ELEMENT_COUNT, NULL, (void *) &total_elements ); - - /* TRD : remember there is a dummy element in the lfds611_queue */ - total_elements--; - - lfds611_freelist_vi.min_elements = total_elements - vi->max_elements; - lfds611_freelist_vi.max_elements = total_elements - vi->min_elements; - - lfds611_freelist_query( qs->fs, LFDS611_FREELIST_QUERY_VALIDATE, (void *) &lfds611_freelist_vi, (void *) lfds611_freelist_validity ); - } - - if( vi == NULL ) - lfds611_freelist_query( qs->fs, LFDS611_FREELIST_QUERY_VALIDATE, NULL, (void *) lfds611_freelist_validity ); - - return; -} - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_queue/lfds611_queue_queue.c b/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_queue/lfds611_queue_queue.c deleted file mode 100644 index c3abe45043..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_queue/lfds611_queue_queue.c +++ /dev/null @@ -1,184 +0,0 @@ -#include "lfds611_queue_internal.h" - - - - - -/****************************************************************************/ -int lfds611_queue_enqueue( struct lfds611_queue_state *qs, void *user_data ) -{ - LFDS611_ALIGN(LFDS611_ALIGN_DOUBLE_POINTER) struct lfds611_queue_element - *qe[LFDS611_QUEUE_PAC_SIZE]; - - assert( qs != NULL ); - // TRD : user_data can be NULL - - lfds611_queue_internal_new_element_from_freelist( qs, qe, user_data ); - - if( qe[LFDS611_QUEUE_POINTER] == NULL ) - return( 0 ); - - lfds611_queue_internal_queue( qs, qe ); - - return( 1 ); -} - - - - - -/****************************************************************************/ -int lfds611_queue_guaranteed_enqueue( struct lfds611_queue_state *qs, void *user_data ) -{ - LFDS611_ALIGN(LFDS611_ALIGN_DOUBLE_POINTER) struct lfds611_queue_element - *qe[LFDS611_QUEUE_PAC_SIZE]; - - assert( qs != NULL ); - // TRD : user_data can be NULL - - lfds611_queue_internal_guaranteed_new_element_from_freelist( qs, qe, user_data ); - - if( qe[LFDS611_QUEUE_POINTER] == NULL ) - return( 0 ); - - lfds611_queue_internal_queue( qs, qe ); - - return( 1 ); -} - - - - - -/****************************************************************************/ -void lfds611_queue_internal_queue( struct lfds611_queue_state *qs, struct lfds611_queue_element *qe[LFDS611_QUEUE_PAC_SIZE] ) -{ - LFDS611_ALIGN(LFDS611_ALIGN_DOUBLE_POINTER) struct lfds611_queue_element - *enqueue[LFDS611_QUEUE_PAC_SIZE], - *next[LFDS611_QUEUE_PAC_SIZE]; - - unsigned char - cas_result = 0; - - assert( qs != NULL ); - assert( qe != NULL ); - - // TRD : the DCAS operation issues a read and write barrier, so we don't need a read barrier in the do() loop - - LFDS611_BARRIER_LOAD; - - do { - enqueue[LFDS611_QUEUE_POINTER] = qs->enqueue[LFDS611_QUEUE_POINTER]; - enqueue[LFDS611_QUEUE_COUNTER] = qs->enqueue[LFDS611_QUEUE_COUNTER]; - - next[LFDS611_QUEUE_POINTER] = enqueue[LFDS611_QUEUE_POINTER]->next[LFDS611_QUEUE_POINTER]; - next[LFDS611_QUEUE_COUNTER] = enqueue[LFDS611_QUEUE_POINTER]->next[LFDS611_QUEUE_COUNTER]; - - /* TRD : this if() ensures that the next we read, just above, - really is from qs->enqueue (which we copied into enqueue) - */ - - LFDS611_BARRIER_LOAD; - - if( qs->enqueue[LFDS611_QUEUE_POINTER] == enqueue[LFDS611_QUEUE_POINTER] and qs->enqueue[LFDS611_QUEUE_COUNTER] == enqueue[LFDS611_QUEUE_COUNTER] ) { - if( next[LFDS611_QUEUE_POINTER] == NULL ) { - qe[LFDS611_QUEUE_COUNTER] = next[LFDS611_QUEUE_COUNTER] + 1; - cas_result = lfds611_abstraction_dcas( (volatile lfds611_atom_t *) enqueue[LFDS611_QUEUE_POINTER]->next, (lfds611_atom_t *) qe, (lfds611_atom_t *) next ); - } else { - next[LFDS611_QUEUE_COUNTER] = enqueue[LFDS611_QUEUE_COUNTER] + 1; - lfds611_abstraction_dcas( (volatile lfds611_atom_t *) qs->enqueue, (lfds611_atom_t *) next, (lfds611_atom_t *) enqueue ); - } - } - } while( cas_result == 0 ); - - qe[LFDS611_QUEUE_COUNTER] = enqueue[LFDS611_QUEUE_COUNTER] + 1; - lfds611_abstraction_dcas( (volatile lfds611_atom_t *) qs->enqueue, (lfds611_atom_t *) qe, (lfds611_atom_t *) enqueue ); - - return; -} - - - - - -/****************************************************************************/ -int lfds611_queue_dequeue( struct lfds611_queue_state *qs, void **user_data ) -{ - LFDS611_ALIGN(LFDS611_ALIGN_DOUBLE_POINTER) struct lfds611_queue_element - *enqueue[LFDS611_QUEUE_PAC_SIZE], - *dequeue[LFDS611_QUEUE_PAC_SIZE], - *next[LFDS611_QUEUE_PAC_SIZE]; - - unsigned char - cas_result = 0; - - int - rv = 1, - state = LFDS611_QUEUE_STATE_UNKNOWN, - finished_flag = LOWERED; - - assert( qs != NULL ); - assert( user_data != NULL ); - - // TRD : the DCAS operation issues a read and write barrier, so we don't need a read barrier in the do() loop - - LFDS611_BARRIER_LOAD; - - do { - dequeue[LFDS611_QUEUE_POINTER] = qs->dequeue[LFDS611_QUEUE_POINTER]; - dequeue[LFDS611_QUEUE_COUNTER] = qs->dequeue[LFDS611_QUEUE_COUNTER]; - - enqueue[LFDS611_QUEUE_POINTER] = qs->enqueue[LFDS611_QUEUE_POINTER]; - enqueue[LFDS611_QUEUE_COUNTER] = qs->enqueue[LFDS611_QUEUE_COUNTER]; - - next[LFDS611_QUEUE_POINTER] = dequeue[LFDS611_QUEUE_POINTER]->next[LFDS611_QUEUE_POINTER]; - next[LFDS611_QUEUE_COUNTER] = dequeue[LFDS611_QUEUE_POINTER]->next[LFDS611_QUEUE_COUNTER]; - - /* TRD : confirm that dequeue didn't move between reading it - and reading its next pointer - */ - - LFDS611_BARRIER_LOAD; - - if( dequeue[LFDS611_QUEUE_POINTER] == qs->dequeue[LFDS611_QUEUE_POINTER] and dequeue[LFDS611_QUEUE_COUNTER] == qs->dequeue[LFDS611_QUEUE_COUNTER] ) { - if( enqueue[LFDS611_QUEUE_POINTER] == dequeue[LFDS611_QUEUE_POINTER] and next[LFDS611_QUEUE_POINTER] == NULL ) - state = LFDS611_QUEUE_STATE_EMPTY; - - if( enqueue[LFDS611_QUEUE_POINTER] == dequeue[LFDS611_QUEUE_POINTER] and next[LFDS611_QUEUE_POINTER] != NULL ) - state = LFDS611_QUEUE_STATE_ENQUEUE_OUT_OF_PLACE; - - if( enqueue[LFDS611_QUEUE_POINTER] != dequeue[LFDS611_QUEUE_POINTER] ) - state = LFDS611_QUEUE_STATE_ATTEMPT_DELFDS611_QUEUE; - - switch( state ) { - case LFDS611_QUEUE_STATE_EMPTY: - *user_data = NULL; - rv = 0; - finished_flag = RAISED; - break; - - case LFDS611_QUEUE_STATE_ENQUEUE_OUT_OF_PLACE: - next[LFDS611_QUEUE_COUNTER] = enqueue[LFDS611_QUEUE_COUNTER] + 1; - lfds611_abstraction_dcas( (volatile lfds611_atom_t *) qs->enqueue, (lfds611_atom_t *) next, (lfds611_atom_t *) enqueue ); - break; - - case LFDS611_QUEUE_STATE_ATTEMPT_DELFDS611_QUEUE: - *user_data = next[LFDS611_QUEUE_POINTER]->user_data; - - next[LFDS611_QUEUE_COUNTER] = dequeue[LFDS611_QUEUE_COUNTER] + 1; - cas_result = lfds611_abstraction_dcas( (volatile lfds611_atom_t *) qs->dequeue, (lfds611_atom_t *) next, (lfds611_atom_t *) dequeue ); - - if( cas_result == 1 ) - finished_flag = RAISED; - - break; - } - } - } while( finished_flag == LOWERED ); - - if( cas_result == 1 ) - lfds611_freelist_push( qs->fs, dequeue[LFDS611_QUEUE_POINTER]->fe ); - - return( rv ); -} - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_ringbuffer/lfds611_ringbuffer_delete.c b/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_ringbuffer/lfds611_ringbuffer_delete.c deleted file mode 100644 index 847d442d28..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_ringbuffer/lfds611_ringbuffer_delete.c +++ /dev/null @@ -1,22 +0,0 @@ -#include "lfds611_ringbuffer_internal.h" - - - - - -/****************************************************************************/ -void lfds611_ringbuffer_delete( struct lfds611_ringbuffer_state *rs, void (*user_data_delete_function)(void *user_data, void *user_state), void *user_state ) -{ - assert( rs != NULL ); - // TRD : user_data_delete_function can be NULL - // TRD : user_state can be NULL - - lfds611_queue_delete( rs->qs, NULL, NULL ); - - lfds611_freelist_delete( rs->fs, user_data_delete_function, user_state ); - - lfds611_liblfds_aligned_free( rs ); - - return; -} - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_ringbuffer/lfds611_ringbuffer_get_and_put.c b/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_ringbuffer/lfds611_ringbuffer_get_and_put.c deleted file mode 100644 index 9b0ea2a667..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_ringbuffer/lfds611_ringbuffer_get_and_put.c +++ /dev/null @@ -1,105 +0,0 @@ -#include "lfds611_ringbuffer_internal.h" - - - - - -/****************************************************************************/ -struct lfds611_freelist_element *lfds611_ringbuffer_get_read_element( struct lfds611_ringbuffer_state *rs, struct lfds611_freelist_element **fe ) -{ - assert( rs != NULL ); - assert( fe != NULL ); - - lfds611_queue_dequeue( rs->qs, (void **) fe ); - - return( *fe ); -} - - - - - -/****************************************************************************/ -struct lfds611_freelist_element *lfds611_ringbuffer_get_write_element( struct lfds611_ringbuffer_state *rs, struct lfds611_freelist_element **fe, int *overwrite_flag ) -{ - assert( rs != NULL ); - assert( fe != NULL ); - // TRD : overwrite_flag can be NULL - - /* TRD : we try to obtain an element from the lfds611_freelist - if we can, we populate it and add it to the lfds611_queue - - if we cannot, then the lfds611_ringbuffer is full - so instead we grab the current read element and - use that instead - - dequeue may fail since the lfds611_queue may be emptied - during our dequeue attempt - - so what we actually do here is a loop, attempting - the lfds611_freelist and if it fails then a dequeue, until - we obtain an element - - once we have an element, we lfds611_queue it - - you may be wondering why this operation is in a loop - remember - these operations are lock-free; anything - can happen in between - - so for example the pop could fail because the lfds611_freelist - is empty; but by the time we go to get an element from - the lfds611_queue, the whole lfds611_queue has been emptied back into - the lfds611_freelist! - - if overwrite_flag is provided, we set it to 0 if we - obtained a new element from the lfds611_freelist, 1 if we - stole an element from the lfds611_queue - */ - - do { - if( overwrite_flag != NULL ) - *overwrite_flag = 0; - - lfds611_freelist_pop( rs->fs, fe ); - - if( *fe == NULL ) { - lfds611_ringbuffer_get_read_element( rs, fe ); - - if( overwrite_flag != NULL and *fe != NULL ) - *overwrite_flag = 1; - } - } while( *fe == NULL ); - - return( *fe ); -} - - - - - -/****************************************************************************/ -void lfds611_ringbuffer_put_read_element( struct lfds611_ringbuffer_state *rs, struct lfds611_freelist_element *fe ) -{ - assert( rs != NULL ); - assert( fe != NULL ); - - lfds611_freelist_push( rs->fs, fe ); - - return; -} - - - - - -/****************************************************************************/ -void lfds611_ringbuffer_put_write_element( struct lfds611_ringbuffer_state *rs, struct lfds611_freelist_element *fe ) -{ - assert( rs != NULL ); - assert( fe != NULL ); - - lfds611_queue_enqueue( rs->qs, fe ); - - return; -} - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_ringbuffer/lfds611_ringbuffer_internal.h b/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_ringbuffer/lfds611_ringbuffer_internal.h deleted file mode 100644 index e32a5f2d13..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_ringbuffer/lfds611_ringbuffer_internal.h +++ /dev/null @@ -1,24 +0,0 @@ -/***** the library wide include file *****/ -#include "liblfds611_internal.h" - -/***** defines *****/ - -/***** structures *****/ -#pragma pack( push, LFDS611_ALIGN_DOUBLE_POINTER ) - -struct lfds611_ringbuffer_state { - struct lfds611_queue_state - *qs; - - struct lfds611_freelist_state - *fs; -}; - -#pragma pack( pop ) - -/***** externs *****/ - -/***** private prototypes *****/ -void lfds611_ringbuffer_internal_validate( struct lfds611_ringbuffer_state *rs, struct lfds611_validation_info *vi, enum lfds611_data_structure_validity *lfds611_queue_validity, - enum lfds611_data_structure_validity *lfds611_freelist_validity ); - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_ringbuffer/lfds611_ringbuffer_new.c b/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_ringbuffer/lfds611_ringbuffer_new.c deleted file mode 100644 index 6d8dde2a54..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_ringbuffer/lfds611_ringbuffer_new.c +++ /dev/null @@ -1,63 +0,0 @@ -#include "lfds611_ringbuffer_internal.h" - - - - - -/****************************************************************************/ -int lfds611_ringbuffer_new( struct lfds611_ringbuffer_state **rs, lfds611_atom_t number_elements, int (*user_data_init_function)(void **user_data, void *user_state), void *user_state ) -{ - int - rv = 0; - - assert( rs != NULL ); - // TRD : number_elements can be any value in its range - // TRD : user_data_init_function can be NULL - // TRD : user_state can be NULL - - *rs = (struct lfds611_ringbuffer_state *) lfds611_liblfds_aligned_malloc( sizeof(struct lfds611_ringbuffer_state), LFDS611_ALIGN_DOUBLE_POINTER ); - - if( *rs != NULL ) { - lfds611_freelist_new( &(*rs)->fs, number_elements, user_data_init_function, user_state ); - - if( (*rs)->fs != NULL ) { - lfds611_queue_new( &(*rs)->qs, number_elements ); - - if( (*rs)->qs != NULL ) - rv = 1; - - if( (*rs)->qs == NULL ) { - lfds611_liblfds_aligned_free( *rs ); - *rs = NULL; - } - } - - if( (*rs)->fs == NULL ) { - lfds611_liblfds_aligned_free( *rs ); - *rs = NULL; - } - } - - LFDS611_BARRIER_STORE; - - return( rv ); -} - - - - - -/****************************************************************************/ -//#pragma warning( disable : 4100 ) - -void lfds611_ringbuffer_use( struct lfds611_ringbuffer_state *rs ) -{ - assert( rs != NULL ); - - LFDS611_BARRIER_LOAD; - - return; -} - -//#pragma warning( default : 4100 ) - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_ringbuffer/lfds611_ringbuffer_query.c b/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_ringbuffer/lfds611_ringbuffer_query.c deleted file mode 100644 index 11bf8b0b6e..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_ringbuffer/lfds611_ringbuffer_query.c +++ /dev/null @@ -1,64 +0,0 @@ -#include "lfds611_ringbuffer_internal.h" - - - - - -/****************************************************************************/ -//#pragma warning( disable : 4100 ) - -void lfds611_ringbuffer_query( struct lfds611_ringbuffer_state *rs, enum lfds611_ringbuffer_query_type query_type, void *query_input, void *query_output ) -{ - assert( rs != NULL ); - // TRD : query_type can be any value in its range - // TRD : query_input can be NULL - assert( query_output != NULL ); - - switch( query_type ) { - case LFDS611_RINGBUFFER_QUERY_VALIDATE: - // TRD : query_input can be NULL - - lfds611_ringbuffer_internal_validate( rs, (struct lfds611_validation_info *) query_input, (enum lfds611_data_structure_validity *) query_output, - ((enum lfds611_data_structure_validity *) query_output)+2 ); - break; - } - - return; -} - -//#pragma warning( default : 4100 ) - - - - - -/****************************************************************************/ -void lfds611_ringbuffer_internal_validate( struct lfds611_ringbuffer_state *rs, struct lfds611_validation_info *vi, enum lfds611_data_structure_validity *lfds611_queue_validity, - enum lfds611_data_structure_validity *lfds611_freelist_validity ) -{ - assert( rs != NULL ); - // TRD : vi can be NULL - assert( lfds611_queue_validity != NULL ); - assert( lfds611_freelist_validity != NULL ); - - lfds611_queue_query( rs->qs, LFDS611_QUEUE_QUERY_VALIDATE, vi, lfds611_queue_validity ); - - if( vi != NULL ) { - struct lfds611_validation_info - lfds611_freelist_vi; - - lfds611_atom_t - total_elements; - - lfds611_freelist_query( rs->fs, LFDS611_FREELIST_QUERY_ELEMENT_COUNT, NULL, (void *) &total_elements ); - lfds611_freelist_vi.min_elements = total_elements - vi->max_elements; - lfds611_freelist_vi.max_elements = total_elements - vi->min_elements; - lfds611_freelist_query( rs->fs, LFDS611_FREELIST_QUERY_VALIDATE, (void *) &lfds611_freelist_vi, (void *) lfds611_freelist_validity ); - } - - if( vi == NULL ) - lfds611_freelist_query( rs->fs, LFDS611_FREELIST_QUERY_VALIDATE, NULL, (void *) lfds611_freelist_validity ); - - return; -} - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_slist/lfds611_slist_delete.c b/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_slist/lfds611_slist_delete.c deleted file mode 100644 index 18a897b593..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_slist/lfds611_slist_delete.c +++ /dev/null @@ -1,83 +0,0 @@ -#include "lfds611_slist_internal.h" - - - - - -/****************************************************************************/ -void lfds611_slist_delete( struct lfds611_slist_state *ss ) -{ - lfds611_slist_single_threaded_physically_delete_all_elements( ss ); - - lfds611_liblfds_aligned_free( ss ); - - return; -} - - - - - -/****************************************************************************/ -int lfds611_slist_logically_delete_element( struct lfds611_slist_state *ss, struct lfds611_slist_element *se ) -{ - LFDS611_ALIGN(LFDS611_ALIGN_DOUBLE_POINTER) void - *volatile user_data_and_flags[2], - *volatile new_user_data_and_flags[2]; - - unsigned char - cas_rv = 0; - - assert( ss != NULL ); - assert( se != NULL ); - - LFDS611_BARRIER_LOAD; - - user_data_and_flags[LFDS611_SLIST_USER_DATA] = se->user_data_and_flags[LFDS611_SLIST_USER_DATA]; - user_data_and_flags[LFDS611_SLIST_FLAGS] = se->user_data_and_flags[LFDS611_SLIST_FLAGS]; - - do { - new_user_data_and_flags[LFDS611_SLIST_USER_DATA] = user_data_and_flags[LFDS611_SLIST_USER_DATA]; - new_user_data_and_flags[LFDS611_SLIST_FLAGS] = (void *) ((lfds611_atom_t) user_data_and_flags[LFDS611_SLIST_FLAGS] | LFDS611_SLIST_FLAG_DELETED); - } while( !((lfds611_atom_t) user_data_and_flags[LFDS611_SLIST_FLAGS] & LFDS611_SLIST_FLAG_DELETED) - and 0 == (cas_rv = lfds611_abstraction_dcas((volatile lfds611_atom_t *) se->user_data_and_flags, (lfds611_atom_t *) new_user_data_and_flags, (lfds611_atom_t *) user_data_and_flags)) ); - - if( cas_rv == 1 ) - if( ss->user_data_delete_function != NULL ) - ss->user_data_delete_function( (void *) user_data_and_flags[LFDS611_SLIST_USER_DATA], ss->user_state ); - - return( cas_rv ); -} - - - - - -/****************************************************************************/ -void lfds611_slist_single_threaded_physically_delete_all_elements( struct lfds611_slist_state *ss ) -{ - struct lfds611_slist_element - *volatile se, - *volatile se_temp; - - LFDS611_BARRIER_LOAD; - - se = ss->head; - - while( se != NULL ) { - // TRD : if a non-deleted element and there is a delete function, call the delete function - if( ss->user_data_delete_function != NULL ) - ss->user_data_delete_function( (void *) se->user_data_and_flags[LFDS611_SLIST_USER_DATA], ss->user_state ); - - se_temp = se; - se = se->next; - lfds611_liblfds_aligned_free( (void *) se_temp ); - } - - lfds611_slist_internal_init_slist( ss, ss->user_data_delete_function, ss->user_state ); - - LFDS611_BARRIER_STORE; - - return; -} - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_slist/lfds611_slist_get_and_set.c b/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_slist/lfds611_slist_get_and_set.c deleted file mode 100644 index 5d5112b3b3..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_slist/lfds611_slist_get_and_set.c +++ /dev/null @@ -1,133 +0,0 @@ -#include "lfds611_slist_internal.h" - - - - - -/****************************************************************************/ -int lfds611_slist_get_user_data_from_element( struct lfds611_slist_element *se, void **user_data ) -{ - int - rv = 1; - - assert( se != NULL ); - assert( user_data != NULL ); - - LFDS611_BARRIER_LOAD; - - *user_data = (void *) se->user_data_and_flags[LFDS611_SLIST_USER_DATA]; - - if( (lfds611_atom_t) se->user_data_and_flags[LFDS611_SLIST_FLAGS] & LFDS611_SLIST_FLAG_DELETED ) - rv = 0; - - return( rv ); -} - - - - - -/****************************************************************************/ -int lfds611_slist_set_user_data_in_element( struct lfds611_slist_element *se, void *user_data ) -{ - LFDS611_ALIGN(LFDS611_ALIGN_DOUBLE_POINTER) void - *user_data_and_flags[2], - *new_user_data_and_flags[2]; - - int - rv = 1; - - assert( se != NULL ); - // TRD : user_data can be NULL - - LFDS611_BARRIER_LOAD; - - user_data_and_flags[LFDS611_SLIST_USER_DATA] = se->user_data_and_flags[LFDS611_SLIST_USER_DATA]; - user_data_and_flags[LFDS611_SLIST_FLAGS] = se->user_data_and_flags[LFDS611_SLIST_FLAGS]; - - new_user_data_and_flags[LFDS611_SLIST_USER_DATA] = user_data; - - do { - new_user_data_and_flags[LFDS611_SLIST_FLAGS] = user_data_and_flags[LFDS611_SLIST_FLAGS]; - } while( !((lfds611_atom_t) user_data_and_flags[LFDS611_SLIST_FLAGS] & LFDS611_SLIST_FLAG_DELETED) and - 0 == lfds611_abstraction_dcas((volatile lfds611_atom_t *) se->user_data_and_flags, (lfds611_atom_t *) new_user_data_and_flags, (lfds611_atom_t *) user_data_and_flags) ); - - if( (lfds611_atom_t) user_data_and_flags[LFDS611_SLIST_FLAGS] & LFDS611_SLIST_FLAG_DELETED ) - rv = 0; - - LFDS611_BARRIER_STORE; - - return( rv ); -} - - - - - -/****************************************************************************/ -struct lfds611_slist_element *lfds611_slist_get_head( struct lfds611_slist_state *ss, struct lfds611_slist_element **se ) -{ - assert( ss != NULL ); - assert( se != NULL ); - - LFDS611_BARRIER_LOAD; - - *se = (struct lfds611_slist_element *) ss->head; - - lfds611_slist_internal_move_to_first_undeleted_element( se ); - - return( *se ); -} - - - - - -/****************************************************************************/ -struct lfds611_slist_element *lfds611_slist_get_next( struct lfds611_slist_element *se, struct lfds611_slist_element **next_se ) -{ - assert( se != NULL ); - assert( next_se != NULL ); - - LFDS611_BARRIER_LOAD; - - *next_se = (struct lfds611_slist_element *) se->next; - - lfds611_slist_internal_move_to_first_undeleted_element( next_se ); - - return( *next_se ); -} - - - - - -/****************************************************************************/ -struct lfds611_slist_element *lfds611_slist_get_head_and_then_next( struct lfds611_slist_state *ss, struct lfds611_slist_element **se ) -{ - assert( ss != NULL ); - assert( se != NULL ); - - if( *se == NULL ) - lfds611_slist_get_head( ss, se ); - else - lfds611_slist_get_next( *se, se ); - - return( *se ); -} - - - - - -/****************************************************************************/ -void lfds611_slist_internal_move_to_first_undeleted_element( struct lfds611_slist_element **se ) -{ - assert( se != NULL ); - - while( *se != NULL and (lfds611_atom_t) (*se)->user_data_and_flags[LFDS611_SLIST_FLAGS] & LFDS611_SLIST_FLAG_DELETED ) - (*se) = (struct lfds611_slist_element *) (*se)->next; - - return; -} - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_slist/lfds611_slist_internal.h b/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_slist/lfds611_slist_internal.h deleted file mode 100644 index fe7e767515..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_slist/lfds611_slist_internal.h +++ /dev/null @@ -1,53 +0,0 @@ -/***** the library wide include file *****/ -#include "liblfds611_internal.h" - -/***** defines *****/ -#define LFDS611_SLIST_USER_DATA 0 -#define LFDS611_SLIST_FLAGS 1 - -#define LFDS611_SLIST_NO_FLAGS 0x0 -#define LFDS611_SLIST_FLAG_DELETED 0x1 - -/***** structures *****/ -#pragma pack( push, LFDS611_ALIGN_SINGLE_POINTER ) - -struct lfds611_slist_state { - struct lfds611_slist_element - *volatile head; - - void - (*user_data_delete_function)( void *user_data, void *user_state ), - *user_state; -}; - -#pragma pack( pop ) - -#pragma pack( push, LFDS611_ALIGN_DOUBLE_POINTER ) - -/* TRD : this pragma pack doesn't seem to work under Windows - if the structure members are the correct way round - (next first), then user_data_and_flags ends up on - a single pointer boundary and DCAS crashes - - accordingly, I've moved user_data_and_flags first -*/ - -struct lfds611_slist_element { - void - *volatile user_data_and_flags[2]; - - // TRD : requires volatile as is target of CAS - struct lfds611_slist_element - *volatile next; -}; - -#pragma pack( pop ) - -/***** private prototypes *****/ -void lfds611_slist_internal_init_slist( struct lfds611_slist_state *ss, void (*user_data_delete_function)(void *user_data, void *user_state), void *user_state ); - -void lfds611_slist_internal_link_element_to_head( struct lfds611_slist_state *lfds611_slist_state, struct lfds611_slist_element *volatile se ); -void lfds611_slist_internal_link_element_after_element( struct lfds611_slist_element *volatile lfds611_slist_in_list_element, struct lfds611_slist_element *volatile se ); - -void lfds611_slist_internal_move_to_first_undeleted_element( struct lfds611_slist_element **se ); - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_slist/lfds611_slist_link.c b/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_slist/lfds611_slist_link.c deleted file mode 100644 index 3df2775c4f..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_slist/lfds611_slist_link.c +++ /dev/null @@ -1,53 +0,0 @@ -#include "lfds611_slist_internal.h" - - - - - -/****************************************************************************/ -void lfds611_slist_internal_link_element_to_head( struct lfds611_slist_state *ss, struct lfds611_slist_element *volatile se ) -{ - LFDS611_ALIGN(LFDS611_ALIGN_SINGLE_POINTER) struct lfds611_slist_element - *se_next; - - assert( ss != NULL ); - assert( se != NULL ); - - LFDS611_BARRIER_LOAD; - - se_next = ss->head; - - do { - se->next = se_next; - } while( se->next != (se_next = (struct lfds611_slist_element *) lfds611_abstraction_cas((volatile lfds611_atom_t *) &ss->head, (lfds611_atom_t) se, (lfds611_atom_t) se->next)) ); - - return; -} - - - - - -/****************************************************************************/ -void lfds611_slist_internal_link_element_after_element( struct lfds611_slist_element *volatile lfds611_slist_in_list_element, struct lfds611_slist_element *volatile se ) -{ - LFDS611_ALIGN(LFDS611_ALIGN_SINGLE_POINTER) struct lfds611_slist_element - *se_prev, - *se_next; - - assert( lfds611_slist_in_list_element != NULL ); - assert( se != NULL ); - - LFDS611_BARRIER_LOAD; - - se_prev = (struct lfds611_slist_element *) lfds611_slist_in_list_element; - - se_next = se_prev->next; - - do { - se->next = se_next; - } while( se->next != (se_next = (struct lfds611_slist_element *) lfds611_abstraction_cas((volatile lfds611_atom_t *) &se_prev->next, (lfds611_atom_t) se, (lfds611_atom_t) se->next)) ); - - return; -} - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_slist/lfds611_slist_new.c b/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_slist/lfds611_slist_new.c deleted file mode 100644 index b48e349ab0..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_slist/lfds611_slist_new.c +++ /dev/null @@ -1,114 +0,0 @@ -#include "lfds611_slist_internal.h" - - - - - -/****************************************************************************/ -int lfds611_slist_new( struct lfds611_slist_state **ss, void (*user_data_delete_function)(void *user_data, void *user_state), void *user_state ) -{ - int - rv = 0; - - assert( ss != NULL ); - // TRD : user_data_delete_function can be NULL - // TRD : user_state can be NULL - - *ss = (struct lfds611_slist_state *) lfds611_liblfds_aligned_malloc( sizeof(struct lfds611_slist_state), LFDS611_ALIGN_SINGLE_POINTER ); - - if( *ss != NULL ) { - lfds611_slist_internal_init_slist( *ss, user_data_delete_function, user_state ); - rv = 1; - } - - LFDS611_BARRIER_STORE; - - return( rv ); -} - - - - - -/****************************************************************************/ -//#pragma warning( disable : 4100 ) - -void lfds611_slist_use( struct lfds611_slist_state *ss ) -{ - assert( ss != NULL ); - - LFDS611_BARRIER_LOAD; - - return; -} - -//#pragma warning( default : 4100 ) - - - - - -/****************************************************************************/ -void lfds611_slist_internal_init_slist( struct lfds611_slist_state *ss, void (*user_data_delete_function)(void *user_data, void *user_state), void *user_state ) -{ - assert( ss != NULL ); - // TRD : user_data_delete_function can be NULL - // TRD : user_state can be NULL - - ss->head = NULL; - ss->user_data_delete_function = user_data_delete_function; - ss->user_state = user_state; - - return; -} - - - - - -/****************************************************************************/ -struct lfds611_slist_element *lfds611_slist_new_head( struct lfds611_slist_state *ss, void *user_data ) -{ - LFDS611_ALIGN(LFDS611_ALIGN_SINGLE_POINTER) struct lfds611_slist_element - *volatile se; - - assert( ss != NULL ); - // TRD : user_data can be NULL - - se = (struct lfds611_slist_element *) lfds611_liblfds_aligned_malloc( sizeof(struct lfds611_slist_element), LFDS611_ALIGN_DOUBLE_POINTER ); - - if( se != NULL ) { - se->user_data_and_flags[LFDS611_SLIST_USER_DATA] = user_data; - se->user_data_and_flags[LFDS611_SLIST_FLAGS] = LFDS611_SLIST_NO_FLAGS; - - lfds611_slist_internal_link_element_to_head( ss, se ); - } - - return( (struct lfds611_slist_element *) se ); -} - - - - - -/****************************************************************************/ -struct lfds611_slist_element *lfds611_slist_new_next( struct lfds611_slist_element *se, void *user_data ) -{ - LFDS611_ALIGN(LFDS611_ALIGN_SINGLE_POINTER) struct lfds611_slist_element - *volatile se_next; - - assert( se != NULL ); - // TRD : user_data can be NULL - - se_next = (struct lfds611_slist_element *) lfds611_liblfds_aligned_malloc( sizeof(struct lfds611_slist_element), LFDS611_ALIGN_DOUBLE_POINTER ); - - if( se_next != NULL ) { - se_next->user_data_and_flags[LFDS611_SLIST_USER_DATA] = user_data; - se_next->user_data_and_flags[LFDS611_SLIST_FLAGS] = LFDS611_SLIST_NO_FLAGS; - - lfds611_slist_internal_link_element_after_element( se, se_next ); - } - - return( (struct lfds611_slist_element *) se_next ); -} - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_stack/lfds611_stack_delete.c b/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_stack/lfds611_stack_delete.c deleted file mode 100644 index 75700e6b39..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_stack/lfds611_stack_delete.c +++ /dev/null @@ -1,67 +0,0 @@ -#include "lfds611_stack_internal.h" - - - - - -/****************************************************************************/ -void lfds611_stack_delete( struct lfds611_stack_state *ss, void (*user_data_delete_function)(void *user_data, void *user_state), void *user_state ) -{ - void - *user_data; - - assert( ss != NULL ); - // TRD : user_data_delete_function can be NULL - // TRD : user_state can be NULL - - while( lfds611_stack_pop(ss, &user_data) ) - if( user_data_delete_function != NULL ) - user_data_delete_function( user_data, user_state ); - - lfds611_freelist_delete( ss->fs, lfds611_stack_internal_freelist_delete_function, NULL ); - - lfds611_liblfds_aligned_free( ss ); - - return; -} - - - - - -/****************************************************************************/ -void lfds611_stack_clear( struct lfds611_stack_state *ss, void (*user_data_clear_function)(void *user_data, void *user_state), void *user_state ) -{ - void - *user_data; - - assert( ss != NULL ); - // TRD : user_data_clear_function can be NULL - // TRD : user_state can be NULL - - while( lfds611_stack_pop(ss, &user_data) ) - if( user_data_clear_function != NULL ) - user_data_clear_function( user_data, user_state ); - - return; -} - - - - - -/****************************************************************************/ -//#pragma warning( disable : 4100 ) - -void lfds611_stack_internal_freelist_delete_function( void *user_data, void *user_state ) -{ - assert( user_data != NULL ); - assert( user_state == NULL ); - - lfds611_liblfds_aligned_free( user_data ); - - return; -} - -//#pragma warning( default : 4100 ) - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_stack/lfds611_stack_internal.h b/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_stack/lfds611_stack_internal.h deleted file mode 100644 index 32f4f3fa40..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_stack/lfds611_stack_internal.h +++ /dev/null @@ -1,51 +0,0 @@ -/***** the library wide include file *****/ -#include "liblfds611_internal.h" - -/***** pragmas *****/ - -/***** defines *****/ -#define LFDS611_STACK_POINTER 0 -#define LFDS611_STACK_COUNTER 1 -#define LFDS611_STACK_PAC_SIZE 2 - -/***** structures *****/ -#pragma pack( push, LFDS611_ALIGN_DOUBLE_POINTER ) - -struct lfds611_stack_state { - // TRD : must come first for alignment - struct lfds611_stack_element - *volatile top[LFDS611_STACK_PAC_SIZE]; - - lfds611_atom_t - aba_counter; - - struct lfds611_freelist_state - *fs; -}; - -struct lfds611_stack_element { - struct lfds611_stack_element - *next[LFDS611_STACK_PAC_SIZE]; - - struct lfds611_freelist_element - *fe; - - void - *user_data; -}; - -#pragma pack( pop ) - -/***** private prototypes *****/ -int lfds611_stack_internal_freelist_init_function( void **user_data, void *user_state ); -void lfds611_stack_internal_freelist_delete_function( void *user_data, void *user_state ); - -void lfds611_stack_internal_new_element_from_freelist( struct lfds611_stack_state *ss, struct lfds611_stack_element *se[LFDS611_STACK_PAC_SIZE], void *user_data ); -void lfds611_stack_internal_new_element( struct lfds611_stack_state *ss, struct lfds611_stack_element *se[LFDS611_STACK_PAC_SIZE], void *user_data ); -void lfds611_stack_internal_init_element( struct lfds611_stack_state *ss, struct lfds611_stack_element *se[LFDS611_STACK_PAC_SIZE], struct lfds611_freelist_element *fe, void *user_data ); - -void lfds611_stack_internal_push( struct lfds611_stack_state *ss, struct lfds611_stack_element *se[LFDS611_STACK_PAC_SIZE] ); - -void lfds611_stack_internal_validate( struct lfds611_stack_state *ss, struct lfds611_validation_info *vi, enum lfds611_data_structure_validity *stack_validity, - enum lfds611_data_structure_validity *freelist_validity ); - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_stack/lfds611_stack_new.c b/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_stack/lfds611_stack_new.c deleted file mode 100644 index 927f28c88c..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_stack/lfds611_stack_new.c +++ /dev/null @@ -1,156 +0,0 @@ -#include "lfds611_stack_internal.h" - - - - - -/****************************************************************************/ -int lfds611_stack_new( struct lfds611_stack_state **ss, lfds611_atom_t number_elements ) -{ - int - rv = 0; - - assert( ss != NULL ); - // TRD : number_elements can be any value in its range - - *ss = (struct lfds611_stack_state *) lfds611_liblfds_aligned_malloc( sizeof(struct lfds611_stack_state), LFDS611_ALIGN_DOUBLE_POINTER ); - - if( *ss != NULL ) { - // TRD : the size of the lfds611_freelist is the size of the lfds611_stack - lfds611_freelist_new( &(*ss)->fs, number_elements, lfds611_stack_internal_freelist_init_function, NULL ); - - if( (*ss)->fs == NULL ) { - lfds611_liblfds_aligned_free( *ss ); - *ss = NULL; - } - - if( (*ss)->fs != NULL ) { - (*ss)->top[LFDS611_STACK_POINTER] = NULL; - (*ss)->top[LFDS611_STACK_COUNTER] = 0; - (*ss)->aba_counter = 0; - rv = 1; - } - } - - LFDS611_BARRIER_STORE; - - return( rv ); -} - - - - - -/****************************************************************************/ -//#pragma warning( disable : 4100 ) - -void lfds611_stack_use( struct lfds611_stack_state *ss ) -{ - assert( ss != NULL ); - - LFDS611_BARRIER_LOAD; - - return; -} - -//#pragma warning( default : 4100 ) - - - - - -/****************************************************************************/ -//#pragma warning( disable : 4100 ) - -int lfds611_stack_internal_freelist_init_function( void **user_data, void *user_state ) -{ - int - rv = 0; - - assert( user_data != NULL ); - assert( user_state == NULL ); - - *user_data = lfds611_liblfds_aligned_malloc( sizeof(struct lfds611_stack_element), LFDS611_ALIGN_DOUBLE_POINTER ); - - if( *user_data != NULL ) - rv = 1; - - return( rv ); -} - -//#pragma warning( default : 4100 ) - - - - - -/****************************************************************************/ -void lfds611_stack_internal_new_element_from_freelist( struct lfds611_stack_state *ss, struct lfds611_stack_element *se[LFDS611_STACK_PAC_SIZE], void *user_data ) -{ - struct lfds611_freelist_element - *fe; - - assert( ss != NULL ); - assert( se != NULL ); - // TRD : user_data can be any value in its range - - lfds611_freelist_pop( ss->fs, &fe ); - - if( fe == NULL ) - se[LFDS611_STACK_POINTER] = NULL; - - if( fe != NULL ) - lfds611_stack_internal_init_element( ss, se, fe, user_data ); - - return; -} - - - - - -/****************************************************************************/ -void lfds611_stack_internal_new_element( struct lfds611_stack_state *ss, struct lfds611_stack_element *se[LFDS611_STACK_PAC_SIZE], void *user_data ) -{ - struct lfds611_freelist_element - *fe; - - assert( ss != NULL ); - assert( se != NULL ); - // TRD : user_data can be any value in its range - - lfds611_freelist_guaranteed_pop( ss->fs, &fe ); - - if( fe == NULL ) - se[LFDS611_STACK_POINTER] = NULL; - - if( fe != NULL ) - lfds611_stack_internal_init_element( ss, se, fe, user_data ); - - return; -} - - - - - -/****************************************************************************/ -void lfds611_stack_internal_init_element( struct lfds611_stack_state *ss, struct lfds611_stack_element *se[LFDS611_STACK_PAC_SIZE], struct lfds611_freelist_element *fe, void *user_data ) -{ - assert( ss != NULL ); - assert( se != NULL ); - assert( fe != NULL ); - // TRD : user_data can be any value in its range - - lfds611_freelist_get_user_data_from_element( fe, (void **) &se[LFDS611_STACK_POINTER] ); - - se[LFDS611_STACK_COUNTER] = (struct lfds611_stack_element *) lfds611_abstraction_increment( (lfds611_atom_t *) &ss->aba_counter ); - - se[LFDS611_STACK_POINTER]->next[LFDS611_STACK_POINTER] = NULL; - se[LFDS611_STACK_POINTER]->next[LFDS611_STACK_COUNTER] = 0; - se[LFDS611_STACK_POINTER]->fe = fe; - se[LFDS611_STACK_POINTER]->user_data = user_data; - - return; -} - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_stack/lfds611_stack_push_pop.c b/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_stack/lfds611_stack_push_pop.c deleted file mode 100644 index 402051114b..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_stack/lfds611_stack_push_pop.c +++ /dev/null @@ -1,110 +0,0 @@ -#include "lfds611_stack_internal.h" - - - - - -/****************************************************************************/ -int lfds611_stack_push( struct lfds611_stack_state *ss, void *user_data ) -{ - LFDS611_ALIGN(LFDS611_ALIGN_DOUBLE_POINTER) struct lfds611_stack_element - *se[LFDS611_STACK_PAC_SIZE]; - - assert( ss != NULL ); - // TRD : user_data can be NULL - - lfds611_stack_internal_new_element_from_freelist( ss, se, user_data ); - - if( se[LFDS611_STACK_POINTER] == NULL ) - return( 0 ); - - lfds611_stack_internal_push( ss, se ); - - return( 1 ); -} - - - - - -/****************************************************************************/ -int lfds611_stack_guaranteed_push( struct lfds611_stack_state *ss, void *user_data ) -{ - LFDS611_ALIGN(LFDS611_ALIGN_DOUBLE_POINTER) struct lfds611_stack_element - *se[LFDS611_STACK_PAC_SIZE]; - - assert( ss != NULL ); - // TRD : user_data can be NULL - - /* TRD : this function allocated a new lfds611_freelist element and uses that - to push onto the lfds611_stack, guaranteeing success (unless malloc() - fails of course) - */ - - lfds611_stack_internal_new_element( ss, se, user_data ); - - // TRD : malloc failed - if( se[LFDS611_STACK_POINTER] == NULL ) - return( 0 ); - - lfds611_stack_internal_push( ss, se ); - - return( 1 ); -} - - - - - -/****************************************************************************/ -void lfds611_stack_internal_push( struct lfds611_stack_state *ss, struct lfds611_stack_element *se[LFDS611_STACK_PAC_SIZE] ) -{ - LFDS611_ALIGN(LFDS611_ALIGN_DOUBLE_POINTER) struct lfds611_stack_element - *original_se_next[LFDS611_STACK_PAC_SIZE]; - - assert( ss != NULL ); - assert( se != NULL ); - - LFDS611_BARRIER_LOAD; - - original_se_next[LFDS611_STACK_POINTER] = ss->top[LFDS611_STACK_POINTER]; - original_se_next[LFDS611_STACK_COUNTER] = ss->top[LFDS611_STACK_COUNTER]; - - do { - se[LFDS611_STACK_POINTER]->next[LFDS611_STACK_POINTER] = original_se_next[LFDS611_STACK_POINTER]; - se[LFDS611_STACK_POINTER]->next[LFDS611_STACK_COUNTER] = original_se_next[LFDS611_STACK_COUNTER]; - } while( 0 == lfds611_abstraction_dcas((volatile lfds611_atom_t *) ss->top, (lfds611_atom_t *) se, (lfds611_atom_t *) original_se_next) ); - - return; -} - - - - - -/****************************************************************************/ -int lfds611_stack_pop( struct lfds611_stack_state *ss, void **user_data ) -{ - LFDS611_ALIGN(LFDS611_ALIGN_DOUBLE_POINTER) struct lfds611_stack_element - *se[LFDS611_STACK_PAC_SIZE]; - - assert( ss != NULL ); - assert( user_data != NULL ); - - LFDS611_BARRIER_LOAD; - - se[LFDS611_STACK_COUNTER] = ss->top[LFDS611_STACK_COUNTER]; - se[LFDS611_STACK_POINTER] = ss->top[LFDS611_STACK_POINTER]; - - do { - if( se[LFDS611_STACK_POINTER] == NULL ) - return( 0 ); - } while( 0 == lfds611_abstraction_dcas((volatile lfds611_atom_t *) ss->top, (lfds611_atom_t *) se[LFDS611_STACK_POINTER]->next, (lfds611_atom_t *) se) ); - - *user_data = se[LFDS611_STACK_POINTER]->user_data; - - lfds611_freelist_push( ss->fs, se[LFDS611_STACK_POINTER]->fe ); - - return( 1 ); -} - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_stack/lfds611_stack_query.c b/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_stack/lfds611_stack_query.c deleted file mode 100644 index 51ef2d1283..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/lfds611_stack/lfds611_stack_query.c +++ /dev/null @@ -1,154 +0,0 @@ -#include "lfds611_stack_internal.h" - - - - - -/****************************************************************************/ -void lfds611_stack_query( struct lfds611_stack_state *ss, enum lfds611_stack_query_type query_type, void *query_input, void *query_output ) -{ - assert( ss != NULL ); - // TRD : query_type can be any value in its range - // TRD : query_iput can be NULL - assert( query_output != NULL ); - - LFDS611_BARRIER_LOAD; - - switch( query_type ) { - case LFDS611_STACK_QUERY_ELEMENT_COUNT: - assert( query_input == NULL ); - - lfds611_freelist_query( ss->fs, LFDS611_FREELIST_QUERY_ELEMENT_COUNT, NULL, query_output ); - break; - - case LFDS611_STACK_QUERY_VALIDATE: - // TRD : query_input can be NULL - - /* TRD : the validation info passed in is for the stack - it indicates the minimum and maximum number of elements - which should be present - - we need to validate the freelist - and validate the stack - - we cannot know the min/max for the freelist, given only - the min/max for the stack - */ - - lfds611_freelist_query( ss->fs, LFDS611_FREELIST_QUERY_VALIDATE, NULL, (enum lfds611_data_structure_validity *) query_output ); - - if( *(enum lfds611_data_structure_validity *) query_output == LFDS611_VALIDITY_VALID ) - lfds611_stack_internal_validate( ss, (struct lfds611_validation_info *) query_input, (enum lfds611_data_structure_validity *) query_output, ((enum lfds611_data_structure_validity *) query_output)+1 ); - - break; - } - - return; -} - - - - - -/****************************************************************************/ -void lfds611_stack_internal_validate( struct lfds611_stack_state *ss, struct lfds611_validation_info *vi, enum lfds611_data_structure_validity *stack_validity, - enum lfds611_data_structure_validity *freelist_validity ) -{ - struct lfds611_stack_element - *se, - *se_slow, - *se_fast; - - lfds611_atom_t - element_count = 0, - total_elements; - - struct lfds611_validation_info - freelist_vi; - - assert( ss != NULL ); - // TRD : vi can be NULL - assert( stack_validity != NULL ); - - *stack_validity = LFDS611_VALIDITY_VALID; - - se_slow = se_fast = (struct lfds611_stack_element *) ss->top[LFDS611_STACK_POINTER]; - - /* TRD : first, check for a loop - we have two pointers - both of which start at the top of the stack - we enter a loop - and on each iteration - we advance one pointer by one element - and the other by two - - we exit the loop when both pointers are NULL - (have reached the end of the stack) - - or - - if we fast pointer 'sees' the slow pointer - which means we have a loop - */ - - if( se_slow != NULL ) - do { - se_slow = se_slow->next[LFDS611_STACK_POINTER]; - - if( se_fast != NULL ) - se_fast = se_fast->next[LFDS611_STACK_POINTER]; - - if( se_fast != NULL ) - se_fast = se_fast->next[LFDS611_STACK_POINTER]; - } while( se_slow != NULL and se_fast != se_slow ); - - if( se_fast != NULL and se_slow != NULL and se_fast == se_slow ) - *stack_validity = LFDS611_VALIDITY_INVALID_LOOP; - - /* TRD : now check for expected number of elements - vi can be NULL, in which case we do not check - we know we don't have a loop from our earlier check - */ - - if( *stack_validity == LFDS611_VALIDITY_VALID and vi != NULL ) { - se = (struct lfds611_stack_element *) ss->top[LFDS611_STACK_POINTER]; - - while( se != NULL ) { - element_count++; - se = (struct lfds611_stack_element *) se->next[LFDS611_STACK_POINTER]; - } - - if( element_count < vi->min_elements ) - *stack_validity = LFDS611_VALIDITY_INVALID_MISSING_ELEMENTS; - - if( element_count > vi->max_elements ) - *stack_validity = LFDS611_VALIDITY_INVALID_ADDITIONAL_ELEMENTS; - } - - /* TRD : now we validate the freelist - - we may be able to check for the expected number of - elements in the freelist - - if the caller has given us an expected min and max - number of elements in the stack, then the total number - of elements in the freelist, minus that min and max, - gives us the expected number of elements in the - freelist - */ - - if( vi != NULL ) { - lfds611_freelist_query( ss->fs, LFDS611_FREELIST_QUERY_ELEMENT_COUNT, NULL, (void *) &total_elements ); - - freelist_vi.min_elements = total_elements - vi->max_elements; - freelist_vi.max_elements = total_elements - vi->min_elements; - - lfds611_freelist_query( ss->fs, LFDS611_FREELIST_QUERY_VALIDATE, (void *) &freelist_vi, (void *) freelist_validity ); - } - - if( vi == NULL ) - lfds611_freelist_query( ss->fs, LFDS611_FREELIST_QUERY_VALIDATE, NULL, (void *) freelist_validity ); - - return; -} - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/liblfds611_internal.h b/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/liblfds611_internal.h deleted file mode 100644 index 9bcf726504..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/liblfds611/src/liblfds611_internal.h +++ /dev/null @@ -1,25 +0,0 @@ -/***** public prototypes *****/ -#include "liblfds611.h" - -/***** defines *****/ -#define and && -#define or || - -#define RAISED 1 -#define LOWERED 0 - -#define NO_FLAGS 0x0 - -/***** private prototypes *****/ -void *lfds611_liblfds_aligned_malloc( size_t size, size_t align_in_bytes ); -void lfds611_liblfds_aligned_free( void *memory ); - -static LFDS611_INLINE lfds611_atom_t lfds611_abstraction_cas( volatile lfds611_atom_t *destination, lfds611_atom_t exchange, lfds611_atom_t compare ); -static LFDS611_INLINE unsigned char lfds611_abstraction_dcas( volatile lfds611_atom_t *destination, lfds611_atom_t *exchange, lfds611_atom_t *compare ); -static LFDS611_INLINE lfds611_atom_t lfds611_abstraction_increment( volatile lfds611_atom_t *value ); - -/***** inlined code *****/ -#include "lfds611_abstraction/lfds611_abstraction_cas.c" -#include "lfds611_abstraction/lfds611_abstraction_dcas.c" -#include "lfds611_abstraction/lfds611_abstraction_increment.c" - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/test/building.txt b/openair2/UTIL/LFDS/liblfds6.1.1/test/building.txt deleted file mode 100644 index 685cda0cf1..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/test/building.txt +++ /dev/null @@ -1,51 +0,0 @@ -building test -============= - -Windows (user-mode) -=================== -1. Use Microsoft Visual Studio 2008 or Visual C++ 2008 Express Edition (or - later versions) to load "liblfds.sln". The "Win32" platform is x86, - the "x64" platform is x64. The test programme provides the "Release" - and "Debug" targets. The other targets ("Release DLL", "Release Lib", - "Debug DLL" and "Debug Lib") are carried over will-nilly from the liblds - library. - - All builds will work, but DLL builds will require the DLL from liblfds - to be placed into a location where the test executable can find it (e.g. - the same directory). - -2. Use Microsoft Windows SDK and GNUmake to run makefile.windows (obviously - you'll need to have run setenv.bat or the appropriate vcvars*.bat first; - you can build for x64/64-bit and x86/32-bit - just run the correct batch - file). - - If liblfds has been built as a DLL, the DLL from liblfds needs to be - placed into a location where the test executable can find it (e.g. the - same directory). - - Targets are "rel", "dbg" and "clean". You need to clean between switching - targets. - -Windows (kernel) -================ -No build supported, since this is a command line utility. - -Linux -===== -Use GNUmake to run "makefile.linux". Targets are "rel", "dbg" and -"clean". You need to clean between switching targets. - -If liblfds has been built as a shared object, the shared object file from -liblfds will need to be placed somewhere the text executable can find it. - -A convenient solution is to place the shared object file in the same -directory as the text executable and set the environment variable -"LD_LIBRARY_PATH" to ".", e.g. in bash; - -export LD_LIBRARY_PATH=. - -Remember to unset after finishing testing, or your system will continue -to scan the current directory for shared object files. - -unset LD_LIBRARY_PATH - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/test/makefile.linux b/openair2/UTIL/LFDS/liblfds6.1.1/test/makefile.linux deleted file mode 100644 index 8bc0c1c860..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/test/makefile.linux +++ /dev/null @@ -1,82 +0,0 @@ -##### paths ##### -BINDIR = bin -INCDIR = ../liblfds611/inc -LIBDIR = ../liblfds611/bin -OBJDIR = obj -SRCDIR = src - -##### misc ##### -QUIETLY = 1>nul 2>nul - -##### sources, objects and libraries ##### -BINNAME = test -BINARY = $(BINDIR)/$(BINNAME) -SRCDIRS = . -SOURCES = abstraction_cpu_count.c test_abstraction.c abstraction_thread_start.c abstraction_thread_wait.c benchmark_freelist.c benchmark_queue.c benchmark_ringbuffer.c benchmark_stack.c test_freelist.c main.c misc.c test_queue.c test_ringbuffer.c test_slist.c test_stack.c -OBJECTS = $(patsubst %.c,$(OBJDIR)/%.o,$(notdir $(SOURCES))) -SYSLIBS = -lpthread -lc -lm -USRLIBS = -llfds611 - -##### CPU variants ##### -UNAME = $(shell uname -m) -GCCARCH = -march=$(UNAME) - -ifeq ($(UNAME),x86_64) - GCCARCH = -march=core2 -endif - -ifeq ($(findstring arm,$(UNAME)),arm) - GCCARCH = -march=armv6k -marm -endif - -##### tools ##### -MAKE = make -MFLAGS = - -DG = gcc -DGFLAGS = -MM -std=c99 -I"$(SRCDIR)" -I"$(INCDIR)" - -CC = gcc -CFBASE = -Wall -Wno-unknown-pragmas -std=c99 $(GCCARCH) -pthread -c -I"$(SRCDIR)" -I"$(INCDIR)" -CFREL = -O2 -Wno-strict-aliasing -CFDBG = -O0 -g - -LD = gcc -LFBASE = -L"$(LIBDIR)" -LFREL = -O2 -s -LFDBG = -O0 -g - -##### variants ##### -CFLAGS = $(CFBASE) $(CFDBG) -LFLAGS = $(LFBASE) $(LFDBG) - -ifeq ($(MAKECMDGOALS),rel) - CFLAGS = $(CFBASE) $(CFREL) - LFLAGS = $(LFBASE) $(LFREL) -endif - -##### search paths ##### -vpath %.c $(patsubst %,$(SRCDIR)/%:,$(SRCDIRS)) - -##### implicit rules ##### -$(OBJDIR)/%.o : %.c - $(DG) $(DGFLAGS) $< >$(OBJDIR)/$*.d - $(CC) $(CFLAGS) -o $@ $< - -##### explicit rules ##### -$(BINARY) : $(OBJECTS) - $(LD) -o $(BINARY) $(LFLAGS) $(OBJECTS) $(USRLIBS) $(SYSLIBS) - chmod +x $(BINARY) - -##### phony ##### -.PHONY : clean rel dbg - -clean : - @rm -f $(BINDIR)/$(BINNAME) $(OBJDIR)/*.o $(OBJDIR)/*.d - -rel : $(BINARY) -dbg : $(BINARY) - -##### dependencies ##### --include $(DEPENDS) - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/test/makefile.windows b/openair2/UTIL/LFDS/liblfds6.1.1/test/makefile.windows deleted file mode 100644 index d899414b07..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/test/makefile.windows +++ /dev/null @@ -1,64 +0,0 @@ -##### paths ##### -BINDIR = bin -INCDIR = ../liblfds611/inc -LIBDIR = ../liblfds611/bin -OBJDIR = obj -SRCDIR = src - -##### misc ##### -QUIETLY = 1>nul 2>nul - -##### sources, objects and libraries ##### -BINNAME = test -BINARY = $(BINDIR)\$(BINNAME).exe -SRCDIRS = . -SOURCES = abstraction_cpu_count.c test_abstraction.c abstraction_thread_start.c abstraction_thread_wait.c benchmark_freelist.c benchmark_queue.c benchmark_ringbuffer.c benchmark_stack.c test_freelist.c main.c misc.c test_queue.c test_ringbuffer.c test_slist.c test_stack.c -OBJECTS = $(patsubst %.c,$(OBJDIR)/%.obj,$(notdir $(SOURCES))) -SYSLIBS = kernel32.lib -USRLIBS = liblfds611.lib - -##### tools ##### -MAKE = make -MFLAGS = - -CC = cl -CFBASE = /nologo /W4 /WX /c "-I$(SRCDIR)" "-I$(INCLUDE)" "-I$(INCDIR)" "/Fd$(BINDIR)\$(BINNAME).pdb" /D UNICODE /D _UNICODE /DWIN32_LEAN_AND_MEAN /D_CRT_SECURE_NO_WARNINGS -CFREL = /Ox /DNDEBUG /MT -CFDBG = /Od /Gm /Zi /D_DEBUG /MTd - -LD = link -LFBASE = "/libpath:$(LIB)" "/libpath:$(LIBDIR)" /nologo /subsystem:console /nodefaultlib /nxcompat /wx -LFREL = /incremental:no -LFDBG = /debug "/pdb:$(BINDIR)\$(BINNAME).pdb" - -##### variants ##### -CFLAGS = $(CFBASE) $(CFDBG) -LFLAGS = $(LFBASE) $(LFDBG) -CLIB = libcmtd.lib - -ifeq ($(MAKECMDGOALS),rel) - CFLAGS = $(CFBASE) $(CFREL) - LFLAGS = $(LFBASE) $(LFREL) - CLIB = libcmt.lib -endif - -##### search paths ##### -vpath %.c $(patsubst %,$(SRCDIR)/%;,$(SRCDIRS)) - -##### implicit rules ##### -$(OBJDIR)/%.obj : %.c - $(CC) $(CFLAGS) "/Fo$@" $< - -##### explicit rules ##### -$(BINARY) : $(OBJECTS) - $(LD) $(LFLAGS) $(CLIB) $(SYSLIBS) $(USRLIBS) $(OBJECTS) /out:$(BINARY) - -##### phony ##### -.PHONY : clean rel dbg - -clean : - @erase /Q $(OBJDIR)\*.obj $(BINDIR)\$(BINNAME).* $(QUIETLY) - -rel : $(BINARY) -dbg : $(BINARY) - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/test/src/abstraction.h b/openair2/UTIL/LFDS/liblfds6.1.1/test/src/abstraction.h deleted file mode 100644 index 7a7e82f9bb..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/test/src/abstraction.h +++ /dev/null @@ -1,50 +0,0 @@ -/***** defines *****/ -#if (defined _WIN32 && defined _MSC_VER && !defined WIN_KERNEL_BUILD) -/* TRD : any Windows (user-mode) on any CPU with the Microsoft C compiler - - _WIN32 indicates 64-bit or 32-bit Windows - _MSC_VER indicates Microsoft C compiler - !WIN_KERNEL_BUILD indicates Windows user-mode -*/ - -#include -typedef HANDLE thread_state_t; -typedef DWORD thread_return_t; -#define CALLING_CONVENTION WINAPI -#endif - -#if (defined _WIN32 && defined _MSC_VER && defined WIN_KERNEL_BUILD) -/* TRD : any Windows (kernel-mode) on any CPU with the Microsoft C compiler - - _WIN32 indicates 64-bit or 32-bit Windows - _MSC_VER indicates Microsoft C compiler - WIN_KERNEL_BUILD indicates Windows kernel -*/ - -#include -typedef HANDLE thread_state_t; -typedef VOID thread_return_t; -#define CALLING_CONVENTION -#endif - -#if (defined __unix__ && defined __GNUC__) -/* TRD : any UNIX on any CPU with GCC - - __unix__ indicates Solaris, Linux, HPUX, etc - __GNUC__ indicates GCC -*/ -#include -#include -#include -typedef pthread_t thread_state_t; -typedef void * thread_return_t; -#define CALLING_CONVENTION -#endif - -typedef thread_return_t (CALLING_CONVENTION *thread_function_t)( void *thread_user_state ); - -/***** public prototypes *****/ -unsigned int abstraction_cpu_count( void ); -int abstraction_thread_start( thread_state_t *thread_state, unsigned int cpu, thread_function_t thread_function, void *thread_user_state ); -void abstraction_thread_wait( thread_state_t thread_state ); - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/test/src/abstraction_cpu_count.c b/openair2/UTIL/LFDS/liblfds6.1.1/test/src/abstraction_cpu_count.c deleted file mode 100644 index fb6ff5e79c..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/test/src/abstraction_cpu_count.c +++ /dev/null @@ -1,81 +0,0 @@ -#include "internal.h" - - - - - -/****************************************************************************/ -#if (defined _WIN32 && defined _MSC_VER && !defined WIN_KERNEL_BUILD) - -/* TRD : any Windows (user-mode) on any CPU with the Microsoft C compiler - - _WIN32 indicates 64-bit or 32-bit Windows - _MSC_VER indicates Microsoft C compiler - !WIN_KERNEL_BUILD indicates Windows user-mode -*/ - -unsigned int abstraction_cpu_count() -{ - SYSTEM_INFO - si; - - GetNativeSystemInfo( &si ); - - return( (unsigned int) si.dwNumberOfProcessors ); -} - -#endif - - - - - -/****************************************************************************/ -#if (defined _WIN32 && defined _MSC_VER && defined WIN_KERNEL_BUILD) - -/* TRD : any Windows on any CPU with the Microsoft C compiler - - _WIN32 indicates 64-bit or 32-bit Windows - _MSC_VER indicates Microsoft C compiler - WIN_KERNEL_BUILD indicates Windows kernel -*/ - -unsigned int abstraction_cpu_count() -{ - unsigned int - active_processor_count; - - active_processor_count = KeQueryActiveProcessorCount( NULL ); - - return( active_processor_count ); -} - -#endif - - - - - -/****************************************************************************/ -#if (defined __linux__ && defined __GNUC__) - -/* TRD : Linux on any CPU with GCC - - this function I believe is Linux specific and varies by UNIX flavour - - __linux__ indicates Linux - __GNUC__ indicates GCC -*/ - -unsigned int abstraction_cpu_count() -{ - long int - cpu_count; - - cpu_count = sysconf( _SC_NPROCESSORS_ONLN ); - - return( (unsigned int) cpu_count ); -} - -#endif - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/test/src/abstraction_thread_start.c b/openair2/UTIL/LFDS/liblfds6.1.1/test/src/abstraction_thread_start.c deleted file mode 100644 index 5075c5f8de..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/test/src/abstraction_thread_start.c +++ /dev/null @@ -1,141 +0,0 @@ -#include "internal.h" - - - - - -/****************************************************************************/ -#if (defined _WIN32 && defined _MSC_VER && !defined WIN_KERNEL_BUILD) - -/* TRD : any Windows (user-mode) on any CPU with the Microsoft C compiler - - _WIN32 indicates 64-bit or 32-bit Windows - _MSC_VER indicates Microsoft C compiler - !WIN_KERNEL_BUILD indicates Windows user-mode -*/ - -int abstraction_thread_start( thread_state_t *thread_state, unsigned int cpu, thread_function_t thread_function, void *thread_user_state ) -{ - int - rv = 0; - - DWORD - thread_id; - - DWORD_PTR - affinity_mask, - result; - - assert( thread_state != NULL ); - // TRD : cpu can be any value in its range - assert( thread_function != NULL ); - // TRD : thread_user_state can be NULL - - affinity_mask = (DWORD_PTR) (1 << cpu); - - *thread_state = CreateThread( NULL, 0, thread_function, thread_user_state, NO_FLAGS, &thread_id ); - - result = SetThreadAffinityMask( *thread_state, affinity_mask ); - - if( *thread_state != NULL and result != 0 ) - rv = 1; - - return( rv ); -} - -#endif - - - - - -/****************************************************************************/ -#if (defined _WIN32 && defined _MSC_VER && defined WIN_KERNEL_BUILD) - -/* TRD : any Windows on any CPU with the Microsoft C compiler - - _WIN32 indicates 64-bit or 32-bit Windows - _MSC_VER indicates Microsoft C compiler - WIN_KERNEL_BUILD indicates Windows kernel -*/ - -int abstraction_thread_start( thread_state_t *thread_state, unsigned int cpu, thread_function_t thread_function, void *thread_user_state ) -{ - int - rv = 0; - - KAFFINITY - affinity_mask - - NTSTATUS - nts_create, - nts_affinity; - - assert( thread_state != NULL ); - // TRD : cpu can be any value in its range - assert( thread_function != NULL ); - // TRD : thread_user_state can be NULL - - affinity_mask = 1 << cpu; - - nts_create = PsCreateSystemThread( thread_state, THREAD_ALL_ACCESS, NULL, NULL, NULL, thread_function, thread_user_state ); - - nts_affinity = ZwSetInformationThread( thread_state, ThreadAffinityMask, &affinity_mask, sizeof(KAFFINITY) ); - - if( nts_create == STATUS_SUCCESS and nts_affinity == STATUS_SUCCESS ) - rv = 1; - - return( rv ); -} - -#endif - - - - - -/****************************************************************************/ -#if (defined __unix__) - -/* TRD : any UNIX on any CPU with any compiler - - I assumed pthreads is available on any UNIX. - - __unix__ indicates Solaris, Linux, HPUX, etc -*/ - -int abstraction_thread_start( thread_state_t *thread_state, unsigned int cpu, thread_function_t thread_function, void *thread_user_state ) -{ - int - rv = 0, - rv_create; - - pthread_attr_t - attr; - - cpu_set_t - cpuset; - - assert( thread_state != NULL ); - // TRD : cpu can be any value in its range - assert( thread_function != NULL ); - // TRD : thread_user_state can be NULL - - pthread_attr_init( &attr ); - - CPU_ZERO( &cpuset ); - CPU_SET( cpu, &cpuset ); - pthread_attr_setaffinity_np( &attr, sizeof(cpuset), &cpuset ); - - rv_create = pthread_create( thread_state, &attr, thread_function, thread_user_state ); - - if( rv_create == 0 ) - rv = 1; - - pthread_attr_destroy( &attr ); - - return( rv ); -} - -#endif - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/test/src/abstraction_thread_wait.c b/openair2/UTIL/LFDS/liblfds6.1.1/test/src/abstraction_thread_wait.c deleted file mode 100644 index a5835c9051..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/test/src/abstraction_thread_wait.c +++ /dev/null @@ -1,71 +0,0 @@ -#include "internal.h" - - - - - -/****************************************************************************/ -#if (defined _WIN32 && defined _MSC_VER && !defined WIN_KERNEL_BUILD) - -/* TRD : any Windows (user-mode) on any CPU with the Microsoft C compiler - - _WIN32 indicates 64-bit or 32-bit Windows - _MSC_VER indicates Microsoft C compiler - !WIN_KERNEL_BUILD indicates Windows user-mode -*/ - -void abstraction_thread_wait( thread_state_t thread_state ) -{ - WaitForSingleObject( thread_state, INFINITE ); - - return; -} - -#endif - - - - - -/****************************************************************************/ -#if (defined _WIN32 && defined _MSC_VER && defined WIN_KERNEL_BUILD) - -/* TRD : any Windows on any CPU with the Microsoft C compiler - - _WIN32 indicates 64-bit or 32-bit Windows - _MSC_VER indicates Microsoft C compiler - WIN_KERNEL_BUILD indicates Windows kernel -*/ - -void abstraction_thread_wait( thread_state_t thread_state ) -{ - KeWaitForSingleObject( thread_state, Executive, KernelMode, FALSE, NULL ); - - return; -} - -#endif - - - - - -/****************************************************************************/ -#if (defined __unix__) - -/* TRD : any UNIX on any CPU with any compiler - - I assumed pthreads is available on any UNIX. - - __unix__ indicates Solaris, Linux, HPUX, etc -*/ - -void abstraction_thread_wait( thread_state_t thread_state ) -{ - pthread_join( thread_state, NULL ); - - return; -} - -#endif - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/test/src/benchmark_freelist.c b/openair2/UTIL/LFDS/liblfds6.1.1/test/src/benchmark_freelist.c deleted file mode 100644 index 689de3eaa7..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/test/src/benchmark_freelist.c +++ /dev/null @@ -1,134 +0,0 @@ -#include "internal.h" - - - - - -/****************************************************************************/ -void benchmark_lfds611_freelist( void ) -{ - unsigned int - loop, - thread_count, - cpu_count; - - struct lfds611_freelist_state - *fs; - - struct lfds611_freelist_benchmark - *fb; - - thread_state_t - *thread_handles; - - lfds611_atom_t - total_operations_for_full_test_for_all_cpus, - total_operations_for_full_test_for_all_cpus_for_one_cpu = 0; - - double - mean_operations_per_second_per_cpu, - difference_per_second_per_cpu, - total_difference_per_second_per_cpu, - std_dev_per_second_per_cpu, - scalability; - - /* TRD : here we benchmark the freelist - - the benchmark is to have a single freelist - where a worker thread busy-works popping and then pushing - */ - - cpu_count = abstraction_cpu_count(); - - thread_handles = (thread_state_t *) malloc( sizeof(thread_state_t) * cpu_count ); - - fb = (struct lfds611_freelist_benchmark *) malloc( sizeof(struct lfds611_freelist_benchmark) * cpu_count ); - - // TRD : print the benchmark ID and CSV header - printf( "\n" - "Release %s Freelist Benchmark #1\n" - "CPUs,total ops,mean ops/sec per CPU,standard deviation,scalability\n", LFDS611_RELEASE_NUMBER_STRING ); - - // TRD : we run CPU count times for scalability - for( thread_count = 1 ; thread_count <= cpu_count ; thread_count++ ) { - // TRD : initialisation - lfds611_freelist_new( &fs, 1000, NULL, NULL ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) { - (fb+loop)->fs = fs; - (fb+loop)->operation_count = 0; - } - - // TRD : main test - for( loop = 0 ; loop < thread_count ; loop++ ) - abstraction_thread_start( &thread_handles[loop], loop, benchmark_lfds611_freelist_thread_pop_and_push, fb+loop ); - - for( loop = 0 ; loop < thread_count ; loop++ ) - abstraction_thread_wait( thread_handles[loop] ); - - // TRD : post test math - total_operations_for_full_test_for_all_cpus = 0; - total_difference_per_second_per_cpu = 0; - - for( loop = 0 ; loop < thread_count ; loop++ ) - total_operations_for_full_test_for_all_cpus += (fb+loop)->operation_count; - - mean_operations_per_second_per_cpu = ((double) total_operations_for_full_test_for_all_cpus / (double) thread_count) / (double) 10; - - if( thread_count == 1 ) - total_operations_for_full_test_for_all_cpus_for_one_cpu = total_operations_for_full_test_for_all_cpus; - - for( loop = 0 ; loop < thread_count ; loop++ ) { - difference_per_second_per_cpu = ((double) (fb+loop)->operation_count / (double) 10) - mean_operations_per_second_per_cpu; - total_difference_per_second_per_cpu += difference_per_second_per_cpu * difference_per_second_per_cpu; - } - - std_dev_per_second_per_cpu = sqrt( (double) total_difference_per_second_per_cpu ); - - scalability = (double) total_operations_for_full_test_for_all_cpus / (double) (total_operations_for_full_test_for_all_cpus_for_one_cpu * thread_count); - - printf( "%u,%u,%.0f,%.0f,%0.2f\n", thread_count, (unsigned int) total_operations_for_full_test_for_all_cpus, mean_operations_per_second_per_cpu, std_dev_per_second_per_cpu, scalability ); - - // TRD : cleanup - lfds611_freelist_delete( fs, NULL, NULL ); - } - - free( fb ); - - free( thread_handles ); - - return; -} - - - - - -/****************************************************************************/ -thread_return_t CALLING_CONVENTION benchmark_lfds611_freelist_thread_pop_and_push( void *freelist_benchmark ) -{ - struct lfds611_freelist_benchmark - *fb; - - struct lfds611_freelist_element - *fe; - - time_t - start_time; - - assert( freelist_benchmark != NULL ); - - fb = (struct lfds611_freelist_benchmark *) freelist_benchmark; - - time( &start_time ); - - while( time(NULL) < start_time + 10 ) { - lfds611_freelist_pop( fb->fs, &fe ); - lfds611_freelist_push( fb->fs, fe ); - - fb->operation_count += 2; - } - - return( (thread_return_t) EXIT_SUCCESS ); -} - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/test/src/benchmark_queue.c b/openair2/UTIL/LFDS/liblfds6.1.1/test/src/benchmark_queue.c deleted file mode 100644 index 70ab8e06e5..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/test/src/benchmark_queue.c +++ /dev/null @@ -1,138 +0,0 @@ -#include "internal.h" - - - - - -/****************************************************************************/ -void benchmark_lfds611_queue( void ) -{ - unsigned int - loop, - thread_count, - cpu_count; - - struct lfds611_queue_state - *qs; - - struct lfds611_queue_benchmark - *qb; - - thread_state_t - *thread_handles; - - lfds611_atom_t - total_operations_for_full_test_for_all_cpus, - total_operations_for_full_test_for_all_cpus_for_one_cpu = 0; - - double - mean_operations_per_second_per_cpu, - difference_per_second_per_cpu, - total_difference_per_second_per_cpu, - std_dev_per_second_per_cpu, - scalability; - - /* TRD : here we benchmark the queue - - the benchmark is to have a single queue - where a worker thread busy-works dequeuing and then queuing - */ - - cpu_count = abstraction_cpu_count(); - - thread_handles = (thread_state_t *) malloc( sizeof(thread_state_t) * cpu_count ); - - qb = (struct lfds611_queue_benchmark *) malloc( sizeof(struct lfds611_queue_benchmark) * cpu_count ); - - // TRD : print the benchmark ID and CSV header - printf( "\n" - "Release %s Queue Benchmark #1\n" - "CPUs,total ops,mean ops/sec per CPU,standard deviation,scalability\n", LFDS611_RELEASE_NUMBER_STRING ); - - // TRD : we run CPU count times for scalability - for( thread_count = 1 ; thread_count <= cpu_count ; thread_count++ ) { - // TRD : initialisation - lfds611_queue_new( &qs, 1000 ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) { - (qb+loop)->qs = qs; - (qb+loop)->operation_count = 0; - } - - // TRD : populate the queue (we don't actually use the user data) - for( loop = 0 ; loop < 500 ; loop++ ) - lfds611_queue_enqueue( qs, (void *) (lfds611_atom_t) loop ); - - // TRD : main test - for( loop = 0 ; loop < thread_count ; loop++ ) - abstraction_thread_start( &thread_handles[loop], loop, benchmark_lfds611_queue_thread_delfds611_queue_and_enqueue, qb+loop ); - - for( loop = 0 ; loop < thread_count ; loop++ ) - abstraction_thread_wait( thread_handles[loop] ); - - // TRD : post test math - total_operations_for_full_test_for_all_cpus = 0; - total_difference_per_second_per_cpu = 0; - - for( loop = 0 ; loop < thread_count ; loop++ ) - total_operations_for_full_test_for_all_cpus += (qb+loop)->operation_count; - - mean_operations_per_second_per_cpu = ((double) total_operations_for_full_test_for_all_cpus / (double) thread_count) / (double) 10; - - if( thread_count == 1 ) - total_operations_for_full_test_for_all_cpus_for_one_cpu = total_operations_for_full_test_for_all_cpus; - - for( loop = 0 ; loop < thread_count ; loop++ ) { - difference_per_second_per_cpu = ((double) (qb+loop)->operation_count / (double) 10) - mean_operations_per_second_per_cpu; - total_difference_per_second_per_cpu += difference_per_second_per_cpu * difference_per_second_per_cpu; - } - - std_dev_per_second_per_cpu = sqrt( (double) total_difference_per_second_per_cpu ); - - scalability = (double) total_operations_for_full_test_for_all_cpus / (double) (total_operations_for_full_test_for_all_cpus_for_one_cpu * thread_count); - - printf( "%u,%u,%.0f,%.0f,%0.2f\n", thread_count, (unsigned int) total_operations_for_full_test_for_all_cpus, mean_operations_per_second_per_cpu, std_dev_per_second_per_cpu, scalability ); - - // TRD : cleanup - lfds611_queue_delete( qs, NULL, NULL ); - } - - free( qb ); - - free( thread_handles ); - - return; -} - - - - - -/****************************************************************************/ -thread_return_t CALLING_CONVENTION benchmark_lfds611_queue_thread_delfds611_queue_and_enqueue( void *queue_benchmark ) -{ - struct lfds611_queue_benchmark - *qb; - - void - *user_data; - - time_t - start_time; - - assert( queue_benchmark != NULL ); - - qb = (struct lfds611_queue_benchmark *) queue_benchmark; - - time( &start_time ); - - while( time(NULL) < start_time + 10 ) { - lfds611_queue_dequeue( qb->qs, &user_data ); - lfds611_queue_enqueue( qb->qs, user_data ); - - qb->operation_count += 2; - } - - return( (thread_return_t) EXIT_SUCCESS ); -} - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/test/src/benchmark_ringbuffer.c b/openair2/UTIL/LFDS/liblfds6.1.1/test/src/benchmark_ringbuffer.c deleted file mode 100644 index 1322b4e0ce..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/test/src/benchmark_ringbuffer.c +++ /dev/null @@ -1,137 +0,0 @@ -#include "internal.h" - - - - - -/****************************************************************************/ -void benchmark_lfds611_ringbuffer( void ) -{ - unsigned int - loop, - thread_count, - cpu_count; - - struct lfds611_ringbuffer_state - *rs; - - struct lfds611_ringbuffer_benchmark - *rb; - - thread_state_t - *thread_handles; - - lfds611_atom_t - total_operations_for_full_test_for_all_cpus, - total_operations_for_full_test_for_all_cpus_for_one_cpu = 0; - - double - mean_operations_per_second_per_cpu, - difference_per_second_per_cpu, - total_difference_per_second_per_cpu, - std_dev_per_second_per_cpu, - scalability; - - /* TRD : here we benchmark the ringbuffer - - the benchmark is to have a single ringbuffer - where a worker thread busy-works writing and then reading - */ - - cpu_count = abstraction_cpu_count(); - - thread_handles = (thread_state_t *) malloc( sizeof(thread_state_t) * cpu_count ); - - rb = (struct lfds611_ringbuffer_benchmark *) malloc( sizeof(struct lfds611_ringbuffer_benchmark) * cpu_count ); - - // TRD : print the benchmark ID and CSV header - printf( "\n" - "Release %s Ringbuffer Benchmark #1\n" - "CPUs,total ops,mean ops/sec per CPU,standard deviation,scalability\n", LFDS611_RELEASE_NUMBER_STRING ); - - // TRD : we run CPU count times for scalability - for( thread_count = 1 ; thread_count <= cpu_count ; thread_count++ ) { - // TRD : initialisation - lfds611_ringbuffer_new( &rs, 1000, NULL, NULL ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) { - (rb+loop)->rs = rs; - (rb+loop)->operation_count = 0; - } - - // TRD : main test - for( loop = 0 ; loop < thread_count ; loop++ ) - abstraction_thread_start( &thread_handles[loop], loop, benchmark_lfds611_ringbuffer_thread_write_and_read, rb+loop ); - - for( loop = 0 ; loop < thread_count ; loop++ ) - abstraction_thread_wait( thread_handles[loop] ); - - // TRD : post test math - total_operations_for_full_test_for_all_cpus = 0; - total_difference_per_second_per_cpu = 0; - - for( loop = 0 ; loop < thread_count ; loop++ ) - total_operations_for_full_test_for_all_cpus += (rb+loop)->operation_count; - - mean_operations_per_second_per_cpu = ((double) total_operations_for_full_test_for_all_cpus / (double) thread_count) / (double) 10; - - if( thread_count == 1 ) - total_operations_for_full_test_for_all_cpus_for_one_cpu = total_operations_for_full_test_for_all_cpus; - - for( loop = 0 ; loop < thread_count ; loop++ ) { - difference_per_second_per_cpu = ((double) (rb+loop)->operation_count / (double) 10) - mean_operations_per_second_per_cpu; - total_difference_per_second_per_cpu += difference_per_second_per_cpu * difference_per_second_per_cpu; - } - - std_dev_per_second_per_cpu = sqrt( (double) total_difference_per_second_per_cpu ); - - scalability = (double) total_operations_for_full_test_for_all_cpus / (double) (total_operations_for_full_test_for_all_cpus_for_one_cpu * thread_count); - - printf( "%u,%u,%.0f,%.0f,%0.2f\n", thread_count, (unsigned int) total_operations_for_full_test_for_all_cpus, mean_operations_per_second_per_cpu, std_dev_per_second_per_cpu, scalability ); - - // TRD : cleanup - lfds611_ringbuffer_delete( rs, NULL, NULL ); - } - - free( rb ); - - free( thread_handles ); - - return; -} - - - - - -/****************************************************************************/ -thread_return_t CALLING_CONVENTION benchmark_lfds611_ringbuffer_thread_write_and_read( void *ringbuffer_benchmark ) -{ - struct lfds611_ringbuffer_benchmark - *rb; - - struct lfds611_freelist_element - *fe; - - time_t - start_time; - - assert( ringbuffer_benchmark != NULL ); - - rb = (struct lfds611_ringbuffer_benchmark *) ringbuffer_benchmark; - - time( &start_time ); - - while( time(NULL) < start_time + 10 ) { - lfds611_ringbuffer_get_write_element( rb->rs, &fe, NULL ); - lfds611_ringbuffer_put_write_element( rb->rs, fe ); - - lfds611_ringbuffer_get_read_element( rb->rs, &fe ); - lfds611_ringbuffer_put_read_element( rb->rs, fe ); - - rb->operation_count += 2; - } - - return( (thread_return_t) EXIT_SUCCESS ); -} - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/test/src/benchmark_stack.c b/openair2/UTIL/LFDS/liblfds6.1.1/test/src/benchmark_stack.c deleted file mode 100644 index 0a9f6c8698..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/test/src/benchmark_stack.c +++ /dev/null @@ -1,134 +0,0 @@ -#include "internal.h" - - - - - -/****************************************************************************/ -void benchmark_lfds611_stack( void ) -{ - unsigned int - loop, - thread_count, - cpu_count; - - struct lfds611_stack_state - *ss; - - struct lfds611_stack_benchmark - *sb; - - thread_state_t - *thread_handles; - - lfds611_atom_t - total_operations_for_full_test_for_all_cpus, - total_operations_for_full_test_for_all_cpus_for_one_cpu = 0; - - double - mean_operations_per_second_per_cpu, - difference_per_second_per_cpu, - total_difference_per_second_per_cpu, - std_dev_per_second_per_cpu, - scalability; - - /* TRD : here we benchmark the stack - - the benchmark is to have a single stack - where a worker thread busy-works pushing then popping - */ - - cpu_count = abstraction_cpu_count(); - - thread_handles = (thread_state_t *) malloc( sizeof(thread_state_t) * cpu_count ); - - sb = (struct lfds611_stack_benchmark *) malloc( sizeof(struct lfds611_stack_benchmark) * cpu_count ); - - // TRD : print the benchmark ID and CSV header - printf( "\n" - "Release %s Stack Benchmark #1\n" - "CPUs,total ops,mean ops/sec per CPU,standard deviation,scalability\n", LFDS611_RELEASE_NUMBER_STRING ); - - // TRD : we run CPU count times for scalability - for( thread_count = 1 ; thread_count <= cpu_count ; thread_count++ ) { - // TRD : initialisation - lfds611_stack_new( &ss, 1000 ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) { - (sb+loop)->ss = ss; - (sb+loop)->operation_count = 0; - } - - // TRD : main test - for( loop = 0 ; loop < thread_count ; loop++ ) - abstraction_thread_start( &thread_handles[loop], loop, benchmark_lfds611_stack_thread_push_and_pop, sb+loop ); - - for( loop = 0 ; loop < thread_count ; loop++ ) - abstraction_thread_wait( thread_handles[loop] ); - - // TRD : post test math - total_operations_for_full_test_for_all_cpus = 0; - total_difference_per_second_per_cpu = 0; - - for( loop = 0 ; loop < thread_count ; loop++ ) - total_operations_for_full_test_for_all_cpus += (sb+loop)->operation_count; - - mean_operations_per_second_per_cpu = ((double) total_operations_for_full_test_for_all_cpus / (double) thread_count) / (double) 10; - - if( thread_count == 1 ) - total_operations_for_full_test_for_all_cpus_for_one_cpu = total_operations_for_full_test_for_all_cpus; - - for( loop = 0 ; loop < thread_count ; loop++ ) { - difference_per_second_per_cpu = ((double) (sb+loop)->operation_count / (double) 10) - mean_operations_per_second_per_cpu; - total_difference_per_second_per_cpu += difference_per_second_per_cpu * difference_per_second_per_cpu; - } - - std_dev_per_second_per_cpu = sqrt( (double) total_difference_per_second_per_cpu ); - - scalability = (double) total_operations_for_full_test_for_all_cpus / (double) (total_operations_for_full_test_for_all_cpus_for_one_cpu * thread_count); - - printf( "%u,%u,%.0f,%.0f,%0.2f\n", thread_count, (unsigned int) total_operations_for_full_test_for_all_cpus, mean_operations_per_second_per_cpu, std_dev_per_second_per_cpu, scalability ); - - // TRD : cleanup - lfds611_stack_delete( ss, NULL, NULL ); - } - - free( sb ); - - free( thread_handles ); - - return; -} - - - - - -/****************************************************************************/ -thread_return_t CALLING_CONVENTION benchmark_lfds611_stack_thread_push_and_pop( void *stack_benchmark ) -{ - struct lfds611_stack_benchmark - *sb; - - void - *user_data = NULL; - - time_t - start_time; - - assert( stack_benchmark != NULL ); - - sb = (struct lfds611_stack_benchmark *) stack_benchmark; - - time( &start_time ); - - while( time(NULL) < start_time + 10 ) { - lfds611_stack_push( sb->ss, user_data ); - lfds611_stack_pop( sb->ss, &user_data ); - - sb->operation_count += 2; - } - - return( (thread_return_t) EXIT_SUCCESS ); -} - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/test/src/internal.h b/openair2/UTIL/LFDS/liblfds6.1.1/test/src/internal.h deleted file mode 100644 index ae30bf142c..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/test/src/internal.h +++ /dev/null @@ -1,123 +0,0 @@ -/***** ANSI includes *****/ -/* TRD : _GNU_SOURCE is required by sched.h for pthread_attr_setaffinity_np, CPU_ZERO and CPU_SET - however it has to be defined very early as even the ANSI headers pull in stuff - which uses _GNU_SOURCE and which I think must be protected against multiple inclusion, - which basically means if you set it too late, it's not seen, because the headers - have already been parsed with _GNU_SOURCE unset -*/ - -#define _GNU_SOURCE - -#include -#include -#include -#include -#include -#include -#include - -/***** internal includes *****/ -#include "abstraction.h" - -/***** external includes *****/ -#include "liblfds611.h" - -/***** defines *****/ -#define and && -#define or || - -#define RAISED 1 -#define LOWERED 0 - -#define NO_FLAGS 0x0 - -/***** enums *****/ -enum lfds611_test_operation { - UNKNOWN, - HELP, - TEST, - BENCHMARK -}; - -/***** structs *****/ -#include "structures.h" - -/***** prototypes *****/ -int main( int argc, char **argv ); - -void internal_display_test_name( char *test_name ); -void internal_display_test_result( unsigned int number_name_dvs_pairs, ... ); -void internal_display_lfds611_data_structure_validity( enum lfds611_data_structure_validity dvs ); - -void benchmark_lfds611_freelist( void ); -thread_return_t CALLING_CONVENTION benchmark_lfds611_freelist_thread_pop_and_push( void *freelist_benchmark ); - -void benchmark_lfds611_queue( void ); -thread_return_t CALLING_CONVENTION benchmark_lfds611_queue_thread_delfds611_queue_and_enqueue( void *queue_benchmark ); - -void benchmark_lfds611_ringbuffer( void ); -thread_return_t CALLING_CONVENTION benchmark_lfds611_ringbuffer_thread_write_and_read( void *ringbuffer_benchmark ); - -void benchmark_lfds611_stack( void ); -thread_return_t CALLING_CONVENTION benchmark_lfds611_stack_thread_push_and_pop( void *stack_benchmark ); - -void test_lfds611_abstraction( void ); -void abstraction_test_increment( void ); -thread_return_t CALLING_CONVENTION abstraction_test_internal_thread_increment( void *shared_counter ); -thread_return_t CALLING_CONVENTION abstraction_test_internal_thread_atomic_increment( void *shared_counter ); -void abstraction_test_cas( void ); -thread_return_t CALLING_CONVENTION abstraction_test_internal_thread_cas( void *abstraction_test_cas_state ); -void abstraction_test_dcas( void ); -thread_return_t CALLING_CONVENTION abstraction_test_internal_thread_dcas( void *abstraction_test_dcas_state ); - -void test_lfds611_freelist( void ); -void freelist_test_internal_popping( void ); -int freelist_test_internal_popping_init( void **user_data, void *user_state ); -thread_return_t CALLING_CONVENTION freelist_test_internal_thread_popping( void *freelist_test_popping_state ); -void freelist_test_internal_pushing( void ); -int freelist_test_internal_pushing_init( void **user_data, void *user_state ); -void freelist_test_internal_pushing_delete( void *user_data, void *user_state ); -thread_return_t CALLING_CONVENTION freelist_test_internal_thread_pushing( void *freelist_test_pushing_state ); -void freelist_test_internal_popping_and_pushing( void ); -thread_return_t CALLING_CONVENTION freelist_test_internal_thread_popping_and_pushing_start_popping( void *freelist_test_popping_and_pushing_state ); -thread_return_t CALLING_CONVENTION freelist_test_internal_thread_popping_and_pushing_start_pushing( void *freelist_test_popping_and_pushing_state ); -void freelist_test_internal_rapid_popping_and_pushing( void ); -thread_return_t CALLING_CONVENTION freelist_test_internal_thread_rapid_popping_and_pushing( void *lfds611_freelist_state ); - -void test_lfds611_queue( void ); -void queue_test_enqueuing( void ); -thread_return_t CALLING_CONVENTION queue_test_internal_thread_simple_enqueuer( void *queue_test_enqueuing_state ); -void queue_test_dequeuing( void ); -thread_return_t CALLING_CONVENTION queue_test_internal_thread_simple_dequeuer( void *queue_test_dequeuing_state ); -void queue_test_enqueuing_and_dequeuing( void ); -thread_return_t CALLING_CONVENTION queue_test_internal_thread_enqueuer_and_dequeuer( void *queue_test_rapid_enqueuing_and_dequeuing_state ); -void queue_test_rapid_enqueuing_and_dequeuing( void ); -thread_return_t CALLING_CONVENTION queue_test_internal_thread_rapid_enqueuer_and_dequeuer( void *queue_test_rapid_enqueuing_and_dequeuing_state ); - -void test_lfds611_ringbuffer( void ); -void ringbuffer_test_reading( void ); -thread_return_t CALLING_CONVENTION ringbuffer_test_thread_simple_reader( void *ringbuffer_test_reading_state ); -void ringbuffer_test_writing( void ); -thread_return_t CALLING_CONVENTION ringbuffer_test_thread_simple_writer( void *ringbuffer_test_writing_state ); -void ringbuffer_test_reading_and_writing( void ); -thread_return_t CALLING_CONVENTION ringbuffer_test_thread_reader_writer( void *ringbuffer_test_reading_and_writing_state ); - -void test_lfds611_slist( void ); -void test_slist_new_delete_get( void ); -thread_return_t CALLING_CONVENTION slist_test_internal_thread_new_delete_get_new_head_and_next( void *slist_test_state ); -thread_return_t CALLING_CONVENTION slist_test_internal_thread_new_delete_get_delete_and_get( void *slist_test_state ); -void test_slist_get_set_user_data( void ); -thread_return_t CALLING_CONVENTION slist_test_internal_thread_get_set_user_data( void *slist_test_state ); -void test_slist_delete_all_elements( void ); - -void test_lfds611_stack( void ); -void stack_test_internal_popping( void ); -thread_return_t CALLING_CONVENTION stack_test_internal_thread_popping( void *stack_test_popping_state ); -void stack_test_internal_pushing( void ); -thread_return_t CALLING_CONVENTION stack_test_internal_thread_pushing( void *stack_test_pushing_state ); -void stack_test_internal_popping_and_pushing( void ); -thread_return_t CALLING_CONVENTION stack_test_internal_thread_popping_and_pushing_start_popping( void *stack_test_popping_and_pushing_state ); -thread_return_t CALLING_CONVENTION stack_test_internal_thread_popping_and_pushing_start_pushing( void *stack_test_popping_and_pushing_state ); -void stack_test_internal_rapid_popping_and_pushing( void ); -thread_return_t CALLING_CONVENTION stack_test_internal_thread_rapid_popping_and_pushing( void *stack_state ); - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/test/src/main.c b/openair2/UTIL/LFDS/liblfds6.1.1/test/src/main.c deleted file mode 100644 index 66836ba441..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/test/src/main.c +++ /dev/null @@ -1,83 +0,0 @@ -#include "internal.h" - - - - - -/****************************************************************************/ -int main( int argc, char **argv ) -{ - enum lfds611_test_operation - operation = UNKNOWN; - - unsigned int - loop, - iterations = 1; - - assert( argc >= 1 ); - assert( argv != NULL ); - - if( argc == 1 or argc >= 4 ) - operation = HELP; - - if( operation == UNKNOWN ) { - if( 0 == strcmp(*(argv+1), "test") ) { - operation = TEST; - - // TRD : sscanf() may fail, but iterations is initialised to 1, so it's okay - if( argc == 3 ) - sscanf( *(argv+2), "%u", &iterations ); - } - - if( 0 == strcmp(*(argv+1), "benchmark") ) { - operation = BENCHMARK; - - // TRD : sscanf() may fail, but iterations is initialised to 1, so it's okay - if( argc == 3 ) - sscanf( *(argv+2), "%u", &iterations ); - } - } - - switch( operation ) { - case UNKNOWN: - case HELP: - printf( "test [test|benchmark] [iterations]\n" - " test : run the test suite\n" - " benchmark : run the benchmark suite\n" - " iterations : optional, default is 1\n" ); - break; - - case TEST: - for( loop = 1 ; loop < iterations+1 ; loop++ ) { - printf( "\n" - "Test Iteration %02u\n" - "=================\n", loop ); - - test_lfds611_abstraction(); - test_lfds611_freelist(); - test_lfds611_queue(); - test_lfds611_ringbuffer(); - test_lfds611_slist(); - test_lfds611_stack(); - } - - break; - - case BENCHMARK: - for( loop = 1 ; loop < iterations+1 ; loop++ ) { - printf( "\n" - "Benchmark Iteration %02u\n" - "========================\n", loop ); - - benchmark_lfds611_freelist(); - benchmark_lfds611_queue(); - benchmark_lfds611_ringbuffer(); - benchmark_lfds611_stack(); - } - - break; - } - - return( EXIT_SUCCESS ); -} - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/test/src/misc.c b/openair2/UTIL/LFDS/liblfds6.1.1/test/src/misc.c deleted file mode 100644 index 9b5891832f..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/test/src/misc.c +++ /dev/null @@ -1,119 +0,0 @@ -#include "internal.h" - - - - - -/****************************************************************************/ -void internal_display_test_name( char *test_name ) -{ - assert( test_name != NULL ); - - printf( "%s...", test_name ); - fflush( stdout ); - - return; -} - - - - - -/****************************************************************************/ -void internal_display_test_result( unsigned int number_name_dvs_pairs, ... ) -{ - va_list - va; - - int - passed_flag = RAISED; - - unsigned int - loop; - - char - *name; - - enum lfds611_data_structure_validity - dvs; - - // TRD : number_name_dvs_pairs can be any value in its range - - va_start( va, number_name_dvs_pairs ); - - for( loop = 0 ; loop < number_name_dvs_pairs ; loop++ ) { - name = va_arg( va, char * ); - dvs = va_arg( va, enum lfds611_data_structure_validity ); - - if( dvs != LFDS611_VALIDITY_VALID ) { - passed_flag = LOWERED; - break; - } - } - - va_end( va ); - - if( passed_flag == RAISED ) - puts( "passed" ); - - if( passed_flag == LOWERED ) { - printf( "failed (" ); - - va_start( va, number_name_dvs_pairs ); - - for( loop = 0 ; loop < number_name_dvs_pairs ; loop++ ) { - name = va_arg( va, char * ); - dvs = va_arg( va, enum lfds611_data_structure_validity ); - - printf( "%s ", name ); - internal_display_lfds611_data_structure_validity( dvs ); - - if( loop+1 < number_name_dvs_pairs ) - printf( ", " ); - } - - va_end( va ); - - printf( ")\n" ); - } - - return; -} - - - - - -/****************************************************************************/ -void internal_display_lfds611_data_structure_validity( enum lfds611_data_structure_validity dvs ) -{ - char - *string = NULL; - - switch( dvs ) { - case LFDS611_VALIDITY_VALID: - string = "valid"; - break; - - case LFDS611_VALIDITY_INVALID_LOOP: - string = "invalid - loop detected"; - break; - - case LFDS611_VALIDITY_INVALID_MISSING_ELEMENTS: - string = "invalid - missing elements"; - break; - - case LFDS611_VALIDITY_INVALID_ADDITIONAL_ELEMENTS: - string = "invalid - additional elements"; - break; - - case LFDS611_VALIDITY_INVALID_TEST_DATA: - string = "invalid - invalid test data"; - break; - } - - printf( "%s", string ); - - return; -} - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/test/src/structures.h b/openair2/UTIL/LFDS/liblfds6.1.1/test/src/structures.h deleted file mode 100644 index 36d01536b5..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/test/src/structures.h +++ /dev/null @@ -1,205 +0,0 @@ -/***** structs *****/ -#pragma pack( push, LFDS611_ALIGN_DOUBLE_POINTER ) - -/***** abstraction tests *****/ -struct abstraction_test_cas_state { - volatile lfds611_atom_t - *shared_counter; - - lfds611_atom_t - local_counter; -}; - -struct abstraction_test_dcas_state { - volatile lfds611_atom_t - *shared_counter; - - lfds611_atom_t - local_counter; -}; - -/***** freelist tests *****/ -struct freelist_test_popping_state { - struct lfds611_freelist_state - *fs, - *fs_thread_local; -}; - -struct freelist_test_pushing_state { - lfds611_atom_t - *count, - thread_number; - - struct lfds611_freelist_state - *source_fs, - *fs; -}; - -struct freelist_test_popping_and_pushing_state { - struct lfds611_freelist_state - *local_fs, - *fs; -}; - -struct freelist_test_counter_and_thread_number { - lfds611_atom_t - thread_number; - - unsigned long long int - counter; -}; - -/***** queue tests *****/ -struct queue_test_enqueuing_state { - struct lfds611_queue_state - *qs; - - lfds611_atom_t - counter; -}; - -struct queue_test_dequeuing_state { - struct lfds611_queue_state - *qs; - - int - error_flag; -}; - -struct queue_test_enqueuing_and_dequeuing_state { - struct lfds611_queue_state - *qs; - - lfds611_atom_t - counter, - thread_number, - *per_thread_counters; - - unsigned int - cpu_count; - - int - error_flag; -}; - -struct queue_test_rapid_enqueuing_and_dequeuing_state { - struct lfds611_queue_state - *qs; - - lfds611_atom_t - counter; -}; - -/***** ringbuffer tests *****/ -struct ringbuffer_test_reading_state { - struct lfds611_ringbuffer_state - *rs; - - int - error_flag; - - lfds611_atom_t - read_count; -}; - -struct ringbuffer_test_writing_state { - struct lfds611_ringbuffer_state - *rs; - - lfds611_atom_t - write_count; -}; - -struct ringbuffer_test_reading_and_writing_state { - struct lfds611_ringbuffer_state - *rs; - - lfds611_atom_t - counter, - *per_thread_counters; - - unsigned int - cpu_count; - - int - error_flag; -}; - -/***** slist tests *****/ -struct slist_test_state { - struct lfds611_slist_state - *ss; - - size_t - create_count, - delete_count; - - lfds611_atom_t - thread_and_count; -}; - -/***** stack tests *****/ -struct stack_test_popping_state { - struct lfds611_stack_state - *ss, - *ss_thread_local; -}; - -struct stack_test_pushing_state { - lfds611_atom_t - thread_number; - - struct lfds611_stack_state - *ss; -}; - -struct stack_test_popping_and_pushing_state { - struct lfds611_stack_state - *local_ss, - *ss; -}; - -struct stack_test_counter_and_thread_number { - lfds611_atom_t - thread_number, - counter; -}; - -/***** freelist benchmarks *****/ -struct lfds611_freelist_benchmark { - struct lfds611_freelist_state - *fs; - - lfds611_atom_t - operation_count; -}; - -/***** queue benchmarks *****/ -struct lfds611_queue_benchmark { - struct lfds611_queue_state - *qs; - - lfds611_atom_t - operation_count; -}; - -/***** ringbuffer benchmarks *****/ -struct lfds611_ringbuffer_benchmark { - struct lfds611_ringbuffer_state - *rs; - - lfds611_atom_t - operation_count; -}; - -/***** stack benchmarks *****/ -struct lfds611_stack_benchmark { - struct lfds611_stack_state - *ss; - - lfds611_atom_t - operation_count; -}; - -#pragma pack( pop ) - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/test/src/test_abstraction.c b/openair2/UTIL/LFDS/liblfds6.1.1/test/src/test_abstraction.c deleted file mode 100644 index 772fbf5ca3..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/test/src/test_abstraction.c +++ /dev/null @@ -1,323 +0,0 @@ -#include "internal.h" - - - - - -/****************************************************************************/ -void test_lfds611_abstraction( void ) -{ - printf( "\n" - "Abstraction Tests\n" - "=================\n" ); - - abstraction_test_increment(); - abstraction_test_cas(); - abstraction_test_dcas(); - - return; -} - - - - - -/****************************************************************************/ -void abstraction_test_increment( void ) -{ - unsigned int - loop, - cpu_count; - - thread_state_t - *thread_handles; - - LFDS611_ALIGN(LFDS611_ALIGN_SINGLE_POINTER) volatile lfds611_atom_t - shared_counter, - atomic_shared_counter; - - /* TRD : here we test lfds611_abstraction_increment - - first, we run one thread per CPU where each thread increments - a shared counter 10,000,000 times - however, this first test - does NOT use atomic increment; it uses "++" - - second, we repeat the exercise, but this time using - lfds611_abstraction_increment() - - if the final value in the first test is less than (10,000,000*cpu_count) - then the system is sensitive to non-atomic increments; this means if - our atomic version of the test passes, we can have some degree of confidence - that it works - - if the final value in the first test is in fact correct, then we can't know - that our atomic version has changed anything - - and of course if the final value in the atomic test is wrong, we know things - are broken - */ - - internal_display_test_name( "Atomic increment" ); - - cpu_count = abstraction_cpu_count(); - - shared_counter = 0; - atomic_shared_counter = 0; - - LFDS611_BARRIER_STORE; - - thread_handles = malloc( sizeof(thread_state_t) * cpu_count ); - - // TRD : non-atomic - for( loop = 0 ; loop < cpu_count ; loop++ ) - abstraction_thread_start( &thread_handles[loop], loop, abstraction_test_internal_thread_increment, (void *) &shared_counter ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) - abstraction_thread_wait( thread_handles[loop] ); - - // TRD : atomic - for( loop = 0 ; loop < cpu_count ; loop++ ) - abstraction_thread_start( &thread_handles[loop], loop, abstraction_test_internal_thread_atomic_increment, (void *) &atomic_shared_counter ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) - abstraction_thread_wait( thread_handles[loop] ); - - free( thread_handles ); - - // TRD : results - if( shared_counter < (10000000 * cpu_count) and atomic_shared_counter == (10000000 * cpu_count) ) - puts( "passed" ); - - if( shared_counter == (10000000 * cpu_count) and atomic_shared_counter == (10000000 * cpu_count) ) - puts( "indeterminate" ); - - if( atomic_shared_counter < (10000000 * cpu_count) ) - puts( "failed" ); - - return; -} - - - - - -/****************************************************************************/ -thread_return_t CALLING_CONVENTION abstraction_test_internal_thread_increment( void *shared_counter ) -{ - assert( shared_counter != NULL ); - - LFDS611_BARRIER_LOAD; - - lfds611_liblfds_abstraction_test_helper_increment_non_atomic( shared_counter ); - - return( (thread_return_t) EXIT_SUCCESS ); -} - - - - - -/****************************************************************************/ -thread_return_t CALLING_CONVENTION abstraction_test_internal_thread_atomic_increment( void *shared_counter ) -{ - assert( shared_counter != NULL ); - - LFDS611_BARRIER_LOAD; - - lfds611_liblfds_abstraction_test_helper_increment_atomic( shared_counter ); - - return( (thread_return_t) EXIT_SUCCESS ); -} - - - - - -/****************************************************************************/ -void abstraction_test_cas( void ) -{ - unsigned int - loop, - cpu_count; - - thread_state_t - *thread_handles; - - struct abstraction_test_cas_state - *atcs; - - LFDS611_ALIGN(LFDS611_ALIGN_SINGLE_POINTER) volatile lfds611_atom_t - shared_counter; - - lfds611_atom_t - local_total = 0; - - // TRD : number_logical_processors can be any value in its range - - /* TRD : here we test lfds611_abstraction_cas - - we run one thread per CPU - we use lfds611_abstraction_cas() to increment a shared counter - every time a thread successfully increments the counter, - it increments a thread local counter - the threads run for ten seconds - after the threads finish, we total the local counters - they should equal the shared counter - */ - - internal_display_test_name( "Atomic CAS" ); - - cpu_count = abstraction_cpu_count(); - - shared_counter = 0; - - LFDS611_BARRIER_STORE; - - atcs = malloc( sizeof(struct abstraction_test_cas_state) * cpu_count ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) { - (atcs+loop)->shared_counter = &shared_counter; - (atcs+loop)->local_counter = 0; - } - - thread_handles = malloc( sizeof(thread_state_t) * cpu_count ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) - abstraction_thread_start( &thread_handles[loop], loop, abstraction_test_internal_thread_cas, atcs+loop ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) - abstraction_thread_wait( thread_handles[loop] ); - - free( thread_handles ); - - // TRD : results - for( loop = 0 ; loop < cpu_count ; loop++ ) - local_total += (atcs+loop)->local_counter; - - if( local_total == shared_counter ) - puts( "passed" ); - - if( local_total != shared_counter ) - puts( "failed" ); - - // TRD : cleanup - free( atcs ); - - return; -} - - - - - -/****************************************************************************/ -thread_return_t CALLING_CONVENTION abstraction_test_internal_thread_cas( void *abstraction_test_cas_state ) -{ - struct abstraction_test_cas_state - *atcs; - - assert( abstraction_test_cas_state != NULL ); - - atcs = (struct abstraction_test_cas_state *) abstraction_test_cas_state; - - LFDS611_BARRIER_LOAD; - - lfds611_liblfds_abstraction_test_helper_cas( atcs->shared_counter, &atcs->local_counter ); - - return( (thread_return_t) EXIT_SUCCESS ); -} - - - - - -/****************************************************************************/ -void abstraction_test_dcas( void ) -{ - unsigned int - loop, - cpu_count; - - thread_state_t - *thread_handles; - - struct abstraction_test_dcas_state - *atds; - - LFDS611_ALIGN(LFDS611_ALIGN_DOUBLE_POINTER) volatile lfds611_atom_t - shared_counter[2] = { 0, 0 }; - - lfds611_atom_t - local_total = 0; - - /* TRD : here we test lfds611_abstraction_dcas - - we run one thread per CPU - we use lfds611_abstraction_dcas() to increment a shared counter - every time a thread successfully increments the counter, - it increments a thread local counter - the threads run for ten seconds - after the threads finish, we total the local counters - they should equal the shared counter - */ - - internal_display_test_name( "Atomic DCAS" ); - - cpu_count = abstraction_cpu_count(); - - atds = malloc( sizeof(struct abstraction_test_dcas_state) * cpu_count ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) { - (atds+loop)->shared_counter = shared_counter; - (atds+loop)->local_counter = 0; - } - - LFDS611_BARRIER_STORE; - - thread_handles = malloc( sizeof(thread_state_t) * cpu_count ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) - abstraction_thread_start( &thread_handles[loop], loop, abstraction_test_internal_thread_dcas, atds+loop ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) - abstraction_thread_wait( thread_handles[loop] ); - - free( thread_handles ); - - // TRD : results - for( loop = 0 ; loop < cpu_count ; loop++ ) - local_total += (atds+loop)->local_counter; - - if( local_total == shared_counter[0] ) - puts( "passed" ); - - if( local_total != shared_counter[0] ) - puts( "failed" ); - - // TRD : cleanup - free( atds ); - - return; -} - - - - - -/****************************************************************************/ -thread_return_t CALLING_CONVENTION abstraction_test_internal_thread_dcas( void *abstraction_test_dcas_state ) -{ - struct abstraction_test_dcas_state - *atds; - - assert( abstraction_test_dcas_state != NULL ); - - atds = (struct abstraction_test_dcas_state *) abstraction_test_dcas_state; - - LFDS611_BARRIER_LOAD; - - lfds611_liblfds_abstraction_test_helper_dcas( atds->shared_counter, &atds->local_counter ); - - return( (thread_return_t) EXIT_SUCCESS ); -} - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/test/src/test_freelist.c b/openair2/UTIL/LFDS/liblfds6.1.1/test/src/test_freelist.c deleted file mode 100644 index d915b815b0..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/test/src/test_freelist.c +++ /dev/null @@ -1,673 +0,0 @@ -#include "internal.h" - - - - - -/****************************************************************************/ -void test_lfds611_freelist( void ) -{ - printf( "\n" - "Freelist Tests\n" - "==============\n" ); - - freelist_test_internal_popping(); - freelist_test_internal_pushing(); - freelist_test_internal_popping_and_pushing(); - freelist_test_internal_rapid_popping_and_pushing(); - - return; -} - - - - - -/****************************************************************************/ -void freelist_test_internal_popping( void ) -{ - unsigned int - loop, - cpu_count; - - lfds611_atom_t - count = 0; - - thread_state_t - *thread_handles; - - enum lfds611_data_structure_validity - dvs = LFDS611_VALIDITY_VALID; - - struct lfds611_freelist_state - *fs; - - struct lfds611_freelist_element - *fe; - - struct freelist_test_popping_state - *ftps; - - unsigned int - *found_count; - - /* TRD : we create a freelist with 1,000,000 elements - - the creation function runs in a single thread and creates - and pushes those elements onto the freelist - - each element contains a void pointer which is its element number - - we then run one thread per CPU - where each thread loops, popping as quickly as possible - each popped element is pushed onto a thread-local freelist - - the threads run till the source freelist is empty - - we then check the thread-local freelists - we should find we have every element - - then tidy up - */ - - internal_display_test_name( "Popping" ); - - cpu_count = abstraction_cpu_count(); - - lfds611_freelist_new( &fs, 1000000, freelist_test_internal_popping_init, &count ); - ftps = malloc( sizeof(struct freelist_test_popping_state) * cpu_count ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) { - (ftps+loop)->fs = fs; - lfds611_freelist_new( &(ftps+loop)->fs_thread_local, 0, NULL, NULL ); - } - - thread_handles = malloc( sizeof(thread_state_t) * cpu_count ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) - abstraction_thread_start( &thread_handles[loop], loop, freelist_test_internal_thread_popping, ftps+loop ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) - abstraction_thread_wait( thread_handles[loop] ); - - free( thread_handles ); - - // TRD : now we check the thread-local freelists - found_count = malloc( sizeof(unsigned int) * 1000000 ); - - for( loop = 0 ; loop < 1000000 ; loop++ ) - *(found_count+loop) = 0; - - for( loop = 0 ; loop < cpu_count ; loop++ ) { - while( lfds611_freelist_pop((ftps+loop)->fs_thread_local, &fe) ) { - lfds611_freelist_get_user_data_from_element( fe, (void **) &count ); - (*(found_count+count))++; - lfds611_freelist_push( fs, fe ); - } - } - - for( loop = 0 ; loop < 1000000 and dvs == LFDS611_VALIDITY_VALID ; loop++ ) { - if( *(found_count+loop) == 0 ) - dvs = LFDS611_VALIDITY_INVALID_MISSING_ELEMENTS; - - if( *(found_count+loop) > 1 ) - dvs = LFDS611_VALIDITY_INVALID_ADDITIONAL_ELEMENTS; - } - - // TRD : cleanup - free( found_count ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) - lfds611_freelist_delete( (ftps+loop)->fs_thread_local, NULL, NULL ); - - free( ftps ); - lfds611_freelist_delete( fs, NULL, NULL ); - - // TRD : print the test result - internal_display_test_result( 1, "freelist", dvs ); - - return; -} - - - - - -/****************************************************************************/ -#pragma warning( disable : 4100 ) - -int freelist_test_internal_popping_init( void **user_data, void *user_state ) -{ - lfds611_atom_t - *count; - - assert( user_data != NULL ); - assert( user_state != NULL ); - - count = (lfds611_atom_t *) user_state; - - *(lfds611_atom_t *) user_data = (*count)++; - - return( 1 ); -} - -#pragma warning( default : 4100 ) - - - - - -/****************************************************************************/ -thread_return_t CALLING_CONVENTION freelist_test_internal_thread_popping( void *freelist_test_popping_state ) -{ - struct freelist_test_popping_state - *ftps; - - struct lfds611_freelist_element - *fe; - - assert( freelist_test_popping_state != NULL ); - - ftps = (struct freelist_test_popping_state *) freelist_test_popping_state; - - lfds611_freelist_use( ftps->fs ); - lfds611_freelist_use( ftps->fs_thread_local ); - - while( lfds611_freelist_pop(ftps->fs, &fe) ) - lfds611_freelist_push( ftps->fs_thread_local, fe ); - - return( (thread_return_t) EXIT_SUCCESS ); -} - - - - - -/****************************************************************************/ -void freelist_test_internal_pushing( void ) -{ - unsigned int - loop, - cpu_count; - - lfds611_atom_t - count = 0; - - thread_state_t - *thread_handles; - - enum lfds611_data_structure_validity - dvs; - - struct freelist_test_pushing_state - *ftps; - - struct lfds611_freelist_element - *fe; - - struct lfds611_freelist_state - *fs, - *cleanup_fs; - - struct freelist_test_counter_and_thread_number - *cnt, - *counter_and_number_trackers; - - struct lfds611_validation_info - vi; - - /* TRD : we create an empty freelist, which we will push to - - we then create one freelist per CPU, where this freelist - contains 100,000 elements per thread and - each element is an incrementing counter and unique ID - (from 0 to number of CPUs) - - we then start one thread per CPU, where each thread is - given one of the populated freelists and pops from that - to push to the empty freelist - - the reason for this is to achieve memory pre-allocation - which allows the pushing threads to run at maximum speed - - the threads end when their freelists are empty - - we then fully pop the now populated main freelist (onto - a second freelist, so we can cleanly free all memory), - checking that the counts increment on a per unique ID basis - and that the number of elements we pop equals 1,000,000 per thread - (since each element has an incrementing counter which is - unique on a per unique ID basis, we can know we didn't lose - any elements) - */ - - internal_display_test_name( "Pushing" ); - - cpu_count = abstraction_cpu_count(); - - ftps = malloc( sizeof(struct freelist_test_pushing_state) * cpu_count ); - - lfds611_freelist_new( &fs, 0, NULL, NULL ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) { - (ftps+loop)->thread_number = (lfds611_atom_t) loop; - // TRD : note count is shared across threads, so thread 0 is 0-100000, thread 1 is 100000-200000, etc - (ftps+loop)->count = &count; - lfds611_freelist_new( &(ftps+loop)->source_fs, 100000, freelist_test_internal_pushing_init, (void *) (ftps+loop) ); - (ftps+loop)->fs = fs; - } - - thread_handles = malloc( sizeof(thread_state_t) * cpu_count ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) - abstraction_thread_start( &thread_handles[loop], loop, freelist_test_internal_thread_pushing, ftps+loop ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) - abstraction_thread_wait( thread_handles[loop] ); - - free( thread_handles ); - - // TRD : now fully pop and verify the main freelist - lfds611_freelist_new( &cleanup_fs, 0, NULL, NULL ); - - counter_and_number_trackers = malloc( sizeof(struct freelist_test_counter_and_thread_number) * cpu_count ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) { - (counter_and_number_trackers+loop)->counter = 100000 * loop; - (counter_and_number_trackers+loop)->thread_number = (lfds611_atom_t) loop; - } - - vi.min_elements = vi.max_elements = 100000 * cpu_count; - - lfds611_freelist_query( fs, LFDS611_FREELIST_QUERY_VALIDATE, &vi, (void *) &dvs ); - - while( dvs == LFDS611_VALIDITY_VALID and lfds611_freelist_pop(fs, &fe) ) { - lfds611_freelist_get_user_data_from_element( fe, (void **) &cnt ); - - if( cnt->counter != (counter_and_number_trackers+cnt->thread_number)->counter++ ) - dvs = LFDS611_VALIDITY_INVALID_MISSING_ELEMENTS; - - lfds611_freelist_push( cleanup_fs, fe ); - } - - // TRD : clean up - free( counter_and_number_trackers ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) - lfds611_freelist_delete( (ftps+loop)->source_fs, NULL, NULL ); - - free( ftps ); - - lfds611_freelist_delete( cleanup_fs, freelist_test_internal_pushing_delete, NULL ); - lfds611_freelist_delete( fs, NULL, NULL ); - - // TRD : print the test result - internal_display_test_result( 1, "freelist", dvs ); - - return; -} - - - - - -/****************************************************************************/ -int freelist_test_internal_pushing_init( void **user_data, void *user_state ) -{ - struct freelist_test_counter_and_thread_number - *ftcatn; - - struct freelist_test_pushing_state - *ftps; - - assert( user_data != NULL ); - // TRD : user_state is being used as an integer type - - *user_data = malloc( sizeof(struct freelist_test_counter_and_thread_number) ); - ftps = (struct freelist_test_pushing_state *) user_state; - - ftcatn = (struct freelist_test_counter_and_thread_number *) *user_data; - - ftcatn->counter = (*ftps->count)++; - ftcatn->thread_number = ftps->thread_number; - - return( 1 ); -} - - - - - -/****************************************************************************/ -#pragma warning( disable : 4100 ) - -void freelist_test_internal_pushing_delete( void *user_data, void *user_state ) -{ - assert( user_data != NULL ); - assert( user_state == NULL ); - - free( user_data ); - - return; -} - -#pragma warning( default : 4100 ) - - - - - -/****************************************************************************/ -thread_return_t CALLING_CONVENTION freelist_test_internal_thread_pushing( void *freelist_test_pushing_state ) -{ - struct freelist_test_pushing_state - *ftps; - - struct lfds611_freelist_element - *fe; - - assert( freelist_test_pushing_state != NULL ); - - ftps = (struct freelist_test_pushing_state *) freelist_test_pushing_state; - - lfds611_freelist_use( ftps->source_fs ); - lfds611_freelist_use( ftps->fs ); - - while( lfds611_freelist_pop(ftps->source_fs, &fe) ) - lfds611_freelist_push( ftps->fs, fe ); - - return( (thread_return_t) EXIT_SUCCESS ); -} - - - - - -/****************************************************************************/ -void freelist_test_internal_popping_and_pushing( void ) -{ - unsigned int - loop, - cpu_count; - - thread_state_t - *thread_handles; - - enum lfds611_data_structure_validity - dvs; - - struct lfds611_freelist_state - *fs; - - struct freelist_test_popping_and_pushing_state - *pps; - - struct lfds611_validation_info - vi; - - /* TRD : we have two threads per CPU - the threads loop for ten seconds - the first thread pushes 100000 elements then pops 100000 elements - the second thread pops 100000 elements then pushes 100000 elements - all pushes and pops go onto the single main freelist - - after time is up, all threads push what they have remaining onto - the main freelist - - we then validate the main freelist - */ - - internal_display_test_name( "Popping and pushing (10 seconds)" ); - - cpu_count = abstraction_cpu_count(); - - lfds611_freelist_new( &fs, 100000 * cpu_count, NULL, NULL ); - - pps = malloc( sizeof(struct freelist_test_popping_and_pushing_state) * cpu_count * 2 ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) { - (pps+loop)->fs = fs; - lfds611_freelist_new( &(pps+loop)->local_fs, 0, NULL, NULL ); - - (pps+loop+cpu_count)->fs = fs; - lfds611_freelist_new( &(pps+loop+cpu_count)->local_fs, 100000, NULL, NULL ); - } - - thread_handles = malloc( sizeof(thread_state_t) * cpu_count * 2 ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) { - abstraction_thread_start( &thread_handles[loop], loop, freelist_test_internal_thread_popping_and_pushing_start_popping, pps+loop ); - abstraction_thread_start( &thread_handles[loop+cpu_count], loop, freelist_test_internal_thread_popping_and_pushing_start_pushing, pps+loop+cpu_count ); - } - - for( loop = 0 ; loop < cpu_count * 2 ; loop++ ) - abstraction_thread_wait( thread_handles[loop] ); - - free( thread_handles ); - - for( loop = 0 ; loop < cpu_count * 2 ; loop++ ) - lfds611_freelist_delete( (pps+loop)->local_fs, NULL, NULL ); - - free( pps ); - - vi.min_elements = vi.max_elements = 100000 * cpu_count * 2; - - lfds611_freelist_query( fs, LFDS611_FREELIST_QUERY_VALIDATE, (void *) &vi, (void *) &dvs ); - - lfds611_freelist_delete( fs, NULL, NULL ); - - // TRD : print the test result - internal_display_test_result( 1, "freelist", dvs ); - - return; -} - - - - - - -/****************************************************************************/ -thread_return_t CALLING_CONVENTION freelist_test_internal_thread_popping_and_pushing_start_popping( void *freelist_test_popping_and_pushing_state ) -{ - struct freelist_test_popping_and_pushing_state - *pps; - - struct lfds611_freelist_element - *fe; - - time_t - start_time; - - unsigned int - count; - - assert( freelist_test_popping_and_pushing_state != NULL ); - - pps = (struct freelist_test_popping_and_pushing_state *) freelist_test_popping_and_pushing_state; - - lfds611_freelist_use( pps->fs ); - lfds611_freelist_use( pps->local_fs ); - - time( &start_time ); - - while( time(NULL) < start_time + 10 ) { - count = 0; - - while( count < 100000 ) { - lfds611_freelist_pop( pps->fs, &fe ); - - if( fe != NULL ) { - lfds611_freelist_push( pps->local_fs, fe ); - count++; - } - } - - while( lfds611_freelist_pop(pps->local_fs, &fe) ) - lfds611_freelist_push( pps->fs, fe ); - } - - return( (thread_return_t) EXIT_SUCCESS ); -} - - - - - -/****************************************************************************/ -thread_return_t CALLING_CONVENTION freelist_test_internal_thread_popping_and_pushing_start_pushing( void *freelist_test_popping_and_pushing_state ) -{ - struct freelist_test_popping_and_pushing_state - *pps; - - struct lfds611_freelist_element - *fe; - - time_t - start_time; - - unsigned int - count; - - assert( freelist_test_popping_and_pushing_state != NULL ); - - pps = (struct freelist_test_popping_and_pushing_state *) freelist_test_popping_and_pushing_state; - - lfds611_freelist_use( pps->fs ); - lfds611_freelist_use( pps->local_fs ); - - time( &start_time ); - - while( time(NULL) < start_time + 10 ) { - while( lfds611_freelist_pop(pps->local_fs, &fe) ) - lfds611_freelist_push( pps->fs, fe ); - - count = 0; - - while( count < 1000 ) { - lfds611_freelist_pop( pps->fs, &fe ); - - if( fe != NULL ) { - lfds611_freelist_push( pps->local_fs, fe ); - count++; - } - } - } - - // TRD : now push whatever we have in our local freelist - while( lfds611_freelist_pop(pps->local_fs, &fe) ) - lfds611_freelist_push( pps->fs, fe ); - - return( (thread_return_t) EXIT_SUCCESS ); -} - - - - - -/****************************************************************************/ -void freelist_test_internal_rapid_popping_and_pushing( void ) -{ - unsigned int - loop, - cpu_count; - - thread_state_t - *thread_handles; - - struct lfds611_freelist_state - *fs; - - struct lfds611_validation_info - vi; - - enum lfds611_data_structure_validity - dvs; - - /* TRD : in these tests there is a fundamental antagonism between - how much checking/memory clean up that we do and the - likelyhood of collisions between threads in their lock-free - operations - - the lock-free operations are very quick; if we do anything - much at all between operations, we greatly reduce the chance - of threads colliding - - so we have some tests which do enough checking/clean up that - they can tell the freelist is valid and don't leak memory - and here, this test now is one of those which does minimal - checking - in fact, the nature of the test is that you can't - do any real checking - but goes very quickly - - what we do is create a small freelist and then run one thread - per CPU, where each thread simply pops and then immediately - pushes - - the test runs for ten seconds - - after the test is done, the only check we do is to traverse - the freelist, checking for loops and ensuring the number of - elements is correct - */ - - internal_display_test_name( "Rapid popping and pushing (10 seconds)" ); - - cpu_count = abstraction_cpu_count(); - - lfds611_freelist_new( &fs, cpu_count, NULL, NULL ); - - thread_handles = malloc( sizeof(thread_state_t) * cpu_count ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) - abstraction_thread_start( &thread_handles[loop], loop, freelist_test_internal_thread_rapid_popping_and_pushing, fs ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) - abstraction_thread_wait( thread_handles[loop] ); - - free( thread_handles ); - - vi.min_elements = cpu_count; - vi.max_elements = cpu_count; - - lfds611_freelist_query( fs, LFDS611_FREELIST_QUERY_VALIDATE, (void *) &vi, (void *) &dvs ); - - lfds611_freelist_delete( fs, NULL, NULL ); - - // TRD : print the test result - internal_display_test_result( 1, "freelist", dvs ); - - return; -} - - - - - -/****************************************************************************/ -thread_return_t CALLING_CONVENTION freelist_test_internal_thread_rapid_popping_and_pushing( void *lfds611_freelist_state ) -{ - struct lfds611_freelist_state - *fs; - - struct lfds611_freelist_element - *fe; - - time_t - start_time; - - assert( lfds611_freelist_state != NULL ); - - fs = (struct lfds611_freelist_state *) lfds611_freelist_state; - - lfds611_freelist_use( fs ); - - time( &start_time ); - - while( time(NULL) < start_time + 10 ) { - lfds611_freelist_pop( fs, &fe ); - lfds611_freelist_push( fs, fe ); - } - - return( (thread_return_t) EXIT_SUCCESS ); -} - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/test/src/test_queue.c b/openair2/UTIL/LFDS/liblfds6.1.1/test/src/test_queue.c deleted file mode 100644 index 9acb516ff7..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/test/src/test_queue.c +++ /dev/null @@ -1,515 +0,0 @@ -#include "internal.h" - - - - - -/****************************************************************************/ -void test_lfds611_queue( void ) -{ - printf( "\n" - "Queue Tests\n" - "===========\n" ); - - queue_test_enqueuing(); - queue_test_dequeuing(); - queue_test_enqueuing_and_dequeuing(); - queue_test_rapid_enqueuing_and_dequeuing(); - - return; -} - - - - - -/****************************************************************************/ -void queue_test_enqueuing( void ) -{ - unsigned int - loop, - cpu_count; - - thread_state_t - *thread_handles; - - struct lfds611_queue_state - *qs; - - struct queue_test_enqueuing_state - *qtes; - - lfds611_atom_t - user_data, - thread, - count, - *per_thread_counters; - - struct lfds611_validation_info - vi = { 1000000, 1000000 }; - - enum lfds611_data_structure_validity - dvs[2]; - - /* TRD : create an empty queue with 1,000,000 elements in its freelist - then run one thread per CPU - where each thread busy-works, enqueuing elements (until there are no more elements) - each element's void pointer of user data is (thread number | element number) - where element_number is a thread-local counter starting at 0 - where the thread_number occupies the top byte - - when we're done, we check that all the elements are present - and increment on a per-thread basis - */ - - internal_display_test_name( "Enqueuing" ); - - cpu_count = abstraction_cpu_count(); - - lfds611_queue_new( &qs, 1000000 ); - - qtes = malloc( sizeof(struct queue_test_enqueuing_state) * cpu_count ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) { - (qtes+loop)->qs = qs; - (qtes+loop)->counter = (lfds611_atom_t) loop << (sizeof(lfds611_atom_t)*8-8); - } - - thread_handles = malloc( sizeof(thread_state_t) * cpu_count ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) - abstraction_thread_start( &thread_handles[loop], loop, queue_test_internal_thread_simple_enqueuer, qtes+loop ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) - abstraction_thread_wait( thread_handles[loop] ); - - free( thread_handles ); - - free( qtes ); - - /* TRD : first, validate the queue - - then dequeue - we expect to find element numbers increment on a per thread basis - */ - - lfds611_queue_query( qs, LFDS611_QUEUE_QUERY_VALIDATE, &vi, dvs ); - - per_thread_counters = malloc( sizeof(lfds611_atom_t) * cpu_count ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) - *(per_thread_counters+loop) = 0; - - while( dvs[0] == LFDS611_VALIDITY_VALID and dvs[1] == LFDS611_VALIDITY_VALID and lfds611_queue_dequeue(qs, (void *) &user_data) ) { - thread = user_data >> (sizeof(lfds611_atom_t)*8-8); - count = (user_data << 8) >> 8; - - if( thread >= cpu_count ) { - dvs[0] = LFDS611_VALIDITY_INVALID_TEST_DATA; - break; - } - - if( count < per_thread_counters[thread] ) - dvs[0] = LFDS611_VALIDITY_INVALID_ADDITIONAL_ELEMENTS; - - if( count > per_thread_counters[thread] ) - dvs[0] = LFDS611_VALIDITY_INVALID_MISSING_ELEMENTS; - - if( count == per_thread_counters[thread] ) - per_thread_counters[thread]++; - } - - free( per_thread_counters ); - - lfds611_queue_delete( qs, NULL, NULL ); - - internal_display_test_result( 2, "queue", dvs[0], "queue freelist", dvs[1] ); - - return; -} - - - - - -/****************************************************************************/ -thread_return_t CALLING_CONVENTION queue_test_internal_thread_simple_enqueuer( void *queue_test_enqueuing_state ) -{ - struct queue_test_enqueuing_state - *qtes; - - assert( queue_test_enqueuing_state != NULL ); - - qtes = (struct queue_test_enqueuing_state *) queue_test_enqueuing_state; - - lfds611_queue_use( qtes->qs ); - - // TRD : top byte of counter is already our thread number - while( lfds611_queue_enqueue(qtes->qs, (void *) qtes->counter++) ); - - return( (thread_return_t) EXIT_SUCCESS ); -} - - - - - -/****************************************************************************/ -void queue_test_dequeuing( void ) -{ - unsigned int - loop, - cpu_count; - - thread_state_t - *thread_handles; - - struct lfds611_queue_state - *qs; - - struct queue_test_dequeuing_state - *qtds; - - struct lfds611_validation_info - vi = { 0, 0 }; - - enum lfds611_data_structure_validity - dvs[2]; - - /* TRD : create a queue with 1,000,000 elements - - use a single thread to enqueue every element - each elements user data is an incrementing counter - - then run one thread per CPU - where each busy-works dequeuing - - when an element is dequeued, we check (on a per-thread basis) the - value deqeued is greater than the element previously dequeued - */ - - internal_display_test_name( "Dequeuing" ); - - cpu_count = abstraction_cpu_count(); - - lfds611_queue_new( &qs, 1000000 ); - - for( loop = 0 ; loop < 1000000 ; loop++ ) - lfds611_queue_enqueue( qs, (void *) (lfds611_atom_t) loop ); - - qtds = malloc( sizeof(struct queue_test_dequeuing_state) * cpu_count ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) { - (qtds+loop)->qs = qs; - (qtds+loop)->error_flag = LOWERED; - } - - thread_handles = malloc( sizeof(thread_state_t) * cpu_count ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) - abstraction_thread_start( &thread_handles[loop], loop, queue_test_internal_thread_simple_dequeuer, qtds+loop ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) - abstraction_thread_wait( thread_handles[loop] ); - - free( thread_handles ); - - // TRD : check queue is empty - lfds611_queue_query( qs, LFDS611_QUEUE_QUERY_VALIDATE, (void *) &vi, (void *) dvs ); - - // TRD : check for raised error flags - for( loop = 0 ; loop < cpu_count ; loop++ ) - if( (qtds+loop)->error_flag == RAISED ) - dvs[0] = LFDS611_VALIDITY_INVALID_TEST_DATA; - - free( qtds ); - - lfds611_queue_delete( qs, NULL, NULL ); - - internal_display_test_result( 2, "queue", dvs[0], "queue freelist", dvs[1] ); - - return; -} - - - - - -/****************************************************************************/ -thread_return_t CALLING_CONVENTION queue_test_internal_thread_simple_dequeuer( void *queue_test_dequeuing_state ) -{ - struct queue_test_dequeuing_state - *qtds; - - lfds611_atom_t - *prev_user_data, - *user_data; - - assert( queue_test_dequeuing_state != NULL ); - - qtds = (struct queue_test_dequeuing_state *) queue_test_dequeuing_state; - - lfds611_queue_use( qtds->qs ); - - lfds611_queue_dequeue( qtds->qs, (void *) &prev_user_data ); - - while( lfds611_queue_dequeue(qtds->qs, (void *) &user_data) ) { - if( user_data <= prev_user_data ) - qtds->error_flag = RAISED; - - prev_user_data = user_data; - } - - return( (thread_return_t) EXIT_SUCCESS ); -} - - - - - -/****************************************************************************/ -void queue_test_enqueuing_and_dequeuing( void ) -{ - unsigned int - loop, - subloop, - cpu_count; - - thread_state_t - *thread_handles; - - struct lfds611_queue_state - *qs; - - struct queue_test_enqueuing_and_dequeuing_state - *qteds; - - struct lfds611_validation_info - vi = { 0, 0 }; - - enum lfds611_data_structure_validity - dvs[2]; - - internal_display_test_name( "Enqueuing and dequeuing (10 seconds)" ); - - cpu_count = abstraction_cpu_count(); - - lfds611_queue_new( &qs, cpu_count ); - - qteds = malloc( sizeof(struct queue_test_enqueuing_and_dequeuing_state) * cpu_count ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) { - (qteds+loop)->qs = qs; - (qteds+loop)->thread_number = loop; - (qteds+loop)->counter = (lfds611_atom_t) loop << (sizeof(lfds611_atom_t)*8-8); - (qteds+loop)->cpu_count = cpu_count; - (qteds+loop)->error_flag = LOWERED; - (qteds+loop)->per_thread_counters = malloc( sizeof(lfds611_atom_t) * cpu_count ); - - for( subloop = 0 ; subloop < cpu_count ; subloop++ ) - *((qteds+loop)->per_thread_counters+subloop) = 0; - } - - thread_handles = malloc( sizeof(thread_state_t) * cpu_count ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) - abstraction_thread_start( &thread_handles[loop], loop, queue_test_internal_thread_enqueuer_and_dequeuer, qteds+loop ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) - abstraction_thread_wait( thread_handles[loop] ); - - free( thread_handles ); - - lfds611_queue_query( qs, LFDS611_QUEUE_QUERY_VALIDATE, (void *) &vi, (void *) dvs ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) - if( (qteds+loop)->error_flag == RAISED ) - dvs[0] = LFDS611_VALIDITY_INVALID_TEST_DATA; - - for( loop = 0 ; loop < cpu_count ; loop++ ) - free( (qteds+loop)->per_thread_counters ); - - free( qteds ); - - lfds611_queue_delete( qs, NULL, NULL ); - - internal_display_test_result( 2, "queue", dvs[0], "queue freelist", dvs[1] ); - - return; -} - - - - - -/****************************************************************************/ -thread_return_t CALLING_CONVENTION queue_test_internal_thread_enqueuer_and_dequeuer( void *queue_test_enqueuing_and_dequeuing_state ) -{ - struct queue_test_enqueuing_and_dequeuing_state - *qteds; - - time_t - start_time; - - lfds611_atom_t - thread, - count, - user_data; - - assert( queue_test_enqueuing_and_dequeuing_state != NULL ); - - qteds = (struct queue_test_enqueuing_and_dequeuing_state *) queue_test_enqueuing_and_dequeuing_state; - - lfds611_queue_use( qteds->qs ); - - time( &start_time ); - - while( time(NULL) < start_time + 10 ) { - lfds611_queue_enqueue( qteds->qs, (void *) (qteds->counter++) ); - lfds611_queue_dequeue( qteds->qs, (void *) &user_data ); - - thread = user_data >> (sizeof(lfds611_atom_t)*8-8); - count = (user_data << 8) >> 8; - - if( thread >= qteds->cpu_count ) - qteds->error_flag = RAISED; - else { - if( count < qteds->per_thread_counters[thread] ) - qteds->error_flag = RAISED; - - if( count >= qteds->per_thread_counters[thread] ) - qteds->per_thread_counters[thread] = count+1; - } - } - - return( (thread_return_t) EXIT_SUCCESS ); -} - - - - - -/****************************************************************************/ -void queue_test_rapid_enqueuing_and_dequeuing( void ) -{ - unsigned int - loop, - cpu_count; - - thread_state_t - *thread_handles; - - struct lfds611_queue_state - *qs; - - struct queue_test_rapid_enqueuing_and_dequeuing_state - *qtreds; - - struct lfds611_validation_info - vi = { 50000, 50000 }; - - lfds611_atom_t - user_data, - thread, - count, - *per_thread_counters; - - enum lfds611_data_structure_validity - dvs[2]; - - internal_display_test_name( "Rapid enqueuing and dequeuing (10 seconds)" ); - - cpu_count = abstraction_cpu_count(); - - lfds611_queue_new( &qs, 100000 ); - - for( loop = 0 ; loop < 50000 ; loop++ ) - lfds611_queue_enqueue( qs, NULL ); - - qtreds = malloc( sizeof(struct queue_test_rapid_enqueuing_and_dequeuing_state) * cpu_count ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) { - (qtreds+loop)->qs = qs; - (qtreds+loop)->counter = (lfds611_atom_t) loop << (sizeof(lfds611_atom_t)*8-8); - } - - thread_handles = malloc( sizeof(thread_state_t) * cpu_count ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) - abstraction_thread_start( &thread_handles[loop], loop, queue_test_internal_thread_rapid_enqueuer_and_dequeuer, qtreds+loop ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) - abstraction_thread_wait( thread_handles[loop] ); - - free( thread_handles ); - - lfds611_queue_query( qs, LFDS611_QUEUE_QUERY_VALIDATE, (void *) &vi, (void *) dvs ); - - // TRD : now check results - per_thread_counters = malloc( sizeof(lfds611_atom_t) * cpu_count ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) - *(per_thread_counters+loop) = 0; - - while( dvs[0] == LFDS611_VALIDITY_VALID and dvs[1] == LFDS611_VALIDITY_VALID and lfds611_queue_dequeue(qs, (void *) &user_data) ) { - thread = user_data >> (sizeof(lfds611_atom_t)*8-8); - count = (user_data << 8) >> 8; - - if( thread >= cpu_count ) { - dvs[0] = LFDS611_VALIDITY_INVALID_TEST_DATA; - break; - } - - if( per_thread_counters[thread] == 0 ) - per_thread_counters[thread] = count; - - if( count < per_thread_counters[thread] ) - dvs[0] = LFDS611_VALIDITY_INVALID_ADDITIONAL_ELEMENTS; - - if( count >= per_thread_counters[thread] ) - per_thread_counters[thread] = count+1; - } - - free( per_thread_counters ); - - free( qtreds ); - - lfds611_queue_delete( qs, NULL, NULL ); - - internal_display_test_result( 2, "queue", dvs[0], "queue freelist", dvs[1] ); - - return; -} - - - - - -/****************************************************************************/ -thread_return_t CALLING_CONVENTION queue_test_internal_thread_rapid_enqueuer_and_dequeuer( void *queue_test_rapid_enqueuing_and_dequeuing_state ) -{ - struct queue_test_rapid_enqueuing_and_dequeuing_state - *qtreds; - - time_t - start_time; - - lfds611_atom_t - user_data; - - assert( queue_test_rapid_enqueuing_and_dequeuing_state != NULL ); - - qtreds = (struct queue_test_rapid_enqueuing_and_dequeuing_state *) queue_test_rapid_enqueuing_and_dequeuing_state; - - lfds611_queue_use( qtreds->qs ); - - time( &start_time ); - - while( time(NULL) < start_time + 10 ) { - lfds611_queue_enqueue( qtreds->qs, (void *) (qtreds->counter++) ); - lfds611_queue_dequeue( qtreds->qs, (void *) &user_data ); - } - - return( (thread_return_t) EXIT_SUCCESS ); -} - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/test/src/test_ringbuffer.c b/openair2/UTIL/LFDS/liblfds6.1.1/test/src/test_ringbuffer.c deleted file mode 100644 index c9c0fd1721..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/test/src/test_ringbuffer.c +++ /dev/null @@ -1,472 +0,0 @@ -#include "internal.h" - - - - - -/****************************************************************************/ -void test_lfds611_ringbuffer( void ) -{ - printf( "\n" - "Ringbuffer Tests\n" - "================\n" ); - - ringbuffer_test_reading(); - ringbuffer_test_writing(); - ringbuffer_test_reading_and_writing(); - - return; -} - - - - - -/****************************************************************************/ -void ringbuffer_test_reading( void ) -{ - unsigned int - loop, - cpu_count; - - thread_state_t - *thread_handles; - - struct lfds611_ringbuffer_state - *rs; - - struct lfds611_freelist_element - *fe; - - struct ringbuffer_test_reading_state - *rtrs; - - struct lfds611_validation_info - vi = { 0, 0 }; - - enum lfds611_data_structure_validity - dvs[3]; - - lfds611_atom_t - total_read = 0; - - /* TRD : we create a single ringbuffer - with 1,000,000 elements - we populate the ringbuffer, where the - user data is an incrementing counter - - we create one thread per CPU - where each thread busy-works, - reading until the ringbuffer is empty - - each thread keeps track of the number of reads it manages - and that each user data it reads is greater than the - previous user data that was read - */ - - internal_display_test_name( "Reading" ); - - cpu_count = abstraction_cpu_count(); - - lfds611_ringbuffer_new( &rs, 1000000, NULL, NULL ); - - for( loop = 0 ; loop < 1000000 ; loop++ ) { - lfds611_ringbuffer_get_write_element( rs, &fe, NULL ); - lfds611_freelist_set_user_data_in_element( fe, (void *) (lfds611_atom_t) loop ); - lfds611_ringbuffer_put_write_element( rs, fe ); - } - - rtrs = malloc( sizeof(struct ringbuffer_test_reading_state) * cpu_count ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) { - (rtrs+loop)->rs = rs; - (rtrs+loop)->read_count = 0; - (rtrs+loop)->error_flag = LOWERED; - } - - thread_handles = malloc( sizeof(thread_state_t) * cpu_count ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) - abstraction_thread_start( &thread_handles[loop], loop, ringbuffer_test_thread_simple_reader, rtrs+loop ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) - abstraction_thread_wait( thread_handles[loop] ); - - free( thread_handles ); - - lfds611_ringbuffer_query( rs, LFDS611_RINGBUFFER_QUERY_VALIDATE, (void *) &vi, (void *) dvs ); - - // TRD : check for raised error flags - for( loop = 0 ; loop < cpu_count ; loop++ ) - if( (rtrs+loop)->error_flag == RAISED ) - dvs[0] = LFDS611_VALIDITY_INVALID_TEST_DATA; - - // TRD : check thread reads total to 1,000,000 - for( loop = 0 ; loop < cpu_count ; loop++ ) - total_read += (rtrs+loop)->read_count; - - if( total_read < 1000000 ) - dvs[0] = LFDS611_VALIDITY_INVALID_MISSING_ELEMENTS; - - if( total_read > 1000000 ) - dvs[0] = LFDS611_VALIDITY_INVALID_ADDITIONAL_ELEMENTS; - - free( rtrs ); - - lfds611_ringbuffer_delete( rs, NULL, NULL ); - - internal_display_test_result( 3, "queue", dvs[0], "queue freelist", dvs[1], "freelist", dvs[2] ); - - return; -} - - - - - -/****************************************************************************/ -thread_return_t CALLING_CONVENTION ringbuffer_test_thread_simple_reader( void *ringbuffer_test_reading_state ) -{ - struct ringbuffer_test_reading_state - *rtrs; - - struct lfds611_freelist_element - *fe; - - lfds611_atom_t - *prev_user_data, - *user_data; - - assert( ringbuffer_test_reading_state != NULL ); - - rtrs = (struct ringbuffer_test_reading_state *) ringbuffer_test_reading_state; - - lfds611_ringbuffer_use( rtrs->rs ); - - /* TRD : read an initial element to load a value into prev_user_data - it may be (under valgrind for example) that by the time we start - there are no elements remaining to read - */ - - lfds611_ringbuffer_get_read_element( rtrs->rs, &fe ); - - if( fe == NULL ) - return( (thread_return_t) EXIT_SUCCESS ); - - lfds611_freelist_get_user_data_from_element( fe, (void **) &prev_user_data ); - lfds611_ringbuffer_put_read_element( rtrs->rs, fe ); - - rtrs->read_count++; - - while( lfds611_ringbuffer_get_read_element(rtrs->rs, &fe) ) { - lfds611_freelist_get_user_data_from_element( fe, (void **) &user_data ); - lfds611_ringbuffer_put_read_element( rtrs->rs, fe ); - - if( user_data <= prev_user_data ) - rtrs->error_flag = RAISED; - - prev_user_data = user_data; - - rtrs->read_count++; - } - - return( (thread_return_t) EXIT_SUCCESS ); -} - - - - - -/****************************************************************************/ -void ringbuffer_test_writing( void ) -{ - unsigned int - loop, - cpu_count; - - thread_state_t - *thread_handles; - - struct lfds611_ringbuffer_state - *rs; - - struct lfds611_freelist_element - *fe; - - struct ringbuffer_test_writing_state - *rtws; - - struct lfds611_validation_info - vi = { 100000, 100000 }; - - enum lfds611_data_structure_validity - dvs[3]; - - lfds611_atom_t - thread, - count, - user_data, - *per_thread_counters; - - /* TRD : we create a single ringbuffer - with 100000 elements - the ringbuffers starts empty - - we create one thread per CPU - where each thread busy-works writing - for ten seconds - - the user data in each written element is a combination - of the thread number and the counter - - after the threads are complete, we validate by - checking the user data counters increment on a per thread - basis - */ - - internal_display_test_name( "Writing (10 seconds)" ); - - cpu_count = abstraction_cpu_count(); - - lfds611_ringbuffer_new( &rs, 100000, NULL, NULL ); - - rtws = malloc( sizeof(struct ringbuffer_test_writing_state) * cpu_count ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) { - (rtws+loop)->rs = rs; - (rtws+loop)->write_count = (lfds611_atom_t) loop << (sizeof(lfds611_atom_t)*8-8); - } - - thread_handles = malloc( sizeof(thread_state_t) * cpu_count ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) - abstraction_thread_start( &thread_handles[loop], loop, ringbuffer_test_thread_simple_writer, rtws+loop ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) - abstraction_thread_wait( thread_handles[loop] ); - - free( thread_handles ); - - // TRD : now check results - per_thread_counters = malloc( sizeof(lfds611_atom_t) * cpu_count ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) - *(per_thread_counters+loop) = 0; - - lfds611_ringbuffer_query( rs, LFDS611_RINGBUFFER_QUERY_VALIDATE, (void *) &vi, (void *) dvs ); - - while( dvs[0] == LFDS611_VALIDITY_VALID and dvs[1] == LFDS611_VALIDITY_VALID and dvs[2] == LFDS611_VALIDITY_VALID and lfds611_ringbuffer_get_read_element(rs, &fe) ) { - lfds611_freelist_get_user_data_from_element( fe, (void *) &user_data ); - - thread = user_data >> (sizeof(lfds611_atom_t)*8-8); - count = (user_data << 8) >> 8; - - if( thread >= cpu_count ) { - dvs[0] = LFDS611_VALIDITY_INVALID_TEST_DATA; - lfds611_ringbuffer_put_read_element( rs, fe ); - break; - } - - if( per_thread_counters[thread] == 0 ) - per_thread_counters[thread] = count; - - if( count < per_thread_counters[thread] ) - dvs[0] = LFDS611_VALIDITY_INVALID_ADDITIONAL_ELEMENTS; - - if( count >= per_thread_counters[thread] ) - per_thread_counters[thread] = count+1; - - lfds611_ringbuffer_put_read_element( rs, fe ); - } - - free( per_thread_counters ); - - free( rtws ); - - lfds611_ringbuffer_delete( rs, NULL, NULL ); - - internal_display_test_result( 3, "queue", dvs[0], "queue freelist", dvs[1], "freelist", dvs[2] ); - - return; -} - - - - - -/****************************************************************************/ -thread_return_t CALLING_CONVENTION ringbuffer_test_thread_simple_writer( void *ringbuffer_test_writing_state ) -{ - struct ringbuffer_test_writing_state - *rtws; - - struct lfds611_freelist_element - *fe; - - time_t - start_time; - - assert( ringbuffer_test_writing_state != NULL ); - - rtws = (struct ringbuffer_test_writing_state *) ringbuffer_test_writing_state; - - lfds611_ringbuffer_use( rtws->rs ); - - time( &start_time ); - - while( time(NULL) < start_time + 10 ) { - lfds611_ringbuffer_get_write_element( rtws->rs, &fe, NULL ); - lfds611_freelist_set_user_data_in_element( fe, (void *) (lfds611_atom_t) (rtws->write_count++) ); - lfds611_ringbuffer_put_write_element( rtws->rs, fe ); - } - - return( (thread_return_t) EXIT_SUCCESS ); -} - - - - - -/****************************************************************************/ -void ringbuffer_test_reading_and_writing( void ) -{ - unsigned int - loop, - subloop, - cpu_count; - - thread_state_t - *thread_handles; - - struct lfds611_ringbuffer_state - *rs; - - struct ringbuffer_test_reading_and_writing_state - *rtrws; - - struct lfds611_validation_info - vi = { 0, 0 }; - - enum lfds611_data_structure_validity - dvs[3]; - - /* TRD : we create a single ringbuffer - with 100000 elements - the ringbuffers starts empty - - we create one thread per CPU - where each thread busy-works writing - and then immediately reading - for ten seconds - - the user data in each written element is a combination - of the thread number and the counter - - while a thread runs, it keeps track of the - counters for the other threads and throws an error - if it sees the number stay the same or decrease - */ - - internal_display_test_name( "Reading and writing (10 seconds)" ); - - cpu_count = abstraction_cpu_count(); - - lfds611_ringbuffer_new( &rs, 100000, NULL, NULL ); - - rtrws = malloc( sizeof(struct ringbuffer_test_reading_and_writing_state) * cpu_count ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) { - (rtrws+loop)->rs = rs; - (rtrws+loop)->counter = (lfds611_atom_t) loop << (sizeof(lfds611_atom_t)*8-8); - (rtrws+loop)->cpu_count = cpu_count; - (rtrws+loop)->error_flag = LOWERED; - (rtrws+loop)->per_thread_counters = malloc( sizeof(lfds611_atom_t) * cpu_count ); - - for( subloop = 0 ; subloop < cpu_count ; subloop++ ) - *((rtrws+loop)->per_thread_counters+subloop) = 0; - } - - thread_handles = malloc( sizeof(thread_state_t) * cpu_count ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) - abstraction_thread_start( &thread_handles[loop], loop, ringbuffer_test_thread_reader_writer, rtrws+loop ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) - abstraction_thread_wait( thread_handles[loop] ); - - free( thread_handles ); - - lfds611_ringbuffer_query( rs, LFDS611_RINGBUFFER_QUERY_VALIDATE, (void *) &vi, (void *) dvs ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) - if( (rtrws+loop)->error_flag == RAISED ) - dvs[0] = LFDS611_VALIDITY_INVALID_TEST_DATA; - - for( loop = 0 ; loop < cpu_count ; loop++ ) - free( (rtrws+loop)->per_thread_counters ); - - free( rtrws ); - - lfds611_ringbuffer_delete( rs, NULL, NULL ); - - internal_display_test_result( 3, "queue", dvs[0], "queue freelist", dvs[1], "freelist", dvs[2] ); - - return; -} - - - - - -/****************************************************************************/ -thread_return_t CALLING_CONVENTION ringbuffer_test_thread_reader_writer( void *ringbuffer_test_reading_and_writing_state ) -{ - struct ringbuffer_test_reading_and_writing_state - *rtrws; - - struct lfds611_freelist_element - *fe; - - lfds611_atom_t - user_data, - thread, - count; - - time_t - start_time; - - assert( ringbuffer_test_reading_and_writing_state != NULL ); - - rtrws = (struct ringbuffer_test_reading_and_writing_state *) ringbuffer_test_reading_and_writing_state; - - lfds611_ringbuffer_use( rtrws->rs ); - - time( &start_time ); - - while( time(NULL) < start_time + 10 ) { - lfds611_ringbuffer_get_write_element( rtrws->rs, &fe, NULL ); - lfds611_freelist_set_user_data_in_element( fe, (void *) (lfds611_atom_t) (rtrws->counter++) ); - lfds611_ringbuffer_put_write_element( rtrws->rs, fe ); - - lfds611_ringbuffer_get_read_element( rtrws->rs, &fe ); - lfds611_freelist_get_user_data_from_element( fe, (void *) &user_data ); - - thread = user_data >> (sizeof(lfds611_atom_t)*8-8); - count = (user_data << 8) >> 8; - - if( thread >= rtrws->cpu_count ) - rtrws->error_flag = RAISED; - else { - if( count < rtrws->per_thread_counters[thread] ) - rtrws->error_flag = RAISED; - - if( count >= rtrws->per_thread_counters[thread] ) - rtrws->per_thread_counters[thread] = count+1; - } - - lfds611_ringbuffer_put_read_element( rtrws->rs, fe ); - } - - return( (thread_return_t) EXIT_SUCCESS ); -} - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/test/src/test_slist.c b/openair2/UTIL/LFDS/liblfds6.1.1/test/src/test_slist.c deleted file mode 100644 index 0388ad8c7d..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/test/src/test_slist.c +++ /dev/null @@ -1,388 +0,0 @@ -#include "internal.h" - - - - - -/****************************************************************************/ -void test_lfds611_slist( void ) -{ - printf( "\n" - "SList Tests\n" - "===========\n" ); - - test_slist_new_delete_get(); - test_slist_get_set_user_data(); - test_slist_delete_all_elements(); - - return; -} - - - - - -/****************************************************************************/ -void test_slist_new_delete_get( void ) -{ - unsigned int - loop, - cpu_count; - - struct lfds611_slist_state - *ss; - - struct lfds611_slist_element - *se = NULL; - - struct slist_test_state - *sts; - - thread_state_t - *thread_handles; - - size_t - total_create_count = 0, - total_delete_count = 0, - element_count = 0; - - enum lfds611_data_structure_validity - dvs = LFDS611_VALIDITY_VALID; - - /* TRD : two threads per CPU - first simply alternates between new_head() and new_next() (next on element created by head) - second calls get_next, if NULL, then calls get_head, and deletes the element - both threads keep count of created and deleted - validate is to reconcile created, deleted and remaining in list - */ - - internal_display_test_name( "New head/next, delete and get next" ); - - cpu_count = abstraction_cpu_count(); - - lfds611_slist_new( &ss, NULL, NULL ); - - sts = malloc( sizeof(struct slist_test_state) * cpu_count * 2 ); - - for( loop = 0 ; loop < cpu_count * 2 ; loop++ ) { - (sts+loop)->ss = ss; - (sts+loop)->create_count = 0; - (sts+loop)->delete_count = 0; - } - - thread_handles = malloc( sizeof(thread_state_t) * cpu_count * 2 ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) { - abstraction_thread_start( &thread_handles[loop], loop, slist_test_internal_thread_new_delete_get_new_head_and_next, sts+loop ); - abstraction_thread_start( &thread_handles[loop+cpu_count], loop, slist_test_internal_thread_new_delete_get_delete_and_get, sts+loop+cpu_count ); - } - - for( loop = 0 ; loop < cpu_count * 2 ; loop++ ) - abstraction_thread_wait( thread_handles[loop] ); - - free( thread_handles ); - - // TRD : now validate - for( loop = 0 ; loop < cpu_count * 2 ; loop++ ) { - total_create_count += (sts+loop)->create_count; - total_delete_count += (sts+loop)->delete_count; - } - - while( NULL != lfds611_slist_get_head_and_then_next(ss, &se) ) - element_count++; - - if( total_create_count - total_delete_count - element_count != 0 ) - dvs = LFDS611_VALIDITY_INVALID_TEST_DATA; - - free( sts ); - - lfds611_slist_delete( ss ); - - internal_display_test_result( 1, "slist", dvs ); - - return; -} - - - - - -/****************************************************************************/ -thread_return_t CALLING_CONVENTION slist_test_internal_thread_new_delete_get_new_head_and_next( void *slist_test_state ) -{ - struct slist_test_state - *sts; - - time_t - start_time; - - struct lfds611_slist_element - *se = NULL; - - assert( slist_test_state != NULL ); - - sts = (struct slist_test_state *) slist_test_state; - - lfds611_slist_use( sts->ss ); - - time( &start_time ); - - while( time(NULL) < start_time + 1 ) { - if( sts->create_count % 2 == 0 ) - se = lfds611_slist_new_head( sts->ss, NULL ); - else - lfds611_slist_new_next( se, NULL ); - - sts->create_count++; - } - - return( (thread_return_t) EXIT_SUCCESS ); -} - - - - - -/****************************************************************************/ -thread_return_t CALLING_CONVENTION slist_test_internal_thread_new_delete_get_delete_and_get( void *slist_test_state ) -{ - struct slist_test_state - *sts; - - time_t - start_time; - - struct lfds611_slist_element - *se = NULL; - - assert( slist_test_state != NULL ); - - sts = (struct slist_test_state *) slist_test_state; - - lfds611_slist_use( sts->ss ); - - time( &start_time ); - - while( time(NULL) < start_time + 1 ) { - if( se == NULL ) - lfds611_slist_get_head( sts->ss, &se ); - else - lfds611_slist_get_next( se, &se ); - - if( se != NULL ) { - if( 1 == lfds611_slist_logically_delete_element(sts->ss, se) ) - sts->delete_count++; - } - } - - return( (thread_return_t) EXIT_SUCCESS ); -} - - - - - -/****************************************************************************/ -void test_slist_get_set_user_data( void ) -{ - unsigned int - loop, - cpu_count; - - struct lfds611_slist_state - *ss; - - struct lfds611_slist_element - *se = NULL; - - struct slist_test_state - *sts; - - thread_state_t - *thread_handles; - - lfds611_atom_t - thread_and_count, - thread, - count, - *per_thread_counters, - *per_thread_drop_flags; - - enum lfds611_data_structure_validity - dvs = LFDS611_VALIDITY_VALID; - - /* TRD : create a list of (cpu_count*10) elements, user data 0 - one thread per CPU - each thread loops, setting user_data to ((thread_number << (sizeof(lfds611_atom_t)*8-8)) | count) - validation is to scan list, count on a per thread basis should go down only once - */ - - internal_display_test_name( "Get and set user data" ); - - cpu_count = abstraction_cpu_count(); - - lfds611_slist_new( &ss, NULL, NULL ); - - for( loop = 0 ; loop < cpu_count * 10 ; loop++ ) - lfds611_slist_new_head( ss, NULL ); - - sts = malloc( sizeof(struct slist_test_state) * cpu_count ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) { - (sts+loop)->ss = ss; - (sts+loop)->thread_and_count = (lfds611_atom_t) loop << (sizeof(lfds611_atom_t)*8-8); - } - - thread_handles = malloc( sizeof(thread_state_t) * cpu_count ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) - abstraction_thread_start( &thread_handles[loop], loop, slist_test_internal_thread_get_set_user_data, sts+loop ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) - abstraction_thread_wait( thread_handles[loop] ); - - free( thread_handles ); - - // now validate - per_thread_counters = malloc( sizeof(lfds611_atom_t) * cpu_count ); - per_thread_drop_flags = malloc( sizeof(lfds611_atom_t) * cpu_count ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) { - *(per_thread_counters+loop) = 0; - *(per_thread_drop_flags+loop) = 0; - } - - while( dvs == LFDS611_VALIDITY_VALID and NULL != lfds611_slist_get_head_and_then_next(ss, &se) ) { - lfds611_slist_get_user_data_from_element( se, (void **) &thread_and_count ); - - thread = thread_and_count >> (sizeof(lfds611_atom_t)*8-8); - count = (thread_and_count << 8) >> 8; - - if( thread >= cpu_count ) { - dvs = LFDS611_VALIDITY_INVALID_TEST_DATA; - break; - } - - if( per_thread_counters[thread] == 0 ) { - per_thread_counters[thread] = count; - continue; - } - - per_thread_counters[thread]++; - - if( count < per_thread_counters[thread] and per_thread_drop_flags[thread] == 1 ) { - dvs = LFDS611_VALIDITY_INVALID_ADDITIONAL_ELEMENTS; - break; - } - - if( count < per_thread_counters[thread] and per_thread_drop_flags[thread] == 0 ) { - per_thread_drop_flags[thread] = 1; - per_thread_counters[thread] = count; - continue; - } - - if( count < per_thread_counters[thread] ) - dvs = LFDS611_VALIDITY_INVALID_ADDITIONAL_ELEMENTS; - - if( count >= per_thread_counters[thread] ) - per_thread_counters[thread] = count; - } - - free( per_thread_drop_flags ); - free( per_thread_counters ); - - free( sts ); - - lfds611_slist_delete( ss ); - - internal_display_test_result( 1, "slist", dvs ); - - return; -} - - - - - -/****************************************************************************/ -thread_return_t CALLING_CONVENTION slist_test_internal_thread_get_set_user_data( void *slist_test_state ) -{ - struct slist_test_state - *sts; - - time_t - start_time; - - struct lfds611_slist_element - *se = NULL; - - assert( slist_test_state != NULL ); - - sts = (struct slist_test_state *) slist_test_state; - - lfds611_slist_use( sts->ss ); - - time( &start_time ); - - while( time(NULL) < start_time + 1 ) { - if( se == NULL ) - lfds611_slist_get_head( sts->ss, &se ); - - lfds611_slist_set_user_data_in_element( se, (void *) sts->thread_and_count++ ); - - lfds611_slist_get_next( se, &se ); - } - - return( (thread_return_t) EXIT_SUCCESS ); -} - - - - - -/****************************************************************************/ -void test_slist_delete_all_elements( void ) -{ - struct lfds611_slist_state - *ss; - - struct lfds611_slist_element - *se = NULL; - - size_t - element_count = 0; - - unsigned int - loop; - - enum lfds611_data_structure_validity - dvs = LFDS611_VALIDITY_VALID; - - /* TRD : this test creates a list of 100,000 elements - then simply calls delete_all_elements() - we then count the number of elements remaining - should be zero :-) - */ - - internal_display_test_name( "Delete all elements" ); - - lfds611_slist_new( &ss, NULL, NULL ); - - for( loop = 0 ; loop < 1000000 ; loop++ ) - lfds611_slist_new_head( ss, NULL ); - - lfds611_slist_single_threaded_physically_delete_all_elements( ss ); - - while( NULL != lfds611_slist_get_head_and_then_next(ss, &se) ) - element_count++; - - if( element_count != 0 ) - dvs = LFDS611_VALIDITY_INVALID_TEST_DATA; - - lfds611_slist_delete( ss ); - - internal_display_test_result( 1, "slist", dvs ); - - return; -} - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/test/src/test_stack.c b/openair2/UTIL/LFDS/liblfds6.1.1/test/src/test_stack.c deleted file mode 100644 index cb5916620b..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/test/src/test_stack.c +++ /dev/null @@ -1,582 +0,0 @@ -#include "internal.h" - - - - - -/****************************************************************************/ -void test_lfds611_stack( void ) -{ - printf( "\n" - "Stack Tests\n" - "===========\n" ); - - stack_test_internal_popping(); - stack_test_internal_pushing(); - stack_test_internal_popping_and_pushing(); - stack_test_internal_rapid_popping_and_pushing(); - - return; -} - - - - - -/****************************************************************************/ -void stack_test_internal_popping( void ) -{ - unsigned int - loop, - *found_count, - cpu_count; - - lfds611_atom_t - count; - - thread_state_t - *thread_handles; - - enum lfds611_data_structure_validity - dvs = LFDS611_VALIDITY_VALID; - - struct lfds611_stack_state - *ss; - - struct stack_test_popping_state - *stps; - - /* TRD : we create a stack with 1,000,000 elements - - we then populate the stack, where each element is - set to contain a void pointer which is its element number - - we then run one thread per CPU - where each thread loops, popping as quickly as possible - each popped element is pushed onto a thread-local stack - - the threads run till the source stack is empty - - we then check the thread-local stacks - we should find we have every element - - then tidy up - */ - - internal_display_test_name( "Popping" ); - - cpu_count = abstraction_cpu_count(); - - lfds611_stack_new( &ss, 1000000 ); - - for( loop = 0 ; loop < 1000000 ; loop++ ) - lfds611_stack_push( ss, (void *) (lfds611_atom_t) loop ); - - stps = malloc( sizeof(struct stack_test_popping_state) * cpu_count ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) { - (stps+loop)->ss = ss; - lfds611_stack_new( &(stps+loop)->ss_thread_local, 1000000 ); - } - - thread_handles = malloc( sizeof(thread_state_t) * cpu_count ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) - abstraction_thread_start( &thread_handles[loop], loop, stack_test_internal_thread_popping, stps+loop ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) - abstraction_thread_wait( thread_handles[loop] ); - - free( thread_handles ); - - // TRD : now we check the thread-local stacks - found_count = malloc( sizeof(unsigned int) * 1000000 ); - - for( loop = 0 ; loop < 1000000 ; loop++ ) - *(found_count+loop) = 0; - - for( loop = 0 ; loop < cpu_count ; loop++ ) - while( lfds611_stack_pop((stps+loop)->ss_thread_local, (void **) &count) ) - (*(found_count+count))++; - - for( loop = 0 ; loop < 1000000 and dvs == LFDS611_VALIDITY_VALID ; loop++ ) { - if( *(found_count+loop) == 0 ) - dvs = LFDS611_VALIDITY_INVALID_MISSING_ELEMENTS; - - if( *(found_count+loop) > 1 ) - dvs = LFDS611_VALIDITY_INVALID_ADDITIONAL_ELEMENTS; - } - - // TRD : cleanup - free( found_count ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) - lfds611_stack_delete( (stps+loop)->ss_thread_local, NULL, NULL ); - - free( stps ); - lfds611_stack_delete( ss, NULL, NULL ); - - // TRD : print the test result - internal_display_test_result( 1, "stack", dvs ); - - return; -} - - - - - -/****************************************************************************/ -thread_return_t CALLING_CONVENTION stack_test_internal_thread_popping( void *stack_test_popping_state ) -{ - struct stack_test_popping_state - *stps; - - lfds611_atom_t - count; - - assert( stack_test_popping_state != NULL ); - - stps = (struct stack_test_popping_state *) stack_test_popping_state; - - lfds611_stack_use( stps->ss ); - - while( lfds611_stack_pop(stps->ss, (void **) &count) ) - lfds611_stack_push( stps->ss_thread_local, (void *) count ); - - return( (thread_return_t) EXIT_SUCCESS ); -} - - - - - -/****************************************************************************/ -void stack_test_internal_pushing( void ) -{ - unsigned int - loop, - cpu_count; - - thread_state_t - *thread_handles; - - enum lfds611_data_structure_validity - dvs[2]; - - struct stack_test_pushing_state - *stps; - - struct lfds611_stack_state - *ss; - - lfds611_atom_t - user_data, - thread, - count, - *per_thread_counters; - - struct lfds611_validation_info - vi = { 1000000, 1000000 }; - - /* TRD : we create a stack with 1,000,000 elements - - we then create one thread per CPU, where each thread - pushes as quickly as possible to the stack - - the data pushed is a counter and a thread ID - - the threads exit when the stack is full - - we then validate the stack; - - checking that the counts increment on a per unique ID basis - and that the number of elements we pop equals 1,000,000 - (since each element has an incrementing counter which is - unique on a per unique ID basis, we can know we didn't lose - any elements) - */ - - internal_display_test_name( "Pushing" ); - - cpu_count = abstraction_cpu_count(); - - stps = malloc( sizeof(struct stack_test_pushing_state) * cpu_count ); - - // TRD : the main stack - lfds611_stack_new( &ss, 1000000 ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) { - (stps+loop)->thread_number = (lfds611_atom_t) loop; - (stps+loop)->ss = ss; - } - - thread_handles = malloc( sizeof(thread_state_t) * cpu_count ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) - abstraction_thread_start( &thread_handles[loop], loop, stack_test_internal_thread_pushing, stps+loop ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) - abstraction_thread_wait( thread_handles[loop] ); - - free( thread_handles ); - - // TRD : the stack is now fully pushed; time to verify - per_thread_counters = malloc( sizeof(lfds611_atom_t) * cpu_count ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) - *(per_thread_counters+loop) = 1000000; - - lfds611_stack_query( ss, LFDS611_STACK_QUERY_VALIDATE, &vi, (void *) dvs ); - - while( dvs[0] == LFDS611_VALIDITY_VALID and lfds611_stack_pop(ss, (void **) &user_data) ) { - thread = user_data >> (sizeof(lfds611_atom_t)*8-8); - count = (user_data << 8) >> 8; - - if( thread >= cpu_count ) { - dvs[0] = LFDS611_VALIDITY_INVALID_TEST_DATA; - break; - } - - if( count > per_thread_counters[thread] ) - dvs[0] = LFDS611_VALIDITY_INVALID_ADDITIONAL_ELEMENTS; - - if( count < per_thread_counters[thread] ) - per_thread_counters[thread] = count-1; - } - - // TRD : clean up - free( per_thread_counters ); - - free( stps ); - - lfds611_stack_delete( ss, NULL, NULL ); - - // TRD : print the test result - internal_display_test_result( 2, "stack", dvs[0], "stack freelist", dvs[1] ); - - return; -} - - - - - -/****************************************************************************/ -thread_return_t CALLING_CONVENTION stack_test_internal_thread_pushing( void *stack_test_pushing_state ) -{ - struct stack_test_pushing_state - *stps; - - lfds611_atom_t - counter = 0; - - assert( stack_test_pushing_state != NULL ); - - stps = (struct stack_test_pushing_state *) stack_test_pushing_state; - - lfds611_stack_use( stps->ss ); - - // TRD : we write (thread_number | counter), where thread_number is the top 8 bits of the lfds611_atom_t - while( lfds611_stack_push(stps->ss, (void **) ((stps->thread_number << (sizeof(lfds611_atom_t)*8-8)) | counter++)) ); - - return( (thread_return_t) EXIT_SUCCESS ); -} - - - - - -/****************************************************************************/ -void stack_test_internal_popping_and_pushing( void ) -{ - unsigned int - loop, - subloop, - cpu_count; - - thread_state_t - *thread_handles; - - enum lfds611_data_structure_validity - dvs[2]; - - struct lfds611_stack_state - *ss; - - struct stack_test_popping_and_pushing_state - *stpps; - - struct lfds611_validation_info - vi; - - /* TRD : we have two threads per CPU - the threads loop for ten seconds - the first thread pushes 100000 elements then pops 100000 elements - the second thread pops 100000 elements then pushes 100000 elements - all pushes and pops go onto the single main stack - - after time is up, all threads push what they have remaining onto - the main stack - - we then validate the main stack - */ - - internal_display_test_name( "Popping and pushing (10 seconds)" ); - - cpu_count = abstraction_cpu_count(); - - // TRD : just some initial elements so the pushing threads can start immediately - lfds611_stack_new( &ss, 100000 * cpu_count * 2 ); - - for( loop = 0 ; loop < 100000 * cpu_count ; loop++ ) - lfds611_stack_push( ss, (void *) (lfds611_atom_t) loop ); - - stpps = malloc( sizeof(struct stack_test_popping_and_pushing_state) * cpu_count * 2 ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) { - (stpps+loop)->ss = ss; - lfds611_stack_new( &(stpps+loop)->local_ss, 100000 ); - - (stpps+loop+cpu_count)->ss = ss; - lfds611_stack_new( &(stpps+loop+cpu_count)->local_ss, 100000 ); - - // TRD : fill the pushing thread stacks - for( subloop = 0 ; subloop < 100000 ; subloop++ ) - lfds611_stack_push( (stpps+loop+cpu_count)->local_ss, (void *) (lfds611_atom_t) subloop ); - } - - thread_handles = malloc( sizeof(thread_state_t) * cpu_count * 2 ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) { - abstraction_thread_start( &thread_handles[loop], loop, stack_test_internal_thread_popping_and_pushing_start_popping, stpps+loop ); - abstraction_thread_start( &thread_handles[loop+cpu_count], loop, stack_test_internal_thread_popping_and_pushing_start_pushing, stpps+loop+cpu_count ); - } - - for( loop = 0 ; loop < cpu_count * 2 ; loop++ ) - abstraction_thread_wait( thread_handles[loop] ); - - free( thread_handles ); - - for( loop = 0 ; loop < cpu_count * 2 ; loop++ ) - lfds611_stack_delete( (stpps+loop)->local_ss, NULL, NULL ); - - free( stpps ); - - vi.min_elements = vi.max_elements = 100000 * cpu_count * 2; - - lfds611_stack_query( ss, LFDS611_STACK_QUERY_VALIDATE, (void *) &vi, (void *) dvs ); - - lfds611_stack_delete( ss, NULL, NULL ); - - // TRD : print the test result - internal_display_test_result( 2, "stack", dvs[0], "stack freelist", dvs[1] ); - - return; -} - - - - - - -/****************************************************************************/ -thread_return_t CALLING_CONVENTION stack_test_internal_thread_popping_and_pushing_start_popping( void *stack_test_popping_and_pushing_state ) -{ - struct stack_test_popping_and_pushing_state - *stpps; - - void - *user_data; - - time_t - start_time; - - unsigned int - count; - - assert( stack_test_popping_and_pushing_state != NULL ); - - stpps = (struct stack_test_popping_and_pushing_state *) stack_test_popping_and_pushing_state; - - lfds611_stack_use( stpps->ss ); - lfds611_stack_use( stpps->local_ss ); - - time( &start_time ); - - while( time(NULL) < start_time + 10 ) { - count = 0; - - while( count < 100000 ) - if( lfds611_stack_pop(stpps->ss, &user_data) ) { - lfds611_stack_push( stpps->local_ss, user_data ); - count++; - } - - // TRD : return our local stack to the main stack - while( lfds611_stack_pop(stpps->local_ss, &user_data) ) - lfds611_stack_push( stpps->ss, user_data ); - } - - return( (thread_return_t) EXIT_SUCCESS ); -} - - - - - -/****************************************************************************/ -thread_return_t CALLING_CONVENTION stack_test_internal_thread_popping_and_pushing_start_pushing( void *stack_test_popping_and_pushing_state ) -{ - struct stack_test_popping_and_pushing_state - *stpps; - - void - *user_data; - - time_t - start_time; - - unsigned int - count; - - assert( stack_test_popping_and_pushing_state != NULL ); - - stpps = (struct stack_test_popping_and_pushing_state *) stack_test_popping_and_pushing_state; - - lfds611_stack_use( stpps->ss ); - lfds611_stack_use( stpps->local_ss ); - - time( &start_time ); - - while( time(NULL) < start_time + 10 ) { - // TRD : return our local stack to the main stack - while( lfds611_stack_pop(stpps->local_ss, &user_data) ) - lfds611_stack_push( stpps->ss, user_data ); - - count = 0; - - while( count < 100000 ) - if( lfds611_stack_pop(stpps->ss, &user_data) ) { - lfds611_stack_push( stpps->local_ss, user_data ); - count++; - } - } - - // TRD : now push whatever we have in our local stack - while( lfds611_stack_pop(stpps->local_ss, &user_data) ) - lfds611_stack_push( stpps->ss, user_data ); - - return( (thread_return_t) EXIT_SUCCESS ); -} - - - - - -/****************************************************************************/ -void stack_test_internal_rapid_popping_and_pushing( void ) -{ - unsigned int - loop, - cpu_count; - - thread_state_t - *thread_handles; - - struct lfds611_stack_state - *ss; - - struct lfds611_validation_info - vi; - - enum lfds611_data_structure_validity - dvs[2]; - - /* TRD : in these tests there is a fundamental antagonism between - how much checking/memory clean up that we do and the - likelyhood of collisions between threads in their lock-free - operations - - the lock-free operations are very quick; if we do anything - much at all between operations, we greatly reduce the chance - of threads colliding - - so we have some tests which do enough checking/clean up that - they can tell the stack is valid and don't leak memory - and here, this test now is one of those which does minimal - checking - in fact, the nature of the test is that you can't - do any real checking - but goes very quickly - - what we do is create a small stack and then run one thread - per CPU, where each thread simply pushes and then immediately - pops - - the test runs for ten seconds - - after the test is done, the only check we do is to traverse - the stack, checking for loops and ensuring the number of - elements is correct - */ - - internal_display_test_name( "Rapid popping and pushing (10 seconds)" ); - - cpu_count = abstraction_cpu_count(); - - lfds611_stack_new( &ss, cpu_count ); - - thread_handles = malloc( sizeof(thread_state_t) * cpu_count ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) - abstraction_thread_start( &thread_handles[loop], loop, stack_test_internal_thread_rapid_popping_and_pushing, ss ); - - for( loop = 0 ; loop < cpu_count ; loop++ ) - abstraction_thread_wait( thread_handles[loop] ); - - free( thread_handles ); - - vi.min_elements = 0; - vi.max_elements = 0; - - lfds611_stack_query( ss, LFDS611_STACK_QUERY_VALIDATE, (void *) &vi, (void *) dvs ); - - lfds611_stack_delete( ss, NULL, NULL ); - - // TRD : print the test result - internal_display_test_result( 2, "stack", dvs[0], "stack freelist", dvs[1] ); - - return; -} - - - - - -/****************************************************************************/ -thread_return_t CALLING_CONVENTION stack_test_internal_thread_rapid_popping_and_pushing( void *stack_state ) -{ - struct lfds611_stack_state - *ss; - - void - *user_data = NULL; - - time_t - start_time; - - assert( stack_state != NULL ); - - ss = (struct lfds611_stack_state *) stack_state; - - lfds611_stack_use( ss ); - - time( &start_time ); - - while( time(NULL) < start_time + 10 ) { - lfds611_stack_push( ss, user_data ); - lfds611_stack_pop( ss, &user_data ); - } - - return( (thread_return_t) EXIT_SUCCESS ); -} - diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/test/test.sln b/openair2/UTIL/LFDS/liblfds6.1.1/test/test.sln deleted file mode 100644 index 3cfb5b2031..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/test/test.sln +++ /dev/null @@ -1,79 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 10.00 -# Visual Studio 2008 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test", "test.vcproj", "{6E4CBF20-DF1A-4FA0-8A90-58E2A3A5CF09}" - ProjectSection(ProjectDependencies) = postProject - {F73AE755-F6D8-4C3A-977D-FBB40DC0ED05} = {F73AE755-F6D8-4C3A-977D-FBB40DC0ED05} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "liblfds611", "..\liblfds611\liblfds611.vcproj", "{F73AE755-F6D8-4C3A-977D-FBB40DC0ED05}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug DLL|Win32 = Debug DLL|Win32 - Debug DLL|x64 = Debug DLL|x64 - Debug Lib|Win32 = Debug Lib|Win32 - Debug Lib|x64 = Debug Lib|x64 - Debug|Win32 = Debug|Win32 - Debug|x64 = Debug|x64 - Release DLL|Win32 = Release DLL|Win32 - Release DLL|x64 = Release DLL|x64 - Release Lib|Win32 = Release Lib|Win32 - Release Lib|x64 = Release Lib|x64 - Release|Win32 = Release|Win32 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {6E4CBF20-DF1A-4FA0-8A90-58E2A3A5CF09}.Debug DLL|Win32.ActiveCfg = Debug|Win32 - {6E4CBF20-DF1A-4FA0-8A90-58E2A3A5CF09}.Debug DLL|Win32.Build.0 = Debug|Win32 - {6E4CBF20-DF1A-4FA0-8A90-58E2A3A5CF09}.Debug DLL|x64.ActiveCfg = Debug|x64 - {6E4CBF20-DF1A-4FA0-8A90-58E2A3A5CF09}.Debug DLL|x64.Build.0 = Debug|x64 - {6E4CBF20-DF1A-4FA0-8A90-58E2A3A5CF09}.Debug Lib|Win32.ActiveCfg = Debug|Win32 - {6E4CBF20-DF1A-4FA0-8A90-58E2A3A5CF09}.Debug Lib|Win32.Build.0 = Debug|Win32 - {6E4CBF20-DF1A-4FA0-8A90-58E2A3A5CF09}.Debug Lib|x64.ActiveCfg = Debug|x64 - {6E4CBF20-DF1A-4FA0-8A90-58E2A3A5CF09}.Debug Lib|x64.Build.0 = Debug|x64 - {6E4CBF20-DF1A-4FA0-8A90-58E2A3A5CF09}.Debug|Win32.ActiveCfg = Debug|Win32 - {6E4CBF20-DF1A-4FA0-8A90-58E2A3A5CF09}.Debug|Win32.Build.0 = Debug|Win32 - {6E4CBF20-DF1A-4FA0-8A90-58E2A3A5CF09}.Debug|x64.ActiveCfg = Debug|x64 - {6E4CBF20-DF1A-4FA0-8A90-58E2A3A5CF09}.Debug|x64.Build.0 = Debug|x64 - {6E4CBF20-DF1A-4FA0-8A90-58E2A3A5CF09}.Release DLL|Win32.ActiveCfg = Release|Win32 - {6E4CBF20-DF1A-4FA0-8A90-58E2A3A5CF09}.Release DLL|Win32.Build.0 = Release|Win32 - {6E4CBF20-DF1A-4FA0-8A90-58E2A3A5CF09}.Release DLL|x64.ActiveCfg = Release|x64 - {6E4CBF20-DF1A-4FA0-8A90-58E2A3A5CF09}.Release DLL|x64.Build.0 = Release|x64 - {6E4CBF20-DF1A-4FA0-8A90-58E2A3A5CF09}.Release Lib|Win32.ActiveCfg = Release|Win32 - {6E4CBF20-DF1A-4FA0-8A90-58E2A3A5CF09}.Release Lib|Win32.Build.0 = Release|Win32 - {6E4CBF20-DF1A-4FA0-8A90-58E2A3A5CF09}.Release Lib|x64.ActiveCfg = Release|x64 - {6E4CBF20-DF1A-4FA0-8A90-58E2A3A5CF09}.Release Lib|x64.Build.0 = Release|x64 - {6E4CBF20-DF1A-4FA0-8A90-58E2A3A5CF09}.Release|Win32.ActiveCfg = Release|Win32 - {6E4CBF20-DF1A-4FA0-8A90-58E2A3A5CF09}.Release|Win32.Build.0 = Release|Win32 - {6E4CBF20-DF1A-4FA0-8A90-58E2A3A5CF09}.Release|x64.ActiveCfg = Release|x64 - {6E4CBF20-DF1A-4FA0-8A90-58E2A3A5CF09}.Release|x64.Build.0 = Release|x64 - {F73AE755-F6D8-4C3A-977D-FBB40DC0ED05}.Debug DLL|Win32.ActiveCfg = Debug DLL|Win32 - {F73AE755-F6D8-4C3A-977D-FBB40DC0ED05}.Debug DLL|Win32.Build.0 = Debug DLL|Win32 - {F73AE755-F6D8-4C3A-977D-FBB40DC0ED05}.Debug DLL|x64.ActiveCfg = Debug DLL|x64 - {F73AE755-F6D8-4C3A-977D-FBB40DC0ED05}.Debug DLL|x64.Build.0 = Debug DLL|x64 - {F73AE755-F6D8-4C3A-977D-FBB40DC0ED05}.Debug Lib|Win32.ActiveCfg = Debug Lib|Win32 - {F73AE755-F6D8-4C3A-977D-FBB40DC0ED05}.Debug Lib|Win32.Build.0 = Debug Lib|Win32 - {F73AE755-F6D8-4C3A-977D-FBB40DC0ED05}.Debug Lib|x64.ActiveCfg = Debug Lib|x64 - {F73AE755-F6D8-4C3A-977D-FBB40DC0ED05}.Debug Lib|x64.Build.0 = Debug Lib|x64 - {F73AE755-F6D8-4C3A-977D-FBB40DC0ED05}.Debug|Win32.ActiveCfg = Debug Lib|Win32 - {F73AE755-F6D8-4C3A-977D-FBB40DC0ED05}.Debug|Win32.Build.0 = Debug Lib|Win32 - {F73AE755-F6D8-4C3A-977D-FBB40DC0ED05}.Debug|x64.ActiveCfg = Debug Lib|x64 - {F73AE755-F6D8-4C3A-977D-FBB40DC0ED05}.Debug|x64.Build.0 = Debug Lib|x64 - {F73AE755-F6D8-4C3A-977D-FBB40DC0ED05}.Release DLL|Win32.ActiveCfg = Release DLL|Win32 - {F73AE755-F6D8-4C3A-977D-FBB40DC0ED05}.Release DLL|Win32.Build.0 = Release DLL|Win32 - {F73AE755-F6D8-4C3A-977D-FBB40DC0ED05}.Release DLL|x64.ActiveCfg = Release DLL|x64 - {F73AE755-F6D8-4C3A-977D-FBB40DC0ED05}.Release DLL|x64.Build.0 = Release DLL|x64 - {F73AE755-F6D8-4C3A-977D-FBB40DC0ED05}.Release Lib|Win32.ActiveCfg = Release Lib|Win32 - {F73AE755-F6D8-4C3A-977D-FBB40DC0ED05}.Release Lib|Win32.Build.0 = Release Lib|Win32 - {F73AE755-F6D8-4C3A-977D-FBB40DC0ED05}.Release Lib|x64.ActiveCfg = Release Lib|x64 - {F73AE755-F6D8-4C3A-977D-FBB40DC0ED05}.Release Lib|x64.Build.0 = Release Lib|x64 - {F73AE755-F6D8-4C3A-977D-FBB40DC0ED05}.Release|Win32.ActiveCfg = Release Lib|Win32 - {F73AE755-F6D8-4C3A-977D-FBB40DC0ED05}.Release|Win32.Build.0 = Release Lib|Win32 - {F73AE755-F6D8-4C3A-977D-FBB40DC0ED05}.Release|x64.ActiveCfg = Release Lib|x64 - {F73AE755-F6D8-4C3A-977D-FBB40DC0ED05}.Release|x64.Build.0 = Release Lib|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/openair2/UTIL/LFDS/liblfds6.1.1/test/test.vcproj b/openair2/UTIL/LFDS/liblfds6.1.1/test/test.vcproj deleted file mode 100644 index 97159c86b4..0000000000 --- a/openair2/UTIL/LFDS/liblfds6.1.1/test/test.vcproj +++ /dev/null @@ -1,415 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - From 17a956067ad89ebc38f784c4291b84e2b8d06912 Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Tue, 1 Mar 2022 08:33:28 +0100 Subject: [PATCH 71/96] Fix HTML --- ci-scripts/html.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci-scripts/html.py b/ci-scripts/html.py index c618ea5abc..13a1ab8691 100644 --- a/ci-scripts/html.py +++ b/ci-scripts/html.py @@ -486,7 +486,7 @@ class HTMLManagement(): # TestRow self.htmlFile.write(' \n') self.htmlFile.write(' ' + k + ' \n') - self.htmlFile.write(' ' + DataLog['Data'][k][0] + '; ' + DataLog['Data'][k][1] + '; ' + DataLog['Data'][k][2] + ' \n') + self.htmlFile.write(' ' + DataLog['Data'][k][0] + '; ' + DataLog['Data'][k][1] + '; ' + DataLog['Data'][k][2] + ' \n') if float(DataLog['Data'][k][3])> DataLog['Threshold'][k]: self.htmlFile.write(' ' + DataLog['Data'][k][3] + ' (Ref = ' + str(DataLog['Ref'][k]) + ' ; Thres = ' +str(DataLog['Threshold'][k])+') ' + '\n') else: From 261c80d659f9275786728c3add1483a756e06bdf Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Tue, 1 Mar 2022 08:49:38 +0100 Subject: [PATCH 72/96] Tpool: don't override positive performanceFlag --- common/utils/threadPool/thread-pool.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/utils/threadPool/thread-pool.c b/common/utils/threadPool/thread-pool.c index 4a5485e89e..de9091de79 100644 --- a/common/utils/threadPool/thread-pool.c +++ b/common/utils/threadPool/thread-pool.c @@ -97,7 +97,7 @@ void initNamedTpool(char *params,tpool_t *pool, bool performanceMeas, char *name char *measr=getenv("threadPoolMeasurements"); pool->measurePerf=performanceMeas; // force measurement if the output is defined - pool->measurePerf=measr!=NULL; + pool->measurePerf |= measr!=NULL; if (measr) { mkfifo(measr,0666); From 98a684d157a9ea247aa6b2ea204fae16b1b2c4c1 Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Tue, 1 Mar 2022 08:57:32 +0100 Subject: [PATCH 73/96] Tpool: no measurements (no trials) if not measured --- common/utils/threadPool/thread-pool.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/common/utils/threadPool/thread-pool.h b/common/utils/threadPool/thread-pool.h index dc2655f741..d06f2195ee 100644 --- a/common/utils/threadPool/thread-pool.h +++ b/common/utils/threadPool/thread-pool.h @@ -175,6 +175,8 @@ static inline notifiedFIFO_elt_t *pollNotifiedFIFO(notifiedFIFO_t *nf) { static inline time_stats_t exec_time_stats_NotifiedFIFO(const notifiedFIFO_elt_t* elt) { time_stats_t ts = {0}; + if (elt->startProcessingTime == 0 && elt->endProcessingTime == 0) + return ts; /* no measurements done */ ts.in = elt->startProcessingTime; ts.diff = elt->endProcessingTime - ts.in; ts.p_time = ts.diff; From 6146f44b808d9a671186e37b6d44100e79f9cba1 Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Tue, 1 Mar 2022 18:50:53 +0100 Subject: [PATCH 74/96] CI: log to see why RT stats checking fails --- ci-scripts/ran.py | 1 + 1 file changed, 1 insertion(+) diff --git a/ci-scripts/ran.py b/ci-scripts/ran.py index 44626dba74..9feb9b4906 100644 --- a/ci-scripts/ran.py +++ b/ci-scripts/ran.py @@ -1137,6 +1137,7 @@ class RANManagement(): #check if there is a fail => will render the test as failed for k in datalog_rt_stats['Data']: if float(datalog_rt_stats['Data'][k][2])> datalog_rt_stats['Threshold'][k]: #condition for fail : avg/ref is greater than the fixed threshold + logging.debug('\u001B[1;30;43m datalog_rt_stats metric ' + k + '=' + datalog_rt_stats['Data'][k][2] + ' > threshold ' + str(datalog_rt_stats['Threshold'][k]) + ' \u001B[0m') RealTimeProcessingIssue = True else: statMsg = 'No real time stats found in the log file\n' From bf4429196a591095c333b5a2b2c4ed29bfc661ae Mon Sep 17 00:00:00 2001 From: Thomas Schlichter Date: Tue, 1 Mar 2022 17:13:31 +0100 Subject: [PATCH 75/96] NR_UE: fix UL retransmission --- openair1/SCHED_NR_UE/fapi_nr_ue_l1.c | 10 +++++----- openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c b/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c index 9aa84b6704..c1624fcb8b 100644 --- a/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c +++ b/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c @@ -352,7 +352,6 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){ pusch_config_pdu = &ul_config->ul_config_list[i].pusch_config_pdu; current_harq_pid = pusch_config_pdu->pusch_data.harq_process_id; NR_UL_UE_HARQ_t *harq_process_ul_ue = ulsch0->harq_processes[current_harq_pid]; - harq_process_ul_ue->status = 0; if (harq_process_ul_ue){ @@ -368,15 +367,16 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){ if ((tx_req_body->pdu_index == i) && (tx_req_body->pdu_length > 0)) { LOG_D(PHY,"%d.%d Copying %d bytes to harq_process_ul_ue->a (harq_pid %d)\n",scheduled_response->frame,slot,tx_req_body->pdu_length,current_harq_pid); memcpy(harq_process_ul_ue->a, tx_req_body->pdu, tx_req_body->pdu_length); - harq_process_ul_ue->status = ACTIVE; - ul_config->ul_config_list[i].pdu_type = FAPI_NR_UL_CONFIG_TYPE_DONE; // not handle it any more - pdu_done++; - LOG_D(PHY, "%d.%d ul A ul_config %p t %d pdu_done %d number_pdus %d\n", scheduled_response->frame, slot, ul_config, pdu_type, pdu_done, ul_config->number_pdus); break; } } } + harq_process_ul_ue->status = ACTIVE; + ul_config->ul_config_list[i].pdu_type = FAPI_NR_UL_CONFIG_TYPE_DONE; // not handle it any more + pdu_done++; + LOG_D(PHY, "%d.%d ul A ul_config %p t %d pdu_done %d number_pdus %d\n", scheduled_response->frame, slot, ul_config, pdu_type, pdu_done, ul_config->number_pdus); + } else { LOG_E(PHY, "[phy_procedures_nrUE_TX] harq_process_ul_ue is NULL !!\n"); diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c index 1a2e52a603..c99ff58106 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c @@ -1115,7 +1115,7 @@ NR_UE_L2_STATE_t nr_ue_scheduler(nr_downlink_indication_t *dl_info, nr_uplink_in tx_req.number_of_pdus = 0; for (int j = 0; j < ul_config->number_pdus; j++) { - uint8_t *ulsch_input_buffer = &(ulsch_input_buffer_array[tx_req.number_of_pdus][MAX_ULSCH_PAYLOAD_BYTES]); + uint8_t *ulsch_input_buffer = ulsch_input_buffer_array[tx_req.number_of_pdus]; fapi_nr_ul_config_request_pdu_t *ulcfg_pdu = &ul_config->ul_config_list[j]; From d09366c50328925cf1e38a370584257e0c74d018 Mon Sep 17 00:00:00 2001 From: Thomas Schlichter Date: Tue, 1 Mar 2022 17:39:55 +0100 Subject: [PATCH 76/96] NR_UE: correctly scale UL frequency offset (relevant for FDD) --- openair1/PHY/NR_UE_TRANSPORT/nr_ue_rf_helpers.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_ue_rf_helpers.c b/openair1/PHY/NR_UE_TRANSPORT/nr_ue_rf_helpers.c index 6530dd9512..d3f362b90c 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_ue_rf_helpers.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_ue_rf_helpers.c @@ -86,16 +86,17 @@ void nr_rf_card_config_freq(openair0_config_t *openair0_cfg, uint8_t cc_id = 0; PHY_VARS_NR_UE *ue = PHY_vars_UE_g[mod_id][cc_id]; int rf_chain = ue->rf_map.chain; + double freq_scale = (double)(dl_carrier + freq_offset) / dl_carrier; for (int i = rf_chain; i < rf_chain + 4; i++) { if (i < openair0_cfg->rx_num_channels) - openair0_cfg->rx_freq[i + rf_chain] = dl_carrier + freq_offset; + openair0_cfg->rx_freq[i + rf_chain] = dl_carrier * freq_scale; else openair0_cfg->rx_freq[i] = 0.0; if (itx_num_channels) - openair0_cfg->tx_freq[i] = ul_carrier + freq_offset; + openair0_cfg->tx_freq[i] = ul_carrier * freq_scale; else openair0_cfg->tx_freq[i] = 0.0; From bc158e4ce4d271272f1fe9a719c8b9e6cfbc20cf Mon Sep 17 00:00:00 2001 From: francescomani Date: Wed, 2 Mar 2022 11:00:17 +0100 Subject: [PATCH 77/96] fixing asan leaks after merge --- openair1/PHY/INIT/nr_init_ue.c | 7 ++++--- openair1/PHY/NR_TRANSPORT/nr_dlsch.c | 16 +++++++--------- openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c | 2 +- openair1/PHY/NR_TRANSPORT/nr_scrambling.c | 2 +- 4 files changed, 13 insertions(+), 14 deletions(-) diff --git a/openair1/PHY/INIT/nr_init_ue.c b/openair1/PHY/INIT/nr_init_ue.c index 00abc91245..cccaa9a909 100644 --- a/openair1/PHY/INIT/nr_init_ue.c +++ b/openair1/PHY/INIT/nr_init_ue.c @@ -165,9 +165,10 @@ void phy_init_nr_ue_PUSCH(NR_UE_PUSCH *const pusch, } } -void phy_term_nr_ue_PUSCH(NR_UE_PUSCH *pusch) +void phy_term_nr_ue_PUSCH(NR_UE_PUSCH *pusch, + const NR_DL_FRAME_PARMS* fp) { - for (int i = 0; i < NR_MAX_NB_LAYERS; i++) + for (int i = 0; i < fp->nb_antennas_tx; i++) free_and_zero(pusch->txdataF_layers[i]); } @@ -513,7 +514,7 @@ void term_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB) for (int th_id = 0; th_id < RX_NB_TH_MAX; th_id++) { for (int gNB_id = 0; gNB_id < ue->n_connected_gNB; gNB_id++) { - phy_term_nr_ue_PUSCH(ue->pusch_vars[th_id][gNB_id]); + phy_term_nr_ue_PUSCH(ue->pusch_vars[th_id][gNB_id],fp); free_and_zero(ue->pusch_vars[th_id][gNB_id]); free_and_zero(ue->pucch_vars[th_id][gNB_id]); } diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c index f636c8ebda..876d6cc83a 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c @@ -98,7 +98,7 @@ void nr_generate_pdsch(processingData_L1tx_t *msgTx, uint16_t nb_re = ((12*rel15->NrOfSymbols)-nb_re_dmrs*dmrs_len-xOverhead)*rel15->rbSize*rel15->nrOfLayers; uint8_t Qm = rel15->qamModOrder[0]; uint32_t encoded_length = nb_re*Qm; - uint32_t scrambled_output[rel15->NrOfCodewords][encoded_length>>5]; + uint32_t scrambled_output[rel15->NrOfCodewords][(encoded_length>>5)+1]; int16_t mod_dmrs[n_dmrs<<1] __attribute__ ((aligned(16))); /* PTRS */ @@ -120,8 +120,8 @@ void nr_generate_pdsch(processingData_L1tx_t *msgTx, /// CRC, coding, interleaving and rate matching AssertFatal(harq->pdu!=NULL,"harq->pdu is null\n"); - unsigned char output[rel15->rbSize * NR_SYMBOLS_PER_SLOT * NR_NB_SC_PER_RB * 8 * rel15->nrOfLayers] __attribute__((aligned(32))); - bzero(output,rel15->rbSize * NR_SYMBOLS_PER_SLOT * NR_NB_SC_PER_RB * 8 * rel15->nrOfLayers); + unsigned char output[rel15->rbSize * NR_SYMBOLS_PER_SLOT * NR_NB_SC_PER_RB * Qm * rel15->nrOfLayers] __attribute__((aligned(32))); + bzero(output,rel15->rbSize * NR_SYMBOLS_PER_SLOT * NR_NB_SC_PER_RB * Qm * rel15->nrOfLayers); start_meas(dlsch_encoding_stats); if (nr_dlsch_encoding(gNB, @@ -146,20 +146,18 @@ void nr_generate_pdsch(processingData_L1tx_t *msgTx, } printf("\n"); #endif - - - + /// scrambling start_meas(dlsch_scrambling_stats); - for (int q=0; qNrOfCodewords; q++) - memset((void*)scrambled_output[q], 0, (encoded_length>>5)*sizeof(uint32_t)); - for (int q=0; qNrOfCodewords; q++) + for (int q=0; qNrOfCodewords; q++) { + memset((void*)scrambled_output[q], 0, ((encoded_length>>5)+1)*sizeof(uint32_t)); nr_pdsch_codeword_scrambling(output, encoded_length, q, rel15->dataScramblingId, rel15->rnti, scrambled_output[q]); + } stop_meas(dlsch_scrambling_stats); #ifdef DEBUG_DLSCH diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c index 836d202d29..a11dfd697d 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c @@ -83,7 +83,7 @@ void free_gNB_dlsch(NR_gNB_DLSCH_t **dlschptr, for (int q=0; qmod_symbs[q]); - for (int layer = 0; layer < NR_MAX_NB_LAYERS; layer++) { + for (int layer = 0; layer < max_layers; layer++) { free(dlsch->txdataF[layer]); for (int aa = 0; aa < 64; aa++) free(dlsch->ue_spec_bf_weights[layer][aa]); diff --git a/openair1/PHY/NR_TRANSPORT/nr_scrambling.c b/openair1/PHY/NR_TRANSPORT/nr_scrambling.c index b68ad2d89f..4bbecfd994 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_scrambling.c +++ b/openair1/PHY/NR_TRANSPORT/nr_scrambling.c @@ -40,7 +40,7 @@ void nr_codeword_scrambling(uint8_t *in, __m256i c = ((__m256i*)in)[i]; uint32_t in32 = _mm256_movemask_epi8(_mm256_slli_epi16(c,7)); out[i]=(in32^s); - //printf("in[%d] %x => %x\n",i,in32,out[i]); + LOG_D(PHY,"in[%d] %x => %x\n",i,in32,out[i]); s=lte_gold_generic(&x1, &x2, 0); } #elif defined(__SSE4__) From 3a55cff7705cb574922f6925115abcf88269a8e0 Mon Sep 17 00:00:00 2001 From: hardy Date: Wed, 2 Mar 2022 15:14:23 +0100 Subject: [PATCH 78/96] bugfix indexing for rt stats detection --- ci-scripts/ran.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ci-scripts/ran.py b/ci-scripts/ran.py index 9feb9b4906..a84de792fd 100644 --- a/ci-scripts/ran.py +++ b/ci-scripts/ran.py @@ -1136,8 +1136,8 @@ class RANManagement(): self.datalog_rt_stats=datalog_rt_stats #check if there is a fail => will render the test as failed for k in datalog_rt_stats['Data']: - if float(datalog_rt_stats['Data'][k][2])> datalog_rt_stats['Threshold'][k]: #condition for fail : avg/ref is greater than the fixed threshold - logging.debug('\u001B[1;30;43m datalog_rt_stats metric ' + k + '=' + datalog_rt_stats['Data'][k][2] + ' > threshold ' + str(datalog_rt_stats['Threshold'][k]) + ' \u001B[0m') + if float(datalog_rt_stats['Data'][k][3])> datalog_rt_stats['Threshold'][k]: #condition for fail : avg/ref is greater than the fixed threshold + logging.debug('\u001B[1;30;43m datalog_rt_stats metric ' + k + '=' + datalog_rt_stats['Data'][k][3] + ' > threshold ' + str(datalog_rt_stats['Threshold'][k]) + ' \u001B[0m') RealTimeProcessingIssue = True else: statMsg = 'No real time stats found in the log file\n' From 647adcd6cea28d256d7ba9e6bea5765b95b344b3 Mon Sep 17 00:00:00 2001 From: francescomani Date: Wed, 2 Mar 2022 15:48:40 +0100 Subject: [PATCH 79/96] more leaks fixed --- openair1/PHY/INIT/nr_init.c | 7 +++-- openair1/PHY/INIT/nr_init_ue.c | 29 +------------------ openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c | 4 +++ .../PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c | 3 ++ openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c | 9 ++++-- openair1/PHY/defs_nr_UE.h | 6 ---- openair1/SIMULATION/NR_PHY/dlschsim.c | 20 +++---------- 7 files changed, 23 insertions(+), 55 deletions(-) diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c index c38a6c16d9..ff3bdf3b8e 100644 --- a/openair1/PHY/INIT/nr_init.c +++ b/openair1/PHY/INIT/nr_init.c @@ -364,6 +364,7 @@ void phy_free_nr_gNB(PHY_VARS_gNB *gNB) free_and_zero(gNB->nr_srs_info[id]->srs_estimated_channel_time[i]); free_and_zero(gNB->nr_srs_info[id]->srs_estimated_channel_time_shifted[i]); } + free_and_zero(gNB->nr_srs_info[id]->sc_list); free_and_zero(gNB->nr_srs_info[id]->srs_generated_signal); free_and_zero(gNB->nr_srs_info[id]->noise_power); free_and_zero(gNB->nr_srs_info[id]->srs_received_signal); @@ -572,9 +573,10 @@ void init_DLSCH_struct(PHY_VARS_gNB *gNB, processingData_L1tx_t *msg) { uint16_t grid_size = cfg->carrier_config.dl_grid_size[fp->numerology_index].value; msg->num_pdsch_slot = 0; + int num_cw = NR_MAX_NB_LAYERS > 4? 2:1; for (int i=0; inumber_of_nr_dlsch_max; i++) { LOG_I(PHY,"Allocating Transport Channel Buffers for DLSCH %d/%d\n",i,gNB->number_of_nr_dlsch_max); - for (int j=0; j<2; j++) { + for (int j=0; jdlsch[i][j] = new_gNB_dlsch(fp,1,16,NSOFT,0,grid_size); AssertFatal(msg->dlsch[i][j]!=NULL,"Can't initialize dlsch %d \n", i); } @@ -586,8 +588,9 @@ void reset_DLSCH_struct(const PHY_VARS_gNB *gNB, processingData_L1tx_t *msg) const NR_DL_FRAME_PARMS *fp = &gNB->frame_parms; const nfapi_nr_config_request_scf_t *cfg = &gNB->gNB_config; const uint16_t grid_size = cfg->carrier_config.dl_grid_size[fp->numerology_index].value; + int num_cw = NR_MAX_NB_LAYERS > 4? 2:1; for (int i=0; inumber_of_nr_dlsch_max; i++) - for (int j=0; j<2; j++) + for (int j=0; jdlsch[i][j], grid_size, fp); } diff --git a/openair1/PHY/INIT/nr_init_ue.c b/openair1/PHY/INIT/nr_init_ue.c index cccaa9a909..6ad07a77f6 100644 --- a/openair1/PHY/INIT/nr_init_ue.c +++ b/openair1/PHY/INIT/nr_init_ue.c @@ -155,23 +155,6 @@ void phy_term_nr_ue__PDSCH(NR_UE_PDSCH* pdsch, const NR_DL_FRAME_PARMS *const fp free_and_zero(pdsch->dl_ch_ptrs_estimates_ext); } -void phy_init_nr_ue_PUSCH(NR_UE_PUSCH *const pusch, - const NR_DL_FRAME_PARMS *const fp) { - AssertFatal( pusch, "pusch==0" ); - int max_pusch_length = fp->N_RB_UL*NR_SYMBOLS_PER_SLOT*NR_NB_SC_PER_RB*8*fp->nb_antennas_tx; - pusch->txdataF_layers = (int32_t **)malloc16_clear(fp->nb_antennas_tx*sizeof(int32_t *)); - for (int i=0; inb_antennas_tx; i++) { - pusch->txdataF_layers[i] = (int32_t *)malloc16_clear(max_pusch_length*sizeof(int32_t)); - } -} - -void phy_term_nr_ue_PUSCH(NR_UE_PUSCH *pusch, - const NR_DL_FRAME_PARMS* fp) -{ - for (int i = 0; i < fp->nb_antennas_tx; i++) - free_and_zero(pusch->txdataF_layers[i]); -} - int init_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB) { // create shortcuts @@ -215,15 +198,6 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB) // init NR modulation lookup tables nr_generate_modulation_table(); - /////////////////////////PUSCH init///////////////////////// - /////////// - for (th_id = 0; th_id < RX_NB_TH_MAX; th_id++) { - for (gNB_id = 0; gNB_id < ue->n_connected_gNB; gNB_id++) { - ue->pusch_vars[th_id][gNB_id] = (NR_UE_PUSCH *)malloc16(sizeof(NR_UE_PUSCH)); - phy_init_nr_ue_PUSCH( ue->pusch_vars[th_id][gNB_id], fp ); - } - } - /////////////////////////PUCCH init///////////////////////// /////////// for (th_id = 0; th_id < RX_NB_TH_MAX; th_id++) { @@ -514,8 +488,6 @@ void term_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB) for (int th_id = 0; th_id < RX_NB_TH_MAX; th_id++) { for (int gNB_id = 0; gNB_id < ue->n_connected_gNB; gNB_id++) { - phy_term_nr_ue_PUSCH(ue->pusch_vars[th_id][gNB_id],fp); - free_and_zero(ue->pusch_vars[th_id][gNB_id]); free_and_zero(ue->pucch_vars[th_id][gNB_id]); } } @@ -640,6 +612,7 @@ void term_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB) free_and_zero(ue->nr_srs_info->srs_estimated_channel_time[i]); free_and_zero(ue->nr_srs_info->srs_estimated_channel_time_shifted[i]); } + free_and_zero(ue->nr_srs_info->sc_list); free_and_zero(ue->nr_srs_info->srs_generated_signal); free_and_zero(ue->nr_srs_info->noise_power); free_and_zero(ue->nr_srs_info->srs_received_signal); diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c index a11dfd697d..229f59032e 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c @@ -73,6 +73,7 @@ void free_gNB_dlsch(NR_gNB_DLSCH_t **dlschptr, free(harq->c[r]); harq->c[r] = NULL; } + free(harq->c); free(harq->pdu); for (int aa = 0; aa < 64; aa++) @@ -82,6 +83,7 @@ void free_gNB_dlsch(NR_gNB_DLSCH_t **dlschptr, int nb_codewords = NR_MAX_NB_LAYERS > 4 ? 2 : 1; for (int q=0; qmod_symbs[q]); + free(dlsch->mod_symbs); for (int layer = 0; layer < max_layers; layer++) { free(dlsch->txdataF[layer]); @@ -89,6 +91,8 @@ void free_gNB_dlsch(NR_gNB_DLSCH_t **dlschptr, free(dlsch->ue_spec_bf_weights[layer][aa]); free(dlsch->ue_spec_bf_weights[layer]); } + free(dlsch->txdataF); + free(dlsch->ue_spec_bf_weights); free(dlsch); *dlschptr = NULL; diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c index 7652db98c0..0e2abf40aa 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c @@ -102,7 +102,10 @@ void free_nr_ue_dlsch(NR_UE_DLSCH_t **dlschptr, uint16_t N_RB_DL) { for (int r=0; rharq_processes[i]->c[r],1056); dlsch->harq_processes[i]->c[r] = NULL; + nrLDPC_free_mem(dlsch->harq_processes[i]->p_nrLDPC_procBuf[r]); } + free16(dlsch->harq_processes[i]->c,a_segments); + free16(dlsch->harq_processes[i]->p_nrLDPC_procBuf,a_segments); free16(dlsch->harq_processes[i],sizeof(NR_DL_UE_HARQ_t)); dlsch->harq_processes[i] = NULL; diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c index f7191b9b12..802cb55e03 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c @@ -114,7 +114,6 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE, LOG_D(PHY,"nr_ue_ulsch_procedures hard_id %d %d.%d\n",harq_pid,frame,slot); uint32_t available_bits; - int16_t **tx_layers; int32_t **txdataF; int8_t Wf[2], Wt[2]; int l_prime[2], delta; @@ -123,7 +122,6 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE, int sample_offsetF, N_RE_prime; NR_DL_FRAME_PARMS *frame_parms = &UE->frame_parms; - NR_UE_PUSCH *pusch_ue = UE->pusch_vars[thread_id][gNB_id]; int N_PRB_oh = 0; // higher layer (RRC) parameter xOverhead in PUSCH-ServingCellConfig uint16_t number_dmrs_symbols = 0; @@ -253,7 +251,9 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE, /////////////////////////ULSCH layer mapping///////////////////////// /////////// - tx_layers = (int16_t **)pusch_ue->txdataF_layers; + int16_t **tx_layers = (int16_t **)malloc16_clear(Nl*sizeof(int16_t *)); + for (int nl=0; nl4 ? 2:1]; // two RxTx Threads NR_UE_ULSCH_t *ulsch[RX_NB_TH_MAX][NUMBER_OF_CONNECTED_gNB_MAX]; diff --git a/openair1/SIMULATION/NR_PHY/dlschsim.c b/openair1/SIMULATION/NR_PHY/dlschsim.c index 277a7dae7e..d6812dd541 100644 --- a/openair1/SIMULATION/NR_PHY/dlschsim.c +++ b/openair1/SIMULATION/NR_PHY/dlschsim.c @@ -395,19 +395,6 @@ int main(int argc, char **argv) load_pbch_desc(pbch_file_fd); } - /* for (int k=0; k<2; k++) { - // Create transport channel structures for 2 transport blocks (MIMO) - for (i=0; i<2; i++) { - gNB->dlsch[k][i] = new_gNB_dlsch(Kmimo,8,Nsoft,0,frame_parms,gNB_config); - - if (!gNB->dlsch[k][i]) { - printf("Can't get eNB dlsch structures\n"); - exit(-1); - } - gNB->dlsch[k][i]->Nsoft = 10; - gNB->dlsch[k][i]->rnti = n_rnti+k; - } - }*/ //configure UE UE = malloc(sizeof(PHY_VARS_NR_UE)); memcpy(&UE->frame_parms, frame_parms, sizeof(NR_DL_FRAME_PARMS)); @@ -434,8 +421,8 @@ int main(int argc, char **argv) } unsigned char harq_pid = 0; //dlsch->harq_ids[subframe]; - processingData_L1tx_t msgDataTx; - init_DLSCH_struct(gNB, &msgDataTx); + processingData_L1tx_t msgDataTx; + init_DLSCH_struct(gNB, &msgDataTx); NR_gNB_DLSCH_t *dlsch = msgDataTx.dlsch[0][0]; nfapi_nr_dl_tti_pdsch_pdu_rel15_t *rel15 = &dlsch->harq_process.pdsch_pdu.pdsch_pdu_rel15; //time_stats_t *rm_stats, *te_stats, *i_stats; @@ -642,8 +629,9 @@ int main(int argc, char **argv) free(RC.gNB[0]); free(RC.gNB); + int num_cw = NR_MAX_NB_LAYERS > 4? 2:1; for (int sf = 0; sf < 2; sf++) - for (int i = 0; i < 2; i++) + for (int i = 0; i < num_cw; i++) free_nr_ue_dlsch(&UE->dlsch[sf][0][i], N_RB_DL); term_nr_ue_signal(UE, 1); free(UE); From 29fa47467340d703f532a1bd8e32fa3753daca50 Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Thu, 3 Mar 2022 16:37:58 +0100 Subject: [PATCH 80/96] Correctly reconfigure nrofHARQ processes --- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c index 938b9f2584..febe6cde9f 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c @@ -1943,7 +1943,6 @@ void create_nr_list(NR_list_t *list, int len) { list->head = -1; list->next = malloc(len * sizeof(*list->next)); - LOG_W(NR_MAC, "NR list->next %p\n", list->next); AssertFatal(list->next, "cannot malloc() memory for NR_list_t->next\n"); for (int i = 0; i < len; ++i) list->next[i] = -1; @@ -2278,8 +2277,16 @@ void create_dl_harq_list(NR_UE_sched_ctrl_t *sched_ctrl, add_tail_nr_list(&sched_ctrl->available_dl_harq, harq); create_nr_list(&sched_ctrl->feedback_dl_harq, nrofHARQ); create_nr_list(&sched_ctrl->retrans_dl_harq, nrofHARQ); + } else if (sched_ctrl->available_dl_harq.len == nrofHARQ) { + LOG_D(NR_MAC, "nrofHARQ %d already configured\n", nrofHARQ); } else { + const int old_nrofHARQ = sched_ctrl->available_dl_harq.len; + AssertFatal(nrofHARQ > old_nrofHARQ, + "cannot resize HARQ list to be smaller (nrofHARQ %d, old_nrofHARQ %d)\n", + nrofHARQ, old_nrofHARQ); resize_nr_list(&sched_ctrl->available_dl_harq, nrofHARQ); + for (int harq = old_nrofHARQ; harq < nrofHARQ; harq++) + add_tail_nr_list(&sched_ctrl->available_dl_harq, harq); resize_nr_list(&sched_ctrl->feedback_dl_harq, nrofHARQ); resize_nr_list(&sched_ctrl->retrans_dl_harq, nrofHARQ); } From 38ad1237148d9b171b7ad26c43cf5b9d96485145 Mon Sep 17 00:00:00 2001 From: francescomani Date: Thu, 3 Mar 2022 17:50:57 +0100 Subject: [PATCH 81/96] fix for VRB map occupation for PRACH --- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c index 8b5e1857a7..486c5d0763 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c @@ -389,7 +389,7 @@ void schedule_nr_prach(module_id_t module_idP, frame_t frameP, sub_frame_t slotP const int16_t N_RA_RB = get_N_RA_RB(cfg->prach_config.prach_sub_c_spacing.value, mu_pusch); uint16_t *vrb_map_UL = &cc->vrb_map_UL[slotP * MAX_BWP_SIZE]; for (int i = 0; i < N_RA_RB * fdm; ++i) - vrb_map_UL[bwp_start + rach_ConfigGeneric->msg1_FrequencyStart + i] = 0x3fff; // all symbols + vrb_map_UL[bwp_start + rach_ConfigGeneric->msg1_FrequencyStart + i] = SL_to_bitmap(start_symbol, N_t_slot*N_dur); } } } From 41635fafd71575df266e6c8c46bf147dad14c7d3 Mon Sep 17 00:00:00 2001 From: matzakos Date: Fri, 4 Mar 2022 13:09:06 +0100 Subject: [PATCH 82/96] Remove redundant BWP conf. parameters in CU/DU configuration files --- ci-scripts/conf_files/gNB_SA_CU.conf | 24 +------------------ ci-scripts/conf_files/gNB_SA_DU.conf | 24 +------------------ .../PROJECTS/GENERIC-NR-5GC/CONF/cu_gnb.conf | 24 +------------------ .../PROJECTS/GENERIC-NR-5GC/CONF/du_gnb.conf | 24 +------------------ 4 files changed, 4 insertions(+), 92 deletions(-) diff --git a/ci-scripts/conf_files/gNB_SA_CU.conf b/ci-scripts/conf_files/gNB_SA_CU.conf index 1e84e479bc..39c9a43ad4 100644 --- a/ci-scripts/conf_files/gNB_SA_CU.conf +++ b/ci-scripts/conf_files/gNB_SA_CU.conf @@ -84,17 +84,8 @@ gNBs = # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 initialDLBWPsubcarrierSpacing = 1; #pdcch-ConfigCommon - initialDLBWPcontrolResourceSetZero = 12; + initialDLBWPcontrolResourceSetZero = 11; initialDLBWPsearchSpaceZero = 0; - #pdsch-ConfigCommon - #pdschTimeDomainAllocationList (up to 16 entries) - initialDLBWPk0_0 = 0; #for DL slot - initialDLBWPmappingType_0 = 0; #0=typeA,1=typeB - initialDLBWPstartSymbolAndLength_0 = 40; #this is SS=1,L=13 - - initialDLBWPk0_1 = 0; #for mixed slot - initialDLBWPmappingType_1 = 0; - initialDLBWPstartSymbolAndLength_1 = 57; #this is SS=1,L=5 #uplinkConfigCommon #frequencyInfoUL @@ -149,19 +140,6 @@ gNBs = # 0=unrestricted, 1=restricted type A, 2=restricted type B restrictedSetConfig = 0, - # pusch-ConfigCommon (up to 16 elements) - initialULBWPk2_0 = 6; # used for UL slot - initialULBWPmappingType_0 = 1 - initialULBWPstartSymbolAndLength_0 = 41; # this is SS=0 L=13 - - initialULBWPk2_1 = 6; # used for mixed slot - initialULBWPmappingType_1 = 1; - initialULBWPstartSymbolAndLength_1 = 52; # this is SS=10 L=4 - - initialULBWPk2_2 = 7; # used for Msg.3 during RA - initialULBWPmappingType_2 = 1; - initialULBWPstartSymbolAndLength_2 = 52; # this is SS=10 L=4 - msg3_DeltaPreamble = 1; p0_NominalWithGrant =-90; diff --git a/ci-scripts/conf_files/gNB_SA_DU.conf b/ci-scripts/conf_files/gNB_SA_DU.conf index 95fa75bc1d..c30805a2d9 100644 --- a/ci-scripts/conf_files/gNB_SA_DU.conf +++ b/ci-scripts/conf_files/gNB_SA_DU.conf @@ -76,17 +76,8 @@ gNBs = # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 initialDLBWPsubcarrierSpacing = 1; #pdcch-ConfigCommon - initialDLBWPcontrolResourceSetZero = 12; + initialDLBWPcontrolResourceSetZero = 11; initialDLBWPsearchSpaceZero = 0; - #pdsch-ConfigCommon - #pdschTimeDomainAllocationList (up to 16 entries) - initialDLBWPk0_0 = 0; #for DL slot - initialDLBWPmappingType_0 = 0; #0=typeA,1=typeB - initialDLBWPstartSymbolAndLength_0 = 40; #this is SS=1,L=13 - - initialDLBWPk0_1 = 0; #for mixed slot - initialDLBWPmappingType_1 = 0; - initialDLBWPstartSymbolAndLength_1 = 57; #this is SS=1,L=5 #uplinkConfigCommon #frequencyInfoUL @@ -141,19 +132,6 @@ gNBs = # 0=unrestricted, 1=restricted type A, 2=restricted type B restrictedSetConfig = 0, - # pusch-ConfigCommon (up to 16 elements) - initialULBWPk2_0 = 6; # used for UL slot - initialULBWPmappingType_0 = 1 - initialULBWPstartSymbolAndLength_0 = 41; # this is SS=0 L=13 - - initialULBWPk2_1 = 6; # used for mixed slot - initialULBWPmappingType_1 = 1; - initialULBWPstartSymbolAndLength_1 = 52; # this is SS=10 L=4 - - initialULBWPk2_2 = 7; # used for Msg.3 during RA - initialULBWPmappingType_2 = 1; - initialULBWPstartSymbolAndLength_2 = 52; # this is SS=10 L=4 - msg3_DeltaPreamble = 1; p0_NominalWithGrant =-90; diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/cu_gnb.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/cu_gnb.conf index 5e8527b4d1..c07a0db649 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/cu_gnb.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/cu_gnb.conf @@ -84,17 +84,8 @@ gNBs = # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 initialDLBWPsubcarrierSpacing = 1; #pdcch-ConfigCommon - initialDLBWPcontrolResourceSetZero = 12; + initialDLBWPcontrolResourceSetZero = 11; initialDLBWPsearchSpaceZero = 0; - #pdsch-ConfigCommon - #pdschTimeDomainAllocationList (up to 16 entries) - initialDLBWPk0_0 = 0; #for DL slot - initialDLBWPmappingType_0 = 0; #0=typeA,1=typeB - initialDLBWPstartSymbolAndLength_0 = 40; #this is SS=1,L=13 - - initialDLBWPk0_1 = 0; #for mixed slot - initialDLBWPmappingType_1 = 0; - initialDLBWPstartSymbolAndLength_1 = 57; #this is SS=1,L=5 #uplinkConfigCommon #frequencyInfoUL @@ -149,19 +140,6 @@ gNBs = # 0=unrestricted, 1=restricted type A, 2=restricted type B restrictedSetConfig = 0, - # pusch-ConfigCommon (up to 16 elements) - initialULBWPk2_0 = 6; # used for UL slot - initialULBWPmappingType_0 = 1 - initialULBWPstartSymbolAndLength_0 = 41; # this is SS=0 L=13 - - initialULBWPk2_1 = 6; # used for mixed slot - initialULBWPmappingType_1 = 1; - initialULBWPstartSymbolAndLength_1 = 52; # this is SS=10 L=4 - - initialULBWPk2_2 = 7; # used for Msg.3 during RA - initialULBWPmappingType_2 = 1; - initialULBWPstartSymbolAndLength_2 = 52; # this is SS=10 L=4 - msg3_DeltaPreamble = 1; p0_NominalWithGrant =-90; diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/du_gnb.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/du_gnb.conf index 95fa75bc1d..c30805a2d9 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/du_gnb.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/du_gnb.conf @@ -76,17 +76,8 @@ gNBs = # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 initialDLBWPsubcarrierSpacing = 1; #pdcch-ConfigCommon - initialDLBWPcontrolResourceSetZero = 12; + initialDLBWPcontrolResourceSetZero = 11; initialDLBWPsearchSpaceZero = 0; - #pdsch-ConfigCommon - #pdschTimeDomainAllocationList (up to 16 entries) - initialDLBWPk0_0 = 0; #for DL slot - initialDLBWPmappingType_0 = 0; #0=typeA,1=typeB - initialDLBWPstartSymbolAndLength_0 = 40; #this is SS=1,L=13 - - initialDLBWPk0_1 = 0; #for mixed slot - initialDLBWPmappingType_1 = 0; - initialDLBWPstartSymbolAndLength_1 = 57; #this is SS=1,L=5 #uplinkConfigCommon #frequencyInfoUL @@ -141,19 +132,6 @@ gNBs = # 0=unrestricted, 1=restricted type A, 2=restricted type B restrictedSetConfig = 0, - # pusch-ConfigCommon (up to 16 elements) - initialULBWPk2_0 = 6; # used for UL slot - initialULBWPmappingType_0 = 1 - initialULBWPstartSymbolAndLength_0 = 41; # this is SS=0 L=13 - - initialULBWPk2_1 = 6; # used for mixed slot - initialULBWPmappingType_1 = 1; - initialULBWPstartSymbolAndLength_1 = 52; # this is SS=10 L=4 - - initialULBWPk2_2 = 7; # used for Msg.3 during RA - initialULBWPmappingType_2 = 1; - initialULBWPstartSymbolAndLength_2 = 52; # this is SS=10 L=4 - msg3_DeltaPreamble = 1; p0_NominalWithGrant =-90; From ce9229a1d2ea28414ab27b49cc2210038195856d Mon Sep 17 00:00:00 2001 From: hardy Date: Mon, 28 Feb 2022 15:32:11 +0100 Subject: [PATCH 83/96] change log rotation concept for module UE --- ci-scripts/cls_log_mgt.py | 65 ++++++++++++++++----------------------- 1 file changed, 26 insertions(+), 39 deletions(-) diff --git a/ci-scripts/cls_log_mgt.py b/ci-scripts/cls_log_mgt.py index cf7b91d3c0..905a105512 100644 --- a/ci-scripts/cls_log_mgt.py +++ b/ci-scripts/cls_log_mgt.py @@ -30,11 +30,15 @@ - +import logging import re import subprocess -import logging -import math +import sshconnection + +logging.basicConfig( + level=logging.DEBUG, + format="[%(asctime)s] %(name)s:%(levelname)s: %(message)s" +) class Log_Mgt: @@ -49,40 +53,25 @@ class Log_Mgt: #-----------------$ - def __CheckAvailSpace(self): + def __CheckUsedSpace(self): HOST=self.Username+'@'+self.IPAddress COMMAND="df "+ self.path ssh = subprocess.Popen(["ssh", "%s" % HOST, COMMAND],shell=False,stdout=subprocess.PIPE,stderr=subprocess.PIPE) result = ssh.stdout.readlines() s=result[1].decode('utf-8').rstrip()#result[1] is the second line with the results we are looking for - tmp=s.split() - return tmp[3] #return avail space from the line + used=s.split()[4] #get 4th field ex: 70% + m = re.match('^(\d+)\%',used) + if m is not None: + return int(m.group(1)) - def __GetOldestFile(self): - HOST=self.Username+'@'+self.IPAddress - COMMAND="ls -rtl "+ self.path #-rtl will bring oldest file on top - ssh = subprocess.Popen(["ssh", "%s" % HOST, COMMAND],shell=False,stdout=subprocess.PIPE,stderr=subprocess.PIPE) - result = ssh.stdout.readlines() - s=result[1].decode('utf-8').rstrip() - tmp=s.split() - return tmp[8]#return filename from the line + def __RemoveOldest(self): + mySSH = sshconnection.SSHConnection() + mySSH.open(self.IPAddress, self.Username, self.Password) + COMMAND='echo ' + self.Password + ' | sudo -S find ' + self.path + ' -type f -mtime +14 -delete' + mySSH.command(COMMAND,'\$',20) + mySSH.close() - def __AvgSize(self): - HOST=self.Username+'@'+self.IPAddress - COMMAND="ls -rtl "+ self.path - ssh = subprocess.Popen(["ssh", "%s" % HOST, COMMAND],shell=False,stdout=subprocess.PIPE,stderr=subprocess.PIPE) - result = ssh.stdout.readlines() - if len(result)>1: #at least 1 file present - total_size=0 - for i in range(1,len(result)): - s=result[i].decode('utf-8').rstrip() - tmp=s.split() - total_size+=int(tmp[4]) #get filesize - return math.floor(total_size/(len(result)-1)) #compute average file/artifact size - else:#empty,no files - return 0 - #-----------------$ #PUBLIC Methods$ @@ -90,17 +79,15 @@ class Log_Mgt: def LogRotation(self): - avail_space =int(self.__CheckAvailSpace())*1000 #avail space in target folder, initially displayed in Gb - avg_size=self.__AvgSize() #average size of artifacts in the target folder - logging.debug("Avail Space : " + str(avail_space) + " / Artifact Avg Size : " + str(avg_size)) - if avail_space < 50*avg_size: #reserved space is 50x artifact file ; oldest file will be deleted - oldestfile=self.__GetOldestFile() - HOST=self.Username+'@'+self.IPAddress - COMMAND="echo " + self.Password + " | sudo -S rm "+ self.path + "/" + oldestfile - logging.debug(COMMAND) - ssh = subprocess.Popen(["ssh", "%s" % HOST, COMMAND],shell=False,stdout=subprocess.PIPE,stderr=subprocess.PIPE) + used_space = self.__CheckUsedSpace() #avail space in target folder + if used_space > 80 : + logging.debug('\u001B[1;37;41m Used Disk > 80%, on ' + self.Username+'@'+self.IPAddress + '\u001B[0m') + logging.debug('\u001B[1;37;41m Removing Artifacts older than 14 days \u001B[0m') + self.__RemoveOldest() else: - logging.debug("Still some space left for artifacts storage") + logging.debug('Used Disk < 80%, on ' + self.Username+'@'+self.IPAddress +', no cleaning required') + + From aa910f52b6d573a453170d4c4848778c951b4c1f Mon Sep 17 00:00:00 2001 From: Laurent Thomas Date: Sun, 6 Mar 2022 15:52:42 +0100 Subject: [PATCH 84/96] debug after develop merge --- openair1/PHY/INIT/nr_init_ue.c | 8 ++-- openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c | 6 +-- openair2/RRC/NR/rrc_gNB_NGAP.c | 31 +++++++------- openair3/NGAP/ngap_gNB_nas_procedures.c | 55 ++++++++++++------------- 4 files changed, 47 insertions(+), 53 deletions(-) diff --git a/openair1/PHY/INIT/nr_init_ue.c b/openair1/PHY/INIT/nr_init_ue.c index 1e4723538a..8b798dd090 100644 --- a/openair1/PHY/INIT/nr_init_ue.c +++ b/openair1/PHY/INIT/nr_init_ue.c @@ -413,10 +413,6 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB) } } - // PBCH - prach_vars[gNB_id]->prachF = (int16_t *)malloc16_clear( sizeof(int)*(7*2*sizeof(int)*(fp->ofdm_symbol_size*12)) ); - prach_vars[gNB_id]->prach = (int16_t *)malloc16_clear( sizeof(int)*(7*2*sizeof(int)*(fp->ofdm_symbol_size*12)) ); - // 100 PRBs * 12 REs/PRB * 4 PDCCH SYMBOLS * 2 LLRs/RE for (th_id=0; th_idpdcch_vars[th_id][gNB_id]->llr = (int16_t *)malloc16_clear( 2*4*100*12*sizeof(uint16_t) ); @@ -449,6 +445,10 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB) } } + // RACH + prach_vars[gNB_id]->prachF = (int16_t *)malloc16_clear( sizeof(int)*(7*2*sizeof(int)*(fp->ofdm_symbol_size*12)) ); + prach_vars[gNB_id]->prach = (int16_t *)malloc16_clear( sizeof(int)*(7*2*sizeof(int)*(fp->ofdm_symbol_size*12)) ); + } // initialization for the last instance of pdsch_vars (used for MU-MIMO) diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c b/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c index be1555fd54..2705132bc6 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c @@ -504,10 +504,10 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue, nr_pbch_unscrambling(nr_ue_pbch_vars, pbch_e_rx, frame_parms->Nid_cell, nushift, M, NR_POLAR_PBCH_E, 0, 0, pbch_a_prime, &pbch_a_interleaved); //polar decoding de-rate matching - - decoderState = polar_decoder_int16(pbch_e_rx,(uint64_t *)&pbch_a_prime,0, + uint64_t tmp=0; + decoderState = polar_decoder_int16(pbch_e_rx,(uint64_t *)&tmp,0, NR_POLAR_PBCH_MESSAGE_TYPE, NR_POLAR_PBCH_PAYLOAD_BITS, NR_POLAR_PBCH_AGGREGATION_LEVEL); - + pbch_a_prime=tmp; if(decoderState) return(decoderState); diff --git a/openair2/RRC/NR/rrc_gNB_NGAP.c b/openair2/RRC/NR/rrc_gNB_NGAP.c index 08f5a01986..eb0e2019d1 100644 --- a/openair2/RRC/NR/rrc_gNB_NGAP.c +++ b/openair2/RRC/NR/rrc_gNB_NGAP.c @@ -905,30 +905,27 @@ rrc_gNB_send_NGAP_PDUSESSION_SETUP_RESP( for (pdusession = 0; pdusession < ue_context_pP->ue_context.setup_pdu_sessions; pdusession++) { // if (xid == ue_context_pP->ue_context.pdusession[pdusession].xid) { if (ue_context_pP->ue_context.pduSession[pdusession].status == PDU_SESSION_STATUS_DONE) { - NGAP_PDUSESSION_SETUP_RESP(msg_p).pdusessions[pdusession].pdusession_id = ue_context_pP->ue_context.pduSession[pdusession].param.pdusession_id; - // NGAP_PDUSESSION_SETUP_RESP(msg_p).pdusessions[pdusession].pdusession_id = 1; - NGAP_PDUSESSION_SETUP_RESP(msg_p).pdusessions[pdusession].nb_of_qos_flow = ue_context_pP->ue_context.pduSession[pdusession].param.nb_qos; - NGAP_PDUSESSION_SETUP_RESP(msg_p).pdusessions[pdusession].gtp_teid = ue_context_pP->ue_context.gnb_gtp_teid[pdusession]; - NGAP_PDUSESSION_SETUP_RESP(msg_p).pdusessions[pdusession].gNB_addr.pdu_session_type = PDUSessionType_ipv4; - NGAP_PDUSESSION_SETUP_RESP(msg_p).pdusessions[pdusession].gNB_addr.length = ue_context_pP->ue_context.gnb_gtp_addrs[pdusession].length; - memcpy(NGAP_PDUSESSION_SETUP_RESP(msg_p).pdusessions[pdusession].gNB_addr.buffer, - ue_context_pP->ue_context.gnb_gtp_addrs[pdusession].buffer, sizeof(uint8_t)*20); - for (qos_flow_index = 0; qos_flow_index < NGAP_PDUSESSION_SETUP_RESP(msg_p).pdusessions[pdusession].nb_of_qos_flow; qos_flow_index++) { - NGAP_PDUSESSION_SETUP_RESP(msg_p).pdusessions[pdusession].associated_qos_flows[qos_flow_index].qfi = + pdusession_setup_t * tmp=&NGAP_PDUSESSION_SETUP_RESP(msg_p).pdusessions[pdusession]; + tmp->pdusession_id = ue_context_pP->ue_context.pduSession[pdusession].param.pdusession_id; + // tmp->pdusession_id = 1; + tmp->nb_of_qos_flow = ue_context_pP->ue_context.pduSession[pdusession].param.nb_qos; + tmp->gtp_teid = ue_context_pP->ue_context.gnb_gtp_teid[pdusession]; + tmp->gNB_addr.pdu_session_type = PDUSessionType_ipv4; + tmp->gNB_addr.length = ue_context_pP->ue_context.gnb_gtp_addrs[pdusession].length; + memcpy(tmp->gNB_addr.buffer, + ue_context_pP->ue_context.gnb_gtp_addrs[pdusession].buffer, tmp->gNB_addr.length); + for (qos_flow_index = 0; qos_flow_index < tmp->nb_of_qos_flow; qos_flow_index++) { + tmp->associated_qos_flows[qos_flow_index].qfi = ue_context_pP->ue_context.pduSession[pdusession].param.qos[qos_flow_index].qfi; - NGAP_PDUSESSION_SETUP_RESP(msg_p).pdusessions[pdusession].associated_qos_flows[qos_flow_index].qos_flow_mapping_ind = QOSFLOW_MAPPING_INDICATION_DL; + tmp->associated_qos_flows[qos_flow_index].qos_flow_mapping_ind = QOSFLOW_MAPPING_INDICATION_DL; } ue_context_pP->ue_context.pduSession[pdusession].status = PDU_SESSION_STATUS_ESTABLISHED; - LOG_I (NR_RRC,"gnb_gtp_addr (msg index %d, pdu_sessions index %d, status %d, xid %d): nb_of_pdusessions %d, pdusession_id %d, teid: %u, addr: %d.%d.%d.%d \n ", + LOG_I (NR_RRC,"gnb_gtp_addr (msg index %d, pdu_sessions index %d, status %d, xid %d): nb_of_pdusessions %d, pdusession_id %d, teid: %u \n ", pdu_sessions_done, pdusession, ue_context_pP->ue_context.pduSession[pdusession].status, xid, ue_context_pP->ue_context.nb_of_pdusessions, NGAP_PDUSESSION_SETUP_RESP (msg_p).pdusessions[pdu_sessions_done].pdusession_id, - NGAP_PDUSESSION_SETUP_RESP (msg_p).pdusessions[pdu_sessions_done].gtp_teid, - NGAP_PDUSESSION_SETUP_RESP (msg_p).pdusessions[pdu_sessions_done].gNB_addr.buffer[0], - NGAP_PDUSESSION_SETUP_RESP (msg_p).pdusessions[pdu_sessions_done].gNB_addr.buffer[1], - NGAP_PDUSESSION_SETUP_RESP (msg_p).pdusessions[pdu_sessions_done].gNB_addr.buffer[2], - NGAP_PDUSESSION_SETUP_RESP (msg_p).pdusessions[pdu_sessions_done].gNB_addr.buffer[3]); + NGAP_PDUSESSION_SETUP_RESP (msg_p).pdusessions[pdu_sessions_done].gtp_teid); pdu_sessions_done++; } else if ((ue_context_pP->ue_context.pduSession[pdusession].status == PDU_SESSION_STATUS_NEW) || (ue_context_pP->ue_context.pduSession[pdusession].status == PDU_SESSION_STATUS_ESTABLISHED)) { diff --git a/openair3/NGAP/ngap_gNB_nas_procedures.c b/openair3/NGAP/ngap_gNB_nas_procedures.c index a40e8328da..75e3bfe3af 100644 --- a/openair3/NGAP/ngap_gNB_nas_procedures.c +++ b/openair3/NGAP/ngap_gNB_nas_procedures.c @@ -680,24 +680,20 @@ int ngap_gNB_initial_ctxt_resp( pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.present = NGAP_UPTransportLayerInformation_PR_gTPTunnel; - pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel = (NGAP_GTPTunnel_t *)calloc(1, sizeof(NGAP_GTPTunnel_t)); - GTP_TEID_TO_ASN1(initial_ctxt_resp_p->pdusessions[i].gtp_teid, &pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel->gTP_TEID); + pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel = (NGAP_GTPTunnel_t *)calloc(1, sizeof(NGAP_GTPTunnel_t)); + struct NGAP_GTPTunnel *tmp=pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel; + GTP_TEID_TO_ASN1(initial_ctxt_resp_p->pdusessions[i].gtp_teid, &tmp->gTP_TEID); - pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel->transportLayerAddress.buf = malloc(initial_ctxt_resp_p->pdusessions[i].gNB_addr.length); + tmp->transportLayerAddress.buf = malloc(initial_ctxt_resp_p->pdusessions[i].gNB_addr.length); - memcpy(pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel->transportLayerAddress.buf, + memcpy(tmp->transportLayerAddress.buf, initial_ctxt_resp_p->pdusessions[i].gNB_addr.buffer, initial_ctxt_resp_p->pdusessions[i].gNB_addr.length); - pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel->transportLayerAddress.size = initial_ctxt_resp_p->pdusessions[i].gNB_addr.length; - pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel->transportLayerAddress.bits_unused = 0; + tmp->transportLayerAddress.size = initial_ctxt_resp_p->pdusessions[i].gNB_addr.length; + tmp->transportLayerAddress.bits_unused = 0; - NGAP_DEBUG("initial_ctxt_resp_p: pdusession ID %ld, gnb_addr %d.%d.%d.%d, SIZE %ld \n", - item->pDUSessionID, - pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel->transportLayerAddress.buf[0], - pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel->transportLayerAddress.buf[1], - pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel->transportLayerAddress.buf[2], - pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel->transportLayerAddress.buf[3], - pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel->transportLayerAddress.size); + NGAP_DEBUG("initial_ctxt_resp_p: pdusession ID %ld\n", + item->pDUSessionID); /* associatedQosFlowList. number of 1? */ for(int j=0; j < initial_ctxt_resp_p->pdusessions[i].nb_of_qos_flow; j++) { @@ -987,24 +983,25 @@ int ngap_gNB_pdusession_setup_resp(instance_t instance, pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.present = NGAP_UPTransportLayerInformation_PR_gTPTunnel; pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel = calloc(1, sizeof(struct NGAP_GTPTunnel)); + struct NGAP_GTPTunnel *tmp=pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel; + GTP_TEID_TO_ASN1(pdusession_setup_resp_p->pdusessions[i].gtp_teid, &tmp->gTP_TEID); + if (pdusession_setup_resp_p->pdusessions[i].gNB_addr.length) { + tmp->transportLayerAddress.buf = malloc(pdusession_setup_resp_p->pdusessions[i].gNB_addr.length); - GTP_TEID_TO_ASN1(pdusession_setup_resp_p->pdusessions[i].gtp_teid, &pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel->gTP_TEID); + memcpy(tmp->transportLayerAddress.buf, + pdusession_setup_resp_p->pdusessions[i].gNB_addr.buffer, + pdusession_setup_resp_p->pdusessions[i].gNB_addr.length); + tmp->transportLayerAddress.size = pdusession_setup_resp_p->pdusessions[i].gNB_addr.length; + tmp->transportLayerAddress.bits_unused = 0; - pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel->transportLayerAddress.buf = malloc(pdusession_setup_resp_p->pdusessions[i].gNB_addr.length); - - memcpy(pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel->transportLayerAddress.buf, - pdusession_setup_resp_p->pdusessions[i].gNB_addr.buffer, - pdusession_setup_resp_p->pdusessions[i].gNB_addr.length); - pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel->transportLayerAddress.size = pdusession_setup_resp_p->pdusessions[i].gNB_addr.length; - pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel->transportLayerAddress.bits_unused = 0; - - NGAP_DEBUG("pdusession_setup_resp_p: pdusession ID %ld, gnb_addr %d.%d.%d.%d, SIZE %ld \n", - item->pDUSessionID, - pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel->transportLayerAddress.buf[0], - pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel->transportLayerAddress.buf[1], - pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel->transportLayerAddress.buf[2], - pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel->transportLayerAddress.buf[3], - pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel->transportLayerAddress.size); + NGAP_DEBUG("pdusession_setup_resp_p: pdusession ID %ld, gnb_addr %d.%d.%d.%d, SIZE %ld \n", + item->pDUSessionID, + tmp->transportLayerAddress.buf[0], + tmp->transportLayerAddress.buf[1], + tmp->transportLayerAddress.buf[2], + tmp->transportLayerAddress.buf[3], + tmp->transportLayerAddress.size); + } /* associatedQosFlowList. number of 1? */ for(int j=0; j < pdusession_setup_resp_p->pdusessions[i].nb_of_qos_flow; j++) { From 473328a0576f1665858799f2356290e15d4c139f Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Mon, 7 Mar 2022 18:00:57 +0100 Subject: [PATCH 85/96] Add support for USRP X400 --- targets/ARCH/COMMON/common_lib.h | 2 + targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp | 53 ++++++++++++++------ 2 files changed, 40 insertions(+), 15 deletions(-) diff --git a/targets/ARCH/COMMON/common_lib.h b/targets/ARCH/COMMON/common_lib.h index 0c71a9999a..7228fe24eb 100644 --- a/targets/ARCH/COMMON/common_lib.h +++ b/targets/ARCH/COMMON/common_lib.h @@ -92,6 +92,8 @@ typedef enum { USRP_X300_DEV, /*!\brief device is USRP N300/N310*/ USRP_N300_DEV, + /*!\brief device is USRP X400/X410*/ + USRP_X400_DEV, /*!\brief device is BLADE RF*/ BLADERF_DEV, /*!\brief device is LMSSDR (SoDeRa)*/ diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp index e3b06a6438..76517a34a1 100644 --- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp +++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp @@ -273,18 +273,20 @@ static int sync_to_gps(openair0_device *device) { static int trx_usrp_start(openair0_device *device) { usrp_state_t *s = (usrp_state_t *)device->priv; - // setup GPIO for TDD, GPIO(4) = ATR_RX - //set data direction register (DDR) to output - s->usrp->set_gpio_attr("FP0", "DDR", 0xfff, 0xfff); - //set lower 7 bits to be controlled automatically by ATR (the rest 5 bits are controlled manually) - s->usrp->set_gpio_attr("FP0", "CTRL", 0x7f,0xfff); - //set pins 4 (RX_TX_Switch) and 6 (Shutdown PA) to 1 when the radio is only receiving (ATR_RX) - s->usrp->set_gpio_attr("FP0", "ATR_RX", (1<<4)|(1<<6), 0x7f); - // set pin 5 (Shutdown LNA) to 1 when the radio is transmitting and receiveing (ATR_XX) - // (we use full duplex here, because our RX is on all the time - this might need to change later) - s->usrp->set_gpio_attr("FP0", "ATR_XX", (1<<5), 0x7f); - // set the output pins to 1 - s->usrp->set_gpio_attr("FP0", "OUT", 7<<7, 0xf80); + if (device->type != USRP_X400_DEV) { + // setup GPIO for TDD, GPIO(4) = ATR_RX + //set data direction register (DDR) to output + s->usrp->set_gpio_attr("FP0", "DDR", 0xfff, 0xfff); + //set lower 7 bits to be controlled automatically by ATR (the rest 5 bits are controlled manually) + s->usrp->set_gpio_attr("FP0", "CTRL", 0x7f,0xfff); + //set pins 4 (RX_TX_Switch) and 6 (Shutdown PA) to 1 when the radio is only receiving (ATR_RX) + s->usrp->set_gpio_attr("FP0", "ATR_RX", (1<<4)|(1<<6), 0x7f); + // set pin 5 (Shutdown LNA) to 1 when the radio is transmitting and receiveing (ATR_XX) + // (we use full duplex here, because our RX is on all the time - this might need to change later) + s->usrp->set_gpio_attr("FP0", "ATR_XX", (1<<5), 0x7f); + // set the output pins to 1 + s->usrp->set_gpio_attr("FP0", "OUT", 7<<7, 0xf80); + } s->wait_for_first_pps = 1; s->rx_count = 0; @@ -847,7 +849,7 @@ rx_gain_calib_table_t calib_table_x310[] = { {-1,0} }; -/*! \brief USRPB210 RX calibration table */ +/*! \brief USRPn3xf RX calibration table */ rx_gain_calib_table_t calib_table_n310[] = { {3500000000.0,0.0}, {2660000000.0,0.0}, @@ -857,6 +859,16 @@ rx_gain_calib_table_t calib_table_n310[] = { {-1,0} }; +/*! \brief Empty RX calibration table */ +rx_gain_calib_table_t calib_table_none[] = { + {3500000000.0,0.0}, + {2660000000.0,0.0}, + {2300000000.0,0.0}, + {1880000000.0,0.0}, + {816000000.0, 0.0}, + {-1,0} +}; + /*! \brief Set RX gain offset * \param openair0_cfg RF frontend parameters set by application @@ -1011,7 +1023,6 @@ extern "C" { device->type=USRP_N300_DEV; usrp_master_clock = 122.88e6; args += boost::str(boost::format(",master_clock_rate=%f") % usrp_master_clock); - //args += ", send_buff_size=33554432"; } if (device_adds[0].get("type") == "x300") { @@ -1025,6 +1036,13 @@ extern "C" { LOG_W(HW,"Can't set kernel parameters for X3xx\n"); } + if (device_adds[0].get("type") == "x4xx") { + printf("Found USRP x400\n"); + device->type = USRP_X400_DEV; + usrp_master_clock = 245.76e6; + args += boost::str(boost::format(",master_clock_rate=%f") % usrp_master_clock); + } + s->usrp = uhd::usrp::multi_usrp::make(args); if (args.find("clock_source")==std::string::npos) { @@ -1103,8 +1121,13 @@ extern "C" { std::cerr << "-- Using calibration table: calib_table_n310" << std::endl; } + if (device->type == USRP_X400_DEV) { + openair0_cfg[0].rx_gain_calib_table = calib_table_none; + std::cerr << "-- Using calibration table: calib_table_none" << std::endl; + } - if (device->type==USRP_N300_DEV || device->type==USRP_X300_DEV) { + + if (device->type==USRP_N300_DEV || device->type==USRP_X300_DEV || device->type==USRP_X400_DEV) { LOG_I(HW,"%s() sample_rate:%u\n", __FUNCTION__, (int)openair0_cfg[0].sample_rate); switch ((int)openair0_cfg[0].sample_rate) { From 4d9ee5d11c8cb5417aa8709ce8ebcc2ab2661138 Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Wed, 2 Mar 2022 11:56:31 +0100 Subject: [PATCH 86/96] Add X400 to devtype_names, make char* array --- targets/ARCH/COMMON/common_lib.c | 23 +++++++++++++++++++---- targets/ARCH/COMMON/common_lib.h | 6 ++++-- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/targets/ARCH/COMMON/common_lib.c b/targets/ARCH/COMMON/common_lib.c index c4f4e3ead5..08daf58cf7 100644 --- a/targets/ARCH/COMMON/common_lib.c +++ b/targets/ARCH/COMMON/common_lib.c @@ -43,16 +43,31 @@ //#include "targets/RT/USER/lte-softmodem.h" #include "executables/softmodem-common.h" -char *get_devname(int devtype) { -char *devnames[MAX_RF_DEV_TYPE]=DEVTYPE_NAMES; +const char* devtype_names[MAX_RF_DEV_TYPE] = { + "", + "EXMIMO", + "USRP B200", + "USRP X300", + "USRP N300", + "USRP X400", + "BLADERF", + "LMSSDR", + "IRIS", + "No HW", + "ADRV9371_ZC706", + "UEDv2", + "RFSIMULATOR" +}; + +const char *get_devname(int devtype) { if (devtype < MAX_RF_DEV_TYPE && devtype !=MIN_RF_DEV_TYPE ) - return devnames[devtype]; + return devtype_names[devtype]; return "none"; } int set_device(openair0_device *device) { - char *devname = get_devname(device->type); + const char *devname = get_devname(device->type); if (strcmp(devname,"none") != 0) { LOG_I(HW,"[%s] has loaded %s device.\n",((device->host_type == RAU_HOST) ? "RAU": "RRU"),devname); } else { diff --git a/targets/ARCH/COMMON/common_lib.h b/targets/ARCH/COMMON/common_lib.h index 7228fe24eb..38a7b0fa67 100644 --- a/targets/ARCH/COMMON/common_lib.h +++ b/targets/ARCH/COMMON/common_lib.h @@ -109,7 +109,9 @@ typedef enum { RFSIMULATOR, MAX_RF_DEV_TYPE } dev_type_t; -#define DEVTYPE_NAMES {"","EXMIMO","USRP B200","USRP X300","USRP N300","BLADERF","LMSSDR","IRIS","No HW","ADRV9371_ZC706","UEDv2", "RFSIMULATOR"} +/* list of names of devices, needs to match dev_type_t */ +extern const char* devtype_names[MAX_RF_DEV_TYPE]; + /*!\brief transport protocol types */ typedef enum { @@ -537,7 +539,7 @@ extern "C" /*! \brief get device name from device type */ -char *get_devname(int devtype); +const char *get_devname(int devtype); /*! \brief Initialize openair RF target. It returns 0 if OK */ int openair0_device_load(openair0_device *device, openair0_config_t *openair0_cfg); /*! \brief Initialize transport protocol . It returns 0 if OK */ From d03a8b387fa7a730773e1f7e4b0f64b2c865ee21 Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Thu, 3 Mar 2022 17:29:26 +0100 Subject: [PATCH 87/96] Set kernel parameters when loading N300 --- targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp index 76517a34a1..4259304643 100644 --- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp +++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp @@ -1023,6 +1023,9 @@ extern "C" { device->type=USRP_N300_DEV; usrp_master_clock = 122.88e6; args += boost::str(boost::format(",master_clock_rate=%f") % usrp_master_clock); + + if ( 0 != system("sysctl -w net.core.rmem_max=62500000 net.core.wmem_max=62500000") ) + LOG_W(HW,"Can't set kernel parameters for N3x0\n"); } if (device_adds[0].get("type") == "x300") { From d8209228e74a5e91b67c1e883c0795ff2821377b Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Mon, 7 Mar 2022 23:24:25 +0100 Subject: [PATCH 88/96] Hide warning of unused variable From the comment above the line with the warning: > This asn1cCalloc leaks memory but also masks a bug. > If we delete this asn1cCalloc statement, eNB will crash in NSA mode. > Please don't delete the following line unless the bug has been found --- openair2/RRC/LTE/MESSAGES/asn1_msg.c | 1 + 1 file changed, 1 insertion(+) diff --git a/openair2/RRC/LTE/MESSAGES/asn1_msg.c b/openair2/RRC/LTE/MESSAGES/asn1_msg.c index c3e41978e5..bd09540627 100644 --- a/openair2/RRC/LTE/MESSAGES/asn1_msg.c +++ b/openair2/RRC/LTE/MESSAGES/asn1_msg.c @@ -4297,6 +4297,7 @@ ssize_t do_nrMeasurementReport(uint8_t *buffer, If we delete this asn1cCalloc statement, eNB will crash in NSA mode. Please don't delete the following line unless the bug has been found. */ asn1cCalloc(measresulteutra_list->cgi_Info, measresult_cgi2); + (void) measresult_cgi2; struct LTE_MeasResultEUTRA__measResult* measResult= &measresulteutra_list->measResult; asn1cCallocOne(measResult->rsrpResult, rsrp_tar); asn1cCallocOne(measResult->rsrqResult, rsrq_tar); From 05a63b60e5ce7b26e929af7d11b89c4d5dfe0c16 Mon Sep 17 00:00:00 2001 From: Raphael Defosseux Date: Tue, 8 Mar 2022 10:58:31 +0100 Subject: [PATCH 89/96] fix(doc): README does not have anymore the license info * Also added obsolence messages for the old L2 simulator since 2022.w01 EpiSci merge * Added link to their new tutorial Signed-off-by: Raphael Defosseux --- README.md | 28 +++++++--------------------- doc/L2NFAPI.md | 15 +++++++++++++++ doc/L2NFAPI_NOS1.md | 4 ++++ doc/L2NFAPI_S1.md | 4 ++++ doc/RUNMODEM.md | 2 +- 5 files changed, 31 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index 4f38f77e4e..2077b3d20b 100644 --- a/README.md +++ b/README.md @@ -21,28 +21,14 @@ # OpenAirInterface License # -### Included Fixes: ### -- Ease of use of gprof and address sanitizer for debugging purposes -- Updated json files to allow for GDB, real-time debugging capabilities -- Updated logging features to minimally log only key connection milestones. This imroves scalability of multiple UEs. -- Updated logging to include time stamp for timing analysis -- Updated memory allocation procedures to correct size requirements -- Added debugging features to handle signal terminations -- nfapi.c pullarray8 fix invalid pointer math -- Overlapping destination and source memory in memcpy, so updated to memmove to check for this bug -- Advanced error checking mechanisms in critical pack and unpack functions -- Created option for CPU assignment to UE to improve scalability -- Added EPC integration to allow multiple individual UE entities to each have their USIM information parced by the executables -- Updated random value seeds to minimize probability of error in generation of random values -- Enables capability round robin scheduler if desired -- Enables capability real time scheduler if desired -- Added new standalone functions to the UE phy-layer (phy_stub_ue.c) to incorporate individual UE entities -- Updated sending and packing functions in UE (lte_ue.c) to incorporate new standalone changes -- Incorporated semaphores to control timing of incoming downlink packets -- Implemented new queuing system to handle message exchange from UE to eNB and vice versa -- Updated global value in nFAPI for size of subframe -- Updated global value to increase scalability in system + * [OAI License Model](http://www.openairinterface.org/?page_id=101) + * [OAI License v1.1 on our website](http://www.openairinterface.org/?page_id=698) +It is distributed under **OAI Public License V1.1**. + +The license information is distributed under [LICENSE](LICENSE) file in the same directory. + +Please see [NOTICE](NOTICE.md) file for third party software that is included in the sources. # Where to Start # diff --git a/doc/L2NFAPI.md b/doc/L2NFAPI.md index 137e4847e4..5b8c0f546c 100644 --- a/doc/L2NFAPI.md +++ b/doc/L2NFAPI.md @@ -18,6 +18,10 @@ The UE executable is able to "simulate" multiple UEs in order to stimulate the s **This simulator is available starting the `v1.0.0` release on the `master` branch.** +**2022/03/08: CAUTION, THIS TUTORIAL IS NO LONGER VALID on the `develop` branch after the `2022.w01` tag.** + +**2022/03/08: CAUTION, THE LAST VALID TAG on `develop` branch is `2021.w51_c`.** + Currently the Continuous Integration process is validating this simulator the following way: * the LTE modem executable is run on one host (in our CI deployment it is a **Xenial Virtual Machine**) @@ -31,6 +35,17 @@ Normally it should be fine to run both executables on the same host using the `l 1. [With S1 -- eNB and UE on 2 hosts](L2NFAPI_S1.md) 2. [No S1 -- eNB and UE on 2 hosts](L2NFAPI_NOS1.md) + +**2022/03/08: Starting the `2022.w01` tag on the `develop` branch, the L2 nFAPI simulation is using a proxy.** + +A tutorial is available on the [EpiSci GitHub Repository](https://github.com/EpiSci/oai-lte-5g-multi-ue-proxy#readme). + +This proxy allows to perform L2 nFAPI simulator for: + +* LTE +* 5G-NSA +* 5G-SA + ---- [oai wiki home](https://gitlab.eurecom.fr/oai/openairinterface5g/wikis/home) diff --git a/doc/L2NFAPI_NOS1.md b/doc/L2NFAPI_NOS1.md index bb4c32ec08..4f56be3416 100644 --- a/doc/L2NFAPI_NOS1.md +++ b/doc/L2NFAPI_NOS1.md @@ -12,6 +12,10 @@ +**2022/03/08: CAUTION, THIS TUTORIAL IS NO LONGER VALID on the `develop` branch after the `2022.w01` tag.** + +**2022/03/08: CAUTION, THE LAST VALID TAG on `develop` branch is `2021.w51_c`.** + ## Table of Contents ## 1. [Environment](#1-environment) diff --git a/doc/L2NFAPI_S1.md b/doc/L2NFAPI_S1.md index 9fd6d51818..824e9e469a 100644 --- a/doc/L2NFAPI_S1.md +++ b/doc/L2NFAPI_S1.md @@ -12,6 +12,10 @@ +**2022/03/08: CAUTION, THIS TUTORIAL IS NO LONGER VALID on the `develop` branch after the `2022.w01` tag.** + +**2022/03/08: CAUTION, THE LAST VALID TAG on `develop` branch is `2021.w51_c`.** + ## Table of Contents ## 1. [Environment](#1-environment) diff --git a/doc/RUNMODEM.md b/doc/RUNMODEM.md index 449859b042..7ee3ae9d7e 100644 --- a/doc/RUNMODEM.md +++ b/doc/RUNMODEM.md @@ -33,7 +33,7 @@ It is planned to enhance this simulator with the following functionalities: This simulator connects a eNodeB and UEs through a nfapi interface, short-cutting the L1 layer. The objective of this simulator is to allow multi UEs simulation, with a large number of UEs (ideally up to 255 ) .Here to ease the platform setup, UEs are simulated via a single `lte-uesoftmodem` instance. Today the CI tests just with one UE and architecture has to be reviewed to allow a number of UE above about 16. This work is on-going. -As for the rf simulator, no specific hardware is required. The [L2 nfapi simlator page](L2NFAPI.md) contains the detailed documentation. +As for the rf simulator, no specific hardware is required. The [L2 nfapi simulator page](L2NFAPI.md) contains the detailed documentation. # L1 Simulator From afb4cab5e1eb936218f58fb347a4a7b95e4feb29 Mon Sep 17 00:00:00 2001 From: francescomani Date: Tue, 8 Mar 2022 14:29:07 +0100 Subject: [PATCH 90/96] fix dl retransmissions --- cmake_targets/autotests/test_case_list.xml | 8 ++++---- .../PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c | 18 +++++++++++------- openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h | 2 ++ openair1/SIMULATION/NR_PHY/dlsim.c | 5 +++-- 4 files changed, 20 insertions(+), 13 deletions(-) diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml index 7497fb419c..ce1b9dcdf4 100755 --- a/cmake_targets/autotests/test_case_list.xml +++ b/cmake_targets/autotests/test_case_list.xml @@ -1093,10 +1093,10 @@ (Test8: 217 PRB 100 PDSCH-PRBs 110 PDSCH-Offset), (Test9: 106 PRBs 50 PDSCH-PRBs MCS Index 27), (Test10: 106 PRBs 50 PDSCH-PRBs MCS Index 16), - (Test11: 106 MCS-TABLE 256 QAM MCS Index 26), - (Test12: HARQ test 25% TP (4 rounds), - (Test13: HARQ test 33% TP (3 rounds), - (Test14: HARQ test 50% TP (2 rounds), + (Test11: 106 MCS-TABLE 256 QAM MCS Index 27), + (Test12: HARQ test 25% TP 4 rounds), + (Test13: HARQ test 33% TP 3 rounds), + (Test14: HARQ test 50% TP 2 rounds), (Test15: 3 PTRS, 8 Interpolated Symbols), (Test16: 6 PTRS, 5 Interpolated Symbols), (Test17: 11 PTRS, 0 Interpolated Symbols), diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c index 0e2abf40aa..54b7c34608 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c @@ -102,9 +102,12 @@ void free_nr_ue_dlsch(NR_UE_DLSCH_t **dlschptr, uint16_t N_RB_DL) { for (int r=0; rharq_processes[i]->c[r],1056); dlsch->harq_processes[i]->c[r] = NULL; + free16(dlsch->harq_processes[i]->d[r],5*8448); + dlsch->harq_processes[i]->d[r] = NULL; nrLDPC_free_mem(dlsch->harq_processes[i]->p_nrLDPC_procBuf[r]); } free16(dlsch->harq_processes[i]->c,a_segments); + free16(dlsch->harq_processes[i]->d,a_segments); free16(dlsch->harq_processes[i]->p_nrLDPC_procBuf,a_segments); free16(dlsch->harq_processes[i],sizeof(NR_DL_UE_HARQ_t)); @@ -157,13 +160,16 @@ NR_UE_DLSCH_t *new_nr_ue_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint32_t Nsoft,uint exit_flag=3; dlsch->harq_processes[i]->c = (uint8_t **)malloc16(a_segments*sizeof(uint8_t *)); + dlsch->harq_processes[i]->d = (int16_t **)malloc16(a_segments*sizeof(int16_t *)); dlsch->harq_processes[i]->p_nrLDPC_procBuf = (t_nrLDPC_procBuf **)malloc16(a_segments*sizeof(t_nrLDPC_procBuf *)); for (int r=0; rharq_processes[i]->p_nrLDPC_procBuf[r] = nrLDPC_init_mem(); dlsch->harq_processes[i]->c[r] = (uint8_t *)malloc16(1056); - + dlsch->harq_processes[i]->d[r] = (int16_t *)malloc16(5*8448*sizeof(int16_t)); if (dlsch->harq_processes[i]->c[r]) memset(dlsch->harq_processes[i]->c[r],0,1056); + if (dlsch->harq_processes[i]->d[r]) + memset(dlsch->harq_processes[i]->d[r],0,5*8448); else exit_flag=2; } @@ -323,13 +329,11 @@ void nr_processDLSegment(void* arg) { harq_process->round); */ //VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_RATE_MATCHING, VCD_FUNCTION_IN); - int16_t d[5*8448]; - memset(d,0,(5*8448)*sizeof(short)); if (nr_rate_matching_ldpc_rx(Ilbrm, Tbslbrm, p_decoderParms->BG, p_decoderParms->Z, - d, + harq_process->d[r], w, harq_process->C, harq_process->rvidx, @@ -351,7 +355,7 @@ void nr_processDLSegment(void* arg) { LOG_D(PHY,"decoder input(segment %u) :",r); for (int i=0; id[r][i]); LOG_D(PHY,"\n"); } @@ -377,9 +381,9 @@ void nr_processDLSegment(void* arg) { //set Filler bits memset((&z[0]+K_bits_F),127,harq_process->F*sizeof(int16_t)); //Move coded bits before filler bits - memcpy((&z[0]+2*harq_process->Z),d,(K_bits_F-2*harq_process->Z)*sizeof(int16_t)); + memcpy((&z[0]+2*harq_process->Z),harq_process->d[r],(K_bits_F-2*harq_process->Z)*sizeof(int16_t)); //skip filler bits - memcpy((&z[0]+Kr),d+(Kr-2*harq_process->Z),(kc*harq_process->Z-Kr)*sizeof(int16_t)); + memcpy((&z[0]+Kr),harq_process->d[r]+(Kr-2*harq_process->Z),(kc*harq_process->Z-Kr)*sizeof(int16_t)); //Saturate coded bits before decoding into 8 bits values for (i=0, j=0; j < ((kc*harq_process->Z)>>4)+1; i+=2, j++) { diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h index a5ff4a18ff..f76119250f 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h @@ -180,6 +180,8 @@ typedef struct { uint8_t *b; /// Pointers to transport block segments uint8_t **c; + /// soft bits for each received segment ("d"-sequence)(for definition see 36-212 V8.6 2009-03, p.15) + int16_t **d; /// Index of current HARQ round for this DLSCH uint8_t round; /// MCS table for this DLSCH diff --git a/openair1/SIMULATION/NR_PHY/dlsim.c b/openair1/SIMULATION/NR_PHY/dlsim.c index cdc1106b0c..c3ff79ab07 100644 --- a/openair1/SIMULATION/NR_PHY/dlsim.c +++ b/openair1/SIMULATION/NR_PHY/dlsim.c @@ -656,7 +656,7 @@ int main(int argc, char **argv) printf("%s -h(elp) -p(extended_prefix) -N cell_id -f output_filename -F input_filename -g channel_model -n n_frames -t Delayspread -s snr0 -S snr1 -x transmission_mode -y TXant -z RXant -i Intefrence0 -j Interference1 -A interpolation_file -C(alibration offset dB) -N CellId\n", argv[0]); printf("-h This message\n"); - printf("-L \n"); + printf("-L \n"); //printf("-p Use extended prefix mode\n"); //printf("-d Use TDD\n"); printf("-n Number of frames to simulate\n"); @@ -1324,7 +1324,8 @@ int main(int argc, char **argv) printf("*****************************************\n"); printf("\n"); dump_pdsch_stats(stdout,gNB); - printf("SNR %f : n_errors (negative CRC) = %d/%d, Avg round %.2f, Channel BER %e, BLER %.2f, Eff Rate %.4f bits/slot, Eff Throughput %.2f, TBS %u bits/slot\n", SNR, n_errors, n_trials,roundStats[snrRun],berStats[snrRun],blerStats[snrRun],effRate,effRate/TBS*100,TBS); + printf("SNR %f : n_errors (negative CRC) = %d/%d, Avg round %.2f, Channel BER %e, BLER %.2f, Eff Rate %.4f bits/slot, Eff Throughput %.2f, TBS %u bits/slot\n", + SNR, n_errors, n_trials,roundStats[snrRun],berStats[snrRun],blerStats[snrRun],effRate,effRate/TBS*100,TBS); printf("\n"); if (print_perf==1) { From 73bd9034aa49b8b2846e31c4c65eac278060cd68 Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Wed, 9 Mar 2022 14:39:38 +0100 Subject: [PATCH 91/96] Use strtok_r() to split strings in gnb_config.c --- openair2/GNB_APP/gnb_config.c | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/openair2/GNB_APP/gnb_config.c b/openair2/GNB_APP/gnb_config.c index 2aaf15ae82..f5ff7ddf9e 100644 --- a/openair2/GNB_APP/gnb_config.c +++ b/openair2/GNB_APP/gnb_config.c @@ -624,15 +624,18 @@ void RCconfig_NR_L1(void) { config_getlist( &GNBParamList,GNBParams,sizeof(GNBParams)/sizeof(paramdef_t),NULL); char *ulprbbl = *GNBParamList.paramarray[0][GNB_ULPRBBLACKLIST_IDX].strptr; if (ulprbbl) LOG_I(NR_PHY,"PRB blacklist %s\n",ulprbbl); - char *pt = strtok(ulprbbl,","); + char *save = NULL; + char *pt = strtok_r(ulprbbl, ",", &save); int prbbl[275]; int num_prbbl=0; memset(prbbl,0,275*sizeof(int)); while (pt) { - prbbl[atoi(pt)] = 1; + const int rb = atoi(pt); + AssertFatal(rb < 275, "RB %d out of bounds (max 275)\n", rb); + prbbl[rb] = 0x3FFF; // all symbols taken LOG_I(NR_PHY,"Blacklisting prb %d\n",atoi(pt)); - pt = strtok(NULL,","); + pt = strtok_r(NULL, ",", &save); num_prbbl++; } @@ -736,15 +739,16 @@ void RCconfig_nr_macrlc() { config_getlist( &GNBParamList,GNBParams,sizeof(GNBParams)/sizeof(paramdef_t),NULL); char *ulprbbl = *GNBParamList.paramarray[0][GNB_ULPRBBLACKLIST_IDX].strptr; - char *pt = strtok(ulprbbl,","); + char *save = NULL; + char *pt = strtok_r(ulprbbl, ",", &save); uint16_t prbbl[275]; int num_prbbl=0; - int prb; memset(prbbl,0,sizeof(prbbl)); while (pt) { - prb=atoi(pt); + const int prb = atoi(pt); + AssertFatal(prb < 275, "RB %d out of bounds (max 275)\n", prb); prbbl[prb] = 0x3FFF; // all symbols taken - pt = strtok(NULL,","); + pt = strtok_r(NULL, ",", &save); num_prbbl++; } @@ -1458,7 +1462,8 @@ int RCconfig_NR_NG(MessageDef *msg_p, uint32_t i) { // NGAP_REGISTER_GNB_REQ (msg_p).enb_interface_name_for_NGU = strdup(enb_interface_name_for_NGU); cidr = *(NETParams[GNB_IPV4_ADDRESS_FOR_NG_AMF_IDX].strptr); - address = strtok(cidr, "/"); + char *save = NULL; + address = strtok_r(cidr, "/", &save); NGAP_REGISTER_GNB_REQ (msg_p).gnb_ip_address.ipv6 = 0; NGAP_REGISTER_GNB_REQ (msg_p).gnb_ip_address.ipv4 = 1; @@ -1730,7 +1735,8 @@ int RCconfig_NR_X2(MessageDef *msg_p, uint32_t i) { } cidr = *(NETParams[ENB_IPV4_ADDR_FOR_X2C_IDX].strptr); - address = strtok(cidr, "/"); + char *save = NULL; + address = strtok_r(cidr, "/", &save); X2AP_REGISTER_ENB_REQ (msg_p).enb_x2_ip_address.ipv6 = 0; X2AP_REGISTER_ENB_REQ (msg_p).enb_x2_ip_address.ipv4 = 1; strcpy(X2AP_REGISTER_ENB_REQ (msg_p).enb_x2_ip_address.ipv4_address, address); From e7508533b651de5cdb21aa62f1950442b49e0f68 Mon Sep 17 00:00:00 2001 From: francescomani Date: Wed, 9 Mar 2022 14:57:26 +0100 Subject: [PATCH 92/96] review fix --- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c index 7d32eb1007..b4b44c26f0 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c @@ -1551,7 +1551,6 @@ bool test_acknack_vrb_occupation(NR_UE_sched_ctrl_t *sched_ctrl, } // verifying occupation of PRBs for ACK/NACK on dedicated pucch - bool ret = true; for (int l=0; lnr_of_symb; l++) { uint16_t symb = SL_to_bitmap(pucch->start_symb+l, 1); int prb; @@ -1560,11 +1559,11 @@ bool test_acknack_vrb_occupation(NR_UE_sched_ctrl_t *sched_ctrl, else prb = pucch->prb_start; if ((vrb_map_UL[bwp_start+prb] & symb) != 0) { - ret = false; + return false; break; } } - return ret; + return true; } From 48cd851cab084f11a68c407bca63ce656cfb0641 Mon Sep 17 00:00:00 2001 From: francescomani Date: Thu, 10 Mar 2022 18:31:46 +0100 Subject: [PATCH 93/96] SA SR bugfix --- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c index cfff41a6ad..3b0d49bc7a 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c @@ -79,7 +79,9 @@ void nr_fill_nfapi_pucch(module_id_t mod_id, NR_BWP_UplinkDedicated_t *ubwpd; ubwpd = cg ? cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP:NULL; - LOG_D(NR_MAC,"pucch_acknak: %d.%d Calling nr_configure_pucch (ubwpd %p,r_pucch %d) pucch in %d.%d\n",frame,slot,ubwpd,pucch->r_pucch,pucch->frame,pucch->ul_slot); + LOG_D(NR_MAC,"%d.%d Calling nr_configure_pucch (ubwpd %p,r_pucch %d) pucch to be scheduled in %d.%d\n", + frame,slot,ubwpd,pucch->r_pucch,pucch->frame,pucch->ul_slot); + nr_configure_pucch(pucch_pdu, scc, UE_info->CellGroup[UE_id], @@ -1885,6 +1887,7 @@ void nr_sr_reporting(int Mod_idP, frame_t SFN, sub_frame_t slot) sched_sr.frame = SFN; sched_sr.ul_slot = slot; sched_sr.resource_indicator = found; + sched_sr.r_pucch = -1; sched_sr.sr_flag = true; nr_fill_nfapi_pucch(Mod_idP, SFN, slot, &sched_sr, UE_id); } From 595dd27ab02506d341eaa7929117a2ebac770b62 Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Fri, 11 Mar 2022 09:43:35 +0100 Subject: [PATCH 94/96] Configure only one address for asterix's N310 Deletes the second_addr parameter in all files that also use the mgmt_addr=192.168.18.240 (asterix's N310). --- ci-scripts/conf_files/gNB_SA_n78_106PRB.2x2_usrpn310.conf | 2 +- ci-scripts/conf_files/gNB_SA_n78_133PRB.2x2_usrpn310.conf | 2 +- ci-scripts/conf_files/gnb.band78.nsa_2x2.106PRB.usrpn310.conf | 2 +- .../conf_files/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.conf | 2 +- ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.usrpn310.conf | 2 +- .../conf_files/gnb.band78.sa.fr1.162PRB.2x2.usrpn310.conf | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/ci-scripts/conf_files/gNB_SA_n78_106PRB.2x2_usrpn310.conf b/ci-scripts/conf_files/gNB_SA_n78_106PRB.2x2_usrpn310.conf index 082cc826f3..7e6590cde2 100644 --- a/ci-scripts/conf_files/gNB_SA_n78_106PRB.2x2_usrpn310.conf +++ b/ci-scripts/conf_files/gNB_SA_n78_106PRB.2x2_usrpn310.conf @@ -258,7 +258,7 @@ RUs = ( ## beamforming 4x4 matrix: #bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000, 0x00000000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff]; - sdr_addrs = "mgmt_addr=192.168.18.240,addr=192.168.10.2,second_addr=192.168.20.2,clock_source=internal,time_source=internal" + sdr_addrs = "mgmt_addr=192.168.18.240,addr=192.168.10.2,clock_source=internal,time_source=internal" } ); diff --git a/ci-scripts/conf_files/gNB_SA_n78_133PRB.2x2_usrpn310.conf b/ci-scripts/conf_files/gNB_SA_n78_133PRB.2x2_usrpn310.conf index 6af8a23407..3eeaac9875 100644 --- a/ci-scripts/conf_files/gNB_SA_n78_133PRB.2x2_usrpn310.conf +++ b/ci-scripts/conf_files/gNB_SA_n78_133PRB.2x2_usrpn310.conf @@ -254,7 +254,7 @@ RUs = ( ## beamforming 4x4 matrix: #bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000, 0x00000000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff]; - sdr_addrs = "mgmt_addr=192.168.18.240,addr=192.168.10.2,second_addr=192.168.20.2,clock_source=internal,time_source=internal" + sdr_addrs = "mgmt_addr=192.168.18.240,addr=192.168.10.2,clock_source=internal,time_source=internal" } ); diff --git a/ci-scripts/conf_files/gnb.band78.nsa_2x2.106PRB.usrpn310.conf b/ci-scripts/conf_files/gnb.band78.nsa_2x2.106PRB.usrpn310.conf index e798e40d64..c7ae676108 100644 --- a/ci-scripts/conf_files/gnb.band78.nsa_2x2.106PRB.usrpn310.conf +++ b/ci-scripts/conf_files/gnb.band78.nsa_2x2.106PRB.usrpn310.conf @@ -232,7 +232,7 @@ RUs = ( bf_weights = [0x00007fff, 0x00007fff]; #clock_src = "external"; sf_extension = 0 - sdr_addrs = "mgmt_addr=192.168.18.240,addr=192.168.10.2,second_addr=192.168.20.2,clock_source=internal,time_source=internal" + sdr_addrs = "mgmt_addr=192.168.18.240,addr=192.168.10.2,clock_source=internal,time_source=internal" } ); diff --git a/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.conf b/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.conf index b92c7df92d..3d94d65f6e 100644 --- a/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.conf +++ b/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.conf @@ -261,7 +261,7 @@ RUs = ( ## beamforming 4x4 matrix: #bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000, 0x00000000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff]; sf_extension = 0 - sdr_addrs = "mgmt_addr=192.168.18.240,addr=192.168.10.2,second_addr=192.168.20.2,clock_source=internal,time_source=internal" + sdr_addrs = "mgmt_addr=192.168.18.240,addr=192.168.10.2,clock_source=internal,time_source=internal" } ); diff --git a/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.usrpn310.conf b/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.usrpn310.conf index 6c778a7c31..83e947411d 100644 --- a/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.usrpn310.conf +++ b/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.usrpn310.conf @@ -265,7 +265,7 @@ RUs = ( ## beamforming 4x4 matrix: #bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000, 0x00000000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff]; sf_extension = 0 - sdr_addrs = "mgmt_addr=192.168.18.240,addr=192.168.10.2,second_addr=192.168.20.2,clock_source=internal,time_source=internal" + sdr_addrs = "mgmt_addr=192.168.18.240,addr=192.168.10.2,clock_source=internal,time_source=internal" } ); diff --git a/ci-scripts/conf_files/gnb.band78.sa.fr1.162PRB.2x2.usrpn310.conf b/ci-scripts/conf_files/gnb.band78.sa.fr1.162PRB.2x2.usrpn310.conf index 5c826ca862..c5effb39cd 100644 --- a/ci-scripts/conf_files/gnb.band78.sa.fr1.162PRB.2x2.usrpn310.conf +++ b/ci-scripts/conf_files/gnb.band78.sa.fr1.162PRB.2x2.usrpn310.conf @@ -260,7 +260,7 @@ RUs = ( ## beamforming 4x4 matrix: #bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000, 0x00000000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff]; sf_extension = 0 - sdr_addrs = "mgmt_addr=192.168.18.240,addr=192.168.10.2,second_addr=192.168.20.2,clock_source=internal,time_source=internal" + sdr_addrs = "mgmt_addr=192.168.18.240,addr=192.168.10.2,clock_source=internal,time_source=internal" } ); From 0c5242ea8516e2b4ad428c753dc0175a9e9a1ea9 Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Fri, 11 Mar 2022 11:36:07 +0000 Subject: [PATCH 95/96] Apply review comment --- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c index 3b0d49bc7a..e1663d535d 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c @@ -1882,13 +1882,13 @@ void nr_sr_reporting(int Mod_idP, frame_t SFN, sub_frame_t slot) } curr_pucch->sr_flag = true; } else { - NR_sched_pucch_t sched_sr; - memset(&sched_sr, 0, sizeof(sched_sr)); - sched_sr.frame = SFN; - sched_sr.ul_slot = slot; - sched_sr.resource_indicator = found; - sched_sr.r_pucch = -1; - sched_sr.sr_flag = true; + NR_sched_pucch_t sched_sr = { + .frame = SFN, + .ul_slot = slot, + .sr_flag = true, + .resource_indicator = found, + .r_pucch = -1 + }; nr_fill_nfapi_pucch(Mod_idP, SFN, slot, &sched_sr, UE_id); } } From 3be77c09b57646a47c35ebef241fcbdc185de8a9 Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Tue, 22 Mar 2022 17:33:45 +0100 Subject: [PATCH 96/96] Change asterix's N310 USRP Replace the N310. Thus, the management IP address works, and the second SFP connector can be used. --- ci-scripts/conf_files/gNB_SA_n78_106PRB.2x2_usrpn310.conf | 2 +- ci-scripts/conf_files/gNB_SA_n78_133PRB.2x2_usrpn310.conf | 2 +- ci-scripts/conf_files/gnb.band78.nsa_2x2.106PRB.usrpn310.conf | 2 +- .../conf_files/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.conf | 2 +- ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.usrpn310.conf | 2 +- .../conf_files/gnb.band78.sa.fr1.162PRB.2x2.usrpn310.conf | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/ci-scripts/conf_files/gNB_SA_n78_106PRB.2x2_usrpn310.conf b/ci-scripts/conf_files/gNB_SA_n78_106PRB.2x2_usrpn310.conf index 7e6590cde2..8b14b74556 100644 --- a/ci-scripts/conf_files/gNB_SA_n78_106PRB.2x2_usrpn310.conf +++ b/ci-scripts/conf_files/gNB_SA_n78_106PRB.2x2_usrpn310.conf @@ -258,7 +258,7 @@ RUs = ( ## beamforming 4x4 matrix: #bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000, 0x00000000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff]; - sdr_addrs = "mgmt_addr=192.168.18.240,addr=192.168.10.2,clock_source=internal,time_source=internal" + sdr_addrs = "mgmt_addr=192.168.18.252,addr=192.168.10.2,second_addr=192.168.20.2,clock_source=internal,time_source=internal" } ); diff --git a/ci-scripts/conf_files/gNB_SA_n78_133PRB.2x2_usrpn310.conf b/ci-scripts/conf_files/gNB_SA_n78_133PRB.2x2_usrpn310.conf index 3eeaac9875..02035ea827 100644 --- a/ci-scripts/conf_files/gNB_SA_n78_133PRB.2x2_usrpn310.conf +++ b/ci-scripts/conf_files/gNB_SA_n78_133PRB.2x2_usrpn310.conf @@ -254,7 +254,7 @@ RUs = ( ## beamforming 4x4 matrix: #bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000, 0x00000000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff]; - sdr_addrs = "mgmt_addr=192.168.18.240,addr=192.168.10.2,clock_source=internal,time_source=internal" + sdr_addrs = "mgmt_addr=192.168.18.252,addr=192.168.10.2,second_addr=192.168.20.2,clock_source=internal,time_source=internal" } ); diff --git a/ci-scripts/conf_files/gnb.band78.nsa_2x2.106PRB.usrpn310.conf b/ci-scripts/conf_files/gnb.band78.nsa_2x2.106PRB.usrpn310.conf index c7ae676108..84b66060d9 100644 --- a/ci-scripts/conf_files/gnb.band78.nsa_2x2.106PRB.usrpn310.conf +++ b/ci-scripts/conf_files/gnb.band78.nsa_2x2.106PRB.usrpn310.conf @@ -232,7 +232,7 @@ RUs = ( bf_weights = [0x00007fff, 0x00007fff]; #clock_src = "external"; sf_extension = 0 - sdr_addrs = "mgmt_addr=192.168.18.240,addr=192.168.10.2,clock_source=internal,time_source=internal" + sdr_addrs = "mgmt_addr=192.168.18.252,addr=192.168.10.2,second_addr=192.168.20.2,clock_source=internal,time_source=internal" } ); diff --git a/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.conf b/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.conf index 3d94d65f6e..9f5c2875b3 100644 --- a/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.conf +++ b/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.conf @@ -261,7 +261,7 @@ RUs = ( ## beamforming 4x4 matrix: #bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000, 0x00000000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff]; sf_extension = 0 - sdr_addrs = "mgmt_addr=192.168.18.240,addr=192.168.10.2,clock_source=internal,time_source=internal" + sdr_addrs = "mgmt_addr=192.168.18.252,addr=192.168.10.2,second_addr=192.168.20.2,clock_source=internal,time_source=internal" } ); diff --git a/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.usrpn310.conf b/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.usrpn310.conf index 83e947411d..594bd5e4c8 100644 --- a/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.usrpn310.conf +++ b/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.usrpn310.conf @@ -265,7 +265,7 @@ RUs = ( ## beamforming 4x4 matrix: #bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000, 0x00000000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff]; sf_extension = 0 - sdr_addrs = "mgmt_addr=192.168.18.240,addr=192.168.10.2,clock_source=internal,time_source=internal" + sdr_addrs = "mgmt_addr=192.168.18.252,addr=192.168.10.2,second_addr=192.168.20.2,clock_source=internal,time_source=internal" } ); diff --git a/ci-scripts/conf_files/gnb.band78.sa.fr1.162PRB.2x2.usrpn310.conf b/ci-scripts/conf_files/gnb.band78.sa.fr1.162PRB.2x2.usrpn310.conf index c5effb39cd..2361437f7c 100644 --- a/ci-scripts/conf_files/gnb.band78.sa.fr1.162PRB.2x2.usrpn310.conf +++ b/ci-scripts/conf_files/gnb.band78.sa.fr1.162PRB.2x2.usrpn310.conf @@ -260,7 +260,7 @@ RUs = ( ## beamforming 4x4 matrix: #bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000, 0x00000000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff]; sf_extension = 0 - sdr_addrs = "mgmt_addr=192.168.18.240,addr=192.168.10.2,clock_source=internal,time_source=internal" + sdr_addrs = "mgmt_addr=192.168.18.252,addr=192.168.10.2,second_addr=192.168.20.2,clock_source=internal,time_source=internal" } );