From fd8fc31a6f403f5e6ccf0cc14978322a648944f1 Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Thu, 8 Feb 2024 20:02:26 +0100 Subject: [PATCH 1/5] Create 5G RFsim FR2 SA test Transform the previous FR2 do-ra test to FR2 RA. Co-authored-by: Luis Pereira --- ...onf => gnb.sa.band261.u3.32prb.rfsim.conf} | 136 ++++++------------ .../container_5g_rfsim_fr2_32prb.xml | 20 +-- .../container_5g_rfsim_fr2_32prb_down.xml | 8 -- .../docker-compose.yaml | 103 +++++++++++-- 4 files changed, 148 insertions(+), 119 deletions(-) rename ci-scripts/conf_files/{gnb.band261.32prb.rfsim.phytest-dora.conf => gnb.sa.band261.u3.32prb.rfsim.conf} (70%) diff --git a/ci-scripts/conf_files/gnb.band261.32prb.rfsim.phytest-dora.conf b/ci-scripts/conf_files/gnb.sa.band261.u3.32prb.rfsim.conf similarity index 70% rename from ci-scripts/conf_files/gnb.band261.32prb.rfsim.phytest-dora.conf rename to ci-scripts/conf_files/gnb.sa.band261.u3.32prb.rfsim.conf index 7603148fb7..d027e445ab 100644 --- a/ci-scripts/conf_files/gnb.band261.32prb.rfsim.phytest-dora.conf +++ b/ci-scripts/conf_files/gnb.sa.band261.u3.32prb.rfsim.conf @@ -1,41 +1,42 @@ -Active_gNBs = ( "gNB-Eurecom-5GNRBox"); +Active_gNBs = ( "gNB-OAI"); # Asn1_verbosity, choice in: none, info, annoying Asn1_verbosity = "none"; +sa = 1; + gNBs = ( { ////////// Identification parameters: gNB_ID = 0xe00; - - cell_type = "CELL_MACRO_GNB"; - - gNB_name = "gNB-Eurecom-5GNRBox"; + 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;}); + plmn_list = ({ mcc = 208; mnc = 99; mnc_length = 2; snssaiList = ({ sst = 1; }) }); + nr_cellid = 12345678L; tr_s_preference = "local_mac" ////////// Physical parameters: + sib1_tda = 15; min_rxtxtime = 6; servingCellConfigCommon = ( { #spCellConfigCommon - physCellId = 0; + physCellId = 10; # downlinkConfigCommon #frequencyInfoDL - # this is pointA + 23 PRBs@120kHz SCS (same as initial BWP) - absoluteFrequencySSB = 2071241; + # this is pointA + 16 PRBs@120kHz SCS (same as initial BWP) + absoluteFrequencySSB = 2071387; dl_frequencyBand = 261; # this is 27.900 GHz - dl_absoluteFrequencyPointA = 2070833; + dl_absoluteFrequencyPointA = 2071003; #scs-SpecificCarrierList dl_offstToCarrier = 0; # subcarrierSpacing @@ -50,7 +51,7 @@ gNBs = # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 initialDLBWPsubcarrierSpacing = 3; #pdcch-ConfigCommon - initialDLBWPcontrolResourceSetZero = 12; + initialDLBWPcontrolResourceSetZero = 1; initialDLBWPsearchSpaceZero = 0; #uplinkConfigCommon @@ -85,12 +86,12 @@ gNBs = powerRampingStep = 1; #ra_ReponseWindow #1,2,4,8,10,20,40,80 - ra_ResponseWindow = 7; + ra_ResponseWindow = 5; #ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR -#0=oneeighth,1=onefourth,2=half,3=one,4=two,5=four,6=eight,7=sixteen - ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 4; +#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen + ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 3; #oneHalf (0..15) 4,8,12,16,...60,64 - ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 7; + ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 15; #ra_ContentionResolutionTimer #(0..7) 8,16,24,32,40,48,56,64 ra_ContentionResolutionTimer = 7; @@ -101,8 +102,7 @@ gNBs = 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, - + msg1_SubcarrierSpacing = 3; # restrictedSetConfig # 0=unrestricted, 1=restricted type A, 2=restricted type B restrictedSetConfig = 0, @@ -119,7 +119,7 @@ gNBs = # ssb_PositionsInBurs_BitmapPR # 1=short, 2=medium, 3=long ssb_PositionsInBurst_PR = 3; - ssb_PositionsInBurst_Bitmap = 0x0001000100010001L; + ssb_PositionsInBurst_Bitmap = 1; # ssb_periodicityServingCell # 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1 @@ -152,7 +152,6 @@ gNBs = ); - # ------- SCTP definitions SCTP : { @@ -162,91 +161,58 @@ gNBs = }; - ////////// MME parameters: - mme_ip_address = ( { ipv4 = "192.168.18.99"; + ////////// AMF parameters: + amf_ip_address = ( { ipv4 = "192.168.71.132"; ipv6 = "192:168:30::17"; active = "yes"; preference = "ipv4"; } ); - ///X2 - enable_x2 = "no"; - t_reloc_prep = 1000; /* unit: millisecond */ - tx2_reloc_overall = 2000; /* unit: millisecond */ - t_dc_prep = 1000; /* unit: millisecond */ - t_dc_overall = 2000; /* unit: millisecond */ - target_enb_x2_ip_address = ( - { ipv4 = "192.168.18.199"; - ipv6 = "192:168:30::17"; - preference = "ipv4"; - } - ); - NETWORK_INTERFACES : { - - GNB_INTERFACE_NAME_FOR_S1_MME = "eth0"; - GNB_IPV4_ADDRESS_FOR_S1_MME = "192.168.18.198/24"; - GNB_INTERFACE_NAME_FOR_S1U = "eth0"; - GNB_IPV4_ADDRESS_FOR_S1U = "192.168.18.198/24"; + GNB_INTERFACE_NAME_FOR_NG_AMF = "eth0"; + GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.71.140/24"; + GNB_INTERFACE_NAME_FOR_NGU = "eth0"; + GNB_IPV4_ADDRESS_FOR_NGU = "192.168.71.140/24"; GNB_PORT_FOR_S1U = 2152; # Spec 2152 - GNB_IPV4_ADDRESS_FOR_X2C = "192.168.18.198/24"; - GNB_PORT_FOR_X2C = 36422; # Spec 36422 }; } ); -MACRLCs = ( - { - num_cc = 1; - tr_s_preference = "local_L1"; - tr_n_preference = "local_RRC"; - pusch_TargetSNRx10 = 200; - pucch_TargetSNRx10 = 200; - } -); +MACRLCs = ({ + num_cc = 1; + tr_s_preference = "local_L1"; + tr_n_preference = "local_RRC"; + pusch_TargetSNRx10 = 200; + pucch_TargetSNRx10 = 200; +}); L1s = ( { num_cc = 1; tr_n_preference = "local_mac"; - ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0 + prach_dtx_threshold = 120; + #pucch0_dtx_threshold = 120; } ); -RUs = ( - { - local_rf = "yes" - nb_tx = 1; - nb_rx = 1; - att_tx = 0; - att_rx = 0; - bands = [7]; - sl_ahead = 12; - max_pdschReferenceSignalPower = -27; - max_rxgain = 75; - eNB_instances = [0]; - sdr_addrs = "addr=192.168.10.2,second_addr=192.168.20.2"; - if_freq = 5124520000L; - clock_src = "external"; - time_src = "external"; - } -); +RUs = ({ + local_rf = "yes" + nb_tx = 1; + nb_rx = 1; + att_tx = 0; + att_rx = 0; + sl_ahead = 12; + bands = [261]; + max_pdschReferenceSignalPower = -27; + eNB_instances = [0]; +}); rfsimulator: { serveraddr = "server"; }; -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 @@ -264,14 +230,6 @@ security = { 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"; - }; - +log_config: { + global_log_level ="info"; +}; diff --git a/ci-scripts/xml_files/container_5g_rfsim_fr2_32prb.xml b/ci-scripts/xml_files/container_5g_rfsim_fr2_32prb.xml index 25ffb4b7b2..2c3625166e 100644 --- a/ci-scripts/xml_files/container_5g_rfsim_fr2_32prb.xml +++ b/ci-scripts/xml_files/container_5g_rfsim_fr2_32prb.xml @@ -28,7 +28,6 @@ 111111 100001 - 004000 000000 000001 020001 @@ -44,27 +43,20 @@ oai-gnb-asan oai-nr-ue-asan - - Custom_Command - Clean-Up any residual volume - localhost - docker volume rm 5g_rfsimulator_fr2_32prb_rrc.config - - DeployGenObject Deploy OAI gNB yaml_files/5g_rfsimulator_fr2_32prb - oai-gnb - 1 + mysql oai-amf oai-smf oai-upf oai-ext-dn + 5 DeployGenObject Deploy OAI NR-UE yaml_files/5g_rfsimulator_fr2_32prb - oai-nr-ue - 2 + oai-gnb oai-nr-ue + 7 @@ -87,8 +79,8 @@ UndeployGenObject Undeploy all OAI 5G stack yaml_files/5g_rfsimulator_fr2_32prb - 0,0,0,0 - 0,0,0,0 + 10,0,0,0 + 10,0,0,0 diff --git a/ci-scripts/xml_files/container_5g_rfsim_fr2_32prb_down.xml b/ci-scripts/xml_files/container_5g_rfsim_fr2_32prb_down.xml index efd7340b41..6dd65eaa85 100644 --- a/ci-scripts/xml_files/container_5g_rfsim_fr2_32prb_down.xml +++ b/ci-scripts/xml_files/container_5g_rfsim_fr2_32prb_down.xml @@ -26,7 +26,6 @@ trash 100002 - 004000 222222 @@ -37,13 +36,6 @@ yaml_files/5g_rfsimulator_fr2_32prb - - Custom_Command - Clean-Up any residual volume - localhost - docker volume rm 5g_rfsimulator_fr2_32prb_rrc.config - - Clean_Test_Server_Images Clean Test Images on Test Server diff --git a/ci-scripts/yaml_files/5g_rfsimulator_fr2_32prb/docker-compose.yaml b/ci-scripts/yaml_files/5g_rfsimulator_fr2_32prb/docker-compose.yaml index 145122d97e..c04680ad58 100644 --- a/ci-scripts/yaml_files/5g_rfsimulator_fr2_32prb/docker-compose.yaml +++ b/ci-scripts/yaml_files/5g_rfsimulator_fr2_32prb/docker-compose.yaml @@ -1,18 +1,99 @@ version: '3.8' services: + mysql: + container_name: "rfsim5g-mysql" + image: mysql:8.0 + volumes: + - ../5g_rfsimulator/oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql + - ../5g_rfsimulator/mysql-healthcheck.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: 30 + networks: + public_net: + ipv4_address: 192.168.71.131 + oai-amf: + container_name: "rfsim5g-oai-amf" + image: oaisoftwarealliance/oai-amf:v2.0.0 + environment: + - TZ=Europe/paris + volumes: + - ../5g_rfsimulator/mini_nonrf_config.yaml:/openair-amf/etc/config.yaml + depends_on: + - mysql + networks: + public_net: + ipv4_address: 192.168.71.132 + oai-smf: + container_name: "rfsim5g-oai-smf" + image: oaisoftwarealliance/oai-smf:v2.0.0 + environment: + - TZ=Europe/Paris + volumes: + - ../5g_rfsimulator/mini_nonrf_config.yaml:/openair-smf/etc/config.yaml + depends_on: + - oai-amf + networks: + public_net: + ipv4_address: 192.168.71.133 + oai-upf: + container_name: "rfsim5g-oai-upf" + image: oaisoftwarealliance/oai-upf:v2.0.0 + environment: + - TZ=Europe/Paris + volumes: + - ../5g_rfsimulator/mini_nonrf_config.yaml:/openair-upf/etc/config.yaml + depends_on: + - oai-smf + cap_add: + - NET_ADMIN + - SYS_ADMIN + cap_drop: + - ALL + privileged: true + networks: + public_net: + ipv4_address: 192.168.71.134 + traffic_net: + ipv4_address: 192.168.72.134 + oai-ext-dn: + privileged: true + container_name: rfsim5g-oai-ext-dn + image: oaisoftwarealliance/trf-gen-cn5g:focal + entrypoint: /bin/bash -c \ + "iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;"\ + "ip route add 12.1.1.0/24 via 192.168.72.134 dev eth0; sleep infinity" + depends_on: + - oai-upf + networks: + traffic_net: + ipv4_address: 192.168.72.135 + healthcheck: + test: /bin/bash -c "ping -c 2 192.168.72.134" + interval: 10s + timeout: 5s + retries: 5 + oai-gnb: image: oaisoftwarealliance/oai-gnb:develop privileged: true container_name: rfsim5g-oai-gnb environment: - USE_ADDITIONAL_OPTIONS: --do-ra --rfsim --rfsimulator.wait_timeout 20 --noS1 --log_config.global_log_options level,nocolor,time + USE_ADDITIONAL_OPTIONS: --sa --rfsim --log_config.global_log_options level,nocolor,time ASAN_OPTIONS: detect_leaks=0 networks: public_net: ipv4_address: 192.168.71.140 volumes: - - ../../conf_files/gnb.band261.32prb.rfsim.phytest-dora.conf:/opt/oai-gnb/etc/gnb.conf - - rrc.config:/opt/oai-gnb/ + - ../../conf_files/gnb.sa.band261.u3.32prb.rfsim.conf:/opt/oai-gnb/etc/gnb.conf healthcheck: test: /bin/bash -c "pgrep nr-softmodem" interval: 10s @@ -24,11 +105,12 @@ services: privileged: true container_name: rfsim5g-oai-nr-ue environment: - USE_ADDITIONAL_OPTIONS: --do-ra --rfsim --noS1 --reconfig-file etc/rrc/reconfig.raw --rbconfig-file etc/rrc/rbconfig.raw --rfsimulator.serveraddr 192.168.71.140 --log_config.global_log_options level,nocolor,time + USE_ADDITIONAL_OPTIONS: --sa --rfsim + --rfsimulator.serveraddr 192.168.71.140 --log_config.global_log_options level,nocolor,time + -r 32 --numerology 3 --band 261 -C 27533280000 --ssb 72 ASAN_OPTIONS: detect_leaks=0 volumes: - ../../conf_files/nrue.uicc.conf:/opt/oai-nr-ue/etc/nr-ue.conf - - rrc.config:/opt/oai-nr-ue/etc/rrc/ depends_on: - oai-gnb networks: @@ -40,9 +122,6 @@ services: timeout: 5s retries: 5 -volumes: - rrc.config: - networks: public_net: driver: bridge @@ -52,3 +131,11 @@ networks: - subnet: 192.168.71.128/26 driver_opts: com.docker.network.bridge.name: "rfsim5g-public" + traffic_net: + driver: bridge + name: rfsim5g-oai-traffic-net + ipam: + config: + - subnet: 192.168.72.128/26 + driver_opts: + com.docker.network.bridge.name: "rfsim5g-traffic" From 9f315932d06984e354494d562051b5a8806c07bd Mon Sep 17 00:00:00 2001 From: luis_pereira87 Date: Fri, 9 Feb 2024 11:16:49 +0000 Subject: [PATCH 2/5] Fix CI runtime errors Fix for CI runtime error: left shift of 1 by 31 places cannot be represented in type 'int' Fix for CI runtime error: left shift of 128 by 24 places cannot be represented in type 'int' --- openair1/SCHED_NR/phy_procedures_nr_gNB.c | 2 +- openair2/LAYER2/NR_MAC_UE/config_ue.c | 2 +- 2 files 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 2c8935f007..a85d5199c3 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -602,7 +602,7 @@ void fill_ul_rb_mask(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) { rb2 = rb + pucch_pdu->bwp_start + ((symbol < pucch_pdu->start_symbol_index+(pucch_pdu->nr_of_symbols>>1)) || (pucch_pdu->freq_hop_flag == 0) ? pucch_pdu->prb_start : pucch_pdu->second_hop_prb); - gNB->rb_mask_ul[symbol][rb2>>5] |= (1<<(rb2&31)); + gNB->rb_mask_ul[symbol][rb2>>5] |= (((uint32_t)1)<<(rb2&31)); } } } diff --git a/openair2/LAYER2/NR_MAC_UE/config_ue.c b/openair2/LAYER2/NR_MAC_UE/config_ue.c index 4662a7eab6..c745752159 100644 --- a/openair2/LAYER2/NR_MAC_UE/config_ue.c +++ b/openair2/LAYER2/NR_MAC_UE/config_ue.c @@ -183,7 +183,7 @@ static void config_common_ue_sa(NR_UE_MAC_INST_t *mac, else{ for (int i=0; i<8; i++){ if ((scc->ssb_PositionsInBurst.groupPresence->buf[0]>>(7-i))&0x01) - cfg->ssb_table.ssb_mask_list[i>>2].ssb_mask |= scc->ssb_PositionsInBurst.inOneGroup.buf[0]<<(24-8*(i%4)); + cfg->ssb_table.ssb_mask_list[i>>2].ssb_mask |= ((uint32_t)scc->ssb_PositionsInBurst.inOneGroup.buf[0])<<(24-8*(i%4)); } } From be36b2f9bc075c5ff97abc788e194011b788f8c5 Mon Sep 17 00:00:00 2001 From: luis_pereira87 Date: Fri, 9 Feb 2024 15:28:25 +0000 Subject: [PATCH 3/5] Fix CI 5G RFsim FR2 SA ping test --- .../xml_files/container_5g_rfsim_fr2_32prb.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/ci-scripts/xml_files/container_5g_rfsim_fr2_32prb.xml b/ci-scripts/xml_files/container_5g_rfsim_fr2_32prb.xml index 2c3625166e..e6127a766e 100644 --- a/ci-scripts/xml_files/container_5g_rfsim_fr2_32prb.xml +++ b/ci-scripts/xml_files/container_5g_rfsim_fr2_32prb.xml @@ -22,7 +22,7 @@ --> rfsim-fr2-32prb-5gnr-tdd - Monolithic FR2 do-ra gNB + Monolithic FR2 gNB wrench 1 @@ -61,17 +61,17 @@ Ping - Ping gNB from NR-UE + Ping ext-dn from NR-UE rfsim5g_ue - -c20 -i0.2 10.0.1.1 + -c 20 -i0.2 192.168.72.135 0 Ping - Ping NR-UE from gNB - rfsim5g_gnb_nos1 - -c20 -i0.2 10.0.1.2 + Ping NR-UE from ext-dn + rfsim5g_ext_dn + -c 20 12.1.1.2 -i0.2 0 From c78399ee369619d00dae6318f50cd1019afd6727 Mon Sep 17 00:00:00 2001 From: luis_pereira87 Date: Fri, 9 Feb 2024 10:21:24 +0000 Subject: [PATCH 4/5] Update 5G RFsim FR2 SA test to have kSSB different from 0 Enable CI to test kSSB with a value different from 0 for FR2 to prevent regressions on future updates related with kSSB --- ci-scripts/conf_files/gnb.sa.band261.u3.32prb.rfsim.conf | 2 +- .../yaml_files/5g_rfsimulator_fr2_32prb/docker-compose.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ci-scripts/conf_files/gnb.sa.band261.u3.32prb.rfsim.conf b/ci-scripts/conf_files/gnb.sa.band261.u3.32prb.rfsim.conf index d027e445ab..387bd959ad 100644 --- a/ci-scripts/conf_files/gnb.sa.band261.u3.32prb.rfsim.conf +++ b/ci-scripts/conf_files/gnb.sa.band261.u3.32prb.rfsim.conf @@ -36,7 +36,7 @@ gNBs = absoluteFrequencySSB = 2071387; dl_frequencyBand = 261; # this is 27.900 GHz - dl_absoluteFrequencyPointA = 2071003; + dl_absoluteFrequencyPointA = 2071001; #scs-SpecificCarrierList dl_offstToCarrier = 0; # subcarrierSpacing diff --git a/ci-scripts/yaml_files/5g_rfsimulator_fr2_32prb/docker-compose.yaml b/ci-scripts/yaml_files/5g_rfsimulator_fr2_32prb/docker-compose.yaml index c04680ad58..0311882efe 100644 --- a/ci-scripts/yaml_files/5g_rfsimulator_fr2_32prb/docker-compose.yaml +++ b/ci-scripts/yaml_files/5g_rfsimulator_fr2_32prb/docker-compose.yaml @@ -107,7 +107,7 @@ services: environment: USE_ADDITIONAL_OPTIONS: --sa --rfsim --rfsimulator.serveraddr 192.168.71.140 --log_config.global_log_options level,nocolor,time - -r 32 --numerology 3 --band 261 -C 27533280000 --ssb 72 + -r 32 --numerology 3 --band 261 -C 27533160000 --ssb 73 ASAN_OPTIONS: detect_leaks=0 volumes: - ../../conf_files/nrue.uicc.conf:/opt/oai-nr-ue/etc/nr-ue.conf From 3d8b38f7e634d1d8146c0f4523abc7ded9df8d59 Mon Sep 17 00:00:00 2001 From: luis_pereira87 Date: Fri, 9 Feb 2024 09:13:53 +0000 Subject: [PATCH 5/5] Fix FR2 SSB start subcarrier and SSB frequency at gNB for FR2 offsetToPointA is expressed in terms of 60 kHz SCS and k_SSB expressed in terms of the subcarrier spacing provided by the higher-layer parameter subCarrierSpacingCommon --- openair1/SCHED_NR/phy_procedures_nr_gNB.c | 22 +++++++++++++++++----- openair2/RRC/NR/rrc_gNB.c | 16 ++++++++-------- 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index a85d5199c3..cfbd8d9c12 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -70,13 +70,25 @@ void nr_common_signal_procedures (PHY_VARS_gNB *gNB,int frame,int slot,nfapi_nr_ 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 - // setting the first subcarrier + // Setting the first subcarrier + // 3GPP TS 38.211 sections 7.4.3.1 and 4.4.4.2 + // for FR1 offsetToPointA and k_SSB are expressed in terms of 15 kHz SCS + // for FR2 offsetToPointA is expressed in terms of 60 kHz SCS and k_SSB expressed in terms of the subcarrier spacing provided + // by the higher-layer parameter subCarrierSpacingCommon const int scs = cfg->ssb_config.scs_common.value; - const int prb_offset = (fp->freq_range == nr_FR1) ? ssb_pdu.ssb_pdu_rel15.ssbOffsetPointA>>scs : ssb_pdu.ssb_pdu_rel15.ssbOffsetPointA>>(scs-2); - const int sc_offset = (fp->freq_range == nr_FR1) ? ssb_pdu.ssb_pdu_rel15.SsbSubcarrierOffset >> scs - : ssb_pdu.ssb_pdu_rel15.SsbSubcarrierOffset >> (scs - 2); + const int prb_offset = (fp->freq_range == nr_FR1) ? ssb_pdu.ssb_pdu_rel15.ssbOffsetPointA >> scs + : ssb_pdu.ssb_pdu_rel15.ssbOffsetPointA >> (scs - 2); + const int sc_offset = + (fp->freq_range == nr_FR1) ? ssb_pdu.ssb_pdu_rel15.SsbSubcarrierOffset >> scs : ssb_pdu.ssb_pdu_rel15.SsbSubcarrierOffset; fp->ssb_start_subcarrier = (12 * prb_offset + sc_offset); - LOG_D(PHY, "SSB first subcarrier %d (%d,%d)\n", fp->ssb_start_subcarrier, prb_offset, sc_offset); + LOG_D(PHY, + "ssbOffsetPointA %d SSB SsbSubcarrierOffset %d prb_offset %d sc_offset %d scs %d ssb_start_subcarrier %d\n", + ssb_pdu.ssb_pdu_rel15.ssbOffsetPointA, + ssb_pdu.ssb_pdu_rel15.SsbSubcarrierOffset, + prb_offset, + sc_offset, + scs, + fp->ssb_start_subcarrier); LOG_D(PHY,"SS TX: frame %d, slot %d, start_symbol %d\n",frame,slot, ssb_start_symbol); nr_generate_pss(&txdataF[0][txdataF_offset], gNB->TX_AMP, ssb_start_symbol, cfg, fp); diff --git a/openair2/RRC/NR/rrc_gNB.c b/openair2/RRC/NR/rrc_gNB.c index 660a427d30..ec01355291 100644 --- a/openair2/RRC/NR/rrc_gNB.c +++ b/openair2/RRC/NR/rrc_gNB.c @@ -197,21 +197,21 @@ static int get_ssb_arfcn(const f1ap_served_cell_info_t *cell_info, const NR_MIB_ uint32_t dl_arfcn = get_dl_arfcn(cell_info); int scs = get_ssb_scs(cell_info); int band = get_dl_band(cell_info); + uint64_t freqpointa = from_nrarfcn(band, scs, dl_arfcn); + uint64_t freqssb = 0; + // 3GPP TS 38.211 sections 7.4.3.1 and 4.4.4.2 + // for FR1 offsetToPointA and k_SSB are expressed in terms of 15 kHz SCS + // for FR2 offsetToPointA is expressed in terms of 60 kHz SCS and k_SSB expressed in terms of the subcarrier spacing provided + // by the higher-layer parameter subCarrierSpacingCommon // FR1 includes frequency bands from 410 MHz (ARFCN 82000) to 7125 MHz (ARFCN 875000) // FR2 includes frequency bands from 24.25 GHz (ARFCN 2016667) to 71.0 GHz (ARFCN 2795832) - uint64_t scaling = 0; if (dl_arfcn >= 82000 && dl_arfcn < 875000) - scaling = 1; + freqssb = freqpointa + 15000 * (offsetToPointA * 12 + kssb) + 10ll * 12 * (1 << scs) * 15000; else if (dl_arfcn >= 2016667 && dl_arfcn < 2795832) - scaling = 4; + freqssb = freqpointa + 60000 * offsetToPointA * 12 + (1 << scs) * 15000 * (kssb + 10ll * 12); else AssertFatal(false, "Invalid absoluteFrequencyPointA: %d\n", dl_arfcn); - - uint64_t freqpointa = from_nrarfcn(band, scs, dl_arfcn); - // offsetToPointA and kSSB are both on 15kHz SCS for FR1 and 60kHz SCS for FR2 (see 38.211 sections 7.4.3.1 and 4.4.4.2) - // SSB uses the SCS of the cell and is 20 RBs wide, so use 10 - uint64_t freqssb = freqpointa + scaling * 15000 * (offsetToPointA * 12 + kssb) + 10ll * 12 * (1 << scs) * 15000; int bw_index = get_supported_band_index(scs, band, get_dl_bw(cell_info)); int band_size_hz = get_supported_bw_mhz(band > 256 ? FR2 : FR1, bw_index) * 1000 * 1000; uint32_t ssb_arfcn = to_nrarfcn(band, freqssb, scs, band_size_hz);