From de8d4f431821f865672e17fcb3c0176eb5775907 Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Mon, 13 Sep 2021 09:59:47 +0200 Subject: [PATCH 001/135] adding pseudo code to start prs development --- openair1/PHY/INIT/nr_init.c | 17 +++++++++++++++++ openair1/PHY/NR_REFSIG/nr_gold.c | 2 ++ openair1/PHY/defs_gNB.h | 3 +++ openair1/PHY/defs_nr_common.h | 3 +++ openair1/SCHED_NR/phy_procedures_nr_gNB.c | 3 +++ openair1/SIMULATION/NR_PHY/dlsim.c | 1 + 6 files changed, 29 insertions(+) diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c index 32e190679d..a723ee9b9e 100644 --- a/openair1/PHY/INIT/nr_init.c +++ b/openair1/PHY/INIT/nr_init.c @@ -194,6 +194,23 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB, nr_init_csi_rs(gNB, cfg->cell_config.phy_cell_id.value); + //PRS init + gNB->nr_gold_prs = (uint32_t ***)malloc16(fp->slots_per_frame*sizeof(uint32_t **)); + uint32_t ***prs = gNB->nr_gold_prs; + AssertFatal(prs!=NULL, "NR init: positioning reference signal malloc failed\n"); + + for (int slot=0; slotslots_per_frame; slot++) { + prs[slot] = (uint32_t **)malloc16(fp->symbols_per_slot*sizeof(uint32_t *)); + AssertFatal(prs[slot]!=NULL, "NR init: positioning reference signal for slot %d - malloc failed\n", slot); + + for (int symb=0; symbsymbols_per_slot; symb++) { + prs[slot][symb] = (uint32_t *)malloc16(NR_MAX_PRS_INIT_LENGTH_DWORD*sizeof(uint32_t)); + AssertFatal(prs[slot][symb]!=NULL, "NR init: positioning reference signal for slot %d symbol %d - malloc failed\n", slot, symb); + } + } + + nr_init_prs(...); + /* Generate low PAPR type 1 sequences for PUSCH DMRS, these are used if transform precoding is enabled. */ generate_lowpapr_typ1_refsig_sequences(SHRT_MAX); diff --git a/openair1/PHY/NR_REFSIG/nr_gold.c b/openair1/PHY/NR_REFSIG/nr_gold.c index 11e28a3046..cb2bff6625 100644 --- a/openair1/PHY/NR_REFSIG/nr_gold.c +++ b/openair1/PHY/NR_REFSIG/nr_gold.c @@ -153,3 +153,5 @@ void nr_init_csi_rs(PHY_VARS_gNB* gNB, uint32_t Nid) } } + +void nr_init_prs(PHY_VARS_gNB* gNB, uint32_t Nid, ...) diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h index 778724218f..577fbfa1d9 100644 --- a/openair1/PHY/defs_gNB.h +++ b/openair1/PHY/defs_gNB.h @@ -811,6 +811,9 @@ typedef struct PHY_VARS_gNB_s { /// CSI RS sequence uint32_t ***nr_gold_csi_rs; + /// PRS sequence + uint32_t ***nr_gold_prs; + /// Indicator set to 0 after first SR uint8_t first_sr[NUMBER_OF_NR_SR_MAX]; diff --git a/openair1/PHY/defs_nr_common.h b/openair1/PHY/defs_nr_common.h index c385d323e3..7b914db921 100644 --- a/openair1/PHY/defs_nr_common.h +++ b/openair1/PHY/defs_nr_common.h @@ -80,6 +80,9 @@ #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_PRS_LENGTH 3264 //272*6(max allocation per RB)*2(QPSK) +#define NR_MAX_PRS_INIT_LENGTH_DWORD 102 // 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 diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index 0a87a08a56..ad50e31c85 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -206,6 +206,9 @@ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB, } } + //TODO: nr_generate_prs + // check if we have prs to transmit in this frame and slot + if (do_meas==1) stop_meas(&gNB->phy_proc_tx); if ((frame&127) == 0) dump_pdsch_stats(gNB); diff --git a/openair1/SIMULATION/NR_PHY/dlsim.c b/openair1/SIMULATION/NR_PHY/dlsim.c index 5df03a903b..8e6fdecb8f 100644 --- a/openair1/SIMULATION/NR_PHY/dlsim.c +++ b/openair1/SIMULATION/NR_PHY/dlsim.c @@ -960,6 +960,7 @@ int main(int argc, char **argv) //NR_COMMON_channels_t *cc = RC.nrmac[0]->common_channels; snrRun = 0; + //TODO: configure parameters for PRS for (SNR = snr0; SNR < snr1; SNR += .2) { From c9439857d7d5390e2ab618721c3ddccf71f2e0dd Mon Sep 17 00:00:00 2001 From: ahadi Date: Tue, 26 Oct 2021 15:52:22 +0000 Subject: [PATCH 002/135] Update nr_gold.c --- openair1/PHY/NR_REFSIG/nr_gold.c | 40 +++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/openair1/PHY/NR_REFSIG/nr_gold.c b/openair1/PHY/NR_REFSIG/nr_gold.c index cb2bff6625..7e3fb8ecf0 100644 --- a/openair1/PHY/NR_REFSIG/nr_gold.c +++ b/openair1/PHY/NR_REFSIG/nr_gold.c @@ -154,4 +154,42 @@ void nr_init_csi_rs(PHY_VARS_gNB* gNB, uint32_t Nid) } -void nr_init_prs(PHY_VARS_gNB* gNB, uint32_t Nid, ...) +void nr_init_prs(PHY_VARS_gNB* gNB, uint32_t Nid, uint32_t slotnum, uint32_t symNum) +{ + unsigned int x1, x2; + uint16_t Nid, i_ssb, i_ssb2; + unsigned char Lmax, l, n_hf, N_hf; + nfapi_nr_config_request_scf_t *cfg = &gNB->gNB_config; + NR_DL_FRAME_PARMS *fp = &gNB->frame_parms; + uint8_t reset; + + Nid = cfg->cell_config.phy_cell_id.value; + + Lmax = fp->Lmax; + N_hf = (Lmax == 4)? 2:1; + + for (n_hf = 0; n_hf < N_hf; n_hf++) { + for (l = 0; l < Lmax ; l++) { + i_ssb = l & (Lmax-1); + i_ssb2 = i_ssb + (n_hf<<2); + + reset = 1; + // initial x2 for prs as 38.211 + uint32_t c_init1, c_init2, c_init3; + uint32_t pow22=1<<22; + uint32_t pow10=1<<10; + c_init1 = pow22*ceil(Nid/1024); + c_init2 = pow10*(slotnum+symNum+1)*(2*(Nid%1024)+1); + c_init3 = Nid%1024; + x2 = c_init1 + c_init2 + c_init3; + + + for (uint8_t n=0; nnr_gold_prs[n_hf][l][n] = lte_gold_generic(&x1, &x2, reset); + reset = 0; + } + + } + } + +} From 98994a0ba6a10a8b975b9af3180c9de22145eac3 Mon Sep 17 00:00:00 2001 From: ahadi Date: Tue, 26 Oct 2021 16:01:16 +0000 Subject: [PATCH 003/135] Update nr_init.c --- openair1/PHY/INIT/nr_init.c | 41 ++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c index a723ee9b9e..ec286ea451 100644 --- a/openair1/PHY/INIT/nr_init.c +++ b/openair1/PHY/INIT/nr_init.c @@ -209,7 +209,46 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB, } } - nr_init_prs(...); + void nr_init_prs(PHY_VARS_gNB* gNB, uint32_t Nid, uint32_t slotnum, uint32_t symNum) +{ + unsigned int x1, x2; + uint16_t Nid, i_ssb, i_ssb2; + unsigned char Lmax, l, n_hf, N_hf; + nfapi_nr_config_request_scf_t *cfg = &gNB->gNB_config; + NR_DL_FRAME_PARMS *fp = &gNB->frame_parms; + uint8_t reset; + + Nid = cfg->cell_config.phy_cell_id.value; + + Lmax = fp->Lmax; + N_hf = (Lmax == 4)? 2:1; + + for (n_hf = 0; n_hf < N_hf; n_hf++) { + for (l = 0; l < Lmax ; l++) { + i_ssb = l & (Lmax-1); + i_ssb2 = i_ssb + (n_hf<<2); + + reset = 1; + // initial x2 for prs as 38.211 + uint32_t c_init1, c_init2, c_init3; + uint32_t pow22=1<<22; + uint32_t pow10=1<<10; + c_init1 = pow22*ceil(Nid/1024); + c_init2 = pow10*(slotnum+symNum+1)*(2*(Nid%1024)+1); + c_init3 = Nid%1024; + x2 = c_init1 + c_init2 + c_init3; + + + for (uint8_t n=0; nnr_gold_prs[n_hf][l][n] = lte_gold_generic(&x1, &x2, reset); + reset = 0; + } + + } + } + +} + /* Generate low PAPR type 1 sequences for PUSCH DMRS, these are used if transform precoding is enabled. */ generate_lowpapr_typ1_refsig_sequences(SHRT_MAX); From 1f86c34f0aab258ba8bbb22e10d87082e495cfd8 Mon Sep 17 00:00:00 2001 From: Mohsen Ahadi Date: Wed, 27 Oct 2021 14:15:43 +0000 Subject: [PATCH 004/135] Update nr_init.c --- openair1/PHY/INIT/nr_init.c | 40 +------------------------------------ 1 file changed, 1 insertion(+), 39 deletions(-) diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c index ec286ea451..c3e3807d4d 100644 --- a/openair1/PHY/INIT/nr_init.c +++ b/openair1/PHY/INIT/nr_init.c @@ -209,45 +209,7 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB, } } - void nr_init_prs(PHY_VARS_gNB* gNB, uint32_t Nid, uint32_t slotnum, uint32_t symNum) -{ - unsigned int x1, x2; - uint16_t Nid, i_ssb, i_ssb2; - unsigned char Lmax, l, n_hf, N_hf; - nfapi_nr_config_request_scf_t *cfg = &gNB->gNB_config; - NR_DL_FRAME_PARMS *fp = &gNB->frame_parms; - uint8_t reset; - - Nid = cfg->cell_config.phy_cell_id.value; - - Lmax = fp->Lmax; - N_hf = (Lmax == 4)? 2:1; - - for (n_hf = 0; n_hf < N_hf; n_hf++) { - for (l = 0; l < Lmax ; l++) { - i_ssb = l & (Lmax-1); - i_ssb2 = i_ssb + (n_hf<<2); - - reset = 1; - // initial x2 for prs as 38.211 - uint32_t c_init1, c_init2, c_init3; - uint32_t pow22=1<<22; - uint32_t pow10=1<<10; - c_init1 = pow22*ceil(Nid/1024); - c_init2 = pow10*(slotnum+symNum+1)*(2*(Nid%1024)+1); - c_init3 = Nid%1024; - x2 = c_init1 + c_init2 + c_init3; - - - for (uint8_t n=0; nnr_gold_prs[n_hf][l][n] = lte_gold_generic(&x1, &x2, reset); - reset = 0; - } - - } - } - -} + nr_init_prs(gNB); /* Generate low PAPR type 1 sequences for PUSCH DMRS, these are used if transform precoding is enabled. */ From 3d0c941d2ce5960d0d3f8ef6dfd3d3a55b1013fd Mon Sep 17 00:00:00 2001 From: ahadi Date: Wed, 27 Oct 2021 17:15:54 +0200 Subject: [PATCH 005/135] adding nr_init_prs() to nr_gold.c --- openair1/PHY/NR_REFSIG/nr_gold.c | 41 +++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/openair1/PHY/NR_REFSIG/nr_gold.c b/openair1/PHY/NR_REFSIG/nr_gold.c index cb2bff6625..4dbd09138b 100644 --- a/openair1/PHY/NR_REFSIG/nr_gold.c +++ b/openair1/PHY/NR_REFSIG/nr_gold.c @@ -154,4 +154,43 @@ void nr_init_csi_rs(PHY_VARS_gNB* gNB, uint32_t Nid) } -void nr_init_prs(PHY_VARS_gNB* gNB, uint32_t Nid, ...) +void nr_init_prs(PHY_VARS_gNB* gNB, uint32_t symNum) +{ + unsigned int x1, x2; + uint16_t Nid, i_ssb, i_ssb2; + //unsigned char Lmax, l, n_hf, N_hf; + nfapi_nr_config_request_scf_t *cfg = &gNB->gNB_config; + NR_DL_FRAME_PARMS *fp = &gNB->frame_parms; + uint8_t reset; + uint8_t slotNum, symNum; + + Nid = cfg->cell_config.phy_cell_id.value; + + //Lmax = fp->Lmax; + //N_hf = (Lmax == 4)? 2:1; + + for (slotNum = 0; slotNum < fp->slots_per_frame-1; slotNum++) { + for (symNum = 0; symNum < fp->symbols_per_slot-1 ; symNum++) { + i_ssb = sumNum & (symbols_per_slot-1); + i_ssb2 = i_ssb + (slot<<2); + + reset = 1; + // initial x2 for prs as 38.211 + uint32_t c_init1, c_init2, c_init3; + uint32_t pow22=1<<22; + uint32_t pow10=1<<10; + c_init1 = pow22*ceil(Nid/1024); + c_init2 = pow10*(slotnum+symNum+1)*(2*(Nid%1024)+1); + c_init3 = Nid%1024; + x2 = c_init1 + c_init2 + c_init3; + + + for (uint8_t n=0; nnr_gold_prs[slotNum][symNum][n] = lte_gold_generic(&x1, &x2, reset); + reset = 0; + } + + } + } + +} From 7715db28f0e64ec4cc487797eedf0eaef9b356a1 Mon Sep 17 00:00:00 2001 From: Mohsen Ahadi Date: Wed, 27 Oct 2021 15:20:33 +0000 Subject: [PATCH 006/135] Update nr_gold.c --- openair1/PHY/NR_REFSIG/nr_gold.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/openair1/PHY/NR_REFSIG/nr_gold.c b/openair1/PHY/NR_REFSIG/nr_gold.c index 7e3fb8ecf0..4dbd09138b 100644 --- a/openair1/PHY/NR_REFSIG/nr_gold.c +++ b/openair1/PHY/NR_REFSIG/nr_gold.c @@ -154,24 +154,25 @@ void nr_init_csi_rs(PHY_VARS_gNB* gNB, uint32_t Nid) } -void nr_init_prs(PHY_VARS_gNB* gNB, uint32_t Nid, uint32_t slotnum, uint32_t symNum) +void nr_init_prs(PHY_VARS_gNB* gNB, uint32_t symNum) { unsigned int x1, x2; uint16_t Nid, i_ssb, i_ssb2; - unsigned char Lmax, l, n_hf, N_hf; + //unsigned char Lmax, l, n_hf, N_hf; nfapi_nr_config_request_scf_t *cfg = &gNB->gNB_config; NR_DL_FRAME_PARMS *fp = &gNB->frame_parms; uint8_t reset; + uint8_t slotNum, symNum; Nid = cfg->cell_config.phy_cell_id.value; - Lmax = fp->Lmax; - N_hf = (Lmax == 4)? 2:1; + //Lmax = fp->Lmax; + //N_hf = (Lmax == 4)? 2:1; - for (n_hf = 0; n_hf < N_hf; n_hf++) { - for (l = 0; l < Lmax ; l++) { - i_ssb = l & (Lmax-1); - i_ssb2 = i_ssb + (n_hf<<2); + for (slotNum = 0; slotNum < fp->slots_per_frame-1; slotNum++) { + for (symNum = 0; symNum < fp->symbols_per_slot-1 ; symNum++) { + i_ssb = sumNum & (symbols_per_slot-1); + i_ssb2 = i_ssb + (slot<<2); reset = 1; // initial x2 for prs as 38.211 @@ -184,8 +185,8 @@ void nr_init_prs(PHY_VARS_gNB* gNB, uint32_t Nid, uint32_t slotnum, uint32_t sym x2 = c_init1 + c_init2 + c_init3; - for (uint8_t n=0; nnr_gold_prs[n_hf][l][n] = lte_gold_generic(&x1, &x2, reset); + for (uint8_t n=0; nnr_gold_prs[slotNum][symNum][n] = lte_gold_generic(&x1, &x2, reset); reset = 0; } From 37c218103413dbb7f8dc1b020f025022ad07257c Mon Sep 17 00:00:00 2001 From: Mohsen Ahadi Date: Wed, 27 Oct 2021 15:21:11 +0000 Subject: [PATCH 007/135] Update nr_gold.c --- openair1/PHY/NR_REFSIG/nr_gold.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openair1/PHY/NR_REFSIG/nr_gold.c b/openair1/PHY/NR_REFSIG/nr_gold.c index 4dbd09138b..16b8a453a3 100644 --- a/openair1/PHY/NR_REFSIG/nr_gold.c +++ b/openair1/PHY/NR_REFSIG/nr_gold.c @@ -154,7 +154,7 @@ void nr_init_csi_rs(PHY_VARS_gNB* gNB, uint32_t Nid) } -void nr_init_prs(PHY_VARS_gNB* gNB, uint32_t symNum) +void nr_init_prs(PHY_VARS_gNB* gNB) { unsigned int x1, x2; uint16_t Nid, i_ssb, i_ssb2; From 85aac0f5c4e8d489b3e3b22348fb90566a56cb6b Mon Sep 17 00:00:00 2001 From: Mohsen Ahadi Date: Thu, 28 Oct 2021 14:30:52 +0000 Subject: [PATCH 008/135] Update nr_gold.c --- openair1/PHY/NR_REFSIG/nr_gold.c | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/openair1/PHY/NR_REFSIG/nr_gold.c b/openair1/PHY/NR_REFSIG/nr_gold.c index 16b8a453a3..94a450905e 100644 --- a/openair1/PHY/NR_REFSIG/nr_gold.c +++ b/openair1/PHY/NR_REFSIG/nr_gold.c @@ -157,7 +157,7 @@ void nr_init_csi_rs(PHY_VARS_gNB* gNB, uint32_t Nid) void nr_init_prs(PHY_VARS_gNB* gNB) { unsigned int x1, x2; - uint16_t Nid, i_ssb, i_ssb2; + uint16_t Nid; //unsigned char Lmax, l, n_hf, N_hf; nfapi_nr_config_request_scf_t *cfg = &gNB->gNB_config; NR_DL_FRAME_PARMS *fp = &gNB->frame_parms; @@ -166,14 +166,8 @@ void nr_init_prs(PHY_VARS_gNB* gNB) Nid = cfg->cell_config.phy_cell_id.value; - //Lmax = fp->Lmax; - //N_hf = (Lmax == 4)? 2:1; - - for (slotNum = 0; slotNum < fp->slots_per_frame-1; slotNum++) { - for (symNum = 0; symNum < fp->symbols_per_slot-1 ; symNum++) { - i_ssb = sumNum & (symbols_per_slot-1); - i_ssb2 = i_ssb + (slot<<2); - + for (slotNum = 0; slotNum < fp->slots_per_frame; slotNum++) { + for (symNum = 0; symNum < fp->symbols_per_slot ; symNum++) { reset = 1; // initial x2 for prs as 38.211 uint32_t c_init1, c_init2, c_init3; @@ -183,8 +177,6 @@ void nr_init_prs(PHY_VARS_gNB* gNB) c_init2 = pow10*(slotnum+symNum+1)*(2*(Nid%1024)+1); c_init3 = Nid%1024; x2 = c_init1 + c_init2 + c_init3; - - for (uint8_t n=0; nnr_gold_prs[slotNum][symNum][n] = lte_gold_generic(&x1, &x2, reset); reset = 0; From 3e6ad5f0ee1bb1bfe4261c9c7d3e9bd5fda2008e Mon Sep 17 00:00:00 2001 From: Mohsen Ahadi Date: Thu, 28 Oct 2021 14:38:17 +0000 Subject: [PATCH 009/135] Update nr_gold.c --- openair1/PHY/NR_REFSIG/nr_gold.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openair1/PHY/NR_REFSIG/nr_gold.c b/openair1/PHY/NR_REFSIG/nr_gold.c index 94a450905e..dc860a5f67 100644 --- a/openair1/PHY/NR_REFSIG/nr_gold.c +++ b/openair1/PHY/NR_REFSIG/nr_gold.c @@ -174,7 +174,7 @@ void nr_init_prs(PHY_VARS_gNB* gNB) uint32_t pow22=1<<22; uint32_t pow10=1<<10; c_init1 = pow22*ceil(Nid/1024); - c_init2 = pow10*(slotnum+symNum+1)*(2*(Nid%1024)+1); + c_init2 = pow10*(slotNum+symNum+1)*(2*(Nid%1024)+1); c_init3 = Nid%1024; x2 = c_init1 + c_init2 + c_init3; for (uint8_t n=0; n Date: Thu, 28 Oct 2021 22:17:35 +0200 Subject: [PATCH 010/135] print --- openair1/PHY/NR_REFSIG/nr_gold.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/openair1/PHY/NR_REFSIG/nr_gold.c b/openair1/PHY/NR_REFSIG/nr_gold.c index dc860a5f67..bad71d1140 100644 --- a/openair1/PHY/NR_REFSIG/nr_gold.c +++ b/openair1/PHY/NR_REFSIG/nr_gold.c @@ -169,6 +169,8 @@ void nr_init_prs(PHY_VARS_gNB* gNB) for (slotNum = 0; slotNum < fp->slots_per_frame; slotNum++) { for (symNum = 0; symNum < fp->symbols_per_slot ; symNum++) { reset = 1; + printf("%d \n",slotNum); + printf("%d \n",symNum); // initial x2 for prs as 38.211 uint32_t c_init1, c_init2, c_init3; uint32_t pow22=1<<22; @@ -177,11 +179,11 @@ void nr_init_prs(PHY_VARS_gNB* gNB) c_init2 = pow10*(slotNum+symNum+1)*(2*(Nid%1024)+1); c_init3 = Nid%1024; x2 = c_init1 + c_init2 + c_init3; + printf("%d \n",x2); for (uint8_t n=0; nnr_gold_prs[slotNum][symNum][n] = lte_gold_generic(&x1, &x2, reset); reset = 0; } - } } From 177e07d7cb2f0bd855ab7e0325859e0f53a3cab3 Mon Sep 17 00:00:00 2001 From: Mohsen Ahadi Date: Wed, 3 Nov 2021 09:27:40 +0000 Subject: [PATCH 011/135] Update nr_gold.c --- openair1/PHY/NR_REFSIG/nr_gold.c | 9 --------- 1 file changed, 9 deletions(-) diff --git a/openair1/PHY/NR_REFSIG/nr_gold.c b/openair1/PHY/NR_REFSIG/nr_gold.c index c71836bfa0..9fd03b52c1 100644 --- a/openair1/PHY/NR_REFSIG/nr_gold.c +++ b/openair1/PHY/NR_REFSIG/nr_gold.c @@ -154,17 +154,14 @@ void nr_init_csi_rs(PHY_VARS_gNB* gNB, uint32_t Nid) } -<<<<<<< HEAD void nr_init_prs(PHY_VARS_gNB* gNB, uint32_t symNum) { unsigned int x1, x2; uint16_t Nid, i_ssb, i_ssb2; -======= void nr_init_prs(PHY_VARS_gNB* gNB) { unsigned int x1, x2; uint16_t Nid; ->>>>>>> 3e6ad5f0ee1bb1bfe4261c9c7d3e9bd5fda2008e //unsigned char Lmax, l, n_hf, N_hf; nfapi_nr_config_request_scf_t *cfg = &gNB->gNB_config; NR_DL_FRAME_PARMS *fp = &gNB->frame_parms; @@ -173,7 +170,6 @@ void nr_init_prs(PHY_VARS_gNB* gNB) Nid = cfg->cell_config.phy_cell_id.value; -<<<<<<< HEAD //Lmax = fp->Lmax; //N_hf = (Lmax == 4)? 2:1; @@ -182,27 +178,22 @@ void nr_init_prs(PHY_VARS_gNB* gNB) i_ssb = sumNum & (symbols_per_slot-1); i_ssb2 = i_ssb + (slot<<2); -======= for (slotNum = 0; slotNum < fp->slots_per_frame; slotNum++) { for (symNum = 0; symNum < fp->symbols_per_slot ; symNum++) { ->>>>>>> 3e6ad5f0ee1bb1bfe4261c9c7d3e9bd5fda2008e reset = 1; // initial x2 for prs as 38.211 uint32_t c_init1, c_init2, c_init3; uint32_t pow22=1<<22; uint32_t pow10=1<<10; c_init1 = pow22*ceil(Nid/1024); -<<<<<<< HEAD c_init2 = pow10*(slotnum+symNum+1)*(2*(Nid%1024)+1); c_init3 = Nid%1024; x2 = c_init1 + c_init2 + c_init3; -======= c_init2 = pow10*(slotNum+symNum+1)*(2*(Nid%1024)+1); c_init3 = Nid%1024; x2 = c_init1 + c_init2 + c_init3; ->>>>>>> 3e6ad5f0ee1bb1bfe4261c9c7d3e9bd5fda2008e for (uint8_t n=0; nnr_gold_prs[slotNum][symNum][n] = lte_gold_generic(&x1, &x2, reset); reset = 0; From 70889ee949d86b5db92a1a257c3a1d1ebbd371d2 Mon Sep 17 00:00:00 2001 From: ahadi Date: Wed, 3 Nov 2021 10:46:58 +0100 Subject: [PATCH 012/135] fix nr_gold.c --- openair1/PHY/NR_REFSIG/nr_gold.c | 26 +++++--------------------- 1 file changed, 5 insertions(+), 21 deletions(-) diff --git a/openair1/PHY/NR_REFSIG/nr_gold.c b/openair1/PHY/NR_REFSIG/nr_gold.c index 7c66fe0cbf..d8c9578afb 100644 --- a/openair1/PHY/NR_REFSIG/nr_gold.c +++ b/openair1/PHY/NR_REFSIG/nr_gold.c @@ -154,15 +154,13 @@ void nr_init_csi_rs(PHY_VARS_gNB* gNB, uint32_t Nid) } -void nr_init_prs(PHY_VARS_gNB* gNB, uint32_t symNum) -{ - unsigned int x1, x2; - uint16_t Nid, i_ssb, i_ssb2; + + void nr_init_prs(PHY_VARS_gNB* gNB) { unsigned int x1, x2; uint16_t Nid; - //unsigned char Lmax, l, n_hf, N_hf; + nfapi_nr_config_request_scf_t *cfg = &gNB->gNB_config; NR_DL_FRAME_PARMS *fp = &gNB->frame_parms; uint8_t reset; @@ -170,33 +168,18 @@ void nr_init_prs(PHY_VARS_gNB* gNB) Nid = cfg->cell_config.phy_cell_id.value; - //Lmax = fp->Lmax; - //N_hf = (Lmax == 4)? 2:1; - - for (slotNum = 0; slotNum < fp->slots_per_frame-1; slotNum++) { - for (symNum = 0; symNum < fp->symbols_per_slot-1 ; symNum++) { - i_ssb = sumNum & (symbols_per_slot-1); - i_ssb2 = i_ssb + (slot<<2); - for (slotNum = 0; slotNum < fp->slots_per_frame; slotNum++) { for (symNum = 0; symNum < fp->symbols_per_slot ; symNum++) { reset = 1; - printf("%d \n",slotNum); - printf("%d \n",symNum); // initial x2 for prs as 38.211 uint32_t c_init1, c_init2, c_init3; uint32_t pow22=1<<22; uint32_t pow10=1<<10; c_init1 = pow22*ceil(Nid/1024); - c_init2 = pow10*(slotnum+symNum+1)*(2*(Nid%1024)+1); - c_init3 = Nid%1024; - x2 = c_init1 + c_init2 + c_init3; - - c_init2 = pow10*(slotNum+symNum+1)*(2*(Nid%1024)+1); c_init3 = Nid%1024; x2 = c_init1 + c_init2 + c_init3; - printf("%d \n",x2); + for (uint8_t n=0; nnr_gold_prs[slotNum][symNum][n] = lte_gold_generic(&x1, &x2, reset); reset = 0; @@ -205,3 +188,4 @@ void nr_init_prs(PHY_VARS_gNB* gNB) } } + From 1a6610ee3f0ebe4091beb4c08c18b785efaee778 Mon Sep 17 00:00:00 2001 From: ahadi Date: Wed, 3 Nov 2021 15:16:57 +0100 Subject: [PATCH 013/135] adding nr_prs.c to cmakelist and headers --- openair1/PHY/NR_TRANSPORT/nr_prs.c | 96 +++++++++++++++++++ .../PHY/NR_TRANSPORT/nr_transport_proto.h | 3 + 2 files changed, 99 insertions(+) create mode 100644 openair1/PHY/NR_TRANSPORT/nr_prs.c diff --git a/openair1/PHY/NR_TRANSPORT/nr_prs.c b/openair1/PHY/NR_TRANSPORT/nr_prs.c new file mode 100644 index 0000000000..53fbb1a391 --- /dev/null +++ b/openair1/PHY/NR_TRANSPORT/nr_prs.c @@ -0,0 +1,96 @@ +//int nr_generate_prs(){} + +int nr_generate_pbch_dmrs(uint32_t *gold_pbch_dmrs, + int32_t *txdataF, + int16_t amp, + uint8_t ssb_start_symbol, + nfapi_nr_config_request_scf_t *config, + NR_DL_FRAME_PARMS *frame_parms) { + int k,l; + //int16_t a; + int16_t mod_dmrs[NR_PBCH_DMRS_LENGTH<<1]; + uint8_t idx=0; + uint8_t nushift = config->cell_config.phy_cell_id.value &3; + LOG_D(PHY, "PBCH DMRS mapping started at symbol %d shift %d\n", ssb_start_symbol+1, nushift); + + /// QPSK modulation + for (int m=0; m>5])>>((m<<1)&0x1f))&3); + mod_dmrs[m<<1] = nr_qpsk_mod_table[idx<<1]; + mod_dmrs[(m<<1)+1] = nr_qpsk_mod_table[(idx<<1) + 1]; +#ifdef DEBUG_PBCH_DMRS + printf("m %d idx %d gold seq %d b0-b1 %d-%d mod_dmrs %d %d\n", m, idx, gold_pbch_dmrs[(m<<1)>>5], (((gold_pbch_dmrs[(m<<1)>>5])>>((m<<1)&0x1f))&1), + (((gold_pbch_dmrs[((m<<1)+1)>>5])>>(((m<<1)+1)&0x1f))&1), mod_dmrs[(m<<1)], mod_dmrs[(m<<1)+1]); +#endif + } + + /// Resource mapping + // PBCH DMRS are mapped within the SSB block on every fourth subcarrier starting from nushift of symbols 1, 2, 3 + ///symbol 1 [0+nushift:4:236+nushift] -- 60 mod symbols + k = frame_parms->first_carrier_offset + frame_parms->ssb_start_subcarrier + nushift; + l = ssb_start_symbol + 1; + + for (int m = 0; m < 60; m++) { +#ifdef DEBUG_PBCH_DMRS + printf("m %d at k %d of l %d\n", m, k, l); +#endif + ((int16_t *)txdataF)[(l*frame_parms->ofdm_symbol_size + k)<<1] = (amp * mod_dmrs[m<<1]) >> 15; + ((int16_t *)txdataF)[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = (amp * mod_dmrs[(m<<1) + 1]) >> 15; +#ifdef DEBUG_PBCH_DMRS + printf("(%d,%d)\n", + ((int16_t *)txdataF)[(l*frame_parms->ofdm_symbol_size + k)<<1], + ((int16_t *)txdataF)[((l*frame_parms->ofdm_symbol_size + k)<<1)+1]); +#endif + k+=4; + + if (k >= frame_parms->ofdm_symbol_size) + k-=frame_parms->ofdm_symbol_size; + } + + ///symbol 2 [0+u:4:44+nushift ; 192+nu:4:236+nushift] -- 24 mod symbols + k = frame_parms->first_carrier_offset + frame_parms->ssb_start_subcarrier + nushift; + l++; + + for (int m = 60; m < 84; m++) { +#ifdef DEBUG_PBCH_DMRS + printf("m %d at k %d of l %d\n", m, k, l); +#endif + ((int16_t *)txdataF)[(l*frame_parms->ofdm_symbol_size + k)<<1] = (amp * mod_dmrs[m<<1]) >> 15; + ((int16_t *)txdataF)[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = (amp * mod_dmrs[(m<<1) + 1]) >> 15; +#ifdef DEBUG_PBCH_DMRS + printf("(%d,%d)\n", + ((int16_t *)txdataF)[(l*frame_parms->ofdm_symbol_size + k)<<1], + ((int16_t *)txdataF)[((l*frame_parms->ofdm_symbol_size + k)<<1)+1]); +#endif + k+=(m==71)?148:4; // Jump from 44+nu to 192+nu + + if (k >= frame_parms->ofdm_symbol_size) + k-=frame_parms->ofdm_symbol_size; + } + + ///symbol 3 [0+nushift:4:236+nushift] -- 60 mod symbols + k = frame_parms->first_carrier_offset + frame_parms->ssb_start_subcarrier + nushift; + l++; + + for (int m = 84; m < NR_PBCH_DMRS_LENGTH; m++) { +#ifdef DEBUG_PBCH_DMRS + printf("m %d at k %d of l %d\n", m, k, l); +#endif + ((int16_t *)txdataF)[(l*frame_parms->ofdm_symbol_size + k)<<1] = (amp * mod_dmrs[m<<1]) >> 15; + ((int16_t *)txdataF)[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = (amp * mod_dmrs[(m<<1) + 1]) >> 15; +#ifdef DEBUG_PBCH_DMRS + printf("(%d,%d)\n", + ((int16_t *)txdataF)[(l*frame_parms->ofdm_symbol_size + k)<<1], + ((int16_t *)txdataF)[((l*frame_parms->ofdm_symbol_size + k)<<1)+1]); +#endif + k+=4; + + if (k >= frame_parms->ofdm_symbol_size) + k-=frame_parms->ofdm_symbol_size; + } + +#ifdef DEBUG_PBCH_DMRS + write_output("txdataF_pbch_dmrs.m", "txdataF_pbch_dmrs", txdataF[0], frame_parms->samples_per_frame_wCP>>1, 1, 1); +#endif + return 0; +} diff --git a/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h b/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h index 54188d22c0..2d403008cc 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h +++ b/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h @@ -45,6 +45,9 @@ @param @returns 0 on success */ + +int nr_generate_prs(); + int nr_generate_pss(int16_t *d_pss, int32_t *txdataF, int16_t amp, From 6b8f83b84926db1bcd041c5bbf8ae356a8d89fdd Mon Sep 17 00:00:00 2001 From: ahadi Date: Wed, 3 Nov 2021 15:24:24 +0100 Subject: [PATCH 014/135] update --- cmake_targets/CMakeLists.txt | 1 + openair1/PHY/LTE_TRANSPORT/lte_gold_generic.c | 2 +- openair1/PHY/NR_REFSIG/nr_gold.c | 7 ++++++- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 9592334125..5d09e932c1 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -1751,6 +1751,7 @@ set(PHY_SRC_UE ${OPENAIR1_DIR}/PHY/INIT/nr_init.c ${OPENAIR1_DIR}/PHY/INIT/nr_parms.c ${OPENAIR1_DIR}/PHY/MODULATION/nr_modulation.c + ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_prs.c ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_pss.c ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_sss.c ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_pbch.c diff --git a/openair1/PHY/LTE_TRANSPORT/lte_gold_generic.c b/openair1/PHY/LTE_TRANSPORT/lte_gold_generic.c index a23f8db4f2..b4c41bcede 100644 --- a/openair1/PHY/LTE_TRANSPORT/lte_gold_generic.c +++ b/openair1/PHY/LTE_TRANSPORT/lte_gold_generic.c @@ -69,7 +69,7 @@ extern inline uint32_t lte_gold_generic(uint32_t *x1, uint32_t *x2, uint8_t res *x1 = *x1 ^ (*x1<<31) ^ (*x1<<28); *x2 = (*x2>>1) ^ (*x2>>2) ^ (*x2>>3) ^ (*x2>>4); *x2 = *x2 ^ (*x2<<31) ^ (*x2<<30) ^ (*x2<<29) ^ (*x2<<28); - + //printf("printing c= %d \n",*x1^*x2); // c(n) = [x1(n+Nc) + x2(n+Nc)]mod2 return(*x1^*x2); } diff --git a/openair1/PHY/NR_REFSIG/nr_gold.c b/openair1/PHY/NR_REFSIG/nr_gold.c index d8c9578afb..f49122579c 100644 --- a/openair1/PHY/NR_REFSIG/nr_gold.c +++ b/openair1/PHY/NR_REFSIG/nr_gold.c @@ -179,10 +179,15 @@ void nr_init_prs(PHY_VARS_gNB* gNB) c_init2 = pow10*(slotNum+symNum+1)*(2*(Nid%1024)+1); c_init3 = Nid%1024; x2 = c_init1 + c_init2 + c_init3; + for (uint8_t n=0; nnr_gold_prs[slotNum][symNum][n] = lte_gold_generic(&x1, &x2, reset); - reset = 0; + //printf("%d \n",gNB->nr_gold_prs[slotNum][symNum][n]); + //printf("printing x1= %d \n",x1); + //printf("printing x2= %d \n",x2); + reset = 0; + } } } From cf9adcab9686ca1d69a31ce56545e0349a9424ff Mon Sep 17 00:00:00 2001 From: ahadi Date: Fri, 26 Nov 2021 11:30:12 +0100 Subject: [PATCH 015/135] modulating prs --- openair1/PHY/NR_TRANSPORT/nr_prs.c | 340 ++++++++++++++++++++++++++++- 1 file changed, 339 insertions(+), 1 deletion(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_prs.c b/openair1/PHY/NR_TRANSPORT/nr_prs.c index 53fbb1a391..a4cec432de 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_prs.c +++ b/openair1/PHY/NR_TRANSPORT/nr_prs.c @@ -1,4 +1,50 @@ -//int nr_generate_prs(){} +/* + * 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 PHY/NR_TRANSPORT/nr_pbch.c +* \brief Top-level routines for generating the PBCH/BCH physical/transport channel V15.1 03/2018 +* \author Guy De Souza +* \thanks Special Thanks to Son Dang for helpful contributions and testing +* \date 2018 +* \version 0.1 +* \company Eurecom +* \email: desouza@eurecom.fr +* \note +* \warning +*/ + +#include "PHY/defs_gNB.h" +#include "PHY/NR_TRANSPORT/nr_transport_proto.h" +#include "PHY/LTE_REFSIG/lte_refsig.h" +#include "PHY/sse_intrin.h" + +//#define DEBUG_PBCH +//#define DEBUG_PBCH_ENCODING +//#define DEBUG_PBCH_DMRS + +extern short nr_qpsk_mod_table[8]; + +const uint8_t nr_pbch_payload_interleaving_pattern[32] = {16, 23, 18, 17, 8, 30, 10, 6, 24, 7, 0, 5, 3, 2, 1, 4, + 9, 11, 12, 13, 14, 15, 19, 20, 21, 22, 25, 26, 27, 28, 29, 31 + }; int nr_generate_pbch_dmrs(uint32_t *gold_pbch_dmrs, int32_t *txdataF, @@ -94,3 +140,295 @@ int nr_generate_pbch_dmrs(uint32_t *gold_pbch_dmrs, #endif return 0; } + +static void nr_pbch_scrambling(NR_gNB_PBCH *pbch, + uint32_t Nid, + uint8_t nushift, + uint16_t M, + uint16_t length, + uint8_t encoded, + uint32_t unscrambling_mask) { + uint8_t reset, offset; + uint32_t x1, x2, s=0; + uint32_t *pbch_e = pbch->pbch_e; + reset = 1; + // x1 is set in lte_gold_generic + x2 = Nid; + + // The Gold sequence is shifted by nushift* M, so we skip (nushift*M /32) double words + for (int i=0; i<(uint16_t)ceil(((float)nushift*M)/32); i++) { + s = lte_gold_generic(&x1, &x2, reset); + reset = 0; + } + + // Scrambling is now done with offset (nushift*M)%32 + offset = (nushift*M)&0x1f; +#ifdef DEBUG_PBCH_ENCODING + printf("Scrambling params: nushift %d M %d length %d encoded %d offset %d\n", nushift, M, length, encoded, offset); +#endif +#ifdef DEBUG_PBCH_ENCODING + printf("s: %04x\t", s); +#endif + int k = 0; + + if (!encoded) { + /// 1st Scrambling + for (int i = 0; i < length; ++i) { + if ((unscrambling_mask>>i)&1) + pbch->pbch_a_prime ^= ((pbch->pbch_a_interleaved>>i)&1)<pbch_a_prime ^= (((pbch->pbch_a_interleaved>>i)&1) ^ ((s>>((k+offset)&0x1f))&1))<>5] ^= (((s>>((i+offset)&0x1f))&1)<<(i&0x1f)); + } + } +} + + +void nr_init_pbch_interleaver(uint8_t *interleaver) { + uint8_t j_sfn=0, j_hrf=10, j_ssb=11, j_other=14; + memset((void *)interleaver,0, NR_POLAR_PBCH_PAYLOAD_BITS); + + for (uint8_t i=0; ipbch_a=0; + uint8_t ssb_index = ssb_pdu->ssb_pdu_rel15.SsbBlockIndex; + uint8_t *pbch_pdu = (uint8_t*)&ssb_pdu->ssb_pdu_rel15.bchPayload; + uint8_t Lmax = frame_parms->Lmax; + for (int i=0; ipbch_a |= ((pbch_pdu[i>>3]>>(7-(i&7)))&1)<pbch_a); + #endif + + // Extra byte generation + for (int i=0; i<4; i++) + pbch->pbch_a |= ((sfn>>(3-i))&1)<<(24+i); // resp. 4th, 3rd, 2nd ans 1st lsb of sfn + + pbch->pbch_a |= n_hf<<28; // half frame index bit + + if (Lmax == 64) + for (int i=0; i<3; i++) + pbch->pbch_a |= ((ssb_index>>(5-i))&1)<<(29+i); // resp. 6th, 5th and 4th bits of ssb_index + else + pbch->pbch_a |= ((config->ssb_table.ssb_subcarrier_offset.value>>4)&1)<<29; //MSB of k_SSB (bit index 4) + + LOG_D(PHY,"After extra byte: pbch_a = 0x%08x\n",pbch->pbch_a); + + // Payload interleaving + + for (int i=0; ipbch_a_interleaved |= ((pbch->pbch_a>>i)&1)<<(*(interleaver+i)); +#ifdef DEBUG_PBCH_ENCODING + printf("i %d out 0x%08x ilv %d (in>>i)&1) %d\n", i, pbch->pbch_a_interleaved, *(interleaver+i), (pbch->pbch_a>>i)&1); +#endif + } + +#ifdef DEBUG_PBCH_ENCODING + printf("Interleaving:\n"); + printf("pbch_a_interleaved: 0x%08x\n", pbch->pbch_a_interleaved); +#endif + // Scrambling + unscrambling_mask = (Lmax ==64)? 0x100006D:0x1000041; + M = (Lmax == 64)? (NR_POLAR_PBCH_PAYLOAD_BITS - 6) : (NR_POLAR_PBCH_PAYLOAD_BITS - 3); + nushift = (((sfn>>2)&1)<<1) ^ ((sfn>>1)&1); + pbch->pbch_a_prime = 0; + nr_pbch_scrambling(pbch, (uint32_t)config->cell_config.phy_cell_id.value, nushift, M, NR_POLAR_PBCH_PAYLOAD_BITS, 0, unscrambling_mask); +#ifdef DEBUG_PBCH_ENCODING + printf("Payload scrambling: nushift %d M %d sfn3 %d sfn2 %d\n", nushift, M, (sfn>>2)&1, (sfn>>1)&1); + printf("pbch_a_prime: 0x%08x\n", pbch->pbch_a_prime); +#endif + + // Encoder reversal + for (int i=0; ipbch_a_prime>>i)&1)<<(31-i); + + /// CRC, coding and rate matching + polar_encoder_fast (&a_reversed, (void*)pbch->pbch_e, 0, 0, + nr_polar_params( NR_POLAR_PBCH_MESSAGE_TYPE, NR_POLAR_PBCH_PAYLOAD_BITS, NR_POLAR_PBCH_AGGREGATION_LEVEL,0,NULL) + ); +#ifdef DEBUG_PBCH_ENCODING + printf("Channel coding:\n"); + + for (int i=0; ipbch_e[i]); + + printf("\n"); +#endif + /// Scrambling + M = NR_POLAR_PBCH_E; + nushift = (Lmax==4)? ssb_index&3 : ssb_index&7; + nr_pbch_scrambling(pbch, (uint32_t)config->cell_config.phy_cell_id.value, nushift, M, NR_POLAR_PBCH_E, 1, 0); +#ifdef DEBUG_PBCH_ENCODING + printf("Scrambling:\n"); + + for (int i=0; ipbch_e[i]); + + printf("\n"); +#endif + + /// QPSK modulation + for (int i=0; i>1; i++) { + idx = ((pbch->pbch_e[(i<<1)>>5]>>((i<<1)&0x1f))&3); + mod_pbch_e[i<<1] = nr_qpsk_mod_table[idx<<1]; + mod_pbch_e[(i<<1)+1] = nr_qpsk_mod_table[(idx<<1)+1]; +#ifdef DEBUG_PBCH + printf("i %d idx %d mod_pbch %d %d\n", i, idx, mod_pbch_e[2*i], mod_pbch_e[2*i+1]); +#endif + } + + /// Resource mapping + nushift = config->cell_config.phy_cell_id.value &3; + // PBCH modulated symbols are mapped within the SSB block on symbols 1, 2, 3 excluding the subcarriers used for the PBCH DMRS + ///symbol 1 [0:239] -- 180 mod symbols + k = frame_parms->first_carrier_offset + frame_parms->ssb_start_subcarrier; + l = ssb_start_symbol + 1; + m = 0; + + for (int ssb_sc_idx = 0; ssb_sc_idx < 240; ssb_sc_idx++) { + if ((ssb_sc_idx&3) == nushift) { //skip DMRS + k++; + continue; + } else { +#ifdef DEBUG_PBCH + printf("m %d ssb_sc_idx %d at k %d of l %d\n", m, ssb_sc_idx, k, l); +#endif + ((int16_t *)txdataF)[(l*frame_parms->ofdm_symbol_size + k)<<1] = (amp * mod_pbch_e[m<<1]) >> 15; + ((int16_t *)txdataF)[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = (amp * mod_pbch_e[(m<<1) + 1]) >> 15; + k++; + m++; + } + + if (k >= frame_parms->ofdm_symbol_size) + k-=frame_parms->ofdm_symbol_size; + } + + ///symbol 2 [0:47 ; 192:239] -- 72 mod symbols + k = frame_parms->first_carrier_offset + frame_parms->ssb_start_subcarrier; + l++; + m=180; + + for (int ssb_sc_idx = 0; ssb_sc_idx < 48; ssb_sc_idx++) { + if ((ssb_sc_idx&3) == nushift) { + k++; + continue; + } else { +#ifdef DEBUG_PBCH + printf("m %d ssb_sc_idx %d at k %d of l %d\n", m, ssb_sc_idx, k, l); +#endif + ((int16_t *)txdataF)[(l*frame_parms->ofdm_symbol_size + k)<<1] = (amp * mod_pbch_e[m<<1]) >> 15; + ((int16_t *)txdataF)[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = (amp * mod_pbch_e[(m<<1) + 1]) >> 15; + k++; + m++; + } + + if (k >= frame_parms->ofdm_symbol_size) + k-=frame_parms->ofdm_symbol_size; + } + + k += 144; + + if (k >= frame_parms->ofdm_symbol_size) + k-=frame_parms->ofdm_symbol_size; + + m=216; + + for (int ssb_sc_idx = 192; ssb_sc_idx < 240; ssb_sc_idx++) { + if ((ssb_sc_idx&3) == nushift) { + k++; + continue; + } else { +#ifdef DEBUG_PBCH + printf("m %d ssb_sc_idx %d at k %d of l %d\n", m, ssb_sc_idx, k, l); +#endif + ((int16_t *)txdataF)[(l*frame_parms->ofdm_symbol_size + k)<<1] = (amp * mod_pbch_e[m<<1]) >> 15; + ((int16_t *)txdataF)[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = (amp * mod_pbch_e[(m<<1) + 1]) >> 15; + k++; + m++; + } + + if (k >= frame_parms->ofdm_symbol_size) + k-=frame_parms->ofdm_symbol_size; + } + + ///symbol 3 [0:239] -- 180 mod symbols + k = frame_parms->first_carrier_offset + frame_parms->ssb_start_subcarrier; + l++; + m=252; + + for (int ssb_sc_idx = 0; ssb_sc_idx < 240; ssb_sc_idx++) { + if ((ssb_sc_idx&3) == nushift) { + k++; + continue; + } else { +#ifdef DEBUG_PBCH + printf("m %d ssb_sc_idx %d at k %d of l %d\n", m, ssb_sc_idx, k, l); +#endif + ((int16_t *)txdataF)[(l*frame_parms->ofdm_symbol_size + k)<<1] = (amp * mod_pbch_e[m<<1]) >> 15; + ((int16_t *)txdataF)[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = (amp * mod_pbch_e[(m<<1) + 1]) >> 15; + k++; + m++; + } + + + if (k >= frame_parms->ofdm_symbol_size) + k-=frame_parms->ofdm_symbol_size; + } + + + return 0; +} From 289c9c9469c473b1b2b285daab6f4e1478668557 Mon Sep 17 00:00:00 2001 From: ahadi Date: Fri, 26 Nov 2021 11:33:52 +0100 Subject: [PATCH 016/135] modulating prs --- openair1/PHY/NR_REFSIG/nr_gold.c | 2 +- openair1/PHY/NR_TRANSPORT/nr_prs.c | 423 +----------------- .../PHY/NR_TRANSPORT/nr_transport_proto.h | 11 +- openair1/SCHED_NR/phy_procedures_nr_gNB.c | 32 +- openair1/SCHED_NR/sched_nr.h | 2 +- 5 files changed, 55 insertions(+), 415 deletions(-) diff --git a/openair1/PHY/NR_REFSIG/nr_gold.c b/openair1/PHY/NR_REFSIG/nr_gold.c index f49122579c..0ce253e4cd 100644 --- a/openair1/PHY/NR_REFSIG/nr_gold.c +++ b/openair1/PHY/NR_REFSIG/nr_gold.c @@ -171,7 +171,7 @@ void nr_init_prs(PHY_VARS_gNB* gNB) for (slotNum = 0; slotNum < fp->slots_per_frame; slotNum++) { for (symNum = 0; symNum < fp->symbols_per_slot ; symNum++) { reset = 1; - // initial x2 for prs as 38.211 + // initial x2 for prs as ts138.211 uint32_t c_init1, c_init2, c_init3; uint32_t pow22=1<<22; uint32_t pow10=1<<10; diff --git a/openair1/PHY/NR_TRANSPORT/nr_prs.c b/openair1/PHY/NR_TRANSPORT/nr_prs.c index a4cec432de..595d9bf7fb 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_prs.c +++ b/openair1/PHY/NR_TRANSPORT/nr_prs.c @@ -1,434 +1,39 @@ -/* - * 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 PHY/NR_TRANSPORT/nr_pbch.c -* \brief Top-level routines for generating the PBCH/BCH physical/transport channel V15.1 03/2018 -* \author Guy De Souza -* \thanks Special Thanks to Son Dang for helpful contributions and testing -* \date 2018 -* \version 0.1 -* \company Eurecom -* \email: desouza@eurecom.fr -* \note -* \warning -*/ #include "PHY/defs_gNB.h" #include "PHY/NR_TRANSPORT/nr_transport_proto.h" #include "PHY/LTE_REFSIG/lte_refsig.h" #include "PHY/sse_intrin.h" -//#define DEBUG_PBCH -//#define DEBUG_PBCH_ENCODING -//#define DEBUG_PBCH_DMRS +#define DEBUG_PRS extern short nr_qpsk_mod_table[8]; -const uint8_t nr_pbch_payload_interleaving_pattern[32] = {16, 23, 18, 17, 8, 30, 10, 6, 24, 7, 0, 5, 3, 2, 1, 4, - 9, 11, 12, 13, 14, 15, 19, 20, 21, 22, 25, 26, 27, 28, 29, 31 - }; - -int nr_generate_pbch_dmrs(uint32_t *gold_pbch_dmrs, +int nr_generate_prs(uint32_t *nr_gold_prs, int32_t *txdataF, int16_t amp, uint8_t ssb_start_symbol, nfapi_nr_config_request_scf_t *config, NR_DL_FRAME_PARMS *frame_parms) { - int k,l; + //int k,l; //int16_t a; - int16_t mod_dmrs[NR_PBCH_DMRS_LENGTH<<1]; + int16_t mod_prs[NR_MAX_PRS_INIT_LENGTH_DWORD<<1]; uint8_t idx=0; uint8_t nushift = config->cell_config.phy_cell_id.value &3; - LOG_D(PHY, "PBCH DMRS mapping started at symbol %d shift %d\n", ssb_start_symbol+1, nushift); + LOG_D(PHY, "PRS mapping started at symbol %d shift %d\n", ssb_start_symbol+1, nushift); /// QPSK modulation - for (int m=0; m>5])>>((m<<1)&0x1f))&3); - mod_dmrs[m<<1] = nr_qpsk_mod_table[idx<<1]; - mod_dmrs[(m<<1)+1] = nr_qpsk_mod_table[(idx<<1) + 1]; -#ifdef DEBUG_PBCH_DMRS - printf("m %d idx %d gold seq %d b0-b1 %d-%d mod_dmrs %d %d\n", m, idx, gold_pbch_dmrs[(m<<1)>>5], (((gold_pbch_dmrs[(m<<1)>>5])>>((m<<1)&0x1f))&1), - (((gold_pbch_dmrs[((m<<1)+1)>>5])>>(((m<<1)+1)&0x1f))&1), mod_dmrs[(m<<1)], mod_dmrs[(m<<1)+1]); + for (int m=0; m>5])>>((m<<1)&0x1f))&3); + mod_prs[m<<1] = nr_qpsk_mod_table[idx<<1]; + mod_prs[(m<<1)+1] = nr_qpsk_mod_table[(idx<<1) + 1]; + +#ifdef DEBUG_PRS + printf("m %d idx %d gold seq %d b0-b1 %d-%d mod_prs %d %d\n", m, idx, nr_gold_prs[(m<<1)>>5], (((nr_gold_prs[(m<<1)>>5])>>((m<<1)&0x1f))&1), + (((nr_gold_prs[((m<<1)+1)>>5])>>(((m<<1)+1)&0x1f))&1), mod_prs[(m<<1)], mod_prs[(m<<1)+1]); #endif } - - /// Resource mapping - // PBCH DMRS are mapped within the SSB block on every fourth subcarrier starting from nushift of symbols 1, 2, 3 - ///symbol 1 [0+nushift:4:236+nushift] -- 60 mod symbols - k = frame_parms->first_carrier_offset + frame_parms->ssb_start_subcarrier + nushift; - l = ssb_start_symbol + 1; - - for (int m = 0; m < 60; m++) { -#ifdef DEBUG_PBCH_DMRS - printf("m %d at k %d of l %d\n", m, k, l); -#endif - ((int16_t *)txdataF)[(l*frame_parms->ofdm_symbol_size + k)<<1] = (amp * mod_dmrs[m<<1]) >> 15; - ((int16_t *)txdataF)[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = (amp * mod_dmrs[(m<<1) + 1]) >> 15; -#ifdef DEBUG_PBCH_DMRS - printf("(%d,%d)\n", - ((int16_t *)txdataF)[(l*frame_parms->ofdm_symbol_size + k)<<1], - ((int16_t *)txdataF)[((l*frame_parms->ofdm_symbol_size + k)<<1)+1]); -#endif - k+=4; - - if (k >= frame_parms->ofdm_symbol_size) - k-=frame_parms->ofdm_symbol_size; - } - - ///symbol 2 [0+u:4:44+nushift ; 192+nu:4:236+nushift] -- 24 mod symbols - k = frame_parms->first_carrier_offset + frame_parms->ssb_start_subcarrier + nushift; - l++; - - for (int m = 60; m < 84; m++) { -#ifdef DEBUG_PBCH_DMRS - printf("m %d at k %d of l %d\n", m, k, l); -#endif - ((int16_t *)txdataF)[(l*frame_parms->ofdm_symbol_size + k)<<1] = (amp * mod_dmrs[m<<1]) >> 15; - ((int16_t *)txdataF)[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = (amp * mod_dmrs[(m<<1) + 1]) >> 15; -#ifdef DEBUG_PBCH_DMRS - printf("(%d,%d)\n", - ((int16_t *)txdataF)[(l*frame_parms->ofdm_symbol_size + k)<<1], - ((int16_t *)txdataF)[((l*frame_parms->ofdm_symbol_size + k)<<1)+1]); -#endif - k+=(m==71)?148:4; // Jump from 44+nu to 192+nu - - if (k >= frame_parms->ofdm_symbol_size) - k-=frame_parms->ofdm_symbol_size; - } - - ///symbol 3 [0+nushift:4:236+nushift] -- 60 mod symbols - k = frame_parms->first_carrier_offset + frame_parms->ssb_start_subcarrier + nushift; - l++; - - for (int m = 84; m < NR_PBCH_DMRS_LENGTH; m++) { -#ifdef DEBUG_PBCH_DMRS - printf("m %d at k %d of l %d\n", m, k, l); -#endif - ((int16_t *)txdataF)[(l*frame_parms->ofdm_symbol_size + k)<<1] = (amp * mod_dmrs[m<<1]) >> 15; - ((int16_t *)txdataF)[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = (amp * mod_dmrs[(m<<1) + 1]) >> 15; -#ifdef DEBUG_PBCH_DMRS - printf("(%d,%d)\n", - ((int16_t *)txdataF)[(l*frame_parms->ofdm_symbol_size + k)<<1], - ((int16_t *)txdataF)[((l*frame_parms->ofdm_symbol_size + k)<<1)+1]); -#endif - k+=4; - - if (k >= frame_parms->ofdm_symbol_size) - k-=frame_parms->ofdm_symbol_size; - } - -#ifdef DEBUG_PBCH_DMRS - write_output("txdataF_pbch_dmrs.m", "txdataF_pbch_dmrs", txdataF[0], frame_parms->samples_per_frame_wCP>>1, 1, 1); -#endif return 0; } - -static void nr_pbch_scrambling(NR_gNB_PBCH *pbch, - uint32_t Nid, - uint8_t nushift, - uint16_t M, - uint16_t length, - uint8_t encoded, - uint32_t unscrambling_mask) { - uint8_t reset, offset; - uint32_t x1, x2, s=0; - uint32_t *pbch_e = pbch->pbch_e; - reset = 1; - // x1 is set in lte_gold_generic - x2 = Nid; - - // The Gold sequence is shifted by nushift* M, so we skip (nushift*M /32) double words - for (int i=0; i<(uint16_t)ceil(((float)nushift*M)/32); i++) { - s = lte_gold_generic(&x1, &x2, reset); - reset = 0; - } - - // Scrambling is now done with offset (nushift*M)%32 - offset = (nushift*M)&0x1f; -#ifdef DEBUG_PBCH_ENCODING - printf("Scrambling params: nushift %d M %d length %d encoded %d offset %d\n", nushift, M, length, encoded, offset); -#endif -#ifdef DEBUG_PBCH_ENCODING - printf("s: %04x\t", s); -#endif - int k = 0; - - if (!encoded) { - /// 1st Scrambling - for (int i = 0; i < length; ++i) { - if ((unscrambling_mask>>i)&1) - pbch->pbch_a_prime ^= ((pbch->pbch_a_interleaved>>i)&1)<pbch_a_prime ^= (((pbch->pbch_a_interleaved>>i)&1) ^ ((s>>((k+offset)&0x1f))&1))<>5] ^= (((s>>((i+offset)&0x1f))&1)<<(i&0x1f)); - } - } -} + -void nr_init_pbch_interleaver(uint8_t *interleaver) { - uint8_t j_sfn=0, j_hrf=10, j_ssb=11, j_other=14; - memset((void *)interleaver,0, NR_POLAR_PBCH_PAYLOAD_BITS); - - for (uint8_t i=0; ipbch_a=0; - uint8_t ssb_index = ssb_pdu->ssb_pdu_rel15.SsbBlockIndex; - uint8_t *pbch_pdu = (uint8_t*)&ssb_pdu->ssb_pdu_rel15.bchPayload; - uint8_t Lmax = frame_parms->Lmax; - for (int i=0; ipbch_a |= ((pbch_pdu[i>>3]>>(7-(i&7)))&1)<pbch_a); - #endif - - // Extra byte generation - for (int i=0; i<4; i++) - pbch->pbch_a |= ((sfn>>(3-i))&1)<<(24+i); // resp. 4th, 3rd, 2nd ans 1st lsb of sfn - - pbch->pbch_a |= n_hf<<28; // half frame index bit - - if (Lmax == 64) - for (int i=0; i<3; i++) - pbch->pbch_a |= ((ssb_index>>(5-i))&1)<<(29+i); // resp. 6th, 5th and 4th bits of ssb_index - else - pbch->pbch_a |= ((config->ssb_table.ssb_subcarrier_offset.value>>4)&1)<<29; //MSB of k_SSB (bit index 4) - - LOG_D(PHY,"After extra byte: pbch_a = 0x%08x\n",pbch->pbch_a); - - // Payload interleaving - - for (int i=0; ipbch_a_interleaved |= ((pbch->pbch_a>>i)&1)<<(*(interleaver+i)); -#ifdef DEBUG_PBCH_ENCODING - printf("i %d out 0x%08x ilv %d (in>>i)&1) %d\n", i, pbch->pbch_a_interleaved, *(interleaver+i), (pbch->pbch_a>>i)&1); -#endif - } - -#ifdef DEBUG_PBCH_ENCODING - printf("Interleaving:\n"); - printf("pbch_a_interleaved: 0x%08x\n", pbch->pbch_a_interleaved); -#endif - // Scrambling - unscrambling_mask = (Lmax ==64)? 0x100006D:0x1000041; - M = (Lmax == 64)? (NR_POLAR_PBCH_PAYLOAD_BITS - 6) : (NR_POLAR_PBCH_PAYLOAD_BITS - 3); - nushift = (((sfn>>2)&1)<<1) ^ ((sfn>>1)&1); - pbch->pbch_a_prime = 0; - nr_pbch_scrambling(pbch, (uint32_t)config->cell_config.phy_cell_id.value, nushift, M, NR_POLAR_PBCH_PAYLOAD_BITS, 0, unscrambling_mask); -#ifdef DEBUG_PBCH_ENCODING - printf("Payload scrambling: nushift %d M %d sfn3 %d sfn2 %d\n", nushift, M, (sfn>>2)&1, (sfn>>1)&1); - printf("pbch_a_prime: 0x%08x\n", pbch->pbch_a_prime); -#endif - - // Encoder reversal - for (int i=0; ipbch_a_prime>>i)&1)<<(31-i); - - /// CRC, coding and rate matching - polar_encoder_fast (&a_reversed, (void*)pbch->pbch_e, 0, 0, - nr_polar_params( NR_POLAR_PBCH_MESSAGE_TYPE, NR_POLAR_PBCH_PAYLOAD_BITS, NR_POLAR_PBCH_AGGREGATION_LEVEL,0,NULL) - ); -#ifdef DEBUG_PBCH_ENCODING - printf("Channel coding:\n"); - - for (int i=0; ipbch_e[i]); - - printf("\n"); -#endif - /// Scrambling - M = NR_POLAR_PBCH_E; - nushift = (Lmax==4)? ssb_index&3 : ssb_index&7; - nr_pbch_scrambling(pbch, (uint32_t)config->cell_config.phy_cell_id.value, nushift, M, NR_POLAR_PBCH_E, 1, 0); -#ifdef DEBUG_PBCH_ENCODING - printf("Scrambling:\n"); - - for (int i=0; ipbch_e[i]); - - printf("\n"); -#endif - - /// QPSK modulation - for (int i=0; i>1; i++) { - idx = ((pbch->pbch_e[(i<<1)>>5]>>((i<<1)&0x1f))&3); - mod_pbch_e[i<<1] = nr_qpsk_mod_table[idx<<1]; - mod_pbch_e[(i<<1)+1] = nr_qpsk_mod_table[(idx<<1)+1]; -#ifdef DEBUG_PBCH - printf("i %d idx %d mod_pbch %d %d\n", i, idx, mod_pbch_e[2*i], mod_pbch_e[2*i+1]); -#endif - } - - /// Resource mapping - nushift = config->cell_config.phy_cell_id.value &3; - // PBCH modulated symbols are mapped within the SSB block on symbols 1, 2, 3 excluding the subcarriers used for the PBCH DMRS - ///symbol 1 [0:239] -- 180 mod symbols - k = frame_parms->first_carrier_offset + frame_parms->ssb_start_subcarrier; - l = ssb_start_symbol + 1; - m = 0; - - for (int ssb_sc_idx = 0; ssb_sc_idx < 240; ssb_sc_idx++) { - if ((ssb_sc_idx&3) == nushift) { //skip DMRS - k++; - continue; - } else { -#ifdef DEBUG_PBCH - printf("m %d ssb_sc_idx %d at k %d of l %d\n", m, ssb_sc_idx, k, l); -#endif - ((int16_t *)txdataF)[(l*frame_parms->ofdm_symbol_size + k)<<1] = (amp * mod_pbch_e[m<<1]) >> 15; - ((int16_t *)txdataF)[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = (amp * mod_pbch_e[(m<<1) + 1]) >> 15; - k++; - m++; - } - - if (k >= frame_parms->ofdm_symbol_size) - k-=frame_parms->ofdm_symbol_size; - } - - ///symbol 2 [0:47 ; 192:239] -- 72 mod symbols - k = frame_parms->first_carrier_offset + frame_parms->ssb_start_subcarrier; - l++; - m=180; - - for (int ssb_sc_idx = 0; ssb_sc_idx < 48; ssb_sc_idx++) { - if ((ssb_sc_idx&3) == nushift) { - k++; - continue; - } else { -#ifdef DEBUG_PBCH - printf("m %d ssb_sc_idx %d at k %d of l %d\n", m, ssb_sc_idx, k, l); -#endif - ((int16_t *)txdataF)[(l*frame_parms->ofdm_symbol_size + k)<<1] = (amp * mod_pbch_e[m<<1]) >> 15; - ((int16_t *)txdataF)[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = (amp * mod_pbch_e[(m<<1) + 1]) >> 15; - k++; - m++; - } - - if (k >= frame_parms->ofdm_symbol_size) - k-=frame_parms->ofdm_symbol_size; - } - - k += 144; - - if (k >= frame_parms->ofdm_symbol_size) - k-=frame_parms->ofdm_symbol_size; - - m=216; - - for (int ssb_sc_idx = 192; ssb_sc_idx < 240; ssb_sc_idx++) { - if ((ssb_sc_idx&3) == nushift) { - k++; - continue; - } else { -#ifdef DEBUG_PBCH - printf("m %d ssb_sc_idx %d at k %d of l %d\n", m, ssb_sc_idx, k, l); -#endif - ((int16_t *)txdataF)[(l*frame_parms->ofdm_symbol_size + k)<<1] = (amp * mod_pbch_e[m<<1]) >> 15; - ((int16_t *)txdataF)[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = (amp * mod_pbch_e[(m<<1) + 1]) >> 15; - k++; - m++; - } - - if (k >= frame_parms->ofdm_symbol_size) - k-=frame_parms->ofdm_symbol_size; - } - - ///symbol 3 [0:239] -- 180 mod symbols - k = frame_parms->first_carrier_offset + frame_parms->ssb_start_subcarrier; - l++; - m=252; - - for (int ssb_sc_idx = 0; ssb_sc_idx < 240; ssb_sc_idx++) { - if ((ssb_sc_idx&3) == nushift) { - k++; - continue; - } else { -#ifdef DEBUG_PBCH - printf("m %d ssb_sc_idx %d at k %d of l %d\n", m, ssb_sc_idx, k, l); -#endif - ((int16_t *)txdataF)[(l*frame_parms->ofdm_symbol_size + k)<<1] = (amp * mod_pbch_e[m<<1]) >> 15; - ((int16_t *)txdataF)[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = (amp * mod_pbch_e[(m<<1) + 1]) >> 15; - k++; - m++; - } - - - if (k >= frame_parms->ofdm_symbol_size) - k-=frame_parms->ofdm_symbol_size; - } - - - return 0; -} diff --git a/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h b/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h index 2d403008cc..5dcc54dac3 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h +++ b/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h @@ -39,15 +39,20 @@ #define NR_PBCH_PDU_BITS 24 + +int nr_generate_prs(uint32_t *nr_gold_prs, + int32_t *txdataF, + int16_t amp, + uint8_t ssb_start_symbol, + nfapi_nr_config_request_scf_t *config, + NR_DL_FRAME_PARMS *frame_parms); + /*! \fn int nr_generate_pss \brief Generation of the NR PSS @param @returns 0 on success */ - -int nr_generate_prs(); - int nr_generate_pss(int16_t *d_pss, int32_t *txdataF, int16_t amp, diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index ad50e31c85..3dee1a717d 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -126,12 +126,36 @@ void nr_common_signal_procedures (PHY_VARS_gNB *gNB,int frame,int slot,nfapi_nr_ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB, int frame,int slot, - int do_meas) { + int do_meas, + nfapi_nr_dl_tti_ssb_pdu ssb_pdu) { int aa; NR_DL_FRAME_PARMS *fp=&gNB->frame_parms; nfapi_nr_config_request_scf_t *cfg = &gNB->gNB_config; int offset = gNB->CC_id; int txdataF_offset = (slot%2)*fp->samples_per_slot_wCP; + + // defining inputs and initials for nr_generate_prs() + int **txdataF = gNB->common_vars.txdataF; + uint8_t ssb_index, n_hf; + ssb_index = ssb_pdu.ssb_pdu_rel15.SsbBlockIndex; + LOG_D(PHY,"common_signal_procedures: frame %d, slot %d ssb index %d\n",frame,slot,ssb_index); + + uint16_t ssb_start_symbol; + int ssb_start_symbol_abs = nr_get_ssb_start_symbol(fp,ssb_index); // computing the starting symbol for current ssb + ssb_start_symbol = ssb_start_symbol_abs % fp->symbols_per_slot; // start symbol wrt slot + + + + uint16_t slots_per_hf = (fp->slots_per_frame)>>1; + + if (slotcell_config.frame_duplex_type.value == TDD) && (nr_slot_select(cfg,frame,slot) == NR_UPLINK_SLOT)) return; @@ -208,6 +232,12 @@ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB, //TODO: nr_generate_prs // check if we have prs to transmit in this frame and slot + + if (cfg->carrier_config.num_tx_ant.value <= 4) + nr_generate_prs(gNB->nr_gold_pbch_dmrs[n_hf][ssb_index&7],&txdataF[0][txdataF_offset], AMP, ssb_start_symbol, cfg, fp); + else + nr_generate_prs(gNB->nr_gold_pbch_dmrs[0][ssb_index&7],&txdataF[0][txdataF_offset], AMP, ssb_start_symbol, cfg, fp); + if (do_meas==1) stop_meas(&gNB->phy_proc_tx); diff --git a/openair1/SCHED_NR/sched_nr.h b/openair1/SCHED_NR/sched_nr.h index 5e31c08d38..0002eb8d50 100644 --- a/openair1/SCHED_NR/sched_nr.h +++ b/openair1/SCHED_NR/sched_nr.h @@ -36,7 +36,7 @@ void fill_ul_rb_mask(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx); void nr_set_ssb_first_subcarrier(nfapi_nr_config_request_scf_t *cfg, NR_DL_FRAME_PARMS *fp); -void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB, int frame_tx, int slot_tx, int do_meas); +void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB, int frame_tx, int slot_tx, int do_meas,nfapi_nr_dl_tti_ssb_pdu ssb_pdu); void phy_procedures_gNB_common_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx); int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx); void L1_nr_prach_procedures(PHY_VARS_gNB *gNB,int frame,int slot); From f136f047c00cb760ffd8d6b9344a99d4d0994e96 Mon Sep 17 00:00:00 2001 From: ahadi Date: Sun, 28 Nov 2021 18:37:01 +0100 Subject: [PATCH 017/135] update --- openair1/PHY/NR_REFSIG/nr_gold.c | 9 ++++----- openair1/PHY/NR_REFSIG/nr_refsig.h | 7 +++++++ openair1/PHY/NR_TRANSPORT/nr_prs.c | 3 ++- openair1/SCHED_NR/phy_procedures_nr_gNB.c | 23 +++++++++++++++-------- 4 files changed, 28 insertions(+), 14 deletions(-) diff --git a/openair1/PHY/NR_REFSIG/nr_gold.c b/openair1/PHY/NR_REFSIG/nr_gold.c index 0ce253e4cd..4f688944a4 100644 --- a/openair1/PHY/NR_REFSIG/nr_gold.c +++ b/openair1/PHY/NR_REFSIG/nr_gold.c @@ -45,6 +45,7 @@ void nr_init_pbch_dmrs(PHY_VARS_gNB* gNB) for (uint8_t n=0; nnr_gold_pbch_dmrs[n_hf][l][n] = lte_gold_generic(&x1, &x2, reset); + //printf("%d \n",gNB->nr_gold_pbch_dmrs[n_hf][l][n]); reset = 0; } @@ -182,11 +183,9 @@ void nr_init_prs(PHY_VARS_gNB* gNB) for (uint8_t n=0; nnr_gold_prs[slotNum][symNum][n] = lte_gold_generic(&x1, &x2, reset); - //printf("%d \n",gNB->nr_gold_prs[slotNum][symNum][n]); - //printf("printing x1= %d \n",x1); - //printf("printing x2= %d \n",x2); - reset = 0; + gNB->nr_gold_prs[slotNum][symNum][n] = lte_gold_generic(&x1, &x2, reset); + reset = 0; + //printf("%d \n",gNB->nr_gold_prs[slotNum][symNum][n]); } } diff --git a/openair1/PHY/NR_REFSIG/nr_refsig.h b/openair1/PHY/NR_REFSIG/nr_refsig.h index aedc535c29..964da6d876 100644 --- a/openair1/PHY/NR_REFSIG/nr_refsig.h +++ b/openair1/PHY/NR_REFSIG/nr_refsig.h @@ -32,6 +32,13 @@ @param PHY_VARS_gNB* gNB structure provides configuration, frame parameters and the pointers to the 32 bits sequence storage tables */ void nr_init_pbch_dmrs(PHY_VARS_gNB* gNB); + +/* +This function generates NR Gold Sequence(ts 138.211) for the PRS. +@param PHY_VARS_gNB* gNB structure provides configuration, frame parameters and the pointers to the 32 bits sequence storage tables +*/ +void nr_init_prs(PHY_VARS_gNB* gNB); + /*!\brief This function generates the NR Gold sequence (38-211, Sec 5.2.1) for the PDCCH DMRS. @param PHY_VARS_gNB* gNB structure provides configuration, frame parameters and the pointers to the 32 bits sequence storage tables @param Nid is used for the initialization of x2, Physical cell Id by default or upper layer configured pdcch_scrambling_ID diff --git a/openair1/PHY/NR_TRANSPORT/nr_prs.c b/openair1/PHY/NR_TRANSPORT/nr_prs.c index 595d9bf7fb..4d966b08dd 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_prs.c +++ b/openair1/PHY/NR_TRANSPORT/nr_prs.c @@ -2,6 +2,7 @@ #include "PHY/defs_gNB.h" #include "PHY/NR_TRANSPORT/nr_transport_proto.h" #include "PHY/LTE_REFSIG/lte_refsig.h" +#include "PHY/NR_REFSIG/nr_refsig.h" #include "PHY/sse_intrin.h" #define DEBUG_PRS @@ -16,7 +17,7 @@ int nr_generate_prs(uint32_t *nr_gold_prs, NR_DL_FRAME_PARMS *frame_parms) { //int k,l; //int16_t a; - int16_t mod_prs[NR_MAX_PRS_INIT_LENGTH_DWORD<<1]; + int16_t mod_prs[NR_MAX_PRS_LENGTH<<1]; uint8_t idx=0; uint8_t nushift = config->cell_config.phy_cell_id.value &3; LOG_D(PHY, "PRS mapping started at symbol %d shift %d\n", ssb_start_symbol+1, nushift); diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index 3dee1a717d..d3653510ac 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -93,11 +93,22 @@ void nr_common_signal_procedures (PHY_VARS_gNB *gNB,int frame,int slot,nfapi_nr_ LOG_D(PHY,"SS TX: frame %d, slot %d, start_symbol %d\n",frame,slot, ssb_start_symbol); nr_generate_pss(gNB->d_pss, &txdataF[0][txdataF_offset], AMP, ssb_start_symbol, cfg, fp); nr_generate_sss(gNB->d_sss, &txdataF[0][txdataF_offset], AMP, ssb_start_symbol, cfg, fp); + + //nr_generate_prs(gNB->nr_gold_prs[n_hf][ssb_index&7],&txdataF[0][txdataF_offset], AMP, ssb_start_symbol, cfg, fp); + if (cfg->carrier_config.num_tx_ant.value <= 4) nr_generate_pbch_dmrs(gNB->nr_gold_pbch_dmrs[n_hf][ssb_index&7],&txdataF[0][txdataF_offset], AMP, ssb_start_symbol, cfg, fp); + else nr_generate_pbch_dmrs(gNB->nr_gold_pbch_dmrs[0][ssb_index&7],&txdataF[0][txdataF_offset], AMP, ssb_start_symbol, cfg, fp); + + + if (cfg->carrier_config.num_tx_ant.value <= 4) + nr_generate_prs(gNB->nr_gold_prs[n_hf][ssb_index&7],&txdataF[0][txdataF_offset], AMP, ssb_start_symbol, cfg, fp); + else + nr_generate_prs(gNB->nr_gold_prs[0][ssb_index&7],&txdataF[0][txdataF_offset], AMP, ssb_start_symbol, cfg, fp); + if (T_ACTIVE(T_GNB_PHY_MIB)) { unsigned char bch[3]; @@ -154,9 +165,6 @@ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB, n_hf=1; - - - if ((cfg->cell_config.frame_duplex_type.value == TDD) && (nr_slot_select(cfg,frame,slot) == NR_UPLINK_SLOT)) return; @@ -232,12 +240,11 @@ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB, //TODO: nr_generate_prs // check if we have prs to transmit in this frame and slot - + if (cfg->carrier_config.num_tx_ant.value <= 4) - nr_generate_prs(gNB->nr_gold_pbch_dmrs[n_hf][ssb_index&7],&txdataF[0][txdataF_offset], AMP, ssb_start_symbol, cfg, fp); - else - nr_generate_prs(gNB->nr_gold_pbch_dmrs[0][ssb_index&7],&txdataF[0][txdataF_offset], AMP, ssb_start_symbol, cfg, fp); - + nr_generate_prs(gNB->nr_gold_prs[n_hf][ssb_index&7],&txdataF[0][txdataF_offset], AMP, ssb_start_symbol, cfg, fp); + else + nr_generate_prs(gNB->nr_gold_prs[0][ssb_index&7],&txdataF[0][txdataF_offset], AMP, ssb_start_symbol, cfg, fp); if (do_meas==1) stop_meas(&gNB->phy_proc_tx); From a6fd47077264b6d41433f36a0f6939b5b166c419 Mon Sep 17 00:00:00 2001 From: ahadi Date: Tue, 30 Nov 2021 20:08:40 +0100 Subject: [PATCH 018/135] prs resource mapping --- openair1/PHY/NR_TRANSPORT/nr_prs.c | 70 +++++++++++++++++++++++++++--- 1 file changed, 63 insertions(+), 7 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_prs.c b/openair1/PHY/NR_TRANSPORT/nr_prs.c index 4d966b08dd..5e1e0b2352 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_prs.c +++ b/openair1/PHY/NR_TRANSPORT/nr_prs.c @@ -5,7 +5,8 @@ #include "PHY/NR_REFSIG/nr_refsig.h" #include "PHY/sse_intrin.h" -#define DEBUG_PRS +//#define DEBUG_PRS +#define DEBUG_PRS_MAP extern short nr_qpsk_mod_table[8]; @@ -15,14 +16,25 @@ int nr_generate_prs(uint32_t *nr_gold_prs, uint8_t ssb_start_symbol, nfapi_nr_config_request_scf_t *config, NR_DL_FRAME_PARMS *frame_parms) { - //int k,l; - //int16_t a; + + + // Get K_Prime from the table for the length of PRS or LPRS + int k_prime_table[4][12] = { + {0,1,0,1,0,1,0,1,0,1,0,1}, + {0,2,1,3,0,2,1,3,0,2,1,3}, + {0,3,1,4,2,5,0,3,1,4,2,5}, + {0,6,3,9,1,7,4,10,2,8,5,11}}; + + int k_prime = 0; + int k=0; int16_t mod_prs[NR_MAX_PRS_LENGTH<<1]; uint8_t idx=0; - uint8_t nushift = config->cell_config.phy_cell_id.value &3; - LOG_D(PHY, "PRS mapping started at symbol %d shift %d\n", ssb_start_symbol+1, nushift); - - /// QPSK modulation + uint8_t combSize = 6; + uint8_t REOffset = 0; + uint8_t symbolStart = 5; + uint8_t NumPRSSymbols = 6; + + // QPSK modulation for (int m=0; m>5])>>((m<<1)&0x1f))&3); mod_prs[m<<1] = nr_qpsk_mod_table[idx<<1]; @@ -33,8 +45,52 @@ int nr_generate_prs(uint32_t *nr_gold_prs, (((nr_gold_prs[((m<<1)+1)>>5])>>(((m<<1)+1)&0x1f))&1), mod_prs[(m<<1)], mod_prs[(m<<1)+1]); #endif } + + // PRS resource mapping with combsize=k which means PRS symbols exist in every k-th subcarrier in frequency domain + // According to ts138.211 sec.7.4.1.7.2 + + for (int l = symbolStart; l < symbolStart + NumPRSSymbols; l++) { + + int symInd = l-5; + if (combSize==2) { + k_prime = k_prime_table[0][symInd]; + } + else if (combSize==4){ + k_prime = k_prime_table[1][symInd]; + } + else if (combSize==6){ + k_prime = k_prime_table[2][symInd]; + } + else if (combSize==12){ + k_prime = k_prime_table[3][symInd]; + } + + for (int m = 0; m < NR_MAX_PRS_LENGTH; m++) { +#ifdef DEBUG_PRS_MAP + printf("m %d at k %d of l %d\n", m, k, l); +#endif + + + ((int16_t *)txdataF)[(l*frame_parms->ofdm_symbol_size + k)<<1] = (amp * mod_prs[m<<1]) >> 15; + ((int16_t *)txdataF)[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = (amp * mod_prs[(m<<1) + 1]) >> 15; + +#ifdef DEBUG_PRS_MAP + printf("(%d,%d)\n", + ((int16_t *)txdataF)[(l*frame_parms->ofdm_symbol_size + k)<<1], + ((int16_t *)txdataF)[((l*frame_parms->ofdm_symbol_size + k)<<1)+1]); +#endif + + k=m*combSize+(REOffset+k_prime)%combSize; + + //if (k >= frame_parms->ofdm_symbol_size) + //k-=frame_parms->ofdm_symbol_size; + + } + } + return 0; } + From 54c5bb1d4871cf862569e21c4ea1fac593d20d30 Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Thu, 2 Dec 2021 16:03:41 +0100 Subject: [PATCH 019/135] some bugfixing --- openair1/PHY/NR_TRANSPORT/nr_prs.c | 65 ++++++++++--------- .../PHY/NR_TRANSPORT/nr_transport_proto.h | 4 +- openair1/PHY/defs_gNB.h | 19 ++++++ openair1/SCHED_NR/phy_procedures_nr_gNB.c | 24 +++---- 4 files changed, 67 insertions(+), 45 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_prs.c b/openair1/PHY/NR_TRANSPORT/nr_prs.c index 5e1e0b2352..eba6be157a 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_prs.c +++ b/openair1/PHY/NR_TRANSPORT/nr_prs.c @@ -10,10 +10,10 @@ extern short nr_qpsk_mod_table[8]; -int nr_generate_prs(uint32_t *nr_gold_prs, +int nr_generate_prs(uint32_t **nr_gold_prs, int32_t *txdataF, int16_t amp, - uint8_t ssb_start_symbol, + prs_data_t *prs_data, nfapi_nr_config_request_scf_t *config, NR_DL_FRAME_PARMS *frame_parms) { @@ -33,41 +33,42 @@ int nr_generate_prs(uint32_t *nr_gold_prs, uint8_t REOffset = 0; uint8_t symbolStart = 5; uint8_t NumPRSSymbols = 6; + uint16_t NumPRBs = 106; // QPSK modulation - for (int m=0; m>5])>>((m<<1)&0x1f))&3); - mod_prs[m<<1] = nr_qpsk_mod_table[idx<<1]; - mod_prs[(m<<1)+1] = nr_qpsk_mod_table[(idx<<1) + 1]; - -#ifdef DEBUG_PRS - printf("m %d idx %d gold seq %d b0-b1 %d-%d mod_prs %d %d\n", m, idx, nr_gold_prs[(m<<1)>>5], (((nr_gold_prs[(m<<1)>>5])>>((m<<1)&0x1f))&1), - (((nr_gold_prs[((m<<1)+1)>>5])>>(((m<<1)+1)&0x1f))&1), mod_prs[(m<<1)], mod_prs[(m<<1)+1]); -#endif - } // PRS resource mapping with combsize=k which means PRS symbols exist in every k-th subcarrier in frequency domain // According to ts138.211 sec.7.4.1.7.2 for (int l = symbolStart; l < symbolStart + NumPRSSymbols; l++) { - int symInd = l-5; - if (combSize==2) { - k_prime = k_prime_table[0][symInd]; - } - else if (combSize==4){ - k_prime = k_prime_table[1][symInd]; - } - else if (combSize==6){ - k_prime = k_prime_table[2][symInd]; - } - else if (combSize==12){ - k_prime = k_prime_table[3][symInd]; - } - - for (int m = 0; m < NR_MAX_PRS_LENGTH; m++) { + int symInd = l-5; + if (combSize==2) { + k_prime = k_prime_table[0][symInd]; + } + else if (combSize==4){ + k_prime = k_prime_table[1][symInd]; + } + else if (combSize==6){ + k_prime = k_prime_table[2][symInd]; + } + else if (combSize==12){ + k_prime = k_prime_table[3][symInd]; + } + + k = (REOffset+k_prime)%combSize + frame_parms->ssb_start_subcarrier; + for (int m = 0; m < 12/combSize*NumPRBs; m++) { + #ifdef DEBUG_PRS_MAP - printf("m %d at k %d of l %d\n", m, k, l); + printf("m %d at k %d of l %d\n", m, k, l); +#endif + + idx = nr_gold_prs[l][m]; + mod_prs[m<<1] = nr_qpsk_mod_table[idx<<1]; + mod_prs[(m<<1)+1] = nr_qpsk_mod_table[(idx<<1) + 1]; + +#ifdef DEBUG_PRS + printf("m %d idx %d gold seq %d mod_prs %d %d\n", m, idx, nr_gold_prs[l][m], mod_prs[(idx<<1)], mod_prs[(idx<<1)+1]); #endif @@ -79,11 +80,11 @@ int nr_generate_prs(uint32_t *nr_gold_prs, ((int16_t *)txdataF)[(l*frame_parms->ofdm_symbol_size + k)<<1], ((int16_t *)txdataF)[((l*frame_parms->ofdm_symbol_size + k)<<1)+1]); #endif - - k=m*combSize+(REOffset+k_prime)%combSize; - //if (k >= frame_parms->ofdm_symbol_size) - //k-=frame_parms->ofdm_symbol_size; + k = k + combSize; + + if (k >= frame_parms->ofdm_symbol_size) + k-=frame_parms->ofdm_symbol_size; } } diff --git a/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h b/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h index 5dcc54dac3..75dcb5c606 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h +++ b/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h @@ -40,10 +40,10 @@ #define NR_PBCH_PDU_BITS 24 -int nr_generate_prs(uint32_t *nr_gold_prs, +int nr_generate_prs(uint32_t **nr_gold_prs, int32_t *txdataF, int16_t amp, - uint8_t ssb_start_symbol, + prs_data_t *prs_data, nfapi_nr_config_request_scf_t *config, NR_DL_FRAME_PARMS *frame_parms); diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h index 577fbfa1d9..2c8ef9eff6 100644 --- a/openair1/PHY/defs_gNB.h +++ b/openair1/PHY/defs_gNB.h @@ -949,4 +949,23 @@ typedef struct processingData_L1 { PHY_VARS_gNB *gNB; } processingData_L1_t; +// structures prototype +typedef struct prs { + int PRSResourceSetPeriod[2]; //[slot period, slot offset] + int PRSResourceOffset; // array if more than one resource sets.slot offset (0...511) (default 0) + int PRSResourceRepetition;// slot offset (1 (default), 2, 4, 6, 8, 16, 32) + int PRSResourceTimeGap; // slot offset (1 (default), 2, 4, 6, 8, 16, 32) + int NumRB; //number of RBs in freq domain a scalar =< 275 RB + int NumPRSSymbols; //number of PRS symbols in time domain + int SymbolStart; //starting OFDM symbol of PRS resource in time domain + int RBOffset; //Starting PRB index of all PRS resources in a PRS resource set. + int CombSize; //RE density of all PRS resources in a PRS resource set. i∈{2,4,6,12} + int REOffset; //Starting RE offset in the first OFDM symbol of each PRS resource in a PRS resource set. + int MutingPattern1[2]; //Muting bit pattern option-1, specified as [] or a binary-valued vector of length 2, 4, 6, 8, 16, or 32. + int MutingPattern2[2]; + int MutingBitRepetition; + int NPRSID; +} prs_data_t; + + #endif diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index d3653510ac..8288bb9d51 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -103,11 +103,12 @@ void nr_common_signal_procedures (PHY_VARS_gNB *gNB,int frame,int slot,nfapi_nr_ else nr_generate_pbch_dmrs(gNB->nr_gold_pbch_dmrs[0][ssb_index&7],&txdataF[0][txdataF_offset], AMP, ssb_start_symbol, cfg, fp); - - if (cfg->carrier_config.num_tx_ant.value <= 4) - nr_generate_prs(gNB->nr_gold_prs[n_hf][ssb_index&7],&txdataF[0][txdataF_offset], AMP, ssb_start_symbol, cfg, fp); - else - nr_generate_prs(gNB->nr_gold_prs[0][ssb_index&7],&txdataF[0][txdataF_offset], AMP, ssb_start_symbol, cfg, fp); + prs_data_t prs_data; + prs_data.PRSResourceSetPeriod[0]=0; + prs_data.PRSResourceSetPeriod[1]=0; + // tbc + + nr_generate_prs(gNB->nr_gold_prs[slot],&txdataF[0][txdataF_offset], AMP, &prs_data, cfg, fp); if (T_ACTIVE(T_GNB_PHY_MIB)) { @@ -147,7 +148,7 @@ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB, // defining inputs and initials for nr_generate_prs() int **txdataF = gNB->common_vars.txdataF; - uint8_t ssb_index, n_hf; + uint8_t ssb_index,n_hf; ssb_index = ssb_pdu.ssb_pdu_rel15.SsbBlockIndex; LOG_D(PHY,"common_signal_procedures: frame %d, slot %d ssb index %d\n",frame,slot,ssb_index); @@ -240,11 +241,12 @@ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB, //TODO: nr_generate_prs // check if we have prs to transmit in this frame and slot - - if (cfg->carrier_config.num_tx_ant.value <= 4) - nr_generate_prs(gNB->nr_gold_prs[n_hf][ssb_index&7],&txdataF[0][txdataF_offset], AMP, ssb_start_symbol, cfg, fp); - else - nr_generate_prs(gNB->nr_gold_prs[0][ssb_index&7],&txdataF[0][txdataF_offset], AMP, ssb_start_symbol, cfg, fp); + prs_data_t prs_data; + prs_data.PRSResourceSetPeriod[0]=0; + prs_data.PRSResourceSetPeriod[1]=0; + // tbc + + nr_generate_prs(gNB->nr_gold_prs[slot],&txdataF[0][txdataF_offset], AMP, &prs_data, cfg, fp); if (do_meas==1) stop_meas(&gNB->phy_proc_tx); From 464509e32428213db0591a1b5c5c83e4f823d0f9 Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Tue, 7 Dec 2021 15:28:27 +0100 Subject: [PATCH 020/135] adding LPP ASN1 message definitions and code generation --- cmake_targets/CMakeLists.txt | 39 + openair3/LPP/MESSAGES/37355-g60.asn | 6532 +++++++++++++++++++++++++++ 2 files changed, 6571 insertions(+) create mode 100644 openair3/LPP/MESSAGES/37355-g60.asn diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 5d09e932c1..a280ebf781 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -844,6 +844,45 @@ if (${RU} STREQUAL 0) endif (${RU} STREQUAL 0) +# LPP +############## +set(LPP_DIR ${OPENAIR3_DIR}/LPP) +set(LPP_ASN_DIR ${LPP_DIR}/MESSAGES) +set(LPP_ASN_FILES + ${LPP_ASN_DIR}/37355-g60.asn + ) + +if (${RU} STREQUAL 0) + set(LPP_ASN_GENERATED_C_DIR ${asn1_generated_dir}/LPP) + message("calling ASN1C_PREFIX=LPP_ asn1c -gen-PER -no-gen-OER -fcompound-names -no-gen-example -findirect-choice -fno-include-deps -D ${LPP_ASN_GENERATED_C_DIR} ${LPP_ASN_FILES}") + execute_process( + COMMAND ${OPENAIR_CMAKE}/tools/make_asn1c_includes.sh "LPP_" "-findirect-choice -fno-include-deps" ${LPP_ASN_GENERATED_C_DIR} ${LPP_ASN_FILES} + RESULT_VARIABLE ret + ) + + if (NOT ${ret} STREQUAL 0) + message(FATAL_ERROR "asn1c: error") + endif (NOT ${ret} STREQUAL 0) + + add_custom_target ( + lpp_flag ALL + COMMAND ${OPENAIR_CMAKE}/tools/make_asn1c_includes.sh "LPP_" "-findirect-choice -fno-include-deps" ${LPP_ASN_GENERATED_C_DIR} ${LPP_ASN_FILES} + DEPENDS ${LPP_ASN_FILES} + ) + file(GLOB LPP_ASN_GENERATED_C_FILES ${LPP_ASN_GENERATED_C_DIR}/*.c) + add_library(LPP_LIB + ${LPP_ASN_GENERATED_C_FILES} + ) + add_dependencies (LPP_LIB lpp_flag) + + include_directories ("${LPP_ASN_GENERATED_C_DIR}") + include_directories ("${LPP_DIR}") + + #file(GLOB LPP_C_FILES ${LPP_DIR}/*.c) + #add_library(LPP ${LPP_C_FILES} ) + +endif (${RU} STREQUAL 0) + # Hardware dependant options ################################### add_list1_option(NB_ANTENNAS_RX "4" "Number of antennas in reception" "1" "2" "4") diff --git a/openair3/LPP/MESSAGES/37355-g60.asn b/openair3/LPP/MESSAGES/37355-g60.asn new file mode 100644 index 0000000000..af7e51bd4c --- /dev/null +++ b/openair3/LPP/MESSAGES/37355-g60.asn @@ -0,0 +1,6532 @@ +-- ASN1START + +LPP-PDU-Definitions { +itu-t (0) identified-organization (4) etsi (0) mobileDomain (0) +eps-Access (21) modules (3) lpp (7) version1 (1) lpp-PDU-Definitions (1) } + +DEFINITIONS AUTOMATIC TAGS ::= + +BEGIN + +-- ASN1STOP +-- ASN1START + +LPP-Message ::= SEQUENCE { + transactionID LPP-TransactionID OPTIONAL, -- Need ON + endTransaction BOOLEAN, + sequenceNumber SequenceNumber OPTIONAL, -- Need ON + acknowledgement Acknowledgement OPTIONAL, -- Need ON + lpp-MessageBody LPP-MessageBody OPTIONAL -- Need ON +} + +SequenceNumber ::= INTEGER (0..255) + +Acknowledgement ::= SEQUENCE { + ackRequested BOOLEAN, + ackIndicator SequenceNumber OPTIONAL +} + +-- ASN1STOP +-- ASN1START + +LPP-MessageBody ::= CHOICE { + c1 CHOICE { + requestCapabilities RequestCapabilities, + provideCapabilities ProvideCapabilities, + requestAssistanceData RequestAssistanceData, + provideAssistanceData ProvideAssistanceData, + requestLocationInformation RequestLocationInformation, + provideLocationInformation ProvideLocationInformation, + abort Abort, + error Error, + spare7 NULL, spare6 NULL, spare5 NULL, spare4 NULL, + spare3 NULL, spare2 NULL, spare1 NULL, spare0 NULL + }, + messageClassExtension SEQUENCE {} +} + +-- ASN1STOP +-- ASN1START + +LPP-TransactionID ::= SEQUENCE { + initiator Initiator, + transactionNumber TransactionNumber, + ... +} + +Initiator ::= ENUMERATED { + locationServer, + targetDevice, + ... +} + +TransactionNumber ::= INTEGER (0..255) + +-- ASN1STOP +-- ASN1START + +RequestCapabilities ::= SEQUENCE { + criticalExtensions CHOICE { + c1 CHOICE { + requestCapabilities-r9 RequestCapabilities-r9-IEs, + spare3 NULL, spare2 NULL, spare1 NULL + }, + criticalExtensionsFuture SEQUENCE {} + } +} + +RequestCapabilities-r9-IEs ::= SEQUENCE { + commonIEsRequestCapabilities CommonIEsRequestCapabilities OPTIONAL, -- Need ON + a-gnss-RequestCapabilities A-GNSS-RequestCapabilities OPTIONAL, -- Need ON + otdoa-RequestCapabilities OTDOA-RequestCapabilities OPTIONAL, -- Need ON + ecid-RequestCapabilities ECID-RequestCapabilities OPTIONAL, -- Need ON + epdu-RequestCapabilities EPDU-Sequence OPTIONAL, -- Need ON + ..., + [[ sensor-RequestCapabilities-r13 Sensor-RequestCapabilities-r13 OPTIONAL, -- Need ON + tbs-RequestCapabilities-r13 TBS-RequestCapabilities-r13 OPTIONAL, -- Need ON + wlan-RequestCapabilities-r13 WLAN-RequestCapabilities-r13 OPTIONAL, -- Need ON + bt-RequestCapabilities-r13 BT-RequestCapabilities-r13 OPTIONAL -- Need ON + ]], + [[ nr-ECID-RequestCapabilities-r16 NR-ECID-RequestCapabilities-r16 OPTIONAL, -- Need ON + nr-Multi-RTT-RequestCapabilities-r16 + NR-Multi-RTT-RequestCapabilities-r16 + OPTIONAL, -- Need ON + nr-DL-AoD-RequestCapabilities-r16 + NR-DL-AoD-RequestCapabilities-r16 OPTIONAL, -- Need ON + nr-DL-TDOA-RequestCapabilities-r16 + NR-DL-TDOA-RequestCapabilities-r16 OPTIONAL, -- Need ON + nr-UL-RequestCapabilities-r16 NR-UL-RequestCapabilities-r16 OPTIONAL -- Need ON + ]] +} + +-- ASN1STOP +-- ASN1START + +ProvideCapabilities ::= SEQUENCE { + criticalExtensions CHOICE { + c1 CHOICE { + provideCapabilities-r9 ProvideCapabilities-r9-IEs, + spare3 NULL, spare2 NULL, spare1 NULL + }, + criticalExtensionsFuture SEQUENCE {} + } +} + +ProvideCapabilities-r9-IEs ::= SEQUENCE { + commonIEsProvideCapabilities CommonIEsProvideCapabilities OPTIONAL, + a-gnss-ProvideCapabilities A-GNSS-ProvideCapabilities OPTIONAL, + otdoa-ProvideCapabilities OTDOA-ProvideCapabilities OPTIONAL, + ecid-ProvideCapabilities ECID-ProvideCapabilities OPTIONAL, + epdu-ProvideCapabilities EPDU-Sequence OPTIONAL, + ..., + [[ sensor-ProvideCapabilities-r13 Sensor-ProvideCapabilities-r13 OPTIONAL, + tbs-ProvideCapabilities-r13 TBS-ProvideCapabilities-r13 OPTIONAL, + wlan-ProvideCapabilities-r13 WLAN-ProvideCapabilities-r13 OPTIONAL, + bt-ProvideCapabilities-r13 BT-ProvideCapabilities-r13 OPTIONAL + ]], + [[ nr-ECID-ProvideCapabilities-r16 NR-ECID-ProvideCapabilities-r16 OPTIONAL, + nr-Multi-RTT-ProvideCapabilities-r16 + NR-Multi-RTT-ProvideCapabilities-r16 OPTIONAL, + nr-DL-AoD-ProvideCapabilities-r16 + NR-DL-AoD-ProvideCapabilities-r16 OPTIONAL, + nr-DL-TDOA-ProvideCapabilities-r16 + NR-DL-TDOA-ProvideCapabilities-r16 OPTIONAL, + nr-UL-ProvideCapabilities-r16 NR-UL-ProvideCapabilities-r16 OPTIONAL + ]] +} + +-- ASN1STOP +-- ASN1START + +RequestAssistanceData ::= SEQUENCE { + criticalExtensions CHOICE { + c1 CHOICE { + requestAssistanceData-r9 RequestAssistanceData-r9-IEs, + spare3 NULL, spare2 NULL, spare1 NULL + }, + criticalExtensionsFuture SEQUENCE {} + } +} + +RequestAssistanceData-r9-IEs ::= SEQUENCE { + commonIEsRequestAssistanceData CommonIEsRequestAssistanceData OPTIONAL, + a-gnss-RequestAssistanceData A-GNSS-RequestAssistanceData OPTIONAL, + otdoa-RequestAssistanceData OTDOA-RequestAssistanceData OPTIONAL, + epdu-RequestAssistanceData EPDU-Sequence OPTIONAL, + ..., + [[ sensor-RequestAssistanceData-r14 + Sensor-RequestAssistanceData-r14 OPTIONAL, + tbs-RequestAssistanceData-r14 TBS-RequestAssistanceData-r14 OPTIONAL, + wlan-RequestAssistanceData-r14 WLAN-RequestAssistanceData-r14 OPTIONAL + ]], + [[ nr-Multi-RTT-RequestAssistanceData-r16 NR-Multi-RTT-RequestAssistanceData-r16 OPTIONAL, + nr-DL-AoD-RequestAssistanceData-r16 NR-DL-AoD-RequestAssistanceData-r16 OPTIONAL, + nr-DL-TDOA-RequestAssistanceData-r16 NR-DL-TDOA-RequestAssistanceData-r16 OPTIONAL + ]] +} + +-- ASN1STOP +-- ASN1START + +ProvideAssistanceData ::= SEQUENCE { + criticalExtensions CHOICE { + c1 CHOICE { + provideAssistanceData-r9 ProvideAssistanceData-r9-IEs, + spare3 NULL, spare2 NULL, spare1 NULL + }, + criticalExtensionsFuture SEQUENCE {} + } +} + +ProvideAssistanceData-r9-IEs ::= SEQUENCE { + commonIEsProvideAssistanceData CommonIEsProvideAssistanceData OPTIONAL, -- Need ON + a-gnss-ProvideAssistanceData A-GNSS-ProvideAssistanceData OPTIONAL, -- Need ON + otdoa-ProvideAssistanceData OTDOA-ProvideAssistanceData OPTIONAL, -- Need ON + epdu-Provide-Assistance-Data EPDU-Sequence OPTIONAL, -- Need ON + ..., + [[ + sensor-ProvideAssistanceData-r14 Sensor-ProvideAssistanceData-r14 OPTIONAL, -- Need ON + tbs-ProvideAssistanceData-r14 TBS-ProvideAssistanceData-r14 OPTIONAL, -- Need ON + wlan-ProvideAssistanceData-r14 WLAN-ProvideAssistanceData-r14 OPTIONAL -- Need ON + ]], + [[ nr-Multi-RTT-ProvideAssistanceData-r16 + NR-Multi-RTT-ProvideAssistanceData-r16 + OPTIONAL, -- Need ON + nr-DL-AoD-ProvideAssistanceData-r16 + NR-DL-AoD-ProvideAssistanceData-r16 OPTIONAL, -- Need ON + nr-DL-TDOA-ProvideAssistanceData-r16 + NR-DL-TDOA-ProvideAssistanceData-r16 + OPTIONAL -- Need ON + ]] +} + +-- ASN1STOP +-- ASN1START + +RequestLocationInformation ::= SEQUENCE { + criticalExtensions CHOICE { + c1 CHOICE { + requestLocationInformation-r9 RequestLocationInformation-r9-IEs, + spare3 NULL, spare2 NULL, spare1 NULL + }, + criticalExtensionsFuture SEQUENCE {} + } +} + +RequestLocationInformation-r9-IEs ::= SEQUENCE { + commonIEsRequestLocationInformation + CommonIEsRequestLocationInformation OPTIONAL, -- Need ON + a-gnss-RequestLocationInformation A-GNSS-RequestLocationInformation OPTIONAL, -- Need ON + otdoa-RequestLocationInformation OTDOA-RequestLocationInformation OPTIONAL, -- Need ON + ecid-RequestLocationInformation ECID-RequestLocationInformation OPTIONAL, -- Need ON + epdu-RequestLocationInformation EPDU-Sequence OPTIONAL, -- Need ON + ..., + [[ + sensor-RequestLocationInformation-r13 + Sensor-RequestLocationInformation-r13 + OPTIONAL, -- Need ON + tbs-RequestLocationInformation-r13 TBS-RequestLocationInformation-r13 OPTIONAL, -- Need ON + wlan-RequestLocationInformation-r13 WLAN-RequestLocationInformation-r13 OPTIONAL, -- Need ON + bt-RequestLocationInformation-r13 BT-RequestLocationInformation-r13 OPTIONAL -- Need ON + ]], + [[ nr-ECID-RequestLocationInformation-r16 + NR-ECID-RequestLocationInformation-r16 + OPTIONAL, -- Need ON + nr-Multi-RTT-RequestLocationInformation-r16 + NR-Multi-RTT-RequestLocationInformation-r16 + OPTIONAL, -- Need ON + nr-DL-AoD-RequestLocationInformation-r16 + NR-DL-AoD-RequestLocationInformation-r16 + OPTIONAL, -- Need ON + nr-DL-TDOA-RequestLocationInformation-r16 + NR-DL-TDOA-RequestLocationInformation-r16 + OPTIONAL -- Need ON + ]] +} + +-- ASN1STOP +-- ASN1START + +ProvideLocationInformation ::= SEQUENCE { + criticalExtensions CHOICE { + c1 CHOICE { + provideLocationInformation-r9 ProvideLocationInformation-r9-IEs, + spare3 NULL, spare2 NULL, spare1 NULL + }, + criticalExtensionsFuture SEQUENCE {} + } +} + +ProvideLocationInformation-r9-IEs ::= SEQUENCE { + commonIEsProvideLocationInformation + CommonIEsProvideLocationInformation OPTIONAL, + a-gnss-ProvideLocationInformation A-GNSS-ProvideLocationInformation OPTIONAL, + otdoa-ProvideLocationInformation OTDOA-ProvideLocationInformation OPTIONAL, + ecid-ProvideLocationInformation ECID-ProvideLocationInformation OPTIONAL, + epdu-ProvideLocationInformation EPDU-Sequence OPTIONAL, + ..., + [[ + sensor-ProvideLocationInformation-r13 + Sensor-ProvideLocationInformation-r13 + OPTIONAL, + tbs-ProvideLocationInformation-r13 TBS-ProvideLocationInformation-r13 OPTIONAL, + wlan-ProvideLocationInformation-r13 WLAN-ProvideLocationInformation-r13 OPTIONAL, + bt-ProvideLocationInformation-r13 BT-ProvideLocationInformation-r13 OPTIONAL + ]], + [[ nr-ECID-ProvideLocationInformation-r16 + NR-ECID-ProvideLocationInformation-r16 OPTIONAL, + nr-Multi-RTT-ProvideLocationInformation-r16 + NR-Multi-RTT-ProvideLocationInformation-r16 OPTIONAL, + nr-DL-AoD-ProvideLocationInformation-r16 + NR-DL-AoD-ProvideLocationInformation-r16 OPTIONAL, + nr-DL-TDOA-ProvideLocationInformation-r16 + NR-DL-TDOA-ProvideLocationInformation-r16 OPTIONAL + ]] +} + +-- ASN1STOP +-- ASN1START + +Abort ::= SEQUENCE { + criticalExtensions CHOICE { + c1 CHOICE { + abort-r9 Abort-r9-IEs, + spare3 NULL, spare2 NULL, spare1 NULL + }, + criticalExtensionsFuture SEQUENCE {} + } +} + +Abort-r9-IEs ::= SEQUENCE { + commonIEsAbort CommonIEsAbort OPTIONAL, -- Need ON + ..., + epdu-Abort EPDU-Sequence OPTIONAL -- Need ON +} + +-- ASN1STOP +-- ASN1START + +Error ::= CHOICE { + error-r9 Error-r9-IEs, + criticalExtensionsFuture SEQUENCE {} +} + +Error-r9-IEs ::= SEQUENCE { + commonIEsError CommonIEsError OPTIONAL, -- Need ON + ..., + epdu-Error EPDU-Sequence OPTIONAL -- Need ON +} +-- ASN1STOP +-- ASN1START + +AccessTypes ::= SEQUENCE { + accessTypes BIT STRING { eutra (0), + utra (1), + gsm (2), + nb-iot (3), + nr-v1510 (4) } (SIZE (1..8)), + ... +} + +-- ASN1STOP +-- ASN1START + +ARFCN-ValueEUTRA ::= INTEGER (0..maxEARFCN) + +ARFCN-ValueEUTRA-v9a0 ::= INTEGER (maxEARFCN-Plus1..maxEARFCN2) + +ARFCN-ValueEUTRA-r14 ::= INTEGER (0..maxEARFCN2) + +-- ASN1STOP +-- ASN1START + +ARFCN-ValueNR-r15 ::= INTEGER (0..3279165) + +-- ASN1STOP +-- ASN1START + +ARFCN-ValueUTRA ::= INTEGER (0..16383) + +-- ASN1STOP +-- ASN1START + +CarrierFreq-NB-r14 ::= SEQUENCE { + carrierFreq-r14 ARFCN-ValueEUTRA-r14, + carrierFreqOffset-r14 CarrierFreqOffsetNB-r14 OPTIONAL, + ... +} + +-- ASN1STOP +-- ASN1START + +CarrierFreqOffsetNB-r14 ::= ENUMERATED { + v-10, v-9, v-8, v-7, v-6, v-5, v-4, v-3, v-2, v-1, v-0dot5, + v0, v1, v2, v3, v4, v5, v6, v7, v8, v9 + } + +-- ASN1STOP +-- ASN1START + +CellGlobalIdEUTRA-AndUTRA ::= SEQUENCE { + plmn-Identity SEQUENCE { + mcc SEQUENCE (SIZE (3)) OF INTEGER (0..9), + mnc SEQUENCE (SIZE (2..3)) OF INTEGER (0..9) + }, + cellIdentity CHOICE { + eutra BIT STRING (SIZE (28)), + utra BIT STRING (SIZE (32)) + }, + ... +} + +-- ASN1STOP +-- ASN1START + +CellGlobalIdGERAN ::= SEQUENCE { + plmn-Identity SEQUENCE { + mcc SEQUENCE (SIZE (3)) OF INTEGER (0..9), + mnc SEQUENCE (SIZE (2..3)) OF INTEGER (0..9) + }, + locationAreaCode BIT STRING (SIZE (16)), + cellIdentity BIT STRING (SIZE (16)), + ... +} + +-- ASN1STOP +-- ASN1START + +ECGI ::= SEQUENCE { + mcc SEQUENCE (SIZE (3)) OF INTEGER (0..9), + mnc SEQUENCE (SIZE (2..3)) OF INTEGER (0..9), + cellidentity BIT STRING (SIZE (28)) +} + +-- ASN1STOP +-- ASN1START + +Ellipsoid-Point ::= SEQUENCE { + latitudeSign ENUMERATED {north, south}, + degreesLatitude INTEGER (0..8388607), -- 23 bit field + degreesLongitude INTEGER (-8388608..8388607) -- 24 bit field +} + +-- ASN1STOP +-- ASN1START + +Ellipsoid-PointWithUncertaintyCircle ::= SEQUENCE { + latitudeSign ENUMERATED {north, south}, + degreesLatitude INTEGER (0..8388607), -- 23 bit field + degreesLongitude INTEGER (-8388608..8388607), -- 24 bit field + uncertainty INTEGER (0..127) +} + +-- ASN1STOP +-- ASN1START + +EllipsoidPointWithUncertaintyEllipse ::= SEQUENCE { + latitudeSign ENUMERATED {north, south}, + degreesLatitude INTEGER (0..8388607), -- 23 bit field + degreesLongitude INTEGER (-8388608..8388607), -- 24 bit field + uncertaintySemiMajor INTEGER (0..127), + uncertaintySemiMinor INTEGER (0..127), + orientationMajorAxis INTEGER (0..179), + confidence INTEGER (0..100) +} + +-- ASN1STOP +-- ASN1START + +EllipsoidPointWithAltitude ::= SEQUENCE { + latitudeSign ENUMERATED {north, south}, + degreesLatitude INTEGER (0..8388607), -- 23 bit field + degreesLongitude INTEGER (-8388608..8388607), -- 24 bit field + altitudeDirection ENUMERATED {height, depth}, + altitude INTEGER (0..32767) -- 15 bit field +} + +-- ASN1STOP +-- ASN1START + +EllipsoidPointWithAltitudeAndUncertaintyEllipsoid ::= SEQUENCE { + latitudeSign ENUMERATED {north, south}, + degreesLatitude INTEGER (0..8388607), -- 23 bit field + degreesLongitude INTEGER (-8388608..8388607), -- 24 bit field + altitudeDirection ENUMERATED {height, depth}, + altitude INTEGER (0..32767), -- 15 bit field + uncertaintySemiMajor INTEGER (0..127), + uncertaintySemiMinor INTEGER (0..127), + orientationMajorAxis INTEGER (0..179), + uncertaintyAltitude INTEGER (0..127), + confidence INTEGER (0..100) +} + +-- ASN1STOP +-- ASN1START + +EllipsoidArc ::= SEQUENCE { + latitudeSign ENUMERATED {north, south}, + degreesLatitude INTEGER (0..8388607), -- 23 bit field + degreesLongitude INTEGER (-8388608..8388607), -- 24 bit field + innerRadius INTEGER (0..65535), -- 16 bit field, + uncertaintyRadius INTEGER (0..127), + offsetAngle INTEGER (0..179), + includedAngle INTEGER (0..179), + confidence INTEGER (0..100) +} + +-- ASN1STOP +-- ASN1START + +EPDU-Sequence ::= SEQUENCE (SIZE (1..maxEPDU)) OF EPDU + +maxEPDU INTEGER ::= 16 + +EPDU ::= SEQUENCE { + ePDU-Identifier EPDU-Identifier, + ePDU-Body EPDU-Body +} + +EPDU-Identifier ::= SEQUENCE { + ePDU-ID EPDU-ID, + ePDU-Name EPDU-Name OPTIONAL, + ... +} + +EPDU-ID ::= INTEGER (1..256) + +EPDU-Name ::= VisibleString (SIZE (1..32)) + +EPDU-Body ::= OCTET STRING + +-- ASN1STOP +-- ASN1START + +FreqBandIndicatorNR-r16 ::= INTEGER (1..1024) + +-- ASN1STOP +-- ASN1START + +HighAccuracyEllipsoidPointWithUncertaintyEllipse-r15 ::= SEQUENCE { + degreesLatitude-r15 INTEGER(-2147483648..2147483647), + degreesLongitude-r15 INTEGER(-2147483648..2147483647), + uncertaintySemiMajor-r15 INTEGER (0..255), + uncertaintySemiMinor-r15 INTEGER (0..255), + orientationMajorAxis-r15 INTEGER (0..179), + confidence-r15 INTEGER (0..100) +} + +-- ASN1STOP +-- ASN1START + +HighAccuracyEllipsoidPointWithAltitudeAndUncertaintyEllipsoid-r15 ::= SEQUENCE { + degreesLatitude-r15 INTEGER(-2147483648..2147483647), + degreesLongitude-r15 INTEGER(-2147483648..2147483647), + altitude-r15 INTEGER(-64000..1280000), + uncertaintySemiMajor-r15 INTEGER (0..255), + uncertaintySemiMinor-r15 INTEGER (0..255), + orientationMajorAxis-r15 INTEGER (0..179), + horizontalConfidence-r15 INTEGER (0..100), + uncertaintyAltitude-r15 INTEGER (0..255), + verticalConfidence-r15 INTEGER (0..100) +} + +-- ASN1STOP +-- ASN1START + +HorizontalVelocity ::= SEQUENCE { + bearing INTEGER(0..359), + horizontalSpeed INTEGER(0..2047) +} + +-- ASN1STOP +-- ASN1START + +HorizontalWithVerticalVelocity ::= SEQUENCE { + bearing INTEGER(0..359), + horizontalSpeed INTEGER(0..2047), + verticalDirection ENUMERATED{upward, downward}, + verticalSpeed INTEGER(0..255) +} + +-- ASN1STOP +-- ASN1START + +HorizontalVelocityWithUncertainty ::= SEQUENCE { + bearing INTEGER(0..359), + horizontalSpeed INTEGER(0..2047), + uncertaintySpeed INTEGER(0..255) +} + +-- ASN1STOP +-- ASN1START + +HorizontalWithVerticalVelocityAndUncertainty ::= SEQUENCE { + bearing INTEGER(0..359), + horizontalSpeed INTEGER(0..2047), + verticalDirection ENUMERATED{upward, downward}, + verticalSpeed INTEGER(0..255), + horizontalUncertaintySpeed INTEGER(0..255), + verticalUncertaintySpeed INTEGER(0..255) +} + +-- ASN1STOP +-- ASN1START + +LocationCoordinateTypes ::= SEQUENCE { + ellipsoidPoint BOOLEAN, + ellipsoidPointWithUncertaintyCircle BOOLEAN, + ellipsoidPointWithUncertaintyEllipse BOOLEAN, + polygon BOOLEAN, + ellipsoidPointWithAltitude BOOLEAN, + ellipsoidPointWithAltitudeAndUncertaintyEllipsoid BOOLEAN, + ellipsoidArc BOOLEAN, + ..., + [[ + highAccuracyEllipsoidPointWithUncertaintyEllipse-r15 + BOOLEAN OPTIONAL, -- Need ON + highAccuracyEllipsoidPointWithAltitudeAndUncertaintyEllipsoid-r15 + BOOLEAN OPTIONAL -- Need ON + ]] +} + +-- ASN1STOP +-- ASN1START + +NCGI-r15 ::= SEQUENCE { + mcc-r15 SEQUENCE (SIZE (3)) OF INTEGER (0..9), + mnc-r15 SEQUENCE (SIZE (2..3)) OF INTEGER (0..9), + nr-cellidentity-r15 BIT STRING (SIZE (36)) +} + +-- ASN1STOP +-- ASN1START + +NR-PhysCellID-r16 ::= INTEGER (0..1007) + +-- ASN1STOP +-- ASN1START + +PeriodicAssistanceDataControlParameters-r15 ::= SEQUENCE { + periodicSessionID-r15 PeriodicSessionID-r15, + ..., + [[ + updateCapabilities-r15 UpdateCapabilities-r15 OPTIONAL -- Need ON + ]] +} + +PeriodicSessionID-r15 ::= SEQUENCE { + periodicSessionInitiator-r15 ENUMERATED { locationServer, targetDevice, ... }, + periodicSessionNumber-r15 INTEGER (0..255), + ... +} + +UpdateCapabilities-r15 ::= BIT STRING {primaryCellID-r15 (0)} (SIZE(1..8)) + +-- ASN1STOP +-- ASN1START + +Polygon ::= SEQUENCE (SIZE (3..15)) OF PolygonPoints + +PolygonPoints ::= SEQUENCE { + latitudeSign ENUMERATED {north, south}, + degreesLatitude INTEGER (0..8388607), -- 23 bit field + degreesLongitude INTEGER (-8388608..8388607) -- 24 bit field +} + +-- ASN1STOP +-- ASN1START + +PositioningModes ::= SEQUENCE { + posModes BIT STRING { standalone (0), + ue-based (1), + ue-assisted (2) + } (SIZE (1..8)), + ... +} + +-- ASN1STOP +-- ASN1START + +SegmentationInfo-r14 ::= ENUMERATED { noMoreMessages, moreMessagesOnTheWay } + +-- ASN1STOP +-- ASN1START + +VelocityTypes ::= SEQUENCE { + horizontalVelocity BOOLEAN, + horizontalWithVerticalVelocity BOOLEAN, + horizontalVelocityWithUncertainty BOOLEAN, + horizontalWithVerticalVelocityAndUncertainty BOOLEAN, + ... +} + +-- ASN1STOP +-- ASN1START + +CommonIEsRequestCapabilities ::= SEQUENCE { + ..., + [[ + lpp-message-segmentation-req-r14 BIT STRING { serverToTarget (0), + targetToServer (1) } OPTIONAL -- Need ON + ]] +} + +-- ASN1STOP +-- ASN1START + +CommonIEsProvideCapabilities ::= SEQUENCE { + ..., + [[ + segmentationInfo-r14 SegmentationInfo-r14 OPTIONAL, -- Cond Segmentation + lpp-message-segmentation-r14 BIT STRING { serverToTarget (0), + targetToServer (1) } OPTIONAL + ]] +} + +-- ASN1STOP +-- ASN1START + +CommonIEsRequestAssistanceData ::= SEQUENCE { + primaryCellID ECGI OPTIONAL, -- Cond EUTRA + ..., + [[ + segmentationInfo-r14 SegmentationInfo-r14 OPTIONAL -- Cond Segmentation + ]], + [[ + periodicAssistanceDataReq-r15 + PeriodicAssistanceDataControlParameters-r15 + OPTIONAL, -- Cond PerADreq + primaryCellID-r15 NCGI-r15 OPTIONAL -- Cond NR + ]] +} + +-- ASN1STOP +-- ASN1START + +CommonIEsProvideAssistanceData ::= SEQUENCE { + ..., + [[ + segmentationInfo-r14 SegmentationInfo-r14 OPTIONAL -- Need ON + ]], + [[ + periodicAssistanceData-r15 PeriodicAssistanceDataControlParameters-r15 + OPTIONAL -- Cond PerAD + ]] +} + +-- ASN1STOP +-- ASN1START + +CommonIEsRequestLocationInformation ::= SEQUENCE { + locationInformationType LocationInformationType, + triggeredReporting TriggeredReportingCriteria OPTIONAL, -- Cond ECID + periodicalReporting PeriodicalReportingCriteria OPTIONAL, -- Need ON + additionalInformation AdditionalInformation OPTIONAL, -- Need ON + qos QoS OPTIONAL, -- Need ON + environment Environment OPTIONAL, -- Need ON + locationCoordinateTypes LocationCoordinateTypes OPTIONAL, -- Need ON + velocityTypes VelocityTypes OPTIONAL, -- Need ON + ..., + [[ + messageSizeLimitNB-r14 MessageSizeLimitNB-r14 OPTIONAL -- Need ON + ]], + [[ + segmentationInfo-r14 SegmentationInfo-r14 OPTIONAL -- Need ON + ]] +} + +LocationInformationType ::= ENUMERATED { + locationEstimateRequired, + locationMeasurementsRequired, + locationEstimatePreferred, + locationMeasurementsPreferred, + ... +} + +PeriodicalReportingCriteria ::= SEQUENCE { + reportingAmount ENUMERATED { + ra1, ra2, ra4, ra8, ra16, ra32, + ra64, ra-Infinity + } DEFAULT ra-Infinity, + reportingInterval ENUMERATED { + noPeriodicalReporting, ri0-25, + ri0-5, ri1, ri2, ri4, ri8, ri16, ri32, ri64 + } +} + +TriggeredReportingCriteria ::= SEQUENCE { + cellChange BOOLEAN, + reportingDuration ReportingDuration, + ... +} + +ReportingDuration ::= INTEGER (0..255) + +AdditionalInformation ::= ENUMERATED { + onlyReturnInformationRequested, + mayReturnAditionalInformation, + ... +} + +QoS ::= SEQUENCE { + horizontalAccuracy HorizontalAccuracy OPTIONAL, -- Need ON + verticalCoordinateRequest BOOLEAN, + verticalAccuracy VerticalAccuracy OPTIONAL, -- Need ON + responseTime ResponseTime OPTIONAL, -- Need ON + velocityRequest BOOLEAN, + ..., + [[ responseTimeNB-r14 ResponseTimeNB-r14 OPTIONAL -- Need ON + ]], + [[ horizontalAccuracyExt-r15 HorizontalAccuracyExt-r15 OPTIONAL, -- Need ON + verticalAccuracyExt-r15 VerticalAccuracyExt-r15 OPTIONAL -- Need ON + ]] +} + +HorizontalAccuracy ::= SEQUENCE { + accuracy INTEGER(0..127), + confidence INTEGER(0..100), + ... +} + +VerticalAccuracy ::= SEQUENCE { + accuracy INTEGER(0..127), + confidence INTEGER(0..100), + ... +} + +HorizontalAccuracyExt-r15 ::= SEQUENCE { + accuracyExt-r15 INTEGER(0..255), + confidence-r15 INTEGER(0..100), + ... +} + +VerticalAccuracyExt-r15 ::= SEQUENCE { + accuracyExt-r15 INTEGER(0..255), + confidence-r15 INTEGER(0..100), + ... +} + +ResponseTime ::= SEQUENCE { + time INTEGER (1..128), + ..., + [[ responseTimeEarlyFix-r12 INTEGER (1..128) OPTIONAL -- Need ON + ]], + [[ unit-r15 ENUMERATED { ten-seconds, ... } OPTIONAL -- Need ON + ]] +} + +ResponseTimeNB-r14 ::= SEQUENCE { + timeNB-r14 INTEGER (1..512), + responseTimeEarlyFixNB-r14 INTEGER (1..512) OPTIONAL, -- Need ON + ..., + [[ unitNB-r15 ENUMERATED { ten-seconds, ... } OPTIONAL -- Need ON + ]] +} + +Environment ::= ENUMERATED { + badArea, + notBadArea, + mixedArea, + ... +} + +MessageSizeLimitNB-r14 ::= SEQUENCE { + measurementLimit-r14 INTEGER (1..512) OPTIONAL, -- Need ON + ... +} + +-- ASN1STOP +-- ASN1START + +CommonIEsProvideLocationInformation ::= SEQUENCE { + locationEstimate LocationCoordinates OPTIONAL, + velocityEstimate Velocity OPTIONAL, + locationError LocationError OPTIONAL, + ..., + [[ earlyFixReport-r12 EarlyFixReport-r12 OPTIONAL + ]], + [[ locationSource-r13 LocationSource-r13 OPTIONAL, + locationTimestamp-r13 UTCTime OPTIONAL + ]], + [[ + segmentationInfo-r14 SegmentationInfo-r14 OPTIONAL -- Cond Segmentation + ]] +} + +LocationCoordinates ::= CHOICE { + ellipsoidPoint Ellipsoid-Point, + ellipsoidPointWithUncertaintyCircle Ellipsoid-PointWithUncertaintyCircle, + ellipsoidPointWithUncertaintyEllipse EllipsoidPointWithUncertaintyEllipse, + polygon Polygon, + ellipsoidPointWithAltitude EllipsoidPointWithAltitude, + ellipsoidPointWithAltitudeAndUncertaintyEllipsoid + EllipsoidPointWithAltitudeAndUncertaintyEllipsoid, + ellipsoidArc EllipsoidArc, + ..., + highAccuracyEllipsoidPointWithUncertaintyEllipse-v1510 + HighAccuracyEllipsoidPointWithUncertaintyEllipse-r15, + highAccuracyEllipsoidPointWithAltitudeAndUncertaintyEllipsoid-v1510 + HighAccuracyEllipsoidPointWithAltitudeAndUncertaintyEllipsoid-r15 +} + +Velocity ::= CHOICE { + horizontalVelocity HorizontalVelocity, + horizontalWithVerticalVelocity HorizontalWithVerticalVelocity, + horizontalVelocityWithUncertainty HorizontalVelocityWithUncertainty, + horizontalWithVerticalVelocityAndUncertainty + HorizontalWithVerticalVelocityAndUncertainty, + ... +} + +LocationError ::= SEQUENCE { + locationfailurecause LocationFailureCause, + ... +} + +LocationFailureCause ::= ENUMERATED { + undefined, + requestedMethodNotSupported, + positionMethodFailure, + periodicLocationMeasurementsNotAvailable, + ... +} + +EarlyFixReport-r12 ::= ENUMERATED { + noMoreMessages, + moreMessagesOnTheWay +} + +LocationSource-r13 ::= BIT STRING { a-gnss (0), + wlan (1), + bt (2), + tbs (3), + sensor (4), + ha-gnss-v1510 (5), + motion-sensor-v1550 (6), + dl-tdoa-r16 (7), + dl-aod-r16 (8) } (SIZE(1..16)) + +-- ASN1STOP +-- ASN1START + +CommonIEsAbort ::= SEQUENCE { + abortCause ENUMERATED { + undefined, + stopPeriodicReporting, + targetDeviceAbort, + networkAbort, + ..., + stopPeriodicAssistanceDataDelivery-v1510 + } +} + +-- ASN1STOP +-- ASN1START + +CommonIEsError ::= SEQUENCE { + errorCause ENUMERATED { + undefined, + lppMessageHeaderError, + lppMessageBodyError, + epduError, + incorrectDataValue, + ..., + lppSegmentationError-v1450 + } +} + +-- ASN1STOP +-- ASN1START + +DL-PRS-ID-Info-r16 ::= SEQUENCE { + dl-PRS-ID-r16 INTEGER (0..255), + nr-DL-PRS-ResourceID-List-r16 SEQUENCE (SIZE (1..nrMaxResourceIDs-r16)) OF + NR-DL-PRS-ResourceID-r16 + OPTIONAL, -- Need ON + nr-DL-PRS-ResourceSetID-r16 NR-DL-PRS-ResourceSetID-r16 + OPTIONAL -- Need ON +} + +-- ASN1STOP +-- ASN1START + +NR-AdditionalPathList-r16 ::= SEQUENCE (SIZE(1..2)) OF NR-AdditionalPath-r16 + +NR-AdditionalPath-r16 ::= SEQUENCE { + nr-RelativeTimeDifference-r16 CHOICE { + k0-r16 INTEGER(0..16351), + k1-r16 INTEGER(0..8176), + k2-r16 INTEGER(0..4088), + k3-r16 INTEGER(0..2044), + k4-r16 INTEGER(0..1022), + k5-r16 INTEGER(0..511), + ... + }, + nr-PathQuality-r16 NR-TimingQuality-r16 OPTIONAL, + ... +} + +-- ASN1STOP +-- ASN1START + +NR-DL-PRS-AssistanceData-r16 ::= SEQUENCE { + nr-DL-PRS-ReferenceInfo-r16 DL-PRS-ID-Info-r16, + nr-DL-PRS-AssistanceDataList-r16 SEQUENCE (SIZE (1..nrMaxFreqLayers-r16)) OF + NR-DL-PRS-AssistanceDataPerFreq-r16, + nr-SSB-Config-r16 SEQUENCE (SIZE (1..nrMaxTRPs-r16)) OF + NR-SSB-Config-r16 OPTIONAL, -- Need ON + ... +} + +NR-DL-PRS-AssistanceDataPerFreq-r16 ::= SEQUENCE { + nr-DL-PRS-PositioningFrequencyLayer-r16 + NR-DL-PRS-PositioningFrequencyLayer-r16, + nr-DL-PRS-AssistanceDataPerFreq-r16 SEQUENCE (SIZE (1..nrMaxTRPsPerFreq-r16)) OF + NR-DL-PRS-AssistanceDataPerTRP-r16, + ... +} + +NR-DL-PRS-AssistanceDataPerTRP-r16 ::= SEQUENCE { + dl-PRS-ID-r16 INTEGER (0..255), + nr-PhysCellID-r16 NR-PhysCellID-r16 OPTIONAL, -- Need ON + nr-CellGlobalID-r16 NCGI-r15 OPTIONAL, -- Need ON + nr-ARFCN-r16 ARFCN-ValueNR-r15 OPTIONAL, -- Need ON + nr-DL-PRS-SFN0-Offset-r16 NR-DL-PRS-SFN0-Offset-r16, + nr-DL-PRS-ExpectedRSTD-r16 INTEGER (-3841..3841), + nr-DL-PRS-ExpectedRSTD-Uncertainty-r16 + INTEGER (0..246), + nr-DL-PRS-Info-r16 NR-DL-PRS-Info-r16, + ..., + [[ + prs-OnlyTP-r16 ENUMERATED { true } OPTIONAL -- Need ON + ]] +} + +NR-DL-PRS-PositioningFrequencyLayer-r16 ::= SEQUENCE { + dl-PRS-SubcarrierSpacing-r16 ENUMERATED {kHz15, kHz30, kHz60, kHz120, ...}, + dl-PRS-ResourceBandwidth-r16 INTEGER (1..63), + dl-PRS-StartPRB-r16 INTEGER (0..2176), + dl-PRS-PointA-r16 ARFCN-ValueNR-r15, + dl-PRS-CombSizeN-r16 ENUMERATED {n2, n4, n6, n12, ...}, + dl-PRS-CyclicPrefix-r16 ENUMERATED {normal, extended, ...}, + ... +} + +NR-DL-PRS-SFN0-Offset-r16 ::= SEQUENCE { + sfn-Offset-r16 INTEGER (0..1023), + integerSubframeOffset-r16 INTEGER (0..9), + ...} + +-- ASN1STOP +-- ASN1START + +NR-DL-PRS-BeamInfo-r16 ::= SEQUENCE (SIZE (1..nrMaxFreqLayers-r16)) OF + NR-DL-PRS-BeamInfoPerFreqLayer-r16 + +NR-DL-PRS-BeamInfoPerFreqLayer-r16 ::= SEQUENCE (SIZE (1..nrMaxTRPsPerFreq-r16)) OF + NR-DL-PRS-BeamInfoPerTRP-r16 + +NR-DL-PRS-BeamInfoPerTRP-r16 ::= SEQUENCE { + dl-PRS-ID-r16 INTEGER (0..255), + nr-PhysCellID-r16 NR-PhysCellID-r16 OPTIONAL, -- Need ON + nr-CellGlobalID-r16 NCGI-r15 OPTIONAL, -- Need ON + nr-ARFCN-r16 ARFCN-ValueNR-r15 OPTIONAL, -- Need ON + associated-DL-PRS-ID-r16 INTEGER (0..255) OPTIONAL, -- Need OP + lcs-GCS-TranslationParameter-r16 LCS-GCS-TranslationParameter-r16 + OPTIONAL, -- Need OP + dl-PRS-BeamInfoSet-r16 DL-PRS-BeamInfoSet-r16 OPTIONAL, -- Need OP + ... +} + +DL-PRS-BeamInfoSet-r16 ::= SEQUENCE (SIZE(1..nrMaxSetsPerTrpPerFreqLayer-r16)) OF + DL-PRS-BeamInfoResourceSet-r16 + +DL-PRS-BeamInfoResourceSet-r16 ::= SEQUENCE (SIZE(1..nrMaxResourcesPerSet-r16)) OF + DL-PRS-BeamInfoElement-r16 + +DL-PRS-BeamInfoElement-r16 ::= SEQUENCE { + dl-PRS-Azimuth-r16 INTEGER (0..359), + dl-PRS-Azimuth-fine-r16 INTEGER (0..9) OPTIONAL, -- Need ON + dl-PRS-Elevation-r16 INTEGER (0..180) OPTIONAL, -- Need ON + dl-PRS-Elevation-fine-r16 INTEGER (0..9) OPTIONAL, -- Need ON + ... +} + +LCS-GCS-TranslationParameter-r16 ::= SEQUENCE { + alpha-r16 INTEGER (0..359), + alpha-fine-r16 INTEGER (0..9) OPTIONAL, -- Cond AzElFine + beta-r16 INTEGER (0..359), + beta-fine-r16 INTEGER (0..9) OPTIONAL, -- Cond AzElFine + gamma-r16 INTEGER (0..359), + gamma-fine-r16 INTEGER (0..9) OPTIONAL, -- Cond AzElFine + ... +} + +-- ASN1STOP +-- ASN1START + +NR-DL-PRS-Info-r16 ::= SEQUENCE { + nr-DL-PRS-ResourceSetList-r16 SEQUENCE (SIZE (1..nrMaxSetsPerTrpPerFreqLayer-r16)) OF + NR-DL-PRS-ResourceSet-r16, + ... +} + +NR-DL-PRS-ResourceSet-r16 ::= SEQUENCE { + nr-DL-PRS-ResourceSetID-r16 NR-DL-PRS-ResourceSetID-r16, + dl-PRS-Periodicity-and-ResourceSetSlotOffset-r16 + NR-DL-PRS-Periodicity-and-ResourceSetSlotOffset-r16, + dl-PRS-ResourceRepetitionFactor-r16 ENUMERATED {n2, n4, n6, n8, n16, n32, ...} + OPTIONAL, -- Need OP + dl-PRS-ResourceTimeGap-r16 ENUMERATED {s1, s2, s4, s8, s16, s32, ...} + OPTIONAL, -- Cond Rep + dl-PRS-NumSymbols-r16 ENUMERATED {n2, n4, n6, n12, ...}, + dl-PRS-MutingOption1-r16 DL-PRS-MutingOption1-r16 OPTIONAL, -- Need OP + dl-PRS-MutingOption2-r16 DL-PRS-MutingOption2-r16 OPTIONAL, -- Need OP + dl-PRS-ResourcePower-r16 INTEGER (-60..50), + dl-PRS-ResourceList-r16 SEQUENCE (SIZE (1..nrMaxResourcesPerSet-r16)) OF + NR-DL-PRS-Resource-r16, + ... +} + +DL-PRS-MutingOption1-r16 ::= SEQUENCE { + dl-prs-MutingBitRepetitionFactor-r16 + ENUMERATED { n1, n2, n4, n8, ... } OPTIONAL, -- Need OP + nr-option1-muting-r16 NR-MutingPattern-r16, + ... +} + +DL-PRS-MutingOption2-r16 ::= SEQUENCE { + nr-option2-muting-r16 NR-MutingPattern-r16, + ... +} + +NR-MutingPattern-r16 ::= CHOICE { + po2-r16 BIT STRING (SIZE(2)), + po4-r16 BIT STRING (SIZE(4)), + po6-r16 BIT STRING (SIZE(6)), + po8-r16 BIT STRING (SIZE(8)), + po16-r16 BIT STRING (SIZE(16)), + po32-r16 BIT STRING (SIZE(32)), + ... +} + +NR-DL-PRS-Resource-r16 ::= SEQUENCE { + nr-DL-PRS-ResourceID-r16 NR-DL-PRS-ResourceID-r16, + dl-PRS-SequenceID-r16 INTEGER (0.. 4095), + dl-PRS-CombSizeN-AndReOffset-r16 CHOICE { + n2-r16 INTEGER (0..1), + n4-r16 INTEGER (0..3), + n6-r16 INTEGER (0..5), + n12-r16 INTEGER (0..11), + ... + }, + dl-PRS-ResourceSlotOffset-r16 INTEGER (0..nrMaxResourceOffsetValue-1-r16), + dl-PRS-ResourceSymbolOffset-r16 INTEGER (0..12), + dl-PRS-QCL-Info-r16 DL-PRS-QCL-Info-r16 OPTIONAL, --Need ON + ... +} + +DL-PRS-QCL-Info-r16 ::= CHOICE { + ssb-r16 SEQUENCE { + pci-r16 NR-PhysCellID-r16, + ssb-Index-r16 INTEGER (0..63), + rs-Type-r16 ENUMERATED {typeC, typeD, typeC-plus-typeD} + }, + dl-PRS-r16 SEQUENCE { + qcl-DL-PRS-ResourceID-r16 NR-DL-PRS-ResourceID-r16, + qcl-DL-PRS-ResourceSetID-r16 NR-DL-PRS-ResourceSetID-r16 + } +} + +NR-DL-PRS-Periodicity-and-ResourceSetSlotOffset-r16 ::= CHOICE { + scs15-r16 CHOICE { + n4-r16 INTEGER (0..3), + n5-r16 INTEGER (0..4), + n8-r16 INTEGER (0..7), + n10-r16 INTEGER (0..9), + n16-r16 INTEGER (0..15), + n20-r16 INTEGER (0..19), + n32-r16 INTEGER (0..31), + n40-r16 INTEGER (0..39), + n64-r16 INTEGER (0..63), + n80-r16 INTEGER (0..79), + n160-r16 INTEGER (0..159), + n320-r16 INTEGER (0..319), + n640-r16 INTEGER (0..639), + n1280-r16 INTEGER (0..1279), + n2560-r16 INTEGER (0..2559), + n5120-r16 INTEGER (0..5119), + n10240-r16 INTEGER (0..10239), + ... + }, + scs30-r16 CHOICE { + n8-r16 INTEGER (0..7), + n10-r16 INTEGER (0..9), + n16-r16 INTEGER (0..15), + n20-r16 INTEGER (0..19), + n32-r16 INTEGER (0..31), + n40-r16 INTEGER (0..39), + n64-r16 INTEGER (0..63), + n80-r16 INTEGER (0..79), + n128-r16 INTEGER (0..127), + n160-r16 INTEGER (0..159), + n320-r16 INTEGER (0..319), + n640-r16 INTEGER (0..639), + n1280-r16 INTEGER (0..1279), + n2560-r16 INTEGER (0..2559), + n5120-r16 INTEGER (0..5119), + n10240-r16 INTEGER (0..10239), + n20480-r16 INTEGER (0..20479), + ... + }, + scs60-r16 CHOICE { + n16-r16 INTEGER (0..15), + n20-r16 INTEGER (0..19), + n32-r16 INTEGER (0..31), + n40-r16 INTEGER (0..39), + n64-r16 INTEGER (0..63), + n80-r16 INTEGER (0..79), + n128-r16 INTEGER (0..127), + n160-r16 INTEGER (0..159), + n256-r16 INTEGER (0..255), + n320-r16 INTEGER (0..319), + n640-r16 INTEGER (0..639), + n1280-r16 INTEGER (0..1279), + n2560-r16 INTEGER (0..2559), + n5120-r16 INTEGER (0..5119), + n10240-r16 INTEGER (0..10239), + n20480-r16 INTEGER (0..20479), + n40960-r16 INTEGER (0..40959), + ... + }, + scs120-r16 CHOICE { + n32-r16 INTEGER (0..31), + n40-r16 INTEGER (0..39), + n64-r16 INTEGER (0..63), + n80-r16 INTEGER (0..79), + n128-r16 INTEGER (0..127), + n160-r16 INTEGER (0..159), + n256-r16 INTEGER (0..255), + n320-r16 INTEGER (0..319), + n512-r16 INTEGER (0..511), + n640-r16 INTEGER (0..639), + n1280-r16 INTEGER (0..1279), + n2560-r16 INTEGER (0..2559), + n5120-r16 INTEGER (0..5119), + n10240-r16 INTEGER (0..10239), + n20480-r16 INTEGER (0..20479), + n40960-r16 INTEGER (0..40959), + n81920-r16 INTEGER (0..81919), + ... + }, + ... +} + +-- ASN1STOP +-- ASN1START + +NR-DL-PRS-ProcessingCapability-r16 ::= SEQUENCE { + prs-ProcessingCapabilityBandList-r16 SEQUENCE (SIZE (1..nrMaxBands-r16)) OF + PRS-ProcessingCapabilityPerBand-r16, + maxSupportedFreqLayers-r16 INTEGER (1..4), + simulLTE-NR-PRS-r16 ENUMERATED { supported} OPTIONAL, + ... +} + +PRS-ProcessingCapabilityPerBand-r16 ::= SEQUENCE { + freqBandIndicatorNR-r16 FreqBandIndicatorNR-r16, + supportedBandwidthPRS-r16 CHOICE { + fr1 ENUMERATED {mhz5, mhz10, mhz20, mhz40, + mhz50, mhz80, mhz100}, + fr2 ENUMERATED {mhz50, mhz100, mhz200, mhz400}, + ... + }, + dl-PRS-BufferType-r16 ENUMERATED {type1, type2, ...}, + durationOfPRS-Processing-r16 SEQUENCE { + durationOfPRS-ProcessingSymbols-r16 ENUMERATED {nDot125, nDot25, nDot5, n1, + n2, n4, n6, n8, n12, n16, n20, n25, + n30, n32, n35, n40, n45, n50}, + durationOfPRS-ProcessingSymbolsInEveryTms-r16 + ENUMERATED {n8, n16, n20, n30, n40, n80, + n160,n320, n640, n1280}, + ... + }, + maxNumOfDL-PRS-ResProcessedPerSlot-r16 SEQUENCE { + scs15-r16 ENUMERATED {n1, n2, n4, n8, n16, n24, n32, + n48, n64} OPTIONAL, + scs30-r16 ENUMERATED {n1, n2, n4, n8, n16, n24, n32, + n48, n64} OPTIONAL, + scs60-r16 ENUMERATED {n1, n2, n4, n8, n16, n24, n32, + n48, n64} OPTIONAL, + scs120-r16 ENUMERATED {n1, n2, n4, n8, n16, n24, n32, + n48, n64} OPTIONAL, + ... + }, + ... +} + +-- ASN1STOP +-- ASN1START + +NR-DL-PRS-QCL-ProcessingCapability-r16 ::= SEQUENCE { + dl-PRS-QCL-ProcessingCapabilityBandList-r16 SEQUENCE (SIZE (1..nrMaxBands-r16)) OF + DL-PRS-QCL-ProcessingCapabilityPerBand-r16, + ... +} + +DL-PRS-QCL-ProcessingCapabilityPerBand-r16 ::= SEQUENCE { + freqBandIndicatorNR-r16 FreqBandIndicatorNR-r16, + ssb-FromNeighCellAsQCL-r16 ENUMERATED { supported} OPTIONAL, + prs-FromServNeighCellAsQCL-r16 ENUMERATED { supported} OPTIONAL, + ... +} + +-- ASN1STOP +-- ASN1START + +NR-DL-PRS-ResourceID-r16 ::= INTEGER (0..nrMaxNumDL-PRS-ResourcesPerSet-1-r16) + +-- ASN1STOP +-- ASN1START + +NR-DL-PRS-ResourcesCapability-r16 ::= SEQUENCE { + maxNrOfDL-PRS-ResourceSetPerTrpPerFrequencyLayer-r16 + INTEGER (1..2), + maxNrOfTRP-AcrossFreqs-r16 ENUMERATED { n4, n6, n12, n16, n32, + n64, n128, n256, ...}, + maxNrOfPosLayer-r16 INTEGER (1..4), + dl-PRS-ResourcesCapabilityBandList-r16 SEQUENCE (SIZE (1..nrMaxBands-r16)) OF + DL-PRS-ResourcesCapabilityPerBand-r16, + dl-PRS-ResourcesBandCombinationList-r16 DL-PRS-ResourcesBandCombinationList-r16, + ... +} + +DL-PRS-ResourcesCapabilityPerBand-r16 ::= SEQUENCE { + freqBandIndicatorNR-r16 FreqBandIndicatorNR-r16, + maxNrOfDL-PRS-ResourcesPerResourceSet-r16 ENUMERATED { n1, n2, n4, n8, n16, n32, n64, ...}, + maxNrOfDL-PRS-ResourcesPerPositioningFrequencylayer-r16 + ENUMERATED { n6, n24, n32, n64, n96, n128, + n256, n512, n1024, ...}, + ... +} + +DL-PRS-ResourcesBandCombinationList-r16 ::= SEQUENCE (SIZE (1..maxBandComb-r16)) OF + DL-PRS-ResourcesBandCombination-r16 + +DL-PRS-ResourcesBandCombination-r16 ::= SEQUENCE { + bandList-r16 SEQUENCE (SIZE (1..maxSimultaneousBands-r16)) OF + FreqBandIndicatorNR-r16, + maxNrOfDL-PRS-ResourcesAcrossAllFL-TRP-ResourceSet-r16 + CHOICE { + fr1-Only-r16 ENUMERATED {n6, n24, n64, n128, n192, + n256, n512, n1024, n2048}, + fr2-Only-r16 ENUMERATED {n24, n64, n96, n128, n192, + n256, n512, n1024, n2048}, + fr1-FR2Mix-r16 SEQUENCE { + fr1-r16 ENUMERATED {n6, n24, n64, n96, n128, + n192, n256, n512, n1024, n2048}, + fr2-r16 ENUMERATED {n24, n64, n96, n128, n192, + n256, n512, n1024, n2048}, + ... + }, + ... + }, + ... +} + +-- ASN1STOP +-- ASN1START + +NR-DL-PRS-ResourceSetID-r16 ::= INTEGER (0..nrMaxNumDL-PRS-ResourceSetsPerTRP-1-r16) + +-- ASN1STOP +-- ASN1START + +NR-PositionCalculationAssistance-r16 ::= SEQUENCE { + nr-TRP-LocationInfo-r16 NR-TRP-LocationInfo-r16 OPTIONAL, -- Need ON + nr-DL-PRS-BeamInfo-r16 NR-DL-PRS-BeamInfo-r16 OPTIONAL, -- Need ON + nr-RTD-Info-r16 NR-RTD-Info-r16 OPTIONAL, -- Need ON + ... +} +-- ASN1STOP +-- ASN1START + +NR-RTD-Info-r16 ::= SEQUENCE { + referenceTRP-RTD-Info-r16 ReferenceTRP-RTD-Info-r16, + rtd-InfoList-r16 RTD-InfoList-r16, + ... +} + +ReferenceTRP-RTD-Info-r16 ::= SEQUENCE { + dl-PRS-ID-Ref-r16 INTEGER (0..255), + nr-PhysCellID-Ref-r16 NR-PhysCellID-r16 OPTIONAL, -- Need ON + nr-CellGlobalID-Ref-r16 NCGI-r15 OPTIONAL, -- Need ON + nr-ARFCN-Ref-r16 ARFCN-ValueNR-r15 OPTIONAL, -- Need ON + refTime-r16 CHOICE { + systemFrameNumber-r16 BIT STRING (SIZE (10)), + utc-r16 UTCTime, + ... + }, + rtd-RefQuality-r16 NR-TimingQuality-r16 OPTIONAL, -- Need ON + ... +} + +RTD-InfoList-r16 ::= SEQUENCE (SIZE (1..nrMaxFreqLayers-r16)) OF RTD-InfoListPerFreqLayer-r16 + +RTD-InfoListPerFreqLayer-r16 ::= SEQUENCE (SIZE(1..nrMaxTRPsPerFreq-r16)) OF RTD-InfoElement-r16 + +RTD-InfoElement-r16 ::= SEQUENCE { + dl-PRS-ID-r16 INTEGER (0..255), + nr-PhysCellID-r16 NR-PhysCellID-r16 OPTIONAL, -- Need ON + nr-CellGlobalID-r16 NCGI-r15 OPTIONAL, -- Need ON + nr-ARFCN-r16 ARFCN-ValueNR-r15 OPTIONAL, -- Need ON + subframeOffset-r16 INTEGER (0..1966079), + rtd-Quality-r16 NR-TimingQuality-r16, + ... +} + +-- ASN1STOP +-- ASN1START + +NR-SelectedDL-PRS-IndexList-r16 ::= SEQUENCE (SIZE (1..nrMaxFreqLayers-r16)) OF + NR-SelectedDL-PRS-PerFreq-r16 + +NR-SelectedDL-PRS-PerFreq-r16 ::= SEQUENCE { + nr-SelectedDL-PRS-FrequencyLayerIndex-r16 INTEGER (0..nrMaxFreqLayers-1-r16), + nr-SelectedDL-PRS-IndexListPerFreq-r16 SEQUENCE (SIZE (1..nrMaxTRPsPerFreq-r16)) OF + NR-SelectedDL-PRS-IndexPerTRP-r16 + OPTIONAL, --Need OP + ... +} + +NR-SelectedDL-PRS-IndexPerTRP-r16 ::= SEQUENCE { + nr-SelectedTRP-Index-r16 INTEGER (0..nrMaxTRPsPerFreq-1-r16), + dl-SelectedPRS-ResourceSetIndexList-r16 SEQUENCE (SIZE (1..nrMaxSetsPerTrpPerFreqLayer-r16)) + OF DL-SelectedPRS-ResourceSetIndex-r16 + OPTIONAL, --Need OP + ... +} + +DL-SelectedPRS-ResourceSetIndex-r16 ::= SEQUENCE { + nr-DL-SelectedPRS-ResourceSetIndex-r16 INTEGER (0..nrMaxSetsPerTrpPerFreqLayer-1-r16), + dl-SelectedPRS-ResourceIndexList-r16 SEQUENCE (SIZE (1..nrMaxResourcesPerSet-r16)) OF + DL-SelectedPRS-ResourceIndex-r16 + OPTIONAL --Need OP +} + +DL-SelectedPRS-ResourceIndex-r16 ::= SEQUENCE { + nr-DL-SelectedPRS-ResourceIdIndex-r16 INTEGER (0..nrMaxNumDL-PRS-ResourcesPerSet-1-r16), + ... +} + +-- ASN1STOP +-- ASN1START + +NR-SSB-Config-r16 ::= SEQUENCE { + nr-PhysCellID-r16 NR-PhysCellID-r16, + nr-ARFCN-r16 ARFCN-ValueNR-r15, + ss-PBCH-BlockPower-r16 INTEGER (-60..50), + halfFrameIndex-r16 INTEGER (0..1), + ssb-periodicity-r16 ENUMERATED { ms5, ms10, ms20, ms40, ms80, ms160, ...}, + ssb-PositionsInBurst-r16 CHOICE { + shortBitmap-r16 BIT STRING (SIZE (4)), + mediumBitmap-r16 BIT STRING (SIZE (8)), + longBitmap-r16 BIT STRING (SIZE (64)) + } OPTIONAL, --Need OR + ssb-SubcarrierSpacing-r16 ENUMERATED {kHz15, kHz30, kHz60, kHz120, kHz240, ...}, + sfn-SSB-Offset-r16 INTEGER (0..15), + ... +} + +-- ASN1STOP +-- ASN1START + +NR-TimeStamp-r16 ::= SEQUENCE { + dl-PRS-ID-r16 INTEGER (0..255), + nr-PhysCellID-r16 NR-PhysCellID-r16 OPTIONAL, -- Need ON + nr-CellGlobalID-r16 NCGI-r15 OPTIONAL, -- Need ON + nr-ARFCN-r16 ARFCN-ValueNR-r15 OPTIONAL, -- Need ON + nr-SFN-r16 INTEGER (0..1023), + nr-Slot-r16 CHOICE { + scs15-r16 INTEGER (0..9), + scs30-r16 INTEGER (0..19), + scs60-r16 INTEGER (0..39), + scs120-r16 INTEGER (0..79) + }, + ... +} + +-- ASN1STOP +-- ASN1START + +NR-TimingQuality-r16 ::= SEQUENCE { + timingQualityValue-r16 INTEGER (0..31), + timingQualityResolution-r16 ENUMERATED {mdot1, m1, m10, m30, ...}, + ... +} + +-- ASN1STOP +-- ASN1START + +NR-TRP-LocationInfo-r16 ::= SEQUENCE (SIZE (1..nrMaxFreqLayers-r16)) OF + NR-TRP-LocationInfoPerFreqLayer-r16 + +NR-TRP-LocationInfoPerFreqLayer-r16 ::= SEQUENCE { + referencePoint-r16 ReferencePoint-r16 OPTIONAL, -- Cond NotSameAsPrev + trp-LocationInfoList-r16 SEQUENCE (SIZE (1..nrMaxTRPsPerFreq-r16)) OF + TRP-LocationInfoElement-r16, + ... +} + +TRP-LocationInfoElement-r16 ::= SEQUENCE { + dl-PRS-ID-r16 INTEGER (0..255), + nr-PhysCellID-r16 NR-PhysCellID-r16 OPTIONAL, -- Need ON + nr-CellGlobalID-r16 NCGI-r15 OPTIONAL, -- Need ON + nr-ARFCN-r16 ARFCN-ValueNR-r15 OPTIONAL, -- Need ON + associated-DL-PRS-ID-r16 INTEGER (0..255) OPTIONAL, -- Need OP + trp-Location-r16 RelativeLocation-r16 OPTIONAL, -- Need OP + trp-DL-PRS-ResourceSets-r16 SEQUENCE (SIZE(1..nrMaxSetsPerTrpPerFreqLayer-r16)) OF + DL-PRS-ResourceSets-TRP-Element-r16 OPTIONAL, -- Need OP + ... +} + +DL-PRS-ResourceSets-TRP-Element-r16 ::= SEQUENCE { + dl-PRS-ResourceSetARP-r16 RelativeLocation-r16 OPTIONAL, -- Need OP + dl-PRS-Resource-ARP-List-r16 SEQUENCE (SIZE(1..nrMaxResourcesPerSet-r16)) OF + DL-PRS-Resource-ARP-Element-r16 OPTIONAL, -- Need OP + ... +} + +DL-PRS-Resource-ARP-Element-r16 ::= SEQUENCE { + dl-PRS-Resource-ARP-location-r16 RelativeLocation-r16 OPTIONAL, -- Need OP + ... +} + +-- ASN1STOP +-- ASN1START + +NR-UL-SRS-Capability-r16 ::= SEQUENCE { + srs-CapabilityBandList-r16 SEQUENCE (SIZE (1..nrMaxBands-r16)) OF + SRS-CapabilityPerBand-r16, + srs-PosResourceConfigCA-BandList-r16 SEQUENCE (SIZE (1..nrMaxConfiguredBands-r16)) OF + SRS-PosResourcesPerBand-r16 OPTIONAL, + maxNumberSRS-PosPathLossEstimateAllServingCells-r16 + ENUMERATED {n1, n4, n8, n16} OPTIONAL, + maxNumberSRS-PosSpatialRelationsAllServingCells-r16 + ENUMERATED {n0, n1, n2, n4, n8, n16} OPTIONAL, + ... +} + +SRS-CapabilityPerBand-r16 ::= SEQUENCE { + freqBandIndicatorNR-r16 FreqBandIndicatorNR-r16, + olpc-SRS-Pos-r16 OLPC-SRS-Pos-r16 OPTIONAL, + spatialRelationsSRS-Pos-r16 SpatialRelationsSRS-Pos-r16 OPTIONAL, + ... +} + +OLPC-SRS-Pos-r16 ::= SEQUENCE { + olpc-SRS-PosBasedOnPRS-Serving-r16 ENUMERATED {supported} OPTIONAL, + olpc-SRS-PosBasedOnSSB-Neigh-r16 ENUMERATED {supported} OPTIONAL, + olpc-SRS-PosBasedOnPRS-Neigh-r16 ENUMERATED {supported} OPTIONAL, + maxNumberPathLossEstimatePerServing-r16 ENUMERATED {n1, n4, n8, n16} OPTIONAL, + ... +} + +SpatialRelationsSRS-Pos-r16 ::= SEQUENCE { + spatialRelation-SRS-PosBasedOnSSB-Serving-r16 ENUMERATED {supported} OPTIONAL, + spatialRelation-SRS-PosBasedOnCSI-RS-Serving-r16 ENUMERATED {supported} OPTIONAL, + spatialRelation-SRS-PosBasedOnPRS-Serving-r16 ENUMERATED {supported} OPTIONAL, + spatialRelation-SRS-PosBasedOnSRS-r16 ENUMERATED {supported} OPTIONAL, + spatialRelation-SRS-PosBasedOnSSB-Neigh-r16 ENUMERATED {supported} OPTIONAL, + spatialRelation-SRS-PosBasedOnPRS-Neigh-r16 ENUMERATED {supported} OPTIONAL, + ... +} + +SRS-PosResourcesPerBand-r16 ::= SEQUENCE { + freqBandIndicatorNR-r16 FreqBandIndicatorNR-r16, + maxNumberSRS-PosResourceSetsPerBWP-r16 ENUMERATED {n1, n2, n4, n8, n12, n16}, + maxNumberSRS-PosResourcesPerBWP-r16 ENUMERATED {n1, n2, n4, n8, n16, n32, n64}, + maxNumberPeriodicSRS-PosResourcesPerBWP-r16 ENUMERATED {n1, n2, n4, n8, n16, n32, n64}, + maxNumberAP-SRS-PosResourcesPerBWP-r16 ENUMERATED {n1, n2, n4, n8, n16, n32, n64} + OPTIONAL, + maxNumberSP-SRS-PosResourcesPerBWP-r16 ENUMERATED {n1, n2, n4, n8, n16, n32, n64} + OPTIONAL, + ... +} + +-- ASN1STOP +-- ASN1START + +ReferencePoint-r16 ::= SEQUENCE { + referencePointGeographicLocation-r16 CHOICE { + location3D-r16 EllipsoidPointWithAltitudeAndUncertaintyEllipsoid, + ha-location3D-r16 HighAccuracyEllipsoidPointWithAltitudeAndUncertaintyEllipsoid-r15, + ... + }, + ... +} + +-- ASN1STOP +-- ASN1START + +RelativeLocation-r16 ::= SEQUENCE { + milli-arc-second-units-r16 ENUMERATED { mas0-03, mas0-3, mas3, mas30, ...}, + height-units-r16 ENUMERATED {mm, cm, m, ...}, + delta-latitude-r16 Delta-Latitude-r16, + delta-longitude-r16 Delta-Longitude-r16, + delta-height-r16 Delta-Height-r16, + locationUNC-r16 LocationUncertainty-r16 OPTIONAL, -- Need OP + ... +} + +Delta-Latitude-r16 ::= SEQUENCE { + delta-Latitude-r16 INTEGER (-1024..1023), + coarse-delta-Latitude-r16 INTEGER (0..4095) OPTIONAL, -- Need OP + ... +} + +Delta-Longitude-r16 ::= SEQUENCE { + delta-Longitude-r16 INTEGER (-1024..1023), + coarse-delta-Longitude-r16 INTEGER (0..4095) OPTIONAL, -- Need OP + ... +} + +Delta-Height-r16 ::= SEQUENCE { + delta-Height-r16 INTEGER (-1024..1023), + coarse-delta-Height-r16 INTEGER (0..4095) OPTIONAL, -- Need OP + ... +} + +LocationUncertainty-r16 ::= SEQUENCE { + horizontalUncertainty-r16 INTEGER (0..255), + horizontalConfidence-r16 INTEGER (0..100), + verticalUncertainty-r16 INTEGER (0..255), + verticalConfidence-r16 INTEGER (0..100) +} + +-- ASN1STOP +-- ASN1START + +OTDOA-ProvideAssistanceData ::= SEQUENCE { + otdoa-ReferenceCellInfo OTDOA-ReferenceCellInfo OPTIONAL, -- Need ON + otdoa-NeighbourCellInfo OTDOA-NeighbourCellInfoList OPTIONAL, -- Need ON + otdoa-Error OTDOA-Error OPTIONAL, -- Need ON + ..., + [[ + otdoa-ReferenceCellInfoNB-r14 OTDOA-ReferenceCellInfoNB-r14 OPTIONAL, -- Need ON + otdoa-NeighbourCellInfoNB-r14 OTDOA-NeighbourCellInfoListNB-r14 OPTIONAL -- Need ON + ]] +} + +-- ASN1STOP +-- ASN1START + +OTDOA-ReferenceCellInfo ::= SEQUENCE { + physCellId INTEGER (0..503), + cellGlobalId ECGI OPTIONAL, -- Need ON + earfcnRef ARFCN-ValueEUTRA OPTIONAL, -- Cond NotSameAsServ0 + antennaPortConfig ENUMERATED {ports1-or-2, ports4, ... } + OPTIONAL, -- Cond NotSameAsServ1 + cpLength ENUMERATED { normal, extended, ... }, + prsInfo PRS-Info OPTIONAL, -- Cond PRS + ..., + [[ earfcnRef-v9a0 ARFCN-ValueEUTRA-v9a0 OPTIONAL -- Cond NotSameAsServ2 + ]], + [[ tpId-r14 INTEGER (0..4095) OPTIONAL, -- Need ON + cpLengthCRS-r14 ENUMERATED { normal, extended, ... } + OPTIONAL, -- Cond CRS + sameMBSFNconfigRef-r14 BOOLEAN OPTIONAL, -- Need ON + dlBandwidth-r14 ENUMERATED {n6, n15, n25, n50, n75, n100} + OPTIONAL, -- Cond NotSameAsServ3 + addPRSconfigRef-r14 SEQUENCE (SIZE (1..maxAddPRSconfig-r14)) OF PRS-Info + OPTIONAL -- Need ON + ]], + [[ + nr-LTE-SFN-Offset-r15 INTEGER (0..1023) OPTIONAL -- Cond NR + ]], + [[ + tdd-config-v1520 TDD-Config-v1520 OPTIONAL, -- Need ON + nr-LTE-fineTiming-Offset-r15 INTEGER (0..19) OPTIONAL -- Cond FineOffset + ]] +} + +maxAddPRSconfig-r14 INTEGER ::= 2 + +-- ASN1STOP +-- ASN1START + +PRS-Info ::= SEQUENCE { + prs-Bandwidth ENUMERATED { n6, n15, n25, n50, n75, n100, ... }, + prs-ConfigurationIndex INTEGER (0..4095), + numDL-Frames ENUMERATED {sf-1, sf-2, sf-4, sf-6, ..., sf-add-v1420}, + ..., + prs-MutingInfo-r9 CHOICE { + po2-r9 BIT STRING (SIZE(2)), + po4-r9 BIT STRING (SIZE(4)), + po8-r9 BIT STRING (SIZE(8)), + po16-r9 BIT STRING (SIZE(16)), + ..., + po32-v1420 BIT STRING (SIZE(32)), + po64-v1420 BIT STRING (SIZE(64)), + po128-v1420 BIT STRING (SIZE(128)), + po256-v1420 BIT STRING (SIZE(256)), + po512-v1420 BIT STRING (SIZE(512)), + po1024-v1420 BIT STRING (SIZE(1024)) + } OPTIONAL, -- Need OP + [[ prsID-r14 INTEGER (0..4095) OPTIONAL, -- Need ON + add-numDL-Frames-r14 INTEGER (1..160) OPTIONAL, -- Cond sf-add + prsOccGroupLen-r14 ENUMERATED {g2, g4, g8, g16, g32, g64, g128,... } + OPTIONAL, -- Cond Occ-Grp + prsHoppingInfo-r14 CHOICE { + nb2-r14 INTEGER (0.. maxAvailNarrowBands-Minus1-r14), + nb4-r14 SEQUENCE (SIZE (3)) + OF INTEGER (0.. maxAvailNarrowBands-Minus1-r14) + } OPTIONAL -- Cond PRS-FH + ]] +} + +maxAvailNarrowBands-Minus1-r14 INTEGER ::= 15 -- Maximum number of narrowbands minus 1 + +-- ASN1STOP +-- ASN1START + +TDD-Config-v1520 ::= SEQUENCE { + subframeAssignment-v1520 ENUMERATED { sa0, sa1, sa2, sa3, sa4, sa5, sa6 }, + ... +} + +-- ASN1STOP +-- ASN1START + +OTDOA-NeighbourCellInfoList ::= SEQUENCE (SIZE (1..maxFreqLayers)) OF OTDOA-NeighbourFreqInfo +OTDOA-NeighbourFreqInfo ::= SEQUENCE (SIZE (1..24)) OF OTDOA-NeighbourCellInfoElement + +OTDOA-NeighbourCellInfoElement ::= SEQUENCE { + physCellId INTEGER (0..503), + cellGlobalId ECGI OPTIONAL, -- Need ON + earfcn ARFCN-ValueEUTRA OPTIONAL, -- Cond NotSameAsRef0 + cpLength ENUMERATED {normal, extended, ...} + OPTIONAL, -- Cond NotSameAsRef1 + prsInfo PRS-Info OPTIONAL, -- Cond NotSameAsRef2 + antennaPortConfig ENUMERATED {ports-1-or-2, ports-4, ...} + OPTIONAL, -- Cond NotsameAsRef3 + slotNumberOffset INTEGER (0..19) OPTIONAL, -- Cond NotSameAsRef4 + prs-SubframeOffset INTEGER (0..1279) OPTIONAL, -- Cond InterFreq + expectedRSTD INTEGER (0..16383), + expectedRSTD-Uncertainty INTEGER (0..1023), + ..., + [[ earfcn-v9a0 ARFCN-ValueEUTRA-v9a0 OPTIONAL -- Cond NotSameAsRef5 + ]], + [[ tpId-r14 INTEGER (0..4095) OPTIONAL, -- Need ON + prs-only-tp-r14 ENUMERATED { true } OPTIONAL, -- Cond TBS + cpLengthCRS-r14 ENUMERATED { normal, extended, ... } + OPTIONAL, -- Cond CRS + sameMBSFNconfigNeighbour-r14 BOOLEAN OPTIONAL, -- Need ON + dlBandwidth-r14 ENUMERATED {n6, n15, n25, n50, n75, n100} + OPTIONAL, -- Cond NotSameAsRef6 + addPRSconfigNeighbour-r14 SEQUENCE (SIZE (1..maxAddPRSconfig-r14)) OF + Add-PRSconfigNeighbourElement-r14 + OPTIONAL -- Need ON + ]], + [[ + tdd-config-v1520 TDD-Config-v1520 OPTIONAL -- Need ON + ]] +} + +Add-PRSconfigNeighbourElement-r14 ::= SEQUENCE { + add-prsInfo-r14 PRS-Info OPTIONAL, -- Cond NotSameAsRef7 + ... +} + +maxFreqLayers INTEGER ::= 3 + +-- ASN1STOP +-- ASN1START + +OTDOA-ReferenceCellInfoNB-r14 ::= SEQUENCE { + physCellIdNB-r14 INTEGER (0..503) OPTIONAL, -- Cond NoPRS-AD1 + cellGlobalIdNB-r14 ECGI OPTIONAL, -- Cond NoPRS-AD2 + carrierFreqRef-r14 CarrierFreq-NB-r14 OPTIONAL, -- Cond NotSameAsServ1 + earfcn-r14 ARFCN-ValueEUTRA-r14 OPTIONAL, -- Cond Inband + eutra-NumCRS-Ports-r14 ENUMERATED {ports1-or-2, ports4} + OPTIONAL, -- Cond NoPRS-AD3 + otdoa-SIB1-NB-repetitions-r14 ENUMERATED { r4, r8, r16 } OPTIONAL, -- Cond NotSameAsServ2 + nprsInfo-r14 PRS-Info-NB-r14 OPTIONAL, -- Cond NPRS-Type1 + ..., + [[ + nprsInfo-Type2-v1470 PRS-Info-NB-r14 OPTIONAL -- Cond NPRS-Type2 + ]], + [[ tdd-config-r15 TDD-Config-v1520 OPTIONAL -- Need ON + ]] +} + +-- ASN1STOP +-- ASN1START + +PRS-Info-NB-r14 ::= SEQUENCE (SIZE (1..maxCarrier-r14)) OF NPRS-Info-r14 + +NPRS-Info-r14 ::= SEQUENCE { + operationModeInfoNPRS-r14 ENUMERATED { inband, standalone }, + nprs-carrier-r14 CarrierFreq-NB-r14 OPTIONAL, -- Cond Standalone/Guardband + nprsSequenceInfo-r14 INTEGER (0..174) OPTIONAL, -- Cond Inband + nprsID-r14 INTEGER (0..4095) OPTIONAL, -- Cond NPRS-ID + partA-r14 SEQUENCE { + nprsBitmap-r14 CHOICE { + subframePattern10-r14 BIT STRING (SIZE (10)), + subframePattern40-r14 BIT STRING (SIZE (40)) + }, + nprs-MutingInfoA-r14 CHOICE { + po2-r14 BIT STRING (SIZE(2)), + po4-r14 BIT STRING (SIZE(4)), + po8-r14 BIT STRING (SIZE(8)), + po16-r14 BIT STRING (SIZE(16)), + ... + } OPTIONAL, -- Cond MutingA + ... + } OPTIONAL, -- Cond PartA + partB-r14 SEQUENCE { + nprs-Period-r14 ENUMERATED { ms160, ms320, ms640, ms1280, ... , ms2560-v1510}, + nprs-startSF-r14 ENUMERATED { zero, one-eighth, two-eighths, three-eighths, + four-eighths, five-eighths, six-eighths, + seven-eighths, ...}, + nprs-NumSF-r14 ENUMERATED { sf10, sf20, sf40, sf80, sf160, sf320, + sf640, sf1280, ... , sf2560-v1510}, + nprs-MutingInfoB-r14 CHOICE { + po2-r14 BIT STRING (SIZE(2)), + po4-r14 BIT STRING (SIZE(4)), + po8-r14 BIT STRING (SIZE(8)), + po16-r14 BIT STRING (SIZE(16)), + ... + } OPTIONAL, -- Cond MutingB + ..., + [[ sib1-SF-TDD-r15 ENUMERATED {sf0, sf4, sf0and5} OPTIONAL -- Cond SIB1-TDD + ]] + } OPTIONAL, -- Cond PartB + ..., + [[ + partA-TDD-r15 SEQUENCE { + nprsBitmap-r15 CHOICE { + subframePattern10-TDD-r15 BIT STRING (SIZE (8)), + subframePattern40-TDD-r15 BIT STRING (SIZE (32)), + ... + }, + nprs-MutingInfoA-r15 CHOICE { + po2-r15 BIT STRING (SIZE(2)), + po4-r15 BIT STRING (SIZE(4)), + po8-r15 BIT STRING (SIZE(8)), + po16-r15 BIT STRING (SIZE(16)), + ... + } OPTIONAL, -- Cond MutingA + ... + } OPTIONAL -- Cond PartA-TDD + ]] +} + +maxCarrier-r14 INTEGER ::= 5 + +-- ASN1STOP +-- ASN1START + +OTDOA-NeighbourCellInfoListNB-r14 ::= SEQUENCE (SIZE (1..maxCells-r14)) OF + OTDOA-NeighbourCellInfoNB-r14 + +OTDOA-NeighbourCellInfoNB-r14 ::= SEQUENCE { + physCellIdNB-r14 INTEGER (0..503) OPTIONAL, -- Cond NoPRS-AD1 + cellGlobalIdNB-r14 ECGI OPTIONAL, -- Cond NoPRS-AD2 + carrierFreq-r14 CarrierFreq-NB-r14 OPTIONAL, -- Cond NotSameAsRef1 + earfcn-r14 ARFCN-ValueEUTRA-r14 OPTIONAL, -- Cond Inband + eutra-NumCRS-Ports-r14 ENUMERATED {ports-1-or-2, ports-4, ...} + OPTIONAL, -- Cond NotsameAsRef2 + otdoa-SIB1-NB-repetitions-r14 ENUMERATED { r4, r8, r16 } + OPTIONAL, -- Cond NotSameAsRef3 + nprsInfo-r14 PRS-Info-NB-r14 OPTIONAL, -- Cond NotsameAsRef4 + nprs-slotNumberOffset-r14 INTEGER (0..19) OPTIONAL, -- Cond NotsameAsRef5 + nprs-SFN-Offset-r14 INTEGER (0..63) OPTIONAL, -- Cond NotsameAsRef6 + nprs-SubframeOffset-r14 INTEGER (0..1279) OPTIONAL, -- Need OP + expectedRSTD-r14 INTEGER (0..16383) OPTIONAL, -- Cond NoPRS-AD3 + expectedRSTD-Uncertainty-r14 INTEGER (0..1023) OPTIONAL, -- Cond NoPRS-AD3 + prsNeighbourCellIndex-r14 INTEGER (1..72) OPTIONAL, -- Cond PRS-AD + ..., + [[ + nprsInfo-Type2-v1470 PRS-Info-NB-r14 OPTIONAL -- Cond NotSameAsRef4 + ]], + [[ tdd-config-r15 TDD-Config-v1520 OPTIONAL -- Need ON + ]] +} + +maxCells-r14 INTEGER ::= 72 + +-- ASN1STOP +-- ASN1START + +OTDOA-RequestAssistanceData ::= SEQUENCE { + physCellId INTEGER (0..503), + ..., + [[ + adType-r14 BIT STRING { prs (0), nprs (1) } (SIZE (1..8)) OPTIONAL + ]], + [[ + nrPhysCellId-r15 INTEGER (0..1007) OPTIONAL + ]] +} + +-- ASN1STOP +-- ASN1START + +OTDOA-ProvideLocationInformation ::= SEQUENCE { + otdoaSignalMeasurementInformation OTDOA-SignalMeasurementInformation OPTIONAL, + otdoa-Error OTDOA-Error OPTIONAL, + ..., + [[ + otdoaSignalMeasurementInformation-NB-r14 OTDOA-SignalMeasurementInformation-NB-r14 + OPTIONAL + ]] +} + +-- ASN1STOP +-- ASN1START + +OTDOA-SignalMeasurementInformation ::= SEQUENCE { + systemFrameNumber BIT STRING (SIZE (10)), + physCellIdRef INTEGER (0..503), + cellGlobalIdRef ECGI OPTIONAL, + earfcnRef ARFCN-ValueEUTRA OPTIONAL, -- Cond NotSameAsRef0 + referenceQuality OTDOA-MeasQuality OPTIONAL, + neighbourMeasurementList NeighbourMeasurementList, + ..., + [[ earfcnRef-v9a0 ARFCN-ValueEUTRA-v9a0 OPTIONAL -- Cond NotSameAsRef1 + ]], + [[ tpIdRef-r14 INTEGER (0..4095) OPTIONAL, -- Cond ProvidedByServer0 + prsIdRef-r14 INTEGER (0..4095) OPTIONAL, -- Cond ProvidedByServer1 + additionalPathsRef-r14 + AdditionalPathList-r14 OPTIONAL, + nprsIdRef-r14 INTEGER (0..4095) OPTIONAL, -- Cond ProvidedByServer2 + carrierFreqOffsetNB-Ref-r14 + CarrierFreqOffsetNB-r14 OPTIONAL, -- Cond NB-IoT + hyperSFN-r14 BIT STRING (SIZE (10)) OPTIONAL -- Cond H-SFN + ]], + [[ + motionTimeSource-r15 MotionTimeSource-r15 OPTIONAL + ]] +} + +NeighbourMeasurementList ::= SEQUENCE (SIZE(1..24)) OF NeighbourMeasurementElement + +NeighbourMeasurementElement ::= SEQUENCE { + physCellIdNeighbour INTEGER (0..503), + cellGlobalIdNeighbour ECGI OPTIONAL, + earfcnNeighbour ARFCN-ValueEUTRA OPTIONAL, -- Cond NotSameAsRef2 + rstd INTEGER (0..12711), + rstd-Quality OTDOA-MeasQuality, + ..., + [[ earfcnNeighbour-v9a0 ARFCN-ValueEUTRA-v9a0 OPTIONAL -- Cond NotSameAsRef3 + ]], + [[ tpIdNeighbour-r14 INTEGER (0..4095) OPTIONAL, -- Cond ProvidedByServer0 + prsIdNeighbour-r14 INTEGER (0..4095) OPTIONAL, -- Cond ProvidedByServer1 + delta-rstd-r14 INTEGER (0..5) OPTIONAL, + additionalPathsNeighbour-r14 + AdditionalPathList-r14 OPTIONAL, + nprsIdNeighbour-r14 INTEGER (0..4095) OPTIONAL, -- Cond ProvidedByServer2 + carrierFreqOffsetNB-Neighbour-r14 + CarrierFreqOffsetNB-r14 OPTIONAL -- Cond NB-IoT + ]], + [[ + delta-SFN-r15 INTEGER (-8192..8191) OPTIONAL + ]] +} + +AdditionalPathList-r14 ::= SEQUENCE (SIZE(1..maxPaths-r14)) OF AdditionalPath-r14 + +maxPaths-r14 INTEGER ::= 2 + +MotionTimeSource-r15 ::= SEQUENCE { + timeSource-r15 ENUMERATED {servingCell, referenceCell, gnss, mixed, + other, none, ...} +} + +-- ASN1STOP +-- ASN1START + +OTDOA-SignalMeasurementInformation-NB-r14 ::= SEQUENCE { + systemFrameNumber-r14 BIT STRING (SIZE (10)), + physCellIdRef-r14 INTEGER (0..503), + cellGlobalIdRef-r14 ECGI OPTIONAL, + earfcnRef-r14 ARFCN-ValueEUTRA-r14 OPTIONAL, -- Cond NotSameAsRef0 + referenceQuality-r14 OTDOA-MeasQuality OPTIONAL, + neighbourMeasurementList-r14 NeighbourMeasurementList-NB-r14, + tpIdRef-r14 INTEGER (0..4095) OPTIONAL, -- Cond ProvidedByServer0 + prsIdRef-r14 INTEGER (0..4095) OPTIONAL, -- Cond ProvidedByServer1 + additionalPathsRef-r14 AdditionalPathList-r14 OPTIONAL, + nprsIdRef-r14 INTEGER (0..4095) OPTIONAL, -- Cond ProvidedByServer2 + carrierFreqOffsetNB-Ref-r14 CarrierFreqOffsetNB-r14 OPTIONAL, -- Cond NB-IoT + hyperSFN-r14 BIT STRING (SIZE (10)) OPTIONAL, -- Cond H-SFN + ... +} + +NeighbourMeasurementList-NB-r14 ::= SEQUENCE (SIZE(1..24)) OF NeighbourMeasurementElement-NB-r14 + +NeighbourMeasurementElement-NB-r14 ::= SEQUENCE { + physCellIdNeighbour-r14 INTEGER (0..503), + cellGlobalIdNeighbour-r14 ECGI OPTIONAL, + earfcnNeighbour-r14 ARFCN-ValueEUTRA-r14 OPTIONAL, -- Cond NotSameAsRef2 + rstd-r14 INTEGER (0..12711), + rstd-Quality-r14 OTDOA-MeasQuality, + tpIdNeighbour-r14 INTEGER (0..4095) OPTIONAL, -- Cond ProvidedByServer0 + prsIdNeighbour-r14 INTEGER (0..4095) OPTIONAL, -- Cond ProvidedByServer1 + delta-rstd-r14 INTEGER (0..5) OPTIONAL, + additionalPathsNeighbour-r14 + AdditionalPathList-r14 OPTIONAL, + nprsIdNeighbour-r14 INTEGER (0..4095) OPTIONAL, -- Cond ProvidedByServer2 + carrierFreqOffsetNB-Neighbour-r14 + CarrierFreqOffsetNB-r14 OPTIONAL, -- Cond NB-IoT + ... +} + +-- ASN1STOP +-- ASN1START + +OTDOA-MeasQuality ::= SEQUENCE { + error-Resolution BIT STRING (SIZE (2)), + error-Value BIT STRING (SIZE (5)), + error-NumSamples BIT STRING (SIZE (3)) OPTIONAL, + ... +} + +-- ASN1STOP +-- ASN1START + +AdditionalPath-r14 ::= SEQUENCE { + relativeTimeDifference-r14 INTEGER (-256..255), + path-Quality-r14 OTDOA-MeasQuality OPTIONAL, + ... +} + +-- ASN1STOP +-- ASN1START + +OTDOA-RequestLocationInformation ::= SEQUENCE { + assistanceAvailability BOOLEAN, + ..., + [[ + multipathRSTD-r14 ENUMERATED { requested } OPTIONAL, -- Need ON + maxNoOfRSTDmeas-r14 INTEGER (1..32) OPTIONAL -- Need ON + ]], + [[ + motionMeasurements-r15 ENUMERATED { requested } OPTIONAL -- Need ON + ]] +} + +-- ASN1STOP +-- ASN1START + +OTDOA-ProvideCapabilities ::= SEQUENCE { + otdoa-Mode BIT STRING { ue-assisted (0), + ue-assisted-NB-r14 (1), + ue-assisted-NB-TDD-r15 (2) } (SIZE (1..8)), + ..., + supportedBandListEUTRA SEQUENCE (SIZE (1..maxBands)) OF SupportedBandEUTRA OPTIONAL, + supportedBandListEUTRA-v9a0 SEQUENCE (SIZE (1..maxBands)) OF SupportedBandEUTRA-v9a0 + OPTIONAL, + interFreqRSTDmeasurement-r10 ENUMERATED { supported } OPTIONAL, + additionalNeighbourCellInfoList-r10 ENUMERATED { supported } OPTIONAL, + prs-id-r14 ENUMERATED { supported } OPTIONAL, + tp-separation-via-muting-r14 ENUMERATED { supported } OPTIONAL, + additional-prs-config-r14 ENUMERATED { supported } OPTIONAL, + prs-based-tbs-r14 ENUMERATED { supported } OPTIONAL, + additionalPathsReport-r14 ENUMERATED { supported } OPTIONAL, + densePrsConfig-r14 ENUMERATED { supported } OPTIONAL, + maxSupportedPrsBandwidth-r14 ENUMERATED { n6, n15, n25, n50, n75, n100, ...} OPTIONAL, + prsOccGroup-r14 ENUMERATED { supported } OPTIONAL, + prsFrequencyHopping-r14 ENUMERATED { supported } OPTIONAL, + maxSupportedPrsConfigs-r14 ENUMERATED { c2, c3 } OPTIONAL, + periodicalReporting-r14 ENUMERATED { supported } OPTIONAL, + multiPrbNprs-r14 ENUMERATED { supported } OPTIONAL, + idleStateForMeasurements-r14 ENUMERATED { required } OPTIONAL, + numberOfRXantennas-r14 ENUMERATED { rx1, ... } OPTIONAL, + motionMeasurements-r15 ENUMERATED { supported } OPTIONAL, + interRAT-RSTDmeasurement-r15 ENUMERATED { supported } OPTIONAL +} + +maxBands INTEGER ::= 64 + +SupportedBandEUTRA ::= SEQUENCE { + bandEUTRA INTEGER (1..maxFBI) +} + +SupportedBandEUTRA-v9a0 ::= SEQUENCE { + bandEUTRA-v9a0 INTEGER (maxFBI-Plus1..maxFBI2) OPTIONAL +} + +maxFBI INTEGER ::= 64 -- Maximum value of frequency band indicator +maxFBI-Plus1 INTEGER ::= 65 -- lowest value extended FBI range +maxFBI2 INTEGER ::= 256 -- highest value extended FBI range + +-- ASN1STOP +-- ASN1START + +OTDOA-RequestCapabilities ::= SEQUENCE { + ... +} + +-- ASN1STOP +-- ASN1START + +OTDOA-Error ::= CHOICE { + locationServerErrorCauses OTDOA-LocationServerErrorCauses, + targetDeviceErrorCauses OTDOA-TargetDeviceErrorCauses, + ... +} + +-- ASN1STOP +-- ASN1START + +OTDOA-LocationServerErrorCauses ::= SEQUENCE { + cause ENUMERATED { undefined, + assistanceDataNotSupportedByServer, + assistanceDataSupportedButCurrentlyNotAvailableByServer, + ... + }, + ... +} + +-- ASN1STOP +-- ASN1START + +OTDOA-TargetDeviceErrorCauses ::= SEQUENCE { + cause ENUMERATED { undefined, + assistance-data-missing, + unableToMeasureReferenceCell, + unableToMeasureAnyNeighbourCell, + attemptedButUnableToMeasureSomeNeighbourCells, + ... + }, + ... +} + +-- ASN1STOP +-- ASN1START + +A-GNSS-ProvideAssistanceData ::= SEQUENCE { + gnss-CommonAssistData GNSS-CommonAssistData OPTIONAL, -- Need ON + gnss-GenericAssistData GNSS-GenericAssistData OPTIONAL, -- Need ON + gnss-Error A-GNSS-Error OPTIONAL, -- Need ON + ..., + [[ + gnss-PeriodicAssistData-r15 GNSS-PeriodicAssistData-r15 OPTIONAL -- Cond CtrTrans + ]] +} + +-- ASN1STOP +-- ASN1START + +GNSS-CommonAssistData ::= SEQUENCE { + gnss-ReferenceTime GNSS-ReferenceTime OPTIONAL, -- Need ON + gnss-ReferenceLocation GNSS-ReferenceLocation OPTIONAL, -- Need ON + gnss-IonosphericModel GNSS-IonosphericModel OPTIONAL, -- Need ON + gnss-EarthOrientationParameters GNSS-EarthOrientationParameters OPTIONAL, -- Need ON + ..., + [[ + gnss-RTK-ReferenceStationInfo-r15 + GNSS-RTK-ReferenceStationInfo-r15 OPTIONAL, -- Need ON + gnss-RTK-CommonObservationInfo-r15 + GNSS-RTK-CommonObservationInfo-r15 OPTIONAL, -- Cond RTK + gnss-RTK-AuxiliaryStationData-r15 + GNSS-RTK-AuxiliaryStationData-r15 OPTIONAL -- Need ON + ]], + [[ + gnss-SSR-CorrectionPoints-r16 + GNSS-SSR-CorrectionPoints-r16 OPTIONAL -- Need ON + ]] +} + +-- ASN1STOP +-- ASN1START + +GNSS-GenericAssistData ::= SEQUENCE (SIZE (1..16)) OF GNSS-GenericAssistDataElement + +GNSS-GenericAssistDataElement ::= SEQUENCE { + gnss-ID GNSS-ID, + sbas-ID SBAS-ID OPTIONAL, -- Cond GNSS-ID-SBAS + gnss-TimeModels GNSS-TimeModelList OPTIONAL, -- Need ON + gnss-DifferentialCorrections GNSS-DifferentialCorrections OPTIONAL, -- Need ON + gnss-NavigationModel GNSS-NavigationModel OPTIONAL, -- Need ON + gnss-RealTimeIntegrity GNSS-RealTimeIntegrity OPTIONAL, -- Need ON + gnss-DataBitAssistance GNSS-DataBitAssistance OPTIONAL, -- Need ON + gnss-AcquisitionAssistance GNSS-AcquisitionAssistance OPTIONAL, -- Need ON + gnss-Almanac GNSS-Almanac OPTIONAL, -- Need ON + gnss-UTC-Model GNSS-UTC-Model OPTIONAL, -- Need ON + gnss-AuxiliaryInformation GNSS-AuxiliaryInformation OPTIONAL, -- Need ON + ..., + [[ + bds-DifferentialCorrections-r12 + BDS-DifferentialCorrections-r12 OPTIONAL, -- Cond GNSS-ID-BDS + bds-GridModel-r12 BDS-GridModelParameter-r12 OPTIONAL -- Cond GNSS-ID-BDS + ]], + [[ + gnss-RTK-Observations-r15 GNSS-RTK-Observations-r15 OPTIONAL, -- Need ON + glo-RTK-BiasInformation-r15 GLO-RTK-BiasInformation-r15 OPTIONAL, -- Cond GNSS-ID-GLO + gnss-RTK-MAC-CorrectionDifferences-r15 + GNSS-RTK-MAC-CorrectionDifferences-r15 + OPTIONAL, -- Need ON + gnss-RTK-Residuals-r15 GNSS-RTK-Residuals-r15 OPTIONAL, -- Need ON + gnss-RTK-FKP-Gradients-r15 GNSS-RTK-FKP-Gradients-r15 OPTIONAL, -- Need ON + gnss-SSR-OrbitCorrections-r15 + GNSS-SSR-OrbitCorrections-r15 OPTIONAL, -- Need ON + gnss-SSR-ClockCorrections-r15 + GNSS-SSR-ClockCorrections-r15 OPTIONAL, -- Need ON + gnss-SSR-CodeBias-r15 GNSS-SSR-CodeBias-r15 OPTIONAL -- Need ON + ]], + [[ + gnss-SSR-URA-r16 GNSS-SSR-URA-r16 OPTIONAL, -- Need ON + gnss-SSR-PhaseBias-r16 GNSS-SSR-PhaseBias-r16 OPTIONAL, -- Need ON + gnss-SSR-STEC-Correction-r16 GNSS-SSR-STEC-Correction-r16 + OPTIONAL, -- Need ON + gnss-SSR-GriddedCorrection-r16 GNSS-SSR-GriddedCorrection-r16 + OPTIONAL, -- Need ON + navic-DifferentialCorrections-r16 NavIC-DifferentialCorrections-r16 + OPTIONAL, -- Cond GNSS-ID-NavIC + navic-GridModel-r16 NavIC-GridModelParameter-r16 + OPTIONAL -- Cond GNSS-ID-NavIC + ]] +} + +-- ASN1STOP +-- ASN1START + +GNSS-PeriodicAssistData-r15 ::= SEQUENCE { + gnss-RTK-PeriodicObservations-r15 GNSS-PeriodicControlParam-r15 OPTIONAL, -- Need ON + glo-RTK-PeriodicBiasInformation-r15 GNSS-PeriodicControlParam-r15 OPTIONAL, -- Need ON + gnss-RTK-MAC-PeriodicCorrectionDifferences-r15 + GNSS-PeriodicControlParam-r15 OPTIONAL, -- Need ON + gnss-RTK-PeriodicResiduals-r15 GNSS-PeriodicControlParam-r15 OPTIONAL, -- Need ON + gnss-RTK-FKP-PeriodicGradients-r15 GNSS-PeriodicControlParam-r15 OPTIONAL, -- Need ON + gnss-SSR-PeriodicOrbitCorrections-r15 + GNSS-PeriodicControlParam-r15 OPTIONAL, -- Need ON + gnss-SSR-PeriodicClockCorrections-r15 + GNSS-PeriodicControlParam-r15 OPTIONAL, -- Need ON + gnss-SSR-PeriodicCodeBias-r15 GNSS-PeriodicControlParam-r15 OPTIONAL, -- Need ON + ..., + [[ + gnss-SSR-PeriodicURA-r16 GNSS-PeriodicControlParam-r15 OPTIONAL, -- Need ON + gnss-SSR-PeriodicPhaseBias-r16 GNSS-PeriodicControlParam-r15 OPTIONAL, -- Need ON + gnss-SSR-PeriodicSTEC-Correction-r16 GNSS-PeriodicControlParam-r15 OPTIONAL, -- Need ON + gnss-SSR-PeriodicGriddedCorrection-r16 GNSS-PeriodicControlParam-r15 OPTIONAL -- Need ON + ]] +} + +-- ASN1STOP +-- ASN1START + +GNSS-ReferenceTime ::= SEQUENCE { + gnss-SystemTime GNSS-SystemTime, + referenceTimeUnc INTEGER (0..127) OPTIONAL, -- Cond noFTA + gnss-ReferenceTimeForCells SEQUENCE (SIZE (1..16)) OF + GNSS-ReferenceTimeForOneCell OPTIONAL, -- Need ON + ... +} + +GNSS-ReferenceTimeForOneCell ::= SEQUENCE { + networkTime NetworkTime, + referenceTimeUnc INTEGER (0..127), + bsAlign ENUMERATED {true} OPTIONAL, + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-SystemTime ::= SEQUENCE { + gnss-TimeID GNSS-ID, + gnss-DayNumber INTEGER (0..32767), + gnss-TimeOfDay INTEGER (0..86399), + gnss-TimeOfDayFrac-msec INTEGER (0..999) OPTIONAL, -- Need ON + notificationOfLeapSecond BIT STRING (SIZE(2)) OPTIONAL, -- Cond gnss-TimeID-glonass + gps-TOW-Assist GPS-TOW-Assist OPTIONAL, -- Cond gnss-TimeID-gps + ... +} + +-- ASN1STOP +-- ASN1START + +GPS-TOW-Assist ::= SEQUENCE (SIZE(1..64)) OF GPS-TOW-AssistElement + +GPS-TOW-AssistElement ::= SEQUENCE { + satelliteID INTEGER (1..64), + tlmWord INTEGER (0..16383), + antiSpoof INTEGER (0..1), + alert INTEGER (0..1), + tlmRsvdBits INTEGER (0..3), + ... +} + +-- ASN1STOP +-- ASN1START + +NetworkTime ::= SEQUENCE { + secondsFromFrameStructureStart INTEGER(0..12533), + fractionalSecondsFromFrameStructureStart INTEGER(0..3999999), + frameDrift INTEGER (-64..63) OPTIONAL, -- Cond GNSSsynch + cellID CHOICE { + eUTRA SEQUENCE { + physCellId INTEGER (0..503), + cellGlobalIdEUTRA CellGlobalIdEUTRA-AndUTRA OPTIONAL, -- Need ON + earfcn ARFCN-ValueEUTRA, + ..., + [[ earfcn-v9a0 ARFCN-ValueEUTRA-v9a0 OPTIONAL -- Cond EARFCN-max + ]] + }, + uTRA SEQUENCE { + mode CHOICE { + fdd SEQUENCE { + primary-CPICH-Info INTEGER (0..511), + ... + }, + tdd SEQUENCE { + cellParameters INTEGER (0..127), + ... + } + }, + cellGlobalIdUTRA CellGlobalIdEUTRA-AndUTRA OPTIONAL, -- Need ON + uarfcn ARFCN-ValueUTRA, + ... + }, + gSM SEQUENCE { + bcchCarrier INTEGER (0..1023), + bsic INTEGER (0..63), + cellGlobalIdGERAN CellGlobalIdGERAN OPTIONAL, -- Need ON + ... + }, + ..., + nBIoT-r14 SEQUENCE { + nbPhysCellId-r14 INTEGER (0..503), + nbCellGlobalId-r14 ECGI OPTIONAL, -- Need ON + nbCarrierFreq-r14 CarrierFreq-NB-r14, + ... + }, + nr-r15 SEQUENCE { + nrPhysCellId-r15 INTEGER (0..1007), + nrCellGlobalID-r15 NCGI-r15 OPTIONAL, -- Need ON + nrARFCN-r15 ARFCN-ValueNR-r15, + ... + } + }, + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-ReferenceLocation ::= SEQUENCE { + threeDlocation EllipsoidPointWithAltitudeAndUncertaintyEllipsoid, + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-IonosphericModel ::= SEQUENCE { + klobucharModel KlobucharModelParameter OPTIONAL, -- Need ON + neQuickModel NeQuickModelParameter OPTIONAL, -- Need ON + ..., + [[ klobucharModel2-r16 KlobucharModel2Parameter-r16 OPTIONAL -- Need ON + ]] + +} + +-- ASN1STOP +-- ASN1START + +KlobucharModelParameter ::= SEQUENCE { + dataID BIT STRING (SIZE (2)), + alfa0 INTEGER (-128..127), + alfa1 INTEGER (-128..127), + alfa2 INTEGER (-128..127), + alfa3 INTEGER (-128..127), + beta0 INTEGER (-128..127), + beta1 INTEGER (-128..127), + beta2 INTEGER (-128..127), + beta3 INTEGER (-128..127), + ... +} + +-- ASN1STOP +-- ASN1START + +KlobucharModel2Parameter-r16 ::= SEQUENCE { + alfa1-r16 INTEGER (0..1023), + alfa2-r16 INTEGER (-128..127), + alfa3-r16 INTEGER (0..255), + alfa4-r16 INTEGER (0..255), + alfa5-r16 INTEGER (0..255), + alfa6-r16 INTEGER (-128..127), + alfa7-r16 INTEGER (-128..127), + alfa8-r16 INTEGER (-128..127), + alfa9-r16 INTEGER (-128..127), + ... +} + +-- ASN1STOP +-- ASN1START + +NeQuickModelParameter ::= SEQUENCE { + ai0 INTEGER (0..2047), + ai1 INTEGER (-1024..1023), + ai2 INTEGER (-8192..8191), + ionoStormFlag1 INTEGER (0..1) OPTIONAL, -- Need OP + ionoStormFlag2 INTEGER (0..1) OPTIONAL, -- Need OP + ionoStormFlag3 INTEGER (0..1) OPTIONAL, -- Need OP + ionoStormFlag4 INTEGER (0..1) OPTIONAL, -- Need OP + ionoStormFlag5 INTEGER (0..1) OPTIONAL, -- Need OP + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-EarthOrientationParameters ::= SEQUENCE { + teop INTEGER (0..65535), + pmX INTEGER (-1048576..1048575), + pmXdot INTEGER (-16384..16383), + pmY INTEGER (-1048576..1048575), + pmYdot INTEGER (-16384..16383), + deltaUT1 INTEGER (-1073741824..1073741823), + deltaUT1dot INTEGER (-262144..262143), + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-RTK-ReferenceStationInfo-r15 ::= SEQUENCE { + referenceStationID-r15 GNSS-ReferenceStationID-r15, + referenceStationIndicator-r15 ENUMERATED {physical, non-physical}, + antenna-reference-point-ECEF-X-r15 INTEGER (-137438953472..137438953471), + antenna-reference-point-ECEF-Y-r15 INTEGER (-137438953472..137438953471), + antenna-reference-point-ECEF-Z-r15 INTEGER (-137438953472..137438953471), + antennaHeight-r15 INTEGER (0..65535) OPTIONAL, -- Need ON + antennaDescription-r15 AntennaDescription-r15 OPTIONAL, -- Need ON + antenna-reference-point-unc-r15 AntennaReferencePointUnc-r15 OPTIONAL, -- Need ON + physical-reference-station-info-r15 PhysicalReferenceStationInfo-r15 OPTIONAL, -- Cond NP + ..., + [[ + equalIntegerAmbiguityLevel-r16 EqualIntegerAmbiguityLevel-r16 OPTIONAL -- Need ON + ]] +} + +AntennaDescription-r15 ::= SEQUENCE { + antennaDescriptor-r15 VisibleString (SIZE (1..256)), + antennaSetUpID-r15 ENUMERATED { non-zero } OPTIONAL, -- Need OP + ... +} + +AntennaReferencePointUnc-r15 ::= SEQUENCE { + uncertainty-X-r15 INTEGER (0..255), + confidence-X-r15 INTEGER (0..100), + uncertainty-Y-r15 INTEGER (0..255), + confidence-Y-r15 INTEGER (0..100), + uncertainty-Z-r15 INTEGER (0..255), + confidence-Z-r15 INTEGER (0..100), + ... +} + +PhysicalReferenceStationInfo-r15 ::= SEQUENCE { + physicalReferenceStationID-r15 GNSS-ReferenceStationID-r15, + physical-ARP-ECEF-X-r15 INTEGER (-137438953472..137438953471), + physical-ARP-ECEF-Y-r15 INTEGER (-137438953472..137438953471), + physical-ARP-ECEF-Z-r15 INTEGER (-137438953472..137438953471), + physical-ARP-unc-r15 AntennaReferencePointUnc-r15 OPTIONAL, -- Need ON + ... +} + +EqualIntegerAmbiguityLevel-r16 ::= CHOICE { + allReferenceStations-r16 NULL, + referenceStationList-r16 ReferenceStationList-r16 +} + +ReferenceStationList-r16 ::= SEQUENCE (SIZE(1..16)) OF GNSS-ReferenceStationID-r15 + +-- ASN1STOP +-- ASN1START + +GNSS-RTK-CommonObservationInfo-r15 ::= SEQUENCE { + referenceStationID-r15 GNSS-ReferenceStationID-r15, + clockSteeringIndicator-r15 INTEGER (0..3), + externalClockIndicator-r15 INTEGER (0..3), + smoothingIndicator-r15 BIT STRING (SIZE(1)), + smoothingInterval-r15 BIT STRING (SIZE(3)), + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-RTK-AuxiliaryStationData-r15 ::= SEQUENCE { + networkID-r15 GNSS-NetworkID-r15, + subNetworkID-r15 GNSS-SubNetworkID-r15 OPTIONAL, -- Need ON + master-referenceStationID-r15 GNSS-ReferenceStationID-r15, + auxiliaryStationList-r15 AuxiliaryStationList-r15, + ... +} + +AuxiliaryStationList-r15 ::= SEQUENCE (SIZE (1..32)) OF AuxiliaryStationElement-r15 + +AuxiliaryStationElement-r15 ::= SEQUENCE { + aux-referenceStationID-r15 GNSS-ReferenceStationID-r15, + aux-master-delta-latitude-r15 INTEGER (-524288..524287), + aux-master-delta-longitude-r15 INTEGER (-1048576..1048575), + aux-master-delta-height-r15 INTEGER (-4194304..4194303), + aux-ARP-unc-r15 Aux-ARP-Unc-r15 OPTIONAL, -- Need ON + ... +} + +Aux-ARP-Unc-r15 ::= SEQUENCE { + horizontalUncertainty-r15 INTEGER (0..255), + horizontalConfidence-r15 INTEGER (0..100), + verticalUncertainty-r15 INTEGER (0..255) OPTIONAL, -- Need ON + verticalConfidence-r15 INTEGER (0..100) OPTIONAL, -- Need ON + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-SSR-CorrectionPoints-r16 ::= SEQUENCE { + correctionPointSetID-r16 INTEGER (0..16383), + correctionPoints-r16 CHOICE { + listOfCorrectionPoints-r16 GNSS-SSR-ListOfCorrectionPoints-r16, + arrayOfCorrectionPoints-r16 GNSS-SSR-ArrayOfCorrectionPoints-r16 + }, + ... +} + +GNSS-SSR-ListOfCorrectionPoints-r16 ::= SEQUENCE { + referencePointLatitude-r16 INTEGER (-16384..16383), + referencePointLongitude-r16 INTEGER (-32768..32767), + relativeLocationsList-r16 SEQUENCE (SIZE (0..63)) OF RelativeLocationElement-r16, + ... +} + +RelativeLocationElement-r16 ::= SEQUENCE { + deltaLatitude-r16 INTEGER (-512..511), + deltaLongitude-r16 INTEGER (-1024..1023), + ... +} + +GNSS-SSR-ArrayOfCorrectionPoints-r16 ::=SEQUENCE { + referencePointLatitude-r16 INTEGER (-16384..16383), + referencePointLongitude-r16 INTEGER (-32768..32767), + numberOfStepsLatitude-r16 INTEGER (0..63), + numberOfStepsLongitude-r16 INTEGER (0..63), + stepOfLatitude-r16 INTEGER (1..511), + stepOfLongitude-r16 INTEGER (1..1023), + bitmaskOfGrids-r16 BIT STRING (SIZE(64)) OPTIONAL, -- Need OP + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-TimeModelList ::= SEQUENCE (SIZE (1..15)) OF GNSS-TimeModelElement + +GNSS-TimeModelElement ::= SEQUENCE { + gnss-TimeModelRefTime INTEGER (0..65535), + tA0 INTEGER (-67108864..67108863), + tA1 INTEGER (-4096..4095) OPTIONAL, -- Need ON + tA2 INTEGER (-64..63) OPTIONAL, -- Need ON + gnss-TO-ID INTEGER (1..15), + weekNumber INTEGER (0..8191) OPTIONAL, -- Need ON + deltaT INTEGER (-128..127) OPTIONAL, -- Need ON + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-DifferentialCorrections ::= SEQUENCE { + dgnss-RefTime INTEGER (0..3599), + dgnss-SgnTypeList DGNSS-SgnTypeList, + ... +} + +DGNSS-SgnTypeList ::= SEQUENCE (SIZE (1..3)) OF DGNSS-SgnTypeElement + +DGNSS-SgnTypeElement ::= SEQUENCE { + gnss-SignalID GNSS-SignalID, + gnss-StatusHealth INTEGER (0..7), + dgnss-SatList DGNSS-SatList, + ... +} + +DGNSS-SatList ::= SEQUENCE (SIZE (1..64)) OF DGNSS-CorrectionsElement + +DGNSS-CorrectionsElement ::= SEQUENCE { + svID SV-ID, + iod BIT STRING (SIZE(11)), + udre INTEGER (0..3), + pseudoRangeCor INTEGER (-2047..2047), + rangeRateCor INTEGER (-127..127), + udreGrowthRate INTEGER (0..7) OPTIONAL, -- Need ON + udreValidityTime INTEGER (0..7) OPTIONAL, -- Need ON + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-NavigationModel ::= SEQUENCE { + nonBroadcastIndFlag INTEGER (0..1), + gnss-SatelliteList GNSS-NavModelSatelliteList, + ... +} + +GNSS-NavModelSatelliteList ::= SEQUENCE (SIZE(1..64)) OF GNSS-NavModelSatelliteElement + +GNSS-NavModelSatelliteElement ::= SEQUENCE { + svID SV-ID, + svHealth BIT STRING (SIZE(8)), + iod BIT STRING (SIZE(11)), + gnss-ClockModel GNSS-ClockModel, + gnss-OrbitModel GNSS-OrbitModel, + ..., + [[ svHealthExt-v1240 BIT STRING (SIZE(4)) OPTIONAL -- Need ON + ]] +} + +GNSS-ClockModel ::= CHOICE { + standardClockModelList StandardClockModelList, -- Model-1 + nav-ClockModel NAV-ClockModel, -- Model-2 + cnav-ClockModel CNAV-ClockModel, -- Model-3 + glonass-ClockModel GLONASS-ClockModel, -- Model-4 + sbas-ClockModel SBAS-ClockModel, -- Model-5 + ..., + bds-ClockModel-r12 BDS-ClockModel-r12, -- Model-6 + bds-ClockModel2-r16 BDS-ClockModel2-r16, -- Model-7 + navic-ClockModel-r16 NavIC-ClockModel-r16 -- Model-8 +} + +GNSS-OrbitModel ::= CHOICE { + keplerianSet NavModelKeplerianSet, -- Model-1 + nav-KeplerianSet NavModelNAV-KeplerianSet, -- Model-2 + cnav-KeplerianSet NavModelCNAV-KeplerianSet, -- Model-3 + glonass-ECEF NavModel-GLONASS-ECEF, -- Model-4 + sbas-ECEF NavModel-SBAS-ECEF, -- Model-5 + ..., + bds-KeplerianSet-r12 NavModel-BDS-KeplerianSet-r12, -- Model-6 + bds-KeplerianSet2-r16 NavModel-BDS-KeplerianSet2-r16, -- Model-7 + navic-KeplerianSet-r16 NavModel-NavIC-KeplerianSet-r16 -- Model-8 +} + +-- ASN1STOP +-- ASN1START + +StandardClockModelList ::= SEQUENCE (SIZE(1..2)) OF StandardClockModelElement + +StandardClockModelElement ::= SEQUENCE { + stanClockToc INTEGER (0..16383), + stanClockAF2 INTEGER (-32..31), + stanClockAF1 INTEGER (-1048576..1048575), + stanClockAF0 INTEGER (-1073741824..1073741823), + stanClockTgd INTEGER (-512..511) OPTIONAL, -- Need ON + sisa INTEGER (0..255), + stanModelID INTEGER (0..1) OPTIONAL, -- Need ON + ... +} + +-- ASN1STOP +-- ASN1START + +NAV-ClockModel ::= SEQUENCE { + navToc INTEGER (0..37799), + navaf2 INTEGER (-128..127), + navaf1 INTEGER (-32768..32767), + navaf0 INTEGER (-2097152..2097151), + navTgd INTEGER (-128..127), + ... +} + +-- ASN1STOP +-- ASN1START + +CNAV-ClockModel ::= SEQUENCE { + cnavToc INTEGER (0..2015), + cnavTop INTEGER (0..2015), + cnavURA0 INTEGER (-16..15), + cnavURA1 INTEGER (0..7), + cnavURA2 INTEGER (0..7), + cnavAf2 INTEGER (-512..511), + cnavAf1 INTEGER (-524288..524287), + cnavAf0 INTEGER (-33554432..33554431), + cnavTgd INTEGER (-4096..4095), + cnavISCl1cp INTEGER (-4096..4095) OPTIONAL, -- Need ON + cnavISCl1cd INTEGER (-4096..4095) OPTIONAL, -- Need ON + cnavISCl1ca INTEGER (-4096..4095) OPTIONAL, -- Need ON + cnavISCl2c INTEGER (-4096..4095) OPTIONAL, -- Need ON + cnavISCl5i5 INTEGER (-4096..4095) OPTIONAL, -- Need ON + cnavISCl5q5 INTEGER (-4096..4095) OPTIONAL, -- Need ON + ... +} + +-- ASN1STOP +-- ASN1START + +GLONASS-ClockModel ::= SEQUENCE { + gloTau INTEGER (-2097152..2097151), + gloGamma INTEGER (-1024..1023), + gloDeltaTau INTEGER (-16..15) OPTIONAL, -- Need ON + ... +} + +-- ASN1STOP +-- ASN1START + +SBAS-ClockModel ::= SEQUENCE { + sbasTo INTEGER (0..5399), + sbasAgfo INTEGER (-2048..2047), + sbasAgf1 INTEGER (-128..127), + ... +} + +-- ASN1STOP +-- ASN1START + +BDS-ClockModel-r12 ::= SEQUENCE { + bdsAODC-r12 INTEGER (0..31), + bdsToc-r12 INTEGER (0..131071), + bdsA0-r12 INTEGER (-8388608..8388607), + bdsA1-r12 INTEGER (-2097152..2097151), + bdsA2-r12 INTEGER (-1024..1023), + bdsTgd1-r12 INTEGER (-512..511), + ... +} + +-- ASN1STOP +-- ASN1START +BDS-ClockModel2-r16 ::= SEQUENCE { + bdsToc-r16 INTEGER (0..2047), + bdsA0-r16 INTEGER (-16777216..16777215), + bdsA1-r16 INTEGER (-2097152..2097151), + bdsA2-r16 INTEGER (-1024..1023), + bdsTgdB1Cp-r16 INTEGER (-2048..2047), + bdsIscB1Cd-r16 INTEGER (-2048..2047), + ... +} + +-- ASN1STOP +-- ASN1START + +NavIC-ClockModel-r16 ::= SEQUENCE { + navic-Toc-r16 INTEGER (0..65535), + navic-af2-r16 INTEGER (-128..127), + navic-af1-r16 INTEGER (-32768..32767), + navic-af0-r16 INTEGER (-2097152..2097151), + navic-Tgd-r16 INTEGER (-128..127), + ... +} + +-- ASN1STOP +-- ASN1START + +NavModelKeplerianSet ::= SEQUENCE { + keplerToe INTEGER (0 .. 16383), + keplerW INTEGER (-2147483648..2147483647), + keplerDeltaN INTEGER (-32768..32767), + keplerM0 INTEGER (-2147483648..2147483647), + keplerOmegaDot INTEGER (-8388608.. 8388607), + keplerE INTEGER (0..4294967295), + keplerIDot INTEGER (-8192..8191), + keplerAPowerHalf INTEGER (0.. 4294967295), + keplerI0 INTEGER (-2147483648..2147483647), + keplerOmega0 INTEGER (-2147483648..2147483647), + keplerCrs INTEGER (-32768..32767), + keplerCis INTEGER (-32768..32767), + keplerCus INTEGER (-32768..32767), + keplerCrc INTEGER (-32768..32767), + keplerCic INTEGER (-32768..32767), + keplerCuc INTEGER (-32768..32767), + ... +} + +-- ASN1STOP +-- ASN1START + +NavModelNAV-KeplerianSet ::= SEQUENCE { + navURA INTEGER (0..15), + navFitFlag INTEGER (0..1), + navToe INTEGER (0..37799), + navOmega INTEGER (-2147483648..2147483647), + navDeltaN INTEGER (-32768..32767), + navM0 INTEGER (-2147483648..2147483647), + navOmegaADot INTEGER (-8388608..8388607), + navE INTEGER (0..4294967295), + navIDot INTEGER (-8192..8191), + navAPowerHalf INTEGER (0..4294967295), + navI0 INTEGER (-2147483648..2147483647), + navOmegaA0 INTEGER (-2147483648..2147483647), + navCrs INTEGER (-32768..32767), + navCis INTEGER (-32768..32767), + navCus INTEGER (-32768..32767), + navCrc INTEGER (-32768..32767), + navCic INTEGER (-32768..32767), + navCuc INTEGER (-32768..32767), + addNAVparam SEQUENCE { + ephemCodeOnL2 INTEGER (0..3), + ephemL2Pflag INTEGER (0..1), + ephemSF1Rsvd SEQUENCE { + reserved1 INTEGER (0..8388607), -- 23-bit field + reserved2 INTEGER (0..16777215), -- 24-bit field + reserved3 INTEGER (0..16777215), -- 24-bit field + reserved4 INTEGER (0..65535) -- 16-bit field + }, + ephemAODA INTEGER (0..31) + } OPTIONAL, -- Need ON + ... +} + +-- ASN1STOP +-- ASN1START + +NavModelCNAV-KeplerianSet ::= SEQUENCE { + cnavTop INTEGER (0..2015), + cnavURAindex INTEGER (-16..15), + cnavDeltaA INTEGER (-33554432..33554431), + cnavAdot INTEGER (-16777216..16777215), + cnavDeltaNo INTEGER (-65536..65535), + cnavDeltaNoDot INTEGER (-4194304..4194303), + cnavMo INTEGER (-4294967296..4294967295), + cnavE INTEGER (0..8589934591), + cnavOmega INTEGER (-4294967296..4294967295), + cnavOMEGA0 INTEGER (-4294967296..4294967295), + cnavDeltaOmegaDot INTEGER (-65536..65535), + cnavIo INTEGER (-4294967296..4294967295), + cnavIoDot INTEGER (-16384..16383), + cnavCis INTEGER (-32768..32767), + cnavCic INTEGER (-32768..32767), + cnavCrs INTEGER (-8388608..8388607), + cnavCrc INTEGER (-8388608..8388607), + cnavCus INTEGER (-1048576..1048575), + cnavCuc INTEGER (-1048576..1048575), + ... +} + +-- ASN1STOP +-- ASN1START + +NavModel-GLONASS-ECEF ::= SEQUENCE { + gloEn INTEGER (0..31), + gloP1 BIT STRING (SIZE(2)), + gloP2 BOOLEAN, + gloM INTEGER (0..3), + gloX INTEGER (-67108864..67108863), + gloXdot INTEGER (-8388608..8388607), + gloXdotdot INTEGER (-16..15), + gloY INTEGER (-67108864..67108863), + gloYdot INTEGER (-8388608..8388607), + gloYdotdot INTEGER (-16..15), + gloZ INTEGER (-67108864..67108863), + gloZdot INTEGER (-8388608..8388607), + gloZdotdot INTEGER (-16..15), + ... +} + +-- ASN1STOP +-- ASN1START + +NavModel-SBAS-ECEF ::= SEQUENCE { + sbasTo INTEGER (0..5399) OPTIONAL, -- Cond ClockModel + sbasAccuracy BIT STRING (SIZE(4)), + sbasXg INTEGER (-536870912..536870911), + sbasYg INTEGER (-536870912..536870911), + sbasZg INTEGER (-16777216..16777215), + sbasXgDot INTEGER (-65536..65535), + sbasYgDot INTEGER (-65536..65535), + sbasZgDot INTEGER (-131072..131071), + sbasXgDotDot INTEGER (-512..511), + sbagYgDotDot INTEGER (-512..511), + sbasZgDotDot INTEGER (-512..511), + ... +} + +-- ASN1STOP +-- ASN1START + +NavModel-BDS-KeplerianSet-r12 ::= SEQUENCE { + bdsAODE-r12 INTEGER (0..31), + bdsURAI-r12 INTEGER (0..15), + bdsToe-r12 INTEGER (0..131071), + bdsAPowerHalf-r12 INTEGER (0..4294967295), + bdsE-r12 INTEGER (0..4294967295), + bdsW-r12 INTEGER (-2147483648..2147483647), + bdsDeltaN-r12 INTEGER (-32768..32767), + bdsM0-r12 INTEGER (-2147483648..2147483647), + bdsOmega0-r12 INTEGER (-2147483648..2147483647), + bdsOmegaDot-r12 INTEGER (-8388608..8388607), + bdsI0-r12 INTEGER (-2147483648..2147483647), + bdsIDot-r12 INTEGER (-8192..8191), + bdsCuc-r12 INTEGER (-131072..131071), + bdsCus-r12 INTEGER (-131072..131071), + bdsCrc-r12 INTEGER (-131072..131071), + bdsCrs-r12 INTEGER (-131072..131071), + bdsCic-r12 INTEGER (-131072..131071), + bdsCis-r12 INTEGER (-131072..131071), + ... +} + +-- ASN1STOP +-- ASN1START + +NavModel-BDS-KeplerianSet2-r16 ::= SEQUENCE { + bdsIODE-r16 INTEGER (0..255), + bdsToe-r16 INTEGER (0..2047), + bdsDeltaA-r16 INTEGER (-33554432..33554431), + bdsAdot-r16 INTEGER (-16777216..16777216), + bdsDeltaN0-r16 INTEGER (-65536..65535), + bdsDeltaN0dot-r16 INTEGER (-4194304..4194303), + bdsM0-r16 INTEGER (-4294967296..4294967295), + bdsE-r16 INTEGER (0..8589934591), + bdsOmega-r16 INTEGER (-4294967296..4294967295), + bdsOmega0-r16 INTEGER (-4294967296..4294967295), + bdsI0-r16 INTEGER (-4294967296..4294967295), + bdsOmegaDot-r16 INTEGER (-262144..262143), + bdsI0Dot-r16 INTEGER (-16384..16383), + bdsCuc-r16 INTEGER (-1048576..1048575), + bdsCus-r16 INTEGER (-1048576..1048575), + bdsCrc-r16 INTEGER (-8388608..8388607), + bdsCrs-r16 INTEGER (-8388608..8388607), + bdsCic-r16 INTEGER (-32768..32767), + bdsCis-r16 INTEGER (-32768..32767), + ... +} + +-- ASN1STOP +-- ASN1START + +NavModel-NavIC-KeplerianSet-r16 ::= SEQUENCE { + navic-Toe-r16 INTEGER (0..65536), + navic-URAI-r16 INTEGER (0..15), + navic-W-r16 INTEGER (-2147483648..2147483647), + navic-DeltaN-r16 INTEGER (-2097152..2097151), + navic-M0-r16 INTEGER (-2147483648..2147483647), + navic-OmegaDot-r16 INTEGER (-2147483648..2147483647), + navic-E-r16 INTEGER (0..4294967295), + navic-IDot-r16 INTEGER (-8192..8191), + navic-APowerHalf-r16 INTEGER (0.. 4294967295), + navic-I0-r16 INTEGER (-2147483648..2147483647), + navic-Omega0-r16 INTEGER (-2147483648..2147483647), + navic-Crs-r16 INTEGER (-32768..32767), + navic-Cis-r16 INTEGER (-32768..32767), + navic-Cus-r16 INTEGER (-32768..32767), + navic-Crc-r16 INTEGER (-32768..32767), + navic-Cic-r16 INTEGER (-32768..32767), + navic-Cuc-r16 INTEGER (-32768..32767), + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-RealTimeIntegrity ::= SEQUENCE { + gnss-BadSignalList GNSS-BadSignalList, + ... +} + +GNSS-BadSignalList ::= SEQUENCE (SIZE(1..64)) OF BadSignalElement + +BadSignalElement ::= SEQUENCE { + badSVID SV-ID, + badSignalID GNSS-SignalIDs OPTIONAL, -- Need OP + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-DataBitAssistance ::= SEQUENCE { + gnss-TOD INTEGER (0..3599), + gnss-TODfrac INTEGER (0..999) OPTIONAL, -- Need ON + gnss-DataBitsSatList GNSS-DataBitsSatList, + ... +} + +GNSS-DataBitsSatList ::= SEQUENCE (SIZE(1..64))OF GNSS-DataBitsSatElement + +GNSS-DataBitsSatElement ::= SEQUENCE { + svID SV-ID, + gnss-DataBitsSgnList GNSS-DataBitsSgnList, + ... +} + +GNSS-DataBitsSgnList ::= SEQUENCE (SIZE(1..8)) OF GNSS-DataBitsSgnElement + +GNSS-DataBitsSgnElement ::= SEQUENCE { + gnss-SignalType GNSS-SignalID, + gnss-DataBits BIT STRING (SIZE (1..1024)), + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-AcquisitionAssistance ::= SEQUENCE { + gnss-SignalID GNSS-SignalID, + gnss-AcquisitionAssistList GNSS-AcquisitionAssistList, + ..., + confidence-r10 INTEGER (0..100) OPTIONAL -- Need ON +} + +GNSS-AcquisitionAssistList ::= SEQUENCE (SIZE(1..64)) OF GNSS-AcquisitionAssistElement + +GNSS-AcquisitionAssistElement ::= SEQUENCE { + svID SV-ID, + doppler0 INTEGER (-2048..2047), + doppler1 INTEGER (0..63), + dopplerUncertainty INTEGER (0..4), + codePhase INTEGER (0..1022), + intCodePhase INTEGER (0..127), + codePhaseSearchWindow INTEGER (0..31), + azimuth INTEGER (0..511), + elevation INTEGER (0..127), + ..., + codePhase1023 BOOLEAN OPTIONAL, -- Need OP + dopplerUncertaintyExt-r10 ENUMERATED { d60, + d80, + d100, + d120, + noInformation, ... } OPTIONAL -- Need ON +} + +-- ASN1STOP +-- ASN1START + +GNSS-Almanac ::= SEQUENCE { + weekNumber INTEGER (0..255) OPTIONAL, -- Need ON + toa INTEGER (0..255) OPTIONAL, -- Need ON + ioda INTEGER (0..3) OPTIONAL, -- Need ON + completeAlmanacProvided BOOLEAN, + gnss-AlmanacList GNSS-AlmanacList, + ..., + [[ toa-ext-v1240 INTEGER (256..1023) OPTIONAL, -- Need ON + ioda-ext-v1240 INTEGER (4..15) OPTIONAL -- Need ON + ]], + [[ + weekNumber-ext-r16 INTEGER (256..8191) OPTIONAL, -- Need ON + toa-ext2-r16 INTEGER (256..65535) OPTIONAL -- Need ON + ]] +} + +GNSS-AlmanacList ::= SEQUENCE (SIZE(1..64)) OF GNSS-AlmanacElement + +GNSS-AlmanacElement ::= CHOICE { + keplerianAlmanacSet AlmanacKeplerianSet, -- Model-1 + keplerianNAV-Almanac AlmanacNAV-KeplerianSet, -- Model-2 + keplerianReducedAlmanac AlmanacReducedKeplerianSet, -- Model-3 + keplerianMidiAlmanac AlmanacMidiAlmanacSet, -- Model-4 + keplerianGLONASS AlmanacGLONASS-AlmanacSet, -- Model-5 + ecef-SBAS-Almanac AlmanacECEF-SBAS-AlmanacSet,-- Model-6 + ..., + keplerianBDS-Almanac-r12 AlmanacBDS-AlmanacSet-r12, -- Model-7 + keplerianNavIC-Almanac-r16 AlmanacNavIC-AlmanacSet-r16 -- Model-8 +} + +-- ASN1STOP +-- ASN1START + +AlmanacKeplerianSet ::= SEQUENCE { + svID SV-ID, + kepAlmanacE INTEGER (0..2047), + kepAlmanacDeltaI INTEGER (-1024..1023), + kepAlmanacOmegaDot INTEGER (-1024..1023), + kepSV-StatusINAV BIT STRING (SIZE (4)), + kepSV-StatusFNAV BIT STRING (SIZE (2)) OPTIONAL, -- Need ON + kepAlmanacAPowerHalf INTEGER (-4096..4095), + kepAlmanacOmega0 INTEGER (-32768..32767), + kepAlmanacW INTEGER (-32768..32767), + kepAlmanacM0 INTEGER (-32768..32767), + kepAlmanacAF0 INTEGER (-32768..32767), + kepAlmanacAF1 INTEGER (-4096..4095), + ... +} + +-- ASN1STOP +-- ASN1START + +AlmanacNAV-KeplerianSet ::= SEQUENCE { + svID SV-ID, + navAlmE INTEGER (0..65535), + navAlmDeltaI INTEGER (-32768..32767), + navAlmOMEGADOT INTEGER (-32768..32767), + navAlmSVHealth INTEGER (0..255), + navAlmSqrtA INTEGER (0..16777215), + navAlmOMEGAo INTEGER (-8388608..8388607), + navAlmOmega INTEGER (-8388608..8388607), + navAlmMo INTEGER (-8388608..8388607), + navAlmaf0 INTEGER (-1024..1023), + navAlmaf1 INTEGER (-1024..1023), + ... +} + +-- ASN1STOP +-- ASN1START + +AlmanacReducedKeplerianSet ::= SEQUENCE { + svID SV-ID, + redAlmDeltaA INTEGER (-128..127), + redAlmOmega0 INTEGER (-64..63), + redAlmPhi0 INTEGER (-64..63), + redAlmL1Health BOOLEAN, + redAlmL2Health BOOLEAN, + redAlmL5Health BOOLEAN, + ... +} + +-- ASN1STOP +-- ASN1START + +AlmanacMidiAlmanacSet ::= SEQUENCE { + svID SV-ID, + midiAlmE INTEGER (0..2047), + midiAlmDeltaI INTEGER (-1024..1023), + midiAlmOmegaDot INTEGER (-1024..1023), + midiAlmSqrtA INTEGER (0..131071), + midiAlmOmega0 INTEGER (-32768..32767), + midiAlmOmega INTEGER (-32768..32767), + midiAlmMo INTEGER (-32768..32767), + midiAlmaf0 INTEGER (-1024..1023), + midiAlmaf1 INTEGER (-512..511), + midiAlmL1Health BOOLEAN, + midiAlmL2Health BOOLEAN, + midiAlmL5Health BOOLEAN, + ... +} + +-- ASN1STOP +-- ASN1START + +AlmanacGLONASS-AlmanacSet ::= SEQUENCE { + gloAlm-NA INTEGER (1..1461), + gloAlmnA INTEGER (1..24), + gloAlmHA INTEGER (0..31), + gloAlmLambdaA INTEGER (-1048576..1048575), + gloAlmtlambdaA INTEGER (0..2097151), + gloAlmDeltaIa INTEGER (-131072..131071), + gloAlmDeltaTA INTEGER (-2097152..2097151), + gloAlmDeltaTdotA INTEGER (-64..63), + gloAlmEpsilonA INTEGER (0..32767), + gloAlmOmegaA INTEGER (-32768..32767), + gloAlmTauA INTEGER (-512..511), + gloAlmCA INTEGER (0..1), + gloAlmMA BIT STRING (SIZE(2)) OPTIONAL, -- Need ON + ... +} + +-- ASN1STOP +-- ASN1START + +AlmanacECEF-SBAS-AlmanacSet ::= SEQUENCE { + sbasAlmDataID INTEGER (0..3), + svID SV-ID, + sbasAlmHealth BIT STRING (SIZE(8)), + sbasAlmXg INTEGER (-16384..16383), + sbasAlmYg INTEGER (-16384..16383), + sbasAlmZg INTEGER (-256..255), + sbasAlmXgdot INTEGER (-4..3), + sbasAlmYgDot INTEGER (-4..3), + sbasAlmZgDot INTEGER (-8..7), + sbasAlmTo INTEGER (0..2047), + ... +} + +-- ASN1STOP +-- ASN1START + +AlmanacBDS-AlmanacSet-r12 ::= SEQUENCE { + svID SV-ID, + bdsAlmToa-r12 INTEGER (0..255) OPTIONAL, -- Cond NotSameForAllSV + bdsAlmSqrtA-r12 INTEGER (0..16777215), + bdsAlmE-r12 INTEGER (0..131071), + bdsAlmW-r12 INTEGER (-8388608..8388607), + bdsAlmM0-r12 INTEGER (-8388608..8388607), + bdsAlmOmega0-r12 INTEGER (-8388608..8388607), + bdsAlmOmegaDot-r12 INTEGER (-65536..65535), + bdsAlmDeltaI-r12 INTEGER (-32768..32767), + bdsAlmA0-r12 INTEGER (-1024..1023), + bdsAlmA1-r12 INTEGER (-1024..1023), + bdsSvHealth-r12 BIT STRING (SIZE(9)) OPTIONAL, -- Cond SV-ID + ... +} + +-- ASN1STOP +-- ASN1START + +AlmanacNavIC-AlmanacSet-r16 ::= SEQUENCE { + svID-r16 SV-ID, + navic-AlmToa-r16 INTEGER (0..65535) OPTIONAL, -- Cond NotSameForAllSV + navic-AlmE-r16 INTEGER (0..65535), + navic-AlmOMEGADOT-r16 INTEGER (-32768..32767), + navic-AlmSqrtA-r16 INTEGER (0..16777215), + navic-AlmOMEGAo-r16 INTEGER (-8388608..8388607), + navic-AlmOmega-r16 INTEGER (-8388608..8388607), + navic-AlmMo-r16 INTEGER (-8388608..8388607), + navic-Almaf0-r16 INTEGER (-1024..1023), + navic-Almaf1-r16 INTEGER (-1024..1023), + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-UTC-Model ::= CHOICE { + utcModel1 UTC-ModelSet1, -- Model-1 + utcModel2 UTC-ModelSet2, -- Model-2 + utcModel3 UTC-ModelSet3, -- Model-3 + utcModel4 UTC-ModelSet4, -- Model-4 + ..., + utcModel5-r12 UTC-ModelSet5-r12 -- Model-5 +} + +-- ASN1STOP +-- ASN1START + +UTC-ModelSet1 ::= SEQUENCE { + gnss-Utc-A1 INTEGER (-8388608..8388607), + gnss-Utc-A0 INTEGER (-2147483648..2147483647), + gnss-Utc-Tot INTEGER (0..255), + gnss-Utc-WNt INTEGER (0..255), + gnss-Utc-DeltaTls INTEGER (-128..127), + gnss-Utc-WNlsf INTEGER (0..255), + gnss-Utc-DN INTEGER (-128..127), + gnss-Utc-DeltaTlsf INTEGER (-128..127), + ... +} + +-- ASN1STOP +-- ASN1START + +UTC-ModelSet2 ::= SEQUENCE { + utcA0 INTEGER (-32768..32767), + utcA1 INTEGER (-4096..4095), + utcA2 INTEGER (-64..63), + utcDeltaTls INTEGER (-128..127), + utcTot INTEGER (0..65535), + utcWNot INTEGER (0..8191), + utcWNlsf INTEGER (0..255), + utcDN BIT STRING (SIZE(4)), + utcDeltaTlsf INTEGER (-128..127), + ..., + [[ + utcWNlsf-ext-r16 INTEGER (256..8191) OPTIONAL -- Need ON + ]] +} + +-- ASN1STOP +-- ASN1START + +UTC-ModelSet3 ::= SEQUENCE { + nA INTEGER (1..1461), + tauC INTEGER (-2147483648..2147483647), + b1 INTEGER (-1024..1023) OPTIONAL, -- Cond GLONASS-M + b2 INTEGER (-512..511) OPTIONAL, -- Cond GLONASS-M + kp BIT STRING (SIZE(2)) OPTIONAL, -- Cond GLONASS-M + ... +} + +-- ASN1STOP +-- ASN1START + +UTC-ModelSet4 ::= SEQUENCE { + utcA1wnt INTEGER (-8388608..8388607), + utcA0wnt INTEGER (-2147483648..2147483647), + utcTot INTEGER (0..255), + utcWNt INTEGER (0..255), + utcDeltaTls INTEGER (-128..127), + utcWNlsf INTEGER (0..255), + utcDN INTEGER (-128..127), + utcDeltaTlsf INTEGER (-128..127), + utcStandardID INTEGER (0..7), + ... +} + +-- ASN1STOP +-- ASN1START + +UTC-ModelSet5-r12 ::= SEQUENCE { + utcA0-r12 INTEGER (-2147483648..2147483647), + utcA1-r12 INTEGER (-8388608..8388607), + utcDeltaTls-r12 INTEGER (-128..127), + utcWNlsf-r12 INTEGER (0..255), + utcDN-r12 INTEGER (0..255), + utcDeltaTlsf-r12 INTEGER (-128..127), + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-AuxiliaryInformation ::= CHOICE { + gnss-ID-GPS GNSS-ID-GPS, + gnss-ID-GLONASS GNSS-ID-GLONASS, + ..., + [[ gnss-ID-BDS-r16 GNSS-ID-BDS-r16 + ]] +} + +GNSS-ID-GPS ::= SEQUENCE (SIZE(1..64)) OF GNSS-ID-GPS-SatElement + +GNSS-ID-GPS-SatElement ::= SEQUENCE { + svID SV-ID, + signalsAvailable GNSS-SignalIDs, + ... +} + +GNSS-ID-GLONASS ::= SEQUENCE (SIZE(1..64)) OF GNSS-ID-GLONASS-SatElement + +GNSS-ID-GLONASS-SatElement ::= SEQUENCE { + svID SV-ID, + signalsAvailable GNSS-SignalIDs, + channelNumber INTEGER (-7..13) OPTIONAL, -- Cond FDMA + ... +} + +GNSS-ID-BDS-r16 ::= SEQUENCE (SIZE(1..64)) OF GNSS-ID-BDS-SatElement-r16 + +GNSS-ID-BDS-SatElement-r16 ::= SEQUENCE { + svID-r16 SV-ID, + satType-r16 INTEGER (0..3), + ... +} + +-- ASN1STOP +-- ASN1START + +BDS-DifferentialCorrections-r12 ::= SEQUENCE { + dbds-RefTime-r12 INTEGER (0..3599), + bds-SgnTypeList-r12 BDS-SgnTypeList-r12, + ... +} + +BDS-SgnTypeList-r12 ::= SEQUENCE (SIZE (1..3)) OF BDS-SgnTypeElement-r12 + +BDS-SgnTypeElement-r12 ::= SEQUENCE { + gnss-SignalID GNSS-SignalID OPTIONAL, -- Need ON + dbds-CorrectionList-r12 DBDS-CorrectionList-r12, + ... +} + +DBDS-CorrectionList-r12 ::= SEQUENCE (SIZE (1..64)) OF DBDS-CorrectionElement-r12 + +DBDS-CorrectionElement-r12 ::= SEQUENCE { + svID SV-ID, + bds-UDREI-r12 INTEGER (0..15), + bds-RURAI-r12 INTEGER (0..15), + bds-ECC-DeltaT-r12 INTEGER (-4096..4095), + ... +} + +-- ASN1STOP +-- ASN1START + +BDS-GridModelParameter-r12 ::= SEQUENCE { + bds-RefTime-r12 INTEGER (0..3599), + gridIonList-r12 GridIonList-r12, + ... +} + +GridIonList-r12 ::= SEQUENCE (SIZE (1..320)) OF GridIonElement-r12 + +GridIonElement-r12 ::= SEQUENCE { + igp-ID-r12 INTEGER (1..320), + dt-r12 INTEGER (0..511), + givei-r12 INTEGER (0..15) , + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-RTK-Observations-r15 ::= SEQUENCE { + epochTime-r15 GNSS-SystemTime, + gnss-ObservationList-r15 GNSS-ObservationList-r15, + ... +} + +GNSS-ObservationList-r15 ::= SEQUENCE (SIZE(1..64)) OF GNSS-RTK-SatelliteDataElement-r15 + +GNSS-RTK-SatelliteDataElement-r15 ::= SEQUENCE{ + svID-r15 SV-ID, + integer-ms-r15 INTEGER (0..254) OPTIONAL, -- Need ON + rough-range-r15 INTEGER (0..1023), + rough-phase-range-rate-r15 INTEGER (-8192..8191) OPTIONAL, -- Need ON + gnss-rtk-SatelliteSignalDataList-r15 GNSS-RTK-SatelliteSignalDataList-r15, + ... +} + +GNSS-RTK-SatelliteSignalDataList-r15 ::= SEQUENCE (SIZE(1..24)) OF + GNSS-RTK-SatelliteSignalDataElement-r15 + + +GNSS-RTK-SatelliteSignalDataElement-r15 ::= SEQUENCE { + gnss-SignalID-r15 GNSS-SignalID, + fine-PseudoRange-r15 INTEGER (-524288..524287), + fine-PhaseRange-r15 INTEGER (-8388608..8388607), + lockTimeIndicator-r15 INTEGER (0..1023), + halfCycleAmbiguityIndicator-r15 BIT STRING (SIZE (1)), + carrier-to-noise-ratio-r15 INTEGER (0..1023) OPTIONAL, -- Need ON + fine-PhaseRangeRate-r15 INTEGER (-16384..16383) OPTIONAL, -- Need ON + ... +} + +-- ASN1STOP +-- ASN1START + +GLO-RTK-BiasInformation-r15 ::= SEQUENCE{ + referenceStationID-r15 GNSS-ReferenceStationID-r15, + cpbIndicator-r15 BIT STRING (SIZE(1)), + l1-ca-cpBias-r15 INTEGER (-32768..32767) OPTIONAL, -- Need ON + l1-p-cpBias-r15 INTEGER (-32768..32767) OPTIONAL, -- Need ON + l2-ca-cpBias-r15 INTEGER (-32768..32767) OPTIONAL, -- Need ON + l2-p-cpBias-r15 INTEGER (-32768..32767) OPTIONAL, -- Need ON + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-RTK-MAC-CorrectionDifferences-r15 ::= SEQUENCE { + networkID-r15 GNSS-NetworkID-r15, + subNetworkID-r15 GNSS-SubNetworkID-r15 OPTIONAL, -- Need ON + master-ReferenceStationID-r15 GNSS-ReferenceStationID-r15, + l1-r15 GNSS-FrequencyID-r15 OPTIONAL, -- Need OP + l2-r15 GNSS-FrequencyID-r15 OPTIONAL, -- Need OP + rtkCorrectionDifferencesList-r15 RTK-CorrectionDifferencesList-r15, + ... +} + +RTK-CorrectionDifferencesList-r15 ::= SEQUENCE (SIZE (1..32)) OF + RTK-CorrectionDifferencesElement-r15 + +RTK-CorrectionDifferencesElement-r15 ::= SEQUENCE { + epochTime-r15 GNSS-SystemTime, + auxiliary-referenceStationID-r15 GNSS-ReferenceStationID-r15, + geometric-ionospheric-corrections-differences-r15 + Geometric-Ionospheric-Corrections-Differences-r15, + ... +} + +Geometric-Ionospheric-Corrections-Differences-r15 ::= SEQUENCE (SIZE(1..64)) OF + Geometric-Ionospheric-Corrections-Differences-Element-r15 + +Geometric-Ionospheric-Corrections-Differences-Element-r15 ::= SEQUENCE { + svID-r15 SV-ID, + ambiguityStatusFlag-r15 INTEGER (0..3), + non-synch-count-r15 INTEGER (0..7), + geometricCarrierPhaseCorrectionDifference-r15 INTEGER (-65536..65535), + iod-r15 BIT STRING (SIZE(11)), + ionosphericCarrierPhaseCorrectionDifference-r15 INTEGER (-65536..65535), + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-RTK-Residuals-r15 ::= SEQUENCE { + epochTime-r15 GNSS-SystemTime, + referenceStationID-r15 GNSS-ReferenceStationID-r15, + n-Refs-r15 INTEGER (0..127), + l1-r15 GNSS-FrequencyID-r15 OPTIONAL, -- Need OP + l2-r15 GNSS-FrequencyID-r15 OPTIONAL, -- Need OP + rtk-residuals-list-r15 RTK-Residuals-List-r15, + ... +} + +RTK-Residuals-List-r15 ::= SEQUENCE (SIZE(1..64)) OF RTK-Residuals-Element-r15 + +RTK-Residuals-Element-r15 ::= SEQUENCE { + svID-r15 SV-ID, + s-oc-r15 INTEGER (0..255), + s-od-r15 INTEGER (0..511), + s-oh-r15 INTEGER (0..63), + s-lc-r15 INTEGER (0..1023), + s-ld-r15 INTEGER (0..1023), + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-RTK-FKP-Gradients-r15 ::= SEQUENCE { + referenceStationID-r15 GNSS-ReferenceStationID-r15, + epochTime-r15 GNSS-SystemTime, + l1-r15 GNSS-FrequencyID-r15 OPTIONAL, -- Need OP + l2-r15 GNSS-FrequencyID-r15 OPTIONAL, -- Need OP + fkp-gradients-list-r15 FKP-Gradients-List-r15, + ... +} + +FKP-Gradients-List-r15 ::= SEQUENCE (SIZE(1..64)) OF FKP-Gradients-Element-r15 + +FKP-Gradients-Element-r15 ::= SEQUENCE { + svID-r15 SV-ID, + iod-r15 BIT STRING (SIZE(11)), + north-geometric-gradient-r15 INTEGER (-2048..2047), + east-geometric-gradient-r15 INTEGER (-2048..2047), + north-ionospheric-gradient-r15 INTEGER (-8192..8191), + east-ionospheric-gradient-r15 INTEGER (-8192..8191), + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-SSR-OrbitCorrections-r15 ::= SEQUENCE { + epochTime-r15 GNSS-SystemTime, + ssrUpdateInterval-r15 INTEGER (0..15), + satelliteReferenceDatum-r15 ENUMERATED { itrf, regional, ... }, + iod-ssr-r15 INTEGER (0..15), + ssr-OrbitCorrectionList-r15 SSR-OrbitCorrectionList-r15, + ... +} + +SSR-OrbitCorrectionList-r15 ::= SEQUENCE (SIZE(1..64)) OF SSR-OrbitCorrectionSatelliteElement-r15 + +SSR-OrbitCorrectionSatelliteElement-r15 ::= SEQUENCE { + svID-r15 SV-ID, + iod-r15 BIT STRING (SIZE(11)), + delta-radial-r15 INTEGER (-2097152..2097151), + delta-AlongTrack-r15 INTEGER (-524288..524287), + delta-CrossTrack-r15 INTEGER (-524288..524287), + dot-delta-radial-r15 INTEGER (-1048576..1048575) OPTIONAL, -- Need ON + dot-delta-AlongTrack-r15 INTEGER (-262144..262143) OPTIONAL, -- Need ON + dot-delta-CrossTrack-r15 INTEGER (-262144..262143) OPTIONAL, -- Need ON + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-SSR-ClockCorrections-r15 ::= SEQUENCE { + epochTime-r15 GNSS-SystemTime, + ssrUpdateInterval-r15 INTEGER (0..15), + iod-ssr-r15 INTEGER (0..15), + ssr-ClockCorrectionList-r15 SSR-ClockCorrectionList-r15, + ... +} + +SSR-ClockCorrectionList-r15 ::= SEQUENCE (SIZE(1..64)) OF SSR-ClockCorrectionSatelliteElement-r15 + +SSR-ClockCorrectionSatelliteElement-r15 ::= SEQUENCE { + svID-r15 SV-ID, + delta-Clock-C0-r15 INTEGER (-2097152..2097151), + delta-Clock-C1-r15 INTEGER (-1048576..1048575) OPTIONAL, -- Need ON + delta-Clock-C2-r15 INTEGER (-67108864..67108863) OPTIONAL, -- Need ON + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-SSR-CodeBias-r15 ::= SEQUENCE { + epochTime-r15 GNSS-SystemTime, + ssrUpdateInterval-r15 INTEGER (0..15), + iod-ssr-r15 INTEGER (0..15), + ssr-CodeBiasSatList-r15 SSR-CodeBiasSatList-r15, + ... +} + +SSR-CodeBiasSatList-r15 ::= SEQUENCE (SIZE(1..64)) OF SSR-CodeBiasSatElement-r15 + +SSR-CodeBiasSatElement-r15 ::= SEQUENCE { + svID-r15 SV-ID, + ssr-CodeBiasSignalList-r15 SSR-CodeBiasSignalList-r15, + ... +} + +SSR-CodeBiasSignalList-r15 ::= SEQUENCE (SIZE(1..16)) OF SSR-CodeBiasSignalElement-r15 + +SSR-CodeBiasSignalElement-r15 ::= SEQUENCE { + signal-and-tracking-mode-ID-r15 GNSS-SignalID, + codeBias-r15 INTEGER (-8192..8191), + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-SSR-URA-r16 ::= SEQUENCE { + epochTime-r16 GNSS-SystemTime, + ssrUpdateInterval-r16 INTEGER (0..15), + iod-ssr-r16 INTEGER (0..15), + ssr-URA-SatList-r16 SSR-URA-SatList-r16, + ... +} + +SSR-URA-SatList-r16 ::= SEQUENCE (SIZE(1..64)) OF SSR-URA-SatElement-r16 + +SSR-URA-SatElement-r16 ::= SEQUENCE { + svID-r16 SV-ID, + ssr-URA-r16 BIT STRING (SIZE (6)), + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-SSR-PhaseBias-r16 ::= SEQUENCE { + epochTime-r16 GNSS-SystemTime, + ssrUpdateInterval-r16 INTEGER (0..15), + iod-ssr-r16 INTEGER (0..15), + ssr-PhaseBiasSatList-r16 SSR-PhaseBiasSatList-r16, + ... +} + +SSR-PhaseBiasSatList-r16 ::= SEQUENCE (SIZE(1..64)) OF SSR-PhaseBiasSatElement-r16 + +SSR-PhaseBiasSatElement-r16 ::= SEQUENCE { + svID-r16 SV-ID, + ssr-PhaseBiasSignalList-r16 SSR-PhaseBiasSignalList-r16, + ... +} + +SSR-PhaseBiasSignalList-r16 ::= SEQUENCE (SIZE(1..16)) OF SSR-PhaseBiasSignalElement-r16 + +SSR-PhaseBiasSignalElement-r16 ::= SEQUENCE { + signal-and-tracking-mode-ID-r16 GNSS-SignalID, + phaseBias-r16 INTEGER (-16384..16383), + phaseDiscontinuityIndicator-r16 INTEGER (0..3), + phaseBiasIntegerIndicator-r16 INTEGER (0..3) OPTIONAL, -- Need OP + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-SSR-STEC-Correction-r16 ::= SEQUENCE { + epochTime-r16 GNSS-SystemTime, + ssrUpdateInterval-r16 INTEGER (0..15), + iod-ssr-r16 INTEGER (0..15), + correctionPointSetID-r16 INTEGER (0..16383), + stec-SatList-r16 STEC-SatList-r16, + ... +} + +STEC-SatList-r16 ::= SEQUENCE (SIZE(1..64)) OF STEC-SatElement-r16 + +STEC-SatElement-r16 ::= SEQUENCE { + svID-r16 SV-ID, + stecQualityIndicator-r16 BIT STRING (SIZE(6)), + stec-C00-r16 INTEGER (-8192..8191), + stec-C01-r16 INTEGER (-2048..2047) OPTIONAL, -- Need ON + stec-C10-r16 INTEGER (-2048..2047) OPTIONAL, -- Need ON + stec-C11-r16 INTEGER (-512..511) OPTIONAL, -- Need ON + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-SSR-GriddedCorrection-r16 ::= SEQUENCE { + epochTime-r16 GNSS-SystemTime, + ssrUpdateInterval-r16 INTEGER (0..15), + iod-ssr-r16 INTEGER (0..15), + troposphericDelayQualityIndicator-r16 BIT STRING (SIZE(6)) OPTIONAL, -- Cond Tropo + correctionPointSetID-r16 INTEGER (0..16383), + gridList-r16 GridList-r16, + ... +} + +GridList-r16 ::= SEQUENCE (SIZE(1..64)) OF GridElement-r16 + +GridElement-r16 ::= SEQUENCE { + tropospericDelayCorrection-r16 TropospericDelayCorrection-r16 OPTIONAL, -- Need ON + stec-ResidualSatList-r16 STEC-ResidualSatList-r16 OPTIONAL, -- Need ON + ... +} + +TropospericDelayCorrection-r16 ::= SEQUENCE { + tropoHydroStaticVerticalDelay-r16 INTEGER (-256..255), + tropoWetVerticalDelay-r16 INTEGER (-128..127), + ... +} + +STEC-ResidualSatList-r16 ::= SEQUENCE (SIZE(1..64)) OF STEC-ResidualSatElement-r16 + +STEC-ResidualSatElement-r16 ::= SEQUENCE { + svID-r16 SV-ID, + stecResidualCorrection-r16 CHOICE { + b7-r16 INTEGER (-64..63), + b16-r16 INTEGER (-32768..32767) + }, + ... +} + +-- ASN1STOP +-- ASN1START + +NavIC-DifferentialCorrections-r16 ::= SEQUENCE { + navic-RefTOWC-r16 INTEGER (0..50400), + navic-CorrectionListAutoNav-r16 NavIC-CorrectionListAutoNav-r16, + ... +} + +NavIC-CorrectionListAutoNav-r16 ::= SEQUENCE (SIZE (1..64)) OF NavIC-CorrectionElementAutoNav-r16 + +NavIC-CorrectionElementAutoNav-r16 ::= SEQUENCE { + svID SV-ID, + navic-Tod-r16 INTEGER (0..65535), + navic-iodec-r16 INTEGER (0..255), + navic-UDRAI-r16 INTEGER (-16..15), + navic-UDRArateI-r16 INTEGER (-16..15), + navic-EDC-r16 NavIC-EDC-r16, + navic-CDC-r16 NavIC-CDC-r16, + ... +} + +NavIC-EDC-r16 ::= SEQUENCE { + navic-AlphaEDC-r16 INTEGER (-8192..8191), + navic-BetaEDC-r16 INTEGER (-8192..8191), + navic-GammaEDC-r16 INTEGER (-16384..16383), + navic-AoIcorrection-r16 INTEGER (-2048..2047), + navic-AoRAcorrection-r16 INTEGER (-2048..2047), + navic-SemiMajorcorrection-r16 INTEGER (-2048..2047), + ... +} + +NavIC-CDC-r16 ::= SEQUENCE { + navic-ClockBiasCorrection-r16 INTEGER (-4096..4095), + navic-ClockDriftCorrection-r16 INTEGER (-128..127), + ... +} + +-- ASN1STOP +-- ASN1START + +NavIC-GridModelParameter-r16 ::= SEQUENCE { + navic-RefTOWC-r16 INTEGER (0..50400), + regionMasked-r16 INTEGER (0..1023), + regionIgpList-r16 RegionIgpList-r16, + ... +} + +RegionIgpList-r16 ::= SEQUENCE (SIZE (1..16)) OF RegionIgpElement-r16 + +RegionIgpElement-r16 ::= SEQUENCE { + regionID-r16 INTEGER (0..15), + givei1-r16 INTEGER (0..15), + givd1-r16 INTEGER (0..511), + givei2-r16 INTEGER (0..15), + givd2-r16 INTEGER (0..511), + givei3-r16 INTEGER (0..15), + givd3-r16 INTEGER (0..511), + givei4-r16 INTEGER (0..15), + givd4-r16 INTEGER (0..511), + givei5-r16 INTEGER (0..15), + givd5-r16 INTEGER (0..511), + givei6-r16 INTEGER (0..15), + givd6-r16 INTEGER (0..511), + givei7-r16 INTEGER (0..15), + givd7-r16 INTEGER (0..511), + givei8-r16 INTEGER (0..15), + givd8-r16 INTEGER (0..511), + givei9-r16 INTEGER (0..15), + givd9-r16 INTEGER (0..511), + givei10-r16 INTEGER (0..15), + givd10-r16 INTEGER (0..511), + givei11-r16 INTEGER (0..15), + givd11-r16 INTEGER (0..511), + givei12-r16 INTEGER (0..15), + givd12-r16 INTEGER (0..511), + givei13-r16 INTEGER (0..15), + givd13-r16 INTEGER (0..511), + givei14-r16 INTEGER (0..15), + givd14-r16 INTEGER (0..511), + givei15-r16 INTEGER (0..15), + givd15-r16 INTEGER (0..511), + ... +} + +-- ASN1STOP +-- ASN1START + +A-GNSS-RequestAssistanceData ::= SEQUENCE { + gnss-CommonAssistDataReq GNSS-CommonAssistDataReq OPTIONAL, -- Cond CommonADReq + gnss-GenericAssistDataReq GNSS-GenericAssistDataReq OPTIONAL, -- Cond GenADReq + ..., + [[ + gnss-PeriodicAssistDataReq-r15 + GNSS-PeriodicAssistDataReq-r15 OPTIONAL -- Cond PerADReq + ]] +} + +-- ASN1STOP +-- ASN1START + +GNSS-CommonAssistDataReq ::= SEQUENCE { + gnss-ReferenceTimeReq GNSS-ReferenceTimeReq + OPTIONAL, -- Cond RefTimeReq + gnss-ReferenceLocationReq GNSS-ReferenceLocationReq + OPTIONAL, -- Cond RefLocReq + gnss-IonosphericModelReq GNSS-IonosphericModelReq + OPTIONAL, -- Cond IonoModReq + gnss-EarthOrientationParametersReq GNSS-EarthOrientationParametersReq + OPTIONAL, -- Cond EOPReq + ..., + [[ + gnss-RTK-ReferenceStationInfoReq-r15 + GNSS-RTK-ReferenceStationInfoReq-r15 + OPTIONAL, -- Cond ARPReq + gnss-RTK-AuxiliaryStationDataReq-r15 + GNSS-RTK-AuxiliaryStationDataReq-r15 + OPTIONAL -- Cond AuxARPReq + ]], + [[ + gnss-SSR-CorrectionPointsReq-r16 + GNSS-SSR-CorrectionPointsReq-r16 + OPTIONAL -- Cond PointsReq + ]] +} + +-- ASN1STOP +-- ASN1START + +GNSS-GenericAssistDataReq ::= SEQUENCE (SIZE (1..16)) OF GNSS-GenericAssistDataReqElement + +GNSS-GenericAssistDataReqElement ::= SEQUENCE { + gnss-ID GNSS-ID, + sbas-ID SBAS-ID OPTIONAL, -- Cond GNSS-ID-SBAS + gnss-TimeModelsReq GNSS-TimeModelListReq OPTIONAL, -- Cond TimeModReq + gnss-DifferentialCorrectionsReq GNSS-DifferentialCorrectionsReq OPTIONAL, -- Cond DGNSS-Req + gnss-NavigationModelReq GNSS-NavigationModelReq OPTIONAL, -- Cond NavModReq + gnss-RealTimeIntegrityReq GNSS-RealTimeIntegrityReq OPTIONAL, -- Cond RTIReq + gnss-DataBitAssistanceReq GNSS-DataBitAssistanceReq OPTIONAL, -- Cond DataBitsReq + gnss-AcquisitionAssistanceReq GNSS-AcquisitionAssistanceReq OPTIONAL, -- Cond AcquAssistReq + gnss-AlmanacReq GNSS-AlmanacReq OPTIONAL, -- Cond AlmanacReq + gnss-UTCModelReq GNSS-UTC-ModelReq OPTIONAL, -- Cond UTCModReq + gnss-AuxiliaryInformationReq GNSS-AuxiliaryInformationReq OPTIONAL, -- Cond AuxInfoReq + ..., + [[ + bds-DifferentialCorrectionsReq-r12 + BDS-DifferentialCorrectionsReq-r12 + OPTIONAL, -- Cond DBDS-Req + bds-GridModelReq-r12 BDS-GridModelReq-r12 OPTIONAL -- Cond BDS-GridModReq + ]], + [[ + gnss-RTK-ObservationsReq-r15 + GNSS-RTK-ObservationsReq-r15 OPTIONAL, -- Cond RTK-OSR-Req + glo-RTK-BiasInformationReq-r15 + GLO-RTK-BiasInformationReq-r15 OPTIONAL, -- Cond GLO-CPB-Req + gnss-RTK-MAC-CorrectionDifferencesReq-r15 + GNSS-RTK-MAC-CorrectionDifferencesReq-r15 + OPTIONAL, -- Cond MAC-Req + gnss-RTK-ResidualsReq-r15 GNSS-RTK-ResidualsReq-r15 OPTIONAL, -- Cond Res-Req + gnss-RTK-FKP-GradientsReq-r15 + GNSS-RTK-FKP-GradientsReq-r15 OPTIONAL, -- Cond FKP-Req + gnss-SSR-OrbitCorrectionsReq-r15 + GNSS-SSR-OrbitCorrectionsReq-r15 + OPTIONAL, -- Cond OC-Req + gnss-SSR-ClockCorrectionsReq-r15 + GNSS-SSR-ClockCorrectionsReq-r15 + OPTIONAL, -- Cond CC-Req + gnss-SSR-CodeBiasReq-r15 GNSS-SSR-CodeBiasReq-r15 OPTIONAL -- Cond CB-Req + ]], + [[ + gnss-SSR-URA-Req-r16 GNSS-SSR-URA-Req-r16 OPTIONAL, -- Cond URA-Req + gnss-SSR-PhaseBiasReq-r16 GNSS-SSR-PhaseBiasReq-r16 OPTIONAL, -- Cond PB-Req + gnss-SSR-STEC-CorrectionReq-r16 + GNSS-SSR-STEC-CorrectionReq-r16 OPTIONAL, -- Cond STEC-Req + gnss-SSR-GriddedCorrectionReq-r16 GNSS-SSR-GriddedCorrectionReq-r16 + OPTIONAL, -- Cond Grid-Req + navic-DifferentialCorrectionsReq-r16 + NavIC-DifferentialCorrectionsReq-r16 + OPTIONAL, -- Cond DNavIC-Req + navic-GridModelReq-r16 NavIC-GridModelReq-r16 OPTIONAL -- Cond NavIC-GridModReq + ]] +} + +-- ASN1STOP +-- ASN1START + +GNSS-PeriodicAssistDataReq-r15 ::= SEQUENCE { + gnss-RTK-PeriodicObservationsReq-r15 GNSS-PeriodicControlParam-r15 OPTIONAL, -- Cond pOSR + glo-RTK-PeriodicBiasInformationReq-r15 GNSS-PeriodicControlParam-r15 OPTIONAL, -- Cond pCPB + gnss-RTK-MAC-PeriodicCorrectionDifferencesReq-r15 + GNSS-PeriodicControlParam-r15 OPTIONAL, -- Cond pMAC + gnss-RTK-PeriodicResidualsReq-r15 GNSS-PeriodicControlParam-r15 OPTIONAL, -- Cond pRes + gnss-RTK-FKP-PeriodicGradientsReq-r15 GNSS-PeriodicControlParam-r15 OPTIONAL, -- Cond pFKP + gnss-SSR-PeriodicOrbitCorrectionsReq-r15 + GNSS-PeriodicControlParam-r15 OPTIONAL, -- Cond pOC + gnss-SSR-PeriodicClockCorrectionsReq-r15 + GNSS-PeriodicControlParam-r15 OPTIONAL, -- Cond pCC + gnss-SSR-PeriodicCodeBiasReq-r15 GNSS-PeriodicControlParam-r15 OPTIONAL, -- Cond pCB + ..., + [[ + gnss-SSR-PeriodicURA-Req-r16 GNSS-PeriodicControlParam-r15 OPTIONAL, -- Cond pURA + gnss-SSR-PeriodicPhaseBiasReq-r16 GNSS-PeriodicControlParam-r15 OPTIONAL, -- Cond pPB + gnss-SSR-PeriodicSTEC-CorrectionReq-r16 GNSS-PeriodicControlParam-r15 OPTIONAL, -- Cond pSTEC + gnss-SSR-PeriodicGriddedCorrectionReq-r16 + GNSS-PeriodicControlParam-r15 OPTIONAL -- Cond pGrid + ]] +} + +-- ASN1STOP +-- ASN1START + +GNSS-ReferenceTimeReq ::= SEQUENCE { + gnss-TimeReqPrefList SEQUENCE (SIZE (1..8)) OF GNSS-ID, + gps-TOW-assistReq BOOLEAN OPTIONAL, -- Cond gps + notOfLeapSecReq BOOLEAN OPTIONAL, -- Cond glonass + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-ReferenceLocationReq ::= SEQUENCE { + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-IonosphericModelReq ::= SEQUENCE { + klobucharModelReq BIT STRING (SIZE(2)) OPTIONAL, -- Cond klobuchar + neQuickModelReq NULL OPTIONAL, -- Cond nequick + ..., + [[ klobucharModel2Req-r16 NULL OPTIONAL -- Cond klobuchar2 + ]] + +} + +-- ASN1STOP +-- ASN1START + +GNSS-EarthOrientationParametersReq ::= SEQUENCE { + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-RTK-ReferenceStationInfoReq-r15 ::= SEQUENCE { + antennaDescriptionReq-r15 BOOLEAN, + antennaHeightReq-r15 BOOLEAN, + physicalReferenceStationReq-r15 BOOLEAN, + stationID-r15 GNSS-ReferenceStationID-r15 OPTIONAL, + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-RTK-AuxiliaryStationDataReq-r15 ::= SEQUENCE { + master-referenceStationID-r15 GNSS-ReferenceStationID-r15 OPTIONAL, + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-SSR-CorrectionPointsReq-r16 ::= SEQUENCE { + correctionPointSetID-Req-r16 INTEGER (0..16383) OPTIONAL, + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-TimeModelListReq ::= SEQUENCE (SIZE(1..15)) OF GNSS-TimeModelElementReq + +GNSS-TimeModelElementReq ::= SEQUENCE { + gnss-TO-IDsReq INTEGER (1..15), + deltaTreq BOOLEAN, + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-DifferentialCorrectionsReq ::= SEQUENCE { + dgnss-SignalsReq GNSS-SignalIDs, + dgnss-ValidityTimeReq BOOLEAN, + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-NavigationModelReq ::= CHOICE { + storedNavList StoredNavListInfo, + reqNavList ReqNavListInfo, + ... +} + + +StoredNavListInfo ::= SEQUENCE { + gnss-WeekOrDay INTEGER (0..4095), + gnss-Toe INTEGER (0..255), + t-toeLimit INTEGER (0..15), + satListRelatedDataList SatListRelatedDataList OPTIONAL, + ... +} + +SatListRelatedDataList ::= SEQUENCE (SIZE (1..64)) OF SatListRelatedDataElement + +SatListRelatedDataElement ::= SEQUENCE { + svID SV-ID, + iod BIT STRING (SIZE(11)), + clockModelID INTEGER (1..8) OPTIONAL, + orbitModelID INTEGER (1..8) OPTIONAL, + ... +} + +ReqNavListInfo ::= SEQUENCE { + svReqList BIT STRING (SIZE (64)), + clockModelID-PrefList SEQUENCE (SIZE (1..8)) OF INTEGER (1..8) OPTIONAL, + orbitModelID-PrefList SEQUENCE (SIZE (1..8)) OF INTEGER (1..8) OPTIONAL, + addNavparamReq BOOLEAN OPTIONAL, -- Cond orbitModelID-2 + ... +} + + +-- ASN1STOP +-- ASN1START + +GNSS-RealTimeIntegrityReq ::= SEQUENCE { + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-DataBitAssistanceReq ::= SEQUENCE { + gnss-TOD-Req INTEGER (0..3599), + gnss-TOD-FracReq INTEGER (0..999) OPTIONAL, + dataBitInterval INTEGER (0..15), + gnss-SignalType GNSS-SignalIDs, + gnss-DataBitsReq GNSS-DataBitsReqSatList OPTIONAL, + ... +} + +GNSS-DataBitsReqSatList ::= SEQUENCE (SIZE(1..64)) OF GNSS-DataBitsReqSatElement + +GNSS-DataBitsReqSatElement ::= SEQUENCE { + svID SV-ID, + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-AcquisitionAssistanceReq ::= SEQUENCE { + gnss-SignalID-Req GNSS-SignalID, + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-AlmanacReq ::= SEQUENCE { + modelID INTEGER(1..8) OPTIONAL, + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-UTC-ModelReq ::= SEQUENCE { + modelID INTEGER(1..8) OPTIONAL, + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-AuxiliaryInformationReq ::= SEQUENCE { + ... +} + +-- ASN1STOP +-- ASN1START + +BDS-DifferentialCorrectionsReq-r12 ::= SEQUENCE { + dgnss-SignalsReq GNSS-SignalIDs, + ... +} + +-- ASN1STOP +-- ASN1START + +BDS-GridModelReq-r12 ::= SEQUENCE { + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-RTK-ObservationsReq-r15::= SEQUENCE { + gnss-RTK-SignalsReq-r15 GNSS-SignalIDs, + gnss-RTK-Integer-ms-Req-r15 BOOLEAN, + gnss-RTK-PhaseRangeRateReq-r15 BOOLEAN, + gnss-RTK-CNR-Req-r15 BOOLEAN, + stationID-r15 GNSS-ReferenceStationID-r15 OPTIONAL, + ... +} + +-- ASN1STOP +-- ASN1START + +GLO-RTK-BiasInformationReq-r15 ::= SEQUENCE { + stationID-r15 GNSS-ReferenceStationID-r15 OPTIONAL, + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-RTK-MAC-CorrectionDifferencesReq-r15 ::= SEQUENCE { + master-ReferenceStationID-r15 GNSS-ReferenceStationID-r15 OPTIONAL, + aux-ReferenceStationList-r15 AUX-ReferenceStationList-r15 OPTIONAL, + linkCombinations-PrefList-r15 GNSS-Link-CombinationsList-r15 OPTIONAL, + ... +} + +AUX-ReferenceStationList-r15 ::= SEQUENCE (SIZE (1..32)) OF AUX-ReferenceStationID-Element-r15 + +AUX-ReferenceStationID-Element-r15 ::= SEQUENCE { + aux-stationID-r15 GNSS-ReferenceStationID-r15, + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-RTK-ResidualsReq-r15 ::= SEQUENCE { + stationID-r15 GNSS-ReferenceStationID-r15 OPTIONAL, + linkCombinations-PrefList-r15 GNSS-Link-CombinationsList-r15 OPTIONAL, + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-RTK-FKP-GradientsReq-r15 ::= SEQUENCE { + stationID-r15 GNSS-ReferenceStationID-r15 OPTIONAL, + linkCombinations-PrefList-r15 GNSS-Link-CombinationsList-r15 OPTIONAL, + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-SSR-OrbitCorrectionsReq-r15 ::= SEQUENCE { + storedNavList-r15 GNSS-NavListInfo-r15 OPTIONAL, + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-SSR-ClockCorrectionsReq-r15 ::= SEQUENCE { + storedNavList-r15 GNSS-NavListInfo-r15 OPTIONAL, + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-SSR-CodeBiasReq-r15 ::= SEQUENCE { + signal-and-tracking-mode-ID-Map-r15 GNSS-SignalIDs, + storedNavList-r15 GNSS-NavListInfo-r15 OPTIONAL, + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-SSR-URA-Req-r16 ::= SEQUENCE { + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-SSR-PhaseBiasReq-r16 ::= SEQUENCE { + signal-and-tracking-mode-ID-Map-r16 GNSS-SignalIDs, + storedNavList-r16 GNSS-NavListInfo-r15 OPTIONAL, + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-SSR-STEC-CorrectionReq-r16 ::= SEQUENCE { + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-SSR-GriddedCorrectionReq-r16 ::= SEQUENCE { + ... +} + +-- ASN1STOP +-- ASN1START + +NavIC-DifferentialCorrectionsReq-r16 ::= SEQUENCE { + dgnss-SignalsReq-r16 GNSS-SignalIDs, + ... +} + +-- ASN1STOP +-- ASN1START + +NavIC-GridModelReq-r16 ::= SEQUENCE { + ... +} + +-- ASN1STOP +-- ASN1START + +A-GNSS-ProvideLocationInformation ::= SEQUENCE { + gnss-SignalMeasurementInformation GNSS-SignalMeasurementInformation OPTIONAL, + gnss-LocationInformation GNSS-LocationInformation OPTIONAL, + gnss-Error A-GNSS-Error OPTIONAL, + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-SignalMeasurementInformation ::= SEQUENCE { + measurementReferenceTime MeasurementReferenceTime, + gnss-MeasurementList GNSS-MeasurementList, + ... +} + +-- ASN1STOP +-- ASN1START + +MeasurementReferenceTime ::= SEQUENCE { + gnss-TOD-msec INTEGER (0..3599999), + gnss-TOD-frac INTEGER (0..3999) OPTIONAL, + gnss-TOD-unc INTEGER (0..127) OPTIONAL, + gnss-TimeID GNSS-ID, + networkTime CHOICE { + eUTRA SEQUENCE { + physCellId INTEGER (0..503), + cellGlobalId CellGlobalIdEUTRA-AndUTRA OPTIONAL, + systemFrameNumber BIT STRING (SIZE (10)), + ... + }, + uTRA SEQUENCE { + mode CHOICE { + fdd SEQUENCE { + primary-CPICH-Info INTEGER (0..511), + ... + }, + tdd SEQUENCE { + cellParameters INTEGER (0..127), + ... + } + }, + cellGlobalId CellGlobalIdEUTRA-AndUTRA OPTIONAL, + referenceSystemFrameNumber + INTEGER (0..4095), + ... + }, + gSM SEQUENCE { + bcchCarrier INTEGER (0..1023), + bsic INTEGER (0..63), + cellGlobalId CellGlobalIdGERAN OPTIONAL, + referenceFrame SEQUENCE { + referenceFN INTEGER (0..65535), + referenceFNMSB INTEGER (0..63) OPTIONAL, + ... + }, + deltaGNSS-TOD INTEGER (0 .. 127) OPTIONAL, + ... + }, + ..., + nbIoT-r14 + SEQUENCE { + nbPhysCellId-r14 INTEGER (0..503), + nbCellGlobalId-r14 ECGI OPTIONAL, + sfn-r14 BIT STRING (SIZE (10)), + hyperSFN-r14 BIT STRING (SIZE (10)) OPTIONAL, + ... + }, + nr-r15 SEQUENCE { + nrPhysCellId-r15 INTEGER (0..1007), + nrCellGlobalID-r15 NCGI-r15 OPTIONAL, + nr-sfn-r15 BIT STRING (SIZE (10)), + ... + } + } OPTIONAL, + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-MeasurementList ::= SEQUENCE (SIZE(1..16)) OF GNSS-MeasurementForOneGNSS + +GNSS-MeasurementForOneGNSS ::= SEQUENCE { + gnss-ID GNSS-ID, + gnss-SgnMeasList GNSS-SgnMeasList, + ... +} + +GNSS-SgnMeasList ::= SEQUENCE (SIZE(1..8)) OF GNSS-SgnMeasElement + +GNSS-SgnMeasElement ::= SEQUENCE { + gnss-SignalID GNSS-SignalID, + gnss-CodePhaseAmbiguity INTEGER (0..127) OPTIONAL, + gnss-SatMeasList GNSS-SatMeasList, + ... +} + +GNSS-SatMeasList ::= SEQUENCE (SIZE(1..64)) OF GNSS-SatMeasElement + +GNSS-SatMeasElement ::= SEQUENCE { + svID SV-ID, + cNo INTEGER (0..63), + mpathDet ENUMERATED {notMeasured (0), low (1), medium (2), high (3), ...}, + carrierQualityInd INTEGER (0..3) OPTIONAL, + codePhase INTEGER (0..2097151), + integerCodePhase INTEGER (0..127) OPTIONAL, + codePhaseRMSError INTEGER (0..63), + doppler INTEGER (-32768..32767) OPTIONAL, + adr INTEGER (0..33554431) OPTIONAL, + ..., + [[ + adrMSB-r15 INTEGER (0..15) OPTIONAL, + adrSign-r15 ENUMERATED {positive, negative} OPTIONAL, + adrRMSerror-r15 INTEGER (0..127) OPTIONAL, + delta-codePhase-r15 INTEGER (0..7) OPTIONAL + ]] +} + +-- ASN1STOP +-- ASN1START + +GNSS-LocationInformation ::= SEQUENCE { + measurementReferenceTime MeasurementReferenceTime, + agnss-List GNSS-ID-Bitmap, + ... +} + +-- ASN1STOP +-- ASN1START + +A-GNSS-RequestLocationInformation ::= SEQUENCE { + gnss-PositioningInstructions GNSS-PositioningInstructions, + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-PositioningInstructions ::= SEQUENCE { + gnss-Methods GNSS-ID-Bitmap, + fineTimeAssistanceMeasReq BOOLEAN, + adrMeasReq BOOLEAN, + multiFreqMeasReq BOOLEAN, + assistanceAvailability BOOLEAN, + ..., + [[ + ha-GNSS-Req-r15 ENUMERATED { true } OPTIONAL -- Cond UEB + ]] +} + +-- ASN1STOP +-- ASN1START + +A-GNSS-ProvideCapabilities ::= SEQUENCE { + gnss-SupportList GNSS-SupportList OPTIONAL, + assistanceDataSupportList AssistanceDataSupportList OPTIONAL, + locationCoordinateTypes LocationCoordinateTypes OPTIONAL, + velocityTypes VelocityTypes OPTIONAL, + ..., + [[ periodicalReportingNotSupported-r14 + PositioningModes OPTIONAL, + idleStateForMeasurements-r14 + ENUMERATED { required } OPTIONAL + ]], + [[ periodicAssistanceData-r15 + BIT STRING { solicited (0), + unsolicited (1) } (SIZE (1..8)) OPTIONAL + ]] +} + +GNSS-SupportList ::= SEQUENCE (SIZE(1..16)) OF GNSS-SupportElement + +GNSS-SupportElement ::= SEQUENCE { + gnss-ID GNSS-ID, + sbas-IDs SBAS-IDs OPTIONAL, -- Cond GNSS-ID-SBAS + agnss-Modes PositioningModes, + gnss-Signals GNSS-SignalIDs, + fta-MeasSupport SEQUENCE { + cellTime AccessTypes, + mode PositioningModes, + ... + } OPTIONAL, -- Cond fta + adr-Support BOOLEAN, + velocityMeasurementSupport BOOLEAN, + ..., + [[ + adrEnhancementsSupport-r15 ENUMERATED { true } OPTIONAL, + ha-gnss-Modes-r15 PositioningModes OPTIONAL + ]] +} + +AssistanceDataSupportList ::= SEQUENCE { + gnss-CommonAssistanceDataSupport GNSS-CommonAssistanceDataSupport, + gnss-GenericAssistanceDataSupport GNSS-GenericAssistanceDataSupport, + ... +} + + +-- ASN1STOP +-- ASN1START + +GNSS-CommonAssistanceDataSupport ::= SEQUENCE { + gnss-ReferenceTimeSupport GNSS-ReferenceTimeSupport + OPTIONAL, -- Cond RefTimeSup + gnss-ReferenceLocationSupport GNSS-ReferenceLocationSupport + OPTIONAL, -- Cond RefLocSup + gnss-IonosphericModelSupport GNSS-IonosphericModelSupport + OPTIONAL, -- Cond IonoModSup + gnss-EarthOrientationParametersSupport GNSS-EarthOrientationParametersSupport + OPTIONAL, -- Cond EOPSup + ..., + [[ + gnss-RTK-ReferenceStationInfoSupport-r15 + GNSS-RTK-ReferenceStationInfoSupport-r15 + OPTIONAL, -- Cond ARPSup + gnss-RTK-AuxiliaryStationDataSupport-r15 + GNSS-RTK-AuxiliaryStationDataSupport-r15 + OPTIONAL -- Cond AuxARPSup + ]] +} + +-- ASN1STOP +-- ASN1START + +GNSS-ReferenceTimeSupport ::= SEQUENCE { + gnss-SystemTime GNSS-ID-Bitmap, + fta-Support AccessTypes OPTIONAL, -- Cond fta + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-ReferenceLocationSupport ::= SEQUENCE { + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-IonosphericModelSupport ::= SEQUENCE { + ionoModel BIT STRING { klobuchar (0), + neQuick (1), + klobuchar2-r16 (2) } (SIZE (1..8)), + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-EarthOrientationParametersSupport ::= SEQUENCE { + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-RTK-ReferenceStationInfoSupport-r15 ::= SEQUENCE { + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-RTK-AuxiliaryStationDataSupport-r15 ::= SEQUENCE { + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-GenericAssistanceDataSupport ::= + SEQUENCE (SIZE (1..16)) OF GNSS-GenericAssistDataSupportElement + +GNSS-GenericAssistDataSupportElement ::= SEQUENCE { + gnss-ID GNSS-ID, + sbas-ID SBAS-ID OPTIONAL, -- Cond GNSSIDSBAS + gnss-TimeModelsSupport GNSS-TimeModelListSupport + OPTIONAL, -- Cond TimeModSup + gnss-DifferentialCorrectionsSupport GNSS-DifferentialCorrectionsSupport + OPTIONAL, -- Cond DGNSS-Sup + gnss-NavigationModelSupport GNSS-NavigationModelSupport + OPTIONAL, -- Cond NavModSup + gnss-RealTimeIntegritySupport GNSS-RealTimeIntegritySupport + OPTIONAL, -- Cond RTISup + gnss-DataBitAssistanceSupport GNSS-DataBitAssistanceSupport + OPTIONAL, -- Cond DataBitsSup + gnss-AcquisitionAssistanceSupport GNSS-AcquisitionAssistanceSupport + OPTIONAL, -- Cond AcquAssistSup + gnss-AlmanacSupport GNSS-AlmanacSupport + OPTIONAL, -- Cond AlmanacSup + gnss-UTC-ModelSupport GNSS-UTC-ModelSupport + OPTIONAL, -- Cond UTCModSup + gnss-AuxiliaryInformationSupport GNSS-AuxiliaryInformationSupport + OPTIONAL, -- Cond AuxInfoSup + ..., + [[ + bds-DifferentialCorrectionsSupport-r12 + BDS-DifferentialCorrectionsSupport-r12 + OPTIONAL, -- Cond DBDS-Sup + bds-GridModelSupport-r12 BDS-GridModelSupport-r12 + OPTIONAL -- Cond BDS-GridModSup + ]], + [[ + gnss-RTK-ObservationsSupport-r15 + GNSS-RTK-ObservationsSupport-r15 + OPTIONAL, -- Cond RTK-OSR-Sup + glo-RTK-BiasInformationSupport-r15 + GLO-RTK-BiasInformationSupport-r15 + OPTIONAL, -- Cond GLO-CPB-Sup + gnss-RTK-MAC-CorrectionDifferencesSupport-r15 + GNSS-RTK-MAC-CorrectionDifferencesSupport-r15 + OPTIONAL, -- Cond MAC-Sup + gnss-RTK-ResidualsSupport-r15 GNSS-RTK-ResidualsSupport-r15 + OPTIONAL, -- Cond Res-Sup + gnss-RTK-FKP-GradientsSupport-r15 + GNSS-RTK-FKP-GradientsSupport-r15 + OPTIONAL, -- Cond FKP-Sup + gnss-SSR-OrbitCorrectionsSupport-r15 + GNSS-SSR-OrbitCorrectionsSupport-r15 + OPTIONAL, -- Cond OC-Sup + gnss-SSR-ClockCorrectionsSupport-r15 + GNSS-SSR-ClockCorrectionsSupport-r15 + OPTIONAL, -- Cond CC-Sup + gnss-SSR-CodeBiasSupport-r15 GNSS-SSR-CodeBiasSupport-r15 + OPTIONAL -- Cond CB-Sup + ]], + [[ + gnss-SSR-URA-Support-r16 GNSS-SSR-URA-Support-r16 OPTIONAL, -- Cond URA-Sup + gnss-SSR-PhaseBiasSupport-r16 GNSS-SSR-PhaseBiasSupport-r16 + OPTIONAL, -- Cond PB-Sup + gnss-SSR-STEC-CorrectionSupport-r16 + GNSS-SSR-STEC-CorrectionSupport-r16 + OPTIONAL, -- Cond STEC-Sup + gnss-SSR-GriddedCorrectionSupport-r16 + GNSS-SSR-GriddedCorrectionSupport-r16 + OPTIONAL, -- Cond Grid-Sup + navic-DifferentialCorrectionsSupport-r16 + NavIC-DifferentialCorrectionsSupport-r16 + OPTIONAL, -- Cond DNavIC-Sup + navic-GridModelSupport-r16 NavIC-GridModelSupport-r16 + OPTIONAL -- Cond NavIC-GridModSup + ]] +} + +-- ASN1STOP +-- ASN1START + +GNSS-TimeModelListSupport ::= SEQUENCE { + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-DifferentialCorrectionsSupport ::= SEQUENCE { + gnssSignalIDs GNSS-SignalIDs, + dgnss-ValidityTimeSup BOOLEAN, + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-NavigationModelSupport ::= SEQUENCE { + clockModel BIT STRING { model-1 (0), + model-2 (1), + model-3 (2), + model-4 (3), + model-5 (4), + model-6 (5), + model-7-r16 (6), + model-8-r16 (7) } (SIZE (1..8)) OPTIONAL, + orbitModel BIT STRING { model-1 (0), + model-2 (1), + model-3 (2), + model-4 (3), + model-5 (4), + model-6 (5), + model-7-r16 (6), + model-8-r16 (7) } (SIZE (1..8)) OPTIONAL, + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-RealTimeIntegritySupport ::= SEQUENCE { + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-DataBitAssistanceSupport ::= SEQUENCE { + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-AcquisitionAssistanceSupport ::= SEQUENCE { + ..., + confidenceSupport-r10 ENUMERATED { true } OPTIONAL, + dopplerUncertaintyExtSupport-r10 ENUMERATED { true } OPTIONAL +} + +-- ASN1STOP +-- ASN1START + +GNSS-AlmanacSupport ::= SEQUENCE { + almanacModel BIT STRING { model-1 (0), + model-2 (1), + model-3 (2), + model-4 (3), + model-5 (4), + model-6 (5), + model-7 (6) } (SIZE (1..8)) OPTIONAL, + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-UTC-ModelSupport ::= SEQUENCE { + utc-Model BIT STRING { model-1 (0), + model-2 (1), + model-3 (2), + model-4 (3), + model-5 (4) } (SIZE (1..8)) OPTIONAL, + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-AuxiliaryInformationSupport ::= SEQUENCE { + ... +} + +-- ASN1STOP +-- ASN1START + +BDS-DifferentialCorrectionsSupport-r12 ::= SEQUENCE { + gnssSignalIDs GNSS-SignalIDs, + ... +} + +-- ASN1STOP +-- ASN1START + +BDS-GridModelSupport-r12 ::= SEQUENCE { + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-RTK-ObservationsSupport-r15 ::= SEQUENCE { + gnssSignalIDs-r15 GNSS-SignalIDs, + ... +} + +-- ASN1STOP +-- ASN1START + +GLO-RTK-BiasInformationSupport-r15 ::= SEQUENCE { + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-RTK-MAC-CorrectionDifferencesSupport-r15 ::= SEQUENCE { + link-combinations-support-r15 GNSS-Link-CombinationsList-r15, + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-RTK-ResidualsSupport-r15 ::= SEQUENCE { + link-combinations-support-r15 GNSS-Link-CombinationsList-r15, + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-RTK-FKP-GradientsSupport-r15 ::= SEQUENCE { + link-combinations-support-r15 GNSS-Link-CombinationsList-r15, + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-SSR-OrbitCorrectionsSupport-r15 ::= SEQUENCE { + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-SSR-ClockCorrectionsSupport-r15 ::= SEQUENCE { + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-SSR-CodeBiasSupport-r15 ::= SEQUENCE { + signal-and-tracking-mode-ID-Sup-r15 GNSS-SignalIDs, + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-SSR-URA-Support-r16 ::= SEQUENCE { + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-SSR-PhaseBiasSupport-r16 ::= SEQUENCE { + signal-and-tracking-mode-ID-Sup-r16 GNSS-SignalIDs, + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-SSR-STEC-CorrectionSupport-r16 ::= SEQUENCE { + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-SSR-GriddedCorrectionSupport-r16 ::= SEQUENCE { + ... +} + +-- ASN1STOP +-- ASN1START + +NavIC-DifferentialCorrectionsSupport-r16 ::= SEQUENCE { + gnssSignalIDs-r16 GNSS-SignalIDs, + ... +} + +-- ASN1STOP +-- ASN1START + +NavIC-GridModelSupport-r16 ::= SEQUENCE { + ... +} + +-- ASN1STOP +-- ASN1START + +A-GNSS-RequestCapabilities ::= SEQUENCE { + gnss-SupportListReq BOOLEAN, + assistanceDataSupportListReq BOOLEAN, + locationVelocityTypesReq BOOLEAN, + ... +} + +-- ASN1STOP +-- ASN1START + +A-GNSS-Error ::= CHOICE { + locationServerErrorCauses GNSS-LocationServerErrorCauses, + targetDeviceErrorCauses GNSS-TargetDeviceErrorCauses, + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-LocationServerErrorCauses ::= SEQUENCE { + cause ENUMERATED { + undefined, + undeliveredAssistanceDataIsNotSupportedByServer, + undeliveredAssistanceDataIsSupportedButCurrentlyNotAvailableByServer, undeliveredAssistanceDataIsPartlyNotSupportedAndPartlyNotAvailableByServer, + ..., + unconfirmedPeriodicAssistanceDataIsNotSupported-v1510, + unconfirmedPeriodicAssistanceDataIsSupportedButCurrentlyNotAvailable-v1510, + unconfirmedPeriodicAssistanceDataIsPartlyNotSupportedAndPartlyNotAvailable-v1510, + undeliveredPeriodicAssistanceDataIsCurrentlyNotAvailable-v1510 + }, + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-TargetDeviceErrorCauses ::= SEQUENCE { + cause ENUMERATED { undefined, + thereWereNotEnoughSatellitesReceived, + assistanceDataMissing, + notAllRequestedMeasurementsPossible, + ... + }, + fineTimeAssistanceMeasurementsNotPossible NULL OPTIONAL, + adrMeasurementsNotPossible NULL OPTIONAL, + multiFrequencyMeasurementsNotPossible NULL OPTIONAL, + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-FrequencyID-r15 ::= SEQUENCE { + gnss-FrequencyID-r15 INTEGER (0 .. 7), + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-ID ::= SEQUENCE { + gnss-id ENUMERATED{ gps, sbas, qzss, galileo, glonass, ..., bds, navic-v1610 }, + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-ID-Bitmap ::= SEQUENCE { + gnss-ids BIT STRING { gps (0), + sbas (1), + qzss (2), + galileo (3), + glonass (4), + bds (5), + navic-v1610 (6) } (SIZE (1..16)), + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-Link-CombinationsList-r15 ::= SEQUENCE (SIZE(1..8)) OF GNSS-Link-Combinations-r15 + +GNSS-Link-Combinations-r15 ::= SEQUENCE { + l1-r15 GNSS-FrequencyID-r15, + l2-r15 GNSS-FrequencyID-r15, + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-NavListInfo-r15 ::= SEQUENCE (SIZE (1..64)) OF SatListElement-r15 + +SatListElement-r15 ::= SEQUENCE { + svID-r15 SV-ID, + iod-r15 BIT STRING (SIZE(11)), + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-NetworkID-r15 ::= SEQUENCE { + networkID-r15 INTEGER (0..255), + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-PeriodicControlParam-r15 ::= SEQUENCE { + deliveryAmount-r15 INTEGER (1..32), + deliveryInterval-r15 INTEGER (1..64), + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-ReferenceStationID-r15 ::= SEQUENCE { + referenceStationID-r15 INTEGER (0..65535), + providerName-r15 VisibleString (SIZE (1..32)) OPTIONAL, -- Need ON + ... +} + +-- ASN1STOP +-- ASN1START + +GNSS-SignalID ::= SEQUENCE { + gnss-SignalID INTEGER (0 .. 7), + ..., + [[ + gnss-SignalID-Ext-r15 INTEGER (8..23) OPTIONAL -- Need ON + ]] +} + +-- ASN1STOP +-- ASN1START + +GNSS-SignalIDs ::= SEQUENCE { + gnss-SignalIDs BIT STRING (SIZE(8)), + ..., + [[ + gnss-SignalIDs-Ext-r15 BIT STRING (SIZE(16)) OPTIONAL -- Need ON + ]] +} + +-- ASN1STOP +-- ASN1START + +GNSS-SubNetworkID-r15 ::= SEQUENCE { + subNetworkID-r15 INTEGER (0..15), + ... +} + +-- ASN1STOP +-- ASN1START + +SBAS-ID ::= SEQUENCE { + sbas-id ENUMERATED { waas, egnos, msas, gagan, ...}, + ... +} + +-- ASN1STOP +-- ASN1START + +SBAS-IDs ::= SEQUENCE { + sbas-IDs BIT STRING { waas (0), + egnos (1), + msas (2), + gagan (3) } (SIZE (1..8)), + ... +} + +-- ASN1STOP +-- ASN1START + +SV-ID ::= SEQUENCE { + satellite-id INTEGER(0..63), + ... +} + +-- ASN1STOP +-- ASN1START + +ECID-ProvideLocationInformation ::= SEQUENCE { + ecid-SignalMeasurementInformation ECID-SignalMeasurementInformation OPTIONAL, + ecid-Error ECID-Error OPTIONAL, + ... +} + +-- ASN1STOP +-- ASN1START + +ECID-SignalMeasurementInformation ::= SEQUENCE { + primaryCellMeasuredResults MeasuredResultsElement OPTIONAL, + measuredResultsList MeasuredResultsList, + ... +} + +MeasuredResultsList ::= SEQUENCE (SIZE(1..32)) OF MeasuredResultsElement + +MeasuredResultsElement ::= SEQUENCE { + physCellId INTEGER (0..503), + cellGlobalId CellGlobalIdEUTRA-AndUTRA OPTIONAL, + arfcnEUTRA ARFCN-ValueEUTRA, + systemFrameNumber BIT STRING (SIZE (10)) OPTIONAL, + rsrp-Result INTEGER (0..97) OPTIONAL, + rsrq-Result INTEGER (0..34) OPTIONAL, + ue-RxTxTimeDiff INTEGER (0..4095) OPTIONAL, + ..., + [[ arfcnEUTRA-v9a0 ARFCN-ValueEUTRA-v9a0 OPTIONAL -- Cond EARFCN-max + ]], + [[ nrsrp-Result-r14 INTEGER (0..113) OPTIONAL, + nrsrq-Result-r14 INTEGER (0..74) OPTIONAL, + carrierFreqOffsetNB-r14 CarrierFreqOffsetNB-r14 OPTIONAL, -- Cond NB-IoT + hyperSFN-r14 BIT STRING (SIZE (10)) OPTIONAL + ]], + [[ + rsrp-Result-v1470 INTEGER (-17..-1) OPTIONAL, + rsrq-Result-v1470 INTEGER (-30..46) OPTIONAL + ]] +} + +-- ASN1STOP +-- ASN1START + +ECID-RequestLocationInformation ::= SEQUENCE { + requestedMeasurements BIT STRING { rsrpReq (0), + rsrqReq (1), + ueRxTxReq (2), + nrsrpReq-r14 (3), + nrsrqReq-r14 (4)} (SIZE(1..8)), + ... +} + +-- ASN1STOP +-- ASN1START + +ECID-ProvideCapabilities ::= SEQUENCE { + ecid-MeasSupported BIT STRING { rsrpSup (0), + rsrqSup (1), + ueRxTxSup (2), + nrsrpSup-r14 (3), + nrsrqSup-r14 (4)} (SIZE(1..8)), + ..., + [[ ueRxTxSupTDD-r13 ENUMERATED { true } OPTIONAL + ]], + [[ periodicalReporting-r14 ENUMERATED { supported } OPTIONAL, + triggeredReporting-r14 ENUMERATED { supported } OPTIONAL, + idleStateForMeasurements-r14 ENUMERATED { required } OPTIONAL + ]] +} + +-- ASN1STOP +-- ASN1START + +ECID-RequestCapabilities ::= SEQUENCE { + ... +} + +-- ASN1STOP +-- ASN1START + +ECID-Error ::= CHOICE { + locationServerErrorCauses ECID-LocationServerErrorCauses, + targetDeviceErrorCauses ECID-TargetDeviceErrorCauses, + ... +} + +-- ASN1STOP +-- ASN1START + +ECID-LocationServerErrorCauses ::= SEQUENCE { + cause ENUMERATED { undefined, + ... + }, + ... +} + +-- ASN1STOP +-- ASN1START + +ECID-TargetDeviceErrorCauses ::= SEQUENCE { + cause ENUMERATED { undefined, + requestedMeasurementNotAvailable, + notAllrequestedMeasurementsPossible, + ... + }, + rsrpMeasurementNotPossible NULL OPTIONAL, + rsrqMeasurementNotPossible NULL OPTIONAL, + ueRxTxMeasurementNotPossible NULL OPTIONAL, + ..., + [[ + nrsrpMeasurementNotPossible-r14 NULL OPTIONAL, + nrsrqMeasurementNotPossible-r14 NULL OPTIONAL + ]] +} + +-- ASN1STOP +-- ASN1START + +TBS-ProvideLocationInformation-r13 ::= SEQUENCE { + tbs-MeasurementInformation-r13 TBS-MeasurementInformation-r13 OPTIONAL, + tbs-Error-r13 TBS-Error-r13 OPTIONAL, + ... +} + +-- ASN1STOP +-- ASN1START + +TBS-MeasurementInformation-r13 ::= SEQUENCE { + measurementReferenceTime-r13 UTCTime OPTIONAL, + mbs-SgnMeasList-r13 MBS-BeaconMeasList-r13 OPTIONAL, -- Cond MBS + ... +} + +-- ASN1STOP +-- ASN1START + +MBS-BeaconMeasList-r13 ::= SEQUENCE (SIZE(1..64)) OF MBS-BeaconMeasElement-r13 + +MBS-BeaconMeasElement-r13 ::= SEQUENCE { + transmitterID-r13 INTEGER (0..32767), + codePhase-r13 INTEGER (0..2097151), + codePhaseRMSError-r13 INTEGER (0..63), + ..., + [[ rssi-r14 INTEGER (-130..-30) OPTIONAL + ]] +} + +-- ASN1STOP +-- ASN1START + +TBS-RequestLocationInformation-r13 ::= SEQUENCE { + mbsSgnMeasListReq-r13 BOOLEAN, + ..., + [[ mbsAssistanceAvailability-r14 BOOLEAN OPTIONAL, -- Need ON + mbsRequestedMeasurements-r14 BIT STRING { + rssi (0)} (SIZE(1..8)) OPTIONAL -- Need ON + ]] +} + +-- ASN1STOP +-- ASN1START + +TBS-ProvideCapabilities-r13 ::= SEQUENCE { + tbs-Modes-r13 BIT STRING { standalone (0), + ue-assisted (1), + ue-based (2)} (SIZE (1..8)), + ..., + [[ mbs-AssistanceDataSupportList-r14 MBS-AssistanceDataSupportList-r14 OPTIONAL, + periodicalReportingSupported-r14 PositioningModes OPTIONAL, + mbs-ConfigSupport-r14 BIT STRING { tb1 (0), + tb2 (1), + tb3 (2), + tb4 (3)} (SIZE (1..8)) OPTIONAL, + mbs-IdleStateForMeasurements-r14 ENUMERATED { required } OPTIONAL + ]] +} + +-- ASN1STOP +-- ASN1START + +MBS-AssistanceDataSupportList-r14 ::= SEQUENCE { + mbs-AcquisitionAssistanceDataSupport-r14 BOOLEAN, + mbs-AlmanacAssistanceDataSupport-r14 BOOLEAN, + ... +} + +-- ASN1STOP +-- ASN1START + +TBS-RequestCapabilities-r13 ::= SEQUENCE { + ... +} + +-- ASN1STOP +-- ASN1START + +TBS-Error-r13 ::= CHOICE { + locationServerErrorCauses-r13 TBS-LocationServerErrorCauses-r13, + targetDeviceErrorCauses-r13 TBS-TargetDeviceErrorCauses-r13, + ... +} + +-- ASN1STOP +-- ASN1START + +TBS-LocationServerErrorCauses-r13 ::= SEQUENCE { + cause-r13 ENUMERATED { undefined, + ..., + assistanceDataNotSupportedByServer-v1420, + assistanceDataSupportedButCurrentlyNotAvailableByServer-v1420 + }, + ... +} + +-- ASN1STOP +-- ASN1START + +TBS-TargetDeviceErrorCauses-r13 ::= SEQUENCE { + cause-r13 ENUMERATED { undefined, + thereWereNotEnoughMBSBeaconsReceived, + ..., + assistanceDataMissing-v1420 + }, + ... +} + +-- ASN1STOP +-- ASN1START + +TBS-ProvideAssistanceData-r14 ::= SEQUENCE { + tbs-AssistanceDataList-r14 TBS-AssistanceDataList-r14 OPTIONAL, -- Need ON + tbs-Error-r14 TBS-Error-r13 OPTIONAL, -- Need ON + ... +} + +-- ASN1STOP +-- ASN1START + +TBS-AssistanceDataList-r14 ::= SEQUENCE { + mbs-AssistanceDataList-r14 MBS-AssistanceDataList-r14 OPTIONAL, -- Need ON + ... +} + +MBS-AssistanceDataList-r14 ::= SEQUENCE (SIZE (1..maxMBS-r14)) OF MBS-AssistanceDataElement-r14 + +MBS-AssistanceDataElement-r14 ::= SEQUENCE { + mbs-AlmanacAssistance-r14 MBS-AlmanacAssistance-r14 OPTIONAL, -- Need ON + mbs-AcquisitionAssistance-r14 MBS-AcquisitionAssistance-r14 OPTIONAL, -- Need ON + ... +} + +-- ASN1STOP +-- ASN1START + +MBS-AlmanacAssistance-r14 ::= SEQUENCE { + transmitterID-r14 INTEGER (0..32767), + transmitterLatitude-r14 BIT STRING (SIZE (26)), + transmitterLongitude-r14 BIT STRING (SIZE (27)), + transmitterAltitude-r14 BIT STRING (SIZE (15)), + timeCorrection-r14 INTEGER (0..25) OPTIONAL, -- Need ON + ... +} + +-- ASN1STOP +-- ASN1START + +MBS-AcquisitionAssistance-r14 ::= SEQUENCE { + transmitterID-r14 INTEGER (0..32767) OPTIONAL, -- Need ON + mbsConfiguration-r14 ENUMERATED {tb1, tb2, tb3, tb4, ...} OPTIONAL, -- Need ON + pnCodeIndex-r14 INTEGER (1..128) OPTIONAL, -- Need ON + freq-r14 INTEGER (919750000..927250000) OPTIONAL, -- Need ON + ... +} + +-- ASN1STOP +-- ASN1START + +TBS-RequestAssistanceData-r14 ::= SEQUENCE { + mbs-AlmanacAssistanceDataReq-r14 BOOLEAN, + mbs-AcquisitionAssistanceDataReq-r14 BOOLEAN, + ... +} + +-- ASN1STOP +-- ASN1START + +Sensor-ProvideLocationInformation-r13 ::= SEQUENCE { + sensor-MeasurementInformation-r13 Sensor-MeasurementInformation-r13 OPTIONAL, + sensor-Error-r13 Sensor-Error-r13 OPTIONAL, + ..., + [[ + sensor-MotionInformation-r15 Sensor-MotionInformation-r15 OPTIONAL + ]] +} + +-- ASN1STOP +-- ASN1START + +Sensor-MeasurementInformation-r13 ::= SEQUENCE { + measurementReferenceTime-r13 UTCTime OPTIONAL, + uncompensatedBarometricPressure-r13 INTEGER (30000..115000) OPTIONAL, -- Cond Barometer + ..., + [[ + uncertainty-r14 SEQUENCE { + range-r14 INTEGER (0..1000), + confidence-r14 INTEGER (1..100) + } OPTIONAL + ]], + [[ adjustment-r16 INTEGER (-5000..5000) OPTIONAL + ]] +} + +-- ASN1STOP +-- ASN1START + +Sensor-MotionInformation-r15 ::= SEQUENCE { + refTime-r15 DisplacementTimeStamp-r15, + displacementInfoList-r15 DisplacementInfoList-r15, + ... +} + +DisplacementInfoList-r15 ::= SEQUENCE (SIZE (1..128)) OF DisplacementInfoListElement-r15 + +DisplacementInfoListElement-r15 ::= SEQUENCE { + deltaTimeStamp-r15 DeltaTime-r15, + displacement-r15 Displacement-r15 OPTIONAL, + ... +} + +DisplacementTimeStamp-r15 ::= CHOICE { + utcTime-r15 UTC-Time-r15, + gnssTime-r15 MeasurementReferenceTime, + systemFrameNumber-r15 SFN-r15, + measurementSFN-r15 INTEGER(-8192..9214), + ... +} + +DeltaTime-r15 ::= CHOICE { + deltaTimeSec-r15 INTEGER (1..16384), + deltaTimeSFN-r15 INTEGER (1..4096), + ... +} + +SFN-r15 ::= SEQUENCE { + sfn-r15 BIT STRING (SIZE (10)), + hyperSFN-r15 BIT STRING (SIZE (10)) OPTIONAL, + ... +} + +Displacement-r15 ::= SEQUENCE { + bearing-r15 INTEGER (0..3599), + bearingUncConfidence-r15 INTEGER (0..100) OPTIONAL, + bearingRef-r15 ENUMERATED { geographicNorth, magneticNorth, local }, + horizontalDistance-r15 INTEGER (0..8191), + horizontalDistanceUnc-r15 INTEGER (0..255) OPTIONAL, + horizontalUncConfidence-r15 INTEGER (0..100) OPTIONAL, + verticalDirection-r15 ENUMERATED{upward, downward} OPTIONAL, + verticalDistance-r15 INTEGER(0..8191) OPTIONAL, + verticalDistanceUnc-r15 INTEGER (0..255) OPTIONAL, + verticalUncConfidence-r15 INTEGER (0..100) OPTIONAL, + ... +} + +UTC-Time-r15 ::= SEQUENCE { + utcTime-r15 UTCTime, + utcTime-ms-r15 INTEGER (0..999), + ... +} + +-- ASN1STOP +-- ASN1START + +Sensor-RequestLocationInformation-r13 ::= SEQUENCE { + uncompensatedBarometricPressureReq-r13 BOOLEAN, + ..., + [[ assistanceAvailability-r14 BOOLEAN OPTIONAL -- Need ON + ]], + [[ sensor-MotionInformationReq-r15 BOOLEAN OPTIONAL -- Need ON + ]], + [[ adjustmentReq-r16 BOOLEAN OPTIONAL -- Need ON + ]] +} + +-- ASN1STOP +-- ASN1START + +Sensor-ProvideCapabilities-r13 ::= SEQUENCE { + sensor-Modes-r13 BIT STRING { standalone (0), + ue-assisted (1), + ue-based (2)} (SIZE (1..8)), + ..., + [[ sensor-AssistanceDataSupportList-r14 Sensor-AssistanceDataSupportList-r14 OPTIONAL, + periodicalReportingSupported-r14 PositioningModes OPTIONAL, + idleStateForMeasurements-r14 ENUMERATED { required } OPTIONAL + ]], + [[ sensor-MotionInformationSup-r15 ENUMERATED { true } OPTIONAL + ]], + [[ adjustmentSupported-r16 ENUMERATED { true } OPTIONAL + ]] +} + +Sensor-AssistanceDataSupportList-r14 ::= SEQUENCE { + ..., + [[ validityPeriodSupported-v1520 ENUMERATED { true } OPTIONAL, + validityAreaSupported-v1520 ENUMERATED { true } OPTIONAL + ]] +} + +-- ASN1STOP +-- ASN1START + +Sensor-RequestCapabilities-r13 ::= SEQUENCE { + ... +} + +-- ASN1STOP +-- ASN1START + +Sensor-Error-r13 ::= CHOICE { + locationServerErrorCauses-r13 Sensor-LocationServerErrorCauses-r13, + targetDeviceErrorCauses-r13 Sensor-TargetDeviceErrorCauses-r13, + ... +} + +-- ASN1STOP +-- ASN1START + +Sensor-LocationServerErrorCauses-r13 ::= SEQUENCE { + cause-r13 ENUMERATED { undefined, + ..., + assistanceDataNotSupportedByServer-v1420, + assistanceDataSupportedButCurrentlyNotAvailableByServer-v1420 + }, + ... +} + +-- ASN1STOP +-- ASN1START + +Sensor-TargetDeviceErrorCauses-r13 ::= SEQUENCE { + cause-r13 ENUMERATED { undefined, + ..., + assistanceDataMissing-v1420 + }, + ... +} + +-- ASN1STOP +-- ASN1START + +Sensor-ProvideAssistanceData-r14 ::= SEQUENCE { + sensor-AssistanceDataList-r14 Sensor-AssistanceDataList-r14 OPTIONAL, -- Need ON + sensor-Error-r14 Sensor-Error-r13 OPTIONAL, -- Need ON + ... +} + +-- ASN1STOP +-- ASN1START + +Sensor-AssistanceDataList-r14::= SEQUENCE { + refPressure-r14 INTEGER (-20000..10000), + refPosition-r14 EllipsoidPointWithAltitudeAndUncertaintyEllipsoid OPTIONAL, -- Need ON + refTemperature-r14 INTEGER (-64..63) OPTIONAL, -- Need ON + ..., + [[ + period-v1520 SEQUENCE { + pressureValidityPeriod-v1520 PressureValidityPeriod-v1520, + referencePressureRate-v1520 INTEGER (-128..127) OPTIONAL, -- Need ON + ... + } OPTIONAL, -- Need ON + area-v1520 SEQUENCE { + pressureValidityArea-v1520 PressureValidityArea-v1520, + gN-pressure-v1520 INTEGER (-1024..1023) OPTIONAL, -- Need ON + gE-pressure-v1520 INTEGER (-1024..1023) OPTIONAL, -- Need ON + ... + } OPTIONAL -- Need ON + ]] +} + +PressureValidityArea-v1520 ::= SEQUENCE { + centerPoint-v1520 Ellipsoid-Point, + validityAreaWidth-v1520 INTEGER (1..128), + validityAreaHeight-v1520 INTEGER (1..128), + ... +} + +PressureValidityPeriod-v1520 ::= SEQUENCE { + beginTime-v1520 GNSS-SystemTime, + beginTimeAlt-v1520 INTEGER (0..2881) OPTIONAL, -- Need ON + duration-v1520 INTEGER (1..2881), + ... +} + +-- ASN1STOP +-- ASN1START + +Sensor-RequestAssistanceData-r14 ::= SEQUENCE { + ... +} + +-- ASN1STOP +-- ASN1START + +WLAN-ProvideLocationInformation-r13 ::= SEQUENCE { + wlan-MeasurementInformation-r13 WLAN-MeasurementInformation-r13 OPTIONAL, + wlan-Error-r13 WLAN-Error-r13 OPTIONAL, + ... +} + +-- ASN1STOP +-- ASN1START + +WLAN-MeasurementInformation-r13 ::= SEQUENCE { + measurementReferenceTime-r13 UTCTime OPTIONAL, + wlan-MeasurementList-r13 WLAN-MeasurementList-r13 OPTIONAL, + ... +} + +WLAN-MeasurementList-r13 ::= SEQUENCE (SIZE(1..maxWLAN-AP-r13)) OF WLAN-MeasurementElement-r13 + +WLAN-MeasurementElement-r13 ::= SEQUENCE { + wlan-AP-Identifier-r13 WLAN-AP-Identifier-r13, + rssi-r13 INTEGER (-127..128) OPTIONAL, + rtt-r13 WLAN-RTT-r13 OPTIONAL, + apChannelFrequency-r13 INTEGER (0..256) OPTIONAL, + servingFlag-r13 BOOLEAN OPTIONAL, + ... +} + +WLAN-AP-Identifier-r13 ::= SEQUENCE { + bssid-r13 OCTET STRING (SIZE (6)), + ssid-r13 OCTET STRING (SIZE (1..32)) OPTIONAL, + ... +} + +WLAN-RTT-r13 ::= SEQUENCE { + rttValue-r13 INTEGER (0..16777215), + rttUnits-r13 ENUMERATED { microseconds, + hundredsofnanoseconds, + tensofnanoseconds, + nanoseconds, + tenthsofnanoseconds, + ... }, + rttAccuracy-r13 INTEGER (0..255) OPTIONAL, + ... +} + +-- ASN1STOP +-- ASN1START + +WLAN-RequestLocationInformation-r13 ::= SEQUENCE { + requestedMeasurements-r13 BIT STRING { + rssi (0), + rtt (1)} (SIZE(1..8)), + ..., + [[ assistanceAvailability-r14 BOOLEAN OPTIONAL -- Need ON + ]] +} + +-- ASN1STOP +-- ASN1START + +WLAN-ProvideCapabilities-r13 ::= SEQUENCE { + wlan-Modes-r13 BIT STRING { standalone (0), + ue-assisted (1), + ue-based (2)} (SIZE (1..8)), + wlan-MeasSupported-r13 BIT STRING { + rssi-r13 (0), + rtt-r13 (1)} (SIZE(1..8)), + ... , + [[ wlan-AP-AD-Supported-r14 + BIT STRING { ap-identifier (0), + ap-location (1)} (SIZE (1..8)) + OPTIONAL, + periodicalReportingSupported-r14 PositioningModes OPTIONAL, + idleStateForMeasurements-r14 + ENUMERATED { required } OPTIONAL + ]] +} + +-- ASN1STOP +-- ASN1START + +WLAN-RequestCapabilities-r13 ::= SEQUENCE { + ... +} + +-- ASN1STOP +-- ASN1START + +WLAN-Error-r13 ::= CHOICE { + locationServerErrorCauses-r13 WLAN-LocationServerErrorCauses-r13, + targetDeviceErrorCauses-r13 WLAN-TargetDeviceErrorCauses-r13, + ... +} + +-- ASN1STOP +-- ASN1START + +WLAN-LocationServerErrorCauses-r13 ::= SEQUENCE { + cause-r13 ENUMERATED {undefined, + ..., + requestedADNotAvailable-v1420, + notAllrequestedADAvailable-v1420 + }, + ..., + [[ apLocationDataUnavailable-r14 NULL OPTIONAL -- Need ON + ]] +} + +-- ASN1STOP +-- ASN1START + +WLAN-TargetDeviceErrorCauses-r13 ::= SEQUENCE { + cause-r13 ENUMERATED {undefined, + requestedMeasurementsNotAvailable, + notAllrequestedMeasurementsPossible, + ... + }, + wlan-AP-RSSI-MeasurementNotPossible-r13 NULL OPTIONAL, + wlan-AP-RTT-MeasurementNotPossible-r13 NULL OPTIONAL, + ... +} + +-- ASN1STOP +-- ASN1START + +WLAN-ProvideAssistanceData-r14 ::= SEQUENCE { + wlan-DataSet-r14 SEQUENCE (SIZE (1..maxWLAN-DataSets-r14)) OF WLAN-DataSet-r14 + OPTIONAL, -- Need ON + wlan-Error-r14 WLAN-Error-r13 OPTIONAL, -- Need ON + ... +} + +-- ASN1STOP +-- ASN1START + +WLAN-DataSet-r14 ::= SEQUENCE { + wlan-AP-List-r14 SEQUENCE (SIZE (1..maxWLAN-AP-r14)) OF WLAN-AP-Data-r14, + supportedChannels-11a-r14 SupportedChannels-11a-r14 OPTIONAL, -- Need ON + supportedChannels-11bg-r14 SupportedChannels-11bg-r14 OPTIONAL, -- Need ON + ... +} + +SupportedChannels-11a-r14 ::= SEQUENCE { + ch34-r14 BOOLEAN, + ch36-r14 BOOLEAN, + ch38-r14 BOOLEAN, + ch40-r14 BOOLEAN, + ch42-r14 BOOLEAN, + ch44-r14 BOOLEAN, + ch46-r14 BOOLEAN, + ch48-r14 BOOLEAN, + ch52-r14 BOOLEAN, + ch56-r14 BOOLEAN, + ch60-r14 BOOLEAN, + ch64-r14 BOOLEAN, + ch149-r14 BOOLEAN, + ch153-r14 BOOLEAN, + ch157-r14 BOOLEAN, + ch161-r14 BOOLEAN +} + +SupportedChannels-11bg-r14 ::= SEQUENCE { + ch1-r14 BOOLEAN, + ch2-r14 BOOLEAN, + ch3-r14 BOOLEAN, + ch4-r14 BOOLEAN, + ch5-r14 BOOLEAN, + ch6-r14 BOOLEAN, + ch7-r14 BOOLEAN, + ch8-r14 BOOLEAN, + ch9-r14 BOOLEAN, + ch10-r14 BOOLEAN, + ch11-r14 BOOLEAN, + ch12-r14 BOOLEAN, + ch13-r14 BOOLEAN, + ch14-r14 BOOLEAN +} + +-- ASN1STOP +-- ASN1START + +WLAN-AP-Data-r14 ::= SEQUENCE { + wlan-AP-Identifier-r14 WLAN-AP-Identifier-r13, + wlan-AP-Location-r14 WLAN-AP-Location-r14 OPTIONAL, -- Need ON + ... +} + +WLAN-AP-Location-r14 ::= SEQUENCE { + locationDataLCI-r14 LocationDataLCI-r14, + ... +} + +LocationDataLCI-r14 ::= SEQUENCE { + latitudeUncertainty-r14 BIT STRING (SIZE (6)), + latitude-r14 BIT STRING (SIZE (34)), + longitudeUncertainty-r14 BIT STRING (SIZE (6)), + longitude-r14 BIT STRING (SIZE (34)), + altitudeUncertainty-r14 BIT STRING (SIZE (6)) OPTIONAL, -- Need ON + altitude-r14 BIT STRING (SIZE (30)) OPTIONAL, -- Need ON + datum-r14 BIT STRING (SIZE (8)), + ... +} + +-- ASN1STOP +-- ASN1START + +WLAN-RequestAssistanceData-r14 ::= SEQUENCE { + requestedAD-r14 BIT STRING { ap-identifier (0), + ap-location (1)} (SIZE (1..8)), + visibleAPs-r14 SEQUENCE (SIZE (1..maxVisibleAPs-r14)) OF WLAN-AP-Identifier-r13 OPTIONAL, + wlan-AP-StoredData-r14 SEQUENCE (SIZE (1..maxKnownAPs-r14)) OF WLAN-AP-Identifier-r13 OPTIONAL, + ... +} + +-- ASN1STOP +-- ASN1START + +BT-ProvideLocationInformation-r13 ::= SEQUENCE { + bt-MeasurementInformation-r13 BT-MeasurementInformation-r13 OPTIONAL, + bt-Error-r13 BT-Error-r13 OPTIONAL, + ... +} + +-- ASN1STOP +-- ASN1START + +BT-MeasurementInformation-r13 ::= SEQUENCE { + measurementReferenceTime-r13 UTCTime OPTIONAL, + bt-MeasurementList-r13 BT-MeasurementList-r13 OPTIONAL, + ... +} + +BT-MeasurementList-r13 ::= SEQUENCE (SIZE(1..maxBT-Beacon-r13)) OF BT-MeasurementElement-r13 + + +BT-MeasurementElement-r13 ::= SEQUENCE { + btAddr-r13 BIT STRING (SIZE (48)), + rssi-r13 INTEGER (-128..127) OPTIONAL, + ... +} + +-- ASN1STOP +-- ASN1START + +BT-RequestLocationInformation-r13 ::= SEQUENCE { + requestedMeasurements-r13 BIT STRING { + rssi (0)} (SIZE(1..8)), + ... +} + +-- ASN1STOP +-- ASN1START + +BT-ProvideCapabilities-r13 ::= SEQUENCE { + bt-Modes-r13 BIT STRING { standalone (0), + ue-assisted (1)} (SIZE (1..8)), + bt-MeasSupported-r13 BIT STRING { rssi-r13 (0)} (SIZE (1..8)), + ..., + [[ + idleStateForMeasurements-r14 + ENUMERATED { required } OPTIONAL, + periodicalReportingSupported-r14 + PositioningModes OPTIONAL + ]] +} + +-- ASN1STOP +-- ASN1START + +BT-RequestCapabilities-r13 ::= SEQUENCE { + ... +} + +-- ASN1STOP +-- ASN1START + +BT-Error-r13 ::= CHOICE { + locationServerErrorCauses-r13 BT-LocationServerErrorCauses-r13, + targetDeviceErrorCauses-r13 BT-TargetDeviceErrorCauses-r13, + ... +} + +-- ASN1STOP +-- ASN1START + +BT-LocationServerErrorCauses-r13 ::= SEQUENCE { + cause-r13 ENUMERATED {undefined, ...}, + ... +} + +-- ASN1STOP +-- ASN1START + +BT-TargetDeviceErrorCauses-r13 ::= SEQUENCE { + cause-r13 ENUMERATED {undefined, + requestedMeasurementsNotAvailable, + notAllrequestedMeasurementsPossible, + ... + }, + bt-Beacon-rssiMeasurementNotPossible-r13 NULL OPTIONAL, + ... +} + +-- ASN1STOP +-- ASN1START + +NR-UL-ProvideCapabilities-r16 ::= SEQUENCE { + nr-UL-SRS-Capability-r16 NR-UL-SRS-Capability-r16, + ... +} + +-- ASN1STOP +-- ASN1START + +NR-UL-RequestCapabilities-r16 ::= SEQUENCE { + ... +} +-- ASN1STOP +-- ASN1START + +NR-ECID-ProvideLocationInformation-r16 ::= SEQUENCE { + nr-ECID-SignalMeasurementInformation-r16 NR-ECID-SignalMeasurementInformation-r16 OPTIONAL, + nr-ECID-Error-r16 NR-ECID-Error-r16 OPTIONAL, + ... +} + +-- ASN1STOP +-- ASN1START + +NR-ECID-SignalMeasurementInformation-r16 ::= SEQUENCE { + nr-PrimaryCellMeasuredResults-r16 NR-MeasuredResultsElement-r16, + nr-MeasuredResultsList-r16 NR-MeasuredResultsList-r16 OPTIONAL, + ... +} + +NR-MeasuredResultsList-r16 ::= SEQUENCE (SIZE(1..32)) OF NR-MeasuredResultsElement-r16 + +NR-MeasuredResultsElement-r16 ::= SEQUENCE { + nr-PhysCellID-r16 NR-PhysCellID-r16, + nr-ARFCN-r16 CHOICE { + ssb-ARFCN-r16 ARFCN-ValueNR-r15, + csi-RS-pointA-r16 ARFCN-ValueNR-r15 + }, + nr-CellGlobalID-r16 NCGI-r15 OPTIONAL, + systemFrameNumber-r16 BIT STRING (SIZE (10)) OPTIONAL, resultsSSB-Cell-r16 MeasQuantityResults-r16 OPTIONAL, + resultsCSI-RS-Cell-r16 MeasQuantityResults-r16 OPTIONAL, + resultsSSB-Indexes-r16 ResultsPerSSB-IndexList-r16 OPTIONAL, + resultsCSI-RS-Indexes-r16 ResultsPerCSI-RS-IndexList-r16 OPTIONAL, + ... +} + +MeasQuantityResults-r16 ::= SEQUENCE { + nr-RSRP-r16 INTEGER (0..127) OPTIONAL, + nr-RSRQ-r16 INTEGER (0..127) OPTIONAL +} + +ResultsPerSSB-IndexList-r16::= SEQUENCE (SIZE (1..64)) OF ResultsPerSSB-Index-r16 + +ResultsPerSSB-Index-r16 ::= SEQUENCE { + ssb-Index-r16 INTEGER (0..63), + ssb-Results-r16 MeasQuantityResults-r16 +} + +ResultsPerCSI-RS-IndexList-r16::= SEQUENCE (SIZE (1..64)) OF ResultsPerCSI-RS-Index-r16 + +ResultsPerCSI-RS-Index-r16 ::= SEQUENCE { + csi-RS-Index-r16 INTEGER (0..95), + csi-RS-Results-r16 MeasQuantityResults-r16 +} + +-- ASN1STOP +-- ASN1START + +NR-ECID-RequestLocationInformation-r16 ::= SEQUENCE { + requestedMeasurements-r16 BIT STRING { ssrsrpReq (0), + ssrsrqReq (1), + csirsrpReq (2), + csirsrqReq (3)} (SIZE(1..8)), + ... +} + +-- ASN1STOP +-- ASN1START + +NR-ECID-ProvideCapabilities-r16 ::= SEQUENCE { + nr-ECID-MeasSupported-r16 BIT STRING { ssrsrpSup (0), + ssrsrqSup (1), + csirsrpSup (2), + csirsrqSup (3)} (SIZE(1..8)), + periodicalReporting-r16 ENUMERATED { supported } OPTIONAL, + triggeredReporting-r16 ENUMERATED { supported } OPTIONAL, + ... +} + +-- ASN1STOP +-- ASN1START + +NR-ECID-RequestCapabilities-r16 ::= SEQUENCE { + ... +} + +-- ASN1STOP +-- ASN1START + +NR-ECID-Error-r16 ::= CHOICE { + locationServerErrorCauses-r16 NR-ECID-LocationServerErrorCauses-r16, + targetDeviceErrorCauses-r16 NR-ECID-TargetDeviceErrorCauses-r16, + ... +} + +-- ASN1STOP +-- ASN1START + +NR-ECID-LocationServerErrorCauses-r16 ::= SEQUENCE { + cause-r16 ENUMERATED { undefined, + ... + }, + ... +} + +-- ASN1STOP +-- ASN1START + +NR-ECID-TargetDeviceErrorCauses-r16 ::= SEQUENCE { + cause-r16 ENUMERATED { undefined, + requestedMeasurementNotAvailable, + notAllrequestedMeasurementsPossible, + ... + }, + ss-RSRPMeasurementNotPossible-r16 NULL OPTIONAL, + ss-RSRQMeasurementNotPossible-r16 NULL OPTIONAL, + csi-RSRPMeasurementNotPossible-r16 NULL OPTIONAL, + csi-RSRQMeasurementNotPossible-r16 NULL OPTIONAL, + ... +} + +-- ASN1STOP +-- ASN1START + +NR-DL-TDOA-ProvideAssistanceData-r16 ::= SEQUENCE { + nr-DL-PRS-AssistanceData-r16 NR-DL-PRS-AssistanceData-r16 OPTIONAL, -- Need ON + nr-SelectedDL-PRS-IndexList-r16 NR-SelectedDL-PRS-IndexList-r16 OPTIONAL, -- Need ON + nr-PositionCalculationAssistance-r16 + NR-PositionCalculationAssistance-r16 + OPTIONAL, -- Cond UEB + nr-DL-TDOA-Error-r16 NR-DL-TDOA-Error-r16 OPTIONAL, -- Need ON + ... +} + +-- ASN1STOP +-- ASN1START + +NR-DL-TDOA-RequestAssistanceData-r16 ::= SEQUENCE { + nr-PhysCellID-r16 NR-PhysCellID-r16 OPTIONAL, + nr-AdType-r16 BIT STRING { dl-prs (0), + posCalc (1) } (SIZE (1..8)), + ... +} + +-- ASN1STOP +-- ASN1START + +NR-DL-TDOA-ProvideLocationInformation-r16 ::= SEQUENCE { + nr-DL-TDOA-SignalMeasurementInformation-r16 + NR-DL-TDOA-SignalMeasurementInformation-r16 + OPTIONAL, + nr-dl-tdoa-LocationInformation-r16 NR-DL-TDOA-LocationInformation-r16 + OPTIONAL, + nr-DL-TDOA-Error-r16 NR-DL-TDOA-Error-r16 OPTIONAL, + ... +} + +-- ASN1STOP +-- ASN1START + +NR-DL-TDOA-SignalMeasurementInformation-r16 ::= SEQUENCE { + dl-PRS-ReferenceInfo-r16 DL-PRS-ID-Info-r16, + nr-DL-TDOA-MeasList-r16 NR-DL-TDOA-MeasList-r16, + ... +} + +NR-DL-TDOA-MeasList-r16 ::= SEQUENCE (SIZE(1..nrMaxTRPs-r16)) OF NR-DL-TDOA-MeasElement-r16 + +NR-DL-TDOA-MeasElement-r16 ::= SEQUENCE { + dl-PRS-ID-r16 INTEGER (0..255), + nr-PhysCellID-r16 NR-PhysCellID-r16 OPTIONAL, + nr-CellGlobalID-r16 NCGI-r15 OPTIONAL, + nr-ARFCN-r16 ARFCN-ValueNR-r15 OPTIONAL, + nr-DL-PRS-ResourceID-r16 NR-DL-PRS-ResourceID-r16 OPTIONAL, + nr-DL-PRS-ResourceSetID-r16 NR-DL-PRS-ResourceSetID-r16 OPTIONAL, + nr-TimeStamp-r16 NR-TimeStamp-r16, + nr-RSTD-r16 CHOICE { + k0-r16 INTEGER (0..1970049), + k1-r16 INTEGER (0..985025), + k2-r16 INTEGER (0..492513), + k3-r16 INTEGER (0..246257), + k4-r16 INTEGER (0..123129), + k5-r16 INTEGER (0..61565), + ... + }, + nr-AdditionalPathList-r16 NR-AdditionalPathList-r16 OPTIONAL, + nr-TimingQuality-r16 NR-TimingQuality-r16, + nr-DL-PRS-RSRP-Result-r16 INTEGER (0..126) OPTIONAL, + nr-DL-TDOA-AdditionalMeasurements-r16 + NR-DL-TDOA-AdditionalMeasurements-r16 OPTIONAL, + ... +} + +NR-DL-TDOA-AdditionalMeasurements-r16 ::= SEQUENCE (SIZE (1..3)) OF + NR-DL-TDOA-AdditionalMeasurementElement-r16 + +NR-DL-TDOA-AdditionalMeasurementElement-r16 ::= SEQUENCE { + nr-DL-PRS-ResourceID-r16 NR-DL-PRS-ResourceID-r16 OPTIONAL, + nr-DL-PRS-ResourceSetID-r16 NR-DL-PRS-ResourceSetID-r16 OPTIONAL, + nr-TimeStamp-r16 NR-TimeStamp-r16, + nr-RSTD-ResultDiff-r16 CHOICE { + k0-r16 INTEGER (0..8191), + k1-r16 INTEGER (0..4095), + k2-r16 INTEGER (0..2047), + k3-r16 INTEGER (0..1023), + k4-r16 INTEGER (0..511), + k5-r16 INTEGER (0..255), + ... + }, + nr-TimingQuality-r16 NR-TimingQuality-r16, + nr-DL-PRS-RSRP-ResultDiff-r16 INTEGER (0..61) OPTIONAL, + nr-AdditionalPathList-r16 NR-AdditionalPathList-r16 OPTIONAL, +... +} + +-- ASN1STOP +-- ASN1START + +NR-DL-TDOA-LocationInformation-r16 ::= SEQUENCE { + measurementReferenceTime-r16 CHOICE { + systemFrameNumber-r16 NR-TimeStamp-r16, + utc-time-r16 UTCTime, + ... + } OPTIONAL, + ... +} + +-- ASN1STOP +-- ASN1START + +NR-DL-TDOA-RequestLocationInformation-r16 ::= SEQUENCE { + nr-DL-PRS-RstdMeasurementInfoRequest-r16 ENUMERATED { true } OPTIONAL,-- Need ON + nr-RequestedMeasurements-r16 BIT STRING { prsrsrpReq (0) } (SIZE(1..8)), + nr-AssistanceAvailability-r16 BOOLEAN, + nr-DL-TDOA-ReportConfig-r16 NR-DL-TDOA-ReportConfig-r16 OPTIONAL, -- Need ON + additionalPaths-r16 ENUMERATED { requested } OPTIONAL, -- Need ON + ... +} + +NR-DL-TDOA-ReportConfig-r16 ::= SEQUENCE { + maxDL-PRS-RSTD-MeasurementsPerTRPPair-r16 INTEGER (1..4) OPTIONAL, -- Need ON + timingReportingGranularityFactor-r16 INTEGER (0..5) OPTIONAL, -- Need ON + ... +} + +-- ASN1STOP +-- ASN1START + +NR-DL-TDOA-ProvideCapabilities-r16 ::= SEQUENCE { + nr-DL-TDOA-Mode-r16 PositioningModes, + nr-DL-TDOA-PRS-Capability-r16 NR-DL-PRS-ResourcesCapability-r16, + nr-DL-TDOA-MeasurementCapability-r16 NR-DL-TDOA-MeasurementCapability-r16, + nr-DL-PRS-QCL-ProcessingCapability-r16 NR-DL-PRS-QCL-ProcessingCapability-r16, + nr-DL-PRS-ProcessingCapability-r16 NR-DL-PRS-ProcessingCapability-r16, + additionalPathsReport-r16 ENUMERATED { supported } OPTIONAL, + periodicalReporting-r16 PositioningModes OPTIONAL, + ... +} + +-- ASN1STOP +-- ASN1START + +NR-DL-TDOA-MeasurementCapability-r16 ::= SEQUENCE { + dl-RSTD-MeasurementPerPairOfTRP-FR1-r16 INTEGER (1..4), + dl-RSTD-MeasurementPerPairOfTRP-FR2-r16 INTEGER (1..4), + supportOfDL-PRS-RSRP-MeasFR1-r16 ENUMERATED { supported} OPTIONAL, + supportOfDL-PRS-RSRP-MeasFR2-r16 ENUMERATED { supported} OPTIONAL, + ... +} +-- ASN1STOP +-- ASN1START + +NR-DL-TDOA-RequestCapabilities-r16 ::= SEQUENCE { + ... +} + +-- ASN1STOP +-- ASN1START + +NR-DL-TDOA-Error-r16 ::= CHOICE { + locationServerErrorCauses-r16 NR-DL-TDOA-LocationServerErrorCauses-r16, + targetDeviceErrorCauses-r16 NR-DL-TDOA-TargetDeviceErrorCauses-r16, + ... +} + +-- ASN1STOP +-- ASN1START + +NR-DL-TDOA-LocationServerErrorCauses-r16 ::= SEQUENCE { + cause-r16 ENUMERATED { undefined, + assistanceDataNotSupportedByServer, + assistanceDataSupportedButCurrentlyNotAvailableByServer, + notProvidedAssistanceDataNotSupportedByServer, + ... + }, + ... +} + +-- ASN1STOP +-- ASN1START + +NR-DL-TDOA-TargetDeviceErrorCauses-r16 ::= SEQUENCE { + cause-r16 ENUMERATED { undefined, + assistance-data-missing, + unableToMeasureAnyTRP, + attemptedButUnableToMeasureSomeNeighbourTRPs, + thereWereNotEnoughSignalsReceivedForUeBasedDL-TDOA, + locationCalculationAssistanceDataMissing, + ... + }, + ... +} + +-- ASN1STOP +-- ASN1START + +NR-DL-AoD-ProvideAssistanceData-r16 ::= SEQUENCE { + nr-DL-PRS-AssistanceData-r16 NR-DL-PRS-AssistanceData-r16 OPTIONAL, -- Need ON + nr-SelectedDL-PRS-IndexList-r16 NR-SelectedDL-PRS-IndexList-r16 OPTIONAL, -- Need ON + nr-PositionCalculationAssistance-r16 + NR-PositionCalculationAssistance-r16 + OPTIONAL, -- Cond UEB + nr-DL-AoD-Error-r16 NR-DL-AoD-Error-r16 OPTIONAL, -- Need ON + ... +} + +-- ASN1STOP +-- ASN1START + +NR-DL-AoD-RequestAssistanceData-r16 ::= SEQUENCE { + nr-PhysCellID-r16 NR-PhysCellID-r16 OPTIONAL, + nr-AdType-r16 BIT STRING { dl-prs (0), + posCalc (1) } (SIZE (1..8)), + ... +} + +-- ASN1STOP +-- ASN1START + +NR-DL-AoD-ProvideLocationInformation-r16 ::= SEQUENCE { + nr-DL-AoD-SignalMeasurementInformation-r16 + NR-DL-AoD-SignalMeasurementInformation-r16 + OPTIONAL, + nr-dl-AoD-LocationInformation-r16 NR-DL-AoD-LocationInformation-r16 + OPTIONAL, + nr-DL-AoD-Error-r16 NR-DL-AoD-Error-r16 OPTIONAL, + ... +} + +-- ASN1STOP +-- ASN1START + +NR-DL-AoD-SignalMeasurementInformation-r16 ::= SEQUENCE { + nr-DL-AoD-MeasList-r16 NR-DL-AoD-MeasList-r16, + ... +} + +NR-DL-AoD-MeasList-r16 ::= SEQUENCE (SIZE(1..nrMaxTRPs-r16)) OF NR-DL-AoD-MeasElement-r16 + +NR-DL-AoD-MeasElement-r16 ::= SEQUENCE { + dl-PRS-ID-r16 INTEGER (0..255), + nr-PhysCellID-r16 NR-PhysCellID-r16 OPTIONAL, + nr-CellGlobalID-r16 NCGI-r15 OPTIONAL, + nr-ARFCN-r16 ARFCN-ValueNR-r15 OPTIONAL, + nr-DL-PRS-ResourceID-r16 NR-DL-PRS-ResourceID-r16 OPTIONAL, + nr-DL-PRS-ResourceSetID-r16 NR-DL-PRS-ResourceSetID-r16 OPTIONAL, + nr-TimeStamp-r16 NR-TimeStamp-r16, + nr-DL-PRS-RSRP-Result-r16 INTEGER (0..126), + nr-DL-PRS-RxBeamIndex-r16 INTEGER (1..8) OPTIONAL, + nr-DL-AoD-AdditionalMeasurements-r16 + NR-DL-AoD-AdditionalMeasurements-r16 OPTIONAL, + ... +} + +NR-DL-AoD-AdditionalMeasurements-r16 ::= SEQUENCE (SIZE (1..7)) OF + NR-DL-AoD-AdditionalMeasurementElement-r16 + +NR-DL-AoD-AdditionalMeasurementElement-r16 ::= SEQUENCE { + nr-DL-PRS-ResourceID-r16 NR-DL-PRS-ResourceID-r16 OPTIONAL, + nr-DL-PRS-ResourceSetID-r16 NR-DL-PRS-ResourceSetID-r16 OPTIONAL, + nr-TimeStamp-r16 NR-TimeStamp-r16, + nr-DL-PRS-RSRP-ResultDiff-r16 INTEGER (0..30), + nr-DL-PRS-RxBeamIndex-r16 INTEGER (1..8) OPTIONAL, + ... +} + +-- ASN1STOP +-- ASN1START + +NR-DL-AoD-LocationInformation-r16 ::= SEQUENCE { + measurementReferenceTime-r16 CHOICE { + sfn-time-r16 NR-TimeStamp-r16, + utc-time-r16 UTCTime, + ... + } OPTIONAL, + ... +} + +-- ASN1STOP +-- ASN1START + +NR-DL-AoD-RequestLocationInformation-r16 ::= SEQUENCE { + nr-AssistanceAvailability-r16 BOOLEAN, + nr-DL-AoD-ReportConfig-r16 NR-DL-AoD-ReportConfig-r16, + ... +} + +NR-DL-AoD-ReportConfig-r16 ::= SEQUENCE { + maxDL-PRS-RSRP-MeasurementsPerTRP-r16 INTEGER (1..8) OPTIONAL, -- Need ON + ... +} + +-- ASN1STOP +-- ASN1START + +NR-DL-AoD-ProvideCapabilities-r16 ::= SEQUENCE { + nr-DL-AoD-Mode-r16 PositioningModes, + nr-DL-AoD-PRS-Capability-r16 NR-DL-PRS-ResourcesCapability-r16, + nr-DL-AoD-MeasurementCapability-r16 NR-DL-AoD-MeasurementCapability-r16, + nr-DL-PRS-QCL-ProcessingCapability-r16 NR-DL-PRS-QCL-ProcessingCapability-r16, + nr-DL-PRS-ProcessingCapability-r16 NR-DL-PRS-ProcessingCapability-r16, + periodicalReporting-r16 PositioningModes OPTIONAL, + ... +} + +-- ASN1STOP +-- ASN1START + +NR-DL-AoD-MeasurementCapability-r16 ::= SEQUENCE { + maxDL-PRS-RSRP-MeasurementFR1-r16 INTEGER (1..8), + maxDL-PRS-RSRP-MeasurementFR2-r16 INTEGER (1..8), + dl-AoD-MeasCapabilityBandList-r16 SEQUENCE (SIZE (1..nrMaxBands-r16)) OF + DL-AoD-MeasCapabilityPerBand-r16, + ... +} + +DL-AoD-MeasCapabilityPerBand-r16 ::= SEQUENCE { + freqBandIndicatorNR-r16 FreqBandIndicatorNR-r16, + simul-NR-DL-AoD-DL-TDOA-r16 ENUMERATED { supported} OPTIONAL, + simul-NR-DL-AoD-Multi-RTT-r16 ENUMERATED { supported} OPTIONAL, + ... +} + +-- ASN1STOP +-- ASN1START + +NR-DL-AoD-RequestCapabilities-r16 ::= SEQUENCE { + ... +} + +-- ASN1STOP +-- ASN1START + +NR-DL-AoD-Error-r16 ::= CHOICE { + locationServerErrorCauses-r16 NR-DL-AoD-LocationServerErrorCauses-r16, + targetDeviceErrorCauses-r16 NR-DL-AoD-TargetDeviceErrorCauses-r16, + ... +} + +-- ASN1STOP +-- ASN1START + +NR-DL-AoD-LocationServerErrorCauses-r16 ::= SEQUENCE { + cause-r16 ENUMERATED { undefined, + assistanceDataNotSupportedByServer, + assistanceDataSupportedButCurrentlyNotAvailableByServer, + notProvidedAssistanceDataNotSupportedByServer, + ... + }, + ... +} + +-- ASN1STOP +-- ASN1START + +NR-DL-AoD-TargetDeviceErrorCauses-r16 ::= SEQUENCE { + cause-r16 ENUMERATED { undefined, + assistance-data-missing, + unableToMeasureAnyTRP, + attemptedButUnableToMeasureSomeNeighbourTRPs, + thereWereNotEnoughSignalsReceivedForUeBasedDL-AoD, + locationCalculationAssistanceDataMissing, + ... + }, + ... +} + +-- ASN1STOP +-- ASN1START + +NR-Multi-RTT-ProvideAssistanceData-r16 ::= SEQUENCE { + nr-DL-PRS-AssistanceData-r16 NR-DL-PRS-AssistanceData-r16 OPTIONAL, -- Need ON + nr-SelectedDL-PRS-IndexList-r16 NR-SelectedDL-PRS-IndexList-r16 OPTIONAL, -- Need ON + nr-Multi-RTT-Error-r16 NR-Multi-RTT-Error-r16 OPTIONAL, -- Need ON + ... +} + +-- ASN1STOP +-- ASN1START + +NR-Multi-RTT-RequestAssistanceData-r16 ::= SEQUENCE { + nr-PhysCellID-r16 NR-PhysCellID-r16 OPTIONAL, + nr-AdType-r16 BIT STRING { dl-prs (0), + ul-srs (1) } (SIZE (1..8)), + ... +} + +-- ASN1STOP +-- ASN1START + +NR-Multi-RTT-ProvideLocationInformation-r16 ::= SEQUENCE { + nr-Multi-RTT-SignalMeasurementInformation-r16 + NR-Multi-RTT-SignalMeasurementInformation-r16 + OPTIONAL, + nr-Multi-RTT-Error-r16 NR-Multi-RTT-Error-r16 OPTIONAL, + ... +} + +-- ASN1STOP +-- ASN1START + +NR-Multi-RTT-SignalMeasurementInformation-r16 ::= SEQUENCE { + nr-Multi-RTT-MeasList-r16 NR-Multi-RTT-MeasList-r16, + nr-NTA-Offset-r16 ENUMERATED { nTA1, nTA2, nTA3, nTA4, ... } OPTIONAL, + ... +} + +NR-Multi-RTT-MeasList-r16 ::= SEQUENCE (SIZE(1..nrMaxTRPs-r16)) OF NR-Multi-RTT-MeasElement-r16 + +NR-Multi-RTT-MeasElement-r16 ::= SEQUENCE { + dl-PRS-ID-r16 INTEGER (0..255), + nr-PhysCellID-r16 NR-PhysCellID-r16 OPTIONAL, + nr-CellGlobalID-r16 NCGI-r15 OPTIONAL, + nr-ARFCN-r16 ARFCN-ValueNR-r15 OPTIONAL, + nr-DL-PRS-ResourceID-r16 NR-DL-PRS-ResourceID-r16 OPTIONAL, + nr-DL-PRS-ResourceSetID-r16 NR-DL-PRS-ResourceSetID-r16 OPTIONAL, + nr-UE-RxTxTimeDiff-r16 CHOICE { + k0-r16 INTEGER (0..1970049), + k1-r16 INTEGER (0..985025), + k2-r16 INTEGER (0..492513), + k3-r16 INTEGER (0..246257), + k4-r16 INTEGER (0..123129), + k5-r16 INTEGER (0..61565), + ... + }, + nr-AdditionalPathList-r16 NR-AdditionalPathList-r16 OPTIONAL, + nr-TimeStamp-r16 NR-TimeStamp-r16, + nr-TimingQuality-r16 NR-TimingQuality-r16, + nr-DL-PRS-RSRP-Result-r16 INTEGER (0..126) OPTIONAL, + nr-Multi-RTT-AdditionalMeasurements-r16 + NR-Multi-RTT-AdditionalMeasurements-r16 OPTIONAL, + ... +} + +NR-Multi-RTT-AdditionalMeasurements-r16 ::= SEQUENCE (SIZE (1..3)) OF + NR-Multi-RTT-AdditionalMeasurementElement-r16 + +NR-Multi-RTT-AdditionalMeasurementElement-r16 ::= SEQUENCE { + nr-DL-PRS-ResourceID-r16 NR-DL-PRS-ResourceID-r16 OPTIONAL, + nr-DL-PRS-ResourceSetID-r16 NR-DL-PRS-ResourceSetID-r16 OPTIONAL, + nr-DL-PRS-RSRP-ResultDiff-r16 INTEGER (0..61) OPTIONAL, + nr-UE-RxTxTimeDiffAdditional-r16 CHOICE { + k0-r16 INTEGER (0..8191), + k1-r16 INTEGER (0..4095), + k2-r16 INTEGER (0..2047), + k3-r16 INTEGER (0..1023), + k4-r16 INTEGER (0..511), + k5-r16 INTEGER (0..255), + ... + }, + nr-TimingQuality-r16 NR-TimingQuality-r16, + nr-AdditionalPathList-r16 NR-AdditionalPathList-r16 OPTIONAL, + nr-TimeStamp-r16 NR-TimeStamp-r16, + ... +} + +-- ASN1STOP +-- ASN1START + +NR-Multi-RTT-RequestLocationInformation-r16 ::= SEQUENCE { + nr-UE-RxTxTimeDiffMeasurementInfoRequest-r16 + ENUMERATED { true } OPTIONAL, -- Need ON + nr-RequestedMeasurements-r16 BIT STRING { prsrsrpReq(0)} (SIZE(1..8)), + nr-AssistanceAvailability-r16 BOOLEAN, + nr-Multi-RTT-ReportConfig-r16 NR-Multi-RTT-ReportConfig-r16, + additionalPaths-r16 ENUMERATED { requested } OPTIONAL, -- Need ON + ... +} + +NR-Multi-RTT-ReportConfig-r16 ::= SEQUENCE { + maxDL-PRS-RxTxTimeDiffMeasPerTRP-r16 INTEGER (1..4) OPTIONAL, -- Need ON + timingReportingGranularityFactor-r16 INTEGER (0..5) OPTIONAL -- Need ON +} + +-- ASN1STOP +-- ASN1START + +NR-Multi-RTT-ProvideCapabilities-r16 ::= SEQUENCE { + nr-Multi-RTT-PRS-Capability-r16 NR-DL-PRS-ResourcesCapability-r16, + nr-Multi-RTT-MeasurementCapability-r16 NR-Multi-RTT-MeasurementCapability-r16, + nr-DL-PRS-QCL-ProcessingCapability-r16 NR-DL-PRS-QCL-ProcessingCapability-r16, + nr-DL-PRS-ProcessingCapability-r16 NR-DL-PRS-ProcessingCapability-r16, + nr-UL-SRS-Capability-r16 NR-UL-SRS-Capability-r16, + additionalPathsReport-r16 ENUMERATED { supported } OPTIONAL, + periodicalReporting-r16 ENUMERATED { supported } OPTIONAL, + ... +} + +-- ASN1STOP +-- ASN1START + +NR-Multi-RTT-MeasurementCapability-r16 ::= SEQUENCE { + maxNrOfRx-TX-MeasFR1-r16 INTEGER (1..4) OPTIONAL, + maxNrOfRx-TX-MeasFR2-r16 INTEGER (1..4) OPTIONAL, + supportOfRSRP-MeasFR1-r16 ENUMERATED { supported} OPTIONAL, + supportOfRSRP-MeasFR2-r16 ENUMERATED { supported} OPTIONAL, + srs-AssocPRS-MultiLayersFR1-r16 ENUMERATED { supported} OPTIONAL, + srs-AssocPRS-MultiLayersFR2-r16 ENUMERATED { supported} OPTIONAL, + ... +} + +-- ASN1STOP +-- ASN1START + +NR-Multi-RTT-RequestCapabilities-r16 ::= SEQUENCE { + ... +} + +-- ASN1STOP +-- ASN1START + +NR-Multi-RTT-Error-r16 ::= CHOICE { + locationServerErrorCauses-r16 NR-Multi-RTT-LocationServerErrorCauses-r16, + targetDeviceErrorCauses-r16 NR-Multi-RTT-TargetDeviceErrorCauses-r16, + ... +} + +-- ASN1STOP +-- ASN1START + +NR-Multi-RTT-LocationServerErrorCauses-r16 ::= SEQUENCE { + cause-r16 ENUMERATED { undefined, + assistanceDataNotSupportedByServer, + assistanceDataSupportedButCurrentlyNotAvailableByServer, + ... + }, + ... +} + +-- ASN1STOP +-- ASN1START + +NR-Multi-RTT-TargetDeviceErrorCauses-r16 ::= SEQUENCE { + cause-r16 ENUMERATED { undefined, + dl-assistance-data-missing, + unableToMeasureAnyTRP, + attemptedButUnableToMeasureSomeNeighbourTRPs, + ul-srs-configuration-missing, + unableToTransmit-ul-srs, + ... + }, + ... +} + +-- ASN1STOP +-- ASN1START + +maxEARFCN INTEGER ::= 65535 -- Maximum value of EUTRA carrier frequency +maxEARFCN-Plus1 INTEGER ::= 65536 -- Lowest value extended EARFCN range +maxEARFCN2 INTEGER ::= 262143 -- Highest value extended EARFCN range + +maxMBS-r14 INTEGER ::= 64 +maxWLAN-AP-r13 INTEGER ::= 64 +maxKnownAPs-r14 INTEGER ::= 2048 +maxVisibleAPs-r14 INTEGER ::= 32 +maxWLAN-AP-r14 INTEGER ::= 128 +maxWLAN-DataSets-r14 INTEGER ::= 8 + +maxBT-Beacon-r13 INTEGER ::= 32 + +nrMaxBands-r16 INTEGER ::= 1024 -- Maximum number of supported bands in + -- UE capability. +nrMaxFreqLayers-r16 INTEGER ::= 4 -- Max freq layers +nrMaxFreqLayers-1-r16 INTEGER ::= 3 +nrMaxNumDL-PRS-ResourcesPerSet-1-r16 INTEGER ::= 63 +nrMaxNumDL-PRS-ResourceSetsPerTRP-1-r16 INTEGER ::= 7 +nrMaxResourceIDs-r16 INTEGER ::= 64 -- Max Resource IDs +nrMaxResourceOffsetValue-1-r16 INTEGER ::= 511 +nrMaxResourcesPerSet-r16 INTEGER ::= 64 -- Maximum resources for one set +nrMaxSetsPerTrpPerFreqLayer-r16 INTEGER ::= 2 -- Maximum resource sets for one TRP +nrMaxSetsPerTrpPerFreqLayer-1-r16 INTEGER ::= 1 +nrMaxTRPs-r16 INTEGER ::= 256 -- Max TRPs per UE +nrMaxTRPsPerFreq-r16 INTEGER ::= 64 -- Max TRPs per freq layers +nrMaxTRPsPerFreq-1-r16 INTEGER ::= 63 +maxSimultaneousBands-r16 INTEGER ::= 4 -- Maximum number of simultaneously + -- measured bands +maxBandComb-r16 INTEGER ::= 1024 +nrMaxConfiguredBands-r16 INTEGER ::= 16 + +-- ASN1STOP +-- ASN1START + +END + +-- ASN1STOP +-- ASN1START + +LPP-Broadcast-Definitions + +DEFINITIONS AUTOMATIC TAGS ::= + +BEGIN + +IMPORTS + OTDOA-ReferenceCellInfo, + OTDOA-NeighbourCellInfoList, + NR-TRP-LocationInfo-r16, + NR-DL-PRS-BeamInfo-r16, + NR-RTD-Info-r16 +FROM LPP-PDU-Definitions; + +-- ASN1STOP +-- ASN1START + +AssistanceDataSIBelement-r15 ::= SEQUENCE { + valueTag-r15 INTEGER (0..63) OPTIONAL, -- Need OP + expirationTime-r15 UTCTime OPTIONAL, -- Need OP + cipheringKeyData-r15 CipheringKeyData-r15 OPTIONAL, -- Need OP + segmentationInfo-r15 SegmentationInfo-r15 OPTIONAL, -- Need OP + assistanceDataElement-r15 OCTET STRING, + ... +} + +CipheringKeyData-r15 ::= SEQUENCE { + cipherSetID-r15 INTEGER (0..65535), + d0-r15 BIT STRING (SIZE (1..128)), + ... +} + +SegmentationInfo-r15 ::= SEQUENCE { + segmentationOption-r15 ENUMERATED {pseudo-seg, octet-string-seg}, + assistanceDataSegmentType-r15 ENUMERATED {notLastSegment, lastSegment}, + assistanceDataSegmentNumber-r15 INTEGER (0..63), + ... +} + +-- ASN1STOP +-- ASN1START + +OTDOA-UE-Assisted-r15 ::= SEQUENCE { + otdoa-ReferenceCellInfo-r15 OTDOA-ReferenceCellInfo, + otdoa-NeighbourCellInfo-r15 OTDOA-NeighbourCellInfoList, + ... +} + +-- ASN1STOP +-- ASN1START + +NR-UEB-TRP-LocationData-r16 ::= SEQUENCE { + nr-trp-LocationInfo-r16 NR-TRP-LocationInfo-r16, + nr-dl-prs-BeamInfo-r16 NR-DL-PRS-BeamInfo-r16 OPTIONAL, -- Need ON + ... +} + +-- ASN1STOP +-- ASN1START + +NR-UEB-TRP-RTD-Info-r16 ::= SEQUENCE { + nr-rtd-Info-r16 NR-RTD-Info-r16, + ... +} + +-- ASN1STOP +-- ASN1START + +END + +-- ASN1STOP From 910912a443118adc30dbf413043501b8b79a99e6 Mon Sep 17 00:00:00 2001 From: ahadi Date: Fri, 10 Dec 2021 11:14:09 +0100 Subject: [PATCH 021/135] adding prs structure --- openair1/PHY/NR_TRANSPORT/nr_prs.c | 23 +++++++---------- openair1/SCHED_NR/phy_procedures_nr_gNB.c | 31 ++++++++++------------- 2 files changed, 22 insertions(+), 32 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_prs.c b/openair1/PHY/NR_TRANSPORT/nr_prs.c index eba6be157a..3e2cee2e7b 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_prs.c +++ b/openair1/PHY/NR_TRANSPORT/nr_prs.c @@ -28,36 +28,31 @@ int nr_generate_prs(uint32_t **nr_gold_prs, int k_prime = 0; int k=0; int16_t mod_prs[NR_MAX_PRS_LENGTH<<1]; - uint8_t idx=0; - uint8_t combSize = 6; - uint8_t REOffset = 0; - uint8_t symbolStart = 5; - uint8_t NumPRSSymbols = 6; - uint16_t NumPRBs = 106; + uint8_t idx=prs_data->NPRSID; // QPSK modulation // PRS resource mapping with combsize=k which means PRS symbols exist in every k-th subcarrier in frequency domain // According to ts138.211 sec.7.4.1.7.2 - for (int l = symbolStart; l < symbolStart + NumPRSSymbols; l++) { + for (int l = prs_data->SymbolStart; l < prs_data->SymbolStart + prs_data->NumPRSSymbols; l++) { int symInd = l-5; - if (combSize==2) { + if (prs_data->CombSize == 2) { k_prime = k_prime_table[0][symInd]; } - else if (combSize==4){ + else if (prs_data->CombSize == 4){ k_prime = k_prime_table[1][symInd]; } - else if (combSize==6){ + else if (prs_data->CombSize == 6){ k_prime = k_prime_table[2][symInd]; } - else if (combSize==12){ + else if (prs_data->CombSize == 12){ k_prime = k_prime_table[3][symInd]; } - k = (REOffset+k_prime)%combSize + frame_parms->ssb_start_subcarrier; - for (int m = 0; m < 12/combSize*NumPRBs; m++) { + k = (prs_data->REOffset+k_prime) % prs_data->CombSize + frame_parms->ssb_start_subcarrier; + for (int m = 0; m < 12/prs_data->CombSize * prs_data->NumRB; m++) { #ifdef DEBUG_PRS_MAP printf("m %d at k %d of l %d\n", m, k, l); @@ -81,7 +76,7 @@ int nr_generate_prs(uint32_t **nr_gold_prs, ((int16_t *)txdataF)[((l*frame_parms->ofdm_symbol_size + k)<<1)+1]); #endif - k = k + combSize; + k = k + prs_data->CombSize; if (k >= frame_parms->ofdm_symbol_size) k-=frame_parms->ofdm_symbol_size; diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index 8288bb9d51..b771a9234d 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -148,22 +148,6 @@ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB, // defining inputs and initials for nr_generate_prs() int **txdataF = gNB->common_vars.txdataF; - uint8_t ssb_index,n_hf; - ssb_index = ssb_pdu.ssb_pdu_rel15.SsbBlockIndex; - LOG_D(PHY,"common_signal_procedures: frame %d, slot %d ssb index %d\n",frame,slot,ssb_index); - - uint16_t ssb_start_symbol; - int ssb_start_symbol_abs = nr_get_ssb_start_symbol(fp,ssb_index); // computing the starting symbol for current ssb - ssb_start_symbol = ssb_start_symbol_abs % fp->symbols_per_slot; // start symbol wrt slot - - - - uint16_t slots_per_hf = (fp->slots_per_frame)>>1; - - if (slotcell_config.frame_duplex_type.value == TDD) && @@ -242,8 +226,19 @@ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB, //TODO: nr_generate_prs // check if we have prs to transmit in this frame and slot prs_data_t prs_data; - prs_data.PRSResourceSetPeriod[0]=0; - prs_data.PRSResourceSetPeriod[1]=0; + prs_data.PRSResourceSetPeriod[0]=40; // PRS resource slot period + prs_data.PRSResourceSetPeriod[1]=0; // resource slot offset + prs_data.SymbolStart=5; + prs_data.NumPRSSymbols=6; + prs_data.NumRB=106; + prs_data.RBOffset=0; + prs_data.CombSize=6; + prs_data.REOffset=0; + prs_data.PRSResourceOffset=0; + prs_data.PRSResourceRepetition=1; + prs_data.PRSResourceTimeGap=1; + prs_data.NPRSID=0; + // tbc nr_generate_prs(gNB->nr_gold_prs[slot],&txdataF[0][txdataF_offset], AMP, &prs_data, cfg, fp); From ab586bcf3b04dc2290ebe69cbddfd2a87d0d14ad Mon Sep 17 00:00:00 2001 From: ahadi Date: Fri, 10 Dec 2021 15:30:16 +0100 Subject: [PATCH 022/135] debug modulation --- openair1/PHY/NR_TRANSPORT/nr_prs.c | 52 ++++++++++------------- openair1/SCHED_NR/phy_procedures_nr_gNB.c | 17 +++++++- 2 files changed, 38 insertions(+), 31 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_prs.c b/openair1/PHY/NR_TRANSPORT/nr_prs.c index 3e2cee2e7b..ce09751ae8 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_prs.c +++ b/openair1/PHY/NR_TRANSPORT/nr_prs.c @@ -1,12 +1,11 @@ - #include "PHY/defs_gNB.h" #include "PHY/NR_TRANSPORT/nr_transport_proto.h" #include "PHY/LTE_REFSIG/lte_refsig.h" #include "PHY/NR_REFSIG/nr_refsig.h" #include "PHY/sse_intrin.h" -//#define DEBUG_PRS -#define DEBUG_PRS_MAP +#define DEBUG_PRS_MOD +//#define DEBUG_PRS_MAP extern short nr_qpsk_mod_table[8]; @@ -30,7 +29,6 @@ int nr_generate_prs(uint32_t **nr_gold_prs, int16_t mod_prs[NR_MAX_PRS_LENGTH<<1]; uint8_t idx=prs_data->NPRSID; - // QPSK modulation // PRS resource mapping with combsize=k which means PRS symbols exist in every k-th subcarrier in frequency domain // According to ts138.211 sec.7.4.1.7.2 @@ -52,41 +50,37 @@ int nr_generate_prs(uint32_t **nr_gold_prs, } k = (prs_data->REOffset+k_prime) % prs_data->CombSize + frame_parms->ssb_start_subcarrier; - for (int m = 0; m < 12/prs_data->CombSize * prs_data->NumRB; m++) { - -#ifdef DEBUG_PRS_MAP - printf("m %d at k %d of l %d\n", m, k, l); -#endif - + + // QPSK modulation + + for (int m = 0; m < (12/prs_data->CombSize) * prs_data->NumRB; m++) { idx = nr_gold_prs[l][m]; mod_prs[m<<1] = nr_qpsk_mod_table[idx<<1]; mod_prs[(m<<1)+1] = nr_qpsk_mod_table[(idx<<1) + 1]; + + #ifdef DEBUG_PRS_MOD + printf("m %d idx %d gold seq %d mod_prs %d %d\n", m, idx, nr_gold_prs[l][m], mod_prs[(idx<<1)], mod_prs[(idx<<1)+1]); + #endif + + #ifdef DEBUG_PRS_MAP + printf("m %d at k %d of l %d\n", m, k, l); + #endif + + ((int16_t *)txdataF)[(l*frame_parms->ofdm_symbol_size + k)<<1] = (amp * mod_prs[m<<1]) >> 15; + ((int16_t *)txdataF)[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = (amp * mod_prs[(m<<1) + 1]) >> 15; -#ifdef DEBUG_PRS - printf("m %d idx %d gold seq %d mod_prs %d %d\n", m, idx, nr_gold_prs[l][m], mod_prs[(idx<<1)], mod_prs[(idx<<1)+1]); -#endif - - - ((int16_t *)txdataF)[(l*frame_parms->ofdm_symbol_size + k)<<1] = (amp * mod_prs[m<<1]) >> 15; - ((int16_t *)txdataF)[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = (amp * mod_prs[(m<<1) + 1]) >> 15; - -#ifdef DEBUG_PRS_MAP - printf("(%d,%d)\n", + #ifdef DEBUG_PRS_MAP + printf("(%d,%d)\n", ((int16_t *)txdataF)[(l*frame_parms->ofdm_symbol_size + k)<<1], ((int16_t *)txdataF)[((l*frame_parms->ofdm_symbol_size + k)<<1)+1]); -#endif + #endif - k = k + prs_data->CombSize; + k = k + prs_data->CombSize; - if (k >= frame_parms->ofdm_symbol_size) - k-=frame_parms->ofdm_symbol_size; - + if (k >= frame_parms->ofdm_symbol_size) + k-=frame_parms->ofdm_symbol_size; } } return 0; } - - - - diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index b771a9234d..e004c68e49 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -104,8 +104,19 @@ void nr_common_signal_procedures (PHY_VARS_gNB *gNB,int frame,int slot,nfapi_nr_ nr_generate_pbch_dmrs(gNB->nr_gold_pbch_dmrs[0][ssb_index&7],&txdataF[0][txdataF_offset], AMP, ssb_start_symbol, cfg, fp); prs_data_t prs_data; - prs_data.PRSResourceSetPeriod[0]=0; - prs_data.PRSResourceSetPeriod[1]=0; + prs_data.PRSResourceSetPeriod[0]=40; // PRS resource slot period + prs_data.PRSResourceSetPeriod[1]=0; // resource slot offset + prs_data.SymbolStart=5; + prs_data.NumPRSSymbols=6; + prs_data.NumRB=106; + prs_data.RBOffset=0; + prs_data.CombSize=6; + prs_data.REOffset=0; + prs_data.PRSResourceOffset=0; + prs_data.PRSResourceRepetition=1; + prs_data.PRSResourceTimeGap=1; + prs_data.NPRSID=0; + printf(" before Combsize %d \n", prs_data.CombSize); // tbc nr_generate_prs(gNB->nr_gold_prs[slot],&txdataF[0][txdataF_offset], AMP, &prs_data, cfg, fp); @@ -238,10 +249,12 @@ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB, prs_data.PRSResourceRepetition=1; prs_data.PRSResourceTimeGap=1; prs_data.NPRSID=0; + printf(" before %p \n",&prs_data); // tbc nr_generate_prs(gNB->nr_gold_prs[slot],&txdataF[0][txdataF_offset], AMP, &prs_data, cfg, fp); + if (do_meas==1) stop_meas(&gNB->phy_proc_tx); From c40b433a2633051993953f910af127a1ccd3e59f Mon Sep 17 00:00:00 2001 From: ahadi Date: Fri, 10 Dec 2021 16:04:08 +0100 Subject: [PATCH 023/135] update --- openair1/SCHED_NR/phy_procedures_nr_gNB.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index e004c68e49..7f83b62751 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -116,7 +116,7 @@ void nr_common_signal_procedures (PHY_VARS_gNB *gNB,int frame,int slot,nfapi_nr_ prs_data.PRSResourceRepetition=1; prs_data.PRSResourceTimeGap=1; prs_data.NPRSID=0; - printf(" before Combsize %d \n", prs_data.CombSize); + //printf(" before Combsize %d \n", prs_data.CombSize); // tbc nr_generate_prs(gNB->nr_gold_prs[slot],&txdataF[0][txdataF_offset], AMP, &prs_data, cfg, fp); @@ -249,7 +249,7 @@ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB, prs_data.PRSResourceRepetition=1; prs_data.PRSResourceTimeGap=1; prs_data.NPRSID=0; - printf(" before %p \n",&prs_data); + //printf(" before %p \n",&prs_data); // tbc From cd80a89daa074456b6835dede0f2465fd2d006bd Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Fri, 10 Dec 2021 16:15:23 +0100 Subject: [PATCH 024/135] fixing a bug in the modulation --- openair1/PHY/NR_TRANSPORT/nr_prs.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_prs.c b/openair1/PHY/NR_TRANSPORT/nr_prs.c index ce09751ae8..1003b2b782 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_prs.c +++ b/openair1/PHY/NR_TRANSPORT/nr_prs.c @@ -54,12 +54,12 @@ int nr_generate_prs(uint32_t **nr_gold_prs, // QPSK modulation for (int m = 0; m < (12/prs_data->CombSize) * prs_data->NumRB; m++) { - idx = nr_gold_prs[l][m]; + idx = (((nr_gold_prs[l][(m<<1)>>5])>>((m<<1)&0x1f))&3); mod_prs[m<<1] = nr_qpsk_mod_table[idx<<1]; mod_prs[(m<<1)+1] = nr_qpsk_mod_table[(idx<<1) + 1]; - #ifdef DEBUG_PRS_MOD - printf("m %d idx %d gold seq %d mod_prs %d %d\n", m, idx, nr_gold_prs[l][m], mod_prs[(idx<<1)], mod_prs[(idx<<1)+1]); +#ifdef DEBUG_PRS_MOD + printf("m %d idx %d gold seq %d mod_prs %d %d\n", m, idx, nr_gold_prs[l][(m<<1)>>5], mod_prs[m<<1], mod_prs[(m<<1)+1]); #endif #ifdef DEBUG_PRS_MAP From c63960c0f27ec7b51037f65950c0a17ee1fd27be Mon Sep 17 00:00:00 2001 From: ahadi Date: Mon, 13 Dec 2021 14:04:57 +0100 Subject: [PATCH 025/135] update debugger --- openair1/PHY/NR_TRANSPORT/nr_prs.c | 26 +++++++++++------------ openair1/SCHED_NR/phy_procedures_nr_gNB.c | 5 ----- 2 files changed, 13 insertions(+), 18 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_prs.c b/openair1/PHY/NR_TRANSPORT/nr_prs.c index 1003b2b782..373c1f3ed8 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_prs.c +++ b/openair1/PHY/NR_TRANSPORT/nr_prs.c @@ -4,8 +4,8 @@ #include "PHY/NR_REFSIG/nr_refsig.h" #include "PHY/sse_intrin.h" -#define DEBUG_PRS_MOD -//#define DEBUG_PRS_MAP +//#define DEBUG_PRS_MOD +#define DEBUG_PRS_MAP extern short nr_qpsk_mod_table[8]; @@ -59,21 +59,21 @@ int nr_generate_prs(uint32_t **nr_gold_prs, mod_prs[(m<<1)+1] = nr_qpsk_mod_table[(idx<<1) + 1]; #ifdef DEBUG_PRS_MOD - printf("m %d idx %d gold seq %d mod_prs %d %d\n", m, idx, nr_gold_prs[l][(m<<1)>>5], mod_prs[m<<1], mod_prs[(m<<1)+1]); - #endif +printf("m %d idx %d gold seq %d mod_prs %d %d\n", m, idx, nr_gold_prs[l][(m<<1)>>5], mod_prs[m<<1], mod_prs[(m<<1)+1]); +#endif - #ifdef DEBUG_PRS_MAP - printf("m %d at k %d of l %d\n", m, k, l); - #endif +#ifdef DEBUG_PRS_MAP +printf("m %d at k %d of l %d\n", m, k, l); +#endif ((int16_t *)txdataF)[(l*frame_parms->ofdm_symbol_size + k)<<1] = (amp * mod_prs[m<<1]) >> 15; ((int16_t *)txdataF)[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = (amp * mod_prs[(m<<1) + 1]) >> 15; - #ifdef DEBUG_PRS_MAP - printf("(%d,%d)\n", - ((int16_t *)txdataF)[(l*frame_parms->ofdm_symbol_size + k)<<1], - ((int16_t *)txdataF)[((l*frame_parms->ofdm_symbol_size + k)<<1)+1]); - #endif +#ifdef DEBUG_PRS_MAP +printf("(%d,%d)\n", +((int16_t *)txdataF)[(l*frame_parms->ofdm_symbol_size + k)<<1], +((int16_t *)txdataF)[((l*frame_parms->ofdm_symbol_size + k)<<1)+1]); +#endif k = k + prs_data->CombSize; @@ -81,6 +81,6 @@ int nr_generate_prs(uint32_t **nr_gold_prs, k-=frame_parms->ofdm_symbol_size; } } - +LOG_M("nr_prs.m", "prs",(int16_t *)&txdataF[0],frame_parms->samples_per_slot_wCP, 1, 1); return 0; } diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index 7f83b62751..3e5f3fd79f 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -94,8 +94,6 @@ void nr_common_signal_procedures (PHY_VARS_gNB *gNB,int frame,int slot,nfapi_nr_ nr_generate_pss(gNB->d_pss, &txdataF[0][txdataF_offset], AMP, ssb_start_symbol, cfg, fp); nr_generate_sss(gNB->d_sss, &txdataF[0][txdataF_offset], AMP, ssb_start_symbol, cfg, fp); - //nr_generate_prs(gNB->nr_gold_prs[n_hf][ssb_index&7],&txdataF[0][txdataF_offset], AMP, ssb_start_symbol, cfg, fp); - if (cfg->carrier_config.num_tx_ant.value <= 4) nr_generate_pbch_dmrs(gNB->nr_gold_pbch_dmrs[n_hf][ssb_index&7],&txdataF[0][txdataF_offset], AMP, ssb_start_symbol, cfg, fp); @@ -116,8 +114,6 @@ void nr_common_signal_procedures (PHY_VARS_gNB *gNB,int frame,int slot,nfapi_nr_ prs_data.PRSResourceRepetition=1; prs_data.PRSResourceTimeGap=1; prs_data.NPRSID=0; - //printf(" before Combsize %d \n", prs_data.CombSize); - // tbc nr_generate_prs(gNB->nr_gold_prs[slot],&txdataF[0][txdataF_offset], AMP, &prs_data, cfg, fp); @@ -249,7 +245,6 @@ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB, prs_data.PRSResourceRepetition=1; prs_data.PRSResourceTimeGap=1; prs_data.NPRSID=0; - //printf(" before %p \n",&prs_data); // tbc From 5339b3529015e072866598995926ad0231e7e164 Mon Sep 17 00:00:00 2001 From: ahadi Date: Fri, 7 Jan 2022 11:13:32 +0100 Subject: [PATCH 026/135] "update" --- openair1/SCHED_NR/phy_procedures_nr_gNB.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index 3e5f3fd79f..1fbacc6e19 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -106,7 +106,7 @@ void nr_common_signal_procedures (PHY_VARS_gNB *gNB,int frame,int slot,nfapi_nr_ prs_data.PRSResourceSetPeriod[1]=0; // resource slot offset prs_data.SymbolStart=5; prs_data.NumPRSSymbols=6; - prs_data.NumRB=106; + prs_data.NumRB=273; prs_data.RBOffset=0; prs_data.CombSize=6; prs_data.REOffset=0; @@ -237,7 +237,7 @@ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB, prs_data.PRSResourceSetPeriod[1]=0; // resource slot offset prs_data.SymbolStart=5; prs_data.NumPRSSymbols=6; - prs_data.NumRB=106; + prs_data.NumRB=273; prs_data.RBOffset=0; prs_data.CombSize=6; prs_data.REOffset=0; From aa73030ecc2ae2eaca512f03e708fe0cda20d7ea Mon Sep 17 00:00:00 2001 From: ahadi Date: Fri, 7 Jan 2022 16:10:50 +0100 Subject: [PATCH 027/135] "update prs start symbol" --- openair1/SCHED_NR/phy_procedures_nr_gNB.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index 1fbacc6e19..eb1a5d5c9f 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -104,7 +104,7 @@ void nr_common_signal_procedures (PHY_VARS_gNB *gNB,int frame,int slot,nfapi_nr_ prs_data_t prs_data; prs_data.PRSResourceSetPeriod[0]=40; // PRS resource slot period prs_data.PRSResourceSetPeriod[1]=0; // resource slot offset - prs_data.SymbolStart=5; + prs_data.SymbolStart=7; prs_data.NumPRSSymbols=6; prs_data.NumRB=273; prs_data.RBOffset=0; From d9b4089f805092cca8cf1f345e8f9890f4079364 Mon Sep 17 00:00:00 2001 From: ahadi Date: Mon, 10 Jan 2022 08:52:24 +0100 Subject: [PATCH 028/135] "minor fixes in nr_prs.c" --- openair1/PHY/NR_TRANSPORT/nr_prs.c | 6 ++++-- openair1/SCHED_NR/phy_procedures_nr_gNB.c | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_prs.c b/openair1/PHY/NR_TRANSPORT/nr_prs.c index 373c1f3ed8..c31a4638b5 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_prs.c +++ b/openair1/PHY/NR_TRANSPORT/nr_prs.c @@ -35,7 +35,7 @@ int nr_generate_prs(uint32_t **nr_gold_prs, for (int l = prs_data->SymbolStart; l < prs_data->SymbolStart + prs_data->NumPRSSymbols; l++) { - int symInd = l-5; + int symInd = l-prs_data->SymbolStart; if (prs_data->CombSize == 2) { k_prime = k_prime_table[0][symInd]; } @@ -49,7 +49,9 @@ int nr_generate_prs(uint32_t **nr_gold_prs, k_prime = k_prime_table[3][symInd]; } - k = (prs_data->REOffset+k_prime) % prs_data->CombSize + frame_parms->ssb_start_subcarrier; + k = (prs_data->REOffset+k_prime) % prs_data->CombSize ; + //+ frame_parms->ssb_start_subcarrier; + // QPSK modulation diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index eb1a5d5c9f..e1dd2b807b 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -235,7 +235,7 @@ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB, prs_data_t prs_data; prs_data.PRSResourceSetPeriod[0]=40; // PRS resource slot period prs_data.PRSResourceSetPeriod[1]=0; // resource slot offset - prs_data.SymbolStart=5; + prs_data.SymbolStart=7; prs_data.NumPRSSymbols=6; prs_data.NumRB=273; prs_data.RBOffset=0; From b48ffa73e47a3a35d0555a4a9e2123ffd2fb3379 Mon Sep 17 00:00:00 2001 From: ahadi Date: Mon, 10 Jan 2022 09:51:49 +0100 Subject: [PATCH 029/135] adding first_carrier_offset to subcarrier ind --- openair1/PHY/NR_TRANSPORT/nr_prs.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_prs.c b/openair1/PHY/NR_TRANSPORT/nr_prs.c index c31a4638b5..d3b525322b 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_prs.c +++ b/openair1/PHY/NR_TRANSPORT/nr_prs.c @@ -49,7 +49,7 @@ int nr_generate_prs(uint32_t **nr_gold_prs, k_prime = k_prime_table[3][symInd]; } - k = (prs_data->REOffset+k_prime) % prs_data->CombSize ; + k = (prs_data->REOffset+k_prime) % prs_data->CombSize + frame_parms->first_carrier_offset ; //+ frame_parms->ssb_start_subcarrier; @@ -84,5 +84,7 @@ printf("(%d,%d)\n", } } LOG_M("nr_prs.m", "prs",(int16_t *)&txdataF[0],frame_parms->samples_per_slot_wCP, 1, 1); +printf("first carrier offset: %d \n",frame_parms->first_carrier_offset); + return 0; } From 800a8268a3a084823ebc5fe9c7c8259dc75af9ea Mon Sep 17 00:00:00 2001 From: ahadi Date: Mon, 10 Jan 2022 16:02:32 +0100 Subject: [PATCH 030/135] "update" --- openair1/PHY/NR_TRANSPORT/nr_prs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_prs.c b/openair1/PHY/NR_TRANSPORT/nr_prs.c index d3b525322b..2d4e06a502 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_prs.c +++ b/openair1/PHY/NR_TRANSPORT/nr_prs.c @@ -50,7 +50,7 @@ int nr_generate_prs(uint32_t **nr_gold_prs, } k = (prs_data->REOffset+k_prime) % prs_data->CombSize + frame_parms->first_carrier_offset ; - //+ frame_parms->ssb_start_subcarrier; + // QPSK modulation From 6fc416797c06dbe1c82e9c32a6fcc6faaefb9e0e Mon Sep 17 00:00:00 2001 From: Sagar Parsawar Date: Wed, 19 Jan 2022 10:21:30 +0100 Subject: [PATCH 031/135] Initial NR PRS UE Channel estimation changes integrated to NR_PBCHSim --- openair1/PHY/INIT/nr_init_ue.c | 26 +++ openair1/PHY/NR_REFSIG/nr_gold_ue.c | 36 +++++ openair1/PHY/NR_REFSIG/refsig_defs_ue.h | 2 + openair1/PHY/NR_TRANSPORT/nr_prs.c | 4 +- .../nr_dl_channel_estimation.c | 151 +++++++++++++++++- openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h | 5 + openair1/PHY/defs_gNB.h | 19 +-- openair1/PHY/defs_nr_UE.h | 7 +- openair1/PHY/defs_nr_common.h | 19 ++- openair1/SCHED_NR/phy_procedures_nr_gNB.c | 4 +- openair1/SCHED_NR_UE/phy_procedures_nr_ue.c | 2 + openair1/SIMULATION/NR_PHY/pbchsim.c | 27 +++- 12 files changed, 273 insertions(+), 29 deletions(-) diff --git a/openair1/PHY/INIT/nr_init_ue.c b/openair1/PHY/INIT/nr_init_ue.c index b60e77e814..9ecf19777c 100644 --- a/openair1/PHY/INIT/nr_init_ue.c +++ b/openair1/PHY/INIT/nr_init_ue.c @@ -194,6 +194,22 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, /////////// //////////////////////////////////////////////////////////////////////////////////////////// + //PRS init + ue->nr_gold_prs = (uint32_t ***)malloc16(fp->slots_per_frame*sizeof(uint32_t **)); + uint32_t ***prs = ue->nr_gold_prs; + AssertFatal(prs!=NULL, "NR UE init: positioning reference signal malloc failed\n"); + + for (int slot=0; slotslots_per_frame; slot++) { + prs[slot] = (uint32_t **)malloc16(fp->symbols_per_slot*sizeof(uint32_t *)); + AssertFatal(prs[slot]!=NULL, "NR UE init: positioning reference signal for slot %d - malloc failed\n", slot); + + for (int symb=0; symbsymbols_per_slot; symb++) { + prs[slot][symb] = (uint32_t *)malloc16(NR_MAX_PRS_INIT_LENGTH_DWORD*sizeof(uint32_t)); + AssertFatal(prs[slot][symb]!=NULL, "NR UE init: positioning reference signal for slot %d symbol %d - malloc failed\n", slot, symb); + } + } + nr_gold_prs(ue); + /////////////////////////PUSCH DMRS init///////////////////////// /////////// ue->nr_gold_pusch_dmrs = (uint32_t ****)malloc16(fp->slots_per_frame*sizeof(uint32_t ***)); @@ -319,6 +335,16 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, prach_vars[gNB_id] = (NR_UE_PRACH *)malloc16_clear(sizeof(NR_UE_PRACH)); pbch_vars[gNB_id] = (NR_UE_PBCH *)malloc16_clear(sizeof(NR_UE_PBCH)); + // PRS channel estimates + ue->prs_ch_estimates = (int32_t **)malloc16( fp->nb_antennas_rx*sizeof(int32_t *) ); + AssertFatal(ue->prs_ch_estimates!=NULL, "NR UE init: PRS channel estimates malloc failed\n"); + + for (i=0; inb_antennas_rx; i++) { + ue->prs_ch_estimates[i] = (int32_t *)malloc16(2*fp->ofdm_symbol_size*NR_MAX_NUM_PRS_SYMB); + AssertFatal(ue->prs_ch_estimates[i]!=NULL, "NR UE init: PRS channel estimates malloc failed %d\n", i); + } + + if (abstraction_flag == 0) { for (th_id=0; th_idpdsch_vars[th_id][gNB_id], fp ); diff --git a/openair1/PHY/NR_REFSIG/nr_gold_ue.c b/openair1/PHY/NR_REFSIG/nr_gold_ue.c index 623b86edfb..f252f8428a 100644 --- a/openair1/PHY/NR_REFSIG/nr_gold_ue.c +++ b/openair1/PHY/NR_REFSIG/nr_gold_ue.c @@ -133,3 +133,39 @@ void nr_init_pusch_dmrs(PHY_VARS_NR_UE* ue, } } } + +void nr_gold_prs(PHY_VARS_NR_UE* ue) +{ + unsigned int x1, x2; + uint16_t Nid; + + fapi_nr_config_request_t *cfg = &ue->nrUE_config; + NR_DL_FRAME_PARMS *fp = &ue->frame_parms; + uint8_t reset; + uint8_t slotNum, symNum; + + Nid = cfg->cell_config.phy_cell_id; + + for (slotNum = 0; slotNum < fp->slots_per_frame; slotNum++) { + for (symNum = 0; symNum < fp->symbols_per_slot ; symNum++) { + reset = 1; + // initial x2 for prs as ts138.211 + uint32_t c_init1, c_init2, c_init3; + uint32_t pow22=1<<22; + uint32_t pow10=1<<10; + c_init1 = pow22*ceil(Nid/1024); + c_init2 = pow10*(slotNum+symNum+1)*(2*(Nid%1024)+1); + c_init3 = Nid%1024; + x2 = c_init1 + c_init2 + c_init3; + + + for (uint8_t n=0; nnr_gold_prs[slotNum][symNum][n] = lte_gold_generic(&x1, &x2, reset); + reset = 0; + //printf("%d \n",gNB->nr_gold_prs[slotNum][symNum][n]); + + } + } + } + +} diff --git a/openair1/PHY/NR_REFSIG/refsig_defs_ue.h b/openair1/PHY/NR_REFSIG/refsig_defs_ue.h index 1fca2be2a1..2552e7b13d 100644 --- a/openair1/PHY/NR_REFSIG/refsig_defs_ue.h +++ b/openair1/PHY/NR_REFSIG/refsig_defs_ue.h @@ -67,4 +67,6 @@ void nr_init_pusch_dmrs(PHY_VARS_NR_UE* ue, uint16_t *N_n_scid, uint8_t n_scid); +void nr_gold_prs(PHY_VARS_NR_UE* ue); + #endif diff --git a/openair1/PHY/NR_TRANSPORT/nr_prs.c b/openair1/PHY/NR_TRANSPORT/nr_prs.c index 2d4e06a502..6326863aad 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_prs.c +++ b/openair1/PHY/NR_TRANSPORT/nr_prs.c @@ -4,7 +4,7 @@ #include "PHY/NR_REFSIG/nr_refsig.h" #include "PHY/sse_intrin.h" -//#define DEBUG_PRS_MOD +#define DEBUG_PRS_MOD #define DEBUG_PRS_MAP extern short nr_qpsk_mod_table[8]; @@ -65,7 +65,7 @@ printf("m %d idx %d gold seq %d mod_prs %d %d\n", m, idx, nr_gold_prs[l][(m<<1)> #endif #ifdef DEBUG_PRS_MAP -printf("m %d at k %d of l %d\n", m, k, l); +printf("m %d at k %d of l %d reIdx %d\n", m, k, l, (l*frame_parms->ofdm_symbol_size + k)<<1); #endif ((int16_t *)txdataF)[(l*frame_parms->ofdm_symbol_size + k)<<1] = (amp * mod_prs[m<<1]) >> 15; 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 8097b9b3ea..e424839dd1 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -28,11 +28,154 @@ #include "PHY/NR_REFSIG/dmrs_nr.h" #include "PHY/NR_REFSIG/ptrs_nr.h" #include "PHY/NR_TRANSPORT/nr_sch_dmrs.h" +#include "PHY/NR_TRANSPORT/nr_transport_proto.h" #include "filt16a_32.h" //#define DEBUG_PDSCH //#define DEBUG_PDCCH +//#define DEBUG_CH +#define DEBUG_PRS_CHEST +extern short nr_qpsk_mod_table[8]; +int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, + UE_nr_rxtx_proc_t *proc, + NR_DL_FRAME_PARMS *frame_params) +{ + // Get K_Prime from the table for the length of PRS or LPRS + int k_prime_table[4][12] = { + {0,1,0,1,0,1,0,1,0,1,0,1}, + {0,2,1,3,0,2,1,3,0,2,1,3}, + {0,3,1,4,2,5,0,3,1,4,2,5}, + {0,6,3,9,1,7,4,10,2,8,5,11}}; + + int32_t **rxdataF = ue->common_vars.common_vars_rx_data_per_thread[proc->thread_id].rxdataF; + uint32_t **nr_gold_prs = ue->nr_gold_prs[proc->nr_slot_rx]; + prs_data_t *prs_cfg = &ue->prs_cfg; + + int16_t *prs_chest, ch[2] = {0}, *rxF, *pil, *fl,*fm,*fr, mod_prs[NR_MAX_PRS_LENGTH<<1]; + int16_t k_prime = 0, k = 0; + uint8_t idx = prs_cfg->NPRSID; + uint8_t rxAnt = 0; // ant 0 rxdataF for now + + printf("Inside nr_prs_channel_estimation proc->thread_id %d, proc->nr_slot_rx %d\n", proc->thread_id, proc->nr_slot_rx); + for(int l = prs_cfg->SymbolStart; l < prs_cfg->SymbolStart+prs_cfg->NumPRSSymbols; l++) + { + int symInd = l-prs_cfg->SymbolStart; + if (prs_cfg->CombSize == 2) { + k_prime = k_prime_table[0][symInd]; + } + else if (prs_cfg->CombSize == 4){ + k_prime = k_prime_table[1][symInd]; + } + else if (prs_cfg->CombSize == 6){ + k_prime = k_prime_table[2][symInd]; + } + else if (prs_cfg->CombSize == 12){ + k_prime = k_prime_table[3][symInd]; + } + + printf("PRS config l %d k_prime %d:\nprs_cfg->SymbolStart %d\nprs_cfg->NumPRSSymbols %d\nprs_cfg->NumRB %d\nprs_cfg->CombSize %d\n", l, k_prime, prs_cfg->SymbolStart, prs_cfg->NumPRSSymbols, prs_cfg->NumRB, prs_cfg->CombSize); + //TODO currently supported only comb_size 2 and 4 + switch (k_prime) { + case 0: + fl = filt16a_l0; + fm = filt16a_m0; + fr = filt16a_r0; + break; + + case 1: + fl = filt16a_l1; + fm = filt16a_m1; + fr = filt16a_r1; + break; + + case 2: + fl = filt16a_l2; + fm = filt16a_m2; + fr = filt16a_r2; + break; + + case 3: + fl = filt16a_l3; + fm = filt16a_m3; + fr = filt16a_r3; + break; + + default: + printf("nr=prs channel_estimation: k_prime=%d -> ERROR\n",k_prime); + return(-1); + break; + } + + //re_offset + k = (prs_cfg->REOffset+k_prime) % prs_cfg->CombSize + frame_params->first_carrier_offset; + + // Pilots generation and modulation + for (int m = 0; m < (12/prs_cfg->CombSize)*prs_cfg->NumRB; m++) + { + idx = (((nr_gold_prs[l][(m<<1)>>5])>>((m<<1)&0x1f))&3); + mod_prs[m<<1] = nr_qpsk_mod_table[idx<<1]; + mod_prs[(m<<1)+1] = nr_qpsk_mod_table[(idx<<1) + 1]; + } + + pil = (int16_t *)&mod_prs[0]; + rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k]; + prs_chest = (int16_t *)&ue->prs_ch_estimates[rxAnt][l*frame_params->ofdm_symbol_size]; + memset(prs_chest,0,4*(ue->frame_parms.ofdm_symbol_size)); + for(int pIdx = 0; pIdx < prs_cfg->NumRB*(12/prs_cfg->CombSize); pIdx+=3) + { + //pilot 0 + ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); + ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); + +#ifdef DEBUG_PRS_CHEST + printf("pilIdx %d at k %d of l %d reIdx %d rxF %d %d ch[0] %d ch[1] %d\n", pIdx, k, l, (l*frame_params->ofdm_symbol_size + k), rxF[0], rxF[1], ch[0], ch[1]); +#endif + + multadd_real_vector_complex_scalar(fl, + ch, + prs_chest, + 16); + + pil +=2; + k = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size; + rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k]; + + //pilot 1 + ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); + ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); + + multadd_real_vector_complex_scalar(fm, + ch, + prs_chest, + 16); + + pil +=2; + k = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size; + rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k]; + + //pilot 2 + ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); + ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); + + multadd_real_vector_complex_scalar(fr, + ch, + prs_chest, + 16); + + pil +=2; + k = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size; + rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k]; + for (int re = 0; re < 12; re++) + printf("prs_ch[%d] %d %d\n", re, prs_chest[re<<1], prs_chest[(re<<1)+1]); + + prs_chest +=24; + } //for m + } //for l + + LOG_M("prsEst.m","prs_chest",&ue->prs_ch_estimates[rxAnt][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], prs_cfg->NumRB*12,1,1 ); + return(0); +} int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, @@ -395,6 +538,10 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue, ch, dl_ch, 16); +#ifdef DEBUG_CH + for (int re = 0; re < 12; re++) + printf("dl_ch[%d] %d %d\n", re, dl_ch[re<<1], dl_ch[(re<<1)+1]); +#endif pil += 2; re_offset = (re_offset+4) % ue->frame_parms.ofdm_symbol_size; rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)]; @@ -485,8 +632,8 @@ int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue, #ifdef DEBUG_PDCCH - printf("PDCCH Channel Estimation : ThreadId %d, gNB_id %d ch_offset %d, OFDM size %d, Ncp=%d, Ns=%d, k=%d symbol %d\n",proc->thread_id, gNB_id,ch_offset,ue->frame_parms.ofdm_symbol_size, - ue->frame_parms.Ncp,Ns,k, symbol); + printf("PDCCH Channel Estimation : ThreadId %d, gNB_id %d ch_offset %d, OFDM size %d, Ncp=%d, Ns=%d, symbol %d\n", + proc->thread_id, gNB_id,ch_offset,ue->frame_parms.ofdm_symbol_size,ue->frame_parms.Ncp,Ns,symbol); #endif fl = filt16a_l1; diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h b/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h index c5330ce2f2..f53ea06348 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h @@ -32,6 +32,11 @@ /*!\brief Timing drift hysterisis in samples*/ #define SYNCH_HYST 2 +/* A function to perform the channel estimation of DL PRS signal */ +int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, + UE_nr_rxtx_proc_t *proc, + NR_DL_FRAME_PARMS *frame_params); + /*! \brief This function performs channel estimation including frequency and temporal interpolation \param ue Pointer to UE PHY variables diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h index 2c8ef9eff6..f8f9d073c5 100644 --- a/openair1/PHY/defs_gNB.h +++ b/openair1/PHY/defs_gNB.h @@ -48,6 +48,7 @@ #define MAX_NUM_RU_PER_gNB MAX_NUM_RU_PER_eNB #define MAX_PUCCH0_NID 8 + typedef struct { int nb_id; int Nid[MAX_PUCCH0_NID]; @@ -779,6 +780,7 @@ typedef struct PHY_VARS_gNB_s { NR_gNB_SCH_STATS_t ulsch_stats[NUMBER_OF_NR_SCH_STATS_MAX]; NR_gNB_UCI_STATS_t uci_stats[NUMBER_OF_NR_UCI_STATS_MAX]; t_nrPolar_params *uci_polarParams; + prs_data_t prs_cfg; uint8_t pbch_configured; char gNB_generate_rar; @@ -949,23 +951,6 @@ typedef struct processingData_L1 { PHY_VARS_gNB *gNB; } processingData_L1_t; -// structures prototype -typedef struct prs { - int PRSResourceSetPeriod[2]; //[slot period, slot offset] - int PRSResourceOffset; // array if more than one resource sets.slot offset (0...511) (default 0) - int PRSResourceRepetition;// slot offset (1 (default), 2, 4, 6, 8, 16, 32) - int PRSResourceTimeGap; // slot offset (1 (default), 2, 4, 6, 8, 16, 32) - int NumRB; //number of RBs in freq domain a scalar =< 275 RB - int NumPRSSymbols; //number of PRS symbols in time domain - int SymbolStart; //starting OFDM symbol of PRS resource in time domain - int RBOffset; //Starting PRB index of all PRS resources in a PRS resource set. - int CombSize; //RE density of all PRS resources in a PRS resource set. i∈{2,4,6,12} - int REOffset; //Starting RE offset in the first OFDM symbol of each PRS resource in a PRS resource set. - int MutingPattern1[2]; //Muting bit pattern option-1, specified as [] or a binary-valued vector of length 2, 4, 6, 8, 16, or 32. - int MutingPattern2[2]; - int MutingBitRepetition; - int NPRSID; -} prs_data_t; #endif diff --git a/openair1/PHY/defs_nr_UE.h b/openair1/PHY/defs_nr_UE.h index 33322bccb2..a8ccc0e3a1 100644 --- a/openair1/PHY/defs_nr_UE.h +++ b/openair1/PHY/defs_nr_UE.h @@ -823,7 +823,8 @@ typedef struct { NR_UE_DLSCH_t *dlsch_ra[NUMBER_OF_CONNECTED_gNB_MAX]; NR_UE_DLSCH_t *dlsch_p[NUMBER_OF_CONNECTED_gNB_MAX]; NR_UE_DLSCH_t *dlsch_MCH[NUMBER_OF_CONNECTED_gNB_MAX]; - + prs_data_t prs_cfg; + //Paging parameters uint32_t IMSImod1024; uint32_t PF; @@ -845,6 +846,7 @@ typedef struct { #endif + int32_t **prs_ch_estimates; /// PBCH DMRS sequence uint32_t nr_gold_pbch[2][64][NR_PBCH_DMRS_LENGTH_DWORD]; @@ -864,6 +866,9 @@ typedef struct { /// PUSCH DMRS sequence uint32_t ****nr_gold_pusch_dmrs; + // PRS sequence + uint32_t ***nr_gold_prs; + uint32_t X_u[64][839]; diff --git a/openair1/PHY/defs_nr_common.h b/openair1/PHY/defs_nr_common.h index 7b914db921..12f4478867 100644 --- a/openair1/PHY/defs_nr_common.h +++ b/openair1/PHY/defs_nr_common.h @@ -82,6 +82,7 @@ #define NR_MAX_PRS_LENGTH 3264 //272*6(max allocation per RB)*2(QPSK) #define NR_MAX_PRS_INIT_LENGTH_DWORD 102 // ceil(NR_MAX_CSI_RS_LENGTH/32) +#define NR_MAX_NUM_PRS_SYMB 12 #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 @@ -372,7 +373,23 @@ struct NR_DL_FRAME_PARMS { uint32_t ofdm_offset_divisor; }; - +// PRS structures prototype +typedef struct prs { + int PRSResourceSetPeriod[2]; //[slot period, slot offset] + int PRSResourceOffset; // array if more than one resource sets.slot offset (0...511) (default 0) + int PRSResourceRepetition;// slot offset (1 (default), 2, 4, 6, 8, 16, 32) + int PRSResourceTimeGap; // slot offset (1 (default), 2, 4, 6, 8, 16, 32) + int NumRB; //number of RBs in freq domain a scalar =< 275 RB + int NumPRSSymbols; //number of PRS symbols in time domain + int SymbolStart; //starting OFDM symbol of PRS resource in time domain + int RBOffset; //Starting PRB index of all PRS resources in a PRS resource set. + int CombSize; //RE density of all PRS resources in a PRS resource set. i∈{2,4,6,12} + int REOffset; //Starting RE offset in the first OFDM symbol of each PRS resource in a PRS resource set. + int MutingPattern1[2]; //Muting bit pattern option-1, specified as [] or a binary-valued vector of length 2, 4, 6, 8, 16, or 32. + int MutingPattern2[2]; + int MutingBitRepetition; + int NPRSID; +} prs_data_t; #define KHz (1000UL) #define MHz (1000*KHz) diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index e1dd2b807b..20a4672caf 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -108,7 +108,7 @@ void nr_common_signal_procedures (PHY_VARS_gNB *gNB,int frame,int slot,nfapi_nr_ prs_data.NumPRSSymbols=6; prs_data.NumRB=273; prs_data.RBOffset=0; - prs_data.CombSize=6; + prs_data.CombSize=4; prs_data.REOffset=0; prs_data.PRSResourceOffset=0; prs_data.PRSResourceRepetition=1; @@ -239,7 +239,7 @@ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB, prs_data.NumPRSSymbols=6; prs_data.NumRB=273; prs_data.RBOffset=0; - prs_data.CombSize=6; + prs_data.CombSize=4; prs_data.REOffset=0; prs_data.PRSResourceOffset=0; prs_data.PRSResourceRepetition=1; diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c index 4e47eb2865..3908373891 100644 --- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c +++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c @@ -1716,6 +1716,8 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue, #if UE_TIMING_TRACE stop_meas(&ue->dlsch_channel_estimation_stats); #endif + //PRS channel estimation + nr_prs_channel_estimation(ue,proc,fp); } nr_ue_rsrp_measurements(ue, gNB_id, proc, nr_slot_rx, 0); diff --git a/openair1/SIMULATION/NR_PHY/pbchsim.c b/openair1/SIMULATION/NR_PHY/pbchsim.c index 46b42666b5..edf39cee82 100644 --- a/openair1/SIMULATION/NR_PHY/pbchsim.c +++ b/openair1/SIMULATION/NR_PHY/pbchsim.c @@ -722,16 +722,35 @@ int main(int argc, char **argv) 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); - int ssb_slot = (UE->symbol_offset/14)+(n_hf*(frame_parms->slots_per_frame>>1)); - for (int i=UE->symbol_offset+1; isymbol_offset+4; i++) { + int ssb_slot = (UE->symbol_offset/14)+(n_hf*(frame_parms->slots_per_frame>>1)); + + for(int j = 0; j < frame_parms->symbols_per_slot; j++) + { nr_slot_fep(UE, &proc, - i%frame_parms->symbols_per_slot, + j%frame_parms->symbols_per_slot, ssb_slot); + } + for (int i=UE->symbol_offset+1; isymbol_offset+4; i++) { 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); + } - } + UE->prs_cfg.PRSResourceSetPeriod[0]=40; // PRS resource slot period + UE->prs_cfg.PRSResourceSetPeriod[1]=0; // resource slot offset + UE->prs_cfg.SymbolStart=7; + UE->prs_cfg.NumPRSSymbols=6; + UE->prs_cfg.NumRB=273; + UE->prs_cfg.RBOffset=0; + UE->prs_cfg.CombSize=4; + UE->prs_cfg.REOffset=0; + UE->prs_cfg.PRSResourceOffset=0; + UE->prs_cfg.PRSResourceRepetition=1; + UE->prs_cfg.PRSResourceTimeGap=1; + UE->prs_cfg.NPRSID=0; + + //PRS channel estimation + nr_prs_channel_estimation(UE,&proc,frame_parms); ret = nr_rx_pbch(UE, &proc, From 4d18f5613963cb029392dd473d8fd69c73535a74 Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Fri, 21 Jan 2022 11:44:10 +0100 Subject: [PATCH 032/135] adding channel models to pbchsim --- openair1/SIMULATION/NR_PHY/pbchsim.c | 41 ++++++++++++++++++++++------ 1 file changed, 32 insertions(+), 9 deletions(-) diff --git a/openair1/SIMULATION/NR_PHY/pbchsim.c b/openair1/SIMULATION/NR_PHY/pbchsim.c index edf39cee82..9974b286e3 100644 --- a/openair1/SIMULATION/NR_PHY/pbchsim.c +++ b/openair1/SIMULATION/NR_PHY/pbchsim.c @@ -154,6 +154,7 @@ int main(int argc, char **argv) int **txdata; double **s_re,**s_im,**r_re,**r_im; //double iqim = 0.0; + double DS_TDL = .03; double ip =0.0; //unsigned char pbch_pdu[6]; // int sync_pos, sync_pos_slot; @@ -256,6 +257,21 @@ int main(int argc, char **argv) case 'G': channel_model=ETU; break; + + case 'H': + channel_model = TDL_C; + DS_TDL = .030; // 30 ns + break; + + case 'I': + channel_model = TDL_C; + DS_TDL = .3; // 300ns + break; + + case 'J': + channel_model=TDL_D; + DS_TDL = .03; + break; default: printf("Unsupported channel model! Exiting.\n"); @@ -505,10 +521,8 @@ int main(int argc, char **argv) channel_model, fs, bw, - 300e-9, - 0, - 0, - 0, 0); + DS_TDL, + 0, 0, 0, 0); if (gNB2UE==NULL) { printf("Problem generating channel model. Exiting.\n"); @@ -656,8 +670,8 @@ int main(int argc, char **argv) for (i=0; inb_antennas_tx; aa++) { - r_re[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)]); - r_im[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)+1]); + s_re[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)]); + s_im[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)+1]); } } @@ -667,9 +681,18 @@ int main(int argc, char **argv) n_errors_payload = 0; for (trial=0; trialnb_antennas_tx; aa++) { + memcpy(r_re[aa],s_re[aa],frame_length_complex_samples*sizeof(double)); + memcpy(r_im[aa],s_im[aa],frame_length_complex_samples*sizeof(double)); + } + } + //AWGN sigma2_dB = 20*log10((double)AMP/4)-SNR; sigma2 = pow(10,sigma2_dB/10); From d42fa4105553d000b1c60cb481b7deb47a1c8730 Mon Sep 17 00:00:00 2001 From: Sagar Parsawar Date: Mon, 24 Jan 2022 09:54:34 +0100 Subject: [PATCH 033/135] Fixed re_offset issue in PRS channel estimation for combSize 4 --- openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c | 21 +++ openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h | 14 ++ .../nr_dl_channel_estimation.c | 126 ++++++++++++------ openair1/SCHED_NR/phy_procedures_nr_gNB.c | 2 +- openair1/SIMULATION/NR_PHY/pbchsim.c | 2 +- 5 files changed, 121 insertions(+), 44 deletions(-) diff --git a/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c b/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c index 65ae288252..7e85312f95 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c +++ b/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c @@ -23,6 +23,9 @@ short filt16a_l0[16] = { 16384,12288,8192,4096,0,0,0,0,0,0,0,0,0,0,0,0}; +short filt16a_mm0[16] = { +0,4096,8192,12288,16384,12288,8192,4096,0,0,0,0,0,0,0,0}; + short filt16a_r0[16] = { 0,0,0,0,0,4096,8192,12288,16384,20480,24576,28672,0,0,0,0}; @@ -32,6 +35,12 @@ short filt16a_m0[16] = { short filt16a_l1[16] = { 20480,16384,12288,8192,4096,0,0,0,0,0,0,0,0,0,0,0}; +short filt16a_mm1[16] = { +0,0,4096,8192,12288,16384,12288,8192,4096,0,0,0,0,0,0,0}; + +short filt16a_ml1[16] = { +-4096,0,4096,8192,12288,16384,12288,8192,4096,0,0,0,0,0,0,0}; + short filt16a_r1[16] = { 0,0,0,0,0,0,4096,8192,12288,16384,20480,24576,0,0,0,0}; @@ -41,6 +50,12 @@ short filt16a_m1[16] = { short filt16a_l2[16] = { 24576,20480,16384,12288,8192,4096,0,0,0,0,0,0,0,0,0,0}; +short filt16a_mm2[16] = { +0,0,0,4096,8192,12288,16384,12288,8192,4096,0,0,0,0,0,0}; + +short filt16a_ml2[16] = { +-8192,-4096,0,4096,8192,12288,16384,12288,8192,4096,0,0,0,0,0,0}; + short filt16a_r2[16] = { 0,0,0,0,0,0,0,4096,8192,12288,16384,20480,0,0,0,0}; @@ -50,6 +65,12 @@ short filt16a_m2[16] = { short filt16a_l3[16] = { 28672,24576,20480,16384,12288,8192,4096,0,0,0,0,0,0,0,0,0}; +short filt16a_mm3[16] = { +0,0,0,0,4096,8192,12288,16384,12288,8192,4096,0,0,0,0,0}; + +short filt16a_ml3[16] = { +-12288,-8192,-4096,0,4096,8192,12288,16384,12288,8192,4096,0,0,0,0,0}; + short filt16a_r3[16] = { 0,0,0,0,0,0,0,0,4096,8192,12288,16384,0,0,0,0}; diff --git a/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h b/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h index e28736b51d..6211df0a2a 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h +++ b/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h @@ -28,24 +28,38 @@ extern short filt16a_r0[16]; extern short filt16a_m0[16]; +extern short filt16a_mm0[16]; + extern short filt16a_l1[16]; extern short filt16a_r1[16]; extern short filt16a_m1[16]; +extern short filt16a_mm1[16]; + +extern short filt16a_ml1[16]; + extern short filt16a_l2[16]; extern short filt16a_r2[16]; extern short filt16a_m2[16]; +extern short filt16a_mm2[16]; + +extern short filt16a_ml2[16]; + extern short filt16a_l3[16]; extern short filt16a_r3[16]; extern short filt16a_m3[16]; +extern short filt16a_mm3[16]; + +extern short filt16a_ml3[16]; + extern short filt16a_l0_dc[16]; extern short filt16a_r0_dc[16]; 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 e424839dd1..af1bd95e9d 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -52,7 +52,7 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, uint32_t **nr_gold_prs = ue->nr_gold_prs[proc->nr_slot_rx]; prs_data_t *prs_cfg = &ue->prs_cfg; - int16_t *prs_chest, ch[2] = {0}, *rxF, *pil, *fl,*fm,*fr, mod_prs[NR_MAX_PRS_LENGTH<<1]; + int16_t *prs_chest, ch[2] = {0}, *rxF, *pil, *fl,*fm, *fmm, *fml, *fr, mod_prs[NR_MAX_PRS_LENGTH<<1]; int16_t k_prime = 0, k = 0; uint8_t idx = prs_cfg->NPRSID; uint8_t rxAnt = 0; // ant 0 rxdataF for now @@ -75,28 +75,37 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, } printf("PRS config l %d k_prime %d:\nprs_cfg->SymbolStart %d\nprs_cfg->NumPRSSymbols %d\nprs_cfg->NumRB %d\nprs_cfg->CombSize %d\n", l, k_prime, prs_cfg->SymbolStart, prs_cfg->NumPRSSymbols, prs_cfg->NumRB, prs_cfg->CombSize); + //TODO currently supported only comb_size 2 and 4 switch (k_prime) { case 0: fl = filt16a_l0; + fmm = filt16a_mm0; + fml = filt16a_mm0; fm = filt16a_m0; fr = filt16a_r0; break; case 1: fl = filt16a_l1; + fmm = filt16a_mm1; + fml = filt16a_ml1; fm = filt16a_m1; fr = filt16a_r1; break; case 2: fl = filt16a_l2; + fmm = filt16a_mm2; + fml = filt16a_ml2; fm = filt16a_m2; fr = filt16a_r2; break; case 3: fl = filt16a_l3; + fmm = filt16a_mm3; + fml = filt16a_ml3; fm = filt16a_m3; fr = filt16a_r3; break; @@ -117,35 +126,55 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, mod_prs[m<<1] = nr_qpsk_mod_table[idx<<1]; mod_prs[(m<<1)+1] = nr_qpsk_mod_table[(idx<<1) + 1]; } - + + // Channel estimation and interpolation pil = (int16_t *)&mod_prs[0]; rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k]; prs_chest = (int16_t *)&ue->prs_ch_estimates[rxAnt][l*frame_params->ofdm_symbol_size]; memset(prs_chest,0,4*(ue->frame_parms.ofdm_symbol_size)); - for(int pIdx = 0; pIdx < prs_cfg->NumRB*(12/prs_cfg->CombSize); pIdx+=3) - { - //pilot 0 - ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); - ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); + //Start pilot + ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); + ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); #ifdef DEBUG_PRS_CHEST - printf("pilIdx %d at k %d of l %d reIdx %d rxF %d %d ch[0] %d ch[1] %d\n", pIdx, k, l, (l*frame_params->ofdm_symbol_size + k), rxF[0], rxF[1], ch[0], ch[1]); + printf("pilIdx %d at k %d of l %d reIdx %d rxF %p %d %d ch[0] %d ch[1] %d\n", 0, k, l, (l*frame_params->ofdm_symbol_size + k), rxF, rxF[0], rxF[1], ch[0], ch[1]); #endif - multadd_real_vector_complex_scalar(fl, - ch, - prs_chest, - 16); - - pil +=2; - k = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size; - rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k]; - - //pilot 1 + multadd_real_vector_complex_scalar(fl, + ch, + prs_chest, + 16); + + pil +=2; + k = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size; + rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k]; + + ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); + ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); +#ifdef DEBUG_PRS_CHEST + printf("pilIdx %d at k %d of l %d reIdx %d rxF %p %d %d ch[0] %d ch[1] %d\n", 1, k, l, (l*frame_params->ofdm_symbol_size + k), rxF, rxF[0], rxF[1], ch[0], ch[1]); +#endif + + multadd_real_vector_complex_scalar(fml, + ch, + prs_chest, + 16); + + pil +=2; + k = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size; + rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k]; + prs_chest +=8; + + //Middle pilots + for(int pIdx = 2; pIdx < prs_cfg->NumRB*(12/prs_cfg->CombSize)-2; pIdx++) + { ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); +#ifdef DEBUG_PRS_CHEST + printf("pilIdx %d at k %d of l %d reIdx %d rxF %p %d %d ch[0] %d ch[1] %d\n", pIdx, k, l, (l*frame_params->ofdm_symbol_size + k), rxF, rxF[0], rxF[1], ch[0], ch[1]); +#endif - multadd_real_vector_complex_scalar(fm, + multadd_real_vector_complex_scalar(fmm, ch, prs_chest, 16); @@ -153,27 +182,43 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, pil +=2; k = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size; rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k]; - - //pilot 2 - ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); - ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); - - multadd_real_vector_complex_scalar(fr, - ch, - prs_chest, - 16); - - pil +=2; - k = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size; - rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k]; - for (int re = 0; re < 12; re++) - printf("prs_ch[%d] %d %d\n", re, prs_chest[re<<1], prs_chest[(re<<1)+1]); - - prs_chest +=24; - } //for m + prs_chest +=8; + } + + //End pilot + ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); + ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); +#ifdef DEBUG_PRS_CHEST + printf("pilIdx %d at k %d of l %d reIdx %d rxF %p %d %d ch[0] %d ch[1] %d\n", 0, k, l, (l*frame_params->ofdm_symbol_size + k), rxF, rxF[0], rxF[1], ch[0], ch[1]); +#endif + + multadd_real_vector_complex_scalar(fm, + ch, + prs_chest, + 16); + + pil +=2; + k = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size; + rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k]; + + ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); + ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); +#ifdef DEBUG_PRS_CHEST + printf("pilIdx %d at k %d of l %d reIdx %d rxF %p %d %d ch[0] %d ch[1] %d\n", 1, k, l, (l*frame_params->ofdm_symbol_size + k), rxF, rxF[0], rxF[1], ch[0], ch[1]); +#endif + + multadd_real_vector_complex_scalar(fr, + ch, + prs_chest, + 16); + + prs_chest = (int16_t *)&ue->prs_ch_estimates[rxAnt][l*frame_params->ofdm_symbol_size]; + for (int re = 0; re < prs_cfg->NumRB*12; re++) + printf("prs_ch[%d] %d %d\n", re, prs_chest[re<<1], prs_chest[(re<<1)+1]); + } //for l - LOG_M("prsEst.m","prs_chest",&ue->prs_ch_estimates[rxAnt][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], prs_cfg->NumRB*12,1,1 ); + LOG_M("prsEst.m","prs_chest",&ue->prs_ch_estimates[rxAnt][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], prs_cfg->NumRB*12,1,1); return(0); } @@ -538,10 +583,7 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue, ch, dl_ch, 16); -#ifdef DEBUG_CH - for (int re = 0; re < 12; re++) - printf("dl_ch[%d] %d %d\n", re, dl_ch[re<<1], dl_ch[(re<<1)+1]); -#endif + pil += 2; re_offset = (re_offset+4) % ue->frame_parms.ofdm_symbol_size; rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)]; diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index 20a4672caf..086ad735e4 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -106,7 +106,7 @@ void nr_common_signal_procedures (PHY_VARS_gNB *gNB,int frame,int slot,nfapi_nr_ prs_data.PRSResourceSetPeriod[1]=0; // resource slot offset prs_data.SymbolStart=7; prs_data.NumPRSSymbols=6; - prs_data.NumRB=273; + prs_data.NumRB=8; prs_data.RBOffset=0; prs_data.CombSize=4; prs_data.REOffset=0; diff --git a/openair1/SIMULATION/NR_PHY/pbchsim.c b/openair1/SIMULATION/NR_PHY/pbchsim.c index edf39cee82..e8fdd43a1e 100644 --- a/openair1/SIMULATION/NR_PHY/pbchsim.c +++ b/openair1/SIMULATION/NR_PHY/pbchsim.c @@ -740,7 +740,7 @@ int main(int argc, char **argv) UE->prs_cfg.PRSResourceSetPeriod[1]=0; // resource slot offset UE->prs_cfg.SymbolStart=7; UE->prs_cfg.NumPRSSymbols=6; - UE->prs_cfg.NumRB=273; + UE->prs_cfg.NumRB=8; UE->prs_cfg.RBOffset=0; UE->prs_cfg.CombSize=4; UE->prs_cfg.REOffset=0; From 8b4d21d911be508adc079b5887c694914020345d Mon Sep 17 00:00:00 2001 From: Sagar Parsawar Date: Mon, 24 Jan 2022 12:57:13 +0100 Subject: [PATCH 034/135] OAI UE: CombSize 2 support for PRS channel estimation and interpolation --- .../nr_dl_channel_estimation.c | 364 +++++++++++++----- 1 file changed, 260 insertions(+), 104 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 af1bd95e9d..262dcada2d 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -52,7 +52,7 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, uint32_t **nr_gold_prs = ue->nr_gold_prs[proc->nr_slot_rx]; prs_data_t *prs_cfg = &ue->prs_cfg; - int16_t *prs_chest, ch[2] = {0}, *rxF, *pil, *fl,*fm, *fmm, *fml, *fr, mod_prs[NR_MAX_PRS_LENGTH<<1]; + int16_t *prs_chest, ch[2] = {0}, *rxF, *pil, *fl,*fm, *fmm, *fml, *fmr, *fr, mod_prs[NR_MAX_PRS_LENGTH<<1]; int16_t k_prime = 0, k = 0; uint8_t idx = prs_cfg->NPRSID; uint8_t rxAnt = 0; // ant 0 rxdataF for now @@ -76,46 +76,6 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, printf("PRS config l %d k_prime %d:\nprs_cfg->SymbolStart %d\nprs_cfg->NumPRSSymbols %d\nprs_cfg->NumRB %d\nprs_cfg->CombSize %d\n", l, k_prime, prs_cfg->SymbolStart, prs_cfg->NumPRSSymbols, prs_cfg->NumRB, prs_cfg->CombSize); - //TODO currently supported only comb_size 2 and 4 - switch (k_prime) { - case 0: - fl = filt16a_l0; - fmm = filt16a_mm0; - fml = filt16a_mm0; - fm = filt16a_m0; - fr = filt16a_r0; - break; - - case 1: - fl = filt16a_l1; - fmm = filt16a_mm1; - fml = filt16a_ml1; - fm = filt16a_m1; - fr = filt16a_r1; - break; - - case 2: - fl = filt16a_l2; - fmm = filt16a_mm2; - fml = filt16a_ml2; - fm = filt16a_m2; - fr = filt16a_r2; - break; - - case 3: - fl = filt16a_l3; - fmm = filt16a_mm3; - fml = filt16a_ml3; - fm = filt16a_m3; - fr = filt16a_r3; - break; - - default: - printf("nr=prs channel_estimation: k_prime=%d -> ERROR\n",k_prime); - return(-1); - break; - } - //re_offset k = (prs_cfg->REOffset+k_prime) % prs_cfg->CombSize + frame_params->first_carrier_offset; @@ -126,91 +86,287 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, mod_prs[m<<1] = nr_qpsk_mod_table[idx<<1]; mod_prs[(m<<1)+1] = nr_qpsk_mod_table[(idx<<1) + 1]; } - + // Channel estimation and interpolation pil = (int16_t *)&mod_prs[0]; rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k]; prs_chest = (int16_t *)&ue->prs_ch_estimates[rxAnt][l*frame_params->ofdm_symbol_size]; memset(prs_chest,0,4*(ue->frame_parms.ofdm_symbol_size)); - - //Start pilot - ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); - ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); -#ifdef DEBUG_PRS_CHEST - printf("pilIdx %d at k %d of l %d reIdx %d rxF %p %d %d ch[0] %d ch[1] %d\n", 0, k, l, (l*frame_params->ofdm_symbol_size + k), rxF, rxF[0], rxF[1], ch[0], ch[1]); -#endif - - multadd_real_vector_complex_scalar(fl, - ch, - prs_chest, - 16); - pil +=2; - k = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size; - rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k]; - - ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); - ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); -#ifdef DEBUG_PRS_CHEST - printf("pilIdx %d at k %d of l %d reIdx %d rxF %p %d %d ch[0] %d ch[1] %d\n", 1, k, l, (l*frame_params->ofdm_symbol_size + k), rxF, rxF[0], rxF[1], ch[0], ch[1]); -#endif - - multadd_real_vector_complex_scalar(fml, - ch, - prs_chest, - 16); - - pil +=2; - k = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size; - rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k]; - prs_chest +=8; - - //Middle pilots - for(int pIdx = 2; pIdx < prs_cfg->NumRB*(12/prs_cfg->CombSize)-2; pIdx++) + if(prs_cfg->CombSize == 2) { + // Choose the interpolation filters + switch (k_prime) { + case 0: + fl = filt8_l0; + fml = filt8_m0; + fmm = filt8_mm0; + fmr = filt8_mr0; + fm = filt8_m0; + fr = filt8_r0; + break; + + case 1: + fl = filt8_l1; + fmm = filt8_mm1; + fml = filt8_ml1; + fmr = fmm; + fm = filt8_m1; + fr = filt8_r1; + break; + default: + printf("nr=prs channel_estimation: k_prime=%d -> ERROR\n",k_prime); + return(-1); + break; + } + + //Start pilot ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); #ifdef DEBUG_PRS_CHEST - printf("pilIdx %d at k %d of l %d reIdx %d rxF %p %d %d ch[0] %d ch[1] %d\n", pIdx, k, l, (l*frame_params->ofdm_symbol_size + k), rxF, rxF[0], rxF[1], ch[0], ch[1]); + printf("pilIdx %d at k %d of l %d reIdx %d rxF %p %d %d ch[0] %d ch[1] %d\n", 0, k, l, (l*frame_params->ofdm_symbol_size + k), rxF, rxF[0], rxF[1], ch[0], ch[1]); +#endif + + multadd_real_vector_complex_scalar(fl, + ch, + prs_chest, + 8); + + pil +=2; + k = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size; + rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k]; + + ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); + ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); +#ifdef DEBUG_PRS_CHEST + printf("pilIdx %d at k %d of l %d reIdx %d rxF %p %d %d ch[0] %d ch[1] %d\n", 1, k, l, (l*frame_params->ofdm_symbol_size + k), rxF, rxF[0], rxF[1], ch[0], ch[1]); +#endif + + multadd_real_vector_complex_scalar(fml, + ch, + prs_chest, + 8); + + pil +=2; + k = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size; + rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k]; + + ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); + ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); +#ifdef DEBUG_PRS_CHEST + printf("pilIdx %d at k %d of l %d reIdx %d rxF %p %d %d ch[0] %d ch[1] %d\n", 2, k, l, (l*frame_params->ofdm_symbol_size + k), rxF, rxF[0], rxF[1], ch[0], ch[1]); #endif multadd_real_vector_complex_scalar(fmm, - ch, - prs_chest, - 16); + ch, + prs_chest, + 8); pil +=2; k = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size; rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k]; prs_chest +=8; - } - - //End pilot - ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); - ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); + + //Middle pilots + for(int pIdx = 3; pIdx < prs_cfg->NumRB*(12/prs_cfg->CombSize)-3; pIdx+=2) + { + ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); + ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); #ifdef DEBUG_PRS_CHEST - printf("pilIdx %d at k %d of l %d reIdx %d rxF %p %d %d ch[0] %d ch[1] %d\n", 0, k, l, (l*frame_params->ofdm_symbol_size + k), rxF, rxF[0], rxF[1], ch[0], ch[1]); + printf("pilIdx %d at k %d of l %d reIdx %d rxF %p %d %d ch[0] %d ch[1] %d\n", pIdx, k, l, (l*frame_params->ofdm_symbol_size + k), rxF, rxF[0], rxF[1], ch[0], ch[1]); #endif - - multadd_real_vector_complex_scalar(fm, - ch, - prs_chest, - 16); - - pil +=2; - k = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size; - rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k]; - - ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); - ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); + + multadd_real_vector_complex_scalar(fm, + ch, + prs_chest, + 8); + + pil +=2; + k = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size; + rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k]; + + ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); + ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); #ifdef DEBUG_PRS_CHEST - printf("pilIdx %d at k %d of l %d reIdx %d rxF %p %d %d ch[0] %d ch[1] %d\n", 1, k, l, (l*frame_params->ofdm_symbol_size + k), rxF, rxF[0], rxF[1], ch[0], ch[1]); + printf("pilIdx %d at k %d of l %d reIdx %d rxF %p %d %d ch[0] %d ch[1] %d\n", pIdx+1, k, l, (l*frame_params->ofdm_symbol_size + k), rxF, rxF[0], rxF[1], ch[0], ch[1]); +#endif + + multadd_real_vector_complex_scalar(fmm, + ch, + prs_chest, + 8); + + pil +=2; + k = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size; + rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k]; + prs_chest +=8; + } + + //End pilot + ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); + ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); +#ifdef DEBUG_PRS_CHEST + printf("pilIdx %d at k %d of l %d reIdx %d rxF %p %d %d ch[0] %d ch[1] %d\n", 1, k, l, (l*frame_params->ofdm_symbol_size + k), rxF, rxF[0], rxF[1], ch[0], ch[1]); +#endif + + multadd_real_vector_complex_scalar(fm, + ch, + prs_chest, + 8); + + pil +=2; + k = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size; + rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k]; + + ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); + ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); +#ifdef DEBUG_PRS_CHEST + printf("pilIdx %d at k %d of l %d reIdx %d rxF %p %d %d ch[0] %d ch[1] %d\n", prs_cfg->NumRB*(12/prs_cfg->CombSize)-2, k, l, (l*frame_params->ofdm_symbol_size + k), rxF, rxF[0], rxF[1], ch[0], ch[1]); +#endif + + multadd_real_vector_complex_scalar(fmr, + ch, + prs_chest, + 8); + + pil +=2; + k = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size; + rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k]; + prs_chest +=8; + + ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); + ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); +#ifdef DEBUG_PRS_CHEST + printf("pilIdx %d at k %d of l %d reIdx %d rxF %p %d %d ch[0] %d ch[1] %d\n", prs_cfg->NumRB*(12/prs_cfg->CombSize)-1, k, l, (l*frame_params->ofdm_symbol_size + k), rxF, rxF[0], rxF[1], ch[0], ch[1]); #endif - multadd_real_vector_complex_scalar(fr, - ch, - prs_chest, - 16); + multadd_real_vector_complex_scalar(fr, + ch, + prs_chest, + 8); + + } + else if(prs_cfg->CombSize == 4) + { + // Choose the interpolation filters + switch (k_prime) { + case 0: + fl = filt16a_l0; + fmm = filt16a_mm0; + fml = filt16a_mm0; + fm = filt16a_m0; + fr = filt16a_r0; + break; + + case 1: + fl = filt16a_l1; + fmm = filt16a_mm1; + fml = filt16a_ml1; + fm = filt16a_m1; + fr = filt16a_r1; + break; + + case 2: + fl = filt16a_l2; + fmm = filt16a_mm2; + fml = filt16a_ml2; + fm = filt16a_m2; + fr = filt16a_r2; + break; + + case 3: + fl = filt16a_l3; + fmm = filt16a_mm3; + fml = filt16a_ml3; + fm = filt16a_m3; + fr = filt16a_r3; + break; + + default: + printf("nr=prs channel_estimation: k_prime=%d -> ERROR\n",k_prime); + return(-1); + break; + } + + //Start pilot + ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); + ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); +#ifdef DEBUG_PRS_CHEST + printf("pilIdx %d at k %d of l %d reIdx %d rxF %p %d %d ch[0] %d ch[1] %d\n", 0, k, l, (l*frame_params->ofdm_symbol_size + k), rxF, rxF[0], rxF[1], ch[0], ch[1]); +#endif + + multadd_real_vector_complex_scalar(fl, + ch, + prs_chest, + 16); + + pil +=2; + k = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size; + rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k]; + + ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); + ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); +#ifdef DEBUG_PRS_CHEST + printf("pilIdx %d at k %d of l %d reIdx %d rxF %p %d %d ch[0] %d ch[1] %d\n", 1, k, l, (l*frame_params->ofdm_symbol_size + k), rxF, rxF[0], rxF[1], ch[0], ch[1]); +#endif + + multadd_real_vector_complex_scalar(fml, + ch, + prs_chest, + 16); + + pil +=2; + k = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size; + rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k]; + prs_chest +=8; + + //Middle pilots + for(int pIdx = 2; pIdx < prs_cfg->NumRB*(12/prs_cfg->CombSize)-2; pIdx++) + { + ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); + ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); +#ifdef DEBUG_PRS_CHEST + printf("pilIdx %d at k %d of l %d reIdx %d rxF %p %d %d ch[0] %d ch[1] %d\n", pIdx, k, l, (l*frame_params->ofdm_symbol_size + k), rxF, rxF[0], rxF[1], ch[0], ch[1]); +#endif + + multadd_real_vector_complex_scalar(fmm, + ch, + prs_chest, + 16); + + pil +=2; + k = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size; + rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k]; + prs_chest +=8; + } + + //End pilot + ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); + ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); +#ifdef DEBUG_PRS_CHEST + printf("pilIdx %d at k %d of l %d reIdx %d rxF %p %d %d ch[0] %d ch[1] %d\n", prs_cfg->NumRB*(12/prs_cfg->CombSize)-2, k, l, (l*frame_params->ofdm_symbol_size + k), rxF, rxF[0], rxF[1], ch[0], ch[1]); +#endif + + multadd_real_vector_complex_scalar(fm, + ch, + prs_chest, + 16); + + pil +=2; + k = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size; + rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k]; + + ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); + ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); +#ifdef DEBUG_PRS_CHEST + printf("pilIdx %d at k %d of l %d reIdx %d rxF %p %d %d ch[0] %d ch[1] %d\n", prs_cfg->NumRB*(12/prs_cfg->CombSize)-1, k, l, (l*frame_params->ofdm_symbol_size + k), rxF, rxF[0], rxF[1], ch[0], ch[1]); +#endif + + multadd_real_vector_complex_scalar(fr, + ch, + prs_chest, + 16); + } prs_chest = (int16_t *)&ue->prs_ch_estimates[rxAnt][l*frame_params->ofdm_symbol_size]; for (int re = 0; re < prs_cfg->NumRB*12; re++) @@ -218,7 +374,7 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, } //for l - LOG_M("prsEst.m","prs_chest",&ue->prs_ch_estimates[rxAnt][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], prs_cfg->NumRB*12,1,1); + LOG_M("prsEst.m","prs_chest",&ue->prs_ch_estimates[rxAnt][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], prs_cfg->NumPRSSymbols*prs_cfg->NumRB*12,1,1); return(0); } From 55c644838afba3661624e8840b5d140f015c235b Mon Sep 17 00:00:00 2001 From: Sagar Parsawar Date: Tue, 25 Jan 2022 12:02:05 +0100 Subject: [PATCH 035/135] Added PRS TD impulse response for Comb size 2 and 4 --- openair1/PHY/INIT/nr_init_ue.c | 10 +- openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c | 8 +- openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h | 4 + .../nr_dl_channel_estimation.c | 249 +++++++++--------- openair1/PHY/defs_nr_UE.h | 3 +- openair1/SCHED_NR/phy_procedures_nr_gNB.c | 4 +- openair1/SIMULATION/NR_PHY/pbchsim.c | 45 +--- 7 files changed, 150 insertions(+), 173 deletions(-) diff --git a/openair1/PHY/INIT/nr_init_ue.c b/openair1/PHY/INIT/nr_init_ue.c index 9ecf19777c..6752e0b077 100644 --- a/openair1/PHY/INIT/nr_init_ue.c +++ b/openair1/PHY/INIT/nr_init_ue.c @@ -336,12 +336,14 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, pbch_vars[gNB_id] = (NR_UE_PBCH *)malloc16_clear(sizeof(NR_UE_PBCH)); // PRS channel estimates - ue->prs_ch_estimates = (int32_t **)malloc16( fp->nb_antennas_rx*sizeof(int32_t *) ); - AssertFatal(ue->prs_ch_estimates!=NULL, "NR UE init: PRS channel estimates malloc failed\n"); + ue->prs_ch_estimates = (int32_t **)malloc16( fp->nb_antennas_rx*sizeof(int32_t *) ); + ue->prs_ch_estimates_time = (int32_t **)malloc16( fp->nb_antennas_rx*sizeof(int32_t *) ); + AssertFatal(((ue->prs_ch_estimates!=NULL) || (ue->prs_ch_estimates_time!=NULL)), "NR UE init: PRS channel estimates malloc failed\n"); for (i=0; inb_antennas_rx; i++) { - ue->prs_ch_estimates[i] = (int32_t *)malloc16(2*fp->ofdm_symbol_size*NR_MAX_NUM_PRS_SYMB); - AssertFatal(ue->prs_ch_estimates[i]!=NULL, "NR UE init: PRS channel estimates malloc failed %d\n", i); + ue->prs_ch_estimates[i] = (int32_t *)malloc16(2*fp->ofdm_symbol_size*NR_MAX_NUM_PRS_SYMB); + ue->prs_ch_estimates_time[i] = (int32_t *)malloc16(2*fp->ofdm_symbol_size*NR_MAX_NUM_PRS_SYMB); + AssertFatal(((ue->prs_ch_estimates[i]!=NULL) || (ue->prs_ch_estimates_time[i]!=NULL)), "NR UE init: PRS channel estimates malloc failed %d\n", i); } diff --git a/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c b/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c index 7e85312f95..02ef3077f2 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c +++ b/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c @@ -41,6 +41,9 @@ short filt16a_mm1[16] = { short filt16a_ml1[16] = { -4096,0,4096,8192,12288,16384,12288,8192,4096,0,0,0,0,0,0,0}; +short filt16a_mr1[16] = { +0,0,4096,8192,12288,16384,12288,8192,4096,0,-4096,-8192,0,0,0,0}; + short filt16a_r1[16] = { 0,0,0,0,0,0,4096,8192,12288,16384,20480,24576,0,0,0,0}; @@ -56,6 +59,9 @@ short filt16a_mm2[16] = { short filt16a_ml2[16] = { -8192,-4096,0,4096,8192,12288,16384,12288,8192,4096,0,0,0,0,0,0}; +short filt16a_mr2[16] = { +0,0,0,4096,8192,12288,16384,12288,8192,4096,0,-4096,0,0,0,0}; + short filt16a_r2[16] = { 0,0,0,0,0,0,0,4096,8192,12288,16384,20480,0,0,0,0}; @@ -169,7 +175,7 @@ short filt8_dcr0_h[8]= { 0,4096,8192,12288,16384,0,0,0}; short filt8_l1[8] = { -24576,16384,0,0,0,0,0,0}; +24576,16384,8192,0,0,0,0,0}; short filt8_ml1[8] = { -8192,0,8192,16384,8192,0,0,0}; diff --git a/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h b/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h index 6211df0a2a..0acd4c0e1a 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h +++ b/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h @@ -38,6 +38,8 @@ extern short filt16a_m1[16]; extern short filt16a_mm1[16]; +extern short filt16a_mr1[16]; + extern short filt16a_ml1[16]; extern short filt16a_l2[16]; @@ -48,6 +50,8 @@ extern short filt16a_m2[16]; extern short filt16a_mm2[16]; +extern short filt16a_mr2[16]; + extern short filt16a_ml2[16]; extern short filt16a_l3[16]; 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 262dcada2d..f9795686a0 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -34,7 +34,7 @@ //#define DEBUG_PDSCH //#define DEBUG_PDCCH //#define DEBUG_CH -#define DEBUG_PRS_CHEST +//#define DEBUG_PRS_CHEST extern short nr_qpsk_mod_table[8]; int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, @@ -53,11 +53,13 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, prs_data_t *prs_cfg = &ue->prs_cfg; int16_t *prs_chest, ch[2] = {0}, *rxF, *pil, *fl,*fm, *fmm, *fml, *fmr, *fr, mod_prs[NR_MAX_PRS_LENGTH<<1]; - int16_t k_prime = 0, k = 0; + int16_t k_prime = 0, k = 0, re_offset; uint8_t idx = prs_cfg->NPRSID; uint8_t rxAnt = 0; // ant 0 rxdataF for now + int16_t *ch_intrp = (int16_t *)malloc16(frame_params->ofdm_symbol_size*2*sizeof(int16_t)); + AssertFatal(ch_intrp != NULL, "nr_prs_channel_estimation: channel estimate buffer initialization failed!!"); + int16_t *ch_init = ch_intrp; - printf("Inside nr_prs_channel_estimation proc->thread_id %d, proc->nr_slot_rx %d\n", proc->thread_id, proc->nr_slot_rx); for(int l = prs_cfg->SymbolStart; l < prs_cfg->SymbolStart+prs_cfg->NumPRSSymbols; l++) { int symInd = l-prs_cfg->SymbolStart; @@ -74,10 +76,10 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, k_prime = k_prime_table[3][symInd]; } - printf("PRS config l %d k_prime %d:\nprs_cfg->SymbolStart %d\nprs_cfg->NumPRSSymbols %d\nprs_cfg->NumRB %d\nprs_cfg->CombSize %d\n", l, k_prime, prs_cfg->SymbolStart, prs_cfg->NumPRSSymbols, prs_cfg->NumRB, prs_cfg->CombSize); - //re_offset - k = (prs_cfg->REOffset+k_prime) % prs_cfg->CombSize + frame_params->first_carrier_offset; + k = re_offset = (prs_cfg->REOffset+k_prime) % prs_cfg->CombSize + frame_params->first_carrier_offset; + + printf("PRS config l %d k_prime %d, re_offset %d :\nprs_cfg->SymbolStart %d\nprs_cfg->NumPRSSymbols %d\nprs_cfg->NumRB %d\nprs_cfg->CombSize %d\n", l, k_prime, re_offset, prs_cfg->SymbolStart, prs_cfg->NumPRSSymbols, prs_cfg->NumRB, prs_cfg->CombSize); // Pilots generation and modulation for (int m = 0; m < (12/prs_cfg->CombSize)*prs_cfg->NumRB; m++) @@ -92,6 +94,7 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k]; prs_chest = (int16_t *)&ue->prs_ch_estimates[rxAnt][l*frame_params->ofdm_symbol_size]; memset(prs_chest,0,4*(ue->frame_parms.ofdm_symbol_size)); + memset(ch_intrp,0,4*(ue->frame_parms.ofdm_symbol_size)); if(prs_cfg->CombSize == 2) { @@ -114,6 +117,7 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, fm = filt8_m1; fr = filt8_r1; break; + default: printf("nr=prs channel_estimation: k_prime=%d -> ERROR\n",k_prime); return(-1); @@ -123,126 +127,69 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, //Start pilot ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); -#ifdef DEBUG_PRS_CHEST - printf("pilIdx %d at k %d of l %d reIdx %d rxF %p %d %d ch[0] %d ch[1] %d\n", 0, k, l, (l*frame_params->ofdm_symbol_size + k), rxF, rxF[0], rxF[1], ch[0], ch[1]); -#endif - + multadd_real_vector_complex_scalar(fl, ch, - prs_chest, + ch_intrp, 8); pil +=2; k = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size; rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k]; - - ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); - ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); -#ifdef DEBUG_PRS_CHEST - printf("pilIdx %d at k %d of l %d reIdx %d rxF %p %d %d ch[0] %d ch[1] %d\n", 1, k, l, (l*frame_params->ofdm_symbol_size + k), rxF, rxF[0], rxF[1], ch[0], ch[1]); -#endif - multadd_real_vector_complex_scalar(fml, - ch, - prs_chest, - 8); - - pil +=2; - k = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size; - rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k]; - - ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); - ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); -#ifdef DEBUG_PRS_CHEST - printf("pilIdx %d at k %d of l %d reIdx %d rxF %p %d %d ch[0] %d ch[1] %d\n", 2, k, l, (l*frame_params->ofdm_symbol_size + k), rxF, rxF[0], rxF[1], ch[0], ch[1]); -#endif - - multadd_real_vector_complex_scalar(fmm, - ch, - prs_chest, - 8); - - pil +=2; - k = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size; - rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k]; - prs_chest +=8; - //Middle pilots - for(int pIdx = 3; pIdx < prs_cfg->NumRB*(12/prs_cfg->CombSize)-3; pIdx+=2) + for(int pIdx = 1; pIdx < prs_cfg->NumRB*(12/prs_cfg->CombSize)-1; pIdx+=2) { ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); -#ifdef DEBUG_PRS_CHEST - printf("pilIdx %d at k %d of l %d reIdx %d rxF %p %d %d ch[0] %d ch[1] %d\n", pIdx, k, l, (l*frame_params->ofdm_symbol_size + k), rxF, rxF[0], rxF[1], ch[0], ch[1]); -#endif - - multadd_real_vector_complex_scalar(fm, - ch, - prs_chest, - 8); - + if(pIdx == 1) // 2nd pilot + { + multadd_real_vector_complex_scalar(fml, + ch, + ch_intrp, + 8); + } + else + { + multadd_real_vector_complex_scalar(fm, + ch, + ch_intrp, + 8); + } pil +=2; k = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size; rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k]; ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); -#ifdef DEBUG_PRS_CHEST - printf("pilIdx %d at k %d of l %d reIdx %d rxF %p %d %d ch[0] %d ch[1] %d\n", pIdx+1, k, l, (l*frame_params->ofdm_symbol_size + k), rxF, rxF[0], rxF[1], ch[0], ch[1]); -#endif - - multadd_real_vector_complex_scalar(fmm, - ch, - prs_chest, - 8); + if(pIdx == (prs_cfg->NumRB*(12/prs_cfg->CombSize)-3)) // 2nd last pilot + { + multadd_real_vector_complex_scalar(fmr, + ch, + ch_intrp, + 8); + } + else + { + multadd_real_vector_complex_scalar(fmm, + ch, + ch_intrp, + 8); + } pil +=2; k = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size; rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k]; - prs_chest +=8; + ch_intrp +=8; } //End pilot ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); -#ifdef DEBUG_PRS_CHEST - printf("pilIdx %d at k %d of l %d reIdx %d rxF %p %d %d ch[0] %d ch[1] %d\n", 1, k, l, (l*frame_params->ofdm_symbol_size + k), rxF, rxF[0], rxF[1], ch[0], ch[1]); -#endif - multadd_real_vector_complex_scalar(fm, - ch, - prs_chest, - 8); - - pil +=2; - k = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size; - rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k]; - - ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); - ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); -#ifdef DEBUG_PRS_CHEST - printf("pilIdx %d at k %d of l %d reIdx %d rxF %p %d %d ch[0] %d ch[1] %d\n", prs_cfg->NumRB*(12/prs_cfg->CombSize)-2, k, l, (l*frame_params->ofdm_symbol_size + k), rxF, rxF[0], rxF[1], ch[0], ch[1]); -#endif - - multadd_real_vector_complex_scalar(fmr, - ch, - prs_chest, - 8); - - pil +=2; - k = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size; - rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k]; - prs_chest +=8; - - ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); - ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); -#ifdef DEBUG_PRS_CHEST - printf("pilIdx %d at k %d of l %d reIdx %d rxF %p %d %d ch[0] %d ch[1] %d\n", prs_cfg->NumRB*(12/prs_cfg->CombSize)-1, k, l, (l*frame_params->ofdm_symbol_size + k), rxF, rxF[0], rxF[1], ch[0], ch[1]); -#endif - multadd_real_vector_complex_scalar(fr, ch, - prs_chest, + ch_intrp, 8); } @@ -252,32 +199,36 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, switch (k_prime) { case 0: fl = filt16a_l0; - fmm = filt16a_mm0; fml = filt16a_mm0; + fmm = filt16a_mm0; + fmr = filt16a_m0; fm = filt16a_m0; fr = filt16a_r0; break; case 1: fl = filt16a_l1; - fmm = filt16a_mm1; fml = filt16a_ml1; + fmm = filt16a_mm1; + fmr = filt16a_mr1; fm = filt16a_m1; fr = filt16a_r1; break; case 2: fl = filt16a_l2; - fmm = filt16a_mm2; fml = filt16a_ml2; + fmm = filt16a_mm2; + fmr = filt16a_mr2; fm = filt16a_m2; fr = filt16a_r2; break; case 3: fl = filt16a_l3; - fmm = filt16a_mm3; fml = filt16a_ml3; + fmm = filt16a_mm3; + fmr = filt16a_mm3; fm = filt16a_m3; fr = filt16a_r3; break; @@ -291,13 +242,10 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, //Start pilot ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); -#ifdef DEBUG_PRS_CHEST - printf("pilIdx %d at k %d of l %d reIdx %d rxF %p %d %d ch[0] %d ch[1] %d\n", 0, k, l, (l*frame_params->ofdm_symbol_size + k), rxF, rxF[0], rxF[1], ch[0], ch[1]); -#endif - + multadd_real_vector_complex_scalar(fl, ch, - prs_chest, + ch_intrp, 16); pil +=2; @@ -306,50 +254,41 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); -#ifdef DEBUG_PRS_CHEST - printf("pilIdx %d at k %d of l %d reIdx %d rxF %p %d %d ch[0] %d ch[1] %d\n", 1, k, l, (l*frame_params->ofdm_symbol_size + k), rxF, rxF[0], rxF[1], ch[0], ch[1]); -#endif multadd_real_vector_complex_scalar(fml, ch, - prs_chest, + ch_intrp, 16); pil +=2; k = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size; rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k]; - prs_chest +=8; + ch_intrp +=8; //Middle pilots for(int pIdx = 2; pIdx < prs_cfg->NumRB*(12/prs_cfg->CombSize)-2; pIdx++) { ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); -#ifdef DEBUG_PRS_CHEST - printf("pilIdx %d at k %d of l %d reIdx %d rxF %p %d %d ch[0] %d ch[1] %d\n", pIdx, k, l, (l*frame_params->ofdm_symbol_size + k), rxF, rxF[0], rxF[1], ch[0], ch[1]); -#endif - + multadd_real_vector_complex_scalar(fmm, ch, - prs_chest, + ch_intrp, 16); pil +=2; k = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size; rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k]; - prs_chest +=8; + ch_intrp +=8; } //End pilot ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); -#ifdef DEBUG_PRS_CHEST - printf("pilIdx %d at k %d of l %d reIdx %d rxF %p %d %d ch[0] %d ch[1] %d\n", prs_cfg->NumRB*(12/prs_cfg->CombSize)-2, k, l, (l*frame_params->ofdm_symbol_size + k), rxF, rxF[0], rxF[1], ch[0], ch[1]); -#endif - - multadd_real_vector_complex_scalar(fm, + + multadd_real_vector_complex_scalar(fmr, ch, - prs_chest, + ch_intrp, 16); pil +=2; @@ -358,23 +297,71 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); -#ifdef DEBUG_PRS_CHEST - printf("pilIdx %d at k %d of l %d reIdx %d rxF %p %d %d ch[0] %d ch[1] %d\n", prs_cfg->NumRB*(12/prs_cfg->CombSize)-1, k, l, (l*frame_params->ofdm_symbol_size + k), rxF, rxF[0], rxF[1], ch[0], ch[1]); -#endif - + multadd_real_vector_complex_scalar(fr, ch, - prs_chest, + ch_intrp, 16); } - prs_chest = (int16_t *)&ue->prs_ch_estimates[rxAnt][l*frame_params->ofdm_symbol_size]; + ch_intrp = ch_init; for (int re = 0; re < prs_cfg->NumRB*12; re++) - printf("prs_ch[%d] %d %d\n", re, prs_chest[re<<1], prs_chest[(re<<1)+1]); - + { + prs_chest[re_offset] = ch_intrp[re<<1]; + prs_chest[re_offset+1] = ch_intrp[(re<<1)+1]; + printf("prs_ch[%d] %d %d\n", re_offset, ch_intrp[re<<1], ch_intrp[(re<<1)+1]); + re_offset = (re_offset+1) % frame_params->ofdm_symbol_size; + } + + // Time domain IMPULSE response + idft_size_idx_t idftsizeidx; + + switch (frame_params->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); + } + + idft(idftsizeidx, + (int16_t *)&ue->prs_ch_estimates[rxAnt][l*frame_params->ofdm_symbol_size], + (int16_t *)&ue->prs_ch_estimates_time[rxAnt][l*frame_params->ofdm_symbol_size],1); + } //for l - LOG_M("prsEst.m","prs_chest",&ue->prs_ch_estimates[rxAnt][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], prs_cfg->NumPRSSymbols*prs_cfg->NumRB*12,1,1); + LOG_M("prsEst.m","prs_chest",&ue->prs_ch_estimates[rxAnt][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], frame_params->ofdm_symbol_size,1,1); + LOG_M("prsEst_time.m","prs_chest_time",&ue->prs_ch_estimates_time[rxAnt][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], frame_params->ofdm_symbol_size,1,1); return(0); } diff --git a/openair1/PHY/defs_nr_UE.h b/openair1/PHY/defs_nr_UE.h index a8ccc0e3a1..58631acb1d 100644 --- a/openair1/PHY/defs_nr_UE.h +++ b/openair1/PHY/defs_nr_UE.h @@ -824,6 +824,8 @@ typedef struct { NR_UE_DLSCH_t *dlsch_p[NUMBER_OF_CONNECTED_gNB_MAX]; NR_UE_DLSCH_t *dlsch_MCH[NUMBER_OF_CONNECTED_gNB_MAX]; prs_data_t prs_cfg; + int32_t **prs_ch_estimates; + int32_t **prs_ch_estimates_time; //Paging parameters uint32_t IMSImod1024; @@ -846,7 +848,6 @@ typedef struct { #endif - int32_t **prs_ch_estimates; /// PBCH DMRS sequence uint32_t nr_gold_pbch[2][64][NR_PBCH_DMRS_LENGTH_DWORD]; diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index 086ad735e4..c8e80f7afc 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -105,8 +105,8 @@ void nr_common_signal_procedures (PHY_VARS_gNB *gNB,int frame,int slot,nfapi_nr_ prs_data.PRSResourceSetPeriod[0]=40; // PRS resource slot period prs_data.PRSResourceSetPeriod[1]=0; // resource slot offset prs_data.SymbolStart=7; - prs_data.NumPRSSymbols=6; - prs_data.NumRB=8; + prs_data.NumPRSSymbols=4; + prs_data.NumRB=273; prs_data.RBOffset=0; prs_data.CombSize=4; prs_data.REOffset=0; diff --git a/openair1/SIMULATION/NR_PHY/pbchsim.c b/openair1/SIMULATION/NR_PHY/pbchsim.c index 36a572cbcd..873bd93b0b 100644 --- a/openair1/SIMULATION/NR_PHY/pbchsim.c +++ b/openair1/SIMULATION/NR_PHY/pbchsim.c @@ -154,7 +154,6 @@ int main(int argc, char **argv) int **txdata; double **s_re,**s_im,**r_re,**r_im; //double iqim = 0.0; - double DS_TDL = .03; double ip =0.0; //unsigned char pbch_pdu[6]; // int sync_pos, sync_pos_slot; @@ -257,21 +256,6 @@ int main(int argc, char **argv) case 'G': channel_model=ETU; break; - - case 'H': - channel_model = TDL_C; - DS_TDL = .030; // 30 ns - break; - - case 'I': - channel_model = TDL_C; - DS_TDL = .3; // 300ns - break; - - case 'J': - channel_model=TDL_D; - DS_TDL = .03; - break; default: printf("Unsupported channel model! Exiting.\n"); @@ -521,8 +505,10 @@ int main(int argc, char **argv) channel_model, fs, bw, - DS_TDL, - 0, 0, 0, 0); + 300e-9, + 0, + 0, + 0, 0); if (gNB2UE==NULL) { printf("Problem generating channel model. Exiting.\n"); @@ -670,8 +656,8 @@ int main(int argc, char **argv) for (i=0; inb_antennas_tx; aa++) { - s_re[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)]); - s_im[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)+1]); + r_re[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)]); + r_im[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)+1]); } } @@ -681,18 +667,9 @@ int main(int argc, char **argv) n_errors_payload = 0; for (trial=0; trialnb_antennas_tx; aa++) { - memcpy(r_re[aa],s_re[aa],frame_length_complex_samples*sizeof(double)); - memcpy(r_im[aa],s_im[aa],frame_length_complex_samples*sizeof(double)); - } - } - + // multipath channel + //multipath_channel(gNB2UE,s_re,s_im,r_re,r_im,frame_length_complex_samples,0); + //AWGN sigma2_dB = 20*log10((double)AMP/4)-SNR; sigma2 = pow(10,sigma2_dB/10); @@ -762,8 +739,8 @@ int main(int argc, char **argv) UE->prs_cfg.PRSResourceSetPeriod[0]=40; // PRS resource slot period UE->prs_cfg.PRSResourceSetPeriod[1]=0; // resource slot offset UE->prs_cfg.SymbolStart=7; - UE->prs_cfg.NumPRSSymbols=6; - UE->prs_cfg.NumRB=8; + UE->prs_cfg.NumPRSSymbols=4; + UE->prs_cfg.NumRB=273; UE->prs_cfg.RBOffset=0; UE->prs_cfg.CombSize=4; UE->prs_cfg.REOffset=0; From edfe8c55cf20b5137c7a484d8df1f3431ee6dd9f Mon Sep 17 00:00:00 2001 From: Rakesh Mundlamuri Date: Tue, 25 Jan 2022 13:40:38 +0100 Subject: [PATCH 036/135] bugfix --- openair1/SCHED_NR/phy_procedures_nr_gNB.c | 10 +++++----- openair1/SCHED_NR/sched_nr.h | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index 20a4672caf..d55f2ae38b 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -106,7 +106,7 @@ void nr_common_signal_procedures (PHY_VARS_gNB *gNB,int frame,int slot,nfapi_nr_ prs_data.PRSResourceSetPeriod[1]=0; // resource slot offset prs_data.SymbolStart=7; prs_data.NumPRSSymbols=6; - prs_data.NumRB=273; + prs_data.NumRB=fp->N_RB_DL; prs_data.RBOffset=0; prs_data.CombSize=4; prs_data.REOffset=0; @@ -145,8 +145,8 @@ void nr_common_signal_procedures (PHY_VARS_gNB *gNB,int frame,int slot,nfapi_nr_ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB, int frame,int slot, - int do_meas, - nfapi_nr_dl_tti_ssb_pdu ssb_pdu) { + int do_meas + ) { int aa; NR_DL_FRAME_PARMS *fp=&gNB->frame_parms; nfapi_nr_config_request_scf_t *cfg = &gNB->gNB_config; @@ -230,7 +230,7 @@ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB, } } - //TODO: nr_generate_prs + /*//TODO: nr_generate_prs // check if we have prs to transmit in this frame and slot prs_data_t prs_data; prs_data.PRSResourceSetPeriod[0]=40; // PRS resource slot period @@ -249,7 +249,7 @@ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB, // tbc nr_generate_prs(gNB->nr_gold_prs[slot],&txdataF[0][txdataF_offset], AMP, &prs_data, cfg, fp); - + */ if (do_meas==1) stop_meas(&gNB->phy_proc_tx); diff --git a/openair1/SCHED_NR/sched_nr.h b/openair1/SCHED_NR/sched_nr.h index 0002eb8d50..5e31c08d38 100644 --- a/openair1/SCHED_NR/sched_nr.h +++ b/openair1/SCHED_NR/sched_nr.h @@ -36,7 +36,7 @@ void fill_ul_rb_mask(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx); void nr_set_ssb_first_subcarrier(nfapi_nr_config_request_scf_t *cfg, NR_DL_FRAME_PARMS *fp); -void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB, int frame_tx, int slot_tx, int do_meas,nfapi_nr_dl_tti_ssb_pdu ssb_pdu); +void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB, int frame_tx, int slot_tx, int do_meas); void phy_procedures_gNB_common_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx); int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx); void L1_nr_prach_procedures(PHY_VARS_gNB *gNB,int frame,int slot); From ea8d27a2411b1555de938b5d1a41365d4cebd2a7 Mon Sep 17 00:00:00 2001 From: Sagar Parsawar Date: Wed, 26 Jan 2022 14:46:26 +0100 Subject: [PATCH 037/135] OAI UE: PRS Time domain IR and UE procedures function call --- .../nr_dl_channel_estimation.c | 26 ++++++++++++++----- openair1/SCHED_NR/phy_procedures_nr_gNB.c | 11 ++++---- openair1/SCHED_NR_UE/phy_procedures_nr_ue.c | 26 +++++++++++++++++-- 3 files changed, 49 insertions(+), 14 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 f9795686a0..96b8a95663 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -30,6 +30,7 @@ #include "PHY/NR_TRANSPORT/nr_sch_dmrs.h" #include "PHY/NR_TRANSPORT/nr_transport_proto.h" #include "filt16a_32.h" +#include "T.h" //#define DEBUG_PDSCH //#define DEBUG_PDCCH @@ -52,12 +53,13 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, uint32_t **nr_gold_prs = ue->nr_gold_prs[proc->nr_slot_rx]; prs_data_t *prs_cfg = &ue->prs_cfg; + uint8_t rxAnt = 0; // ant 0 rxdataF for now int16_t *prs_chest, ch[2] = {0}, *rxF, *pil, *fl,*fm, *fmm, *fml, *fmr, *fr, mod_prs[NR_MAX_PRS_LENGTH<<1]; int16_t k_prime = 0, k = 0, re_offset; uint8_t idx = prs_cfg->NPRSID; - uint8_t rxAnt = 0; // ant 0 rxdataF for now - int16_t *ch_intrp = (int16_t *)malloc16(frame_params->ofdm_symbol_size*2*sizeof(int16_t)); - AssertFatal(ch_intrp != NULL, "nr_prs_channel_estimation: channel estimate buffer initialization failed!!"); + int16_t *ch_intrp = (int16_t *)malloc16(frame_params->ofdm_symbol_size*sizeof(int32_t)); + int32_t *ch_time = (int32_t *)malloc16(frame_params->ofdm_symbol_size*sizeof(int32_t)); + AssertFatal(((ch_intrp != NULL) || (ch_time != NULL)), "nr_prs_channel_estimation: channel estimate buffer initialization failed!!"); int16_t *ch_init = ch_intrp; for(int l = prs_cfg->SymbolStart; l < prs_cfg->SymbolStart+prs_cfg->NumPRSSymbols; l++) @@ -303,6 +305,11 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, ch_intrp, 16); } + else + { + printf("NR_PRS UE Channel EStimation: CombSize other than 2 and 4 are NOT supported currently! Returning"); + return(0); + } ch_intrp = ch_init; for (int re = 0; re < prs_cfg->NumRB*12; re++) @@ -356,12 +363,19 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, idft(idftsizeidx, (int16_t *)&ue->prs_ch_estimates[rxAnt][l*frame_params->ofdm_symbol_size], - (int16_t *)&ue->prs_ch_estimates_time[rxAnt][l*frame_params->ofdm_symbol_size],1); + (int16_t *)&ch_time[0],1); + memcpy((int16_t *)&ue->prs_ch_estimates_time[rxAnt][l*frame_params->ofdm_symbol_size], &ch_time[frame_params->ofdm_symbol_size>>1], (frame_params->ofdm_symbol_size>>1)*sizeof(int32_t)); + memcpy((int16_t *)&ue->prs_ch_estimates_time[rxAnt][l*frame_params->ofdm_symbol_size + (frame_params->ofdm_symbol_size>>1)], &ch_time[0], (frame_params->ofdm_symbol_size>>1)*sizeof(int32_t)); } //for l - LOG_M("prsEst.m","prs_chest",&ue->prs_ch_estimates[rxAnt][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], frame_params->ofdm_symbol_size,1,1); - LOG_M("prsEst_time.m","prs_chest_time",&ue->prs_ch_estimates_time[rxAnt][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], frame_params->ofdm_symbol_size,1,1); + LOG_M("rxSigF.m","rxF",&rxdataF[rxAnt][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], prs_cfg->NumPRSSymbols*frame_params->ofdm_symbol_size,1,1); + LOG_M("prsEstF.m","prs_chest",&ue->prs_ch_estimates[rxAnt][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], prs_cfg->NumPRSSymbols*frame_params->ofdm_symbol_size,1,1); + LOG_M("prsEstT.m","prs_chest_time",&ue->prs_ch_estimates_time[rxAnt][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], prs_cfg->NumPRSSymbols*frame_params->ofdm_symbol_size,1,1); + + T(T_UE_PHY_DL_CHANNEL_ESTIMATE, T_INT(0), + T_INT(proc->frame_rx), T_INT(proc->nr_slot_rx), + T_INT(0), T_BUFFER(&ue->prs_ch_estimates[rxAnt][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], frame_params->ofdm_symbol_size*sizeof(int32_t))); return(0); } diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index 59dde99b2d..68e7c40f02 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -83,14 +83,14 @@ void nr_common_signal_procedures (PHY_VARS_gNB *gNB,int frame,int slot,nfapi_nr_ n_hf=1; ssb_index = ssb_pdu.ssb_pdu_rel15.SsbBlockIndex; - LOG_D(PHY,"common_signal_procedures: frame %d, slot %d ssb index %d\n",frame,slot,ssb_index); + LOG_I(PHY,"common_signal_procedures: frame %d, slot %d ssb index %d\n",frame,slot,ssb_index); int ssb_start_symbol_abs = nr_get_ssb_start_symbol(fp,ssb_index); // computing the starting symbol for current ssb ssb_start_symbol = ssb_start_symbol_abs % fp->symbols_per_slot; // start symbol wrt slot nr_set_ssb_first_subcarrier(cfg, fp); // setting the first subcarrier - LOG_D(PHY,"SS TX: frame %d, slot %d, start_symbol %d\n",frame,slot, ssb_start_symbol); + LOG_I(PHY,"SS TX: frame %d, slot %d, start_symbol %d\n",frame,slot, ssb_start_symbol); nr_generate_pss(gNB->d_pss, &txdataF[0][txdataF_offset], AMP, ssb_start_symbol, cfg, fp); nr_generate_sss(gNB->d_sss, &txdataF[0][txdataF_offset], AMP, ssb_start_symbol, cfg, fp); @@ -140,6 +140,8 @@ void nr_common_signal_procedures (PHY_VARS_gNB *gNB,int frame,int slot,nfapi_nr_ AMP, ssb_start_symbol, n_hf, frame, cfg, fp); + + LOG_M("txsigF0.m","txsF0", gNB->common_vars.txdataF[0],fp->samples_per_subframe_wCP,1,1); } @@ -152,10 +154,6 @@ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB, nfapi_nr_config_request_scf_t *cfg = &gNB->gNB_config; int offset = gNB->CC_id; int txdataF_offset = (slot%2)*fp->samples_per_slot_wCP; - - // defining inputs and initials for nr_generate_prs() - int **txdataF = gNB->common_vars.txdataF; - if ((cfg->cell_config.frame_duplex_type.value == TDD) && (nr_slot_select(cfg,frame,slot) == NR_UPLINK_SLOT)) return; @@ -247,6 +245,7 @@ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB, prs_data.NPRSID=0; // tbc + int **txdataF = gNB->common_vars.txdataF; nr_generate_prs(gNB->nr_gold_prs[slot],&txdataF[0][txdataF_offset], AMP, &prs_data, cfg, fp); */ diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c index 3908373891..0bee6db8f7 100644 --- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c +++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c @@ -1716,8 +1716,6 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue, #if UE_TIMING_TRACE stop_meas(&ue->dlsch_channel_estimation_stats); #endif - //PRS channel estimation - nr_prs_channel_estimation(ue,proc,fp); } nr_ue_rsrp_measurements(ue, gNB_id, proc, nr_slot_rx, 0); @@ -1742,6 +1740,30 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue, nr_ue_rrc_measurements(ue, proc, nr_slot_rx); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP_PBCH, VCD_FUNCTION_OUT); } + + ue->prs_cfg.PRSResourceSetPeriod[0]=40; // PRS resource slot period + ue->prs_cfg.PRSResourceSetPeriod[1]=0; // resource slot offset + ue->prs_cfg.SymbolStart=7; + ue->prs_cfg.NumPRSSymbols=4; + ue->prs_cfg.NumRB=fp->N_RB_DL; + ue->prs_cfg.RBOffset=0; + ue->prs_cfg.CombSize=4; + ue->prs_cfg.REOffset=0; + ue->prs_cfg.PRSResourceOffset=0; + ue->prs_cfg.PRSResourceRepetition=1; + ue->prs_cfg.PRSResourceTimeGap=1; + ue->prs_cfg.NPRSID=0; + + for(int j = ue->prs_cfg.SymbolStart; j < (ue->prs_cfg.SymbolStart + ue->prs_cfg.NumPRSSymbols); j++) + { + nr_slot_fep(ue, + proc, + j, + nr_slot_rx); + } + + //PRS channel estimation + nr_prs_channel_estimation(ue,proc,fp); } if ((frame_rx%64 == 0) && (nr_slot_rx==0)) { From c846f16ee0b5ff61d7010720d08c50d0b10ae9d3 Mon Sep 17 00:00:00 2001 From: Sagar Parsawar Date: Thu, 27 Jan 2022 12:05:50 +0100 Subject: [PATCH 038/135] Changing printf to LOG_I --- openair1/PHY/NR_TRANSPORT/nr_prs.c | 22 +++++++------------ .../nr_dl_channel_estimation.c | 18 +++++++-------- openair1/SCHED_NR/phy_procedures_nr_gNB.c | 2 +- openair1/SCHED_NR_UE/phy_procedures_nr_ue.c | 2 +- 4 files changed, 19 insertions(+), 25 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_prs.c b/openair1/PHY/NR_TRANSPORT/nr_prs.c index 6326863aad..55111333d8 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_prs.c +++ b/openair1/PHY/NR_TRANSPORT/nr_prs.c @@ -4,8 +4,8 @@ #include "PHY/NR_REFSIG/nr_refsig.h" #include "PHY/sse_intrin.h" -#define DEBUG_PRS_MOD -#define DEBUG_PRS_MAP +//#define DEBUG_PRS_MOD +//#define DEBUG_PRS_MAP extern short nr_qpsk_mod_table[8]; @@ -29,10 +29,8 @@ int nr_generate_prs(uint32_t **nr_gold_prs, int16_t mod_prs[NR_MAX_PRS_LENGTH<<1]; uint8_t idx=prs_data->NPRSID; - // PRS resource mapping with combsize=k which means PRS symbols exist in every k-th subcarrier in frequency domain // According to ts138.211 sec.7.4.1.7.2 - for (int l = prs_data->SymbolStart; l < prs_data->SymbolStart + prs_data->NumPRSSymbols; l++) { int symInd = l-prs_data->SymbolStart; @@ -50,31 +48,28 @@ int nr_generate_prs(uint32_t **nr_gold_prs, } k = (prs_data->REOffset+k_prime) % prs_data->CombSize + frame_parms->first_carrier_offset ; - - // QPSK modulation - for (int m = 0; m < (12/prs_data->CombSize) * prs_data->NumRB; m++) { idx = (((nr_gold_prs[l][(m<<1)>>5])>>((m<<1)&0x1f))&3); mod_prs[m<<1] = nr_qpsk_mod_table[idx<<1]; mod_prs[(m<<1)+1] = nr_qpsk_mod_table[(idx<<1) + 1]; #ifdef DEBUG_PRS_MOD -printf("m %d idx %d gold seq %d mod_prs %d %d\n", m, idx, nr_gold_prs[l][(m<<1)>>5], mod_prs[m<<1], mod_prs[(m<<1)+1]); + LOG_D("m %d idx %d gold seq %d mod_prs %d %d\n", m, idx, nr_gold_prs[l][(m<<1)>>5], mod_prs[m<<1], mod_prs[(m<<1)+1]); #endif #ifdef DEBUG_PRS_MAP -printf("m %d at k %d of l %d reIdx %d\n", m, k, l, (l*frame_parms->ofdm_symbol_size + k)<<1); + LOG_D("m %d at k %d of l %d reIdx %d\n", m, k, l, (l*frame_parms->ofdm_symbol_size + k)<<1); #endif ((int16_t *)txdataF)[(l*frame_parms->ofdm_symbol_size + k)<<1] = (amp * mod_prs[m<<1]) >> 15; ((int16_t *)txdataF)[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = (amp * mod_prs[(m<<1) + 1]) >> 15; #ifdef DEBUG_PRS_MAP -printf("(%d,%d)\n", -((int16_t *)txdataF)[(l*frame_parms->ofdm_symbol_size + k)<<1], -((int16_t *)txdataF)[((l*frame_parms->ofdm_symbol_size + k)<<1)+1]); + LOG_D("(%d,%d)\n", + ((int16_t *)txdataF)[(l*frame_parms->ofdm_symbol_size + k)<<1], + ((int16_t *)txdataF)[((l*frame_parms->ofdm_symbol_size + k)<<1)+1]); #endif k = k + prs_data->CombSize; @@ -83,8 +78,7 @@ printf("(%d,%d)\n", k-=frame_parms->ofdm_symbol_size; } } -LOG_M("nr_prs.m", "prs",(int16_t *)&txdataF[0],frame_parms->samples_per_slot_wCP, 1, 1); -printf("first carrier offset: %d \n",frame_parms->first_carrier_offset); + LOG_M("nr_prs.m", "prs",(int16_t *)&txdataF[0],frame_parms->samples_per_slot_wCP, 1, 1); return 0; } 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 96b8a95663..839ab1d702 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -81,7 +81,7 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, //re_offset k = re_offset = (prs_cfg->REOffset+k_prime) % prs_cfg->CombSize + frame_params->first_carrier_offset; - printf("PRS config l %d k_prime %d, re_offset %d :\nprs_cfg->SymbolStart %d\nprs_cfg->NumPRSSymbols %d\nprs_cfg->NumRB %d\nprs_cfg->CombSize %d\n", l, k_prime, re_offset, prs_cfg->SymbolStart, prs_cfg->NumPRSSymbols, prs_cfg->NumRB, prs_cfg->CombSize); + LOG_D("PRS config l %d k_prime %d, re_offset %d :\nprs_cfg->SymbolStart %d\nprs_cfg->NumPRSSymbols %d\nprs_cfg->NumRB %d\nprs_cfg->CombSize %d\n", l, k_prime, re_offset, prs_cfg->SymbolStart, prs_cfg->NumPRSSymbols, prs_cfg->NumRB, prs_cfg->CombSize); // Pilots generation and modulation for (int m = 0; m < (12/prs_cfg->CombSize)*prs_cfg->NumRB; m++) @@ -121,7 +121,7 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, break; default: - printf("nr=prs channel_estimation: k_prime=%d -> ERROR\n",k_prime); + LOG_I("nr=prs channel_estimation: k_prime=%d -> ERROR\n",k_prime); return(-1); break; } @@ -236,7 +236,7 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, break; default: - printf("nr=prs channel_estimation: k_prime=%d -> ERROR\n",k_prime); + LOG_I("nr=prs channel_estimation: k_prime=%d -> ERROR\n",k_prime); return(-1); break; } @@ -307,7 +307,7 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, } else { - printf("NR_PRS UE Channel EStimation: CombSize other than 2 and 4 are NOT supported currently! Returning"); + LOG_I("NR_PRS UE Channel EStimation: CombSize other than 2 and 4 are NOT supported currently! Returning"); return(0); } @@ -316,7 +316,7 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, { prs_chest[re_offset] = ch_intrp[re<<1]; prs_chest[re_offset+1] = ch_intrp[(re<<1)+1]; - printf("prs_ch[%d] %d %d\n", re_offset, ch_intrp[re<<1], ch_intrp[(re<<1)+1]); + LOG_D("prs_ch[%d] %d %d\n", re_offset, ch_intrp[re<<1], ch_intrp[(re<<1)+1]); re_offset = (re_offset+1) % frame_params->ofdm_symbol_size; } @@ -357,7 +357,7 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, break; default: - printf("unsupported ofdm symbol size \n"); + LOG_I("unsupported ofdm symbol size \n"); assert(0); } @@ -369,9 +369,9 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, memcpy((int16_t *)&ue->prs_ch_estimates_time[rxAnt][l*frame_params->ofdm_symbol_size + (frame_params->ofdm_symbol_size>>1)], &ch_time[0], (frame_params->ofdm_symbol_size>>1)*sizeof(int32_t)); } //for l - LOG_M("rxSigF.m","rxF",&rxdataF[rxAnt][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], prs_cfg->NumPRSSymbols*frame_params->ofdm_symbol_size,1,1); - LOG_M("prsEstF.m","prs_chest",&ue->prs_ch_estimates[rxAnt][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], prs_cfg->NumPRSSymbols*frame_params->ofdm_symbol_size,1,1); - LOG_M("prsEstT.m","prs_chest_time",&ue->prs_ch_estimates_time[rxAnt][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], prs_cfg->NumPRSSymbols*frame_params->ofdm_symbol_size,1,1); + LOG_M("rxSigF.m","rxF",&rxdataF[rxAnt][0], frame_params->symbols_per_slot*frame_params->ofdm_symbol_size,1,1); + LOG_M("prsEstF.m","prs_chestF",&ue->prs_ch_estimates[rxAnt][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], prs_cfg->NumPRSSymbols*frame_params->ofdm_symbol_size,1,1); + LOG_M("prsEstT.m","prs_chestT",&ue->prs_ch_estimates_time[rxAnt][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], prs_cfg->NumPRSSymbols*frame_params->ofdm_symbol_size,1,1); T(T_UE_PHY_DL_CHANNEL_ESTIMATE, T_INT(0), T_INT(proc->frame_rx), T_INT(proc->nr_slot_rx), diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index 68e7c40f02..11a19cc189 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -141,7 +141,7 @@ void nr_common_signal_procedures (PHY_VARS_gNB *gNB,int frame,int slot,nfapi_nr_ ssb_start_symbol, n_hf, frame, cfg, fp); - LOG_M("txsigF0.m","txsF0", gNB->common_vars.txdataF[0],fp->samples_per_subframe_wCP,1,1); + LOG_M("txsigF0.m","txsF0", gNB->common_vars.txdataF[txdataF_offset],fp->samples_per_subframe_wCP,1,1); } diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c index 0bee6db8f7..321a7b0d5d 100644 --- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c +++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c @@ -1758,7 +1758,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue, { nr_slot_fep(ue, proc, - j, + (j%fp->symbols_per_slot), nr_slot_rx); } From e4767dbd5bc8b198ba77a54c0de7b0735ff54155 Mon Sep 17 00:00:00 2001 From: Sagar Parsawar Date: Thu, 27 Jan 2022 12:23:27 +0100 Subject: [PATCH 039/135] fixed compilation error on OAI UE --- .../PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 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 839ab1d702..bb49846221 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -81,7 +81,7 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, //re_offset k = re_offset = (prs_cfg->REOffset+k_prime) % prs_cfg->CombSize + frame_params->first_carrier_offset; - LOG_D("PRS config l %d k_prime %d, re_offset %d :\nprs_cfg->SymbolStart %d\nprs_cfg->NumPRSSymbols %d\nprs_cfg->NumRB %d\nprs_cfg->CombSize %d\n", l, k_prime, re_offset, prs_cfg->SymbolStart, prs_cfg->NumPRSSymbols, prs_cfg->NumRB, prs_cfg->CombSize); + LOG_D(PHY, "PRS config l %d k_prime %d, re_offset %d :\nprs_cfg->SymbolStart %d\nprs_cfg->NumPRSSymbols %d\nprs_cfg->NumRB %d\nprs_cfg->CombSize %d\n", l, k_prime, re_offset, prs_cfg->SymbolStart, prs_cfg->NumPRSSymbols, prs_cfg->NumRB, prs_cfg->CombSize); // Pilots generation and modulation for (int m = 0; m < (12/prs_cfg->CombSize)*prs_cfg->NumRB; m++) @@ -121,7 +121,7 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, break; default: - LOG_I("nr=prs channel_estimation: k_prime=%d -> ERROR\n",k_prime); + LOG_I(PHY, "nr=prs channel_estimation: k_prime=%d -> ERROR\n",k_prime); return(-1); break; } @@ -236,7 +236,7 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, break; default: - LOG_I("nr=prs channel_estimation: k_prime=%d -> ERROR\n",k_prime); + LOG_I(PHY, "nr=prs channel_estimation: k_prime=%d -> ERROR\n",k_prime); return(-1); break; } @@ -307,7 +307,7 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, } else { - LOG_I("NR_PRS UE Channel EStimation: CombSize other than 2 and 4 are NOT supported currently! Returning"); + LOG_I(PHY, "NR_PRS UE Channel EStimation: CombSize other than 2 and 4 are NOT supported currently! Returning"); return(0); } @@ -316,7 +316,7 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, { prs_chest[re_offset] = ch_intrp[re<<1]; prs_chest[re_offset+1] = ch_intrp[(re<<1)+1]; - LOG_D("prs_ch[%d] %d %d\n", re_offset, ch_intrp[re<<1], ch_intrp[(re<<1)+1]); + LOG_D(PHY, "prs_ch[%d] %d %d\n", re_offset, ch_intrp[re<<1], ch_intrp[(re<<1)+1]); re_offset = (re_offset+1) % frame_params->ofdm_symbol_size; } @@ -357,7 +357,7 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, break; default: - LOG_I("unsupported ofdm symbol size \n"); + LOG_I(PHY, "unsupported ofdm symbol size \n"); assert(0); } From cfd316411365ea4112f620cb631ef9c4b3e08a6b Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Thu, 27 Jan 2022 14:47:25 +0100 Subject: [PATCH 040/135] redoing changes to add channel model to pbchsim --- openair1/SIMULATION/NR_PHY/pbchsim.c | 41 ++++++++++++++++++++++------ 1 file changed, 32 insertions(+), 9 deletions(-) diff --git a/openair1/SIMULATION/NR_PHY/pbchsim.c b/openair1/SIMULATION/NR_PHY/pbchsim.c index 873bd93b0b..9d017ab20c 100644 --- a/openair1/SIMULATION/NR_PHY/pbchsim.c +++ b/openair1/SIMULATION/NR_PHY/pbchsim.c @@ -154,6 +154,7 @@ int main(int argc, char **argv) int **txdata; double **s_re,**s_im,**r_re,**r_im; //double iqim = 0.0; + double DS_TDL = .03; double ip =0.0; //unsigned char pbch_pdu[6]; // int sync_pos, sync_pos_slot; @@ -256,6 +257,21 @@ int main(int argc, char **argv) case 'G': channel_model=ETU; break; + + case 'H': + channel_model = TDL_C; + DS_TDL = .030; // 30 ns + break; + + case 'I': + channel_model = TDL_C; + DS_TDL = .3; // 300ns + break; + + case 'J': + channel_model=TDL_D; + DS_TDL = .03; + break; default: printf("Unsupported channel model! Exiting.\n"); @@ -505,10 +521,8 @@ int main(int argc, char **argv) channel_model, fs, bw, - 300e-9, - 0, - 0, - 0, 0); + DS_TDL, + 0, 0, 0, 0); if (gNB2UE==NULL) { printf("Problem generating channel model. Exiting.\n"); @@ -656,8 +670,8 @@ int main(int argc, char **argv) for (i=0; inb_antennas_tx; aa++) { - r_re[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)]); - r_im[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)+1]); + s_re[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)]); + s_im[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)+1]); } } @@ -667,9 +681,18 @@ int main(int argc, char **argv) n_errors_payload = 0; for (trial=0; trialnb_antennas_tx; aa++) { + memcpy(r_re[aa],s_re[aa],frame_length_complex_samples*sizeof(double)); + memcpy(r_im[aa],s_im[aa],frame_length_complex_samples*sizeof(double)); + } + } + //AWGN sigma2_dB = 20*log10((double)AMP/4)-SNR; sigma2 = pow(10,sigma2_dB/10); From 1c57a8618c85c1a7b8407c1af63621f3c1583b31 Mon Sep 17 00:00:00 2001 From: Sagar Parsawar Date: Mon, 31 Jan 2022 12:25:52 +0100 Subject: [PATCH 041/135] bug fix for PRS DL channel estimation in OAI UE, added more debug prints --- openair1/PHY/NR_TRANSPORT/nr_prs.c | 2 +- .../nr_dl_channel_estimation.c | 53 ++++++++++++++----- openair1/SCHED_NR/phy_procedures_nr_gNB.c | 4 +- openair1/SIMULATION/NR_PHY/pbchsim.c | 4 +- 4 files changed, 44 insertions(+), 19 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_prs.c b/openair1/PHY/NR_TRANSPORT/nr_prs.c index 55111333d8..079f8d89f1 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_prs.c +++ b/openair1/PHY/NR_TRANSPORT/nr_prs.c @@ -78,7 +78,7 @@ int nr_generate_prs(uint32_t **nr_gold_prs, k-=frame_parms->ofdm_symbol_size; } } - LOG_M("nr_prs.m", "prs",(int16_t *)&txdataF[0],frame_parms->samples_per_slot_wCP, 1, 1); + LOG_M("nr_prs.m", "prs",(int16_t *)&txdataF[prs_data->SymbolStart*frame_parms->ofdm_symbol_size],prs_data->NumPRSSymbols*frame_parms->ofdm_symbol_size, 1, 1); return 0; } 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 bb49846221..83b8422c4b 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -81,8 +81,9 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, //re_offset k = re_offset = (prs_cfg->REOffset+k_prime) % prs_cfg->CombSize + frame_params->first_carrier_offset; - LOG_D(PHY, "PRS config l %d k_prime %d, re_offset %d :\nprs_cfg->SymbolStart %d\nprs_cfg->NumPRSSymbols %d\nprs_cfg->NumRB %d\nprs_cfg->CombSize %d\n", l, k_prime, re_offset, prs_cfg->SymbolStart, prs_cfg->NumPRSSymbols, prs_cfg->NumRB, prs_cfg->CombSize); - +#ifdef DEBUG_PRS_CHEST + printf("PRS config l %d k_prime %d, re_offset %d k %d :\nprs_cfg->SymbolStart %d\nprs_cfg->NumPRSSymbols %d\nprs_cfg->NumRB %d\nprs_cfg->CombSize %d\n", l, k_prime, re_offset, k, prs_cfg->SymbolStart, prs_cfg->NumPRSSymbols, prs_cfg->NumRB, prs_cfg->CombSize); +#endif // Pilots generation and modulation for (int m = 0; m < (12/prs_cfg->CombSize)*prs_cfg->NumRB; m++) { @@ -129,7 +130,9 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, //Start pilot ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); - +#ifdef DEBUG_PRS_CHEST + printf("pilot 0 : rxF - > (%d,%d) addr %p ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); +#endif multadd_real_vector_complex_scalar(fl, ch, ch_intrp, @@ -144,6 +147,9 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, { ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); +#ifdef DEBUG_PRS_CHEST + printf("pilot %d : rxF - > (%d,%d) addr %p ch -> (%d,%d), pil -> (%d,%d) \n", pIdx, rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); +#endif if(pIdx == 1) // 2nd pilot { multadd_real_vector_complex_scalar(fml, @@ -164,6 +170,9 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); +#ifdef DEBUG_PRS_CHEST + printf("pilot %d : rxF - > (%d,%d) addr %p ch -> (%d,%d), pil -> (%d,%d) \n", pIdx+1, rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); +#endif if(pIdx == (prs_cfg->NumRB*(12/prs_cfg->CombSize)-3)) // 2nd last pilot { multadd_real_vector_complex_scalar(fmr, @@ -188,7 +197,9 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, //End pilot ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); - +#ifdef DEBUG_PRS_CHEST + printf("pilot %d : rxF - > (%d,%d) addr %p ch -> (%d,%d), pil -> (%d,%d) \n", prs_cfg->NumRB*(12/prs_cfg->CombSize)-1, rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); +#endif multadd_real_vector_complex_scalar(fr, ch, ch_intrp, @@ -244,7 +255,9 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, //Start pilot ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); - +#ifdef DEBUG_PRS_CHEST + printf("pilot 0 : rxF - > (%d,%d) addr %p ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); +#endif multadd_real_vector_complex_scalar(fl, ch, ch_intrp, @@ -256,7 +269,9 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); - +#ifdef DEBUG_PRS_CHEST + printf("pilot 1 : rxF - > (%d,%d) addr %p ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); +#endif multadd_real_vector_complex_scalar(fml, ch, ch_intrp, @@ -272,7 +287,9 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, { ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); - +#ifdef DEBUG_PRS_CHEST + printf("pilot %d : rxF - > (%d,%d) addr %p ch -> (%d,%d), pil -> (%d,%d) \n", pIdx, rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); +#endif multadd_real_vector_complex_scalar(fmm, ch, ch_intrp, @@ -287,7 +304,9 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, //End pilot ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); - +#ifdef DEBUG_PRS_CHEST + printf("pilot %d : rxF - > (%d,%d) addr %p ch -> (%d,%d), pil -> (%d,%d) \n", prs_cfg->NumRB*(12/prs_cfg->CombSize)-2, rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); +#endif multadd_real_vector_complex_scalar(fmr, ch, ch_intrp, @@ -299,7 +318,9 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); - +#ifdef DEBUG_PRS_CHEST + printf("pilot %d : rxF - > (%d,%d) addr %p ch -> (%d,%d), pil -> (%d,%d) \n", prs_cfg->NumRB*(12/prs_cfg->CombSize)-1, rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); +#endif multadd_real_vector_complex_scalar(fr, ch, ch_intrp, @@ -316,8 +337,10 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, { prs_chest[re_offset] = ch_intrp[re<<1]; prs_chest[re_offset+1] = ch_intrp[(re<<1)+1]; - LOG_D(PHY, "prs_ch[%d] %d %d\n", re_offset, ch_intrp[re<<1], ch_intrp[(re<<1)+1]); - re_offset = (re_offset+1) % frame_params->ofdm_symbol_size; +#ifdef DEBUG_PRS_CHEST + printf("prs_ch[%d] %d %d\n", re_offset, ch_intrp[re<<1], ch_intrp[(re<<1)+1]); +#endif + re_offset = (re_offset+2) % frame_params->ofdm_symbol_size; } // Time domain IMPULSE response @@ -368,14 +391,17 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, memcpy((int16_t *)&ue->prs_ch_estimates_time[rxAnt][l*frame_params->ofdm_symbol_size], &ch_time[frame_params->ofdm_symbol_size>>1], (frame_params->ofdm_symbol_size>>1)*sizeof(int32_t)); memcpy((int16_t *)&ue->prs_ch_estimates_time[rxAnt][l*frame_params->ofdm_symbol_size + (frame_params->ofdm_symbol_size>>1)], &ch_time[0], (frame_params->ofdm_symbol_size>>1)*sizeof(int32_t)); } //for l - - LOG_M("rxSigF.m","rxF",&rxdataF[rxAnt][0], frame_params->symbols_per_slot*frame_params->ofdm_symbol_size,1,1); + LOG_M("PRSpilot.m", "prs_loc", &mod_prs[0], prs_cfg->NumRB*(12/prs_cfg->CombSize),1,1); + LOG_M("rxSigF.m","rxF",&rxdataF[rxAnt][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], prs_cfg->NumPRSSymbols*frame_params->ofdm_symbol_size,1,1); LOG_M("prsEstF.m","prs_chestF",&ue->prs_ch_estimates[rxAnt][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], prs_cfg->NumPRSSymbols*frame_params->ofdm_symbol_size,1,1); LOG_M("prsEstT.m","prs_chestT",&ue->prs_ch_estimates_time[rxAnt][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], prs_cfg->NumPRSSymbols*frame_params->ofdm_symbol_size,1,1); T(T_UE_PHY_DL_CHANNEL_ESTIMATE, T_INT(0), T_INT(proc->frame_rx), T_INT(proc->nr_slot_rx), T_INT(0), T_BUFFER(&ue->prs_ch_estimates[rxAnt][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], frame_params->ofdm_symbol_size*sizeof(int32_t))); + + free(ch_intrp); + free(ch_time); return(0); } @@ -802,7 +828,6 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue, } } } - } return(0); } diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index 11a19cc189..b59aea6c0d 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -83,14 +83,14 @@ void nr_common_signal_procedures (PHY_VARS_gNB *gNB,int frame,int slot,nfapi_nr_ n_hf=1; ssb_index = ssb_pdu.ssb_pdu_rel15.SsbBlockIndex; - LOG_I(PHY,"common_signal_procedures: frame %d, slot %d ssb index %d\n",frame,slot,ssb_index); + LOG_D(PHY,"common_signal_procedures: frame %d, slot %d ssb index %d\n",frame,slot,ssb_index); int ssb_start_symbol_abs = nr_get_ssb_start_symbol(fp,ssb_index); // computing the starting symbol for current ssb ssb_start_symbol = ssb_start_symbol_abs % fp->symbols_per_slot; // start symbol wrt slot nr_set_ssb_first_subcarrier(cfg, fp); // setting the first subcarrier - LOG_I(PHY,"SS TX: frame %d, slot %d, start_symbol %d\n",frame,slot, ssb_start_symbol); + LOG_D(PHY,"SS TX: frame %d, slot %d, start_symbol %d\n",frame,slot, ssb_start_symbol); nr_generate_pss(gNB->d_pss, &txdataF[0][txdataF_offset], AMP, ssb_start_symbol, cfg, fp); nr_generate_sss(gNB->d_sss, &txdataF[0][txdataF_offset], AMP, ssb_start_symbol, cfg, fp); diff --git a/openair1/SIMULATION/NR_PHY/pbchsim.c b/openair1/SIMULATION/NR_PHY/pbchsim.c index 9d017ab20c..3c79b79a0b 100644 --- a/openair1/SIMULATION/NR_PHY/pbchsim.c +++ b/openair1/SIMULATION/NR_PHY/pbchsim.c @@ -763,9 +763,9 @@ int main(int argc, char **argv) UE->prs_cfg.PRSResourceSetPeriod[1]=0; // resource slot offset UE->prs_cfg.SymbolStart=7; UE->prs_cfg.NumPRSSymbols=4; - UE->prs_cfg.NumRB=273; + UE->prs_cfg.NumRB=frame_parms->N_RB_DL; UE->prs_cfg.RBOffset=0; - UE->prs_cfg.CombSize=4; + UE->prs_cfg.CombSize=2; UE->prs_cfg.REOffset=0; UE->prs_cfg.PRSResourceOffset=0; UE->prs_cfg.PRSResourceRepetition=1; From 3f2eaefc47f717892011f3e7ad1d0c7369d68dd8 Mon Sep 17 00:00:00 2001 From: Sagar Parsawar Date: Wed, 2 Feb 2022 17:11:14 +0100 Subject: [PATCH 042/135] OAI UE: PRS channel estimation bug fix for prschestF rearranging in FFT format --- openair1/PHY/NR_TRANSPORT/nr_prs.c | 3 ++- .../nr_dl_channel_estimation.c | 20 ++++++++++--------- openair1/SCHED_NR/phy_procedures_nr_gNB.c | 2 +- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_prs.c b/openair1/PHY/NR_TRANSPORT/nr_prs.c index 079f8d89f1..f162d309a2 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_prs.c +++ b/openair1/PHY/NR_TRANSPORT/nr_prs.c @@ -78,7 +78,8 @@ int nr_generate_prs(uint32_t **nr_gold_prs, k-=frame_parms->ofdm_symbol_size; } } +#ifdef DEBUG_PRS_MAP LOG_M("nr_prs.m", "prs",(int16_t *)&txdataF[prs_data->SymbolStart*frame_parms->ofdm_symbol_size],prs_data->NumPRSSymbols*frame_parms->ofdm_symbol_size, 1, 1); - +#endif return 0; } 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 83b8422c4b..7605e9baf7 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -332,17 +332,18 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, return(0); } + //reset channel pointer ch_intrp = ch_init; +#ifdef DEBUG_PRS_CHEST for (int re = 0; re < prs_cfg->NumRB*12; re++) { - prs_chest[re_offset] = ch_intrp[re<<1]; - prs_chest[re_offset+1] = ch_intrp[(re<<1)+1]; -#ifdef DEBUG_PRS_CHEST - printf("prs_ch[%d] %d %d\n", re_offset, ch_intrp[re<<1], ch_intrp[(re<<1)+1]); -#endif - re_offset = (re_offset+2) % frame_params->ofdm_symbol_size; + printf("prs_ch[%d] %d %d\n", re, ch_intrp[re<<1], ch_intrp[(re<<1)+1]); } - +#endif + // Place PRS channel estimates in rxdataF shifted format + memcpy((int16_t *)&ue->prs_ch_estimates[rxAnt][l*frame_params->ofdm_symbol_size+re_offset], &ch_init[0], (frame_params->ofdm_symbol_size - re_offset)*sizeof(int32_t)); + memcpy((int16_t *)&ue->prs_ch_estimates[rxAnt][l*frame_params->ofdm_symbol_size], &ch_init[2*(frame_params->ofdm_symbol_size - re_offset)], (prs_cfg->NumRB*12-(frame_params->ofdm_symbol_size-re_offset))*sizeof(int32_t)); + // Time domain IMPULSE response idft_size_idx_t idftsizeidx; @@ -391,14 +392,15 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, memcpy((int16_t *)&ue->prs_ch_estimates_time[rxAnt][l*frame_params->ofdm_symbol_size], &ch_time[frame_params->ofdm_symbol_size>>1], (frame_params->ofdm_symbol_size>>1)*sizeof(int32_t)); memcpy((int16_t *)&ue->prs_ch_estimates_time[rxAnt][l*frame_params->ofdm_symbol_size + (frame_params->ofdm_symbol_size>>1)], &ch_time[0], (frame_params->ofdm_symbol_size>>1)*sizeof(int32_t)); } //for l +#ifdef DEBUG_PRS_CHEST LOG_M("PRSpilot.m", "prs_loc", &mod_prs[0], prs_cfg->NumRB*(12/prs_cfg->CombSize),1,1); LOG_M("rxSigF.m","rxF",&rxdataF[rxAnt][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], prs_cfg->NumPRSSymbols*frame_params->ofdm_symbol_size,1,1); LOG_M("prsEstF.m","prs_chestF",&ue->prs_ch_estimates[rxAnt][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], prs_cfg->NumPRSSymbols*frame_params->ofdm_symbol_size,1,1); LOG_M("prsEstT.m","prs_chestT",&ue->prs_ch_estimates_time[rxAnt][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], prs_cfg->NumPRSSymbols*frame_params->ofdm_symbol_size,1,1); - +#endif T(T_UE_PHY_DL_CHANNEL_ESTIMATE, T_INT(0), T_INT(proc->frame_rx), T_INT(proc->nr_slot_rx), - T_INT(0), T_BUFFER(&ue->prs_ch_estimates[rxAnt][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], frame_params->ofdm_symbol_size*sizeof(int32_t))); + T_INT(0), T_BUFFER(&ue->prs_ch_estimates[rxAnt][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], prs_cfg->NumPRSSymbols*frame_params->ofdm_symbol_size*sizeof(int32_t))); free(ch_intrp); free(ch_time); diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index b59aea6c0d..1ecf30f312 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -141,7 +141,7 @@ void nr_common_signal_procedures (PHY_VARS_gNB *gNB,int frame,int slot,nfapi_nr_ ssb_start_symbol, n_hf, frame, cfg, fp); - LOG_M("txsigF0.m","txsF0", gNB->common_vars.txdataF[txdataF_offset],fp->samples_per_subframe_wCP,1,1); + //LOG_M("txsigF0.m","txsF0", gNB->common_vars.txdataF[txdataF_offset],fp->samples_per_subframe_wCP,1,1); } From 12b668e9cb8001c43d43b3de4c3595373f65f610 Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Fri, 4 Feb 2022 16:44:51 +0100 Subject: [PATCH 043/135] fixing a bug in ue-scan-carrier --- executables/nr-ue.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/executables/nr-ue.c b/executables/nr-ue.c index 2e7b2ea0e1..3f4bb54467 100644 --- a/executables/nr-ue.c +++ b/executables/nr-ue.c @@ -641,13 +641,13 @@ static void UE_synch(void *arg) { if (UE->mode != loop_through_memory) UE->rfdevice.trx_set_freq_func(&UE->rfdevice,&openair0_cfg[0],0); } - - break; - - case si: - default: - break; } + break; + + case si: + default: + break; + } } From e5a3bcdc330994d74c3a6add7ac7c23b7e4a62de Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Tue, 8 Feb 2022 12:47:22 +0100 Subject: [PATCH 044/135] nr-ue: fix T tracer T tracer was not functional anymore. because init_tpools() was called before T_Config_Init(). The problem was that init_tpools() creates some threads and T_Config_Init() does call fork() and the child process (which is the one running the softmodem, the parent process is used to monitor it, this is the design of the T tracer, maybe to change at some point, it's too complicated) has no thread after the fork(). The threads created by init_tpools() are gone. Game over. In conclusion: T_Config_Init() has to be called very early in the life of the softmodem, at least before init_tpools(). --- executables/nr-uesoftmodem.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/executables/nr-uesoftmodem.c b/executables/nr-uesoftmodem.c index ddbbbdf52c..7663e9ebd8 100644 --- a/executables/nr-uesoftmodem.c +++ b/executables/nr-uesoftmodem.c @@ -422,11 +422,11 @@ int main( int argc, char **argv ) { get_options (); //Command-line options specific for NRUE get_common_options(SOFTMODEM_5GUE_BIT); - init_tpools(nrUE_params.nr_dlsch_parallel); CONFIG_CLEARRTFLAG(CONFIG_NOEXITONHELP); #if T_TRACER T_Config_Init(); #endif + init_tpools(nrUE_params.nr_dlsch_parallel); //randominit (0); set_taus_seed (0); From 106ff68a95c1147507f334b8a88bf8ad7528bb84 Mon Sep 17 00:00:00 2001 From: Sagar Parsawar Date: Wed, 9 Feb 2022 21:13:31 +0100 Subject: [PATCH 045/135] OAI UE: Peak estimator added for PRS TD impulse response --- .../nr_dl_channel_estimation.c | 102 ++++++++++++------ openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h | 3 + 2 files changed, 73 insertions(+), 32 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 7605e9baf7..e323bef803 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -57,10 +57,13 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, int16_t *prs_chest, ch[2] = {0}, *rxF, *pil, *fl,*fm, *fmm, *fml, *fmr, *fr, mod_prs[NR_MAX_PRS_LENGTH<<1]; int16_t k_prime = 0, k = 0, re_offset; uint8_t idx = prs_cfg->NPRSID; - int16_t *ch_intrp = (int16_t *)malloc16(frame_params->ofdm_symbol_size*sizeof(int32_t)); + int16_t *ch_freq = (int16_t *)malloc16(frame_params->ofdm_symbol_size*sizeof(int32_t)); int32_t *ch_time = (int32_t *)malloc16(frame_params->ofdm_symbol_size*sizeof(int32_t)); - AssertFatal(((ch_intrp != NULL) || (ch_time != NULL)), "nr_prs_channel_estimation: channel estimate buffer initialization failed!!"); - int16_t *ch_init = ch_intrp; + AssertFatal(((ch_freq != NULL) || (ch_time != NULL)), "nr_prs_channel_estimation: channel estimate buffer initialization failed!!"); + int16_t *ch_init = ch_freq; + + int32_t tdoa[NR_MAX_NUM_PRS_SYMB] = {0}; + int32_t ch_pwr[NR_MAX_NUM_PRS_SYMB] = {0}; for(int l = prs_cfg->SymbolStart; l < prs_cfg->SymbolStart+prs_cfg->NumPRSSymbols; l++) { @@ -96,8 +99,8 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, pil = (int16_t *)&mod_prs[0]; rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k]; prs_chest = (int16_t *)&ue->prs_ch_estimates[rxAnt][l*frame_params->ofdm_symbol_size]; - memset(prs_chest,0,4*(ue->frame_parms.ofdm_symbol_size)); - memset(ch_intrp,0,4*(ue->frame_parms.ofdm_symbol_size)); + memset(prs_chest,0,sizeof(int32_t)*(ue->frame_parms.ofdm_symbol_size)); + memset(ch_freq,0,sizeof(int32_t)*(ue->frame_parms.ofdm_symbol_size)); if(prs_cfg->CombSize == 2) { @@ -135,7 +138,7 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, #endif multadd_real_vector_complex_scalar(fl, ch, - ch_intrp, + ch_freq, 8); pil +=2; @@ -154,14 +157,14 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, { multadd_real_vector_complex_scalar(fml, ch, - ch_intrp, + ch_freq, 8); } else { multadd_real_vector_complex_scalar(fm, ch, - ch_intrp, + ch_freq, 8); } pil +=2; @@ -177,21 +180,21 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, { multadd_real_vector_complex_scalar(fmr, ch, - ch_intrp, + ch_freq, 8); } else { multadd_real_vector_complex_scalar(fmm, ch, - ch_intrp, + ch_freq, 8); } pil +=2; k = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size; rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k]; - ch_intrp +=8; + ch_freq +=8; } //End pilot @@ -202,7 +205,7 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, #endif multadd_real_vector_complex_scalar(fr, ch, - ch_intrp, + ch_freq, 8); } @@ -259,9 +262,9 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, printf("pilot 0 : rxF - > (%d,%d) addr %p ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); #endif multadd_real_vector_complex_scalar(fl, - ch, - ch_intrp, - 16); + ch, + ch_freq, + 16); pil +=2; k = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size; @@ -273,14 +276,14 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, printf("pilot 1 : rxF - > (%d,%d) addr %p ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); #endif multadd_real_vector_complex_scalar(fml, - ch, - ch_intrp, - 16); + ch, + ch_freq, + 16); pil +=2; k = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size; rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k]; - ch_intrp +=8; + ch_freq +=8; //Middle pilots for(int pIdx = 2; pIdx < prs_cfg->NumRB*(12/prs_cfg->CombSize)-2; pIdx++) @@ -291,14 +294,13 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, printf("pilot %d : rxF - > (%d,%d) addr %p ch -> (%d,%d), pil -> (%d,%d) \n", pIdx, rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); #endif multadd_real_vector_complex_scalar(fmm, - ch, - ch_intrp, - 16); - + ch, + ch_freq, + 16); pil +=2; k = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size; rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k]; - ch_intrp +=8; + ch_freq +=8; } //End pilot @@ -308,10 +310,9 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, printf("pilot %d : rxF - > (%d,%d) addr %p ch -> (%d,%d), pil -> (%d,%d) \n", prs_cfg->NumRB*(12/prs_cfg->CombSize)-2, rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); #endif multadd_real_vector_complex_scalar(fmr, - ch, - ch_intrp, - 16); - + ch, + ch_freq, + 16); pil +=2; k = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size; rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k]; @@ -323,7 +324,7 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, #endif multadd_real_vector_complex_scalar(fr, ch, - ch_intrp, + ch_freq, 16); } else @@ -333,11 +334,11 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, } //reset channel pointer - ch_intrp = ch_init; + ch_freq = ch_init; #ifdef DEBUG_PRS_CHEST for (int re = 0; re < prs_cfg->NumRB*12; re++) { - printf("prs_ch[%d] %d %d\n", re, ch_intrp[re<<1], ch_intrp[(re<<1)+1]); + printf("prs_ch[%d] %d %d\n", re, ch_freq[re<<1], ch_freq[(re<<1)+1]); } #endif // Place PRS channel estimates in rxdataF shifted format @@ -389,24 +390,61 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, (int16_t *)&ue->prs_ch_estimates[rxAnt][l*frame_params->ofdm_symbol_size], (int16_t *)&ch_time[0],1); + // rearrange impulse response memcpy((int16_t *)&ue->prs_ch_estimates_time[rxAnt][l*frame_params->ofdm_symbol_size], &ch_time[frame_params->ofdm_symbol_size>>1], (frame_params->ofdm_symbol_size>>1)*sizeof(int32_t)); memcpy((int16_t *)&ue->prs_ch_estimates_time[rxAnt][l*frame_params->ofdm_symbol_size + (frame_params->ofdm_symbol_size>>1)], &ch_time[0], (frame_params->ofdm_symbol_size>>1)*sizeof(int32_t)); + + // peak estimator + peak_estimator(&ue->prs_ch_estimates_time[rxAnt][l*frame_params->ofdm_symbol_size], + frame_params->ofdm_symbol_size, + &tdoa[l], + &ch_pwr[l]); + LOG_I(PHY, "TDoA for PRS symbol %d ==> %d, Channel power %.1f dB\n", l, tdoa[l]-(frame_params->ofdm_symbol_size>>1), 10*log10(ch_pwr[l])); } //for l + #ifdef DEBUG_PRS_CHEST LOG_M("PRSpilot.m", "prs_loc", &mod_prs[0], prs_cfg->NumRB*(12/prs_cfg->CombSize),1,1); LOG_M("rxSigF.m","rxF",&rxdataF[rxAnt][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], prs_cfg->NumPRSSymbols*frame_params->ofdm_symbol_size,1,1); LOG_M("prsEstF.m","prs_chestF",&ue->prs_ch_estimates[rxAnt][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], prs_cfg->NumPRSSymbols*frame_params->ofdm_symbol_size,1,1); LOG_M("prsEstT.m","prs_chestT",&ue->prs_ch_estimates_time[rxAnt][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], prs_cfg->NumPRSSymbols*frame_params->ofdm_symbol_size,1,1); #endif + + // T tracer dump T(T_UE_PHY_DL_CHANNEL_ESTIMATE, T_INT(0), T_INT(proc->frame_rx), T_INT(proc->nr_slot_rx), T_INT(0), T_BUFFER(&ue->prs_ch_estimates[rxAnt][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], prs_cfg->NumPRSSymbols*frame_params->ofdm_symbol_size*sizeof(int32_t))); - free(ch_intrp); + T(T_UE_PHY_INPUT_SIGNAL, T_INT(0), + T_INT(proc->frame_rx), T_INT(proc->nr_slot_rx), + T_INT(0), T_BUFFER(&ue->prs_ch_estimates_time[rxAnt][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], prs_cfg->NumPRSSymbols*frame_params->ofdm_symbol_size*sizeof(int32_t))); + + free(ch_freq); free(ch_time); return(0); } +static inline int abs32(int x) +{ + return (((int)((short*)&x)[0])*((int)((short*)&x)[0]) + ((int)((short*)&x)[1])*((int)((short*)&x)[1])); +} + +/* Generic function to find the peak of channel estimation buffer */ +void peak_estimator(int32_t *buffer, int32_t buf_len, int32_t *peak_idx, int32_t *peak_val) +{ + int32_t max_val = 0, max_idx = 0, abs_val = 0; + for(int k = 0; k < buf_len; k++) + { + abs_val = abs32(buffer[k]); + if(abs_val > max_val) + { + max_val = abs_val; + max_idx = k; + } + } + *peak_val = max_val; + *peak_idx = max_idx; +} + int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, uint8_t gNB_id, diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h b/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h index f53ea06348..0423218097 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h @@ -37,6 +37,9 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, NR_DL_FRAME_PARMS *frame_params); +/* Generic function to find the peak of channel estimation buffer */ +void peak_estimator(int32_t *buffer, int32_t buf_len, int32_t *peak_idx, int32_t *peak_val); + /*! \brief This function performs channel estimation including frequency and temporal interpolation \param ue Pointer to UE PHY variables From 476e9f62d9e151d6c0d7ea5a36a084945ab484d1 Mon Sep 17 00:00:00 2001 From: Sagar Parsawar Date: Wed, 16 Feb 2022 16:29:10 +0100 Subject: [PATCH 046/135] Added PRS parameters to config file for OAI gNB and nrUE --- executables/nr-uesoftmodem.c | 1 + openair1/SCHED_NR/phy_procedures_nr_gNB.c | 6 +- openair1/SCHED_NR_UE/phy_procedures_nr_ue.c | 5 +- openair2/GNB_APP/gnb_app.c | 1 + openair2/GNB_APP/gnb_config.c | 60 +++++++++++++ openair2/GNB_APP/gnb_config.h | 1 + openair2/GNB_APP/gnb_paramdef.h | 3 +- openair2/GNB_APP/prs_nr_paramdef.h | 87 +++++++++++++++++++ openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c | 42 +++++++++ openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h | 2 + .../gnb.sa.band78.fr1.106PRB.usrpb210.conf | 18 ++++ 11 files changed, 220 insertions(+), 6 deletions(-) create mode 100644 openair2/GNB_APP/prs_nr_paramdef.h diff --git a/executables/nr-uesoftmodem.c b/executables/nr-uesoftmodem.c index 7663e9ebd8..091c2f730b 100644 --- a/executables/nr-uesoftmodem.c +++ b/executables/nr-uesoftmodem.c @@ -508,6 +508,7 @@ int main( int argc, char **argv ) { init_symbol_rotation(&UE[CC_id]->frame_parms); init_timeshift_rotation(&UE[CC_id]->frame_parms); init_nr_ue_vars(UE[CC_id], 0, abstraction_flag); + RCconfig_nrUE_prs(UE[CC_id]); } init_openair0(); diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index a6eb596395..c107a3a546 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -100,7 +100,7 @@ void nr_common_signal_procedures (PHY_VARS_gNB *gNB,int frame,int slot,nfapi_nr_ else nr_generate_pbch_dmrs(gNB->nr_gold_pbch_dmrs[0][ssb_index&7],&txdataF[0][txdataF_offset], AMP, ssb_start_symbol, cfg, fp); - +/* prs_data_t prs_data; prs_data.PRSResourceSetPeriod[0]=40; // PRS resource slot period prs_data.PRSResourceSetPeriod[1]=0; // resource slot offset @@ -114,8 +114,8 @@ void nr_common_signal_procedures (PHY_VARS_gNB *gNB,int frame,int slot,nfapi_nr_ prs_data.PRSResourceRepetition=1; prs_data.PRSResourceTimeGap=1; prs_data.NPRSID=0; - - nr_generate_prs(gNB->nr_gold_prs[slot],&txdataF[0][txdataF_offset], AMP, &prs_data, cfg, fp); +*/ + nr_generate_prs(gNB->nr_gold_prs[slot],&txdataF[0][txdataF_offset], AMP, &gNB->prs_cfg, cfg, fp); if (T_ACTIVE(T_GNB_PHY_MIB)) { diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c index 94f2b584cd..2fe72db761 100644 --- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c +++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c @@ -1659,7 +1659,8 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue, nr_ue_rrc_measurements(ue, proc, nr_slot_rx); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP_PBCH, VCD_FUNCTION_OUT); } - + +/* ue->prs_cfg.PRSResourceSetPeriod[0]=40; // PRS resource slot period ue->prs_cfg.PRSResourceSetPeriod[1]=0; // resource slot offset ue->prs_cfg.SymbolStart=7; @@ -1672,7 +1673,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue, ue->prs_cfg.PRSResourceRepetition=1; ue->prs_cfg.PRSResourceTimeGap=1; ue->prs_cfg.NPRSID=0; - +*/ for(int j = ue->prs_cfg.SymbolStart; j < (ue->prs_cfg.SymbolStart + ue->prs_cfg.NumPRSSymbols); j++) { nr_slot_fep(ue, diff --git a/openair2/GNB_APP/gnb_app.c b/openair2/GNB_APP/gnb_app.c index 7d51d95840..d66d5835ab 100644 --- a/openair2/GNB_APP/gnb_app.c +++ b/openair2/GNB_APP/gnb_app.c @@ -183,6 +183,7 @@ void *gNB_app_task(void *args_p) LOG_I(PHY, "%s() Task ready initialize structures\n", __FUNCTION__); RCconfig_NR_L1(); + RCconfig_nr_prs(); if (RC.nb_nr_macrlc_inst>0) RCconfig_nr_macrlc(); diff --git a/openair2/GNB_APP/gnb_config.c b/openair2/GNB_APP/gnb_config.c index 9710dd1814..29ef6d72a8 100644 --- a/openair2/GNB_APP/gnb_config.c +++ b/openair2/GNB_APP/gnb_config.c @@ -54,6 +54,7 @@ #include "nfapi_pnf.h" //#include "L1_paramdef.h" +#include "prs_nr_paramdef.h" #include "L1_nr_paramdef.h" #include "MACRLC_nr_paramdef.h" #include "common/config/config_userapi.h" @@ -602,6 +603,64 @@ void RCconfig_nr_flexran() } } +void RCconfig_nr_prs(void) +{ + uint16_t j; + + paramdef_t PRS_Params[] = PRS_PARAMS_DESC; + paramlist_def_t PRS_ParamList = {GNB_CONFIG_STRING_PRS_CONFIG,NULL,0}; + + if (RC.gNB == NULL) { + RC.gNB = (PHY_VARS_gNB **)malloc((1+NUMBER_OF_gNB_MAX)*sizeof(PHY_VARS_gNB*)); + LOG_I(NR_PHY,"RC.gNB = %p\n",RC.gNB); + memset(RC.gNB,0,(1+NUMBER_OF_gNB_MAX)*sizeof(PHY_VARS_gNB*)); + } + + config_getlist( &PRS_ParamList,PRS_Params,sizeof(PRS_Params)/sizeof(paramdef_t), NULL); + + if (PRS_ParamList.numelt > 0) { + + for (j = 0; j < RC.nb_nr_L1_inst; j++) { + + if (RC.gNB[j] == NULL) { + RC.gNB[j] = (PHY_VARS_gNB *)malloc(sizeof(PHY_VARS_gNB)); + LOG_I(NR_PHY,"RC.gNB[%d] = %p\n",j,RC.gNB[j]); + memset(RC.gNB[j],0,sizeof(PHY_VARS_gNB)); + RC.gNB[j]->Mod_id = j; + } + + RC.gNB[j]->prs_cfg.PRSResourceSetPeriod[0] = *(PRS_ParamList.paramarray[j][PRS_RESOURCE_SET_PERIOD0].uptr); + RC.gNB[j]->prs_cfg.PRSResourceSetPeriod[1] = *(PRS_ParamList.paramarray[j][PRS_RESOURCE_SET_PERIOD1].uptr); + RC.gNB[j]->prs_cfg.SymbolStart = *(PRS_ParamList.paramarray[j][PRS_SYMBOL_START].uptr); + RC.gNB[j]->prs_cfg.NumPRSSymbols = *(PRS_ParamList.paramarray[j][PRS_NUM_SYMBOLS].uptr); + RC.gNB[j]->prs_cfg.NumRB = *(PRS_ParamList.paramarray[j][PRS_NUM_RB].uptr); + RC.gNB[j]->prs_cfg.RBOffset = *(PRS_ParamList.paramarray[j][PRS_RB_OFFSET].uptr); + RC.gNB[j]->prs_cfg.CombSize = *(PRS_ParamList.paramarray[j][PRS_COMB_SIZE].uptr); + RC.gNB[j]->prs_cfg.REOffset = *(PRS_ParamList.paramarray[j][PRS_RE_OFFSET].uptr); + RC.gNB[j]->prs_cfg.PRSResourceOffset = *(PRS_ParamList.paramarray[j][PRS_RESOURCE_OFFSET].uptr); + RC.gNB[j]->prs_cfg.PRSResourceRepetition = *(PRS_ParamList.paramarray[j][PRS_RESOURCE_REPETITION].uptr); + RC.gNB[j]->prs_cfg.PRSResourceTimeGap = *(PRS_ParamList.paramarray[j][PRS_RESOURCE_TIME_GAP].uptr); + + LOG_I(NR_PHY, "PRS Config for gNB_ID %d\n", j); + LOG_I(NR_PHY, "PRSResourceSetPeriod0 %d\n", RC.gNB[j]->prs_cfg.PRSResourceSetPeriod[0]); + LOG_I(NR_PHY, "PRSResourceSetPeriod1 %d\n", RC.gNB[j]->prs_cfg.PRSResourceSetPeriod[1]); + LOG_I(NR_PHY, "SymbolStart %d\n", RC.gNB[j]->prs_cfg.SymbolStart); + LOG_I(NR_PHY, "NumPRSSymbols %d\n", RC.gNB[j]->prs_cfg.NumPRSSymbols); + LOG_I(NR_PHY, "NumRB %d\n", RC.gNB[j]->prs_cfg.NumRB); + LOG_I(NR_PHY, "RBOffset %d\n", RC.gNB[j]->prs_cfg.RBOffset); + LOG_I(NR_PHY, "CombSize %d\n", RC.gNB[j]->prs_cfg.CombSize); + LOG_I(NR_PHY, "REOffset %d\n", RC.gNB[j]->prs_cfg.REOffset); + LOG_I(NR_PHY, "PRSResourceOffset %d\n", RC.gNB[j]->prs_cfg.PRSResourceOffset); + LOG_I(NR_PHY, "PRSResourceRepetition %d\n", RC.gNB[j]->prs_cfg.PRSResourceRepetition); + LOG_I(NR_PHY, "PRSResourceTimeGap %d\n", RC.gNB[j]->prs_cfg.PRSResourceTimeGap); + } // for j + } + else + { + LOG_I(NR_PHY,"No " GNB_CONFIG_STRING_PRS_CONFIG " configuration found\n"); + } +} + void RCconfig_NR_L1(void) { int j; paramdef_t GNBSParams[] = GNBSPARAMS_DESC; @@ -2172,6 +2231,7 @@ void nr_read_config_and_init(void) { uint32_t gnb_nb = RC.nb_nr_inst; RCconfig_NR_L1(); + RCconfig_nr_prs(); set_node_type(); RCconfig_nr_macrlc(); diff --git a/openair2/GNB_APP/gnb_config.h b/openair2/GNB_APP/gnb_config.h index 013997f439..b75277545c 100644 --- a/openair2/GNB_APP/gnb_config.h +++ b/openair2/GNB_APP/gnb_config.h @@ -92,6 +92,7 @@ typedef struct ru_config_s { */ extern void NRRCconfig_RU(void); extern void RCconfig_nr_flexran(void); +extern void RCconfig_nr_prs(void); extern void RCconfig_NR_L1(void); extern void RCconfig_nr_macrlc(void); extern int RCconfig_nr_gtpu(void ); diff --git a/openair2/GNB_APP/gnb_paramdef.h b/openair2/GNB_APP/gnb_paramdef.h index 5b879e04f6..2c4422ef64 100644 --- a/openair2/GNB_APP/gnb_paramdef.h +++ b/openair2/GNB_APP/gnb_paramdef.h @@ -352,7 +352,8 @@ typedef enum { #define CONFIG_STRING_L1_LIST "L1s" #define CONFIG_STRING_L1_CONFIG "l1_config" - +/* PRS configuration section names */ +#define GNB_CONFIG_STRING_PRS_CONFIG "prs_config" /*----------------------------------------------------------------------------------------------------------------------------------------------------*/ diff --git a/openair2/GNB_APP/prs_nr_paramdef.h b/openair2/GNB_APP/prs_nr_paramdef.h new file mode 100644 index 0000000000..4aa2b08a53 --- /dev/null +++ b/openair2/GNB_APP/prs_nr_paramdef.h @@ -0,0 +1,87 @@ +/* + * 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 openair2/GNB_APP/prs_nr_paramdef.f + * \brief definition of configuration parameters for PRS + * \author + * \date 2022 + * \version 0.1 + * \company EURECOM + * \email: + * \note + * \warning + */ + +#ifndef __GNB_APP_PRS_NR_PARAMDEF__H__ +#define __GNB_APP_PRS_NR_PARAMDEF__H__ + +/*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ + + +/* PRS configuration parameters names */ +#define CONFIG_STRING_PRS_RESOURCE_SET_PERIOD0 "PRSResourceSetPeriod0" +#define CONFIG_STRING_PRS_RESOURCE_SET_PERIOD1 "PRSResourceSetPeriod1" +#define CONFIG_STRING_PRS_SYMBOL_START "SymbolStart" +#define CONFIG_STRING_PRS_NUM_SYMBOLS "NumPRSSymbols" +#define CONFIG_STRING_PRS_NUM_RB "NumRB" +#define CONFIG_STRING_PRS_RB_OFFSET "RBOffset" +#define CONFIG_STRING_PRS_COMB_SIZE "CombSize" +#define CONFIG_STRING_PRS_RE_OFFSET "REOffset" +#define CONFIG_STRING_PRS_RESOURCE_OFFSET "PRSResourceOffset" +#define CONFIG_STRING_PRS_RESOURCE_REPETITION "PRSResourceRepetition" +#define CONFIG_STRING_PRS_RESOURCE_TIME_GAP "PRSResourceTimeGap" +#define CONFIG_STRING_PRS_ID "NPRS_ID" + + +/*----------------------------------------------------------------------------------------------------------------------------------------------------*/ +/* PRS configuration parameters */ +/* optname helpstr paramflags XXXptr defXXXval type numelt */ +/*----------------------------------------------------------------------------------------------------------------------------------------------------*/ +#define PRS_PARAMS_DESC { \ +{CONFIG_STRING_PRS_RESOURCE_SET_PERIOD0, NULL, 0, uptr:NULL, defintval:40, TYPE_UINT, 0}, \ +{CONFIG_STRING_PRS_RESOURCE_SET_PERIOD1, NULL, 0, uptr:NULL, defintval:0, TYPE_UINT, 0}, \ +{CONFIG_STRING_PRS_SYMBOL_START, NULL, 0, uptr:NULL, defintval:7, TYPE_UINT, 0}, \ +{CONFIG_STRING_PRS_NUM_SYMBOLS, NULL, 0, uptr:NULL, defintval:4, TYPE_UINT, 0}, \ +{CONFIG_STRING_PRS_NUM_RB, NULL, 0, uptr:NULL, defintval:106, TYPE_UINT, 0}, \ +{CONFIG_STRING_PRS_RB_OFFSET, NULL, 0, uptr:NULL, defintval:0, TYPE_UINT, 0}, \ +{CONFIG_STRING_PRS_COMB_SIZE, NULL, 0, uptr:NULL, defintval:4, TYPE_UINT, 0}, \ +{CONFIG_STRING_PRS_RE_OFFSET, NULL, 0, uptr:NULL, defintval:0, TYPE_UINT, 0}, \ +{CONFIG_STRING_PRS_RESOURCE_OFFSET, NULL, 0, uptr:NULL, defintval:0, TYPE_UINT, 0}, \ +{CONFIG_STRING_PRS_RESOURCE_REPETITION, NULL, 0, uptr:NULL, defintval:1, TYPE_UINT, 0}, \ +{CONFIG_STRING_PRS_RESOURCE_TIME_GAP, NULL, 0, uptr:NULL, defuintval:1, TYPE_UINT, 0}, \ +{CONFIG_STRING_PRS_ID, NULL, 0, uptr:NULL, defintval:0, TYPE_UINT, 0} \ +} + +#define PRS_RESOURCE_SET_PERIOD0 0 +#define PRS_RESOURCE_SET_PERIOD1 1 +#define PRS_SYMBOL_START 2 +#define PRS_NUM_SYMBOLS 3 +#define PRS_NUM_RB 4 +#define PRS_RB_OFFSET 5 +#define PRS_COMB_SIZE 6 +#define PRS_RE_OFFSET 7 +#define PRS_RESOURCE_OFFSET 8 +#define PRS_RESOURCE_REPETITION 9 +#define PRS_RESOURCE_TIME_GAP 10 +#define PRS_ID 11 + +/*----------------------------------------------------------------------------------------------------------------------------------------------------*/ +#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..ff0a20d5b3 100644 --- a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c +++ b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c @@ -39,6 +39,7 @@ #include "executables/softmodem-common.h" #include "openair2/RRC/NR_UE/rrc_proto.h" #include "openair2/GNB_APP/L1_nr_paramdef.h" +#include "openair2/GNB_APP/prs_nr_paramdef.h" #include "openair2/GNB_APP/gnb_paramdef.h" #include "targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h" #include @@ -1274,3 +1275,44 @@ void RCconfig_nr_ue_L1(void) { } } } + +void RCconfig_nrUE_prs(void *cfg) +{ + int j = 0; + PHY_VARS_NR_UE *ue = (PHY_VARS_NR_UE *)cfg; + paramdef_t PRS_Params[] = PRS_PARAMS_DESC; + paramlist_def_t PRS_ParamList = {GNB_CONFIG_STRING_PRS_CONFIG,NULL,0}; + config_getlist( &PRS_ParamList,PRS_Params,sizeof(PRS_Params)/sizeof(paramdef_t), NULL); + printf("Inside RCconfig_nrUE_prs\n"); + + if (PRS_ParamList.numelt > 0) { + ue->prs_cfg.PRSResourceSetPeriod[0] = *(PRS_ParamList.paramarray[j][PRS_RESOURCE_SET_PERIOD0].uptr); + ue->prs_cfg.PRSResourceSetPeriod[1] = *(PRS_ParamList.paramarray[j][PRS_RESOURCE_SET_PERIOD1].uptr); + ue->prs_cfg.SymbolStart = *(PRS_ParamList.paramarray[j][PRS_SYMBOL_START].uptr); + ue->prs_cfg.NumPRSSymbols = *(PRS_ParamList.paramarray[j][PRS_NUM_SYMBOLS].uptr); + ue->prs_cfg.NumRB = *(PRS_ParamList.paramarray[j][PRS_NUM_RB].uptr); + ue->prs_cfg.RBOffset = *(PRS_ParamList.paramarray[j][PRS_RB_OFFSET].uptr); + ue->prs_cfg.CombSize = *(PRS_ParamList.paramarray[j][PRS_COMB_SIZE].uptr); + ue->prs_cfg.REOffset = *(PRS_ParamList.paramarray[j][PRS_RE_OFFSET].uptr); + ue->prs_cfg.PRSResourceOffset = *(PRS_ParamList.paramarray[j][PRS_RESOURCE_OFFSET].uptr); + ue->prs_cfg.PRSResourceRepetition = *(PRS_ParamList.paramarray[j][PRS_RESOURCE_REPETITION].uptr); + ue->prs_cfg.PRSResourceTimeGap = *(PRS_ParamList.paramarray[j][PRS_RESOURCE_TIME_GAP].uptr); + + LOG_I(NR_PHY, "PRS Config for at nrUE %d\n", 0); + LOG_I(NR_PHY, "PRSResourceSetPeriod0 %d\n", ue->prs_cfg.PRSResourceSetPeriod[0]); + LOG_I(NR_PHY, "PRSResourceSetPeriod1 %d\n", ue->prs_cfg.PRSResourceSetPeriod[1]); + LOG_I(NR_PHY, "SymbolStart %d\n", ue->prs_cfg.SymbolStart); + LOG_I(NR_PHY, "NumPRSSymbols %d\n", ue->prs_cfg.NumPRSSymbols); + LOG_I(NR_PHY, "NumRB %d\n", ue->prs_cfg.NumRB); + LOG_I(NR_PHY, "RBOffset %d\n", ue->prs_cfg.RBOffset); + LOG_I(NR_PHY, "CombSize %d\n", ue->prs_cfg.CombSize); + LOG_I(NR_PHY, "REOffset %d\n", ue->prs_cfg.REOffset); + LOG_I(NR_PHY, "PRSResourceOffset %d\n", ue->prs_cfg.PRSResourceOffset); + LOG_I(NR_PHY, "PRSResourceRepetition %d\n", ue->prs_cfg.PRSResourceRepetition); + LOG_I(NR_PHY, "PRSResourceTimeGap %d\n", ue->prs_cfg.PRSResourceTimeGap); + } + else + { + LOG_I(NR_PHY,"No " GNB_CONFIG_STRING_PRS_CONFIG " configuration found\n"); + } +} diff --git a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h index 2a8a514769..f1c881ffc4 100755 --- a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h +++ b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h @@ -278,5 +278,7 @@ int handle_bcch_dlsch(module_id_t module_id, int cc_id, unsigned int gNB_index, int handle_dci(module_id_t module_id, int cc_id, unsigned int gNB_index, frame_t frame, int slot, fapi_nr_dci_indication_pdu_t *dci); +void RCconfig_nrUE_prs(void *cfg); + #endif diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf index d9b62064c1..068d4291c3 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf @@ -43,6 +43,7 @@ gNBs = searchSpaceZero = 0; } ); + servingCellConfigCommon = ( { @@ -214,6 +215,23 @@ MACRLCs = ( } ); +prs_config = ( +{ + PRSResourceSetPeriod0 = 40; + PRSResourceSetPeriod1 = 0; + SymbolStart = 7; + NumPRSSymbols = 4; + NumRB = 106; + RBOffset = 0; + CombSize = 4; + REOffset = 0; + PRSResourceOffset = 0; + PRSResourceRepetition = 1; + PRSResourceTimeGap = 1; + NPRS_ID = 0; +} +); + L1s = ( { num_cc = 1; From 43461149b3ce4c0b839f3eb03651e7814721661c Mon Sep 17 00:00:00 2001 From: Sagar Parsawar Date: Thu, 17 Feb 2022 19:25:10 +0100 Subject: [PATCH 047/135] OAI UE: Created new Ttracer ID for PRS Channel estimates --- common/utils/T/T_messages.txt | 4 ++++ openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/common/utils/T/T_messages.txt b/common/utils/T/T_messages.txt index a8a4f57fcd..72b7632de8 100644 --- a/common/utils/T/T_messages.txt +++ b/common/utils/T/T_messages.txt @@ -1256,6 +1256,10 @@ ID = UE_PHY_DL_CHANNEL_ESTIMATE DESC = UE channel estimation in the time domain GROUP = ALL:PHY:GRAPHIC:HEAVY:UE FORMAT = int,eNB_ID : int,frame : int,subframe : int,antenna : buffer,chest_t +ID = UE_PHY_DL_CHANNEL_ESTIMATE_FREQ + DESC = UE channel estimation in the frequency domain + GROUP = ALL:PHY:GRAPHIC:HEAVY:UE + FORMAT = int,eNB_ID : int,frame : int,subframe : int,antenna : buffer,chestF_t ID = UE_PHY_PDCCH_IQ DESC = UE PDCCH received IQ data GROUP = ALL:PHY:GRAPHIC:HEAVY:UE 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 e323bef803..2b8ac81e12 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -410,11 +410,11 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, #endif // T tracer dump - T(T_UE_PHY_DL_CHANNEL_ESTIMATE, T_INT(0), + T(T_UE_PHY_DL_CHANNEL_ESTIMATE_FREQ, T_INT(0), T_INT(proc->frame_rx), T_INT(proc->nr_slot_rx), T_INT(0), T_BUFFER(&ue->prs_ch_estimates[rxAnt][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], prs_cfg->NumPRSSymbols*frame_params->ofdm_symbol_size*sizeof(int32_t))); - T(T_UE_PHY_INPUT_SIGNAL, T_INT(0), + T(T_UE_PHY_DL_CHANNEL_ESTIMATE, T_INT(0), T_INT(proc->frame_rx), T_INT(proc->nr_slot_rx), T_INT(0), T_BUFFER(&ue->prs_ch_estimates_time[rxAnt][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], prs_cfg->NumPRSSymbols*frame_params->ofdm_symbol_size*sizeof(int32_t))); From c4caff79e85c70ff46823731b4ec9ca4a44a66fa Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Fri, 18 Feb 2022 12:54:16 +0100 Subject: [PATCH 048/135] fixes for FR2 3/4 sampling, adding config file for FR2 132 PRB --- executables/nr-ru.c | 20 +- targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp | 6 + .../CONF/gnb.band257.tm1.132PRB.usrpn300.conf | 263 ++++++++++++++++++ .../CONF/gnb.band257.tm1.32PRB.usrpn300.conf | 8 +- .../CONF/gnb.band257.tm1.66PRB.usrpn300.conf | 17 +- 5 files changed, 299 insertions(+), 15 deletions(-) create mode 100644 targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.132PRB.usrpn300.conf diff --git a/executables/nr-ru.c b/executables/nr-ru.c index 08decf0f67..0240de87bc 100644 --- a/executables/nr-ru.c +++ b/executables/nr-ru.c @@ -982,10 +982,24 @@ void fill_rf_config(RU_t *ru, char *rf_config_file) { } } else if (mu == NR_MU_3) { switch(N_RB) { - case 66: + case 132: if (fp->threequarter_fs) { cfg->sample_rate=184.32e6; cfg->samples_per_frame = 1843200; + cfg->tx_bw = 200e6; + cfg->rx_bw = 200e6; + } else { + cfg->sample_rate = 245.76e6; + cfg->samples_per_frame = 2457600; + cfg->tx_bw = 200e6; + cfg->rx_bw = 200e6; + } + + break; + case 66: + if (fp->threequarter_fs) { + cfg->sample_rate=92.16e6; + cfg->samples_per_frame = 921600; cfg->tx_bw = 100e6; cfg->rx_bw = 100e6; } else { @@ -999,8 +1013,8 @@ void fill_rf_config(RU_t *ru, char *rf_config_file) { case 32: if (fp->threequarter_fs) { - cfg->sample_rate=92.16e6; - cfg->samples_per_frame = 921600; + cfg->sample_rate=46.08e6; + cfg->samples_per_frame = 460800; cfg->tx_bw = 50e6; cfg->rx_bw = 50e6; } else { diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp index d268855566..fdc1f4289e 100644 --- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp +++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp @@ -1109,6 +1109,12 @@ extern "C" { LOG_I(HW,"%s() sample_rate:%u\n", __FUNCTION__, (int)openair0_cfg[0].sample_rate); switch ((int)openair0_cfg[0].sample_rate) { + case 184320000: + // from usrp_time_offset + //openair0_cfg[0].samples_per_packet = 2048; + openair0_cfg[0].tx_sample_advance = 15; //to be checked + break; + case 122880000: // from usrp_time_offset //openair0_cfg[0].samples_per_packet = 2048; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.132PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.132PRB.usrpn300.conf new file mode 100644 index 0000000000..6d86d5ea86 --- /dev/null +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.132PRB.usrpn300.conf @@ -0,0 +1,263 @@ +Active_gNBs = ( "gNB-Eurecom-5GNRBox"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +gNBs = +( + { + ////////// Identification parameters: + gNB_ID = 0xe00; + + cell_type = "CELL_MACRO_GNB"; + + gNB_name = "gNB-Eurecom-5GNRBox"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = 1; + + plmn_list = ({mcc = 208; mnc = 93; mnc_length = 2;}); + + tr_s_preference = "local_mac" + + ////////// Physical parameters: + + ssb_SubcarrierOffset = 0; + pdsch_AntennaPorts = 1; + pusch_AntennaPorts = 1; + + servingCellConfigCommon = ( + { + #spCellConfigCommon + + physCellId = 0; + +# downlinkConfigCommon + #frequencyInfoDL + # this is pointA + 23 PRBs@120kHz SCS (same as initial BWP) + absoluteFrequencySSB = 2078315; + dl_frequencyBand = 257; + # this is 27.900 GHz + dl_absoluteFrequencyPointA = 2077499; + #scs-SpecificCarrierList + dl_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + dl_subcarrierSpacing = 3; + dl_carrierBandwidth = 132; + #initialDownlinkBWP + #genericParameters + # this is RBstart=0,L=50 (275*(L-1))+RBstart + initialDLBWPlocationAndBandwidth = 13475; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + initialDLBWPsubcarrierSpacing = 3; + #pdcch-ConfigCommon + initialDLBWPcontrolResourceSetZero = 12; + initialDLBWPsearchSpaceZero = 0; + + #uplinkConfigCommon + #frequencyInfoUL + ul_frequencyBand = 257; + #scs-SpecificCarrierList + ul_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + ul_subcarrierSpacing = 3; + ul_carrierBandwidth = 132; + pMax = 20; + #initialUplinkBWP + #genericParameters + initialULBWPlocationAndBandwidth = 13475; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + initialULBWPsubcarrierSpacing = 3; + #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 = -118; +#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 = 15; +#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, + + 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 = 3; + ssb_PositionsInBurst_Bitmap = 0x0001000100010001L; + +# 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 = 3; + + + #tdd-UL-DL-ConfigurationCommon +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + referenceSubcarrierSpacing = 3; + # pattern1 + # dl_UL_TransmissionPeriodicity + # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10 + dl_UL_TransmissionPeriodicity = 3; + nrofDownlinkSlots = 7; + nrofDownlinkSymbols = 6; + nrofUplinkSlots = 2 ; + nrofUplinkSymbols = 4; + + ssPBCH_BlockPower = -25; + } + + ); + + + # ------- 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.26"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + NETWORK_INTERFACES : + { + + GNB_INTERFACE_NAME_FOR_S1_MME = "eth0"; + GNB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.111/24"; + GNB_INTERFACE_NAME_FOR_S1U = "eth0"; + GNB_IPV4_ADDRESS_FOR_S1U = "192.168.12.111/24"; + GNB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + } +); + +MACRLCs = ( + { + num_cc = 1; + tr_s_preference = "local_L1"; + tr_n_preference = "local_RRC"; + } +); + +L1s = ( +{ + num_cc = 1; + tr_n_preference = "local_mac"; + thread_pool_size = 8; + ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0 +} +); + +RUs = ( + { + local_rf = "yes" + nb_tx = 1 + nb_rx = 1 + att_tx = 0 + att_rx = 0; + bands = [7]; + max_pdschReferenceSignalPower = -27; + max_rxgain = 75; + eNB_instances = [0]; + sdr_addrs = "addr=192.168.30.2"; + if_freq = 1L; + } +); + +THREAD_STRUCT = ( + { + #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT" + parallel_config = "PARALLEL_RU_L1_TRX_SPLIT"; + #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE" + worker_config = "WORKER_ENABLE"; + } +); + +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"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + }; + diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.32PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.32PRB.usrpn300.conf index fd9399f89e..bdbb3b6597 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.32PRB.usrpn300.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.32PRB.usrpn300.conf @@ -173,7 +173,7 @@ gNBs = ); ///X2 - enable_x2 = "yes"; + enable_x2 = "no"; t_reloc_prep = 1000; /* unit: millisecond */ tx2_reloc_overall = 2000; /* unit: millisecond */ t_dc_prep = 1000; /* unit: millisecond */ @@ -229,10 +229,10 @@ RUs = ( max_pdschReferenceSignalPower = -27; max_rxgain = 75; eNB_instances = [0]; - sdr_addrs = "addr=192.168.10.2,second_addr=192.168.20.2"; + sdr_addrs = "addr=192.168.30.2"; if_freq = 5124520000L; - clock_src = "external"; - time_src = "external"; + clock_src = "internal"; + time_src = "internal"; } ); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.66PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.66PRB.usrpn300.conf index 3fc81c0d6c..3a5963a908 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.66PRB.usrpn300.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.66PRB.usrpn300.conf @@ -121,7 +121,7 @@ gNBs = # ssb_PositionsInBurs_BitmapPR # 1=short, 2=medium, 3=long ssb_PositionsInBurst_PR = 3; - ssb_PositionsInBurst_Bitmap = 1; + ssb_PositionsInBurst_Bitmap = 0x0001000100010001L; # ssb_periodicityServingCell # 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1 @@ -139,15 +139,15 @@ gNBs = #tdd-UL-DL-ConfigurationCommon # subcarrierSpacing # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 - referenceSubcarrierSpacing = 1; + referenceSubcarrierSpacing = 3; # 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 = 30; - nrofDownlinkSymbols = 0; - nrofUplinkSlots = 10; - nrofUplinkSymbols = 0; + dl_UL_TransmissionPeriodicity = 3; + nrofDownlinkSlots = 7; + nrofDownlinkSymbols = 6; + nrofUplinkSlots = 2 ; + nrofUplinkSymbols = 4; ssPBCH_BlockPower = -25; } @@ -212,7 +212,8 @@ RUs = ( max_pdschReferenceSignalPower = -27; max_rxgain = 75; eNB_instances = [0]; - sdr_addrs = "type=n300"; + sdr_addrs = "addr=192.168.30.2"; + if_freq = 1L; } ); From 0fcf8d9c20fe2fff6785386bbfa107031d8d8c3d Mon Sep 17 00:00:00 2001 From: Sagar Parsawar Date: Mon, 21 Feb 2022 15:25:32 +0100 Subject: [PATCH 049/135] Adding usage of PRS RBOffset in the PRS Generation at gNB and Channel estimation at UE --- openair1/PHY/NR_TRANSPORT/nr_prs.c | 2 +- .../NR_UE_ESTIMATION/nr_dl_channel_estimation.c | 4 ++-- .../PROJECTS/GENERIC-NR-5GC/CONF/ue_nr_prs.conf | 16 ++++++++++++++++ 3 files changed, 19 insertions(+), 3 deletions(-) create mode 100644 targets/PROJECTS/GENERIC-NR-5GC/CONF/ue_nr_prs.conf diff --git a/openair1/PHY/NR_TRANSPORT/nr_prs.c b/openair1/PHY/NR_TRANSPORT/nr_prs.c index f162d309a2..711399d501 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_prs.c +++ b/openair1/PHY/NR_TRANSPORT/nr_prs.c @@ -47,7 +47,7 @@ int nr_generate_prs(uint32_t **nr_gold_prs, k_prime = k_prime_table[3][symInd]; } - k = (prs_data->REOffset+k_prime) % prs_data->CombSize + frame_parms->first_carrier_offset ; + k = (prs_data->REOffset+k_prime) % prs_data->CombSize + prs_data->RBOffset*12 + frame_parms->first_carrier_offset; // QPSK modulation for (int m = 0; m < (12/prs_data->CombSize) * prs_data->NumRB; m++) { 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 2b8ac81e12..730768b1c9 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -35,7 +35,7 @@ //#define DEBUG_PDSCH //#define DEBUG_PDCCH //#define DEBUG_CH -//#define DEBUG_PRS_CHEST +#define DEBUG_PRS_CHEST extern short nr_qpsk_mod_table[8]; int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, @@ -82,7 +82,7 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, } //re_offset - k = re_offset = (prs_cfg->REOffset+k_prime) % prs_cfg->CombSize + frame_params->first_carrier_offset; + k = re_offset = (prs_cfg->REOffset+k_prime) % prs_cfg->CombSize + prs_cfg->RBOffset*12 + frame_params->first_carrier_offset; #ifdef DEBUG_PRS_CHEST printf("PRS config l %d k_prime %d, re_offset %d k %d :\nprs_cfg->SymbolStart %d\nprs_cfg->NumPRSSymbols %d\nprs_cfg->NumRB %d\nprs_cfg->CombSize %d\n", l, k_prime, re_offset, k, prs_cfg->SymbolStart, prs_cfg->NumPRSSymbols, prs_cfg->NumRB, prs_cfg->CombSize); diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue_nr_prs.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue_nr_prs.conf new file mode 100644 index 0000000000..4436431b30 --- /dev/null +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue_nr_prs.conf @@ -0,0 +1,16 @@ +prs_config = ( +{ + PRSResourceSetPeriod0 = 40; + PRSResourceSetPeriod1 = 0; + SymbolStart = 7; + NumPRSSymbols = 4; + NumRB = 100; + RBOffset = 0; + CombSize = 4; + REOffset = 0; + PRSResourceOffset = 0; + PRSResourceRepetition = 1; + PRSResourceTimeGap = 1; + NPRS_ID = 0; +} +); From 0286752f33d9d436554bbc76bad3bd98a79be9e6 Mon Sep 17 00:00:00 2001 From: Sagar Parsawar Date: Thu, 24 Feb 2022 16:10:52 +0100 Subject: [PATCH 050/135] Adding FR2 66PRB working config, tested in RFSim --- .../nr_dl_channel_estimation.c | 4 +- .../gnb.sa.band257.fr2.66PRB.usrpb210.conf | 317 ++++++++++++++++++ .../GENERIC-NR-5GC/CONF/ue_nr_prs.conf | 2 +- 3 files changed, 320 insertions(+), 3 deletions(-) create mode 100644 targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band257.fr2.66PRB.usrpb210.conf 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 730768b1c9..8e122d9a63 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -35,7 +35,7 @@ //#define DEBUG_PDSCH //#define DEBUG_PDCCH //#define DEBUG_CH -#define DEBUG_PRS_CHEST +//#define DEBUG_PRS_CHEST extern short nr_qpsk_mod_table[8]; int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, @@ -399,7 +399,7 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, frame_params->ofdm_symbol_size, &tdoa[l], &ch_pwr[l]); - LOG_I(PHY, "TDoA for PRS symbol %d ==> %d, Channel power %.1f dB\n", l, tdoa[l]-(frame_params->ofdm_symbol_size>>1), 10*log10(ch_pwr[l])); + LOG_I(PHY, "TDoA for PRS symbol %d ==> %d / %d samples, Channel power %.1f dB\n", l, tdoa[l]-(frame_params->ofdm_symbol_size>>1), frame_params->ofdm_symbol_size, 10*log10(ch_pwr[l])); } //for l #ifdef DEBUG_PRS_CHEST diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band257.fr2.66PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band257.fr2.66PRB.usrpb210.conf new file mode 100644 index 0000000000..5398599b79 --- /dev/null +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band257.fr2.66PRB.usrpb210.conf @@ -0,0 +1,317 @@ +Active_gNBs = ( "gNB-OAI"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +gNBs = +( + { + ////////// Identification parameters: + gNB_ID = 0xe00; + gNB_name = "gNB-OAI"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = 1; + plmn_list = ({ + mcc = 208; + mnc = 99; + mnc_length = 2; + snssaiList = ( + { + sst = 1; + sd = 0x1; // 0 false, else true + }, + { + sst = 1; + sd = 0x112233; // 0 false, else true + } + ); + + }); + + nr_cellid = 12345678L; + + ////////// Physical parameters: + + ssb_SubcarrierOffset = 0; + pdsch_AntennaPorts = 1; + pusch_AntennaPorts = 1; + sib1_tda = 0; + + pdcch_ConfigSIB1 = ( + { + controlResourceSetZero = 12; + searchSpaceZero = 0; + } + ); + + servingCellConfigCommon = ( + { + #spCellConfigCommon + + physCellId = 0; + +# downlinkConfigCommon + #frequencyInfoDL + # this is pointA + 23 PRBs@120kHz SCS (same as initial BWP) + absoluteFrequencySSB = 2078315; + dl_frequencyBand = 257; + # this is 27.900 GHz + dl_absoluteFrequencyPointA = 2077499; + #scs-SpecificCarrierList + dl_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + dl_subcarrierSpacing = 3; + dl_carrierBandwidth = 66; + #initialDownlinkBWP + #genericParameters + # this is RBstart=27,L=48 (275*(L-1))+RBstart + initialDLBWPlocationAndBandwidth = 13475; # 6366 12925 12956 28875 12952 +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + initialDLBWPsubcarrierSpacing = 3; + #pdcch-ConfigCommon + initialDLBWPcontrolResourceSetZero = 12; + initialDLBWPsearchSpaceZero = 0; + + #uplinkConfigCommon + #frequencyInfoUL + ul_frequencyBand = 257; + #scs-SpecificCarrierList + ul_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + ul_subcarrierSpacing = 3; + ul_carrierBandwidth = 66; + pMax = 20; + #initialUplinkBWP + #genericParameters + initialULBWPlocationAndBandwidth = 13475; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + initialULBWPsubcarrierSpacing = 3; + #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 = 15; +#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 = 3, +# restrictedSetConfig +# 0=unrestricted, 1=restricted type A, 2=restricted type B + restrictedSetConfig = 0, + + 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 = 3; + ssb_PositionsInBurst_Bitmap = 0x0001000100010001L; + +# 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 = 3; + + + #tdd-UL-DL-ConfigurationCommon +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + referenceSubcarrierSpacing = 3; + # pattern1 + # dl_UL_TransmissionPeriodicity + # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10 + dl_UL_TransmissionPeriodicity = 3; + nrofDownlinkSlots = 7; + nrofDownlinkSymbols = 6; + nrofUplinkSlots = 2; + nrofUplinkSymbols = 4; + + ssPBCH_BlockPower = -25; + } + + ); + + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + + ////////// AMF parameters: + amf_ip_address = ( { ipv4 = "192.168.70.132"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + + NETWORK_INTERFACES : + { + GNB_INTERFACE_NAME_FOR_NG_AMF = "demo-oai"; + GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.70.129/24"; + GNB_INTERFACE_NAME_FOR_NGU = "demo-oai"; + GNB_IPV4_ADDRESS_FOR_NGU = "192.168.70.129/24"; + GNB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + } +); + +MACRLCs = ( +{ + num_cc = 1; + tr_s_preference = "local_L1"; + tr_n_preference = "local_RRC"; + pusch_TargetSNRx10 = 150; + pucch_TargetSNRx10 = 200; + ulsch_max_frame_inactivity = 1; +} +); + +prs_config = ( +{ + PRSResourceSetPeriod0 = 40; + PRSResourceSetPeriod1 = 0; + SymbolStart = 7; + NumPRSSymbols = 4; + NumRB = 56; + RBOffset = 0; + CombSize = 4; + REOffset = 0; + PRSResourceOffset = 0; + PRSResourceRepetition = 1; + PRSResourceTimeGap = 1; + NPRS_ID = 0; +} +); + +L1s = ( +{ + num_cc = 1; + tr_n_preference = "local_mac"; + pusch_proc_threads = 8; + prach_dtx_threshold = 120; + pucch0_dtx_threshold = 150; + ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0 +} +); + +RUs = ( +{ + local_rf = "yes" + nb_tx = 1 + nb_rx = 1 + att_tx = 0 + att_rx = 0; + bands = [257]; + max_pdschReferenceSignalPower = -27; + max_rxgain = 114; + sf_extension = 0; + eNB_instances = [0]; + #beamforming 1x4 matrix: + bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000]; + clock_src = "internal"; +} +); + +THREAD_STRUCT = ( +{ + #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT" + parallel_config = "PARALLEL_SINGLE_THREAD"; + #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE" + worker_config = "WORKER_ENABLE"; +} +); + +rfsimulator : +{ + serveraddr = "server"; + serverport = "4043"; + options = (); #("saviq"); or/and "chanmod" + modelname = "AWGN"; + IQfile = "/tmp/rfsimulator.iqs"; +}; + +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"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + ngap_log_level ="debug"; + ngap_log_verbosity ="medium"; +}; + diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue_nr_prs.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue_nr_prs.conf index 4436431b30..591d094c0b 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue_nr_prs.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue_nr_prs.conf @@ -4,7 +4,7 @@ prs_config = ( PRSResourceSetPeriod1 = 0; SymbolStart = 7; NumPRSSymbols = 4; - NumRB = 100; + NumRB = 56; RBOffset = 0; CombSize = 4; REOffset = 0; From 865fdb98e3358504ed921fb0776d5eb98b108589 Mon Sep 17 00:00:00 2001 From: Sagar Parsawar Date: Wed, 2 Mar 2022 17:59:00 +0100 Subject: [PATCH 051/135] Adding DFT & IDFT for 768 size --- openair1/PHY/MODULATION/slot_fep_nr.c | 3 + .../nr_dl_channel_estimation.c | 8 ++ openair1/PHY/NR_UE_TRANSPORT/pss_nr.c | 4 + openair1/PHY/TOOLS/oai_dfts.c | 103 ++++++++++++++++++ openair1/PHY/TOOLS/tools_defs.h | 5 +- 5 files changed, 121 insertions(+), 2 deletions(-) diff --git a/openair1/PHY/MODULATION/slot_fep_nr.c b/openair1/PHY/MODULATION/slot_fep_nr.c index eb26dfc02b..0dad107da5 100644 --- a/openair1/PHY/MODULATION/slot_fep_nr.c +++ b/openair1/PHY/MODULATION/slot_fep_nr.c @@ -46,6 +46,9 @@ dft_size_idx_t get_dft_size_idx(uint16_t ofdm_symbol_size) case 512: return DFT_512; + case 768: + return DFT_768; + case 1024: return DFT_1024; 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 8e122d9a63..a4c5345f86 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -361,6 +361,10 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, idftsizeidx = IDFT_512; break; + case 768: + idftsizeidx = IDFT_768; + break; + case 1024: idftsizeidx = IDFT_1024; break; @@ -829,6 +833,10 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue, idftsizeidx = IDFT_512; break; + case 768: + idftsizeidx = IDFT_768; + break; + case 1024: idftsizeidx = IDFT_1024; break; diff --git a/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c b/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c index 28b6677b2c..857d9a1d45 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c +++ b/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c @@ -78,6 +78,10 @@ idft_size_idx_t get_idft(int ofdm_symbol_size) return IDFT_512; break; + case 768: + return IDFT_768; + break; + case 1024: return IDFT_1024; break; diff --git a/openair1/PHY/TOOLS/oai_dfts.c b/openair1/PHY/TOOLS/oai_dfts.c index 83207426fd..2d9bb1adb3 100644 --- a/openair1/PHY/TOOLS/oai_dfts.c +++ b/openair1/PHY/TOOLS/oai_dfts.c @@ -9059,6 +9059,7 @@ static int16_t twc768[191*2*4]; void dft768(int16_t *x,int16_t *y,unsigned char scale_flag) { // 192x 4; +#if 1 int i,j; simd_q15_t *x128=(simd_q15_t *)x; simd_q15_t *y128=(simd_q15_t *)y; @@ -9108,7 +9109,109 @@ void dft768(int16_t *x,int16_t *y,unsigned char scale_flag) { // 192x 4; _mm_empty(); _m_empty(); +#else + int i,i2,j; + uint32_t tmp[3][256]__attribute__((aligned(32))); + uint32_t tmpo[3][256] __attribute__((aligned(32))); + simd_q15_t *y128p=(simd_q15_t*)y; + simd_q15_t ONE_OVER_SQRT3_Q15_128 = set1_int16(ONE_OVER_SQRT3_Q15); + + for (i=0,j=0; i<256; i++) { + tmp[0][i] = ((uint32_t *)x)[j++]; + tmp[1][i] = ((uint32_t *)x)[j++]; + tmp[2][i] = ((uint32_t *)x)[j++]; + } + + dft256((int16_t*)(tmp[0]),(int16_t*)(tmpo[0]),1); + dft256((int16_t*)(tmp[1]),(int16_t*)(tmpo[1]),1); + dft256((int16_t*)(tmp[2]),(int16_t*)(tmpo[2]),1); + + for (i=0,i2=0; i<512; i+=8,i2+=4) { + bfly3((simd_q15_t*)(&tmpo[0][i2]),(simd_q15_t*)(&tmpo[1][i2]),(simd_q15_t*)(&tmpo[2][i2]), + (simd_q15_t*)(y+i),(simd_q15_t*)(y+512+i),(simd_q15_t*)(y+1024+i), + (simd_q15_t*)(twa768+i),(simd_q15_t*)(twb768+i)); + } + + + if (scale_flag==1) { + for (i=0; i<12; i++) { + y128p[0] = mulhi_int16(y128p[0],ONE_OVER_SQRT3_Q15_128); + y128p[1] = mulhi_int16(y128p[1],ONE_OVER_SQRT3_Q15_128); + y128p[2] = mulhi_int16(y128p[2],ONE_OVER_SQRT3_Q15_128); + y128p[3] = mulhi_int16(y128p[3],ONE_OVER_SQRT3_Q15_128); + y128p[4] = mulhi_int16(y128p[4],ONE_OVER_SQRT3_Q15_128); + y128p[5] = mulhi_int16(y128p[5],ONE_OVER_SQRT3_Q15_128); + y128p[6] = mulhi_int16(y128p[6],ONE_OVER_SQRT3_Q15_128); + y128p[7] = mulhi_int16(y128p[7],ONE_OVER_SQRT3_Q15_128); + y128p[8] = mulhi_int16(y128p[8],ONE_OVER_SQRT3_Q15_128); + y128p[9] = mulhi_int16(y128p[9],ONE_OVER_SQRT3_Q15_128); + y128p[10] = mulhi_int16(y128p[10],ONE_OVER_SQRT3_Q15_128); + y128p[11] = mulhi_int16(y128p[11],ONE_OVER_SQRT3_Q15_128); + y128p[12] = mulhi_int16(y128p[12],ONE_OVER_SQRT3_Q15_128); + y128p[13] = mulhi_int16(y128p[13],ONE_OVER_SQRT3_Q15_128); + y128p[14] = mulhi_int16(y128p[14],ONE_OVER_SQRT3_Q15_128); + y128p[15] = mulhi_int16(y128p[15],ONE_OVER_SQRT3_Q15_128); + y128p+=16; + } + } + + _mm_empty(); + _m_empty(); +#endif + +} + +// 256 x 3 +void idft768(int16_t *input, int16_t *output, unsigned char scale) +{ + int i,i2,j; + uint32_t tmp[3][256]__attribute__((aligned(32))); + uint32_t tmpo[3][256] __attribute__((aligned(32))); + simd_q15_t *y128p=(simd_q15_t*)output; + simd_q15_t ONE_OVER_SQRT3_Q15_128 = set1_int16(ONE_OVER_SQRT3_Q15); + + for (i=0,j=0; i<256; i++) { + tmp[0][i] = ((uint32_t *)input)[j++]; + tmp[1][i] = ((uint32_t *)input)[j++]; + tmp[2][i] = ((uint32_t *)input)[j++]; + } + + idft256((int16_t*)(tmp[0]),(int16_t*)(tmpo[0]),1); + idft256((int16_t*)(tmp[1]),(int16_t*)(tmpo[1]),1); + idft256((int16_t*)(tmp[2]),(int16_t*)(tmpo[2]),1); + + for (i=0,i2=0; i<512; i+=8,i2+=4) { + ibfly3((simd_q15_t*)(&tmpo[0][i2]),(simd_q15_t*)(&tmpo[1][i2]),(simd_q15_t*)(&tmpo[2][i2]), + (simd_q15_t*)(output+i),(simd_q15_t*)(output+512+i),(simd_q15_t*)(output+1024+i), + (simd_q15_t*)(twa768+i),(simd_q15_t*)(twb768+i)); + } + + + if (scale==1) { + for (i=0; i<12; i++) { + y128p[0] = mulhi_int16(y128p[0],ONE_OVER_SQRT3_Q15_128); + y128p[1] = mulhi_int16(y128p[1],ONE_OVER_SQRT3_Q15_128); + y128p[2] = mulhi_int16(y128p[2],ONE_OVER_SQRT3_Q15_128); + y128p[3] = mulhi_int16(y128p[3],ONE_OVER_SQRT3_Q15_128); + y128p[4] = mulhi_int16(y128p[4],ONE_OVER_SQRT3_Q15_128); + y128p[5] = mulhi_int16(y128p[5],ONE_OVER_SQRT3_Q15_128); + y128p[6] = mulhi_int16(y128p[6],ONE_OVER_SQRT3_Q15_128); + y128p[7] = mulhi_int16(y128p[7],ONE_OVER_SQRT3_Q15_128); + y128p[8] = mulhi_int16(y128p[8],ONE_OVER_SQRT3_Q15_128); + y128p[9] = mulhi_int16(y128p[9],ONE_OVER_SQRT3_Q15_128); + y128p[10] = mulhi_int16(y128p[10],ONE_OVER_SQRT3_Q15_128); + y128p[11] = mulhi_int16(y128p[11],ONE_OVER_SQRT3_Q15_128); + y128p[12] = mulhi_int16(y128p[12],ONE_OVER_SQRT3_Q15_128); + y128p[13] = mulhi_int16(y128p[13],ONE_OVER_SQRT3_Q15_128); + y128p[14] = mulhi_int16(y128p[14],ONE_OVER_SQRT3_Q15_128); + y128p[15] = mulhi_int16(y128p[15],ONE_OVER_SQRT3_Q15_128); + y128p+=16; + } + } + + _mm_empty(); + _m_empty(); } diff --git a/openair1/PHY/TOOLS/tools_defs.h b/openair1/PHY/TOOLS/tools_defs.h index 966e93440e..3899e8d3d2 100644 --- a/openair1/PHY/TOOLS/tools_defs.h +++ b/openair1/PHY/TOOLS/tools_defs.h @@ -263,6 +263,7 @@ void idft64(int16_t *x,int16_t *y,uint8_t scale_flag); void idft128(int16_t *x,int16_t *y,uint8_t scale_flag); void idft256(int16_t *x,int16_t *y,uint8_t scale_flag); void idft512(int16_t *x,int16_t *y,uint8_t scale_flag); +void idft768(int16_t *x,int16_t *y,uint8_t scale_flag); void idft1024(int16_t *x,int16_t *y,uint8_t scale_flag); void idft1536(int16_t *sigF,int16_t *sig,uint8_t scale_flag); void idft2048(int16_t *x,int16_t *y,uint8_t scale_flag); @@ -323,14 +324,14 @@ adftfunc_t dft_ftab[]={ #endif typedef enum idft_size_idx { - IDFT_128, IDFT_256, IDFT_512, IDFT_1024, IDFT_1536, IDFT_2048, IDFT_3072, IDFT_4096, + IDFT_128, IDFT_256, IDFT_512, IDFT_768, IDFT_1024, IDFT_1536, IDFT_2048, IDFT_3072, IDFT_4096, IDFT_6144, IDFT_8192, IDFT_9216, IDFT_12288, IDFT_18432, IDFT_24576, IDFT_36864, IDFT_49152, IDFT_73728, IDFT_98304, IDFT_SIZE_IDXTABLESIZE } idft_size_idx_t; #ifdef OAIDFTS_MAIN aidftfunc_t idft_ftab[]={ - idft128, idft256, idft512, idft1024, idft1536, idft2048, idft3072, idft4096, + idft128, idft256, idft512, idft768, idft1024, idft1536, idft2048, idft3072, idft4096, idft6144, idft8192, idft9216, idft12288, idft18432, idft24576, idft36864, idft49152, idft73728, idft98304 }; From 51df66257fd037adb96aa66a51908903a068d355 Mon Sep 17 00:00:00 2001 From: Sagar Parsawar Date: Thu, 3 Mar 2022 17:54:00 +0100 Subject: [PATCH 052/135] OAI dft/idft support for 768 and 384 --- openair1/PHY/MODULATION/ofdm_mod.c | 8 ++++ openair1/PHY/MODULATION/slot_fep_nr.c | 3 ++ openair1/PHY/NR_UE_TRANSPORT/pss_nr.c | 12 +++++ openair1/PHY/TOOLS/oai_dfts.c | 64 ++++++++++++++++++++++++++- 4 files changed, 85 insertions(+), 2 deletions(-) diff --git a/openair1/PHY/MODULATION/ofdm_mod.c b/openair1/PHY/MODULATION/ofdm_mod.c index 2f075e8218..482c1d5648 100644 --- a/openair1/PHY/MODULATION/ofdm_mod.c +++ b/openair1/PHY/MODULATION/ofdm_mod.c @@ -149,10 +149,18 @@ void PHY_ofdm_mod(int *input, /// pointer to complex input idftsize = IDFT_256; break; + case 384: + idftsize = IDFT_384; + break; + case 512: idftsize = IDFT_512; break; + case 768: + idftsize = IDFT_768; + break; + case 1024: idftsize = IDFT_1024; break; diff --git a/openair1/PHY/MODULATION/slot_fep_nr.c b/openair1/PHY/MODULATION/slot_fep_nr.c index 0dad107da5..232ddffd26 100644 --- a/openair1/PHY/MODULATION/slot_fep_nr.c +++ b/openair1/PHY/MODULATION/slot_fep_nr.c @@ -43,6 +43,9 @@ dft_size_idx_t get_dft_size_idx(uint16_t ofdm_symbol_size) case 256: return DFT_256; + case 384: + return DFT_384; + case 512: return DFT_512; diff --git a/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c b/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c index 857d9a1d45..9c64aa03fd 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c +++ b/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c @@ -74,6 +74,10 @@ idft_size_idx_t get_idft(int ofdm_symbol_size) return IDFT_256; break; + case 384: + return IDFT_384; + break; + case 512: return IDFT_512; break; @@ -139,10 +143,18 @@ dft_size_idx_t get_dft(int ofdm_symbol_size) return DFT_256; break; + case 384: + return DFT_384; + break; + case 512: return DFT_512; break; + case 768: + return DFT_768; + break; + case 1024: return DFT_1024; break; diff --git a/openair1/PHY/TOOLS/oai_dfts.c b/openair1/PHY/TOOLS/oai_dfts.c index 2d9bb1adb3..51f747be92 100644 --- a/openair1/PHY/TOOLS/oai_dfts.c +++ b/openair1/PHY/TOOLS/oai_dfts.c @@ -8680,6 +8680,7 @@ void dft384(int16_t *x,int16_t *y,unsigned char scale_flag) // 96 x 4 }; + static int16_t twa432[107*2*4]; static int16_t twb432[107*2*4]; static int16_t twc432[107*2*4]; @@ -9059,7 +9060,7 @@ static int16_t twc768[191*2*4]; void dft768(int16_t *x,int16_t *y,unsigned char scale_flag) { // 192x 4; -#if 1 +#if 0 int i,j; simd_q15_t *x128=(simd_q15_t *)x; simd_q15_t *y128=(simd_q15_t *)y; @@ -9162,6 +9163,63 @@ void dft768(int16_t *x,int16_t *y,unsigned char scale_flag) { // 192x 4; } +static int16_t twa384i[95*2*4]; +static int16_t twb384i[95*2*4]; +// 128 x 3 +void idft384(int16_t *input, int16_t *output, unsigned char scale) +{ + int i,i2,j; + uint32_t tmp[3][128]__attribute__((aligned(32))); + uint32_t tmpo[3][128] __attribute__((aligned(32))); + simd_q15_t *y128p=(simd_q15_t*)output; + simd_q15_t ONE_OVER_SQRT3_Q15_128 = set1_int16(ONE_OVER_SQRT3_Q15); + + for (i=0,j=0; i<128; i++) { + tmp[0][i] = ((uint32_t *)input)[j++]; + tmp[1][i] = ((uint32_t *)input)[j++]; + tmp[2][i] = ((uint32_t *)input)[j++]; + } + + idft128((int16_t*)(tmp[0]),(int16_t*)(tmpo[0]),1); + idft128((int16_t*)(tmp[1]),(int16_t*)(tmpo[1]),1); + idft128((int16_t*)(tmp[2]),(int16_t*)(tmpo[2]),1); + + for (i=0,i2=0; i<256; i+=8,i2+=4) { + ibfly3((simd_q15_t*)(&tmpo[0][i2]),(simd_q15_t*)(&tmpo[1][i2]),(simd_q15_t*)(&tmpo[2][i2]), + (simd_q15_t*)(output+i),(simd_q15_t*)(output+256+i),(simd_q15_t*)(output+512+i), + (simd_q15_t*)(twa384+i),(simd_q15_t*)(twb384+i)); + } + + + if (scale==1) { + for (i=0; i<6; i++) { + y128p[0] = mulhi_int16(y128p[0],ONE_OVER_SQRT3_Q15_128); + y128p[1] = mulhi_int16(y128p[1],ONE_OVER_SQRT3_Q15_128); + y128p[2] = mulhi_int16(y128p[2],ONE_OVER_SQRT3_Q15_128); + y128p[3] = mulhi_int16(y128p[3],ONE_OVER_SQRT3_Q15_128); + y128p[4] = mulhi_int16(y128p[4],ONE_OVER_SQRT3_Q15_128); + y128p[5] = mulhi_int16(y128p[5],ONE_OVER_SQRT3_Q15_128); + y128p[6] = mulhi_int16(y128p[6],ONE_OVER_SQRT3_Q15_128); + y128p[7] = mulhi_int16(y128p[7],ONE_OVER_SQRT3_Q15_128); + y128p[8] = mulhi_int16(y128p[8],ONE_OVER_SQRT3_Q15_128); + y128p[9] = mulhi_int16(y128p[9],ONE_OVER_SQRT3_Q15_128); + y128p[10] = mulhi_int16(y128p[10],ONE_OVER_SQRT3_Q15_128); + y128p[11] = mulhi_int16(y128p[11],ONE_OVER_SQRT3_Q15_128); + y128p[12] = mulhi_int16(y128p[12],ONE_OVER_SQRT3_Q15_128); + y128p[13] = mulhi_int16(y128p[13],ONE_OVER_SQRT3_Q15_128); + y128p[14] = mulhi_int16(y128p[14],ONE_OVER_SQRT3_Q15_128); + y128p[15] = mulhi_int16(y128p[15],ONE_OVER_SQRT3_Q15_128); + y128p+=16; + } + } + + _mm_empty(); + _m_empty(); + +} + + + // 256 x 3 void idft768(int16_t *input, int16_t *output, unsigned char scale) { @@ -10669,6 +10727,7 @@ int dfts_autoinit(void) init_rad3_rep(324,twa324,twb324); init_rad3_rep(360,twa360,twb360); init_rad4_rep(384,twa384,twb384,twc384); + init_rad3_rep(384,twa384i,twb384i); init_rad4_rep(432,twa432,twb432,twc432); init_rad4_rep(480,twa480,twb480,twc480); init_rad3_rep(540,twa540,twb540); @@ -10676,7 +10735,8 @@ int dfts_autoinit(void) init_rad2_rep(600,twa600); init_rad3_rep(648,twa648,twb648); init_rad4_rep(720,twa720,twb720,twc720); - init_rad4_rep(768,twa768,twb768,twc768); + //init_rad4_rep(768,twa768,twb768,twc768); + init_rad3_rep(768,twa768,twb768); init_rad3_rep(864,twa864,twb864); init_rad3_rep(900,twa900,twb900); init_rad4_rep(960,twa960,twb960,twc960); From fbef10996b9d896c51dfc59fd07a91cdfa9eedda Mon Sep 17 00:00:00 2001 From: Sagar Parsawar Date: Thu, 3 Mar 2022 17:55:52 +0100 Subject: [PATCH 053/135] OAI UE: PRS support for multiple Rx antenna and multiple gNB IDs --- openair1/PHY/INIT/nr_init_ue.c | 16 +- .../nr_dl_channel_estimation.c | 560 +++++++++--------- openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h | 3 +- openair1/PHY/TOOLS/tools_defs.h | 5 +- openair1/PHY/defs_nr_UE.h | 10 +- openair1/SCHED_NR_UE/phy_procedures_nr_ue.c | 28 +- openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c | 46 +- 7 files changed, 340 insertions(+), 328 deletions(-) diff --git a/openair1/PHY/INIT/nr_init_ue.c b/openair1/PHY/INIT/nr_init_ue.c index 94e3d0d9d0..325b0577af 100644 --- a/openair1/PHY/INIT/nr_init_ue.c +++ b/openair1/PHY/INIT/nr_init_ue.c @@ -136,6 +136,7 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, NR_DL_FRAME_PARMS *const fp = &ue->frame_parms; NR_UE_COMMON *const common_vars = &ue->common_vars; NR_UE_PBCH **const pbch_vars = ue->pbch_vars; + NR_UE_PRS **const prs_vars = ue->prs_vars; NR_UE_PRACH **const prach_vars = ue->prach_vars; int i,j,k,l,slot,symb,q; int gNB_id; @@ -334,17 +335,18 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, } prach_vars[gNB_id] = (NR_UE_PRACH *)malloc16_clear(sizeof(NR_UE_PRACH)); - pbch_vars[gNB_id] = (NR_UE_PBCH *)malloc16_clear(sizeof(NR_UE_PBCH)); + pbch_vars[gNB_id] = (NR_UE_PBCH *)malloc16_clear(sizeof(NR_UE_PBCH)); + prs_vars[gNB_id] = (NR_UE_PRS *)malloc16_clear(sizeof(NR_UE_PRS)); // PRS channel estimates - ue->prs_ch_estimates = (int32_t **)malloc16( fp->nb_antennas_rx*sizeof(int32_t *) ); - ue->prs_ch_estimates_time = (int32_t **)malloc16( fp->nb_antennas_rx*sizeof(int32_t *) ); - AssertFatal(((ue->prs_ch_estimates!=NULL) || (ue->prs_ch_estimates_time!=NULL)), "NR UE init: PRS channel estimates malloc failed\n"); + prs_vars[gNB_id]->prs_ch_estimates = (int32_t **)malloc16_clear( fp->nb_antennas_rx*sizeof(int32_t *) ); + prs_vars[gNB_id]->prs_ch_estimates_time = (int32_t **)malloc16_clear( fp->nb_antennas_rx*sizeof(int32_t *) ); + AssertFatal(((prs_vars[gNB_id]->prs_ch_estimates!=NULL) || (prs_vars[gNB_id]->prs_ch_estimates_time!=NULL)), "NR UE init: PRS channel estimates malloc failed\n"); for (i=0; inb_antennas_rx; i++) { - ue->prs_ch_estimates[i] = (int32_t *)malloc16(2*fp->ofdm_symbol_size*NR_MAX_NUM_PRS_SYMB); - ue->prs_ch_estimates_time[i] = (int32_t *)malloc16(2*fp->ofdm_symbol_size*NR_MAX_NUM_PRS_SYMB); - AssertFatal(((ue->prs_ch_estimates[i]!=NULL) || (ue->prs_ch_estimates_time[i]!=NULL)), "NR UE init: PRS channel estimates malloc failed %d\n", i); + prs_vars[gNB_id]->prs_ch_estimates[i] = (int32_t *)malloc16_clear(2*fp->ofdm_symbol_size*NR_MAX_NUM_PRS_SYMB); + prs_vars[gNB_id]->prs_ch_estimates_time[i] = (int32_t *)malloc16_clear(2*fp->ofdm_symbol_size*NR_MAX_NUM_PRS_SYMB); + AssertFatal(((prs_vars[gNB_id]->prs_ch_estimates[i]!=NULL) || (prs_vars[gNB_id]->prs_ch_estimates_time[i]!=NULL)), "NR UE init: PRS channel estimates malloc failed %d\n", i); } 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 a4c5345f86..998930057f 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -38,7 +38,8 @@ //#define DEBUG_PRS_CHEST extern short nr_qpsk_mod_table[8]; -int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, +int nr_prs_channel_estimation(uint8_t gNB_id, + PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, NR_DL_FRAME_PARMS *frame_params) { @@ -51,12 +52,13 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, int32_t **rxdataF = ue->common_vars.common_vars_rx_data_per_thread[proc->thread_id].rxdataF; uint32_t **nr_gold_prs = ue->nr_gold_prs[proc->nr_slot_rx]; - prs_data_t *prs_cfg = &ue->prs_cfg; + prs_data_t *prs_cfg = &ue->prs_vars[gNB_id]->prs_cfg; + int32_t **prs_chestF = ue->prs_vars[gNB_id]->prs_ch_estimates; + int32_t **prs_chestT = ue->prs_vars[gNB_id]->prs_ch_estimates_time; - uint8_t rxAnt = 0; // ant 0 rxdataF for now - int16_t *prs_chest, ch[2] = {0}, *rxF, *pil, *fl,*fm, *fmm, *fml, *fmr, *fr, mod_prs[NR_MAX_PRS_LENGTH<<1]; - int16_t k_prime = 0, k = 0, re_offset; - uint8_t idx = prs_cfg->NPRSID; + uint8_t rxAnt = 0, idx = prs_cfg->NPRSID; + int16_t ch[2] = {0}, *rxF, *pil, *fl,*fm, *fmm, *fml, *fmr, *fr, mod_prs[NR_MAX_PRS_LENGTH<<1]; + int16_t k_prime = 0, k = 0, re_offset = 0, second_half = 0; int16_t *ch_freq = (int16_t *)malloc16(frame_params->ofdm_symbol_size*sizeof(int32_t)); int32_t *ch_time = (int32_t *)malloc16(frame_params->ofdm_symbol_size*sizeof(int32_t)); AssertFatal(((ch_freq != NULL) || (ch_time != NULL)), "nr_prs_channel_estimation: channel estimate buffer initialization failed!!"); @@ -85,7 +87,7 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, k = re_offset = (prs_cfg->REOffset+k_prime) % prs_cfg->CombSize + prs_cfg->RBOffset*12 + frame_params->first_carrier_offset; #ifdef DEBUG_PRS_CHEST - printf("PRS config l %d k_prime %d, re_offset %d k %d :\nprs_cfg->SymbolStart %d\nprs_cfg->NumPRSSymbols %d\nprs_cfg->NumRB %d\nprs_cfg->CombSize %d\n", l, k_prime, re_offset, k, prs_cfg->SymbolStart, prs_cfg->NumPRSSymbols, prs_cfg->NumRB, prs_cfg->CombSize); + printf("[gNB %d] PRS config l %d k_prime %d, re_offset %d k %d :\nprs_cfg->SymbolStart %d\nprs_cfg->NumPRSSymbols %d\nprs_cfg->NumRB %d\nprs_cfg->CombSize %d\n", gNB_id,l, k_prime, re_offset, k, prs_cfg->SymbolStart, prs_cfg->NumPRSSymbols, prs_cfg->NumRB, prs_cfg->CombSize); #endif // Pilots generation and modulation for (int m = 0; m < (12/prs_cfg->CombSize)*prs_cfg->NumRB; m++) @@ -95,332 +97,334 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, mod_prs[(m<<1)+1] = nr_qpsk_mod_table[(idx<<1) + 1]; } - // Channel estimation and interpolation - pil = (int16_t *)&mod_prs[0]; - rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k]; - prs_chest = (int16_t *)&ue->prs_ch_estimates[rxAnt][l*frame_params->ofdm_symbol_size]; - memset(prs_chest,0,sizeof(int32_t)*(ue->frame_parms.ofdm_symbol_size)); - memset(ch_freq,0,sizeof(int32_t)*(ue->frame_parms.ofdm_symbol_size)); - - if(prs_cfg->CombSize == 2) + for (rxAnt=0; rxAnt < frame_params->nb_antennas_rx; rxAnt++) { - // Choose the interpolation filters - switch (k_prime) { - case 0: - fl = filt8_l0; - fml = filt8_m0; - fmm = filt8_mm0; - fmr = filt8_mr0; - fm = filt8_m0; - fr = filt8_r0; - break; - - case 1: - fl = filt8_l1; - fmm = filt8_mm1; - fml = filt8_ml1; - fmr = fmm; - fm = filt8_m1; - fr = filt8_r1; - break; - - default: - LOG_I(PHY, "nr=prs channel_estimation: k_prime=%d -> ERROR\n",k_prime); - return(-1); - break; - } - - //Start pilot - ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); - ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); -#ifdef DEBUG_PRS_CHEST - printf("pilot 0 : rxF - > (%d,%d) addr %p ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); -#endif - multadd_real_vector_complex_scalar(fl, - ch, - ch_freq, - 8); + // Channel estimation and interpolation + pil = (int16_t *)&mod_prs[0]; + rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k]; + memset(ch_freq,0,sizeof(int32_t)*(ue->frame_parms.ofdm_symbol_size)); - pil +=2; - k = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size; - rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k]; - - //Middle pilots - for(int pIdx = 1; pIdx < prs_cfg->NumRB*(12/prs_cfg->CombSize)-1; pIdx+=2) + if(prs_cfg->CombSize == 2) { - ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); - ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); -#ifdef DEBUG_PRS_CHEST - printf("pilot %d : rxF - > (%d,%d) addr %p ch -> (%d,%d), pil -> (%d,%d) \n", pIdx, rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); -#endif - if(pIdx == 1) // 2nd pilot - { - multadd_real_vector_complex_scalar(fml, - ch, - ch_freq, - 8); - } - else - { - multadd_real_vector_complex_scalar(fm, - ch, - ch_freq, - 8); + // Choose the interpolation filters + switch (k_prime) { + case 0: + fl = filt8_l0; + fml = filt8_m0; + fmm = filt8_mm0; + fmr = filt8_mr0; + fm = filt8_m0; + fr = filt8_r0; + break; + + case 1: + fl = filt8_l1; + fmm = filt8_mm1; + fml = filt8_ml1; + fmr = fmm; + fm = filt8_m1; + fr = filt8_r1; + break; + + default: + LOG_I(PHY, "nr=prs channel_estimation: k_prime=%d -> ERROR\n",k_prime); + return(-1); + break; } - pil +=2; - k = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size; - rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k]; - + + //Start pilot ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); #ifdef DEBUG_PRS_CHEST - printf("pilot %d : rxF - > (%d,%d) addr %p ch -> (%d,%d), pil -> (%d,%d) \n", pIdx+1, rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); + printf("pilot 0 : rxF - > (%d,%d) addr %p ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); #endif - if(pIdx == (prs_cfg->NumRB*(12/prs_cfg->CombSize)-3)) // 2nd last pilot - { - multadd_real_vector_complex_scalar(fmr, - ch, - ch_freq, - 8); - } - else - { - multadd_real_vector_complex_scalar(fmm, - ch, - ch_freq, - 8); - } - + multadd_real_vector_complex_scalar(fl, + ch, + ch_freq, + 8); + pil +=2; k = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size; rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k]; - ch_freq +=8; - } - - //End pilot - ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); - ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); -#ifdef DEBUG_PRS_CHEST - printf("pilot %d : rxF - > (%d,%d) addr %p ch -> (%d,%d), pil -> (%d,%d) \n", prs_cfg->NumRB*(12/prs_cfg->CombSize)-1, rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); -#endif - multadd_real_vector_complex_scalar(fr, - ch, - ch_freq, - 8); - - } - else if(prs_cfg->CombSize == 4) - { - // Choose the interpolation filters - switch (k_prime) { - case 0: - fl = filt16a_l0; - fml = filt16a_mm0; - fmm = filt16a_mm0; - fmr = filt16a_m0; - fm = filt16a_m0; - fr = filt16a_r0; - break; - case 1: - fl = filt16a_l1; - fml = filt16a_ml1; - fmm = filt16a_mm1; - fmr = filt16a_mr1; - fm = filt16a_m1; - fr = filt16a_r1; - break; + //Middle pilots + for(int pIdx = 1; pIdx < prs_cfg->NumRB*(12/prs_cfg->CombSize)-1; pIdx+=2) + { + ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); + ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); +#ifdef DEBUG_PRS_CHEST + printf("pilot %d : rxF - > (%d,%d) addr %p ch -> (%d,%d), pil -> (%d,%d) \n", pIdx, rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); +#endif + if(pIdx == 1) // 2nd pilot + { + multadd_real_vector_complex_scalar(fml, + ch, + ch_freq, + 8); + } + else + { + multadd_real_vector_complex_scalar(fm, + ch, + ch_freq, + 8); + } + pil +=2; + k = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size; + rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k]; - case 2: - fl = filt16a_l2; - fml = filt16a_ml2; - fmm = filt16a_mm2; - fmr = filt16a_mr2; - fm = filt16a_m2; - fr = filt16a_r2; - break; + ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); + ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); +#ifdef DEBUG_PRS_CHEST + printf("pilot %d : rxF - > (%d,%d) addr %p ch -> (%d,%d), pil -> (%d,%d) \n", pIdx+1, rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); +#endif + if(pIdx == (prs_cfg->NumRB*(12/prs_cfg->CombSize)-3)) // 2nd last pilot + { + multadd_real_vector_complex_scalar(fmr, + ch, + ch_freq, + 8); + } + else + { + multadd_real_vector_complex_scalar(fmm, + ch, + ch_freq, + 8); + } - case 3: - fl = filt16a_l3; - fml = filt16a_ml3; - fmm = filt16a_mm3; - fmr = filt16a_mm3; - fm = filt16a_m3; - fr = filt16a_r3; - break; + pil +=2; + k = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size; + rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k]; + ch_freq +=8; + } - default: - LOG_I(PHY, "nr=prs channel_estimation: k_prime=%d -> ERROR\n",k_prime); - return(-1); - break; + //End pilot + ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); + ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); +#ifdef DEBUG_PRS_CHEST + printf("pilot %d : rxF - > (%d,%d) addr %p ch -> (%d,%d), pil -> (%d,%d) \n", prs_cfg->NumRB*(12/prs_cfg->CombSize)-1, rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); +#endif + multadd_real_vector_complex_scalar(fr, + ch, + ch_freq, + 8); } - - //Start pilot - ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); - ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); -#ifdef DEBUG_PRS_CHEST - printf("pilot 0 : rxF - > (%d,%d) addr %p ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); -#endif - multadd_real_vector_complex_scalar(fl, - ch, - ch_freq, - 16); - - pil +=2; - k = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size; - rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k]; - - ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); - ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); -#ifdef DEBUG_PRS_CHEST - printf("pilot 1 : rxF - > (%d,%d) addr %p ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); -#endif - multadd_real_vector_complex_scalar(fml, - ch, - ch_freq, - 16); - - pil +=2; - k = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size; - rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k]; - ch_freq +=8; - - //Middle pilots - for(int pIdx = 2; pIdx < prs_cfg->NumRB*(12/prs_cfg->CombSize)-2; pIdx++) + else if(prs_cfg->CombSize == 4) { + // Choose the interpolation filters + switch (k_prime) { + case 0: + fl = filt16a_l0; + fml = filt16a_mm0; + fmm = filt16a_mm0; + fmr = filt16a_m0; + fm = filt16a_m0; + fr = filt16a_r0; + break; + + case 1: + fl = filt16a_l1; + fml = filt16a_ml1; + fmm = filt16a_mm1; + fmr = filt16a_mr1; + fm = filt16a_m1; + fr = filt16a_r1; + break; + + case 2: + fl = filt16a_l2; + fml = filt16a_ml2; + fmm = filt16a_mm2; + fmr = filt16a_mr2; + fm = filt16a_m2; + fr = filt16a_r2; + break; + + case 3: + fl = filt16a_l3; + fml = filt16a_ml3; + fmm = filt16a_mm3; + fmr = filt16a_mm3; + fm = filt16a_m3; + fr = filt16a_r3; + break; + + default: + LOG_I(PHY, "nr=prs channel_estimation: k_prime=%d -> ERROR\n",k_prime); + return(-1); + break; + } + + //Start pilot ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); #ifdef DEBUG_PRS_CHEST - printf("pilot %d : rxF - > (%d,%d) addr %p ch -> (%d,%d), pil -> (%d,%d) \n", pIdx, rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); + printf("pilot 0 : rxF - > (%d,%d) addr %p ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); #endif - multadd_real_vector_complex_scalar(fmm, - ch, - ch_freq, - 16); + multadd_real_vector_complex_scalar(fl, + ch, + ch_freq, + 16); + + pil +=2; + k = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size; + rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k]; + + ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); + ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); +#ifdef DEBUG_PRS_CHEST + printf("pilot 1 : rxF - > (%d,%d) addr %p ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); +#endif + multadd_real_vector_complex_scalar(fml, + ch, + ch_freq, + 16); + pil +=2; k = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size; rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k]; ch_freq +=8; + + //Middle pilots + for(int pIdx = 2; pIdx < prs_cfg->NumRB*(12/prs_cfg->CombSize)-2; pIdx++) + { + ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); + ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); +#ifdef DEBUG_PRS_CHEST + printf("pilot %d : rxF - > (%d,%d) addr %p ch -> (%d,%d), pil -> (%d,%d) \n", pIdx, rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); +#endif + multadd_real_vector_complex_scalar(fmm, + ch, + ch_freq, + 16); + pil +=2; + k = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size; + rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k]; + ch_freq +=8; + } + + //End pilot + ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); + ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); +#ifdef DEBUG_PRS_CHEST + printf("pilot %d : rxF - > (%d,%d) addr %p ch -> (%d,%d), pil -> (%d,%d) \n", prs_cfg->NumRB*(12/prs_cfg->CombSize)-2, rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); +#endif + multadd_real_vector_complex_scalar(fmr, + ch, + ch_freq, + 16); + pil +=2; + k = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size; + rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k]; + + ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); + ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); +#ifdef DEBUG_PRS_CHEST + printf("pilot %d : rxF - > (%d,%d) addr %p ch -> (%d,%d), pil -> (%d,%d) \n", prs_cfg->NumRB*(12/prs_cfg->CombSize)-1, rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); +#endif + multadd_real_vector_complex_scalar(fr, + ch, + ch_freq, + 16); } - - //End pilot - ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); - ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); + else + { + LOG_I(PHY, "NR_PRS UE Channel EStimation: CombSize other than 2 and 4 are NOT supported currently! Returning"); + return(0); + } + + //reset channel pointer + ch_freq = ch_init; #ifdef DEBUG_PRS_CHEST - printf("pilot %d : rxF - > (%d,%d) addr %p ch -> (%d,%d), pil -> (%d,%d) \n", prs_cfg->NumRB*(12/prs_cfg->CombSize)-2, rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); + for (int re = 0; re < prs_cfg->NumRB*12; re++) + { + printf("prs_ch[%d] %d %d\n", re, ch_freq[re<<1], ch_freq[(re<<1)+1]); + } #endif - multadd_real_vector_complex_scalar(fmr, - ch, - ch_freq, - 16); - pil +=2; - k = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size; - rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k]; - - ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); - ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); -#ifdef DEBUG_PRS_CHEST - printf("pilot %d : rxF - > (%d,%d) addr %p ch -> (%d,%d), pil -> (%d,%d) \n", prs_cfg->NumRB*(12/prs_cfg->CombSize)-1, rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); -#endif - multadd_real_vector_complex_scalar(fr, - ch, - ch_freq, - 16); - } - else - { - LOG_I(PHY, "NR_PRS UE Channel EStimation: CombSize other than 2 and 4 are NOT supported currently! Returning"); - return(0); - } + // Place PRS channel estimates in rxdataF shifted format + second_half = (prs_cfg->NumRB*12-(frame_params->ofdm_symbol_size-re_offset)); + memcpy((int16_t *)&prs_chestF[rxAnt][l*frame_params->ofdm_symbol_size+re_offset], &ch_init[0], (frame_params->ofdm_symbol_size - re_offset)*sizeof(int32_t)); + if(second_half > 0) + memcpy((int16_t *)&prs_chestF[rxAnt][l*frame_params->ofdm_symbol_size], &ch_init[(frame_params->ofdm_symbol_size - re_offset)<<1], second_half*sizeof(int32_t)); - //reset channel pointer - ch_freq = ch_init; -#ifdef DEBUG_PRS_CHEST - for (int re = 0; re < prs_cfg->NumRB*12; re++) - { - printf("prs_ch[%d] %d %d\n", re, ch_freq[re<<1], ch_freq[(re<<1)+1]); - } -#endif - // Place PRS channel estimates in rxdataF shifted format - memcpy((int16_t *)&ue->prs_ch_estimates[rxAnt][l*frame_params->ofdm_symbol_size+re_offset], &ch_init[0], (frame_params->ofdm_symbol_size - re_offset)*sizeof(int32_t)); - memcpy((int16_t *)&ue->prs_ch_estimates[rxAnt][l*frame_params->ofdm_symbol_size], &ch_init[2*(frame_params->ofdm_symbol_size - re_offset)], (prs_cfg->NumRB*12-(frame_params->ofdm_symbol_size-re_offset))*sizeof(int32_t)); + // Time domain IMPULSE response + idft_size_idx_t idftsizeidx; - // Time domain IMPULSE response - idft_size_idx_t idftsizeidx; + switch (frame_params->ofdm_symbol_size) { + case 128: + idftsizeidx = IDFT_128; + break; - switch (frame_params->ofdm_symbol_size) { - case 128: - idftsizeidx = IDFT_128; - break; + case 256: + idftsizeidx = IDFT_256; + break; - case 256: - idftsizeidx = IDFT_256; - break; + case 512: + idftsizeidx = IDFT_512; + break; - case 512: - idftsizeidx = IDFT_512; - break; + case 768: + idftsizeidx = IDFT_768; + break; - case 768: - idftsizeidx = IDFT_768; - break; + case 1024: + idftsizeidx = IDFT_1024; + break; - case 1024: - idftsizeidx = IDFT_1024; - break; + case 1536: + idftsizeidx = IDFT_1536; + break; - case 1536: - idftsizeidx = IDFT_1536; - break; + case 2048: + idftsizeidx = IDFT_2048; + break; - case 2048: - idftsizeidx = IDFT_2048; - break; + case 3072: + idftsizeidx = IDFT_3072; + break; - case 3072: - idftsizeidx = IDFT_3072; - break; + case 4096: + idftsizeidx = IDFT_4096; + break; - case 4096: - idftsizeidx = IDFT_4096; - break; + default: + LOG_I(PHY, "unsupported ofdm symbol size \n"); + assert(0); + } - default: - LOG_I(PHY, "unsupported ofdm symbol size \n"); - assert(0); - } - - idft(idftsizeidx, - (int16_t *)&ue->prs_ch_estimates[rxAnt][l*frame_params->ofdm_symbol_size], - (int16_t *)&ch_time[0],1); + idft(idftsizeidx, + (int16_t *)&prs_chestF[rxAnt][l*frame_params->ofdm_symbol_size], + (int16_t *)&ch_time[0],1); - // rearrange impulse response - memcpy((int16_t *)&ue->prs_ch_estimates_time[rxAnt][l*frame_params->ofdm_symbol_size], &ch_time[frame_params->ofdm_symbol_size>>1], (frame_params->ofdm_symbol_size>>1)*sizeof(int32_t)); - memcpy((int16_t *)&ue->prs_ch_estimates_time[rxAnt][l*frame_params->ofdm_symbol_size + (frame_params->ofdm_symbol_size>>1)], &ch_time[0], (frame_params->ofdm_symbol_size>>1)*sizeof(int32_t)); + // rearrange impulse response + memcpy((int16_t *)&prs_chestT[rxAnt][l*frame_params->ofdm_symbol_size], &ch_time[frame_params->ofdm_symbol_size>>1], (frame_params->ofdm_symbol_size>>1)*sizeof(int32_t)); + memcpy((int16_t *)&prs_chestT[rxAnt][l*frame_params->ofdm_symbol_size + (frame_params->ofdm_symbol_size>>1)], &ch_time[0], (frame_params->ofdm_symbol_size>>1)*sizeof(int32_t)); - // peak estimator - peak_estimator(&ue->prs_ch_estimates_time[rxAnt][l*frame_params->ofdm_symbol_size], - frame_params->ofdm_symbol_size, - &tdoa[l], - &ch_pwr[l]); - LOG_I(PHY, "TDoA for PRS symbol %d ==> %d / %d samples, Channel power %.1f dB\n", l, tdoa[l]-(frame_params->ofdm_symbol_size>>1), frame_params->ofdm_symbol_size, 10*log10(ch_pwr[l])); + // peak estimator + peak_estimator(&prs_chestT[rxAnt][l*frame_params->ofdm_symbol_size], + frame_params->ofdm_symbol_size, + &tdoa[l], + &ch_pwr[l]); + LOG_I(PHY, "[gNB %d][Rx %d] TDoA for PRS symbol %d ==> %d / %d samples, peak channel power %.1f dB\n", gNB_id, rxAnt, l, tdoa[l]-(frame_params->ofdm_symbol_size>>1), frame_params->ofdm_symbol_size, 10*log10(ch_pwr[l])); + } // for rxAnt } //for l #ifdef DEBUG_PRS_CHEST LOG_M("PRSpilot.m", "prs_loc", &mod_prs[0], prs_cfg->NumRB*(12/prs_cfg->CombSize),1,1); LOG_M("rxSigF.m","rxF",&rxdataF[rxAnt][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], prs_cfg->NumPRSSymbols*frame_params->ofdm_symbol_size,1,1); - LOG_M("prsEstF.m","prs_chestF",&ue->prs_ch_estimates[rxAnt][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], prs_cfg->NumPRSSymbols*frame_params->ofdm_symbol_size,1,1); - LOG_M("prsEstT.m","prs_chestT",&ue->prs_ch_estimates_time[rxAnt][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], prs_cfg->NumPRSSymbols*frame_params->ofdm_symbol_size,1,1); + LOG_M("prsEstF.m","prs_chestF",&prs_chestF[rxAnt][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], prs_cfg->NumPRSSymbols*frame_params->ofdm_symbol_size,1,1); + LOG_M("prsEstT.m","prs_chestT",&prs_chestT[rxAnt][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], prs_cfg->NumPRSSymbols*frame_params->ofdm_symbol_size,1,1); #endif // T tracer dump T(T_UE_PHY_DL_CHANNEL_ESTIMATE_FREQ, T_INT(0), T_INT(proc->frame_rx), T_INT(proc->nr_slot_rx), - T_INT(0), T_BUFFER(&ue->prs_ch_estimates[rxAnt][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], prs_cfg->NumPRSSymbols*frame_params->ofdm_symbol_size*sizeof(int32_t))); + T_INT(0), T_BUFFER(&prs_chestF[0][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], prs_cfg->NumPRSSymbols*frame_params->ofdm_symbol_size*sizeof(int32_t))); T(T_UE_PHY_DL_CHANNEL_ESTIMATE, T_INT(0), T_INT(proc->frame_rx), T_INT(proc->nr_slot_rx), - T_INT(0), T_BUFFER(&ue->prs_ch_estimates_time[rxAnt][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], prs_cfg->NumPRSSymbols*frame_params->ofdm_symbol_size*sizeof(int32_t))); + T_INT(0), T_BUFFER(&prs_chestT[0][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], prs_cfg->NumPRSSymbols*frame_params->ofdm_symbol_size*sizeof(int32_t))); free(ch_freq); free(ch_time); diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h b/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h index 0423218097..4f26c8e20d 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h @@ -33,7 +33,8 @@ #define SYNCH_HYST 2 /* A function to perform the channel estimation of DL PRS signal */ -int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue, +int nr_prs_channel_estimation(uint8_t gNB_id, + PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, NR_DL_FRAME_PARMS *frame_params); diff --git a/openair1/PHY/TOOLS/tools_defs.h b/openair1/PHY/TOOLS/tools_defs.h index 3899e8d3d2..7cf51bc60b 100644 --- a/openair1/PHY/TOOLS/tools_defs.h +++ b/openair1/PHY/TOOLS/tools_defs.h @@ -262,6 +262,7 @@ void dft98304(int16_t *x,int16_t *y,uint8_t scale_flag); void idft64(int16_t *x,int16_t *y,uint8_t scale_flag); void idft128(int16_t *x,int16_t *y,uint8_t scale_flag); void idft256(int16_t *x,int16_t *y,uint8_t scale_flag); +void idft384(int16_t *x,int16_t *y,uint8_t scale_flag); void idft512(int16_t *x,int16_t *y,uint8_t scale_flag); void idft768(int16_t *x,int16_t *y,uint8_t scale_flag); void idft1024(int16_t *x,int16_t *y,uint8_t scale_flag); @@ -324,14 +325,14 @@ adftfunc_t dft_ftab[]={ #endif typedef enum idft_size_idx { - IDFT_128, IDFT_256, IDFT_512, IDFT_768, IDFT_1024, IDFT_1536, IDFT_2048, IDFT_3072, IDFT_4096, + IDFT_128, IDFT_256, IDFT_384, IDFT_512, IDFT_768, IDFT_1024, IDFT_1536, IDFT_2048, IDFT_3072, IDFT_4096, IDFT_6144, IDFT_8192, IDFT_9216, IDFT_12288, IDFT_18432, IDFT_24576, IDFT_36864, IDFT_49152, IDFT_73728, IDFT_98304, IDFT_SIZE_IDXTABLESIZE } idft_size_idx_t; #ifdef OAIDFTS_MAIN aidftfunc_t idft_ftab[]={ - idft128, idft256, idft512, idft768, idft1024, idft1536, idft2048, idft3072, idft4096, + idft128, idft256, idft384, idft512, idft768, idft1024, idft1536, idft2048, idft3072, idft4096, idft6144, idft8192, idft9216, idft12288, idft18432, idft24576, idft36864, idft49152, idft73728, idft98304 }; diff --git a/openair1/PHY/defs_nr_UE.h b/openair1/PHY/defs_nr_UE.h index 826bf45f53..32a0b905a1 100644 --- a/openair1/PHY/defs_nr_UE.h +++ b/openair1/PHY/defs_nr_UE.h @@ -383,6 +383,12 @@ typedef struct { int32_t **ptrs_re_per_slot; } NR_UE_PDSCH; +typedef struct { + prs_data_t prs_cfg; + int32_t **prs_ch_estimates; + int32_t **prs_ch_estimates_time; +} NR_UE_PRS; + #define NR_PDCCH_DEFS_NR_UE #define NR_NBR_CORESET_ACT_BWP 3 // The number of CoreSets per BWP is limited to 3 (including initial CORESET: ControlResourceId 0) #define NR_NBR_SEARCHSPACE_ACT_BWP 10 // The number of SearchSpaces per BWP is limited to 10 (including initial SEARCHSPACE: SearchSpaceId 0) @@ -823,9 +829,7 @@ typedef struct { NR_UE_DLSCH_t *dlsch_ra[NUMBER_OF_CONNECTED_gNB_MAX]; NR_UE_DLSCH_t *dlsch_p[NUMBER_OF_CONNECTED_gNB_MAX]; NR_UE_DLSCH_t *dlsch_MCH[NUMBER_OF_CONNECTED_gNB_MAX]; - prs_data_t prs_cfg; - int32_t **prs_ch_estimates; - int32_t **prs_ch_estimates_time; + NR_UE_PRS *prs_vars[NUMBER_OF_CONNECTED_gNB_MAX]; //Paging parameters uint32_t IMSImod1024; diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c index 2fe72db761..bfcf1a5954 100644 --- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c +++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c @@ -1661,20 +1661,20 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue, } /* - ue->prs_cfg.PRSResourceSetPeriod[0]=40; // PRS resource slot period - ue->prs_cfg.PRSResourceSetPeriod[1]=0; // resource slot offset - ue->prs_cfg.SymbolStart=7; - ue->prs_cfg.NumPRSSymbols=4; - ue->prs_cfg.NumRB=fp->N_RB_DL; - ue->prs_cfg.RBOffset=0; - ue->prs_cfg.CombSize=4; - ue->prs_cfg.REOffset=0; - ue->prs_cfg.PRSResourceOffset=0; - ue->prs_cfg.PRSResourceRepetition=1; - ue->prs_cfg.PRSResourceTimeGap=1; - ue->prs_cfg.NPRSID=0; + ue->prs_vars[gNB_id]->prs_cfg.PRSResourceSetPeriod[0]=40; // PRS resource slot period + ue->prs_vars[gNB_id]->prs_cfg.PRSResourceSetPeriod[1]=0; // resource slot offset + ue->prs_vars[gNB_id]->prs_cfg.SymbolStart=7; + ue->prs_vars[gNB_id]->prs_cfg.NumPRSSymbols=4; + ue->prs_vars[gNB_id]->prs_cfg.NumRB=fp->N_RB_DL; + ue->prs_vars[gNB_id]->prs_cfg.RBOffset=0; + ue->prs_vars[gNB_id]->prs_cfg.CombSize=4; + ue->prs_vars[gNB_id]->prs_cfg.REOffset=0; + ue->prs_vars[gNB_id]->prs_cfg.PRSResourceOffset=0; + ue->prs_vars[gNB_id]->prs_cfg.PRSResourceRepetition=1; + ue->prs_vars[gNB_id]->prs_cfg.PRSResourceTimeGap=1; + ue->prs_vars[gNB_id]->prs_cfg.NPRSID=0; */ - for(int j = ue->prs_cfg.SymbolStart; j < (ue->prs_cfg.SymbolStart + ue->prs_cfg.NumPRSSymbols); j++) + for(int j = ue->prs_vars[gNB_id]->prs_cfg.SymbolStart; j < (ue->prs_vars[gNB_id]->prs_cfg.SymbolStart + ue->prs_vars[gNB_id]->prs_cfg.NumPRSSymbols); j++) { nr_slot_fep(ue, proc, @@ -1683,7 +1683,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue, } //PRS channel estimation - nr_prs_channel_estimation(ue,proc,fp); + nr_prs_channel_estimation(gNB_id,ue,proc,fp); } if ((frame_rx%64 == 0) && (nr_slot_rx==0)) { diff --git a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c index ff0a20d5b3..13cb3a7db5 100644 --- a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c +++ b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c @@ -1278,7 +1278,7 @@ void RCconfig_nr_ue_L1(void) { void RCconfig_nrUE_prs(void *cfg) { - int j = 0; + int j = 0, gNB_id = 0; PHY_VARS_NR_UE *ue = (PHY_VARS_NR_UE *)cfg; paramdef_t PRS_Params[] = PRS_PARAMS_DESC; paramlist_def_t PRS_ParamList = {GNB_CONFIG_STRING_PRS_CONFIG,NULL,0}; @@ -1286,30 +1286,30 @@ void RCconfig_nrUE_prs(void *cfg) printf("Inside RCconfig_nrUE_prs\n"); if (PRS_ParamList.numelt > 0) { - ue->prs_cfg.PRSResourceSetPeriod[0] = *(PRS_ParamList.paramarray[j][PRS_RESOURCE_SET_PERIOD0].uptr); - ue->prs_cfg.PRSResourceSetPeriod[1] = *(PRS_ParamList.paramarray[j][PRS_RESOURCE_SET_PERIOD1].uptr); - ue->prs_cfg.SymbolStart = *(PRS_ParamList.paramarray[j][PRS_SYMBOL_START].uptr); - ue->prs_cfg.NumPRSSymbols = *(PRS_ParamList.paramarray[j][PRS_NUM_SYMBOLS].uptr); - ue->prs_cfg.NumRB = *(PRS_ParamList.paramarray[j][PRS_NUM_RB].uptr); - ue->prs_cfg.RBOffset = *(PRS_ParamList.paramarray[j][PRS_RB_OFFSET].uptr); - ue->prs_cfg.CombSize = *(PRS_ParamList.paramarray[j][PRS_COMB_SIZE].uptr); - ue->prs_cfg.REOffset = *(PRS_ParamList.paramarray[j][PRS_RE_OFFSET].uptr); - ue->prs_cfg.PRSResourceOffset = *(PRS_ParamList.paramarray[j][PRS_RESOURCE_OFFSET].uptr); - ue->prs_cfg.PRSResourceRepetition = *(PRS_ParamList.paramarray[j][PRS_RESOURCE_REPETITION].uptr); - ue->prs_cfg.PRSResourceTimeGap = *(PRS_ParamList.paramarray[j][PRS_RESOURCE_TIME_GAP].uptr); + ue->prs_vars[gNB_id]->prs_cfg.PRSResourceSetPeriod[0] = *(PRS_ParamList.paramarray[j][PRS_RESOURCE_SET_PERIOD0].uptr); + ue->prs_vars[gNB_id]->prs_cfg.PRSResourceSetPeriod[1] = *(PRS_ParamList.paramarray[j][PRS_RESOURCE_SET_PERIOD1].uptr); + ue->prs_vars[gNB_id]->prs_cfg.SymbolStart = *(PRS_ParamList.paramarray[j][PRS_SYMBOL_START].uptr); + ue->prs_vars[gNB_id]->prs_cfg.NumPRSSymbols = *(PRS_ParamList.paramarray[j][PRS_NUM_SYMBOLS].uptr); + ue->prs_vars[gNB_id]->prs_cfg.NumRB = *(PRS_ParamList.paramarray[j][PRS_NUM_RB].uptr); + ue->prs_vars[gNB_id]->prs_cfg.RBOffset = *(PRS_ParamList.paramarray[j][PRS_RB_OFFSET].uptr); + ue->prs_vars[gNB_id]->prs_cfg.CombSize = *(PRS_ParamList.paramarray[j][PRS_COMB_SIZE].uptr); + ue->prs_vars[gNB_id]->prs_cfg.REOffset = *(PRS_ParamList.paramarray[j][PRS_RE_OFFSET].uptr); + ue->prs_vars[gNB_id]->prs_cfg.PRSResourceOffset = *(PRS_ParamList.paramarray[j][PRS_RESOURCE_OFFSET].uptr); + ue->prs_vars[gNB_id]->prs_cfg.PRSResourceRepetition = *(PRS_ParamList.paramarray[j][PRS_RESOURCE_REPETITION].uptr); + ue->prs_vars[gNB_id]->prs_cfg.PRSResourceTimeGap = *(PRS_ParamList.paramarray[j][PRS_RESOURCE_TIME_GAP].uptr); LOG_I(NR_PHY, "PRS Config for at nrUE %d\n", 0); - LOG_I(NR_PHY, "PRSResourceSetPeriod0 %d\n", ue->prs_cfg.PRSResourceSetPeriod[0]); - LOG_I(NR_PHY, "PRSResourceSetPeriod1 %d\n", ue->prs_cfg.PRSResourceSetPeriod[1]); - LOG_I(NR_PHY, "SymbolStart %d\n", ue->prs_cfg.SymbolStart); - LOG_I(NR_PHY, "NumPRSSymbols %d\n", ue->prs_cfg.NumPRSSymbols); - LOG_I(NR_PHY, "NumRB %d\n", ue->prs_cfg.NumRB); - LOG_I(NR_PHY, "RBOffset %d\n", ue->prs_cfg.RBOffset); - LOG_I(NR_PHY, "CombSize %d\n", ue->prs_cfg.CombSize); - LOG_I(NR_PHY, "REOffset %d\n", ue->prs_cfg.REOffset); - LOG_I(NR_PHY, "PRSResourceOffset %d\n", ue->prs_cfg.PRSResourceOffset); - LOG_I(NR_PHY, "PRSResourceRepetition %d\n", ue->prs_cfg.PRSResourceRepetition); - LOG_I(NR_PHY, "PRSResourceTimeGap %d\n", ue->prs_cfg.PRSResourceTimeGap); + LOG_I(NR_PHY, "PRSResourceSetPeriod0 %d\n", ue->prs_vars[gNB_id]->prs_cfg.PRSResourceSetPeriod[0]); + LOG_I(NR_PHY, "PRSResourceSetPeriod1 %d\n", ue->prs_vars[gNB_id]->prs_cfg.PRSResourceSetPeriod[1]); + LOG_I(NR_PHY, "SymbolStart %d\n", ue->prs_vars[gNB_id]->prs_cfg.SymbolStart); + LOG_I(NR_PHY, "NumPRSSymbols %d\n", ue->prs_vars[gNB_id]->prs_cfg.NumPRSSymbols); + LOG_I(NR_PHY, "NumRB %d\n", ue->prs_vars[gNB_id]->prs_cfg.NumRB); + LOG_I(NR_PHY, "RBOffset %d\n", ue->prs_vars[gNB_id]->prs_cfg.RBOffset); + LOG_I(NR_PHY, "CombSize %d\n", ue->prs_vars[gNB_id]->prs_cfg.CombSize); + LOG_I(NR_PHY, "REOffset %d\n", ue->prs_vars[gNB_id]->prs_cfg.REOffset); + LOG_I(NR_PHY, "PRSResourceOffset %d\n", ue->prs_vars[gNB_id]->prs_cfg.PRSResourceOffset); + LOG_I(NR_PHY, "PRSResourceRepetition %d\n", ue->prs_vars[gNB_id]->prs_cfg.PRSResourceRepetition); + LOG_I(NR_PHY, "PRSResourceTimeGap %d\n", ue->prs_vars[gNB_id]->prs_cfg.PRSResourceTimeGap); } else { From 76ba0aaa1d9d1f747381811b953635c491e4adda Mon Sep 17 00:00:00 2001 From: Sagar Parsawar Date: Fri, 4 Mar 2022 16:23:20 +0100 Subject: [PATCH 054/135] PRS config file changes for multiple gNB handling --- openair1/PHY/INIT/nr_init_ue.c | 28 ++++--- .../nr_dl_channel_estimation.c | 2 +- openair1/PHY/defs_nr_UE.h | 2 +- openair1/PHY/defs_nr_common.h | 1 + openair2/GNB_APP/gnb_config.c | 33 ++++---- openair2/GNB_APP/gnb_paramdef.h | 3 - openair2/GNB_APP/prs_nr_paramdef.h | 68 +++++++++------ openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c | 82 ++++++++++++------- .../GENERIC-NR-5GC/CONF/ue_nr_prs.conf | 55 +++++++++---- 9 files changed, 173 insertions(+), 101 deletions(-) diff --git a/openair1/PHY/INIT/nr_init_ue.c b/openair1/PHY/INIT/nr_init_ue.c index 325b0577af..76f872c9f4 100644 --- a/openair1/PHY/INIT/nr_init_ue.c +++ b/openair1/PHY/INIT/nr_init_ue.c @@ -324,6 +324,22 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, nr_gold_pdsch(ue,ue->scramblingID); + // PRS vars + for(int idx = 0; idx < NR_MAX_PRS_COMB_SIZE; idx++) + { + prs_vars[idx] = (NR_UE_PRS *)malloc16_clear(sizeof(NR_UE_PRS)); + + // PRS channel estimates + prs_vars[idx]->prs_ch_estimates = (int32_t **)malloc16_clear( fp->nb_antennas_rx*sizeof(int32_t *) ); + prs_vars[idx]->prs_ch_estimates_time = (int32_t **)malloc16_clear( fp->nb_antennas_rx*sizeof(int32_t *) ); + AssertFatal(((prs_vars[idx]->prs_ch_estimates!=NULL) || (prs_vars[idx]->prs_ch_estimates_time!=NULL)), "NR UE init: PRS channel estimates malloc failed\n"); + + for (i=0; inb_antennas_rx; i++) { + prs_vars[idx]->prs_ch_estimates[i] = (int32_t *)malloc16_clear(2*fp->ofdm_symbol_size*NR_MAX_NUM_PRS_SYMB); + prs_vars[idx]->prs_ch_estimates_time[i] = (int32_t *)malloc16_clear(2*fp->ofdm_symbol_size*NR_MAX_NUM_PRS_SYMB); + AssertFatal(((prs_vars[idx]->prs_ch_estimates[i]!=NULL) || (prs_vars[idx]->prs_ch_estimates_time[i]!=NULL)), "NR UE init: PRS channel estimates malloc failed %d\n", i); + } + } // DLSCH for (gNB_id = 0; gNB_id < ue->n_connected_gNB; gNB_id++) { for (th_id=0; th_idprs_ch_estimates = (int32_t **)malloc16_clear( fp->nb_antennas_rx*sizeof(int32_t *) ); - prs_vars[gNB_id]->prs_ch_estimates_time = (int32_t **)malloc16_clear( fp->nb_antennas_rx*sizeof(int32_t *) ); - AssertFatal(((prs_vars[gNB_id]->prs_ch_estimates!=NULL) || (prs_vars[gNB_id]->prs_ch_estimates_time!=NULL)), "NR UE init: PRS channel estimates malloc failed\n"); - - for (i=0; inb_antennas_rx; i++) { - prs_vars[gNB_id]->prs_ch_estimates[i] = (int32_t *)malloc16_clear(2*fp->ofdm_symbol_size*NR_MAX_NUM_PRS_SYMB); - prs_vars[gNB_id]->prs_ch_estimates_time[i] = (int32_t *)malloc16_clear(2*fp->ofdm_symbol_size*NR_MAX_NUM_PRS_SYMB); - AssertFatal(((prs_vars[gNB_id]->prs_ch_estimates[i]!=NULL) || (prs_vars[gNB_id]->prs_ch_estimates_time[i]!=NULL)), "NR UE init: PRS channel estimates malloc failed %d\n", i); - } if (abstraction_flag == 0) { 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 998930057f..fdccc5fc68 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -406,7 +406,7 @@ int nr_prs_channel_estimation(uint8_t gNB_id, frame_params->ofdm_symbol_size, &tdoa[l], &ch_pwr[l]); - LOG_I(PHY, "[gNB %d][Rx %d] TDoA for PRS symbol %d ==> %d / %d samples, peak channel power %.1f dB\n", gNB_id, rxAnt, l, tdoa[l]-(frame_params->ofdm_symbol_size>>1), frame_params->ofdm_symbol_size, 10*log10(ch_pwr[l])); + LOG_I(PHY, "[gNB %d][Rx %d] TDoA for PRS symbol %2d ==> %d / %d samples, peak channel power %.1f dB\n", gNB_id, rxAnt, l, tdoa[l]-(frame_params->ofdm_symbol_size>>1), frame_params->ofdm_symbol_size, 10*log10(ch_pwr[l])); } // for rxAnt } //for l diff --git a/openair1/PHY/defs_nr_UE.h b/openair1/PHY/defs_nr_UE.h index 32a0b905a1..c3777a4f54 100644 --- a/openair1/PHY/defs_nr_UE.h +++ b/openair1/PHY/defs_nr_UE.h @@ -829,7 +829,7 @@ typedef struct { NR_UE_DLSCH_t *dlsch_ra[NUMBER_OF_CONNECTED_gNB_MAX]; NR_UE_DLSCH_t *dlsch_p[NUMBER_OF_CONNECTED_gNB_MAX]; NR_UE_DLSCH_t *dlsch_MCH[NUMBER_OF_CONNECTED_gNB_MAX]; - NR_UE_PRS *prs_vars[NUMBER_OF_CONNECTED_gNB_MAX]; + NR_UE_PRS *prs_vars[NR_MAX_PRS_COMB_SIZE]; //Paging parameters uint32_t IMSImod1024; diff --git a/openair1/PHY/defs_nr_common.h b/openair1/PHY/defs_nr_common.h index 12f4478867..cfcd88258e 100644 --- a/openair1/PHY/defs_nr_common.h +++ b/openair1/PHY/defs_nr_common.h @@ -83,6 +83,7 @@ #define NR_MAX_PRS_LENGTH 3264 //272*6(max allocation per RB)*2(QPSK) #define NR_MAX_PRS_INIT_LENGTH_DWORD 102 // ceil(NR_MAX_CSI_RS_LENGTH/32) #define NR_MAX_NUM_PRS_SYMB 12 +#define NR_MAX_PRS_COMB_SIZE 12 #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 diff --git a/openair2/GNB_APP/gnb_config.c b/openair2/GNB_APP/gnb_config.c index 29ef6d72a8..4d1bb245fc 100644 --- a/openair2/GNB_APP/gnb_config.c +++ b/openair2/GNB_APP/gnb_config.c @@ -608,7 +608,7 @@ void RCconfig_nr_prs(void) uint16_t j; paramdef_t PRS_Params[] = PRS_PARAMS_DESC; - paramlist_def_t PRS_ParamList = {GNB_CONFIG_STRING_PRS_CONFIG,NULL,0}; + paramlist_def_t PRS_ParamList = {CONFIG_STRING_PRS_CONFIG,NULL,0}; if (RC.gNB == NULL) { RC.gNB = (PHY_VARS_gNB **)malloc((1+NUMBER_OF_gNB_MAX)*sizeof(PHY_VARS_gNB*)); @@ -640,24 +640,29 @@ void RCconfig_nr_prs(void) RC.gNB[j]->prs_cfg.PRSResourceOffset = *(PRS_ParamList.paramarray[j][PRS_RESOURCE_OFFSET].uptr); RC.gNB[j]->prs_cfg.PRSResourceRepetition = *(PRS_ParamList.paramarray[j][PRS_RESOURCE_REPETITION].uptr); RC.gNB[j]->prs_cfg.PRSResourceTimeGap = *(PRS_ParamList.paramarray[j][PRS_RESOURCE_TIME_GAP].uptr); + RC.gNB[j]->prs_cfg.NPRSID = *(PRS_ParamList.paramarray[j][PRS_ID].uptr); - LOG_I(NR_PHY, "PRS Config for gNB_ID %d\n", j); - LOG_I(NR_PHY, "PRSResourceSetPeriod0 %d\n", RC.gNB[j]->prs_cfg.PRSResourceSetPeriod[0]); - LOG_I(NR_PHY, "PRSResourceSetPeriod1 %d\n", RC.gNB[j]->prs_cfg.PRSResourceSetPeriod[1]); - LOG_I(NR_PHY, "SymbolStart %d\n", RC.gNB[j]->prs_cfg.SymbolStart); - LOG_I(NR_PHY, "NumPRSSymbols %d\n", RC.gNB[j]->prs_cfg.NumPRSSymbols); - LOG_I(NR_PHY, "NumRB %d\n", RC.gNB[j]->prs_cfg.NumRB); - LOG_I(NR_PHY, "RBOffset %d\n", RC.gNB[j]->prs_cfg.RBOffset); - LOG_I(NR_PHY, "CombSize %d\n", RC.gNB[j]->prs_cfg.CombSize); - LOG_I(NR_PHY, "REOffset %d\n", RC.gNB[j]->prs_cfg.REOffset); - LOG_I(NR_PHY, "PRSResourceOffset %d\n", RC.gNB[j]->prs_cfg.PRSResourceOffset); - LOG_I(NR_PHY, "PRSResourceRepetition %d\n", RC.gNB[j]->prs_cfg.PRSResourceRepetition); - LOG_I(NR_PHY, "PRSResourceTimeGap %d\n", RC.gNB[j]->prs_cfg.PRSResourceTimeGap); + LOG_I(PHY, "--------------------------\n"); + LOG_I(PHY, "PRS Config for gNB_ID %d\n", j); + LOG_I(PHY, "--------------------------\n"); + LOG_I(PHY, "PRSResourceSetPeriod0 %d\n", RC.gNB[j]->prs_cfg.PRSResourceSetPeriod[0]); + LOG_I(PHY, "PRSResourceSetPeriod1 %d\n", RC.gNB[j]->prs_cfg.PRSResourceSetPeriod[1]); + LOG_I(PHY, "SymbolStart %d\n", RC.gNB[j]->prs_cfg.SymbolStart); + LOG_I(PHY, "NumPRSSymbols %d\n", RC.gNB[j]->prs_cfg.NumPRSSymbols); + LOG_I(PHY, "NumRB %d\n", RC.gNB[j]->prs_cfg.NumRB); + LOG_I(PHY, "RBOffset %d\n", RC.gNB[j]->prs_cfg.RBOffset); + LOG_I(PHY, "CombSize %d\n", RC.gNB[j]->prs_cfg.CombSize); + LOG_I(PHY, "REOffset %d\n", RC.gNB[j]->prs_cfg.REOffset); + LOG_I(PHY, "PRSResourceOffset %d\n", RC.gNB[j]->prs_cfg.PRSResourceOffset); + LOG_I(PHY, "PRSResourceRepetition %d\n", RC.gNB[j]->prs_cfg.PRSResourceRepetition); + LOG_I(PHY, "PRSResourceTimeGap %d\n", RC.gNB[j]->prs_cfg.PRSResourceTimeGap); + LOG_I(PHY, "NPRS_ID %d\n", RC.gNB[j]->prs_cfg.NPRSID); + LOG_I(PHY, "--------------------------\n"); } // for j } else { - LOG_I(NR_PHY,"No " GNB_CONFIG_STRING_PRS_CONFIG " configuration found\n"); + LOG_I(NR_PHY,"No " CONFIG_STRING_PRS_CONFIG " configuration found\n"); } } diff --git a/openair2/GNB_APP/gnb_paramdef.h b/openair2/GNB_APP/gnb_paramdef.h index 2c4422ef64..670536eb68 100644 --- a/openair2/GNB_APP/gnb_paramdef.h +++ b/openair2/GNB_APP/gnb_paramdef.h @@ -352,9 +352,6 @@ typedef enum { #define CONFIG_STRING_L1_LIST "L1s" #define CONFIG_STRING_L1_CONFIG "l1_config" -/* PRS configuration section names */ -#define GNB_CONFIG_STRING_PRS_CONFIG "prs_config" - /*----------------------------------------------------------------------------------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------------------------------------------------------------------------------*/ diff --git a/openair2/GNB_APP/prs_nr_paramdef.h b/openair2/GNB_APP/prs_nr_paramdef.h index 4aa2b08a53..5144f3c95f 100644 --- a/openair2/GNB_APP/prs_nr_paramdef.h +++ b/openair2/GNB_APP/prs_nr_paramdef.h @@ -35,8 +35,26 @@ /*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ +/* PRS configuration section names */ +#define CONFIG_STRING_PRS_LIST "PRSs" +#define CONFIG_STRING_PRS_CONFIG "prs_config" + + +/* Global parameters */ +#define CONFIG_STRING_ACTIVE_GNBs "Active_gNBs" +/*----------------------------------------------------------------------------------------------------------------------------------------------------*/ +/* PRS configuration parameters */ +/* optname helpstr paramflags XXXptr defXXXval type numelt */ +/*----------------------------------------------------------------------------------------------------------------------------------------------------*/ +#define PRS_GLOBAL_PARAMS_DESC { \ +{CONFIG_STRING_ACTIVE_GNBs, NULL, 0, uptr:NULL, defuintval:0, TYPE_UINT, 0} \ +} + +#define PRS_ACTIVE_GNBS_IDX 0 +/*----------------------------------------------------------------------------------------------------------------------------------------------------*/ /* PRS configuration parameters names */ +#define CONFIG_STRING_GNB_ID "gNB_id" #define CONFIG_STRING_PRS_RESOURCE_SET_PERIOD0 "PRSResourceSetPeriod0" #define CONFIG_STRING_PRS_RESOURCE_SET_PERIOD1 "PRSResourceSetPeriod1" #define CONFIG_STRING_PRS_SYMBOL_START "SymbolStart" @@ -56,32 +74,34 @@ /* optname helpstr paramflags XXXptr defXXXval type numelt */ /*----------------------------------------------------------------------------------------------------------------------------------------------------*/ #define PRS_PARAMS_DESC { \ -{CONFIG_STRING_PRS_RESOURCE_SET_PERIOD0, NULL, 0, uptr:NULL, defintval:40, TYPE_UINT, 0}, \ -{CONFIG_STRING_PRS_RESOURCE_SET_PERIOD1, NULL, 0, uptr:NULL, defintval:0, TYPE_UINT, 0}, \ -{CONFIG_STRING_PRS_SYMBOL_START, NULL, 0, uptr:NULL, defintval:7, TYPE_UINT, 0}, \ -{CONFIG_STRING_PRS_NUM_SYMBOLS, NULL, 0, uptr:NULL, defintval:4, TYPE_UINT, 0}, \ -{CONFIG_STRING_PRS_NUM_RB, NULL, 0, uptr:NULL, defintval:106, TYPE_UINT, 0}, \ -{CONFIG_STRING_PRS_RB_OFFSET, NULL, 0, uptr:NULL, defintval:0, TYPE_UINT, 0}, \ -{CONFIG_STRING_PRS_COMB_SIZE, NULL, 0, uptr:NULL, defintval:4, TYPE_UINT, 0}, \ -{CONFIG_STRING_PRS_RE_OFFSET, NULL, 0, uptr:NULL, defintval:0, TYPE_UINT, 0}, \ -{CONFIG_STRING_PRS_RESOURCE_OFFSET, NULL, 0, uptr:NULL, defintval:0, TYPE_UINT, 0}, \ -{CONFIG_STRING_PRS_RESOURCE_REPETITION, NULL, 0, uptr:NULL, defintval:1, TYPE_UINT, 0}, \ -{CONFIG_STRING_PRS_RESOURCE_TIME_GAP, NULL, 0, uptr:NULL, defuintval:1, TYPE_UINT, 0}, \ -{CONFIG_STRING_PRS_ID, NULL, 0, uptr:NULL, defintval:0, TYPE_UINT, 0} \ +{CONFIG_STRING_GNB_ID, NULL, 0, uptr:NULL, defuintval:0, TYPE_UINT, 0}, \ +{CONFIG_STRING_PRS_RESOURCE_SET_PERIOD0, NULL, 0, uptr:NULL, defuintval:0, TYPE_UINT, 0}, \ +{CONFIG_STRING_PRS_RESOURCE_SET_PERIOD1, NULL, 0, uptr:NULL, defuintval:0, TYPE_UINT, 0}, \ +{CONFIG_STRING_PRS_SYMBOL_START, NULL, 0, uptr:NULL, defuintval:0, TYPE_UINT, 0}, \ +{CONFIG_STRING_PRS_NUM_SYMBOLS, NULL, 0, uptr:NULL, defuintval:0, TYPE_UINT, 0}, \ +{CONFIG_STRING_PRS_NUM_RB, NULL, 0, uptr:NULL, defuintval:0, TYPE_UINT, 0}, \ +{CONFIG_STRING_PRS_RB_OFFSET, NULL, 0, uptr:NULL, defuintval:0, TYPE_UINT, 0}, \ +{CONFIG_STRING_PRS_COMB_SIZE, NULL, 0, uptr:NULL, defuintval:0, TYPE_UINT, 0}, \ +{CONFIG_STRING_PRS_RE_OFFSET, NULL, 0, uptr:NULL, defuintval:0, TYPE_UINT, 0}, \ +{CONFIG_STRING_PRS_RESOURCE_OFFSET, NULL, 0, uptr:NULL, defuintval:0, TYPE_UINT, 0}, \ +{CONFIG_STRING_PRS_RESOURCE_REPETITION, NULL, 0, uptr:NULL, defuintval:0, TYPE_UINT, 0}, \ +{CONFIG_STRING_PRS_RESOURCE_TIME_GAP, NULL, 0, uptr:NULL, defuintval:0, TYPE_UINT, 0}, \ +{CONFIG_STRING_PRS_ID, NULL, 0, uptr:NULL, defuintval:0, TYPE_UINT, 0} \ } -#define PRS_RESOURCE_SET_PERIOD0 0 -#define PRS_RESOURCE_SET_PERIOD1 1 -#define PRS_SYMBOL_START 2 -#define PRS_NUM_SYMBOLS 3 -#define PRS_NUM_RB 4 -#define PRS_RB_OFFSET 5 -#define PRS_COMB_SIZE 6 -#define PRS_RE_OFFSET 7 -#define PRS_RESOURCE_OFFSET 8 -#define PRS_RESOURCE_REPETITION 9 -#define PRS_RESOURCE_TIME_GAP 10 -#define PRS_ID 11 +#define PRS_GNB_ID 0 +#define PRS_RESOURCE_SET_PERIOD0 1 +#define PRS_RESOURCE_SET_PERIOD1 2 +#define PRS_SYMBOL_START 3 +#define PRS_NUM_SYMBOLS 4 +#define PRS_NUM_RB 5 +#define PRS_RB_OFFSET 6 +#define PRS_COMB_SIZE 7 +#define PRS_RE_OFFSET 8 +#define PRS_RESOURCE_OFFSET 9 +#define PRS_RESOURCE_REPETITION 10 +#define PRS_RESOURCE_TIME_GAP 11 +#define PRS_ID 12 /*----------------------------------------------------------------------------------------------------------------------------------------------------*/ #endif diff --git a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c index 13cb3a7db5..2be3a2537e 100644 --- a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c +++ b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c @@ -1279,40 +1279,60 @@ void RCconfig_nr_ue_L1(void) { void RCconfig_nrUE_prs(void *cfg) { int j = 0, gNB_id = 0; + char aprefix[MAX_OPTNAME_SIZE*2 + 8]; PHY_VARS_NR_UE *ue = (PHY_VARS_NR_UE *)cfg; - paramdef_t PRS_Params[] = PRS_PARAMS_DESC; - paramlist_def_t PRS_ParamList = {GNB_CONFIG_STRING_PRS_CONFIG,NULL,0}; - config_getlist( &PRS_ParamList,PRS_Params,sizeof(PRS_Params)/sizeof(paramdef_t), NULL); - printf("Inside RCconfig_nrUE_prs\n"); - if (PRS_ParamList.numelt > 0) { - ue->prs_vars[gNB_id]->prs_cfg.PRSResourceSetPeriod[0] = *(PRS_ParamList.paramarray[j][PRS_RESOURCE_SET_PERIOD0].uptr); - ue->prs_vars[gNB_id]->prs_cfg.PRSResourceSetPeriod[1] = *(PRS_ParamList.paramarray[j][PRS_RESOURCE_SET_PERIOD1].uptr); - ue->prs_vars[gNB_id]->prs_cfg.SymbolStart = *(PRS_ParamList.paramarray[j][PRS_SYMBOL_START].uptr); - ue->prs_vars[gNB_id]->prs_cfg.NumPRSSymbols = *(PRS_ParamList.paramarray[j][PRS_NUM_SYMBOLS].uptr); - ue->prs_vars[gNB_id]->prs_cfg.NumRB = *(PRS_ParamList.paramarray[j][PRS_NUM_RB].uptr); - ue->prs_vars[gNB_id]->prs_cfg.RBOffset = *(PRS_ParamList.paramarray[j][PRS_RB_OFFSET].uptr); - ue->prs_vars[gNB_id]->prs_cfg.CombSize = *(PRS_ParamList.paramarray[j][PRS_COMB_SIZE].uptr); - ue->prs_vars[gNB_id]->prs_cfg.REOffset = *(PRS_ParamList.paramarray[j][PRS_RE_OFFSET].uptr); - ue->prs_vars[gNB_id]->prs_cfg.PRSResourceOffset = *(PRS_ParamList.paramarray[j][PRS_RESOURCE_OFFSET].uptr); - ue->prs_vars[gNB_id]->prs_cfg.PRSResourceRepetition = *(PRS_ParamList.paramarray[j][PRS_RESOURCE_REPETITION].uptr); - ue->prs_vars[gNB_id]->prs_cfg.PRSResourceTimeGap = *(PRS_ParamList.paramarray[j][PRS_RESOURCE_TIME_GAP].uptr); + paramlist_def_t gParamList = {CONFIG_STRING_PRS_LIST,NULL,0}; + paramdef_t gParams[] = PRS_GLOBAL_PARAMS_DESC; + config_getlist( &gParamList,gParams,sizeof(gParams)/sizeof(paramdef_t), NULL); + int num_gnbs = *(gParamList.paramarray[j][PRS_ACTIVE_GNBS_IDX].uptr); - LOG_I(NR_PHY, "PRS Config for at nrUE %d\n", 0); - LOG_I(NR_PHY, "PRSResourceSetPeriod0 %d\n", ue->prs_vars[gNB_id]->prs_cfg.PRSResourceSetPeriod[0]); - LOG_I(NR_PHY, "PRSResourceSetPeriod1 %d\n", ue->prs_vars[gNB_id]->prs_cfg.PRSResourceSetPeriod[1]); - LOG_I(NR_PHY, "SymbolStart %d\n", ue->prs_vars[gNB_id]->prs_cfg.SymbolStart); - LOG_I(NR_PHY, "NumPRSSymbols %d\n", ue->prs_vars[gNB_id]->prs_cfg.NumPRSSymbols); - LOG_I(NR_PHY, "NumRB %d\n", ue->prs_vars[gNB_id]->prs_cfg.NumRB); - LOG_I(NR_PHY, "RBOffset %d\n", ue->prs_vars[gNB_id]->prs_cfg.RBOffset); - LOG_I(NR_PHY, "CombSize %d\n", ue->prs_vars[gNB_id]->prs_cfg.CombSize); - LOG_I(NR_PHY, "REOffset %d\n", ue->prs_vars[gNB_id]->prs_cfg.REOffset); - LOG_I(NR_PHY, "PRSResourceOffset %d\n", ue->prs_vars[gNB_id]->prs_cfg.PRSResourceOffset); - LOG_I(NR_PHY, "PRSResourceRepetition %d\n", ue->prs_vars[gNB_id]->prs_cfg.PRSResourceRepetition); - LOG_I(NR_PHY, "PRSResourceTimeGap %d\n", ue->prs_vars[gNB_id]->prs_cfg.PRSResourceTimeGap); - } - else + paramlist_def_t PRS_ParamList = {{0},NULL,0}; + for(int i = 0; i < num_gnbs; i++) { - LOG_I(NR_PHY,"No " GNB_CONFIG_STRING_PRS_CONFIG " configuration found\n"); + paramdef_t PRS_Params[] = PRS_PARAMS_DESC; + sprintf(PRS_ParamList.listname, "%s%i", CONFIG_STRING_PRS_CONFIG, i); + + sprintf(aprefix, "%s.[%i]", CONFIG_STRING_PRS_LIST, 0); + config_getlist( &PRS_ParamList,PRS_Params,sizeof(PRS_Params)/sizeof(paramdef_t), aprefix); + + if (PRS_ParamList.numelt > 0) { + for (j = 0; j < PRS_ParamList.numelt; j++) { + gNB_id = *(PRS_ParamList.paramarray[j][PRS_GNB_ID].uptr); + ue->prs_vars[gNB_id]->prs_cfg.PRSResourceSetPeriod[0] = *(PRS_ParamList.paramarray[j][PRS_RESOURCE_SET_PERIOD0].uptr); + ue->prs_vars[gNB_id]->prs_cfg.PRSResourceSetPeriod[1] = *(PRS_ParamList.paramarray[j][PRS_RESOURCE_SET_PERIOD1].uptr); + ue->prs_vars[gNB_id]->prs_cfg.SymbolStart = *(PRS_ParamList.paramarray[j][PRS_SYMBOL_START].uptr); + ue->prs_vars[gNB_id]->prs_cfg.NumPRSSymbols = *(PRS_ParamList.paramarray[j][PRS_NUM_SYMBOLS].uptr); + ue->prs_vars[gNB_id]->prs_cfg.NumRB = *(PRS_ParamList.paramarray[j][PRS_NUM_RB].uptr); + ue->prs_vars[gNB_id]->prs_cfg.RBOffset = *(PRS_ParamList.paramarray[j][PRS_RB_OFFSET].uptr); + ue->prs_vars[gNB_id]->prs_cfg.CombSize = *(PRS_ParamList.paramarray[j][PRS_COMB_SIZE].uptr); + ue->prs_vars[gNB_id]->prs_cfg.REOffset = *(PRS_ParamList.paramarray[j][PRS_RE_OFFSET].uptr); + ue->prs_vars[gNB_id]->prs_cfg.PRSResourceOffset = *(PRS_ParamList.paramarray[j][PRS_RESOURCE_OFFSET].uptr); + ue->prs_vars[gNB_id]->prs_cfg.PRSResourceRepetition = *(PRS_ParamList.paramarray[j][PRS_RESOURCE_REPETITION].uptr); + ue->prs_vars[gNB_id]->prs_cfg.PRSResourceTimeGap = *(PRS_ParamList.paramarray[j][PRS_RESOURCE_TIME_GAP].uptr); + ue->prs_vars[gNB_id]->prs_cfg.NPRSID = *(PRS_ParamList.paramarray[j][PRS_ID].uptr); + + LOG_I(PHY, "--------------------------\n"); + LOG_I(PHY, "PRS Config for gNB_id %d\n", gNB_id); + LOG_I(PHY, "--------------------------\n"); + LOG_I(PHY, "PRSResourceSetPeriod0 %d\n", ue->prs_vars[gNB_id]->prs_cfg.PRSResourceSetPeriod[0]); + LOG_I(PHY, "PRSResourceSetPeriod1 %d\n", ue->prs_vars[gNB_id]->prs_cfg.PRSResourceSetPeriod[1]); + LOG_I(PHY, "SymbolStart %d\n", ue->prs_vars[gNB_id]->prs_cfg.SymbolStart); + LOG_I(PHY, "NumPRSSymbols %d\n", ue->prs_vars[gNB_id]->prs_cfg.NumPRSSymbols); + LOG_I(PHY, "NumRB %d\n", ue->prs_vars[gNB_id]->prs_cfg.NumRB); + LOG_I(PHY, "RBOffset %d\n", ue->prs_vars[gNB_id]->prs_cfg.RBOffset); + LOG_I(PHY, "CombSize %d\n", ue->prs_vars[gNB_id]->prs_cfg.CombSize); + LOG_I(PHY, "REOffset %d\n", ue->prs_vars[gNB_id]->prs_cfg.REOffset); + LOG_I(PHY, "PRSResourceOffset %d\n", ue->prs_vars[gNB_id]->prs_cfg.PRSResourceOffset); + LOG_I(PHY, "PRSResourceRepetition %d\n", ue->prs_vars[gNB_id]->prs_cfg.PRSResourceRepetition); + LOG_I(PHY, "PRSResourceTimeGap %d\n", ue->prs_vars[gNB_id]->prs_cfg.PRSResourceTimeGap); + LOG_I(PHY, "NPRS_ID %d\n", ue->prs_vars[gNB_id]->prs_cfg.NPRSID); + LOG_I(PHY, "--------------------------\n"); + } + } + else + { + LOG_I(NR_PHY,"No %s configuration found\n", PRS_ParamList.listname); + } } } diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue_nr_prs.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue_nr_prs.conf index 591d094c0b..ada5d4fd57 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue_nr_prs.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue_nr_prs.conf @@ -1,16 +1,41 @@ -prs_config = ( -{ - PRSResourceSetPeriod0 = 40; - PRSResourceSetPeriod1 = 0; - SymbolStart = 7; - NumPRSSymbols = 4; - NumRB = 56; - RBOffset = 0; - CombSize = 4; - REOffset = 0; - PRSResourceOffset = 0; - PRSResourceRepetition = 1; - PRSResourceTimeGap = 1; - NPRS_ID = 0; -} +PRSs = +( + { + Active_gNBs = 2; + prs_config0 = ( + { + gNB_id = 0; + PRSResourceSetPeriod0 = 40; + PRSResourceSetPeriod1 = 0; + SymbolStart = 7; + NumPRSSymbols = 4; + NumRB = 106; + RBOffset = 0; + CombSize = 4; + REOffset = 0; + PRSResourceOffset = 0; + PRSResourceRepetition = 1; + PRSResourceTimeGap = 1; + NPRS_ID = 0; + } + ); + + prs_config1 = ( + { + gNB_id = 1; + PRSResourceSetPeriod0 = 40; + PRSResourceSetPeriod1 = 0; + SymbolStart = 7; + NumPRSSymbols = 4; + NumRB = 106; + RBOffset = 0; + CombSize = 4; + REOffset = 1; + PRSResourceOffset = 0; + PRSResourceRepetition = 1; + PRSResourceTimeGap = 1; + NPRS_ID = 0; + } + ); + } ); From 9542973fde88e2316d5ebb10a4f3576304410f6d Mon Sep 17 00:00:00 2001 From: Sagar Parsawar Date: Fri, 4 Mar 2022 17:39:57 +0100 Subject: [PATCH 055/135] OAI UE: Cleanup of prints in PRS channel estimation function --- .../nr_dl_channel_estimation.c | 53 +++++++++++-------- 1 file changed, 30 insertions(+), 23 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 fdccc5fc68..85f29bd904 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -36,6 +36,7 @@ //#define DEBUG_PDCCH //#define DEBUG_CH //#define DEBUG_PRS_CHEST +//#define DEBUG_PRS_PRINTS extern short nr_qpsk_mod_table[8]; int nr_prs_channel_estimation(uint8_t gNB_id, @@ -86,8 +87,8 @@ int nr_prs_channel_estimation(uint8_t gNB_id, //re_offset k = re_offset = (prs_cfg->REOffset+k_prime) % prs_cfg->CombSize + prs_cfg->RBOffset*12 + frame_params->first_carrier_offset; -#ifdef DEBUG_PRS_CHEST - printf("[gNB %d] PRS config l %d k_prime %d, re_offset %d k %d :\nprs_cfg->SymbolStart %d\nprs_cfg->NumPRSSymbols %d\nprs_cfg->NumRB %d\nprs_cfg->CombSize %d\n", gNB_id,l, k_prime, re_offset, k, prs_cfg->SymbolStart, prs_cfg->NumPRSSymbols, prs_cfg->NumRB, prs_cfg->CombSize); +#ifdef DEBUG_PRS_PRINTS + printf("[gNB %d] PRS config l %d k_prime %d, k %d :\nprs_cfg->SymbolStart %d\nprs_cfg->NumPRSSymbols %d\nprs_cfg->NumRB %d\nprs_cfg->CombSize %d\n", gNB_id, l, k_prime, k, prs_cfg->SymbolStart, prs_cfg->NumPRSSymbols, prs_cfg->NumRB, prs_cfg->CombSize); #endif // Pilots generation and modulation for (int m = 0; m < (12/prs_cfg->CombSize)*prs_cfg->NumRB; m++) @@ -135,8 +136,8 @@ int nr_prs_channel_estimation(uint8_t gNB_id, //Start pilot ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); -#ifdef DEBUG_PRS_CHEST - printf("pilot 0 : rxF - > (%d,%d) addr %p ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); +#ifdef DEBUG_PRS_PRINTS + printf("[Rx %d] pilot %3d : rxF - > (%+3d, %+3d) addr %p ch -> (%+3d, %+3d), pil -> (%+d, %+d) \n", rxAnt, 0, rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); #endif multadd_real_vector_complex_scalar(fl, ch, @@ -152,8 +153,8 @@ int nr_prs_channel_estimation(uint8_t gNB_id, { ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); -#ifdef DEBUG_PRS_CHEST - printf("pilot %d : rxF - > (%d,%d) addr %p ch -> (%d,%d), pil -> (%d,%d) \n", pIdx, rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); +#ifdef DEBUG_PRS_PRINTS + printf("[Rx %d] pilot %3d : rxF - > (%+3d, %+3d) addr %p ch -> (%+3d, %+3d), pil -> (%+d, %+d) \n", rxAnt, pIdx, rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); #endif if(pIdx == 1) // 2nd pilot { @@ -175,8 +176,8 @@ int nr_prs_channel_estimation(uint8_t gNB_id, ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); -#ifdef DEBUG_PRS_CHEST - printf("pilot %d : rxF - > (%d,%d) addr %p ch -> (%d,%d), pil -> (%d,%d) \n", pIdx+1, rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); +#ifdef DEBUG_PRS_PRINTS + printf("[Rx %d] pilot %3d : rxF - > (%+3d, %+3d) addr %p ch -> (%+3d, %+3d), pil -> (%+d, %+d) \n", rxAnt, pIdx+1, rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); #endif if(pIdx == (prs_cfg->NumRB*(12/prs_cfg->CombSize)-3)) // 2nd last pilot { @@ -202,8 +203,8 @@ int nr_prs_channel_estimation(uint8_t gNB_id, //End pilot ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); -#ifdef DEBUG_PRS_CHEST - printf("pilot %d : rxF - > (%d,%d) addr %p ch -> (%d,%d), pil -> (%d,%d) \n", prs_cfg->NumRB*(12/prs_cfg->CombSize)-1, rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); +#ifdef DEBUG_PRS_PRINTS + printf("[Rx %d] pilot %3d : rxF - > (%+3d, %+3d) addr %p ch -> (%+3d, %+3d), pil -> (%+d, %+d) \n", rxAnt, prs_cfg->NumRB*(12/prs_cfg->CombSize)-1, rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); #endif multadd_real_vector_complex_scalar(fr, ch, @@ -259,8 +260,8 @@ int nr_prs_channel_estimation(uint8_t gNB_id, //Start pilot ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); -#ifdef DEBUG_PRS_CHEST - printf("pilot 0 : rxF - > (%d,%d) addr %p ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); +#ifdef DEBUG_PRS_PRINTS + printf("[Rx %d] pilot %3d : rxF - > (%+3d, %+3d) addr %p ch -> (%+3d, %+3d), pil -> (%+d, %+d) \n", rxAnt, 0, rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); #endif multadd_real_vector_complex_scalar(fl, ch, @@ -273,8 +274,8 @@ int nr_prs_channel_estimation(uint8_t gNB_id, ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); -#ifdef DEBUG_PRS_CHEST - printf("pilot 1 : rxF - > (%d,%d) addr %p ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); +#ifdef DEBUG_PRS_PRINTS + printf("[Rx %d] pilot %3d : rxF - > (%+3d, %+3d) addr %p ch -> (%+3d, %+3d), pil -> (%+d, %+d) \n", rxAnt, 1, rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); #endif multadd_real_vector_complex_scalar(fml, ch, @@ -291,8 +292,8 @@ int nr_prs_channel_estimation(uint8_t gNB_id, { ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); -#ifdef DEBUG_PRS_CHEST - printf("pilot %d : rxF - > (%d,%d) addr %p ch -> (%d,%d), pil -> (%d,%d) \n", pIdx, rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); +#ifdef DEBUG_PRS_PRINTS + printf("[Rx %d] pilot %3d : rxF - > (%+3d, %+3d) addr %p ch -> (%+3d, %+3d), pil -> (%+d, %+d) \n", rxAnt, pIdx, rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); #endif multadd_real_vector_complex_scalar(fmm, ch, @@ -307,8 +308,8 @@ int nr_prs_channel_estimation(uint8_t gNB_id, //End pilot ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); -#ifdef DEBUG_PRS_CHEST - printf("pilot %d : rxF - > (%d,%d) addr %p ch -> (%d,%d), pil -> (%d,%d) \n", prs_cfg->NumRB*(12/prs_cfg->CombSize)-2, rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); +#ifdef DEBUG_PRS_PRINTS + printf("[Rx %d] pilot %3d : rxF - > (%+3d, %+3d) addr %p ch -> (%+3d, %+3d), pil -> (%+d, %+d) \n", rxAnt, prs_cfg->NumRB*(12/prs_cfg->CombSize)-2, rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); #endif multadd_real_vector_complex_scalar(fmr, ch, @@ -320,8 +321,8 @@ int nr_prs_channel_estimation(uint8_t gNB_id, ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); -#ifdef DEBUG_PRS_CHEST - printf("pilot %d : rxF - > (%d,%d) addr %p ch -> (%d,%d), pil -> (%d,%d) \n", prs_cfg->NumRB*(12/prs_cfg->CombSize)-1, rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); +#ifdef DEBUG_PRS_PRINTS + printf("[Rx %d] pilot %3d : rxF - > (%+3d, %+3d) addr %p ch -> (%+3d, %+3d), pil -> (%+d, +%d) \n", rxAnt, prs_cfg->NumRB*(12/prs_cfg->CombSize)-1, rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); #endif multadd_real_vector_complex_scalar(fr, ch, @@ -336,10 +337,16 @@ int nr_prs_channel_estimation(uint8_t gNB_id, //reset channel pointer ch_freq = ch_init; -#ifdef DEBUG_PRS_CHEST - for (int re = 0; re < prs_cfg->NumRB*12; re++) +#ifdef DEBUG_PRS_PRINTS + for (int rb = 0; rb < prs_cfg->NumRB; rb++) { - printf("prs_ch[%d] %d %d\n", re, ch_freq[re<<1], ch_freq[(re<<1)+1]); + printf("================================================================\n"); + printf("\t\t Resource Block %d\n", rb); + printf("================================================================\n"); + idx = (12*rb)<<1; + printf("%4d %4d %4d %4d %4d %4d %4d %4d %4d %4d %4d %4d\n", ch_freq[idx], ch_freq[idx+1], ch_freq[idx+2], ch_freq[idx+3], ch_freq[idx+4], ch_freq[idx+5], ch_freq[idx+6], ch_freq[idx+7], ch_freq[idx+8], ch_freq[idx+9], ch_freq[idx+10], ch_freq[idx+11]); + printf("%4d %4d %4d %4d %4d %4d %4d %4d %4d %4d %4d %4d\n", ch_freq[idx+12], ch_freq[idx+13], ch_freq[idx+14], ch_freq[idx+15], ch_freq[idx+16], ch_freq[idx+17], ch_freq[idx+18], ch_freq[idx+19], ch_freq[idx+20], ch_freq[idx+21], ch_freq[idx+22], ch_freq[idx+23]); + printf("\n"); } #endif // Place PRS channel estimates in rxdataF shifted format From 2f46d68a641f43d0c05cbfbe65d0d49ecf0b3c93 Mon Sep 17 00:00:00 2001 From: Sagar Parsawar Date: Fri, 11 Mar 2022 11:22:24 +0100 Subject: [PATCH 056/135] OAI UE: fixes for multiple rx antenna processing and T tracer dumps in PRS channel estimation --- openair1/PHY/INIT/nr_init_ue.c | 4 +- .../nr_dl_channel_estimation.c | 61 +++++++++++-------- 2 files changed, 39 insertions(+), 26 deletions(-) diff --git a/openair1/PHY/INIT/nr_init_ue.c b/openair1/PHY/INIT/nr_init_ue.c index 76f872c9f4..f55d18661f 100644 --- a/openair1/PHY/INIT/nr_init_ue.c +++ b/openair1/PHY/INIT/nr_init_ue.c @@ -335,8 +335,8 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, AssertFatal(((prs_vars[idx]->prs_ch_estimates!=NULL) || (prs_vars[idx]->prs_ch_estimates_time!=NULL)), "NR UE init: PRS channel estimates malloc failed\n"); for (i=0; inb_antennas_rx; i++) { - prs_vars[idx]->prs_ch_estimates[i] = (int32_t *)malloc16_clear(2*fp->ofdm_symbol_size*NR_MAX_NUM_PRS_SYMB); - prs_vars[idx]->prs_ch_estimates_time[i] = (int32_t *)malloc16_clear(2*fp->ofdm_symbol_size*NR_MAX_NUM_PRS_SYMB); + prs_vars[idx]->prs_ch_estimates[i] = (int32_t *)malloc16_clear(fp->ofdm_symbol_size*NR_MAX_NUM_PRS_SYMB*sizeof(int32_t)); + prs_vars[idx]->prs_ch_estimates_time[i] = (int32_t *)malloc16_clear(fp->ofdm_symbol_size*NR_MAX_NUM_PRS_SYMB*sizeof(int32_t)); AssertFatal(((prs_vars[idx]->prs_ch_estimates[i]!=NULL) || (prs_vars[idx]->prs_ch_estimates_time[i]!=NULL)), "NR UE init: PRS channel estimates malloc failed %d\n", i); } } 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 85f29bd904..508a7f22de 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -36,7 +36,7 @@ //#define DEBUG_PDCCH //#define DEBUG_CH //#define DEBUG_PRS_CHEST -//#define DEBUG_PRS_PRINTS +#define DEBUG_PRS_PRINTS extern short nr_qpsk_mod_table[8]; int nr_prs_channel_estimation(uint8_t gNB_id, @@ -60,13 +60,16 @@ int nr_prs_channel_estimation(uint8_t gNB_id, uint8_t rxAnt = 0, idx = prs_cfg->NPRSID; int16_t ch[2] = {0}, *rxF, *pil, *fl,*fm, *fmm, *fml, *fmr, *fr, mod_prs[NR_MAX_PRS_LENGTH<<1]; int16_t k_prime = 0, k = 0, re_offset = 0, second_half = 0; - int16_t *ch_freq = (int16_t *)malloc16(frame_params->ofdm_symbol_size*sizeof(int32_t)); - int32_t *ch_time = (int32_t *)malloc16(frame_params->ofdm_symbol_size*sizeof(int32_t)); + int16_t *ch_freq = (int16_t *)malloc16_clear(frame_params->ofdm_symbol_size*sizeof(int32_t)); + int32_t *ch_time = (int32_t *)malloc16_clear(frame_params->ofdm_symbol_size*sizeof(int32_t)); AssertFatal(((ch_freq != NULL) || (ch_time != NULL)), "nr_prs_channel_estimation: channel estimate buffer initialization failed!!"); int16_t *ch_init = ch_freq; int32_t tdoa[NR_MAX_NUM_PRS_SYMB] = {0}; int32_t ch_pwr[NR_MAX_NUM_PRS_SYMB] = {0}; +#ifdef DEBUG_PRS_CHEST + char filename[128] = {0}, varname[128] = {0}; +#endif for(int l = prs_cfg->SymbolStart; l < prs_cfg->SymbolStart+prs_cfg->NumPRSSymbols; l++) { @@ -84,11 +87,8 @@ int nr_prs_channel_estimation(uint8_t gNB_id, k_prime = k_prime_table[3][symInd]; } - //re_offset - k = re_offset = (prs_cfg->REOffset+k_prime) % prs_cfg->CombSize + prs_cfg->RBOffset*12 + frame_params->first_carrier_offset; - #ifdef DEBUG_PRS_PRINTS - printf("[gNB %d] PRS config l %d k_prime %d, k %d :\nprs_cfg->SymbolStart %d\nprs_cfg->NumPRSSymbols %d\nprs_cfg->NumRB %d\nprs_cfg->CombSize %d\n", gNB_id, l, k_prime, k, prs_cfg->SymbolStart, prs_cfg->NumPRSSymbols, prs_cfg->NumRB, prs_cfg->CombSize); + printf("[gNB %d] PRS config l %d k_prime %d:\nprs_cfg->SymbolStart %d\nprs_cfg->NumPRSSymbols %d\nprs_cfg->NumRB %d\nprs_cfg->CombSize %d\n", gNB_id, l, k_prime, prs_cfg->SymbolStart, prs_cfg->NumPRSSymbols, prs_cfg->NumRB, prs_cfg->CombSize); #endif // Pilots generation and modulation for (int m = 0; m < (12/prs_cfg->CombSize)*prs_cfg->NumRB; m++) @@ -100,6 +100,9 @@ int nr_prs_channel_estimation(uint8_t gNB_id, for (rxAnt=0; rxAnt < frame_params->nb_antennas_rx; rxAnt++) { + // calculate RE offset + k = re_offset = (prs_cfg->REOffset+k_prime) % prs_cfg->CombSize + prs_cfg->RBOffset*12 + frame_params->first_carrier_offset; + // Channel estimation and interpolation pil = (int16_t *)&mod_prs[0]; rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k]; @@ -128,7 +131,7 @@ int nr_prs_channel_estimation(uint8_t gNB_id, break; default: - LOG_I(PHY, "nr=prs channel_estimation: k_prime=%d -> ERROR\n",k_prime); + LOG_I(PHY, "%s: ERROR!! Invalid k_prime=%d for PRS comb_size %d, symbol %d\n",__FUNCTION__, k_prime, prs_cfg->CombSize, l); return(-1); break; } @@ -252,7 +255,7 @@ int nr_prs_channel_estimation(uint8_t gNB_id, break; default: - LOG_I(PHY, "nr=prs channel_estimation: k_prime=%d -> ERROR\n",k_prime); + LOG_I(PHY, "%s: ERROR!! Invalid k_prime=%d for PRS comb_size %d, symbol %d\n",__FUNCTION__, k_prime, prs_cfg->CombSize, l); return(-1); break; } @@ -331,8 +334,7 @@ int nr_prs_channel_estimation(uint8_t gNB_id, } else { - LOG_I(PHY, "NR_PRS UE Channel EStimation: CombSize other than 2 and 4 are NOT supported currently! Returning"); - return(0); + AssertFatal((prs_cfg->CombSize == 2)||(prs_cfg->CombSize == 4), "[NR_PRS Channel EStimation] CombSize other than 2 and 4 are NOT supported currently. Exiting!!!"); } //reset channel pointer @@ -341,7 +343,7 @@ int nr_prs_channel_estimation(uint8_t gNB_id, for (int rb = 0; rb < prs_cfg->NumRB; rb++) { printf("================================================================\n"); - printf("\t\t Resource Block %d\n", rb); + printf("\t\t[gNB %d][Rx %d][PRS symb %d, RB %d]\n", gNB_id, rxAnt, l, rb); printf("================================================================\n"); idx = (12*rb)<<1; printf("%4d %4d %4d %4d %4d %4d %4d %4d %4d %4d %4d %4d\n", ch_freq[idx], ch_freq[idx+1], ch_freq[idx+2], ch_freq[idx+3], ch_freq[idx+4], ch_freq[idx+5], ch_freq[idx+6], ch_freq[idx+7], ch_freq[idx+8], ch_freq[idx+9], ch_freq[idx+10], ch_freq[idx+11]); @@ -396,7 +398,7 @@ int nr_prs_channel_estimation(uint8_t gNB_id, break; default: - LOG_I(PHY, "unsupported ofdm symbol size \n"); + LOG_I(PHY, "%s: unsupported ofdm symbol size \n", __FUNCTION__); assert(0); } @@ -417,21 +419,32 @@ int nr_prs_channel_estimation(uint8_t gNB_id, } // for rxAnt } //for l + for (rxAnt=0; rxAnt < frame_params->nb_antennas_rx; rxAnt++) + { #ifdef DEBUG_PRS_CHEST - LOG_M("PRSpilot.m", "prs_loc", &mod_prs[0], prs_cfg->NumRB*(12/prs_cfg->CombSize),1,1); - LOG_M("rxSigF.m","rxF",&rxdataF[rxAnt][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], prs_cfg->NumPRSSymbols*frame_params->ofdm_symbol_size,1,1); - LOG_M("prsEstF.m","prs_chestF",&prs_chestF[rxAnt][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], prs_cfg->NumPRSSymbols*frame_params->ofdm_symbol_size,1,1); - LOG_M("prsEstT.m","prs_chestT",&prs_chestT[rxAnt][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], prs_cfg->NumPRSSymbols*frame_params->ofdm_symbol_size,1,1); + sprintf(filename, "%s%i%s", "PRSpilot_", rxAnt, ".m"); + LOG_M(filename, "prs_loc", &mod_prs[0], prs_cfg->NumRB*(12/prs_cfg->CombSize),1,1); + sprintf(filename, "%s%i%s", "rxSigF_", rxAnt, ".m"); + sprintf(varname, "%s%i", "rxF_", rxAnt); + LOG_M(filename, varname, &rxdataF[rxAnt][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], prs_cfg->NumPRSSymbols*frame_params->ofdm_symbol_size,1,1); + sprintf(filename, "%s%i%s", "prsChestF_", rxAnt, ".m"); + sprintf(varname, "%s%i", "prsChF_", rxAnt); + LOG_M(filename, varname, &prs_chestF[rxAnt][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], prs_cfg->NumPRSSymbols*frame_params->ofdm_symbol_size,1,1); + sprintf(filename, "%s%i%s", "prsChestT_", rxAnt, ".m"); + sprintf(varname, "%s%i", "prsChT_", rxAnt); + LOG_M(filename, varname, &prs_chestT[rxAnt][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], prs_cfg->NumPRSSymbols*frame_params->ofdm_symbol_size,1,1); #endif - // T tracer dump - T(T_UE_PHY_DL_CHANNEL_ESTIMATE_FREQ, T_INT(0), - T_INT(proc->frame_rx), T_INT(proc->nr_slot_rx), - T_INT(0), T_BUFFER(&prs_chestF[0][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], prs_cfg->NumPRSSymbols*frame_params->ofdm_symbol_size*sizeof(int32_t))); + // T tracer dump + T(T_UE_PHY_DL_CHANNEL_ESTIMATE_FREQ, T_INT(0), + T_INT(proc->frame_rx), T_INT(proc->nr_slot_rx), + T_INT(rxAnt), T_BUFFER(&prs_chestF[rxAnt][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], prs_cfg->NumPRSSymbols*frame_params->ofdm_symbol_size*sizeof(int32_t))); - T(T_UE_PHY_DL_CHANNEL_ESTIMATE, T_INT(0), - T_INT(proc->frame_rx), T_INT(proc->nr_slot_rx), - T_INT(0), T_BUFFER(&prs_chestT[0][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], prs_cfg->NumPRSSymbols*frame_params->ofdm_symbol_size*sizeof(int32_t))); + T(T_UE_PHY_DL_CHANNEL_ESTIMATE, T_INT(0), + T_INT(proc->frame_rx), T_INT(proc->nr_slot_rx), + T_INT(rxAnt), T_BUFFER(&prs_chestT[rxAnt][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], prs_cfg->NumPRSSymbols*frame_params->ofdm_symbol_size*sizeof(int32_t))); + + } free(ch_freq); free(ch_time); From 27c16382bf99c8ae56c5fc3d4e5a58d30496ba39 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Mon, 14 Mar 2022 18:06:14 +0100 Subject: [PATCH 057/135] changes to support 768-point DFT/IDFT, renaming of 768-point DFT for DFT-precoding (4 DFTs per call) --- openair1/PHY/TOOLS/Makefile | 2 +- openair1/PHY/TOOLS/oai_dfts.c | 240 +++++++++++++++++--------------- openair1/PHY/TOOLS/tools_defs.h | 5 +- 3 files changed, 131 insertions(+), 116 deletions(-) diff --git a/openair1/PHY/TOOLS/Makefile b/openair1/PHY/TOOLS/Makefile index a59700bb7c..9f8b9934cf 100644 --- a/openair1/PHY/TOOLS/Makefile +++ b/openair1/PHY/TOOLS/Makefile @@ -1,5 +1,5 @@ oai_dfts_sse4: oai_dfts.c - gcc-7 -O3 -std=gnu99 -msse4.1 -o oai_dfts_sse4 oai_dfts.c time_meas.c ../../SIMULATION/TOOLS/taus.c -I$$OPENAIR_HOME -I$$OPENAIR1_DIR -I$$OPENAIR_TARGETS -I$$OPENAIR_TARGETS/COMMON -I$$OPENAIR_TARGETS/ARCH/COMMON -I$$OPENAIR2_DIR -I$$OPENAIR2_DIR/COMMON -I$$OPENAIR_HOME/common/utils -I$$OPENAIR_HOME/common/utils/T -I$$OPENAIR_HOME/common/utils/msc -I$$OPENAIR_HOME/nfapi/open-nFAPI/nfapi/public_inc -DMR_MAIN -DNB_ANTENNAS_RX=1 -lm -lpthread # -DD256STATS #-DD64STATS + gcc -O3 -std=gnu99 -msse4.1 -o oai_dfts_sse4 oai_dfts.c time_meas.c ../../SIMULATION/TOOLS/taus.c -I$$OPENAIR_HOME -I$$OPENAIR1_DIR -I$$OPENAIR_TARGETS -I$$OPENAIR_TARGETS/COMMON -I$$OPENAIR_TARGETS/ARCH/COMMON -I$$OPENAIR2_DIR -I$$OPENAIR2_DIR/COMMON -I$$OPENAIR_HOME/common/utils -I$$OPENAIR_HOME/common/utils/T -I$$OPENAIR_HOME/common/utils/msc -I$$OPENAIR_HOME/nfapi/open-nFAPI/nfapi/public_inc -DMR_MAIN -DNB_ANTENNAS_RX=1 -lm -lpthread # -DD256STATS #-DD64STATS oai_dfts_avx2: oai_dfts.c gcc -O2 -std=gnu99 -mavx2 -g -ggdb -o oai_dfts_avx2 oai_dfts.c time_meas.c ../../SIMULATION/TOOLS/taus.c $$OPENAIR_HOME/common/utils/backtrace.c -I$$OPENAIR_HOME -I$$OPENAIR1_DIR -I$$OPENAIR_TARGETS -I$$OPENAIR_TARGETS/COMMON -I$$OPENAIR_TARGETS/ARCH/COMMON -I$$OPENAIR2_DIR -I$$OPENAIR2_DIR/COMMON -I$$OPENAIR_HOME/common/utils -I$$OPENAIR_HOME/common/utils/T -I$$OPENAIR_HOME/common/utils/msc -I$$OPENAIR_HOME/nfapi/open-nFAPI/nfapi/public_inc -DMR_MAIN -DNB_ANTENNAS_RX=1 -lm -lpthread # -DD256STATS #-DD64STATS diff --git a/openair1/PHY/TOOLS/oai_dfts.c b/openair1/PHY/TOOLS/oai_dfts.c index 51f747be92..40a6ce9ac3 100644 --- a/openair1/PHY/TOOLS/oai_dfts.c +++ b/openair1/PHY/TOOLS/oai_dfts.c @@ -5962,6 +5962,124 @@ void idft32768(int16_t *x,int16_t *y,unsigned char scale) #endif +int16_t twa768[512],twb768[512]; + +// 256 x 3 +void idft768(int16_t *input, int16_t *output, unsigned char scale) +{ + int i,i2,j; + uint32_t tmp[3][256]__attribute__((aligned(32))); + uint32_t tmpo[3][256] __attribute__((aligned(32))); + simd_q15_t *y128p=(simd_q15_t*)output; + simd_q15_t ONE_OVER_SQRT3_Q15_128 = set1_int16(ONE_OVER_SQRT3_Q15); + + for (i=0,j=0; i<256; i++) { + tmp[0][i] = ((uint32_t *)input)[j++]; + tmp[1][i] = ((uint32_t *)input)[j++]; + tmp[2][i] = ((uint32_t *)input)[j++]; + } + + idft256((int16_t*)(tmp[0]),(int16_t*)(tmpo[0]),1); + idft256((int16_t*)(tmp[1]),(int16_t*)(tmpo[1]),1); + idft256((int16_t*)(tmp[2]),(int16_t*)(tmpo[2]),1); + + for (i=0,i2=0; i<512; i+=8,i2+=4) { + ibfly3((simd_q15_t*)(&tmpo[0][i2]),(simd_q15_t*)(&tmpo[1][i2]),((simd_q15_t*)&tmpo[2][i2]), + (simd_q15_t*)(output+i),(simd_q15_t*)(output+512+i),(simd_q15_t*)(output+1024+i), + (simd_q15_t*)(twa768+i),(simd_q15_t*)(twb768+i)); + } + + + if (scale==1) { + for (i=0; i<12; i++) { + y128p[0] = mulhi_int16(y128p[0],ONE_OVER_SQRT3_Q15_128); + y128p[1] = mulhi_int16(y128p[1],ONE_OVER_SQRT3_Q15_128); + y128p[2] = mulhi_int16(y128p[2],ONE_OVER_SQRT3_Q15_128); + y128p[3] = mulhi_int16(y128p[3],ONE_OVER_SQRT3_Q15_128); + y128p[4] = mulhi_int16(y128p[4],ONE_OVER_SQRT3_Q15_128); + y128p[5] = mulhi_int16(y128p[5],ONE_OVER_SQRT3_Q15_128); + y128p[6] = mulhi_int16(y128p[6],ONE_OVER_SQRT3_Q15_128); + y128p[7] = mulhi_int16(y128p[7],ONE_OVER_SQRT3_Q15_128); + y128p[8] = mulhi_int16(y128p[8],ONE_OVER_SQRT3_Q15_128); + y128p[9] = mulhi_int16(y128p[9],ONE_OVER_SQRT3_Q15_128); + y128p[10] = mulhi_int16(y128p[10],ONE_OVER_SQRT3_Q15_128); + y128p[11] = mulhi_int16(y128p[11],ONE_OVER_SQRT3_Q15_128); + y128p[12] = mulhi_int16(y128p[12],ONE_OVER_SQRT3_Q15_128); + y128p[13] = mulhi_int16(y128p[13],ONE_OVER_SQRT3_Q15_128); + y128p[14] = mulhi_int16(y128p[14],ONE_OVER_SQRT3_Q15_128); + y128p[15] = mulhi_int16(y128p[15],ONE_OVER_SQRT3_Q15_128); + y128p+=16; + } + } + + _mm_empty(); + _m_empty(); + +} + +void dft768(int16_t *input, int16_t *output, unsigned char scale) +{ + int i,i2,j; + uint32_t tmp[3][256] __attribute__((aligned(32))); + uint32_t tmpo[3][256] __attribute__((aligned(32))); + simd_q15_t *y128p=(simd_q15_t*)output; + simd_q15_t ONE_OVER_SQRT3_Q15_128 = set1_int16(ONE_OVER_SQRT3_Q15); + + for (i=0,j=0; i<256; i++) { + tmp[0][i] = ((uint32_t *)input)[j++]; + tmp[1][i] = ((uint32_t *)input)[j++]; + tmp[2][i] = ((uint32_t *)input)[j++]; + } + + dft256((int16_t*)(tmp[0]),(int16_t*)(tmpo[0]),1); + dft256((int16_t*)(tmp[1]),(int16_t*)(tmpo[1]),1); + dft256((int16_t*)(tmp[2]),(int16_t*)(tmpo[2]),1); + + /* + for (i=1; i<512; i++) { + tmpo[0][i] = tmpo[0][i<<1]; + tmpo[1][i] = tmpo[1][i<<1]; + tmpo[2][i] = tmpo[2][i<<1]; + }*/ +#ifndef MR_MAIN + if (LOG_DUMPFLAG(DEBUG_DFT)) { + LOG_M("dft768out0.m","o0",tmpo[0],1024,1,1); + LOG_M("dft768out1.m","o1",tmpo[1],1024,1,1); + LOG_M("dft768out2.m","o2",tmpo[2],1024,1,1); + } +#endif + for (i=0,i2=0; i<512; i+=8,i2+=4) { + bfly3((simd_q15_t*)(&tmpo[0][i2]),(simd_q15_t*)(&tmpo[1][i2]),(simd_q15_t*)(&tmpo[2][i2]), + (simd_q15_t*)(output+i),(simd_q15_t*)(output+512+i),(simd_q15_t*)(output+1024+i), + (simd_q15_t*)(twa768+i),(simd_q15_t*)(twb768+i)); + } + + if (scale==1) { + for (i=0; i<12; i++) { + y128p[0] = mulhi_int16(y128p[0],ONE_OVER_SQRT3_Q15_128); + y128p[1] = mulhi_int16(y128p[1],ONE_OVER_SQRT3_Q15_128); + y128p[2] = mulhi_int16(y128p[2],ONE_OVER_SQRT3_Q15_128); + y128p[3] = mulhi_int16(y128p[3],ONE_OVER_SQRT3_Q15_128); + y128p[4] = mulhi_int16(y128p[4],ONE_OVER_SQRT3_Q15_128); + y128p[5] = mulhi_int16(y128p[5],ONE_OVER_SQRT3_Q15_128); + y128p[6] = mulhi_int16(y128p[6],ONE_OVER_SQRT3_Q15_128); + y128p[7] = mulhi_int16(y128p[7],ONE_OVER_SQRT3_Q15_128); + y128p[8] = mulhi_int16(y128p[8],ONE_OVER_SQRT3_Q15_128); + y128p[9] = mulhi_int16(y128p[9],ONE_OVER_SQRT3_Q15_128); + y128p[10] = mulhi_int16(y128p[10],ONE_OVER_SQRT3_Q15_128); + y128p[11] = mulhi_int16(y128p[11],ONE_OVER_SQRT3_Q15_128); + y128p[12] = mulhi_int16(y128p[12],ONE_OVER_SQRT3_Q15_128); + y128p[13] = mulhi_int16(y128p[13],ONE_OVER_SQRT3_Q15_128); + y128p[14] = mulhi_int16(y128p[14],ONE_OVER_SQRT3_Q15_128); + y128p[15] = mulhi_int16(y128p[15],ONE_OVER_SQRT3_Q15_128); + y128p+=16; + } + } + + _mm_empty(); + _m_empty(); + +} int16_t twa1536[1024],twb1536[1024]; // 512 x 3 @@ -9054,19 +9172,18 @@ void dft720(int16_t *x,int16_t *y,unsigned char scale_flag) // 180 x 4 }; -static int16_t twa768[191*2*4]; -static int16_t twb768[191*2*4]; -static int16_t twc768[191*2*4]; +static int16_t twa768p[191*2*4]; +static int16_t twb768p[191*2*4]; +static int16_t twc768p[191*2*4]; -void dft768(int16_t *x,int16_t *y,unsigned char scale_flag) { // 192x 4; +void dft768p(int16_t *x,int16_t *y,unsigned char scale_flag) { // 192x 4; -#if 0 int i,j; simd_q15_t *x128=(simd_q15_t *)x; simd_q15_t *y128=(simd_q15_t *)y; - simd_q15_t *twa128=(simd_q15_t *)&twa768[0]; - simd_q15_t *twb128=(simd_q15_t *)&twb768[0]; - simd_q15_t *twc128=(simd_q15_t *)&twc768[0]; + simd_q15_t *twa128=(simd_q15_t *)&twa768p[0]; + simd_q15_t *twb128=(simd_q15_t *)&twb768p[0]; + simd_q15_t *twc128=(simd_q15_t *)&twc768p[0]; simd_q15_t x2128[768];// = (simd_q15_t *)&x2128array[0]; simd_q15_t ytmp128[768];//=&ytmp128array2[0]; @@ -9110,56 +9227,6 @@ void dft768(int16_t *x,int16_t *y,unsigned char scale_flag) { // 192x 4; _mm_empty(); _m_empty(); -#else - - int i,i2,j; - uint32_t tmp[3][256]__attribute__((aligned(32))); - uint32_t tmpo[3][256] __attribute__((aligned(32))); - simd_q15_t *y128p=(simd_q15_t*)y; - simd_q15_t ONE_OVER_SQRT3_Q15_128 = set1_int16(ONE_OVER_SQRT3_Q15); - - for (i=0,j=0; i<256; i++) { - tmp[0][i] = ((uint32_t *)x)[j++]; - tmp[1][i] = ((uint32_t *)x)[j++]; - tmp[2][i] = ((uint32_t *)x)[j++]; - } - - dft256((int16_t*)(tmp[0]),(int16_t*)(tmpo[0]),1); - dft256((int16_t*)(tmp[1]),(int16_t*)(tmpo[1]),1); - dft256((int16_t*)(tmp[2]),(int16_t*)(tmpo[2]),1); - - for (i=0,i2=0; i<512; i+=8,i2+=4) { - bfly3((simd_q15_t*)(&tmpo[0][i2]),(simd_q15_t*)(&tmpo[1][i2]),(simd_q15_t*)(&tmpo[2][i2]), - (simd_q15_t*)(y+i),(simd_q15_t*)(y+512+i),(simd_q15_t*)(y+1024+i), - (simd_q15_t*)(twa768+i),(simd_q15_t*)(twb768+i)); - } - - - if (scale_flag==1) { - for (i=0; i<12; i++) { - y128p[0] = mulhi_int16(y128p[0],ONE_OVER_SQRT3_Q15_128); - y128p[1] = mulhi_int16(y128p[1],ONE_OVER_SQRT3_Q15_128); - y128p[2] = mulhi_int16(y128p[2],ONE_OVER_SQRT3_Q15_128); - y128p[3] = mulhi_int16(y128p[3],ONE_OVER_SQRT3_Q15_128); - y128p[4] = mulhi_int16(y128p[4],ONE_OVER_SQRT3_Q15_128); - y128p[5] = mulhi_int16(y128p[5],ONE_OVER_SQRT3_Q15_128); - y128p[6] = mulhi_int16(y128p[6],ONE_OVER_SQRT3_Q15_128); - y128p[7] = mulhi_int16(y128p[7],ONE_OVER_SQRT3_Q15_128); - y128p[8] = mulhi_int16(y128p[8],ONE_OVER_SQRT3_Q15_128); - y128p[9] = mulhi_int16(y128p[9],ONE_OVER_SQRT3_Q15_128); - y128p[10] = mulhi_int16(y128p[10],ONE_OVER_SQRT3_Q15_128); - y128p[11] = mulhi_int16(y128p[11],ONE_OVER_SQRT3_Q15_128); - y128p[12] = mulhi_int16(y128p[12],ONE_OVER_SQRT3_Q15_128); - y128p[13] = mulhi_int16(y128p[13],ONE_OVER_SQRT3_Q15_128); - y128p[14] = mulhi_int16(y128p[14],ONE_OVER_SQRT3_Q15_128); - y128p[15] = mulhi_int16(y128p[15],ONE_OVER_SQRT3_Q15_128); - y128p+=16; - } - } - - _mm_empty(); - _m_empty(); -#endif } @@ -9220,59 +9287,6 @@ void idft384(int16_t *input, int16_t *output, unsigned char scale) -// 256 x 3 -void idft768(int16_t *input, int16_t *output, unsigned char scale) -{ - int i,i2,j; - uint32_t tmp[3][256]__attribute__((aligned(32))); - uint32_t tmpo[3][256] __attribute__((aligned(32))); - simd_q15_t *y128p=(simd_q15_t*)output; - simd_q15_t ONE_OVER_SQRT3_Q15_128 = set1_int16(ONE_OVER_SQRT3_Q15); - - for (i=0,j=0; i<256; i++) { - tmp[0][i] = ((uint32_t *)input)[j++]; - tmp[1][i] = ((uint32_t *)input)[j++]; - tmp[2][i] = ((uint32_t *)input)[j++]; - } - - idft256((int16_t*)(tmp[0]),(int16_t*)(tmpo[0]),1); - idft256((int16_t*)(tmp[1]),(int16_t*)(tmpo[1]),1); - idft256((int16_t*)(tmp[2]),(int16_t*)(tmpo[2]),1); - - for (i=0,i2=0; i<512; i+=8,i2+=4) { - ibfly3((simd_q15_t*)(&tmpo[0][i2]),(simd_q15_t*)(&tmpo[1][i2]),(simd_q15_t*)(&tmpo[2][i2]), - (simd_q15_t*)(output+i),(simd_q15_t*)(output+512+i),(simd_q15_t*)(output+1024+i), - (simd_q15_t*)(twa768+i),(simd_q15_t*)(twb768+i)); - } - - - if (scale==1) { - for (i=0; i<12; i++) { - y128p[0] = mulhi_int16(y128p[0],ONE_OVER_SQRT3_Q15_128); - y128p[1] = mulhi_int16(y128p[1],ONE_OVER_SQRT3_Q15_128); - y128p[2] = mulhi_int16(y128p[2],ONE_OVER_SQRT3_Q15_128); - y128p[3] = mulhi_int16(y128p[3],ONE_OVER_SQRT3_Q15_128); - y128p[4] = mulhi_int16(y128p[4],ONE_OVER_SQRT3_Q15_128); - y128p[5] = mulhi_int16(y128p[5],ONE_OVER_SQRT3_Q15_128); - y128p[6] = mulhi_int16(y128p[6],ONE_OVER_SQRT3_Q15_128); - y128p[7] = mulhi_int16(y128p[7],ONE_OVER_SQRT3_Q15_128); - y128p[8] = mulhi_int16(y128p[8],ONE_OVER_SQRT3_Q15_128); - y128p[9] = mulhi_int16(y128p[9],ONE_OVER_SQRT3_Q15_128); - y128p[10] = mulhi_int16(y128p[10],ONE_OVER_SQRT3_Q15_128); - y128p[11] = mulhi_int16(y128p[11],ONE_OVER_SQRT3_Q15_128); - y128p[12] = mulhi_int16(y128p[12],ONE_OVER_SQRT3_Q15_128); - y128p[13] = mulhi_int16(y128p[13],ONE_OVER_SQRT3_Q15_128); - y128p[14] = mulhi_int16(y128p[14],ONE_OVER_SQRT3_Q15_128); - y128p[15] = mulhi_int16(y128p[15],ONE_OVER_SQRT3_Q15_128); - y128p+=16; - } - } - - _mm_empty(); - _m_empty(); - -} - static int16_t twa864[287*2*4]; static int16_t twb864[287*2*4]; @@ -10698,6 +10712,7 @@ int dfts_autoinit(void) init_rad4(16384,tw16384); init_rad2(32768,tw32768); + init_rad3(768,twa768,twb768); init_rad3(1536,twa1536,twb1536); init_rad3(3072,twa3072,twb3072); init_rad3(6144,twa6144,twb6144); @@ -10735,8 +10750,7 @@ int dfts_autoinit(void) init_rad2_rep(600,twa600); init_rad3_rep(648,twa648,twb648); init_rad4_rep(720,twa720,twb720,twc720); - //init_rad4_rep(768,twa768,twb768,twc768); - init_rad3_rep(768,twa768,twb768); + init_rad4_rep(768,twa768p,twb768p,twc768p); init_rad3_rep(864,twa864,twb864); init_rad3_rep(900,twa900,twb900); init_rad4_rep(960,twa960,twb960,twc960); diff --git a/openair1/PHY/TOOLS/tools_defs.h b/openair1/PHY/TOOLS/tools_defs.h index 7cf51bc60b..cde0fa9ad6 100644 --- a/openair1/PHY/TOOLS/tools_defs.h +++ b/openair1/PHY/TOOLS/tools_defs.h @@ -218,6 +218,7 @@ void dft600(int16_t *x,int16_t *y,uint8_t scale_flag); void dft648(int16_t *x,int16_t *y,uint8_t scale_flag); void dft720(int16_t *x,int16_t *y,uint8_t scale_flag); void dft768(int16_t *x,int16_t *y,uint8_t scale_flag); +void dft768p(int16_t *x,int16_t *y,uint8_t scale_flag); void dft864(int16_t *x,int16_t *y,uint8_t scale_flag); void dft900(int16_t *x,int16_t *y,uint8_t scale_flag); void dft960(int16_t *x,int16_t *y,uint8_t scale_flag); @@ -301,7 +302,7 @@ typedef enum DFT_size_idx { DFT_12, DFT_24, DFT_36, DFT_48, DFT_60, DFT_72, DFT_96, DFT_108, DFT_120, DFT_128, DFT_144, DFT_180, DFT_192, DFT_216, DFT_240, DFT_256, DFT_288, DFT_300, DFT_324, DFT_360, DFT_384, DFT_432, DFT_480, - DFT_512, DFT_540, DFT_576, DFT_600, DFT_648, DFT_720, DFT_768, DFT_864, + DFT_512, DFT_540, DFT_576, DFT_600, DFT_648, DFT_720, DFT_768, DFT_768P, DFT_864, DFT_900, DFT_960, DFT_972, DFT_1024, DFT_1080, DFT_1152, DFT_1200, DFT_1296, DFT_1440, DFT_1500, DFT_1536, DFT_1620, DFT_1728, DFT_1800, DFT_1920, DFT_1944, DFT_2048, DFT_2160, DFT_2304, DFT_2400, DFT_2592, DFT_2700, DFT_2880, DFT_2916, @@ -315,7 +316,7 @@ adftfunc_t dft_ftab[]={ dft12, dft24, dft36, dft48, dft60, dft72, dft96, dft108, dft120, dft128, dft144, dft180, dft192, dft216, dft240, dft256, dft288, dft300, dft324, dft360, dft384, dft432, dft480, - dft512, dft540, dft576, dft600, dft648, dft720, dft768, dft864, + dft512, dft540, dft576, dft600, dft648, dft720, dft768, dft768p, dft864, dft900, dft960, dft972, dft1024, dft1080, dft1152, dft1200, dft1296, dft1440, dft1500, dft1536, dft1620, dft1728, dft1800, dft1920, dft1944, dft2048, dft2160, dft2304, dft2400, dft2592, dft2700, dft2880, dft2916, From d196529cf815eb1e6b68c99b8c44ec5b3163906a Mon Sep 17 00:00:00 2001 From: Sagar Parsawar Date: Wed, 16 Mar 2022 17:24:14 +0100 Subject: [PATCH 058/135] OAI UE: PRS mutliple gNB fixes --- openair1/PHY/INIT/nr_init_ue.c | 4 +-- .../nr_dl_channel_estimation.c | 6 ++-- openair1/PHY/defs_nr_UE.h | 1 + openair1/PHY/defs_nr_common.h | 32 +++++++++---------- openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c | 2 +- 5 files changed, 23 insertions(+), 22 deletions(-) diff --git a/openair1/PHY/INIT/nr_init_ue.c b/openair1/PHY/INIT/nr_init_ue.c index f55d18661f..6ab53be0c9 100644 --- a/openair1/PHY/INIT/nr_init_ue.c +++ b/openair1/PHY/INIT/nr_init_ue.c @@ -335,8 +335,8 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, AssertFatal(((prs_vars[idx]->prs_ch_estimates!=NULL) || (prs_vars[idx]->prs_ch_estimates_time!=NULL)), "NR UE init: PRS channel estimates malloc failed\n"); for (i=0; inb_antennas_rx; i++) { - prs_vars[idx]->prs_ch_estimates[i] = (int32_t *)malloc16_clear(fp->ofdm_symbol_size*NR_MAX_NUM_PRS_SYMB*sizeof(int32_t)); - prs_vars[idx]->prs_ch_estimates_time[i] = (int32_t *)malloc16_clear(fp->ofdm_symbol_size*NR_MAX_NUM_PRS_SYMB*sizeof(int32_t)); + prs_vars[idx]->prs_ch_estimates[i] = (int32_t *)malloc16_clear(fp->ofdm_symbol_size*NR_SYMBOLS_PER_SLOT*sizeof(int32_t)); + prs_vars[idx]->prs_ch_estimates_time[i] = (int32_t *)malloc16_clear(fp->ofdm_symbol_size*NR_SYMBOLS_PER_SLOT*sizeof(int32_t)); AssertFatal(((prs_vars[idx]->prs_ch_estimates[i]!=NULL) || (prs_vars[idx]->prs_ch_estimates_time[i]!=NULL)), "NR UE init: PRS channel estimates malloc failed %d\n", i); } } 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 508a7f22de..a2d571bf3a 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -36,7 +36,7 @@ //#define DEBUG_PDCCH //#define DEBUG_CH //#define DEBUG_PRS_CHEST -#define DEBUG_PRS_PRINTS +//#define DEBUG_PRS_PRINTS extern short nr_qpsk_mod_table[8]; int nr_prs_channel_estimation(uint8_t gNB_id, @@ -436,11 +436,11 @@ int nr_prs_channel_estimation(uint8_t gNB_id, #endif // T tracer dump - T(T_UE_PHY_DL_CHANNEL_ESTIMATE_FREQ, T_INT(0), + T(T_UE_PHY_DL_CHANNEL_ESTIMATE_FREQ, T_INT(gNB_id), T_INT(proc->frame_rx), T_INT(proc->nr_slot_rx), T_INT(rxAnt), T_BUFFER(&prs_chestF[rxAnt][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], prs_cfg->NumPRSSymbols*frame_params->ofdm_symbol_size*sizeof(int32_t))); - T(T_UE_PHY_DL_CHANNEL_ESTIMATE, T_INT(0), + T(T_UE_PHY_DL_CHANNEL_ESTIMATE, T_INT(gNB_id), T_INT(proc->frame_rx), T_INT(proc->nr_slot_rx), T_INT(rxAnt), T_BUFFER(&prs_chestT[rxAnt][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], prs_cfg->NumPRSSymbols*frame_params->ofdm_symbol_size*sizeof(int32_t))); diff --git a/openair1/PHY/defs_nr_UE.h b/openair1/PHY/defs_nr_UE.h index c3777a4f54..ff64530b52 100644 --- a/openair1/PHY/defs_nr_UE.h +++ b/openair1/PHY/defs_nr_UE.h @@ -387,6 +387,7 @@ typedef struct { prs_data_t prs_cfg; int32_t **prs_ch_estimates; int32_t **prs_ch_estimates_time; + int64_t reserved; } NR_UE_PRS; #define NR_PDCCH_DEFS_NR_UE diff --git a/openair1/PHY/defs_nr_common.h b/openair1/PHY/defs_nr_common.h index cfcd88258e..aba8f93ba1 100644 --- a/openair1/PHY/defs_nr_common.h +++ b/openair1/PHY/defs_nr_common.h @@ -375,22 +375,22 @@ struct NR_DL_FRAME_PARMS { }; // PRS structures prototype -typedef struct prs { - int PRSResourceSetPeriod[2]; //[slot period, slot offset] - int PRSResourceOffset; // array if more than one resource sets.slot offset (0...511) (default 0) - int PRSResourceRepetition;// slot offset (1 (default), 2, 4, 6, 8, 16, 32) - int PRSResourceTimeGap; // slot offset (1 (default), 2, 4, 6, 8, 16, 32) - int NumRB; //number of RBs in freq domain a scalar =< 275 RB - int NumPRSSymbols; //number of PRS symbols in time domain - int SymbolStart; //starting OFDM symbol of PRS resource in time domain - int RBOffset; //Starting PRB index of all PRS resources in a PRS resource set. - int CombSize; //RE density of all PRS resources in a PRS resource set. i∈{2,4,6,12} - int REOffset; //Starting RE offset in the first OFDM symbol of each PRS resource in a PRS resource set. - int MutingPattern1[2]; //Muting bit pattern option-1, specified as [] or a binary-valued vector of length 2, 4, 6, 8, 16, or 32. - int MutingPattern2[2]; - int MutingBitRepetition; - int NPRSID; -} prs_data_t; +typedef struct { + uint16_t PRSResourceSetPeriod[2]; //[slot period, slot offset] + uint8_t PRSResourceOffset; // array if more than one resource sets.slot offset (0...511) (default 0) + uint8_t PRSResourceRepetition;// slot offset (1 (default), 2, 4, 6, 8, 16, 32) + uint8_t PRSResourceTimeGap; // slot offset (1 (default), 2, 4, 6, 8, 16, 32) + uint8_t NumRB; //number of RBs in freq domain a scalar =< 275 RB + uint8_t NumPRSSymbols; //number of PRS symbols in time domain + uint8_t SymbolStart; //starting OFDM symbol of PRS resource in time domain + uint8_t RBOffset; //Starting PRB index of all PRS resources in a PRS resource set. + uint8_t CombSize; //RE density of all PRS resources in a PRS resource set. i∈{2,4,6,12} + uint8_t REOffset; //Starting RE offset in the first OFDM symbol of each PRS resource in a PRS resource set. + uint32_t MutingPattern1[2]; //Muting bit pattern option-1, specified as [] or a binary-valued vector of length 2, 4, 6, 8, 16, or 32. + uint32_t MutingPattern2[2]; + uint8_t MutingBitRepetition; + uint16_t NPRSID; +} prs_data_t; //32bytes #define KHz (1000UL) #define MHz (1000*KHz) diff --git a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c index 2be3a2537e..dea0cdaa10 100644 --- a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c +++ b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c @@ -1313,7 +1313,7 @@ void RCconfig_nrUE_prs(void *cfg) ue->prs_vars[gNB_id]->prs_cfg.NPRSID = *(PRS_ParamList.paramarray[j][PRS_ID].uptr); LOG_I(PHY, "--------------------------\n"); - LOG_I(PHY, "PRS Config for gNB_id %d\n", gNB_id); + LOG_I(PHY, "PRS Config for gNB_id %d @ %p\n", gNB_id, &ue->prs_vars[gNB_id]->prs_cfg); LOG_I(PHY, "--------------------------\n"); LOG_I(PHY, "PRSResourceSetPeriod0 %d\n", ue->prs_vars[gNB_id]->prs_cfg.PRSResourceSetPeriod[0]); LOG_I(PHY, "PRSResourceSetPeriod1 %d\n", ue->prs_vars[gNB_id]->prs_cfg.PRSResourceSetPeriod[1]); From cd3525772a9b670af33bb12b112f1462d89f9033 Mon Sep 17 00:00:00 2001 From: Sagar Parsawar Date: Wed, 16 Mar 2022 17:24:14 +0100 Subject: [PATCH 059/135] OAI UE: PRS mutliple gNB fixes --- openair1/PHY/INIT/nr_init_ue.c | 4 +-- .../nr_dl_channel_estimation.c | 6 ++-- openair1/PHY/defs_nr_UE.h | 4 +++ openair1/PHY/defs_nr_common.h | 32 +++++++++---------- openair1/SCHED_NR_UE/phy_procedures_nr_ue.c | 5 +-- openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c | 22 ++++++++++--- 6 files changed, 45 insertions(+), 28 deletions(-) diff --git a/openair1/PHY/INIT/nr_init_ue.c b/openair1/PHY/INIT/nr_init_ue.c index f55d18661f..6ab53be0c9 100644 --- a/openair1/PHY/INIT/nr_init_ue.c +++ b/openair1/PHY/INIT/nr_init_ue.c @@ -335,8 +335,8 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, AssertFatal(((prs_vars[idx]->prs_ch_estimates!=NULL) || (prs_vars[idx]->prs_ch_estimates_time!=NULL)), "NR UE init: PRS channel estimates malloc failed\n"); for (i=0; inb_antennas_rx; i++) { - prs_vars[idx]->prs_ch_estimates[i] = (int32_t *)malloc16_clear(fp->ofdm_symbol_size*NR_MAX_NUM_PRS_SYMB*sizeof(int32_t)); - prs_vars[idx]->prs_ch_estimates_time[i] = (int32_t *)malloc16_clear(fp->ofdm_symbol_size*NR_MAX_NUM_PRS_SYMB*sizeof(int32_t)); + prs_vars[idx]->prs_ch_estimates[i] = (int32_t *)malloc16_clear(fp->ofdm_symbol_size*NR_SYMBOLS_PER_SLOT*sizeof(int32_t)); + prs_vars[idx]->prs_ch_estimates_time[i] = (int32_t *)malloc16_clear(fp->ofdm_symbol_size*NR_SYMBOLS_PER_SLOT*sizeof(int32_t)); AssertFatal(((prs_vars[idx]->prs_ch_estimates[i]!=NULL) || (prs_vars[idx]->prs_ch_estimates_time[i]!=NULL)), "NR UE init: PRS channel estimates malloc failed %d\n", i); } } 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 508a7f22de..a2d571bf3a 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -36,7 +36,7 @@ //#define DEBUG_PDCCH //#define DEBUG_CH //#define DEBUG_PRS_CHEST -#define DEBUG_PRS_PRINTS +//#define DEBUG_PRS_PRINTS extern short nr_qpsk_mod_table[8]; int nr_prs_channel_estimation(uint8_t gNB_id, @@ -436,11 +436,11 @@ int nr_prs_channel_estimation(uint8_t gNB_id, #endif // T tracer dump - T(T_UE_PHY_DL_CHANNEL_ESTIMATE_FREQ, T_INT(0), + T(T_UE_PHY_DL_CHANNEL_ESTIMATE_FREQ, T_INT(gNB_id), T_INT(proc->frame_rx), T_INT(proc->nr_slot_rx), T_INT(rxAnt), T_BUFFER(&prs_chestF[rxAnt][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], prs_cfg->NumPRSSymbols*frame_params->ofdm_symbol_size*sizeof(int32_t))); - T(T_UE_PHY_DL_CHANNEL_ESTIMATE, T_INT(0), + T(T_UE_PHY_DL_CHANNEL_ESTIMATE, T_INT(gNB_id), T_INT(proc->frame_rx), T_INT(proc->nr_slot_rx), T_INT(rxAnt), T_BUFFER(&prs_chestT[rxAnt][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], prs_cfg->NumPRSSymbols*frame_params->ofdm_symbol_size*sizeof(int32_t))); diff --git a/openair1/PHY/defs_nr_UE.h b/openair1/PHY/defs_nr_UE.h index c3777a4f54..3acad7f96f 100644 --- a/openair1/PHY/defs_nr_UE.h +++ b/openair1/PHY/defs_nr_UE.h @@ -387,6 +387,7 @@ typedef struct { prs_data_t prs_cfg; int32_t **prs_ch_estimates; int32_t **prs_ch_estimates_time; + int64_t reserved; } NR_UE_PRS; #define NR_PDCCH_DEFS_NR_UE @@ -830,6 +831,9 @@ typedef struct { NR_UE_DLSCH_t *dlsch_p[NUMBER_OF_CONNECTED_gNB_MAX]; NR_UE_DLSCH_t *dlsch_MCH[NUMBER_OF_CONNECTED_gNB_MAX]; NR_UE_PRS *prs_vars[NR_MAX_PRS_COMB_SIZE]; + uint16_t prs_active_gNBs; + uint8_t prs_start_symb; + uint8_t prs_end_symb; //Paging parameters uint32_t IMSImod1024; diff --git a/openair1/PHY/defs_nr_common.h b/openair1/PHY/defs_nr_common.h index cfcd88258e..aba8f93ba1 100644 --- a/openair1/PHY/defs_nr_common.h +++ b/openair1/PHY/defs_nr_common.h @@ -375,22 +375,22 @@ struct NR_DL_FRAME_PARMS { }; // PRS structures prototype -typedef struct prs { - int PRSResourceSetPeriod[2]; //[slot period, slot offset] - int PRSResourceOffset; // array if more than one resource sets.slot offset (0...511) (default 0) - int PRSResourceRepetition;// slot offset (1 (default), 2, 4, 6, 8, 16, 32) - int PRSResourceTimeGap; // slot offset (1 (default), 2, 4, 6, 8, 16, 32) - int NumRB; //number of RBs in freq domain a scalar =< 275 RB - int NumPRSSymbols; //number of PRS symbols in time domain - int SymbolStart; //starting OFDM symbol of PRS resource in time domain - int RBOffset; //Starting PRB index of all PRS resources in a PRS resource set. - int CombSize; //RE density of all PRS resources in a PRS resource set. i∈{2,4,6,12} - int REOffset; //Starting RE offset in the first OFDM symbol of each PRS resource in a PRS resource set. - int MutingPattern1[2]; //Muting bit pattern option-1, specified as [] or a binary-valued vector of length 2, 4, 6, 8, 16, or 32. - int MutingPattern2[2]; - int MutingBitRepetition; - int NPRSID; -} prs_data_t; +typedef struct { + uint16_t PRSResourceSetPeriod[2]; //[slot period, slot offset] + uint8_t PRSResourceOffset; // array if more than one resource sets.slot offset (0...511) (default 0) + uint8_t PRSResourceRepetition;// slot offset (1 (default), 2, 4, 6, 8, 16, 32) + uint8_t PRSResourceTimeGap; // slot offset (1 (default), 2, 4, 6, 8, 16, 32) + uint8_t NumRB; //number of RBs in freq domain a scalar =< 275 RB + uint8_t NumPRSSymbols; //number of PRS symbols in time domain + uint8_t SymbolStart; //starting OFDM symbol of PRS resource in time domain + uint8_t RBOffset; //Starting PRB index of all PRS resources in a PRS resource set. + uint8_t CombSize; //RE density of all PRS resources in a PRS resource set. i∈{2,4,6,12} + uint8_t REOffset; //Starting RE offset in the first OFDM symbol of each PRS resource in a PRS resource set. + uint32_t MutingPattern1[2]; //Muting bit pattern option-1, specified as [] or a binary-valued vector of length 2, 4, 6, 8, 16, or 32. + uint32_t MutingPattern2[2]; + uint8_t MutingBitRepetition; + uint16_t NPRSID; +} prs_data_t; //32bytes #define KHz (1000UL) #define MHz (1000*KHz) diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c index bfcf1a5954..6114d30652 100644 --- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c +++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c @@ -1674,7 +1674,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue, ue->prs_vars[gNB_id]->prs_cfg.PRSResourceTimeGap=1; ue->prs_vars[gNB_id]->prs_cfg.NPRSID=0; */ - for(int j = ue->prs_vars[gNB_id]->prs_cfg.SymbolStart; j < (ue->prs_vars[gNB_id]->prs_cfg.SymbolStart + ue->prs_vars[gNB_id]->prs_cfg.NumPRSSymbols); j++) + for(int j = ue->prs_start_symb; j < ue->prs_end_symb; j++) { nr_slot_fep(ue, proc, @@ -1683,7 +1683,8 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue, } //PRS channel estimation - nr_prs_channel_estimation(gNB_id,ue,proc,fp); + for(int gIdx = 0; gIdx < ue->prs_active_gNBs; gIdx++) + nr_prs_channel_estimation(gIdx,ue,proc,fp); } if ((frame_rx%64 == 0) && (nr_slot_rx==0)) { diff --git a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c index 2be3a2537e..e7b6d4e514 100644 --- a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c +++ b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c @@ -1278,17 +1278,17 @@ void RCconfig_nr_ue_L1(void) { void RCconfig_nrUE_prs(void *cfg) { - int j = 0, gNB_id = 0; + int j = 0, gNB_id = 0, prs_start = 0, prs_end = 0; char aprefix[MAX_OPTNAME_SIZE*2 + 8]; PHY_VARS_NR_UE *ue = (PHY_VARS_NR_UE *)cfg; paramlist_def_t gParamList = {CONFIG_STRING_PRS_LIST,NULL,0}; paramdef_t gParams[] = PRS_GLOBAL_PARAMS_DESC; config_getlist( &gParamList,gParams,sizeof(gParams)/sizeof(paramdef_t), NULL); - int num_gnbs = *(gParamList.paramarray[j][PRS_ACTIVE_GNBS_IDX].uptr); + ue->prs_active_gNBs = *(gParamList.paramarray[j][PRS_ACTIVE_GNBS_IDX].uptr); paramlist_def_t PRS_ParamList = {{0},NULL,0}; - for(int i = 0; i < num_gnbs; i++) + for(int i = 0; i < ue->prs_active_gNBs; i++) { paramdef_t PRS_Params[] = PRS_PARAMS_DESC; sprintf(PRS_ParamList.listname, "%s%i", CONFIG_STRING_PRS_CONFIG, i); @@ -1311,9 +1311,18 @@ void RCconfig_nrUE_prs(void *cfg) ue->prs_vars[gNB_id]->prs_cfg.PRSResourceRepetition = *(PRS_ParamList.paramarray[j][PRS_RESOURCE_REPETITION].uptr); ue->prs_vars[gNB_id]->prs_cfg.PRSResourceTimeGap = *(PRS_ParamList.paramarray[j][PRS_RESOURCE_TIME_GAP].uptr); ue->prs_vars[gNB_id]->prs_cfg.NPRSID = *(PRS_ParamList.paramarray[j][PRS_ID].uptr); - + if(gNB_id==0) + { + prs_start = ue->prs_vars[gNB_id]->prs_cfg.SymbolStart; + prs_end = ue->prs_vars[gNB_id]->prs_cfg.SymbolStart+ue->prs_vars[gNB_id]->prs_cfg.NumPRSSymbols; + } + else + { + prs_start = MIN((prs_start), (ue->prs_vars[gNB_id]->prs_cfg.SymbolStart)); + prs_end = MAX((prs_end), (ue->prs_vars[gNB_id]->prs_cfg.SymbolStart+ue->prs_vars[gNB_id]->prs_cfg.NumPRSSymbols)); + } LOG_I(PHY, "--------------------------\n"); - LOG_I(PHY, "PRS Config for gNB_id %d\n", gNB_id); + LOG_I(PHY, "PRS Config for gNB_id %d @ %p\n", gNB_id, &ue->prs_vars[gNB_id]->prs_cfg); LOG_I(PHY, "--------------------------\n"); LOG_I(PHY, "PRSResourceSetPeriod0 %d\n", ue->prs_vars[gNB_id]->prs_cfg.PRSResourceSetPeriod[0]); LOG_I(PHY, "PRSResourceSetPeriod1 %d\n", ue->prs_vars[gNB_id]->prs_cfg.PRSResourceSetPeriod[1]); @@ -1335,4 +1344,7 @@ void RCconfig_nrUE_prs(void *cfg) LOG_I(NR_PHY,"No %s configuration found\n", PRS_ParamList.listname); } } + ue->prs_start_symb = prs_start; + ue->prs_end_symb = prs_end; + LOG_I(PHY, "prs_active_gNBs %d, prs_start_symb %d, prs_end_symb %d\n", ue->prs_active_gNBs, ue->prs_start_symb, ue->prs_end_symb); } From 828387c5120094230411b17e3d044e8b9b0eb966 Mon Sep 17 00:00:00 2001 From: Sagar Parsawar Date: Thu, 17 Mar 2022 15:11:47 +0100 Subject: [PATCH 060/135] OAI UE: Added prs measurements in structure --- openair1/PHY/INIT/nr_init_ue.c | 8 +++-- .../nr_dl_channel_estimation.c | 27 +++++++++++---- openair1/PHY/defs_nr_UE.h | 9 ++--- openair1/PHY/defs_nr_common.h | 33 +++++++++++++------ 4 files changed, 54 insertions(+), 23 deletions(-) diff --git a/openair1/PHY/INIT/nr_init_ue.c b/openair1/PHY/INIT/nr_init_ue.c index 6ab53be0c9..2ef13d3c60 100644 --- a/openair1/PHY/INIT/nr_init_ue.c +++ b/openair1/PHY/INIT/nr_init_ue.c @@ -332,12 +332,16 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, // PRS channel estimates prs_vars[idx]->prs_ch_estimates = (int32_t **)malloc16_clear( fp->nb_antennas_rx*sizeof(int32_t *) ); prs_vars[idx]->prs_ch_estimates_time = (int32_t **)malloc16_clear( fp->nb_antennas_rx*sizeof(int32_t *) ); - AssertFatal(((prs_vars[idx]->prs_ch_estimates!=NULL) || (prs_vars[idx]->prs_ch_estimates_time!=NULL)), "NR UE init: PRS channel estimates malloc failed\n"); + AssertFatal(((prs_vars[idx]->prs_ch_estimates!=NULL) || (prs_vars[idx]->prs_ch_estimates_time!=NULL)), "NR UE init: PRS channel estimates malloc failed for gNB_id %d\n", idx); + prs_vars[idx]->prs_meas = (prs_meas_t **)malloc16_clear( fp->nb_antennas_rx*sizeof(prs_meas_t *) ); + AssertFatal((prs_vars[idx]->prs_meas!=NULL), "NR UE init: PRS measurements malloc failed for gNB_id %d\n", idx); for (i=0; inb_antennas_rx; i++) { prs_vars[idx]->prs_ch_estimates[i] = (int32_t *)malloc16_clear(fp->ofdm_symbol_size*NR_SYMBOLS_PER_SLOT*sizeof(int32_t)); prs_vars[idx]->prs_ch_estimates_time[i] = (int32_t *)malloc16_clear(fp->ofdm_symbol_size*NR_SYMBOLS_PER_SLOT*sizeof(int32_t)); - AssertFatal(((prs_vars[idx]->prs_ch_estimates[i]!=NULL) || (prs_vars[idx]->prs_ch_estimates_time[i]!=NULL)), "NR UE init: PRS channel estimates malloc failed %d\n", i); + AssertFatal(((prs_vars[idx]->prs_ch_estimates[i]!=NULL) || (prs_vars[idx]->prs_ch_estimates_time[i]!=NULL)), "NR UE init: PRS channel estimates malloc failed for rx_ant %d\n", i); + prs_vars[idx]->prs_meas[i] = (prs_meas_t *)malloc16_clear(NR_SYMBOLS_PER_SLOT*sizeof(prs_meas_t) ); + AssertFatal((prs_vars[idx]->prs_meas[i]!=NULL), "NR UE init: PRS measurements malloc failed for rx_ant %d\n", i); } } // DLSCH 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 a2d571bf3a..22b3cc043f 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -54,6 +54,7 @@ int nr_prs_channel_estimation(uint8_t gNB_id, int32_t **rxdataF = ue->common_vars.common_vars_rx_data_per_thread[proc->thread_id].rxdataF; uint32_t **nr_gold_prs = ue->nr_gold_prs[proc->nr_slot_rx]; prs_data_t *prs_cfg = &ue->prs_vars[gNB_id]->prs_cfg; + prs_meas_t **prs_meas = ue->prs_vars[gNB_id]->prs_meas; int32_t **prs_chestF = ue->prs_vars[gNB_id]->prs_ch_estimates; int32_t **prs_chestT = ue->prs_vars[gNB_id]->prs_ch_estimates_time; @@ -64,9 +65,7 @@ int nr_prs_channel_estimation(uint8_t gNB_id, int32_t *ch_time = (int32_t *)malloc16_clear(frame_params->ofdm_symbol_size*sizeof(int32_t)); AssertFatal(((ch_freq != NULL) || (ch_time != NULL)), "nr_prs_channel_estimation: channel estimate buffer initialization failed!!"); int16_t *ch_init = ch_freq; - - int32_t tdoa[NR_MAX_NUM_PRS_SYMB] = {0}; - int32_t ch_pwr[NR_MAX_NUM_PRS_SYMB] = {0}; + int32_t ch_pwr= 0; #ifdef DEBUG_PRS_CHEST char filename[128] = {0}, varname[128] = {0}; #endif @@ -409,13 +408,23 @@ int nr_prs_channel_estimation(uint8_t gNB_id, // rearrange impulse response memcpy((int16_t *)&prs_chestT[rxAnt][l*frame_params->ofdm_symbol_size], &ch_time[frame_params->ofdm_symbol_size>>1], (frame_params->ofdm_symbol_size>>1)*sizeof(int32_t)); memcpy((int16_t *)&prs_chestT[rxAnt][l*frame_params->ofdm_symbol_size + (frame_params->ofdm_symbol_size>>1)], &ch_time[0], (frame_params->ofdm_symbol_size>>1)*sizeof(int32_t)); - + // peak estimator peak_estimator(&prs_chestT[rxAnt][l*frame_params->ofdm_symbol_size], frame_params->ofdm_symbol_size, - &tdoa[l], - &ch_pwr[l]); - LOG_I(PHY, "[gNB %d][Rx %d] TDoA for PRS symbol %2d ==> %d / %d samples, peak channel power %.1f dB\n", gNB_id, rxAnt, l, tdoa[l]-(frame_params->ofdm_symbol_size>>1), frame_params->ofdm_symbol_size, 10*log10(ch_pwr[l])); + &prs_meas[rxAnt][l].dl_toa, + &ch_pwr); + LOG_I(PHY, "[gNB %d][Rx %d][sfn %d][slot %d] ToA for PRS symbol %2d ==> %d / %d samples, peak channel power %.1f dB\n", gNB_id, rxAnt, proc->frame_rx, proc->nr_slot_rx, l, prs_meas[rxAnt][l].dl_toa-(frame_params->ofdm_symbol_size>>1), frame_params->ofdm_symbol_size, 10*log10(ch_pwr)); + + //prs measurements + prs_meas[rxAnt][l].gNB_id = 0; + prs_meas[rxAnt][l].timestamp = 0; + prs_meas[rxAnt][l].sfn = proc->frame_rx; + prs_meas[rxAnt][l].slot = proc->nr_slot_rx; + prs_meas[rxAnt][l].symbol = l; + prs_meas[rxAnt][l].rxAnt_idx = rxAnt; + prs_meas[rxAnt][l].snr = 0; + prs_meas[rxAnt][l].dl_aoa = 0; } // for rxAnt } //for l @@ -436,6 +445,10 @@ int nr_prs_channel_estimation(uint8_t gNB_id, #endif // T tracer dump + T(T_UE_PHY_INPUT_SIGNAL, T_INT(gNB_id), + T_INT(proc->frame_rx), T_INT(proc->nr_slot_rx), + T_INT(rxAnt), T_BUFFER(&rxdataF[rxAnt][0], frame_params->samples_per_slot_wCP*sizeof(int32_t))); + T(T_UE_PHY_DL_CHANNEL_ESTIMATE_FREQ, T_INT(gNB_id), T_INT(proc->frame_rx), T_INT(proc->nr_slot_rx), T_INT(rxAnt), T_BUFFER(&prs_chestF[rxAnt][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], prs_cfg->NumPRSSymbols*frame_params->ofdm_symbol_size*sizeof(int32_t))); diff --git a/openair1/PHY/defs_nr_UE.h b/openair1/PHY/defs_nr_UE.h index 3acad7f96f..a8082ee147 100644 --- a/openair1/PHY/defs_nr_UE.h +++ b/openair1/PHY/defs_nr_UE.h @@ -387,7 +387,8 @@ typedef struct { prs_data_t prs_cfg; int32_t **prs_ch_estimates; int32_t **prs_ch_estimates_time; - int64_t reserved; + int32_t reserved; + prs_meas_t **prs_meas; } NR_UE_PRS; #define NR_PDCCH_DEFS_NR_UE @@ -831,9 +832,9 @@ typedef struct { NR_UE_DLSCH_t *dlsch_p[NUMBER_OF_CONNECTED_gNB_MAX]; NR_UE_DLSCH_t *dlsch_MCH[NUMBER_OF_CONNECTED_gNB_MAX]; NR_UE_PRS *prs_vars[NR_MAX_PRS_COMB_SIZE]; - uint16_t prs_active_gNBs; - uint8_t prs_start_symb; - uint8_t prs_end_symb; + uint16_t prs_active_gNBs; + uint8_t prs_start_symb; + uint8_t prs_end_symb; //Paging parameters uint32_t IMSImod1024; diff --git a/openair1/PHY/defs_nr_common.h b/openair1/PHY/defs_nr_common.h index aba8f93ba1..b86811a4c3 100644 --- a/openair1/PHY/defs_nr_common.h +++ b/openair1/PHY/defs_nr_common.h @@ -377,21 +377,34 @@ struct NR_DL_FRAME_PARMS { // PRS structures prototype typedef struct { uint16_t PRSResourceSetPeriod[2]; //[slot period, slot offset] - uint8_t PRSResourceOffset; // array if more than one resource sets.slot offset (0...511) (default 0) - uint8_t PRSResourceRepetition;// slot offset (1 (default), 2, 4, 6, 8, 16, 32) - uint8_t PRSResourceTimeGap; // slot offset (1 (default), 2, 4, 6, 8, 16, 32) - uint8_t NumRB; //number of RBs in freq domain a scalar =< 275 RB - uint8_t NumPRSSymbols; //number of PRS symbols in time domain - uint8_t SymbolStart; //starting OFDM symbol of PRS resource in time domain - uint8_t RBOffset; //Starting PRB index of all PRS resources in a PRS resource set. - uint8_t CombSize; //RE density of all PRS resources in a PRS resource set. i∈{2,4,6,12} - uint8_t REOffset; //Starting RE offset in the first OFDM symbol of each PRS resource in a PRS resource set. + uint8_t PRSResourceOffset; // array if more than one resource sets.slot offset (0...511) (default 0) + uint8_t PRSResourceRepetition;// slot offset (1 (default), 2, 4, 6, 8, 16, 32) + uint8_t PRSResourceTimeGap; // slot offset (1 (default), 2, 4, 6, 8, 16, 32) + uint8_t NumRB; //number of RBs in freq domain a scalar =< 275 RB + uint8_t NumPRSSymbols; //number of PRS symbols in time domain + uint8_t SymbolStart; //starting OFDM symbol of PRS resource in time domain + uint8_t RBOffset; //Starting PRB index of all PRS resources in a PRS resource set. + uint8_t CombSize; //RE density of all PRS resources in a PRS resource set. i∈{2,4,6,12} + uint8_t REOffset; //Starting RE offset in the first OFDM symbol of each PRS resource in a PRS resource set. uint32_t MutingPattern1[2]; //Muting bit pattern option-1, specified as [] or a binary-valued vector of length 2, 4, 6, 8, 16, or 32. uint32_t MutingPattern2[2]; - uint8_t MutingBitRepetition; + uint8_t MutingBitRepetition; uint16_t NPRSID; } prs_data_t; //32bytes +typedef struct { + int8_t gNB_id; + int32_t timestamp; + int32_t sfn; + int8_t slot; + int8_t symbol; + int8_t rxAnt_idx; + int32_t dl_toa; + int32_t dl_aoa; + int32_t snr; + int32_t reserved; +} prs_meas_t; + #define KHz (1000UL) #define MHz (1000*KHz) From 5679e4a3b32beeadd220169aea3c3c1d59e4bee8 Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Tue, 22 Mar 2022 11:10:07 +0100 Subject: [PATCH 061/135] making SFN dependent on GPS time (when available) --- executables/nr-ru.c | 9 ++++++++- targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp | 12 ++++++------ 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/executables/nr-ru.c b/executables/nr-ru.c index 0240de87bc..394118d5a9 100644 --- a/executables/nr-ru.c +++ b/executables/nr-ru.c @@ -604,6 +604,7 @@ void *emulatedRF_thread(void *param) { void rx_rf(RU_t *ru,int *frame,int *slot) { RU_proc_t *proc = &ru->proc; NR_DL_FRAME_PARMS *fp = ru->nr_frame_parms; + openair0_config_t *cfg = &ru->openair0_cfg; void *rxp[ru->nb_rx]; unsigned int rxs; int i; @@ -653,7 +654,13 @@ void rx_rf(RU_t *ru,int *frame,int *slot) { } } - proc->frame_rx = (proc->timestamp_rx / (fp->samples_per_subframe*10))&1023; + //compute system frame number (SFN) according to O-RAN-WG4-CUS.0-v02.00 (using alpha=beta=0) + // this assumes that the USRP has been synchronized to the GPS time + // OAI uses timestamps in sample time stored in int64_t, but it will fit in double precision for many years to come. + double gps_sec = ((double) ts)/cfg->sample_rate; + proc->frame_rx = ((int64_t) (gps_sec/0.01)) & 1023; + + //proc->frame_rx = (proc->timestamp_rx / (fp->samples_per_subframe*10))&1023; proc->tti_rx = fp->get_slot_from_timestamp(proc->timestamp_rx,fp); // synchronize first reception to frame 0 subframe 0 LOG_D(PHY,"RU %d/%d TS %llu , frame %d, slot %d.%d / %d\n", diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp index fdc1f4289e..2c880ed919 100644 --- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp +++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp @@ -203,8 +203,8 @@ static int sync_to_gps(openair0_device *device) { //Set to GPS time uhd::time_spec_t gps_time = uhd::time_spec_t(time_t(s->usrp->get_mboard_sensor("gps_time", mboard).to_int())); - //s->usrp->set_time_next_pps(gps_time+1.0, mboard); - s->usrp->set_time_next_pps(uhd::time_spec_t(0.0)); + s->usrp->set_time_next_pps(gps_time+1.0, mboard); + //s->usrp->set_time_next_pps(uhd::time_spec_t(0.0)); //Wait for it to apply //The wait is 2 seconds because N-Series has a known issue where //the time at the last PPS does not properly update at the PPS edge @@ -215,10 +215,10 @@ static int sync_to_gps(openair0_device *device) { uhd::time_spec_t time_last_pps = s->usrp->get_time_last_pps(mboard); std::cout << "USRP time: " << (boost::format("%0.9f") % time_last_pps.get_real_secs()) << std::endl; std::cout << "GPSDO time: " << (boost::format("%0.9f") % gps_time.get_real_secs()) << std::endl; - //if (gps_time.get_real_secs() == time_last_pps.get_real_secs()) - // std::cout << std::endl << "SUCCESS: USRP time synchronized to GPS time" << std::endl << std::endl; - //else - // std::cerr << std::endl << "ERROR: Failed to synchronize USRP time to GPS time" << std::endl << std::endl; + if (gps_time.get_real_secs() == time_last_pps.get_real_secs()) + std::cout << std::endl << "SUCCESS: USRP time synchronized to GPS time" << std::endl << std::endl; + else + std::cerr << std::endl << "ERROR: Failed to synchronize USRP time to GPS time" << std::endl << std::endl; } if (num_gps_locked == num_mboards and num_mboards > 1) { From 984830505bcfb676c3ddcb4daac8c4dddde651aa Mon Sep 17 00:00:00 2001 From: Sagar Parsawar Date: Mon, 28 Mar 2022 10:58:32 +0200 Subject: [PATCH 062/135] 256-bit alignment fix in trx_usrp_write/trx_usrp_write_thread functions --- targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp | 29 +++++++++++++++++--- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp index 2c880ed919..6b52407a70 100644 --- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp +++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp @@ -402,7 +402,14 @@ static int trx_usrp_write(openair0_device *device, for (int j=0; j Date: Mon, 28 Mar 2022 12:08:48 +0200 Subject: [PATCH 063/135] adding case for 8 bit alignment in usrp rx --- targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp index 6b52407a70..855453ec8b 100644 --- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp +++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp @@ -405,7 +405,7 @@ static int trx_usrp_write(openair0_device *device, if ((((uintptr_t) buff[i])&0x1F)==0) { buff_tx[i][j] = _mm256_slli_epi16(((__m256i *)buff[i])[j],4); } - else + else { ((__m128i *)buff_tx[i])[2*j] = _mm_slli_epi16(((__m128i *)buff[i])[2*j],4); ((__m128i *)buff_tx[i])[2*j+1] = _mm_slli_epi16(((__m128i *)buff[i])[2*j+1],4); @@ -696,10 +696,15 @@ static int trx_usrp_read(openair0_device *device, openair0_timestamp *ptimestamp if ((((uintptr_t) buff[i])&0x1F)==0) { ((__m256i *)buff[i])[j] = _mm256_srai_epi16(buff_tmp[i][j],rxshift); - } else { + } else if ((((uintptr_t) buff[i])&0x0F)==0) { ((__m128i *)buff[i])[2*j] = _mm_srai_epi16(((__m128i *)buff_tmp[i])[2*j],rxshift); ((__m128i *)buff[i])[2*j+1] = _mm_srai_epi16(((__m128i *)buff_tmp[i])[2*j+1],rxshift); - } + } else { + ((__m64 *)buff[i])[4*j] = _mm_srai_pi16 (((__m64 *)buff_tmp[i])[4*j],rxshift); + ((__m64 *)buff[i])[4*j+1] = _mm_srai_pi16 (((__m64 *)buff_tmp[i])[4*j+1],rxshift); + ((__m64 *)buff[i])[4*j+2] = _mm_srai_pi16 (((__m64 *)buff_tmp[i])[4*j+2],rxshift); + ((__m64 *)buff[i])[4*j+3] = _mm_srai_pi16 (((__m64 *)buff_tmp[i])[4*j+3],rxshift); + } #else ((__m128i *)buff[i])[j] = _mm_srai_epi16(buff_tmp[i][j],rxshift); From f85ccaa007ab4f88fdde6b3c7a5765e4449647ee Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Mon, 28 Mar 2022 12:22:11 +0200 Subject: [PATCH 064/135] Revert "making SFN dependent on GPS time (when available)" This reverts commit 5679e4a3b32beeadd220169aea3c3c1d59e4bee8. --- executables/nr-ru.c | 9 +-------- targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp | 12 ++++++------ 2 files changed, 7 insertions(+), 14 deletions(-) diff --git a/executables/nr-ru.c b/executables/nr-ru.c index 394118d5a9..0240de87bc 100644 --- a/executables/nr-ru.c +++ b/executables/nr-ru.c @@ -604,7 +604,6 @@ void *emulatedRF_thread(void *param) { void rx_rf(RU_t *ru,int *frame,int *slot) { RU_proc_t *proc = &ru->proc; NR_DL_FRAME_PARMS *fp = ru->nr_frame_parms; - openair0_config_t *cfg = &ru->openair0_cfg; void *rxp[ru->nb_rx]; unsigned int rxs; int i; @@ -654,13 +653,7 @@ void rx_rf(RU_t *ru,int *frame,int *slot) { } } - //compute system frame number (SFN) according to O-RAN-WG4-CUS.0-v02.00 (using alpha=beta=0) - // this assumes that the USRP has been synchronized to the GPS time - // OAI uses timestamps in sample time stored in int64_t, but it will fit in double precision for many years to come. - double gps_sec = ((double) ts)/cfg->sample_rate; - proc->frame_rx = ((int64_t) (gps_sec/0.01)) & 1023; - - //proc->frame_rx = (proc->timestamp_rx / (fp->samples_per_subframe*10))&1023; + proc->frame_rx = (proc->timestamp_rx / (fp->samples_per_subframe*10))&1023; proc->tti_rx = fp->get_slot_from_timestamp(proc->timestamp_rx,fp); // synchronize first reception to frame 0 subframe 0 LOG_D(PHY,"RU %d/%d TS %llu , frame %d, slot %d.%d / %d\n", diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp index 855453ec8b..365957cad5 100644 --- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp +++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp @@ -203,8 +203,8 @@ static int sync_to_gps(openair0_device *device) { //Set to GPS time uhd::time_spec_t gps_time = uhd::time_spec_t(time_t(s->usrp->get_mboard_sensor("gps_time", mboard).to_int())); - s->usrp->set_time_next_pps(gps_time+1.0, mboard); - //s->usrp->set_time_next_pps(uhd::time_spec_t(0.0)); + //s->usrp->set_time_next_pps(gps_time+1.0, mboard); + s->usrp->set_time_next_pps(uhd::time_spec_t(0.0)); //Wait for it to apply //The wait is 2 seconds because N-Series has a known issue where //the time at the last PPS does not properly update at the PPS edge @@ -215,10 +215,10 @@ static int sync_to_gps(openair0_device *device) { uhd::time_spec_t time_last_pps = s->usrp->get_time_last_pps(mboard); std::cout << "USRP time: " << (boost::format("%0.9f") % time_last_pps.get_real_secs()) << std::endl; std::cout << "GPSDO time: " << (boost::format("%0.9f") % gps_time.get_real_secs()) << std::endl; - if (gps_time.get_real_secs() == time_last_pps.get_real_secs()) - std::cout << std::endl << "SUCCESS: USRP time synchronized to GPS time" << std::endl << std::endl; - else - std::cerr << std::endl << "ERROR: Failed to synchronize USRP time to GPS time" << std::endl << std::endl; + //if (gps_time.get_real_secs() == time_last_pps.get_real_secs()) + // std::cout << std::endl << "SUCCESS: USRP time synchronized to GPS time" << std::endl << std::endl; + //else + // std::cerr << std::endl << "ERROR: Failed to synchronize USRP time to GPS time" << std::endl << std::endl; } if (num_gps_locked == num_mboards and num_mboards > 1) { From a618b97a350ec51b564a73d263011390c6122641 Mon Sep 17 00:00:00 2001 From: Sagar Parsawar Date: Tue, 29 Mar 2022 17:32:02 +0200 Subject: [PATCH 065/135] Added MQTT client libraries to publish message --- cmake_targets/CMakeLists.txt | 2 ++ executables/nr-uesoftmodem.c | 22 +++++++++++++++++++ .../nr_dl_channel_estimation.c | 16 ++++++++++++++ openair1/PHY/defs_nr_UE.h | 9 ++++++++ 4 files changed, 49 insertions(+) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 5cd71339fb..665441035d 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -3021,6 +3021,7 @@ target_link_libraries (nr-softmodem X2AP_LIB X2AP_ENB F1AP_LIB F1AP M2AP_LIB M2AP_ENB M3AP_LIB M3AP_ENB ${PROTO_AGENT_LIB} ${FSPT_MSG_LIB} -Wl,--end-group z dl) +target_link_libraries (nr-softmodem paho-mqtt3cs) 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 ${LIB_LMS_LIBRARIES}) @@ -3107,6 +3108,7 @@ target_link_libraries (nr-uesoftmodem ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ITTI ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} LFDS7 ${ATLAS_LIBRARIES} LIB_5GNAS_GNB LIB_NAS_SIMUE ${NAS_SIM_LIB} -Wl,--end-group z dl) +target_link_libraries (nr-uesoftmodem paho-mqtt3cs) 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} ${PROTOBUF_LIB} ${CMAKE_DL_LIBS} ${LIBYAML_LIBRARIES} ${ATLAS_LIBRARIES}) target_link_libraries (nr-uesoftmodem ${LIB_LMS_LIBRARIES}) diff --git a/executables/nr-uesoftmodem.c b/executables/nr-uesoftmodem.c index 091c2f730b..161c1bcb6a 100644 --- a/executables/nr-uesoftmodem.c +++ b/executables/nr-uesoftmodem.c @@ -460,6 +460,24 @@ int main( int argc, char **argv ) { } } + int rc; + MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer; + if ((rc = MQTTClient_create(&client, ADDRESS, CLIENTID, + MQTTCLIENT_PERSISTENCE_NONE, NULL)) != MQTTCLIENT_SUCCESS) + { + printf("Failed to create MQTT client, return code %d\n", rc); + exit(EXIT_FAILURE); + } + + conn_opts.keepAliveInterval = 20; + conn_opts.cleansession = 1; + if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS) + { + printf("Failed to connect MQTT client, return code %d\n", rc); + exit(EXIT_FAILURE); + } + + NB_UE_INST=1; NB_INST=1; PHY_vars_UE_g = malloc(sizeof(PHY_VARS_NR_UE **)); @@ -545,5 +563,9 @@ int main( int argc, char **argv ) { if (ouput_vcd) vcd_signal_dumper_close(); + if ((rc = MQTTClient_disconnect(client, 10000)) != MQTTCLIENT_SUCCESS) + printf("Failed to disconnect MQTT client, return code %d\n", rc); + MQTTClient_destroy(&client); + return 0; } 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 22b3cc043f..2e8326e9e0 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -69,6 +69,10 @@ int nr_prs_channel_estimation(uint8_t gNB_id, #ifdef DEBUG_PRS_CHEST char filename[128] = {0}, varname[128] = {0}; #endif + int rc; + char payload[128] = {0}; + MQTTClient_message pubmsg = MQTTClient_message_initializer; + MQTTClient_deliveryToken token; for(int l = prs_cfg->SymbolStart; l < prs_cfg->SymbolStart+prs_cfg->NumPRSSymbols; l++) { @@ -416,6 +420,7 @@ int nr_prs_channel_estimation(uint8_t gNB_id, &ch_pwr); LOG_I(PHY, "[gNB %d][Rx %d][sfn %d][slot %d] ToA for PRS symbol %2d ==> %d / %d samples, peak channel power %.1f dB\n", gNB_id, rxAnt, proc->frame_rx, proc->nr_slot_rx, l, prs_meas[rxAnt][l].dl_toa-(frame_params->ofdm_symbol_size>>1), frame_params->ofdm_symbol_size, 10*log10(ch_pwr)); + sprintf(payload, "[gNB %d][Rx %d][sfn %d][slot %d] ToA for PRS symbol %2d ==> %d / %d samples, peak channel power %.1f dB\n", gNB_id, rxAnt, proc->frame_rx, proc->nr_slot_rx, l, prs_meas[rxAnt][l].dl_toa-(frame_params->ofdm_symbol_size>>1), frame_params->ofdm_symbol_size, 10*log10(ch_pwr)); //prs measurements prs_meas[rxAnt][l].gNB_id = 0; prs_meas[rxAnt][l].timestamp = 0; @@ -425,6 +430,17 @@ int nr_prs_channel_estimation(uint8_t gNB_id, prs_meas[rxAnt][l].rxAnt_idx = rxAnt; prs_meas[rxAnt][l].snr = 0; prs_meas[rxAnt][l].dl_aoa = 0; + + // publish MQTT message + pubmsg.payload = payload; + pubmsg.payloadlen = (int)strlen(payload); + pubmsg.qos = QOS; + pubmsg.retained = 0; + if ((rc = MQTTClient_publishMessage(client, TOPIC, &pubmsg, &token)) != MQTTCLIENT_SUCCESS) + { + printf("Failed to publish MQTT message, return code %d\n", rc); + exit(EXIT_FAILURE); + } } // for rxAnt } //for l diff --git a/openair1/PHY/defs_nr_UE.h b/openair1/PHY/defs_nr_UE.h index a8082ee147..638075c69f 100644 --- a/openair1/PHY/defs_nr_UE.h +++ b/openair1/PHY/defs_nr_UE.h @@ -111,6 +111,15 @@ #include #include "targets/ARCH/COMMON/common_lib.h" +#include "MQTTClient.h" +#define ADDRESS "tcp://mqtt.eclipseprojects.io:1883" +#define CLIENTID "OAI_PRS" +#define TOPIC "PRS_TOA" +#define PAYLOAD "Hello World! from Eurecom france" +#define QOS 1 +MQTTClient client; + + /// Context data structure for gNB subframe processing typedef struct { /// Component Carrier index From a907d3d22098fc4129929769a107787c55bd10cc Mon Sep 17 00:00:00 2001 From: rakesh mundlamuri Date: Wed, 30 Mar 2022 08:43:53 +0200 Subject: [PATCH 066/135] beam switching logic for sivers --- executables/nr-ru.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/executables/nr-ru.c b/executables/nr-ru.c index 0240de87bc..8612efe8df 100644 --- a/executables/nr-ru.c +++ b/executables/nr-ru.c @@ -748,6 +748,7 @@ void tx_rf(RU_t *ru,int frame,int slot, uint64_t timestamp) { // bit 11 enables the gpio programming // currently we switch beams every 10 slots (should = 1 TDD period in FR2) and we take the beam index of the first symbol of the first slot of this period int beam=0; + int BF_RST, BF_INC=-1, BF_RTN=0; if (slot%10==0) { if ( ru->common.beam_id && (ru->common.beam_id[0][slot*fp->symbols_per_slot] < 8)) { @@ -755,6 +756,21 @@ void tx_rf(RU_t *ru,int frame,int slot, uint64_t timestamp) { } } + // reset condition + if(slot==0){ + BF_RST = 1; + } else{ + BF_RST = 0; + } + + // beam increment condition. Here we are incrementing for every 10 slots + if(slot!=0 && slot%10==0){ + BF_INC = 1; + } else if(slot==0 || slot%10==1) { + BF_INC = 0; + } + + if(BF_INC!=-1) beam = BF_RST | BF_INC << 1 | BF_RTN << 2 | 8; /* if (slot==0 || slot==40) beam=0|8; if (slot==10 || slot==50) beam=1|8; From f5587fcdca7a87b4149fb9617bde042026e258ae Mon Sep 17 00:00:00 2001 From: Sagar Parsawar Date: Tue, 5 Apr 2022 12:42:02 +0200 Subject: [PATCH 067/135] OAI UE: Added SNR measurements and averaging PRS channel estimates over NumPRSSymbols --- .../nr_dl_channel_estimation.c | 385 ++++++++++-------- 1 file changed, 221 insertions(+), 164 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 22b3cc043f..1290ec9e2a 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -38,19 +38,22 @@ //#define DEBUG_PRS_CHEST //#define DEBUG_PRS_PRINTS extern short nr_qpsk_mod_table[8]; +int k_prime_table[4][12] = { + {0,1,0,1,0,1,0,1,0,1,0,1}, + {0,2,1,3,0,2,1,3,0,2,1,3}, + {0,3,1,4,2,5,0,3,1,4,2,5}, + {0,6,3,9,1,7,4,10,2,8,5,11}}; + +static inline int abs32(int x) +{ + return (((int)((short*)&x)[0])*((int)((short*)&x)[0]) + ((int)((short*)&x)[1])*((int)((short*)&x)[1])); +} int nr_prs_channel_estimation(uint8_t gNB_id, PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, NR_DL_FRAME_PARMS *frame_params) { - // Get K_Prime from the table for the length of PRS or LPRS - int k_prime_table[4][12] = { - {0,1,0,1,0,1,0,1,0,1,0,1}, - {0,2,1,3,0,2,1,3,0,2,1,3}, - {0,3,1,4,2,5,0,3,1,4,2,5}, - {0,6,3,9,1,7,4,10,2,8,5,11}}; - int32_t **rxdataF = ue->common_vars.common_vars_rx_data_per_thread[proc->thread_id].rxdataF; uint32_t **nr_gold_prs = ue->nr_gold_prs[proc->nr_slot_rx]; prs_data_t *prs_cfg = &ue->prs_vars[gNB_id]->prs_cfg; @@ -59,16 +62,18 @@ int nr_prs_channel_estimation(uint8_t gNB_id, int32_t **prs_chestT = ue->prs_vars[gNB_id]->prs_ch_estimates_time; uint8_t rxAnt = 0, idx = prs_cfg->NPRSID; - int16_t ch[2] = {0}, *rxF, *pil, *fl,*fm, *fmm, *fml, *fmr, *fr, mod_prs[NR_MAX_PRS_LENGTH<<1]; - int16_t k_prime = 0, k = 0, re_offset = 0, second_half = 0; - int16_t *ch_freq = (int16_t *)malloc16_clear(frame_params->ofdm_symbol_size*sizeof(int32_t)); - int32_t *ch_time = (int32_t *)malloc16_clear(frame_params->ofdm_symbol_size*sizeof(int32_t)); - AssertFatal(((ch_freq != NULL) || (ch_time != NULL)), "nr_prs_channel_estimation: channel estimate buffer initialization failed!!"); - int16_t *ch_init = ch_freq; - int32_t ch_pwr= 0; + int16_t *rxF, *pil, *fl, *fm, *fmm, *fml, *fmr, *fr, mod_prs[NR_MAX_PRS_LENGTH<<1]; + int16_t ch[2] = {0}, noiseFig[2] = {0}; + int16_t k_prime = 0, k = 0, re_offset = 0, first_half = 0, second_half = 0; + int16_t *ch_tmp = (int16_t *)malloc16_clear(frame_params->ofdm_symbol_size*sizeof(int32_t)); + AssertFatal((ch_tmp != NULL), "[%s] channel estimate buffer initialization failed!!", __FUNCTION__); + int32_t ch_pwr = 0, snr = 0; #ifdef DEBUG_PRS_CHEST - char filename[128] = {0}, varname[128] = {0}; + char filename[64] = {0}, varname[64] = {0}; #endif + int16_t *ch_init = ch_tmp; + int16_t scale_factor = (1.0f/(float)(prs_cfg->NumPRSSymbols))*(1<<15); + int16_t num_pilots = (12/prs_cfg->CombSize)*prs_cfg->NumRB; for(int l = prs_cfg->SymbolStart; l < prs_cfg->SymbolStart+prs_cfg->NumPRSSymbols; l++) { @@ -90,7 +95,7 @@ int nr_prs_channel_estimation(uint8_t gNB_id, printf("[gNB %d] PRS config l %d k_prime %d:\nprs_cfg->SymbolStart %d\nprs_cfg->NumPRSSymbols %d\nprs_cfg->NumRB %d\nprs_cfg->CombSize %d\n", gNB_id, l, k_prime, prs_cfg->SymbolStart, prs_cfg->NumPRSSymbols, prs_cfg->NumRB, prs_cfg->CombSize); #endif // Pilots generation and modulation - for (int m = 0; m < (12/prs_cfg->CombSize)*prs_cfg->NumRB; m++) + for (int m = 0; m < num_pilots; m++) { idx = (((nr_gold_prs[l][(m<<1)>>5])>>((m<<1)&0x1f))&3); mod_prs[m<<1] = nr_qpsk_mod_table[idx<<1]; @@ -99,13 +104,15 @@ int nr_prs_channel_estimation(uint8_t gNB_id, for (rxAnt=0; rxAnt < frame_params->nb_antennas_rx; rxAnt++) { + snr = 0; + // calculate RE offset k = re_offset = (prs_cfg->REOffset+k_prime) % prs_cfg->CombSize + prs_cfg->RBOffset*12 + frame_params->first_carrier_offset; // Channel estimation and interpolation pil = (int16_t *)&mod_prs[0]; rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k]; - memset(ch_freq,0,sizeof(int32_t)*(ue->frame_parms.ofdm_symbol_size)); + //memset(ch_tmp,0,sizeof(int32_t)*(ue->frame_parms.ofdm_symbol_size)); if(prs_cfg->CombSize == 2) { @@ -138,80 +145,101 @@ int nr_prs_channel_estimation(uint8_t gNB_id, //Start pilot ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); -#ifdef DEBUG_PRS_PRINTS - printf("[Rx %d] pilot %3d : rxF - > (%+3d, %+3d) addr %p ch -> (%+3d, %+3d), pil -> (%+d, %+d) \n", rxAnt, 0, rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); -#endif multadd_real_vector_complex_scalar(fl, ch, - ch_freq, + ch_tmp, 8); + //SNR estimation + noiseFig[0] = rxF[0] - (int16_t)(((int32_t)ch[0]*pil[0] - (int32_t)ch[1]*pil[1])>>15); + noiseFig[1] = rxF[1] - (int16_t)(((int32_t)ch[1]*pil[0] + (int32_t)ch[0]*pil[1])>>15); + snr += 10*log10(abs32(*((int*)rxF)) - abs32(*((int*)noiseFig))) - 10*log10(abs32(*((int*)noiseFig))); +#ifdef DEBUG_PRS_PRINTS + printf("[Rx %d] pilot %3d, SNR %+2d dB: rxF - > (%+3d, %+3d) addr %p ch -> (%+3d, %+3d), pil -> (%+d, %+d) \n", rxAnt, 0, snr, rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); +#endif pil +=2; k = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size; rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k]; //Middle pilots - for(int pIdx = 1; pIdx < prs_cfg->NumRB*(12/prs_cfg->CombSize)-1; pIdx+=2) + for(int pIdx = 1; pIdx < num_pilots-1; pIdx+=2) { ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); -#ifdef DEBUG_PRS_PRINTS - printf("[Rx %d] pilot %3d : rxF - > (%+3d, %+3d) addr %p ch -> (%+3d, %+3d), pil -> (%+d, %+d) \n", rxAnt, pIdx, rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); -#endif if(pIdx == 1) // 2nd pilot { multadd_real_vector_complex_scalar(fml, ch, - ch_freq, + ch_tmp, 8); } else { multadd_real_vector_complex_scalar(fm, ch, - ch_freq, + ch_tmp, 8); } + + //SNR estimation + noiseFig[0] = rxF[0] - (int16_t)(((int32_t)ch[0]*pil[0] - (int32_t)ch[1]*pil[1])>>15); + noiseFig[1] = rxF[1] - (int16_t)(((int32_t)ch[1]*pil[0] + (int32_t)ch[0]*pil[1])>>15); + snr += 10*log10(abs32(*((int*)rxF)) - abs32(*((int*)noiseFig))) - 10*log10(abs32(*((int*)noiseFig))); +#ifdef DEBUG_PRS_PRINTS + printf("[Rx %d] pilot %3d, SNR %+2d dB: rxF - > (%+3d, %+3d) addr %p ch -> (%+3d, %+3d), pil -> (%+d, %+d) \n", rxAnt, pIdx, snr/(pIdx+1), rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); +#endif pil +=2; k = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size; rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k]; ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); -#ifdef DEBUG_PRS_PRINTS - printf("[Rx %d] pilot %3d : rxF - > (%+3d, %+3d) addr %p ch -> (%+3d, %+3d), pil -> (%+d, %+d) \n", rxAnt, pIdx+1, rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); -#endif - if(pIdx == (prs_cfg->NumRB*(12/prs_cfg->CombSize)-3)) // 2nd last pilot + if(pIdx == (num_pilots-3)) // 2nd last pilot { multadd_real_vector_complex_scalar(fmr, ch, - ch_freq, + ch_tmp, 8); } else { multadd_real_vector_complex_scalar(fmm, ch, - ch_freq, + ch_tmp, 8); } - + + //SNR estimation + noiseFig[0] = rxF[0] - (int16_t)(((int32_t)ch[0]*pil[0] - (int32_t)ch[1]*pil[1])>>15); + noiseFig[1] = rxF[1] - (int16_t)(((int32_t)ch[1]*pil[0] + (int32_t)ch[0]*pil[1])>>15); + snr += 10*log10(abs32(*((int*)rxF)) - abs32(*((int*)noiseFig))) - 10*log10(abs32(*((int*)noiseFig))); +#ifdef DEBUG_PRS_PRINTS + printf("[Rx %d] pilot %3d, SNR %+2d dB: rxF - > (%+3d, %+3d) addr %p ch -> (%+3d, %+3d), pil -> (%+d, %+d) \n", rxAnt, pIdx+1, snr/(pIdx+2), rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); +#endif pil +=2; k = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size; rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k]; - ch_freq +=8; + ch_tmp +=8; } //End pilot ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); -#ifdef DEBUG_PRS_PRINTS - printf("[Rx %d] pilot %3d : rxF - > (%+3d, %+3d) addr %p ch -> (%+3d, %+3d), pil -> (%+d, %+d) \n", rxAnt, prs_cfg->NumRB*(12/prs_cfg->CombSize)-1, rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); -#endif multadd_real_vector_complex_scalar(fr, ch, - ch_freq, + ch_tmp, 8); + + //SNR estimation + noiseFig[0] = rxF[0] - (int16_t)(((int32_t)ch[0]*pil[0] - (int32_t)ch[1]*pil[1])>>15); + noiseFig[1] = rxF[1] - (int16_t)(((int32_t)ch[1]*pil[0] + (int32_t)ch[0]*pil[1])>>15); + snr += 10*log10(abs32(*((int*)rxF)) - abs32(*((int*)noiseFig))) - 10*log10(abs32(*((int*)noiseFig))); +#ifdef DEBUG_PRS_PRINTS + printf("[Rx %d] pilot %3d, SNR %+2d dB: rxF - > (%+3d, %+3d) addr %p ch -> (%+3d, %+3d), pil -> (%+d, %+d) \n", rxAnt, num_pilots-1, snr/num_pilots, rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); +#endif + // average out the SNR computed + snr = snr/num_pilots; + prs_meas[rxAnt][l].snr = snr; } else if(prs_cfg->CombSize == 4) { @@ -262,174 +290,209 @@ int nr_prs_channel_estimation(uint8_t gNB_id, //Start pilot ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); -#ifdef DEBUG_PRS_PRINTS - printf("[Rx %d] pilot %3d : rxF - > (%+3d, %+3d) addr %p ch -> (%+3d, %+3d), pil -> (%+d, %+d) \n", rxAnt, 0, rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); -#endif multadd_real_vector_complex_scalar(fl, ch, - ch_freq, + ch_tmp, 16); - + + //SNR estimation + noiseFig[0] = rxF[0] - (int16_t)(((int32_t)ch[0]*pil[0] - (int32_t)ch[1]*pil[1])>>15); + noiseFig[1] = rxF[1] - (int16_t)(((int32_t)ch[1]*pil[0] + (int32_t)ch[0]*pil[1])>>15); + snr += 10*log10(abs32(*((int*)rxF)) - abs32(*((int*)noiseFig))) - 10*log10(abs32(*((int*)noiseFig))); +#ifdef DEBUG_PRS_PRINTS + printf("[Rx %d] pilot %3d, SNR %+2d dB: rxF - > (%+3d, %+3d) addr %p ch -> (%+3d, %+3d), pil -> (%+d, %+d) \n", rxAnt, 0, snr, rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); +#endif pil +=2; k = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size; rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k]; ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); -#ifdef DEBUG_PRS_PRINTS - printf("[Rx %d] pilot %3d : rxF - > (%+3d, %+3d) addr %p ch -> (%+3d, %+3d), pil -> (%+d, %+d) \n", rxAnt, 1, rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); -#endif multadd_real_vector_complex_scalar(fml, ch, - ch_freq, + ch_tmp, 16); + //SNR estimation + noiseFig[0] = rxF[0] - (int16_t)(((int32_t)ch[0]*pil[0] - (int32_t)ch[1]*pil[1])>>15); + noiseFig[1] = rxF[1] - (int16_t)(((int32_t)ch[1]*pil[0] + (int32_t)ch[0]*pil[1])>>15); + snr += 10*log10(abs32(*((int*)rxF)) - abs32(*((int*)noiseFig))) - 10*log10(abs32(*((int*)noiseFig))); +#ifdef DEBUG_PRS_PRINTS + printf("[Rx %d] pilot %3d, SNR %+2d dB: rxF - > (%+3d, %+3d) addr %p ch -> (%+3d, %+3d), pil -> (%+d, %+d) \n", rxAnt, 1, snr/2, rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); +#endif pil +=2; k = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size; rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k]; - ch_freq +=8; + ch_tmp +=8; //Middle pilots - for(int pIdx = 2; pIdx < prs_cfg->NumRB*(12/prs_cfg->CombSize)-2; pIdx++) + for(int pIdx = 2; pIdx < num_pilots-2; pIdx++) { ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); -#ifdef DEBUG_PRS_PRINTS - printf("[Rx %d] pilot %3d : rxF - > (%+3d, %+3d) addr %p ch -> (%+3d, %+3d), pil -> (%+d, %+d) \n", rxAnt, pIdx, rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); -#endif multadd_real_vector_complex_scalar(fmm, ch, - ch_freq, + ch_tmp, 16); + + //SNR estimation + noiseFig[0] = rxF[0] - (int16_t)(((int32_t)ch[0]*pil[0] - (int32_t)ch[1]*pil[1])>>15); + noiseFig[1] = rxF[1] - (int16_t)(((int32_t)ch[1]*pil[0] + (int32_t)ch[0]*pil[1])>>15); + snr += 10*log10(abs32(*((int*)rxF)) - abs32(*((int*)noiseFig))) - 10*log10(abs32(*((int*)noiseFig))); +#ifdef DEBUG_PRS_PRINTS + printf("[Rx %d] pilot %3d, SNR %+2d dB: rxF - > (%+3d, %+3d) addr %p ch -> (%+3d, %+3d), pil -> (%+d, %+d) \n", rxAnt, pIdx, snr/(pIdx+1), rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); +#endif pil +=2; k = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size; rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k]; - ch_freq +=8; + ch_tmp +=8; } //End pilot ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); -#ifdef DEBUG_PRS_PRINTS - printf("[Rx %d] pilot %3d : rxF - > (%+3d, %+3d) addr %p ch -> (%+3d, %+3d), pil -> (%+d, %+d) \n", rxAnt, prs_cfg->NumRB*(12/prs_cfg->CombSize)-2, rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); -#endif multadd_real_vector_complex_scalar(fmr, ch, - ch_freq, + ch_tmp, 16); + + //SNR estimation + noiseFig[0] = rxF[0] - (int16_t)(((int32_t)ch[0]*pil[0] - (int32_t)ch[1]*pil[1])>>15); + noiseFig[1] = rxF[1] - (int16_t)(((int32_t)ch[1]*pil[0] + (int32_t)ch[0]*pil[1])>>15); + snr += 10*log10(abs32(*((int*)rxF)) - abs32(*((int*)noiseFig))) - 10*log10(abs32(*((int*)noiseFig))); +#ifdef DEBUG_PRS_PRINTS + printf("[Rx %d] pilot %3d, SNR %+2d dB: rxF - > (%+3d, %+3d) addr %p ch -> (%+3d, %+3d), pil -> (%+d, %+d) \n", rxAnt, num_pilots-2, snr/(num_pilots-1), rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); +#endif pil +=2; k = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size; rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k]; ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15); ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15); -#ifdef DEBUG_PRS_PRINTS - printf("[Rx %d] pilot %3d : rxF - > (%+3d, %+3d) addr %p ch -> (%+3d, %+3d), pil -> (%+d, +%d) \n", rxAnt, prs_cfg->NumRB*(12/prs_cfg->CombSize)-1, rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); -#endif multadd_real_vector_complex_scalar(fr, ch, - ch_freq, + ch_tmp, 16); + + //SNR estimation + noiseFig[0] = rxF[0] - (int16_t)(((int32_t)ch[0]*pil[0] - (int32_t)ch[1]*pil[1])>>15); + noiseFig[1] = rxF[1] - (int16_t)(((int32_t)ch[1]*pil[0] + (int32_t)ch[0]*pil[1])>>15); + snr += 10*log10(abs32(*((int*)rxF)) - abs32(*((int*)noiseFig))) - 10*log10(abs32(*((int*)noiseFig))); +#ifdef DEBUG_PRS_PRINTS + printf("[Rx %d] pilot %3d, SNR %+2d dB: rxF - > (%+3d, %+3d) addr %p ch -> (%+3d, %+3d), pil -> (%+d, +%d) \n", rxAnt, num_pilots-1, snr/num_pilots, rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); +#endif + // average out the SNR computed + snr = snr/num_pilots; + prs_meas[rxAnt][l].snr = snr; } else { - AssertFatal((prs_cfg->CombSize == 2)||(prs_cfg->CombSize == 4), "[NR_PRS Channel EStimation] CombSize other than 2 and 4 are NOT supported currently. Exiting!!!"); + AssertFatal((prs_cfg->CombSize == 2)||(prs_cfg->CombSize == 4), "[%s] DL PRS CombSize other than 2 and 4 are NOT supported currently. Exiting!!!", __FUNCTION__); } //reset channel pointer - ch_freq = ch_init; -#ifdef DEBUG_PRS_PRINTS - for (int rb = 0; rb < prs_cfg->NumRB; rb++) - { - printf("================================================================\n"); - printf("\t\t[gNB %d][Rx %d][PRS symb %d, RB %d]\n", gNB_id, rxAnt, l, rb); - printf("================================================================\n"); - idx = (12*rb)<<1; - printf("%4d %4d %4d %4d %4d %4d %4d %4d %4d %4d %4d %4d\n", ch_freq[idx], ch_freq[idx+1], ch_freq[idx+2], ch_freq[idx+3], ch_freq[idx+4], ch_freq[idx+5], ch_freq[idx+6], ch_freq[idx+7], ch_freq[idx+8], ch_freq[idx+9], ch_freq[idx+10], ch_freq[idx+11]); - printf("%4d %4d %4d %4d %4d %4d %4d %4d %4d %4d %4d %4d\n", ch_freq[idx+12], ch_freq[idx+13], ch_freq[idx+14], ch_freq[idx+15], ch_freq[idx+16], ch_freq[idx+17], ch_freq[idx+18], ch_freq[idx+19], ch_freq[idx+20], ch_freq[idx+21], ch_freq[idx+22], ch_freq[idx+23]); - printf("\n"); - } -#endif - // Place PRS channel estimates in rxdataF shifted format - second_half = (prs_cfg->NumRB*12-(frame_params->ofdm_symbol_size-re_offset)); - memcpy((int16_t *)&prs_chestF[rxAnt][l*frame_params->ofdm_symbol_size+re_offset], &ch_init[0], (frame_params->ofdm_symbol_size - re_offset)*sizeof(int32_t)); - if(second_half > 0) - memcpy((int16_t *)&prs_chestF[rxAnt][l*frame_params->ofdm_symbol_size], &ch_init[(frame_params->ofdm_symbol_size - re_offset)<<1], second_half*sizeof(int32_t)); - - // Time domain IMPULSE response - idft_size_idx_t idftsizeidx; - - switch (frame_params->ofdm_symbol_size) { - case 128: - idftsizeidx = IDFT_128; - break; - - case 256: - idftsizeidx = IDFT_256; - break; - - case 512: - idftsizeidx = IDFT_512; - break; - - case 768: - idftsizeidx = IDFT_768; - 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: - LOG_I(PHY, "%s: unsupported ofdm symbol size \n", __FUNCTION__); - assert(0); - } - - idft(idftsizeidx, - (int16_t *)&prs_chestF[rxAnt][l*frame_params->ofdm_symbol_size], - (int16_t *)&ch_time[0],1); - - // rearrange impulse response - memcpy((int16_t *)&prs_chestT[rxAnt][l*frame_params->ofdm_symbol_size], &ch_time[frame_params->ofdm_symbol_size>>1], (frame_params->ofdm_symbol_size>>1)*sizeof(int32_t)); - memcpy((int16_t *)&prs_chestT[rxAnt][l*frame_params->ofdm_symbol_size + (frame_params->ofdm_symbol_size>>1)], &ch_time[0], (frame_params->ofdm_symbol_size>>1)*sizeof(int32_t)); - - // peak estimator - peak_estimator(&prs_chestT[rxAnt][l*frame_params->ofdm_symbol_size], - frame_params->ofdm_symbol_size, - &prs_meas[rxAnt][l].dl_toa, - &ch_pwr); - LOG_I(PHY, "[gNB %d][Rx %d][sfn %d][slot %d] ToA for PRS symbol %2d ==> %d / %d samples, peak channel power %.1f dB\n", gNB_id, rxAnt, proc->frame_rx, proc->nr_slot_rx, l, prs_meas[rxAnt][l].dl_toa-(frame_params->ofdm_symbol_size>>1), frame_params->ofdm_symbol_size, 10*log10(ch_pwr)); - - //prs measurements - prs_meas[rxAnt][l].gNB_id = 0; - prs_meas[rxAnt][l].timestamp = 0; - prs_meas[rxAnt][l].sfn = proc->frame_rx; - prs_meas[rxAnt][l].slot = proc->nr_slot_rx; - prs_meas[rxAnt][l].symbol = l; - prs_meas[rxAnt][l].rxAnt_idx = rxAnt; - prs_meas[rxAnt][l].snr = 0; - prs_meas[rxAnt][l].dl_aoa = 0; + ch_tmp = ch_init; } // for rxAnt } //for l - + + int16_t l = 0; //symbIdx for (rxAnt=0; rxAnt < frame_params->nb_antennas_rx; rxAnt++) { + // scale by averaging factor 1/NumPrsSymbols + multadd_complex_vector_real_scalar(ch_tmp, + scale_factor, + ch_tmp, + 1, + frame_params->ofdm_symbol_size); + +#ifdef DEBUG_PRS_PRINTS + for (int rb = 0; rb < prs_cfg->NumRB; rb++) + { + printf("================================================================\n"); + printf("\t\t\t[gNB %d][Rx %d][RB %d]\n", gNB_id, rxAnt, rb); + printf("================================================================\n"); + idx = (12*rb)<<1; + printf("%4d %4d %4d %4d %4d %4d %4d %4d %4d %4d %4d %4d\n", ch_tmp[idx], ch_tmp[idx+1], ch_tmp[idx+2], ch_tmp[idx+3], ch_tmp[idx+4], ch_tmp[idx+5], ch_tmp[idx+6], ch_tmp[idx+7], ch_tmp[idx+8], ch_tmp[idx+9], ch_tmp[idx+10], ch_tmp[idx+11]); + printf("%4d %4d %4d %4d %4d %4d %4d %4d %4d %4d %4d %4d\n", ch_tmp[idx+12], ch_tmp[idx+13], ch_tmp[idx+14], ch_tmp[idx+15], ch_tmp[idx+16], ch_tmp[idx+17], ch_tmp[idx+18], ch_tmp[idx+19], ch_tmp[idx+20], ch_tmp[idx+21], ch_tmp[idx+22], ch_tmp[idx+23]); + printf("\n"); + } +#endif + + // Place PRS channel estimates in FFT shifted format + first_half = frame_params->ofdm_symbol_size - re_offset; + second_half = (prs_cfg->NumRB*12) - first_half; + if(first_half > 0) + memcpy((int16_t *)&prs_chestF[rxAnt][l*frame_params->ofdm_symbol_size+re_offset], &ch_tmp[0], first_half*sizeof(int32_t)); + if(second_half > 0) + memcpy((int16_t *)&prs_chestF[rxAnt][l*frame_params->ofdm_symbol_size], &ch_tmp[(frame_params->ofdm_symbol_size - re_offset)<<1], second_half*sizeof(int32_t)); + + // Time domain IMPULSE response + idft_size_idx_t idftsizeidx; + switch (frame_params->ofdm_symbol_size) { + case 128: + idftsizeidx = IDFT_128; + break; + + case 256: + idftsizeidx = IDFT_256; + break; + + case 512: + idftsizeidx = IDFT_512; + break; + + case 768: + idftsizeidx = IDFT_768; + 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: + LOG_I(PHY, "%s: unsupported ofdm symbol size \n", __FUNCTION__); + assert(0); + } + + idft(idftsizeidx, + (int16_t *)&prs_chestF[rxAnt][l*frame_params->ofdm_symbol_size], + (int16_t *)&ch_tmp[0],1); + + // rearrange impulse response + memcpy((int16_t *)&prs_chestT[rxAnt][l*frame_params->ofdm_symbol_size], &ch_tmp[frame_params->ofdm_symbol_size], (frame_params->ofdm_symbol_size>>1)*sizeof(int32_t)); + memcpy((int16_t *)&prs_chestT[rxAnt][l*frame_params->ofdm_symbol_size + (frame_params->ofdm_symbol_size>>1)], &ch_tmp[0], (frame_params->ofdm_symbol_size>>1)*sizeof(int32_t)); + + // peak estimator + peak_estimator(&prs_chestT[rxAnt][l*frame_params->ofdm_symbol_size], + frame_params->ofdm_symbol_size, + &prs_meas[rxAnt][l].dl_toa, + &ch_pwr); + LOG_I(PHY, "[gNB %d][Rx %d][sfn %d][slot %d] ToA for PRS symbol %2d ==> %d / %d samples, peak channel power %.1f dB\n", gNB_id, rxAnt, proc->frame_rx, proc->nr_slot_rx, l, prs_meas[rxAnt][l].dl_toa-(frame_params->ofdm_symbol_size>>1), frame_params->ofdm_symbol_size, 10*log10(ch_pwr)); + + //prs measurements + prs_meas[rxAnt][l].gNB_id = gNB_id; + prs_meas[rxAnt][l].timestamp = 0; //TODO + prs_meas[rxAnt][l].sfn = proc->frame_rx; + prs_meas[rxAnt][l].slot = proc->nr_slot_rx; + prs_meas[rxAnt][l].rxAnt_idx = rxAnt; + prs_meas[rxAnt][l].dl_aoa = 0; + #ifdef DEBUG_PRS_CHEST sprintf(filename, "%s%i%s", "PRSpilot_", rxAnt, ".m"); LOG_M(filename, "prs_loc", &mod_prs[0], prs_cfg->NumRB*(12/prs_cfg->CombSize),1,1); @@ -438,10 +501,10 @@ int nr_prs_channel_estimation(uint8_t gNB_id, LOG_M(filename, varname, &rxdataF[rxAnt][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], prs_cfg->NumPRSSymbols*frame_params->ofdm_symbol_size,1,1); sprintf(filename, "%s%i%s", "prsChestF_", rxAnt, ".m"); sprintf(varname, "%s%i", "prsChF_", rxAnt); - LOG_M(filename, varname, &prs_chestF[rxAnt][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], prs_cfg->NumPRSSymbols*frame_params->ofdm_symbol_size,1,1); + LOG_M(filename, varname, &prs_chestF[rxAnt][l*frame_params->ofdm_symbol_size], frame_params->ofdm_symbol_size,1,1); sprintf(filename, "%s%i%s", "prsChestT_", rxAnt, ".m"); sprintf(varname, "%s%i", "prsChT_", rxAnt); - LOG_M(filename, varname, &prs_chestT[rxAnt][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], prs_cfg->NumPRSSymbols*frame_params->ofdm_symbol_size,1,1); + LOG_M(filename, varname, &prs_chestT[rxAnt][l*frame_params->ofdm_symbol_size], frame_params->ofdm_symbol_size,1,1); #endif // T tracer dump @@ -451,23 +514,17 @@ int nr_prs_channel_estimation(uint8_t gNB_id, T(T_UE_PHY_DL_CHANNEL_ESTIMATE_FREQ, T_INT(gNB_id), T_INT(proc->frame_rx), T_INT(proc->nr_slot_rx), - T_INT(rxAnt), T_BUFFER(&prs_chestF[rxAnt][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], prs_cfg->NumPRSSymbols*frame_params->ofdm_symbol_size*sizeof(int32_t))); + T_INT(rxAnt), T_BUFFER(&prs_chestF[rxAnt][l*frame_params->ofdm_symbol_size], prs_cfg->NumPRSSymbols*frame_params->ofdm_symbol_size*sizeof(int32_t))); T(T_UE_PHY_DL_CHANNEL_ESTIMATE, T_INT(gNB_id), T_INT(proc->frame_rx), T_INT(proc->nr_slot_rx), - T_INT(rxAnt), T_BUFFER(&prs_chestT[rxAnt][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], prs_cfg->NumPRSSymbols*frame_params->ofdm_symbol_size*sizeof(int32_t))); - + T_INT(rxAnt), T_BUFFER(&prs_chestT[rxAnt][l*frame_params->ofdm_symbol_size], prs_cfg->NumPRSSymbols*frame_params->ofdm_symbol_size*sizeof(int32_t))); } - free(ch_freq); - free(ch_time); + free(ch_tmp); return(0); } -static inline int abs32(int x) -{ - return (((int)((short*)&x)[0])*((int)((short*)&x)[0]) + ((int)((short*)&x)[1])*((int)((short*)&x)[1])); -} /* Generic function to find the peak of channel estimation buffer */ void peak_estimator(int32_t *buffer, int32_t buf_len, int32_t *peak_idx, int32_t *peak_val) From 5b22d94d370d90fd60ec2da47e1d2544d74f3a63 Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Wed, 6 Apr 2022 12:50:25 +0200 Subject: [PATCH 068/135] adding special PRB configs --- executables/nr-ru.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/executables/nr-ru.c b/executables/nr-ru.c index 8612efe8df..b098c8998a 100644 --- a/executables/nr-ru.c +++ b/executables/nr-ru.c @@ -998,7 +998,8 @@ void fill_rf_config(RU_t *ru, char *rf_config_file) { } } else if (mu == NR_MU_3) { switch(N_RB) { - case 132: + case 132: + case 128: if (fp->threequarter_fs) { cfg->sample_rate=184.32e6; cfg->samples_per_frame = 1843200; @@ -1012,7 +1013,8 @@ void fill_rf_config(RU_t *ru, char *rf_config_file) { } break; - case 66: + case 64: + case 66: if (fp->threequarter_fs) { cfg->sample_rate=92.16e6; cfg->samples_per_frame = 921600; From 367ad780a4c1199d1ed13cf25da2f8446b7f27b1 Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Wed, 6 Apr 2022 12:39:26 +0200 Subject: [PATCH 069/135] fixing "making SFN dependent on GPS time" in fact it syncs the USRP time to GPS time when available and then derives the SFN from the USRP time. a side effect is that now SFN does not necessarily start at 0 and this also required other changes - initialization of the future_ul_tti_request. - fixing a bug in get_samples_per_slot --- executables/nr-ru.c | 18 +++++++--- openair1/PHY/INIT/nr_parms.c | 4 +-- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c | 4 +-- targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp | 38 ++++++++++---------- 4 files changed, 37 insertions(+), 27 deletions(-) diff --git a/executables/nr-ru.c b/executables/nr-ru.c index b098c8998a..a47a4f8ea0 100644 --- a/executables/nr-ru.c +++ b/executables/nr-ru.c @@ -604,6 +604,7 @@ void *emulatedRF_thread(void *param) { void rx_rf(RU_t *ru,int *frame,int *slot) { RU_proc_t *proc = &ru->proc; NR_DL_FRAME_PARMS *fp = ru->nr_frame_parms; + openair0_config_t *cfg = &ru->openair0_cfg; void *rxp[ru->nb_rx]; unsigned int rxs; int i; @@ -641,8 +642,8 @@ void rx_rf(RU_t *ru,int *frame,int *slot) { if (rxs != samples_per_slot) LOG_E(PHY, "rx_rf: Asked for %d samples, got %d from USRP\n",samples_per_slot,rxs); if (proc->first_rx == 1) { - ru->ts_offset = proc->timestamp_rx; - proc->timestamp_rx = 0; + //ru->ts_offset = proc->timestamp_rx; + //proc->timestamp_rx = 0; } else { samples_per_slot_prev = fp->get_samples_per_slot((*slot-1)%fp->slots_per_frame,fp); @@ -653,13 +654,22 @@ void rx_rf(RU_t *ru,int *frame,int *slot) { } } + //compute system frame number (SFN) according to O-RAN-WG4-CUS.0-v02.00 (using alpha=beta=0) + // this assumes that the USRP has been synchronized to the GPS time + // OAI uses timestamps in sample time stored in int64_t, but it will fit in double precision for many years to come. + double gps_sec = ((double) ts)/cfg->sample_rate; + //proc->frame_rx = ((int64_t) (gps_sec/0.01)) & 1023; + + // in fact the following line is the same as long as the timestamp_rx is synchronized to GPS. proc->frame_rx = (proc->timestamp_rx / (fp->samples_per_subframe*10))&1023; proc->tti_rx = fp->get_slot_from_timestamp(proc->timestamp_rx,fp); // synchronize first reception to frame 0 subframe 0 - LOG_D(PHY,"RU %d/%d TS %llu , frame %d, slot %d.%d / %d\n", + LOG_D(PHY,"RU %d/%d TS %ld, GPS %f, SR %f, frame %d, slot %d.%d / %d\n", ru->idx, 0, - (unsigned long long int)(proc->timestamp_rx+ru->ts_offset), + ts, //(unsigned long long int)(proc->timestamp_rx+ru->ts_offset), + gps_sec, + cfg->sample_rate, proc->frame_rx,proc->tti_rx,proc->tti_tx,fp->slots_per_frame); // dump VCD output for first RU in list diff --git a/openair1/PHY/INIT/nr_parms.c b/openair1/PHY/INIT/nr_parms.c index 35bc28d9c1..02c366eb03 100644 --- a/openair1/PHY/INIT/nr_parms.c +++ b/openair1/PHY/INIT/nr_parms.c @@ -212,12 +212,12 @@ uint32_t get_samples_per_slot(int slot, NR_DL_FRAME_PARMS* fp) uint32_t get_slot_from_timestamp(openair0_timestamp timestamp_rx, NR_DL_FRAME_PARMS* fp) { uint32_t slot_idx = 0; - int samples_till_the_slot = 0; + int samples_till_the_slot = fp->get_samples_per_slot(slot_idx,fp)-1; timestamp_rx = timestamp_rx%fp->samples_per_frame; while (timestamp_rx > samples_till_the_slot) { - samples_till_the_slot += fp->get_samples_per_slot(slot_idx,fp); slot_idx++; + samples_till_the_slot += fp->get_samples_per_slot(slot_idx,fp); } return slot_idx; } diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c index 87c1dee1e5..57a7fe7c4d 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c @@ -69,7 +69,7 @@ void clear_nr_nfapi_information(gNB_MAC_INST * gNB, nfapi_nr_dl_tti_request_t *DL_req = &gNB->DL_req[0]; nfapi_nr_dl_tti_pdcch_pdu_rel15_t ***pdcch = (nfapi_nr_dl_tti_pdcch_pdu_rel15_t ***)gNB->pdcch_pdu_idx[CC_idP]; nfapi_nr_ul_tti_request_t *future_ul_tti_req = - &gNB->UL_tti_req_ahead[CC_idP][(slotP + num_slots - 1) % num_slots]; + &gNB->UL_tti_req_ahead[CC_idP][(slotP+6)]; // + num_slots - 1) % num_slots]; nfapi_nr_ul_dci_request_t *UL_dci_req = &gNB->UL_dci_req[0]; nfapi_nr_tx_data_request_t *TX_req = &gNB->TX_req[0]; @@ -87,7 +87,7 @@ void clear_nr_nfapi_information(gNB_MAC_INST * gNB, UL_dci_req[CC_idP].numPdus = 0; /* advance last round's future UL_tti_req to be ahead of current frame/slot */ - future_ul_tti_req->SFN = (slotP == 0 ? frameP : frameP + 1) % 1024; + future_ul_tti_req->SFN = ((slotP+6SFN, (slotP + num_slots - 1) % num_slots); /* future_ul_tti_req->Slot is fixed! */ future_ul_tti_req->n_pdus = 0; diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp index 365957cad5..2941b0a5aa 100644 --- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp +++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp @@ -203,8 +203,8 @@ static int sync_to_gps(openair0_device *device) { //Set to GPS time uhd::time_spec_t gps_time = uhd::time_spec_t(time_t(s->usrp->get_mboard_sensor("gps_time", mboard).to_int())); - //s->usrp->set_time_next_pps(gps_time+1.0, mboard); - s->usrp->set_time_next_pps(uhd::time_spec_t(0.0)); + s->usrp->set_time_next_pps(gps_time+1.0, mboard); + //s->usrp->set_time_next_pps(uhd::time_spec_t(0.0)); //Wait for it to apply //The wait is 2 seconds because N-Series has a known issue where //the time at the last PPS does not properly update at the PPS edge @@ -215,10 +215,10 @@ static int sync_to_gps(openair0_device *device) { uhd::time_spec_t time_last_pps = s->usrp->get_time_last_pps(mboard); std::cout << "USRP time: " << (boost::format("%0.9f") % time_last_pps.get_real_secs()) << std::endl; std::cout << "GPSDO time: " << (boost::format("%0.9f") % gps_time.get_real_secs()) << std::endl; - //if (gps_time.get_real_secs() == time_last_pps.get_real_secs()) - // std::cout << std::endl << "SUCCESS: USRP time synchronized to GPS time" << std::endl << std::endl; - //else - // std::cerr << std::endl << "ERROR: Failed to synchronize USRP time to GPS time" << std::endl << std::endl; + if (gps_time.get_real_secs() == time_last_pps.get_real_secs()) + std::cout << std::endl << "SUCCESS: USRP time synchronized to GPS time" << std::endl << std::endl; + else + std::cerr << std::endl << "ERROR: Failed to synchronize USRP time to GPS time" << std::endl << std::endl; } if (num_gps_locked == num_mboards and num_mboards > 1) { @@ -293,15 +293,11 @@ static int trx_usrp_start(openair0_device *device) { //s->first_rx = 1; s->rx_timestamp = 0; - s->usrp->set_time_next_pps(uhd::time_spec_t(0.0)); - // wait for the pps to change uhd::time_spec_t time_last_pps = s->usrp->get_time_last_pps(); - while (time_last_pps == s->usrp->get_time_last_pps()) { - boost::this_thread::sleep(boost::posix_time::milliseconds(1)); - } + LOG_I(HW,"last pps at %f, starting streaming at %f\n",time_last_pps.get_real_secs(),time_last_pps.get_real_secs()+1.0); uhd::stream_cmd_t cmd(uhd::stream_cmd_t::STREAM_MODE_START_CONTINUOUS); - cmd.time_spec = uhd::time_spec_t(1.0); + cmd.time_spec = uhd::time_spec_t(time_last_pps+1.0); cmd.stream_now = false; // start at constant delay s->rx_stream->issue_stream_cmd(cmd); @@ -1103,12 +1099,16 @@ extern "C" { LOG_I(HW,"USRP fails to sync with GPS. Exiting.\n"); exit(EXIT_FAILURE); } - } else if (s->usrp->get_clock_source(0) == "external") { - if (check_ref_locked(s,0)) { - LOG_I(HW,"USRP locked to external reference!\n"); - } else { - LOG_I(HW,"Failed to lock to external reference. Exiting.\n"); - exit(EXIT_FAILURE); + } else { + s->usrp->set_time_next_pps(uhd::time_spec_t(0.0)); + + if (s->usrp->get_clock_source(0) == "external") { + if (check_ref_locked(s,0)) { + LOG_I(HW,"USRP locked to external reference!\n"); + } else { + LOG_I(HW,"Failed to lock to external reference. Exiting.\n"); + exit(EXIT_FAILURE); + } } } @@ -1322,7 +1322,7 @@ extern "C" { LOG_I(HW,"Actual master clock: %fMHz...\n",s->usrp->get_master_clock_rate()/1e6); LOG_I(HW,"Actual clock source %s...\n",s->usrp->get_clock_source(0).c_str()); LOG_I(HW,"Actual time source %s...\n",s->usrp->get_time_source(0).c_str()); - sleep(1); + // create tx & rx streamer uhd::stream_args_t stream_args_rx("sc16", "sc16"); int samples=openair0_cfg[0].sample_rate; From bcdeac0a2327d519d13be12487261a4e5d260830 Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Thu, 31 Mar 2022 11:58:17 +0200 Subject: [PATCH 070/135] Correct include directories for oai_usrpdevif --- cmake_targets/CMakeLists.txt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 5cd71339fb..c6be573e96 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -50,7 +50,6 @@ include_directories("/usr/local/include/") #use native cmake method as this package is not in pkg-config if (${RF_BOARD} STREQUAL "OAI_USRP") find_package(Boost REQUIRED) - include_directories(${LIBBOOST_INCLUDE_DIR}) elseif (${RF_BOARD} STREQUAL "OAI_IRIS") include_directories("${OPENAIR_TARGETS}/ARCH/IRIS/USERSPACE/LIB/") @@ -837,11 +836,14 @@ set (SHLIB_LOADER_SOURCES # include RF devices / transport protocols library modules ###################################################################### -include_directories("${OPENAIR_TARGETS}/ARCH/USRP/USERSPACE/LIB/") set(HWLIB_USRP_SOURCE ${OPENAIR_TARGETS}/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp ) add_library(oai_usrpdevif MODULE ${HWLIB_USRP_SOURCE} ) +target_include_directories(oai_usrpdevif PRIVATE + "${OPENAIR_TARGETS}/ARCH/USRP/USERSPACE/LIB/" + ${Boost_INCLUDE_DIR} +) target_link_libraries(oai_usrpdevif uhd) include_directories("${OPENAIR_TARGETS}/ARCH/BLADERF/USERSPACE/LIB/") From ca638ef710a725293a3fb871d3cf413cf333b306 Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Thu, 7 Apr 2022 09:30:56 +0200 Subject: [PATCH 071/135] adding config files for PRS FR1 --- ...gnb.sa.band78.fr1.106PRB.prs.usrpn310.conf | 319 ++++++++++++++++++ ...gnb.sa.band78.fr1.273PRB.prs.usrpn310.conf | 319 ++++++++++++++++++ 2 files changed, 638 insertions(+) create mode 100644 targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.prs.usrpn310.conf create mode 100644 targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.prs.usrpn310.conf diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.prs.usrpn310.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.prs.usrpn310.conf new file mode 100644 index 0000000000..5be9fb8a87 --- /dev/null +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.prs.usrpn310.conf @@ -0,0 +1,319 @@ +Active_gNBs = ( "gNB-OAI"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +gNBs = +( + { + ////////// Identification parameters: + gNB_ID = 0xe00; + gNB_name = "gNB-OAI"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = 1; + plmn_list = ({ + mcc = 208; + mnc = 99; + mnc_length = 2; + snssaiList = ( + { + sst = 1; + sd = 0x1; // 0 false, else true + }, + { + sst = 1; + sd = 0x112233; // 0 false, else true + } + ); + + }); + + nr_cellid = 12345678L; + + ////////// Physical parameters: + + ssb_SubcarrierOffset = 0; + pdsch_AntennaPorts = 1; + pusch_AntennaPorts = 1; + 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; + + #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, + + 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 : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + + ////////// AMF parameters: + amf_ip_address = ( { ipv4 = "192.168.70.132"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + + NETWORK_INTERFACES : + { + GNB_INTERFACE_NAME_FOR_NG_AMF = "demo-oai"; + GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.70.129/24"; + GNB_INTERFACE_NAME_FOR_NGU = "demo-oai"; + GNB_IPV4_ADDRESS_FOR_NGU = "192.168.70.129/24"; + GNB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + } +); + +MACRLCs = ( +{ + num_cc = 1; + tr_s_preference = "local_L1"; + tr_n_preference = "local_RRC"; + pusch_TargetSNRx10 = 150; + pucch_TargetSNRx10 = 200; + ulsch_max_frame_inactivity = 1; +} +); + +prs_config = ( +{ + PRSResourceSetPeriod0 = 40; + PRSResourceSetPeriod1 = 0; + SymbolStart = 7; + NumPRSSymbols = 4; + NumRB = 106; + RBOffset = 0; + CombSize = 4; + REOffset = 0; + PRSResourceOffset = 0; + PRSResourceRepetition = 1; + PRSResourceTimeGap = 1; + NPRS_ID = 0; +} +); + +L1s = ( +{ + num_cc = 1; + tr_n_preference = "local_mac"; + pusch_proc_threads = 8; + prach_dtx_threshold = 120; + pucch0_dtx_threshold = 150; + ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0 +} +); + +RUs = ( +{ + local_rf = "yes" + nb_tx = 1 + nb_rx = 1 + att_tx = 0 + att_rx = 0; + bands = [78]; + max_pdschReferenceSignalPower = -27; + max_rxgain = 114; + sf_extension = 0; + eNB_instances = [0]; + #beamforming 1x4 matrix: + bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000]; + #clock_src = "internal"; + sdr_addrs = "addr=192.168.10.2,second_addr=192.168.20.2,clock_source=internal,time_source=internal" +} +); + +THREAD_STRUCT = ( +{ + #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT" + parallel_config = "PARALLEL_SINGLE_THREAD"; + #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE" + worker_config = "WORKER_ENABLE"; +} +); + +rfsimulator : +{ + serveraddr = "server"; + serverport = "4043"; + options = (); #("saviq"); or/and "chanmod" + modelname = "AWGN"; + IQfile = "/tmp/rfsimulator.iqs"; +}; + +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"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + ngap_log_level ="debug"; + ngap_log_verbosity ="medium"; +}; + diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.prs.usrpn310.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.prs.usrpn310.conf new file mode 100644 index 0000000000..df31fc42c6 --- /dev/null +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.prs.usrpn310.conf @@ -0,0 +1,319 @@ +Active_gNBs = ( "gNB-OAI"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +gNBs = +( + { + ////////// Identification parameters: + gNB_ID = 0xe00; + gNB_name = "gNB-OAI"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = 1; + plmn_list = ({ + mcc = 208; + mnc = 99; + mnc_length = 2; + snssaiList = ( + { + sst = 1; + sd = 0x1; // 0 false, else true + }, + { + sst = 1; + sd = 0x112233; // 0 false, else true + } + ); + + }); + + nr_cellid = 12345678L; + + ////////// Physical parameters: + + ssb_SubcarrierOffset = 0; + pdsch_AntennaPorts = 1; + pusch_AntennaPorts = 1; + 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 = 273; + #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; + + #uplinkConfigCommon + #frequencyInfoUL + ul_frequencyBand = 78; + #scs-SpecificCarrierList + ul_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + ul_subcarrierSpacing = 1; + ul_carrierBandwidth = 273; + 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, + + 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 : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + + ////////// AMF parameters: + amf_ip_address = ( { ipv4 = "192.168.70.132"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + + NETWORK_INTERFACES : + { + GNB_INTERFACE_NAME_FOR_NG_AMF = "demo-oai"; + GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.70.129/24"; + GNB_INTERFACE_NAME_FOR_NGU = "demo-oai"; + GNB_IPV4_ADDRESS_FOR_NGU = "192.168.70.129/24"; + GNB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + } +); + +MACRLCs = ( +{ + num_cc = 1; + tr_s_preference = "local_L1"; + tr_n_preference = "local_RRC"; + pusch_TargetSNRx10 = 150; + pucch_TargetSNRx10 = 200; + ulsch_max_frame_inactivity = 1; +} +); + +prs_config = ( +{ + PRSResourceSetPeriod0 = 40; + PRSResourceSetPeriod1 = 0; + SymbolStart = 7; + NumPRSSymbols = 4; + NumRB = 272; + RBOffset = 0; + CombSize = 4; + REOffset = 0; + PRSResourceOffset = 0; + PRSResourceRepetition = 1; + PRSResourceTimeGap = 1; + NPRS_ID = 0; +} +); + +L1s = ( +{ + num_cc = 1; + tr_n_preference = "local_mac"; + pusch_proc_threads = 8; + prach_dtx_threshold = 120; + pucch0_dtx_threshold = 150; + ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0 +} +); + +RUs = ( +{ + local_rf = "yes" + nb_tx = 1 + nb_rx = 1 + att_tx = 0 + att_rx = 0; + bands = [78]; + max_pdschReferenceSignalPower = -27; + max_rxgain = 114; + sf_extension = 0; + eNB_instances = [0]; + #beamforming 1x4 matrix: + bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000]; + #clock_src = "internal"; + sdr_addrs = "addr=192.168.10.2,second_addr=192.168.20.2,clock_source=external,time_source=external" +} +); + +THREAD_STRUCT = ( +{ + #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT" + parallel_config = "PARALLEL_SINGLE_THREAD"; + #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE" + worker_config = "WORKER_ENABLE"; +} +); + +rfsimulator : +{ + serveraddr = "server"; + serverport = "4043"; + options = (); #("saviq"); or/and "chanmod" + modelname = "AWGN"; + IQfile = "/tmp/rfsimulator.iqs"; +}; + +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"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + ngap_log_level ="debug"; + ngap_log_verbosity ="medium"; +}; + From dd6abd66dd61bdffc840812cb6c68cd6187071ae Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Thu, 7 Apr 2022 09:37:23 +0200 Subject: [PATCH 072/135] adding FR2 PRS config file --- ...nb.sa.band257.fr2.128PRB.prs.usrpx310.conf | 319 ++++++++++++++++++ ...gnb.sa.band257.fr2.66PRB.prs.usrpx310.conf | 317 +++++++++++++++++ 2 files changed, 636 insertions(+) create mode 100644 targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band257.fr2.128PRB.prs.usrpx310.conf create mode 100644 targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band257.fr2.66PRB.prs.usrpx310.conf diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band257.fr2.128PRB.prs.usrpx310.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band257.fr2.128PRB.prs.usrpx310.conf new file mode 100644 index 0000000000..7bb65336d6 --- /dev/null +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band257.fr2.128PRB.prs.usrpx310.conf @@ -0,0 +1,319 @@ +Active_gNBs = ( "gNB-OAI"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +gNBs = +( + { + ////////// Identification parameters: + gNB_ID = 0xe00; + gNB_name = "gNB-OAI"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = 1; + plmn_list = ({ + mcc = 208; + mnc = 99; + mnc_length = 2; + snssaiList = ( + { + sst = 1; + sd = 0x1; // 0 false, else true + }, + { + sst = 1; + sd = 0x112233; // 0 false, else true + } + ); + + }); + + nr_cellid = 12345678L; + + ////////// Physical parameters: + + ssb_SubcarrierOffset = 0; + pdsch_AntennaPorts = 1; + pusch_AntennaPorts = 1; + sib1_tda = 0; + + pdcch_ConfigSIB1 = ( + { + controlResourceSetZero = 12; + searchSpaceZero = 0; + } + ); + + servingCellConfigCommon = ( + { + #spCellConfigCommon + + physCellId = 0; + +# downlinkConfigCommon + #frequencyInfoDL + # this is pointA + 23 PRBs@120kHz SCS (same as initial BWP) + absoluteFrequencySSB = 2078315; + dl_frequencyBand = 257; + # this is 27.900 GHz + dl_absoluteFrequencyPointA = 2077499; + #scs-SpecificCarrierList + dl_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + dl_subcarrierSpacing = 3; + dl_carrierBandwidth = 128; + #initialDownlinkBWP + #genericParameters + # this is RBstart=27,L=48 (275*(L-1))+RBstart + initialDLBWPlocationAndBandwidth = 13475; # 6366 12925 12956 28875 12952 +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + initialDLBWPsubcarrierSpacing = 3; + #pdcch-ConfigCommon + initialDLBWPcontrolResourceSetZero = 12; + initialDLBWPsearchSpaceZero = 0; + + #uplinkConfigCommon + #frequencyInfoUL + ul_frequencyBand = 257; + #scs-SpecificCarrierList + ul_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + ul_subcarrierSpacing = 3; + ul_carrierBandwidth = 128; + pMax = 20; + #initialUplinkBWP + #genericParameters + initialULBWPlocationAndBandwidth = 13475; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + initialULBWPsubcarrierSpacing = 3; + #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 = 15; +#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 = 3, +# restrictedSetConfig +# 0=unrestricted, 1=restricted type A, 2=restricted type B + restrictedSetConfig = 0, + + 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 = 3; + ssb_PositionsInBurst_Bitmap = 0x0001000100010001L; + +# 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 = 3; + + + #tdd-UL-DL-ConfigurationCommon +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + referenceSubcarrierSpacing = 3; + # pattern1 + # dl_UL_TransmissionPeriodicity + # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10 + dl_UL_TransmissionPeriodicity = 3; + nrofDownlinkSlots = 7; + nrofDownlinkSymbols = 6; + nrofUplinkSlots = 2; + nrofUplinkSymbols = 4; + + ssPBCH_BlockPower = -25; + } + + ); + + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + + ////////// AMF parameters: + amf_ip_address = ( { ipv4 = "192.168.70.132"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + + NETWORK_INTERFACES : + { + GNB_INTERFACE_NAME_FOR_NG_AMF = "demo-oai"; + GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.70.129/24"; + GNB_INTERFACE_NAME_FOR_NGU = "demo-oai"; + GNB_IPV4_ADDRESS_FOR_NGU = "192.168.70.129/24"; + GNB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + } +); + +MACRLCs = ( +{ + num_cc = 1; + tr_s_preference = "local_L1"; + tr_n_preference = "local_RRC"; + pusch_TargetSNRx10 = 150; + pucch_TargetSNRx10 = 200; + ulsch_max_frame_inactivity = 1; +} +); + +prs_config = ( +{ + PRSResourceSetPeriod0 = 40; + PRSResourceSetPeriod1 = 0; + SymbolStart = 7; + NumPRSSymbols = 7; + NumRB = 64; + RBOffset = 0; + CombSize = 4; + REOffset = 0; + PRSResourceOffset = 0; + PRSResourceRepetition = 1; + PRSResourceTimeGap = 1; + NPRS_ID = 0; +} +); + +L1s = ( +{ + num_cc = 1; + tr_n_preference = "local_mac"; + pusch_proc_threads = 8; + prach_dtx_threshold = 120; + pucch0_dtx_threshold = 150; + ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0 +} +); + +RUs = ( +{ + local_rf = "yes" + nb_tx = 1 + nb_rx = 1 + att_tx = 0 + att_rx = 0; + bands = [257]; + max_pdschReferenceSignalPower = -27; + max_rxgain = 114; + sf_extension = 0; + eNB_instances = [0]; + ##beamforming 1x2 matrix: 1 layer x 2 antennas + bf_weights = [0x00007fff, 0x0000]; + #clock_src = "internal"; + sdr_addrs = "addr=192.168.50.2,second_addr=192.168.60.2,clock_source=internal,time_source=internal" + if_freq = 50000000L; +} +); + +THREAD_STRUCT = ( +{ + #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT" + parallel_config = "PARALLEL_RU_L1_TRX_SPLIT"; + #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE" + worker_config = "WORKER_ENABLE"; +} +); + +rfsimulator : +{ + serveraddr = "server"; + serverport = "4043"; + options = ("saviq"); #or/and "chanmod" + modelname = "AWGN"; + IQfile = "/tmp/rfsimulator.iqs"; +}; + +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"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + ngap_log_level ="debug"; + ngap_log_verbosity ="medium"; +}; + diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band257.fr2.66PRB.prs.usrpx310.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band257.fr2.66PRB.prs.usrpx310.conf new file mode 100644 index 0000000000..5398599b79 --- /dev/null +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band257.fr2.66PRB.prs.usrpx310.conf @@ -0,0 +1,317 @@ +Active_gNBs = ( "gNB-OAI"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +gNBs = +( + { + ////////// Identification parameters: + gNB_ID = 0xe00; + gNB_name = "gNB-OAI"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = 1; + plmn_list = ({ + mcc = 208; + mnc = 99; + mnc_length = 2; + snssaiList = ( + { + sst = 1; + sd = 0x1; // 0 false, else true + }, + { + sst = 1; + sd = 0x112233; // 0 false, else true + } + ); + + }); + + nr_cellid = 12345678L; + + ////////// Physical parameters: + + ssb_SubcarrierOffset = 0; + pdsch_AntennaPorts = 1; + pusch_AntennaPorts = 1; + sib1_tda = 0; + + pdcch_ConfigSIB1 = ( + { + controlResourceSetZero = 12; + searchSpaceZero = 0; + } + ); + + servingCellConfigCommon = ( + { + #spCellConfigCommon + + physCellId = 0; + +# downlinkConfigCommon + #frequencyInfoDL + # this is pointA + 23 PRBs@120kHz SCS (same as initial BWP) + absoluteFrequencySSB = 2078315; + dl_frequencyBand = 257; + # this is 27.900 GHz + dl_absoluteFrequencyPointA = 2077499; + #scs-SpecificCarrierList + dl_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + dl_subcarrierSpacing = 3; + dl_carrierBandwidth = 66; + #initialDownlinkBWP + #genericParameters + # this is RBstart=27,L=48 (275*(L-1))+RBstart + initialDLBWPlocationAndBandwidth = 13475; # 6366 12925 12956 28875 12952 +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + initialDLBWPsubcarrierSpacing = 3; + #pdcch-ConfigCommon + initialDLBWPcontrolResourceSetZero = 12; + initialDLBWPsearchSpaceZero = 0; + + #uplinkConfigCommon + #frequencyInfoUL + ul_frequencyBand = 257; + #scs-SpecificCarrierList + ul_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + ul_subcarrierSpacing = 3; + ul_carrierBandwidth = 66; + pMax = 20; + #initialUplinkBWP + #genericParameters + initialULBWPlocationAndBandwidth = 13475; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + initialULBWPsubcarrierSpacing = 3; + #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 = 15; +#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 = 3, +# restrictedSetConfig +# 0=unrestricted, 1=restricted type A, 2=restricted type B + restrictedSetConfig = 0, + + 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 = 3; + ssb_PositionsInBurst_Bitmap = 0x0001000100010001L; + +# 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 = 3; + + + #tdd-UL-DL-ConfigurationCommon +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + referenceSubcarrierSpacing = 3; + # pattern1 + # dl_UL_TransmissionPeriodicity + # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10 + dl_UL_TransmissionPeriodicity = 3; + nrofDownlinkSlots = 7; + nrofDownlinkSymbols = 6; + nrofUplinkSlots = 2; + nrofUplinkSymbols = 4; + + ssPBCH_BlockPower = -25; + } + + ); + + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + + ////////// AMF parameters: + amf_ip_address = ( { ipv4 = "192.168.70.132"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + + NETWORK_INTERFACES : + { + GNB_INTERFACE_NAME_FOR_NG_AMF = "demo-oai"; + GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.70.129/24"; + GNB_INTERFACE_NAME_FOR_NGU = "demo-oai"; + GNB_IPV4_ADDRESS_FOR_NGU = "192.168.70.129/24"; + GNB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + } +); + +MACRLCs = ( +{ + num_cc = 1; + tr_s_preference = "local_L1"; + tr_n_preference = "local_RRC"; + pusch_TargetSNRx10 = 150; + pucch_TargetSNRx10 = 200; + ulsch_max_frame_inactivity = 1; +} +); + +prs_config = ( +{ + PRSResourceSetPeriod0 = 40; + PRSResourceSetPeriod1 = 0; + SymbolStart = 7; + NumPRSSymbols = 4; + NumRB = 56; + RBOffset = 0; + CombSize = 4; + REOffset = 0; + PRSResourceOffset = 0; + PRSResourceRepetition = 1; + PRSResourceTimeGap = 1; + NPRS_ID = 0; +} +); + +L1s = ( +{ + num_cc = 1; + tr_n_preference = "local_mac"; + pusch_proc_threads = 8; + prach_dtx_threshold = 120; + pucch0_dtx_threshold = 150; + ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0 +} +); + +RUs = ( +{ + local_rf = "yes" + nb_tx = 1 + nb_rx = 1 + att_tx = 0 + att_rx = 0; + bands = [257]; + max_pdschReferenceSignalPower = -27; + max_rxgain = 114; + sf_extension = 0; + eNB_instances = [0]; + #beamforming 1x4 matrix: + bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000]; + clock_src = "internal"; +} +); + +THREAD_STRUCT = ( +{ + #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT" + parallel_config = "PARALLEL_SINGLE_THREAD"; + #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE" + worker_config = "WORKER_ENABLE"; +} +); + +rfsimulator : +{ + serveraddr = "server"; + serverport = "4043"; + options = (); #("saviq"); or/and "chanmod" + modelname = "AWGN"; + IQfile = "/tmp/rfsimulator.iqs"; +}; + +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"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + ngap_log_level ="debug"; + ngap_log_verbosity ="medium"; +}; + From 272dcd40b29ebff4e01bf03a7cee7a2e5dadcb5b Mon Sep 17 00:00:00 2001 From: Sagar Parsawar Date: Thu, 7 Apr 2022 10:51:59 +0200 Subject: [PATCH 073/135] updated FR1/FR2 gNB and UE configs for PRS --- ...nb.sa.band257.fr2.128PRB.prs.usrpx310.conf | 2 +- ...gnb.sa.band257.fr2.66PRB.prs.usrpx310.conf | 4 +- ...gnb.sa.band78.fr1.106PRB.prs.usrpn310.conf | 2 +- ...gnb.sa.band78.fr1.273PRB.prs.usrpn310.conf | 2 +- .../CONF/ue.nr.prs.fr1.106prb.conf | 41 +++++++++++++++++++ .../CONF/ue.nr.prs.fr1.273prb.conf | 41 +++++++++++++++++++ .../CONF/ue.nr.prs.fr2.128prb.conf | 41 +++++++++++++++++++ .../CONF/ue.nr.prs.fr2.66prb.conf | 41 +++++++++++++++++++ 8 files changed, 169 insertions(+), 5 deletions(-) create mode 100644 targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr1.106prb.conf create mode 100644 targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr1.273prb.conf create mode 100644 targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr2.128prb.conf create mode 100644 targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr2.66prb.conf diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band257.fr2.128PRB.prs.usrpx310.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band257.fr2.128PRB.prs.usrpx310.conf index 7bb65336d6..1aa33fb52c 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band257.fr2.128PRB.prs.usrpx310.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band257.fr2.128PRB.prs.usrpx310.conf @@ -220,7 +220,7 @@ prs_config = ( PRSResourceSetPeriod1 = 0; SymbolStart = 7; NumPRSSymbols = 7; - NumRB = 64; + NumRB = 128; RBOffset = 0; CombSize = 4; REOffset = 0; diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band257.fr2.66PRB.prs.usrpx310.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band257.fr2.66PRB.prs.usrpx310.conf index 5398599b79..a5deb3a3cd 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band257.fr2.66PRB.prs.usrpx310.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band257.fr2.66PRB.prs.usrpx310.conf @@ -219,8 +219,8 @@ prs_config = ( PRSResourceSetPeriod0 = 40; PRSResourceSetPeriod1 = 0; SymbolStart = 7; - NumPRSSymbols = 4; - NumRB = 56; + NumPRSSymbols = 7; + NumRB = 64; RBOffset = 0; CombSize = 4; REOffset = 0; diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.prs.usrpn310.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.prs.usrpn310.conf index 5be9fb8a87..06e42223c1 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.prs.usrpn310.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.prs.usrpn310.conf @@ -220,7 +220,7 @@ prs_config = ( PRSResourceSetPeriod0 = 40; PRSResourceSetPeriod1 = 0; SymbolStart = 7; - NumPRSSymbols = 4; + NumPRSSymbols = 7; NumRB = 106; RBOffset = 0; CombSize = 4; diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.prs.usrpn310.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.prs.usrpn310.conf index df31fc42c6..071ab258d2 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.prs.usrpn310.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.prs.usrpn310.conf @@ -220,7 +220,7 @@ prs_config = ( PRSResourceSetPeriod0 = 40; PRSResourceSetPeriod1 = 0; SymbolStart = 7; - NumPRSSymbols = 4; + NumPRSSymbols = 7; NumRB = 272; RBOffset = 0; CombSize = 4; diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr1.106prb.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr1.106prb.conf new file mode 100644 index 0000000000..38714e546e --- /dev/null +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr1.106prb.conf @@ -0,0 +1,41 @@ +PRSs = +( + { + Active_gNBs = 1; + prs_config0 = ( + { + gNB_id = 0; + PRSResourceSetPeriod0 = 40; + PRSResourceSetPeriod1 = 0; + SymbolStart = 7; + NumPRSSymbols = 7; + NumRB = 106; + RBOffset = 0; + CombSize = 4; + REOffset = 0; + PRSResourceOffset = 0; + PRSResourceRepetition = 1; + PRSResourceTimeGap = 1; + NPRS_ID = 0; + } + ); + + prs_config1 = ( + { + gNB_id = 1; + PRSResourceSetPeriod0 = 40; + PRSResourceSetPeriod1 = 0; + SymbolStart = 7; + NumPRSSymbols = 4; + NumRB = 106; + RBOffset = 0; + CombSize = 4; + REOffset = 1; + PRSResourceOffset = 0; + PRSResourceRepetition = 1; + PRSResourceTimeGap = 1; + NPRS_ID = 0; + } + ); + } +); diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr1.273prb.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr1.273prb.conf new file mode 100644 index 0000000000..f2c3902d5d --- /dev/null +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr1.273prb.conf @@ -0,0 +1,41 @@ +PRSs = +( + { + Active_gNBs = 1; + prs_config0 = ( + { + gNB_id = 0; + PRSResourceSetPeriod0 = 40; + PRSResourceSetPeriod1 = 0; + SymbolStart = 7; + NumPRSSymbols = 7; + NumRB = 272; + RBOffset = 0; + CombSize = 4; + REOffset = 0; + PRSResourceOffset = 0; + PRSResourceRepetition = 1; + PRSResourceTimeGap = 1; + NPRS_ID = 0; + } + ); + + prs_config1 = ( + { + gNB_id = 1; + PRSResourceSetPeriod0 = 40; + PRSResourceSetPeriod1 = 0; + SymbolStart = 7; + NumPRSSymbols = 4; + NumRB = 106; + RBOffset = 0; + CombSize = 4; + REOffset = 1; + PRSResourceOffset = 0; + PRSResourceRepetition = 1; + PRSResourceTimeGap = 1; + NPRS_ID = 0; + } + ); + } +); diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr2.128prb.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr2.128prb.conf new file mode 100644 index 0000000000..27f30359b6 --- /dev/null +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr2.128prb.conf @@ -0,0 +1,41 @@ +PRSs = +( + { + Active_gNBs = 1; + prs_config0 = ( + { + gNB_id = 0; + PRSResourceSetPeriod0 = 40; + PRSResourceSetPeriod1 = 0; + SymbolStart = 7; + NumPRSSymbols = 7; + NumRB = 128; + RBOffset = 0; + CombSize = 4; + REOffset = 0; + PRSResourceOffset = 0; + PRSResourceRepetition = 1; + PRSResourceTimeGap = 1; + NPRS_ID = 0; + } + ); + + prs_config1 = ( + { + gNB_id = 1; + PRSResourceSetPeriod0 = 40; + PRSResourceSetPeriod1 = 0; + SymbolStart = 7; + NumPRSSymbols = 4; + NumRB = 106; + RBOffset = 0; + CombSize = 4; + REOffset = 1; + PRSResourceOffset = 0; + PRSResourceRepetition = 1; + PRSResourceTimeGap = 1; + NPRS_ID = 0; + } + ); + } +); diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr2.66prb.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr2.66prb.conf new file mode 100644 index 0000000000..a1c129348a --- /dev/null +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr2.66prb.conf @@ -0,0 +1,41 @@ +PRSs = +( + { + Active_gNBs = 1; + prs_config0 = ( + { + gNB_id = 0; + PRSResourceSetPeriod0 = 40; + PRSResourceSetPeriod1 = 0; + SymbolStart = 7; + NumPRSSymbols = 7; + NumRB = 64; + RBOffset = 0; + CombSize = 4; + REOffset = 0; + PRSResourceOffset = 0; + PRSResourceRepetition = 1; + PRSResourceTimeGap = 1; + NPRS_ID = 0; + } + ); + + prs_config1 = ( + { + gNB_id = 1; + PRSResourceSetPeriod0 = 40; + PRSResourceSetPeriod1 = 0; + SymbolStart = 7; + NumPRSSymbols = 4; + NumRB = 106; + RBOffset = 0; + CombSize = 4; + REOffset = 1; + PRSResourceOffset = 0; + PRSResourceRepetition = 1; + PRSResourceTimeGap = 1; + NPRS_ID = 0; + } + ); + } +); From 7b34a49de0ae65c7d847a8a11e5774e61c7981b4 Mon Sep 17 00:00:00 2001 From: rakesh mundlamuri Date: Thu, 7 Apr 2022 11:22:28 +0200 Subject: [PATCH 074/135] centered fr1 config to 3.75 GHz --- ...gnb.sa.band78.fr1.106PRB.prs.usrpn310.conf | 4 +- ...gnb.sa.band78.fr1.217PRB.prs.usrpn310.conf | 319 ++++++++++++++++++ ...gnb.sa.band78.fr1.273PRB.prs.usrpn310.conf | 4 +- 3 files changed, 323 insertions(+), 4 deletions(-) create mode 100644 targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.217PRB.prs.usrpn310.conf diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.prs.usrpn310.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.prs.usrpn310.conf index 06e42223c1..228b718bc6 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.prs.usrpn310.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.prs.usrpn310.conf @@ -54,10 +54,10 @@ gNBs = # downlinkConfigCommon #frequencyInfoDL # this is 3600 MHz + 43 PRBs@30kHz SCS (same as initial BWP) - absoluteFrequencySSB = 641280; + absoluteFrequencySSB = 650000; dl_frequencyBand = 78; # this is 3600 MHz - dl_absoluteFrequencyPointA = 640008; + dl_absoluteFrequencyPointA = 648728; #scs-SpecificCarrierList dl_offstToCarrier = 0; # subcarrierSpacing diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.217PRB.prs.usrpn310.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.217PRB.prs.usrpn310.conf new file mode 100644 index 0000000000..62c2df4ecd --- /dev/null +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.217PRB.prs.usrpn310.conf @@ -0,0 +1,319 @@ +Active_gNBs = ( "gNB-OAI"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +gNBs = +( + { + ////////// Identification parameters: + gNB_ID = 0xe00; + gNB_name = "gNB-OAI"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = 1; + plmn_list = ({ + mcc = 208; + mnc = 99; + mnc_length = 2; + snssaiList = ( + { + sst = 1; + sd = 0x1; // 0 false, else true + }, + { + sst = 1; + sd = 0x112233; // 0 false, else true + } + ); + + }); + + nr_cellid = 12345678L; + + ////////// Physical parameters: + + ssb_SubcarrierOffset = 0; + pdsch_AntennaPorts = 1; + pusch_AntennaPorts = 1; + 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 = 650000; + dl_frequencyBand = 78; + # this is 3600 MHz + dl_absoluteFrequencyPointA = 647408; + #scs-SpecificCarrierList + dl_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + dl_subcarrierSpacing = 1; + dl_carrierBandwidth = 217; + #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; + + #uplinkConfigCommon + #frequencyInfoUL + ul_frequencyBand = 78; + #scs-SpecificCarrierList + ul_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + ul_subcarrierSpacing = 1; + ul_carrierBandwidth = 217; + 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, + + 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 : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + + ////////// AMF parameters: + amf_ip_address = ( { ipv4 = "192.168.70.132"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + + NETWORK_INTERFACES : + { + GNB_INTERFACE_NAME_FOR_NG_AMF = "demo-oai"; + GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.70.129/24"; + GNB_INTERFACE_NAME_FOR_NGU = "demo-oai"; + GNB_IPV4_ADDRESS_FOR_NGU = "192.168.70.129/24"; + GNB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + } +); + +MACRLCs = ( +{ + num_cc = 1; + tr_s_preference = "local_L1"; + tr_n_preference = "local_RRC"; + pusch_TargetSNRx10 = 150; + pucch_TargetSNRx10 = 200; + ulsch_max_frame_inactivity = 1; +} +); + +prs_config = ( +{ + PRSResourceSetPeriod0 = 40; + PRSResourceSetPeriod1 = 0; + SymbolStart = 7; + NumPRSSymbols = 4; + NumRB = 217; + RBOffset = 0; + CombSize = 4; + REOffset = 0; + PRSResourceOffset = 0; + PRSResourceRepetition = 1; + PRSResourceTimeGap = 1; + NPRS_ID = 0; +} +); + +L1s = ( +{ + num_cc = 1; + tr_n_preference = "local_mac"; + pusch_proc_threads = 8; + prach_dtx_threshold = 120; + pucch0_dtx_threshold = 150; + ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0 +} +); + +RUs = ( +{ + local_rf = "yes" + nb_tx = 1 + nb_rx = 1 + att_tx = 0 + att_rx = 0; + bands = [78]; + max_pdschReferenceSignalPower = -27; + max_rxgain = 114; + sf_extension = 0; + eNB_instances = [0]; + #beamforming 1x4 matrix: + bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000]; + #clock_src = "internal"; + sdr_addrs = "addr=192.168.10.2,second_addr=192.168.20.2,clock_source=external,time_source=external" +} +); + +THREAD_STRUCT = ( +{ + #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT" + parallel_config = "PARALLEL_SINGLE_THREAD"; + #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE" + worker_config = "WORKER_ENABLE"; +} +); + +rfsimulator : +{ + serveraddr = "server"; + serverport = "4043"; + options = (); #("saviq"); or/and "chanmod" + modelname = "AWGN"; + IQfile = "/tmp/rfsimulator.iqs"; +}; + +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"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + ngap_log_level ="debug"; + ngap_log_verbosity ="medium"; +}; + diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.prs.usrpn310.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.prs.usrpn310.conf index 071ab258d2..c223bb78c6 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.prs.usrpn310.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.prs.usrpn310.conf @@ -54,10 +54,10 @@ gNBs = # downlinkConfigCommon #frequencyInfoDL # this is 3600 MHz + 43 PRBs@30kHz SCS (same as initial BWP) - absoluteFrequencySSB = 641280; + absoluteFrequencySSB = 650000; dl_frequencyBand = 78; # this is 3600 MHz - dl_absoluteFrequencyPointA = 640008; + dl_absoluteFrequencyPointA = 646736; #scs-SpecificCarrierList dl_offstToCarrier = 0; # subcarrierSpacing From 3ab0c2bae86b0c6dcdea0fe75edde6c1e186b5b4 Mon Sep 17 00:00:00 2001 From: rakesh mundlamuri Date: Thu, 7 Apr 2022 11:30:08 +0200 Subject: [PATCH 075/135] ue prs config for 217 PRB --- ...gnb.sa.band78.fr1.217PRB.prs.usrpn310.conf | 4 +- .../CONF/ue.nr.prs.fr1.217prb.conf | 41 +++++++++++++++++++ 2 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr1.217prb.conf diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.217PRB.prs.usrpn310.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.217PRB.prs.usrpn310.conf index 62c2df4ecd..4b5052f2d3 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.217PRB.prs.usrpn310.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.217PRB.prs.usrpn310.conf @@ -220,8 +220,8 @@ prs_config = ( PRSResourceSetPeriod0 = 40; PRSResourceSetPeriod1 = 0; SymbolStart = 7; - NumPRSSymbols = 4; - NumRB = 217; + NumPRSSymbols = 7; + NumRB = 216; RBOffset = 0; CombSize = 4; REOffset = 0; diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr1.217prb.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr1.217prb.conf new file mode 100644 index 0000000000..e84aac5b6a --- /dev/null +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr1.217prb.conf @@ -0,0 +1,41 @@ +PRSs = +( + { + Active_gNBs = 1; + prs_config0 = ( + { + gNB_id = 0; + PRSResourceSetPeriod0 = 40; + PRSResourceSetPeriod1 = 0; + SymbolStart = 7; + NumPRSSymbols = 7; + NumRB = 216; + RBOffset = 0; + CombSize = 4; + REOffset = 0; + PRSResourceOffset = 0; + PRSResourceRepetition = 1; + PRSResourceTimeGap = 1; + NPRS_ID = 0; + } + ); + + prs_config1 = ( + { + gNB_id = 1; + PRSResourceSetPeriod0 = 40; + PRSResourceSetPeriod1 = 0; + SymbolStart = 7; + NumPRSSymbols = 4; + NumRB = 106; + RBOffset = 0; + CombSize = 4; + REOffset = 1; + PRSResourceOffset = 0; + PRSResourceRepetition = 1; + PRSResourceTimeGap = 1; + NPRS_ID = 0; + } + ); + } +); From df67fd02a9e96d6916c0652f7cd2f3bb6f0272ba Mon Sep 17 00:00:00 2001 From: rakesh mundlamuri Date: Thu, 7 Apr 2022 11:48:56 +0200 Subject: [PATCH 076/135] renamed config files to use it with usrp x310 --- ...rpx310.conf => gnb.sa.band257.fr2.64PRB.prs.usrpx310.conf} | 4 ++-- ...rpn310.conf => gnb.sa.band78.fr1.106PRB.prs.usrpx310.conf} | 0 ...rpn310.conf => gnb.sa.band78.fr1.217PRB.prs.usrpx310.conf} | 0 ...rpn310.conf => gnb.sa.band78.fr1.273PRB.prs.usrpx310.conf} | 0 4 files changed, 2 insertions(+), 2 deletions(-) rename targets/PROJECTS/GENERIC-NR-5GC/CONF/{gnb.sa.band257.fr2.66PRB.prs.usrpx310.conf => gnb.sa.band257.fr2.64PRB.prs.usrpx310.conf} (99%) rename targets/PROJECTS/GENERIC-NR-5GC/CONF/{gnb.sa.band78.fr1.106PRB.prs.usrpn310.conf => gnb.sa.band78.fr1.106PRB.prs.usrpx310.conf} (100%) rename targets/PROJECTS/GENERIC-NR-5GC/CONF/{gnb.sa.band78.fr1.217PRB.prs.usrpn310.conf => gnb.sa.band78.fr1.217PRB.prs.usrpx310.conf} (100%) rename targets/PROJECTS/GENERIC-NR-5GC/CONF/{gnb.sa.band78.fr1.273PRB.prs.usrpn310.conf => gnb.sa.band78.fr1.273PRB.prs.usrpx310.conf} (100%) diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band257.fr2.66PRB.prs.usrpx310.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band257.fr2.64PRB.prs.usrpx310.conf similarity index 99% rename from targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band257.fr2.66PRB.prs.usrpx310.conf rename to targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band257.fr2.64PRB.prs.usrpx310.conf index a5deb3a3cd..9f00f6b787 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band257.fr2.66PRB.prs.usrpx310.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band257.fr2.64PRB.prs.usrpx310.conf @@ -62,7 +62,7 @@ gNBs = # subcarrierSpacing # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 dl_subcarrierSpacing = 3; - dl_carrierBandwidth = 66; + dl_carrierBandwidth = 64; #initialDownlinkBWP #genericParameters # this is RBstart=27,L=48 (275*(L-1))+RBstart @@ -82,7 +82,7 @@ gNBs = # subcarrierSpacing # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 ul_subcarrierSpacing = 3; - ul_carrierBandwidth = 66; + ul_carrierBandwidth = 64; pMax = 20; #initialUplinkBWP #genericParameters diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.prs.usrpn310.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.prs.usrpx310.conf similarity index 100% rename from targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.prs.usrpn310.conf rename to targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.prs.usrpx310.conf diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.217PRB.prs.usrpn310.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.217PRB.prs.usrpx310.conf similarity index 100% rename from targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.217PRB.prs.usrpn310.conf rename to targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.217PRB.prs.usrpx310.conf diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.prs.usrpn310.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.prs.usrpx310.conf similarity index 100% rename from targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.prs.usrpn310.conf rename to targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.prs.usrpx310.conf From 8b9c76be885ec5b71419c24bdbbecad01c90981c Mon Sep 17 00:00:00 2001 From: rakesh mundlamuri Date: Thu, 7 Apr 2022 11:53:44 +0200 Subject: [PATCH 077/135] revert the config files 106 and 273 for usrp n310 --- ...s.usrpx310.conf => gnb.sa.band78.fr1.106PRB.prs.usrpn310.conf} | 0 ...s.usrpx310.conf => gnb.sa.band78.fr1.273PRB.prs.usrpn310.conf} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename targets/PROJECTS/GENERIC-NR-5GC/CONF/{gnb.sa.band78.fr1.106PRB.prs.usrpx310.conf => gnb.sa.band78.fr1.106PRB.prs.usrpn310.conf} (100%) rename targets/PROJECTS/GENERIC-NR-5GC/CONF/{gnb.sa.band78.fr1.273PRB.prs.usrpx310.conf => gnb.sa.band78.fr1.273PRB.prs.usrpn310.conf} (100%) diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.prs.usrpx310.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.prs.usrpn310.conf similarity index 100% rename from targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.prs.usrpx310.conf rename to targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.prs.usrpn310.conf diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.prs.usrpx310.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.prs.usrpn310.conf similarity index 100% rename from targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.prs.usrpx310.conf rename to targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.prs.usrpn310.conf From 4e869190604fcd0df427438424c614a246dc5ae9 Mon Sep 17 00:00:00 2001 From: Sagar Parsawar Date: Fri, 6 May 2022 18:03:48 +0200 Subject: [PATCH 078/135] gNB & nrUE: Added multiple PRS resources scheduling --- openair1/PHY/INIT/nr_init_ue.c | 28 ++-- .../nr_dl_channel_estimation.c | 14 +- openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h | 1 + openair1/PHY/defs_gNB.h | 7 +- openair1/PHY/defs_nr_UE.h | 7 +- openair1/PHY/defs_nr_common.h | 34 ++--- openair1/SCHED_NR/phy_procedures_nr_gNB.c | 41 +++--- openair1/SCHED_NR/sched_nr.h | 1 + openair1/SCHED_NR_UE/defs.h | 1 + openair1/SCHED_NR_UE/phy_procedures_nr_ue.c | 44 ++++--- openair2/GNB_APP/gnb_config.c | 96 +++++++++----- openair2/GNB_APP/prs_nr_paramdef.h | 64 ++++++---- openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c | 120 ++++++++++++------ .../gnb.sa.band78.fr1.106PRB.usrpb210.conf | 27 ++-- .../GENERIC-NR-5GC/CONF/ue_nr_prs.conf | 22 ++-- 15 files changed, 319 insertions(+), 188 deletions(-) diff --git a/openair1/PHY/INIT/nr_init_ue.c b/openair1/PHY/INIT/nr_init_ue.c index 2ef13d3c60..43bc62adf0 100644 --- a/openair1/PHY/INIT/nr_init_ue.c +++ b/openair1/PHY/INIT/nr_init_ue.c @@ -328,20 +328,22 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, for(int idx = 0; idx < NR_MAX_PRS_COMB_SIZE; idx++) { prs_vars[idx] = (NR_UE_PRS *)malloc16_clear(sizeof(NR_UE_PRS)); + for(int k = 0; k < NR_MAX_PRS_RESOURCES_PER_SET; k++) + { + // PRS channel estimates + prs_vars[idx]->prs_resource[k].prs_ch_estimates = (int32_t **)malloc16_clear( fp->nb_antennas_rx*sizeof(int32_t *) ); + prs_vars[idx]->prs_resource[k].prs_ch_estimates_time = (int32_t **)malloc16_clear( fp->nb_antennas_rx*sizeof(int32_t *) ); + AssertFatal(((prs_vars[idx]->prs_resource[k].prs_ch_estimates!=NULL) || (prs_vars[idx]->prs_resource[k].prs_ch_estimates_time!=NULL)), "NR UE init: PRS channel estimates malloc failed for gNB_id %d\n", idx); + prs_vars[idx]->prs_resource[k].prs_meas = (prs_meas_t **)malloc16_clear( fp->nb_antennas_rx*sizeof(prs_meas_t *) ); + AssertFatal((prs_vars[idx]->prs_resource[k].prs_meas!=NULL), "NR UE init: PRS measurements malloc failed for gNB_id %d\n", idx); - // PRS channel estimates - prs_vars[idx]->prs_ch_estimates = (int32_t **)malloc16_clear( fp->nb_antennas_rx*sizeof(int32_t *) ); - prs_vars[idx]->prs_ch_estimates_time = (int32_t **)malloc16_clear( fp->nb_antennas_rx*sizeof(int32_t *) ); - AssertFatal(((prs_vars[idx]->prs_ch_estimates!=NULL) || (prs_vars[idx]->prs_ch_estimates_time!=NULL)), "NR UE init: PRS channel estimates malloc failed for gNB_id %d\n", idx); - prs_vars[idx]->prs_meas = (prs_meas_t **)malloc16_clear( fp->nb_antennas_rx*sizeof(prs_meas_t *) ); - AssertFatal((prs_vars[idx]->prs_meas!=NULL), "NR UE init: PRS measurements malloc failed for gNB_id %d\n", idx); - - for (i=0; inb_antennas_rx; i++) { - prs_vars[idx]->prs_ch_estimates[i] = (int32_t *)malloc16_clear(fp->ofdm_symbol_size*NR_SYMBOLS_PER_SLOT*sizeof(int32_t)); - prs_vars[idx]->prs_ch_estimates_time[i] = (int32_t *)malloc16_clear(fp->ofdm_symbol_size*NR_SYMBOLS_PER_SLOT*sizeof(int32_t)); - AssertFatal(((prs_vars[idx]->prs_ch_estimates[i]!=NULL) || (prs_vars[idx]->prs_ch_estimates_time[i]!=NULL)), "NR UE init: PRS channel estimates malloc failed for rx_ant %d\n", i); - prs_vars[idx]->prs_meas[i] = (prs_meas_t *)malloc16_clear(NR_SYMBOLS_PER_SLOT*sizeof(prs_meas_t) ); - AssertFatal((prs_vars[idx]->prs_meas[i]!=NULL), "NR UE init: PRS measurements malloc failed for rx_ant %d\n", i); + for (i=0; inb_antennas_rx; i++) { + prs_vars[idx]->prs_resource[k].prs_ch_estimates[i] = (int32_t *)malloc16_clear(fp->ofdm_symbol_size*NR_SYMBOLS_PER_SLOT*sizeof(int32_t)); + prs_vars[idx]->prs_resource[k].prs_ch_estimates_time[i] = (int32_t *)malloc16_clear(fp->ofdm_symbol_size*NR_SYMBOLS_PER_SLOT*sizeof(int32_t)); + AssertFatal(((prs_vars[idx]->prs_resource[k].prs_ch_estimates[i]!=NULL) || (prs_vars[idx]->prs_resource[k].prs_ch_estimates_time[i]!=NULL)), "NR UE init: PRS channel estimates malloc failed for rx_ant %d\n", i); + prs_vars[idx]->prs_resource[k].prs_meas[i] = (prs_meas_t *)malloc16_clear(NR_SYMBOLS_PER_SLOT*sizeof(prs_meas_t) ); + AssertFatal((prs_vars[idx]->prs_resource[k].prs_meas[i]!=NULL), "NR UE init: PRS measurements malloc failed for rx_ant %d\n", i); + } } } // DLSCH 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 1290ec9e2a..6afdcfbac4 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -50,16 +50,17 @@ static inline int abs32(int x) } int nr_prs_channel_estimation(uint8_t gNB_id, + uint8_t rsc_id, PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, NR_DL_FRAME_PARMS *frame_params) { int32_t **rxdataF = ue->common_vars.common_vars_rx_data_per_thread[proc->thread_id].rxdataF; uint32_t **nr_gold_prs = ue->nr_gold_prs[proc->nr_slot_rx]; - prs_data_t *prs_cfg = &ue->prs_vars[gNB_id]->prs_cfg; - prs_meas_t **prs_meas = ue->prs_vars[gNB_id]->prs_meas; - int32_t **prs_chestF = ue->prs_vars[gNB_id]->prs_ch_estimates; - int32_t **prs_chestT = ue->prs_vars[gNB_id]->prs_ch_estimates_time; + prs_data_t *prs_cfg = &ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_cfg; + prs_meas_t **prs_meas = ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_meas; + int32_t **prs_chestF = ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_ch_estimates; + int32_t **prs_chestT = ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_ch_estimates_time; uint8_t rxAnt = 0, idx = prs_cfg->NPRSID; int16_t *rxF, *pil, *fl, *fm, *fmm, *fml, *fmr, *fr, mod_prs[NR_MAX_PRS_LENGTH<<1]; @@ -92,7 +93,7 @@ int nr_prs_channel_estimation(uint8_t gNB_id, } #ifdef DEBUG_PRS_PRINTS - printf("[gNB %d] PRS config l %d k_prime %d:\nprs_cfg->SymbolStart %d\nprs_cfg->NumPRSSymbols %d\nprs_cfg->NumRB %d\nprs_cfg->CombSize %d\n", gNB_id, l, k_prime, prs_cfg->SymbolStart, prs_cfg->NumPRSSymbols, prs_cfg->NumRB, prs_cfg->CombSize); + printf("[gNB %d][rsc %d] PRS config l %d k_prime %d:\nprs_cfg->SymbolStart %d\nprs_cfg->NumPRSSymbols %d\nprs_cfg->NumRB %d\nprs_cfg->CombSize %d\n", gNB_id, rsc_id, l, k_prime, prs_cfg->SymbolStart, prs_cfg->NumPRSSymbols, prs_cfg->NumRB, prs_cfg->CombSize); #endif // Pilots generation and modulation for (int m = 0; m < num_pilots; m++) @@ -483,11 +484,10 @@ int nr_prs_channel_estimation(uint8_t gNB_id, frame_params->ofdm_symbol_size, &prs_meas[rxAnt][l].dl_toa, &ch_pwr); - LOG_I(PHY, "[gNB %d][Rx %d][sfn %d][slot %d] ToA for PRS symbol %2d ==> %d / %d samples, peak channel power %.1f dB\n", gNB_id, rxAnt, proc->frame_rx, proc->nr_slot_rx, l, prs_meas[rxAnt][l].dl_toa-(frame_params->ofdm_symbol_size>>1), frame_params->ofdm_symbol_size, 10*log10(ch_pwr)); + LOG_I(PHY, "[gNB %d][rsc %d][Rx %d][sfn %d][slot %d] ToA for PRS symbol %2d ==> %d / %d samples, peak channel power %.1f dB\n", gNB_id, rsc_id, rxAnt, proc->frame_rx, proc->nr_slot_rx, l, prs_meas[rxAnt][l].dl_toa-(frame_params->ofdm_symbol_size>>1), frame_params->ofdm_symbol_size, 10*log10(ch_pwr)); //prs measurements prs_meas[rxAnt][l].gNB_id = gNB_id; - prs_meas[rxAnt][l].timestamp = 0; //TODO prs_meas[rxAnt][l].sfn = proc->frame_rx; prs_meas[rxAnt][l].slot = proc->nr_slot_rx; prs_meas[rxAnt][l].rxAnt_idx = rxAnt; diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h b/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h index 4f26c8e20d..ea0b8c894b 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h @@ -34,6 +34,7 @@ /* A function to perform the channel estimation of DL PRS signal */ int nr_prs_channel_estimation(uint8_t gNB_id, + uint8_t rsc_id, PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, NR_DL_FRAME_PARMS *frame_params); diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h index 565ec895c9..a1fd2ecc09 100644 --- a/openair1/PHY/defs_gNB.h +++ b/openair1/PHY/defs_gNB.h @@ -227,6 +227,11 @@ typedef struct { gNB_PRACH_list_t list[NUMBER_OF_NR_PRACH_MAX]; } NR_gNB_PRACH; +typedef struct { + uint8_t NumPRSResources; + prs_data_t prs_cfg[NR_MAX_PRS_RESOURCES_PER_SET]; +} NR_gNB_PRS; + typedef struct { /// Nfapi ULSCH PDU nfapi_nr_pusch_pdu_t ulsch_pdu; @@ -757,6 +762,7 @@ typedef struct PHY_VARS_gNB_s { nr_cce_t cce_list[MAX_DCI_CORESET][NR_MAX_PDCCH_AGG_LEVEL]; NR_gNB_COMMON common_vars; NR_gNB_PRACH prach_vars; + NR_gNB_PRS prs_vars; NR_gNB_PUSCH *pusch_vars[NUMBER_OF_NR_ULSCH_MAX]; NR_gNB_PUCCH_t *pucch[NUMBER_OF_NR_PUCCH_MAX]; NR_gNB_PDCCH_t pdcch_pdu[NUMBER_OF_NR_PDCCH_MAX]; @@ -771,7 +777,6 @@ typedef struct PHY_VARS_gNB_s { NR_gNB_SCH_STATS_t ulsch_stats[NUMBER_OF_NR_SCH_STATS_MAX]; NR_gNB_UCI_STATS_t uci_stats[NUMBER_OF_NR_UCI_STATS_MAX]; t_nrPolar_params *uci_polarParams; - prs_data_t prs_cfg; uint8_t pbch_configured; char gNB_generate_rar; diff --git a/openair1/PHY/defs_nr_UE.h b/openair1/PHY/defs_nr_UE.h index a8082ee147..f9f72b1991 100644 --- a/openair1/PHY/defs_nr_UE.h +++ b/openair1/PHY/defs_nr_UE.h @@ -389,6 +389,11 @@ typedef struct { int32_t **prs_ch_estimates_time; int32_t reserved; prs_meas_t **prs_meas; +} NR_PRS_RESOURCE_t; + +typedef struct { + uint8_t NumPRSResources; + NR_PRS_RESOURCE_t prs_resource[NR_MAX_PRS_RESOURCES_PER_SET]; } NR_UE_PRS; #define NR_PDCCH_DEFS_NR_UE @@ -832,7 +837,7 @@ typedef struct { NR_UE_DLSCH_t *dlsch_p[NUMBER_OF_CONNECTED_gNB_MAX]; NR_UE_DLSCH_t *dlsch_MCH[NUMBER_OF_CONNECTED_gNB_MAX]; NR_UE_PRS *prs_vars[NR_MAX_PRS_COMB_SIZE]; - uint16_t prs_active_gNBs; + uint8_t prs_active_gNBs; uint8_t prs_start_symb; uint8_t prs_end_symb; diff --git a/openair1/PHY/defs_nr_common.h b/openair1/PHY/defs_nr_common.h index b86811a4c3..23cb14169f 100644 --- a/openair1/PHY/defs_nr_common.h +++ b/openair1/PHY/defs_nr_common.h @@ -84,6 +84,8 @@ #define NR_MAX_PRS_INIT_LENGTH_DWORD 102 // ceil(NR_MAX_CSI_RS_LENGTH/32) #define NR_MAX_NUM_PRS_SYMB 12 #define NR_MAX_PRS_COMB_SIZE 12 +#define NR_MAX_PRS_RESOURCES_PER_SET 64 +#define NR_MAX_PRS_MUTING_PATTERN_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 @@ -376,28 +378,26 @@ struct NR_DL_FRAME_PARMS { // PRS structures prototype typedef struct { - uint16_t PRSResourceSetPeriod[2]; //[slot period, slot offset] - uint8_t PRSResourceOffset; // array if more than one resource sets.slot offset (0...511) (default 0) - uint8_t PRSResourceRepetition;// slot offset (1 (default), 2, 4, 6, 8, 16, 32) - uint8_t PRSResourceTimeGap; // slot offset (1 (default), 2, 4, 6, 8, 16, 32) - uint8_t NumRB; //number of RBs in freq domain a scalar =< 275 RB - uint8_t NumPRSSymbols; //number of PRS symbols in time domain - uint8_t SymbolStart; //starting OFDM symbol of PRS resource in time domain - uint8_t RBOffset; //Starting PRB index of all PRS resources in a PRS resource set. - uint8_t CombSize; //RE density of all PRS resources in a PRS resource set. i∈{2,4,6,12} - uint8_t REOffset; //Starting RE offset in the first OFDM symbol of each PRS resource in a PRS resource set. - uint32_t MutingPattern1[2]; //Muting bit pattern option-1, specified as [] or a binary-valued vector of length 2, 4, 6, 8, 16, or 32. - uint32_t MutingPattern2[2]; - uint8_t MutingBitRepetition; - uint16_t NPRSID; -} prs_data_t; //32bytes + uint16_t PRSResourceSetPeriod[2]; // [slot period, slot offset] + uint8_t PRSResourceOffset; // array if more than one resource sets.slot offset (0...511) (default 0) + uint8_t PRSResourceRepetition; // slot offset (1 (default), 2, 4, 6, 8, 16, 32) + uint8_t PRSResourceTimeGap; // slot offset (1 (default), 2, 4, 6, 8, 16, 32) + uint8_t NumRB; // number of RBs in freq domain a scalar =< 275 RB + uint8_t NumPRSSymbols; // number of PRS symbols in time domain + uint8_t SymbolStart; // starting OFDM symbol of PRS resource in time domain + uint8_t RBOffset; // Starting PRB index of all PRS resources in a PRS resource set + uint8_t CombSize; // RE density of all PRS resources in a PRS resource set. i∈{2,4,6,12} + uint8_t REOffset; // Starting RE offset in the first OFDM symbol of each PRS resource in a PRS resource set + uint32_t MutingPattern1[32]; // Muting bit pattern option-1, specified as [] or a binary-valued vector of length 2, 4, 6, 8, 16, or 32 + uint32_t MutingPattern2[32]; // Muting bit pattern option-2, specified as [] or a binary-valued vector of length 2, 4, 6, 8, 16, or 32 + uint8_t MutingBitRepetition; // Muting bit repetition factor, specified as 1, 2, 4, or 8 + uint16_t NPRSID; // Sequence identity of each PRS resource specified as a scalar or a vector of integers in the range [0, 4095] +} prs_data_t; typedef struct { int8_t gNB_id; - int32_t timestamp; int32_t sfn; int8_t slot; - int8_t symbol; int8_t rxAnt_idx; int32_t dl_toa; int32_t dl_aoa; diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index c107a3a546..05843b21c4 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -67,6 +67,21 @@ void nr_set_ssb_first_subcarrier(nfapi_nr_config_request_scf_t *cfg, NR_DL_FRAME LOG_D(PHY, "SSB first subcarrier %d (%d,%d)\n", fp->ssb_start_subcarrier,cfg->ssb_table.ssb_offset_point_a.value,sco); } +uint8_t check_prs_slot_gNB(uint8_t *prs_rsc_id, NR_gNB_PRS *prs_vars, int nr_slot_tx) +{ + uint8_t is_prs_slot = 0, rsc_id = 0; + for(rsc_id = 0; rsc_id < prs_vars->NumPRSResources; rsc_id++) + { + if((prs_vars->prs_cfg[rsc_id].PRSResourceSetPeriod[1] + prs_vars->prs_cfg[rsc_id].PRSResourceOffset) == nr_slot_tx) + { + is_prs_slot = 1; + *prs_rsc_id = rsc_id; + break; + } + } + return is_prs_slot; +} + void nr_common_signal_procedures (PHY_VARS_gNB *gNB,int frame,int slot,nfapi_nr_dl_tti_ssb_pdu ssb_pdu) { NR_DL_FRAME_PARMS *fp=&gNB->frame_parms; @@ -100,23 +115,6 @@ void nr_common_signal_procedures (PHY_VARS_gNB *gNB,int frame,int slot,nfapi_nr_ else nr_generate_pbch_dmrs(gNB->nr_gold_pbch_dmrs[0][ssb_index&7],&txdataF[0][txdataF_offset], AMP, ssb_start_symbol, cfg, fp); -/* - prs_data_t prs_data; - prs_data.PRSResourceSetPeriod[0]=40; // PRS resource slot period - prs_data.PRSResourceSetPeriod[1]=0; // resource slot offset - prs_data.SymbolStart=7; - prs_data.NumPRSSymbols=4; - prs_data.NumRB=fp->N_RB_DL; - prs_data.RBOffset=0; - prs_data.CombSize=4; - prs_data.REOffset=0; - prs_data.PRSResourceOffset=0; - prs_data.PRSResourceRepetition=1; - prs_data.PRSResourceTimeGap=1; - prs_data.NPRSID=0; -*/ - nr_generate_prs(gNB->nr_gold_prs[slot],&txdataF[0][txdataF_offset], AMP, &gNB->prs_cfg, cfg, fp); - if (T_ACTIVE(T_GNB_PHY_MIB)) { unsigned char bch[3]; @@ -156,6 +154,7 @@ void phy_procedures_gNB_TX(processingData_L1tx_t *msgTx, nfapi_nr_config_request_scf_t *cfg = &gNB->gNB_config; int offset = gNB->CC_id; int txdataF_offset = (slot%2)*fp->samples_per_slot_wCP; + uint8_t rsc_id = 0, is_prs_slot = 0; if ((cfg->cell_config.frame_duplex_type.value == TDD) && (nr_slot_select(cfg,frame,slot) == NR_UPLINK_SLOT)) return; @@ -170,6 +169,14 @@ void phy_procedures_gNB_TX(processingData_L1tx_t *msgTx, memset(&gNB->common_vars.beam_id[aa][slot*fp->symbols_per_slot],255,fp->symbols_per_slot*sizeof(uint8_t)); } + // Check for PRS slot + is_prs_slot = check_prs_slot_gNB(&rsc_id, &gNB->prs_vars, slot); + if(is_prs_slot) + { + LOG_I(PHY,"gNB_TX: frame %d, slot %d, slots_per_frame %d, PRS Resource ID %d\n",frame,slot, fp->slots_per_frame, rsc_id); + nr_generate_prs(gNB->nr_gold_prs[slot],&gNB->common_vars.txdataF[0][txdataF_offset], AMP, &gNB->prs_vars.prs_cfg[rsc_id], cfg, fp); + } + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_gNB_COMMON_TX,1); for (int i=0; iLmax; i++) { if (msgTx->ssb[i].active) { diff --git a/openair1/SCHED_NR/sched_nr.h b/openair1/SCHED_NR/sched_nr.h index d7e0332b85..4fcdfe2858 100644 --- a/openair1/SCHED_NR/sched_nr.h +++ b/openair1/SCHED_NR/sched_nr.h @@ -54,5 +54,6 @@ void nr_fep_full(RU_t *ru, int slot); void nr_fep_full_2thread(RU_t *ru, int slot); void feptx_prec(RU_t *ru,int frame_tx,int tti_tx); int nr_phy_init_RU(RU_t *ru); +uint8_t check_prs_slot_gNB(uint8_t *prs_rsc_id, NR_gNB_PRS *prs_vars, int nr_slot_tx); #endif diff --git a/openair1/SCHED_NR_UE/defs.h b/openair1/SCHED_NR_UE/defs.h index b3527365a5..f07dd85c40 100644 --- a/openair1/SCHED_NR_UE/defs.h +++ b/openair1/SCHED_NR_UE/defs.h @@ -388,6 +388,7 @@ int get_tx_harq_id(NR_UE_ULSCH_t *ulsch, int slot_tx); int is_pbch_in_slot(fapi_nr_config_request_t *config, int frame, int slot, NR_DL_FRAME_PARMS *fp); int is_ssb_in_slot(fapi_nr_config_request_t *config, int frame, int slot, NR_DL_FRAME_PARMS *fp); +uint8_t check_prs_slot_nrUE(PHY_VARS_NR_UE *ue, uint8_t *prs_gNB_id, uint8_t *prs_rsc_id, int nr_slot_rx); /*! \brief This function prepares the dl indication to pass to the MAC @param diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c index 6114d30652..a112d273b5 100644 --- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c +++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c @@ -1581,6 +1581,24 @@ int is_pbch_in_slot(fapi_nr_config_request_t *config, int frame, int slot, NR_DL } } +uint8_t check_prs_slot_nrUE(PHY_VARS_NR_UE *ue, uint8_t *prs_gNB_id, uint8_t *prs_rsc_id, int nr_slot_rx) +{ + uint8_t is_prs_slot = 0, rsc_id = 0, gNB_id = 0; + for(gNB_id = 0; gNB_id < ue->prs_active_gNBs; gNB_id++) + { + for(rsc_id = 0; rsc_id < ue->prs_vars[gNB_id]->NumPRSResources; rsc_id++) + { + if((ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_cfg.PRSResourceSetPeriod[1] + ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_cfg.PRSResourceOffset) == nr_slot_rx) + { + is_prs_slot = 1; + *prs_rsc_id = rsc_id; + *prs_gNB_id = gNB_id; + return is_prs_slot; + } + } + } + return is_prs_slot; +} int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, @@ -1595,6 +1613,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue, int slot_ssb; NR_UE_PDCCH *pdcch_vars = ue->pdcch_vars[proc->thread_id][0]; fapi_nr_config_request_t *cfg = &ue->nrUE_config; + uint8_t rsc_id = 0, is_prs_slot = 0, prs_gNB_id = 0; uint8_t nb_symb_pdcch = pdcch_vars->nb_search_space > 0 ? pdcch_vars->pdcch_config[0].coreset.duration : 0; uint8_t dci_cnt = 0; @@ -1659,21 +1678,12 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue, nr_ue_rrc_measurements(ue, proc, nr_slot_rx); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP_PBCH, VCD_FUNCTION_OUT); } + } -/* - ue->prs_vars[gNB_id]->prs_cfg.PRSResourceSetPeriod[0]=40; // PRS resource slot period - ue->prs_vars[gNB_id]->prs_cfg.PRSResourceSetPeriod[1]=0; // resource slot offset - ue->prs_vars[gNB_id]->prs_cfg.SymbolStart=7; - ue->prs_vars[gNB_id]->prs_cfg.NumPRSSymbols=4; - ue->prs_vars[gNB_id]->prs_cfg.NumRB=fp->N_RB_DL; - ue->prs_vars[gNB_id]->prs_cfg.RBOffset=0; - ue->prs_vars[gNB_id]->prs_cfg.CombSize=4; - ue->prs_vars[gNB_id]->prs_cfg.REOffset=0; - ue->prs_vars[gNB_id]->prs_cfg.PRSResourceOffset=0; - ue->prs_vars[gNB_id]->prs_cfg.PRSResourceRepetition=1; - ue->prs_vars[gNB_id]->prs_cfg.PRSResourceTimeGap=1; - ue->prs_vars[gNB_id]->prs_cfg.NPRSID=0; -*/ + // Check for PRS slot + is_prs_slot = check_prs_slot_nrUE(ue, &prs_gNB_id, &rsc_id, nr_slot_rx); + if (is_prs_slot) + { for(int j = ue->prs_start_symb; j < ue->prs_end_symb; j++) { nr_slot_fep(ue, @@ -1683,8 +1693,10 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue, } //PRS channel estimation - for(int gIdx = 0; gIdx < ue->prs_active_gNBs; gIdx++) - nr_prs_channel_estimation(gIdx,ue,proc,fp); + //for(int gIdx = 0; gIdx < ue->prs_active_gNBs; gIdx++) + { + nr_prs_channel_estimation(prs_gNB_id,rsc_id,ue,proc,fp); + } } if ((frame_rx%64 == 0) && (nr_slot_rx==0)) { diff --git a/openair2/GNB_APP/gnb_config.c b/openair2/GNB_APP/gnb_config.c index 4d1bb245fc..b8ea49b0ca 100644 --- a/openair2/GNB_APP/gnb_config.c +++ b/openair2/GNB_APP/gnb_config.c @@ -605,7 +605,7 @@ void RCconfig_nr_flexran() void RCconfig_nr_prs(void) { - uint16_t j; + uint16_t j = 0, k = 0; paramdef_t PRS_Params[] = PRS_PARAMS_DESC; paramlist_def_t PRS_ParamList = {CONFIG_STRING_PRS_CONFIG,NULL,0}; @@ -619,7 +619,6 @@ void RCconfig_nr_prs(void) config_getlist( &PRS_ParamList,PRS_Params,sizeof(PRS_Params)/sizeof(paramdef_t), NULL); if (PRS_ParamList.numelt > 0) { - for (j = 0; j < RC.nb_nr_L1_inst; j++) { if (RC.gNB[j] == NULL) { @@ -629,35 +628,72 @@ void RCconfig_nr_prs(void) RC.gNB[j]->Mod_id = j; } - RC.gNB[j]->prs_cfg.PRSResourceSetPeriod[0] = *(PRS_ParamList.paramarray[j][PRS_RESOURCE_SET_PERIOD0].uptr); - RC.gNB[j]->prs_cfg.PRSResourceSetPeriod[1] = *(PRS_ParamList.paramarray[j][PRS_RESOURCE_SET_PERIOD1].uptr); - RC.gNB[j]->prs_cfg.SymbolStart = *(PRS_ParamList.paramarray[j][PRS_SYMBOL_START].uptr); - RC.gNB[j]->prs_cfg.NumPRSSymbols = *(PRS_ParamList.paramarray[j][PRS_NUM_SYMBOLS].uptr); - RC.gNB[j]->prs_cfg.NumRB = *(PRS_ParamList.paramarray[j][PRS_NUM_RB].uptr); - RC.gNB[j]->prs_cfg.RBOffset = *(PRS_ParamList.paramarray[j][PRS_RB_OFFSET].uptr); - RC.gNB[j]->prs_cfg.CombSize = *(PRS_ParamList.paramarray[j][PRS_COMB_SIZE].uptr); - RC.gNB[j]->prs_cfg.REOffset = *(PRS_ParamList.paramarray[j][PRS_RE_OFFSET].uptr); - RC.gNB[j]->prs_cfg.PRSResourceOffset = *(PRS_ParamList.paramarray[j][PRS_RESOURCE_OFFSET].uptr); - RC.gNB[j]->prs_cfg.PRSResourceRepetition = *(PRS_ParamList.paramarray[j][PRS_RESOURCE_REPETITION].uptr); - RC.gNB[j]->prs_cfg.PRSResourceTimeGap = *(PRS_ParamList.paramarray[j][PRS_RESOURCE_TIME_GAP].uptr); - RC.gNB[j]->prs_cfg.NPRSID = *(PRS_ParamList.paramarray[j][PRS_ID].uptr); + RC.gNB[j]->prs_vars.NumPRSResources = *(PRS_ParamList.paramarray[j][NUM_PRS_RESOURCES].uptr); + for (k = 0; k < RC.gNB[j]->prs_vars.NumPRSResources; k++) + { + RC.gNB[j]->prs_vars.prs_cfg[k].PRSResourceSetPeriod[0] = PRS_ParamList.paramarray[j][PRS_RESOURCE_SET_PERIOD_LIST].uptr[0]; + RC.gNB[j]->prs_vars.prs_cfg[k].PRSResourceSetPeriod[1] = PRS_ParamList.paramarray[j][PRS_RESOURCE_SET_PERIOD_LIST].uptr[1]; + // per PRS resources parameters + RC.gNB[j]->prs_vars.prs_cfg[k].SymbolStart = PRS_ParamList.paramarray[j][PRS_SYMBOL_START_LIST].uptr[k]; + RC.gNB[j]->prs_vars.prs_cfg[k].NumPRSSymbols = PRS_ParamList.paramarray[j][PRS_NUM_SYMBOLS_LIST].uptr[k]; + RC.gNB[j]->prs_vars.prs_cfg[k].REOffset = PRS_ParamList.paramarray[j][PRS_RE_OFFSET_LIST].uptr[k]; + RC.gNB[j]->prs_vars.prs_cfg[k].PRSResourceOffset = PRS_ParamList.paramarray[j][PRS_RESOURCE_OFFSET_LIST].uptr[k]; + RC.gNB[j]->prs_vars.prs_cfg[k].NPRSID = PRS_ParamList.paramarray[j][PRS_ID_LIST].uptr[k]; + // Common parameters to all PRS resources + RC.gNB[j]->prs_vars.prs_cfg[k].NumRB = *(PRS_ParamList.paramarray[j][PRS_NUM_RB].uptr); + RC.gNB[j]->prs_vars.prs_cfg[k].RBOffset = *(PRS_ParamList.paramarray[j][PRS_RB_OFFSET].uptr); + RC.gNB[j]->prs_vars.prs_cfg[k].CombSize = *(PRS_ParamList.paramarray[j][PRS_COMB_SIZE].uptr); + RC.gNB[j]->prs_vars.prs_cfg[k].PRSResourceRepetition = *(PRS_ParamList.paramarray[j][PRS_RESOURCE_REPETITION].uptr); + RC.gNB[j]->prs_vars.prs_cfg[k].PRSResourceTimeGap = *(PRS_ParamList.paramarray[j][PRS_RESOURCE_TIME_GAP].uptr); + RC.gNB[j]->prs_vars.prs_cfg[k].MutingBitRepetition = *(PRS_ParamList.paramarray[j][PRS_MUTING_BIT_REPETITION].uptr); + for (int l = 0; l < PRS_ParamList.paramarray[j][PRS_MUTING_PATTERN1_LIST].numelt; l++) + RC.gNB[j]->prs_vars.prs_cfg[k].MutingPattern1[l] = PRS_ParamList.paramarray[j][PRS_MUTING_PATTERN1_LIST].uptr[l]; + for (int l = 0; l < PRS_ParamList.paramarray[j][PRS_MUTING_PATTERN2_LIST].numelt; l++) + RC.gNB[j]->prs_vars.prs_cfg[k].MutingPattern2[l] = PRS_ParamList.paramarray[j][PRS_MUTING_PATTERN2_LIST].uptr[l]; - LOG_I(PHY, "--------------------------\n"); - LOG_I(PHY, "PRS Config for gNB_ID %d\n", j); - LOG_I(PHY, "--------------------------\n"); - LOG_I(PHY, "PRSResourceSetPeriod0 %d\n", RC.gNB[j]->prs_cfg.PRSResourceSetPeriod[0]); - LOG_I(PHY, "PRSResourceSetPeriod1 %d\n", RC.gNB[j]->prs_cfg.PRSResourceSetPeriod[1]); - LOG_I(PHY, "SymbolStart %d\n", RC.gNB[j]->prs_cfg.SymbolStart); - LOG_I(PHY, "NumPRSSymbols %d\n", RC.gNB[j]->prs_cfg.NumPRSSymbols); - LOG_I(PHY, "NumRB %d\n", RC.gNB[j]->prs_cfg.NumRB); - LOG_I(PHY, "RBOffset %d\n", RC.gNB[j]->prs_cfg.RBOffset); - LOG_I(PHY, "CombSize %d\n", RC.gNB[j]->prs_cfg.CombSize); - LOG_I(PHY, "REOffset %d\n", RC.gNB[j]->prs_cfg.REOffset); - LOG_I(PHY, "PRSResourceOffset %d\n", RC.gNB[j]->prs_cfg.PRSResourceOffset); - LOG_I(PHY, "PRSResourceRepetition %d\n", RC.gNB[j]->prs_cfg.PRSResourceRepetition); - LOG_I(PHY, "PRSResourceTimeGap %d\n", RC.gNB[j]->prs_cfg.PRSResourceTimeGap); - LOG_I(PHY, "NPRS_ID %d\n", RC.gNB[j]->prs_cfg.NPRSID); - LOG_I(PHY, "--------------------------\n"); + } // for k + + k = 0; + LOG_I(PHY, "-----------------------------------------\n"); + LOG_I(PHY, "PRS Config for gNB_id %d @ %p\n", j, &RC.gNB[j]->prs_vars.prs_cfg[k]); + LOG_I(PHY, "-----------------------------------------\n"); + LOG_I(PHY, "NumPRSResources \t%d\n", RC.gNB[j]->prs_vars.NumPRSResources); + LOG_I(PHY, "PRSResourceSetPeriod \t[%d, %d]\n", RC.gNB[j]->prs_vars.prs_cfg[k].PRSResourceSetPeriod[0], RC.gNB[j]->prs_vars.prs_cfg[k].PRSResourceSetPeriod[1]); + LOG_I(PHY, "NumRB \t\t\t%d\n", RC.gNB[j]->prs_vars.prs_cfg[k].NumRB); + LOG_I(PHY, "RBOffset \t\t%d\n", RC.gNB[j]->prs_vars.prs_cfg[k].RBOffset); + LOG_I(PHY, "CombSize \t\t%d\n", RC.gNB[j]->prs_vars.prs_cfg[k].CombSize); + LOG_I(PHY, "PRSResourceRepetition \t%d\n", RC.gNB[j]->prs_vars.prs_cfg[k].PRSResourceRepetition); + LOG_I(PHY, "PRSResourceTimeGap \t%d\n", RC.gNB[j]->prs_vars.prs_cfg[k].PRSResourceTimeGap); + LOG_I(PHY, "MutingBitRepetition \t%d\n", RC.gNB[j]->prs_vars.prs_cfg[k].MutingBitRepetition); + LOG_I(PHY, "SymbolStart \t\t["); + for (k = 0; k < RC.gNB[j]->prs_vars.NumPRSResources; k++) + printf("%d, ", RC.gNB[j]->prs_vars.prs_cfg[k].SymbolStart); + printf("\b\b]\n"); + LOG_I(PHY, "NumPRSSymbols \t\t["); + for (k = 0; k < RC.gNB[j]->prs_vars.NumPRSResources; k++) + printf("%d, ", RC.gNB[j]->prs_vars.prs_cfg[k].NumPRSSymbols); + printf("\b\b]\n"); + LOG_I(PHY, "REOffset \t\t["); + for (k = 0; k < RC.gNB[j]->prs_vars.NumPRSResources; k++) + printf("%d, ", RC.gNB[j]->prs_vars.prs_cfg[k].REOffset); + printf("\b\b]\n"); + LOG_I(PHY, "PRSResourceOffset \t["); + for (k = 0; k < RC.gNB[j]->prs_vars.NumPRSResources; k++) + printf("%d, ", RC.gNB[j]->prs_vars.prs_cfg[k].PRSResourceOffset); + printf("\b\b]\n"); + LOG_I(PHY, "NPRS_ID \t\t["); + for (k = 0; k < RC.gNB[j]->prs_vars.NumPRSResources; k++) + printf("%d, ", RC.gNB[j]->prs_vars.prs_cfg[k].NPRSID); + printf("\b\b]\n"); + LOG_I(PHY, "MutingPattern1 \t\t["); + for (int l = 0, k = 0; l < PRS_ParamList.paramarray[j][PRS_MUTING_PATTERN1_LIST].numelt; l++) + printf("%d, ", RC.gNB[j]->prs_vars.prs_cfg[k].MutingPattern1[l]); + printf("\b\b]\n"); + LOG_I(PHY, "MutingPattern2 \t\t["); + for (int l = 0, k = 0; l < PRS_ParamList.paramarray[j][PRS_MUTING_PATTERN2_LIST].numelt; l++) + printf("%d, ", RC.gNB[j]->prs_vars.prs_cfg[k].MutingPattern2[l]); + printf("\b\b]\n"); + LOG_I(PHY, "-----------------------------------------\n"); } // for j } else diff --git a/openair2/GNB_APP/prs_nr_paramdef.h b/openair2/GNB_APP/prs_nr_paramdef.h index 5144f3c95f..0de2d36916 100644 --- a/openair2/GNB_APP/prs_nr_paramdef.h +++ b/openair2/GNB_APP/prs_nr_paramdef.h @@ -38,6 +38,7 @@ /* PRS configuration section names */ #define CONFIG_STRING_PRS_LIST "PRSs" #define CONFIG_STRING_PRS_CONFIG "prs_config" +#define CONFIG_STRING_MQTT_CONFIG "mqtt_config" /* Global parameters */ @@ -55,18 +56,21 @@ /* PRS configuration parameters names */ #define CONFIG_STRING_GNB_ID "gNB_id" -#define CONFIG_STRING_PRS_RESOURCE_SET_PERIOD0 "PRSResourceSetPeriod0" -#define CONFIG_STRING_PRS_RESOURCE_SET_PERIOD1 "PRSResourceSetPeriod1" -#define CONFIG_STRING_PRS_SYMBOL_START "SymbolStart" -#define CONFIG_STRING_PRS_NUM_SYMBOLS "NumPRSSymbols" +#define CONFIG_STRING_NUM_PRS_RESOURCES "NumPRSResources" +#define CONFIG_STRING_PRS_RESOURCE_SET_PERIOD_LIST "PRSResourceSetPeriod" +#define CONFIG_STRING_PRS_SYMBOL_START_LIST "SymbolStart" +#define CONFIG_STRING_PRS_NUM_SYMBOLS_LIST "NumPRSSymbols" #define CONFIG_STRING_PRS_NUM_RB "NumRB" #define CONFIG_STRING_PRS_RB_OFFSET "RBOffset" #define CONFIG_STRING_PRS_COMB_SIZE "CombSize" -#define CONFIG_STRING_PRS_RE_OFFSET "REOffset" -#define CONFIG_STRING_PRS_RESOURCE_OFFSET "PRSResourceOffset" +#define CONFIG_STRING_PRS_RE_OFFSET_LIST "REOffset" +#define CONFIG_STRING_PRS_RESOURCE_OFFSET_LIST "PRSResourceOffset" #define CONFIG_STRING_PRS_RESOURCE_REPETITION "PRSResourceRepetition" #define CONFIG_STRING_PRS_RESOURCE_TIME_GAP "PRSResourceTimeGap" -#define CONFIG_STRING_PRS_ID "NPRS_ID" +#define CONFIG_STRING_PRS_ID_LIST "NPRS_ID" +#define CONFIG_STRING_PRS_MUTING_PATTERN1_LIST "MutingPattern1" +#define CONFIG_STRING_PRS_MUTING_PATTERN2_LIST "MutingPattern2" +#define CONFIG_STRING_PRS_MUTING_BIT_REPETITION "MutingBitRepetition" /*----------------------------------------------------------------------------------------------------------------------------------------------------*/ @@ -74,34 +78,40 @@ /* optname helpstr paramflags XXXptr defXXXval type numelt */ /*----------------------------------------------------------------------------------------------------------------------------------------------------*/ #define PRS_PARAMS_DESC { \ -{CONFIG_STRING_GNB_ID, NULL, 0, uptr:NULL, defuintval:0, TYPE_UINT, 0}, \ -{CONFIG_STRING_PRS_RESOURCE_SET_PERIOD0, NULL, 0, uptr:NULL, defuintval:0, TYPE_UINT, 0}, \ -{CONFIG_STRING_PRS_RESOURCE_SET_PERIOD1, NULL, 0, uptr:NULL, defuintval:0, TYPE_UINT, 0}, \ -{CONFIG_STRING_PRS_SYMBOL_START, NULL, 0, uptr:NULL, defuintval:0, TYPE_UINT, 0}, \ -{CONFIG_STRING_PRS_NUM_SYMBOLS, NULL, 0, uptr:NULL, defuintval:0, TYPE_UINT, 0}, \ -{CONFIG_STRING_PRS_NUM_RB, NULL, 0, uptr:NULL, defuintval:0, TYPE_UINT, 0}, \ -{CONFIG_STRING_PRS_RB_OFFSET, NULL, 0, uptr:NULL, defuintval:0, TYPE_UINT, 0}, \ -{CONFIG_STRING_PRS_COMB_SIZE, NULL, 0, uptr:NULL, defuintval:0, TYPE_UINT, 0}, \ -{CONFIG_STRING_PRS_RE_OFFSET, NULL, 0, uptr:NULL, defuintval:0, TYPE_UINT, 0}, \ -{CONFIG_STRING_PRS_RESOURCE_OFFSET, NULL, 0, uptr:NULL, defuintval:0, TYPE_UINT, 0}, \ -{CONFIG_STRING_PRS_RESOURCE_REPETITION, NULL, 0, uptr:NULL, defuintval:0, TYPE_UINT, 0}, \ -{CONFIG_STRING_PRS_RESOURCE_TIME_GAP, NULL, 0, uptr:NULL, defuintval:0, TYPE_UINT, 0}, \ -{CONFIG_STRING_PRS_ID, NULL, 0, uptr:NULL, defuintval:0, TYPE_UINT, 0} \ +{CONFIG_STRING_GNB_ID, NULL, 0, uptr:NULL, defuintval:0, TYPE_UINT, 0}, \ +{CONFIG_STRING_NUM_PRS_RESOURCES, NULL, 0, uptr:NULL, defuintval:0, TYPE_UINT, 0}, \ +{CONFIG_STRING_PRS_RESOURCE_SET_PERIOD_LIST, NULL, 0, uptr:NULL, defintarrayval:0, TYPE_UINTARRAY, 0}, \ +{CONFIG_STRING_PRS_SYMBOL_START_LIST, NULL, 0, uptr:NULL, defintarrayval:0, TYPE_UINTARRAY, 0}, \ +{CONFIG_STRING_PRS_NUM_SYMBOLS_LIST, NULL, 0, uptr:NULL, defintarrayval:0, TYPE_UINTARRAY, 0}, \ +{CONFIG_STRING_PRS_NUM_RB, NULL, 0, uptr:NULL, defuintval:0, TYPE_UINT, 0}, \ +{CONFIG_STRING_PRS_RB_OFFSET, NULL, 0, uptr:NULL, defuintval:0, TYPE_UINT, 0}, \ +{CONFIG_STRING_PRS_COMB_SIZE, NULL, 0, uptr:NULL, defuintval:0, TYPE_UINT, 0}, \ +{CONFIG_STRING_PRS_RE_OFFSET_LIST, NULL, 0, uptr:NULL, defintarrayval:0, TYPE_UINTARRAY, 0}, \ +{CONFIG_STRING_PRS_RESOURCE_OFFSET_LIST, NULL, 0, uptr:NULL, defintarrayval:0, TYPE_UINTARRAY, 0}, \ +{CONFIG_STRING_PRS_RESOURCE_REPETITION, NULL, 0, uptr:NULL, defuintval:0, TYPE_UINT, 0}, \ +{CONFIG_STRING_PRS_RESOURCE_TIME_GAP, NULL, 0, uptr:NULL, defuintval:0, TYPE_UINT, 0}, \ +{CONFIG_STRING_PRS_ID_LIST, NULL, 0, uptr:NULL, defintarrayval:0, TYPE_UINTARRAY, 0}, \ +{CONFIG_STRING_PRS_MUTING_PATTERN1_LIST, NULL, 0, uptr:NULL, defintarrayval:0, TYPE_UINTARRAY, 0}, \ +{CONFIG_STRING_PRS_MUTING_PATTERN2_LIST, NULL, 0, uptr:NULL, defintarrayval:0, TYPE_UINTARRAY, 0}, \ +{CONFIG_STRING_PRS_MUTING_BIT_REPETITION, NULL, 0, uptr:NULL, defuintval:0, TYPE_UINT, 0} \ } #define PRS_GNB_ID 0 -#define PRS_RESOURCE_SET_PERIOD0 1 -#define PRS_RESOURCE_SET_PERIOD1 2 -#define PRS_SYMBOL_START 3 -#define PRS_NUM_SYMBOLS 4 +#define NUM_PRS_RESOURCES 1 +#define PRS_RESOURCE_SET_PERIOD_LIST 2 +#define PRS_SYMBOL_START_LIST 3 +#define PRS_NUM_SYMBOLS_LIST 4 #define PRS_NUM_RB 5 #define PRS_RB_OFFSET 6 #define PRS_COMB_SIZE 7 -#define PRS_RE_OFFSET 8 -#define PRS_RESOURCE_OFFSET 9 +#define PRS_RE_OFFSET_LIST 8 +#define PRS_RESOURCE_OFFSET_LIST 9 #define PRS_RESOURCE_REPETITION 10 #define PRS_RESOURCE_TIME_GAP 11 -#define PRS_ID 12 +#define PRS_ID_LIST 12 +#define PRS_MUTING_PATTERN1_LIST 13 +#define PRS_MUTING_PATTERN2_LIST 14 +#define PRS_MUTING_BIT_REPETITION 15 /*----------------------------------------------------------------------------------------------------------------------------------------------------*/ #endif diff --git a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c index e7b6d4e514..e60e6a74f2 100644 --- a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c +++ b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c @@ -1278,7 +1278,7 @@ void RCconfig_nr_ue_L1(void) { void RCconfig_nrUE_prs(void *cfg) { - int j = 0, gNB_id = 0, prs_start = 0, prs_end = 0; + int j = 0, k = 0, gNB_id = 0, prs_start = 0, prs_end = 0; char aprefix[MAX_OPTNAME_SIZE*2 + 8]; PHY_VARS_NR_UE *ue = (PHY_VARS_NR_UE *)cfg; @@ -1298,45 +1298,86 @@ void RCconfig_nrUE_prs(void *cfg) if (PRS_ParamList.numelt > 0) { for (j = 0; j < PRS_ParamList.numelt; j++) { - gNB_id = *(PRS_ParamList.paramarray[j][PRS_GNB_ID].uptr); - ue->prs_vars[gNB_id]->prs_cfg.PRSResourceSetPeriod[0] = *(PRS_ParamList.paramarray[j][PRS_RESOURCE_SET_PERIOD0].uptr); - ue->prs_vars[gNB_id]->prs_cfg.PRSResourceSetPeriod[1] = *(PRS_ParamList.paramarray[j][PRS_RESOURCE_SET_PERIOD1].uptr); - ue->prs_vars[gNB_id]->prs_cfg.SymbolStart = *(PRS_ParamList.paramarray[j][PRS_SYMBOL_START].uptr); - ue->prs_vars[gNB_id]->prs_cfg.NumPRSSymbols = *(PRS_ParamList.paramarray[j][PRS_NUM_SYMBOLS].uptr); - ue->prs_vars[gNB_id]->prs_cfg.NumRB = *(PRS_ParamList.paramarray[j][PRS_NUM_RB].uptr); - ue->prs_vars[gNB_id]->prs_cfg.RBOffset = *(PRS_ParamList.paramarray[j][PRS_RB_OFFSET].uptr); - ue->prs_vars[gNB_id]->prs_cfg.CombSize = *(PRS_ParamList.paramarray[j][PRS_COMB_SIZE].uptr); - ue->prs_vars[gNB_id]->prs_cfg.REOffset = *(PRS_ParamList.paramarray[j][PRS_RE_OFFSET].uptr); - ue->prs_vars[gNB_id]->prs_cfg.PRSResourceOffset = *(PRS_ParamList.paramarray[j][PRS_RESOURCE_OFFSET].uptr); - ue->prs_vars[gNB_id]->prs_cfg.PRSResourceRepetition = *(PRS_ParamList.paramarray[j][PRS_RESOURCE_REPETITION].uptr); - ue->prs_vars[gNB_id]->prs_cfg.PRSResourceTimeGap = *(PRS_ParamList.paramarray[j][PRS_RESOURCE_TIME_GAP].uptr); - ue->prs_vars[gNB_id]->prs_cfg.NPRSID = *(PRS_ParamList.paramarray[j][PRS_ID].uptr); - if(gNB_id==0) + gNB_id = *(PRS_ParamList.paramarray[j][PRS_GNB_ID].uptr); + if(gNB_id != i) gNB_id = i; // force gNB_id to avoid mismatch + + ue->prs_vars[gNB_id]->NumPRSResources = *(PRS_ParamList.paramarray[j][NUM_PRS_RESOURCES].uptr); + for (k = 0; k < ue->prs_vars[gNB_id]->NumPRSResources; k++) { - prs_start = ue->prs_vars[gNB_id]->prs_cfg.SymbolStart; - prs_end = ue->prs_vars[gNB_id]->prs_cfg.SymbolStart+ue->prs_vars[gNB_id]->prs_cfg.NumPRSSymbols; - } - else - { - prs_start = MIN((prs_start), (ue->prs_vars[gNB_id]->prs_cfg.SymbolStart)); - prs_end = MAX((prs_end), (ue->prs_vars[gNB_id]->prs_cfg.SymbolStart+ue->prs_vars[gNB_id]->prs_cfg.NumPRSSymbols)); - } - LOG_I(PHY, "--------------------------\n"); - LOG_I(PHY, "PRS Config for gNB_id %d @ %p\n", gNB_id, &ue->prs_vars[gNB_id]->prs_cfg); - LOG_I(PHY, "--------------------------\n"); - LOG_I(PHY, "PRSResourceSetPeriod0 %d\n", ue->prs_vars[gNB_id]->prs_cfg.PRSResourceSetPeriod[0]); - LOG_I(PHY, "PRSResourceSetPeriod1 %d\n", ue->prs_vars[gNB_id]->prs_cfg.PRSResourceSetPeriod[1]); - LOG_I(PHY, "SymbolStart %d\n", ue->prs_vars[gNB_id]->prs_cfg.SymbolStart); - LOG_I(PHY, "NumPRSSymbols %d\n", ue->prs_vars[gNB_id]->prs_cfg.NumPRSSymbols); - LOG_I(PHY, "NumRB %d\n", ue->prs_vars[gNB_id]->prs_cfg.NumRB); - LOG_I(PHY, "RBOffset %d\n", ue->prs_vars[gNB_id]->prs_cfg.RBOffset); - LOG_I(PHY, "CombSize %d\n", ue->prs_vars[gNB_id]->prs_cfg.CombSize); - LOG_I(PHY, "REOffset %d\n", ue->prs_vars[gNB_id]->prs_cfg.REOffset); - LOG_I(PHY, "PRSResourceOffset %d\n", ue->prs_vars[gNB_id]->prs_cfg.PRSResourceOffset); - LOG_I(PHY, "PRSResourceRepetition %d\n", ue->prs_vars[gNB_id]->prs_cfg.PRSResourceRepetition); - LOG_I(PHY, "PRSResourceTimeGap %d\n", ue->prs_vars[gNB_id]->prs_cfg.PRSResourceTimeGap); - LOG_I(PHY, "NPRS_ID %d\n", ue->prs_vars[gNB_id]->prs_cfg.NPRSID); - LOG_I(PHY, "--------------------------\n"); + ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.PRSResourceSetPeriod[0] = PRS_ParamList.paramarray[j][PRS_RESOURCE_SET_PERIOD_LIST].uptr[0]; + ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.PRSResourceSetPeriod[1] = PRS_ParamList.paramarray[j][PRS_RESOURCE_SET_PERIOD_LIST].uptr[1]; + // per PRS resources parameters + ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.SymbolStart = PRS_ParamList.paramarray[j][PRS_SYMBOL_START_LIST].uptr[k]; + ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.NumPRSSymbols = PRS_ParamList.paramarray[j][PRS_NUM_SYMBOLS_LIST].uptr[k]; + ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.REOffset = PRS_ParamList.paramarray[j][PRS_RE_OFFSET_LIST].uptr[k]; + ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.NPRSID = PRS_ParamList.paramarray[j][PRS_ID_LIST].uptr[k]; + ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.PRSResourceOffset = PRS_ParamList.paramarray[j][PRS_RESOURCE_OFFSET_LIST].uptr[k]; + // Common parameters to all PRS resources + ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.NumRB = *(PRS_ParamList.paramarray[j][PRS_NUM_RB].uptr); + ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.RBOffset = *(PRS_ParamList.paramarray[j][PRS_RB_OFFSET].uptr); + ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.CombSize = *(PRS_ParamList.paramarray[j][PRS_COMB_SIZE].uptr); + ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.PRSResourceRepetition = *(PRS_ParamList.paramarray[j][PRS_RESOURCE_REPETITION].uptr); + ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.PRSResourceTimeGap = *(PRS_ParamList.paramarray[j][PRS_RESOURCE_TIME_GAP].uptr); + + ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.MutingBitRepetition = *(PRS_ParamList.paramarray[j][PRS_MUTING_BIT_REPETITION].uptr); + for (int l = 0; l < PRS_ParamList.paramarray[j][PRS_MUTING_PATTERN1_LIST].numelt; l++) + ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.MutingPattern1[l] = PRS_ParamList.paramarray[j][PRS_MUTING_PATTERN1_LIST].uptr[l]; + for (int l = 0; l < PRS_ParamList.paramarray[j][PRS_MUTING_PATTERN2_LIST].numelt; l++) + ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.MutingPattern2[l] = PRS_ParamList.paramarray[j][PRS_MUTING_PATTERN2_LIST].uptr[l]; + + if(gNB_id==0 && k==0) + { + prs_start = ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.SymbolStart; + prs_end = (ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.SymbolStart+ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.NumPRSSymbols)%NR_SYMBOLS_PER_SLOT; + } + else + { + prs_start = MIN((prs_start), (ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.SymbolStart)); + prs_end = MAX((prs_end), (ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.SymbolStart+ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.NumPRSSymbols)%NR_SYMBOLS_PER_SLOT); + } + } // for k + + k = 0; + LOG_I(PHY, "-----------------------------------------\n"); + LOG_I(PHY, "PRS Config for gNB_id %d @ %p\n", gNB_id, &ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg); + LOG_I(PHY, "-----------------------------------------\n"); + LOG_I(PHY, "NumPRSResources \t%d\n", ue->prs_vars[gNB_id]->NumPRSResources); + LOG_I(PHY, "PRSResourceSetPeriod \t[%d, %d]\n", ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.PRSResourceSetPeriod[0], ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.PRSResourceSetPeriod[1]); + LOG_I(PHY, "NumRB \t\t\t%d\n", ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.NumRB); + LOG_I(PHY, "RBOffset \t\t%d\n", ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.RBOffset); + LOG_I(PHY, "CombSize \t\t%d\n", ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.CombSize); + LOG_I(PHY, "PRSResourceRepetition \t%d\n", ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.PRSResourceRepetition); + LOG_I(PHY, "PRSResourceTimeGap \t%d\n", ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.PRSResourceTimeGap); + LOG_I(PHY, "MutingBitRepetition \t%d\n", ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.MutingBitRepetition); + LOG_I(PHY, "SymbolStart \t\t["); + for (k = 0; k < ue->prs_vars[gNB_id]->NumPRSResources; k++) + printf("%d, ", ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.SymbolStart); + printf("\b\b]\n"); + LOG_I(PHY, "NumPRSSymbols \t\t["); + for (k = 0; k < ue->prs_vars[gNB_id]->NumPRSResources; k++) + printf("%d, ", ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.NumPRSSymbols); + printf("\b\b]\n"); + LOG_I(PHY, "REOffset \t\t["); + for (k = 0; k < ue->prs_vars[gNB_id]->NumPRSResources; k++) + printf("%d, ", ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.REOffset); + printf("\b\b]\n"); + LOG_I(PHY, "PRSResourceOffset \t["); + for (k = 0; k < ue->prs_vars[gNB_id]->NumPRSResources; k++) + printf("%d, ", ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.PRSResourceOffset); + printf("\b\b]\n"); + LOG_I(PHY, "NPRS_ID \t\t["); + for (k = 0; k < ue->prs_vars[gNB_id]->NumPRSResources; k++) + printf("%d, ", ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.NPRSID); + printf("\b\b]\n"); + LOG_I(PHY, "MutingPattern1 \t\t["); + for (int l = 0, k = 0; l < PRS_ParamList.paramarray[j][PRS_MUTING_PATTERN1_LIST].numelt; l++) + printf("%d, ", ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.MutingPattern1[l]); + printf("\b\b]\n"); + LOG_I(PHY, "MutingPattern2 \t\t["); + for (int l = 0, k = 0; l < PRS_ParamList.paramarray[j][PRS_MUTING_PATTERN2_LIST].numelt; l++) + printf("%d, ", ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.MutingPattern2[l]); + printf("\b\b]\n"); + LOG_I(PHY, "-----------------------------------------\n"); } } else @@ -1347,4 +1388,5 @@ void RCconfig_nrUE_prs(void *cfg) ue->prs_start_symb = prs_start; ue->prs_end_symb = prs_end; LOG_I(PHY, "prs_active_gNBs %d, prs_start_symb %d, prs_end_symb %d\n", ue->prs_active_gNBs, ue->prs_start_symb, ue->prs_end_symb); + AssertFatal(prs_start <= prs_end, "Invalid PRS symbol allocation, please check the start and end symbols\n"); } diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf index 068d4291c3..482ff07163 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf @@ -217,18 +217,21 @@ MACRLCs = ( prs_config = ( { - PRSResourceSetPeriod0 = 40; - PRSResourceSetPeriod1 = 0; - SymbolStart = 7; - NumPRSSymbols = 4; - NumRB = 106; - RBOffset = 0; - CombSize = 4; - REOffset = 0; - PRSResourceOffset = 0; - PRSResourceRepetition = 1; - PRSResourceTimeGap = 1; - NPRS_ID = 0; + NumPRSResources = 2; + PRSResourceSetPeriod = [20, 5]; + SymbolStart = [7, 8]; + NumPRSSymbols = [5, 5]; + NumRB = 106; + RBOffset = 0; + CombSize = 4; + REOffset = [0, 1]; + PRSResourceOffset = [0, 1]; + PRSResourceRepetition = 1; + PRSResourceTimeGap = 1; + NPRS_ID = [0, 5]; + MutingPattern1 = []; + MutingPattern2 = []; + MutingBitRepetition = 1; } ); diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue_nr_prs.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue_nr_prs.conf index ada5d4fd57..8df47984d8 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue_nr_prs.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue_nr_prs.conf @@ -1,22 +1,25 @@ PRSs = ( { - Active_gNBs = 2; + Active_gNBs = 1; prs_config0 = ( { gNB_id = 0; - PRSResourceSetPeriod0 = 40; - PRSResourceSetPeriod1 = 0; - SymbolStart = 7; - NumPRSSymbols = 4; + NumPRSResources = 2; + PRSResourceSetPeriod = [20, 5]; + SymbolStart = [7, 8]; + NumPRSSymbols = [5, 5]; NumRB = 106; RBOffset = 0; CombSize = 4; - REOffset = 0; - PRSResourceOffset = 0; + REOffset = [0, 1]; + PRSResourceOffset = [0, 1]; PRSResourceRepetition = 1; PRSResourceTimeGap = 1; - NPRS_ID = 0; + NPRS_ID = [0, 5]; + MutingPattern1 = []; + MutingPattern2 = []; + MutingBitRepetition = 1; } ); @@ -35,6 +38,9 @@ PRSs = PRSResourceRepetition = 1; PRSResourceTimeGap = 1; NPRS_ID = 0; + MutingPattern1 = [0]; + MutingPattern2 = [0]; + MutingBitRepetition = 1; } ); } From 9af7987e75420335997d2c18c7c921aabadcae6a Mon Sep 17 00:00:00 2001 From: Sagar Parsawar Date: Sat, 7 May 2022 12:48:08 +0200 Subject: [PATCH 079/135] OAI UE: Cleaned up PRS buffer handling --- openair1/PHY/INIT/nr_init_ue.c | 6 +-- .../nr_dl_channel_estimation.c | 42 +++++++++---------- openair1/SCHED_NR_UE/phy_procedures_nr_ue.c | 6 +-- .../GENERIC-NR-5GC/CONF/ue_nr_prs.conf | 18 ++++---- 4 files changed, 34 insertions(+), 38 deletions(-) diff --git a/openair1/PHY/INIT/nr_init_ue.c b/openair1/PHY/INIT/nr_init_ue.c index 43bc62adf0..d75c845227 100644 --- a/openair1/PHY/INIT/nr_init_ue.c +++ b/openair1/PHY/INIT/nr_init_ue.c @@ -338,10 +338,10 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, AssertFatal((prs_vars[idx]->prs_resource[k].prs_meas!=NULL), "NR UE init: PRS measurements malloc failed for gNB_id %d\n", idx); for (i=0; inb_antennas_rx; i++) { - prs_vars[idx]->prs_resource[k].prs_ch_estimates[i] = (int32_t *)malloc16_clear(fp->ofdm_symbol_size*NR_SYMBOLS_PER_SLOT*sizeof(int32_t)); - prs_vars[idx]->prs_resource[k].prs_ch_estimates_time[i] = (int32_t *)malloc16_clear(fp->ofdm_symbol_size*NR_SYMBOLS_PER_SLOT*sizeof(int32_t)); + prs_vars[idx]->prs_resource[k].prs_ch_estimates[i] = (int32_t *)malloc16_clear(fp->ofdm_symbol_size*sizeof(int32_t)); + prs_vars[idx]->prs_resource[k].prs_ch_estimates_time[i] = (int32_t *)malloc16_clear(fp->ofdm_symbol_size*sizeof(int32_t)); AssertFatal(((prs_vars[idx]->prs_resource[k].prs_ch_estimates[i]!=NULL) || (prs_vars[idx]->prs_resource[k].prs_ch_estimates_time[i]!=NULL)), "NR UE init: PRS channel estimates malloc failed for rx_ant %d\n", i); - prs_vars[idx]->prs_resource[k].prs_meas[i] = (prs_meas_t *)malloc16_clear(NR_SYMBOLS_PER_SLOT*sizeof(prs_meas_t) ); + prs_vars[idx]->prs_resource[k].prs_meas[i] = (prs_meas_t *)malloc16_clear(sizeof(prs_meas_t) ); AssertFatal((prs_vars[idx]->prs_resource[k].prs_meas[i]!=NULL), "NR UE init: PRS measurements malloc failed for rx_ant %d\n", i); } } 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 6afdcfbac4..215e1fdc2e 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -240,7 +240,7 @@ int nr_prs_channel_estimation(uint8_t gNB_id, #endif // average out the SNR computed snr = snr/num_pilots; - prs_meas[rxAnt][l].snr = snr; + prs_meas[rxAnt]->snr = snr; } else if(prs_cfg->CombSize == 4) { @@ -384,7 +384,7 @@ int nr_prs_channel_estimation(uint8_t gNB_id, #endif // average out the SNR computed snr = snr/num_pilots; - prs_meas[rxAnt][l].snr = snr; + prs_meas[rxAnt]->snr = snr; } else { @@ -396,7 +396,6 @@ int nr_prs_channel_estimation(uint8_t gNB_id, } // for rxAnt } //for l - int16_t l = 0; //symbIdx for (rxAnt=0; rxAnt < frame_params->nb_antennas_rx; rxAnt++) { // scale by averaging factor 1/NumPrsSymbols @@ -423,9 +422,9 @@ int nr_prs_channel_estimation(uint8_t gNB_id, first_half = frame_params->ofdm_symbol_size - re_offset; second_half = (prs_cfg->NumRB*12) - first_half; if(first_half > 0) - memcpy((int16_t *)&prs_chestF[rxAnt][l*frame_params->ofdm_symbol_size+re_offset], &ch_tmp[0], first_half*sizeof(int32_t)); + memcpy((int16_t *)&prs_chestF[rxAnt][re_offset], &ch_tmp[0], first_half*sizeof(int32_t)); if(second_half > 0) - memcpy((int16_t *)&prs_chestF[rxAnt][l*frame_params->ofdm_symbol_size], &ch_tmp[(frame_params->ofdm_symbol_size - re_offset)<<1], second_half*sizeof(int32_t)); + memcpy((int16_t *)&prs_chestF[rxAnt][0], &ch_tmp[(first_half<<1)], second_half*sizeof(int32_t)); // Time domain IMPULSE response idft_size_idx_t idftsizeidx; @@ -472,39 +471,40 @@ int nr_prs_channel_estimation(uint8_t gNB_id, } idft(idftsizeidx, - (int16_t *)&prs_chestF[rxAnt][l*frame_params->ofdm_symbol_size], + (int16_t *)&prs_chestF[rxAnt][0], (int16_t *)&ch_tmp[0],1); // rearrange impulse response - memcpy((int16_t *)&prs_chestT[rxAnt][l*frame_params->ofdm_symbol_size], &ch_tmp[frame_params->ofdm_symbol_size], (frame_params->ofdm_symbol_size>>1)*sizeof(int32_t)); - memcpy((int16_t *)&prs_chestT[rxAnt][l*frame_params->ofdm_symbol_size + (frame_params->ofdm_symbol_size>>1)], &ch_tmp[0], (frame_params->ofdm_symbol_size>>1)*sizeof(int32_t)); + memcpy((int16_t *)&prs_chestT[rxAnt][0], &ch_tmp[frame_params->ofdm_symbol_size], (frame_params->ofdm_symbol_size>>1)*sizeof(int32_t)); + memcpy((int16_t *)&prs_chestT[rxAnt][(frame_params->ofdm_symbol_size>>1)], &ch_tmp[0], (frame_params->ofdm_symbol_size>>1)*sizeof(int32_t)); // peak estimator - peak_estimator(&prs_chestT[rxAnt][l*frame_params->ofdm_symbol_size], + peak_estimator(&prs_chestT[rxAnt][0], frame_params->ofdm_symbol_size, - &prs_meas[rxAnt][l].dl_toa, + &prs_meas[rxAnt]->dl_toa, &ch_pwr); - LOG_I(PHY, "[gNB %d][rsc %d][Rx %d][sfn %d][slot %d] ToA for PRS symbol %2d ==> %d / %d samples, peak channel power %.1f dB\n", gNB_id, rsc_id, rxAnt, proc->frame_rx, proc->nr_slot_rx, l, prs_meas[rxAnt][l].dl_toa-(frame_params->ofdm_symbol_size>>1), frame_params->ofdm_symbol_size, 10*log10(ch_pwr)); //prs measurements - prs_meas[rxAnt][l].gNB_id = gNB_id; - prs_meas[rxAnt][l].sfn = proc->frame_rx; - prs_meas[rxAnt][l].slot = proc->nr_slot_rx; - prs_meas[rxAnt][l].rxAnt_idx = rxAnt; - prs_meas[rxAnt][l].dl_aoa = 0; + prs_meas[rxAnt]->dl_toa -= (frame_params->ofdm_symbol_size>>1); + prs_meas[rxAnt]->gNB_id = gNB_id; + prs_meas[rxAnt]->sfn = proc->frame_rx; + prs_meas[rxAnt]->slot = proc->nr_slot_rx; + prs_meas[rxAnt]->rxAnt_idx = rxAnt; + prs_meas[rxAnt]->dl_aoa = 0; + LOG_I(PHY, "[gNB %d][rsc %d][Rx %d][sfn %d][slot %d] DL PRS ToA ==> %d / %d samples, peak channel power %.1f dB, SNR %+2d dB\n", gNB_id, rsc_id, rxAnt, proc->frame_rx, proc->nr_slot_rx, prs_meas[rxAnt]->dl_toa, frame_params->ofdm_symbol_size, 10*log10(ch_pwr), prs_meas[rxAnt]->snr); #ifdef DEBUG_PRS_CHEST sprintf(filename, "%s%i%s", "PRSpilot_", rxAnt, ".m"); LOG_M(filename, "prs_loc", &mod_prs[0], prs_cfg->NumRB*(12/prs_cfg->CombSize),1,1); sprintf(filename, "%s%i%s", "rxSigF_", rxAnt, ".m"); sprintf(varname, "%s%i", "rxF_", rxAnt); - LOG_M(filename, varname, &rxdataF[rxAnt][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], prs_cfg->NumPRSSymbols*frame_params->ofdm_symbol_size,1,1); + LOG_M(filename, varname, &rxdataF[rxAnt][0], prs_cfg->NumPRSSymbols*frame_params->ofdm_symbol_size,1,1); sprintf(filename, "%s%i%s", "prsChestF_", rxAnt, ".m"); sprintf(varname, "%s%i", "prsChF_", rxAnt); - LOG_M(filename, varname, &prs_chestF[rxAnt][l*frame_params->ofdm_symbol_size], frame_params->ofdm_symbol_size,1,1); + LOG_M(filename, varname, &prs_chestF[rxAnt][0], frame_params->ofdm_symbol_size,1,1); sprintf(filename, "%s%i%s", "prsChestT_", rxAnt, ".m"); sprintf(varname, "%s%i", "prsChT_", rxAnt); - LOG_M(filename, varname, &prs_chestT[rxAnt][l*frame_params->ofdm_symbol_size], frame_params->ofdm_symbol_size,1,1); + LOG_M(filename, varname, &prs_chestT[rxAnt][0], frame_params->ofdm_symbol_size,1,1); #endif // T tracer dump @@ -514,11 +514,11 @@ int nr_prs_channel_estimation(uint8_t gNB_id, T(T_UE_PHY_DL_CHANNEL_ESTIMATE_FREQ, T_INT(gNB_id), T_INT(proc->frame_rx), T_INT(proc->nr_slot_rx), - T_INT(rxAnt), T_BUFFER(&prs_chestF[rxAnt][l*frame_params->ofdm_symbol_size], prs_cfg->NumPRSSymbols*frame_params->ofdm_symbol_size*sizeof(int32_t))); + T_INT(rxAnt), T_BUFFER(&prs_chestF[rxAnt][0], frame_params->ofdm_symbol_size*sizeof(int32_t))); T(T_UE_PHY_DL_CHANNEL_ESTIMATE, T_INT(gNB_id), T_INT(proc->frame_rx), T_INT(proc->nr_slot_rx), - T_INT(rxAnt), T_BUFFER(&prs_chestT[rxAnt][l*frame_params->ofdm_symbol_size], prs_cfg->NumPRSSymbols*frame_params->ofdm_symbol_size*sizeof(int32_t))); + T_INT(rxAnt), T_BUFFER(&prs_chestT[rxAnt][0], frame_params->ofdm_symbol_size*sizeof(int32_t))); } free(ch_tmp); diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c index a112d273b5..4e472318a9 100644 --- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c +++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c @@ -1692,11 +1692,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue, nr_slot_rx); } - //PRS channel estimation - //for(int gIdx = 0; gIdx < ue->prs_active_gNBs; gIdx++) - { - nr_prs_channel_estimation(prs_gNB_id,rsc_id,ue,proc,fp); - } + nr_prs_channel_estimation(prs_gNB_id,rsc_id,ue,proc,fp); } if ((frame_rx%64 == 0) && (nr_slot_rx==0)) { diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue_nr_prs.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue_nr_prs.conf index 8df47984d8..044f5c6feb 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue_nr_prs.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue_nr_prs.conf @@ -26,20 +26,20 @@ PRSs = prs_config1 = ( { gNB_id = 1; - PRSResourceSetPeriod0 = 40; - PRSResourceSetPeriod1 = 0; - SymbolStart = 7; - NumPRSSymbols = 4; + NumPRSResources = 1; + PRSResourceSetPeriod = [20, 5]; + SymbolStart = [8]; + NumPRSSymbols = [5]; NumRB = 106; RBOffset = 0; CombSize = 4; - REOffset = 1; - PRSResourceOffset = 0; + REOffset = [1]; + PRSResourceOffset = [1]; PRSResourceRepetition = 1; PRSResourceTimeGap = 1; - NPRS_ID = 0; - MutingPattern1 = [0]; - MutingPattern2 = [0]; + NPRS_ID = [5]; + MutingPattern1 = []; + MutingPattern2 = []; MutingBitRepetition = 1; } ); From 9418fa84ce9d3def9b2182fc3dd19c1447089ced Mon Sep 17 00:00:00 2001 From: Sagar Parsawar Date: Sat, 7 May 2022 14:12:47 +0200 Subject: [PATCH 080/135] updated FR1 and FR2 PRS config files --- ...nb.sa.band257.fr2.128PRB.prs.usrpx310.conf | 17 ++++--- ...gnb.sa.band257.fr2.64PRB.prs.usrpx310.conf | 17 ++++--- ...gnb.sa.band78.fr1.106PRB.prs.usrpn310.conf | 17 ++++--- ...gnb.sa.band78.fr1.217PRB.prs.usrpx310.conf | 17 ++++--- .../CONF/ue.nr.prs.fr1.106prb.conf | 34 ++++++++------ .../CONF/ue.nr.prs.fr1.217prb.conf | 36 ++++++++------ .../CONF/ue.nr.prs.fr2.128prb.conf | 36 ++++++++------ .../CONF/ue.nr.prs.fr2.64prb.conf | 47 +++++++++++++++++++ .../CONF/ue.nr.prs.fr2.66prb.conf | 41 ---------------- 9 files changed, 149 insertions(+), 113 deletions(-) create mode 100644 targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr2.64prb.conf delete mode 100644 targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr2.66prb.conf diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band257.fr2.128PRB.prs.usrpx310.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band257.fr2.128PRB.prs.usrpx310.conf index 1aa33fb52c..10f77dcef5 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band257.fr2.128PRB.prs.usrpx310.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band257.fr2.128PRB.prs.usrpx310.conf @@ -216,18 +216,21 @@ MACRLCs = ( prs_config = ( { - PRSResourceSetPeriod0 = 40; - PRSResourceSetPeriod1 = 0; - SymbolStart = 7; - NumPRSSymbols = 7; + NumPRSResources = 1; + PRSResourceSetPeriod = [40, 0]; + SymbolStart = [7]; + NumPRSSymbols = [7]; NumRB = 128; RBOffset = 0; CombSize = 4; - REOffset = 0; - PRSResourceOffset = 0; + REOffset = [0]; + PRSResourceOffset = [0]; PRSResourceRepetition = 1; PRSResourceTimeGap = 1; - NPRS_ID = 0; + NPRS_ID = [0]; + MutingPattern1 = []; + MutingPattern2 = []; + MutingBitRepetition = 1; } ); diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band257.fr2.64PRB.prs.usrpx310.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band257.fr2.64PRB.prs.usrpx310.conf index 9f00f6b787..56bbc23ef0 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band257.fr2.64PRB.prs.usrpx310.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band257.fr2.64PRB.prs.usrpx310.conf @@ -216,18 +216,21 @@ MACRLCs = ( prs_config = ( { - PRSResourceSetPeriod0 = 40; - PRSResourceSetPeriod1 = 0; - SymbolStart = 7; - NumPRSSymbols = 7; + NumPRSResources = 1; + PRSResourceSetPeriod = [40, 0]; + SymbolStart = [7]; + NumPRSSymbols = [7]; NumRB = 64; RBOffset = 0; CombSize = 4; - REOffset = 0; - PRSResourceOffset = 0; + REOffset = [0]; + PRSResourceOffset = [0]; PRSResourceRepetition = 1; PRSResourceTimeGap = 1; - NPRS_ID = 0; + NPRS_ID = [0]; + MutingPattern1 = []; + MutingPattern2 = []; + MutingBitRepetition = 1; } ); diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.prs.usrpn310.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.prs.usrpn310.conf index 228b718bc6..c0912cd19d 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.prs.usrpn310.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.prs.usrpn310.conf @@ -217,18 +217,21 @@ MACRLCs = ( prs_config = ( { - PRSResourceSetPeriod0 = 40; - PRSResourceSetPeriod1 = 0; - SymbolStart = 7; - NumPRSSymbols = 7; + NumPRSResources = 1; + PRSResourceSetPeriod = [40, 0]; + SymbolStart = [7]; + NumPRSSymbols = [7]; NumRB = 106; RBOffset = 0; CombSize = 4; - REOffset = 0; - PRSResourceOffset = 0; + REOffset = [0]; + PRSResourceOffset = [0]; PRSResourceRepetition = 1; PRSResourceTimeGap = 1; - NPRS_ID = 0; + NPRS_ID = [0]; + MutingPattern1 = []; + MutingPattern2 = []; + MutingBitRepetition = 1; } ); diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.217PRB.prs.usrpx310.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.217PRB.prs.usrpx310.conf index 4b5052f2d3..c0642afba5 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.217PRB.prs.usrpx310.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.217PRB.prs.usrpx310.conf @@ -217,18 +217,21 @@ MACRLCs = ( prs_config = ( { - PRSResourceSetPeriod0 = 40; - PRSResourceSetPeriod1 = 0; - SymbolStart = 7; - NumPRSSymbols = 7; + NumPRSResources = 1; + PRSResourceSetPeriod = [40, 0]; + SymbolStart = [7]; + NumPRSSymbols = [7]; NumRB = 216; RBOffset = 0; CombSize = 4; - REOffset = 0; - PRSResourceOffset = 0; + REOffset = [0]; + PRSResourceOffset = [0]; PRSResourceRepetition = 1; PRSResourceTimeGap = 1; - NPRS_ID = 0; + NPRS_ID = [0]; + MutingPattern1 = []; + MutingPattern2 = []; + MutingBitRepetition = 1; } ); diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr1.106prb.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr1.106prb.conf index 38714e546e..04912424f2 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr1.106prb.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr1.106prb.conf @@ -5,36 +5,42 @@ PRSs = prs_config0 = ( { gNB_id = 0; - PRSResourceSetPeriod0 = 40; - PRSResourceSetPeriod1 = 0; - SymbolStart = 7; - NumPRSSymbols = 7; + NumPRSResources = 1; + PRSResourceSetPeriod = [40, 0]; + SymbolStart = [7]; + NumPRSSymbols = [7]; NumRB = 106; RBOffset = 0; CombSize = 4; - REOffset = 0; - PRSResourceOffset = 0; + REOffset = [0]; + PRSResourceOffset = [0]; PRSResourceRepetition = 1; PRSResourceTimeGap = 1; - NPRS_ID = 0; + NPRS_ID = [0]; + MutingPattern1 = []; + MutingPattern2 = []; + MutingBitRepetition = 1; } ); prs_config1 = ( { gNB_id = 1; - PRSResourceSetPeriod0 = 40; - PRSResourceSetPeriod1 = 0; - SymbolStart = 7; - NumPRSSymbols = 4; + NumPRSResources = 1; + PRSResourceSetPeriod = [40, 0]; + SymbolStart = [7]; + NumPRSSymbols = [7]; NumRB = 106; RBOffset = 0; CombSize = 4; - REOffset = 1; - PRSResourceOffset = 0; + REOffset = [1]; + PRSResourceOffset = [0]; PRSResourceRepetition = 1; PRSResourceTimeGap = 1; - NPRS_ID = 0; + NPRS_ID = [0]; + MutingPattern1 = []; + MutingPattern2 = []; + MutingBitRepetition = 1; } ); } diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr1.217prb.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr1.217prb.conf index e84aac5b6a..3c76026015 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr1.217prb.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr1.217prb.conf @@ -5,36 +5,42 @@ PRSs = prs_config0 = ( { gNB_id = 0; - PRSResourceSetPeriod0 = 40; - PRSResourceSetPeriod1 = 0; - SymbolStart = 7; - NumPRSSymbols = 7; + NumPRSResources = 1; + PRSResourceSetPeriod = [40, 0]; + SymbolStart = [7]; + NumPRSSymbols = [7]; NumRB = 216; RBOffset = 0; CombSize = 4; - REOffset = 0; - PRSResourceOffset = 0; + REOffset = [0]; + PRSResourceOffset = [0]; PRSResourceRepetition = 1; PRSResourceTimeGap = 1; - NPRS_ID = 0; + NPRS_ID = [0]; + MutingPattern1 = []; + MutingPattern2 = []; + MutingBitRepetition = 1; } ); prs_config1 = ( { gNB_id = 1; - PRSResourceSetPeriod0 = 40; - PRSResourceSetPeriod1 = 0; - SymbolStart = 7; - NumPRSSymbols = 4; - NumRB = 106; + NumPRSResources = 1; + PRSResourceSetPeriod = [40, 0]; + SymbolStart = [7]; + NumPRSSymbols = [4]; + NumRB = 216; RBOffset = 0; CombSize = 4; - REOffset = 1; - PRSResourceOffset = 0; + REOffset = [1]; + PRSResourceOffset = [0]; PRSResourceRepetition = 1; PRSResourceTimeGap = 1; - NPRS_ID = 0; + NPRS_ID = [5]; + MutingPattern1 = []; + MutingPattern2 = []; + MutingBitRepetition = 1; } ); } diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr2.128prb.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr2.128prb.conf index 27f30359b6..8619eca5f4 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr2.128prb.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr2.128prb.conf @@ -5,36 +5,42 @@ PRSs = prs_config0 = ( { gNB_id = 0; - PRSResourceSetPeriod0 = 40; - PRSResourceSetPeriod1 = 0; - SymbolStart = 7; - NumPRSSymbols = 7; + NumPRSResources = 1; + PRSResourceSetPeriod = [40, 0]; + SymbolStart = [7]; + NumPRSSymbols = [7]; NumRB = 128; RBOffset = 0; CombSize = 4; - REOffset = 0; - PRSResourceOffset = 0; + REOffset = [0]; + PRSResourceOffset = [0]; PRSResourceRepetition = 1; PRSResourceTimeGap = 1; - NPRS_ID = 0; + NPRS_ID = [0]; + MutingPattern1 = []; + MutingPattern2 = []; + MutingBitRepetition = 1; } ); prs_config1 = ( { gNB_id = 1; - PRSResourceSetPeriod0 = 40; - PRSResourceSetPeriod1 = 0; - SymbolStart = 7; - NumPRSSymbols = 4; - NumRB = 106; + NumPRSResources = 1; + PRSResourceSetPeriod = [40, 0]; + SymbolStart = [7]; + NumPRSSymbols = [4]; + NumRB = 128; RBOffset = 0; CombSize = 4; - REOffset = 1; - PRSResourceOffset = 0; + REOffset = [1]; + PRSResourceOffset = [0]; PRSResourceRepetition = 1; PRSResourceTimeGap = 1; - NPRS_ID = 0; + NPRS_ID = [5]; + MutingPattern1 = []; + MutingPattern2 = []; + MutingBitRepetition = 1; } ); } diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr2.64prb.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr2.64prb.conf new file mode 100644 index 0000000000..2d04955726 --- /dev/null +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr2.64prb.conf @@ -0,0 +1,47 @@ +PRSs = +( + { + Active_gNBs = 1; + prs_config0 = ( + { + gNB_id = 0; + NumPRSResources = 1; + PRSResourceSetPeriod = [40, 0]; + SymbolStart = [7]; + NumPRSSymbols = [7]; + NumRB = 64; + RBOffset = 0; + CombSize = 4; + REOffset = [0]; + PRSResourceOffset = [0]; + PRSResourceRepetition = 1; + PRSResourceTimeGap = 1; + NPRS_ID = [0]; + MutingPattern1 = []; + MutingPattern2 = []; + MutingBitRepetition = 1; + } + ); + + prs_config1 = ( + { + gNB_id = 1; + NumPRSResources = 1; + PRSResourceSetPeriod = [40, 0]; + SymbolStart = [7]; + NumPRSSymbols = [4]; + NumRB = 64; + RBOffset = 0; + CombSize = 4; + REOffset = [1]; + PRSResourceOffset = [0]; + PRSResourceRepetition = 1; + PRSResourceTimeGap = 1; + NPRS_ID = [5]; + MutingPattern1 = []; + MutingPattern2 = []; + MutingBitRepetition = 1; + } + ); + } +); diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr2.66prb.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr2.66prb.conf deleted file mode 100644 index a1c129348a..0000000000 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr2.66prb.conf +++ /dev/null @@ -1,41 +0,0 @@ -PRSs = -( - { - Active_gNBs = 1; - prs_config0 = ( - { - gNB_id = 0; - PRSResourceSetPeriod0 = 40; - PRSResourceSetPeriod1 = 0; - SymbolStart = 7; - NumPRSSymbols = 7; - NumRB = 64; - RBOffset = 0; - CombSize = 4; - REOffset = 0; - PRSResourceOffset = 0; - PRSResourceRepetition = 1; - PRSResourceTimeGap = 1; - NPRS_ID = 0; - } - ); - - prs_config1 = ( - { - gNB_id = 1; - PRSResourceSetPeriod0 = 40; - PRSResourceSetPeriod1 = 0; - SymbolStart = 7; - NumPRSSymbols = 4; - NumRB = 106; - RBOffset = 0; - CombSize = 4; - REOffset = 1; - PRSResourceOffset = 0; - PRSResourceRepetition = 1; - PRSResourceTimeGap = 1; - NPRS_ID = 0; - } - ); - } -); From 0bc6b0bdce5b851e0ce2bfd6d6c9ca04a33c1240 Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Mon, 9 May 2022 14:20:18 +0200 Subject: [PATCH 081/135] revisiting the initialization of the future_ul_tti_request when gps sync is used --- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c index 57a7fe7c4d..ee0ea94a85 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c @@ -69,7 +69,7 @@ void clear_nr_nfapi_information(gNB_MAC_INST * gNB, nfapi_nr_dl_tti_request_t *DL_req = &gNB->DL_req[0]; nfapi_nr_dl_tti_pdcch_pdu_rel15_t ***pdcch = (nfapi_nr_dl_tti_pdcch_pdu_rel15_t ***)gNB->pdcch_pdu_idx[CC_idP]; nfapi_nr_ul_tti_request_t *future_ul_tti_req = - &gNB->UL_tti_req_ahead[CC_idP][(slotP+6)]; // + num_slots - 1) % num_slots]; + &gNB->UL_tti_req_ahead[CC_idP][(slotP)]; // + num_slots - 1) % num_slots]; nfapi_nr_ul_dci_request_t *UL_dci_req = &gNB->UL_dci_req[0]; nfapi_nr_tx_data_request_t *TX_req = &gNB->TX_req[0]; @@ -87,7 +87,7 @@ void clear_nr_nfapi_information(gNB_MAC_INST * gNB, UL_dci_req[CC_idP].numPdus = 0; /* advance last round's future UL_tti_req to be ahead of current frame/slot */ - future_ul_tti_req->SFN = ((slotP+6SFN = frameP; //(slotP == 0 ? frameP : frameP + 1) % 1024; LOG_D(MAC,"Future_ul_tti SFN = %d for slot %d \n", future_ul_tti_req->SFN, (slotP + num_slots - 1) % num_slots); /* future_ul_tti_req->Slot is fixed! */ future_ul_tti_req->n_pdus = 0; From 6b08c43ae8bf8a07d6f7cc25ef141f6724d5e423 Mon Sep 17 00:00:00 2001 From: Sagar Parsawar Date: Fri, 6 May 2022 14:10:54 +0200 Subject: [PATCH 082/135] Added 2gNB config for PRS --- .../gnb.sa.band78.fr1.106PRB.usrpb210.conf2 | 320 ++++++++++++++++++ 1 file changed, 320 insertions(+) create mode 100644 targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf2 diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf2 b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf2 new file mode 100644 index 0000000000..3be2d2cdc0 --- /dev/null +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf2 @@ -0,0 +1,320 @@ +Active_gNBs = ( "gNB-OAI"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +gNBs = +( + { + ////////// Identification parameters: + gNB_ID = 0xe00; + gNB_name = "gNB-OAI"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = 1; + plmn_list = ({ + mcc = 208; + mnc = 99; + mnc_length = 2; + snssaiList = ( + { + sst = 1; + sd = 0x1; // 0 false, else true + }, + { + sst = 1; + sd = 0x112233; // 0 false, else true + } + ); + + }); + + nr_cellid = 12345678L; + + ////////// Physical parameters: + + ssb_SubcarrierOffset = 0; + pdsch_AntennaPorts = 1; + pusch_AntennaPorts = 1; + sib1_tda = 0; + + pdcch_ConfigSIB1 = ( + { + controlResourceSetZero = 12; + searchSpaceZero = 0; + } + ); + + + servingCellConfigCommon = ( + { + #spCellConfigCommon + + physCellId = 2; + +# 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; + + #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, + + 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 : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + + ////////// AMF parameters: + amf_ip_address = ( { ipv4 = "192.168.70.132"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + + NETWORK_INTERFACES : + { + GNB_INTERFACE_NAME_FOR_NG_AMF = "demo-oai"; + GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.70.129/24"; + GNB_INTERFACE_NAME_FOR_NGU = "demo-oai"; + GNB_IPV4_ADDRESS_FOR_NGU = "192.168.70.129/24"; + GNB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + } +); + +MACRLCs = ( +{ + num_cc = 1; + tr_s_preference = "local_L1"; + tr_n_preference = "local_RRC"; + pusch_TargetSNRx10 = 150; + pucch_TargetSNRx10 = 200; + ulsch_max_frame_inactivity = 1; +} +); + +prs_config = ( +{ + NumPRSResources = 2; + PRSResourceSetPeriod = [20, 5]; + SymbolStart = [7, 8]; + NumPRSSymbols = [5, 5]; + NumRB = 106; + RBOffset = 0; + CombSize = 4; + REOffset = [2, 3]; + PRSResourceOffset = [0, 1]; + PRSResourceRepetition = 1; + PRSResourceTimeGap = 1; + NPRS_ID = [2, 6]; + MutingPattern1 = []; + MutingPattern2 = []; +} +); + +L1s = ( +{ + num_cc = 1; + tr_n_preference = "local_mac"; + pusch_proc_threads = 8; + prach_dtx_threshold = 120; + pucch0_dtx_threshold = 150; + ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0 +} +); + +RUs = ( +{ + local_rf = "yes" + nb_tx = 1 + nb_rx = 1 + att_tx = 0 + att_rx = 0; + bands = [78]; + max_pdschReferenceSignalPower = -27; + max_rxgain = 114; + sf_extension = 0; + eNB_instances = [0]; + #beamforming 1x4 matrix: + bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000]; + clock_src = "internal"; +} +); + +THREAD_STRUCT = ( +{ + #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT" + parallel_config = "PARALLEL_SINGLE_THREAD"; + #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE" + worker_config = "WORKER_ENABLE"; +} +); + +rfsimulator : +{ + serveraddr = "server"; + serverport = "4043"; + options = (); #("saviq"); or/and "chanmod" + modelname = "AWGN"; + IQfile = "/tmp/rfsimulator.iqs"; +}; + +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"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + ngap_log_level ="debug"; + ngap_log_verbosity ="medium"; +}; + From e7671506d10130e5beda7a003cd9fe75d4973d54 Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Mon, 9 May 2022 15:38:33 +0200 Subject: [PATCH 083/135] config files for 273PRB for 2gNBs --- openair1/SCHED_NR/phy_procedures_nr_gNB.c | 2 +- ...gnb.sa.band78.fr1.273PRB.prs.usrpn310.conf | 21 +- ...nb.sa.band78.fr1.273PRB.prs.usrpn310.conf2 | 322 ++++++++++++++++++ 3 files changed, 335 insertions(+), 10 deletions(-) create mode 100644 targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.prs.usrpn310.conf2 diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index 05843b21c4..71eb7c2cad 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -173,7 +173,7 @@ void phy_procedures_gNB_TX(processingData_L1tx_t *msgTx, is_prs_slot = check_prs_slot_gNB(&rsc_id, &gNB->prs_vars, slot); if(is_prs_slot) { - LOG_I(PHY,"gNB_TX: frame %d, slot %d, slots_per_frame %d, PRS Resource ID %d\n",frame,slot, fp->slots_per_frame, rsc_id); + LOG_D(PHY,"gNB_TX: frame %d, slot %d, slots_per_frame %d, PRS Resource ID %d\n",frame,slot, fp->slots_per_frame, rsc_id); nr_generate_prs(gNB->nr_gold_prs[slot],&gNB->common_vars.txdataF[0][txdataF_offset], AMP, &gNB->prs_vars.prs_cfg[rsc_id], cfg, fp); } diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.prs.usrpn310.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.prs.usrpn310.conf index c223bb78c6..605a4afdb2 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.prs.usrpn310.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.prs.usrpn310.conf @@ -217,18 +217,21 @@ MACRLCs = ( prs_config = ( { - PRSResourceSetPeriod0 = 40; - PRSResourceSetPeriod1 = 0; - SymbolStart = 7; - NumPRSSymbols = 7; - NumRB = 272; + NumPRSResources = 1; + PRSResourceSetPeriod = [40, 0]; + SymbolStart = [7]; + NumPRSSymbols = [7]; + NumRB = 240; RBOffset = 0; CombSize = 4; - REOffset = 0; - PRSResourceOffset = 0; + REOffset = [0]; + PRSResourceOffset = [0]; PRSResourceRepetition = 1; PRSResourceTimeGap = 1; - NPRS_ID = 0; + NPRS_ID = [0]; + MutingPattern1 = []; + MutingPattern2 = []; + MutingBitRepetition = 1; } ); @@ -258,7 +261,7 @@ RUs = ( #beamforming 1x4 matrix: bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000]; #clock_src = "internal"; - sdr_addrs = "addr=192.168.10.2,second_addr=192.168.20.2,clock_source=external,time_source=external" + sdr_addrs = "addr=192.168.10.2,clock_source=gpsdo,time_source=gpsdo" } ); diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.prs.usrpn310.conf2 b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.prs.usrpn310.conf2 new file mode 100644 index 0000000000..ef3b6fca6e --- /dev/null +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.prs.usrpn310.conf2 @@ -0,0 +1,322 @@ +Active_gNBs = ( "gNB-OAI"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +gNBs = +( + { + ////////// Identification parameters: + gNB_ID = 0xe00; + gNB_name = "gNB-OAI"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = 1; + plmn_list = ({ + mcc = 208; + mnc = 99; + mnc_length = 2; + snssaiList = ( + { + sst = 1; + sd = 0x1; // 0 false, else true + }, + { + sst = 1; + sd = 0x112233; // 0 false, else true + } + ); + + }); + + nr_cellid = 12345678L; + + ////////// Physical parameters: + + ssb_SubcarrierOffset = 0; + pdsch_AntennaPorts = 1; + pusch_AntennaPorts = 1; + sib1_tda = 0; + + pdcch_ConfigSIB1 = ( + { + controlResourceSetZero = 12; + searchSpaceZero = 0; + } + ); + + + servingCellConfigCommon = ( + { + #spCellConfigCommon + + physCellId = 1; + +# downlinkConfigCommon + #frequencyInfoDL + # this is 3600 MHz + 43 PRBs@30kHz SCS (same as initial BWP) + absoluteFrequencySSB = 650000; + dl_frequencyBand = 78; + # this is 3600 MHz + dl_absoluteFrequencyPointA = 646736; + #scs-SpecificCarrierList + dl_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + dl_subcarrierSpacing = 1; + dl_carrierBandwidth = 273; + #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; + + #uplinkConfigCommon + #frequencyInfoUL + ul_frequencyBand = 78; + #scs-SpecificCarrierList + ul_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + ul_subcarrierSpacing = 1; + ul_carrierBandwidth = 273; + 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, + + 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 = 2; + +# 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 : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + + ////////// AMF parameters: + amf_ip_address = ( { ipv4 = "192.168.70.132"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + + NETWORK_INTERFACES : + { + GNB_INTERFACE_NAME_FOR_NG_AMF = "demo-oai"; + GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.70.129/24"; + GNB_INTERFACE_NAME_FOR_NGU = "demo-oai"; + GNB_IPV4_ADDRESS_FOR_NGU = "192.168.70.129/24"; + GNB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + } +); + +MACRLCs = ( +{ + num_cc = 1; + tr_s_preference = "local_L1"; + tr_n_preference = "local_RRC"; + pusch_TargetSNRx10 = 150; + pucch_TargetSNRx10 = 200; + ulsch_max_frame_inactivity = 1; +} +); + +prs_config = ( +{ + NumPRSResources = 1; + PRSResourceSetPeriod = [40, 0]; + SymbolStart = [7]; + NumPRSSymbols = [7]; + NumRB = 240; + RBOffset = 0; + CombSize = 4; + REOffset = [1]; + PRSResourceOffset = [0]; + PRSResourceRepetition = 1; + PRSResourceTimeGap = 1; + NPRS_ID = [1]; + MutingPattern1 = []; + MutingPattern2 = []; + MutingBitRepetition = 1; +} +); + +L1s = ( +{ + num_cc = 1; + tr_n_preference = "local_mac"; + pusch_proc_threads = 8; + prach_dtx_threshold = 120; + pucch0_dtx_threshold = 150; + ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0 +} +); + +RUs = ( +{ + local_rf = "yes" + nb_tx = 1 + nb_rx = 1 + att_tx = 0 + att_rx = 0; + bands = [78]; + max_pdschReferenceSignalPower = -27; + max_rxgain = 114; + sf_extension = 0; + eNB_instances = [0]; + #beamforming 1x4 matrix: + bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000]; + #clock_src = "internal"; + sdr_addrs = "addr=192.168.20.2,clock_source=gpsdo,time_source=gpsdo" +} +); + +THREAD_STRUCT = ( +{ + #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT" + parallel_config = "PARALLEL_SINGLE_THREAD"; + #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE" + worker_config = "WORKER_ENABLE"; +} +); + +rfsimulator : +{ + serveraddr = "server"; + serverport = "4043"; + options = (); #("saviq"); or/and "chanmod" + modelname = "AWGN"; + IQfile = "/tmp/rfsimulator.iqs"; +}; + +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"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + ngap_log_level ="debug"; + ngap_log_verbosity ="medium"; +}; + From f67a38473acf74644dc61d7e7fcceaf2bd6db573 Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Wed, 11 May 2022 05:20:12 +0200 Subject: [PATCH 084/135] reverting init of future_ul_tti_req to develop version --- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c index ee0ea94a85..5988e8b1ee 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c @@ -69,7 +69,7 @@ void clear_nr_nfapi_information(gNB_MAC_INST * gNB, nfapi_nr_dl_tti_request_t *DL_req = &gNB->DL_req[0]; nfapi_nr_dl_tti_pdcch_pdu_rel15_t ***pdcch = (nfapi_nr_dl_tti_pdcch_pdu_rel15_t ***)gNB->pdcch_pdu_idx[CC_idP]; nfapi_nr_ul_tti_request_t *future_ul_tti_req = - &gNB->UL_tti_req_ahead[CC_idP][(slotP)]; // + num_slots - 1) % num_slots]; + &gNB->UL_tti_req_ahead[CC_idP][(slotP + num_slots - 1) % num_slots]; nfapi_nr_ul_dci_request_t *UL_dci_req = &gNB->UL_dci_req[0]; nfapi_nr_tx_data_request_t *TX_req = &gNB->TX_req[0]; @@ -87,7 +87,7 @@ void clear_nr_nfapi_information(gNB_MAC_INST * gNB, UL_dci_req[CC_idP].numPdus = 0; /* advance last round's future UL_tti_req to be ahead of current frame/slot */ - future_ul_tti_req->SFN = frameP; //(slotP == 0 ? frameP : frameP + 1) % 1024; + future_ul_tti_req->SFN = (slotP == 0 ? frameP : frameP + 1) % 1024; LOG_D(MAC,"Future_ul_tti SFN = %d for slot %d \n", future_ul_tti_req->SFN, (slotP + num_slots - 1) % num_slots); /* future_ul_tti_req->Slot is fixed! */ future_ul_tti_req->n_pdus = 0; From f2c60f446e018e0d4470df3b34c22a60c7d51e20 Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Tue, 10 May 2022 17:59:10 +0200 Subject: [PATCH 085/135] Remove assert for frame/slot checking in future_ul_tti_req --- .../LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c | 20 ++++++++++++------- .../LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c | 20 +++++++++++-------- 2 files changed, 25 insertions(+), 15 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c index ca641ed1ba..8b949a615e 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c @@ -47,13 +47,19 @@ void nr_fill_nfapi_pucch(module_id_t mod_id, nfapi_nr_ul_tti_request_t *future_ul_tti_req = &RC.nrmac[mod_id]->UL_tti_req_ahead[0][pucch->ul_slot]; - AssertFatal(future_ul_tti_req->SFN == pucch->frame - && future_ul_tti_req->Slot == pucch->ul_slot, - "future UL_tti_req's frame.slot %d.%d does not match PUCCH %d.%d\n", - future_ul_tti_req->SFN, - future_ul_tti_req->Slot, - pucch->frame, - pucch->ul_slot); + + if (future_ul_tti_req->SFN != pucch->frame || future_ul_tti_req->Slot != pucch->ul_slot) + LOG_W(MAC, + "Current %d.%d : future UL_tti_req's frame.slot %4d.%2d does not match PUCCH %4d.%2d\n", + frame,slot, + future_ul_tti_req->SFN, + future_ul_tti_req->Slot, + pucch->frame, + pucch->ul_slot); + AssertFatal(future_ul_tti_req->n_pdus < + sizeof(future_ul_tti_req->pdus_list) / sizeof(future_ul_tti_req->pdus_list[0]), + "Invalid future_ul_tti_req->n_pdus %d\n", future_ul_tti_req->n_pdus); + future_ul_tti_req->pdus_list[future_ul_tti_req->n_pdus].pdu_type = NFAPI_NR_UL_CONFIG_PUCCH_PDU_TYPE; future_ul_tti_req->pdus_list[future_ul_tti_req->n_pdus].pdu_size = sizeof(nfapi_nr_pucch_pdu_t); nfapi_nr_pucch_pdu_t *pucch_pdu = &future_ul_tti_req->pdus_list[future_ul_tti_req->n_pdus].pucch_pdu; diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c index bde6c6109d..1bfd1b179b 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c @@ -1547,14 +1547,18 @@ void nr_schedule_ulsch(module_id_t module_id, frame_t frame, sub_frame_t slot) /* PUSCH in a later slot, but corresponding DCI now! */ nfapi_nr_ul_tti_request_t *future_ul_tti_req = &RC.nrmac[module_id]->UL_tti_req_ahead[0][sched_pusch->slot]; - AssertFatal(future_ul_tti_req->SFN == sched_pusch->frame - && future_ul_tti_req->Slot == sched_pusch->slot, - "%d.%d future UL_tti_req's frame.slot %d.%d does not match PUSCH %d.%d\n", - frame, slot, - future_ul_tti_req->SFN, - future_ul_tti_req->Slot, - sched_pusch->frame, - sched_pusch->slot); + if (future_ul_tti_req->SFN != sched_pusch->frame || future_ul_tti_req->Slot != sched_pusch->slot) + LOG_W(MAC, + "%d.%d future UL_tti_req's frame.slot %d.%d does not match PUSCH %d.%d\n", + frame, slot, + future_ul_tti_req->SFN, + future_ul_tti_req->Slot, + sched_pusch->frame, + sched_pusch->slot); + AssertFatal(future_ul_tti_req->n_pdus < + sizeof(future_ul_tti_req->pdus_list) / sizeof(future_ul_tti_req->pdus_list[0]), + "Invalid future_ul_tti_req->n_pdus %d\n", future_ul_tti_req->n_pdus); + future_ul_tti_req->pdus_list[future_ul_tti_req->n_pdus].pdu_type = NFAPI_NR_UL_CONFIG_PUSCH_PDU_TYPE; future_ul_tti_req->pdus_list[future_ul_tti_req->n_pdus].pdu_size = sizeof(nfapi_nr_pusch_pdu_t); nfapi_nr_pusch_pdu_t *pusch_pdu = &future_ul_tti_req->pdus_list[future_ul_tti_req->n_pdus].pusch_pdu; From b6e2f0e0c9e57e28bc28af9703dd6c578c102460 Mon Sep 17 00:00:00 2001 From: Sagar Parsawar Date: Wed, 18 May 2022 16:50:35 +0200 Subject: [PATCH 086/135] gps time sync improvements --- targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp index 5d5e6820ff..b4d7ba0410 100644 --- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp +++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp @@ -201,10 +201,21 @@ static int sync_to_gps(openair0_device *device) { LOG_W(HW,"WARNING: GPS not locked - time will not be accurate until locked\n"); } + //wait for next pps + uhd::time_spec_t last = s->usrp->get_time_last_pps(); + uhd::time_spec_t next = s->usrp->get_time_last_pps(); + while(next == last) { + boost::this_thread::sleep(boost::posix_time::milliseconds(50)); + last = next; + next = s->usrp->get_time_last_pps(); + } + boost::this_thread::sleep(boost::posix_time::milliseconds(200)); + //Set to GPS time uhd::time_spec_t gps_time = uhd::time_spec_t(time_t(s->usrp->get_mboard_sensor("gps_time", mboard).to_int())); s->usrp->set_time_next_pps(gps_time+1.0, mboard); //s->usrp->set_time_next_pps(uhd::time_spec_t(0.0)); + //Wait for it to apply //The wait is 2 seconds because N-Series has a known issue where //the time at the last PPS does not properly update at the PPS edge From 68dd4fa20b61d713a03cf083347ab537a00cd5fb Mon Sep 17 00:00:00 2001 From: rakesh mundlamuri Date: Thu, 19 May 2022 12:41:20 +0200 Subject: [PATCH 087/135] introducing the selection of tx and rx subdev --- executables/nr-ru.c | 10 ++++++++++ openair2/ENB_APP/enb_paramdef.h | 6 ++++++ targets/ARCH/COMMON/common_lib.h | 4 ++++ targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp | 10 +++++++++- 4 files changed, 29 insertions(+), 1 deletion(-) diff --git a/executables/nr-ru.c b/executables/nr-ru.c index cac5b5d66a..1cad34145a 100644 --- a/executables/nr-ru.c +++ b/executables/nr-ru.c @@ -2057,6 +2057,16 @@ static void NRRCconfig_RU(void) { RC.ru[j]->openair0_cfg.sdr_addrs = strdup(*(RUParamList.paramarray[j][RU_SDR_ADDRS].strptr)); } + if (config_isparamset(RUParamList.paramarray[j], RU_TX_SUBDEV)) { + RC.ru[j]->openair0_cfg.tx_subdev = strdup(*(RUParamList.paramarray[j][RU_TX_SUBDEV].strptr)); + LOG_I(PHY, "RU USRP tx subdev == %s\n", RC.ru[j]->openair0_cfg.tx_subdev); + } + + if (config_isparamset(RUParamList.paramarray[j], RU_RX_SUBDEV)) { + RC.ru[j]->openair0_cfg.rx_subdev = strdup(*(RUParamList.paramarray[j][RU_RX_SUBDEV].strptr)); + LOG_I(PHY, "RU USRP rx subdev == %s\n", RC.ru[j]->openair0_cfg.rx_subdev); + } + if (config_isparamset(RUParamList.paramarray[j], RU_SDR_CLK_SRC)) { if (strcmp(*(RUParamList.paramarray[j][RU_SDR_CLK_SRC].strptr), "internal") == 0) { RC.ru[j]->openair0_cfg.clock_source = internal; diff --git a/openair2/ENB_APP/enb_paramdef.h b/openair2/ENB_APP/enb_paramdef.h index e6e97069fa..50ee4341ee 100644 --- a/openair2/ENB_APP/enb_paramdef.h +++ b/openair2/ENB_APP/enb_paramdef.h @@ -103,6 +103,8 @@ typedef enum { #define CONFIG_STRING_RU_SL_AHEAD "sl_ahead" #define CONFIG_STRING_RU_NR_FLAG "nr_flag" #define CONFIG_STRING_RU_NR_SCS_FOR_RASTER "nr_scs_for_raster" +#define CONFIG_STRING_RU_TX_SUBDEV "tx_subdev" +#define CONFIG_STRING_RU_RX_SUBDEV "rx_subdev" #define HLP_RU_SF_AHEAD "LTE TX processing advance" #define HLP_RU_SL_AHEAD "NR TX processing advance" @@ -142,6 +144,8 @@ typedef enum { #define RU_SL_AHEAD 30 #define RU_NR_FLAG 31 #define RU_NR_SCS_FOR_RASTER 32 +#define RU_TX_SUBDEV 33 +#define RU_RX_SUBDEV 34 /*-----------------------------------------------------------------------------------------------------------------------------------------*/ /* RU configuration parameters */ /* optname helpstr paramflags XXXptr defXXXval type numelt */ @@ -180,6 +184,8 @@ typedef enum { {CONFIG_STRING_RU_SL_AHEAD, HLP_RU_SL_AHEAD, 0, iptr:NULL, defintval:6, TYPE_INT, 0}, \ {CONFIG_STRING_RU_NR_FLAG, HLP_RU_NR_FLAG, 0, iptr:NULL, defintval:0, TYPE_INT, 0}, \ {CONFIG_STRING_RU_NR_SCS_FOR_RASTER, HLP_RU_NR_SCS_FOR_RASTER, 0, iptr:NULL, defintval:1, TYPE_INT, 0}, \ + {CONFIG_STRING_RU_TX_SUBDEV, NULL, 0, strptr:NULL, defstrval:"", TYPE_STRING, 0}, \ + {CONFIG_STRING_RU_RX_SUBDEV, NULL, 0, strptr:NULL, defstrval:"", TYPE_STRING, 0}, \ } /*---------------------------------------------------------------------------------------------------------------------------------------*/ diff --git a/targets/ARCH/COMMON/common_lib.h b/targets/ARCH/COMMON/common_lib.h index 95e5e3ed03..fecc4abb63 100644 --- a/targets/ARCH/COMMON/common_lib.h +++ b/targets/ARCH/COMMON/common_lib.h @@ -178,6 +178,10 @@ typedef struct { int rx_num_channels; //! number of TX channels (=TX antennas) int tx_num_channels; + //! rx daughter card + char* rx_subdev; + //! tx daughter card + char* tx_subdev; //! \brief RX base addresses for mmapped_dma int32_t *rxbase[4]; //! \brief TX base addresses for mmapped_dma diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp index b4d7ba0410..07162415d2 100644 --- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp +++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp @@ -1021,7 +1021,7 @@ extern "C" { sscanf(uhd::get_version_string().c_str(),"%d.%d.%d",&vers,&subvers,&subsubvers); LOG_I(HW,"UHD version %s (%d.%d.%d)\n", uhd::get_version_string().c_str(),vers,subvers,subsubvers); - std::string args; + std::string args,tx_subdev,rx_subdev; if (openair0_cfg[0].sdr_addrs == NULL) { args = "type=b200"; @@ -1347,6 +1347,13 @@ extern "C" { LOG_D(HW, "usrp->get_tx_num_channels() == %zd\n", s->usrp->get_tx_num_channels()); LOG_D(HW, "openair0_cfg[0].tx_num_channels == %d\n", openair0_cfg[0].tx_num_channels); + LOG_I(HW, "openair0_cfg[0].tx_subdev == %s\n", openair0_cfg[0].tx_subdev); + LOG_I(HW, "openair0_cfg[0].rx_subdev == %s\n", openair0_cfg[0].rx_subdev); + + tx_subdev = openair0_cfg[0].tx_subdev; + rx_subdev = openair0_cfg[0].rx_subdev; + s->usrp->set_tx_subdev_spec(tx_subdev); + s->usrp->set_rx_subdev_spec(rx_subdev); for(int i=0; i<((int) s->usrp->get_tx_num_channels()); i++) { ::uhd::gain_range_t gain_range_tx = s->usrp->get_tx_gain_range(i); @@ -1419,6 +1426,7 @@ extern "C" { LOG_I(HW," Actual TX packet size: %lu\n",s->tx_stream->get_max_num_samps()); } + std::cout << boost::format("Using Device: %s") % s->usrp->get_pp_string() << std::endl; LOG_I(HW,"Device timestamp: %f...\n", s->usrp->get_time_now().get_real_secs()); device->trx_write_func = trx_usrp_write; device->trx_read_func = trx_usrp_read; From f2e1a4a1a8489de221fed92139c1896bf7b82199 Mon Sep 17 00:00:00 2001 From: Sagar Parsawar Date: Thu, 19 May 2022 16:27:09 +0200 Subject: [PATCH 088/135] bug fix for subdev selection --- targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp index 07162415d2..f21d71ba45 100644 --- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp +++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp @@ -1324,6 +1324,18 @@ extern "C" { openair0_cfg[0].iq_txshift = 4;//shift openair0_cfg[0].iq_rxrescale = 15;//rescale iqs + if(openair0_cfg[0].tx_subdev!=NULL){ + LOG_I(HW, "openair0_cfg[0].tx_subdev == %s\n", openair0_cfg[0].tx_subdev); + tx_subdev = openair0_cfg[0].tx_subdev; + s->usrp->set_tx_subdev_spec(tx_subdev); + } + + if(openair0_cfg[0].rx_subdev!=NULL){ + LOG_I(HW, "openair0_cfg[0].rx_subdev == %s\n", openair0_cfg[0].rx_subdev); + rx_subdev = openair0_cfg[0].rx_subdev; + s->usrp->set_rx_subdev_spec(rx_subdev); + } + for(int i=0; i<((int) s->usrp->get_rx_num_channels()); i++) { if (iusrp->set_rx_rate(openair0_cfg[0].sample_rate,i+choffset); @@ -1347,13 +1359,6 @@ extern "C" { LOG_D(HW, "usrp->get_tx_num_channels() == %zd\n", s->usrp->get_tx_num_channels()); LOG_D(HW, "openair0_cfg[0].tx_num_channels == %d\n", openair0_cfg[0].tx_num_channels); - LOG_I(HW, "openair0_cfg[0].tx_subdev == %s\n", openair0_cfg[0].tx_subdev); - LOG_I(HW, "openair0_cfg[0].rx_subdev == %s\n", openair0_cfg[0].rx_subdev); - - tx_subdev = openair0_cfg[0].tx_subdev; - rx_subdev = openair0_cfg[0].rx_subdev; - s->usrp->set_tx_subdev_spec(tx_subdev); - s->usrp->set_rx_subdev_spec(rx_subdev); for(int i=0; i<((int) s->usrp->get_tx_num_channels()); i++) { ::uhd::gain_range_t gain_range_tx = s->usrp->get_tx_gain_range(i); From 09f50edc88deea71f0ae490773e31c9f496be566 Mon Sep 17 00:00:00 2001 From: rakesh mundlamuri Date: Fri, 20 May 2022 09:59:46 +0200 Subject: [PATCH 089/135] adding subdev selection for nrUE --- executables/nr-uesoftmodem.c | 4 ++++ executables/nr-uesoftmodem.h | 2 ++ 2 files changed, 6 insertions(+) diff --git a/executables/nr-uesoftmodem.c b/executables/nr-uesoftmodem.c index 1612480ffd..62ce0e176e 100644 --- a/executables/nr-uesoftmodem.c +++ b/executables/nr-uesoftmodem.c @@ -117,6 +117,8 @@ int vcdflag = 0; double rx_gain_off = 0.0; char *usrp_args = NULL; +char *tx_subdev = NULL; +char *rx_subdev = NULL; char *rrc_config_path = NULL; char *uecap_file = NULL; int dumpframe = 0; @@ -372,6 +374,8 @@ void init_openair0(void) { openair0_cfg[card].configFilename = get_softmodem_params()->rf_config_file; if (usrp_args) openair0_cfg[card].sdr_addrs = usrp_args; + if (tx_subdev) openair0_cfg[card].tx_subdev = tx_subdev; + if (rx_subdev) openair0_cfg[card].rx_subdev = rx_subdev; } } diff --git a/executables/nr-uesoftmodem.h b/executables/nr-uesoftmodem.h index 95914678e5..927d619c42 100644 --- a/executables/nr-uesoftmodem.h +++ b/executables/nr-uesoftmodem.h @@ -29,6 +29,8 @@ /*------------------------------------------------------------------------------------------------------------------------------------------*/ #define CMDLINE_NRUEPARAMS_DESC { \ {"usrp-args", CONFIG_HLP_USRP_ARGS, 0, strptr:(char **)&usrp_args, defstrval:"type=b200", TYPE_STRING, 0}, \ + {"tx_subdev", CONFIG_HLP_USRP_ARGS, 0, strptr:(char **)&tx_subdev, defstrval:"", TYPE_STRING, 0}, \ + {"rx_subdev", CONFIG_HLP_USRP_ARGS, 0, strptr:(char **)&rx_subdev, defstrval:"", TYPE_STRING, 0}, \ {"single-thread-disable", CONFIG_HLP_NOSNGLT, PARAMFLAG_BOOL, iptr:&single_thread_flag, defintval:1, TYPE_INT, 0}, \ {"dlsch-parallel", CONFIG_HLP_DLSCH_PARA, 0, iptr:(int32_t *)&nrUE_params.nr_dlsch_parallel, defintval:0, TYPE_UINT8, 0}, \ {"offset-divisor", CONFIG_HLP_OFFSET_DIV, 0, uptr:(uint32_t *)&nrUE_params.ofdm_offset_divisor, defuintval:UINT_MAX, TYPE_UINT32, 0}, \ From b30e6733489cea5be6fe6254bebe417d2bcbe926 Mon Sep 17 00:00:00 2001 From: Sagar Parsawar Date: Mon, 23 May 2022 16:38:42 +0200 Subject: [PATCH 090/135] Added T trader dump for Tx signal in gNB --- common/utils/T/T_messages.txt | 4 ++++ openair1/SCHED_NR/phy_procedures_nr_gNB.c | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/common/utils/T/T_messages.txt b/common/utils/T/T_messages.txt index 12c6a03d51..30982b57aa 100644 --- a/common/utils/T/T_messages.txt +++ b/common/utils/T/T_messages.txt @@ -105,6 +105,10 @@ ID = GNB_PHY_PRACH_INPUT_SIGNAL DESC = gNodeB input data in the time domain for slots with PRACH detection GROUP = ALL:PHY:GRAPHIC:HEAVY:GNB FORMAT = int,frame : int,slot : int,antenna : buffer,rxdata +ID = GNB_PHY_DL_OUTPUT_SIGNAL + DESC = gNodeB output data in the freq domain for slots + GROUP = ALL:PHY:GRAPHIC:HEAVY:GNB + FORMAT = int,gNB_ID : int,frame : int,slot : int,antenna : buffer,txdata #MAC logs ID = ENB_MAC_UE_DL_SDU diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index f0177cbf28..e33021897a 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -213,6 +213,10 @@ void phy_procedures_gNB_TX(processingData_L1tx_t *msgTx, //apply the OFDM symbol rotation here for (aa=0; aacarrier_config.num_tx_ant.value; aa++) { apply_nr_rotation(fp,(int16_t*) &gNB->common_vars.txdataF[aa][txdataF_offset],slot,0,fp->Ncp==EXTENDED?12:14,fp->ofdm_symbol_size); + + T(T_GNB_PHY_DL_OUTPUT_SIGNAL, T_INT(0), + T_INT(frame), T_INT(slot), + T_INT(aa), T_BUFFER(&gNB->common_vars.txdataF[aa][txdataF_offset], fp->samples_per_slot_wCP*sizeof(int32_t))); } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_gNB_TX+offset,0); From e141b2083664152205e41edfda454e3c30cc992d Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Sun, 29 May 2022 21:41:18 +0200 Subject: [PATCH 091/135] GPS sync improvements --- targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp | 23 +++++++++----------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp index f21d71ba45..04a9aae132 100644 --- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp +++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp @@ -201,16 +201,6 @@ static int sync_to_gps(openair0_device *device) { LOG_W(HW,"WARNING: GPS not locked - time will not be accurate until locked\n"); } - //wait for next pps - uhd::time_spec_t last = s->usrp->get_time_last_pps(); - uhd::time_spec_t next = s->usrp->get_time_last_pps(); - while(next == last) { - boost::this_thread::sleep(boost::posix_time::milliseconds(50)); - last = next; - next = s->usrp->get_time_last_pps(); - } - boost::this_thread::sleep(boost::posix_time::milliseconds(200)); - //Set to GPS time uhd::time_spec_t gps_time = uhd::time_spec_t(time_t(s->usrp->get_mboard_sensor("gps_time", mboard).to_int())); s->usrp->set_time_next_pps(gps_time+1.0, mboard); @@ -306,11 +296,18 @@ static int trx_usrp_start(openair0_device *device) { //s->first_rx = 1; s->rx_timestamp = 0; - uhd::time_spec_t time_last_pps = s->usrp->get_time_last_pps(); - LOG_I(HW,"last pps at %f, starting streaming at %f\n",time_last_pps.get_real_secs(),time_last_pps.get_real_secs()+1.0); + //wait for next pps + uhd::time_spec_t last_pps = s->usrp->get_time_last_pps(); + uhd::time_spec_t current_pps = s->usrp->get_time_last_pps(); + while(current_pps == last_pps) { + boost::this_thread::sleep(boost::posix_time::milliseconds(1)); + current_pps = s->usrp->get_time_last_pps(); + } + + LOG_I(HW,"current pps at %f, starting streaming at %f\n",current_pps.get_real_secs(),current_pps.get_real_secs()+1.0); uhd::stream_cmd_t cmd(uhd::stream_cmd_t::STREAM_MODE_START_CONTINUOUS); - cmd.time_spec = uhd::time_spec_t(time_last_pps+1.0); + cmd.time_spec = uhd::time_spec_t(current_pps+1.0); cmd.stream_now = false; // start at constant delay s->rx_stream->issue_stream_cmd(cmd); From fab75b4af8b77e8cc1385b91491a3cd2d6d169c0 Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Tue, 31 May 2022 11:24:00 +0200 Subject: [PATCH 092/135] aligning some internal memory to avoid segfaults --- openair1/PHY/NR_UE_TRANSPORT/dci_nr.c | 6 +++--- openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c b/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c index 336d388d40..308d033fbe 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c +++ b/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c @@ -686,9 +686,9 @@ int32_t nr_rx_pdcch(PHY_VARS_NR_UE *ue, // Pointers to extracted PDCCH symbols in frequency-domain. int32_t rx_size = 4*273*12; - int32_t rxdataF_ext[4*frame_parms->nb_antennas_rx][rx_size]; - int32_t rxdataF_comp[4*frame_parms->nb_antennas_rx][rx_size]; - int32_t pdcch_dl_ch_estimates_ext[4*frame_parms->nb_antennas_rx][rx_size]; + __attribute__ ((aligned(32))) int32_t rxdataF_ext[4*frame_parms->nb_antennas_rx][rx_size]; + __attribute__ ((aligned(32))) int32_t rxdataF_comp[4*frame_parms->nb_antennas_rx][rx_size]; + __attribute__ ((aligned(32))) int32_t pdcch_dl_ch_estimates_ext[4*frame_parms->nb_antennas_rx][rx_size]; // Pointer to llrs, 4-bit resolution. int32_t llr_size = 2*4*100*12; diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c b/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c index 48b08d761e..78e4a8a4e8 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c @@ -430,8 +430,8 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue, for (symbol=1; symbol<4; symbol++) { const uint16_t nb_re=symbol == 2 ? 72 : 180; - 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]; + __attribute__ ((aligned(32))) struct complex16 rxdataF_ext[frame_parms->nb_antennas_rx][PBCH_MAX_RE_PER_SYMBOL]; + __attribute__ ((aligned(32))) 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, @@ -456,7 +456,7 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue, #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]; + __attribute__ ((aligned(32))) 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, From 4704af4874277db39d501cca285e73d416d101b6 Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Tue, 31 May 2022 11:26:03 +0200 Subject: [PATCH 093/135] not calling ue scheduler in phy_test mode --- executables/nr-ue.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/executables/nr-ue.c b/executables/nr-ue.c index 92c20626c0..620e21ec14 100644 --- a/executables/nr-ue.c +++ b/executables/nr-ue.c @@ -666,7 +666,7 @@ void processSlotRX(void *arg) { if (rx_slot_type == NR_DOWNLINK_SLOT || rx_slot_type == NR_MIXED_SLOT){ - if(UE->if_inst != NULL && UE->if_inst->dl_indication != NULL) { + if(UE->if_inst != NULL && UE->if_inst->dl_indication != NULL && get_softmodem_params()->phy_test == 0) { nr_downlink_indication_t dl_indication; nr_fill_dl_indication(&dl_indication, NULL, NULL, proc, UE, gNB_id, &phy_pdcch_config); UE->if_inst->dl_indication(&dl_indication, NULL); From e8451eb892015ef417ff1db93d6f841979908f45 Mon Sep 17 00:00:00 2001 From: Sagar Parsawar Date: Tue, 31 May 2022 16:49:53 +0200 Subject: [PATCH 094/135] Added 2gNB PRS working config 106PRBs --- ...gnb.sa.band78.fr1.106PRB.prs.usrpn310.conf | 6 +- ...nb.sa.band78.fr1.106PRB.prs.usrpn310.conf2 | 322 ++++++++++++++++++ 2 files changed, 325 insertions(+), 3 deletions(-) create mode 100644 targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.prs.usrpn310.conf2 diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.prs.usrpn310.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.prs.usrpn310.conf index c0912cd19d..aa7a94565d 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.prs.usrpn310.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.prs.usrpn310.conf @@ -218,9 +218,9 @@ MACRLCs = ( prs_config = ( { NumPRSResources = 1; - PRSResourceSetPeriod = [40, 0]; + PRSResourceSetPeriod = [20, 2]; SymbolStart = [7]; - NumPRSSymbols = [7]; + NumPRSSymbols = [6]; NumRB = 106; RBOffset = 0; CombSize = 4; @@ -261,7 +261,7 @@ RUs = ( #beamforming 1x4 matrix: bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000]; #clock_src = "internal"; - sdr_addrs = "addr=192.168.10.2,second_addr=192.168.20.2,clock_source=internal,time_source=internal" + sdr_addrs = "addr=192.168.10.2,clock_source=gpsdo,time_source=gpsdo" } ); diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.prs.usrpn310.conf2 b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.prs.usrpn310.conf2 new file mode 100644 index 0000000000..dc73a39f05 --- /dev/null +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.prs.usrpn310.conf2 @@ -0,0 +1,322 @@ +Active_gNBs = ( "gNB-OAI"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +gNBs = +( + { + ////////// Identification parameters: + gNB_ID = 0xe00; + gNB_name = "gNB-OAI"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = 1; + plmn_list = ({ + mcc = 208; + mnc = 99; + mnc_length = 2; + snssaiList = ( + { + sst = 1; + sd = 0x1; // 0 false, else true + }, + { + sst = 1; + sd = 0x112233; // 0 false, else true + } + ); + + }); + + nr_cellid = 12345678L; + + ////////// Physical parameters: + + ssb_SubcarrierOffset = 0; + pdsch_AntennaPorts = 1; + pusch_AntennaPorts = 1; + 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 = 650000; + dl_frequencyBand = 78; + # this is 3600 MHz + dl_absoluteFrequencyPointA = 648728; + #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; + + #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, + + 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 = 2; + +# 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 : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + + ////////// AMF parameters: + amf_ip_address = ( { ipv4 = "192.168.70.132"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + + NETWORK_INTERFACES : + { + GNB_INTERFACE_NAME_FOR_NG_AMF = "demo-oai"; + GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.70.129/24"; + GNB_INTERFACE_NAME_FOR_NGU = "demo-oai"; + GNB_IPV4_ADDRESS_FOR_NGU = "192.168.70.129/24"; + GNB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + } +); + +MACRLCs = ( +{ + num_cc = 1; + tr_s_preference = "local_L1"; + tr_n_preference = "local_RRC"; + pusch_TargetSNRx10 = 150; + pucch_TargetSNRx10 = 200; + ulsch_max_frame_inactivity = 1; +} +); + +prs_config = ( +{ + NumPRSResources = 1; + PRSResourceSetPeriod = [20, 2]; + SymbolStart = [7]; + NumPRSSymbols = [6]; + NumRB = 106; + RBOffset = 0; + CombSize = 4; + REOffset = [0]; + PRSResourceOffset = [1]; + PRSResourceRepetition = 1; + PRSResourceTimeGap = 1; + NPRS_ID = [0]; + MutingPattern1 = []; + MutingPattern2 = []; + MutingBitRepetition = 1; +} +); + +L1s = ( +{ + num_cc = 1; + tr_n_preference = "local_mac"; + pusch_proc_threads = 8; + prach_dtx_threshold = 120; + pucch0_dtx_threshold = 150; + ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0 +} +); + +RUs = ( +{ + local_rf = "yes" + nb_tx = 1 + nb_rx = 1 + att_tx = 0 + att_rx = 0; + bands = [78]; + max_pdschReferenceSignalPower = -27; + max_rxgain = 114; + sf_extension = 0; + eNB_instances = [0]; + #beamforming 1x4 matrix: + bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000]; + #clock_src = "internal"; + sdr_addrs = "addr=192.168.20.2,clock_source=gpsdo,time_source=gpsdo" +} +); + +THREAD_STRUCT = ( +{ + #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT" + parallel_config = "PARALLEL_SINGLE_THREAD"; + #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE" + worker_config = "WORKER_ENABLE"; +} +); + +rfsimulator : +{ + serveraddr = "server"; + serverport = "4043"; + options = (); #("saviq"); or/and "chanmod" + modelname = "AWGN"; + IQfile = "/tmp/rfsimulator.iqs"; +}; + +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"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + ngap_log_level ="debug"; + ngap_log_verbosity ="medium"; +}; + From 4d44eef9f37c7aaf5c0eca34e4517678a422108b Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Wed, 1 Jun 2022 09:19:44 +0200 Subject: [PATCH 095/135] fixing time domain signal in T tracer --- executables/nr-ru.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/executables/nr-ru.c b/executables/nr-ru.c index 1cad34145a..78d02e8849 100644 --- a/executables/nr-ru.c +++ b/executables/nr-ru.c @@ -712,7 +712,7 @@ void tx_rf(RU_t *ru,int frame,int slot, uint64_t timestamp) { unsigned int txs; 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)); + T_INT(0), T_BUFFER(&ru->common.txdata[0][fp->get_samples_slot_timestamp(slot,fp,0)], fp->get_samples_per_slot(slot,fp) * 4)); int sf_extension = 0; int siglen=fp->get_samples_per_slot(slot,fp); int flags = 0; From 2a3414725ae115cc1d585569de9d37c48e4c72a0 Mon Sep 17 00:00:00 2001 From: Sagar Parsawar Date: Wed, 1 Jun 2022 14:15:40 +0200 Subject: [PATCH 096/135] NR PRS scheduling for generalised slot periodicity --- openair1/SCHED_NR/phy_procedures_nr_gNB.c | 8 ++++---- openair1/SCHED_NR/sched_nr.h | 2 +- openair1/SCHED_NR_UE/defs.h | 2 +- openair1/SCHED_NR_UE/phy_procedures_nr_ue.c | 7 ++++--- 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index e33021897a..4ee10ea472 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -63,12 +63,12 @@ void nr_set_ssb_first_subcarrier(nfapi_nr_config_request_scf_t *cfg, NR_DL_FRAME LOG_D(PHY, "SSB first subcarrier %d (%d,%d)\n", fp->ssb_start_subcarrier,cfg->ssb_table.ssb_offset_point_a.value,sco); } -uint8_t check_prs_slot_gNB(uint8_t *prs_rsc_id, NR_gNB_PRS *prs_vars, int nr_slot_tx) +uint8_t check_prs_slot_gNB(uint8_t *prs_rsc_id, NR_gNB_PRS *prs_vars, NR_DL_FRAME_PARMS *fp, int frame_tx, int nr_slot_tx) { uint8_t is_prs_slot = 0, rsc_id = 0; for(rsc_id = 0; rsc_id < prs_vars->NumPRSResources; rsc_id++) { - if((prs_vars->prs_cfg[rsc_id].PRSResourceSetPeriod[1] + prs_vars->prs_cfg[rsc_id].PRSResourceOffset) == nr_slot_tx) + if((prs_vars->prs_cfg[rsc_id].PRSResourceSetPeriod[1] + prs_vars->prs_cfg[rsc_id].PRSResourceOffset) == ((frame_tx*fp->slots_per_frame+nr_slot_tx)%prs_vars->prs_cfg[rsc_id].PRSResourceSetPeriod[0])) { is_prs_slot = 1; *prs_rsc_id = rsc_id; @@ -159,10 +159,10 @@ void phy_procedures_gNB_TX(processingData_L1tx_t *msgTx, } // Check for PRS slot - is_prs_slot = check_prs_slot_gNB(&rsc_id, &gNB->prs_vars, slot); + is_prs_slot = check_prs_slot_gNB(&rsc_id, &gNB->prs_vars, fp, frame, slot); if(is_prs_slot) { - LOG_D(PHY,"gNB_TX: frame %d, slot %d, slots_per_frame %d, PRS Resource ID %d\n",frame,slot, fp->slots_per_frame, rsc_id); + LOG_D(PHY,"gNB_TX: frame %d, slot %d, PRS Resource ID %d\n",frame, slot, rsc_id); nr_generate_prs(gNB->nr_gold_prs[slot],&gNB->common_vars.txdataF[0][txdataF_offset], AMP, &gNB->prs_vars.prs_cfg[rsc_id], cfg, fp); } diff --git a/openair1/SCHED_NR/sched_nr.h b/openair1/SCHED_NR/sched_nr.h index 5ef848506d..033ce2061f 100644 --- a/openair1/SCHED_NR/sched_nr.h +++ b/openair1/SCHED_NR/sched_nr.h @@ -54,7 +54,7 @@ void nr_fep_full(RU_t *ru, int slot); void nr_fep_full_2thread(RU_t *ru, int slot); void feptx_prec(RU_t *ru,int frame_tx,int tti_tx); int nr_phy_init_RU(RU_t *ru); -uint8_t check_prs_slot_gNB(uint8_t *prs_rsc_id, NR_gNB_PRS *prs_vars, int nr_slot_tx); +uint8_t check_prs_slot_gNB(uint8_t *prs_rsc_id, NR_gNB_PRS *prs_vars, NR_DL_FRAME_PARMS *fp, int frame_tx, int nr_slot_tx); void nr_phy_free_RU(RU_t *ru); #endif diff --git a/openair1/SCHED_NR_UE/defs.h b/openair1/SCHED_NR_UE/defs.h index c744a968aa..b0767e42d2 100644 --- a/openair1/SCHED_NR_UE/defs.h +++ b/openair1/SCHED_NR_UE/defs.h @@ -373,7 +373,7 @@ int get_tx_harq_id(NR_UE_ULSCH_t *ulsch, int slot_tx); int is_pbch_in_slot(fapi_nr_config_request_t *config, int frame, int slot, NR_DL_FRAME_PARMS *fp); int is_ssb_in_slot(fapi_nr_config_request_t *config, int frame, int slot, NR_DL_FRAME_PARMS *fp); -uint8_t check_prs_slot_nrUE(PHY_VARS_NR_UE *ue, uint8_t *prs_gNB_id, uint8_t *prs_rsc_id, int nr_slot_rx); +uint8_t check_prs_slot_nrUE(PHY_VARS_NR_UE *ue, NR_DL_FRAME_PARMS *fp, uint8_t *prs_gNB_id, uint8_t *prs_rsc_id, int frame_rx, int nr_slot_rx); /*! \brief This function prepares the dl indication to pass to the MAC @param diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c index 5e5d304786..7ff7d18505 100644 --- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c +++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c @@ -1374,14 +1374,15 @@ int is_pbch_in_slot(fapi_nr_config_request_t *config, int frame, int slot, NR_DL } } -uint8_t check_prs_slot_nrUE(PHY_VARS_NR_UE *ue, uint8_t *prs_gNB_id, uint8_t *prs_rsc_id, int nr_slot_rx) +uint8_t check_prs_slot_nrUE(PHY_VARS_NR_UE *ue, NR_DL_FRAME_PARMS *fp, uint8_t *prs_gNB_id, uint8_t *prs_rsc_id, int frame_rx, int nr_slot_rx) { uint8_t is_prs_slot = 0, rsc_id = 0, gNB_id = 0; for(gNB_id = 0; gNB_id < ue->prs_active_gNBs; gNB_id++) { for(rsc_id = 0; rsc_id < ue->prs_vars[gNB_id]->NumPRSResources; rsc_id++) { - if((ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_cfg.PRSResourceSetPeriod[1] + ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_cfg.PRSResourceOffset) == nr_slot_rx) + if((ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_cfg.PRSResourceSetPeriod[1] + ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_cfg.PRSResourceOffset) == + ((frame_rx*fp->slots_per_frame + nr_slot_rx)%ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_cfg.PRSResourceSetPeriod[0])) { is_prs_slot = 1; *prs_rsc_id = rsc_id; @@ -1481,7 +1482,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue, } // Check for PRS slot - is_prs_slot = check_prs_slot_nrUE(ue, &prs_gNB_id, &rsc_id, nr_slot_rx); + is_prs_slot = check_prs_slot_nrUE(ue, fp, &prs_gNB_id, &rsc_id, frame_rx, nr_slot_rx); if (is_prs_slot) { for(int j = ue->prs_start_symb; j < ue->prs_end_symb; j++) From c62ddbe23192b2b1ef88431ccc0bf34a51d4190f Mon Sep 17 00:00:00 2001 From: Sagar Parsawar Date: Wed, 1 Jun 2022 14:37:35 +0200 Subject: [PATCH 097/135] Updated NRPRS UE config for 106PRB, 2gNBs --- .../GENERIC-NR-5GC/CONF/ue.nr.prs.fr1.106prb.conf | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr1.106prb.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr1.106prb.conf index 04912424f2..6a5fbc3785 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr1.106prb.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr1.106prb.conf @@ -1,14 +1,14 @@ PRSs = ( { - Active_gNBs = 1; + Active_gNBs = 2; prs_config0 = ( { gNB_id = 0; NumPRSResources = 1; - PRSResourceSetPeriod = [40, 0]; + PRSResourceSetPeriod = [20, 2]; SymbolStart = [7]; - NumPRSSymbols = [7]; + NumPRSSymbols = [6]; NumRB = 106; RBOffset = 0; CombSize = 4; @@ -27,14 +27,14 @@ PRSs = { gNB_id = 1; NumPRSResources = 1; - PRSResourceSetPeriod = [40, 0]; + PRSResourceSetPeriod = [20, 2]; SymbolStart = [7]; - NumPRSSymbols = [7]; + NumPRSSymbols = [6]; NumRB = 106; RBOffset = 0; CombSize = 4; - REOffset = [1]; - PRSResourceOffset = [0]; + REOffset = [0]; + PRSResourceOffset = [1]; PRSResourceRepetition = 1; PRSResourceTimeGap = 1; NPRS_ID = [0]; From 0c14b5fc757c4b927365748acab682078424d0d5 Mon Sep 17 00:00:00 2001 From: Sagar Parsawar Date: Mon, 13 Jun 2022 15:45:56 +0200 Subject: [PATCH 098/135] Added NPRS-ID based PRS sequence generation for OAI gNB and UE --- openair1/PHY/INIT/nr_init.c | 21 ++++---- openair1/PHY/INIT/nr_init_ue.c | 34 +++++++----- openair1/PHY/NR_REFSIG/nr_gold.c | 42 +++++++-------- openair1/PHY/NR_REFSIG/nr_gold_ue.c | 53 ++++++++++--------- openair1/PHY/NR_REFSIG/refsig_defs_ue.h | 2 +- openair1/PHY/NR_TRANSPORT/nr_prs.c | 25 ++++----- .../nr_dl_channel_estimation.c | 6 +-- openair1/PHY/defs_gNB.h | 2 +- openair1/PHY/defs_nr_UE.h | 4 +- openair1/SCHED_NR/phy_procedures_nr_gNB.c | 2 +- 10 files changed, 99 insertions(+), 92 deletions(-) diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c index 75070021ec..680d3684ef 100644 --- a/openair1/PHY/INIT/nr_init.c +++ b/openair1/PHY/INIT/nr_init.c @@ -615,20 +615,23 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB, nr_init_csi_rs(gNB, cfg->cell_config.phy_cell_id.value); //PRS init - gNB->nr_gold_prs = (uint32_t ***)malloc16(fp->slots_per_frame*sizeof(uint32_t **)); - uint32_t ***prs = gNB->nr_gold_prs; + gNB->nr_gold_prs = (uint32_t ****)malloc16(gNB->prs_vars.NumPRSResources*sizeof(uint32_t ***)); + uint32_t ****prs = gNB->nr_gold_prs; AssertFatal(prs!=NULL, "NR init: positioning reference signal malloc failed\n"); + for (int rsc=0; rsc < gNB->prs_vars.NumPRSResources; rsc++) { + prs[rsc] = (uint32_t ***)malloc16(fp->slots_per_frame*sizeof(uint32_t **)); + AssertFatal(prs[rsc]!=NULL, "NR init: positioning reference signal for rsc %d - malloc failed\n", rsc); - for (int slot=0; slotslots_per_frame; slot++) { - prs[slot] = (uint32_t **)malloc16(fp->symbols_per_slot*sizeof(uint32_t *)); - AssertFatal(prs[slot]!=NULL, "NR init: positioning reference signal for slot %d - malloc failed\n", slot); + for (int slot=0; slotslots_per_frame; slot++) { + prs[rsc][slot] = (uint32_t **)malloc16(fp->symbols_per_slot*sizeof(uint32_t *)); + AssertFatal(prs[rsc][slot]!=NULL, "NR init: positioning reference signal for slot %d - malloc failed\n", slot); - for (int symb=0; symbsymbols_per_slot; symb++) { - prs[slot][symb] = (uint32_t *)malloc16(NR_MAX_PRS_INIT_LENGTH_DWORD*sizeof(uint32_t)); - AssertFatal(prs[slot][symb]!=NULL, "NR init: positioning reference signal for slot %d symbol %d - malloc failed\n", slot, symb); + for (int symb=0; symbsymbols_per_slot; symb++) { + prs[rsc][slot][symb] = (uint32_t *)malloc16(NR_MAX_PRS_INIT_LENGTH_DWORD*sizeof(uint32_t)); + AssertFatal(prs[rsc][slot][symb]!=NULL, "NR init: positioning reference signal for rsc %d slot %d symbol %d - malloc failed\n", rsc, slot, symb); + } } } - nr_init_prs(gNB); diff --git a/openair1/PHY/INIT/nr_init_ue.c b/openair1/PHY/INIT/nr_init_ue.c index 846a474cdd..7a1c4d1ef5 100644 --- a/openair1/PHY/INIT/nr_init_ue.c +++ b/openair1/PHY/INIT/nr_init_ue.c @@ -160,9 +160,8 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB) NR_UE_PBCH **const pbch_vars = ue->pbch_vars; NR_UE_PRS **const prs_vars = ue->prs_vars; NR_UE_PRACH **const prach_vars = ue->prach_vars; - int i,slot,symb, gNB_id, th_id; - NR_UE_SRS **const srs_vars = ue->srs_vars; + int i,slot,symb, gNB_id, th_id; LOG_I(PHY, "Initializing UE vars for gNB TXant %u, UE RXant %u\n", fp->nb_antennas_tx, fp->nb_antennas_rx); @@ -207,20 +206,29 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB) //////////////////////////////////////////////////////////////////////////////////////////// //PRS init - ue->nr_gold_prs = (uint32_t ***)malloc16(fp->slots_per_frame*sizeof(uint32_t **)); - uint32_t ***prs = ue->nr_gold_prs; + ue->nr_gold_prs = (uint32_t *****)malloc16(ue->prs_active_gNBs*sizeof(uint32_t ****)); + uint32_t *****prs = ue->nr_gold_prs; AssertFatal(prs!=NULL, "NR UE init: positioning reference signal malloc failed\n"); + for (int gnb = 0; gnb < ue->prs_active_gNBs; gnb++) { + prs[gnb] = (uint32_t ****)malloc16(ue->prs_vars[gnb]->NumPRSResources*sizeof(uint32_t ***)); + AssertFatal(prs[gnb]!=NULL, "NR UE init: positioning reference signal for gnb %d - malloc failed\n", gnb); + + for (int rsc = 0; rsc < ue->prs_vars[gnb]->NumPRSResources; rsc++) { + prs[gnb][rsc] = (uint32_t ***)malloc16(fp->slots_per_frame*sizeof(uint32_t **)); + AssertFatal(prs[gnb][rsc]!=NULL, "NR UE init: positioning reference signal for gnb %d rsc %d- malloc failed\n", gnb, rsc); - for (int slot=0; slotslots_per_frame; slot++) { - prs[slot] = (uint32_t **)malloc16(fp->symbols_per_slot*sizeof(uint32_t *)); - AssertFatal(prs[slot]!=NULL, "NR UE init: positioning reference signal for slot %d - malloc failed\n", slot); + for (int slot=0; slotslots_per_frame; slot++) { + prs[gnb][rsc][slot] = (uint32_t **)malloc16(fp->symbols_per_slot*sizeof(uint32_t *)); + AssertFatal(prs[gnb][rsc][slot]!=NULL, "NR UE init: positioning reference signal for gnb %d rsc %d slot %d - malloc failed\n", gnb, rsc, slot); - for (int symb=0; symbsymbols_per_slot; symb++) { - prs[slot][symb] = (uint32_t *)malloc16(NR_MAX_PRS_INIT_LENGTH_DWORD*sizeof(uint32_t)); - AssertFatal(prs[slot][symb]!=NULL, "NR UE init: positioning reference signal for slot %d symbol %d - malloc failed\n", slot, symb); - } - } - nr_gold_prs(ue); + for (int symb=0; symbsymbols_per_slot; symb++) { + prs[gnb][rsc][slot][symb] = (uint32_t *)malloc16(NR_MAX_PRS_INIT_LENGTH_DWORD*sizeof(uint32_t)); + AssertFatal(prs[gnb][rsc][slot][symb]!=NULL, "NR UE init: positioning reference signal for gnb %d rsc %d slot %d symbol %d - malloc failed\n", gnb, rsc, slot, symb); + } // for symb + } // for slot + } // for rsc + } // for gnb + init_nr_gold_prs(ue); /////////////////////////PUSCH DMRS init///////////////////////// /////////// diff --git a/openair1/PHY/NR_REFSIG/nr_gold.c b/openair1/PHY/NR_REFSIG/nr_gold.c index a80fbfde68..1073982909 100644 --- a/openair1/PHY/NR_REFSIG/nr_gold.c +++ b/openair1/PHY/NR_REFSIG/nr_gold.c @@ -156,34 +156,32 @@ void nr_init_prs(PHY_VARS_gNB* gNB) unsigned int x1, x2; uint16_t Nid; - nfapi_nr_config_request_scf_t *cfg = &gNB->gNB_config; NR_DL_FRAME_PARMS *fp = &gNB->frame_parms; uint8_t reset; - uint8_t slotNum, symNum; + uint8_t slotNum, symNum, rsc_id; - Nid = cfg->cell_config.phy_cell_id.value; + for (rsc_id = 0; rsc_id < gNB->prs_vars.NumPRSResources; rsc_id++) { + Nid = gNB->prs_vars.prs_cfg[rsc_id].NPRSID; // seed value + LOG_I(PHY, "Initiaized NR-PRS sequence with PRS_ID %d\n", Nid); + for (slotNum = 0; slotNum < fp->slots_per_frame; slotNum++) { + for (symNum = 0; symNum < fp->symbols_per_slot ; symNum++) { + reset = 1; + // initial x2 for prs as ts138.211 + uint32_t c_init1, c_init2, c_init3; + uint32_t pow22=1<<22; + uint32_t pow10=1<<10; + c_init1 = pow22*ceil(Nid/1024); + c_init2 = pow10*(slotNum+symNum+1)*(2*(Nid%1024)+1); + c_init3 = Nid%1024; + x2 = c_init1 + c_init2 + c_init3; - for (slotNum = 0; slotNum < fp->slots_per_frame; slotNum++) { - for (symNum = 0; symNum < fp->symbols_per_slot ; symNum++) { - reset = 1; - // initial x2 for prs as ts138.211 - uint32_t c_init1, c_init2, c_init3; - uint32_t pow22=1<<22; - uint32_t pow10=1<<10; - c_init1 = pow22*ceil(Nid/1024); - c_init2 = pow10*(slotNum+symNum+1)*(2*(Nid%1024)+1); - c_init3 = Nid%1024; - x2 = c_init1 + c_init2 + c_init3; - - - for (uint8_t n=0; nnr_gold_prs[slotNum][symNum][n] = lte_gold_generic(&x1, &x2, reset); - reset = 0; - //printf("%d \n",gNB->nr_gold_prs[slotNum][symNum][n]); - + for (uint8_t n=0; nnr_gold_prs[rsc_id][slotNum][symNum][n] = lte_gold_generic(&x1, &x2, reset); + reset = 0; + //printf("%d \n",gNB->nr_gold_prs[slotNum][symNum][n]); + } } } } - } diff --git a/openair1/PHY/NR_REFSIG/nr_gold_ue.c b/openair1/PHY/NR_REFSIG/nr_gold_ue.c index abe28dcc5e..8c222c4bc6 100644 --- a/openair1/PHY/NR_REFSIG/nr_gold_ue.c +++ b/openair1/PHY/NR_REFSIG/nr_gold_ue.c @@ -125,38 +125,39 @@ void nr_init_pusch_dmrs(PHY_VARS_NR_UE* ue, } } -void nr_gold_prs(PHY_VARS_NR_UE* ue) +void init_nr_gold_prs(PHY_VARS_NR_UE* ue) { unsigned int x1, x2; uint16_t Nid; - fapi_nr_config_request_t *cfg = &ue->nrUE_config; NR_DL_FRAME_PARMS *fp = &ue->frame_parms; uint8_t reset; - uint8_t slotNum, symNum; + uint8_t slotNum, symNum, gnb, rsc; + + for(gnb = 0; gnb < ue->prs_active_gNBs; gnb++) { + for(rsc = 0; rsc < ue->prs_vars[gnb]->NumPRSResources; rsc++) { + Nid = ue->prs_vars[gnb]->prs_resource[rsc].prs_cfg.NPRSID; // seed value + LOG_I(PHY,"Initialised NR-PRS sequence with PRS_ID %d\n",Nid); + for (slotNum = 0; slotNum < fp->slots_per_frame; slotNum++) { + for (symNum = 0; symNum < fp->symbols_per_slot ; symNum++) { + reset = 1; + // initial x2 for prs as ts138.211 + uint32_t c_init1, c_init2, c_init3; + uint32_t pow22=1<<22; + uint32_t pow10=1<<10; + c_init1 = pow22*ceil(Nid/1024); + c_init2 = pow10*(slotNum+symNum+1)*(2*(Nid%1024)+1); + c_init3 = Nid%1024; + x2 = c_init1 + c_init2 + c_init3; - Nid = cfg->cell_config.phy_cell_id; - - for (slotNum = 0; slotNum < fp->slots_per_frame; slotNum++) { - for (symNum = 0; symNum < fp->symbols_per_slot ; symNum++) { - reset = 1; - // initial x2 for prs as ts138.211 - uint32_t c_init1, c_init2, c_init3; - uint32_t pow22=1<<22; - uint32_t pow10=1<<10; - c_init1 = pow22*ceil(Nid/1024); - c_init2 = pow10*(slotNum+symNum+1)*(2*(Nid%1024)+1); - c_init3 = Nid%1024; - x2 = c_init1 + c_init2 + c_init3; - - - for (uint8_t n=0; nnr_gold_prs[slotNum][symNum][n] = lte_gold_generic(&x1, &x2, reset); - reset = 0; - //printf("%d \n",gNB->nr_gold_prs[slotNum][symNum][n]); - + for (uint8_t n=0; nnr_gold_prs[gnb][rsc][slotNum][symNum][n] = lte_gold_generic(&x1, &x2, reset); + reset = 0; + //printf("%d \n",gNB->nr_gold_prs[slotNum][symNum][n]); + + } + } } - } - } - + } // for rsc + } // for gnb } diff --git a/openair1/PHY/NR_REFSIG/refsig_defs_ue.h b/openair1/PHY/NR_REFSIG/refsig_defs_ue.h index dd51c09943..3033ee488e 100644 --- a/openair1/PHY/NR_REFSIG/refsig_defs_ue.h +++ b/openair1/PHY/NR_REFSIG/refsig_defs_ue.h @@ -68,6 +68,6 @@ void nr_init_pusch_dmrs(PHY_VARS_NR_UE* ue, uint16_t N_n_scid, uint8_t n_scid); -void nr_gold_prs(PHY_VARS_NR_UE* ue); +void init_nr_gold_prs(PHY_VARS_NR_UE* ue); #endif diff --git a/openair1/PHY/NR_TRANSPORT/nr_prs.c b/openair1/PHY/NR_TRANSPORT/nr_prs.c index 711399d501..bc9aa92ab3 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_prs.c +++ b/openair1/PHY/NR_TRANSPORT/nr_prs.c @@ -8,29 +8,26 @@ //#define DEBUG_PRS_MAP extern short nr_qpsk_mod_table[8]; +int k_prime_table[4][12] = { + {0,1,0,1,0,1,0,1,0,1,0,1}, + {0,2,1,3,0,2,1,3,0,2,1,3}, + {0,3,1,4,2,5,0,3,1,4,2,5}, + {0,6,3,9,1,7,4,10,2,8,5,11}}; int nr_generate_prs(uint32_t **nr_gold_prs, int32_t *txdataF, int16_t amp, prs_data_t *prs_data, nfapi_nr_config_request_scf_t *config, - NR_DL_FRAME_PARMS *frame_parms) { + NR_DL_FRAME_PARMS *frame_parms) +{ - - // Get K_Prime from the table for the length of PRS or LPRS - int k_prime_table[4][12] = { - {0,1,0,1,0,1,0,1,0,1,0,1}, - {0,2,1,3,0,2,1,3,0,2,1,3}, - {0,3,1,4,2,5,0,3,1,4,2,5}, - {0,6,3,9,1,7,4,10,2,8,5,11}}; - - int k_prime = 0; - int k=0; + int k_prime = 0, k = 0; int16_t mod_prs[NR_MAX_PRS_LENGTH<<1]; - uint8_t idx=prs_data->NPRSID; + uint8_t idx; - // PRS resource mapping with combsize=k which means PRS symbols exist in every k-th subcarrier in frequency domain - // According to ts138.211 sec.7.4.1.7.2 + // PRS resource mapping with combsize=k which means PRS symbols exist in every k-th subcarrier in frequency domain + // According to ts138.211 sec.7.4.1.7.2 for (int l = prs_data->SymbolStart; l < prs_data->SymbolStart + prs_data->NumPRSSymbols; l++) { int symInd = l-prs_data->SymbolStart; 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 045052fe6e..0ca22b96d9 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -57,13 +57,13 @@ int nr_prs_channel_estimation(uint8_t gNB_id, NR_DL_FRAME_PARMS *frame_params) { int32_t **rxdataF = ue->common_vars.common_vars_rx_data_per_thread[proc->thread_id].rxdataF; - uint32_t **nr_gold_prs = ue->nr_gold_prs[proc->nr_slot_rx]; + uint32_t **nr_gold_prs = ue->nr_gold_prs[gNB_id][rsc_id][proc->nr_slot_rx]; prs_data_t *prs_cfg = &ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_cfg; prs_meas_t **prs_meas = ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_meas; int32_t **prs_chestF = ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_ch_estimates; int32_t **prs_chestT = ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_ch_estimates_time; - uint8_t rxAnt = 0, idx = prs_cfg->NPRSID; + uint8_t rxAnt = 0, idx = 0; int16_t *rxF, *pil, *fl, *fm, *fmm, *fml, *fmr, *fr, mod_prs[NR_MAX_PRS_LENGTH<<1]; int16_t ch[2] = {0}, noiseFig[2] = {0}; int16_t k_prime = 0, k = 0, re_offset = 0, first_half = 0, second_half = 0; @@ -492,7 +492,7 @@ int nr_prs_channel_estimation(uint8_t gNB_id, prs_meas[rxAnt]->slot = proc->nr_slot_rx; prs_meas[rxAnt]->rxAnt_idx = rxAnt; prs_meas[rxAnt]->dl_aoa = 0; - LOG_I(PHY, "[gNB %d][rsc %d][Rx %d][sfn %d][slot %d] DL PRS ToA ==> %d / %d samples, peak channel power %.1f dB, SNR %+2d dB\n", gNB_id, rsc_id, rxAnt, proc->frame_rx, proc->nr_slot_rx, prs_meas[rxAnt]->dl_toa, frame_params->ofdm_symbol_size, 10*log10(ch_pwr), prs_meas[rxAnt]->snr); + LOG_I(PHY, "[gNB %d][rsc %d][Rx %d][sfn %d][slot %d] DL PRS ToA ==> %d / %d samples, peak channel power %.1f dBm, SNR %+2d dB\n", gNB_id, rsc_id, rxAnt, proc->frame_rx, proc->nr_slot_rx, prs_meas[rxAnt]->dl_toa, frame_params->ofdm_symbol_size, 10*log10(ch_pwr/frame_params->ofdm_symbol_size)-30, prs_meas[rxAnt]->snr); #ifdef DEBUG_PRS_CHEST sprintf(filename, "%s%i%s", "PRSpilot_", rxAnt, ".m"); diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h index 65bb1500b7..0b9fd8564e 100644 --- a/openair1/PHY/defs_gNB.h +++ b/openair1/PHY/defs_gNB.h @@ -817,7 +817,7 @@ typedef struct PHY_VARS_gNB_s { uint32_t ***nr_gold_csi_rs; /// PRS sequence - uint32_t ***nr_gold_prs; + uint32_t ****nr_gold_prs; /// Indicator set to 0 after first SR uint8_t first_sr[NUMBER_OF_NR_SR_MAX]; diff --git a/openair1/PHY/defs_nr_UE.h b/openair1/PHY/defs_nr_UE.h index ee61a76f83..68130d9037 100644 --- a/openair1/PHY/defs_nr_UE.h +++ b/openair1/PHY/defs_nr_UE.h @@ -780,8 +780,8 @@ typedef struct { /// PUSCH DMRS sequence uint32_t ****nr_gold_pusch_dmrs; - // PRS sequence - uint32_t ***nr_gold_prs; + // PRS sequence per gNB, per resource + uint32_t *****nr_gold_prs; uint32_t X_u[64][839]; diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index 4ee10ea472..06180c4096 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -163,7 +163,7 @@ void phy_procedures_gNB_TX(processingData_L1tx_t *msgTx, if(is_prs_slot) { LOG_D(PHY,"gNB_TX: frame %d, slot %d, PRS Resource ID %d\n",frame, slot, rsc_id); - nr_generate_prs(gNB->nr_gold_prs[slot],&gNB->common_vars.txdataF[0][txdataF_offset], AMP, &gNB->prs_vars.prs_cfg[rsc_id], cfg, fp); + nr_generate_prs(gNB->nr_gold_prs[rsc_id][slot],&gNB->common_vars.txdataF[0][txdataF_offset], AMP, &gNB->prs_vars.prs_cfg[rsc_id], cfg, fp); } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_gNB_COMMON_TX,1); From de65d0bdd618d08f3cc7ed15ab2faeef19838fb1 Mon Sep 17 00:00:00 2001 From: Sagar Parsawar Date: Mon, 13 Jun 2022 16:36:07 +0200 Subject: [PATCH 099/135] Fixed prs_vars initialization issue in OAI UE --- executables/nr-uesoftmodem.c | 1 - openair1/PHY/INIT/nr_init_ue.c | 50 ++++++++++++++++++---------------- 2 files changed, 26 insertions(+), 25 deletions(-) diff --git a/executables/nr-uesoftmodem.c b/executables/nr-uesoftmodem.c index 62ce0e176e..b418fc9e90 100644 --- a/executables/nr-uesoftmodem.c +++ b/executables/nr-uesoftmodem.c @@ -525,7 +525,6 @@ int main( int argc, char **argv ) { init_symbol_rotation(&UE[CC_id]->frame_parms); init_timeshift_rotation(&UE[CC_id]->frame_parms); init_nr_ue_vars(UE[CC_id], 0, abstraction_flag); - RCconfig_nrUE_prs(UE[CC_id]); } init_openair0(); diff --git a/openair1/PHY/INIT/nr_init_ue.c b/openair1/PHY/INIT/nr_init_ue.c index 7a1c4d1ef5..05375c46ce 100644 --- a/openair1/PHY/INIT/nr_init_ue.c +++ b/openair1/PHY/INIT/nr_init_ue.c @@ -205,7 +205,32 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB) /////////// //////////////////////////////////////////////////////////////////////////////////////////// - //PRS init + // PRS vars + for(int idx = 0; idx < NR_MAX_PRS_COMB_SIZE; idx++) + { + prs_vars[idx] = (NR_UE_PRS *)malloc16_clear(sizeof(NR_UE_PRS)); + for(int k = 0; k < NR_MAX_PRS_RESOURCES_PER_SET; k++) + { + // PRS channel estimates + prs_vars[idx]->prs_resource[k].prs_ch_estimates = (int32_t **)malloc16_clear( fp->nb_antennas_rx*sizeof(int32_t *) ); + prs_vars[idx]->prs_resource[k].prs_ch_estimates_time = (int32_t **)malloc16_clear( fp->nb_antennas_rx*sizeof(int32_t *) ); + AssertFatal(((prs_vars[idx]->prs_resource[k].prs_ch_estimates!=NULL) || (prs_vars[idx]->prs_resource[k].prs_ch_estimates_time!=NULL)), "NR UE init: PRS channel estimates malloc failed for gNB_id %d\n", idx); + prs_vars[idx]->prs_resource[k].prs_meas = (prs_meas_t **)malloc16_clear( fp->nb_antennas_rx*sizeof(prs_meas_t *) ); + AssertFatal((prs_vars[idx]->prs_resource[k].prs_meas!=NULL), "NR UE init: PRS measurements malloc failed for gNB_id %d\n", idx); + + for (i=0; inb_antennas_rx; i++) { + prs_vars[idx]->prs_resource[k].prs_ch_estimates[i] = (int32_t *)malloc16_clear(fp->ofdm_symbol_size*sizeof(int32_t)); + prs_vars[idx]->prs_resource[k].prs_ch_estimates_time[i] = (int32_t *)malloc16_clear(fp->ofdm_symbol_size*sizeof(int32_t)); + AssertFatal(((prs_vars[idx]->prs_resource[k].prs_ch_estimates[i]!=NULL) || (prs_vars[idx]->prs_resource[k].prs_ch_estimates_time[i]!=NULL)), "NR UE init: PRS channel estimates malloc failed for rx_ant %d\n", i); + prs_vars[idx]->prs_resource[k].prs_meas[i] = (prs_meas_t *)malloc16_clear(sizeof(prs_meas_t) ); + AssertFatal((prs_vars[idx]->prs_resource[k].prs_meas[i]!=NULL), "NR UE init: PRS measurements malloc failed for rx_ant %d\n", i); + } + } + } + // load the config file params + RCconfig_nrUE_prs(ue); + + //PRS sequence init ue->nr_gold_prs = (uint32_t *****)malloc16(ue->prs_active_gNBs*sizeof(uint32_t ****)); uint32_t *****prs = ue->nr_gold_prs; AssertFatal(prs!=NULL, "NR UE init: positioning reference signal malloc failed\n"); @@ -337,29 +362,6 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB) } } - // PRS vars - for(int idx = 0; idx < NR_MAX_PRS_COMB_SIZE; idx++) - { - prs_vars[idx] = (NR_UE_PRS *)malloc16_clear(sizeof(NR_UE_PRS)); - for(int k = 0; k < NR_MAX_PRS_RESOURCES_PER_SET; k++) - { - // PRS channel estimates - prs_vars[idx]->prs_resource[k].prs_ch_estimates = (int32_t **)malloc16_clear( fp->nb_antennas_rx*sizeof(int32_t *) ); - prs_vars[idx]->prs_resource[k].prs_ch_estimates_time = (int32_t **)malloc16_clear( fp->nb_antennas_rx*sizeof(int32_t *) ); - AssertFatal(((prs_vars[idx]->prs_resource[k].prs_ch_estimates!=NULL) || (prs_vars[idx]->prs_resource[k].prs_ch_estimates_time!=NULL)), "NR UE init: PRS channel estimates malloc failed for gNB_id %d\n", idx); - prs_vars[idx]->prs_resource[k].prs_meas = (prs_meas_t **)malloc16_clear( fp->nb_antennas_rx*sizeof(prs_meas_t *) ); - AssertFatal((prs_vars[idx]->prs_resource[k].prs_meas!=NULL), "NR UE init: PRS measurements malloc failed for gNB_id %d\n", idx); - - for (i=0; inb_antennas_rx; i++) { - prs_vars[idx]->prs_resource[k].prs_ch_estimates[i] = (int32_t *)malloc16_clear(fp->ofdm_symbol_size*sizeof(int32_t)); - prs_vars[idx]->prs_resource[k].prs_ch_estimates_time[i] = (int32_t *)malloc16_clear(fp->ofdm_symbol_size*sizeof(int32_t)); - AssertFatal(((prs_vars[idx]->prs_resource[k].prs_ch_estimates[i]!=NULL) || (prs_vars[idx]->prs_resource[k].prs_ch_estimates_time[i]!=NULL)), "NR UE init: PRS channel estimates malloc failed for rx_ant %d\n", i); - prs_vars[idx]->prs_resource[k].prs_meas[i] = (prs_meas_t *)malloc16_clear(sizeof(prs_meas_t) ); - AssertFatal((prs_vars[idx]->prs_resource[k].prs_meas[i]!=NULL), "NR UE init: PRS measurements malloc failed for rx_ant %d\n", i); - } - } - } - // DLSCH for (gNB_id = 0; gNB_id < ue->n_connected_gNB+1; gNB_id++) { for (th_id=0; th_id Date: Tue, 14 Jun 2022 10:48:00 +0200 Subject: [PATCH 100/135] Added PRS resource repetition capability in OAI gNB and UE --- openair1/SCHED_NR/phy_procedures_nr_gNB.c | 11 +++++++---- openair1/SCHED_NR_UE/phy_procedures_nr_ue.c | 14 ++++++++------ 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index 06180c4096..573fefbcc7 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -68,11 +68,14 @@ uint8_t check_prs_slot_gNB(uint8_t *prs_rsc_id, NR_gNB_PRS *prs_vars, NR_DL_FRAM uint8_t is_prs_slot = 0, rsc_id = 0; for(rsc_id = 0; rsc_id < prs_vars->NumPRSResources; rsc_id++) { - if((prs_vars->prs_cfg[rsc_id].PRSResourceSetPeriod[1] + prs_vars->prs_cfg[rsc_id].PRSResourceOffset) == ((frame_tx*fp->slots_per_frame+nr_slot_tx)%prs_vars->prs_cfg[rsc_id].PRSResourceSetPeriod[0])) + for (int i = 0; i < prs_vars->prs_cfg[rsc_id].PRSResourceRepetition; i++) { - is_prs_slot = 1; - *prs_rsc_id = rsc_id; - break; + if( (((frame_tx*fp->slots_per_frame + nr_slot_tx) - (prs_vars->prs_cfg[rsc_id].PRSResourceSetPeriod[1] + prs_vars->prs_cfg[rsc_id].PRSResourceOffset))%prs_vars->prs_cfg[rsc_id].PRSResourceSetPeriod[0]) == i*prs_vars->prs_cfg[rsc_id].PRSResourceTimeGap ) + { + is_prs_slot = 1; + *prs_rsc_id = rsc_id; + break; + } } } return is_prs_slot; diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c index 7ff7d18505..5294d1980a 100644 --- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c +++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c @@ -1381,13 +1381,15 @@ uint8_t check_prs_slot_nrUE(PHY_VARS_NR_UE *ue, NR_DL_FRAME_PARMS *fp, uint8_t * { for(rsc_id = 0; rsc_id < ue->prs_vars[gNB_id]->NumPRSResources; rsc_id++) { - if((ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_cfg.PRSResourceSetPeriod[1] + ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_cfg.PRSResourceOffset) == - ((frame_rx*fp->slots_per_frame + nr_slot_rx)%ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_cfg.PRSResourceSetPeriod[0])) + for (int i = 0; i < ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_cfg.PRSResourceRepetition; i++) { - is_prs_slot = 1; - *prs_rsc_id = rsc_id; - *prs_gNB_id = gNB_id; - return is_prs_slot; + if( (((frame_rx*fp->slots_per_frame + nr_slot_rx) - (ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_cfg.PRSResourceSetPeriod[1] + ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_cfg.PRSResourceOffset))%ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_cfg.PRSResourceSetPeriod[0]) == i*ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_cfg.PRSResourceTimeGap) + { + is_prs_slot = 1; + *prs_rsc_id = rsc_id; + *prs_gNB_id = gNB_id; + return is_prs_slot; + } } } } From e4ef9d3ac1db331dbfff938d107c3c88f641cf58 Mon Sep 17 00:00:00 2001 From: Sagar Parsawar Date: Sat, 25 Jun 2022 13:25:53 +0200 Subject: [PATCH 101/135] Added same slot scheduling for multiple gNB and PRS resources --- .../nr_dl_channel_estimation.c | 8 +++- openair1/PHY/defs_nr_UE.h | 2 - openair1/SCHED_NR/phy_procedures_nr_gNB.c | 39 ++++++---------- openair1/SCHED_NR/sched_nr.h | 1 - openair1/SCHED_NR_UE/defs.h | 1 - openair1/SCHED_NR_UE/phy_procedures_nr_ue.c | 46 +++++++------------ openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c | 17 +------ 7 files changed, 39 insertions(+), 75 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 0ca22b96d9..da8d206343 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -57,11 +57,17 @@ int nr_prs_channel_estimation(uint8_t gNB_id, NR_DL_FRAME_PARMS *frame_params) { int32_t **rxdataF = ue->common_vars.common_vars_rx_data_per_thread[proc->thread_id].rxdataF; - uint32_t **nr_gold_prs = ue->nr_gold_prs[gNB_id][rsc_id][proc->nr_slot_rx]; prs_data_t *prs_cfg = &ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_cfg; prs_meas_t **prs_meas = ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_meas; int32_t **prs_chestF = ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_ch_estimates; int32_t **prs_chestT = ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_ch_estimates_time; + int slot_prs; + if(prs_cfg->PRSResourceRepetition > 1) + slot_prs = proc->nr_slot_rx - prs_cfg->PRSResourceTimeGap; + else + slot_prs = proc->nr_slot_rx; + + uint32_t **nr_gold_prs = ue->nr_gold_prs[gNB_id][rsc_id][slot_prs]; uint8_t rxAnt = 0, idx = 0; int16_t *rxF, *pil, *fl, *fm, *fmm, *fml, *fmr, *fr, mod_prs[NR_MAX_PRS_LENGTH<<1]; diff --git a/openair1/PHY/defs_nr_UE.h b/openair1/PHY/defs_nr_UE.h index 68130d9037..2991a4b956 100644 --- a/openair1/PHY/defs_nr_UE.h +++ b/openair1/PHY/defs_nr_UE.h @@ -734,8 +734,6 @@ typedef struct { NR_UE_DLSCH_t *dlsch_MCH[NUMBER_OF_CONNECTED_gNB_MAX]; NR_UE_PRS *prs_vars[NR_MAX_PRS_COMB_SIZE]; uint8_t prs_active_gNBs; - uint8_t prs_start_symb; - uint8_t prs_end_symb; //Paging parameters uint32_t IMSImod1024; diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index 573fefbcc7..bb3224e42e 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -63,24 +63,6 @@ void nr_set_ssb_first_subcarrier(nfapi_nr_config_request_scf_t *cfg, NR_DL_FRAME LOG_D(PHY, "SSB first subcarrier %d (%d,%d)\n", fp->ssb_start_subcarrier,cfg->ssb_table.ssb_offset_point_a.value,sco); } -uint8_t check_prs_slot_gNB(uint8_t *prs_rsc_id, NR_gNB_PRS *prs_vars, NR_DL_FRAME_PARMS *fp, int frame_tx, int nr_slot_tx) -{ - uint8_t is_prs_slot = 0, rsc_id = 0; - for(rsc_id = 0; rsc_id < prs_vars->NumPRSResources; rsc_id++) - { - for (int i = 0; i < prs_vars->prs_cfg[rsc_id].PRSResourceRepetition; i++) - { - if( (((frame_tx*fp->slots_per_frame + nr_slot_tx) - (prs_vars->prs_cfg[rsc_id].PRSResourceSetPeriod[1] + prs_vars->prs_cfg[rsc_id].PRSResourceOffset))%prs_vars->prs_cfg[rsc_id].PRSResourceSetPeriod[0]) == i*prs_vars->prs_cfg[rsc_id].PRSResourceTimeGap ) - { - is_prs_slot = 1; - *prs_rsc_id = rsc_id; - break; - } - } - } - return is_prs_slot; -} - void nr_common_signal_procedures (PHY_VARS_gNB *gNB,int frame,int slot,nfapi_nr_dl_tti_ssb_pdu ssb_pdu) { NR_DL_FRAME_PARMS *fp=&gNB->frame_parms; @@ -146,8 +128,7 @@ void phy_procedures_gNB_TX(processingData_L1tx_t *msgTx, PHY_VARS_gNB *gNB = msgTx->gNB; NR_DL_FRAME_PARMS *fp=&gNB->frame_parms; nfapi_nr_config_request_scf_t *cfg = &gNB->gNB_config; - int offset = gNB->CC_id; - uint8_t rsc_id = 0, is_prs_slot = 0; + int offset = gNB->CC_id, slot_prs; int txdataF_offset = slot*fp->samples_per_slot_wCP; if ((cfg->cell_config.frame_duplex_type.value == TDD) && @@ -162,11 +143,21 @@ void phy_procedures_gNB_TX(processingData_L1tx_t *msgTx, } // Check for PRS slot - is_prs_slot = check_prs_slot_gNB(&rsc_id, &gNB->prs_vars, fp, frame, slot); - if(is_prs_slot) + for(int rsc_id = 0; rsc_id < gNB->prs_vars.NumPRSResources; rsc_id++) { - LOG_D(PHY,"gNB_TX: frame %d, slot %d, PRS Resource ID %d\n",frame, slot, rsc_id); - nr_generate_prs(gNB->nr_gold_prs[rsc_id][slot],&gNB->common_vars.txdataF[0][txdataF_offset], AMP, &gNB->prs_vars.prs_cfg[rsc_id], cfg, fp); + for (int i = 0; i < gNB->prs_vars.prs_cfg[rsc_id].PRSResourceRepetition; i++) + { + if( (((frame*fp->slots_per_frame + slot) - (gNB->prs_vars.prs_cfg[rsc_id].PRSResourceSetPeriod[1] + gNB->prs_vars.prs_cfg[rsc_id].PRSResourceOffset))%gNB->prs_vars.prs_cfg[rsc_id].PRSResourceSetPeriod[0]) == i*gNB->prs_vars.prs_cfg[rsc_id].PRSResourceTimeGap ) + { + if (gNB->prs_vars.prs_cfg[rsc_id].PRSResourceRepetition > 1) + slot_prs = slot - gNB->prs_vars.prs_cfg[rsc_id].PRSResourceTimeGap; + else + slot_prs = slot; + + LOG_D(PHY,"gNB_TX: frame %d, slot %d, PRS Resource ID %d\n",frame, slot, rsc_id); + nr_generate_prs(gNB->nr_gold_prs[rsc_id][slot_prs],&gNB->common_vars.txdataF[0][txdataF_offset], AMP, &gNB->prs_vars.prs_cfg[rsc_id], cfg, fp); + } + } } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_gNB_COMMON_TX,1); diff --git a/openair1/SCHED_NR/sched_nr.h b/openair1/SCHED_NR/sched_nr.h index 033ce2061f..2124397c47 100644 --- a/openair1/SCHED_NR/sched_nr.h +++ b/openair1/SCHED_NR/sched_nr.h @@ -54,7 +54,6 @@ void nr_fep_full(RU_t *ru, int slot); void nr_fep_full_2thread(RU_t *ru, int slot); void feptx_prec(RU_t *ru,int frame_tx,int tti_tx); int nr_phy_init_RU(RU_t *ru); -uint8_t check_prs_slot_gNB(uint8_t *prs_rsc_id, NR_gNB_PRS *prs_vars, NR_DL_FRAME_PARMS *fp, int frame_tx, int nr_slot_tx); void nr_phy_free_RU(RU_t *ru); #endif diff --git a/openair1/SCHED_NR_UE/defs.h b/openair1/SCHED_NR_UE/defs.h index b0767e42d2..9bcf659eac 100644 --- a/openair1/SCHED_NR_UE/defs.h +++ b/openair1/SCHED_NR_UE/defs.h @@ -373,7 +373,6 @@ int get_tx_harq_id(NR_UE_ULSCH_t *ulsch, int slot_tx); int is_pbch_in_slot(fapi_nr_config_request_t *config, int frame, int slot, NR_DL_FRAME_PARMS *fp); int is_ssb_in_slot(fapi_nr_config_request_t *config, int frame, int slot, NR_DL_FRAME_PARMS *fp); -uint8_t check_prs_slot_nrUE(PHY_VARS_NR_UE *ue, NR_DL_FRAME_PARMS *fp, uint8_t *prs_gNB_id, uint8_t *prs_rsc_id, int frame_rx, int nr_slot_rx); /*! \brief This function prepares the dl indication to pass to the MAC @param diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c index 5294d1980a..f334ee4f08 100644 --- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c +++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c @@ -1374,28 +1374,6 @@ int is_pbch_in_slot(fapi_nr_config_request_t *config, int frame, int slot, NR_DL } } -uint8_t check_prs_slot_nrUE(PHY_VARS_NR_UE *ue, NR_DL_FRAME_PARMS *fp, uint8_t *prs_gNB_id, uint8_t *prs_rsc_id, int frame_rx, int nr_slot_rx) -{ - uint8_t is_prs_slot = 0, rsc_id = 0, gNB_id = 0; - for(gNB_id = 0; gNB_id < ue->prs_active_gNBs; gNB_id++) - { - for(rsc_id = 0; rsc_id < ue->prs_vars[gNB_id]->NumPRSResources; rsc_id++) - { - for (int i = 0; i < ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_cfg.PRSResourceRepetition; i++) - { - if( (((frame_rx*fp->slots_per_frame + nr_slot_rx) - (ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_cfg.PRSResourceSetPeriod[1] + ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_cfg.PRSResourceOffset))%ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_cfg.PRSResourceSetPeriod[0]) == i*ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_cfg.PRSResourceTimeGap) - { - is_prs_slot = 1; - *prs_rsc_id = rsc_id; - *prs_gNB_id = gNB_id; - return is_prs_slot; - } - } - } - } - return is_prs_slot; -} - int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, uint8_t gNB_id, @@ -1409,7 +1387,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue, int slot_pbch; int slot_ssb; fapi_nr_config_request_t *cfg = &ue->nrUE_config; - uint8_t rsc_id = 0, is_prs_slot = 0, prs_gNB_id = 0; + int num_prs = 0; uint8_t nb_symb_pdcch = phy_pdcch_config->nb_search_space > 0 ? phy_pdcch_config->pdcch_config[0].coreset.duration : 0; uint8_t dci_cnt = 0; @@ -1484,19 +1462,27 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue, } // Check for PRS slot - is_prs_slot = check_prs_slot_nrUE(ue, fp, &prs_gNB_id, &rsc_id, frame_rx, nr_slot_rx); - if (is_prs_slot) + for(int gNB_id = 0; gNB_id < ue->prs_active_gNBs; gNB_id++) { - for(int j = ue->prs_start_symb; j < ue->prs_end_symb; j++) + for(int rsc_id = 0; rsc_id < ue->prs_vars[gNB_id]->NumPRSResources; rsc_id++) { + for (int i = 0; i < ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_cfg.PRSResourceRepetition; i++) + { + if( (((frame_rx*fp->slots_per_frame + nr_slot_rx) - (ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_cfg.PRSResourceSetPeriod[1] + ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_cfg.PRSResourceOffset))%ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_cfg.PRSResourceSetPeriod[0]) == i*ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_cfg.PRSResourceTimeGap) + { + for(int j = ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_cfg.SymbolStart; (j < (ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_cfg.SymbolStart+ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_cfg.NumPRSSymbols)); j++) + { nr_slot_fep(ue, proc, (j%fp->symbols_per_slot), nr_slot_rx); - } - - nr_prs_channel_estimation(prs_gNB_id,rsc_id,ue,proc,fp); - } + } + nr_prs_channel_estimation(gNB_id,rsc_id,ue,proc,fp); + num_prs++; + } + } // for i + } // for rsc_id + } // for gNB_id if ((frame_rx%64 == 0) && (nr_slot_rx==0)) { LOG_I(NR_PHY,"============================================\n"); diff --git a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c index 481545874c..958786df8b 100644 --- a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c +++ b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c @@ -1347,7 +1347,7 @@ void RCconfig_nr_ue_L1(void) { void RCconfig_nrUE_prs(void *cfg) { - int j = 0, k = 0, gNB_id = 0, prs_start = 0, prs_end = 0; + int j = 0, k = 0, gNB_id = 0; char aprefix[MAX_OPTNAME_SIZE*2 + 8]; PHY_VARS_NR_UE *ue = (PHY_VARS_NR_UE *)cfg; @@ -1393,17 +1393,6 @@ void RCconfig_nrUE_prs(void *cfg) ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.MutingPattern1[l] = PRS_ParamList.paramarray[j][PRS_MUTING_PATTERN1_LIST].uptr[l]; for (int l = 0; l < PRS_ParamList.paramarray[j][PRS_MUTING_PATTERN2_LIST].numelt; l++) ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.MutingPattern2[l] = PRS_ParamList.paramarray[j][PRS_MUTING_PATTERN2_LIST].uptr[l]; - - if(gNB_id==0 && k==0) - { - prs_start = ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.SymbolStart; - prs_end = ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.SymbolStart+ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.NumPRSSymbols; - } - else - { - prs_start = MIN((prs_start), (ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.SymbolStart)); - prs_end = MAX((prs_end), (ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.SymbolStart+ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.NumPRSSymbols)); - } } // for k k = 0; @@ -1454,10 +1443,6 @@ void RCconfig_nrUE_prs(void *cfg) LOG_I(NR_PHY,"No %s configuration found\n", PRS_ParamList.listname); } } - ue->prs_start_symb = prs_start; - ue->prs_end_symb = prs_end; - LOG_I(PHY, "prs_active_gNBs %d, prs_start_symb %d, prs_end_symb %d\n", ue->prs_active_gNBs, ue->prs_start_symb, ue->prs_end_symb); - AssertFatal((prs_start <= prs_end) || (prs_end > NR_SYMBOLS_PER_SLOT), "Invalid PRS symbol allocation, please check the start and end symbols\n"); } /* From f2de1eb4eb139cc0081b7bb3e128ec686945a444 Mon Sep 17 00:00:00 2001 From: Sagar Parsawar Date: Sat, 25 Jun 2022 13:27:36 +0200 Subject: [PATCH 102/135] T tracer dumps per PRS resources --- common/utils/T/T_messages.txt | 4 ++-- openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c | 2 +- openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/common/utils/T/T_messages.txt b/common/utils/T/T_messages.txt index 30982b57aa..8ec3538c10 100644 --- a/common/utils/T/T_messages.txt +++ b/common/utils/T/T_messages.txt @@ -1288,11 +1288,11 @@ ID = UE_PHY_INPUT_SIGNAL ID = UE_PHY_DL_CHANNEL_ESTIMATE DESC = UE channel estimation in the time domain GROUP = ALL:PHY:GRAPHIC:HEAVY:UE - FORMAT = int,eNB_ID : int,frame : int,subframe : int,antenna : buffer,chest_t + FORMAT = int,eNB_ID : int,rsc_id : int,frame : int,subframe : int,antenna : buffer,chest_t ID = UE_PHY_DL_CHANNEL_ESTIMATE_FREQ DESC = UE channel estimation in the frequency domain GROUP = ALL:PHY:GRAPHIC:HEAVY:UE - FORMAT = int,eNB_ID : int,frame : int,subframe : int,antenna : buffer,chestF_t + FORMAT = int,eNB_ID : int,rsc_id : int,frame : int,subframe : int,antenna : buffer,chestF_t ID = UE_PHY_PDCCH_IQ DESC = UE PDCCH received IQ data GROUP = ALL:PHY:GRAPHIC:HEAVY:UE diff --git a/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c b/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c index d221348b44..fc77d4ae18 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c @@ -701,7 +701,7 @@ int lte_dl_channel_estimation(PHY_VARS_UE *ue, } } - T(T_UE_PHY_DL_CHANNEL_ESTIMATE, T_INT(eNB_id), + T(T_UE_PHY_DL_CHANNEL_ESTIMATE, T_INT(eNB_id), T_INT(0), T_INT(ue->proc.proc_rxtx[ue->current_thread_id[Ns>>1]].frame_rx%1024), T_INT(ue->proc.proc_rxtx[ue->current_thread_id[Ns>>1]].subframe_rx), T_INT(0), T_BUFFER(&ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].dl_ch_estimates_time[eNB_offset][0][0], 512 * 4)); return(0); 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 da8d206343..81c0d75fc7 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -519,11 +519,11 @@ int nr_prs_channel_estimation(uint8_t gNB_id, T_INT(proc->frame_rx), T_INT(proc->nr_slot_rx), T_INT(rxAnt), T_BUFFER(&rxdataF[rxAnt][0], frame_params->samples_per_slot_wCP*sizeof(int32_t))); - T(T_UE_PHY_DL_CHANNEL_ESTIMATE_FREQ, T_INT(gNB_id), + T(T_UE_PHY_DL_CHANNEL_ESTIMATE_FREQ, T_INT(gNB_id), T_INT(rsc_id), T_INT(proc->frame_rx), T_INT(proc->nr_slot_rx), T_INT(rxAnt), T_BUFFER(&prs_chestF[rxAnt][0], frame_params->ofdm_symbol_size*sizeof(int32_t))); - T(T_UE_PHY_DL_CHANNEL_ESTIMATE, T_INT(gNB_id), + T(T_UE_PHY_DL_CHANNEL_ESTIMATE, T_INT(gNB_id), T_INT(rsc_id), T_INT(proc->frame_rx), T_INT(proc->nr_slot_rx), T_INT(rxAnt), T_BUFFER(&prs_chestT[rxAnt][0], frame_params->ofdm_symbol_size*sizeof(int32_t))); } From 605a44233bf387e2aa7a1e707d6f8798fc695f0b Mon Sep 17 00:00:00 2001 From: Sagar Parsawar Date: Sat, 25 Jun 2022 16:23:43 +0200 Subject: [PATCH 103/135] Fixing PRS resource repetition handling --- openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c | 5 +++-- openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h | 1 + openair1/SCHED_NR/phy_procedures_nr_gNB.c | 8 ++++---- openair1/SCHED_NR_UE/phy_procedures_nr_ue.c | 6 ++---- 4 files changed, 10 insertions(+), 10 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 81c0d75fc7..591d4d037b 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -52,6 +52,7 @@ static inline int abs32(int x) int nr_prs_channel_estimation(uint8_t gNB_id, uint8_t rsc_id, + uint8_t rep_num, PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, NR_DL_FRAME_PARMS *frame_params) @@ -62,8 +63,8 @@ int nr_prs_channel_estimation(uint8_t gNB_id, int32_t **prs_chestF = ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_ch_estimates; int32_t **prs_chestT = ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_ch_estimates_time; int slot_prs; - if(prs_cfg->PRSResourceRepetition > 1) - slot_prs = proc->nr_slot_rx - prs_cfg->PRSResourceTimeGap; + if(rep_num > 0) + slot_prs = (proc->nr_slot_rx - prs_cfg->PRSResourceTimeGap)%frame_params->slots_per_frame; else slot_prs = proc->nr_slot_rx; diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h b/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h index 839c8f5680..a5c568c22a 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h @@ -35,6 +35,7 @@ /* A function to perform the channel estimation of DL PRS signal */ int nr_prs_channel_estimation(uint8_t gNB_id, uint8_t rsc_id, + uint8_t rep_num, PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, NR_DL_FRAME_PARMS *frame_params); diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index bb3224e42e..3fbd0e654d 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -147,14 +147,14 @@ void phy_procedures_gNB_TX(processingData_L1tx_t *msgTx, { for (int i = 0; i < gNB->prs_vars.prs_cfg[rsc_id].PRSResourceRepetition; i++) { - if( (((frame*fp->slots_per_frame + slot) - (gNB->prs_vars.prs_cfg[rsc_id].PRSResourceSetPeriod[1] + gNB->prs_vars.prs_cfg[rsc_id].PRSResourceOffset))%gNB->prs_vars.prs_cfg[rsc_id].PRSResourceSetPeriod[0]) == i*gNB->prs_vars.prs_cfg[rsc_id].PRSResourceTimeGap ) + if( (((frame*fp->slots_per_frame + slot) - (gNB->prs_vars.prs_cfg[rsc_id].PRSResourceSetPeriod[1] + gNB->prs_vars.prs_cfg[rsc_id].PRSResourceOffset)+gNB->prs_vars.prs_cfg[rsc_id].PRSResourceSetPeriod[0])%gNB->prs_vars.prs_cfg[rsc_id].PRSResourceSetPeriod[0]) == i*gNB->prs_vars.prs_cfg[rsc_id].PRSResourceTimeGap ) { - if (gNB->prs_vars.prs_cfg[rsc_id].PRSResourceRepetition > 1) - slot_prs = slot - gNB->prs_vars.prs_cfg[rsc_id].PRSResourceTimeGap; + if (i > 0) + slot_prs = (slot - gNB->prs_vars.prs_cfg[rsc_id].PRSResourceTimeGap + fp->slots_per_frame)%fp->slots_per_frame; else slot_prs = slot; - LOG_D(PHY,"gNB_TX: frame %d, slot %d, PRS Resource ID %d\n",frame, slot, rsc_id); + LOG_D(PHY,"gNB_TX: frame %d, slot %d, slot_prs %d, PRS Resource ID %d\n",frame, slot, slot_prs, rsc_id); nr_generate_prs(gNB->nr_gold_prs[rsc_id][slot_prs],&gNB->common_vars.txdataF[0][txdataF_offset], AMP, &gNB->prs_vars.prs_cfg[rsc_id], cfg, fp); } } diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c index f334ee4f08..020a32439b 100644 --- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c +++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c @@ -1387,7 +1387,6 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue, int slot_pbch; int slot_ssb; fapi_nr_config_request_t *cfg = &ue->nrUE_config; - int num_prs = 0; uint8_t nb_symb_pdcch = phy_pdcch_config->nb_search_space > 0 ? phy_pdcch_config->pdcch_config[0].coreset.duration : 0; uint8_t dci_cnt = 0; @@ -1470,15 +1469,14 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue, { if( (((frame_rx*fp->slots_per_frame + nr_slot_rx) - (ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_cfg.PRSResourceSetPeriod[1] + ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_cfg.PRSResourceOffset))%ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_cfg.PRSResourceSetPeriod[0]) == i*ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_cfg.PRSResourceTimeGap) { - for(int j = ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_cfg.SymbolStart; (j < (ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_cfg.SymbolStart+ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_cfg.NumPRSSymbols)); j++) + for(int j = ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_cfg.SymbolStart; j < (ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_cfg.SymbolStart+ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_cfg.NumPRSSymbols); j++) { nr_slot_fep(ue, proc, (j%fp->symbols_per_slot), nr_slot_rx); } - nr_prs_channel_estimation(gNB_id,rsc_id,ue,proc,fp); - num_prs++; + nr_prs_channel_estimation(gNB_id,rsc_id,i,ue,proc,fp); } } // for i } // for rsc_id From 63b94b742a30ff66094c24b9777aceba7510ad8b Mon Sep 17 00:00:00 2001 From: Sagar Parsawar Date: Tue, 28 Jun 2022 16:11:58 +0200 Subject: [PATCH 104/135] Adding PRS multiple gNB and UE configs --- ...nb.sa.band257.fr2.128PRB.prs.usrpx310.conf | 18 +- ...b.sa.band257.fr2.128PRB.prs.usrpx310.conf2 | 322 ++++++++++++++++++ ...gnb.sa.band257.fr2.64PRB.prs.usrpx310.conf | 20 +- ...nb.sa.band257.fr2.64PRB.prs.usrpx310.conf2 | 322 ++++++++++++++++++ .../gnb.sa.band78.fr1.106PRB.usrpb210.conf | 12 +- ...gnb.sa.band78.fr1.217PRB.prs.usrpx310.conf | 6 +- ...nb.sa.band78.fr1.217PRB.prs.usrpx310.conf2 | 322 ++++++++++++++++++ ...gnb.sa.band78.fr1.273PRB.prs.usrpn310.conf | 6 +- ...nb.sa.band78.fr1.273PRB.prs.usrpn310.conf2 | 14 +- .../CONF/ue.nr.prs.fr1.217prb.conf | 12 +- .../CONF/ue.nr.prs.fr1.273prb.conf | 36 +- .../CONF/ue.nr.prs.fr2.128prb.conf | 28 +- .../CONF/ue.nr.prs.fr2.64prb.conf | 28 +- 13 files changed, 1060 insertions(+), 86 deletions(-) create mode 100644 targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band257.fr2.128PRB.prs.usrpx310.conf2 create mode 100644 targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band257.fr2.64PRB.prs.usrpx310.conf2 create mode 100644 targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.217PRB.prs.usrpx310.conf2 diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band257.fr2.128PRB.prs.usrpx310.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band257.fr2.128PRB.prs.usrpx310.conf index 10f77dcef5..2769689bcc 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band257.fr2.128PRB.prs.usrpx310.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band257.fr2.128PRB.prs.usrpx310.conf @@ -143,7 +143,7 @@ gNBs = # ssb_periodicityServingCell # 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1 - ssb_periodicityServingCell = 2; + ssb_periodicityServingCell = 1; # dmrs_TypeA_position # 0 = pos2, 1 = pos3 @@ -216,18 +216,18 @@ MACRLCs = ( prs_config = ( { - NumPRSResources = 1; - PRSResourceSetPeriod = [40, 0]; - SymbolStart = [7]; - NumPRSSymbols = [7]; + NumPRSResources = 8; + PRSResourceSetPeriod = [80, 0]; + SymbolStart = [7,7,7,7,7,7,7,7]; + NumPRSSymbols = [6,6,6,6,6,6,6,6]; NumRB = 128; RBOffset = 0; CombSize = 4; - REOffset = [0]; - PRSResourceOffset = [0]; + REOffset = [0,0,0,0,0,0,0,0]; + PRSResourceOffset = [0,10,20,30,40,50,60,70]; PRSResourceRepetition = 1; PRSResourceTimeGap = 1; - NPRS_ID = [0]; + NPRS_ID = [0,1,2,3,4,5,6,7]; MutingPattern1 = []; MutingPattern2 = []; MutingBitRepetition = 1; @@ -260,7 +260,7 @@ RUs = ( ##beamforming 1x2 matrix: 1 layer x 2 antennas bf_weights = [0x00007fff, 0x0000]; #clock_src = "internal"; - sdr_addrs = "addr=192.168.50.2,second_addr=192.168.60.2,clock_source=internal,time_source=internal" + sdr_addrs = "addr=192.168.50.2,clock_source=gpsdo,time_source=gpsdo" if_freq = 50000000L; } ); diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band257.fr2.128PRB.prs.usrpx310.conf2 b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band257.fr2.128PRB.prs.usrpx310.conf2 new file mode 100644 index 0000000000..738280ad30 --- /dev/null +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band257.fr2.128PRB.prs.usrpx310.conf2 @@ -0,0 +1,322 @@ +Active_gNBs = ( "gNB-OAI"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +gNBs = +( + { + ////////// Identification parameters: + gNB_ID = 0xe00; + gNB_name = "gNB-OAI"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = 1; + plmn_list = ({ + mcc = 208; + mnc = 99; + mnc_length = 2; + snssaiList = ( + { + sst = 1; + sd = 0x1; // 0 false, else true + }, + { + sst = 1; + sd = 0x112233; // 0 false, else true + } + ); + + }); + + nr_cellid = 12345678L; + + ////////// Physical parameters: + + ssb_SubcarrierOffset = 0; + pdsch_AntennaPorts = 1; + pusch_AntennaPorts = 1; + sib1_tda = 0; + + pdcch_ConfigSIB1 = ( + { + controlResourceSetZero = 12; + searchSpaceZero = 0; + } + ); + + servingCellConfigCommon = ( + { + #spCellConfigCommon + + physCellId = 0; + +# downlinkConfigCommon + #frequencyInfoDL + # this is pointA + 23 PRBs@120kHz SCS (same as initial BWP) + absoluteFrequencySSB = 2078315; + dl_frequencyBand = 257; + # this is 27.900 GHz + dl_absoluteFrequencyPointA = 2077499; + #scs-SpecificCarrierList + dl_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + dl_subcarrierSpacing = 3; + dl_carrierBandwidth = 128; + #initialDownlinkBWP + #genericParameters + # this is RBstart=27,L=48 (275*(L-1))+RBstart + initialDLBWPlocationAndBandwidth = 13475; # 6366 12925 12956 28875 12952 +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + initialDLBWPsubcarrierSpacing = 3; + #pdcch-ConfigCommon + initialDLBWPcontrolResourceSetZero = 12; + initialDLBWPsearchSpaceZero = 0; + + #uplinkConfigCommon + #frequencyInfoUL + ul_frequencyBand = 257; + #scs-SpecificCarrierList + ul_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + ul_subcarrierSpacing = 3; + ul_carrierBandwidth = 128; + pMax = 20; + #initialUplinkBWP + #genericParameters + initialULBWPlocationAndBandwidth = 13475; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + initialULBWPsubcarrierSpacing = 3; + #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 = 15; +#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 = 3, +# restrictedSetConfig +# 0=unrestricted, 1=restricted type A, 2=restricted type B + restrictedSetConfig = 0, + + 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 = 3; + ssb_PositionsInBurst_Bitmap = 0x0010001000100010L; + +# ssb_periodicityServingCell +# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1 + ssb_periodicityServingCell = 1; + +# dmrs_TypeA_position +# 0 = pos2, 1 = pos3 + dmrs_TypeA_Position = 0; + +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + subcarrierSpacing = 3; + + + #tdd-UL-DL-ConfigurationCommon +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + referenceSubcarrierSpacing = 3; + # pattern1 + # dl_UL_TransmissionPeriodicity + # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10 + dl_UL_TransmissionPeriodicity = 3; + nrofDownlinkSlots = 7; + nrofDownlinkSymbols = 6; + nrofUplinkSlots = 2; + nrofUplinkSymbols = 4; + + ssPBCH_BlockPower = -25; + } + + ); + + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + + ////////// AMF parameters: + amf_ip_address = ( { ipv4 = "192.168.70.132"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + + NETWORK_INTERFACES : + { + GNB_INTERFACE_NAME_FOR_NG_AMF = "demo-oai"; + GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.70.129/24"; + GNB_INTERFACE_NAME_FOR_NGU = "demo-oai"; + GNB_IPV4_ADDRESS_FOR_NGU = "192.168.70.129/24"; + GNB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + } +); + +MACRLCs = ( +{ + num_cc = 1; + tr_s_preference = "local_L1"; + tr_n_preference = "local_RRC"; + pusch_TargetSNRx10 = 150; + pucch_TargetSNRx10 = 200; + ulsch_max_frame_inactivity = 1; +} +); + +prs_config = ( +{ + NumPRSResources = 8; + PRSResourceSetPeriod = [80, 0]; + SymbolStart = [7,7,7,7,7,7,7,7]; + NumPRSSymbols = [6,6,6,6,6,6,6,6]; + NumRB = 128; + RBOffset = 0; + CombSize = 4; + REOffset = [1,1,1,1,1,1,1,1]; + PRSResourceOffset = [0,10,20,30,40,50,60,70]; + PRSResourceRepetition = 1; + PRSResourceTimeGap = 1; + NPRS_ID = [10,11,12,13,14,15,16,17]; + MutingPattern1 = []; + MutingPattern2 = []; + MutingBitRepetition = 1; +} +); + +L1s = ( +{ + num_cc = 1; + tr_n_preference = "local_mac"; + pusch_proc_threads = 8; + prach_dtx_threshold = 120; + pucch0_dtx_threshold = 150; + ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0 +} +); + +RUs = ( +{ + local_rf = "yes" + nb_tx = 1 + nb_rx = 1 + att_tx = 0 + att_rx = 0; + bands = [257]; + max_pdschReferenceSignalPower = -27; + max_rxgain = 114; + sf_extension = 0; + eNB_instances = [0]; + ##beamforming 1x2 matrix: 1 layer x 2 antennas + bf_weights = [0x00007fff, 0x0000]; + #clock_src = "internal"; + sdr_addrs = "addr=192.168.50.2,clock_source=gpsdo,time_source=gpsdo" + if_freq = 50000000L; +} +); + +THREAD_STRUCT = ( +{ + #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT" + parallel_config = "PARALLEL_RU_L1_TRX_SPLIT"; + #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE" + worker_config = "WORKER_ENABLE"; +} +); + +rfsimulator : +{ + serveraddr = "server"; + serverport = "4043"; + options = ("saviq"); #or/and "chanmod" + modelname = "AWGN"; + IQfile = "/tmp/rfsimulator.iqs"; +}; + +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"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + ngap_log_level ="debug"; + ngap_log_verbosity ="medium"; +}; + diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band257.fr2.64PRB.prs.usrpx310.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band257.fr2.64PRB.prs.usrpx310.conf index 56bbc23ef0..b4006409e0 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band257.fr2.64PRB.prs.usrpx310.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band257.fr2.64PRB.prs.usrpx310.conf @@ -143,7 +143,7 @@ gNBs = # ssb_periodicityServingCell # 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1 - ssb_periodicityServingCell = 2; + ssb_periodicityServingCell = 1; # dmrs_TypeA_position # 0 = pos2, 1 = pos3 @@ -216,18 +216,18 @@ MACRLCs = ( prs_config = ( { - NumPRSResources = 1; - PRSResourceSetPeriod = [40, 0]; - SymbolStart = [7]; - NumPRSSymbols = [7]; + NumPRSResources = 8; + PRSResourceSetPeriod = [80, 0]; + SymbolStart = [7,7,7,7,7,7,7,7]; + NumPRSSymbols = [6,6,6,6,6,6,6,6]; NumRB = 64; RBOffset = 0; CombSize = 4; - REOffset = [0]; - PRSResourceOffset = [0]; + REOffset = [0,0,0,0,0,0,0,0]; + PRSResourceOffset = [0,10,20,30,40,50,60,70]; PRSResourceRepetition = 1; PRSResourceTimeGap = 1; - NPRS_ID = [0]; + NPRS_ID = [0,1,2,3,4,5,6,7]; MutingPattern1 = []; MutingPattern2 = []; MutingBitRepetition = 1; @@ -259,7 +259,9 @@ RUs = ( eNB_instances = [0]; #beamforming 1x4 matrix: bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000]; - clock_src = "internal"; + #clock_src = "internal"; + sdr_addrs = "addr=192.168.10.2,clock_source=gpsdo,time_source=gpsdo" + if_freq = 50000000L; } ); diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band257.fr2.64PRB.prs.usrpx310.conf2 b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band257.fr2.64PRB.prs.usrpx310.conf2 new file mode 100644 index 0000000000..42d8fbc203 --- /dev/null +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band257.fr2.64PRB.prs.usrpx310.conf2 @@ -0,0 +1,322 @@ +Active_gNBs = ( "gNB-OAI"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +gNBs = +( + { + ////////// Identification parameters: + gNB_ID = 0xe00; + gNB_name = "gNB-OAI"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = 1; + plmn_list = ({ + mcc = 208; + mnc = 99; + mnc_length = 2; + snssaiList = ( + { + sst = 1; + sd = 0x1; // 0 false, else true + }, + { + sst = 1; + sd = 0x112233; // 0 false, else true + } + ); + + }); + + nr_cellid = 12345678L; + + ////////// Physical parameters: + + ssb_SubcarrierOffset = 0; + pdsch_AntennaPorts = 1; + pusch_AntennaPorts = 1; + sib1_tda = 0; + + pdcch_ConfigSIB1 = ( + { + controlResourceSetZero = 12; + searchSpaceZero = 0; + } + ); + + servingCellConfigCommon = ( + { + #spCellConfigCommon + + physCellId = 0; + +# downlinkConfigCommon + #frequencyInfoDL + # this is pointA + 23 PRBs@120kHz SCS (same as initial BWP) + absoluteFrequencySSB = 2078315; + dl_frequencyBand = 257; + # this is 27.900 GHz + dl_absoluteFrequencyPointA = 2077499; + #scs-SpecificCarrierList + dl_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + dl_subcarrierSpacing = 3; + dl_carrierBandwidth = 64; + #initialDownlinkBWP + #genericParameters + # this is RBstart=27,L=48 (275*(L-1))+RBstart + initialDLBWPlocationAndBandwidth = 13475; # 6366 12925 12956 28875 12952 +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + initialDLBWPsubcarrierSpacing = 3; + #pdcch-ConfigCommon + initialDLBWPcontrolResourceSetZero = 12; + initialDLBWPsearchSpaceZero = 0; + + #uplinkConfigCommon + #frequencyInfoUL + ul_frequencyBand = 257; + #scs-SpecificCarrierList + ul_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + ul_subcarrierSpacing = 3; + ul_carrierBandwidth = 64; + pMax = 20; + #initialUplinkBWP + #genericParameters + initialULBWPlocationAndBandwidth = 13475; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + initialULBWPsubcarrierSpacing = 3; + #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 = 15; +#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 = 3, +# restrictedSetConfig +# 0=unrestricted, 1=restricted type A, 2=restricted type B + restrictedSetConfig = 0, + + 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 = 3; + ssb_PositionsInBurst_Bitmap = 0x0010001000100010L; + +# ssb_periodicityServingCell +# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1 + ssb_periodicityServingCell = 1; + +# dmrs_TypeA_position +# 0 = pos2, 1 = pos3 + dmrs_TypeA_Position = 0; + +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + subcarrierSpacing = 3; + + + #tdd-UL-DL-ConfigurationCommon +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + referenceSubcarrierSpacing = 3; + # pattern1 + # dl_UL_TransmissionPeriodicity + # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10 + dl_UL_TransmissionPeriodicity = 3; + nrofDownlinkSlots = 7; + nrofDownlinkSymbols = 6; + nrofUplinkSlots = 2; + nrofUplinkSymbols = 4; + + ssPBCH_BlockPower = -25; + } + + ); + + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + + ////////// AMF parameters: + amf_ip_address = ( { ipv4 = "192.168.70.132"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + + NETWORK_INTERFACES : + { + GNB_INTERFACE_NAME_FOR_NG_AMF = "demo-oai"; + GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.70.129/24"; + GNB_INTERFACE_NAME_FOR_NGU = "demo-oai"; + GNB_IPV4_ADDRESS_FOR_NGU = "192.168.70.129/24"; + GNB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + } +); + +MACRLCs = ( +{ + num_cc = 1; + tr_s_preference = "local_L1"; + tr_n_preference = "local_RRC"; + pusch_TargetSNRx10 = 150; + pucch_TargetSNRx10 = 200; + ulsch_max_frame_inactivity = 1; +} +); + +prs_config = ( +{ + NumPRSResources = 8; + PRSResourceSetPeriod = [80, 0]; + SymbolStart = [7,7,7,7,7,7,7,7]; + NumPRSSymbols = [6,6,6,6,6,6,6,6]; + NumRB = 64; + RBOffset = 0; + CombSize = 4; + REOffset = [1,1,1,1,1,1,1,1]; + PRSResourceOffset = [0,10,20,30,40,50,60,70]; + PRSResourceRepetition = 1; + PRSResourceTimeGap = 1; + NPRS_ID = [10,11,12,13,14,15,16,17]; + MutingPattern1 = []; + MutingPattern2 = []; + MutingBitRepetition = 1; +} +); + +L1s = ( +{ + num_cc = 1; + tr_n_preference = "local_mac"; + pusch_proc_threads = 8; + prach_dtx_threshold = 120; + pucch0_dtx_threshold = 150; + ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0 +} +); + +RUs = ( +{ + local_rf = "yes" + nb_tx = 1 + nb_rx = 1 + att_tx = 0 + att_rx = 0; + bands = [257]; + max_pdschReferenceSignalPower = -27; + max_rxgain = 114; + sf_extension = 0; + eNB_instances = [0]; + #beamforming 1x4 matrix: + bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000]; + #clock_src = "internal"; + sdr_addrs = "addr=192.168.10.2,clock_source=gpsdo,time_source=gpsdo" + if_freq = 50000000L; +} +); + +THREAD_STRUCT = ( +{ + #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT" + parallel_config = "PARALLEL_SINGLE_THREAD"; + #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE" + worker_config = "WORKER_ENABLE"; +} +); + +rfsimulator : +{ + serveraddr = "server"; + serverport = "4043"; + options = (); #("saviq"); or/and "chanmod" + modelname = "AWGN"; + IQfile = "/tmp/rfsimulator.iqs"; +}; + +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"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + ngap_log_level ="debug"; + ngap_log_verbosity ="medium"; +}; + diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf index 0b4ac6556f..451079edf1 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf @@ -212,17 +212,17 @@ MACRLCs = ( prs_config = ( { NumPRSResources = 2; - PRSResourceSetPeriod = [20, 5]; - SymbolStart = [7, 8]; - NumPRSSymbols = [5, 5]; + PRSResourceSetPeriod = [20, 2]; + SymbolStart = [7, 7]; + NumPRSSymbols = [6, 6]; NumRB = 106; RBOffset = 0; CombSize = 4; REOffset = [0, 1]; - PRSResourceOffset = [0, 1]; - PRSResourceRepetition = 1; + PRSResourceOffset = [0, 0]; + PRSResourceRepetition = 2; PRSResourceTimeGap = 1; - NPRS_ID = [0, 5]; + NPRS_ID = [10, 5]; MutingPattern1 = []; MutingPattern2 = []; MutingBitRepetition = 1; diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.217PRB.prs.usrpx310.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.217PRB.prs.usrpx310.conf index c0642afba5..91b614a13e 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.217PRB.prs.usrpx310.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.217PRB.prs.usrpx310.conf @@ -218,9 +218,9 @@ MACRLCs = ( prs_config = ( { NumPRSResources = 1; - PRSResourceSetPeriod = [40, 0]; + PRSResourceSetPeriod = [20, 2]; SymbolStart = [7]; - NumPRSSymbols = [7]; + NumPRSSymbols = [6]; NumRB = 216; RBOffset = 0; CombSize = 4; @@ -261,7 +261,7 @@ RUs = ( #beamforming 1x4 matrix: bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000]; #clock_src = "internal"; - sdr_addrs = "addr=192.168.10.2,second_addr=192.168.20.2,clock_source=external,time_source=external" + sdr_addrs = "addr=192.168.10.2,clock_source=gpsdo,time_source=gpsdo" } ); diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.217PRB.prs.usrpx310.conf2 b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.217PRB.prs.usrpx310.conf2 new file mode 100644 index 0000000000..d5567d564a --- /dev/null +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.217PRB.prs.usrpx310.conf2 @@ -0,0 +1,322 @@ +Active_gNBs = ( "gNB-OAI"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +gNBs = +( + { + ////////// Identification parameters: + gNB_ID = 0xe00; + gNB_name = "gNB-OAI"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = 1; + plmn_list = ({ + mcc = 208; + mnc = 99; + mnc_length = 2; + snssaiList = ( + { + sst = 1; + sd = 0x1; // 0 false, else true + }, + { + sst = 1; + sd = 0x112233; // 0 false, else true + } + ); + + }); + + nr_cellid = 12345678L; + + ////////// Physical parameters: + + ssb_SubcarrierOffset = 0; + pdsch_AntennaPorts = 1; + pusch_AntennaPorts = 1; + 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 = 650000; + dl_frequencyBand = 78; + # this is 3600 MHz + dl_absoluteFrequencyPointA = 647408; + #scs-SpecificCarrierList + dl_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + dl_subcarrierSpacing = 1; + dl_carrierBandwidth = 217; + #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; + + #uplinkConfigCommon + #frequencyInfoUL + ul_frequencyBand = 78; + #scs-SpecificCarrierList + ul_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + ul_subcarrierSpacing = 1; + ul_carrierBandwidth = 217; + 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, + + 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 = 2; + +# 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 : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + + ////////// AMF parameters: + amf_ip_address = ( { ipv4 = "192.168.70.132"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + + NETWORK_INTERFACES : + { + GNB_INTERFACE_NAME_FOR_NG_AMF = "demo-oai"; + GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.70.129/24"; + GNB_INTERFACE_NAME_FOR_NGU = "demo-oai"; + GNB_IPV4_ADDRESS_FOR_NGU = "192.168.70.129/24"; + GNB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + } +); + +MACRLCs = ( +{ + num_cc = 1; + tr_s_preference = "local_L1"; + tr_n_preference = "local_RRC"; + pusch_TargetSNRx10 = 150; + pucch_TargetSNRx10 = 200; + ulsch_max_frame_inactivity = 1; +} +); + +prs_config = ( +{ + NumPRSResources = 1; + PRSResourceSetPeriod = [20, 2]; + SymbolStart = [7]; + NumPRSSymbols = [6]; + NumRB = 216; + RBOffset = 0; + CombSize = 4; + REOffset = [0]; + PRSResourceOffset = [1]; + PRSResourceRepetition = 1; + PRSResourceTimeGap = 1; + NPRS_ID = [5]; + MutingPattern1 = []; + MutingPattern2 = []; + MutingBitRepetition = 1; +} +); + +L1s = ( +{ + num_cc = 1; + tr_n_preference = "local_mac"; + pusch_proc_threads = 8; + prach_dtx_threshold = 120; + pucch0_dtx_threshold = 150; + ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0 +} +); + +RUs = ( +{ + local_rf = "yes" + nb_tx = 1 + nb_rx = 1 + att_tx = 0 + att_rx = 0; + bands = [78]; + max_pdschReferenceSignalPower = -27; + max_rxgain = 114; + sf_extension = 0; + eNB_instances = [0]; + #beamforming 1x4 matrix: + bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000]; + #clock_src = "internal"; + sdr_addrs = "addr=192.168.10.2,clock_source=gpsdo,time_source=gpsdo" +} +); + +THREAD_STRUCT = ( +{ + #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT" + parallel_config = "PARALLEL_SINGLE_THREAD"; + #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE" + worker_config = "WORKER_ENABLE"; +} +); + +rfsimulator : +{ + serveraddr = "server"; + serverport = "4043"; + options = (); #("saviq"); or/and "chanmod" + modelname = "AWGN"; + IQfile = "/tmp/rfsimulator.iqs"; +}; + +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"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + ngap_log_level ="debug"; + ngap_log_verbosity ="medium"; +}; + diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.prs.usrpn310.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.prs.usrpn310.conf index 605a4afdb2..b8703915a5 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.prs.usrpn310.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.prs.usrpn310.conf @@ -218,10 +218,10 @@ MACRLCs = ( prs_config = ( { NumPRSResources = 1; - PRSResourceSetPeriod = [40, 0]; + PRSResourceSetPeriod = [20, 2]; SymbolStart = [7]; - NumPRSSymbols = [7]; - NumRB = 240; + NumPRSSymbols = [6]; + NumRB = 272; RBOffset = 0; CombSize = 4; REOffset = [0]; diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.prs.usrpn310.conf2 b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.prs.usrpn310.conf2 index ef3b6fca6e..318e57609e 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.prs.usrpn310.conf2 +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.prs.usrpn310.conf2 @@ -49,7 +49,7 @@ gNBs = { #spCellConfigCommon - physCellId = 1; + physCellId = 0; # downlinkConfigCommon #frequencyInfoDL @@ -218,17 +218,17 @@ MACRLCs = ( prs_config = ( { NumPRSResources = 1; - PRSResourceSetPeriod = [40, 0]; + PRSResourceSetPeriod = [20, 2]; SymbolStart = [7]; - NumPRSSymbols = [7]; - NumRB = 240; + NumPRSSymbols = [6]; + NumRB = 272; RBOffset = 0; CombSize = 4; - REOffset = [1]; - PRSResourceOffset = [0]; + REOffset = [0]; + PRSResourceOffset = [1]; PRSResourceRepetition = 1; PRSResourceTimeGap = 1; - NPRS_ID = [1]; + NPRS_ID = [5]; MutingPattern1 = []; MutingPattern2 = []; MutingBitRepetition = 1; diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr1.217prb.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr1.217prb.conf index 3c76026015..21ac9c53c5 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr1.217prb.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr1.217prb.conf @@ -6,9 +6,9 @@ PRSs = { gNB_id = 0; NumPRSResources = 1; - PRSResourceSetPeriod = [40, 0]; + PRSResourceSetPeriod = [20, 2]; SymbolStart = [7]; - NumPRSSymbols = [7]; + NumPRSSymbols = [6]; NumRB = 216; RBOffset = 0; CombSize = 4; @@ -27,14 +27,14 @@ PRSs = { gNB_id = 1; NumPRSResources = 1; - PRSResourceSetPeriod = [40, 0]; + PRSResourceSetPeriod = [20, 2]; SymbolStart = [7]; - NumPRSSymbols = [4]; + NumPRSSymbols = [6]; NumRB = 216; RBOffset = 0; CombSize = 4; - REOffset = [1]; - PRSResourceOffset = [0]; + REOffset = [0]; + PRSResourceOffset = [1]; PRSResourceRepetition = 1; PRSResourceTimeGap = 1; NPRS_ID = [5]; diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr1.273prb.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr1.273prb.conf index f2c3902d5d..3ef45b3f7d 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr1.273prb.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr1.273prb.conf @@ -5,36 +5,42 @@ PRSs = prs_config0 = ( { gNB_id = 0; - PRSResourceSetPeriod0 = 40; - PRSResourceSetPeriod1 = 0; - SymbolStart = 7; - NumPRSSymbols = 7; + NumPRSResources = 1; + PRSResourceSetPeriod = [20, 2]; + SymbolStart = [7]; + NumPRSSymbols = [6]; NumRB = 272; RBOffset = 0; CombSize = 4; - REOffset = 0; - PRSResourceOffset = 0; + REOffset = [0]; + PRSResourceOffset = [0]; PRSResourceRepetition = 1; PRSResourceTimeGap = 1; - NPRS_ID = 0; + NPRS_ID = [0]; + MutingPattern1 = []; + MutingPattern2 = []; + MutingBitRepetition = 1; } ); prs_config1 = ( { gNB_id = 1; - PRSResourceSetPeriod0 = 40; - PRSResourceSetPeriod1 = 0; - SymbolStart = 7; - NumPRSSymbols = 4; - NumRB = 106; + NumPRSResources = 1; + PRSResourceSetPeriod = [20, 2]; + SymbolStart = [7]; + NumPRSSymbols = [6]; + NumRB = 272; RBOffset = 0; CombSize = 4; - REOffset = 1; - PRSResourceOffset = 0; + REOffset = [0]; + PRSResourceOffset = [1]; PRSResourceRepetition = 1; PRSResourceTimeGap = 1; - NPRS_ID = 0; + NPRS_ID = [5]; + MutingPattern1 = []; + MutingPattern2 = []; + MutingBitRepetition = 1; } ); } diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr2.128prb.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr2.128prb.conf index 8619eca5f4..4e5e7eeb42 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr2.128prb.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr2.128prb.conf @@ -5,18 +5,18 @@ PRSs = prs_config0 = ( { gNB_id = 0; - NumPRSResources = 1; - PRSResourceSetPeriod = [40, 0]; - SymbolStart = [7]; - NumPRSSymbols = [7]; + NumPRSResources = 8; + PRSResourceSetPeriod = [80, 0]; + SymbolStart = [7,7,7,7,7,7,7,7]; + NumPRSSymbols = [6,6,6,6,6,6,6,6]; NumRB = 128; RBOffset = 0; CombSize = 4; - REOffset = [0]; - PRSResourceOffset = [0]; + REOffset = [0,0,0,0,0,0,0,0]; + PRSResourceOffset = [0,10,20,30,40,50,60,70]; PRSResourceRepetition = 1; PRSResourceTimeGap = 1; - NPRS_ID = [0]; + NPRS_ID = [0,1,2,3,4,5,6,7]; MutingPattern1 = []; MutingPattern2 = []; MutingBitRepetition = 1; @@ -26,18 +26,18 @@ PRSs = prs_config1 = ( { gNB_id = 1; - NumPRSResources = 1; - PRSResourceSetPeriod = [40, 0]; - SymbolStart = [7]; - NumPRSSymbols = [4]; + NumPRSResources = 8; + PRSResourceSetPeriod = [80, 0]; + SymbolStart = [7,7,7,7,7,7,7,7]; + NumPRSSymbols = [6,6,6,6,6,6,6,6]; NumRB = 128; RBOffset = 0; CombSize = 4; - REOffset = [1]; - PRSResourceOffset = [0]; + REOffset = [1,1,1,1,1,1,1,1]; + PRSResourceOffset = [0,10,20,30,40,50,60,70]; PRSResourceRepetition = 1; PRSResourceTimeGap = 1; - NPRS_ID = [5]; + NPRS_ID = [10,11,12,13,14,15,16,17]; MutingPattern1 = []; MutingPattern2 = []; MutingBitRepetition = 1; diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr2.64prb.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr2.64prb.conf index 2d04955726..5f33a03e6d 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr2.64prb.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr2.64prb.conf @@ -5,18 +5,18 @@ PRSs = prs_config0 = ( { gNB_id = 0; - NumPRSResources = 1; - PRSResourceSetPeriod = [40, 0]; - SymbolStart = [7]; - NumPRSSymbols = [7]; + NumPRSResources = 8; + PRSResourceSetPeriod = [80, 0]; + SymbolStart = [7,7,7,7,7,7,7,7]; + NumPRSSymbols = [6,6,6,6,6,6,6,6]; NumRB = 64; RBOffset = 0; CombSize = 4; - REOffset = [0]; - PRSResourceOffset = [0]; + REOffset = [0,0,0,0,0,0,0,0]; + PRSResourceOffset = [0,10,20,30,40,50,60,70]; PRSResourceRepetition = 1; PRSResourceTimeGap = 1; - NPRS_ID = [0]; + NPRS_ID = [0,1,2,3,4,5,6,7]; MutingPattern1 = []; MutingPattern2 = []; MutingBitRepetition = 1; @@ -26,18 +26,18 @@ PRSs = prs_config1 = ( { gNB_id = 1; - NumPRSResources = 1; - PRSResourceSetPeriod = [40, 0]; - SymbolStart = [7]; - NumPRSSymbols = [4]; + NumPRSResources = 8; + PRSResourceSetPeriod = [80, 0]; + SymbolStart = [7,7,7,7,7,7,7,7]; + NumPRSSymbols = [6,6,6,6,6,6,6,6]; NumRB = 64; RBOffset = 0; CombSize = 4; - REOffset = [1]; - PRSResourceOffset = [0]; + REOffset = [1,1,1,1,1,1,1,1]; + PRSResourceOffset = [0,10,20,30,40,50,60,70]; PRSResourceRepetition = 1; PRSResourceTimeGap = 1; - NPRS_ID = [5]; + NPRS_ID = [10,11,12,13,14,15,16,17]; MutingPattern1 = []; MutingPattern2 = []; MutingBitRepetition = 1; From 431d28e00d0576e8b5dc60b16b1b8b9030d96bbc Mon Sep 17 00:00:00 2001 From: Sagar Parsawar Date: Thu, 30 Jun 2022 16:40:41 +0200 Subject: [PATCH 105/135] FR2 64PRBs working configs for 2gNB schenario --- .../CONF/gnb.sa.band257.fr2.64PRB.prs.usrpx310.conf | 6 +++--- .../CONF/gnb.sa.band257.fr2.64PRB.prs.usrpx310.conf2 | 10 +++++----- .../CONF/gnb.sa.band78.fr1.106PRB.prs.usrpn310.conf | 6 +++--- .../GENERIC-NR-5GC/CONF/ue.nr.prs.fr2.64prb.conf | 8 ++++---- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band257.fr2.64PRB.prs.usrpx310.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band257.fr2.64PRB.prs.usrpx310.conf index b4006409e0..cd07d57685 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band257.fr2.64PRB.prs.usrpx310.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band257.fr2.64PRB.prs.usrpx310.conf @@ -217,8 +217,8 @@ MACRLCs = ( prs_config = ( { NumPRSResources = 8; - PRSResourceSetPeriod = [80, 0]; - SymbolStart = [7,7,7,7,7,7,7,7]; + PRSResourceSetPeriod = [80, 1]; + SymbolStart = [8,8,8,8,8,8,8,8]; NumPRSSymbols = [6,6,6,6,6,6,6,6]; NumRB = 64; RBOffset = 0; @@ -261,7 +261,7 @@ RUs = ( bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000]; #clock_src = "internal"; sdr_addrs = "addr=192.168.10.2,clock_source=gpsdo,time_source=gpsdo" - if_freq = 50000000L; + if_freq = 3329760000L; } ); diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band257.fr2.64PRB.prs.usrpx310.conf2 b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band257.fr2.64PRB.prs.usrpx310.conf2 index 42d8fbc203..82f975e10b 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band257.fr2.64PRB.prs.usrpx310.conf2 +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band257.fr2.64PRB.prs.usrpx310.conf2 @@ -139,7 +139,7 @@ gNBs = # ssb_PositionsInBurs_BitmapPR # 1=short, 2=medium, 3=long ssb_PositionsInBurst_PR = 3; - ssb_PositionsInBurst_Bitmap = 0x0010001000100010L; + ssb_PositionsInBurst_Bitmap = 0x002000200020002L; # ssb_periodicityServingCell # 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1 @@ -217,8 +217,8 @@ MACRLCs = ( prs_config = ( { NumPRSResources = 8; - PRSResourceSetPeriod = [80, 0]; - SymbolStart = [7,7,7,7,7,7,7,7]; + PRSResourceSetPeriod = [80, 1]; + SymbolStart = [0,0,0,0,0,0,0,0]; NumPRSSymbols = [6,6,6,6,6,6,6,6]; NumRB = 64; RBOffset = 0; @@ -260,8 +260,8 @@ RUs = ( #beamforming 1x4 matrix: bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000]; #clock_src = "internal"; - sdr_addrs = "addr=192.168.10.2,clock_source=gpsdo,time_source=gpsdo" - if_freq = 50000000L; + sdr_addrs = "addr=192.168.20.2,clock_source=gpsdo,time_source=gpsdo" + if_freq = 3329760000L; } ); diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.prs.usrpn310.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.prs.usrpn310.conf index aa7a94565d..e08dfd0848 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.prs.usrpn310.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.prs.usrpn310.conf @@ -54,10 +54,10 @@ gNBs = # downlinkConfigCommon #frequencyInfoDL # this is 3600 MHz + 43 PRBs@30kHz SCS (same as initial BWP) - absoluteFrequencySSB = 650000; + absoluteFrequencySSB = 621984; dl_frequencyBand = 78; # this is 3600 MHz - dl_absoluteFrequencyPointA = 648728; + dl_absoluteFrequencyPointA = 620712; #scs-SpecificCarrierList dl_offstToCarrier = 0; # subcarrierSpacing @@ -261,7 +261,7 @@ RUs = ( #beamforming 1x4 matrix: bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000]; #clock_src = "internal"; - sdr_addrs = "addr=192.168.10.2,clock_source=gpsdo,time_source=gpsdo" + sdr_addrs = "addr=192.168.50.2,second_addr=192.168.60.2,clock_source=external,time_source=external" } ); diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr2.64prb.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr2.64prb.conf index 5f33a03e6d..563404231c 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr2.64prb.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr2.64prb.conf @@ -6,8 +6,8 @@ PRSs = { gNB_id = 0; NumPRSResources = 8; - PRSResourceSetPeriod = [80, 0]; - SymbolStart = [7,7,7,7,7,7,7,7]; + PRSResourceSetPeriod = [80, 1]; + SymbolStart = [8,8,8,8,8,8,8,8]; NumPRSSymbols = [6,6,6,6,6,6,6,6]; NumRB = 64; RBOffset = 0; @@ -27,8 +27,8 @@ PRSs = { gNB_id = 1; NumPRSResources = 8; - PRSResourceSetPeriod = [80, 0]; - SymbolStart = [7,7,7,7,7,7,7,7]; + PRSResourceSetPeriod = [80, 1]; + SymbolStart = [0,0,0,0,0,0,0,0]; NumPRSSymbols = [6,6,6,6,6,6,6,6]; NumRB = 64; RBOffset = 0; From 8bc011b76d41ce94ef1f277f541dd92cfe3e07ca Mon Sep 17 00:00:00 2001 From: Sagar Parsawar Date: Mon, 4 Jul 2022 16:48:41 +0200 Subject: [PATCH 106/135] Fixed USRP lib alignment issue in trx_usrp_read() function --- targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp | 7 ------- 1 file changed, 7 deletions(-) diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp index 04a9aae132..ed17d7eefd 100644 --- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp +++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp @@ -711,13 +711,6 @@ static int trx_usrp_read(openair0_device *device, openair0_timestamp *ptimestamp ((__m64 *)buff[i])[4*j+3] = _mm_srai_pi16 (((__m64 *)buff_tmp[i])[4*j+3],rxshift); } } - if ((((uintptr_t) buff[i])&0x1F)==0) { - for (int j=0; j Date: Tue, 5 Jul 2022 14:30:29 +0200 Subject: [PATCH 107/135] Adding 3 and 4gNB PRS configs for FR1 40/80MHz --- ...nb.sa.band78.fr1.106PRB.prs.usrpn310.conf2 | 2 +- ...nb.sa.band78.fr1.106PRB.prs.usrpn310.conf3 | 322 ++++++++++++++++++ ...nb.sa.band78.fr1.106PRB.prs.usrpn310.conf4 | 322 ++++++++++++++++++ ...gnb.sa.band78.fr1.217PRB.prs.usrpx310.conf | 6 +- ...nb.sa.band78.fr1.217PRB.prs.usrpx310.conf2 | 2 +- ...nb.sa.band78.fr1.217PRB.prs.usrpx310.conf3 | 322 ++++++++++++++++++ ...nb.sa.band78.fr1.217PRB.prs.usrpx310.conf4 | 322 ++++++++++++++++++ .../CONF/ue.nr.prs.fr1.106prb.conf | 46 ++- .../CONF/ue.nr.prs.fr1.217prb.conf | 44 ++- 9 files changed, 1380 insertions(+), 8 deletions(-) create mode 100644 targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.prs.usrpn310.conf3 create mode 100644 targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.prs.usrpn310.conf4 create mode 100644 targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.217PRB.prs.usrpx310.conf3 create mode 100644 targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.217PRB.prs.usrpx310.conf4 diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.prs.usrpn310.conf2 b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.prs.usrpn310.conf2 index dc73a39f05..f13b865fcb 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.prs.usrpn310.conf2 +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.prs.usrpn310.conf2 @@ -228,7 +228,7 @@ prs_config = ( PRSResourceOffset = [1]; PRSResourceRepetition = 1; PRSResourceTimeGap = 1; - NPRS_ID = [0]; + NPRS_ID = [1]; MutingPattern1 = []; MutingPattern2 = []; MutingBitRepetition = 1; diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.prs.usrpn310.conf3 b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.prs.usrpn310.conf3 new file mode 100644 index 0000000000..361884eb73 --- /dev/null +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.prs.usrpn310.conf3 @@ -0,0 +1,322 @@ +Active_gNBs = ( "gNB-OAI"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +gNBs = +( + { + ////////// Identification parameters: + gNB_ID = 0xe00; + gNB_name = "gNB-OAI"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = 1; + plmn_list = ({ + mcc = 208; + mnc = 99; + mnc_length = 2; + snssaiList = ( + { + sst = 1; + sd = 0x1; // 0 false, else true + }, + { + sst = 1; + sd = 0x112233; // 0 false, else true + } + ); + + }); + + nr_cellid = 12345678L; + + ////////// Physical parameters: + + ssb_SubcarrierOffset = 0; + pdsch_AntennaPorts = 1; + pusch_AntennaPorts = 1; + 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 = 621984; + dl_frequencyBand = 78; + # this is 3600 MHz + dl_absoluteFrequencyPointA = 620712; + #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; + + #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, + + 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 = 4; + +# 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 : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + + ////////// AMF parameters: + amf_ip_address = ( { ipv4 = "192.168.70.132"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + + NETWORK_INTERFACES : + { + GNB_INTERFACE_NAME_FOR_NG_AMF = "demo-oai"; + GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.70.129/24"; + GNB_INTERFACE_NAME_FOR_NGU = "demo-oai"; + GNB_IPV4_ADDRESS_FOR_NGU = "192.168.70.129/24"; + GNB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + } +); + +MACRLCs = ( +{ + num_cc = 1; + tr_s_preference = "local_L1"; + tr_n_preference = "local_RRC"; + pusch_TargetSNRx10 = 150; + pucch_TargetSNRx10 = 200; + ulsch_max_frame_inactivity = 1; +} +); + +prs_config = ( +{ + NumPRSResources = 1; + PRSResourceSetPeriod = [20, 2]; + SymbolStart = [7]; + NumPRSSymbols = [6]; + NumRB = 106; + RBOffset = 0; + CombSize = 4; + REOffset = [0]; + PRSResourceOffset = [2]; + PRSResourceRepetition = 1; + PRSResourceTimeGap = 1; + NPRS_ID = [2]; + MutingPattern1 = []; + MutingPattern2 = []; + MutingBitRepetition = 1; +} +); + +L1s = ( +{ + num_cc = 1; + tr_n_preference = "local_mac"; + pusch_proc_threads = 8; + prach_dtx_threshold = 120; + pucch0_dtx_threshold = 150; + ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0 +} +); + +RUs = ( +{ + local_rf = "yes" + nb_tx = 1 + nb_rx = 1 + att_tx = 0 + att_rx = 0; + bands = [78]; + max_pdschReferenceSignalPower = -27; + max_rxgain = 114; + sf_extension = 0; + eNB_instances = [0]; + #beamforming 1x4 matrix: + bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000]; + #clock_src = "internal"; + sdr_addrs = "addr=192.168.50.2,second_addr=192.168.60.2,clock_source=external,time_source=external"; +} +); + +THREAD_STRUCT = ( +{ + #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT" + parallel_config = "PARALLEL_SINGLE_THREAD"; + #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE" + worker_config = "WORKER_ENABLE"; +} +); + +rfsimulator : +{ + serveraddr = "server"; + serverport = "4043"; + options = (); #("saviq"); or/and "chanmod" + modelname = "AWGN"; + IQfile = "/tmp/rfsimulator.iqs"; +}; + +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"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + ngap_log_level ="debug"; + ngap_log_verbosity ="medium"; +}; + diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.prs.usrpn310.conf4 b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.prs.usrpn310.conf4 new file mode 100644 index 0000000000..4d92d9e5fd --- /dev/null +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.prs.usrpn310.conf4 @@ -0,0 +1,322 @@ +Active_gNBs = ( "gNB-OAI"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +gNBs = +( + { + ////////// Identification parameters: + gNB_ID = 0xe00; + gNB_name = "gNB-OAI"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = 1; + plmn_list = ({ + mcc = 208; + mnc = 99; + mnc_length = 2; + snssaiList = ( + { + sst = 1; + sd = 0x1; // 0 false, else true + }, + { + sst = 1; + sd = 0x112233; // 0 false, else true + } + ); + + }); + + nr_cellid = 12345678L; + + ////////// Physical parameters: + + ssb_SubcarrierOffset = 0; + pdsch_AntennaPorts = 1; + pusch_AntennaPorts = 1; + 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 = 621984; + dl_frequencyBand = 78; + # this is 3600 MHz + dl_absoluteFrequencyPointA = 620712; + #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; + + #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, + + 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 = 8; + +# 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 : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + + ////////// AMF parameters: + amf_ip_address = ( { ipv4 = "192.168.70.132"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + + NETWORK_INTERFACES : + { + GNB_INTERFACE_NAME_FOR_NG_AMF = "demo-oai"; + GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.70.129/24"; + GNB_INTERFACE_NAME_FOR_NGU = "demo-oai"; + GNB_IPV4_ADDRESS_FOR_NGU = "192.168.70.129/24"; + GNB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + } +); + +MACRLCs = ( +{ + num_cc = 1; + tr_s_preference = "local_L1"; + tr_n_preference = "local_RRC"; + pusch_TargetSNRx10 = 150; + pucch_TargetSNRx10 = 200; + ulsch_max_frame_inactivity = 1; +} +); + +prs_config = ( +{ + NumPRSResources = 1; + PRSResourceSetPeriod = [20, 2]; + SymbolStart = [7]; + NumPRSSymbols = [6]; + NumRB = 106; + RBOffset = 0; + CombSize = 4; + REOffset = [0]; + PRSResourceOffset = [3]; + PRSResourceRepetition = 1; + PRSResourceTimeGap = 1; + NPRS_ID = [3]; + MutingPattern1 = []; + MutingPattern2 = []; + MutingBitRepetition = 1; +} +); + +L1s = ( +{ + num_cc = 1; + tr_n_preference = "local_mac"; + pusch_proc_threads = 8; + prach_dtx_threshold = 120; + pucch0_dtx_threshold = 150; + ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0 +} +); + +RUs = ( +{ + local_rf = "yes" + nb_tx = 1 + nb_rx = 1 + att_tx = 0 + att_rx = 0; + bands = [78]; + max_pdschReferenceSignalPower = -27; + max_rxgain = 114; + sf_extension = 0; + eNB_instances = [0]; + #beamforming 1x4 matrix: + bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000]; + #clock_src = "internal"; + sdr_addrs = "addr=192.168.50.2,second_addr=192.168.60.2,clock_source=external,time_source=external" +} +); + +THREAD_STRUCT = ( +{ + #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT" + parallel_config = "PARALLEL_SINGLE_THREAD"; + #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE" + worker_config = "WORKER_ENABLE"; +} +); + +rfsimulator : +{ + serveraddr = "server"; + serverport = "4043"; + options = (); #("saviq"); or/and "chanmod" + modelname = "AWGN"; + IQfile = "/tmp/rfsimulator.iqs"; +}; + +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"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + ngap_log_level ="debug"; + ngap_log_verbosity ="medium"; +}; + diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.217PRB.prs.usrpx310.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.217PRB.prs.usrpx310.conf index 91b614a13e..be96fa43f1 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.217PRB.prs.usrpx310.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.217PRB.prs.usrpx310.conf @@ -54,10 +54,10 @@ gNBs = # downlinkConfigCommon #frequencyInfoDL # this is 3600 MHz + 43 PRBs@30kHz SCS (same as initial BWP) - absoluteFrequencySSB = 650000; + absoluteFrequencySSB = 621984; dl_frequencyBand = 78; # this is 3600 MHz - dl_absoluteFrequencyPointA = 647408; + dl_absoluteFrequencyPointA = 620712; #scs-SpecificCarrierList dl_offstToCarrier = 0; # subcarrierSpacing @@ -261,7 +261,7 @@ RUs = ( #beamforming 1x4 matrix: bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000]; #clock_src = "internal"; - sdr_addrs = "addr=192.168.10.2,clock_source=gpsdo,time_source=gpsdo" + sdr_addrs = "addr=192.168.50.2,second_addr=192.168.60.2,clock_source=external,time_source=external" } ); diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.217PRB.prs.usrpx310.conf2 b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.217PRB.prs.usrpx310.conf2 index d5567d564a..250353e29f 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.217PRB.prs.usrpx310.conf2 +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.217PRB.prs.usrpx310.conf2 @@ -228,7 +228,7 @@ prs_config = ( PRSResourceOffset = [1]; PRSResourceRepetition = 1; PRSResourceTimeGap = 1; - NPRS_ID = [5]; + NPRS_ID = [1]; MutingPattern1 = []; MutingPattern2 = []; MutingBitRepetition = 1; diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.217PRB.prs.usrpx310.conf3 b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.217PRB.prs.usrpx310.conf3 new file mode 100644 index 0000000000..1df62d949d --- /dev/null +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.217PRB.prs.usrpx310.conf3 @@ -0,0 +1,322 @@ +Active_gNBs = ( "gNB-OAI"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +gNBs = +( + { + ////////// Identification parameters: + gNB_ID = 0xe00; + gNB_name = "gNB-OAI"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = 1; + plmn_list = ({ + mcc = 208; + mnc = 99; + mnc_length = 2; + snssaiList = ( + { + sst = 1; + sd = 0x1; // 0 false, else true + }, + { + sst = 1; + sd = 0x112233; // 0 false, else true + } + ); + + }); + + nr_cellid = 12345678L; + + ////////// Physical parameters: + + ssb_SubcarrierOffset = 0; + pdsch_AntennaPorts = 1; + pusch_AntennaPorts = 1; + 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 = 621984; + dl_frequencyBand = 78; + # this is 3600 MHz + dl_absoluteFrequencyPointA = 620712; + #scs-SpecificCarrierList + dl_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + dl_subcarrierSpacing = 1; + dl_carrierBandwidth = 217; + #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; + + #uplinkConfigCommon + #frequencyInfoUL + ul_frequencyBand = 78; + #scs-SpecificCarrierList + ul_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + ul_subcarrierSpacing = 1; + ul_carrierBandwidth = 217; + 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, + + 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 = 4; + +# 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 : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + + ////////// AMF parameters: + amf_ip_address = ( { ipv4 = "192.168.70.132"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + + NETWORK_INTERFACES : + { + GNB_INTERFACE_NAME_FOR_NG_AMF = "demo-oai"; + GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.70.129/24"; + GNB_INTERFACE_NAME_FOR_NGU = "demo-oai"; + GNB_IPV4_ADDRESS_FOR_NGU = "192.168.70.129/24"; + GNB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + } +); + +MACRLCs = ( +{ + num_cc = 1; + tr_s_preference = "local_L1"; + tr_n_preference = "local_RRC"; + pusch_TargetSNRx10 = 150; + pucch_TargetSNRx10 = 200; + ulsch_max_frame_inactivity = 1; +} +); + +prs_config = ( +{ + NumPRSResources = 1; + PRSResourceSetPeriod = [20, 2]; + SymbolStart = [7]; + NumPRSSymbols = [6]; + NumRB = 216; + RBOffset = 0; + CombSize = 4; + REOffset = [0]; + PRSResourceOffset = [2]; + PRSResourceRepetition = 1; + PRSResourceTimeGap = 1; + NPRS_ID = [2]; + MutingPattern1 = []; + MutingPattern2 = []; + MutingBitRepetition = 1; +} +); + +L1s = ( +{ + num_cc = 1; + tr_n_preference = "local_mac"; + pusch_proc_threads = 8; + prach_dtx_threshold = 120; + pucch0_dtx_threshold = 150; + ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0 +} +); + +RUs = ( +{ + local_rf = "yes" + nb_tx = 1 + nb_rx = 1 + att_tx = 0 + att_rx = 0; + bands = [78]; + max_pdschReferenceSignalPower = -27; + max_rxgain = 114; + sf_extension = 0; + eNB_instances = [0]; + #beamforming 1x4 matrix: + bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000]; + #clock_src = "internal"; + sdr_addrs = "addr=192.168.50.2,second_addr=192.168.60.2,clock_source=external,time_source=external" +} +); + +THREAD_STRUCT = ( +{ + #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT" + parallel_config = "PARALLEL_SINGLE_THREAD"; + #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE" + worker_config = "WORKER_ENABLE"; +} +); + +rfsimulator : +{ + serveraddr = "server"; + serverport = "4043"; + options = (); #("saviq"); or/and "chanmod" + modelname = "AWGN"; + IQfile = "/tmp/rfsimulator.iqs"; +}; + +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"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + ngap_log_level ="debug"; + ngap_log_verbosity ="medium"; +}; + diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.217PRB.prs.usrpx310.conf4 b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.217PRB.prs.usrpx310.conf4 new file mode 100644 index 0000000000..086052095d --- /dev/null +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.217PRB.prs.usrpx310.conf4 @@ -0,0 +1,322 @@ +Active_gNBs = ( "gNB-OAI"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +gNBs = +( + { + ////////// Identification parameters: + gNB_ID = 0xe00; + gNB_name = "gNB-OAI"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = 1; + plmn_list = ({ + mcc = 208; + mnc = 99; + mnc_length = 2; + snssaiList = ( + { + sst = 1; + sd = 0x1; // 0 false, else true + }, + { + sst = 1; + sd = 0x112233; // 0 false, else true + } + ); + + }); + + nr_cellid = 12345678L; + + ////////// Physical parameters: + + ssb_SubcarrierOffset = 0; + pdsch_AntennaPorts = 1; + pusch_AntennaPorts = 1; + 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 = 621984; + dl_frequencyBand = 78; + # this is 3600 MHz + dl_absoluteFrequencyPointA = 620712; + #scs-SpecificCarrierList + dl_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + dl_subcarrierSpacing = 1; + dl_carrierBandwidth = 217; + #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; + + #uplinkConfigCommon + #frequencyInfoUL + ul_frequencyBand = 78; + #scs-SpecificCarrierList + ul_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + ul_subcarrierSpacing = 1; + ul_carrierBandwidth = 217; + 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, + + 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 = 8; + +# 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 : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + + ////////// AMF parameters: + amf_ip_address = ( { ipv4 = "192.168.70.132"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + + NETWORK_INTERFACES : + { + GNB_INTERFACE_NAME_FOR_NG_AMF = "demo-oai"; + GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.70.129/24"; + GNB_INTERFACE_NAME_FOR_NGU = "demo-oai"; + GNB_IPV4_ADDRESS_FOR_NGU = "192.168.70.129/24"; + GNB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + } +); + +MACRLCs = ( +{ + num_cc = 1; + tr_s_preference = "local_L1"; + tr_n_preference = "local_RRC"; + pusch_TargetSNRx10 = 150; + pucch_TargetSNRx10 = 200; + ulsch_max_frame_inactivity = 1; +} +); + +prs_config = ( +{ + NumPRSResources = 1; + PRSResourceSetPeriod = [20, 2]; + SymbolStart = [7]; + NumPRSSymbols = [6]; + NumRB = 216; + RBOffset = 0; + CombSize = 4; + REOffset = [0]; + PRSResourceOffset = [3]; + PRSResourceRepetition = 1; + PRSResourceTimeGap = 1; + NPRS_ID = [3]; + MutingPattern1 = []; + MutingPattern2 = []; + MutingBitRepetition = 1; +} +); + +L1s = ( +{ + num_cc = 1; + tr_n_preference = "local_mac"; + pusch_proc_threads = 8; + prach_dtx_threshold = 120; + pucch0_dtx_threshold = 150; + ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0 +} +); + +RUs = ( +{ + local_rf = "yes" + nb_tx = 1 + nb_rx = 1 + att_tx = 0 + att_rx = 0; + bands = [78]; + max_pdschReferenceSignalPower = -27; + max_rxgain = 114; + sf_extension = 0; + eNB_instances = [0]; + #beamforming 1x4 matrix: + bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000]; + #clock_src = "internal"; + sdr_addrs = "addr=192.168.50.2,second_addr=192.168.60.2,clock_source=external,time_source=external" +} +); + +THREAD_STRUCT = ( +{ + #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT" + parallel_config = "PARALLEL_SINGLE_THREAD"; + #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE" + worker_config = "WORKER_ENABLE"; +} +); + +rfsimulator : +{ + serveraddr = "server"; + serverport = "4043"; + options = (); #("saviq"); or/and "chanmod" + modelname = "AWGN"; + IQfile = "/tmp/rfsimulator.iqs"; +}; + +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"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + ngap_log_level ="debug"; + ngap_log_verbosity ="medium"; +}; + diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr1.106prb.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr1.106prb.conf index 6a5fbc3785..32790b93e7 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr1.106prb.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr1.106prb.conf @@ -1,7 +1,7 @@ PRSs = ( { - Active_gNBs = 2; + Active_gNBs = 1; prs_config0 = ( { gNB_id = 0; @@ -37,7 +37,49 @@ PRSs = PRSResourceOffset = [1]; PRSResourceRepetition = 1; PRSResourceTimeGap = 1; - NPRS_ID = [0]; + NPRS_ID = [1]; + MutingPattern1 = []; + MutingPattern2 = []; + MutingBitRepetition = 1; + } + ); + + prs_config2 = ( + { + gNB_id = 2; + NumPRSResources = 1; + PRSResourceSetPeriod = [20, 2]; + SymbolStart = [7]; + NumPRSSymbols = [6]; + NumRB = 106; + RBOffset = 0; + CombSize = 4; + REOffset = [0]; + PRSResourceOffset = [2]; + PRSResourceRepetition = 1; + PRSResourceTimeGap = 1; + NPRS_ID = [2]; + MutingPattern1 = []; + MutingPattern2 = []; + MutingBitRepetition = 1; + } + ); + + prs_config3 = ( + { + gNB_id = 3; + NumPRSResources = 1; + PRSResourceSetPeriod = [20, 2]; + SymbolStart = [7]; + NumPRSSymbols = [6]; + NumRB = 106; + RBOffset = 0; + CombSize = 4; + REOffset = [0]; + PRSResourceOffset = [3]; + PRSResourceRepetition = 1; + PRSResourceTimeGap = 1; + NPRS_ID = [3]; MutingPattern1 = []; MutingPattern2 = []; MutingBitRepetition = 1; diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr1.217prb.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr1.217prb.conf index 21ac9c53c5..c2fd316524 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr1.217prb.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue.nr.prs.fr1.217prb.conf @@ -37,7 +37,49 @@ PRSs = PRSResourceOffset = [1]; PRSResourceRepetition = 1; PRSResourceTimeGap = 1; - NPRS_ID = [5]; + NPRS_ID = [1]; + MutingPattern1 = []; + MutingPattern2 = []; + MutingBitRepetition = 1; + } + ); + + prs_config2 = ( + { + gNB_id = 2; + NumPRSResources = 1; + PRSResourceSetPeriod = [20, 2]; + SymbolStart = [7]; + NumPRSSymbols = [6]; + NumRB = 216; + RBOffset = 0; + CombSize = 4; + REOffset = [0]; + PRSResourceOffset = [2]; + PRSResourceRepetition = 1; + PRSResourceTimeGap = 1; + NPRS_ID = [2]; + MutingPattern1 = []; + MutingPattern2 = []; + MutingBitRepetition = 1; + } + ); + + prs_config3 = ( + { + gNB_id = 3; + NumPRSResources = 1; + PRSResourceSetPeriod = [20, 2]; + SymbolStart = [7]; + NumPRSSymbols = [6]; + NumRB = 216; + RBOffset = 0; + CombSize = 4; + REOffset = [0]; + PRSResourceOffset = [3]; + PRSResourceRepetition = 1; + PRSResourceTimeGap = 1; + NPRS_ID = [3]; MutingPattern1 = []; MutingPattern2 = []; MutingBitRepetition = 1; From daa8484670c74f9d48ca6664208324bf6fc7a56a Mon Sep 17 00:00:00 2001 From: Sagar Parsawar Date: Tue, 5 Jul 2022 15:45:30 +0200 Subject: [PATCH 108/135] Fixing PRS resource scheduling in UE --- openair1/SCHED_NR_UE/phy_procedures_nr_ue.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c index 020a32439b..4a8abe83e9 100644 --- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c +++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c @@ -1467,7 +1467,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue, { for (int i = 0; i < ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_cfg.PRSResourceRepetition; i++) { - if( (((frame_rx*fp->slots_per_frame + nr_slot_rx) - (ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_cfg.PRSResourceSetPeriod[1] + ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_cfg.PRSResourceOffset))%ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_cfg.PRSResourceSetPeriod[0]) == i*ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_cfg.PRSResourceTimeGap) + if( (((frame_rx*fp->slots_per_frame + nr_slot_rx) - (ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_cfg.PRSResourceSetPeriod[1] + ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_cfg.PRSResourceOffset) + ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_cfg.PRSResourceSetPeriod[0])%ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_cfg.PRSResourceSetPeriod[0]) == i*ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_cfg.PRSResourceTimeGap) { for(int j = ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_cfg.SymbolStart; j < (ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_cfg.SymbolStart+ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_cfg.NumPRSSymbols); j++) { From cd7f8333f73f2a043e5124bbdcb396ae76ee9759 Mon Sep 17 00:00:00 2001 From: Sagar Parsawar Date: Mon, 25 Jul 2022 13:57:56 +0200 Subject: [PATCH 109/135] Adding 16x IDFT interpolation for PRS peak estimation --- .../nr_dl_channel_estimation.c | 60 +++++++-- openair1/PHY/TOOLS/oai_dfts.c | 119 +++++++++++++++++- openair1/PHY/TOOLS/tools_defs.h | 3 + openair1/SCHED_NR/phy_procedures_nr_gNB.c | 6 +- 4 files changed, 169 insertions(+), 19 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 591d4d037b..9756f1105f 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -38,6 +38,7 @@ //#define DEBUG_CH //#define DEBUG_PRS_CHEST //#define DEBUG_PRS_PRINTS +#define IDFT_INTERPOL_FACTOR 1 extern short nr_qpsk_mod_table[8]; int k_prime_table[4][12] = { {0,1,0,1,0,1,0,1,0,1,0,1}, @@ -62,12 +63,7 @@ int nr_prs_channel_estimation(uint8_t gNB_id, prs_meas_t **prs_meas = ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_meas; int32_t **prs_chestF = ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_ch_estimates; int32_t **prs_chestT = ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_ch_estimates_time; - int slot_prs; - if(rep_num > 0) - slot_prs = (proc->nr_slot_rx - prs_cfg->PRSResourceTimeGap)%frame_params->slots_per_frame; - else - slot_prs = proc->nr_slot_rx; - + int slot_prs = (proc->nr_slot_rx - rep_num*prs_cfg->PRSResourceTimeGap + frame_params->slots_per_frame)%frame_params->slots_per_frame; uint32_t **nr_gold_prs = ue->nr_gold_prs[gNB_id][rsc_id][slot_prs]; uint8_t rxAnt = 0, idx = 0; @@ -76,13 +72,18 @@ int nr_prs_channel_estimation(uint8_t gNB_id, int16_t k_prime = 0, k = 0, re_offset = 0, first_half = 0, second_half = 0; int16_t *ch_tmp = (int16_t *)malloc16_clear(frame_params->ofdm_symbol_size*sizeof(int32_t)); AssertFatal((ch_tmp != NULL), "[%s] channel estimate buffer initialization failed!!", __FUNCTION__); + int16_t *chF_interpol = (int16_t *)malloc16_clear(IDFT_INTERPOL_FACTOR*frame_params->ofdm_symbol_size*sizeof(int32_t)); + AssertFatal((chF_interpol != NULL), "[%s] channel estimate buffer initialization failed!!", __FUNCTION__); + int16_t *chT_interpol = (int16_t *)malloc16_clear(IDFT_INTERPOL_FACTOR*frame_params->ofdm_symbol_size*sizeof(int32_t)); + AssertFatal((chT_interpol != NULL), "[%s] channel estimate buffer initialization failed!!", __FUNCTION__); int32_t ch_pwr = 0, snr = 0; #ifdef DEBUG_PRS_CHEST char filename[64] = {0}, varname[64] = {0}; #endif - int16_t *ch_init = ch_tmp; + int16_t *ch_init = ch_tmp; int16_t scale_factor = (1.0f/(float)(prs_cfg->NumPRSSymbols))*(1<<15); - int16_t num_pilots = (12/prs_cfg->CombSize)*prs_cfg->NumRB; + int16_t num_pilots = (12/prs_cfg->CombSize)*prs_cfg->NumRB; + int16_t start_offset = (IDFT_INTERPOL_FACTOR-1)*frame_params->ofdm_symbol_size>>1; for(int l = prs_cfg->SymbolStart; l < prs_cfg->SymbolStart+prs_cfg->NumPRSSymbols; l++) { @@ -434,9 +435,12 @@ int nr_prs_channel_estimation(uint8_t gNB_id, if(second_half > 0) memcpy((int16_t *)&prs_chestF[rxAnt][0], &ch_tmp[(first_half<<1)], second_half*sizeof(int32_t)); + memcpy((int16_t *)&chF_interpol[start_offset+re_offset], &ch_tmp[0], first_half*sizeof(int32_t)); + memcpy((int16_t *)&chF_interpol[start_offset], &ch_tmp[(first_half<<1)], second_half*sizeof(int32_t)); + // Time domain IMPULSE response idft_size_idx_t idftsizeidx; - switch (frame_params->ofdm_symbol_size) { + switch (IDFT_INTERPOL_FACTOR*frame_params->ofdm_symbol_size) { case 128: idftsizeidx = IDFT_128; break; @@ -473,18 +477,46 @@ int nr_prs_channel_estimation(uint8_t gNB_id, idftsizeidx = IDFT_4096; break; + case 8192: + idftsizeidx = IDFT_8192; + break; + + case 12288: + idftsizeidx = IDFT_12288; + break; + + case 16384: + idftsizeidx = IDFT_16384; + break; + + case 24576: + idftsizeidx = IDFT_24576; + break; + + case 32768: + idftsizeidx = IDFT_32768; + break; + + case 49152: + idftsizeidx = IDFT_49152; + break; + + case 65536: + idftsizeidx = IDFT_65536; + break; + default: LOG_I(PHY, "%s: unsupported ofdm symbol size \n", __FUNCTION__); assert(0); } idft(idftsizeidx, - (int16_t *)&prs_chestF[rxAnt][0], - (int16_t *)&ch_tmp[0],1); + (int16_t *)&chF_interpol[0], + (int16_t *)&chT_interpol[0],1); // rearrange impulse response - memcpy((int16_t *)&prs_chestT[rxAnt][0], &ch_tmp[frame_params->ofdm_symbol_size], (frame_params->ofdm_symbol_size>>1)*sizeof(int32_t)); - memcpy((int16_t *)&prs_chestT[rxAnt][(frame_params->ofdm_symbol_size>>1)], &ch_tmp[0], (frame_params->ofdm_symbol_size>>1)*sizeof(int32_t)); + memcpy((int16_t *)&prs_chestT[rxAnt][0], &chT_interpol[IDFT_INTERPOL_FACTOR*frame_params->ofdm_symbol_size], (frame_params->ofdm_symbol_size>>1)*sizeof(int32_t)); + memcpy((int16_t *)&prs_chestT[rxAnt][(frame_params->ofdm_symbol_size>>1)], &chT_interpol[start_offset], (frame_params->ofdm_symbol_size>>1)*sizeof(int32_t)); // peak estimator peak_estimator(&prs_chestT[rxAnt][0], @@ -530,6 +562,8 @@ int nr_prs_channel_estimation(uint8_t gNB_id, } free(ch_tmp); + free(chF_interpol); + free(chT_interpol); return(0); } diff --git a/openair1/PHY/TOOLS/oai_dfts.c b/openair1/PHY/TOOLS/oai_dfts.c index 5e8622bb24..014199831f 100644 --- a/openair1/PHY/TOOLS/oai_dfts.c +++ b/openair1/PHY/TOOLS/oai_dfts.c @@ -5363,7 +5363,7 @@ void idft8192(int16_t *x,int16_t *y,unsigned char scale) #endif -int16_t tw16384[3*2*4096]; +int16_t tw16384[3*2*4096] __attribute__((aligned(32))); #ifndef __AVX2__ void dft16384(int16_t *x,int16_t *y,unsigned char scale) @@ -7013,6 +7013,122 @@ void idft49152(int16_t *input, int16_t *output,uint8_t scale) { _m_empty(); } +int16_t tw65536[3*2*4096] __attribute__((aligned(32))); + +#ifndef __AVX2__ +void idft65536(int16_t *x,int16_t *y,unsigned char scale) +{ + + simd_q15_t xtmp[16384],ytmp[16384],*tw65536_128p=(simd_q15_t *)tw65536,*x128=(simd_q15_t *)x,*y128=(simd_q15_t *)y,*y128p=(simd_q15_t *)y; + simd_q15_t *ytmpp = &ytmp[0]; + int i,j; + + for (i=0,j=0; i<16384; i+=4,j++) { + transpose16_ooff(x128+i,xtmp+j,4096); + } + + + idft16384((int16_t*)(xtmp),(int16_t*)(ytmp),1); + idft16384((int16_t*)(xtmp+4096),(int16_t*)(ytmp+4096),1); + idft16384((int16_t*)(xtmp+8192),(int16_t*)(ytmp+8192),1); + idft16384((int16_t*)(xtmp+12288),(int16_t*)(ytmp+12288),1); + + for (i=0; i<4096; i++) { + ibfly4(ytmpp,ytmpp+4096,ytmpp+8192,ytmpp+12288, + y128p,y128p+4096,y128p+8192,y128p+12288, + tw65536_128p,tw63536_128p+4096,tw65536_128p+8192); + tw65536_128p++; + y128p++; + ytmpp++; + } + + if (scale>0) { + + for (i=0; i<1024; i++) { + y128[0] = shiftright_int16(y128[0],scale); + y128[1] = shiftright_int16(y128[1],scale); + y128[2] = shiftright_int16(y128[2],scale); + y128[3] = shiftright_int16(y128[3],scale); + y128[4] = shiftright_int16(y128[4],scale); + y128[5] = shiftright_int16(y128[5],scale); + y128[6] = shiftright_int16(y128[6],scale); + y128[7] = shiftright_int16(y128[7],scale); + y128[8] = shiftright_int16(y128[8],scale); + y128[9] = shiftright_int16(y128[9],scale); + y128[10] = shiftright_int16(y128[10],scale); + y128[11] = shiftright_int16(y128[11],scale); + y128[12] = shiftright_int16(y128[12],scale); + y128[13] = shiftright_int16(y128[13],scale); + y128[14] = shiftright_int16(y128[14],scale); + y128[15] = shiftright_int16(y128[15],scale); + + y128+=16; + } + + } + + _mm_empty(); + _m_empty(); +} + +#else // __AVX2__ +void idft65536(int16_t *x,int16_t *y,unsigned char scale) +{ + + simd256_q15_t xtmp[8192],ytmp[8192],*tw65536_256p=(simd256_q15_t *)tw65536,*x256=(simd256_q15_t *)x,*y256=(simd256_q15_t *)y,*y256p=(simd256_q15_t *)y; + simd256_q15_t *ytmpp = &ytmp[0]; + int i,j; + + for (i=0,j=0; i<8192; i+=4,j++) { + transpose16_ooff_simd256(x256+i,xtmp+j,2048); + } + + + idft16384((int16_t*)(xtmp),(int16_t*)(ytmp),1); + idft16384((int16_t*)(xtmp+2048),(int16_t*)(ytmp+2048),1); + idft16384((int16_t*)(xtmp+4096),(int16_t*)(ytmp+4096),1); + idft16384((int16_t*)(xtmp+6144),(int16_t*)(ytmp+6144),1); + + for (i=0; i<2048; i++) { + ibfly4_256(ytmpp,ytmpp+2048,ytmpp+4096,ytmpp+6144, + y256p,y256p+2048,y256p+4096,y256p+6144, + tw65536_256p,tw65536_256p+4096,tw65536_256p+8192); + tw65536_256p++; + y256p++; + ytmpp++; + } + + if (scale>0) { + + for (i=0; i<512; i++) { + y256[0] = shiftright_int16_simd256(y256[0],scale); + y256[1] = shiftright_int16_simd256(y256[1],scale); + y256[2] = shiftright_int16_simd256(y256[2],scale); + y256[3] = shiftright_int16_simd256(y256[3],scale); + y256[4] = shiftright_int16_simd256(y256[4],scale); + y256[5] = shiftright_int16_simd256(y256[5],scale); + y256[6] = shiftright_int16_simd256(y256[6],scale); + y256[7] = shiftright_int16_simd256(y256[7],scale); + y256[8] = shiftright_int16_simd256(y256[8],scale); + y256[9] = shiftright_int16_simd256(y256[9],scale); + y256[10] = shiftright_int16_simd256(y256[10],scale); + y256[11] = shiftright_int16_simd256(y256[11],scale); + y256[12] = shiftright_int16_simd256(y256[12],scale); + y256[13] = shiftright_int16_simd256(y256[13],scale); + y256[14] = shiftright_int16_simd256(y256[14],scale); + y256[15] = shiftright_int16_simd256(y256[15],scale); + + y256+=16; + } + + } + + _mm_empty(); + _m_empty(); +} + +#endif //__AVX2__ + int16_t twa73728[49152] __attribute__((aligned(32))); int16_t twb73728[49152] __attribute__((aligned(32))); // 24576 x 3 @@ -10708,6 +10824,7 @@ int dfts_autoinit(void) init_rad2(8192,tw8192); init_rad4(16384,tw16384); init_rad2(32768,tw32768); + init_rad4(65536,tw65536); init_rad3(768,twa768,twb768); init_rad3(1536,twa1536,twb1536); diff --git a/openair1/PHY/TOOLS/tools_defs.h b/openair1/PHY/TOOLS/tools_defs.h index 8303e088b4..f272e513c2 100644 --- a/openair1/PHY/TOOLS/tools_defs.h +++ b/openair1/PHY/TOOLS/tools_defs.h @@ -275,10 +275,13 @@ This function performs optimized fixed-point radix-2 FFT/IFFT. SZ_DEF(8192) \ SZ_DEF(9216) \ SZ_DEF(12288) \ + SZ_DEF(16384) \ SZ_DEF(18432) \ SZ_DEF(24576) \ + SZ_DEF(32768) \ SZ_DEF(36864) \ SZ_DEF(49152) \ + SZ_DEF(65536) \ SZ_DEF(73728) \ SZ_DEF(98304) diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index 3fbd0e654d..ffbedf3da7 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -149,11 +149,7 @@ void phy_procedures_gNB_TX(processingData_L1tx_t *msgTx, { if( (((frame*fp->slots_per_frame + slot) - (gNB->prs_vars.prs_cfg[rsc_id].PRSResourceSetPeriod[1] + gNB->prs_vars.prs_cfg[rsc_id].PRSResourceOffset)+gNB->prs_vars.prs_cfg[rsc_id].PRSResourceSetPeriod[0])%gNB->prs_vars.prs_cfg[rsc_id].PRSResourceSetPeriod[0]) == i*gNB->prs_vars.prs_cfg[rsc_id].PRSResourceTimeGap ) { - if (i > 0) - slot_prs = (slot - gNB->prs_vars.prs_cfg[rsc_id].PRSResourceTimeGap + fp->slots_per_frame)%fp->slots_per_frame; - else - slot_prs = slot; - + slot_prs = (slot - i*gNB->prs_vars.prs_cfg[rsc_id].PRSResourceTimeGap + fp->slots_per_frame)%fp->slots_per_frame; LOG_D(PHY,"gNB_TX: frame %d, slot %d, slot_prs %d, PRS Resource ID %d\n",frame, slot, slot_prs, rsc_id); nr_generate_prs(gNB->nr_gold_prs[rsc_id][slot_prs],&gNB->common_vars.txdataF[0][txdataF_offset], AMP, &gNB->prs_vars.prs_cfg[rsc_id], cfg, fp); } From 117c8bcc95dd581c8a8c45cc9dbd6e087af8a3ad Mon Sep 17 00:00:00 2001 From: Sagar Parsawar Date: Thu, 4 Aug 2022 14:37:05 +0200 Subject: [PATCH 110/135] Merge remote-tracking branch 'origin/develop' into nr_prs --- ci-scripts/Jenkinsfile-GitLab-Container | 20 + ci-scripts/Jenkinsfile-push-registry | 2 +- ci-scripts/Jenkinsfile-tmp-multi-enb | 187 +- ci-scripts/Jenkinsfile-trig-nsa | 30 +- ci-scripts/checkCodingFormattingRules.sh | 4 +- ci-scripts/ci_ueinfra.yaml | 6 +- ci-scripts/cls_containerize.py | 123 +- ci-scripts/cls_physim.py | 4 +- ci-scripts/cls_static_code_analysis.py | 203 + ci-scripts/conf_files/benetel-5g.conf | 2 - ...sci_gnb.band78.sa.fr1.106PRB.usrpn310.conf | 1 - .../episci_rcc.band78.tm1.106PRB.nfapi.conf | 1 - ...oxy_gnb.band78.sa.fr1.106PRB.usrpn310.conf | 1 - .../proxy_rcc.band78.tm1.106PRB.nfapi.conf | 1 - ci-scripts/conf_files/gNB_SA_CU.conf | 1 - ci-scripts/conf_files/gNB_SA_DU.conf | 1 - .../gNB_SA_n78_106PRB.2x2_usrpn310.conf | 3 +- .../gNB_SA_n78_133PRB.2x2_usrpn310.conf | 3 +- .../gnb.band261.tm1.32PRB.usrpn300.conf | 1 - .../gnb.band66.tm1.106PRB.usrpn300.conf | 1 - .../gnb.band78.nsa_2x2.106PRB.usrpn310.conf | 3 +- ...and78.sa.fr1.106PRB.2x2.usrpn310.asue.conf | 1 - ...gnb.band78.sa.fr1.106PRB.2x2.usrpn310.conf | 3 +- ...nd78.sa.fr1.106PRB.ddsuu.2x2.usrpn310.conf | 1 - .../gnb.band78.sa.fr1.106PRB.usrpn310.conf | 1 - ...gnb.band78.sa.fr1.162PRB.2x2.usrpn310.conf | 3 +- .../gnb.band78.tm1.106PRB.usrpn300.conf | 3 +- .../gnb.band78.tm1.fr1.106PRB.usrpb210.conf | 1 - .../gnb.band78.tm1.fr1.106PRB.usrpn310.conf | 1 - .../gnb.sa.band66.fr1.106PRB.usrpn300.conf | 1 - .../gnb.sa.band78.fr1.106PRB.usrpb210.conf | 344 + .../gnb.sa.band78.fr1.24PRB.usrpb210.conf | 3 - ci-scripts/datalog_rt_stats.2x2.yaml | 4 +- ci-scripts/datalog_rt_stats.default.yaml | 7 +- .../docker/Dockerfile.formatting.bionic | 31 + ci-scripts/epc.py | 21 +- ci-scripts/main.py | 15 +- ci-scripts/ran.py | 24 +- ci-scripts/ran_dashboard/Hdashboard.py | 6 +- ci-scripts/sshconnection.py | 17 +- ci-scripts/stats_monitor_conf.yaml | 4 +- ci-scripts/xml_class_list.yml | 2 + .../xml_files/container_5g_l2sim_proxy.xml | 42 + .../xml_files/container_nsa_b200_quectel.xml | 5 +- .../xml_files/container_sa_b200_quectel.xml | 168 + .../xml_files/container_sa_b200_terminate.xml | 42 + ci-scripts/xml_files/formatting_check.xml | 37 + ci-scripts/xml_files/fr1_5gc_closure.xml | 37 + ci-scripts/xml_files/fr1_5gc_start.xml | 38 + ci-scripts/xml_files/fr1_gnb_build.xml | 2 +- ci-scripts/xml_files/fr1_multi_node_build.xml | 2 +- ci-scripts/xml_files/fr1_nsa_2x2_quectel.xml | 1 + .../fr1_nsa_2x2_quectel_attach_detach.xml | 1 + ci-scripts/xml_files/fr1_nsa_quectel.xml | 38 +- ci-scripts/xml_files/fr1_sa_quectel.xml | 1 + .../xml_files/fr1_sa_quectel_162prb.xml | 1 + .../xml_files/fr1_sa_quectel_stages.xml | 1 + ci-scripts/xml_files/gnb_phytest_usrp_run.xml | 4 +- ci-scripts/xml_files/gnb_usrp_build.xml | 2 +- ci-scripts/xml_files/ldpc_gpu_test.xml | 2 +- ci-scripts/xml_files/lte_2x2_tm1_quectel.xml | 5 +- ci-scripts/xml_files/lte_2x2_tm2_quectel.xml | 5 +- .../yaml_files/sa_b200_gnb/docker-compose.yml | 44 + cmake_targets/CMakeLists.txt | 78 +- cmake_targets/autotests/test_case_list.xml | 77 +- cmake_targets/build_oai | 27 +- cmake_targets/tools/build_helper | 24 +- common/utils/nr/nr_common.c | 67 +- common/utils/nr/nr_common.h | 8 +- common/utils/ocp_itti/intertask_interface.cpp | 1 + common/utils/threadPool/thread-pool.h | 2 +- common/utils/time_meas.c | 65 +- common/utils/time_meas.h | 11 +- doc/BUILD.md | 1 + doc/FEATURE_SET.md | 16 +- doc/NR_SA_CN5G_gNB_B210_COTS_UE_Tutorial.md | 227 + doc/NR_SA_CN5G_gNB_N300_COTS_UE_Tutorial.md | 244 + doc/RUNMODEM.md | 17 + doc/RUN_NR_multiple_BWPs.md | 51 + doc/TESTBenches.md | 180 +- doc/TESTING_5GSA_setup.md | 38 +- doc/UL_MIMO.txt | 31 + doc/images/mimo_antenna_ports.png | Bin 0 -> 18753 bytes .../4g-faraday-bench.pdf | Bin 0 -> 53079 bytes .../4g-faraday-bench.png | Bin 0 -> 92377 bytes .../4g-faraday-bench.tex | 59 + .../5g-nsa-faraday-bench.pdf | Bin 0 -> 337509 bytes .../5g-nsa-faraday-bench.png | Bin 0 -> 89413 bytes .../5g-nsa-faraday-bench.tex | 55 + .../5g-ota-bench.pdf | Bin 0 -> 232400 bytes .../5g-ota-bench.png | Bin 0 -> 96734 bytes .../5g-ota-bench.tex | 68 + doc/testbenches_doc_resources/antenna.pdf | Bin 0 -> 4886 bytes doc/testbenches_doc_resources/b200-mini.png | Bin 0 -> 238906 bytes doc/testbenches_doc_resources/b210.jpg | Bin 0 -> 32877 bytes doc/testbenches_doc_resources/indoor_live.jpg | Bin 254133 -> 0 bytes doc/testbenches_doc_resources/legacy1.jpg | Bin 107882 -> 0 bytes doc/testbenches_doc_resources/legacy2.jpg | Bin 122055 -> 0 bytes doc/testbenches_doc_resources/n310.png | Bin 0 -> 120716 bytes doc/testbenches_doc_resources/next_ci.jpg | Bin 157592 -> 0 bytes doc/testbenches_doc_resources/next_dev.jpg | Bin 185772 -> 0 bytes .../outdoor_live.jpg | Bin 167702 -> 0 bytes doc/testbenches_doc_resources/phone.pdf | Bin 0 -> 4358 bytes doc/testbenches_doc_resources/quectel.png | Bin 0 -> 88455 bytes doc/testbenches_doc_resources/server.pdf | Bin 0 -> 4366 bytes doc/testbenches_doc_resources/x310.jpg | Bin 0 -> 11188 bytes doc/testing_gnb_w_cots_ue_resources/gnb.conf | 2 - .../docker-compose-basic-nrf.yaml | 360 + doc/tutorial_resources/oai_db.sql | 328 + docker/Dockerfile.build.rhel8.2 | 2 +- docker/Dockerfile.build.ubuntu18 | 2 +- docker/Dockerfile.phySim.rhel8.2 | 2 +- docker/scripts/generateTemplate.py | 1 + docker/scripts/gnb_entrypoint.sh | 1 + docker/scripts/gnb_parameters.yaml | 30 + executables/main-ocp.c | 2 +- executables/nr-gnb.c | 49 +- executables/nr-ru.c | 24 +- executables/nr-softmodem-common.h | 1 + executables/nr-softmodem.c | 2 +- executables/nr-softmodem.h | 5 +- executables/nr-ue.c | 44 +- executables/nr-uesoftmodem.c | 10 +- executables/nr-uesoftmodem.h | 14 +- executables/softmodem-common.c | 3 + executables/softmodem-common.h | 23 +- ...384_rate_1-3_block_length_8448_maxit_5.txt | 64 + nfapi/oai_integration/nfapi_vnf.c | 4 +- .../nfapi/public_inc/fapi_nr_ue_constants.h | 4 +- .../nfapi/public_inc/fapi_nr_ue_interface.h | 48 +- .../nfapi/public_inc/nfapi_nr_interface_scf.h | 96 +- nfapi/open-nFAPI/nfapi/src/nfapi_p7.c | 4 - .../CODING/3gpplte_turbo_decoder_sse_8bit.c | 6 +- openair1/PHY/CODING/coding_defs.h | 23 +- openair1/PHY/CODING/crc_byte.c | 4 +- .../CODING/nrLDPC_decoder/doc/nrLDPC/logo.png | Bin 3723 -> 0 bytes .../nrLDPC_decoder/doc/nrLDPC/nrLDPC.pdf | Bin 281923 -> 0 bytes .../nrLDPC_decoder/doc/nrLDPC/nrLDPC.tex | 960 - .../nrLDPC_decoder/doc/nrLDPC/references.bib | 105 - .../CODING/nrLDPC_decoder/doc/nrLDPC_doxyCfg | 2427 - .../PHY/CODING/nrLDPC_decoder/nrLDPC_bnProc.h | 2 +- .../PHY/CODING/nrLDPC_decoder/nrLDPC_cnProc.h | 81 +- .../nrLDPC_decoder/nrLDPC_cnProc_avx512.h | 865 + .../CODING/nrLDPC_decoder/nrLDPC_decoder.c | 597 +- .../CODING/nrLDPC_decoder/nrLDPC_init_mem.h | 83 + .../PHY/CODING/nrLDPC_decoder/nrLDPC_mPass.h | 46 +- .../nrLDPC_tools/CMakeLists.txt | 19 + .../generator_bnProc/CMakeLists.txt | 36 + .../generator_bnProc/bnProcPc_gen_BG1_avx2.c | 1789 + .../generator_bnProc/bnProcPc_gen_BG2_avx2.c | 1789 + .../generator_bnProc/bnProc_gen_BG1_avx2.c | 1112 + .../generator_bnProc/bnProc_gen_BG2_avx2.c | 1108 + .../nrLDPC_tools/generator_bnProc/main.c | 55 + .../generator_bnProc_avx512/CMakeLists.txt | 36 + .../bnProcPc_gen_BG1_avx512.c | 1790 + .../bnProcPc_gen_BG2_avx512.c | 1793 + .../bnProc_gen_BG1_avx512.c | 1112 + .../bnProc_gen_BG2_avx512.c | 1108 + .../generator_bnProc_avx512/main.c | 56 + .../generator_cnProc/CMakeLists.txt | 25 + .../generator_cnProc/cnProc_gen_BG1_avx2.c | 693 + .../generator_cnProc/cnProc_gen_BG2_avx2.c | 436 + .../nrLDPC_tools/generator_cnProc/main.c | 50 + .../generator_cnProc_avx512/CMakeLists.txt | 25 + .../cnProc_gen_BG1_avx512.c | 597 + .../cnProc_gen_BG2_avx512.c | 414 + .../generator_cnProc_avx512/main.c | 50 + .../nrLDPC_tools/run_ldpc_generators.sh | 11 + .../PHY/CODING/nrLDPC_decoder/nrLDPC_types.h | 6 +- .../nrLDPC_decoder/nrLDPCdecoder_defs.h | 10 + openair1/PHY/CODING/nr_rate_matching.c | 16 +- openair1/PHY/INIT/nr_init.c | 146 +- openair1/PHY/INIT/nr_init_ru.c | 16 +- openair1/PHY/INIT/nr_init_ue.c | 100 +- .../lte_ul_channel_estimation.c | 34 +- openair1/PHY/LTE_TRANSPORT/dci_tools.c | 4 +- openair1/PHY/LTE_TRANSPORT/dci_tools_common.c | 146 +- openair1/PHY/LTE_TRANSPORT/defs_NB_IoT.h | 2 +- openair1/PHY/LTE_TRANSPORT/dlsch_coding.c | 2 +- openair1/PHY/LTE_UE_TRANSPORT/dci_tools_ue.c | 21 +- .../PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c | 2 +- .../linear_preprocessing_rec.c | 2 +- .../PHY/LTE_UE_TRANSPORT/transport_proto_ue.h | 8 - openair1/PHY/LTE_UE_TRANSPORT/transport_ue.h | 2 +- openair1/PHY/LTE_UE_TRANSPORT/ulsch_coding.c | 47 +- openair1/PHY/MODULATION/nr_modulation.c | 36 +- openair1/PHY/MODULATION/ofdm_mod.c | 44 +- openair1/PHY/MODULATION/slot_fep_nr.c | 97 +- .../PHY/NR_ESTIMATION/nr_measurements_gNB.c | 51 +- .../NR_ESTIMATION/nr_ul_channel_estimation.c | 443 +- openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h | 30 +- openair1/PHY/NR_REFSIG/dmrs_nr.c | 146 +- openair1/PHY/NR_REFSIG/dmrs_nr.h | 7 +- openair1/PHY/NR_REFSIG/nr_dmrs_rx.c | 11 +- openair1/PHY/NR_REFSIG/nr_gold.c | 27 - openair1/PHY/NR_REFSIG/nr_refsig.h | 4 +- openair1/PHY/NR_REFSIG/pss_nr.h | 2 - openair1/PHY/NR_REFSIG/ptrs_nr.c | 9 +- openair1/PHY/NR_REFSIG/ptrs_nr.h | 1 - openair1/PHY/NR_REFSIG/refsig_defs_ue.h | 1 + openair1/PHY/NR_REFSIG/ss_pbch_nr.h | 2 - .../dlsch_pdu_rel15.time_alloc_list_flag | 0 .../dlsch_pdu_rel15.time_allocation_type | 0 openair1/PHY/NR_TRANSPORT/nr_csi_rs.c | 228 +- openair1/PHY/NR_TRANSPORT/nr_dci.c | 41 +- openair1/PHY/NR_TRANSPORT/nr_dci.h | 2 +- openair1/PHY/NR_TRANSPORT/nr_dci_tools.c | 151 +- openair1/PHY/NR_TRANSPORT/nr_dlsch.c | 16 +- openair1/PHY/NR_TRANSPORT/nr_dlsch.h | 5 - openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c | 30 +- openair1/PHY/NR_TRANSPORT/nr_pbch.c | 6 +- openair1/PHY/NR_TRANSPORT/nr_prach.c | 506 +- openair1/PHY/NR_TRANSPORT/nr_scrambling.c | 1 + .../NR_TRANSPORT/nr_transport_common_proto.h | 8 - .../PHY/NR_TRANSPORT/nr_transport_proto.h | 50 +- openair1/PHY/NR_TRANSPORT/nr_ulsch.c | 45 +- openair1/PHY/NR_TRANSPORT/nr_ulsch.h | 6 + openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c | 68 +- .../PHY/NR_TRANSPORT/nr_ulsch_demodulation.c | 1329 +- .../NR_TRANSPORT/nr_ulsch_llr_computation.c | 42 +- openair1/PHY/NR_TRANSPORT/pucch_rx.c | 34 +- openair1/PHY/NR_TRANSPORT/srs_rx.c | 15 +- openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c | 21 +- openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h | 6 + .../nr_dl_channel_estimation.c | 103 +- openair1/PHY/NR_UE_TRANSPORT/csi_rx.c | 969 + openair1/PHY/NR_UE_TRANSPORT/dci_nr.c | 10 +- .../PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c | 36 +- .../NR_UE_TRANSPORT/nr_dlsch_demodulation.c | 175 +- .../nr_dlsch_llr_computation.c | 11 +- .../PHY/NR_UE_TRANSPORT/nr_initial_sync.c | 2 + openair1/PHY/NR_UE_TRANSPORT/nr_prach.c | 1080 +- .../NR_UE_TRANSPORT/nr_transport_proto_ue.h | 39 +- .../PHY/NR_UE_TRANSPORT/nr_transport_ue.h | 19 +- .../PHY/NR_UE_TRANSPORT/nr_ue_rf_helpers.c | 7 +- .../PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c | 80 +- openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c | 233 +- openair1/PHY/NR_UE_TRANSPORT/pss_nr.c | 130 - openair1/PHY/TOOLS/calibration_scope.c | 4 +- openair1/PHY/TOOLS/cmult_sv.c | 247 +- openair1/PHY/TOOLS/lte_ue_scope.c | 6 +- openair1/PHY/TOOLS/nr_phy_scope.c | 4 +- openair1/PHY/TOOLS/tools_defs.h | 141 +- openair1/PHY/defs_common.h | 8 +- openair1/PHY/defs_gNB.h | 52 +- openair1/PHY/defs_nr_UE.h | 30 +- openair1/PHY/defs_nr_common.h | 35 +- openair1/SCHED/ru_procedures.c | 14 +- openair1/SCHED/sched_common_extern.h | 2 + openair1/SCHED_NR/fapi_nr_l1.c | 1 - openair1/SCHED_NR/nr_ru_procedures.c | 3 +- openair1/SCHED_NR/phy_procedures_nr_gNB.c | 182 +- openair1/SCHED_NR_UE/defs.h | 6 +- openair1/SCHED_NR_UE/fapi_nr_ue_l1.c | 23 +- openair1/SCHED_NR_UE/harq_nr.c | 13 +- openair1/SCHED_NR_UE/phy_procedures_nr_ue.c | 120 +- .../SCHED_NR_UE/phy_sch_processing_time.h | 34 +- openair1/SCHED_UE/phy_procedures_lte_ue.c | 2 +- openair1/SIMULATION/LTE_PHY/dlsim.c | 16 +- openair1/SIMULATION/LTE_PHY/mbmssim.c | 18 +- openair1/SIMULATION/LTE_PHY/ulsim.c | 14 +- openair1/SIMULATION/NR_PHY/dlschsim.c | 45 +- openair1/SIMULATION/NR_PHY/dlsim.c | 302 +- .../SIMULATION/NR_PHY/nr_dummy_functions.c | 4 +- openair1/SIMULATION/NR_PHY/pbchsim.c | 27 +- openair1/SIMULATION/NR_PHY/prachsim.c | 39 +- openair1/SIMULATION/NR_PHY/pucchsim.c | 5 +- openair1/SIMULATION/NR_PHY/ulschsim.c | 55 +- openair1/SIMULATION/NR_PHY/ulsim.c | 618 +- .../NR_UE_PHY/unit_tests/build/CMakeCache.txt | 313 + .../CMakeFiles/2.8.12.2/CMakeCCompiler.cmake | 56 + .../2.8.12.2/CMakeCXXCompiler.cmake | 57 + .../2.8.12.2/CMakeDetermineCompilerABI_C.bin | Bin 0 -> 8392 bytes .../CMakeDetermineCompilerABI_CXX.bin | Bin 0 -> 8408 bytes .../CMakeFiles/2.8.12.2/CMakeSystem.cmake | 15 + .../2.8.12.2/CompilerIdC/CMakeCCompilerId.c | 389 + .../CMakeFiles/2.8.12.2/CompilerIdC/a.out | Bin 0 -> 8488 bytes .../CompilerIdCXX/CMakeCXXCompilerId.cpp | 377 + .../CMakeFiles/2.8.12.2/CompilerIdCXX/a.out | Bin 0 -> 8496 bytes .../build/CMakeFiles/CMakeOutput.log | 247 + .../build/CMakeFiles/cmake.check_cache | 1 + .../build/testlogs/frame_config_test.txt | 0 .../unit_tests/build/testlogs/harq_test.txt | 0 .../unit_tests/build/testlogs/pbch_test.txt | 0 .../unit_tests/build/testlogs/pss_test.txt | 0 .../build/testlogs/pucch_uci_test.txt | 0 .../unit_tests/build/testlogs/srs_test.txt | 0 .../unit_tests/build/testlogs/sss_test.txt | 0 .../NR_UE_PHY/unit_tests/src/pucch_uci_test.c | 96 +- openair1/SIMULATION/TOOLS/rangen_double.c | 2 +- openair2/COMMON/commonDef.h | 21 - openair2/COMMON/f1ap_messages_def.h | 2 + openair2/COMMON/f1ap_messages_types.h | 72 +- openair2/COMMON/gtpv1_u_messages_def.h | 3 +- openair2/COMMON/gtpv1_u_messages_types.h | 9 + openair2/COMMON/mac_messages_types.h | 2 +- openair2/COMMON/mac_rlc_primitives.h | 2 +- openair2/COMMON/platform_types.h | 61 +- openair2/COMMON/rrc_messages_types.h | 3 +- openair2/ENB_APP/enb_config.c | 38 +- openair2/ENB_APP/enb_config_eMTC.c | 122 +- openair2/ENB_APP/enb_paramdef_emtc.h | 4 +- openair2/ENB_APP/flexran_agent_ran_api.c | 8 +- openair2/F1AP/dummy_enb.c | 26 +- openair2/F1AP/f1ap_common.h | 7 - openair2/F1AP/f1ap_cu_task.c | 6 + openair2/F1AP/f1ap_cu_ue_context_management.c | 1352 +- openair2/F1AP/f1ap_cu_ue_context_management.h | 3 +- openair2/F1AP/f1ap_decoder.c | 8 + openair2/F1AP/f1ap_default_values.h | 2 +- openair2/F1AP/f1ap_du_interface_management.c | 13 + openair2/F1AP/f1ap_du_rrc_message_transfer.c | 25 +- openair2/F1AP/f1ap_du_task.c | 9 +- openair2/F1AP/f1ap_du_ue_context_management.c | 897 +- openair2/F1AP/f1ap_du_ue_context_management.h | 2 +- openair2/F1AP/f1ap_encoder.c | 2 +- openair2/F1AP/f1ap_handlers.c | 2 +- openair2/F1AP/f1ap_itti_messaging.c | 2 +- openair2/GNB_APP/L1_nr_paramdef.h | 5 +- openair2/GNB_APP/MACRLC_nr_paramdef.h | 76 +- openair2/GNB_APP/RRC_nr_paramsvalues.h | 61 +- openair2/GNB_APP/gnb_config.c | 436 +- openair2/GNB_APP/gnb_paramdef.h | 33 +- openair2/LAYER2/MAC/config.c | 14 +- openair2/LAYER2/MAC/defs_NB_IoT.h | 11 +- openair2/LAYER2/MAC/eNB_scheduler.c | 44 +- openair2/LAYER2/MAC/eNB_scheduler_RA.c | 2 +- openair2/LAYER2/MAC/eNB_scheduler_dlsch.c | 2 +- openair2/LAYER2/MAC/eNB_scheduler_fairRR.c | 24 +- .../LAYER2/MAC/eNB_scheduler_primitives.c | 40 +- openair2/LAYER2/MAC/eNB_scheduler_ulsch.c | 20 +- openair2/LAYER2/MAC/mac.h | 44 +- openair2/LAYER2/MAC/mac_extern.h | 2 +- openair2/LAYER2/MAC/mac_proto.h | 17 +- openair2/LAYER2/MAC/pre_processor.c | 2 +- openair2/LAYER2/MAC/ue_procedures.c | 28 +- .../NR_MAC_COMMON/nr_compute_tbs_common.c | 60 +- openair2/LAYER2/NR_MAC_COMMON/nr_mac.h | 34 + openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c | 658 +- openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h | 65 +- openair2/LAYER2/NR_MAC_COMMON/nr_mac_extern.h | 2 +- openair2/LAYER2/NR_MAC_UE/config_ue.c | 121 +- openair2/LAYER2/NR_MAC_UE/mac_defs.h | 20 +- openair2/LAYER2/NR_MAC_UE/mac_proto.h | 51 +- openair2/LAYER2/NR_MAC_UE/nr_l1_helpers.h | 1 + openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c | 14 +- .../NR_MAC_UE/nr_ue_dci_configuration.c | 92 +- openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c | 386 +- openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c | 342 +- openair2/LAYER2/NR_MAC_gNB/config.c | 177 +- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c | 181 +- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c | 499 +- .../LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c | 82 +- .../LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c | 525 +- .../LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c | 158 +- .../NR_MAC_gNB/gNB_scheduler_primitives.c | 1160 +- .../LAYER2/NR_MAC_gNB/gNB_scheduler_srs.c | 69 +- .../LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c | 880 +- .../LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c | 738 +- openair2/LAYER2/NR_MAC_gNB/mac_proto.h | 116 +- openair2/LAYER2/NR_MAC_gNB/main.c | 184 +- openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h | 165 +- openair2/LAYER2/PDCP_v10.1.0/pdcp.c | 208 +- openair2/LAYER2/PDCP_v10.1.0/pdcp.h | 121 +- .../LAYER2/PDCP_v10.1.0/pdcp_primitives.c | 33 +- .../LAYER2/PDCP_v10.1.0/pdcp_primitives.h | 19 +- .../PDCP_v10.1.0/pdcp_sequence_manager.c | 36 +- .../PDCP_v10.1.0/pdcp_sequence_manager.h | 16 +- openair2/LAYER2/PDCP_v10.1.0/pdcp_util.c | 6 +- openair2/LAYER2/PDCP_v10.1.0/pdcp_util.h | 4 +- openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.c | 2 +- openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_entity.h | 8 +- openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.c | 10 +- .../LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.c | 10 +- .../LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.h | 4 +- .../LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.c | 2 +- .../LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.c | 82 +- .../LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.h | 24 +- .../LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.c | 35 +- .../LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.h | 6 +- .../LAYER2/RLC/AM_v9.3.0/rlc_am_segment.c | 11 +- .../LAYER2/RLC/AM_v9.3.0/rlc_am_segment.h | 4 +- .../RLC/AM_v9.3.0/rlc_am_status_report.c | 16 +- openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_test.c | 2 +- .../AM_v9.3.0/rlc_am_timer_poll_retransmit.c | 2 +- openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm.c | 12 +- openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm.h | 13 +- openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_entity.h | 7 +- openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.c | 7 +- openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.h | 17 +- .../RLC/UM_v9.3.0/rlc_um_control_primitives.c | 2 +- openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_entity.h | 11 +- openair2/LAYER2/RLC/rlc.c | 15 +- openair2/LAYER2/RLC/rlc.h | 2 +- openair2/LAYER2/RLC/rlc_mac.c | 4 +- openair2/LAYER2/RLC/rlc_rrc.c | 10 +- openair2/LAYER2/nr_pdcp/nr_pdcp_entity.c | 20 +- .../LAYER2/nr_pdcp/nr_pdcp_integrity_nia1.c | 66 + .../LAYER2/nr_pdcp/nr_pdcp_integrity_nia1.h | 34 + openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c | 154 +- openair2/LAYER2/nr_rlc/nr_rlc_entity.c | 51 +- openair2/LAYER2/nr_rlc/nr_rlc_entity.h | 2 + openair2/LAYER2/nr_rlc/nr_rlc_entity_am.c | 6 + openair2/LAYER2/nr_rlc/nr_rlc_entity_am.h | 1 + openair2/LAYER2/nr_rlc/nr_rlc_entity_tm.c | 6 + openair2/LAYER2/nr_rlc/nr_rlc_entity_tm.h | 1 + openair2/LAYER2/nr_rlc/nr_rlc_entity_um.c | 6 + openair2/LAYER2/nr_rlc/nr_rlc_entity_um.h | 1 + openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c | 34 +- openair2/LAYER2/nr_rlc/nr_rlc_oai_api.h | 6 +- openair2/LAYER2/nr_rlc/tests/test14.txt.gz | Bin 799 -> 787 bytes openair2/LAYER2/nr_rlc/tests/test15.txt.gz | Bin 554 -> 547 bytes openair2/LAYER2/nr_rlc/tests/test8.txt.gz | Bin 319 -> 319 bytes openair2/LAYER2/nr_rlc/tests/test9.txt.gz | Bin 316 -> 316 bytes openair2/LAYER2/rlc_v2/rlc_oai_api.c | 12 + openair2/M2AP/m2ap_common.h | 5 - openair2/NETWORK_DRIVER/MESH/device.c | 9 +- openair2/NETWORK_DRIVER/UE_IP/device.c | 8 +- openair2/NR_PHY_INTERFACE/NR_IF_Module.c | 41 +- openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c | 265 +- openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h | 37 +- openair2/NR_UE_PHY_INTERFACE/NR_Packet_Drop.c | 183 + openair2/NR_UE_PHY_INTERFACE/NR_Packet_Drop.h | 68 + openair2/PHY_INTERFACE/phy_stub_UE.c | 2 +- openair2/PHY_INTERFACE/phy_stub_UE.h | 2 +- openair2/RRC/LITE/rrc_common.c | 2 +- openair2/RRC/LTE/L2_interface.c | 2 +- openair2/RRC/LTE/L2_interface_common.c | 4 +- openair2/RRC/LTE/L2_interface_ue.c | 2 +- openair2/RRC/LTE/MESSAGES/asn1_msg.c | 18 +- openair2/RRC/LTE/defs_NB_IoT.h | 4 +- openair2/RRC/LTE/rrc_UE.c | 9 +- openair2/RRC/LTE/rrc_defs.h | 8 +- openair2/RRC/LTE/rrc_eNB.c | 187 +- openair2/RRC/LTE/rrc_eNB_GTPV1U.c | 48 +- openair2/RRC/LTE/rrc_eNB_GTPV1U.h | 19 +- openair2/RRC/LTE/rrc_eNB_S1AP.c | 52 +- openair2/RRC/LTE/rrc_proto.h | 4 +- openair2/RRC/NR/L2_nr_interface.c | 228 +- openair2/RRC/NR/MESSAGES/asn1_msg.c | 1062 +- openair2/RRC/NR/MESSAGES/asn1_msg.h | 20 +- openair2/RRC/NR/nr_rrc_config.c | 593 +- openair2/RRC/NR/nr_rrc_config.h | 25 +- openair2/RRC/NR/nr_rrc_defs.h | 20 +- openair2/RRC/NR/nr_rrc_proto.h | 78 +- openair2/RRC/NR/rrc_gNB.c | 899 +- openair2/RRC/NR/rrc_gNB_NGAP.c | 74 +- openair2/RRC/NR/rrc_gNB_nsa.c | 10 +- openair2/RRC/NR/rrc_gNB_reconfig.c | 1342 +- openair2/RRC/NR_UE/L2_interface_ue.c | 2 +- openair2/RRC/NR_UE/rrc_UE.c | 17 +- openair2/SDAP/nr_sdap/nr_sdap.c | 52 +- openair2/SDAP/nr_sdap/nr_sdap.h | 27 +- openair2/SDAP/nr_sdap/nr_sdap_entity.c | 36 +- openair2/SDAP/nr_sdap/nr_sdap_entity.h | 35 +- openair2/UTIL/OMG/defs.h | 6 - openair2/UTIL/OPT/opt.h | 5 +- openair2/UTIL/OPT/probe.c | 8 + openair2/X2AP/x2ap_common.h | 5 - openair3/M3AP/m3ap_common.h | 5 - openair3/NAS/COMMON/UTIL/nas_timer.c | 20 +- openair3/NAS/COMMON/UTIL/socket.c | 8 +- openair3/NAS/COMMON/UTIL/stty.c | 14 +- openair3/NAS/NR_UE/nr_nas_msg_sim.h | 1 - openair3/NAS/TEST/AS_SIMULATOR/as_simulator.c | 16 +- openair3/NAS/TEST/NETWORK/network_simulator.c | 8 +- openair3/NAS/TEST/USER/user_simulator.c | 4 +- openair3/NAS/UE/API/USER/at_command.c | 18 +- openair3/NAS/UE/API/USER/at_error.c | 6 +- openair3/NAS/UE/API/USER/at_response.c | 6 +- openair3/NAS/UE/EMM/Attach.c | 36 +- openair3/NAS/UE/EMM/Authentication.c | 12 +- openair3/NAS/UE/EMM/Detach.c | 9 +- openair3/NAS/UE/EMM/EmmStatusHdl.c | 3 +- openair3/NAS/UE/EMM/Identification.c | 3 +- openair3/NAS/UE/EMM/IdleMode.c | 28 +- openair3/NAS/UE/EMM/LowerLayer.c | 8 +- openair3/NAS/UE/EMM/LowerLayer.h | 2 +- openair3/NAS/UE/EMM/LowerLayer_defs.h | 2 +- .../SAP/EmmDeregisteredAttemptingToAttach.c | 2 +- .../EMM/SAP/EmmDeregisteredLimitedService.c | 2 +- .../UE/EMM/SAP/EmmDeregisteredNormalService.c | 2 +- openair3/NAS/UE/EMM/SAP/EmmRegistered.c | 2 +- .../NAS/UE/EMM/SAP/EmmRegisteredInitiated.c | 2 +- openair3/NAS/UE/EMM/SAP/emm_as.c | 6 +- openair3/NAS/UE/EMM/SAP/emm_asDef.h | 4 +- openair3/NAS/UE/EMM/SAP/emm_esmDef.h | 4 +- openair3/NAS/UE/EMM/SAP/emm_regDef.h | 4 +- openair3/NAS/UE/EMM/SecurityModeControl.c | 8 +- openair3/NAS/UE/EMM/emmData.h | 6 +- openair3/NAS/UE/EMM/emm_main.c | 36 +- openair3/NAS/UE/EMM/emm_main.h | 4 +- openair3/NAS/UE/EMM/emm_proc.h | 6 +- .../ESM/DedicatedEpsBearerContextActivation.c | 18 +- .../ESM/DefaultEpsBearerContextActivation.c | 22 +- .../NAS/UE/ESM/EpsBearerContextDeactivation.c | 20 +- openair3/NAS/UE/ESM/EsmStatusHdl.c | 6 +- openair3/NAS/UE/ESM/PdnConnectivity.c | 28 +- openair3/NAS/UE/ESM/PdnDisconnect.c | 10 +- openair3/NAS/UE/ESM/SAP/esm_sap.c | 40 +- openair3/NAS/UE/ESM/SAP/esm_sapDef.h | 6 +- openair3/NAS/UE/ESM/SAP/esm_send.c | 2 +- openair3/NAS/UE/ESM/SAP/esm_send.h | 4 +- openair3/NAS/UE/ESM/esmData.h | 9 +- openair3/NAS/UE/ESM/esm_ebr.c | 17 +- openair3/NAS/UE/ESM/esm_ebr.h | 8 +- openair3/NAS/UE/ESM/esm_ebr_context.c | 26 +- openair3/NAS/UE/ESM/esm_ebr_context.h | 2 +- openair3/NAS/UE/ESM/esm_main.c | 28 +- openair3/NAS/UE/ESM/esm_main.h | 7 +- openair3/NAS/UE/ESM/esm_proc.h | 37 +- openair3/NAS/UE/ESM/esm_pt.c | 8 +- openair3/NAS/UE/ESM/esm_pt.h | 4 +- openair3/NAS/UE/UEprocess.c | 4 +- openair3/NAS/UE/nas_proc.c | 80 +- openair3/NAS/UE/nas_proc.h | 8 +- openair3/NAS/UE/nas_proc_defs.h | 4 +- openair3/NAS/UE/nas_ue_task.c | 6 +- openair3/NAS/UE/nas_user.c | 22 +- openair3/NAS/UE/nas_user.h | 2 +- openair3/NGAP/ngap_common.h | 7 - openair3/S1AP/s1ap_common.h | 7 - openair3/S1AP/s1ap_eNB_trace.c | 2 +- openair3/SCTP/sctp_eNB_task.c | 6 +- openair3/UTILS/conversions.h | 18 +- openair3/ocp-gtpu/gtp_itf.cpp | 394 +- openair3/ocp-gtpu/gtp_itf.h | 65 +- rxsigF0.m | 57345 +++++++++++++++ targets/ARCH/COMMON/common_lib.h | 5 +- targets/ARCH/IRIS/USERSPACE/LIB/iris_lib.cpp | 2 +- targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp | 51 +- targets/ARCH/iqplayer/iqplayer_lib.c | 2 +- targets/ARCH/rfsimulator/README.md | 18 +- targets/ARCH/rfsimulator/simulator.c | 21 +- targets/ARCH/rfsimulator/stored_node.c | 2 +- .../GENERIC-LTE-EPC/CONF/benetel-5g.conf | 1 - .../CONF/gnb.band257.tm1.32PRB.usrpn300.conf | 1 - .../CONF/gnb.band257.tm1.32PRB.usrpx300.conf | 1 - .../CONF/gnb.band257.tm1.66PRB.usrpn300.conf | 2 - .../CONF/gnb.band261.tm1.32PRB.usrpn300.conf | 1 - .../CONF/gnb.band66.tm1.106PRB.usrpn300.conf | 1 - .../CONF/gnb.band66.tm1.106PRB.usrpx300.conf | 2 - .../CONF/gnb.band66.tm1.25PRB.usrpn300.conf | 263 + .../gnb.band78.106PRB.30kHz,usrpb2x0.conf | 1 - .../CONF/gnb.band78.106PRB.slave.conf | 1 - .../CONF/gnb.band78.slave.conf | 2 - .../gnb.band78.tm1.106PRB.PTRS.usrpx300.conf | 2 - .../CONF/gnb.band78.tm1.106PRB.usrpb210.conf | 2 - .../CONF/gnb.band78.tm1.106PRB.usrpn300.conf | 13 +- .../CONF/gnb.band78.tm1.106PRB.usrpx300.conf | 2 - .../CONF/gnb.band78.tm1.217PRB.usrpn300.conf | 2 - .../CONF/gnb.band78.tm1.217PRB.usrpx300.conf | 1 - .../CONF/gnb.band78.tm1.24PRB.usrpb210.conf | 1 - .../CONF/gnb.band78.tm1.24PRB.usrpn300.conf | 1 - .../CONF/gnb.band78.tm1.24PRB.usrpx300.conf | 1 - .../CONF/gnb.band78.tm1.273PRB.usrpn300.conf | 1 - .../CONF/rcc.band78.tm1.106PRB.nfapi.conf | 1 - .../GENERIC-LTE-EPC/CONF/testing_gnb.conf | 2 - .../CONF/testing_gnb_24PRB.conf | 2 - .../CONF/testing_gnb_n310.conf | 2 - .../CONF/testing_gnb_nsa_n310.conf | 1 - .../PROJECTS/GENERIC-NR-5GC/CONF/cu_gnb.conf | 1 - .../PROJECTS/GENERIC-NR-5GC/CONF/du_gnb.conf | 1 - ...b.band78.tm1.106PRB.usrpn300.gtp-itti.conf | 1 - .../gnb.sa.band41.fr1.106PRB.usrpb210.conf | 63 +- .../gnb.sa.band66.fr1.106PRB.usrpn300.conf | 3 - ...gnb.sa.band78.fr1.106PRB.2x2.usrpn300.conf | 63 +- ....sa.band78.fr1.106PRB.usrpb210.4layer.conf | 297 + .../gnb.sa.band78.fr1.106PRB.usrpb210.conf | 64 +- ...b.sa.band78.fr1.106PRB.usrpb210.sabox.conf | 1 - ...gnb.sa.band78.fr1.162PRB.2x2.usrpn300.conf | 49 +- ...gnb.sa.band78.fr1.217PRB.2x2.usrpn300.conf | 320 + .../gnb.sa.band78.fr1.24PRB.usrpb210.conf | 3 - ...gnb.sa.band78.fr1.273PRB.2x2.usrpn300.conf | 320 + .../GENERIC-NR-5GC/CONF/ue_nr_prs.conf | 14 +- targets/RT/USER/lte-enb.c | 6 +- targets/RT/USER/lte-ru.c | 15 +- targets/RT/USER/lte-softmodem.h | 17 +- targets/RT/USER/lte-uesoftmodem.c | 7 +- targets/TEST/PDCP/test_pdcp.c | 66 +- targets/TEST/PDCP/test_pdcp.h | 14 +- targets/TEST/PDCP/with_rlc/test_pdcp_rlc.c | 12 +- txsig0.m | 61441 ++++++++++++++++ 583 files changed, 156401 insertions(+), 16331 deletions(-) create mode 100644 ci-scripts/conf_files/gnb.sa.band78.fr1.106PRB.usrpb210.conf create mode 100644 ci-scripts/docker/Dockerfile.formatting.bionic create mode 100644 ci-scripts/xml_files/container_5g_l2sim_proxy.xml create mode 100644 ci-scripts/xml_files/container_sa_b200_quectel.xml create mode 100644 ci-scripts/xml_files/container_sa_b200_terminate.xml create mode 100644 ci-scripts/xml_files/formatting_check.xml create mode 100644 ci-scripts/xml_files/fr1_5gc_closure.xml create mode 100644 ci-scripts/xml_files/fr1_5gc_start.xml create mode 100644 ci-scripts/yaml_files/sa_b200_gnb/docker-compose.yml create mode 100644 doc/NR_SA_CN5G_gNB_B210_COTS_UE_Tutorial.md create mode 100644 doc/NR_SA_CN5G_gNB_N300_COTS_UE_Tutorial.md create mode 100644 doc/RUN_NR_multiple_BWPs.md create mode 100644 doc/UL_MIMO.txt create mode 100644 doc/images/mimo_antenna_ports.png create mode 100644 doc/testbenches_doc_resources/4g-faraday-bench.pdf create mode 100644 doc/testbenches_doc_resources/4g-faraday-bench.png create mode 100644 doc/testbenches_doc_resources/4g-faraday-bench.tex create mode 100644 doc/testbenches_doc_resources/5g-nsa-faraday-bench.pdf create mode 100644 doc/testbenches_doc_resources/5g-nsa-faraday-bench.png create mode 100644 doc/testbenches_doc_resources/5g-nsa-faraday-bench.tex create mode 100644 doc/testbenches_doc_resources/5g-ota-bench.pdf create mode 100644 doc/testbenches_doc_resources/5g-ota-bench.png create mode 100644 doc/testbenches_doc_resources/5g-ota-bench.tex create mode 100644 doc/testbenches_doc_resources/antenna.pdf create mode 100644 doc/testbenches_doc_resources/b200-mini.png create mode 100644 doc/testbenches_doc_resources/b210.jpg delete mode 100755 doc/testbenches_doc_resources/indoor_live.jpg delete mode 100755 doc/testbenches_doc_resources/legacy1.jpg delete mode 100755 doc/testbenches_doc_resources/legacy2.jpg create mode 100644 doc/testbenches_doc_resources/n310.png delete mode 100755 doc/testbenches_doc_resources/next_ci.jpg delete mode 100755 doc/testbenches_doc_resources/next_dev.jpg delete mode 100755 doc/testbenches_doc_resources/outdoor_live.jpg create mode 100644 doc/testbenches_doc_resources/phone.pdf create mode 100644 doc/testbenches_doc_resources/quectel.png create mode 100644 doc/testbenches_doc_resources/server.pdf create mode 100644 doc/testbenches_doc_resources/x310.jpg create mode 100644 doc/tutorial_resources/docker-compose-basic-nrf.yaml create mode 100644 doc/tutorial_resources/oai_db.sql create mode 100644 ldpctest_BG_1_Zc_384_rate_1-3_block_length_8448_maxit_5.txt delete mode 100644 openair1/PHY/CODING/nrLDPC_decoder/doc/nrLDPC/logo.png delete mode 100644 openair1/PHY/CODING/nrLDPC_decoder/doc/nrLDPC/nrLDPC.pdf delete mode 100644 openair1/PHY/CODING/nrLDPC_decoder/doc/nrLDPC/nrLDPC.tex delete mode 100644 openair1/PHY/CODING/nrLDPC_decoder/doc/nrLDPC/references.bib delete mode 100644 openair1/PHY/CODING/nrLDPC_decoder/doc/nrLDPC_doxyCfg create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_cnProc_avx512.h create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_init_mem.h create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/CMakeLists.txt create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/CMakeLists.txt create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProcPc_gen_BG1_avx2.c create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProcPc_gen_BG2_avx2.c create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProc_gen_BG1_avx2.c create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProc_gen_BG2_avx2.c create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/main.c create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/CMakeLists.txt create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/bnProcPc_gen_BG1_avx512.c create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/bnProcPc_gen_BG2_avx512.c create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/bnProc_gen_BG1_avx512.c create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/bnProc_gen_BG2_avx512.c create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/main.c create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc/CMakeLists.txt create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc/cnProc_gen_BG1_avx2.c create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc/cnProc_gen_BG2_avx2.c create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc/main.c create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/CMakeLists.txt create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/cnProc_gen_BG1_avx512.c create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/cnProc_gen_BG2_avx512.c create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/main.c create mode 100755 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/run_ldpc_generators.sh create mode 100644 openair1/PHY/NR_TRANSPORT/dlsch_pdu_rel15.time_alloc_list_flag create mode 100644 openair1/PHY/NR_TRANSPORT/dlsch_pdu_rel15.time_allocation_type create mode 100644 openair1/PHY/NR_UE_TRANSPORT/csi_rx.c create mode 100644 openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeCache.txt create mode 100644 openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CMakeCCompiler.cmake create mode 100644 openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CMakeCXXCompiler.cmake create mode 100755 openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CMakeDetermineCompilerABI_C.bin create mode 100755 openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CMakeDetermineCompilerABI_CXX.bin create mode 100644 openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CMakeSystem.cmake create mode 100644 openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CompilerIdC/CMakeCCompilerId.c create mode 100755 openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CompilerIdC/a.out create mode 100644 openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CompilerIdCXX/CMakeCXXCompilerId.cpp create mode 100755 openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/2.8.12.2/CompilerIdCXX/a.out create mode 100644 openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/CMakeOutput.log create mode 100644 openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeFiles/cmake.check_cache create mode 100644 openair1/SIMULATION/NR_UE_PHY/unit_tests/build/testlogs/frame_config_test.txt create mode 100644 openair1/SIMULATION/NR_UE_PHY/unit_tests/build/testlogs/harq_test.txt create mode 100644 openair1/SIMULATION/NR_UE_PHY/unit_tests/build/testlogs/pbch_test.txt create mode 100644 openair1/SIMULATION/NR_UE_PHY/unit_tests/build/testlogs/pss_test.txt create mode 100644 openair1/SIMULATION/NR_UE_PHY/unit_tests/build/testlogs/pucch_uci_test.txt create mode 100644 openair1/SIMULATION/NR_UE_PHY/unit_tests/build/testlogs/srs_test.txt create mode 100644 openair1/SIMULATION/NR_UE_PHY/unit_tests/build/testlogs/sss_test.txt mode change 100755 => 100644 openair2/LAYER2/NR_MAC_UE/nr_l1_helpers.h create mode 100644 openair2/LAYER2/nr_pdcp/nr_pdcp_integrity_nia1.c create mode 100644 openair2/LAYER2/nr_pdcp/nr_pdcp_integrity_nia1.h create mode 100644 openair2/NR_UE_PHY_INTERFACE/NR_Packet_Drop.c create mode 100644 openair2/NR_UE_PHY_INTERFACE/NR_Packet_Drop.h create mode 100644 rxsigF0.m create mode 100644 targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.25PRB.usrpn300.conf create mode 100644 targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.4layer.conf create mode 100644 targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.217PRB.2x2.usrpn300.conf create mode 100644 targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.2x2.usrpn300.conf create mode 100644 txsig0.m diff --git a/ci-scripts/Jenkinsfile-GitLab-Container b/ci-scripts/Jenkinsfile-GitLab-Container index c22e6fabec..b37c9d4f4b 100644 --- a/ci-scripts/Jenkinsfile-GitLab-Container +++ b/ci-scripts/Jenkinsfile-GitLab-Container @@ -278,6 +278,26 @@ pipeline { } } } + stage ("SA B200 Sanity Check") { + when { expression {doMandatoryTests} } + steps { + script { + triggerSlaveJob ('RAN-SA-B200-Module-SABOX-Container', 'Test-SA-B200') + } + } + post { + always { + script { + finalizeSlaveJob('RAN-SA-B200-Module-SABOX-Container') + } + } + failure { + script { + currentBuild.result = 'FAILURE' + } + } + } + } stage ("Test OAI NR UE - OAI gNB - TDD - Band 78 - N300") { when { expression {doMandatoryTests} } steps { diff --git a/ci-scripts/Jenkinsfile-push-registry b/ci-scripts/Jenkinsfile-push-registry index bc1a80ba61..feb1807c91 100644 --- a/ci-scripts/Jenkinsfile-push-registry +++ b/ci-scripts/Jenkinsfile-push-registry @@ -66,7 +66,7 @@ pipeline { withCredentials([ [$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.DH_Credentials}", usernameVariable: 'DH_Username', passwordVariable: 'DH_Password'] ]) { - def listOfImages = ["oai-enb", "oai-gnb", "oai-lte-ue", "oai-nr-ue"] + def listOfImages = ["oai-enb", "oai-gnb", "oai-lte-ue", "oai-nr-ue", "proxy"] sh "docker login -u ${DH_Username} -p ${DH_Password} > /dev/null 2>&1" listOfImages.eachWithIndex { item, iindex -> sh "docker image tag ${item}:develop ${DH_Account}/${item}:develop" diff --git a/ci-scripts/Jenkinsfile-tmp-multi-enb b/ci-scripts/Jenkinsfile-tmp-multi-enb index c3b825ec06..fb52316920 100644 --- a/ci-scripts/Jenkinsfile-tmp-multi-enb +++ b/ci-scripts/Jenkinsfile-tmp-multi-enb @@ -36,6 +36,9 @@ def testStageName = params.pipelineTestStageName // Name of the phone resource def ciSmartPhoneResource = params.smartphonesResource +// Name of the phone resource +def ciEpcResource = params.epcResource + // Global Parameters. Normally they should be populated when the master job // triggers the slave job with parameters def eNB_Repository @@ -51,7 +54,7 @@ pipeline { options { disableConcurrentBuilds() ansiColor('xterm') - lock (ciSmartPhoneResource) + lock(extra: [[resource: ciEpcResource]], resource: ciSmartPhoneResource) } stages { stage ("Verify Parameters") { @@ -216,6 +219,76 @@ pipeline { } } } + stage ("Terminate") { + parallel { + stage('Terminate UE') { + // Bypassing this stage if there are no abd server defined + when { + expression { params.ADB_IPAddress != "none" } + } + steps { + echo '\u2705 \u001B[32mTerminate UE\u001B[0m' + withCredentials([ + [$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.ADB_Credentials}", usernameVariable: 'ADB_Username', passwordVariable: 'ADB_Password'] + ]) { + sh "python3 ci-scripts/main.py --mode=TerminateUE --ADBIPAddress=${params.ADB_IPAddress} --ADBUserName=${ADB_Username} --ADBPassword=${ADB_Password}" + } + } + } + stage('Terminate eNB') { + steps { + echo '\u2705 \u001B[32mTerminate eNB\u001B[0m' + withCredentials([ + [$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.eNB_Credentials}", usernameVariable: 'eNB_Username', passwordVariable: 'eNB_Password'] + ]) { + sh "python3 ci-scripts/main.py --mode=TerminateeNB --eNBIPAddress=${params.eNB_IPAddress} --eNBUserName=${eNB_Username} --eNBPassword=${eNB_Password}" + } + } + } + stage('Terminate SPGW') { + // Bypassing this stage if EPC server is not defined + when { + expression { params.EPC_IPAddress != "none" } + } + steps { + echo '\u2705 \u001B[32mTerminate SPGW\u001B[0m' + withCredentials([ + [$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password'] + ]) { + sh "python3 ci-scripts/main.py --mode=TerminateSPGW --EPCIPAddress=${params.EPC_IPAddress} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCType=${params.EPC_Type} --EPCSourceCodePath=${params.EPC_SourceCodePath}" + } + } + } + stage('Terminate MME') { + // Bypassing this stage if EPC server is not defined + when { + expression { params.EPC_IPAddress != "none" } + } + steps { + echo '\u2705 \u001B[32mTerminate MME\u001B[0m' + withCredentials([ + [$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password'] + ]) { + sh "python3 ci-scripts/main.py --mode=TerminateMME --EPCIPAddress=${params.EPC_IPAddress} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCType=${params.EPC_Type} --EPCSourceCodePath=${params.EPC_SourceCodePath}" + } + } + } + stage('Terminate HSS') { + // Bypassing this stage if EPC server is not defined + when { + expression { params.EPC_IPAddress != "none" } + } + steps { + echo '\u2705 \u001B[32mTerminate HSS\u001B[0m' + withCredentials([ + [$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password'] + ]) { + sh "python3 ci-scripts/main.py --mode=TerminateHSS --EPCIPAddress=${params.EPC_IPAddress} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCType=${params.EPC_Type} --EPCSourceCodePath=${params.EPC_SourceCodePath}" + } + } + } + } + } stage('Log Collection') { parallel { stage('Log Collection (eNB - Build)') { @@ -242,7 +315,7 @@ pipeline { [$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.eNB_Credentials}", usernameVariable: 'eNB_Username', passwordVariable: 'eNB_Password'] ]) { echo '\u2705 \u001B[32mLog Collection (eNB - Run)\u001B[0m' - sh "python3 ci-scripts/main.py --mode=LogCollecteNB --eNBIPAddress=${params.eNB_IPAddress} --eNBUserName=${eNB_Username} --eNBPassword=${eNB_Password} --eNBSourceCodePath=${params.eNB_SourceCodePath}" + sh "python3 ci-scripts/main.py --mode=LogCollecteNB --eNBIPAddress=${params.eNB_IPAddress} --eNBUserName=${eNB_Username} --eNBPassword=${eNB_Password} --eNBSourceCodePath=${params.eNB_SourceCodePath} --BuildId=${env.BUILD_ID}" echo '\u2705 \u001B[32mLog Transfer (eNB - Run)\u001B[0m' sh "sshpass -p \'${eNB_Password}\' scp -o 'StrictHostKeyChecking no' -o 'ConnectTimeout 10' ${eNB_Username}@${params.eNB_IPAddress}:${eNB_SourceCodePath}/cmake_targets/enb.log.zip ./enb.log.${env.BUILD_ID}.zip || true" @@ -259,6 +332,116 @@ pipeline { } } } + stage('Log Collection (SPGW)') { + // Bypassing this stage if EPC server is not defined + when { + expression { params.EPC_IPAddress != "none" } + } + steps { + withCredentials([ + [$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password'] + ]) { + echo '\u2705 \u001B[32mLog Collection (SPGW)\u001B[0m' + sh "python3 ci-scripts/main.py --mode=LogCollectSPGW --EPCIPAddress=${params.EPC_IPAddress} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCSourceCodePath=${params.EPC_SourceCodePath} --EPCType=${params.EPC_Type}" + + echo '\u2705 \u001B[32mLog Transfer (SPGW)\u001B[0m' + sh "sshpass -p \'${EPC_Password}\' scp -o 'StrictHostKeyChecking no' -o 'ConnectTimeout 10' ${EPC_Username}@${params.EPC_IPAddress}:${EPC_SourceCodePath}/scripts/spgw.log.zip ./spgw.log.${env.BUILD_ID}.zip || true" + } + script { + if(fileExists("spgw.log.${env.BUILD_ID}.zip")) { + archiveArtifacts "spgw.log.${env.BUILD_ID}.zip" + } + } + } + } + stage('Log Collection (MME)') { + // Bypassing this stage if EPC server is not defined + when { + expression { params.EPC_IPAddress != "none" } + } + steps { + withCredentials([ + [$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password'] + ]) { + echo '\u2705 \u001B[32mLog Collection (MME)\u001B[0m' + sh "python3 ci-scripts/main.py --mode=LogCollectMME --EPCIPAddress=${params.EPC_IPAddress} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCSourceCodePath=${params.EPC_SourceCodePath} --EPCType=${params.EPC_Type}" + + echo '\u2705 \u001B[32mLog Transfer (MME)\u001B[0m' + sh "sshpass -p \'${EPC_Password}\' scp -o 'StrictHostKeyChecking no' -o 'ConnectTimeout 10' ${EPC_Username}@${params.EPC_IPAddress}:${EPC_SourceCodePath}/scripts/mme.log.zip ./mme.log.${env.BUILD_ID}.zip || true" + } + script { + if(fileExists("mme.log.${env.BUILD_ID}.zip")) { + archiveArtifacts "mme.log.${env.BUILD_ID}.zip" + } + } + } + } + stage('Log Collection (HSS)') { + // Bypassing this stage if EPC server is not defined + when { + expression { params.EPC_IPAddress != "none" } + } + steps { + withCredentials([ + [$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password'] + ]) { + echo '\u2705 \u001B[32mLog Collection (HSS)\u001B[0m' + sh "python3 ci-scripts/main.py --mode=LogCollectHSS --EPCIPAddress=${params.EPC_IPAddress} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCSourceCodePath=${params.EPC_SourceCodePath} --EPCType=${params.EPC_Type}" + + echo '\u2705 \u001B[32mLog Transfer (HSS)\u001B[0m' + sh "sshpass -p \'${EPC_Password}\' scp -o 'StrictHostKeyChecking no' -o 'ConnectTimeout 10' ${EPC_Username}@${params.EPC_IPAddress}:${EPC_SourceCodePath}/scripts/hss.log.zip ./hss.log.${env.BUILD_ID}.zip || true" + } + script { + if(fileExists("hss.log.${env.BUILD_ID}.zip")) { + archiveArtifacts "hss.log.${env.BUILD_ID}.zip" + } + } + } + } + stage('Log Collection (Ping)') { + // Bypassing this stage if EPC server is not defined + when { + expression { params.EPC_IPAddress != "none" } + } + steps { + withCredentials([ + [$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password'] + ]) { + echo '\u2705 \u001B[32mLog Collection (Ping)\u001B[0m' + sh "python3 ci-scripts/main.py --mode=LogCollectPing --EPCIPAddress=${params.EPC_IPAddress} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCSourceCodePath=${params.EPC_SourceCodePath} --EPCType=${params.EPC_Type}" + + echo '\u2705 \u001B[32mLog Transfer (Ping)\u001B[0m' + sh "sshpass -p \'${EPC_Password}\' scp -o 'StrictHostKeyChecking no' -o 'ConnectTimeout 10' ${EPC_Username}@${params.EPC_IPAddress}:${EPC_SourceCodePath}/scripts/ping.log.zip ./ping.log.${env.BUILD_ID}.zip || true" + } + script { + if(fileExists("ping.log.${env.BUILD_ID}.zip")) { + archiveArtifacts "ping.log.${env.BUILD_ID}.zip" + } + } + } + } + stage('Log Collection (Iperf)') { + // Bypassing this stage if EPC server is not defined + when { + expression { params.EPC_IPAddress != "none" } + } + steps { + withCredentials([ + [$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password'] + ]) { + echo '\u2705 \u001B[32mLog Collection (Iperf)\u001B[0m' + sh "python3 ci-scripts/main.py --mode=LogCollectIperf --EPCIPAddress=${params.EPC_IPAddress} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCSourceCodePath=${params.EPC_SourceCodePath} --EPCType=${params.EPC_Type}" + + echo '\u2705 \u001B[32mLog Transfer (Iperf)\u001B[0m' + sh "sshpass -p \'${EPC_Password}\' scp -o 'StrictHostKeyChecking no' -o 'ConnectTimeout 10' ${EPC_Username}@${params.EPC_IPAddress}:${EPC_SourceCodePath}/scripts/iperf.log.zip ./iperf.log.${env.BUILD_ID}.zip || true" + } + script { + if(fileExists("iperf.log.${env.BUILD_ID}.zip")) { + archiveArtifacts "iperf.log.${env.BUILD_ID}.zip" + } + } + } + } } } } diff --git a/ci-scripts/Jenkinsfile-trig-nsa b/ci-scripts/Jenkinsfile-trig-nsa index 772b34231a..8e81b75e58 100644 --- a/ci-scripts/Jenkinsfile-trig-nsa +++ b/ci-scripts/Jenkinsfile-trig-nsa @@ -20,6 +20,9 @@ * contact@openairinterface.org */ +// necessary for reading JSON +import groovy.json.JsonSlurper + // Template Jenkins Declarative Pipeline script to run Test w/ RF HW // Location of the python executor node shall be in the same subnet as the others servers @@ -37,12 +40,12 @@ pipeline { stages { stage ("Launcher") { steps { - script { - //retrieve MR that are opened nd with tag NSA - MR_LIST= sh returnStdout: true, script: 'curl --silent "https://gitlab.eurecom.fr/api/v4/projects/oai%2Fopenairinterface5g/merge_requests?state=opened&per_page=100&labels=NSA" | jq ".[].iid" || true ' - echo "List of selected MR:\n${MR_LIST}" - def MR_ARRAY = MR_LIST.split('\n') - //for every selected MR, retrieve the branch name and the latest commit + script { + // retrieve MR that are opened nd with tag NSA + MR_LIST = sh returnStdout: true, script: 'curl --silent "https://gitlab.eurecom.fr/api/v4/projects/oai%2Fopenairinterface5g/merge_requests?state=opened&per_page=100&labels=NSA" | jq -cj "[.[].iid]"' + echo "List of selected MRs: ${MR_LIST.trim()}" + def MR_ARRAY = new JsonSlurper().parseText(MR_LIST.trim()) + // for every selected MR, retrieve the branch name and the latest commit for (MR in MR_ARRAY) { SRC_BRANCH=sh returnStdout: true, script: """curl --silent "https://gitlab.eurecom.fr/api/v4/projects/oai%2Fopenairinterface5g/merge_requests/${MR}" | jq ".source_branch" || true """ SRC_BRANCH=SRC_BRANCH.trim() @@ -113,6 +116,21 @@ pipeline { GitPostArgs += jobName + ' ' + build_url + ' ' + build_id + ' ' + jobResult + ' ' echo GitPostArgs + //calling SA-AmariS + jobName = "RAN-SA-AmariS-CN5G" + jobStatus = build job: jobName, wait : true, propagate : false, parameters: [ + string(name: 'eNB_MR', value: String.valueOf(MR)), + string(name: 'eNB_Branch', value: String.valueOf(SRC_BRANCH)), + string(name: 'eNB_CommitID', value: String.valueOf(COMMIT_ID)), + string(name: 'eNB_TargetBranch', value: String.valueOf(TARGET_BRANCH)), + booleanParam(name: 'eNB_mergeRequest', value: Boolean.valueOf(ALLOW_MERGE)) + ] + jobResult = jobStatus.getResult() + build_url = jobStatus.getAbsoluteUrl() + build_id = jobStatus.getNumber().toString() + GitPostArgs += jobName + ' ' + build_url + ' ' + build_id + ' ' + jobResult + ' ' + echo GitPostArgs + //calling OAIUE N310-X300 jobName = "RAN-SA-OAIUE-N310-X300-CN5G" jobStatus = build job: jobName, wait : true, propagate : false, parameters: [ diff --git a/ci-scripts/checkCodingFormattingRules.sh b/ci-scripts/checkCodingFormattingRules.sh index a805f765df..c29941cade 100755 --- a/ci-scripts/checkCodingFormattingRules.sh +++ b/ci-scripts/checkCodingFormattingRules.sh @@ -59,7 +59,7 @@ if [ $# -eq 0 ] then echo " ---- Checking the whole repository ----" echo "" - NB_FILES_TO_FORMAT=`astyle --dry-run --options=ci-scripts/astyle-options.txt --recursive *.c *.h | grep -c Formatted || true` + NB_FILES_TO_FORMAT=`astyle --dry-run --options=ci-scripts/astyle-options.txt --recursive --exclude=ci-scripts --exclude=cmake_targets *.c *.h | grep -c Formatted || true` echo "Nb Files that do NOT follow OAI rules: $NB_FILES_TO_FORMAT" echo $NB_FILES_TO_FORMAT > ./oai_rules_result.txt @@ -136,7 +136,7 @@ fi # Merge request scenario MERGE_COMMMIT=`git log -n1 --pretty=format:%H` -TARGET_INIT_COMMIT=`cat .git/refs/remotes/origin/$TARGET_BRANCH` +TARGET_INIT_COMMIT=`git log -n1 --pretty=format:%H origin/$TARGET_BRANCH` echo " ---- Checking the modified files by the merge request ----" echo "" diff --git a/ci-scripts/ci_ueinfra.yaml b/ci-scripts/ci_ueinfra.yaml index b888f6bb59..76ebaf0f97 100644 --- a/ci-scripts/ci_ueinfra.yaml +++ b/ci-scripts/ci_ueinfra.yaml @@ -50,12 +50,12 @@ amarisoft_ue_1: WakeupScript : none DetachScript : none #end - Cmd : /root/NV17-12-21/ue/lteue + Cmd : /root/NV18-06-2022/ue/lteue Config : /root/NV17-12-21/ue/config/oaicicd-ue-Ping-SATest.cfg Duration : 60 Ping : /tmp/test_ue1.log UELog : /tmp/ue1.log - HostIPAddress : 192.168.18.89 + HostIPAddress : 172.21.16.144 HostUsername : root HostPassword : toor HostSourceCodePath : /tmp @@ -71,7 +71,7 @@ amarisoft_ue_2: WakeupScript : none DetachScript : none #end - Cmd : /root/NV17-12-21/ue/lteue + Cmd : /root/NV18-06-2022/ue/lteue Config : /root/NV17-12-21/ue/config/xxxxxxx.cfg #to be updated for an other scenario Duration : 60 Ping : diff --git a/ci-scripts/cls_containerize.py b/ci-scripts/cls_containerize.py index 259db7bffe..8f992689e2 100644 --- a/ci-scripts/cls_containerize.py +++ b/ci-scripts/cls_containerize.py @@ -74,6 +74,7 @@ class Containerize(): self.eNB2SourceCodePath = '' self.forcedWorkspaceCleanup = False self.imageKind = '' + self.proxyCommit = None self.eNB_instance = 0 self.eNB_serverId = ['', '', ''] self.yamlPath = ['', '', ''] @@ -421,6 +422,124 @@ class Containerize(): HTML.CreateHtmlTabFooter(False) sys.exit(1) + def BuildProxy(self, HTML): + if self.ranRepository == '' or self.ranBranch == '' or self.ranCommitID == '': + HELP.GenericHelp(CONST.Version) + sys.exit('Insufficient Parameter') + if self.eNB_serverId[self.eNB_instance] == '0': + lIpAddr = self.eNBIPAddress + lUserName = self.eNBUserName + lPassWord = self.eNBPassword + lSourcePath = self.eNBSourceCodePath + elif self.eNB_serverId[self.eNB_instance] == '1': + lIpAddr = self.eNB1IPAddress + lUserName = self.eNB1UserName + lPassWord = self.eNB1Password + lSourcePath = self.eNB1SourceCodePath + elif self.eNB_serverId[self.eNB_instance] == '2': + lIpAddr = self.eNB2IPAddress + lUserName = self.eNB2UserName + lPassWord = self.eNB2Password + lSourcePath = self.eNB2SourceCodePath + if lIpAddr == '' or lUserName == '' or lPassWord == '' or lSourcePath == '': + HELP.GenericHelp(CONST.Version) + sys.exit('Insufficient Parameter') + if self.proxyCommit is None: + HELP.GenericHelp(CONST.Version) + sys.exit('Insufficient Parameter (need proxyCommit for proxy build)') + logging.debug('Building on server: ' + lIpAddr) + mySSH = SSH.SSHConnection() + mySSH.open(lIpAddr, lUserName, lPassWord) + + # Check that we are on Ubuntu + mySSH.command('hostnamectl', '\$', 5) + result = re.search('Ubuntu', mySSH.getBefore()) + self.host = result.group(0) + if self.host != 'Ubuntu': + logging.error('\u001B[1m Can build proxy only on Ubuntu server\u001B[0m') + mySSH.close() + sys.exit(1) + + self.cli = 'docker' + self.cliBuildOptions = '--no-cache' + + # Workaround for some servers, we need to erase completely the workspace + if self.forcedWorkspaceCleanup: + mySSH.command('echo ' + lPassWord + ' | sudo -S rm -Rf ' + lSourcePath, '\$', 15) + + oldRanCommidID = self.ranCommitID + oldRanRepository = self.ranRepository + oldRanAllowMerge = self.ranAllowMerge + self.ranCommitID = self.proxyCommit + self.ranRepository = 'https://github.com/EpiSci/oai-lte-5g-multi-ue-proxy.git' + self.ranAllowMerge = False + self._createWorkspace(mySSH, lPassWord, lSourcePath) + # to prevent accidentally overwriting data that might be used later + self.ranCommitID = oldRanCommidID + self.ranRepository = oldRanRepository + self.ranAllowMerge = oldRanAllowMerge + + # Let's remove any previous run artifacts if still there + mySSH.command(self.cli + ' image prune --force', '\$', 30) + # Remove any previous proxy image + mySSH.command(self.cli + ' image rm oai-lte-multi-ue-proxy:latest || true', '\$', 30) + + tag = self.proxyCommit + logging.debug('building L2sim proxy image for tag ' + tag) + # check if the corresponding proxy image with tag exists. If not, build it + mySSH.command(self.cli + ' image inspect --format=\'Size = {{.Size}} bytes\' proxy:' + tag, '\$', 5) + buildProxy = mySSH.getBefore().count('o such image') != 0 + if buildProxy: + mySSH.command(self.cli + ' build ' + self.cliBuildOptions + ' --target oai-lte-multi-ue-proxy --tag proxy:' + tag + ' --file docker/Dockerfile.ubuntu18.04 . > cmake_targets/log/proxy-build.log 2>&1', '\$', 180) + # Note: at this point, OAI images are flattened, but we cannot do this + # here, as the flatten script is not in the proxy repo + mySSH.command(self.cli + ' image inspect --format=\'Size = {{.Size}} bytes\' proxy:' + tag, '\$', 5) + if mySSH.getBefore().count('o such image') != 0: + logging.error('\u001B[1m Build of L2sim proxy failed\u001B[0m') + mySSH.close() + HTML.CreateHtmlTestRow('commit ' + tag, 'KO', CONST.ALL_PROCESSES_OK) + HTML.CreateHtmlTabFooter(False) + sys.exit(1) + else: + logging.debug('L2sim proxy image for tag ' + tag + ' already exists, skipping build') + + # retag the build images to that we pick it up later + mySSH.command('docker image tag proxy:' + tag + ' oai-lte-multi-ue-proxy:latest', '\$', 5) + + # no merge: is a push to develop, tag the image so we can push it to the registry + if not self.ranAllowMerge: + mySSH.command('docker image tag proxy:' + tag + ' proxy:develop', '\$', 5) + + # we assume that the host on which this is built will also run the proxy. The proxy + # currently requires the following command, and the docker-compose up mechanism of + # the CI does not allow to run arbitrary commands. Note that the following actually + # belongs to the deployment, not the build of the proxy... + logging.warning('the following command belongs to deployment, but no mechanism exists to exec it there!') + mySSH.command('sudo ifconfig lo: 127.0.0.2 netmask 255.0.0.0 up', '\$', 5) + + # Analyzing the logs + if buildProxy: + self.testCase_id = HTML.testCase_id + mySSH.command('cd ' + lSourcePath + '/cmake_targets', '\$', 5) + mySSH.command('mkdir -p proxy_build_log_' + self.testCase_id, '\$', 5) + mySSH.command('mv log/* ' + 'proxy_build_log_' + self.testCase_id, '\$', 5) + if (os.path.isfile('./proxy_build_log_' + self.testCase_id + '.zip')): + os.remove('./proxy_build_log_' + self.testCase_id + '.zip') + if (os.path.isdir('./proxy_build_log_' + self.testCase_id)): + shutil.rmtree('./proxy_build_log_' + self.testCase_id) + mySSH.command('zip -r -qq proxy_build_log_' + self.testCase_id + '.zip proxy_build_log_' + self.testCase_id, '\$', 5) + mySSH.copyin(lIpAddr, lUserName, lPassWord, lSourcePath + '/cmake_targets/build_log_' + self.testCase_id + '.zip', '.') + # don't delete such that we might recover the zips + #mySSH.command('rm -f build_log_' + self.testCase_id + '.zip','\$', 5) + + # Cleaning any created tmp volume + mySSH.command(self.cli + ' volume prune --force || true','\$', 15) + mySSH.close() + + logging.info('\u001B[1m Building L2sim Proxy Image Pass\u001B[0m') + HTML.CreateHtmlTestRow('commit ' + tag, 'OK', CONST.ALL_PROCESSES_OK) + HTML.CreateHtmlNextTabHeaderTestRow(self.collectInfo, self.allImagesSize) + def Copy_Image_to_Test_Server(self, HTML): imageTag = 'develop' if (self.ranAllowMerge): @@ -567,8 +686,10 @@ class Containerize(): if status: HTML.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK) else: + self.exitStatus = 1 HTML.CreateHtmlTestRow('N/A', 'KO', CONST.ALL_PROCESSES_OK) + def UndeployObject(self, HTML, RAN): if self.eNB_serverId[self.eNB_instance] == '0': lIpAddr = self.eNBIPAddress @@ -588,7 +709,7 @@ class Containerize(): if lIpAddr == '' or lUserName == '' or lPassWord == '' or lSourcePath == '': HELP.GenericHelp(CONST.Version) sys.exit('Insufficient Parameter') - logging.debug('\u001B[1m Deploying OAI Object on server: ' + lIpAddr + '\u001B[0m') + logging.debug('\u001B[1m Undeploying OAI Object from server: ' + lIpAddr + '\u001B[0m') mySSH = SSH.SSHConnection() mySSH.open(lIpAddr, lUserName, lPassWord) mySSH.command('cd ' + lSourcePath + '/' + self.yamlPath[self.eNB_instance], '\$', 5) diff --git a/ci-scripts/cls_physim.py b/ci-scripts/cls_physim.py index ecd8f63af1..0342333c06 100644 --- a/ci-scripts/cls_physim.py +++ b/ci-scripts/cls_physim.py @@ -168,7 +168,7 @@ class PhySim: mySSH.close() #check build status and update HTML object - lHTML = html.HTMLManagement() + lHTML = cls_oai_html.HTMLManagement() lHTML=self.__CheckBuild_PhySim(htmlObj,constObj) return lHTML @@ -186,6 +186,6 @@ class PhySim: mySSH.command(self.__workSpacePath+'ran_build/build/ldpctest ' + self.runargs + ' >> '+self.__runLogFile, '\$', 30) mySSH.close() #return updated HTML to main - lHTML = html.HTMLManagement() + lHTML = cls_oai_html.HTMLManagement() lHTML=self.__CheckResults_PhySim(htmlObj,constObj,testcase_id) return lHTML diff --git a/ci-scripts/cls_static_code_analysis.py b/ci-scripts/cls_static_code_analysis.py index d6796ad414..5b45b48ba6 100644 --- a/ci-scripts/cls_static_code_analysis.py +++ b/ci-scripts/cls_static_code_analysis.py @@ -37,6 +37,7 @@ import logging import os from pathlib import Path import time +from multiprocessing import Process, Lock, SimpleQueue #----------------------------------------------------------- # OAI Testing modules @@ -237,3 +238,205 @@ class StaticCodeAnalysis(): return 0 + def LicenceAndFormattingCheck(self, HTML): + if self.ranRepository == '' or self.ranBranch == '' or self.ranCommitID == '': + HELP.GenericHelp(CONST.Version) + sys.exit('Insufficient Parameter') + lIpAddr = self.eNBIPAddress + lUserName = self.eNBUserName + lPassWord = self.eNBPassword + lSourcePath = self.eNBSourceCodePath + + if lIpAddr == '' or lUserName == '' or lPassWord == '' or lSourcePath == '': + HELP.GenericHelp(CONST.Version) + sys.exit('Insufficient Parameter') + logging.debug('Building on server: ' + lIpAddr) + mySSH = SSH.SSHConnection() + mySSH.open(lIpAddr, lUserName, lPassWord) + + self.testCase_id = HTML.testCase_id + + # on RedHat/CentOS .git extension is mandatory + result = re.search('([a-zA-Z0-9\:\-\.\/])+\.git', self.ranRepository) + if result is not None: + full_ran_repo_name = self.ranRepository.replace('git/', 'git') + else: + full_ran_repo_name = self.ranRepository + '.git' + mySSH.command('mkdir -p ' + lSourcePath, '\$', 5) + mySSH.command('cd ' + lSourcePath, '\$', 5) + mySSH.command('if [ ! -e .git ]; then stdbuf -o0 git clone ' + full_ran_repo_name + ' .; else stdbuf -o0 git fetch --prune; fi', '\$', 600) + # Raphael: here add a check if git clone or git fetch went smoothly + mySSH.command('git config user.email "jenkins@openairinterface.org"', '\$', 5) + mySSH.command('git config user.name "OAI Jenkins"', '\$', 5) + + mySSH.command('echo ' + lPassWord + ' | sudo -S git clean -x -d -ff', '\$', 30) + mySSH.command('mkdir -p cmake_targets/log', '\$', 5) + # if the commit ID is provided use it to point to it + if self.ranCommitID != '': + mySSH.command('git checkout -f ' + self.ranCommitID, '\$', 30) + # if the branch is not develop, then it is a merge request and we need to do + # the potential merge. Note that merge conflicts should already been checked earlier + argToPass = '' + if (self.ranAllowMerge): + argToPass = '--build-arg MERGE_REQUEST=true --build-arg SRC_BRANCH=' + self.ranBranch + if self.ranTargetBranch == '': + if (self.ranBranch != 'develop') and (self.ranBranch != 'origin/develop'): + mySSH.command('git merge --ff origin/develop -m "Temporary merge for CI"', '\$', 5) + argToPass += ' --build-arg TARGET_BRANCH=develop ' + else: + logging.debug('Merging with the target branch: ' + self.ranTargetBranch) + mySSH.command('git merge --ff origin/' + self.ranTargetBranch + ' -m "Temporary merge for CI"', '\$', 5) + argToPass += ' --build-arg TARGET_BRANCH=' + self.ranTargetBranch + ' ' + + mySSH.command('docker image rm oai-formatting-check:latest || true', '\$', 60) + mySSH.command('docker build --target oai-formatting-check --tag oai-formatting-check:latest ' + argToPass + '--file ci-scripts/docker/Dockerfile.formatting.bionic . > cmake_targets/log/oai-formatting-check.txt 2>&1', '\$', 600) + + mySSH.command('docker image rm oai-formatting-check:latest || true', '\$', 60) + mySSH.command('docker image prune --force', '\$', 60) + mySSH.command('docker volume prune --force', '\$', 60) + + # Analyzing the logs + mySSH.command('cd ' + lSourcePath + '/cmake_targets', '\$', 5) + mySSH.command('mkdir -p build_log_' + self.testCase_id, '\$', 5) + mySSH.command('mv log/* ' + 'build_log_' + self.testCase_id, '\$', 5) + mySSH.close() + + mySSH.copyin(lIpAddr, lUserName, lPassWord, lSourcePath + '/cmake_targets/build_log_' + self.testCase_id + '/*', '.') + + finalStatus = 0 + if (os.path.isfile('./oai-formatting-check.txt')): + analyzed = False + nbFilesNotFormatted = 0 + listFiles = False + listFilesNotFormatted = [] + circularHeaderDependency = False + circularHeaderDependencyFiles = [] + gnuGplLicence = False + gnuGplLicenceFiles = [] + suspectLicence = False + suspectLicenceFiles = [] + with open('./oai-formatting-check.txt', 'r') as logfile: + for line in logfile: + ret = re.search('./ci-scripts/checkCodingFormattingRules.sh', str(line)) + if ret is not None: + analyzed = True + if analyzed: + ret = re.search('Nb Files that do NOT follow OAI rules: (?P[0-9\.]+)', str(line)) + if ret is not None: + nbFilesNotFormatted = int(ret.group('nb_errors')) + + if re.search('=== Files not properly formatted ===', str(line)) is not None: + listFiles = True + if listFiles: + if re.search('Removing intermediate container', str(line)) is not None: + listFiles = False + elif re.search('Running in|Files not properly formatted', str(line)) is not None: + pass + else: + listFilesNotFormatted.append(str(line).strip()) + + if re.search('=== Files with incorrect define protection ===', str(line)) is not None: + circularHeaderDependency = True + if circularHeaderDependency: + if re.search('Removing intermediate container', str(line)) is not None: + circularHeaderDependency = False + elif re.search('Running in|Files with incorrect define protection', str(line)) is not None: + pass + else: + circularHeaderDependencyFiles.append(str(line).strip()) + + if re.search('=== Files with a GNU GPL licence Banner ===', str(line)) is not None: + gnuGplLicence = True + if gnuGplLicence: + if re.search('Removing intermediate container', str(line)) is not None: + gnuGplLicence = False + elif re.search('Running in|Files with a GNU GPL licence Banner', str(line)) is not None: + pass + else: + gnuGplLicenceFiles.append(str(line).strip()) + + if re.search('=== Files with a suspect Banner ===', str(line)) is not None: + suspectLicence = True + if suspectLicence: + if re.search('Removing intermediate container', str(line)) is not None: + suspectLicence = False + elif re.search('Running in|Files with a suspect Banner', str(line)) is not None: + pass + else: + suspectLicenceFiles.append(str(line).strip()) + + logfile.close() + if analyzed: + logging.debug('files not formatted properly: ' + str(nbFilesNotFormatted)) + if nbFilesNotFormatted == 0: + HTML.CreateHtmlTestRow('File(s) Format', 'OK', CONST.ALL_PROCESSES_OK) + else: + html_queue = SimpleQueue() + html_cell = '
\n'
+					html_cell += 'Number of files not following OAI Rules: ' + str(nbFilesNotFormatted) + '\n'
+					for nFile in listFilesNotFormatted:
+						html_cell += str(nFile).strip() + '\n'
+					html_cell += '
' + html_queue.put(html_cell) + HTML.CreateHtmlTestRowQueue('File(s) Format', 'KO', 1, html_queue) + del(html_cell) + del(html_queue) + + logging.debug('header files not respecting the circular dependency protection: ' + str(len(circularHeaderDependencyFiles))) + if len(circularHeaderDependencyFiles) == 0: + HTML.CreateHtmlTestRow('Header Circular Dependency', 'OK', CONST.ALL_PROCESSES_OK) + else: + html_queue = SimpleQueue() + html_cell = '
\n'
+					html_cell += 'Number of files not respecting: ' + str(len(circularHeaderDependencyFiles)) + '\n'
+					for nFile in circularHeaderDependencyFiles:
+						html_cell += str(nFile).strip() + '\n'
+					html_cell += '
' + html_queue.put(html_cell) + HTML.CreateHtmlTestRowQueue('Header Circular Dependency', 'KO', 1, html_queue) + del(html_cell) + del(html_queue) + finalStatus = -1 + + logging.debug('files with a GNU GPL license: ' + str(len(gnuGplLicenceFiles))) + if len(gnuGplLicenceFiles) == 0: + HTML.CreateHtmlTestRow('Files w/ GNU GPL License', 'OK', CONST.ALL_PROCESSES_OK) + else: + html_queue = SimpleQueue() + html_cell = '
\n'
+					html_cell += 'Number of files not respecting: ' + str(len(gnuGplLicenceFiles)) + '\n'
+					for nFile in gnuGplLicenceFiles:
+						html_cell += str(nFile).strip() + '\n'
+					html_cell += '
' + html_queue.put(html_cell) + HTML.CreateHtmlTestRowQueue('Files w/ GNU GPL License', 'KO', 1, html_queue) + del(html_cell) + del(html_queue) + finalStatus = -1 + + logging.debug('files with a suspect license: ' + str(len(suspectLicenceFiles))) + if len(suspectLicenceFiles) == 0: + HTML.CreateHtmlTestRow('Files with suspect license', 'OK', CONST.ALL_PROCESSES_OK) + else: + html_queue = SimpleQueue() + html_cell = '
\n'
+					html_cell += 'Number of files not respecting: ' + str(len(suspectLicenceFiles)) + '\n'
+					for nFile in suspectLicenceFiles:
+						html_cell += str(nFile).strip() + '\n'
+					html_cell += '
' + html_queue.put(html_cell) + HTML.CreateHtmlTestRowQueue('Files with suspect license', 'KO', 1, html_queue) + del(html_cell) + del(html_queue) + finalStatus = -1 + + else: + finalStatus = -1 + HTML.htmleNBFailureMsg = 'Could not fully analyze oai-formatting-check.txt file' + HTML.CreateHtmlTestRow('N/A', 'KO', CONST.ENB_PROCESS_NOLOGFILE_TO_ANALYZE) + else: + finalStatus = -1 + HTML.htmleNBFailureMsg = 'Could not access oai-formatting-check.txt file' + HTML.CreateHtmlTestRow('N/A', 'KO', CONST.ENB_PROCESS_NOLOGFILE_TO_ANALYZE) + + return finalStatus diff --git a/ci-scripts/conf_files/benetel-5g.conf b/ci-scripts/conf_files/benetel-5g.conf index 8f3b03fddc..3b872e56e9 100644 --- a/ci-scripts/conf_files/benetel-5g.conf +++ b/ci-scripts/conf_files/benetel-5g.conf @@ -21,8 +21,6 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 31; //0; - servingCellConfigCommon = ( { #spCellConfigCommon diff --git a/ci-scripts/conf_files/episci/episci_gnb.band78.sa.fr1.106PRB.usrpn310.conf b/ci-scripts/conf_files/episci/episci_gnb.band78.sa.fr1.106PRB.usrpn310.conf index 51ffb1d5cd..a648db0efe 100644 --- a/ci-scripts/conf_files/episci/episci_gnb.band78.sa.fr1.106PRB.usrpn310.conf +++ b/ci-scripts/conf_files/episci/episci_gnb.band78.sa.fr1.106PRB.usrpn310.conf @@ -32,7 +32,6 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 0; min_rxtxtime = 6; pdcch_ConfigSIB1 = ( { diff --git a/ci-scripts/conf_files/episci/episci_rcc.band78.tm1.106PRB.nfapi.conf b/ci-scripts/conf_files/episci/episci_rcc.band78.tm1.106PRB.nfapi.conf index eac0b74633..0db6ac9036 100644 --- a/ci-scripts/conf_files/episci/episci_rcc.band78.tm1.106PRB.nfapi.conf +++ b/ci-scripts/conf_files/episci/episci_rcc.band78.tm1.106PRB.nfapi.conf @@ -21,7 +21,6 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 31; //0; min_rxtxtime = 6; pdcch_ConfigSIB1 = ( diff --git a/ci-scripts/conf_files/episci/proxy_gnb.band78.sa.fr1.106PRB.usrpn310.conf b/ci-scripts/conf_files/episci/proxy_gnb.band78.sa.fr1.106PRB.usrpn310.conf index f80ce3751a..84cb18d435 100644 --- a/ci-scripts/conf_files/episci/proxy_gnb.band78.sa.fr1.106PRB.usrpn310.conf +++ b/ci-scripts/conf_files/episci/proxy_gnb.band78.sa.fr1.106PRB.usrpn310.conf @@ -32,7 +32,6 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 0; min_rxtxtime = 6; pdcch_ConfigSIB1 = ( diff --git a/ci-scripts/conf_files/episci/proxy_rcc.band78.tm1.106PRB.nfapi.conf b/ci-scripts/conf_files/episci/proxy_rcc.band78.tm1.106PRB.nfapi.conf index f61039ff17..270ad75845 100644 --- a/ci-scripts/conf_files/episci/proxy_rcc.band78.tm1.106PRB.nfapi.conf +++ b/ci-scripts/conf_files/episci/proxy_rcc.band78.tm1.106PRB.nfapi.conf @@ -21,7 +21,6 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 0; min_rxtxtime = 6; servingCellConfigCommon = ( diff --git a/ci-scripts/conf_files/gNB_SA_CU.conf b/ci-scripts/conf_files/gNB_SA_CU.conf index 9d64ae1976..f6d3e8575a 100644 --- a/ci-scripts/conf_files/gNB_SA_CU.conf +++ b/ci-scripts/conf_files/gNB_SA_CU.conf @@ -44,7 +44,6 @@ gNBs = local_s_portd = 2152; remote_s_portc = 500; remote_s_portd = 2152; - ssb_SubcarrierOffset = 0; min_rxtxtime = 6; pdcch_ConfigSIB1 = ( diff --git a/ci-scripts/conf_files/gNB_SA_DU.conf b/ci-scripts/conf_files/gNB_SA_DU.conf index f95bdf91ae..4309c13dd3 100644 --- a/ci-scripts/conf_files/gNB_SA_DU.conf +++ b/ci-scripts/conf_files/gNB_SA_DU.conf @@ -36,7 +36,6 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 0; min_rxtxtime = 6; pdcch_ConfigSIB1 = ( 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 d6edc09286..49383072ed 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 @@ -37,8 +37,7 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 0; - pdsch_AntennaPorts_N1 = 2; + pdsch_AntennaPorts_XP = 2; pusch_AntennaPorts = 2; pdcch_ConfigSIB1 = ( 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 7f4b11c35d..610485fc92 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 @@ -38,8 +38,7 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 0; - pdsch_AntennaPorts_N1 = 2; + pdsch_AntennaPorts_XP = 2; pusch_AntennaPorts = 2; pdcch_ConfigSIB1 = ( diff --git a/ci-scripts/conf_files/gnb.band261.tm1.32PRB.usrpn300.conf b/ci-scripts/conf_files/gnb.band261.tm1.32PRB.usrpn300.conf index dcb3dd89b7..24ec8f17f8 100644 --- a/ci-scripts/conf_files/gnb.band261.tm1.32PRB.usrpn300.conf +++ b/ci-scripts/conf_files/gnb.band261.tm1.32PRB.usrpn300.conf @@ -21,7 +21,6 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 0; min_rxtxtime = 6; servingCellConfigCommon = ( diff --git a/ci-scripts/conf_files/gnb.band66.tm1.106PRB.usrpn300.conf b/ci-scripts/conf_files/gnb.band66.tm1.106PRB.usrpn300.conf index 1019ec75ad..b3c7d7d1da 100644 --- a/ci-scripts/conf_files/gnb.band66.tm1.106PRB.usrpn300.conf +++ b/ci-scripts/conf_files/gnb.band66.tm1.106PRB.usrpn300.conf @@ -21,7 +21,6 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 0; min_rxtxtime = 6; servingCellConfigCommon = ( 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 fa7c190538..c668601c06 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 @@ -19,8 +19,7 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 31; //0; - pdsch_AntennaPorts_N1 = 2; + pdsch_AntennaPorts_XP = 2; pusch_AntennaPorts = 2; ul_prbblacklist = "51,52,53,54" diff --git a/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.asue.conf b/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.asue.conf index 5e6b3fb217..92c3a7a2e9 100644 --- a/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.asue.conf +++ b/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.asue.conf @@ -41,7 +41,6 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 0; pusch_AntennaPorts = 2; ul_prbblacklist = "51,52,53,54" do_SRS = 1; 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 8489008300..672713d504 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 @@ -37,8 +37,7 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 0; - pdsch_AntennaPorts_N1 = 2; + pdsch_AntennaPorts_XP = 2; pusch_AntennaPorts = 2; ul_prbblacklist = "51,52,53,54" do_SRS = 1; diff --git a/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.ddsuu.2x2.usrpn310.conf b/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.ddsuu.2x2.usrpn310.conf index 18ca7b5d1e..5bd8b26e05 100644 --- a/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.ddsuu.2x2.usrpn310.conf +++ b/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.ddsuu.2x2.usrpn310.conf @@ -37,7 +37,6 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 0; pusch_AntennaPorts = 2; ul_prbblacklist = "51,52,53,54" do_SRS = 1; 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 9e1f499f03..e1264bd069 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 @@ -37,7 +37,6 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 0; #pusch_TargetSNRx10 = 200; #pucch_TargetSNRx10 = 200; ul_prbblacklist = "51,52,53,54" 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 ce63578dd3..f92242138c 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 @@ -37,8 +37,7 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 0; - pdsch_AntennaPorts_N1 = 2; + pdsch_AntennaPorts_XP = 2; pusch_AntennaPorts = 2; #pusch_TargetSNRx10 = 200; #pucch_TargetSNRx10 = 200; diff --git a/ci-scripts/conf_files/gnb.band78.tm1.106PRB.usrpn300.conf b/ci-scripts/conf_files/gnb.band78.tm1.106PRB.usrpn300.conf index 0c75080398..9334f2cf59 100644 --- a/ci-scripts/conf_files/gnb.band78.tm1.106PRB.usrpn300.conf +++ b/ci-scripts/conf_files/gnb.band78.tm1.106PRB.usrpn300.conf @@ -21,7 +21,6 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 0; min_rxtxtime = 6; servingCellConfigCommon = ( @@ -219,7 +218,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 = "addr=192.168.10.2,second_addr=192.168.20.2,mgmt_addr=192.168.18.85"; + sdr_addrs = "addr=192.168.10.2,second_addr=192.168.20.2"; } ); diff --git a/ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpb210.conf b/ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpb210.conf index f3515d3882..cd3ab6278e 100644 --- a/ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpb210.conf +++ b/ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpb210.conf @@ -19,7 +19,6 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 31; //0; servingCellConfigCommon = ( { diff --git a/ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpn310.conf b/ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpn310.conf index 8f480d3757..371753eccc 100644 --- a/ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpn310.conf +++ b/ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpn310.conf @@ -20,7 +20,6 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 31; //0; min_rxtxtime = 6; servingCellConfigCommon = ( diff --git a/ci-scripts/conf_files/gnb.sa.band66.fr1.106PRB.usrpn300.conf b/ci-scripts/conf_files/gnb.sa.band66.fr1.106PRB.usrpn300.conf index b78ca916f3..197e1d211c 100644 --- a/ci-scripts/conf_files/gnb.sa.band66.fr1.106PRB.usrpn300.conf +++ b/ci-scripts/conf_files/gnb.sa.band66.fr1.106PRB.usrpn300.conf @@ -32,7 +32,6 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 0; min_rxtxtime = 6; pdcch_ConfigSIB1 = ( diff --git a/ci-scripts/conf_files/gnb.sa.band78.fr1.106PRB.usrpb210.conf b/ci-scripts/conf_files/gnb.sa.band78.fr1.106PRB.usrpb210.conf new file mode 100644 index 0000000000..2a6053ab46 --- /dev/null +++ b/ci-scripts/conf_files/gnb.sa.band78.fr1.106PRB.usrpb210.conf @@ -0,0 +1,344 @@ +Active_gNBs = ( "gNB-OAI"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +gNBs = +( + { + ////////// Identification parameters: + gNB_ID = 0xe00; + gNB_name = "gNB-OAI"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = 1; + plmn_list = ({ + mcc = 222; + mnc = 01; + mnc_length = 2; + snssaiList = ( + { + sst = 1; + #sd = 0x1; // 0 false, else true + } + ); + + }); + + nr_cellid = 12345678L; + + ////////// Physical parameters: + + min_rxtxtime = 2; + do_CSIRS = 1; + do_SRS = 1; + + 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; + + #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, + + 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; + } + + ); + +# Dedicated Serving Cell Configuration +servingCellConfigDedicated = ({ + # BWP-Downlink + # BWP 1 Configuration + dl_bwp-Id_1 = 1; + dl_bwp1_locationAndBandwidth = 28875; // RBstart=0, L=106 (40 MHz BW) + # subcarrierSpacing + # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + dl_bwp1_subcarrierSpacing = 1; + + # BWP 2 Configuration + dl_bwp-Id_2 = 2; + dl_bwp2_locationAndBandwidth = 13750; // RBstart=0, L=51 (20 MHz BW) + # subcarrierSpacing + # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + dl_bwp2_subcarrierSpacing = 1; + + # BWP 3 Configuration + dl_bwp-Id_3 = 3; + dl_bwp3_locationAndBandwidth = 6325; // RBstart=0, L=24 (10 MHz BW) + # subcarrierSpacing + # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + dl_bwp3_subcarrierSpacing = 1; + + firstActiveDownlinkBWP-Id = 1; #BWP-Id + defaultDownlinkBWP-Id = 1; #BWP-Id + + # bwp-InactivityTimer ENUMERATED {ms2, ms3, ms4, ms5, ms6, ms8, ms10, ms20, ms30, + # ms40,ms50, ms60, ms80,ms100, ms200,ms300, ms500, + # ms750, ms1280, ms1920, ms2560, spare10, spare9, spare8, + # spare7, spare6, spare5, spare4, spare3, spare2, spare1 } + + # UplinkConfig + # BWP-Uplink + # BWP 1 Configuration + ul_bwp-Id_1 = 1; + ul_bwp1_locationAndBandwidth = 28875; // RBstart=0, L=106 (40 MHz BW) + # subcarrierSpacing + # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + ul_bwp1_subcarrierSpacing = 1; + + # BWP 2 Configuration + ul_bwp-Id_2 = 2; + ul_bwp2_locationAndBandwidth = 13750; // RBstart=0, L=51 (20 MHz BW) + # subcarrierSpacing + # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + ul_bwp2_subcarrierSpacing = 1; + + # BWP 3 Configuration + ul_bwp-Id_3 = 3; + ul_bwp3_locationAndBandwidth = 6325; // RBstart=0, L=24 (10 MHz BW) + # subcarrierSpacing + # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + ul_bwp3_subcarrierSpacing = 1; + + firstActiveUplinkBWP-Id = 1; #BWP-Id + } +); + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + + ////////// AMF parameters: + amf_ip_address = ( { ipv4 = "172.21.16.136"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + + NETWORK_INTERFACES : + { + GNB_INTERFACE_NAME_FOR_NG_AMF = "demo-oai"; + GNB_IPV4_ADDRESS_FOR_NG_AMF = "172.21.16.137/24"; + GNB_INTERFACE_NAME_FOR_NGU = "demo-oai"; + GNB_IPV4_ADDRESS_FOR_NGU = "172.21.16.137/24"; + GNB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + } +); + +MACRLCs = ( +{ + num_cc = 1; + tr_s_preference = "local_L1"; + tr_n_preference = "local_RRC"; + pusch_TargetSNRx10 = 200; + pucch_TargetSNRx10 = 200; + ulsch_max_frame_inactivity = 0; +} +); + +L1s = ( +{ + num_cc = 1; + tr_n_preference = "local_mac"; + prach_dtx_threshold = 120; + pucch0_dtx_threshold = 100; + ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0 +} +); + +RUs = ( +{ + local_rf = "yes" + nb_tx = 1 + nb_rx = 1 + att_tx = 10; + att_rx = 10; + bands = [78]; + max_pdschReferenceSignalPower = -27; + max_rxgain = 114; + eNB_instances = [0]; + #beamforming 1x4 matrix: + bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000]; + clock_src = "internal"; +} +); + +THREAD_STRUCT = ( +{ + #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT" + parallel_config = "PARALLEL_SINGLE_THREAD"; + #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE" + worker_config = "WORKER_ENABLE"; +} +); + +rfsimulator : +{ + serveraddr = "server"; + serverport = "4043"; + options = (); #("saviq"); or/and "chanmod" + modelname = "AWGN"; + IQfile = "/tmp/rfsimulator.iqs"; +}; + +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"; + hw_log_level ="info"; + phy_log_level ="info"; + mac_log_level ="info"; + rlc_log_level ="info"; + pdcp_log_level ="info"; + rrc_log_level ="info"; + ngap_log_level ="debug"; + f1ap_log_level ="debug"; +}; + diff --git a/ci-scripts/conf_files/gnb.sa.band78.fr1.24PRB.usrpb210.conf b/ci-scripts/conf_files/gnb.sa.band78.fr1.24PRB.usrpb210.conf index bd3076a014..ad1471339a 100644 --- a/ci-scripts/conf_files/gnb.sa.band78.fr1.24PRB.usrpb210.conf +++ b/ci-scripts/conf_files/gnb.sa.band78.fr1.24PRB.usrpb210.conf @@ -32,9 +32,6 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 0; - pdsch_AntennaPorts = 1; - pusch_AntennaPorts = 1; sib1_tda = 15; min_rxtxtime = 6; diff --git a/ci-scripts/datalog_rt_stats.2x2.yaml b/ci-scripts/datalog_rt_stats.2x2.yaml index a93ef6aa8c..eccde746cc 100644 --- a/ci-scripts/datalog_rt_stats.2x2.yaml +++ b/ci-scripts/datalog_rt_stats.2x2.yaml @@ -16,7 +16,7 @@ Ref : L1 Rx processing : 175.0 PUSCH inner-receiver : 100.0 PUSCH decoding : 180.0 - DL & UL scheduling timing stats : 37.0 + DL & UL scheduling timing : 37.0 UL Indication : 38.0 Threshold : feprx : 1.25 @@ -28,5 +28,5 @@ Threshold : L1 Rx processing : 1.25 PUSCH inner-receiver : 1.25 PUSCH decoding : 1.25 - DL & UL scheduling timing stats : 1.25 + DL & UL scheduling timing : 1.25 UL Indication : 1.25 diff --git a/ci-scripts/datalog_rt_stats.default.yaml b/ci-scripts/datalog_rt_stats.default.yaml index 02a90c86f4..97591a766d 100644 --- a/ci-scripts/datalog_rt_stats.default.yaml +++ b/ci-scripts/datalog_rt_stats.default.yaml @@ -15,8 +15,9 @@ Ref : DLSCH encoding : 230.0 L1 Rx processing : 175.0 PUSCH inner-receiver : 100.0 - PUSCH decoding : 180.0 - DL & UL scheduling timing stats : 37.0 + #PUSCH decoding : 180.0 + PUSCH decoding : 240.0 + DL & UL scheduling timing : 37.0 UL Indication : 38.0 Threshold : feprx : 1.25 @@ -28,5 +29,5 @@ Threshold : L1 Rx processing : 1.25 PUSCH inner-receiver : 1.25 PUSCH decoding : 1.25 - DL & UL scheduling timing stats : 1.25 + DL & UL scheduling timing : 1.25 UL Indication : 1.25 diff --git a/ci-scripts/docker/Dockerfile.formatting.bionic b/ci-scripts/docker/Dockerfile.formatting.bionic new file mode 100644 index 0000000000..01417a3bdb --- /dev/null +++ b/ci-scripts/docker/Dockerfile.formatting.bionic @@ -0,0 +1,31 @@ +FROM ubuntu:bionic AS oai-formatting-check + +ARG MERGE_REQUEST +ARG SRC_BRANCH +ARG TARGET_BRANCH +ENV DEBIAN_FRONTEND=noninteractive + +RUN apt-get update && \ + DEBIAN_FRONTEND=noninteractive apt-get upgrade --yes && \ + DEBIAN_FRONTEND=noninteractive apt-get install --yes \ + astyle \ + gawk \ + git + +WORKDIR /oai-ran +COPY . . + +RUN /bin/bash -c "if [[ -v MERGE_REQUEST ]]; then echo 'Source Branch = $SRC_BRANCH'; echo 'Target Branch = $TARGET_BRANCH'; else echo 'Push to develop'; fi" +RUN /bin/bash -c "if [[ -v MERGE_REQUEST ]]; then ./ci-scripts/checkCodingFormattingRules.sh --src-branch $SRC_BRANCH --target-branch $TARGET_BRANCH; else ./ci-scripts/checkCodingFormattingRules.sh; fi" + +RUN echo "=== Files not properly formatted ===" && \ + /bin/bash -c "if [[ -f oai_rules_result_list.txt ]]; then cat oai_rules_result_list.txt; fi" + +RUN echo "=== Files with incorrect define protection ===" && \ + /bin/bash -c "if [[ -f header-files-w-incorrect-define.txt ]]; then cat header-files-w-incorrect-define.txt; fi" + +RUN echo "=== Files with a GNU GPL licence Banner ===" && \ + /bin/bash -c "if [[ -f files-w-gnu-gpl-license-banner.txt ]]; then cat files-w-gnu-gpl-license-banner.txt; fi" + +RUN echo "=== Files with a suspect Banner ===" && \ + /bin/bash -c "if [[ -f files-w-suspect-banner.txt ]]; then cat files-w-suspect-banner.txt; fi" diff --git a/ci-scripts/epc.py b/ci-scripts/epc.py index 0fc37d4ead..9113d29ac9 100644 --- a/ci-scripts/epc.py +++ b/ci-scripts/epc.py @@ -255,16 +255,19 @@ class EPCManagement(): mySSH.command('mkdir -p ' + self.SourceCodePath + '/scripts', '\$', 5) mySSH.command('cd /opt/oai-cn5g-fed-v1.3/docker-compose', '\$', 5) mySSH.command('python3 ./core-network.py '+self.cfgDeploy, '\$', 60) - time.sleep(2) - mySSH.command('docker-compose -p 5gcn ps -a', '\$', 60) + if re.search('start-mini-as-ue', self.cfgDeploy): + dFile = 'docker-compose-mini-nrf-asue.yaml' + else: + dFile = 'docker-compose-mini-nrf.yaml' + mySSH.command('docker-compose -p 5gcn -f ' + dFile + ' ps -a', '\$', 60) if mySSH.getBefore().count('Up (healthy)') != 6: logging.error('Not all container healthy') else: - logging.debug('OK') - mySSH.command('docker-compose config | grep --colour=never image', '\$', 10) + logging.debug('OK --> all containers are healthy') + mySSH.command('docker-compose -p 5gcn -f ' + dFile + ' config | grep --colour=never image', '\$', 10) listOfImages = mySSH.getBefore() for imageLine in listOfImages.split('\\r\\n'): - res1 = re.search('image: (?P[a-zA-Z0-9\-]+):(?P[a-zA-Z0-9\-]+)', str(imageLine)) + res1 = re.search('image: (?P[a-zA-Z0-9\-/]+):(?P[a-zA-Z0-9\-]+)', str(imageLine)) res2 = re.search('mysql', str(imageLine)) if res1 is not None and res2 is None: html_cell += res1.group('name') + ':' + res1.group('tag') + ' ' @@ -308,6 +311,8 @@ class EPCManagement(): tmp = str(response[0],'utf-8') self.MmeIPAddress = tmp.rstrip() logging.debug('AMF IP Address ' + self.MmeIPAddress) + else: + logging.error('no container with name oai-amf found, could not retrieve AMF IP address') mySSH.close() def CheckHSSProcess(self, status_queue): @@ -536,7 +541,7 @@ class EPCManagement(): mySSH.command('python3 ./core-network.py '+self.cfgUnDeploy, '\$', 60) mySSH.command('docker volume prune --force || true', '\$', 60) time.sleep(2) - mySSH.command('tshark -r /tmp/oai-cn5g.pcap | egrep --colour=never "Tracking area update" ','\$', 30) + mySSH.command('tshark -r /tmp/oai-cn5g-v1.3.pcap | egrep --colour=never "Tracking area update" ','\$', 30) result = re.search('Tracking area update request', mySSH.getBefore()) if result is not None: message = 'UE requested ' + str(mySSH.getBefore().count('Tracking area update request')) + 'Tracking area update request(s)' @@ -830,8 +835,8 @@ class EPCManagement(): mySSH.command('zip mme.log.zip mme_check_run.*', '\$', 60) elif re.match('OAICN5G', self.Type, re.IGNORECASE): mySSH.command('cd ' + self.SourceCodePath + '/logs','\$', 5) - mySSH.command('cp -f /tmp/oai-cn5g.pcap .','\$', 30) - mySSH.command('zip mme.log.zip oai-amf.log oai-nrf.log oai-cn5g.pcap','\$', 30) + mySSH.command('cp -f /tmp/oai-cn5g-v1.3.pcap .','\$', 30) + mySSH.command('zip mme.log.zip oai-amf.log oai-nrf.log oai-cn5g*.pcap','\$', 30) mySSH.command('mv mme.log.zip ' + self.SourceCodePath + '/scripts','\$', 30) elif re.match('OAI', self.Type, re.IGNORECASE) or re.match('OAI-Rel14-CUPS', self.Type, re.IGNORECASE): mySSH.command('zip mme.log.zip mme*.log', '\$', 60) diff --git a/ci-scripts/main.py b/ci-scripts/main.py index 03947bdfc9..baed6a6011 100644 --- a/ci-scripts/main.py +++ b/ci-scripts/main.py @@ -102,7 +102,7 @@ def AssignParams(params_dict): def GetParametersFromXML(action): - if action == 'Build_eNB' or action == 'Build_Image': + if action == 'Build_eNB' or action == 'Build_Image' or action == 'Build_Proxy': RAN.Build_eNB_args=test.findtext('Build_eNB_args') CONTAINERS.imageKind=test.findtext('kind') forced_workspace_cleanup = test.findtext('forced_workspace_cleanup') @@ -138,6 +138,9 @@ def GetParametersFromXML(action): RAN.backgroundBuild=True else: RAN.backgroundBuild=False + proxy_commit = test.findtext('proxy_commit') + if proxy_commit is not None: + CONTAINERS.proxyCommit = proxy_commit elif action == 'WaitEndBuild_eNB': RAN.Build_eNB_args=test.findtext('Build_eNB_args') @@ -799,7 +802,7 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re HTML.startTime=int(round(time.time() * 1000)) while CiTestObj.FailReportCnt < CiTestObj.repeatCounts[0] and RAN.prematureExit: RAN.prematureExit=False - # At every iteratin of the retry loop, a separator will be added + # At every iteration of the retry loop, a separator will be added # pass CiTestObj.FailReportCnt as parameter of HTML.CreateHtmlRetrySeparator HTML.CreateHtmlRetrySeparator(CiTestObj.FailReportCnt) for test_case_id in todo_tests: @@ -915,14 +918,22 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re HTML=ldpc.Run_PhySim(HTML,CONST,id) elif action == 'Build_Image': CONTAINERS.BuildImage(HTML) + elif action == 'Build_Proxy': + CONTAINERS.BuildProxy(HTML) elif action == 'Copy_Image_to_Test': CONTAINERS.Copy_Image_to_Test_Server(HTML) elif action == 'Deploy_Object': CONTAINERS.DeployObject(HTML, EPC) + if CONTAINERS.exitStatus==1: + RAN.prematureExit = True elif action == 'Undeploy_Object': CONTAINERS.UndeployObject(HTML, RAN) elif action == 'Cppcheck_Analysis': SCA.CppCheckAnalysis(HTML) + elif action == 'LicenceAndFormattingCheck': + ret = SCA.LicenceAndFormattingCheck(HTML) + if ret != 0: + RAN.prematureExit = True elif action == 'Deploy_Run_PhySim': PHYSIM.Deploy_PhySim(HTML, RAN) elif action == 'DeployGenObject': diff --git a/ci-scripts/ran.py b/ci-scripts/ran.py index 97c5b9696e..680763d247 100644 --- a/ci-scripts/ran.py +++ b/ci-scripts/ran.py @@ -383,17 +383,19 @@ class RANManagement(): # If tracer options is on, running tshark on EPC side and capture traffic b/ EPC and eNB - localEpcIpAddr = EPC.IPAddress - localEpcUserName = EPC.UserName - localEpcPassword = EPC.Password - mySSH.open(localEpcIpAddr, localEpcUserName, localEpcPassword) - eth_interface = 'any' - fltr = 'sctp' - logging.debug('\u001B[1m Launching tshark on interface ' + eth_interface + ' with filter "' + fltr + '"\u001B[0m') - self.epcPcapFile = 'enb_' + self.testCase_id + '_s1log.pcap' - mySSH.command('echo ' + localEpcPassword + ' | sudo -S rm -f /tmp/' + self.epcPcapFile , '\$', 5) - mySSH.command('echo $USER; nohup sudo tshark -f "host ' + lIpAddr +'" -i ' + eth_interface + ' -f "' + fltr + '" -w /tmp/' + self.epcPcapFile + ' > /tmp/tshark.log 2>&1 &', localEpcUserName, 5) - mySSH.close() + if EPC.IPAddress != "none": + localEpcIpAddr = EPC.IPAddress + localEpcUserName = EPC.UserName + localEpcPassword = EPC.Password + mySSH.open(localEpcIpAddr, localEpcUserName, localEpcPassword) + eth_interface = 'any' + fltr = 'sctp' + logging.debug('\u001B[1m Launching tshark on interface ' + eth_interface + ' with filter "' + fltr + '"\u001B[0m') + self.epcPcapFile = 'enb_' + self.testCase_id + '_s1log.pcap' + mySSH.command('echo ' + localEpcPassword + ' | sudo -S rm -f /tmp/' + self.epcPcapFile , '\$', 5) + mySSH.command('echo $USER; nohup sudo tshark -f "host ' + lIpAddr +'" -i ' + eth_interface + ' -f "' + fltr + '" -w /tmp/' + self.epcPcapFile + ' > /tmp/tshark.log 2>&1 &', localEpcUserName, 5) + mySSH.close() + mySSH.open(lIpAddr, lUserName, lPassWord) mySSH.command('cd ' + lSourcePath, '\$', 5) # Initialize_eNB_args usually start with -O and followed by the location in repository diff --git a/ci-scripts/ran_dashboard/Hdashboard.py b/ci-scripts/ran_dashboard/Hdashboard.py index 1b65c7af4f..bfa07557bd 100644 --- a/ci-scripts/ran_dashboard/Hdashboard.py +++ b/ci-scripts/ran_dashboard/Hdashboard.py @@ -528,15 +528,15 @@ class Dashboard: editable_mr = project.mergerequests.get(int(mr)) mr_notes = editable_mr.notes.list(all=True) - body = 'Consolidated Test Results
'+\ - 'Tested CommitID: ' + commit + '
' + body = '[Consolidated Test Results](https://oaitestdashboard.s3.eu-west-1.amazonaws.com/MR'+mr+'/index.html)\\\n' + body += 'Tested CommitID: ' + commit for i in range(0,n_tests): jobname = args[4*i] buildurl = args[4*i+1] buildid = args[4*i+2] status = args[4*i+3] - body += jobname+', status is '+status+', ('+buildid+')
' + body += '\\\n' + jobname + ': **'+status+'** ([' + buildid + '](' + buildurl + '))' #create new note mr_note = editable_mr.notes.create({ diff --git a/ci-scripts/sshconnection.py b/ci-scripts/sshconnection.py index dca3daa817..035da71426 100644 --- a/ci-scripts/sshconnection.py +++ b/ci-scripts/sshconnection.py @@ -60,7 +60,7 @@ class SSHConnection(): count = 0 connect_status = False while count < 4: - self.ssh = pexpect.spawn('ssh -o PubkeyAuthentication=no {}@{}'.format(username,ipaddress)) + self.ssh = pexpect.spawn('ssh -o PubkeyAuthentication=yes {}@{}'.format(username,ipaddress)) # Longer timeout at connection due to asterix slowness self.ssh.timeout = 25 self.sshresponse = self.ssh.expect(['Are you sure you want to continue connecting (yes/no)?', 'password:', 'Last login', pexpect.EOF, pexpect.TIMEOUT]) @@ -84,14 +84,11 @@ class SSHConnection(): else: logging.debug('self.sshresponse = ' + str(self.sshresponse)) elif self.sshresponse == 2: - # Checking if we are really on the remote client defined by its IP address - self.command('stdbuf -o0 ifconfig | egrep --color=never "inet addr:|inet "', prompt, 5) - result = re.search(str(ipaddress), str(self.ssh.before)) - if result is None: - self.close() - else: - count = 10 - connect_status = True + # We directly ended up on the remote server because of pubkey auth + count = 10 + connect_status = True + # this expect() seems to be necessary to advance the read buffer until the prompt, or getBefore() will not return the last command + self.sshresponse = self.ssh.expect([prompt]) else: # debug output logging.debug(str(self.ssh.before)) @@ -272,4 +269,4 @@ class SSHConnection(): sys.exit('SCP failed') def getBefore(self): - return str(self.ssh.before) + return self.ssh.before.decode('utf-8') diff --git a/ci-scripts/stats_monitor_conf.yaml b/ci-scripts/stats_monitor_conf.yaml index 9a2ececd18..4e1f87ed17 100644 --- a/ci-scripts/stats_monitor_conf.yaml +++ b/ci-scripts/stats_monitor_conf.yaml @@ -25,7 +25,7 @@ gnb : L1 Rx processing: PUSCH inner-receiver: PUSCH decoding: - DL & UL scheduling timing stats: + DL & UL scheduling timing: UL Indication: graph : page1: @@ -45,5 +45,5 @@ gnb : page4: rt.PUSCH inner-receiver: rt.PUSCH decoding: - rt.DL & UL scheduling timing stats: + rt.DL & UL scheduling timing: rt.UL Indication: diff --git a/ci-scripts/xml_class_list.yml b/ci-scripts/xml_class_list.yml index d6f75191a8..2c5f04b11f 100755 --- a/ci-scripts/xml_class_list.yml +++ b/ci-scripts/xml_class_list.yml @@ -1,3 +1,4 @@ + - Build_Proxy - Build_PhySim - Run_PhySim - Build_eNB @@ -47,3 +48,4 @@ - PingFromContainer - IperfFromContainer - StatsFromGenObject + - LicenceAndFormattingCheck diff --git a/ci-scripts/xml_files/container_5g_l2sim_proxy.xml b/ci-scripts/xml_files/container_5g_l2sim_proxy.xml new file mode 100644 index 0000000000..af1715d793 --- /dev/null +++ b/ci-scripts/xml_files/container_5g_l2sim_proxy.xml @@ -0,0 +1,42 @@ + + + l2sim-5gnr-proxy-build + Build L2sim proxy image + wrench + 1 + + 000001 + + + + + Build_Proxy + Build L2sim Proxy Image + 1 + 1 + True + 56cfdc0 + + + diff --git a/ci-scripts/xml_files/container_nsa_b200_quectel.xml b/ci-scripts/xml_files/container_nsa_b200_quectel.xml index 47a939f63c..51e6668cf0 100644 --- a/ci-scripts/xml_files/container_nsa_b200_quectel.xml +++ b/ci-scripts/xml_files/container_nsa_b200_quectel.xml @@ -53,7 +53,6 @@ Initialize_UE Initialize Quectel idefix - yes @@ -142,8 +141,8 @@ -u -b 125M -t 60 -i 1 -fm DL idefix - 1 - 95 + 25 + 80 single-ue diff --git a/ci-scripts/xml_files/container_sa_b200_quectel.xml b/ci-scripts/xml_files/container_sa_b200_quectel.xml new file mode 100644 index 0000000000..7f0475629d --- /dev/null +++ b/ci-scripts/xml_files/container_sa_b200_quectel.xml @@ -0,0 +1,168 @@ + + + TEST-SA-FR1-B200 + SA SanityCheck with QUECTEL + tasks + 1 + + 010002 + 030000 + 030101 + 000001 + 010000 + 000001 + 050000 + 050001 + 010002 + 000001 + 030201 + + + + + + Initialize_UE + Initialize Quectel + idefix + + + + + Terminate_UE + Terminate Quectel + idefix + + + + Copy_Image_to_Test + Copy gNB image to test server + oai-gnb + 1 + 0 + + + + Deploy_Object + Deploy gNB (TDD/Band78/40MHz/B200) in a container + ci-scripts/yaml_files/sa_b200_gnb + 0 + 0 + + + + IdleSleep + Sleep + 5 + + + + IdleSleep + Sleep + 20 + + + + + Ping + Ping: 20pings in 20sec + idefix + -c 20 + 1 + 15 + + + + Ping + Ping: 100pings in 20sec + idefix + -c 100 -i 0.2 + 1 + 15 + + + + Ping + Ping: 20pings in 20sec + idefix + -c 20 + 1 + 15 + + + + Ping + Ping: 100pings in 20sec + idefix + -c 100 -i 0.2 + 1 + 15 + + + + Iperf + iperf (DL/125Mbps/UDP)(60 sec)(single-ue profile) + -u -b 125M -t 60 -i 1 -fm + DL + idefix + 25 + 80 + single-ue + + + + Iperf + iperf (UL/8Mbps/UDP)(60 sec)(single-ue profile) + -u -b 8M -t 60 -i 1 -fm + UL + idefix + 1 + 95 + single-ue + + + + Iperf + iperf (BIDIR TCP)(10 sec)(single-ue profile) + -t 10 --bidir + BIDIR + idefix + single-ue + + + + Undeploy_Object + Undeploy gNB + ci-scripts/yaml_files/sa_b200_gnb + 0 + 0 + + + + diff --git a/ci-scripts/xml_files/container_sa_b200_terminate.xml b/ci-scripts/xml_files/container_sa_b200_terminate.xml new file mode 100644 index 0000000000..5a2b6bd454 --- /dev/null +++ b/ci-scripts/xml_files/container_sa_b200_terminate.xml @@ -0,0 +1,42 @@ + + + TEST-SA-FR1-B200-terminate + SA tear-down in case of problem + tasks + 1 + + 030201 + + + + + Undeploy_Object + Undeploy gNB + ci-scripts/yaml_files/sa_b200_gnb + 1 + 1 + sa-test + + + diff --git a/ci-scripts/xml_files/formatting_check.xml b/ci-scripts/xml_files/formatting_check.xml new file mode 100644 index 0000000000..bdf47af65d --- /dev/null +++ b/ci-scripts/xml_files/formatting_check.xml @@ -0,0 +1,37 @@ + + + formatting-tab + License and Formatting Checks + wrench + + 000002 + + + + + LicenceAndFormattingCheck + License and Formatting Checks + + + diff --git a/ci-scripts/xml_files/fr1_5gc_closure.xml b/ci-scripts/xml_files/fr1_5gc_closure.xml new file mode 100644 index 0000000000..e5e57fa694 --- /dev/null +++ b/ci-scripts/xml_files/fr1_5gc_closure.xml @@ -0,0 +1,37 @@ + + + 5gc-closure + 5GC-Closure + log-out + +060000 + + + + + Terminate_5GCN + Terminate 5GC + + + diff --git a/ci-scripts/xml_files/fr1_5gc_start.xml b/ci-scripts/xml_files/fr1_5gc_start.xml new file mode 100644 index 0000000000..8758b761cd --- /dev/null +++ b/ci-scripts/xml_files/fr1_5gc_start.xml @@ -0,0 +1,38 @@ + + + 5gc-start-tab + 5GC-Start + log-in + + 000100 + + + + + + Initialize_5GCN + Initialize 5GC + + + diff --git a/ci-scripts/xml_files/fr1_gnb_build.xml b/ci-scripts/xml_files/fr1_gnb_build.xml index 13d85fccc4..1ddc5b5682 100644 --- a/ci-scripts/xml_files/fr1_gnb_build.xml +++ b/ci-scripts/xml_files/fr1_gnb_build.xml @@ -32,7 +32,7 @@ Build_eNB Build gNB - -w USRP -c --gNB --ninja + -w USRP -c --gNB --ninja --noavx512 0 0 True diff --git a/ci-scripts/xml_files/fr1_multi_node_build.xml b/ci-scripts/xml_files/fr1_multi_node_build.xml index 60bc734e65..2dbdfb2f9d 100644 --- a/ci-scripts/xml_files/fr1_multi_node_build.xml +++ b/ci-scripts/xml_files/fr1_multi_node_build.xml @@ -50,7 +50,7 @@ Build_eNB Build gNB - -w USRP -c --gNB --ninja + -w USRP -c --gNB --ninja --noavx512 1 1 True diff --git a/ci-scripts/xml_files/fr1_nsa_2x2_quectel.xml b/ci-scripts/xml_files/fr1_nsa_2x2_quectel.xml index 2ef2b7d7ce..459a16c323 100644 --- a/ci-scripts/xml_files/fr1_nsa_2x2_quectel.xml +++ b/ci-scripts/xml_files/fr1_nsa_2x2_quectel.xml @@ -26,6 +26,7 @@ tasks 1 + 010002 030000 040000 000002 diff --git a/ci-scripts/xml_files/fr1_nsa_2x2_quectel_attach_detach.xml b/ci-scripts/xml_files/fr1_nsa_2x2_quectel_attach_detach.xml index 335fe873a1..c8e0659330 100644 --- a/ci-scripts/xml_files/fr1_nsa_2x2_quectel_attach_detach.xml +++ b/ci-scripts/xml_files/fr1_nsa_2x2_quectel_attach_detach.xml @@ -26,6 +26,7 @@ tasks 1 + 010002 031000 041000 000002 diff --git a/ci-scripts/xml_files/fr1_nsa_quectel.xml b/ci-scripts/xml_files/fr1_nsa_quectel.xml index 0f8c90abdf..c72c61c0a2 100644 --- a/ci-scripts/xml_files/fr1_nsa_quectel.xml +++ b/ci-scripts/xml_files/fr1_nsa_quectel.xml @@ -26,6 +26,7 @@ tasks 1 + 010002 030000 040000 000002 @@ -34,8 +35,8 @@ 050000 050001 000001 - 070003 - 070002 + 070000 + 070001 000001 050000 050001 @@ -52,14 +53,12 @@ yes - Terminate_UE Terminate Quectel idefix - Initialize_eNB Initialize eNB @@ -70,7 +69,6 @@ yes - Initialize_eNB Initialize gNB @@ -92,7 +90,6 @@ 20 - Ping Ping: 20pings in 20sec @@ -112,39 +109,17 @@ - Iperf - iperf (DL/30Mbps/UDP)(30 sec)(single-ue profile) - -u -b 30M -t 30 - DL - idefix - 1 - 95 - single-ue - - - - Iperf - iperf (DL/90Mbps/UDP)(30 sec)(single-ue profile) - -u -b 90M -t 30 - DL - idefix - 1 - 95 - single-ue - - - Iperf iperf (DL/125Mbps/UDP)(60 sec)(single-ue profile) -u -b 125M -t 60 DL idefix - 1 - 95 + 25 + 80 single-ue - + Iperf iperf (UL/8Mbps/UDP)(60 sec)(single-ue profile) -u -b 8M -t 60 @@ -155,7 +130,6 @@ single-ue - Terminate_eNB Terminate eNB diff --git a/ci-scripts/xml_files/fr1_sa_quectel.xml b/ci-scripts/xml_files/fr1_sa_quectel.xml index 2b215479c2..fd983d8835 100644 --- a/ci-scripts/xml_files/fr1_sa_quectel.xml +++ b/ci-scripts/xml_files/fr1_sa_quectel.xml @@ -26,6 +26,7 @@ tasks 1 + 010002 040000 000002 010000 diff --git a/ci-scripts/xml_files/fr1_sa_quectel_162prb.xml b/ci-scripts/xml_files/fr1_sa_quectel_162prb.xml index 23eaccfcfd..f426bd6035 100644 --- a/ci-scripts/xml_files/fr1_sa_quectel_162prb.xml +++ b/ci-scripts/xml_files/fr1_sa_quectel_162prb.xml @@ -26,6 +26,7 @@ tasks 1 + 010002 042000 000002 010000 diff --git a/ci-scripts/xml_files/fr1_sa_quectel_stages.xml b/ci-scripts/xml_files/fr1_sa_quectel_stages.xml index 603f3f919b..48a9b60e7d 100644 --- a/ci-scripts/xml_files/fr1_sa_quectel_stages.xml +++ b/ci-scripts/xml_files/fr1_sa_quectel_stages.xml @@ -26,6 +26,7 @@ tasks 1 + 011002 041000 000002 011000 diff --git a/ci-scripts/xml_files/gnb_phytest_usrp_run.xml b/ci-scripts/xml_files/gnb_phytest_usrp_run.xml index 5705533ab4..e7eb651d50 100644 --- a/ci-scripts/xml_files/gnb_phytest_usrp_run.xml +++ b/ci-scripts/xml_files/gnb_phytest_usrp_run.xml @@ -24,7 +24,7 @@ gNB-PHY-Test Run-gNB-PHY-Test tasks - 3 + 1 090101 000001 090109 @@ -33,7 +33,7 @@ Initialize_eNB Initialize gNB USRP - -O ci-scripts/conf_files/gnb.band78.tm1.106PRB.usrpn300.conf --phy-test -q -U 787200 -T 106 -t 28 -D 130175 -m 28 -M 106 --log_config.global_log_options level,nocolor,time + -O ci-scripts/conf_files/gnb.band78.tm1.106PRB.usrpn300.conf --phy-test -q -U 787200 -T 106 -t 28 -D 130175 -m 28 -M 106 --usrp-tx-thread-config 1 --log_config.global_log_options level,nocolor,time NR 192.168.20.2 diff --git a/ci-scripts/xml_files/gnb_usrp_build.xml b/ci-scripts/xml_files/gnb_usrp_build.xml index 97f85c6a33..81c7d4e24e 100644 --- a/ci-scripts/xml_files/gnb_usrp_build.xml +++ b/ci-scripts/xml_files/gnb_usrp_build.xml @@ -34,7 +34,7 @@ TesteNB Build_eNB Build gNB (USRP) - --gNB -w USRP --ninja --cmake-opt -DBoost_INCLUDE_DIR=/usr/include/boost169 + --gNB -w USRP --ninja --cmake-opt -DBoost_INCLUDE_DIR=/usr/include/boost169 --noavx512 True diff --git a/ci-scripts/xml_files/ldpc_gpu_test.xml b/ci-scripts/xml_files/ldpc_gpu_test.xml index a0191fbd76..c17bc082d5 100644 --- a/ci-scripts/xml_files/ldpc_gpu_test.xml +++ b/ci-scripts/xml_files/ldpc_gpu_test.xml @@ -32,7 +32,7 @@ Build_PhySim Build for physical simulator - --phy_simulators --ninja + --phy_simulators --ninja --noavx512 FALSE diff --git a/ci-scripts/xml_files/lte_2x2_tm1_quectel.xml b/ci-scripts/xml_files/lte_2x2_tm1_quectel.xml index 6aa53200c8..b6388eede2 100644 --- a/ci-scripts/xml_files/lte_2x2_tm1_quectel.xml +++ b/ci-scripts/xml_files/lte_2x2_tm1_quectel.xml @@ -26,6 +26,7 @@ tasks 1 + 010002 030000 000002 010000 @@ -88,7 +89,7 @@ nrmodule2_quectel -c 20 1 - 40 + 60 Ping @@ -96,7 +97,7 @@ nrmodule2_quectel -c 100 -s 1024 -i 0,2 1 - 40 + 60 diff --git a/ci-scripts/xml_files/lte_2x2_tm2_quectel.xml b/ci-scripts/xml_files/lte_2x2_tm2_quectel.xml index 84aa87aa23..99c8f75e06 100644 --- a/ci-scripts/xml_files/lte_2x2_tm2_quectel.xml +++ b/ci-scripts/xml_files/lte_2x2_tm2_quectel.xml @@ -26,6 +26,7 @@ tasks 1 + 010002 030001 000002 010000 @@ -88,7 +89,7 @@ nrmodule2_quectel -c 20 1 - 40 + 60 Ping @@ -96,7 +97,7 @@ nrmodule2_quectel -c 100 -s 1024 -i 0,2 1 - 40 + 60 diff --git a/ci-scripts/yaml_files/sa_b200_gnb/docker-compose.yml b/ci-scripts/yaml_files/sa_b200_gnb/docker-compose.yml new file mode 100644 index 0000000000..9ea52c1247 --- /dev/null +++ b/ci-scripts/yaml_files/sa_b200_gnb/docker-compose.yml @@ -0,0 +1,44 @@ +version: '3.8' + +services: + gnb_mono_tdd: + image: oai-gnb:latest + privileged: true + container_name: sa-b200-gnb + environment: + USE_SA_TDD_MONO_B2XX: 'yes' + USE_B2XX: 'yes' + GNB_NAME: gNB-in-docker + MCC: '222' + MNC: '01' + MNC_LENGTH: 2 + TAC: 1 + NSSAI_SST: 1 + NSSAI_SD0: 1 + AMF_IP_ADDRESS: 172.21.16.136 + GNB_NGA_IF_NAME: eth0 + GNB_NGA_IP_ADDRESS: 192.168.68.194 + GNB_NGU_IF_NAME: eth0 + GNB_NGU_IP_ADDRESS: 192.168.68.194 + USE_ADDITIONAL_OPTIONS: --sa -E -q --RUs.[0].sdr_addrs serial=30C51D4 --continuous-tx --log_config.global_log_options level,nocolor,time,line_num,function + volumes: + - /dev:/dev + networks: + public_net: + ipv4_address: 192.168.68.194 + #entrypoint: /bin/bash -c "sleep infinity" + healthcheck: + # pgrep does NOT work + test: /bin/bash -c "ps aux | grep -v grep | grep -c softmodem" + interval: 10s + timeout: 5s + retries: 5 + +networks: + public_net: + name: sa-b200-gnb-net + ipam: + config: + - subnet: 192.168.68.192/26 + driver_opts: + com.docker.network.bridge.name: "sa-gnb-net" diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 99d94b6a67..2145376fcf 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -203,17 +203,23 @@ if (CMAKE_SYSTEM_PROCESSOR STREQUAL "armv7l") else (CMAKE_SYSTEM_PROCESSOR STREQUAL "armv7l") if(EXISTS "/proc/cpuinfo") file(STRINGS "/proc/cpuinfo" CPUINFO REGEX flags LIMIT_COUNT 1) - if (CPUINFO MATCHES "avx2") - set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -mavx2") + message("NOAVX512 is ${NOAVX512}") + if (CPUINFO MATCHES "avx512bw" AND "${NOAVX512}" STREQUAL "False") + set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -mavx512bw -march=skylake-avx512 -mtune=skylake-avx512 " ) set(COMPILATION_AVX2 "True") else() - set(COMPILATION_AVX2 "False") - endif() - if (CPUINFO MATCHES "sse4_1") - set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -msse4.1 -mpclmul") - endif() - if (CPUINFO MATCHES "ssse3") - set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -mssse3") + if (CPUINFO MATCHES "avx2") + set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -mavx2") + set(COMPILATION_AVX2 "True") + else() + set(COMPILATION_AVX2 "False") + endif() + if (CPUINFO MATCHES "sse4_1") + set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -msse4.1 -mpclmul") + endif() + if (CPUINFO MATCHES "ssse3") + set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -mssse3") + endif() endif() else() Message("/proc/cpuinfo does not exit. We will use manual CPU flags") @@ -224,11 +230,11 @@ set(C_FLAGS_PROCESSOR " ${C_FLAGS_PROCESSOR} ${CFLAGS_PROCESSOR_USER}") Message("C_FLAGS_PROCESSOR is ${C_FLAGS_PROCESSOR}") -if (CMAKE_SYSTEM_PROCESSOR MATCHES "x86") - if ( (NOT( C_FLAGS_PROCESSOR MATCHES "ssse3")) OR (NOT( C_FLAGS_PROCESSOR MATCHES "msse4.1")) ) - Message(FATAL_ERROR "For x86 Architecture, you must have following flags: -mssse3 -msse4.1. The current detected flags are: ${C_FLAGS_PROCESSOR}. You can pass the flags manually in build script, for example: ./build_oai --cflags_processor \"-mssse3 -msse4.1 -mavx2\" ") - endif() -endif() +#if (CMAKE_SYSTEM_PROCESSOR MATCHES "x86") +# if ( (NOT( C_FLAGS_PROCESSOR MATCHES "ssse3")) OR (NOT( C_FLAGS_PROCESSOR MATCHES "msse4.1")) ) +# Message(FATAL_ERROR "For x86 Architecture, you must have following flags: -mssse3 -msse4.1. The current detected flags are: ${C_FLAGS_PROCESSOR}. You can pass the flags manually in build script, for example: ./build_oai --cflags_processor \"-mssse3 -msse4.1 -mavx2\" ") +# endif() +#endif() # # add autotools definitions that were maybe used! @@ -247,6 +253,28 @@ add_boolean_option(SANITIZE_ADDRESS False "enable the address sanitizer (ASan)") if (SANITIZE_ADDRESS) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address -fno-omit-frame-pointer -fno-common") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -fno-omit-frame-pointer -fno-common") + # There seems to be some incompatibility with pthread_create and the RT scheduler, which + # results in pthread_create hanging. + # + # When we switch from Ubuntu 16.04 to 18.04, we found that running with the address sanitizer, + # the pthread_create function calls were not working. The inital thought was that we were + # trying to create a thread that was not-blocking and would eventually crash the machine during + # the run. After more debugging, we found that we would never even start the thread. We narrowed + # down the first two instances of pthread_create in the gNB and NR UE to be sctp_eNB_task and + # one_thread, respectively. We found that adding sleeps, and various other pauses to the threads + # had not effect. From there, we found that if we add an abort(); prior to the thread loop, we + # do not execute that. This indicated to us that the problem is not likely to be a non-blocking + # thread, but perhaps and issue with pthread_create itself. From there we begain to research the + # issue on the web. See: https://github.com/google/sanitizers/issues/1125 + # + # Google searching indicates this appears to be a problem since at least 2018. This could be something + # wrong in the pthread library, or something subtly wrong in this CMakeLists.txt. Use Ubuntu 20.04 instead. +endif () + +add_boolean_option(SANITIZE_UNDEFINED False "enable the undefined behavior sanitizer (UBSan)") +if (SANITIZE_UNDEFINED) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=undefined -fno-sanitize-recover=all") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=undefined -fno-sanitize-recover=all") endif () add_definitions("-DASN_DISABLE_OER_SUPPORT") @@ -1410,8 +1438,11 @@ set(PHY_NR_CODINGIF ) add_library(ldpc_orig MODULE ${PHY_LDPC_ORIG_SRC} ) +target_link_libraries(ldpc_orig PRIVATE ldpc_gen_HEADERS) add_library(ldpc_optim MODULE ${PHY_LDPC_OPTIM_SRC} ) +target_link_libraries(ldpc_optim PRIVATE ldpc_gen_HEADERS) add_library(ldpc_optim8seg MODULE ${PHY_LDPC_OPTIM8SEG_SRC} ) +target_link_libraries(ldpc_optim8seg PRIVATE ldpc_gen_HEADERS) add_library(ldpc_cl MODULE ${PHY_LDPC_CL_SRC} ) target_link_libraries(ldpc_cl OpenCL) add_dependencies(ldpc_cl nrLDPC_decoder_kernels_CL) @@ -1423,6 +1454,7 @@ if (CUDA_FOUND) endif (CUDA_FOUND) add_library(ldpc MODULE ${PHY_LDPC_OPTIM8SEGMULTI_SRC} ) +target_link_libraries(ldpc PRIVATE ldpc_gen_HEADERS) add_library(coding MODULE ${PHY_TURBOSRC} ) @@ -1568,9 +1600,10 @@ set(PHY_SRC_UE set(PHY_NR_SRC_COMMON ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_prach_common.c - ${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/srs_modulation_nr.c + ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_csi_rs.c ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_scrambling.c ${OPENAIR1_DIR}/PHY/NR_REFSIG/scrambling_luts.c + ${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/srs_modulation_nr.c ) set(PHY_NR_SRC @@ -1595,7 +1628,6 @@ set(PHY_SRC_UE ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c ${OPENAIR1_DIR}/PHY/NR_REFSIG/ul_ref_seq_nr.c ${OPENAIR1_DIR}/PHY/NR_REFSIG/nr_dmrs_rx.c - ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_csi_rs.c ${OPENAIR1_DIR}/PHY/NR_REFSIG/nr_gold.c ${OPENAIR1_DIR}/PHY/NR_REFSIG/nr_gen_mod_table.c ${OPENAIR1_DIR}/PHY/NR_REFSIG/dmrs_nr.c @@ -1643,6 +1675,7 @@ set(PHY_SRC_UE ${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/dci_nr.c ${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/dci_tools_nr.c ${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/pucch_nr.c + ${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/csi_rx.c ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_uci_tools_common.c ${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c ${OPENAIR1_DIR}/PHY/NR_REFSIG/ul_ref_seq_nr.c @@ -1804,7 +1837,15 @@ set(NR_PDCP_SRC ${OPENAIR2_DIR}/LAYER2/nr_pdcp/nr_pdcp_timer_thread.c ${OPENAIR2_DIR}/LAYER2/nr_pdcp/nr_pdcp_security_nea2.c ${OPENAIR2_DIR}/LAYER2/nr_pdcp/nr_pdcp_integrity_nia2.c + ${OPENAIR2_DIR}/LAYER2/nr_pdcp/nr_pdcp_integrity_nia1.c ${OPENAIR2_DIR}/LAYER2/nr_pdcp/asn1_utils.c + #hack: include these files to compile the nr phy simulators + #these files should not be here, will be removed at some point when the + #computation is done directly inside nr_pdcp_integrity_nia1.c instead + #of reusing code of osa_stream_eia.c + ${OPENAIR2_DIR}/UTIL/OSA/osa_stream_eia.c + ${OPENAIR2_DIR}/UTIL/OSA/osa_snow3g.c + ${OPENAIR2_DIR}/UTIL/OSA/osa_rijndael.c ) set(NR_SDAP_SRC @@ -1952,6 +1993,7 @@ set (MAC_SRC_UE set (MAC_NR_SRC_UE ${NR_UE_PHY_INTERFACE_DIR}/NR_IF_Module.c + ${NR_UE_PHY_INTERFACE_DIR}/NR_Packet_Drop.c ${NR_UE_MAC_DIR}/config_ue.c ${NR_UE_MAC_DIR}/mac_vars.c ${NR_UE_MAC_DIR}/main_ue_nr.c @@ -2869,6 +2911,7 @@ target_link_libraries(ldpctest add_executable(nr_dlschsim ${OPENAIR1_DIR}/SIMULATION/NR_PHY/dlschsim.c ${OPENAIR_DIR}/common/utils/nr/nr_common.c + ${OPENAIR_DIR}/executables/softmodem-common.c ${T_SOURCE} ${SHLIB_LOADER_SOURCES} ) @@ -2892,6 +2935,7 @@ target_link_libraries(nr_pbchsim add_executable(nr_pucchsim ${OPENAIR1_DIR}/SIMULATION/NR_PHY/pucchsim.c ${OPENAIR_DIR}/common/utils/nr/nr_common.c + ${OPENAIR_DIR}/executables/softmodem-common.c ${T_SOURCE} ${SHLIB_LOADER_SOURCES} ) @@ -2936,6 +2980,7 @@ target_link_libraries(nr_prachsim add_executable(nr_ulschsim ${OPENAIR1_DIR}/SIMULATION/NR_PHY/ulschsim.c ${OPENAIR_DIR}/common/utils/nr/nr_common.c + ${OPENAIR_DIR}/executables/softmodem-common.c ${PHY_INTERFACE_DIR}/queue_t.c ${T_SOURCE} ${SHLIB_LOADER_SOURCES} @@ -3177,3 +3222,4 @@ ADD_CUSTOM_TARGET(oarf ) include (${OPENAIR_DIR}/common/utils/telnetsrv/telnetsrv_CMakeLists.txt) +include(${OPENAIR1_DIR}/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/CMakeLists.txt) diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml index b55228bdc9..88654ac9b5 100755 --- a/cmake_targets/autotests/test_case_list.xml +++ b/cmake_targets/autotests/test_case_list.xml @@ -1062,7 +1062,8 @@ (Test3: PBCH-only, 217 PRB), (Test4: PBCH and synchronization, 217 RPB), (Test5: PBCH-only, 273 PRB), - (Test6: PBCH and synchronization, 273 PRB) + (Test6: PBCH and synchronization, 273 PRB), + (Test7: PBCH and synchronization, 106PBR, SSB SC OFFSET 6) $OPENAIR_DIR/cmake_targets/build_oai --phy_simulators -c @@ -1074,8 +1075,9 @@ -s-11 -S-8 -n10 -R217 -s-11 -S-8 -n10 -o8000 -I -R217 -s-11 -S-8 -n10 -R273 - -s-11 -S-8 -n10 -o8000 -I -R273 - nr_pbchsim.test1 nr_pbchsim.test2 nr_pbchsim.test3 nr_pbchsim.test4 nr_pbchsim.test5 nr_pbchsim.test6 + -s-11 -S-8 -n10 -o8000 -I -R273 + -s-11 -S-8 -n10 -R106 -O6 + nr_pbchsim.test1 nr_pbchsim.test2 nr_pbchsim.test3 nr_pbchsim.test4 nr_pbchsim.test5 nr_pbchsim.test6 nr_pbchsim.test7 PBCH test OK segmentation fault|assertion|exiting|fatal 3 @@ -1104,7 +1106,9 @@ (Test19: Mapping type A, 3 DMRS Symbols), (Test20: Mapping type B, 4 DMRS Symbols), (Test21: 4x4 MIMO, 1 Layer), - (Test22: 4x4 MIMO, 2 Layers) + (Test22: 4x4 MIMO, 2 Layers), + (Test23: 25 PRBs, 15 kHz SCS) + (Test24: MCS 0, low SNR performance) $OPENAIR_DIR/cmake_targets/build_oai --phy_simulators -c @@ -1132,8 +1136,10 @@ -n100 -s2 -U 2 0 2 -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.test22 + -n10 -s20 -U 3 0 0 2 -gR -x2 -y4 -z4 + -n100 -m0 -e0 -R25 -b25 -i 2 1 0 + -n100 -e0 -t95 -S-1.0 -i 2 1 0 + 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 nr_dlsim.test23 nr_dlsim.test24 PDSCH test OK segmentation fault|assertion|exiting|fatal 3 @@ -1184,9 +1190,10 @@ execution - nr_ulschsim Test cases. (Test1: 106 PRB), - (Test2: 217 PRB), - (Test3: 273 PRB) + nr_ulschsim Test cases. (Test1: 106 PRBs), + (Test2: 217 PRBs), + (Test3: 273 PRBs) + (Test4: 106 PRBs 4-layer MIMO) $OPENAIR_DIR/cmake_targets/build_oai --phy_simulators -c @@ -1195,8 +1202,9 @@ $OPENAIR_DIR/targets/bin/nr_ulschsim.Rel15 -R 106 -m9 -s13 -n100 -R 217 -m15 -s15 -n100 - -R 273 -m19 -s20 -n100 - nr_ulschsim.test1 nr_ulschsim.test2 nr_ulschsim.test3 + -R 273 -m19 -s20 -n100 + -R 106 -m9 -s13 -n100 -y4 -z4 -W4 + nr_ulschsim.test1 nr_ulschsim.test2 nr_ulschsim.test3 nr_ulschsim.test4 PUSCH test OK segmentation fault|assertion|exiting|fatal 3 @@ -1304,7 +1312,14 @@ (Test12: SC-FDMA, 216 PRBs), (Test13: SC-FDMA, 273 PRBs), (Test14: SC-FDMA, 3 DMRS), - (Test15: MCS 16 50 PRBs 2 RX_Antenna) + (Test15: MCS 19 50 PRBs 2 RX_Antenna), + (Test16: MCS 9 106 PRBs MIMO 2 layers), + (Test17: MCS 9 106 PRBs MIMO 4 layers), + (Test18: 25 PRBs, 15 kHz SCS), + (Test19: 3GPP G-FR1-A4-13 2 RX Antennas Requirements Test), + (Test20: 3GPP G-FR1-A4-13 4 RX Antennas Requirements Test), + (Test21: 3GPP G-FR1-A4-13 8 RX Antennas Requirements Test), + (Test22: MCS 0, low SNR performance) $OPENAIR_DIR/cmake_targets/build_oai --phy_simulators -c @@ -1316,18 +1331,24 @@ -n100 -m28 -s20 -n100 -m9 -R217 -r217 -s5 -n100 -m9 -R273 -r273 -s5 - -n100 -s5 -U 2 0 1 - -n100 -s5 -T 2 1 2 -U 2 0 2 - -n100 -s5 -T 2 2 2 -U 2 1 2 - -n100 -s5 -a4 -b8 -T 2 1 2 -U 2 1 3 + -n100 -s5 -U 4 0 1 1 1 + -n100 -s5 -T 2 1 2 -U 4 0 2 1 1 + -n100 -s5 -T 2 2 2 -U 4 1 2 1 1 + -n100 -s5 -a4 -b8 -T 2 1 2 -U 4 1 3 1 1 -n100 -s5 -Z -n100 -s5 -Z -r75 -n50 -s5 -Z -r216 -R217 -n50 -s5 -Z -r270 -R273 - -n100 -s5 -Z -U 2 0 2 - -n100 -m16 -s10 -z2 - - nr_ulsim.test1 nr_ulsim.test2 nr_ulsim.test3 nr_ulsim.test4 nr_ulsim.test5 nr_ulsim.test6 nr_ulsim.test7 nr_ulsim.test8 nr_ulsim.test9 nr_ulsim.test10 nr_ulsim.test11 nr_ulsim.test12 nr_ulsim.test13 nr_ulsim.test14 nr_ulsim.test15 + -n100 -s5 -Z -U 4 0 2 1 2 + -n100 -m19 -s10 -S15 -z2 + -n100 -m9 -r106 -s10 -W2 -y2 -z2 + -n100 -m9 -r106 -s20 -W4 -y4 -z4 + -n100 -u0 -m0 -R25 -r25 -i 2 1 0 + -m16 -r106 -s8.8 -S9.4 -z2 -n200 -U 4 1 1 1 2 -gI -b14 -t70 -I15 -i 2 1 0 + -m16 -r106 -s5.4 -S6 -z4 -n200 -U 4 1 1 1 2 -gI -b14 -t70 -I15 -i 2 1 0 + -m16 -r106 -s3.4 -S3.8 -z8 -n200 -U 4 1 1 1 2 -gI -b14 -t70 -I15 -i 2 1 0 + -n100 -m0 -S -0.6 -i 2 1 0 + nr_ulsim.test1 nr_ulsim.test2 nr_ulsim.test3 nr_ulsim.test4 nr_ulsim.test5 nr_ulsim.test6 nr_ulsim.test7 nr_ulsim.test8 nr_ulsim.test9 nr_ulsim.test10 nr_ulsim.test11 nr_ulsim.test12 nr_ulsim.test13 nr_ulsim.test14 nr_ulsim.test15 nr_ulsim.test16 nr_ulsim.test17 nr_ulsim.test18 nr_ulsim.test19 nr_ulsim.test20 nr_ulsim.test21 nr_ulsim.test22 PUSCH test OK segmentation fault|assertion|exiting|fatal 3 @@ -1338,10 +1359,11 @@ nr_prachsim Test cases. (Test1: 30kHz SCS, 106 PRBs, Prach format A2), (Test2: 30kHz SCS, 217 PRBs, Prach format A2), (Test3: 30kHz SCS, 273 PRBs, Prach format A2), - (Test4: 30kHz SCS, 106 PRBs, Prach format 0), + (Test4: 30kHz SCS, 106 PRBs, Prach format 0), (Test5: 120kHz SCS, 32 PRBs, Prach format A2), (Test6: 120kHz SCS, 66 PRBs, Prach format A2), - (Test7: 120kHz SCS, 66 PRBs, High Speed Enabled) + (Test7: 120kHz SCS, 66 PRBs, High Speed Enabled), + (Test8: 15kHz SCS, 25 PRBs) $OPENAIR_DIR/cmake_targets/build_oai --phy_simulators -c @@ -1351,11 +1373,12 @@ -a -s -30 -n 100 -p 63 -R 106 -a -s -30 -n 100 -p 63 -R 217 -a -s -30 -n 100 -p 63 -R 273 - -a -s -30 -n 100 -p 63 -R 106 -c 4 - -a -s -30 -n 100 -p 32 -R 32 -m 3 -c52 - -a -s -30 -n 100 -p 32 -R 66 -m 3 -c52 - -a -s -30 -n 100 -R 66 -m 3 -c52 -H - nr_prachsim.test1 nr_prachsim.test2 nr_prachsim.test3 nr_prachsim.test4 nr_prachsim.test5 nr_prachsim.test6 nr_prachsim.test7 + -a -s -30 -n 100 -p 63 -R 106 -c 4 + -a -s -30 -n 100 -p 32 -R 32 -m 3 -c52 + -a -s -30 -n 100 -p 32 -R 66 -m 3 -c52 + -a -s -30 -n 100 -R 66 -m 3 -c52 -H + -a -s -30 -n 100 -p 99 -R 25 -m 0 + nr_prachsim.test1 nr_prachsim.test2 nr_prachsim.test3 nr_prachsim.test4 nr_prachsim.test5 nr_prachsim.test6 nr_prachsim.test7 nr_prachsim.test8 PRACH test OK segmentation fault|assertion|exiting|fatal 3 diff --git a/cmake_targets/build_oai b/cmake_targets/build_oai index 5cafb95cba..16a0d559dd 100755 --- a/cmake_targets/build_oai +++ b/cmake_targets/build_oai @@ -55,6 +55,7 @@ BUILD_COVERITY_SCAN=0 DISABLE_HARDWARE_DEPENDENCY="False" CMAKE_BUILD_TYPE="RelWithDebInfo" CMAKE_CMD="$CMAKE" +NOAVX512="False" BUILD_ECLIPSE=0 NR="False" OPTIONAL_LIBRARIES="telnetsrv enbscope uescope nrscope" @@ -164,12 +165,18 @@ Options: Build optional shared library, can be one or several of $OPTIONAL_LIBRARIES or \"all\" --usrp-recplay Build for I/Q record-playback modes +--noavx512 + Build without AVX512 if it is present on CPU -k | --skip-shared-libraries Skip build for shared libraries to reduce compilation time when building frequently for debugging purposes --ninja Tell cmake to use the Ninja build system. Without, will generate make files +--sanitize + Shortcut for usage of --sanitize-address --sanitize-undefined --sanitize-address | -fsanitize=address - Enable the address sanitizer on all targets + Enable the address sanitizer on all targets +--sanitize-undefined | -fsanitize=undefined + Enable the undefined behavior sanitizer on all targets --ittiSIM Makes the itti simulator -h | --help @@ -436,6 +443,10 @@ function main() { fi fi shift 2;; + --noavx512) + NOAVX512="True" + echo_info "Disabling AVX512" + shift 1;; -k | --skip-shared-libraries) SKIP_SHARED_LIB_FLAG="True" echo_info "Skipping build of shared libraries, rfsimulator and transport protocol libraries" @@ -444,9 +455,16 @@ function main() { CMAKE_CMD="$CMAKE_CMD -GNinja" MAKE_CMD=ninja shift;; + --sanitize) + CMAKE_CMD="$CMAKE_CMD -DSANITIZE_ADDRESS=True -DSANITIZE_UNDEFINED=True" + shift;; --sanitize-address | -fsanitize=address) + grep -sq "Ubuntu 18.04" /etc/os-release && echo_error "Bug in OS with this option, see CMakeLists.txt" CMAKE_CMD="$CMAKE_CMD -DSANITIZE_ADDRESS=True" shift;; + --sanitize-undefined | -fundefined=address) + CMAKE_CMD="$CMAKE_CMD -DSANITIZE_UNDEFINED=True" + shift;; --ittiSIM) ittiSIM=1 CMAKE_CMD="$CMAKE_CMD -DITTI_SIM=True" @@ -624,6 +642,7 @@ function main() { cd $DIR/$BUILD_DIR/build if [[ ${#CMAKE_C_FLAGS[@]} > 0 ]]; then CMAKE_CMD="$CMAKE_CMD -DCMAKE_C_FLAGS=\"${CMAKE_C_FLAGS[*]}\""; fi if [[ ${#CMAKE_CXX_FLAGS[@]} > 0 ]]; then CMAKE_CMD="$CMAKE_CMD -DCMAKE_CXX_FLAGS=\"${CMAKE_CXX_FLAGS[*]}\""; fi + CMAKE_CMD="$CMAKE_CMD -DNOAVX512=\"${NOAVX512[*]}\"" echo_info "running $CMAKE_CMD" eval $CMAKE_CMD ../.. @@ -713,11 +732,11 @@ function main() { # simlist="ldpctest" for f in $simlist ; do compilations \ - ran_build $f \ + $BUILD_DIR $f \ $f $dbin/$f.$REL done compilations \ - ran_build coding \ + $BUILD_DIR coding \ libcoding.so $dbin/libcoding.so fi @@ -729,7 +748,7 @@ function main() { simlist="secu_knas_encrypt_eia1 secu_kenb aes128_ctr_encrypt aes128_ctr_decrypt secu_knas_encrypt_eea2 secu_knas secu_knas_encrypt_eea1 kdf aes128_cmac_encrypt secu_knas_encrypt_eia2" for f in $simlist ; do compilations \ - ran_build test_$f \ + $BUILD_DIR test_$f \ test_$f $dbin/test_$f.$REL done fi diff --git a/cmake_targets/tools/build_helper b/cmake_targets/tools/build_helper index 554f3ccfe5..d35f90fcce 100755 --- a/cmake_targets/tools/build_helper +++ b/cmake_targets/tools/build_helper @@ -109,6 +109,7 @@ check_supported_distribution() { "ubuntu18.04") return 0 ;; "ubuntu16.04") return 0 ;; "fedora35") return 0 ;; + "fedora36") return 0 ;; "rhel7") return 0 ;; "rhel7.6") return 0 ;; "rhel7.7") return 0 ;; @@ -196,8 +197,8 @@ check_warnings() { #argument: # $1: log file check_errors() { - #we look for 'warning:' in the compilation log file - error_count=`grep "error:" "$1" | wc -l` + #we look for 'error:' in the compilation log file + error_count=`grep -c "error:" "$1"` if [ $error_count -gt 0 ]; then echo_error "ERROR: $error_count error. See $1" fi @@ -381,7 +382,7 @@ check_install_usrp_uhd_driver(){ $SUDO apt-get remove libuhd3.14.1 -y || true $SUDO apt-get remove libuhd3.15.0 -y || true local distribution=$(get_distribution_release) - if [[ "$distribution" == "ubuntu18.04" ]]; then + if [[ "$distribution" == "ubuntu18.04" || "$distribution" == "ubuntu20.04" || "$distribution" == "ubuntu22.04" ]]; then $SUDO apt-get remove libuhd4.0.0 -y || true $SUDO apt-get remove libuhd4.1.0 -y || true fi @@ -410,13 +411,15 @@ check_install_usrp_uhd_driver(){ x=$((x + 1)) done $SUDO apt-get update - $SUDO apt-get -y install python python-tk libboost-all-dev libusb-1.0-0-dev - if [[ "$distribution" == "ubuntu16.04" ]]; then + $SUDO apt-get -y install python-tk libboost-all-dev libusb-1.0-0-dev + case "$(get_distribution_release)" in + "ubuntu16.04") $SUDO apt-get -y install libuhd-dev libuhd3.15.0 uhd-host - fi - if [[ "$distribution" == "ubuntu18.04" ]]; then - $SUDO apt-get -y install libuhd-dev libuhd4.1.0 uhd-host - fi + ;; + "ubuntu18.04" | "ubuntu20.04" | "ubuntu22.04") + $SUDO apt-get -y install libuhd-dev libuhd4.2.0 uhd-host + ;; + esac elif [[ "$OS_BASEDISTRO" == "fedora" ]]; then if [ $IS_CONTAINER -eq 0 ] then @@ -621,7 +624,6 @@ check_install_additional_tools (){ android-tools-adb \ wvdial \ sshpass \ - nscd \ bc \ ntp" elif [[ "$OS_DISTRO" == "rhel" ]] || [[ "$OS_DISTRO" == "centos" ]]; then @@ -646,7 +648,6 @@ check_install_additional_tools (){ wvdial \ numpy \ sshpass \ - nscd \ python2-paramiko \ python-pyroute2 \ python-netifaces \ @@ -674,7 +675,6 @@ check_install_additional_tools (){ wvdial \ python-numpy \ sshpass \ - nscd \ python-paramiko \ python-pyroute2 \ python-netifaces \ diff --git a/common/utils/nr/nr_common.c b/common/utils/nr/nr_common.c index 0aeeaf3afd..6add03c324 100644 --- a/common/utils/nr/nr_common.c +++ b/common/utils/nr/nr_common.c @@ -191,65 +191,17 @@ int PRBalloc_to_locationandbandwidth(int NPRB,int RBstart) { return(PRBalloc_to_locationandbandwidth0(NPRB,RBstart,275)); } -/// Target code rate tables indexed by Imcs -/* TS 38.214 table 5.1.3.1-1 - MCS index table 1 for PDSCH */ -uint16_t nr_target_code_rate_table1[29] = {120, 157, 193, 251, 308, 379, 449, 526, 602, 679, 340, 378, 434, 490, 553, \ - 616, 658, 438, 466, 517, 567, 616, 666, 719, 772, 822, 873, 910, 948}; +int cce_to_reg_interleaving(const int R, int k, int n_shift, const int C, int L, const int N_regs) { -/* TS 38.214 table 5.1.3.1-2 - MCS index table 2 for PDSCH */ -// Imcs values 20 and 26 have been multiplied by 2 to avoid the floating point -uint16_t nr_target_code_rate_table2[28] = {120, 193, 308, 449, 602, 378, 434, 490, 553, 616, 658, 466, 517, 567, \ - 616, 666, 719, 772, 822, 873, 1365, 711, 754, 797, 841, 885, 1833, 948}; - -/* TS 38.214 table 5.1.3.1-3 - MCS index table 3 for PDSCH */ -uint16_t nr_target_code_rate_table3[29] = {30, 40, 50, 64, 78, 99, 120, 157, 193, 251, 308, 379, 449, 526, 602, 340, \ - 378, 434, 490, 553, 616, 438, 466, 517, 567, 616, 666, 719, 772}; - -uint16_t nr_tbs_table[93] = {24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120, 128, 136, 144, 152, 160, 168, 176, 184, 192, 208, 224, 240, 256, 272, 288, 304, 320, \ - 336, 352, 368, 384, 408, 432, 456, 480, 504, 528, 552, 576, 608, 640, 672, 704, 736, 768, 808, 848, 888, 928, 984, 1032, 1064, 1128, 1160, 1192, 1224, 1256, \ - 1288, 1320, 1352, 1416, 1480, 1544, 1608, 1672, 1736, 1800, 1864, 1928, 2024, 2088, 2152, 2216, 2280, 2408, 2472, 2536, 2600, 2664, 2728, 2792, 2856, 2976, \ - 3104, 3240, 3368, 3496, 3624, 3752, 3824}; - -uint8_t nr_get_Qm(uint8_t Imcs, uint8_t table_idx) { - switch(table_idx) { - case 1: - return (((Imcs<10)||(Imcs==29))?2:((Imcs<17)||(Imcs==30))?4:((Imcs<29)||(Imcs==31))?6:-1); - break; - - case 2: - return (((Imcs<5)||(Imcs==28))?2:((Imcs<11)||(Imcs==29))?4:((Imcs<20)||(Imcs==30))?6:((Imcs<28)||(Imcs==31))?8:-1); - break; - - case 3: - return (((Imcs<15)||(Imcs==29))?2:((Imcs<21)||(Imcs==30))?4:((Imcs<29)||(Imcs==31))?6:-1); - break; - - default: - AssertFatal(0, "Invalid MCS table index %d (expected in range [1,3])\n", table_idx); - return(0); - break; - } -} - -uint32_t nr_get_code_rate(uint8_t Imcs, uint8_t table_idx) { - switch(table_idx) { - case 1: - return (nr_target_code_rate_table1[Imcs]); - break; - - case 2: - return (nr_target_code_rate_table2[Imcs]); - break; - - case 3: - return (nr_target_code_rate_table3[Imcs]); - break; - - default: - AssertFatal(0, "Invalid MCS table index %d (expected in range [1,3])\n", table_idx); - return(0); - break; + int f; // interleaving function + if(R==0) + f = k; + else { + int c = k/R; + int r = k%R; + f = (r*C + c + n_shift)%(N_regs/L); } + return f; } void get_coreset_rballoc(uint8_t *FreqDomainResource,int *n_rb,int *rb_offset) { @@ -503,7 +455,6 @@ int get_nr_table_idx(int nr_bandP, uint8_t scs_index) { return i; } - int get_subband_size(int NPRB,int size) { // implements table 5.2.1.4-2 from 36.214 // diff --git a/common/utils/nr/nr_common.h b/common/utils/nr/nr_common.h index a09532a565..5f7f670ce9 100644 --- a/common/utils/nr/nr_common.h +++ b/common/utils/nr/nr_common.h @@ -57,7 +57,7 @@ static inline int get_num_dmrs(uint16_t dmrs_mask ) { return(num_dmrs); } - +int cce_to_reg_interleaving(const int R, int k, int n_shift, const int C, int L, const int N_regs); int get_SLIV(uint8_t S, uint8_t L); void get_coreset_rballoc(uint8_t *FreqDomainResource,int *n_rb,int *rb_offset); uint16_t config_bandwidth(int mu, int nb_rb, int nr_band); @@ -69,12 +69,6 @@ int NRRIV2BW(int locationAndBandwidth,int N_RB); int NRRIV2PRBOFFSET(int locationAndBandwidth,int N_RB); int PRBalloc_to_locationandbandwidth0(int NPRB,int RBstart,int BWPsize); int PRBalloc_to_locationandbandwidth(int NPRB,int RBstart); -extern uint16_t nr_target_code_rate_table1[29]; -extern uint16_t nr_target_code_rate_table2[28]; -extern uint16_t nr_target_code_rate_table3[29]; -extern uint16_t nr_tbs_table[93]; -uint8_t nr_get_Qm(uint8_t Imcs, uint8_t table_idx); -uint32_t nr_get_code_rate(uint8_t Imcs, uint8_t table_idx); 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); diff --git a/common/utils/ocp_itti/intertask_interface.cpp b/common/utils/ocp_itti/intertask_interface.cpp index 44fae9f788..43001ec95b 100644 --- a/common/utils/ocp_itti/intertask_interface.cpp +++ b/common/utils/ocp_itti/intertask_interface.cpp @@ -450,6 +450,7 @@ extern "C" { void itti_wait_tasks_end(void) { shutting_down = false; signal(SIGTERM, catch_sigterm); + //signal(SIGINT, catch_sigterm); while (! shutting_down) { sleep(24 * 3600); diff --git a/common/utils/threadPool/thread-pool.h b/common/utils/threadPool/thread-pool.h index d06f2195ee..e448117385 100644 --- a/common/utils/threadPool/thread-pool.h +++ b/common/utils/threadPool/thread-pool.h @@ -80,7 +80,7 @@ static inline notifiedFIFO_elt_t *newNotifiedFIFO_elt(int size, notifiedFIFO_t *reponseFifo, void (*processingFunc)(void *)) { notifiedFIFO_elt_t *ret; - AssertFatal( NULL != (ret=(notifiedFIFO_elt_t *) malloc(sizeof(notifiedFIFO_elt_t)+size+32)), ""); + AssertFatal( NULL != (ret=(notifiedFIFO_elt_t *) calloc(1, sizeof(notifiedFIFO_elt_t)+size+32)), ""); ret->next=NULL; ret->key=key; ret->reponseFifo=reponseFifo; diff --git a/common/utils/time_meas.c b/common/utils/time_meas.c index df2bfd64de..9d1215b5e5 100644 --- a/common/utils/time_meas.c +++ b/common/utils/time_meas.c @@ -111,13 +111,15 @@ void print_meas(time_stats_t *ts, } } -int print_meas_log(time_stats_t *ts, - const char *name, - time_stats_t *total_exec_time, - time_stats_t *sf_exec_time, - char *output) +size_t print_meas_log(time_stats_t *ts, + const char *name, + time_stats_t *total_exec_time, + time_stats_t *sf_exec_time, + char *output, + size_t outputlen) { - int stroff = 0; + const char *begin = output; + const char *end = output + outputlen; static int first_time = 0; static double cpu_freq_GHz = 0.0; @@ -128,30 +130,49 @@ int print_meas_log(time_stats_t *ts, first_time=1; if ((total_exec_time == NULL) || (sf_exec_time== NULL)) - stroff += sprintf(output, "%25s %25s %25s %25s %25s %6f\n","Name","Total","Per Trials", "Num Trials","CPU_F_GHz", cpu_freq_GHz); + output += snprintf(output, + end - output, + "%25s %25s %25s %25s %25s %6f\n", + "Name", + "Total", + "Per Trials", + "Num Trials", + "CPU_F_GHz", + cpu_freq_GHz); else - stroff += sprintf(output+stroff, "%25s %25s %25s %20s %15s %6f\n","Name","Total","Average/Frame","Trials", "CPU_F_GHz", cpu_freq_GHz); + output += snprintf(output, + end - output, + "%25s %25s %25s %20s %15s %6f\n", + "Name", + "Total", + "Average/Frame", + "Trials", + "CPU_F_GHz", + cpu_freq_GHz); } if (ts->trials>0) { - //printf("%20s: total: %10.3f ms, average: %10.3f us (%10d trials)\n", name, ts->diff/cpu_freq_GHz/1000000.0, ts->diff/ts->trials/cpu_freq_GHz/1000.0, ts->trials); if ((total_exec_time == NULL) || (sf_exec_time== NULL)) { - stroff += sprintf(output+stroff, "%25s: %15.3f us; %15d; %15.3f us;\n", - name, - (ts->diff/ts->trials/cpu_freq_GHz/1000.0), - ts->trials, - ts->max/cpu_freq_GHz/1000.0); + output += snprintf(output, + end - output, + "%25s: %15.3f us; %15d; %15.3f us;\n", + name, + ts->diff / ts->trials / cpu_freq_GHz / 1000.0, + ts->trials, + ts->max / cpu_freq_GHz / 1000.0); } else { - stroff += sprintf(output+stroff, "%25s: %15.3f ms (%5.2f%%); %15.3f us (%5.2f%%); %15d;\n", - name, - (ts->diff/cpu_freq_GHz/1000000.0), - ((ts->diff/cpu_freq_GHz/1000000.0)/(total_exec_time->diff/cpu_freq_GHz/1000000.0))*100, // percentage - (ts->diff/ts->trials/cpu_freq_GHz/1000.0), - ((ts->diff/ts->trials/cpu_freq_GHz/1000.0)/(sf_exec_time->diff/sf_exec_time->trials/cpu_freq_GHz/1000.0))*100, // percentage - ts->trials); + output += snprintf(output, + end - output, + "%25s: %15.3f ms (%5.2f%%); %15.3f us (%5.2f%%); %15d;\n", + name, + ts->diff / cpu_freq_GHz / 1000000.0, + ((ts->diff / cpu_freq_GHz / 1000000.0) / (total_exec_time->diff / cpu_freq_GHz / 1000000.0))*100, // percentage + ts->diff / ts->trials / cpu_freq_GHz / 1000.0, + ((ts->diff / ts->trials / cpu_freq_GHz / 1000.0) / (sf_exec_time->diff / sf_exec_time->trials / cpu_freq_GHz / 1000.0)) * 100, // percentage + ts->trials); } } - return stroff; + return output - begin; } double get_time_meas_us(time_stats_t *ts) diff --git a/common/utils/time_meas.h b/common/utils/time_meas.h index 382dd7455a..eb81d09434 100644 --- a/common/utils/time_meas.h +++ b/common/utils/time_meas.h @@ -62,7 +62,7 @@ typedef struct time_stats { 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 */ + double 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) */ @@ -83,7 +83,12 @@ static inline void stop_meas(time_stats_t *ts) __attribute__((always_inline)); void print_meas_now(time_stats_t *ts, const char *name, FILE *file_name); void print_meas(time_stats_t *ts, const char *name, time_stats_t *total_exec_time, time_stats_t *sf_exec_time); -int print_meas_log(time_stats_t *ts, const char *name, time_stats_t *total_exec_time, time_stats_t *sf_exec_time, char *output); +size_t print_meas_log(time_stats_t *ts, + const char *name, + time_stats_t *total_exec_time, + time_stats_t *sf_exec_time, + char *output, + size_t outputlen); double get_time_meas_us(time_stats_t *ts); double get_cpu_freq_GHz(void); @@ -151,7 +156,7 @@ static inline void stop_meas(time_stats_t *ts) { ts->diff += (out-ts->in); /// process duration is the difference between two clock points ts->p_time = (out-ts->in); - ts->diff_square += (out-ts->in)*(out-ts->in); + ts->diff_square += ((double)out-ts->in)*((double)out-ts->in); if ((out-ts->in) > ts->max) ts->max = out-ts->in; diff --git a/doc/BUILD.md b/doc/BUILD.md index a52ce98cb5..70d69f5afd 100644 --- a/doc/BUILD.md +++ b/doc/BUILD.md @@ -193,6 +193,7 @@ Using the help option of the build script you can get the list of available opti | --UE | maintained and tested in CI | build `lte-uesoftmodem` the LTE UE | | --gNB | maintained and tested in CI | build `nr-softmodem` the 5G gNodeB | | --nrUE | maintained and tested in CI | build `nr-uesoftmodem` the 5G UE | +| --arch-native | maintained | build with native architecture optimization | | --usrp-recplay | deprecated | use the USRP configuration parameters to use the record player. | | --build-lib | maintained | build optional shared library(ies), which can then be loaded at run time via command line option. Use the --help option to get the list of supported optional libraries. `all` can be used to build all available optional libraries. | | --UE-conf-nvram | maintained | Specifies the path to the input file used by the conf2uedata utility. defaults to [openair3/NAS/TOOLS/ue_eurecom_test_sfr.conf](../openair3/NAS/TOOLS/ue_eurecom_test_sfr.conf) | diff --git a/doc/FEATURE_SET.md b/doc/FEATURE_SET.md index a289c6d17e..5db6e44d8d 100644 --- a/doc/FEATURE_SET.md +++ b/doc/FEATURE_SET.md @@ -332,6 +332,9 @@ The following features are valid for the gNB and the 5G-NR UE. - evalution of RSRP report - evaluation of CQI report - MAC scheduling of SR reception +- Bandwidth part (BWP) operation + - Handle multiple dedicated BWPs + - BWP switching through RRCReconfiguration method **gNB RLC** - Send/Receive operations according to 38.322 Rel.16 @@ -437,6 +440,10 @@ The following features are valid for the gNB and the 5G-NR UE. - PTRS support - Support for 1, 2 and 4 RX antennas - Support for up to 2 layers (currently limited to DMRS configuration type 2) +* Measurements based on NR-CSIRS + - RI, PMI and CQI computation + - Support for 1 and 2 RX antennas + - Support for up to 2 layers * NR-PUSCH (including Segmentation, LDPC encoding, rate matching, scrambling, modulation, RB mapping, etc). - PUSCH mapping type A and B - DMRS configuration type 1 and 2 @@ -485,14 +492,19 @@ The following features are valid for the gNB and the 5G-NR UE. * UCI processing - ACK/NACK processing - Triggering periodic SR - - CSI measurement reporting (SSB RSRP only) -* DLSH scheduler + - CSI measurement reporting +* DLSCH scheduler - Configuration of fapi PDU according to DCI - HARQ procedures * ULSCH scheduler - Configuration of fapi PDU according to DCI +* NR-CSIRS scheduler + - Scheduling of NR-CSIRS reception + - Fill UCI for CSI measurement reporting * Scheduler procedures for SRS transmission - Periodic SRS transmission +* Bandwidth part (BWP) operation + - Operation in configured dedicated BWP through RRCSetup or RRCReconfiguration **UE RLC** diff --git a/doc/NR_SA_CN5G_gNB_B210_COTS_UE_Tutorial.md b/doc/NR_SA_CN5G_gNB_B210_COTS_UE_Tutorial.md new file mode 100644 index 0000000000..fc0700c699 --- /dev/null +++ b/doc/NR_SA_CN5G_gNB_B210_COTS_UE_Tutorial.md @@ -0,0 +1,227 @@ + + + + + +
+ + + + + + OAI 5G SA tutorial +
+ +**TABLE OF CONTENTS** + +1. [Scenario](#1-scenario) +2. [OAI CN5G](#2-oai-cn5g) + 1. [OAI CN5G pre-requisites](#21-oai-cn5g-pre-requisites) + 2. [OAI CN5G Setup](#22-oai-cn5g-setup) + 3. [OAI CN5G Configuration files](#23-oai-cn5g-configuration-files) + 4. [SIM Card](#24-sim-card) +3. [OAI gNB](#3-oai-gnb) + 1. [OAI gNB pre-requisites](#31-oai-gnb-pre-requisites) + 2. [Build OAI gNB](#32-build-oai-gnb) +4. [Run OAI CN5G and OAI gNB with USRP B210](#4-run-oai-cn5g-and-oai-gnb-with-usrp-b210) + 1. [Run OAI CN5G](#41-run-oai-cn5g) + 2. [Run OAI gNB](#42-run-oai-gnb) +5. [Testing with QUECTEL RM500Q](#5-testing-with-quectel-rm500q) + 1. [Setup QUECTEL](#51-setup-quectel) + 2. [Ping test](#52-ping-test) + 3. [Downlink iPerf test](#53-downlink-iperf-test) + + +# 1. Scenario +In this tutorial we describe how to configure and run a 5G end-to-end setup with OAI CN5G, OAI gNB and COTS UE. + +Minimum hardware requirements: +- Laptop/Desktop/Server for OAI CN5G and OAI gNB + - Operating System: [Ubuntu 20.04.4 LTS](https://releases.ubuntu.com/20.04.4/ubuntu-20.04.4-desktop-amd64.iso) + - CPU: 8 cores x86_64 @ 3.5 GHz + - RAM: 32 GB +- Laptop for UE + - Operating System: Microsoft Windows 10 x64 + - CPU: 4 cores x86_64 + - RAM: 8 GB + - Windows driver for Quectel MUST be equal or higher than version **2.2.4** +- [USRP B210](https://www.ettus.com/all-products/ub210-kit/) +- Quectel RM500Q + - Module, M.2 to USB adapter, antennas and SIM card + - Firmware version of Quectel MUST be equal or higher than **RM500QGLABR11A06M4G** + + +# 2. OAI CN5G + +## 2.1 OAI CN5G pre-requisites + +```bash +sudo apt install -y git net-tools putty + +sudo apt install -y apt-transport-https ca-certificates curl software-properties-common +curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - +sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" +sudo apt update +sudo apt install -y docker docker-ce + +# Add your username to the docker group, otherwise you will have to run in sudo mode. +sudo usermod -a -G docker $(whoami) +reboot + +# https://docs.docker.com/compose/install/ +sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose +sudo chmod +x /usr/local/bin/docker-compose +``` + +## 2.2 OAI CN5G Setup + +```bash +# Git oai-cn5g-fed repository +git clone https://gitlab.eurecom.fr/oai/cn5g/oai-cn5g-fed.git ~/oai-cn5g-fed + +# Pull docker images +docker pull oaisoftwarealliance/oai-amf:develop +docker pull oaisoftwarealliance/oai-nrf:develop +docker pull oaisoftwarealliance/oai-smf:develop +docker pull oaisoftwarealliance/oai-udr:develop +docker pull oaisoftwarealliance/oai-udm:develop +docker pull oaisoftwarealliance/oai-ausf:develop +docker pull oaisoftwarealliance/oai-spgwu-tiny:develop +docker pull oaisoftwarealliance/trf-gen-cn5g:latest + +# Tag docker images +docker image tag oaisoftwarealliance/oai-amf:develop oai-amf:develop +docker image tag oaisoftwarealliance/oai-nrf:develop oai-nrf:develop +docker image tag oaisoftwarealliance/oai-smf:develop oai-smf:develop +docker image tag oaisoftwarealliance/oai-udr:develop oai-udr:develop +docker image tag oaisoftwarealliance/oai-udm:develop oai-udm:develop +docker image tag oaisoftwarealliance/oai-ausf:develop oai-ausf:develop +docker image tag oaisoftwarealliance/oai-spgwu-tiny:develop oai-spgwu-tiny:develop +docker image tag oaisoftwarealliance/trf-gen-cn5g:latest trf-gen-cn5g:latest +``` + +## 2.3 OAI CN5G Configuration files +Download and copy configuration files: +- Copy [docker-compose-basic-nrf.yaml](tutorial_resources/docker-compose-basic-nrf.yaml) to `~/oai-cn5g-fed/docker-compose` +- Copy [oai_db.sql](tutorial_resources/oai_db.sql) to `~/oai-cn5g-fed/docker-compose/database` + +Change permissions on oai_db.sql to prevent mysql permission denied error: +```bash +chmod 644 ~/oai-cn5g-fed/docker-compose/database/oai_db.sql +``` + +## 2.4 SIM Card +Program SIM Card with [Open Cells Project](https://open-cells.com/) application [uicc-v2.6](https://open-cells.com/d5138782a8739209ec5760865b1e53b0/uicc-v2.6.tgz). + +```bash +sudo ./program_uicc --adm 12345678 --imsi 208990000000001 --isdn 00000001 --acc 0001 --key fec86ba6eb707ed08905757b1bb44b8f --opc C42449363BBAD02B66D16BC975D77CC1 -spn "OpenAirInterface" --authenticate +``` + + +# 3. OAI gNB + +## 3.1 OAI gNB pre-requisites + +### Build UHD from source +```bash +sudo apt install -y libboost-all-dev libusb-1.0-0-dev doxygen python3-docutils python3-mako python3-numpy python3-requests python3-ruamel.yaml python3-setuptools cmake build-essential + +git clone https://github.com/EttusResearch/uhd.git ~/uhd +cd ~/uhd +git checkout v4.0.0.0 +cd host +mkdir build +cd build +cmake ../ +make -j 4 +make test # This step is optional +sudo make install +sudo ldconfig +sudo uhd_images_downloader +``` + +## 3.2 Build OAI gNB + +```bash +# Get openairinterface5g source code +git clone https://gitlab.eurecom.fr/oai/openairinterface5g.git ~/openairinterface5g +cd ~/openairinterface5g +git checkout develop + +# Install dependencies in Ubuntu 20.04 +cd ~/openairinterface5g +source oaienv +cd cmake_targets +./build_oai -I + +# Build OAI gNB +cd ~/openairinterface5g +source oaienv +cd cmake_targets +./build_oai -w USRP --nrUE --gNB --build-lib all -c +``` + + +# 4. Run OAI CN5G and OAI gNB with USRP B210 + +## 4.1 Run OAI CN5G + +```bash +cd ~/oai-cn5g-fed/docker-compose +python3 core-network.py --type start-basic --scenario 1 +``` + +## 4.2 Run OAI gNB + +```bash +cd ~/openairinterface5g +source oaienv +cd cmake_targets/ran_build/build +sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf --sa -E --continuous-tx +``` + +Make sure that during USRP initialization, it shows that USB 3 is used. + +# 5. Testing with Quectel RM500Q + +## 5.1 Setup Quectel +With [PuTTY](https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe), send the following AT commands to the module using a serial interface (ex: COM2) at 115200 bps: +```bash +# MUST be sent at least once everytime there is a firmware upgrade! +AT+QMBNCFG="Select","ROW_Commercial" +AT+QMBNCFG="AutoSel",0 +AT+CFUN=1,1 +AT+CGDCONT=1 +AT+CGDCONT=2 +AT+CGDCONT=3 +AT+CGDCONT=1,"IP","oai" + +# (Optional, debug only, AT commands) Activate PDP context, retrieve IP address and test with ping +AT+CGACT=1,1 +AT+CGPADDR=1 +AT+QPING=1,"openairinterface.org" +``` + +## 5.2 Ping test +- UE host +```bash +ping 192.168.70.135 -n 1000 -S 12.1.1.2 +``` +- CN5G host +```bash +docker exec -it oai-ext-dn ping 12.1.1.2 +``` + +## 5.3 Downlink iPerf test +- UE host + - Download iPerf for Microsoft Windows from [here](https://iperf.fr/download/windows/iperf-2.0.9-win64.zip). + - Extract to Desktop and run with Command Prompt: +```bash +cd C:\Users\User\Desktop\iPerf\iperf-2.0.9-win64\iperf-2.0.9-win64 +iperf -s -u -i 1 -B 12.1.1.2 +``` + +- CN5G host +```bash +docker exec -it oai-ext-dn iperf -u -t 86400 -i 1 -fk -B 192.168.70.135 -b 125M -c 12.1.1.2 +``` diff --git a/doc/NR_SA_CN5G_gNB_N300_COTS_UE_Tutorial.md b/doc/NR_SA_CN5G_gNB_N300_COTS_UE_Tutorial.md new file mode 100644 index 0000000000..d68057fd08 --- /dev/null +++ b/doc/NR_SA_CN5G_gNB_N300_COTS_UE_Tutorial.md @@ -0,0 +1,244 @@ + + + + + +
+ + + + + + OAI 5G SA tutorial +
+ +**TABLE OF CONTENTS** + +1. [Scenario](#1-scenario) +2. [OAI CN5G](#2-oai-cn5g) + 1. [OAI CN5G pre-requisites](#21-oai-cn5g-pre-requisites) + 2. [OAI CN5G Setup](#22-oai-cn5g-setup) + 3. [OAI CN5G Configuration files](#23-oai-cn5g-configuration-files) + 4. [SIM Card](#24-sim-card) +3. [OAI gNB](#3-oai-gnb) + 1. [OAI gNB pre-requisites](#31-oai-gnb-pre-requisites) + 2. [Build OAI gNB](#32-build-oai-gnb) + 3. [N300 Ethernet Tuning](#33-n300-ethernet-tuning) +4. [Run OAI CN5G and OAI gNB with USRP N300](#4-run-oai-cn5g-and-oai-gnb-with-usrp-n300) + 1. [Run OAI CN5G](#41-run-oai-cn5g) + 2. [Run OAI gNB](#42-run-oai-gnb) +5. [Testing with QUECTEL RM500Q](#5-testing-with-quectel-rm500q) + 1. [Setup QUECTEL](#51-setup-quectel) + 2. [Ping test](#52-ping-test) + 3. [Downlink iPerf test](#53-downlink-iperf-test) + + +# 1. Scenario +In this tutorial we describe how to configure and run a 5G end-to-end setup with OAI CN5G, OAI gNB and COTS UE. + +Minimum hardware requirements: +- Laptop/Desktop/Server for OAI CN5G and OAI gNB + - Operating System: [Ubuntu 20.04.4 LTS](https://releases.ubuntu.com/20.04.4/ubuntu-20.04.4-desktop-amd64.iso) + - CPU: 8 cores x86_64 @ 3.5 GHz + - RAM: 32 GB +- Laptop for UE + - Operating System: Microsoft Windows 10 x64 + - CPU: 4 cores x86_64 + - RAM: 8 GB + - Windows driver for Quectel MUST be equal or higher than version **2.2.4** +- [USRP N300](https://www.ettus.com/all-products/USRP-N300/): Please identify the network interface(s) on which the N300 is connected. +- Quectel RM500Q + - Module, M.2 to USB adapter, antennas and SIM card + - Firmware version of Quectel MUST be equal or higher than **RM500QGLABR11A06M4G** + + +# 2. OAI CN5G + +## 2.1 OAI CN5G pre-requisites + +```bash +sudo apt install -y git net-tools putty + +sudo apt install -y apt-transport-https ca-certificates curl software-properties-common +curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - +sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" +sudo apt update +sudo apt install -y docker docker-ce + +# Add your username to the docker group, otherwise you will have to run in sudo mode. +sudo usermod -a -G docker $(whoami) +reboot + +# https://docs.docker.com/compose/install/ +sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose +sudo chmod +x /usr/local/bin/docker-compose +``` + +## 2.2 OAI CN5G Setup + +```bash +# Git oai-cn5g-fed repository +git clone https://gitlab.eurecom.fr/oai/cn5g/oai-cn5g-fed.git ~/oai-cn5g-fed + +# Pull docker images +docker pull oaisoftwarealliance/oai-amf:develop +docker pull oaisoftwarealliance/oai-nrf:develop +docker pull oaisoftwarealliance/oai-smf:develop +docker pull oaisoftwarealliance/oai-udr:develop +docker pull oaisoftwarealliance/oai-udm:develop +docker pull oaisoftwarealliance/oai-ausf:develop +docker pull oaisoftwarealliance/oai-spgwu-tiny:develop +docker pull oaisoftwarealliance/trf-gen-cn5g:latest + +# Tag docker images +docker image tag oaisoftwarealliance/oai-amf:develop oai-amf:develop +docker image tag oaisoftwarealliance/oai-nrf:develop oai-nrf:develop +docker image tag oaisoftwarealliance/oai-smf:develop oai-smf:develop +docker image tag oaisoftwarealliance/oai-udr:develop oai-udr:develop +docker image tag oaisoftwarealliance/oai-udm:develop oai-udm:develop +docker image tag oaisoftwarealliance/oai-ausf:develop oai-ausf:develop +docker image tag oaisoftwarealliance/oai-spgwu-tiny:develop oai-spgwu-tiny:develop +docker image tag oaisoftwarealliance/trf-gen-cn5g:latest trf-gen-cn5g:latest +``` + +## 2.3 OAI CN5G Configuration files +Download and copy configuration files: +- Copy [docker-compose-basic-nrf.yaml](tutorial_resources/docker-compose-basic-nrf.yaml) to `~/oai-cn5g-fed/docker-compose` +- Copy [oai_db.sql](tutorial_resources/oai_db.sql) to `~/oai-cn5g-fed/docker-compose/database` + +Change permissions on oai_db.sql to prevent mysql permission denied error: +```bash +chmod 644 ~/oai-cn5g-fed/docker-compose/database/oai_db.sql +``` + +## 2.4 SIM Card +Program SIM Card with [Open Cells Project](https://open-cells.com/) application [uicc-v2.6](https://open-cells.com/d5138782a8739209ec5760865b1e53b0/uicc-v2.6.tgz). + +```bash +sudo ./program_uicc --adm 12345678 --imsi 208990000000001 --isdn 00000001 --acc 0001 --key fec86ba6eb707ed08905757b1bb44b8f --opc C42449363BBAD02B66D16BC975D77CC1 -spn "OpenAirInterface" --authenticate +``` + + +# 3. OAI gNB + +## 3.1 OAI gNB pre-requisites + +### Build UHD from source +```bash +sudo apt install -y libboost-all-dev libusb-1.0-0-dev doxygen python3-docutils python3-mako python3-numpy python3-requests python3-ruamel.yaml python3-setuptools cmake build-essential + +git clone https://github.com/EttusResearch/uhd.git ~/uhd +cd ~/uhd +git checkout v4.0.0.0 +cd host +mkdir build +cd build +cmake ../ +make -j 4 +make test # This step is optional +sudo make install +sudo ldconfig +sudo uhd_images_downloader +``` + +## 3.2 Build OAI gNB + +```bash +# Get openairinterface5g source code +git clone https://gitlab.eurecom.fr/oai/openairinterface5g.git ~/openairinterface5g +cd ~/openairinterface5g +git checkout develop + +# Install dependencies in Ubuntu 20.04 +cd ~/openairinterface5g +source oaienv +cd cmake_targets +./build_oai -I + +# Build OAI gNB +cd ~/openairinterface5g +source oaienv +cd cmake_targets +./build_oai -w USRP --nrUE --gNB --build-lib all -c +``` + +## 3.3 N300 Ethernet Tuning + +Please also refer to the official [USRP Host Performance Tuning Tips and Tricks](https://kb.ettus.com/USRP_Host_Performance_Tuning_Tips_and_Tricks) tuning guide. + +The following steps are recommended. Please change the network interface(s) as required. Also, you should have 10Gbps interface(s): if you use two cables, you should have the XG interface. Refer to the [N300 Getting Started Guide](https://kb.ettus.com/USRP_N300/N310/N320/N321_Getting_Started_Guide) for more information. + +* Use an MTU of 9000: how to change this depends on the network management tool. In the case of Network Manager, this can be done from the GUI. +* Increase the kernel socket buffer (also done by the USRP driver in OAI): + ``` + sysctl -w net.core.rmem_max=8388608 + sysctl -w net.core.wmem_max=8388608 + sysctl -w net.core.rmem_default=65536 + sysctl -w net.core.wmem_default=65536 + ``` +* Increase Ethernet Ring Buffers: `sudo ethtool -G rx 4096 tx 4096` +* Disable hyper-threading in the BIOS +* Disable KPTI Protections for Spectre/Meltdown for more performance. **This is a security risk.** Add `mitigations=off nosmt` in your grub config and update grub. + +# 4. Run OAI CN5G and OAI gNB with USRP N300 + +## 4.1 Run OAI CN5G + +```bash +cd ~/oai-cn5g-fed/docker-compose +python3 core-network.py --type start-basic --scenario 1 +``` + +## 4.2 Run OAI gNB + +```bash +cd ~/openairinterface5g +source oaienv +cd cmake_targets/ran_build/build +sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.162PRB.2x2.usrpn300.conf --sa --usrp-tx-thread-config 1 +``` + + +# 5. Testing with Quectel RM500Q + +## 5.1 Setup Quectel +With [PuTTY](https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe), send the following AT commands to the module using a serial interface (ex: COM2) at 115200 bps: +```bash +# MUST be sent at least once everytime there is a firmware upgrade! +AT+QMBNCFG="Select","ROW_Commercial" +AT+QMBNCFG="AutoSel",0 +AT+CFUN=1,1 +AT+CGDCONT=1 +AT+CGDCONT=2 +AT+CGDCONT=3 +AT+CGDCONT=1,"IP","oai" + +# (Optional, debug only, AT commands) Activate PDP context, retrieve IP address and test with ping +AT+CGACT=1,1 +AT+CGPADDR=1 +AT+QPING=1,"openairinterface.org" +``` + +## 5.2 Ping test +- UE host +```bash +ping 192.168.70.135 -n 1000 -S 12.1.1.2 +``` +- CN5G host +```bash +docker exec -it oai-ext-dn ping 12.1.1.2 +``` + +## 5.3 Downlink iPerf test +- UE host + - Download iPerf for Microsoft Windows from [here](https://iperf.fr/download/windows/iperf-2.0.9-win64.zip). + - Extract to Desktop and run with Command Prompt: +```bash +cd C:\Users\User\Desktop\iPerf\iperf-2.0.9-win64\iperf-2.0.9-win64 +iperf -s -u -i 1 -B 12.1.1.2 +``` + +- CN5G host +```bash +docker exec -it oai-ext-dn iperf -u -t 86400 -i 1 -fk -B 192.168.70.135 -b 200M -c 12.1.1.2 +``` diff --git a/doc/RUNMODEM.md b/doc/RUNMODEM.md index 119027f169..2dc4fd2ff5 100644 --- a/doc/RUNMODEM.md +++ b/doc/RUNMODEM.md @@ -207,7 +207,24 @@ UE on machine 2: `sudo ./nr-uesoftmodem --if_freq 2169080000 --if_freq_off -400000000` +# MIMO configuration + + + + +
+ + +
+ +This image shows an example of gNB 5G MIMO logical antenna port configuration. It has to be noted that logical antenna ports might not directly correspond to physical antenna ports and each logical antenna port might consist of a sub-array of antennas. + +The basic element is a dual-polarized antenna, therefore the minimal DL MIMO setup with two logical antenna ports would consist of two cross-polarized antenna elements. In a single panel configuration, as the one in the picture, this element can be repeated vertiacally and/or horizontally to form an equi-spaced 1D or 2D array. The values N1 and N2 represent the number of antenna ports in the two dimensions and the supported configurations are specified in Section 5.2.2.2.1 of TS 38.214. + +The DL logical antenna port configuration can be selected through configuration file. `pdsch_AntennaPorts_N1` can be used to set N1 parameter, `pdsch_AntennaPorts_N2` to set N2 and `pdsch_AntennaPorts_XP` to set the cross-polarization configuration (1 for single pol, 2 for cross-pol). To be noted that if XP is 1 but N1 and/or N2 are larger than 1, this would result in a non-standard configuration and the PMI selected would be the identity matrix regardless of CSI report. The default value for each of these parameters is 1. + +# Additional links [Selecting an alternative ldpc implementation at run time](../openair1/PHY/CODING/DOC/LDPCImplementation.md) diff --git a/doc/RUN_NR_multiple_BWPs.md b/doc/RUN_NR_multiple_BWPs.md new file mode 100644 index 0000000000..2c2c2fcf25 --- /dev/null +++ b/doc/RUN_NR_multiple_BWPs.md @@ -0,0 +1,51 @@ +# Procedure to add dedicated Bandwidth part (BWP) + +## Contributed by 5G Testbed IISc + +### Developers: Abhijith A, Shruthi S + +# Terminology # + +## Bandwidth part (BWP) ## +Bandwidth Part (BWP) is a set of contiguous Resource Blocks in the resource grid. + +Parameters of a BWP are communicated to UE using RRC parameters: BWP-Downlink and BWP-Uplink. + +A UE can be configured with a set of 4 BWPs in uplink (UL) and downlink (DL) direction (3GPP TS 38.331 Annex B.2 Description of BWP configuration options). But only 1 BWP can be active in UL and DL direction at a given time. + +# Procedure to run multiple dedicated BWPs # + +A maximum of 4 dedicated BWPs can be configured for a UE. + +To configure multiple BWPs, add the following parameters to the gNB configuration file under "servingCellConfigDedicated": + +## Setup of the Configuration files ## +``` + firstActiveDownlinkBWP-Id = 1; #BWP-Id + defaultDownlinkBWP-Id = 1; #BWP-Id + firstActiveUplinkBWP-Id = 1; #BWP-Id +``` + +Each dedicated BWP must have: +``` + # BWP 1 Configuration + dl_bwp-Id_1 = 1; + dl_bwp1_locationAndBandwidth = 28875; // RBstart=0, L=106 (40 MHz BW) + # subcarrierSpacing + # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + dl_bwp1_subcarrierSpacing = 1; +``` + + Find these parameters in this configuration file: "targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf" + +# Testing gNB and UE in RF simulator + +## gNB command: +``` + sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf --gNBs.[0].min_rxtxtime 6 --rfsim --sa +``` + +## UE command: +``` + sudo RFSIMULATOR=127.0.0.1 ./nr-uesoftmodem -r 106 --numerology 1 --band 78 -C 3619200000 --nokrnmod --rfsim --sa --uicc0.imsi 208990000000001 +``` \ No newline at end of file diff --git a/doc/TESTBenches.md b/doc/TESTBenches.md index 7365bc0f4c..c6a01f278d 100644 --- a/doc/TESTBenches.md +++ b/doc/TESTBenches.md @@ -1,45 +1,167 @@ ## Table of Contents ## -1. [Legacy 1 Bench](#legacy-1-bench) -2. [Legacy 2 Bench](#legacy-2-bench) -3. [Next Bench for DEV](#next-bench-for-dev) -4. [Next Bench for CI](#next-bench-for-ci) -5. [Indoor Live Network Bench](#indoor-live-network-bench) -6. [Outdoor Live Network Bench](#outdoor-live-network-bench) +1. [Machines](#machines) +2. [Networked devices](#networked-devices) +3. [Testbenches](#testbenches) +4. [Pipelines](#pipelines) + +## Machines + +| Machine | IP address | Lockable Resource | Function | Connected devices | +| ------------- | --------------- | --------------------- | ------------------ | ----------------------------------------------------- | +| asterix | 172.21.16.127 | CI-Asterix-Usage | gNB (n78) | 173.21.19.14 | +| obelix | 172.21.16.128 | CI-Obelix-Usage | eNB (n40, n78), nrUE | 172.21.19.13, X300 (192.168.60.2), B200mini (30C51EB) | +| porcepix | 172.21.16.136 | CI-NSA-MiniBench | Executor, EPC, 5GC | -- | +| nrmodule2 | 172.21.16.139 | CI-NSA-MiniBench | Quectel | Quectel module | +| nepes | 172.21.16.137 | CI-NSA-MiniBench | gNB (n78) | B200mini (30C51D4) | +| caracal | 172.21.16.132 | CI-Caracal | gNB/phytest | N300 (192.168.10.2) | +| idefix | 172.21.16.135 | CI-NSA-MiniBench | Quectel | Quectel module | +| amariue | 172.21.16.144 | CI-Amarisoft-UE-Usage | nrUE | Amarisoft UE simulator | +| bellatrix | 192.168.117.115 | CI-RAN-VM-Deployment | Executor | -- | +| nano | 192.168.12.62 | CI-Bench-1-Phones | EPC, adb | 2x COTS (adb) | +| hutch | 192.168.12.19 | CI-Bench-1-Phones | eNB (B7) | B200mini (30C5239) | +| starsky | 192.168.12.18 | CI-Bench-1-Phones | eNB (B40) | b200mini (30A3E3C) | +| carabe | 192.168.12.211 | CI-Bench-2-OAI-Phone | UE (B7UE) | B200mini (30AE8C9) | + +Note: The available resources, and their current usage, is indicated here: +- [Lockable resources of jenkins-oai](https://jenkins-oai.eurecom.fr/lockable-resources/): + "New" Jenkins, i.e., with RAN-Container-Parent +- [Lockable resources of open5glab jenkins](https://open5glab.eurecom.fr:8083/jenkins/lockable-resources/): + "Old" Jenkins, i.e., with RAN-CI-Develop + +## Networked devices + +| Type | IP address (mgmt) | +| ------------- | ----------------- | +| USRP N310 | 172.21.19.14 | +| USRP N310 | 172.21.19.13 | + +## Testbenches + +### OTA Testbench + +**Purpose**: Over-the-air 4G/5G (NSA/SA) tests + +Note: obelix and porcepix are both used in the OTA testbench and the 5G +NSA/Faraday Cage testbench! + +![5G OTA Testbench](testbenches_doc_resources/5g-ota-bench.png) + +[PDF version](testbenches_doc_resources/5g-ota-bench.pdf) | [LaTeX/TikZ version](testbenches_doc_resources/5g-ota-bench.tex) if you want to modify to reflect your setup + +### 5G NSA/Faraday Cage Testbench + +**Purpose**: Faraday cage 5G tests + +Note: obelix and porcepix are both used in the OTA testbench and the 5G +NSA/Faraday Cage testbench! + +![5G NSA/Faraday Cage Testbench](testbenches_doc_resources/5g-nsa-faraday-bench.png) + +[PDF version](testbenches_doc_resources/5g-nsa-faraday-bench.pdf) | [LaTeX/TikZ version](testbenches_doc_resources/5g-nsa-faraday-bench.tex) if you want to modify to reflect your setup + +### 4G Testbench(es) + +**Purpose**: 4G/LTE testbenches -## Legacy 1 Bench +![4G Faraday Cage Testbench](testbenches_doc_resources/4g-faraday-bench.png) -**Purpose** : FDD Band 7 and Band 13, LTE-M -**Note** : Legacy1 and Legacy2 are duplicated so that they can run in parallel, thus avoiding a CI bottleneck -**Note** : Faraday Cages 1 and 2 are physically the same cage +[PDF version](testbenches_doc_resources/4g-faraday-bench.pdf) | [LaTeX/TikZ version](testbenches_doc_resources/4g-faraday-bench.tex) if you want to modify to reflect your setup -![image info](./testbenches_doc_resources/legacy1.jpg) +## Pipelines -## Legacy 2 Bench +### [RAN-Container-Parent](https://jenkins-oai.eurecom.fr/job/RAN-Container-Parent/) -**Purpose** : TDD Band 40, TM2 2xTX 2xRX -**Note** : CN can run in a container, could also run on Massive +**Purpose**: automatically triggered tests on MR creation or push, from Gitlab +Webhook -![image info](./testbenches_doc_resources/legacy2.jpg) +- [RAN-cppcheck](https://jenkins-oai.eurecom.fr/job/RAN-cppcheck/1664/) + - obelix + - performs static code analysis, currently not actively enforced +- [RAN-gNB-nrUE-MONO-TDD-Band78-N300](https://jenkins-oai.eurecom.fr/job/RAN-gNB-nrUE-MONO-TDD-Band78-N300/) + - caracal + N310 + - pure performance test through phy-test scheduler, see command line for more + details +- [RAN-L2-Sim-Test-5G](https://jenkins-oai.eurecom.fr/job/RAN-L2-Sim-Test-5G/) + - obelix (gNB, 1x UE, OAI 5GC) + - L2simulator: skips physical layer and uses proxy between gNB and UE, + currently only ping +- [RAN-NSA-B200-Module-LTEBOX-Container](https://jenkins-oai.eurecom.fr/job/RAN-NSA-B200-Module-LTEBOX-Container/) + - obelix + B200, nepes + B200, idefix + Quectel, porcepix w/ ltebox + - basic NSA test +- [RAN-SA-B200-Module-SABOX-Container](https://jenkins-oai.eurecom.fr/job/RAN-SA-B200-Module-SABOX-Container/) + - obelix + B200, nepes + B200, idefix + Quectel, porcepix w/ sabox + - basic SA test (40 MHz TDD) +- [RAN-PhySim-Cluster](https://jenkins-oai.eurecom.fr/job/RAN-PhySim-Cluster/) + - asterix (`Asterix-OC-oaicicd-session` resource), tests in OpenShift Cluster + - unitary simulators (`nr_dlsim`, etc.) +- [RAN-RF-Sim-Test-4G](https://jenkins-oai.eurecom.fr/job/RAN-RF-Sim-Test-4G/) + - obelix (eNB, 1x UE, OAI EPC) + - uses RFsimulator, for FDD 5, 10, 20MHz with core, 5MHz noS1 +- [RAN-RF-Sim-Test-5G](https://jenkins-oai.eurecom.fr/job/RAN-RF-Sim-Test-5G/) + - obelix (gNB, 2x UE, OAI 5GC) + - uses RFsimulator, TDD 40MHz, FDD 40MHz, F1 split +- [RAN-RHEL8-Image-Builder](https://jenkins-oai.eurecom.fr/job/RAN-RHEL8-Image-Builder/) + - asterix: RHEL 8 image build using podman +- [RAN-Ubuntu18-Image-Builder](https://jenkins-oai.eurecom.fr/job/RAN-Ubuntu18-Image-Builder/) + - obelix: Ubuntu 18 image build using docker -## Next Bench for DEV +### [RAN-CI-NSA-Trigger](https://jenkins-oai.eurecom.fr/view/RAN/job/RAN-CI-NSA-Trigger/) -**Note** : Benetel CI can also run on this bench at night +**Purpose**: longer-running over-the-air LTE, NSA, and SA tests, triggered +through cron job at midnight -![image info](./testbenches_doc_resources/next_dev.jpg) +- [RAN-LTE-2x2-Module-OAIEPC](https://jenkins-oai.eurecom.fr/job/RAN-LTE-2x2-Module-OAIEPC/) + - obelix + N310, nrmodule2 + Quectel, porcepix w/ Magma EPC + - LTE 2x2 test with TM1 and TM2 +- [RAN-NSA-B200-Module-LTEBOX](https://jenkins-oai.eurecom.fr/job/RAN-NSA-B200-Module-LTEBOX/) + - obelix + B200 (eNB), nepes + B200 (gNB), idefix + Quectel, porcepix w/ ltebox + - Note: like [RAN-NSA-B200-Module-LTEBOX-Container](https://jenkins-oai.eurecom.fr/job/RAN-NSA-B200-Module-LTEBOX-Container/) above, but compiled/run from source +- [RAN-NSA-2x2-Module-OAIEPC](https://jenkins-oai.eurecom.fr/job/RAN-NSA-2x2-Module-OAIEPC/) + - obelix + N310 (eNB), asterix + N310 (gNB), nrmodule2 + Quectel, porcepix w/ Magma EPC + - LTE 2x2 and NR 2x2 (non-standalone) +- [RAN-SA-Module-CN5G](https://jenkins-oai.eurecom.fr/view/RAN/job/RAN-SA-Module-CN5G/) + - asterix + N310 (gNB), nrmodule2 + Quectel, porcepix w/ OAI 5GC + - NR 2x2 (standalone) +- [RAN-SA-OAIUE-N310-X300-CN5G](https://jenkins-oai.eurecom.fr/job/RAN-SA-OAIUE-N310-X300-CN5G/) + - asterix + N310 (gNB), obelix + N310 or X300 (5G UE), porcepix w/ OAI 5GC + - OTA test with OAIUE using both N310 and X300 +- [RAN-SA-AmariS-CN5G](https://jenkins-oai.eurecom.fr/view/RAN/job/RAN-SA-AmariS-CN5G/) + - asterix + N310, amariue (1x UE), porcepix w/ OAI 5GC + - Amarisoft UE simulator: expected to be increased to more UEs +### [RAN-CI-develop](https://open5glab.eurecom.fr:8083/jenkins/job/RAN-CI-develop/) -## Next Bench for CI +**Purpose**: automatically triggered tests, mostly 4G, to be phased out and +integrated into RAN-Container-Parent -**Note** : The current test running on Caracal could run on this bench with a N300/N300 setup +runs tests: +- bellatrix: runs 4G/5G simulators directly (eNB + 1x UE + (opt.) OAI EPC, gNB + 1x UE in "noS1") -![image info](./testbenches_doc_resources/next_ci.jpg) - -## Indoor Live Network Bench - -![image info](./testbenches_doc_resources/indoor_live.jpg) - -## Outdoor Live Network Bench - -![image info](./testbenches_doc_resources/outdoor_live.jpg) +triggers pipelines: +- [eNB-CI-F1-FDD-Band7-B210](https://open5glab.eurecom.fr:8083/jenkins/job/eNB-CI-F1-FDD-Band7-B210/) + - hutch + B210, nano w/ ltebox + 2x UE + - tests 4G FDD with F1 split, 5MHz, 10MHz, 20MHz. 5MHz stable, rest known to + be unstable +- [eNB-CI-FDD-Band7-B210](https://open5glab.eurecom.fr:8083/jenkins/job/eNB-CI-FDD-Band7-B210/) + - hutch + B210, nano w/ ltebox + 2x UE + - tests T tracer, information through FlexRAN, RRC inactivity timers, + inactivity timers + FlexRAN, different bandwidths +- [eNB-CI-IF4p5-FDD-Band7-B210](https://open5glab.eurecom.fr:8083/jenkins/job/eNB-CI-IF4p5-FDD-Band7-B210/) + - hutch + B210, nano w/ ltebox + 2x UE + - tests IF4.5 split over bandwidths 5, 10, 20 MHz in Band 7 +- [eNB-CI-IF4p5-TDD-Band40-B210](https://open5glab.eurecom.fr:8083/jenkins/job/eNB-CI-IF4p5-TDD-Band40-B210/) + - starsky + B210, nano w/ ltebox + 2x UE + - tests IF4.5 split over bandwidths 5, 10, 20 MHz in Band 40 +- [eNB-CI-TDD-Band40-B210](https://open5glab.eurecom.fr:8083/jenkins/job/eNB-CI-TDD-Band40-B210/) + - starsky + B210, nano w/ ltebox + 2x UE + - T tracer, TM1 over bandwidths 5, 10, 20 MHz in Band 40, default scheduler + for 20 MHz +- [eNB-UE-CI-MONO-FDD-Band7-B200](https://open5glab.eurecom.fr:8083/jenkins/job/eNB-UE-CI-MONO-FDD-Band7-B200/) + - hutch + B210 (eNB), carabe + B210 (4G UE), nano w/ ltebox + - tests OAI 4G for 5 MHz/TM1 with both CN and in noS1 model, MBMS; known to + be unstable +- [UE-CI-FDD-Band20-B200](https://open5glab.eurecom.fr:8083/jenkins/job/UE-CI-FDD-Band20-B200/) + - starsky + B210 (sniffer) + - Sniff MIB + SIB1 of Orange, SFR diff --git a/doc/TESTING_5GSA_setup.md b/doc/TESTING_5GSA_setup.md index 9b27549df4..357c62c813 100644 --- a/doc/TESTING_5GSA_setup.md +++ b/doc/TESTING_5GSA_setup.md @@ -50,7 +50,7 @@ At the moment of writing this document interoperability with the following COTS ## 1.1 gNB build and configuration To get the code and build the gNB executable: -### Ubuntu 18.04 +### Build gNB ```bash git clone https://gitlab.eurecom.fr/oai/openairinterface5g.git git checkout develop @@ -61,42 +61,6 @@ To get the code and build the gNB executable: ./build_oai --gNB -w USRP ``` -### Ubuntu 20.04 -```bash - # Build UHD from source - # https://files.ettus.com/manual/page_build_guide.html - sudo apt-get install libboost-all-dev libusb-1.0-0-dev doxygen python3-docutils python3-mako python3-numpy python3-requests python3-ruamel.yaml python3-setuptools cmake build-essential - - git clone https://github.com/EttusResearch/uhd.git - cd uhd/host - mkdir build - cd build - cmake ../ - make -j 4 - make test # This step is optional - sudo make install - sudo ldconfig - sudo uhd_images_downloader - - - git clone https://gitlab.eurecom.fr/oai/openairinterface5g.git - git checkout develop - - # Install dependencies in Ubuntu 20.04 - cd - cd openairinterface5g/ - source oaienv - cd cmake_targets/ - ./install_external_packages.ubuntu20 - - # Build OAI gNB - cd - cd openairinterface5g/ - source oaienv - cd cmake_targets/ - ./build_oai --gNB -w USRP -``` - A reference configuration file for the **monolithic** gNB is provided [here](https://gitlab.eurecom.fr/oai/openairinterface5g/-/blob/develop/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf). diff --git a/doc/UL_MIMO.txt b/doc/UL_MIMO.txt new file mode 100644 index 0000000000..c06bc78c4c --- /dev/null +++ b/doc/UL_MIMO.txt @@ -0,0 +1,31 @@ +# how to build phy sim +cd cmake_targets/ +sudo ./build_oai --phy_simulators -c + +cd phy_simulators/build/ +# ULSCH sim +# bit level validation +# PUSCH encoding and decoding for 4 layers 2 CMD without data +sudo ./nr_ulschsim -R 106 -m9 -s13 -n100 -y4 -z4 -W4 + +# UL sim +# Uplink chain validation +# PUSCH on UE side and gNB side,whole chain for PUSCH +# No channel model on data domain signal +# No cross-path connection +# PMI = 0 is only unitary prcoding matrix +sudo ./nr_ulsim -n100 -m9 -r106 -s13 -W4 -y4 -z4 + +# How to build rfsim +sudo ./build_oai -c --gNB --nrUE -w SIMU + +# How to run with rfsim +# 4x4 RANK 4 +sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.4layer.conf --rfsim --phy-test --l 2 --L 4 +sudo ./nr-uesoftmodem --rfsim --phy-test --ue-nb-ant-rx 4 --ue-nb-ant-tx 4 +# 4x4 RANK 2 +sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.4layer.conf --rfsim --phy-test --l 2 --L 2 +sudo ./nr-uesoftmodem --rfsim --phy-test --ue-nb-ant-rx 4 --ue-nb-ant-tx 4 + + + diff --git a/doc/images/mimo_antenna_ports.png b/doc/images/mimo_antenna_ports.png new file mode 100644 index 0000000000000000000000000000000000000000..ef91f4becc80fe6c09b55f202f9d8054368bd88c GIT binary patch literal 18753 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

U^jvkQkX}oYqF9J@~lgByn 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 literal 0 HcmV?d00001 diff --git a/doc/testbenches_doc_resources/4g-faraday-bench.tex b/doc/testbenches_doc_resources/4g-faraday-bench.tex new file mode 100644 index 0000000000..6071c89947 --- /dev/null +++ b/doc/testbenches_doc_resources/4g-faraday-bench.tex @@ -0,0 +1,59 @@ +\documentclass{standalone} + +\usepackage{tikz} +\usetikzlibrary{backgrounds, positioning, shapes.symbols} +\usepackage{helvet} +\renewcommand*{\rmdefault}{\sfdefault} + +\begin{document} +\begin{tikzpicture} + [ + font=\footnotesize, + faraday/.style={minimum size=3cm, draw, dashed}, + duplexer/.style={draw,fill=white}, + ] + + \node[faraday, label={[anchor=south west]above left:Faraday cage}] (faraday) {}; + + \node[above left=0cm and 2.8cm of faraday, label=above:hutch] (hutch) + {\includegraphics[width=1.2cm]{server}}; + \node[right=0.3cm of hutch, label=above:B210] (b210h) + {\includegraphics[width=1.2cm]{b210}} edge (hutch); + \node[below left=0.35cm of faraday.north east] (anto) + {\includegraphics[width=0.3cm]{antenna}}; + \draw (b210h) -| node [pos=0.25, duplexer] {B7} (anto); + + \node[below left=0cm and 2.8cm of faraday, label=above:starsky] (starsky) + {\includegraphics[width=1.2cm]{server}}; + \node[right=0.3cm of starsky, label=above:B210] (b210s) + {\includegraphics[width=1.2cm]{b210}} edge (starsky); + \draw (hutch) -- (b210h); + \node[above left=0.35cm of faraday.south east] (antn) + {\includegraphics[width=0.3cm]{antenna}}; + \draw (b210s) -| node [pos=0.35, duplexer] {B40} (antn); + \node[below right=-0.2cm and 0.8cm of b210s] (antn2) + {\includegraphics[width=0.3cm]{antenna}}; + \draw (b210s) -| (antn2); + + \node[left=5cm of faraday, label=above:nano] (nano) + {\includegraphics[width=1.2cm]{server}}; + \draw (hutch) -- (nano); + \draw (starsky) -- (nano); + \node[above right=0.0cm and 0.35cm of faraday.west] (phone1) + {\includegraphics[height=0.5cm]{phone}}; + \node[below right=0.0cm and 0.35cm of faraday.west] (phone2) + {\includegraphics[height=0.5cm]{phone}}; + \draw (nano) -- node[above] {USB/adb} +(5cm,0) |- (phone1); + \draw (nano) -- +(5cm,0) |- (phone2); + + \node[right=1.5cm of faraday, label=above:B210] (b210c) + {\includegraphics[width=1.2cm]{b210}}; + \node[left=.5cm of faraday.east] (antc) + {\includegraphics[width=0.3cm]{antenna}}; + \draw (b210c) -- node [pos=0.35, duplexer] {B7UE} (antc); + \node[right=0.7cm of b210c, label=above:carabe] (carabe) + {\includegraphics[width=1.2cm]{server}} + edge (b210c); + +\end{tikzpicture} +\end{document} diff --git a/doc/testbenches_doc_resources/5g-nsa-faraday-bench.pdf b/doc/testbenches_doc_resources/5g-nsa-faraday-bench.pdf new file mode 100644 index 0000000000000000000000000000000000000000..1b921e64370954673e45ed70ff1643462f4774ed GIT binary patch literal 337509 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 z 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 z z-Mz0|IBhkeq43}0&ByTj>3u)UeahU2YjXY@%KSG9g5Z1j=%Y*NSy>{fSdtK*oS{lq zrH3-CnA|8jn?++s&?AtZr=am|sBk`nhC2`j1;V~&T)J}k(iKSmW1k$&kC-=a&Xbd#_{$TI zKK|t6e|h4uSu-Aw;cl)fRhQ-^UB2|Ud$+#6_0<=E?yoL?@YUr@AjQ81HIAbxpvJ$3 z6STPbPqe;?Nq+0APl<(sGvU9W+so}6K3V=HhWr;en)oRy@Btl;JEeT~(K}@ZcA`ck zR7D2~S-|jheCA@t=5%YRwy#aBP=F$B*weSNw}#SN7t&j|vCFe;SNrNtS6V^ptgY1# zwV6Uq8cvBSLYEO$kV*-o1D~nL-;NBUF}YkmpDzF%&Spii*ilp}lZxmaPQx&V9RSYZ z@IZ&t!`W-r2dtw8i!u{pU6n$eT0j!xnpC92^HPE2k|LFuFdUs{igoHZQok+ zCyfmYj|ierNf{0w7h3XoBzz(zaTJ2_Xr!*axW-CbgjF{R9HQ%dWONgyjcJdTEMvrR zGFc*^8|!fICwc{Zv^a26$Wzm1Oqw)RCRfP4-LcY_tzBK!U{ADFR4#? zy5cC80#e*jSXuV{&9}yW{uGcqyuJSN&D(dzJIa3Z)4#qO?}g%7HzU-~O?lz;{zH9rALwom+?An!?mAP|tUyj?Z zud6<{cbh=U@9pnNPfJ0;LTqj$M

uE>BKPQ)Oo5XtjlD>8he4ogyV&qtT|MC}ZQ3 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

pTE0y{`9Tqo@H9~BELfz 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\ijCWyR>&-_G_f4Gk@^ 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 literal 0 HcmV?d00001 diff --git a/doc/testbenches_doc_resources/5g-nsa-faraday-bench.tex b/doc/testbenches_doc_resources/5g-nsa-faraday-bench.tex new file mode 100644 index 0000000000..a9f12fe3df --- /dev/null +++ b/doc/testbenches_doc_resources/5g-nsa-faraday-bench.tex @@ -0,0 +1,55 @@ +\documentclass{standalone} + +\usepackage{tikz} +\usetikzlibrary{backgrounds, positioning, shapes.symbols} +\usepackage{helvet} +\renewcommand*{\rmdefault}{\sfdefault} + +\begin{document} +\begin{tikzpicture} + [ + font=\footnotesize, + faraday/.style={minimum size=3cm, draw, dashed}, + duplexer/.style={draw,fill=white}, + ] + + \node[faraday, label={[anchor=south east]above right:Faraday cage}] (faraday) {}; + + \node[above left=0cm and 2.8cm of faraday, label=above:obelix] (obelix) + {\includegraphics[width=1.2cm]{server}}; + \node[right=0.3cm of obelix, label=above:B200-mini] (b210o) + {\includegraphics[width=1.2cm]{b200-mini}} edge (obelix); + \node[below right=0.35cm of faraday.north west] (anto) + {\includegraphics[width=0.3cm]{antenna}}; + \draw (b210o) -| node [pos=0.2, duplexer] {B7} (anto); + + \node[below left=0cm and 2.8cm of faraday, label=above:nepes] (nepes) + {\includegraphics[width=1.2cm]{server}}; + \node[right=0.3cm of nepes, label=above:B200-mini] (b210n) + {\includegraphics[width=1.2cm]{b200-mini}} edge (nepes); + \draw (obelix) -- (b210o); + \node[above right=0.35cm of faraday.south west] (antn) + {\includegraphics[width=0.3cm]{antenna}}; + \draw (b210n) -| node [pos=0.2, duplexer] {n78} (antn); + + \node[left=5cm of faraday, label=above:porcepix] (porcepix) + {\includegraphics[width=1.2cm]{server}}; + \draw (obelix) -- (porcepix); + \draw (nepes) -- (porcepix); + + \node[right=1.5cm of faraday, label=above:RM500Q-GL] (quectel) + {\includegraphics[height=1.2cm]{quectel}}; + \node[above left=-0.1cm and 0.2cm of faraday.east] (aq2) + {\includegraphics[width=0.3cm]{antenna}} edge (quectel); + \node[above=-0.2cm of aq2] (aq1) + {\includegraphics[width=0.3cm]{antenna}} edge (quectel); + \node[below=-0.2cm of aq2] (aq3) + {\includegraphics[width=0.3cm]{antenna}} edge (quectel); + \node[below=-0.2cm of aq3] + {\includegraphics[width=0.3cm]{antenna}} edge (quectel); + \node[right=1cm of quectel, label=above:idefix] (idefix) + {\includegraphics[width=1.2cm]{server}} + edge (quectel); + +\end{tikzpicture} +\end{document} diff --git a/doc/testbenches_doc_resources/5g-ota-bench.pdf b/doc/testbenches_doc_resources/5g-ota-bench.pdf new file mode 100644 index 0000000000000000000000000000000000000000..121969030e64e03ac0e4fedc9ba4fc1c692de71c GIT binary patch literal 232400 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 z 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�J6RUZ%HVm?8#`cb_+qV}jU)E`N+P!0Pmlcf5lQ!V3n2Ooy4KUouI61%F8$ zM$+{+>Ndqw@O~@0{+|Kt@CD0HnDBNYbThr3*&tt{(h6nr?2DWOhX;_KN}UM?0x{Cq z6pu#7fyPI|(Jy}SOD|r#&T0)*u745O^=Y3EsC#5Q>JJ!z$tO;{ut=$yl7( zY`ADcIRA~8gu9+8_43gpMLI(U-XAUXU?CWU%Ujn1$f?9zWNn-A}l8G z!n3o0<`*g2PlO}k@o~6~#Nx3eX~!ZYpKMRgou8p-Puj2M<}P2k444le=^Fi+S^1dh zOR%5-&4+(oR=~Y51KWX1K=KzZU0b~JB9Qz=VE9*GnqP#a;ib#hUIxr3O8)HS^D~Q6 zXXhlzk4$ijW+;l>BVm;`FEWAS0%N5~gZluP#KCbjs-Zo~G{B~GRi#zDI+6_HcwPmb z0(&D|A<^feCXnx4#VJUV&qN#QkW6tb6(Wyrxs=WylP@$y7sM&G7J}EPkNoF!7dH>$~oTFotnLGF1 zcjvYEscNy|0NaD<-SGJ)M zJJ>Z8lV@x4Y#uJ7K^vP}SS_fuZX;`@rzxo@b0d4)27z=M*lX&M2vb=jc1i1us7|9j zgY8(Wk)1q$(VxQ&36BVmj*gB`NJ!a=M^U4()Hsikg7>(Ttw54z&YI=r@4vxw^Q_sk z0NaMrvL*$AK2#yau!aQ~ zN@+)I8q4Ewt=rsv{l<;L;$pExsx=sZ1Y-%s+1Cd|+DyduK~yS5ZW;j6{GvkmS6yba z-eBmrTAP(E1kZ056yWW^Ao*Q`l&NNrY#HDSazCW}+HbQ(#zb)iyue^i5TDBt@Hl)P zSICb`N_^|U{tH*H+%77tsjY2Rsf=A_JaN{6_YIEWVWjq$Oh#CX^|;>_RwB7v0f(x! z745%p;17~?I#DMv5%7tUkE}s>p8}5){Y5tW5Ymp&qo>UIeO5Cn*Y@@xdf#X6=|`B~ z2O9xLzuk#QzRlTZMOS)I-hvGPACdgFE|sQJp#;F!6ZKd^%CZ27R5_C7@NAyXXz6S= zE+02smE~`AWgtu#a?Myo*cmb`n++R3wG*uJ41Z?L+H(z=Vs}Nkyq#2g6uV37p&?Ms zT8e=;Yo+52_H4D^wN9~_c{9BLO}u}XWQ1Xvm5>H^(&B<;(wEdYK0M7;?{0QUQc^}) zB0CNRJEmr$hR;eW(2!ApR051#;{x_^MjDoEj(-=cQ%S|B=;HB2-Q|{HccjWD7#$I$ zqkI??y)LP!ZUA6sL>PkY1k$U>ObyB{gOIbgKAf~^NEP_Ml5%ArGtu3o)bQBg5rUJ~g`V%yjMh9Bl( zVE-301pWa!4Euo11=3_t-<5%YGd935nmL8`Oi2`0w9@iYsZ5$*P;lb($&;r}9y#{z z*|hVwvU92cV3n<~{z;@VtKH!o9&S=7;2$Cnq`?4p(yUb4@E)hGp<#Grgfv5;#;B1I zq-c$d5HSX8Gg!UHTLAdy!6AGOpgKBv+>l^^cL4c7ID=n|d&+`ynUPTD^|e%LgvfwStlY^j7Dp+NjF zGFIy-+lwx9jmFk8)lw>XhAyGH5LC>`HKJTW6ep>1TfxU%Mz zPw+qzNnb;_I(u-^IO@)>hsso>A}}tMoj^K1>FL#~aU+vh#Z%Y(Q#wYVPKwT2v7(Y; z=CzGA6tGJf(q2h5qEcbZw$C`{kFZiXEtENt$CX9-HZqcH-^XJ2r*^kb7Zt+5Xc=)8rlUJ@? z;}^u4HhtP=A0NM)5elSy@>P4Gpb?;NgZ-;&LQ?NyPQ>H^yrGwQ!i96k-0s zIt=^x)vvyg$rQ+J-qwaWwTnL^V8KlY7)z&fQd@A%7KZxtf|R4G)&1a=)@-Z!2wFr!K8g? zXqapn09O-}62y(-`iAE2^(rNf5+=*G@WY{gdry_d;kN|djl z!gX^aVfbbo!hox{U8LCxB`csE+yDt`7#SJCSCJPKevDk2{Yc(1cJ%<&H<^0@@PXa~ z$?vlc^xK^1v=3SB!>EAUKhWJ{Bk4LSol&XoAS9m}SIQce!7k%U=tLUEW-n#Wp>`Eg z$CGo)@i;DIhJjFtOS;jq3YspLJFDb6&REEbSzzTAjEi4jiTnx|Z)X`D>BcB}C1UWL z==N+)M#ea27?Gd82Uiyo?Yd!48(|f8Dfx)pKis{L!3|D8;*XyYfcqsC#vRVv`y|Px! zcET`pol1tOr&3}L96rY31&hKX!=s{OlakPU($sAT+qWZBPu{+rgzLtoY>iJ%1FN)OA&9!nhb^NbeKRCwy#H`j-+^!`UPAawgco0iHPK& zIw>A(N+u=2WhhE?3=IoQPD*;~t+&pdJ6Bj(NIuu_F(+kHCLe}q(SOap{;oDW_8UGcK$Wu^nN%Oa^2XU=3goeyY}J0Dj?1aifG_ zHNYU@w7_}QYISW*O>S<^g$rp14(>a7=G67fn-{NMX;G=$jYdUt3!web@GwC_=MafC zaFR|avR{D3G&?Vs6k91-9(~^d7^`em*4CmsKXLN-&YjyuVM4z^zaU;<#*GX>X*hwO zmlPHD^;&YXZ?&{2)GAerLS9)>SyEiAY-xczfk%$IV(~#rC%B62AWICuzSU+m8avzD zaqm@YE2j5yKzprDhv+@-yaIj?m$0FOHwoMcyia;87I>`0es8CJo^YoFXvrF}qG!*B zOS-6rYsQj}r4LCu0QRaNs5|GLC2a=n+sR7Dr+nhYb+pRT9H6yk+j<+~c)lwSUS@2GmU&%M=@+i&TTN@@^GSQAWD5e&hVUUj< z`C(*$=SX0$W9;ivrXz`pUZ)Yhx?Y-7R1ueuED(yqqM{;WVgcBbx9=dpPEeh&_k^vf zQ3;8t=$Vl4-1E;*oi-&nG%PeKdOGIqfYsAyO!El}^6>GUIeQi_G<3n@7apJc6vFm7 zbDmqU0MPys$|u8{fy%GG>peUld*X4fDDHjWT@&d4NqN@`H2B02A2gJq02|pqY zr}d7WUHGwQJlrG8V^RVF;08!XqMf?AY=4+izdFa)lX$r`PM*^OD&1 zb#{yZq3cXj(oeb^zo(DCr)K&O19m)j>FY*`jA$|>PXG%t16ZG-2t3v_>1%(BB z_Ux{$t0f(;lnI`s7&vLkePE!kzyEeYK7o2HdQ+XVHan`O!W{xFhXZg{t<_Z5)>KxO zx3n|^W}D5h(=y)9%aKYNvuf<*m zQmV_=;Q)Bf%P**{s|Oed_=c4WaC&H%Wa-#?do3m-0(5xNR4O%W?vN9|wG|8aoj6*d z1Ku<^6&Yt`_8_!JiwN%i0#t{;1XnQzM@C0s3xl36)Wh3{0pHeVwRiUb;P(O4qkx58 z2XK3<9ihE#VAwu5(r+Jzv!`#s)NSoB_5sOPYC4)*4V044w4=J}q?8+mYG87XBlt}0_MJcPe>6+F(?$^;~9tAa<&ox7YSuf<{66~c9`6qwMkfW76 zG>Mg3N1De4ok?j&kju$~z@HwC$GYOGvC{COj0V%Lld-J-)Um41yt86 z8}JGKQ~jri-Xnfa_oC8)Fmy0)D^ouOgeQHb#OsLZdSgX(Lq$yk1?=q5bqdvirK7rP z1@QTL>6wey19`j<0K=$g;KuPOsfoC3nt&NQQe)t9`wlo`lehYFxKpN0;fF^&`~35d zKK^(VZtb5o6Jh&0_f0c_w{tja-8apeGaFd?;-$+_+i6q`VEgln76RG>wy#*b){hrF z4e9MZ>o$4JdF;^uLC8P<(?2Z+-X0r6($}M@rX(c7ghfTuM#q>4jOy^6P)yfhWr4e$ zF?0H=jT->lgM~umhY^VcLSb}t^sBGF`tG~$W@cvA*VhvrhKX}z%BD<=0HN!oY|7Ae zCPUy~+iLocRM#Iqe*N{YrSP%Q>a<#&jSd|kKuV}P1^5Wl5I_T(6_gYM(&=>i^2$p1 zVRdb-MAigI1%wu!G`N$F4r9HzvEN2Hm&L$l7m(^|!37^umSnX=&%qpF4By$|Yd(a)rFz&<5~s?Cdb; zwFbSey0W~>WYlZbmE~n>wd&nN@4&rRl$RA37r`D4?zXa`0;%*iB%;H8257vTk!y_ZG4q8#A!wCzR)ehSS*kbgd(*h?_ z^80K9z1Bgi-3d?+CzA28nBUXq=(5;4O~|gJ0+O$8SE||-EqZzeqGtS5Yj*49cyVUj zb=OQ-YI-2697%_5y1Hwb_8-brN%L)4vrCgenP5bBa=wOig9C@ zdE+=#r{``ELnB;DRcw1ClhDfsdE8{`0(K&;U_Xo)7e>kHs-My&R7#d9t*YPg+MdAR zU{OS5cyx4ZVq#)yYSK1ZVBe02I`+nFPe@IDZtZii-N#&;I$PwQGDi z-03rCc>4OR*|-r_0bXd>)M-;UZ1yCi9S5){kZNfJ)n^)uYo^G%j*Ky=Y#Qm$5%9|J`%DJui;0r+Zclu*ug zT!95DTUlKtmC0ILRj5AE+h-^Jsu-^^9+H(}fcDHI3`eY<#E&_t-c={X`R%#4^XL_U zq#B^xW0l^~-qDeheJeNn=FRkrIaxO@oH>%8lP(iiO2pNLg#{Y5s<*d?0DPCJ)6&xo zCwvV|zuVkpwf1*(v}B;hSFc}hQZxfX!-FD433#iZF1FE8_@WOLVS9ilzy_xk zA8L)Jxw!?lN;o5#74tdo2C%H1}c+A5H@G4h;L)laCVBOsMe|MQCdDrWSR(T&Y(m^)eTOWeo>pPbYuN!fOkOc_w+{tfx}*~N#!SqYmYsDrevNoI z`Vv=x*?{lz;b>XgknuYOx@0^qbADXQDz!W{(j>fbd~_sbhNl@j9rLAPCT@sjYIYTs zy22`+l3955t{4HFzTP0GQeSGsgs~Gauffeq)$}M08r4ziS4LJrNGOW84U3Ed?j1+w zlL9|a#f%-O`*!MtFM|Xj0O|a&@D;09&zwCgG&&|eH5G6;E+s`283owx;qBw$<%O_4 zn73-fMu2XfD0I=1WlzqVD~O1i{ph35Em#l|8TrT~KU=kay-yH_SmJ@VPoFhI7#Zd5 zA0Ud1MA(k4kECGA#PgyiQ*4G2Vf(r;GSb^WaQz1NWiP(;_~VbynmucshdZL{B2j2q zSZZqO!Gi}cUAk0SS_-t20d{trBYO%S0Q+BaIsQE&%wG#~{P#zG{hJS1j)1qTHF}+{ zjmRm4x)0K*j=PrdrJZs`0>Y5)BqnnPeV?*RqVNHoR@YG9P*qi1QBkRAQoyF**zseq zeALv|H8m*=hW5@*qgdQ%#URfdgq9Ct-y_nfhlWW^4WQhu>@3nhMN@ieQRwgQFD)sq ztuDWD{Yqhec79$~U3Ianq4?IdGis%@&tlBFbyKI)0V`h=A@La*$5?+hZu`#Ue4_Htyt{r%OU%##2 z>HyeBMOzz?f8^3}I7b2V0qwD*Kit!cA{UJ2{i-^9vqp~Y~D%(G7I zL#XC8b!AN00&8p^h5z`c?0K)QTuSz&Le>;-7oM|ClH;+R<&9xU?&M3Fx05dknPO^q*QtUxvZt~VJhpThmM^J;&6rG5kQ8c;}c?%Q?Lyt zmC@A+T~FM;WBHmjqUh+2o3~7Mn-nAv_;a}HHmr}qY3j%WnX*+B740^4il>h+@<7g< z?#tmIHvZ@wu26`0`x8$9Cc~Et7cUMD4V^T3(#mz~d^nsLSjJiFz6q8C_&(eZ5cQaZ zL?+8Il9JXDSEss7QBzVRY#Elm^wO+ZGiS`0F?;sx8PliFoj2FZ*GDKqewf!@d+q4a zqv`4C)z#Hx!YT2?0I)NRos><9ABHKLPRMfn*9JNM=ZY{B4tU@ac&j0wjDgB{q|Ar3 zEJN925VY3R)WVkvc{9Kc8okleOZ0j8hZy{E84_1r;hTU;&CSgQgF&fO78eys8YLO& z>5XEsR4Rd$qpGq}CTnutKdD>}(3xX2)Dv!>1=#K!9Hi35hVU;zH_+>}HI-#~S?Og( z*=6}R>Z^*4?P|TMQKhI8R~3{M=je6HtgKtGYPaci#*TKAu>&YP@b>;bWT63I@9jl) zR$NF$_z4TTR;N|Sr0A@Ze(0Ne(arHukR3r2Kxv4 z_y+g{1qTK4f`G%nbLbuFkH8+PoV+})Aeh7F1qO3@LVj#w!W;Ydow;~1zqq)ru~Dhk zpd5R6-iC$&mf;-48EY1c#YA$FHL#!1wBp1}olcKBZ97mF8o)gOK5%;rR_86~U1}o% z5f1!&M@C1OxsC7?jgF3?y2+puMeg+5toDI!OTP^We?KsMN55^*<`}XM3=a&AQreDV z7>6wkn0ss;MvF#gRN*EpIGga4a~YMZpmmvQ*pct-V9aKEZq&r`<#>B!Gb^}2KEBiH zp(){P(k>;S&3YtEJ(OjtXMPJag+xaeaCJ0dyHHv>KDya8lGU|Aptb-6{8{s)G~<$I z#-DT*m4LjKNqTXO)uWUdD$$)FIrSZ^w*!r*qIzYn7=b!GR)g5rD{C8ps8`frKMXRl zv$~Tg1B{rRGf-MtpOm_TClCM`2IP#zy``jPny__iG7{LgQ9VlAwgrcUPnqiG%SCWK zb=nkwR$%prt|zCEnWWK)iEuwa={NcKtaIOlQeuLF;KsA(0Jev`uzdNWk39w?e8#L< z&o5la5eg?wLfDQpnHi`rb?ruA_|v%|!svuV+VO~Gc6#_7j)ft~Fet^5FA9C;m(M=- zh$T;AA9VvmsY$KDiS3pC%^gTn`h3P$;-#J7hK{5k|4|1#Y^=AVfE*GRKx7Z%dnDhX1R0xM)!J$_nyM=*bF;E< z=j2vaRJ16Sa=Ai}5`sH)dIKrE68|Kz1u`y53|zfv%C^}I#2(nYMy;jnF?8jWh%+Qu z0Huv#Fo%DBJtN&tuQg=RAy%2%>Izk}#N4iyR2Af=9n3qvLwWny*B_03`r-QqbyH() zS!TxNb7xP$ORUpsjGgU3-OXL5UP}*PI{>2HW+Mi8IAIIY+1V+TN&&#HT)J@e@`al> zu4moK%*)Nm%gt3NDi+rl7Z>c^_tv%@+nA|UfYm!+ zdlk9y1;NOK&*K2X!(|Zm=fh>NP{0cjghfYf-TCs-Qzx@>b4x2K6fH_17O>A+G8Z(6tn%tsp%{PsoM9t%3~26m#2 zCt5*9Mo~isyq}4f5A+^Z1w`^ux|$8P2we#Jf#hS%9~>TVjtvZrA;%7)`a{6*J50U$ z_HMP-q*Qk_D@oU_7H6n7qnyX<*|5IMeAvE7lKA;1cIY>=I~bWJD> z3keHH1xi#lO-Z87FvPx&F1Mzpyu5RZpT96B#y5yFdGchhfB?TB&P%IS;URa)@yRKX zv9Yi1*%cBV9+i*)qj7zRy8p?#>O$pFv7@4bVfwL76U+j!^Vv(SFc{O zbjhMciFxp3hE(P32By^MxGcXm$bOJWbLCN4)34)gcW^?y%* zz&{e(;ekuBzg?$qBfOoog)%ZbNs=MpY{P;(k;;KF!ZW5-Yc*<3d1)CC%EH_E4fPEL zxAW`j>tUrp3GHo$eyqHZswxvKNnoGKjl@qi?P;g*+&ScAb`bF2)$7;T;7>pv;994W zn+)pAQ@d}xv9avXI(zxk8T~kvnlgU)A z%Jw$Bsk0r)_5FbH-F)jw?=A$S@4I6}vCZmpo z>L`^8MKhX&qSbYvQCHnW&q0%Hk<%aLD!{)YZMNt+9!BPzu{(hF2=HNVIy{0lr}+C$ zJ4$$i8xM5%T48qqXy0cW0Fv(*9B~ef5g8vT`8H>-&1tqcI=lMYJ1sf`H4ICx)HksZ z(gloET)c`+-6gJg92cICbFhy`Y4$AF@x!gg-^R6-pbM`}RO~#HCrNqZX+egWggCDB z(5z*r+_0ONn3=f}y7h@TY8Z<gz)nUWC8TFsZ=B_s-gw@-C*-@Mt=+Z#)4C#0`4 zL#rpa9NBc8J^${%7pjxv4}k4b1u<*Wsa;OO-W_=S5^mxjU?=t(Kh~M&vNT?VOmmQ?kqe-HS?i z`ykEX;kbJ3Due0-KY?%SHLX1+L&3S-1&7v~^W(mGU-RP+zxnaUzx?>acVAixjk4^D z{Ojk>9Dij;@}YMQNF)+vb8}xW09_B#VSw8r5gUap;C@wWqqrga=8dxAg6i_3@}lej zNkO*0;=G&nRRxO1DoI0mX8MITUF*&3SL*8O6~X20=O(PPiVx4I=a& zzR3&W=jP?YGB-Rr3R@3ZQ&V?$Pe-SbEQ3zG4wA%7c(0-!fgu#U2EPdQP_VWFX=y=y zS7_)VytM+He}+MOTDoB}Gqo-OznRh7UGb8v zc`KBX&)!WiLlW5|T$u??49;WHPKUQMZW-37Q#vTd)yl*GyO`0~(fm6_O??yL>bNPX zk(o?QpVXJ6Wr@r`y`FWOFAC#@2!Z-W#KgoTCdH>9`30#lTT_#8fI!l=9mzXh4iE@J zA|eBM!IRx4dHQ&BLWIvg`)m{){}_*&Qj<|zQ&Qsj%NJ93?ud+w4~>qUI&JDEFRv}W zzEh@7@#O$--#BabtROyr;R{R9SS5t*v!7kCfF~49n*0c0yDx_`W!h9vU%wS=*3Nl! z4o4t}AU&t}M8#8FFvWdI5h3AdQj#DXwaRYXxY5%S)(~$lmkV?~DJh8re~|$8*49=4 zb}}ysP#t*J!|CfkSvLK9)b)RSEX=?8fJY9zU8UAypA1zPCDuoTy2La?f1k>1#JTHK z6_u85Xnmggx6Ds%s4Ei%v$yF{Br-WR`Z{Gx3sao!M{gTIcLeXJPM<^tU%WiQ zBTT!HMph_0R;6Hj06*wOA;Tp67*!>Zc}A<1NE*w^O0QhGynp}Rty`0Url7FVKQ6w?cKzygM=NG z0Yg0obJFn&&0Va``LS7)#FuHL zY>PW9k(eR;jI(ik!VDcsqZl7n#DRAgNmoMVq}Iv>N>Ws zS29t(U!6^OTokGF4N z&?L7>J{(T+_8sBTvFMiDw)=Cq(FsW;*EcL8V()>Sk|mPj4T%;?E0S zwSEH-bwKPzcosI`GthXz_F#dh4y@$B$pXe!aZBT!y@Pt+3mjFy8d9+1DS=5co;D{_m-o z{$~L@#`ZsAY}XOJo$_E{w+yMMI;blSqK#AekobxnhxFoGqI@t4;W3*eVUk39VNN3d z;$8m$EU9ReHvD3(PSV&&76OvoPHx4JQaG<%y+WE*5$q2RS}Z;3$KNPF5nyjT`uk6N ze*EFvAAkJwk3anO&%d^h$`7@i^SJcN^0b$|Yx2%tN<01fD=BGbPu#qD6M(VHWCT=) zKZ%I#4zx!bfGe%d3Ui0Ht3y*;n2~uTrs%Lwck!#AbQgSK6Myxg z8&`oC0CjI~YcrWTyUksFeZ9nK1DJj;?Yx72g5W`(PdiU$ztXWh_;x6Qfc(Fm7;8!U z75=H!iJ%ge3k&RS;J3i)CzVQ3x0KCRT3VW$pWi4J7ZnyLmCF3v`M}2;#A5h;@cf)U zdxjqx!WHs)LOw^p6Gnuk?tJ;c;lo$bua{L-HOgdKy`j6e&w&a7NPBnUzGLK0?X`5E zcuc)Ut$}?O9%kN#W|(*3`Gz<=jjX)b%GyVovhg}Q2$)Yu{{0U=xO?Z$-Me=I^5Mj# zaCid@0=>7{2YUNZH;8~!U}$h?3@{%q5$q4$0jl3;b#`0qrtW@2r$ygp*657L zkdK?N2)Ac685vupXOtNl?VC_yfZFAsr=2szh|V<0vVdL3_5v}#h#iA0VUK)uP4{y( z!?LF}xdx`wVKOe;JPYI*NN0j&=p0C9l!nR`|47fRu5E0oYeX)`>iVV%OxIEHSFM;` zA!SGPGFF+IdP#msWkSj}E}xI$9Ajc*k`fbfJTLOD(|#BN@1p4F(3lv&PaxiFH*5&v z3+Bz65C4R8FafrUA`yUdLxjNF<5H4ilan%T=LYb&QSk|Yz*Dd$;~fwDU%Vl`v<@;^6>F_Y0a9MGiSivA`^QwvBV%h zObD53N&~wf6y@{^!@_{5zxwK{d-v`=di3a}OPAnNSyNL(bQqH8$c}Sl#|W^8R{w36 z<6jeD{_E3q=70we*sg{TzoDHGM~G;Q5y*}`DTA26Q)HgNI~5~FtpZNW>T&HA!+1Z= zf~1?FP}4ohey9A7)Z8V~(?pH!BX`2w+Yq*h!!3a{Ub=Fb%;tlKX6fk`r@!1^z2nR7 zOMm{P`NtoA|KpE;`pfs91AEt8^v-`{amKbMp75h`=E1VYz!HE@7y63 z5aiXtBp*I0YPF`NMG2UX2VR+s1oUyN5-eM2;tAgEqOfJOQy6m6nW%6e@V|2hC_Zd~ zVH1Iu>|qqNHaOIeEIN)}9Ght$9CkQI0quuI?hcK-2Y}yeb6OoJQ4MD%_v;O26sM*_ zO;`Z9@9S0H>7G2~B(uOF8f%p|SR?MUM$m^acB2FVSmF|6`&GxccM zT+NP!q*CJ9u>-6`UuJAaLz7E*p>%aAH3E;s2-Ff_ualKmHI$QXQ(P@2tw~g!lnNGb z;e4%FcH!C$E?*!Jg@#2&M&TLL1lTFAzI9sy=IuBQZ2OcMGu*d$1qSmcPoCuI<&~J4 zDiDg$Y`c`Lfx*F135j05{%(^e2lDw?&q2(e7b=Q~iv!*+ii~udGTGC|$2%Yh<;n1P zNJW2iHn8ypixva62Zx8xnlPdcRDCth3T`_3> z9l>@!P7>gUhVezA@d=5$ckh1Zop(;3K7H-lwZg)}#>PefcG%b&Pz*>rX-y*eFcSp! zzoEnYJ#_uQvbz580gqhPq-a%Z+u95RSVad|X~(0h+YJT_mShJ9sG=u>?d$_{Q5!Qv zm5ev)>%&fQOy)`Rrh|%wC*7t@qyXL~5RDx}IuTw7g(u4ZV0+rd3#1zeF!PQ!;`N}V<_Ahw9Cgw}kE=PHawkE5xBF|(kv~Tw8xwE9p3a^sL=mPII zys|hjU?ao^mfmIVs;a5Z$Vi8~MZL5g?eHDgnDkO?*+MM$u&?aH6;UJs!8X%|zU=Ag z?#KHAc~etCVgAKSX?yp*6&)MJ2lkE)IouFFvgHVP{7@l)KY%<}2(%uZ9OTvE3&Moa z330pMdh^Y2c)g0Kd(`U8!ql)c-rO)ngjyQ+M z28V&(j}4E$H+tuNfPHMy95Gw$Ml&kiYILSnoSz9NFnogfGWi6v<%AimT2}s;dIHF^ zojkIKdRLiQTI?<)CPvI9t|2&fL& zKHlPpz`TZuaIB?!QR^GaYsGu^zRlqUhv1>r(FutOTXCs0mBw=b_N|DwN5&QNL2ho7J$$@3 zdV0b(0Z**PbE|Ql04sexELbFhM+FZlJ~8RQfdfF-FI>2gnVDHuRwj{17zcZ2XD4HH zWYX8+Eyws_9?o+7kD%-S6@VQMc+5@mW);HrcG!f&Clt2lMFj<=#YHlSxJf31&o6;x z0{h72fCu4$_%@?sV}R{AZp%4pGk)Fi?zi1Xes{0yyH7^H{lN0wd#ZuTr2My6+<0Y4 zPj2uREjzwc@A{2yUsrBIo3yyKss6_G%Lfm!W{TT@d+;i3Ex0UtO##&%T04GBh+UL@cEw-*X7 zU%T$a8zmCm29&$8sp)1`R&jZ`q^U_~Xg76t0|y!z9YbP1?k|JCz8hyOz?%ex>L?U& z3D@-oq~x2i$d8FWk#;P2C(;k}o=8dXxx4rNJzUtjf9K9!_zd2?`yRaX6yT$G8tT33 z=|!=b{Z?24;4L>i03?6-?$GdExEw$V5AtVP`Ukqq){agKkbJckN=^MR?$uvnxDJ4dKFzly>+`-6c!mA5(2z8GA9Xa^UJQ?j z*#Fks4fSGp&O6)N;d4zU57NU`2e7Suh@$Qo#s?_1#)&&pQAL%&J7D|etCvT|M&YOT zZ7tuJPJgM}`@8oo-#)N+p5uMd-*~6xc;_wdgVqDTHJ$jie&3g>-CyhW)?RtDr=!)> z)(Y5u;@G#@<1&p-R*(@#Dc9T`4->g1l+Up{{H?bo&^B*pNO zqPcOQzR~>6qM!`{-mAB`zqr|bx#zkiTijpr^V*aUA9LvN+gGn%hF7Gnu12AdcN#kp z!$$y*o?e9WxT%)NjFh~C9^L@yDl?gkt*y$+s>-bFtkb7Yy}tYP=(uP>s1N`jusu39 zhOD`mst-3Sl_6mwtl`62zz60p3>U>D#_xOQ?Q<6|78DmZNF-{Vw!>&5L6`8yjv%%V zT-}Q2Uzq^$VVm5lY(evdbySWA8Er#)a#8gb7i~%8GLhYY&m)pQhDMkH+{2ge-9x-< z6niys-F5(WKQ{YdUq5UTf$hU90WarWhjYw1bO$is39vtO7fr(I8|dn`b(kzTB;VMo z=}-W}N0_h0$j?IZ@je{MxHtukYxH)Lnr)b>U*SBR;k45HP9B2B~JtHLf}-jpt$% z6vOB+7}&A8jv~M6<;dJvO_fct6yp+J=zvEtEy##T!|AbempCZ(D>O7RGCD3kJ{jpS ziCAEF)l3m-PX*itaGvZo>BW^RxIz(NGLZ9xty_^3CM6{%DS5KnK(X;5KFQ7GD(V2qfQ!%U!v4-RwED19<#JOP0)gdVX+d z*tF@>p95^?^HE>w+BI8zktPG!PUQ(iMiHYU;p!;w3o~{>Xs9SWV)yRdM~)mhd-iNb zMn+*_VSRl)(P5a8Nn~y{j{X?@$-bn&M%Vv-VE^xe>I}9wH@6aO*J*UsmDSr56EoAV zmKEmp^>kfLJ9p^dzN)G!;9yLhl(=OWg&h80-mLW8qYjuS`E zoI867SnhYBE-4{O_NqTL2^tJ?1LPSuE$WO@i;Q4I`+_K8s{iRK7mU^yxapRh$KA!8Nqr%^O zbNBi4XJO%~sjY#xIsiDZV|WZWqM#o;n(X8$$4uKsS2~bg(}I;EAlv!*x1(aB`mHwd zhs{6{NS*t$ZfB@eB$ic7Nrue_IPuI_C%;`J30z? z=p=1o0Pm>f79SdXkm0r@V1aa(VAC2^v?UuuhJ%gJNHJJ;)}hPU zuFyW@sHeWu*u+Go(U?zrAlb81UGa}ZW2cmMg6hWP@8V^l}*j%J>2fBE?r7JK-3^TWa? zxlLNJW(^?urp=op6XFw6Q=^iSA`=pV1cE73+&sN~d;^1?c;X2m>;N#}16}6`LT1dK zB?u3vlGWoA0NbZvY~SGF3H;obgRmX>+k^SfE?Ds7ytzCP@b+nd?S5R|q)CsgT)WoG z*AHnjUS5c$6Ru7(b~4_SFA~8DA_@=Rwtf5l{rgX!J`KQLQc@z7N^wSqn&>cOvIY^@ znVeoSR^wqE<|pa;f6cJ3f9C-Y46t3L)*`=zRxhrp(YCga!2;k9BAj?fTZv_BLSIXHTC#fBu|8F6-~J5I%qJy}N)`W23`%YpHkn|R0fG(> z0CyAEU9%6c#Rl*nz7ID5KHr9i9;#4mn_8_w6K>l(+A;k%Sx{Gk#Y#1qk!YQM{FZ^u z!ti^T+XL3$MY8HWRKvY{cMN&*(Tf9r8RGf20i0JiY;(XWFp4r3aK9~J{($ois@vLz z%)Jhy8IQp-n9&$4Wm^*h{5GbY3iEaio3TqM5oUZi3|m^K3#R0!B&3%NX=S{Qw7-#z zG^HcI#HcB$qFP)|yBt|_PSM~b;)kIKJkEQpZIE5LksT}$28V?3MWINCNlr%NO;fj% zQYmG3Ox>2e<7L3-u$b7%kNj-q>Q$kU(QZ@Rd;)_KFsldjj!j9K{pcK@AdZ*6|K!P! zc=`E<$Hn{l2gG4M9~u)Io1C)N-5n@5AUv5&9TgWJz~i~OP4e>d-MD$n^y$-mIGh!$ z*TDS*@`9gz{<*pH=ffg0ZN~KH7ccVTA#7i@ZmoxxH>@3-wrn9rM_e|Iz-E|GKAD#! zB=eHuUVr`d!-o%Fy?V90yqpAo>2x~A!A=BrvR@`;(+@uQU_$!(gtF=1rtANSq3i#D z4`quQu)W>T(b>`2B#|hj4aGU>A3wOGl+}0YRi};|IC1!ZQrSvo3=wZ6ae!b^WoX~t zeSW^a=T4uJi0cdTa*rQ9vj5FDj=cT$t&H@#+N$4w_bvU*{AIw}3&gUg$Aa@)Y{aHc z(2>l08lbbo$S@0%>kc4)_Usu9{sWdC^IgsPKMvgd@%w=vzrXwYkGp>NLFWhB(_eO; z_?6-0kUFcqwXt2>+^%aa$j!>lzEx6O)FhXyT2;Ua2^x%`v=y`k__(+B8`JUc`ZIrb zf8clT_YX_1{qBygJum#mo|W4C9bcL+ebaaC8|#g4tQnH)yW3l8ax$;)dvj0L&5YWb z+IEcX7}#B{vRT=;NTC_^6%7wxyLQFcp_eyS57>LY{QRS@zx))RpJ-G~H_|T`6x`+p z1^ReD4VJ?j=~s&j^6IL~)h$iNj!Ta|lfoAKbe;HtMkT znL68AQdrPQEp-eh-oQqn+uWs8w$#_x zW#wd@JauyCD=$YyNAiVy9^&)Cb#=9NlFVbX!Yv!>>j0|DN{iuD0C*RR#VyUv@JTdw zb`Ic7QFz*hu=fd7D3E<}glyK}F524-dc97gL1WG3O--;PfOnt<%c@;?;T{;BF@ZS6sj|TCLY?H4(BLA^jEYW3pk3>!@hPdK zH3_~0q#c0$rPZt5w|H@dqREpcty;4h@PF;b4JcA3IVCQ2TU26Vuqf2c4Y?V8gMy~d zm>wJ=io?^cW0GM-hy&afMnx}PvJ_Z4@M<(52~E(5_vdhdgm3ZjS+~(0c)JgWyL=VO ziVWZdFIc>I-qZ8BqEJ{47A#)m%jFPk-?YUGei86?g6%|#;iIt{LOzaj3=xUq;^Ii~ z7clnP+S-G@Od%A4fWm~1;04hbhbnQeOg*;6O4UA_z-!b|7RpFDOfCo@yo z(%jfkck{}{qMRFFeD?95|MW-vB>nm0k3YJZkq*Db#w5j~cE=%t=mT`u596Gn9PdNJ z7cO1E$&^FA7E8BL{kuDLe;m&Hjpc&$#4oM2uYRa|_d`?efLUcw%MBX2PNgU=EG#O> zhj)TRB7yB&M@Kurm6J@n!@4fu$frGJzcrq`BR%@N53Jw3-*3%G`DUzRNOAJM>d2RU znZN1J{B7@*Z~CtrD|Txd3tOA&j~_XF_6+=`7lAXtI|>0iNg>9&47ktC%$p3t08F*Y z#T`0@vZ+=nt@`A_sMFSCG#ZMFZojc>XXcG-?;PCky?OH{clYH>mwLEwg45H(!+qmM zug#k`dwOsJ1L9(%_rAI3@};!g?3;zRv#ZLAS`?Db4m~j9A*bW+ozZ)D?-0y?@6L$B z+H26M8XKz0O7csK^Gb?x%1ZKD<#px7nNcDBTz~g#*DeFY!A(?l;<150fp{#LOTczm zzKN^^PgFrsq0wZ*r4TBjjr5dZ31oLsfe9vNUC9UVgye|Y$P zd|-x8T>*wqBpu)^R-1ze_<;FVyAxm^Tk-Dz>;vW#@JG(fUc1?1?=W;5a!!;PXUf0+R@Q&$v0|s{Fa;zl27phJwVd5Mac!w*uOR8cL zl6ZW9Ff2Th1OgzszKyAwQn`-XcL2@<1E1pNw)Cat2x;9Wd-?j3q({K*_|$C+mMrxO z3*qakHY4Rk*+r53J&z#{C z7(k|1qcKT%vIbuy1ja5D3Q6$S$&)8@b8~?kw6?YaU1yR6*hWXva5^E*@nQS=zlyH^ z_fpq?^3Z7X%2st7&iev{S1X&12DP}NK;Bpb1h}@mDDCudoleiBL=v(Mm#|7UHq@6C z+}5d8jrDbHT8#mod96mTQ9EqbkM6(!$@{~-?JZw_`8lw6pnh4|*}GnU9d=a~G}VF( z7^VI0M4xdI4St9Oh>@8fa26F8cK2AQDHzT{M_>1ShibI#_Gm}h9dq?iUmNVzahjG% zt5y~licb;LSjG zPBzgB$O>iYYP0nk<&BjWj=fcqcim|>A3OBcmi5ba?M#LHdH3KxfbkcXEt~t;oMkU8 z*|K@_$`vc0e)7>Zt5yNXuV1%r`Lbnj1s$6&}esKBRDTo11v*=WF%57_Ro z+lGe*fh+^&1H5P6%7hOKZDDejS5^X4GEPV`9oWgdKscJF&0qiyUs_t4pPye+Qe2DN zp?cKbYUwtcO?B0kt<8$c@{*GL+kL&3f_zwX3W0=Y-?{})5v&OC0!gG2K;ydFY9I-? z=8G!7_4V~w@CixUw)NeUCoWyPT3C#laN$#p(-Qhg;t-C`77K=y{jeh(l|xc&Y62pQn|ojZ47Er3fj{2i?k0~qif{q{kt z!wHuILpVYWh3cS~1*&e_W9u;W=?rEKuG==N405GjN=*r&fSmz+!q_RgE>U8ET~Spl zEw8FCrv-Kj)mbt-D+q=gyzU5sKWVOj)pKkq?Ih*uD;!jGy1L3!dizk^@~Qs2(Z;#?B83iHL}J z`Q?}2e*5i9moAl*l%Oal;GlS9647A@uoJ3Ag1;CY=C9e;*}(oko31klfHClPomLM3 zu4qy;)YT~!O`6tbt*W`YqU74;w91Nd)Y;@1uu~>R+OIe?Tv=Ay+T5&BDmx8r2Dl52 zMhBlRRcl9^{{FqY58l6f$I&US$m=q7*s(oK6#CBF`#U;1NjkxxORuK$+Xtw5 zse|++KHS)DJ$wFqc~xagYb%gRMpz*IR0F8B)7snDi)ft*IWchfn}Im4$+AwUHA&ya zVh^w}(`UNlf3TeU@ec!k`OVm0e*6BPzqXtXaKk)n?DlOJ7*>{_3E?x56Gf!^Zun}&ve(gE{fB1)6JQ38xCE&mJmM!6-p>OQjm3Hn_&aLaWb260* z+31L~!=SsJlTlHYbK>2-9N%@>SvP@!!-fLD&|qj&wYHdy9k3Ss>hn)O{^$YxH90xi z@R1>sIMLhT$wWqX{B+TvK15y}SPL4&4F$Jz8|rGxiwimptxmgTXs}{MuX0I z9Dh!LUywhC7sLq;3giU9HzQ+X_8mNM@$#j@;^Nwd27qxw0I+T}Hi~l3hH+2>)q#bw z)UbfB)uHrJ9IMkqT%=}nrJwW;lOPD-e&}8h1APCzd$29~;K7Fv2+4o%y?eM77d7^x zakn-=dm9>n1ymoWr~%2htuQ z&Gy3pu+!L1*H2y8&P=Q>uB?51&pv*LFeEHIJUWKZb;`buDyLhil$dQm*HdDXl7IHd z&sMHkEsThqG-=Y>O&$r`wxixsSOT_hU%qNJ@a;fB2vTX*uM3TdU9oCqWPE%q9nTJn z0&sG#fWX!3H$49MliAG?KMVMd_0(Q8<4Gtzc%%MYv($mu`D=Ue8 zU9Z=}tI19hV1S)HFX?aSFn?#+^nUMP;+NkpUebu{Pb*B$&vkfivZK|erZA-hhwWKirW=1;dl8{Q_4K_?WNf?(V#`dAy zyj+qSK=k~9esf0J@sIA`86CFf-@2@l*E+0bANLi<4!?crLRv#@Rgk|QKsSNt%?PDE z-8XD>-?-7kebbuNtCuZV3YVUqo(rFQ{>jH41^oBeTe;>+N%3|GsON&R)HEGWXV{%#1XTjVpKV*b1!J*x9Mm zXvRjJAAfjH-7I!G?H@k);G1uL1604XyaYZqj5tFu@Rqp3+27Z<}5@B%r30YL$H%9URrFVLUk@6QcDvkrNILBX6LJ_n$l z8^YiD+N;3KiI)a}GtRrgqWfKviZFtkr-<4E?+Vz_x9M@|R)YvWl61PvokmkPE#Twv zxHe?#vXkCnDisz0!c|43k&Q(+R2<#m(mW{UPH+;)pQ>Fjja5zh?o!& zGQ*(ZM;O)Px6&P^*vgJ^etQ5n*gu%h7lr}fUcPcgcx>F$Pd_aT50AsCUolC^@XrBq zSFT$J1lw)$B=3L#pz+Z-k{vD=EL{o&-owk=&27?VfB!(fz}>?GH=-tnMaKZ_uUxZk z)|^@V(6Fe4goxN!xCH#4GHr@?U?A}JS##$2a=C!*bLY?Jz}n$9dBLKE0X*JQ^X3Ke zc!G#g6+MPNiKqe?23e zY~kBGJK-bmpcf1hU`c}&UQ!&kUyW+MA1eAteZX9p`mrJHfw^SZ-fiq`FE1@BEiS_P zaCJpRd1+}WT!ANqq^Y#GcPQlYUeptB z-P5j?4%m8*9X^zul~r6=2xRq@ZCkxIZ$ZHB;kjv}J6r-|N5cE2O&<94#JCOczJA?0 zKVM(Kc0l_@&po%v-5st!Gk^ZvC+2K~f9Sb+-jh$weRMXFaDMsopD%l1v7fKco?San z9eLyE!PhQdIQ7!f#W4{=MRT*YzwgtJ?tk^GPk#03gAd*tYS$`EM#HC{e)7?W4@ydl z;ZYIY8_=<$vI1Ux0_h|ij9Jd$`>icfSE>-I4x#V}sV7j(hKo z=I7=hbyTbAY&YOsrDB-hA`5gv40BfE&aK2twE%gy21x!$IcE;EY>0Nf~8ic!W^*F-*VVKl1%i8sssz zA0vMe{AI-a50Kv3X*A$=Y&AOQcvv%FzLBUpy=b@z>Jua3Z=@pwSDDc|0`T$yZnnje z4kG`k`j1EpO4mWjnK&&O0X~|CGCVLe*3;*xs+C|=ugCUvF)_nTJn4QVk`Dv7Ieg*_ zH&_r78Xg`M6%`wYlVPw9gSh%u#MlYcr)-T*NSrZq=8Cmzf&`*TlP7K5vdjEsyz`v9>BOrges?~;gkY)I8stl$YhQD{Ct^AM*5P-Yr$?fB?=+wOJW4}2|CQb z*p&1?PhEfbFdDmBRq$qR?=p2UA?>II6_YB`g=(cEAnkPI3+ha?*?{4rPcHJYbpm@Y zDJnYf=DyP>Pxo3Zu$%7%!e;Ig*HmpwjLNunxdOQRtsCOHs{Gt6CU^?(#GTCKYeM5m zhHX)CaR|2C353XTCkPY9r6j(wf8V96SBlF@8zhZ}j&>AOORRC&L2a?XhqObjZf&Tq zD=5sre*NnCv~#D=oxPQlT~=P+q)-@5CN$v=Ei2Syr$KxFu)W7=?}IB2ochv-rF*?j zD{iOK@gtH z<>Kp}a01(h6aMYm)obuiJ=U&Sv+()nfw#jgpPn~w-cwKb`S_eZaWpq0?bthejvU&@ z_xDUYc0kvv7#nf^=IbxN{QRTOKK=mU{loiXwN)iG)m5-g<>Y2}nY-wU_Ha#YEj(AG z9bgn6m>8oyi$W$fXj_{bE7Y<|X~iu`NqUDY?{2^P(+6XBhx$$Js`~1ZlET}t!)k=3 z-`LS*GE%dy`uj+tGVx^6IvlcM>h!vT{Jg^3xv;91mzBt6l2)anth7X}QKN}4z#q(L z9wOYEUaOWj$*L;Lv$Jo#d-U+@yIuBU> z@S`-yQ`-C8yLU&Cmj?DG4hwo4biq0fBwwu}LcX3@4oG-r55auQ^HIhInGuQKz+?w; z_dVpY26~T;nRgNG$Gx|B7?!g|r7N$hgOhGe65}DKVid++?eaZRqm*!ZOnym4^0t@x zLLnMj9TgKDAD>94ucP!`%-iFWQxZ~A(F}{oNSylR_QLWPL&75FJo+e47=qOGt*LMs zm6$kXircES>jHuWlO|2_^zsJWjs)TzA0M}ME714=fxwT;b90;QzGVwg?w3}t2D*-0 zP*JneMo-Ua)29i-!vWZzeePKt7Z8odB*g-@yCHj|;Du#Nr_Y!k5F9-BnWvwcKaU$C zoH=LqhAmrAa&JTgGCGPx@VA77h4J{o(b3U6cI-HK@Zjakmw`$#4X11e`@=d6+YbZ4 z{@2Q;|J&#~b98t2sMT5^>98edVgc|K8#VvhPQ?W+_e@G<0L9~dMR zNdk<_?5DHm&jGNbu1VZ4BM1}W_8A^mz(rzga3F`z35y7=udlNruLtsekcS9gk#QpU zbB2r-mR{h5TA55*SXcmnf9C9|^B2zF%(_)sRjFuJ7}^b1oaKlOfyl;(?AbUa#nMBy z`J<3tI$j>2zPsBD?>%#OcTP?=k)TVY8Nn-Nx>c2wVo zhX;(Y@OGZBk2hfZiWgs;|M=`B3l{)yf9b^+pMGrmi%XUOXs=qa>e;!E0ci)shRane zR=_vmB)lEVI3DEm@7fzCJ!BMR~Wgu3kQW;*DK9>MQbKk?GJYnP-c&@y>3@B@EUXH2DL<+$GZVloFz%b&6BytBK@bD2+HZ``Z zWNLX`UfNqZ@A$XfO8UZC^Zlom?>_4N{ck`2;`0x$oIkOD-y3P?&lVLI0XD-z35>lD z$L15>P9oaKCJo*MunDTEER##?B@NX%x32Hnx%KR+W7QQU!%jy-O;vSuO{-Gb-quE@ znfJoWffsaiCxgh56q~m8>J7>a&TfKgL()Jy}p<%$c;g*29!J(l%5%NH;SiM>h9x?yv`2es0_;3Pl zH9m}Vzz4qGcS&!K?Y%!0Ijx<&lrY9aXXjPU$ zgLT*}XlDb|QQeoYdQU`bN`jr3Byvq!dRlTyQeAy*US95=k9P-$h4}b-1D?Biy1BSJ zJG(hKyE(eLI{}3Q&=B|b0F&pi*+qqga=9E3LoS!$==pJ=)*79TL{sA6bi^0|Vc;9f zWKw~kqq_Q3W>&`Wgk#C6DP`qlO)V{5-QB>{Q1TVNJgp(WOHVo3 z)YJ&qQB7?P0du5X%+9uV@KkCQQ^rfs58zItQfd{w24#2c$*{g$&vTL!-(Qj5yL0CL z-J9QB)St0*oSh!XN{Qbd6`GlmlAM?bGiw;vhVb|}Ie{~yah)tGR>hXlzW)BM&W@^z zl9Ga~)~4E~+ETqztWk*Bjpcc1$CNTjTWeEmON+R-mzn~Y21&0gVyYnysQ44{;4{@b_YRKZC~zG7`X8K1s$ z>eaxjANl3O&R$-~yB-?{;2azox#Ho6)@<73?B#8#_e0==;{CDiw zv48*mw6wI^+FFrF1eA#>I9O`}X{bN+$$|IYdGF|fLw&tHL#DwYw1_s+ z)>M;~nlPZ(44I6h)*+bGo3JH=jtHBgV`QiVNRs)RlbZvxUNT-IpB}Q-4fOVOH8s|i zl@un#AAa|p*q}h~=BE155v#bnyQH{Cz~`r@r^(T|p{lK^Rw-WQBv0J(jA;tpPWMMZgfdisfzC(<%A$}20|c)Z@e zK8;>KO7iQ;SDiwus7R}sovm+dfE_qVw<)cxCk^M2 z*|+C|=+Iy;iX~RZjgV}^snvEMatbF5*mtK4Ut*CC^{PdGgKJ}YN zSEJR{P0v2_r>B1V$hvjwx1iP47hihrSpasR@pg9GbSi26sp8zM6ki{=u_2??tb+lz zEbFjd-aRupGCgKWj6cF{Yt2kcuCK4tsMSp^O**}f7#(M3XZW20txii&o!sC>`0JFC zE@@XwLt3=Fc*mCu-S_UCyMOo6y*sDBz9{Eq_;-};W1r*NXjl&yGV+9!C{_MGP zsA)US{Dg_0Mypk*kPi(tv>mp>uK+65%4u(6b17^`yqz$1J~qstr~$OP$`zE?G=+pk z0uuTL1OR@90$ty^D|Xl0OgIb)?2W_`F^~QBH(TuNoZY>aEwxz>xE&Yg?Cu^E5g8G; z-8VRt6&&n=>XK~Uz)1V6Up?yT?TsS8Vq!4tM=e>lbls+nj;?Ni?Y0h%Fg1YR2wXih zI{LM@-tzSK-?(+_(&bA5;WupBykYYuf9!AfL)ea*XdsXWct^eP(Cg2=@ZuxCe8knu z%hAQv#nTh{VSIg&cOBOyd3t*X1_r+S?z=~h9LdYeYi@2P9ZnSr)V!Ijoc_eYPK=JE z5guc7{HK1H|0=NG|G(%qHaZU24s%SHSQ2cfDo`=_j?&5P_{DKL#T_9qoZ7=fLn48| zJYWQ1pProf{Mxk+Zrjm=hsuhJjXE8?Znap(Myw50WtF9cM!m)~pdTF>?&%UC*@W_| zBS8aaK2lQ87$wR~78Ml&>Jo(({?n>ey!N(+x~lr>3PF3bqF*$iQL6N!X%b+x&=@{_Y9FADhuhMFbgM-Ht;z?pX z`J-Bzn~eiT3dE@S$iy_Yh&xFDAG!6$#!LeSgGQ<97xoI+B6eMSV`W`ML3YZCz3=Y| z3t+iAI&9s%$=((b@@=TFX$w37z_;BBFK=48^36a0=^0?}8#iuz^6|%?c)lC*>INB8fHi%3j31~VW)HPR9V13RU$6IZ2DA+N72l=ZeNdbomy zg64w#z14@$Xd7;xFlTDHPKd+MAFjL-F=j4pp+m)GoDhJJYj^d{}-g{{X+hpdjpriQc|5cIPet z_89WGV;5t+Lt0@bK_Gd-j|>d9tjmtfQl&udk0J2@oBISvg(YGU+D*`%nBZ{{Yzkt#p{hH^4J- zpG2hsY#&7Y90zxhf^-Dwqm&JdINQl1X{!g95uCa`B9T$ApP!q(eCf0E=gz5cz&AXq z6^a49e%N9L*iTK27k3K{TD5rqxt)cb0xXPE(T`00BUwl#nl}6nxb%n;0sttJ_BYj6 zCGUSHYsZ>HA%8i!)3Gl5U@xy$D;FEJO4EQ2;N5D)m;8v8Bx6bX`bgKjmgc4d`#*_} ziS+dGbn|p`^&patBT;qWxrdjV56fF3lajz*x)<=kC`-_wRmj|K3-(F6cRFuE!#t`Ox?GJ3Ssh z68dt@$?(R4gK3G!Vk3jI(vtv7;hKfxf|J$8s4lqlKIs;A7*)M`nUI~okCSApF7f|z zo`3I$Pk+2_y*w&1$~f%CQk_OzQJj;Se4?$b&7jxA#0rQ3jP<0B6*dSLetJeaBOeh| zCz3l+W3XIS|$ES2Kq# zQz?^EQ;>weaC-ONJqHdSI&=2i$;6Z9p$3M z+jpQx4DWCUY=8RMXI(wLT--eYw^y%U9~>18ygDd6B0MHGFgzkKJRCb-mcIJt8=ffa z@nKgF53JI}B1=qk%)^g7yn5rtZ7xV%hZ$gGY#huH0&#fnHWyd;2Al2dmn~aj=j60` zo83#VzUqf`p$LD(*hAk~v+l89|JvQ##}DT>;;7yr-1#oR$<1w>gFWu4;p^#31G^8( zr`*1M`zN1#0`p>`!vI|;s7{tmf0F3o@Bd$Vo1C2P>zBeL5l%d0 zjKMB1k_<+=T>~N!p@yJ6>9~YUztbr7WoT%qx2x;o#q*zEzXoWikV++Du}spZlFJ74 zIskTYPghAnE&#h;tsF89ng<7DQYpQXMu{-QfIdar6N!JOxTKhrp267BT3=O@yhC3T zGTt5Ek!U~2*?U%7q_2Con_F#AOU;9ZL8E?n$P80;(kx>P6MjHTv?*NQWE~mSYSmpL zK~rNL%<&H%+!GfY=Huh)?CRj=?(FI1R#90oN*e8v{vDGPx1`OPR4+k+NW|uHd;29i zgTaE_K2*y*!q`y;BewRzZ^4rnRHD`CfVQC~M0oj_N~)(TgK&J} z6j5(ri>U3OT0J;`c9&8vS1T1-jY_9c8njBiMy`-__Xv4BPE&PdadukL#~-{C$ntcs zvv;(2aC3GpDaz$>8!O9;U^EK}@Kea7fOFq`{pH-uWPcBTe8eQ{6BZWapQ^0nwzUnT zwcQ!MK!A)fn0dli;tTjNHJ+QNGzUPiK|%hl!Q?N7t8Yz;ez?&8<5k7g(faCm+kIg# zzUTeqhd#gKrFvdf9yhk^leFZO7G@vVwYu5Jl z)f_QYM_f{+-u-su{@pA0@7=n8_j7A+zPKfu+gRFIT~u3Dl$V>8pP#4IXz&8aFz#?Q zL8=Mh3j=Q_GmFJ?J9!4UO0*T^c$}Qf$;mD%FWbBS6YJglPkuQv`1?me)-skvoz zVxsa?mAJ1TFVZex`z4a(sZj=Xp*juwc5u+7(P~X*vqGt2b2|uc$M*-o-o);xu5SUb z^k%XA0s{krLjZmwaq~NZ>i$;fq{X$cI`TR_;7A+Zc9rGSvDm(y#VYcd?OBaVsvB@9Rb*X zBC!8cKg_=^U1x4^&iD06)M^yUK_nN(8#6(-TOzbAzwxv+sVPz4zm%cfY@;Z#kax!M3x;YEJe}X%Ek!QyC3fi`j%1E3Me) zgBxdzjuI$9#h7Z9fX8j9ud1sq6L4GP5|L4-7&NFfN=dg!aQM*v!oot-7inyaBGwZR z9vSKm5bf>fBodKOq*N$i@{8Ef>@2W%KrO;E;gskUiHN^_mY4}g4PP0Ke>0eTV^;Uog~{6& zCvHu3m>MIJ-+uXB&p#$dy*S?f{+E{Ao2KkR?lG;XPSD<*nVxd|=wX;^8w`4^+Y^7{ z6k}6_{i*EZHDRk!ZFXhEYSLYsSZ>g@YE>Adq zI6nTETrRg_BPGdu$Hi#KzMhnlOv3XKb;su+iRYjKHS4dU{$~TZzC<%<6kS-ZN-6=M@#jpFA-%JPd>2k%ai}p6=nH z;qKm^y7~roTN|6(mX(t=XfhEg2G=yrkri0@KjHI$?K+*_WVR?(n$|WRPVgQ7%%@on`O(eznum6Z|~v)!vtAW4T*~R!_!Z#-@Mh$(|gI%C9Br2 zkBEtNc5@313kP6#_44xe4{(MN!3M3j+Pk>^>Cexy0GGqU{jnuxldavu4?pbb>-Xrd z9{s}~|A^w&NslBye1w7)QlhC=sT4AqR;^OXWx&`~C|gD$>+j>Wv9)R?0J~BqMbur3%0tHKuG@5W0ZDNm zXUdmIA!&Jesam5dO5WF35`NuWcK@$%;orD-=kt3%od5p1u59=7nR~XjB&=&HPX|~V zH0S`b#<1BPk#-VCfH8K&IxLq->#E9A_C_a1J$K0enSJ55Rq6YCJL)xxUh{y?WYnn@ z(!AVky0`TRA?j1KPEP5%b8}fa*+jbc^7HXvp%`;_Zx0V|B=xv^xx=G}x4UnkUrtUA z>85AJCo0MQoy7j4Nt{S9h7w%{CH?)K!p^$7y6o(%6DLmqs+_8-YHn@q>zC*aM$6C; zFd3x^sazI|MJAQOwb0ci(i;qL5L%j>dwY6d@N8*rLLO|j8eX&_r@s})Y8l~U{e9v= zyu3?5k4$e7B2J<}b#xtBM{uV?1djq?r%taY@(bL0dV3^N31xtspZ{#6^M?B1&4Ij| zr-yHywoJCCe|^q8*>$Yq6bem#`;wYB&wOI~;7A+x$mua*@T<|Up?kVvIw ziqE5Yv;DG+3<0>LQzv! zS6y2pQz+QDeL2DQ1q|s#t3h)IJcEGas8A{a|6!;`*v@Ik7I%#5Y>K_-6_-1?x_Wwh zheptGj&VDfo*D?=x9@~kQ19vG%eLA(pcM4wHZC3>F+1Oe*TbS?BDU{*<&8J&TwGmI zjKGprYu5&bN4&LawO>dm($6EKd_#dz2Q69pi`Q4K^zdOl^2=X3y14>f4~dKfx(=hm z!w;?4XlrY0XAjuE)!sfhBEkz0+h{K&%|EZ^r}cwz0PO{A+S z#&$m+RFQ-g7#0p3X0cEkZWb##I+_H3RaI4y4ySUQ1))?bnO=Bgo=(=jVZZ&|B!PeG zhxvCXO8QUUPMto|Iu_x_QC#Z%Ua6W5P>W+4< zpo1sw?&|C9?(gjZ0uS&m5%Jweo#x=Lxqjs@Wd zR}J|;T_8qkdl^>UU90j zg~RR^i~D7=0h0-?1(+HDJ_z`Hc5^Eit$`YaodTjhlRSiRIz}GXnPR4lS2PHPokiLB z6GY@^qH%d09WaiN$%JP!p;{JXK{K)`sbBF^YY{v*c$EhvtDckwE zsr23#ntQjW?%%!s%{7zq)Q-ZBR-K4`VXxos;=}%=ZT_G-Wk(K6 zB;Qynlfv#Z3>cG>5&?yd9y?N2RasG40Y6o$l#R_z+;%Ro{rbj+o}M1`1#q4)L3N75 zV+L=w3;~vzEx_B=gtxP?Nv4@1?Hw&`odLmNE}otN!66Ybap+EZo5pUB!p4}GUGD&B zheSl#IXN%4L5(fkeONF20#e_!3 zKK=Z28*R6u4th&}@z&}!p^?$Hc6OwpDiCtNkPsJ7?`1Yi*Q{S}=j{BO-~8Hx#e$8K zF4ZocUQ3rPb#Qlo@~NkO^{YoceSHJNB1p$-FO<9PPb}-6xC@>qZiMHB{V;F8{q}(a z2ePuV8XFr)U6LG4MU_m;B&HW0Q<}6`VE?B^$Dir?-@TnX_i0aWKb&kN!i&z|9j7~S zP}oj-Iv`8r*ckPEY>Y0;K!Q0cY%yB^WZF5c{Pwo4P66C|M8bY?50G}5q+hGi5E+eX zU_s@^OyZAEF#dMRIRle2b?ptwJJ&S@Uz{HK>caT#PgM)Dtj{bZnwnr`g}3gM&q4qH zS5*}(%ynXC1hkgzk#x0?#Z%(P0FW2=ba%kap|(VrA9Yclc=vPN{X3uj_|2UB)b7l; z*UhP`*txqUJpzMH1=yaQozBShjD4C+4@pH2{1XT{N>HSX?&HHlLoi;6M4ffDRXJH{ zAAR_CSg5~;hx5r3@uRp-CnqPnyu7@wwpQHR3!{WcC9MYZkQsyj0%`mKG#>tGFc?TU!@%GmfYs3OaB4>S zp1mKBjEoSaonSiwd1BXr55k-fupO9(LZ#+#`GmBS<pVZTUTUXTibP0+P2o43< zXJN%YEIJlgw{Kt&QrB0$>FVKSvm9XG5xHohW8g=?+n@OT?>E`n+Pk>Gme+6I926ez z;Oy)d40JsL1{9xwz>QnC+AOnic6WdI)mLAA{dE?$to!%}kn{j@_rP4;8!wxBd3l9} zAsy!U@#7^WC2ehOq!Av|;gkV(xZVh=FK%7^ca4t!{ko+4|2DVt=Pv-ZE0k)jPB%(q zc4BU)R#eeyHN1%09uYGn9pp|3JfqK$R@P{B)nZX86o9K@7@&K56*8$_r-P~V6y1Ph z8Vl@1jv1%(&&jGHb|I3?-_c9*6E}Keu8m4>T{?SVSn=hVftjB8{z4DUDZeq^j&qXz z^{E~`c`ivip07%d;*=liY%LzebxEX?samN_KECfz?3Sj(8!xF+?|n0K@6PpmcfY*% z2DHW3vd)NtF4vM)2PK{97WbPF3;mN?jfDg;Z!`sWv z)5G1%!_^aI9=dtBIk`A`dV561#vDF&w6LVaI50{&5|fh(i;G*>Y*A0QT&1$$RzpmKLK2EQIrWoJM>_Rvc2+1tBMTW6;HTm~F_0^w z$Y~v5?o& z)L2_x)xqPzg$x7JJh6$)QxPu!r<-HSH`3-EqPyBOFBvq^tRVzq$cHLrsd{j1K9&8K-f!TJ03F5WMyYkD2joUijN@~ zG8m*!Wn>p_wYBvN4kpn7QE|k+ zzJs*bfF~O_Z(hFK#?HmX+0Ff_r=Jc0*hbZ4cS_o1@9Ku>`jR)^S{W1;{>tmGBL_}+I1CNI$$@pFR(GpcJGi?4@{vcJJw1XW zBH?v^6#v3nYJ)tGFTeig(&fvX+}v4#L4e_?T{Q*l$h%G$JE7~I-rhbwK2cFod-v{5 zPEIB|45>?6ymCqec80Dqt*igB4)ae1_McIm+%8`Htf!|>p;YPh22!asN)hr&REdx4 zMn{3S(+jCYTR_#LWPz0`FP&f%c(gW(sW?;IO0n^ArqG-Mc~ZqmnqO0mIVLEHdv@G% zMSAF(DEyLDa_i!ps{DY7oq2hPr#cmQS(kZMo^aKWTJZi$H3weX`*tvo)4*-6RY?2B zv567=`pHR+QZ6Wrn-}dqFHQdTwBY-5J$Jsl`s3FVU!D<-iw<{YIDhQ>RNbLB>$4B4 z6%vbSATK`${vQ1O9`tV|Yk#zJX0oubV3gqh#JEUHxF-jEK2!A z)Ly4kOO0BUX#n|l&<+?L9>dZQ+8b6YOkUv20bSX-b9+D_%ve3$5wN>DySX^IIyt&H zI=VQ(-Pz5_)x+h3-5+6r$w~*FG0PN_%=eqXt*OWkv{=l5e!acj4UP5rd3h&c{%|rO zJv+0Zxw(_%pPS7D&L`;Dd@8kaVxm*nNeu0T|H~BeuI_H!iDL>T9q{_6X3lL(?)}@t z_kaBKlD=ZPJN2?E;R{2`jG|22->#8&>y>@Nj<%Yrs^+F9p!z-CJ!&lSQ0fF_9s$-q z{kbvkhI;=O!h5J`o>{5&fw6HiBG8AzX_@tuArh0pYDewHZk^AB>v$Ph#+IpqEG z%rJonJBfT}3YQ2kCyM=PRIfTu1{Y=+V^Rz7z=3`O7mG|Tw+s!*l`0Nb(A0|b_GWf_ zGaDXxE!@r>?|fuy?*L#6q@7TA)U-MlX)@u_vC%trtz5Nw`EsD^9`L${pzCfv zEdS6@7Y|RHWlPs?+~mpfd-4x|@CghIkBtk9jSG&94hRkV#gbpVzG@W;>{_;Tv#l-A zb)>F`M}$R3zwpvuU?6~x1GcYTx6VH#WUHMWGCGDuc>5z2eT%*QvSrIR+1ahzxbY8v zddA%cIUbS54nL(kB>~iX_;{l%M|ke(84wV#6E``9sV)g%mq;We(Q$DGJ1ID2T37!A z9p-QSFhA4ve|o!o=`vuuT%puxbx3|0W$cbPSZ0iJ%g{wkV>H6!RvqILWcg!^PD3S0 zVg!arUICTDf~!r*EPxL3ouG?2r%CM+!hG^xV2|U&*A&NZN#47xuDo?_{L9mp8?(k+ z^Xdt~2cHj>Tpi3`kR%kn|9a4--?p{X8uVJDQI8#u<5To2IDL z{qBl+sBy=Fu0UNI!A@MKtqjQDx3xWWTk)|Nm0U7n9m>p1BQiVf!KRi{r)Vc6yk1sb zHiBiJ;UP;qr?EEm{jOB!A?^na2j1YP*q+gs%F1>L*cCwCje7N<(J*W=Ga)Ku_YpHC zS_l{$18%QUDFhw7s#E0!xmo-6eiRhs>jK#BZ13pofa1zMTme@}vKf=5MnY7W;(9{7 zfe#6LdX+HG9T*rxENF(zJw|YNxldF)=eIr>3@+-`Ocg>OD#X zNX9XXhmTU0SsU#yCk&=jRLRznYHcaoYpKBW;%1*g87eI=L*xOP^8Ocd!D2f>B*k+-7?R7f&Bo zPlVgAuUzRD9P;e5&-$Vs))C|m_-tddSV7Pqeci4OA-(uumd1L)b@`vmlS#Wp&myLD1EKjvE)|FOO?) z%<9i+imLa$EGzRH;q1DsI`NVB@41Pa@{jB^XjQ9RpOQ{a_Hq$E|I zsDTEKSLGUeOB zN)gt4kevtq8#0^aG6|p8#%pWs?BJ^9{pJCUK`Za;74o^QjSV$^{wx8~aK@Nqdop_^ z*~o--!y}L1;o}ci8OzJphZX1-9v!u3-zO>Q>DBf1?E=0`sTeeytfM1XNgJI-(E$@? zRE%lp>FMTh*Z_>#*_nO)Vk-Ip%gAVPAvcE}c+qc0z=?ifogXvKjhkWc#f=KlkY_OH zySs$!mgd%$7H%5{#*qP|VGIvs6iddRC6pLIc}|l3h4QejH1fMoP2XRc{^9!kU$4zy zA8NR!PP(ExaYL6f*8Wacb&^gd&`O0_8EI+BNllGS;=Vq;LBH@HZj`QGR9r;497&}W z9Uw!=>2x>@$#tK_6#YS50OsNIv}=+0Y>50qy)s8BGlagAUyRod=sCb5J?9MW%t~Iy zHXF*cL&O}oOjK&M*)k-PE8E%yj7f&@_PXZw^&2+0d3lACzSRWYF?Gk9%no4bfuUh8 z?(SjHv4HcwLBYVuo!#95c-L*(TWJ0oi+Y8 zgPj07VeJ2c4zn2B|IL?8|LzT@KV4nDa)k>R}Lz2e_x^IsZ-#OcS|J#AT&a_|9 z)LvAkpO&3ikf%0fZT}#`Gdm?-($_OZFLV-Si!pd=YJB9nBH=2}|1$&c#`!sGTduNX z-Ly z@DQi2vi{Jvv%Lv-Zw}wPd+pxcukYQt_Tw#U$%k*rxCy5|`AbuAl3dbjF%8n;ha(eI zngN;=plYg76pz!@DJafPIU3`<%lVmbhgaf1jBcwbR4e*)YPrdXN_uN+tNHv6;>nyO zv6MxO=&WMueY8Oe98qvIV+=mJ--0 zeTJC}Oi%0dx|2yKbMx~Wni|{M+a*%zfN9V=Vx``R7}pF*U&q0R!^EF#GMSkx7p=?^ z!ip`2v((z<%z{;RS$^b)nd8*4Y54uI?A~ zc5;jI^Xu#D1p*}UVB0epBj)Lm0s(JPaq%o=0m8(5;q)BROepeB6d3Z68A_sAp!oS5 zNqt=GpP7emie>|6&(5LuEX>o(qGW3{b4M`F=q=P70E0fzcrpbbg8;6OJx%5Uu$!bZ z`5=tx3Kf^vNdkVGTX{rpFRyA?vu>TIuOBj~$DlYzz;L9=U~I>)#6|Di2``4nZubib zTaKc1QR582?Je8v0OtW_L$JE;?dK2V+})eC%*N)ml`Fk`{hoN@aSs*?03Xrv@NnOd zP#etT9o*b)mMz_6Ya1FJLj-ns!;??_akHJ>7JG-~%a#JRd-$+y9UZ*={ZYqiB*ORu zwtLX(x`(&77mEeJ?(gp(7Z-Qnz=4d6jJmoykx2A+lLSbyIU}%>UU-XjnEyeeq*8#wLc3xMO+&nw})w$6xrnR@uTBZdbT{mW5AIQI? zP0xGx)u63^>fkhvT7iO2Bbth9QK@gqbaKUm1wq8-riPA+6BE4m&P(ENPqu!0rt61W z=kI<0>FtZsv+As_0^bHDv#ayPUcURAvP(b?`3^ZbM2>O`faN3T)BXZd^{kJrwuSLXvzEmpV3p%Q+DzmcEQ&N&r(o!o=o#Jr0h)Wv{gE(CoH6+D1X4EGE z!31>4bbuNwrzWn9^1mA`y7%SaU$3dAI6KbvegdTZw5m)eW-G-VaxuTZn=k6%^0;so za9Wz1J39ri(cJIR@13p4`duN1TYf) z0yejkHBe@;b+Oz7+oxfl0(|^ksGwk4x}Rr4X5im&C}ncF*4h4 zYDLOSeqs5Bjhg_6L!)9ab>B|iu?LboM>rq1Jv2Jj!PWhthaTEuXK(B1_~@gLdU&(K zV&VYykxe}!@}Y-TASUnXx^(H1HS5>I);#_E{6oWnqmX&h-p$R`%X>M-cAtQtr~mXP zAO8T-S;H?l)Y-!mMugSt*1^Ufd1!@`tE*pdFiC@_i<119o*Kl&&gd}5jvXr~C}6YM zq~MhJVHU5P5~Jf!qIws%uKrnv`5(M}_0`uRQ4dTKfwx<&B*C24Tc~(}F}$ccL1hlm z%FKi3ln#TG8JSFOFdAVyot>TV%HY6Ym#E8%5rZ&x+FD5|^AnUh&MXnmOj0TCV{II^ zO0Ak4vzWy-ef7tcqB?^{u0hS66l#@9uh*GPCTw*^AV-&uj*nOY0niw6Ww7>Z`GNaq zntnK^`}VWxZ$F#)azQsQ`uO@l-nGFzeqo%?re_K>6O{@XA(k1L8KkWSwT4RT+m!r{ z+wd90>@TEyt_wfBGOqpN%*Z#FO%sCsrtVB#T~zDIO}+Wf@gcwCrPvFy>}yYYHDtfT zt1lSG#v8IlAnX>ixereJzTT#iWMP)?CHaZFHwNzCxpZz=m=pcN8B=>-Hj7(ZqE{;h z^g5wX(AwHUmTrk#X3@8z!Vmz@l9Cdw)?qZXO;1@YX4pB{mRVC!kh^#9N6}Fs-ac-w zZjL*4#KLx9=j3E(6%-Y;x3!77y8vy(z2e%sTH=1(yZ7U$*yv9V?9a%_uCA};cJN@x zHy90caW08FLr2GC8dT!;B{elwFy%>2O-@Qd#kP&j&7$sZxR{4=Cqy#qA>sU3Gok9I zPA|+|J!ko5rtOQtf_Z7i#etfIVadeUkXk8gsH?57t!r&*Ww)~H>*|`DnoySVFzPdY z=FDkcdpn$3@U@k=Q|j>0Fc9UEveIcfVSvJm*^OR_^umEpBP(M$ZSQZ|Xi_TL% zc1++2*564ODfal~1yojqxxBv0!r&&QEYd39LwrrU_@+bz|+HC{M4L=PG z4G#>9@bK{iaDH>uDmNdWM;<|;VZq_3*HTbKWI$NhiWMtfe)A0{clYH;rP+v!mBIr; zLQq-j+O=C99Bmz);NxpIZ1nK;UAuN2UQVU_FgSGGAJcUfL)TfjE@{u6J){wyKp-G~ z7-C;10qjhoBO|acPIM$X%s);N_;-$T{FiUv-2O%&=#rw8Uk#F0sHCtlQjl1oqvdxditgW(+?nBB zH#S~16wP(*{Y;Xwq)*ly7+idbLrvs>QwXK0P#}7 z7U4-_O?A?~9ho1x$*ZEjoNT%Oi@V>SQ`hW@Soi`L&Q*F4X3kvd?KC>{inaw7tq)#a55c1pmdb_l0g;B4PNqW15 z0<80oHa9c~1%k$g`oX~gIIut?>uPJsvgs%L_Ik3sP>rn@RcQ-%FP2wmWcZ%FAE#$# zoT{mj%H@-IkKh9TX`%}eo^LSd#bPlW8WfnBpOcc3oR*$eT3*g+=Srk9nH8T7Ul2eixD&PcQb2x)0GtfdVmrK-;lG0K#Hc<>5 zV=l42AS5|+hOB0ueo#_`E$&p1*F5Q(L1cMa)mdQZIh{OqnhN>9pB!((C`T~Ukx z0Jx{WzX#QlW64Xezvk}k^VqK+bMy9wp9X}4`GSEy?q3g@1tu9^#vZb(%4SLg^|u0M6#h^bHXv?B784T{kdr4Bc_yWE{sU$@WfbFRNMO`g0d6@3;J31sX zsZc2F>+9?4>M|M(OymobpbpQ^&kcS%TJ??g=;xx?^PTU`cJCkS$*eC)E6h%)?_32rZmUOwv9XW;q}yCwq$6 zdM06_WaM&MQsWQo4t5K5-Lxy*FDLm>XM3YwBOlOfhlkA8;USm^j96iQY#|l6J>A_M zJRZ9AW@Zi_KIj_&m#sJ40oz?YT+!X##l_v(#lzXn(-klupdJW6IxaKQ)M5lBTul*T zPlp&!li>!2eVCgI1pMZv#^U0lw6wI$tgOa0uk8HFo4haa2PKQX`)8}A5L$nR0h0V zt<@oH$NqK%>{xQo0Bqm7g~4{x(mEoR;_xV#F)Dh~)@=a1+nk&{ynKLWBNJmx4374S zaA)~0U%qVh`t=U3ZYx$ScXV-q_lHKsghWOKhDZMDx4(IF%^LU^YPYm@ZAfG^aBn|E z*TXm4+uOOgI=Z^r*erQ-3w82dtyZm+%lgH=YPHH@F%wC78dJXff;{?zQ&@q)t)QkRnI6!v<*T~V z>%tuux>K&79=rAF%sYXRijv~FLK=+lMhEa*kUEug|Tk7+UzFochC3(g=&i<#h>p{`3|q=PvR_J@>$rG14a}?2MBL6nE^Cm<}!{| zT(Ueza$u;A*mRXBsYqpto9Jdt6!a5m9qA_&52u88;>ARe=`_K1pesYeR;60oArK)!25T}zc+bo!*sx^_z-d@?48_&46a(}dP#Qqh z$-{HQmaTy8z`Emh>-|GQgCkIbJXTP! zJIimm&C-|Nc-__8`$S4fQxOipdp~3=H@Wv#{o-X85q# zY-we;sgx=!ru4Lw}kn#|^^nwklO`Lx*{cQrMeOh}5EoRCRn zJ>5N|ml@*x7zSvChKZ9zTo=egXD7e0p+Vd$hSN_Z6vAH%;6T_uDbCEx&znU>KvY=} zL;e>pTwbtrd@kN|cc$|Dv%0S@&fdO!`qsJed2##|P0F=_0t;`y`&*Cgj0%!T#8Wuu z7bk$gkq#S6dIiG13q+-1gr7fZwwZ zzuHhy00dhq?Qd)2kWyK^jVZ?Zh`BLURGOck3lIn-R3Ytc$av3C8}k)Xdp^B=b*42j zvaRs2Nt9B!->Kf`<0lr?oK7paZF*~=% zpFB}kS&0*p`!!na2tKC7Z-f7oDL?~-T-MnsXlZHA&&!EVIG&Q4l9`iTT~{l_kqB@i zP2vHUH0GvQ`rKSD9J{$W!r_^cC8}#G$&Hzxqr8rEzzb7eL@J=DjCa~jLyA%{Kc~zv zNOGYD1&Wzds7~qdloe-wv3~{+D{~LL_6xA1WO9YsVo|6x+zw$&8;_87BFm&_#_$*SjtI|LxHO5ya`*5cI?RCs2Qo7=>+9=b;taqpl}ed@No3j7 ziW9b(0CrMv$^@|gq_YM?*9oxyylnd4#CB$n0i<{Lh{a+_A38*GnOrHCqgYuio2lTr zOa>1s0DGMdMr2@1W=f?YE*kt4cY4RFJI47gp@`ku3db6|YetC8hRL8IMhYV1;6Buo zR3}ynz{$cZl4bG>3u_x11VW)&ryIhZg~=93-)i#l(a{HE2LUU(#A=)r3IVnQu(R2% z@CCCnGlqsNYLyD60F06j7jj`yAt9Vtgqfb2`VW?Sg6^vRjxWcme;mob|BdeMMcM7? z{_EzZS>f)BnpAVg(LGUi2?yV8Yi%B~SWt{DF4#f-5YqK$cIN7o@@#9&`IeoRrmZ*5 zSS^X0Z;bZMOS8C1+s<@-a8Y`2UbL_JlUEP=Jj`P^0?KOCs@B$)N!rcMXbzMNf*ttq zyr{Skz*H&gZ%E%hFU|e-T+jVGU);a@&AmHce0$xT`u4`W-Rnxy zq~G2&EoU*yrhs&jQITGxn>ouH9(~Yrr1sz@Dek@jesR0DA5S=5RZ~r74OHnFov}=W zEIljTb-}@%#*y=n;mWrf?fx1b`xh78<4^b+LnnnA_(TDfV-CLV+|H znH-psTBB>{3!B-L-i~>D2VgtUW?;*J=RnA#;FMt0RUwR2}8@D%&0{nMp`2y^}`uZD=u5J&lSYd1L z0CYW&(Djhe-#z}sD{sC5BLZOiTWi+_goYvc1*_{`e#q#Ebr_1M6Dh{a%ZunR#1GTf z*2d)YG96CMX7ghE`cHJ2|4ab;&%plQ#CEc~Utub4+3k83sb zemleYVKDgzQ^M8m?dN4jCWS`?wdwikiDgB3ZR{4KL62&7@JbI0xy><87h09}26QX?`>GtU#+ZBHBRN6c1 zT5Afs1nndY8PoL%#$rU=IKx90UQ2D|Q6FPvps8*L@6Zcl?VniM6FTxgkoSoO3|g}Z zg>5D!Cz8Skilq|*KSK>YupQW+u+6aW(2%f@*ti%!e_yy$sP5(F>fz$z<^*?F)bz?V zZhH(C>Zf?^JUB)$5mP9Ya1g0!6dqOKWFYD5q?8Qh7-MH9w~fPQw~XKtfcXaj0y9h% z(hP2#N|!9*5U@EaPhgf-R~S1wRhLR!FLX#Rc_j82hJsU504k1bp7yq%W-{Axb?O<~ z6_1u{0pj3G!c_zp3S2bYj?QLgA(hhs_q2@M4O=z?q5^=U9LQKysRRr>A|@s-E+!;6 zaI3vt^!6R0c;(d7*KhfXWm}w_Hg4NyV`F3M;1Cvr(!hdHzoeK~-+F7Sqa%uTUy2Mf ze!(FtSFiCw0qkL{z#vatNouoX$qO&N1eE@<#~yQZbMp%dB6J0QbVSuhLUN&WP7$zU)C&0eAF6n0-=6~wO06Xkb*s-vOVF0~$ z?bydIeZFMl6ZftI9VRPEr+j)FGUx+Zjs|V5hK8d(b3X?E250l9;&sV?`3H*n` zm{lsZ1^{1gFd7F2VERe;J$aUuLN2qausf!|uuw!%zC5mV_==CzG z6ejOw<)vBKnI{uZ0cH;KsGhbeuzd6}GEBxrXKJ5#AV(#v3E^D7VRgybs zGyrTGjfS>14xz!s14))IDd7muG5~w{b$OR%2fk1qy*48H=A8b!i?VCu>H{ll z4!prW@_It#OC2ejc}Z*P6Md`G-s@;6gl`D@kxG2P<)x^J$%wUw*Ca06d0CZm_jAqt zJLkXqVy-1IR#16V)3U!I`;bcBZyq!PaZgN4K-oLYptC40nE8|8@xAxnL2>I76K2yO z%t3m(L=E+|S(&MOK72PYz{|`0*Hm#htzEdIu2!RIZ)+pP zt<^O(M~@%R&dY0RZ54KR1F;yVdXb}qcFI7DcLzI=-%u~|M8ML^1miEJAO`dknz`5Knkpc_S zX!Y$KLXtUvR#Z{!0M=wMZwFKl2nmUdivx}w8Wja#URYYRcHKI6Zy&&R50-CGM8u|T zc7W|0w%R(lx<38%)7}9A!Ki6<4A6B}K;Tjw2!^DXWy`kO*&)owbx8qX5l{Z{sW(@z zc6Rqzwsh$$Z@vk`hm(sd-CQFOfZfB_*ON#wbWShPVYYAIzJLGz%*@P&h6bX;$mMdT z;FMIZ{ewn$fa{-oGt4{h6-+H?f^Cb_UpCpTnpM#{#W?nM?pzz~CF|8_LQn z3JZ&hib_gKE2^t&>l>PyTRH4DE*Aj5Qz#IML|xt8-MziyK4AG038^ra%VY|rLMcPY zFGGeX6`}VAy!K_m>OHj@OCX&Pbw*StEkbZ3Y>M-b(LZJ0L$v)digS()4-M&cIPXJdzsJ_QrjsgPF(mqO1&&}~k%62!cr{^~Xdrmpfk_G#6rY}vP8tOgr3Hp%tySLBCUGQlVh&(oMpuzd!D*F zmPk6_kwn{47HYuB4s!T+c#|9jQ#Dg zz@j4o;eod!$sG_oZ1YxIpzH9;isj2)JU!QL+_cPQsU2#i6z%Qn2Xs9oI%eJG&5myF zjvgMQ=F~ed=+DnR2e6Nfj)3{V*jc^+`!Bun3Q=jc*xA8A;2RX|{tfaVPJ)0 zL8j6$tAbG&4xB_HfdRU`y}hxqv7(|PFE1}WJv}WgJv}2MGb<}MKfk1`qNcXKzOku^ z%|;CHDLJXQtfZ;A z84wu&-()ruwI8rOF)5L_JE)qV>6yiAsaV7xhw)A-lTsC?laqk$z~uYHy+GzG%K@N< zdV9Lz*D>{{%+e>75&Ek0EaqKXkxUR{#DhR!5>A7`&*4j}t%FF(0K`YMK zI@B6F+qLhqI!Tc3)p+Q&u&uw&KDn=|D1%d9X|b56DJTClfU2yo=hRVe3+LS%gIRYz z>;3Wbq5F5P{%}=!PJTjG=$5tPNx!xKt8mxjMTz@#YNd5(C^7K_Q*XwUdSRTLA>{xF zU}t7i(^81HhjhQ{5%EfLQ*)1fn0M^mip;~Ds$994Z#HTMbSje1U>yR87y?3I8XSa8 zsuYU4x>_p+jf%<&{~&+g06)~z(8tT&%gxEn$-%|J+1=U2-5Gbh@?iP-R8*asp;k9$ znZ%em%8PjVLB=~}eVJRF8%c>U1iHzm=+81H83N!0s_7U>#^rvRw817?J=G|L5pl3p z63#8S2!P(exz87L5kaQ0g-f2~6qEqA`vxLZheu%V{=p$=Nfa-P0>O@m-M-Dq>7j>K z0Hkl&vh|549%lsxhD4)&NrB-J?tcC&mMvSkZk?@@vyIKtjaxPa;XX>(=osP& zY_P`>F|WM-I^g;0b?adYz+wdUMb)OB7}z~9ut!Bjee}^sCr_R{b?THrAdp}|mdWW| z+z5}H1B?#C0Q=uvHvL;*{~6W)M{Wez32BEN4tpN39S#Saepr_ngMrv!Fu)N6IEFDA zcXR9N=;#2PZ*FdeNf|(Wetteo(2|mpPMkP#@?>I4N=jyCR(?TYW#y^rn%ahj#^#n5 zc3T^d$L|mbg`zHC_`vT8+9Ul&p~OA46iTHEt=OXF7>ybbUxykJkrRgKFxW^xic<|o z8ATl%@2Qd&O0gmD!A8wt>o6m{kJC&YXPu3j&F238K0d#ry1FVqKQ|*QBPA^@;Y320 zNXWGIW8CsYcqfIf@SHCYpcXs;R(PqXx2I>}^g?%c7aw*F3J0*N&(%I5=FompFVdp~w?&-)6Q#56cy zL=8-*=I3U~Dga>9U}xzK<-V(uV^_u$U!Jvm{i$qRu+PvK(~)XhvG;|R_}2^eZ)`lU zD(M41wL%6cotc@A?X2S@0-jo-n0hd+z(Ei*scETLw3&hf(!*~P7VjP9?mn$9(AI3% zp9-Fp74VA>^$XkeYPosPXdSkYwpnA;#0L!uGn7ew%%De=Trfr#yQeDvzL$@uabN((<;6Xiej>t?)Ph+$Rfgg7M0Hu9`<%|vRZg^S zPw6v6X?ft5pJhz)r^&J@TttNSqc@ZOdQ=6|Jp3)V$>0!h8p;ESnx&$c-=@~~%$$Nv zTekQH1%*e)5^N6$3B|4M0N$gBXJ+;K^~;wowRd&~0`KVRic-HKBi+1NfX~DO`R3}? zE*>6F{Qhy2#2XUo7aZb?4UJ2d{NlxzU$%2~U9n=>hAo?6Uf_>{zfc!EZ$j5Gs#95x z$PWV#tQ|Xc96EF;J3G6nsfpynz|5TF^b$V|vuwJUuK&ajLv)y*_+kD9y8bh6|Cg{G z_BQNu*!ge>V1$Ju0>=do5S)j&kMjr|J{X+=vS6@=BMTr8hZyK9pO5gYt*wpCX4lr% z*3{ILm6a716=h{*B?7BEapE}K;^UK(lC!e13yO-%Dk_2DH#Rl5v~qyqckl&#fv{63 z!g@|Wf_#Y-DfU>h$1WWOevYsbRW2J*n@WIXfD}?jMVG@;P*26*jL<8&V~e8BXxAlG zaZ7vmNp>_r@{vU|1!lf5`5$laBJ2tnsV0a^2mcnpAF~V!e zL&5JfG5=lBWMAzFylm>cac=h3*|9IrS-}aCDU<-~C+gp2H!}aue3X?{rrx zWD{d!FnfdVNhUAYB!ggc3U`>EL2?mQ7L=TtOn_0*!&BG3cWb!#-Yw(3zs}wJ@ywL6 zIx%vsxig{S#Cy_S(SSi`9voP_!i$sRr^qNdfkm(}TuwJQXoR_gQZ7|Udir}s0v@~O zR7p;D+Tla{LPLW*z1=&7olF2SDPLmNps}Zg=H9efoz$+aeu2Bx*HS{;^A+S%24f+-hi+jcU;0zkZq{%Qg(jv#w}X_ zr2)eMjUzF(6Ve_U8HE}oMMbY%v*uU7dKAzYUJMQ=sb678c(>iQ)xmL@&C=By)(1sK zc>1znj0gw|-)L*Q)xp8Z!(-{vU;O2jm)(4Po`2y50B|3Fe*)}3X{$jxoB~}B3JM~A znBwAMV06r~>EfJT0_=txyV{|_DJXVCr^upM?gjH*E03B1E-3x@{gQx`8@Jb(WD z8C;G{0&n3e13C?dRj1Ptv%lFPxf^T~Sh5M5%T4ahCfS4yIEjfnV2Z&_-Ll*ZWeJ#OFma5l+Nk$l zW>iKq(u_3fZPaE)qtO&;M%C)g*i;)xfrSl_gxqu9^L?*AM#TcNn`D_cLXju3(+^XFn&*>y@?Tg zBVVNT+3`pSFEAPa&E)qB6jwz^PKYgdcldw|2Fs-9P*TCLSjL@|fGCoeNi^c@KViOJ zT6%g}WhLx5z3hcOEC!|#*`^?00w^xsNOBdp!ZTtt8sLxl3WdeeVKB78!)LeKN;R7L zx;kf%tJ7iuOoF#hVPWB@5Z)!0Wf?~r5v?+)-gH&`uKm=XXOy4*&i=`j3m;#d`0y3` zWc`b;o6ir{96xz@^-~AD6glY@vuV~$j$ZUJR&N}i86CLVcJ}qsz&8ile{*S~J?FGt z9r3}8tukU$U+J@#TTlJo9+~mNs;uYlJn`(KU3ME>eqv$*JsJ~26xgI-;~5hyn&{6Q z83_vyg&$UCr4|hPkDW_;8(Y+v*I0A?5l!( zoAUF=*#U}YSb+d6t&UH#Z{+Y=rhTvc63 zG?F~_#M_0j9c(%t^C*f1*2&qv)Tv1dmYJRq(|{#2PiMri-x&eVnahz(lCw$%ETfTA27H@A% z{bJ)yeS>x{U%vdOKVS90!w+K$!Mb&U`}P4{r;a3FG4+edFHC{)^V{L=B5t>R-AhL)gyY9d=uIY6#(B3kHyfr;KnO z`20n-=%6YTG5h-9xdya{Jsoy-*xwr)8#&qou?Mu*Xf$x91DKM_<(Zk8DJdzjv9Y0{ zq36$^2h0yX9~>4Q9u*anl$?^8ot>Xwr~4?LTHP1V(5(Xj(d z-=tR;t1~jvVq#;Wq9fC@vPyMjup>FTy82ifm*BJ)HwA+93*zu_`WNwC-|d8b3r;{S z%`I>b8|v%y4Gr*?iHeLMcOzhXu0lR*wjm^+oZ#J{BpH>c@_swj_;Fw2r*Bn%`bzP; z%`d!Z3?8d}vAyW!RN2V{+1WyQj=rHD?lGk>GFu=DGAvbn{NmW)+pT9O^LJeAEdT8* zqgMx7XUv-SE?*cbfBuR!=1OPem5#8S6Y|7n(*R~95ss78tVH2Lq>z)Lo%}GO%Y9Ph?GqBQMQny* zzXmKMDniz7GQRuvRoKPlxmo&_W|Hm!)vb1WPj6qR&0ba8ped^m=Pn`0C!}U=yyqVO zT|tEHsJG*Y>O;WT_a8pOK0ksDO$Tva($3v`zH!SpHgDZ}FB_b?=I*-#_w9dh%eI|+ zFh*djx6c+Yug%+cEMNAuJ68U5n~(3eZvEz#9Xn{O1_pnL!;-|g)&4&Im=Cja=g!9- zd+fxC6VcJprr9T}d!H`#)x^0n7q<7iLRhfSGp|Xg`nAo_al$0z0{DMMdk%}q!T5V}*1&TTV z`oQz+;KpG$L8=e`5*#D|_TfOmz@J(w>^3`9eEJ!~=i&_iJiu}m2>HnXDS9udYjspi z*u^+pB#>egE=fIb<3zkMAS*E;G%O^V&8pUDHE>l{yMuf_*N#pBtdn$nbokxQ_}}WE{=F?3Rh>7+KYVKv zuzgB@>Z(2dYFC0m{_h)qbkjcn?bVe!a@S;LX25Po4Ov1v)u+nbTVL){x^ZWMSbj!_mu3EL} zAyjErty!}RI6RBz^<()k;@oOP^&P%!UJ_7uFYlnBprc2RzWnmbZhjcjVJP*B%BEyr zmyS1GsBC&Y`7j=!z8-9s!aHoTAF{$WgM58G!LnD4=6+(V38g=Rgj?cmr;9qQO#ShGs zHkyFp+pMJL^a|q5pdi%qd;@w7W4V@fzmmEl^y!OpE#Q8^Ii-u~LV~2vpb2)1o*tLk z++I;po~Mw<#l?h#hD60iD+=;U%gfu0ModIxx)7U%bb)$oX>!K^))NN-)d7a!_7w_+ zFm0A5E(y~)Q2e0>8NOC33*qPCyRI&~N}g%Povjtl1vabIWHfYIEbx{b68Z$ksroto zncUrpt7C@uOfUcCw=JLkNADlsaDDVz@B1V5Qw=As*y0B&fAvhj&rd(KSCyY*>+FPI zhi5lCC!5;IiL8swLF2P&U3g(*GlqmW%Yt4vX20{w_-|$g-x;xfaLL-3ur>RIl@($4 z45*K^r25swJQ(-HZRw|dN;6-sR))D8))8hprG~Hm{=Tf#B+r) zeRhWffZfTky{5hqP+d!sJHz&*^z8L_-wg;1*bcOOKRO=wF|qv+Av|LHp~Jw#{detJ zvti@1<;(8A?>@hsJ6GOyS3uBi0CqB{Z}IkBw(N%6@3>?0*6p|4eA5G4w_;9j&~CCg zQtB6AJD~aw)L~d(l8?`!Lx-Mw?m2j`0oQ_eCFwBmZsj_RTlzYWa|9fqI7dF-)Xfj$ zaXJ1~{Oz2*bA%_5cf)ytdO~}`d1CeNvgL;JB;atU=Ye3 z3xE&cOnMIboV8j4d|>zh_*}q`j6?yS0sh(Z!ND?_EG9MvHiFEoYyiW80t9?@aWQZY zU3qyW={f-Tb@h6E6M6B0;v3owjOH_jk6F`Jn$L?C9UO`(SnI{$dTOz~Kspa&;v}s! z!tELj29`HT+jc^A5?Ww0qnyA3UnX&gK^?$mM@s~F$KON0@x9;CxZx5MjKHHdg zCidL%r0`RP@|-p{31yt=tGT&3!%UMA{Ux&jj1$5a`1!4lq}R29my88(UmP24)g&JN z#Rr%BMr+PG3LhD(e*TI%v^jN8$(dC~*e)BAH1&K2dvbUSQtanmg09d4tgxk>iY z<4Mo2Go)<4(h>gYAErP3(;J`uVd%Z7(jM)Tc_;3C(&x7L$G#_fHn6R^vDf7U-mWXx zO^OyE9v4Q_lt`ix19+z>Y6ia+{WB!R2;@X8txk*S0W{lsYPJ+RCG!1g@$)1$b=Oo> zYSsFh(telC+F`6LD?ah!F?n`+yV=}{?APgX_1L?*YU&yR*fo+_*eMyg>o?vFynX+n z!#j8H7Qr02Isp4&_zXC|Wyg-M-}Lp(Teq!Vw{FFa%QtV|b^yoZ9ROwyy#3a1e|z1= zyB~OX%d#78_}N`|?Lswv3k5kc*bnd)W}5(pU9!2YH5rAiT=(|9S)UlZzy+Y_sIqx7WV5UYQcEdqR4 zyig^^G>wyb4;Te6BmjJPT^Wr=(sSU&MraR<(7w31Sjm=LF3--+PDx3LiHQM955)e| zsZ&7kf#QeDWU+B^uou7)AWxB(Ur>m1n&CH#OLXx5XC%L-rWT!a#-4mzn#;k+LI%s72}`*p=YB z@SwtD1#iIevN8Y})=ps5loZ3E2yO&6N4Ptpe{z(^7gG!E#MtPY6V~7LtFKy9E?Lt0 z+T@nDx=Ni^qgK|{R9ibO!$TJ+`WT)v*koDrmypCxCv>rl%6y&^lkop{*OtIDeC53yZWg;p6Md7vDy zeci^5fWv_50Lx5cKSGS1WEuFpX8ne*uULN10}nj-@Rpz4afg3U(60ShHuc{X^zaU^ z70Z|X>=$=ExMk~&H?G*U`N4poAmH;rx#?n!YXt_Unle@PPA|g6&d-=O8~X&d-JVMFboU^-{Fwm08a1X>rWI zbma+?C4P^`;^&B{FMn*;^ zBqpY%rUBr~6?p}Pg({U=gN55NxG7ZdYijESA3i`mrYewnZ!(cR$7JcSxLkOyrlh+* z!LkT^zPHn20id>acEV3KU=gYXt`OcMK*i-b*@|2_+#r0bs;U~^HKQY=cDsWm&dwrKyPpBRgtq zssU1f%Uf+W_9h+WTK()7Ol-k1sTK?Dre?IFnj8*$m!qo}TZ;NdL=gr)18=9i7tvif zCJAquAdtt;tqE6ZpZ=&j?ET@U_b!cm@YeKyyfN`kx8hYp=$n?v!HO5Rul!$k{pj0y zxtU#d8=5~a3<7pCSe`^|pPZPsmAzSg__g};Z;iTsb9wx|SBGEk$}c>1m;Cfb)%kVi zoPf;ZcNLyo6@1{E#f6H&fj*@)L%>dI%z;NAyL08r8<#V>e&oomeHi(*`{1FK zKl|DJn>XM4z=O+{-Ei0H)qX*{f3a>YP;};U4D`c@m;eHHWbA$@uy5P3WBc~)2M->6 z=9y=LgM)#G!0TV?hoSMN3r)e}ei%2p{;{|`bp5ZG6(-Grlp?$v)PEvbA4`@L@Hy0z z-$u&n7t!j8+jAv{0AE_7(_TdQhoYpbfNfZLa{Mf9En zK7e_8dU|4FA{;yc@K2vUedf$*6!62sqNAddl9FLNz^_*FaN4r^5tcGi5mqb?;RFsJ-5g`o`%4@t*Z6Qzg81nwH3H-_PljgnwQvJDl5 z`+9r3ySe~*V9OX97PbaT8bi)LJ|+$*VR#J3mUa_d9&BfIEHc@jgfBB%}PggoWxoG)aU-_$T!LPNQ>#I2aOyJLb@BMMS z?5v@+mCTt_LS=KDs5{)?Rfpn@65rQM`ByKFzv61@uTJ^ka&JqTUfJxgOy8q^QtojVY5a`Xl-z* znhauldX{4C`t^Xugy;K7ieXjMeduOC0H5z#v-V%U|9!t*L6p88uzSyTKmX;+Fv#(q z`|e+{V#THh9)Q0D+V95(YQP81!b3BRKb1}4V>|0hI&$R5@#DvV?GzRk*0QHqdR*mw zNn~G#$BL(~OUtHTR{FXJlfPVSm!`P8t$A^NA!1K!F01EI4~wfe9PPP`^R~F=RdPfh z+9ZKIZ#AM4EgR0$LoyEaSdkwRFrNcH`E#gT3#U%9-^1&fDz+rx%b1=+6+9hXI?U#(s!F($ z&)C{|300H(!w4!nJ%FV<2~jS-|6l-Uol4yHqZ=K;Hd zynKCk?cEPwZ`^d>b|2q+AKbir`Lb23*KFPH_5C0I05IG?Xg6~?1`=1tCR3)vZ1?fm z=Hcfwier zR#m|*Q^^*#l_nJ7TLAS5`6)oHgOMU9+VA@a@L9+_COkMC_9ngF0>}3D_L}M%b9=i= zscdR&gx_jzYF5YqBGV^IH=OFLsz4;s{69W51QTD3C2L{$WPA>8*- zwrhw5cT{y4;YPf@YRi4C^w5QZr`{gz`u(Nh4_+O7|MjVN`pc%9&s}lEU$Mo$xcl~> z|KOI0&@*O}5q=$ZC3sdR1mnFhBX2e(jA;CfkO06-t8;K(FtJly@2pBcDJbyb;B1P2 z7fd+xEAYF(OFBET3JH%J9C_d~9H}}iot92(SGN;(TbHW`zNoEt!}jvj%-ppbHu(4l zAhrW(XF)MI}+`b)7g^??A#CI79+4w`nsoV`uB_Ti=h2n z%wLGr&(-Qb5SLqJ)=k6VTD?@LC%+}3J(q4cvF8zvM=;2Ph4-ToJ=3z?aEn!EA+M*)u#kIyxySDLp+SJ3B{_rzj*FJ}cM4O;uJ_VUkXL zJ;gO(J~Ghyre@&AsN=JKDhaC_04nte3Mq84VofQ&#J~;Gzd}4x9rP5VY zwzRd`9S+zODBuhS6rz(~aO3p#_E|d2EzQk5;s73Jg+hUPJEfM9Wd^%w`wNHbmeVa-uHt`h~Wu4KIE)ko3n_TmSRb zf&aWR_2C<%SDo@#+Cty3##W^q-uuwMg&hASY!-t9{csC#<8VGhMTqr>3fbwRxHs!g zpPsGbi$E>>47p+^#iTDmY!?;v86gvFn)};@f!9Jbjqm|4SGX^*FH>i=!O(^S<^~4f z1pp^7C;DW%Yk{}xD#b7vow`H^ynWrqjey32y3Qta0FooHA2_%hhgRbK7i^0jIon_UC46u^#fGL&t6{s{{D|X`slG^$KZ7f zG-h5MMrhWS_+i}A*QIpbt!%nbx2dNu>F)^YuZi{x2{=+pKW|xf5xHJkmUUBac-t&T zdvTWiI1ghXZci>3DZPi6G^h7)CN;65DQWm*(IFE)6>VALRB3T>F#vvkem;==^z?L! z&=GoUgM($^vY6;-Tyv?awgRaII|3G5w!^YAzDYt>a%Ia%3g&TMMJDdAl> zyM&FdMYc{8ukbU|g)Ej1I9RAvs+5%EkkH`Zu#n`Glp?jNrmn8tY<9X_r2p_iv{dbd z$1^WaLFHgTQGv{}G2LTgh#4iNhs(l+I08J{PXdVr7=e=voI&6Y+HJN*)`v^euXr7n zP<@Kc%$ph?eSfm%5BBiCyl?r-hg}~H7QWUNak2H>#kTOW)E7=2-5(!%TBR(oc3Q;b z%x-w5;9nFb=ZTZ=CWTNJVU(UQO?7%UD29j0aK}5fFA>g*Bl9N3pfDkbfIbAZXNKl0 z2~}5kHNs1jw{p`z?R2_K?PlQZ-A)(QQp>A|u>-ajYb!Ex^4G540F+y3Q({W{o&$$) zw&{TbLHqUv?c47g7`S4^iU+rCTeW7*^5x6#x&QuMd-no{`(i#!kZ6es@bVKvdV#AW zwtIUA1_lCM|Mjnbosf_KjD`!?i?$S% zrqk(2!zW3HDz+4%6C8a0?3ptF_@QAKl8F&IY3V@k^YZhRMS!5{63R^jc3)YA4jsXw zgBm`t^H$bu1w6hmX;bF69qe0T1G~pQdv<|X|`CL zJy?1kVhUZQ&s+R;z(p!`&$=EJT-4Ute8q9c4ud zoS!v;vc~^udb%!8kG=n@`IEt{Ph1hdGraVgIsAe?zOpbgGc_?gBUMwZhU3668+0|r zu)VCTR3f3zS{x}&ow)aB8kwdivUPS=x@HE1cTvAqnj9sHsmEh-$>^#(D0(S0|)K7P_q17y8U^l?~J@+A9->_-Z zy1VcGr*D39o40pBP!N2}izzU(`7l&DCDQKYwQt|Pr=NZr=to9I2E1Yc)hS7U13TAY zh^|Z1*C|H8&E_MhA*CUsL~2Q zY_)a5AqGwdS(zD$3GrrgJEg}@Oiu7Z>Lk;|sDep)dt_83J(BRy!r#EL1a{6=WO1YiZ$!j`Rv?DjGaUn_z2v)H|W4Y zAnow=s@1EPuUNMJ-g~?QcHVpc1O7p~19tDe@1cipzw^!=6b>UwG4S9QL`A??(6u_TA(iz(B6**laeyQqu5ATIUtpat71fq674v z^qlPM?4+cm*tj@&(~+J-3_m(58UQ~nJv}=o7k&)jz8K(Mqt#)-wwxF~>NyRK+l&nrAhd5`)P&A_=a9hw%cN ziU^OQt<$PwMo==ukBBp2#c19MDxQ#<4_6Dnt8Zw8$GN$w3Fm@U*TB`XVoJ}L7@+{q zh)S)Zo>p#^A!KGA&j}vwJ1)lhPDmI&Nh=c~?9(_rfx}BDrHb0lj4)Gmng`3wu)N2M z%uzEV0Q)p){_qXBd$2+G^!9aich}bIOIR(Hs5|lYHS5>;;1Hz)B(PI?6ybf(ULfZ? zckj7t%^H>-vwbHTAb0x(1>L;~nEZ-={kPk<`S_q2#@mOrCi&7JJPQ7bkB^6g82MrN z>ja)#s?PATDNVtH_XVGV$72NC==vAaVLZV8KbY7rr64=kb-6@?{o;lkDZ{6rO9Fga zb1nDOT1A*ofX|hD-bhP)o}7(roCvadCtD=rlbFL@I>7KLRDt{O)of8DGH~~-tSsJR zOBLIY&=48wIq}KK$?)A=xuT%3ut>!tbjqpUN|a7#rKfSq;G*4EU(U&1xV$Hc%U z1;-4y+i-($VRbdNruO!3M;H7o9A1<~g@P56#$HcMiU~IW{$o>;VX1`s;)EuS-ZMN~ zh70Uul@SJ{GV(79GM^#vH2j*g^hu$ND+JEG!kSy*sp;wIg)Otbu}Q0|BC(xOcdVr{ zfBVioi0ugMMA~=l1z_K^bI%?C^ZPeH^wXdJ+&jSEKPbo#M>fv7BD-ef#zuJ$m%anKKy~89*&ahoR%1)oLYR=Q@mAoFg!zxqV63sl#}H{VRp} zONaVvV!j)(UpnUVURr6m3DcVZ?Ioy*eo#jDd4i6dTJl}2yW^DuRL@phQM5aUq zo|#5nR}`BDkWM|eH1q^WerRZDL}Vn;`}DMo++3jd1t{RF)g@Z34%t1%DO6SAY(v6( z3eagY2>CgH)tx|pnVGqVwFpqXwO`D)1XfS!l&I9`n*dkKw52^*TD>rWh(1jEyfA|B zGg&vooPN`z0bjt@0b5K>O?7^rJT@-o-1)O%GFe7erber6YH7AuJ6$*$RoEbefOaixNM`rP*Pmd*x0~I5ICI*eh>hvufGqzrqF{~HZHNV3!PSs zw`1=WJ%i$R#|5+(Vsco9*fd$$C&U4%NW!NDNe2L2n5;KB$=x+T+IfdHZ2>d0+Rl{0 zV088Lc6B=e+cjmZDYZmbR9prh8QF@p>(_bv`va;IY2U?wossrEjJNMbi+d2}^ltI; z`aj?O&NsgCPdEI-KYSgq{l`Drx?_izukW_)m=8k%?C?5)qaSbyc#To;7YXc?(@R6% z7uR7HFPnOF7|*)SMykaDe_pho*KEH~cNGVGDdtOE_X|bkNQphSWpX`-cs@^*?` z%zl(gI%LtIgiI3frSq*Q37;^ZJefeo5)%_6A|k?A3_cM2u<-EM*x01xI1u`%Hh;YrC!`O3mF%*iy^ z?Dqct0s0-{`GoUyvkseWU|`T@wZh|RG8*BbF}ItYP8a;K+v&_N$md;4tU-1{lKmw# zM@)*ANHJ1odbX#DeD6%F=fN`L$ki`O8lI-O6eCV^S@`Xt)2aApamrUk}{$;O3iezIoZ#zIMac zzP9X!ul?gK|M=sd{M&XfudUm*1q1{<`sky_j~^#L35ynrv2@!e7sIP#M!%j0TTz|YCeMF+l8i3}ezbV|!v z41P^*Z9U7tZxZXZtt~A$v)p9tFt-C?7PGruG=-M1os2~^^KKA*jD+O^i^rjOV`IYb zDVA@>LoCN=svnzz$_G)wrZ+gy?{L_SMg!b4Wnn=~bW~_)NMv+WdRCUUthBkcwae** z?Pgp|6BQD8NW+<&#KaqB@6XQ3=9%q6V%Y50(@b=q5Kmitir#D)oib-8#Yr4AiI1TB zqVNSTzO(c&agc{3pk_+K+h^;r@a)467>vN%d%C)2c{>U+#bru$DZ}=4JFxAPP#tv` zV(e_DhG21A^^4Uv-}LpHZ@PKK@)gUMEx+-`72o>jZ>?LueuvkNprD{%{_>ZnPMu0m zPcJPkg;xs&uv6KchLrIb0ix@q!z|R7w3KdB53qaIe~~SRURq1hbCxLMyQw-Kifi6x zD`{)(T-b-jWqdcPKUcsPGXW@4SWt3E%;91_ERu8p`GM+FHZoCtU}(Gpi}KT`bgNJ( z;GG^HA0HhZEn_PxG7|7V1qJ*}xm;d=4OdvP1%j_5dXI=-1At%8zyUG8soBtqQapow zzJVJbeut+mUfyiNR zZEYzn)n;a-M@Qq-@|d_d*r&=XDva&zl!Q+OS9lD~mJZnHcuiJ}a7VF3ES?gd7lfBd zQE3?$XS|L}=5$cktyq2)`k1DL44Fw9x+GdF1*;^N=mqE16ph}S=Ht0rT3dVi`nsL2 zhNfopw`9Ho;!CAws<(`0kHFiQ#y`OU(#Ir`t|r>JPvlx z`fHgmzc9o9ytd4FF@LT<6W&VFAy&lgxuhd)yy9K_(zx{z$#hpfB2ensA+}FqJ~pv3 zLp}|?BB~D%u2d=k@Bsmmlam4DqX044M8!yvFR!2w_JtDi=m5hnF9*c0t*LFm z;pKWF`ArP!F+8We9mm&NtyHTe3Qd=KfnDk_$8FJ6GejBq6miKuv-wu^!x(f%bzb-% z>yaHHLnagBN8ldY9d_8t5b!fIV&h`NWMPRZ$%=yfU!C}si;XE^Hv4g&Do^su_}Dn- z@bvd^z<~X6Y@COlO_1t7CFTH63v7IvM}(pKT|oXR`Wc$R$J{kDT!Uf31=BPaTV(pE z&b1i~uo;oRU8}2718--*PT0PB?OJbt|3HDR?+HLDW|touS`F~Nanq*NYuEhb&O83) zd*A!lfBoSdcigdd?b^+oH~abd9XfRA`RAX9jT??{m6eseaw<-lbh*U{%$vT>br=s_ z_pHA=wEqH_e@(!j7xNcMRB$WW&K+Vkub6XDTvG5C#(;j-oJqY`0JD^+L%ml7_>`hX zjvZ-ordF#ZRfmi^adEMck&#i6Q86(w@d*j3si|3+nYlT+`Iv%VNV5$~OUnR5YSEC1 ziVil|vPx|;E7uwfXtX0Kz)1rQ#oT)~z6t@H%R7v^U*Mt*Q}S6-r6}@@F;@~5ssXi! zC9Sedgr9&d01h`+YbWb+9c3oWQNd|XX~S$-Dj%Xscn^Q(*`Ex|QoN@HD~3T~kv7 zn=j>2!}HDu;n9S_xnnipH3_dwqU&>k{R_}_53qaI-yr65*#E)|f9WLO&6&B7OUKQq zvk>eP;7e1~xRTEqK2O&nd54630DqEq01c##w*>gb#l-~$1qAr<@$mrl(NPHaaq$T$ z0Qgy13e3P)ssQaZno^9=K>;6=fmu8z2Bt9sKF>vl&7~77wsutS`+CJo8yq6K&O~@J zPm8ajIp!iOW|99xA6bXO}Nd$-5(Psj35=4 z=gL!(Q^@*gv)Q}4x*c8J><7lB-K^Y%Lo&NKTy;{M>m=CPX}ZS@nrAMePsV8M?d$J$ zx*D5W0Na7LE7jT}hV40d$~EgylM!{8K);>%fxsRR0AJjF@4ai*tl6+(!=_D}9(w2@ ze}8|V>o2_U0?>82Tn<|;npgFDcphoODIDdb<4sA2p?nx=`nsDAGuOWEF*<^bya00z~&?|a|Yw%RErhz z#HJ_#m=Dgz)~AaXCxj52X+H0%t?DPY8_Yc^*4HrQA-o1MtfBf-d$BqRD2g9}t&q#H3brYK%*2eOs;pw9XliG(V zMgV}F_a!aezV7kEc-B`O?dOfeT*Rfbc$Us0nD3_HOJf$eS4Rr?oZ<5cwr>5l-1W`# zGikUX#i;?*1Nu?M0y%bw+mlO^dT#;nX}%$4>BJ(x$B%^g__Wlt?Cfkg0Db|Q@KtIx zi@`6`mFw7`tLi$;$z(1a7GF%E3ML#s*NIb~So%F5P)>CQ9$!zzR)Bc`ZI*#HBx!)6 zIC?>Ir??xEYk1dELqp>TPQS7PNSoW+*>@-PP0f0J6MVOKcfZ5Z3HP*Ir-MC; z@qbZ%7fkQd5@Y0~IGbr&81NxX1|h3F{sGXJ@?`YQZJM$QRY@73dZ9`KABw_a(q#O0 z?FwM6NvOuKoL>0w!FHvfg9i^j@x&9r)lZ*34G%MHvT(d2KMWZi;hCbGUXrIshv9Uc z=fiMdUwZnw2iQI9D~tKp5BQ5S{AF;;Mc+#0lTiqlgWe~6mvQ#0>y4)>OJP?2=+?xI+-tLh;qXK)JI3e zi6f(96f!T8cXoamA9p%kG?urWg@0N*QJXq@>U6u=oRp9RCk>m;-cVm}GPT3qF`{>| z*NJ^z{cNY;%}}#hGt~V$DaM6Kbekzo;Mwi;*c@FA`WCIO60n_sy`ZQhUs=3ic)OZmI{|yXvIMZ*%h!)cyDwAP0oCEdHvps8fv%rAbxJ0a!DCfaR0P{7HJl1H zYf1Y0++j&`r{K-iVLVa2p5`R9mN;|OJA~gBn za=rz)1?Ec=7^Ilz7^>?I0^%3wgvqmn1tNl&nk)I<0E2ED^*ode!&xp z;DsFH)rfI)MUqfY(Ku{k;F!zl>h9|9a&&c=E$zm3jBDt$wl=pa3kn+Q>VV$U)<8(k zO0LtK)k{Si_#^B|%qN4jRBc&>s<;$@ov>YApkB9Oy_cUK8?g}xjGX~{fZxuYPd@qN z@#DwOpFaN!%675wU!e4Qa( zs-UqWm=5lK#H|7-B5t!KDB~q?g#xG;-Wp{^lAf+H6`0> ztUzJEEqi*fp9Qyd^W-!K6{l{TY7n6)yQ#>$>F2o`=j)Igp~rVr0YYN=o&FjttqBgq z=e)gMZc^$>?!ML$R_G_-izYJ-(Dbzxq)b^fxA4l>;mS`R&48bj>qL?ls11APH=1LU z8*sLfYLe1#=@Jus^Xf9OWiVlgRglDbxtJ>FvJtb!Pn=X}u>RJXp~)#o#9RGB{L={6 z&JB2O`<4!S+Gab*<-b4Vk@=$MOB&TI&aOs1Q}h{nWN4v~w*_?bQyv;>dP_@7Dr#ye zDQW1b$jEOc+ojtr=V6@q`JsE-^2x+9hPA;P(~Vq>r=F*Am&N$f-)r9>r;WA<5r;T% z3ji#c%v=-p!n_@Q8@;@P11yw%XeMe!6tMdAAuSEyGwdaTU^74z+_GY)5a?4H@@<3u0c*WlpzdKazZA(dc?}N#(gKrNj&MtjfH8> z(Mz%BlP{e8GIh#=GAHCL2P*7GSGld@&x}K8xlf_IU%eknEqcw@I2pGMR-(?+HIcsfj|2yQ|7dV7c?rM{fZ_xuJYLoe5UUjOXHNcA|-s z6B9wpGLn+82ne|Xfy|7YjDn1h>G^5s_^6+77z8)!C%@AzWRmhVG18DZ`B2u{*cx8; ztN4uj9OD*(j^eM&U)6DtP1qIHxDecl(y>^@jd0*KM;_EnP|kHB-&i1;oNnN<8%}^h z!h0~Kp_0w#4zEn);+R#fG5p3*NF7VMyqZOPR!9yStUnoOc^<1)>(v^`n{F;KX1Btq z(mtAJ;*0AN);WSq4t+sQhdmEFdy_6vUtMJTc5;XI#<)yVe){U*;6T-^*enh8P?(#K ziwQ+02UxAp>d~L_pf4}i)zz1Hg6S^tEVCAZ21UNI+)em_NTd?K!szQ%IbD@1v@?sU z6~mjY5D9X>-P*O@_(4l{UX6~P4sJ;<4LiozN9Ci7_WV4jgGt-ldN~`N*DO-gt(!{~ z;W16_aMwPkS*^={cBLVlYLUN;UFV(-ZPlg+ooQCX;X-5;2Zp|d4uaeL&VpDcZ{&#>1m=jT%mLrZPf{`e5pO1dszM^8s3BMC>L0luLu7+GgK z2YV(uCY^Hmb)SJ1)_M0)VZXCoy%r^KLy@17pWpkgZ?ENl;GV&G$4C;2pGrxuJj}Vk zk(Gfe8xnOkyW5cctS{@wsOzAdSCV&8ZF-w8iYiNwfAb55x^3AWlEQIW^H+}+lF|yb zE95%BB~y9n5#UNHO3LlgXrLv&ld?%~o-YPm^qKrF>{L%{c1mk@Ce_xn^$2?9?%){w zB?UB6!H-JAhjvq}I$gHCBw-`y zEZJdauHYRLk!R3%nDf+?^K$h$f)zu6=MyFAEt0q=zlp5GY^u4dA?&nJ$3CbKdVx~D zAK%36we2922Y4}&#j;ReI0gOW-XCL(tcww;r8Nn9=Qz={9>-`t=+JlZP_@)yF zHG8%Vp0i)Sj+fQxin>Oi?`XY0$wEAHel?DX#`%z|W0Zq~lF!UnxP`!Ay+|j)Kx3i6 z{EH?hI77PzXwkzZMpENih%KD__zsqivop&zTD&8bV2L_iq{sQzlDU~|upU*8cfQQ% z!^n_x%2T@K|BY-BqUoG!KI_V{?mm<&@MCPaVuxna9X0afQ^FFdk0Xa!f~T?Mz`3Cpaq zTP_VThEDVDEv3PF!5=>n4^q*u6kz?!it1&1yqI?tBoe={CqZ5YzI-u=HvQ31?f1Bq zbE-vg;a+u~Tk*?&d0fW{e>faE>0h|Hqt<6=d@qN`$VZw0=*jzz=M+~WZw=V)eQh0LO3XX#-} z!Ntmo%pz-LXJhL@!OqEp%pz{*;jU`sCgJSp;_PJQtC zP-p-Ee9F5mb4KUM1Hu0vVPz2Lnt(L^y8!;o+4$VS0&pHLl?HjAp8 zvxSD02ZaFzi>jnFh0%Qr{MA?-V0->|jl{6duE`3BOTZaPpir1OIF-H58if2ze^$DZ zIEvQ?2RM?zxBt8B9?Jjkl#<>lky=KODjEA0%bJ}BjT$!XY{S=u?-JP2BqlY)c&kDS4l z{Y%jIa%R!AdhYSBvS#Du_;011HEl3hP0EA5l>2tu6JN+z@XBKxixpUx zy1t*0QtA$#3?Il~vEXaX`iz?OH02zGe7@|&e>Kj<@NSt5_gc>xef@nrQN-Y|mqn!Q z!`r(5_#i`>yvlwihWNx2@KK) zOGQK7y=O;dn?V zLAi8}K9Q`g>vtrI+J>@bD#JR@Qi^=}C_0snQCgZz#Log$ZzNUY)!OMfyf0tVDPvKH zLCsQ?i>J)km6V{zp*@z=7BYfUD)JhnukdTb8A&N`(#gBz3QQ3s=F@Bw&rM!ya*>=A zcp{eZMSMYRi=(!Xcy=e70QyO5I>NU%2YYBHB(06zW&Ak{WxRn}7aNCk5qc>lUIRsh)D~pqe2@Gafb&oMja0fpS7L4zq%+C90=W9nW3a)IL zHSjmA)rXbGBn?y#R55Cr$T~CH%g~! z!1|<9d0sxxg~%^#%uil#_9?~Sz9*h-2v>A0U8;#G zXFNxWo2GT85B%e);M9?Z5qqUpGpoK&9Cih!0yz--g$*LYQSGVW=^tMCwH{*N(vPAZ z#nOQx_Z&eHK4!6gKZl8Z2=cS^d<(6{YluBuEKu6uBA) z8@01s9}_cKJGu2pFu(7UyW9Y01L>$b_1@90UGjcy?UNw}_W`loaDvg=NiUZE1`7NL zL0%dm$YGl=gWf25t|+@Rm7U*8<`Mt$Po&2~uVytGS`pRKeYUt?hi^@27;Z>?uhJBH zF9`EYj+NX;I?vHdX&iI@xemI?f@D99NfoF-Et($=dK0X+c=k;8fqC8q56eD9Q4dccu zo3f0vbGRAbZ=_DAf?VJ`S#wYm3gIaz2HqtRFi7C%$R)vlsnS$>FZlIrkD9?7wdX-W zj0fB9$U*MQ?3s^H{TOneVg%OO2s635_33ie4bB^|Nh+#_5d%sR@2LtJr~ zf$I@nO^qSH?dvW>KNhV?vX33~UwOLgpQcmWHmaclwE*)0UoB?+uqb|t99EnwSdx_A z_3HMLR;T*tKx}d?^e5Dy=jDbdXqmyFh#xO>9BnLCSxUXXhAs@?umHaSh`&D!cAu5U zy+N#ha@nH;n;`~l2JJ^CIvcb&5|RqU1a*Vew8dX|UIpo0g zI@~5vQ$slCz8ezhqJ;RcTm@ck%d^5R#f+(b?`lc^EnxbLAvVbJ!>F*29Wc(Yv6?J! z*gy@+CPYr9x@Q`EiIvsF8wrsd>SqfZsXtGB=EZ{b-m|~YLdCL{woTuVSG8{<{M7Pzh*1e^Jc9M#sD=AvKuhN!!a!rbVO1XWijim-`MpIBY zZnD4x4=?67YuH7C!2#3zrb;UR{yeNDxzaw@#*_#JL**q(oMRxrLj^9DleBF`I{fbj z%cwJ)TvnKF=w-2KhwUs#YK1m2vv<$k+BCP1mnqGOaQBJTHBYXl29=*H9#|d0+Ojfk+?D3}?_zY5@ zJ||cHDi){Sb9*@@lnST7MeqIU3+6ZcFqKvexpSNc3hd#A-g--|D?ym9e$k`8$>V`N zR|ZIw3(D%~>ty{{SY2Iar8x_dQFX4pLlo3{yqZcgr7m+$Q8#9yyv7*#(;78Pvvk~X zUT^Su(9rv~mnjoxXro}L>=DHfD(r%Uf(F_nDf|=#HSe6Q1%v(=uM4=88vS2~LtJzm zC7tx_)St06=(JjU1xW=A4MA6V}p?=_X{o zB>7#s#r4&LZCO`61bX|sWwVB}DuM3lyq}!HeLt?#6+&2YFG%QY}5k6uy6~V-=1dxsQT<>SXus zl=O$VH4i7H>CG#ttgZIb9Kd={mtFQDann zS$1u4Z?k8Outk5JSqYQk%y>r{EZ zopHrB)lShp6E2GC5#(W;SXr%lWWEmDT2X?y?PHlB;J?G>N`E!=Ri}9Ud^$L)@QQ!6 z_^a{wScYu|387LoZIOJMy@i+qSCc4@)@c4G_HH}yO_0%F=ZHdy4mBK?Uzn3*D?NKQ z6vG>P{_Q*`_V#epuv;kr8G($dT^yt=vuU>F}wfc$I8E1CuR#@1ut9&TKH$y%@AL2V?r8;A2wQ|-M zGByD=tF5iXFJpcYAKe)U*fEnZ^?hW~R-acW8Y|1VAUf89@r&R|jjs@H`6WU4X`0-< zf`9EZ5bkIf*V{&xNwORTZY{d_$`(jUg0Jd?S*v=^OrVe zO)`)V3o>P2%Q!w85i`q6IbnXUbQR8;uXjtADxmfZh`%adUm^QCx6)*@!Ts{Bn?V&l z`sDL~r8ZQ{@54FCgA*p$ah9Bq+BJTvF|3h&6yj~!(`y|LX?fYx7rEv=02B3pFnKvR zKy&6VvrXF5$-=|V+3CTu1w8|j&W>hwPM{&lO2GzNOd58+R^Sag2>$UCXqY*=I9S~~ z3DnJ;Z0;jL%D)bfOvTL-w0J=)=#Q^}gA15FeNXMhJ-#KZkxR~b1aRSI@yHdbafUN9vqJ3Bus7e6aE=%wN3 zVB_ax1*xI(ewTA!hx-853hH;R_gO*xfz81fXs|{w_aq=5=1=Y5!CUyh!FYe*dpaoS z-}%6U^w59c(|b0+fcWtDFEYB%7o@yf1S9}Ncz6VOI79>l1SBLxWK>)oBBrK!N=rx2$;HjX%f~MvDJ3ltEX>aX=QC=YiIB7;pyf5+{ZT* z{1GfNDmo@H=}mGFQ!C(O*z^_Z%f*|C7IZD@act2bP1qh76z6lFrmxY;{CgOsA9>=yntu99< zk!n7*%aDQnRWgg&@XDh+K0tt5Gn_0)%U^vp`*pQ0!SO4I%9O^eTGDxf%0#(&teR=7 zhrOtUhsBU4-+)Q}`kR%$&rxTY7|$9(>Z_*8^V&$@3wV ziW71?R1$P#`PEk2PdSjmF-sdU9a^ngQY??v+;6RAp2z(8a)?xKu+NKDLzW7 zZF#|^pj*|sM$h`wvM1l^bS+Ob#aHonD6XHEL}R_<&&|(6P?N$1{&A@FyW*PoLJ#IlNMHpOz_UJ`E#VvW)fj*lQt%o{ zn$9*4I)=^`3cL%#PKiMREVH1N#-L_ClFWgJI~X) z&gQzWS@{IBkjsw*a~YtEs{I>8c$PoAPvVxd1+gO{y>4q>7I}Udc)C-b9&cXy1nr3K zLipF)w|9VXaEb-_(}PnH?;ra5JlElmFL{o*a`H;oUzI>?w-5S$iCdCCUdK6Ch1Ial zJ5NzkRP0Jb4T!gQUbKw+LM9oQ`Kak;)Eq&7{!L(!!tF(Mpw4X7$zl@Pn5HzL2F((O z#Zz+bwN6s}Dx!Mr1*vo-SXKlgV|wsoUb)X)#)df)>awsc%s=L^X?yHYW-R)%MRf`W z6RG8PquxBj(45+MWyiFVI)K%RzO3eDEf|#N;`^!y!`BzS_{ey%Z=lRAJY6D4wqIjx z>XVd3xTSM`bNJR_5t;u$^=9kLtQ+OtOUK4>~2uZLi+}!!<@NgdL)?CJKj}$IVA_ zr53s)iX=t>E!ROh%(bp*m?%P=&o%dS<05KXMeGC@wdofHYU$e5aL2Wf{hMYV5tg9< z73aM2dZlnXYJb}G#OHWMB^G0_MvLAe?kyp}wTQk1O@;&X(MMAIw!{yvx0N;|v9%XL zJKOGRTlUUWWenN7?7bT#!O9{GcYw$G9ni3~NnUaX=oi5UH(uqBN*s%P6@ehKipPfb z4z%Tzl-&VBJBJb!DO#pwm=vEi6MM6oRHjx-WIGs0WaWhLq~-D~k&qVhKd3@~)2T%e z@|!A!d>sg3|2b=qo@*jM-8fF2iRRWra24Zot>WBuT=m|M*Rc=@*Z$=;9F#lps5nz( zo5LM2$pwB;qur?&Su$8nymT8VW0PVd**hzF=2#gJBlB2KS?3kQpfJmG6@x>x+g$Es z2ufp^Tzgwb$tF_p2*0C9w(m@SA!PcyQBZ{Lh>nX;AdDiLNnU?6Icf66jcB=|HeYVU z*(D@5WRJ-+swn2@@%R2G@RZ)9g%l?+(3L-G%$HZ!cxBV-WAXbsb}{r9IhG__6DPnW zJ4RnGk+}2?-fImGj6ylRKgzpBWmDp0V5h2SZXH_@#Vv-dea+F2kVV#pGv!@*L;Q)O zd|<*6+aRIHp}L=+=BS`r9YbIF=%)}Dm5B-?UFy@2g@y?l?(9Qu#3vKkel}c#i<~-4 z7|FC=P-5uqQ)93^DKi{Ka?~fR{6)_qlEoGWeNQUOiVr>~l|EsUrCDs%XWej-7Kz-b zQc_=1eig@(+$v3y<%ab0d^X{HwBz0JGw2_(?|fDhsh8Bf)JafD(7Psb^7FUPn)zV| zb}T9vq1Umow_q&d+4eh@DR3y*RpdowMJ?c&3e_QU9q+!gdBylb&v8F~*0S~1 z=MMOxW3xgt-96UNRMXHJXMG&f@z^FFrQu!h=+F{LAW{!QgMi^_CeDkxHt)AE2gscA zI>N26x%TaPzDnJ{*r-y0h=mU97DlKau^6`>^;_W~-82)wjpDc`*6ooU$1Ck`Gfbc@kAH(zkfHp5=Wx zfkK)lwHU-I)KXbxe0KK9Ah7O}Wpw=LR8C?1Ok6ixyWU+t!d6YAp0D%hOg=@#Q5WQA7 zW(rk3$@TCo(NppWJ1Aq`>{NzUcHt{Gu!mo1E?R`)ued3zv{v9Bs62OdN;kRKUSj$7 z!$4b~lY3q6=}#;2?k^ug8)4Y@I2T{m5d}xEXp^&DqJNFwFqmm#U8sH{iu7GY<9zyc zp86Oi06vRVp`>tCp&fBE;rL?!vshmZMS4HY230tshW7&Tr!!;yx0f)g!r_*4-Hv4Z zKI-g&j~TRMfZimj5yAI^X&t-BO@Tl2?Ba{RLJL;(ouTKiQss8D-fA^V)57Ft%&IQ~ zuMoth+h#N_97RSdhVi<1<4$(;0zbZSz0A5zo?KCPz}@e$c#~kxTuaD|`>LehlRP6< zz4Gj^C4!+y4?_z*FSoPqSsB|~2xmuRdFZ*urkTZK{F@c#c}f?yzFW;2eSHJNQBK-2 zrcQWqjO8c1YlmFVcf71sSQolJUM<20@=HJ#e=ZC52v2Z}Fs{Bbt<8J}>9KJ3BtfG* zUiXpp8XEShtQ00X`SJ)g_fL#wXJyv z#F2ceHTE&}WNj!Viu}UJq30`A)l(I|YACT`E{%12{9?TqVRkWBeu32penV~c#~m

X~(|?IHp;+zVPqXvx{!A0MGq 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 literal 0 HcmV?d00001 diff --git a/doc/testbenches_doc_resources/5g-ota-bench.png b/doc/testbenches_doc_resources/5g-ota-bench.png new file mode 100644 index 0000000000000000000000000000000000000000..86ae6b2b6413025f922887d4e0a17c934acf0297 GIT binary patch literal 96734 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%0Df-%sBKKHZvL8?Bum$h#?LEP24qI0hr%B-N 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⁣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 literal 0 HcmV?d00001 diff --git a/doc/testbenches_doc_resources/5g-ota-bench.tex b/doc/testbenches_doc_resources/5g-ota-bench.tex new file mode 100644 index 0000000000..c3a524fb0a --- /dev/null +++ b/doc/testbenches_doc_resources/5g-ota-bench.tex @@ -0,0 +1,68 @@ +\documentclass{standalone} + +\usepackage{tikz} +\usetikzlibrary{backgrounds, positioning, shapes.symbols} +\usepackage{helvet} +\renewcommand*{\rmdefault}{\sfdefault} + +\begin{document} +\begin{tikzpicture} + [ + font=\footnotesize, + faraday/.style={minimum size=3cm, draw, dashed}, + duplexer/.style={draw,fill=white}, + ] + + \node[label=above:porcepix] (porcepix) + {\includegraphics[width=1.2cm]{server}}; + + \node[above right=1cm and 2cm of porcepix, label=above:asterix] (asterix) + {\includegraphics[width=1.2cm]{server}} + edge (porcepix); + \node[right=0.3cm of asterix, label=above:N310] (n310a) + {\includegraphics[width=1.5cm]{n310}} edge (asterix); + \node[right=.2cm of n310a, duplexer] (b78o) {n78} edge (n310a); + \node[below right=-0.1cm and 0.35cm of b78o.east] (anto1) + {\includegraphics[width=0.3cm]{antenna}} edge (b78o); + \node[above right=-0.1cm and 0.35cm of b78o.east] (anto2) + {\includegraphics[width=0.3cm]{antenna}} edge (b78o); + + \node[right=2cm of porcepix, label=above:obelix] (obelix) + {\includegraphics[width=1.2cm]{server}} + edge (porcepix); + \node[above right=-0.5cm and 0.3cm of obelix, label=above:N310] (n310o) + {\includegraphics[width=1.5cm]{n310}} edge (obelix); + \node[right=.2cm of n310o, duplexer] (b78o) {n40} edge (n310o); + \node[below right=-0.1cm and 0.35cm of b78o.east] (anto1) + {\includegraphics[width=0.3cm]{antenna}} edge (b78o); + \node[above right=-0.1cm and 0.35cm of b78o.east] (anto2) + {\includegraphics[width=0.3cm]{antenna}} edge (b78o); + \node[below right=-0.5cm and 0.3cm of obelix, label=above:X310] (x310o) + {\includegraphics[width=1.5cm]{x310}} edge (obelix); + \node[right=.2cm of x310o, duplexer] (b78o) {n78} edge (x310o); + \node[below right=-0.1cm and 0.35cm of b78o.east] (anto1) + {\includegraphics[width=0.3cm]{antenna}} edge (b78o); + \node[above right=-0.1cm and 0.35cm of b78o.east] (anto2) + {\includegraphics[width=0.3cm]{antenna}} edge (b78o); + + \node[above right=-1.3cm and 5.0cm of n310a.east, label=above:RM500Q-GL] (quectel) + {\includegraphics[height=1.2cm]{quectel}}; + \node[above left=-0.1cm and 0.8cm of quectel.west] (aq2) + {\includegraphics[width=0.3cm]{antenna}} edge (quectel); + \node[above=-0.2cm of aq2] (aq1) + {\includegraphics[width=0.3cm]{antenna}} edge (quectel); + \node[below=-0.2cm of aq2] (aq3) + {\includegraphics[width=0.3cm]{antenna}} edge (quectel); + \node[below=-0.2cm of aq3] + {\includegraphics[width=0.3cm]{antenna}} edge (quectel); + \node[right=1cm of quectel, label=above:nrmodule2] (nrmodule2) + {\includegraphics[width=1.2cm]{server}} + edge (quectel); + + \node[above right=-0.3cm and 5.0cm of x310o.east, label=above:amariue] (amariue) + {\includegraphics[height=1.2cm]{server}}; + \node[left=0.8cm of amariue.west] (aa1) + {\includegraphics[width=0.3cm]{antenna}} edge (amariue); + +\end{tikzpicture} +\end{document} diff --git a/doc/testbenches_doc_resources/antenna.pdf b/doc/testbenches_doc_resources/antenna.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0d48aa8ab9e17defba56fb89e6c7f36c6f3ec548 GIT binary patch literal 4886 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 S(m*YAP~e%1va*GvCFDN?3v0Ll literal 0 HcmV?d00001 diff --git a/doc/testbenches_doc_resources/b200-mini.png b/doc/testbenches_doc_resources/b200-mini.png new file mode 100644 index 0000000000000000000000000000000000000000..0355e45f1837b3ca5129566cb524af070ee06c5d GIT binary patch literal 238906 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

xQ>J8$D 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 I7*TxYiu>Ovu{7nDFn^eYsIAR?lLgvc=Jp6l%D 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"-0QgQ_f&;P+@ae|xCKI-OpCg4A{V9= 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

txr3cvg?DddS~a=5*D+7If^1vV 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%0Ahv6zr6ARw*_`jR9g7o+ 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

gKrND=tx1)lqF~lNhyCK#r{*<~^zl|> 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 Xw=kVf=>HmO>>rBppYw?K*W&*G6`{5$ diff --git a/doc/testbenches_doc_resources/legacy1.jpg b/doc/testbenches_doc_resources/legacy1.jpg deleted file mode 100755 index c3579df3e4a56521eff8f23df1dbca9ba9fd3a59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 107882 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 Q=k@ozuRl0u|MlB{0A&rZtN;K2 diff --git a/doc/testbenches_doc_resources/n310.png b/doc/testbenches_doc_resources/n310.png new file mode 100644 index 0000000000000000000000000000000000000000..7d6ead5718497c72f4fd972f3da5fd9fe95744d1 GIT binary patch literal 120716 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�A(SmYoqJhO6gzHn~W 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 CdZAGO diff --git a/doc/testbenches_doc_resources/next_dev.jpg b/doc/testbenches_doc_resources/next_dev.jpg deleted file mode 100755 index 72e9f63bf91cdb7fd47a44780126b7269bf0475f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 185772 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 diff --git a/doc/testbenches_doc_resources/outdoor_live.jpg b/doc/testbenches_doc_resources/outdoor_live.jpg deleted file mode 100755 index eba44a3c00e7456c7d2d0cc12ea1e77db31ae10a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 167702 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 O0000S`{PTd|i30zD+sTMw!)aQ? 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 db@{|^9|4aNWf literal 0 HcmV?d00001 diff --git a/doc/testing_gnb_w_cots_ue_resources/gnb.conf b/doc/testing_gnb_w_cots_ue_resources/gnb.conf index c96d207445..206e1b4f02 100755 --- a/doc/testing_gnb_w_cots_ue_resources/gnb.conf +++ b/doc/testing_gnb_w_cots_ue_resources/gnb.conf @@ -21,8 +21,6 @@ gNBs = ////////// Physical parameters: - ssb_SubcarrierOffset = 31; //0; - pdsch_AntennaPorts = 1; servingCellConfigCommon = ( { diff --git a/doc/tutorial_resources/docker-compose-basic-nrf.yaml b/doc/tutorial_resources/docker-compose-basic-nrf.yaml new file mode 100644 index 0000000000..cd1e957ad8 --- /dev/null +++ b/doc/tutorial_resources/docker-compose-basic-nrf.yaml @@ -0,0 +1,360 @@ +version: '3.8' +services: + mysql: + container_name: "mysql" + image: mysql:5.7 + volumes: + - ./database/oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql + - ./healthscripts/mysql-healthcheck2.sh:/tmp/mysql-healthcheck.sh + environment: + - TZ=Europe/Paris + - MYSQL_DATABASE=oai_db + - MYSQL_USER=test + - MYSQL_PASSWORD=test + - MYSQL_ROOT_PASSWORD=linux + healthcheck: + test: /bin/bash -c "/tmp/mysql-healthcheck.sh" + interval: 10s + timeout: 5s + retries: 5 + networks: + public_net: + ipv4_address: 192.168.70.131 + oai-udr: + container_name: "oai-udr" + image: oai-udr:develop + environment: + - TZ=Europe/Paris + - INSTANCE=0 + - PID_DIRECTORY=/var/run + - UDR_NAME=OAI_UDR + - UDR_INTERFACE_NAME_FOR_NUDR=eth0 + - UDR_INTERFACE_PORT_FOR_NUDR=80 + - UDR_INTERFACE_HTTP2_PORT_FOR_NUDR=8080 + - USE_HTTP2=no + - UDR_API_VERSION=v1 + - MYSQL_IPV4_ADDRESS=192.168.70.131 + - MYSQL_USER=test + - MYSQL_PASS=test + - DB_CONNECTION_TIMEOUT=300 # Reset the connection to the DB after expiring the timeout (in second) currently can't be changed + - MYSQL_DB=oai_db + - WAIT_MYSQL=120 + - USE_FQDN_DNS=yes + - REGISTER_NRF=yes + - NRF_IPV4_ADDRESS=192.168.70.130 + - NRF_PORT=80 + - NRF_API_VERSION=v1 + - NRF_FQDN=oai-nrf + depends_on: + - mysql + - oai-nrf + networks: + public_net: + ipv4_address: 192.168.70.136 + volumes: + - ./healthscripts/udr-healthcheck.sh:/openair-udr/bin/udr-healthcheck.sh + healthcheck: + test: /bin/bash -c "/openair-udr/bin/udr-healthcheck.sh" + interval: 10s + timeout: 5s + retries: 5 + oai-udm: + container_name: "oai-udm" + image: oai-udm:develop + environment: + - TZ=Europe/Paris + - INSTANCE=0 + - PID_DIRECTORY=/var/run + - UDM_NAME=OAI_UDM + - SBI_IF_NAME=eth0 + - SBI_PORT=80 + - SBI_HTTP2_PORT=8080 + - USE_HTTP2=no + - UDM_VERSION_NB=v1 + - USE_FQDN_DNS=yes + - UDR_IP_ADDRESS=192.168.70.136 + - UDR_PORT=80 + - UDR_VERSION_NB=v1 + - UDR_FQDN=oai-udr + - REGISTER_NRF=yes + - NRF_IPV4_ADDRESS=192.168.70.130 + - NRF_PORT=80 + - NRF_API_VERSION=v1 + - NRF_FQDN=oai-nrf + depends_on: + - oai-udr + networks: + public_net: + ipv4_address: 192.168.70.137 + volumes: + - ./healthscripts/udm-healthcheck.sh:/openair-udm/bin/udm-healthcheck.sh + healthcheck: + test: /bin/bash -c "/openair-udm/bin/udm-healthcheck.sh" + interval: 10s + timeout: 5s + retries: 5 + oai-ausf: + container_name: "oai-ausf" + image: oai-ausf:develop + environment: + - TZ=Europe/Paris + - INSTANCE_ID=0 + - PID_DIR=/var/run + - AUSF_NAME=OAI_AUSF + - SBI_IF_NAME=eth0 + - SBI_PORT=80 + - USE_HTTP2 + - SBI_HTTP2_PORT + - USE_FQDN_DNS=yes + - UDM_IP_ADDRESS=192.168.70.137 + - UDM_PORT=80 + - UDM_VERSION_NB=v1 + - UDM_FQDN=oai-udm + - REGISTER_NRF=yes + - NRF_IPV4_ADDRESS=192.168.70.130 + - NRF_PORT=80 + - NRF_API_VERSION=v1 + - NRF_FQDN=oai-nrf + depends_on: + - oai-udm + networks: + public_net: + ipv4_address: 192.168.70.138 + volumes: + - ./healthscripts/ausf-healthcheck.sh:/openair-ausf/bin/ausf-healthcheck.sh + healthcheck: + test: /bin/bash -c "/openair-ausf/bin/ausf-healthcheck.sh" + interval: 10s + timeout: 5s + retries: 5 + oai-nrf: + container_name: "oai-nrf" + image: oai-nrf:develop + environment: + - TZ=Europe/Paris + - NRF_INTERFACE_NAME_FOR_SBI=eth0 + - NRF_INTERFACE_PORT_FOR_SBI=80 + - NRF_INTERFACE_HTTP2_PORT_FOR_SBI=8080 + - NRF_API_VERSION=v1 + - INSTANCE=0 + - PID_DIRECTORY=/var/run + networks: + public_net: + ipv4_address: 192.168.70.130 + volumes: + - ./healthscripts/nrf-healthcheck.sh:/openair-nrf/bin/nrf-healthcheck.sh + healthcheck: + test: /bin/bash -c "/openair-nrf/bin/nrf-healthcheck.sh" + interval: 10s + timeout: 5s + retries: 5 + oai-amf: + container_name: "oai-amf" + image: oai-amf:develop + environment: + - TZ=Europe/paris + - INSTANCE=0 + - PID_DIRECTORY=/var/run + - MCC=208 + - MNC=99 + - REGION_ID=128 + - AMF_SET_ID=1 + - SERVED_GUAMI_MCC_0=208 + - SERVED_GUAMI_MNC_0=99 + - SERVED_GUAMI_REGION_ID_0=128 + - SERVED_GUAMI_AMF_SET_ID_0=1 + - SERVED_GUAMI_MCC_1=460 + - SERVED_GUAMI_MNC_1=11 + - SERVED_GUAMI_REGION_ID_1=10 + - SERVED_GUAMI_AMF_SET_ID_1=1 + - PLMN_SUPPORT_MCC=208 + - PLMN_SUPPORT_MNC=99 + - PLMN_SUPPORT_TAC=0x0001 + - SST_0=1 + - SD_0=0x1 + - AMF_INTERFACE_NAME_FOR_NGAP=eth0 + - AMF_INTERFACE_NAME_FOR_N11=eth0 + - SMF_INSTANCE_ID_0=1 + - SMF_FQDN_0=oai-smf + - SMF_IPV4_ADDR_0=192.168.70.133 + - SMF_HTTP_VERSION_0=v1 + - SELECTED_0=true + - SMF_INSTANCE_ID_1=2 + - SMF_FQDN_1=oai-smf + - SMF_IPV4_ADDR_1=0.0.0.0 + - SMF_HTTP_VERSION_1=v1 + - SELECTED_1=false + - MYSQL_SERVER=192.168.70.131 + - MYSQL_USER=root + - MYSQL_PASS=linux + - MYSQL_DB=oai_db + - OPERATOR_KEY=1006020f0a478bf6b699f15c062e42b3 + - NRF_IPV4_ADDRESS=192.168.70.130 + - NRF_PORT=80 + - EXTERNAL_NRF=no + - NF_REGISTRATION=yes + - SMF_SELECTION=yes + - USE_FQDN_DNS=yes + - EXTERNAL_AUSF=yes + - EXTERNAL_UDM=no + - EXTERNAL_NSSF=no + - USE_HTTP2=no + - NRF_API_VERSION=v1 + - NRF_FQDN=oai-nrf + - AUSF_IPV4_ADDRESS=192.168.70.138 + - AUSF_PORT=80 + - AUSF_API_VERSION=v1 + - AUSF_FQDN=oai-ausf + - UDM_IPV4_ADDRESS=192.168.70.137 + - UDM_PORT=80 + - UDM_API_VERSION=v2 + - UDM_FQDN=oai-udm + depends_on: + - mysql + - oai-nrf + - oai-ausf + volumes: + - ./healthscripts/amf-healthcheck.sh:/openair-amf/bin/amf-healthcheck.sh + healthcheck: + test: /bin/bash -c "/openair-amf/bin/amf-healthcheck.sh" + interval: 10s + timeout: 15s + retries: 5 + networks: + public_net: + ipv4_address: 192.168.70.132 + oai-smf: + container_name: "oai-smf" + image: oai-smf:develop + environment: + - TZ=Europe/Paris + - INSTANCE=0 + - PID_DIRECTORY=/var/run + - SMF_INTERFACE_NAME_FOR_N4=eth0 + - SMF_INTERFACE_NAME_FOR_SBI=eth0 + - SMF_INTERFACE_PORT_FOR_SBI=80 + - SMF_INTERFACE_HTTP2_PORT_FOR_SBI=9090 + - SMF_API_VERSION=v1 + - DEFAULT_DNS_IPV4_ADDRESS=8.8.8.8 + - DEFAULT_DNS_SEC_IPV4_ADDRESS=4.4.4.4 + - AMF_IPV4_ADDRESS=192.168.70.132 + - AMF_PORT=80 + - AMF_API_VERSION=v1 + - AMF_FQDN=oai-amf + - UDM_IPV4_ADDRESS=192.168.70.137 + - UDM_PORT=80 + - UDM_API_VERSION=v2 + - UDM_FQDN=oai-udm + - UPF_IPV4_ADDRESS=192.168.70.134 + - UPF_FQDN_0=oai-spgwu + - NRF_IPV4_ADDRESS=192.168.70.130 + - NRF_PORT=80 + - NRF_API_VERSION=v1 + - USE_LOCAL_SUBSCRIPTION_INFO=yes #Set to yes if SMF uses local subscription information instead of from an UDM + - USE_NETWORK_INSTANCE=no #Set yes if network instance is to be used for given UPF + - NRF_FQDN=oai-nrf + - REGISTER_NRF=yes + - DISCOVER_UPF=yes + - USE_FQDN_DNS=yes + - HTTP_VERSION=1 # Default: 1 + - UE_MTU=1500 + - DNN_NI0=oai + - TYPE0=IPv4 + - DNN_RANGE0=12.1.1.2 - 12.1.1.253 + - NSSAI_SST0=1 + - NSSAI_SD0=0x1 + - SESSION_AMBR_UL0=1000Mbps + - SESSION_AMBR_DL0=1000Mbps + - DEFAULT_CSCF_IPV4_ADDRESS=127.0.0.1 # only needed when ims is being used + - ENABLE_USAGE_REPORTING=no # Set yes if UE USAGE REPORTING is to be done at UPF + depends_on: + - oai-nrf + - oai-amf + volumes: + - ./healthscripts/smf-healthcheck.sh:/openair-smf/bin/smf-healthcheck.sh + healthcheck: + test: /bin/bash -c "/openair-smf/bin/smf-healthcheck.sh" + interval: 10s + timeout: 5s + retries: 5 + networks: + public_net: + ipv4_address: 192.168.70.133 + oai-spgwu: + container_name: "oai-spgwu" + image: oai-spgwu-tiny:develop + environment: + - TZ=Europe/Paris + - PID_DIRECTORY=/var/run + - SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP=eth0 + - SGW_INTERFACE_NAME_FOR_SX=eth0 + - PGW_INTERFACE_NAME_FOR_SGI=eth0 + - NETWORK_UE_NAT_OPTION=yes + - NETWORK_UE_IP=12.1.1.0/24 + - SPGWC0_IP_ADDRESS=192.168.70.133 + - BYPASS_UL_PFCP_RULES=no + - MCC=208 + - MNC=99 + - MNC03=099 + - TAC=1 + - GW_ID=1 + - THREAD_S1U_PRIO=80 + - S1U_THREADS=8 + - THREAD_SX_PRIO=81 + - SX_THREADS=1 + - THREAD_SGI_PRIO=80 + - SGI_THREADS=8 + - REALM=openairinterface.org + - ENABLE_5G_FEATURES=yes + - REGISTER_NRF=yes + - USE_FQDN_NRF=yes + - UPF_FQDN_5G=oai-spgwu + - NRF_IPV4_ADDRESS=192.168.70.130 + - NRF_PORT=80 + - NRF_API_VERSION=v1 + - NRF_FQDN=oai-nrf + - NSSAI_SST_0=1 + - NSSAI_SD_0=0x1 + - DNN_0=oai + depends_on: + - oai-nrf + - oai-smf + cap_add: + - NET_ADMIN + - SYS_ADMIN + cap_drop: + - ALL + privileged: true + volumes: + - ./healthscripts/spgwu-healthcheck.sh:/openair-spgwu-tiny/bin/spgwu-healthcheck.sh + healthcheck: + test: /bin/bash -c "/openair-spgwu-tiny/bin/spgwu-healthcheck.sh" + interval: 10s + timeout: 5s + retries: 5 + networks: + public_net: + ipv4_address: 192.168.70.134 + oai-ext-dn: + image: trf-gen-cn5g:latest + privileged: true + container_name: oai-ext-dn + entrypoint: /bin/bash -c \ + "ip route add 12.1.1.0/24 via 192.168.70.134 dev eth0; sleep infinity" + depends_on: + - oai-spgwu + networks: + public_net: + ipv4_address: 192.168.70.135 +networks: + # public_net: + # external: + # name: demo-oai-public-net + public_net: + driver: bridge + name: demo-oai-public-net + ipam: + config: + - subnet: 192.168.70.128/26 + driver_opts: + com.docker.network.bridge.name: "demo-oai" diff --git a/doc/tutorial_resources/oai_db.sql b/doc/tutorial_resources/oai_db.sql new file mode 100644 index 0000000000..fb8f4b20ed --- /dev/null +++ b/doc/tutorial_resources/oai_db.sql @@ -0,0 +1,328 @@ +-- phpMyAdmin SQL Dump +-- version 5.1.0 +-- https://www.phpmyadmin.net/ +-- +-- Host: 172.16.200.10:3306 +-- Generation Time: Mar 22, 2021 at 10:31 AM +-- Server version: 5.7.33 +-- PHP Version: 7.4.15 + +SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; +START TRANSACTION; +SET time_zone = "+00:00"; + + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8mb4 */; + +-- +-- Database: `oai_db` +-- + +-- -------------------------------------------------------- + +-- +-- Table structure for table `AccessAndMobilitySubscriptionData` +-- + +CREATE TABLE `AccessAndMobilitySubscriptionData` ( + `ueid` varchar(15) NOT NULL, + `servingPlmnid` varchar(15) NOT NULL, + `supportedFeatures` varchar(50) DEFAULT NULL, + `gpsis` json DEFAULT NULL, + `internalGroupIds` json DEFAULT NULL, + `sharedVnGroupDataIds` json DEFAULT NULL, + `subscribedUeAmbr` json DEFAULT NULL, + `nssai` json DEFAULT NULL, + `ratRestrictions` json DEFAULT NULL, + `forbiddenAreas` json DEFAULT NULL, + `serviceAreaRestriction` json DEFAULT NULL, + `coreNetworkTypeRestrictions` json DEFAULT NULL, + `rfspIndex` int(10) DEFAULT NULL, + `subsRegTimer` int(10) DEFAULT NULL, + `ueUsageType` int(10) DEFAULT NULL, + `mpsPriority` tinyint(1) DEFAULT NULL, + `mcsPriority` tinyint(1) DEFAULT NULL, + `activeTime` int(10) DEFAULT NULL, + `sorInfo` json DEFAULT NULL, + `sorInfoExpectInd` tinyint(1) DEFAULT NULL, + `sorafRetrieval` tinyint(1) DEFAULT NULL, + `sorUpdateIndicatorList` json DEFAULT NULL, + `upuInfo` json DEFAULT NULL, + `micoAllowed` tinyint(1) DEFAULT NULL, + `sharedAmDataIds` json DEFAULT NULL, + `odbPacketServices` json DEFAULT NULL, + `serviceGapTime` int(10) DEFAULT NULL, + `mdtUserConsent` json DEFAULT NULL, + `mdtConfiguration` json DEFAULT NULL, + `traceData` json DEFAULT NULL, + `cagData` json DEFAULT NULL, + `stnSr` varchar(50) DEFAULT NULL, + `cMsisdn` varchar(50) DEFAULT NULL, + `nbIoTUePriority` int(10) DEFAULT NULL, + `nssaiInclusionAllowed` tinyint(1) DEFAULT NULL, + `rgWirelineCharacteristics` varchar(50) DEFAULT NULL, + `ecRestrictionDataWb` json DEFAULT NULL, + `ecRestrictionDataNb` tinyint(1) DEFAULT NULL, + `expectedUeBehaviourList` json DEFAULT NULL, + `primaryRatRestrictions` json DEFAULT NULL, + `secondaryRatRestrictions` json DEFAULT NULL, + `edrxParametersList` json DEFAULT NULL, + `ptwParametersList` json DEFAULT NULL, + `iabOperationAllowed` tinyint(1) DEFAULT NULL, + `wirelineForbiddenAreas` json DEFAULT NULL, + `wirelineServiceAreaRestriction` json DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `Amf3GppAccessRegistration` +-- + +CREATE TABLE `Amf3GppAccessRegistration` ( + `ueid` varchar(15) NOT NULL, + `amfInstanceId` varchar(50) NOT NULL, + `supportedFeatures` varchar(50) DEFAULT NULL, + `purgeFlag` tinyint(1) DEFAULT NULL, + `pei` varchar(50) DEFAULT NULL, + `imsVoPs` json DEFAULT NULL, + `deregCallbackUri` varchar(50) NOT NULL, + `amfServiceNameDereg` json DEFAULT NULL, + `pcscfRestorationCallbackUri` varchar(50) DEFAULT NULL, + `amfServiceNamePcscfRest` json DEFAULT NULL, + `initialRegistrationInd` tinyint(1) DEFAULT NULL, + `guami` json NOT NULL, + `backupAmfInfo` json DEFAULT NULL, + `drFlag` tinyint(1) DEFAULT NULL, + `ratType` json NOT NULL, + `urrpIndicator` tinyint(1) DEFAULT NULL, + `amfEeSubscriptionId` varchar(50) DEFAULT NULL, + `epsInterworkingInfo` json DEFAULT NULL, + `ueSrvccCapability` tinyint(1) DEFAULT NULL, + `registrationTime` varchar(50) DEFAULT NULL, + `vgmlcAddress` json DEFAULT NULL, + `contextInfo` json DEFAULT NULL, + `noEeSubscriptionInd` tinyint(1) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `AuthenticationStatus` +-- + +CREATE TABLE `AuthenticationStatus` ( + `ueid` varchar(20) NOT NULL, + `nfInstanceId` varchar(50) NOT NULL, + `success` tinyint(1) NOT NULL, + `timeStamp` varchar(50) NOT NULL, + `authType` varchar(25) NOT NULL, + `servingNetworkName` varchar(50) NOT NULL, + `authRemovalInd` tinyint(1) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `AuthenticationSubscription` +-- + +CREATE TABLE `AuthenticationSubscription` ( + `ueid` varchar(20) NOT NULL, + `authenticationMethod` varchar(25) NOT NULL, + `encPermanentKey` varchar(50) DEFAULT NULL, + `protectionParameterId` varchar(50) DEFAULT NULL, + `sequenceNumber` json DEFAULT NULL, + `authenticationManagementField` varchar(50) DEFAULT NULL, + `algorithmId` varchar(50) DEFAULT NULL, + `encOpcKey` varchar(50) DEFAULT NULL, + `encTopcKey` varchar(50) DEFAULT NULL, + `vectorGenerationInHss` tinyint(1) DEFAULT NULL, + `n5gcAuthMethod` varchar(15) DEFAULT NULL, + `rgAuthenticationInd` tinyint(1) DEFAULT NULL, + `supi` varchar(20) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Dumping data for table `AuthenticationSubscription` +-- + +INSERT INTO `AuthenticationSubscription` (`ueid`, `authenticationMethod`, `encPermanentKey`, `protectionParameterId`, `sequenceNumber`, `authenticationManagementField`, `algorithmId`, `encOpcKey`, `encTopcKey`, `vectorGenerationInHss`, `n5gcAuthMethod`, `rgAuthenticationInd`, `supi`) VALUES + ('2089900007487', '5G_AKA', 'fec86ba6eb707ed08905757b1bb44b8f', 'fec86ba6eb707ed08905757b1bb44b8f', '{\"sqn\": \"000000000000\", \"sqnScheme\": \"NON_TIME_BASED\", \"lastIndexes\": {\"ausf\": 0}}', '8000', 'milenage', 'C42449363BBAD02B66D16BC975D77CC1', NULL, NULL, NULL, NULL, '2089900007487'); +INSERT INTO `AuthenticationSubscription` (`ueid`, `authenticationMethod`, `encPermanentKey`, `protectionParameterId`, `sequenceNumber`, `authenticationManagementField`, `algorithmId`, `encOpcKey`, `encTopcKey`, `vectorGenerationInHss`, `n5gcAuthMethod`, `rgAuthenticationInd`, `supi`) VALUES + ('208990000000001', '5G_AKA', 'fec86ba6eb707ed08905757b1bb44b8f', 'fec86ba6eb707ed08905757b1bb44b8f', '{\"sqn\": \"000000000000\", \"sqnScheme\": \"NON_TIME_BASED\", \"lastIndexes\": {\"ausf\": 0}}', '8000', 'milenage', 'C42449363BBAD02B66D16BC975D77CC1', NULL, NULL, NULL, NULL, '208990000000001'); +INSERT INTO `AuthenticationSubscription` (`ueid`, `authenticationMethod`, `encPermanentKey`, `protectionParameterId`, `sequenceNumber`, `authenticationManagementField`, `algorithmId`, `encOpcKey`, `encTopcKey`, `vectorGenerationInHss`, `n5gcAuthMethod`, `rgAuthenticationInd`, `supi`) VALUES + ('208990000000002', '5G_AKA', 'fec86ba6eb707ed08905757b1bb44b8f', 'fec86ba6eb707ed08905757b1bb44b8f', '{\"sqn\": \"000000000000\", \"sqnScheme\": \"NON_TIME_BASED\", \"lastIndexes\": {\"ausf\": 0}}', '8000', 'milenage', 'C42449363BBAD02B66D16BC975D77CC1', NULL, NULL, NULL, NULL, '208990000000002'); +INSERT INTO `AuthenticationSubscription` (`ueid`, `authenticationMethod`, `encPermanentKey`, `protectionParameterId`, `sequenceNumber`, `authenticationManagementField`, `algorithmId`, `encOpcKey`, `encTopcKey`, `vectorGenerationInHss`, `n5gcAuthMethod`, `rgAuthenticationInd`, `supi`) VALUES + ('208990000000003', '5G_AKA', 'fec86ba6eb707ed08905757b1bb44b8f', 'fec86ba6eb707ed08905757b1bb44b8f', '{\"sqn\": \"000000000000\", \"sqnScheme\": \"NON_TIME_BASED\", \"lastIndexes\": {\"ausf\": 0}}', '8000', 'milenage', 'C42449363BBAD02B66D16BC975D77CC1', NULL, NULL, NULL, NULL, '208990000000003'); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `SdmSubscriptions` +-- + +CREATE TABLE `SdmSubscriptions` ( + `ueid` varchar(15) NOT NULL, + `subsId` int(10) UNSIGNED NOT NULL, + `nfInstanceId` varchar(50) NOT NULL, + `implicitUnsubscribe` tinyint(1) DEFAULT NULL, + `expires` varchar(50) DEFAULT NULL, + `callbackReference` varchar(50) NOT NULL, + `amfServiceName` json DEFAULT NULL, + `monitoredResourceUris` json NOT NULL, + `singleNssai` json DEFAULT NULL, + `dnn` varchar(50) DEFAULT NULL, + `subscriptionId` varchar(50) DEFAULT NULL, + `plmnId` json DEFAULT NULL, + `immediateReport` tinyint(1) DEFAULT NULL, + `report` json DEFAULT NULL, + `supportedFeatures` varchar(50) DEFAULT NULL, + `contextInfo` json DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `SessionManagementSubscriptionData` +-- + +CREATE TABLE `SessionManagementSubscriptionData` ( + `ueid` varchar(15) NOT NULL, + `servingPlmnid` varchar(15) NOT NULL, + `singleNssai` json NOT NULL, + `dnnConfigurations` json DEFAULT NULL, + `internalGroupIds` json DEFAULT NULL, + `sharedVnGroupDataIds` json DEFAULT NULL, + `sharedDnnConfigurationsId` varchar(50) DEFAULT NULL, + `odbPacketServices` json DEFAULT NULL, + `traceData` json DEFAULT NULL, + `sharedTraceDataId` varchar(50) DEFAULT NULL, + `expectedUeBehavioursList` json DEFAULT NULL, + `suggestedPacketNumDlList` json DEFAULT NULL, + `3gppChargingCharacteristics` varchar(50) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Dumping data for table `SessionManagementSubscriptionData` +-- + +INSERT INTO `SessionManagementSubscriptionData` (`ueid`, `servingPlmnid`, `singleNssai`, `dnnConfigurations`) VALUES + ('2089900007487', '20899', '{\"sst\": 1, \"sd\": \"1\"}','{\"oai\":{\"pduSessionTypes\":{ \"defaultSessionType\": \"IPV4\"},\"sscModes\": {\"defaultSscMode\": \"SSC_MODE_1\"},\"5gQosProfile\": {\"5qi\": 6,\"arp\":{\"priorityLevel\": 1,\"preemptCap\": \"NOT_PREEMPT\",\"preemptVuln\":\"NOT_PREEMPTABLE\"},\"priorityLevel\":1},\"sessionAmbr\":{\"uplink\":\"1000Mbps\", \"downlink\":\"1000Mbps\"},\"staticIpAddress\":[{\"ipv4Addr\": \"12.1.1.2\"}]}}'); +INSERT INTO `SessionManagementSubscriptionData` (`ueid`, `servingPlmnid`, `singleNssai`, `dnnConfigurations`) VALUES + ('208990000000001', '20899', '{\"sst\": 1, \"sd\": \"1\"}','{\"oai\":{\"pduSessionTypes\":{ \"defaultSessionType\": \"IPV4\"},\"sscModes\": {\"defaultSscMode\": \"SSC_MODE_1\"},\"5gQosProfile\": {\"5qi\": 6,\"arp\":{\"priorityLevel\": 1,\"preemptCap\": \"NOT_PREEMPT\",\"preemptVuln\":\"NOT_PREEMPTABLE\"},\"priorityLevel\":1},\"sessionAmbr\":{\"uplink\":\"1000Mbps\", \"downlink\":\"1000Mbps\"},\"staticIpAddress\":[{\"ipv4Addr\": \"12.1.1.2\"}]}}'); +INSERT INTO `SessionManagementSubscriptionData` (`ueid`, `servingPlmnid`, `singleNssai`, `dnnConfigurations`) VALUES + ('208990000000002', '20899', '{\"sst\": 1, \"sd\": \"1\"}','{\"oai\":{\"pduSessionTypes\":{ \"defaultSessionType\": \"IPV4\"},\"sscModes\": {\"defaultSscMode\": \"SSC_MODE_1\"},\"5gQosProfile\": {\"5qi\": 6,\"arp\":{\"priorityLevel\": 1,\"preemptCap\": \"NOT_PREEMPT\",\"preemptVuln\":\"NOT_PREEMPTABLE\"},\"priorityLevel\":1},\"sessionAmbr\":{\"uplink\":\"1000Mbps\", \"downlink\":\"1000Mbps\"},\"staticIpAddress\":[{\"ipv4Addr\": \"12.1.1.3\"}]}}'); +INSERT INTO `SessionManagementSubscriptionData` (`ueid`, `servingPlmnid`, `singleNssai`, `dnnConfigurations`) VALUES + ('208990000000003', '20899', '{\"sst\": 1, \"sd\": \"1\"}','{\"oai\":{\"pduSessionTypes\":{ \"defaultSessionType\": \"IPV4\"},\"sscModes\": {\"defaultSscMode\": \"SSC_MODE_1\"},\"5gQosProfile\": {\"5qi\": 6,\"arp\":{\"priorityLevel\": 1,\"preemptCap\": \"NOT_PREEMPT\",\"preemptVuln\":\"NOT_PREEMPTABLE\"},\"priorityLevel\":1},\"sessionAmbr\":{\"uplink\":\"1000Mbps\", \"downlink\":\"1000Mbps\"},\"staticIpAddress\":[{\"ipv4Addr\": \"12.1.1.4\"}]}}'); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `SmfRegistrations` +-- + +CREATE TABLE `SmfRegistrations` ( + `ueid` varchar(15) NOT NULL, + `subpduSessionId` int(10) NOT NULL, + `smfInstanceId` varchar(50) NOT NULL, + `smfSetId` varchar(50) DEFAULT NULL, + `supportedFeatures` varchar(50) DEFAULT NULL, + `pduSessionId` int(10) NOT NULL, + `singleNssai` json NOT NULL, + `dnn` varchar(50) DEFAULT NULL, + `emergencyServices` tinyint(1) DEFAULT NULL, + `pcscfRestorationCallbackUri` varchar(50) DEFAULT NULL, + `plmnId` json NOT NULL, + `pgwFqdn` varchar(50) DEFAULT NULL, + `epdgInd` tinyint(1) DEFAULT NULL, + `deregCallbackUri` varchar(50) DEFAULT NULL, + `registrationReason` json DEFAULT NULL, + `registrationTime` varchar(50) DEFAULT NULL, + `contextInfo` json DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `SmfSelectionSubscriptionData` +-- + +CREATE TABLE `SmfSelectionSubscriptionData` ( + `ueid` varchar(15) NOT NULL, + `servingPlmnid` varchar(15) NOT NULL, + `supportedFeatures` varchar(50) DEFAULT NULL, + `subscribedSnssaiInfos` json DEFAULT NULL, + `sharedSnssaiInfosId` varchar(50) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Indexes for dumped tables +-- + +-- +-- Indexes for table `AccessAndMobilitySubscriptionData` +-- +ALTER TABLE `AccessAndMobilitySubscriptionData` + ADD PRIMARY KEY (`ueid`,`servingPlmnid`) USING BTREE; + +-- +-- Indexes for table `Amf3GppAccessRegistration` +-- +ALTER TABLE `Amf3GppAccessRegistration` + ADD PRIMARY KEY (`ueid`); + +-- +-- Indexes for table `AuthenticationStatus` +-- +ALTER TABLE `AuthenticationStatus` + ADD PRIMARY KEY (`ueid`); + +-- +-- Indexes for table `AuthenticationSubscription` +-- +ALTER TABLE `AuthenticationSubscription` + ADD PRIMARY KEY (`ueid`); + +-- +-- Indexes for table `SdmSubscriptions` +-- +ALTER TABLE `SdmSubscriptions` + ADD PRIMARY KEY (`subsId`,`ueid`) USING BTREE; + +-- +-- Indexes for table `SessionManagementSubscriptionData` +-- +ALTER TABLE `SessionManagementSubscriptionData` + ADD PRIMARY KEY (`ueid`,`servingPlmnid`) USING BTREE; + +-- +-- Indexes for table `SmfRegistrations` +-- +ALTER TABLE `SmfRegistrations` + ADD PRIMARY KEY (`ueid`,`subpduSessionId`) USING BTREE; + +-- +-- Indexes for table `SmfSelectionSubscriptionData` +-- +ALTER TABLE `SmfSelectionSubscriptionData` + ADD PRIMARY KEY (`ueid`,`servingPlmnid`) USING BTREE; + +-- +-- AUTO_INCREMENT for dumped tables +-- + +-- +-- AUTO_INCREMENT for table `SdmSubscriptions` +-- +ALTER TABLE `SdmSubscriptions` + MODIFY `subsId` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3; +COMMIT; + +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; + diff --git a/docker/Dockerfile.build.rhel8.2 b/docker/Dockerfile.build.rhel8.2 index 22486c5e68..2664096a9b 100644 --- a/docker/Dockerfile.build.rhel8.2 +++ b/docker/Dockerfile.build.rhel8.2 @@ -35,4 +35,4 @@ COPY . . RUN /bin/sh oaienv && \ cd cmake_targets && \ mkdir -p log && \ - ./build_oai --eNB --gNB --RU --UE --nrUE --ninja --build-lib all -w USRP --verbose-ci + ./build_oai --eNB --gNB --RU --UE --nrUE --ninja --build-lib all -w USRP --verbose-ci --noavx512 diff --git a/docker/Dockerfile.build.ubuntu18 b/docker/Dockerfile.build.ubuntu18 index 3ba1e41442..7809d56216 100644 --- a/docker/Dockerfile.build.ubuntu18 +++ b/docker/Dockerfile.build.ubuntu18 @@ -35,4 +35,4 @@ COPY . . RUN /bin/sh oaienv && \ cd cmake_targets && \ mkdir -p log && \ - ./build_oai --eNB --gNB --RU --UE --nrUE --ninja --build-lib all -w USRP --verbose-ci + ./build_oai --eNB --gNB --RU --UE --nrUE --ninja --build-lib all -w USRP --verbose-ci --noavx512 diff --git a/docker/Dockerfile.phySim.rhel8.2 b/docker/Dockerfile.phySim.rhel8.2 index 2627a9eafd..b4eb9a1eeb 100644 --- a/docker/Dockerfile.phySim.rhel8.2 +++ b/docker/Dockerfile.phySim.rhel8.2 @@ -38,7 +38,7 @@ RUN yum install -y libasan RUN /bin/sh oaienv && \ cd cmake_targets && \ mkdir -p log && \ - ./build_oai --phy_simulators --ninja --verbose-ci --sanitize-address + ./build_oai --phy_simulators --ninja --verbose-ci --sanitize-address --noavx512 #start from scratch for target executable FROM registry.access.redhat.com/ubi8/ubi:latest as oai-physim diff --git a/docker/scripts/generateTemplate.py b/docker/scripts/generateTemplate.py index 850bb535a5..ec8f32ec6e 100644 --- a/docker/scripts/generateTemplate.py +++ b/docker/scripts/generateTemplate.py @@ -60,6 +60,7 @@ def main(): "rcc.band40.tm1.25PRB": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}', "gnb.band78.tm1.fr1.106PRB.usrpb210.conf": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}', "gnb.band78.sa.fr1.106PRB.usrpn310.conf": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}', + "gnb.sa.band78.fr1.106PRB.usrpb210.conf": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}', "gnb.sa.band66.fr1.106PRB.usrpn300.conf": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}', "gNB_SA_CU.conf": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}', "gNB_SA_DU.conf": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}', diff --git a/docker/scripts/gnb_entrypoint.sh b/docker/scripts/gnb_entrypoint.sh index dd6256609c..ac0e0d4c88 100755 --- a/docker/scripts/gnb_entrypoint.sh +++ b/docker/scripts/gnb_entrypoint.sh @@ -10,6 +10,7 @@ THREAD_PARALLEL_CONFIG=${THREAD_PARALLEL_CONFIG:-PARALLEL_SINGLE_THREAD} if [[ -v USE_NSA_TDD_MONO ]]; then cp $PREFIX/etc/gnb.nsa.tdd.conf $PREFIX/etc/gnb.conf; fi if [[ -v USE_SA_TDD_MONO ]]; then cp $PREFIX/etc/gnb.sa.tdd.conf $PREFIX/etc/gnb.conf; fi +if [[ -v USE_SA_TDD_MONO_B2XX ]]; then cp $PREFIX/etc/gnb.sa.tdd.b2xx.conf $PREFIX/etc/gnb.conf; fi if [[ -v USE_SA_FDD_MONO ]]; then cp $PREFIX/etc/gnb.sa.fdd.conf $PREFIX/etc/gnb.conf; fi if [[ -v USE_SA_CU ]]; then cp $PREFIX/etc/gnb.sa.cu.conf $PREFIX/etc/gnb.conf; fi if [[ -v USE_SA_TDD_CU ]]; then cp $PREFIX/etc/gnb.sa.du.tdd.conf $PREFIX/etc/gnb.conf; fi diff --git a/docker/scripts/gnb_parameters.yaml b/docker/scripts/gnb_parameters.yaml index d5942f2c9b..420559ff3f 100644 --- a/docker/scripts/gnb_parameters.yaml +++ b/docker/scripts/gnb_parameters.yaml @@ -94,6 +94,36 @@ - key: parallel_config env: "@THREAD_PARALLEL_CONFIG@" + - filePrefix: gnb.sa.band78.fr1.106PRB.usrpb210.conf + outputfilename: "gnb.sa.tdd.b2xx.conf" + config: + - key: Active_gNBs + env: "@GNB_NAME@" + - key: gNB_name + env: "@GNB_NAME@" + - key: mcc + env: "@MCC@" + - key: mnc + env: "@MNC@" + - key: mnc_length + env: "@MNC_LENGTH@" + - key: tracking_area_code + env: "@TAC@" + - key: sst + env: "@NSSAI_SST@" + - key: ipv4 + env: "@AMF_IP_ADDRESS@" + - key: GNB_INTERFACE_NAME_FOR_NG_AMF + env: "@GNB_NGA_IF_NAME@" + - key: GNB_IPV4_ADDRESS_FOR_NG_AMF + env: "@GNB_NGA_IP_ADDRESS@" + - key: GNB_INTERFACE_NAME_FOR_NGU + env: "@GNB_NGU_IF_NAME@" + - key: GNB_IPV4_ADDRESS_FOR_NGU + env: "@GNB_NGU_IP_ADDRESS@" + - key: parallel_config + env: "@THREAD_PARALLEL_CONFIG@" + - filePrefix: gnb.sa.band66.fr1.106PRB.usrpn300.conf outputfilename: "gnb.sa.fdd.conf" config: diff --git a/executables/main-ocp.c b/executables/main-ocp.c index c9388e179d..5d949d5a28 100644 --- a/executables/main-ocp.c +++ b/executables/main-ocp.c @@ -173,7 +173,7 @@ void init_transport(PHY_VARS_eNB *eNB) { } for (int i=0; iulsch[1+i] = new_eNB_ulsch(MAX_TURBO_ITERATIONS,fp->N_RB_UL, 0)) != NULL, "Can't get eNB ulsch structures\n"); // this is the transmission mode for the signalling channels diff --git a/executables/nr-gnb.c b/executables/nr-gnb.c index 8ea7f16712..bc3dccf4fa 100644 --- a/executables/nr-gnb.c +++ b/executables/nr-gnb.c @@ -304,32 +304,36 @@ void rx_func(void *param) { ); #endif } -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, "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); - stroff += print_meas_log(&gNB->rx_pusch_stats, "PUSCH inner-receiver", NULL, NULL, output+stroff); - stroff += print_meas_log(&gNB->ulsch_decoding_stats, "PUSCH decoding", NULL, NULL, output+stroff); - stroff += print_meas_log(&gNB->schedule_response_stats, "Schedule Response",NULL,NULL, output+stroff); - if (ru->feprx) stroff += print_meas_log(&ru->ofdm_demod_stats,"feprx",NULL,NULL, output+stroff); +static size_t dump_L1_meas_stats(PHY_VARS_gNB *gNB, RU_t *ru, char *output, size_t outputlen) { + const char *begin = output; + const char *end = output + outputlen; + output += print_meas_log(&gNB->phy_proc_tx, "L1 Tx processing", NULL, NULL, output, end - output); + output += print_meas_log(&gNB->dlsch_encoding_stats, "DLSCH encoding", NULL, NULL, output, end - output); + output += print_meas_log(&gNB->phy_proc_rx, "L1 Rx processing", NULL, NULL, output, end - output); + output += print_meas_log(&gNB->ul_indication_stats, "UL Indication", NULL, NULL, output, end - output); + output += print_meas_log(&gNB->rx_pusch_stats, "PUSCH inner-receiver", NULL, NULL, output, end - output); + output += print_meas_log(&gNB->ulsch_decoding_stats, "PUSCH decoding", NULL, NULL, output, end - output); + output += print_meas_log(&gNB->schedule_response_stats, "Schedule Response", NULL, NULL, output, end - output); + if (ru->feprx) + output += print_meas_log(&ru->ofdm_demod_stats, "feprx", NULL, NULL, output, end - output); if (ru->feptx_ofdm) { - stroff += print_meas_log(&ru->precoding_stats,"feptx_prec",NULL,NULL, output+stroff); - stroff += print_meas_log(&ru->txdataF_copy_stats,"txdataF_copy",NULL,NULL, output+stroff); - stroff += print_meas_log(&ru->ofdm_mod_stats,"feptx_ofdm",NULL,NULL, output+stroff); - stroff += print_meas_log(&ru->ofdm_total_stats,"feptx_total",NULL,NULL, output+stroff); + output += print_meas_log(&ru->precoding_stats,"feptx_prec",NULL,NULL, output, end - output); + output += print_meas_log(&ru->txdataF_copy_stats,"txdataF_copy",NULL,NULL, output, end - output); + output += print_meas_log(&ru->ofdm_mod_stats,"feptx_ofdm",NULL,NULL, output, end - output); + output += print_meas_log(&ru->ofdm_total_stats,"feptx_total",NULL,NULL, output, end - output); } - if (ru->fh_north_asynch_in) stroff += print_meas_log(&ru->rx_fhaul,"rx_fhaul",NULL,NULL, output+stroff); + if (ru->fh_north_asynch_in) + output += print_meas_log(&ru->rx_fhaul,"rx_fhaul",NULL,NULL, output, end - output); - stroff += print_meas_log(&ru->tx_fhaul,"tx_fhaul",NULL,NULL, output+stroff); + output += print_meas_log(&ru->tx_fhaul,"tx_fhaul",NULL,NULL, output, end - output); if (ru->fh_north_out) { - stroff += print_meas_log(&ru->compression,"compression",NULL,NULL, output+stroff); - stroff += print_meas_log(&ru->transport,"transport",NULL,NULL, output+stroff); + output += print_meas_log(&ru->compression,"compression",NULL,NULL, output, end - output); + output += print_meas_log(&ru->transport,"transport",NULL,NULL, output, end - output); } + return output - begin; } void *nrL1_stats_thread(void *param) { @@ -355,7 +359,7 @@ void *nrL1_stats_thread(void *param) { dump_nr_I0_stats(fd,gNB); dump_pdsch_stats(fd,gNB); dump_pusch_stats(fd,gNB); - dump_L1_meas_stats(gNB, ru, output); + dump_L1_meas_stats(gNB, ru, output, L1STATSSTRLEN); fprintf(fd,"%s\n",output); fflush(fd); fseek(fd,0,SEEK_SET); @@ -380,7 +384,7 @@ void *tx_reorder_thread(void* param) { if (resL1Reserve) { resL1=resL1Reserve; if (((processingData_L1tx_t *)NotifiedFifoData(resL1))->slot != next_tx_slot) { - LOG_E(PHY,"order mistake"); + LOG_E(PHY,"order mistake\n"); resL1Reserve=NULL; resL1 = pullTpool(gNB->L1_tx_out, gNB->threadPool); } @@ -462,7 +466,7 @@ void init_gNB_Tpool(int inst) { pushNotifiedFIFO(gNB->L1_tx_free,msgL1Tx); // to unblock the process in the beginning } - if (!get_softmodem_params()->emulate_l1) + if ((!get_softmodem_params()->emulate_l1) && (!IS_SOFTMODEM_NOSTATS_BIT)) threadCreate(&proc->L1_stats_thread,nrL1_stats_thread,(void*)gNB,"L1_stats",-1,OAI_PRIORITY_RT_LOW); threadCreate(&proc->pthread_tx_reorder, tx_reorder_thread, (void *)gNB, "thread_tx_reorder", -1, OAI_PRIORITY_RT_MAX); @@ -600,7 +604,8 @@ void init_gNB(int single_thread_flag,int wait_for_sync) { gNB->UL_INFO.cqi_ind.cqi_raw_pdu_list = gNB->cqi_raw_pdu_list;*/ gNB->prach_energy_counter = 0; - gNB->prb_interpolation = get_softmodem_params()->prb_interpolation; + gNB->chest_time = get_softmodem_params()->chest_time; + gNB->chest_freq = get_softmodem_params()->chest_freq; } diff --git a/executables/nr-ru.c b/executables/nr-ru.c index 78d02e8849..b782209e4f 100644 --- a/executables/nr-ru.c +++ b/executables/nr-ru.c @@ -729,10 +729,17 @@ void tx_rf(RU_t *ru,int frame,int slot, uint64_t timestamp) { 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); + if (fp->slots_per_subframe == 1) { + if (txsymb <= 7) + siglen = (fp->ofdm_symbol_size + fp->nb_prefix_samples0) + (txsymb - 1) * (fp->ofdm_symbol_size + fp->nb_prefix_samples); + else + siglen = 2 * (fp->ofdm_symbol_size + fp->nb_prefix_samples0) + (txsymb - 2) * (fp->ofdm_symbol_size + fp->nb_prefix_samples); + } else { + 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 @@ -1091,11 +1098,12 @@ void fill_rf_config(RU_t *ru, char *rf_config_file) { cfg->tx_gain[i] = ru->att_tx; cfg->rx_gain[i] = ru->max_rxgain-ru->att_rx; cfg->configFilename = rf_config_file; - LOG_I(PHY, "Channel %d: setting tx_gain offset %f, rx_gain offset %f, tx_freq %lu Hz, rx_freq %lu Hz\n", + LOG_I(PHY, "Channel %d: setting tx_gain offset %.0f, rx_gain offset %.0f, tx_freq %.0f Hz, rx_freq %.0f Hz, tune_offset %.0f Hz\n", i, cfg->tx_gain[i], cfg->rx_gain[i], - (unsigned long)cfg->tx_freq[i], - (unsigned long)cfg->rx_freq[i]); + cfg->tx_freq[i], + cfg->rx_freq[i], + cfg->tune_offset); } } @@ -2103,6 +2111,8 @@ static void NRRCconfig_RU(void) { RC.ru[j]->openair0_cfg.time_source = internal; } + RC.ru[j]->openair0_cfg.tune_offset = get_softmodem_params()->tune_offset; + if (strcmp(*(RUParamList.paramarray[j][RU_LOCAL_RF_IDX].strptr), "yes") == 0) { if ( !(config_isparamset(RUParamList.paramarray[j],RU_LOCAL_IF_NAME_IDX)) ) { RC.ru[j]->if_south = LOCAL_RF; diff --git a/executables/nr-softmodem-common.h b/executables/nr-softmodem-common.h index 6e36dcf6c7..1e6c556acf 100644 --- a/executables/nr-softmodem-common.h +++ b/executables/nr-softmodem-common.h @@ -66,6 +66,7 @@ #define CONFIG_HLP_ITTIL "Generate ITTI analyzser logs (similar to wireshark logs but with more details)\n" #define CONFIG_HLP_DLMCS_PHYTEST "Set the downlink MCS for PHYTEST mode\n" #define CONFIG_HLP_DLNL_PHYTEST "Set the downlink nrOfLayers for PHYTEST mode\n" +#define CONFIG_HLP_ULNL_PHYTEST "Set the uplink nrOfLayers for PHYTEST mode\n" #define CONFIG_HLP_STMON "Enable processing timing measurement of lte softmodem on per subframe basis \n" #define CONFIG_HLP_MSLOTS "Skip the missed slots/subframes \n" #define CONFIG_HLP_ULMCS_PHYTEST "Set the uplink MCS for PHYTEST mode\n" diff --git a/executables/nr-softmodem.c b/executables/nr-softmodem.c index 1c75d9a155..54345dc6b0 100644 --- a/executables/nr-softmodem.c +++ b/executables/nr-softmodem.c @@ -839,10 +839,10 @@ int main( int argc, char **argv ) { } for (int inst = 0; inst < NB_RU; inst++) { + kill_NR_RU_proc(inst); nr_phy_free_RU(RC.ru[inst]); } - free_lte_top(); pthread_cond_destroy(&sync_cond); pthread_mutex_destroy(&sync_mutex); pthread_cond_destroy(&nfapi_sync_cond); diff --git a/executables/nr-softmodem.h b/executables/nr-softmodem.h index 834e89b403..98087ea2bb 100644 --- a/executables/nr-softmodem.h +++ b/executables/nr-softmodem.h @@ -22,6 +22,7 @@ {"E" , CONFIG_HLP_TQFS, PARAMFLAG_BOOL, i8ptr:&threequarter_fs, defintval:0, TYPE_INT8, 0}, \ {"m" , CONFIG_HLP_DLMCS_PHYTEST,0, uptr:&target_dl_mcs, defintval:0, TYPE_UINT, 0}, \ {"l" , CONFIG_HLP_DLNL_PHYTEST,0, uptr:&target_dl_Nl, defintval:0, TYPE_UINT, 0}, \ + {"L" , CONFIG_HLP_ULNL_PHYTEST,0, uptr:&target_ul_Nl, defintval:0, TYPE_UINT, 0}, \ {"t" , CONFIG_HLP_ULMCS_PHYTEST,0, uptr:&target_ul_mcs, defintval:0, TYPE_UINT, 0}, \ {"M" , CONFIG_HLP_DLBW_PHYTEST,0, uptr:&target_dl_bw, defintval:0, TYPE_UINT, 0}, \ {"T" , CONFIG_HLP_ULBW_PHYTEST,0, uptr:&target_ul_bw, defintval:0, TYPE_UINT, 0}, \ @@ -36,6 +37,7 @@ extern threads_t threads; extern uint32_t target_dl_mcs; extern uint32_t target_dl_Nl; +extern uint32_t target_ul_Nl; extern uint32_t target_ul_mcs; extern uint32_t target_dl_bw; extern uint32_t target_ul_bw; @@ -57,9 +59,6 @@ extern void set_function_spec_param(RU_t *ru); extern void reset_opp_meas(void); extern void print_opp_meas(void); - -extern void init_fep_thread(PHY_VARS_gNB *); - void init_gNB_afterRU(void); extern int stop_L1L2(module_id_t gnb_id); diff --git a/executables/nr-ue.c b/executables/nr-ue.c index 620e21ec14..85ec4e5e0c 100644 --- a/executables/nr-ue.c +++ b/executables/nr-ue.c @@ -106,23 +106,24 @@ queue_t nr_rach_ind_queue; static void *NRUE_phy_stub_standalone_pnf_task(void *arg); -static int dump_L1_UE_meas_stats(PHY_VARS_NR_UE *ue, char *output, int max_len) +static size_t dump_L1_UE_meas_stats(PHY_VARS_NR_UE *ue, char *output, size_t max_len) { - int stroff = 0; - stroff += print_meas_log(&ue->phy_proc_tx, "L1 TX processing", NULL, NULL, output); - stroff += print_meas_log(&ue->ulsch_encoding_stats, "ULSCH encoding", NULL, NULL, output + stroff); - stroff += print_meas_log(&ue->phy_proc_rx[0], "L1 RX processing t0", NULL, NULL, output + stroff); - stroff += print_meas_log(&ue->phy_proc_rx[1], "L1 RX processing t1", NULL, NULL, output + stroff); - stroff += print_meas_log(&ue->ue_ul_indication_stats, "UL Indication", NULL, NULL, output + stroff); - stroff += print_meas_log(&ue->rx_pdsch_stats, "PDSCH receiver", NULL, NULL, output + stroff); - stroff += print_meas_log(&ue->dlsch_decoding_stats[0], "PDSCH decoding t0", NULL, NULL, output + stroff); - stroff += print_meas_log(&ue->dlsch_decoding_stats[1], "PDSCH decoding t1", NULL, NULL, output + stroff); - stroff += print_meas_log(&ue->dlsch_deinterleaving_stats, " -> Deinterleive", NULL, NULL, output + stroff); - stroff += print_meas_log(&ue->dlsch_rate_unmatching_stats, " -> Rate Unmatch", NULL, NULL, output + stroff); - stroff += print_meas_log(&ue->dlsch_ldpc_decoding_stats, " -> LDPC Decode", NULL, NULL, output + stroff); - stroff += print_meas_log(&ue->dlsch_unscrambling_stats, "PDSCH unscrambling", NULL, NULL, output + stroff); - stroff += print_meas_log(&ue->dlsch_rx_pdcch_stats, "PDCCH handling", NULL, NULL, output + stroff); - return stroff; + const char *begin = output; + const char *end = output + max_len; + output += print_meas_log(&ue->phy_proc_tx, "L1 TX processing", NULL, NULL, output, end - output); + output += print_meas_log(&ue->ulsch_encoding_stats, "ULSCH encoding", NULL, NULL, output, end - output); + output += print_meas_log(&ue->phy_proc_rx[0], "L1 RX processing t0", NULL, NULL, output, end - output); + output += print_meas_log(&ue->phy_proc_rx[1], "L1 RX processing t1", NULL, NULL, output, end - output); + output += print_meas_log(&ue->ue_ul_indication_stats, "UL Indication", NULL, NULL, output, end - output); + output += print_meas_log(&ue->rx_pdsch_stats, "PDSCH receiver", NULL, NULL, output, end - output); + output += print_meas_log(&ue->dlsch_decoding_stats[0], "PDSCH decoding t0", NULL, NULL, output, end - output); + output += print_meas_log(&ue->dlsch_decoding_stats[1], "PDSCH decoding t1", NULL, NULL, output, end - output); + output += print_meas_log(&ue->dlsch_deinterleaving_stats, " -> Deinterleive", NULL, NULL, output, end - output); + output += print_meas_log(&ue->dlsch_rate_unmatching_stats, " -> Rate Unmatch", NULL, NULL, output, end - output); + output += print_meas_log(&ue->dlsch_ldpc_decoding_stats, " -> LDPC Decode", NULL, NULL, output, end - output); + output += print_meas_log(&ue->dlsch_unscrambling_stats, "PDSCH unscrambling", NULL, NULL, output, end - output); + output += print_meas_log(&ue->dlsch_rx_pdcch_stats, "PDCCH handling", NULL, NULL, output, end - output); + return output - begin; } static void *nrL1_UE_stats_thread(void *param) @@ -613,7 +614,7 @@ void processSlotTX(void *arg) { int tx_slot_type = nr_ue_slot_select(cfg, proc->frame_tx, proc->nr_slot_tx); uint8_t gNB_id = 0; - LOG_D(PHY,"%d.%d => slot type %d\n",proc->frame_tx,proc->nr_slot_tx,tx_slot_type); + LOG_D(PHY,"processSlotTX %d.%d => slot type %d\n",proc->frame_tx,proc->nr_slot_tx,tx_slot_type); if (tx_slot_type == NR_UPLINK_SLOT || tx_slot_type == NR_MIXED_SLOT){ // trigger L2 to run ue_scheduler thru IF module @@ -713,7 +714,8 @@ void processSlotRX(void *arg) { LOG_D(PHY, "Sending Uplink data \n"); nr_ue_pusch_common_procedures(UE, proc->nr_slot_tx, - &UE->frame_parms,1); + &UE->frame_parms, + UE->frame_parms.nb_antennas_tx); } if (UE->UE_mode[gNB_id] > NOT_SYNCHED && UE->UE_mode[gNB_id] < PUSCH) { @@ -1107,8 +1109,10 @@ void init_NR_UE_threads(int nb_inst) { LOG_I(PHY,"Intializing UE Threads for instance %d (%p,%p)...\n",inst,PHY_vars_UE_g[inst],PHY_vars_UE_g[inst][0]); threadCreate(&threads[inst], UE_thread, (void *)UE, "UEthread", -1, OAI_PRIORITY_RT_MAX); - pthread_t stat_pthread; - threadCreate(&stat_pthread, nrL1_UE_stats_thread, UE, "L1_UE_stats", -1, OAI_PRIORITY_RT_LOW); + if (!IS_SOFTMODEM_NOSTATS_BIT) { + pthread_t stat_pthread; + threadCreate(&stat_pthread, nrL1_UE_stats_thread, UE, "L1_UE_stats", -1, OAI_PRIORITY_RT_LOW); + } } } diff --git a/executables/nr-uesoftmodem.c b/executables/nr-uesoftmodem.c index b418fc9e90..cb848a76cd 100644 --- a/executables/nr-uesoftmodem.c +++ b/executables/nr-uesoftmodem.c @@ -261,13 +261,11 @@ void init_tpools(uint8_t nun_dlsch_threads) { } static void get_options(void) { - nrUE_params.ofdm_offset_divisor = 8; paramdef_t cmdline_params[] =CMDLINE_NRUEPARAMS_DESC ; int numparams = sizeof(cmdline_params)/sizeof(paramdef_t); + config_get(cmdline_params,numparams,NULL); config_process_cmdline( cmdline_params,numparams,NULL); - - if (vcdflag > 0) ouput_vcd = 1; } @@ -319,8 +317,8 @@ void set_options(int CC_id, PHY_VARS_NR_UE *UE){ UE->rf_map.card = card_offset; UE->rf_map.chain = CC_id + chain_offset; - LOG_I(PHY,"Set UE mode %d, UE_fo_compensation %d, UE_scan_carrier %d, UE_no_timing_correction %d \n, do_prb_interpolation %d\n", - UE->mode, UE->UE_fo_compensation, UE->UE_scan_carrier, UE->no_timing_correction, UE->prb_interpolation); + LOG_I(PHY,"Set UE mode %d, UE_fo_compensation %d, UE_scan_carrier %d, UE_no_timing_correction %d \n, chest-freq %d\n", + UE->mode, UE->UE_fo_compensation, UE->UE_scan_carrier, UE->no_timing_correction, UE->chest_freq); // Set FP variables @@ -332,6 +330,7 @@ void set_options(int CC_id, PHY_VARS_NR_UE *UE){ LOG_I(PHY, "Set UE nb_rx_antenna %d, nb_tx_antenna %d, threequarter_fs %d, ssb_start_subcarrier %d\n", fp->nb_antennas_rx, fp->nb_antennas_tx, fp->threequarter_fs, fp->ssb_start_subcarrier); fp->ofdm_offset_divisor = nrUE_params.ofdm_offset_divisor; + UE->max_ldpc_iterations = nrUE_params.max_ldpc_iterations; } @@ -356,6 +355,7 @@ void init_openair0(void) { openair0_cfg[card].num_rb_dl = frame_parms->N_RB_DL; openair0_cfg[card].clock_source = get_softmodem_params()->clock_source; openair0_cfg[card].time_source = get_softmodem_params()->timing_source; + openair0_cfg[card].tune_offset = get_softmodem_params()->tune_offset; openair0_cfg[card].tx_num_channels = min(4, frame_parms->nb_antennas_tx); openair0_cfg[card].rx_num_channels = min(4, frame_parms->nb_antennas_rx); diff --git a/executables/nr-uesoftmodem.h b/executables/nr-uesoftmodem.h index 927d619c42..a25d9cf5cf 100644 --- a/executables/nr-uesoftmodem.h +++ b/executables/nr-uesoftmodem.h @@ -7,10 +7,11 @@ -#define CONFIG_HLP_IF_FREQ "IF frequency for RF, if needed" -#define CONFIG_HLP_IF_FREQ_OFF "UL IF frequency offset for RF, if needed" +#define CONFIG_HLP_IF_FREQ "IF frequency for RF, if needed\n" +#define CONFIG_HLP_IF_FREQ_OFF "UL IF frequency offset for RF, if needed\n" #define CONFIG_HLP_DLSCH_PARA "number of threads for dlsch processing 0 for no parallelization\n" #define CONFIG_HLP_OFFSET_DIV "Divisor for computing OFDM symbol offset in Rx chain (num samples in CP/). Default value is 8. To set the sample offset to 0, set this value ~ 10e6\n" +#define CONFIG_HLP_MAX_LDPC_ITERATIONS "Maximum LDPC decoder iterations\n" /***************************************************************************************************************************************/ /* command line options definitions, CMDLINE_XXXX_DESC macros are used to initialize paramdef_t arrays which are then used as argument when calling config_get or config_getlist functions */ @@ -32,8 +33,9 @@ {"tx_subdev", CONFIG_HLP_USRP_ARGS, 0, strptr:(char **)&tx_subdev, defstrval:"", TYPE_STRING, 0}, \ {"rx_subdev", CONFIG_HLP_USRP_ARGS, 0, strptr:(char **)&rx_subdev, defstrval:"", TYPE_STRING, 0}, \ {"single-thread-disable", CONFIG_HLP_NOSNGLT, PARAMFLAG_BOOL, iptr:&single_thread_flag, defintval:1, TYPE_INT, 0}, \ - {"dlsch-parallel", CONFIG_HLP_DLSCH_PARA, 0, iptr:(int32_t *)&nrUE_params.nr_dlsch_parallel, defintval:0, TYPE_UINT8, 0}, \ - {"offset-divisor", CONFIG_HLP_OFFSET_DIV, 0, uptr:(uint32_t *)&nrUE_params.ofdm_offset_divisor, defuintval:UINT_MAX, TYPE_UINT32, 0}, \ + {"dlsch-parallel", CONFIG_HLP_DLSCH_PARA, 0, u8ptr:&nrUE_params.nr_dlsch_parallel, defintval:0, TYPE_UINT8, 0}, \ + {"offset-divisor", CONFIG_HLP_OFFSET_DIV, 0, uptr:&nrUE_params.ofdm_offset_divisor, defuintval:8, TYPE_UINT32, 0}, \ + {"max-ldpc-iterations", CONFIG_HLP_MAX_LDPC_ITERATIONS, 0, u8ptr:&nrUE_params.max_ldpc_iterations, defuintval:5, TYPE_UINT8, 0}, \ {"nr-dlsch-demod-shift", CONFIG_HLP_DLSHIFT, 0, iptr:(int32_t *)&nr_dlsch_demod_shift, defintval:0, TYPE_INT, 0}, \ {"V" , CONFIG_HLP_VCD, PARAMFLAG_BOOL, iptr:&vcdflag, defintval:0, TYPE_INT, 0}, \ {"uecap_file", CONFIG_HLP_UECAP_FILE, 0, strptr:(char **)&uecap_file, defstrval:"./uecap.xml", TYPE_STRING, 0}, \ @@ -69,7 +71,8 @@ {"T" , CONFIG_HLP_TDD, PARAMFLAG_BOOL, iptr:&tddflag, defintval:0, TYPE_INT, 0}, \ {"if_freq" , CONFIG_HLP_IF_FREQ, 0, u64ptr:&(UE->if_freq), defuintval:0, TYPE_UINT64,0}, \ {"if_freq_off" , CONFIG_HLP_IF_FREQ_OFF, 0, iptr:&(UE->if_freq_off), defuintval:0, TYPE_INT, 0}, \ - {"do-prb-interpolation", CONFIG_HLP_PRBINTER, PARAMFLAG_BOOL, iptr:&(UE->prb_interpolation), defintval:0, TYPE_INT, 0}, \ + {"chest-freq", CONFIG_HLP_CHESTFREQ, 0, iptr:&(UE->chest_freq), defintval:0, TYPE_INT, 0}, \ + {"chest-time", CONFIG_HLP_CHESTTIME, 0, iptr:&(UE->chest_time), defintval:0, TYPE_INT, 0}, \ {"ue-timing-correction-disable", CONFIG_HLP_DISABLETIMECORR, PARAMFLAG_BOOL, iptr:&(UE->no_timing_correction), defintval:0, TYPE_INT, 0}, \ } @@ -78,6 +81,7 @@ typedef struct { uint64_t optmask; //mask to store boolean config options uint32_t ofdm_offset_divisor; // Divisor for sample offset computation for each OFDM symbol uint8_t nr_dlsch_parallel; // number of threads for dlsch decoding, 0 means no parallelization + uint8_t max_ldpc_iterations; // number of maximum LDPC iterations tpool_t Tpool; // thread pool } nrUE_params_t; extern uint64_t get_nrUE_optmask(void); diff --git a/executables/softmodem-common.c b/executables/softmodem-common.c index c78fc70243..bf30cab847 100644 --- a/executables/softmodem-common.c +++ b/executables/softmodem-common.c @@ -85,6 +85,7 @@ char *get_softmodem_function(uint64_t *sofmodemfunc_mask_ptr) { } void get_common_options(uint32_t execmask) { + int32_t stats_disabled = 0; uint32_t online_log_messages=0; uint32_t glog_level=0 ; uint32_t start_telnetsrv = 0, start_telnetclt = 0; @@ -149,6 +150,8 @@ void get_common_options(uint32_t execmask) { if(worker_config != NULL) set_worker_conf(worker_config); nfapi_setmode(nfapi_mode); + if (stats_disabled) + set_softmodem_optmask(SOFTMODEM_NOSTATS_BIT); } void softmodem_printresources(int sig, telnet_printfunc_t pf) { struct rusage usage; diff --git a/executables/softmodem-common.h b/executables/softmodem-common.h index eb0c1a54f7..a2ba680234 100644 --- a/executables/softmodem-common.h +++ b/executables/softmodem-common.h @@ -60,6 +60,7 @@ extern "C" #define CONFIG_HLP_DMRSSYNC "tells RU to insert DMRS in subframe 1 slot 0" #define CONFIG_HLP_CLK "tells hardware to use a clock reference (0:internal, 1:external, 2:gpsdo)\n" #define CONFIG_HLP_TME "tells hardware to use a time reference (0:internal, 1:external, 2:gpsdo)\n" +#define CONFIG_HLP_TUNE_OFFSET "LO tuning offset to use in Hz\n" #define CONFIG_HLP_USIM "use XOR autentication algo in case of test usim mode\n" #define CONFIG_HLP_NOSNGLT "Disables single-thread mode in lte-softmodem\n" #define CONFIG_HLP_DLF "Set the downlink frequency for all component carriers\n" @@ -71,7 +72,8 @@ extern "C" #define CONFIG_HLP_DLMCS "Set the maximum downlink MCS\n" #define CONFIG_HLP_STMON "Enable processing timing measurement of lte softmodem on per subframe basis \n" #define CONFIG_HLP_256QAM "Use the 256 QAM mcs table for PDSCH\n" -#define CONFIG_HLP_PRBINTER "Do PRB based averaging of channel estimates. Frequency domain linear interpolation by default\n" +#define CONFIG_HLP_CHESTFREQ "Set channel estimation type in frequency domain. 0-Linear interpolation (default). 1-PRB based averaging of channel estimates in frequency. \n" +#define CONFIG_HLP_CHESTTIME "Set channel estimation type in time domain. 0-Symbols take estimates of the last preceding DMRS symbol (default). 1-Symbol based averaging of channel estimates in time. \n" #define CONFIG_HLP_NONSTOP "Go back to frame sync mode after 100 consecutive PBCH failures\n" //#define CONFIG_HLP_NUMUES "Set the number of UEs for the emulation" @@ -99,6 +101,7 @@ extern "C" #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" +#define CONFIG_HLP_STATS_DISABLE "disable globally the stats generation and persistence" /*-----------------------------------------------------------------------------------------------------------------------------------------------------*/ /* command line parameters common to eNodeB and UE */ @@ -118,9 +121,11 @@ extern "C" #define EMULATE_RF softmodem_params.emulate_rf #define CLOCK_SOURCE softmodem_params.clock_source #define TIMING_SOURCE softmodem_params.timing_source +#define TUNE_OFFSET softmodem_params.tune_offset #define SEND_DMRSSYNC softmodem_params.send_dmrs_sync #define USIM_TEST softmodem_params.usim_test -#define PRB_INTERPOLATION softmodem_params.prb_interpolation +#define CHEST_FREQ softmodem_params.chest_freq +#define CHEST_TIME softmodem_params.chest_time #define NFAPI softmodem_params.nfapi #define NSA softmodem_params.nsa #define NODE_NUMBER softmodem_params.node_number @@ -141,6 +146,7 @@ extern int usrp_tx_thread; {"usim-test", CONFIG_HLP_USIM, PARAMFLAG_BOOL, u8ptr:&USIM_TEST, defintval:0, TYPE_UINT8, 0}, \ {"clock-source", CONFIG_HLP_CLK, 0, uptr:&CLOCK_SOURCE, defintval:0, TYPE_UINT, 0}, \ {"time-source", CONFIG_HLP_TME, 0, uptr:&TIMING_SOURCE, defintval:0, TYPE_UINT, 0}, \ + {"tune-offset", CONFIG_HLP_TUNE_OFFSET, 0, dblptr:&TUNE_OFFSET, defintval:0, TYPE_DOUBLE, 0}, \ {"wait-for-sync", NULL, PARAMFLAG_BOOL, iptr:&WAIT_FOR_SYNC, defintval:0, TYPE_INT, 0}, \ {"single-thread-enable", CONFIG_HLP_NOSNGLT, PARAMFLAG_BOOL, iptr:&SINGLE_THREAD_FLAG, defintval:0, TYPE_INT, 0}, \ {"C" , CONFIG_HLP_DLF, 0, u64ptr:&(downlink_frequency[0][0]), defuintval:0, TYPE_UINT64, 0}, \ @@ -157,14 +163,16 @@ extern int usrp_tx_thread; {"rfsim", CONFIG_HLP_RFSIM, PARAMFLAG_BOOL, uptr:&rfsim, 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}, \ + {"chest-freq", CONFIG_HLP_CHESTFREQ, 0, iptr:&CHEST_FREQ, defintval:0, TYPE_INT, 0}, \ + {"chest-time", CONFIG_HLP_CHESTTIME, 0, iptr:&CHEST_TIME, defintval:0, TYPE_INT, 0}, \ {"nsa", CONFIG_HLP_NSA, PARAMFLAG_BOOL, iptr:&NSA, defintval:0, TYPE_INT, 0}, \ {"node-number", NULL, 0, u16ptr:&NODE_NUMBER, defuintval:0, TYPE_UINT16, 0}, \ {"usrp-tx-thread-config", CONFIG_HLP_USRP_THREAD, 0, iptr:&usrp_tx_thread, defstrval:0, TYPE_INT, 0}, \ - {"do-prb-interpolation", CONFIG_HLP_PRBINTER, PARAMFLAG_BOOL, iptr:&PRB_INTERPOLATION, defintval: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}, \ {"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}, \ + {"disable-stats", CONFIG_HLP_STATS_DISABLE, PARAMFLAG_BOOL, iptr:&stats_disabled, defintval:0, TYPE_INT, 0}, \ } #define CONFIG_HLP_NSA "Enable NSA mode \n" @@ -203,6 +211,7 @@ extern int usrp_tx_thread; #define SOFTMODEM_NONBIOT_BIT (1<<2) #define SOFTMODEM_RFSIM_BIT (1<<10) #define SOFTMODEM_SIML1_BIT (1<<12) +#define SOFTMODEM_DLSIM_BIT (1<<13) #define SOFTMODEM_DOSCOPE_BIT (1<<15) #define SOFTMODEM_RECPLAY_BIT (1<<16) #define SOFTMODEM_TELNETCLT_BIT (1<<17) @@ -210,6 +219,7 @@ extern int usrp_tx_thread; #define SOFTMODEM_GNB_BIT (1<<21) #define SOFTMODEM_4GUE_BIT (1<<22) #define SOFTMODEM_5GUE_BIT (1<<23) +#define SOFTMODEM_NOSTATS_BIT (1<<24) #define SOFTMODEM_FUNC_BITS (SOFTMODEM_ENB_BIT | SOFTMODEM_GNB_BIT | SOFTMODEM_5GUE_BIT | SOFTMODEM_4GUE_BIT) #define MAPPING_SOFTMODEM_FUNCTIONS {{"enb",SOFTMODEM_ENB_BIT},{"gnb",SOFTMODEM_GNB_BIT},{"4Gue",SOFTMODEM_4GUE_BIT},{"5Gue",SOFTMODEM_5GUE_BIT}} @@ -219,6 +229,7 @@ extern int usrp_tx_thread; #define IS_SOFTMODEM_NONBIOT ( get_softmodem_optmask() & SOFTMODEM_NONBIOT_BIT) #define IS_SOFTMODEM_RFSIM ( get_softmodem_optmask() & SOFTMODEM_RFSIM_BIT) #define IS_SOFTMODEM_SIML1 ( get_softmodem_optmask() & SOFTMODEM_SIML1_BIT) +#define IS_SOFTMODEM_DLSIM ( get_softmodem_optmask() & SOFTMODEM_DLSIM_BIT) #define IS_SOFTMODEM_DOSCOPE ( get_softmodem_optmask() & SOFTMODEM_DOSCOPE_BIT) #define IS_SOFTMODEM_IQPLAYER ( get_softmodem_optmask() & SOFTMODEM_RECPLAY_BIT) #define IS_SOFTMODEM_TELNETCLT_BIT ( get_softmodem_optmask() & SOFTMODEM_TELNETCLT_BIT) @@ -226,6 +237,7 @@ extern int usrp_tx_thread; #define IS_SOFTMODEM_GNB_BIT ( get_softmodem_optmask() & SOFTMODEM_GNB_BIT) #define IS_SOFTMODEM_4GUE_BIT ( get_softmodem_optmask() & SOFTMODEM_4GUE_BIT) #define IS_SOFTMODEM_5GUE_BIT ( get_softmodem_optmask() & SOFTMODEM_5GUE_BIT) +#define IS_SOFTMODEM_NOSTATS_BIT ( get_softmodem_optmask() & SOFTMODEM_NOSTATS_BIT) typedef struct { uint64_t optmask; @@ -245,9 +257,12 @@ typedef struct { int band; uint32_t clock_source; uint32_t timing_source; + double tune_offset; int hw_timing_advance; uint32_t send_dmrs_sync; - int prb_interpolation; + int use_256qam_table; + int chest_time; + int chest_freq; uint8_t nfapi; int nsa; uint16_t node_number; diff --git a/ldpctest_BG_1_Zc_384_rate_1-3_block_length_8448_maxit_5.txt b/ldpctest_BG_1_Zc_384_rate_1-3_block_length_8448_maxit_5.txt new file mode 100644 index 0000000000..2983268dac --- /dev/null +++ b/ldpctest_BG_1_Zc_384_rate_1-3_block_length_8448_maxit_5.txt @@ -0,0 +1,64 @@ +SNR BLER BER UNCODED_BER ENCODER_MEAN ENCODER_STD ENCODER_MAX DECODER_TIME_MEAN DECODER_TIME_STD DECODER_TIME_MAX DECODER_ITER_MEAN DECODER_ITER_STD DECODER_ITER_MAX +-2.000000 1.000000 0.346185 0.258473 44.551218 31.688925 357.883903 217.655668 12.810778 326.852166 5.000000 0.000000 5 +-1.900000 1.000000 0.345395 0.256275 40.787109 4.190954 65.926488 215.687102 4.300128 230.585721 5.000000 0.000000 5 +-1.800000 1.000000 0.343100 0.253634 40.748628 3.912915 56.669470 215.314020 4.139156 227.806468 5.000000 0.000000 5 +-1.700000 1.000000 0.341806 0.250634 40.550845 3.347808 56.032851 216.839001 5.959734 244.483352 5.000000 0.000000 5 +-1.600000 1.000000 0.339245 0.248129 40.457158 3.735092 56.853508 215.747244 4.995522 242.867659 5.000000 0.000000 5 +-1.500000 1.000000 0.337230 0.245763 41.178595 4.297429 56.265874 215.785600 4.151781 227.795995 5.000000 0.000000 5 +-1.400000 1.000000 0.335131 0.243311 39.915221 2.739586 55.454917 216.866764 6.547848 251.528327 5.000000 0.000000 5 +-1.300000 1.000000 0.333085 0.240664 40.119215 3.044973 55.978253 216.208443 4.459816 228.810686 5.000000 0.000000 5 +-1.200000 1.000000 0.330664 0.238769 40.507713 2.998241 55.701876 215.868796 3.778455 226.049304 5.000000 0.000000 5 +-1.100000 1.000000 0.329130 0.235812 41.038895 4.522472 56.760814 215.654663 4.746822 236.021980 5.000000 0.000000 5 +-1.000000 1.000000 0.325980 0.233534 41.067622 4.626711 57.444142 215.260535 3.481966 225.512853 5.000000 0.000000 5 +-0.900000 1.000000 0.323823 0.230863 40.683316 3.689159 56.208182 215.560917 5.180017 243.603452 5.000000 0.000000 5 +-0.800000 1.000000 0.321004 0.228222 41.643513 4.717568 58.502452 215.630891 4.283475 238.574145 5.000000 0.000000 5 +-0.700000 1.000000 0.317983 0.225520 41.214547 3.941824 56.054211 215.910346 4.375081 227.444626 5.000000 0.000000 5 +-0.600000 1.000000 0.316243 0.222903 40.834442 4.370416 56.765508 215.153296 3.617927 226.280086 5.000000 0.000000 5 +-0.500000 1.000000 0.312886 0.220473 40.178174 4.185502 64.657291 219.647151 4.454154 236.473446 5.000000 0.000000 5 +-0.400000 1.000000 0.309757 0.217536 40.240385 3.172484 55.751563 217.761119 3.900779 228.757195 5.000000 0.000000 5 +-0.300000 1.000000 0.305464 0.215229 40.852271 3.761739 56.158869 217.830497 4.087453 230.237764 5.000000 0.000000 5 +-0.200000 1.000000 0.302919 0.212364 40.531166 3.688281 56.426841 217.657657 5.498697 253.516146 5.000000 0.000000 5 +-0.100000 1.000000 0.298246 0.209310 41.058364 4.140510 59.959571 217.519279 4.087389 228.768313 5.000000 0.000000 5 +0.000000 1.000000 0.294110 0.207107 40.436486 3.604369 55.788895 217.853044 4.012624 236.118036 5.000000 0.000000 5 +0.100000 1.000000 0.288139 0.204033 40.603738 4.045866 57.560760 217.046816 4.583841 244.429411 5.000000 0.000000 5 +0.200000 1.000000 0.285604 0.201954 40.494607 3.886199 59.431970 217.322824 4.080988 233.317513 5.000000 0.000000 5 +0.300000 1.000000 0.278478 0.198929 40.311327 3.452837 56.124657 217.319394 4.434358 232.534720 5.000000 0.000000 5 +0.400000 1.000000 0.270992 0.196299 40.649243 3.415612 56.204178 218.079445 4.990947 245.055337 5.000000 0.000000 5 +0.500000 1.000000 0.263944 0.193661 40.464299 3.622703 56.602842 218.555364 3.936432 229.481159 5.000000 0.000000 5 +0.600000 1.000000 0.256340 0.191194 40.200314 2.474984 53.432412 216.547260 3.695211 227.198078 5.000000 0.000000 5 +0.700000 1.000000 0.251578 0.188606 40.111945 3.029821 54.900896 216.581752 4.247622 237.358365 5.000000 0.000000 5 +0.800000 1.000000 0.234558 0.184742 39.533282 1.182169 42.753097 215.462335 2.960246 226.716604 5.000000 0.000000 5 +0.900000 1.000000 0.225915 0.182691 39.851294 1.108193 42.180342 216.404194 4.450720 228.482353 5.000000 0.000000 5 +1.000000 1.000000 0.216180 0.179994 40.721936 3.302539 56.032206 217.082196 4.599188 227.979232 5.000000 0.000000 5 +1.100000 1.000000 0.203481 0.177332 41.006217 3.798207 56.014901 216.204345 4.292145 227.297386 5.000000 0.000000 5 +1.200000 1.000000 0.188297 0.174121 40.739289 3.269948 56.653507 216.585873 6.250858 251.207034 5.000000 0.000000 5 +1.300000 1.000000 0.172624 0.171622 41.215540 4.783342 55.692883 215.885639 3.629370 226.473280 5.000000 0.000000 5 +1.400000 1.000000 0.156483 0.169110 40.289903 3.749338 56.290861 215.663761 4.176366 225.824735 5.000000 0.000000 5 +1.500000 1.000000 0.136293 0.165692 42.208932 6.070189 69.182665 216.390504 4.816283 235.417446 5.000000 0.000000 5 +1.600000 1.000000 0.125127 0.163325 40.890581 3.941185 56.491504 215.752348 4.426511 226.425984 5.000000 0.000000 5 +1.700000 1.000000 0.104593 0.159971 41.263557 4.128935 57.062514 217.284932 5.311288 249.647163 5.000000 0.000000 5 +1.800000 1.000000 0.091397 0.157460 40.273078 3.062810 55.546913 217.252505 6.331426 251.175692 5.000000 0.000000 5 +1.900000 1.000000 0.078256 0.154628 40.407489 3.419342 56.316166 216.967648 4.712664 245.093313 5.000000 0.000000 5 +2.000000 1.000000 0.065221 0.152571 40.660365 4.317854 57.537407 216.198346 4.991856 245.173269 5.000000 0.000000 5 +2.100000 1.000000 0.053694 0.148885 40.355654 4.062614 60.051963 215.797667 4.447252 236.221454 5.000000 0.000000 5 +2.200000 1.000000 0.042182 0.146229 40.613562 4.124655 56.201536 216.117304 4.060825 227.115987 5.000000 0.000000 5 +2.300000 1.000000 0.034334 0.143612 40.465884 3.541452 55.067611 215.575953 4.891719 244.546802 5.000000 0.000000 5 +2.400000 1.000000 0.026641 0.140869 41.074690 4.697458 61.619188 216.069185 4.700827 233.830937 5.000000 0.000000 5 +2.500000 1.000000 0.019976 0.138112 40.766971 4.274128 58.871741 215.761570 5.633731 249.753931 5.000000 0.000000 5 +2.600000 1.000000 0.012826 0.135122 40.559343 2.952804 54.017706 215.835161 4.039993 226.822103 5.000000 0.000000 5 +2.700000 1.000000 0.010550 0.132915 40.985193 3.330639 55.013950 215.975836 4.240744 227.040703 5.000000 0.000000 5 +2.800000 1.000000 0.007327 0.130133 39.778804 3.002485 56.610555 216.462786 7.082268 265.051418 5.000000 0.000000 5 +2.900000 1.000000 0.004038 0.126763 40.327795 3.934211 55.515352 215.982666 4.626198 230.696124 5.000000 0.000000 5 +3.000000 1.000000 0.003087 0.124336 40.337807 3.537021 55.101627 215.468662 4.177203 230.789145 5.000000 0.000000 5 +3.100000 1.000000 0.001576 0.121689 39.812195 3.116738 55.422687 215.797778 4.091192 225.897780 5.000000 0.000000 5 +3.200000 0.980000 0.001000 0.118928 39.853764 2.871322 56.405555 215.562722 4.187466 232.598421 5.000000 0.000000 5 +3.300000 0.960000 0.000623 0.116065 40.440328 3.580650 56.738889 216.165848 4.735158 240.329999 5.000000 0.000000 5 +3.400000 0.850000 0.000303 0.113505 40.974107 4.291544 56.280236 215.889562 4.448049 237.556780 5.000000 0.000000 5 +3.500000 0.690000 0.000152 0.111010 41.508631 4.251791 56.198873 216.740295 4.889693 242.922934 5.000000 0.000000 5 +3.600000 0.530000 0.000102 0.108493 40.065231 3.643794 57.120823 216.887338 5.242621 250.003843 5.000000 0.000000 5 +3.700000 0.320000 0.000043 0.105612 40.462159 4.162383 56.782173 216.465615 3.846314 227.022697 5.000000 0.000000 5 +3.800000 0.210000 0.000032 0.103084 42.192455 6.207380 64.648964 217.030913 4.482820 228.095918 5.000000 0.000000 5 +3.900000 0.110000 0.000013 0.100391 40.640286 3.715782 55.922914 217.726055 4.553212 236.362804 5.000000 0.000000 5 +4.000000 0.050000 0.000006 0.097518 40.437760 2.838308 54.764308 218.230040 4.309275 237.932625 5.000000 0.000000 5 +4.100000 0.020000 0.000002 0.095436 41.347934 4.608500 64.182062 217.408836 4.385757 228.219627 5.000000 0.000000 5 +4.200000 0.000000 0.000000 0.092396 40.782371 3.621708 55.984245 217.579878 4.102149 228.145363 5.000000 0.000000 5 diff --git a/nfapi/oai_integration/nfapi_vnf.c b/nfapi/oai_integration/nfapi_vnf.c index d13dc5d1c5..8cc1bda782 100644 --- a/nfapi/oai_integration/nfapi_vnf.c +++ b/nfapi/oai_integration/nfapi_vnf.c @@ -217,7 +217,7 @@ void oai_create_enb(void) { } // This will cause phy_config_request to be installed. That will result in RRC configuring the PHY - // that will result in eNB->configured being set to TRUE. + // that will result in eNB->configured being set to true. // See we need to wait for that to happen otherwise the NFAPI message exchanges won't contain the right parameter values if (RC.eNB[0][0]->if_inst==0 || RC.eNB[0][0]->if_inst->PHY_config_req==0 || RC.eNB[0][0]->if_inst->schedule_response==0) { NFAPI_TRACE(NFAPI_TRACE_INFO, "RC.eNB[0][0]->if_inst->PHY_config_req is not installed - install it\n"); @@ -267,7 +267,7 @@ void oai_create_gnb(void) { // This will cause phy_config_request to be installed. That will result in RRC configuring the PHY - // that will result in gNB->configured being set to TRUE. + // that will result in gNB->configured being set to true. // See we need to wait for that to happen otherwise the NFAPI message exchanges won't contain the right parameter values if (RC.gNB[0]->if_inst==0 || RC.gNB[0]->if_inst->NR_PHY_config_req==0 || RC.gNB[0]->if_inst->NR_Schedule_response==0) { NFAPI_TRACE(NFAPI_TRACE_INFO, "RC.gNB[0][0]->if_inst->NR_PHY_config_req is not installed - install it\n"); diff --git a/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_constants.h b/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_constants.h index 7fb42e566a..6d40752a9a 100644 --- a/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_constants.h +++ b/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_constants.h @@ -10,7 +10,8 @@ #define FAPI_NR_MAX_RA_OCCASION_PER_CSIRS 64 // Constants Defined in 38.213 #define FAPI_NR_MAX_CORESET_PER_BWP 3 -#define FAPI_NR_MAX_SS 10 +#define FAPI_NR_MAX_SS_PER_BWP 10 +#define FAPI_NR_MAX_SS FAPI_NR_MAX_SS_PER_BWP*NR_MAX_NUM_BWP /// RX_IND @@ -19,6 +20,7 @@ #define FAPI_NR_RX_PDU_TYPE_DLSCH 0x03 #define FAPI_NR_DCI_IND 0x04 #define FAPI_NR_RX_PDU_TYPE_RAR 0x05 +#define FAPI_NR_CSIRS_IND 0x06 #define FAPI_NR_SIBS_MASK_SIB1 0x1 diff --git a/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h b/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h index 5f8a856028..a28762d1ff 100644 --- a/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h +++ b/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h @@ -36,9 +36,6 @@ */ - - - typedef struct { uint8_t uci_format; uint8_t uci_channel; @@ -50,7 +47,14 @@ typedef struct { uint32_t sr; } fapi_nr_uci_pdu_rel15_t; - +typedef struct { + uint32_t rsrp; + int rsrp_dBm; + uint8_t rank_indicator; + uint8_t i1; + uint8_t i2; + uint8_t cqi; +} fapi_nr_csirs_measurements_t; typedef struct { /// frequency_domain_resource; @@ -87,7 +91,7 @@ typedef struct { // N_CCE is L, or number of CCEs for DCI int N_CCE; uint8_t payloadSize; - uint8_t payloadBits[16]; + uint8_t payloadBits[16] __attribute__((aligned(16))); // will be cast as uint64 //fapi_nr_dci_pdu_rel15_t dci; } fapi_nr_dci_indication_pdu_t; @@ -130,6 +134,7 @@ typedef struct { fapi_nr_pdsch_pdu_t pdsch_pdu; fapi_nr_ssb_pdu_t ssb_pdu; fapi_nr_sib_pdu_t sib_pdu; + fapi_nr_csirs_measurements_t csirs_measurements; }; } fapi_nr_rx_indication_body_t; @@ -308,6 +313,7 @@ typedef struct uint8_t transform_precoding; uint16_t data_scrambling_id; uint8_t nrOfLayers; + uint8_t Tpmi; //DMRS uint16_t ul_dmrs_symb_pos; uint8_t dmrs_config_type; @@ -433,6 +439,9 @@ typedef struct { uint8_t mcs; uint8_t ndi; uint8_t rv; + uint16_t targetCodeRate; + uint8_t qamModOrder; + uint32_t TBS; uint8_t tb2_mcs; uint8_t tb2_ndi; uint8_t tb2_rv; @@ -464,6 +473,7 @@ typedef struct { uint8_t nEpreRatioOfPDSCHToPTRS; /// MCS table for this DLSCH uint8_t mcs_table; + uint32_t tbslbrm; uint8_t nscid; uint16_t dlDmrsScramblingId; uint16_t pduBitmap; @@ -476,20 +486,20 @@ typedef struct { typedef struct { - uint16_t bwp_size;// - uint16_t bwp_start;// - uint8_t subcarrier_spacing;// - uint8_t cyclic_prefix;// - uint16_t start_rb; - uint16_t nr_of_rbs; - uint8_t csi_type;//Value: 0:TRS 1:CSI-RS NZP 2:CSI-RS ZP - uint8_t row;//Row entry into the CSI Resource location table. [TS38.211, sec 7.4.1.5.3 and table 7.4.1.5.3-1] Value: 1-18 - uint16_t freq_domain;//Value: Up to the 12 LSBs, actual size is determined by the Row parameter - uint8_t symb_l0;//The time domain location l0 and firstOFDMSymbolInTimeDomain Value: 0->13 - uint8_t symb_l1;// - uint8_t cdm_type; - uint8_t freq_density;//The density field, p and comb offset (for dot5).0: dot5 (even RB), 1: dot5 (odd RB), 2: one, 3: three - uint16_t scramb_id;//ScramblingID of the CSI-RS [TS38.214, sec 5.2.2.3.1] Value: 0->1023 + uint8_t subcarrier_spacing; // subcarrierSpacing [3GPP TS 38.211, sec 4.2], Value:0->4 + uint8_t cyclic_prefix; // Cyclic prefix type [3GPP TS 38.211, sec 4.2], 0: Normal; 1: Extended + uint16_t start_rb; // PRB where this CSI resource starts related to common resource block #0 (CRB#0). Only multiples of 4 are allowed. [3GPP TS 38.331, sec 6.3.2 parameter CSIFrequencyOccupation], Value: 0 ->274 + uint16_t nr_of_rbs; // Number of PRBs across which this CSI resource spans. Only multiples of 4 are allowed. [3GPP TS 38.331, sec 6.3.2 parameter CSI-FrequencyOccupation], Value: 24 -> 276 + uint8_t csi_type; // CSI Type [3GPP TS 38.211, sec 7.4.1.5], Value: 0:TRS; 1:CSI-RS NZP; 2:CSI-RS ZP + uint8_t row; // Row entry into the CSI Resource location table. [3GPP TS 38.211, sec 7.4.1.5.3 and table 7.4.1.5.3-1], Value: 1-18 + uint16_t freq_domain; // Bitmap defining the frequencyDomainAllocation [3GPP TS 38.211, sec 7.4.1.5.3] [3GPP TS 38.331 CSIResourceMapping], Value: Up to the 12 LSBs, actual size is determined by the Row parameter + uint8_t symb_l0; // The time domain location l0 and firstOFDMSymbolInTimeDomain [3GPP TS 38.211, sec 7.4.1.5.3], Value: 0->13 + uint8_t symb_l1; // The time domain location l1 and firstOFDMSymbolInTimeDomain2 [3GPP TS 38.211, sec 7.4.1.5.3], Value: 2->12 + uint8_t cdm_type; // The cdm-Type field [3GPP TS 38.211, sec 7.4.1.5.3 and table 7.4.1.5.3-1], Value: 0: noCDM; 1: fd-CDM2; 2: cdm4-FD2-TD2; 3: cdm8-FD2-TD4 + uint8_t freq_density; // The density field, p and comb offset (for dot5). [3GPP TS 38.211, sec 7.4.1.5.3 and table 7.4.1.5.3-1], Value: 0: dot5 (even RB); 1: dot5 (odd RB); 2: one; 3: three + uint16_t scramb_id; // ScramblingID of the CSI-RS [3GPP TS 38.214, sec 5.2.2.3.1], Value: 0->1023 + uint8_t power_control_offset; // Ratio of PDSCH EPRE to NZP CSI-RSEPRE [3GPP TS 38.214, sec 5.2.2.3.1], Value: 0->23 representing -8 to 15 dB in 1dB steps; 255: L1 is configured with ProfileSSS + uint8_t power_control_offset_ss; // Ratio of NZP CSI-RS EPRE to SSB/PBCH block EPRE [3GPP TS 38.214, sec 5.2.2.3.1], Values: 0: -3dB; 1: 0dB; 2: 3dB; 3: 6dB; 255: L1 is configured with ProfileSSS } fapi_nr_dl_config_csirs_pdu_rel15_t; diff --git a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface_scf.h b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface_scf.h index c3a173758c..3a7dd8d523 100644 --- a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface_scf.h +++ b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface_scf.h @@ -738,7 +738,7 @@ typedef struct { // The total DCI length (in bits) including padding bits [TS38.212 sec 7.3.1] Range 0->DCI_PAYLOAD_BYTE_LEN*8 uint16_t PayloadSizeBits; // DCI payload, where the actual size is defined by PayloadSizeBits. The bit order is as following bit0-bit7 are mapped to first byte of MSB - LSB - uint8_t Payload[DCI_PAYLOAD_BYTE_LEN]; + uint8_t Payload[DCI_PAYLOAD_BYTE_LEN] __attribute__((aligned(32))); } nfapi_nr_dl_dci_pdu_t; @@ -776,6 +776,10 @@ typedef struct { nfapi_nr_dl_dci_pdu_t dci_pdu[MAX_DCI_CORESET]; } nfapi_nr_dl_tti_pdcch_pdu_rel15_t; +typedef struct { + uint32_t tbSizeLbrmBytes; +}nfapi_v3_pdsch_maintenance_parameters_t; + typedef struct { uint16_t pduBitmap; uint16_t rnti; @@ -854,6 +858,7 @@ typedef struct { uint8_t nEpreRatioOfPDSCHToPTRS; // Beamforming nfapi_nr_tx_precoding_and_beamforming_t precodingAndBeamforming; + nfapi_v3_pdsch_maintenance_parameters_t maintenance_parms_v3; }nfapi_nr_dl_tti_pdsch_pdu_rel15_t; @@ -920,32 +925,24 @@ typedef struct } nfapi_nr_dlsch_pdu_t; */ -//for csi-rs_pdu: - -//table 3-39 typedef struct { - uint16_t bwp_size;// - uint16_t bwp_start;// - uint8_t subcarrier_spacing;// - uint8_t cyclic_prefix;// - uint16_t start_rb; - uint16_t nr_of_rbs; - uint8_t csi_type;//Value: 0:TRS 1:CSI-RS NZP 2:CSI-RS ZP - uint8_t row;//Row entry into the CSI Resource location table. [TS38.211, sec 7.4.1.5.3 and table 7.4.1.5.3-1] Value: 1-18 - uint16_t freq_domain;//Value: Up to the 12 LSBs, actual size is determined by the Row parameter - uint8_t symb_l0;//The time domain location l0 and firstOFDMSymbolInTimeDomain Value: 0->13 - uint8_t symb_l1;// - uint8_t cdm_type; - uint8_t freq_density;//The density field, p and comb offset (for dot5).0: dot5 (even RB), 1: dot5 (odd RB), 2: one, 3: three - uint16_t scramb_id;//ScramblingID of the CSI-RS [TS38.214, sec 5.2.2.3.1] Value: 0->1023 - //tx power info - uint8_t power_control_offset;//Ratio of PDSCH EPRE to NZP CSI-RSEPRE Value :0->23 representing -8 to 15 dB in 1dB steps - uint8_t power_control_offset_ss;//Ratio of SSB/PBCH block EPRE to NZP CSI-RS EPRES 0: -3dB, 1: 0dB, 2: 3dB, 3: 6dB - + uint8_t subcarrier_spacing; // subcarrierSpacing [3GPP TS 38.211, sec 4.2], Value:0->4 + uint8_t cyclic_prefix; // Cyclic prefix type [3GPP TS 38.211, sec 4.2], 0: Normal; 1: Extended + uint16_t start_rb; // PRB where this CSI resource starts related to common resource block #0 (CRB#0). Only multiples of 4 are allowed. [3GPP TS 38.331, sec 6.3.2 parameter CSIFrequencyOccupation], Value: 0 ->274 + uint16_t nr_of_rbs; // Number of PRBs across which this CSI resource spans. Only multiples of 4 are allowed. [3GPP TS 38.331, sec 6.3.2 parameter CSI-FrequencyOccupation], Value: 24 -> 276 + uint8_t csi_type; // CSI Type [3GPP TS 38.211, sec 7.4.1.5], Value: 0:TRS; 1:CSI-RS NZP; 2:CSI-RS ZP + uint8_t row; // Row entry into the CSI Resource location table. [3GPP TS 38.211, sec 7.4.1.5.3 and table 7.4.1.5.3-1], Value: 1-18 + uint16_t freq_domain; // Bitmap defining the frequencyDomainAllocation [3GPP TS 38.211, sec 7.4.1.5.3] [3GPP TS 38.331 CSIResourceMapping], Value: Up to the 12 LSBs, actual size is determined by the Row parameter + uint8_t symb_l0; // The time domain location l0 and firstOFDMSymbolInTimeDomain [3GPP TS 38.211, sec 7.4.1.5.3], Value: 0->13 + uint8_t symb_l1; // The time domain location l1 and firstOFDMSymbolInTimeDomain2 [3GPP TS 38.211, sec 7.4.1.5.3], Value: 2->12 + uint8_t cdm_type; // The cdm-Type field [3GPP TS 38.211, sec 7.4.1.5.3 and table 7.4.1.5.3-1], Value: 0: noCDM; 1: fd-CDM2; 2: cdm4-FD2-TD2; 3: cdm8-FD2-TD4 + uint8_t freq_density; // The density field, p and comb offset (for dot5). [3GPP TS 38.211, sec 7.4.1.5.3 and table 7.4.1.5.3-1], Value: 0: dot5 (even RB); 1: dot5 (odd RB); 2: one; 3: three + uint16_t scramb_id; // ScramblingID of the CSI-RS [3GPP TS 38.214, sec 5.2.2.3.1], Value: 0->1023 + uint8_t power_control_offset; // Ratio of PDSCH EPRE to NZP CSI-RSEPRE [3GPP TS 38.214, sec 5.2.2.3.1], Value: 0->23 representing -8 to 15 dB in 1dB steps; 255: L1 is configured with ProfileSSS + uint8_t power_control_offset_ss; // Ratio of NZP CSI-RS EPRE to SSB/PBCH block EPRE [3GPP TS 38.214, sec 5.2.2.3.1], Values: 0: -3dB; 1: 0dB; 2: 3dB; 3: 6dB; 255: L1 is configured with ProfileSSS } nfapi_nr_dl_tti_csi_rs_pdu_rel15_t; -//for ssb_pdu: typedef struct { @@ -1195,6 +1192,10 @@ typedef struct #define PUSCH_PDU_BITMAP_PUSCH_PTRS 0x4 #define PUSCH_PDU_BITMAP_DFTS_OFDM 0x8 +typedef struct { + uint32_t tbSizeLbrmBytes; +}nfapi_v3_pusch_maintenance_parameters_t; + typedef struct { uint16_t pdu_bit_map;//Bitmap indicating presence of optional PDUs (see above) @@ -1240,7 +1241,7 @@ typedef struct nfapi_nr_dfts_ofdm_t dfts_ofdm; //beamforming nfapi_nr_ul_beamforming_t beamforming; - + nfapi_v3_pdsch_maintenance_parameters_t maintenance_parms_v3; } nfapi_nr_pusch_pdu_t; //for pucch_pdu: @@ -1665,41 +1666,34 @@ typedef struct } nfapi_nr_uci_indication_t; -//3.4.10 srs_indication -//table 3-73 -typedef struct -{ - uint8_t rb_snr; -}nfapi_nr_srs_indication_reported_symbol_resource_block_t; +/// 5G PHY FAPI Specification: SRS indication - Section 3.4.10, Table 3-73 -typedef struct -{ - uint16_t num_rbs; +typedef struct { + uint8_t rb_snr; // SNR value in dB. Value: 0 -> 255 representing -64 dB to 63 dB with a step size 0.5 dB, 0xff will be set if this field is invalid. +} nfapi_nr_srs_indication_reported_symbol_resource_block_t; + +typedef struct { + uint16_t num_rbs; // Number of PRBs to be reported for this SRS PDU. Value: 0 -> 272. nfapi_nr_srs_indication_reported_symbol_resource_block_t* rb_list; -}nfapi_nr_srs_indication_reported_symbol_t; +} nfapi_nr_srs_indication_reported_symbol_t; -#define NFAPI_NR_SRS_IND_MAX_PDU 100 -typedef struct -{ - uint32_t handle; - uint16_t rnti; - uint16_t timing_advance; - uint8_t num_symbols; - uint8_t wide_band_snr; - uint8_t num_reported_symbols; +typedef struct { + uint32_t handle; // The handle passed to the PHY in the the UL_TTI.request SRS PDU. + uint16_t rnti; // The RNTI passed to the PHY in the UL_TTI.request SRS PDU. Value: 1 -> 65535. + uint16_t timing_advance; // Timing advance TA measured for the UE [TS 38.213, Section 4.2]. NTA_new = NTA_old + (TA − 31) * 16 * 64 / (2^u). Value: 0 -> 63. 0xffff should be set if this field is invalid. + uint8_t num_symbols; // Number of symbols for SRS. Value: 1 -> 4. If a PHY does not report for individual symbols then this parameter should be set to 1. + uint8_t wide_band_snr; // SNR value in dB measured within configured SRS bandwidth on each symbol. Value: 0 -> 255 representing -64 dB to 63 dB with a step size 0.5 dB. 0xff will be set if this field is invalid. + uint8_t num_reported_symbols; // Number of symbols reported in this message. This allows PHY to report individual symbols or aggregated symbols where this field will be set to 1. Value: 1 -> 4. nfapi_nr_srs_indication_reported_symbol_t* reported_symbol_list; +} nfapi_nr_srs_indication_pdu_t; -}nfapi_nr_srs_indication_pdu_t; - -typedef struct -{ +typedef struct { nfapi_p7_message_header_t header; - uint16_t sfn; - uint16_t slot; - uint8_t number_of_pdus; + uint16_t sfn; // SFN. Value: 0 -> 1023 + uint16_t slot; // Slot. Value: 0 -> 159 + uint8_t number_of_pdus; // Number of PDUs included in this message. Value: 0 -> 255 nfapi_nr_srs_indication_pdu_t* pdu_list; - } nfapi_nr_srs_indication_t; diff --git a/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c b/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c index 3adde23e7d..98f89f599c 100644 --- a/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c +++ b/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c @@ -200,8 +200,6 @@ static uint8_t pack_tpm_value(nfapi_dl_config_dci_dl_tpm_t *value, uint8_t **ppW static uint8_t pack_dl_tti_csi_rs_pdu_rel15_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) { nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *value = (nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *)tlv; return( - push16(value->bwp_size, ppWritePackedMsg, end) && - push16(value->bwp_start, ppWritePackedMsg, end) && push8(value->subcarrier_spacing, ppWritePackedMsg, end) && push8(value->cyclic_prefix, ppWritePackedMsg, end) && push16(value->start_rb, ppWritePackedMsg, end) && @@ -3663,8 +3661,6 @@ int nfapi_p7_message_pack(void *pMessageBuf, void *pPackedBuf, uint32_t packedBu static uint8_t unpack_dl_tti_csi_rs_pdu_rel15_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) { nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *value = (nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *)tlv; return( - pull16(ppReadPackedMsg, &value->bwp_size, end) && - pull16(ppReadPackedMsg, &value->bwp_start, end) && pull8(ppReadPackedMsg, &value->subcarrier_spacing, end) && pull8(ppReadPackedMsg, &value->cyclic_prefix, end) && pull16(ppReadPackedMsg, &value->start_rb, end) && diff --git a/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c b/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c index 264b25deca..af02a16054 100644 --- a/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c +++ b/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c @@ -814,7 +814,7 @@ uint8_t phy_threegpplte_turbo_decoder8(int16_t *y, llr_t *s1,*s2,*yp1,*yp2,*yp; unsigned int i,j,iind;//,pi; unsigned char iteration_cnt=0; - unsigned int crc,oldcrc,crc_len; + unsigned int crc, crc_len; uint8_t temp; #if defined(__x86_64__) || defined(__i386__) __m128i *yp128; @@ -1233,8 +1233,8 @@ uint8_t phy_threegpplte_turbo_decoder8(int16_t *y, } // check the CRC - oldcrc= *((unsigned int *)(&decoded_bytes[(n>>3)-crc_len])); - + uint32_t oldcrc; + memcpy(&oldcrc, &decoded_bytes[(n >> 3) - crc_len], crc_len); switch (crc_type) { case CRC24_A: oldcrc&=0x00ffffff; diff --git a/openair1/PHY/CODING/coding_defs.h b/openair1/PHY/CODING/coding_defs.h index 8fe31f208e..1854f28fa7 100644 --- a/openair1/PHY/CODING/coding_defs.h +++ b/openair1/PHY/CODING/coding_defs.h @@ -38,7 +38,6 @@ #define MAX_TURBO_ITERATIONS_MBSFN 8 #define MAX_TURBO_ITERATIONS max_turbo_iterations -#define MAX_LDPC_ITERATIONS 5 #define MAX_LDPC_ITERATIONS_MBSFN 4 #define LTE_NULL 2 @@ -469,28 +468,11 @@ int32_t nr_segmentation(unsigned char *input_buffer, unsigned int *F, uint8_t BG); -/*!\fn uint32_t nr_compute_tbs -\brief This function returns the TBS in bits as per 6.1.4.2 of TS 38.214 -*/ -uint32_t nr_compute_tbs(uint16_t Qm, - uint16_t R, - uint16_t nb_rb, - uint16_t nb_symb_sch, - uint16_t nb_dmrs_prb, - uint16_t nb_rb_oh, - uint8_t tb_scaling, - uint8_t Nl); - -uint32_t nr_compute_tbslbrm(uint16_t table, - uint16_t nb_rb, - uint8_t Nl); - void nr_interleaving_ldpc(uint32_t E, uint8_t Qm, uint8_t *e,uint8_t *f); void nr_deinterleaving_ldpc(uint32_t E, uint8_t Qm, int16_t *e,int16_t *f); -int nr_rate_matching_ldpc(uint8_t Ilbrm, - uint32_t Tbslbrm, +int nr_rate_matching_ldpc(uint32_t Tbslbrm, uint8_t BG, uint16_t Z, uint8_t *w, @@ -501,8 +483,7 @@ int nr_rate_matching_ldpc(uint8_t Ilbrm, uint8_t rvidx, uint32_t E); -int nr_rate_matching_ldpc_rx(uint8_t Ilbrm, - uint32_t Tbslbrm, +int nr_rate_matching_ldpc_rx(uint32_t Tbslbrm, uint8_t BG, uint16_t Z, int16_t *w, diff --git a/openair1/PHY/CODING/crc_byte.c b/openair1/PHY/CODING/crc_byte.c index 9ad18cc1a6..471b26fe24 100644 --- a/openair1/PHY/CODING/crc_byte.c +++ b/openair1/PHY/CODING/crc_byte.c @@ -244,11 +244,11 @@ crc16 (unsigned char * inptr, int bitlen) while (octetlen-- > 0) { - crc = (crc << 8) ^ (crc16Table[(*inptr++) ^ (crc >> 24)] << 16); + crc = (crc << 8) ^ (((uint32_t)crc16Table[(*inptr++) ^ (crc >> 24)]) << 16); } if (resbit > 0) - crc = (crc << resbit) ^ (crc16Table[((*inptr) >> (8 - resbit)) ^ (crc >> (32 - resbit))] << 16); + crc = (crc << resbit) ^ (((uint32_t)crc16Table[(*inptr) >> (8 - resbit) ^ (crc >> (32 - resbit))]) << 16); return crc; } diff --git a/openair1/PHY/CODING/nrLDPC_decoder/doc/nrLDPC/logo.png b/openair1/PHY/CODING/nrLDPC_decoder/doc/nrLDPC/logo.png deleted file mode 100644 index 7b785ca0517c0aa7467aafebff9255b2bdf0b8ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3723 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

2O%A!2X81aUUX1aj%=!We31w62>`ZOQ~=2OBywE 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

^wi_tRJ9+T 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 Y9bN6e!;cZbz{t!BMM5GhBLemR0K0!5$^ZZW diff --git a/openair1/PHY/CODING/nrLDPC_decoder/doc/nrLDPC/nrLDPC.tex b/openair1/PHY/CODING/nrLDPC_decoder/doc/nrLDPC/nrLDPC.tex deleted file mode 100644 index 019b51aa96..0000000000 --- a/openair1/PHY/CODING/nrLDPC_decoder/doc/nrLDPC/nrLDPC.tex +++ /dev/null @@ -1,960 +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 -% - -\documentclass{article} - -\usepackage[a4paper, total={6in, 8in}]{geometry} - -\usepackage{amsmath} -\usepackage{amsfonts} -\usepackage{amssymb} -\usepackage{booktabs} -\usepackage{url} -\usepackage{tcolorbox} - -\usepackage{tikz} -\usetikzlibrary{arrows,decorations,shapes,backgrounds,patterns} -\usepackage{pgfplots} -\pgfplotsset{compat=newest} -\definecolor{green}{RGB}{32,127,43} -\usetikzlibrary{calc} - -\usepackage{listings} -\lstdefinestyle{customc}{ - belowcaptionskip=1\baselineskip, - breaklines=true, - frame=L, - xleftmargin=\parindent, - language=C, - showstringspaces=false, - basicstyle=\footnotesize\ttfamily, - keywordstyle=\bfseries\color{green!40!black}, - commentstyle=\itshape\color{purple!40!black}, - identifierstyle=\color{blue}, - stringstyle=\color{orange}, -} -\lstset{escapechar=@,style=customc} - -\title{NR LDPC Decoder} -\author{Sebastian Wagner (TCL)} -\date{\today} - -\def\0{\mathbf{0}} -\def\b{\mathbf{b}} -\def\Bbb{\mathbb{B}} -\def\Bcal{\mathcal{B}} -\def\c{\mathbf{c}} -\def\C{\mathbf{C}} -\def\Cbb{\mathbb{C}} -\def\Ccal{\mathcal{C}} -\def\eqdef{\triangleq} -\def\g{\mathbf{g}} -\def\G{\mathbf{G}} -\def\Gcal{\mathcal{G}} -\def\h{\mathbf{h}} -\def\H{\mathbf{H}} -\def\Hbg{\mathbf{H}_\mathrm{BG}} -\def\Hbgo{\mathbf{H}_\mathrm{BG1}} -\def\Hbgt{\mathbf{H}_\mathrm{BG2}} -\def\I{\mathbf{I}} -\def\Kb{{K_b}} -\def\m{\mathbf{m}} -\def\Mb{{M_b}} -\def\Nb{{N_b}} -\def\Nbb{\mathbb{N}} -\def\n{\mathbf{n}} -\def\nr{{n_{\rm r}}} -\def\nt{{n_{\rm t}}} -\def\s{\mathbf{s}} -\def\SNR{\mathsf{SNR}} -\def\y{\mathbf{y}} -\def\z{\mathbf{z}} -\def\Z{\mathbf{Z}} -\def\Zc{{Z_c}} - - -\def\herm{\mathsf{H}} -\def\trans{\mathsf{T}} -\def\EE{\mathsf{E}} -\newcommand{\sgn}{\operatorname{sgn}} - -\begin{document} - -\maketitle - -\begin{tikzpicture}[remember picture,overlay] - \node[anchor=north west,inner sep=0pt] at (current page.north west) - {\includegraphics[scale=0.5]{logo.png}}; -\end{tikzpicture} - - -\begin{center}Currently Supported:\end{center} -\tcbox[center]{ - \begin{tabular}{lll} - \toprule - \textbf{BG} & \textbf{Lifting Size Z} & \textbf{Code Rate R} \\ - \midrule - 1 & all & 1/3, 2/3, 8/9 \\ - 2 & all & 1/5, 1/3, 2/3 \\ - \bottomrule - \end{tabular} -} - -\paragraph{Version 1.0:} -\begin{itemize} -\item Initial version -\end{itemize} - -\paragraph{Version 2.0:} -\begin{itemize} -\item Enhancements in message passing: - \begin{itemize} - \item LUTs replaced by smaller BG-specific parameters - \item Inefficient load/store replaced by circular memcpy - \end{itemize} -\item Bug fixes: - \begin{itemize} - \item Fixed bug in function \texttt{llr2CnProcBuf} - \item Corrected input LLR dynamic range in BLER simulations - \end{itemize} -\item Results: - \begin{itemize} - \item Size of LUTs reduced significantly (60MB to 200KB) - \item Siginifcantly enhances execution time (factor 3.5) - \item Improved BLER performance (all simulation results have been updated) - \end{itemize} -\end{itemize} - - -\newpage -\tableofcontents - -\newpage -\section{Introduction} -\label{sec:introduction} - -Low Density Parity Check (LDPC) codes have been developed by Gallager in 1963 \cite{gallager1962low}. They are linear error correcting codes that are capacity-achieving for large block length and are completely described by their Parity Check Matrix (PCM) $\H^{M\times N}$. The PCM $\H$ defines $M$ constraints on the codeword $\c$ of length $N$ such that -\begin{equation} - \label{eq:29} - \H\c = \0. -\end{equation} -The number of information bits $B$ that can be encoded with $\H$ is given by $B=N-M$. Hence the code rate $R$ of $\H$ reads -\begin{equation} - \label{eq:37} - R = \frac{B}{N} = 1-\frac{M}{N}. -\end{equation} - - -\subsection{LDPC in NR} -\label{sec:ldpc-nr} - -NR uses quasi-cyclic (QC) Protograph LDPC codes, i.e. a smaller graph, called Base Graph (BG), is defined and utilized to construct the larger PCM. This has the advantage that the large PCM does not have to be stored in memory and allows for a more efficient implementation while maintaining good decoding properties. -Two BGs $\Hbg\in\Nbb^{\Mb\times \Nb}$ are defined in NR: -\begin{enumerate} -\item $\Hbgo\in\Nbb^{46\times 68}$ -\item $\Hbgt\in\Nbb^{42\times 52}$ -\end{enumerate} -where $\Nbb$ is the set of integers. For instance the first 3 rows and 13 columns of BG2 are given by - -\setcounter{MaxMatrixCols}{30} -\begin{equation*} - \label{eq:33} - \Hbgt = - \begin{bmatrix} - 9 & 117 & 204 & 26 & \emptyset & \emptyset & 189 & \emptyset & \emptyset & 205 & 0 & 0 & \emptyset & \emptyset \\ - 127 & \emptyset & \emptyset & 166 & 253 & 125 & 226 & 156 & 224 & 252 & \emptyset & 0 & 0 & \emptyset \\ - 81 & 114 & \emptyset & 44 & 52 & \emptyset & \emptyset & \emptyset & 240 & \emptyset & 1 & \emptyset & 0 & 0 - \end{bmatrix}. -\end{equation*} - -To obtain the PCM $\H$ from the BG $\Hbg$, each element $\Hbg(i,j)$ in the BG is replaced by a lifting matrix of size $\Zc\times \Zc$ according to -\begin{equation} - \label{eq:35} - \Hbg(i,j) = - \begin{cases} - \0 & \textrm{if}~ \Hbg(i,j)=\emptyset \\ - \I_{P_{ij}} & \textrm{otherwise} - \end{cases} -\end{equation} -where $\I_{P_{ij}}$ is the identity matrix circularly shifted to the right by $P_{ij} = \Hbg(i,j)\mod \Zc$. Hence, the resulting PCM $\H$ will be of size $\Mb\Zc\times\Nb\Zc$. - -The lifting size $\Zc$ depends on the number of bits to encode. To limit the complexity, a discrete set $\mathcal{Z}$ of possible values of $\Zc$ has been defined in \cite{3gpp2017_38212} and the optimal value $\Zc$ is calculated according to -\begin{equation} - \label{eq:36} - \Zc = \min_{\Z\in\mathcal{Z}}\left[Z\geq\frac{B}{\Nb}\right]. -\end{equation} - -The base rate of the two BGs is $1/3$ and $1/5$ for BG1 and BG2, respectively. That is, BG1 encodes $K=22\Zc$ bits and BG2 encodes $K=10\Zc$ bits. Note that the first 2 columns of BG 1 and 2 are always punctured, that is after encoding, the first $2\Zc$ bits are discarded and not transmitted. -For instance, consider $B=500$ information bits to encode using BG2, \eqref{eq:36} yields $\Zc=64$ hence $K=640$. Since $K>B$, $K-B=140$ filler bits are appended to the information bits. The PCM $\Hbgt$ is of size $2688\times 3328$ and the $640$ bits $\b$ are encoded according to \eqref{eq:29} at a rate $R \approx 0.192$. To achieve the higher base rate of $0.2$, the first $128$ are punctured, i.e. instead of transmitting all $3328$ bits, only $3200$ are transmitted resulting in the desired rate $R=640/3200=0.2$. - -\subsection{LDPC Decoding} -\label{sec:ldpc-decoding} - -The decoding of codeword $\c$ can be achieved via the classical message passing algorithm. This algorithm can be illustrated best using the Tanner graph of the PCM. The rows of the PCM are called check nodes (CN) since they represent the parity check equations. The parity check equation of each of these check nodes involves various bits in the codeword. Similarly, every column of the PCM corresponds to a bit and each bit is involved in several parity check equations. In the Tanner graph representation, the bits are called bit nodes (BN). Let's go back to the previous example of BG2 and assume $\Zc=2$, hence the first 3 rows and 13 columns of BG2 $\Hbgt$ read -\begin{equation*} - \label{eq:36} - \Hbgt = - \begin{bmatrix} - 1 & 1 & 0 & 0 & \emptyset & \emptyset & 1 & \emptyset & \emptyset & 1 & 0 & 0 & \emptyset & \emptyset \\ - 1 & \emptyset & \emptyset & 0 & 1 & 1 & 0 & 0 & 0 & 0 & \emptyset & 0 & 0 & \emptyset \\ - 1 & 0 & \emptyset & 0 & 0 & \emptyset & \emptyset & \emptyset & 0 & \emptyset & 1 & \emptyset & 0 & 0 - \end{bmatrix}. -\end{equation*} -Replacing the elements according to \eqref{eq:35}, we obtain the first 6 rows and 26 columns of the PCM as -\begin{equation*} - \label{eq:39} - \H = - \begin{bmatrix} - 0 & 1 & 0 & 1 & 1 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 1 & 1 & 0 & 1 & 0 & 0 & 0 & 0 & 0\\ - 1 & 0 & 1 & 0 & 0 & 1 & 0 & 1 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 1 & 0 & 1 & 0 & 0 & 0 & 0\\ - 0 & 1 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 1 & 0 & 1 & 1 & 0 & 1 & 0 & 1 & 0 & 1 & 0 & 0 & 0 & 1 & 0 & 1 & 0 & 0 & 0\\ - 1 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 1 & 0 & 1 & 0 & 0 & 1 & 0 & 1 & 0 & 1 & 0 & 1 & 0 & 0 & 0 & 1 & 0 & 1 & 0 & 0\\ - 0 & 1 & 1 & 0 & 0 & 0 & 1 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 1 & 0 & 1 & 0\\ - 1 & 0 & 0 & 1 & 0 & 0 & 0 & 1 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 1 & 0 & 1 - \end{bmatrix}. -\end{equation*} - -The Tanner graph of the first 8 BNs is shown in Figure \ref{fig:tannergraph}. - -\begin{figure}[ht] - \label{fig:tannergraph} - \centering - \def\ww{0.3cm} - \def\hh{0.3cm} - \tikzstyle{cnode}=[fill=white,rectangle,draw=black,thick,inner sep=2pt, minimum height=\hh,minimum width=\ww, rounded corners=1pt,text width=\ww] - \tikzstyle{vnode}=[fill=white,circle,draw=black,thick,inner sep=2pt, minimum height=\hh,minimum width=\ww, rounded corners=1pt,text width=\ww] - \tikzstyle{connector}=[<->,>=latex',semithick] - - \begin{tikzpicture} - \tikzstyle{every node}=[node distance=1.5cm,text centered] - % Check nodes - \node[cnode, label=above:$v_0$] (v0) {}; - \node[cnode, label=above:$v_1$, right of=v0] (v1) {}; - \node[cnode, label=above:$v_2$, right of=v1] (v2) {}; - % Variable nodes - \node[vnode, label=below:$c_3$, below of=v1, node distance=1.5cm] (c3) {}; - \node[vnode, label=below:$c_2$, left of=c3, node distance=1.5cm] (c2) {}; - \node[vnode, label=below:$c_1$, left of=c2, node distance=1.5cm] (c1) {}; - \node[vnode, label=below:$c_0$, left of=c1, node distance=1.5cm] (c0) {}; - \node[vnode, label=below:$c_4$, right of=c3, node distance=1.5cm] (c4) {}; - \node[vnode, label=below:$c_5$, right of=c4, node distance=1.5cm] (c5) {}; - \node[vnode, label=below:$c_6$, right of=c5, node distance=1.5cm] (c6) {}; - - % Draw edges - \draw (c0) edge[connector] (v1); - \draw (c1) edge[connector] (v0); - \draw (c1) edge[connector] (v2); - \draw (c2) edge[connector] (v1); - \draw (c3) edge[connector] (v0); - \draw (c4) edge[connector] (v0); - \draw (c4) edge[connector] (v2); - \draw (c5) edge[connector] (v1); - \draw (c6) edge[connector] (v0); - \draw (c6) edge[connector] (v2); - - \end{tikzpicture} - - \caption{Tanner graph for first 7 bits nodes and 3 check nodes from \eqref{eq:39}.} -\end{figure} - -The message passing algorithm is an iterative algorithm where probabilities of the bits (being either 0 or 1) are exchanged between the BNs and CNs. After sufficient iterations, the probabilities will have either converged to either 0 or 1 and the parity check equations will be satisfied, at this point, the codeword has been decoded correctly. - -\newpage -\section{LDPC Decoder Implementation} -\label{sec:ldpc-implementation} - -The implementation on a general purpose processor (GPP) has to take advantage of potential instruction extension of the processor architecture. We focus on the Intel x86 instruction set architecture (ISA) and its advanced vector extension (AVX). In particular, we utilize AVX2 with its 256-bit single instruction multiple data (SIMD) format. In order to utilize AVX2 to speed up the processing at the CNs and BNs, the corresponding data has to be ordered/aligned in a specific way. The processing flow of the LDPC decoder is depicted in \ref{fig:ldpc_decoder_flow}. - -\begin{figure}[ht] - \label{fig:ldpc_decoder_flow} - \centering - \def\ww{0.3cm} - \def\hh{0.3cm} - \tikzstyle{func}=[,draw=none] - \tikzstyle{connector}=[->,>=latex',semithick] - - \begin{tikzpicture} - \tikzstyle{every node}=[node distance=2.5cm,text centered] - % Check nodes - % First iteration - \node[func] (llr2llrProcBuf) {\texttt{llr2llrProcBuf}}; - \node[func, above of=llr2llrProcBuf] (llr2CnProcBuf) {\texttt{llr2CnProcBuf}}; - \node[func, above right of=llr2CnProcBuf] (cnProc1) {\texttt{cnProc}}; - \node[func, below right of=cnProc1] (cn2bnProcBuf1) {\texttt{cn2bnProcBuf}}; - \node[func, below of=cn2bnProcBuf1] (bnProcPc1) {\texttt{bnProcPc}}; - - % Iterations - \node[func, right of=cnProc1, node distance=7cm] (cnProc) {\texttt{cnProc}}; - \node[func, below right of=cnProc] (cn2bnProcBuf) {\texttt{cn2bnProcBuf}}; - \node[func, below of=cn2bnProcBuf] (bnProcPc) {\texttt{bnProcPc}}; - \node[func, below left of=cnProc] (bn2cnProcBuf) {\texttt{bn2cnProcBuf}}; - \node[func, below of=bn2cnProcBuf] (bnProc) {\texttt{bnProc}}; - - % Post processing - \node[func, below of=bnProcPc] (llrRes2llrOut) {\texttt{llrRes2llrOut}}; - \node[func, below of=llrRes2llrOut, node distance=1cm] (llr2bit) {\texttt{llr2bit}}; - - % Draw edges - \draw (llr2llrProcBuf) edge[connector] (llr2CnProcBuf); - \draw (llr2CnProcBuf) edge[connector] (cnProc1); - \draw (cnProc1) edge[connector] (cn2bnProcBuf1); - \draw (cn2bnProcBuf1) edge[connector] (bnProcPc1); - - \draw (bnProcPc) edge[connector] (bnProc); - \draw (bnProc) edge[connector] (bn2cnProcBuf); - \draw (bn2cnProcBuf) edge[connector] node[above left] {\texttt{cnProcPc}} (cnProc); - \draw (cnProc) edge[connector] (cn2bnProcBuf); - \draw (cn2bnProcBuf) edge[connector] (bnProcPc); - - \draw (bnProcPc1) edge[connector] (bnProc); - - \draw (bnProcPc) edge[connector] node[left] {iterations done} (llrRes2llrOut); - \draw (llrRes2llrOut) edge[connector] (llr2bit); - - % Boxes - \node[inner sep=0pt,above right of=cn2bnProcBuf1, node distance = 2.5cm] (ref) {}; - - \draw[fill=black,opacity=.2, rounded corners] (llr2llrProcBuf.south west) rectangle ($(ref) + (-.5cm,.5cm)$); - \draw[fill=black,opacity=.2, rounded corners] ($(ref) + (.5cm,.5cm)$) rectangle ($(bnProcPc.south east) + (.4cm,0)$); - - \node[func, above of=cnProc1, node distance=.8cm] (iter1) {\textbf{First Iteration}}; - \node[func, above of=cnProc , node distance=.8cm] (iterX) {\textbf{Subsequent Iterations}}; - - \end{tikzpicture} - - \caption{LDPC Decoder processing flow.} -\end{figure} - -The functions involved are described in more detail in Table \ref{tab:sum_func}. - -\begin{table}[ht] - \centering - \begin{tabular}{ll} - \toprule - \textbf{Function} & \textbf{Description} \\ - \midrule - \texttt{llr2llrProcBuf} & Copies input LLRs to LLR processing buffer \\ - \texttt{llr2CnProcBuf} & Copies input LLRs to CN processing buffer \\ - \texttt{cnProc} & Performs CN signal processing \\ - \texttt{cnProcPc} & Performs parity check \\ - \texttt{cn2bnProcBuf} & Copies the CN results to the BN processing buffer \\ - \texttt{bnProcPc} & Performs BN processing for parity check and/or hard-decision \\ - \texttt{bnProc} & Utilizes the results of \texttt{bnProcPc} to compute LLRs for CN processing \\ - \texttt{bn2cnProcBuf} & Copies the BN results to the CN processing buffer \\ - \texttt{llrRes2llrOut} & Copies the results of \texttt{bnProcPc} to output LLRs \\ - \texttt{llr2bit} & Performs hard-decision on the output LLRs \\ - \bottomrule - \end{tabular} - \caption{Summary of the LDPC decoder functions.} - \label{tab:sum_func} -\end{table} - -The input LLRs are assumed to be 8-bit and aligned on 32 bytes. CN processing is carried out in 8-bit whereas BN processing is done in 16 bit. Subsequently, the processing tasks at the CNs and BNs are explained in more detail. - -\newpage -\subsection{Check Node Processing} -\label{sec:check-node-proc} - -Denote $q_{ij}$ the value from BN $j$ to CN $i$ and let $\Bcal_i$ be the set of connected BNs to the $i$th CN. Then, using the min-sum approximation, CN $i$ has to carry out the following operation for each connected BN. -\begin{equation} - \label{eq:40} - r_{ji} = \prod_{j'\in\Bcal_i\setminus j}\sgn q_{ij'}\min_{j'\in\Bcal_i\setminus j} |q_{ij'}| -\end{equation} -where $r_{ji}$ is the value returned to BN $j$ from CN $i$. There are $\Mb = \{46,42\}$ CNs in BG 1 and BG 2, respectively. Each of these CNs is connected to only a small number of BNs. The number of connected BNs to CN $i$ is $|\Bcal_i|$. In BG1 and BG2, $|\Bcal_i|=\{3,4,5,6,7,8,9,10,19\}$ and $|\Bcal_i|=\{3,4,5,6,8,10\}$, respectively. The following tables show the number of CNs $M_{|\Bcal_i|}$ that are connected to the same number of BNs. - -\begin{table}[ht] - \centering - \begin{tabular}{llllllllll} - \toprule - $|\Bcal_i|$ & 3 & 4 & 5 & 6 & 7 & 8 & 9 & 10 & 19 \\ - \midrule - $M_{|\Bcal_i|}^\mathrm{BG1}$ & 1 & 5 &18 & 8 & 5 & 2 & 2 & 1 & 4 \\ - $M_{|\Bcal_i|}^\mathrm{BG2}$ & 6 & 20 & 9 & 3 & 0 & 2 & 0 & 2 & 0 \\ - \bottomrule - \end{tabular} - \caption{Ceck node groups for BG1 and BG2.} - \label{tab:checkNodeGroups} -\end{table} - -It can be observed that each CN is at least connected to 3 BNs and there are 9 groups and 5 groups in BG1 and BG2, respectively. Denote the set of CN groups as $\Gcal$ and $M_k$ the number of CNs in group $k\in\Gcal$, e.g. for BG2 $M_4=20\Zc$. Each CN group will be processed separately. The CN processing buffer $p_C^k$ of group $k$ is defined as -\begin{equation} - \label{eq:44} - p_C^k = \{\underbrace{q_{11}q_{21}\dots q_{M_k 1}}_{\text 1. BN},\underbrace{q_{12}q_{22}\dots q_{M_k 2}}_{\text 2. BN},\dots,\underbrace{q_{12}q_{22}\dots q_{M_k k}}_{\text last BN}\} -\end{equation} -Hence, $|p_C^k| = kM_k$, e.g, $\Zc=128$, $|p_C^4| = 4\cdot 20\cdot 128 = 10240$. - -\begin{lstlisting}[frame=single,caption={Example of CN processing for group 3 from \texttt{cnProc}.},label=code_cnproc] % Start your code-block - - const uint8_t lut_idxCnProcG3[3][2] = {{72,144}, {0,144}, {0,72}}; - - // ===================================================================== - // Process group with 3 BNs - - // Number of groups of 32 CNs for parallel processing - M = (lut_numCnInCnGroups[0]*Z)>>5; - // Set the offset to each bit within a group in terms of 32 Byte - bitOffsetInGroup = (lut_numCnInCnGroups_BG2_R15[0]*NR_LDPC_ZMAX)>>5; - - // Set pointers to start of group 3 - p_cnProcBuf = (__m256i*) &cnProcBuf [lut_startAddrCnGroups[0]]; - p_cnProcBufRes = (__m256i*) &cnProcBufRes[lut_startAddrCnGroups[0]]; - - // Loop over every BN - for (j=0; j<3; j++) - { - // Set of results pointer to correct BN address - p_cnProcBufResBit = p_cnProcBufRes + (j*bitOffsetInGroup); - - // Loop over CNs - for (i=0; i>5; - - // Set the offset to each CN within a group in terms of 16 Byte - cnOffsetInGroup = (lut_numBnInBnGroups[2]*NR_LDPC_ZMAX)>>4; - - // Set pointers to start of group 3 - p_bnProcBuf = (__m128i*) &bnProcBuf [lut_startAddrBnGroups [idxBnGroup]]; - p_llrProcBuf = (__m128i*) &llrProcBuf [lut_startAddrBnGroupsLlr[idxBnGroup]]; - p_llrRes = (__m256i*) &llrRes [lut_startAddrBnGroupsLlr[idxBnGroup]]; - - // Loop over BNs - for (i=0,j=0; i(b4gePWH#eg2(L4%#{WRt}19V z_rtQRsU|;vqoFx6gn*^~xR=S&(sJCwsd;A-uH|xAERs{ofBY1&!1f01C$`iBG=?`j zlVxQE1$=+>g5>j0Rw6_f8V=9*W>2&TSv0E#Gc`3ekF^$kP`9^(XCpFfdtNt>DO^9^ z+2eCo!FaLSK@)eH{6?+F?dhnbal!!<3LVKP7Wsip-JH;Z?U_nfYc{z&#M)xCNB{H_ zFdRb1f1^JoL5k*TafPk<(!kr2k4)shi{~MFwtaRrmj~>V@xd3dY{fMBgjp_+^Iht# zcIw?^|EGk>vU&FjVj#J&X2d$>xFlSaP5t}FjN(ItXMVc-_PstOJSW6j0)0#m^-YZH z7@Obj#luHvmzmNn7i@HBzAMr|F#S&ATsd;}4pU}a<72Izo1OI-7AJ&j*V&I1C`zt5 zmbD3q6&6I4O4s0xzIY)RaRD3w*B~`2UYg4 zYh*N87s9hymhL@iBRF#?_O+7p!9toIb(GYDcR1qg7f0i2de+v~ zI*qREZEr+3X+htuuNPecPn)<&!tUVQhr9lk&Ln@ zfNPk2d-)peXT)|%%r1eozdnMSk-rdbwv(;(fZ}UBQiQjYv_~c=mU5ur^)YbVJRNdfmD@Z)ilrJ zo;tXK@Y&cs(7}zJCv1_t^FpkS1vdtVe3a-poAWyx(GzER=GikB*-gPYaxF} zK?JcH$D}rp#7SR!)sGi}L?L-=Z5P}&(i{f(>(;(JZkn^k&clU*ve@uJ&$sc^RBY)3MXIYtvy&z^*W!{^Ev~f$*bCS zsnv^zJQ7-1r3tTFyMd<+ilRJimKy4jcNTHE6~VrufKHNiJiUiT!~mqb4{udV)T6Zc z07vE~=|?^U3=$)k!UMR|*5{|JQ$9O@kLg~wm<*=h>TGOpZ)?`s8zUVzGJL#k+-7U6 z8=Uv9N}KlUcS`3RUttR!zO_-_@F4GG{i4Sh*Q>C~=Y4ZoR8-W)C*>VJbOHdn@1XH> zkcj6@m3iG-M+hP6GGThKS+MZ{4lVqh-vwCLWM=}7(C=)cprDZ~v^>7pVFh6A=JE)2 zvmvThrkj?+q>>BmzYGwgLM*)ZZ_|(HiqR^C!~0oI^LO&)(~`ABK2Ba#T81zCqoF;+ z15!2v-n11Ds_p2|yW{-qtoo)5z>EXNn@&>LYQRG)p4ru&7{Kq$-w@fSU~x#9RZb&; zC%ptm_pFk;%nfH~0*e9C%<;XA2EBU6tzqkv`{|qODX@i>)dl^AqM}}d@>R_qn_7@9 z+J;Bj=anCG?G&pi!|C^n%E|^=c2NPo*{(f{<2AQi4b+GQU59?|wY4?BNGTfo2@TUV ziE}#n)Jq))7{!p{0SUN!uXZsVq&fG)ZUtVuAYeX16DGmwxH*&oto~$UaM9x`^`O;m zZhyW3$Q)fKo;Gr<>1UNYJKNj#Pl0S5ILR&PN+~)6dXMJ&<^8J%zTl_~?I@h+jDw}X zm=?X$REL2~b4|LKwT*}Tmpa)kh<=!bg#`v>S=0GUGPmWGLuuQT@%L##tJ>Py4T?Dn zGqb6Br=6k9_t-1G!)9DQ8M@NaJuditEhj7lA?nbR46W zmX`L|lY6dIr{TD4PvoHS^A#hd(Z&9}M+@dhkbT|Fug4&vi#dmXsVkmYN$(`d5pI6f;qcCmf8YEuQs#m*1Vm)yaiJ4>!NR6fQs9iBSCu+ zlxRPH0fh5yW@O(QK}g5J#Y=FrC8S4+COU;MRzLCPX+PF`Z`Tj`qidY2=J{!P%8U+! zgiVO`ltp|DOv(*lgLkJZ3E6ZTf#-WI7`ZAtyX{p^h8xL8A$L$g=UB5nM#ljBH=d5j zJbX7*ZrH^+DC7XZH^ug^T&Owlu~9E6F9&cA-??U3B;^Tv>#+%rjxVX6ghtsyPWCMr<{mF9+*LG1uuBxktOkYPRj94Sl3R<{~`N5L}9-2tjz2geGeCPc%aM7SB8 z99vrPq-e8>Y7%-JHecH{*WSAL=}^Z(4gl*E1Mve85FpW_ntblXLE^N!`@cF6mDX<; z&4H<+eyqi79qVMo$mhfAxANv7VG<5)&w0sKKRn(_1}y>Ak@thYs~Qm4DY(gg(cf7b^-1Y-2yMIuXq2Q$R6kwe{-9~kyK(Jioo1#afv)!@Hm*iHZMT(h3Y(l z-;gfg2DLAd>mRT708!J=(gM6zewy=4kxKE%)+zr+YUN;9_+9yMGWeO}Sqwo z&S7wk5eF;qpaq5WEL+RR5YWULaS==4AhzG+8URSg>%H0w)b8!v8o+f2BXo9G3iH!@ zO(VV#dIOQ{J(N+0(666+wXmeq;R94{(lK;vCYR~}Rm&0&G2$Q|Jn?AJ^g3`@y8#S; zN2~`=nEUP)4De96CVWBg#*8aj^kxZLa-qgU&~@>4XmJ))X9>`f^t+(N!7$=Taywa{ zcN~>dQBlDYudb?kfc{Cl2M86iksbE)sGX}h_1k42b+hR*$3XxPY1mQVTk<0X!qNlV zDYBG5`YHeJ9c>=ItCIbV+rPd5NM_?^R>;-WmA$3?sMD&lva--o`%6TE94O!puzgl< zbiR5t0GQ

3e0RLw_# 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
e_0g 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 M)R05TJbe8>05(MTZ2$lO literal 0 HcmV?d00001 diff --git a/openair1/PHY/NR_UE_ESTIMATION/plot_prs_Ttracer_dumps.m b/openair1/PHY/NR_UE_ESTIMATION/plot_prs_Ttracer_dumps.m new file mode 100644 index 0000000000..e552a81338 --- /dev/null +++ b/openair1/PHY/NR_UE_ESTIMATION/plot_prs_Ttracer_dumps.m @@ -0,0 +1,52 @@ +clc; clear all; +dir = input('Enter the directory path to T tracer dumps: '); +fft_size = input('Enter the OFDM FFT size used for file parsing: '); +num_resources = input('Enter number of PRS respurces: '); +num_gnb = input('Enter number of active gNBs: '); +num_prs_symb = 1; +start_resource = 0; +buff_offset = start_resource*2*fft_size; + +%% Channel Impulse Response(CIR) +figure, hold on; +for i=0:num_gnb-1 + for j=0:num_resources-1 + file = [dir '/chT_gnb', num2str(i), '_', num2str(j), '.raw']; + fid = fopen(file, 'r'); + if (fid > 0) + x = fread(fid, Inf, 'int16'); + else + disp(['Failed to open the file ', file, '..!!']) + return; + end + fclose(fid); + + y = x(buff_offset+1:2:num_prs_symb*2*fft_size) + 1j*x(buff_offset+2:2:num_prs_symb*2*fft_size); + plot(abs(fftshift(y))); + end +end +xlabel('FFT Index'); ylabel('ABS'); +title('CHANNEL IMPULSE RESPONSE'); +hold off; + +%% Channel Frequncy Response(CFR) +figure, hold on; +for i=0:num_gnb-1 + for j=0:num_resources-1 + file = [dir '/chF_gnb', num2str(i), '_', num2str(j), '.raw']; + fid = fopen(file, 'r'); + if (fid > 0) + x = fread(fid, Inf, 'int16'); + else + disp(['Failed to open the file ', file, '..!!']) + return; + end + fclose(fid); + + y = x(buff_offset+1:2:num_prs_symb*2*fft_size) + 1j*x(buff_offset+2:2:num_prs_symb*2*fft_size); + plot(abs(y)); + end +end +xlabel('FFT Index'); ylabel('ABS'); +title('CHANNEL FREQUENCY RESPONSE'); +hold off; \ No newline at end of file From 7261b7d3042e60178232b40bba271ad15461adb1 Mon Sep 17 00:00:00 2001 From: Sagar Parsawar Date: Mon, 12 Sep 2022 14:29:54 +0200 Subject: [PATCH 130/135] Updated NR-PRS documentation in doc/RUN_NR_PRS.md --- doc/RUN_NR_PRS.md | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/doc/RUN_NR_PRS.md b/doc/RUN_NR_PRS.md index af2c8d5d24..919796742e 100644 --- a/doc/RUN_NR_PRS.md +++ b/doc/RUN_NR_PRS.md @@ -49,9 +49,17 @@ prs_config = ( } ); ``` -Find the help string for PRS parameters in `openair2/COMMON/prs_nr_paramdef.h`

+To TURN OFF PRS, set `NumPRSResources=0` in gNB `prs_config` section. nrUE config has `Active_gNBs` to specify number of active gNBs transmitting PRS signal simultaneously. Find the help string for PRS parameters in `openair2/COMMON/prs_nr_paramdef.h`

# gNB in `phy-test` mode +Note that `numactl` is only needed if you run on a NUMA architecture with more than 1 CPU. In this case it should be installed on Linux using command `sudo apt-get install -y numactl` + +Also check the numa nodes USRP’s are connected to, using the following command: + +```cat /sys/class/net/eth_if/device/numa_node``` + +Where `eth_if` has to be replaced with the name of the network interface the USRP is connected to. +In our case the output is 0 and hence we use `numactl --cpunodebind=0 --membind=0` ## FR1 test Open a terminal on the host machine, and execute below command to launch gNB with **X310 USRPs** @@ -92,6 +100,8 @@ While running gNB and nrUE on the same host machine, `reconfig.raw` and `rbconfi After this, nrUE can be launched using one of the below commands depending on the test scenario. If UE is NOT able to connect to the gNB, then check the USRP connections or try increasing `--ue-rxgain` in steps of 10dB. +Also check the instructions on `numactl` in gNB test section as it applies for nrUE execution as well. + ## FR1 test Once gNB is up and running, open another terminal and execute below command to launch nrUE with **X310 USRPs**. Make sure to specify `IP_ADDR1` and `IP_ADDR2`(optional) correctly as per USRPs IP address @@ -128,21 +138,32 @@ After successful connection, UE starts estimating channel based on the downlink [PHY] [gNB 0][rsc 3][Rx 0][sfn 314][slot 32] DL PRS ToA ==> 1 / 1024 samples, peak channel power 15.6 dBm, SNR +4 dB ``` -At UE side, T tracer is used to dump PRS channel estimates, both in time and frequncy domain. These dumps can be enabled using options `--T_stdout 0` without console prints or `--T_stdout 2` with console prints; in above nrUE launch command.

+At UE side, T tracer is used to dump PRS channel estimates, both in time and frequency domain using `UE_PHY_DL_CHANNEL_ESTIMATE` and `UE_PHY_DL_CHANNEL_ESTIMATE_FREQ` respectively. These dumps can be enabled using options `--T_stdout 0` without console prints or `--T_stdout 2` with console prints; in above nrUE launch command.

# Recording T tracer dumps -Once nrUE is launched with `--T_stdout 0 or 2` option, on another terminal following command can be executed to start recording the T tracer dumps for PRS channel estimates +Once nrUE is launched with `--T_stdout 0 or 2` option, open another terminal. Navigate to T tracer directory ```common/utils/T/tracer/``` and build the T tracer binary using ```make``` -```./record -d ../T_messages.txt -on LEGACY_PHY_INFO -on UE_PHY_DL_CHANNEL_ESTIMATE -on UE_PHY_DL_CHANNEL_ESTIMATE_FREQ -o prs_dumps.raw``` +Once the build is successful, execute following command to start recording the PRS channel estimates dumps + +```./record -d ../T_messages.txt -on LEGACY_PHY_INFO -on UE_PHY_DL_CHANNEL_ESTIMATE -on UE_PHY_DL_CHANNEL_ESTIMATE_FREQ -o prs_dumps.raw``` Exit using `Ctrl+C` to stop recording, else it will keep running and take lot of disk space. Generally running it for 1-2 minutes should collect sufficient dumps.

+ +To check the contents of recorded .raw file, replay it by executing: + +```./replay -i prs_dumps.raw``` + +and textlog it on another terminal with following command: + +```./textlog -d ../T_messages.txt -ON -no-gui```

+ # Extracting PRS channel estimates -Once T tracer dumps are recorded, PRS channel estimates can be extracted from .raw file using bash script `extract_prs_dumps.sh`. In the end, the script will zip all the extracted dumps to `prs_dumps.tgz` +Once T tracer dumps are recorded, PRS channel estimates can be extracted from .raw file using bash script `extract_prs_dumps.sh` in T tracer directory ```common/utils/T/tracer/``` ```./extract_prs_dumps.sh -g -n -f -c ``` -Make sure to check help in running script using -h option: +In the end, the script will zip all the extracted dumps to `prs_dumps.tgz`. Make sure to check help in running script using -h option: ```./extract_prs_dumps.sh -h```

# Using Matlab/Octave script to visualize PRS channel estimates From ba1a59f97568b3600b6c28ad7781c2776561e9ac Mon Sep 17 00:00:00 2001 From: Sagar Parsawar Date: Tue, 13 Sep 2022 20:40:04 +0200 Subject: [PATCH 131/135] Bug fix to initialization of subdev selection string --- executables/nr-softmodem-common.h | 2 ++ executables/nr-uesoftmodem.h | 4 ++-- openair2/COMMON/prs_nr_paramdef.h | 34 +++++++++++++++---------------- 3 files changed, 21 insertions(+), 19 deletions(-) diff --git a/executables/nr-softmodem-common.h b/executables/nr-softmodem-common.h index e0114b8d14..ff5042bd95 100644 --- a/executables/nr-softmodem-common.h +++ b/executables/nr-softmodem-common.h @@ -99,6 +99,8 @@ #define CONFIG_HLP_DISABLNBIOT "disable nb-iot, even if defined in config\n" #define CONFIG_HLP_LDPC_OFFLOAD "enable LDPC offload\n" #define CONFIG_HLP_USRP_ARGS "set the arguments to identify USRP (same syntax as in UHD)\n" +#define CONFIG_HLP_TX_SUBDEV "set the arguments to select tx_subdev (same syntax as in UHD)\n" +#define CONFIG_HLP_RX_SUBDEV "set the arguments to select rx_subdev (same syntax as in UHD)\n" #define CONFIG_HLP_FLOG "Enable online log \n" #define CONFIG_HLP_LOGL "Set the global log level, valid options: (4:trace, 3:debug, 2:info, 1:warn, (0:error))\n" diff --git a/executables/nr-uesoftmodem.h b/executables/nr-uesoftmodem.h index 0e2ec5ffca..ea6787ebac 100644 --- a/executables/nr-uesoftmodem.h +++ b/executables/nr-uesoftmodem.h @@ -30,8 +30,8 @@ /*------------------------------------------------------------------------------------------------------------------------------------------*/ #define CMDLINE_NRUEPARAMS_DESC { \ {"usrp-args", CONFIG_HLP_USRP_ARGS, 0, strptr:(char **)&usrp_args, defstrval:"type=b200", TYPE_STRING, 0}, \ - {"tx_subdev", CONFIG_HLP_USRP_ARGS, 0, strptr:(char **)&tx_subdev, defstrval:"", TYPE_STRING, 0}, \ - {"rx_subdev", CONFIG_HLP_USRP_ARGS, 0, strptr:(char **)&rx_subdev, defstrval:"", TYPE_STRING, 0}, \ + {"tx_subdev", CONFIG_HLP_TX_SUBDEV, 0, strptr:(char **)&tx_subdev, defstrval:NULL, TYPE_STRING, 0}, \ + {"rx_subdev", CONFIG_HLP_RX_SUBDEV, 0, strptr:(char **)&rx_subdev, defstrval:NULL, TYPE_STRING, 0}, \ {"single-thread-disable", CONFIG_HLP_NOSNGLT, PARAMFLAG_BOOL, iptr:&single_thread_flag, defintval:1, TYPE_INT, 0}, \ {"dlsch-parallel", CONFIG_HLP_DLSCH_PARA, 0, u8ptr:NULL, defintval:0, TYPE_UINT8, 0}, \ {"offset-divisor", CONFIG_HLP_OFFSET_DIV, 0, uptr:&nrUE_params.ofdm_offset_divisor, defuintval:8, TYPE_UINT32, 0}, \ diff --git a/openair2/COMMON/prs_nr_paramdef.h b/openair2/COMMON/prs_nr_paramdef.h index d0f5b3b9bb..fe16b01fb2 100644 --- a/openair2/COMMON/prs_nr_paramdef.h +++ b/openair2/COMMON/prs_nr_paramdef.h @@ -42,7 +42,7 @@ /* Global parameters */ #define CONFIG_STRING_ACTIVE_GNBs "Active_gNBs" -#define HELP_STRING_ACTIVE_GNBs "Number of active gNBs simultaneously transmitting PRS signal to a UE" +#define HELP_STRING_ACTIVE_GNBs "Number of active gNBs simultaneously transmitting PRS signal to a UE\n" /*----------------------------------------------------------------------------------------------------------------------------------------------------*/ /* PRS configuration parameters */ /* optname helpstr paramflags XXXptr defXXXval type numelt */ @@ -73,22 +73,22 @@ #define CONFIG_STRING_PRS_MUTING_BIT_REPETITION "MutingBitRepetition" /* Help string for PRS parameters */ -#define HELP_STRING_GNB_ID "gNB index for UE (<= CombSize)" -#define HELP_STRING_NUM_PRS_RESOURCES "Number of PRS resources in a PRS resource set" -#define HELP_STRING_PRS_RESOURCE_SET_PERIOD_LIST "[slot period, slot offset] of a PRS resource set" -#define HELP_STRING_PRS_SYMBOL_START_LIST "Starting OFDM symbol of each PRS resource in a PRS resource set" -#define HELP_STRING_PRS_NUM_SYMBOLS_LIST "Number of OFDM symbols in a slot for each PRS resource in a PRS resource set" -#define HELP_STRING_PRS_NUM_RB "Number of PRBs allocated to all PRS resources in a PRS resource set (<= 272 and multiples of 4)" -#define HELP_STRING_PRS_RB_OFFSET "Starting PRB index of all PRS resources in a PRS resource set" -#define HELP_STRING_PRS_COMB_SIZE "RE density of all PRS resources in a PRS resource set (2, 4, 6, 12)" -#define HELP_STRING_PRS_RE_OFFSET_LIST "Starting RE offset in the first OFDM symbol of each PRS resource in a PRS resource set" -#define HELP_STRING_PRS_RESOURCE_OFFSET_LIST "Slot offset of each PRS resource defined relative to the slot offset of the PRS resource set (0...511)" -#define HELP_STRING_PRS_RESOURCE_REPETITION "Repetition factor for all PRS resources in resource set (1 /*default*/, 2, 4, 6, 8, 16, 32)" -#define HELP_STRING_PRS_RESOURCE_TIME_GAP "Slot offset between two consecutive repetition indices of all PRS resources in a PRS resource set (1 /*default*/, 2, 4, 6, 8, 16, 32)" -#define HELP_STRING_PRS_ID_LIST "Sequence identity of each PRS resource in a PRS resource set, specified in the range [0, 4095]" -#define HELP_STRING_PRS_MUTING_PATTERN1_LIST "Muting bit pattern option-1, specified as [] or a binary-valued vector of length 2, 4, 6, 8, 16, or 32" -#define HELP_STRING_PRS_MUTING_PATTERN2_LIST "Muting bit pattern option-2, specified as [] or a binary-valued vector of length 2, 4, 6, 8, 16, or 32" -#define HELP_STRING_PRS_MUTING_BIT_REPETITION "Muting bit repetition factor, specified as 1, 2, 4, or 8" +#define HELP_STRING_GNB_ID "gNB index for UE (<= CombSize)\n" +#define HELP_STRING_NUM_PRS_RESOURCES "Number of PRS resources in a PRS resource set\n" +#define HELP_STRING_PRS_RESOURCE_SET_PERIOD_LIST "[slot period, slot offset] of a PRS resource set\n" +#define HELP_STRING_PRS_SYMBOL_START_LIST "Starting OFDM symbol of each PRS resource in a PRS resource set\n" +#define HELP_STRING_PRS_NUM_SYMBOLS_LIST "Number of OFDM symbols in a slot for each PRS resource in a PRS resource set\n" +#define HELP_STRING_PRS_NUM_RB "Number of PRBs allocated to all PRS resources in a PRS resource set (<= 272 and multiples of 4)\n" +#define HELP_STRING_PRS_RB_OFFSET "Starting PRB index of all PRS resources in a PRS resource set\n" +#define HELP_STRING_PRS_COMB_SIZE "RE density of all PRS resources in a PRS resource set (2, 4, 6, 12)\n" +#define HELP_STRING_PRS_RE_OFFSET_LIST "Starting RE offset in the first OFDM symbol of each PRS resource in a PRS resource set\n" +#define HELP_STRING_PRS_RESOURCE_OFFSET_LIST "Slot offset of each PRS resource defined relative to the slot offset of the PRS resource set (0...511)\n" +#define HELP_STRING_PRS_RESOURCE_REPETITION "Repetition factor for all PRS resources in resource set (1 /*default*/, 2, 4, 6, 8, 16, 32)\n" +#define HELP_STRING_PRS_RESOURCE_TIME_GAP "Slot offset between two consecutive repetition indices of all PRS resources in a PRS resource set (1 /*default*/, 2, 4, 6, 8, 16, 32)\n" +#define HELP_STRING_PRS_ID_LIST "Sequence identity of each PRS resource in a PRS resource set, specified in the range [0, 4095]\n" +#define HELP_STRING_PRS_MUTING_PATTERN1_LIST "Muting bit pattern option-1, specified as [] or a binary-valued vector of length 2, 4, 6, 8, 16, or 32\n" +#define HELP_STRING_PRS_MUTING_PATTERN2_LIST "Muting bit pattern option-2, specified as [] or a binary-valued vector of length 2, 4, 6, 8, 16, or 32\n" +#define HELP_STRING_PRS_MUTING_BIT_REPETITION "Muting bit repetition factor, specified as 1, 2, 4, or 8\n" /*----------------------------------------------------------------------------------------------------------------------------------------------------------------*/ From 01dc85f74299a99cdbefb3fca535fc097583d9b5 Mon Sep 17 00:00:00 2001 From: laurent Date: Thu, 22 Sep 2022 18:53:14 +0200 Subject: [PATCH 132/135] fix review comments --- executables/nr-uesoftmodem.h | 6 +-- openair1/PHY/INIT/nr_init.c | 17 -------- openair1/PHY/INIT/nr_init_ue.c | 18 --------- openair1/PHY/LTE_ESTIMATION/lte_sync_time.c | 10 ++--- openair1/PHY/NR_REFSIG/nr_gold.c | 18 +++++++++ .../nr_dl_channel_estimation.c | 39 +++++++++---------- openair1/PHY/NR_UE_TRANSPORT/pss_nr.c | 2 +- openair1/PHY/defs_common.h | 22 ----------- openair1/PHY/defs_nr_UE.h | 3 -- openair1/SCHED_NR_UE/phy_procedures_nr_ue.c | 3 +- openair2/GNB_APP/gnb_config.c | 19 +++++---- openair2/GNB_APP/gnb_paramdef.h | 2 + targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp | 21 ++++------ 13 files changed, 64 insertions(+), 116 deletions(-) diff --git a/executables/nr-uesoftmodem.h b/executables/nr-uesoftmodem.h index ea6787ebac..5c8dafc9af 100644 --- a/executables/nr-uesoftmodem.h +++ b/executables/nr-uesoftmodem.h @@ -29,9 +29,9 @@ /* optname helpstr paramflags XXXptr defXXXval type numelt */ /*------------------------------------------------------------------------------------------------------------------------------------------*/ #define CMDLINE_NRUEPARAMS_DESC { \ - {"usrp-args", CONFIG_HLP_USRP_ARGS, 0, strptr:(char **)&usrp_args, defstrval:"type=b200", TYPE_STRING, 0}, \ - {"tx_subdev", CONFIG_HLP_TX_SUBDEV, 0, strptr:(char **)&tx_subdev, defstrval:NULL, TYPE_STRING, 0}, \ - {"rx_subdev", CONFIG_HLP_RX_SUBDEV, 0, strptr:(char **)&rx_subdev, defstrval:NULL, TYPE_STRING, 0}, \ + {"usrp-args", CONFIG_HLP_USRP_ARGS, 0, strptr:&usrp_args, defstrval:"type=b200", TYPE_STRING, 0}, \ + {"tx_subdev", CONFIG_HLP_TX_SUBDEV, 0, strptr:&tx_subdev, defstrval:NULL, TYPE_STRING, 0}, \ + {"rx_subdev", CONFIG_HLP_RX_SUBDEV, 0, strptr:&rx_subdev, defstrval:NULL, TYPE_STRING, 0}, \ {"single-thread-disable", CONFIG_HLP_NOSNGLT, PARAMFLAG_BOOL, iptr:&single_thread_flag, defintval:1, TYPE_INT, 0}, \ {"dlsch-parallel", CONFIG_HLP_DLSCH_PARA, 0, u8ptr:NULL, defintval:0, TYPE_UINT8, 0}, \ {"offset-divisor", CONFIG_HLP_OFFSET_DIV, 0, uptr:&nrUE_params.ofdm_offset_divisor, defuintval:8, TYPE_UINT32, 0}, \ diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c index bff234bfbb..dd06bc4704 100644 --- a/openair1/PHY/INIT/nr_init.c +++ b/openair1/PHY/INIT/nr_init.c @@ -616,23 +616,6 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB, nr_init_csi_rs(&gNB->frame_parms, gNB->nr_csi_info->nr_gold_csi_rs, cfg->cell_config.phy_cell_id.value); //PRS init - gNB->nr_gold_prs = (uint32_t ****)malloc16(gNB->prs_vars.NumPRSResources*sizeof(uint32_t ***)); - uint32_t ****prs = gNB->nr_gold_prs; - AssertFatal(prs!=NULL, "NR init: positioning reference signal malloc failed\n"); - for (int rsc=0; rsc < gNB->prs_vars.NumPRSResources; rsc++) { - prs[rsc] = (uint32_t ***)malloc16(fp->slots_per_frame*sizeof(uint32_t **)); - AssertFatal(prs[rsc]!=NULL, "NR init: positioning reference signal for rsc %d - malloc failed\n", rsc); - - for (int slot=0; slotslots_per_frame; slot++) { - prs[rsc][slot] = (uint32_t **)malloc16(fp->symbols_per_slot*sizeof(uint32_t *)); - AssertFatal(prs[rsc][slot]!=NULL, "NR init: positioning reference signal for slot %d - malloc failed\n", slot); - - for (int symb=0; symbsymbols_per_slot; symb++) { - prs[rsc][slot][symb] = (uint32_t *)malloc16(NR_MAX_PRS_INIT_LENGTH_DWORD*sizeof(uint32_t)); - AssertFatal(prs[rsc][slot][symb]!=NULL, "NR init: positioning reference signal for rsc %d slot %d symbol %d - malloc failed\n", rsc, slot, symb); - } - } - } nr_init_prs(gNB); for (int id=0; idch_tmp = (int16_t *)malloc16_clear(fp->ofdm_symbol_size*sizeof(int32_t)); - AssertFatal((prs_vars[idx]->ch_tmp!=NULL), "%s: PRS ch_tmp buffer malloc failed for gNB_id %d\n", __FUNCTION__,idx); - prs_vars[idx]->chF_interpol = (int32_t **)malloc16_clear(fp->nb_antennas_rx*sizeof(int32_t *)); - prs_vars[idx]->chT_interpol = (int32_t **)malloc16_clear(fp->nb_antennas_rx*sizeof(int32_t *)); - AssertFatal((prs_vars[idx]->chF_interpol!=NULL || prs_vars[idx]->chT_interpol!=NULL), "%s: PRS chF_interpol or chT_interpol buffer malloc failed for gNB_id %d\n", __FUNCTION__,idx); - for (int j=0; jnb_antennas_rx; j++) { - prs_vars[idx]->chF_interpol[j] = (int32_t *)malloc16_clear(NR_PRS_IDFT_OVERSAMP_FACTOR*fp->ofdm_symbol_size*sizeof(int32_t)); - prs_vars[idx]->chT_interpol[j] = (int32_t *)malloc16_clear(NR_PRS_IDFT_OVERSAMP_FACTOR*fp->ofdm_symbol_size*sizeof(int32_t)); - AssertFatal((prs_vars[idx]->chF_interpol[j]!=NULL || prs_vars[idx]->chT_interpol[j]!=NULL), "%s: PRS chF_interpol or chT_interpol buffer malloc failed for gNB_id %d, rx_ant %d\n", __FUNCTION__, idx, j); - } for(int k = 0; k < NR_MAX_PRS_RESOURCES_PER_SET; k++) { @@ -688,14 +678,6 @@ void term_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB) free_and_zero(ue->prs_vars[idx]->prs_resource[k].prs_meas); } - for (int j=0; jnb_antennas_rx; j++) - { - free_and_zero(ue->prs_vars[idx]->chF_interpol[j]); - free_and_zero(ue->prs_vars[idx]->chT_interpol[j]); - } - free_and_zero(ue->prs_vars[idx]->chF_interpol); - free_and_zero(ue->prs_vars[idx]->chT_interpol); - free_and_zero(ue->prs_vars[idx]->ch_tmp); free_and_zero(ue->prs_vars[idx]); } free_and_zero(ue->sinr_CQI_dB); diff --git a/openair1/PHY/LTE_ESTIMATION/lte_sync_time.c b/openair1/PHY/LTE_ESTIMATION/lte_sync_time.c index ce8188a3e7..80238a58ff 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_sync_time.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_sync_time.c @@ -188,16 +188,12 @@ int lte_sync_time(int **rxdata, ///rx data in time domain // calculate the absolute value of sync_corr[n] for (s=0; s<3; s++) { - double tmp = absF(sync_out[s]) + absF(sync_out2[s]); + double tmp = squaredMod(sync_out[s]) + squaredMod(sync_out2[s]); if (tmp>peak_val) { peak_val = tmp; peak_pos = n; sync_source = s; - /* - printf("s %d: n %d sync_out %d, sync_out2 %d (sync_corr %d,%d), (%d,%d) (%d,%d)\n",s,n,abs32(sync_out[s]),abs32(sync_out2[s]),sync_corr_ue0[n], - sync_corr_ue0[n+length],((int16_t*)&sync_out[s])[0],((int16_t*)&sync_out[s])[1],((int16_t*)&sync_out2[s])[0],((int16_t*)&sync_out2[s])[1]); - */ } } } @@ -329,7 +325,7 @@ int lte_sync_time_eNB(int32_t **rxdata, ///rx data in time domain result = dot_product((short *)primary_synch_time, (short *) &(rxdata[ar][n]), frame_parms->ofdm_symbol_size, SHIFT); //((short*)sync_corr)[2*n] += ((short*) &result)[0]; //((short*)sync_corr)[2*n+1] += ((short*) &result)[1]; - sync_corr_eNB[n] += abs32(result); + sync_corr_eNB[n] += squaredMod(*(c16_t*)&result); } } @@ -412,7 +408,7 @@ int ru_sync_time(RU_t *ru, shift); } - dmrs_corr += abs64(result); + dmrs_corr += squaredMod(*(c32_t*)&result); } if (ru->dmrs_corr != NULL) diff --git a/openair1/PHY/NR_REFSIG/nr_gold.c b/openair1/PHY/NR_REFSIG/nr_gold.c index c35bf2701c..134b44fc41 100644 --- a/openair1/PHY/NR_REFSIG/nr_gold.c +++ b/openair1/PHY/NR_REFSIG/nr_gold.c @@ -131,6 +131,24 @@ void nr_init_prs(PHY_VARS_gNB* gNB) uint16_t Nid; NR_DL_FRAME_PARMS *fp = &gNB->frame_parms; + gNB->nr_gold_prs = (uint32_t ****)malloc16(gNB->prs_vars.NumPRSResources*sizeof(uint32_t ***)); + uint32_t ****prs = gNB->nr_gold_prs; + AssertFatal(prs!=NULL, "NR init: positioning reference signal malloc failed\n"); + for (int rsc=0; rsc < gNB->prs_vars.NumPRSResources; rsc++) { + prs[rsc] = (uint32_t ***)malloc16(fp->slots_per_frame*sizeof(uint32_t **)); + AssertFatal(prs[rsc]!=NULL, "NR init: positioning reference signal for rsc %d - malloc failed\n", rsc); + + for (int slot=0; slotslots_per_frame; slot++) { + prs[rsc][slot] = (uint32_t **)malloc16(fp->symbols_per_slot*sizeof(uint32_t *)); + AssertFatal(prs[rsc][slot]!=NULL, "NR init: positioning reference signal for slot %d - malloc failed\n", slot); + + for (int symb=0; symbsymbols_per_slot; symb++) { + prs[rsc][slot][symb] = (uint32_t *)malloc16(NR_MAX_PRS_INIT_LENGTH_DWORD*sizeof(uint32_t)); + AssertFatal(prs[rsc][slot][symb]!=NULL, "NR init: positioning reference signal for rsc %d slot %d symbol %d - malloc failed\n", rsc, slot, symb); + } + } + } + uint8_t reset; uint8_t slotNum, symNum, rsc_id; 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 92b4d6a9a9..68c29ce3d0 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -51,14 +51,13 @@ int nr_prs_channel_estimation(uint8_t gNB_id, int32_t **rxdataF = ue->common_vars.common_vars_rx_data_per_thread[proc->thread_id].rxdataF; prs_config_t *prs_cfg = &ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_cfg; prs_meas_t **prs_meas = ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_meas; - int16_t *ch_tmp = ue->prs_vars[gNB_id]->ch_tmp; - int32_t **chF_interpol = ue->prs_vars[gNB_id]->chF_interpol; - int32_t **chT_interpol = ue->prs_vars[gNB_id]->chT_interpol; - memset(ch_tmp,0,ue->frame_parms.ofdm_symbol_size*sizeof(int32_t)); - for (rxAnt=0; rxAnt < frame_params->nb_antennas_rx; rxAnt++) { - memset(chF_interpol[rxAnt],0,NR_PRS_IDFT_OVERSAMP_FACTOR*ue->frame_parms.ofdm_symbol_size*sizeof(int32_t)); - memset(chT_interpol[rxAnt],0,NR_PRS_IDFT_OVERSAMP_FACTOR*ue->frame_parms.ofdm_symbol_size*sizeof(int32_t)); - } + c16_t ch_tmp_buf[ ue->frame_parms.ofdm_symbol_size]; + int32_t chF_interpol[frame_params->nb_antennas_rx][NR_PRS_IDFT_OVERSAMP_FACTOR*ue->frame_parms.ofdm_symbol_size]; + int32_t chT_interpol[frame_params->nb_antennas_rx][NR_PRS_IDFT_OVERSAMP_FACTOR*ue->frame_parms.ofdm_symbol_size]; + memset(ch_tmp_buf,0,sizeof(ch_tmp_buf)); + memset(chF_interpol,0,sizeof(chF_interpol)); + memset(chT_interpol,0,sizeof(chF_interpol)); + int slot_prs = (proc->nr_slot_rx - rep_num*prs_cfg->PRSResourceTimeGap + frame_params->slots_per_frame)%frame_params->slots_per_frame; uint32_t **nr_gold_prs = ue->nr_gold_prs[gNB_id][rsc_id][slot_prs]; @@ -69,7 +68,7 @@ int nr_prs_channel_estimation(uint8_t gNB_id, #ifdef DEBUG_PRS_CHEST char filename[64] = {0}, varname[64] = {0}; #endif - int16_t *ch_init = ch_tmp; + int16_t *ch_tmp = (int16_t *)ch_tmp_buf; int16_t scale_factor = (1.0f/(float)(prs_cfg->NumPRSSymbols))*(1<<15); int16_t num_pilots = (12/prs_cfg->CombSize)*prs_cfg->NumRB; int16_t start_offset = (NR_PRS_IDFT_OVERSAMP_FACTOR-1)*frame_params->ofdm_symbol_size>>1; @@ -152,7 +151,7 @@ int nr_prs_channel_estimation(uint8_t gNB_id, //SNR estimation noiseFig[0] = rxF[0] - (int16_t)(((int32_t)ch[0]*pil[0] - (int32_t)ch[1]*pil[1])>>15); noiseFig[1] = rxF[1] - (int16_t)(((int32_t)ch[1]*pil[0] + (int32_t)ch[0]*pil[1])>>15); - snr += 10*log10(abs32(*((int32_t*)rxF)) - abs32(*((int32_t*)noiseFig))) - 10*log10(abs32(*((int32_t*)noiseFig))); + snr += 10*log10(squaredMod(*(c16_t*)rxF) - squaredMod(*(c16_t*)noiseFig)) - 10*log10(squaredMod(*(c16_t*)noiseFig)); #ifdef DEBUG_PRS_PRINTS printf("[Rx %d] pilot %3d, SNR %+2d dB: rxF - > (%+3d, %+3d) addr %p ch -> (%+3d, %+3d), pil -> (%+d, %+d) \n", rxAnt, 0, snr, rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); #endif @@ -183,7 +182,7 @@ int nr_prs_channel_estimation(uint8_t gNB_id, //SNR estimation noiseFig[0] = rxF[0] - (int16_t)(((int32_t)ch[0]*pil[0] - (int32_t)ch[1]*pil[1])>>15); noiseFig[1] = rxF[1] - (int16_t)(((int32_t)ch[1]*pil[0] + (int32_t)ch[0]*pil[1])>>15); - snr += 10*log10(abs32(*((int32_t*)rxF)) - abs32(*((int32_t*)noiseFig))) - 10*log10(abs32(*((int32_t*)noiseFig))); + snr += 10*log10(squaredMod(*(c16_t*)rxF) - squaredMod(*(c16_t*)noiseFig)) - 10*log10(squaredMod(*(c16_t*)noiseFig)); #ifdef DEBUG_PRS_PRINTS printf("[Rx %d] pilot %3d, SNR %+2d dB: rxF - > (%+3d, %+3d) addr %p ch -> (%+3d, %+3d), pil -> (%+d, %+d) \n", rxAnt, pIdx, snr/(pIdx+1), rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); #endif @@ -211,7 +210,7 @@ int nr_prs_channel_estimation(uint8_t gNB_id, //SNR estimation noiseFig[0] = rxF[0] - (int16_t)(((int32_t)ch[0]*pil[0] - (int32_t)ch[1]*pil[1])>>15); noiseFig[1] = rxF[1] - (int16_t)(((int32_t)ch[1]*pil[0] + (int32_t)ch[0]*pil[1])>>15); - snr += 10*log10(abs32(*((int32_t*)rxF)) - abs32(*((int32_t*)noiseFig))) - 10*log10(abs32(*((int32_t*)noiseFig))); + snr += 10*log10(squaredMod(*((c16_t*)rxF)) - squaredMod(*((c16_t*)noiseFig))) - 10*log10(squaredMod(*((c16_t*)noiseFig))); #ifdef DEBUG_PRS_PRINTS printf("[Rx %d] pilot %3d, SNR %+2d dB: rxF - > (%+3d, %+3d) addr %p ch -> (%+3d, %+3d), pil -> (%+d, %+d) \n", rxAnt, pIdx+1, snr/(pIdx+2), rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); #endif @@ -232,7 +231,7 @@ int nr_prs_channel_estimation(uint8_t gNB_id, //SNR estimation noiseFig[0] = rxF[0] - (int16_t)(((int32_t)ch[0]*pil[0] - (int32_t)ch[1]*pil[1])>>15); noiseFig[1] = rxF[1] - (int16_t)(((int32_t)ch[1]*pil[0] + (int32_t)ch[0]*pil[1])>>15); - snr += 10*log10(abs32(*((int32_t*)rxF)) - abs32(*((int32_t*)noiseFig))) - 10*log10(abs32(*((int32_t*)noiseFig))); + snr += 10*log10(squaredMod(*((c16_t*)rxF)) - squaredMod(*((c16_t*)noiseFig))) - 10*log10(squaredMod(*((c16_t*)noiseFig))); #ifdef DEBUG_PRS_PRINTS printf("[Rx %d] pilot %3d, SNR %+2d dB: rxF - > (%+3d, %+3d) addr %p ch -> (%+3d, %+3d), pil -> (%+d, %+d) \n", rxAnt, num_pilots-1, snr/num_pilots, rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); #endif @@ -297,7 +296,7 @@ int nr_prs_channel_estimation(uint8_t gNB_id, //SNR estimation noiseFig[0] = rxF[0] - (int16_t)(((int32_t)ch[0]*pil[0] - (int32_t)ch[1]*pil[1])>>15); noiseFig[1] = rxF[1] - (int16_t)(((int32_t)ch[1]*pil[0] + (int32_t)ch[0]*pil[1])>>15); - snr += 10*log10(abs32(*((int32_t*)rxF)) - abs32(*((int32_t*)noiseFig))) - 10*log10(abs32(*((int32_t*)noiseFig))); + snr += 10*log10(squaredMod(*((c16_t*)rxF)) - squaredMod(*((c16_t*)noiseFig))) - 10*log10(squaredMod(*((c16_t*)noiseFig))); #ifdef DEBUG_PRS_PRINTS printf("[Rx %d] pilot %3d, SNR %+2d dB: rxF - > (%+3d, %+3d) addr %p ch -> (%+3d, %+3d), pil -> (%+d, %+d) \n", rxAnt, 0, snr, rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); #endif @@ -315,7 +314,7 @@ int nr_prs_channel_estimation(uint8_t gNB_id, //SNR estimation noiseFig[0] = rxF[0] - (int16_t)(((int32_t)ch[0]*pil[0] - (int32_t)ch[1]*pil[1])>>15); noiseFig[1] = rxF[1] - (int16_t)(((int32_t)ch[1]*pil[0] + (int32_t)ch[0]*pil[1])>>15); - snr += 10*log10(abs32(*((int32_t*)rxF)) - abs32(*((int32_t*)noiseFig))) - 10*log10(abs32(*((int32_t*)noiseFig))); + snr += 10*log10(squaredMod(*((c16_t*)rxF)) - squaredMod(*((c16_t*)noiseFig))) - 10*log10(squaredMod(*((c16_t*)noiseFig))); #ifdef DEBUG_PRS_PRINTS printf("[Rx %d] pilot %3d, SNR %+2d dB: rxF - > (%+3d, %+3d) addr %p ch -> (%+3d, %+3d), pil -> (%+d, %+d) \n", rxAnt, 1, snr/2, rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); #endif @@ -337,7 +336,7 @@ int nr_prs_channel_estimation(uint8_t gNB_id, //SNR estimation noiseFig[0] = rxF[0] - (int16_t)(((int32_t)ch[0]*pil[0] - (int32_t)ch[1]*pil[1])>>15); noiseFig[1] = rxF[1] - (int16_t)(((int32_t)ch[1]*pil[0] + (int32_t)ch[0]*pil[1])>>15); - snr += 10*log10(abs32(*((int32_t*)rxF)) - abs32(*((int32_t*)noiseFig))) - 10*log10(abs32(*((int32_t*)noiseFig))); + snr += 10*log10(squaredMod(*((c16_t*)rxF)) - squaredMod(*((c16_t*)noiseFig))) - 10*log10(squaredMod(*((c16_t*)noiseFig))); #ifdef DEBUG_PRS_PRINTS printf("[Rx %d] pilot %3d, SNR %+2d dB: rxF - > (%+3d, %+3d) addr %p ch -> (%+3d, %+3d), pil -> (%+d, %+d) \n", rxAnt, pIdx, snr/(pIdx+1), rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); #endif @@ -358,7 +357,7 @@ int nr_prs_channel_estimation(uint8_t gNB_id, //SNR estimation noiseFig[0] = rxF[0] - (int16_t)(((int32_t)ch[0]*pil[0] - (int32_t)ch[1]*pil[1])>>15); noiseFig[1] = rxF[1] - (int16_t)(((int32_t)ch[1]*pil[0] + (int32_t)ch[0]*pil[1])>>15); - snr += 10*log10(abs32(*((int32_t*)rxF)) - abs32(*((int32_t*)noiseFig))) - 10*log10(abs32(*((int32_t*)noiseFig))); + snr += 10*log10(squaredMod(*((c16_t*)rxF)) - squaredMod(*((c16_t*)noiseFig))) - 10*log10(squaredMod(*((c16_t*)noiseFig))); #ifdef DEBUG_PRS_PRINTS printf("[Rx %d] pilot %3d, SNR %+2d dB: rxF - > (%+3d, %+3d) addr %p ch -> (%+3d, %+3d), pil -> (%+d, %+d) \n", rxAnt, num_pilots-2, snr/(num_pilots-1), rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); #endif @@ -376,7 +375,7 @@ int nr_prs_channel_estimation(uint8_t gNB_id, //SNR estimation noiseFig[0] = rxF[0] - (int16_t)(((int32_t)ch[0]*pil[0] - (int32_t)ch[1]*pil[1])>>15); noiseFig[1] = rxF[1] - (int16_t)(((int32_t)ch[1]*pil[0] + (int32_t)ch[0]*pil[1])>>15); - snr += 10*log10(abs32(*((int32_t*)rxF)) - abs32(*((int32_t*)noiseFig))) - 10*log10(abs32(*((int32_t*)noiseFig))); + snr += 10*log10(squaredMod(*((c16_t*)rxF)) - squaredMod(*((c16_t*)noiseFig))) - 10*log10(squaredMod(*((c16_t*)noiseFig))); #ifdef DEBUG_PRS_PRINTS printf("[Rx %d] pilot %3d, SNR %+2d dB: rxF - > (%+3d, %+3d) addr %p ch -> (%+3d, %+3d), pil -> (%+d, +%d) \n", rxAnt, num_pilots-1, snr/num_pilots, rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); #endif @@ -390,7 +389,7 @@ int nr_prs_channel_estimation(uint8_t gNB_id, } //reset channel pointer - ch_tmp = ch_init; + ch_tmp = (int16_t*)ch_tmp_buf; } // for rxAnt } //for l @@ -554,7 +553,7 @@ void peak_estimator(int32_t *buffer, int32_t buf_len, int32_t *peak_idx, int32_t int32_t max_val = 0, max_idx = 0, abs_val = 0; for(int k = 0; k < buf_len; k++) { - abs_val = abs32(buffer[k]); + abs_val = squaredMod(((c16_t*)buffer)[k]); if(abs_val > max_val) { max_val = abs_val; diff --git a/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c b/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c index 1236dfbc51..e736718237 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c +++ b/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c @@ -708,7 +708,7 @@ int pss_search_time_nr(int **rxdata, ///rx data in time domain (short*)&(rxdata[ar][n+is*frame_parms->samples_per_frame]), frame_parms->ofdm_symbol_size, shift); - pss_corr_ue += abs64(result); + pss_corr_ue += squaredMod(*(c32_t*)&result); //((short*)pss_corr_ue[pss_index])[2*n] += ((short*) &result)[0]; /* real part */ //((short*)pss_corr_ue[pss_index])[2*n+1] += ((short*) &result)[1]; /* imaginary part */ //((short*)&synchro_out)[0] += ((int*) &result)[0]; /* real part */ diff --git a/openair1/PHY/defs_common.h b/openair1/PHY/defs_common.h index b9ecbb700d..892fb7c864 100644 --- a/openair1/PHY/defs_common.h +++ b/openair1/PHY/defs_common.h @@ -1113,26 +1113,4 @@ static inline int release_thread(pthread_mutex_t *mutex, return(0); } -static inline int32_t abs32(int32_t x) -{ - return (((int32_t)((int16_t*)&x)[0])*((int32_t)((int16_t*)&x)[0]) + ((int32_t)((int16_t*)&x)[1])*((int32_t)((int16_t*)&x)[1])); -} - -static inline int64_t abs64(int64_t x) -{ - return (((int64_t)((int32_t*)&x)[0])*((int64_t)((int32_t*)&x)[0]) + ((int64_t)((int32_t*)&x)[1])*((int64_t)((int32_t*)&x)[1])); -} - -static inline double absF(struct complexd x) { - return x.r*x.r+x.i*x.i; -} - -static inline double angle64(int64_t x) -{ - - double re=((int32_t*)&x)[0]; - double im=((int32_t*)&x)[1]; - return (atan2(im,re)); -} - #endif // __PHY_DEFS_COMMON_H__ diff --git a/openair1/PHY/defs_nr_UE.h b/openair1/PHY/defs_nr_UE.h index fbadfcb151..58c5e015e7 100644 --- a/openair1/PHY/defs_nr_UE.h +++ b/openair1/PHY/defs_nr_UE.h @@ -356,9 +356,6 @@ typedef struct { typedef struct { uint8_t NumPRSResources; NR_PRS_RESOURCE_t prs_resource[NR_MAX_PRS_RESOURCES_PER_SET]; - int16_t *ch_tmp; - int32_t **chF_interpol; - int32_t **chT_interpol; } NR_UE_PRS; #define NR_PDCCH_DEFS_NR_UE diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c index fc3e5191c2..05278b781a 100644 --- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c +++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c @@ -1331,7 +1331,6 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue, int frame_rx = proc->frame_rx; int nr_slot_rx = proc->nr_slot_rx; fapi_nr_config_request_t *cfg = &ue->nrUE_config; - prs_config_t *prs_config = NULL; NR_DL_FRAME_PARMS *fp = &ue->frame_parms; VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_IN); @@ -1415,7 +1414,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue, { for(int rsc_id = 0; rsc_id < ue->prs_vars[gNB_id]->NumPRSResources; rsc_id++) { - prs_config = &ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_cfg; + prs_config_t *prs_config = &ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_cfg; for (int i = 0; i < prs_config->PRSResourceRepetition; i++) { if( (((frame_rx*fp->slots_per_frame + nr_slot_rx) - (prs_config->PRSResourceSetPeriod[1] + prs_config->PRSResourceOffset) + prs_config->PRSResourceSetPeriod[0])%prs_config->PRSResourceSetPeriod[0]) == i*prs_config->PRSResourceTimeGap) diff --git a/openair2/GNB_APP/gnb_config.c b/openair2/GNB_APP/gnb_config.c index 5b73995d28..978331a312 100644 --- a/openair2/GNB_APP/gnb_config.c +++ b/openair2/GNB_APP/gnb_config.c @@ -675,7 +675,7 @@ void RCconfig_nr_prs(void) { uint16_t j = 0, k = 0; prs_config_t *prs_config = NULL; - char str[7][100] = {'\0'}; int16_t n[7] = {0}; + char str[7][100] = {0}; paramdef_t PRS_Params[] = PRS_PARAMS_DESC; paramlist_def_t PRS_ParamList = {CONFIG_STRING_PRS_CONFIG,NULL,0}; @@ -697,7 +697,6 @@ void RCconfig_nr_prs(void) RC.gNB[j]->Mod_id = j; } - memset(n,0,sizeof(n)); RC.gNB[j]->prs_vars.NumPRSResources = *(PRS_ParamList.paramarray[j][NUM_PRS_RESOURCES].uptr); for (k = 0; k < RC.gNB[j]->prs_vars.NumPRSResources; k++) { @@ -720,22 +719,22 @@ void RCconfig_nr_prs(void) for (int l = 0; l < PRS_ParamList.paramarray[j][PRS_MUTING_PATTERN1_LIST].numelt; l++) { prs_config->MutingPattern1[l] = PRS_ParamList.paramarray[j][PRS_MUTING_PATTERN1_LIST].uptr[l]; - if (k == 0) // print only for 0th resource - n[5] += snprintf(str[5]+n[5],sizeof(str[5]),"%d, ",prs_config->MutingPattern1[l]); + if (k == 0) // print only for 0th resource + snprintf(str[5]+strlen(str[5]),sizeof(str[5])-strlen(str[5]),"%d, ",prs_config->MutingPattern1[l]); } for (int l = 0; l < PRS_ParamList.paramarray[j][PRS_MUTING_PATTERN2_LIST].numelt; l++) { prs_config->MutingPattern2[l] = PRS_ParamList.paramarray[j][PRS_MUTING_PATTERN2_LIST].uptr[l]; if (k == 0) // print only for 0th resource - n[6] += snprintf(str[6]+n[6],sizeof(str[6]),"%d, ",prs_config->MutingPattern2[l]); + snprintf(str[6]+strlen(str[6]),sizeof(str[6])-strlen(str[6]),"%d, ",prs_config->MutingPattern2[l]); } // print to buffer - n[0] += snprintf(str[0]+n[0],sizeof(str[0]),"%d, ",prs_config->SymbolStart); - n[1] += snprintf(str[1]+n[1],sizeof(str[1]),"%d, ",prs_config->NumPRSSymbols); - n[2] += snprintf(str[2]+n[2],sizeof(str[2]),"%d, ",prs_config->REOffset); - n[3] += snprintf(str[3]+n[3],sizeof(str[3]),"%d, ",prs_config->PRSResourceOffset); - n[4] += snprintf(str[4]+n[4],sizeof(str[4]),"%d, ",prs_config->NPRSID); + snprintf(str[0]+strlen(str[0]),sizeof(str[0])-strlen(str[0]),"%d, ",prs_config->SymbolStart); + snprintf(str[1]+strlen(str[1]),sizeof(str[1])-strlen(str[1]),"%d, ",prs_config->NumPRSSymbols); + snprintf(str[2]+strlen(str[2]),sizeof(str[2])-strlen(str[2]),"%d, ",prs_config->REOffset); + snprintf(str[3]+strlen(str[3]),sizeof(str[3])-strlen(str[3]),"%d, ",prs_config->PRSResourceOffset); + snprintf(str[4]+strlen(str[4]),sizeof(str[4])-strlen(str[4]),"%d, ",prs_config->NPRSID); } // for k prs_config = &RC.gNB[j]->prs_vars.prs_cfg[0]; diff --git a/openair2/GNB_APP/gnb_paramdef.h b/openair2/GNB_APP/gnb_paramdef.h index 0b94bc4bb5..9572d16d8f 100644 --- a/openair2/GNB_APP/gnb_paramdef.h +++ b/openair2/GNB_APP/gnb_paramdef.h @@ -369,6 +369,8 @@ typedef enum { #define CONFIG_STRING_L1_LIST "L1s" #define CONFIG_STRING_L1_CONFIG "l1_config" + + /*----------------------------------------------------------------------------------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------------------------------------------------------------------------------*/ diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp index 975ff2b4d4..0c61a11dee 100644 --- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp +++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp @@ -449,8 +449,8 @@ static int trx_usrp_write(openair0_device *device, } else { - ((__m128i *)buff_tx[i])[2*j] = _mm_slli_epi16(((__m128i *)buff[i])[2*j],4); - ((__m128i *)buff_tx[i])[2*j+1] = _mm_slli_epi16(((__m128i *)buff[i])[2*j+1],4); + __m256i tmp=_mm256_loadu_si256(((__m256i *)buff[i])[j]); + buff_tx[i][j] = _mm256_slli_epi16(tmp,4); } #else buff_tx[i][j] = _mm_slli_epi16(((__m128i *)buff[i])[j],4); @@ -596,8 +596,8 @@ void *trx_usrp_write_thread(void * arg){ } else { - ((__m128i *)buff_tx[i])[2*j] = _mm_slli_epi16(((__m128i *)buff[i])[2*j],4); - ((__m128i *)buff_tx[i])[2*j+1] = _mm_slli_epi16(((__m128i *)buff[i])[2*j+1],4); + __m256i tmp=_mm256_loadu_si256(((__m256i *)buff[i])[j]); + buff_tx[i][j] = _mm256_slli_epi16(tmp,4); } #else buff_tx[i][j] = _mm_slli_epi16(((__m128i *)buff[i])[j],4); @@ -752,15 +752,10 @@ static int trx_usrp_read(openair0_device *device, openair0_timestamp *ptimestamp if ((((uintptr_t) buff[i])&0x1F)==0) { ((__m256i *)buff[i])[j] = _mm256_srai_epi16(buff_tmp[i][j],rxshift); - } else if ((((uintptr_t) buff[i])&0x0F)==0) { - ((__m128i *)buff[i])[2*j] = _mm_srai_epi16(((__m128i *)buff_tmp[i])[2*j],rxshift); - ((__m128i *)buff[i])[2*j+1] = _mm_srai_epi16(((__m128i *)buff_tmp[i])[2*j+1],rxshift); - } else { - ((__m64 *)buff[i])[4*j] = _mm_srai_pi16 (((__m64 *)buff_tmp[i])[4*j],rxshift); - ((__m64 *)buff[i])[4*j+1] = _mm_srai_pi16 (((__m64 *)buff_tmp[i])[4*j+1],rxshift); - ((__m64 *)buff[i])[4*j+2] = _mm_srai_pi16 (((__m64 *)buff_tmp[i])[4*j+2],rxshift); - ((__m64 *)buff[i])[4*j+3] = _mm_srai_pi16 (((__m64 *)buff_tmp[i])[4*j+3],rxshift); - } + } else { + __m256i tmp=_mm256_srai_epi16(buff_tmp[i][j],rxshift); + _mm256_storeu_si256(((__m256i *)buff[i])[j], tmp); + } } #else for (int j=0; j Date: Thu, 22 Sep 2022 20:46:51 +0200 Subject: [PATCH 133/135] fix compile issue --- targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp index 0c61a11dee..07892b977d 100644 --- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp +++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp @@ -449,7 +449,7 @@ static int trx_usrp_write(openair0_device *device, } else { - __m256i tmp=_mm256_loadu_si256(((__m256i *)buff[i])[j]); + __m256i tmp=_mm256_loadu_si256(((__m256i *)buff[i])+j); buff_tx[i][j] = _mm256_slli_epi16(tmp,4); } #else @@ -596,7 +596,7 @@ void *trx_usrp_write_thread(void * arg){ } else { - __m256i tmp=_mm256_loadu_si256(((__m256i *)buff[i])[j]); + __m256i tmp=_mm256_loadu_si256(((__m256i *)buff[i])+j); buff_tx[i][j] = _mm256_slli_epi16(tmp,4); } #else @@ -754,7 +754,7 @@ static int trx_usrp_read(openair0_device *device, openair0_timestamp *ptimestamp ((__m256i *)buff[i])[j] = _mm256_srai_epi16(buff_tmp[i][j],rxshift); } else { __m256i tmp=_mm256_srai_epi16(buff_tmp[i][j],rxshift); - _mm256_storeu_si256(((__m256i *)buff[i])[j], tmp); + _mm256_storeu_si256(((__m256i *)buff[i])+j, tmp); } } #else From b3bdee53b44e0bdc736570bbb334fa1678e9955a Mon Sep 17 00:00:00 2001 From: Sagar Parsawar Date: Mon, 3 Oct 2022 12:23:19 +0200 Subject: [PATCH 134/135] Fixing memory alignment issue of PRS buffers in nrUE --- openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c | 6 +++--- 1 file changed, 3 insertions(+), 3 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 2de95698dd..a84b2122f7 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -52,9 +52,9 @@ int nr_prs_channel_estimation(uint8_t gNB_id, int32_t **rxdataF = ue->common_vars.common_vars_rx_data_per_thread[proc->thread_id].rxdataF; prs_config_t *prs_cfg = &ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_cfg; prs_meas_t **prs_meas = ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_meas; - c16_t ch_tmp_buf[ ue->frame_parms.ofdm_symbol_size]; - int32_t chF_interpol[frame_params->nb_antennas_rx][NR_PRS_IDFT_OVERSAMP_FACTOR*ue->frame_parms.ofdm_symbol_size]; - int32_t chT_interpol[frame_params->nb_antennas_rx][NR_PRS_IDFT_OVERSAMP_FACTOR*ue->frame_parms.ofdm_symbol_size]; + c16_t ch_tmp_buf[ ue->frame_parms.ofdm_symbol_size] __attribute__((aligned(32))); + int32_t chF_interpol[frame_params->nb_antennas_rx][NR_PRS_IDFT_OVERSAMP_FACTOR*ue->frame_parms.ofdm_symbol_size] __attribute__((aligned(32))); + int32_t chT_interpol[frame_params->nb_antennas_rx][NR_PRS_IDFT_OVERSAMP_FACTOR*ue->frame_parms.ofdm_symbol_size] __attribute__((aligned(32))); memset(ch_tmp_buf,0,sizeof(ch_tmp_buf)); memset(chF_interpol,0,sizeof(chF_interpol)); memset(chT_interpol,0,sizeof(chF_interpol)); From dbee8c6741dd965f345fe69630bc9b0d35c92d7b Mon Sep 17 00:00:00 2001 From: laurent Date: Tue, 4 Oct 2022 20:41:38 +0200 Subject: [PATCH 135/135] fix bug in prs --- openair2/ENB_APP/enb_paramdef.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/openair2/ENB_APP/enb_paramdef.h b/openair2/ENB_APP/enb_paramdef.h index 8cde58a7a8..20a5807616 100644 --- a/openair2/ENB_APP/enb_paramdef.h +++ b/openair2/ENB_APP/enb_paramdef.h @@ -158,12 +158,12 @@ typedef enum { #define RU_NR_SCS_FOR_RASTER 32 #define RU_TX_SUBDEV 33 #define RU_RX_SUBDEV 34 -#define RU_RXFH_CORE_ID 33 -#define RU_TXFH_CORE_ID 34 -#define RU_TP_CORES 35 -#define RU_NUM_TP_CORES 36 -#define RU_NUM_INTERFACES 37 -#define RU_HALF_SLOT_PARALLELIZATION 38 +#define RU_RXFH_CORE_ID 35 +#define RU_TXFH_CORE_ID 36 +#define RU_TP_CORES 37 +#define RU_NUM_TP_CORES 38 +#define RU_NUM_INTERFACES 39 +#define RU_HALF_SLOT_PARALLELIZATION 40 /*-----------------------------------------------------------------------------------------------------------------------------------------*/ /* RU configuration parameters */ /* optname helpstr paramflags XXXptr defXXXval type numelt */