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/cls_containerize.py b/ci-scripts/cls_containerize.py
index 259db7bffe..6abf444a0d 100644
--- a/ci-scripts/cls_containerize.py
+++ b/ci-scripts/cls_containerize.py
@@ -567,8 +567,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 +590,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/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/epc.py b/ci-scripts/epc.py
index 0e0afefaaf..9113d29ac9 100644
--- a/ci-scripts/epc.py
+++ b/ci-scripts/epc.py
@@ -311,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):
diff --git a/ci-scripts/main.py b/ci-scripts/main.py
index adef885942..448f2636e3 100644
--- a/ci-scripts/main.py
+++ b/ci-scripts/main.py
@@ -919,6 +919,8 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re
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':
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/xml_files/container_nsa_b200_quectel.xml b/ci-scripts/xml_files/container_nsa_b200_quectel.xml
index 8d04be3efd..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
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/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_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 a7fd0fc0d7..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
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/lte_2x2_tm1_quectel.xml b/ci-scripts/xml_files/lte_2x2_tm1_quectel.xml
index 0d18a52839..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
diff --git a/ci-scripts/xml_files/lte_2x2_tm2_quectel.xml b/ci-scripts/xml_files/lte_2x2_tm2_quectel.xml
index f84691ab48..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
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/doc/TESTBenches.md b/doc/TESTBenches.md
index 547fd5a23b..c6a01f278d 100644
--- a/doc/TESTBenches.md
+++ b/doc/TESTBenches.md
@@ -9,19 +9,19 @@
| Machine | IP address | Lockable Resource | Function | Connected devices |
| ------------- | --------------- | --------------------- | ------------------ | ----------------------------------------------------- |
-| asterix | 172.21.16.127 | CI-Asterix-Usage | gNB | 173.21.19.14 |
-| obelix | 172.21.16.128 | CI-Obelix-Usage | eNB, UE (5G) | 172.21.19.13, X300 (192.168.60.2), B200mini (30C51EB) |
+| 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 | B200mini (30C51D4) |
+| 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 | TBD | Amarisoft UE simulator |
+| 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 4G (B) | B200mini (30AE8C9) |
+| 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/):
@@ -40,7 +40,7 @@ Note: The available resources, and their current usage, is indicated here:
### OTA Testbench
-[Proper image to be followed up. TBD: add antennas/circulators]
+**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!
@@ -89,7 +89,10 @@ Webhook
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, known to be instable
+ - 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.)
diff --git a/doc/testbenches_doc_resources/4g-faraday-bench.pdf b/doc/testbenches_doc_resources/4g-faraday-bench.pdf
index 7e31789e9a..f6f7b078e6 100644
Binary files a/doc/testbenches_doc_resources/4g-faraday-bench.pdf and b/doc/testbenches_doc_resources/4g-faraday-bench.pdf differ
diff --git a/doc/testbenches_doc_resources/4g-faraday-bench.png b/doc/testbenches_doc_resources/4g-faraday-bench.png
index c69065a369..598715a193 100644
Binary files a/doc/testbenches_doc_resources/4g-faraday-bench.png and b/doc/testbenches_doc_resources/4g-faraday-bench.png differ
diff --git a/doc/testbenches_doc_resources/5g-nsa-faraday-bench.pdf b/doc/testbenches_doc_resources/5g-nsa-faraday-bench.pdf
index f6d960c1a2..1b921e6437 100644
Binary files a/doc/testbenches_doc_resources/5g-nsa-faraday-bench.pdf and b/doc/testbenches_doc_resources/5g-nsa-faraday-bench.pdf differ
diff --git a/doc/testbenches_doc_resources/5g-nsa-faraday-bench.png b/doc/testbenches_doc_resources/5g-nsa-faraday-bench.png
index c677b598e9..006e6ab347 100644
Binary files a/doc/testbenches_doc_resources/5g-nsa-faraday-bench.png and b/doc/testbenches_doc_resources/5g-nsa-faraday-bench.png differ
diff --git a/doc/testbenches_doc_resources/5g-nsa-faraday-bench.tex b/doc/testbenches_doc_resources/5g-nsa-faraday-bench.tex
index 66b52f7f69..a9f12fe3df 100644
--- a/doc/testbenches_doc_resources/5g-nsa-faraday-bench.tex
+++ b/doc/testbenches_doc_resources/5g-nsa-faraday-bench.tex
@@ -30,7 +30,7 @@
\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] {B78} (antn);
+ \draw (b210n) -| node [pos=0.2, duplexer] {n78} (antn);
\node[left=5cm of faraday, label=above:porcepix] (porcepix)
{\includegraphics[width=1.2cm]{server}};
diff --git a/doc/testbenches_doc_resources/5g-ota-bench.pdf b/doc/testbenches_doc_resources/5g-ota-bench.pdf
index e4d4c15e39..121969030e 100644
Binary files a/doc/testbenches_doc_resources/5g-ota-bench.pdf and b/doc/testbenches_doc_resources/5g-ota-bench.pdf differ
diff --git a/doc/testbenches_doc_resources/5g-ota-bench.png b/doc/testbenches_doc_resources/5g-ota-bench.png
index c93de7ec6f..86ae6b2b64 100644
Binary files a/doc/testbenches_doc_resources/5g-ota-bench.png and b/doc/testbenches_doc_resources/5g-ota-bench.png differ
diff --git a/doc/testbenches_doc_resources/5g-ota-bench.tex b/doc/testbenches_doc_resources/5g-ota-bench.tex
index cfd0bda22d..c3a524fb0a 100644
--- a/doc/testbenches_doc_resources/5g-ota-bench.tex
+++ b/doc/testbenches_doc_resources/5g-ota-bench.tex
@@ -21,7 +21,7 @@
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) {B78} edge (n310a);
+ \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)
@@ -32,20 +32,20 @@
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) {B40} edge (n310o);
+ \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) {B78} edge (x310o);
+ \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[right=5.0cm of n310o, label=above:RM500Q-GL] (quectel)
+ \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);
@@ -59,5 +59,10 @@
{\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/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/openair1/PHY/NR_TRANSPORT/nr_pbch.c b/openair1/PHY/NR_TRANSPORT/nr_pbch.c
index fc7df46496..278c2dfd58 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_pbch.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_pbch.c
@@ -35,6 +35,7 @@
#include "PHY/NR_TRANSPORT/nr_transport_proto.h"
#include "PHY/LTE_REFSIG/lte_refsig.h"
#include "PHY/sse_intrin.h"
+#include "executables/softmodem-common.h"
//#define DEBUG_PBCH
//#define DEBUG_PBCH_ENCODING
@@ -248,6 +249,9 @@ int nr_generate_pbch(nfapi_nr_dl_tti_ssb_pdu *ssb_pdu,
for (int i=0; ipbch_a |= ((pbch_pdu[i>>3]>>(7-(i&7)))&1)<sa ? config->ssb_table.ssb_subcarrier_offset.value : 31;
+
#ifdef DEBUG_PBCH_ENCODING
for (int i=0; i<3; i++)
printf("pbch_pdu[%d]: 0x%02x\n", i, pbch_pdu[i]);
@@ -265,7 +269,7 @@ int nr_generate_pbch(nfapi_nr_dl_tti_ssb_pdu *ssb_pdu,
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)
+ pbch->pbch_a |= ((ssb_sc_offset>>4)&1)<<29; //MSB of k_SSB (bit index 4)
LOG_D(PHY,"After extra byte: pbch_a = 0x%08x\n",pbch->pbch_a);
diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c
index 2ef9cc60bc..2a6ff37b4c 100644
--- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c
+++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c
@@ -73,8 +73,11 @@ void nr_common_signal_procedures (PHY_VARS_gNB *gNB,int frame,int slot,nfapi_nr_
ssb_start_symbol = ssb_start_symbol_abs % fp->symbols_per_slot; // start symbol wrt slot
// setting the first subcarrier
- fp->ssb_start_subcarrier = (12 * cfg->ssb_table.ssb_offset_point_a.value + ssb_pdu.ssb_pdu_rel15.SsbSubcarrierOffset);
- LOG_D(PHY, "SSB first subcarrier %d (%d,%d)\n", fp->ssb_start_subcarrier,cfg->ssb_table.ssb_offset_point_a.value,ssb_pdu.ssb_pdu_rel15.SsbSubcarrierOffset);
+ 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;
+ 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,"SS TX: frame %d, slot %d, start_symbol %d\n",frame,slot, ssb_start_symbol);
nr_generate_pss(&txdataF[0][txdataF_offset], AMP, ssb_start_symbol, cfg, fp);
@@ -703,7 +706,7 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) {
/* those variables to log T_GNB_PHY_PUCCH_PUSCH_IQ only when we try to decode */
int pucch_decode_done = 0;
int pusch_decode_done = 0;
- int phy_procedures_errors = 0;
+ int pusch_DTX = 0;
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_gNB_UESPEC_RX,1);
LOG_D(PHY,"phy_procedures_gNB_uespec_RX frame %d, slot %d\n",frame_rx,slot_rx);
@@ -843,7 +846,7 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) {
if (no_sig) {
LOG_D(PHY, "PUSCH not detected in frame %d, slot %d\n", frame_rx, slot_rx);
nr_fill_indication(gNB, frame_rx, slot_rx, ULSCH_id, harq_pid, 1,1);
- phy_procedures_errors++;
+ pusch_DTX++;
continue;
}
gNB->pusch_vars[ULSCH_id]->ulsch_power_tot=0;
@@ -868,7 +871,7 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) {
/* in case of phy_test mode, we still want to decode to measure execution time.
Therefore, we don't yet call nr_fill_indication, it will be called later */
nr_fill_indication(gNB,frame_rx, slot_rx, ULSCH_id, harq_pid, 1,1);
- phy_procedures_errors++;
+ pusch_DTX++;
continue;
}
} else {
@@ -1106,5 +1109,5 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) {
}
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_gNB_UESPEC_RX,0);
- return phy_procedures_errors;
+ return pusch_DTX;
}
diff --git a/openair1/SIMULATION/NR_PHY/pbchsim.c b/openair1/SIMULATION/NR_PHY/pbchsim.c
index b05fc8ba2d..c46af048f5 100644
--- a/openair1/SIMULATION/NR_PHY/pbchsim.c
+++ b/openair1/SIMULATION/NR_PHY/pbchsim.c
@@ -67,7 +67,10 @@ openair0_config_t openair0_cfg[MAX_CARDS];
uint8_t const nr_rv_round_map[4] = {0, 2, 3, 1};
uint64_t get_softmodem_optmask(void) {return 0;}
-softmodem_params_t *get_softmodem_params(void) {return 0;}
+static softmodem_params_t softmodem_params;
+softmodem_params_t *get_softmodem_params(void) {
+ return &softmodem_params;
+}
void init_downlink_harq_status(NR_DL_UE_HARQ_t *dl_harq) {}
@@ -182,6 +185,7 @@ int main(int argc, char **argv)
int ssb_subcarrier_offset = 0;
channel_desc_t *gNB2UE;
+ get_softmodem_params()->sa = 1;
//uint8_t extended_prefix_flag=0;
//int8_t interf1=-21,interf2=-21;
@@ -468,6 +472,7 @@ int main(int argc, char **argv)
frame_parms->Nid_cell = Nid_cell;
frame_parms->nushift = Nid_cell%4;
frame_parms->ssb_type = nr_ssb_type_C;
+ frame_parms->freq_range = mu<2 ? nr_FR1 : nr_FR2;
nr_phy_config_request_sim_pbchsim(gNB,N_RB_DL,N_RB_DL,mu,Nid_cell,SSB_positions);
phy_init_nr_gNB(gNB,0,1);
@@ -592,9 +597,12 @@ int main(int argc, char **argv)
for (i=0; iLmax; i++) {
if((SSB_positions >> i) & 0x01) {
+ const int sc_offset = frame_parms->freq_range == nr_FR1 ? ssb_subcarrier_offset<freq_range == nr_FR1 ? gNB->gNB_config.ssb_table.ssb_offset_point_a.value<gNB_config.ssb_table.ssb_offset_point_a.value << (mu - 2);
msgDataTx.ssb[i].ssb_pdu.ssb_pdu_rel15.bchPayload = 0x55dd33;
msgDataTx.ssb[i].ssb_pdu.ssb_pdu_rel15.SsbBlockIndex = i;
- msgDataTx.ssb[i].ssb_pdu.ssb_pdu_rel15.SsbSubcarrierOffset = ssb_subcarrier_offset;
+ msgDataTx.ssb[i].ssb_pdu.ssb_pdu_rel15.SsbSubcarrierOffset = sc_offset;
+ msgDataTx.ssb[i].ssb_pdu.ssb_pdu_rel15.ssbOffsetPointA = prb_offset;
start_symbol = nr_get_ssb_start_symbol(frame_parms,i);
int slot = start_symbol/14;
diff --git a/openair2/LAYER2/NR_MAC_gNB/config.c b/openair2/LAYER2/NR_MAC_gNB/config.c
index 218b75b2e8..4daddbf03a 100644
--- a/openair2/LAYER2/NR_MAC_gNB/config.c
+++ b/openair2/LAYER2/NR_MAC_gNB/config.c
@@ -335,22 +335,13 @@ void config_common(int Mod_idP, int pdsch_AntennaPorts, int pusch_AntennaPorts,
cfg->num_tlv++;
// SSB Table Configuration
- int scs_scaling = 1<<(cfg->ssb_config.scs_common.value);
- if (scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA < 600000)
- scs_scaling = scs_scaling*3;
- if (scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA > 2016666)
- scs_scaling = scs_scaling>>2;
uint32_t absolute_diff = (*scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB - scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA);
-
- RC.nrmac[Mod_idP]->ssb_SubcarrierOffset = absolute_diff%(12*scs_scaling);
- int sco = 31; // no SIB1
- if(get_softmodem_params()->sa) {
- sco = RC.nrmac[Mod_idP]->ssb_SubcarrierOffset;
- if(frequency_range == FR1)
- sco <<= cfg->ssb_config.scs_common.value; // 38.211 section 7.4.3.1 in FR1 it is expresses in terms of 15kHz SCS
- }
-
- cfg->ssb_table.ssb_offset_point_a.value = absolute_diff/(12*scs_scaling) - 10; //absoluteFrequencySSB is the central frequency of SSB which is made by 20RBs in total
+ const int scaling_5khz = scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA < 600000 ? 3 : 1;
+ int sco = (absolute_diff*scaling_5khz) % 24;
+ if(frequency_range == FR2)
+ sco >>= 1; // this assumes 120kHz SCS for SSB and subCarrierSpacingCommon (only option supported by OAI for
+ const int scs_scaling = frequency_range == FR2 ? 1 << (*scc->ssbSubcarrierSpacing - 2) : 1 << *scc->ssbSubcarrierSpacing;
+ cfg->ssb_table.ssb_offset_point_a.value = absolute_diff/(12*scaling_5khz) - 10*scs_scaling; //absoluteFrequencySSB is the central frequency of SSB which is made by 20RBs in total
cfg->ssb_table.ssb_offset_point_a.tl.tag = NFAPI_NR_CONFIG_SSB_OFFSET_POINT_A_TAG;
cfg->num_tlv++;
cfg->ssb_table.ssb_period.value = *scc->ssb_periodicityServingCell;
@@ -360,6 +351,9 @@ void config_common(int Mod_idP, int pdsch_AntennaPorts, int pusch_AntennaPorts,
cfg->ssb_table.ssb_subcarrier_offset.tl.tag = NFAPI_NR_CONFIG_SSB_SUBCARRIER_OFFSET_TAG;
cfg->num_tlv++;
+ RC.nrmac[Mod_idP]->ssb_SubcarrierOffset = cfg->ssb_table.ssb_subcarrier_offset.value;
+ RC.nrmac[Mod_idP]->ssb_OffsetPointA = cfg->ssb_table.ssb_offset_point_a.value;
+
switch (scc->ssb_PositionsInBurst->present) {
case 1 :
cfg->ssb_table.ssb_mask_list[0].ssb_mask.value = scc->ssb_PositionsInBurst->choice.shortBitmap.buf[0]<<24;
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c
index e2ceadb889..828cb2b880 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c
@@ -54,52 +54,6 @@
extern RAN_CONTEXT_t RC;
-
-uint16_t get_ssboffset_pointa(NR_ServingCellConfigCommon_t *scc,const long band) {
-
- int ratio;
- switch (*scc->ssbSubcarrierSpacing) {
- case NR_SubcarrierSpacing_kHz15:
- AssertFatal(band <= 95,
- "Band %ld is not possible for SSB with 15 kHz SCS\n",
- band);
- // no band available above 3GHz using 15kHz
- ratio = 3; // NRARFCN step is 5 kHz
- break;
- case NR_SubcarrierSpacing_kHz30:
- AssertFatal(band <= 96,
- "Band %ld is not possible for SSB with 30 kHz SCS\n",
- band);
- if (band == 46 || band == 48 || band == 77 ||
- band == 78 || band == 79 || band == 96) // above 3GHz
- ratio = 2; // NRARFCN step is 15 kHz
- else
- ratio = 6; // NRARFCN step is 5 kHz
- break;
- case NR_SubcarrierSpacing_kHz120:
- AssertFatal(band >= 257,
- "Band %ld is not possible for SSB with 120 kHz SCS\n",
- band);
- ratio = 2; // NRARFCN step is 15 kHz
- break;
- case NR_SubcarrierSpacing_kHz240:
- AssertFatal(band >= 257,
- "Band %ld is not possible for SSB with 240 kHz SCS\n",
- band);
- ratio = 4; // NRARFCN step is 15 kHz
- break;
- default:
- AssertFatal(1 == 0, "SCS %ld not allowed for SSB \n",
- *scc->ssbSubcarrierSpacing);
- }
-
- const uint32_t ssb_offset0 = *scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB - scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA;
-
- return (ssb_offset0/(ratio*12) - 10); // absoluteFrequencySSB is the center of SSB
-
-}
-
-
void schedule_ssb(frame_t frame, sub_frame_t slot,
NR_ServingCellConfigCommon_t *scc,
nfapi_nr_dl_tti_request_body_t *dl_req,
@@ -190,7 +144,7 @@ void schedule_nr_mib(module_id_t module_idP, frame_t frameP, sub_frame_t slotP)
NR_SubcarrierSpacing_t scs = *scc->ssbSubcarrierSpacing;
const long band = *scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0];
- uint16_t offset_pointa = get_ssboffset_pointa(scc,band);
+ const uint16_t offset_pointa = gNB->ssb_OffsetPointA;
uint8_t ssbSubcarrierOffset = gNB->ssb_SubcarrierOffset;
const BIT_STRING_t *shortBitmap = &scc->ssb_PositionsInBurst->choice.shortBitmap;
@@ -207,8 +161,9 @@ void schedule_nr_mib(module_id_t module_idP, frame_t frameP, sub_frame_t slotP)
ssb_start_symbol = get_ssb_start_symbol(band,scs,i_ssb);
// if start symbol is in current slot, schedule current SSB, fill VRB map and call get_type0_PDCCH_CSS_config_parameters
if ((ssb_start_symbol/14) == rel_slot){
+ const int prb_offset = offset_pointa >> scs;
schedule_ssb(frameP, slotP, scc, dl_req, i_ssb, ssbSubcarrierOffset, offset_pointa, (*(uint32_t*)cc->MIB_pdu.payload) & ((1<<24)-1));
- fill_ssb_vrb_map(cc, offset_pointa, ssb_start_symbol, CC_id);
+ fill_ssb_vrb_map(cc, prb_offset, ssbSubcarrierOffset, ssb_start_symbol, CC_id);
if (get_softmodem_params()->sa == 1) {
get_type0_PDCCH_CSS_config_parameters(&gNB->type0_PDCCH_CSS_config[i_ssb],
frameP,
@@ -221,7 +176,7 @@ void schedule_nr_mib(module_id_t module_idP, frame_t frameP, sub_frame_t slotP)
band,
i_ssb,
ssb_frame_periodicity,
- offset_pointa);
+ prb_offset);
gNB->type0_PDCCH_CSS_config[i_ssb].active = true;
}
}
@@ -235,8 +190,9 @@ void schedule_nr_mib(module_id_t module_idP, frame_t frameP, sub_frame_t slotP)
ssb_start_symbol = get_ssb_start_symbol(band,scs,i_ssb);
// if start symbol is in current slot, schedule current SSB, fill VRB map and call get_type0_PDCCH_CSS_config_parameters
if ((ssb_start_symbol/14) == rel_slot){
+ const int prb_offset = offset_pointa >> scs;
schedule_ssb(frameP, slotP, scc, dl_req, i_ssb, ssbSubcarrierOffset, offset_pointa, (*(uint32_t*)cc->MIB_pdu.payload) & ((1<<24)-1));
- fill_ssb_vrb_map(cc, offset_pointa, ssb_start_symbol, CC_id);
+ fill_ssb_vrb_map(cc, prb_offset, ssbSubcarrierOffset, ssb_start_symbol, CC_id);
if (get_softmodem_params()->sa == 1) {
get_type0_PDCCH_CSS_config_parameters(&gNB->type0_PDCCH_CSS_config[i_ssb],
frameP,
@@ -249,7 +205,7 @@ void schedule_nr_mib(module_id_t module_idP, frame_t frameP, sub_frame_t slotP)
band,
i_ssb,
ssb_frame_periodicity,
- offset_pointa);
+ prb_offset);
gNB->type0_PDCCH_CSS_config[i_ssb].active = true;
}
}
@@ -264,8 +220,9 @@ void schedule_nr_mib(module_id_t module_idP, frame_t frameP, sub_frame_t slotP)
ssb_start_symbol = get_ssb_start_symbol(band,scs,i_ssb);
// if start symbol is in current slot, schedule current SSB, fill VRB map and call get_type0_PDCCH_CSS_config_parameters
if ((ssb_start_symbol/14) == rel_slot){
+ const int prb_offset = offset_pointa >> (scs-2); // reference 60kHz
schedule_ssb(frameP, slotP, scc, dl_req, i_ssb, ssbSubcarrierOffset, offset_pointa, (*(uint32_t*)cc->MIB_pdu.payload) & ((1<<24)-1));
- fill_ssb_vrb_map(cc, offset_pointa, ssb_start_symbol, CC_id);
+ fill_ssb_vrb_map(cc, prb_offset, ssbSubcarrierOffset, ssb_start_symbol, CC_id);
const NR_TDD_UL_DL_Pattern_t *tdd = &scc->tdd_UL_DL_ConfigurationCommon->pattern1;
const int n_slots_frame = nr_slots_per_frame[*scc->ssbSubcarrierSpacing];
// FR2 is only TDD, to be fixed for flexible TDD
@@ -286,7 +243,7 @@ void schedule_nr_mib(module_id_t module_idP, frame_t frameP, sub_frame_t slotP)
band,
i_ssb,
ssb_frame_periodicity,
- offset_pointa);
+ prb_offset);
gNB->type0_PDCCH_CSS_config[i_ssb].active = true;
}
}
@@ -306,7 +263,7 @@ void schedule_nr_SI(module_id_t module_idP, frame_t frameP, sub_frame_t subframe
//----------------------------------------
}
-void fill_ssb_vrb_map (NR_COMMON_channels_t *cc, int rbStart, uint16_t symStart, int CC_id) {
+void fill_ssb_vrb_map (NR_COMMON_channels_t *cc, int rbStart, int ssb_subcarrier_offset, uint16_t symStart, int CC_id) {
AssertFatal(*cc->ServingCellConfigCommon->ssbSubcarrierSpacing !=
NR_SubcarrierSpacing_kHz240,
@@ -314,7 +271,8 @@ void fill_ssb_vrb_map (NR_COMMON_channels_t *cc, int rbStart, uint16_t symStart
uint16_t *vrb_map = cc[CC_id].vrb_map;
- for (int rb = 0; rb < 20; rb++)
+ const int extra_prb = ssb_subcarrier_offset > 0;
+ for (int rb = 0; rb < 20+extra_prb; rb++)
vrb_map[rbStart + rb] = SL_to_bitmap(symStart, 4);
}
diff --git a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h
index 85d17081d9..ee63cab32d 100644
--- a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h
+++ b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h
@@ -436,7 +436,7 @@ int binomial(int n, int k);
bool is_xlsch_in_slot(uint64_t bitmap, sub_frame_t slot);
-void fill_ssb_vrb_map (NR_COMMON_channels_t *cc, int rbStart, uint16_t symStart, int CC_id);
+void fill_ssb_vrb_map (NR_COMMON_channels_t *cc, int rbStart, int ssb_subcarrier_offset, uint16_t symStart, int CC_id);
/* \brief Function to indicate a received SDU on ULSCH.
diff --git a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
index 44f8c3ba84..2af27acc25 100644
--- a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
+++ b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
@@ -769,6 +769,7 @@ typedef struct gNB_MAC_INST_s {
int pusch_failure_thres;
/// Subcarrier Offset
int ssb_SubcarrierOffset;
+ int ssb_OffsetPointA;
/// SIB1 Time domain allocation
int sib1_tda;
int minRXTXTIMEpdsch;
diff --git a/openair2/RRC/NR/MESSAGES/asn1_msg.c b/openair2/RRC/NR/MESSAGES/asn1_msg.c
index 66394c3047..806658fabb 100755
--- a/openair2/RRC/NR/MESSAGES/asn1_msg.c
+++ b/openair2/RRC/NR/MESSAGES/asn1_msg.c
@@ -226,17 +226,13 @@ uint8_t do_MIB_NR(gNB_RRC_INST *rrc,uint32_t frame) {
AssertFatal(scc->ssbSubcarrierSpacing != NULL, "scc->ssbSubcarrierSpacing is null\n");
int band = *scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0];
frequency_range_t frequency_range = band<100?FR1:FR2;
- int scs_scaling = 1<<*scc->ssbSubcarrierSpacing;
- if (scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA < 600000)
- scs_scaling = scs_scaling*3;
- if (scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA > 2016666)
- scs_scaling = scs_scaling>>2;
- uint32_t absolute_diff = (*scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB - scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA);
int ssb_subcarrier_offset = 31; // default value for NSA
if (get_softmodem_params()->sa) {
- ssb_subcarrier_offset = absolute_diff%(12*scs_scaling);
- if(frequency_range == FR1)
- ssb_subcarrier_offset <<= *scc->ssbSubcarrierSpacing;
+ uint32_t absolute_diff = (*scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB - scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA);
+ int scs_scaling = scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA < 600000 ? 3 : 1;
+ ssb_subcarrier_offset = (absolute_diff*scs_scaling)%24;
+ if(frequency_range == FR2)
+ ssb_subcarrier_offset >>= 1; // this assumes 120kHz SCS for SSB and subCarrierSpacingCommon (only option supported by OAI for now)
}
mib->message.choice.mib->ssb_SubcarrierOffset = ssb_subcarrier_offset&15;
diff --git a/openair2/RRC/NR/rrc_gNB.c b/openair2/RRC/NR/rrc_gNB.c
index 43082003df..648df1a306 100755
--- a/openair2/RRC/NR/rrc_gNB.c
+++ b/openair2/RRC/NR/rrc_gNB.c
@@ -197,7 +197,7 @@ static void init_NR_SI(gNB_RRC_INST *rrc, gNB_RrcConfigurationReq *configuration
}
char openair_rrc_gNB_configuration(const module_id_t gnb_mod_idP, gNB_RrcConfigurationReq *configuration) {
- protocol_ctxt_t ctxt;
+ protocol_ctxt_t ctxt = { 0 };
gNB_RRC_INST *rrc=RC.nrrrc[gnb_mod_idP];
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, gnb_mod_idP, GNB_FLAG_YES, NOT_A_RNTI, 0, 0,gnb_mod_idP);
LOG_I(NR_RRC,
@@ -1949,7 +1949,7 @@ int nr_rrc_reconfiguration_req(rrc_gNB_ue_context_t *const ue_context_pP
NULL,
NULL,
NULL,
- NULL,
+ ue_context_pP,
NULL,
NULL,
NULL,
@@ -3030,11 +3030,13 @@ void rrc_gNB_process_dc_overall_timeout(const module_id_t gnb_mod_idP, x2ap_ENDC
static int rrc_process_DU_DL(MessageDef *msg_p, const char *msg_name, instance_t instance) {
NRDuDlReq_t * req=&NRDuDlReq(msg_p);
- protocol_ctxt_t ctxt;
- ctxt.rnti = req->rnti;
- ctxt.module_id = instance;
- ctxt.instance = instance;
- ctxt.enb_flag = 1;
+ protocol_ctxt_t ctxt = {
+ .rnti = req->rnti,
+ .module_id = instance,
+ .instance = instance,
+ .enb_flag = 1,
+ .eNB_index = instance
+ };
gNB_RRC_INST *rrc = RC.nrrrc[ctxt.module_id];
struct rrc_gNB_ue_context_s *ue_context_p =
rrc_gNB_get_ue_context(rrc, ctxt.rnti);
@@ -3285,11 +3287,13 @@ return 0;
static void rrc_DU_process_ue_context_setup_request(MessageDef *msg_p, const char *msg_name, instance_t instance){
f1ap_ue_context_setup_t * req=&F1AP_UE_CONTEXT_SETUP_REQ(msg_p);
- protocol_ctxt_t ctxt;
- ctxt.rnti = req->rnti;
- ctxt.module_id = instance;
- ctxt.instance = instance;
- ctxt.enb_flag = 1;
+ protocol_ctxt_t ctxt = {
+ .rnti = req->rnti,
+ .module_id = instance,
+ .instance = instance,
+ .enb_flag = 1,
+ .eNB_index = instance
+ };
gNB_RRC_INST *rrc = RC.nrrrc[ctxt.module_id];
gNB_MAC_INST *mac = RC.nrmac[ctxt.module_id];
struct rrc_gNB_ue_context_s *ue_context_p =
@@ -3515,11 +3519,13 @@ static void rrc_DU_process_ue_context_setup_request(MessageDef *msg_p, const cha
static void rrc_DU_process_ue_context_modification_request(MessageDef *msg_p, const char *msg_name, instance_t instance){
f1ap_ue_context_setup_t * req=&F1AP_UE_CONTEXT_MODIFICATION_REQ(msg_p);
- protocol_ctxt_t ctxt;
- ctxt.rnti = req->rnti;
- ctxt.module_id = instance;
- ctxt.instance = instance;
- ctxt.enb_flag = 1;
+ protocol_ctxt_t ctxt = {
+ .rnti = req->rnti,
+ .module_id = instance,
+ .instance = instance,
+ .enb_flag = 1,
+ .eNB_index = instance
+ };
gNB_RRC_INST *rrc = RC.nrrrc[ctxt.module_id];
gNB_MAC_INST *mac = RC.nrmac[ctxt.module_id];
struct rrc_gNB_ue_context_s *ue_context_p =
@@ -3664,11 +3670,13 @@ static void rrc_DU_process_ue_context_modification_request(MessageDef *msg_p, co
static void rrc_CU_process_ue_context_setup_response(MessageDef *msg_p, const char *msg_name, instance_t instance){
f1ap_ue_context_setup_t * resp=&F1AP_UE_CONTEXT_SETUP_RESP(msg_p);
- protocol_ctxt_t ctxt;
- ctxt.rnti = resp->rnti;
- ctxt.module_id = instance;
- ctxt.instance = instance;
- ctxt.enb_flag = 1;
+ protocol_ctxt_t ctxt = {
+ .rnti = resp->rnti,
+ .module_id = instance,
+ .instance = instance,
+ .enb_flag = 1,
+ .eNB_index = instance
+ };
gNB_RRC_INST *rrc = RC.nrrrc[ctxt.module_id];
struct rrc_gNB_ue_context_s *ue_context_p = rrc_gNB_get_ue_context(rrc, ctxt.rnti);
NR_CellGroupConfig_t *cellGroupConfig = NULL;
@@ -3721,12 +3729,13 @@ static void rrc_CU_process_ue_context_setup_response(MessageDef *msg_p, const ch
static void rrc_CU_process_ue_context_modification_response(MessageDef *msg_p, const char *msg_name, instance_t instance){
f1ap_ue_context_setup_t * resp=&F1AP_UE_CONTEXT_SETUP_RESP(msg_p);
- protocol_ctxt_t ctxt;
- ctxt.rnti = resp->rnti;
- ctxt.module_id = instance;
- ctxt.instance = instance;
- ctxt.enb_flag = 1;
- ctxt.eNB_index = instance;
+ protocol_ctxt_t ctxt = {
+ .rnti = resp->rnti,
+ .module_id = instance,
+ .instance = instance,
+ .enb_flag = 1,
+ .eNB_index = instance
+ };
gNB_RRC_INST *rrc = RC.nrrrc[ctxt.module_id];
struct rrc_gNB_ue_context_s *ue_context_p = rrc_gNB_get_ue_context(rrc, ctxt.rnti);
NR_CellGroupConfig_t *cellGroupConfig = NULL;