Merge remote-tracking branch 'origin/develop' into fhg-shp-dl-ptrs
This commit is contained in:
@@ -0,0 +1,8 @@
|
|||||||
|
*.log
|
||||||
|
cmake_targets/log/
|
||||||
|
cmake_targets/ran_build/
|
||||||
|
common/utils/T/T_IDs.h
|
||||||
|
common/utils/T/T_messages.txt.h
|
||||||
|
common/utils/T/genids
|
||||||
|
common/utils/T/genids.o
|
||||||
|
targets/bin/
|
||||||
@@ -35,6 +35,9 @@ def doFlexranCtrlTest = false
|
|||||||
// Location of the executor node
|
// Location of the executor node
|
||||||
def nodeExecutor = params.nodeExecutor
|
def nodeExecutor = params.nodeExecutor
|
||||||
|
|
||||||
|
// VM Lockable resources
|
||||||
|
def vmResource = params.vmLockableResource
|
||||||
|
|
||||||
pipeline {
|
pipeline {
|
||||||
agent {
|
agent {
|
||||||
label nodeExecutor
|
label nodeExecutor
|
||||||
@@ -159,65 +162,81 @@ pipeline {
|
|||||||
|
|
||||||
stage ("Start VM -- basic-sim") {
|
stage ("Start VM -- basic-sim") {
|
||||||
steps {
|
steps {
|
||||||
|
lock (vmResource) {
|
||||||
timeout (time: 5, unit: 'MINUTES') {
|
timeout (time: 5, unit: 'MINUTES') {
|
||||||
sh "./ci-scripts/oai-ci-vm-tool build --workspace $WORKSPACE --variant basic-sim --job-name ${JOB_NAME} --build-id ${BUILD_ID} --daemon"
|
sh "./ci-scripts/oai-ci-vm-tool build --workspace $WORKSPACE --variant basic-sim --job-name ${JOB_NAME} --build-id ${BUILD_ID} --daemon"
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
stage ("Start VM -- gnb-usrp") {
|
stage ("Start VM -- gnb-usrp") {
|
||||||
steps {
|
steps {
|
||||||
|
lock (vmResource) {
|
||||||
timeout (time: 5, unit: 'MINUTES') {
|
timeout (time: 5, unit: 'MINUTES') {
|
||||||
sh "./ci-scripts/oai-ci-vm-tool build --workspace $WORKSPACE --variant gnb-usrp --job-name ${JOB_NAME} --build-id ${BUILD_ID} --daemon"
|
sh "./ci-scripts/oai-ci-vm-tool build --workspace $WORKSPACE --variant gnb-usrp --job-name ${JOB_NAME} --build-id ${BUILD_ID} --daemon"
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
stage ("Start VM -- nr-ue-usrp") {
|
stage ("Start VM -- nr-ue-usrp") {
|
||||||
steps {
|
steps {
|
||||||
|
lock (vmResource) {
|
||||||
timeout (time: 5, unit: 'MINUTES') {
|
timeout (time: 5, unit: 'MINUTES') {
|
||||||
sh "./ci-scripts/oai-ci-vm-tool build --workspace $WORKSPACE --variant nr-ue-usrp --job-name ${JOB_NAME} --build-id ${BUILD_ID} --daemon"
|
sh "./ci-scripts/oai-ci-vm-tool build --workspace $WORKSPACE --variant nr-ue-usrp --job-name ${JOB_NAME} --build-id ${BUILD_ID} --daemon"
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
stage ("Start VM -- enb-usrp") {
|
stage ("Start VM -- enb-usrp") {
|
||||||
steps {
|
steps {
|
||||||
|
lock (vmResource) {
|
||||||
timeout (time: 5, unit: 'MINUTES') {
|
timeout (time: 5, unit: 'MINUTES') {
|
||||||
sh "./ci-scripts/oai-ci-vm-tool build --workspace $WORKSPACE --variant enb-usrp --job-name ${JOB_NAME} --build-id ${BUILD_ID} --daemon"
|
sh "./ci-scripts/oai-ci-vm-tool build --workspace $WORKSPACE --variant enb-usrp --job-name ${JOB_NAME} --build-id ${BUILD_ID} --daemon"
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
stage ("Start VM -- phy-sim") {
|
stage ("Start VM -- phy-sim") {
|
||||||
steps {
|
steps {
|
||||||
|
lock (vmResource) {
|
||||||
timeout (time: 5, unit: 'MINUTES') {
|
timeout (time: 5, unit: 'MINUTES') {
|
||||||
sh "./ci-scripts/oai-ci-vm-tool build --workspace $WORKSPACE --variant phy-sim --job-name ${JOB_NAME} --build-id ${BUILD_ID} --daemon"
|
sh "./ci-scripts/oai-ci-vm-tool build --workspace $WORKSPACE --variant phy-sim --job-name ${JOB_NAME} --build-id ${BUILD_ID} --daemon"
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
stage ("Start VM -- enb-ethernet") {
|
stage ("Start VM -- enb-ethernet") {
|
||||||
steps {
|
steps {
|
||||||
|
lock (vmResource) {
|
||||||
timeout (time: 7, unit: 'MINUTES') {
|
timeout (time: 7, unit: 'MINUTES') {
|
||||||
sh "./ci-scripts/oai-ci-vm-tool build --workspace $WORKSPACE --variant enb-ethernet --job-name ${JOB_NAME} --build-id ${BUILD_ID} --daemon"
|
sh "./ci-scripts/oai-ci-vm-tool build --workspace $WORKSPACE --variant enb-ethernet --job-name ${JOB_NAME} --build-id ${BUILD_ID} --daemon"
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
stage ("Start VM -- ue-ethernet") {
|
stage ("Start VM -- ue-ethernet") {
|
||||||
steps {
|
steps {
|
||||||
|
lock (vmResource) {
|
||||||
timeout (time: 7, unit: 'MINUTES') {
|
timeout (time: 7, unit: 'MINUTES') {
|
||||||
sh "./ci-scripts/oai-ci-vm-tool build --workspace $WORKSPACE --variant ue-ethernet --job-name ${JOB_NAME} --build-id ${BUILD_ID} --daemon"
|
sh "./ci-scripts/oai-ci-vm-tool build --workspace $WORKSPACE --variant ue-ethernet --job-name ${JOB_NAME} --build-id ${BUILD_ID} --daemon"
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
stage ("Start VM -- cppcheck") {
|
stage ("Start VM -- cppcheck") {
|
||||||
steps {
|
steps {
|
||||||
|
lock (vmResource) {
|
||||||
timeout (time: 7, unit: 'MINUTES') {
|
timeout (time: 7, unit: 'MINUTES') {
|
||||||
sh "./ci-scripts/oai-ci-vm-tool build --workspace $WORKSPACE --variant cppcheck --job-name ${JOB_NAME} --build-id ${BUILD_ID} --daemon"
|
sh "./ci-scripts/oai-ci-vm-tool build --workspace $WORKSPACE --variant cppcheck --job-name ${JOB_NAME} --build-id ${BUILD_ID} --daemon"
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -288,11 +307,14 @@ pipeline {
|
|||||||
}
|
}
|
||||||
stage ("Build UE-ethernet") {
|
stage ("Build UE-ethernet") {
|
||||||
steps {
|
steps {
|
||||||
|
// This is typically the last one to finish.
|
||||||
|
lock (vmResource) {
|
||||||
gitlabCommitStatus(name: "Build UE-ethernet") {
|
gitlabCommitStatus(name: "Build UE-ethernet") {
|
||||||
timeout (time: 20, unit: 'MINUTES') {
|
timeout (time: 20, unit: 'MINUTES') {
|
||||||
sh "./ci-scripts/oai-ci-vm-tool wait --workspace $WORKSPACE --variant ue-ethernet --job-name ${JOB_NAME} --build-id ${BUILD_ID} --keep-vm-alive"
|
sh "./ci-scripts/oai-ci-vm-tool wait --workspace $WORKSPACE --variant ue-ethernet --job-name ${JOB_NAME} --build-id ${BUILD_ID} --keep-vm-alive"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -354,6 +376,7 @@ pipeline {
|
|||||||
stages {
|
stages {
|
||||||
stage ("Test physical simulators") {
|
stage ("Test physical simulators") {
|
||||||
steps {
|
steps {
|
||||||
|
lock (vmResource) {
|
||||||
script {
|
script {
|
||||||
timeout (time: 90, unit: 'MINUTES') {
|
timeout (time: 90, unit: 'MINUTES') {
|
||||||
try {
|
try {
|
||||||
@@ -365,6 +388,7 @@ pipeline {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
stage ("Build Flexran Controller") {
|
stage ("Build Flexran Controller") {
|
||||||
@@ -372,6 +396,7 @@ pipeline {
|
|||||||
expression {doFlexranCtrlTest}
|
expression {doFlexranCtrlTest}
|
||||||
}
|
}
|
||||||
steps {
|
steps {
|
||||||
|
lock (vmResource) {
|
||||||
script {
|
script {
|
||||||
timeout (time: 20, unit: 'MINUTES') {
|
timeout (time: 20, unit: 'MINUTES') {
|
||||||
try {
|
try {
|
||||||
@@ -381,10 +406,12 @@ pipeline {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
stage ("Test basic simulator") {
|
stage ("Test basic simulator") {
|
||||||
steps {
|
steps {
|
||||||
|
lock (vmResource) {
|
||||||
script {
|
script {
|
||||||
timeout (time: 30, unit: 'MINUTES') {
|
timeout (time: 30, unit: 'MINUTES') {
|
||||||
try {
|
try {
|
||||||
@@ -396,10 +423,12 @@ pipeline {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
stage ("Test L1 simulator") {
|
stage ("Test L1 simulator") {
|
||||||
steps {
|
steps {
|
||||||
|
lock (vmResource) {
|
||||||
script {
|
script {
|
||||||
timeout (time: 30, unit: 'MINUTES') {
|
timeout (time: 30, unit: 'MINUTES') {
|
||||||
try {
|
try {
|
||||||
@@ -411,10 +440,12 @@ pipeline {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
stage ("Test RF simulator") {
|
stage ("Test RF simulator") {
|
||||||
steps {
|
steps {
|
||||||
|
lock (vmResource) {
|
||||||
script {
|
script {
|
||||||
timeout (time: 40, unit: 'MINUTES') {
|
timeout (time: 40, unit: 'MINUTES') {
|
||||||
try {
|
try {
|
||||||
@@ -426,10 +457,12 @@ pipeline {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
stage ("Test L2 simulator") {
|
stage ("Test L2 simulator") {
|
||||||
steps {
|
steps {
|
||||||
|
lock (vmResource) {
|
||||||
script {
|
script {
|
||||||
timeout (time: 30, unit: 'MINUTES') {
|
timeout (time: 30, unit: 'MINUTES') {
|
||||||
try {
|
try {
|
||||||
@@ -441,11 +474,14 @@ pipeline {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
stage ("Destroy all Virtual Machines") {
|
stage ("Destroy all Virtual Machines") {
|
||||||
steps {
|
steps {
|
||||||
|
lock (vmResource) {
|
||||||
sh "./ci-scripts/oai-ci-vm-tool destroy --job-name ${JOB_NAME} --build-id ${BUILD_ID}"
|
sh "./ci-scripts/oai-ci-vm-tool destroy --job-name ${JOB_NAME} --build-id ${BUILD_ID}"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -72,6 +72,9 @@ class OaiCiTest():
|
|||||||
self.ADBCentralized = True
|
self.ADBCentralized = True
|
||||||
self.testCase_id = ''
|
self.testCase_id = ''
|
||||||
self.testXMLfiles = []
|
self.testXMLfiles = []
|
||||||
|
self.testUnstable = False
|
||||||
|
self.testMinStableId = '999999'
|
||||||
|
self.testStabilityPointReached = False
|
||||||
self.desc = ''
|
self.desc = ''
|
||||||
self.ping_args = ''
|
self.ping_args = ''
|
||||||
self.ping_packetloss_threshold = ''
|
self.ping_packetloss_threshold = ''
|
||||||
@@ -211,7 +214,7 @@ class OaiCiTest():
|
|||||||
logging.error('\u001B[1m Building OAI UE Failed\u001B[0m')
|
logging.error('\u001B[1m Building OAI UE Failed\u001B[0m')
|
||||||
HTML.CreateHtmlTestRow(self.Build_OAI_UE_args, 'KO', CONST.ALL_PROCESSES_OK, 'OAI UE')
|
HTML.CreateHtmlTestRow(self.Build_OAI_UE_args, 'KO', CONST.ALL_PROCESSES_OK, 'OAI UE')
|
||||||
HTML.CreateHtmlTabFooter(False)
|
HTML.CreateHtmlTabFooter(False)
|
||||||
sys.exit(1)
|
self.ConditionalExit()
|
||||||
|
|
||||||
def CheckFlexranCtrlInstallation(self,RAN,EPC):
|
def CheckFlexranCtrlInstallation(self,RAN,EPC):
|
||||||
if EPC.IPAddress == '' or EPC.UserName == '' or EPC.Password == '':
|
if EPC.IPAddress == '' or EPC.UserName == '' or EPC.Password == '':
|
||||||
@@ -335,7 +338,7 @@ class OaiCiTest():
|
|||||||
if (pStatus < 0):
|
if (pStatus < 0):
|
||||||
HTML.CreateHtmlTestRow(self.air_interface + ' ' + self.Initialize_OAI_UE_args, 'KO', pStatus)
|
HTML.CreateHtmlTestRow(self.air_interface + ' ' + self.Initialize_OAI_UE_args, 'KO', pStatus)
|
||||||
HTML.CreateHtmlTabFooter(False)
|
HTML.CreateHtmlTabFooter(False)
|
||||||
sys.exit(1)
|
self.ConditionalExit()
|
||||||
UE_prefix = ''
|
UE_prefix = ''
|
||||||
else:
|
else:
|
||||||
UE_prefix = 'NR '
|
UE_prefix = 'NR '
|
||||||
@@ -719,7 +722,7 @@ class OaiCiTest():
|
|||||||
logging.debug('Using the OAI EPC HSS: not implemented yet')
|
logging.debug('Using the OAI EPC HSS: not implemented yet')
|
||||||
HTML.CreateHtmlTestRow(self.ping_args, 'KO', pStatus)
|
HTML.CreateHtmlTestRow(self.ping_args, 'KO', pStatus)
|
||||||
HTML.CreateHtmlTabFooter(False)
|
HTML.CreateHtmlTabFooter(False)
|
||||||
sys.exit(1)
|
self.ConditionalExit()
|
||||||
else:
|
else:
|
||||||
SSH.command('egrep --color=never "Allocated ipv4 addr" /opt/ltebox/var/log/xGwLog.0', '\$', 5)
|
SSH.command('egrep --color=never "Allocated ipv4 addr" /opt/ltebox/var/log/xGwLog.0', '\$', 5)
|
||||||
result = re.search('Allocated ipv4 addr: (?P<ipaddr>[0-9\.]+) from Pool', SSH.getBefore())
|
result = re.search('Allocated ipv4 addr: (?P<ipaddr>[0-9\.]+) from Pool', SSH.getBefore())
|
||||||
@@ -1046,7 +1049,7 @@ class OaiCiTest():
|
|||||||
if (pStatus < 0):
|
if (pStatus < 0):
|
||||||
HTML.CreateHtmlTestRow('N/A', 'KO', pStatus)
|
HTML.CreateHtmlTestRow('N/A', 'KO', pStatus)
|
||||||
HTML.CreateHtmlTabFooter(False)
|
HTML.CreateHtmlTabFooter(False)
|
||||||
sys.exit(1)
|
self.ConditionalExit()
|
||||||
multi_jobs = []
|
multi_jobs = []
|
||||||
for device_id in self.UEDevices:
|
for device_id in self.UEDevices:
|
||||||
p = Process(target = self.RebootUE_common, args = (device_id,))
|
p = Process(target = self.RebootUE_common, args = (device_id,))
|
||||||
@@ -1154,15 +1157,18 @@ class OaiCiTest():
|
|||||||
self.UEDevicesRebootCmd.append(comma_split[5])
|
self.UEDevicesRebootCmd.append(comma_split[5])
|
||||||
phone_list_file.close()
|
phone_list_file.close()
|
||||||
|
|
||||||
|
# better handling of the case when no UE detected
|
||||||
|
# Sys-exit is now dealt by the calling function
|
||||||
if terminate_ue_flag == True:
|
if terminate_ue_flag == True:
|
||||||
if len(self.UEDevices) == 0:
|
if len(self.UEDevices) == 0:
|
||||||
logging.debug('\u001B[1;37;41m UE Not Found! \u001B[0m')
|
logging.debug('\u001B[1;37;41m UE Not Found! \u001B[0m')
|
||||||
sys.exit(1)
|
return False
|
||||||
if len(self.UEDevicesStatus) == 0:
|
if len(self.UEDevicesStatus) == 0:
|
||||||
cnt = 0
|
cnt = 0
|
||||||
while cnt < len(self.UEDevices):
|
while cnt < len(self.UEDevices):
|
||||||
self.UEDevicesStatus.append(CONST.UE_STATUS_DETACHED)
|
self.UEDevicesStatus.append(CONST.UE_STATUS_DETACHED)
|
||||||
cnt += 1
|
cnt += 1
|
||||||
|
return True
|
||||||
|
|
||||||
def GetAllCatMDevices(self, terminate_ue_flag):
|
def GetAllCatMDevices(self, terminate_ue_flag):
|
||||||
if self.ADBIPAddress == '' or self.ADBUserName == '' or self.ADBPassword == '':
|
if self.ADBIPAddress == '' or self.ADBUserName == '' or self.ADBPassword == '':
|
||||||
@@ -1248,7 +1254,7 @@ class OaiCiTest():
|
|||||||
if (pStatus < 0):
|
if (pStatus < 0):
|
||||||
HTML.CreateHtmlTestRow('N/A', 'KO', pStatus)
|
HTML.CreateHtmlTestRow('N/A', 'KO', pStatus)
|
||||||
HTML.CreateHtmlTabFooter(False)
|
HTML.CreateHtmlTabFooter(False)
|
||||||
sys.exit(1)
|
self.ConditionalExit()
|
||||||
multi_jobs = []
|
multi_jobs = []
|
||||||
lock = Lock()
|
lock = Lock()
|
||||||
status_queue = SimpleQueue()
|
status_queue = SimpleQueue()
|
||||||
@@ -1386,7 +1392,14 @@ class OaiCiTest():
|
|||||||
SSH.open(EPC.IPAddress, EPC.UserName, EPC.Password)
|
SSH.open(EPC.IPAddress, EPC.UserName, EPC.Password)
|
||||||
SSH.command('cd ' + EPC.SourceCodePath, '\$', 5)
|
SSH.command('cd ' + EPC.SourceCodePath, '\$', 5)
|
||||||
SSH.command('cd scripts', '\$', 5)
|
SSH.command('cd scripts', '\$', 5)
|
||||||
ping_status = SSH.command('stdbuf -o0 ping ' + self.ping_args + ' ' + UE_IPAddress + ' 2>&1 | stdbuf -o0 tee ping_' + self.testCase_id + '_' + device_id + '.log', '\$', int(ping_time[0])*1.5)
|
# In case of a docker-based deployment, we need to ping from the trf-gen container
|
||||||
|
launchFromTrfContainer = False
|
||||||
|
if re.match('OAI-Rel14-Docker', EPC.Type, re.IGNORECASE):
|
||||||
|
launchFromTrfContainer = True
|
||||||
|
if launchFromTrfContainer:
|
||||||
|
ping_status = SSH.command('docker exec -it prod-trf-gen /bin/bash -c "ping ' + self.ping_args + ' ' + UE_IPAddress + '" 2>&1 | tee ping_' + self.testCase_id + '_' + device_id + '.log', '\$', int(ping_time[0])*1.5)
|
||||||
|
else:
|
||||||
|
ping_status = SSH.command('stdbuf -o0 ping ' + self.ping_args + ' ' + UE_IPAddress + ' 2>&1 | stdbuf -o0 tee ping_' + self.testCase_id + '_' + device_id + '.log', '\$', int(ping_time[0])*1.5)
|
||||||
else:
|
else:
|
||||||
cmd = 'ping ' + self.ping_args + ' ' + UE_IPAddress + ' 2>&1 > ping_' + self.testCase_id + '_' + device_id + '.log'
|
cmd = 'ping ' + self.ping_args + ' ' + UE_IPAddress + ' 2>&1 > ping_' + self.testCase_id + '_' + device_id + '.log'
|
||||||
message = cmd + '\n'
|
message = cmd + '\n'
|
||||||
@@ -2028,7 +2041,8 @@ class OaiCiTest():
|
|||||||
SSH.command('adb -s ' + device_id + ' shell "ls /data/local/tmp"', '\$', 5)
|
SSH.command('adb -s ' + device_id + ' shell "ls /data/local/tmp"', '\$', 5)
|
||||||
else:
|
else:
|
||||||
SSH.command('ssh ' + self.UEDevicesRemoteUser[idx] + '@' + self.UEDevicesRemoteServer[idx] + ' \'adb -s ' + device_id + ' shell "ls /data/local/tmp"\'', '\$', 60)
|
SSH.command('ssh ' + self.UEDevicesRemoteUser[idx] + '@' + self.UEDevicesRemoteServer[idx] + ' \'adb -s ' + device_id + ' shell "ls /data/local/tmp"\'', '\$', 60)
|
||||||
result = re.search('iperf3', SSH.getBefore())
|
# DEBUG: disabling iperf3 usage for the moment
|
||||||
|
result = re.search('iperf4', SSH.getBefore())
|
||||||
if result is None:
|
if result is None:
|
||||||
result = re.search('iperf', SSH.getBefore())
|
result = re.search('iperf', SSH.getBefore())
|
||||||
if result is None:
|
if result is None:
|
||||||
@@ -2105,6 +2119,10 @@ class OaiCiTest():
|
|||||||
launchFromEpc = True
|
launchFromEpc = True
|
||||||
if re.match('OAI-Rel14-CUPS', EPC.Type, re.IGNORECASE):
|
if re.match('OAI-Rel14-CUPS', EPC.Type, re.IGNORECASE):
|
||||||
launchFromEpc = False
|
launchFromEpc = False
|
||||||
|
# When using a docker-based deployment, IPERF client shall be launched from trf container
|
||||||
|
launchFromTrfContainer = False
|
||||||
|
if re.match('OAI-Rel14-Docker', EPC.Type, re.IGNORECASE):
|
||||||
|
launchFromTrfContainer = True
|
||||||
if launchFromEpc:
|
if launchFromEpc:
|
||||||
SSH.open(EPC.IPAddress, EPC.UserName, EPC.Password)
|
SSH.open(EPC.IPAddress, EPC.UserName, EPC.Password)
|
||||||
SSH.command('cd ' + EPC.SourceCodePath + '/scripts', '\$', 5)
|
SSH.command('cd ' + EPC.SourceCodePath + '/scripts', '\$', 5)
|
||||||
@@ -2129,7 +2147,16 @@ class OaiCiTest():
|
|||||||
self.Iperf_analyzeV3Output(lock, UE_IPAddress, device_id, statusQueue,SSH)
|
self.Iperf_analyzeV3Output(lock, UE_IPAddress, device_id, statusQueue,SSH)
|
||||||
else:
|
else:
|
||||||
if launchFromEpc:
|
if launchFromEpc:
|
||||||
iperf_status = SSH.command('stdbuf -o0 iperf -c ' + UE_IPAddress + ' ' + modified_options + ' 2>&1 | stdbuf -o0 tee iperf_' + self.testCase_id + '_' + device_id + '.log', '\$', int(iperf_time)*5.0)
|
if launchFromTrfContainer:
|
||||||
|
if self.ueIperfVersion == self.dummyIperfVersion:
|
||||||
|
prefix = ''
|
||||||
|
else:
|
||||||
|
prefix = ''
|
||||||
|
if self.ueIperfVersion == '2.0.5':
|
||||||
|
prefix = '/iperf-2.0.5/bin/'
|
||||||
|
iperf_status = SSH.command('docker exec -it prod-trf-gen /bin/bash -c "' + prefix + 'iperf -c ' + UE_IPAddress + ' ' + modified_options + '" 2>&1 | tee iperf_' + self.testCase_id + '_' + device_id + '.log', '\$', int(iperf_time)*5.0)
|
||||||
|
else:
|
||||||
|
iperf_status = SSH.command('stdbuf -o0 iperf -c ' + UE_IPAddress + ' ' + modified_options + ' 2>&1 | stdbuf -o0 tee iperf_' + self.testCase_id + '_' + device_id + '.log', '\$', int(iperf_time)*5.0)
|
||||||
else:
|
else:
|
||||||
if self.ueIperfVersion == self.dummyIperfVersion:
|
if self.ueIperfVersion == self.dummyIperfVersion:
|
||||||
prefix = ''
|
prefix = ''
|
||||||
@@ -3148,6 +3175,12 @@ class OaiCiTest():
|
|||||||
HTML.CpuMHz[idx]=CpuMHz
|
HTML.CpuMHz[idx]=CpuMHz
|
||||||
SSH.close()
|
SSH.close()
|
||||||
|
|
||||||
|
def ConditionalExit(self):
|
||||||
|
if self.testUnstable:
|
||||||
|
if self.testStabilityPointReached or self.testMinStableId == '999999':
|
||||||
|
sys.exit(0)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
def ShowTestID(self):
|
def ShowTestID(self):
|
||||||
logging.debug('\u001B[1m----------------------------------------\u001B[0m')
|
logging.debug('\u001B[1m----------------------------------------\u001B[0m')
|
||||||
logging.debug('\u001B[1mTest ID:' + self.testCase_id + '\u001B[0m')
|
logging.debug('\u001B[1mTest ID:' + self.testCase_id + '\u001B[0m')
|
||||||
|
|||||||
@@ -45,8 +45,8 @@ gNBs =
|
|||||||
dl_carrierBandwidth = 106;
|
dl_carrierBandwidth = 106;
|
||||||
#initialDownlinkBWP
|
#initialDownlinkBWP
|
||||||
#genericParameters
|
#genericParameters
|
||||||
# this is RBstart=0,L=50 (275*(L-1))+RBstart
|
# this is RBstart=41,L=24 (275*(L-1))+RBstart
|
||||||
initialDLBWPlocationAndBandwidth = 13475;
|
initialDLBWPlocationAndBandwidth = 6366;
|
||||||
# subcarrierSpacing
|
# subcarrierSpacing
|
||||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
initialDLBWPsubcarrierSpacing = 1;
|
initialDLBWPsubcarrierSpacing = 1;
|
||||||
@@ -59,7 +59,7 @@ gNBs =
|
|||||||
#initialULBWPmappingType
|
#initialULBWPmappingType
|
||||||
#0=typeA,1=typeB
|
#0=typeA,1=typeB
|
||||||
initialDLBWPmappingType_0 = 0;
|
initialDLBWPmappingType_0 = 0;
|
||||||
#this is SS=2,L=3
|
#this is SS=1,L=13
|
||||||
initialDLBWPstartSymbolAndLength_0 = 40;
|
initialDLBWPstartSymbolAndLength_0 = 40;
|
||||||
|
|
||||||
initialDLBWPk0_1 = 0;
|
initialDLBWPk0_1 = 0;
|
||||||
@@ -74,7 +74,7 @@ gNBs =
|
|||||||
|
|
||||||
initialDLBWPk0_3 = 0;
|
initialDLBWPk0_3 = 0;
|
||||||
initialDLBWPmappingType_3 = 0;
|
initialDLBWPmappingType_3 = 0;
|
||||||
#this is SS=1,L=4
|
#this is SS=1,L=5
|
||||||
initialDLBWPstartSymbolAndLength_3 = 57;
|
initialDLBWPstartSymbolAndLength_3 = 57;
|
||||||
|
|
||||||
#uplinkConfigCommon
|
#uplinkConfigCommon
|
||||||
@@ -89,7 +89,7 @@ gNBs =
|
|||||||
pMax = 20;
|
pMax = 20;
|
||||||
#initialUplinkBWP
|
#initialUplinkBWP
|
||||||
#genericParameters
|
#genericParameters
|
||||||
initialULBWPlocationAndBandwidth = 13475;
|
initialULBWPlocationAndBandwidth = 6366;
|
||||||
# subcarrierSpacing
|
# subcarrierSpacing
|
||||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
initialULBWPsubcarrierSpacing = 1;
|
initialULBWPsubcarrierSpacing = 1;
|
||||||
@@ -135,8 +135,8 @@ gNBs =
|
|||||||
initialULBWPmappingType_0 = 1
|
initialULBWPmappingType_0 = 1
|
||||||
# this is SS=0 L=11
|
# this is SS=0 L=11
|
||||||
initialULBWPstartSymbolAndLength_0 = 55;
|
initialULBWPstartSymbolAndLength_0 = 55;
|
||||||
|
|
||||||
initialULBWPk2_1 = 6;
|
initialULBWPk2_1 = 6;
|
||||||
initialULBWPmappingType_1 = 1;
|
initialULBWPmappingType_1 = 1;
|
||||||
# this is SS=0 L=12
|
# this is SS=0 L=12
|
||||||
initialULBWPstartSymbolAndLength_1 = 69;
|
initialULBWPstartSymbolAndLength_1 = 69;
|
||||||
@@ -145,7 +145,7 @@ gNBs =
|
|||||||
initialULBWPmappingType_2 = 1;
|
initialULBWPmappingType_2 = 1;
|
||||||
# this is SS=10 L=4
|
# this is SS=10 L=4
|
||||||
initialULBWPstartSymbolAndLength_2 = 52;
|
initialULBWPstartSymbolAndLength_2 = 52;
|
||||||
|
|
||||||
msg3_DeltaPreamble = 1;
|
msg3_DeltaPreamble = 1;
|
||||||
p0_NominalWithGrant =-90;
|
p0_NominalWithGrant =-90;
|
||||||
|
|
||||||
@@ -249,7 +249,7 @@ RUs = (
|
|||||||
eNB_instances = [0];
|
eNB_instances = [0];
|
||||||
#beamforming 1x4 matrix:
|
#beamforming 1x4 matrix:
|
||||||
bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000];
|
bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000];
|
||||||
sdr_addrs = "addr=192.168.10.2,second_addr=192.168.20.2";
|
sdr_addrs = "addr=192.168.10.2,mgmt_addr=192.168.10.2,second_addr=192.168.20.2";
|
||||||
clock_src = "external";
|
clock_src = "external";
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|||||||
+2
-1
@@ -65,6 +65,7 @@ class EPCManagement():
|
|||||||
self.testCase_id = ''
|
self.testCase_id = ''
|
||||||
self.MmeIPAddress = ''
|
self.MmeIPAddress = ''
|
||||||
self.containerPrefix = 'prod'
|
self.containerPrefix = 'prod'
|
||||||
|
self.mmeConfFile = 'mme.conf'
|
||||||
|
|
||||||
|
|
||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
@@ -127,7 +128,7 @@ class EPCManagement():
|
|||||||
logging.debug('Using the OAI EPC Release 14 MME in Docker')
|
logging.debug('Using the OAI EPC Release 14 MME in Docker')
|
||||||
mySSH.command('docker exec -d ' + self.containerPrefix + '-oai-mme /bin/bash -c "nohup tshark -i eth0 -i lo:s10 -w /tmp/mme_check_run.pcap 2>&1 > /dev/null"', '\$', 5)
|
mySSH.command('docker exec -d ' + self.containerPrefix + '-oai-mme /bin/bash -c "nohup tshark -i eth0 -i lo:s10 -w /tmp/mme_check_run.pcap 2>&1 > /dev/null"', '\$', 5)
|
||||||
time.sleep(5)
|
time.sleep(5)
|
||||||
mySSH.command('docker exec -d ' + self.containerPrefix + '-oai-mme /bin/bash -c "nohup ./bin/oai_mme -c ./etc/mme.conf > mme_check_run.log 2>&1"', '\$', 5)
|
mySSH.command('docker exec -d ' + self.containerPrefix + '-oai-mme /bin/bash -c "nohup ./bin/oai_mme -c ./etc/' + self.mmeConfFile + ' > mme_check_run.log 2>&1"', '\$', 5)
|
||||||
elif re.match('OAI-Rel14-CUPS', self.Type, re.IGNORECASE):
|
elif re.match('OAI-Rel14-CUPS', self.Type, re.IGNORECASE):
|
||||||
logging.debug('Using the OAI EPC Release 14 MME')
|
logging.debug('Using the OAI EPC Release 14 MME')
|
||||||
mySSH.command('cd ' + self.SourceCodePath + '/scripts', '\$', 5)
|
mySSH.command('cd ' + self.SourceCodePath + '/scripts', '\$', 5)
|
||||||
|
|||||||
+16
-2
@@ -64,6 +64,10 @@ class HTMLManagement():
|
|||||||
self.htmlTabIcons = []
|
self.htmlTabIcons = []
|
||||||
self.testXMLfiles = []
|
self.testXMLfiles = []
|
||||||
|
|
||||||
|
self.testUnstable = False
|
||||||
|
self.testMinStableId = '999999'
|
||||||
|
self.testStabilityPointReached = False
|
||||||
|
|
||||||
self.htmleNBFailureMsg = ''
|
self.htmleNBFailureMsg = ''
|
||||||
self.htmlUEFailureMsg = ''
|
self.htmlUEFailureMsg = ''
|
||||||
|
|
||||||
@@ -230,13 +234,20 @@ class HTMLManagement():
|
|||||||
|
|
||||||
def CreateHtmlTabFooter(self, passStatus):
|
def CreateHtmlTabFooter(self, passStatus):
|
||||||
if ((not self.htmlFooterCreated) and (self.htmlHeaderCreated)):
|
if ((not self.htmlFooterCreated) and (self.htmlHeaderCreated)):
|
||||||
|
testOkEvenIfUnstable = False
|
||||||
|
if self.testUnstable and not passStatus:
|
||||||
|
if self.testStabilityPointReached or self.testMinStableId == '999999':
|
||||||
|
testOkEvenIfUnstable = True
|
||||||
self.htmlFile = open('test_results.html', 'a')
|
self.htmlFile = open('test_results.html', 'a')
|
||||||
self.htmlFile.write(' <tr>\n')
|
self.htmlFile.write(' <tr>\n')
|
||||||
self.htmlFile.write(' <th bgcolor = "#33CCFF" colspan=3>Final Tab Status</th>\n')
|
self.htmlFile.write(' <th bgcolor = "#33CCFF" colspan=3>Final Tab Status</th>\n')
|
||||||
if passStatus:
|
if passStatus:
|
||||||
self.htmlFile.write(' <th bgcolor = "green" colspan=' + str(2 + self.htmlUEConnected) + '><font color="white">PASS <span class="glyphicon glyphicon-ok"></span> </font></th>\n')
|
self.htmlFile.write(' <th bgcolor = "green" colspan=' + str(2 + self.htmlUEConnected) + '><font color="white">PASS <span class="glyphicon glyphicon-ok"></span> </font></th>\n')
|
||||||
else:
|
else:
|
||||||
self.htmlFile.write(' <th bgcolor = "red" colspan=' + str(2 + self.htmlUEConnected) + '><font color="white">FAIL <span class="glyphicon glyphicon-remove"></span> </font></th>\n')
|
if testOkEvenIfUnstable:
|
||||||
|
self.htmlFile.write(' <th bgcolor = "orange" colspan=' + str(2 + self.htmlUEConnected) + '><font color="white">KNOWN UNSTABLE SCENARIO <span class="glyphicon glyphicon-exclamation-sign"></span> </font></th>\n')
|
||||||
|
else:
|
||||||
|
self.htmlFile.write(' <th bgcolor = "red" colspan=' + str(2 + self.htmlUEConnected) + '><font color="white">FAIL <span class="glyphicon glyphicon-remove"></span> </font></th>\n')
|
||||||
self.htmlFile.write(' </tr>\n')
|
self.htmlFile.write(' </tr>\n')
|
||||||
self.htmlFile.write(' </table>\n')
|
self.htmlFile.write(' </table>\n')
|
||||||
self.htmlFile.write(' </div>\n')
|
self.htmlFile.write(' </div>\n')
|
||||||
@@ -246,7 +257,10 @@ class HTMLManagement():
|
|||||||
cmd = "sed -i -e 's/__STATE_" + self.htmlTabNames[0] + "__//' test_results.html"
|
cmd = "sed -i -e 's/__STATE_" + self.htmlTabNames[0] + "__//' test_results.html"
|
||||||
subprocess.run(cmd, shell=True)
|
subprocess.run(cmd, shell=True)
|
||||||
else:
|
else:
|
||||||
cmd = "sed -i -e 's/__STATE_" + self.htmlTabNames[0] + "__/<span class=\"glyphicon glyphicon-remove\"><\/span>/' test_results.html"
|
if testOkEvenIfUnstable:
|
||||||
|
cmd = "sed -i -e 's/__STATE_" + self.htmlTabNames[0] + "__/<span class=\"glyphicon glyphicon-exclamation-sign\"><\/span>/' test_results.html"
|
||||||
|
else:
|
||||||
|
cmd = "sed -i -e 's/__STATE_" + self.htmlTabNames[0] + "__/<span class=\"glyphicon glyphicon-remove\"><\/span>/' test_results.html"
|
||||||
subprocess.run(cmd, shell=True)
|
subprocess.run(cmd, shell=True)
|
||||||
self.htmlFooterCreated = False
|
self.htmlFooterCreated = False
|
||||||
|
|
||||||
|
|||||||
+29
-2
@@ -283,6 +283,11 @@ def GetParametersFromXML(action):
|
|||||||
else:
|
else:
|
||||||
ldpc.forced_workspace_cleanup=False
|
ldpc.forced_workspace_cleanup=False
|
||||||
|
|
||||||
|
elif action == 'Initialize_MME':
|
||||||
|
string_field = test.findtext('option')
|
||||||
|
if (string_field is not None):
|
||||||
|
EPC.mmeConfFile = string_field
|
||||||
|
|
||||||
else: # ie action == 'Run_PhySim':
|
else: # ie action == 'Run_PhySim':
|
||||||
ldpc.runargs = test.findtext('physim_run_args')
|
ldpc.runargs = test.findtext('physim_run_args')
|
||||||
|
|
||||||
@@ -489,6 +494,9 @@ elif re.match('^FinalizeHtml$', mode, re.IGNORECASE):
|
|||||||
CiTestObj.RetrieveSystemVersion('UE',HTML,RAN)
|
CiTestObj.RetrieveSystemVersion('UE',HTML,RAN)
|
||||||
HTML.CreateHtmlFooter(CiTestObj.finalStatus)
|
HTML.CreateHtmlFooter(CiTestObj.finalStatus)
|
||||||
elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re.IGNORECASE):
|
elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re.IGNORECASE):
|
||||||
|
logging.debug('\u001B[1m----------------------------------------\u001B[0m')
|
||||||
|
logging.debug('\u001B[1m Starting Scenario \u001B[0m')
|
||||||
|
logging.debug('\u001B[1m----------------------------------------\u001B[0m')
|
||||||
if re.match('^TesteNB$', mode, re.IGNORECASE):
|
if re.match('^TesteNB$', mode, re.IGNORECASE):
|
||||||
if RAN.eNBIPAddress == '' or RAN.ranRepository == '' or RAN.ranBranch == '' or RAN.eNBUserName == '' or RAN.eNBPassword == '' or RAN.eNBSourceCodePath == '' or EPC.IPAddress == '' or EPC.UserName == '' or EPC.Password == '' or EPC.Type == '' or EPC.SourceCodePath == '' or CiTestObj.ADBIPAddress == '' or CiTestObj.ADBUserName == '' or CiTestObj.ADBPassword == '':
|
if RAN.eNBIPAddress == '' or RAN.ranRepository == '' or RAN.ranBranch == '' or RAN.eNBUserName == '' or RAN.eNBPassword == '' or RAN.eNBSourceCodePath == '' or EPC.IPAddress == '' or EPC.UserName == '' or EPC.Password == '' or EPC.Type == '' or EPC.SourceCodePath == '' or CiTestObj.ADBIPAddress == '' or CiTestObj.ADBUserName == '' or CiTestObj.ADBPassword == '':
|
||||||
HELP.GenericHelp(CONST.Version)
|
HELP.GenericHelp(CONST.Version)
|
||||||
@@ -524,7 +532,14 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re
|
|||||||
HTML.htmlTabRefs.append(xmlRoot.findtext('htmlTabRef',default='test-tab-0'))
|
HTML.htmlTabRefs.append(xmlRoot.findtext('htmlTabRef',default='test-tab-0'))
|
||||||
HTML.htmlTabNames.append(xmlRoot.findtext('htmlTabName',default='Test-0'))
|
HTML.htmlTabNames.append(xmlRoot.findtext('htmlTabName',default='Test-0'))
|
||||||
repeatCount = xmlRoot.findtext('repeatCount',default='1')
|
repeatCount = xmlRoot.findtext('repeatCount',default='1')
|
||||||
|
testStability = xmlRoot.findtext('TestUnstable',default='False')
|
||||||
CiTestObj.repeatCounts.append(int(repeatCount))
|
CiTestObj.repeatCounts.append(int(repeatCount))
|
||||||
|
if testStability == 'True':
|
||||||
|
CiTestObj.testUnstable = True
|
||||||
|
HTML.testUnstable = True
|
||||||
|
CiTestObj.testMinStableId = xmlRoot.findtext('TestMinId',default='999999')
|
||||||
|
HTML.testMinStableId = CiTestObj.testMinStableId
|
||||||
|
logging.debug('Test is tagged as Unstable -- starting from TestID ' + str(CiTestObj.testMinStableId))
|
||||||
all_tests=xmlRoot.findall('testCase')
|
all_tests=xmlRoot.findall('testCase')
|
||||||
|
|
||||||
exclusion_tests=exclusion_tests.split()
|
exclusion_tests=exclusion_tests.split()
|
||||||
@@ -605,7 +620,11 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re
|
|||||||
if (CiTestObj.ADBIPAddress != 'none'):
|
if (CiTestObj.ADBIPAddress != 'none'):
|
||||||
#in these cases, having no devices is critical, GetAllUEDevices function has to manage it as a critical error, reason why terminate_ue_flag is set to True
|
#in these cases, having no devices is critical, GetAllUEDevices function has to manage it as a critical error, reason why terminate_ue_flag is set to True
|
||||||
terminate_ue_flag = True
|
terminate_ue_flag = True
|
||||||
CiTestObj.GetAllUEDevices(terminate_ue_flag)
|
# Now we stop properly the test-suite --> clean reporting
|
||||||
|
status = CiTestObj.GetAllUEDevices(terminate_ue_flag)
|
||||||
|
if not status:
|
||||||
|
RAN.prematureExit = True
|
||||||
|
break
|
||||||
if action == 'Build_eNB':
|
if action == 'Build_eNB':
|
||||||
RAN.BuildeNB()
|
RAN.BuildeNB()
|
||||||
elif action == 'WaitEndBuild_eNB':
|
elif action == 'WaitEndBuild_eNB':
|
||||||
@@ -681,11 +700,19 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re
|
|||||||
HTML=ldpc.Run_PhySim(HTML,CONST,id)
|
HTML=ldpc.Run_PhySim(HTML,CONST,id)
|
||||||
else:
|
else:
|
||||||
sys.exit('Invalid class (action) from xml')
|
sys.exit('Invalid class (action) from xml')
|
||||||
|
if not RAN.prematureExit:
|
||||||
|
if CiTestObj.testCase_id == CiTestObj.testMinStableId:
|
||||||
|
logging.debug('Scenario has reached minimal stability point')
|
||||||
|
CiTestObj.testStabilityPointReached = True
|
||||||
|
HTML.testStabilityPointReached = True
|
||||||
CiTestObj.FailReportCnt += 1
|
CiTestObj.FailReportCnt += 1
|
||||||
if CiTestObj.FailReportCnt == CiTestObj.repeatCounts[0] and RAN.prematureExit:
|
if CiTestObj.FailReportCnt == CiTestObj.repeatCounts[0] and RAN.prematureExit:
|
||||||
logging.debug('Testsuite failed ' + str(CiTestObj.FailReportCnt) + ' time(s)')
|
logging.debug('Testsuite failed ' + str(CiTestObj.FailReportCnt) + ' time(s)')
|
||||||
HTML.CreateHtmlTabFooter(False)
|
HTML.CreateHtmlTabFooter(False)
|
||||||
sys.exit('Failed Scenario')
|
if CiTestObj.testUnstable and (CiTestObj.testStabilityPointReached or CiTestObj.testMinStableId == '999999'):
|
||||||
|
logging.debug('Scenario has reached minimal stability point -- Not a Failure')
|
||||||
|
else:
|
||||||
|
sys.exit('Failed Scenario')
|
||||||
else:
|
else:
|
||||||
logging.info('Testsuite passed after ' + str(CiTestObj.FailReportCnt) + ' time(s)')
|
logging.info('Testsuite passed after ' + str(CiTestObj.FailReportCnt) + ' time(s)')
|
||||||
HTML.CreateHtmlTabFooter(True)
|
HTML.CreateHtmlTabFooter(True)
|
||||||
|
|||||||
@@ -470,7 +470,7 @@ function report_test {
|
|||||||
then
|
then
|
||||||
NB_UE_TUNNEL_UP=`egrep -c "Interface oaitun_ue1 successfully configured" $UE_LOG`
|
NB_UE_TUNNEL_UP=`egrep -c "Interface oaitun_ue1 successfully configured" $UE_LOG`
|
||||||
else
|
else
|
||||||
NB_UE_TUNNEL_UP=`egrep -c "executing ifconfig oaitun_ue1" $UE_LOG`
|
NB_UE_TUNNEL_UP=`egrep -c "ip link set oaitun_ue1 up" $UE_LOG`
|
||||||
fi
|
fi
|
||||||
if [ $NB_ENB_GOT_SYNC -gt 0 ] && [ $NB_UE_GOT_SYNC -gt 0 ] && [ $NB_ENB_SYNCED_WITH_UE -gt 0 ]
|
if [ $NB_ENB_GOT_SYNC -gt 0 ] && [ $NB_UE_GOT_SYNC -gt 0 ] && [ $NB_ENB_SYNCED_WITH_UE -gt 0 ]
|
||||||
then
|
then
|
||||||
@@ -768,55 +768,47 @@ function report_test {
|
|||||||
|
|
||||||
#RA test (--do-ra option)
|
#RA test (--do-ra option)
|
||||||
|
|
||||||
# Currently disabled
|
#build log files names
|
||||||
# #build log files names
|
RA_ENB_LOG=$ARCHIVES_LOC/${TMODE}_${BW}prb_${CN_CONFIG}_gnb_ra_test.log
|
||||||
# RA_ENB_LOG=$ARCHIVES_LOC/${TMODE}_${BW}prb_${CN_CONFIG}_gnb_ra_test.log
|
RA_UE_LOG=$ARCHIVES_LOC/${TMODE}_${BW}prb_${CN_CONFIG}_ue_ra_test.log
|
||||||
# RA_UE_LOG=$ARCHIVES_LOC/ra_check_${TMODE}_${BW}prb_${CN_CONFIG}_ue_ra_test.log
|
if [ -f $RA_ENB_LOG ] && [ -f $RA_UE_LOG ]
|
||||||
# if [ -f $RA_ENB_LOG ] && [ -f $RA_UE_LOG ]
|
then
|
||||||
# then
|
#get rid of full path
|
||||||
# #get rid of full path
|
NAME_ENB=`echo $RA_ENB_LOG | sed -e "s#$ARCHIVES_LOC/##"`
|
||||||
# NAME_ENB=`echo $RA_ENB_LOG | sed -e "s#$ARCHIVES_LOC/##"`
|
NAME_UE=`echo $RA_UE_LOG | sed -e "s#$ARCHIVES_LOC/##"`
|
||||||
# NAME_UE=`echo $RA_UE_LOG | sed -e "s#$ARCHIVES_LOC/##"`
|
echo " <tr>" >> ./test_simulator_results.html
|
||||||
# echo " <tr>" >> ./test_simulator_results.html
|
echo " <td>$NAME_ENB --- $NAME_UE</td>" >> ./test_simulator_results.html
|
||||||
# echo " <td>$NAME_ENB --- $NAME_UE</td>" >> ./test_simulator_results.html
|
echo " <td>Check if RA proc succeeded</td>" >> ./test_simulator_results.html
|
||||||
# echo " <td>Check if RA proc succeeded</td>" >> ./test_simulator_results.html
|
|
||||||
#
|
#gNB RA check
|
||||||
# #gNB RA check
|
GNB_RECEIVED=`egrep -c "\[RAPROC\] PUSCH with TC_RNTI (.+) received correctly" $RA_ENB_LOG`
|
||||||
# GNB_RECEIVED=`egrep -c "received correctly" $RA_ENB_LOG`
|
#UE RA check
|
||||||
# GNB_CONNECTED=`egrep -c "now 5G connected" $RA_ENB_LOG`
|
UE_RA_PROC_OK=`egrep -c "\[RAPROC\] RA procedure succeeded" $RA_UE_LOG`
|
||||||
# #UE RA check
|
|
||||||
# UE_RA_PROC_OK=`egrep -c "RA procedure succeeded" $RA_UE_LOG`
|
|
||||||
#
|
if [ $GNB_RECEIVED -gt 0 ] && [ $UE_RA_PROC_OK -gt 0 ]
|
||||||
#
|
then
|
||||||
# if [ $GNB_RECEIVED -gt 0 ] && [ $GNB_CONNECTED -gt 0 ] && [ $UE_RA_PROC_OK -gt 0 ]
|
echo " <td bgcolor = \"green\" >OK</td>" >> ./test_simulator_results.html
|
||||||
# then
|
else
|
||||||
# echo " <td bgcolor = \"green\" >OK</td>" >> ./test_simulator_results.html
|
echo " <td bgcolor = \"red\" >KO</td>" >> ./test_simulator_results.html
|
||||||
# else
|
fi
|
||||||
# echo " <td bgcolor = \"red\" >KO</td>" >> ./test_simulator_results.html
|
|
||||||
# fi
|
echo " <td><pre>" >> ./test_simulator_results.html
|
||||||
#
|
if [ $GNB_RECEIVED -gt 0 ]
|
||||||
# echo " <td><pre>" >> ./test_simulator_results.html
|
then
|
||||||
# if [ $GNB_RECEIVED -gt 0 ]
|
echo "<font color = \"blue\">- gNB --> RA received</font>" >> ./test_simulator_results.html
|
||||||
# then
|
else
|
||||||
# echo "<font color = \"blue\">- gNB --> RA received</font>" >> ./test_simulator_results.html
|
echo "<font color = \"red\"><b>- gNB RA NOT RECEIVED</b></font>" >> ./test_simulator_results.html
|
||||||
# else
|
fi
|
||||||
# echo "<font color = \"red\"><b>- gNB RA NOT RECEIVED</b></font>" >> ./test_simulator_results.html
|
if [ $UE_RA_PROC_OK -gt 0 ]
|
||||||
# fi
|
then
|
||||||
# if [ $GNB_CONNECTED -gt 0 ]
|
echo "<font color = \"blue\">- NR UE --> RA procedure succeded</font>" >> ./test_simulator_results.html
|
||||||
# then
|
else
|
||||||
# echo "<font color = \"blue\">- gNB --> 5G connected</font>" >> ./test_simulator_results.html
|
echo "<font color = \"red\"><b>- NR UE RA procedure failed</b></font>" >> ./test_simulator_results.html
|
||||||
# else
|
fi
|
||||||
# echo "<font color = \"red\"><b>- gNB NOT 5G CONNECTED</b></font>" >> ./test_simulator_results.html
|
echo " </pre></td>" >> ./test_simulator_results.html
|
||||||
# fi
|
echo " </tr>" >> ./test_simulator_results.html
|
||||||
# if [ $UE_RA_PROC_OK -gt 0 ]
|
fi
|
||||||
# then
|
|
||||||
# echo "<font color = \"blue\">- NR UE --> RA procedure succeded</font>" >> ./test_simulator_results.html
|
|
||||||
# else
|
|
||||||
# echo "<font color = \"red\"><b>- NR UE RA procedure failed</b></font>" >> ./test_simulator_results.html
|
|
||||||
# fi
|
|
||||||
# echo " </pre></td>" >> ./test_simulator_results.html
|
|
||||||
# echo " </tr>" >> ./test_simulator_results.html
|
|
||||||
# fi
|
|
||||||
|
|
||||||
#SYNC test
|
#SYNC test
|
||||||
ENB_LOG=$ARCHIVES_LOC/${TMODE}_${BW}prb_${CN_CONFIG}_gnb.log
|
ENB_LOG=$ARCHIVES_LOC/${TMODE}_${BW}prb_${CN_CONFIG}_gnb.log
|
||||||
|
|||||||
+66
-104
@@ -281,14 +281,35 @@ function check_ra_result {
|
|||||||
local LOC_GNB_LOG=$1
|
local LOC_GNB_LOG=$1
|
||||||
local LOC_UE_LOG=$2
|
local LOC_UE_LOG=$2
|
||||||
|
|
||||||
#gNB RA test
|
#if log files exist
|
||||||
echo "Checking gNB Log for RA success"
|
if [ -f $LOC_GNB_LOG ] && [ -f $LOC_UE_LOG ]
|
||||||
egrep "received correctly" $1
|
then
|
||||||
egrep "now 5G connected" $1
|
|
||||||
|
#gNB RA test
|
||||||
#UE RA test
|
#console check
|
||||||
echo 'Checking UE Log for RA success'
|
echo "Checking gNB Log for RA success"
|
||||||
egrep "RA procedure succeeded" $2
|
egrep "\[RAPROC\] PUSCH with TC_RNTI (.+) received correctly" $1
|
||||||
|
#script check
|
||||||
|
local GNB_COMPLETE=`egrep -c "\[RAPROC\] PUSCH with TC_RNTI (.+) received correctly" $1`
|
||||||
|
|
||||||
|
#UE RA test
|
||||||
|
#console check
|
||||||
|
echo 'Checking UE Log for RA success'
|
||||||
|
egrep "\[RAPROC\] RA procedure succeeded" $2
|
||||||
|
#script check
|
||||||
|
local UE_COMPLETE=`egrep -c "\[RAPROC\] RA procedure succeeded" $2`
|
||||||
|
|
||||||
|
#generate status
|
||||||
|
if [ $GNB_COMPLETE -eq 0 ] || [ $UE_COMPLETE -eq 0 ]
|
||||||
|
then
|
||||||
|
RA_STATUS=-1
|
||||||
|
echo "RA test FAILED, could not find the markers"
|
||||||
|
fi
|
||||||
|
#case where log files do not exist
|
||||||
|
else
|
||||||
|
echo "RA test log files not present"
|
||||||
|
RA_STATUS=-1
|
||||||
|
fi
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1225,16 +1246,6 @@ function start_rf_sim_gnb {
|
|||||||
ssh -T -o StrictHostKeyChecking=no ubuntu@$LOC_GNB_VM_IP_ADDR < $1
|
ssh -T -o StrictHostKeyChecking=no ubuntu@$LOC_GNB_VM_IP_ADDR < $1
|
||||||
rm $1
|
rm $1
|
||||||
|
|
||||||
# For the moment, in RA test, no check and no copy of generated raw files
|
|
||||||
if [ $LOC_RA_TEST -eq 1 ] # RA test
|
|
||||||
then
|
|
||||||
sleep 30
|
|
||||||
echo "echo \"free -m\"" > $1
|
|
||||||
echo "free -m" >> $1
|
|
||||||
ssh -T -o StrictHostKeyChecking=no ubuntu@$LOC_GNB_VM_IP_ADDR < $1
|
|
||||||
rm $1
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
local i="0"
|
local i="0"
|
||||||
echo "egrep -c \"got sync\" /home/ubuntu/tmp/cmake_targets/log/$LOC_LOG_FILE" > $1
|
echo "egrep -c \"got sync\" /home/ubuntu/tmp/cmake_targets/log/$LOC_LOG_FILE" > $1
|
||||||
@@ -1258,7 +1269,9 @@ function start_rf_sim_gnb {
|
|||||||
GNB_SYNC=1
|
GNB_SYNC=1
|
||||||
echo "RF-SIM gNB is sync'ed: waiting for UE(s) to connect"
|
echo "RF-SIM gNB is sync'ed: waiting for UE(s) to connect"
|
||||||
fi
|
fi
|
||||||
if [ $LOC_S1_CONFIGURATION -eq 0 ]
|
|
||||||
|
# check noS1 config only outside RA test (as it does not support noS1)
|
||||||
|
if [ $LOC_S1_CONFIGURATION -eq 0 ] && [ $LOC_RA_TEST -eq 0 ]
|
||||||
then
|
then
|
||||||
echo "ifconfig oaitun_enb1 | egrep -c \"inet addr\"" > $1
|
echo "ifconfig oaitun_enb1 | egrep -c \"inet addr\"" > $1
|
||||||
# Checking oaitun_enb1 interface has now an IP address
|
# Checking oaitun_enb1 interface has now an IP address
|
||||||
@@ -1341,14 +1354,6 @@ function start_rf_sim_nr_ue {
|
|||||||
ssh -T -o StrictHostKeyChecking=no ubuntu@$LOC_NR_UE_VM_IP_ADDR < $1
|
ssh -T -o StrictHostKeyChecking=no ubuntu@$LOC_NR_UE_VM_IP_ADDR < $1
|
||||||
rm $1
|
rm $1
|
||||||
|
|
||||||
# In case of RA test mode, no UE sync check for the moment.
|
|
||||||
# To be removed later?
|
|
||||||
if [ $LOC_RA_TEST -eq 1 ] # RA test
|
|
||||||
then
|
|
||||||
sleep 30
|
|
||||||
NR_UE_SYNC=1
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
local i="0"
|
local i="0"
|
||||||
echo "egrep -c \"Initial sync: pbch decoded sucessfully\" /home/ubuntu/tmp/cmake_targets/log/$LOC_LOG_FILE" > $1
|
echo "egrep -c \"Initial sync: pbch decoded sucessfully\" /home/ubuntu/tmp/cmake_targets/log/$LOC_LOG_FILE" > $1
|
||||||
while [ $i -lt 10 ]
|
while [ $i -lt 10 ]
|
||||||
@@ -1372,11 +1377,13 @@ function start_rf_sim_nr_ue {
|
|||||||
else
|
else
|
||||||
echo "RF-SIM NR-UE is sync'ed w/ gNB"
|
echo "RF-SIM NR-UE is sync'ed w/ gNB"
|
||||||
fi
|
fi
|
||||||
# Checking oaitun_ue1 interface has now an IP address
|
# Checking oaitun_ue1 interface has now an IP address (only outside RA test)
|
||||||
i="0"
|
if [ $LOC_RA_TEST -eq 0 ]
|
||||||
echo "ifconfig oaitun_ue1 | egrep -c \"inet addr\"" > $1
|
then
|
||||||
while [ $i -lt 10 ]
|
i="0"
|
||||||
do
|
echo "ifconfig oaitun_ue1 | egrep -c \"inet addr\"" > $1
|
||||||
|
while [ $i -lt 10 ]
|
||||||
|
do
|
||||||
sleep 5
|
sleep 5
|
||||||
CONNECTED=`ssh -T -o StrictHostKeyChecking=no ubuntu@$LOC_NR_UE_VM_IP_ADDR < $1`
|
CONNECTED=`ssh -T -o StrictHostKeyChecking=no ubuntu@$LOC_NR_UE_VM_IP_ADDR < $1`
|
||||||
if [ $CONNECTED -eq 1 ]
|
if [ $CONNECTED -eq 1 ]
|
||||||
@@ -1385,21 +1392,20 @@ function start_rf_sim_nr_ue {
|
|||||||
else
|
else
|
||||||
i=$[$i+1]
|
i=$[$i+1]
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
echo "echo \"free -m\"" > $1
|
echo "echo \"free -m\"" > $1
|
||||||
echo "free -m" >> $1
|
echo "free -m" >> $1
|
||||||
ssh -T -o StrictHostKeyChecking=no ubuntu@$LOC_NR_UE_VM_IP_ADDR < $1
|
ssh -T -o StrictHostKeyChecking=no ubuntu@$LOC_NR_UE_VM_IP_ADDR < $1
|
||||||
rm $1
|
rm $1
|
||||||
if [ $i -lt 50 ]
|
if [ $i -lt 50 ]
|
||||||
then
|
then
|
||||||
NR_UE_SYNC=0
|
NR_UE_SYNC=0
|
||||||
echo "RF-SIM NR-UE oaitun_ue1 is DOWN or NOT CONFIGURED"
|
echo "RF-SIM NR-UE oaitun_ue1 is DOWN or NOT CONFIGURED"
|
||||||
else
|
else
|
||||||
echo "RF-SIM NR-UE oaitun_ue1 is UP and CONFIGURED"
|
echo "RF-SIM NR-UE oaitun_ue1 is UP and CONFIGURED"
|
||||||
fi
|
fi
|
||||||
sleep 10
|
sleep 10
|
||||||
|
fi
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -2196,10 +2202,11 @@ function run_test_on_vm {
|
|||||||
NR_STATUS=0
|
NR_STATUS=0
|
||||||
|
|
||||||
######### start of RA TEST loop
|
######### start of RA TEST loop
|
||||||
while [ $try_cnt -lt 1 ]
|
while [ $try_cnt -lt 10 ] #10 because it hardly succeed within CI
|
||||||
do
|
do
|
||||||
|
|
||||||
SYNC_STATUS=0
|
SYNC_STATUS=0
|
||||||
|
RA_STATUS=0
|
||||||
|
|
||||||
echo "############################################################"
|
echo "############################################################"
|
||||||
echo "${CN_CONFIG} : Starting the gNB"
|
echo "${CN_CONFIG} : Starting the gNB"
|
||||||
@@ -2241,71 +2248,25 @@ function run_test_on_vm {
|
|||||||
echo "############################################################"
|
echo "############################################################"
|
||||||
|
|
||||||
# Proper check to be done when RA test is working!
|
# Proper check to be done when RA test is working!
|
||||||
#check_ra_result $ARCHIVES_LOC/$CURRENT_GNB_LOG_FILE $ARCHIVES_LOC/$CURRENT_NR_UE_LOG_FILE
|
check_ra_result $ARCHIVES_LOC/$CURRENT_GNB_LOG_FILE $ARCHIVES_LOC/$CURRENT_NR_UE_LOG_FILE
|
||||||
|
if [ $RA_STATUS -ne 0 ]
|
||||||
try_cnt=$[$try_cnt+1]
|
then
|
||||||
|
echo "RA test NOT OK"
|
||||||
########### end RA test
|
try_cnt=$[$try_cnt+1]
|
||||||
|
else
|
||||||
|
try_cnt=$[$try_cnt+10]
|
||||||
|
fi
|
||||||
done
|
done
|
||||||
sleep 10
|
########### end RA test
|
||||||
try_cnt="0"
|
|
||||||
|
sleep 30
|
||||||
|
|
||||||
|
|
||||||
######### start of PHY TEST loop
|
######### start of PHY TEST loop
|
||||||
|
try_cnt="0"
|
||||||
while [ $try_cnt -lt 4 ]
|
while [ $try_cnt -lt 4 ]
|
||||||
do
|
do
|
||||||
|
|
||||||
#start RA test
|
|
||||||
SYNC_STATUS=0
|
|
||||||
PING_STATUS=0
|
|
||||||
IPERF_STATUS=0
|
|
||||||
|
|
||||||
echo "############################################################"
|
|
||||||
echo "${CN_CONFIG} : Starting the gNB"
|
|
||||||
echo "############################################################"
|
|
||||||
CURRENT_GNB_LOG_FILE=tdd_${PRB}prb_${CN_CONFIG}_gnb.log
|
|
||||||
#last argument = 1 is to enable --do-ra for RA test
|
|
||||||
start_rf_sim_gnb $GNB_VM_CMDS "$GNB_VM_IP_ADDR" $CURRENT_GNB_LOG_FILE $PRB $CONF_FILE $S1_NOS1_CFG 1
|
|
||||||
|
|
||||||
echo "############################################################"
|
|
||||||
echo "${CN_CONFIG} : Starting the NR-UE"
|
|
||||||
echo "############################################################"
|
|
||||||
CURRENT_NR_UE_LOG_FILE=tdd_${PRB}prb_${CN_CONFIG}_ue.log
|
|
||||||
#last argument = 1 is to enable --do-ra for RA test
|
|
||||||
start_rf_sim_nr_ue $NR_UE_VM_CMDS $NR_UE_VM_IP_ADDR $GNB_VM_IP_ADDR $CURRENT_NR_UE_LOG_FILE $PRB $FREQUENCY $S1_NOS1_CFG 1
|
|
||||||
if [ $NR_UE_SYNC -eq 0 ]
|
|
||||||
then
|
|
||||||
echo "Problem w/ gNB and NR-UE not syncing"
|
|
||||||
terminate_enb_ue_basic_sim $NR_UE_VM_CMDS $NR_UE_VM_IP_ADDR 2
|
|
||||||
terminate_enb_ue_basic_sim $GNB_VM_CMDS $GNB_VM_IP_ADDR 1
|
|
||||||
scp -o StrictHostKeyChecking=no ubuntu@$GNB_VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_GNB_LOG_FILE $ARCHIVES_LOC
|
|
||||||
scp -o StrictHostKeyChecking=no ubuntu@$NR_UE_VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_NR_UE_LOG_FILE $ARCHIVES_LOC
|
|
||||||
SYNC_STATUS=-1
|
|
||||||
try_cnt=$[$try_cnt+1]
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "############################################################"
|
|
||||||
echo "${CN_CONFIG} : Terminate gNB/NR-UE simulators"
|
|
||||||
echo "############################################################"
|
|
||||||
sleep 20
|
|
||||||
terminate_enb_ue_basic_sim $NR_UE_VM_CMDS $NR_UE_VM_IP_ADDR 2
|
|
||||||
terminate_enb_ue_basic_sim $GNB_VM_CMDS $GNB_VM_IP_ADDR 1
|
|
||||||
scp -o StrictHostKeyChecking=no ubuntu@$GNB_VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_GNB_LOG_FILE $ARCHIVES_LOC
|
|
||||||
scp -o StrictHostKeyChecking=no ubuntu@$NR_UE_VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_NR_UE_LOG_FILE $ARCHIVES_LOC
|
|
||||||
|
|
||||||
#check RA markers in gNB and NR UE log files
|
|
||||||
echo "############################################################"
|
|
||||||
echo "${CN_CONFIG} : Checking RA on gNB / NR-UE"
|
|
||||||
echo "############################################################"
|
|
||||||
|
|
||||||
mv $ARCHIVES_LOC/$CURRENT_GNB_LOG_FILE $ARCHIVES_LOC/ra_check_$CURRENT_GNB_LOG_FILE
|
|
||||||
mv $ARCHIVES_LOC/$CURRENT_NR_UE_LOG_FILE $ARCHIVES_LOC/ra_check_$CURRENT_NR_UE_LOG_FILE
|
|
||||||
# Proper check to be done when RA test is working!
|
|
||||||
#check_ra_result $ARCHIVES_LOC/ra_check_$CURRENT_GNB_LOG_FILE $ARCHIVES_LOC/ra_check_$CURRENT_NR_UE_LOG_FILE
|
|
||||||
|
|
||||||
|
|
||||||
#end RA test
|
|
||||||
sleep 30
|
|
||||||
|
|
||||||
SYNC_STATUS=0
|
SYNC_STATUS=0
|
||||||
PING_STATUS=0
|
PING_STATUS=0
|
||||||
@@ -2409,6 +2370,7 @@ function run_test_on_vm {
|
|||||||
echo "Checking run status"
|
echo "Checking run status"
|
||||||
echo "############################################################"
|
echo "############################################################"
|
||||||
|
|
||||||
|
if [ $RA_STATUS -ne 0 ]; then NR_STATUS=-1; fi
|
||||||
if [ $SYNC_STATUS -ne 0 ]; then NR_STATUS=-1; fi
|
if [ $SYNC_STATUS -ne 0 ]; then NR_STATUS=-1; fi
|
||||||
if [ $PING_STATUS -ne 0 ]; then NR_STATUS=-1; fi
|
if [ $PING_STATUS -ne 0 ]; then NR_STATUS=-1; fi
|
||||||
if [ $IPERF_STATUS -ne 0 ]; then NR_STATUS=-1; fi
|
if [ $IPERF_STATUS -ne 0 ]; then NR_STATUS=-1; fi
|
||||||
|
|||||||
@@ -25,6 +25,7 @@
|
|||||||
<htmlTabName>Test-LTE-M-10MHz-TM1</htmlTabName>
|
<htmlTabName>Test-LTE-M-10MHz-TM1</htmlTabName>
|
||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
<repeatCount>1</repeatCount>
|
<repeatCount>1</repeatCount>
|
||||||
|
<TestUnstable>True</TestUnstable>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
030201
|
030201
|
||||||
040102
|
040102
|
||||||
|
|||||||
@@ -26,6 +26,8 @@
|
|||||||
<htmlTabName>Test-05MHz-TM2</htmlTabName>
|
<htmlTabName>Test-05MHz-TM2</htmlTabName>
|
||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
<repeatCount>2</repeatCount>
|
<repeatCount>2</repeatCount>
|
||||||
|
<TestUnstable>True</TestUnstable>
|
||||||
|
<TestMinId>040608</TestMinId>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
030201
|
030201
|
||||||
040101
|
040101
|
||||||
|
|||||||
@@ -24,6 +24,8 @@
|
|||||||
<htmlTabRef>test-10-tm1</htmlTabRef>
|
<htmlTabRef>test-10-tm1</htmlTabRef>
|
||||||
<htmlTabName>Test-10MHz-TM1</htmlTabName>
|
<htmlTabName>Test-10MHz-TM1</htmlTabName>
|
||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
|
<TestUnstable>True</TestUnstable>
|
||||||
|
<TestMinId>040615</TestMinId>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
030201
|
030201
|
||||||
040101
|
040101
|
||||||
|
|||||||
@@ -25,6 +25,8 @@
|
|||||||
<htmlTabName>Test-20MHz-TM1</htmlTabName>
|
<htmlTabName>Test-20MHz-TM1</htmlTabName>
|
||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
<repeatCount>4</repeatCount>
|
<repeatCount>4</repeatCount>
|
||||||
|
<TestUnstable>True</TestUnstable>
|
||||||
|
<TestMinId>040623</TestMinId>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
030201
|
030201
|
||||||
040101
|
040101
|
||||||
|
|||||||
@@ -24,6 +24,8 @@
|
|||||||
<htmlTabRef>test-20-tm1-defSched</htmlTabRef>
|
<htmlTabRef>test-20-tm1-defSched</htmlTabRef>
|
||||||
<htmlTabName>Test-20MHz-TM1-default-scheduler</htmlTabName>
|
<htmlTabName>Test-20MHz-TM1-default-scheduler</htmlTabName>
|
||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
|
<TestUnstable>True</TestUnstable>
|
||||||
|
<TestMinId>040522</TestMinId>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
030201
|
030201
|
||||||
040101
|
040101
|
||||||
|
|||||||
@@ -0,0 +1,49 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
-->
|
||||||
|
<testCaseList>
|
||||||
|
<htmlTabRef>epc-start-tab</htmlTabRef>
|
||||||
|
<htmlTabName>EPC-Start</htmlTabName>
|
||||||
|
<htmlTabIcon>log-in</htmlTabIcon>
|
||||||
|
<TestCaseRequestedList>
|
||||||
|
000100 000101 000102
|
||||||
|
</TestCaseRequestedList>
|
||||||
|
<TestCaseExclusionList>
|
||||||
|
</TestCaseExclusionList>
|
||||||
|
|
||||||
|
<testCase id="000100">
|
||||||
|
<class>Initialize_HSS</class>
|
||||||
|
<desc>Initialize HSS</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="000101">
|
||||||
|
<class>Initialize_MME</class>
|
||||||
|
<desc>Initialize MME</desc>
|
||||||
|
<option>mme-verizon.conf</option>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="000102">
|
||||||
|
<class>Initialize_SPGW</class>
|
||||||
|
<desc>Initialize SPGW</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
</testCaseList>
|
||||||
@@ -0,0 +1,151 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
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
|
||||||
|
030101 040301 040501 040603 040604 040605 040606 040607 040641 040642 040643 040644 040401 040201 030201
|
||||||
|
|
||||||
|
-->
|
||||||
|
<testCaseList>
|
||||||
|
<htmlTabRef>test-05-tm1</htmlTabRef>
|
||||||
|
<htmlTabName>Test-05MHz-TM1</htmlTabName>
|
||||||
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
|
<TestCaseRequestedList>
|
||||||
|
030201
|
||||||
|
040101
|
||||||
|
030101 040301 000001 040501 040603 040401 030201
|
||||||
|
</TestCaseRequestedList>
|
||||||
|
<TestCaseExclusionList></TestCaseExclusionList>
|
||||||
|
|
||||||
|
<testCase id="000001">
|
||||||
|
<class>IdleSleep</class>
|
||||||
|
<desc>Sleep</desc>
|
||||||
|
<idle_sleep_time_in_sec>5</idle_sleep_time_in_sec>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030101">
|
||||||
|
<class>Initialize_eNB</class>
|
||||||
|
<desc>Initialize eNB (FDD/Band7/5MHz)</desc>
|
||||||
|
<Initialize_eNB_args>-O ci-scripts/conf_files/enb.band7.tm1.25PRB.usrpb210.conf --eNBs.[0].plmn_list.[0].mcc 311 --eNBs.[0].plmn_list.[0].mnc 480 --eNBs.[0].plmn_list.[0].mnc_length 3 --eNBs.[0].component_carriers.[0].Nid_cell 10</Initialize_eNB_args>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030201">
|
||||||
|
<class>Terminate_eNB</class>
|
||||||
|
<desc>Terminate eNB</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040101">
|
||||||
|
<class>Initialize_UE</class>
|
||||||
|
<desc>Initialize UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040201">
|
||||||
|
<class>Terminate_UE</class>
|
||||||
|
<desc>Terminate UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040301">
|
||||||
|
<class>Attach_UE</class>
|
||||||
|
<desc>Attach UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040401">
|
||||||
|
<class>Detach_UE</class>
|
||||||
|
<desc>Detach UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040501">
|
||||||
|
<class>Ping</class>
|
||||||
|
<desc>ping (5MHz - 20 sec)</desc>
|
||||||
|
<ping_args>-c 20</ping_args>
|
||||||
|
<ping_packetloss_threshold>5</ping_packetloss_threshold>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040603">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (5MHz - DL/15Mbps/UDP)(30 sec)(balanced profile)</desc>
|
||||||
|
<iperf_args>-u -b 15M -t 30 -i 1</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>balanced</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040604">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (5MHz - DL/15Mbps/UDP)(30 sec)(single-ue profile)</desc>
|
||||||
|
<iperf_args>-u -b 15M -t 30 -i 1</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040605">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (5MHz - DL/15Mbps/UDP)(30 sec)(unbalanced profile)</desc>
|
||||||
|
<iperf_args>-u -b 15M -t 30 -i 1</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>unbalanced</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040606">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (5MHz - DL/TCP)(30 sec)(single-ue profile)</desc>
|
||||||
|
<iperf_args>-t 30 -i 1 -fm</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040607">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (5MHz - DL/TCP)(30 sec)(balanced profile)</desc>
|
||||||
|
<iperf_args>-t 30 -i 1 -fm</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>balanced</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040641">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (5MHz - UL/9Mbps/UDP)(30 sec)(balanced profile)</desc>
|
||||||
|
<iperf_args>-u -b 9M -t 30 -i 1 -R</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>balanced</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040642">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (5MHz - UL/9Mbps/UDP)(30 sec)(single-ue profile)</desc>
|
||||||
|
<iperf_args>-u -b 9M -t 30 -i 1 -R</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040643">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (5MHz - UL/TCP)(30 sec)(single-ue profile)</desc>
|
||||||
|
<iperf_args>-t 30 -i 1 -fm -R</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040644">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (5MHz - UL/TCP)(30 sec)(balanced profile)</desc>
|
||||||
|
<iperf_args>-t 30 -i 1 -fm -R</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>balanced</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
</testCaseList>
|
||||||
@@ -25,6 +25,8 @@
|
|||||||
<htmlTabName>Test-10MHz</htmlTabName>
|
<htmlTabName>Test-10MHz</htmlTabName>
|
||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
<repeatCount>2</repeatCount>
|
<repeatCount>2</repeatCount>
|
||||||
|
<TestUnstable>True</TestUnstable>
|
||||||
|
<TestMinId>040612</TestMinId>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
030201
|
030201
|
||||||
040101
|
040101
|
||||||
|
|||||||
@@ -26,6 +26,7 @@
|
|||||||
<htmlTabName>Test-X2-HO-FDD-05MHz-TM1</htmlTabName>
|
<htmlTabName>Test-X2-HO-FDD-05MHz-TM1</htmlTabName>
|
||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
<repeatCount>2</repeatCount>
|
<repeatCount>2</repeatCount>
|
||||||
|
<TestUnstable>True</TestUnstable>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
030201 030202
|
030201 030202
|
||||||
040101
|
040101
|
||||||
|
|||||||
@@ -825,7 +825,6 @@ add_boolean_option(MESSAGE_CHART_GENERATOR_PHY False "trace some PHY exchang
|
|||||||
add_boolean_option(UE_EXPANSION False "enable UE_EXPANSION with max 256 UE")
|
add_boolean_option(UE_EXPANSION False "enable UE_EXPANSION with max 256 UE")
|
||||||
add_boolean_option(PHY_TX_THREAD False "enable UE_EXPANSION with max 256 UE")
|
add_boolean_option(PHY_TX_THREAD False "enable UE_EXPANSION with max 256 UE")
|
||||||
add_boolean_option(PRE_SCD_THREAD False "enable UE_EXPANSION with max 256 UE")
|
add_boolean_option(PRE_SCD_THREAD False "enable UE_EXPANSION with max 256 UE")
|
||||||
add_boolean_option(UESIM_EXPANSION False "enable UESIM_EXPANSION with max 256 UE")
|
|
||||||
|
|
||||||
########################
|
########################
|
||||||
# Include order
|
# Include order
|
||||||
@@ -1594,6 +1593,7 @@ set(PHY_SRC_UE
|
|||||||
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_ulsch_llr_computation.c
|
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_ulsch_llr_computation.c
|
||||||
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c
|
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c
|
||||||
${OPENAIR1_DIR}/PHY/NR_REFSIG/nr_dmrs_rx.c
|
${OPENAIR1_DIR}/PHY/NR_REFSIG/nr_dmrs_rx.c
|
||||||
|
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_csi_rs.c
|
||||||
${OPENAIR1_DIR}/PHY/NR_REFSIG/nr_gold.c
|
${OPENAIR1_DIR}/PHY/NR_REFSIG/nr_gold.c
|
||||||
${OPENAIR1_DIR}/PHY/NR_REFSIG/scrambling_luts.c
|
${OPENAIR1_DIR}/PHY/NR_REFSIG/scrambling_luts.c
|
||||||
${OPENAIR1_DIR}/PHY/NR_REFSIG/nr_gen_mod_table.c
|
${OPENAIR1_DIR}/PHY/NR_REFSIG/nr_gen_mod_table.c
|
||||||
|
|||||||
@@ -42,7 +42,6 @@ MSC_GEN=0
|
|||||||
XFORMS="True"
|
XFORMS="True"
|
||||||
SKIP_SHARED_LIB_FLAG="False"
|
SKIP_SHARED_LIB_FLAG="False"
|
||||||
UE_EXPANSION="False"
|
UE_EXPANSION="False"
|
||||||
UESIM_EXPANSION="False"
|
|
||||||
PRINT_STATS="False"
|
PRINT_STATS="False"
|
||||||
VCD_TIMING="False"
|
VCD_TIMING="False"
|
||||||
DEADLINE_SCHEDULER_FLAG_USER=""
|
DEADLINE_SCHEDULER_FLAG_USER=""
|
||||||
@@ -264,10 +263,6 @@ function main() {
|
|||||||
UE_EXPANSION="True"
|
UE_EXPANSION="True"
|
||||||
echo_info "Will compile with UE_EXPANSION"
|
echo_info "Will compile with UE_EXPANSION"
|
||||||
shift;;
|
shift;;
|
||||||
--musim)
|
|
||||||
UESIM_EXPANSION="True"
|
|
||||||
echo_info "Will compile with UESIM_EXPANSION"
|
|
||||||
shift;;
|
|
||||||
--UE-conf-nvram)
|
--UE-conf-nvram)
|
||||||
conf_nvram_path=$(readlink -f $2)
|
conf_nvram_path=$(readlink -f $2)
|
||||||
shift 2;;
|
shift 2;;
|
||||||
@@ -593,7 +588,6 @@ function main() {
|
|||||||
echo "set ( UE_EXPANSION $UE_EXPANSION )" >> $cmake_file
|
echo "set ( UE_EXPANSION $UE_EXPANSION )" >> $cmake_file
|
||||||
# echo "set ( PHY_TX_THREAD $UE_EXPANSION )" >> $cmake_file
|
# echo "set ( PHY_TX_THREAD $UE_EXPANSION )" >> $cmake_file
|
||||||
echo "set ( PRE_SCD_THREAD $UE_EXPANSION )" >> $cmake_file
|
echo "set ( PRE_SCD_THREAD $UE_EXPANSION )" >> $cmake_file
|
||||||
echo "set ( UESIM_EXPANSION $UESIM_EXPANSION )" >> $cmake_file
|
|
||||||
echo "set ( ENABLE_VCD_FIFO $VCD_TIMING )" >> $cmake_file
|
echo "set ( ENABLE_VCD_FIFO $VCD_TIMING )" >> $cmake_file
|
||||||
echo "set ( RF_BOARD \"${HW}\")" >> $cmake_file
|
echo "set ( RF_BOARD \"${HW}\")" >> $cmake_file
|
||||||
echo "set ( TRANSP_PRO \"${TP}\")" >> $cmake_file
|
echo "set ( TRANSP_PRO \"${TP}\")" >> $cmake_file
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ set ( CMAKE_BUILD_TYPE )
|
|||||||
set ( CFLAGS_PROCESSOR_USER "" )
|
set ( CFLAGS_PROCESSOR_USER "" )
|
||||||
set ( UE_EXPANSION False )
|
set ( UE_EXPANSION False )
|
||||||
set ( PRE_SCD_THREAD False )
|
set ( PRE_SCD_THREAD False )
|
||||||
set ( UESIM_EXPANSION False )
|
|
||||||
set ( ENABLE_VCD_FIFO False )
|
set ( ENABLE_VCD_FIFO False )
|
||||||
set ( RF_BOARD "None")
|
set ( RF_BOARD "None")
|
||||||
set ( TRANSP_PRO "None")
|
set ( TRANSP_PRO "None")
|
||||||
|
|||||||
@@ -85,6 +85,10 @@ ID = ENB_PHY_MIB
|
|||||||
DESC = MIB data
|
DESC = MIB data
|
||||||
GROUP = ALL:PHY:ENB:WIRESHARK
|
GROUP = ALL:PHY:ENB:WIRESHARK
|
||||||
FORMAT = int,eNB_ID : int,frame : int,subframe : buffer,data
|
FORMAT = int,eNB_ID : int,frame : int,subframe : buffer,data
|
||||||
|
ID = GNB_PHY_MIB
|
||||||
|
DESC = NR MIB data
|
||||||
|
GROUP = ALL:PHY:GNB:WIRESHARK
|
||||||
|
FORMAT = int,gNB_ID : int,frame : int,slot : buffer,data
|
||||||
|
|
||||||
#MAC logs
|
#MAC logs
|
||||||
ID = ENB_MAC_UE_DL_SDU
|
ID = ENB_MAC_UE_DL_SDU
|
||||||
@@ -131,6 +135,18 @@ ID = ENB_MAC_UE_DL_RAR_PDU_WITH_DATA
|
|||||||
DESC = MAC downlink PDU for an UE
|
DESC = MAC downlink PDU for an UE
|
||||||
GROUP = ALL:MAC:ENB:WIRESHARK
|
GROUP = ALL:MAC:ENB:WIRESHARK
|
||||||
FORMAT = int,eNB_ID : int,CC_id : int,rnti : int,frame : int,subframe : int,harq_pid : buffer,data
|
FORMAT = int,eNB_ID : int,CC_id : int,rnti : int,frame : int,subframe : int,harq_pid : buffer,data
|
||||||
|
ID = GNB_MAC_DL_PDU_WITH_DATA
|
||||||
|
DESC = NR MAC downlink PDU for an UE
|
||||||
|
GROUP = ALL:MAC:GNB:WIRESHARK
|
||||||
|
FORMAT = int,gNB_ID : int,CC_id : int,rnti : int,frame : int,slot : int,harq_pid : buffer,data
|
||||||
|
ID = GNB_MAC_UL_PDU_WITH_DATA
|
||||||
|
DESC = NR MAC uplink PDU for an UE
|
||||||
|
GROUP = ALL:MAC:GNB:WIRESHARK
|
||||||
|
FORMAT = int,gNB_ID : int,CC_id : int,rnti : int,frame : int,slot : int,harq_pid : buffer,data
|
||||||
|
ID = GNB_MAC_DL_RAR_PDU_WITH_DATA
|
||||||
|
DESC = NR MAC downlink PDU for RAR
|
||||||
|
GROUP = ALL:MAC:GNB:WIRESHARK
|
||||||
|
FORMAT = int,gNB_ID : int,CC_id : int,rnti : int,frame : int,slot : int,harq_pid : buffer,data
|
||||||
|
|
||||||
#RLC logs
|
#RLC logs
|
||||||
ID = ENB_RLC_DL
|
ID = ENB_RLC_DL
|
||||||
|
|||||||
@@ -23,6 +23,8 @@ typedef struct {
|
|||||||
int socket;
|
int socket;
|
||||||
struct sockaddr_in to;
|
struct sockaddr_in to;
|
||||||
OBUF buf;
|
OBUF buf;
|
||||||
|
|
||||||
|
/* LTE traces */
|
||||||
/* ul */
|
/* ul */
|
||||||
int ul_rnti;
|
int ul_rnti;
|
||||||
int ul_frame;
|
int ul_frame;
|
||||||
@@ -46,6 +48,28 @@ typedef struct {
|
|||||||
int rar_frame;
|
int rar_frame;
|
||||||
int rar_subframe;
|
int rar_subframe;
|
||||||
int rar_data;
|
int rar_data;
|
||||||
|
|
||||||
|
/* NR traces */
|
||||||
|
/* NR ul */
|
||||||
|
int nr_ul_rnti;
|
||||||
|
int nr_ul_frame;
|
||||||
|
int nr_ul_slot;
|
||||||
|
int nr_ul_data;
|
||||||
|
/* NR dl */
|
||||||
|
int nr_dl_rnti;
|
||||||
|
int nr_dl_frame;
|
||||||
|
int nr_dl_slot;
|
||||||
|
int nr_dl_data;
|
||||||
|
/* NR mib */
|
||||||
|
int nr_mib_frame;
|
||||||
|
int nr_mib_slot;
|
||||||
|
int nr_mib_data;
|
||||||
|
/* NR RAR */
|
||||||
|
int nr_rar_rnti;
|
||||||
|
int nr_rar_frame;
|
||||||
|
int nr_rar_slot;
|
||||||
|
int nr_rar_data;
|
||||||
|
|
||||||
/* config */
|
/* config */
|
||||||
int no_mib;
|
int no_mib;
|
||||||
int no_sib;
|
int no_sib;
|
||||||
@@ -58,8 +82,13 @@ typedef struct {
|
|||||||
int cur_sib;
|
int cur_sib;
|
||||||
} ev_data;
|
} ev_data;
|
||||||
|
|
||||||
void trace(ev_data *d, int direction, int rnti_type, int rnti,
|
/****************************************************************************/
|
||||||
int frame, int subframe, void *buf, int bufsize, int preamble) {
|
/* LTE */
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
void trace_lte(ev_data *d, int direction, int rnti_type, int rnti,
|
||||||
|
int frame, int subframe, void *buf, int bufsize, int preamble)
|
||||||
|
{
|
||||||
ssize_t ret;
|
ssize_t ret;
|
||||||
int fsf;
|
int fsf;
|
||||||
int i;
|
int i;
|
||||||
@@ -100,15 +129,17 @@ void trace(ev_data *d, int direction, int rnti_type, int rnti,
|
|||||||
if (ret != d->buf.osize) abort();
|
if (ret != d->buf.osize) abort();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ul(void *_d, event e) {
|
void ul(void *_d, event e)
|
||||||
|
{
|
||||||
ev_data *d = _d;
|
ev_data *d = _d;
|
||||||
trace(d, DIRECTION_UPLINK, C_RNTI, e.e[d->ul_rnti].i,
|
trace_lte(d, DIRECTION_UPLINK, C_RNTI, e.e[d->ul_rnti].i,
|
||||||
e.e[d->ul_frame].i, e.e[d->ul_subframe].i,
|
e.e[d->ul_frame].i, e.e[d->ul_subframe].i,
|
||||||
e.e[d->ul_data].b, e.e[d->ul_data].bsize,
|
e.e[d->ul_data].b, e.e[d->ul_data].bsize,
|
||||||
NO_PREAMBLE);
|
NO_PREAMBLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void dl(void *_d, event e) {
|
void dl(void *_d, event e)
|
||||||
|
{
|
||||||
ev_data *d = _d;
|
ev_data *d = _d;
|
||||||
|
|
||||||
if (e.e[d->dl_rnti].i == 0xffff) {
|
if (e.e[d->dl_rnti].i == 0xffff) {
|
||||||
@@ -119,14 +150,15 @@ void dl(void *_d, event e) {
|
|||||||
d->cur_sib++;
|
d->cur_sib++;
|
||||||
}
|
}
|
||||||
|
|
||||||
trace(d, DIRECTION_DOWNLINK,
|
trace_lte(d, DIRECTION_DOWNLINK,
|
||||||
e.e[d->dl_rnti].i != 0xffff ? C_RNTI : SI_RNTI, e.e[d->dl_rnti].i,
|
e.e[d->dl_rnti].i != 0xffff ? C_RNTI : SI_RNTI, e.e[d->dl_rnti].i,
|
||||||
e.e[d->dl_frame].i, e.e[d->dl_subframe].i,
|
e.e[d->dl_frame].i, e.e[d->dl_subframe].i,
|
||||||
e.e[d->dl_data].b, e.e[d->dl_data].bsize,
|
e.e[d->dl_data].b, e.e[d->dl_data].bsize,
|
||||||
NO_PREAMBLE);
|
NO_PREAMBLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void mib(void *_d, event e) {
|
void mib(void *_d, event e)
|
||||||
|
{
|
||||||
ev_data *d = _d;
|
ev_data *d = _d;
|
||||||
|
|
||||||
if (d->no_mib) return;
|
if (d->no_mib) return;
|
||||||
@@ -134,30 +166,141 @@ void mib(void *_d, event e) {
|
|||||||
if (d->max_mib && d->cur_mib == d->max_mib) return;
|
if (d->max_mib && d->cur_mib == d->max_mib) return;
|
||||||
|
|
||||||
d->cur_mib++;
|
d->cur_mib++;
|
||||||
trace(d, DIRECTION_DOWNLINK, NO_RNTI, 0,
|
trace_lte(d, DIRECTION_DOWNLINK, NO_RNTI, 0,
|
||||||
e.e[d->mib_frame].i, e.e[d->mib_subframe].i,
|
e.e[d->mib_frame].i, e.e[d->mib_subframe].i,
|
||||||
e.e[d->mib_data].b, e.e[d->mib_data].bsize,
|
e.e[d->mib_data].b, e.e[d->mib_data].bsize,
|
||||||
NO_PREAMBLE);
|
NO_PREAMBLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void preamble(void *_d, event e) {
|
void preamble(void *_d, event e)
|
||||||
|
{
|
||||||
ev_data *d = _d;
|
ev_data *d = _d;
|
||||||
trace(d, DIRECTION_UPLINK, NO_RNTI, 0,
|
trace_lte(d, DIRECTION_UPLINK, NO_RNTI, 0,
|
||||||
e.e[d->preamble_frame].i, e.e[d->preamble_subframe].i,
|
e.e[d->preamble_frame].i, e.e[d->preamble_subframe].i,
|
||||||
NULL, 0,
|
NULL, 0,
|
||||||
e.e[d->preamble_preamble].i);
|
e.e[d->preamble_preamble].i);
|
||||||
}
|
}
|
||||||
|
|
||||||
void rar(void *_d, event e) {
|
void rar(void *_d, event e)
|
||||||
|
{
|
||||||
ev_data *d = _d;
|
ev_data *d = _d;
|
||||||
trace(d, DIRECTION_DOWNLINK, RA_RNTI, e.e[d->rar_rnti].i,
|
trace_lte(d, DIRECTION_DOWNLINK, RA_RNTI, e.e[d->rar_rnti].i,
|
||||||
e.e[d->rar_frame].i, e.e[d->rar_subframe].i,
|
e.e[d->rar_frame].i, e.e[d->rar_subframe].i,
|
||||||
e.e[d->rar_data].b, e.e[d->rar_data].bsize,
|
e.e[d->rar_data].b, e.e[d->rar_data].bsize,
|
||||||
NO_PREAMBLE);
|
NO_PREAMBLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
/* NR */
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#define MAC_NR_START_STRING "mac-nr"
|
||||||
|
|
||||||
|
#define MAC_NR_PAYLOAD_TAG 0x01
|
||||||
|
#define MAC_NR_RNTI_TAG 0x02
|
||||||
|
#define MAC_NR_FRAME_SLOT_TAG 0x07
|
||||||
|
|
||||||
|
#define NR_FDD_RADIO 1
|
||||||
|
#define NR_TDD_RADIO 2
|
||||||
|
|
||||||
|
#define NR_DIRECTION_UPLINK 0
|
||||||
|
#define NR_DIRECTION_DOWNLINK 1
|
||||||
|
|
||||||
|
#define NR_NO_RNTI 0
|
||||||
|
#define NR_RA_RNTI 2
|
||||||
|
#define NR_C_RNTI 3
|
||||||
|
|
||||||
|
void trace_nr(ev_data *d, int direction, int rnti_type, int rnti,
|
||||||
|
int frame, int slot, void *buf, int bufsize, int preamble)
|
||||||
|
{
|
||||||
|
ssize_t ret;
|
||||||
|
int i;
|
||||||
|
d->buf.osize = 0;
|
||||||
|
PUTS(&d->buf, MAC_NR_START_STRING);
|
||||||
|
PUTC(&d->buf, NR_TDD_RADIO);
|
||||||
|
PUTC(&d->buf, direction);
|
||||||
|
PUTC(&d->buf, rnti_type);
|
||||||
|
|
||||||
|
if (rnti_type == NR_C_RNTI || rnti_type == NR_RA_RNTI) {
|
||||||
|
PUTC(&d->buf, MAC_NR_RNTI_TAG);
|
||||||
|
PUTC(&d->buf, (rnti>>8) & 255);
|
||||||
|
PUTC(&d->buf, rnti & 255);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
/* for old versions of wireshark; not sure if correct */
|
||||||
|
int fsf = (frame << 4) + slot;
|
||||||
|
PUTC(&d->buf, 4 /* MAC_NR_FRAME_SUBFRAME_TAG */);
|
||||||
|
PUTC(&d->buf, (fsf>>8) & 255);
|
||||||
|
PUTC(&d->buf, fsf & 255);
|
||||||
|
#else
|
||||||
|
PUTC(&d->buf, MAC_NR_FRAME_SLOT_TAG);
|
||||||
|
PUTC(&d->buf, (frame>>8) & 255);
|
||||||
|
PUTC(&d->buf, frame & 255);
|
||||||
|
PUTC(&d->buf, (slot>>8) & 255);
|
||||||
|
PUTC(&d->buf, slot & 255);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
PUTC(&d->buf, MAC_NR_PAYLOAD_TAG);
|
||||||
|
|
||||||
|
for (i = 0; i < bufsize; i++)
|
||||||
|
PUTC(&d->buf, ((char *)buf)[i]);
|
||||||
|
|
||||||
|
ret = sendto(d->socket, d->buf.obuf, d->buf.osize, 0,
|
||||||
|
(struct sockaddr *)&d->to, sizeof(struct sockaddr_in));
|
||||||
|
|
||||||
|
if (ret != d->buf.osize) abort();
|
||||||
|
}
|
||||||
|
|
||||||
|
void nr_ul(void *_d, event e)
|
||||||
|
{
|
||||||
|
ev_data *d = _d;
|
||||||
|
|
||||||
|
trace_nr(d, NR_DIRECTION_UPLINK, NR_C_RNTI, e.e[d->nr_ul_rnti].i,
|
||||||
|
e.e[d->nr_ul_frame].i, e.e[d->nr_ul_slot].i,
|
||||||
|
e.e[d->nr_ul_data].b, e.e[d->nr_ul_data].bsize, NO_PREAMBLE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void nr_dl(void *_d, event e)
|
||||||
|
{
|
||||||
|
ev_data *d = _d;
|
||||||
|
|
||||||
|
trace_nr(d, NR_DIRECTION_DOWNLINK, NR_C_RNTI, e.e[d->nr_dl_rnti].i,
|
||||||
|
e.e[d->nr_dl_frame].i, e.e[d->nr_dl_slot].i,
|
||||||
|
e.e[d->nr_dl_data].b, e.e[d->nr_dl_data].bsize, NO_PREAMBLE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void nr_mib(void *_d, event e)
|
||||||
|
{
|
||||||
|
ev_data *d = _d;
|
||||||
|
|
||||||
|
if (d->no_mib) return;
|
||||||
|
|
||||||
|
if (d->max_mib && d->cur_mib == d->max_mib) return;
|
||||||
|
|
||||||
|
d->cur_mib++;
|
||||||
|
|
||||||
|
trace_nr(d, NR_DIRECTION_DOWNLINK, NR_NO_RNTI, 0,
|
||||||
|
e.e[d->nr_mib_frame].i, e.e[d->nr_mib_slot].i,
|
||||||
|
e.e[d->nr_mib_data].b, e.e[d->nr_mib_data].bsize, NO_PREAMBLE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void nr_rar(void *_d, event e)
|
||||||
|
{
|
||||||
|
ev_data *d = _d;
|
||||||
|
|
||||||
|
trace_nr(d, NR_DIRECTION_DOWNLINK, NR_RA_RNTI, e.e[d->nr_rar_rnti].i,
|
||||||
|
e.e[d->nr_rar_frame].i, e.e[d->nr_rar_slot].i,
|
||||||
|
e.e[d->nr_rar_data].b, e.e[d->nr_rar_data].bsize, NO_PREAMBLE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
void setup_data(ev_data *d, void *database, int ul_id, int dl_id, int mib_id,
|
void setup_data(ev_data *d, void *database, int ul_id, int dl_id, int mib_id,
|
||||||
int preamble_id, int rar_id) {
|
int preamble_id, int rar_id,
|
||||||
|
int nr_ul_id, int nr_dl_id, int nr_mib_id, int nr_rar_id)
|
||||||
|
{
|
||||||
database_event_format f;
|
database_event_format f;
|
||||||
int i;
|
int i;
|
||||||
d->ul_rnti = -1;
|
d->ul_rnti = -1;
|
||||||
@@ -174,10 +317,27 @@ void setup_data(ev_data *d, void *database, int ul_id, int dl_id, int mib_id,
|
|||||||
d->preamble_frame = -1;
|
d->preamble_frame = -1;
|
||||||
d->preamble_subframe = -1;
|
d->preamble_subframe = -1;
|
||||||
d->preamble_preamble = -1;
|
d->preamble_preamble = -1;
|
||||||
d->rar_rnti = -1;
|
d->rar_rnti = -1;
|
||||||
d->rar_frame = -1;
|
d->rar_frame = -1;
|
||||||
d->rar_subframe = -1;
|
d->rar_subframe = -1;
|
||||||
d->rar_data = -1;
|
d->rar_data = -1;
|
||||||
|
|
||||||
|
d->nr_ul_rnti = -1;
|
||||||
|
d->nr_ul_frame = -1;
|
||||||
|
d->nr_ul_slot = -1;
|
||||||
|
d->nr_ul_data = -1;
|
||||||
|
d->nr_dl_rnti = -1;
|
||||||
|
d->nr_dl_frame = -1;
|
||||||
|
d->nr_dl_slot = -1;
|
||||||
|
d->nr_dl_data = -1;
|
||||||
|
d->nr_mib_frame = -1;
|
||||||
|
d->nr_mib_slot = -1;
|
||||||
|
d->nr_mib_data = -1;
|
||||||
|
d->nr_rar_rnti = -1;
|
||||||
|
d->nr_rar_frame = -1;
|
||||||
|
d->nr_rar_slot = -1;
|
||||||
|
d->nr_rar_data = -1;
|
||||||
|
|
||||||
#define G(var_name, var_type, var) \
|
#define G(var_name, var_type, var) \
|
||||||
if (!strcmp(f.name[i], var_name)) { \
|
if (!strcmp(f.name[i], var_name)) { \
|
||||||
if (strcmp(f.type[i], var_type)) goto error; \
|
if (strcmp(f.type[i], var_type)) goto error; \
|
||||||
@@ -247,6 +407,60 @@ void setup_data(ev_data *d, void *database, int ul_id, int dl_id, int mib_id,
|
|||||||
if (d->rar_rnti == -1 || d->rar_frame == -1 || d->rar_subframe == -1 ||
|
if (d->rar_rnti == -1 || d->rar_frame == -1 || d->rar_subframe == -1 ||
|
||||||
d->rar_data == -1) goto error;
|
d->rar_data == -1) goto error;
|
||||||
|
|
||||||
|
/* NR ul: rnti, frame, slot, data */
|
||||||
|
f = get_format(database, nr_ul_id);
|
||||||
|
|
||||||
|
for (i = 0; i < f.count; i++) {
|
||||||
|
G("rnti", "int", d->nr_ul_rnti);
|
||||||
|
G("frame", "int", d->nr_ul_frame);
|
||||||
|
G("slot", "int", d->nr_ul_slot);
|
||||||
|
G("data", "buffer", d->nr_ul_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (d->nr_ul_rnti == -1 || d->nr_ul_frame == -1 || d->nr_ul_slot == -1 ||
|
||||||
|
d->nr_ul_data == -1)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
/* NR dl: rnti, frame, slot, data */
|
||||||
|
f = get_format(database, nr_dl_id);
|
||||||
|
|
||||||
|
for (i = 0; i < f.count; i++) {
|
||||||
|
G("rnti", "int", d->nr_dl_rnti);
|
||||||
|
G("frame", "int", d->nr_dl_frame);
|
||||||
|
G("slot", "int", d->nr_dl_slot);
|
||||||
|
G("data", "buffer", d->nr_dl_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (d->nr_dl_rnti == -1 || d->nr_dl_frame == -1 || d->nr_dl_slot == -1 ||
|
||||||
|
d->nr_dl_data == -1)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
/* NR MIB: frame, slot, data */
|
||||||
|
f = get_format(database, nr_mib_id);
|
||||||
|
|
||||||
|
for (i = 0; i < f.count; i++) {
|
||||||
|
G("frame", "int", d->nr_mib_frame);
|
||||||
|
G("slot", "int", d->nr_mib_slot);
|
||||||
|
G("data", "buffer", d->nr_mib_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (d->nr_mib_frame == -1 || d->nr_mib_slot== -1 || d->nr_mib_data == -1)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
/* NR RAR: rnti, frame, slot, data */
|
||||||
|
f = get_format(database, nr_rar_id);
|
||||||
|
|
||||||
|
for (i = 0; i < f.count; i++) {
|
||||||
|
G("rnti", "int", d->nr_rar_rnti);
|
||||||
|
G("frame", "int", d->nr_rar_frame);
|
||||||
|
G("slot", "int", d->nr_rar_slot);
|
||||||
|
G("data", "buffer", d->nr_rar_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (d->nr_rar_rnti == -1 || d->nr_rar_frame == -1 || d->nr_rar_slot == -1 ||
|
||||||
|
d->nr_rar_data == -1)
|
||||||
|
goto error;
|
||||||
|
|
||||||
#undef G
|
#undef G
|
||||||
return;
|
return;
|
||||||
error:
|
error:
|
||||||
@@ -254,7 +468,8 @@ error:
|
|||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
|
|
||||||
void *receiver(void *_d) {
|
void *receiver(void *_d)
|
||||||
|
{
|
||||||
ev_data *d = _d;
|
ev_data *d = _d;
|
||||||
int s;
|
int s;
|
||||||
char buf[100000];
|
char buf[100000];
|
||||||
@@ -279,7 +494,8 @@ void *receiver(void *_d) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void usage(void) {
|
void usage(void)
|
||||||
|
{
|
||||||
printf(
|
printf(
|
||||||
"options:\n"
|
"options:\n"
|
||||||
" -d <database file> this option is mandatory\n"
|
" -d <database file> this option is mandatory\n"
|
||||||
@@ -304,14 +520,16 @@ void usage(void) {
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int n, char **v) {
|
int main(int n, char **v)
|
||||||
|
{
|
||||||
char *database_filename = NULL;
|
char *database_filename = NULL;
|
||||||
char *input_filename = NULL;
|
char *input_filename = NULL;
|
||||||
void *database;
|
void *database;
|
||||||
event_handler *h;
|
event_handler *h;
|
||||||
int in;
|
int in;
|
||||||
int i;
|
int i;
|
||||||
int ul_id, dl_id, mib_id = -1, preamble_id, rar_id;
|
int ul_id, dl_id, mib_id, preamble_id, rar_id;
|
||||||
|
int nr_ul_id, nr_dl_id, nr_mib_id, nr_rar_id;
|
||||||
ev_data d;
|
ev_data d;
|
||||||
char *ip = DEFAULT_IP;
|
char *ip = DEFAULT_IP;
|
||||||
int port = DEFAULT_PORT;
|
int port = DEFAULT_PORT;
|
||||||
@@ -382,6 +600,11 @@ int main(int n, char **v) {
|
|||||||
on_off(database, "ENB_PHY_INITIATE_RA_PROCEDURE", is_on, 1);
|
on_off(database, "ENB_PHY_INITIATE_RA_PROCEDURE", is_on, 1);
|
||||||
on_off(database, "ENB_MAC_UE_DL_RAR_PDU_WITH_DATA", is_on, 1);
|
on_off(database, "ENB_MAC_UE_DL_RAR_PDU_WITH_DATA", is_on, 1);
|
||||||
|
|
||||||
|
on_off(database, "GNB_MAC_UL_PDU_WITH_DATA", is_on, 1);
|
||||||
|
on_off(database, "GNB_MAC_DL_PDU_WITH_DATA", is_on, 1);
|
||||||
|
on_off(database, "GNB_PHY_MIB", is_on, 1);
|
||||||
|
on_off(database, "GNB_MAC_DL_RAR_PDU_WITH_DATA", is_on, 1);
|
||||||
|
|
||||||
/* activate selected traces */
|
/* activate selected traces */
|
||||||
if (socket_send(in, &mt, 1) == -1 ||
|
if (socket_send(in, &mt, 1) == -1 ||
|
||||||
socket_send(in, &number_of_events, sizeof(int)) == -1 ||
|
socket_send(in, &number_of_events, sizeof(int)) == -1 ||
|
||||||
@@ -398,12 +621,26 @@ int main(int n, char **v) {
|
|||||||
mib_id = event_id_from_name(database, "ENB_PHY_MIB");
|
mib_id = event_id_from_name(database, "ENB_PHY_MIB");
|
||||||
preamble_id = event_id_from_name(database, "ENB_PHY_INITIATE_RA_PROCEDURE");
|
preamble_id = event_id_from_name(database, "ENB_PHY_INITIATE_RA_PROCEDURE");
|
||||||
rar_id = event_id_from_name(database, "ENB_MAC_UE_DL_RAR_PDU_WITH_DATA");
|
rar_id = event_id_from_name(database, "ENB_MAC_UE_DL_RAR_PDU_WITH_DATA");
|
||||||
setup_data(&d, database, ul_id, dl_id, mib_id, preamble_id, rar_id);
|
|
||||||
|
nr_ul_id = event_id_from_name(database, "GNB_MAC_UL_PDU_WITH_DATA");
|
||||||
|
nr_dl_id = event_id_from_name(database, "GNB_MAC_DL_PDU_WITH_DATA");
|
||||||
|
nr_mib_id = event_id_from_name(database, "GNB_PHY_MIB");
|
||||||
|
nr_rar_id = event_id_from_name(database, "GNB_MAC_DL_RAR_PDU_WITH_DATA");
|
||||||
|
|
||||||
|
setup_data(&d, database, ul_id, dl_id, mib_id, preamble_id, rar_id,
|
||||||
|
nr_ul_id, nr_dl_id, nr_mib_id, nr_rar_id);
|
||||||
|
|
||||||
register_handler_function(h, ul_id, ul, &d);
|
register_handler_function(h, ul_id, ul, &d);
|
||||||
register_handler_function(h, dl_id, dl, &d);
|
register_handler_function(h, dl_id, dl, &d);
|
||||||
register_handler_function(h, mib_id, mib, &d);
|
register_handler_function(h, mib_id, mib, &d);
|
||||||
register_handler_function(h, preamble_id, preamble, &d);
|
register_handler_function(h, preamble_id, preamble, &d);
|
||||||
register_handler_function(h, rar_id, rar, &d);
|
register_handler_function(h, rar_id, rar, &d);
|
||||||
|
|
||||||
|
register_handler_function(h, nr_ul_id, nr_ul, &d);
|
||||||
|
register_handler_function(h, nr_dl_id, nr_dl, &d);
|
||||||
|
register_handler_function(h, nr_mib_id, nr_mib, &d);
|
||||||
|
register_handler_function(h, nr_rar_id, nr_rar, &d);
|
||||||
|
|
||||||
d.socket = socket(AF_INET, SOCK_DGRAM, 0);
|
d.socket = socket(AF_INET, SOCK_DGRAM, 0);
|
||||||
|
|
||||||
if (d.socket == -1) {
|
if (d.socket == -1) {
|
||||||
@@ -424,8 +661,10 @@ int main(int n, char **v) {
|
|||||||
|
|
||||||
if (e.type == -1) break;
|
if (e.type == -1) break;
|
||||||
|
|
||||||
if (!(e.type == ul_id || e.type == dl_id || e.type == mib_id ||
|
if (!(e.type == ul_id || e.type == dl_id || e.type == mib_id ||
|
||||||
e.type == preamble_id || e.type == rar_id)) continue;
|
e.type == preamble_id || e.type == rar_id ||
|
||||||
|
e.type == nr_ul_id || e.type == nr_dl_id ||
|
||||||
|
e.type == nr_mib_id || e.type == nr_rar_id)) continue;
|
||||||
|
|
||||||
handle_event(h, e);
|
handle_event(h, e);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -101,11 +101,11 @@ static inline uint64_t BIT_STRING_to_uint64(BIT_STRING_t *asn) {
|
|||||||
|
|
||||||
shift = ((asn->size - 1) * 8) - asn->bits_unused;
|
shift = ((asn->size - 1) * 8) - asn->bits_unused;
|
||||||
for (index = 0; index < (asn->size - 1); index++) {
|
for (index = 0; index < (asn->size - 1); index++) {
|
||||||
result |= asn->buf[index] << shift;
|
result |= ((uint64_t)asn->buf[index]) << shift;
|
||||||
shift -= 8;
|
shift -= 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
result |= asn->buf[index] >> asn->bits_unused;
|
result |= ((uint64_t)asn->buf[index]) >> asn->bits_unused;
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -121,9 +121,11 @@ char toksep[2];
|
|||||||
case SCHED_RR:
|
case SCHED_RR:
|
||||||
lptr+=sprintf(lptr,"%s ","rt: rr");
|
lptr+=sprintf(lptr,"%s ","rt: rr");
|
||||||
break;
|
break;
|
||||||
|
#ifdef SCHED_DEADLINE
|
||||||
case SCHED_DEADLINE:
|
case SCHED_DEADLINE:
|
||||||
lptr+=sprintf(lptr,"%s ","rt: deadline");
|
lptr+=sprintf(lptr,"%s ","rt: deadline");
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
default:
|
default:
|
||||||
lptr+=sprintf(lptr,"%s ","????");
|
lptr+=sprintf(lptr,"%s ","????");
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -49,6 +49,7 @@ RUN yum update -y && \
|
|||||||
nettle \
|
nettle \
|
||||||
atlas \
|
atlas \
|
||||||
net-tools \
|
net-tools \
|
||||||
|
iputils \
|
||||||
iproute \
|
iproute \
|
||||||
libyaml && \
|
libyaml && \
|
||||||
echo "/usr/local/lib" > /etc/ld.so.conf.d/local-lib.conf && \
|
echo "/usr/local/lib" > /etc/ld.so.conf.d/local-lib.conf && \
|
||||||
@@ -120,3 +121,4 @@ WORKDIR /opt/oai-enb
|
|||||||
|
|
||||||
#CMD ["/opt/oai-enb/bin/lte-softmodem", "-O", "/opt/oai-enb/etc/enb.conf"]
|
#CMD ["/opt/oai-enb/bin/lte-softmodem", "-O", "/opt/oai-enb/etc/enb.conf"]
|
||||||
#ENTRYPOINT ["/opt/oai-enb/bin/entrypoint.sh"]
|
#ENTRYPOINT ["/opt/oai-enb/bin/entrypoint.sh"]
|
||||||
|
CMD ["sleep", "infinity"]
|
||||||
|
|||||||
@@ -51,6 +51,7 @@ RUN yum update -y && \
|
|||||||
atlas \
|
atlas \
|
||||||
net-tools \
|
net-tools \
|
||||||
iproute \
|
iproute \
|
||||||
|
iputils \
|
||||||
libyaml && \
|
libyaml && \
|
||||||
echo "/usr/local/lib" > /etc/ld.so.conf.d/local-lib.conf && \
|
echo "/usr/local/lib" > /etc/ld.so.conf.d/local-lib.conf && \
|
||||||
echo "/usr/local/lib64" >> /etc/ld.so.conf.d/local-lib.conf
|
echo "/usr/local/lib64" >> /etc/ld.so.conf.d/local-lib.conf
|
||||||
@@ -121,4 +122,4 @@ WORKDIR /opt/oai-enb
|
|||||||
|
|
||||||
#CMD ["/opt/oai-enb/bin/lte-softmodem", "-O", "/opt/oai-enb/etc/enb.conf"]
|
#CMD ["/opt/oai-enb/bin/lte-softmodem", "-O", "/opt/oai-enb/etc/enb.conf"]
|
||||||
#ENTRYPOINT ["/opt/oai-enb/bin/entrypoint.sh"]
|
#ENTRYPOINT ["/opt/oai-enb/bin/entrypoint.sh"]
|
||||||
|
CMD ["sleep", "infinity"]
|
||||||
|
|||||||
@@ -57,6 +57,7 @@ RUN apt-get update && \
|
|||||||
libconfig9 \
|
libconfig9 \
|
||||||
openssl \
|
openssl \
|
||||||
net-tools \
|
net-tools \
|
||||||
|
iputils-ping \
|
||||||
iproute2 \
|
iproute2 \
|
||||||
libyaml-0-2 && \
|
libyaml-0-2 && \
|
||||||
# Install UHD driver from ettus ppa
|
# Install UHD driver from ettus ppa
|
||||||
@@ -120,3 +121,4 @@ WORKDIR /opt/oai-enb
|
|||||||
|
|
||||||
#CMD ["/opt/oai-enb/bin/lte-softmodem", "-O", "/opt/oai-enb/etc/enb.conf"]
|
#CMD ["/opt/oai-enb/bin/lte-softmodem", "-O", "/opt/oai-enb/etc/enb.conf"]
|
||||||
#ENTRYPOINT ["/opt/oai-enb/bin/entrypoint.sh"]
|
#ENTRYPOINT ["/opt/oai-enb/bin/entrypoint.sh"]
|
||||||
|
CMD ["sleep", "infinity"]
|
||||||
|
|||||||
@@ -1,92 +0,0 @@
|
|||||||
#/*
|
|
||||||
# * 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
|
|
||||||
# */
|
|
||||||
#---------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
# Dockerfile for the Open-Air-Interface eNB service
|
|
||||||
# Valid for RHEL7 in the OpenShift context (v4.4)
|
|
||||||
#
|
|
||||||
#---------------------------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
ARG REGISTRY=localhost
|
|
||||||
FROM $REGISTRY/oai-build-base:latest.el7 AS builder
|
|
||||||
|
|
||||||
ARG GIT_TAG=v1.1.1
|
|
||||||
|
|
||||||
WORKDIR /root
|
|
||||||
|
|
||||||
RUN if [ "$EURECOM_PROXY" == true ]; then git config --global http.proxy http://:@proxy.eurecom.fr:8080; fi
|
|
||||||
|
|
||||||
RUN git clone --depth=1 --branch=$GIT_TAG https://gitlab.eurecom.fr/oai/openairinterface5g.git
|
|
||||||
COPY patches patches/
|
|
||||||
RUN patch -p1 -d openairinterface5g < patches/disable_building_nasmesh_and_rbtool.patch \
|
|
||||||
&& patch -p1 -d openairinterface5g < patches/disable_sched_fifo_fail_exits.patch
|
|
||||||
RUN cd openairinterface5g/cmake_targets \
|
|
||||||
&& ln -sf /usr/local/bin/asn1c_oai /usr/local/bin/asn1c \
|
|
||||||
&& ln -sf /usr/local/share/asn1c_oai /usr/local/share/asn1c \
|
|
||||||
&& ./build_oai -c --eNB -w USRP --verbose-compile
|
|
||||||
|
|
||||||
|
|
||||||
FROM registry.redhat.io/ubi7/ubi
|
|
||||||
LABEL name="oai-enb" \
|
|
||||||
version="$GIT_TAG" \
|
|
||||||
maintainer="Frank A. Zdarsky <fzdarsky@redhat.com>" \
|
|
||||||
io.k8s.description="openairinterface5g eNB $GIT_TAG." \
|
|
||||||
io.openshift.tags="oai,enb" \
|
|
||||||
io.openshift.non-scalable="true"
|
|
||||||
|
|
||||||
RUN yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm \
|
|
||||||
&& REPOLIST="rhel-7-server-optional-rpms" \
|
|
||||||
&& PKGLIST="boost libconfig lksctp-tools protobuf-c iproute iputils procps-ng bind-utils xforms nettle libyaml libusb" \
|
|
||||||
# && yum -y upgrade-minimal --setopt=tsflags=nodocs --security --sec-severity=Critical --sec-severity=Important && \
|
|
||||||
&& yum -y install --enablerepo ${REPOLIST} --setopt=tsflag=nodocs ${PKGLIST} \
|
|
||||||
&& yum -y clean all \
|
|
||||||
&& rm -rf /var/cache/yum
|
|
||||||
|
|
||||||
ENV APP_ROOT=/opt/oai-enb
|
|
||||||
ENV PATH=${APP_ROOT}:${PATH} HOME=${APP_ROOT}
|
|
||||||
COPY --from=builder /root/openairinterface5g/cmake_targets/lte_build_oai/build/lte-softmodem ${APP_ROOT}/bin/
|
|
||||||
COPY --from=builder /root/openairinterface5g/cmake_targets/lte_build_oai/build/*.so* /lib64
|
|
||||||
COPY --from=builder /usr/local/lib64 /lib64
|
|
||||||
COPY --from=builder /usr/local/bin/uhd_* /usr/local/bin
|
|
||||||
COPY --from=builder /usr/local/share/uhd /usr/local/share/uhd
|
|
||||||
RUN cd /lib64 \
|
|
||||||
&& ln -sf liboai_eth_transpro.so liboai_transpro.so \
|
|
||||||
&& ln -sf liboai_usrpdevif.so liboai_device.so \
|
|
||||||
&& ln -sf libuhd.so.3.13 libuhd.so.3 \
|
|
||||||
&& ln -sf libuhd.so.3 libuhd.so
|
|
||||||
COPY scripts ${APP_ROOT}/bin/
|
|
||||||
COPY configs ${APP_ROOT}/etc/
|
|
||||||
RUN chmod -R u+x ${APP_ROOT} && \
|
|
||||||
chgrp -R 0 ${APP_ROOT} && \
|
|
||||||
chmod -R g=u ${APP_ROOT} /etc/passwd
|
|
||||||
USER 10001
|
|
||||||
WORKDIR ${APP_ROOT}
|
|
||||||
|
|
||||||
EXPOSE 2152/udp # S1U, GTP/UDP
|
|
||||||
EXPOSE 22100/tcp # ?
|
|
||||||
EXPOSE 36412/udp # S1C, SCTP/UDP
|
|
||||||
EXPOSE 36422/udp # X2C, SCTP/UDP
|
|
||||||
EXPOSE 50000/udp # IF5 / ORI (control)
|
|
||||||
EXPOSE 50001/udp # IF5 / ECPRI (data)
|
|
||||||
|
|
||||||
CMD ["/opt/oai-enb/bin/lte-softmodem", "-O", "/opt/oai-enb/etc/enb.conf"]
|
|
||||||
ENTRYPOINT ["/opt/oai-enb/bin/entrypoint.sh"]
|
|
||||||
@@ -52,6 +52,8 @@ RUN yum repolist --disablerepo=* && \
|
|||||||
atlas \
|
atlas \
|
||||||
lksctp-tools \
|
lksctp-tools \
|
||||||
nettle \
|
nettle \
|
||||||
|
net-tools \
|
||||||
|
iputils \
|
||||||
libyaml && \
|
libyaml && \
|
||||||
echo "/usr/local/lib" > /etc/ld.so.conf.d/local-lib.conf && \
|
echo "/usr/local/lib" > /etc/ld.so.conf.d/local-lib.conf && \
|
||||||
echo "/usr/local/lib64" >> /etc/ld.so.conf.d/local-lib.conf
|
echo "/usr/local/lib64" >> /etc/ld.so.conf.d/local-lib.conf
|
||||||
@@ -123,4 +125,4 @@ WORKDIR /opt/oai-gnb
|
|||||||
|
|
||||||
#CMD ["/opt/oai-gnb/bin/nr-softmodem", "-O", "/opt/oai-gnb/etc/gnb.conf"]
|
#CMD ["/opt/oai-gnb/bin/nr-softmodem", "-O", "/opt/oai-gnb/etc/gnb.conf"]
|
||||||
#ENTRYPOINT ["/opt/oai-gnb/bin/entrypoint.sh"]
|
#ENTRYPOINT ["/opt/oai-gnb/bin/entrypoint.sh"]
|
||||||
|
CMD ["sleep", "infinity"]
|
||||||
|
|||||||
@@ -53,6 +53,8 @@ RUN yum repolist --disablerepo=* && \
|
|||||||
atlas \
|
atlas \
|
||||||
lksctp-tools \
|
lksctp-tools \
|
||||||
nettle \
|
nettle \
|
||||||
|
net-tools \
|
||||||
|
iputils \
|
||||||
libyaml && \
|
libyaml && \
|
||||||
echo "/usr/local/lib" > /etc/ld.so.conf.d/local-lib.conf && \
|
echo "/usr/local/lib" > /etc/ld.so.conf.d/local-lib.conf && \
|
||||||
echo "/usr/local/lib64" >> /etc/ld.so.conf.d/local-lib.conf
|
echo "/usr/local/lib64" >> /etc/ld.so.conf.d/local-lib.conf
|
||||||
@@ -124,4 +126,4 @@ WORKDIR /opt/oai-gnb
|
|||||||
|
|
||||||
#CMD ["/opt/oai-gnb/bin/nr-softmodem", "-O", "/opt/oai-gnb/etc/gnb.conf"]
|
#CMD ["/opt/oai-gnb/bin/nr-softmodem", "-O", "/opt/oai-gnb/etc/gnb.conf"]
|
||||||
#ENTRYPOINT ["/opt/oai-gnb/bin/entrypoint.sh"]
|
#ENTRYPOINT ["/opt/oai-gnb/bin/entrypoint.sh"]
|
||||||
|
CMD ["sleep", "infinity"]
|
||||||
|
|||||||
@@ -59,6 +59,7 @@ RUN apt-get update && \
|
|||||||
openssl \
|
openssl \
|
||||||
net-tools \
|
net-tools \
|
||||||
iproute2 \
|
iproute2 \
|
||||||
|
iputils-ping \
|
||||||
libyaml-0-2 && \
|
libyaml-0-2 && \
|
||||||
# Install UHD driver from ettus ppa
|
# Install UHD driver from ettus ppa
|
||||||
# At time of writing, it is 3.14
|
# At time of writing, it is 3.14
|
||||||
@@ -121,4 +122,4 @@ WORKDIR /opt/oai-gnb
|
|||||||
|
|
||||||
#CMD ["/opt/oai-gnb/bin/nr-softmodem", "-O", "/opt/oai-gnb/etc/gnb.conf"]
|
#CMD ["/opt/oai-gnb/bin/nr-softmodem", "-O", "/opt/oai-gnb/etc/gnb.conf"]
|
||||||
#ENTRYPOINT ["/opt/oai-gnb/bin/entrypoint.sh"]
|
#ENTRYPOINT ["/opt/oai-gnb/bin/entrypoint.sh"]
|
||||||
|
CMD ["sleep", "infinity"]
|
||||||
|
|||||||
@@ -51,6 +51,7 @@ RUN yum update -y && \
|
|||||||
atlas \
|
atlas \
|
||||||
iproute \
|
iproute \
|
||||||
net-tools \
|
net-tools \
|
||||||
|
iputils \
|
||||||
libyaml && \
|
libyaml && \
|
||||||
echo "/usr/local/lib" > /etc/ld.so.conf.d/local-lib.conf && \
|
echo "/usr/local/lib" > /etc/ld.so.conf.d/local-lib.conf && \
|
||||||
echo "/usr/local/lib64" >> /etc/ld.so.conf.d/local-lib.conf
|
echo "/usr/local/lib64" >> /etc/ld.so.conf.d/local-lib.conf
|
||||||
@@ -114,8 +115,9 @@ RUN ldconfig
|
|||||||
# Copy the relevant configuration files for eNB
|
# Copy the relevant configuration files for eNB
|
||||||
WORKDIR /opt/oai-lte-ue/etc
|
WORKDIR /opt/oai-lte-ue/etc
|
||||||
COPY --from=lte-ue-build /oai-ran/ci-scripts/conf_files/ue.* .
|
COPY --from=lte-ue-build /oai-ran/ci-scripts/conf_files/ue.* .
|
||||||
|
COPY --from=lte-ue-build /oai-ran/openair3/NAS/TOOLS/ue_eurecom_test_sfr.conf ./ue_usim.conf
|
||||||
|
|
||||||
WORKDIR /opt/oai-lte-ue
|
WORKDIR /opt/oai-lte-ue
|
||||||
#CMD ["/opt/oai-lte-ue/bin/lte-uesoftmodem", "-O", "/opt/oai-lte-ue/etc/enb.conf"]
|
#CMD ["/opt/oai-lte-ue/bin/lte-uesoftmodem", "-O", "/opt/oai-lte-ue/etc/enb.conf"]
|
||||||
#ENTRYPOINT ["/opt/oai-lte-ue/bin/entrypoint.sh"]
|
#ENTRYPOINT ["/opt/oai-lte-ue/bin/entrypoint.sh"]
|
||||||
|
CMD ["sleep", "infinity"]
|
||||||
|
|||||||
@@ -51,6 +51,7 @@ RUN yum update -y && \
|
|||||||
atlas \
|
atlas \
|
||||||
iproute \
|
iproute \
|
||||||
net-tools \
|
net-tools \
|
||||||
|
iputils \
|
||||||
libyaml && \
|
libyaml && \
|
||||||
echo "/usr/local/lib" > /etc/ld.so.conf.d/local-lib.conf && \
|
echo "/usr/local/lib" > /etc/ld.so.conf.d/local-lib.conf && \
|
||||||
echo "/usr/local/lib64" >> /etc/ld.so.conf.d/local-lib.conf
|
echo "/usr/local/lib64" >> /etc/ld.so.conf.d/local-lib.conf
|
||||||
@@ -114,8 +115,9 @@ RUN ldd /usr/local/lib/libdfts.so
|
|||||||
# Copy the relevant configuration files for eNB
|
# Copy the relevant configuration files for eNB
|
||||||
WORKDIR /opt/oai-lte-ue/etc
|
WORKDIR /opt/oai-lte-ue/etc
|
||||||
COPY --from=lte-ue-build /oai-ran/ci-scripts/conf_files/ue.* .
|
COPY --from=lte-ue-build /oai-ran/ci-scripts/conf_files/ue.* .
|
||||||
|
COPY --from=lte-ue-build /oai-ran/openair3/NAS/TOOLS/ue_eurecom_test_sfr.conf ./ue_usim.conf
|
||||||
|
|
||||||
WORKDIR /opt/oai-lte-ue
|
WORKDIR /opt/oai-lte-ue
|
||||||
#CMD ["/opt/oai-lte-ue/bin/lte-uesoftmodem", "-O", "/opt/oai-lte-ue/etc/enb.conf"]
|
#CMD ["/opt/oai-lte-ue/bin/lte-uesoftmodem", "-O", "/opt/oai-lte-ue/etc/enb.conf"]
|
||||||
#ENTRYPOINT ["/opt/oai-lte-ue/bin/entrypoint.sh"]
|
#ENTRYPOINT ["/opt/oai-lte-ue/bin/entrypoint.sh"]
|
||||||
|
CMD ["sleep", "infinity"]
|
||||||
|
|||||||
@@ -58,6 +58,7 @@ RUN apt-get update && \
|
|||||||
libconfig9 \
|
libconfig9 \
|
||||||
openssl \
|
openssl \
|
||||||
net-tools \
|
net-tools \
|
||||||
|
iputils-ping \
|
||||||
iproute2 \
|
iproute2 \
|
||||||
libyaml-0-2 && \
|
libyaml-0-2 && \
|
||||||
# Install UHD driver from ettus ppa
|
# Install UHD driver from ettus ppa
|
||||||
@@ -114,8 +115,9 @@ RUN ldconfig
|
|||||||
# Copy the relevant configuration files for eNB
|
# Copy the relevant configuration files for eNB
|
||||||
WORKDIR /opt/oai-lte-ue/etc
|
WORKDIR /opt/oai-lte-ue/etc
|
||||||
COPY --from=lte-ue-build /oai-ran/ci-scripts/conf_files/ue.* ./
|
COPY --from=lte-ue-build /oai-ran/ci-scripts/conf_files/ue.* ./
|
||||||
|
COPY --from=lte-ue-build /oai-ran/openair3/NAS/TOOLS/ue_eurecom_test_sfr.conf ./ue_usim.conf
|
||||||
|
|
||||||
WORKDIR /opt/oai-lte-ue
|
WORKDIR /opt/oai-lte-ue
|
||||||
#CMD ["/opt/oai-lte-ue/bin/lte-uesoftmodem", "-O", "/opt/oai-lte-ue/etc/enb.conf"]
|
#CMD ["/opt/oai-lte-ue/bin/lte-uesoftmodem", "-O", "/opt/oai-lte-ue/etc/enb.conf"]
|
||||||
#ENTRYPOINT ["/opt/oai-lte-ue/bin/entrypoint.sh"]
|
#ENTRYPOINT ["/opt/oai-lte-ue/bin/entrypoint.sh"]
|
||||||
|
CMD ["sleep", "infinity"]
|
||||||
|
|||||||
@@ -48,6 +48,8 @@ RUN yum update -y && \
|
|||||||
yum install -y --enablerepo="ubi-8-codeready-builder" \
|
yum install -y --enablerepo="ubi-8-codeready-builder" \
|
||||||
lksctp-tools \
|
lksctp-tools \
|
||||||
nettle \
|
nettle \
|
||||||
|
net-tools \
|
||||||
|
iputils \
|
||||||
atlas \
|
atlas \
|
||||||
libXpm \
|
libXpm \
|
||||||
libX11 \
|
libX11 \
|
||||||
@@ -114,4 +116,4 @@ COPY --from=nr-ue-build /oai-ran/ci-scripts/conf_files/ue.* .
|
|||||||
WORKDIR /opt/oai-nr-ue
|
WORKDIR /opt/oai-nr-ue
|
||||||
#CMD ["/opt/oai-nr-ue/bin/nr-uesoftmodem", "-O", "/opt/oai-nr-ue/etc/enb.conf"]
|
#CMD ["/opt/oai-nr-ue/bin/nr-uesoftmodem", "-O", "/opt/oai-nr-ue/etc/enb.conf"]
|
||||||
#ENTRYPOINT ["/opt/oai-nr-ue/bin/entrypoint.sh"]
|
#ENTRYPOINT ["/opt/oai-nr-ue/bin/entrypoint.sh"]
|
||||||
|
CMD ["sleep", "infinity"]
|
||||||
|
|||||||
@@ -49,6 +49,8 @@ RUN yum update -y && \
|
|||||||
yum install -y --enablerepo="ubi-8-codeready-builder" \
|
yum install -y --enablerepo="ubi-8-codeready-builder" \
|
||||||
lksctp-tools \
|
lksctp-tools \
|
||||||
nettle \
|
nettle \
|
||||||
|
net-tools \
|
||||||
|
iputils \
|
||||||
atlas \
|
atlas \
|
||||||
libXpm \
|
libXpm \
|
||||||
libX11 \
|
libX11 \
|
||||||
@@ -115,4 +117,4 @@ COPY --from=nr-ue-build /oai-ran/ci-scripts/conf_files/ue.* .
|
|||||||
WORKDIR /opt/oai-nr-ue
|
WORKDIR /opt/oai-nr-ue
|
||||||
#CMD ["/opt/oai-nr-ue/bin/nr-uesoftmodem", "-O", "/opt/oai-nr-ue/etc/enb.conf"]
|
#CMD ["/opt/oai-nr-ue/bin/nr-uesoftmodem", "-O", "/opt/oai-nr-ue/etc/enb.conf"]
|
||||||
#ENTRYPOINT ["/opt/oai-nr-ue/bin/entrypoint.sh"]
|
#ENTRYPOINT ["/opt/oai-nr-ue/bin/entrypoint.sh"]
|
||||||
|
CMD ["sleep", "infinity"]
|
||||||
|
|||||||
@@ -58,6 +58,7 @@ RUN apt-get update && \
|
|||||||
libconfig9 \
|
libconfig9 \
|
||||||
openssl \
|
openssl \
|
||||||
net-tools \
|
net-tools \
|
||||||
|
iputils-ping \
|
||||||
iproute2 \
|
iproute2 \
|
||||||
libyaml-0-2 && \
|
libyaml-0-2 && \
|
||||||
# Install UHD driver from ettus ppa
|
# Install UHD driver from ettus ppa
|
||||||
@@ -114,4 +115,4 @@ COPY --from=nr-ue-build /oai-ran/ci-scripts/conf_files/ue.* .
|
|||||||
WORKDIR /opt/oai-nr-ue
|
WORKDIR /opt/oai-nr-ue
|
||||||
#CMD ["/opt/oai-nr-ue/bin/nr-uesoftmodem", "-O", "/opt/oai-nr-ue/etc/enb.conf"]
|
#CMD ["/opt/oai-nr-ue/bin/nr-uesoftmodem", "-O", "/opt/oai-nr-ue/etc/enb.conf"]
|
||||||
#ENTRYPOINT ["/opt/oai-nr-ue/bin/entrypoint.sh"]
|
#ENTRYPOINT ["/opt/oai-nr-ue/bin/entrypoint.sh"]
|
||||||
|
CMD ["sleep", "infinity"]
|
||||||
|
|||||||
+151
-3
@@ -1,5 +1,153 @@
|
|||||||
---
|
<table style="border-collapse: collapse; border: none;">
|
||||||
|
<tr style="border-collapse: collapse; border: none;">
|
||||||
to be done
|
<td style="border-collapse: collapse; border: none;">
|
||||||
|
<a href="http://www.openairinterface.org/">
|
||||||
|
<img src="../doc/images/oai_final_logo.png" alt="" border=3 height=50 width=150>
|
||||||
|
</img>
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
<td style="border-collapse: collapse; border: none; vertical-align: center;">
|
||||||
|
<b><font size = "5">OAI Docker/Podman Build and Usage Procedures</font></b>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
**Table of Contents**
|
||||||
|
|
||||||
|
1. [Build Strategy](#1-build-strategy)
|
||||||
|
2. [File organization](#2-file-organization)
|
||||||
|
3. [Building using docker under Ubuntu 18.04](#3-building-using-docker-under-ubuntu-1804)
|
||||||
|
4. [Building using podman under Red Hat Entreprise Linux 8.2](#4-building-using-podman-under-red-hat-entreprise-linux-82)
|
||||||
|
5. [Running modems using docker under Ubuntu 18.04](#5-running-modems-using-docker-under-ubuntu-1804)
|
||||||
|
6. [Running modems using podman under Red Hat Entreprise Linux 8.2](#6-running-modems-using-podman-under-red-hat-entreprise-linux-82)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 1. Build Strategy #
|
||||||
|
|
||||||
|
For all platforms, the strategy for building docker/podman images is the same:
|
||||||
|
|
||||||
|
* First we create a common shared image that contains:
|
||||||
|
- the latest source files (by using the `COPY` function)
|
||||||
|
- all the means to build an OAI RAN executable
|
||||||
|
* all packages, compilers, ...
|
||||||
|
* especially UHD is installed
|
||||||
|
* Then from this shared image (`ran-build`) we can build target images for:
|
||||||
|
- eNB
|
||||||
|
- gNB
|
||||||
|
- lte-UE
|
||||||
|
- nr-UE
|
||||||
|
* These target images will only contain:
|
||||||
|
- the generated executable (for example `lte-softmodem.Rel15`)
|
||||||
|
- the generated shared libraries (for example `liboai_usrpdevif.so.Rel15`)
|
||||||
|
- the needed libraries and packages to run these generated binaries
|
||||||
|
- Some configuration file templates
|
||||||
|
- Some tools (such as `ping`, `ifconfig`)
|
||||||
|
|
||||||
|
TO DO:
|
||||||
|
|
||||||
|
- Proper entrypoints
|
||||||
|
- Proper port exposure
|
||||||
|
- ...
|
||||||
|
|
||||||
|
# 2. File organization #
|
||||||
|
|
||||||
|
Dockerfiles are named with the following naming convention: `Dockerfile.${target}.${OS-version}.${cluster-version}`
|
||||||
|
|
||||||
|
Targets can be:
|
||||||
|
|
||||||
|
- `ran` for an image named `ran-build` (the shared image)
|
||||||
|
- `eNB` for an image named `oai-enb`
|
||||||
|
- `gNB` for an image named `oai-gnb`
|
||||||
|
- `lteUE` for an image named `oai-lte-ue`
|
||||||
|
- `nrUE` for an image named `oai-nr-ue`
|
||||||
|
|
||||||
|
The currently-supported OS are:
|
||||||
|
|
||||||
|
- `rhel8.2` for Red Hat Entreprise Linux
|
||||||
|
- `ubuntu18` for Ubuntu 18.04 LTS
|
||||||
|
|
||||||
|
The currently-supported cluster version is:
|
||||||
|
|
||||||
|
- `rhel8.2.oc4-4`
|
||||||
|
|
||||||
|
We have also `rhel7.oc4-4` support but it will be discontinued soon.
|
||||||
|
|
||||||
|
For more details in build within a Openshift Cluster, see [OpenShift README](../openshift/README.md) for more details.
|
||||||
|
|
||||||
|
# 3. Building using `docker` under Ubuntu 18.04 #
|
||||||
|
|
||||||
|
## 3.1. Pre-requisites ##
|
||||||
|
|
||||||
|
* `git` installed
|
||||||
|
* `docker-ce` installed
|
||||||
|
* Pulling `ubuntu:bionic` from DockerHub
|
||||||
|
|
||||||
|
## 3.2. Building the shared image ##
|
||||||
|
|
||||||
|
This can be done starting `2020.w41` tag on the `develop` branch, or any branch that includes that tag.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git clone https://gitlab.eurecom.fr/oai/openairinterface5g.git
|
||||||
|
cd openairinterface5g
|
||||||
|
git checkout develop
|
||||||
|
```
|
||||||
|
|
||||||
|
In our Eurecom/OSA environment we need to pass a GIT proxy.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker build --target ran-build --tag ran-build:latest --file docker/Dockerfile.ran.ubuntu18 --build-arg NEEDED_GIT_PROXY="http://proxy.eurecom.fr:8080" .
|
||||||
|
```
|
||||||
|
|
||||||
|
if you don't need it, do NOT pass any value:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker build --target ran-build --tag ran-build:latest --file docker/Dockerfile.ran.ubuntu18 .
|
||||||
|
```
|
||||||
|
|
||||||
|
After a while:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker image ls
|
||||||
|
REPOSITORY TAG IMAGE ID CREATED SIZE
|
||||||
|
ran-build latest ccb721bc0b57 1 minute ago 4.06GB
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
## 3.3. Building any target image ##
|
||||||
|
|
||||||
|
For example, the eNB:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker build --target oai-enb --tag oai-enb:latest --file docker/Dockerfile.eNB.ubuntu18 .
|
||||||
|
```
|
||||||
|
|
||||||
|
After a while:
|
||||||
|
|
||||||
|
```
|
||||||
|
docker image ls
|
||||||
|
REPOSITORY TAG IMAGE ID CREATED SIZE
|
||||||
|
oai-enb latest 25ddbd8b7187 1 minute ago 516MB
|
||||||
|
<none> <none> 875ea3b05b60 8 minutes ago 8.18GB
|
||||||
|
ran-build latest ccb721bc0b57 1 hour ago 4.06GB
|
||||||
|
```
|
||||||
|
|
||||||
|
Do not forget to remove the temporary image:
|
||||||
|
|
||||||
|
```
|
||||||
|
docker image prune --force
|
||||||
|
```
|
||||||
|
|
||||||
|
# 4. Building using `podman` under Red Hat Entreprise Linux 8.2 #
|
||||||
|
|
||||||
|
TODO.
|
||||||
|
|
||||||
|
# 5. Running modems using `docker` under Ubuntu 18.04 #
|
||||||
|
|
||||||
|
TODO.
|
||||||
|
|
||||||
|
# 6. Running modems using `podman` under Red Hat Entreprise Linux 8.2 #
|
||||||
|
|
||||||
|
TODO.
|
||||||
|
|||||||
@@ -170,6 +170,7 @@ typedef struct {
|
|||||||
uint8_t prach_format;
|
uint8_t prach_format;
|
||||||
/// Num RA
|
/// Num RA
|
||||||
uint8_t num_ra;
|
uint8_t num_ra;
|
||||||
|
uint8_t prach_slot;
|
||||||
uint8_t prach_start_symbol;
|
uint8_t prach_start_symbol;
|
||||||
/// 38.211 (NCS 38.211 6.3.3.1).
|
/// 38.211 (NCS 38.211 6.3.3.1).
|
||||||
uint16_t num_cs;
|
uint16_t num_cs;
|
||||||
@@ -179,6 +180,8 @@ typedef struct {
|
|||||||
uint8_t restricted_set;
|
uint8_t restricted_set;
|
||||||
/// see TS 38.211 (6.3.3.2).
|
/// see TS 38.211 (6.3.3.2).
|
||||||
uint16_t freq_msg1;
|
uint16_t freq_msg1;
|
||||||
|
// When multiple SSBs per RO is configured, this indicates which one is selected in this RO -> this is used to properly compute the PRACH preamble
|
||||||
|
uint8_t ssb_nb_in_ro;
|
||||||
// nfapi_nr_ul_beamforming_t beamforming;
|
// nfapi_nr_ul_beamforming_t beamforming;
|
||||||
} fapi_nr_ul_config_prach_pdu;
|
} fapi_nr_ul_config_prach_pdu;
|
||||||
|
|
||||||
|
|||||||
@@ -1260,7 +1260,7 @@ typedef struct
|
|||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
uint8_t pdu_idx;//This value is an index for number of PDU identified by nPDU in this message Value: 0 -> 65535
|
uint8_t pdu_idx;//This value is an index for number of PDU identified by nPDU in this message Value: 0 -> 255
|
||||||
|
|
||||||
} nfapi_nr_ul_tti_request_number_of_ue_t;
|
} nfapi_nr_ul_tti_request_number_of_ue_t;
|
||||||
|
|
||||||
@@ -1541,7 +1541,7 @@ typedef struct
|
|||||||
}nfapi_nr_uci_pucch_pdu_format_2_3_4_t;
|
}nfapi_nr_uci_pucch_pdu_format_2_3_4_t;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
NFAPI_NR_UCI_PDCCH_PDU_TYPE = 0,
|
NFAPI_NR_UCI_PUSCH_PDU_TYPE = 0,
|
||||||
NFAPI_NR_UCI_FORMAT_0_1_PDU_TYPE = 1,
|
NFAPI_NR_UCI_FORMAT_0_1_PDU_TYPE = 1,
|
||||||
NFAPI_NR_UCI_FORMAT_2_3_4_PDU_TYPE = 2,
|
NFAPI_NR_UCI_FORMAT_2_3_4_PDU_TYPE = 2,
|
||||||
} nfapi_nr_uci_pdu_type_e;
|
} nfapi_nr_uci_pdu_type_e;
|
||||||
|
|||||||
@@ -260,7 +260,7 @@ crc6 (unsigned char * inptr, int bitlen)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (resbit > 0)
|
if (resbit > 0)
|
||||||
crc = (crc << resbit) ^ (crc8Table[((*inptr) >> (8 - resbit)) ^ (crc >> (32 - resbit))] << 24);
|
crc = (crc << resbit) ^ (crc6Table[((*inptr) >> (8 - resbit)) ^ (crc >> (32 - resbit))] << 24);
|
||||||
|
|
||||||
return crc;
|
return crc;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -181,9 +181,27 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB,
|
|||||||
LOG_D(PHY,"Initializing PUSCH DMRS Gold sequence with (%x,%x)\n",Nid_pusch[0],Nid_pusch[1]);
|
LOG_D(PHY,"Initializing PUSCH DMRS Gold sequence with (%x,%x)\n",Nid_pusch[0],Nid_pusch[1]);
|
||||||
nr_gold_pusch(gNB, &Nid_pusch[0]);
|
nr_gold_pusch(gNB, &Nid_pusch[0]);
|
||||||
|
|
||||||
|
//CSI RS init
|
||||||
|
gNB->nr_gold_csi_rs = (uint32_t ***)malloc16(fp->slots_per_frame*sizeof(uint32_t **));
|
||||||
|
uint32_t ***csi_rs = gNB->nr_gold_csi_rs;
|
||||||
|
AssertFatal(csi_rs!=NULL, "NR init: csi reference signal malloc failed\n");
|
||||||
|
|
||||||
|
for (int slot=0; slot<fp->slots_per_frame; slot++) {
|
||||||
|
csi_rs[slot] = (uint32_t **)malloc16(fp->symbols_per_slot*sizeof(uint32_t *));
|
||||||
|
AssertFatal(csi_rs[slot]!=NULL, "NR init: csi reference signal for slot %d - malloc failed\n", slot);
|
||||||
|
|
||||||
|
for (int symb=0; symb<fp->symbols_per_slot; symb++) {
|
||||||
|
csi_rs[slot][symb] = (uint32_t *)malloc16(NR_MAX_CSI_RS_INIT_LENGTH_DWORD*sizeof(uint32_t));
|
||||||
|
AssertFatal(csi_rs[slot][symb]!=NULL, "NR init: csi reference signal for slot %d symbol %d - malloc failed\n", slot, symb);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
nr_init_csi_rs(gNB, 0); // TODO scramblingID currently hardcoded to 0, to be taken from higher layer parameter scramblingID when implemented
|
||||||
|
|
||||||
/// Transport init necessary for NR synchro
|
/// Transport init necessary for NR synchro
|
||||||
init_nr_transport(gNB);
|
init_nr_transport(gNB);
|
||||||
|
|
||||||
|
|
||||||
gNB->first_run_I0_measurements = 1;
|
gNB->first_run_I0_measurements = 1;
|
||||||
|
|
||||||
common_vars->rxdata = (int32_t **)malloc16(Prx*sizeof(int32_t*));
|
common_vars->rxdata = (int32_t **)malloc16(Prx*sizeof(int32_t*));
|
||||||
|
|||||||
@@ -385,7 +385,7 @@ int nr_init_frame_parms_ue(NR_DL_FRAME_PARMS *fp,
|
|||||||
fp->Lmax = 64;
|
fp->Lmax = 64;
|
||||||
}
|
}
|
||||||
|
|
||||||
fp->L_ssb = (((uint64_t) config->ssb_table.ssb_mask_list[1].ssb_mask)<<32) | config->ssb_table.ssb_mask_list[1].ssb_mask;
|
fp->L_ssb = (((uint64_t) config->ssb_table.ssb_mask_list[0].ssb_mask)<<32) | config->ssb_table.ssb_mask_list[1].ssb_mask;
|
||||||
|
|
||||||
fp->N_ssb = 0;
|
fp->N_ssb = 0;
|
||||||
for (int p=0; p<fp->Lmax; p++)
|
for (int p=0; p<fp->Lmax; p++)
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ void nr_init_pdcch_dmrs(PHY_VARS_gNB* gNB, uint32_t Nid)
|
|||||||
for (uint8_t symb=0; symb<fp->symbols_per_slot; symb++) {
|
for (uint8_t symb=0; symb<fp->symbols_per_slot; symb++) {
|
||||||
|
|
||||||
reset = 1;
|
reset = 1;
|
||||||
x2 = ((1<<17) * (14*slot+symb+1) * ((Nid<<1)+1)) + (Nid<<1);
|
x2 = ((1<<17) * (fp->symbols_per_slot*slot+symb+1) * ((Nid<<1)+1) + (Nid<<1));
|
||||||
|
|
||||||
for (uint32_t n=0; n<NR_MAX_PDCCH_DMRS_INIT_LENGTH_DWORD; n++) {
|
for (uint32_t n=0; n<NR_MAX_PDCCH_DMRS_INIT_LENGTH_DWORD; n++) {
|
||||||
pdcch_dmrs[slot][symb][n] = lte_gold_generic(&x1, &x2, reset);
|
pdcch_dmrs[slot][symb][n] = lte_gold_generic(&x1, &x2, reset);
|
||||||
@@ -130,3 +130,26 @@ void nr_gold_pusch(PHY_VARS_gNB* gNB, uint32_t *Nid) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void nr_init_csi_rs(PHY_VARS_gNB* gNB, uint32_t Nid)
|
||||||
|
{
|
||||||
|
NR_DL_FRAME_PARMS *fp = &gNB->frame_parms;
|
||||||
|
uint32_t ***csi_rs = gNB->nr_gold_csi_rs;
|
||||||
|
uint32_t x1, x2;
|
||||||
|
uint8_t reset;
|
||||||
|
|
||||||
|
for (uint8_t slot=0; slot<fp->slots_per_frame; slot++) {
|
||||||
|
for (uint8_t symb=0; symb<fp->symbols_per_slot; symb++) {
|
||||||
|
|
||||||
|
reset = 1;
|
||||||
|
x2 = ((1<<10) * (fp->symbols_per_slot*slot+symb+1) * ((Nid<<1)+1) + (Nid));
|
||||||
|
|
||||||
|
for (uint32_t n=0; n<NR_MAX_PDCCH_DMRS_INIT_LENGTH_DWORD; n++) {
|
||||||
|
csi_rs[slot][symb][n] = lte_gold_generic(&x1, &x2, reset);
|
||||||
|
reset = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ void nr_init_pbch_dmrs(PHY_VARS_gNB* gNB);
|
|||||||
*/
|
*/
|
||||||
void nr_init_pdcch_dmrs(PHY_VARS_gNB* gNB, uint32_t Nid);
|
void nr_init_pdcch_dmrs(PHY_VARS_gNB* gNB, uint32_t Nid);
|
||||||
void nr_init_pdsch_dmrs(PHY_VARS_gNB* gNB, uint32_t Nid);
|
void nr_init_pdsch_dmrs(PHY_VARS_gNB* gNB, uint32_t Nid);
|
||||||
|
void nr_init_csi_rs(PHY_VARS_gNB* gNB, uint32_t Nid);
|
||||||
|
|
||||||
void nr_gold_pusch(PHY_VARS_gNB* gNB, uint32_t *Nid);
|
void nr_gold_pusch(PHY_VARS_gNB* gNB, uint32_t *Nid);
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,608 @@
|
|||||||
|
/*
|
||||||
|
* 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
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "PHY/NR_TRANSPORT/nr_transport_proto.h"
|
||||||
|
#include "PHY/MODULATION/nr_modulation.h"
|
||||||
|
|
||||||
|
//#define NR_CSIRS_DEBUG
|
||||||
|
|
||||||
|
int nr_generate_csi_rs(uint32_t **gold_csi_rs,
|
||||||
|
int32_t** txdataF,
|
||||||
|
int16_t amp,
|
||||||
|
NR_DL_FRAME_PARMS frame_parms,
|
||||||
|
nfapi_nr_dl_tti_csi_rs_pdu_rel15_t csi_params)
|
||||||
|
{
|
||||||
|
|
||||||
|
int16_t mod_csi[frame_parms.symbols_per_slot][NR_MAX_CSI_RS_LENGTH>>1];
|
||||||
|
uint16_t b = csi_params.freq_domain;
|
||||||
|
uint16_t n, csi_bw, csi_start, p, k, l, mprime, na, kpn, csi_length;
|
||||||
|
uint8_t size, ports, kprime, lprime, i, gs;
|
||||||
|
uint8_t j[16], k_n[6], koverline[16], loverline[16];
|
||||||
|
int found = 0;
|
||||||
|
int wf, wt, lp, kp, symb;
|
||||||
|
uint8_t fi = 0;
|
||||||
|
double rho, alpha;
|
||||||
|
uint32_t beta = amp;
|
||||||
|
|
||||||
|
AssertFatal(b!=0, "Invalid CSI frequency domain mapping: no bit selected in bitmap\n");
|
||||||
|
|
||||||
|
switch (csi_params.row) {
|
||||||
|
// implementation of table 7.4.1.5.3-1 of 38.211
|
||||||
|
// lprime and kprime are the max value of l' and k'
|
||||||
|
case 1:
|
||||||
|
ports = 1;
|
||||||
|
kprime = 0;
|
||||||
|
lprime = 0;
|
||||||
|
size = 3;
|
||||||
|
while (found < 1) {
|
||||||
|
if ((b >> fi) & 0x01) {
|
||||||
|
k_n[found] = fi;
|
||||||
|
found++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
fi++;
|
||||||
|
}
|
||||||
|
for (i=0; i<size; i++) {
|
||||||
|
j[i] = 0;
|
||||||
|
loverline[i] = csi_params.symb_l0;
|
||||||
|
koverline[i] = k_n[0] + (i<<2);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
ports = 1;
|
||||||
|
kprime = 0;
|
||||||
|
lprime = 0;
|
||||||
|
size = 1;
|
||||||
|
while (found < 1) {
|
||||||
|
if ((b >> fi) & 0x01) {
|
||||||
|
k_n[found] = fi;
|
||||||
|
found++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
fi++;
|
||||||
|
}
|
||||||
|
for (i=0; i<size; i++) {
|
||||||
|
j[i] = 0;
|
||||||
|
loverline[i] = csi_params.symb_l0;
|
||||||
|
koverline[i] = k_n[0];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 3:
|
||||||
|
ports = 2;
|
||||||
|
kprime = 1;
|
||||||
|
lprime = 0;
|
||||||
|
size = 1;
|
||||||
|
while (found < 1) {
|
||||||
|
if ((b >> fi) & 0x01) {
|
||||||
|
k_n[found] = fi<<1;
|
||||||
|
found++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
fi++;
|
||||||
|
}
|
||||||
|
for (i=0; i<size; i++) {
|
||||||
|
j[i] = 0;
|
||||||
|
loverline[i] = csi_params.symb_l0;
|
||||||
|
koverline[i] = k_n[0];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 4:
|
||||||
|
ports = 4;
|
||||||
|
kprime = 1;
|
||||||
|
lprime = 0;
|
||||||
|
size = 2;
|
||||||
|
while (found < 1) {
|
||||||
|
if ((b >> fi) & 0x01) {
|
||||||
|
k_n[found] = fi<<2;
|
||||||
|
found++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
fi++;
|
||||||
|
}
|
||||||
|
for (i=0; i<size; i++) {
|
||||||
|
j[i] = i;
|
||||||
|
loverline[i] = csi_params.symb_l0;
|
||||||
|
koverline[i] = k_n[0] + (i<<1);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 5:
|
||||||
|
ports = 4;
|
||||||
|
kprime = 1;
|
||||||
|
lprime = 0;
|
||||||
|
size = 2;
|
||||||
|
while (found < 1) {
|
||||||
|
if ((b >> fi) & 0x01) {
|
||||||
|
k_n[found] = fi<<1;
|
||||||
|
found++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
fi++;
|
||||||
|
}
|
||||||
|
for (i=0; i<size; i++) {
|
||||||
|
j[i] = i;
|
||||||
|
loverline[i] = csi_params.symb_l0 + i;
|
||||||
|
koverline[i] = k_n[0];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 6:
|
||||||
|
ports = 8;
|
||||||
|
kprime = 1;
|
||||||
|
lprime = 0;
|
||||||
|
size = 4;
|
||||||
|
while (found < 4) {
|
||||||
|
if ((b >> fi) & 0x01) {
|
||||||
|
k_n[found] = fi<<1;
|
||||||
|
found++;
|
||||||
|
}
|
||||||
|
fi++;
|
||||||
|
}
|
||||||
|
for (i=0; i<size; i++) {
|
||||||
|
j[i] = i;
|
||||||
|
loverline[i] = csi_params.symb_l0;
|
||||||
|
koverline[i] = k_n[i];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 7:
|
||||||
|
ports = 8;
|
||||||
|
kprime = 1;
|
||||||
|
lprime = 0;
|
||||||
|
size = 4;
|
||||||
|
while (found < 2) {
|
||||||
|
if ((b >> fi) & 0x01) {
|
||||||
|
k_n[found] = fi<<1;
|
||||||
|
found++;
|
||||||
|
}
|
||||||
|
fi++;
|
||||||
|
}
|
||||||
|
for (i=0; i<size; i++) {
|
||||||
|
j[i] = i;
|
||||||
|
loverline[i] = csi_params.symb_l0 + (i>>1);
|
||||||
|
koverline[i] = k_n[i%2];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 8:
|
||||||
|
ports = 8;
|
||||||
|
kprime = 1;
|
||||||
|
lprime = 1;
|
||||||
|
size = 2;
|
||||||
|
while (found < 2) {
|
||||||
|
if ((b >> fi) & 0x01) {
|
||||||
|
k_n[found] = fi<<1;
|
||||||
|
found++;
|
||||||
|
}
|
||||||
|
fi++;
|
||||||
|
}
|
||||||
|
for (i=0; i<size; i++) {
|
||||||
|
j[i] = i;
|
||||||
|
loverline[i] = csi_params.symb_l0;
|
||||||
|
koverline[i] = k_n[i];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 9:
|
||||||
|
ports = 12;
|
||||||
|
kprime = 1;
|
||||||
|
lprime = 0;
|
||||||
|
size = 6;
|
||||||
|
while (found < 6) {
|
||||||
|
if ((b >> fi) & 0x01) {
|
||||||
|
k_n[found] = fi<<1;
|
||||||
|
found++;
|
||||||
|
}
|
||||||
|
fi++;
|
||||||
|
}
|
||||||
|
for (i=0; i<size; i++) {
|
||||||
|
j[i] = i;
|
||||||
|
loverline[i] = csi_params.symb_l0;
|
||||||
|
koverline[i] = k_n[i];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 10:
|
||||||
|
ports = 12;
|
||||||
|
kprime = 1;
|
||||||
|
lprime = 1;
|
||||||
|
size = 3;
|
||||||
|
while (found < 3) {
|
||||||
|
if ((b >> fi) & 0x01) {
|
||||||
|
k_n[found] = fi<<1;
|
||||||
|
found++;
|
||||||
|
}
|
||||||
|
fi++;
|
||||||
|
}
|
||||||
|
for (i=0; i<size; i++) {
|
||||||
|
j[i] = i;
|
||||||
|
loverline[i] = csi_params.symb_l0;
|
||||||
|
koverline[i] = k_n[i];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 11:
|
||||||
|
ports = 16;
|
||||||
|
kprime = 1;
|
||||||
|
lprime = 0;
|
||||||
|
size = 8;
|
||||||
|
while (found < 4) {
|
||||||
|
if ((b >> fi) & 0x01) {
|
||||||
|
k_n[found] = fi<<1;
|
||||||
|
found++;
|
||||||
|
}
|
||||||
|
fi++;
|
||||||
|
}
|
||||||
|
for (i=0; i<size; i++) {
|
||||||
|
j[i] = i;
|
||||||
|
loverline[i] = csi_params.symb_l0 + (i>>2);
|
||||||
|
koverline[i] = k_n[i%4];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 12:
|
||||||
|
ports = 16;
|
||||||
|
kprime = 1;
|
||||||
|
lprime = 1;
|
||||||
|
size = 4;
|
||||||
|
while (found < 4) {
|
||||||
|
if ((b >> fi) & 0x01) {
|
||||||
|
k_n[found] = fi<<1;
|
||||||
|
found++;
|
||||||
|
}
|
||||||
|
fi++;
|
||||||
|
}
|
||||||
|
for (i=0; i<size; i++) {
|
||||||
|
j[i] = i;
|
||||||
|
loverline[i] = csi_params.symb_l0;
|
||||||
|
koverline[i] = k_n[i];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 13:
|
||||||
|
ports = 24;
|
||||||
|
kprime = 1;
|
||||||
|
lprime = 0;
|
||||||
|
size = 12;
|
||||||
|
while (found < 3) {
|
||||||
|
if ((b >> fi) & 0x01) {
|
||||||
|
k_n[found] = fi<<1;
|
||||||
|
found++;
|
||||||
|
}
|
||||||
|
fi++;
|
||||||
|
}
|
||||||
|
for (i=0; i<size; i++) {
|
||||||
|
j[i] = i;
|
||||||
|
if (i<6)
|
||||||
|
loverline[i] = csi_params.symb_l0 + i/3;
|
||||||
|
else
|
||||||
|
loverline[i] = csi_params.symb_l1 + i/9;
|
||||||
|
koverline[i] = k_n[i%3];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 14:
|
||||||
|
ports = 24;
|
||||||
|
kprime = 1;
|
||||||
|
lprime = 1;
|
||||||
|
size = 6;
|
||||||
|
while (found < 3) {
|
||||||
|
if ((b >> fi) & 0x01) {
|
||||||
|
k_n[found] = fi<<1;
|
||||||
|
found++;
|
||||||
|
}
|
||||||
|
fi++;
|
||||||
|
}
|
||||||
|
for (i=0; i<size; i++) {
|
||||||
|
j[i] = i;
|
||||||
|
if (i<3)
|
||||||
|
loverline[i] = csi_params.symb_l0;
|
||||||
|
else
|
||||||
|
loverline[i] = csi_params.symb_l1;
|
||||||
|
koverline[i] = k_n[i%3];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 15:
|
||||||
|
ports = 24;
|
||||||
|
kprime = 1;
|
||||||
|
lprime = 3;
|
||||||
|
size = 3;
|
||||||
|
while (found < 3) {
|
||||||
|
if ((b >> fi) & 0x01) {
|
||||||
|
k_n[found] = fi<<1;
|
||||||
|
found++;
|
||||||
|
}
|
||||||
|
fi++;
|
||||||
|
}
|
||||||
|
for (i=0; i<size; i++) {
|
||||||
|
j[i] = i;
|
||||||
|
loverline[i] = csi_params.symb_l0;
|
||||||
|
koverline[i] = k_n[i];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 16:
|
||||||
|
ports = 32;
|
||||||
|
kprime = 1;
|
||||||
|
lprime = 0;
|
||||||
|
size = 16;
|
||||||
|
while (found < 4) {
|
||||||
|
if ((b >> fi) & 0x01) {
|
||||||
|
k_n[found] = fi<<1;
|
||||||
|
found++;
|
||||||
|
}
|
||||||
|
fi++;
|
||||||
|
}
|
||||||
|
for (i=0; i<size; i++) {
|
||||||
|
j[i] = i;
|
||||||
|
if (i<8)
|
||||||
|
loverline[i] = csi_params.symb_l0 + (i>>2);
|
||||||
|
else
|
||||||
|
loverline[i] = csi_params.symb_l1 + (i/12);
|
||||||
|
koverline[i] = k_n[i%4];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 17:
|
||||||
|
ports = 32;
|
||||||
|
kprime = 1;
|
||||||
|
lprime = 1;
|
||||||
|
size = 8;
|
||||||
|
while (found < 4) {
|
||||||
|
if ((b >> fi) & 0x01) {
|
||||||
|
k_n[found] = fi<<1;
|
||||||
|
found++;
|
||||||
|
}
|
||||||
|
fi++;
|
||||||
|
}
|
||||||
|
for (i=0; i<size; i++) {
|
||||||
|
j[i] = i;
|
||||||
|
if (i<4)
|
||||||
|
loverline[i] = csi_params.symb_l0;
|
||||||
|
else
|
||||||
|
loverline[i] = csi_params.symb_l1;
|
||||||
|
koverline[i] = k_n[i%4];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 18:
|
||||||
|
ports = 32;
|
||||||
|
kprime = 1;
|
||||||
|
lprime = 3;
|
||||||
|
size = 4;
|
||||||
|
while (found < 4) {
|
||||||
|
if ((b >> fi) & 0x01) {
|
||||||
|
k_n[found] = fi<<1;
|
||||||
|
found++;
|
||||||
|
}
|
||||||
|
fi++;
|
||||||
|
}
|
||||||
|
for (i=0; i<size; i++) {
|
||||||
|
j[i] = i;
|
||||||
|
loverline[i] = csi_params.symb_l0;
|
||||||
|
koverline[i] = k_n[i];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
AssertFatal(0==1, "Row %d is not valid for CSI Table 7.4.1.5.3-1\n", csi_params.row);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef NR_CSIRS_DEBUG
|
||||||
|
printf(" row %d, n. of ports %d\n k' ",csi_params.row,ports);
|
||||||
|
for (kp=0; kp<=kprime; kp++)
|
||||||
|
printf("%d, ",kp);
|
||||||
|
printf("l' ");
|
||||||
|
for (lp=0; lp<=lprime; lp++)
|
||||||
|
printf("%d, ",lp);
|
||||||
|
printf("\n k overline ");
|
||||||
|
for (i=0; i<size; i++)
|
||||||
|
printf("%d, ",koverline[i]);
|
||||||
|
printf("\n l overline ");
|
||||||
|
for (i=0; i<size; i++)
|
||||||
|
printf("%d, ",loverline[i]);
|
||||||
|
printf("\n");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
// setting the frequency density from its index
|
||||||
|
switch (csi_params.freq_density) {
|
||||||
|
|
||||||
|
case 0:
|
||||||
|
rho = 0.5;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 1:
|
||||||
|
rho = 0.5;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
rho = 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 3:
|
||||||
|
rho = 3;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
AssertFatal(0==1, "Invalid frequency density index for CSI\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ports == 1)
|
||||||
|
alpha = rho;
|
||||||
|
else
|
||||||
|
alpha = 2*rho;
|
||||||
|
|
||||||
|
#ifdef NR_CSIRS_DEBUG
|
||||||
|
printf(" rho %f, alpha %f\n",rho,alpha);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// CDM group size from CDM type index
|
||||||
|
switch (csi_params.cdm_type) {
|
||||||
|
|
||||||
|
case 0:
|
||||||
|
gs = 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 1:
|
||||||
|
gs = 2;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
gs = 4;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 3:
|
||||||
|
gs = 8;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
AssertFatal(0==1, "Invalid cdm type index for CSI\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
// according to 38.214 5.2.2.3.1 last paragraph
|
||||||
|
if (csi_params.start_rb<csi_params.bwp_start)
|
||||||
|
csi_start = csi_params.bwp_start;
|
||||||
|
else
|
||||||
|
csi_start = csi_params.start_rb;
|
||||||
|
if (csi_params.nr_of_rbs > (csi_params.bwp_start+csi_params.bwp_size-csi_start))
|
||||||
|
csi_bw = csi_params.bwp_start+csi_params.bwp_size-csi_start;
|
||||||
|
else
|
||||||
|
csi_bw = csi_params.nr_of_rbs;
|
||||||
|
|
||||||
|
if (rho < 1) {
|
||||||
|
if (csi_params.freq_density == 0)
|
||||||
|
csi_length = (((csi_bw + csi_start)>>1)<<kprime)<<1;
|
||||||
|
else
|
||||||
|
csi_length = ((((csi_bw + csi_start)>>1)<<kprime)+1)<<1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
csi_length = (((uint16_t) rho*(csi_bw + csi_start))<<kprime)<<1;
|
||||||
|
|
||||||
|
#ifdef NR_CSIRS_DEBUG
|
||||||
|
printf(" start rb %d, n. rbs %d, csi length %d\n",csi_start,csi_bw,csi_length);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
// TRS
|
||||||
|
if (csi_params.csi_type == 0) {
|
||||||
|
// ???
|
||||||
|
}
|
||||||
|
|
||||||
|
// NZP CSI RS
|
||||||
|
if (csi_params.csi_type == 1) {
|
||||||
|
// assuming amp is the amplitude of SSB channels
|
||||||
|
switch (csi_params.power_control_offset_ss) {
|
||||||
|
case 0:
|
||||||
|
beta = (amp*ONE_OVER_SQRT2_Q15)>>15;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 1:
|
||||||
|
beta = amp;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
beta = (amp*ONE_OVER_SQRT2_Q15)>>14;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 3:
|
||||||
|
beta = amp<<1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
AssertFatal(0==1, "Invalid SS power offset density index for CSI\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
for (lp=0; lp<=lprime; lp++){
|
||||||
|
symb = csi_params.symb_l0;
|
||||||
|
nr_modulation(gold_csi_rs[symb+lp], csi_length, DMRS_MOD_ORDER, mod_csi[symb+lp]);
|
||||||
|
if ((csi_params.row == 5) || (csi_params.row == 7) || (csi_params.row == 11) || (csi_params.row == 13) || (csi_params.row == 16))
|
||||||
|
nr_modulation(gold_csi_rs[symb+1], csi_length, DMRS_MOD_ORDER, mod_csi[symb+1]);
|
||||||
|
if ((csi_params.row == 14) || (csi_params.row == 13) || (csi_params.row == 16) || (csi_params.row == 17)) {
|
||||||
|
symb = csi_params.symb_l1;
|
||||||
|
nr_modulation(gold_csi_rs[symb+lp], csi_length, DMRS_MOD_ORDER, mod_csi[symb+lp]);
|
||||||
|
if ((csi_params.row == 13) || (csi_params.row == 16))
|
||||||
|
nr_modulation(gold_csi_rs[symb+1], csi_length, DMRS_MOD_ORDER, mod_csi[symb+1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t start_sc = frame_parms.first_carrier_offset;
|
||||||
|
|
||||||
|
// resource mapping according to 38.211 7.4.1.5.3
|
||||||
|
for (n=csi_start; n<(csi_start+csi_bw); n++) {
|
||||||
|
if ( (csi_params.freq_density > 1) || (csi_params.freq_density == (n%2))) { // for freq density 0.5 checks if even or odd RB
|
||||||
|
for (int ji=0; ji<size; ji++) { // loop over CDM groups
|
||||||
|
for (int s=0 ; s<gs; s++) { // loop over each CDM group size
|
||||||
|
p = s+j[ji]*gs; // port index
|
||||||
|
for (kp=0; kp<=kprime; kp++) { // loop over frequency resource elements within a group
|
||||||
|
k = (start_sc+(n*NR_NB_SC_PER_RB)+koverline[ji]+kp)%(frame_parms.ofdm_symbol_size); // frequency index of current resource element
|
||||||
|
// wf according to tables 7.4.5.3-2 to 7.4.5.3-5
|
||||||
|
if (kp == 0)
|
||||||
|
wf = 1;
|
||||||
|
else
|
||||||
|
wf = -2*(s%2)+1;
|
||||||
|
na = n*alpha;
|
||||||
|
kpn = (rho*koverline[ji])/NR_NB_SC_PER_RB;
|
||||||
|
mprime = na + kp + kpn; // sequence index
|
||||||
|
for (lp=0; lp<=lprime; lp++) { // loop over frequency resource elements within a group
|
||||||
|
l = lp + loverline[ji];
|
||||||
|
// wt according to tables 7.4.5.3-2 to 7.4.5.3-5
|
||||||
|
if (s < 2)
|
||||||
|
wt = 1;
|
||||||
|
else if (s < 4)
|
||||||
|
wt = -2*(lp%2)+1;
|
||||||
|
else if (s < 6)
|
||||||
|
wt = -2*(lp/2)+1;
|
||||||
|
else {
|
||||||
|
if ((lp == 0) || (lp == 3))
|
||||||
|
wt = 1;
|
||||||
|
else
|
||||||
|
wt = -1;
|
||||||
|
}
|
||||||
|
// ZP CSI RS
|
||||||
|
if (csi_params.csi_type == 2) {
|
||||||
|
((int16_t*)txdataF[p])[(l*frame_parms.ofdm_symbol_size + k)<<1] = 0;
|
||||||
|
((int16_t*)txdataF[p])[((l*frame_parms.ofdm_symbol_size + k)<<1) + 1] = 0;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
((int16_t*)txdataF[p])[(l*frame_parms.ofdm_symbol_size + k)<<1] = (beta*wt*wf*mod_csi[l][mprime<<1]) >> 15;
|
||||||
|
((int16_t*)txdataF[p])[((l*frame_parms.ofdm_symbol_size + k)<<1) + 1] = (beta*wt*wf*mod_csi[l][(mprime<<1) + 1]) >> 15;
|
||||||
|
}
|
||||||
|
#ifdef NR_CSIRS_DEBUG
|
||||||
|
printf("l,k (%d %d) seq. index %d \t port %d \t (%d,%d)\n",l,k-start_sc,mprime,p+3000,((int16_t*)txdataF[p])[(l*frame_parms.ofdm_symbol_size + k)<<1],
|
||||||
|
((int16_t*)txdataF[p])[((l*frame_parms.ofdm_symbol_size + k)<<1) + 1]);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
@@ -327,6 +327,13 @@ int nr_find_pucch(uint16_t rnti,
|
|||||||
void init_prach_list(PHY_VARS_gNB *gNB);
|
void init_prach_list(PHY_VARS_gNB *gNB);
|
||||||
void init_prach_ru_list(RU_t *ru);
|
void init_prach_ru_list(RU_t *ru);
|
||||||
void free_nr_ru_prach_entry(RU_t *ru, int prach_id);
|
void free_nr_ru_prach_entry(RU_t *ru, int prach_id);
|
||||||
|
|
||||||
|
int nr_generate_csi_rs(uint32_t **gold_csi_rs,
|
||||||
|
int32_t **txdataF,
|
||||||
|
int16_t amp,
|
||||||
|
NR_DL_FRAME_PARMS frame_parms,
|
||||||
|
nfapi_nr_dl_tti_csi_rs_pdu_rel15_t csi_params);
|
||||||
|
|
||||||
void free_nr_prach_entry(PHY_VARS_gNB *gNB, int prach_id);
|
void free_nr_prach_entry(PHY_VARS_gNB *gNB, int prach_id);
|
||||||
|
|
||||||
void nr_decode_pucch1(int32_t **rxdataF,
|
void nr_decode_pucch1(int32_t **rxdataF,
|
||||||
@@ -354,5 +361,10 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
|
|||||||
nfapi_nr_uci_pucch_pdu_format_0_1_t* uci_pdu,
|
nfapi_nr_uci_pucch_pdu_format_0_1_t* uci_pdu,
|
||||||
nfapi_nr_pucch_pdu_t* pucch_pdu);
|
nfapi_nr_pucch_pdu_t* pucch_pdu);
|
||||||
|
|
||||||
|
void nr_decode_pucch2(PHY_VARS_gNB *gNB,
|
||||||
|
int slot,
|
||||||
|
nfapi_nr_uci_pucch_pdu_format_2_3_4_t* uci_pdu,
|
||||||
|
nfapi_nr_pucch_pdu_t* pucch_pdu);
|
||||||
|
|
||||||
|
|
||||||
#endif /*__NR_TRANSPORT__H__*/
|
#endif /*__NR_TRANSPORT__H__*/
|
||||||
|
|||||||
@@ -478,7 +478,12 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
|
|||||||
|
|
||||||
NR_gNB_ULSCH_t *ulsch = phy_vars_gNB->ulsch[UE_id][0];
|
NR_gNB_ULSCH_t *ulsch = phy_vars_gNB->ulsch[UE_id][0];
|
||||||
NR_UL_gNB_HARQ_t *harq_process = ulsch->harq_processes[harq_pid];
|
NR_UL_gNB_HARQ_t *harq_process = ulsch->harq_processes[harq_pid];
|
||||||
|
|
||||||
|
if (!harq_process) {
|
||||||
|
LOG_E(PHY,"ulsch_decoding.c: NULL harq_process pointer\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
t_nrLDPC_dec_params decParams;
|
t_nrLDPC_dec_params decParams;
|
||||||
t_nrLDPC_dec_params* p_decParams = &decParams;
|
t_nrLDPC_dec_params* p_decParams = &decParams;
|
||||||
|
|
||||||
@@ -488,11 +493,6 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
|
|||||||
phy_vars_gNB->nbDecode = 0;
|
phy_vars_gNB->nbDecode = 0;
|
||||||
harq_process->processedSegments = 0;
|
harq_process->processedSegments = 0;
|
||||||
|
|
||||||
if (!harq_process) {
|
|
||||||
LOG_E(PHY,"ulsch_decoding.c: NULL harq_process pointer\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
double Coderate = 0.0;
|
double Coderate = 0.0;
|
||||||
|
|
||||||
// ------------------------------------------------------------------
|
// ------------------------------------------------------------------
|
||||||
|
|||||||
@@ -1136,8 +1136,8 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB,
|
|||||||
rel15_ul);
|
rel15_ul);
|
||||||
|
|
||||||
for (aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++) {
|
for (aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++) {
|
||||||
gNB->pusch_vars[ulsch_id]->ulsch_power[aarx] = signal_energy(&gNB->pusch_vars[ulsch_id]->ul_ch_estimates[aarx][symbol*frame_parms->ofdm_symbol_size],
|
gNB->pusch_vars[ulsch_id]->ulsch_power[aarx] = signal_energy_nodc(&gNB->pusch_vars[ulsch_id]->ul_ch_estimates[aarx][symbol*frame_parms->ofdm_symbol_size],
|
||||||
rel15_ul->rb_size*12);
|
rel15_ul->rb_size*12);
|
||||||
if (gNB->pusch_vars[ulsch_id]->ulsch_power[aarx]==1) return (1);
|
if (gNB->pusch_vars[ulsch_id]->ulsch_power[aarx]==1) return (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -96,7 +96,6 @@ void nr_fill_pucch(PHY_VARS_gNB *gNB,
|
|||||||
pucch->slot = slot;
|
pucch->slot = slot;
|
||||||
pucch->active = 1;
|
pucch->active = 1;
|
||||||
memcpy((void*)&pucch->pucch_pdu, (void*)pucch_pdu, sizeof(nfapi_nr_pucch_pdu_t));
|
memcpy((void*)&pucch->pucch_pdu, (void*)pucch_pdu, sizeof(nfapi_nr_pucch_pdu_t));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -166,7 +165,6 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
|
|||||||
nfapi_nr_uci_pucch_pdu_format_0_1_t* uci_pdu,
|
nfapi_nr_uci_pucch_pdu_format_0_1_t* uci_pdu,
|
||||||
nfapi_nr_pucch_pdu_t* pucch_pdu) {
|
nfapi_nr_pucch_pdu_t* pucch_pdu) {
|
||||||
|
|
||||||
|
|
||||||
int32_t **rxdataF = gNB->common_vars.rxdataF;
|
int32_t **rxdataF = gNB->common_vars.rxdataF;
|
||||||
NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms;
|
NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms;
|
||||||
|
|
||||||
@@ -381,7 +379,7 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// estimate CQI for MAC (from antenna port 0 only)
|
// estimate CQI for MAC (from antenna port 0 only)
|
||||||
int SNRtimes10 = dB_fixed_times10(signal_energy(&rxdataF[0][pucch_pdu->start_symbol_index*frame_parms->ofdm_symbol_size+re_offset],12)) - (10*gNB->measurements.n0_power_tot_dB);
|
int SNRtimes10 = dB_fixed_times10(signal_energy_nodc(&rxdataF[0][pucch_pdu->start_symbol_index*frame_parms->ofdm_symbol_size+re_offset],12)) - (10*gNB->measurements.n0_power_tot_dB);
|
||||||
int cqi;
|
int cqi;
|
||||||
if (SNRtimes10 < -640) cqi=0;
|
if (SNRtimes10 < -640) cqi=0;
|
||||||
else if (SNRtimes10 > 635) cqi=255;
|
else if (SNRtimes10 > 635) cqi=255;
|
||||||
@@ -395,9 +393,9 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
|
|||||||
// first bit of bitmap for sr presence and second bit for acknack presence
|
// first bit of bitmap for sr presence and second bit for acknack presence
|
||||||
uci_pdu->pduBitmap = pucch_pdu->sr_flag | ((pucch_pdu->bit_len_harq>0)<<1);
|
uci_pdu->pduBitmap = pucch_pdu->sr_flag | ((pucch_pdu->bit_len_harq>0)<<1);
|
||||||
uci_pdu->pucch_format = 0; // format 0
|
uci_pdu->pucch_format = 0; // format 0
|
||||||
uci_pdu->ul_cqi = cqi; // currently not valid
|
uci_pdu->ul_cqi = cqi;
|
||||||
uci_pdu->timing_advance = 0xffff; // currently not valid
|
uci_pdu->timing_advance = 0xffff; // currently not valid
|
||||||
uci_pdu->rssi = 1280 - (10*dB_fixed(32767*32767)-dB_fixed_times10(signal_energy(&rxdataF[0][pucch_pdu->start_symbol_index*frame_parms->ofdm_symbol_size+re_offset],12)));
|
uci_pdu->rssi = 1280 - (10*dB_fixed(32767*32767)-dB_fixed_times10(signal_energy_nodc(&rxdataF[0][pucch_pdu->start_symbol_index*frame_parms->ofdm_symbol_size+re_offset],12)));
|
||||||
if (pucch_pdu->bit_len_harq==0) {
|
if (pucch_pdu->bit_len_harq==0) {
|
||||||
uci_pdu->harq = NULL;
|
uci_pdu->harq = NULL;
|
||||||
uci_pdu->sr = calloc(1,sizeof(*uci_pdu->sr));
|
uci_pdu->sr = calloc(1,sizeof(*uci_pdu->sr));
|
||||||
@@ -414,8 +412,8 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
|
|||||||
uci_pdu->harq->harq_confidence_level = (no_conf) ? 1 : 0;
|
uci_pdu->harq->harq_confidence_level = (no_conf) ? 1 : 0;
|
||||||
uci_pdu->harq->harq_list = (nfapi_nr_harq_t*)malloc(1);
|
uci_pdu->harq->harq_list = (nfapi_nr_harq_t*)malloc(1);
|
||||||
uci_pdu->harq->harq_list[0].harq_value = index&0x01;
|
uci_pdu->harq->harq_list[0].harq_value = index&0x01;
|
||||||
LOG_D(PHY, "HARQ value %d with confidence level (0 is good, 1 is bad) %d\n",
|
LOG_I(PHY, "Slot %d HARQ value %d with confidence level (0 is good, 1 is bad) %d\n",
|
||||||
uci_pdu->harq->harq_list[0].harq_value,uci_pdu->harq->harq_confidence_level);
|
slot,uci_pdu->harq->harq_list[0].harq_value,uci_pdu->harq->harq_confidence_level);
|
||||||
if (pucch_pdu->sr_flag == 1) {
|
if (pucch_pdu->sr_flag == 1) {
|
||||||
uci_pdu->sr = calloc(1,sizeof(*uci_pdu->sr));
|
uci_pdu->sr = calloc(1,sizeof(*uci_pdu->sr));
|
||||||
uci_pdu->sr->sr_indication = (index>1) ? 1 : 0;
|
uci_pdu->sr->sr_indication = (index>1) ? 1 : 0;
|
||||||
@@ -429,8 +427,8 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
|
|||||||
uci_pdu->harq->harq_list = (nfapi_nr_harq_t*)malloc(2);
|
uci_pdu->harq->harq_list = (nfapi_nr_harq_t*)malloc(2);
|
||||||
uci_pdu->harq->harq_list[1].harq_value = index&0x01;
|
uci_pdu->harq->harq_list[1].harq_value = index&0x01;
|
||||||
uci_pdu->harq->harq_list[0].harq_value = (index>>1)&0x01;
|
uci_pdu->harq->harq_list[0].harq_value = (index>>1)&0x01;
|
||||||
LOG_D(PHY, "HARQ values %d and %d with confidence level (0 is good, 1 is bad) %d\n",
|
LOG_I(PHY, "Slot %d HARQ values %d and %d with confidence level (0 is good, 1 is bad) %d\n",
|
||||||
uci_pdu->harq->harq_list[1].harq_value,uci_pdu->harq->harq_list[0].harq_value,uci_pdu->harq->harq_confidence_level);
|
slot,uci_pdu->harq->harq_list[1].harq_value,uci_pdu->harq->harq_list[0].harq_value,uci_pdu->harq->harq_confidence_level);
|
||||||
if (pucch_pdu->sr_flag == 1) {
|
if (pucch_pdu->sr_flag == 1) {
|
||||||
uci_pdu->sr = calloc(1,sizeof(*uci_pdu->sr));
|
uci_pdu->sr = calloc(1,sizeof(*uci_pdu->sr));
|
||||||
uci_pdu->sr->sr_indication = (index>3) ? 1 : 0;
|
uci_pdu->sr->sr_indication = (index>3) ? 1 : 0;
|
||||||
@@ -1091,11 +1089,12 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB,
|
|||||||
NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms;
|
NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms;
|
||||||
//pucch_GroupHopping_t pucch_GroupHopping = pucch_pdu->group_hop_flag + (pucch_pdu->sequence_hop_flag<<1);
|
//pucch_GroupHopping_t pucch_GroupHopping = pucch_pdu->group_hop_flag + (pucch_pdu->sequence_hop_flag<<1);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
AssertFatal(pucch_pdu->nr_of_symbols==1 || pucch_pdu->nr_of_symbols==2,
|
AssertFatal(pucch_pdu->nr_of_symbols==1 || pucch_pdu->nr_of_symbols==2,
|
||||||
"Illegal number of symbols for PUCCH 2 %d\n",pucch_pdu->nr_of_symbols);
|
"Illegal number of symbols for PUCCH 2 %d\n",pucch_pdu->nr_of_symbols);
|
||||||
|
|
||||||
|
AssertFatal((pucch_pdu->prb_start-((pucch_pdu->prb_start>>2)<<2))==0,
|
||||||
|
"Current pucch2 receiver implementation requires a PRB offset multiple of 4. The one selected is %d",
|
||||||
|
pucch_pdu->prb_start);
|
||||||
|
|
||||||
//extract pucch and dmrs first
|
//extract pucch and dmrs first
|
||||||
|
|
||||||
@@ -1118,10 +1117,24 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB,
|
|||||||
int16_t rd_im_ext[Prx2][4*pucch_pdu->nr_of_symbols*pucch_pdu->prb_size] __attribute__((aligned(32)));
|
int16_t rd_im_ext[Prx2][4*pucch_pdu->nr_of_symbols*pucch_pdu->prb_size] __attribute__((aligned(32)));
|
||||||
int16_t *r_re_ext_p,*r_im_ext_p,*rd_re_ext_p,*rd_im_ext_p;
|
int16_t *r_re_ext_p,*r_im_ext_p,*rd_re_ext_p,*rd_im_ext_p;
|
||||||
|
|
||||||
int16_t *rp[Prx2];
|
int nb_re_pucch = 12*pucch_pdu->prb_size;
|
||||||
|
|
||||||
|
int16_t rp[Prx2][nb_re_pucch*2],*tmp_rp;
|
||||||
__m64 dmrs_re,dmrs_im;
|
__m64 dmrs_re,dmrs_im;
|
||||||
|
|
||||||
for (int aa=0;aa<Prx;aa++) rp[aa] = ((int16_t *)&rxdataF[aa][(l2*frame_parms->ofdm_symbol_size)+re_offset]);
|
for (int aa=0;aa<Prx;aa++){
|
||||||
|
tmp_rp = ((int16_t *)&rxdataF[aa][l2*frame_parms->ofdm_symbol_size]);
|
||||||
|
|
||||||
|
if (re_offset + nb_re_pucch < frame_parms->ofdm_symbol_size) {
|
||||||
|
memcpy1((void*)rp[aa],(void*)&tmp_rp[re_offset*2],nb_re_pucch*sizeof(int32_t));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
int neg_length = frame_parms->ofdm_symbol_size-re_offset;
|
||||||
|
int pos_length = nb_re_pucch-neg_length;
|
||||||
|
memcpy1((void*)rp[aa],(void*)&tmp_rp[re_offset*2],neg_length*sizeof(int32_t));
|
||||||
|
memcpy1((void*)&rp[aa][neg_length*2],(void*)tmp_rp,pos_length*sizeof(int32_t));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef DEBUG_NR_PUCCH_RX
|
#ifdef DEBUG_NR_PUCCH_RX
|
||||||
printf("Decoding pucch2 for %d symbols, %d PRB\n",pucch_pdu->nr_of_symbols,pucch_pdu->prb_size);
|
printf("Decoding pucch2 for %d symbols, %d PRB\n",pucch_pdu->nr_of_symbols,pucch_pdu->prb_size);
|
||||||
@@ -1142,67 +1155,19 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB,
|
|||||||
rd_re_ext_p=&rd_re_ext[aa][4*prb];
|
rd_re_ext_p=&rd_re_ext[aa][4*prb];
|
||||||
rd_im_ext_p=&rd_im_ext[aa][4*prb];
|
rd_im_ext_p=&rd_im_ext[aa][4*prb];
|
||||||
|
|
||||||
r_re_ext_p[0]=rp[aa][0];
|
for (int idx=0; idx<8; idx++) {
|
||||||
r_im_ext_p[0]=rp[aa][1];
|
r_re_ext_p[idx<<1]=rp[aa][prb*24+6*idx];
|
||||||
rd_re_ext_p[0]=rp[aa][2];
|
r_im_ext_p[idx<<1]=rp[aa][prb*24+1+6*idx];
|
||||||
rd_im_ext_p[0]=rp[aa][3];
|
rd_re_ext_p[idx]=rp[aa][prb*24+2+6*idx];
|
||||||
r_re_ext_p[1]=rp[aa][4];
|
rd_im_ext_p[idx]=rp[aa][prb*24+3+6*idx];
|
||||||
r_im_ext_p[1]=rp[aa][5];
|
r_re_ext_p[1+(idx<<1)]=rp[aa][prb*24+4+6*idx];
|
||||||
|
r_im_ext_p[1+(idx<<1)]=rp[aa][prb*24+5+6*idx];
|
||||||
r_re_ext_p[2]=rp[aa][6];
|
}
|
||||||
r_im_ext_p[2]=rp[aa][7];
|
|
||||||
rd_re_ext_p[1]=rp[aa][8];
|
|
||||||
rd_im_ext_p[1]=rp[aa][9];
|
|
||||||
r_re_ext_p[3]=rp[aa][10];
|
|
||||||
r_im_ext_p[3]=rp[aa][11];
|
|
||||||
|
|
||||||
r_re_ext_p[4]=rp[aa][12];
|
|
||||||
r_im_ext_p[4]=rp[aa][13];
|
|
||||||
rd_re_ext_p[2]=rp[aa][14];
|
|
||||||
rd_im_ext_p[2]=rp[aa][15];
|
|
||||||
r_re_ext_p[5]=rp[aa][16];
|
|
||||||
r_im_ext_p[5]=rp[aa][17];
|
|
||||||
|
|
||||||
r_re_ext_p[6]=rp[aa][18];
|
|
||||||
r_im_ext_p[6]=rp[aa][19];
|
|
||||||
rd_re_ext_p[3]=rp[aa][20];
|
|
||||||
rd_im_ext_p[3]=rp[aa][21];
|
|
||||||
r_re_ext_p[7]=rp[aa][22];
|
|
||||||
r_im_ext_p[7]=rp[aa][23];
|
|
||||||
|
|
||||||
r_re_ext_p[8]=rp[aa][24];
|
|
||||||
r_im_ext_p[8]=rp[aa][25];
|
|
||||||
rd_re_ext_p[4]=rp[aa][26];
|
|
||||||
rd_im_ext_p[4]=rp[aa][27];
|
|
||||||
r_re_ext_p[9]=rp[aa][28];
|
|
||||||
r_im_ext_p[9]=rp[aa][29];
|
|
||||||
|
|
||||||
r_re_ext_p[10]=rp[aa][30];
|
|
||||||
r_im_ext_p[10]=rp[aa][31];
|
|
||||||
rd_re_ext_p[5]=rp[aa][32];
|
|
||||||
rd_im_ext_p[5]=rp[aa][33];
|
|
||||||
r_re_ext_p[11]=rp[aa][34];
|
|
||||||
r_im_ext_p[11]=rp[aa][35];
|
|
||||||
|
|
||||||
r_re_ext_p[12]=rp[aa][36];
|
|
||||||
r_im_ext_p[12]=rp[aa][37];
|
|
||||||
rd_re_ext_p[6]=rp[aa][38];
|
|
||||||
rd_im_ext_p[6]=rp[aa][39];
|
|
||||||
r_re_ext_p[13]=rp[aa][40];
|
|
||||||
r_im_ext_p[13]=rp[aa][41];
|
|
||||||
|
|
||||||
r_re_ext_p[14]=rp[aa][42];
|
|
||||||
r_im_ext_p[14]=rp[aa][43];
|
|
||||||
rd_re_ext_p[7]=rp[aa][44];
|
|
||||||
rd_im_ext_p[7]=rp[aa][45];
|
|
||||||
r_re_ext_p[15]=rp[aa][46];
|
|
||||||
r_im_ext_p[15]=rp[aa][47];
|
|
||||||
|
|
||||||
#ifdef DEBUG_NR_PUCCH_RX
|
#ifdef DEBUG_NR_PUCCH_RX
|
||||||
for (int i=0;i<8;i++) printf("Ant %d PRB %d dmrs[%d] -> (%d,%d)\n",aa,prb+(i>>2),i,rd_re_ext_p[i],rd_im_ext_p[i]);
|
for (int i=0;i<8;i++) printf("Ant %d PRB %d dmrs[%d] -> (%d,%d)\n",aa,prb+(i>>2),i,rd_re_ext_p[i],rd_im_ext_p[i]);
|
||||||
for (int i=0;i<16;i++) printf("Ant %d PRB %d data[%d] -> (%d,%d)\n",aa,prb+(i>>3),i,r_re_ext_p[i],r_im_ext_p[i]);
|
for (int i=0;i<16;i++) printf("Ant %d PRB %d data[%d] -> (%d,%d)\n",aa,prb+(i>>3),i,r_re_ext_p[i],r_im_ext_p[i]);
|
||||||
#endif
|
#endif
|
||||||
rp[aa]+=48;
|
|
||||||
} // aa
|
} // aa
|
||||||
} // prb
|
} // prb
|
||||||
|
|
||||||
@@ -1214,7 +1179,11 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB,
|
|||||||
printf("slot %d, start_symbol_index %d, dmrs_scrambling_id %d\n",
|
printf("slot %d, start_symbol_index %d, dmrs_scrambling_id %d\n",
|
||||||
slot,pucch_pdu->start_symbol_index,pucch_pdu->dmrs_scrambling_id);
|
slot,pucch_pdu->start_symbol_index,pucch_pdu->dmrs_scrambling_id);
|
||||||
#endif
|
#endif
|
||||||
s = lte_gold_generic(&x1, &x2, 1);
|
int reset = 1;
|
||||||
|
for (int i=0; i<=(pucch_pdu->prb_start>>2); i++) {
|
||||||
|
s = lte_gold_generic(&x1, &x2, reset);
|
||||||
|
reset = 0;
|
||||||
|
}
|
||||||
|
|
||||||
for (int group=0;group<ngroup;group++) {
|
for (int group=0;group<ngroup;group++) {
|
||||||
// each group has 8*nc_group_size elements, compute 1 complex correlation with DMRS per group
|
// each group has 8*nc_group_size elements, compute 1 complex correlation with DMRS per group
|
||||||
@@ -1476,7 +1445,7 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB,
|
|||||||
|
|
||||||
for (int aa=0;aa<Prx;aa++) {
|
for (int aa=0;aa<Prx;aa++) {
|
||||||
LOG_D(PHY,"pucch2 cw %d group %d aa %d: (%d,%d)+(%d,%d) = (%d,%d)\n",cw,group,aa,
|
LOG_D(PHY,"pucch2 cw %d group %d aa %d: (%d,%d)+(%d,%d) = (%d,%d)\n",cw,group,aa,
|
||||||
corr32_re[group][aa],corr32_im[0][aa],
|
corr32_re[group][aa],corr32_im[group][aa],
|
||||||
((int16_t*)(&prod_re[aa]))[0],
|
((int16_t*)(&prod_re[aa]))[0],
|
||||||
((int16_t*)(&prod_im[aa]))[0],
|
((int16_t*)(&prod_im[aa]))[0],
|
||||||
corr32_re[group][aa]+((int16_t*)(&prod_re[aa]))[0],
|
corr32_re[group][aa]+((int16_t*)(&prod_re[aa]))[0],
|
||||||
@@ -1495,7 +1464,7 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB,
|
|||||||
}
|
}
|
||||||
} // cw loop
|
} // cw loop
|
||||||
corr_dB = dB_fixed64((uint64_t)corr);
|
corr_dB = dB_fixed64((uint64_t)corr);
|
||||||
LOG_D(PHY,"cw_ML %d, metric %d dB\n",cw_ML,corr_dB);
|
LOG_I(PHY,"cw_ML %d, metric %d dB\n",cw_ML,corr_dB);
|
||||||
decodedPayload[0]=(uint64_t)cw_ML;
|
decodedPayload[0]=(uint64_t)cw_ML;
|
||||||
}
|
}
|
||||||
else { // polar coded case
|
else { // polar coded case
|
||||||
@@ -1554,24 +1523,24 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB,
|
|||||||
corr_re = ( corr32_re[half_prb>>2][aa]/(2*nc_group_size*4/2)+((int16_t*)(&prod_re[aa]))[0]);
|
corr_re = ( corr32_re[half_prb>>2][aa]/(2*nc_group_size*4/2)+((int16_t*)(&prod_re[aa]))[0]);
|
||||||
corr_im = ( corr32_im[half_prb>>2][aa]/(2*nc_group_size*4/2)+((int16_t*)(&prod_im[aa]))[0]);
|
corr_im = ( corr32_im[half_prb>>2][aa]/(2*nc_group_size*4/2)+((int16_t*)(&prod_im[aa]))[0]);
|
||||||
corr_tmp += corr_re*corr_re + corr_im*corr_im;
|
corr_tmp += corr_re*corr_re + corr_im*corr_im;
|
||||||
/*
|
/*
|
||||||
LOG_D(PHY,"pucch2 half_prb %d cw %d (%d,%d) aa %d: (%d,%d,%d,%d,%d,%d,%d,%d)x(%d,%d,%d,%d,%d,%d,%d,%d) (%d,%d)+(%d,%d) = (%d,%d) => %d\n",
|
LOG_D(PHY,"pucch2 half_prb %d cw %d (%d,%d) aa %d: (%d,%d,%d,%d,%d,%d,%d,%d)x(%d,%d,%d,%d,%d,%d,%d,%d) (%d,%d)+(%d,%d) = (%d,%d) => %d\n",
|
||||||
half_prb,cw,cw&15,cw>>4,aa,
|
half_prb,cw,cw&15,cw>>4,aa,
|
||||||
((int16_t*)&pucch2_polar_4bit[cw&15])[0],((int16_t*)&pucch2_polar_4bit[cw>>4])[0],
|
((int16_t*)&pucch2_polar_4bit[cw&15])[0],((int16_t*)&pucch2_polar_4bit[cw>>4])[0],
|
||||||
((int16_t*)&pucch2_polar_4bit[cw&15])[1],((int16_t*)&pucch2_polar_4bit[cw>>4])[1],
|
((int16_t*)&pucch2_polar_4bit[cw&15])[1],((int16_t*)&pucch2_polar_4bit[cw>>4])[1],
|
||||||
((int16_t*)&pucch2_polar_4bit[cw&15])[2],((int16_t*)&pucch2_polar_4bit[cw>>4])[2],
|
((int16_t*)&pucch2_polar_4bit[cw&15])[2],((int16_t*)&pucch2_polar_4bit[cw>>4])[2],
|
||||||
((int16_t*)&pucch2_polar_4bit[cw&15])[3],((int16_t*)&pucch2_polar_4bit[cw>>4])[3],
|
((int16_t*)&pucch2_polar_4bit[cw&15])[3],((int16_t*)&pucch2_polar_4bit[cw>>4])[3],
|
||||||
((int16_t*)&rp_re[aa][half_prb])[0],((int16_t*)&rp_im[aa][half_prb])[0],
|
((int16_t*)&rp_re[aa][half_prb])[0],((int16_t*)&rp_im[aa][half_prb])[0],
|
||||||
((int16_t*)&rp_re[aa][half_prb])[1],((int16_t*)&rp_im[aa][half_prb])[1],
|
((int16_t*)&rp_re[aa][half_prb])[1],((int16_t*)&rp_im[aa][half_prb])[1],
|
||||||
((int16_t*)&rp_re[aa][half_prb])[2],((int16_t*)&rp_im[aa][half_prb])[2],
|
((int16_t*)&rp_re[aa][half_prb])[2],((int16_t*)&rp_im[aa][half_prb])[2],
|
||||||
((int16_t*)&rp_re[aa][half_prb])[3],((int16_t*)&rp_im[aa][half_prb])[3],
|
((int16_t*)&rp_re[aa][half_prb])[3],((int16_t*)&rp_im[aa][half_prb])[3],
|
||||||
corr32_re[half_prb>>2][aa]/(2*nc_group_size*4/2),corr32_im[half_prb>>2][aa]/(2*nc_group_size*4/2),
|
corr32_re[half_prb>>2][aa]/(2*nc_group_size*4/2),corr32_im[half_prb>>2][aa]/(2*nc_group_size*4/2),
|
||||||
((int16_t*)(&prod_re[aa]))[0],
|
((int16_t*)(&prod_re[aa]))[0],
|
||||||
((int16_t*)(&prod_im[aa]))[0],
|
((int16_t*)(&prod_im[aa]))[0],
|
||||||
corr_re,
|
corr_re,
|
||||||
corr_im,
|
corr_im,
|
||||||
corr_tmp);
|
corr_tmp);
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
corr16 = _mm_set1_epi16((int16_t)(corr_tmp>>8));
|
corr16 = _mm_set1_epi16((int16_t)(corr_tmp>>8));
|
||||||
/*
|
/*
|
||||||
@@ -1625,26 +1594,34 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB,
|
|||||||
} // half_prb
|
} // half_prb
|
||||||
// run polar decoder on llrs
|
// run polar decoder on llrs
|
||||||
decoderState = polar_decoder_int16((int16_t*)llrs, decodedPayload, 0, currentPtr);
|
decoderState = polar_decoder_int16((int16_t*)llrs, decodedPayload, 0, currentPtr);
|
||||||
LOG_D(PHY,"UCI decoderState %d, payload[0] %llux\n",decoderState,(unsigned long long)decodedPayload[0]);
|
LOG_D(PHY,"UCI decoderState %d, payload[0] %llu\n",decoderState,(unsigned long long)decodedPayload[0]);
|
||||||
if (decoderState>0) decoderState=1;
|
if (decoderState>0) decoderState=1;
|
||||||
corr_dB = dB_fixed64(corr);
|
corr_dB = dB_fixed64(corr);
|
||||||
LOG_D(PHY,"metric %d dB\n",corr_dB);
|
LOG_D(PHY,"metric %d dB\n",corr_dB);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
re_offset = (12*pucch_pdu->prb_start) + (12*pucch_pdu->bwp_start) + frame_parms->first_carrier_offset;
|
||||||
|
// estimate CQI for MAC (from antenna port 0 only)
|
||||||
|
int SNRtimes10 = dB_fixed_times10(signal_energy_nodc(&rxdataF[0][(l2*frame_parms->ofdm_symbol_size)+re_offset],12*pucch_pdu->prb_size)) - (10*gNB->measurements.n0_power_tot_dB);
|
||||||
|
int cqi;
|
||||||
|
if (SNRtimes10 < -640) cqi=0;
|
||||||
|
else if (SNRtimes10 > 635) cqi=255;
|
||||||
|
else cqi=(640+SNRtimes10)/5;
|
||||||
|
|
||||||
uci_pdu->harq.harq_bit_len = pucch_pdu->bit_len_harq;
|
uci_pdu->harq.harq_bit_len = pucch_pdu->bit_len_harq;
|
||||||
uci_pdu->pduBitmap=0;
|
uci_pdu->pduBitmap=0;
|
||||||
uci_pdu->rnti=pucch_pdu->rnti;
|
uci_pdu->rnti=pucch_pdu->rnti;
|
||||||
uci_pdu->handle=pucch_pdu->handle;
|
uci_pdu->handle=pucch_pdu->handle;
|
||||||
uci_pdu->pucch_format=0;
|
uci_pdu->pucch_format=0;
|
||||||
uci_pdu->ul_cqi=corr_dB;
|
uci_pdu->ul_cqi=cqi;
|
||||||
// need to fill these field!
|
uci_pdu->timing_advance=0xffff; // currently not valid
|
||||||
uci_pdu->timing_advance=31;
|
uci_pdu->rssi=1280 - (10*dB_fixed(32767*32767)-dB_fixed_times10(signal_energy_nodc(&rxdataF[0][(l2*frame_parms->ofdm_symbol_size)+re_offset],12*pucch_pdu->prb_size)));
|
||||||
uci_pdu->rssi=0;
|
|
||||||
if (pucch_pdu->bit_len_harq>0) {
|
if (pucch_pdu->bit_len_harq>0) {
|
||||||
int harq_bytes=pucch_pdu->bit_len_harq>>3;
|
int harq_bytes=pucch_pdu->bit_len_harq>>3;
|
||||||
if ((pucch_pdu->bit_len_harq&7) > 0) harq_bytes++;
|
if ((pucch_pdu->bit_len_harq&7) > 0) harq_bytes++;
|
||||||
uci_pdu->pduBitmap|=1;
|
uci_pdu->pduBitmap|=1;
|
||||||
uci_pdu->harq.harq_payload = (uint8_t*)malloc(harq_bytes);
|
uci_pdu->harq.harq_payload = (uint8_t*)malloc(harq_bytes);
|
||||||
uci_pdu->harq.harq_crc = decoderState > 0 ? 1 : 0;
|
uci_pdu->harq.harq_crc = decoderState;
|
||||||
int i=0;
|
int i=0;
|
||||||
for (;i<harq_bytes-1;i++) {
|
for (;i<harq_bytes-1;i++) {
|
||||||
uci_pdu->harq.harq_payload[i] = decodedPayload[0] & 255;
|
uci_pdu->harq.harq_payload[i] = decodedPayload[0] & 255;
|
||||||
@@ -1667,19 +1644,18 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB,
|
|||||||
int csi_part1_bytes=pucch_pdu->bit_len_csi_part1>>3;
|
int csi_part1_bytes=pucch_pdu->bit_len_csi_part1>>3;
|
||||||
if ((pucch_pdu->bit_len_csi_part1&7) > 0) csi_part1_bytes++;
|
if ((pucch_pdu->bit_len_csi_part1&7) > 0) csi_part1_bytes++;
|
||||||
uci_pdu->csi_part1.csi_part1_payload = (uint8_t*)malloc(csi_part1_bytes);
|
uci_pdu->csi_part1.csi_part1_payload = (uint8_t*)malloc(csi_part1_bytes);
|
||||||
uci_pdu->csi_part1.csi_part1_crc = decoderState > 0 ? 1 : 0;
|
uci_pdu->csi_part1.csi_part1_crc = decoderState;
|
||||||
int i=0;
|
int i=0;
|
||||||
for (;i<csi_part1_bytes-1;i++) {
|
for (;i<csi_part1_bytes-1;i++) {
|
||||||
uci_pdu->csi_part1.csi_part1_payload[i] = decodedPayload[0] & 255;
|
uci_pdu->csi_part1.csi_part1_payload[i] = decodedPayload[0] & 255;
|
||||||
decodedPayload[0]>>=8;
|
decodedPayload[0]>>=8;
|
||||||
}
|
}
|
||||||
uci_pdu->csi_part1.csi_part1_payload[i] = decodedPayload[0] & ((1<<(pucch_pdu->bit_len_csi_part1&7))-1);
|
uci_pdu->csi_part1.csi_part1_payload[i] = decodedPayload[0] & ((1<<(pucch_pdu->bit_len_csi_part1&7))-1);
|
||||||
decodedPayload[0] >>= pucch_pdu->bit_len_csi_part1;
|
decodedPayload[0] >>= pucch_pdu->bit_len_csi_part1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pucch_pdu->bit_len_csi_part2>0) {
|
if (pucch_pdu->bit_len_csi_part2>0) {
|
||||||
uci_pdu->pduBitmap|=8;
|
uci_pdu->pduBitmap|=8;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -87,6 +87,10 @@ void nr_ue_measurements(PHY_VARS_NR_UE *ue,
|
|||||||
unsigned char rank_adaptation,
|
unsigned char rank_adaptation,
|
||||||
uint8_t subframe);
|
uint8_t subframe);
|
||||||
|
|
||||||
|
void nr_ue_rsrp_measurements(PHY_VARS_NR_UE *ue,
|
||||||
|
uint8_t slot,
|
||||||
|
uint8_t abstraction_flag);
|
||||||
|
|
||||||
void phy_adjust_gain_nr(PHY_VARS_NR_UE *ue,
|
void phy_adjust_gain_nr(PHY_VARS_NR_UE *ue,
|
||||||
uint32_t rx_power_fil_dB,
|
uint32_t rx_power_fil_dB,
|
||||||
uint8_t eNB_id);
|
uint8_t eNB_id);
|
||||||
@@ -106,4 +110,6 @@ void nr_pdsch_ptrs_processing(PHY_VARS_NR_UE *ue,
|
|||||||
uint16_t rnti,
|
uint16_t rnti,
|
||||||
RX_type_t rx_type);
|
RX_type_t rx_type);
|
||||||
|
|
||||||
|
float_t get_nr_RSRP(module_id_t Mod_id,uint8_t CC_id,uint8_t gNB_index);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -23,6 +23,7 @@
|
|||||||
#include "PHY/phy_extern_nr_ue.h"
|
#include "PHY/phy_extern_nr_ue.h"
|
||||||
#include "common/utils/LOG/log.h"
|
#include "common/utils/LOG/log.h"
|
||||||
#include "PHY/sse_intrin.h"
|
#include "PHY/sse_intrin.h"
|
||||||
|
#include "openair2/LAYER2/NR_MAC_UE/mac_proto.h"
|
||||||
|
|
||||||
//#define k1 1000
|
//#define k1 1000
|
||||||
#define k1 ((long long int) 1000)
|
#define k1 ((long long int) 1000)
|
||||||
@@ -76,6 +77,35 @@ int16_t get_nr_PL(uint8_t Mod_id, uint8_t CC_id, uint8_t gNB_index){
|
|||||||
//(ue->frame_parms.pdsch_config_common.referenceSignalPower*10))/10));
|
//(ue->frame_parms.pdsch_config_common.referenceSignalPower*10))/10));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint32_t get_nr_rx_total_gain_dB (module_id_t Mod_id,uint8_t CC_id)
|
||||||
|
{
|
||||||
|
|
||||||
|
PHY_VARS_NR_UE *ue = PHY_vars_UE_g[Mod_id][CC_id];
|
||||||
|
|
||||||
|
if (ue)
|
||||||
|
return ue->rx_total_gain_dB;
|
||||||
|
|
||||||
|
return 0xFFFFFFFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
float_t get_nr_RSRP(module_id_t Mod_id,uint8_t CC_id,uint8_t gNB_index)
|
||||||
|
{
|
||||||
|
|
||||||
|
AssertFatal(PHY_vars_UE_g!=NULL,"PHY_vars_UE_g is null\n");
|
||||||
|
AssertFatal(PHY_vars_UE_g[Mod_id]!=NULL,"PHY_vars_UE_g[%d] is null\n",Mod_id);
|
||||||
|
AssertFatal(PHY_vars_UE_g[Mod_id][CC_id]!=NULL,"PHY_vars_UE_g[%d][%d] is null\n",Mod_id,CC_id);
|
||||||
|
|
||||||
|
PHY_VARS_NR_UE *ue = PHY_vars_UE_g[Mod_id][CC_id];
|
||||||
|
|
||||||
|
if (ue)
|
||||||
|
return (10*log10(ue->measurements.rsrp[gNB_index])-
|
||||||
|
get_nr_rx_total_gain_dB(Mod_id,0) -
|
||||||
|
10*log10(20*12));
|
||||||
|
return -140.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void nr_ue_measurements(PHY_VARS_NR_UE *ue,
|
void nr_ue_measurements(PHY_VARS_NR_UE *ue,
|
||||||
unsigned int subframe_offset,
|
unsigned int subframe_offset,
|
||||||
unsigned char N0_symbol,
|
unsigned char N0_symbol,
|
||||||
@@ -191,4 +221,74 @@ void nr_ue_measurements(PHY_VARS_NR_UE *ue,
|
|||||||
_mm_empty();
|
_mm_empty();
|
||||||
_m_empty();
|
_m_empty();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void nr_ue_rsrp_measurements(PHY_VARS_NR_UE *ue,
|
||||||
|
uint8_t slot,
|
||||||
|
uint8_t abstraction_flag)
|
||||||
|
{
|
||||||
|
int aarx,rb, symbol_offset;
|
||||||
|
int16_t *rxF;
|
||||||
|
|
||||||
|
uint16_t Nid_cell = ue->frame_parms.Nid_cell;
|
||||||
|
uint8_t eNB_offset=0,l,nushift;
|
||||||
|
uint16_t off,nb_rb;
|
||||||
|
// NR_UE_MAC_INST_t *mac = get_mac_inst(0);
|
||||||
|
int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[slot]].rxdataF;
|
||||||
|
|
||||||
|
nushift = ue->frame_parms.Nid_cell%4;
|
||||||
|
ue->frame_parms.nushift = nushift;
|
||||||
|
unsigned int ssb_offset = ue->frame_parms.first_carrier_offset + ue->frame_parms.ssb_start_subcarrier;
|
||||||
|
if (ssb_offset>= ue->frame_parms.ofdm_symbol_size) ssb_offset-=ue->frame_parms.ofdm_symbol_size;
|
||||||
|
|
||||||
|
symbol_offset = ue->frame_parms.ofdm_symbol_size*(ue->symbol_offset+1);
|
||||||
|
|
||||||
|
ue->measurements.rsrp[eNB_offset] = 0;
|
||||||
|
|
||||||
|
//if (mac->csirc->reportQuantity.choice.ssb_Index_RSRP){
|
||||||
|
nb_rb = 20;
|
||||||
|
//} else{
|
||||||
|
// LOG_E(PHY,"report quantity not supported \n");
|
||||||
|
//}
|
||||||
|
|
||||||
|
if (abstraction_flag == 0) {
|
||||||
|
|
||||||
|
for (l=0; l<1; l++) {
|
||||||
|
|
||||||
|
LOG_D(PHY,"[UE %d] slot %d Doing ue_rrc_measurements rsrp/rssi (Nid_cell %d, nushift %d, eNB_offset %d, l %d)\n",ue->Mod_id,slot,Nid_cell,nushift,
|
||||||
|
eNB_offset,l);
|
||||||
|
|
||||||
|
for (aarx=0; aarx<ue->frame_parms.nb_antennas_rx; aarx++) {
|
||||||
|
rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+ssb_offset+nushift)];
|
||||||
|
off = 0;
|
||||||
|
|
||||||
|
if (l==0) {
|
||||||
|
for (rb=0; rb<nb_rb; rb++) {
|
||||||
|
|
||||||
|
ue->measurements.rsrp[eNB_offset] += (((int32_t)(rxF[off])*rxF[off])+((int32_t)(rxF[off+1])*rxF[off+1]));
|
||||||
|
//printf("rb %d, off %d : %d\n",rb,off,((((int32_t)rxF[off])*rxF[off])+((int32_t)(rxF[off+1])*rxF[off+1])));
|
||||||
|
|
||||||
|
off = (off+4) % ue->frame_parms.ofdm_symbol_size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ue->measurements.rsrp[eNB_offset]/=nb_rb;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
ue->measurements.rsrp[eNB_offset] = -93 ;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (eNB_offset == 0)
|
||||||
|
|
||||||
|
LOG_I(PHY,"[UE %d] slot %d RRC Measurements (idx %d, Cell id %d) => rsrp: %3.1f dBm/RE (%d)\n",
|
||||||
|
ue->Mod_id,
|
||||||
|
slot,eNB_offset,
|
||||||
|
(eNB_offset>0) ? ue->measurements.adj_cell_id[eNB_offset-1] : ue->frame_parms.Nid_cell,
|
||||||
|
10*log10(ue->measurements.rsrp[eNB_offset])-ue->rx_total_gain_dB,
|
||||||
|
ue->measurements.rsrp[eNB_offset]);
|
||||||
|
|
||||||
|
}
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
|
|||||||
|
|
||||||
int16_t Ncp = 0, amp, *prach, *prach2, *prachF, *Xu;
|
int16_t Ncp = 0, amp, *prach, *prach2, *prachF, *Xu;
|
||||||
int32_t Xu_re, Xu_im;
|
int32_t Xu_re, Xu_im;
|
||||||
int prach_start, prach_sequence_length, i, prach_len, dftlen, mu, kbar, K, n_ra_prb, k;
|
int prach_start, prach_sequence_length, i, prach_len, dftlen, mu, kbar, K, n_ra_prb, k, prachStartSymbol, sample_offset_slot;
|
||||||
//int restricted_Type;
|
//int restricted_Type;
|
||||||
|
|
||||||
prach = prach_tmp;
|
prach = prach_tmp;
|
||||||
@@ -94,7 +94,7 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
|
|||||||
kbar = 1;
|
kbar = 1;
|
||||||
K = 24;
|
K = 24;
|
||||||
k = 12*n_ra_prb - 6*fp->N_RB_UL;
|
k = 12*n_ra_prb - 6*fp->N_RB_UL;
|
||||||
//prachStartSymbol = prach_config_pdu->prach_start_symbol
|
prachStartSymbol = prach_pdu->prach_start_symbol;
|
||||||
//restricted_Type = 0;
|
//restricted_Type = 0;
|
||||||
|
|
||||||
compute_nr_prach_seq(nrUE_config->prach_config.prach_sequence_length,
|
compute_nr_prach_seq(nrUE_config->prach_config.prach_sequence_length,
|
||||||
@@ -102,7 +102,8 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
|
|||||||
nrUE_config->prach_config.num_prach_fd_occasions_list[fd_occasion].prach_root_sequence_index,
|
nrUE_config->prach_config.num_prach_fd_occasions_list[fd_occasion].prach_root_sequence_index,
|
||||||
ue->X_u);
|
ue->X_u);
|
||||||
|
|
||||||
prach_start = fp->get_samples_slot_timestamp(slot, fp, 0);
|
sample_offset_slot = (prachStartSymbol==0?0:fp->ofdm_symbol_size*prachStartSymbol+fp->nb_prefix_samples0+fp->nb_prefix_samples*(prachStartSymbol-1));
|
||||||
|
prach_start = fp->get_samples_slot_timestamp(slot, fp, 0) + sample_offset_slot;
|
||||||
|
|
||||||
// First compute physical root sequence
|
// First compute physical root sequence
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
|
|||||||
@@ -1045,7 +1045,11 @@ void nr_generate_pucch2(PHY_VARS_NR_UE *ue,
|
|||||||
for (int l=0; l<nrofSymbols; l++) {
|
for (int l=0; l<nrofSymbols; l++) {
|
||||||
x2 = (((1<<17)*((14*nr_tti_tx) + (l+startingSymbolIndex) + 1)*((2*dmrs_scrambling_id) + 1)) + (2*dmrs_scrambling_id))%(1U<<31); // c_init calculation according to TS38.211 subclause
|
x2 = (((1<<17)*((14*nr_tti_tx) + (l+startingSymbolIndex) + 1)*((2*dmrs_scrambling_id) + 1)) + (2*dmrs_scrambling_id))%(1U<<31); // c_init calculation according to TS38.211 subclause
|
||||||
|
|
||||||
s = lte_gold_generic(&x1, &x2, 1);
|
int reset = 1;
|
||||||
|
for (int ii=0; ii<=(startingPRB>>2); ii++) {
|
||||||
|
s = lte_gold_generic(&x1, &x2, reset);
|
||||||
|
reset = 0;
|
||||||
|
}
|
||||||
m = 0;
|
m = 0;
|
||||||
for (int rb=0; rb<nrofPRB; rb++) {
|
for (int rb=0; rb<nrofPRB; rb++) {
|
||||||
//startingPRB = startingPRB + rb;
|
//startingPRB = startingPRB + rb;
|
||||||
|
|||||||
@@ -752,6 +752,9 @@ typedef struct PHY_VARS_gNB_s {
|
|||||||
uint32_t rb_mask_ul[9];
|
uint32_t rb_mask_ul[9];
|
||||||
int ulmask_symb;
|
int ulmask_symb;
|
||||||
|
|
||||||
|
/// CSI RS sequence
|
||||||
|
uint32_t ***nr_gold_csi_rs;
|
||||||
|
|
||||||
/// Indicator set to 0 after first SR
|
/// Indicator set to 0 after first SR
|
||||||
uint8_t first_sr[NUMBER_OF_NR_SR_MAX];
|
uint8_t first_sr[NUMBER_OF_NR_SR_MAX];
|
||||||
|
|
||||||
|
|||||||
@@ -82,6 +82,9 @@
|
|||||||
#define NR_MAX_PDSCH_DMRS_LENGTH 3300 //275*6(k)*2(QPSK real+imag)
|
#define NR_MAX_PDSCH_DMRS_LENGTH 3300 //275*6(k)*2(QPSK real+imag)
|
||||||
#define NR_MAX_PDSCH_DMRS_INIT_LENGTH_DWORD 104 // ceil(NR_MAX_PDSCH_DMRS_LENGTH/32)
|
#define NR_MAX_PDSCH_DMRS_INIT_LENGTH_DWORD 104 // ceil(NR_MAX_PDSCH_DMRS_LENGTH/32)
|
||||||
|
|
||||||
|
#define NR_MAX_CSI_RS_LENGTH 4400 //275*8(max allocation per RB)*2(QPSK)
|
||||||
|
#define NR_MAX_CSI_RS_INIT_LENGTH_DWORD 138 // ceil(NR_MAX_CSI_RS_LENGTH/32)
|
||||||
|
|
||||||
#define NR_MAX_PUSCH_DMRS_LENGTH NR_MAX_PDSCH_DMRS_LENGTH
|
#define NR_MAX_PUSCH_DMRS_LENGTH NR_MAX_PDSCH_DMRS_LENGTH
|
||||||
#define NR_MAX_PUSCH_DMRS_INIT_LENGTH_DWORD NR_MAX_PDSCH_DMRS_INIT_LENGTH_DWORD
|
#define NR_MAX_PUSCH_DMRS_INIT_LENGTH_DWORD NR_MAX_PDSCH_DMRS_INIT_LENGTH_DWORD
|
||||||
|
|
||||||
|
|||||||
@@ -113,7 +113,15 @@ void nr_common_signal_procedures (PHY_VARS_gNB *gNB,int frame, int slot) {
|
|||||||
nr_generate_pbch_dmrs(gNB->nr_gold_pbch_dmrs[n_hf][ssb_index&7],&txdataF[0][txdataF_offset], AMP, ssb_start_symbol, cfg, fp);
|
nr_generate_pbch_dmrs(gNB->nr_gold_pbch_dmrs[n_hf][ssb_index&7],&txdataF[0][txdataF_offset], AMP, ssb_start_symbol, cfg, fp);
|
||||||
else
|
else
|
||||||
nr_generate_pbch_dmrs(gNB->nr_gold_pbch_dmrs[0][ssb_index&7],&txdataF[0][txdataF_offset], AMP, ssb_start_symbol, cfg, fp);
|
nr_generate_pbch_dmrs(gNB->nr_gold_pbch_dmrs[0][ssb_index&7],&txdataF[0][txdataF_offset], AMP, ssb_start_symbol, cfg, fp);
|
||||||
|
|
||||||
|
if (T_ACTIVE(T_GNB_PHY_MIB)) {
|
||||||
|
unsigned char bch[3];
|
||||||
|
bch[0] = gNB->ssb_pdu.ssb_pdu_rel15.bchPayload & 0xff;
|
||||||
|
bch[1] = (gNB->ssb_pdu.ssb_pdu_rel15.bchPayload >> 8) & 0xff;
|
||||||
|
bch[2] = (gNB->ssb_pdu.ssb_pdu_rel15.bchPayload >> 16) & 0xff;
|
||||||
|
T(T_GNB_PHY_MIB, T_INT(0) /* module ID */, T_INT(frame), T_INT(slot), T_BUFFER(bch, 3));
|
||||||
|
}
|
||||||
|
|
||||||
nr_generate_pbch(&gNB->pbch,
|
nr_generate_pbch(&gNB->pbch,
|
||||||
&gNB->ssb_pdu,
|
&gNB->ssb_pdu,
|
||||||
gNB->nr_pbch_interleaver,
|
gNB->nr_pbch_interleaver,
|
||||||
@@ -136,8 +144,6 @@ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB,
|
|||||||
int offset = gNB->CC_id;
|
int offset = gNB->CC_id;
|
||||||
uint8_t ssb_frame_periodicity = 1; // every how many frames SSB are generated
|
uint8_t ssb_frame_periodicity = 1; // every how many frames SSB are generated
|
||||||
int txdataF_offset = (slot%2)*fp->samples_per_slot_wCP;
|
int txdataF_offset = (slot%2)*fp->samples_per_slot_wCP;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (cfg->ssb_table.ssb_period.value > 1)
|
if (cfg->ssb_table.ssb_period.value > 1)
|
||||||
ssb_frame_periodicity = 1 <<(cfg->ssb_table.ssb_period.value -1) ;
|
ssb_frame_periodicity = 1 <<(cfg->ssb_table.ssb_period.value -1) ;
|
||||||
@@ -518,7 +524,6 @@ void phy_procedures_gNB_common_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx)
|
|||||||
0);
|
0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) {
|
void phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) {
|
||||||
@@ -538,10 +543,8 @@ void phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx)
|
|||||||
|
|
||||||
nfapi_nr_pucch_pdu_t *pucch_pdu = &pucch->pucch_pdu;
|
nfapi_nr_pucch_pdu_t *pucch_pdu = &pucch->pucch_pdu;
|
||||||
uint16_t num_ucis;
|
uint16_t num_ucis;
|
||||||
|
|
||||||
switch (pucch_pdu->format_type) {
|
switch (pucch_pdu->format_type) {
|
||||||
case 0:
|
case 0:
|
||||||
|
|
||||||
num_ucis = gNB->UL_INFO.uci_ind.num_ucis;
|
num_ucis = gNB->UL_INFO.uci_ind.num_ucis;
|
||||||
gNB->UL_INFO.uci_ind.uci_list = &gNB->uci_pdu_list[0];
|
gNB->UL_INFO.uci_ind.uci_list = &gNB->uci_pdu_list[0];
|
||||||
gNB->UL_INFO.uci_ind.sfn = frame_rx;
|
gNB->UL_INFO.uci_ind.sfn = frame_rx;
|
||||||
@@ -558,8 +561,25 @@ void phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx)
|
|||||||
gNB->UL_INFO.uci_ind.num_ucis += 1;
|
gNB->UL_INFO.uci_ind.num_ucis += 1;
|
||||||
pucch->active = 0;
|
pucch->active = 0;
|
||||||
break;
|
break;
|
||||||
|
case 2:
|
||||||
|
num_ucis = gNB->UL_INFO.uci_ind.num_ucis;
|
||||||
|
gNB->UL_INFO.uci_ind.uci_list = &gNB->uci_pdu_list[0];
|
||||||
|
gNB->UL_INFO.uci_ind.sfn = frame_rx;
|
||||||
|
gNB->UL_INFO.uci_ind.slot = slot_rx;
|
||||||
|
gNB->uci_pdu_list[num_ucis].pdu_type = NFAPI_NR_UCI_FORMAT_2_3_4_PDU_TYPE;
|
||||||
|
gNB->uci_pdu_list[num_ucis].pdu_size = sizeof(nfapi_nr_uci_pucch_pdu_format_2_3_4_t);
|
||||||
|
nfapi_nr_uci_pucch_pdu_format_2_3_4_t *uci_pdu_format2 = &gNB->uci_pdu_list[num_ucis].pucch_pdu_format_2_3_4;
|
||||||
|
|
||||||
|
nr_decode_pucch2(gNB,
|
||||||
|
slot_rx,
|
||||||
|
uci_pdu_format2,
|
||||||
|
pucch_pdu);
|
||||||
|
|
||||||
|
gNB->UL_INFO.uci_ind.num_ucis += 1;
|
||||||
|
pucch->active = 0;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
AssertFatal(1==0,"Only PUCCH format 0 is currently supported\n");
|
AssertFatal(1==0,"Only PUCCH formats 0 and 2 are currently supported\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -50,7 +50,9 @@
|
|||||||
#include "SCHED/phy_procedures_emos.h"
|
#include "SCHED/phy_procedures_emos.h"
|
||||||
#endif
|
#endif
|
||||||
#include "executables/softmodem-common.h"
|
#include "executables/softmodem-common.h"
|
||||||
|
#include "openair2/LAYER2/NR_MAC_UE/mac_proto.h"
|
||||||
|
|
||||||
|
//#define DEBUG_PHY_PROC
|
||||||
#define NR_PDCCH_SCHED
|
#define NR_PDCCH_SCHED
|
||||||
//#define NR_PDCCH_SCHED_DEBUG
|
//#define NR_PDCCH_SCHED_DEBUG
|
||||||
//#define NR_PUCCH_SCHED
|
//#define NR_PUCCH_SCHED
|
||||||
@@ -216,7 +218,7 @@ void phy_procedures_nrUE_TX(PHY_VARS_NR_UE *ue,
|
|||||||
|
|
||||||
/* RACH */
|
/* RACH */
|
||||||
if (get_softmodem_params()->do_ra==1) {
|
if (get_softmodem_params()->do_ra==1) {
|
||||||
if ((ue->UE_mode[gNB_id] < PUSCH) && (ue->prach_vars[gNB_id]->prach_Config_enabled == 1)) {
|
if ((ue->UE_mode[gNB_id] > NOT_SYNCHED && ue->UE_mode[gNB_id] < PUSCH) && (ue->prach_vars[gNB_id]->prach_Config_enabled == 1)) {
|
||||||
nr_ue_prach_procedures(ue, proc, gNB_id, mode);
|
nr_ue_prach_procedures(ue, proc, gNB_id, mode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -895,6 +897,9 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
|
|||||||
int *dlsch_errors,
|
int *dlsch_errors,
|
||||||
runmode_t mode) {
|
runmode_t mode) {
|
||||||
|
|
||||||
|
if (dlsch0==NULL)
|
||||||
|
AssertFatal(0,"dlsch0 should be defined at this level \n");
|
||||||
|
|
||||||
int harq_pid = dlsch0->current_harq_pid;
|
int harq_pid = dlsch0->current_harq_pid;
|
||||||
int frame_rx = proc->frame_rx;
|
int frame_rx = proc->frame_rx;
|
||||||
int nr_tti_rx = proc->nr_tti_rx;
|
int nr_tti_rx = proc->nr_tti_rx;
|
||||||
@@ -922,9 +927,6 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
|
|||||||
uint16_t bw_scaling, start_symbol;
|
uint16_t bw_scaling, start_symbol;
|
||||||
float tc_factor;
|
float tc_factor;
|
||||||
|
|
||||||
if (dlsch0==NULL)
|
|
||||||
AssertFatal(0,"dlsch0 should be defined at this level \n");
|
|
||||||
|
|
||||||
is_cw0_active = dlsch0->harq_processes[harq_pid]->status;
|
is_cw0_active = dlsch0->harq_processes[harq_pid]->status;
|
||||||
nb_symb_sch = dlsch0->harq_processes[harq_pid]->nb_symbols;
|
nb_symb_sch = dlsch0->harq_processes[harq_pid]->nb_symbols;
|
||||||
start_symbol = dlsch0->harq_processes[harq_pid]->start_symbol;
|
start_symbol = dlsch0->harq_processes[harq_pid]->start_symbol;
|
||||||
@@ -1353,9 +1355,9 @@ void *UE_thread_slot1_dl_processing(void *arg) {
|
|||||||
CPU_ZERO(&cpuset);
|
CPU_ZERO(&cpuset);
|
||||||
if ( (proc->sub_frame_start+1)%RX_NB_TH == 0 && threads.slot1_proc_one != -1 )
|
if ( (proc->sub_frame_start+1)%RX_NB_TH == 0 && threads.slot1_proc_one != -1 )
|
||||||
CPU_SET(threads.slot1_proc_one, &cpuset);
|
CPU_SET(threads.slot1_proc_one, &cpuset);
|
||||||
if ( (proc->sub_frame_start+1)%RX_NB_TH == 1 && threads.slot1_proc_two != -1 )
|
if ( RX_NB_TH > 1 && (proc->sub_frame_start+1)%RX_NB_TH == 1 && threads.slot1_proc_two != -1 )
|
||||||
CPU_SET(threads.slot1_proc_two, &cpuset);
|
CPU_SET(threads.slot1_proc_two, &cpuset);
|
||||||
if ( (proc->sub_frame_start+1)%RX_NB_TH == 2 && threads.slot1_proc_three != -1 )
|
if ( RX_NB_TH > 2 && (proc->sub_frame_start+1)%RX_NB_TH == 2 && threads.slot1_proc_three != -1 )
|
||||||
CPU_SET(threads.slot1_proc_three, &cpuset);
|
CPU_SET(threads.slot1_proc_three, &cpuset);
|
||||||
|
|
||||||
init_thread(900000,1000000 , FIFO_PRIORITY-1, &cpuset,
|
init_thread(900000,1000000 , FIFO_PRIORITY-1, &cpuset,
|
||||||
@@ -1650,6 +1652,8 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
|
|||||||
uint8_t dci_cnt = 0;
|
uint8_t dci_cnt = 0;
|
||||||
NR_DL_FRAME_PARMS *fp = &ue->frame_parms;
|
NR_DL_FRAME_PARMS *fp = &ue->frame_parms;
|
||||||
|
|
||||||
|
//NR_UE_MAC_INST_t *mac = get_mac_inst(0);
|
||||||
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_IN);
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_IN);
|
||||||
|
|
||||||
LOG_D(PHY," ****** start RX-Chain for Frame.Slot %d.%d ****** \n", frame_rx%1024, nr_tti_rx);
|
LOG_D(PHY," ****** start RX-Chain for Frame.Slot %d.%d ****** \n", frame_rx%1024, nr_tti_rx);
|
||||||
@@ -1688,6 +1692,12 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//if (mac->csirc->reportQuantity.choice.ssb_Index_RSRP){
|
||||||
|
nr_ue_rsrp_measurements(ue,nr_tti_rx,0);
|
||||||
|
//}
|
||||||
|
|
||||||
|
|
||||||
nr_ue_pbch_procedures(gNB_id, ue, proc, 0);
|
nr_ue_pbch_procedures(gNB_id, ue, proc, 0);
|
||||||
|
|
||||||
if (ue->no_timing_correction==0) {
|
if (ue->no_timing_correction==0) {
|
||||||
@@ -1814,24 +1824,48 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
|
|||||||
if ((ue->dlsch_SI[gNB_id]) && (ue->dlsch_SI[gNB_id]->active == 1)) {
|
if ((ue->dlsch_SI[gNB_id]) && (ue->dlsch_SI[gNB_id]->active == 1)) {
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_SI, VCD_FUNCTION_IN);
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_SI, VCD_FUNCTION_IN);
|
||||||
nr_ue_pdsch_procedures(ue,
|
nr_ue_pdsch_procedures(ue,
|
||||||
proc,
|
proc,
|
||||||
gNB_id,
|
gNB_id,
|
||||||
SI_PDSCH,
|
SI_PDSCH,
|
||||||
ue->dlsch_SI[gNB_id],
|
ue->dlsch_SI[gNB_id],
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
|
nr_ue_dlsch_procedures(ue,
|
||||||
|
proc,
|
||||||
|
gNB_id,
|
||||||
|
SI_PDSCH,
|
||||||
|
ue->dlsch_SI[gNB_id],
|
||||||
|
NULL,
|
||||||
|
&ue->dlsch_SI_errors[gNB_id],
|
||||||
|
mode);
|
||||||
|
|
||||||
|
// deactivate dlsch once dlsch proc is done
|
||||||
|
ue->dlsch_SI[gNB_id]->active = 0;
|
||||||
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_SI, VCD_FUNCTION_OUT);
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_SI, VCD_FUNCTION_OUT);
|
||||||
}
|
}
|
||||||
|
|
||||||
// do procedures for SI-RNTI
|
// do procedures for P-RNTI
|
||||||
if ((ue->dlsch_p[gNB_id]) && (ue->dlsch_p[gNB_id]->active == 1)) {
|
if ((ue->dlsch_p[gNB_id]) && (ue->dlsch_p[gNB_id]->active == 1)) {
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_P, VCD_FUNCTION_IN);
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_P, VCD_FUNCTION_IN);
|
||||||
nr_ue_pdsch_procedures(ue,
|
nr_ue_pdsch_procedures(ue,
|
||||||
proc,
|
proc,
|
||||||
gNB_id,
|
gNB_id,
|
||||||
P_PDSCH,
|
P_PDSCH,
|
||||||
ue->dlsch_p[gNB_id],
|
ue->dlsch_p[gNB_id],
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
|
nr_ue_dlsch_procedures(ue,
|
||||||
|
proc,
|
||||||
|
gNB_id,
|
||||||
|
P_PDSCH,
|
||||||
|
ue->dlsch_p[gNB_id],
|
||||||
|
NULL,
|
||||||
|
&ue->dlsch_p_errors[gNB_id],
|
||||||
|
mode);
|
||||||
|
|
||||||
|
// deactivate dlsch once dlsch proc is done
|
||||||
|
ue->dlsch_p[gNB_id]->active = 0;
|
||||||
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_P, VCD_FUNCTION_OUT);
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_P, VCD_FUNCTION_OUT);
|
||||||
}
|
}
|
||||||
@@ -1840,15 +1874,11 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
|
|||||||
if ((ue->dlsch_ra[gNB_id]) && (ue->dlsch_ra[gNB_id]->active == 1)) {
|
if ((ue->dlsch_ra[gNB_id]) && (ue->dlsch_ra[gNB_id]->active == 1)) {
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_RA, VCD_FUNCTION_IN);
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_RA, VCD_FUNCTION_IN);
|
||||||
nr_ue_pdsch_procedures(ue,
|
nr_ue_pdsch_procedures(ue,
|
||||||
proc,
|
proc,
|
||||||
gNB_id,
|
gNB_id,
|
||||||
RA_PDSCH,
|
RA_PDSCH,
|
||||||
ue->dlsch_ra[gNB_id],
|
ue->dlsch_ra[gNB_id],
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
// #if UE_TIMING_TRACE
|
|
||||||
// start_meas(&ue->dlsch_procedures_stat[ue->current_thread_id[nr_tti_rx]]);
|
|
||||||
// #endif
|
|
||||||
|
|
||||||
nr_ue_dlsch_procedures(ue,
|
nr_ue_dlsch_procedures(ue,
|
||||||
proc,
|
proc,
|
||||||
@@ -1859,18 +1889,10 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
|
|||||||
&ue->dlsch_ra_errors[gNB_id],
|
&ue->dlsch_ra_errors[gNB_id],
|
||||||
mode);
|
mode);
|
||||||
|
|
||||||
// #if UE_TIMING_TRACE
|
// deactivate dlsch once dlsch proc is done
|
||||||
// stop_meas(&ue->dlsch_procedures_stat[ue->current_thread_id[nr_tti_rx]]);
|
ue->dlsch_ra[gNB_id]->active = 0;
|
||||||
#if DISABLE_LOG_X
|
|
||||||
printf("[SFN %d] Slot1: Pdsch Proc %5.2f\n", nr_tti_rx, ue->pdsch_procedures_stat[ue->current_thread_id[nr_tti_rx]].p_time/(cpuf*1000.0));
|
|
||||||
printf("[SFN %d] Slot0 Slot1: Dlsch Proc %5.2f\n", nr_tti_rx, ue->dlsch_procedures_stat[ue->current_thread_id[ nr_tti_rx]].p_time/(cpuf*1000.0));
|
|
||||||
#else
|
|
||||||
LOG_D(PHY, "[SFN %d] Slot1: Pdsch Proc %5.2f\n", nr_tti_rx, ue->pdsch_procedures_stat[ue->current_thread_id[ nr_tti_rx]].p_time/(cpuf*1000.0));
|
|
||||||
LOG_D(PHY, "[SFN %d] Slot0 Slot1: Dlsch Proc %5.2f\n", nr_tti_rx, ue->dlsch_procedures_stat[ue->current_thread_id[ nr_tti_rx]].p_time/(cpuf*1000.0));
|
|
||||||
#endif
|
|
||||||
// #endif
|
|
||||||
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_RA, VCD_FUNCTION_OUT);
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_RA, VCD_FUNCTION_OUT);
|
||||||
}
|
}
|
||||||
|
|
||||||
// do procedures for C-RNTI
|
// do procedures for C-RNTI
|
||||||
@@ -1937,71 +1959,8 @@ start_meas(&ue->generic_stat);
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// do procedures for SI-RNTI
|
|
||||||
if ((ue->dlsch_SI[gNB_id]) && (ue->dlsch_SI[gNB_id]->active == 1)) {
|
|
||||||
nr_ue_pdsch_procedures(ue,
|
|
||||||
proc,
|
|
||||||
gNB_id,
|
|
||||||
SI_PDSCH,
|
|
||||||
ue->dlsch_SI[gNB_id],
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
/*ue_dlsch_procedures(ue,
|
|
||||||
proc,
|
|
||||||
gNB_id,
|
|
||||||
SI_PDSCH,
|
|
||||||
ue->dlsch_SI[gNB_id],
|
|
||||||
NULL,
|
|
||||||
&ue->dlsch_SI_errors[gNB_id],
|
|
||||||
mode,
|
|
||||||
abstraction_flag);
|
|
||||||
ue->dlsch_SI[gNB_id]->active = 0;*/
|
|
||||||
}
|
|
||||||
|
|
||||||
// do procedures for P-RNTI
|
|
||||||
if ((ue->dlsch_p[gNB_id]) && (ue->dlsch_p[gNB_id]->active == 1)) {
|
|
||||||
nr_ue_pdsch_procedures(ue,
|
|
||||||
proc,
|
|
||||||
gNB_id,
|
|
||||||
P_PDSCH,
|
|
||||||
ue->dlsch_p[gNB_id],
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
|
|
||||||
/*ue_dlsch_procedures(ue,
|
|
||||||
proc,
|
|
||||||
gNB_id,
|
|
||||||
P_PDSCH,
|
|
||||||
ue->dlsch_p[gNB_id],
|
|
||||||
NULL,
|
|
||||||
&ue->dlsch_p_errors[gNB_id],
|
|
||||||
mode,
|
|
||||||
abstraction_flag);*/
|
|
||||||
ue->dlsch_p[gNB_id]->active = 0;
|
|
||||||
}
|
|
||||||
// do procedures for RA-RNTI
|
|
||||||
if ((ue->dlsch_ra[gNB_id]) && (ue->dlsch_ra[gNB_id]->active == 1)) {
|
|
||||||
nr_ue_pdsch_procedures(ue,
|
|
||||||
proc,
|
|
||||||
gNB_id,
|
|
||||||
RA_PDSCH,
|
|
||||||
ue->dlsch_ra[gNB_id],
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
/*ue_dlsch_procedures(ue,
|
|
||||||
proc,
|
|
||||||
gNB_id,
|
|
||||||
RA_PDSCH,
|
|
||||||
ue->dlsch_ra[gNB_id],
|
|
||||||
NULL,
|
|
||||||
&ue->dlsch_ra_errors[gNB_id],
|
|
||||||
mode,
|
|
||||||
abstraction_flag);*/
|
|
||||||
ue->dlsch_ra[gNB_id]->active = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// duplicate harq structure
|
// duplicate harq structure
|
||||||
/*
|
/*
|
||||||
uint8_t current_harq_pid = ue->dlsch[ue->current_thread_id[nr_tti_rx]][gNB_id][0]->current_harq_pid;
|
uint8_t current_harq_pid = ue->dlsch[ue->current_thread_id[nr_tti_rx]][gNB_id][0]->current_harq_pid;
|
||||||
NR_DL_UE_HARQ_t *current_harq_processes = ue->dlsch[ue->current_thread_id[nr_tti_rx]][gNB_id][0]->harq_processes[current_harq_pid];
|
NR_DL_UE_HARQ_t *current_harq_processes = ue->dlsch[ue->current_thread_id[nr_tti_rx]][gNB_id][0]->harq_processes[current_harq_pid];
|
||||||
NR_DL_UE_HARQ_t *harq_processes_dest = ue->dlsch[next1_thread_id][gNB_id][0]->harq_processes[current_harq_pid];
|
NR_DL_UE_HARQ_t *harq_processes_dest = ue->dlsch[next1_thread_id][gNB_id][0]->harq_processes[current_harq_pid];
|
||||||
@@ -2129,6 +2088,11 @@ void nr_ue_prach_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, uint8_t
|
|||||||
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX_PRACH, VCD_FUNCTION_IN);
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX_PRACH, VCD_FUNCTION_IN);
|
||||||
|
|
||||||
|
if (!prach_resources->init_msg1 && (frame_tx == (ue->prach_resources[gNB_id]->sync_frame + 150) % MAX_FRAME_NUMBER)){
|
||||||
|
ue->prach_cnt = 0;
|
||||||
|
prach_resources->init_msg1 = 1;
|
||||||
|
}
|
||||||
|
|
||||||
if (ue->mac_enabled == 0){
|
if (ue->mac_enabled == 0){
|
||||||
// prach_resources->ra_PreambleIndex = preamble_tx;
|
// prach_resources->ra_PreambleIndex = preamble_tx;
|
||||||
prach_resources->ra_TDD_map_index = 0;
|
prach_resources->ra_TDD_map_index = 0;
|
||||||
@@ -2145,15 +2109,10 @@ void nr_ue_prach_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, uint8_t
|
|||||||
ue->ulsch_Msg3_active[i] = 0;
|
ue->ulsch_Msg3_active[i] = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
nr_prach = nr_ue_get_rach(ue->prach_resources[gNB_id], mod_id, ue->CC_id, UE_mode, frame_tx, gNB_id, nr_tti_tx);
|
nr_prach = nr_ue_get_rach(ue->prach_resources[gNB_id], &ue->prach_vars[0]->prach_pdu, mod_id, ue->CC_id, UE_mode, frame_tx, gNB_id, nr_tti_tx);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!prach_resources->init_msg1 && (frame_tx > ue->prach_resources[gNB_id]->sync_frame + 150)){
|
|
||||||
ue->prach_cnt = 0;
|
|
||||||
prach_resources->init_msg1 = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ue->prach_resources[gNB_id] != NULL && nr_prach == 1 && prach_resources->init_msg1) {
|
if (ue->prach_resources[gNB_id] != NULL && nr_prach == 1 && prach_resources->init_msg1) {
|
||||||
|
|
||||||
pathloss = get_nr_PL(mod_id, ue->CC_id, gNB_id);
|
pathloss = get_nr_PL(mod_id, ue->CC_id, gNB_id);
|
||||||
|
|||||||
@@ -37,6 +37,8 @@
|
|||||||
#include "PHY/defs_nr_UE.h"
|
#include "PHY/defs_nr_UE.h"
|
||||||
#include <openair1/SCHED/sched_common.h>
|
#include <openair1/SCHED/sched_common.h>
|
||||||
#include <openair1/PHY/NR_UE_TRANSPORT/pucch_nr.h>
|
#include <openair1/PHY/NR_UE_TRANSPORT/pucch_nr.h>
|
||||||
|
#include "openair2/LAYER2/NR_MAC_UE/mac_proto.h"
|
||||||
|
#include "openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h"
|
||||||
|
|
||||||
#ifndef NO_RAT_NR
|
#ifndef NO_RAT_NR
|
||||||
|
|
||||||
@@ -54,6 +56,44 @@
|
|||||||
|
|
||||||
uint8_t nr_is_cqi_TXOp(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t gNB_id);
|
uint8_t nr_is_cqi_TXOp(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t gNB_id);
|
||||||
uint8_t nr_is_ri_TXOp(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t gNB_id);
|
uint8_t nr_is_ri_TXOp(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t gNB_id);
|
||||||
|
|
||||||
|
long
|
||||||
|
binary_search_float_nr(
|
||||||
|
float elements[],
|
||||||
|
long numElem,
|
||||||
|
float value
|
||||||
|
)
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
{
|
||||||
|
long first, last, middle;
|
||||||
|
first = 0;
|
||||||
|
last = numElem-1;
|
||||||
|
middle = (first+last)/2;
|
||||||
|
|
||||||
|
if(value < elements[0]) {
|
||||||
|
return first;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(value >= elements[last]) {
|
||||||
|
return last;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (last - first > 1) {
|
||||||
|
if (elements[middle] > value) {
|
||||||
|
last = middle;
|
||||||
|
} else {
|
||||||
|
first = middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
middle = (first+last)/2;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (first < 0 || first >= numElem) {
|
||||||
|
LOG_E(RRC,"\n Error in binary search float!");
|
||||||
|
}
|
||||||
|
|
||||||
|
return first;
|
||||||
|
}
|
||||||
/*
|
/*
|
||||||
void nr_generate_pucch0(int32_t **txdataF,
|
void nr_generate_pucch0(int32_t **txdataF,
|
||||||
NR_DL_FRAME_PARMS *frame_parms,
|
NR_DL_FRAME_PARMS *frame_parms,
|
||||||
@@ -241,7 +281,17 @@ bool pucch_procedures_ue_nr(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_nr_rxtx_proc_
|
|||||||
ri_status = ((ue->cqi_report_config[gNB_id].CQI_ReportPeriodic.ri_ConfigIndex>0) &&
|
ri_status = ((ue->cqi_report_config[gNB_id].CQI_ReportPeriodic.ri_ConfigIndex>0) &&
|
||||||
(nr_is_ri_TXOp(ue,proc,gNB_id) == 1));
|
(nr_is_ri_TXOp(ue,proc,gNB_id) == 1));
|
||||||
|
|
||||||
csi_status = get_csi_nr(ue, gNB_id, &csi_payload);
|
|
||||||
|
NR_CSI_MeasConfig_t *csi_MeasConfig = mac->scg->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup;
|
||||||
|
|
||||||
|
uint16_t report_slot_csi =csi_MeasConfig->csi_ReportConfigToAddModList->list.array[0]->reportConfigType.choice.periodic->reportSlotConfig.choice.slots320;
|
||||||
|
|
||||||
|
//if (mac->csirc->reportQuantity.choice.ssb_Index_RSRP){
|
||||||
|
if (report_slot_csi == proc->nr_tti_tx)
|
||||||
|
csi_status = get_csi_nr(mac, ue, gNB_id, &csi_payload);
|
||||||
|
else
|
||||||
|
csi_status = 0;
|
||||||
|
//}
|
||||||
|
|
||||||
O_CSI = cqi_status + ri_status + csi_status;
|
O_CSI = cqi_status + ri_status + csi_status;
|
||||||
|
|
||||||
@@ -397,7 +447,7 @@ bool pucch_procedures_ue_nr(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_nr_rxtx_proc_
|
|||||||
}
|
}
|
||||||
|
|
||||||
int max_code_rate = 0;
|
int max_code_rate = 0;
|
||||||
int Q_m = BITS_PER_SYMBOL_QPSK; /* default pucch modulation type is QPSK with 2 bits per symbol */
|
//int Q_m = BITS_PER_SYMBOL_QPSK; /* default pucch modulation type is QPSK with 2 bits per symbol */
|
||||||
int N_sc_ctrl_RB = 0;
|
int N_sc_ctrl_RB = 0;
|
||||||
int O_CRC = 0;
|
int O_CRC = 0;
|
||||||
|
|
||||||
@@ -426,18 +476,18 @@ bool pucch_procedures_ue_nr(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_nr_rxtx_proc_
|
|||||||
case pucch_format3_nr:
|
case pucch_format3_nr:
|
||||||
{
|
{
|
||||||
nb_of_prbs = pucch_resource->format.choice.format3->nrofPRBs;
|
nb_of_prbs = pucch_resource->format.choice.format3->nrofPRBs;
|
||||||
if (mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->format3->choice.setup->pi2BPSK[0] == 1) {
|
//if (mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->format3->choice.setup->pi2BPSK[0] == 1) {
|
||||||
Q_m = BITS_PER_SYMBOL_BPSK; /* set bpsk modulation type with 1 bit per modulation symbol */
|
// Q_m = BITS_PER_SYMBOL_BPSK; /* set bpsk modulation type with 1 bit per modulation symbol */
|
||||||
}
|
//}
|
||||||
N_sc_ctrl_RB = N_SC_RB;
|
N_sc_ctrl_RB = N_SC_RB;
|
||||||
nb_symbols = nb_symbols_excluding_dmrs[nb_symbols_total-4][index_additional_dmrs][index_hopping];
|
nb_symbols = nb_symbols_excluding_dmrs[nb_symbols_total-4][index_additional_dmrs][index_hopping];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case pucch_format4_nr:
|
case pucch_format4_nr:
|
||||||
{
|
{
|
||||||
if (mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->format4->choice.setup->pi2BPSK[0] == 1) {
|
//if (mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->format4->choice.setup->pi2BPSK[0] == 1) {
|
||||||
Q_m = BITS_PER_SYMBOL_BPSK; /* set bpsk modulation type with 1 bit per modulation symbol */
|
// Q_m = BITS_PER_SYMBOL_BPSK; /* set bpsk modulation type with 1 bit per modulation symbol */
|
||||||
}
|
//}
|
||||||
nb_symbols = nb_symbols_excluding_dmrs[nb_symbols_total-4][index_additional_dmrs][index_hopping];
|
nb_symbols = nb_symbols_excluding_dmrs[nb_symbols_total-4][index_additional_dmrs][index_hopping];
|
||||||
nb_of_prbs = 1;
|
nb_of_prbs = 1;
|
||||||
subframe_number = nr_tti_tx/(ue->frame_parms.slots_per_subframe);//ttis_per_subframe);
|
subframe_number = nr_tti_tx/(ue->frame_parms.slots_per_subframe);//ttis_per_subframe);
|
||||||
@@ -464,26 +514,27 @@ bool pucch_procedures_ue_nr(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_nr_rxtx_proc_
|
|||||||
|
|
||||||
/* TS 38.212 6.3.1.2 Code block segmentation and CRC attachment */
|
/* TS 38.212 6.3.1.2 Code block segmentation and CRC attachment */
|
||||||
/* crc attachment can be done depending of payload size */
|
/* crc attachment can be done depending of payload size */
|
||||||
if (N_UCI < 11) {
|
// if (N_UCI < 11) {
|
||||||
O_CRC = 0; /* no additional crc bits */
|
// O_CRC = 0; /* no additional crc bits */
|
||||||
}
|
// }
|
||||||
else if ((N_UCI >= 12) && (N_UCI <= 19)) {
|
// else if ((N_UCI >= 12) && (N_UCI <= 19)) {
|
||||||
O_CRC = 6; /* number of additional crc bits */
|
// O_CRC = 6; /* number of additional crc bits */
|
||||||
}
|
// }
|
||||||
else if (N_UCI >= 20) {
|
// else if (N_UCI >= 20) {
|
||||||
O_CRC = 11; /* number of additional crc bits */
|
// O_CRC = 11; /* number of additional crc bits */
|
||||||
}
|
// }
|
||||||
|
|
||||||
N_UCI = N_UCI + O_CRC;
|
N_UCI = N_UCI + O_CRC;
|
||||||
|
|
||||||
/* for format 2 and 3, number of prb should be adjusted to minimum value which cope to information size */
|
/* for format 2 and 3, number of prb should be adjusted to minimum value which cope to information size */
|
||||||
if (nb_of_prbs > 1 ) {
|
/*if (nb_of_prbs > 1 ) {
|
||||||
int nb_prb_min = 0;
|
int nb_prb_min = 0;
|
||||||
int payload_in_bits;
|
int payload_in_bits;
|
||||||
do {
|
do {
|
||||||
nb_prb_min++;
|
nb_prb_min++;
|
||||||
payload_in_bits = (nb_prb_min * N_sc_ctrl_RB * nb_symbols * Q_m * max_code_rate)/100; /* code rate has been multiplied by 100 */
|
payload_in_bits = (nb_prb_min * N_sc_ctrl_RB * nb_symbols * Q_m * max_code_rate)/100; */ /* code rate has been multiplied by 100 */
|
||||||
NR_TST_PHY_PRINTF("PUCCH Adjust number of prb : (N_UCI : %d ) (payload_in_bits : %d) (N_sc_ctrl_RB : %d) (nb_symbols : %d) (Q_m : %d) (max_code_rate*100 : %d) \n",
|
|
||||||
|
/*NR_TST_PHY_PRINTF("PUCCH Adjust number of prb : (N_UCI : %d ) (payload_in_bits : %d) (N_sc_ctrl_RB : %d) (nb_symbols : %d) (Q_m : %d) (max_code_rate*100 : %d) \n",
|
||||||
N_UCI, payload_in_bits, N_sc_ctrl_RB, nb_symbols, Q_m, max_code_rate);
|
N_UCI, payload_in_bits, N_sc_ctrl_RB, nb_symbols, Q_m, max_code_rate);
|
||||||
} while (N_UCI > payload_in_bits);
|
} while (N_UCI > payload_in_bits);
|
||||||
|
|
||||||
@@ -494,7 +545,7 @@ bool pucch_procedures_ue_nr(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_nr_rxtx_proc_
|
|||||||
else {
|
else {
|
||||||
nb_of_prbs = nb_prb_min;
|
nb_of_prbs = nb_prb_min;
|
||||||
}
|
}
|
||||||
}
|
}*/
|
||||||
|
|
||||||
/* TS 38.213 9.2.4 for a positive SR transmission, payload b(0) = 0 */
|
/* TS 38.213 9.2.4 for a positive SR transmission, payload b(0) = 0 */
|
||||||
if ((O_SR == 1) && (format == pucch_format1_nr)) {
|
if ((O_SR == 1) && (format == pucch_format1_nr)) {
|
||||||
@@ -986,7 +1037,10 @@ boolean_t select_pucch_resource(PHY_VARS_NR_UE *ue, NR_UE_MAC_INST_t *mac, uint8
|
|||||||
current_resource_id = r_PUCCH;
|
current_resource_id = r_PUCCH;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
current_resource_id = mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList->list.array[pucch_resource_set_id]->resourceList.list.array[pucch_resource_indicator][0];
|
if (pucch_resource_set_id !=0 )
|
||||||
|
current_resource_id = 3; //TBC mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList->list.array[pucch_resource_set_id]->resourceList.list.array[pucch_resource_indicator][0];
|
||||||
|
else
|
||||||
|
current_resource_id = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1050,7 +1104,7 @@ boolean_t select_pucch_resource(PHY_VARS_NR_UE *ue, NR_UE_MAC_INST_t *mac, uint8
|
|||||||
int find_pucch_resource_set(NR_UE_MAC_INST_t *mac, uint8_t gNB_id, int uci_size)
|
int find_pucch_resource_set(NR_UE_MAC_INST_t *mac, uint8_t gNB_id, int uci_size)
|
||||||
{
|
{
|
||||||
int pucch_resource_set_id = 0;
|
int pucch_resource_set_id = 0;
|
||||||
long *pucch_max_pl_bits = NULL;
|
//long *pucch_max_pl_bits = NULL;
|
||||||
|
|
||||||
/* from TS 38.331 field maxPayloadMinus1
|
/* from TS 38.331 field maxPayloadMinus1
|
||||||
-- Maximum number of payload bits minus 1 that the UE may transmit using this PUCCH resource set. In a PUCCH occurrence, the UE
|
-- Maximum number of payload bits minus 1 that the UE may transmit using this PUCCH resource set. In a PUCCH occurrence, the UE
|
||||||
@@ -1062,9 +1116,15 @@ int find_pucch_resource_set(NR_UE_MAC_INST_t *mac, uint8_t gNB_id, int uci_size)
|
|||||||
/* look for the first resource set which supports uci_size number of bits for payload */
|
/* look for the first resource set which supports uci_size number of bits for payload */
|
||||||
while (pucch_resource_set_id < MAX_NB_OF_PUCCH_RESOURCE_SETS) {
|
while (pucch_resource_set_id < MAX_NB_OF_PUCCH_RESOURCE_SETS) {
|
||||||
if (mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList->list.array[pucch_resource_set_id] != NULL) {
|
if (mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList->list.array[pucch_resource_set_id] != NULL) {
|
||||||
pucch_max_pl_bits = mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList->list.array[pucch_resource_set_id]->maxPayloadMinus1;
|
//pucch_max_pl_bits = mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList->list.array[pucch_resource_set_id]->maxPayloadMinus1;
|
||||||
if (uci_size <= (((pucch_max_pl_bits != NULL) ? *pucch_max_pl_bits : 1706) + 1)) {
|
if (uci_size <= 2) { //TBC rrc (((pucch_max_pl_bits != NULL) ? *pucch_max_pl_bits : 1706) + 1)) {
|
||||||
NR_TST_PHY_PRINTF("PUCCH found resource set %d \n", pucch_resource_set_id);
|
//NR_TST_PHY_PRINTF("PUCCH found resource set %d max bits %d\n", pucch_resource_set_id, pucch_max_pl_bits);
|
||||||
|
pucch_resource_set_id = 0;
|
||||||
|
return (pucch_resource_set_id);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
pucch_resource_set_id = 1;
|
||||||
return (pucch_resource_set_id);
|
return (pucch_resource_set_id);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -1096,7 +1156,7 @@ boolean_t check_pucch_format(NR_UE_MAC_INST_t *mac, uint8_t gNB_id, pucch_format
|
|||||||
{
|
{
|
||||||
pucch_format_nr_t selected_pucch_format;
|
pucch_format_nr_t selected_pucch_format;
|
||||||
pucch_format_nr_t selected_pucch_format_second;
|
pucch_format_nr_t selected_pucch_format_second;
|
||||||
NR_SetupRelease_PUCCH_FormatConfig_t *identified_format = NULL;
|
/*NR_SetupRelease_PUCCH_FormatConfig_t *identified_format = NULL;
|
||||||
|
|
||||||
switch (format_pucch) {
|
switch (format_pucch) {
|
||||||
case pucch_format1_nr:
|
case pucch_format1_nr:
|
||||||
@@ -1121,12 +1181,12 @@ boolean_t check_pucch_format(NR_UE_MAC_INST_t *mac, uint8_t gNB_id, pucch_format
|
|||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}*/
|
||||||
|
|
||||||
if ((identified_format != NULL) && (identified_format->choice.setup->nrofSlots[0] != 1)) {
|
/* if ((identified_format != NULL) && (identified_format->choice.setup->nrofSlots[0] != 1)) {
|
||||||
LOG_E(PHY,"PUCCH not implemented multislots transmission : at line %d in function %s of file %s \n", LINE_FILE , __func__, FILE_NAME);
|
LOG_E(PHY,"PUCCH not implemented multislots transmission : at line %d in function %s of file %s \n", LINE_FILE , __func__, FILE_NAME);
|
||||||
return (FALSE);
|
return (FALSE);
|
||||||
}
|
}*/
|
||||||
|
|
||||||
if (nb_symbols_for_tx <= 2) {
|
if (nb_symbols_for_tx <= 2) {
|
||||||
if (uci_size <= 2) {
|
if (uci_size <= 2) {
|
||||||
@@ -1247,19 +1307,68 @@ uint32_t dummy_csi_payload = 0;
|
|||||||
|
|
||||||
/* FFS TODO_NR code that should be developed */
|
/* FFS TODO_NR code that should be developed */
|
||||||
|
|
||||||
int get_csi_nr(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint32_t *csi_payload)
|
uint16_t get_nr_csi_bitlen(NR_UE_MAC_INST_t *mac) {
|
||||||
|
|
||||||
|
uint16_t csi_bitlen =0;
|
||||||
|
uint16_t rsrp_bitlen = 0;
|
||||||
|
uint16_t diff_rsrp_bitlen = 0;
|
||||||
|
uint16_t nb_ssbri_cri = 0;
|
||||||
|
uint16_t cri_ssbri_bitlen = 0;
|
||||||
|
|
||||||
|
NR_CSI_MeasConfig_t *csi_MeasConfig = mac->scg->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup;
|
||||||
|
struct NR_CSI_ResourceConfig__csi_RS_ResourceSetList__nzp_CSI_RS_SSB * nzp_CSI_RS_SSB = csi_MeasConfig->csi_ResourceConfigToAddModList->list.array[0]->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB;
|
||||||
|
|
||||||
|
uint16_t nb_csi_ssb_report = nzp_CSI_RS_SSB->csi_SSB_ResourceSetList!=NULL ? nzp_CSI_RS_SSB->csi_SSB_ResourceSetList->list.count:0;
|
||||||
|
|
||||||
|
if (0 != nb_csi_ssb_report){
|
||||||
|
uint8_t nb_ssb_resources =0;
|
||||||
|
|
||||||
|
if (NULL != csi_MeasConfig->csi_ReportConfigToAddModList->list.array[0]->groupBasedBeamReporting.choice.disabled->nrofReportedRS)
|
||||||
|
nb_ssbri_cri = *(csi_MeasConfig->csi_ReportConfigToAddModList->list.array[0]->groupBasedBeamReporting.choice.disabled->nrofReportedRS)+1;
|
||||||
|
else
|
||||||
|
nb_ssbri_cri = 1;
|
||||||
|
|
||||||
|
nb_ssb_resources = csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.array[0]->csi_SSB_ResourceList.list.count;
|
||||||
|
|
||||||
|
if (nb_ssb_resources){
|
||||||
|
cri_ssbri_bitlen =ceil(log2 (nb_ssb_resources));
|
||||||
|
rsrp_bitlen = 7;
|
||||||
|
diff_rsrp_bitlen = 4;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
cri_ssbri_bitlen =0;
|
||||||
|
rsrp_bitlen = 0;
|
||||||
|
diff_rsrp_bitlen = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
csi_bitlen = ((cri_ssbri_bitlen * nb_ssbri_cri) + rsrp_bitlen +(diff_rsrp_bitlen *(nb_ssbri_cri -1 ))) *nb_csi_ssb_report;
|
||||||
|
|
||||||
|
//printf("get csi bitlen %d nb_ssbri_cri %d nb_csi_report %d nb_resources %d\n", csi_bitlen,nb_ssbri_cri ,nb_csi_ssb_report, nb_ssb_resources);
|
||||||
|
}
|
||||||
|
return csi_bitlen;
|
||||||
|
}
|
||||||
|
|
||||||
|
int get_csi_nr(NR_UE_MAC_INST_t *mac, PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint32_t *csi_payload)
|
||||||
{
|
{
|
||||||
VOID_PARAMETER ue;
|
VOID_PARAMETER ue;
|
||||||
VOID_PARAMETER gNB_id;
|
VOID_PARAMETER gNB_id;
|
||||||
|
float rsrp_db[7];
|
||||||
|
int nElem = 98;
|
||||||
|
int rsrp_offset = 17;
|
||||||
|
int csi_status = 0;
|
||||||
|
|
||||||
|
csi_status = get_nr_csi_bitlen(mac);
|
||||||
|
rsrp_db[0] = get_nr_RSRP(0,0,0);
|
||||||
|
|
||||||
if (dummy_csi_status == 0) {
|
|
||||||
|
if (csi_status == 0) {
|
||||||
*csi_payload = 0;
|
*csi_payload = 0;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
*csi_payload = dummy_csi_payload;
|
*csi_payload = binary_search_float_nr(RSRP_meas_mapping_nr,nElem, rsrp_db[0]) + rsrp_offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (dummy_csi_status);
|
return (csi_status);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* FFS TODO_NR code that should be removed */
|
/* FFS TODO_NR code that should be removed */
|
||||||
@@ -1326,6 +1435,9 @@ int get_ics_pucch(NR_PUCCH_Resource_t *pucch_resource, pucch_format_nr_t format_
|
|||||||
|
|
||||||
case pucch_format1_nr:
|
case pucch_format1_nr:
|
||||||
return pucch_resource->format.choice.format1->initialCyclicShift;
|
return pucch_resource->format.choice.format1->initialCyclicShift;
|
||||||
|
|
||||||
|
case pucch_format2_nr:
|
||||||
|
return 0;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return -1;
|
return -1;
|
||||||
|
|||||||
@@ -60,6 +60,111 @@
|
|||||||
|
|
||||||
/************** VARIABLES *****************************************/
|
/************** VARIABLES *****************************************/
|
||||||
|
|
||||||
|
float RSRP_meas_mapping_nr[98]
|
||||||
|
#ifdef INIT_VARIABLES_PUCCH_UE_NR_H
|
||||||
|
= {
|
||||||
|
-140,
|
||||||
|
-139,
|
||||||
|
-138,
|
||||||
|
-137,
|
||||||
|
-136,
|
||||||
|
-135,
|
||||||
|
-134,
|
||||||
|
-133,
|
||||||
|
-132,
|
||||||
|
-131,
|
||||||
|
-130,
|
||||||
|
-129,
|
||||||
|
-128,
|
||||||
|
-127,
|
||||||
|
-126,
|
||||||
|
-125,
|
||||||
|
-124,
|
||||||
|
-123,
|
||||||
|
-122,
|
||||||
|
-121,
|
||||||
|
-120,
|
||||||
|
-119,
|
||||||
|
-118,
|
||||||
|
-117,
|
||||||
|
-116,
|
||||||
|
-115,
|
||||||
|
-114,
|
||||||
|
-113,
|
||||||
|
-112,
|
||||||
|
-111,
|
||||||
|
-110,
|
||||||
|
-109,
|
||||||
|
-108,
|
||||||
|
-107,
|
||||||
|
-106,
|
||||||
|
-105,
|
||||||
|
-104,
|
||||||
|
-103,
|
||||||
|
-102,
|
||||||
|
-101,
|
||||||
|
-100,
|
||||||
|
-99,
|
||||||
|
-98,
|
||||||
|
-97,
|
||||||
|
-96,
|
||||||
|
-95,
|
||||||
|
-94,
|
||||||
|
-93,
|
||||||
|
-92,
|
||||||
|
-91,
|
||||||
|
-90,
|
||||||
|
-89,
|
||||||
|
-88,
|
||||||
|
-87,
|
||||||
|
-86,
|
||||||
|
-85,
|
||||||
|
-84,
|
||||||
|
-83,
|
||||||
|
-82,
|
||||||
|
-81,
|
||||||
|
-80,
|
||||||
|
-79,
|
||||||
|
-78,
|
||||||
|
-77,
|
||||||
|
-76,
|
||||||
|
-75,
|
||||||
|
-74,
|
||||||
|
-73,
|
||||||
|
-72,
|
||||||
|
-71,
|
||||||
|
-70,
|
||||||
|
-69,
|
||||||
|
-68,
|
||||||
|
-67,
|
||||||
|
-66,
|
||||||
|
-65,
|
||||||
|
-64,
|
||||||
|
-63,
|
||||||
|
-62,
|
||||||
|
-61,
|
||||||
|
-60,
|
||||||
|
-59,
|
||||||
|
-58,
|
||||||
|
-57,
|
||||||
|
-56,
|
||||||
|
-55,
|
||||||
|
-54,
|
||||||
|
-53,
|
||||||
|
-52,
|
||||||
|
-51,
|
||||||
|
-50,
|
||||||
|
-49,
|
||||||
|
-48,
|
||||||
|
-47,
|
||||||
|
-46,
|
||||||
|
-45,
|
||||||
|
-44,
|
||||||
|
-43
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
|
||||||
/* TS 36.213 Table 9.2.1-1: PUCCH resource sets before dedicated PUCCH resource configuration */
|
/* TS 36.213 Table 9.2.1-1: PUCCH resource sets before dedicated PUCCH resource configuration */
|
||||||
const initial_pucch_resource_t initial_pucch_resource[NB_INITIAL_PUCCH_RESOURCE]
|
const initial_pucch_resource_t initial_pucch_resource[NB_INITIAL_PUCCH_RESOURCE]
|
||||||
#ifdef INIT_VARIABLES_PUCCH_UE_NR_H
|
#ifdef INIT_VARIABLES_PUCCH_UE_NR_H
|
||||||
@@ -226,12 +331,14 @@ int trigger_periodic_scheduling_request(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_n
|
|||||||
@param csi_payload is updated with CSI
|
@param csi_payload is updated with CSI
|
||||||
@returns number of bits of CSI */
|
@returns number of bits of CSI */
|
||||||
|
|
||||||
int get_csi_nr(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint32_t *csi_payload);
|
int get_csi_nr(NR_UE_MAC_INST_t *mac, PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint32_t *csi_payload);
|
||||||
|
|
||||||
/** \brief This dummy function sets current CSI for simulation
|
/** \brief This dummy function sets current CSI for simulation
|
||||||
@param csi_status
|
@param csi_status
|
||||||
@param csi_payload is updated with CSI
|
@param csi_payload is updated with CSI
|
||||||
@returns none */
|
@returns none */
|
||||||
|
|
||||||
|
uint16_t get_nr_csi_bitlen(NR_UE_MAC_INST_t *mac);
|
||||||
|
|
||||||
void set_csi_nr(int csi_status, uint32_t csi_payload);
|
void set_csi_nr(int csi_status, uint32_t csi_payload);
|
||||||
|
|
||||||
|
|||||||
@@ -140,6 +140,12 @@ int generate_dlsch_header(unsigned char *mac_header,
|
|||||||
unsigned char short_padding,
|
unsigned char short_padding,
|
||||||
unsigned short post_padding){return 0;}
|
unsigned short post_padding){return 0;}
|
||||||
|
|
||||||
|
// Dummy function to avoid linking error at compilation of nr-dlsim
|
||||||
|
int is_x2ap_enabled(void)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
// needed for some functions
|
// needed for some functions
|
||||||
openair0_config_t openair0_cfg[MAX_CARDS];
|
openair0_config_t openair0_cfg[MAX_CARDS];
|
||||||
|
|
||||||
@@ -562,13 +568,14 @@ int main(int argc, char **argv)
|
|||||||
uint64_t ssb_bitmap;
|
uint64_t ssb_bitmap;
|
||||||
fill_scc(rrc.carrier.servingcellconfigcommon,&ssb_bitmap,N_RB_DL,N_RB_DL,mu,mu);
|
fill_scc(rrc.carrier.servingcellconfigcommon,&ssb_bitmap,N_RB_DL,N_RB_DL,mu,mu);
|
||||||
|
|
||||||
|
fix_scc(scc,ssb_bitmap);
|
||||||
|
|
||||||
fill_default_secondaryCellGroup(scc,
|
fill_default_secondaryCellGroup(scc,
|
||||||
secondaryCellGroup,
|
secondaryCellGroup,
|
||||||
0,
|
0,
|
||||||
1,
|
1,
|
||||||
n_tx,
|
n_tx,
|
||||||
0);
|
0);
|
||||||
fix_scc(scc,ssb_bitmap);
|
|
||||||
|
|
||||||
/* -U option modify DMRS */
|
/* -U option modify DMRS */
|
||||||
if(modify_dmrs)
|
if(modify_dmrs)
|
||||||
|
|||||||
@@ -35,6 +35,7 @@
|
|||||||
#include "PHY/NR_REFSIG/refsig_defs_ue.h"
|
#include "PHY/NR_REFSIG/refsig_defs_ue.h"
|
||||||
#include "PHY/MODULATION/modulation_eNB.h"
|
#include "PHY/MODULATION/modulation_eNB.h"
|
||||||
#include "PHY/MODULATION/modulation_UE.h"
|
#include "PHY/MODULATION/modulation_UE.h"
|
||||||
|
#include "PHY/MODULATION/nr_modulation.h"
|
||||||
#include "PHY/INIT/phy_init.h"
|
#include "PHY/INIT/phy_init.h"
|
||||||
#include "PHY/NR_TRANSPORT/nr_transport_proto.h"
|
#include "PHY/NR_TRANSPORT/nr_transport_proto.h"
|
||||||
#include "PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h"
|
#include "PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h"
|
||||||
|
|||||||
@@ -100,6 +100,12 @@ rrc_gNB_process_GTPV1U_CREATE_TUNNEL_RESP(
|
|||||||
|
|
||||||
int8_t nr_mac_rrc_data_ind_ue(const module_id_t module_id, const int CC_id, const uint8_t gNB_index, const int8_t channel, const uint8_t* pduP, const sdu_size_t pdu_len) {return 0;}
|
int8_t nr_mac_rrc_data_ind_ue(const module_id_t module_id, const int CC_id, const uint8_t gNB_index, const int8_t channel, const uint8_t* pduP, const sdu_size_t pdu_len) {return 0;}
|
||||||
|
|
||||||
|
// Dummy function to avoid linking error at compilation of nr-prachsim
|
||||||
|
int is_x2ap_enabled(void)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv){
|
int main(int argc, char **argv){
|
||||||
|
|
||||||
char c;
|
char c;
|
||||||
|
|||||||
@@ -119,6 +119,12 @@ rrc_gNB_process_GTPV1U_CREATE_TUNNEL_RESP(
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Dummy function to avoid linking error at compilation of nr-ulsim
|
||||||
|
int is_x2ap_enabled(void)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
// needed for some functions
|
// needed for some functions
|
||||||
uint16_t n_rnti = 0x1234;
|
uint16_t n_rnti = 0x1234;
|
||||||
openair0_config_t openair0_cfg[MAX_CARDS];
|
openair0_config_t openair0_cfg[MAX_CARDS];
|
||||||
@@ -559,13 +565,14 @@ int main(int argc, char **argv)
|
|||||||
uint64_t ssb_bitmap;
|
uint64_t ssb_bitmap;
|
||||||
fill_scc(rrc.carrier.servingcellconfigcommon,&ssb_bitmap,N_RB_DL,N_RB_DL,mu,mu);
|
fill_scc(rrc.carrier.servingcellconfigcommon,&ssb_bitmap,N_RB_DL,N_RB_DL,mu,mu);
|
||||||
|
|
||||||
|
fix_scc(scc,ssb_bitmap);
|
||||||
|
|
||||||
fill_default_secondaryCellGroup(scc,
|
fill_default_secondaryCellGroup(scc,
|
||||||
secondaryCellGroup,
|
secondaryCellGroup,
|
||||||
0,
|
0,
|
||||||
1,
|
1,
|
||||||
n_tx,
|
n_tx,
|
||||||
0);
|
0);
|
||||||
fix_scc(scc,ssb_bitmap);
|
|
||||||
|
|
||||||
// xer_fprint(stdout, &asn_DEF_NR_CellGroupConfig, (const void*)secondaryCellGroup);
|
// xer_fprint(stdout, &asn_DEF_NR_CellGroupConfig, (const void*)secondaryCellGroup);
|
||||||
|
|
||||||
|
|||||||
@@ -65,18 +65,6 @@
|
|||||||
#define MAX_NR_RRC_UE_CONTEXTS 64
|
#define MAX_NR_RRC_UE_CONTEXTS 64
|
||||||
|
|
||||||
#ifndef UE_EXPANSION
|
#ifndef UE_EXPANSION
|
||||||
// TODO:L2 FAPI simulator.
|
|
||||||
// UESIM_EXPANSION is used to be same value of MAX_MOBILES_PER_ENB
|
|
||||||
// in eNB and UE.
|
|
||||||
// now , if we use --mu option in UE, compiling error will occur.
|
|
||||||
// This problem will be fixed in the future.
|
|
||||||
#ifdef UESIM_EXPANSION
|
|
||||||
#define MAX_MOBILES_PER_ENB 256
|
|
||||||
#define MAX_MOBILES_PER_ENB_NB_IoT 256
|
|
||||||
#define MAX_MOBILES_PER_GNB 256
|
|
||||||
#define MAX_eNB 2
|
|
||||||
#define MAX_gNB 2
|
|
||||||
#else
|
|
||||||
#ifdef LARGE_SCALE
|
#ifdef LARGE_SCALE
|
||||||
#define MAX_MOBILES_PER_ENB 128
|
#define MAX_MOBILES_PER_ENB 128
|
||||||
#define MAX_MOBILES_PER_ENB_NB_IoT 128
|
#define MAX_MOBILES_PER_ENB_NB_IoT 128
|
||||||
@@ -90,7 +78,6 @@
|
|||||||
#define MAX_eNB 2
|
#define MAX_eNB 2
|
||||||
#define MAX_gNB 2
|
#define MAX_gNB 2
|
||||||
#endif
|
#endif
|
||||||
#endif
|
|
||||||
#else
|
#else
|
||||||
#define MAX_MOBILES_PER_ENB 256
|
#define MAX_MOBILES_PER_ENB 256
|
||||||
#define MAX_MOBILES_PER_ENB_NB_IoT 256
|
#define MAX_MOBILES_PER_ENB_NB_IoT 256
|
||||||
|
|||||||
@@ -947,6 +947,24 @@ int get_format0(uint8_t index,
|
|||||||
return format;
|
return format;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int64_t *get_prach_config_info(uint32_t pointa,
|
||||||
|
uint8_t index,
|
||||||
|
uint8_t unpaired) {
|
||||||
|
int64_t *prach_config_info_p;
|
||||||
|
|
||||||
|
if (pointa > 2016666) { //FR2
|
||||||
|
prach_config_info_p = table_6_3_3_2_4_prachConfig_Index[index];
|
||||||
|
}
|
||||||
|
else { // FR1
|
||||||
|
if (unpaired)
|
||||||
|
prach_config_info_p = table_6_3_3_2_3_prachConfig_Index[index];
|
||||||
|
else
|
||||||
|
prach_config_info_p = table_6_3_3_2_2_prachConfig_Index[index];
|
||||||
|
} // FR2 / FR1
|
||||||
|
|
||||||
|
return prach_config_info_p;
|
||||||
|
}
|
||||||
|
|
||||||
void find_monitoring_periodicity_offset_common(NR_SearchSpace_t *ss,
|
void find_monitoring_periodicity_offset_common(NR_SearchSpace_t *ss,
|
||||||
uint16_t *slot_period,
|
uint16_t *slot_period,
|
||||||
uint16_t *offset) {
|
uint16_t *offset) {
|
||||||
@@ -1451,7 +1469,7 @@ nr_bandentry_t nr_bandtable[] = {
|
|||||||
{5, 824000, 849000, 869000, 894000, 20, 173800, 100},
|
{5, 824000, 849000, 869000, 894000, 20, 173800, 100},
|
||||||
{7, 2500000, 2570000, 2620000, 2690000, 20, 524000, 100},
|
{7, 2500000, 2570000, 2620000, 2690000, 20, 524000, 100},
|
||||||
{8, 880000, 915000, 925000, 960000, 20, 185000, 100},
|
{8, 880000, 915000, 925000, 960000, 20, 185000, 100},
|
||||||
{12, 698000, 716000, 728000, 746000, 20, 145800, 100},
|
{12, 698000, 716000, 729000, 746000, 20, 145800, 100},
|
||||||
{20, 832000, 862000, 791000, 821000, 20, 158200, 100},
|
{20, 832000, 862000, 791000, 821000, 20, 158200, 100},
|
||||||
{25, 1850000, 1915000, 1930000, 1995000, 20, 386000, 100},
|
{25, 1850000, 1915000, 1930000, 1995000, 20, 386000, 100},
|
||||||
{28, 703000, 758000, 758000, 813000, 20, 151600, 100},
|
{28, 703000, 758000, 758000, 813000, 20, 151600, 100},
|
||||||
@@ -1473,22 +1491,22 @@ nr_bandentry_t nr_bandtable[] = {
|
|||||||
{77, 3300000, 4200000, 3300000, 4200000, 2, 620000, 30},
|
{77, 3300000, 4200000, 3300000, 4200000, 2, 620000, 30},
|
||||||
{78, 3300000, 3800000, 3300000, 3800000, 1, 620000, 15},
|
{78, 3300000, 3800000, 3300000, 3800000, 1, 620000, 15},
|
||||||
{78, 3300000, 3800000, 3300000, 3800000, 2, 620000, 30},
|
{78, 3300000, 3800000, 3300000, 3800000, 2, 620000, 30},
|
||||||
{79, 4400000, 5000000, 4400000, 5000000, 1, 693334, 15},
|
{79, 4400010, 5000000, 4400010, 5000000, 1, 693334, 15},
|
||||||
{79, 4400000, 5000000, 4400000, 5000000, 2, 693334, 30},
|
{79, 4400010, 5000000, 4400010, 5000000, 2, 693334, 30},
|
||||||
{80, 1710000, 1785000, 000, 000, 20, 342000, 100},
|
{80, 1710000, 1785000, 000, 000, 20, 342000, 100},
|
||||||
{81, 860000, 915000, 000, 000, 20, 176000, 100},
|
{81, 880000, 915000, 000, 000, 20, 176000, 100},
|
||||||
{82, 832000, 862000, 000, 000, 20, 166400, 100},
|
{82, 832000, 862000, 000, 000, 20, 166400, 100},
|
||||||
{83, 703000, 748000, 000, 000, 20, 140600, 100},
|
{83, 703000, 748000, 000, 000, 20, 140600, 100},
|
||||||
{84, 1920000, 1980000, 000, 000, 20, 384000, 100},
|
{84, 1920000, 1980000, 000, 000, 20, 384000, 100},
|
||||||
{86, 1710000, 1785000, 000, 000, 20, 342000, 100},
|
{86, 1710000, 1785000, 000, 000, 20, 342000, 100},
|
||||||
{257,26500000,29500000,26500000,29500000, 1,2054166, 60},
|
{257,26500020,29500000,26500020,29500000, 1,2054166, 60},
|
||||||
{257,26500000,29500000,26500000,29500000, 2,2054167, 120},
|
{257,26500080,29500000,26500080,29500000, 2,2054167, 120},
|
||||||
{258,24250000,27500000,24250000,27500000, 1,2016667, 60},
|
{258,24250080,27500000,24250080,27500000, 1,2016667, 60},
|
||||||
{258,24250000,27500000,24250000,27500000, 2,2016667, 120},
|
{258,24250080,27500000,24250080,27500000, 2,2016667, 120},
|
||||||
{260,37000000,40000000,37000000,40000000, 1,2229166, 60},
|
{260,37000020,40000000,37000020,40000000, 1,2229166, 60},
|
||||||
{260,37000000,40000000,37000000,40000000, 2,2229167, 120},
|
{260,37000080,40000000,37000080,40000000, 2,2229167, 120},
|
||||||
{261,27500000,28350000,27500000,28350000, 1,2070833, 60},
|
{261,27500040,28350000,27500040,28350000, 1,2070833, 60},
|
||||||
{261,27500000,28350000,27500000,28350000, 2,2070833, 120}
|
{261,27500040,28350000,27500040,28350000, 2,2070833, 120}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -36,6 +36,36 @@
|
|||||||
#include "NR_CellGroupConfig.h"
|
#include "NR_CellGroupConfig.h"
|
||||||
#include "nr_mac.h"
|
#include "nr_mac.h"
|
||||||
|
|
||||||
|
|
||||||
|
// ===============================================
|
||||||
|
// SSB to RO mapping public defines and structures
|
||||||
|
// ===============================================
|
||||||
|
#define MAX_SSB_PER_RO (16) // Maximum number of SSBs that can be mapped to a single RO
|
||||||
|
#define MAX_TDM (7) // Maximum nb of PRACH occasions TDMed in a slot
|
||||||
|
#define MAX_FDM (8) // Maximum nb of PRACH occasions FDMed in a slot
|
||||||
|
|
||||||
|
// PRACH occasion details
|
||||||
|
typedef struct prach_occasion_info {
|
||||||
|
uint8_t start_symbol; // 0 - 13 (14 symbols in a slot)
|
||||||
|
uint8_t fdm; // 0-7 (possible values of msg1-FDM: 1, 2, 4 or 8)
|
||||||
|
uint8_t slot; // 0 - 159 (maximum number of slots in a 10ms frame - @ 240kHz)
|
||||||
|
uint8_t frame; // 0 - 15 (maximum number of frames in a 160ms association pattern)
|
||||||
|
uint8_t mapped_ssb_idx[MAX_SSB_PER_RO]; // List of mapped SSBs
|
||||||
|
uint8_t nb_mapped_ssb;
|
||||||
|
uint16_t format; // RO preamble format
|
||||||
|
} prach_occasion_info_t;
|
||||||
|
|
||||||
|
// PRACH occasion slot details
|
||||||
|
// A PRACH occasion slot is a series of PRACH occasions in time (symbols) and frequency
|
||||||
|
typedef struct prach_occasion_slot {
|
||||||
|
prach_occasion_info_t prach_occasion[MAX_TDM][MAX_FDM]; // Starting symbol of each PRACH occasions in a slot
|
||||||
|
uint8_t nb_of_prach_occasion_in_time;
|
||||||
|
uint8_t nb_of_prach_occasion_in_freq;
|
||||||
|
} prach_occasion_slot_t;
|
||||||
|
|
||||||
|
// ========================================
|
||||||
|
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
NR_DL_DCI_FORMAT_1_0 = 0,
|
NR_DL_DCI_FORMAT_1_0 = 0,
|
||||||
NR_DL_DCI_FORMAT_1_1,
|
NR_DL_DCI_FORMAT_1_1,
|
||||||
@@ -133,6 +163,10 @@ int ul_ant_bits(NR_DMRS_UplinkConfig_t *NR_DMRS_UplinkConfig,long transformPreco
|
|||||||
|
|
||||||
int get_format0(uint8_t index, uint8_t unpaired);
|
int get_format0(uint8_t index, uint8_t unpaired);
|
||||||
|
|
||||||
|
int64_t *get_prach_config_info(uint32_t pointa,
|
||||||
|
uint8_t index,
|
||||||
|
uint8_t unpaired);
|
||||||
|
|
||||||
uint16_t get_NCS(uint8_t index, uint16_t format, uint8_t restricted_set_config);
|
uint16_t get_NCS(uint8_t index, uint16_t format, uint8_t restricted_set_config);
|
||||||
|
|
||||||
int get_num_dmrs(uint16_t dmrs_mask );
|
int get_num_dmrs(uint16_t dmrs_mask );
|
||||||
|
|||||||
@@ -204,7 +204,7 @@ void config_common_ue(NR_UE_MAC_INST_t *mac,
|
|||||||
uint16_t band;
|
uint16_t band;
|
||||||
int32_t offset;
|
int32_t offset;
|
||||||
|
|
||||||
get_band((cfg->carrier_config.dl_frequency)*1000,
|
get_band((uint64_t)(cfg->carrier_config.dl_frequency)*1000,
|
||||||
&band,
|
&band,
|
||||||
&offset,
|
&offset,
|
||||||
&frame_type);
|
&frame_type);
|
||||||
@@ -243,8 +243,8 @@ void config_common_ue(NR_UE_MAC_INST_t *mac,
|
|||||||
cfg->ssb_table.ssb_mask_list[0].ssb_mask = 0;
|
cfg->ssb_table.ssb_mask_list[0].ssb_mask = 0;
|
||||||
cfg->ssb_table.ssb_mask_list[1].ssb_mask = 0;
|
cfg->ssb_table.ssb_mask_list[1].ssb_mask = 0;
|
||||||
for (i=0; i<4; i++) {
|
for (i=0; i<4; i++) {
|
||||||
cfg->ssb_table.ssb_mask_list[0].ssb_mask += (scc->ssb_PositionsInBurst->choice.longBitmap.buf[i+4]<<i*8);
|
cfg->ssb_table.ssb_mask_list[0].ssb_mask += (scc->ssb_PositionsInBurst->choice.longBitmap.buf[i]<<i*8);
|
||||||
cfg->ssb_table.ssb_mask_list[1].ssb_mask += (scc->ssb_PositionsInBurst->choice.longBitmap.buf[i]<<i*8);
|
cfg->ssb_table.ssb_mask_list[1].ssb_mask += (scc->ssb_PositionsInBurst->choice.longBitmap.buf[i+4]<<i*8);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@@ -433,6 +433,9 @@ int nr_rrc_mac_config_req_ue(
|
|||||||
LOG_I(MAC,"Configuring CRNTI %x\n",mac->crnti);
|
LOG_I(MAC,"Configuring CRNTI %x\n",mac->crnti);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Setup the SSB to Rach Occasions mapping according to the config
|
||||||
|
build_ssb_to_ro_map(mac->scc, mac->phy_config.config_req.cell_config.frame_duplex_type);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
if(mac_cell_group_configP != NULL){
|
if(mac_cell_group_configP != NULL){
|
||||||
if(mac_cell_group_configP->drx_Config != NULL ){
|
if(mac_cell_group_configP->drx_Config != NULL ){
|
||||||
|
|||||||
@@ -63,7 +63,11 @@
|
|||||||
#include "NR_PhysicalCellGroupConfig.h"
|
#include "NR_PhysicalCellGroupConfig.h"
|
||||||
#include "NR_CellGroupConfig.h"
|
#include "NR_CellGroupConfig.h"
|
||||||
#include "NR_ServingCellConfig.h"
|
#include "NR_ServingCellConfig.h"
|
||||||
|
#include "NR_MeasConfig.h"
|
||||||
|
#include "fapi_nr_ue_interface.h"
|
||||||
|
#include "NR_IF_Module.h"
|
||||||
|
#include "PHY/defs_nr_common.h"
|
||||||
|
#include "openair2/LAYER2/NR_MAC_COMMON/nr_mac.h"
|
||||||
|
|
||||||
#define NB_NR_UE_MAC_INST 1
|
#define NB_NR_UE_MAC_INST 1
|
||||||
/*!\brief Maximum number of logical channl group IDs */
|
/*!\brief Maximum number of logical channl group IDs */
|
||||||
@@ -158,6 +162,7 @@ typedef struct {
|
|||||||
NR_CellGroupConfig_t *scg;
|
NR_CellGroupConfig_t *scg;
|
||||||
NR_RACH_ConfigDedicated_t *rach_ConfigDedicated;
|
NR_RACH_ConfigDedicated_t *rach_ConfigDedicated;
|
||||||
int servCellIndex;
|
int servCellIndex;
|
||||||
|
NR_CSI_ReportConfig_t *csirc;
|
||||||
//// MAC config
|
//// MAC config
|
||||||
NR_DRX_Config_t *drx_Config;
|
NR_DRX_Config_t *drx_Config;
|
||||||
NR_SchedulingRequestConfig_t *schedulingRequestConfig;
|
NR_SchedulingRequestConfig_t *schedulingRequestConfig;
|
||||||
|
|||||||
@@ -267,6 +267,7 @@ andom-access to transmit a BSR along with the C-RNTI control element (see 5.1.4
|
|||||||
@param nr_tti_tx slot for PRACH transmission
|
@param nr_tti_tx slot for PRACH transmission
|
||||||
@returns indication to generate PRACH to phy */
|
@returns indication to generate PRACH to phy */
|
||||||
uint8_t nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources,
|
uint8_t nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources,
|
||||||
|
fapi_nr_ul_config_prach_pdu *prach_pdu,
|
||||||
module_id_t mod_id,
|
module_id_t mod_id,
|
||||||
int CC_id,
|
int CC_id,
|
||||||
UE_MODE_t UE_mode,
|
UE_MODE_t UE_mode,
|
||||||
@@ -278,15 +279,14 @@ uint8_t nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources,
|
|||||||
@param module_idP Index of UE instance
|
@param module_idP Index of UE instance
|
||||||
@param CC_id Component Carrier Index
|
@param CC_id Component Carrier Index
|
||||||
@param gNB_index gNB index
|
@param gNB_index gNB index
|
||||||
@param t_id
|
|
||||||
@param rach_ConfigDedicated
|
@param rach_ConfigDedicated
|
||||||
@returns void */
|
@returns void */
|
||||||
void nr_get_prach_resources(module_id_t mod_id,
|
void nr_get_prach_resources(module_id_t mod_id,
|
||||||
int CC_id,
|
int CC_id,
|
||||||
uint8_t gNB_id,
|
uint8_t gNB_id,
|
||||||
uint8_t t_id,
|
|
||||||
uint8_t first_Msg3,
|
uint8_t first_Msg3,
|
||||||
NR_PRACH_RESOURCES_t *prach_resources,
|
NR_PRACH_RESOURCES_t *prach_resources,
|
||||||
|
fapi_nr_ul_config_prach_pdu *prach_pdu,
|
||||||
NR_RACH_ConfigDedicated_t * rach_ConfigDedicated);
|
NR_RACH_ConfigDedicated_t * rach_ConfigDedicated);
|
||||||
|
|
||||||
void nr_Msg1_transmitted(module_id_t mod_id, uint8_t CC_id, frame_t frameP, uint8_t gNB_id);
|
void nr_Msg1_transmitted(module_id_t mod_id, uint8_t CC_id, frame_t frameP, uint8_t gNB_id);
|
||||||
@@ -305,5 +305,8 @@ void get_num_re_dmrs(nfapi_nr_ue_pusch_pdu_t *pusch_pdu,
|
|||||||
uint8_t *nb_dmrs_re_per_rb,
|
uint8_t *nb_dmrs_re_per_rb,
|
||||||
uint16_t *number_dmrs_symbols);
|
uint16_t *number_dmrs_symbols);
|
||||||
|
|
||||||
|
void build_ssb_to_ro_map(NR_ServingCellConfigCommon_t *scc, uint8_t unpaired);
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
/** @}*/
|
/** @}*/
|
||||||
|
|||||||
@@ -75,9 +75,9 @@ void nr_get_RA_window(NR_UE_MAC_INST_t *mac);
|
|||||||
void nr_get_prach_resources(module_id_t mod_id,
|
void nr_get_prach_resources(module_id_t mod_id,
|
||||||
int CC_id,
|
int CC_id,
|
||||||
uint8_t gNB_id,
|
uint8_t gNB_id,
|
||||||
uint8_t t_id,
|
|
||||||
uint8_t first_Msg3,
|
uint8_t first_Msg3,
|
||||||
NR_PRACH_RESOURCES_t *prach_resources,
|
NR_PRACH_RESOURCES_t *prach_resources,
|
||||||
|
fapi_nr_ul_config_prach_pdu *prach_pdu,
|
||||||
NR_RACH_ConfigDedicated_t * rach_ConfigDedicated){
|
NR_RACH_ConfigDedicated_t * rach_ConfigDedicated){
|
||||||
|
|
||||||
NR_UE_MAC_INST_t *mac = get_mac_inst(mod_id);
|
NR_UE_MAC_INST_t *mac = get_mac_inst(mod_id);
|
||||||
@@ -87,8 +87,8 @@ void nr_get_prach_resources(module_id_t mod_id,
|
|||||||
|
|
||||||
// NR_BeamFailureRecoveryConfig_t *beam_failure_recovery_config = &mac->RA_BeamFailureRecoveryConfig; // todo
|
// NR_BeamFailureRecoveryConfig_t *beam_failure_recovery_config = &mac->RA_BeamFailureRecoveryConfig; // todo
|
||||||
|
|
||||||
int messagePowerOffsetGroupB = 0, messageSizeGroupA, PLThreshold, sizeOfRA_PreamblesGroupA = 0, numberOfRA_Preambles, i, deltaPreamble_Msg3 = 0;
|
int messagePowerOffsetGroupB = 0, messageSizeGroupA, PLThreshold, sizeOfRA_PreamblesGroupA = 0, numberOfRA_Preambles, deltaPreamble_Msg3 = 0;
|
||||||
uint8_t noGroupB = 0, s_id, f_id, ul_carrier_id, prach_ConfigIndex, SFN_nbr, Msg3_size;
|
uint8_t noGroupB = 0, s_id, t_id, f_id, ul_carrier_id, Msg3_size;
|
||||||
|
|
||||||
AssertFatal(scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup != NULL, "[UE %d] FATAL nr_rach_ConfigCommon is NULL !!!\n", mod_id);
|
AssertFatal(scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup != NULL, "[UE %d] FATAL nr_rach_ConfigCommon is NULL !!!\n", mod_id);
|
||||||
nr_rach_ConfigCommon = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup;
|
nr_rach_ConfigCommon = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup;
|
||||||
@@ -100,6 +100,7 @@ void nr_get_prach_resources(module_id_t mod_id,
|
|||||||
//////////* UE Random Access Resource Selection *//////////
|
//////////* UE Random Access Resource Selection *//////////
|
||||||
///////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
// todo:
|
// todo:
|
||||||
// - switch initialisation cases
|
// - switch initialisation cases
|
||||||
// -- RA initiated by beam failure recovery operation (subclause 5.17 TS 38.321)
|
// -- RA initiated by beam failure recovery operation (subclause 5.17 TS 38.321)
|
||||||
@@ -129,12 +130,81 @@ void nr_get_prach_resources(module_id_t mod_id,
|
|||||||
|
|
||||||
// rsrp_ThresholdSSB = *nr_rach_ConfigCommon->rsrp_ThresholdSSB;
|
// rsrp_ThresholdSSB = *nr_rach_ConfigCommon->rsrp_ThresholdSSB;
|
||||||
|
|
||||||
|
// Determine the SSB to RACH mapping ratio
|
||||||
|
// =======================================
|
||||||
|
NR_RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR ssb_perRACH_config = nr_rach_ConfigCommon->ssb_perRACH_OccasionAndCB_PreamblesPerSSB->present;
|
||||||
|
boolean_t multiple_ssb_per_ro; // true if more than one or exactly one SSB per RACH occasion, false if more than one RO per SSB
|
||||||
|
uint8_t ssb_rach_ratio; // Nb of SSBs per RACH or RACHs per SSB
|
||||||
|
long cb_preambles_per_ssb; // Nb of preambles per SSB
|
||||||
|
int total_preambles_per_ssb;
|
||||||
|
int starting_preamble_nb = 0;
|
||||||
|
uint8_t ssb_nb_in_ro;
|
||||||
|
|
||||||
|
switch (ssb_perRACH_config){
|
||||||
|
case NR_RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR_oneEighth:
|
||||||
|
multiple_ssb_per_ro = false;
|
||||||
|
ssb_rach_ratio = 8;
|
||||||
|
cb_preambles_per_ssb = 4 * (nr_rach_ConfigCommon->ssb_perRACH_OccasionAndCB_PreamblesPerSSB->choice.oneEighth + 1);
|
||||||
|
break;
|
||||||
|
case NR_RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR_oneFourth:
|
||||||
|
multiple_ssb_per_ro = false;
|
||||||
|
ssb_rach_ratio = 4;
|
||||||
|
cb_preambles_per_ssb = 4 * (nr_rach_ConfigCommon->ssb_perRACH_OccasionAndCB_PreamblesPerSSB->choice.oneFourth + 1);
|
||||||
|
break;
|
||||||
|
case NR_RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR_oneHalf:
|
||||||
|
multiple_ssb_per_ro = false;
|
||||||
|
ssb_rach_ratio = 2;
|
||||||
|
cb_preambles_per_ssb = 4 * (nr_rach_ConfigCommon->ssb_perRACH_OccasionAndCB_PreamblesPerSSB->choice.oneHalf + 1);
|
||||||
|
break;
|
||||||
|
case NR_RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR_one:
|
||||||
|
multiple_ssb_per_ro = true;
|
||||||
|
ssb_rach_ratio = 1;
|
||||||
|
cb_preambles_per_ssb = 4 * (nr_rach_ConfigCommon->ssb_perRACH_OccasionAndCB_PreamblesPerSSB->choice.one + 1);
|
||||||
|
break;
|
||||||
|
case NR_RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR_two:
|
||||||
|
multiple_ssb_per_ro = true;
|
||||||
|
ssb_rach_ratio = 2;
|
||||||
|
cb_preambles_per_ssb = 4 * (nr_rach_ConfigCommon->ssb_perRACH_OccasionAndCB_PreamblesPerSSB->choice.two + 1);
|
||||||
|
break;
|
||||||
|
case NR_RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR_four:
|
||||||
|
multiple_ssb_per_ro = true;
|
||||||
|
ssb_rach_ratio = 4;
|
||||||
|
cb_preambles_per_ssb = nr_rach_ConfigCommon->ssb_perRACH_OccasionAndCB_PreamblesPerSSB->choice.four;
|
||||||
|
break;
|
||||||
|
case NR_RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR_eight:
|
||||||
|
multiple_ssb_per_ro = true;
|
||||||
|
ssb_rach_ratio = 8;
|
||||||
|
cb_preambles_per_ssb = nr_rach_ConfigCommon->ssb_perRACH_OccasionAndCB_PreamblesPerSSB->choice.eight;
|
||||||
|
break;
|
||||||
|
case NR_RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR_sixteen:
|
||||||
|
multiple_ssb_per_ro = true;
|
||||||
|
ssb_rach_ratio = 16;
|
||||||
|
cb_preambles_per_ssb = nr_rach_ConfigCommon->ssb_perRACH_OccasionAndCB_PreamblesPerSSB->choice.sixteen;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
AssertFatal(1 == 0, "Unsupported ssb_perRACH_config %d\n", ssb_perRACH_config);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
Msg3_size = mac->RA_Msg3_size;
|
Msg3_size = mac->RA_Msg3_size;
|
||||||
|
|
||||||
numberOfRA_Preambles = 64;
|
numberOfRA_Preambles = 64;
|
||||||
if(nr_rach_ConfigCommon->totalNumberOfRA_Preambles != NULL)
|
if(nr_rach_ConfigCommon->totalNumberOfRA_Preambles != NULL)
|
||||||
numberOfRA_Preambles = *(nr_rach_ConfigCommon->totalNumberOfRA_Preambles);
|
numberOfRA_Preambles = *(nr_rach_ConfigCommon->totalNumberOfRA_Preambles);
|
||||||
|
|
||||||
|
// Compute the proper Preamble selection params according to the selected SSB and the ssb_perRACH_OccasionAndCB_PreamblesPerSSB configuration
|
||||||
|
if ((true == multiple_ssb_per_ro) &&
|
||||||
|
(ssb_rach_ratio > 1)) {
|
||||||
|
total_preambles_per_ssb = numberOfRA_Preambles / ssb_rach_ratio;
|
||||||
|
|
||||||
|
ssb_nb_in_ro = prach_pdu->ssb_nb_in_ro;
|
||||||
|
starting_preamble_nb = total_preambles_per_ssb * ssb_nb_in_ro;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
total_preambles_per_ssb = numberOfRA_Preambles;
|
||||||
|
starting_preamble_nb = 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (!nr_rach_ConfigCommon->groupBconfigured) {
|
if (!nr_rach_ConfigCommon->groupBconfigured) {
|
||||||
noGroupB = 1;
|
noGroupB = 1;
|
||||||
} else {
|
} else {
|
||||||
@@ -220,29 +290,30 @@ void nr_get_prach_resources(module_id_t mod_id,
|
|||||||
if (first_Msg3 == 1) {
|
if (first_Msg3 == 1) {
|
||||||
if (noGroupB == 1) {
|
if (noGroupB == 1) {
|
||||||
// use Group A preamble
|
// use Group A preamble
|
||||||
prach_resources->ra_PreambleIndex = (taus()) % numberOfRA_Preambles;
|
prach_resources->ra_PreambleIndex = starting_preamble_nb + ((taus()) % cb_preambles_per_ssb);
|
||||||
mac->RA_usedGroupA = 1;
|
mac->RA_usedGroupA = 1;
|
||||||
} else if ((Msg3_size < messageSizeGroupA) && (get_nr_PL(mod_id, CC_id, gNB_id) > PLThreshold)) {
|
} else if ((Msg3_size < messageSizeGroupA) && (get_nr_PL(mod_id, CC_id, gNB_id) > PLThreshold)) {
|
||||||
// Group B is configured and RA preamble Group A is used
|
// Group B is configured and RA preamble Group A is used
|
||||||
// - todo add condition on CCCH_sdu_size for initiation by CCCH
|
// - todo add condition on CCCH_sdu_size for initiation by CCCH
|
||||||
prach_resources->ra_PreambleIndex = (taus()) % sizeOfRA_PreamblesGroupA;
|
prach_resources->ra_PreambleIndex = starting_preamble_nb + ((taus()) % sizeOfRA_PreamblesGroupA);
|
||||||
mac->RA_usedGroupA = 1;
|
mac->RA_usedGroupA = 1;
|
||||||
} else {
|
} else {
|
||||||
// Group B preamble is configured and used
|
// Group B preamble is configured and used
|
||||||
// the first sizeOfRA_PreamblesGroupA RA preambles belong to RA Preambles Group A
|
// the first sizeOfRA_PreamblesGroupA RA preambles belong to RA Preambles Group A
|
||||||
// the remaining belong to RA Preambles Group B
|
// the remaining belong to RA Preambles Group B
|
||||||
prach_resources->ra_PreambleIndex = sizeOfRA_PreamblesGroupA + (taus()) % (numberOfRA_Preambles - sizeOfRA_PreamblesGroupA);
|
prach_resources->ra_PreambleIndex = starting_preamble_nb + sizeOfRA_PreamblesGroupA + ((taus()) % (cb_preambles_per_ssb - sizeOfRA_PreamblesGroupA));
|
||||||
mac->RA_usedGroupA = 0;
|
mac->RA_usedGroupA = 0;
|
||||||
}
|
}
|
||||||
} else { // Msg3 is being retransmitted
|
} else { // Msg3 is being retransmitted
|
||||||
if (mac->RA_usedGroupA == 1 && noGroupB == 1) {
|
if (mac->RA_usedGroupA == 1 && noGroupB == 1) {
|
||||||
prach_resources->ra_PreambleIndex = (taus()) % numberOfRA_Preambles;
|
prach_resources->ra_PreambleIndex = starting_preamble_nb + ((taus()) % cb_preambles_per_ssb);
|
||||||
} else if (mac->RA_usedGroupA == 1 && noGroupB == 0){
|
} else if (mac->RA_usedGroupA == 1 && noGroupB == 0){
|
||||||
prach_resources->ra_PreambleIndex = (taus()) % sizeOfRA_PreamblesGroupA;
|
prach_resources->ra_PreambleIndex = starting_preamble_nb + ((taus()) % sizeOfRA_PreamblesGroupA);
|
||||||
} else {
|
} else {
|
||||||
prach_resources->ra_PreambleIndex = sizeOfRA_PreamblesGroupA + (taus()) % (numberOfRA_Preambles - sizeOfRA_PreamblesGroupA);
|
prach_resources->ra_PreambleIndex = starting_preamble_nb + sizeOfRA_PreamblesGroupA + ((taus()) % (cb_preambles_per_ssb - sizeOfRA_PreamblesGroupA));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_D(MAC, "[RAPROC] - Selected RA preamble index %d for contention-based random access procedure... \n", prach_resources->ra_PreambleIndex);
|
LOG_D(MAC, "[RAPROC] - Selected RA preamble index %d for contention-based random access procedure... \n", prach_resources->ra_PreambleIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -268,27 +339,16 @@ void nr_get_prach_resources(module_id_t mod_id,
|
|||||||
// 1) this does not apply to contention-free RA Preamble for beam failure recovery request
|
// 1) this does not apply to contention-free RA Preamble for beam failure recovery request
|
||||||
// 2) getting star_symb, SFN_nbr from table 6.3.3.2-3 (TDD and FR1 scenario)
|
// 2) getting star_symb, SFN_nbr from table 6.3.3.2-3 (TDD and FR1 scenario)
|
||||||
|
|
||||||
prach_ConfigIndex = rach_ConfigGeneric->prach_ConfigurationIndex;
|
|
||||||
|
|
||||||
// ra_RNTI computation
|
// ra_RNTI computation
|
||||||
// - todo: this is for TDD FR1 only
|
|
||||||
// - ul_carrier_id: UL carrier used for RA preamble transmission, hardcoded for NUL carrier
|
// - ul_carrier_id: UL carrier used for RA preamble transmission, hardcoded for NUL carrier
|
||||||
// - f_id: index of the PRACH occasion in the frequency domain
|
// - f_id: index of the PRACH occasion in the frequency domain
|
||||||
// - s_id is starting symbol of the PRACH occasion [0...14]
|
// - s_id is starting symbol of the PRACH occasion [0...14]
|
||||||
// - t_id is the first slot of the PRACH occasion in a system frame [0...80]
|
// - t_id is the first slot of the PRACH occasion in a system frame [0...80]
|
||||||
|
|
||||||
ul_carrier_id = 0; // NUL
|
ul_carrier_id = 0; // NUL
|
||||||
f_id = rach_ConfigGeneric->msg1_FrequencyStart;
|
f_id = prach_pdu->num_ra;
|
||||||
SFN_nbr = table_6_3_3_2_3_prachConfig_Index[prach_ConfigIndex][4];
|
t_id = prach_pdu->prach_slot;
|
||||||
s_id = table_6_3_3_2_3_prachConfig_Index[prach_ConfigIndex][5];
|
s_id = prach_pdu->prach_start_symbol;
|
||||||
|
|
||||||
// Pick the first slot of the PRACH occasion in a system frame
|
|
||||||
for (i = 0; i < 10; i++){
|
|
||||||
if (((SFN_nbr & (1 << i)) >> i) == 1){
|
|
||||||
t_id = 2*i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
prach_resources->ra_RNTI = 1 + s_id + 14 * t_id + 1120 * f_id + 8960 * ul_carrier_id;
|
prach_resources->ra_RNTI = 1 + s_id + 14 * t_id + 1120 * f_id + 8960 * ul_carrier_id;
|
||||||
mac->ra_rnti = prach_resources->ra_RNTI;
|
mac->ra_rnti = prach_resources->ra_RNTI;
|
||||||
|
|
||||||
@@ -335,6 +395,7 @@ void nr_Msg3_transmitted(module_id_t mod_id, uint8_t CC_id, frame_t frameP, uint
|
|||||||
// - add the backoff condition here if we have it from a previous RA reponse which failed (i.e. backoff indicator)
|
// - add the backoff condition here if we have it from a previous RA reponse which failed (i.e. backoff indicator)
|
||||||
|
|
||||||
uint8_t nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources,
|
uint8_t nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources,
|
||||||
|
fapi_nr_ul_config_prach_pdu *prach_pdu,
|
||||||
module_id_t mod_id,
|
module_id_t mod_id,
|
||||||
int CC_id,
|
int CC_id,
|
||||||
UE_MODE_t UE_mode,
|
UE_MODE_t UE_mode,
|
||||||
@@ -363,7 +424,7 @@ uint8_t nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources,
|
|||||||
|
|
||||||
AssertFatal(CC_id == 0,"Transmission on secondary CCs is not supported yet\n");
|
AssertFatal(CC_id == 0,"Transmission on secondary CCs is not supported yet\n");
|
||||||
|
|
||||||
if (UE_mode < PUSCH && prach_resources->init_msg1) {
|
if (prach_resources->init_msg1) {
|
||||||
|
|
||||||
LOG_D(MAC, "nr_ue_get_rach, RA_active value: %d", mac->RA_active);
|
LOG_D(MAC, "nr_ue_get_rach, RA_active value: %d", mac->RA_active);
|
||||||
|
|
||||||
@@ -449,7 +510,7 @@ uint8_t nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources,
|
|||||||
|
|
||||||
// Fill in preamble and PRACH resources
|
// Fill in preamble and PRACH resources
|
||||||
if (mac->generate_nr_prach == 1)
|
if (mac->generate_nr_prach == 1)
|
||||||
nr_get_prach_resources(mod_id, CC_id, gNB_id, nr_tti_tx, 1, prach_resources, rach_ConfigDedicated);
|
nr_get_prach_resources(mod_id, CC_id, gNB_id, nr_tti_tx, prach_resources, prach_pdu, rach_ConfigDedicated);
|
||||||
|
|
||||||
offset = nr_generate_ulsch_pdu((uint8_t *) mac_sdus, // sdus buffer
|
offset = nr_generate_ulsch_pdu((uint8_t *) mac_sdus, // sdus buffer
|
||||||
(uint8_t *) payload, // UL MAC pdu pointer
|
(uint8_t *) payload, // UL MAC pdu pointer
|
||||||
@@ -576,7 +637,7 @@ uint8_t nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources,
|
|||||||
|
|
||||||
// Fill in preamble and PRACH resources
|
// Fill in preamble and PRACH resources
|
||||||
if (mac->generate_nr_prach == 1)
|
if (mac->generate_nr_prach == 1)
|
||||||
nr_get_prach_resources(mod_id, CC_id, gNB_id, nr_tti_tx, 0, prach_resources, rach_ConfigDedicated);
|
nr_get_prach_resources(mod_id, CC_id, gNB_id, nr_tti_tx, prach_resources, prach_pdu, rach_ConfigDedicated);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
@@ -590,7 +651,7 @@ uint8_t nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources,
|
|||||||
|
|
||||||
// Fill in preamble and PRACH resources
|
// Fill in preamble and PRACH resources
|
||||||
if (mac->generate_nr_prach == 1)
|
if (mac->generate_nr_prach == 1)
|
||||||
nr_get_prach_resources(mod_id, CC_id, gNB_id, nr_tti_tx, 0, prach_resources, rach_ConfigDedicated);
|
nr_get_prach_resources(mod_id, CC_id, gNB_id, nr_tti_tx, prach_resources, prach_pdu, rach_ConfigDedicated);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -274,15 +274,22 @@ uint16_t nr_ue_process_rar(module_id_t mod_id,
|
|||||||
if (ue_mac->RA_RAPID_found) {
|
if (ue_mac->RA_RAPID_found) {
|
||||||
|
|
||||||
uint8_t freq_hopping, mcs, Msg3_t_alloc, Msg3_f_alloc;
|
uint8_t freq_hopping, mcs, Msg3_t_alloc, Msg3_f_alloc;
|
||||||
unsigned char tpc_command, csi_req;
|
unsigned char tpc_command;
|
||||||
|
#ifdef DEBUG_RAR
|
||||||
|
unsigned char csi_req;
|
||||||
|
#endif
|
||||||
|
|
||||||
// TC-RNTI
|
// TC-RNTI
|
||||||
*t_crnti = rar->TCRNTI_2 + (rar->TCRNTI_1 << 8);
|
*t_crnti = rar->TCRNTI_2 + (rar->TCRNTI_1 << 8);
|
||||||
ue_mac->t_crnti = *t_crnti;
|
ue_mac->t_crnti = *t_crnti;
|
||||||
// TA command
|
// TA command
|
||||||
ta_command = rar->TA2 + (rar->TA1 << 5);
|
ta_command = rar->TA2 + (rar->TA1 << 5);
|
||||||
|
|
||||||
|
#ifdef DEBUG_RAR
|
||||||
// CSI
|
// CSI
|
||||||
csi_req = (unsigned char) (rar->UL_GRANT_4 & 0x01);
|
csi_req = (unsigned char) (rar->UL_GRANT_4 & 0x01);
|
||||||
|
#endif
|
||||||
|
|
||||||
// TPC
|
// TPC
|
||||||
tpc_command = (unsigned char) ((rar->UL_GRANT_4 >> 1) & 0x07);
|
tpc_command = (unsigned char) ((rar->UL_GRANT_4 >> 1) & 0x07);
|
||||||
switch (tpc_command){
|
switch (tpc_command){
|
||||||
|
|||||||
@@ -128,7 +128,7 @@ void config_common(int Mod_idP, int pdsch_AntennaPorts, NR_ServingCellConfigComm
|
|||||||
uint16_t band;
|
uint16_t band;
|
||||||
int32_t offset;
|
int32_t offset;
|
||||||
|
|
||||||
get_band((cfg->carrier_config.dl_frequency.value)*1000,
|
get_band((uint64_t)(cfg->carrier_config.dl_frequency.value)*1000,
|
||||||
&band,
|
&band,
|
||||||
&offset,
|
&offset,
|
||||||
&frame_type);
|
&frame_type);
|
||||||
@@ -315,6 +315,7 @@ void config_common(int Mod_idP, int pdsch_AntennaPorts, NR_ServingCellConfigComm
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int rrc_mac_config_req_gNB(module_id_t Mod_idP,
|
int rrc_mac_config_req_gNB(module_id_t Mod_idP,
|
||||||
int ssb_SubcarrierOffset,
|
int ssb_SubcarrierOffset,
|
||||||
int pdsch_AntennaPorts,
|
int pdsch_AntennaPorts,
|
||||||
@@ -367,6 +368,7 @@ int rrc_mac_config_req_gNB(module_id_t Mod_idP,
|
|||||||
if (add_ue == 1 && get_softmodem_params()->phy_test) {
|
if (add_ue == 1 && get_softmodem_params()->phy_test) {
|
||||||
const int UE_id = add_new_nr_ue(Mod_idP,rnti);
|
const int UE_id = add_new_nr_ue(Mod_idP,rnti);
|
||||||
UE_info->secondaryCellGroup[UE_id] = secondaryCellGroup;
|
UE_info->secondaryCellGroup[UE_id] = secondaryCellGroup;
|
||||||
|
compute_csi_bitlen (secondaryCellGroup, UE_info, UE_id);
|
||||||
struct NR_ServingCellConfig__downlinkBWP_ToAddModList *bwpList =
|
struct NR_ServingCellConfig__downlinkBWP_ToAddModList *bwpList =
|
||||||
secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList;
|
secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList;
|
||||||
AssertFatal(bwpList->list.count == 1,
|
AssertFatal(bwpList->list.count == 1,
|
||||||
|
|||||||
@@ -344,9 +344,8 @@ void nr_schedule_pucch(int Mod_idP,
|
|||||||
frame_t frameP,
|
frame_t frameP,
|
||||||
sub_frame_t slotP) {
|
sub_frame_t slotP) {
|
||||||
|
|
||||||
uint16_t O_uci;
|
uint16_t O_csi, O_ack, O_uci;
|
||||||
uint16_t O_ack;
|
uint8_t O_sr = 0; // no SR in PUCCH implemented for now
|
||||||
uint8_t SR_flag = 0; // no SR in PUCCH implemented for now
|
|
||||||
NR_ServingCellConfigCommon_t *scc = RC.nrmac[Mod_idP]->common_channels->ServingCellConfigCommon;
|
NR_ServingCellConfigCommon_t *scc = RC.nrmac[Mod_idP]->common_channels->ServingCellConfigCommon;
|
||||||
NR_UE_info_t *UE_info = &RC.nrmac[Mod_idP]->UE_info;
|
NR_UE_info_t *UE_info = &RC.nrmac[Mod_idP]->UE_info;
|
||||||
AssertFatal(UE_info->active[UE_id],"Cannot find UE_id %d is not active\n",UE_id);
|
AssertFatal(UE_info->active[UE_id],"Cannot find UE_id %d is not active\n",UE_id);
|
||||||
@@ -359,31 +358,36 @@ void nr_schedule_pucch(int Mod_idP,
|
|||||||
NR_sched_pucch *curr_pucch;
|
NR_sched_pucch *curr_pucch;
|
||||||
|
|
||||||
for (int k=0; k<nr_ulmix_slots; k++) {
|
for (int k=0; k<nr_ulmix_slots; k++) {
|
||||||
curr_pucch = &UE_info->UE_sched_ctrl[UE_id].sched_pucch[k];
|
for (int l=0; l<2; l++) {
|
||||||
if ((curr_pucch->dai_c > 0) && (frameP == curr_pucch->frame) && (slotP == curr_pucch->ul_slot)) {
|
curr_pucch = &UE_info->UE_sched_ctrl[UE_id].sched_pucch[k][l];
|
||||||
UL_tti_req->SFN = curr_pucch->frame;
|
|
||||||
UL_tti_req->Slot = curr_pucch->ul_slot;
|
|
||||||
UL_tti_req->pdus_list[UL_tti_req->n_pdus].pdu_type = NFAPI_NR_UL_CONFIG_PUCCH_PDU_TYPE;
|
|
||||||
UL_tti_req->pdus_list[UL_tti_req->n_pdus].pdu_size = sizeof(nfapi_nr_pucch_pdu_t);
|
|
||||||
nfapi_nr_pucch_pdu_t *pucch_pdu = &UL_tti_req->pdus_list[UL_tti_req->n_pdus].pucch_pdu;
|
|
||||||
memset(pucch_pdu,0,sizeof(nfapi_nr_pucch_pdu_t));
|
|
||||||
UL_tti_req->n_pdus+=1;
|
|
||||||
O_ack = curr_pucch->dai_c;
|
O_ack = curr_pucch->dai_c;
|
||||||
O_uci = O_ack; // for now we are just sending acknacks in pucch
|
O_csi = curr_pucch->csi_bits;
|
||||||
|
O_uci = O_ack + O_csi + O_sr;
|
||||||
|
if ((O_uci>0) && (frameP == curr_pucch->frame) && (slotP == curr_pucch->ul_slot)) {
|
||||||
|
UL_tti_req->SFN = curr_pucch->frame;
|
||||||
|
UL_tti_req->Slot = curr_pucch->ul_slot;
|
||||||
|
UL_tti_req->pdus_list[UL_tti_req->n_pdus].pdu_type = NFAPI_NR_UL_CONFIG_PUCCH_PDU_TYPE;
|
||||||
|
UL_tti_req->pdus_list[UL_tti_req->n_pdus].pdu_size = sizeof(nfapi_nr_pucch_pdu_t);
|
||||||
|
nfapi_nr_pucch_pdu_t *pucch_pdu = &UL_tti_req->pdus_list[UL_tti_req->n_pdus].pucch_pdu;
|
||||||
|
memset(pucch_pdu,0,sizeof(nfapi_nr_pucch_pdu_t));
|
||||||
|
UL_tti_req->n_pdus+=1;
|
||||||
|
|
||||||
LOG_D(MAC, "Scheduling pucch reception for frame %d slot %d\n", frameP, slotP);
|
LOG_I(MAC,"Scheduling pucch reception for frame %d slot %d with (%d, %d, %d) (SR ACK, CSI) bits\n",
|
||||||
|
frameP,slotP,O_sr,O_ack,curr_pucch->csi_bits);
|
||||||
|
|
||||||
nr_configure_pucch(pucch_pdu,
|
nr_configure_pucch(pucch_pdu,
|
||||||
scc,
|
scc,
|
||||||
ubwp,
|
ubwp,
|
||||||
curr_pucch->resource_indicator,
|
UE_info->rnti[UE_id],
|
||||||
O_uci,
|
curr_pucch->resource_indicator,
|
||||||
O_ack,
|
O_csi,
|
||||||
SR_flag);
|
O_ack,
|
||||||
|
O_sr);
|
||||||
|
|
||||||
memset((void *) &UE_info->UE_sched_ctrl[UE_id].sched_pucch[k],
|
memset((void *) &UE_info->UE_sched_ctrl[UE_id].sched_pucch[k][l],
|
||||||
0,
|
0,
|
||||||
sizeof(NR_sched_pucch));
|
sizeof(NR_sched_pucch));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -395,6 +399,7 @@ bool is_xlsch_in_slot(uint64_t bitmap, sub_frame_t slot) {
|
|||||||
void gNB_dlsch_ulsch_scheduler(module_id_t module_idP,
|
void gNB_dlsch_ulsch_scheduler(module_id_t module_idP,
|
||||||
frame_t frame,
|
frame_t frame,
|
||||||
sub_frame_t slot){
|
sub_frame_t slot){
|
||||||
|
|
||||||
protocol_ctxt_t ctxt;
|
protocol_ctxt_t ctxt;
|
||||||
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, module_idP, ENB_FLAG_YES, NOT_A_RNTI, frame, slot,module_idP);
|
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, module_idP, ENB_FLAG_YES, NOT_A_RNTI, frame, slot,module_idP);
|
||||||
|
|
||||||
@@ -411,19 +416,6 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP,
|
|||||||
const int num_slots_per_tdd = slots_per_frame[*scc->ssbSubcarrierSpacing] >> (7 - tdd_pattern->dl_UL_TransmissionPeriodicity);
|
const int num_slots_per_tdd = slots_per_frame[*scc->ssbSubcarrierSpacing] >> (7 - tdd_pattern->dl_UL_TransmissionPeriodicity);
|
||||||
const int nr_ulmix_slots = tdd_pattern->nrofUplinkSlots + (tdd_pattern->nrofUplinkSymbols!=0);
|
const int nr_ulmix_slots = tdd_pattern->nrofUplinkSlots + (tdd_pattern->nrofUplinkSymbols!=0);
|
||||||
|
|
||||||
if (slot == 0 && UE_info->active[UE_id]) {
|
|
||||||
for (int k=0; k<nr_ulmix_slots; k++) {
|
|
||||||
/* Seems to be covered 384? */
|
|
||||||
/*memset((void *) &UE_info->UE_sched_ctrl[UE_id].sched_pucch[k],
|
|
||||||
0,
|
|
||||||
sizeof(NR_sched_pucch));*/
|
|
||||||
/* Seems to be covered in line 335? */
|
|
||||||
/*memset((void *) &UE_info->UE_sched_ctrl[UE_id].sched_pusch[k],
|
|
||||||
0,
|
|
||||||
sizeof(NR_sched_pusch));*/
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
start_meas(&RC.nrmac[module_idP]->eNB_scheduler);
|
start_meas(&RC.nrmac[module_idP]->eNB_scheduler);
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_gNB_DLSCH_ULSCH_SCHEDULER,VCD_FUNCTION_IN);
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_gNB_DLSCH_ULSCH_SCHEDULER,VCD_FUNCTION_IN);
|
||||||
|
|
||||||
@@ -466,8 +458,9 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP,
|
|||||||
// This schedule SR
|
// This schedule SR
|
||||||
// TODO
|
// TODO
|
||||||
|
|
||||||
// This schedule CSI
|
// This schedule CSI measurement reporting
|
||||||
// TODO
|
if (UE_info->active[UE_id])
|
||||||
|
nr_csi_meas_reporting(module_idP, UE_id, frame, slot, num_slots_per_tdd, nr_ulmix_slots, slots_per_frame[*scc->ssbSubcarrierSpacing]);
|
||||||
|
|
||||||
// This schedule RA procedure if not in phy_test mode
|
// This schedule RA procedure if not in phy_test mode
|
||||||
// Otherwise already consider 5G already connected
|
// Otherwise already consider 5G already connected
|
||||||
|
|||||||
@@ -921,6 +921,10 @@ void nr_generate_Msg2(module_id_t module_idP,
|
|||||||
nr_mac->TX_req[CC_id].Slot = slotP;
|
nr_mac->TX_req[CC_id].Slot = slotP;
|
||||||
memcpy((void*)&tx_req->TLVs[0].value.direct[0], (void*)&cc[CC_id].RAR_pdu.payload[0], tx_req->TLVs[0].length);
|
memcpy((void*)&tx_req->TLVs[0].value.direct[0], (void*)&cc[CC_id].RAR_pdu.payload[0], tx_req->TLVs[0].length);
|
||||||
|
|
||||||
|
T(T_GNB_MAC_DL_RAR_PDU_WITH_DATA, T_INT(module_idP), T_INT(CC_id),
|
||||||
|
T_INT(RA_rnti), T_INT(frameP), T_INT(slotP), T_INT(0) /* harq pid, meaningful? */,
|
||||||
|
T_BUFFER(&cc[CC_id].RAR_pdu.payload[0], tx_req->TLVs[0].length));
|
||||||
|
|
||||||
/* mark the corresponding RBs as used */
|
/* mark the corresponding RBs as used */
|
||||||
uint8_t *vrb_map = cc[CC_id].vrb_map;
|
uint8_t *vrb_map = cc[CC_id].vrb_map;
|
||||||
for (int rb = 0; rb < pdsch_pdu_rel15->rbSize; rb++)
|
for (int rb = 0; rb < pdsch_pdu_rel15->rbSize; rb++)
|
||||||
|
|||||||
@@ -343,68 +343,98 @@ int nr_generate_dlsch_pdu(module_id_t module_idP,
|
|||||||
return offset;
|
return offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
void handle_nr_uci(NR_UL_IND_t *UL_info, NR_UE_sched_ctrl_t *sched_ctrl, NR_mac_stats_t *stats, int target_snrx10) {
|
void nr_rx_acknack(nfapi_nr_uci_pusch_pdu_t *uci_pusch,
|
||||||
|
nfapi_nr_uci_pucch_pdu_format_0_1_t *uci_01,
|
||||||
|
nfapi_nr_uci_pucch_pdu_format_2_3_4_t *uci_234,
|
||||||
|
NR_UL_IND_t *UL_info, NR_UE_sched_ctrl_t *sched_ctrl, NR_mac_stats_t *stats) {
|
||||||
|
|
||||||
// TODO
|
// TODO
|
||||||
int max_harq_rounds = 4; // TODO define macro
|
int max_harq_rounds = 4; // TODO define macro
|
||||||
int num_ucis = UL_info->uci_ind.num_ucis;
|
|
||||||
nfapi_nr_uci_t *uci_list = UL_info->uci_ind.uci_list;
|
|
||||||
|
|
||||||
for (int i = 0; i < num_ucis; i++) {
|
if (uci_01 != NULL) {
|
||||||
switch (uci_list[i].pdu_type) {
|
// handle harq
|
||||||
case NFAPI_NR_UCI_PDCCH_PDU_TYPE: break;
|
int harq_idx_s = 0;
|
||||||
|
|
||||||
case NFAPI_NR_UCI_FORMAT_0_1_PDU_TYPE: {
|
// iterate over received harq bits
|
||||||
//if (get_softmodem_params()->phy_test == 0) {
|
for (int harq_bit = 0; harq_bit < uci_01->harq->num_harq; harq_bit++) {
|
||||||
nfapi_nr_uci_pucch_pdu_format_0_1_t *uci_pdu = &uci_list[i].pucch_pdu_format_0_1;
|
// search for the right harq process
|
||||||
// handle harq
|
for (int harq_idx = harq_idx_s; harq_idx < NR_MAX_NB_HARQ_PROCESSES; harq_idx++) {
|
||||||
int harq_idx_s = 0;
|
// if the gNB received ack with a good confidence
|
||||||
// tpc (power control)
|
if ((UL_info->slot-1) == sched_ctrl->harq_processes[harq_idx].feedback_slot) {
|
||||||
sched_ctrl->tpc1 = nr_get_tpc(target_snrx10,uci_pdu->ul_cqi,30);
|
if ((uci_01->harq->harq_list[harq_bit].harq_value == 1) &&
|
||||||
// iterate over received harq bits
|
(uci_01->harq->harq_confidence_level == 0)) {
|
||||||
for (int harq_bit = 0; harq_bit < uci_pdu->harq->num_harq; harq_bit++) {
|
// toggle NDI and reset round
|
||||||
// search for the right harq process
|
sched_ctrl->harq_processes[harq_idx].ndi ^= 1;
|
||||||
for (int harq_idx = harq_idx_s; harq_idx < NR_MAX_NB_HARQ_PROCESSES; harq_idx++) {
|
sched_ctrl->harq_processes[harq_idx].round = 0;
|
||||||
// if the gNB received ack with a good confidence
|
|
||||||
if ((UL_info->slot-1) == sched_ctrl->harq_processes[harq_idx].feedback_slot) {
|
|
||||||
if ((uci_pdu->harq->harq_list[harq_bit].harq_value == 1) &&
|
|
||||||
(uci_pdu->harq->harq_confidence_level == 0)) {
|
|
||||||
// toggle NDI and reset round
|
|
||||||
sched_ctrl->harq_processes[harq_idx].ndi ^= 1;
|
|
||||||
sched_ctrl->harq_processes[harq_idx].round = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
sched_ctrl->harq_processes[harq_idx].round++;
|
|
||||||
sched_ctrl->harq_processes[harq_idx].is_waiting = 0;
|
|
||||||
harq_idx_s = harq_idx + 1;
|
|
||||||
// if the max harq rounds was reached
|
|
||||||
if (sched_ctrl->harq_processes[harq_idx].round == max_harq_rounds) {
|
|
||||||
sched_ctrl->harq_processes[harq_idx].ndi ^= 1;
|
|
||||||
sched_ctrl->harq_processes[harq_idx].round = 0;
|
|
||||||
stats->dlsch_errors++;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
// if feedback slot processing is aborted
|
|
||||||
else if (((UL_info->slot-1) > sched_ctrl->harq_processes[harq_idx].feedback_slot) &&
|
|
||||||
(sched_ctrl->harq_processes[harq_idx].is_waiting)) {
|
|
||||||
sched_ctrl->harq_processes[harq_idx].round++;
|
|
||||||
if (sched_ctrl->harq_processes[harq_idx].round == max_harq_rounds) {
|
|
||||||
sched_ctrl->harq_processes[harq_idx].ndi ^= 1;
|
|
||||||
sched_ctrl->harq_processes[harq_idx].round = 0;
|
|
||||||
}
|
|
||||||
sched_ctrl->harq_processes[harq_idx].is_waiting = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
//}
|
else
|
||||||
break;
|
sched_ctrl->harq_processes[harq_idx].round++;
|
||||||
|
sched_ctrl->harq_processes[harq_idx].is_waiting = 0;
|
||||||
|
harq_idx_s = harq_idx + 1;
|
||||||
|
// if the max harq rounds was reached
|
||||||
|
if (sched_ctrl->harq_processes[harq_idx].round == max_harq_rounds) {
|
||||||
|
sched_ctrl->harq_processes[harq_idx].ndi ^= 1;
|
||||||
|
sched_ctrl->harq_processes[harq_idx].round = 0;
|
||||||
|
stats->dlsch_errors++;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// if feedback slot processing is aborted
|
||||||
|
else if (((UL_info->slot-1) > sched_ctrl->harq_processes[harq_idx].feedback_slot) &&
|
||||||
|
(sched_ctrl->harq_processes[harq_idx].is_waiting)) {
|
||||||
|
sched_ctrl->harq_processes[harq_idx].round++;
|
||||||
|
if (sched_ctrl->harq_processes[harq_idx].round == max_harq_rounds) {
|
||||||
|
sched_ctrl->harq_processes[harq_idx].ndi ^= 1;
|
||||||
|
sched_ctrl->harq_processes[harq_idx].round = 0;
|
||||||
|
}
|
||||||
|
sched_ctrl->harq_processes[harq_idx].is_waiting = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
case NFAPI_NR_UCI_FORMAT_2_3_4_PDU_TYPE: break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
UL_info->uci_ind.num_ucis = 0;
|
|
||||||
|
if (uci_234 != NULL) {
|
||||||
|
int harq_idx_s = 0;
|
||||||
|
int acknack;
|
||||||
|
|
||||||
|
// iterate over received harq bits
|
||||||
|
for (int harq_bit = 0; harq_bit < uci_234->harq.harq_bit_len; harq_bit++) {
|
||||||
|
acknack = ((uci_234->harq.harq_payload[harq_bit>>3])>>harq_bit)&0x01;
|
||||||
|
for (int harq_idx = harq_idx_s; harq_idx < NR_MAX_NB_HARQ_PROCESSES-1; harq_idx++) {
|
||||||
|
// if the gNB received ack with a good confidence or if the max harq rounds was reached
|
||||||
|
if ((UL_info->slot-1) == sched_ctrl->harq_processes[harq_idx].feedback_slot) {
|
||||||
|
// TODO add some confidence level for when there is no CRC
|
||||||
|
if ((uci_234->harq.harq_crc != 1) && acknack) {
|
||||||
|
// toggle NDI and reset round
|
||||||
|
sched_ctrl->harq_processes[harq_idx].ndi ^= 1;
|
||||||
|
sched_ctrl->harq_processes[harq_idx].round = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
sched_ctrl->harq_processes[harq_idx].round++;
|
||||||
|
sched_ctrl->harq_processes[harq_idx].is_waiting = 0;
|
||||||
|
harq_idx_s = harq_idx + 1;
|
||||||
|
// if the max harq rounds was reached
|
||||||
|
if (sched_ctrl->harq_processes[harq_idx].round == max_harq_rounds) {
|
||||||
|
sched_ctrl->harq_processes[harq_idx].ndi ^= 1;
|
||||||
|
sched_ctrl->harq_processes[harq_idx].round = 0;
|
||||||
|
stats->dlsch_errors++;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// if feedback slot processing is aborted
|
||||||
|
else if (((UL_info->slot-1) > sched_ctrl->harq_processes[harq_idx].feedback_slot) &&
|
||||||
|
(sched_ctrl->harq_processes[harq_idx].is_waiting)) {
|
||||||
|
sched_ctrl->harq_processes[harq_idx].round++;
|
||||||
|
if (sched_ctrl->harq_processes[harq_idx].round == max_harq_rounds) {
|
||||||
|
sched_ctrl->harq_processes[harq_idx].ndi ^= 1;
|
||||||
|
sched_ctrl->harq_processes[harq_idx].round = 0;
|
||||||
|
}
|
||||||
|
sched_ctrl->harq_processes[harq_idx].is_waiting = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int getNrOfSymbols(NR_BWP_Downlink_t *bwp, int tda) {
|
int getNrOfSymbols(NR_BWP_Downlink_t *bwp, int tda) {
|
||||||
@@ -505,8 +535,14 @@ void nr_simple_dlsch_preprocessor(module_id_t module_id,
|
|||||||
UE_info->num_pdcch_cand[UE_id][cid]++;
|
UE_info->num_pdcch_cand[UE_id][cid]++;
|
||||||
|
|
||||||
/* Find PUCCH occasion */
|
/* Find PUCCH occasion */
|
||||||
nr_update_pucch_scheduling(
|
nr_acknack_scheduling(module_id,
|
||||||
module_id, UE_id, frame, slot, num_slots_per_tdd, &sched_ctrl->pucch_sched_idx);
|
UE_id,
|
||||||
|
frame,
|
||||||
|
slot,
|
||||||
|
num_slots_per_tdd,
|
||||||
|
&sched_ctrl->pucch_sched_idx,
|
||||||
|
&sched_ctrl->pucch_occ_idx);
|
||||||
|
|
||||||
AssertFatal(sched_ctrl->pucch_sched_idx >= 0, "no uplink slot for PUCCH found!\n");
|
AssertFatal(sched_ctrl->pucch_sched_idx >= 0, "no uplink slot for PUCCH found!\n");
|
||||||
|
|
||||||
uint8_t *vrb_map = RC.nrmac[module_id]->common_channels[CC_id].vrb_map;
|
uint8_t *vrb_map = RC.nrmac[module_id]->common_channels[CC_id].vrb_map;
|
||||||
@@ -634,7 +670,7 @@ void nr_schedule_ue_spec(module_id_t module_id,
|
|||||||
|
|
||||||
const int current_harq_pid = sched_ctrl->current_harq_pid;
|
const int current_harq_pid = sched_ctrl->current_harq_pid;
|
||||||
NR_UE_harq_t *harq = &sched_ctrl->harq_processes[current_harq_pid];
|
NR_UE_harq_t *harq = &sched_ctrl->harq_processes[current_harq_pid];
|
||||||
NR_sched_pucch *pucch = &sched_ctrl->sched_pucch[sched_ctrl->pucch_sched_idx];
|
NR_sched_pucch *pucch = &sched_ctrl->sched_pucch[sched_ctrl->pucch_sched_idx][sched_ctrl->pucch_occ_idx];
|
||||||
harq->feedback_slot = pucch->ul_slot;
|
harq->feedback_slot = pucch->ul_slot;
|
||||||
harq->is_waiting = 1;
|
harq->is_waiting = 1;
|
||||||
UE_info->mac_stats[UE_id].dlsch_rounds[harq->round]++;
|
UE_info->mac_stats[UE_id].dlsch_rounds[harq->round]++;
|
||||||
@@ -804,6 +840,9 @@ void nr_schedule_ue_spec(module_id_t module_id,
|
|||||||
retInfo->mcs = sched_ctrl->mcs;
|
retInfo->mcs = sched_ctrl->mcs;
|
||||||
retInfo->numDmrsCdmGrpsNoData = sched_ctrl->numDmrsCdmGrpsNoData;
|
retInfo->numDmrsCdmGrpsNoData = sched_ctrl->numDmrsCdmGrpsNoData;
|
||||||
|
|
||||||
|
T(T_GNB_MAC_DL_PDU_WITH_DATA, T_INT(module_id), T_INT(CC_id), T_INT(rnti),
|
||||||
|
T_INT(frame), T_INT(slot), T_INT(current_harq_pid), T_BUFFER(buf, TBS));
|
||||||
|
|
||||||
#if defined(ENABLE_MAC_PAYLOAD_DEBUG)
|
#if defined(ENABLE_MAC_PAYLOAD_DEBUG)
|
||||||
if (frame%100 == 0) {
|
if (frame%100 == 0) {
|
||||||
LOG_I(MAC,
|
LOG_I(MAC,
|
||||||
|
|||||||
@@ -384,7 +384,6 @@ int configure_fapi_dl_pdu_phytest(int Mod_idP,
|
|||||||
dci_pdu_rel15[0].ndi = UE_info->UE_sched_ctrl[UE_id].harq_processes[current_harq_pid].ndi;
|
dci_pdu_rel15[0].ndi = UE_info->UE_sched_ctrl[UE_id].harq_processes[current_harq_pid].ndi;
|
||||||
// DAI
|
// DAI
|
||||||
dci_pdu_rel15[0].dai[0].val = (pucch_sched->dai_c-1)&3;
|
dci_pdu_rel15[0].dai[0].val = (pucch_sched->dai_c-1)&3;
|
||||||
|
|
||||||
// TPC for PUCCH
|
// TPC for PUCCH
|
||||||
dci_pdu_rel15[0].tpc = UE_info->UE_sched_ctrl[UE_id].tpc1; // table 7.2.1-1 in 38.213
|
dci_pdu_rel15[0].tpc = UE_info->UE_sched_ctrl[UE_id].tpc1; // table 7.2.1-1 in 38.213
|
||||||
// PUCCH resource indicator
|
// PUCCH resource indicator
|
||||||
|
|||||||
@@ -735,10 +735,11 @@ void nr_configure_pdcch(gNB_MAC_INST *nr_mac,
|
|||||||
void nr_configure_pucch(nfapi_nr_pucch_pdu_t* pucch_pdu,
|
void nr_configure_pucch(nfapi_nr_pucch_pdu_t* pucch_pdu,
|
||||||
NR_ServingCellConfigCommon_t *scc,
|
NR_ServingCellConfigCommon_t *scc,
|
||||||
NR_BWP_Uplink_t *bwp,
|
NR_BWP_Uplink_t *bwp,
|
||||||
|
uint16_t rnti,
|
||||||
uint8_t pucch_resource,
|
uint8_t pucch_resource,
|
||||||
uint16_t O_uci,
|
uint16_t O_csi,
|
||||||
uint16_t O_ack,
|
uint16_t O_ack,
|
||||||
uint8_t SR_flag) {
|
uint8_t O_sr) {
|
||||||
|
|
||||||
NR_PUCCH_Config_t *pucch_Config;
|
NR_PUCCH_Config_t *pucch_Config;
|
||||||
NR_PUCCH_Resource_t *pucchres;
|
NR_PUCCH_Resource_t *pucchres;
|
||||||
@@ -753,6 +754,8 @@ void nr_configure_pucch(nfapi_nr_pucch_pdu_t* pucch_pdu,
|
|||||||
|
|
||||||
pucch_pdu->bit_len_harq = O_ack;
|
pucch_pdu->bit_len_harq = O_ack;
|
||||||
|
|
||||||
|
uint16_t O_uci = O_csi + O_ack;
|
||||||
|
|
||||||
if (bwp) { // This is not the InitialBWP
|
if (bwp) { // This is not the InitialBWP
|
||||||
|
|
||||||
NR_PUSCH_Config_t *pusch_Config = bwp->bwp_Dedicated->pusch_Config->choice.setup;
|
NR_PUSCH_Config_t *pusch_Config = bwp->bwp_Dedicated->pusch_Config->choice.setup;
|
||||||
@@ -815,7 +818,7 @@ void nr_configure_pucch(nfapi_nr_pucch_pdu_t* pucch_pdu,
|
|||||||
else
|
else
|
||||||
AssertFatal(1==0,"Couldn't fine pucch resource indicator %d in PUCCH resource set %d for %d UCI bits",pucch_resource,i,O_uci);
|
AssertFatal(1==0,"Couldn't fine pucch resource indicator %d in PUCCH resource set %d for %d UCI bits",pucch_resource,i,O_uci);
|
||||||
}
|
}
|
||||||
else {
|
if (pucchresset->pucch_ResourceSetId == 1 && O_uci>2) {
|
||||||
N3 = pucchresset->maxPayloadMinus1!= NULL ? *pucchresset->maxPayloadMinus1 : 1706;
|
N3 = pucchresset->maxPayloadMinus1!= NULL ? *pucchresset->maxPayloadMinus1 : 1706;
|
||||||
if (N2<O_uci && N3>O_uci) {
|
if (N2<O_uci && N3>O_uci) {
|
||||||
if (pucch_resource < n_list)
|
if (pucch_resource < n_list)
|
||||||
@@ -841,6 +844,7 @@ void nr_configure_pucch(nfapi_nr_pucch_pdu_t* pucch_pdu,
|
|||||||
if (pucchres->pucch_ResourceId == *resource_id) {
|
if (pucchres->pucch_ResourceId == *resource_id) {
|
||||||
res_found = 1;
|
res_found = 1;
|
||||||
pucch_pdu->prb_start = pucchres->startingPRB;
|
pucch_pdu->prb_start = pucchres->startingPRB;
|
||||||
|
pucch_pdu->rnti = rnti;
|
||||||
// FIXME why there is only one frequency hopping flag
|
// FIXME why there is only one frequency hopping flag
|
||||||
// what about inter slot frequency hopping?
|
// what about inter slot frequency hopping?
|
||||||
pucch_pdu->freq_hop_flag = pucchres->intraSlotFrequencyHopping!= NULL ? 1 : 0;
|
pucch_pdu->freq_hop_flag = pucchres->intraSlotFrequencyHopping!= NULL ? 1 : 0;
|
||||||
@@ -851,7 +855,7 @@ void nr_configure_pucch(nfapi_nr_pucch_pdu_t* pucch_pdu,
|
|||||||
pucch_pdu->initial_cyclic_shift = pucchres->format.choice.format0->initialCyclicShift;
|
pucch_pdu->initial_cyclic_shift = pucchres->format.choice.format0->initialCyclicShift;
|
||||||
pucch_pdu->nr_of_symbols = pucchres->format.choice.format0->nrofSymbols;
|
pucch_pdu->nr_of_symbols = pucchres->format.choice.format0->nrofSymbols;
|
||||||
pucch_pdu->start_symbol_index = pucchres->format.choice.format0->startingSymbolIndex;
|
pucch_pdu->start_symbol_index = pucchres->format.choice.format0->startingSymbolIndex;
|
||||||
pucch_pdu->sr_flag = SR_flag;
|
pucch_pdu->sr_flag = O_sr;
|
||||||
break;
|
break;
|
||||||
case NR_PUCCH_Resource__format_PR_format1 :
|
case NR_PUCCH_Resource__format_PR_format1 :
|
||||||
pucch_pdu->format_type = 1;
|
pucch_pdu->format_type = 1;
|
||||||
@@ -859,21 +863,23 @@ void nr_configure_pucch(nfapi_nr_pucch_pdu_t* pucch_pdu,
|
|||||||
pucch_pdu->nr_of_symbols = pucchres->format.choice.format1->nrofSymbols;
|
pucch_pdu->nr_of_symbols = pucchres->format.choice.format1->nrofSymbols;
|
||||||
pucch_pdu->start_symbol_index = pucchres->format.choice.format1->startingSymbolIndex;
|
pucch_pdu->start_symbol_index = pucchres->format.choice.format1->startingSymbolIndex;
|
||||||
pucch_pdu->time_domain_occ_idx = pucchres->format.choice.format1->timeDomainOCC;
|
pucch_pdu->time_domain_occ_idx = pucchres->format.choice.format1->timeDomainOCC;
|
||||||
pucch_pdu->sr_flag = SR_flag;
|
pucch_pdu->sr_flag = O_sr;
|
||||||
break;
|
break;
|
||||||
case NR_PUCCH_Resource__format_PR_format2 :
|
case NR_PUCCH_Resource__format_PR_format2 :
|
||||||
pucch_pdu->format_type = 2;
|
pucch_pdu->format_type = 2;
|
||||||
pucch_pdu->nr_of_symbols = pucchres->format.choice.format2->nrofSymbols;
|
pucch_pdu->nr_of_symbols = pucchres->format.choice.format2->nrofSymbols;
|
||||||
pucch_pdu->start_symbol_index = pucchres->format.choice.format2->startingSymbolIndex;
|
pucch_pdu->start_symbol_index = pucchres->format.choice.format2->startingSymbolIndex;
|
||||||
pucch_pdu->prb_size = pucchres->format.choice.format2->nrofPRBs;
|
|
||||||
pucch_pdu->data_scrambling_id = pusch_id!= NULL ? *pusch_id : *scc->physCellId;
|
pucch_pdu->data_scrambling_id = pusch_id!= NULL ? *pusch_id : *scc->physCellId;
|
||||||
pucch_pdu->dmrs_scrambling_id = id0!= NULL ? *id0 : *scc->physCellId;
|
pucch_pdu->dmrs_scrambling_id = id0!= NULL ? *id0 : *scc->physCellId;
|
||||||
|
pucch_pdu->prb_size = compute_pucch_prb_size(2,pucchres->format.choice.format2->nrofPRBs,
|
||||||
|
O_uci+O_sr,O_csi,pucch_Config->format2->choice.setup->maxCodeRate,
|
||||||
|
2,pucchres->format.choice.format2->nrofSymbols,8);
|
||||||
|
pucch_pdu->bit_len_csi_part1 = O_csi;
|
||||||
break;
|
break;
|
||||||
case NR_PUCCH_Resource__format_PR_format3 :
|
case NR_PUCCH_Resource__format_PR_format3 :
|
||||||
pucch_pdu->format_type = 3;
|
pucch_pdu->format_type = 3;
|
||||||
pucch_pdu->nr_of_symbols = pucchres->format.choice.format3->nrofSymbols;
|
pucch_pdu->nr_of_symbols = pucchres->format.choice.format3->nrofSymbols;
|
||||||
pucch_pdu->start_symbol_index = pucchres->format.choice.format3->startingSymbolIndex;
|
pucch_pdu->start_symbol_index = pucchres->format.choice.format3->startingSymbolIndex;
|
||||||
pucch_pdu->prb_size = pucchres->format.choice.format3->nrofPRBs;
|
|
||||||
pucch_pdu->data_scrambling_id = pusch_id!= NULL ? *pusch_id : *scc->physCellId;
|
pucch_pdu->data_scrambling_id = pusch_id!= NULL ? *pusch_id : *scc->physCellId;
|
||||||
if (pucch_Config->format3 == NULL) {
|
if (pucch_Config->format3 == NULL) {
|
||||||
pucch_pdu->pi_2bpsk = 0;
|
pucch_pdu->pi_2bpsk = 0;
|
||||||
@@ -884,6 +890,19 @@ void nr_configure_pucch(nfapi_nr_pucch_pdu_t* pucch_pdu,
|
|||||||
pucch_pdu->pi_2bpsk = pucchfmt->pi2BPSK!= NULL ? 1 : 0;
|
pucch_pdu->pi_2bpsk = pucchfmt->pi2BPSK!= NULL ? 1 : 0;
|
||||||
pucch_pdu->add_dmrs_flag = pucchfmt->additionalDMRS!= NULL ? 1 : 0;
|
pucch_pdu->add_dmrs_flag = pucchfmt->additionalDMRS!= NULL ? 1 : 0;
|
||||||
}
|
}
|
||||||
|
int f3_dmrs_symbols;
|
||||||
|
if (pucchres->format.choice.format3->nrofSymbols==4)
|
||||||
|
f3_dmrs_symbols = 1<<pucch_pdu->freq_hop_flag;
|
||||||
|
else {
|
||||||
|
if(pucchres->format.choice.format3->nrofSymbols<10)
|
||||||
|
f3_dmrs_symbols = 2;
|
||||||
|
else
|
||||||
|
f3_dmrs_symbols = 2<<pucch_pdu->add_dmrs_flag;
|
||||||
|
}
|
||||||
|
pucch_pdu->prb_size = compute_pucch_prb_size(3,pucchres->format.choice.format3->nrofPRBs,
|
||||||
|
O_uci+O_sr,O_csi,pucch_Config->format3->choice.setup->maxCodeRate,
|
||||||
|
2-pucch_pdu->pi_2bpsk,pucchres->format.choice.format3->nrofSymbols-f3_dmrs_symbols,12);
|
||||||
|
pucch_pdu->bit_len_csi_part1 = O_csi;
|
||||||
break;
|
break;
|
||||||
case NR_PUCCH_Resource__format_PR_format4 :
|
case NR_PUCCH_Resource__format_PR_format4 :
|
||||||
pucch_pdu->format_type = 4;
|
pucch_pdu->format_type = 4;
|
||||||
@@ -901,6 +920,7 @@ void nr_configure_pucch(nfapi_nr_pucch_pdu_t* pucch_pdu,
|
|||||||
pucch_pdu->pi_2bpsk = pucchfmt->pi2BPSK!= NULL ? 1 : 0;
|
pucch_pdu->pi_2bpsk = pucchfmt->pi2BPSK!= NULL ? 1 : 0;
|
||||||
pucch_pdu->add_dmrs_flag = pucchfmt->additionalDMRS!= NULL ? 1 : 0;
|
pucch_pdu->add_dmrs_flag = pucchfmt->additionalDMRS!= NULL ? 1 : 0;
|
||||||
}
|
}
|
||||||
|
pucch_pdu->bit_len_csi_part1 = O_csi;
|
||||||
break;
|
break;
|
||||||
default :
|
default :
|
||||||
AssertFatal(1==0,"Undefined PUCCH format \n");
|
AssertFatal(1==0,"Undefined PUCCH format \n");
|
||||||
@@ -916,6 +936,84 @@ void nr_configure_pucch(nfapi_nr_pucch_pdu_t* pucch_pdu,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
uint16_t compute_pucch_prb_size(uint8_t format,
|
||||||
|
uint8_t nr_prbs,
|
||||||
|
uint16_t O_tot,
|
||||||
|
uint16_t O_csi,
|
||||||
|
NR_PUCCH_MaxCodeRate_t *maxCodeRate,
|
||||||
|
uint8_t Qm,
|
||||||
|
uint8_t n_symb,
|
||||||
|
uint8_t n_re_ctrl) {
|
||||||
|
|
||||||
|
uint16_t O_crc;
|
||||||
|
|
||||||
|
if (O_tot<12)
|
||||||
|
O_crc = 0;
|
||||||
|
else{
|
||||||
|
if (O_tot<20)
|
||||||
|
O_crc = 6;
|
||||||
|
else {
|
||||||
|
if (O_tot<360)
|
||||||
|
O_crc = 11;
|
||||||
|
else
|
||||||
|
AssertFatal(1==0,"Case for segmented PUCCH not yet implemented");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int rtimes100;
|
||||||
|
switch(*maxCodeRate){
|
||||||
|
case NR_PUCCH_MaxCodeRate_zeroDot08 :
|
||||||
|
rtimes100 = 8;
|
||||||
|
break;
|
||||||
|
case NR_PUCCH_MaxCodeRate_zeroDot15 :
|
||||||
|
rtimes100 = 15;
|
||||||
|
break;
|
||||||
|
case NR_PUCCH_MaxCodeRate_zeroDot25 :
|
||||||
|
rtimes100 = 25;
|
||||||
|
break;
|
||||||
|
case NR_PUCCH_MaxCodeRate_zeroDot35 :
|
||||||
|
rtimes100 = 35;
|
||||||
|
break;
|
||||||
|
case NR_PUCCH_MaxCodeRate_zeroDot45 :
|
||||||
|
rtimes100 = 45;
|
||||||
|
break;
|
||||||
|
case NR_PUCCH_MaxCodeRate_zeroDot60 :
|
||||||
|
rtimes100 = 60;
|
||||||
|
break;
|
||||||
|
case NR_PUCCH_MaxCodeRate_zeroDot80 :
|
||||||
|
rtimes100 = 80;
|
||||||
|
break;
|
||||||
|
default :
|
||||||
|
AssertFatal(1==0,"Invalid MaxCodeRate");
|
||||||
|
}
|
||||||
|
|
||||||
|
float r = (float)rtimes100/100;
|
||||||
|
|
||||||
|
if (O_csi == O_tot) {
|
||||||
|
if ((O_tot+O_csi)>(nr_prbs*n_re_ctrl*n_symb*Qm*r))
|
||||||
|
AssertFatal(1==0,"MaxCodeRate %.2f can't support %d UCI bits and %d CRC bits with %d PRBs",
|
||||||
|
r,O_tot,O_crc,nr_prbs);
|
||||||
|
else
|
||||||
|
return nr_prbs;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (format==2){
|
||||||
|
// TODO fix this for multiple CSI reports
|
||||||
|
for (int i=1; i<=nr_prbs; i++){
|
||||||
|
if((O_tot+O_crc)<=(i*n_symb*Qm*n_re_ctrl*r) &&
|
||||||
|
(O_tot+O_crc)>((i-1)*n_symb*Qm*n_re_ctrl*r))
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
AssertFatal(1==0,"MaxCodeRate %.2f can't support %d UCI bits and %d CRC bits with at most %d PRBs",
|
||||||
|
r,O_tot,O_crc,nr_prbs);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
AssertFatal(1==0,"Not yet implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void prepare_dci(NR_CellGroupConfig_t *secondaryCellGroup,
|
void prepare_dci(NR_CellGroupConfig_t *secondaryCellGroup,
|
||||||
dci_pdu_rel15_t *dci_pdu_rel15,
|
dci_pdu_rel15_t *dci_pdu_rel15,
|
||||||
nr_dci_format_t format,
|
nr_dci_format_t format,
|
||||||
@@ -1686,15 +1784,21 @@ int add_new_nr_ue(module_id_t mod_idP, rnti_t rntiP){
|
|||||||
memset((void *) &UE_info->UE_sched_ctrl[UE_id],
|
memset((void *) &UE_info->UE_sched_ctrl[UE_id],
|
||||||
0,
|
0,
|
||||||
sizeof(NR_UE_sched_ctrl_t));
|
sizeof(NR_UE_sched_ctrl_t));
|
||||||
|
|
||||||
UE_info->UE_sched_ctrl[UE_id].ta_timer = 100;
|
UE_info->UE_sched_ctrl[UE_id].ta_timer = 100;
|
||||||
UE_info->UE_sched_ctrl[UE_id].ta_update = 31;
|
UE_info->UE_sched_ctrl[UE_id].ta_update = 31;
|
||||||
UE_info->UE_sched_ctrl[UE_id].ul_rssi = 0;
|
UE_info->UE_sched_ctrl[UE_id].ul_rssi = 0;
|
||||||
UE_info->UE_sched_ctrl[UE_id].sched_pucch = (NR_sched_pucch *)malloc(num_slots_ul*sizeof(NR_sched_pucch));
|
UE_info->UE_sched_ctrl[UE_id].sched_pucch = (NR_sched_pucch **)malloc(num_slots_ul*sizeof(NR_sched_pucch *));
|
||||||
|
for (int s=0; s<num_slots_ul;s++)
|
||||||
|
UE_info->UE_sched_ctrl[UE_id].sched_pucch[s] = (NR_sched_pucch *)malloc(2*sizeof(NR_sched_pucch));
|
||||||
UE_info->UE_sched_ctrl[UE_id].sched_pusch = (NR_sched_pusch *)malloc(num_slots_ul*sizeof(NR_sched_pusch));
|
UE_info->UE_sched_ctrl[UE_id].sched_pusch = (NR_sched_pusch *)malloc(num_slots_ul*sizeof(NR_sched_pusch));
|
||||||
|
|
||||||
for (int k=0; k<num_slots_ul; k++) {
|
for (int k=0; k<num_slots_ul; k++) {
|
||||||
memset((void *) &UE_info->UE_sched_ctrl[UE_id].sched_pucch[k],
|
for (int l=0; l<2; l++)
|
||||||
0,
|
memset((void *) &UE_info->UE_sched_ctrl[UE_id].sched_pucch[k][l],
|
||||||
sizeof(NR_sched_pucch));
|
0,
|
||||||
|
sizeof(NR_sched_pucch));
|
||||||
|
|
||||||
memset((void *) &UE_info->UE_sched_ctrl[UE_id].sched_pusch[k],
|
memset((void *) &UE_info->UE_sched_ctrl[UE_id].sched_pusch[k],
|
||||||
0,
|
0,
|
||||||
sizeof(NR_sched_pusch));
|
sizeof(NR_sched_pusch));
|
||||||
@@ -1817,50 +1921,302 @@ void get_pdsch_to_harq_feedback(int Mod_idP,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
uint16_t nr_get_csi_bitlen(int Mod_idP,
|
||||||
|
int UE_id,
|
||||||
|
uint8_t csi_report_id) {
|
||||||
|
|
||||||
|
uint16_t csi_bitlen =0;
|
||||||
|
NR_UE_info_t *UE_info = &RC.nrmac[Mod_idP]->UE_info;
|
||||||
|
CRI_SSBRI_RSRP_bitlen_t * CSI_report_bitlen = NULL;
|
||||||
|
|
||||||
|
CSI_report_bitlen = &(UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0]);
|
||||||
|
csi_bitlen = ((CSI_report_bitlen->cri_ssbri_bitlen * CSI_report_bitlen->nb_ssbri_cri) +
|
||||||
|
CSI_report_bitlen->rsrp_bitlen +(CSI_report_bitlen->diff_rsrp_bitlen *
|
||||||
|
(CSI_report_bitlen->nb_ssbri_cri -1 )) *UE_info->csi_report_template[UE_id][csi_report_id].nb_of_csi_ssb_report);
|
||||||
|
|
||||||
|
return csi_bitlen;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void csi_period_offset(NR_CSI_ReportConfig_t *csirep,
|
||||||
|
int *period, int *offset) {
|
||||||
|
|
||||||
|
NR_CSI_ReportPeriodicityAndOffset_PR p_and_o = csirep->reportConfigType.choice.periodic->reportSlotConfig.present;
|
||||||
|
|
||||||
|
switch(p_and_o){
|
||||||
|
case NR_CSI_ReportPeriodicityAndOffset_PR_slots4:
|
||||||
|
*period = 4;
|
||||||
|
*offset = csirep->reportConfigType.choice.periodic->reportSlotConfig.choice.slots4;
|
||||||
|
break;
|
||||||
|
case NR_CSI_ReportPeriodicityAndOffset_PR_slots5:
|
||||||
|
*period = 5;
|
||||||
|
*offset = csirep->reportConfigType.choice.periodic->reportSlotConfig.choice.slots5;
|
||||||
|
break;
|
||||||
|
case NR_CSI_ReportPeriodicityAndOffset_PR_slots8:
|
||||||
|
*period = 8;
|
||||||
|
*offset = csirep->reportConfigType.choice.periodic->reportSlotConfig.choice.slots8;
|
||||||
|
break;
|
||||||
|
case NR_CSI_ReportPeriodicityAndOffset_PR_slots10:
|
||||||
|
*period = 10;
|
||||||
|
*offset = csirep->reportConfigType.choice.periodic->reportSlotConfig.choice.slots10;
|
||||||
|
break;
|
||||||
|
case NR_CSI_ReportPeriodicityAndOffset_PR_slots16:
|
||||||
|
*period = 16;
|
||||||
|
*offset = csirep->reportConfigType.choice.periodic->reportSlotConfig.choice.slots16;
|
||||||
|
break;
|
||||||
|
case NR_CSI_ReportPeriodicityAndOffset_PR_slots20:
|
||||||
|
*period = 20;
|
||||||
|
*offset = csirep->reportConfigType.choice.periodic->reportSlotConfig.choice.slots20;
|
||||||
|
break;
|
||||||
|
case NR_CSI_ReportPeriodicityAndOffset_PR_slots40:
|
||||||
|
*period = 40;
|
||||||
|
*offset = csirep->reportConfigType.choice.periodic->reportSlotConfig.choice.slots40;
|
||||||
|
break;
|
||||||
|
case NR_CSI_ReportPeriodicityAndOffset_PR_slots80:
|
||||||
|
*period = 80;
|
||||||
|
*offset = csirep->reportConfigType.choice.periodic->reportSlotConfig.choice.slots80;
|
||||||
|
break;
|
||||||
|
case NR_CSI_ReportPeriodicityAndOffset_PR_slots160:
|
||||||
|
*period = 160;
|
||||||
|
*offset = csirep->reportConfigType.choice.periodic->reportSlotConfig.choice.slots160;
|
||||||
|
break;
|
||||||
|
case NR_CSI_ReportPeriodicityAndOffset_PR_slots320:
|
||||||
|
*period = 320;
|
||||||
|
*offset = csirep->reportConfigType.choice.periodic->reportSlotConfig.choice.slots320;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
AssertFatal(1==0,"No periodicity and offset resource found in CSI report");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//!TODO : same function can be written to handle csi_resources
|
||||||
|
void compute_csi_bitlen (NR_CellGroupConfig_t *secondaryCellGroup, NR_UE_info_t *UE_info, int UE_id) {
|
||||||
|
uint8_t csi_report_id = 0;
|
||||||
|
uint8_t csi_resourceidx =0;
|
||||||
|
uint8_t csi_ssb_idx =0;
|
||||||
|
|
||||||
|
NR_CSI_MeasConfig_t *csi_MeasConfig = secondaryCellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup;
|
||||||
|
NR_CSI_ResourceConfigId_t csi_ResourceConfigId;
|
||||||
|
for (csi_report_id=0; csi_report_id < csi_MeasConfig->csi_ReportConfigToAddModList->list.count; csi_report_id++){
|
||||||
|
csi_ResourceConfigId=csi_MeasConfig->csi_ReportConfigToAddModList->list.array[csi_report_id]->resourcesForChannelMeasurement;
|
||||||
|
UE_info->csi_report_template[UE_id][csi_report_id].reportQuantity_type = csi_MeasConfig->csi_ReportConfigToAddModList->list.array[csi_report_id]->reportQuantity.present;
|
||||||
|
|
||||||
|
for ( csi_resourceidx = 0; csi_resourceidx < csi_MeasConfig->csi_ResourceConfigToAddModList->list.count; csi_resourceidx++) {
|
||||||
|
if ( csi_MeasConfig->csi_ResourceConfigToAddModList->list.array[csi_resourceidx]->csi_ResourceConfigId != csi_ResourceConfigId)
|
||||||
|
continue;
|
||||||
|
else {
|
||||||
|
//Finding the CSI_RS or SSB Resources
|
||||||
|
UE_info->csi_report_template[UE_id][csi_report_id].CSI_Resource_type= csi_MeasConfig->csi_ResourceConfigToAddModList->list.array[csi_resourceidx]->csi_RS_ResourceSetList.present;
|
||||||
|
if (NR_CSI_ResourceConfig__csi_RS_ResourceSetList_PR_nzp_CSI_RS_SSB ==UE_info->csi_report_template[UE_id][csi_report_id].CSI_Resource_type){
|
||||||
|
struct NR_CSI_ResourceConfig__csi_RS_ResourceSetList__nzp_CSI_RS_SSB * nzp_CSI_RS_SSB = csi_MeasConfig->csi_ResourceConfigToAddModList->list.array[csi_resourceidx]->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB;
|
||||||
|
|
||||||
|
UE_info->csi_report_template[UE_id][csi_report_id].nb_of_nzp_csi_report = nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList!=NULL ? nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList->list.count:0;
|
||||||
|
UE_info->csi_report_template[UE_id][csi_report_id].nb_of_csi_ssb_report = nzp_CSI_RS_SSB->csi_SSB_ResourceSetList!=NULL ? nzp_CSI_RS_SSB->csi_SSB_ResourceSetList->list.count:0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (0 != UE_info->csi_report_template[UE_id][csi_report_id].nb_of_csi_ssb_report){
|
||||||
|
uint8_t nb_ssb_resources =0;
|
||||||
|
for ( csi_ssb_idx = 0; csi_ssb_idx < csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.count; csi_ssb_idx++) {
|
||||||
|
if (csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.array[csi_ssb_idx]->csi_SSB_ResourceSetId ==
|
||||||
|
*(csi_MeasConfig->csi_ResourceConfigToAddModList->list.array[csi_resourceidx]->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->csi_SSB_ResourceSetList->list.array[0])) { ///We can configure only one SSB resource set from spec 38.331 IE CSI-ResourceConfig
|
||||||
|
if (NR_CSI_ReportConfig__groupBasedBeamReporting_PR_disabled ==
|
||||||
|
csi_MeasConfig->csi_ReportConfigToAddModList->list.array[csi_report_id]->groupBasedBeamReporting.present ) {
|
||||||
|
if (NULL != csi_MeasConfig->csi_ReportConfigToAddModList->list.array[csi_report_id]->groupBasedBeamReporting.choice.disabled->nrofReportedRS)
|
||||||
|
UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].nb_ssbri_cri = *(csi_MeasConfig->csi_ReportConfigToAddModList->list.array[csi_report_id]->groupBasedBeamReporting.choice.disabled->nrofReportedRS)+1;
|
||||||
|
else
|
||||||
|
/*! From Spec 38.331
|
||||||
|
* nrofReportedRS
|
||||||
|
* The number (N) of measured RS resources to be reported per report setting in a non-group-based report. N <= N_max, where N_max is either 2 or 4 depending on UE
|
||||||
|
* capability. FFS: The signaling mechanism for the gNB to select a subset of N beams for the UE to measure and report.
|
||||||
|
* When the field is absent the UE applies the value 1
|
||||||
|
*/
|
||||||
|
UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].nb_ssbri_cri= 1;
|
||||||
|
}else
|
||||||
|
UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].nb_ssbri_cri= 2;
|
||||||
|
|
||||||
|
nb_ssb_resources= csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.array[csi_ssb_idx]->csi_SSB_ResourceList.list.count;
|
||||||
|
if (nb_ssb_resources){
|
||||||
|
UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].cri_ssbri_bitlen =ceil(log2 (nb_ssb_resources));
|
||||||
|
UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].rsrp_bitlen = 7; //From spec 38.212 Table 6.3.1.1.2-6: CRI, SSBRI, and RSRP
|
||||||
|
UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].diff_rsrp_bitlen =4; //From spec 38.212 Table 6.3.1.1.2-6: CRI, SSBRI, and RSRP
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].cri_ssbri_bitlen =0;
|
||||||
|
UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].rsrp_bitlen = 0;
|
||||||
|
UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].diff_rsrp_bitlen =0;
|
||||||
|
}
|
||||||
|
|
||||||
|
LOG_I (MAC, "UCI: CSI_bit len : ssbri %d, rsrp: %d, diff_rsrp: %d",
|
||||||
|
UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].cri_ssbri_bitlen,
|
||||||
|
UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].rsrp_bitlen,
|
||||||
|
UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].diff_rsrp_bitlen);
|
||||||
|
break ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (0 != UE_info->csi_report_template[UE_id][csi_report_id].nb_of_nzp_csi_report){
|
||||||
|
AssertFatal(1==0,"Currently configuring only SSB beamreporting.");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void nr_csi_meas_reporting(int Mod_idP,
|
||||||
|
int UE_id,
|
||||||
|
frame_t frame,
|
||||||
|
sub_frame_t slot,
|
||||||
|
int slots_per_tdd,
|
||||||
|
int ul_slots,
|
||||||
|
int n_slots_frame) {
|
||||||
|
|
||||||
|
NR_UE_info_t *UE_info = &RC.nrmac[Mod_idP]->UE_info;
|
||||||
|
NR_sched_pucch *curr_pucch;
|
||||||
|
NR_PUCCH_ResourceSet_t *pucchresset;
|
||||||
|
NR_CSI_ReportConfig_t *csirep;
|
||||||
|
NR_CellGroupConfig_t *secondaryCellGroup = UE_info->secondaryCellGroup[UE_id];
|
||||||
|
NR_CSI_MeasConfig_t *csi_measconfig = secondaryCellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup;
|
||||||
|
NR_BWP_Uplink_t *ubwp=secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[0];
|
||||||
|
NR_PUCCH_Config_t *pucch_Config = ubwp->bwp_Dedicated->pucch_Config->choice.setup;
|
||||||
|
|
||||||
|
AssertFatal(csi_measconfig->csi_ReportConfigToAddModList->list.count>0,"NO CSI report configuration available");
|
||||||
|
|
||||||
|
for (int csi_report_id = 0; csi_report_id < csi_measconfig->csi_ReportConfigToAddModList->list.count; csi_report_id++){
|
||||||
|
|
||||||
|
csirep = csi_measconfig->csi_ReportConfigToAddModList->list.array[csi_report_id];
|
||||||
|
|
||||||
|
AssertFatal(csirep->reportConfigType.choice.periodic!=NULL,"Only periodic CSI reporting is implemented currently");
|
||||||
|
int period, offset, sched_slot;
|
||||||
|
csi_period_offset(csirep,&period,&offset);
|
||||||
|
sched_slot = (period+offset)%n_slots_frame;
|
||||||
|
// prepare to schedule csi measurement reception according to 5.2.1.4 in 38.214
|
||||||
|
// preparation is done in first slot of tdd period
|
||||||
|
if ( (frame%(period/n_slots_frame)==(offset/n_slots_frame)) && (slot==((sched_slot/slots_per_tdd)*slots_per_tdd))) {
|
||||||
|
|
||||||
|
// we are scheduling pucch for csi in the first pucch occasion (this comes before ack/nack)
|
||||||
|
curr_pucch = &UE_info->UE_sched_ctrl[UE_id].sched_pucch[sched_slot-slots_per_tdd+ul_slots][0];
|
||||||
|
|
||||||
|
NR_PUCCH_CSI_Resource_t *pucchcsires = csirep->reportConfigType.choice.periodic->pucch_CSI_ResourceList.list.array[0];
|
||||||
|
|
||||||
|
int found = -1;
|
||||||
|
pucchresset = pucch_Config->resourceSetToAddModList->list.array[1]; // set with formats >1
|
||||||
|
int n_list = pucchresset->resourceList.list.count;
|
||||||
|
for (int i=0; i<n_list; i++) {
|
||||||
|
if (*pucchresset->resourceList.list.array[i] == pucchcsires->pucch_Resource)
|
||||||
|
found = i;
|
||||||
|
}
|
||||||
|
AssertFatal(found>-1,"CSI resource not found among PUCCH resources");
|
||||||
|
|
||||||
|
curr_pucch->resource_indicator = found;
|
||||||
|
|
||||||
|
n_list = pucch_Config->resourceToAddModList->list.count;
|
||||||
|
|
||||||
|
// going through the list of PUCCH resources to find the one indexed by resource_id
|
||||||
|
for (int i=0; i<n_list; i++) {
|
||||||
|
NR_PUCCH_Resource_t *pucchres = pucch_Config->resourceToAddModList->list.array[i];
|
||||||
|
if (pucchres->pucch_ResourceId == *pucchresset->resourceList.list.array[found]) {
|
||||||
|
switch(pucchres->format.present){
|
||||||
|
case NR_PUCCH_Resource__format_PR_format2:
|
||||||
|
if (pucch_Config->format2->choice.setup->simultaneousHARQ_ACK_CSI == NULL)
|
||||||
|
curr_pucch->simultaneous_harqcsi = false;
|
||||||
|
else
|
||||||
|
curr_pucch->simultaneous_harqcsi = true;
|
||||||
|
break;
|
||||||
|
case NR_PUCCH_Resource__format_PR_format3:
|
||||||
|
if (pucch_Config->format3->choice.setup->simultaneousHARQ_ACK_CSI == NULL)
|
||||||
|
curr_pucch->simultaneous_harqcsi = false;
|
||||||
|
else
|
||||||
|
curr_pucch->simultaneous_harqcsi = true;
|
||||||
|
break;
|
||||||
|
case NR_PUCCH_Resource__format_PR_format4:
|
||||||
|
if (pucch_Config->format4->choice.setup->simultaneousHARQ_ACK_CSI == NULL)
|
||||||
|
curr_pucch->simultaneous_harqcsi = false;
|
||||||
|
else
|
||||||
|
curr_pucch->simultaneous_harqcsi = true;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
AssertFatal(1==0,"Invalid PUCCH format type");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
curr_pucch->csi_bits += nr_get_csi_bitlen(Mod_idP,UE_id,csi_report_id); // TODO function to compute CSI meas report bit size
|
||||||
|
curr_pucch->frame = frame;
|
||||||
|
curr_pucch->ul_slot = sched_slot;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// function to update pucch scheduling parameters in UE list when a USS DL is scheduled
|
// function to update pucch scheduling parameters in UE list when a USS DL is scheduled
|
||||||
void nr_update_pucch_scheduling(int Mod_idP,
|
void nr_acknack_scheduling(int Mod_idP,
|
||||||
int UE_id,
|
int UE_id,
|
||||||
frame_t frameP,
|
frame_t frameP,
|
||||||
sub_frame_t slotP,
|
sub_frame_t slotP,
|
||||||
int slots_per_tdd,
|
int slots_per_tdd,
|
||||||
int *pucch_id) {
|
int *pucch_id,
|
||||||
|
int *pucch_occ) {
|
||||||
|
|
||||||
NR_ServingCellConfigCommon_t *scc = RC.nrmac[Mod_idP]->common_channels->ServingCellConfigCommon;
|
NR_ServingCellConfigCommon_t *scc = RC.nrmac[Mod_idP]->common_channels->ServingCellConfigCommon;
|
||||||
NR_UE_info_t *UE_info = &RC.nrmac[Mod_idP]->UE_info;
|
NR_UE_info_t *UE_info = &RC.nrmac[Mod_idP]->UE_info;
|
||||||
NR_sched_pucch *curr_pucch;
|
NR_sched_pucch *curr_pucch;
|
||||||
int first_ul_slot_tdd,k,i;
|
int max_acknacks,pucch_res,first_ul_slot_tdd,k,i,l;
|
||||||
uint8_t pdsch_to_harq_feedback[8];
|
uint8_t pdsch_to_harq_feedback[8];
|
||||||
int found = 0;
|
int found = 0;
|
||||||
int nr_ulmix_slots = scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofUplinkSlots;
|
int nr_ulmix_slots = scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofUplinkSlots;
|
||||||
if (scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofUplinkSymbols!=0)
|
if (scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofUplinkSymbols!=0)
|
||||||
nr_ulmix_slots++;
|
nr_ulmix_slots++;
|
||||||
|
|
||||||
|
bool csi_pres=false;
|
||||||
|
for (k=0; k<nr_ulmix_slots; k++) {
|
||||||
|
if(UE_info->UE_sched_ctrl[UE_id].sched_pucch[k][0].csi_bits>0)
|
||||||
|
csi_pres=true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// As a preference always schedule ack nacks in PUCCH0 (max 2 per slots)
|
||||||
|
// Unless there is CSI meas reporting scheduled in the period to avoid conflicts in the same slot
|
||||||
|
if (csi_pres)
|
||||||
|
max_acknacks=10;
|
||||||
|
else
|
||||||
|
max_acknacks=2;
|
||||||
|
|
||||||
// this is hardcoded for now as ue specific
|
// this is hardcoded for now as ue specific
|
||||||
NR_SearchSpace__searchSpaceType_PR ss_type = NR_SearchSpace__searchSpaceType_PR_ue_Specific;
|
NR_SearchSpace__searchSpaceType_PR ss_type = NR_SearchSpace__searchSpaceType_PR_ue_Specific;
|
||||||
get_pdsch_to_harq_feedback(Mod_idP,UE_id,ss_type,pdsch_to_harq_feedback);
|
get_pdsch_to_harq_feedback(Mod_idP,UE_id,ss_type,pdsch_to_harq_feedback);
|
||||||
|
|
||||||
// for each possible ul or mixed slot
|
// for each possible ul or mixed slot
|
||||||
for (k=0; k<nr_ulmix_slots; k++) {
|
for (k=0; k<nr_ulmix_slots; k++) {
|
||||||
curr_pucch = &UE_info->UE_sched_ctrl[UE_id].sched_pucch[k];
|
for (l=0; l<1; l++) { // scheduling 2 PUCCH in a single slot does not work with the phone, currently
|
||||||
// if there is free room in current pucch structure
|
curr_pucch = &UE_info->UE_sched_ctrl[UE_id].sched_pucch[k][l];
|
||||||
if (curr_pucch->dai_c<MAX_ACK_BITS) {
|
//if it is possible to schedule acknack in current pucch (no exclusive csi pucch)
|
||||||
curr_pucch->frame = frameP;
|
if ((curr_pucch->csi_bits == 0) || (curr_pucch->simultaneous_harqcsi==true)) {
|
||||||
curr_pucch->dai_c++;
|
// if there is free room in current pucch structure
|
||||||
curr_pucch->resource_indicator = 0; // in phytest with only 1 UE we are using just the 1st resource
|
if (curr_pucch->dai_c<max_acknacks) {
|
||||||
// first pucch occasion in first UL or MIXED slot
|
pucch_res = get_pucch_resource(UE_info,UE_id,k,l);
|
||||||
first_ul_slot_tdd = scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofDownlinkSlots;
|
if (pucch_res>-1){
|
||||||
i = 0;
|
curr_pucch->resource_indicator = pucch_res;
|
||||||
while (i<8 && found == 0) { // look if timing indicator is among allowed values
|
curr_pucch->frame = frameP;
|
||||||
if (pdsch_to_harq_feedback[i]==(first_ul_slot_tdd+k)-(slotP % slots_per_tdd))
|
// first pucch occasion in first UL or MIXED slot
|
||||||
found = 1;
|
first_ul_slot_tdd = scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofDownlinkSlots;
|
||||||
if (found == 0) i++;
|
i = 0;
|
||||||
}
|
while (i<8 && found == 0) { // look if timing indicator is among allowed values
|
||||||
if (found == 1) {
|
if (pdsch_to_harq_feedback[i]==(first_ul_slot_tdd+k)-(slotP % slots_per_tdd))
|
||||||
// computing slot in which pucch is scheduled
|
found = 1;
|
||||||
curr_pucch->ul_slot = first_ul_slot_tdd + k + (slotP - (slotP % slots_per_tdd));
|
if (found == 0) i++;
|
||||||
curr_pucch->timing_indicator = i; // index in the list of timing indicators
|
}
|
||||||
*pucch_id = k;
|
if (found == 1) {
|
||||||
return;
|
// computing slot in which pucch is scheduled
|
||||||
|
curr_pucch->dai_c++;
|
||||||
|
curr_pucch->ul_slot = first_ul_slot_tdd + k + (slotP - (slotP % slots_per_tdd));
|
||||||
|
curr_pucch->timing_indicator = i; // index in the list of timing indicators
|
||||||
|
*pucch_id = k;
|
||||||
|
*pucch_occ = l;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1868,6 +2224,22 @@ void nr_update_pucch_scheduling(int Mod_idP,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int get_pucch_resource(NR_UE_info_t *UE_info,int UE_id,int k,int l) {
|
||||||
|
|
||||||
|
// to be updated later, for now simple implementation
|
||||||
|
// use the second allocation just in case there is csi in the first
|
||||||
|
// in that case use second resource (for a different symbol) see 9.2 in 38.213
|
||||||
|
if (l==1) {
|
||||||
|
if (UE_info->UE_sched_ctrl[UE_id].sched_pucch[k][0].csi_bits==0)
|
||||||
|
return -1;
|
||||||
|
else
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
void find_aggregation_candidates(uint8_t *aggregation_level,
|
void find_aggregation_candidates(uint8_t *aggregation_level,
|
||||||
uint8_t *nr_of_candidates,
|
uint8_t *nr_of_candidates,
|
||||||
NR_SearchSpace_t *ss) {
|
NR_SearchSpace_t *ss) {
|
||||||
|
|||||||
@@ -324,6 +324,12 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
|
|||||||
|
|
||||||
NR_RA_t *ra = &gNB_mac->common_channels[CC_idP].ra[0];
|
NR_RA_t *ra = &gNB_mac->common_channels[CC_idP].ra[0];
|
||||||
|
|
||||||
|
if (sduP != NULL) {
|
||||||
|
T(T_GNB_MAC_UL_PDU_WITH_DATA, T_INT(gnb_mod_idP), T_INT(CC_idP),
|
||||||
|
T_INT(rntiP), T_INT(frameP), T_INT(slotP), T_INT(-1) /* harq_pid */,
|
||||||
|
T_BUFFER(sduP, sdu_lenP));
|
||||||
|
}
|
||||||
|
|
||||||
// random access pusch with TC-RNTI
|
// random access pusch with TC-RNTI
|
||||||
if (ra->state == WAIT_Msg3) {
|
if (ra->state == WAIT_Msg3) {
|
||||||
if (sduP != NULL) { // if the CRC passed
|
if (sduP != NULL) { // if the CRC passed
|
||||||
@@ -340,6 +346,7 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
|
|||||||
LOG_I(MAC, "reset RA state information for RA-RNTI %04x\n", ra->rnti);
|
LOG_I(MAC, "reset RA state information for RA-RNTI %04x\n", ra->rnti);
|
||||||
const int UE_id = add_new_nr_ue(gnb_mod_idP, ra->rnti);
|
const int UE_id = add_new_nr_ue(gnb_mod_idP, ra->rnti);
|
||||||
UE_info->secondaryCellGroup[UE_id] = ra->secondaryCellGroup;
|
UE_info->secondaryCellGroup[UE_id] = ra->secondaryCellGroup;
|
||||||
|
compute_csi_bitlen (ra->secondaryCellGroup, UE_info, UE_id);
|
||||||
UE_info->UE_beam_index[UE_id] = ra->beam_id;
|
UE_info->UE_beam_index[UE_id] = ra->beam_id;
|
||||||
struct NR_ServingCellConfig__downlinkBWP_ToAddModList *bwpList = ra->secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList;
|
struct NR_ServingCellConfig__downlinkBWP_ToAddModList *bwpList = ra->secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList;
|
||||||
AssertFatal(bwpList->list.count == 1,
|
AssertFatal(bwpList->list.count == 1,
|
||||||
|
|||||||
@@ -36,8 +36,6 @@
|
|||||||
#include "LAYER2/NR_MAC_gNB/nr_mac_gNB.h"
|
#include "LAYER2/NR_MAC_gNB/nr_mac_gNB.h"
|
||||||
#include "NR_TAG-Id.h"
|
#include "NR_TAG-Id.h"
|
||||||
|
|
||||||
#define MAX_ACK_BITS 2 //only format 0 is available for now
|
|
||||||
|
|
||||||
void set_cset_offset(uint16_t);
|
void set_cset_offset(uint16_t);
|
||||||
|
|
||||||
void mac_top_init_gNB(void);
|
void mac_top_init_gNB(void);
|
||||||
@@ -163,6 +161,11 @@ int configure_fapi_dl_pdu_phytest(int Mod_id,
|
|||||||
uint16_t *rbSize,
|
uint16_t *rbSize,
|
||||||
uint16_t *rbStart);
|
uint16_t *rbStart);
|
||||||
|
|
||||||
|
void nr_rx_acknack(nfapi_nr_uci_pusch_pdu_t *uci_pusch,
|
||||||
|
nfapi_nr_uci_pucch_pdu_format_0_1_t *uci_01,
|
||||||
|
nfapi_nr_uci_pucch_pdu_format_2_3_4_t *uci_234,
|
||||||
|
NR_UL_IND_t *UL_info, NR_UE_sched_ctrl_t *sched_ctrl, NR_mac_stats_t *stats);
|
||||||
|
|
||||||
void config_uldci(NR_BWP_Uplink_t *ubwp,
|
void config_uldci(NR_BWP_Uplink_t *ubwp,
|
||||||
nfapi_nr_pusch_pdu_t *pusch_pdu,
|
nfapi_nr_pusch_pdu_t *pusch_pdu,
|
||||||
nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu_rel15,
|
nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu_rel15,
|
||||||
@@ -198,12 +201,23 @@ void nr_schedule_pucch(int Mod_idP,
|
|||||||
frame_t frameP,
|
frame_t frameP,
|
||||||
sub_frame_t slotP);
|
sub_frame_t slotP);
|
||||||
|
|
||||||
void nr_update_pucch_scheduling(int Mod_idP,
|
void nr_csi_meas_reporting(int Mod_idP,
|
||||||
int UE_id,
|
int UE_id,
|
||||||
frame_t frameP,
|
frame_t frameP,
|
||||||
sub_frame_t slotP,
|
sub_frame_t slotP,
|
||||||
int slots_per_tdd,
|
int slots_per_tdd,
|
||||||
int *pucch_id);
|
int ul_slots,
|
||||||
|
int n_slots_frame);
|
||||||
|
|
||||||
|
void nr_acknack_scheduling(int Mod_idP,
|
||||||
|
int UE_id,
|
||||||
|
frame_t frameP,
|
||||||
|
sub_frame_t slotP,
|
||||||
|
int slots_per_tdd,
|
||||||
|
int *pucch_id,
|
||||||
|
int *pucch_occ);
|
||||||
|
|
||||||
|
int get_pucch_resource(NR_UE_info_t *UE_info,int UE_id,int k,int l);
|
||||||
|
|
||||||
void get_pdsch_to_harq_feedback(int Mod_idP,
|
void get_pdsch_to_harq_feedback(int Mod_idP,
|
||||||
int UE_id,
|
int UE_id,
|
||||||
@@ -232,10 +246,11 @@ int nr_is_dci_opportunity(nfapi_nr_search_space_t search_space,
|
|||||||
void nr_configure_pucch(nfapi_nr_pucch_pdu_t* pucch_pdu,
|
void nr_configure_pucch(nfapi_nr_pucch_pdu_t* pucch_pdu,
|
||||||
NR_ServingCellConfigCommon_t *scc,
|
NR_ServingCellConfigCommon_t *scc,
|
||||||
NR_BWP_Uplink_t *bwp,
|
NR_BWP_Uplink_t *bwp,
|
||||||
|
uint16_t rnti,
|
||||||
uint8_t pucch_resource,
|
uint8_t pucch_resource,
|
||||||
uint16_t O_uci,
|
uint16_t O_csi,
|
||||||
uint16_t O_ack,
|
uint16_t O_ack,
|
||||||
uint8_t SR_flag);
|
uint8_t O_sr);
|
||||||
|
|
||||||
void find_search_space(int ss_type,
|
void find_search_space(int ss_type,
|
||||||
NR_BWP_Downlink_t *bwp,
|
NR_BWP_Downlink_t *bwp,
|
||||||
@@ -320,6 +335,17 @@ int allocate_nr_CCEs(gNB_MAC_INST *nr_mac,
|
|||||||
int m,
|
int m,
|
||||||
int nr_of_candidates);
|
int nr_of_candidates);
|
||||||
|
|
||||||
|
uint16_t compute_pucch_prb_size(uint8_t format,
|
||||||
|
uint8_t nr_prbs,
|
||||||
|
uint16_t O_tot,
|
||||||
|
uint16_t O_csi,
|
||||||
|
NR_PUCCH_MaxCodeRate_t *maxCodeRate,
|
||||||
|
uint8_t Qm,
|
||||||
|
uint8_t n_symb,
|
||||||
|
uint8_t n_re_ctrl);
|
||||||
|
|
||||||
|
void compute_csi_bitlen (NR_CellGroupConfig_t *secondaryCellGroup, NR_UE_info_t *UE_info, int UE_id);
|
||||||
|
|
||||||
int get_dlscs(nfapi_nr_config_request_t *cfg);
|
int get_dlscs(nfapi_nr_config_request_t *cfg);
|
||||||
|
|
||||||
int get_ulscs(nfapi_nr_config_request_t *cfg);
|
int get_ulscs(nfapi_nr_config_request_t *cfg);
|
||||||
|
|||||||
@@ -274,10 +274,12 @@ typedef struct UE_info {
|
|||||||
typedef struct NR_sched_pucch {
|
typedef struct NR_sched_pucch {
|
||||||
int frame;
|
int frame;
|
||||||
int ul_slot;
|
int ul_slot;
|
||||||
|
bool sr_flag;
|
||||||
|
int csi_bits;
|
||||||
|
bool simultaneous_harqcsi;
|
||||||
uint8_t dai_c;
|
uint8_t dai_c;
|
||||||
uint8_t timing_indicator;
|
uint8_t timing_indicator;
|
||||||
uint8_t resource_indicator;
|
uint8_t resource_indicator;
|
||||||
bool active;
|
|
||||||
} NR_sched_pucch;
|
} NR_sched_pucch;
|
||||||
|
|
||||||
typedef struct NR_sched_pusch {
|
typedef struct NR_sched_pusch {
|
||||||
@@ -315,6 +317,25 @@ typedef struct NR_UE_ul_harq {
|
|||||||
NR_UL_harq_states_t state;
|
NR_UL_harq_states_t state;
|
||||||
} NR_UE_ul_harq_t;
|
} NR_UE_ul_harq_t;
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint8_t nb_ssbri_cri;
|
||||||
|
uint8_t cri_ssbri_bitlen;
|
||||||
|
uint8_t rsrp_bitlen;
|
||||||
|
uint8_t diff_rsrp_bitlen;
|
||||||
|
}CRI_SSBRI_RSRP_bitlen_t;
|
||||||
|
|
||||||
|
|
||||||
|
#define MAX_CSI_RESOURCE_SET_IN_CSI_RESOURCE_CONFIG 16
|
||||||
|
typedef struct nr_csi_report {
|
||||||
|
NR_CSI_ReportConfig__reportQuantity_PR reportQuantity_type;
|
||||||
|
NR_CSI_ResourceConfig__csi_RS_ResourceSetList_PR CSI_Resource_type;
|
||||||
|
uint8_t nb_of_nzp_csi_report;
|
||||||
|
uint8_t nb_of_csi_ssb_report;
|
||||||
|
CRI_SSBRI_RSRP_bitlen_t CSI_report_bitlen[MAX_CSI_RESOURCE_SET_IN_CSI_RESOURCE_CONFIG];
|
||||||
|
} nr_csi_report_t;
|
||||||
|
|
||||||
|
|
||||||
/*! \brief scheduling control information set through an API */
|
/*! \brief scheduling control information set through an API */
|
||||||
typedef struct {
|
typedef struct {
|
||||||
/// total amount of data awaiting for this UE
|
/// total amount of data awaiting for this UE
|
||||||
@@ -324,9 +345,10 @@ typedef struct {
|
|||||||
|
|
||||||
/// the currently active BWP in DL
|
/// the currently active BWP in DL
|
||||||
NR_BWP_Downlink_t *active_bwp;
|
NR_BWP_Downlink_t *active_bwp;
|
||||||
NR_sched_pucch *sched_pucch;
|
NR_sched_pucch **sched_pucch;
|
||||||
/// selected PUCCH index, if scheduled
|
/// selected PUCCH index, if scheduled
|
||||||
int pucch_sched_idx;
|
int pucch_sched_idx;
|
||||||
|
int pucch_occ_idx;
|
||||||
NR_sched_pusch *sched_pusch;
|
NR_sched_pusch *sched_pusch;
|
||||||
|
|
||||||
/// CCE index and aggregation, should be coherent with cce_list
|
/// CCE index and aggregation, should be coherent with cce_list
|
||||||
@@ -385,9 +407,11 @@ typedef struct {
|
|||||||
} NR_UE_list_t;
|
} NR_UE_list_t;
|
||||||
|
|
||||||
/*! \brief UE list used by gNB to order UEs/CC for scheduling*/
|
/*! \brief UE list used by gNB to order UEs/CC for scheduling*/
|
||||||
|
#define MAX_CSI_REPORTCONFIG 48
|
||||||
typedef struct {
|
typedef struct {
|
||||||
DLSCH_PDU DLSCH_pdu[4][MAX_MOBILES_PER_GNB];
|
DLSCH_PDU DLSCH_pdu[4][MAX_MOBILES_PER_GNB];
|
||||||
/// scheduling control info
|
/// scheduling control info
|
||||||
|
nr_csi_report_t csi_report_template[MAX_MOBILES_PER_GNB][MAX_CSI_REPORTCONFIG];
|
||||||
NR_UE_sched_ctrl_t UE_sched_ctrl[MAX_MOBILES_PER_GNB];
|
NR_UE_sched_ctrl_t UE_sched_ctrl[MAX_MOBILES_PER_GNB];
|
||||||
NR_mac_stats_t mac_stats[MAX_MOBILES_PER_GNB];
|
NR_mac_stats_t mac_stats[MAX_MOBILES_PER_GNB];
|
||||||
NR_UE_list_t list;
|
NR_UE_list_t list;
|
||||||
|
|||||||
@@ -996,17 +996,7 @@ pdcp_data_ind(
|
|||||||
* TODO: be sure of this
|
* TODO: be sure of this
|
||||||
*/
|
*/
|
||||||
if (NFAPI_MODE == NFAPI_UE_STUB_PNF ) {
|
if (NFAPI_MODE == NFAPI_UE_STUB_PNF ) {
|
||||||
#ifdef UESIM_EXPANSION
|
|
||||||
|
|
||||||
if (UE_NAS_USE_TUN) {
|
|
||||||
pdcpHead->inst = ctxt_pP->module_id;
|
|
||||||
} else {
|
|
||||||
pdcpHead->inst = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
pdcpHead->inst = ctxt_pP->module_id;
|
pdcpHead->inst = ctxt_pP->module_id;
|
||||||
#endif
|
|
||||||
} else { // nfapi_mode
|
} else { // nfapi_mode
|
||||||
if (UE_NAS_USE_TUN) {
|
if (UE_NAS_USE_TUN) {
|
||||||
pdcpHead->inst = ctxt_pP->module_id;
|
pdcpHead->inst = ctxt_pP->module_id;
|
||||||
@@ -2287,7 +2277,7 @@ uint64_t pdcp_module_init( uint64_t pdcp_optmask ) {
|
|||||||
nas_getparams();
|
nas_getparams();
|
||||||
|
|
||||||
if(UE_NAS_USE_TUN) {
|
if(UE_NAS_USE_TUN) {
|
||||||
int num_if = (NFAPI_MODE == NFAPI_UE_STUB_PNF || IS_SOFTMODEM_SIML1 )?MAX_NUMBER_NETIF:1;
|
int num_if = (NFAPI_MODE == NFAPI_UE_STUB_PNF || IS_SOFTMODEM_SIML1 )? MAX_MOBILES_PER_ENB : 1;
|
||||||
netlink_init_tun("ue",num_if);
|
netlink_init_tun("ue",num_if);
|
||||||
if (IS_SOFTMODEM_NOS1)
|
if (IS_SOFTMODEM_NOS1)
|
||||||
nas_config(1, 1, 2, "ue");
|
nas_config(1, 1, 2, "ue");
|
||||||
|
|||||||
@@ -53,9 +53,6 @@ typedef rlc_op_status_t (*send_rlc_data_req_func_t)(const protocol_ctxt_t *cons
|
|||||||
typedef boolean_t (*pdcp_data_ind_func_t)( const protocol_ctxt_t *, const srb_flag_t,
|
typedef boolean_t (*pdcp_data_ind_func_t)( const protocol_ctxt_t *, const srb_flag_t,
|
||||||
const MBMS_flag_t, const rb_id_t, const sdu_size_t,
|
const MBMS_flag_t, const rb_id_t, const sdu_size_t,
|
||||||
mem_block_t *,const uint32_t *const, const uint32_t *const);
|
mem_block_t *,const uint32_t *const, const uint32_t *const);
|
||||||
/* maximum number of tun interfaces that will be created to emulates UEs */
|
|
||||||
/* UEs beyond that will be multiplexed on the same tun */
|
|
||||||
#define MAX_NUMBER_NETIF 16
|
|
||||||
|
|
||||||
#define ENB_NAS_USE_TUN_W_MBMS_BIT (1<< 10)
|
#define ENB_NAS_USE_TUN_W_MBMS_BIT (1<< 10)
|
||||||
#define PDCP_USE_NETLINK_BIT (1<< 11)
|
#define PDCP_USE_NETLINK_BIT (1<< 11)
|
||||||
|
|||||||
@@ -86,12 +86,6 @@ extern struct msghdr nas_msg_rx;
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef UESIM_EXPANSION
|
|
||||||
extern uint16_t inst_pdcp_list[NUMBER_OF_UE_MAX];
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# include "gtpv1u_eNB_task.h"
|
# include "gtpv1u_eNB_task.h"
|
||||||
# include "gtpv1u_eNB_defs.h"
|
# include "gtpv1u_eNB_defs.h"
|
||||||
|
|
||||||
@@ -503,11 +497,7 @@ int pdcp_fifo_read_input_sdus_fromnetlinksock (const protocol_ctxt_t *const ctx
|
|||||||
}
|
}
|
||||||
} else { // ctxt.enb_flag => UE
|
} else { // ctxt.enb_flag => UE
|
||||||
if (NFAPI_MODE == NFAPI_UE_STUB_PNF) {
|
if (NFAPI_MODE == NFAPI_UE_STUB_PNF) {
|
||||||
#ifdef UESIM_EXPANSION
|
|
||||||
ctxt.module_id = inst_pdcp_list[pdcp_read_header_g.inst];
|
|
||||||
#else
|
|
||||||
ctxt.module_id = pdcp_read_header_g.inst;
|
ctxt.module_id = pdcp_read_header_g.inst;
|
||||||
#endif
|
|
||||||
} else {
|
} else {
|
||||||
ctxt.module_id = 0;
|
ctxt.module_id = 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -368,7 +368,7 @@ uint64_t pdcp_module_init(uint64_t _pdcp_optmask)
|
|||||||
nas_getparams();
|
nas_getparams();
|
||||||
|
|
||||||
if(UE_NAS_USE_TUN) {
|
if(UE_NAS_USE_TUN) {
|
||||||
int num_if = (NFAPI_MODE == NFAPI_UE_STUB_PNF || IS_SOFTMODEM_SIML1 )?MAX_NUMBER_NETIF:1;
|
int num_if = (NFAPI_MODE == NFAPI_UE_STUB_PNF || IS_SOFTMODEM_SIML1 )? MAX_MOBILES_PER_ENB : 1;
|
||||||
netlink_init_tun("ue",num_if);
|
netlink_init_tun("ue",num_if);
|
||||||
//Add --nr-ip-over-lte option check for next line
|
//Add --nr-ip-over-lte option check for next line
|
||||||
if (IS_SOFTMODEM_NOS1)
|
if (IS_SOFTMODEM_NOS1)
|
||||||
|
|||||||
@@ -922,6 +922,7 @@ static missing_data_t next_missing(nr_rlc_entity_am_t *entity,
|
|||||||
*/
|
*/
|
||||||
ret.sn_start = entity->rx_next;
|
ret.sn_start = entity->rx_next;
|
||||||
ret.so_start = 0;
|
ret.so_start = 0;
|
||||||
|
ret.next = cur;
|
||||||
goto set_end_different_sdu;
|
goto set_end_different_sdu;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -287,18 +287,6 @@ ue_ip_common_ip2wireless(
|
|||||||
printk("[UE_IP_DRV][%s] Dest %d.%d.%d.%d\n",__FUNCTION__, dst_addr[0],dst_addr[1],dst_addr[2],dst_addr[3]);
|
printk("[UE_IP_DRV][%s] Dest %d.%d.%d.%d\n",__FUNCTION__, dst_addr[0],dst_addr[1],dst_addr[2],dst_addr[3]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// modify inst by IP address for the U-Plane of multiple UEs while L2 fapi simulator start
|
|
||||||
#ifdef UESIM_EXPANSION
|
|
||||||
|
|
||||||
if ((src_addr[3] - 2)> instP) {
|
|
||||||
pdcph.inst = src_addr[3] - 2;
|
|
||||||
printk("[UE_IP_DRV] change INST from %d to %d\n",instP, pdcph.inst);
|
|
||||||
instP = src_addr[3] - 2;
|
|
||||||
priv_p=netdev_priv(ue_ip_dev[instP]);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
// modify inst by IP address for the U-Plane of multiple UEs while L2 fapi simulator end
|
|
||||||
//get Ipv4 address and pass to PCDP header
|
//get Ipv4 address and pass to PCDP header
|
||||||
printk("[UE_IP_DRV] source Id: 0x%08x\n",pdcph.sourceL2Id );
|
printk("[UE_IP_DRV] source Id: 0x%08x\n",pdcph.sourceL2Id );
|
||||||
printk("[UE_IP_DRV] destinationL2Id Id: 0x%08x\n",pdcph.destinationL2Id );
|
printk("[UE_IP_DRV] destinationL2Id Id: 0x%08x\n",pdcph.destinationL2Id );
|
||||||
|
|||||||
@@ -79,6 +79,44 @@ void handle_nr_rach(NR_UL_IND_t *UL_info) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void handle_nr_uci(NR_UL_IND_t *UL_info, NR_UE_sched_ctrl_t *sched_ctrl, NR_mac_stats_t *stats, int target_snrx10) {
|
||||||
|
|
||||||
|
int num_ucis = UL_info->uci_ind.num_ucis;
|
||||||
|
nfapi_nr_uci_t *uci_list = UL_info->uci_ind.uci_list;
|
||||||
|
|
||||||
|
for (int i = 0; i < num_ucis; i++) {
|
||||||
|
switch (uci_list[i].pdu_type) {
|
||||||
|
case NFAPI_NR_UCI_PUSCH_PDU_TYPE: break;
|
||||||
|
|
||||||
|
case NFAPI_NR_UCI_FORMAT_0_1_PDU_TYPE: {
|
||||||
|
nfapi_nr_uci_pucch_pdu_format_0_1_t *uci_pdu = &uci_list[i].pucch_pdu_format_0_1;
|
||||||
|
|
||||||
|
// tpc (power control)
|
||||||
|
sched_ctrl->tpc1 = nr_get_tpc(target_snrx10,uci_pdu->ul_cqi,30);
|
||||||
|
|
||||||
|
if( (uci_pdu->pduBitmap>>1) & 0x01)
|
||||||
|
nr_rx_acknack(NULL,uci_pdu,NULL,UL_info,sched_ctrl,stats);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case NFAPI_NR_UCI_FORMAT_2_3_4_PDU_TYPE: {
|
||||||
|
nfapi_nr_uci_pucch_pdu_format_2_3_4_t *uci_pdu = &uci_list[i].pucch_pdu_format_2_3_4;
|
||||||
|
|
||||||
|
// tpc (power control)
|
||||||
|
sched_ctrl->tpc1 = nr_get_tpc(target_snrx10,uci_pdu->ul_cqi,30);
|
||||||
|
|
||||||
|
if( (uci_pdu->pduBitmap>>1) & 0x01)
|
||||||
|
nr_rx_acknack(NULL,NULL,uci_pdu,UL_info,sched_ctrl,stats);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
UL_info->uci_ind.num_ucis = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void handle_nr_ulsch(NR_UL_IND_t *UL_info, NR_UE_sched_ctrl_t *sched_ctrl, NR_mac_stats_t *stats) {
|
void handle_nr_ulsch(NR_UL_IND_t *UL_info, NR_UE_sched_ctrl_t *sched_ctrl, NR_mac_stats_t *stats) {
|
||||||
|
|
||||||
if(nfapi_mode == 1) {
|
if(nfapi_mode == 1) {
|
||||||
|
|||||||
@@ -82,6 +82,7 @@
|
|||||||
|
|
||||||
#include "executables/softmodem-common.h"
|
#include "executables/softmodem-common.h"
|
||||||
#include <openair2/RRC/NR/rrc_gNB_UE_context.h>
|
#include <openair2/RRC/NR/rrc_gNB_UE_context.h>
|
||||||
|
#include "x2ap_eNB.h"
|
||||||
|
|
||||||
//#define XER_PRINT
|
//#define XER_PRINT
|
||||||
|
|
||||||
@@ -317,8 +318,10 @@ void nr_rrc_subframe_process(protocol_ctxt_t *const ctxt_pP, const int CC_id) {
|
|||||||
MessageDef *msg;
|
MessageDef *msg;
|
||||||
|
|
||||||
/* send a tick to x2ap */
|
/* send a tick to x2ap */
|
||||||
msg = itti_alloc_new_message(TASK_RRC_ENB, X2AP_SUBFRAME_PROCESS);
|
if (is_x2ap_enabled()){
|
||||||
itti_send_msg_to_task(TASK_X2AP, ctxt_pP->module_id, msg);
|
msg = itti_alloc_new_message(TASK_RRC_ENB, X2AP_SUBFRAME_PROCESS);
|
||||||
|
itti_send_msg_to_task(TASK_X2AP, ctxt_pP->module_id, msg);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
///---------------------------------------------------------------------------------------------------------------///
|
///---------------------------------------------------------------------------------------------------------------///
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -55,10 +55,6 @@ Description Defines functions used to handle EPS bearer contexts.
|
|||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
#ifdef UESIM_EXPANSION
|
|
||||||
#include "openairinterface5g_limits.h"
|
|
||||||
extern uint16_t inst_pdcp_list[NUMBER_OF_UE_MAX];
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
/**************** E X T E R N A L D E F I N I T I O N S ****************/
|
/**************** E X T E R N A L D E F I N I T I O N S ****************/
|
||||||
@@ -200,7 +196,7 @@ int esm_ebr_context_create(
|
|||||||
char *tmp = NULL;
|
char *tmp = NULL;
|
||||||
char ipv4_addr[INET_ADDRSTRLEN];
|
char ipv4_addr[INET_ADDRSTRLEN];
|
||||||
//char ipv6_addr[INET6_ADDRSTRLEN];
|
//char ipv6_addr[INET6_ADDRSTRLEN];
|
||||||
char *netmask = NULL;
|
int netmask = 32;
|
||||||
char broadcast[INET_ADDRSTRLEN];
|
char broadcast[INET_ADDRSTRLEN];
|
||||||
struct in_addr in_addr;
|
struct in_addr in_addr;
|
||||||
char command_line[500];
|
char command_line[500];
|
||||||
@@ -227,7 +223,7 @@ int esm_ebr_context_create(
|
|||||||
strcpy(ipv4_addr, tmp);
|
strcpy(ipv4_addr, tmp);
|
||||||
|
|
||||||
if (IN_CLASSA(ntohl(in_addr.s_addr))) {
|
if (IN_CLASSA(ntohl(in_addr.s_addr))) {
|
||||||
netmask = "255.0.0.0";
|
netmask = 8;
|
||||||
in_addr.s_addr = pdn->ip_addr[0] << 24 |
|
in_addr.s_addr = pdn->ip_addr[0] << 24 |
|
||||||
((255 << 16) & 0x00FF0000) |
|
((255 << 16) & 0x00FF0000) |
|
||||||
((255 << 8) & 0x0000FF00) |
|
((255 << 8) & 0x0000FF00) |
|
||||||
@@ -239,7 +235,7 @@ int esm_ebr_context_create(
|
|||||||
// in_addr.s_addr);
|
// in_addr.s_addr);
|
||||||
strcpy(broadcast, tmp);
|
strcpy(broadcast, tmp);
|
||||||
} else if (IN_CLASSB(ntohl(in_addr.s_addr))) {
|
} else if (IN_CLASSB(ntohl(in_addr.s_addr))) {
|
||||||
netmask = "255.255.0.0";
|
netmask = 16;
|
||||||
in_addr.s_addr = pdn->ip_addr[0] << 24 |
|
in_addr.s_addr = pdn->ip_addr[0] << 24 |
|
||||||
((pdn->ip_addr[1] << 16) & 0x00FF0000) |
|
((pdn->ip_addr[1] << 16) & 0x00FF0000) |
|
||||||
((255 << 8) & 0x0000FF00) |
|
((255 << 8) & 0x0000FF00) |
|
||||||
@@ -251,7 +247,7 @@ int esm_ebr_context_create(
|
|||||||
// in_addr.s_addr);
|
// in_addr.s_addr);
|
||||||
strcpy(broadcast, tmp);
|
strcpy(broadcast, tmp);
|
||||||
} else if (IN_CLASSC(ntohl(in_addr.s_addr))) {
|
} else if (IN_CLASSC(ntohl(in_addr.s_addr))) {
|
||||||
netmask = "255.255.255.0";
|
netmask = 24;
|
||||||
in_addr.s_addr = pdn->ip_addr[0] << 24 |
|
in_addr.s_addr = pdn->ip_addr[0] << 24 |
|
||||||
((pdn->ip_addr[1] << 16) & 0x00FF0000) |
|
((pdn->ip_addr[1] << 16) & 0x00FF0000) |
|
||||||
((pdn->ip_addr[2] << 8) & 0x0000FF00) |
|
((pdn->ip_addr[2] << 8) & 0x0000FF00) |
|
||||||
@@ -263,56 +259,23 @@ int esm_ebr_context_create(
|
|||||||
// in_addr.s_addr);
|
// in_addr.s_addr);
|
||||||
strcpy(broadcast, tmp);
|
strcpy(broadcast, tmp);
|
||||||
} else {
|
} else {
|
||||||
netmask = "255.255.255.255";
|
netmask = 32;
|
||||||
strcpy(broadcast, ipv4_addr);
|
strcpy(broadcast, ipv4_addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(NFAPI_MODE==NFAPI_UE_STUB_PNF) {
|
res = sprintf(command_line,
|
||||||
// this is for L2 FAPI simulator.
|
"ip address add %s/%d broadcast %s dev %s%d && "
|
||||||
// change for multiple UE's like 256UEs.
|
"ip link set %s%d up && "
|
||||||
// if it's made too many tables , OS may crush so we use one table.
|
"ip rule add from %s/32 table %d && "
|
||||||
if(PDCP_USE_NETLINK) {
|
"ip rule add to %s/32 table %d && "
|
||||||
#ifdef UESIM_EXPANSION
|
"ip route add default dev %s%d table %d",
|
||||||
uint16_t inst_nic = (pdn->ip_addr[3] & 0x000000FF) - 2;
|
ipv4_addr, netmask, broadcast,
|
||||||
res = sprintf(command_line,
|
UE_NAS_USE_TUN ? "oaitun_ue" : "oip", ueid + 1,
|
||||||
"ifconfig %s%d %s netmask %s broadcast %s up && "
|
UE_NAS_USE_TUN ? "oaitun_ue" : "oip", ueid + 1,
|
||||||
"ip rule add from %s/24 table %d && "
|
ipv4_addr, ueid + 10000,
|
||||||
"ip rule add to %s/24 table %d && "
|
ipv4_addr, ueid + 10000,
|
||||||
"ip route add default dev %s%d table %d",
|
UE_NAS_USE_TUN ? "oaitun_ue" : "oip",
|
||||||
UE_NAS_USE_TUN?"oaitun_ue":"oip",
|
ueid + 1, ueid + 10000);
|
||||||
inst_nic + 1, ipv4_addr, netmask, broadcast,
|
|
||||||
ipv4_addr, 201,
|
|
||||||
ipv4_addr, 201,
|
|
||||||
UE_NAS_USE_TUN?"oaitun_ue":"oip",
|
|
||||||
inst_nic + 1, 201);
|
|
||||||
inst_pdcp_list[inst_nic] = ueid;
|
|
||||||
#else
|
|
||||||
res = sprintf(command_line,
|
|
||||||
"ifconfig %s%d %s netmask %s broadcast %s up && "
|
|
||||||
"ip rule add from %s/32 table %d && "
|
|
||||||
"ip rule add to %s/32 table %d && "
|
|
||||||
"ip route add default dev %s%d table %d",
|
|
||||||
UE_NAS_USE_TUN?"oaitun_ue":"oip",
|
|
||||||
ueid + 1, ipv4_addr, netmask, broadcast,
|
|
||||||
ipv4_addr, ueid + 201,
|
|
||||||
ipv4_addr, ueid + 201,
|
|
||||||
UE_NAS_USE_TUN?"oaitun_ue":"oip",
|
|
||||||
ueid + 1, ueid + 201);
|
|
||||||
#endif
|
|
||||||
} // PDCP_USE_NETLINK
|
|
||||||
} else {
|
|
||||||
res = sprintf(command_line,
|
|
||||||
"ifconfig %s%d %s netmask %s broadcast %s up && "
|
|
||||||
"ip rule add from %s/32 table %d && "
|
|
||||||
"ip rule add to %s/32 table %d && "
|
|
||||||
"ip route add default dev %s%d table %d",
|
|
||||||
UE_NAS_USE_TUN?"oaitun_ue":"oip",
|
|
||||||
ueid + 1, ipv4_addr, netmask, broadcast,
|
|
||||||
ipv4_addr, ueid + 201,
|
|
||||||
ipv4_addr, ueid + 201,
|
|
||||||
UE_NAS_USE_TUN?"oaitun_ue":"oip",
|
|
||||||
ueid + 1, ueid + 201);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( res<0 ) {
|
if ( res<0 ) {
|
||||||
LOG_TRACE(WARNING, "ESM-PROC - Failed to system command string");
|
LOG_TRACE(WARNING, "ESM-PROC - Failed to system command string");
|
||||||
|
|||||||
@@ -0,0 +1,107 @@
|
|||||||
|
<table style="border-collapse: collapse; border: none;">
|
||||||
|
<tr style="border-collapse: collapse; border: none;">
|
||||||
|
<td style="border-collapse: collapse; border: none;">
|
||||||
|
<a href="http://www.openairinterface.org/">
|
||||||
|
<img src="../doc/images/oai_final_logo.png" alt="" border=3 height=50 width=150>
|
||||||
|
</img>
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
<td style="border-collapse: collapse; border: none; vertical-align: center;">
|
||||||
|
<b><font size = "5">OpenShift Build and Usage Procedures</font></b>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
-----
|
||||||
|
|
||||||
|
**CAUTION: this is experimental. Still a lot to be done.**
|
||||||
|
|
||||||
|
-----
|
||||||
|
|
||||||
|
# 1. Build pre-requisites #
|
||||||
|
|
||||||
|
To build our RAN images, we SHALL use the `codeready-builder-for-rhel-8-x86_64-rpms` repository with all the proper development libraries.
|
||||||
|
|
||||||
|
This repository is not directly accessible from the UBI RHEL8 image (`registry.access.redhat.com/ubi8/ubi:latest`).
|
||||||
|
|
||||||
|
So we need to copy from a register RHEL8 machine certificates and subsccription manager configuration files.
|
||||||
|
|
||||||
|
SO on a `RHEL8` physical machine (or a virtual machine) connected to the OpenShift Cluster, recover the entitlement and the RH subscription manager configs:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
oc create configmap rhsm-conf --from-file /etc/rhsm/rhsm.conf
|
||||||
|
oc create configmap rhsm-ca --from-file /etc/rhsm/ca/redhat-uep.pem
|
||||||
|
|
||||||
|
oc create secret generic etc-pki-entitlement --from-file /etc/pki/entitlement/{NUMBER_ON_YOUR_COMPUTER}.pem --from-file /etc/pki/entitlement/{NUMBER_ON_YOUR_COMPUTER}-key.pem
|
||||||
|
```
|
||||||
|
|
||||||
|
These configmaps and secret will be shared by all the build configs in your OC project. No need to do it each time.
|
||||||
|
|
||||||
|
**CAUTION: these files expire every month or so. If you have done a build on your OC project and try again a few weeks later, you may need to re-copy them**.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
oc delete secret etc-pki-entitlement
|
||||||
|
oc delete cm rhsm-conf
|
||||||
|
oc delete cm rhsm-ca
|
||||||
|
```
|
||||||
|
|
||||||
|
**LAST POINT: your OC project SHALL be `oai`.**
|
||||||
|
|
||||||
|
# 2. Build the Builder shared image #
|
||||||
|
|
||||||
|
In our Eurecom/OSA environment we need to pass a GIT proxy.
|
||||||
|
|
||||||
|
2 things are impacted by this situation:
|
||||||
|
|
||||||
|
* In `openshift/oai-ran-rh8-build-config.yml` file
|
||||||
|
* `httpProxy: http://proxy.eurecom.fr:8080`
|
||||||
|
* `httpsProxy: https://proxy.eurecom.fr:8080`
|
||||||
|
* Add a environment variable to the build config
|
||||||
|
|
||||||
|
```bash
|
||||||
|
oc apply -f openshift/oai-ran-rh8-image-stream.yml
|
||||||
|
oc apply -f openshift/oai-ran-rh8-build-config.yml
|
||||||
|
oc set env bc/oai-ran-rhel8-build-config NEEDED_GIT_PROXY=http://proxy.eurecom.fr:8080
|
||||||
|
oc start-build oai-ran-rhel8-build-config --follow
|
||||||
|
```
|
||||||
|
|
||||||
|
In case you do NOT require a GIT proxy: **you SHALL remove the 2 lines in `openshift/oai-ran-rh8-build-config.yml` file.**
|
||||||
|
|
||||||
|
And no need to add a `NEEDED_GIT_PROXY` variable to the build config.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
oc apply -f openshift/oai-ran-rh8-image-stream.yml
|
||||||
|
oc apply -f openshift/modified-oai-ran-rh8-build-config.yml
|
||||||
|
oc start-build oai-ran-rhel8-build-config --follow
|
||||||
|
```
|
||||||
|
|
||||||
|
After a while it should be successful.
|
||||||
|
|
||||||
|
# 3. Build an OAI target image #
|
||||||
|
|
||||||
|
For the example the eNB:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
oc apply -f openshift/oai-enb-rh8-image-stream.yml
|
||||||
|
oc apply -f openshift/oai-enb-rh8-build-config.yml
|
||||||
|
oc start-build oai-enb-rh8-build-config --follow
|
||||||
|
```
|
||||||
|
|
||||||
|
**CAUTION: if you are pushing modifications to the branch you are using, it won't be taken into account besides the Dockerfile.**
|
||||||
|
|
||||||
|
**Because the source files are copied during the shared image creation.**
|
||||||
|
|
||||||
|
**Only way to regenerate images w/ modified source code is to re-start from step #2.**
|
||||||
|
|
||||||
|
# 4. Deployment using HELM charts #
|
||||||
|
|
||||||
|
**CAUTION: even more experimental.**
|
||||||
|
|
||||||
|
Helm charts are located in another repository:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git clone https://github.com/OPENAIRINTERFACE/openair-k8s.git
|
||||||
|
cd openair-k8s
|
||||||
|
git checkout helm-deployment-S6a-S1C-S1U-in-network-18-with-enb
|
||||||
|
helm install mme /path-to-your-cloned/openair-k8s/charts/oai-mme/
|
||||||
|
```
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
oc apply -f openshift/oai-enb-image-stream.yml
|
|
||||||
oc apply -f openshift/oai-enb-build-config.yml
|
|
||||||
oc set env bc/oai-enb-build-config NEEDED_GIT_PROXY=http://proxy.eurecom.fr:8080
|
|
||||||
oc start-build oai-enb-build-config --follow
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
oc apply -f openshift/oai-gnb-image-stream.yml
|
|
||||||
oc apply -f openshift/oai-gnb-build-config.yml
|
|
||||||
oc set env bc/oai-gnb-build-config NEEDED_GIT_PROXY=http://proxy.eurecom.fr:8080
|
|
||||||
oc start-build oai-gnb-build-config --follow
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
oc apply -f openshift/oai-ran-image-stream.yml
|
|
||||||
oc apply -f openshift/oai-ran-build-config.yml
|
|
||||||
oc set env bc/oai-ran-build-config NEEDED_GIT_PROXY=http://proxy.eurecom.fr:8080
|
|
||||||
oc start-build oai-ran-build-config --follow
|
|
||||||
@@ -8,23 +8,11 @@
|
|||||||
# define NUMBER_OF_NR_RU_MAX 2
|
# define NUMBER_OF_NR_RU_MAX 2
|
||||||
# ifndef PHYSIM
|
# ifndef PHYSIM
|
||||||
# ifndef UE_EXPANSION
|
# ifndef UE_EXPANSION
|
||||||
// TODO:L2 FAPI simulator.
|
|
||||||
// UESIM_EXPANSION is used to be same value of NUMBER_OF_UE_MAX
|
|
||||||
// in eNB and UE.
|
|
||||||
// now , if we use --mu option in UE, compiling error will occur.
|
|
||||||
// This problem will be fixed in the future.
|
|
||||||
# ifndef UESIM_EXPANSION
|
|
||||||
# define NUMBER_OF_UE_MAX 4
|
# define NUMBER_OF_UE_MAX 4
|
||||||
# define NUMBER_OF_NR_UE_MAX 4
|
# define NUMBER_OF_NR_UE_MAX 4
|
||||||
# define NUMBER_OF_UCI_VARS_MAX 14
|
# define NUMBER_OF_UCI_VARS_MAX 14
|
||||||
# define NUMBER_OF_CONNECTED_eNB_MAX 1
|
# define NUMBER_OF_CONNECTED_eNB_MAX 1
|
||||||
# define NUMBER_OF_CONNECTED_gNB_MAX 1
|
# define NUMBER_OF_CONNECTED_gNB_MAX 1
|
||||||
# else
|
|
||||||
# define NUMBER_OF_UE_MAX 256
|
|
||||||
# define NUMBER_OF_UCI_VARS_MAX 256
|
|
||||||
# define NUMBER_OF_CONNECTED_eNB_MAX 1
|
|
||||||
# define NUMBER_OF_CONNECTED_gNB_MAX 3
|
|
||||||
# endif
|
|
||||||
# else
|
# else
|
||||||
# define NUMBER_OF_UE_MAX 256
|
# define NUMBER_OF_UE_MAX 256
|
||||||
# define NUMBER_OF_UCI_VARS_MAX 256
|
# define NUMBER_OF_UCI_VARS_MAX 256
|
||||||
@@ -48,17 +36,10 @@ eNB process will exit because unexpected access happens.
|
|||||||
Now some parts are using NUMBER_OF_UE_MAX
|
Now some parts are using NUMBER_OF_UE_MAX
|
||||||
and the other are using MAX_MOBILES_PER_ENB in for-loop.
|
and the other are using MAX_MOBILES_PER_ENB in for-loop.
|
||||||
*/
|
*/
|
||||||
# ifndef UESIM_EXPANSION
|
|
||||||
# define NUMBER_OF_UE_MAX 16
|
# define NUMBER_OF_UE_MAX 16
|
||||||
# define NUMBER_OF_UCI_VARS_MAX 56
|
# define NUMBER_OF_UCI_VARS_MAX 56
|
||||||
# define NUMBER_OF_CONNECTED_eNB_MAX 3
|
# define NUMBER_OF_CONNECTED_eNB_MAX 3
|
||||||
# define NUMBER_OF_CONNECTED_gNB_MAX 3
|
# define NUMBER_OF_CONNECTED_gNB_MAX 3
|
||||||
# else
|
|
||||||
# define NUMBER_OF_UE_MAX 256
|
|
||||||
# define NUMBER_OF_UCI_VARS_MAX 256
|
|
||||||
# define NUMBER_OF_CONNECTED_eNB_MAX 1
|
|
||||||
# define NUMBER_OF_CONNECTED_gNB_MAX 3
|
|
||||||
# endif
|
|
||||||
# else
|
# else
|
||||||
# define NUMBER_OF_UE_MAX 256
|
# define NUMBER_OF_UE_MAX 256
|
||||||
# define NUMBER_OF_UCI_VARS_MAX 256
|
# define NUMBER_OF_UCI_VARS_MAX 256
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ gNBs =
|
|||||||
dl_carrierBandwidth = 106;
|
dl_carrierBandwidth = 106;
|
||||||
#initialDownlinkBWP
|
#initialDownlinkBWP
|
||||||
#genericParameters
|
#genericParameters
|
||||||
# this is RBstart=0,L=50 (275*(L-1))+RBstart
|
# this is RBstart=41,L=24 (275*(L-1))+RBstart
|
||||||
initialDLBWPlocationAndBandwidth = 6366;
|
initialDLBWPlocationAndBandwidth = 6366;
|
||||||
# subcarrierSpacing
|
# subcarrierSpacing
|
||||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
@@ -74,7 +74,7 @@ gNBs =
|
|||||||
|
|
||||||
initialDLBWPk0_3 = 0;
|
initialDLBWPk0_3 = 0;
|
||||||
initialDLBWPmappingType_3 = 0;
|
initialDLBWPmappingType_3 = 0;
|
||||||
#this is SS=1,L=4
|
#this is SS=1,L=5
|
||||||
initialDLBWPstartSymbolAndLength_3 = 57;
|
initialDLBWPstartSymbolAndLength_3 = 57;
|
||||||
|
|
||||||
#uplinkConfigCommon
|
#uplinkConfigCommon
|
||||||
@@ -126,27 +126,26 @@ gNBs =
|
|||||||
# SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
|
# SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
|
||||||
#
|
#
|
||||||
msg1_SubcarrierSpacing = 1,
|
msg1_SubcarrierSpacing = 1,
|
||||||
|
|
||||||
# restrictedSetConfig
|
# restrictedSetConfig
|
||||||
# 0=unrestricted, 1=restricted type A, 2=restricted type B
|
# 0=unrestricted, 1=restricted type A, 2=restricted type B
|
||||||
restrictedSetConfig = 0,
|
restrictedSetConfig = 0,
|
||||||
|
|
||||||
# pusch-ConfigCommon (up to 16 elements)
|
# pusch-ConfigCommon (up to 16 elements)
|
||||||
initialULBWPk2_0 = 6;
|
initialULBWPk2_0 = 6;
|
||||||
initialULBWPmappingType_0 = 1
|
initialULBWPmappingType_0 = 1
|
||||||
# this is SS=0 L=11
|
# this is SS=0 L=11
|
||||||
initialULBWPstartSymbolAndLength_0 = 55;
|
initialULBWPstartSymbolAndLength_0 = 55;
|
||||||
|
|
||||||
initialULBWPk2_1 = 6;
|
initialULBWPk2_1 = 6;
|
||||||
initialULBWPmappingType_1 = 1;
|
initialULBWPmappingType_1 = 1;
|
||||||
# this is SS=0 L=12
|
# this is SS=0 L=12
|
||||||
initialULBWPstartSymbolAndLength_1 = 69;
|
initialULBWPstartSymbolAndLength_1 = 69;
|
||||||
|
|
||||||
initialULBWPk2_2 = 7;
|
initialULBWPk2_2 = 7;
|
||||||
initialULBWPmappingType_2 = 1;
|
initialULBWPmappingType_2 = 1;
|
||||||
# this is SS=10 L=4
|
# this is SS=10 L=4
|
||||||
initialULBWPstartSymbolAndLength_2 = 52;
|
initialULBWPstartSymbolAndLength_2 = 52;
|
||||||
|
|
||||||
|
|
||||||
msg3_DeltaPreamble = 1;
|
msg3_DeltaPreamble = 1;
|
||||||
p0_NominalWithGrant =-90;
|
p0_NominalWithGrant =-90;
|
||||||
|
|
||||||
|
|||||||
@@ -95,9 +95,6 @@ pthread_mutex_t nfapi_sync_mutex;
|
|||||||
int nfapi_sync_var=-1; //!< protected by mutex \ref nfapi_sync_mutex
|
int nfapi_sync_var=-1; //!< protected by mutex \ref nfapi_sync_mutex
|
||||||
|
|
||||||
|
|
||||||
#ifdef UESIM_EXPANSION
|
|
||||||
uint16_t inst_pdcp_list[NUMBER_OF_UE_MAX];
|
|
||||||
#endif
|
|
||||||
uint16_t sf_ahead=2;
|
uint16_t sf_ahead=2;
|
||||||
int tddflag;
|
int tddflag;
|
||||||
char *emul_iface;
|
char *emul_iface;
|
||||||
@@ -546,9 +543,6 @@ void init_pdcp(void) {
|
|||||||
int main( int argc, char **argv ) {
|
int main( int argc, char **argv ) {
|
||||||
int CC_id;
|
int CC_id;
|
||||||
uint8_t abstraction_flag=0;
|
uint8_t abstraction_flag=0;
|
||||||
#ifdef UESIM_EXPANSION
|
|
||||||
memset(inst_pdcp_list, 0, sizeof(inst_pdcp_list));
|
|
||||||
#endif
|
|
||||||
// Default value for the number of UEs. It will hold,
|
// Default value for the number of UEs. It will hold,
|
||||||
// if not changed from the command line option --num-ues
|
// if not changed from the command line option --num-ues
|
||||||
NB_UE_INST=1;
|
NB_UE_INST=1;
|
||||||
|
|||||||
Reference in New Issue
Block a user