diff --git a/ci-scripts/conf_files/gnb.sa.band66.106prb.rfsim.conf b/ci-scripts/conf_files/gnb.sa.band66.106prb.rfsim.conf index dd2bbb0418..655f083b57 100644 --- a/ci-scripts/conf_files/gnb.sa.band66.106prb.rfsim.conf +++ b/ci-scripts/conf_files/gnb.sa.band66.106prb.rfsim.conf @@ -29,7 +29,7 @@ gNBs = # downlinkConfigCommon #frequencyInfoDL # this is 3600 MHz + 43 PRBs@30kHz SCS (same as initial BWP) - absoluteFrequencySSB = 433096; + absoluteFrequencySSB = 432990; dl_frequencyBand = 66; # this is 3600 MHz dl_absoluteFrequencyPointA = 430000; diff --git a/ci-scripts/conf_files/gnb.sa.band66.u0.25prb.rfsim.conf b/ci-scripts/conf_files/gnb.sa.band66.u0.25prb.rfsim.conf index bd325afce4..c03bfd9b77 100644 --- a/ci-scripts/conf_files/gnb.sa.band66.u0.25prb.rfsim.conf +++ b/ci-scripts/conf_files/gnb.sa.band66.u0.25prb.rfsim.conf @@ -29,7 +29,7 @@ gNBs = # downlinkConfigCommon #frequencyInfoDL # this is 2150 MHz + 14 PRBs@15kHz SCS (same as initial BWP), points to Subcarrier 0 of RB#10 of SSB block - absoluteFrequencySSB = 430504; + absoluteFrequencySSB = 430590; dl_frequencyBand = 66; # this is 2150 MHz dl_absoluteFrequencyPointA = 430000; diff --git a/ci-scripts/conf_files/gnb.sa.band78.106prb.rfsim.2x2.conf b/ci-scripts/conf_files/gnb.sa.band78.106prb.rfsim.2x2.conf index 66c82c99d1..cc70829aae 100644 --- a/ci-scripts/conf_files/gnb.sa.band78.106prb.rfsim.2x2.conf +++ b/ci-scripts/conf_files/gnb.sa.band78.106prb.rfsim.2x2.conf @@ -23,13 +23,6 @@ gNBs = do_SRS = 1; min_rxtxtime = 5; - pdcch_ConfigSIB1 = ( - { - controlResourceSetZero = 12; - searchSpaceZero = 0; - } - ); - servingCellConfigCommon = ( { #spCellConfigCommon diff --git a/ci-scripts/conf_files/gnb.sa.band78.51prb.aw2s.ddsuu.conf b/ci-scripts/conf_files/gnb.sa.band78.51prb.aw2s.ddsuu.conf index 3cbdc151d2..953781af14 100644 --- a/ci-scripts/conf_files/gnb.sa.band78.51prb.aw2s.ddsuu.conf +++ b/ci-scripts/conf_files/gnb.sa.band78.51prb.aw2s.ddsuu.conf @@ -26,13 +26,6 @@ gNBs = do_CSIRS = 1; do_SRS = 0; - pdcch_ConfigSIB1 = ( - { - controlResourceSetZero = 11; - searchSpaceZero = 0; - } - ); - servingCellConfigCommon = ( { #spCellConfigCommon 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 7cae9a9500..9a6efada5b 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 @@ -29,10 +29,10 @@ gNBs = # downlinkConfigCommon #frequencyInfoDL # this is 3600 MHz + 12 PRBs@30kHz SCS (same as initial BWP) - absoluteFrequencySSB = 640288; + absoluteFrequencySSB = 640320; dl_frequencyBand = 78; # this is 3600 MHz - dl_absoluteFrequencyPointA = 640000; + dl_absoluteFrequencyPointA = 640032; #scs-SpecificCarrierList dl_offstToCarrier = 0; # subcarrierSpacing diff --git a/ci-scripts/conf_files/untested/gnb.sa.band66.fr1.106PRB.usrpn300.conf b/ci-scripts/conf_files/untested/gnb.sa.band66.fr1.106PRB.usrpn300.conf index 73c265c955..583235bf60 100644 --- a/ci-scripts/conf_files/untested/gnb.sa.band66.fr1.106PRB.usrpn300.conf +++ b/ci-scripts/conf_files/untested/gnb.sa.band66.fr1.106PRB.usrpn300.conf @@ -29,7 +29,7 @@ gNBs = # downlinkConfigCommon #frequencyInfoDL # this is 3600 MHz + 43 PRBs@30kHz SCS (same as initial BWP) - absoluteFrequencySSB = 433096; + absoluteFrequencySSB = 432990; dl_frequencyBand = 66; # this is 3600 MHz dl_absoluteFrequencyPointA = 430000; diff --git a/ci-scripts/xml_files/container_5g_rfsim_u0_25prb.xml b/ci-scripts/xml_files/container_5g_rfsim_u0_25prb.xml index ad5866dad7..b030f5d423 100644 --- a/ci-scripts/xml_files/container_5g_rfsim_u0_25prb.xml +++ b/ci-scripts/xml_files/container_5g_rfsim_u0_25prb.xml @@ -21,8 +21,8 @@ --> - rfsim-5gnr-tdd-u0-25prb - Monolithic SA TDD u0 25PRB gNB + rfsim-5gnr-fdd-u0-25prb + Monolithic SA FDD u0 25PRB gNB wrench 1 diff --git a/ci-scripts/xml_files/container_5g_rfsim_u0_25prb_down.xml b/ci-scripts/xml_files/container_5g_rfsim_u0_25prb_down.xml index 88bb46be24..7cd4bb4f1e 100644 --- a/ci-scripts/xml_files/container_5g_rfsim_u0_25prb_down.xml +++ b/ci-scripts/xml_files/container_5g_rfsim_u0_25prb_down.xml @@ -22,7 +22,7 @@ --> rfsim-5gnr-u0-25prb-down - CleanUp SA Monolithic TDD u0 25PRB gNB + CleanUp SA Monolithic FDD u0 25PRB gNB trash 100002 diff --git a/ci-scripts/yaml_files/5g_fdd_rfsimulator/docker-compose.yaml b/ci-scripts/yaml_files/5g_fdd_rfsimulator/docker-compose.yaml index e3fb278b33..42fe53b2b9 100644 --- a/ci-scripts/yaml_files/5g_fdd_rfsimulator/docker-compose.yaml +++ b/ci-scripts/yaml_files/5g_fdd_rfsimulator/docker-compose.yaml @@ -187,7 +187,7 @@ services: container_name: rfsim5g-oai-nr-ue environment: RFSIMULATOR: 192.168.71.140 - USE_ADDITIONAL_OPTIONS: -E --sa --rfsim -r 106 --numerology 1 --uicc0.imsi 208990100001100 --band 66 -C 2169080000 --CO -400000000 --ssb 396 --log_config.global_log_options level,nocolor,time + USE_ADDITIONAL_OPTIONS: -E --sa --rfsim -r 106 --numerology 1 --uicc0.imsi 208990100001100 --band 66 -C 2169080000 --CO -400000000 --ssb 378 --log_config.global_log_options level,nocolor,time depends_on: - oai-gnb networks: diff --git a/ci-scripts/yaml_files/5g_rfsimulator_24prb/docker-compose.yaml b/ci-scripts/yaml_files/5g_rfsimulator_24prb/docker-compose.yaml index 3b62c00ab5..f076cf2db0 100644 --- a/ci-scripts/yaml_files/5g_rfsimulator_24prb/docker-compose.yaml +++ b/ci-scripts/yaml_files/5g_rfsimulator_24prb/docker-compose.yaml @@ -187,7 +187,7 @@ services: container_name: rfsim5g-oai-nr-ue environment: RFSIMULATOR: 192.168.71.140 - USE_ADDITIONAL_OPTIONS: --sa --rfsim -r 24 --ssb 24 --numerology 1 -C 3604320000 --uicc0.imsi 208990100001100 --log_config.global_log_options level,nocolor,time + USE_ADDITIONAL_OPTIONS: --sa --rfsim -r 24 --ssb 24 --numerology 1 -C 3604800000 --uicc0.imsi 208990100001100 --log_config.global_log_options level,nocolor,time depends_on: - oai-gnb networks: diff --git a/ci-scripts/yaml_files/5g_rfsimulator_u0_25prb/docker-compose.yaml b/ci-scripts/yaml_files/5g_rfsimulator_u0_25prb/docker-compose.yaml index 89c737ba06..f2c90fa7c7 100644 --- a/ci-scripts/yaml_files/5g_rfsimulator_u0_25prb/docker-compose.yaml +++ b/ci-scripts/yaml_files/5g_rfsimulator_u0_25prb/docker-compose.yaml @@ -188,7 +188,7 @@ services: container_name: rfsim5g-oai-nr-ue environment: RFSIMULATOR: 192.168.71.140 - USE_ADDITIONAL_OPTIONS: --sa --rfsim -r 25 --numerology 0 --uicc0.imsi 208990100001100 --band 66 -C 2152250000 --CO -400000000 --ssb 48 --log_config.global_log_options level,nocolor,time + USE_ADDITIONAL_OPTIONS: --sa --rfsim -r 25 --numerology 0 --uicc0.imsi 208990100001100 --band 66 -C 2152250000 --CO -400000000 --ssb 76 --log_config.global_log_options level,nocolor,time depends_on: - oai-gnb networks: diff --git a/common/utils/nr/nr_common.h b/common/utils/nr/nr_common.h index 28bff637bb..396c908e22 100644 --- a/common/utils/nr/nr_common.h +++ b/common/utils/nr/nr_common.h @@ -59,6 +59,14 @@ typedef struct nr_bandentry_s { uint8_t deltaf_raster; } nr_bandentry_t; +typedef struct { + int band; + int scs_index; + int first_gscn; + int step_gscn; + int last_gscn; +} sync_raster_t; + typedef enum frequency_range_e { FR1 = 0, FR2 diff --git a/openair2/GNB_APP/gnb_config.c b/openair2/GNB_APP/gnb_config.c index 9db7cc5067..93143cb45b 100644 --- a/openair2/GNB_APP/gnb_config.c +++ b/openair2/GNB_APP/gnb_config.c @@ -94,6 +94,49 @@ extern uint16_t sf_ahead; int macrlc_has_f1 = 0; +// synchronization raster per band tables (Rel.15) +// (38.101-1 Table 5.4.3.3-1 and 38.101-2 Table 5.4.3.3-1) +// band nb, sub-carrier spacing index, Range of gscn (First, Step size, Last) +const sync_raster_t sync_raster[] = { + {1, 0, 5279, 1, 5419}, + {2, 0, 4829, 1, 4969}, + {3, 0, 4517, 1, 4693}, + {5, 0, 2177, 1, 2230}, + {5, 1, 2183, 1, 2224}, + {7, 0, 6554, 1, 6718}, + {8, 0, 2318, 1, 2395}, + {12, 0, 1828, 1, 1858}, + {20, 0, 1982, 1, 2047}, + {25, 0, 4829, 1, 4981}, + {28, 0, 1901, 1, 2002}, + {34, 0, 5030, 1, 5056}, + {38, 0, 6431, 1, 6544}, + {39, 0, 4706, 1, 4795}, + {40, 0, 5756, 1, 5995}, + {41, 0, 6246, 3, 6717}, + {41, 1, 6254, 3, 6714}, + {50, 0, 3584, 1, 3787}, + {51, 0, 3572, 1, 3574}, + {66, 0, 5279, 1, 5494}, + {66, 1, 5285, 1, 5488}, + {70, 0, 4993, 1, 5044}, + {71, 0, 1547, 1, 1624}, + {74, 0, 3692, 1, 3790}, + {75, 0, 3584, 1, 3787}, + {76, 0, 3572, 1, 3574}, + {77, 1, 7711, 1, 8329}, + {78, 1, 7711, 1, 8051}, + {79, 1, 8480, 16, 8880}, + {257, 3, 22388, 1, 22558}, + {257, 4, 22390, 2, 22556}, + {258, 3, 22257, 1, 22443}, + {258, 4, 22258, 2, 22442}, + {260, 3, 22995, 1, 23166}, + {260, 4, 22996, 2, 23164}, + {261, 3, 22446, 1, 22492}, + {261, 4, 22446, 2, 22490}, +}; + extern int config_check_band_frequencies(int ind, int16_t band, uint64_t downlink_frequency, int32_t uplink_frequency_offset, uint32_t frame_type); @@ -1073,12 +1116,63 @@ void config_security(gNB_RRC_INST *rrc) } } -void RCconfig_NRRRC(MessageDef *msg_p, uint32_t i, gNB_RRC_INST *rrc) { +// Section 5.4.3 of 38.101-1 and -2 +void check_ssb_raster(uint64_t freq, int band, int scs) +{ + int start_gscn = 0, step_gscn = 0, end_gscn = 0; + for (int i = 0; i < sizeof(sync_raster) / sizeof(sync_raster_t); i++) { + if (sync_raster[i].band == band && + sync_raster[i].scs_index == scs) { + start_gscn = sync_raster[i].first_gscn; + step_gscn = sync_raster[i].step_gscn; + end_gscn = sync_raster[i].last_gscn; + break; + } + } + AssertFatal(start_gscn != 0, "Couldn't find band %d with SCS %d\n", band, scs); + int gscn; + if (freq < 3000000000) { + int N = 0; + int M = 0; + for (int k = 0; k < 3; k++) { + M = (k << 1) + 1; + if ((freq - M * 50000) % 1200000 == 0) { + N = (freq - M * 50000) / 1200000; + break; + } + } + AssertFatal(N != 0, "SSB frequency %lu Hz not on the synchronization raster (N * 1200kHz + M * 50 kHz)\n", + freq); + gscn = (3 * N) + (M - 3) / 2; + } + else if (freq < 24250000000) { + AssertFatal((freq - 3000000000) % 1440000 == 0, + "SSB frequency %lu Hz not on the synchronization raster (3000 MHz + N * 1.44 MHz)\n", + freq); + gscn = ((freq - 3000000000) / 1440000) + 7499; + } + else { + AssertFatal((freq - 24250080000) % 17280000 == 0, + "SSB frequency %lu Hz not on the synchronization raster (24250.08 MHz + N * 17.28 MHz)\n", + freq); + gscn = ((freq - 24250080000) / 17280000) + 22256; + } + AssertFatal(gscn >= start_gscn && gscn <= end_gscn, + "GSCN %d corresponding to SSB frequency %lu does not belong to GSCN range for band %d\n", + gscn, freq, band); + int rel_gscn = gscn - start_gscn; + AssertFatal(rel_gscn % step_gscn == 0, + "GSCN %d corresponding to SSB freqyency %lu not in accordance with GSCN step for band %d\n", + gscn, freq, band); +} - int num_gnbs = 0; +void RCconfig_NRRRC(MessageDef *msg_p, uint32_t i, gNB_RRC_INST *rrc) +{ + + int num_gnbs = 0; char aprefix[MAX_OPTNAME_SIZE*2 + 8]; - int32_t gnb_id = 0; - int k = 0; + int32_t gnb_id = 0; + int k = 0; paramdef_t GNBSParams[] = GNBSPARAMS_DESC; ////////// Identification parameters @@ -1098,7 +1192,7 @@ void RCconfig_NRRRC(MessageDef *msg_p, uint32_t i, gNB_RRC_INST *rrc) { paramdef_t SCDsParams[] = SCDPARAMS_DESC(scd); paramlist_def_t SCDsParamList = {GNB_CONFIG_STRING_SERVINGCELLCONFIGDEDICATED, NULL, 0}; - ////////// Physical parameters + ////////// Physical parameters /* get global parameters, defined outside any section in the config file */ @@ -1106,11 +1200,10 @@ void RCconfig_NRRRC(MessageDef *msg_p, uint32_t i, gNB_RRC_INST *rrc) { num_gnbs = GNBSParams[GNB_ACTIVE_GNBS_IDX].numelt; AssertFatal (i0) { + if (num_gnbs > 0) { // Output a list of all gNBs. ////////// Identification parameters config_getlist( &GNBParamList,GNBParams,sizeof(GNBParams)/sizeof(paramdef_t),NULL); - if (GNBParamList.paramarray[i][GNB_GNB_ID_IDX].uptr == NULL) { // Calculate a default gNB ID if (get_softmodem_params()->sa) { @@ -1129,7 +1222,7 @@ void RCconfig_NRRRC(MessageDef *msg_p, uint32_t i, gNB_RRC_INST *rrc) { config_getlist(&SCCsParamList, NULL, 0, aprefix); if (SCCsParamList.numelt > 0) { sprintf(aprefix, "%s.[%i].%s.[%i]", GNB_CONFIG_STRING_GNB_LIST,0,GNB_CONFIG_STRING_SERVINGCELLCONFIGCOMMON, 0); - config_get( SCCsParams,sizeof(SCCsParams)/sizeof(paramdef_t),aprefix); + config_get(SCCsParams,sizeof(SCCsParams) / sizeof(paramdef_t), aprefix); LOG_I(RRC,"Read in ServingCellConfigCommon (PhysCellId %d, ABSFREQSSB %d, DLBand %d, ABSFREQPOINTA %d, DLBW %d,RACH_TargetReceivedPower %d\n", (int)*scc->physCellId, (int)*scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB, @@ -1137,7 +1230,17 @@ void RCconfig_NRRRC(MessageDef *msg_p, uint32_t i, gNB_RRC_INST *rrc) { (int)scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA, (int)scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth, (int)scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric.preambleReceivedTargetPower); - fix_scc(scc,ssb_bitmap); + // SSB of the PCell is always on the sync raster + uint64_t ssb_freq = from_nrarfcn(*scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0], + *scc->ssbSubcarrierSpacing, + *scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB); + LOG_I(RRC, "absoluteFrequencySSB %ld corresponds to %lu Hz\n", + *scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB, ssb_freq); + if (get_softmodem_params()->sa) + check_ssb_raster(ssb_freq, + *scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0], + *scc->ssbSubcarrierSpacing); + fix_scc(scc, ssb_bitmap); } sprintf(aprefix, "%s.[%i]", GNB_CONFIG_STRING_GNB_LIST, 0); diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c index f8ac4a8908..67d1e4fc5f 100644 --- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c +++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c @@ -2234,13 +2234,12 @@ static const uint16_t table_7_3_1_1_2_32[3][15] = { {0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, }; -void get_delta_arfcn(int i, uint32_t nrarfcn, uint64_t N_OFFs){ - +void get_delta_arfcn(int i, uint32_t nrarfcn, uint64_t N_OFFs) +{ uint32_t delta_arfcn = nrarfcn - N_OFFs; - if(delta_arfcn%(nr_bandtable[i].step_size)!=0) - AssertFatal(1==0, "nrarfcn %u is not on the channel raster for step size %lu", nrarfcn, nr_bandtable[i].step_size); - + if(delta_arfcn % (nr_bandtable[i].step_size) != 0) + LOG_E(NR_MAC, "nrarfcn %u is not on the channel raster for step size %lu\n", nrarfcn, nr_bandtable[i].step_size); } uint32_t to_nrarfcn(int nr_bandP, @@ -2335,17 +2334,16 @@ uint64_t from_nrarfcn(int nr_bandP, AssertFatal(nrarfcn >= N_OFFs,"nrarfcn %u < N_OFFs[%d] %llu\n", nrarfcn, nr_bandtable[i].band, (long long unsigned int)N_OFFs); get_delta_arfcn(i, nrarfcn, N_OFFs); - frequency = 1000*(F_REF_Offs_khz + (nrarfcn - N_REF_Offs) * deltaFglobal); + frequency = 1000 * (F_REF_Offs_khz + (nrarfcn - N_REF_Offs) * deltaFglobal); - LOG_I(NR_MAC, "Computing frequency (pointA %llu => %llu KHz (freq_min %llu KHz, NR band %d N_OFFs %llu))\n", - (unsigned long long)nrarfcn, - (unsigned long long)frequency/1000, - (unsigned long long)freq_min, - nr_bandP, - (unsigned long long)N_OFFs); + LOG_D(NR_MAC, "Computing frequency (nrarfcn %llu => %llu KHz (freq_min %llu KHz, NR band %d N_OFFs %llu))\n", + (unsigned long long)nrarfcn, + (unsigned long long)frequency/1000, + (unsigned long long)freq_min, + nr_bandP, + (unsigned long long)N_OFFs); return frequency; - } void nr_get_tbs_dl(nfapi_nr_dl_tti_pdsch_pdu *pdsch_pdu, diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.52PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.52PRB.usrpb210.conf index fdf159d5d9..430c2ddd53 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.52PRB.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.52PRB.usrpb210.conf @@ -25,13 +25,6 @@ gNBs = sib1_tda = 15; min_rxtxtime = 6; - pdcch_ConfigSIB1 = ( - { - controlResourceSetZero = 6; - searchSpaceZero = 0; - } - ); - servingCellConfigCommon = ( { #spCellConfigCommon diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/vnf.sa.band78.106prb.rfsim.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/vnf.sa.band78.106prb.rfsim.conf index d763268ca8..3d3698b1dc 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/vnf.sa.band78.106prb.rfsim.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/vnf.sa.band78.106prb.rfsim.conf @@ -38,13 +38,6 @@ gNBs = min_rxtxtime = 6; sib1_tda = 0; - pdcch_ConfigSIB1 = ( - { - controlResourceSetZero = 12; - searchSpaceZero = 0; - } - ); - servingCellConfigCommon = ( { #spCellConfigCommon