diff --git a/ci-scripts/Jenkinsfile-GitLab-Container b/ci-scripts/Jenkinsfile-GitLab-Container index b1bf895111..f5b83ec071 100644 --- a/ci-scripts/Jenkinsfile-GitLab-Container +++ b/ci-scripts/Jenkinsfile-GitLab-Container @@ -585,6 +585,29 @@ pipeline { } } } + stage ("SA-FHI72-CN5G") { + when { expression {do5Gtest} } + steps { + script { + triggerSlaveJob ('RAN-SA-FHI72-CN5G', 'SA-FHI72-CN5G') + } + } + post { + always { + script { + // Using a unique variable name for each test stage to avoid overwriting on a global variable + // due to parallel-time concurrency + saFHI72Status = finalizeSlaveJob('RAN-SA-FHI72-CN5G') + } + } + failure { + script { + currentBuild.result = 'FAILURE' + failingStages += saFHI72Status + } + } + } + } stage ("SA-OAIUE-CN5G") { when { expression {do5Gtest} } steps { diff --git a/ci-scripts/ci_infra.yaml b/ci-scripts/ci_infra.yaml index 8cbb5936e2..8ffb1c2083 100644 --- a/ci-scripts/ci_infra.yaml +++ b/ci-scripts/ci_infra.yaml @@ -18,6 +18,14 @@ up2: IF: wwan0 MTU: 1500 +up2-fhi72: + Host: up2 + AttachScript: sudo /opt/mbim-fhi72/start_quectel_mbim.sh + DetachScript: sudo /opt/mbim-fhi72/stop_quectel_mbim.sh + NetworkScript: ip a show dev wwan0 + IF: wwan0 + MTU: 1500 + sphex_quectel: Host: sphex InitScript: sudo stdbuf -oL /home/oaicicd/quectel-CM/quectel-CM -4 -s oai.ipv4 &> /tmp/quecel-cm.log & @@ -58,9 +66,18 @@ adb_ue_2: oc-cn5g: Host: avra + Namespace: "oaicicd-core-for-ci-ran" + CNPath: "/opt/oai-cn5g-fed-develop-2024-april-00102" NetworkScript: echo "inet 172.21.6.102" RunIperf3Server: False +oc-cn5g-20897: + Host: cacofonix + Namespace: "oaicicd-core-for-fhi72" + CNPath: "/opt/oai-cn5g-fed-develop-2024-april-20897" + NetworkScript: echo "inet 172.21.6.105" + RunIperf3Server: False + matix-cn5g: Host: matix NetworkScript: docker exec prod-trf-gen ip a show dev eth0 @@ -99,6 +116,10 @@ amarisoft_ue: Host: amariue InitScript: /root/lteue-linux-2023-10-27/ue/lteue /root/oaicicd/ran_sa_aw2s_asue_2x2/aw2s-multi-00102-2x2.cfg & TermScript: /root/2023-10-27/libs/ws.js -t 10 127.0.0.1:9002 '{"message":"quit"}' || killall -KILL lteue-avx2 +amarisoft_ue_fhi72: + Host: amariue + InitScript: /root/lteue-linux-2023-10-27/ue/lteue /root/oaicicd/ran_sa_fhi72_asue_2x2_benetel550/fhi72-multi-20897-2x2.cfg & + TermScript: /root/2023-10-27/libs/ws.js -t 10 127.0.0.1:9002 '{"message":"quit"}' || killall -KILL lteue-avx2 amarisoft_ue_1: Host: amariue AttachScript: /root/2023-10-27/libs/ws.js 127.0.0.1:9002 '{"message":"power_on","ue_id":1}' diff --git a/ci-scripts/cls_cluster.py b/ci-scripts/cls_cluster.py index 80d6d95daa..3f11fad7fb 100644 --- a/ci-scripts/cls_cluster.py +++ b/ci-scripts/cls_cluster.py @@ -43,7 +43,6 @@ NAMESPACE = "oaicicd-ran" OCUrl = "https://api.oai.cs.eurecom.fr:6443" OCRegistry = "default-route-openshift-image-registry.apps.oai.cs.eurecom.fr/" CI_OC_RAN_NAMESPACE = "oaicicd-ran" -CI_OC_CORE_NAMESPACE = "oaicicd-core-for-ci-ran" CN_IMAGES = ["mysql", "oai-nrf", "oai-amf", "oai-smf", "oai-upf", "oai-ausf", "oai-udm", "oai-udr", "oai-traffic-server"] CN_CONTAINERS = ["", "-c nrf", "-c amf", "-c smf", "-c upf", "-c ausf", "-c udm", "-c udr", ""] @@ -68,10 +67,9 @@ def OC_login(cmd, ocUserName, ocPassword, ocProjectName): def OC_logout(cmd): cmd.run(f'oc logout') -def OC_deploy_CN(cmd, ocUserName, ocPassword): - logging.debug('OC OAI CN5G: Deploying OAI CN5G on Openshift Cluster') - path = "/opt/oai-cn5g-fed-develop-2024-april-00102" - succeeded = OC_login(cmd, ocUserName, ocPassword, CI_OC_CORE_NAMESPACE) +def OC_deploy_CN(cmd, ocUserName, ocPassword, ocNamespace, path): + logging.debug(f'OC OAI CN5G: Deploying OAI CN5G on Openshift Cluster: {ocNamespace}') + succeeded = OC_login(cmd, ocUserName, ocPassword, ocNamespace) if not succeeded: return False, CONST.OC_LOGIN_FAIL cmd.run('helm uninstall oai5gcn --wait --timeout 60s') @@ -84,10 +82,9 @@ def OC_deploy_CN(cmd, ocUserName, ocPassword): OC_logout(cmd) return True, report -def OC_undeploy_CN(cmd, ocUserName, ocPassword): - logging.debug('OC OAI CN5G: Terminating CN on Openshift Cluster') - path = "/opt/oai-cn5g-fed-develop-2024-april-00102" - succeeded = OC_login(cmd, ocUserName, ocPassword, CI_OC_CORE_NAMESPACE) +def OC_undeploy_CN(cmd, ocUserName, ocPassword, ocNamespace, path): + logging.debug(f'OC OAI CN5G: Terminating CN on Openshift Cluster: {ocNamespace}') + succeeded = OC_login(cmd, ocUserName, ocPassword, ocNamespace) if not succeeded: return False, CONST.OC_LOGIN_FAIL cmd.run(f'rm -Rf {path}/logs') diff --git a/ci-scripts/cls_module.py b/ci-scripts/cls_module.py index d0cfba0299..ef758a2933 100644 --- a/ci-scripts/cls_module.py +++ b/ci-scripts/cls_module.py @@ -65,6 +65,8 @@ class Module_UE: self.logStore = m.get('LogStore') self.cmd_prefix = m.get('CmdPrefix') self.runIperf3Server = m.get('RunIperf3Server', True) + self.namespace = m.get('Namespace') + self.cnPath = m.get('CNPath') logging.info(f'initialized {self.module_name}@{self.host} from {filename}') def __str__(self): @@ -190,6 +192,12 @@ class Module_UE: def getHost(self): return self.host + def getNamespace(self): + return self.namespace + + def getCNPath(self): + return self.cnPath + def getRunIperf3Server(self): return self.runIperf3Server diff --git a/ci-scripts/conf_files/gnb.sa.band77.273prb.fhi72.4x4-vvdn.conf b/ci-scripts/conf_files/gnb.sa.band77.273prb.fhi72.4x4-vvdn.conf new file mode 100644 index 0000000000..b98ed5d31c --- /dev/null +++ b/ci-scripts/conf_files/gnb.sa.band77.273prb.fhi72.4x4-vvdn.conf @@ -0,0 +1,297 @@ +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 = 97; mnc_length = 2; snssaiList = ( { sst = 1; }); }); + + //nr_cellid = 12345678L; + nr_cellid = 1; + + ////////// Physical parameters: + + pdsch_AntennaPorts_XP = 2; + pdsch_AntennaPorts_N1 = 1; + maxMIMO_layers = 2; + pusch_AntennaPorts = 4; + do_CSIRS = 1; + do_SRS = 0 ; + + pdcch_ConfigSIB1 = ( + { + controlResourceSetZero = 11; + searchSpaceZero = 0; + } + ); + + servingCellConfigCommon = ( + { + #spCellConfigCommon + physCellId = 0; +# downlinkConfigCommon + #frequencyInfoDL + # this is 3450.72 MHz (center frequency) + absoluteFrequencySSB = 666624; + dl_frequencyBand = 77; + # this is 3401.58 MHz + dl_absoluteFrequencyPointA = 663348; + #scs-SpecificCarrierList + dl_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + dl_subcarrierSpacing = 1; + dl_carrierBandwidth = 273; + #initialDownlinkBWP + #genericParameters + initialDLBWPlocationAndBandwidth = 1099; #38.101-1 Table 5.3.2-1 + # +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + initialDLBWPsubcarrierSpacing = 1; + #pdcch-ConfigCommon + initialDLBWPcontrolResourceSetZero = 11; + initialDLBWPsearchSpaceZero = 0; + + #uplinkConfigCommon + #frequencyInfoUL + ul_frequencyBand = 77; + #scs-SpecificCarrierList + ul_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + ul_subcarrierSpacing = 1; + ul_carrierBandwidth = 273; + pMax = 23; + #initialUplinkBWP + #genericParameters + initialULBWPlocationAndBandwidth = 1099; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + initialULBWPsubcarrierSpacing = 1; + #rach-ConfigCommon + #rach-ConfigGeneric + prach_ConfigurationIndex = 159; +#prach_msg1_FDM +#0 = one, 1=two, 2=four, 3=eight + prach_msg1_FDM = 0; + prach_msg1_FrequencyStart = 0; + zeroCorrelationZoneConfig = 0; + preambleReceivedTargetPower = -100; +#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200) + preambleTransMax = 7; +#powerRampingStep +# 0=dB0,1=dB2,2=dB4,3=dB6 + powerRampingStep = 2; +#ra_ReponseWindow +#1,2,4,8,10,20,40,80 + ra_ResponseWindow = 5; +#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR +#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen + ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 3; +#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, + +# this is the offset between the last PRACH preamble power and the Msg3 PUSCH, 2 times the field value in dB + msg3_DeltaPreamble = 2; + p0_NominalWithGrant = -100; + +# pucch-ConfigCommon setup : +# pucchGroupHopping +# 0 = neither, 1= group hopping, 2=sequence hopping + pucchGroupHopping = 0; + hoppingId = 0; + p0_nominal = -96; +# ssb_PositionsInBurs_BitmapPR +# 1=short, 2=medium, 3=long + ssb_PositionsInBurst_PR = 2; + ssb_PositionsInBurst_Bitmap = 0x1; + +# 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 = 5; + nrofDownlinkSlots = 3; + nrofDownlinkSymbols = 6; + nrofUplinkSlots = 1; + nrofUplinkSymbols = 4; + + ssPBCH_BlockPower = 0; + } + + ); + + + # ------- 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.6.103"; }); + + NETWORK_INTERFACES : + { + GNB_IPV4_ADDRESS_FOR_NG_AMF = "172.21.18.20"; + GNB_IPV4_ADDRESS_FOR_NGU = "172.21.18.20"; + GNB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + } +); + +MACRLCs = ( +{ + num_cc = 1; + tr_s_preference = "local_L1"; + tr_n_preference = "local_RRC"; + pusch_TargetSNRx10 = 180; + pucch_TargetSNRx10 = 230; + ul_bler_target_upper=.35; + ul_bler_target_lower=.15; + pusch_FailureThres = 100; +} +); + +L1s = ( +{ + num_cc = 1; + tr_n_preference = "local_mac"; + prach_dtx_threshold = 130 + pucch0_dtx_threshold = 80; + pusch_dtx_threshold = -100; + tx_amp_backoff_dB = 3; + L1_rx_thread_core = 3; + L1_tx_thread_core = 4; + phase_compensation = 0; # needs to match O-RU configuration +} +); + +RUs = ( +{ + local_rf = "no"; + nb_tx = 4; + nb_rx = 4; + att_tx = 0 + att_rx = 0; + bands = [77]; + max_pdschReferenceSignalPower = -27; + max_rxgain = 75; + sf_extension = 0; + eNB_instances = [0]; + ru_thread_core = 5; + sl_ahead = 5; + ##beamforming 1x2 matrix: 1 layer x 2 antennas + bf_weights = [0x00007fff, 0x0000,0x00007fff, 0x0000]; + clock_src = "internal"; + tr_preference = "raw_if4p5"; # important: activate FHI7.2 + do_precoding = 0; # needs to match O-RU configuration +} +); + +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 = "info"; + f1ap_log_level = "info"; +}; + +fhi_72 = { + dpdk_devices = ("0000:c3:11.0", "0000:c3:11.1"); + system_core = 0; + io_core = 1; + worker_cores = (2); + du_addr = ("76:76:64:6e:00:01", "76:76:64:6e:00:01"); + ru_addr = ("98:ae:71:01:c5:eb", "98:ae:71:01:c5:eb"); + mtu = 9216; # check if xran uses this properly + fh_config = ({ + Tadv_cp_dl = 125; + T2a_cp_dl = (285, 429); # (min, max) + T2a_cp_ul = (285, 429); # (min, max) + T2a_up = (125, 428); # (min, max) + Ta3 = (130, 170); # (min, max) + T1a_cp_dl = (285, 470); # (min, max) + T1a_cp_ul = (285, 429); # (min, max) + T1a_up = (125, 350); # (min, max) + Ta4 = (110, 180); # (min, max) + ru_config = { + iq_width = 9; + iq_width_prach = 9; + }; + prach_config = { + eAxC_offset = 4; + }; + }); +}; diff --git a/ci-scripts/conf_files/gnb.sa.band78.273prb.fhi72.4x4-benetel550.conf b/ci-scripts/conf_files/gnb.sa.band78.273prb.fhi72.4x4-benetel550.conf new file mode 100644 index 0000000000..f8586437fa --- /dev/null +++ b/ci-scripts/conf_files/gnb.sa.band78.273prb.fhi72.4x4-benetel550.conf @@ -0,0 +1,296 @@ +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 = 97; mnc_length = 2; snssaiList = ( { sst = 1; }); }); + + nr_cellid = 1; + + ////////// Physical parameters: + + pdsch_AntennaPorts_XP = 2; + pdsch_AntennaPorts_N1 = 1; + maxMIMO_layers = 2; + pusch_AntennaPorts = 4; + do_CSIRS = 1; + do_SRS = 0 ; + sib1_tda = 15; +# force_UL256qam_off = 1; + + pdcch_ConfigSIB1 = ( + { + controlResourceSetZero = 11; + searchSpaceZero = 0; + } + ); + + servingCellConfigCommon = ( + { + #spCellConfigCommon + + physCellId = 0; + # n_TimingAdvanceOffset = 0; +# downlinkConfigCommon + #frequencyInfoDL + # this is 3450.72 MHz (center frequency) + absoluteFrequencySSB = 623328; + dl_frequencyBand = 78; + # this is 3401.58 MHz + dl_absoluteFrequencyPointA = 620052; + #scs-SpecificCarrierList + dl_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + dl_subcarrierSpacing = 1; + dl_carrierBandwidth = 273; + #initialDownlinkBWP + #genericParameters + initialDLBWPlocationAndBandwidth = 1099; #38.101-1 Table 5.3.2-1 + # +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + initialDLBWPsubcarrierSpacing = 1; + #pdcch-ConfigCommon + initialDLBWPcontrolResourceSetZero = 11; + 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 = 23; + #initialUplinkBWP + #genericParameters + initialULBWPlocationAndBandwidth = 1099; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + initialULBWPsubcarrierSpacing = 1; + #rach-ConfigCommon + #rach-ConfigGeneric + prach_ConfigurationIndex = 151; +#prach_msg1_FDM +#0 = one, 1=two, 2=four, 3=eight + prach_msg1_FDM = 0; + prach_msg1_FrequencyStart = 0; + zeroCorrelationZoneConfig = 0; + preambleReceivedTargetPower = -100; +#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200) + preambleTransMax = 8; +#powerRampingStep +# 0=dB0,1=dB2,2=dB4,3=dB6 + powerRampingStep = 1; +#ra_ReponseWindow +#1,2,4,8,10,20,40,80 + ra_ResponseWindow = 5; +#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR +#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen + ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 3; +#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, + +# this is the offset between the last PRACH preamble power and the Msg3 PUSCH, 2 times the field value in dB + msg3_DeltaPreamble = 2; + p0_NominalWithGrant = -96; + +# pucch-ConfigCommon setup : +# pucchGroupHopping +# 0 = neither, 1= group hopping, 2=sequence hopping + pucchGroupHopping = 0; + hoppingId = 0; + p0_nominal = -96; +# ssb_PositionsInBurs_BitmapPR +# 1=short, 2=medium, 3=long + ssb_PositionsInBurst_PR = 2; + ssb_PositionsInBurst_Bitmap = 0x1; + +# 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 = -15; + } + + ); + + + # ------- 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.6.103"; }); + + NETWORK_INTERFACES : + { + GNB_IPV4_ADDRESS_FOR_NG_AMF = "172.21.18.20"; + GNB_IPV4_ADDRESS_FOR_NGU = "172.21.18.20"; + GNB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + } +); + +MACRLCs = ( +{ + num_cc = 1; + tr_s_preference = "local_L1"; + tr_n_preference = "local_RRC"; + pusch_TargetSNRx10 = 100; + pucch_TargetSNRx10 = 200; + dl_bler_target_upper=.35; + dl_bler_target_lower=.15; + ul_bler_target_upper=.35; + ul_bler_target_lower=.15; + pusch_FailureThres = 1000; + ul_max_mcs = 28; +} +); + +L1s = ( +{ + num_cc = 1; + tr_n_preference = "local_mac"; + prach_dtx_threshold = 90; + pucch0_dtx_threshold = 80; + pusch_dtx_threshold = 10; + max_ldpc_iterations = 15; + tx_amp_backoff_dB = 12; # needs to match O-RU configuration + L1_rx_thread_core = 3; + L1_tx_thread_core = 4; + phase_compensation = 0; # needs to match O-RU configuration +} +); + +RUs = ( +{ + local_rf = "no"; + nb_tx = 4; + nb_rx = 4; + att_tx = 0 + att_rx = 0; + bands = [78]; + max_pdschReferenceSignalPower = -27; + max_rxgain = 75; + sf_extension = 0; + eNB_instances = [0]; + ru_thread_core = 5; + sl_ahead = 10; + ##beamforming 1x2 matrix: 1 layer x 2 antennas + bf_weights = [0x00007fff, 0x0000,0x00007fff, 0x0000]; + tr_preference = "raw_if4p5"; # important: activate FHI7.2 + do_precoding = 0; # needs to match O-RU configuration +} +); + +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 ="info"; + f1ap_log_level ="info"; +}; + +fhi_72 = { + dpdk_devices = ("0000:c3:11.0", "0000:c3:11.1"); + system_core = 0; + io_core = 1; + worker_cores = (2); + du_addr = ("00:11:22:33:44:66", "00:11:22:33:44:67"); + ru_addr = ("70:b3:d5:e1:5b:81", "70:b3:d5:e1:5b:81"); + mtu = 9216; + file_prefix = "fhi_72"; + fh_config = ({ + Tadv_cp_dl = 125; + T2a_cp_dl = (259, 500); + T2a_cp_ul = (25, 500); + T2a_up = (134, 375); + Ta3 = (152, 160); + T1a_cp_dl = (419, 470); + T1a_cp_ul = (285, 336); + T1a_up = (294, 345); + Ta4 = (0, 200); + ru_config = { + iq_width = 9; + iq_width_prach = 9; + }; + prach_config = { + eAxC_offset = 4; + }; + }); +}; diff --git a/ci-scripts/epc.py b/ci-scripts/epc.py index fb5aa8cde6..7c0eb51853 100644 --- a/ci-scripts/epc.py +++ b/ci-scripts/epc.py @@ -48,6 +48,7 @@ import helpreadme as HELP import constants as CONST import cls_cluster as OC import cls_cmd +import cls_module #----------------------------------------------------------- # Class Declaration #----------------------------------------------------------- @@ -75,6 +76,7 @@ class EPCManagement(): self.OCRegistry = "default-route-openshift-image-registry.apps.oai.cs.eurecom.fr/" self.OCUserName = '' self.OCPassword = '' + self.cnID = '' self.imageToPull = '' self.eNBSourceCodePath = '' @@ -298,7 +300,8 @@ class EPCManagement(): html_cell += '(' + res4.group('date') + ')' html_cell += '\n' elif re.match('OC-OAI-CN5G', self.Type, re.IGNORECASE): - succeeded, report = OC.OC_deploy_CN(mySSH, self.OCUserName, self.OCPassword) + cn = cls_module.Module_UE(self.cnID) + succeeded, report = OC.OC_deploy_CN(mySSH, self.OCUserName, self.OCPassword, cn.getNamespace(), cn.getCNPath()) if not succeeded: HTML.CreateHtmlTestRow('N/A', 'KO', report) HTML.CreateHtmlTabFooter(False) @@ -575,7 +578,8 @@ class EPCManagement(): mySSH.copyin(f'{self.SourceCodePath}/logs/test_logs_CN.zip','test_logs_CN.zip') logging.debug(message) elif re.match('OC-OAI-CN5G', self.Type, re.IGNORECASE): - succeeded, report = OC.OC_undeploy_CN(mySSH, self.OCUserName, self.OCPassword) + cn = cls_module.Module_UE(self.cnID) + succeeded, report = OC.OC_undeploy_CN(mySSH, self.OCUserName, self.OCPassword, cn.getNamespace(), cn.getCNPath()) if not succeeded: HTML.CreateHtmlTestRow('N/A', 'KO', report) HTML.CreateHtmlTabFooter(False) diff --git a/ci-scripts/main.py b/ci-scripts/main.py index 8f1235d8b4..ed002c1fa2 100644 --- a/ci-scripts/main.py +++ b/ci-scripts/main.py @@ -337,11 +337,13 @@ def GetParametersFromXML(action): string_field = test.findtext('args') if (string_field is not None): EPC.cfgDeploy = string_field + EPC.cnID = test.findtext('cn_id') elif action == 'Terminate_5GCN': string_field = test.findtext('args') if (string_field is not None): EPC.cfgUnDeploy = string_field + EPC.cnID = test.findtext('cn_id') elif action == 'Deploy_Object' or action == 'Undeploy_Object': eNB_instance=test.findtext('eNB_instance') diff --git a/ci-scripts/xml_files/container_sa_fhi72_vvdn_up2.xml b/ci-scripts/xml_files/container_sa_fhi72_vvdn_up2.xml new file mode 100644 index 0000000000..bac2ec38a0 --- /dev/null +++ b/ci-scripts/xml_files/container_sa_fhi72_vvdn_up2.xml @@ -0,0 +1,143 @@ + + + test-5g-fhi72-vvdn + 100 MHz TDD SA VVDN + tasks + 1 + + 200000 + 110000 + 120000 + 102000 + 102001 + 100100 + 100010 + 100020 + 100030 + 100040 + 103000 + 100002 + 130000 + + + + + Custom_Command + Setup sriov and network interfaces VVDN + cacofonix + /opt/FHI7.2/setup_sriov_vvdn.sh + yes + + + + Pull_Cluster_Image + Pull Images from Cluster + oaicicd-ran + oai-gnb-fhi72 + + + + Deploy_Object + Deploy gNB (TDD/Band78/100MHz/VVDN) in a container + ci-scripts/yaml_files/sa_fhi_7.2_vvdn_gnb + 0 + 0 + + + + Attach_UE + Attach UE + up2-fhi72 + + + + Ping + Ping: 100 pings in 10 sec + up2-fhi72 + -c 100 -i 0.1 172.21.6.104 + 1 + 15 + + + + Iperf + iperf (DL/300Mbps/UDP)(30 sec)(multi-ue profile) + -u -b 300M -t 30 -R + up2-fhi72 + 20 + 80 + balanced + oc-cn5g-20897 + + + + Iperf + iperf (DL/TCP)(30 sec)(multi-ue profile) + -t 30 -R + up2-fhi72 + 40 + oc-cn5g-20897 + + + + Iperf + iperf (UL/70Mbps/UDP)(30 sec)(multi-ue profile) + -u -b 70M -t 30 + up2-fhi72 + 20 + 80 + balanced + oc-cn5g-20897 + + + + Iperf + iperf (UL/TCP)(30 sec)(multi-ue profile) + -t 30 + up2-fhi72 + 40 + oc-cn5g-20897 + + + + Detach_UE + Detach UE + up2-fhi72 + + + + IdleSleep + Sleep + 5 + + + + Undeploy_Object + Undeploy gNB + ci-scripts/yaml_files/sa_fhi_7.2_vvdn_gnb + 0 + 0 + + + diff --git a/ci-scripts/xml_files/container_sa_fhi72_vvdn_up2_cleanup.xml b/ci-scripts/xml_files/container_sa_fhi72_vvdn_up2_cleanup.xml new file mode 100644 index 0000000000..1a9aecfc8a --- /dev/null +++ b/ci-scripts/xml_files/container_sa_fhi72_vvdn_up2_cleanup.xml @@ -0,0 +1,63 @@ + + + cleanup-fhi72-vvdn + Cleanup VVDN + trash + + 555555 + 666666 + 777777 + 888888 + + + + + Detach_UE + Detach UE + up2-fhi72 + + + + Undeploy_Object + Undeploy gNB + ci-scripts/yaml_files/sa_fhi_7.2_vvdn_gnb + 0 + 0 + + + + Clean_Test_Server_Images + Clean Test Images on Test Server + 0 + + + + Custom_Command + Set CPU to idle state, set kernel parameters to default values + cacofonix + /opt/FHI7.2/setup_cleanup.sh + yes + + + diff --git a/ci-scripts/xml_files/sa_cn5g_20897_closure.xml b/ci-scripts/xml_files/sa_cn5g_20897_closure.xml new file mode 100644 index 0000000000..685775c1a4 --- /dev/null +++ b/ci-scripts/xml_files/sa_cn5g_20897_closure.xml @@ -0,0 +1,38 @@ + + + cn5g-closure + CN5G-Closure + log-out + + 060000 + + + + + Terminate_5GCN + Terminate 5G Core + oc-cn5g-20897 + + + diff --git a/ci-scripts/xml_files/sa_cn5g_20897_start.xml b/ci-scripts/xml_files/sa_cn5g_20897_start.xml new file mode 100644 index 0000000000..2d60baedc1 --- /dev/null +++ b/ci-scripts/xml_files/sa_cn5g_20897_start.xml @@ -0,0 +1,38 @@ + + + cn5g-start-tab + CN5G-Start + log-in + + 000100 + + + + + + Initialize_5GCN + Initialize 5G Core + oc-cn5g-20897 + + diff --git a/ci-scripts/xml_files/sa_cn5g_closure.xml b/ci-scripts/xml_files/sa_cn5g_closure.xml index 7174da3b7b..727e208d4c 100644 --- a/ci-scripts/xml_files/sa_cn5g_closure.xml +++ b/ci-scripts/xml_files/sa_cn5g_closure.xml @@ -32,6 +32,7 @@ Terminate_5GCN Terminate 5G Core + oc-cn5g diff --git a/ci-scripts/xml_files/sa_cn5g_start.xml b/ci-scripts/xml_files/sa_cn5g_start.xml index 6499d60700..3de615330a 100644 --- a/ci-scripts/xml_files/sa_cn5g_start.xml +++ b/ci-scripts/xml_files/sa_cn5g_start.xml @@ -33,5 +33,6 @@ Initialize_5GCN Initialize 5G Core + oc-cn5g diff --git a/ci-scripts/yaml_files/sa_fhi_7.2_benetel550_gnb/README.md b/ci-scripts/yaml_files/sa_fhi_7.2_benetel550_gnb/README.md new file mode 100644 index 0000000000..c9cf235bb2 --- /dev/null +++ b/ci-scripts/yaml_files/sa_fhi_7.2_benetel550_gnb/README.md @@ -0,0 +1,15 @@ + + + + + +
+ + + + + + OAI O-RAN 7.2 Front-haul Docker Compose +
+ +For instructions on OAI gNB Docker deployment with FH 7.2 RU, please refer to the [README](../sa_fhi_7.2_vvdn_gnb/README.md). diff --git a/ci-scripts/yaml_files/sa_fhi_7.2_benetel550_gnb/docker-compose.yml b/ci-scripts/yaml_files/sa_fhi_7.2_benetel550_gnb/docker-compose.yml new file mode 100644 index 0000000000..5783964bbe --- /dev/null +++ b/ci-scripts/yaml_files/sa_fhi_7.2_benetel550_gnb/docker-compose.yml @@ -0,0 +1,40 @@ +services: + oai-gnb: + image: oai-gnb-fhi72:latest + cap_add: + - SYS_ADMIN + - IPC_LOCK + - SYS_NICE + cap_drop: + - ALL + container_name: oai-gnb + environment: + TZ: Europe/Paris + USE_ADDITIONAL_OPTIONS: --sa --thread-pool 6,7,8,9 + devices: + - /dev/vfio:/dev/vfio/ + volumes: + - ../../conf_files/gnb.sa.band78.273prb.fhi72.4x4-benetel550.conf:/opt/oai-gnb/etc/gnb.conf + - /dev/hugepages:/dev/hugepages + # Please change these values based on your system + cpuset: "0,1,2,3,4,5,6,7,8,9" + networks: + oai-net: + ipv4_address: 172.21.18.20 + healthcheck: + test: /bin/bash -c "pgrep nr-softmodem" + interval: 10s + timeout: 5s + retries: 5 +networks: + oai-net: + driver: macvlan + name: oai-net + ipam: + config: + - subnet: "172.21.16.0/22" + ip_range: "172.21.18.20/32" + gateway: "172.21.19.254" + driver_opts: + com.docker.network.bridge.name: "oai-net" + parent: ens7f0 diff --git a/ci-scripts/yaml_files/sa_fhi_7.2_benetel550_gnb/setup_cleanup.sh b/ci-scripts/yaml_files/sa_fhi_7.2_benetel550_gnb/setup_cleanup.sh new file mode 100644 index 0000000000..9a06336acc --- /dev/null +++ b/ci-scripts/yaml_files/sa_fhi_7.2_benetel550_gnb/setup_cleanup.sh @@ -0,0 +1,5 @@ +set -e +sudo cpupower idle-set -E > /dev/null +sudo sysctl kernel.sched_rt_runtime_us=950000 +sudo sysctl kernel.timer_migration=1 +exit 0 diff --git a/ci-scripts/yaml_files/sa_fhi_7.2_benetel550_gnb/setup_sriov_benetel.sh b/ci-scripts/yaml_files/sa_fhi_7.2_benetel550_gnb/setup_sriov_benetel.sh new file mode 100644 index 0000000000..1bcf941ae0 --- /dev/null +++ b/ci-scripts/yaml_files/sa_fhi_7.2_benetel550_gnb/setup_sriov_benetel.sh @@ -0,0 +1,22 @@ +set -e +sudo cpupower idle-set -D 0 > /dev/null +sudo sysctl kernel.sched_rt_runtime_us=-1 +sudo sysctl kernel.timer_migration=0 +sudo ethtool -G ens7f1 rx 8160 +sudo ethtool -G ens7f1 tx 8160 +sudo ifconfig ens7f1 mtu 9216 +sudo sh -c 'echo 0 > /sys/class/net/ens7f1/device/sriov_numvfs' +sudo sh -c 'echo 2 > /sys/class/net/ens7f1/device/sriov_numvfs' +sudo modprobe -r iavf +sudo modprobe iavf +# this next 2 lines is for C/U planes +sudo ip link set ens7f1 vf 0 mac 00:11:22:33:44:66 vlan 3 qos 0 spoofchk off mtu 9216 +sudo ip link set ens7f1 vf 1 mac 00:11:22:33:44:67 vlan 3 qos 0 spoofchk off mtu 9216 +sleep 1 +# These are the DPDK bindings for C/U-planes on vlan 3 +sudo /usr/local/bin/dpdk-devbind.py --unbind c3:11.0 +sudo /usr/local/bin/dpdk-devbind.py --unbind c3:11.1 +sudo modprobe vfio-pci +sudo /usr/local/bin/dpdk-devbind.py --bind vfio-pci c3:11.0 +sudo /usr/local/bin/dpdk-devbind.py --bind vfio-pci c3:11.1 +exit 0 diff --git a/ci-scripts/yaml_files/sa_fhi_7.2_gnb/README.md b/ci-scripts/yaml_files/sa_fhi_7.2_vvdn_gnb/README.md similarity index 74% rename from ci-scripts/yaml_files/sa_fhi_7.2_gnb/README.md rename to ci-scripts/yaml_files/sa_fhi_7.2_vvdn_gnb/README.md index 1acbe7fb86..2fcf39ad2c 100644 --- a/ci-scripts/yaml_files/sa_fhi_7.2_gnb/README.md +++ b/ci-scripts/yaml_files/sa_fhi_7.2_vvdn_gnb/README.md @@ -14,35 +14,35 @@ ![Docker deploy 7.2](../../../doc/images/docker-deploy-oai-7-2.png) -This docker-compose is designed to use `OAI-gNB` with a 7.2 compatible Radio Unit. Before using this docker compose you have to configure -the host machine as per the [ORAN_FHI7.2_Tutorial](../../../doc/ORAN_FHI7.2_Tutorial.md). The container image used by the docker compose file is tested only on `Ubuntu 22.04` docker host. +This docker-compose is designed to use `OAI-gNB` with a 7.2 compatible Radio Unit. Before using this docker compose you have to configure +the host machine as per the [ORAN_FHI7.2_Tutorial](../../../doc/ORAN_FHI7.2_Tutorial.md). The container image used by the docker compose file is tested only on `Ubuntu 22.04` and `RHEL 9.4` docker host. ## Build Image (Optional) Refer to [OAI Docker/Podman Build and Usage Procedures](../../../docker/README.md) -## Configure Networking +## Configure Networking ### SR-IOV Virtual Functions (VFs) -In docker-compose environment there is no automated method -to configure the VFs on the fly. The user will have to manually configure -C/U plane VFs before starting the container `OAI-gNB`. +In docker-compose environment there is no automated method +to configure the VFs on the fly. The user will have to manually configure +C/U plane VFs before starting the container `OAI-gNB`. -You can follow the step +You can follow the step [configure-network-interfaces-and-dpdk-vfs](../../../doc/ORAN_FHI7.2_Tutorial.md#configure-network-interfaces-and-dpdk-vfs). ### Interface towards AMF (N2) -For `N2` interface we are using `macvlan` driver of docker. +For `N2` interface we are using `macvlan` driver of docker. -You can use the `bridge` driver, in situation +You can use the `bridge` driver, in situation -- When the core network is running on the same machine -- or different machine but you have configured -needed `ip route` and forwarding to access the core network from RAN host. +- When the core network is running on the same machine +- or different machine but you have configured +needed `ip route` and forwarding to access the core network from RAN host. -To configure docker `macvlan` network +To configure docker `macvlan` network you need to choose `ipam.config` and `driver_opts.parent` are per your environment ``` @@ -59,7 +59,7 @@ you need to choose `ipam.config` and `driver_opts.parent` are per your environme parent: enp193s0f0 ``` -To configure `bridge` network you need to choose `ipam.config.subnet` as per your environment. +To configure `bridge` network you need to choose `ipam.config.subnet` as per your environment. ``` oai-net: @@ -74,7 +74,7 @@ To configure `bridge` network you need to choose `ipam.config.subnet` as per you ## Deploy OAI-gNB Container -The [configuration file](../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-benetel650.conf) used by docker compose is configured for Benetel 650 RU (RAN650-1v1.0.4-dda1bf5). +The [configuration file](../../conf_files/gnb.sa.band77.273prb.fhi72.4x4-vvdn.conf) used by docker compose is configured for VVDN RU. ```bash docker-compose up -d diff --git a/ci-scripts/yaml_files/sa_fhi_7.2_gnb/docker-compose.yml b/ci-scripts/yaml_files/sa_fhi_7.2_vvdn_gnb/docker-compose.yml similarity index 65% rename from ci-scripts/yaml_files/sa_fhi_7.2_gnb/docker-compose.yml rename to ci-scripts/yaml_files/sa_fhi_7.2_vvdn_gnb/docker-compose.yml index e3e93b3b74..2798a8e8fc 100644 --- a/ci-scripts/yaml_files/sa_fhi_7.2_gnb/docker-compose.yml +++ b/ci-scripts/yaml_files/sa_fhi_7.2_vvdn_gnb/docker-compose.yml @@ -1,17 +1,23 @@ services: oai-gnb: image: oai-gnb-fhi72:latest - privileged: true + cap_add: + - SYS_ADMIN + - IPC_LOCK + - SYS_NICE + cap_drop: + - ALL container_name: oai-gnb environment: TZ: Europe/Paris - USE_ADDITIONAL_OPTIONS: --sa --thread-pool 13,14,15,16,17,18 + USE_ADDITIONAL_OPTIONS: --sa --thread-pool 6,7,8,9 devices: - /dev/vfio:/dev/vfio/ volumes: - - ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-benetel650.conf:/opt/oai-gnb/etc/gnb.conf + - ../../conf_files/gnb.sa.band77.273prb.fhi72.4x4-vvdn.conf:/opt/oai-gnb/etc/gnb.conf - /dev/hugepages:/dev/hugepages - cpuset: "0,1,2,8,9,10,13,14,15,16,17,18" + # Please change these values based on your system + cpuset: "0,1,2,3,4,5,6,7,8,9" networks: oai-net: ipv4_address: 172.21.18.20 @@ -31,4 +37,4 @@ networks: gateway: "172.21.19.254" driver_opts: com.docker.network.bridge.name: "oai-net" - parent: enp193s0f0 + parent: ens7f0 diff --git a/ci-scripts/yaml_files/sa_fhi_7.2_vvdn_gnb/setup_cleanup.sh b/ci-scripts/yaml_files/sa_fhi_7.2_vvdn_gnb/setup_cleanup.sh new file mode 100644 index 0000000000..9a06336acc --- /dev/null +++ b/ci-scripts/yaml_files/sa_fhi_7.2_vvdn_gnb/setup_cleanup.sh @@ -0,0 +1,5 @@ +set -e +sudo cpupower idle-set -E > /dev/null +sudo sysctl kernel.sched_rt_runtime_us=950000 +sudo sysctl kernel.timer_migration=1 +exit 0 diff --git a/ci-scripts/yaml_files/sa_fhi_7.2_vvdn_gnb/setup_sriov_vvdn.sh b/ci-scripts/yaml_files/sa_fhi_7.2_vvdn_gnb/setup_sriov_vvdn.sh new file mode 100644 index 0000000000..2b7a512f83 --- /dev/null +++ b/ci-scripts/yaml_files/sa_fhi_7.2_vvdn_gnb/setup_sriov_vvdn.sh @@ -0,0 +1,21 @@ +set -e +sudo cpupower idle-set -D 0 > /dev/null +sudo sysctl kernel.sched_rt_runtime_us=-1 +sudo sysctl kernel.timer_migration=0 +sudo ethtool -G ens7f1 rx 8160 +sudo ethtool -G ens7f1 tx 8160 +sudo sh -c 'echo 0 > /sys/class/net/ens7f1/device/sriov_numvfs' +sudo sh -c 'echo 2 > /sys/class/net/ens7f1/device/sriov_numvfs' +sudo modprobe -r iavf +sudo modprobe iavf +# this next 2 lines is for C/U planes +sudo ip link set ens7f1 vf 0 mac 76:76:64:6e:00:01 vlan 4 spoofchk off mtu 9216 +sudo ip link set ens7f1 vf 1 mac 76:76:64:6e:00:00 vlan 4 spoofchk off mtu 9216 +sleep 1 +# These are the DPDK bindings for C/U-planes on vlan 4 +sudo /usr/local/bin/dpdk-devbind.py --unbind c3:11.0 +sudo /usr/local/bin/dpdk-devbind.py --unbind c3:11.1 +sudo modprobe vfio-pci +sudo /usr/local/bin/dpdk-devbind.py --bind vfio-pci c3:11.0 +sudo /usr/local/bin/dpdk-devbind.py --bind vfio-pci c3:11.1 +exit 0 diff --git a/doc/TESTBenches.md b/doc/TESTBenches.md index 53e0ed3054..ec918a6e33 100644 --- a/doc/TESTBenches.md +++ b/doc/TESTBenches.md @@ -199,6 +199,12 @@ information on how the images are built. ~5G-NR - matix + N310 (gNB), up2 + COTS UE (Quectel RM520N), OAI 5GC deployed in docker on matix - NR performance tests: 2x2 configuration, 60 MHz and 100 MHz bandwidth +- [RAN-SA-FHI72-CN5G](https://jenkins-oai.eurecom.fr/view/RAN/job/RAN-SA-FHI72-CN5G/) + ~5G-NR + - cacofonix + FHI72 + Benetel550 (gNB), AmariUE, OAI CN5G + - cacofonix + FHI72 + VVDN (gNB), up2 (Quectel RM520N UE), OAI CN5G + - OpenShift cluster for CN deployment + - FHI 7.2 testing with 100 MHz bandwidth, 2 layers in DL ### RAN-CI-NSA-Trigger