diff --git a/ci-scripts/cls_physim.py b/ci-scripts/cls_physim.py
new file mode 100644
index 0000000000..4ca36b8cf0
--- /dev/null
+++ b/ci-scripts/cls_physim.py
@@ -0,0 +1,191 @@
+# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+# * contributor license agreements. See the NOTICE file distributed with
+# * this work for additional information regarding copyright ownership.
+# * The OpenAirInterface Software Alliance licenses this file to You under
+# * the OAI Public License, Version 1.1 (the "License"); you may not use this file
+# * except in compliance with the License.
+# * You may obtain a copy of the License at
+# *
+# * http://www.openairinterface.org/?page_id=698
+# *
+# * Unless required by applicable law or agreed to in writing, software
+# * distributed under the License is distributed on an "AS IS" BASIS,
+# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# * See the License for the specific language governing permissions and
+# * limitations under the License.
+# *-------------------------------------------------------------------------------
+# * For more information about the OpenAirInterface (OAI) Software Alliance:
+# * contact@openairinterface.org
+# */
+#---------------------------------------------------------------------
+# Python for CI of OAI-eNB + COTS-UE
+#
+# Required Python Version
+# Python 3.x
+#
+# Required Python Package
+# pexpect
+#---------------------------------------------------------------------
+
+#to use logging.info()
+import logging
+#to create a SSH object locally in the methods
+import sshconnection
+#to update the HTML object
+import html
+from multiprocessing import SimpleQueue
+#for log folder maintenance
+import os
+
+class PhySim:
+ def __init__(self):
+ self.buildargs = ""
+ self.runargs = ""
+ self.eNBIpAddr = ""
+ self.eNBUserName = ""
+ self.eNBPassWord = ""
+ self.eNBSourceCodePath = ""
+ self.ranRepository = ""
+ self.ranBranch = ""
+ self.ranCommitID= ""
+ self.ranAllowMerge= ""
+ self.ranTargetBranch= ""
+ self.exitStatus=0
+ self.forced_workspace_cleanup=False
+ #private attributes
+ self.__workSpacePath=''
+ self.__buildLogFile='compile_phy_sim.log'
+ self.__runLogFile=''
+ self.__runResults=[]
+ self.__runLogPath='phy_sim_logs'
+
+
+#-----------------
+#PRIVATE Methods
+#-----------------
+
+ def __CheckResults_PhySim(self,HTML,CONST,testcase_id):
+ mySSH = sshconnection.SSHConnection()
+ mySSH.open(self.eNBIpAddr, self.eNBUserName, self.eNBPassWord)
+ #retrieve run log file and store it locally$
+ mySSH.copyin(self.eNBIpAddr, self.eNBUserName, self.eNBPassWord, self.__workSpacePath+self.__runLogFile, '.')
+ mySSH.close()
+ #parse results looking for Encoding and Decoding mean values
+ self.__runResults=[]
+ with open(self.__runLogFile) as f:
+ for line in f:
+ if 'mean' in line:
+ self.__runResults.append(line)
+ #the values are appended for each mean value (2), so we take these 2 values from the list
+ info=self.__runResults[0]+self.__runResults[1]
+
+ #once parsed move the local logfile to its folder for tidiness
+ os.system('mv '+self.__runLogFile+' '+ self.__runLogPath+'/.')
+
+ #updating the HTML with results
+ html_cell = '
' + info + '
'
+ html_queue=SimpleQueue()
+ html_queue.put(html_cell)
+ HTML.CreateHtmlTestRowQueue(self.runargs, 'OK', 1, html_queue)
+ return HTML
+
+
+ def __CheckBuild_PhySim(self, HTML, CONST):
+ self.__workSpacePath=self.eNBSourceCodePath+'/cmake_targets/'
+ mySSH = sshconnection.SSHConnection()
+ mySSH.open(self.eNBIpAddr, self.eNBUserName, self.eNBPassWord)
+ #retrieve compile log file and store it locally
+ mySSH.copyin(self.eNBIpAddr, self.eNBUserName, self.eNBPassWord, self.__workSpacePath+self.__buildLogFile, '.')
+ #delete older run log file
+ mySSH.command('rm ' + self.__workSpacePath+self.__runLogFile, '\$', 5)
+ mySSH.close()
+ #check build result from local compile log file
+ buildStatus=False
+ with open(self.__buildLogFile) as f:
+ #nr_prachsim is the last compile step
+ if 'nr_prachsim compiled' in f.read():
+ buildStatus=True
+ #update HTML based on build status
+ if buildStatus:
+ HTML.CreateHtmlTestRow(self.buildargs, 'OK', CONST.ALL_PROCESSES_OK, 'LDPC')
+ self.exitStatus=0
+ else:
+ logging.error('\u001B[1m Building Physical Simulators Failed\u001B[0m')
+ HTML.CreateHtmlTestRow(self.buildargs, 'KO', CONST.ALL_PROCESSES_OK, 'LDPC')
+ HTML.CreateHtmlTabFooter(False)
+ #exitStatus=1 will do a sys.exit in main
+ self.exitStatus=1
+ return HTML
+
+
+#-----------------$
+#PUBLIC Methods$
+#-----------------$
+
+ def Build_PhySim(self,htmlObj,constObj):
+ mySSH = sshconnection.SSHConnection()
+ mySSH.open(self.eNBIpAddr, self.eNBUserName, self.eNBPassWord)
+
+ #create working dir
+ mySSH.command('mkdir -p ' + self.eNBSourceCodePath, '\$', 5)
+ mySSH.command('cd ' + self.eNBSourceCodePath, '\$', 5)
+
+ if not self.ranRepository.lower().endswith('.git'):
+ self.ranRepository+='.git'
+
+ #git clone
+ mySSH.command('if [ ! -e .git ]; then stdbuf -o0 git clone ' + self.ranRepository + ' .; else stdbuf -o0 git fetch --prune; fi', '\$', 600)
+ #git config
+ mySSH.command('git config user.email "jenkins@openairinterface.org"', '\$', 5)
+ mySSH.command('git config user.name "OAI Jenkins"', '\$', 5)
+
+ #git clean depending on self.forced_workspace_cleanup captured in xml
+ if self.forced_workspace_cleanup==True:
+ logging.info('Cleaning workspace ...')
+ mySSH.command('echo ' + self.eNBPassWord + ' | sudo -S git clean -x -d -ff', '\$', 30)
+ else:
+ logging.info('Workspace cleaning was disabled')
+
+ # if the commit ID is provided, use it to point to it
+ if self.ranCommitID != '':
+ mySSH.command('git checkout -f ' + self.ranCommitID, '\$', 5)
+ # if the branch is not develop, then it is a merge request and we need to do
+ # the potential merge. Note that merge conflicts should have already been checked earlier
+ if (self.ranAllowMerge):
+ if self.ranTargetBranch == '':
+ if (self.ranBranch != 'develop') and (self.ranBranch != 'origin/develop'):
+ mySSH.command('git merge --ff origin/develop -m "Temporary merge for CI"', '\$', 5)
+ else:
+ logging.info('Merging with the target branch: ' + self.ranTargetBranch)
+ mySSH.command('git merge --ff origin/' + self.ranTargetBranch + ' -m "Temporary merge for CI"', '\$', 5)
+
+ #build
+ mySSH.command('source oaienv', '\$', 5)
+ mySSH.command('cd cmake_targets', '\$', 5)
+ mySSH.command('mkdir -p log', '\$', 5)
+ mySSH.command('chmod 777 log', '\$', 5)
+ mySSH.command('stdbuf -o0 ./build_oai ' + self.buildargs + ' 2>&1 | stdbuf -o0 tee ' + self.__buildLogFile, 'Bypassing the Tests|build have failed', 1500)
+
+ mySSH.close()
+ #check build status and update HTML object
+ lHTML = html.HTMLManagement()
+ lHTML=self.__CheckBuild_PhySim(htmlObj,constObj)
+ return lHTML
+
+
+ def Run_PhySim(self,htmlObj,constObj,testcase_id):
+ #create run logs folder locally
+ os.system('mkdir -p ./'+self.__runLogPath)
+ #log file is tc_.log remotely
+ self.__runLogFile='physim_'+str(testcase_id)+'.log'
+ #open a session for test run
+ mySSH = sshconnection.SSHConnection()
+ mySSH.open(self.eNBIpAddr, self.eNBUserName, self.eNBPassWord)
+ mySSH.command('cd '+self.__workSpacePath,'\$',5)
+ #run and redirect the results to a log file
+ mySSH.command(self.__workSpacePath+'phy_simulators/build/ldpctest ' + self.runargs + ' >> '+self.__runLogFile, '\$', 30)
+ mySSH.close()
+ #return updated HTML to main
+ lHTML = html.HTMLManagement()
+ lHTML=self.__CheckResults_PhySim(htmlObj,constObj,testcase_id)
+ return lHTML
diff --git a/ci-scripts/doc/vm_based_simulator_env.md b/ci-scripts/doc/vm_based_simulator_env.md
index 5dbcfbd931..95b9d920d5 100644
--- a/ci-scripts/doc/vm_based_simulator_env.md
+++ b/ci-scripts/doc/vm_based_simulator_env.md
@@ -38,7 +38,6 @@ Last point, this documentation is valid for all CI-supported branches:
* `master`
* `develop`
-* `develop-nr`
But the feature set may not be aligned. **The principles still apply.**
diff --git a/ci-scripts/main.py b/ci-scripts/main.py
index 56c6ebead8..6bec183255 100644
--- a/ci-scripts/main.py
+++ b/ci-scripts/main.py
@@ -30,6 +30,7 @@
import constants as CONST
+
#-----------------------------------------------------------
# Import
#-----------------------------------------------------------
@@ -3066,7 +3067,7 @@ class OaiCiTest():
logging.debug('\u001B[1m----------------------------------------\u001B[0m')
def CheckClassValidity(action,id):
- if action != 'Build_eNB' and action != 'WaitEndBuild_eNB' and action != 'Initialize_eNB' and action != 'Terminate_eNB' and action != 'Initialize_UE' and action != 'Terminate_UE' and action != 'Attach_UE' and action != 'Detach_UE' and action != 'Build_OAI_UE' and action != 'Initialize_OAI_UE' and action != 'Terminate_OAI_UE' and action != 'DataDisable_UE' and action != 'DataEnable_UE' and action != 'CheckStatusUE' and action != 'Ping' and action != 'Iperf' and action != 'Reboot_UE' and action != 'Initialize_FlexranCtrl' and action != 'Terminate_FlexranCtrl' and action != 'Initialize_HSS' and action != 'Terminate_HSS' and action != 'Initialize_MME' and action != 'Terminate_MME' and action != 'Initialize_SPGW' and action != 'Terminate_SPGW' and action != 'Initialize_CatM_module' and action != 'Terminate_CatM_module' and action != 'Attach_CatM_module' and action != 'Detach_CatM_module' and action != 'Ping_CatM_module' and action != 'IdleSleep' and action != 'Perform_X2_Handover':
+ if action!='Build_PhySim' and action!='Run_PhySim' and action != 'Build_eNB' and action != 'WaitEndBuild_eNB' and action != 'Initialize_eNB' and action != 'Terminate_eNB' and action != 'Initialize_UE' and action != 'Terminate_UE' and action != 'Attach_UE' and action != 'Detach_UE' and action != 'Build_OAI_UE' and action != 'Initialize_OAI_UE' and action != 'Terminate_OAI_UE' and action != 'DataDisable_UE' and action != 'DataEnable_UE' and action != 'CheckStatusUE' and action != 'Ping' and action != 'Iperf' and action != 'Reboot_UE' and action != 'Initialize_FlexranCtrl' and action != 'Terminate_FlexranCtrl' and action != 'Initialize_HSS' and action != 'Terminate_HSS' and action != 'Initialize_MME' and action != 'Terminate_MME' and action != 'Initialize_SPGW' and action != 'Terminate_SPGW' and action != 'Initialize_CatM_module' and action != 'Terminate_CatM_module' and action != 'Attach_CatM_module' and action != 'Detach_CatM_module' and action != 'Ping_CatM_module' and action != 'IdleSleep' and action != 'Perform_X2_Handover':
logging.debug('ERROR: test-case ' + id + ' has wrong class ' + action)
return False
return True
@@ -3213,6 +3214,19 @@ def GetParametersFromXML(action):
else:
CiTestObj.x2_ho_options = string_field
+ if action == 'Build_PhySim':
+ ldpc.buildargs = test.findtext('physim_build_args')
+ forced_workspace_cleanup = test.findtext('forced_workspace_cleanup')
+ if (forced_workspace_cleanup is None):
+ ldpc.forced_workspace_cleanup=False
+ else:
+ if re.match('true', forced_workspace_cleanup, re.IGNORECASE):
+ ldpc.forced_workspace_cleanup=True
+ else:
+ ldpc.forced_workspace_cleanup=False
+
+ if action == 'Run_PhySim':
+ ldpc.runargs = test.findtext('physim_run_args')
#check if given test is in list
#it is in list if one of the strings in 'list' is at the beginning of 'test'
@@ -3248,6 +3262,9 @@ EPC.SetHtmlObj(HTML)
RAN.SetHtmlObj(HTML)
RAN.SetEpcObj(EPC)
+import cls_physim #class PhySim for physical simulators build and test
+ldpc=cls_physim.PhySim() #create an instance for LDPC test using GPU or CPU build
+
argvs = sys.argv
argc = len(argvs)
cwd = os.getcwd()
@@ -3269,12 +3286,14 @@ while len(argvs) > 1:
CiTestObj.ranRepository = matchReg.group(1)
RAN.SetranRepository(matchReg.group(1))
HTML.SetranRepository(matchReg.group(1))
+ ldpc.ranRepository=matchReg.group(1)
elif re.match('^\-\-eNB_AllowMerge=(.+)$|^\-\-ranAllowMerge=(.+)$', myArgv, re.IGNORECASE):
if re.match('^\-\-eNB_AllowMerge=(.+)$', myArgv, re.IGNORECASE):
matchReg = re.match('^\-\-eNB_AllowMerge=(.+)$', myArgv, re.IGNORECASE)
else:
matchReg = re.match('^\-\-ranAllowMerge=(.+)$', myArgv, re.IGNORECASE)
doMerge = matchReg.group(1)
+ ldpc.ranAllowMerge=matchReg.group(1)
if ((doMerge == 'true') or (doMerge == 'True')):
CiTestObj.ranAllowMerge = True
RAN.SetranAllowMerge(True)
@@ -3287,6 +3306,7 @@ while len(argvs) > 1:
CiTestObj.ranBranch = matchReg.group(1)
RAN.SetranBranch(matchReg.group(1))
HTML.SetranBranch(matchReg.group(1))
+ ldpc.ranBranch=matchReg.group(1)
elif re.match('^\-\-eNBCommitID=(.*)$|^\-\-ranCommitID=(.*)$', myArgv, re.IGNORECASE):
if re.match('^\-\-eNBCommitID=(.*)$', myArgv, re.IGNORECASE):
matchReg = re.match('^\-\-eNBCommitID=(.*)$', myArgv, re.IGNORECASE)
@@ -3295,6 +3315,7 @@ while len(argvs) > 1:
CiTestObj.ranCommitID = matchReg.group(1)
RAN.SetranCommitID(matchReg.group(1))
HTML.SetranCommitID(matchReg.group(1))
+ ldpc.ranCommitID=matchReg.group(1)
elif re.match('^\-\-eNBTargetBranch=(.*)$|^\-\-ranTargetBranch=(.*)$', myArgv, re.IGNORECASE):
if re.match('^\-\-eNBTargetBranch=(.*)$', myArgv, re.IGNORECASE):
matchReg = re.match('^\-\-eNBTargetBranch=(.*)$', myArgv, re.IGNORECASE)
@@ -3303,10 +3324,12 @@ while len(argvs) > 1:
CiTestObj.ranTargetBranch = matchReg.group(1)
RAN.SetranTargetBranch(matchReg.group(1))
HTML.SetranTargetBranch(matchReg.group(1))
+ ldpc.ranTargetBranch=matchReg.group(1)
elif re.match('^\-\-eNBIPAddress=(.+)$|^\-\-eNB[1-2]IPAddress=(.+)$', myArgv, re.IGNORECASE):
if re.match('^\-\-eNBIPAddress=(.+)$', myArgv, re.IGNORECASE):
matchReg = re.match('^\-\-eNBIPAddress=(.+)$', myArgv, re.IGNORECASE)
RAN.SeteNBIPAddress(matchReg.group(1))
+ ldpc.eNBIpAddr=matchReg.group(1)
elif re.match('^\-\-eNB1IPAddress=(.+)$', myArgv, re.IGNORECASE):
matchReg = re.match('^\-\-eNB1IPAddress=(.+)$', myArgv, re.IGNORECASE)
RAN.SeteNB1IPAddress(matchReg.group(1))
@@ -3317,6 +3340,7 @@ while len(argvs) > 1:
if re.match('^\-\-eNBUserName=(.+)$', myArgv, re.IGNORECASE):
matchReg = re.match('^\-\-eNBUserName=(.+)$', myArgv, re.IGNORECASE)
RAN.SeteNBUserName(matchReg.group(1))
+ ldpc.eNBUserName=matchReg.group(1)
elif re.match('^\-\-eNB1UserName=(.+)$', myArgv, re.IGNORECASE):
matchReg = re.match('^\-\-eNB1UserName=(.+)$', myArgv, re.IGNORECASE)
RAN.SeteNB1UserName(matchReg.group(1))
@@ -3327,6 +3351,7 @@ while len(argvs) > 1:
if re.match('^\-\-eNBPassword=(.+)$', myArgv, re.IGNORECASE):
matchReg = re.match('^\-\-eNBPassword=(.+)$', myArgv, re.IGNORECASE)
RAN.SeteNBPassword(matchReg.group(1))
+ ldpc.eNBPassWord=matchReg.group(1)
elif re.match('^\-\-eNB1Password=(.+)$', myArgv, re.IGNORECASE):
matchReg = re.match('^\-\-eNB1Password=(.+)$', myArgv, re.IGNORECASE)
RAN.SeteNB1Password(matchReg.group(1))
@@ -3337,6 +3362,7 @@ while len(argvs) > 1:
if re.match('^\-\-eNBSourceCodePath=(.+)$', myArgv, re.IGNORECASE):
matchReg = re.match('^\-\-eNBSourceCodePath=(.+)$', myArgv, re.IGNORECASE)
RAN.SeteNBSourceCodePath(matchReg.group(1))
+ ldpc.eNBSourceCodePath=matchReg.group(1)
elif re.match('^\-\-eNB1SourceCodePath=(.+)$', myArgv, re.IGNORECASE):
matchReg = re.match('^\-\-eNB1SourceCodePath=(.+)$', myArgv, re.IGNORECASE)
RAN.SeteNB1SourceCodePath(matchReg.group(1))
@@ -3504,7 +3530,7 @@ elif re.match('^InitiateHtml$', mode, re.IGNORECASE):
foundCount += 1
count += 1
if foundCount != HTML.GetnbTestXMLfiles():
- HTML.SetnbTestXMLfiles(foundcount)
+ HTML.SetnbTestXMLfiles(foundCount)
if (CiTestObj.ADBIPAddress != 'none'):
terminate_ue_flag = False
@@ -3707,6 +3733,11 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re
CiTestObj.IdleSleep()
elif action == 'Perform_X2_Handover':
CiTestObj.Perform_X2_Handover()
+ elif action == 'Build_PhySim':
+ HTML=ldpc.Build_PhySim(HTML,CONST)
+ if ldpc.exitStatus==1:sys.exit()
+ elif action == 'Run_PhySim':
+ HTML=ldpc.Run_PhySim(HTML,CONST,id)
else:
sys.exit('Invalid action')
CiTestObj.FailReportCnt += 1
diff --git a/ci-scripts/ran.py b/ci-scripts/ran.py
index 9c66b1863c..c968521bda 100644
--- a/ci-scripts/ran.py
+++ b/ci-scripts/ran.py
@@ -781,7 +781,7 @@ class RANManagement():
mySSH.command('cd ' + self.eNBSourceCodePath, '\$', 5)
mySSH.command('cd cmake_targets', '\$', 5)
mySSH.command('echo ' + self.eNBPassword + ' | sudo -S rm -f enb.log.zip', '\$', 5)
- mySSH.command('echo ' + self.eNBPassword + ' | sudo -S zip enb.log.zip enb*.log core* enb_*record.raw enb_*.pcap enb_*txt', '\$', 60)
+ mySSH.command('echo ' + self.eNBPassword + ' | sudo -S zip enb.log.zip enb*.log core* enb_*record.raw enb_*.pcap enb_*txt physim_*.log', '\$', 60)
mySSH.command('echo ' + self.eNBPassword + ' | sudo -S rm enb*.log core* enb_*record.raw enb_*.pcap enb_*txt', '\$', 5)
mySSH.close()
diff --git a/ci-scripts/xml_files/enb_usrp210_band7_test_05mhz_tm1_rrc_inactivity_no_flexran.xml b/ci-scripts/xml_files/enb_usrp210_band7_test_05mhz_tm1_rrc_inactivity_no_flexran.xml
index 41e746bc85..73d1216199 100644
--- a/ci-scripts/xml_files/enb_usrp210_band7_test_05mhz_tm1_rrc_inactivity_no_flexran.xml
+++ b/ci-scripts/xml_files/enb_usrp210_band7_test_05mhz_tm1_rrc_inactivity_no_flexran.xml
@@ -24,6 +24,7 @@
test-05-tm1-rrc-no-flex
Test-05MHz-TM1-RRC-Inactivity
tasks
+ 2
030201
040101
diff --git a/ci-scripts/xml_files/if4p5_usrp210_band40_test_10mhz.xml b/ci-scripts/xml_files/if4p5_usrp210_band40_test_10mhz.xml
index e1644f3931..8276294e9a 100644
--- a/ci-scripts/xml_files/if4p5_usrp210_band40_test_10mhz.xml
+++ b/ci-scripts/xml_files/if4p5_usrp210_band40_test_10mhz.xml
@@ -24,6 +24,7 @@
test-10
Test-10MHz
tasks
+ 2
030201
040101
diff --git a/ci-scripts/xml_files/ldpc_gpu_test.xml b/ci-scripts/xml_files/ldpc_gpu_test.xml
new file mode 100644
index 0000000000..a0191fbd76
--- /dev/null
+++ b/ci-scripts/xml_files/ldpc_gpu_test.xml
@@ -0,0 +1,161 @@
+
+
+ test-ldpc-gpu
+ Test-ldpc-GPU
+ tasks
+ 1
+ 000001 000002 000003 000004 000005 000006 000007 000008 000009 000010 000011 000012 000013 000014 000015 000016 000017 000018 000019 000020 000021
+
+
+
+ Build_PhySim
+ Build for physical simulator
+ --phy_simulators --ninja
+ FALSE
+
+
+
+ Run_PhySim
+ Run LDPC Test with CPU
+ -l 3872 -s10 -n100
+
+
+
+ Run_PhySim
+ Run LDPC Test with GPU
+ -l 3872 -s10 -n100 -G 1
+
+
+
+ Run_PhySim
+ Run LDPC Test with CPU
+ -l 4224 -s10 -n100
+
+
+
+ Run_PhySim
+ Run LDPC Test with GPU
+ -l 4224 -s10 -n100 -G 1
+
+
+
+ Run_PhySim
+ Run LDPC Test with CPU
+ -l 4576 -s10 -n100
+
+
+
+ Run_PhySim
+ Run LDPC Test with GPU
+ -l 4576 -s10 -n100 -G 1
+
+
+
+ Run_PhySim
+ Run LDPC Test with CPU
+ -l 4928 -s10 -n100
+
+
+
+ Run_PhySim
+ Run LDPC Test with GPU
+ -l 4928 -s10 -n100 -G 1
+
+
+
+ Run_PhySim
+ Run LDPC Test with CPU
+ -l 5280 -s10 -n100
+
+
+
+ Run_PhySim
+ Run LDPC Test with GPU
+ -l 5280 -s10 -n100 -G 1
+
+
+
+ Run_PhySim
+ Run LDPC Test with CPU
+ -l 5632 -s10 -n100
+
+
+
+ Run_PhySim
+ Run LDPC Test with GPU
+ -l 5632 -s10 -n100 -G 1
+
+
+
+ Run_PhySim
+ Run LDPC Test with CPU
+ -l 6336 -s10 -n100
+
+
+
+ Run_PhySim
+ Run LDPC Test with GPU
+ -l 6336 -s10 -n100 -G 1
+
+
+
+ Run_PhySim
+ Run LDPC Test with CPU
+ -l 7040 -s10 -n100
+
+
+
+ Run_PhySim
+ Run LDPC Test with GPU
+ -l 7040 -s10 -n100 -G 1
+
+
+
+ Run_PhySim
+ Run LDPC Test with CPU
+ -l 7744 -s10 -n100
+
+
+
+ Run_PhySim
+ Run LDPC Test with GPU
+ -l 7744 -s10 -n100 -G 1
+
+
+
+ Run_PhySim
+ Run LDPC Test with CPU
+ -l 8448 -s10 -n100
+
+
+
+ Run_PhySim
+ Run LDPC Test with GPU
+ -l 8448 -s10 -n100 -G 1
+
+
+
+
+
diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml
index 346aa8bfef..9bdf60476f 100644
--- a/cmake_targets/autotests/test_case_list.xml
+++ b/cmake_targets/autotests/test_case_list.xml
@@ -1116,7 +1116,7 @@
-n100 -s1 -t33
-n100 -s1 -t50
- nr_dlsim.test1 nr_dlsim.test2 nr_dlsim.test3 nr_dlsim.test4 nr_dlsim.test5 nr_dlsim.test6 nr_dlsim.test7 nr_dlsim.test8 nr_dlsim.test9 nr_dlsim.test10 nr_dlsim.test11 nr_dlsim.test12 nr_dlsim.test13
+ nr_dlsim.test1 nr_dlsim.test2 nr_dlsim.test3 nr_dlsim.test4 nr_dlsim.test5 nr_dlsim.test6 nr_dlsim.test7 nr_dlsim.test8 nr_dlsim.test9 nr_dlsim.test10 nr_dlsim.test11 nr_dlsim.test12 nr_dlsim.test13
PDSCH test OK
segmentation fault|assertion|exiting|fatal
3
@@ -1227,8 +1227,7 @@
-R 106 -i 1 -P 2 -q8 -b 19 -s-3 -n1000
-R 106 -i 1 -P 2 -q8 -b 32 -s-3 -n1000
-R 106 -i 1 -P 2 -q16 -b 32 -s-3 -n1000
- -R 106 -i 1 -P 2 -q16 -b 64 -s-3 -n1000
-
+ -R 106 -i 1 -P 2 -q16 -b 64 -s-3 -n1000
nr_pucchsim.test1 nr_pucchsim.test2 nr_pucchsim.test3 nr_pucchsim.test4 nr_pucchsim.test5 nr_pucchsim.test6 nr_pucchsim.test7 nr_pucchsim.test8 nr_pucchsim.test9 nr_pucchsim.test10 nr_pucchsim.test11 nr_pucchsim.test12 nr_pucchsim.test13 nr_pucchsim.test14 nr_pucchsim.test15 nr_pucchsim.test16 nr_pucchsim.test17
PUCCH test OK
segmentation fault|assertion|exiting|fatal
diff --git a/cmake_targets/build_oai b/cmake_targets/build_oai
index 91f33ea625..88b8811575 100755
--- a/cmake_targets/build_oai
+++ b/cmake_targets/build_oai
@@ -959,6 +959,7 @@ function main() {
wait
else
echo_info "10. Bypassing the Tests ..."
+ echo_success "BUILD SHOULD BE SUCCESSFUL"
fi
}
diff --git a/cmake_targets/tools/build_helper b/cmake_targets/tools/build_helper
index 5a59b9a8cc..b8f0125b10 100755
--- a/cmake_targets/tools/build_helper
+++ b/cmake_targets/tools/build_helper
@@ -175,8 +175,21 @@ check_warnings() {
fi
}
+#check_errors:
+# print error message if the compilation had errors
+#argument:
+# $1: log file
+check_errors() {
+ #we look for 'warning:' in the compilation log file
+ error_count=`grep "error:" "$1" | wc -l`
+ if [ $error_count -gt 0 ]; then
+ echo_error "ERROR: $error_count error. See $1"
+ fi
+}
+
compilations() {
cd $OPENAIR_DIR/cmake_targets/$1/build
+ echo_info "Log file for compilation is being written to: $dlog/$2.$REL.txt"
set +e
{
if [ "$BUILD_COVERITY_SCAN" == "1" ]; then
@@ -193,15 +206,22 @@ compilations() {
$COV_SCAN_PREFIX make -j`nproc` $2
fi
fi
-
+ ret=$?
} > $dlog/$2.$REL.txt 2>&1
set -e
- echo_info "Log file for compilation has been written to: $dlog/$2.$REL.txt"
+ if [[ $ret -ne 0 ]]; then
+ check_warnings "$dlog/$2.$REL.txt"
+ check_errors "$dlog/$2.$REL.txt"
+ echo_error "$2 compilation failed"
+ exit 1
+ fi
if [ -s $3 ] ; then
cp $3 $4
echo_success "$2 compiled"
check_warnings "$dlog/$2.$REL.txt"
else
+ check_warnings "$dlog/$2.$REL.txt"
+ check_errors "$dlog/$2.$REL.txt"
echo_error "$2 compilation failed"
exit 1
fi
diff --git a/executables/nr-ru.c b/executables/nr-ru.c
index d6f7fb4374..b2c6e94acf 100644
--- a/executables/nr-ru.c
+++ b/executables/nr-ru.c
@@ -118,6 +118,7 @@ uint16_t sl_ahead;
extern int emulate_rf;
extern int numerology;
+extern int usrp_tx_thread;
/*************************************************************/
/* Functions to attach and configure RRU */
@@ -1510,12 +1511,14 @@ void *ru_thread( void *param ) {
if ((ru->is_slave) && (ru->if_south == LOCAL_RF)) do_ru_synch(ru);
// start trx write thread
- if (ru->start_write_thread){
- if(ru->start_write_thread(ru) != 0){
- LOG_E(HW,"Could not start tx write thread\n");
- }
- else{
- LOG_I(PHY,"tx write thread ready\n");
+ if(usrp_tx_thread == 1){
+ if (ru->start_write_thread){
+ if(ru->start_write_thread(ru) != 0){
+ LOG_E(HW,"Could not start tx write thread\n");
+ }
+ else{
+ LOG_I(PHY,"tx write thread ready\n");
+ }
}
}
}
diff --git a/executables/nr-softmodem-common.h b/executables/nr-softmodem-common.h
index 305e4c4fc8..c968fee7b6 100644
--- a/executables/nr-softmodem-common.h
+++ b/executables/nr-softmodem-common.h
@@ -90,6 +90,7 @@
#define CONFIG_HLP_EMULATE_RF "Emulated RF enabled(disable by defult)\n"
#define CONFIG_HLP_PARALLEL_CMD "three config for level of parallelism 'PARALLEL_SINGLE_THREAD', 'PARALLEL_RU_L1_SPLIT', or 'PARALLEL_RU_L1_TRX_SPLIT'\n"
#define CONFIG_HLP_WORKER_CMD "two option for worker 'WORKER_DISABLE' or 'WORKER_ENABLE'\n"
+#define CONFIG_HLP_USRP_THREAD "having extra thead for usrp tx\n"
#define CONFIG_HLP_DISABLNBIOT "disable nb-iot, even if defined in config\n"
#define CONFIG_HLP_USRP_ARGS "set the arguments to identify USRP (same syntax as in UHD)\n"
@@ -144,6 +145,10 @@ extern int sync_var;
extern int transmission_mode;
extern double cpuf;
+extern int emulate_rf;
+extern int numerology;
+extern int usrp_tx_thread;
+
extern volatile int start_eNB;
extern volatile int start_UE;
diff --git a/executables/nr-softmodem.c b/executables/nr-softmodem.c
index 2a9b3a0700..bf77125975 100644
--- a/executables/nr-softmodem.c
+++ b/executables/nr-softmodem.c
@@ -183,6 +183,7 @@ extern void *udp_eNB_task(void *args_p);
int transmission_mode=1;
int emulate_rf = 0;
int numerology = 0;
+int usrp_tx_thread = 0;
static char *parallel_config = NULL;
diff --git a/executables/nr-softmodem.h b/executables/nr-softmodem.h
index 27e3ba1e3e..d113ae45aa 100644
--- a/executables/nr-softmodem.h
+++ b/executables/nr-softmodem.h
@@ -34,6 +34,7 @@
{"emulate-rf" , CONFIG_HLP_EMULATE_RF, PARAMFLAG_BOOL, iptr:&emulate_rf, defintval:0, TYPE_INT, 0}, \
{"parallel-config", CONFIG_HLP_PARALLEL_CMD,0, strptr:(char **)¶llel_config, defstrval:NULL, TYPE_STRING, 0}, \
{"worker-config", CONFIG_HLP_WORKER_CMD, 0, strptr:(char **)&worker_config, defstrval:NULL, TYPE_STRING, 0}, \
+ {"usrp-tx-thread-config", CONFIG_HLP_USRP_THREAD, 0, iptr:&usrp_tx_thread, defstrval:0, TYPE_INT, 0}, \
{"s" , CONFIG_HLP_SNR, 0, dblptr:&snr_dB, defdblval:25, TYPE_DOUBLE, 0}, \
}
diff --git a/executables/nr-uesoftmodem.c b/executables/nr-uesoftmodem.c
index b96f98e1f2..dd881c409b 100644
--- a/executables/nr-uesoftmodem.c
+++ b/executables/nr-uesoftmodem.c
@@ -173,6 +173,7 @@ uint64_t num_missed_slots=0; // counter for the number of missed slots
int transmission_mode=1;
int numerology = 0;
+int usrp_tx_thread = 0;
/* flag set by eNB conf file to specify if the radio head is local or remote (default option is local) */
//uint8_t local_remote_radio = BBU_LOCAL_RADIO_HEAD;
@@ -249,7 +250,7 @@ void exit_function(const char *file, const char *function, const int line, const
}
-void reset_stats(FL_OBJECT *button, long arg) {
+void reset_stats(long arg) {
//int i,j,k;
/*PHY_VARS_eNB *phy_vars_eNB = PHY_vars_eNB_g[0][0];
diff --git a/nfapi/open-nFAPI/nfapi/src/nfapi.c b/nfapi/open-nFAPI/nfapi/src/nfapi.c
index 156a48ec05..61c6875bc6 100644
--- a/nfapi/open-nFAPI/nfapi/src/nfapi.c
+++ b/nfapi/open-nFAPI/nfapi/src/nfapi.c
@@ -526,7 +526,7 @@ uint32_t pullarray8(uint8_t **in, uint8_t out[], uint32_t max_len, uint32_t len,
return 0;
}
- if((end - out) >= sizeof(uint8_t) * len)
+ if((end - (*in)) >= sizeof(uint8_t) * len)
{
memcpy(out, (*in), len);
(*in)+=len;
diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c b/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c
index 15eb5206a1..14036ad43a 100644
--- a/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c
+++ b/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c
@@ -422,6 +422,6 @@ int dlsch_encoding(PHY_VARS_eNB *eNB,
else
r_offset += Nl*Qm * ((GpmodC==0?0:1) + (Gp/C));
}
-
+ VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING, VCD_FUNCTION_OUT);
return(0);
}
diff --git a/openair1/PHY/TOOLS/nr_phy_scope.c b/openair1/PHY/TOOLS/nr_phy_scope.c
index 45eb66b4e3..dfb148d34e 100644
--- a/openair1/PHY/TOOLS/nr_phy_scope.c
+++ b/openair1/PHY/TOOLS/nr_phy_scope.c
@@ -26,6 +26,7 @@
#include
#include "nr_phy_scope.h"
#include "executables/nr-softmodem-common.h"
+#include
#define TPUT_WINDOW_LENGTH 100
#define localBuff(NaMe,SiZe) float NaMe[SiZe]; memset(NaMe,0,sizeof(NaMe));
@@ -47,8 +48,13 @@ typedef struct {
typedef struct OAIgraph {
FL_OBJECT *graph;
- void (*gNBfunct) (FL_OBJECT *graph, PHY_VARS_gNB *phy_vars_gnb, RU_t *phy_vars_ru, int UE_id);
- void (*nrUEfunct) (FL_OBJECT *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id);
+ float maxX;
+ float maxY;
+ float minX;
+ float minY;
+ int iteration;
+ void (*gNBfunct) (struct OAIgraph *graph, PHY_VARS_gNB *phy_vars_gnb, RU_t *phy_vars_ru, int UE_id);
+ void (*nrUEfunct)(struct OAIgraph *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id);
} OAIgraph_t;
/* Forms and Objects */
@@ -56,7 +62,7 @@ typedef struct {
FL_FORM *phy_scope;
OAIgraph_t graph[20];
FL_OBJECT *button_0;
-} FD_phy_scope_t;
+} OAI_phy_scope_t;
typedef struct {
FL_FORM *stats_form;
@@ -72,18 +78,8 @@ static void drawsymbol(FL_OBJECT *obj, int id,
fl_points( p, n, FL_YELLOW);
}
-static void ia_receiver_on_off( FL_OBJECT *button, long arg) {
- if (fl_get_button(button)) {
- fl_set_object_label(button, "IA Receiver ON");
- // PHY_vars_UE_g[0][0]->use_ia_receiver = 1;
- fl_set_object_color(button, FL_GREEN, FL_GREEN);
- } else {
- fl_set_object_label(button, "IA Receiver OFF");
- // PHY_vars_UE_g[0][0]->use_ia_receiver = 0;
- fl_set_object_color(button, FL_RED, FL_RED);
- }
-}
-
+// button callback example
+#if 0
static void dl_traffic_on_off( FL_OBJECT *button, long arg) {
if (fl_get_button(button)) {
fl_set_object_label(button, "DL Traffic ON");
@@ -95,201 +91,197 @@ static void dl_traffic_on_off( FL_OBJECT *button, long arg) {
fl_set_object_color(button, FL_RED, FL_RED);
}
}
+#endif
static FL_OBJECT *commonGraph( int type, FL_Coord x, FL_Coord y, FL_Coord w, FL_Coord h, const char *label, FL_COLOR pointColor) {
FL_OBJECT *graph;
graph=fl_add_xyplot(type, x, y, w, h, label);
- fl_set_object_boxtype(graph, FL_EMBOSSED_BOX );
fl_set_object_lcolor(graph, FL_WHITE ); // Label color
- fl_set_xyplot_symbol(graph, 0, drawsymbol);
fl_set_object_color(graph, FL_BLACK, pointColor);
+ fl_set_xyplot_symbol(graph, -1, drawsymbol);
return graph;
}
-static OAIgraph_t gNBcommonGraph( void (*funct) (FL_OBJECT *graph, PHY_VARS_gNB *phy_vars_gnb, RU_t *phy_vars_ru, int UE_id),
+static OAIgraph_t gNBcommonGraph( void (*funct) (OAIgraph_t *graph, PHY_VARS_gNB *phy_vars_gnb, RU_t *phy_vars_ru, int UE_id),
int type, FL_Coord x, FL_Coord y, FL_Coord w, FL_Coord h, const char *label, FL_COLOR pointColor) {
OAIgraph_t graph;
graph.graph=commonGraph(type, x, y, w, h, label, pointColor);
graph.gNBfunct=funct;
graph.nrUEfunct=NULL;
+ graph.maxX=0;
+ graph.maxY=0;
+ graph.minX=0;
+ graph.minY=0;
return graph;
}
-static OAIgraph_t nrUEcommonGraph( void (*funct) (FL_OBJECT *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id),
+static OAIgraph_t nrUEcommonGraph( void (*funct) (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id),
int type, FL_Coord x, FL_Coord y, FL_Coord w, FL_Coord h, const char *label, FL_COLOR pointColor) {
OAIgraph_t graph;
graph.graph=commonGraph(type, x, y, w, h, label, pointColor);
graph.gNBfunct=NULL;
graph.nrUEfunct=funct;
+ graph.maxX=0;
+ graph.maxY=0;
+ graph.minX=0;
+ graph.minY=0;
return graph;
}
-void phy_scope_gNB(FD_phy_scope_t *form,
- PHY_VARS_gNB *phy_vars_gnb,
- RU_t *phy_vars_ru,
- int UE_id) {
- static FD_phy_scope_t *remeberForm=NULL;
-
- if (form==NULL)
- form=remeberForm;
- else
- remeberForm=form;
-
- if (form==NULL) return;
-
- int i=0;
-
- while (form->graph[i].graph) {
- form->graph[i].gNBfunct(form->graph[i].graph, phy_vars_gnb, phy_vars_ru, UE_id);
- i++;
+static void setRange(OAIgraph_t *graph, float minX, float maxX, float minY, float maxY) {
+ if ( maxX > graph->maxX || maxY > graph->maxY || minX < graph->minX || minY < graph->minY ) {
+ graph->maxX=max(graph->maxX,maxX);
+ graph->minX=min(graph->minX,minX);
+ graph->maxY=max(graph->maxY,maxY);
+ graph->minY=min(graph->minY,minY);
+ fl_set_xyplot_ybounds(graph->graph, graph->minY, graph->maxY);
+ fl_set_xyplot_xbounds(graph->graph, graph->minX, graph->maxX);
}
-
- fl_check_forms();
}
-static void timeSignal (FL_OBJECT *graph, PHY_VARS_gNB *phy_vars_gnb, RU_t *phy_vars_ru, int UE_id) {
+static void oai_xygraph(OAIgraph_t *graph, float *x, float *y, int len, int layer, int NoAutoScale) {
+ if (layer==0)
+ fl_set_xyplot_data(graph->graph,x,y,len,"","","");
+ else
+ fl_add_xyplot_overlay(graph->graph,layer,x,y,len,rx_antenna_colors[layer]);
+
+ if ( NoAutoScale && graph->iteration%NoAutoScale == 0) {
+ float maxX=0, maxY=0, minX=0, minY=0;
+
+ for (int k=0; kiteration++;
+}
+
+static void genericLogPowerPerAntena(OAIgraph_t *graph, const int nb_ant, const scopeSample_t **data, const int len) {
+ float *values=malloc(len*sizeof(*values));
+ float *time=malloc(len*sizeof(*time));
+
+ for (int ant=0; antcommon.rxdata)
return;
NR_DL_FRAME_PARMS *frame_parms=&phy_vars_gnb->frame_parms;
- uint8_t nb_antennas_rx = frame_parms->nb_antennas_rx;
- scopeSample_t **rxsig_t = (scopeSample_t **)phy_vars_ru->common.rxdata;
- float rxsig_t_dB[frame_parms->samples_per_frame];
- float time[frame_parms->samples_per_frame];
+ genericLogPowerPerAntena(graph, frame_parms->nb_antennas_rx,
+ (const scopeSample_t **)phy_vars_ru->common.rxdata,
+ frame_parms->samples_per_frame);
+}
- for (int arx=0; arxsamples_per_frame; i++) {
- rxsig_t_dB[i] = 10*log10(1.0+SquaredNorm(rxsig_t[arx][i]));
- time[i] = i;
+static void timeResponse (OAIgraph_t *graph, PHY_VARS_gNB *phy_vars_gnb, RU_t *phy_vars_ru, int nb_UEs) {
+ const int len=2*phy_vars_gnb->frame_parms.ofdm_symbol_size;
+ float values[len];
+ float time[len];
+ const int ant=0; // display antenna 0 for each UE
+
+ for (int ue=0; uepusch_vars[ue]->ul_ch_estimates_time[ant];
+
+ if (data != NULL) {
+ for (int i=0; isamples_per_frame,"","","");
- else
- fl_add_xyplot_overlay(graph,arx,time,rxsig_t_dB,frame_parms->samples_per_frame,rx_antenna_colors[arx]);
+ oai_xygraph(graph,time,values, len, ue, 10);
}
}
}
-static void timeResponse (FL_OBJECT *graph, PHY_VARS_gNB *phy_vars_gnb, RU_t *phy_vars_ru, int UE_id) {
- if (!phy_vars_gnb->pusch_vars[UE_id]->ul_ch_estimates_time)
- return;
-
+static void frequencyResponse (OAIgraph_t *graph, PHY_VARS_gNB *phy_vars_gnb, RU_t *phy_vars_ru, int nb_UEs) {
NR_DL_FRAME_PARMS *frame_parms=&phy_vars_gnb->frame_parms;
- uint8_t nb_antennas_rx = frame_parms->nb_antennas_rx;
- scopeSample_t **chest_t = (scopeSample_t **) phy_vars_gnb->pusch_vars[UE_id]->ul_ch_estimates_time;
- int ymax = 0;
- float time2[2*frame_parms->ofdm_symbol_size];
- float chest_t_abs[2*frame_parms->ofdm_symbol_size];
-
- for (int arx=0; arxofdm_symbol_size); i++) {
- time2[i] = (float)i;
- chest_t_abs[i] = 10*log10(1.0 + SquaredNorm(chest_t[0][i]));
-
- if (chest_t_abs[i] > ymax)
- ymax = chest_t_abs[i];
- }
-
- if (arx==0)
- fl_set_xyplot_data(graph,time2,chest_t_abs,(2*frame_parms->ofdm_symbol_size),"","","");
- else {
- fl_add_xyplot_overlay(graph,arx,time2,chest_t_abs,(frame_parms->ofdm_symbol_size>>3),rx_antenna_colors[arx]);
- fl_set_xyplot_overlay_type(graph,arx,FL_DASHED_XYPLOT);
- }
- }
- }
-
- // Avoid flickering effect
- // fl_get_xyplot_ybounds(form->chest_t,&ymin,&ymax);
- fl_set_xyplot_ybounds(graph,0,ymax);
+ genericLogPowerPerAntena(graph, frame_parms->nb_antennas_rx,
+ (const scopeSample_t **)phy_vars_ru->common.rxdataF,
+ frame_parms->samples_per_slot_wCP);
}
-static void frequencyResponse (FL_OBJECT *graph, PHY_VARS_gNB *phy_vars_gnb, RU_t *phy_vars_ru, int UE_id) {
- // Channel Frequency Response
- if (!phy_vars_ru->common.rxdataF)
- return;
-
- NR_DL_FRAME_PARMS *frame_parms=&phy_vars_gnb->frame_parms;
- //uint8_t nb_antennas_rx = frame_parms->nb_antennas_rx;
- scopeSample_t **rxsig_f = (scopeSample_t **) phy_vars_ru->common.rxdataF;
- float rxsig_f_dB[frame_parms->samples_per_slot_wCP];
- float time[frame_parms->samples_per_slot_wCP];
-
- if (rxsig_f[0] != NULL) {
- for (int i=0; isamples_per_slot_wCP; i++) {
- rxsig_f_dB[i] = 10*log10(1.0+ SquaredNorm(rxsig_f[0][i]));
- time[i] = (float) i;
- }
-
- fl_set_xyplot_data(graph,time,rxsig_f_dB,frame_parms->samples_per_slot_wCP,"","","");
- }
-
- /*
- for (int arx=1; arxchest_f,1,time,chest_f_abs,nsymb_ce,rx_antenna_colors[arx]);
- }
- }
- */
- /*
- // tx antenna 0
- fl_set_xyplot_xbounds(form->chest_f,0,nb_antennas_rx*nb_antennas_tx*nsymb_ce);
- fl_set_xyplot_xtics(form->chest_f,nb_antennas_rx*nb_antennas_tx*frame_parms->symbols_per_tti,3);
- fl_set_xyplot_xgrid(form->chest_f,FL_GRID_MAJOR);
- fl_set_xyplot_data(form->chest_f,freq,chest_f_abs,nsymb_ce,"","","");
- */
-}
-
-static void puschLLR (FL_OBJECT *graph, PHY_VARS_gNB *phy_vars_gnb, RU_t *phy_vars_ru, int UE_id) {
- // PUSCH LLRs
- if (!phy_vars_gnb->pusch_vars[UE_id]->llr)
- return;
-
- //NR_DL_FRAME_PARMS *frame_parms=&phy_vars_gnb->frame_parms;
+static void puschLLR (OAIgraph_t *graph, PHY_VARS_gNB *phy_vars_gnb, RU_t *phy_vars_ru, int nb_UEs) {
//int Qm = 2;
- int16_t *pusch_llr = (int16_t *) phy_vars_gnb->pusch_vars[UE_id]->llr;
int coded_bits_per_codeword =3*8*6144+12; // (8*((3*8*6144)+12)); // frame_parms->N_RB_UL*12*Qm*frame_parms->symbols_per_tti;
float llr[coded_bits_per_codeword];
float bit[coded_bits_per_codeword];
- for (int i=0; ipusch_vars[ue]->llr;
- fl_set_xyplot_data(graph,bit,llr,coded_bits_per_codeword,"","","");
+ if (pusch_llr) {
+ for (int i=0; ipusch_vars[UE_id]->rxdataF_comp)
- return;
-
+static void puschIQ (OAIgraph_t *graph, PHY_VARS_gNB *phy_vars_gnb, RU_t *phy_vars_ru, int nb_UEs) {
NR_DL_FRAME_PARMS *frame_parms=&phy_vars_gnb->frame_parms;
- scopeSample_t *pusch_comp = (scopeSample_t *) phy_vars_gnb->pusch_vars[UE_id]->rxdataF_comp[0];
int sz=frame_parms->N_RB_UL*12*frame_parms->symbols_per_slot;
float I[sz], Q[sz];
- for (int k=0; kpusch_vars[ue]->rxdataF_comp[0];
+
+ if (pusch_comp) {
+ for (int k=0; kpucch1ab_stats[UE_id];
int32_t *pucch1_comp = (int32_t *) NULL; //phy_vars_gnb->pucch1_stats[UE_id];
float I_pucch[10240],Q_pucch[10240],A_pucch[10240],B_pucch[10240],C_pucch[10240];
@@ -310,17 +302,15 @@ static void puschIQ (FL_OBJECT *graph, PHY_VARS_gNB *phy_vars_gnb, RU_t *phy_var
fl_set_xyplot_xbounds(graph,-5000,5000);
fl_set_xyplot_ybounds(graph,0,80);
}
-#endif
+ */
}
-static void pucchEnergy (FL_OBJECT *graph, PHY_VARS_gNB *phy_vars_gnb, RU_t *phy_vars_ru, int UE_id) {
+static void pucchIQ (OAIgraph_t *graph, PHY_VARS_gNB *phy_vars_gnb, RU_t *phy_vars_ru, int nb_UEs) {
}
-static void pucchIQ (FL_OBJECT *graph, PHY_VARS_gNB *phy_vars_gnb, RU_t *phy_vars_ru, int UE_id) {
-}
-
-static void puschThroughtput (FL_OBJECT *graph, PHY_VARS_gNB *phy_vars_gnb, RU_t *phy_vars_ru, int UE_id) {
+static void puschThroughtput (OAIgraph_t *graph, PHY_VARS_gNB *phy_vars_gnb, RU_t *phy_vars_ru, int nb_UEs) {
// PUSCH Throughput
+ /*
memmove( tput_time_enb[UE_id], &tput_time_enb[UE_id][1], (TPUT_WINDOW_LENGTH-1)*sizeof(float) );
memmove( tput_enb[UE_id], &tput_enb[UE_id][1], (TPUT_WINDOW_LENGTH-1)*sizeof(float) );
tput_time_enb[UE_id][TPUT_WINDOW_LENGTH-1] = (float) 0;
@@ -328,224 +318,126 @@ static void puschThroughtput (FL_OBJECT *graph, PHY_VARS_gNB *phy_vars_gnb, RU_t
fl_set_xyplot_data(graph,tput_time_enb[UE_id],tput_enb[UE_id],TPUT_WINDOW_LENGTH,"","","");
// fl_get_xyplot_ybounds(form->pusch_tput,&ymin,&ymax);
// fl_set_xyplot_ybounds(form->pusch_tput,0,ymax);
+ */
}
-static FD_phy_scope_t *create_phy_scope_gnb(int UE_id ) {
+static OAI_phy_scope_t *create_phy_scope_gnb(void) {
FL_OBJECT *obj;
- FD_phy_scope_t *fdui = fl_malloc( sizeof *fdui );
+ OAI_phy_scope_t *fdui = calloc(( sizeof *fdui ),1);
// Define form
fdui->phy_scope = fl_bgn_form( FL_NO_BOX, 800, 800 );
// This the whole UI box
obj = fl_add_box( FL_BORDER_BOX, 0, 0, 800, 800, "" );
- fl_set_object_color( obj, FL_BLACK, FL_BLACK );
+ fl_set_object_color( obj, FL_BLACK, FL_WHITE );
+ int curY=0,x,y,w,h;
// Received signal
- fdui->graph[0] = gNBcommonGraph( timeSignal, FL_IMPULSE_XYPLOT, 20, 20, 370, 100,
+ fdui->graph[0] = gNBcommonGraph( timeSignal, FL_NORMAL_XYPLOT, 0, curY, 400, 100,
"Received Signal (Time-Domain, dB)", FL_RED );
// Time-domain channel response
- fdui->graph[1] = gNBcommonGraph( timeResponse, FL_NORMAL_XYPLOT, 410, 20, 370, 100,
+ fdui->graph[1] = gNBcommonGraph( timeResponse, FL_NORMAL_XYPLOT, 410, curY, 400, 100,
"SRS Frequency Response (samples, abs)", FL_RED );
+ fl_get_object_bbox(fdui->graph[0].graph,&x, &y,&w, &h);
+ curY+=h;
// Frequency-domain channel response
- fdui->graph[2] = gNBcommonGraph( frequencyResponse, FL_IMPULSE_XYPLOT, 20, 140, 760, 100,
+ fdui->graph[2] = gNBcommonGraph( frequencyResponse, FL_NORMAL_XYPLOT, 0, curY, 800, 100,
"Channel Frequency Response (RE, dB)", FL_RED );
+ fl_get_object_bbox(fdui->graph[2].graph,&x, &y,&w, &h);
+ curY+=h;
// LLR of PUSCH
- fdui->graph[3] = gNBcommonGraph( puschLLR, FL_POINTS_XYPLOT, 20, 260, 500, 200,
+ fdui->graph[3] = gNBcommonGraph( puschLLR, FL_POINTS_XYPLOT, 0, curY, 500, 200,
"PUSCH Log-Likelihood Ratios (LLR, mag)", FL_YELLOW );
// I/Q PUSCH comp
- fdui->graph[4] = gNBcommonGraph( puschIQ, FL_POINTS_XYPLOT, 540, 260, 240, 200,
+ fdui->graph[4] = gNBcommonGraph( puschIQ, FL_POINTS_XYPLOT, 500, curY, 300, 200,
"PUSCH I/Q of MF Output", FL_YELLOW );
+ fl_get_object_bbox(fdui->graph[3].graph,&x, &y,&w, &h);
+ curY+=h;
// I/Q PUCCH comp (format 1)
- fdui->graph[5] = gNBcommonGraph( pucchEnergy, FL_POINTS_XYPLOT, 540, 480, 240, 100,
+ fdui->graph[5] = gNBcommonGraph( pucchEnergy, FL_POINTS_XYPLOT, 0, curY, 300, 100,
"PUCCH1 Energy (SR)", FL_YELLOW );
// fl_set_xyplot_xgrid( fdui->pusch_llr,FL_GRID_MAJOR);
// I/Q PUCCH comp (fromat 1a/b)
- fdui->graph[6] = gNBcommonGraph( pucchIQ, FL_POINTS_XYPLOT, 540, 600, 240, 100,
+ fdui->graph[6] = gNBcommonGraph( pucchIQ, FL_POINTS_XYPLOT, 500, curY, 300, 100,
"PUCCH I/Q of MF Output", FL_YELLOW );
+ fl_get_object_bbox(fdui->graph[6].graph,&x, &y,&w, &h);
+ curY+=h;
// Throughput on PUSCH
- fdui->graph[7] = gNBcommonGraph( puschThroughtput, FL_NORMAL_XYPLOT, 20, 480, 500, 100,
+ fdui->graph[7] = gNBcommonGraph( puschThroughtput, FL_NORMAL_XYPLOT, 0, curY, 500, 100,
"PUSCH Throughput [frame]/[kbit/s]", FL_WHITE );
fdui->graph[8].graph=NULL;
-
- // Generic eNB Button
- if (0) { // code kept to later add command buttons
- fdui->button_0 = fl_add_button( FL_PUSH_BUTTON, 20, 600, 240, 40, "" );
- fl_set_object_lalign(fdui->button_0, FL_ALIGN_CENTER );
- fl_set_button(fdui->button_0,0);
- otg_enabled = 0;
- fl_set_object_label(fdui->button_0, "DL Traffic OFF");
- fl_set_object_color(fdui->button_0, FL_RED, FL_RED);
- fl_set_object_callback(fdui->button_0, dl_traffic_on_off, 0 );
- }
-
fl_end_form( );
fdui->phy_scope->fdui = fdui;
- char title[100];
- sprintf (title, "LTE UL SCOPE eNB for UE %d",UE_id);
- fl_show_form (fdui->phy_scope, FL_PLACE_HOTSPOT, FL_FULLBORDER, title);
+ fl_show_form (fdui->phy_scope, FL_PLACE_HOTSPOT, FL_FULLBORDER, "LTE UL SCOPE gNB");
return fdui;
}
-static FD_phy_scope_t *form_gnb[NUMBER_OF_UE_MAX]= {0};
-static unsigned char scope_enb_num_ue = 1;
+static const int scope_enb_num_ue = 1;
+void phy_scope_gNB(OAI_phy_scope_t *form,
+ PHY_VARS_gNB *phy_vars_gnb,
+ RU_t *phy_vars_ru,
+ int UE_id) {
+ static OAI_phy_scope_t *remeberForm=NULL;
+
+ if (form==NULL)
+ form=remeberForm;
+ else
+ remeberForm=form;
+
+ if (form==NULL) return;
+
+ int i=0;
+
+ while (form->graph[i].graph) {
+ form->graph[i].gNBfunct(form->graph+i, phy_vars_gnb, phy_vars_ru, UE_id);
+ i++;
+ }
+
+ fl_check_forms();
+}
static void *scope_thread_gNB(void *arg) {
scopeParms_t *p=(scopeParms_t *) arg;
//# ifdef ENABLE_XFORMS_WRITE_STATS
// FILE *gNB_stats = fopen("gNB_stats.txt", "w");
//#endif
- size_t stksize;
- pthread_attr_t atr;
+ size_t stksize=0;
+ pthread_attr_t atr= {0};
pthread_attr_getstacksize(&atr, &stksize);
pthread_attr_setstacksize(&atr,32*1024*1024 );
sleep(3); // no clean interthread barriers
+ fl_initialize (p->argc, p->argv, NULL, 0, 0);
+ int nb_ue=min(NUMBER_OF_UE_MAX, scope_enb_num_ue);
+ OAI_phy_scope_t *form_gnb = create_phy_scope_gnb();
while (!oai_exit) {
- int ue_cnt=0;
-
- for(int UE_id=0; UE_idgNB, p->ru, UE_id);
- ue_cnt++;
- }
- }
-
+ phy_scope_gNB(form_gnb, p->gNB, p->ru, nb_ue);
usleep(99*1000);
}
- // printf("%s",stats_buffer);
- /*#ifdef ENABLE_XFORMS_WRITE_STATS
-
- if (eNB_stats) {
- rewind (gNB_stats);
- fwrite (stats_buffer, 1, len, gNB_stats);
- fclose (gNB_stats);
- }
-
- #endif
- pthread_exit((void *)arg);
- }*/
return NULL;
}
void gNBinitScope(scopeParms_t *p) {
- //FD_stats_form *form_stats=NULL,*form_stats_l2=NULL;
- fl_initialize (p->argc, p->argv, NULL, 0, 0);
-
- /*
- form_stats_l2 = create_form_stats_form();
- fl_show_form (form_stats_l2->stats_form, FL_PLACE_HOTSPOT, FL_FULLBORDER, "l2 stats");
- form_stats = create_form_stats_form();
- fl_show_form (form_stats->stats_form, FL_PLACE_HOTSPOT, FL_FULLBORDER, "stats");
- */
- for(int UE_id=0; UE_idcommon_vars.rxdata)
- return;
-
- NR_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->frame_parms;
- uint8_t nb_antennas_rx = frame_parms->nb_antennas_rx;
- int samples_per_frame = frame_parms->samples_per_frame;
- scopeSample_t **rxsig_t = (scopeSample_t **) phy_vars_ue->common_vars.rxdata;
- float rxsig_t_dB[samples_per_frame];
- float time[samples_per_frame];
-
- if (rxsig_t[0] != NULL) {
- for (int i=0; iis_synchronized==0) {
- //float corr[samples_per_frame];
- for (int ind=0; ind<3; ind++) {
- /*
- if (pss_corr_ue[ind]) {
- for (i=0; ichest_t,time,corr,samples_per_frame,"","","");
- else
- fl_add_xyplot_overlay(form->chest_t,ind,time,corr,samples_per_frame,rx_antenna_colors[ind]);
-
- overlay = 1;
- }
- */
- }
-
- // if the UE is not synchronized, we can make only the time*power graph
- }
+ genericLogPowerPerAntena(graph, phy_vars_ue->frame_parms.nb_antennas_rx,
+ (const scopeSample_t **) phy_vars_ue->common_vars.rxdata,
+ phy_vars_ue->frame_parms.samples_per_frame);
}
-static void ueChannelResponse (FL_OBJECT *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) {
+static void ueChannelResponse (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) {
// Channel Impulse Response
- if (!phy_vars_ue->pbch_vars[eNB_id]->dl_ch_estimates_time)
- return;
-
- NR_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->frame_parms;
- uint8_t nb_antennas_rx = frame_parms->nb_antennas_rx;
- scopeSample_t **chest_t = (scopeSample_t **) phy_vars_ue->pbch_vars[eNB_id]->dl_ch_estimates_time;
- int ymax = 0;
- float chest_t_abs[frame_parms->ofdm_symbol_size];
- float time[frame_parms->ofdm_symbol_size>>3];
-
- if (chest_t[0] !=NULL) {
- for (int i=0; i<(frame_parms->ofdm_symbol_size>>3); i++) {
- chest_t_abs[i] = SquaredNorm(chest_t[0][i]);
- time[i] = (float) i;
-
- if (chest_t_abs[i] > ymax)
- ymax = chest_t_abs[i];
- }
-
- fl_set_xyplot_data(graph,time,chest_t_abs,(frame_parms->ofdm_symbol_size>>3),"","","");
- }
-
- for (int arx=1; arxofdm_symbol_size>>3); i++) {
- chest_t_abs[i] = SquaredNorm(chest_t[arx][i]);
-
- if (chest_t_abs[i] > ymax)
- ymax = chest_t_abs[i];
- }
-
- fl_add_xyplot_overlay(graph,arx,time,chest_t_abs,(frame_parms->ofdm_symbol_size>>3),rx_antenna_colors[arx]);
- fl_set_xyplot_overlay_type(graph,arx,FL_DASHED_XYPLOT);
- }
- }
-
- // Avoid flickering effect
- // fl_get_xyplot_ybounds(form->chest_t,&ymin,&ymax); // Does not always work...
- fl_set_xyplot_ybounds(graph,0,(double) ymax);
+ genericPowerPerAntena(graph, phy_vars_ue->frame_parms.nb_antennas_rx,
+ (const scopeSample_t **) phy_vars_ue->pbch_vars[eNB_id]->dl_ch_estimates_time,
+ phy_vars_ue->frame_parms.ofdm_symbol_size>>3);
}
-static void uePbchFrequencyResp (FL_OBJECT *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) {
+static void uePbchFrequencyResp (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) {
// Channel Frequency Response (includes 5 complex sample for filter)
if (!phy_vars_ue->pbch_vars[eNB_id]->dl_ch_estimates)
return;
@@ -575,10 +467,10 @@ static void uePbchFrequencyResp (FL_OBJECT *graph, PHY_VARS_NR_UE *phy_vars_ue,
//fl_set_xyplot_xtics(form->chest_f,nb_antennas_rx*nb_antennas_tx*frame_parms->symbols_per_tti,2);
// fl_set_xyplot_xtics(form->chest_f,nb_antennas_rx*nb_antennas_tx*2,2);
//fl_set_xyplot_xgrid(form->chest_f,FL_GRID_MAJOR);
- fl_set_xyplot_data(graph,freq,chest_f_abs,frame_parms->ofdm_symbol_size,"","","");
+ oai_xygraph(graph,freq,chest_f_abs,frame_parms->ofdm_symbol_size,0,10);
}
-static void uePbchLLR (FL_OBJECT *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) {
+static void uePbchLLR (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) {
// PBCH LLRs
if ( !phy_vars_ue->pbch_vars[eNB_id]->llr)
return;
@@ -591,15 +483,15 @@ static void uePbchLLR (FL_OBJECT *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_i
bit_pbch[i] = (float) i;
}
- fl_set_xyplot_data(graph,bit_pbch,llr_pbch,864,"","","");
+ oai_xygraph(graph,bit_pbch,llr_pbch,864,0,10);
}
-static void uePbchIQ (FL_OBJECT *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) {
+static void uePbchIQ (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) {
// PBCH I/Q of MF Output
if (!phy_vars_ue->pbch_vars[eNB_id]->rxdataF_comp[0])
return;
- int16_t *pbch_comp = (int16_t *) phy_vars_ue->pbch_vars[eNB_id]->rxdataF_comp[0];
+ scopeSample_t *pbch_comp = (scopeSample_t *) phy_vars_ue->pbch_vars[eNB_id]->rxdataF_comp[0];
localBuff(I,180*3);
localBuff(Q,180*3);
int first_symbol=1;
@@ -616,17 +508,17 @@ static void uePbchIQ (FL_OBJECT *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id
AssertFatal(base+nb_re<180*3,"");
for (int i=0; ipdcch_vars[0][eNB_id]->llr)
return;
@@ -656,34 +548,34 @@ static void uePcchLLR (FL_OBJECT *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_i
//fl_set_xyplot_xtics(form->chest_f,nb_antennas_rx*nb_antennas_tx*frame_parms->symbols_per_tti,2);
// fl_set_xyplot_xtics(form->chest_f,nb_antennas_rx*nb_antennas_tx*2,2);
//fl_set_xyplot_xgrid(form->chest_f,FL_GRID_MAJOR);
- fl_set_xyplot_data(graph,freq,chest_f_abs,frame_parms->ofdm_symbol_size,"","","");
+ oai_xygraph(graph,freq,chest_f_abs,frame_parms->ofdm_symbol_size,0,10);
}
-static void uePcchIQ (FL_OBJECT *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) {
+static void uePcchIQ (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) {
// PDCCH I/Q of MF Output
if (!phy_vars_ue->pdcch_vars[0][eNB_id]->rxdataF_comp[0])
return;
- int nb=12*273*4; // 12*frame_parms->N_RB_DL*num_pdcch_symbols
+ int nb=4*273*12; // 12*frame_parms->N_RB_DL*num_pdcch_symbols
localBuff(I,nb*RX_NB_TH_MAX);
localBuff(Q,nb*RX_NB_TH_MAX);
int base=0;
for (int thr=0 ; thr < RX_NB_TH_MAX ; thr ++ ) {
- int16_t *pdcch_comp = (int16_t *) phy_vars_ue->pdcch_vars[thr][eNB_id]->rxdataF_comp[0];
+ scopeSample_t *pdcch_comp = (scopeSample_t *) phy_vars_ue->pdcch_vars[thr][eNB_id]->rxdataF_comp[0];
for (int i=0; i< nb; i++) {
- I[base+i] = pdcch_comp[i*2];
- Q[base+i] = pdcch_comp[i*2+1];
+ I[base+i] = pdcch_comp[i].r;
+ Q[base+i] = pdcch_comp[i].i;
}
base+=nb;
}
- fl_set_xyplot_data(graph,I,Q,base,"","","");
+ oai_xygraph(graph,I,Q,base,0,10);
}
-static void uePdschLLR (FL_OBJECT *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) {
+static void uePdschLLR (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) {
// PDSCH LLRs
if (!phy_vars_ue->pdsch_vars[0][eNB_id]->llr[0])
return;
@@ -707,10 +599,10 @@ static void uePdschLLR (FL_OBJECT *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_
}
//fl_set_xyplot_xbounds(form->pdsch_llr,0,coded_bits_per_codeword);
- fl_set_xyplot_data(graph,bit,llr,base,"","","");
+ oai_xygraph(graph,bit,llr,base,0,10);
}
-static void uePdschIQ (FL_OBJECT *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) {
+static void uePdschIQ (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) {
// PDSCH I/Q of MF Output
if (!phy_vars_ue->pdsch_vars[0][eNB_id]->rxdataF_comp0[0])
return;
@@ -722,17 +614,20 @@ static void uePdschIQ (FL_OBJECT *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_i
int base=0;
for (int thr=0 ; thr < RX_NB_TH_MAX ; thr ++ ) {
- int16_t *pdsch_comp = (int16_t *) phy_vars_ue->pdsch_vars[thr][eNB_id]->rxdataF_comp0[0];
+ scopeSample_t *pdsch_comp = (scopeSample_t *) phy_vars_ue->pdsch_vars[thr][eNB_id]->rxdataF_comp0[0];
for (int s=0; sphy_scope = fl_bgn_form( FL_NO_BOX, 800, 900 );
// This the whole UI box
obj = fl_add_box( FL_BORDER_BOX, 0, 0, 800, 900, "" );
fl_set_object_color( obj, FL_BLACK, FL_BLACK );
+ int curY=0,x,y,w,h;
// Received signal
fdui->graph[0] = nrUEcommonGraph(ueTimeResponse,
- FL_IMPULSE_XYPLOT, 20, 20, 370, 100, "Received Signal (Time-Domain, dB)", FL_RED );
+ FL_NORMAL_XYPLOT, 0, curY, 400, 100, "Received Signal (Time-Domain, dB)", FL_RED );
// Time-domain channel response
fdui->graph[1] = nrUEcommonGraph(ueChannelResponse,
- FL_NORMAL_XYPLOT, 410, 20, 370, 100, "Channel Impulse Response (samples, abs)", FL_RED );
+ FL_NORMAL_XYPLOT, 400, curY, 400, 100, "Channel Impulse Response (samples, abs)", FL_RED );
+ fl_get_object_bbox(fdui->graph[0].graph,&x, &y,&w, &h);
+ curY+=h;
// Frequency-domain channel response
fdui->graph[2] = nrUEcommonGraph(uePbchFrequencyResp,
- FL_IMPULSE_XYPLOT, 20, 140, 760, 100, "Channel Frequency data (RE, dB)", FL_RED );
+ FL_IMPULSE_XYPLOT, 0, curY, 800, 100, "Channel Frequency data (RE, dB)", FL_RED );
+ fl_get_object_bbox(fdui->graph[2].graph,&x, &y,&w, &h);
+ curY+=h;
// LLR of PBCH
fdui->graph[3] = nrUEcommonGraph(uePbchLLR,
- FL_POINTS_XYPLOT, 20, 260, 500, 100, "PBCH Log-Likelihood Ratios (LLR, mag)", FL_GREEN );
+ FL_POINTS_XYPLOT, 0, curY, 500, 100, "PBCH Log-Likelihood Ratios (LLR, mag)", FL_GREEN );
fl_set_xyplot_xgrid(fdui->graph[3].graph,FL_GRID_MAJOR);
// I/Q PBCH comp
fdui->graph[4] = nrUEcommonGraph(uePbchIQ,
- FL_POINTS_XYPLOT, 540, 260, 240, 100, "PBCH I/Q of MF Output", FL_GREEN );
+ FL_POINTS_XYPLOT, 500, curY, 300, 100, "PBCH I/Q of MF Output", FL_GREEN );
+ fl_get_object_bbox(fdui->graph[3].graph,&x, &y,&w, &h);
+ curY+=h;
// LLR of PDCCH
fdui->graph[5] = nrUEcommonGraph(uePcchLLR,
- FL_POINTS_XYPLOT, 20, 380, 500, 100, "PDCCH Log-Likelihood Ratios (LLR, mag)", FL_CYAN );
+ FL_POINTS_XYPLOT, 0, curY, 500, 100, "PDCCH Log-Likelihood Ratios (LLR, mag)", FL_CYAN );
// I/Q PDCCH comp
fdui->graph[6] = nrUEcommonGraph(uePcchIQ,
- FL_POINTS_XYPLOT, 540, 380, 240, 100, "PDCCH I/Q of MF Output", FL_CYAN );
+ FL_POINTS_XYPLOT, 500, curY, 300, 100, "PDCCH I/Q of MF Output", FL_CYAN );
+ fl_get_object_bbox(fdui->graph[5].graph,&x, &y,&w, &h);
+ curY+=h;
// LLR of PDSCH
fdui->graph[7] = nrUEcommonGraph(uePdschLLR,
- FL_POINTS_XYPLOT, 20, 500, 500, 200, "PDSCH Log-Likelihood Ratios (LLR, mag)", FL_YELLOW );
+ FL_POINTS_XYPLOT, 0, curY, 500, 200, "PDSCH Log-Likelihood Ratios (LLR, mag)", FL_YELLOW );
// I/Q PDSCH comp
fdui->graph[8] = nrUEcommonGraph(uePdschIQ,
- FL_POINTS_XYPLOT, 540, 500, 240, 200, "PDSCH I/Q of MF Output", FL_YELLOW );
+ FL_POINTS_XYPLOT, 500, curY, 300, 200, "PDSCH I/Q of MF Output", FL_YELLOW );
+ fl_get_object_bbox(fdui->graph[8].graph,&x, &y,&w, &h);
+ curY+=h;
// Throughput on PDSCH
fdui->graph[9] = nrUEcommonGraph(uePdschThroughput,
- FL_NORMAL_XYPLOT, 20, 720, 500, 100, "PDSCH Throughput [frame]/[kbit/s]", FL_WHITE );
+ FL_NORMAL_XYPLOT, 0, curY, 500, 100, "PDSCH Throughput [frame]/[kbit/s]", FL_WHITE );
fdui->graph[10].graph=NULL;
// Generic UE Button
+#if 0
fdui->button_0 = fl_add_button( FL_PUSH_BUTTON, 540, 720, 240, 40, "" );
fl_set_object_lalign(fdui->button_0, FL_ALIGN_CENTER );
//openair_daq_vars.use_ia_receiver = 0;
@@ -804,6 +708,7 @@ static FD_phy_scope_t *create_phy_scope_nrue( int ID ) {
fl_set_object_color(fdui->button_0, FL_RED, FL_RED);
fl_set_object_callback(fdui->button_0, ia_receiver_on_off, 0 );
fl_hide_object(fdui->button_0);
+#endif
fl_end_form( );
fdui->phy_scope->fdui = fdui;
char buf[100];
@@ -812,11 +717,11 @@ static FD_phy_scope_t *create_phy_scope_nrue( int ID ) {
return fdui;
}
-void phy_scope_nrUE(FD_phy_scope_t *form,
+void phy_scope_nrUE(OAI_phy_scope_t *form,
PHY_VARS_NR_UE *phy_vars_ue,
int eNB_id,
int UE_id) {
- static FD_phy_scope_t *remeberForm=NULL;
+ static OAI_phy_scope_t *remeberForm=NULL;
if (form==NULL)
form=remeberForm;
@@ -829,15 +734,13 @@ void phy_scope_nrUE(FD_phy_scope_t *form,
int i=0;
while (form->graph[i].graph) {
- form->graph[i].nrUEfunct(form->graph[i].graph, phy_vars_ue, eNB_id, UE_id);
+ form->graph[i].nrUEfunct(form->graph+i, phy_vars_ue, eNB_id, UE_id);
i++;
}
fl_check_forms();
}
-static FD_phy_scope_t *form_nrue[NUMBER_OF_UE_MAX];
-static pthread_t forms_thread;
static void *nrUEscopeThread(void *arg) {
PHY_VARS_NR_UE *ue=(PHY_VARS_NR_UE *)arg;
@@ -845,9 +748,13 @@ static void *nrUEscopeThread(void *arg) {
pthread_attr_t atr;
pthread_attr_getstacksize(&atr, &stksize);
pthread_attr_setstacksize(&atr,32*1024*1024 );
+ int fl_argc=1;
+ char *name="5G-UE-scope";
+ fl_initialize (&fl_argc, &name, NULL, 0, 0);
+ OAI_phy_scope_t *form_nrue=create_phy_scope_nrue(0);
while (!oai_exit) {
- phy_scope_nrUE(form_nrue[0],
+ phy_scope_nrUE(form_nrue,
ue,
0,0);
usleep(99*1000);
@@ -857,10 +764,7 @@ static void *nrUEscopeThread(void *arg) {
}
void nrUEinitScope(PHY_VARS_NR_UE *ue) {
- int fl_argc=1;
- char *name="5G-UE-scope";
- fl_initialize (&fl_argc, &name, NULL, 0, 0);
- form_nrue[0] = create_phy_scope_nrue(0);
+ pthread_t forms_thread;
threadCreate(&forms_thread, nrUEscopeThread, ue, "scope", -1, OAI_PRIORITY_RT_LOW);
}
@@ -893,7 +797,7 @@ static void reset_stats_gNB(FL_OBJECT *button,
static FD_stats_form *create_form_stats_form(int ID) {
FL_OBJECT *obj;
- FD_stats_form *fdui = fl_malloc( sizeof *fdui );
+ FD_stats_form *fdui = calloc(( sizeof *fdui ),1);
fdui->vdata = fdui->cdata = NULL;
fdui->ldata = 0;
fdui->stats_form = fl_bgn_form( FL_NO_BOX, 1115, 900 );
diff --git a/openair1/PHY/TOOLS/nr_phy_scope.h b/openair1/PHY/TOOLS/nr_phy_scope.h
index cf28680a94..429537141a 100644
--- a/openair1/PHY/TOOLS/nr_phy_scope.h
+++ b/openair1/PHY/TOOLS/nr_phy_scope.h
@@ -28,7 +28,6 @@
#include
#include "common/ran_context.h"
#include
-#include
#include "PHY/defs_gNB.h"
//#include "PHY/defs_nrUE.h"
//#include "PHY/impl_defs_top.h"
diff --git a/openair1/SCHED_NR/phy_frame_config_nr.h b/openair1/SCHED_NR/phy_frame_config_nr.h
index d1ec5c80d8..e17638f7f3 100644
--- a/openair1/SCHED_NR/phy_frame_config_nr.h
+++ b/openair1/SCHED_NR/phy_frame_config_nr.h
@@ -32,6 +32,7 @@
#ifndef PHY_FRAME_CONFIG_NR_H
#define PHY_FRAME_CONFIG_NR_H
+#include
/************** DEFINE ********************************************/
#define TDD_CONFIG_NB_FRAMES (2)
@@ -79,6 +80,7 @@ int set_tdd_configuration_dedicated_nr(NR_DL_FRAME_PARMS *frame_parms);
@returns nr_slot_t : downlink or uplink */
nr_slot_t nr_slot_select(nfapi_nr_config_request_scf_t *cfg, int nr_frame, int nr_tti);
+int nr_ue_slot_select(fapi_nr_config_request_t *cfg, int nr_frame, int nr_tti);
/** \brief This function frees tdd configuration for nr
* @param frame_parms NR DL Frame parameters
diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
index 9391067607..dae6229657 100644
--- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
+++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
@@ -2249,11 +2249,13 @@ void phy_procedures_nrUE_TX(PHY_VARS_NR_UE *ue,
} // UE_mode==PUSCH
*/
- LOG_D(PHY, "Sending PUCCH\n");
- pucch_procedures_ue_nr(ue,
- gNB_id,
- proc,
- TRUE);
+ if (get_softmodem_params()->do_ra==1) {
+ LOG_D(PHY, "Sending PUCCH\n");
+ pucch_procedures_ue_nr(ue,
+ gNB_id,
+ proc,
+ TRUE);
+ }
LOG_D(PHY, "Sending data \n");
nr_ue_pusch_common_procedures(ue,
diff --git a/openair1/SIMULATION/NR_PHY/prachsim.c b/openair1/SIMULATION/NR_PHY/prachsim.c
index bffd70d588..2df54ca1cf 100644
--- a/openair1/SIMULATION/NR_PHY/prachsim.c
+++ b/openair1/SIMULATION/NR_PHY/prachsim.c
@@ -691,10 +691,10 @@ int main(int argc, char **argv){
}
}
} else {
- n_bytes = fread(&ru->common.rxdata[0][rx_prach_start+frame_parms->samples_per_subframe/2],sizeof(int32_t),frame_parms->samples_per_subframe/2,input_fd);
+ n_bytes = fread(&ru->common.rxdata[0][rx_prach_start],sizeof(int32_t),frame_parms->samples_per_subframe,input_fd);
printf("fread %d bytes from file %s\n",n_bytes,input_file);
- if (n_bytes!=frame_parms->samples_per_subframe/2) {
- printf("expected %d bytes\n",frame_parms->samples_per_subframe/2);
+ if (n_bytes!=frame_parms->samples_per_subframe) {
+ printf("expected %d bytes\n",frame_parms->samples_per_subframe);
exit(-1);
}
}
diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c
index 76ed96d7a4..e0e7a3c166 100644
--- a/openair1/SIMULATION/NR_PHY/ulsim.c
+++ b/openair1/SIMULATION/NR_PHY/ulsim.c
@@ -113,7 +113,7 @@ int main(int argc, char **argv)
double sigma, sigma_dB;
double snr_step = 1;
uint8_t snr1set = 0;
- int slot = 17, frame = 0;
+ int slot = 8, frame = 0;
FILE *output_fd = NULL;
//uint8_t write_output_file = 0;
int trial, n_trials = 1, n_errors = 0, n_false_positive = 0, delay = 0;
@@ -320,11 +320,11 @@ int main(int argc, char **argv)
break;
case 'M':
- SSB_positions = atoi(optarg);
+ // SSB_positions = atoi(optarg);
break;
case 'N':
- Nid_cell = atoi(optarg);
+ // Nid_cell = atoi(optarg);
break;
case 'R':
@@ -693,6 +693,7 @@ int main(int argc, char **argv)
ul_config.ul_config_list[0].pusch_config_pdu.dmrs_config_type = 0;
ul_config.ul_config_list[0].pusch_config_pdu.mcs_index = Imcs;
ul_config.ul_config_list[0].pusch_config_pdu.mcs_table = mcs_table;
+ ul_config.ul_config_list[0].pusch_config_pdu.num_dmrs_cdm_grps_no_data = 1;
ul_config.ul_config_list[0].pusch_config_pdu.pusch_data.new_data_indicator = 0;
ul_config.ul_config_list[0].pusch_config_pdu.pusch_data.rv_index = 0;
ul_config.ul_config_list[0].pusch_config_pdu.nrOfLayers = precod_nbr_layers;
@@ -710,7 +711,7 @@ int main(int argc, char **argv)
TBS = nr_compute_tbs(mod_order, code_rate, nb_rb, nb_symb_sch, nb_re_dmrs * number_dmrs_symbols, 0, 0, precod_nbr_layers);
- if (input_fd != NULL) {
+ if (input_fd == NULL) {
pusch_pdu->pusch_data.tb_size = TBS>>3;
ul_config.ul_config_list[0].pusch_config_pdu.pusch_data.tb_size = TBS;
// set FAPI parameters for UE, put them in the scheduled response and call
diff --git a/openair2/COMMON/x2ap_messages_types.h b/openair2/COMMON/x2ap_messages_types.h
index 38b3b7d653..f0743e60a5 100644
--- a/openair2/COMMON/x2ap_messages_types.h
+++ b/openair2/COMMON/x2ap_messages_types.h
@@ -315,7 +315,7 @@ typedef struct x2ap_senb_addition_req_ack_s {
typedef struct x2ap_ENDC_sgnb_addition_req_s {
int ue_x2_id;
-
+ LTE_PhysCellId_t target_physCellId;
/* used for RRC->X2AP in source eNB */
int rnti;
@@ -386,6 +386,7 @@ typedef struct x2ap_ENDC_reconf_complete_s {
int MeNB_ue_x2_id;
int SgNB_ue_x2_id;
+ LTE_PhysCellId_t target_physCellId;
x2ap_sgNB_reconf_response_information_t reconf_response;
diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac.h b/openair2/LAYER2/NR_MAC_COMMON/nr_mac.h
index 4fa0d9f31e..591c2448b8 100644
--- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac.h
+++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac.h
@@ -24,8 +24,8 @@
* \author R. Knopp, K.H. HSU, G. Casati
* \date 2019
* \version 0.1
- * \company Eurecom / NTUST / Fraunhofer IIS
- * \email: knopp@eurecom.fr, kai-hsiang.hsu@eurecom.fr, guido.casati@iis.fraunhofer.de
+ * \company Eurecom / NTUST / Fraunhofer IIS
+ * \email: knopp@eurecom.fr, kai-hsiang.hsu@eurecom.fr, guido.casati@iis.fraunhofer.de
* \note
* \warning
*/
@@ -71,72 +71,130 @@
// R: Reserved bit, set to zero.
typedef struct {
- uint8_t LCID:6; // octet 1 [5:0]
- uint8_t F:1; // octet 1 [6]
- uint8_t R:1; // octet 1 [7]
- uint8_t L:8; // octet 2 [7:0]
+ uint8_t LCID: 6; // octet 1 [5:0]
+ uint8_t F: 1; // octet 1 [6]
+ uint8_t R: 1; // octet 1 [7]
+ uint8_t L: 8; // octet 2 [7:0]
} __attribute__ ((__packed__)) NR_MAC_SUBHEADER_SHORT;
typedef struct {
- uint8_t LCID:6; // octet 1 [5:0]
- uint8_t F:1; // octet 1 [6]
- uint8_t R:1; // octet 1 [7]
- uint8_t L1:8; // octet 2 [7:0]
- uint8_t L2:8; // octet 3 [7:0]
+ uint8_t LCID: 6; // octet 1 [5:0]
+ uint8_t F: 1; // octet 1 [6]
+ uint8_t R: 1; // octet 1 [7]
+ uint8_t L1: 8; // octet 2 [7:0]
+ uint8_t L2: 8; // octet 3 [7:0]
} __attribute__ ((__packed__)) NR_MAC_SUBHEADER_LONG;
typedef struct {
- uint8_t LCID:6; // octet 1 [5:0]
- uint8_t R:2; // octet 1 [7:6]
+ uint8_t LCID: 6; // octet 1 [5:0]
+ uint8_t R: 2; // octet 1 [7:6]
} __attribute__ ((__packed__)) NR_MAC_SUBHEADER_FIXED;
// BSR MAC CEs
// TS 38.321 ch. 6.1.3.1
// Short BSR for a specific logical channel group ID
typedef struct {
- uint8_t Buffer_size:5; // octet 1 LSB
- uint8_t LcgID:3; // octet 1 MSB
+ uint8_t Buffer_size: 5; // octet 1 LSB
+ uint8_t LcgID: 3; // octet 1 MSB
} __attribute__ ((__packed__)) NR_BSR_SHORT;
typedef NR_BSR_SHORT NR_BSR_SHORT_TRUNCATED;
// Long BSR for all logical channel group ID
typedef struct {
- uint8_t Buffer_size7:8;
- uint8_t Buffer_size6:8;
- uint8_t Buffer_size5:8;
- uint8_t Buffer_size4:8;
- uint8_t Buffer_size3:8;
- uint8_t Buffer_size2:8;
- uint8_t Buffer_size1:8;
- uint8_t Buffer_size0:8;
- uint8_t LcgID0:1;
- uint8_t LcgID1:1;
- uint8_t LcgID2:1;
- uint8_t LcgID3:1;
- uint8_t LcgID4:1;
- uint8_t LcgID5:1;
- uint8_t LcgID6:1;
- uint8_t LcgID7:1;
+ uint8_t Buffer_size7: 8;
+ uint8_t Buffer_size6: 8;
+ uint8_t Buffer_size5: 8;
+ uint8_t Buffer_size4: 8;
+ uint8_t Buffer_size3: 8;
+ uint8_t Buffer_size2: 8;
+ uint8_t Buffer_size1: 8;
+ uint8_t Buffer_size0: 8;
+ uint8_t LcgID0: 1;
+ uint8_t LcgID1: 1;
+ uint8_t LcgID2: 1;
+ uint8_t LcgID3: 1;
+ uint8_t LcgID4: 1;
+ uint8_t LcgID5: 1;
+ uint8_t LcgID6: 1;
+ uint8_t LcgID7: 1;
} __attribute__ ((__packed__)) NR_BSR_LONG;
typedef NR_BSR_LONG NR_BSR_LONG_TRUNCATED;
// 38.321 ch. 6.1.3.4
typedef struct {
- uint8_t TA_COMMAND:6; // octet 1 [5:0]
- uint8_t TAGID:2; // octet 1 [7:6]
+ uint8_t TA_COMMAND: 6; // octet 1 [5:0]
+ uint8_t TAGID: 2; // octet 1 [7:6]
} __attribute__ ((__packed__)) NR_MAC_CE_TA;
// single Entry PHR MAC CE
// TS 38.321 ch. 6.1.3.8
typedef struct {
- uint8_t PH:6;
- uint8_t R1:2;
- uint8_t PCMAX:6;
- uint8_t R2:6;
+ uint8_t PH: 6;
+ uint8_t R1: 2;
+ uint8_t PCMAX: 6;
+ uint8_t R2: 6;
} __attribute__ ((__packed__)) NR_SINGLE_ENTRY_PHR_MAC_CE;
+
+// SP ZP CSI-RS Resource Set Activation/Deactivation MAC CE
+// 38.321 ch. 6.1.3.19
+typedef struct {
+ uint8_t BWPID: 2; // octet 1 [1:0]
+ uint8_t CELLID: 5; // octet 1 [6:2]
+ uint8_t A_D: 1; // octet 1 [7]
+ uint8_t CSIRS_RSC_ID: 4; // octet 2 [3:0]
+ uint8_t R: 4; // octet 2 [7:4]
+} __attribute__ ((__packed__)) NR_MAC_CE_SP_ZP_CSI_RS_RES_SET;
+
+//TS 38.321 Sec 6.1.3.15, TCI State indicaton for UE-Specific PDCCH MAC CE
+typedef struct {
+ uint8_t CoresetId1: 3; //Octect 1 [2:0]
+ uint8_t ServingCellId: 5; //Octect 1 [7:3]
+ uint8_t TciStateId: 7; //Octect 2 [6:0]
+ uint8_t CoresetId2: 1; //Octect 2 [7]
+} __attribute__ ((__packed__)) NR_TCI_PDCCH;
+
+//TS 38.321 Sec 6.1.3.14, TCI State activation/deactivation for UE Specific PDSCH MAC CE
+typedef struct {
+ uint8_t BWP_Id: 2; //Octect 1 [1:0]
+ uint8_t ServingCellId: 5; //Octect 1 [6:2]
+ uint8_t R: 1; //Octect 1 [7]
+ uint8_t T[]; //Octects 2 to MAX TCI States/8
+} __attribute__ ((__packed__)) NR_TCI_PDSCH_APERIODIC_CSI;
+
+//TS 6.1.3.16, SP CSI reporting on PUCCH Activation/Deactivation MAC CE
+typedef struct {
+ uint8_t BWP_Id: 2; //Octect 1 [1:0]
+ uint8_t ServingCellId: 5; //Octect 1 [6:2]
+ uint8_t R1: 1; //Octect 1 [7]
+ uint8_t S0: 1; //Octect 2 [0]
+ uint8_t S1: 1; //Octect 2 [1]
+ uint8_t S2: 1; //Octect 2 [2]
+ uint8_t S3: 1; //Octect 2 [3]
+ uint8_t R2: 4; //Octect 2 [7:4]
+} __attribute__ ((__packed__)) NR_PUCCH_CSI_REPORTING;
+
+
+//TS 38.321 sec 6.1.3.12
+//SP CSI-RS / CSI-IM Resource Set Activation/Deactivation MAC CE
+typedef struct {
+ uint8_t BWP_ID: 2;
+ uint8_t SCID: 5;
+ uint8_t A_D: 1;
+ uint8_t SP_CSI_RSID: 6;
+ uint8_t IM: 1;
+ uint8_t R1: 1;
+ uint8_t SP_CSI_IMID: 6;
+ uint8_t R2: 2;
+ struct TCI_S {
+ uint8_t TCI_STATE_ID: 6;
+ uint8_t R: 2;
+ } __attribute__ ((__packed__)) TCI_STATE;
+} __attribute__ ((__packed__)) CSI_RS_CSI_IM_ACT_DEACT_MAC_CE;
+
+
//* RAR MAC subheader // TS 38.321 ch. 6.1.5, 6.2.2 *//
// - E: The Extension field is a flag indicating if the MAC subPDU including this MAC subheader is the last MAC subPDU or not in the MAC PDU
// - T: The Type field is a flag indicating whether the MAC subheader contains a Random Access Preamble ID or a Backoff Indicator (0, BI) (1, RAPID)
@@ -146,30 +204,30 @@ typedef struct {
/*!\brief RAR MAC subheader with RAPID */
typedef struct {
- uint8_t RAPID:6;
- uint8_t T:1;
- uint8_t E:1;
+ uint8_t RAPID: 6;
+ uint8_t T: 1;
+ uint8_t E: 1;
} __attribute__ ((__packed__)) NR_RA_HEADER_RAPID;
/*!\brief RAR MAC subheader with Backoff Indicator */
typedef struct {
- uint8_t BI:4;
- uint8_t R:2;
- uint8_t T:1;
- uint8_t E:1;
+ uint8_t BI: 4;
+ uint8_t R: 2;
+ uint8_t T: 1;
+ uint8_t E: 1;
} __attribute__ ((__packed__)) NR_RA_HEADER_BI;
// TS 38.321 ch. 6.2.3
typedef struct {
- uint8_t TA1:7; // octet 1 [6:0]
- uint8_t R:1; // octet 1 [7]
- uint8_t UL_GRANT_1:3; // octet 2 [2:0]
- uint8_t TA2:5; // octet 2 [7:3]
- uint8_t UL_GRANT_2:8; // octet 3 [7:0]
- uint8_t UL_GRANT_3:8; // octet 4 [7:0]
- uint8_t UL_GRANT_4:8; // octet 5 [7:0]
- uint8_t TCRNTI_1:8; // octet 6 [7:0]
- uint8_t TCRNTI_2:8; // octet 7 [7:0]
+ uint8_t TA1: 7; // octet 1 [6:0]
+ uint8_t R: 1; // octet 1 [7]
+ uint8_t UL_GRANT_1: 3; // octet 2 [2:0]
+ uint8_t TA2: 5; // octet 2 [7:3]
+ uint8_t UL_GRANT_2: 8; // octet 3 [7:0]
+ uint8_t UL_GRANT_3: 8; // octet 4 [7:0]
+ uint8_t UL_GRANT_4: 8; // octet 5 [7:0]
+ uint8_t TCRNTI_1: 8; // octet 6 [7:0]
+ uint8_t TCRNTI_2: 8; // octet 7 [7:0]
} __attribute__ ((__packed__)) NR_MAC_RAR;
// DCI pdu structures. Used by both gNB and UE.
@@ -249,7 +307,7 @@ typedef struct {
#define DL_SCH_LCID_TCI_STATE_IND_UE_SPEC_PDCCH 0x34
#define DL_SCH_LCID_TCI_STATE_ACT_UE_SPEC_PDSCH 0x35
#define DL_SCH_LCID_APERIODIC_CSI_TRI_STATE_SUBSEL 0x36
-#define DL_SCH_LCID_SP_CSI_RS_CSI_IM_RES_SET_ACT 0X37
+#define DL_SCH_LCID_SP_CSI_RS_CSI_IM_RES_SET_ACT 0X37
#define DL_SCH_LCID_DUPLICATION_ACT 0X38
#define DL_SCH_LCID_SCell_ACT_4_OCT 0X39
#define DL_SCH_LCID_SCell_ACT_1_OCT 0X3A
@@ -277,9 +335,9 @@ typedef struct {
#define UL_SCH_LCID_L_BSR 0x3E
#define UL_SCH_LCID_PADDING 0x3F
-#define NR_MAX_NUM_LCID 32
-#define NR_MAX_NUM_LCGID 8
-#define MAX_RLC_SDU_SUBHEADER_SIZE 3
+#define NR_MAX_NUM_LCID 32
+#define NR_MAX_NUM_LCGID 8
+#define MAX_RLC_SDU_SUBHEADER_SIZE 3
#endif /*__LAYER2_MAC_H__ */
diff --git a/openair2/LAYER2/NR_MAC_UE/mac_proto.h b/openair2/LAYER2/NR_MAC_UE/mac_proto.h
index a0972a0720..e9d7a97a5d 100755
--- a/openair2/LAYER2/NR_MAC_UE/mac_proto.h
+++ b/openair2/LAYER2/NR_MAC_UE/mac_proto.h
@@ -263,5 +263,6 @@ void nr_Msg1_transmitted(module_id_t mod_id, uint8_t CC_id, frame_t frameP, uint
void nr_Msg3_transmitted(module_id_t mod_id, uint8_t CC_id, frame_t frameP, uint8_t gNB_id);
+void nr_ue_msg2_scheduler(module_id_t mod_id, uint16_t rach_frame, uint16_t rach_slot, uint16_t *msg2_frame, uint16_t *msg2_slot);
#endif
/** @}*/
diff --git a/openair2/LAYER2/NR_MAC_UE/main_ue_nr.c b/openair2/LAYER2/NR_MAC_UE/main_ue_nr.c
index 2cb9e5971d..af9822a5df 100644
--- a/openair2/LAYER2/NR_MAC_UE/main_ue_nr.c
+++ b/openair2/LAYER2/NR_MAC_UE/main_ue_nr.c
@@ -50,7 +50,7 @@ NR_UE_MAC_INST_t * nr_l2_init_ue(NR_UE_RRC_INST_t* rrc_inst)
//LOG_I(MAC, "[MAIN] init UE MAC functions \n");
//init mac here
- nr_ue_mac_inst = (NR_UE_MAC_INST_t *)malloc(sizeof(NR_UE_MAC_INST_t)*NB_NR_UE_MAC_INST);
+ nr_ue_mac_inst = (NR_UE_MAC_INST_t *)calloc(sizeof(NR_UE_MAC_INST_t),NB_NR_UE_MAC_INST);
if (rrc_inst) {
nr_rrc_mac_config_req_ue(0,0,0,NULL,rrc_inst->cell_group_config);
diff --git a/openair2/LAYER2/NR_MAC_UE/nr_l1_helpers.c b/openair2/LAYER2/NR_MAC_UE/nr_l1_helpers.c
index 9d7f3264c5..f8bb1e5f8e 100644
--- a/openair2/LAYER2/NR_MAC_UE/nr_l1_helpers.c
+++ b/openair2/LAYER2/NR_MAC_UE/nr_l1_helpers.c
@@ -91,8 +91,8 @@ int8_t nr_get_DELTA_PREAMBLE(module_id_t mod_id, int CC_id, uint16_t prach_forma
prachConfigIndex = nr_rach_ConfigCommon->rach_ConfigGeneric.prach_ConfigurationIndex;
if (prach_sequence_length == 0) {
+ AssertFatal(prach_format < 4, "Illegal PRACH format %d for sequence length 839\n", prach_format);
switch (prach_format) {
- AssertFatal(prach_format < 4, "Illegal PRACH format %d for sequence length 839\n", prach_format);
// long preamble formats
case 0:
diff --git a/openair2/LAYER2/NR_MAC_UE/rar_tools_nrUE.c b/openair2/LAYER2/NR_MAC_UE/rar_tools_nrUE.c
index bfd2d3dbeb..31a865f317 100644
--- a/openair2/LAYER2/NR_MAC_UE/rar_tools_nrUE.c
+++ b/openair2/LAYER2/NR_MAC_UE/rar_tools_nrUE.c
@@ -44,6 +44,7 @@
#include "NR_MAC_UE/mac.h"
#include "NR_MAC_UE/mac_proto.h"
#include "NR_MAC_COMMON/nr_mac_extern.h"
+#include
#define DEBUG_RAR
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
index f30f4ee29d..61eface5bc 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
@@ -368,7 +368,6 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP,
gNB_MAC_INST *gNB = RC.nrmac[module_idP];
NR_UE_list_t *UE_list = &gNB->UE_list;
-
NR_UE_sched_ctrl_t *ue_sched_ctl = &UE_list->UE_sched_ctrl[UE_id];
NR_COMMON_channels_t *cc = gNB->common_channels;
NR_ServingCellConfigCommon_t *scc = cc->ServingCellConfigCommon;
@@ -401,7 +400,7 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP,
// hardcoding dlsch to be in slot 1
if (!(slot_txP%num_slots_per_tdd)) {
if(slot_txP==0)
- *dlsch_in_slot_bitmap = 0x7e;
+ *dlsch_in_slot_bitmap = 0x02;
else
*dlsch_in_slot_bitmap = 0x00;
}
@@ -437,7 +436,7 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP,
rnti = 0;//UE_RNTI(module_idP, i);
CC_id = 0;//UE_PCCID(module_idP, i);
-
+
} //END if (UE_list->active[i])
} //END for (i = 0; i < MAX_MOBILES_PER_GNB; i++)
*/
@@ -447,26 +446,31 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP,
schedule_nr_mib(module_idP, frame_txP, slot_txP);
}
- // TbD once RACH is available, start ta_timer when UE is connected
- if (ue_sched_ctl->ta_timer) ue_sched_ctl->ta_timer--;
-
- if (ue_sched_ctl->ta_timer == 0) {
- gNB->ta_command = ue_sched_ctl->ta_update;
- /* if time is up, then set the timer to not send it for 5 frames
- // regardless of the TA value */
- ue_sched_ctl->ta_timer = 100;
- /* reset ta_update */
- ue_sched_ctl->ta_update = 31;
- /* MAC CE flag indicating TA length */
- gNB->ta_len = 2;
- }
-
if (get_softmodem_params()->phy_test == 0)
nr_schedule_RA(module_idP, frame_txP, slot_txP);
else
UE_list->fiveG_connected[UE_id] = true;
// Phytest scheduling
+
+ if (get_softmodem_params()->phy_test) {
+
+ // TbD once RACH is available, start ta_timer when UE is connected
+ if (ue_sched_ctl->ta_timer)
+ ue_sched_ctl->ta_timer--;
+
+ if (ue_sched_ctl->ta_timer == 0) {
+ gNB->ta_command = ue_sched_ctl->ta_update;
+ /* if time is up, then set the timer to not send it for 5 frames
+ // regardless of the TA value */
+ ue_sched_ctl->ta_timer = 100;
+ /* reset ta_update */
+ ue_sched_ctl->ta_update = 31;
+ /* MAC CE flag indicating TA length */
+ gNB->ta_len = 2;
+ }
+ }
+
if (UE_list->fiveG_connected[UE_id] && (is_xlsch_in_slot(*dlsch_in_slot_bitmap,slot_txP%num_slots_per_tdd))) {
ue_sched_ctl->current_harq_pid = slot_txP % num_slots_per_tdd;
nr_update_pucch_scheduling(module_idP, UE_id, frame_txP, slot_txP, num_slots_per_tdd,&pucch_sched);
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
index 7777e307fb..cf2323f571 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
@@ -47,6 +47,10 @@
////////////////////////////////////////////////////////
/////* DLSCH MAC PDU generation (6.1.2 TS 38.321) */////
////////////////////////////////////////////////////////
+#define OCTET 8
+#define HALFWORD 16
+#define WORD 32
+//#define SIZE_OF_POINTER sizeof (void *)
int nr_generate_dlsch_pdu(module_id_t module_idP,
unsigned char *sdus_payload,
@@ -56,19 +60,23 @@ int nr_generate_dlsch_pdu(module_id_t module_idP,
unsigned char *sdu_lcids,
unsigned char drx_cmd,
unsigned char *ue_cont_res_id,
- unsigned short post_padding){
-
+ unsigned short post_padding) {
gNB_MAC_INST *gNB = RC.nrmac[module_idP];
-
NR_MAC_SUBHEADER_FIXED *mac_pdu_ptr = (NR_MAC_SUBHEADER_FIXED *) mac_pdu;
- unsigned char * dlsch_buffer_ptr = sdus_payload;
+ unsigned char *dlsch_buffer_ptr = sdus_payload;
uint8_t last_size = 0;
int offset = 0, mac_ce_size, i, timing_advance_cmd, tag_id = 0;
- // MAC CEs
+ // MAC CEs
uint8_t mac_header_control_elements[16], *ce_ptr;
ce_ptr = &mac_header_control_elements[0];
+ uint16_t UE_id = 0; //TODO need to get as a function parameter or need to invoke api to UE_id using module Id and RNTI
+ gNB_MAC_INST *gNB_mac = RC.nrmac[module_idP];
+ NR_UE_list_t *UE_list = &gNB_mac->UE_list;
+ NR_UE_sched_ctrl_t *ue_sched_ctl = NULL;
+ //NR_CellGroupConfig_t *config = UE_list->secondaryCellGroup[UE_id];
+ ue_sched_ctl = &(UE_list->UE_sched_ctrl[UE_id]);
- // 1) Compute MAC CE and related subheaders
+ // 1) Compute MAC CE and related subheaders
// DRX command subheader (MAC CE size 0)
if (drx_cmd != 255) {
@@ -83,25 +91,23 @@ int nr_generate_dlsch_pdu(module_id_t module_idP,
// now TA is always send when ta_timer resets regardless of its value
// this is done to avoid issues with the timeAlignmentTimer which is
// supposed to monitor if the UE received TA or not */
- if (gNB->ta_len){
+ if (gNB->ta_len) {
mac_pdu_ptr->R = 0;
mac_pdu_ptr->LCID = DL_SCH_LCID_TA_COMMAND;
//last_size = 1;
mac_pdu_ptr++;
-
// TA MAC CE (1 octet)
timing_advance_cmd = gNB->ta_command;
- AssertFatal(timing_advance_cmd < 64,"timing_advance_cmd %d > 63\n", timing_advance_cmd);
+ AssertFatal(timing_advance_cmd < 64, "timing_advance_cmd %d > 63\n", timing_advance_cmd);
((NR_MAC_CE_TA *) ce_ptr)->TA_COMMAND = timing_advance_cmd; //(timing_advance_cmd+31)&0x3f;
- if (gNB->tag->tag_Id != 0){
- tag_id = gNB->tag->tag_Id;
+
+ if (gNB->tag->tag_Id != 0) {
+ tag_id = gNB->tag->tag_Id;
((NR_MAC_CE_TA *) ce_ptr)->TAGID = tag_id;
}
LOG_D(MAC, "NR MAC CE timing advance command = %d (%d) TAG ID = %d\n", timing_advance_cmd, ((NR_MAC_CE_TA *) ce_ptr)->TA_COMMAND, tag_id);
-
mac_ce_size = sizeof(NR_MAC_CE_TA);
-
// Copying bytes for MAC CEs to the mac pdu pointer
memcpy((void *) mac_pdu_ptr, (void *) ce_ptr, mac_ce_size);
ce_ptr += mac_ce_size;
@@ -111,27 +117,189 @@ int nr_generate_dlsch_pdu(module_id_t module_idP,
// Contention resolution fixed subheader and MAC CE
if (ue_cont_res_id) {
mac_pdu_ptr->R = 0;
- mac_pdu_ptr->LCID = DL_SCH_LCID_CON_RES_ID;
+ mac_pdu_ptr->LCID = DL_SCH_LCID_CON_RES_ID;
mac_pdu_ptr++;
//last_size = 1;
-
// contention resolution identity MAC ce has a fixed 48 bit size
- // this contains the UL CCCH SDU. If UL CCCH SDU is longer than 48 bits,
+ // this contains the UL CCCH SDU. If UL CCCH SDU is longer than 48 bits,
// it contains the first 48 bits of the UL CCCH SDU
LOG_T(MAC, "[gNB ][RAPROC] Generate contention resolution msg: %x.%x.%x.%x.%x.%x\n",
- ue_cont_res_id[0], ue_cont_res_id[1], ue_cont_res_id[2],
- ue_cont_res_id[3], ue_cont_res_id[4], ue_cont_res_id[5]);
-
+ ue_cont_res_id[0], ue_cont_res_id[1], ue_cont_res_id[2],
+ ue_cont_res_id[3], ue_cont_res_id[4], ue_cont_res_id[5]);
// Copying bytes (6 octects) to CEs pointer
mac_ce_size = 6;
memcpy(ce_ptr, ue_cont_res_id, mac_ce_size);
-
// Copying bytes for MAC CEs to mac pdu pointer
memcpy((void *) mac_pdu_ptr, (void *) ce_ptr, mac_ce_size);
ce_ptr += mac_ce_size;
mac_pdu_ptr += (unsigned char) mac_ce_size;
}
+ //TS 38.321 Sec 6.1.3.15 TCI State indication for UE Specific PDCCH MAC CE SubPDU generation
+ if (ue_sched_ctl->UE_mac_ce_ctrl.pdcch_state_ind.is_scheduled) {
+ //filling subheader
+ mac_pdu_ptr->R = 0;
+ mac_pdu_ptr->LCID = DL_SCH_LCID_TCI_STATE_IND_UE_SPEC_PDCCH;
+ mac_pdu_ptr++;
+ //Creating the instance of CE structure
+ NR_TCI_PDCCH nr_UESpec_TCI_StateInd_PDCCH;
+ //filling the CE structre
+ nr_UESpec_TCI_StateInd_PDCCH.CoresetId1 = ((ue_sched_ctl->UE_mac_ce_ctrl.pdcch_state_ind.coresetId) & 0xF) >> 1; //extracting MSB 3 bits from LS nibble
+ nr_UESpec_TCI_StateInd_PDCCH.ServingCellId = (ue_sched_ctl->UE_mac_ce_ctrl.pdcch_state_ind.servingCellId) & 0x1F; //extracting LSB 5 Bits
+ nr_UESpec_TCI_StateInd_PDCCH.TciStateId = (ue_sched_ctl->UE_mac_ce_ctrl.pdcch_state_ind.tciStateId) & 0x7F; //extracting LSB 7 bits
+ nr_UESpec_TCI_StateInd_PDCCH.CoresetId2 = (ue_sched_ctl->UE_mac_ce_ctrl.pdcch_state_ind.coresetId) & 0x1; //extracting LSB 1 bit
+ LOG_D(MAC, "NR MAC CE TCI state indication for UE Specific PDCCH = %d \n", nr_UESpec_TCI_StateInd_PDCCH.TciStateId);
+ mac_ce_size = sizeof(NR_TCI_PDCCH);
+ // Copying bytes for MAC CEs to the mac pdu pointer
+ memcpy((void *) mac_pdu_ptr, (void *)&nr_UESpec_TCI_StateInd_PDCCH, mac_ce_size);
+ //incrementing the PDU pointer
+ mac_pdu_ptr += (unsigned char) mac_ce_size;
+ }
+
+ //TS 38.321 Sec 6.1.3.16, SP CSI reporting on PUCCH Activation/Deactivation MAC CE
+ if (ue_sched_ctl->UE_mac_ce_ctrl.SP_CSI_reporting_pucch.is_scheduled) {
+ //filling the subheader
+ mac_pdu_ptr->R = 0;
+ mac_pdu_ptr->LCID = DL_SCH_LCID_SP_CSI_REP_PUCCH_ACT;
+ mac_pdu_ptr++;
+ //creating the instance of CE structure
+ NR_PUCCH_CSI_REPORTING nr_PUCCH_CSI_reportingActDeact;
+ //filling the CE structure
+ nr_PUCCH_CSI_reportingActDeact.BWP_Id = (ue_sched_ctl->UE_mac_ce_ctrl.SP_CSI_reporting_pucch.bwpId) & 0x3; //extracting LSB 2 bibs
+ nr_PUCCH_CSI_reportingActDeact.ServingCellId = (ue_sched_ctl->UE_mac_ce_ctrl.SP_CSI_reporting_pucch.servingCellId) & 0x1F; //extracting LSB 5 bits
+ nr_PUCCH_CSI_reportingActDeact.S0 = ue_sched_ctl->UE_mac_ce_ctrl.SP_CSI_reporting_pucch.s0tos3_actDeact[0];
+ nr_PUCCH_CSI_reportingActDeact.S1 = ue_sched_ctl->UE_mac_ce_ctrl.SP_CSI_reporting_pucch.s0tos3_actDeact[1];
+ nr_PUCCH_CSI_reportingActDeact.S2 = ue_sched_ctl->UE_mac_ce_ctrl.SP_CSI_reporting_pucch.s0tos3_actDeact[2];
+ nr_PUCCH_CSI_reportingActDeact.S3 = ue_sched_ctl->UE_mac_ce_ctrl.SP_CSI_reporting_pucch.s0tos3_actDeact[3];
+ nr_PUCCH_CSI_reportingActDeact.R2 = 0;
+ mac_ce_size = sizeof(NR_PUCCH_CSI_REPORTING);
+ // Copying MAC CE data to the mac pdu pointer
+ memcpy((void *) mac_pdu_ptr, (void *)&nr_PUCCH_CSI_reportingActDeact, mac_ce_size);
+ //incrementing the PDU pointer
+ mac_pdu_ptr += (unsigned char) mac_ce_size;
+ }
+
+ //TS 38.321 Sec 6.1.3.14, TCI State activation/deactivation for UE Specific PDSCH MAC CE
+ if (ue_sched_ctl->UE_mac_ce_ctrl.pdsch_TCI_States_ActDeact.is_scheduled) {
+ //Computing the number of octects to be allocated for Flexible array member
+ //of MAC CE structure
+ uint8_t num_octects = (ue_sched_ctl->UE_mac_ce_ctrl.pdsch_TCI_States_ActDeact.highestTciStateActivated) / 8 + 1; //Calculating the number of octects for allocating the memory
+ //filling the subheader
+ ((NR_MAC_SUBHEADER_SHORT *) mac_pdu_ptr)->R = 0;
+ ((NR_MAC_SUBHEADER_SHORT *) mac_pdu_ptr)->F = 0;
+ ((NR_MAC_SUBHEADER_SHORT *) mac_pdu_ptr)->LCID = DL_SCH_LCID_TCI_STATE_ACT_UE_SPEC_PDSCH;
+ ((NR_MAC_SUBHEADER_SHORT *) mac_pdu_ptr)->L = sizeof(NR_TCI_PDSCH_APERIODIC_CSI) + num_octects * sizeof(uint8_t);
+ last_size = 2;
+ //Incrementing the PDU pointer
+ mac_pdu_ptr += last_size;
+ //allocating memory for CE Structure
+ NR_TCI_PDSCH_APERIODIC_CSI *nr_UESpec_TCI_StateInd_PDSCH = (NR_TCI_PDSCH_APERIODIC_CSI *)malloc(sizeof(NR_TCI_PDSCH_APERIODIC_CSI) + num_octects * sizeof(uint8_t));
+ //initializing to zero
+ memset((void *)nr_UESpec_TCI_StateInd_PDSCH, 0, sizeof(NR_TCI_PDSCH_APERIODIC_CSI) + num_octects * sizeof(uint8_t));
+ //filling the CE Structure
+ nr_UESpec_TCI_StateInd_PDSCH->BWP_Id = (ue_sched_ctl->UE_mac_ce_ctrl.pdsch_TCI_States_ActDeact.bwpId) & 0x3; //extracting LSB 2 Bits
+ nr_UESpec_TCI_StateInd_PDSCH->ServingCellId = (ue_sched_ctl->UE_mac_ce_ctrl.pdsch_TCI_States_ActDeact.servingCellId) & 0x1F; //extracting LSB 5 bits
+
+ for(i = 0; i < (num_octects * 8); i++) {
+ if(ue_sched_ctl->UE_mac_ce_ctrl.pdsch_TCI_States_ActDeact.tciStateActDeact[i])
+ nr_UESpec_TCI_StateInd_PDSCH->T[i / 8] = nr_UESpec_TCI_StateInd_PDSCH->T[i / 8] | (1 << (i % 8));
+ }
+
+ mac_ce_size = sizeof(NR_TCI_PDSCH_APERIODIC_CSI) + num_octects * sizeof(uint8_t);
+ //Copying bytes for MAC CEs to the mac pdu pointer
+ memcpy((void *) mac_pdu_ptr, (void *)nr_UESpec_TCI_StateInd_PDSCH, mac_ce_size);
+ //incrementing the mac pdu pointer
+ mac_pdu_ptr += (unsigned char) mac_ce_size;
+ //freeing the allocated memory
+ free(nr_UESpec_TCI_StateInd_PDSCH);
+ }
+
+ //TS38.321 Sec 6.1.3.13 Aperiodic CSI Trigger State Subselection MAC CE
+ if (ue_sched_ctl->UE_mac_ce_ctrl.aperi_CSI_trigger.is_scheduled) {
+ //Computing the number of octects to be allocated for Flexible array member
+ //of MAC CE structure
+ uint8_t num_octects = (ue_sched_ctl->UE_mac_ce_ctrl.aperi_CSI_trigger.highestTriggerStateSelected) / 8 + 1; //Calculating the number of octects for allocating the memory
+ //filling the subheader
+ ((NR_MAC_SUBHEADER_SHORT *) mac_pdu_ptr)->R = 0;
+ ((NR_MAC_SUBHEADER_SHORT *) mac_pdu_ptr)->F = 0;
+ ((NR_MAC_SUBHEADER_SHORT *) mac_pdu_ptr)->LCID = DL_SCH_LCID_APERIODIC_CSI_TRI_STATE_SUBSEL;
+ ((NR_MAC_SUBHEADER_SHORT *) mac_pdu_ptr)->L = sizeof(NR_TCI_PDSCH_APERIODIC_CSI) + num_octects * sizeof(uint8_t);
+ last_size = 2;
+ //Incrementing the PDU pointer
+ mac_pdu_ptr += last_size;
+ //allocating memory for CE structure
+ NR_TCI_PDSCH_APERIODIC_CSI *nr_Aperiodic_CSI_Trigger = (NR_TCI_PDSCH_APERIODIC_CSI *)malloc(sizeof(NR_TCI_PDSCH_APERIODIC_CSI) + num_octects * sizeof(uint8_t));
+ //initializing to zero
+ memset((void *)nr_Aperiodic_CSI_Trigger, 0, sizeof(NR_TCI_PDSCH_APERIODIC_CSI) + num_octects * sizeof(uint8_t));
+ //filling the CE Structure
+ nr_Aperiodic_CSI_Trigger->BWP_Id = (ue_sched_ctl->UE_mac_ce_ctrl.aperi_CSI_trigger.bwpId) & 0x3; //extracting LSB 2 bits
+ nr_Aperiodic_CSI_Trigger->ServingCellId = (ue_sched_ctl->UE_mac_ce_ctrl.aperi_CSI_trigger.servingCellId) & 0x1F; //extracting LSB 5 bits
+ nr_Aperiodic_CSI_Trigger->R = 0;
+
+ for(i = 0; i < (num_octects * 8); i++) {
+ if(ue_sched_ctl->UE_mac_ce_ctrl.aperi_CSI_trigger.triggerStateSelection[i])
+ nr_Aperiodic_CSI_Trigger->T[i / 8] = nr_Aperiodic_CSI_Trigger->T[i / 8] | (1 << (i % 8));
+ }
+
+ mac_ce_size = sizeof(NR_TCI_PDSCH_APERIODIC_CSI) + num_octects * sizeof(uint8_t);
+ // Copying bytes for MAC CEs to the mac pdu pointer
+ memcpy((void *) mac_pdu_ptr, (void *)nr_Aperiodic_CSI_Trigger, mac_ce_size);
+ //incrementing the mac pdu pointer
+ mac_pdu_ptr += (unsigned char) mac_ce_size;
+ //freeing the allocated memory
+ free(nr_Aperiodic_CSI_Trigger);
+ }
+
+ if (ue_sched_ctl->UE_mac_ce_ctrl.sp_zp_csi_rs.is_scheduled) {
+ ((NR_MAC_SUBHEADER_FIXED *) mac_pdu_ptr)->R = 0;
+ ((NR_MAC_SUBHEADER_FIXED *) mac_pdu_ptr)->LCID = DL_SCH_LCID_SP_ZP_CSI_RS_RES_SET_ACT;
+ mac_pdu_ptr++;
+ ((NR_MAC_CE_SP_ZP_CSI_RS_RES_SET *) mac_pdu_ptr)->A_D = ue_sched_ctl->UE_mac_ce_ctrl.sp_zp_csi_rs.act_deact;
+ ((NR_MAC_CE_SP_ZP_CSI_RS_RES_SET *) mac_pdu_ptr)->CELLID = ue_sched_ctl->UE_mac_ce_ctrl.sp_zp_csi_rs.serv_cell_id & 0x1F; //5 bits
+ ((NR_MAC_CE_SP_ZP_CSI_RS_RES_SET *) mac_pdu_ptr)->BWPID = ue_sched_ctl->UE_mac_ce_ctrl.sp_zp_csi_rs.bwpid & 0x3; //2 bits
+ ((NR_MAC_CE_SP_ZP_CSI_RS_RES_SET *) mac_pdu_ptr)->CSIRS_RSC_ID = ue_sched_ctl->UE_mac_ce_ctrl.sp_zp_csi_rs.rsc_id & 0xF; //4 bits
+ ((NR_MAC_CE_SP_ZP_CSI_RS_RES_SET *) mac_pdu_ptr)->R = 0;
+ LOG_D(MAC, "NR MAC CE of ZP CSIRS Serv cell ID = %d BWPID= %d Rsc set ID = %d\n", ue_sched_ctl->UE_mac_ce_ctrl.sp_zp_csi_rs.serv_cell_id, ue_sched_ctl->UE_mac_ce_ctrl.sp_zp_csi_rs.bwpid,
+ ue_sched_ctl->UE_mac_ce_ctrl.sp_zp_csi_rs.rsc_id);
+ mac_ce_size = sizeof(NR_MAC_CE_SP_ZP_CSI_RS_RES_SET);
+ mac_pdu_ptr += (unsigned char) mac_ce_size;
+ }
+
+ if (ue_sched_ctl->UE_mac_ce_ctrl.csi_im.is_scheduled) {
+ mac_pdu_ptr->R = 0;
+ mac_pdu_ptr->LCID = DL_SCH_LCID_SP_CSI_RS_CSI_IM_RES_SET_ACT;
+ mac_pdu_ptr++;
+ CSI_RS_CSI_IM_ACT_DEACT_MAC_CE csi_rs_im_act_deact_ce;
+ csi_rs_im_act_deact_ce.A_D = ue_sched_ctl->UE_mac_ce_ctrl.csi_im.act_deact;
+ csi_rs_im_act_deact_ce.SCID = ue_sched_ctl->UE_mac_ce_ctrl.csi_im.serv_cellid & 0x3F;//gNB_PHY -> ssb_pdu.ssb_pdu_rel15.PhysCellId;
+ csi_rs_im_act_deact_ce.BWP_ID = ue_sched_ctl->UE_mac_ce_ctrl.csi_im.bwp_id;
+ csi_rs_im_act_deact_ce.R1 = 0;
+ csi_rs_im_act_deact_ce.IM = ue_sched_ctl->UE_mac_ce_ctrl.csi_im.im;// IF set CSI IM Rsc id will presesent else CSI IM RSC ID is abscent
+ csi_rs_im_act_deact_ce.SP_CSI_RSID = ue_sched_ctl->UE_mac_ce_ctrl.csi_im.nzp_csi_rsc_id;
+
+ if ( csi_rs_im_act_deact_ce.IM ) { //is_scheduled if IM is 1 else this field will not present
+ csi_rs_im_act_deact_ce.R2 = 0;
+ csi_rs_im_act_deact_ce.SP_CSI_IMID = ue_sched_ctl->UE_mac_ce_ctrl.csi_im.csi_im_rsc_id;
+ mac_ce_size = sizeof ( csi_rs_im_act_deact_ce ) - sizeof ( csi_rs_im_act_deact_ce.TCI_STATE );
+ } else {
+ mac_ce_size = sizeof ( csi_rs_im_act_deact_ce ) - sizeof ( csi_rs_im_act_deact_ce.TCI_STATE ) - 1;
+ }
+
+ memcpy ((void *) mac_pdu_ptr, (void *) & ( csi_rs_im_act_deact_ce), mac_ce_size);
+ mac_pdu_ptr += (unsigned char) mac_ce_size;
+
+ if (csi_rs_im_act_deact_ce.A_D ) { //Following IE is_scheduled only if A/D is 1
+ mac_ce_size = sizeof ( struct TCI_S);
+
+ for ( i = 0; i < ue_sched_ctl->UE_mac_ce_ctrl.csi_im.nb_tci_resource_set_id; i++) {
+ csi_rs_im_act_deact_ce.TCI_STATE.R = 0;
+ csi_rs_im_act_deact_ce.TCI_STATE.TCI_STATE_ID = ue_sched_ctl->UE_mac_ce_ctrl.csi_im.tci_state_id [i] & 0x7F;
+ memcpy ((void *) mac_pdu_ptr, (void *) & (csi_rs_im_act_deact_ce.TCI_STATE), mac_ce_size);
+ mac_pdu_ptr += (unsigned char) mac_ce_size;
+ }
+ }
+ }
+
// 2) Generation of DLSCH MAC subPDUs including subheaders and MAC SDUs
for (i = 0; i < num_sdus; i++) {
LOG_D(MAC, "[gNB] Generate DLSCH header num sdu %d len sdu %d\n", num_sdus, sdu_lengths[i]);
@@ -152,10 +320,9 @@ int nr_generate_dlsch_pdu(module_id_t module_idP,
}
mac_pdu_ptr += last_size;
-
// 3) cycle through SDUs, compute each relevant and place dlsch_buffer in
memcpy((void *) mac_pdu_ptr, (void *) dlsch_buffer_ptr, sdu_lengths[i]);
- dlsch_buffer_ptr+= sdu_lengths[i];
+ dlsch_buffer_ptr += sdu_lengths[i];
mac_pdu_ptr += sdu_lengths[i];
}
@@ -164,19 +331,16 @@ int nr_generate_dlsch_pdu(module_id_t module_idP,
((NR_MAC_SUBHEADER_FIXED *) mac_pdu_ptr)->R = 0;
((NR_MAC_SUBHEADER_FIXED *) mac_pdu_ptr)->LCID = DL_SCH_LCID_PADDING;
mac_pdu_ptr++;
-
- } else {
+ } else {
// no MAC subPDU with padding
}
// compute final offset
offset = ((unsigned char *) mac_pdu_ptr - mac_pdu);
-
//printf("Offset %d \n", ((unsigned char *) mac_pdu_ptr - mac_pdu));
-
return offset;
}
/* functionalities of this function have been moved to nr_schedule_uss_dlsch_phytest */
-void nr_schedule_ue_spec(module_id_t module_idP, frame_t frameP, sub_frame_t slotP){
+void nr_schedule_ue_spec(module_id_t module_idP, frame_t frameP, sub_frame_t slotP) {
}
diff --git a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
index 0125535071..f84e7a900c 100644
--- a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
+++ b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
@@ -179,6 +179,72 @@ typedef struct {
uint8_t num_sf_allocation_pattern;
} NR_COMMON_channels_t;
+
+// SP ZP CSI-RS Resource Set Activation/Deactivation MAC CE
+typedef struct sp_zp_csirs {
+ bool is_scheduled; //ZP CSI-RS ACT/Deact MAC CE is scheduled
+ bool act_deact; //Activation/Deactivation indication
+ uint8_t serv_cell_id; //Identity of Serving cell for which MAC CE applies
+ uint8_t bwpid; //Downlink BWP id
+ uint8_t rsc_id; //SP ZP CSI-RS resource set
+} sp_zp_csirs_t;
+
+//SP CSI-RS / CSI-IM Resource Set Activation/Deactivation MAC CE
+#define MAX_CSI_RESOURCE_SET 64
+typedef struct csi_rs_im {
+ bool is_scheduled;
+ bool act_deact;
+ uint8_t serv_cellid;
+ uint8_t bwp_id;
+ bool im;
+ uint8_t csi_im_rsc_id;
+ uint8_t nzp_csi_rsc_id;
+ uint8_t nb_tci_resource_set_id;
+ uint8_t tci_state_id [ MAX_CSI_RESOURCE_SET ];
+} csi_rs_im_t;
+
+typedef struct pdcchStateInd {
+ bool is_scheduled;
+ uint8_t servingCellId;
+ uint8_t coresetId;
+ uint8_t tciStateId;
+} pdcchStateInd_t;
+
+typedef struct SPCSIReportingpucch {
+ bool is_scheduled;
+ uint8_t servingCellId;
+ uint8_t bwpId;
+ bool s0tos3_actDeact[4];
+} SPCSIReportingpucch_t;
+
+#define MAX_APERIODIC_TRIGGER_STATES 128 //38.331
+typedef struct aperiodicCSI_triggerStateSelection {
+ bool is_scheduled;
+ uint8_t servingCellId;
+ uint8_t bwpId;
+ uint8_t highestTriggerStateSelected;
+ bool triggerStateSelection[MAX_APERIODIC_TRIGGER_STATES];
+} aperiodicCSI_triggerStateSelection_t;
+
+#define MAX_TCI_STATES 128 //38.331
+typedef struct pdschTciStatesActDeact {
+ bool is_scheduled;
+ uint8_t servingCellId;
+ uint8_t bwpId;
+ uint8_t highestTciStateActivated;
+ bool tciStateActDeact[MAX_TCI_STATES];
+} pdschTciStatesActDeact_t;
+
+typedef struct UE_info {
+ sp_zp_csirs_t sp_zp_csi_rs;
+ csi_rs_im_t csi_im;
+ pdcchStateInd_t pdcch_state_ind;
+ SPCSIReportingpucch_t SP_CSI_reporting_pucch;
+ aperiodicCSI_triggerStateSelection_t aperi_CSI_trigger;
+ pdschTciStatesActDeact_t pdsch_TCI_States_ActDeact;
+} NR_UE_mac_ce_ctrl_t;
+
+
typedef struct NR_sched_pucch {
int frame;
int ul_slot;
@@ -203,6 +269,8 @@ typedef struct {
int16_t ta_update;
uint8_t current_harq_pid;
NR_UE_harq_t harq_processes[NR_MAX_NB_HARQ_PROCESSES];
+ int dummy;
+ NR_UE_mac_ce_ctrl_t UE_mac_ce_ctrl;// MAC CE related information
} NR_UE_sched_ctrl_t;
typedef struct NR_preamble_ue {
@@ -229,7 +297,7 @@ typedef struct {
NR_CellGroupConfig_t *secondaryCellGroup[MAX_MOBILES_PER_GNB];
} NR_UE_list_t;
-/*! \brief top level gNB MAC structure */
+/*! \brief top level eNB MAC structure */
typedef struct gNB_MAC_INST_s {
/// Ethernet parameters for northbound midhaul interface
eth_params_t eth_params_n;
@@ -270,7 +338,7 @@ typedef struct gNB_MAC_INST_s {
/// UL handle
uint32_t ul_handle;
- // MAC function execution peformance profiler
+ // MAC function execution peformance profiler
/// processing time of eNB scheduler
time_stats_t eNB_scheduler;
/// processing time of eNB scheduler for SI
diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp.h b/openair2/LAYER2/PDCP_v10.1.0/pdcp.h
index 8e265e8cf1..de8a1b385b 100644
--- a/openair2/LAYER2/PDCP_v10.1.0/pdcp.h
+++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp.h
@@ -34,10 +34,6 @@
#ifndef __PDCP_H__
# define __PDCP_H__
//-----------------------------------------------------------------------------
-#ifndef NON_ACCESS_STRATUM
- #include "UTIL/MEM/mem_block.h"
- #include "UTIL/LISTS/list.h"
-#endif //NON_ACCESS_STRATUM
//-----------------------------------------------------------------------------
#include "RRC/LTE/rrc_defs.h"
#include "COMMON/platform_constants.h"
diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c
index 14d95b15b3..6c23332687 100644
--- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c
+++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c
@@ -55,7 +55,6 @@ extern int otg_enabled;
#include "common/utils/LOG/log.h"
#include "UTIL/OTG/otg_tx.h"
#include "nfapi/oai_integration/vendor_ext.h"
-#include "UTIL/FIFO/pad_list.h"
#include "common/utils/LOG/vcd_signal_dumper.h"
#include "platform_constants.h"
#include "msc.h"
@@ -91,7 +90,6 @@ extern struct msghdr nas_msg_rx;
extern uint16_t inst_pdcp_list[NUMBER_OF_UE_MAX];
#endif
-extern Packet_OTG_List_t *otg_pdcp_buffer;
# include "gtpv1u_eNB_task.h"
@@ -122,7 +120,6 @@ int pdcp_fifo_flush_sdus(const protocol_ctxt_t *const ctxt_pP) {
int sizeToWrite= sizeof (pdcp_data_ind_header_t) +
pdcpHead->data_size;
void * pdcpData=(void*)(pdcpHead+1);
-
if (rb_id == 10) { //hardcoded for PC5-Signaling
if( LOG_DEBUGFLAG(DEBUG_PDCP) ) {
debug_pdcp_pc5s_sdu((sidelink_pc5s_element *)pdcpData,
diff --git a/openair2/RRC/LTE/rrc_defs.h b/openair2/RRC/LTE/rrc_defs.h
index 52b06b9f11..42fa5f6de1 100644
--- a/openair2/RRC/LTE/rrc_defs.h
+++ b/openair2/RRC/LTE/rrc_defs.h
@@ -40,6 +40,10 @@
#include "rrc_types.h"
//#include "PHY/phy_defs.h"
#include "LAYER2/RLC/rlc.h"
+#include "RRC/NR/nr_rrc_types.h"
+#include "NR_UE-MRDC-Capability.h"
+#include "NR_UE-NR-Capability.h"
+
#include "COMMON/platform_constants.h"
#include "COMMON/platform_types.h"
@@ -569,6 +573,10 @@ typedef struct eNB_RRC_UE_s {
LTE_UE_EUTRA_Capability_t *UE_Capability;
int UE_Capability_size;
+ NR_UE_MRDC_Capability_t *UE_Capability_MRDC;
+ int UE_MRDC_Capability_size;
+ NR_UE_NR_Capability_t *UE_Capability_nr;
+ int UE_NR_Capability_size;
ImsiMobileIdentity_t imsi;
/* KeNB as derived from KASME received from EPC */
@@ -614,7 +622,7 @@ typedef struct eNB_RRC_UE_s {
/* Number of e_rab to be modified in the list */
uint8_t nb_of_modify_e_rabs;
uint8_t nb_of_failed_e_rabs;
- uint8_t nb_of_modify_endc_e_rabs;
+ uint8_t nb_of_modify_endc_e_rabs;
e_rab_param_t modify_e_rab[NB_RB_MAX];//[S1AP_MAX_E_RAB];
/* list of e_rab to be setup by RRC layers */
e_rab_param_t e_rab[NB_RB_MAX];//[S1AP_MAX_E_RAB];
diff --git a/openair2/RRC/LTE/rrc_eNB.c b/openair2/RRC/LTE/rrc_eNB.c
index 2fed550d35..12f079f772 100644
--- a/openair2/RRC/LTE/rrc_eNB.c
+++ b/openair2/RRC/LTE/rrc_eNB.c
@@ -96,6 +96,10 @@
#include "SIMULATION/TOOLS/sim.h" // for taus
+#define ASN_MAX_ENCODE_SIZE 4096
+#define NUMBEROF_DRBS_TOBE_ADDED 1
+static int encode_CG_ConfigInfo(char *buffer,int buffer_size,rrc_eNB_ue_context_t *const ue_context_pP,int *enc_size);
+static int is_en_dc_supported(LTE_UE_EUTRA_Capability_t *c);
extern RAN_CONTEXT_t RC;
@@ -113,8 +117,9 @@ extern uint32_t to_earfcn_DL(int eutra_bandP, uint32_t dl_CarrierFreq, uint32_t
extern int rrc_eNB_process_security(const protocol_ctxt_t *const ctxt_pP, rrc_eNB_ue_context_t *const ue_context_pP, security_capabilities_t *security_capabilities_pP);
extern void process_eNB_security_key (const protocol_ctxt_t *const ctxt_pP, rrc_eNB_ue_context_t *const ue_context_pP, uint8_t *security_key_pP);
extern int derive_keNB_star(const uint8_t *kenb_32, const uint16_t pci, const uint32_t earfcn_dl, const bool is_rel8_only, uint8_t *kenb_star);
-extern int rrc_eNB_generate_RRCConnectionReconfiguration_endc(protocol_ctxt_t *ctxt, rrc_eNB_ue_context_t *ue_context, unsigned char *buffer, int buffer_size, OCTET_STRING_t *scg_group_config, OCTET_STRING_t *scg_RB_config);
-extern struct rrc_eNB_ue_context_s * get_first_ue_context(eNB_RRC_INST *rrc_instance_pP);
+extern int rrc_eNB_generate_RRCConnectionReconfiguration_endc(protocol_ctxt_t *ctxt, rrc_eNB_ue_context_t *ue_context, unsigned char *buffer, int buffer_size, OCTET_STRING_t *scg_group_config,
+ OCTET_STRING_t *scg_RB_config);
+extern struct rrc_eNB_ue_context_s *get_first_ue_context(eNB_RRC_INST *rrc_instance_pP);
pthread_mutex_t rrc_release_freelist;
RRC_release_list_t rrc_release_info;
@@ -162,7 +167,7 @@ init_SI(
AssertFatal(RC.rrc[ctxt_pP->module_id]->carrier[CC_id].SIB1_MBMS!=NULL,PROTOCOL_RRC_CTXT_FMT" init_SI: FATAL, no memory for SIB1_MBMS allocated\n",
PROTOCOL_RRC_CTXT_ARGS(ctxt_pP));
RC.rrc[ctxt_pP->module_id]->carrier[CC_id].sizeof_SIB1_MBMS = do_SIB1_MBMS(&RC.rrc[ctxt_pP->module_id]->carrier[CC_id],ctxt_pP->module_id,CC_id,
- configuration
+ configuration
);
LOG_I(RRC, PROTOCOL_RRC_CTXT_FMT" Contents of SIB1-MBMS\n",
PROTOCOL_RRC_CTXT_ARGS(ctxt_pP)
@@ -2119,7 +2124,27 @@ rrc_eNB_generate_RRCConnectionReestablishmentReject(
PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP),
ue_p->Srb0.Tx_buffer.payload_size);
}
-
+#if 0
+void rrc_generate_SgNBReleaseRequest(
+ const protocol_ctxt_t *const ctxt_pP,
+ rrc_eNB_ue_context_t *const ue_context_pP
+)
+//-----------------------------------------------------------------------------
+{
+ MessageDef *msg;
+ msg = itti_alloc_new_message(TASK_RRC_ENB, X2AP_ENDC_SGNB_RELEASE_REQ);
+ memset(&(X2AP_ENDC_SGNB_RELEASE_REQ(msg)), 0, sizeof(x2ap_ENDC_sgnb_release_req_t));
+ // X2AP_ENDC_SGNB_RELEASE_REQ(msg).MeNB_ue_x2_id = ;
+ // X2AP_ENDC_SGNB_RELEASE_REQ(msg).SgNB_ue_x2_id = ;
+ // X2AP_ENDC_SGNB_RELEASE_REQ(msg).cause = ;
+ // X2AP_ENDC_SGNB_RELEASE_REQ(msg).target_physCellId = ;
+ LOG_I(RRC,
+ "[eNB %d] frame %d UE rnti %x transmitting sgnb release request to sgnb \n",
+ ctxt_pP->module_id,ctxt_pP->frame,ctxt_pP->rnti);
+ itti_send_msg_to_task(TASK_X2AP, ENB_MODULE_ID_TO_INSTANCE(ctxt_pP->module_id), msg);
+ return;
+}
+#endif
//-----------------------------------------------------------------------------
/*
* Generate the RRC Connection Release to UE.
@@ -2139,6 +2164,15 @@ rrc_eNB_generate_RRCConnectionRelease(
memset(buffer, 0, RRC_BUF_SIZE);
T(T_ENB_RRC_CONNECTION_RELEASE, T_INT(ctxt_pP->module_id), T_INT(ctxt_pP->frame),
T_INT(ctxt_pP->subframe), T_INT(ctxt_pP->rnti));
+#if 0
+
+ if(ue_context_pP != NULL) {
+ if(ue_context_pP->ue_context.Status == RRC_NR_NSA) {
+ //rrc_eNB_generate_SgNBReleaseRequest(ctxt_pP,ue_context_pP);
+ }
+ }
+
+#endif
size = do_RRCConnectionRelease(ctxt_pP->module_id, buffer,rrc_eNB_get_next_transaction_identifier(ctxt_pP->module_id));
ue_context_pP->ue_context.ue_reestablishment_timer = 0;
ue_context_pP->ue_context.ue_release_timer = 0;
@@ -2837,7 +2871,6 @@ void rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt_t
uint16_t size;
int i;
MessageDef *message_p = NULL;
-
/* Configure SRB1/SRB2, PhysicalConfigDedicated, LTE_MAC_MainConfig for UE */
eNB_RRC_INST *rrc_inst = RC.rrc[ctxt_pP->module_id];
struct LTE_PhysicalConfigDedicated **physicalConfigDedicated = &ue_context_pP->ue_context.physicalConfigDedicated;
@@ -3029,7 +3062,7 @@ void rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt_t
module_id_t module_id = ctxt_pP->module_id;
LOG_D(RRC, "Processing the DRX configuration in RRC Connection Reconfiguration\n");
- /* Process the IE drx_Config */
+ /* Process the IE drx_Config */
if (NODE_IS_MONOLITHIC(rrc_inst->node_type)) {
mac_MainConfig->drx_Config = do_DrxConfig(cc_id, &rrc_inst->configuration, UEcap); // drx_Config IE
@@ -3044,8 +3077,8 @@ void rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt_t
LOG_D(RRC, "DRX configured in MAC Main Configuration for RRC Connection Reconfiguration\n");
}
}
- /* End of CDRX configuration */
+ /* End of CDRX configuration */
sr_ProhibitTimer_r9 = CALLOC(1, sizeof(long));
*sr_ProhibitTimer_r9 = 0; // SR tx on PUCCH, Value in number of SR period(s). Value 0 = no timer for SR, Value 2 = 2*SR
mac_MainConfig->ext1 = CALLOC(1, sizeof(struct LTE_MAC_MainConfig__ext1));
@@ -3153,7 +3186,9 @@ void rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt_t
if (ue_context_pP->ue_context.does_nr) {
MeasId6 = calloc(1, sizeof(LTE_MeasIdToAddMod_t));
+
if (MeasId6 == NULL) exit(1);
+
MeasId6->measId = 7;
MeasId6->measObjectId = 2;
MeasId6->reportConfigId = 7;
@@ -3211,7 +3246,9 @@ void rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt_t
if (ue_context_pP->ue_context.does_nr) {
MeasObj2 = calloc(1, sizeof(LTE_MeasObjectToAddMod_t));
+
if (MeasObj2 == NULL) exit(1);
+
MeasObj2->measObjectId = 2;
MeasObj2->measObject.present = LTE_MeasObjectToAddMod__measObject_PR_measObjectNR_r15;
MeasObj2->measObject.choice.measObjectNR_r15.carrierFreq_r15 =641272; //634000; //(634000 = 3.51GHz) (640000 = 3.6GHz) (641272 = 3619.08MHz = 3600 + 30/1000*106*12/2) (642256 is for 3.6GHz and absoluteFrequencySSB = 642016)
@@ -3221,12 +3258,15 @@ void rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt_t
MeasObj2->measObject.choice.measObjectNR_r15.rs_ConfigSSB_r15.subcarrierSpacingSSB_r15 = LTE_RS_ConfigSSB_NR_r15__subcarrierSpacingSSB_r15_kHz30;
MeasObj2->measObject.choice.measObjectNR_r15.quantityConfigSet_r15 = 1;
MeasObj2->measObject.choice.measObjectNR_r15.ext1 = calloc(1, sizeof(struct LTE_MeasObjectNR_r15__ext1));
+
if (MeasObj2->measObject.choice.measObjectNR_r15.ext1 == NULL) exit(1);
+
MeasObj2->measObject.choice.measObjectNR_r15.ext1->bandNR_r15 = calloc(1, sizeof(struct LTE_MeasObjectNR_r15__ext1__bandNR_r15));
+
if (MeasObj2->measObject.choice.measObjectNR_r15.ext1->bandNR_r15 == NULL) exit(1);
+
MeasObj2->measObject.choice.measObjectNR_r15.ext1->bandNR_r15->present = LTE_MeasObjectNR_r15__ext1__bandNR_r15_PR_setup;
MeasObj2->measObject.choice.measObjectNR_r15.ext1->bandNR_r15->choice.setup = 78;
-
ASN_SEQUENCE_ADD(&MeasObj_list->list, MeasObj2);
}
@@ -3242,9 +3282,11 @@ void rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt_t
ReportConfig_A3 = CALLOC(1, sizeof(*ReportConfig_A3));
ReportConfig_A4 = CALLOC(1, sizeof(*ReportConfig_A4));
ReportConfig_A5 = CALLOC(1, sizeof(*ReportConfig_A5));
+
if (ue_context_pP->ue_context.does_nr) {
ReportConfig_NR = CALLOC(1, sizeof(*ReportConfig_NR));
}
+
ReportConfig_per->reportConfigId = 1;
ReportConfig_per->reportConfig.present = LTE_ReportConfigToAddMod__reportConfig_PR_reportConfigEUTRA;
ReportConfig_per->reportConfig.choice.reportConfigEUTRA.triggerType.present =
@@ -3365,9 +3407,13 @@ void rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt_t
ReportConfig_NR->reportConfig.choice.reportConfigInterRAT.reportInterval = LTE_ReportInterval_ms120;
ReportConfig_NR->reportConfig.choice.reportConfigInterRAT.reportAmount = LTE_ReportConfigInterRAT__reportAmount_infinity;
ReportConfig_NR->reportConfig.choice.reportConfigInterRAT.ext7 = calloc(1, sizeof(struct LTE_ReportConfigInterRAT__ext7));
+
if (ReportConfig_NR->reportConfig.choice.reportConfigInterRAT.ext7 == NULL) exit(1);
+
ReportConfig_NR->reportConfig.choice.reportConfigInterRAT.ext7->reportQuantityCellNR_r15 = calloc(1, sizeof(struct LTE_ReportQuantityNR_r15));
+
if (ReportConfig_NR->reportConfig.choice.reportConfigInterRAT.ext7->reportQuantityCellNR_r15 == NULL) exit(1);
+
ReportConfig_NR->reportConfig.choice.reportConfigInterRAT.ext7->reportQuantityCellNR_r15->ss_rsrp = TRUE;
ReportConfig_NR->reportConfig.choice.reportConfigInterRAT.ext7->reportQuantityCellNR_r15->ss_rsrq = TRUE;
ReportConfig_NR->reportConfig.choice.reportConfigInterRAT.ext7->reportQuantityCellNR_r15->ss_sinr = TRUE;
@@ -3569,7 +3615,6 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt
uint16_t size;
int i;
MessageDef *message_p = NULL;
-
/* Configure SRB1/SRB2, PhysicalConfigDedicated, LTE_MAC_MainConfig for UE */
eNB_RRC_INST *rrc_inst = RC.rrc[ctxt_pP->module_id];
struct LTE_PhysicalConfigDedicated **physicalConfigDedicated = &ue_context_pP->ue_context.physicalConfigDedicated;
@@ -3615,7 +3660,6 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt
LTE_C_RNTI_t *cba_RNTI = NULL;
int measurements_enabled;
uint8_t xid = rrc_eNB_get_next_transaction_identifier(ctxt_pP->module_id); //Transaction_id,
-
#ifdef CBA // Contention Based Access
uint8_t *cba_RNTI_buf;
cba_RNTI = CALLOC(1, sizeof(LTE_C_RNTI_t));
@@ -3641,8 +3685,8 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt
frameP,
ue_mod_idP);
}
-#endif
+#endif
T(T_ENB_RRC_CONNECTION_RECONFIGURATION,
T_INT(ctxt_pP->module_id),
T_INT(ctxt_pP->frame),
@@ -3777,7 +3821,6 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt
mac_MainConfig->phr_Config->choice.setup.prohibitPHR_Timer =
LTE_MAC_MainConfig__phr_Config__setup__prohibitPHR_Timer_sf200; // sf20 = 20 subframes // LTE_MAC_MainConfig__phr_Config__setup__prohibitPHR_Timer_sf1000
mac_MainConfig->phr_Config->choice.setup.dl_PathlossChange = LTE_MAC_MainConfig__phr_Config__setup__dl_PathlossChange_dB3; // Value dB1 =1 dB, dB3 = 3 dB
-
/* CDRX Configuration */
mac_MainConfig->drx_Config = NULL;
rnti_t rnti = ue_context_pP->ue_id_rnti;
@@ -3785,11 +3828,11 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt
uint8_t cc_id = ue_context_pP->ue_context.primaryCC_id;
LTE_UE_EUTRA_Capability_t *UEcap = ue_context_pP->ue_context.UE_Capability;
LOG_D(RRC, "Processing the DRX configuration in RRC Connection Reconfiguration\n");
-
+
/* Process the IE drx_Config */
if (NODE_IS_MONOLITHIC(rrc_inst->node_type)) {
mac_MainConfig->drx_Config = do_DrxConfig(cc_id, &rrc_inst->configuration, UEcap); // drx_Config IE
-
+
if (mac_MainConfig->drx_Config == NULL) {
LOG_W(RRC, "drx_Configuration parameter is NULL, cannot configure local UE parameters or CDRX is deactivated\n");
} else {
@@ -3801,8 +3844,8 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt
LOG_D(RRC, "DRX configured in MAC Main Configuration for RRC Connection Reconfiguration\n");
}
}
- /* End of CDRX configuration */
+ /* End of CDRX configuration */
sr_ProhibitTimer_r9 = CALLOC(1, sizeof(long));
*sr_ProhibitTimer_r9 = 0; // SR tx on PUCCH, Value in number of SR period(s). Value 0 = no timer for SR, Value 2 = 2*SR
mac_MainConfig->ext1 = CALLOC(1, sizeof(struct LTE_MAC_MainConfig__ext1));
@@ -4319,6 +4362,182 @@ rrc_eNB_generate_RRCConnectionReconfiguration_SCell(
}
+
+//-----------------------------------------------------------------------------
+/**
+ * @fn :encode_CG_ConfigInfo
+ * @param :enc_buf to store the encoded bits
+ * @param :ue_context_pP ue context used to fill CG-ConfigInfo
+ * @param :enc_size to store thre size of encoded size
+ * this api is to fill and encode CG-ConfigInfo
+ */
+static int encode_CG_ConfigInfo(
+ char *buffer,
+ int buffer_size,
+ rrc_eNB_ue_context_t *const ue_context_pP,
+ int *enc_size
+) {
+ struct NR_CG_ConfigInfo *cg_configinfo = NULL;
+ struct NR_RadioBearerConfig *rb_config = NULL;
+ asn_enc_rval_t enc_rval;
+ int RRC_OK = 1;
+ int index = 0;
+ char temp_buff[ASN_MAX_ENCODE_SIZE];
+ LTE_UE_CapabilityRAT_ContainerList_t *ue_cap_rat_container_list = NULL;
+ LTE_UE_CapabilityRAT_Container_t ue_cap_rat_container_MRDC;
+ LTE_UE_CapabilityRAT_Container_t ue_cap_rat_container_nr;
+ int RAT_Container_count = 0;
+ rb_config = calloc(1,sizeof(struct NR_RadioBearerConfig));
+ AssertFatal(rb_config != NULL,"failed to allocate memory for rb_config");
+
+ if(ue_context_pP->ue_context.DRB_configList->list.count != 0) {
+ rb_config->drb_ToAddModList = calloc(1,sizeof(struct NR_DRB_ToAddModList ));
+ AssertFatal(rb_config->drb_ToAddModList != NULL,"failed to allocated memory for drbtoaddmodlist");
+ rb_config->drb_ToAddModList->list.count = NUMBEROF_DRBS_TOBE_ADDED;
+ rb_config->drb_ToAddModList->list.array
+ = calloc(NUMBEROF_DRBS_TOBE_ADDED, sizeof(struct NR_DRB_ToAddMod *));
+ AssertFatal( rb_config->drb_ToAddModList->list.array != NULL,
+ "falied to allocate memory for list.array");
+
+ for(index = 0; index < NUMBEROF_DRBS_TOBE_ADDED; index++) {
+ rb_config->drb_ToAddModList->list.array[index]
+ = calloc(1,sizeof(struct NR_DRB_ToAddMod));
+ AssertFatal(rb_config->drb_ToAddModList->list.array[index] != NULL,
+ "failed to allocate memory for drb_toaddmod");
+ rb_config->drb_ToAddModList->list.array[index]->drb_Identity
+ = ue_context_pP->ue_context.DRB_configList->list.array[index]->drb_Identity;
+
+ if(ue_context_pP->ue_context.DRB_configList->list.array[index]->eps_BearerIdentity) {
+ rb_config->drb_ToAddModList->list.array[index]->cnAssociation
+ = calloc(1,sizeof(struct NR_DRB_ToAddMod__cnAssociation));
+ AssertFatal(rb_config->drb_ToAddModList->list.array[index]->cnAssociation != NULL,
+ "failed to allocate memory cnAssociation");
+ rb_config->drb_ToAddModList->list.array[index]->cnAssociation->present
+ = NR_DRB_ToAddMod__cnAssociation_PR_eps_BearerIdentity;
+ rb_config->drb_ToAddModList->list.array[index]->cnAssociation->choice.eps_BearerIdentity
+ = *(ue_context_pP->ue_context.DRB_configList->list.array[index]->eps_BearerIdentity);
+ }
+
+ rb_config->drb_ToAddModList->list.array[index]->pdcp_Config = calloc(1,sizeof(struct NR_PDCP_Config));
+ rb_config->drb_ToAddModList->list.array[index]->pdcp_Config->drb = calloc(1,sizeof(struct NR_PDCP_Config__drb));
+ rb_config->drb_ToAddModList->list.array[index]->pdcp_Config->drb->discardTimer = calloc(1,sizeof(long));
+ *rb_config->drb_ToAddModList->list.array[index]->pdcp_Config->drb->discardTimer
+ = *(ue_context_pP->ue_context.DRB_configList->list.array[index]->pdcp_Config->discardTimer);
+ rb_config->drb_ToAddModList->list.array[index]->pdcp_Config->drb->pdcp_SN_SizeUL = calloc(1,sizeof(long));
+ *rb_config->drb_ToAddModList->list.array[index]->pdcp_Config->drb->pdcp_SN_SizeUL
+ = NR_PDCP_Config__drb__pdcp_SN_SizeUL_len18bits;
+ rb_config->drb_ToAddModList->list.array[index]->pdcp_Config->drb->pdcp_SN_SizeDL = calloc(1,sizeof(long));
+ *rb_config->drb_ToAddModList->list.array[index]->pdcp_Config->drb->pdcp_SN_SizeDL
+ = NR_PDCP_Config__drb__pdcp_SN_SizeDL_len18bits;
+ rb_config->drb_ToAddModList->list.array[index]->pdcp_Config->drb->headerCompression.present
+ = NR_PDCP_Config__drb__headerCompression_PR_notUsed;
+ rb_config->drb_ToAddModList->list.array[index]->pdcp_Config->drb->headerCompression.choice.notUsed = 0;
+ rb_config->drb_ToAddModList->list.array[index]->pdcp_Config->t_Reordering = calloc(1,sizeof(long));
+ *rb_config->drb_ToAddModList->list.array[index]->pdcp_Config->t_Reordering
+ = NR_PDCP_Config__t_Reordering_ms0;
+ }
+
+ rb_config->securityConfig = calloc(1,sizeof(struct NR_SecurityConfig ));
+ rb_config->securityConfig->securityAlgorithmConfig = calloc(1,sizeof(struct NR_SecurityAlgorithmConfig));
+ rb_config->securityConfig->securityAlgorithmConfig->cipheringAlgorithm = NR_CipheringAlgorithm_nea0;
+ rb_config->securityConfig->securityAlgorithmConfig->integrityProtAlgorithm = NULL;
+ rb_config->securityConfig->keyToUse = calloc(1,sizeof(long));
+ *rb_config->securityConfig->keyToUse = NR_SecurityConfig__keyToUse_master;
+ }
+
+ cg_configinfo = calloc(1,sizeof(struct NR_CG_ConfigInfo));
+ AssertFatal(cg_configinfo != NULL,"failed to allocate memory for cg_configinfo");
+ cg_configinfo->criticalExtensions.present = NR_CG_ConfigInfo__criticalExtensions_PR_c1;
+ cg_configinfo->criticalExtensions.choice.c1
+ = calloc(1, sizeof(struct NR_CG_ConfigInfo__criticalExtensions__c1));
+ AssertFatal(cg_configinfo->criticalExtensions.choice.c1 != NULL,
+ "failed to allocate memory for cg_configinfo->criticalExtensions.choice.c1");
+ cg_configinfo->criticalExtensions.choice.c1->present
+ = NR_CG_ConfigInfo__criticalExtensions__c1_PR_cg_ConfigInfo;
+ cg_configinfo->criticalExtensions.choice.c1->choice.cg_ConfigInfo
+ = calloc(1,sizeof(struct NR_CG_ConfigInfo_IEs));
+ AssertFatal(cg_configinfo->criticalExtensions.choice.c1->choice.cg_ConfigInfo != NULL,
+ "failed to allocate memory for cg_configinfo_IEs");
+ cg_configinfo->criticalExtensions.choice.c1->choice.cg_ConfigInfo->ue_CapabilityInfo
+ = calloc(1,sizeof( OCTET_STRING_t));
+ AssertFatal(cg_configinfo->criticalExtensions.choice.c1->choice.cg_ConfigInfo->
+ ue_CapabilityInfo != NULL, "failed to allocate memory for ue_capabilityinfo");
+
+ if(ue_context_pP->ue_context.UE_Capability_MRDC) {
+ RAT_Container_count++;
+ enc_rval = uper_encode_to_buffer(&asn_DEF_NR_UE_MRDC_Capability,NULL,
+ (void *)ue_context_pP->ue_context.UE_Capability_MRDC,temp_buff,ASN_MAX_ENCODE_SIZE);
+ AssertFatal(enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %jd)!\n",
+ enc_rval.failed_type->name, enc_rval.encoded);
+ ue_cap_rat_container_MRDC.rat_Type = LTE_RAT_Type_eutra_nr;
+ OCTET_STRING_fromBuf(&ue_cap_rat_container_MRDC.ueCapabilityRAT_Container,
+ (const char *)temp_buff,(enc_rval.encoded+7)>>3);
+ memset((void *)temp_buff,0,sizeof(temp_buff));
+ }
+
+ if(ue_context_pP->ue_context.UE_Capability_nr) {
+ RAT_Container_count++;
+ enc_rval = uper_encode_to_buffer(&asn_DEF_NR_UE_NR_Capability,NULL,
+ (void *)ue_context_pP->ue_context.UE_Capability_nr,temp_buff,ASN_MAX_ENCODE_SIZE);
+ AssertFatal(enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %jd)!\n",
+ enc_rval.failed_type->name, enc_rval.encoded);
+ ue_cap_rat_container_nr.rat_Type = LTE_RAT_Type_nr;
+ OCTET_STRING_fromBuf(&ue_cap_rat_container_nr.ueCapabilityRAT_Container,
+ (const char *)temp_buff,(enc_rval.encoded+7)>>3);
+ memset((void *)temp_buff,0,sizeof(temp_buff));
+ }
+
+ ue_cap_rat_container_list = calloc(1,sizeof(LTE_UE_CapabilityRAT_ContainerList_t));
+ ue_cap_rat_container_list->list.count = RAT_Container_count;
+ ue_cap_rat_container_list->list.size = RAT_Container_count * sizeof(LTE_UE_CapabilityRAT_Container_t);
+ ue_cap_rat_container_list->list.array = calloc(RAT_Container_count,sizeof(LTE_UE_CapabilityRAT_Container_t *));
+
+ if(ue_context_pP->ue_context.UE_Capability_MRDC) {
+ ue_cap_rat_container_list->list.array[0] = calloc(1,sizeof(LTE_UE_CapabilityRAT_Container_t));
+ memcpy(ue_cap_rat_container_list->list.array[0],&ue_cap_rat_container_MRDC,sizeof(LTE_UE_CapabilityRAT_Container_t));
+ }
+
+ if(ue_context_pP->ue_context.UE_Capability_nr) {
+ ue_cap_rat_container_list->list.array[1] = calloc(1,sizeof(LTE_UE_CapabilityRAT_Container_t));
+ memcpy(ue_cap_rat_container_list->list.array[1],&ue_cap_rat_container_nr,sizeof(LTE_UE_CapabilityRAT_Container_t));
+ }
+
+ //this xer_fprint logs can be enabled for additional debugging logs
+ //xer_fprint(stdout,&asn_DEF_LTE_UE_CapabilityRAT_ContainerList,ue_cap_rat_container_list);
+ enc_rval = uper_encode_to_buffer(&asn_DEF_LTE_UE_CapabilityRAT_ContainerList,NULL,
+ (void *)ue_cap_rat_container_list,temp_buff,ASN_MAX_ENCODE_SIZE);
+ AssertFatal(enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %jd)!\n",
+ enc_rval.failed_type->name, enc_rval.encoded);
+ OCTET_STRING_fromBuf(cg_configinfo->criticalExtensions.choice.c1->choice.cg_ConfigInfo->ue_CapabilityInfo,
+ (const char *)temp_buff, (enc_rval.encoded+7)>>3);
+ cg_configinfo->criticalExtensions.choice.c1->choice.cg_ConfigInfo->mcg_RB_Config
+ = calloc(1,sizeof(OCTET_STRING_t));
+ AssertFatal(cg_configinfo->criticalExtensions.choice.c1->choice.cg_ConfigInfo->
+ mcg_RB_Config != NULL, "failed to allocate memory for mcg_rb_config");
+ enc_rval = uper_encode_to_buffer(&asn_DEF_NR_RadioBearerConfig,NULL,(void *)rb_config,temp_buff,ASN_MAX_ENCODE_SIZE);
+ AssertFatal(enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %jd)!\n",
+ enc_rval.failed_type->name, enc_rval.encoded);
+ OCTET_STRING_fromBuf(cg_configinfo->criticalExtensions.choice.c1->choice.cg_ConfigInfo->mcg_RB_Config,
+ (const char *)temp_buff, (enc_rval.encoded+7)>>3);
+ // this xer_fprint can be enabled for additional debugging messages
+ // xer_fprint(stdout,&asn_DEF_NR_CG_ConfigInfo,(void *)cg_configinfo);
+ enc_rval = uper_encode_to_buffer(&asn_DEF_NR_CG_ConfigInfo,NULL,(void *)cg_configinfo,
+ buffer,buffer_size);
+ AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n",
+ enc_rval.failed_type->name, enc_rval.encoded);
+ *enc_size = (enc_rval.encoded+7)/8;
+ ASN_STRUCT_FREE(asn_DEF_NR_RadioBearerConfig,rb_config);
+ ASN_STRUCT_FREE(asn_DEF_NR_CG_ConfigInfo,cg_configinfo);
+ ASN_STRUCT_FREE(asn_DEF_LTE_UE_CapabilityRAT_ContainerList,ue_cap_rat_container_list);
+ return RRC_OK;
+}
+//-----------------------------------------------------------------------------
+
+
+
+
+
+
//-----------------------------------------------------------------------------
void
rrc_eNB_process_MeasurementReport(
@@ -4334,6 +4553,8 @@ rrc_eNB_process_MeasurementReport(
long ncell_max = -150;
uint32_t earfcn_dl;
uint8_t KeNB_star[32] = { 0 };
+ char enc_buf[ASN_MAX_ENCODE_SIZE] = {0};
+ int enc_size = 0;
T(T_ENB_RRC_MEASUREMENT_REPORT, T_INT(ctxt_pP->module_id), T_INT(ctxt_pP->frame),
T_INT(ctxt_pP->subframe), T_INT(ctxt_pP->rnti));
@@ -4396,24 +4617,37 @@ rrc_eNB_process_MeasurementReport(
MessageDef *msg;
ue_context_pP->ue_context.Status = RRC_NR_NSA;
- msg = itti_alloc_new_message(TASK_RRC_ENB, X2AP_ENDC_SGNB_ADDITION_REQ);
- X2AP_ENDC_SGNB_ADDITION_REQ(msg).rnti = ctxt_pP->rnti;
- //For the moment we have a single E-RAB which will be the one to be added to the gNB
- //Not sure how to select bearers to be added if there are multiple.
- X2AP_ENDC_SGNB_ADDITION_REQ(msg).nb_e_rabs_tobeadded = 1;
- for (int e_rab=0; e_rab < X2AP_ENDC_SGNB_ADDITION_REQ(msg).nb_e_rabs_tobeadded; e_rab++){
- X2AP_ENDC_SGNB_ADDITION_REQ(msg).e_rabs_tobeadded[e_rab].e_rab_id = ue_context_pP->ue_context.e_rab[e_rab].param.e_rab_id;
- X2AP_ENDC_SGNB_ADDITION_REQ(msg).e_rabs_tobeadded[e_rab].gtp_teid = ue_context_pP->ue_context.e_rab[e_rab].param.gtp_teid;
- X2AP_ENDC_SGNB_ADDITION_REQ(msg).e_rabs_tobeadded[e_rab].drb_ID = 1;
- memcpy(&X2AP_ENDC_SGNB_ADDITION_REQ(msg).e_rabs_tobeadded[e_rab].sgw_addr,
- &ue_context_pP->ue_context.e_rab[e_rab].param.sgw_addr,
- sizeof(transport_layer_addr_t));
+ if(is_en_dc_supported(ue_context_pP->ue_context.UE_Capability)) {
+ /** to add gNB as Secondary node CG-ConfigInfo to be added as per 36.423 r15 **/
+ if(encode_CG_ConfigInfo(enc_buf,sizeof(enc_buf),ue_context_pP,&enc_size) == RRC_OK)
+ LOG_I(RRC,"CG-ConfigInfo encoded successfully\n");
+
+ msg = itti_alloc_new_message(TASK_RRC_ENB, X2AP_ENDC_SGNB_ADDITION_REQ);
+ memset(&(X2AP_ENDC_SGNB_ADDITION_REQ(msg)), 0, sizeof(x2ap_ENDC_sgnb_addition_req_t));
+ X2AP_ENDC_SGNB_ADDITION_REQ(msg).rnti = ctxt_pP->rnti;
+ memcpy(X2AP_ENDC_SGNB_ADDITION_REQ(msg).rrc_buffer,enc_buf,enc_size);
+ X2AP_ENDC_SGNB_ADDITION_REQ(msg).rrc_buffer_size = enc_size;
+ X2AP_ENDC_SGNB_ADDITION_REQ(msg).target_physCellId
+ = measResults2->measResultNeighCells->choice.measResultListEUTRA.list.array[0]->physCellId;
+ //For the moment we have a single E-RAB which will be the one to be added to the gNB
+ //Not sure how to select bearers to be added if there are multiple.
+ X2AP_ENDC_SGNB_ADDITION_REQ(msg).nb_e_rabs_tobeadded = 1;
+
+ for (int e_rab=0; e_rab < X2AP_ENDC_SGNB_ADDITION_REQ(msg).nb_e_rabs_tobeadded; e_rab++) {
+ X2AP_ENDC_SGNB_ADDITION_REQ(msg).e_rabs_tobeadded[e_rab].e_rab_id = ue_context_pP->ue_context.e_rab[e_rab].param.e_rab_id;
+ X2AP_ENDC_SGNB_ADDITION_REQ(msg).e_rabs_tobeadded[e_rab].gtp_teid = ue_context_pP->ue_context.e_rab[e_rab].param.gtp_teid;
+ X2AP_ENDC_SGNB_ADDITION_REQ(msg).e_rabs_tobeadded[e_rab].drb_ID = 1;
+ memcpy(&X2AP_ENDC_SGNB_ADDITION_REQ(msg).e_rabs_tobeadded[e_rab].sgw_addr,
+ &ue_context_pP->ue_context.e_rab[e_rab].param.sgw_addr,
+ sizeof(transport_layer_addr_t));
+ }
+
+ LOG_I(RRC,
+ "[eNB %d] frame %d subframe %d: UE rnti %x switching to NSA mode\n",
+ ctxt_pP->module_id, ctxt_pP->frame, ctxt_pP->subframe, ctxt_pP->rnti);
+ itti_send_msg_to_task(TASK_X2AP, ENB_MODULE_ID_TO_INSTANCE(ctxt_pP->module_id), msg);
+ return;
}
- LOG_I(RRC,
- "[eNB %d] frame %d subframe %d: UE rnti %x switching to NSA mode\n",
- ctxt_pP->module_id, ctxt_pP->frame, ctxt_pP->subframe, ctxt_pP->rnti);
- itti_send_msg_to_task(TASK_X2AP, ENB_MODULE_ID_TO_INSTANCE(ctxt_pP->module_id), msg);
- return;
}
}
@@ -4531,6 +4765,7 @@ rrc_eNB_process_MeasurementReport(
}
}
+
//-----------------------------------------------------------------------------
void
rrc_eNB_generate_HandoverPreparationInformation(
@@ -6058,6 +6293,7 @@ rrc_eNB_generate_HO_RRCConnectionReconfiguration(const protocol_ctxt_t *const ct
ue_context_pP->ue_context.e_rab[i].param.nas_pdu.buffer = NULL;
}
}
+
LOG_I(RRC,
"[eNB %d] Frame %d, Logical Channel DL-DCCH, Generate RRCConnectionReconfiguration handover (bytes %d, UE id %x)\n",
ctxt_pP->module_id, ctxt_pP->frame, size, ue_context_pP->ue_context.rnti);
@@ -6228,10 +6464,8 @@ rrc_eNB_process_RRCConnectionReconfigurationComplete(
LTE_SRB_ToAddModList_t *SRB_configList = ue_context_pP->ue_context.SRB_configList2[xid];
LTE_DRB_ToReleaseList_t *DRB_Release_configList2 = ue_context_pP->ue_context.DRB_Release_configList2[xid];
LTE_DRB_Identity_t *drb_id_p = NULL;
-
ue_context_pP->ue_context.ue_reestablishment_timer = 0;
ue_context_pP->ue_context.ue_rrc_inactivity_timer = 1; // reset rrc inactivity timer
-
/* CDRX: activated when RRC Connection Reconfiguration Complete is received */
rnti_t rnti = ue_context_pP->ue_id_rnti;
module_id_t module_id = ctxt_pP->module_id;
@@ -6252,8 +6486,8 @@ rrc_eNB_process_RRCConnectionReconfigurationComplete(
LOG_I(RRC, "CDRX configuration activated after RRC Connection Reconfiguration Complete reception\n");
}
}
- /* End of CDRX processing */
+ /* End of CDRX processing */
T(T_ENB_RRC_CONNECTION_RECONFIGURATION_COMPLETE,
T_INT(ctxt_pP->module_id),
T_INT(ctxt_pP->frame),
@@ -6514,7 +6748,6 @@ rrc_eNB_process_RRCConnectionReconfigurationComplete(
ue_context_pP->ue_context.nr_capabilities_requested = 1;
rrc_eNB_generate_NR_UECapabilityEnquiry(ctxt_pP, ue_context_pP);
}
-
}
//-----------------------------------------------------------------------------
@@ -7337,33 +7570,34 @@ is_en_dc_supported(
*/
#define NCE nonCriticalExtension
return c != NULL
- && c->NCE != NULL
- && c->NCE->NCE != NULL
- && c->NCE->NCE->NCE != NULL
- && c->NCE->NCE->NCE->NCE != NULL
- && c->NCE->NCE->NCE->NCE->NCE != NULL
- && c->NCE->NCE->NCE->NCE->NCE->NCE != NULL
- && c->NCE->NCE->NCE->NCE->NCE->NCE->NCE != NULL
- && c->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE != NULL
- && c->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE != NULL
- && c->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE != NULL
- && c->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE != NULL
- && c->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE != NULL
- && c->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE != NULL
- && c->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE != NULL
- && c->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE != NULL
- && c->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE != NULL
- && c->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE != NULL
- && c->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE != NULL
- && c->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE != NULL
- && c->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE != NULL
- && c->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE != NULL
- && c->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE != NULL
- && c->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE != NULL
- && c->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE != NULL
- && c->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->irat_ParametersNR_r15 != NULL
- && c->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->irat_ParametersNR_r15->en_DC_r15 != NULL
- && *c->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->irat_ParametersNR_r15->en_DC_r15 == LTE_IRAT_ParametersNR_r15__en_DC_r15_supported;
+ && c->NCE != NULL
+ && c->NCE->NCE != NULL
+ && c->NCE->NCE->NCE != NULL
+ && c->NCE->NCE->NCE->NCE != NULL
+ && c->NCE->NCE->NCE->NCE->NCE != NULL
+ && c->NCE->NCE->NCE->NCE->NCE->NCE != NULL
+ && c->NCE->NCE->NCE->NCE->NCE->NCE->NCE != NULL
+ && c->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE != NULL
+ && c->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE != NULL
+ && c->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE != NULL
+ && c->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE != NULL
+ && c->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE != NULL
+ && c->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE != NULL
+ && c->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE != NULL
+ && c->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE != NULL
+ && c->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE != NULL
+ && c->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE != NULL
+ && c->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE != NULL
+ && c->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE != NULL
+ && c->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE != NULL
+ && c->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE != NULL
+ && c->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE != NULL
+ && c->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE != NULL
+ && c->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE != NULL
+ && c->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->irat_ParametersNR_r15 != NULL
+ && c->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->irat_ParametersNR_r15->en_DC_r15 != NULL
+ && *c->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->NCE->irat_ParametersNR_r15->en_DC_r15 ==
+ LTE_IRAT_ParametersNR_r15__en_DC_r15_supported;
#undef NCE
}
@@ -7552,37 +7786,36 @@ rrc_eNB_decode_dcch(
//Looking for a condition to trigger S1AP E-RAB-Modification-indication, based on the reception of RRCConnectionReconfigurationComplete
//including NR specific elements. Not sure if this is the correct one and the correct placement
/*if(ul_dcch_msg->message.choice.c1.choice.rrcConnectionReconfigurationComplete.criticalExtensions.choice.rrcConnectionReconfigurationComplete_r8.
- nonCriticalExtension->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension->
- scg_ConfigResponseNR_r15->buf!=NULL){
- //Trigger E-RAB Modification Indication
- rrc_eNB_send_E_RAB_Modification_Indication(ctxt_pP, ue_context_p);
+ nonCriticalExtension->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension->
+ scg_ConfigResponseNR_r15->buf!=NULL){
+ //Trigger E-RAB Modification Indication
+ rrc_eNB_send_E_RAB_Modification_Indication(ctxt_pP, ue_context_p);
}*/
if(ul_dcch_msg->message.choice.c1.choice.rrcConnectionReconfigurationComplete.criticalExtensions.choice.rrcConnectionReconfigurationComplete_r8.
- nonCriticalExtension!=NULL){
- if(ul_dcch_msg->message.choice.c1.choice.rrcConnectionReconfigurationComplete.criticalExtensions.choice.rrcConnectionReconfigurationComplete_r8.
- nonCriticalExtension->nonCriticalExtension!=NULL){
- if(ul_dcch_msg->message.choice.c1.choice.rrcConnectionReconfigurationComplete.criticalExtensions.choice.rrcConnectionReconfigurationComplete_r8.
- nonCriticalExtension->nonCriticalExtension->nonCriticalExtension!=NULL){
- if(ul_dcch_msg->message.choice.c1.choice.rrcConnectionReconfigurationComplete.criticalExtensions.choice.rrcConnectionReconfigurationComplete_r8.
- nonCriticalExtension->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension!=NULL){
- if(ul_dcch_msg->message.choice.c1.choice.rrcConnectionReconfigurationComplete.criticalExtensions.choice.rrcConnectionReconfigurationComplete_r8.
- nonCriticalExtension->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension!=NULL){
- if (ul_dcch_msg->message.choice.c1.choice.rrcConnectionReconfigurationComplete.criticalExtensions.choice.rrcConnectionReconfigurationComplete_r8.
- nonCriticalExtension->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension!=NULL){
- if(ul_dcch_msg->message.choice.c1.choice.rrcConnectionReconfigurationComplete.criticalExtensions.choice.rrcConnectionReconfigurationComplete_r8.
- nonCriticalExtension->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension
- ->scg_ConfigResponseNR_r15!=NULL){
- /*Trigger E-RAB Modification Indication */
- rrc_eNB_send_E_RAB_Modification_Indication(ctxt_pP, ue_context_p);
- }
- }
- }
- }
- }
- }
+ nonCriticalExtension!=NULL) {
+ if(ul_dcch_msg->message.choice.c1.choice.rrcConnectionReconfigurationComplete.criticalExtensions.choice.rrcConnectionReconfigurationComplete_r8.
+ nonCriticalExtension->nonCriticalExtension!=NULL) {
+ if(ul_dcch_msg->message.choice.c1.choice.rrcConnectionReconfigurationComplete.criticalExtensions.choice.rrcConnectionReconfigurationComplete_r8.
+ nonCriticalExtension->nonCriticalExtension->nonCriticalExtension!=NULL) {
+ if(ul_dcch_msg->message.choice.c1.choice.rrcConnectionReconfigurationComplete.criticalExtensions.choice.rrcConnectionReconfigurationComplete_r8.
+ nonCriticalExtension->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension!=NULL) {
+ if(ul_dcch_msg->message.choice.c1.choice.rrcConnectionReconfigurationComplete.criticalExtensions.choice.rrcConnectionReconfigurationComplete_r8.
+ nonCriticalExtension->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension!=NULL) {
+ if (ul_dcch_msg->message.choice.c1.choice.rrcConnectionReconfigurationComplete.criticalExtensions.choice.rrcConnectionReconfigurationComplete_r8.
+ nonCriticalExtension->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension!=NULL) {
+ if(ul_dcch_msg->message.choice.c1.choice.rrcConnectionReconfigurationComplete.criticalExtensions.choice.rrcConnectionReconfigurationComplete_r8.
+ nonCriticalExtension->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension
+ ->scg_ConfigResponseNR_r15!=NULL) {
+ /*Trigger E-RAB Modification Indication */
+ rrc_eNB_send_E_RAB_Modification_Indication(ctxt_pP, ue_context_p);
+ }
+ }
+ }
+ }
+ }
+ }
}
-
} else {
dedicated_DRB = 1;
ue_context_p->ue_context.Status = RRC_RECONFIGURED;
@@ -7930,15 +8163,74 @@ rrc_eNB_decode_dcch(
}
LOG_I(RRC, "got UE capabilities for UE %x\n", ctxt_pP->rnti);
-
int eutra_index = -1;
for (i = 0; i < ul_dcch_msg->message.choice.c1.choice.ueCapabilityInformation.criticalExtensions.choice.c1.choice.ueCapabilityInformation_r8.ue_CapabilityRAT_ContainerList.list.count; i++) {
- if (ul_dcch_msg->message.choice.c1.choice.ueCapabilityInformation.criticalExtensions.choice.c1.choice.ueCapabilityInformation_r8.ue_CapabilityRAT_ContainerList.list.array[i]->rat_Type == LTE_RAT_Type_eutra) {
+ if (ul_dcch_msg->message.choice.c1.choice.ueCapabilityInformation.criticalExtensions.choice.c1.choice.ueCapabilityInformation_r8.ue_CapabilityRAT_ContainerList.list.array[i]->rat_Type ==
+ LTE_RAT_Type_nr) {
+ if(ue_context_p->ue_context.UE_Capability_nr) {
+ ASN_STRUCT_FREE(asn_DEF_NR_UE_NR_Capability,ue_context_p->ue_context.UE_Capability_nr);
+ ue_context_p->ue_context.UE_Capability_nr = 0;
+ }
+
+ dec_rval = uper_decode(NULL,
+ &asn_DEF_NR_UE_NR_Capability,
+ (void **)&ue_context_p->ue_context.UE_Capability_nr,
+ ul_dcch_msg->message.choice.c1.choice.ueCapabilityInformation.criticalExtensions.choice.c1.choice.ueCapabilityInformation_r8.ue_CapabilityRAT_ContainerList.list.array[i]->ueCapabilityRAT_Container.buf,
+ ul_dcch_msg->message.choice.c1.choice.ueCapabilityInformation.criticalExtensions.choice.c1.choice.ueCapabilityInformation_r8.ue_CapabilityRAT_ContainerList.list.array[i]->ueCapabilityRAT_Container.size,
+ 0, 0);
+
+ if (LOG_DEBUGFLAG(DEBUG_ASN1)) {
+ xer_fprint(stdout, &asn_DEF_NR_UE_NR_Capability, ue_context_p->ue_context.UE_Capability_nr);
+ }
+
+ if ((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)) {
+ LOG_E(RRC, PROTOCOL_RRC_CTXT_UE_FMT" Failed to decode nr UE capabilities (%zu bytes)\n",
+ PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP),dec_rval.consumed);
+ ASN_STRUCT_FREE(asn_DEF_NR_UE_NR_Capability,ue_context_p->ue_context.UE_Capability_nr);
+ ue_context_p->ue_context.UE_Capability_nr = 0;
+ }
+
+ ue_context_p->ue_context.UE_NR_Capability_size =
+ ul_dcch_msg->message.choice.c1.choice.ueCapabilityInformation.criticalExtensions.choice.c1.choice.ueCapabilityInformation_r8.ue_CapabilityRAT_ContainerList.list.array[i]->ueCapabilityRAT_Container.size;
+ }
+
+ if (ul_dcch_msg->message.choice.c1.choice.ueCapabilityInformation.criticalExtensions.choice.c1.choice.ueCapabilityInformation_r8.ue_CapabilityRAT_ContainerList.list.array[i]->rat_Type ==
+ LTE_RAT_Type_eutra_nr) {
+ if(ue_context_p->ue_context.UE_Capability_MRDC) {
+ ASN_STRUCT_FREE(asn_DEF_NR_UE_MRDC_Capability,ue_context_p->ue_context.UE_Capability_MRDC);
+ ue_context_p->ue_context.UE_Capability_MRDC = 0;
+ }
+
+ dec_rval = uper_decode(NULL,
+ &asn_DEF_NR_UE_MRDC_Capability,
+ (void **)&ue_context_p->ue_context.UE_Capability_MRDC,
+ ul_dcch_msg->message.choice.c1.choice.ueCapabilityInformation.criticalExtensions.choice.c1.choice.ueCapabilityInformation_r8.ue_CapabilityRAT_ContainerList.list.array[i]->ueCapabilityRAT_Container.buf,
+ ul_dcch_msg->message.choice.c1.choice.ueCapabilityInformation.criticalExtensions.choice.c1.choice.ueCapabilityInformation_r8.ue_CapabilityRAT_ContainerList.list.array[i]->ueCapabilityRAT_Container.size,
+ 0, 0);
+
+ if (LOG_DEBUGFLAG(DEBUG_ASN1)) {
+ xer_fprint(stdout, &asn_DEF_NR_UE_MRDC_Capability, ue_context_p->ue_context.UE_Capability_MRDC);
+ }
+
+ if ((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)) {
+ LOG_E(RRC, PROTOCOL_RRC_CTXT_UE_FMT" Failed to decode MRDC UE capabilities (%zu bytes)\n",
+ PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP),dec_rval.consumed);
+ ASN_STRUCT_FREE(asn_DEF_NR_UE_MRDC_Capability,ue_context_p->ue_context.UE_Capability_MRDC);
+ ue_context_p->ue_context.UE_Capability_MRDC = 0;
+ }
+
+ ue_context_p->ue_context.UE_MRDC_Capability_size =
+ ul_dcch_msg->message.choice.c1.choice.ueCapabilityInformation.criticalExtensions.choice.c1.choice.ueCapabilityInformation_r8.ue_CapabilityRAT_ContainerList.list.array[i]->ueCapabilityRAT_Container.size;
+ }
+
+ if (ul_dcch_msg->message.choice.c1.choice.ueCapabilityInformation.criticalExtensions.choice.c1.choice.ueCapabilityInformation_r8.ue_CapabilityRAT_ContainerList.list.array[i]->rat_Type ==
+ LTE_RAT_Type_eutra) {
if (eutra_index != -1) {
LOG_E(RRC, "fatal: more than 1 eutra capability\n");
exit(1);
}
+
eutra_index = i;
}
}
@@ -7960,7 +8252,8 @@ rrc_eNB_decode_dcch(
ul_dcch_msg->message.choice.c1.choice.ueCapabilityInformation.criticalExtensions.choice.c1.choice.ueCapabilityInformation_r8.ue_CapabilityRAT_ContainerList.list.array[eutra_index]->ueCapabilityRAT_Container.buf,
ul_dcch_msg->message.choice.c1.choice.ueCapabilityInformation.criticalExtensions.choice.c1.choice.ueCapabilityInformation_r8.ue_CapabilityRAT_ContainerList.list.array[eutra_index]->ueCapabilityRAT_Container.size,
0, 0);
- ue_context_p->ue_context.UE_Capability_size = ul_dcch_msg->message.choice.c1.choice.ueCapabilityInformation.criticalExtensions.choice.c1.choice.ueCapabilityInformation_r8.ue_CapabilityRAT_ContainerList.list.array[eutra_index]->ueCapabilityRAT_Container.size;
+ ue_context_p->ue_context.UE_Capability_size =
+ ul_dcch_msg->message.choice.c1.choice.ueCapabilityInformation.criticalExtensions.choice.c1.choice.ueCapabilityInformation_r8.ue_CapabilityRAT_ContainerList.list.array[eutra_index]->ueCapabilityRAT_Container.size;
if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
xer_fprint(stdout, &asn_DEF_LTE_UE_EUTRA_Capability, ue_context_p->ue_context.UE_Capability);
@@ -8077,36 +8370,54 @@ rrc_eNB_decode_dcch(
return 0;
//TTN for D2D
} else if (ul_dcch_msg->message.present == LTE_UL_DCCH_MessageType_PR_messageClassExtension) {
- LOG_I(RRC, "THINH [LTE_UL_DCCH_MessageType_PR_messageClassExtension]\n");
+ LOG_I(RRC, "[LTE_UL_DCCH_MessageType_PR_messageClassExtension]\n");
switch (ul_dcch_msg->message.choice.messageClassExtension.present) {
case LTE_UL_DCCH_MessageType__messageClassExtension_PR_NOTHING: /* No components present */
break;
case LTE_UL_DCCH_MessageType__messageClassExtension_PR_c2: //SidelinkUEInformation
- //case UL_DCCH_MessageType__messageClassExtension__c2_PR_sidelinkUEInformation_r12: //SidelinkUEInformation
- LOG_I(RRC,"THINH [LTE_UL_DCCH_MessageType__messageClassExtension_PR_c2]\n");
- LOG_DUMPMSG(RRC,DEBUG_RRC,(char *)Rx_sdu,sdu_sizeP,
+ if(ul_dcch_msg->message.choice.messageClassExtension.choice.c2.present ==
+ LTE_UL_DCCH_MessageType__messageClassExtension__c2_PR_scgFailureInformationNR_r15){
+ if (ul_dcch_msg->message.choice.messageClassExtension.choice.c2.choice.scgFailureInformationNR_r15.
+ criticalExtensions.present == LTE_SCGFailureInformationNR_r15__criticalExtensions_PR_c1){
+ if (ul_dcch_msg->message.choice.messageClassExtension.choice.c2.choice.scgFailureInformationNR_r15.criticalExtensions.
+ choice.c1.present == LTE_SCGFailureInformationNR_r15__criticalExtensions__c1_PR_scgFailureInformationNR_r15){
+ if (ul_dcch_msg->message.choice.messageClassExtension.choice.c2.choice.scgFailureInformationNR_r15.criticalExtensions.
+ choice.c1.choice.scgFailureInformationNR_r15.failureReportSCG_NR_r15!=NULL) {
+ LOG_E(RRC, "Received NR scgFailureInformation from UE, failure type: %ld \n",
+ ul_dcch_msg->message.choice.messageClassExtension.choice.c2.choice.scgFailureInformationNR_r15.criticalExtensions.
+ choice.c1.choice.scgFailureInformationNR_r15.failureReportSCG_NR_r15->failureType_r15);
+ xer_fprint(stdout, &asn_DEF_LTE_UL_DCCH_Message, (void *)ul_dcch_msg);
+ }
+ }
+ }
+ }
+ else if(ul_dcch_msg->message.choice.messageClassExtension.choice.c2.present == LTE_UL_DCCH_MessageType__messageClassExtension__c2_PR_sidelinkUEInformation_r12){
+ //case UL_DCCH_MessageType__messageClassExtension__c2_PR_sidelinkUEInformation_r12: //SidelinkUEInformation
+ LOG_I(RRC,"THINH [LTE_UL_DCCH_MessageType__messageClassExtension_PR_c2]\n");
+ LOG_DUMPMSG(RRC,DEBUG_RRC,(char *)Rx_sdu,sdu_sizeP,
"[MSG] RRC SidelinkUEInformation \n");
- MSC_LOG_RX_MESSAGE(
- MSC_RRC_ENB,
- MSC_RRC_UE,
- Rx_sdu,
- sdu_sizeP,
- MSC_AS_TIME_FMT" SidelinkUEInformation UE %x size %u",
- MSC_AS_TIME_ARGS(ctxt_pP),
- ue_context_p->ue_context.rnti,
- sdu_sizeP);
- LOG_I(RRC,
- PROTOCOL_RRC_CTXT_UE_FMT" RLC RB %02d --- RLC_DATA_IND %d bytes "
- "(SidelinkUEInformation) ---> RRC_eNB\n",
- PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP),
- DCCH,
+ MSC_LOG_RX_MESSAGE(
+ MSC_RRC_ENB,
+ MSC_RRC_UE,
+ Rx_sdu,
+ sdu_sizeP,
+ MSC_AS_TIME_FMT" SidelinkUEInformation UE %x size %u",
+ MSC_AS_TIME_ARGS(ctxt_pP),
+ ue_context_p->ue_context.rnti,
sdu_sizeP);
- rrc_eNB_process_SidelinkUEInformation(
- ctxt_pP,
- ue_context_p,
- &ul_dcch_msg->message.choice.messageClassExtension.choice.c2.choice.sidelinkUEInformation_r12);
+ LOG_I(RRC,
+ PROTOCOL_RRC_CTXT_UE_FMT" RLC RB %02d --- RLC_DATA_IND %d bytes "
+ "(SidelinkUEInformation) ---> RRC_eNB\n",
+ PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP),
+ DCCH,
+ sdu_sizeP);
+ rrc_eNB_process_SidelinkUEInformation(
+ ctxt_pP,
+ ue_context_p,
+ &ul_dcch_msg->message.choice.messageClassExtension.choice.c2.choice.sidelinkUEInformation_r12);
+ }
break;
default:
@@ -8679,117 +8990,109 @@ void rrc_subframe_process(protocol_ctxt_t *const ctxt_pP, const int CC_id) {
}
void rrc_eNB_process_AdditionResponseInformation(const module_id_t enb_mod_idP, x2ap_ENDC_sgnb_addition_req_ACK_t *m) {
+ NR_CG_Config_t *CG_Config = NULL;
+ {
+ int i;
+ printf("%d: ", m->rrc_buffer_size);
+ for (i=0; irrc_buffer_size; i++) printf("%2.2x", (unsigned char)m->rrc_buffer[i]);
- NR_CG_Config_t *CG_Config = NULL;
+ printf("\n");
+ }
+ asn_dec_rval_t dec_rval = uper_decode_complete( NULL,
+ &asn_DEF_NR_CG_Config,
+ (void **)&CG_Config,
+ (uint8_t *)m->rrc_buffer,
+ (int) m->rrc_buffer_size);//m->rrc_buffer_size);
- {
- int i;
- printf("%d: ", m->rrc_buffer_size);
- for (i=0; irrc_buffer_size; i++) printf("%2.2x", (unsigned char)m->rrc_buffer[i]);
- printf("\n");
+ if ((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)) {
+ AssertFatal(1==0,"NR_UL_DCCH_MESSAGE decode error\n");
+ // free the memory
+ SEQUENCE_free( &asn_DEF_NR_CG_Config, CG_Config, 1 );
+ return;
+ }
- }
- asn_dec_rval_t dec_rval = uper_decode_complete( NULL,
- &asn_DEF_NR_CG_Config,
- (void **)&CG_Config,
- (uint8_t *)m->rrc_buffer,
- (int) m->rrc_buffer_size);//m->rrc_buffer_size);
+ xer_fprint(stdout,&asn_DEF_NR_CG_Config, CG_Config);
+ // recreate enough of X2 EN-DC Container
+ AssertFatal(CG_Config->criticalExtensions.choice.c1->present == NR_CG_Config__criticalExtensions__c1_PR_cg_Config,
+ "CG_Config not present\n");
+ OCTET_STRING_t *scg_CellGroupConfig = NULL;
+ OCTET_STRING_t *nr1_conf = NULL;
- if ((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)) {
- AssertFatal(1==0,"NR_UL_DCCH_MESSAGE decode error\n");
- // free the memory
- SEQUENCE_free( &asn_DEF_NR_CG_Config, CG_Config, 1 );
- return;
- }
- xer_fprint(stdout,&asn_DEF_NR_CG_Config, CG_Config);
- // recreate enough of X2 EN-DC Container
-
- AssertFatal(CG_Config->criticalExtensions.choice.c1->present == NR_CG_Config__criticalExtensions__c1_PR_cg_Config,
- "CG_Config not present\n");
-
- OCTET_STRING_t *scg_CellGroupConfig = NULL;
- OCTET_STRING_t *nr1_conf = NULL;
-
- if(CG_Config->criticalExtensions.choice.c1->choice.cg_Config->scg_CellGroupConfig){
- scg_CellGroupConfig = CG_Config->criticalExtensions.choice.c1->choice.cg_Config->scg_CellGroupConfig;
+ if(CG_Config->criticalExtensions.choice.c1->choice.cg_Config->scg_CellGroupConfig) {
+ scg_CellGroupConfig = CG_Config->criticalExtensions.choice.c1->choice.cg_Config->scg_CellGroupConfig;
#ifdef DEBUG_SCG_CONFIG
- {
- int size_s = CG_Config->criticalExtensions.choice.c1->choice.cg_Config->scg_CellGroupConfig->size;
- int i;
- LOG_I(RRC, "Dumping scg_CellGroupConfig: %d", size_s);
- for (i=0; icriticalExtensions.choice.c1->choice.cg_Config->scg_CellGroupConfig->buf[i]);
- printf("\n");
+ {
+ int size_s = CG_Config->criticalExtensions.choice.c1->choice.cg_Config->scg_CellGroupConfig->size;
+ int i;
+ LOG_I(RRC, "Dumping scg_CellGroupConfig: %d", size_s);
- }
+ for (i=0; icriticalExtensions.choice.c1->choice.cg_Config->scg_CellGroupConfig->buf[i]);
+
+ printf("\n");
+ }
#endif
+ } else {
+ LOG_W(RRC, "SCG Cell group configuration is not present in the Addition Response message \n");
+ return;
+ }
- }
- else{
- LOG_W(RRC, "SCG Cell group configuration is not present in the Addition Response message \n");
- return;
- }
- if(CG_Config->criticalExtensions.choice.c1->choice.cg_Config->scg_RB_Config){
- nr1_conf = CG_Config->criticalExtensions.choice.c1->choice.cg_Config->scg_RB_Config;
+ if(CG_Config->criticalExtensions.choice.c1->choice.cg_Config->scg_RB_Config) {
+ nr1_conf = CG_Config->criticalExtensions.choice.c1->choice.cg_Config->scg_RB_Config;
#ifdef DEBUG_SCG_CONFIG
- {
- int size_s = CG_Config->criticalExtensions.choice.c1->choice.cg_Config->scg_RB_Config->size;
- int i;
- LOG_I(RRC, "Dumping scg_RB_Config: %d", size_s);
- for (i=0; icriticalExtensions.choice.c1->choice.cg_Config->scg_RB_Config->buf[i]);
- printf("\n");
+ {
+ int size_s = CG_Config->criticalExtensions.choice.c1->choice.cg_Config->scg_RB_Config->size;
+ int i;
+ LOG_I(RRC, "Dumping scg_RB_Config: %d", size_s);
- }
+ for (i=0; icriticalExtensions.choice.c1->choice.cg_Config->scg_RB_Config->buf[i]);
+
+ printf("\n");
+ }
#endif
- }
- else{
- LOG_W(RRC, "SCG RB configuration is not present in the Addition Response message \n");
- return;
+ } else {
+ LOG_W(RRC, "SCG RB configuration is not present in the Addition Response message \n");
+ return;
+ }
+
+ protocol_ctxt_t ctxt;
+ rrc_eNB_ue_context_t *ue_context;
+ unsigned char buffer[8192];
+ int size;
+ ue_context = rrc_eNB_get_ue_context(RC.rrc[enb_mod_idP], m->rnti);
+ ue_context->ue_context.nb_of_modify_endc_e_rabs = m->nb_e_rabs_admitted_tobeadded;
+ int j=0;
+
+ while(j < m->nb_e_rabs_admitted_tobeadded) {
+ for (int e_rab_idx=0; e_rab_idxue_context.setup_e_rabs; e_rab_idx++) {
+ //Update ue_context information with gNB's address and new GTP tunnel ID
+ if( ue_context->ue_context.e_rab[e_rab_idx].param.e_rab_id == m->e_rabs_admitted_tobeadded[j].e_rab_id) {
+ memcpy(ue_context->ue_context.gnb_gtp_endc_addrs[e_rab_idx].buffer,
+ m->e_rabs_admitted_tobeadded[j].gnb_addr.buffer,
+ m->e_rabs_admitted_tobeadded[j].gnb_addr.length);
+ ue_context->ue_context.gnb_gtp_endc_addrs[e_rab_idx].length = m->e_rabs_admitted_tobeadded[j].gnb_addr.length;
+ ue_context->ue_context.gnb_gtp_endc_teid[e_rab_idx] = m->e_rabs_admitted_tobeadded[j].gtp_teid;
+ ue_context->ue_context.e_rab[e_rab_idx].status = E_RAB_STATUS_TOMODIFY;
+ break;
+ }
}
- protocol_ctxt_t ctxt;
- rrc_eNB_ue_context_t *ue_context;
- unsigned char buffer[8192];
- int size;
+ j++;
+ }
- ue_context = rrc_eNB_get_ue_context(RC.rrc[enb_mod_idP], m->rnti);
-
- ue_context->ue_context.nb_of_modify_endc_e_rabs = m->nb_e_rabs_admitted_tobeadded;
-
- int j=0;
- while(j < m->nb_e_rabs_admitted_tobeadded){
- for (int e_rab_idx=0; e_rab_idxue_context.setup_e_rabs; e_rab_idx++){
- //Update ue_context information with gNB's address and new GTP tunnel ID
- if( ue_context->ue_context.e_rab[e_rab_idx].param.e_rab_id == m->e_rabs_admitted_tobeadded[j].e_rab_id){
- memcpy(ue_context->ue_context.gnb_gtp_endc_addrs[e_rab_idx].buffer,
- m->e_rabs_admitted_tobeadded[j].gnb_addr.buffer,
- m->e_rabs_admitted_tobeadded[j].gnb_addr.length);
- ue_context->ue_context.gnb_gtp_endc_addrs[e_rab_idx].length = m->e_rabs_admitted_tobeadded[j].gnb_addr.length;
- ue_context->ue_context.gnb_gtp_endc_teid[e_rab_idx] = m->e_rabs_admitted_tobeadded[j].gtp_teid;
- ue_context->ue_context.e_rab[e_rab_idx].status = E_RAB_STATUS_TOMODIFY;
- break;
- }
- }
- j++;
- }
-
-
-
- PROTOCOL_CTXT_SET_BY_INSTANCE(&ctxt,
- 0,
- ENB_FLAG_YES,
- m->rnti,
- 0, 0);
-
- size = rrc_eNB_generate_RRCConnectionReconfiguration_endc(&ctxt, ue_context, buffer, 8192, scg_CellGroupConfig, nr1_conf);
-
- rrc_data_req(&ctxt,
- DCCH,
- rrc_eNB_mui++,
- SDU_CONFIRM_NO,
- size,
- buffer,
- PDCP_TRANSMISSION_MODE_CONTROL);
+ PROTOCOL_CTXT_SET_BY_INSTANCE(&ctxt,
+ 0,
+ ENB_FLAG_YES,
+ m->rnti,
+ 0, 0);
+ size = rrc_eNB_generate_RRCConnectionReconfiguration_endc(&ctxt, ue_context, buffer, 8192, scg_CellGroupConfig, nr1_conf);
+ rrc_data_req(&ctxt,
+ DCCH,
+ rrc_eNB_mui++,
+ SDU_CONFIRM_NO,
+ size,
+ buffer,
+ PDCP_TRANSMISSION_MODE_CONTROL);
}
@@ -9072,11 +9375,10 @@ void *rrc_enb_process_itti_msg(void *notUsed) {
}
case X2AP_ENDC_SGNB_ADDITION_REQ_ACK: {
- rrc_eNB_process_AdditionResponseInformation(ENB_INSTANCE_TO_MODULE_ID(instance), &X2AP_ENDC_SGNB_ADDITION_REQ_ACK(msg_p));
- break;
+ rrc_eNB_process_AdditionResponseInformation(ENB_INSTANCE_TO_MODULE_ID(instance), &X2AP_ENDC_SGNB_ADDITION_REQ_ACK(msg_p));
+ break;
}
-
/* Messages from eNB app */
case RRC_CONFIGURATION_REQ:
LOG_I(RRC, "[eNB %d] Received %s : %p\n", instance, msg_name_p, &RRC_CONFIGURATION_REQ(msg_p));
@@ -9096,36 +9398,36 @@ void *rrc_enb_process_itti_msg(void *notUsed) {
break;
case M2AP_SETUP_RESP:
- rrc_eNB_process_M2AP_SETUP_RESP(&ctxt,0/*CC_id*/,ENB_INSTANCE_TO_MODULE_ID(instance),&M2AP_SETUP_RESP(msg_p));
+ rrc_eNB_process_M2AP_SETUP_RESP(&ctxt,0/*CC_id*/,ENB_INSTANCE_TO_MODULE_ID(instance),&M2AP_SETUP_RESP(msg_p));
break;
case M2AP_MBMS_SCHEDULING_INFORMATION:
- rrc_eNB_process_M2AP_MBMS_SCHEDULING_INFORMATION(&ctxt,0/*CC_id*/,ENB_INSTANCE_TO_MODULE_ID(instance),&M2AP_MBMS_SCHEDULING_INFORMATION(msg_p));
- break;
+ rrc_eNB_process_M2AP_MBMS_SCHEDULING_INFORMATION(&ctxt,0/*CC_id*/,ENB_INSTANCE_TO_MODULE_ID(instance),&M2AP_MBMS_SCHEDULING_INFORMATION(msg_p));
+ break;
case M2AP_MBMS_SESSION_START_REQ:
- rrc_eNB_process_M2AP_MBMS_SESSION_START_REQ(&ctxt,0/*CC_id*/,ENB_INSTANCE_TO_MODULE_ID(instance),&M2AP_MBMS_SESSION_START_REQ(msg_p));
- break;
+ rrc_eNB_process_M2AP_MBMS_SESSION_START_REQ(&ctxt,0/*CC_id*/,ENB_INSTANCE_TO_MODULE_ID(instance),&M2AP_MBMS_SESSION_START_REQ(msg_p));
+ break;
case M2AP_MBMS_SESSION_STOP_REQ:
- rrc_eNB_process_M2AP_MBMS_SESSION_STOP_REQ(&ctxt,&M2AP_MBMS_SESSION_STOP_REQ(msg_p));
- break;
+ rrc_eNB_process_M2AP_MBMS_SESSION_STOP_REQ(&ctxt,&M2AP_MBMS_SESSION_STOP_REQ(msg_p));
+ break;
case M2AP_RESET:
- rrc_eNB_process_M2AP_RESET(&ctxt,&M2AP_RESET(msg_p));
- break;
+ rrc_eNB_process_M2AP_RESET(&ctxt,&M2AP_RESET(msg_p));
+ break;
case M2AP_ENB_CONFIGURATION_UPDATE_ACK:
- rrc_eNB_process_M2AP_ENB_CONFIGURATION_UPDATE_ACK(&ctxt,&M2AP_ENB_CONFIGURATION_UPDATE_ACK(msg_p));
- break;
+ rrc_eNB_process_M2AP_ENB_CONFIGURATION_UPDATE_ACK(&ctxt,&M2AP_ENB_CONFIGURATION_UPDATE_ACK(msg_p));
+ break;
case M2AP_ERROR_INDICATION:
- rrc_eNB_process_M2AP_ERROR_INDICATION(&ctxt,&M2AP_ERROR_INDICATION(msg_p));
- break;
+ rrc_eNB_process_M2AP_ERROR_INDICATION(&ctxt,&M2AP_ERROR_INDICATION(msg_p));
+ break;
case M2AP_MBMS_SERVICE_COUNTING_REQ:
- rrc_eNB_process_M2AP_MBMS_SERVICE_COUNTING_REQ(&ctxt,&M2AP_MBMS_SERVICE_COUNTING_REQ(msg_p));
- break;
+ rrc_eNB_process_M2AP_MBMS_SERVICE_COUNTING_REQ(&ctxt,&M2AP_MBMS_SERVICE_COUNTING_REQ(msg_p));
+ break;
case M2AP_MCE_CONFIGURATION_UPDATE:
rrc_eNB_process_M2AP_MCE_CONFIGURATION_UPDATE(&ctxt,&M2AP_MCE_CONFIGURATION_UPDATE(msg_p));
@@ -9162,17 +9464,16 @@ rrc_enb_task(
//-----------------------------------------------------------------------------
{
rrc_enb_init();
-
itti_mark_task_ready(TASK_RRC_ENB);
LOG_I(RRC,"Entering main loop of RRC message task\n");
while (1) {
(void) rrc_enb_process_itti_msg(NULL);
-{
- //extern volatile int go_nr;
- void rrc_go_nr(void);
- //if (go_nr) rrc_go_nr();
-}
+ {
+ //extern volatile int go_nr;
+ void rrc_go_nr(void);
+ //if (go_nr) rrc_go_nr();
+ }
}
}
diff --git a/openair2/RRC/NR/nr_rrc_proto.h b/openair2/RRC/NR/nr_rrc_proto.h
index fd766f7e12..317282c814 100644
--- a/openair2/RRC/NR/nr_rrc_proto.h
+++ b/openair2/RRC/NR/nr_rrc_proto.h
@@ -65,7 +65,7 @@ void rrc_gNB_generate_SgNBAdditionRequestAcknowledge(
struct rrc_gNB_ue_context_s *rrc_gNB_allocate_new_UE_context(gNB_RRC_INST *rrc_instance_pP);
-void rrc_parse_ue_capabilities(gNB_RRC_INST *rrc,LTE_UE_CapabilityRAT_ContainerList_t *UE_CapabilityRAT_ContainerList, x2ap_ENDC_sgnb_addition_req_t *m);
+void rrc_parse_ue_capabilities(gNB_RRC_INST *rrc,LTE_UE_CapabilityRAT_ContainerList_t *UE_CapabilityRAT_ContainerList, x2ap_ENDC_sgnb_addition_req_t *m, NR_CG_ConfigInfo_IEs_t * cg_config_info);
void rrc_add_nsa_user(gNB_RRC_INST *rrc,struct rrc_gNB_ue_context_s *ue_context_p, x2ap_ENDC_sgnb_addition_req_t *m);
diff --git a/openair2/RRC/NR/rrc_gNB.c b/openair2/RRC/NR/rrc_gNB.c
index a2e66fa93e..1f341cfdf9 100644
--- a/openair2/RRC/NR/rrc_gNB.c
+++ b/openair2/RRC/NR/rrc_gNB.c
@@ -95,12 +95,10 @@ mui_t rrc_gNB_mui = 0;
void openair_nr_rrc_on(const protocol_ctxt_t *const ctxt_pP) {
LOG_I(NR_RRC, PROTOCOL_NR_RRC_CTXT_FMT" gNB:OPENAIR NR RRC IN....\n",PROTOCOL_NR_RRC_CTXT_ARGS(ctxt_pP));
-
rrc_config_nr_buffer (&RC.nrrrc[ctxt_pP->module_id]->carrier.SI, BCCH, 1);
RC.nrrrc[ctxt_pP->module_id]->carrier.SI.Active = 1;
rrc_config_nr_buffer (&RC.nrrrc[ctxt_pP->module_id]->carrier.Srb0, CCCH, 1);
RC.nrrrc[ctxt_pP->module_id]->carrier.Srb0.Active = 1;
-
}
///---------------------------------------------------------------------------------------------------------------///
@@ -173,7 +171,6 @@ void rrc_gNB_generate_SgNBAdditionRequestAcknowledge(
ue_context_pP->ue_context.primaryCC_id,
physicalCellGroupConfig,
physicalcellgroup_config);
-
do_SpCellConfig(RC.nrrrc[ctxt_pP->module_id],
spCellConfig);
}
@@ -182,57 +179,47 @@ void rrc_gNB_generate_SgNBAdditionRequestAcknowledge(
///---------------------------------------------------------------------------------------------------------------///
static void init_NR_SI(gNB_RRC_INST *rrc) {
-
-
LOG_D(RRC,"%s()\n\n\n\n",__FUNCTION__);
-
-
-
- rrc->carrier.MIB = (uint8_t*) malloc16(4);
+ rrc->carrier.MIB = (uint8_t *) malloc16(4);
rrc->carrier.sizeof_MIB = do_MIB_NR(rrc,0);
-
-
LOG_I(NR_RRC,"Done init_NR_SI\n");
-
-
rrc_mac_config_req_gNB(rrc->module_id,
- rrc->carrier.ssb_SubcarrierOffset,
+ rrc->carrier.ssb_SubcarrierOffset,
rrc->carrier.pdsch_AntennaPorts,
(NR_ServingCellConfigCommon_t *)rrc->carrier.servingcellconfigcommon,
- 0,
- 0, // WIP hardcoded rnti
- (NR_CellGroupConfig_t *)NULL
- );
-
+ 0,
+ 0, // WIP hardcoded rnti
+ (NR_CellGroupConfig_t *)NULL
+ );
if (get_softmodem_params()->phy_test > 0 || get_softmodem_params()->do_ra > 0) {
// This is for phytest only, emulate first X2 message if uecap.raw file is present
FILE *fd;
-
fd = fopen("uecap.raw","r");
+
if (fd != NULL) {
char buffer[4096];
int msg_len=fread(buffer,1,4096,fd);
LOG_I(RRC,"Read in %d bytes for uecap\n",msg_len);
LTE_UL_DCCH_Message_t *LTE_UL_DCCH_Message;
-
asn_dec_rval_t dec_rval = uper_decode_complete( NULL,
- &asn_DEF_LTE_UL_DCCH_Message,
- (void **)<E_UL_DCCH_Message,
- (uint8_t *)buffer,
- msg_len);
-
+ &asn_DEF_LTE_UL_DCCH_Message,
+ (void **)<E_UL_DCCH_Message,
+ (uint8_t *)buffer,
+ msg_len);
+
if ((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)) {
AssertFatal(1==0,"NR_UL_DCCH_MESSAGE decode error\n");
- // free the memory
- SEQUENCE_free( &asn_DEF_LTE_UL_DCCH_Message, LTE_UL_DCCH_Message, 1 );
- return;
- }
+ // free the memory
+ SEQUENCE_free( &asn_DEF_LTE_UL_DCCH_Message, LTE_UL_DCCH_Message, 1 );
+ return;
+ }
+
fclose(fd);
xer_fprint(stdout,&asn_DEF_LTE_UL_DCCH_Message, LTE_UL_DCCH_Message);
// recreate enough of X2 EN-DC Container
AssertFatal(LTE_UL_DCCH_Message->message.choice.c1.present == LTE_UL_DCCH_MessageType__c1_PR_ueCapabilityInformation,
- "ueCapabilityInformation not present\n");
+ "ueCapabilityInformation not present\n");
NR_CG_ConfigInfo_t *CG_ConfigInfo = calloc(1,sizeof(*CG_ConfigInfo));
CG_ConfigInfo->criticalExtensions.present = NR_CG_ConfigInfo__criticalExtensions_PR_c1;
CG_ConfigInfo->criticalExtensions.choice.c1 = calloc(1,sizeof(*CG_ConfigInfo->criticalExtensions.choice.c1));
@@ -240,42 +227,37 @@ static void init_NR_SI(gNB_RRC_INST *rrc) {
CG_ConfigInfo->criticalExtensions.choice.c1->choice.cg_ConfigInfo = calloc(1,sizeof(*CG_ConfigInfo->criticalExtensions.choice.c1->choice.cg_ConfigInfo));
NR_CG_ConfigInfo_IEs_t *cg_ConfigInfo = CG_ConfigInfo->criticalExtensions.choice.c1->choice.cg_ConfigInfo;
cg_ConfigInfo->ue_CapabilityInfo = calloc(1,sizeof(*cg_ConfigInfo->ue_CapabilityInfo));
- asn_enc_rval_t enc_rval = uper_encode_to_buffer(&asn_DEF_LTE_UE_CapabilityRAT_ContainerList,NULL,(void*)<E_UL_DCCH_Message->message.choice.c1.choice.ueCapabilityInformation.criticalExtensions.choice.c1.choice.ueCapabilityInformation_r8.ue_CapabilityRAT_ContainerList,buffer,4096);
+ asn_enc_rval_t enc_rval = uper_encode_to_buffer(&asn_DEF_LTE_UE_CapabilityRAT_ContainerList,NULL,
+ (void *)<E_UL_DCCH_Message->message.choice.c1.choice.ueCapabilityInformation.criticalExtensions.choice.c1.choice.ueCapabilityInformation_r8.ue_CapabilityRAT_ContainerList,buffer,4096);
AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %jd)!\n",
- enc_rval.failed_type->name, enc_rval.encoded);
+ enc_rval.failed_type->name, enc_rval.encoded);
OCTET_STRING_fromBuf(cg_ConfigInfo->ue_CapabilityInfo,
- (const char *)buffer,
- (enc_rval.encoded+7)>>3);
+ (const char *)buffer,
+ (enc_rval.encoded+7)>>3);
parse_CG_ConfigInfo(rrc,CG_ConfigInfo,NULL);
- }
- else {
+ } else {
struct rrc_gNB_ue_context_s *ue_context_p = rrc_gNB_allocate_new_UE_context(rrc);
-
- LOG_I(NR_RRC,"Adding new user (%p)\n",ue_context_p);
+ LOG_I(NR_RRC,"Adding new user (%p)\n",ue_context_p);
rrc_add_nsa_user(rrc,ue_context_p,NULL);
- }
+ }
}
}
char openair_rrc_gNB_configuration(const module_id_t gnb_mod_idP, gNB_RrcConfigurationReq *configuration) {
protocol_ctxt_t ctxt;
-
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,
PROTOCOL_NR_RRC_CTXT_FMT" Init...\n",
PROTOCOL_NR_RRC_CTXT_ARGS(&ctxt));
+
AssertFatal(rrc != NULL, "RC.nrrrc not initialized!");
AssertFatal(NUMBER_OF_UE_MAX < (module_id_t)0xFFFFFFFFFFFFFFFF, " variable overflow");
AssertFatal(configuration!=NULL,"configuration input is null\n");
rrc->module_id = gnb_mod_idP;
rrc->Nb_ue = 0;
-
rrc->carrier.Srb0.Active = 0;
-
nr_uid_linear_allocator_init(&rrc->uid_allocator);
RB_INIT(&rrc->rrc_ue_head);
rrc->initial_id2_s1ap_ids = hashtable_create (NUMBER_OF_UE_MAX * 2, NULL, NULL);
@@ -285,7 +267,6 @@ char openair_rrc_gNB_configuration(const module_id_t gnb_mod_idP, gNB_RrcConfigu
rrc->carrier.pdsch_AntennaPorts = configuration->pdsch_AntennaPorts;
/// System Information INIT
LOG_I(NR_RRC, PROTOCOL_NR_RRC_CTXT_FMT" Checking release \n",PROTOCOL_NR_RRC_CTXT_ARGS(&ctxt));
-
init_NR_SI(rrc);
rrc_init_nr_global_param();
openair_nr_rrc_on(&ctxt);
@@ -294,43 +275,26 @@ char openair_rrc_gNB_configuration(const module_id_t gnb_mod_idP, gNB_RrcConfigu
void rrc_gNB_process_AdditionRequestInformation(const module_id_t gnb_mod_idP, x2ap_ENDC_sgnb_addition_req_t *m) {
+ struct NR_CG_ConfigInfo *cg_configinfo = NULL;
+ asn_dec_rval_t dec_rval = uper_decode_complete(NULL,
+ &asn_DEF_NR_CG_ConfigInfo,
+ (void **)&cg_configinfo,
+ (uint8_t *)m->rrc_buffer,
+ (int) m->rrc_buffer_size);//m->rrc_buffer_size);
+ gNB_RRC_INST *rrc=RC.nrrrc[gnb_mod_idP];
+ if ((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)) {
+ AssertFatal(1==0,"NR_UL_DCCH_MESSAGE decode error\n");
+ // free the memory
+ SEQUENCE_free(&asn_DEF_NR_CG_ConfigInfo, cg_configinfo, 1);
+ return;
+ }
- LTE_UL_DCCH_Message_t *LTE_UL_DCCH_Message = NULL;
-
- asn_dec_rval_t dec_rval = uper_decode_complete( NULL,
- &asn_DEF_LTE_UL_DCCH_Message,
- (void **)<E_UL_DCCH_Message,
- (uint8_t *)m->rrc_buffer,
- (int) m->rrc_buffer_size);//m->rrc_buffer_size);
-
- gNB_RRC_INST *rrc=RC.nrrrc[gnb_mod_idP];
-
- if ((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)) {
- AssertFatal(1==0,"NR_UL_DCCH_MESSAGE decode error\n");
- // free the memory
- SEQUENCE_free( &asn_DEF_LTE_UL_DCCH_Message, LTE_UL_DCCH_Message, 1 );
- return;
- }
- xer_fprint(stdout,&asn_DEF_LTE_UL_DCCH_Message, LTE_UL_DCCH_Message);
- // recreate enough of X2 EN-DC Container
- AssertFatal(LTE_UL_DCCH_Message->message.choice.c1.present == LTE_UL_DCCH_MessageType__c1_PR_ueCapabilityInformation,
- "ueCapabilityInformation not present\n");
- NR_CG_ConfigInfo_t *CG_ConfigInfo = calloc(1,sizeof(*CG_ConfigInfo));
- CG_ConfigInfo->criticalExtensions.present = NR_CG_ConfigInfo__criticalExtensions_PR_c1;
- CG_ConfigInfo->criticalExtensions.choice.c1 = calloc(1,sizeof(*CG_ConfigInfo->criticalExtensions.choice.c1));
- CG_ConfigInfo->criticalExtensions.choice.c1->present = NR_CG_ConfigInfo__criticalExtensions__c1_PR_cg_ConfigInfo;
- CG_ConfigInfo->criticalExtensions.choice.c1->choice.cg_ConfigInfo = calloc(1,sizeof(*CG_ConfigInfo->criticalExtensions.choice.c1->choice.cg_ConfigInfo));
- NR_CG_ConfigInfo_IEs_t *cg_ConfigInfo = CG_ConfigInfo->criticalExtensions.choice.c1->choice.cg_ConfigInfo;
- cg_ConfigInfo->ue_CapabilityInfo = calloc(1,sizeof(*cg_ConfigInfo->ue_CapabilityInfo));
- asn_enc_rval_t enc_rval = uper_encode_to_buffer(&asn_DEF_LTE_UE_CapabilityRAT_ContainerList,NULL,(void*)<E_UL_DCCH_Message->message.choice.c1.choice.ueCapabilityInformation.criticalExtensions.choice.c1.choice.ueCapabilityInformation_r8.ue_CapabilityRAT_ContainerList,m->rrc_buffer,m->rrc_buffer_size);
- AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %jd)!\n",
- enc_rval.failed_type->name, enc_rval.encoded);
- OCTET_STRING_fromBuf(cg_ConfigInfo->ue_CapabilityInfo,
- (const char *)m->rrc_buffer,
- (enc_rval.encoded+7)>>3);
- parse_CG_ConfigInfo(rrc,CG_ConfigInfo,m);
-
+ xer_fprint(stdout,&asn_DEF_NR_CG_ConfigInfo, cg_configinfo);
+ // recreate enough of X2 EN-DC Container
+ AssertFatal(cg_configinfo->criticalExtensions.choice.c1->present == NR_CG_ConfigInfo__criticalExtensions__c1_PR_cg_ConfigInfo,
+ "ueCapabilityInformation not present\n");
+ parse_CG_ConfigInfo(rrc,cg_configinfo,m);
}
///---------------------------------------------------------------------------------------------------------------///
@@ -428,16 +392,15 @@ void *rrc_gnb_task(void *args_p) {
openair_rrc_gNB_configuration(GNB_INSTANCE_TO_MODULE_ID(instance), &NRRRC_CONFIGURATION_REQ(msg_p));
break;
- /* Messages from X2AP */
+ /* Messages from X2AP */
case X2AP_ENDC_SGNB_ADDITION_REQ:
- LOG_I(NR_RRC, "Received ENDC sgNB addition request from X2AP \n");
- rrc_gNB_process_AdditionRequestInformation(GNB_INSTANCE_TO_MODULE_ID(instance), &X2AP_ENDC_SGNB_ADDITION_REQ(msg_p));
- break;
+ LOG_I(NR_RRC, "Received ENDC sgNB addition request from X2AP \n");
+ rrc_gNB_process_AdditionRequestInformation(GNB_INSTANCE_TO_MODULE_ID(instance), &X2AP_ENDC_SGNB_ADDITION_REQ(msg_p));
+ break;
case X2AP_ENDC_SGNB_RECONF_COMPLETE:
- LOG_I(NR_RRC, "Handling of reconfiguration complete message at RRC gNB is pending \n");
- break;
-
+ LOG_I(NR_RRC, "Handling of reconfiguration complete message at RRC gNB is pending \n");
+ break;
default:
LOG_E(NR_RRC, "[gNB %d] Received unexpected message %s\n", instance, msg_name_p);
diff --git a/openair2/RRC/NR/rrc_gNB_internode.c b/openair2/RRC/NR/rrc_gNB_internode.c
index 916f4d63da..cacff5cf5c 100644
--- a/openair2/RRC/NR/rrc_gNB_internode.c
+++ b/openair2/RRC/NR/rrc_gNB_internode.c
@@ -39,47 +39,48 @@
#include "NR_CG-Config.h"
int parse_CG_ConfigInfo(gNB_RRC_INST *rrc, NR_CG_ConfigInfo_t *CG_ConfigInfo, x2ap_ENDC_sgnb_addition_req_t *m) {
-
if (CG_ConfigInfo->criticalExtensions.present == NR_CG_ConfigInfo__criticalExtensions_PR_c1) {
if (CG_ConfigInfo->criticalExtensions.choice.c1) {
if (CG_ConfigInfo->criticalExtensions.choice.c1->present == NR_CG_ConfigInfo__criticalExtensions__c1_PR_cg_ConfigInfo) {
- NR_CG_ConfigInfo_IEs_t *cg_ConfigInfo = CG_ConfigInfo->criticalExtensions.choice.c1->choice.cg_ConfigInfo;
- if (cg_ConfigInfo->ue_CapabilityInfo) {
- // Decode UE-CapabilityRAT-ContainerList
+ NR_CG_ConfigInfo_IEs_t *cg_ConfigInfo = CG_ConfigInfo->criticalExtensions.choice.c1->choice.cg_ConfigInfo;
+
+ if (cg_ConfigInfo->ue_CapabilityInfo) {
+ // Decode UE-CapabilityRAT-ContainerList
LTE_UE_CapabilityRAT_ContainerList_t *UE_CapabilityRAT_ContainerList=NULL;
- asn_dec_rval_t dec_rval = uper_decode(NULL,
- &asn_DEF_LTE_UE_CapabilityRAT_ContainerList,
- (void**)&UE_CapabilityRAT_ContainerList,
- cg_ConfigInfo->ue_CapabilityInfo->buf,
- cg_ConfigInfo->ue_CapabilityInfo->size, 0, 0);
+ UE_CapabilityRAT_ContainerList = calloc(1,sizeof(LTE_UE_CapabilityRAT_ContainerList_t));
+ asn_dec_rval_t dec_rval = uper_decode(NULL,
+ &asn_DEF_LTE_UE_CapabilityRAT_ContainerList,
+ (void **)&UE_CapabilityRAT_ContainerList,
+ cg_ConfigInfo->ue_CapabilityInfo->buf,
+ cg_ConfigInfo->ue_CapabilityInfo->size, 0, 0);
+
if ((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)) {
- AssertFatal(1==0,"[InterNode] Failed to decode NR_UE_CapabilityRAT_ContainerList (%zu bits), size of OCTET_STRING %lu\n",
- dec_rval.consumed, cg_ConfigInfo->ue_CapabilityInfo->size);
- }
- rrc_parse_ue_capabilities(rrc,UE_CapabilityRAT_ContainerList, m);
- }
- if (cg_ConfigInfo->candidateCellInfoListMN) AssertFatal(1==0,"Can't handle candidateCellInfoListMN yet\n");
- }
- else AssertFatal(1==0,"c1 extension is not cg_ConfigInfo, returning\n");
- }
- else {
+ AssertFatal(1==0,"[InterNode] Failed to decode NR_UE_CapabilityRAT_ContainerList (%zu bits), size of OCTET_STRING %lu\n",
+ dec_rval.consumed, cg_ConfigInfo->ue_CapabilityInfo->size);
+ }
+
+ rrc_parse_ue_capabilities(rrc,UE_CapabilityRAT_ContainerList, m,cg_ConfigInfo);
+ }
+
+ if (cg_ConfigInfo->candidateCellInfoListMN) AssertFatal(1==0,"Can't handle candidateCellInfoListMN yet\n");
+ } else AssertFatal(1==0,"c1 extension is not cg_ConfigInfo, returning\n");
+ } else {
LOG_E(RRC,"c1 extension not found, returning\n");
- return(-1);
+ return(-1);
}
} else {
LOG_E(RRC,"Ignoring unknown CG_ConfigInfo extensions\n");
return(-1);
}
- return(0);
+
+ return(0);
}
-int generate_CG_Config(gNB_RRC_INST *rrc,
- NR_CG_Config_t *cg_Config,
- NR_RRCReconfiguration_t *reconfig,
- NR_RadioBearerConfig_t *rbconfig) {
-
-
+int generate_CG_Config(gNB_RRC_INST *rrc,
+ NR_CG_Config_t *cg_Config,
+ NR_RRCReconfiguration_t *reconfig,
+ NR_RadioBearerConfig_t *rbconfig) {
cg_Config->criticalExtensions.present = NR_CG_Config__criticalExtensions_PR_c1;
cg_Config->criticalExtensions.choice.c1 = calloc(1,sizeof(*cg_Config->criticalExtensions.choice.c1));
cg_Config->criticalExtensions.choice.c1->present = NR_CG_Config__criticalExtensions__c1_PR_cg_Config;
@@ -91,36 +92,37 @@ int generate_CG_Config(gNB_RRC_INST *rrc,
enc_rval.failed_type->name, enc_rval.encoded);
cg_Config->criticalExtensions.choice.c1->choice.cg_Config->scg_CellGroupConfig = calloc(1,sizeof(OCTET_STRING_t));
OCTET_STRING_fromBuf(cg_Config->criticalExtensions.choice.c1->choice.cg_Config->scg_CellGroupConfig,
- (const char *)buffer,
- (enc_rval.encoded+7)>>3);
+ (const char *)buffer,
+ (enc_rval.encoded+7)>>3);
total_size = (enc_rval.encoded+7)>>3;
-
LOG_I(RRC,"Dumping NR_RRCReconfiguration message (%jd bytes)\n",(enc_rval.encoded+7)>>3);
- for (int i=0;i<(enc_rval.encoded+7)>>3;i++) {
+
+ for (int i=0; i<(enc_rval.encoded+7)>>3; i++) {
printf("%02x",((uint8_t *)buffer)[i]);
}
+
printf("\n");
FILE *fd = fopen("reconfig.raw","w");
- fwrite((void*)buffer,1,(size_t)((enc_rval.encoded+7)>>3),fd);
+ fwrite((void *)buffer,1,(size_t)((enc_rval.encoded+7)>>3),fd);
fclose(fd);
-
enc_rval = uper_encode_to_buffer(&asn_DEF_NR_RadioBearerConfig, NULL, (void *)rbconfig, buffer, 1024);
AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %jd)!\n",
enc_rval.failed_type->name, enc_rval.encoded);
cg_Config->criticalExtensions.choice.c1->choice.cg_Config->scg_RB_Config = calloc(1,sizeof(OCTET_STRING_t));
OCTET_STRING_fromBuf(cg_Config->criticalExtensions.choice.c1->choice.cg_Config->scg_RB_Config,
- (const char *)buffer,
- (enc_rval.encoded+7)>>3);
+ (const char *)buffer,
+ (enc_rval.encoded+7)>>3);
LOG_I(RRC,"Dumping scg_RB_Config message (%jd bytes)\n",(enc_rval.encoded+7)>>3);
- for (int i=0;i<(enc_rval.encoded+7)>>3;i++) {
- printf("%02x",((uint8_t*)buffer)[i]);
+
+ for (int i=0; i<(enc_rval.encoded+7)>>3; i++) {
+ printf("%02x",((uint8_t *)buffer)[i]);
}
+
printf("\n");
fd = fopen("rbconfig.raw","w");
- fwrite((void*)buffer,1,(size_t)((enc_rval.encoded+7)>>3),fd);
+ fwrite((void *)buffer,1,(size_t)((enc_rval.encoded+7)>>3),fd);
fclose(fd);
total_size = total_size + ((enc_rval.encoded+7)>>3);
-
return(total_size);
}
diff --git a/openair2/RRC/NR/rrc_gNB_nsa.c b/openair2/RRC/NR/rrc_gNB_nsa.c
index 97e9ffdd89..64c762dd42 100644
--- a/openair2/RRC/NR/rrc_gNB_nsa.c
+++ b/openair2/RRC/NR/rrc_gNB_nsa.c
@@ -38,9 +38,9 @@
#include "NR_CG-Config.h"
#include "openair2/LAYER2/NR_MAC_gNB/mac_proto.h"
#include "openair2/RRC/LTE/rrc_eNB_GTPV1U.h"
+#include "executables/softmodem-common.h"
-void rrc_parse_ue_capabilities(gNB_RRC_INST *rrc, LTE_UE_CapabilityRAT_ContainerList_t *UE_CapabilityRAT_ContainerList, x2ap_ENDC_sgnb_addition_req_t *m) {
-
+void rrc_parse_ue_capabilities(gNB_RRC_INST *rrc, LTE_UE_CapabilityRAT_ContainerList_t *UE_CapabilityRAT_ContainerList, x2ap_ENDC_sgnb_addition_req_t *m, NR_CG_ConfigInfo_IEs_t *cg_config_info) {
struct rrc_gNB_ue_context_s *ue_context_p = NULL;
OCTET_STRING_t *ueCapabilityRAT_Container_nr=NULL;
@@ -50,10 +50,11 @@ void rrc_parse_ue_capabilities(gNB_RRC_INST *rrc, LTE_UE_CapabilityRAT_Container
AssertFatal(UE_CapabilityRAT_ContainerList!=NULL,"UE_CapabilityRAT_ContainerList is null\n");
AssertFatal((list_size=UE_CapabilityRAT_ContainerList->list.count) >= 2, "UE_CapabilityRAT_ContainerList->list.size %d < 2\n",UE_CapabilityRAT_ContainerList->list.count);
- for (int i=0;ilist.array[i]->rat_Type == LTE_RAT_Type_nr) ueCapabilityRAT_Container_nr = &UE_CapabilityRAT_ContainerList->list.array[i]->ueCapabilityRAT_Container;
else if (UE_CapabilityRAT_ContainerList->list.array[i]->rat_Type == LTE_RAT_Type_eutra_nr) ueCapabilityRAT_Container_MRDC = &UE_CapabilityRAT_ContainerList->list.array[i]->ueCapabilityRAT_Container;
- }
+ }
// decode and store capabilities
ue_context_p = rrc_gNB_allocate_new_UE_context(rrc);
@@ -67,10 +68,10 @@ void rrc_parse_ue_capabilities(gNB_RRC_INST *rrc, LTE_UE_CapabilityRAT_Container
if ((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)) {
LOG_E(RRC, "Failed to decode UE NR capabilities (%zu bytes) container size %lu\n", dec_rval.consumed,ueCapabilityRAT_Container_nr->size);
- ASN_STRUCT_FREE(asn_DEF_NR_UE_NR_Capability,
- ue_context_p->ue_context.UE_Capability_nr);
- ue_context_p->ue_context.UE_Capability_nr = 0;
- AssertFatal(1==0,"exiting\n");
+ ASN_STRUCT_FREE(asn_DEF_NR_UE_NR_Capability,
+ ue_context_p->ue_context.UE_Capability_nr);
+ ue_context_p->ue_context.UE_Capability_nr = 0;
+ AssertFatal(1==0,"exiting\n");
}
}
@@ -82,157 +83,160 @@ void rrc_parse_ue_capabilities(gNB_RRC_INST *rrc, LTE_UE_CapabilityRAT_Container
ueCapabilityRAT_Container_MRDC->size, 0, 0);
if ((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)) {
- LOG_E(RRC, "Failed to decode UE MRDC capabilities (%zu bytes)\n", dec_rval.consumed);
- ASN_STRUCT_FREE(asn_DEF_NR_UE_MRDC_Capability,
- ue_context_p->ue_context.UE_Capability_MRDC);
- ue_context_p->ue_context.UE_Capability_MRDC = 0;
- AssertFatal(1==0,"exiting\n");
+ LOG_E(RRC, "Failed to decode UE MRDC capabilities (%zu bytes)\n", dec_rval.consumed);
+ ASN_STRUCT_FREE(asn_DEF_NR_UE_MRDC_Capability,
+ ue_context_p->ue_context.UE_Capability_MRDC);
+ ue_context_p->ue_context.UE_Capability_MRDC = 0;
+ AssertFatal(1==0,"exiting\n");
}
}
// dump ue_capabilities
if ( LOG_DEBUGFLAG(DEBUG_ASN1 && ueCapabilityRAT_Container_nr != NULL) ) {
- xer_fprint(stdout, &asn_DEF_NR_UE_NR_Capability, ue_context_p->ue_context.UE_Capability_nr);
- }
+ xer_fprint(stdout, &asn_DEF_NR_UE_NR_Capability, ue_context_p->ue_context.UE_Capability_nr);
+ }
if ( LOG_DEBUGFLAG(DEBUG_ASN1 && ueCapabilityRAT_Container_MRDC != NULL) ) {
- xer_fprint(stdout, &asn_DEF_NR_UE_MRDC_Capability, ue_context_p->ue_context.UE_Capability_MRDC);
- }
+ xer_fprint(stdout, &asn_DEF_NR_UE_MRDC_Capability, ue_context_p->ue_context.UE_Capability_MRDC);
+ }
+ if(cg_config_info && cg_config_info->mcg_RB_Config) {
+ asn_dec_rval_t dec_rval = uper_decode(NULL,
+ &asn_DEF_NR_RadioBearerConfig,
+ (void **)&ue_context_p->ue_context.rb_config,
+ cg_config_info->mcg_RB_Config->buf,
+ cg_config_info->mcg_RB_Config->size, 0, 0);
+
+ if((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)) {
+ AssertFatal(1==0,"[InterNode] Failed to decode mcg_rb_config (%zu bits), size of OCTET_STRING %lu\n",
+ dec_rval.consumed, cg_config_info->mcg_RB_Config->size);
+ }
+ }
+
+ xer_fprint(stdout, &asn_DEF_NR_RadioBearerConfig, (const void *)ue_context_p->ue_context.rb_config);
rrc_add_nsa_user(rrc,ue_context_p, m);
}
void rrc_add_nsa_user(gNB_RRC_INST *rrc,struct rrc_gNB_ue_context_s *ue_context_p, x2ap_ENDC_sgnb_addition_req_t *m) {
-
-// generate nr-Config-r15 containers for LTE RRC : inside message for X2 EN-DC (CG-Config Message from 38.331)
-
+ // generate nr-Config-r15 containers for LTE RRC : inside message for X2 EN-DC (CG-Config Message from 38.331)
rrc_gNB_carrier_data_t *carrier=&rrc->carrier;
-
MessageDef *msg;
msg = itti_alloc_new_message(TASK_RRC_ENB, X2AP_ENDC_SGNB_ADDITION_REQ_ACK);
gtpv1u_enb_create_tunnel_req_t create_tunnel_req;
gtpv1u_enb_create_tunnel_resp_t create_tunnel_resp;
protocol_ctxt_t ctxt;
-
-// NR RRCReconfiguration
-
+ // NR RRCReconfiguration
AssertFatal(rrc->Nb_ue < MAX_NR_RRC_UE_CONTEXTS,"cannot add another UE\n");
-
ue_context_p->ue_context.reconfig = calloc(1,sizeof(NR_RRCReconfiguration_t));
ue_context_p->ue_context.secondaryCellGroup = calloc(1,sizeof(NR_CellGroupConfig_t));
- memset((void*)ue_context_p->ue_context.reconfig,0,sizeof(NR_RRCReconfiguration_t));
+ memset((void *)ue_context_p->ue_context.reconfig,0,sizeof(NR_RRCReconfiguration_t));
ue_context_p->ue_context.reconfig->rrc_TransactionIdentifier=0;
ue_context_p->ue_context.reconfig->criticalExtensions.present = NR_RRCReconfiguration__criticalExtensions_PR_rrcReconfiguration;
NR_RRCReconfiguration_IEs_t *reconfig_ies=calloc(1,sizeof(NR_RRCReconfiguration_IEs_t));
ue_context_p->ue_context.reconfig->criticalExtensions.choice.rrcReconfiguration = reconfig_ies;
carrier->initial_csi_index[rrc->Nb_ue] = 0;
+ if (get_softmodem_params()->phy_test == 1 || get_softmodem_params()->do_ra == 1){
+ ue_context_p->ue_context.rb_config = calloc(1,sizeof(NR_RRCReconfiguration_t));
+ fill_default_rbconfig(ue_context_p->ue_context.rb_config);
+ }
fill_default_reconfig(carrier->servingcellconfigcommon,
- reconfig_ies,
- ue_context_p->ue_context.secondaryCellGroup,
- carrier->pdsch_AntennaPorts,
- carrier->initial_csi_index[rrc->Nb_ue]);
-
- ue_context_p->ue_context.rb_config = calloc(1,sizeof(NR_RRCReconfiguration_t));
-
- fill_default_rbconfig(ue_context_p->ue_context.rb_config);
+ reconfig_ies,
+ ue_context_p->ue_context.secondaryCellGroup,
+ carrier->pdsch_AntennaPorts,
+ carrier->initial_csi_index[rrc->Nb_ue]);
ue_context_p->ue_id_rnti = ue_context_p->ue_context.secondaryCellGroup->spCellConfig->reconfigurationWithSync->newUE_Identity;
NR_CG_Config_t *CG_Config = calloc(1,sizeof(*CG_Config));
- memset((void*)CG_Config,0,sizeof(*CG_Config));
+ memset((void *)CG_Config,0,sizeof(*CG_Config));
+ //int CG_Config_size = generate_CG_Config(rrc,CG_Config,ue_context_p->ue_context.reconfig,ue_context_p->ue_context.rb_config);
+ generate_CG_Config(rrc,CG_Config,ue_context_p->ue_context.reconfig,ue_context_p->ue_context.rb_config);
- __attribute__((unused))int CG_Config_size = generate_CG_Config(rrc,CG_Config,ue_context_p->ue_context.reconfig,ue_context_p->ue_context.rb_config);
+ if(m!=NULL) {
+ uint8_t inde_list[m->nb_e_rabs_tobeadded];
+ memset(inde_list, 0, m->nb_e_rabs_tobeadded*sizeof(uint8_t));
- if(m!=NULL){
- uint8_t inde_list[m->nb_e_rabs_tobeadded];
- memset(inde_list, 0, m->nb_e_rabs_tobeadded*sizeof(uint8_t));
+ if (m->nb_e_rabs_tobeadded>0) {
+ for (int i=0; inb_e_rabs_tobeadded; i++) {
+ // Add the new E-RABs at the corresponding rrc ue context of the gNB
+ ue_context_p->ue_context.e_rab[i].param.e_rab_id = m->e_rabs_tobeadded[i].e_rab_id;
+ ue_context_p->ue_context.e_rab[i].param.gtp_teid = m->e_rabs_tobeadded[i].gtp_teid;
+ memcpy(&ue_context_p->ue_context.e_rab[i].param.sgw_addr, &m->e_rabs_tobeadded[i].sgw_addr, sizeof(transport_layer_addr_t));
+ ue_context_p->ue_context.nb_of_e_rabs++;
+ //Fill the required E-RAB specific information for the creation of the S1-U tunnel between the gNB and the SGW
+ create_tunnel_req.eps_bearer_id[i] = ue_context_p->ue_context.e_rab[i].param.e_rab_id;
+ create_tunnel_req.sgw_S1u_teid[i] = ue_context_p->ue_context.e_rab[i].param.gtp_teid;
+ memcpy(&create_tunnel_req.sgw_addr[i], &ue_context_p->ue_context.e_rab[i].param.sgw_addr, sizeof(transport_layer_addr_t));
+ inde_list[i] = i;
+ LOG_I(RRC,"S1-U tunnel: index %d target sgw ip %d.%d.%d.%d length %d gtp teid %u\n",
+ i,
+ create_tunnel_req.sgw_addr[i].buffer[0],
+ create_tunnel_req.sgw_addr[i].buffer[1],
+ create_tunnel_req.sgw_addr[i].buffer[2],
+ create_tunnel_req.sgw_addr[i].buffer[3],
+ create_tunnel_req.sgw_addr[i].length,
+ create_tunnel_req.sgw_S1u_teid[i]);
+ }
- if (m->nb_e_rabs_tobeadded>0){
- for (int i=0; inb_e_rabs_tobeadded; i++){
- // Add the new E-RABs at the corresponding rrc ue context of the gNB
- ue_context_p->ue_context.e_rab[i].param.e_rab_id = m->e_rabs_tobeadded[i].e_rab_id;
- ue_context_p->ue_context.e_rab[i].param.gtp_teid = m->e_rabs_tobeadded[i].gtp_teid;
- memcpy(&ue_context_p->ue_context.e_rab[i].param.sgw_addr, &m->e_rabs_tobeadded[i].sgw_addr, sizeof(transport_layer_addr_t));
- ue_context_p->ue_context.nb_of_e_rabs++;
- //Fill the required E-RAB specific information for the creation of the S1-U tunnel between the gNB and the SGW
- create_tunnel_req.eps_bearer_id[i] = ue_context_p->ue_context.e_rab[i].param.e_rab_id;
- create_tunnel_req.sgw_S1u_teid[i] = ue_context_p->ue_context.e_rab[i].param.gtp_teid;
- memcpy(&create_tunnel_req.sgw_addr[i], &ue_context_p->ue_context.e_rab[i].param.sgw_addr, sizeof(transport_layer_addr_t));
- inde_list[i] = i;
- LOG_I(RRC,"S1-U tunnel: index %d target sgw ip %d.%d.%d.%d length %d gtp teid %u\n",
- i,
- create_tunnel_req.sgw_addr[i].buffer[0],
- create_tunnel_req.sgw_addr[i].buffer[1],
- create_tunnel_req.sgw_addr[i].buffer[2],
- create_tunnel_req.sgw_addr[i].buffer[3],
- create_tunnel_req.sgw_addr[i].length,
- create_tunnel_req.sgw_S1u_teid[i]);
- }
- //PM: Is this where we should extract the rnti from?
- create_tunnel_req.rnti = ue_context_p->ue_id_rnti;
- create_tunnel_req.num_tunnels = m->nb_e_rabs_tobeadded;
- RB_INSERT(rrc_nr_ue_tree_s, &RC.nrrrc[rrc->module_id]->rrc_ue_head, ue_context_p);
+ create_tunnel_req.rnti = ue_context_p->ue_id_rnti;
+ create_tunnel_req.num_tunnels = m->nb_e_rabs_tobeadded;
+ RB_INSERT(rrc_nr_ue_tree_s, &RC.nrrrc[rrc->module_id]->rrc_ue_head, ue_context_p);
+ PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, rrc->module_id, GNB_FLAG_YES, ue_context_p->ue_id_rnti, 0, 0,rrc->module_id);
+ gtpv1u_create_s1u_tunnel(
+ ctxt.instance,
+ &create_tunnel_req,
+ &create_tunnel_resp);
+ rrc_gNB_process_GTPV1U_CREATE_TUNNEL_RESP(
+ &ctxt,
+ &create_tunnel_resp,
+ &inde_list[0]);
+ X2AP_ENDC_SGNB_ADDITION_REQ_ACK(msg).nb_e_rabs_admitted_tobeadded = m->nb_e_rabs_tobeadded;
+ X2AP_ENDC_SGNB_ADDITION_REQ_ACK(msg).target_assoc_id = m->target_assoc_id;
- PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, rrc->module_id, GNB_FLAG_YES, ue_context_p->ue_id_rnti, 0, 0,rrc->module_id);
- gtpv1u_create_s1u_tunnel(
- ctxt.instance,
- &create_tunnel_req,
- &create_tunnel_resp);
- rrc_gNB_process_GTPV1U_CREATE_TUNNEL_RESP(
- &ctxt,
- &create_tunnel_resp,
- &inde_list[0]);
- X2AP_ENDC_SGNB_ADDITION_REQ_ACK(msg).nb_e_rabs_admitted_tobeadded = m->nb_e_rabs_tobeadded;
- for(int i=0; iue_context.nb_of_e_rabs; i++){
- X2AP_ENDC_SGNB_ADDITION_REQ_ACK(msg).e_rabs_admitted_tobeadded[i].e_rab_id = ue_context_p->ue_context.e_rab[i].param.e_rab_id;
- X2AP_ENDC_SGNB_ADDITION_REQ_ACK(msg).e_rabs_admitted_tobeadded[i].gtp_teid = create_tunnel_resp.enb_S1u_teid[i];
- memcpy(&X2AP_ENDC_SGNB_ADDITION_REQ_ACK(msg).e_rabs_admitted_tobeadded[i].gnb_addr, &create_tunnel_resp.enb_addr, sizeof(transport_layer_addr_t));
-
- //The length field in the X2AP targetting structure is expected in bits but the create_tunnel_resp returns the address length in bytes
- X2AP_ENDC_SGNB_ADDITION_REQ_ACK(msg).e_rabs_admitted_tobeadded[i].gnb_addr.length = create_tunnel_resp.enb_addr.length*8;
-
- LOG_I(RRC,"S1-U create_tunnel_resp tunnel: index %d target gNB ip %d.%d.%d.%d length %d gtp teid %u\n",
- i,
- create_tunnel_resp.enb_addr.buffer[0],
- create_tunnel_resp.enb_addr.buffer[1],
- create_tunnel_resp.enb_addr.buffer[2],
- create_tunnel_resp.enb_addr.buffer[3],
- create_tunnel_resp.enb_addr.length,
- create_tunnel_resp.enb_S1u_teid[i]);
- LOG_I(RRC,"X2AP sGNB Addition Request: index %d target gNB ip %d.%d.%d.%d length %d gtp teid %u\n",
- i,
- X2AP_ENDC_SGNB_ADDITION_REQ_ACK(msg).e_rabs_admitted_tobeadded[i].gnb_addr.buffer[0],
- X2AP_ENDC_SGNB_ADDITION_REQ_ACK(msg).e_rabs_admitted_tobeadded[i].gnb_addr.buffer[1],
- X2AP_ENDC_SGNB_ADDITION_REQ_ACK(msg).e_rabs_admitted_tobeadded[i].gnb_addr.buffer[2],
- X2AP_ENDC_SGNB_ADDITION_REQ_ACK(msg).e_rabs_admitted_tobeadded[i].gnb_addr.buffer[3],
- X2AP_ENDC_SGNB_ADDITION_REQ_ACK(msg).e_rabs_admitted_tobeadded[i].gnb_addr.length,
- X2AP_ENDC_SGNB_ADDITION_REQ_ACK(msg).e_rabs_admitted_tobeadded[i].gtp_teid);
- }
- }
- else
- LOG_W(RRC, "No E-RAB to be added received from SgNB Addition Request message \n");
+ for(int i=0; iue_context.nb_of_e_rabs; i++) {
+ X2AP_ENDC_SGNB_ADDITION_REQ_ACK(msg).e_rabs_admitted_tobeadded[i].e_rab_id = ue_context_p->ue_context.e_rab[i].param.e_rab_id;
+ X2AP_ENDC_SGNB_ADDITION_REQ_ACK(msg).e_rabs_admitted_tobeadded[i].gtp_teid = create_tunnel_resp.enb_S1u_teid[i];
+ memcpy(&X2AP_ENDC_SGNB_ADDITION_REQ_ACK(msg).e_rabs_admitted_tobeadded[i].gnb_addr, &create_tunnel_resp.enb_addr, sizeof(transport_layer_addr_t));
+ //The length field in the X2AP targetting structure is expected in bits but the create_tunnel_resp returns the address length in bytes
+ X2AP_ENDC_SGNB_ADDITION_REQ_ACK(msg).e_rabs_admitted_tobeadded[i].gnb_addr.length = create_tunnel_resp.enb_addr.length*8;
+ LOG_I(RRC,"S1-U create_tunnel_resp tunnel: index %d target gNB ip %d.%d.%d.%d length %d gtp teid %u\n",
+ i,
+ create_tunnel_resp.enb_addr.buffer[0],
+ create_tunnel_resp.enb_addr.buffer[1],
+ create_tunnel_resp.enb_addr.buffer[2],
+ create_tunnel_resp.enb_addr.buffer[3],
+ create_tunnel_resp.enb_addr.length,
+ create_tunnel_resp.enb_S1u_teid[i]);
+ LOG_I(RRC,"X2AP sGNB Addition Request: index %d target gNB ip %d.%d.%d.%d length %d gtp teid %u\n",
+ i,
+ X2AP_ENDC_SGNB_ADDITION_REQ_ACK(msg).e_rabs_admitted_tobeadded[i].gnb_addr.buffer[0],
+ X2AP_ENDC_SGNB_ADDITION_REQ_ACK(msg).e_rabs_admitted_tobeadded[i].gnb_addr.buffer[1],
+ X2AP_ENDC_SGNB_ADDITION_REQ_ACK(msg).e_rabs_admitted_tobeadded[i].gnb_addr.buffer[2],
+ X2AP_ENDC_SGNB_ADDITION_REQ_ACK(msg).e_rabs_admitted_tobeadded[i].gnb_addr.buffer[3],
+ X2AP_ENDC_SGNB_ADDITION_REQ_ACK(msg).e_rabs_admitted_tobeadded[i].gnb_addr.length,
+ X2AP_ENDC_SGNB_ADDITION_REQ_ACK(msg).e_rabs_admitted_tobeadded[i].gtp_teid);
+ }
+ } else
+ LOG_W(RRC, "No E-RAB to be added received from SgNB Addition Request message \n");
}
//X2AP_ENDC_SGNB_ADDITION_REQ_ACK(msg).rrc_buffer_size = CG_Config_size; //Need to verify correct value for the buffer_size
// Send to X2 entity to transport to MeNB
asn_enc_rval_t enc_rval = uper_encode_to_buffer(&asn_DEF_NR_CG_Config,
- NULL,
- (void *)CG_Config,
- X2AP_ENDC_SGNB_ADDITION_REQ_ACK(msg).rrc_buffer,
- 1024);
-
+ NULL,
+ (void *)CG_Config,
+ X2AP_ENDC_SGNB_ADDITION_REQ_ACK(msg).rrc_buffer,
+ 1024);
X2AP_ENDC_SGNB_ADDITION_REQ_ACK(msg).rrc_buffer_size = (enc_rval.encoded+7)>>3;
-
itti_send_msg_to_task(TASK_X2AP, ENB_MODULE_ID_TO_INSTANCE(0), msg); //Check right id instead of hardcoding
-
rrc->Nb_ue++;
// configure MAC and RLC
rrc_mac_config_req_gNB(rrc->module_id,
- rrc->carrier.ssb_SubcarrierOffset,
+ rrc->carrier.ssb_SubcarrierOffset,
rrc->carrier.pdsch_AntennaPorts,
- NULL,
- 1, // add_ue flag
- ue_context_p->ue_id_rnti,
- ue_context_p->ue_context.secondaryCellGroup);
+ NULL,
+ 1, // add_ue flag
+ ue_context_p->ue_id_rnti,
+ ue_context_p->ue_context.secondaryCellGroup);
}
diff --git a/openair2/RRC/NR/rrc_gNB_reconfig.c b/openair2/RRC/NR/rrc_gNB_reconfig.c
index f732529ed7..7b0bb099f7 100644
--- a/openair2/RRC/NR/rrc_gNB_reconfig.c
+++ b/openair2/RRC/NR/rrc_gNB_reconfig.c
@@ -49,23 +49,19 @@
void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellconfigcommon,
- NR_CellGroupConfig_t *secondaryCellGroup,
- int scg_id,
- int servCellIndex,
- int n_physical_antenna_ports,
- int initial_csi_index) {
+ NR_CellGroupConfig_t *secondaryCellGroup,
+ int scg_id,
+ int servCellIndex,
+ int n_physical_antenna_ports,
+ int initial_csi_index) {
AssertFatal(servingcellconfigcommon!=NULL,"servingcellconfigcommon is null\n");
AssertFatal(secondaryCellGroup!=NULL,"secondaryCellGroup is null\n");
-
memset(secondaryCellGroup,0,sizeof(NR_CellGroupConfig_t));
secondaryCellGroup->cellGroupId = scg_id;
-
NR_RLC_BearerConfig_t *RLC_BearerConfig = calloc(1,sizeof(*RLC_BearerConfig));
-
RLC_BearerConfig->logicalChannelIdentity = 4;
RLC_BearerConfig->servedRadioBearer = calloc(1,sizeof(*RLC_BearerConfig->servedRadioBearer));
- RLC_BearerConfig->servedRadioBearer->present = NR_RLC_BearerConfig__servedRadioBearer_PR_drb_Identity;
-
+ RLC_BearerConfig->servedRadioBearer->present = NR_RLC_BearerConfig__servedRadioBearer_PR_drb_Identity;
RLC_BearerConfig->servedRadioBearer->choice.drb_Identity=1;
RLC_BearerConfig->reestablishRLC=calloc(1,sizeof(*RLC_BearerConfig->reestablishRLC));
*RLC_BearerConfig->reestablishRLC=NR_RLC_BearerConfig__reestablishRLC_true;
@@ -73,17 +69,15 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
RLC_BearerConfig->rlc_Config->present = NR_RLC_Config_PR_am;
RLC_BearerConfig->rlc_Config->choice.am = calloc(1,sizeof(*RLC_BearerConfig->rlc_Config->choice.am));
RLC_BearerConfig->rlc_Config->choice.am->ul_AM_RLC.sn_FieldLength = calloc(1,sizeof(*RLC_BearerConfig->rlc_Config->choice.am->ul_AM_RLC.sn_FieldLength));
- *RLC_BearerConfig->rlc_Config->choice.am->ul_AM_RLC.sn_FieldLength = NR_SN_FieldLengthAM_size18;
+ *RLC_BearerConfig->rlc_Config->choice.am->ul_AM_RLC.sn_FieldLength = NR_SN_FieldLengthAM_size18;
RLC_BearerConfig->rlc_Config->choice.am->ul_AM_RLC.t_PollRetransmit = NR_T_PollRetransmit_ms45;
RLC_BearerConfig->rlc_Config->choice.am->ul_AM_RLC.pollPDU = NR_PollPDU_p64;
RLC_BearerConfig->rlc_Config->choice.am->ul_AM_RLC.pollByte = NR_PollByte_kB500;
RLC_BearerConfig->rlc_Config->choice.am->ul_AM_RLC.maxRetxThreshold = NR_UL_AM_RLC__maxRetxThreshold_t32;
-
RLC_BearerConfig->rlc_Config->choice.am->dl_AM_RLC.sn_FieldLength = calloc(1,sizeof(*RLC_BearerConfig->rlc_Config->choice.am->dl_AM_RLC.sn_FieldLength));
*RLC_BearerConfig->rlc_Config->choice.am->dl_AM_RLC.sn_FieldLength = NR_SN_FieldLengthAM_size18;
RLC_BearerConfig->rlc_Config->choice.am->dl_AM_RLC.t_Reassembly = NR_T_Reassembly_ms15;
RLC_BearerConfig->rlc_Config->choice.am->dl_AM_RLC.t_StatusProhibit = NR_T_StatusProhibit_ms15;
-
RLC_BearerConfig->mac_LogicalChannelConfig = calloc(1,sizeof(*RLC_BearerConfig->mac_LogicalChannelConfig));
RLC_BearerConfig->mac_LogicalChannelConfig->ul_SpecificParameters = calloc(1,sizeof(*RLC_BearerConfig->mac_LogicalChannelConfig->ul_SpecificParameters));
RLC_BearerConfig->mac_LogicalChannelConfig->ul_SpecificParameters->priority = 1;
@@ -99,10 +93,8 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
RLC_BearerConfig->mac_LogicalChannelConfig->ul_SpecificParameters->logicalChannelSR_Mask = false;
RLC_BearerConfig->mac_LogicalChannelConfig->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = false;
RLC_BearerConfig->mac_LogicalChannelConfig->ul_SpecificParameters->bitRateQueryProhibitTimer = NULL;
-
secondaryCellGroup->rlc_BearerToAddModList = calloc(1,sizeof(*secondaryCellGroup->rlc_BearerToAddModList));
ASN_SEQUENCE_ADD(&secondaryCellGroup->rlc_BearerToAddModList->list, RLC_BearerConfig);
-
secondaryCellGroup->mac_CellGroupConfig=calloc(1,sizeof(*secondaryCellGroup->mac_CellGroupConfig));
secondaryCellGroup->mac_CellGroupConfig->drx_Config = NULL;
secondaryCellGroup->mac_CellGroupConfig->schedulingRequestConfig = NULL;
@@ -126,25 +118,20 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
secondaryCellGroup->mac_CellGroupConfig->phr_Config->choice.setup->dummy=false;
secondaryCellGroup->mac_CellGroupConfig->phr_Config->choice.setup->phr_Type2OtherCell = false;
secondaryCellGroup->mac_CellGroupConfig->phr_Config->choice.setup->phr_ModeOtherCG = NR_PHR_Config__phr_ModeOtherCG_real;
-
secondaryCellGroup->mac_CellGroupConfig->skipUplinkTxDynamic=false;
secondaryCellGroup->mac_CellGroupConfig->ext1 = NULL;
-
-
secondaryCellGroup->physicalCellGroupConfig = calloc(1,sizeof(*secondaryCellGroup->physicalCellGroupConfig));
-
secondaryCellGroup->physicalCellGroupConfig->harq_ACK_SpatialBundlingPUCCH=NULL;
secondaryCellGroup->physicalCellGroupConfig->harq_ACK_SpatialBundlingPUSCH=NULL;
secondaryCellGroup->physicalCellGroupConfig->p_NR_FR1=calloc(1,sizeof(*secondaryCellGroup->physicalCellGroupConfig->p_NR_FR1));
*secondaryCellGroup->physicalCellGroupConfig->p_NR_FR1=20;
- secondaryCellGroup->physicalCellGroupConfig->pdsch_HARQ_ACK_Codebook=NR_PhysicalCellGroupConfig__pdsch_HARQ_ACK_Codebook_dynamic;
+ secondaryCellGroup->physicalCellGroupConfig->pdsch_HARQ_ACK_Codebook=NR_PhysicalCellGroupConfig__pdsch_HARQ_ACK_Codebook_dynamic;
secondaryCellGroup->physicalCellGroupConfig->tpc_SRS_RNTI=NULL;
secondaryCellGroup->physicalCellGroupConfig->tpc_PUCCH_RNTI=NULL;
secondaryCellGroup->physicalCellGroupConfig->tpc_PUSCH_RNTI=NULL;
secondaryCellGroup->physicalCellGroupConfig->sp_CSI_RNTI=NULL;
secondaryCellGroup->physicalCellGroupConfig->cs_RNTI=NULL;
secondaryCellGroup->physicalCellGroupConfig->ext1=NULL;
-
secondaryCellGroup->spCellConfig = calloc(1,sizeof(*secondaryCellGroup->spCellConfig));
secondaryCellGroup->spCellConfig->servCellIndex = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->servCellIndex));
*secondaryCellGroup->spCellConfig->servCellIndex = servCellIndex;
@@ -154,7 +141,6 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
secondaryCellGroup->spCellConfig->reconfigurationWithSync->t304=NR_ReconfigurationWithSync__t304_ms2000;
secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated = NULL;
secondaryCellGroup->spCellConfig->reconfigurationWithSync->ext1 = NULL;
-
/* contention free ra */
secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated = calloc(1,sizeof(struct NR_ReconfigurationWithSync__rach_ConfigDedicated));
secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->present= NR_ReconfigurationWithSync__rach_ConfigDedicated_PR_uplink;
@@ -162,7 +148,8 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra= calloc(1,sizeof(struct NR_CFRA));
secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->ra_Prioritization= NULL;
secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->occasions= calloc(1,sizeof(struct NR_CFRA__occasions));
- memcpy(&secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->occasions->rach_ConfigGeneric, &servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric, sizeof(NR_RACH_ConfigGeneric_t));
+ memcpy(&secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->occasions->rach_ConfigGeneric,
+ &servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric, sizeof(NR_RACH_ConfigGeneric_t));
//secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->occasions->ssb_perRACH_Occasion= calloc(1,sizeof(long));
//*secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->occasions->ssb_perRACH_Occasion = NR_CFRA__occasions__ssb_perRACH_Occasion_one;
secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->occasions->ssb_perRACH_Occasion= NULL;
@@ -174,7 +161,6 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
ssbElem->ra_PreambleIndex= 63;
ASN_SEQUENCE_ADD(&secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->resources.choice.ssb->ssb_ResourceList.list,ssbElem);
secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->ext1 = NULL;
-
secondaryCellGroup->spCellConfig->rlf_TimersAndConstants = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->rlf_TimersAndConstants));
secondaryCellGroup->spCellConfig->rlf_TimersAndConstants->present = NR_SetupRelease_RLF_TimersAndConstants_PR_setup;
secondaryCellGroup->spCellConfig->rlf_TimersAndConstants->choice.setup=calloc(1,sizeof(*secondaryCellGroup->spCellConfig->rlf_TimersAndConstants->choice.setup));
@@ -183,21 +169,18 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
secondaryCellGroup->spCellConfig->rlf_TimersAndConstants->choice.setup->n311 = NR_RLF_TimersAndConstants__n311_n1;
secondaryCellGroup->spCellConfig->rlf_TimersAndConstants->choice.setup->ext1 = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->rlf_TimersAndConstants->choice.setup->ext1));
secondaryCellGroup->spCellConfig->rlf_TimersAndConstants->choice.setup->ext1->t311_v1530 = NR_RLF_TimersAndConstants__ext1__t311_v1530_ms30000;
-
secondaryCellGroup->spCellConfig->rlmInSyncOutOfSyncThreshold = NULL;
-
-
-
secondaryCellGroup->spCellConfig->spCellConfigDedicated = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated));
secondaryCellGroup->spCellConfig->spCellConfigDedicated->tdd_UL_DL_ConfigurationDedicated = NULL;
secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP));
-
secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdcch_Config=NULL;
secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config=calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config));
secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->present = NR_SetupRelease_PDSCH_Config_PR_setup;
- secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup));
+ secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup = calloc(1,
+ sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup));
secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->dataScramblingIdentityPDSCH = NULL;
- secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA));
+ secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA = calloc(1,
+ sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA));
secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->present= NR_SetupRelease_DMRS_DownlinkConfig_PR_setup;
secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup));
@@ -572,6 +555,7 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
bwp->bwp_Dedicated->pdsch_Config->choice.setup->dataScramblingIdentityPDSCH = NULL;
bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA));
bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->present= NR_SetupRelease_DMRS_DownlinkConfig_PR_setup;
+
bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup));
bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type=NULL;
@@ -2014,15 +1998,13 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
}
void fill_default_reconfig(NR_ServingCellConfigCommon_t *servingcellconfigcommon,
- NR_RRCReconfiguration_IEs_t *reconfig,
- NR_CellGroupConfig_t *secondaryCellGroup,
- int n_physical_antenna_ports,
- int initial_csi_index) {
-
+ NR_RRCReconfiguration_IEs_t *reconfig,
+ NR_CellGroupConfig_t *secondaryCellGroup,
+ int n_physical_antenna_ports,
+ int initial_csi_index) {
AssertFatal(servingcellconfigcommon!=NULL,"servingcellconfigcommon is null\n");
AssertFatal(reconfig!=NULL,"reconfig is null\n");
AssertFatal(secondaryCellGroup!=NULL,"secondaryCellGroup is null\n");
-
// radioBearerConfig
reconfig->radioBearerConfig=NULL;
// secondaryCellGroup
@@ -2032,12 +2014,10 @@ void fill_default_reconfig(NR_ServingCellConfigCommon_t *servingcellconfigcommon
char scg_buffer[1024];
asn_enc_rval_t enc_rval = uper_encode_to_buffer(&asn_DEF_NR_CellGroupConfig, NULL, (void *)secondaryCellGroup, scg_buffer, 1024);
AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %jd)!\n", enc_rval.failed_type->name, enc_rval.encoded);
-
-
reconfig->secondaryCellGroup = calloc(1,sizeof(*reconfig->secondaryCellGroup));
OCTET_STRING_fromBuf(reconfig->secondaryCellGroup,
- (const char*)scg_buffer,
- (enc_rval.encoded+7)>>3);
+ (const char *)scg_buffer,
+ (enc_rval.encoded+7)>>3);
// measConfig
reconfig->measConfig=NULL;
// lateNonCriticalExtension
@@ -2069,15 +2049,15 @@ void fill_default_rbconfig(NR_RadioBearerConfig_t *rbconfig) {
drb_ToAddMod->pdcp_Config->drb->headerCompression.present = NR_PDCP_Config__drb__headerCompression_PR_notUsed;
drb_ToAddMod->pdcp_Config->drb->headerCompression.choice.notUsed = 0;
- drb_ToAddMod->pdcp_Config->drb->integrityProtection=NULL;
- drb_ToAddMod->pdcp_Config->drb->statusReportRequired=NULL;
+ drb_ToAddMod->pdcp_Config->drb->integrityProtection=NULL;
+ drb_ToAddMod->pdcp_Config->drb->statusReportRequired=NULL;
drb_ToAddMod->pdcp_Config->drb->outOfOrderDelivery=NULL;
drb_ToAddMod->pdcp_Config->moreThanOneRLC = NULL;
drb_ToAddMod->pdcp_Config->t_Reordering = calloc(1,sizeof(*drb_ToAddMod->pdcp_Config->t_Reordering));
*drb_ToAddMod->pdcp_Config->t_Reordering = NR_PDCP_Config__t_Reordering_ms0;
drb_ToAddMod->pdcp_Config->ext1 = NULL;
-
+
ASN_SEQUENCE_ADD(&rbconfig->drb_ToAddModList->list,drb_ToAddMod);
rbconfig->drb_ToReleaseList = NULL;
@@ -2091,4 +2071,5 @@ void fill_default_rbconfig(NR_RadioBearerConfig_t *rbconfig) {
xer_fprint(stdout, &asn_DEF_NR_RadioBearerConfig, (const void*)rbconfig);
}
+
#endif
diff --git a/openair2/X2AP/x2ap_eNB.c b/openair2/X2AP/x2ap_eNB.c
index debe5e0712..6a037b8ee3 100644
--- a/openair2/X2AP/x2ap_eNB.c
+++ b/openair2/X2AP/x2ap_eNB.c
@@ -359,7 +359,7 @@ void x2ap_eNB_handle_sctp_init_msg_multi_cnf(
* Failure means multi_sd < 0.
*/
if (instance->multi_sd < 0) {
- X2AP_ERROR("Error: be sure to properly configure X22 in your configuration file.\n");
+ X2AP_ERROR("Error: be sure to properly configure X2 in your configuration file.\n");
DevAssert(instance->multi_sd >= 0);
}
@@ -454,10 +454,12 @@ void x2ap_eNB_handle_sgNB_add_req(instance_t instance,
x2ap_eNB_instance_t *instance_p;
x2ap_eNB_data_t *x2ap_eNB_data;
int ue_id;
-
- /* TODO: remove hardcoded value */
- x2ap_eNB_data = x2ap_is_eNB_id_in_list(3584);
+ LTE_PhysCellId_t target_pci;
+ target_pci = x2ap_ENDC_sgnb_addition_req->target_physCellId;
+ x2ap_eNB_data = x2ap_is_eNB_pci_in_list(target_pci);
DevAssert(x2ap_eNB_data != NULL);
+ DevAssert(x2ap_ENDC_sgnb_addition_req != NULL);
+
instance_p = x2ap_eNB_get_instance(instance);
DevAssert(instance_p != NULL);
@@ -474,7 +476,8 @@ void x2ap_eNB_handle_sgNB_add_req(instance_t instance,
x2ap_set_ids(id_manager, ue_id, x2ap_ENDC_sgnb_addition_req->rnti, ue_id, -1);
x2ap_id_set_state(id_manager, ue_id, X2ID_STATE_NSA_PREPARE);
- x2ap_eNB_generate_ENDC_x2_SgNB_addition_request(instance_p, x2ap_ENDC_sgnb_addition_req, x2ap_eNB_data, ue_id);
+ x2ap_eNB_generate_ENDC_x2_SgNB_addition_request(instance_p, x2ap_ENDC_sgnb_addition_req,
+ x2ap_eNB_data, ue_id);
}
static
@@ -489,16 +492,31 @@ void x2ap_gNB_trigger_sgNB_add_req_ack(instance_t instance,
* as far as I understand.. CROUX
*/
-
+ x2ap_id_manager *id_manager;
x2ap_eNB_instance_t *instance_p;
x2ap_eNB_data_t *target;
- /*int source_assoc_id = x2ap_ENDC_sgnb_addition_req_ACK->source_assoc_id;
int ue_id;
+ /*int source_assoc_id = x2ap_ENDC_sgnb_addition_req_ACK->source_assoc_id;
int id_source;
int id_target;*/
instance_p = x2ap_eNB_get_instance(instance);
DevAssert(instance_p != NULL);
+ target = x2ap_get_eNB(NULL,x2ap_ENDC_sgnb_addition_req_ACK->target_assoc_id, 0);
+ DevAssert(target != NULL);
+
+ /* allocate x2ap ID */
+ id_manager = &instance_p->id_manager;
+ ue_id = x2ap_allocate_new_id(id_manager);
+ if (ue_id == -1) {
+ X2AP_ERROR("could not allocate a new X2AP UE ID\n");
+ exit(1);
+ }
+ /* id_source is ue_id, id_target is unknown yet */
+ x2ap_set_ids(id_manager, ue_id, x2ap_ENDC_sgnb_addition_req_ACK->rnti, ue_id,
+ x2ap_ENDC_sgnb_addition_req_ACK->MeNB_ue_x2_id);
+ x2ap_id_set_state(id_manager, ue_id, X2ID_STATE_SOURCE_OVERALL);
+
/*target = x2ap_get_eNB(NULL, source_assoc_id, 0);
DevAssert(target != NULL);*/
@@ -511,10 +529,36 @@ void x2ap_gNB_trigger_sgNB_add_req_ack(instance_t instance,
x2ap_set_ids(&instance_p->id_manager, ue_id, x2ap_handover_req_ack->rnti, id_source, id_target);*/
- //target = x2ap_get_eNB(NULL, 17, 0);
- target = x2ap_is_eNB_id_in_list (3585); //Currently hardcoded. Need to extract it differently
+ x2ap_gNB_generate_ENDC_x2_SgNB_addition_request_ACK(instance_p, target,
+ x2ap_ENDC_sgnb_addition_req_ACK, ue_id);
+}
+
+/**
+ * @fn : Function triggers sgnb reconfiguration complete
+ * @param : IN instance, IN x2ap_reconf_complete
+**/
+static
+void x2ap_eNB_trigger_sgnb_reconfiguration_complete(instance_t instance,
+ x2ap_ENDC_reconf_complete_t *x2ap_reconf_complete)
+{
+ x2ap_eNB_instance_t *instance_p = NULL;
+ x2ap_eNB_data_t *target = NULL;
+ int id_source = -1;
+ int id_target = -1;
+ LTE_PhysCellId_t target_pci;
+
+ instance_p = x2ap_eNB_get_instance(instance);
+ DevAssert(instance_p != NULL);
+ DevAssert(x2ap_reconf_complete != NULL);
+
+ target_pci = x2ap_reconf_complete->target_physCellId;
+ target = x2ap_is_eNB_pci_in_list(target_pci);
DevAssert(target != NULL);
- x2ap_gNB_generate_ENDC_x2_SgNB_addition_request_ACK(instance_p, target, x2ap_ENDC_sgnb_addition_req_ACK, 0);
+
+ id_source = x2ap_reconf_complete->MeNB_ue_x2_id;
+ id_target = x2ap_reconf_complete->SgNB_ue_x2_id;
+ x2ap_eNB_generate_ENDC_x2_SgNB_reconfiguration_complete(instance_p, target, id_source, id_target);
+
}
@@ -594,6 +638,10 @@ void *x2ap_task(void *arg) {
LOG_I(X2AP, "Received elements for X2AP_ENDC_SGNB_ADDITION_REQ_ACK \n");
break;
+ case X2AP_ENDC_SGNB_RECONF_COMPLETE:
+ x2ap_eNB_trigger_sgnb_reconfiguration_complete(ITTI_MESSAGE_GET_INSTANCE(received_msg),
+ &X2AP_ENDC_SGNB_RECONF_COMPLETE(received_msg));
+ break;
case SCTP_INIT_MSG_MULTI_CNF:
x2ap_eNB_handle_sctp_init_msg_multi_cnf(ITTI_MESSAGE_GET_INSTANCE(received_msg),
&received_msg->ittiMsg.sctp_init_msg_multi_cnf);
diff --git a/openair2/X2AP/x2ap_eNB_decoder.c b/openair2/X2AP/x2ap_eNB_decoder.c
index 93b82c2765..3762bc06dc 100644
--- a/openair2/X2AP/x2ap_eNB_decoder.c
+++ b/openair2/X2AP/x2ap_eNB_decoder.c
@@ -144,9 +144,9 @@ int x2ap_eNB_decode_pdu(X2AP_X2AP_PDU_t *pdu, const uint8_t *const buffer, uint3
length,
0,
0);
- //if (asn1_xer_print) {
+ if (asn1_xer_print) {
xer_fprint(stdout, &asn_DEF_X2AP_X2AP_PDU, pdu);
- //}
+ }
if (dec_ret.code != RC_OK) {
X2AP_ERROR("Failed to decode pdu\n");
diff --git a/openair2/X2AP/x2ap_eNB_generate_messages.c b/openair2/X2AP/x2ap_eNB_generate_messages.c
index 0478448070..a96fa14f48 100644
--- a/openair2/X2AP/x2ap_eNB_generate_messages.c
+++ b/openair2/X2AP/x2ap_eNB_generate_messages.c
@@ -1496,7 +1496,8 @@ int x2ap_eNB_generate_ENDC_x2_setup_response(
}
int x2ap_eNB_generate_ENDC_x2_SgNB_addition_request(
- x2ap_eNB_instance_t *instance_p, x2ap_ENDC_sgnb_addition_req_t *x2ap_ENDC_sgnb_addition_req, x2ap_eNB_data_t *x2ap_eNB_data_p, int ue_id)
+ x2ap_eNB_instance_t *instance_p, x2ap_ENDC_sgnb_addition_req_t *x2ap_ENDC_sgnb_addition_req,
+ x2ap_eNB_data_t *x2ap_eNB_data_p, int ue_id)
{
X2AP_X2AP_PDU_t pdu;
X2AP_SgNBAdditionRequest_t *out;
@@ -1507,42 +1508,21 @@ int x2ap_eNB_generate_ENDC_x2_SgNB_addition_request(
uint8_t *buffer;
uint32_t len;
int ret = 0;
-
- // Currently hardcoded (dummy) values filling the fields of SgNB_addition_request message. To be substituted
- // with values coming from RRC.
- uint16_t nRencryptionAlgorithms = 0;
- uint16_t nRintegrityProtectionAlgorithms = 0;
+ uint16_t nRencryptionAlgorithms = x2ap_ENDC_sgnb_addition_req->security_capabilities.encryption_algorithms;
+ uint16_t nRintegrityProtectionAlgorithms = x2ap_ENDC_sgnb_addition_req->security_capabilities
+ .integrity_algorithms;
uint8_t SgNBSecurityKey[32] = { 0 };
- int uEaggregateMaximumBitRateDownlink = 100000000;
- int uEaggregateMaximumBitRateUplink = 100000000;
- int e_rabs_tobeadded = 1;
+ int uEaggregateMaximumBitRateDownlink = x2ap_ENDC_sgnb_addition_req->ue_ambr.br_dl;
+ int uEaggregateMaximumBitRateUplink = x2ap_ENDC_sgnb_addition_req->ue_ambr.br_ul;
+ int e_rabs_tobeadded = x2ap_ENDC_sgnb_addition_req->nb_e_rabs_tobeadded;
long int pDCPatSgNB = X2AP_EN_DC_ResourceConfiguration__pDCPatSgNB_present;
long int mCGresources = X2AP_EN_DC_ResourceConfiguration__mCGresources_not_present;
long int sCGresources = X2AP_EN_DC_ResourceConfiguration__sCGresources_not_present;
- long qCI = 1;
- X2AP_Pre_emptionCapability_t pre_emptionCapability = X2AP_Pre_emptionCapability_shall_not_trigger_pre_emption;
- X2AP_Pre_emptionVulnerability_t pre_emptionVulnerability = X2AP_Pre_emptionVulnerability_not_pre_emptable;
- priority_level_t priority_level = PRIORITY_LEVEL_NO_PRIORITY;
- e_rab_tobe_added_t e_MCG_rabs_tobeadded;
- e_MCG_rabs_tobeadded.gtp_teid = 0;
- e_MCG_rabs_tobeadded.sgw_addr.length = 24;
- uint8_t buf[20] = { 0 };
- memcpy(e_MCG_rabs_tobeadded.sgw_addr.buffer, buf, 20*sizeof(uint8_t));
-
- FILE *fd;
- fd = fopen("../../../executables/uecap.raw","r");
- if (fd != NULL) {
- OCTET_STRING_t CG_Config_Info;
- CG_Config_Info.size = 4096;
- CG_Config_Info.buf = (uint8_t *)calloc(4096, sizeof(uint8_t));
- int msg_len=fread(CG_Config_Info.buf,1,CG_Config_Info.size,fd);
- CG_Config_Info.size = msg_len;
-
- /*char buffer[4096];
- int msg_len=fread(buffer,1,4096,fd);*/
- LOG_I(RRC,"Read in %d bytes for uecap\n",msg_len);
-
-
+ long qCI = 0;
+ X2AP_Pre_emptionCapability_t pre_emptionCapability;
+ X2AP_Pre_emptionVulnerability_t pre_emptionVulnerability;
+ priority_level_t priority_level;
+ memcpy(SgNBSecurityKey, x2ap_ENDC_sgnb_addition_req->kgnb, sizeof(x2ap_ENDC_sgnb_addition_req->kgnb));
/*OCTET_STRING_t CG_Config_Info;
CG_Config_Info.size = 4096;
CG_Config_Info.buf = (uint8_t *)calloc(4096, sizeof(uint8_t));*/
@@ -1618,7 +1598,11 @@ int x2ap_eNB_generate_ENDC_x2_SgNB_addition_request(
e_RABS_ToBeAdded_SgNBAddReq_Item->en_DC_ResourceConfiguration.mCGresources = mCGresources;
e_RABS_ToBeAdded_SgNBAddReq_Item->en_DC_ResourceConfiguration.sCGresources = sCGresources;
if (pDCPatSgNB == X2AP_EN_DC_ResourceConfiguration__pDCPatSgNB_present){
- e_RABS_ToBeAdded_SgNBAddReq_Item->resource_configuration.present = X2AP_E_RABs_ToBeAdded_SgNBAddReq_Item__resource_configuration_PR_sgNBPDCPpresent;
+ e_RABS_ToBeAdded_SgNBAddReq_Item->resource_configuration.present = X2AP_E_RABs_ToBeAdded_SgNBAddReq_Item__resource_configuration_PR_sgNBPDCPpresent;
+ qCI = x2ap_ENDC_sgnb_addition_req->e_rab_param[i].qos.qci;
+ priority_level = x2ap_ENDC_sgnb_addition_req->e_rab_param[i].qos.allocation_retention_priority.priority_level;
+ pre_emptionCapability = x2ap_ENDC_sgnb_addition_req->e_rab_param[i].qos.allocation_retention_priority.pre_emp_capability;
+ pre_emptionVulnerability = x2ap_ENDC_sgnb_addition_req->e_rab_param[i].qos.allocation_retention_priority.pre_emp_vulnerability;
e_RABS_ToBeAdded_SgNBAddReq_Item->resource_configuration.choice.sgNBPDCPpresent.full_E_RAB_Level_QoS_Parameters.qCI = qCI;
e_RABS_ToBeAdded_SgNBAddReq_Item->resource_configuration.choice.sgNBPDCPpresent.full_E_RAB_Level_QoS_Parameters.allocationAndRetentionPriority.pre_emptionCapability = pre_emptionCapability;
@@ -1646,25 +1630,24 @@ int x2ap_eNB_generate_ENDC_x2_SgNB_addition_request(
ie->id = X2AP_ProtocolIE_ID_id_MeNBtoSgNBContainer;
ie->criticality = X2AP_Criticality_reject;
ie->value.present = X2AP_SgNBAdditionRequest_IEs__value_PR_MeNBtoSgNBContainer;
- ie->value.choice.MeNBtoSgNBContainer.buf = (uint8_t *)calloc(CG_Config_Info.size, sizeof(uint8_t));
- memcpy(ie->value.choice.MeNBtoSgNBContainer.buf, CG_Config_Info.buf, CG_Config_Info.size);
- ie->value.choice.MeNBtoSgNBContainer.size = CG_Config_Info.size; //4096;
+ if(NULL == (ie->value.choice.MeNBtoSgNBContainer.buf = (uint8_t *)
+ calloc(x2ap_ENDC_sgnb_addition_req->rrc_buffer_size, sizeof(uint8_t)))) {
+ X2AP_ERROR("Memory ALLocation failed\n");
+ exit(1);
+ }
+ memcpy(ie->value.choice.MeNBtoSgNBContainer.buf, x2ap_ENDC_sgnb_addition_req->rrc_buffer,
+ x2ap_ENDC_sgnb_addition_req->rrc_buffer_size);
+ ie->value.choice.MeNBtoSgNBContainer.size = x2ap_ENDC_sgnb_addition_req->rrc_buffer_size;
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
if (x2ap_eNB_encode_pdu(&pdu, &buffer, &len) < 0) {
X2AP_ERROR("Failed to encode ENDC X2 SgNB_addition request message\n");
return -1;
}
-
+ free(ie->value.choice.MeNBtoSgNBContainer.buf);
MSC_LOG_TX_MESSAGE (MSC_X2AP_SRC_ENB, MSC_X2AP_TARGET_ENB, NULL, 0, "0 X2Setup/initiatingMessage assoc_id %u", x2ap_eNB_data_p->assoc_id);
x2ap_eNB_itti_send_sctp_data_req(instance_p->instance, x2ap_eNB_data_p->assoc_id, buffer, len, 0);
- fclose(fd);
- }
- else {
- LOG_I(RRC, "uecap.raw file could not be opened... \n");
- return -1;
- }
return ret;
@@ -1684,26 +1667,14 @@ int x2ap_gNB_generate_ENDC_x2_SgNB_addition_request_ACK( x2ap_eNB_instance_t *in
uint8_t *buffer;
uint32_t len;
int ret = 0;
- int MeNB_UE_X2AP_id = ue_id;
- int SgNB_UE_X2AP_id = 0;
- // Currently hardcoded (dummy) values filling the fields of SgNB_addition_request message. To be substituted
- // with values coming from RRC.
- //uint16_t nRencryptionAlgorithms = 0;
- //uint16_t nRintegrityProtectionAlgorithms = 0;
- //uint8_t SgNBSecurityKey[32] = { 0 };
- //int uEaggregateMaximumBitRateDownlink = 100000000;
- //int uEaggregateMaximumBitRateUplink = 100000000;
-
- int e_rabs_admitted_tobeadded = 1;
+ int MeNB_UE_X2AP_id = x2ap_sgnb_addition_req_ACK->MeNB_ue_x2_id;
+ int SgNB_UE_X2AP_id = ue_id;
+ int e_rabs_admitted_tobeadded = x2ap_sgnb_addition_req_ACK->nb_e_rabs_admitted_tobeadded;
long int pDCPatSgNB = X2AP_EN_DC_ResourceConfiguration__pDCPatSgNB_present;
long int mCGresources = X2AP_EN_DC_ResourceConfiguration__mCGresources_not_present;
long int sCGresources = X2AP_EN_DC_ResourceConfiguration__sCGresources_not_present;
- e_rab_setup_t e_SCG_rabs_tobeadded;
- e_SCG_rabs_tobeadded.gtp_teid = 0;
- e_SCG_rabs_tobeadded.eNB_addr.length = 24;
- uint8_t buf[20] = { 0 };
- memcpy(e_SCG_rabs_tobeadded.eNB_addr.buffer, buf, 20*sizeof(uint8_t));
+
DevAssert(instance_p != NULL);
DevAssert(x2ap_eNB_data_p != NULL);
diff --git a/openair2/X2AP/x2ap_eNB_handler.c b/openair2/X2AP/x2ap_eNB_handler.c
index 792982100b..1c6c98cd81 100644
--- a/openair2/X2AP/x2ap_eNB_handler.c
+++ b/openair2/X2AP/x2ap_eNB_handler.c
@@ -1652,7 +1652,6 @@ int x2ap_gNB_handle_ENDC_sGNB_addition_request (instance_t instance,
x2ap_eNB_instance_t *instance_p;
x2ap_eNB_data_t *x2ap_eNB_data;
MessageDef *msg;
- int ue_id;
DevAssert (pdu != NULL);
x2SgNBAdditionRequest = &pdu->choice.initiatingMessage.value.choice.SgNBAdditionRequest;
@@ -1683,20 +1682,9 @@ int x2ap_gNB_handle_ENDC_sGNB_addition_request (instance_t instance,
X2AP_ERROR("%s %d: ie is a NULL pointer \n",__FILE__,__LINE__);
return -1;
}
-
-
- // allocate a new X2AP UE ID
- ue_id = x2ap_allocate_new_id(&instance_p->id_manager);
- if (ue_id == -1) {
- X2AP_ERROR("could not allocate a new X2AP UE ID\n");
- // TODO: cancel handover: send HO preparation failure to source eNB
- exit(1);
- }
- // rnti is unknown yet, must not be set to -1, 0 is fine
- x2ap_set_ids(&instance_p->id_manager, ue_id, 0, ie->value.choice.UE_X2AP_ID, ue_id);
- x2ap_id_set_state(&instance_p->id_manager, ue_id, X2ID_STATE_TARGET);
-
- X2AP_ENDC_SGNB_ADDITION_REQ(msg).ue_x2_id = ue_id;
+ /* ue_x2_id = MeNB X2AP Id */
+ X2AP_ENDC_SGNB_ADDITION_REQ(msg).ue_x2_id = ie->value.choice.UE_X2AP_ID;
+ X2AP_ENDC_SGNB_ADDITION_REQ(msg).target_assoc_id = assoc_id;
/* X2AP_ProtocolIE_ID_id_NRUESecurityCapabilities */
diff --git a/openair3/S1AP/s1ap_eNB_encoder.c b/openair3/S1AP/s1ap_eNB_encoder.c
index 86536ac525..227a3cb6a9 100644
--- a/openair3/S1AP/s1ap_eNB_encoder.c
+++ b/openair3/S1AP/s1ap_eNB_encoder.c
@@ -129,9 +129,9 @@ int s1ap_eNB_encode_initiating(S1AP_S1AP_PDU_t *pdu,
return -1;
}
- //if (asn1_xer_print) {
+ if (asn1_xer_print) {
xer_fprint(stdout, &asn_DEF_S1AP_S1AP_PDU, (void *)pdu);
- //}
+ }
memset(&res, 0, sizeof(res));
res = asn_encode_to_new_buffer(NULL, ATS_ALIGNED_CANONICAL_PER, &asn_DEF_S1AP_S1AP_PDU, pdu);
diff --git a/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c b/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c
index c4e593ca92..af5ab5ad6d 100644
--- a/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c
+++ b/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c
@@ -330,7 +330,10 @@ int trx_brf_set_gains(openair0_device* device,
{
return(0);
}
-
+int trx_brf_write_init(openair0_device *device)
+{
+ return 0;
+}
#define RXDCLENGTH 16384
int16_t cos_fsover8[8] = {2047, 1447, 0, -1448, -2047, -1448, 0, 1447};
@@ -1145,6 +1148,7 @@ int device_init(openair0_device *device,
device->trx_stop_func = trx_brf_stop;
device->trx_set_freq_func = trx_brf_set_freq;
device->trx_set_gains_func = trx_brf_set_gains;
+ device->trx_write_init = trx_brf_write_init;
device->openair0_cfg = openair0_cfg;
device->priv = (void *)brf;
diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c
index c5822a3650..c72e7d4130 100644
--- a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c
+++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c
@@ -197,6 +197,10 @@ int trx_eth_reset_stats(openair0_device* device)
return(0);
}
+int trx_eth_write_init(openair0_device *device)
+{
+ return 0;
+}
int ethernet_tune(openair0_device *device,
unsigned int option,
@@ -415,8 +419,9 @@ int transport_init(openair0_device *device,
device->trx_reset_stats_func = trx_eth_reset_stats;
device->trx_end_func = trx_eth_end;
device->trx_stop_func = trx_eth_stop;
- device->trx_set_freq_func = trx_eth_set_freq;
- device->trx_set_gains_func = trx_eth_set_gains;
+ device->trx_set_freq_func = trx_eth_set_freq;
+ device->trx_set_gains_func = trx_eth_set_gains;
+ device->trx_write_init = trx_eth_write_init;
if (eth->flags == ETH_RAW_MODE) {
device->trx_write_func = trx_eth_write_raw;
diff --git a/targets/ARCH/IRIS/USERSPACE/LIB/iris_lib.cpp b/targets/ARCH/IRIS/USERSPACE/LIB/iris_lib.cpp
index 5b20d8a8c7..1273097f3b 100644
--- a/targets/ARCH/IRIS/USERSPACE/LIB/iris_lib.cpp
+++ b/targets/ARCH/IRIS/USERSPACE/LIB/iris_lib.cpp
@@ -510,6 +510,11 @@ int trx_iris_reset_stats(openair0_device *device) {
}
+int trx_iris_write_init(openair0_device *device)
+{
+ return 0;
+}
+
extern "C" {
/*! \brief Initialize Openair Iris target. It returns 0 if OK
@@ -831,6 +836,7 @@ int device_init(openair0_device *device, openair0_config_t *openair0_cfg) {
device->trx_set_freq_func = trx_iris_set_freq;
device->trx_set_gains_func = trx_iris_set_gains;
device->openair0_cfg = openair0_cfg;
+ device->trx_write_init = trx_iris_write_init;
s->sample_rate = openair0_cfg[0].sample_rate;
// TODO:
diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp
index 9fcfbdf571..79a389bfeb 100644
--- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp
+++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp
@@ -350,6 +350,10 @@ void trx_lms_end(openair0_device *device) {
}
+int trx_lms_write_init(openair0_device *device)
+{
+ return 0;
+}
extern "C" {
/*! \brief Initialize Openair LMSSDR target. It returns 0 if OK
* \param device the hardware to use
@@ -406,6 +410,7 @@ int device_init(openair0_device *device, openair0_config_t *openair0_cfg){
device->trx_stop_func = trx_lms_stop;
device->trx_set_freq_func = trx_lms_set_freq;
device->trx_set_gains_func = trx_lms_set_gains;
+ device->trx_write_init = trx_lms_write_init;
device->openair0_cfg = openair0_cfg;
diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
index 08f0cd720b..62f77699a4 100644
--- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
+++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
@@ -70,6 +70,8 @@
* @{
*/
+extern int usrp_tx_thread;
+
typedef struct {
@@ -345,7 +347,6 @@ static int trx_usrp_write(openair0_device *device,
int flags_msb = (flags>>8)&0xff;
int end;
- int write_tread = 0;
openair0_thread_t *write_thread = &device->write_thread;
openair0_write_package_t *write_package = write_thread->write_package;
@@ -382,7 +383,7 @@ static int trx_usrp_write(openair0_device *device,
last_packet_state = true;
}
- if(write_tread == 0){
+ if(usrp_tx_thread == 0){
#if defined(__x86_64) || defined(__i386__)
#ifdef __AVX2__
nsamps2 = (nsamps+7)>>3;
@@ -586,7 +587,7 @@ void *trx_usrp_write_thread(void * arg){
return NULL;
}
-int trx_write_init(openair0_device *device){
+int trx_usrp_write_init(openair0_device *device){
uhd::set_thread_priority_safe(1.0);
openair0_thread_t *write_thread = &device->write_thread;
@@ -932,7 +933,7 @@ extern "C" {
device->trx_stop_func = trx_usrp_stop;
device->trx_set_freq_func = trx_usrp_set_freq;
device->trx_set_gains_func = trx_usrp_set_gains;
- device->trx_write_init = trx_write_init;
+ device->trx_write_init = trx_usrp_write_init;
// hotfix! to be checked later
diff --git a/targets/ARCH/tcp_bridge/tcp_bridge.c b/targets/ARCH/tcp_bridge/tcp_bridge.c
index 8b287acfa1..f8c12dcb7a 100644
--- a/targets/ARCH/tcp_bridge/tcp_bridge.c
+++ b/targets/ARCH/tcp_bridge/tcp_bridge.c
@@ -243,6 +243,11 @@ ts += nsamps;
return nsamps;
}
+int tcp_bridge_write_init(openair0_device *device)
+{
+ return 0;
+}
+
__attribute__((__visibility__("default")))
int device_init(openair0_device* device, openair0_config_t *openair0_cfg)
{
@@ -267,6 +272,7 @@ int device_init(openair0_device* device, openair0_config_t *openair0_cfg)
device->trx_set_gains_func = tcp_bridge_set_gains;
device->trx_write_func = tcp_bridge_write;
device->trx_read_func = tcp_bridge_read;
+ device->trx_write_init = tcp_bridge_write_init;
device->priv = tcp_bridge;
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpx300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpx300.conf
index 688fae9b0f..0b04dc82d1 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpx300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpx300.conf
@@ -33,10 +33,10 @@ gNBs =
# downlinkConfigCommon
#frequencyInfoDL
# this is 3600 MHz + 43 PRBs@30kHz SCS (same as initial BWP)
- absoluteFrequencySSB = 633032;
+ absoluteFrequencySSB = 641032;
dl_frequencyBand = 78;
- # this is 3480 MHz
- dl_absoluteFrequencyPointA = 632000;
+ # this is 3600 MHz
+ dl_absoluteFrequencyPointA = 640000;
#scs-SpecificCarrierList
dl_offstToCarrier = 0;
# subcarrierSpacing
@@ -153,7 +153,7 @@ gNBs =
# ssb_PositionsInBurs_BitmapPR
# 1=short, 2=medium, 3=long
ssb_PositionsInBurst_PR = 2;
- ssb_PositionsInBurst_Bitmap = 255;
+ ssb_PositionsInBurst_Bitmap = 1;
# ssb_periodicityServingCell
# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
@@ -242,7 +242,8 @@ RUs = (
max_pdschReferenceSignalPower = -27;
max_rxgain = 114;
eNB_instances = [0];
- sdr_addrs = "type=x300";
+ sdr_addrs = "type=x300";
+ clock_src = "external";
}
);
diff --git a/targets/RT/USER/lte-ru.c b/targets/RT/USER/lte-ru.c
index d2e734f205..4d89020077 100644
--- a/targets/RT/USER/lte-ru.c
+++ b/targets/RT/USER/lte-ru.c
@@ -679,7 +679,11 @@ void rx_rf(RU_t *ru,
resynch=1;
}
- proc->timestamp_rx = ts-ru->ts_offset;
+ if(get_softmodem_params()->emulate_rf) {
+ proc->timestamp_rx = old_ts + fp->samples_per_tti;
+ } else {
+ proc->timestamp_rx = ts-ru->ts_offset;
+ }
// AssertFatal(rxs == fp->samples_per_tti,
// "rx_rf: Asked for %d samples, got %d from SDR\n",fp->samples_per_tti,rxs);
@@ -2337,19 +2341,22 @@ void init_RU_proc(RU_t *ru) {
LOG_I(PHY,"%s() DJP - added creation of pthread_prach\n", __FUNCTION__);
pthread_create( &proc->pthread_prach, attr_prach, ru_thread_prach, (void *)ru );
ru->state=RU_RUN;
- fill_rf_config(ru,ru->rf_config_file);
- init_frame_parms(ru->frame_parms,1);
- ru->frame_parms->nb_antennas_rx = ru->nb_rx;
- phy_init_RU(ru);
- ret = openair0_device_load(&ru->rfdevice,&ru->openair0_cfg);
- if (ret < 0) {
- LOG_I(PHY,"Exiting, cannot load device. Make sure that your SDR board is connected!\n");
- exit(1);
- }
+ if(!get_softmodem_params()->emulate_rf)
+ {
+ fill_rf_config(ru,ru->rf_config_file);
+ init_frame_parms(ru->frame_parms,1);
+ ru->frame_parms->nb_antennas_rx = ru->nb_rx;
+ phy_init_RU(ru);
+ ret = openair0_device_load(&ru->rfdevice,&ru->openair0_cfg);
+ if (ret < 0) {
+ LOG_I(PHY,"Exiting, cannot load device. Make sure that your SDR board is connected!\n");
+ exit(1);
+ }
- if (setup_RU_buffers(ru)!=0) {
- LOG_I(PHY,"Exiting, cannot initialize RU Buffers\n");
- exit(1);
+ if (setup_RU_buffers(ru)!=0) {
+ LOG_I(PHY,"Exiting, cannot initialize RU Buffers\n");
+ exit(1);
+ }
}
}
diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c
index d8c5e25593..4715a4e995 100644
--- a/targets/RT/USER/lte-softmodem.c
+++ b/targets/RT/USER/lte-softmodem.c
@@ -170,6 +170,7 @@ extern void init_eNB_afterRU(void);
int transmission_mode=1;
int emulate_rf = 0;
int numerology = 0;
+int usrp_tx_thread = 0;
THREAD_STRUCT thread_struct;
/* struct for ethernet specific parameters given in eNB conf file */
@@ -659,6 +660,7 @@ int main ( int argc, char **argv )
initTpool("n", L1proc->threadPool, true);
initNotifiedFIFO(L1proc->respEncode);
initNotifiedFIFO(L1proc->respDecode);
+ RC.eNB[x][CC_id]->proc.L1_proc_tx.threadPool = L1proc->threadPool;
}
diff --git a/targets/RT/USER/lte-softmodem.h b/targets/RT/USER/lte-softmodem.h
index c5fdb5f546..1c537dabe3 100644
--- a/targets/RT/USER/lte-softmodem.h
+++ b/targets/RT/USER/lte-softmodem.h
@@ -155,6 +155,10 @@ extern int sync_var;
extern int transmission_mode;
extern double cpuf;
+extern int emulate_rf;
+extern int numerology;
+extern int usrp_tx_thread;
+
// In lte-enb.c
extern void stop_eNB(int);
extern void kill_eNB_proc(int inst);
diff --git a/targets/RT/USER/lte-uesoftmodem.c b/targets/RT/USER/lte-uesoftmodem.c
index 2c9271888b..a45ecd2298 100644
--- a/targets/RT/USER/lte-uesoftmodem.c
+++ b/targets/RT/USER/lte-uesoftmodem.c
@@ -171,6 +171,8 @@ extern void get_uethreads_params(void);
int transmission_mode=1;
+int usrp_tx_thread = 0;
+
char *usrp_args=NULL;
char *usrp_clksrc=NULL;