Merge branch 'NR_RRC_harq_hacks' of https://gitlab.eurecom.fr/oai/openairinterface5g into NR_RRC_harq_hacks
This commit is contained in:
@@ -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 = '<pre style="background-color:white">' + info + '</pre>'
|
||||
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_<testcase_id>.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
|
||||
@@ -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.**
|
||||
|
||||
|
||||
+33
-2
@@ -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
|
||||
|
||||
+1
-1
@@ -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()
|
||||
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
<htmlTabRef>test-05-tm1-rrc-no-flex</htmlTabRef>
|
||||
<htmlTabName>Test-05MHz-TM1-RRC-Inactivity</htmlTabName>
|
||||
<htmlTabIcon>tasks</htmlTabIcon>
|
||||
<repeatCount>2</repeatCount>
|
||||
<TestCaseRequestedList>
|
||||
030201
|
||||
040101
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
<htmlTabRef>test-10</htmlTabRef>
|
||||
<htmlTabName>Test-10MHz</htmlTabName>
|
||||
<htmlTabIcon>tasks</htmlTabIcon>
|
||||
<repeatCount>2</repeatCount>
|
||||
<TestCaseRequestedList>
|
||||
030201
|
||||
040101
|
||||
|
||||
@@ -0,0 +1,161 @@
|
||||
<!--
|
||||
|
||||
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
|
||||
|
||||
030105 040301 040502 040606 040601 040603 040608 040605 040646 040641 040643 040648 040645 040401 040201 030201
|
||||
-->
|
||||
<testCaseList>
|
||||
<htmlTabRef>test-ldpc-gpu</htmlTabRef>
|
||||
<htmlTabName>Test-ldpc-GPU</htmlTabName>
|
||||
<htmlTabIcon>tasks</htmlTabIcon>
|
||||
<repeatCount>1</repeatCount>
|
||||
<TestCaseRequestedList>000001 000002 000003 000004 000005 000006 000007 000008 000009 000010 000011 000012 000013 000014 000015 000016 000017 000018 000019 000020 000021</TestCaseRequestedList>
|
||||
<TestCaseExclusionList></TestCaseExclusionList>
|
||||
|
||||
<testCase id="000001">
|
||||
<class>Build_PhySim</class>
|
||||
<desc>Build for physical simulator</desc>
|
||||
<physim_build_args>--phy_simulators --ninja</physim_build_args>
|
||||
<forced_workspace_cleanup>FALSE</forced_workspace_cleanup>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000002">
|
||||
<class>Run_PhySim</class>
|
||||
<desc>Run LDPC Test with CPU</desc>
|
||||
<physim_run_args>-l 3872 -s10 -n100</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000003">
|
||||
<class>Run_PhySim</class>
|
||||
<desc>Run LDPC Test with GPU</desc>
|
||||
<physim_run_args>-l 3872 -s10 -n100 -G 1</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000004">
|
||||
<class>Run_PhySim</class>
|
||||
<desc>Run LDPC Test with CPU</desc>
|
||||
<physim_run_args>-l 4224 -s10 -n100</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000005">
|
||||
<class>Run_PhySim</class>
|
||||
<desc>Run LDPC Test with GPU</desc>
|
||||
<physim_run_args>-l 4224 -s10 -n100 -G 1</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000006">
|
||||
<class>Run_PhySim</class>
|
||||
<desc>Run LDPC Test with CPU</desc>
|
||||
<physim_run_args>-l 4576 -s10 -n100</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000007">
|
||||
<class>Run_PhySim</class>
|
||||
<desc>Run LDPC Test with GPU</desc>
|
||||
<physim_run_args>-l 4576 -s10 -n100 -G 1</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000008">
|
||||
<class>Run_PhySim</class>
|
||||
<desc>Run LDPC Test with CPU</desc>
|
||||
<physim_run_args>-l 4928 -s10 -n100</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000009">
|
||||
<class>Run_PhySim</class>
|
||||
<desc>Run LDPC Test with GPU</desc>
|
||||
<physim_run_args>-l 4928 -s10 -n100 -G 1</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000010">
|
||||
<class>Run_PhySim</class>
|
||||
<desc>Run LDPC Test with CPU</desc>
|
||||
<physim_run_args>-l 5280 -s10 -n100</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000011">
|
||||
<class>Run_PhySim</class>
|
||||
<desc>Run LDPC Test with GPU</desc>
|
||||
<physim_run_args>-l 5280 -s10 -n100 -G 1</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000012">
|
||||
<class>Run_PhySim</class>
|
||||
<desc>Run LDPC Test with CPU</desc>
|
||||
<physim_run_args>-l 5632 -s10 -n100</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000013">
|
||||
<class>Run_PhySim</class>
|
||||
<desc>Run LDPC Test with GPU</desc>
|
||||
<physim_run_args>-l 5632 -s10 -n100 -G 1</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000014">
|
||||
<class>Run_PhySim</class>
|
||||
<desc>Run LDPC Test with CPU</desc>
|
||||
<physim_run_args>-l 6336 -s10 -n100</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000015">
|
||||
<class>Run_PhySim</class>
|
||||
<desc>Run LDPC Test with GPU</desc>
|
||||
<physim_run_args>-l 6336 -s10 -n100 -G 1</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000016">
|
||||
<class>Run_PhySim</class>
|
||||
<desc>Run LDPC Test with CPU</desc>
|
||||
<physim_run_args>-l 7040 -s10 -n100</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000017">
|
||||
<class>Run_PhySim</class>
|
||||
<desc>Run LDPC Test with GPU</desc>
|
||||
<physim_run_args>-l 7040 -s10 -n100 -G 1</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000018">
|
||||
<class>Run_PhySim</class>
|
||||
<desc>Run LDPC Test with CPU</desc>
|
||||
<physim_run_args>-l 7744 -s10 -n100</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000019">
|
||||
<class>Run_PhySim</class>
|
||||
<desc>Run LDPC Test with GPU</desc>
|
||||
<physim_run_args>-l 7744 -s10 -n100 -G 1</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000020">
|
||||
<class>Run_PhySim</class>
|
||||
<desc>Run LDPC Test with CPU</desc>
|
||||
<physim_run_args>-l 8448 -s10 -n100</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000021">
|
||||
<class>Run_PhySim</class>
|
||||
<desc>Run LDPC Test with GPU</desc>
|
||||
<physim_run_args>-l 8448 -s10 -n100 -G 1</physim_run_args>
|
||||
</testCase>
|
||||
|
||||
|
||||
|
||||
</testCaseList>
|
||||
@@ -1116,7 +1116,7 @@
|
||||
-n100 -s1 -t33
|
||||
-n100 -s1 -t50
|
||||
</main_exec_args>
|
||||
<tags>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 </tags>
|
||||
<tags>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</tags>
|
||||
<search_expr_true>PDSCH test OK</search_expr_true>
|
||||
<search_expr_false>segmentation fault|assertion|exiting|fatal</search_expr_false>
|
||||
<nruns>3</nruns>
|
||||
@@ -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
|
||||
</main_exec_args>
|
||||
-R 106 -i 1 -P 2 -q16 -b 64 -s-3 -n1000</main_exec_args>
|
||||
<tags>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</tags>
|
||||
<search_expr_true>PUCCH test OK</search_expr_true>
|
||||
<search_expr_false>segmentation fault|assertion|exiting|fatal</search_expr_false>
|
||||
|
||||
@@ -959,6 +959,7 @@ function main() {
|
||||
wait
|
||||
else
|
||||
echo_info "10. Bypassing the Tests ..."
|
||||
echo_success "BUILD SHOULD BE SUCCESSFUL"
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
+9
-6
@@ -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");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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}, \
|
||||
}
|
||||
|
||||
|
||||
@@ -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];
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
+269
-365
@@ -26,6 +26,7 @@
|
||||
#include <stdlib.h>
|
||||
#include "nr_phy_scope.h"
|
||||
#include "executables/nr-softmodem-common.h"
|
||||
#include <forms.h>
|
||||
|
||||
#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; k<len; k++) {
|
||||
maxX=max(maxX,x[k]);
|
||||
minX=min(minX,x[k]);
|
||||
maxY=max(maxY,y[k]);
|
||||
minY=min(minY,y[k]);
|
||||
}
|
||||
|
||||
setRange(graph,minX,maxX, minY, maxY);
|
||||
}
|
||||
|
||||
graph->iteration++;
|
||||
}
|
||||
|
||||
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; ant<nb_ant; ant++) {
|
||||
if (data[ant] != NULL) {
|
||||
for (int i=0; i<len; i+=8) {
|
||||
float *vals=values+i;
|
||||
float *tim=time+i;
|
||||
const scopeSample_t *in=&(data[ant][i]);
|
||||
|
||||
for (int k=0; k<8; k++ ) {
|
||||
vals[k] = 10*log10(1.0+SquaredNorm(in[k]));
|
||||
tim[k] = i+k;
|
||||
}
|
||||
}
|
||||
|
||||
oai_xygraph(graph,time,values, len, ant, 10);
|
||||
}
|
||||
}
|
||||
|
||||
free(values);
|
||||
free(time);
|
||||
}
|
||||
|
||||
static void genericPowerPerAntena(OAIgraph_t *graph, const int nb_ant, const scopeSample_t **data, const int len) {
|
||||
float values[len];
|
||||
float time[len];
|
||||
|
||||
for (int ant=0; ant<nb_ant; ant++) {
|
||||
if (data[ant] != NULL) {
|
||||
for (int i=0; i<len; i++) {
|
||||
values[i] = SquaredNorm(data[ant][i]);
|
||||
time[i] = i;
|
||||
}
|
||||
|
||||
oai_xygraph(graph,time,values, len, ant, 10);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void timeSignal (OAIgraph_t *graph, PHY_VARS_gNB *phy_vars_gnb, RU_t *phy_vars_ru, const int nb_UEs) {
|
||||
// Received signal in time domain of receive antenna 0
|
||||
if (!phy_vars_ru->common.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; arx<nb_antennas_rx; arx++) {
|
||||
if (rxsig_t[arx] != NULL) {
|
||||
for (int i=0; i<frame_parms->samples_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; ue<nb_UEs; ue++) {
|
||||
scopeSample_t *data= (scopeSample_t *)phy_vars_gnb->pusch_vars[ue]->ul_ch_estimates_time[ant];
|
||||
|
||||
if (data != NULL) {
|
||||
for (int i=0; i<len; i++) {
|
||||
values[i] = SquaredNorm(data[i]);
|
||||
time[i] = i;
|
||||
}
|
||||
|
||||
if (arx==0)
|
||||
fl_set_xyplot_data(graph,time,rxsig_t_dB, frame_parms->samples_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; arx<nb_antennas_rx; arx++) {
|
||||
if (chest_t[arx] !=NULL) {
|
||||
for (int i=0; i<(2*frame_parms->ofdm_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; i<frame_parms->samples_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; arx<nb_antennas_rx; arx++) {
|
||||
if (chest_f[(atx<<1)+arx] != NULL) {
|
||||
for (int k=0; k<nsymb_ce; k++) {
|
||||
time[k] = (float)ind;
|
||||
chest_f_abs[k] = (short)10*log10(1.0+SquaredNorm(chest_f[(atx<<1)+arx][k]));
|
||||
ind++;
|
||||
}
|
||||
fl_add_xyplot_overlay(form->chest_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; i<coded_bits_per_codeword; i++) {
|
||||
llr[i] = (float) pusch_llr[i];
|
||||
bit[i] = (float) i;
|
||||
}
|
||||
for (int ue=0; ue<nb_UEs; ue++) {
|
||||
int16_t *pusch_llr = (int16_t *)phy_vars_gnb->pusch_vars[ue]->llr;
|
||||
|
||||
fl_set_xyplot_data(graph,bit,llr,coded_bits_per_codeword,"","","");
|
||||
if (pusch_llr) {
|
||||
for (int i=0; i<coded_bits_per_codeword; i++) {
|
||||
llr[i] = (float) pusch_llr[i];
|
||||
bit[i] = (float) i;
|
||||
}
|
||||
|
||||
oai_xygraph(graph,bit,llr,coded_bits_per_codeword,ue,10);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void puschIQ (FL_OBJECT *graph, PHY_VARS_gNB *phy_vars_gnb, RU_t *phy_vars_ru, int UE_id) {
|
||||
// PUSCH I/Q of MF Output
|
||||
if (!phy_vars_gnb->pusch_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; k<sz; k++ ) {
|
||||
I[k] = pusch_comp[k].r;
|
||||
Q[k] = pusch_comp[k].i;
|
||||
for (int ue=0; ue<nb_UEs; ue++) {
|
||||
scopeSample_t *pusch_comp = (scopeSample_t *) phy_vars_gnb->pusch_vars[ue]->rxdataF_comp[0];
|
||||
|
||||
if (pusch_comp) {
|
||||
for (int k=0; k<sz; k++ ) {
|
||||
I[k] = pusch_comp[k].r;
|
||||
Q[k] = pusch_comp[k].i;
|
||||
}
|
||||
|
||||
oai_xygraph(graph,I,Q,sz,ue,10);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fl_set_xyplot_data(graph,I,Q,sz,"","","");
|
||||
|
||||
static void pucchEnergy (OAIgraph_t *graph, PHY_VARS_gNB *phy_vars_gnb, RU_t *phy_vars_ru, int nb_UEs) {
|
||||
// PUSCH I/Q of MF Output
|
||||
// Code to fixed, disabled for cppcheck
|
||||
#if 0
|
||||
if (NULL) {
|
||||
/*
|
||||
int32_t *pucch1ab_comp = (int32_t *) NULL; //phy_vars_gnb->pucch1ab_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_id<NUMBER_OF_UE_MAX; UE_id++) {
|
||||
if ((ue_cnt<scope_enb_num_ue)) {
|
||||
//this function needs to be written
|
||||
phy_scope_gNB(form_gnb[ue_cnt], p->gNB, 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_id<scope_enb_num_ue; UE_id++) {
|
||||
form_gnb[UE_id] = create_phy_scope_gnb(UE_id);
|
||||
} // UE_id
|
||||
|
||||
static scopeParms_t parms;
|
||||
memcpy(&parms,p,sizeof(parms));
|
||||
pthread_t forms_thread;
|
||||
threadCreate(&forms_thread, scope_thread_gNB, &parms, "scope", -1, OAI_PRIORITY_RT_LOW);
|
||||
}
|
||||
|
||||
static void ueTimeResponse (FL_OBJECT *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) {
|
||||
static void ueTimeResponse (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) {
|
||||
// Received signal in time domain of receive antenna 0
|
||||
if (! phy_vars_ue->common_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; i<samples_per_frame; i++) {
|
||||
rxsig_t_dB[i] = 10*log10(1.0+SquaredNorm(rxsig_t[0][i]));
|
||||
time[i] = (float) i;
|
||||
}
|
||||
|
||||
fl_set_xyplot_data(graph,time,rxsig_t_dB,samples_per_frame,"","","");
|
||||
}
|
||||
|
||||
for (int arx=1; arx<nb_antennas_rx; arx++) {
|
||||
if (rxsig_t[arx] != NULL) {
|
||||
for (int i=0; i<FRAME_LENGTH_COMPLEX_SAMPLES; i++) {
|
||||
rxsig_t_dB[i] = 10*log10(1.0+SquaredNorm(rxsig_t[arx][i]));
|
||||
}
|
||||
|
||||
fl_add_xyplot_overlay(graph,arx,time,rxsig_t_dB,FRAME_LENGTH_COMPLEX_SAMPLES,rx_antenna_colors[arx]);
|
||||
}
|
||||
}
|
||||
|
||||
if (phy_vars_ue->is_synchronized==0) {
|
||||
//float corr[samples_per_frame];
|
||||
for (int ind=0; ind<3; ind++) {
|
||||
/*
|
||||
if (pss_corr_ue[ind]) {
|
||||
for (i=0; i<samples_per_frame; i++) {
|
||||
corr[i] = (float) pss_corr_ue[ind][i];
|
||||
time[i] = (float) i;
|
||||
}
|
||||
|
||||
if (ind==0)
|
||||
fl_set_xyplot_data(form->chest_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; arx<nb_antennas_rx; arx++) {
|
||||
if (chest_t[arx] !=NULL) {
|
||||
for (int i=0; i<(frame_parms->ofdm_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; i<nb_re; i++) {
|
||||
I[base+i] = pbch_comp[2*symbol*20*12+2*i];
|
||||
Q[base+i] = pbch_comp[2*symbol*20*12+2*i+1];
|
||||
I[base+i] = pbch_comp[symbol*20*12+i].r;
|
||||
Q[base+i] = pbch_comp[symbol*20*12+i].i;
|
||||
}
|
||||
|
||||
base+=nb_re;
|
||||
}
|
||||
|
||||
fl_set_xyplot_data(graph,I,Q,base,"","","");
|
||||
oai_xygraph(graph,I,Q,base,0,10);
|
||||
}
|
||||
|
||||
static void uePcchLLR (FL_OBJECT *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) {
|
||||
static void uePcchLLR (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) {
|
||||
// PDCCH LLRs
|
||||
if (!phy_vars_ue->pdcch_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; s<sz; s++) {
|
||||
I[s+base] += pdsch_comp[2*s];
|
||||
Q[s+base] += pdsch_comp[2*s+1];
|
||||
I[s+base] += pdsch_comp[s].r;
|
||||
Q[s+base] += pdsch_comp[s].i;
|
||||
}
|
||||
|
||||
base+=sz;
|
||||
}
|
||||
|
||||
fl_set_xyplot_data(graph,I,Q,base,"","","");
|
||||
oai_xygraph(graph,I,Q,base,0,10);
|
||||
}
|
||||
|
||||
static void uePdschThroughput (OAIgraph_t *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) {
|
||||
/*
|
||||
|
||||
// PDSCH Throughput
|
||||
@@ -752,50 +647,59 @@ static void uePdschIQ (FL_OBJECT *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_i
|
||||
*/
|
||||
}
|
||||
|
||||
static void uePdschThroughput (FL_OBJECT *graph, PHY_VARS_NR_UE *phy_vars_ue, int eNB_id, int UE_id) {
|
||||
}
|
||||
|
||||
static FD_phy_scope_t *create_phy_scope_nrue( int ID ) {
|
||||
static OAI_phy_scope_t *create_phy_scope_nrue( int ID ) {
|
||||
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, 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 );
|
||||
|
||||
@@ -28,7 +28,6 @@
|
||||
#include <openairinterface5g_limits.h>
|
||||
#include "common/ran_context.h"
|
||||
#include <openair1/PHY/defs_gNB.h>
|
||||
#include <forms.h>
|
||||
#include "PHY/defs_gNB.h"
|
||||
//#include "PHY/defs_nrUE.h"
|
||||
//#include "PHY/impl_defs_top.h"
|
||||
|
||||
@@ -32,6 +32,7 @@
|
||||
#ifndef PHY_FRAME_CONFIG_NR_H
|
||||
#define PHY_FRAME_CONFIG_NR_H
|
||||
|
||||
#include <nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h>
|
||||
/************** 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
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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__ */
|
||||
|
||||
@@ -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
|
||||
/** @}*/
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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 <common/utils/nr/nr_common.h>
|
||||
|
||||
#define DEBUG_RAR
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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) {
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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];
|
||||
|
||||
+536
-235
File diff suppressed because it is too large
Load Diff
@@ -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);
|
||||
|
||||
|
||||
+51
-88
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
+118
-114
@@ -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;i<list_size;i++) {
|
||||
|
||||
for (int i=0; i<list_size; i++) {
|
||||
if (UE_CapabilityRAT_ContainerList->list.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; i<m->nb_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; i<m->nb_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; i<ue_context_p->ue_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; i<ue_context_p->ue_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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
+58
-10
@@ -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);
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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";
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
+20
-13
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user