diff --git a/README.md b/README.md
index 7651aea5c9..62f8576e81 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
# OpenAirInterface License #
OpenAirInterface is under OpenAirInterface Software Alliance license.
diff --git a/ci-scripts/Jenkinsfile-GitLab-Container b/ci-scripts/Jenkinsfile-GitLab-Container
index a6621afe25..b413617580 100644
--- a/ci-scripts/Jenkinsfile-GitLab-Container
+++ b/ci-scripts/Jenkinsfile-GitLab-Container
@@ -262,6 +262,7 @@ pipeline {
echo "This is a MERGE event"
addGitLabMRComment comment: message
}
+ echo "Pipeline is SUCCESSFUL"
}
}
failure {
@@ -271,6 +272,7 @@ pipeline {
echo "This is a MERGE event"
addGitLabMRComment comment: message
}
+ echo "Pipeline FAILED"
}
}
}
diff --git a/ci-scripts/cls_containerize.py b/ci-scripts/cls_containerize.py
index 3e65f83e06..d0669b7665 100644
--- a/ci-scripts/cls_containerize.py
+++ b/ci-scripts/cls_containerize.py
@@ -195,6 +195,7 @@ class Containerize():
# the potential merge. Note that merge conflicts should already been checked earlier
imageTag = 'develop'
sharedTag = 'develop'
+ forceSharedImageBuild = False
if (self.ranAllowMerge):
imageTag = 'ci-temp'
if self.ranTargetBranch == '':
@@ -203,6 +204,13 @@ class Containerize():
else:
logging.debug('Merging with the target branch: ' + self.ranTargetBranch)
mySSH.command('git merge --ff origin/' + self.ranTargetBranch + ' -m "Temporary merge for CI"', '\$', 5)
+ mySSH.command('git diff HEAD..origin/develop -- docker/Dockerfile.ran' + self.dockerfileprefix + ' | grep -i INDEX', '\$', 5)
+ result = re.search('index', mySSH.getBefore())
+ if result is not None:
+ forceSharedImageBuild = True
+ sharedTag = 'ci-temp'
+ else:
+ forceSharedImageBuild = True
# if asterix, copy the entitlement and subscription manager configurations
if self.host == 'Red Hat':
@@ -214,13 +222,14 @@ class Containerize():
sharedimage = 'ran-build'
# Let's remove any previous run artifacts if still there
mySSH.command(self.cli + ' image prune --force', '\$', 30)
- if (not self.ranAllowMerge):
- mySSH.command(self.cli + ' image rm ' + sharedimage + ':' + sharedTag, '\$', 30)
+ if forceSharedImageBuild:
+ mySSH.command(self.cli + ' image rm ' + sharedimage + ':' + sharedTag + ' || true', '\$', 30)
for image,pattern in imageNames:
- mySSH.command(self.cli + ' image rm ' + image + ':' + imageTag, '\$', 30)
+ mySSH.command(self.cli + ' image rm ' + image + ':' + imageTag + ' || true', '\$', 30)
# Build the shared image only on Push Events (not on Merge Requests)
- if (not self.ranAllowMerge):
+ # On when the shared image docker file is being modified.
+ if forceSharedImageBuild:
mySSH.command(self.cli + ' build ' + self.cliBuildOptions + ' --target ' + sharedimage + ' --tag ' + sharedimage + ':' + sharedTag + ' --file docker/Dockerfile.ran' + self.dockerfileprefix + ' --build-arg NEEDED_GIT_PROXY="http://proxy.eurecom.fr:8080" . > cmake_targets/log/ran-build.log 2>&1', '\$', 1600)
# First verify if the shared image was properly created.
status = True
diff --git a/ci-scripts/conf_files/enb.band38.nsa_2x2.100PRB.usrpn310.conf b/ci-scripts/conf_files/enb.band38.nsa_2x2.100PRB.usrpn310.conf
index 7a9df04996..6c8d5ba6f0 100644
--- a/ci-scripts/conf_files/enb.band38.nsa_2x2.100PRB.usrpn310.conf
+++ b/ci-scripts/conf_files/enb.band38.nsa_2x2.100PRB.usrpn310.conf
@@ -6,7 +6,7 @@ eNBs =
(
{
////////// Identification parameters:
- eNB_ID = 0xe05;
+ eNB_ID = 0xe04;
cell_type = "CELL_MACRO_ENB";
diff --git a/ci-scripts/conf_files/gNB_SA_n78_106PRB.2x2_usrpn310.conf b/ci-scripts/conf_files/gNB_SA_n78_106PRB.2x2_usrpn310.conf
index c5a7c39d0d..9bf3136690 100644
--- a/ci-scripts/conf_files/gNB_SA_n78_106PRB.2x2_usrpn310.conf
+++ b/ci-scripts/conf_files/gNB_SA_n78_106PRB.2x2_usrpn310.conf
@@ -254,7 +254,6 @@ MACRLCs = (
tr_n_preference = "local_RRC";
pusch_TargetSNRx10 = 200;
pucch_TargetSNRx10 = 150;
- ulsch_max_slots_inactivity=20;
}
);
diff --git a/ci-scripts/conf_files/gNB_SA_n78_133PRB.2x2_usrpn310.conf b/ci-scripts/conf_files/gNB_SA_n78_133PRB.2x2_usrpn310.conf
index 9e24ac62cd..dfbbdf659d 100644
--- a/ci-scripts/conf_files/gNB_SA_n78_133PRB.2x2_usrpn310.conf
+++ b/ci-scripts/conf_files/gNB_SA_n78_133PRB.2x2_usrpn310.conf
@@ -251,7 +251,6 @@ MACRLCs = (
tr_n_preference = "local_RRC";
pusch_TargetSNRx10 = 200;
pucch_TargetSNRx10 = 150;
- ulsch_max_slots_inactivity=20;
}
);
diff --git a/ci-scripts/conf_files/gnb.band261.tm1.32PRB.usrpn300.conf b/ci-scripts/conf_files/gnb.band261.tm1.32PRB.usrpn300.conf
index 0e503188c5..1c62882406 100644
--- a/ci-scripts/conf_files/gnb.band261.tm1.32PRB.usrpn300.conf
+++ b/ci-scripts/conf_files/gnb.band261.tm1.32PRB.usrpn300.conf
@@ -228,9 +228,8 @@ MACRLCs = (
num_cc = 1;
tr_s_preference = "local_L1";
tr_n_preference = "local_RRC";
- ulsch_max_slots_inactivity = 1;
pusch_TargetSNRx10 = 200;
- pucch_TargetSNRx10 = 200;
+ pucch_TargetSNRx10 = 200;
}
);
diff --git a/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.usrpn310.conf b/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.usrpn310.conf
index 1cca2c9268..a5d35d450e 100644
--- a/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.usrpn310.conf
+++ b/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.usrpn310.conf
@@ -232,7 +232,6 @@ MACRLCs = (
tr_n_preference = "local_RRC";
pusch_TargetSNRx10 = 200;
pucch_TargetSNRx10 = 150;
- ulsch_max_slots_inactivity = 10;
}
);
diff --git a/ci-scripts/conf_files/gnb.band78.tm1.106PRB.usrpn300.conf b/ci-scripts/conf_files/gnb.band78.tm1.106PRB.usrpn300.conf
index aaf4190087..4f0f7c6b2e 100644
--- a/ci-scripts/conf_files/gnb.band78.tm1.106PRB.usrpn300.conf
+++ b/ci-scripts/conf_files/gnb.band78.tm1.106PRB.usrpn300.conf
@@ -211,7 +211,6 @@ MACRLCs = (
num_cc = 1;
tr_s_preference = "local_L1";
tr_n_preference = "local_RRC";
- ulsch_max_slots_inactivity = 1;
}
);
diff --git a/ci-scripts/epc.py b/ci-scripts/epc.py
index baae5644a1..8376e07fd5 100644
--- a/ci-scripts/epc.py
+++ b/ci-scripts/epc.py
@@ -66,6 +66,7 @@ class EPCManagement():
self.containerPrefix = 'prod'
self.mmeConfFile = 'mme.conf'
self.yamlPath = ''
+ self.isMagmaUsed = False
#-----------------------------------------------------------
@@ -164,7 +165,15 @@ class EPCManagement():
if re.match('OAI-Rel14-Docker', self.Type, re.IGNORECASE):
mySSH = SSH.SSHConnection()
mySSH.open(self.IPAddress, self.UserName, self.Password)
- mySSH.command('docker inspect --format="MME_IP_ADDR = {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}" ' + self.containerPrefix + '-oai-mme', '\$', 5)
+ self.isMagmaUsed = False
+ mySSH.command('docker ps -a', '\$', 5)
+ result = re.search('magma', mySSH.getBefore())
+ if result is not None:
+ self.isMagmaUsed = True
+ if self.isMagmaUsed:
+ mySSH.command('docker inspect --format="MME_IP_ADDR = {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}" ' + self.containerPrefix + '-magma-mme', '\$', 5)
+ else:
+ mySSH.command('docker inspect --format="MME_IP_ADDR = {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}" ' + self.containerPrefix + '-oai-mme', '\$', 5)
result = re.search('MME_IP_ADDR = (?P[0-9\.]+)', mySSH.getBefore())
if result is not None:
self.MmeIPAddress = result.group('mme_ip_addr')
@@ -289,7 +298,15 @@ class EPCManagement():
mySSH = SSH.SSHConnection()
mySSH.open(self.IPAddress, self.UserName, self.Password)
if re.match('OAI-Rel14-Docker', self.Type, re.IGNORECASE):
- mySSH.command('docker top ' + self.containerPrefix + '-oai-mme', '\$', 5)
+ self.isMagmaUsed = False
+ mySSH.command('docker ps -a', '\$', 5)
+ result = re.search('magma', mySSH.getBefore())
+ if result is not None:
+ self.isMagmaUsed = True
+ if self.isMagmaUsed:
+ mySSH.command('docker top ' + self.containerPrefix + '-magma-mme', '\$', 5)
+ else:
+ mySSH.command('docker top ' + self.containerPrefix + '-oai-mme', '\$', 5)
else:
mySSH.command('stdbuf -o0 ps -aux | grep --color=never mme | grep -v grep', '\$', 5)
if re.match('OAI-Rel14-Docker', self.Type, re.IGNORECASE):
@@ -489,6 +506,12 @@ class EPCManagement():
HTML.CreateHtmlTabFooter(False)
sys.exit('docker-compose not installed on ' + self.IPAddress)
+ # Checking if it is a MAGMA deployment
+ self.isMagmaUsed = False
+ if os.path.isfile('./' + self.yamlPath + '/redis_extern.conf'):
+ self.isMagmaUsed = True
+ logging.debug('MAGMA MME is used!')
+
mySSH.command('if [ -d ' + self.SourceCodePath + '/scripts ]; then echo ' + self.Password + ' | sudo -S rm -Rf ' + self.SourceCodePath + '/scripts ; fi', '\$', 5)
mySSH.command('if [ -d ' + self.SourceCodePath + '/logs ]; then echo ' + self.Password + ' | sudo -S rm -Rf ' + self.SourceCodePath + '/logs ; fi', '\$', 5)
mySSH.command('mkdir -p ' + self.SourceCodePath + '/scripts ' + self.SourceCodePath + '/logs', '\$', 5)
@@ -500,10 +523,15 @@ class EPCManagement():
# - docker-compose config | grep container_name
mySSH.command('cd ' + self.SourceCodePath + '/scripts', '\$', 5)
mySSH.copyout(self.IPAddress, self.UserName, self.Password, './' + self.yamlPath + '/docker-compose.yml', self.SourceCodePath + '/scripts')
+ if self.isMagmaUsed:
+ mySSH.copyout(self.IPAddress, self.UserName, self.Password, './' + self.yamlPath + '/entrypoint.sh', self.SourceCodePath + '/scripts')
+ mySSH.copyout(self.IPAddress, self.UserName, self.Password, './' + self.yamlPath + '/mme.conf', self.SourceCodePath + '/scripts')
+ mySSH.copyout(self.IPAddress, self.UserName, self.Password, './' + self.yamlPath + '/mme_fd.sprint.conf', self.SourceCodePath + '/scripts')
+ mySSH.copyout(self.IPAddress, self.UserName, self.Password, './' + self.yamlPath + '/redis_extern.conf', self.SourceCodePath + '/scripts')
+ mySSH.command('chmod a+x ' + self.SourceCodePath + '/scripts/entrypoint.sh', '\$', 5)
mySSH.command('wget --quiet --tries=3 --retry-connrefused https://raw.githubusercontent.com/OPENAIRINTERFACE/openair-hss/develop/src/hss_rel14/db/oai_db.cql', '\$', 30)
mySSH.command('docker-compose down', '\$', 60)
mySSH.command('docker-compose up -d db_init', '\$', 60)
-
# databases take time...
time.sleep(10)
cnt = 0
@@ -525,8 +553,12 @@ class EPCManagement():
# deploying EPC cNFs
mySSH.command('docker-compose up -d oai_spgwu', '\$', 60)
- listOfContainers = 'prod-cassandra prod-oai-hss prod-oai-mme prod-oai-spgwc prod-oai-spgwu-tiny'
- expectedHealthyContainers = 5
+ if self.isMagmaUsed:
+ listOfContainers = 'prod-cassandra prod-oai-hss prod-magma-mme prod-oai-spgwc prod-oai-spgwu-tiny prod-redis'
+ expectedHealthyContainers = 6
+ else:
+ listOfContainers = 'prod-cassandra prod-oai-hss prod-oai-mme prod-oai-spgwc prod-oai-spgwu-tiny'
+ expectedHealthyContainers = 5
# Checking for additional services
mySSH.command('docker-compose config', '\$', 5)
@@ -557,7 +589,10 @@ class EPCManagement():
logging.debug(' -- ' + str(startingNb) + ' still starting container(s)')
if healthyNb == expectedHealthyContainers:
mySSH.command('docker exec -d prod-oai-hss /bin/bash -c "nohup tshark -i any -f \'port 9042 or port 3868\' -w /tmp/hss_check_run.pcap 2>&1 > /dev/null"', '\$', 5)
- mySSH.command('docker exec -d prod-oai-mme /bin/bash -c "nohup tshark -i any -f \'port 3868 or port 2123 or port 36412\' -w /tmp/mme_check_run.pcap 2>&1 > /dev/null"', '\$', 10)
+ if self.isMagmaUsed:
+ mySSH.command('docker exec -d prod-magma-mme /bin/bash -c "nohup tshark -i any -f \'port 3868 or port 2123 or port 36412\' -w /tmp/mme_check_run.pcap 2>&1 > /dev/null"', '\$', 10)
+ else:
+ mySSH.command('docker exec -d prod-oai-mme /bin/bash -c "nohup tshark -i any -f \'port 3868 or port 2123 or port 36412\' -w /tmp/mme_check_run.pcap 2>&1 > /dev/null"', '\$', 10)
mySSH.command('docker exec -d prod-oai-spgwc /bin/bash -c "nohup tshark -i any -f \'port 2123 or port 8805\' -w /tmp/spgwc_check_run.pcap 2>&1 > /dev/null"', '\$', 10)
# on SPGW-U, not capturing on SGI to avoid huge file
mySSH.command('docker exec -d prod-oai-spgwu-tiny /bin/bash -c "nohup tshark -i any -f \'port 8805\' -w /tmp/spgwu_check_run.pcap 2>&1 > /dev/null"', '\$', 10)
@@ -575,24 +610,45 @@ class EPCManagement():
mySSH = SSH.SSHConnection()
mySSH.open(self.IPAddress, self.UserName, self.Password)
+ # Checking if it is a MAGMA deployment.
+ mySSH.command('cd ' + self.SourceCodePath + '/scripts', '\$', 5)
+ mySSH.command('docker-compose ps -a', '\$', 5)
+ self.isMagmaUsed = False
+ result = re.search('magma', mySSH.getBefore())
+ if result is not None:
+ self.isMagmaUsed = True
+ logging.debug('MAGMA MME is used!')
# Recovering logs and pcap files
mySSH.command('cd ' + self.SourceCodePath + '/logs', '\$', 5)
mySSH.command('docker exec -it prod-oai-hss /bin/bash -c "killall --signal SIGINT oai_hss tshark"', '\$', 5)
- mySSH.command('docker exec -it prod-oai-mme /bin/bash -c "killall --signal SIGINT tshark"', '\$', 5)
+ if self.isMagmaUsed:
+ mySSH.command('docker exec -it prod-magma-mme /bin/bash -c "killall --signal SIGINT tshark"', '\$', 5)
+ else:
+ mySSH.command('docker exec -it prod-oai-mme /bin/bash -c "killall --signal SIGINT tshark"', '\$', 5)
mySSH.command('docker exec -it prod-oai-spgwc /bin/bash -c "killall --signal SIGINT oai_spgwc tshark"', '\$', 5)
mySSH.command('docker exec -it prod-oai-spgwu-tiny /bin/bash -c "killall --signal SIGINT tshark"', '\$', 5)
mySSH.command('docker logs prod-oai-hss > hss_' + self.testCase_id + '.log', '\$', 5)
- mySSH.command('docker logs prod-oai-mme > mme_' + self.testCase_id + '.log', '\$', 5)
+ if self.isMagmaUsed:
+ mySSH.command('docker cp --follow-link prod-magma-mme:/var/log/mme.log mme_' + self.testCase_id + '.log', '\$', 15)
+ else:
+ mySSH.command('docker logs prod-oai-mme > mme_' + self.testCase_id + '.log', '\$', 5)
mySSH.command('docker logs prod-oai-spgwc > spgwc_' + self.testCase_id + '.log', '\$', 5)
mySSH.command('docker logs prod-oai-spgwu-tiny > spgwu_' + self.testCase_id + '.log', '\$', 5)
mySSH.command('docker cp prod-oai-hss:/tmp/hss_check_run.pcap hss_' + self.testCase_id + '.pcap', '\$', 60)
- mySSH.command('docker cp prod-oai-mme:/tmp/mme_check_run.pcap mme_' + self.testCase_id + '.pcap', '\$', 60)
+ if self.isMagmaUsed:
+ mySSH.command('docker cp prod-magma-mme:/tmp/mme_check_run.pcap mme_' + self.testCase_id + '.pcap', '\$', 60)
+ else:
+ mySSH.command('docker cp prod-oai-mme:/tmp/mme_check_run.pcap mme_' + self.testCase_id + '.pcap', '\$', 60)
mySSH.command('docker cp prod-oai-spgwc:/tmp/spgwc_check_run.pcap spgwc_' + self.testCase_id + '.pcap', '\$', 60)
mySSH.command('docker cp prod-oai-spgwu-tiny:/tmp/spgwu_check_run.pcap spgwu_' + self.testCase_id + '.pcap', '\$', 60)
# Remove all
mySSH.command('cd ' + self.SourceCodePath + '/scripts', '\$', 5)
- listOfContainers = 'prod-cassandra prod-oai-hss prod-oai-mme prod-oai-spgwc prod-oai-spgwu-tiny'
- nbContainers = 5
+ if self.isMagmaUsed:
+ listOfContainers = 'prod-cassandra prod-oai-hss prod-magma-mme prod-oai-spgwc prod-oai-spgwu-tiny prod-redis'
+ nbContainers = 6
+ else:
+ listOfContainers = 'prod-cassandra prod-oai-hss prod-oai-mme prod-oai-spgwc prod-oai-spgwu-tiny'
+ nbContainers = 5
# Checking for additional services
mySSH.command('docker-compose config', '\$', 5)
configResponse = mySSH.getBefore()
diff --git a/ci-scripts/xml_files/fr1_nsa_2x2_quectel.xml b/ci-scripts/xml_files/fr1_nsa_2x2_quectel.xml
index 12a6186403..16dfd1e377 100644
--- a/ci-scripts/xml_files/fr1_nsa_2x2_quectel.xml
+++ b/ci-scripts/xml_files/fr1_nsa_2x2_quectel.xml
@@ -21,10 +21,10 @@
-->
- TEST-NSA-FR1-TM2
+ TEST-NSA-FR1-TM2-Tab1
NSA 2x2 Ping DL UL with QUECTEL
tasks
- 1
+ 5
030000
040000
@@ -85,7 +85,7 @@
IdleSleep
Sleep
- 5
+ 60
diff --git a/ci-scripts/xml_files/fr1_nsa_2x2_quectel_attach_detach.xml b/ci-scripts/xml_files/fr1_nsa_2x2_quectel_attach_detach.xml
new file mode 100644
index 0000000000..ebb5c880d5
--- /dev/null
+++ b/ci-scripts/xml_files/fr1_nsa_2x2_quectel_attach_detach.xml
@@ -0,0 +1,145 @@
+
+
+ TEST-NSA-FR1-TM2-Tab2
+ NSA 2x2 Attach-Detach with QUECTEL
+ tasks
+ 5
+
+ 031000
+ 041000
+ 000002
+ 010000
+ 000001
+ 050000
+ 000002
+ 010004
+ 000002
+ 010003
+ 000001
+ 050000
+ 000002
+ 010004
+ 000002
+ 010003
+ 000001
+ 050000
+ 000002
+ 010002
+ 080001
+ 080000
+
+
+
+
+ Initialize_UE
+ Initialize Quectel
+ nrmodule2_quectel
+ yes
+
+
+
+
+ Terminate_UE
+ Terminate Quectel
+ nrmodule2_quectel
+
+
+
+ Attach_UE
+ Attach Quectel
+ nrmodule2_quectel
+
+
+
+ Detach_UE
+ Detach Quectel
+ nrmodule2_quectel
+
+
+
+
+ Initialize_eNB
+ Initialize eNB
+ -O ci-scripts/conf_files/enb.band38.nsa_2x2.100PRB.usrpn310.conf --usrp-tx-thread-config 1 --thread-pool 0,2,4,6
+ 0
+ 0
+ lte
+ yes
+ yes
+ 192.168.18.241
+
+
+
+
+ Initialize_eNB
+ Initialize gNB
+ -O ci-scripts/conf_files/gnb.band78.nsa_2x2.106PRB.usrpn310.conf -q --usrp-tx-thread-config 1 --thread-pool 0,2,4,6
+ 1
+ 1
+ nr
+ yes
+ 192.168.18.240
+
+
+
+ IdleSleep
+ Sleep
+ 60
+
+
+
+ IdleSleep
+ Sleep
+ 20
+
+
+
+
+ Ping
+ Ping: 20pings in 20sec
+ nrmodule2_quectel
+ -c 20
+ 5
+
+
+
+
+
+ Terminate_eNB
+ Terminate eNB
+ 0
+ 0
+ lte
+
+
+
+ Terminate_eNB
+ Terminate gNB
+ 1
+ 1
+ nr
+
+
+
+
diff --git a/ci-scripts/xml_files/fr1_oai_cn_deploy.xml b/ci-scripts/xml_files/fr1_oai_cn_deploy.xml
index 1ccc952c56..26dbebc329 100644
--- a/ci-scripts/xml_files/fr1_oai_cn_deploy.xml
+++ b/ci-scripts/xml_files/fr1_oai_cn_deploy.xml
@@ -33,7 +33,7 @@
Deploy_EPC
Deploy all EPC containers
- yaml_files/fr1_epc_20897
+ yaml_files/magma_nsa_20897
diff --git a/ci-scripts/yaml_files/magma_nsa_20897/docker-compose.yml b/ci-scripts/yaml_files/magma_nsa_20897/docker-compose.yml
new file mode 100644
index 0000000000..df14e900e7
--- /dev/null
+++ b/ci-scripts/yaml_files/magma_nsa_20897/docker-compose.yml
@@ -0,0 +1,198 @@
+version: '3.8'
+
+services:
+ cassandra:
+ image: cassandra:2.1
+ container_name: prod-cassandra
+ networks:
+ private_net:
+ ipv4_address: 192.168.68.2
+ environment:
+ CASSANDRA_CLUSTER_NAME: "OAI HSS Cluster"
+ CASSANDRA_ENDPOINT_SNITCH: GossipingPropertyFileSnitch
+ healthcheck:
+ test: /bin/bash -c "nodetool status"
+ interval: 10s
+ timeout: 5s
+ retries: 5
+
+ db_init:
+ image: cassandra:2.1
+ container_name: prod-db-init
+ depends_on: [cassandra]
+ deploy:
+ restart_policy:
+ condition: on-failure
+ max_attempts: 10
+ networks:
+ private_net:
+ ipv4_address: 192.168.68.4
+ volumes:
+ - ./oai_db.cql:/home/oai_db.cql
+ entrypoint: /bin/bash -c "cqlsh --file /home/oai_db.cql 192.168.68.2 && echo 'OK'"
+
+ oai_hss:
+ image: oai-hss:production
+ container_name: prod-oai-hss
+ privileged: true
+ depends_on: [cassandra]
+ networks:
+ private_net:
+ ipv4_address: 192.168.68.3
+ public_net:
+ ipv4_address: 192.168.61.194
+ environment:
+ TZ: Europe/Paris
+ REALM: openairinterface.org
+ HSS_FQDN: hss.openairinterface.org
+ PREFIX: /openair-hss/etc
+ cassandra_Server_IP: 192.168.68.2
+ OP_KEY: 1006020f0a478bf6b699f15c062e42b3
+ LTE_K: FEC86BA6EB707ED08905757B1BB44B8F
+ APN1: oai.ipv4
+ APN2: oai2.ipv4
+ FIRST_IMSI: 208970100001127
+ NB_USERS: 10
+ healthcheck:
+ test: /bin/bash -c "pgrep oai_hss"
+ interval: 10s
+ timeout: 5s
+ retries: 5
+
+ redis:
+ image: redis:6.0.5
+ container_name: prod-redis
+ privileged: true
+ networks:
+ public_net:
+ ipv4_address: 192.168.61.198
+ volumes:
+ - ./redis_extern.conf:/usr/local/etc/redis/redis.conf
+ entrypoint: /bin/bash -c "redis-server /usr/local/etc/redis/redis.conf"
+ healthcheck:
+ test: /bin/bash -c "redis-cli -h 192.168.61.198 -p 6380 ping"
+ interval: 10s
+ timeout: 5s
+ retries: 5
+
+ magma_mme:
+ image: magma-mme:production
+ container_name: prod-magma-mme
+ hostname: mme
+ privileged: true
+ depends_on: [oai_hss, redis]
+ networks:
+ public_net:
+ ipv4_address: 192.168.61.195
+ environment:
+ TZ: Europe/Paris
+ REALM: openairinterface.org
+ PREFIX: /openair-mme/etc
+ HSS_HOSTNAME: hss
+ HSS_FQDN: hss.openairinterface.org
+ HSS_REALM: openairinterface.org
+ MME_FQDN: mme.openairinterface.org
+ FEATURES: mme_oai
+ volumes:
+ - ./mme_fd.sprint.conf:/magma-mme/etc/mme_fd.conf.tmplt
+ - ./mme.conf:/magma-mme/etc/mme.conf
+ - ./entrypoint.sh:/magma-mme/bin/entrypoint.sh
+ entrypoint: /bin/bash -c "/magma-mme/bin/entrypoint.sh"
+ healthcheck:
+ test: /bin/bash -c "pgrep oai_mme"
+ interval: 10s
+ timeout: 5s
+ retries: 5
+
+ oai_spgwc:
+ image: oai-spgwc:production
+ privileged: true
+ depends_on: [magma_mme]
+ container_name: prod-oai-spgwc
+ networks:
+ public_net:
+ ipv4_address: 192.168.61.196
+ environment:
+ TZ: Europe/Paris
+ SGW_INTERFACE_NAME_FOR_S11: eth0
+ PGW_INTERFACE_NAME_FOR_SX: eth0
+ DEFAULT_DNS_IPV4_ADDRESS: 192.168.18.129
+ DEFAULT_DNS_SEC_IPV4_ADDRESS: 8.8.4.4
+ PUSH_PROTOCOL_OPTION: 'true'
+ APN_NI_1: oai.ipv4
+ APN_NI_2: oai2.ipv4
+ DEFAULT_APN_NI_1: oai.ipv4
+ UE_IP_ADDRESS_POOL_1: '12.1.1.2 - 12.1.1.254'
+ UE_IP_ADDRESS_POOL_2: '12.0.0.2 - 12.0.0.254'
+ MCC: '208'
+ MNC: '97'
+ MNC03: '097'
+ TAC: 1
+ GW_ID: 1
+ REALM: openairinterface.org
+ UE_MTU_IPV4: 1500
+ healthcheck:
+ test: /bin/bash -c "pgrep oai_spgwc"
+ interval: 10s
+ timeout: 5s
+ retries: 5
+
+ oai_spgwu:
+ image: oai-spgwu-tiny:production
+ privileged: true
+ container_name: prod-oai-spgwu-tiny
+ depends_on: [oai_spgwc]
+ networks:
+ public_net:
+ ipv4_address: 192.168.61.197
+ environment:
+ TZ: Europe/Paris
+ PID_DIRECTORY: /var/run
+ INSTANCE: 1
+ SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP: eth0
+ PGW_INTERFACE_NAME_FOR_SGI: eth0
+ SGW_INTERFACE_NAME_FOR_SX: eth0
+ SPGWC0_IP_ADDRESS: 192.168.61.196
+ NETWORK_UE_IP: '12.1.1.0/24'
+ NETWORK_UE_NAT_OPTION: 'yes'
+ MCC: '208'
+ MNC: '97'
+ MNC03: '097'
+ TAC: 1
+ GW_ID: 1
+ REALM: openairinterface.org
+ healthcheck:
+ test: /bin/bash -c "pgrep oai_spgwu"
+ interval: 10s
+ timeout: 5s
+ retries: 5
+
+ trf_gen:
+ image: trf-gen:production
+ privileged: true
+ container_name: prod-trf-gen
+ networks:
+ public_net:
+ ipv4_address: 192.168.61.200
+ entrypoint: /bin/bash -c "ip route add 12.1.1.0/24 via 192.168.61.197 dev eth0; sleep infinity"
+ healthcheck:
+ test: /bin/bash -c "ip route | grep '12.1.1.0'"
+ interval: 10s
+ timeout: 5s
+ retries: 5
+
+networks:
+ private_net:
+ name: prod-oai-private-net
+ ipam:
+ config:
+ - subnet: 192.168.68.0/26
+ driver_opts:
+ com.docker.network.bridge.name: "oai-priv-net"
+ public_net:
+ name: prod-oai-public-net
+ ipam:
+ config:
+ - subnet: 192.168.61.192/26
+ driver_opts:
+ com.docker.network.bridge.name: "oai-pub-net"
diff --git a/ci-scripts/yaml_files/magma_nsa_20897/entrypoint.sh b/ci-scripts/yaml_files/magma_nsa_20897/entrypoint.sh
new file mode 100755
index 0000000000..859ff7d98f
--- /dev/null
+++ b/ci-scripts/yaml_files/magma_nsa_20897/entrypoint.sh
@@ -0,0 +1,36 @@
+#!/bin/bash
+
+INSTANCE=1
+PREFIX='/magma-mme/etc'
+MY_REALM='openairinterface.org'
+
+declare -A MME_CONF
+
+pushd $PREFIX
+MME_CONF[@MME_S6A_IP_ADDR@]="192.168.61.195"
+MME_CONF[@INSTANCE@]=$INSTANCE
+MME_CONF[@PREFIX@]=$PREFIX
+MME_CONF[@REALM@]=$MY_REALM
+MME_CONF[@MME_FQDN@]="mme.${MME_CONF[@REALM@]}"
+MME_CONF[@HSS_HOSTNAME@]='hss'
+MME_CONF[@HSS_FQDN@]="${MME_CONF[@HSS_HOSTNAME@]}.${MME_CONF[@REALM@]}"
+MME_CONF[@HSS_IP_ADDR@]="192.168.61.194"
+
+cp mme_fd.conf.tmplt $PREFIX/mme_fd.conf
+
+for K in "${!MME_CONF[@]}"; do
+ egrep -lRZ "$K" $PREFIX/mme_fd.conf | xargs -0 -l sed -i -e "s|$K|${MME_CONF[$K]}|g"
+ ret=$?;[[ ret -ne 0 ]] && echo "Tried to replace $K with ${MME_CONF[$K]}"
+done
+
+sed -i -e "s@etc/freeDiameter@etc@" /magma-mme/etc/mme_fd.conf
+sed -i -e "s@bind: 127.0.0.1@bind: 192.168.61.198@" /etc/magma/redis.yml
+# Generate freeDiameter certificate
+popd
+cd /magma-mme/scripts
+./check_mme_s6a_certificate $PREFIX mme.${MME_CONF[@REALM@]}
+
+cd /magma-mme
+nohup /magma-mme/bin/sctpd > /var/log/sctpd.log 2>&1 &
+sleep 5
+/magma-mme/bin/oai_mme -c /magma-mme/etc/mme.conf
diff --git a/ci-scripts/yaml_files/magma_nsa_20897/mme.conf b/ci-scripts/yaml_files/magma_nsa_20897/mme.conf
new file mode 100644
index 0000000000..e41fbe6304
--- /dev/null
+++ b/ci-scripts/yaml_files/magma_nsa_20897/mme.conf
@@ -0,0 +1,136 @@
+# generated by generate_mme_config_script.py
+MME :
+{
+ REALM = "openairinterface.org"
+ PID_DIRECTORY = "/var/run";
+ MAXENB = 8; # power of 2
+ MAXUE = 16; # power of 2
+ RELATIVE_CAPACITY = 10;
+
+ EMERGENCY_ATTACH_SUPPORTED = "no";
+ UNAUTHENTICATED_IMSI_SUPPORTED = "no";
+
+ # EPS network feature support
+ EPS_NETWORK_FEATURE_SUPPORT_IMS_VOICE_OVER_PS_SESSION_IN_S1 = "no"; # DO NOT CHANGE
+ EPS_NETWORK_FEATURE_SUPPORT_EMERGENCY_BEARER_SERVICES_IN_S1_MODE = "no"; # DO NOT CHANGE
+ EPS_NETWORK_FEATURE_SUPPORT_LOCATION_SERVICES_VIA_EPC = "no"; # DO NOT CHANGE
+ EPS_NETWORK_FEATURE_SUPPORT_EXTENDED_SERVICE_REQUEST = "no"; # DO NOT CHANGE
+
+ # Display statistics about whole system (expressed in seconds)
+ MME_STATISTIC_TIMER = 10;
+ IP_CAPABILITY = "IPV4"; # UE PDN_TYPE
+ USE_STATELESS = "";
+
+ INTERTASK_INTERFACE :
+ {
+ # max queue size per task
+ ITTI_QUEUE_SIZE = 2000000;
+ };
+
+ S6A :
+ {
+ S6A_CONF = "/magma-mme/etc/mme_fd.conf"; # YOUR MME freeDiameter config file path
+ HSS_HOSTNAME = "hss.openairinterface.org";
+ HSS_REALM = "openairinterface.org";
+ };
+
+ # ------- SCTP definitions
+ SCTP :
+ {
+ # Number of streams to use in input/output
+ SCTP_INSTREAMS = 8;
+ SCTP_OUTSTREAMS = 8;
+ };
+
+ # ------- S1AP definitions
+ S1AP :
+ {
+ # outcome drop timer value (seconds)
+ S1AP_OUTCOME_TIMER = 10;
+ };
+
+ # ------- MME served GUMMEIs
+ GUMMEI_LIST = (
+ { MCC="208" ; MNC="97"; MME_GID="32768" ; MME_CODE="3"; }
+ );
+
+ # ------- MME served TAIs
+ TAI_LIST = (
+ {MCC="208" ; MNC="97"; TAC = "1"; },
+ {MCC="208" ; MNC="97"; TAC = "2"; },
+ {MCC="208" ; MNC="97"; TAC = "3"; }
+ );
+
+ TAC_LIST = (
+ {MCC="208" ; MNC="97"; TAC = "1"; }
+ );
+
+ CSFB :
+ {
+ NON_EPS_SERVICE_CONTROL = "OFF";
+ CSFB_MCC = "208";
+ CSFB_MNC = "97";
+ LAC = "1";
+ };
+ NAS :
+ {
+ ORDERED_SUPPORTED_INTEGRITY_ALGORITHM_LIST = [ "EIA2" , "EIA1" , "EIA0" ];
+ ORDERED_SUPPORTED_CIPHERING_ALGORITHM_LIST = [ "EEA0" , "EEA1" , "EEA2" ];
+ T3402 = 1 # in minutes (default is 12 minutes)
+ T3412 = 54 # in minutes (default is 54 minutes, network dependent)
+ T3422 = 6 # in seconds (default is 6s)
+ T3450 = 6 # in seconds (default is 6s)
+ T3460 = 6 # in seconds (default is 6s)
+ T3470 = 6 # in seconds (default is 6s)
+ T3485 = 8 # UNUSED in seconds (default is 8s)
+ T3486 = 8 # UNUSED in seconds (default is 8s)
+ T3489 = 4 # UNUSED in seconds (default is 4s)
+ T3495 = 8 # UNUSED in seconds (default is 8s)
+ };
+
+ SGS :
+ {
+ TS6_1 = 10 # in seconds (default is 10s)
+ TS8 = 4 # in seconds (default is 4s)
+ TS9 = 2 # in seconds (default is 4s)
+ TS10 = 4 # in seconds (default is 4s)
+ TS13 = 4 # in seconds (default is 4s)
+ };
+
+ NETWORK_INTERFACES :
+ {
+ MME_INTERFACE_NAME_FOR_S1_MME = "eth0";
+ MME_IPV4_ADDRESS_FOR_S1_MME = "192.168.61.195/24";
+ MME_INTERFACE_NAME_FOR_S11_MME = "eth0";
+ MME_IPV4_ADDRESS_FOR_S11_MME = "192.168.61.195/24";
+ MME_PORT_FOR_S11_MME = 2123;
+ };
+
+ LOGGING :
+ {
+ OUTPUT = "CONSOLE";
+ THREAD_SAFE = "no";
+ COLOR = "no";
+
+ SCTP_LOG_LEVEL = "ERROR";
+ GTPV1U_LOG_LEVEL = "INFO";
+ SPGW_APP_LOG_LEVEL = "INFO";
+ UDP_LOG_LEVEL = "INFO";
+ S1AP_LOG_LEVEL = "DEBUG";
+ NAS_LOG_LEVEL = "INFO";
+ MME_APP_LOG_LEVEL = "DEBUG";
+ GTPV2C_LOG_LEVEL = "INFO";
+ S11_LOG_LEVEL = "DEBUG";
+ S6A_LOG_LEVEL = "DEBUG";
+ UTIL_LOG_LEVEL = "INFO";
+ MSC_LOG_LEVEL = "ERROR";
+ ITTI_LOG_LEVEL = "ERROR";
+ MME_SCENARIO_PLAYER_LOG_LEVEL = "ERROR";
+ ASN1_VERBOSITY = "INFO";
+ };
+
+ S-GW :
+ {
+ SGW_IPV4_ADDRESS_FOR_S11 = "192.168.61.196";
+ };
+};
diff --git a/ci-scripts/yaml_files/magma_nsa_20897/mme_fd.sprint.conf b/ci-scripts/yaml_files/magma_nsa_20897/mme_fd.sprint.conf
new file mode 100644
index 0000000000..6f87ed8c2b
--- /dev/null
+++ b/ci-scripts/yaml_files/magma_nsa_20897/mme_fd.sprint.conf
@@ -0,0 +1,169 @@
+# -------- Local ---------
+
+# Uncomment if the framework cannot resolv it.
+Identity = "@MME_FQDN@";
+Realm = "@REALM@";
+
+# TLS configuration (see previous section)
+TLS_Cred = "@PREFIX@/freeDiameter/mme.cert.pem",
+ "@PREFIX@/freeDiameter/mme.key.pem";
+TLS_CA = "@PREFIX@/freeDiameter/mme.cacert.pem";
+
+# Disable use of TCP protocol (only listen and connect in SCTP)
+# Default : TCP enabled
+No_SCTP;
+
+# This option is ignored if freeDiameter is compiled with DISABLE_SCTP option.
+# Prefer TCP instead of SCTP for establishing new connections.
+# This setting may be overwritten per peer in peer configuration blocs.
+# Default : SCTP is attempted first.
+Prefer_TCP;
+
+
+No_IPv6;
+
+# Overwrite the number of SCTP streams. This value should be kept low,
+# especially if you are using TLS over SCTP, because it consumes a lot of
+# resources in that case. See tickets 19 and 27 for some additional details on
+# this.
+# Limit the number of SCTP streams
+SCTP_streams = 3;
+
+
+# By default, freeDiameter acts as a Diameter Relay Agent by forwarding all
+# messages it cannot handle locally. This parameter disables this behavior.
+NoRelay;
+
+# Use RFC3588 method for TLS protection, where TLS is negociated after CER/CEA exchange is completed
+# on the unsecure connection. The alternative is RFC6733 mechanism, where TLS protects also the
+# CER/CEA exchange on a dedicated secure port.
+# This parameter only affects outgoing connections.
+# The setting can be also defined per-peer (see Peers configuration section).
+# Default: use RFC6733 method with separate port for TLS.
+
+#TLS_old_method;
+
+AppServThreads = 4;
+
+# Specify the addresses on which to bind the listening server. This must be
+# specified if the framework is unable to auto-detect these addresses, or if the
+# auto-detected values are incorrect. Note that the list of addresses is sent
+# in CER or CEA message, so one should pay attention to this parameter if some
+# adresses should be kept hidden.
+ListenOn = "@MME_S6A_IP_ADDR@";
+
+Port = 3870;
+SecPort = 5870;
+
+# -------- Extensions ---------
+
+# Uncomment (and create rtd.conf) to specify routing table for this peer.
+#LoadExtension = "/usr/local/lib/freeDiameter/rt_default.fdx" : "rtd.conf";
+
+#LoadExtension = "/usr/local/lib/freeDiameter/_sample.fdx";
+#LoadExtension = "/usr/local/lib/freeDiameter/app_acct.fdx";
+#LoadExtension = "/usr/local/lib/freeDiameter/app_diameap.fdx";
+#LoadExtension = "/usr/local/lib/freeDiameter/app_radgw.fdx";
+#LoadExtension = "/usr/local/lib/freeDiameter/app_redirect.fdx";
+#LoadExtension = "/usr/local/lib/freeDiameter/app_sip.fdx";
+#LoadExtension = "/usr/local/lib/freeDiameter/dbg_interactive.fdx";
+#LoadExtension = "/usr/local/lib/freeDiameter/dbg_monitor.fdx";
+#LoadExtension = "/usr/local/lib/freeDiameter/dbg_msg_dumps.fdx";
+#LoadExtension = "/usr/local/lib/freeDiameter/dbg_msg_timings.fdx";
+#LoadExtension = "/usr/local/lib/freeDiameter/dbg_rt.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_3gpp2_avps.fdx";
+#LoadExtension = "/usr/local/lib/freeDiameter/dict_CreditControl.fdx";
+#LoadExtension = "/usr/local/lib/freeDiameter/dict_CxDx.fdx";
+#LoadExtension = "/usr/local/lib/freeDiameter/dict_Gx.fdx";
+#LoadExtension = "/usr/local/lib/freeDiameter/dict_NAS.fdx";
+#LoadExtension = "/usr/local/lib/freeDiameter/dict_Ro.fdx";
+#LoadExtension = "/usr/local/lib/freeDiameter/dict_Rx.fdx";
+#LoadExtension = "/usr/local/lib/freeDiameter/dict_S6mS6n.fdx";
+#LoadExtension = "/usr/local/lib/freeDiameter/dict_SGd.fdx";
+#LoadExtension = "/usr/local/lib/freeDiameter/dict_SLh.fdx";
+#LoadExtension = "/usr/local/lib/freeDiameter/dict_Sd.fdx";
+#LoadExtension = "/usr/local/lib/freeDiameter/dict_Sh.fdx";
+#LoadExtension = "/usr/local/lib/freeDiameter/dict_T4.fdx";
+#LoadExtension = "/usr/local/lib/freeDiameter/dict_T6aT6bT7.fdx";
+#LoadExtension = "/usr/local/lib/freeDiameter/dict_Tsp.fdx";
+#LoadExtension = "/usr/local/lib/freeDiameter/dict_dcca.fdx";
+#LoadExtension = "/usr/local/lib/freeDiameter/dict_dcca_3gpp.fdx";
+#LoadExtension = "/usr/local/lib/freeDiameter/dict_dcca_starent.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_draftload_avps.fdx";
+#LoadExtension = "/usr/local/lib/freeDiameter/dict_eap.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_etsi283034_avps.fdx";
+#LoadExtension = "/usr/local/lib/freeDiameter/dict_legacy_xml.fdx";
+#LoadExtension = "/usr/local/lib/freeDiameter/dict_mip6a.fdx";
+#LoadExtension = "/usr/local/lib/freeDiameter/dict_mip6i.fdx";
+#LoadExtension = "/usr/local/lib/freeDiameter/dict_nas_mipv6.fdx";
+#LoadExtension = "/usr/local/lib/freeDiameter/dict_nasreq.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc4004_avps.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc4006bis_avps.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc4072_avps.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc4590_avps.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc5447_avps.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc5580_avps.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc5777_avps.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc5778_avps.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc6734_avps.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc6942_avps.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc7155_avps.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc7683_avps.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc7944_avps.fdx";
+#LoadExtension = "/usr/local/lib/freeDiameter/dict_sip.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29061_avps.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29128_avps.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29154_avps.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29173_avps.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29212_avps.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29214_avps.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29215_avps.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29217_avps.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29229_avps.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29272_avps.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29273_avps.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29329_avps.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29336_avps.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29337_avps.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29338_avps.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29343_avps.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29344_avps.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29345_avps.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29368_avps.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29468_avps.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_ts32299_avps.fdx";
+#LoadExtension = "/usr/local/lib/freeDiameter/rt_busypeers.fdx";
+#LoadExtension = "/usr/local/lib/freeDiameter/rt_default.fdx";
+#LoadExtension = "/usr/local/lib/freeDiameter/rt_ereg.fdx";
+#LoadExtension = "/usr/local/lib/freeDiameter/rt_ignore_dh.fdx";
+#LoadExtension = "/usr/local/lib/freeDiameter/rt_load_balance.fdx";
+#LoadExtension = "/usr/local/lib/freeDiameter/rt_randomize.fdx";
+#LoadExtension = "/usr/local/lib/freeDiameter/rt_redirect.fdx";
+#LoadExtension = "/usr/local/lib/freeDiameter/test_acct.fdx";
+#LoadExtension = "/usr/local/lib/freeDiameter/test_app.fdx";
+#LoadExtension = "/usr/local/lib/freeDiameter/test_hss.fdx";
+#LoadExtension = "/usr/local/lib/freeDiameter/test_netemul.fdx";
+#LoadExtension = "/usr/local/lib/freeDiameter/test_rt_any.fdx";
+#LoadExtension = "/usr/local/lib/freeDiameter/test_sip.fdx";
+#LoadExtension = "/usr/local/lib/freeDiameter/dict_Rf.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_S6as6d.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_S6t.fdx";
+LoadExtension = "/usr/local/lib/freeDiameter/dict_S6c.fdx";
+
+
+# -------- Peers ---------
+
+# The framework will actively attempt to establish and maintain a connection
+# with the peers listed here.
+# For only accepting incoming connections, see the acl_wl.fx extension.
+
+# ConnectPeer
+# Declare a remote peer to which this peer must maintain a connection.
+# In addition, this allows specifying non-default parameters for this peer only
+# (for example disable SCTP with this peer, or use RFC3588-flavour TLS).
+# Note that by default, if a peer is not listed as a ConnectPeer entry, an
+# incoming connection from this peer will be rejected. If you want to accept
+# incoming connections from other peers, see the acl_wl.fdx? extension which
+# allows exactly this.
+
+ConnectPeer= "@HSS_FQDN@" { ConnectTo = "@HSS_IP_ADDR@"; No_SCTP ; No_IPv6; Prefer_TCP; No_TLS; port = 3868;};
diff --git a/ci-scripts/yaml_files/magma_nsa_20897/redis_extern.conf b/ci-scripts/yaml_files/magma_nsa_20897/redis_extern.conf
new file mode 100644
index 0000000000..565524080a
--- /dev/null
+++ b/ci-scripts/yaml_files/magma_nsa_20897/redis_extern.conf
@@ -0,0 +1,33 @@
+#
+# Copyright (c) 2016-present, Facebook, Inc.
+# All rights reserved.
+#
+# This source code is licensed under the BSD-style license found in the
+# LICENSE file in the root directory of this source tree. An additional grant
+# of patent rights can be found in the PATENTS file in the same directory.
+
+# Jinja template for Redis configuration
+# See the default config file for options and explanations:
+# https://github.com/antirez/redis/blob/unstable/redis.conf
+
+# TODO: make sensible, production-aware config decisions
+
+bind 192.168.61.198
+port 6380
+
+daemonize no
+loglevel notice
+
+timeout 0
+databases 1
+
+dbfilename redis_dump.rdb
+dir /data
+
+# Save the DB on disk
+
+save 900 1
+
+save 300 10
+
+save 60 1000
diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt
index 0b48eb099b..af9cfac408 100644
--- a/cmake_targets/CMakeLists.txt
+++ b/cmake_targets/CMakeLists.txt
@@ -309,6 +309,7 @@ endif()
#
# add autotools definitions that were maybe used!
+
add_definitions("-DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_FCNTL_H=1 -DHAVE_ARPA_INET_H=1 -DHAVE_SYS_TIME_H=1 -DHAVE_SYS_SOCKET_H=1 -DHAVE_STRERROR=1 -DHAVE_SOCKET=1 -DHAVE_MEMSET=1 -DHAVE_GETTIMEOFDAY=1 -DHAVE_STDLIB_H=1 -DHAVE_MALLOC=1 -DHAVE_LIBSCTP")
set(commonOpts "-pipe -Wno-packed-bitfield-compat -fPIC -Wall -fno-strict-aliasing -rdynamic")
@@ -318,11 +319,7 @@ set(CMAKE_C_FLAGS
set(CMAKE_CXX_FLAGS
"${CMAKE_CXX_FLAGS} ${C_FLAGS_PROCESSOR} ${commonOpts} -std=c++11 -march=native")
-# cuda compiler bug (limitation) on complex macro definition
-if (CUDA_FOUND)
- set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DCUDA_FLAG")
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DCUDA_FLAG")
-endif()
+
if (SANITIZE_ADDRESS)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address -fno-common")
@@ -985,8 +982,6 @@ Message("CPU_Affinity flag is ${CPU_AFFINITY}")
# ???!!! TO BE DOCUMENTED OPTIONS !!!???
##############################################################
-add_boolean_option(NO_RRM True "DO WE HAVE A RADIO RESSOURCE MANAGER: NO")
-
add_boolean_option(OAI_NW_DRIVER_TYPE_ETHERNET False "????")
add_boolean_option(DEADLINE_SCHEDULER False "Use the Linux scheduler SCHED_DEADLINE: kernel >= 3.14")
add_boolean_option(CPU_AFFINITY False "Enable CPU Affinity of threads (only valid without deadline scheduler). It is enabled only with >2 CPUs")
@@ -1047,7 +1042,6 @@ add_boolean_option(JUMBO_FRAME True "ENABLE LARGE SDU in ACCESS STR
##########################
# RLC LAYER OPTIONS
##########################
-add_boolean_option(OPENAIR2 True "Access Stratum layer 2 built in executable")
add_boolean_option(TRACE_RLC_PAYLOAD False "Fatal assert in this case")
add_boolean_option(RLC_STOP_ON_LOST_PDU False "Fatal assert in this case")
@@ -1075,8 +1069,6 @@ add_boolean_option(TRACE_RLC_UM_TX_STATUS False "TRACE for RLC UM, TO BE CHANGE
##########################
# PDCP LAYER OPTIONS
##########################
-#add_boolean_option(PDCP_USE_NETLINK False "For eNB, PDCP communicate with a NETLINK socket if connected to network driver, else could use a RT-FIFO")
-#add_boolean_option(PDCP_USE_NETLINK_QUEUES False "When PDCP_USE_NETLINK is true, incoming IP packets are stored in queues")
#add_boolean_option(LINK_ENB_PDCP_TO_IP_DRIVER False "For eNB, PDCP communicate with a IP driver")
#add_boolean_option(LINK_ENB_PDCP_TO_GTPV1U True "For eNB, PDCP communicate with GTP-U protocol (eNB<->S-GW)")
@@ -1590,6 +1582,16 @@ set(PHY_LDPC_OPTIM8SEGMULTI_SRC
${OPENAIR1_DIR}/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder.c
${OPENAIR1_DIR}/PHY/CODING/nrLDPC_encoder/ldpc_encoder_optim8segmulti.c
)
+set(PHY_LDPC_CUDA_SRC
+ ${OPENAIR1_DIR}/PHY/CODING/nrLDPC_decoder_LYC/nrLDPC_decoder_LYC.cu
+ ${OPENAIR1_DIR}/PHY/CODING/nrLDPC_encoder/ldpc_encoder_optim8segmulti.c
+)
+
+set(PHY_LDPC_CL_SRC
+ ${OPENAIR1_DIR}/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_CL.c
+ ${OPENAIR1_DIR}/PHY/CODING/nrLDPC_encoder/ldpc_encoder_optim8segmulti.c
+)
+
set(PHY_NR_CODINGIF
${OPENAIR1_DIR}/PHY/CODING/nrLDPC_load.c;
)
@@ -1597,8 +1599,18 @@ set(PHY_NR_CODINGIF
add_library(ldpc_orig MODULE ${PHY_LDPC_ORIG_SRC} )
add_library(ldpc_optim MODULE ${PHY_LDPC_OPTIM_SRC} )
add_library(ldpc_optim8seg MODULE ${PHY_LDPC_OPTIM8SEG_SRC} )
+add_library(ldpc_cl MODULE ${PHY_LDPC_CL_SRC} )
+target_link_libraries(ldpc_cl OpenCL)
+
+if (CUDA_FOUND)
+ cuda_add_library(ldpc_cuda MODULE ${PHY_LDPC_CUDA_SRC} )
+ set_target_properties(ldpc_cuda PROPERTIES CUDA_SEPARABLE_COMPILATION ON)
+# CUDA_ADD_CUFFT_TO_TARGET(ldpc_cuda)
+endif (CUDA_FOUND)
+
add_library(ldpc MODULE ${PHY_LDPC_OPTIM8SEGMULTI_SRC} )
+
add_library(coding MODULE ${PHY_TURBOSRC} )
add_library(dfts MODULE ${OPENAIR1_DIR}/PHY/TOOLS/oai_dfts.c )
@@ -1743,7 +1755,6 @@ set(PHY_SRC_UE
set(PHY_NR_SRC_COMMON
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_prach_common.c
- ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_dci_tools_common.c
)
set(PHY_NR_SRC
@@ -1982,6 +1993,10 @@ set(NR_PDCP_SRC
${OPENAIR2_DIR}/LAYER2/nr_pdcp/asn1_utils.c
)
+set(NR_SDAP_SRC
+ ${OPENAIR2_DIR}/SDAP/nr_sdap/nr_sdap_gnb.c
+ )
+
set(L2_SRC
${PDCP_DIR}/pdcp.c
${PDCP_DIR}/pdcp_fifo.c
@@ -2025,6 +2040,7 @@ set(L2_LTE_SRC
set(L2_NR_SRC
${NR_RLC_SRC}
${NR_PDCP_SRC}
+ ${NR_SDAP_SRC}
${NR_RRC_DIR}/rrc_gNB.c
${NR_RRC_DIR}/nr_rrc_common.c
${NR_RRC_DIR}/L2_nr_interface.c
@@ -2060,6 +2076,7 @@ set(L2_RRC_SRC_UE
set(NR_L2_SRC_UE
${NR_RLC_SRC}
${NR_PDCP_SRC}
+ ${NR_SDAP_SRC}
${NR_UE_RRC_DIR}/L2_interface_ue.c
${NR_UE_RRC_DIR}/main_ue.c
${NR_UE_RRC_DIR}/rrc_UE.c
@@ -3112,7 +3129,11 @@ target_link_libraries (nr-uesoftmodem ${LIB_LMS_LIBRARIES})
target_link_libraries (nr-uesoftmodem ${T_LIB})
add_dependencies( nr-uesoftmodem ldpc_orig ldpc_optim ldpc_optim8seg ldpc )
-
+if (CUDA_FOUND)
+ add_dependencies( nr-uesoftmodem ldpc_cuda)
+ add_dependencies( nr-softmodem ldpc_cuda)
+ add_dependencies( ocp-gnb ldpc_cuda)
+endif (CUDA_FOUND)
###################################"
# Addexecutables for tests
####################################
@@ -3172,46 +3193,18 @@ target_link_libraries(smallblocktest
m pthread ${ATLAS_LIBRARIES} dl
)
-if (CUDA_FOUND)
-###################################################
-# For CUDA library
-###################################################
- CUDA_ADD_LIBRARY(LDPC_CU
- ${OPENAIR1_DIR}/PHY/CODING/nrLDPC_decoder_LYC/nrLDPC_decoder_LYC.cu
- )
- CUDA_ADD_CUFFT_TO_TARGET(LDPC_CU)
- cuda_add_executable(ldpctest
- ${OPENAIR1_DIR}/PHY/CODING/TESTBENCH/ldpctest.c
- ${T_SOURCE}
- ${SHLIB_LOADER_SOURCES}
- )
- target_link_libraries(ldpctest -ldl
- -Wl,--start-group
- LDPC_CU UTIL SIMU PHY_NR CONFIG_LIB
- -Wl,--end-group
- m pthread ${ATLAS_LIBRARIES} dl
- )
+add_executable(ldpctest
+ ${PHY_NR_CODINGIF}
+ ${OPENAIR1_DIR}/PHY/CODING/TESTBENCH/ldpctest.c
+ ${T_SOURCE}
+ ${SHLIB_LOADER_SOURCES}
+ )
-else (CUDA_FOUND)
- add_executable(ldpctest
- ${PHY_NR_CODINGIF}
- ${OPENAIR1_DIR}/PHY/CODING/TESTBENCH/ldpctest.c
- ${T_SOURCE}
- ${SHLIB_LOADER_SOURCES}
- )
-
-endif ()
-
-
-# add_executable(ldpctest
- # ${PHY_NR_CODINGIF}
- # ${OPENAIR1_DIR}/PHY/CODING/TESTBENCH/ldpctest.c
- # ${T_SOURCE}
- # ${SHLIB_LOADER_SOURCES}
- # )
add_dependencies( ldpctest ldpc_orig ldpc_optim ldpc_optim8seg ldpc )
-
+if (CUDA_FOUND)
+ add_dependencies( ldpctest ldpc_cuda)
+endif (CUDA_FOUND)
target_link_libraries(ldpctest
-Wl,--start-group UTIL SIMU_COMMON SIMU PHY_NR PHY_COMMON PHY_NR_COMMON CONFIG_LIB -Wl,--end-group
m pthread ${ATLAS_LIBRARIES} dl
diff --git a/cmake_targets/build_oai b/cmake_targets/build_oai
index c9390d67ce..c68ca8a553 100755
--- a/cmake_targets/build_oai
+++ b/cmake_targets/build_oai
@@ -551,7 +551,7 @@ function main() {
if [ "$HW" == "OAI_USRP" ] ; then
echo_info "installing packages for USRP support"
check_install_usrp_uhd_driver
- if [ ! "$DISABLE_HARDWARE_DEPENDENCY" == "True" ]; then
+ if [ ! -v BUILD_UHD_FROM_SOURCE ] && [ ! "$DISABLE_HARDWARE_DEPENDENCY" == "True" ]; then
install_usrp_uhd_driver $UHD_IMAGES_DIR
fi
fi
diff --git a/cmake_targets/tools/build_helper b/cmake_targets/tools/build_helper
index d3fcf615e2..06f32183b7 100755
--- a/cmake_targets/tools/build_helper
+++ b/cmake_targets/tools/build_helper
@@ -117,6 +117,9 @@ check_supported_distribution() {
"rhel8.2") return 0 ;;
"rhel8.3") return 0 ;;
"rhel8.4") return 0 ;;
+ "rhel8.5") return 0 ;;
+ "rhel8.6") return 0 ;;
+ "rhel8.7") return 0 ;;
"centos7") return 0 ;;
esac
return 1
@@ -317,19 +320,30 @@ install_usrp_uhd_driver_from_source(){
echo_info "\nInstalling UHD driver from sources. The log file for UHD driver installation is here: $uhd_install_log "
(
pushd /tmp
- echo "Downloading UHD driver"
+ echo "Cloning UHD driver repository"
rm -rf /tmp/uhd
git clone https://github.com/EttusResearch/uhd.git
cd uhd
- git checkout tags/v4.0.0.0
+ if [[ -v UHD_VERSION ]]; then
+ git checkout tags/v${UHD_VERSION}
+ else
+ git checkout tags/v4.0.0.0
+ fi
mkdir -p host/build
- cd host/build
- $CMAKE ../
+ cd host/build || true
+ $CMAKE ../ -GNinja
echo "Compiling UHD"
- make -j`nproc`
- make test
- $SUDO make install
+ ninja
+ $SUDO ninja install
$SUDO ldconfig -v
+ if [ $IS_CONTAINER -eq 0 ]; then
+ if [[ "$OS_DISTRO" == "ubuntu" ]]; then
+ $SUDO /usr/local/lib/uhd/utils/uhd_images_downloader.py
+ fi
+ if [[ "$OS_DISTRO" == "rhel" ]]; then
+ $SUDO /usr/local/lib64/uhd/utils/uhd_images_downloader.py
+ fi
+ fi
popd
rm -rf /tmp/uhd
) >& $uhd_install_log
@@ -338,10 +352,26 @@ install_usrp_uhd_driver_from_source(){
check_install_usrp_uhd_driver(){
if [[ "$OS_DISTRO" == "ubuntu" ]]; then
#first we remove old installation
- $SUDO apt-get remove -y uhd || true
- $SUDO apt-get remove libuhd-dev libuhd003 uhd-host -y || true
+ $SUDO apt-get remove uhd -y || true
+ $SUDO apt-get remove uhd-host -y || true
+ $SUDO apt-get remove libuhd-dev -y || true
+ $SUDO apt-get remove libuhd003 -y || true
+ $SUDO apt-get remove libuhd3.13.1 -y || true
+ $SUDO apt-get remove libuhd3.14.0 -y || true
+ $SUDO apt-get remove libuhd3.14.1 -y || true
+ $SUDO apt-get remove libuhd3.15.0 -y || true
+ local distribution=$(get_distribution_release)
+ if [[ "$distribution" == "ubuntu18.04" ]]; then
+ $SUDO apt-get remove libuhd4.0.0 -y || true
+ $SUDO apt-get remove libuhd4.1.0 -y || true
+ fi
v=$(lsb_release -cs)
$SUDO apt-add-repository --remove "deb http://files.ettus.com/binaries/uhd/repo/uhd/ubuntu/$v $v main"
+ if [[ -v BUILD_UHD_FROM_SOURCE ]]; then
+ $SUDO apt-get install -y libboost-all-dev libusb-1.0-0-dev doxygen python3-docutils python3-mako python3-numpy python3-requests python3-setuptools ninja-build
+ install_usrp_uhd_driver_from_source
+ return
+ fi
# The new USRP repository
# Raphael Defosseux: Adding a loop on adding PPA because in CI the gpg key retrieve may
# timeout due to proxy / network latencies in Eurecom on VM
@@ -361,7 +391,12 @@ check_install_usrp_uhd_driver(){
done
$SUDO apt-get update
$SUDO apt-get -y install python python-tk libboost-all-dev libusb-1.0-0-dev
- $SUDO apt-get -y install libuhd-dev libuhd003 uhd-host
+ if [[ "$distribution" == "ubuntu16.04" ]]; then
+ $SUDO apt-get -y install libuhd-dev libuhd3.15.0 uhd-host
+ fi
+ if [[ "$distribution" == "ubuntu18.04" ]]; then
+ $SUDO apt-get -y install libuhd-dev libuhd4.1.0 uhd-host
+ fi
elif [[ "$OS_BASEDISTRO" == "fedora" ]]; then
if [ $IS_CONTAINER -eq 0 ]
then
@@ -692,6 +727,7 @@ check_install_oai_software() {
build-essential \
$CMAKE \
cmake-curses-gui \
+ curl \
ninja-build \
doxygen \
doxygen-gui \
diff --git a/common/utils/DOC/loader/devusage/api.md b/common/utils/DOC/loader/devusage/api.md
index a6e59c5938..41a0807a24 100644
--- a/common/utils/DOC/loader/devusage/api.md
+++ b/common/utils/DOC/loader/devusage/api.md
@@ -10,6 +10,10 @@ int load_module_shlib(char *modname,loader_shlibfunc_t *farray, int numf)
* If the farray pointer is null, looks for `< modname >_getfarray` symbol, calls the corresponding function when the symbol is found. `< modname >_getfarray` takes one argument, a pointer to a `loader_shlibfunc_t` array, and returns the number of items in this array, as defined by the `getfarrayfunc_t` type. The `loader_shlibfunc_t` array returned by the shared library must be fully filled (both `fname` and `fptr` fields).
* looks for the `numf` function symbols listed in the `farray[i].fname` arguments and set the corresponding `farray[i].fptr`function pointers
+```c
+int load_module_version_shlib(char *modname, char *version, loader_shlibfunc_t *farray, int numf)
+```
+Allows loading a specific library version, as specified by the `version` parameter. When version is not NULL the version that is possibly specified as a config module parameter is ignored. This call has been introduced for phy simulators executables which do not use the config module. It is used, for example, by the ldcp initialization (`load_nrLDPClib` function in [nrLDPC_load.c](../../../../../openair1/PHY/CODING/nrLDPC_load.c) to allow the `ldpctest` simulator to select the cuda accelerated ldcp implementation. `load_module_shlib` is just a define macro to switch to a `load_module_version_shlib` call, adding a NULL pointer for the version parameter.
```c
void * get_shlibmodule_fptr(char *modname, char *fname)
diff --git a/common/utils/LOG/log_extern.h b/common/utils/LOG/log_extern.h
index f6205889dc..23f9217d7e 100644
--- a/common/utils/LOG/log_extern.h
+++ b/common/utils/LOG/log_extern.h
@@ -19,7 +19,7 @@
* contact@openairinterface.org
*/
-#include"log.h"
+#include "log.h"
extern log_t *g_log;
diff --git a/common/utils/load_module_shlib.c b/common/utils/load_module_shlib.c
index a4b4742c94..2b0d339358 100644
--- a/common/utils/load_module_shlib.c
+++ b/common/utils/load_module_shlib.c
@@ -63,7 +63,7 @@ void loader_init(void) {
}
/* build the full shared lib name from the module name */
-char *loader_format_shlibpath(char *modname)
+char *loader_format_shlibpath(char *modname, char *version)
{
char *tmpstr;
@@ -97,7 +97,10 @@ int ret;
shlibpath = loader_data.shlibpath ;
}
/* no specific shared lib version */
- if (shlibversion == NULL) {
+ if (version != NULL) { // version specified as a function parameter
+ shlibversion=version;
+ }
+ if (shlibversion == NULL) { // no specific version specified, neither as a config param or as a function param
shlibversion = "" ;
}
/* alloc memory for full module shared lib file name */
@@ -118,7 +121,7 @@ int ret;
return tmpstr;
}
-int load_module_shlib(char *modname,loader_shlibfunc_t *farray, int numf, void *autoinit_arg)
+int load_module_version_shlib(char *modname, char *version, loader_shlibfunc_t *farray, int numf, void *autoinit_arg)
{
void *lib_handle = NULL;
initfunc_t fpi;
@@ -138,7 +141,7 @@ int load_module_shlib(char *modname,loader_shlibfunc_t *farray, int numf, void *
loader_init();
}
- shlib_path = loader_format_shlibpath(modname);
+ shlib_path = loader_format_shlibpath(modname, version);
for (int i = 0; i < loader_data.numshlibs; i++) {
if (strcmp(loader_data.shlibs[i].name, modname) == 0) {
diff --git a/common/utils/load_module_shlib.h b/common/utils/load_module_shlib.h
index 685b3d1b65..0e80a5353c 100644
--- a/common/utils/load_module_shlib.h
+++ b/common/utils/load_module_shlib.h
@@ -84,10 +84,11 @@ loader_data_t loader_data;
/*-------------------------------------------------------------------------------------------------------------*/
#else /* LOAD_MODULE_SHLIB_MAIN */
-extern int load_module_shlib(char *modname, loader_shlibfunc_t *farray, int numf, void *initfunc_arg);
+
+extern int load_module_version_shlib(char *modname, char *version, loader_shlibfunc_t *farray, int numf, void *initfunc_arg);
extern void * get_shlibmodule_fptr(char *modname, char *fname);
extern loader_data_t loader_data;
#endif /* LOAD_MODULE_SHLIB_MAIN */
-
+#define load_module_shlib(M, F, N, I) load_module_version_shlib(M, NULL, F, N, I)
#endif
diff --git a/common/utils/nr/nr_common.c b/common/utils/nr/nr_common.c
index 86d246a92a..cb6dee445b 100644
--- a/common/utils/nr/nr_common.c
+++ b/common/utils/nr/nr_common.c
@@ -65,8 +65,8 @@ nr_bandentry_t nr_bandtable[] = {
{41, 2496000, 2690000, 2496000, 2690000, 3, 499200, 15},
{41, 2496000, 2690000, 2496000, 2690000, 6, 499200, 30},
{47, 5855000, 5925000, 5855000, 5925000, 1, 790334, 15},
- //{48, 3550000, 3700000, 3550000, 3700000, 1, 636667, 15},
- //{48, 3550000, 3700000, 3550000, 3700000, 2, 636668, 30},
+ {48, 3550000, 3700000, 3550000, 3700000, 1, 636667, 15},
+ {48, 3550000, 3700000, 3550000, 3700000, 2, 636668, 30},
{50, 1432000, 1517000, 1432000, 1517000, 20, 286400, 100},
{51, 1427000, 1432000, 1427000, 1432000, 20, 285400, 100},
{53, 2483500, 2495000, 2483500, 2495000, 20, 496700, 100},
@@ -90,14 +90,15 @@ nr_bandentry_t nr_bandtable[] = {
{84, 1920000, 1980000, 000, 000, 20, 384000, 100},
{86, 1710000, 1785000, 000, 000, 20, 342000, 100},
{89, 824000, 849000, 000, 000, 20, 342000, 100},
- {90, 2496000, 2690000, 2496000, 2690000, 3, 499200, 15},
- {90, 2496000, 2690000, 2496000, 2690000, 6, 499200, 30},
+ {90, 2496000, 2690000, 2496000, 2690000, 3, 499200, 15},
+ {90, 2496000, 2690000, 2496000, 2690000, 6, 499200, 30},
{90, 2496000, 2690000, 2496000, 2690000, 20, 499200, 100},
{91, 832000, 862000, 1427000, 1432000, 20, 285400, 100},
{92, 832000, 862000, 1432000, 1517000, 20, 286400, 100},
{93, 880000, 915000, 1427000, 1432000, 20, 285400, 100},
{94, 880000, 915000, 1432000, 1517000, 20, 286400, 100},
{95, 2010000, 2025000, 000, 000, 20, 402000, 100},
+ {96, 5925000, 7125000, 5925000, 7125000, 1, 795000, 15},
{257,26500020,29500000,26500020,29500000, 1,2054166, 60},
{257,26500080,29500000,26500080,29500000, 2,2054167, 120},
{258,24250080,27500000,24250080,27500000, 1,2016667, 60},
@@ -233,6 +234,30 @@ uint32_t nr_get_code_rate(uint8_t Imcs, uint8_t table_idx) {
}
+void get_coreset_rballoc(uint8_t *FreqDomainResource,int *n_rb,int *rb_offset) {
+
+ uint8_t count=0, start=0, start_set=0;
+
+ uint64_t bitmap = (((uint64_t)FreqDomainResource[0])<<37)|
+ (((uint64_t)FreqDomainResource[1])<<29)|
+ (((uint64_t)FreqDomainResource[2])<<21)|
+ (((uint64_t)FreqDomainResource[3])<<13)|
+ (((uint64_t)FreqDomainResource[4])<<5)|
+ (((uint64_t)FreqDomainResource[5])>>3);
+
+ for (int i=0; i<45; i++)
+ if ((bitmap>>(44-i))&1) {
+ count++;
+ if (!start_set) {
+ start = i;
+ start_set = 1;
+ }
+ }
+ *rb_offset = 6*start;
+ *n_rb = 6*count;
+}
+
+
int get_dmrs_port(int nl, uint16_t dmrs_ports) {
if (dmrs_ports == 0) return 0; // dci 1_0
@@ -405,9 +430,17 @@ int get_nr_table_idx(int nr_bandP, uint8_t scs_index) {
AssertFatal(nr_bandP <= nr_bandtable[nr_bandtable_size-1].band, "NR band %d exceeds NR bands table maximum limit %d\n", nr_bandP, nr_bandtable[nr_bandtable_size-1].band);
for (i = 0; i < nr_bandtable_size && nr_bandtable[i].band != nr_bandP; i++);
- // selection of correct Deltaf raster according to SCS
- if ((nr_bandtable[i].deltaf_raster != 100) && (nr_bandtable[i].deltaf_raster != scs_khz))
+ // In frequency bands with two deltaFRaster,
+ // the higher deltaFRaster applies to channels using only the SCS that is equal to or larger than the higher deltaFRaster
+ // and SSB SCS is equal to the higher deltaFRaster.
+ while(((i+1)>i)&1);
- return(num_dmrs);
-}
-
+void get_coreset_rballoc(uint8_t *FreqDomainResource,int *n_rb,int *rb_offset);
+int get_num_dmrs(uint16_t dmrs_mask);
uint16_t config_bandwidth(int mu, int nb_rb, int nr_band);
int get_nr_table_idx(int nr_bandP, uint8_t scs_index);
int32_t get_delta_duplex(int nr_bandP, uint8_t scs_index);
diff --git a/doc/BUILD.md b/doc/BUILD.md
index 166563877e..40b63ac697 100644
--- a/doc/BUILD.md
+++ b/doc/BUILD.md
@@ -88,6 +88,21 @@ You can build any oai softmodem executable separately, you may not need all of t
After completing the build, the binaries are available in the `cmake_targets/ran_build/build` directory. A copy is also available in the `target/bin` directory, with all binaries suffixed by the 3GPP release number, today .Rel15.
+When installing the pre-requisites, especially the `UHD` driver, you can now specify if you want to install from source or not.
+
+- For `fedora`-based OS, it was already the case all the time. But now you can specify which version to install.
+- For `ubuntu` OS, the Ettus PPA currently installs the following versions:
+ * `Ubuntu16.04`: --> version `3.15.0.0`
+ * `Ubuntu18.04`: --> version `4.1.0.0`
+
+```bash
+export BUILD_UHD_FROM_SOURCE=True
+export UHD_VERSION=3.15.0.0
+./build_oai -I -w USRP
+```
+
+The `UHD_VERSION` env variable `SHALL` be a valid tag (minus `v`) from the `https://github.com/EttusResearch/uhd.git` repository.
+
## Issue when building `nasmeh` module ##
A lot of users and contributors have faced the issue: `nasmesh` module does not build.
diff --git a/doc/RUNMODEM.md b/doc/RUNMODEM.md
index dc7a982310..d063afd5d9 100644
--- a/doc/RUNMODEM.md
+++ b/doc/RUNMODEM.md
@@ -203,10 +203,7 @@ UE on machine 2:
-
-
-
-
+[Selecting an alternative ldpc implementation at run time](../openair1/PHY/CODING/DOC/LDPCImplementation.md)
[oai wiki home](https://gitlab.eurecom.fr/oai/openairinterface5g/wikis/home)
diff --git a/docker/Dockerfile.eNB.rhel8.2 b/docker/Dockerfile.eNB.rhel8.2
index 90c807fc0e..0522271df0 100644
--- a/docker/Dockerfile.eNB.rhel8.2
+++ b/docker/Dockerfile.eNB.rhel8.2
@@ -41,17 +41,23 @@ RUN python3 ./docker/scripts/generateTemplate.py ./docker/scripts/enb_parameters
#start from scratch for target executable
FROM registry.access.redhat.com/ubi8/ubi:latest as oai-enb
+ENV TZ=Europe/Paris
RUN yum update -y && \
yum install -y --enablerepo="ubi-8-codeready-builder" \
lksctp-tools \
nettle \
+ tzdata \
procps-ng \
atlas \
+ python3 \
+ python3-pip \
net-tools \
iputils \
iproute \
libyaml && \
+ pip3 install six && \
+ pip3 install requests && \
echo "/usr/local/lib" > /etc/ld.so.conf.d/local-lib.conf && \
echo "/usr/local/lib64" >> /etc/ld.so.conf.d/local-lib.conf
@@ -78,6 +84,8 @@ COPY --from=enb-build /lib64/libconfig.so.9 /lib64
COPY --from=enb-build /lib64/libblas.so.3 /lib64
COPY --from=enb-build /lib64/liblapack.so.3 /lib64
COPY --from=enb-build /lib64/liblapacke.so.3 /lib64
+
+# Now we are copying from builder-image the UHD files.
COPY --from=enb-build /lib64/libboost_chrono.so.1.66.0 /lib64
COPY --from=enb-build /lib64/libboost_date_time.so.1.66.0 /lib64
COPY --from=enb-build /lib64/libboost_filesystem.so.1.66.0 /lib64
@@ -88,7 +96,14 @@ COPY --from=enb-build /lib64/libboost_system.so.1.66.0 /lib64
COPY --from=enb-build /lib64/libboost_unit_test_framework.so.1.66.0 /lib64
COPY --from=enb-build /lib64/libboost_atomic.so.1.66.0 /lib64
COPY --from=enb-build /lib64/libboost_timer.so.1.66.0 /lib64
-COPY --from=enb-build /usr/local/lib64/libuhd.so.4.0.0 /usr/local/lib64
+COPY --from=enb-build /lib64/libboost_regex.so.1.66.0 /lib64
+
+COPY --from=enb-build /usr/local/bin/uhd_find_devices /usr/local/bin
+COPY --from=enb-build /usr/local/lib64/libuhd.so.3.15.0 /usr/local/lib64
+COPY --from=enb-build /usr/local/lib64/uhd/utils/uhd_images_downloader.py /opt/oai-enb/bin
+
+WORKDIR /usr/local/share/uhd/rfnoc
+COPY --from=enb-build /usr/local/share/uhd/rfnoc/ .
RUN ldconfig
diff --git a/docker/Dockerfile.eNB.ubuntu18 b/docker/Dockerfile.eNB.ubuntu18
index c4393dc78e..cf748784e5 100644
--- a/docker/Dockerfile.eNB.ubuntu18
+++ b/docker/Dockerfile.eNB.ubuntu18
@@ -25,7 +25,7 @@
#
#---------------------------------------------------------------------
-FROM ran-build:latest AS enb-build
+FROM ran-build:latest AS enb-build
RUN rm -Rf /oai-ran
WORKDIR /oai-ran
@@ -42,8 +42,7 @@ RUN python3 ./docker/scripts/generateTemplate.py ./docker/scripts/enb_parameters
#start from scratch for target executable
FROM ubuntu:bionic as oai-enb
ENV DEBIAN_FRONTEND=noninteractive
-ENV TZ=Europe
-RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
+ENV TZ=Europe/Paris
RUN apt-get update && \
DEBIAN_FRONTEND=noninteractive apt-get upgrade --yes && \
@@ -60,16 +59,12 @@ RUN apt-get update && \
iputils-ping \
iproute2 \
iperf \
- libyaml-0-2 && \
- # Install UHD driver from ettus ppa
- # At time of writing, it is 3.14
- add-apt-repository ppa:ettusresearch/uhd --yes && \
- apt-get update && \
- DEBIAN_FRONTEND=noninteractive apt-get install --yes \
python \
+ python3 \
+ python3-six \
+ python3-requests \
libusb-1.0-0 \
- libuhd003 \
- uhd-host && \
+ libyaml-0-2 && \
rm -rf /var/lib/apt/lists/*
WORKDIR /opt/oai-enb/bin
@@ -90,6 +85,17 @@ RUN /bin/bash -c "ln -s /usr/local/lib/liboai_usrpdevif.so.Rel15 /usr/local/lib/
RUN /bin/bash -c "ln -s /usr/local/lib/librfsimulator.so.Rel15 /usr/local/lib/librfsimulator.so"
COPY --from=enb-build /usr/local/lib/libprotobuf-c.so.1 .
+# Now we are copying from builder-image the UHD files.
+COPY --from=enb-build /usr/local/bin/uhd_find_devices /usr/local/bin
+COPY --from=enb-build /usr/local/lib/libuhd.so.3.15.0 /usr/local/lib
+COPY --from=enb-build /usr/local/lib/uhd/utils/uhd_images_downloader.py /opt/oai-enb/bin
+WORKDIR /usr/lib/x86_64-linux-gnu
+COPY --from=enb-build /usr/lib/x86_64-linux-gnu/libboost_date_time.so.1.65.1 .
+COPY --from=enb-build /usr/lib/x86_64-linux-gnu/libboost_filesystem.so.1.65.1 .
+COPY --from=enb-build /usr/lib/x86_64-linux-gnu/libboost_regex.so.1.65.1 .
+COPY --from=enb-build /usr/lib/x86_64-linux-gnu/libboost_serialization.so.1.65.1 .
+COPY --from=enb-build /usr/lib/x86_64-linux-gnu/libboost_thread.so.1.65.1 .
+COPY --from=enb-build /usr/lib/x86_64-linux-gnu/libboost_system.so.1.65.1 .
RUN ldconfig
diff --git a/docker/Dockerfile.gNB.rhel8.2 b/docker/Dockerfile.gNB.rhel8.2
index 9ee0bf9ae9..b34a9d242d 100644
--- a/docker/Dockerfile.gNB.rhel8.2
+++ b/docker/Dockerfile.gNB.rhel8.2
@@ -41,6 +41,7 @@ RUN python3 ./docker/scripts/generateTemplate.py ./docker/scripts/gnb_parameters
#start from scratch for target executable
FROM registry.access.redhat.com/ubi8/ubi:latest as oai-gnb
+ENV TZ=Europe/Paris
RUN yum repolist --disablerepo=* && \
yum update -y && \
@@ -51,9 +52,14 @@ RUN yum repolist --disablerepo=* && \
atlas \
lksctp-tools \
nettle \
+ tzdata \
+ python3 \
+ python3-pip \
net-tools \
iputils \
libyaml && \
+ pip3 install six && \
+ pip3 install requests && \
echo "/usr/local/lib" > /etc/ld.so.conf.d/local-lib.conf && \
echo "/usr/local/lib64" >> /etc/ld.so.conf.d/local-lib.conf
@@ -84,6 +90,8 @@ COPY --from=gnb-build /lib64/libforms.so.2 /lib64
COPY --from=gnb-build /lib64/libblas.so.3 /lib64
COPY --from=gnb-build /lib64/liblapack.so.3 /lib64
COPY --from=gnb-build /lib64/liblapacke.so.3 /lib64
+
+# Now we are copying from builder-image the UHD files.
COPY --from=gnb-build /lib64/libboost_chrono.so.1.66.0 /lib64
COPY --from=gnb-build /lib64/libboost_date_time.so.1.66.0 /lib64
COPY --from=gnb-build /lib64/libboost_filesystem.so.1.66.0 /lib64
@@ -94,7 +102,14 @@ COPY --from=gnb-build /lib64/libboost_system.so.1.66.0 /lib64
COPY --from=gnb-build /lib64/libboost_unit_test_framework.so.1.66.0 /lib64
COPY --from=gnb-build /lib64/libboost_atomic.so.1.66.0 /lib64
COPY --from=gnb-build /lib64/libboost_timer.so.1.66.0 /lib64
-COPY --from=gnb-build /usr/local/lib64/libuhd.so.4.0.0 /usr/local/lib64
+COPY --from=gnb-build /lib64/libboost_regex.so.1.66.0 /lib64
+
+COPY --from=gnb-build /usr/local/bin/uhd_find_devices /usr/local/bin
+COPY --from=gnb-build /usr/local/lib64/libuhd.so.3.15.0 /usr/local/lib64
+COPY --from=gnb-build /usr/local/lib64/uhd/utils/uhd_images_downloader.py /opt/oai-gnb/bin
+
+WORKDIR /usr/local/share/uhd/rfnoc
+COPY --from=gnb-build /usr/local/share/uhd/rfnoc/ .
RUN ldconfig
diff --git a/docker/Dockerfile.gNB.ubuntu18 b/docker/Dockerfile.gNB.ubuntu18
index 990c4363e5..cfd9d82144 100644
--- a/docker/Dockerfile.gNB.ubuntu18
+++ b/docker/Dockerfile.gNB.ubuntu18
@@ -59,16 +59,12 @@ RUN apt-get update && \
net-tools \
iproute2 \
iputils-ping \
- libyaml-0-2 && \
- # Install UHD driver from ettus ppa
- # At time of writing, it is 3.14
- add-apt-repository ppa:ettusresearch/uhd --yes && \
- apt-get update && \
- DEBIAN_FRONTEND=noninteractive apt-get install --yes \
python \
+ python3 \
+ python3-six \
+ python3-requests \
libusb-1.0-0 \
- libuhd003 \
- uhd-host && \
+ libyaml-0-2 && \
rm -rf /var/lib/apt/lists/*
WORKDIR /opt/oai-gnb/bin
@@ -93,6 +89,18 @@ RUN /bin/bash -c "ln -s /usr/local/lib/liboai_usrpdevif.so.Rel15 /usr/local/lib/
RUN /bin/bash -c "ln -s /usr/local/lib/librfsimulator.so.Rel15 /usr/local/lib/librfsimulator.so"
COPY --from=gnb-build /usr/local/lib/libprotobuf-c.so.1 .
+# Now we are copying from builder-image the UHD files.
+COPY --from=gnb-build /usr/local/bin/uhd_find_devices /usr/local/bin
+COPY --from=gnb-build /usr/local/lib/libuhd.so.3.15.0 /usr/local/lib
+COPY --from=gnb-build /usr/local/lib/uhd/utils/uhd_images_downloader.py /opt/oai-gnb/bin
+WORKDIR /usr/lib/x86_64-linux-gnu
+COPY --from=gnb-build /usr/lib/x86_64-linux-gnu/libboost_date_time.so.1.65.1 .
+COPY --from=gnb-build /usr/lib/x86_64-linux-gnu/libboost_filesystem.so.1.65.1 .
+COPY --from=gnb-build /usr/lib/x86_64-linux-gnu/libboost_regex.so.1.65.1 .
+COPY --from=gnb-build /usr/lib/x86_64-linux-gnu/libboost_serialization.so.1.65.1 .
+COPY --from=gnb-build /usr/lib/x86_64-linux-gnu/libboost_thread.so.1.65.1 .
+COPY --from=gnb-build /usr/lib/x86_64-linux-gnu/libboost_system.so.1.65.1 .
+
RUN ldconfig
# Copy the relevant configuration files for gNB
diff --git a/docker/Dockerfile.lteRU.rhel8.2 b/docker/Dockerfile.lteRU.rhel8.2
index 314c01dff3..7e2a054a12 100644
--- a/docker/Dockerfile.lteRU.rhel8.2
+++ b/docker/Dockerfile.lteRU.rhel8.2
@@ -48,9 +48,13 @@ RUN yum update -y && \
tzdata \
procps-ng \
atlas \
+ python3 \
+ python3-pip \
net-tools \
iputils \
iproute && \
+ pip3 install six && \
+ pip3 install requests && \
echo "/usr/local/lib" > /etc/ld.so.conf.d/local-lib.conf && \
echo "/usr/local/lib64" >> /etc/ld.so.conf.d/local-lib.conf
@@ -66,11 +70,12 @@ COPY --from=ru-build /oai-ran/targets/bin/liboai_usrpdevif.so.Rel15 .
COPY --from=ru-build /oai-ran/targets/bin/libparams_libconfig.so .
COPY --from=ru-build /oai-ran/cmake_targets/ran_build/build/libdfts.so .
-# Copying from the ran-build image the USRP needed packages
COPY --from=ru-build /lib64/libconfig.so.9 /lib64
COPY --from=ru-build /lib64/libblas.so.3 /lib64
COPY --from=ru-build /lib64/liblapack.so.3 /lib64
COPY --from=ru-build /lib64/liblapacke.so.3 /lib64
+
+# Copying from the ran-build image the USRP needed packages
COPY --from=ru-build /lib64/libboost_chrono.so.1.66.0 /lib64
COPY --from=ru-build /lib64/libboost_date_time.so.1.66.0 /lib64
COPY --from=ru-build /lib64/libboost_filesystem.so.1.66.0 /lib64
@@ -81,7 +86,14 @@ COPY --from=ru-build /lib64/libboost_system.so.1.66.0 /lib64
COPY --from=ru-build /lib64/libboost_unit_test_framework.so.1.66.0 /lib64
COPY --from=ru-build /lib64/libboost_atomic.so.1.66.0 /lib64
COPY --from=ru-build /lib64/libboost_timer.so.1.66.0 /lib64
-COPY --from=ru-build /usr/local/lib64/libuhd.so.4.0.0 /usr/local/lib64
+COPY --from=ru-build /lib64/libboost_regex.so.1.66.0 /lib64
+
+COPY --from=ru-build /usr/local/bin/uhd_find_devices /usr/local/bin
+COPY --from=ru-build /usr/local/lib64/libuhd.so.3.15.0 /usr/local/lib64
+COPY --from=ru-build /usr/local/lib64/uhd/utils/uhd_images_downloader.py /opt/oai-lte-ru/bin
+
+WORKDIR /usr/local/share/uhd/rfnoc
+COPY --from=ru-build /usr/local/share/uhd/rfnoc/ .
RUN /bin/bash -c "ln -s /usr/local/lib/liboai_eth_transpro.so.Rel15 /usr/local/lib/liboai_transpro.so" && \
/bin/bash -c "ln -s /usr/local/lib/liboai_usrpdevif.so.Rel15 /usr/local/lib/liboai_device.so" && \
diff --git a/docker/Dockerfile.lteRU.ubuntu18 b/docker/Dockerfile.lteRU.ubuntu18
index fa99827d94..eafb8fa8af 100644
--- a/docker/Dockerfile.lteRU.ubuntu18
+++ b/docker/Dockerfile.lteRU.ubuntu18
@@ -54,17 +54,13 @@ RUN apt-get update && \
libatlas3-base \
libconfig9 \
net-tools \
+ python \
+ python3 \
+ python3-six \
+ python3-requests \
+ libusb-1.0-0 \
iputils-ping \
iproute2 && \
- # Install UHD driver from ettus ppa
- # At time of writing, it is 3.14
- add-apt-repository ppa:ettusresearch/uhd --yes && \
- apt-get update && \
- DEBIAN_FRONTEND=noninteractive apt-get install --yes \
- python \
- libusb-1.0-0 \
- libuhd003 \
- uhd-host && \
rm -rf /var/lib/apt/lists/*
WORKDIR /opt/oai-lte-ru/bin
@@ -78,6 +74,19 @@ COPY --from=ru-build /oai-ran/targets/bin/librfsimulator.so.Rel15 .
COPY --from=ru-build /oai-ran/targets/bin/liboai_usrpdevif.so.Rel15 .
COPY --from=ru-build /oai-ran/targets/bin/libparams_libconfig.so .
COPY --from=ru-build /oai-ran/cmake_targets/ran_build/build/libdfts.so .
+
+# Now we are copying from builder-image the UHD files.
+COPY --from=ru-build /usr/local/bin/uhd_find_devices /usr/local/bin
+COPY --from=ru-build /usr/local/lib/libuhd.so.3.15.0 /usr/local/lib
+COPY --from=ru-build /usr/local/lib/uhd/utils/uhd_images_downloader.py /opt/oai-lte-ru/bin
+WORKDIR /usr/lib/x86_64-linux-gnu
+COPY --from=ru-build /usr/lib/x86_64-linux-gnu/libboost_date_time.so.1.65.1 .
+COPY --from=ru-build /usr/lib/x86_64-linux-gnu/libboost_filesystem.so.1.65.1 .
+COPY --from=ru-build /usr/lib/x86_64-linux-gnu/libboost_regex.so.1.65.1 .
+COPY --from=ru-build /usr/lib/x86_64-linux-gnu/libboost_serialization.so.1.65.1 .
+COPY --from=ru-build /usr/lib/x86_64-linux-gnu/libboost_thread.so.1.65.1 .
+COPY --from=ru-build /usr/lib/x86_64-linux-gnu/libboost_system.so.1.65.1 .
+
RUN /bin/bash -c "ln -s /usr/local/lib/liboai_eth_transpro.so.Rel15 /usr/local/lib/liboai_transpro.so" && \
/bin/bash -c "ln -s /usr/local/lib/liboai_usrpdevif.so.Rel15 /usr/local/lib/liboai_device.so" && \
/bin/bash -c "ln -s /usr/local/lib/librfsimulator.so.Rel15 /usr/local/lib/librfsimulator.so" && \
diff --git a/docker/Dockerfile.lteUE.rhel8.2 b/docker/Dockerfile.lteUE.rhel8.2
index 936780297a..a6814be136 100644
--- a/docker/Dockerfile.lteUE.rhel8.2
+++ b/docker/Dockerfile.lteUE.rhel8.2
@@ -42,17 +42,23 @@ RUN python3 ./docker/scripts/generateTemplate.py ./docker/scripts/lte_ue_paramet
#start from scratch for target executable
FROM registry.access.redhat.com/ubi8/ubi:latest as oai-lte-ue
+ENV TZ=Europe/Paris
RUN yum update -y && \
yum install -y --enablerepo="ubi-8-codeready-builder" \
lksctp-tools \
procps-ng \
nettle \
+ tzdata \
atlas \
+ python3 \
+ python3-pip \
iproute \
net-tools \
iputils \
libyaml && \
+ pip3 install six && \
+ pip3 install requests && \
echo "/usr/local/lib" > /etc/ld.so.conf.d/local-lib.conf && \
echo "/usr/local/lib64" >> /etc/ld.so.conf.d/local-lib.conf
@@ -82,6 +88,8 @@ COPY --from=lte-ue-build /lib64/libconfig.so.9 /lib64
COPY --from=lte-ue-build /lib64/libblas.so.3 /lib64
COPY --from=lte-ue-build /lib64/liblapack.so.3 /lib64
COPY --from=lte-ue-build /lib64/liblapacke.so.3 /lib64
+
+# Now we are copying from builder-image the UHD files.
COPY --from=lte-ue-build /lib64/libboost_chrono.so.1.66.0 /lib64
COPY --from=lte-ue-build /lib64/libboost_date_time.so.1.66.0 /lib64
COPY --from=lte-ue-build /lib64/libboost_filesystem.so.1.66.0 /lib64
@@ -92,7 +100,14 @@ COPY --from=lte-ue-build /lib64/libboost_system.so.1.66.0 /lib64
COPY --from=lte-ue-build /lib64/libboost_unit_test_framework.so.1.66.0 /lib64
COPY --from=lte-ue-build /lib64/libboost_atomic.so.1.66.0 /lib64
COPY --from=lte-ue-build /lib64/libboost_timer.so.1.66.0 /lib64
-COPY --from=lte-ue-build /usr/local/lib64/libuhd.so.4.0.0 /usr/local/lib64
+COPY --from=lte-ue-build /lib64/libboost_regex.so.1.66.0 /lib64
+
+COPY --from=lte-ue-build /usr/local/bin/uhd_find_devices /usr/local/bin
+COPY --from=lte-ue-build /usr/local/lib64/libuhd.so.3.15.0 /usr/local/lib64
+COPY --from=lte-ue-build /usr/local/lib64/uhd/utils/uhd_images_downloader.py /opt/oai-lte-ue/bin
+
+WORKDIR /usr/local/share/uhd/rfnoc
+COPY --from=lte-ue-build /usr/local/share/uhd/rfnoc/ .
RUN ldconfig
diff --git a/docker/Dockerfile.lteUE.ubuntu18 b/docker/Dockerfile.lteUE.ubuntu18
index 34cbe651ad..6d54ab08fc 100644
--- a/docker/Dockerfile.lteUE.ubuntu18
+++ b/docker/Dockerfile.lteUE.ubuntu18
@@ -43,8 +43,7 @@ RUN python3 ./docker/scripts/generateTemplate.py ./docker/scripts/lte_ue_paramet
#start from scratch for target executable
FROM ubuntu:bionic as oai-lte-ue
ENV DEBIAN_FRONTEND=noninteractive
-ENV TZ=Europe
-RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
+ENV TZ=Europe/Paris
RUN apt-get update && \
DEBIAN_FRONTEND=noninteractive apt-get upgrade --yes && \
@@ -58,19 +57,15 @@ RUN apt-get update && \
libconfig9 \
openssl \
net-tools \
+ python \
+ python3 \
+ python3-six \
+ python3-requests \
+ libusb-1.0-0 \
iputils-ping \
iproute2 \
iperf \
libyaml-0-2 && \
- # Install UHD driver from ettus ppa
- # At time of writing, it is 3.14
- add-apt-repository ppa:ettusresearch/uhd --yes && \
- apt-get update && \
- DEBIAN_FRONTEND=noninteractive apt-get install --yes \
- python \
- libusb-1.0-0 \
- libuhd003 \
- uhd-host && \
rm -rf /var/lib/apt/lists/*
WORKDIR /opt/oai-lte-ue/bin
@@ -95,6 +90,18 @@ RUN /bin/bash -c "ln -s /usr/local/lib/librfsimulator.so.Rel15 /usr/local/lib/li
COPY --from=lte-ue-build /usr/local/lib/libprotobuf-c.so.1 .
+# Now we are copying from builder-image the UHD files.
+COPY --from=lte-ue-build /usr/local/bin/uhd_find_devices /usr/local/bin
+COPY --from=lte-ue-build /usr/local/lib/libuhd.so.3.15.0 /usr/local/lib
+COPY --from=lte-ue-build /usr/local/lib/uhd/utils/uhd_images_downloader.py /opt/oai-lte-ue/bin
+WORKDIR /usr/lib/x86_64-linux-gnu
+COPY --from=lte-ue-build /usr/lib/x86_64-linux-gnu/libboost_date_time.so.1.65.1 .
+COPY --from=lte-ue-build /usr/lib/x86_64-linux-gnu/libboost_filesystem.so.1.65.1 .
+COPY --from=lte-ue-build /usr/lib/x86_64-linux-gnu/libboost_regex.so.1.65.1 .
+COPY --from=lte-ue-build /usr/lib/x86_64-linux-gnu/libboost_serialization.so.1.65.1 .
+COPY --from=lte-ue-build /usr/lib/x86_64-linux-gnu/libboost_thread.so.1.65.1 .
+COPY --from=lte-ue-build /usr/lib/x86_64-linux-gnu/libboost_system.so.1.65.1 .
+
RUN ldconfig
# Copy the relevant configuration files for UE
diff --git a/docker/Dockerfile.nrUE.rhel8.2 b/docker/Dockerfile.nrUE.rhel8.2
index 56fc746ade..ec74d11940 100644
--- a/docker/Dockerfile.nrUE.rhel8.2
+++ b/docker/Dockerfile.nrUE.rhel8.2
@@ -51,9 +51,13 @@ RUN yum update -y && \
iputils \
iproute \
atlas \
+ python3 \
+ python3-pip \
libXpm \
libX11 \
libyaml && \
+ pip3 install six && \
+ pip3 install requests && \
echo "/usr/local/lib" > /etc/ld.so.conf.d/local-lib.conf && \
echo "/usr/local/lib64" >> /etc/ld.so.conf.d/local-lib.conf
@@ -87,6 +91,8 @@ COPY --from=nr-ue-build /lib64/libblas.so.3 /lib64
COPY --from=nr-ue-build /lib64/liblapack.so.3 /lib64
COPY --from=nr-ue-build /lib64/liblapacke.so.3 /lib64
COPY --from=nr-ue-build /lib64/libforms.so.2 /lib64
+
+# Now we are copying from builder-image the UHD files.
COPY --from=nr-ue-build /lib64/libboost_chrono.so.1.66.0 /lib64
COPY --from=nr-ue-build /lib64/libboost_date_time.so.1.66.0 /lib64
COPY --from=nr-ue-build /lib64/libboost_filesystem.so.1.66.0 /lib64
@@ -97,7 +103,15 @@ COPY --from=nr-ue-build /lib64/libboost_system.so.1.66.0 /lib64
COPY --from=nr-ue-build /lib64/libboost_unit_test_framework.so.1.66.0 /lib64
COPY --from=nr-ue-build /lib64/libboost_atomic.so.1.66.0 /lib64
COPY --from=nr-ue-build /lib64/libboost_timer.so.1.66.0 /lib64
-COPY --from=nr-ue-build /usr/local/lib64/libuhd.so.4.0.0 /usr/local/lib64
+COPY --from=nr-ue-build /lib64/libboost_regex.so.1.66.0 /lib64
+
+COPY --from=nr-ue-build /usr/local/bin/uhd_find_devices /usr/local/bin
+COPY --from=nr-ue-build /usr/local/lib64/libuhd.so.3.15.0 /usr/local/lib64
+COPY --from=nr-ue-build /usr/local/lib64/uhd/utils/uhd_images_downloader.py /opt/oai-nr-ue/bin
+
+WORKDIR /usr/local/share/uhd/rfnoc
+COPY --from=nr-ue-build /usr/local/share/uhd/rfnoc/ .
+
RUN ldconfig
diff --git a/docker/Dockerfile.nrUE.ubuntu18 b/docker/Dockerfile.nrUE.ubuntu18
index fc30af7286..49e3f3213b 100644
--- a/docker/Dockerfile.nrUE.ubuntu18
+++ b/docker/Dockerfile.nrUE.ubuntu18
@@ -55,19 +55,15 @@ RUN apt-get update && \
libconfig9 \
openssl \
net-tools \
+ python \
+ python3 \
+ python3-six \
+ python3-requests \
+ libusb-1.0-0 \
iputils-ping \
iproute2 \
iperf \
libyaml-0-2 && \
- # Install UHD driver from ettus ppa
- # At time of writing, it is 3.14
- add-apt-repository ppa:ettusresearch/uhd --yes && \
- apt-get update && \
- DEBIAN_FRONTEND=noninteractive apt-get install --yes \
- python \
- libusb-1.0-0 \
- libuhd003 \
- uhd-host && \
rm -rf /var/lib/apt/lists/*
WORKDIR /opt/oai-nr-ue/bin
@@ -95,6 +91,18 @@ RUN /bin/bash -c "ln -s /usr/local/lib/librfsimulator.so.Rel15 /usr/local/lib/li
COPY --from=nr-ue-build /usr/local/lib/libprotobuf-c.so.1 .
+# Now we are copying from builder-image the UHD files.
+COPY --from=nr-ue-build /usr/local/bin/uhd_find_devices /usr/local/bin
+COPY --from=nr-ue-build /usr/local/lib/libuhd.so.3.15.0 /usr/local/lib
+COPY --from=nr-ue-build /usr/local/lib/uhd/utils/uhd_images_downloader.py /opt/oai-nr-ue/bin
+WORKDIR /usr/lib/x86_64-linux-gnu
+COPY --from=nr-ue-build /usr/lib/x86_64-linux-gnu/libboost_date_time.so.1.65.1 .
+COPY --from=nr-ue-build /usr/lib/x86_64-linux-gnu/libboost_filesystem.so.1.65.1 .
+COPY --from=nr-ue-build /usr/lib/x86_64-linux-gnu/libboost_regex.so.1.65.1 .
+COPY --from=nr-ue-build /usr/lib/x86_64-linux-gnu/libboost_serialization.so.1.65.1 .
+COPY --from=nr-ue-build /usr/lib/x86_64-linux-gnu/libboost_thread.so.1.65.1 .
+COPY --from=nr-ue-build /usr/lib/x86_64-linux-gnu/libboost_system.so.1.65.1 .
+
RUN ldconfig
WORKDIR /opt/oai-nr-ue
diff --git a/docker/Dockerfile.ran.rhel8.2 b/docker/Dockerfile.ran.rhel8.2
index 3972fd0c35..4d15220ca8 100644
--- a/docker/Dockerfile.ran.rhel8.2
+++ b/docker/Dockerfile.ran.rhel8.2
@@ -28,6 +28,9 @@
FROM registry.access.redhat.com/ubi8/ubi:latest AS ran-build
ARG NEEDED_GIT_PROXY
+ENV TZ=Europe/Paris
+ENV BUILD_UHD_FROM_SOURCE=True
+ENV UHD_VERSION=3.15.0.0
COPY tmp/ca/redhat-uep.pem /etc/rhsm/ca
COPY tmp/entitlement/*.pem /etc/pki/entitlement
diff --git a/docker/Dockerfile.ran.ubuntu18 b/docker/Dockerfile.ran.ubuntu18
index 4b296408fd..3ef81ec030 100644
--- a/docker/Dockerfile.ran.ubuntu18
+++ b/docker/Dockerfile.ran.ubuntu18
@@ -29,8 +29,9 @@
FROM ubuntu:bionic AS ran-build
ARG NEEDED_GIT_PROXY
ENV DEBIAN_FRONTEND=noninteractive
-ENV TZ=Europe
-RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
+ENV TZ=Europe/Paris
+ENV BUILD_UHD_FROM_SOURCE=True
+ENV UHD_VERSION=3.15.0.0
#install developers pkg/repo
RUN apt-get update && \
diff --git a/docker/scripts/enb_entrypoint.sh b/docker/scripts/enb_entrypoint.sh
index 2e8886e855..ff92e3c86f 100755
--- a/docker/scripts/enb_entrypoint.sh
+++ b/docker/scripts/enb_entrypoint.sh
@@ -46,11 +46,11 @@ done
# Load the USRP binaries
if [[ -v USE_B2XX ]]; then
- /usr/lib/uhd/utils/uhd_images_downloader.py -t b2xx
+ $PREFIX/bin/uhd_images_downloader.py -t b2xx
elif [[ -v USE_X3XX ]]; then
- /usr/lib/uhd/utils/uhd_images_downloader.py -t x3xx
+ $PREFIX/bin/uhd_images_downloader.py -t x3xx
elif [[ -v USE_N3XX ]]; then
- /usr/lib/uhd/utils/uhd_images_downloader.py -t n3xx
+ $PREFIX/bin/uhd_images_downloader.py -t n3xx
fi
echo "=================================="
diff --git a/docker/scripts/gnb_entrypoint.sh b/docker/scripts/gnb_entrypoint.sh
index 678ec6cb1b..05b42d76bb 100755
--- a/docker/scripts/gnb_entrypoint.sh
+++ b/docker/scripts/gnb_entrypoint.sh
@@ -37,11 +37,11 @@ done
# Load the USRP binaries
if [[ -v USE_B2XX ]]; then
- /usr/lib/uhd/utils/uhd_images_downloader.py -t b2xx
+ $PREFIX/bin/uhd_images_downloader.py -t b2xx
elif [[ -v USE_X3XX ]]; then
- /usr/lib/uhd/utils/uhd_images_downloader.py -t x3xx
+ $PREFIX/bin/uhd_images_downloader.py -t x3xx
elif [[ -v USE_N3XX ]]; then
- /usr/lib/uhd/utils/uhd_images_downloader.py -t n3xx
+ $PREFIX/bin/uhd_images_downloader.py -t n3xx
fi
echo "=================================="
diff --git a/docker/scripts/lte_ru_entrypoint.sh b/docker/scripts/lte_ru_entrypoint.sh
index f466e25ec2..93122b0d02 100755
--- a/docker/scripts/lte_ru_entrypoint.sh
+++ b/docker/scripts/lte_ru_entrypoint.sh
@@ -35,11 +35,11 @@ done
# Load the USRP binaries
if [[ -v USE_B2XX ]]; then
- /usr/lib/uhd/utils/uhd_images_downloader.py -t b2xx
+ $PREFIX/bin/uhd_images_downloader.py -t b2xx
elif [[ -v USE_X3XX ]]; then
- /usr/lib/uhd/utils/uhd_images_downloader.py -t x3xx
+ $PREFIX/bin/uhd_images_downloader.py -t x3xx
elif [[ -v USE_N3XX ]]; then
- /usr/lib/uhd/utils/uhd_images_downloader.py -t n3xx
+ $PREFIX/bin/uhd_images_downloader.py -t n3xx
fi
echo "=================================="
diff --git a/docker/scripts/lte_ue_entrypoint.sh b/docker/scripts/lte_ue_entrypoint.sh
index 235128f738..de7ae8b496 100755
--- a/docker/scripts/lte_ue_entrypoint.sh
+++ b/docker/scripts/lte_ue_entrypoint.sh
@@ -39,11 +39,11 @@ $PREFIX/bin/conf2uedata -c $PREFIX/etc/ue_usim.conf -o $PREFIX
# Load the USRP binaries
if [[ -v USE_B2XX ]]; then
- /usr/lib/uhd/utils/uhd_images_downloader.py -t b2xx
+ $PREFIX/bin/uhd_images_downloader.py -t b2xx
elif [[ -v USE_X3XX ]]; then
- /usr/lib/uhd/utils/uhd_images_downloader.py -t x3xx
+ $PREFIX/bin/uhd_images_downloader.py -t x3xx
elif [[ -v USE_N3XX ]]; then
- /usr/lib/uhd/utils/uhd_images_downloader.py -t n3xx
+ $PREFIX/bin/uhd_images_downloader.py -t n3xx
fi
# in case we have conf file, append
diff --git a/docker/scripts/nr_ue_entrypoint.sh b/docker/scripts/nr_ue_entrypoint.sh
index 691258b8fa..91d25c9e1e 100755
--- a/docker/scripts/nr_ue_entrypoint.sh
+++ b/docker/scripts/nr_ue_entrypoint.sh
@@ -34,11 +34,11 @@ done
# Load the USRP binaries
if [[ -v USE_B2XX ]]; then
- /usr/lib/uhd/utils/uhd_images_downloader.py -t b2xx
+ $PREFIX/bin/uhd_images_downloader.py -t b2xx
elif [[ -v USE_X3XX ]]; then
- /usr/lib/uhd/utils/uhd_images_downloader.py -t x3xx
+ $PREFIX/bin/uhd_images_downloader.py -t x3xx
elif [[ -v USE_N3XX ]]; then
- /usr/lib/uhd/utils/uhd_images_downloader.py -t n3xx
+ $PREFIX/bin/uhd_images_downloader.py -t n3xx
fi
# in case we have conf file, append
diff --git a/executables/nr-gnb.c b/executables/nr-gnb.c
index 439f4691d3..653a84336a 100644
--- a/executables/nr-gnb.c
+++ b/executables/nr-gnb.c
@@ -76,10 +76,6 @@
#include "gnb_paramdef.h"
-#ifndef OPENAIR2
- #include "UTIL/OTG/otg_extern.h"
-#endif
-
#include "s1ap_eNB.h"
#include "SIMULATION/ETH_TRANSPORT/proto.h"
#include
diff --git a/executables/nr-ru.c b/executables/nr-ru.c
index 336b7bec12..c90750d39a 100644
--- a/executables/nr-ru.c
+++ b/executables/nr-ru.c
@@ -70,10 +70,6 @@ static int DEFBFW[] = {0x00007fff};
#include "GNB_APP/gnb_paramdef.h"
#include "common/config/config_userapi.h"
-#ifndef OPENAIR2
- #include "UTIL/OTG/otg_extern.h"
-#endif
-
#include "s1ap_eNB.h"
#include "SIMULATION/ETH_TRANSPORT/proto.h"
#include
diff --git a/executables/nr-softmodem-common.h b/executables/nr-softmodem-common.h
index 5b6d21d177..c02155326b 100644
--- a/executables/nr-softmodem-common.h
+++ b/executables/nr-softmodem-common.h
@@ -30,12 +30,8 @@
#include "PHY/types.h"
#include
-#if defined(ENABLE_USE_MME)
#include "s1ap_eNB.h"
-#ifdef PDCP_USE_NETLINK
#include "SIMULATION/ETH_TRANSPORT/proto.h"
-#endif
-#endif
/* help strings definition for command line options, used in CMDLINE_XXX_DESC macros and printed when -h option is used */
#define CONFIG_HLP_RFCFGF "Configuration file for front-end (e.g. LMS7002M)\n"
diff --git a/executables/nr-softmodem.c b/executables/nr-softmodem.c
index 1b33667b13..a2b5c18b6c 100644
--- a/executables/nr-softmodem.c
+++ b/executables/nr-softmodem.c
@@ -66,10 +66,6 @@ unsigned short config_frames[4] = {2,9,11,13};
//#include "PHY/TOOLS/time_meas.h"
-#ifndef OPENAIR2
- #include "UTIL/OTG/otg_vars.h"
-#endif
-
#include "intertask_interface.h"
#include "PHY/INIT/phy_init.h"
@@ -692,15 +688,10 @@ int main( int argc, char **argv ) {
// initialize mscgen log after ITTI
MSC_INIT(MSC_E_UTRAN, ADDED_QUEUES_MAX+TASK_MAX);
init_opt();
-#ifdef PDCP_USE_NETLINK
-
- if(!IS_SOFTMODEM_NOS1)
- netlink_init();
-
-#if defined(PDCP_USE_NETLINK_QUEUES)
- pdcp_netlink_init();
-#endif
-#endif
+ if(PDCP_USE_NETLINK)
+ if(!IS_SOFTMODEM_NOS1)
+ netlink_init();
+
#ifndef PACKAGE_VERSION
# define PACKAGE_VERSION "UNKNOWN-EXPERIMENTAL"
#endif
diff --git a/executables/nr-ue.c b/executables/nr-ue.c
index 7006822d2a..e23b1a62c8 100644
--- a/executables/nr-ue.c
+++ b/executables/nr-ue.c
@@ -19,6 +19,7 @@
* contact@openairinterface.org
*/
+#include
#include "executables/nr-uesoftmodem.h"
#include "PHY/phy_extern_nr_ue.h"
#include "PHY/INIT/phy_init.h"
@@ -87,11 +88,7 @@
*
*/
-#ifndef NO_RAT_NR
- #define DURATION_RX_TO_TX (NR_UE_CAPABILITY_SLOT_RX_TO_TX) /* for NR this will certainly depends to such UE capability which is not yet defined */
-#else
- #define DURATION_RX_TO_TX (6) /* For LTE, this duration is fixed to 4 and it is linked to LTE standard for both modes FDD/TDD */
-#endif
+
#define RX_JOB_ID 0x1010
#define TX_JOB_ID 100
@@ -463,13 +460,18 @@ int computeSamplesShift(PHY_VARS_NR_UE *UE) {
// compute TO compensation that should be applied for this frame
if ( UE->rx_offset < UE->frame_parms.samples_per_frame/2 &&
UE->rx_offset > 0 ) {
- //LOG_I(PHY,"!!!adjusting -1 samples!!!\n");
+ LOG_I(PHY,"!!!adjusting -1 samples!!! rx_offset == %d\n", UE->rx_offset);
+ UE->rx_offset = 0; // reset so that it is not applied falsely in case of SSB being only in every second frame
+ UE->max_pos_fil = 0; // reset IIR filter when sample shift is applied
return -1 ;
}
if ( UE->rx_offset > UE->frame_parms.samples_per_frame/2 &&
UE->rx_offset < UE->frame_parms.samples_per_frame ) {
- //LOG_I(PHY,"!!!adjusting +1 samples!!!\n");
+ int rx_offset = UE->rx_offset - UE->frame_parms.samples_per_frame;
+ LOG_I(PHY,"!!!adjusting +1 samples!!! rx_offset == %d\n", rx_offset);
+ UE->rx_offset = 0; // reset so that it is not applied falsely in case of SSB being only in every second frame
+ UE->max_pos_fil = 0; // reset IIR filter when sample shift is applied
return 1;
}
diff --git a/executables/nr-uesoftmodem.c b/executables/nr-uesoftmodem.c
index 5a8b381206..ad5ea982c9 100644
--- a/executables/nr-uesoftmodem.c
+++ b/executables/nr-uesoftmodem.c
@@ -63,10 +63,6 @@ unsigned short config_frames[4] = {2,9,11,13};
#include "enb_config.h"
//#include "PHY/TOOLS/time_meas.h"
-#ifndef OPENAIR2
- #include "UTIL/OTG/otg_vars.h"
-#endif
-
#include "intertask_interface.h"
#include "PHY/INIT/phy_init.h"
@@ -436,7 +432,7 @@ int main( int argc, char **argv ) {
itti_init(TASK_MAX, tasks_info);
init_opt() ;
- load_nrLDPClib();
+ load_nrLDPClib(NULL);
if (ouput_vcd) {
vcd_signal_dumper_init("/tmp/openair_dump_nrUE.vcd");
diff --git a/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_constants.h b/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_constants.h
index 8e6bf9a802..e144ce9447 100644
--- a/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_constants.h
+++ b/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_constants.h
@@ -10,7 +10,7 @@
#define FAPI_NR_MAX_RA_OCCASION_PER_CSIRS 64
// Constants Defined in 38.213
#define FAPI_NR_MAX_CORESET_PER_BWP 3
-#define FAPI_NR_MAX_SS_PER_CORESET 10
+#define FAPI_NR_MAX_SS 10
/// RX_IND
diff --git a/openair1/PHY/CODING/DOC/LDPCImplementation.md b/openair1/PHY/CODING/DOC/LDPCImplementation.md
index 89ae6b4dbb..c5411540b6 100644
--- a/openair1/PHY/CODING/DOC/LDPCImplementation.md
+++ b/openair1/PHY/CODING/DOC/LDPCImplementation.md
@@ -1,11 +1,13 @@
-#LDPC coder/decoder implementation
+# LDPC coder/decoder implementation
The LDPC coder and decoder are implemented in a shared library, dynamically loaded at run-time using the [oai shared library loader](file://../../../../common/utils/DOC/loader.md). The code loading the LDPC library is in [nrLDPC_load.c](file://../nrLDPC_load.c), in function `load_nrLDPClib`, which must be called at init time.
## Selecting the LDPC library at run time
By default the function `int load_nrLDPClib(void)` looks for `libldpc.so`, this default behavior can be changed using the oai loader configuration options in the configuration file or from the command line as shown below:
->loading `libldpc_optim8seg.so` instead of `libldpc.so`
+#### Examples of ldpc shared lib selection when running nr softmodem's:
+
+loading `libldpc_optim8seg.so` instead of `libldpc.so`:
```
./nr-softmodem -O libconfig:gnb.band78.tm1.106PRB.usrpx300.conf:dbgl5 --loader.ldpc.shlibversion _optim8seg
@@ -18,9 +20,160 @@ By default the function `int load_nrLDPClib(void)` looks for `libldpc.so`, this
........................
```
-Today, this mechanism is not available in the `ldpctest` phy simulator which doesn't initialize the [configuration module](file://../../../../common/config/DOC/config.md). loads `libldpc.so` and `libldpc_orig.so` to compare the performance of the two implementations.
+loading `libldpc_cl.so` instead of `libldpc.so`:
-###LDPC libraries
-Libraries implementing the LDPC algorithms must be named `libldpc<_version>.so`, they must implement two functions: `nrLDPC_decod` and `nrLDPC_encod`. The prototypes for these functions is defined in [nrLDPC_defs.h](file://nrLDPC_defs.h).
+`make ldpc_cl`
+
+`cp ../../../openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_kernels_CL.cl`
+
+`./nr-softmodem -O libconfig:gnb.band78.sa.fr1.106PRB.usrpb210.conf:dbgl5 --rfsim --rfsimulator.serveraddr server --sa --log_config.gtpu_log_level info --loader.ldpc.shlibversion _cl`
+
+``` [LOADER] library libldpc_cl.so successfully loaded
+------------------------------------------------
+[HW] Platform 0, OpenCL profile FULL_PROFILE
+[HW] Platform 0, OpenCL version OpenCL 2.1 LINUX
+[HW] Device 0 is available
+[HW] Device 0, type 2 = 0x00000002: cpu
+[HW] Device 0, number of Compute Units: 8
+[HW] Device 0, max Work Items dimension: 3
+[HW] Device 0, max Work Items size for dimension: 0 8192
+[HW] Device 0, max Work Items size for dimension: 1 8192
+[HW] Device 0, max Work Items size for dimension: 2 8192
+[New Thread 0x7fffcc258700 (LWP 3945123)]
+[New Thread 0x7fffc3e57700 (LWP 3945124)]
+[New Thread 0x7fffcbe57700 (LWP 3945125)]
+[New Thread 0x7fffcba56700 (LWP 3945126)]
+[New Thread 0x7fffcb254700 (LWP 3945128)]
+[New Thread 0x7fffcb655700 (LWP 3945127)]
+[New Thread 0x7fffcae53700 (LWP 3945129)]
+[HW] Platform 1, OpenCL profile FULL_PROFILE
+[HW] Platform 1, OpenCL version OpenCL 2.0 beignet 1.3
+[New Thread 0x7fffc965a700 (LWP 3945130)]
+[Thread 0x7fffc965a700 (LWP 3945130) exited]
+[HW] Device 0 is available
+[HW] Device 0, type 4 = 0x00000004: gpu
+[HW] Device 0, number of Compute Units: 20
+[HW] Device 0, max Work Items dimension: 3
+[HW] Device 0, max Work Items size for dimension: 0 512
+[HW] Device 0, max Work Items size for dimension: 1 512
+[HW] Device 0, max Work Items size for dimension: 2 512
+-----------------------------------------------------------------
+```
+
+`./nr-uesoftmodem -r 106 --numerology 1 --band 78 -C 3619200000 --rfsim --sa -O libconfig:/usr/local/oai/conf/nrue_sim.conf:dbgl5 --nokrnmod --loader.ldpc.shlibversion _cl --log_config.hw_log_level info`
+
+```[CONFIG] shlibversion set to _cl from command line
+............................................................
+[CONFIG] loader.ldpc 1 options set from command line
+[LOADER] library libldpc_cl.so successfully loaded
+[HW] Platform 0, OpenCL profile FULL_PROFILE
+[HW] Platform 0, OpenCL version OpenCL 2.1 LINUX
+[HW] Device 0 is available
+[HW] Device 0, type 2 = 0x00000002: cpu
+[HW] Device 0, number of Compute Units: 8
+[HW] Device 0, max Work Items dimension: 3
+[HW] Device 0, max Work Items size for dimension: 0 8192
+[HW] Device 0, max Work Items size for dimension: 1 8192
+[HW] Device 0, max Work Items size for dimension: 2 8192
+[New Thread 0x7fffecccc700 (LWP 3945413)]
+[New Thread 0x7fffec8cb700 (LWP 3945415)]
+[New Thread 0x7fffec4ca700 (LWP 3945414)]
+[New Thread 0x7fffdf7fd700 (LWP 3945417)]
+[New Thread 0x7fffdfbfe700 (LWP 3945418)]
+[New Thread 0x7fffdffff700 (LWP 3945416)]
+[New Thread 0x7fffd73fc700 (LWP 3945419)]
+[HW] Platform 1, OpenCL profile FULL_PROFILE
+[HW] Platform 1, OpenCL version OpenCL 2.0 beignet 1.3
+[New Thread 0x7fffde105700 (LWP 3945420)]
+[Thread 0x7fffde105700 (LWP 3945420) exited]
+[HW] Device 0 is available
+[HW] Device 0, type 4 = 0x00000004: gpu
+[HW] Device 0, number of Compute Units: 20
+[HW] Device 0, max Work Items dimension: 3
+[HW] Device 0, max Work Items size for dimension: 0 512
+[HW] Device 0, max Work Items size for dimension: 1 512
+[HW] Device 0, max Work Items size for dimension: 2 512
+------------------------------------------------------------
+​```
+```
+
+A mechanism to select ldpc implementation is also available in the `ldpctest` phy simulator via the `-v`option, which can be used to specify the version of the ldpc shared library to be used.
+
+#### Examples of ldpc shared lib selection when running ldpctest:
+
+Loading libldpc_cuda.so, the cuda implementation of the ldpc decoder:
+
+```$ ./ldpctest -v _cuda
+Initializing random number generator, seed 0
+block length 8448:
+n_trials 1:
+SNR0 -2.000000:
+[CONFIG] get parameters from cmdline , debug flags: 0x00400000
+[CONFIG] log_config: 2/3 parameters successfully set
+[CONFIG] log_config: 53/53 parameters successfully set
+[CONFIG] log_config: 53/53 parameters successfully set
+[CONFIG] log_config: 16/16 parameters successfully set
+[CONFIG] log_config: 16/16 parameters successfully set
+log init done
+[CONFIG] loader: 2/2 parameters successfully set
+[CONFIG] loader.ldpc: 1/2 parameters successfully set
+[LOADER] library libldpc_cuda.so successfully loaded
+...................................
+​```
+```
+
+Loading libldpc_cl.so, the opencl implementation of the ldpc decoder:
+
+`make ldpc_cl`
+
+`cp ../../../openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_kernels_CL.cl`
+
+`./ldpctest -v _cl`
+
+```$ ./ldpctest -v _cl
+Initializing random number generator, seed 0
+block length 8448:
+n_trials 1:
+SNR0 -2.000000:
+[CONFIG] get parameters from cmdline , debug flags: 0x00400000
+[CONFIG] log_config: 2/3 parameters successfully set
+[CONFIG] log_config: 53/53 parameters successfully set
+[CONFIG] log_config: 53/53 parameters successfully set
+[CONFIG] log_config: 16/16 parameters successfully set
+[CONFIG] log_config: 16/16 parameters successfully set
+log init done
+[CONFIG] loader: 2/2 parameters successfully set
+[CONFIG] loader.ldpc: 1/2 parameters successfully set
+[LOADER] library libldpc_cl.so successfully loaded
+[HW] Platform 0, OpenCL profile FULL_PROFILE
+[HW] Platform 0, OpenCL version OpenCL 2.1 LINUX
+[HW] Device 0 is available
+[HW] Device 0, type 2 = 0x00000002: cpu
+[HW] Device 0, number of Compute Units: 8
+[HW] Device 0, max Work Items dimension: 3
+[HW] Device 0, max Work Items size for dimension: 0 8192
+[HW] Device 0, max Work Items size for dimension: 1 8192
+[HW] Device 0, max Work Items size for dimension: 2 8192
+[HW] Platform 1, OpenCL profile FULL_PROFILE
+[HW] Platform 1, OpenCL version OpenCL 2.0 beignet 1.3
+[HW] Device 0 is available
+[HW] Device 0, type 4 = 0x00000004: gpu
+[HW] Device 0, number of Compute Units: 20
+[HW] Device 0, max Work Items dimension: 3
+[HW] Device 0, max Work Items size for dimension: 0 512
+[HW] Device 0, max Work Items size for dimension: 1 512
+[HW] Device 0, max Work Items size for dimension: 2 512
+................................
+​```
+```
+
+
+
+### LDPC libraries
+Libraries implementing the LDPC algorithms must be named `libldpc<_version>.so`, they must implement three functions: `nrLDPC_initcall` `nrLDPC_decod` and `nrLDPC_encod`. The prototypes for these functions is defined in [nrLDPC_defs.h](file://nrLDPC_defs.h).
+
+`libldpc_cuda.so`has been tested with the `ldpctest` executable, usage from the softmodem's has to be tested.
+
+`libldpc_cl`is under development.
[oai Wikis home](https://gitlab.eurecom.fr/oai/openairinterface5g/wikis/home)
diff --git a/openair1/PHY/CODING/TESTBENCH/ldpctest.c b/openair1/PHY/CODING/TESTBENCH/ldpctest.c
index 91c5d59611..aff707a1d5 100644
--- a/openair1/PHY/CODING/TESTBENCH/ldpctest.c
+++ b/openair1/PHY/CODING/TESTBENCH/ldpctest.c
@@ -101,8 +101,8 @@ int test_ldpc(short No_iteration,
unsigned int *crc_misses,
time_stats_t *time_optim,
time_stats_t *time_decoder,
- n_iter_stats_t *dec_iter,
- short run_cuda)
+ n_iter_stats_t *dec_iter
+ )
{
//clock initiate
//time_stats_t time,time_optim,tinput,tprep,tparity,toutput, time_decoder;
@@ -393,28 +393,13 @@ int test_ldpc(short No_iteration,
decParams.R=code_rate_vec[R_ind];//13;
decParams.numMaxIter=No_iteration;
decParams.outMode = nrLDPC_outMode_BIT;
+ decParams.block_length=block_length;
//decParams.outMode =nrLDPC_outMode_LLRINT8;
-#ifdef CUDA_FLAG
- set_compact_BG(Zc,BG);
- init_LLR_DMA_for_CUDA(&decParams, (int8_t*)channel_output_fixed[j], (int8_t*)estimated_output[j], block_length);
-#endif
+ nrLDPC_initcall(&decParams, (int8_t*)channel_output_fixed[j], (int8_t*)estimated_output[j]);
for(j=0;j 1280, 2401 -> 2560
-
+ char *ldpc_version=NULL; /* version of the ldpc decoder library to use (XXX suffix to use when loading libldpc_XXX.so */
short No_iteration=5;
int n_segments=1;
//double rate=0.333;
- short run_cuda = 0;
int nom_rate=1;
int denom_rate=3;
@@ -544,7 +526,7 @@ int main(int argc, char *argv[])
short BG=0,Zc,Kb=0;
- while ((c = getopt (argc, argv, "q:r:s:S:l:G:n:d:i:t:u:h")) != -1)
+ while ((c = getopt (argc, argv, "q:r:s:S:l:G:n:d:i:t:u:hv:")) != -1)
switch (c)
{
case 'q':
@@ -564,7 +546,7 @@ int main(int argc, char *argv[])
break;
case 'G':
- run_cuda = atoi(optarg);
+ ldpc_version="_cuda";
break;
case 'n':
@@ -590,9 +572,11 @@ int main(int argc, char *argv[])
case 'u':
test_uncoded = atoi(optarg);
break;
-
+ case 'v':
+ ldpc_version=strdup(optarg);
+ break;
case 'h':
- default:
+ default:
printf("CURRENTLY SUPPORTED CODE RATES: \n");
printf("BG1 (blocklength > 3840): 1/3, 2/3, 22/25 (8/9) \n");
printf("BG2 (blocklength <= 3840): 1/5, 1/3, 2/3 \n\n");
@@ -609,6 +593,7 @@ int main(int argc, char *argv[])
printf("-t SNR simulation step, Default: 0.1\n");
printf("-i Max decoder iterations, Default: 5\n");
printf("-u Set SNR per coded bit, Default: 0\n");
+ printf("-v XXX Set ldpc shared library version. libldpc_XXX.so will be used \n");
exit(1);
break;
}
@@ -619,7 +604,10 @@ int main(int argc, char *argv[])
printf("SNR0 %f: \n", SNR0);
- load_nrLDPClib();
+ if (ldpc_version != NULL)
+ load_nrLDPClib(ldpc_version);
+ else
+ load_nrLDPClib(NULL);
load_nrLDPClib_ref("_orig", &encoder_orig);
//for (block_length=8;block_length<=MAX_BLOCK_LENGTH;block_length+=8)
@@ -691,8 +679,7 @@ int main(int argc, char *argv[])
&crc_misses,
time_optim,
time_decoder,
- dec_iter,
- run_cuda);
+ dec_iter);
printf("SNR %f, BLER %f (%u/%d)\n", SNR, (float)decoded_errors[i]/(float)n_trials, decoded_errors[i], n_trials);
printf("SNR %f, BER %f (%u/%d)\n", SNR, (float)errors_bit/(float)n_trials/(float)block_length/(double)n_segments, decoded_errors[i], n_trials);
diff --git a/openair1/PHY/CODING/defs_NB_IoT.h b/openair1/PHY/CODING/defs_NB_IoT.h
index 2a6bee7924..d33ae1c440 100644
--- a/openair1/PHY/CODING/defs_NB_IoT.h
+++ b/openair1/PHY/CODING/defs_NB_IoT.h
@@ -30,14 +30,6 @@
#include // for uint8/16/32_t
-/* check if this ifndef is required for NB-IoT ?!
-//#ifndef NO_OPENAIR1
-//#include "PHY/defs_NB_IoT.h"
-//#else
-//#include "PHY/TOOLS/time_meas.h"
-//#endif
-*/
-
#define CRC24_A_NB_IoT 0
#define CRC24_B_NB_IoT 1
#define CRC16_NB_IoT 2
diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder.c
index 587b2bceaa..166cd9a5a3 100644
--- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder.c
+++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder.c
@@ -46,7 +46,8 @@
#endif
static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, t_nrLDPC_procBuf* p_procBuf, uint32_t numLLR, t_nrLDPC_lut* p_lut, t_nrLDPC_dec_params* p_decParams, t_nrLDPC_time_stats* p_profiler);
-
+void nrLDPC_initcall(t_nrLDPC_dec_params* p_decParams, int8_t* p_llr, int8_t* p_out) {
+}
int32_t nrLDPC_decod(t_nrLDPC_dec_params* p_decParams, int8_t* p_llr, int8_t* p_out, t_nrLDPC_procBuf* p_procBuf, t_nrLDPC_time_stats* p_profiler)
{
uint32_t numLLR;
diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_CL.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_CL.c
new file mode 100644
index 0000000000..58e6b507af
--- /dev/null
+++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_CL.c
@@ -0,0 +1,436 @@
+/*
+ * 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.0 (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
+ */
+ /*! \file nrLDPC_decoder_CL.c
+* \brief ldpc decoder, openCL implementaion
+* \author Francois TABURET
+* \date 2021
+* \version 1.0
+* \note initial implem - translation of cuda version
+*/
+/* uses HW component id for log messages ( --log_config.hw_log_level ) */
+#include
+#include
+#include
+#include
+#include "PHY/CODING/nrLDPC_decoder/nrLDPC_types.h"
+#include "PHY/CODING/nrLDPC_decoder/nrLDPCdecoder_defs.h"
+#include "assertions.h"
+#include "common/utils/LOG/log.h"
+
+#define MAX_ITERATION 2
+#define MC 1
+
+#define MAX_OCLDEV 10
+#define MAX_OCLRUNTIME 5
+
+
+#define CLSETKERNELARG(A,B,C,D) \
+rt=clSetKernelArg(A,B,C,D) ;\
+AssertFatal(rt == CL_SUCCESS, "Error %d setting kernel argument index %d\n" , (int)rt, B);
+
+typedef struct{
+ char x;
+ char y;
+ short value;
+} h_element;
+#include "../nrLDPC_decoder_LYC/bgs/BG1_compact_in_C.h"
+
+typedef struct{
+ cl_uint max_CU;
+ cl_uint max_WID;
+ size_t *max_WIS;
+} ocldev_t;
+
+typedef struct {
+ cl_kernel cnp_kernel_1st;
+ cl_kernel cnp_kernel;
+ cl_kernel vnp_kernel_normal;
+ cl_kernel pack_decoded_bit;
+} oclkernels_t;
+
+typedef struct{
+ cl_uint num_devices;
+ cl_device_id devices[MAX_OCLDEV];
+ ocldev_t ocldev[MAX_OCLDEV];
+ cl_context context;
+ cl_program program;
+ cl_mem dev_h_compact1;
+ cl_mem dev_h_compact2;
+ cl_mem dev_const_llr;
+ cl_mem dev_llr;
+ cl_mem dev_dt;
+ cl_mem dev_tmp;
+ oclkernels_t kernels[MAX_OCLDEV];
+ cl_command_queue queue[MAX_OCLDEV];
+} oclruntime_t;
+
+typedef struct{
+ oclruntime_t runtime[MAX_OCLRUNTIME];
+} ocl_t;
+
+
+
+ocl_t ocl;
+
+
+void set_compact_BG(int Zc,short BG){
+ cl_uint rt;
+ int row,col;
+ if(BG == 1){
+ row = 46;
+ col = 68;
+ }
+ else{
+ row = 42;
+ col = 52;
+ }
+ int compact_row = 30;
+ int compact_col = 19;
+ if(BG==2){compact_row = 10, compact_col = 23;}
+ int memorySize_h_compact1 = row * compact_col * sizeof(h_element);
+ int memorySize_h_compact2 = compact_row * col * sizeof(h_element);
+ int lift_index = 0;
+ short lift_set[][9] = {
+ {2,4,8,16,32,64,128,256},
+ {3,6,12,24,48,96,192,384},
+ {5,10,20,40,80,160,320},
+ {7,14,28,56,112,224},
+ {9,18,36,72,144,288},
+ {11,22,44,88,176,352},
+ {13,26,52,104,208},
+ {15,30,60,120,240},
+ {0}
+ };
+
+ for(int i = 0; lift_set[i][0] != 0; i++){
+ for(int j = 0; lift_set[i][j] != 0; j++){
+ if(Zc == lift_set[i][j]){
+ lift_index = i;
+ break;
+ }
+ }
+ }
+ printf("\nZc = %d BG = %d\n",Zc,BG);
+ ocl.runtime[0].dev_h_compact1 = clCreateBuffer(ocl.runtime[0].context, CL_MEM_READ_ONLY|CL_MEM_HOST_WRITE_ONLY, memorySize_h_compact1, NULL, (cl_int *)&rt);
+ AssertFatal(rt == CL_SUCCESS, "Error %d creating buffer dev_h_compact1 for platform %i \n" , (int)rt, 0);
+ ocl.runtime[0].dev_h_compact2 = clCreateBuffer(ocl.runtime[0].context, CL_MEM_READ_ONLY|CL_MEM_HOST_WRITE_ONLY, memorySize_h_compact2, NULL, (cl_int *)&rt);
+ AssertFatal(rt == CL_SUCCESS, "Error %d creating buffer dev_h_compact2 for platform %i \n" , (int)rt, 0);
+ h_element *h1;
+ h_element *h2;
+ switch(lift_index){
+ case 0:
+ h1 = host_h_compact1_I0;
+ h2 = host_h_compact2_I0;
+ break;
+ case 1:
+ h1 = host_h_compact1_I1;
+ h2 = host_h_compact2_I1;
+ break;
+ case 2:
+ h1 = host_h_compact1_I2;
+ h2 = host_h_compact2_I2;
+ break;
+ case 3:
+ h1 = host_h_compact1_I3;
+ h2 = host_h_compact2_I3;
+ break;
+ case 4:
+ h1 = host_h_compact1_I4;
+ h2 = host_h_compact2_I4;
+ break;
+ case 5:
+ h1 = host_h_compact1_I5;
+ h2 = host_h_compact2_I5;
+ break;
+ case 6:
+ h1 = host_h_compact1_I6;
+ h2 = host_h_compact2_I6;
+ break;
+ case 7:
+ h1 = host_h_compact1_I7;
+ h2 = host_h_compact2_I7;
+ break;
+ default:
+ AssertFatal(0, "Invalid lift_index value %i\n" , lift_index);
+ break;
+ }
+ rt = clEnqueueWriteBuffer(ocl.runtime[0].queue[0], ocl.runtime[0].dev_h_compact1, CL_TRUE, 0,memorySize_h_compact1, h1, 0, NULL, NULL);
+ AssertFatal(rt == CL_SUCCESS, "Error %d moving h_compact1 memory to pltf %i dev %i\n" , (int)rt, 0,0);
+ rt = clEnqueueWriteBuffer(ocl.runtime[0].queue[0], ocl.runtime[0].dev_h_compact2, CL_TRUE, 0,memorySize_h_compact2, h2, 0, NULL, NULL);
+ AssertFatal(rt == CL_SUCCESS, "Error %d moving h_compact2 memory to pltf %i dev %i\n" , (int)rt, 0,0);
+ // return 0;
+}
+void cl_error_callback(const char* errinfo, const void* private_info, size_t cb, void* user_data) {
+ oclruntime_t *runtime = (oclruntime_t *)user_data;
+ LOG_E(HW,"OpenCL accelerator error %s\n", errinfo );
+}
+
+char *clutil_getstrdev(int intdev) {
+ static char retstring[255]="";
+ char *retptr=retstring;
+ retptr+=sprintf(retptr,"0x%08x: ",(uint32_t)intdev);
+ if (intdev & CL_DEVICE_TYPE_CPU)
+ retptr+=sprintf(retptr,"%s","cpu ");
+ if (intdev & CL_DEVICE_TYPE_GPU)
+ retptr+=sprintf(retptr,"%s","gpu ");
+ if (intdev & CL_DEVICE_TYPE_ACCELERATOR)
+ retptr+=sprintf(retptr,"%s","acc ");
+ return retstring;
+}
+
+void get_CompilErr(cl_program program, int pltf) {
+
+ // Determine the size of the log
+ size_t log_size;
+ for(int i=0; i0 , "clGetPlatformIDs: no cl compatible platform found\n");
+ for (int i=0 ; i<(int)num_platforms_found ; i++) {
+ char stringval[255];
+ rt = clGetPlatformInfo(platforms[i],CL_PLATFORM_PROFILE, sizeof(stringval),stringval,NULL);
+ AssertFatal(rt == CL_SUCCESS, "clGetPlatformInfo PROFILE error %d\n" , (int)rt);
+ LOG_I(HW,"Platform %i, OpenCL profile %s\n", i,stringval );
+ rt = clGetPlatformInfo(platforms[i],CL_PLATFORM_VERSION, sizeof(stringval),stringval,NULL);
+ AssertFatal(rt == CL_SUCCESS, "clGetPlatformInfo VERSION error %d\n" , (int)rt);
+ LOG_I(HW,"Platform %i, OpenCL version %s\n", i,stringval );
+ rt = clGetDeviceIDs(platforms[i],CL_DEVICE_TYPE_ALL, sizeof(ocl.runtime[i].devices)/sizeof(cl_device_id),ocl.runtime[i].devices,&(ocl.runtime[i].num_devices));
+ AssertFatal(rt == CL_SUCCESS, "clGetDeviceIDs error %d\n" , (int)rt);
+ int devok=0;
+ for (int j=0; j0) {
+ ocl.runtime[i].context = clCreateContext(NULL, ocl.runtime[i].num_devices, ocl.runtime[i].devices, cl_error_callback, &(ocl.runtime[i]), (cl_int *)&rt);
+ AssertFatal(rt == CL_SUCCESS, "Error %d creating context for platform %i\n" , (int)rt, i);
+ for(int dev=0; dev0, "No openCL device available to accelerate ldpc\n");
+ return 0;
+}
+
+
+void nrLDPC_initcall(t_nrLDPC_dec_params* p_decParams, int8_t* p_llr, int8_t* p_out) {
+ set_compact_BG(p_decParams->Z,p_decParams->BG);
+// init_LLR_DMA(p_decParams, p_llr, p_out);
+}
+
+
+int32_t nrLDPC_decod(t_nrLDPC_dec_params* p_decParams, int8_t* p_llr, int8_t* p_out,t_nrLDPC_procBuf* p_procBuf, t_nrLDPC_time_stats *time_decoder)
+{
+ uint16_t Zc = p_decParams->Z;
+ uint8_t BG = p_decParams->BG;
+// uint8_t numMaxIter = p_decParams->numMaxIter;
+ int block_length = p_decParams->block_length;
+// e_nrLDPC_outMode outMode = p_decParams->outMode;
+ uint8_t row,col;
+ if(BG == 1){
+ row = 46;
+ col = 68;
+ }
+ else{
+ row = 42;
+ col = 52;
+ }
+
+// alloc memory
+// unsigned char *hard_decision = (unsigned char*)p_out;
+// gpu
+ int memorySize_llr = col * Zc * sizeof(char) * MC;
+// cudaCheck( cudaMemcpyToSymbol(dev_const_llr, p_llr, memorySize_llr_cuda) );
+// cudaCheck( cudaMemcpyToSymbol(dev_llr, p_llr, memorySize_llr_cuda) );
+ int rt = clEnqueueWriteBuffer(ocl.runtime[0].queue[0], ocl.runtime[0].dev_const_llr, CL_TRUE, 0,
+ memorySize_llr, p_llr, 0, NULL, NULL);
+ AssertFatal(rt == CL_SUCCESS, "Error %d moving p_llr data to read only memory in pltf %i dev %i\n" , (int)rt, 0,0);
+ rt = clEnqueueWriteBuffer(ocl.runtime[0].queue[0], ocl.runtime[0].dev_llr, CL_TRUE, 0,
+ memorySize_llr, p_llr, 0, NULL, NULL);
+ AssertFatal(rt == CL_SUCCESS, "Error %d moving p_llr data to read-write memory in pltf %i dev %i\n" , (int)rt, 0,0);
+// Define CUDA kernel dimension
+// int blockSizeX = Zc;
+// dim3 dimGridKernel1(row, MC, 1); // dim of the thread blocks
+// dim3 dimBlockKernel1(blockSizeX, 1, 1);
+
+// dim3 dimGridKernel2(col, MC, 1);
+// dim3 dimBlockKernel2(blockSizeX, 1, 1);
+// cudaDeviceSynchronize();
+
+// lauch kernel
+ size_t global_item_sizek0[2] = {row*Zc,MC}; // Process the entire lists
+ size_t global_item_sizek1[2] = {col*Zc,MC}; // Process the entire lists
+ size_t local_item_sizek[2] = {128,1}; // Divide work items into groups of 128
+
+ for(int ii = 0; ii < MAX_ITERATION; ii++){
+ // first kernel
+ if(ii == 0){
+// ldpc_cnp_kernel_1st_iter
+// <<>>
+// ( BG, row, col, Zc);
+ CLSETKERNELARG(ocl.runtime[0].kernels[0].cnp_kernel_1st, 0, sizeof(cl_mem), (void *)&(ocl.runtime[0].dev_llr));
+ CLSETKERNELARG(ocl.runtime[0].kernels[0].cnp_kernel_1st, 1, sizeof(cl_mem), (void *)&(ocl.runtime[0].dev_dt));
+ CLSETKERNELARG(ocl.runtime[0].kernels[0].cnp_kernel_1st, 2, sizeof(cl_mem), (void *)&(ocl.runtime[0].dev_h_compact1));
+ CLSETKERNELARG(ocl.runtime[0].kernels[0].cnp_kernel_1st, 3, sizeof(int), (void *)&(BG));
+ CLSETKERNELARG(ocl.runtime[0].kernels[0].cnp_kernel_1st, 4, sizeof(int), (void *)&(row));
+ CLSETKERNELARG(ocl.runtime[0].kernels[0].cnp_kernel_1st, 5, sizeof(int), (void *)&(col));
+ CLSETKERNELARG(ocl.runtime[0].kernels[0].cnp_kernel_1st, 6, sizeof(int), (void *)&(Zc));
+ rt = clEnqueueNDRangeKernel(ocl.runtime[0].queue[0], ocl.runtime[0].kernels[0].cnp_kernel_1st, 2, NULL,
+ global_item_sizek0, local_item_sizek, 0, NULL, NULL);
+ AssertFatal(rt == CL_SUCCESS, "Error %d enqueing cnp_kernel_1st \n" , (int)rt);
+ }else{
+// ldpc_cnp_kernel
+// <<>>
+// ( BG, row, col, Zc);
+ CLSETKERNELARG(ocl.runtime[0].kernels[0].cnp_kernel, 0, sizeof(cl_mem), (void *)&(ocl.runtime[0].dev_llr));
+ CLSETKERNELARG(ocl.runtime[0].kernels[0].cnp_kernel, 1, sizeof(cl_mem), (void *)&(ocl.runtime[0].dev_dt));
+ CLSETKERNELARG(ocl.runtime[0].kernels[0].cnp_kernel, 2, sizeof(cl_mem), (void *)&(ocl.runtime[0].dev_h_compact1));
+ CLSETKERNELARG(ocl.runtime[0].kernels[0].cnp_kernel, 3, sizeof(int), (void *)&(BG));
+ CLSETKERNELARG(ocl.runtime[0].kernels[0].cnp_kernel, 4, sizeof(int), (void *)&(row));
+ CLSETKERNELARG(ocl.runtime[0].kernels[0].cnp_kernel, 5, sizeof(int), (void *)&(col));
+ CLSETKERNELARG(ocl.runtime[0].kernels[0].cnp_kernel, 6, sizeof(int), (void *)&(Zc));
+ rt = clEnqueueNDRangeKernel(ocl.runtime[0].queue[0], ocl.runtime[0].kernels[0].cnp_kernel, 2, NULL,
+ global_item_sizek0, local_item_sizek, 0, NULL, NULL);
+ AssertFatal(rt == CL_SUCCESS, "Error %d enqueing cnp_kernel\n" , (int)rt);
+ }
+ // second kernel
+// ldpc_vnp_kernel_normal
+// <<>>
+// // (dev_llr, dev_const_llr,BG, row, col, Zc);
+// (BG, row, col, Zc);
+ CLSETKERNELARG(ocl.runtime[0].kernels[0].vnp_kernel_normal, 0, sizeof(cl_mem), (void *)&(ocl.runtime[0].dev_llr));
+ CLSETKERNELARG(ocl.runtime[0].kernels[0].vnp_kernel_normal, 1, sizeof(cl_mem), (void *)&(ocl.runtime[0].dev_dt));
+ CLSETKERNELARG(ocl.runtime[0].kernels[0].vnp_kernel_normal, 2, sizeof(cl_mem), (void *)&(ocl.runtime[0].dev_const_llr));
+ CLSETKERNELARG(ocl.runtime[0].kernels[0].vnp_kernel_normal, 3, sizeof(cl_mem), (void *)&(ocl.runtime[0].dev_h_compact2));
+ CLSETKERNELARG(ocl.runtime[0].kernels[0].vnp_kernel_normal, 4, sizeof(int), (void *)&(BG));
+ CLSETKERNELARG(ocl.runtime[0].kernels[0].vnp_kernel_normal, 5, sizeof(int), (void *)&(row));
+ CLSETKERNELARG(ocl.runtime[0].kernels[0].vnp_kernel_normal, 6, sizeof(int), (void *)&(col));
+ CLSETKERNELARG(ocl.runtime[0].kernels[0].vnp_kernel_normal, 7, sizeof(int), (void *)&(Zc));
+ rt = clEnqueueNDRangeKernel(ocl.runtime[0].queue[0], ocl.runtime[0].kernels[0].vnp_kernel_normal, 2, NULL,
+ global_item_sizek1, local_item_sizek, 0, NULL, NULL);
+ AssertFatal(rt == CL_SUCCESS, "Error %d enqueing vnp_kernel_normal \n" , (int)rt);
+ }
+
+// int pack = (block_length/128)+1;
+// dim3 pack_block(pack, MC, 1);
+// pack_decoded_bit<<>>( col, Zc);
+ CLSETKERNELARG(ocl.runtime[0].kernels[0].pack_decoded_bit, 0, sizeof(cl_mem), (void *)&(ocl.runtime[0].dev_llr));
+ CLSETKERNELARG(ocl.runtime[0].kernels[0].pack_decoded_bit, 1, sizeof(cl_mem), (void *)&(ocl.runtime[0].dev_tmp));
+ CLSETKERNELARG(ocl.runtime[0].kernels[0].pack_decoded_bit, 2, sizeof(int), (void *)&(col));
+ CLSETKERNELARG(ocl.runtime[0].kernels[0].pack_decoded_bit, 3, sizeof(int), (void *)&(Zc));
+
+ // Execute the OpenCL kernel on the list
+ size_t global_item_size[2] = {block_length,MC}; // Process the entire lists
+ size_t local_item_size[2] = {128,1}; // Divide work items into groups of 128
+ rt = clEnqueueNDRangeKernel(ocl.runtime[0].queue[0], ocl.runtime[0].kernels[0].pack_decoded_bit, 2, NULL,
+ global_item_size, local_item_size, 0, NULL, NULL);
+ AssertFatal(rt == CL_SUCCESS, "Error %d enqueing pack_decoded_bit \n" , (int)rt);
+// cudaCheck( cudaMemcpyFromSymbol((void*)hard_decision, (const void*)dev_tmp, (block_length/8)*sizeof(unsigned char)) );
+// cudaDeviceSynchronize();
+
+ rt = clEnqueueReadBuffer(ocl.runtime[0].queue[0], ocl.runtime[0].dev_tmp, CL_TRUE, 0,
+ (block_length/8)*sizeof(unsigned char) , p_llr, 0, NULL, NULL);
+ AssertFatal(rt == CL_SUCCESS, "Error %d moving p_llr data to pltf %i dev %i\n" , (int)rt, 0,0);
+ return MAX_ITERATION;
+
+}
diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_kernels_CL.cl b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_kernels_CL.cl
new file mode 100644
index 0000000000..d5e2fa5695
--- /dev/null
+++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_kernels_CL.cl
@@ -0,0 +1,302 @@
+/*
+ * 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.0 (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
+ */
+
+/*! \file PHY/CODING/nrLDPC_decoder_kernels_CL.cl
+* \brief kernel functions for ldpc decoder accelerated via openCL
+* \author Francois TABURET
+* \date 2021
+* \version 1.0
+* \company Nokia BellLabs France
+* \email: francois.taburet@nokia-bell-labs.com
+* \note initial implem - translation of cuda version
+* \warning
+*/
+#define define MAX_ITERATION 2
+#define MC 1
+
+#define INT32_MAX 2147483647
+
+typedef struct{
+ char x;
+ char y;
+ short value;
+} h_element;
+
+//__global char dev_dt [46*68*384];
+//__local char *dev_t;
+//__global char dev_llr[68*384];
+//__global unsigned char dev_tmp[68*384];
+
+
+
+
+//__constant h_element dev_h_compact1[46*19] = {}; // used in kernel 1
+//__constant h_element dev_h_compact2[68*30] = {}; // used in kernel 2
+
+// __device__ __constantant__ h_element dev_h_compact1[46*19]; // used in kernel 1
+// __device__ __constantant__ h_element dev_h_compact2[68*30]; // used in kernel 2
+
+// row and col element count
+__constant char h_ele_row_bg1_count[46] = {
+ 19, 19, 19, 19, 3, 8, 9, 7, 10, 9,
+ 7, 8, 7, 6, 7, 7, 6, 6, 6, 6,
+ 6, 6, 5, 5, 6, 5, 5, 4, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 4, 5, 5,
+ 4, 5, 4, 5, 5, 4};
+__constant char h_ele_col_bg1_count[68] = {
+ 30, 28, 7, 11, 9, 4, 8, 12, 8, 7,
+ 12, 10, 12, 11, 10, 7, 10, 10, 13, 7,
+ 8, 11, 12, 5, 6, 6, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1};
+__constant char h_ele_row_bg2_count[42] = {
+ 8, 10, 8, 10, 4, 6, 6, 6, 4, 5,
+ 5, 5, 4, 5, 5, 4, 5, 5, 4, 4,
+ 4, 4, 3, 4, 4, 3, 5, 3, 4, 3,
+ 5, 3, 4, 4, 4, 4, 4, 3, 4, 4,
+ 4, 4};
+__constant char h_ele_col_bg2_count[52] = {
+ 22, 23, 10, 5, 5, 14, 7, 13, 6, 8,
+ 9, 16, 9, 12, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1};
+
+
+
+// Kernel 1
+__kernel void ldpc_cnp_kernel_1st_iter( __global char * dev_llr, __global char * dev_dt, __local h_element *dev_h_compact1, int BG, int row, int col, int Zc)
+{
+// int iMCW = blockIdx.y; // codeword id
+// int iBlkRow = blockIdx.x; // block row in h_base
+// int iSubRow = threadIdx.x; // row index in sub_block of h_base
+// if(blockIdx.x == 0 && threadIdx.x == 1) printf("cnp %d\n", threadIdx.x);
+ int iMCW = get_group_id(1); // codeword id
+ int iBlkRow = get_group_id(0); // block row in h_base
+ int iBlkCol; // block col in h_base
+ int iSubRow = get_local_id(0);; // row index in sub_block of h_base
+ int iCol; // overall col index in h_base
+ int offsetR;
+ int shift_t;
+
+// For 2-min algorithm.
+ int Q_sign = 0;
+ int sq;
+ int Q, Q_abs;
+ int R_temp;
+
+ int sign = 1;
+ int rmin1 = INT32_MAX;
+ int rmin2 = INT32_MAX;
+ char idx_min = 0;
+
+ h_element h_element_t;
+ int s = (BG==1)? h_ele_row_bg1_count[iBlkRow]:h_ele_row_bg2_count[iBlkRow];
+ offsetR = (iMCW * row*col*Zc) + iBlkRow * Zc + iSubRow; // row*col*Zc = size of dev_dt
+// if(blockIdx.x == 0 && threadIdx.x == 1) printf("s: %d, offset %d\n", s, offsetR);
+// The 1st recursion
+ for(int i = 0; i < s; i++) // loop through all the ZxZ sub-blocks in a row
+ {
+ h_element_t = dev_h_compact1[i*row+iBlkRow]; // compact_col == row
+
+ iBlkCol = h_element_t.y;
+ shift_t = h_element_t.value;
+
+ shift_t = (iSubRow + shift_t) % Zc;
+ iCol = (iMCW * col*Zc) + iBlkCol * Zc + shift_t; // col*Zc = size of llr
+ Q = dev_llr[iCol];
+ Q_abs = (Q>0)? Q : -Q;
+ sq = Q < 0;
+// if(blockIdx.x == 0 && threadIdx.x == 1) printf("i %d, icol %d, Q: %d\n", i, iCol, Q);
+ // quick version
+ sign = sign * (1 - sq * 2);
+ Q_sign |= sq << i;
+
+ if (Q_abs < rmin1){
+ rmin2 = rmin1;
+ rmin1 = Q_abs;
+ idx_min = i;
+ } else if (Q_abs < rmin2){
+ rmin2 = Q_abs;
+ }
+ }
+
+// if(blockIdx.x == 0 && threadIdx.x == 1)printf("min1 %d, min2 %d, min1_idx %d\n", rmin1, rmin2, idx_min);
+
+// The 2nd recursion
+ for(int i = 0; i < s; i++){
+ // v0: Best performance so far. 0.75f is the value of alpha.
+ sq = 1 - 2 * ((Q_sign >> i) & 0x01);
+ R_temp = 0.75f * sign * sq * (i != idx_min ? rmin1 : rmin2);
+ // write results to global memory
+ h_element_t = dev_h_compact1[i*row+iBlkRow];
+ int addr_temp = offsetR + h_element_t.y * row * Zc;
+ dev_dt[addr_temp] = R_temp;
+// if(blockIdx.x == 0 && threadIdx.x == 1)printf("R_temp %d, temp_addr %d\n", R_temp, addr_temp);
+ }
+}
+
+// Kernel_1
+__kernel void ldpc_cnp_kernel( __global char * dev_llr, __global char * dev_dt, __local h_element *dev_h_compact1, int BG, int row, int col, int Zc)
+{
+// if(blockIdx.x == 0 && threadIdx.x == 1) printf("cnp\n");
+// int iMCW = blockIdx.y;
+// int iBlkRow = blockIdx.x; // block row in h_base // block col in h_base
+// int iSubRow = threadIdx.x; // row index in sub_block of h_base
+ int iMCW = get_group_id(1);
+ int iBlkRow = get_group_id(0); // block row in h_base
+ int iBlkCol; // block col in h_base
+ int iSubRow = get_local_id(0);; // row index in sub_block of h_base
+ int iCol; // overall col index in h_base
+ int offsetR;
+ int shift_t;
+
+// For 2-min algorithm.
+ int Q_sign = 0;
+ int sq;
+ int Q, Q_abs;
+ int R_temp;
+
+ int sign = 1;
+ int rmin1 = INT32_MAX;
+ int rmin2 = INT32_MAX;
+ char idx_min = 0;
+
+ h_element h_element_t;
+ int s = (BG==1)? h_ele_row_bg1_count[iBlkRow]: h_ele_row_bg2_count[iBlkRow];
+ offsetR = (iMCW *row*col*Zc) + iBlkRow * Zc + iSubRow; // row * col * Zc = size of dev_dt
+// if(blockIdx.x == 0 && threadIdx.x == 1) printf("s: %d, offset %d\n", s, offsetR);
+// The 1st recursion
+ for(int i = 0; i < s; i++) // loop through all the ZxZ sub-blocks in a row
+ {
+ h_element_t = dev_h_compact1[i*row+iBlkRow];
+
+ iBlkCol = h_element_t.y;
+ shift_t = h_element_t.value;
+ shift_t = (iSubRow + shift_t) % Zc;
+ iCol = iBlkCol * Zc + shift_t;
+
+ R_temp = dev_dt[offsetR + iBlkCol * row * Zc];
+
+ Q = dev_llr[iMCW * (col*Zc) + iCol] - R_temp;
+ Q_abs = (Q>0)? Q : -Q;
+// if(blockIdx.x == 0 && threadIdx.x == 1) printf("i %d, icol %d, Q: %d\n", i, iCol, Q);
+ sq = Q < 0;
+ sign = sign * (1 - sq * 2);
+ Q_sign |= sq << i;
+
+ if (Q_abs < rmin1){
+ rmin2 = rmin1;
+ rmin1 = Q_abs;
+ idx_min = i;
+ } else if (Q_abs < rmin2){
+ rmin2 = Q_abs;
+ }
+
+ }
+
+// if(blockIdx.x == 0 && threadIdx.x == 1)printf("min1 %d, min2 %d, min1_idx %d\n", rmin1, rmin2, idx_min);
+
+// The 2nd recursion
+ for(int i = 0; i < s; i ++){
+ sq = 1 - 2 * ((Q_sign >> i) & 0x01);
+ R_temp = 0.75f * sign * sq * (i != idx_min ? rmin1 : rmin2);
+
+
+ // write results to global memory
+ h_element_t = dev_h_compact1[i*row+iBlkRow];
+ int addr_temp = h_element_t.y * row * Zc + offsetR;
+ dev_dt[addr_temp] = R_temp;
+// if(blockIdx.x == 0 && threadIdx.x == 1)printf("R_temp %d, temp_addr %d\n", R_temp, addr_temp);
+ }
+}
+
+// Kernel 2: VNP processing
+__kernel void
+ldpc_vnp_kernel_normal(__global char * dev_llr, __global char * dev_dt, __global char * dev_const_llr, __local h_element *dev_h_compact2, int BG, int row, int col, int Zc)
+{
+// int iMCW = blockIdx.y;
+// int iBlkCol = blockIdx.x;
+// int iSubCol = threadIdx.x;
+ int iMCW = get_group_id(1);
+ int iBlkCol = get_group_id(0);
+ int iBlkRow;
+ int iSubCol = get_local_id(0);
+ int iRow;
+ int iCol;
+
+ int shift_t, sf;
+ int APP;
+
+ h_element h_element_t;
+
+ // update all the llr values
+ iCol = iBlkCol * Zc + iSubCol;
+ APP = dev_const_llr[iMCW *col*Zc + iCol];
+ int offsetDt = iMCW *row*col*Zc + iBlkCol * row * Zc;
+ int s = (BG==1)? h_ele_col_bg1_count[iBlkCol]:h_ele_col_bg2_count[iBlkCol];
+
+ for(int i = 0; i < s; i++)
+ {
+ h_element_t = dev_h_compact2[i*col+iBlkCol];
+
+ shift_t = h_element_t.value%Zc;
+ iBlkRow = h_element_t.x;
+
+ sf = iSubCol - shift_t;
+ sf = (sf + Zc) % Zc;
+
+ iRow = iBlkRow * Zc + sf;
+ APP = APP + dev_dt[offsetDt + iRow];
+ }
+ if(APP > SCHAR_MAX) APP = SCHAR_MAX;
+ if(APP < SCHAR_MIN) APP = SCHAR_MIN;
+ // write back to device global memory
+ dev_llr[iMCW *col*Zc + iCol] = APP;
+}
+
+
+__kernel void pack_decoded_bit(__global unsigned char * dev_llr, __global unsigned char * dev_tmp, int col, int Zc)
+{
+// int iMCW = blockIdx.y;
+// int btid = threadIdx.x;
+ unsigned char tmp[128];
+ int iMCW = get_group_id(1);
+ int btid = get_local_id(0);
+ int tid = iMCW * col*Zc + get_group_id(0)*128 + btid;
+ tmp[btid] = 0;
+
+ if(dev_llr[tid] < 0){
+ tmp[btid] = 1 << (7-(btid&7));
+ }
+// __syncthreads();
+
+ if(btid < 16){
+ dev_tmp[iMCW * col*Zc + get_group_id(0)*16+btid] = 0;
+ for(int i = 0; i < 8; i++){
+ dev_tmp[iMCW * col*Zc + get_group_id(0)*16+btid] += tmp[btid*8+i];
+ }
+ }
+}
+
diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_init_mem.h b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_init_mem.h
index 3292c0debe..f08549130e 100644
--- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_init_mem.h
+++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_init_mem.h
@@ -34,7 +34,6 @@
#include
#include "nrLDPC_types.h"
-#ifndef malloc32_clear
/**
\brief Allocates 32 byte aligned memory and initializes to zero
\param size Input size in bytes
@@ -46,7 +45,6 @@ static inline void* malloc32_clear(size_t size)
memset(ptr, 0, size);
return ptr;
}
-#endif
/**
\brief Allocates and initializes the internal decoder processing buffers
diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_types.h b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_types.h
index e5b99246d5..99b6f75f93 100644
--- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_types.h
+++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_types.h
@@ -70,6 +70,7 @@ typedef struct nrLDPC_dec_params {
uint16_t Z; /**< Lifting size */
uint8_t R; /**< Decoding rate: Format 15,13,... for code rates 1/5, 1/3,... */
uint8_t numMaxIter; /**< Maximum number of iterations */
+ int block_length;
e_nrLDPC_outMode outMode; /**< Output format */
} t_nrLDPC_dec_params;
diff --git a/openair1/PHY/CODING/nrLDPC_decoder_LYC/nrLDPC_decoder_LYC.cu b/openair1/PHY/CODING/nrLDPC_decoder_LYC/nrLDPC_decoder_LYC.cu
index 931d500338..72517edcdd 100644
--- a/openair1/PHY/CODING/nrLDPC_decoder_LYC/nrLDPC_decoder_LYC.cu
+++ b/openair1/PHY/CODING/nrLDPC_decoder_LYC/nrLDPC_decoder_LYC.cu
@@ -7,14 +7,14 @@
* \note
* \warning
*/
-
+#include
#include
#include
#include
#include
#include "PHY/CODING/nrLDPC_decoder/nrLDPC_types.h"
#include "PHY/CODING/nrLDPC_decoder/nrLDPCdecoder_defs.h"
-
+#include "assertions.h"
#include "bgs/BG1_I0"
#include "bgs/BG1_I1"
#include "bgs/BG1_I2"
@@ -462,10 +462,11 @@ void read_BG(int BG, int *h, int row, int col)
}
extern "C"
-void init_LLR_DMA_for_CUDA(t_nrLDPC_dec_params* p_decParams, int8_t* p_llr, int8_t* p_out, int block_length){
+void init_LLR_DMA(t_nrLDPC_dec_params* p_decParams, int8_t* p_llr, int8_t* p_out){
uint16_t Zc = p_decParams->Z;
uint8_t BG = p_decParams->BG;
+ int block_length = p_decParams->block_length;
uint8_t row,col;
if(BG == 1){
row = 46;
@@ -483,14 +484,60 @@ void init_LLR_DMA_for_CUDA(t_nrLDPC_dec_params* p_decParams, int8_t* p_llr, int8
}
+using namespace std ;
+
+/* from here: entry points in decoder shared lib */
extern "C"
-int32_t nrLDPC_decoder_LYC(t_nrLDPC_dec_params* p_decParams, int8_t* p_llr, int8_t* p_out, int block_length, time_stats_t *time_decoder)
+int ldpc_autoinit(void) { // called by the library loader
+/*int devices = 0;
+
+ cudaError_t err = cudaGetDeviceCount(&devices);
+ AssertFatal(devices>0,"\nNo cuda GPU found\n\n");
+
+ const int kb = 1024;
+ const int mb = kb * kb;
+ wcout << "NBody.GPU" << endl << "=========" << endl << endl;
+
+ wcout << "CUDA version: v" << CUDART_VERSION << endl;
+
+
+ wcout << "CUDA Devices: " << endl << endl;
+
+ for(int i = 0; i < devices; ++i)
+ {
+ cudaDeviceProp props;
+ cudaGetDeviceProperties(&props, i);
+ wcout << i << ": " << props.name << ": " << props.major << "." << props.minor << endl;
+ wcout << " Global memory: " << props.totalGlobalMem / mb << "mb" << endl;
+ wcout << " Shared memory: " << props.sharedMemPerBlock / kb << "kb" << endl;
+ wcout << " Constant memory: " << props.totalConstMem / kb << "kb" << endl;
+ wcout << " Block registers: " << props.regsPerBlock << endl << endl;
+
+ wcout << " Warp size: " << props.warpSize << endl;
+ wcout << " Threads per block: " << props.maxThreadsPerBlock << endl;
+ wcout << " Max block dimensions: [ " << props.maxThreadsDim[0] << ", " << props.maxThreadsDim[1] << ", " << props.maxThreadsDim[2] << " ]" << endl;
+ wcout << " Max grid dimensions: [ " << props.maxGridSize[0] << ", " << props.maxGridSize[1] << ", " << props.maxGridSize[2] << " ]" << endl;
+ wcout << endl;
+ }
+*/
+ warmup_for_GPU();
+ return 0;
+}
+
+extern "C"
+void nrLDPC_initcall(t_nrLDPC_dec_params* p_decParams, int8_t* p_llr, int8_t* p_out) {
+ set_compact_BG(p_decParams->Z,p_decParams->BG);
+ init_LLR_DMA(p_decParams, p_llr, p_out);
+}
+
+
+extern "C"
+int32_t nrLDPC_decod(t_nrLDPC_dec_params* p_decParams, int8_t* p_llr, int8_t* p_out,t_nrLDPC_procBuf* p_procBuf, t_nrLDPC_time_stats *time_decoder)
{
-
-
uint16_t Zc = p_decParams->Z;
uint8_t BG = p_decParams->BG;
uint8_t numMaxIter = p_decParams->numMaxIter;
+ int block_length = p_decParams->block_length;
e_nrLDPC_outMode outMode = p_decParams->outMode;
cudaError_t cudaStatus;
uint8_t row,col;
diff --git a/openair1/PHY/CODING/nrLDPC_defs.h b/openair1/PHY/CODING/nrLDPC_defs.h
index c902ecb2b6..67248d971c 100644
--- a/openair1/PHY/CODING/nrLDPC_defs.h
+++ b/openair1/PHY/CODING/nrLDPC_defs.h
@@ -60,6 +60,7 @@ typedef struct {
uint8_t *d[MAX_NUM_NR_DLSCH_SEGMENTS];
}encoder_implemparams_t;
#define INIT0_LDPCIMPLEMPARAMS {0,0,0,NULL,NULL,NULL,NULL}
+typedef void(*nrLDPC_initcallfunc_t)(t_nrLDPC_dec_params* p_decParams, int8_t* p_llr, int8_t* p_out);
typedef int(*nrLDPC_encoderfunc_t)(unsigned char **,unsigned char **,int,int,short, short, encoder_implemparams_t*);
//============================================================================================================================
// decoder interface
diff --git a/openair1/PHY/CODING/nrLDPC_extern.h b/openair1/PHY/CODING/nrLDPC_extern.h
index c0bfa0fdd8..b75b38fc76 100644
--- a/openair1/PHY/CODING/nrLDPC_extern.h
+++ b/openair1/PHY/CODING/nrLDPC_extern.h
@@ -23,13 +23,16 @@
#ifdef LDPC_LOADER
nrLDPC_decoderfunc_t nrLDPC_decoder;
nrLDPC_encoderfunc_t nrLDPC_encoder;
+nrLDPC_initcallfunc_t nrLDPC_initcall;
#else
/* functions to load the LDPC shared lib, implemented in openair1/PHY/CODING/nrLDPC_load.c */
-extern int load_nrLDPClib(void) ;
+extern int load_nrLDPClib(char *version) ;
extern int load_nrLDPClib_ref(char *libversion, nrLDPC_encoderfunc_t * nrLDPC_encoder_ptr); // for ldpctest
/* ldpc coder/decoder functions, as loaded by load_nrLDPClib(). */
+extern nrLDPC_initcallfunc_t nrLDPC_initcall;
+
extern nrLDPC_decoderfunc_t nrLDPC_decoder;
extern nrLDPC_encoderfunc_t nrLDPC_encoder;
// inline functions:
#include "openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_init_mem.h"
-#endif
\ No newline at end of file
+#endif
diff --git a/openair1/PHY/CODING/nrLDPC_load.c b/openair1/PHY/CODING/nrLDPC_load.c
index a74bdf7bd1..23e5032bad 100644
--- a/openair1/PHY/CODING/nrLDPC_load.c
+++ b/openair1/PHY/CODING/nrLDPC_load.c
@@ -42,22 +42,32 @@
/* function description array, to be used when loading the encoding/decoding shared lib */
-static loader_shlibfunc_t shlib_fdesc[2];
+static loader_shlibfunc_t shlib_fdesc[3];
-char *arg[64]={"ldpctest","-O","cmdlineonly::dbgl0"};
+/* arguments used when called from phy simulators exec's which do not use the config module */
+/* arg is used to initialize the config module so that the loader works as expected */
+char *arg[64]={"ldpctest","-O","cmdlineonly::dbgl0",NULL,NULL};
-int load_nrLDPClib(void) {
+int load_nrLDPClib(char *version) {
char *ptr = (char*)config_get_if();
+ char libname[64]="ldpc";
+
if ( ptr==NULL ) {// phy simulators, config module possibly not loaded
- load_configmodule(3,(char **)arg,CONFIG_ENABLECMDLINEONLY) ;
+ load_configmodule(0,(char **)NULL,CONFIG_ENABLECMDLINEONLY) ;
logInit();
}
shlib_fdesc[0].fname = "nrLDPC_decod";
shlib_fdesc[1].fname = "nrLDPC_encod";
- int ret=load_module_shlib("ldpc",shlib_fdesc,sizeof(shlib_fdesc)/sizeof(loader_shlibfunc_t),NULL);
+ shlib_fdesc[2].fname = "nrLDPC_initcall";
+ int ret;
+ if (version)
+ ret=load_module_version_shlib(libname,version,shlib_fdesc,sizeof(shlib_fdesc)/sizeof(loader_shlibfunc_t),NULL);
+ else
+ ret=load_module_shlib(libname,shlib_fdesc,sizeof(shlib_fdesc)/sizeof(loader_shlibfunc_t),NULL);
AssertFatal( (ret >= 0),"Error loading ldpc decoder");
nrLDPC_decoder = (nrLDPC_decoderfunc_t)shlib_fdesc[0].fptr;
nrLDPC_encoder = (nrLDPC_encoderfunc_t)shlib_fdesc[1].fptr;
+ nrLDPC_initcall = (nrLDPC_initcallfunc_t)shlib_fdesc[2].fptr;
return 0;
}
@@ -65,10 +75,8 @@ int load_nrLDPClib_ref(char *libversion, nrLDPC_encoderfunc_t * nrLDPC_encoder_p
loader_shlibfunc_t shlib_encoder_fdesc;
shlib_encoder_fdesc.fname = "nrLDPC_encod";
- char libpath[64];
- sprintf(libpath,"ldpc%s",libversion);
- int ret=load_module_shlib(libpath,&shlib_encoder_fdesc,1,NULL);
- AssertFatal( (ret >= 0),"Error loading ldpc encoder %s\n",libpath);
+ int ret=load_module_version_shlib("ldpc",libversion,&shlib_encoder_fdesc,1,NULL);
+ AssertFatal( (ret >= 0),"Error loading ldpc encoder %s\n",(libversion==NULL)?"":libversion);
*nrLDPC_encoder_ptr = (nrLDPC_encoderfunc_t)shlib_encoder_fdesc.fptr;
return 0;
}
diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c
index cf0cd23817..cd4848ea8c 100644
--- a/openair1/PHY/INIT/nr_init.c
+++ b/openair1/PHY/INIT/nr_init.c
@@ -108,7 +108,7 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB,
crcTableInit();
init_scrambling_luts();
init_pucch2_luts();
- load_nrLDPClib();
+ load_nrLDPClib(NULL);
// PBCH DMRS gold sequences generation
nr_init_pbch_dmrs(gNB);
//PDCCH DMRS init
diff --git a/openair1/PHY/INIT/nr_parms.c b/openair1/PHY/INIT/nr_parms.c
index 4efd398c95..347155ed3b 100644
--- a/openair1/PHY/INIT/nr_parms.c
+++ b/openair1/PHY/INIT/nr_parms.c
@@ -27,6 +27,58 @@
uint32_t nr_subcarrier_spacing[MAX_NUM_SUBCARRIER_SPACING] = {15e3, 30e3, 60e3, 120e3, 240e3};
uint16_t nr_slots_per_subframe[MAX_NUM_SUBCARRIER_SPACING] = {1, 2, 4, 8, 16};
+// Table 5.4.3.3-1 38-101
+int nr_ssb_table[48][3] = {
+ {1, 15, nr_ssb_type_A},
+ {2, 15, nr_ssb_type_A},
+ {3, 15, nr_ssb_type_A},
+ {5, 15, nr_ssb_type_A},
+ {5, 30, nr_ssb_type_B},
+ {7, 15, nr_ssb_type_A},
+ {8, 15, nr_ssb_type_A},
+ {12, 15, nr_ssb_type_A},
+ {14, 15, nr_ssb_type_A},
+ {18, 15, nr_ssb_type_A},
+ {20, 15, nr_ssb_type_A},
+ {25, 15, nr_ssb_type_A},
+ {26, 15, nr_ssb_type_A},
+ {28, 15, nr_ssb_type_A},
+ {29, 15, nr_ssb_type_A},
+ {30, 15, nr_ssb_type_A},
+ {34, 15, nr_ssb_type_A},
+ {34, 30, nr_ssb_type_C},
+ {38, 15, nr_ssb_type_A},
+ {38, 30, nr_ssb_type_C},
+ {39, 15, nr_ssb_type_A},
+ {39, 30, nr_ssb_type_C},
+ {40, 30, nr_ssb_type_C},
+ {41, 15, nr_ssb_type_A},
+ {41, 30, nr_ssb_type_C},
+ {46, 30, nr_ssb_type_C},
+ {48, 30, nr_ssb_type_C},
+ {50, 30, nr_ssb_type_C},
+ {51, 15, nr_ssb_type_A},
+ {53, 15, nr_ssb_type_A},
+ {65, 15, nr_ssb_type_A},
+ {66, 15, nr_ssb_type_A},
+ {66, 30, nr_ssb_type_B},
+ {70, 15, nr_ssb_type_A},
+ {71, 15, nr_ssb_type_A},
+ {74, 15, nr_ssb_type_A},
+ {75, 15, nr_ssb_type_A},
+ {76, 15, nr_ssb_type_A},
+ {77, 30, nr_ssb_type_C},
+ {78, 30, nr_ssb_type_C},
+ {79, 30, nr_ssb_type_C},
+ {90, 15, nr_ssb_type_A},
+ {90, 30, nr_ssb_type_C},
+ {91, 15, nr_ssb_type_A},
+ {92, 15, nr_ssb_type_A},
+ {93, 15, nr_ssb_type_A},
+ {94, 15, nr_ssb_type_A},
+ {96, 30, nr_ssb_type_C}
+};
+
void set_Lmax(NR_DL_FRAME_PARMS *fp) {
// definition of Lmax according to ts 38.213 section 4.1
@@ -85,27 +137,28 @@ int nr_get_ssb_start_symbol(NR_DL_FRAME_PARMS *fp,uint8_t i_ssb) {
void set_scs_parameters (NR_DL_FRAME_PARMS *fp, int mu, int N_RB_DL)
{
+ int idx = 0;
switch(mu) {
-
case NR_MU_0: //15kHz scs
fp->subcarrier_spacing = nr_subcarrier_spacing[NR_MU_0];
fp->slots_per_subframe = nr_slots_per_subframe[NR_MU_0];
fp->ssb_type = nr_ssb_type_A;
+ while(nr_ssb_table[idx][0]!=fp->nr_band)
+ idx++;
+ AssertFatal(nr_ssb_table[idx][1]==15,"SCS %d not applicable to band %d\n",
+ fp->subcarrier_spacing,fp->nr_band);
break;
case NR_MU_1: //30kHz scs
fp->subcarrier_spacing = nr_subcarrier_spacing[NR_MU_1];
fp->slots_per_subframe = nr_slots_per_subframe[NR_MU_1];
-
- // selection of SS block pattern according to TS 38101-1 Table 5.4.3.3-1 for SCS 30kHz
- if (fp->nr_band == 5 || fp->nr_band == 66)
- fp->ssb_type = nr_ssb_type_B;
- else{
- if (fp->nr_band == 41 || fp->nr_band == 38 || ( fp->nr_band > 76 && fp->nr_band < 80) )
- fp->ssb_type = nr_ssb_type_C;
- else
- AssertFatal(1==0,"NR Operating Band n%d not available for SS block SCS with mu=%d\n", fp->nr_band, mu);
+ while(nr_ssb_table[idx][0]!=fp->nr_band ||
+ nr_ssb_table[idx][1]!=30) {
+ AssertFatal(nr_ssb_table[idx][0]<=fp->nr_band,"SCS %d not applicable to band %d\n",
+ fp->subcarrier_spacing,fp->nr_band);
+ idx++;
}
+ fp->ssb_type = nr_ssb_table[idx][2];
break;
case NR_MU_2: //60kHz scs
diff --git a/openair1/PHY/LTE_TRANSPORT/dci.c b/openair1/PHY/LTE_TRANSPORT/dci.c
index 1913afab2d..99f37c1323 100644
--- a/openair1/PHY/LTE_TRANSPORT/dci.c
+++ b/openair1/PHY/LTE_TRANSPORT/dci.c
@@ -50,8 +50,6 @@
//#define DEBUG_DCI_DECODING 1
//#define DEBUG_PHY
-//#undef ALL_AGGREGATION
-
//extern uint16_t phich_reg[MAX_NUM_PHICH_GROUPS][3];
//extern uint16_t pcfich_reg[4];
diff --git a/openair1/PHY/LTE_TRANSPORT/dci_NB_IoT.h b/openair1/PHY/LTE_TRANSPORT/dci_NB_IoT.h
index 60720e13b7..512316f565 100644
--- a/openair1/PHY/LTE_TRANSPORT/dci_NB_IoT.h
+++ b/openair1/PHY/LTE_TRANSPORT/dci_NB_IoT.h
@@ -32,11 +32,8 @@
#ifndef __DCI_NB_IOT_H__
#define __DCI_NB_IOT_H__
-//#ifndef USER_MODE
-//#include "PHY/types.h"
-//#else
#include
-//#endif
+
typedef enum
{
diff --git a/openair1/PHY/LTE_TRANSPORT/print_stats.c b/openair1/PHY/LTE_TRANSPORT/print_stats.c
index 031c97e50d..44f57f4304 100644
--- a/openair1/PHY/LTE_TRANSPORT/print_stats.c
+++ b/openair1/PHY/LTE_TRANSPORT/print_stats.c
@@ -36,10 +36,8 @@
#include "PHY/extern.h"
#include "SCHED/extern.h"
-#ifdef OPENAIR2
#include "openair2/LAYER2/MAC/proto.h"
#include "openair2/RRC/L2_INTERFACE/openair_rrc_L2_interface.h"
-#endif
extern int mac_get_rrc_status(uint8_t Mod_id,uint8_t eNB_flag,uint8_t index);
@@ -434,10 +432,8 @@ int dump_ue_stats(PHY_VARS_UE *ue, UE_rxtx_proc_t *proc,char *buffer, int length
break;
}
-#ifdef OPENAIR2
RRC_status = mac_UE_get_rrc_status(ue->Mod_id, 0);
len += sprintf(&buffer[len],"[UE PROC] RRC status = %d\n",RRC_status);
-#endif
len += sprintf(&buffer[len], "[UE PROC] Transmission Mode %d \n",ue->transmission_mode[eNB]);
len += sprintf(&buffer[len], "[UE PROC] PBCH err conseq %d, PBCH error total %d, PBCH FER %d\n",
ue->pbch_vars[eNB]->pdu_errors_conseq,
diff --git a/openair1/PHY/LTE_TRANSPORT/uci_NB_IoT.h b/openair1/PHY/LTE_TRANSPORT/uci_NB_IoT.h
index 6f2dd0f989..c16be6a308 100644
--- a/openair1/PHY/LTE_TRANSPORT/uci_NB_IoT.h
+++ b/openair1/PHY/LTE_TRANSPORT/uci_NB_IoT.h
@@ -321,4 +321,4 @@ HLC_subband_cqi_mcs_CBA_20MHz_NB_IoT;
#define MAX_ACK_PAYLOAD_NB_IoT 18
#define MAX_RI_PAYLOAD_NB_IoT 6
-#endif
\ No newline at end of file
+#endif
diff --git a/openair1/PHY/LTE_UE_TRANSPORT/dci_ue.c b/openair1/PHY/LTE_UE_TRANSPORT/dci_ue.c
index 3c7e3f986b..0d8c3c9960 100644
--- a/openair1/PHY/LTE_UE_TRANSPORT/dci_ue.c
+++ b/openair1/PHY/LTE_UE_TRANSPORT/dci_ue.c
@@ -50,9 +50,6 @@
//#define DEBUG_DCI_DECODING 1
//#define DEBUG_PHY
-//#undef ALL_AGGREGATION
-
-
uint16_t extract_crc(uint8_t *dci,uint8_t dci_len)
{
@@ -2802,7 +2799,6 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
if (dci_cnt>old_dci_cnt)
return(dci_cnt);
- //#ifdef ALL_AGGREGATION
// Now check UE_SPEC format 1 search spaces at aggregation 8
old_dci_cnt=dci_cnt;
dci_decoding_procedure0(pdcch_vars,0,mode,subframe,
@@ -2836,7 +2832,6 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
if (dci_cnt>old_dci_cnt)
return(dci_cnt);
- //#endif //ALL_AGGREGATION
} else if (tmode == 3) {
@@ -2946,7 +2941,6 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
if (dci_cnt>old_dci_cnt)
return(dci_cnt);
- //#ifdef ALL_AGGREGATION
// Now check UE_SPEC format 2_2A search spaces at aggregation 8
LOG_D(PHY," Now check UE_SPEC format 2_2A search spaces at aggregation 8 dci length: %d[bits] %d[bytes]\n",format2A_size_bits,format2A_size_bytes);
old_dci_cnt=dci_cnt;
@@ -3082,7 +3076,6 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
if (dci_cnt>old_dci_cnt)
return(dci_cnt);
- //#ifdef ALL_AGGREGATION
// Now check UE_SPEC format 2_2A search spaces at aggregation 8
old_dci_cnt=dci_cnt;
dci_decoding_procedure0(pdcch_vars,0,mode,
@@ -3214,7 +3207,6 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
if (dci_cnt>old_dci_cnt)
return(dci_cnt);
- //#ifdef ALL_AGGREGATION
// Now check UE_SPEC format 1E_2A_M10PRB search spaces at aggregation 8
old_dci_cnt=dci_cnt;
@@ -3249,7 +3241,6 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *ue,
if (dci_cnt>old_dci_cnt)
return(dci_cnt);
- //#endif //ALL_AGGREGATION
}
diff --git a/openair1/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c b/openair1/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c
index 09e4b7f23f..6afd028099 100644
--- a/openair1/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c
+++ b/openair1/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c
@@ -51,7 +51,6 @@
#include
#include "linear_preprocessing_rec.h"
-#define NOCYGWIN_STATIC
//#define DEBUG_MMSE
diff --git a/openair1/PHY/LTE_UE_TRANSPORT/ulsch_modulation.c b/openair1/PHY/LTE_UE_TRANSPORT/ulsch_modulation.c
index b08fe30248..7ec3e7bfb6 100644
--- a/openair1/PHY/LTE_UE_TRANSPORT/ulsch_modulation.c
+++ b/openair1/PHY/LTE_UE_TRANSPORT/ulsch_modulation.c
@@ -42,7 +42,6 @@
//#define DEBUG_ULSCH_MODULATION
-#ifndef OFDMA_ULSCH
void dft_lte(int32_t *z,int32_t *d, int32_t Msc_PUSCH, uint8_t Nsymb)
{
@@ -371,7 +370,6 @@ void dft_lte(int32_t *z,int32_t *d, int32_t Msc_PUSCH, uint8_t Nsymb)
// printf("\n");
}
-#endif
void ulsch_modulation(int32_t **txdataF,
short amp,
uint32_t frame,
@@ -690,57 +688,10 @@ void ulsch_modulation(int32_t **txdataF,
// Transform Precoding
-#ifdef OFDMA_ULSCH
-
- for (i=0; iz[i] = ulsch->d[i];
- }
-
-#else
dft_lte(ulsch->z,ulsch->d,Msc_PUSCH,ulsch->Nsymb_pusch);
-#endif
DevAssert(txdataF);
-#ifdef OFDMA_ULSCH
- re_offset0 = frame_parms->first_carrier_offset + (ulsch->harq_processes[harq_pid]->first_rb*12);
-
- if (re_offset0>frame_parms->ofdm_symbol_size) {
- re_offset0 -= frame_parms->ofdm_symbol_size;
- // re_offset0++;
- }
-
- // printf("re_offset0 %d\n",re_offset0);
-
-
- for (j=0,l=0; l<(nsymb-ulsch->srs_active); l++) {
- re_offset = re_offset0;
- symbol_offset = (int)frame_parms->ofdm_symbol_size*(l+(subframe*nsymb));
-#ifdef DEBUG_ULSCH_MODULATION
- printf("symbol %d (subframe %d): symbol_offset %d\n",l,subframe,symbol_offset);
-#endif
- txptr = &txdataF[0][symbol_offset];
-
- if (((frame_parms->Ncp == 0) && ((l==3) || (l==10)))||
- ((frame_parms->Ncp == 1) && ((l==2) || (l==8)))) {
- }
- // Skip reference symbols
- else {
-
- // printf("copying %d REs\n",Msc_PUSCH);
- for (i=0; iz[j],((int16_t*)&ulsch->z[j])[0],((int16_t*)&ulsch->z[j])[1]);
-#endif
- txptr[re_offset++] = ulsch->z[j];
-
- if (re_offset==frame_parms->ofdm_symbol_size)
- re_offset = 0;
- }
- }
- }
-
-# else // OFDMA_ULSCH = 0
re_offset0 = frame_parms->first_carrier_offset + (ulsch->harq_processes[harq_pid]->first_rb*12);
if (re_offset0>frame_parms->ofdm_symbol_size) {
@@ -777,8 +728,5 @@ void ulsch_modulation(int32_t **txdataF,
}
}
-#endif
- VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ULSCH_MODULATION, VCD_FUNCTION_OUT);
-
}
diff --git a/openair1/PHY/NR_TRANSPORT/nr_dci.c b/openair1/PHY/NR_TRANSPORT/nr_dci.c
index b58efb74f9..3dd44a7896 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_dci.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_dci.c
@@ -35,6 +35,7 @@
#include "nr_dlsch.h"
#include "nr_sch_dmrs.h"
#include "PHY/MODULATION/nr_modulation.h"
+#include "common/utils/nr/nr_common.h"
//#define DEBUG_PDCCH_DMRS
//#define DEBUG_DCI
diff --git a/openair1/PHY/NR_TRANSPORT/nr_dci.h b/openair1/PHY/NR_TRANSPORT/nr_dci.h
index e3b53f9cf9..07baaf2728 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_dci.h
+++ b/openair1/PHY/NR_TRANSPORT/nr_dci.h
@@ -59,6 +59,4 @@ void nr_fill_ul_dci(PHY_VARS_gNB *gNB,
void nr_fill_cce_list(PHY_VARS_gNB *gNB, uint8_t m,nfapi_nr_dl_tti_pdcch_pdu_rel15_t *);
-void get_coreset_rballoc(uint8_t *FreqDomainResource,int *n_rb,int *rb_offset);
-
#endif //__PHY_NR_TRANSPORT_DCI__H
diff --git a/openair1/PHY/NR_TRANSPORT/nr_dci_tools.c b/openair1/PHY/NR_TRANSPORT/nr_dci_tools.c
index 57fbae4481..1675045443 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_dci_tools.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_dci_tools.c
@@ -31,6 +31,7 @@
*/
#include "nr_dci.h"
+#include "common/utils/nr/nr_common.h"
//#define DEBUG_FILL_DCI
diff --git a/openair1/PHY/NR_TRANSPORT/nr_dci_tools_common.c b/openair1/PHY/NR_TRANSPORT/nr_dci_tools_common.c
deleted file mode 100644
index d26a52f157..0000000000
--- a/openair1/PHY/NR_TRANSPORT/nr_dci_tools_common.c
+++ /dev/null
@@ -1,62 +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
- */
-
-/*! \file PHY/NR_TRANSPORT/nr_dci_tools_common.c
- * \brief
- * \author
- * \date 2018
- * \version 0.1
- * \company Eurecom
- * \email:
- * \note
- * \warning
- */
-
-#include "nr_dci.h"
-
-//#define DEBUG_FILL_DCI
-
-#include "nr_dlsch.h"
-
-
-void get_coreset_rballoc(uint8_t *FreqDomainResource,int *n_rb,int *rb_offset) {
-
- uint8_t count=0, start=0, start_set=0;
-
- uint64_t bitmap = (((uint64_t)FreqDomainResource[0])<<37)|
- (((uint64_t)FreqDomainResource[1])<<29)|
- (((uint64_t)FreqDomainResource[2])<<21)|
- (((uint64_t)FreqDomainResource[3])<<13)|
- (((uint64_t)FreqDomainResource[4])<<5)|
- (((uint64_t)FreqDomainResource[5])>>3);
-
- for (int i=0; i<45; i++)
- if ((bitmap>>(44-i))&1) {
- count++;
- if (!start_set) {
- start = i;
- start_set = 1;
- }
- }
- *rb_offset = 6*start;
- *n_rb = 6*count;
-}
-
diff --git a/openair1/PHY/NR_TRANSPORT/pucch_rx.c b/openair1/PHY/NR_TRANSPORT/pucch_rx.c
index 6e246ba854..2491c24ab6 100644
--- a/openair1/PHY/NR_TRANSPORT/pucch_rx.c
+++ b/openair1/PHY/NR_TRANSPORT/pucch_rx.c
@@ -206,7 +206,9 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
nr_sequences=8>>(1-pucch_pdu->sr_flag);
}
- LOG_D(PHY,"pucch0: nr_symbols %d, start_symbol %d, prb_start %d, second_hop_prb %d, group_hop_flag %d, sequence_hop_flag %d, O_ACK %d, O_SR %d, mcs %d initial_cyclic_shift %d\n",pucch_pdu->nr_of_symbols,pucch_pdu->start_symbol_index,pucch_pdu->prb_start,pucch_pdu->second_hop_prb,pucch_pdu->group_hop_flag,pucch_pdu->sequence_hop_flag,pucch_pdu->bit_len_harq,pucch_pdu->sr_flag,mcs[0],pucch_pdu->initial_cyclic_shift);
+ LOG_D(PHY,"pucch0: nr_symbols %d, start_symbol %d, prb_start %d, second_hop_prb %d, group_hop_flag %d, sequence_hop_flag %d, O_ACK %d, O_SR %d, mcs %d initial_cyclic_shift %d\n",
+ pucch_pdu->nr_of_symbols,pucch_pdu->start_symbol_index,pucch_pdu->prb_start,pucch_pdu->second_hop_prb,pucch_pdu->group_hop_flag,pucch_pdu->sequence_hop_flag,pucch_pdu->bit_len_harq,
+ pucch_pdu->sr_flag,mcs[0],pucch_pdu->initial_cyclic_shift);
int cs_ind = get_pucch0_cs_lut_index(gNB,pucch_pdu);
/*
@@ -238,7 +240,7 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
// x_n contains the sequence r_u_v_alpha_delta(n)
- int n,i,l;
+ int n,i;
int prb_offset[2] = {pucch_pdu->bwp_start+pucch_pdu->prb_start, pucch_pdu->bwp_start+pucch_pdu->prb_start};
nr_group_sequence_hopping(pucch_GroupHopping,pucch_pdu->hopping_id,0,slot,&u[0],&v[0]); // calculating u and v value first hop
@@ -266,14 +268,14 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
int64_t xrtmag=0,xrtmag_next=0;
uint8_t maxpos=0;
uint8_t index=0;
- for (l=0; lnr_of_symbols; l++) {
+ for (int l=0; lnr_of_symbols; l++) {
for (int aarx=0;aarxnb_antennas_rx;aarx++) {
memset((void*)xr[aarx][l],0,24*sizeof(int16_t));
}
}
int n2;
- for (l=0; lnr_of_symbols; l++) {
+ for (int l=0; lnr_of_symbols; l++) {
l2 = l+pucch_pdu->start_symbol_index;
re_offset[l] = (12*prb_offset[l]) + frame_parms->first_carrier_offset;
if (re_offset[l]>= frame_parms->ofdm_symbol_size)
@@ -300,11 +302,10 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
//int32_t no_corr = 0;
int seq_index;
int64_t temp;
- int64_t av_corr=0;
for(i=0;inr_of_symbols;l++) {
+ for (int l=0;lnr_of_symbols;l++) {
seq_index = (pucch_pdu->initial_cyclic_shift+
mcs[i]+
gNB->pucch0_lut.lut[cs_ind][slot][l+pucch_pdu->start_symbol_index])%12;
@@ -322,26 +323,30 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
}
}
}
- LOG_D(PHY,"PUCCH IDFT[%d/%d] = (%d,%d)=>%f\n",mcs[i],seq_index,corr_re[0][0],corr_im[0][0],10*log10((double)corr_re[0][0]*corr_re[0][0] + (double)corr_im[0][0]*corr_im[0][0]));
- if (l>1) LOG_D(PHY,"PUCCH 2nd symbol IDFT[%d/%d] = (%d,%d)=>%f\n",mcs[i],seq_index,corr_re[0][1],corr_im[0][1],10*log10((double)corr_re[0][1]*corr_re[0][1] + (double)corr_im[0][1]*corr_im[0][1]));
- if (pucch_pdu->freq_hop_flag == 0 && l==1) {// non-coherent correlation
- temp=0;
- for (int aa=0;aanb_antennas_rx;aa++)
- temp+=(int64_t)corr_re[aa][0]*corr_re[aa][0] + (int64_t)corr_im[aa][0]*corr_im[aa][0];
- }
-
- else if (pucch_pdu->freq_hop_flag == 0 && l==2) {
- int64_t corr_re2=0;
- int64_t corr_im2=0;
- temp=0;
- for (int aa=0;aanb_antennas_rx;aa++) {
- corr_re2 = (int64_t)corr_re[aa][0]+corr_re[aa][1];
- corr_im2 = (int64_t)corr_im[aa][0]+corr_im[aa][1];
- // coherent combining of 2 symbols and then complex modulus for single-frequency case
- temp+=corr_re2*corr_re2 + corr_im2*corr_im2;
- }
- }
- else if (pucch_pdu->freq_hop_flag == 1) {
+ LOG_D(PHY,"PUCCH IDFT[%d/%d] = (%d,%d)=>%f\n",
+ mcs[i],seq_index,corr_re[0][0],corr_im[0][0],
+ 10*log10((double)corr_re[0][0]*corr_re[0][0] + (double)corr_im[0][0]*corr_im[0][0]));
+ if (pucch_pdu->nr_of_symbols==2)
+ LOG_D(PHY,"PUCCH 2nd symbol IDFT[%d/%d] = (%d,%d)=>%f\n",
+ mcs[i],seq_index,corr_re[0][1],corr_im[0][1],
+ 10*log10((double)corr_re[0][1]*corr_re[0][1] + (double)corr_im[0][1]*corr_im[0][1]));
+ if (pucch_pdu->freq_hop_flag == 0) {
+ if (pucch_pdu->nr_of_symbols==1) {// non-coherent correlation
+ temp=0;
+ for (int aa=0;aanb_antennas_rx;aa++)
+ temp+=(int64_t)corr_re[aa][0]*corr_re[aa][0] + (int64_t)corr_im[aa][0]*corr_im[aa][0];
+ } else {
+ int64_t corr_re2=0;
+ int64_t corr_im2=0;
+ temp=0;
+ for (int aa=0;aanb_antennas_rx;aa++) {
+ corr_re2 = (int64_t)corr_re[aa][0]+corr_re[aa][1];
+ corr_im2 = (int64_t)corr_im[aa][0]+corr_im[aa][1];
+ // coherent combining of 2 symbols and then complex modulus for single-frequency case
+ temp+=corr_re2*corr_re2 + corr_im2*corr_im2;
+ }
+ }
+ } else if (pucch_pdu->freq_hop_flag == 1) {
// full non-coherent combining of 2 symbols for frequency-hopping case
temp=0;
for (int aa=0;aanb_antennas_rx;aa++)
@@ -349,7 +354,6 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
}
else AssertFatal(1==0,"shouldn't happen\n");
- av_corr+=temp;
if (temp>xrtmag) {
xrtmag_next = xrtmag;
xrtmag=temp;
@@ -359,19 +363,19 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
int64_t temp2=0,temp3=0;;
for (int aa=0;aanb_antennas_rx;aa++) {
temp2 += ((int64_t)corr_re[aa][0]*corr_re[aa][0] + (int64_t)corr_im[aa][0]*corr_im[aa][0]);
- if (l==2) temp3 += ((int64_t)corr_re[aa][1]*corr_re[aa][1] + (int64_t)corr_im[aa][1]*corr_im[aa][1]);
+ if (pucch_pdu->nr_of_symbols==2)
+ temp3 += ((int64_t)corr_re[aa][1]*corr_re[aa][1] + (int64_t)corr_im[aa][1]*corr_im[aa][1]);
}
uci_stats->current_pucch0_stat0= dB_fixed64(temp2);
- if (l==2) uci_stats->current_pucch0_stat1= dB_fixed64(temp3);
+ if ( pucch_pdu->nr_of_symbols==2)
+ uci_stats->current_pucch0_stat1= dB_fixed64(temp3);
}
else if (temp>xrtmag_next)
xrtmag_next = temp;
}
- //av_corr/=nr_sequences/l;
-
- int xrtmag_dBtimes10 = 10*(int)dB_fixed64(xrtmag/(12*l));
- int xrtmag_next_dBtimes10 = 10*(int)dB_fixed64(xrtmag_next/(12*l));
+ int xrtmag_dBtimes10 = 10*(int)dB_fixed64(xrtmag/(12*pucch_pdu->nr_of_symbols));
+ int xrtmag_next_dBtimes10 = 10*(int)dB_fixed64(xrtmag_next/(12*pucch_pdu->nr_of_symbols));
#ifdef DEBUG_NR_PUCCH_RX
printf("PUCCH 0 : maxpos %d\n",maxpos);
#endif
diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_adjust_synch_ue.c b/openair1/PHY/NR_UE_ESTIMATION/nr_adjust_synch_ue.c
index 3908febae9..19d4bf5079 100644
--- a/openair1/PHY/NR_UE_ESTIMATION/nr_adjust_synch_ue.c
+++ b/openair1/PHY/NR_UE_ESTIMATION/nr_adjust_synch_ue.c
@@ -42,7 +42,6 @@ void nr_adjust_synch_ue(NR_DL_FRAME_PARMS *frame_parms,
short coef)
{
- static int max_pos_fil = 0;
static int count_max_pos_ok = 0;
static int first_time = 1;
int max_val = 0, max_pos = 0;
@@ -55,13 +54,14 @@ void nr_adjust_synch_ue(NR_DL_FRAME_PARMS *frame_parms,
LOG_D(PHY,"AbsSubframe %d: rx_offset (before) = %d\n",subframe,ue->rx_offset);
- // we only use channel estimates from tx antenna 0 here
- for (int i = 0; i < frame_parms->nb_prefix_samples; i++) {
+ // search for maximum position within the cyclic prefix
+ for (int i = -frame_parms->nb_prefix_samples/2; i < frame_parms->nb_prefix_samples/2; i++) {
int temp = 0;
+ int j = (i < 0) ? (i + frame_parms->ofdm_symbol_size) : i;
for (int aa = 0; aa < frame_parms->nb_antennas_rx; aa++) {
- int Re = ((int16_t*)ue->pbch_vars[gNB_id]->dl_ch_estimates_time[aa])[(i<<1)];
- int Im = ((int16_t*)ue->pbch_vars[gNB_id]->dl_ch_estimates_time[aa])[1+(i<<1)];
+ int Re = ((int16_t*)ue->pbch_vars[gNB_id]->dl_ch_estimates_time[aa])[(j<<1)];
+ int Im = ((int16_t*)ue->pbch_vars[gNB_id]->dl_ch_estimates_time[aa])[1+(j<<1)];
temp += (Re*Re/2) + (Im*Im/2);
}
@@ -71,19 +71,16 @@ void nr_adjust_synch_ue(NR_DL_FRAME_PARMS *frame_parms,
}
}
- if (max_pos > frame_parms->ofdm_symbol_size/2)
- max_pos = max_pos - frame_parms->ofdm_symbol_size;
-
// filter position to reduce jitter
if (clear == 1)
- max_pos_fil = max_pos;
+ ue->max_pos_fil = max_pos;
else
- max_pos_fil = ((max_pos_fil * coef) + (max_pos * ncoef)) >> 15;
+ ue->max_pos_fil = ((ue->max_pos_fil * coef) + (max_pos * ncoef)) >> 15;
// do not filter to have proactive timing adjustment
- //max_pos_fil = max_pos;
+ //ue->max_pos_fil = max_pos;
- int diff = max_pos_fil - sync_pos;
+ int diff = ue->max_pos_fil - sync_pos;
if (frame_parms->freq_range==nr_FR2)
sync_offset = 2;
@@ -131,7 +128,7 @@ void nr_adjust_synch_ue(NR_DL_FRAME_PARMS *frame_parms,
ue->rx_offset,
clear,
max_pos,
- max_pos_fil,
+ ue->max_pos_fil,
max_val,
sync_pos);
#endif //DEBUG_PHY
diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c
index 8097b9b3ea..30eae2d30f 100644
--- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c
+++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c
@@ -485,8 +485,8 @@ int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue,
#ifdef DEBUG_PDCCH
- printf("PDCCH Channel Estimation : ThreadId %d, gNB_id %d ch_offset %d, OFDM size %d, Ncp=%d, Ns=%d, k=%d symbol %d\n",proc->thread_id, gNB_id,ch_offset,ue->frame_parms.ofdm_symbol_size,
- ue->frame_parms.Ncp,Ns,k, symbol);
+ printf("PDCCH Channel Estimation : ThreadId %d, gNB_id %d ch_offset %d, OFDM size %d, Ncp=%d, Ns=%d, symbol %d\n",
+ proc->thread_id, gNB_id,ch_offset,ue->frame_parms.ofdm_symbol_size,ue->frame_parms.Ncp,Ns,symbol);
#endif
fl = filt16a_l1;
diff --git a/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c b/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c
index b6009776a1..84c9627c8a 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c
@@ -30,11 +30,9 @@
* \warning
*/
-#ifdef USER_MODE
- #include
- #include
- #include
-#endif
+#include
+#include
+#include
#include "executables/softmodem-common.h"
@@ -43,7 +41,7 @@
#include "PHY/phy_extern_nr_ue.h"
#include "PHY/CODING/coding_extern.h"
#include "PHY/sse_intrin.h"
-#include "PHY/NR_TRANSPORT/nr_dci.h"
+#include "common/utils/nr/nr_common.h"
#include "assertions.h"
#include "T.h"
@@ -61,7 +59,6 @@ char nr_dci_format_string[8][30] = {
//#define DEBUG_DCI_DECODING 1
//#define NR_LTE_PDCCH_DCI_SWITCH
-#define NR_PDCCH_DCI_RUN // activates new nr functions
//#define NR_PDCCH_DCI_DEBUG // activates NR_PDCCH_DCI_DEBUG logs
#ifdef NR_PDCCH_DCI_DEBUG
#define LOG_DNL(a, ...) printf("\n\t\t<-NR_PDCCH_DCI_DEBUG (%s)-> " a, __func__, ##__VA_ARGS__ )
@@ -81,7 +78,6 @@ char nr_dci_format_string[8][30] = {
#define LOG_I(A,B...) printf(B)
#endif
-#ifdef NR_PDCCH_DCI_RUN
//static const int16_t conjugate[8]__attribute__((aligned(32))) = {-1,1,-1,1,-1,1,-1,1};
@@ -90,6 +86,7 @@ char nr_dci_format_string[8][30] = {
void nr_pdcch_demapping_deinterleaving(uint32_t *llr,
uint32_t *z,
uint8_t coreset_time_dur,
+ uint8_t start_symbol,
uint32_t coreset_nbr_rb,
uint8_t reg_bundle_size_L,
uint8_t coreset_interleaver_size_R,
@@ -186,7 +183,7 @@ void nr_pdcch_demapping_deinterleaving(uint32_t *llr,
int rb = 0;
for (int c_id = 0; c_id < number_of_candidates; c_id++ ) {
- for (int symbol_idx = 0; symbol_idx < coreset_time_dur; symbol_idx++) {
+ for (int symbol_idx = start_symbol; symbol_idx < start_symbol+coreset_time_dur; symbol_idx++) {
for (int cce_count = CCE[c_id/coreset_time_dur]+c_id%coreset_time_dur; cce_count < CCE[c_id/coreset_time_dur]+c_id%coreset_time_dur+L[c_id]; cce_count += coreset_time_dur) {
for (int reg_in_cce_idx = 0; reg_in_cce_idx < NR_NB_REG_PER_CCE; reg_in_cce_idx++) {
@@ -209,9 +206,6 @@ void nr_pdcch_demapping_deinterleaving(uint32_t *llr,
}
}
-#endif
-
-#ifdef NR_PDCCH_DCI_RUN
int32_t nr_pdcch_llr(NR_DL_FRAME_PARMS *frame_parms, int32_t **rxdataF_comp,
int16_t *pdcch_llr, uint8_t symbol,uint32_t coreset_nbr_rb) {
int16_t *rxF = (int16_t *) &rxdataF_comp[0][(symbol * coreset_nbr_rb * 12)];
@@ -242,7 +236,6 @@ int32_t nr_pdcch_llr(NR_DL_FRAME_PARMS *frame_parms, int32_t **rxdataF_comp,
return (0);
}
-#endif
#if 0
@@ -283,9 +276,10 @@ int32_t pdcch_llr(NR_DL_FRAME_PARMS *frame_parms,
//compute average channel_level on each (TX,RX) antenna pair
void nr_pdcch_channel_level(int32_t **dl_ch_estimates_ext,
- NR_DL_FRAME_PARMS *frame_parms,
- int32_t *avg,
- uint8_t nb_rb) {
+ NR_DL_FRAME_PARMS *frame_parms,
+ int32_t *avg,
+ int symbol,
+ uint8_t nb_rb) {
int16_t rb;
uint8_t aarx;
#if defined(__x86_64__) || defined(__i386__)
@@ -300,9 +294,9 @@ void nr_pdcch_channel_level(int32_t **dl_ch_estimates_ext,
//clear average level
#if defined(__x86_64__) || defined(__i386__)
avg128P = _mm_setzero_si128();
- dl_ch128=(__m128i *)&dl_ch_estimates_ext[aarx][0];
+ dl_ch128=(__m128i *)&dl_ch_estimates_ext[aarx][symbol*nb_rb*12];
#elif defined(__arm__)
- dl_ch128=(int16x8_t *)&dl_ch_estimates_ext[aarx][0];
+ dl_ch128=(int16x8_t *)&dl_ch_estimates_ext[aarx][symbol*nb_rb*12];
#endif
for (rb=0; rb<(nb_rb*3)>>2; rb++) {
@@ -328,7 +322,7 @@ void nr_pdcch_channel_level(int32_t **dl_ch_estimates_ext,
((int32_t *)&avg128P)[1] +
((int32_t *)&avg128P)[2] +
((int32_t *)&avg128P)[3])/(nb_rb*9);
- // printf("Channel level : %d\n",avg[(aatx<<1)+aarx]);
+ LOG_DDD("Channel level : %d\n",avg[aarx]);
}
#if defined(__x86_64__) || defined(__i386__)
@@ -346,7 +340,6 @@ void nr_pdcch_channel_level(int32_t **dl_ch_estimates_ext,
-#ifdef NR_PDCCH_DCI_RUN
// This function will extract the mapped DM-RS PDCCH REs as per 38.211 Section 7.4.1.3.2 (Mapping to physical resources)
void nr_pdcch_extract_rbs_single(int32_t **rxdataF,
int32_t **dl_ch_estimates,
@@ -385,7 +378,7 @@ void nr_pdcch_extract_rbs_single(int32_t **rxdataF,
#endif
for (aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++) {
- dl_ch0 = &dl_ch_estimates[aarx][0];
+ dl_ch0 = &dl_ch_estimates[aarx][frame_parms->ofdm_symbol_size*symbol];
LOG_DDD("dl_ch0 = &dl_ch_estimates[aarx = (%d)][0]\n",aarx);
dl_ch0_ext = &dl_ch_estimates_ext[aarx][symbol * (coreset_nbr_rb * NBR_RE_PER_RB_WITH_DMRS)];
@@ -542,9 +535,6 @@ void nr_pdcch_extract_rbs_single(int32_t **rxdataF,
}
}
-#endif
-
-
#define print_shorts(s,x) printf("%s %d,%d,%d,%d,%d,%d,%d,%d\n",s,(x)[0],(x)[1],(x)[2],(x)[3],(x)[4],(x)[5],(x)[6],(x)[7])
void nr_pdcch_channel_compensation(int32_t **rxdataF_ext,
@@ -639,9 +629,9 @@ void nr_pdcch_channel_compensation(int32_t **rxdataF_ext,
for (int i=0; i<12 ; i++)
LOG_DDD("rxdataF128[%d]=(%d,%d) X dlch[%d]=(%d,%d) rxdataF_comp128[%d]=(%d,%d)\n",
- (rb*12)+i, ((short *)rxdataF128)[i<<1],((short *)rxdataF128)[1+(i<<1)],
- (rb*12)+i, ((short *)dl_ch128)[i<<1],((short *)dl_ch128)[1+(i<<1)],
- (rb*12)+i, ((short *)rxdataF_comp128)[i<<1],((short *)rxdataF_comp128)[1+(i<<1)]);
+ (rb*12)+i, ((short *)rxdataF128)[i<<1],((short *)rxdataF128)[1+(i<<1)],
+ (rb*12)+i, ((short *)dl_ch128)[i<<1],((short *)dl_ch128)[1+(i<<1)],
+ (rb*12)+i, ((short *)rxdataF_comp128)[i<<1],((short *)rxdataF_comp128)[1+(i<<1)]);
dl_ch128+=3;
rxdataF128+=3;
@@ -694,24 +684,6 @@ void nr_pdcch_detection_mrc(NR_DL_FRAME_PARMS *frame_parms,
#endif
}
-#if 0
-void pdcch_siso(NR_DL_FRAME_PARMS *frame_parms,
- int32_t **rxdataF_comp,
- uint8_t l) {
- uint8_t rb,re,jj,ii;
- jj=0;
- ii=0;
-
- for (rb=0; rbN_RB_DL; rb++) {
- for (re=0; re<12; re++) {
- rxdataF_comp[0][jj++] = rxdataF_comp[0][ii];
- ii++;
- }
- }
-}
-#endif
-
-#ifdef NR_PDCCH_DCI_RUN
int32_t nr_rx_pdcch(PHY_VARS_NR_UE *ue,
UE_nr_rxtx_proc_t *proc,
fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15) {
@@ -748,6 +720,7 @@ int32_t nr_rx_pdcch(PHY_VARS_NR_UE *ue,
nr_pdcch_channel_level(pdcch_vars->dl_ch_estimates_ext,
frame_parms,
avgP,
+ s,
n_rb);
avgs = 0;
@@ -802,6 +775,7 @@ int32_t nr_rx_pdcch(PHY_VARS_NR_UE *ue,
nr_pdcch_demapping_deinterleaving((uint32_t *) pdcch_vars->llr,
(uint32_t *) pdcch_vars->e_rx,
rel15->coreset.duration,
+ rel15->coreset.StartSymbolIndex,
n_rb,
rel15->coreset.RegBundleSize,
rel15->coreset.InterleaverSize,
@@ -824,36 +798,7 @@ int32_t nr_rx_pdcch(PHY_VARS_NR_UE *ue,
return (0);
}
-#endif
-#if 0
-void nr_pdcch_scrambling(NR_DL_FRAME_PARMS *frame_parms,
- uint8_t nr_slot_rx,
- uint8_t *e,
- uint32_t length) {
- int i;
- uint8_t reset;
- uint32_t x1, x2, s=0;
- reset = 1;
- // x1 is set in lte_gold_generic
- x2 = (nr_slot_rx<<9) + frame_parms->Nid_cell; //this is c_init in 36.211 Sec 6.8.2
-
- for (i=0; i>(i&0x1f))&1));
- if (e[i] != 2) // element is 2
- e[i] = (e[i]&1) ^ ((s>>(i&0x1f))&1);
- }
-}
-#endif
-
-
-#ifdef NR_PDCCH_DCI_RUN
void nr_pdcch_unscrambling(int16_t *z,
uint16_t scrambling_RNTI,
@@ -883,10 +828,7 @@ void nr_pdcch_unscrambling(int16_t *z,
}
}
-#endif
-
-#ifdef NR_PDCCH_DCI_RUN
/* This function compares the received DCI bits with
* re-encoded DCI bits and returns the number of mismatched bits
*/
@@ -946,7 +888,8 @@ uint8_t nr_dci_decoding_procedure(PHY_VARS_NR_UE *ue,
uint64_t dci_estimation[2]= {0};
const t_nrPolar_params *currentPtrDCI = nr_polar_params(NR_POLAR_DCI_MESSAGE_TYPE, dci_length, L, 1, &ue->polarList);
- LOG_D(PHY, "Trying DCI candidate %d of %d number of candidates, CCE %d (%d), L %d, length %d, format %s\n", j, rel15->number_of_candidates, CCEind, CCEind*9*6*2, L, dci_length,nr_dci_format_string[rel15->dci_format_options[k]]);
+ LOG_D(PHY, "Trying DCI candidate %d of %d number of candidates, CCE %d (%d), L %d, length %d, format %s\n",
+ j, rel15->number_of_candidates, CCEind, CCEind*9*6*2, L, dci_length,nr_dci_format_string[rel15->dci_format_options[k]]);
nr_pdcch_unscrambling(&pdcch_vars->e_rx[CCEind*108], rel15->coreset.scrambling_rnti, L*108, rel15->coreset.pdcch_dmrs_scrambling_id, tmp_e);
@@ -997,846 +940,4 @@ uint8_t nr_dci_decoding_procedure(PHY_VARS_NR_UE *ue,
return(dci_ind->number_of_dcis);
}
-/*
-void nr_dci_decoding_procedure0(int s,
- int p,
- int coreset_time_dur,
- uint16_t coreset_nbr_rb,
- NR_UE_PDCCH **pdcch_vars,
- int do_common,
- uint8_t nr_slot_rx,
- NR_DCI_ALLOC_t *dci_alloc,
- int16_t eNB_id,
- uint8_t current_thread_id,
- NR_DL_FRAME_PARMS *frame_parms,
- //uint8_t mi,
- uint16_t crc_scrambled_values[TOTAL_NBR_SCRAMBLED_VALUES],
- uint8_t L,
- NR_UE_SEARCHSPACE_CSS_DCI_FORMAT_t format_css,
- NR_UE_SEARCHSPACE_USS_DCI_FORMAT_t format_uss,
- uint8_t sizeof_bits,
- uint8_t sizeof_bytes,
- uint8_t *dci_cnt,
- crc_scrambled_t *crc_scrambled,
- format_found_t *format_found,
- uint16_t pdcch_DMRS_scrambling_id,
- uint32_t *CCEmap0,
- uint32_t *CCEmap1,
- uint32_t *CCEmap2) {
- uint32_t crc, CCEind, nCCE[3];
- uint32_t *CCEmap = NULL, CCEmap_mask = 0;
- uint8_t L2 = (1 << L);
- unsigned int Yk, nb_candidates = 0, i, m;
- unsigned int CCEmap_cand;
- uint32_t decoderState=0;
- // A[p], p is the current active CORESET
- uint16_t A[3]= {39827,39829,39839};
- //Table 10.1-2: Maximum number of PDCCH candidates per slot and per serving cell as a function of the subcarrier spacing value 2^mu*15 KHz, mu {0,1,2,3}
- uint8_t m_max_slot_pdcch_Table10_1_2 [4] = {44,36,22,20};
- //Table 10.1-3: Maximum number of non-overlapped CCEs per slot and per serving cell as a function of the subcarrier spacing value 2^mu*15 KHz, mu {0,1,2,3}
- //uint8_t cce_max_slot_pdcch_Table10_1_3 [4] = {56,56,48,32};
- int coreset_nbr_cce_per_symbol=0;
- LOG_DDD("format_found is %d \n", *format_found);
- //if (mode == NO_DCI) {
- // #ifdef NR_PDCCH_DCI_DEBUG
- // LOG_DDD("skip DCI decoding: expect no DCIs at nr_slot_rx %d in current searchSpace\n", nr_slot_rx);
- // #endif
- // return;
- //}
- LOG_DDD("frequencyDomainResources=%lx, duration=%d\n",
- pdcch_vars[eNB_id]->coreset[p].frequencyDomainResources, pdcch_vars[eNB_id]->coreset[p].duration);
- // nCCE = get_nCCE(pdcch_vars[eNB_id]->num_pdcch_symbols, frame_parms, mi);
- for (int i = 0; i < 45; i++) {
- // this loop counts each bit of the bit map coreset_freq_dom, and increments nbr_RB_coreset for each bit set to '1'
- if (((pdcch_vars[eNB_id]->coreset[p].frequencyDomainResources & 0x1FFFFFFFFFFF) >> i) & 0x1) coreset_nbr_cce_per_symbol++;
- }
-
- nCCE[p] = pdcch_vars[eNB_id]->coreset[p].duration*coreset_nbr_cce_per_symbol; // 1 CCE = 6 RB
- // p is the current CORESET we are currently monitoring (among the 3 possible CORESETs in a BWP)
- // the number of CCE in the current CORESET is:
- // the number of symbols in the CORESET (pdcch_vars[eNB_id]->coreset[p].duration)
- // multiplied by the number of bits set to '1' in the frequencyDomainResources bitmap
- // (1 bit set to '1' corresponds to 6 RB and 1 CCE = 6 RB)
- LOG_DDD("nCCE[%d]=%d\n",p,nCCE[p]);
-
- // if (nCCE > get_nCCE(3, frame_parms, 1)) {
- //LOG_D(PHY,
- //"skip DCI decoding: nCCE=%d > get_nCCE(3,frame_parms,1)=%d\n",
- //nCCE, get_nCCE(3, frame_parms, 1));
- //return;
- // }
-
-// if (nCCE < L2) {
-// LOG_D(PHY, "skip DCI decoding: nCCE=%d < L2=%d\n", nCCE, L2);
-// return;
-// }
-
-// if (mode == NO_DCI) {
-// LOG_D(PHY, "skip DCI decoding: expect no DCIs at nr_slot_rx %d\n",
-// nr_slot_rx);
-// return;
-// }
-
- if (do_common == 1) {
- Yk = 0;
-
- if (pdcch_vars[eNB_id]->searchSpace[s].searchSpaceType.common_dci_formats == cformat2_0) {
- // for dci_format_2_0, the nb_candidates is obtained from a different variable
- switch (L2) {
- case 1:
- nb_candidates = pdcch_vars[eNB_id]->searchSpace[s].searchSpaceType.sfi_nrofCandidates_aggrlevel1;
- break;
-
- case 2:
- nb_candidates = pdcch_vars[eNB_id]->searchSpace[s].searchSpaceType.sfi_nrofCandidates_aggrlevel2;
- break;
-
- case 4:
- nb_candidates = pdcch_vars[eNB_id]->searchSpace[s].searchSpaceType.sfi_nrofCandidates_aggrlevel4;
- break;
-
- case 8:
- nb_candidates = pdcch_vars[eNB_id]->searchSpace[s].searchSpaceType.sfi_nrofCandidates_aggrlevel8;
- break;
-
- case 16:
- nb_candidates = pdcch_vars[eNB_id]->searchSpace[s].searchSpaceType.sfi_nrofCandidates_aggrlevel16;
- break;
-
- default:
- break;
- }
- } else if (pdcch_vars[eNB_id]->searchSpace[s].searchSpaceType.common_dci_formats == cformat2_3) {
- // for dci_format_2_3, the nb_candidates is obtained from a different variable
- nb_candidates = pdcch_vars[eNB_id]->searchSpace[s].searchSpaceType.srs_nrofCandidates;
- } else {
- nb_candidates = (L2 == 4) ? 4 : ((L2 == 8)? 2 : 1); // according to Table 10.1-1 (38.213 section 10.1)
- LOG_DDD("we are in common searchSpace and nb_candidates=%u for L2=%d\n", nb_candidates, L2);
- }
- } else {
- switch (L2) {
- case 1:
- nb_candidates = pdcch_vars[eNB_id]->searchSpace[s].nrofCandidates_aggrlevel1;
- break;
-
- case 2:
- nb_candidates = pdcch_vars[eNB_id]->searchSpace[s].nrofCandidates_aggrlevel2;
- break;
-
- case 4:
- nb_candidates = pdcch_vars[eNB_id]->searchSpace[s].nrofCandidates_aggrlevel4;
- break;
-
- case 8:
- nb_candidates = pdcch_vars[eNB_id]->searchSpace[s].nrofCandidates_aggrlevel8;
- break;
-
- case 16:
- nb_candidates = pdcch_vars[eNB_id]->searchSpace[s].nrofCandidates_aggrlevel16;
- break;
-
- default:
- break;
- }
-
- // Find first available in ue specific search space
- // according to procedure in Section 10.1 of 38.213
- // compute Yk
- Yk = (unsigned int) pdcch_vars[eNB_id]->crnti;
-
- for (i = 0; i <= nr_slot_rx; i++)
- Yk = (Yk * A[p%3]) % 65537;
- }
-
- LOG_DDD("L2(%d) | nCCE[%d](%d) | Yk(%u) | nb_candidates(%u)\n", L2, p, nCCE[p], Yk, nb_candidates);
- // for (CCEind=0;
- // CCEind nCCE[p])
- // nb_candidates = nCCE[p] / L2;
- // In the next code line there is maybe a bug. The spec is not comparing Table 10.1-2 with nb_candidates, but with total number of candidates for all s and all p
- int m_p_s_L_max = (m_max_slot_pdcch_Table10_1_2[1]<=nb_candidates ? m_max_slot_pdcch_Table10_1_2[1] : nb_candidates);
-
- if (L==4) m_p_s_L_max=1; // Table 10.1-2 is not defined for L=4
-
- if(0 <= L && L < 4) LOG_DDD("m_max_slot_pdcch_Table10_1_2(%d)=%d\n",L,m_max_slot_pdcch_Table10_1_2[L]);
-
- for (m = 0; m < nb_candidates; m++) {
- int n_ci = 0;
-
- if (nCCE[p] < L2) return;
-
- LOG_DDD("debug1(%d)=nCCE[p]/L2 | nCCE[%d](%d) | L2(%d)\n",nCCE[p] / L2,p,nCCE[p],L2);
- LOG_DDD("debug2(%d)=L2*m_p_s_L_max | L2(%d) | m_p_s_L_max(%d)\n",L2*m_p_s_L_max,L2,m_p_s_L_max);
- CCEind = (((Yk + (uint16_t)(floor((m*nCCE[p])/(L2*m_p_s_L_max))) + n_ci) % (uint16_t)(floor(nCCE[p] / L2))) * L2);
- LOG_DDD("CCEind(%u) = (((Yk(%u) + ((m(%u)*nCCE[p](%u))/(L2(%d)*m_p_s_L_max(%d)))) %% (nCCE[p] / L2)) * L2)\n",
- CCEind,Yk,m,nCCE[p],L2,m_p_s_L_max);
- LOG_DDD("n_candidate(m)=%u | CCEind=%u |",m,CCEind);
-
- if (CCEind < 32)
- CCEmap = CCEmap0;
- else if (CCEind < 64)
- CCEmap = CCEmap1;
- else if (CCEind < 96)
- CCEmap = CCEmap2;
- else AssertFatal(1==0,"Illegal CCEind %u (Yk %u, m %u, nCCE %u, L2 %u\n", CCEind, Yk, m, nCCE[p], L2);
-
- switch (L2) {
- case 1:
- CCEmap_mask = (1 << (CCEind & 0x1f));
- break;
-
- case 2:
- CCEmap_mask = (3 << (CCEind & 0x1f));
- break;
-
- case 4:
- CCEmap_mask = (0xf << (CCEind & 0x1f));
- break;
-
- case 8:
- CCEmap_mask = (0xff << (CCEind & 0x1f));
- break;
-
- case 16:
- CCEmap_mask = (0xfff << (CCEind & 0x1f));
- break;
-
- default:
- LOG_E(PHY, "Illegal L2 value %d\n", L2);
- //mac_xface->macphy_exit("Illegal L2\n");
- return; // not reached
- }
-
- CCEmap_cand = (*CCEmap) & CCEmap_mask;
- // CCE is not allocated yet
- LOG_DDD("CCEmap_cand=%u \n",CCEmap_cand);
-
- if (CCEmap_cand == 0) {
-#ifdef DEBUG_DCI_DECODING
-
- if (do_common == 1)
- LOG_I(PHY,"[DCI search nPdcch %d - common] Attempting candidate %d Aggregation Level %d DCI length %d at CCE %d/%d (CCEmap %x,CCEmap_cand %x)\n",
- pdcch_vars[eNB_id]->num_pdcch_symbols,m,L2,sizeof_bits,CCEind,nCCE,*CCEmap,CCEmap_mask);
- else
- LOG_I(PHY,"[DCI search nPdcch %d - ue spec] Attempting candidate %d Aggregation Level %d DCI length %d at CCE %d/%d (CCEmap %x,CCEmap_cand %x) format %d\n",
- pdcch_vars[eNB_id]->num_pdcch_symbols,m,L2,sizeof_bits,CCEind,nCCE,*CCEmap,CCEmap_mask,format_uss);
-
-#endif
- LOG_DDD("... we enter function dci_decoding(sizeof_bits=%d L=%d) -----\n",sizeof_bits,L);
- LOG_DDD("... we have to replace this part of the code by polar decoding\n");
- // for (int m=0; m < (nCCE[p]*6*9*2); m++)
- LOG_DDD("(polar decoding)-> polar intput (with coreset_time_dur=%d, coreset_nbr_rb=%d, p=%d, CCEind=%u): \n",
- coreset_time_dur,coreset_nbr_rb,p,CCEind);
-
- //int reg_p=0,reg_e=0;
- //for (int m=0; m < (L2*6); m++){
- //reg_p = (((int)floor(m/coreset_time_dur))+((m%coreset_time_dur)*(L2*6/coreset_time_dur)))*9*2;
- //reg_e = m*9*2;
- //for (int i=0; i<9*2; i++){
- //polar_input[reg_p+i] = (pdcch_vars[eNB_id]->e_rx[((CCEind*9*6*2) + reg_e + i)]>0) ? (1.0):(-1.0);
- //polar_input[reg_e+i] = (pdcch_vars[eNB_id]->e_rx[((CCEind*9*6*2) + reg_e + i)]>0) ? (1/sqrt(2)):((-1)/sqrt(2));
- //printf("\t m=%d \tpolar_input[%d]=%lf <-> e_rx[%d]=%d\n",m,reg_e+i,polar_input[reg_e+i],
- // ((CCEind*9*6*2) + reg_e + i),pdcch_vars[eNB_id]->e_rx[((CCEind*9*6*2) + reg_e + i)]);
- //printf("\t m=%d \tpolar_input[%d]=%lf <-> e_rx[%d]=%d\n",m,reg_p+i,polar_input[reg_p+i],
- // ((CCEind*9*6*2) + reg_e + i),pdcch_vars[eNB_id]->e_rx[((CCEind*9*6*2) + reg_e + i)]);
- //}
- //}
-
- //#ifdef NR_PDCCH_DCI_DEBUG
- //printf("\n");
- //int j=0;
- //uint32_t polar_hex[27] = {0};
- //for (int i=0; ie_rx[CCEind*9*6*2],
- dci_estimation,
- 1,
- currentPtrDCI);
- crc = decoderState;
- //crc = (crc16(&dci_decoded_output[current_thread_id][0], sizeof_bits) >> 16) ^ extract_crc(&dci_decoded_output[current_thread_id][0], sizeof_bits);
- LOG_DDD("... we end function dci_decoding() with crc=%x\n",crc);
- LOG_DDD("... we have to replace this part of the code by polar decoding\n");
-#ifdef DEBUG_DCI_DECODING
- LOG_DDD("(nr_dci_decoding_procedure0: crc =>%d\n",crc);
-#endif //uint16_t tc_rnti, uint16_t int_rnti, uint16_t sfi_rnti, uint16_t tpc_pusch_rnti, uint16_t tpc_pucch_rnti, uint16_t tpc_srs__rnti
- LOG_DDD("format_found=%d\n",*format_found);
- LOG_DDD("crc_scrambled=%d\n",*crc_scrambled);
-
- if (crc == crc_scrambled_values[_C_RNTI_]) {
- *crc_scrambled =_c_rnti;
- *format_found=1;
- }
-
- if (crc == crc_scrambled_values[_CS_RNTI_]) {
- *crc_scrambled =_cs_rnti;
- *format_found=1;
- }
-
- if (crc == crc_scrambled_values[_NEW_RNTI_]) {
- *crc_scrambled =_new_rnti;
- *format_found=1;
- }
-
- if (crc == crc_scrambled_values[_TC_RNTI_]) {
- *crc_scrambled =_tc_rnti;
- *format_found=_format_1_0_found;
- }
-
- if (crc == crc_scrambled_values[_P_RNTI_]) {
- *crc_scrambled =_p_rnti;
- *format_found=_format_1_0_found;
- }
-
- if (crc == crc_scrambled_values[_SI_RNTI_]) {
- *crc_scrambled =_si_rnti;
- *format_found=_format_1_0_found;
- }
-
- if (crc == crc_scrambled_values[_RA_RNTI_]) {
- *crc_scrambled =_ra_rnti;
- *format_found=_format_1_0_found;
- }
-
- if (crc == crc_scrambled_values[_SP_CSI_RNTI_]) {
- *crc_scrambled =_sp_csi_rnti;
- *format_found=_format_0_1_found;
- }
-
- if (crc == crc_scrambled_values[_SFI_RNTI_]) {
- *crc_scrambled =_sfi_rnti;
- *format_found=_format_2_0_found;
- }
-
- if (crc == crc_scrambled_values[_INT_RNTI_]) {
- *crc_scrambled =_int_rnti;
- *format_found=_format_2_1_found;
- }
-
- if (crc == crc_scrambled_values[_TPC_PUSCH_RNTI_]) {
- *crc_scrambled =_tpc_pusch_rnti;
- *format_found=_format_2_2_found;
- }
-
- if (crc == crc_scrambled_values[_TPC_PUCCH_RNTI_]) {
- *crc_scrambled =_tpc_pucch_rnti;
- *format_found=_format_2_2_found;
- }
-
- if (crc == crc_scrambled_values[_TPC_SRS_RNTI_]) {
- *crc_scrambled =_tpc_srs_rnti;
- *format_found=_format_2_3_found;
- }
-
-
- LOG_DDD("format_found=%d\n",*format_found);
- LOG_DDD("crc_scrambled=%d\n",*crc_scrambled);
-
- if (*format_found!=255) {
- dci_alloc[*dci_cnt].dci_length = sizeof_bits;
- dci_alloc[*dci_cnt].rnti = crc;
- dci_alloc[*dci_cnt].L = L;
- dci_alloc[*dci_cnt].firstCCE = CCEind;
- memcpy(&dci_alloc[*dci_cnt].dci_pdu[0],dci_estimation,8);
-
- LOG_DDD("rnti matches -> DCI FOUND !!! crc =>0x%x, sizeof_bits %d, sizeof_bytes %d \n",
- dci_alloc[*dci_cnt].rnti, dci_alloc[*dci_cnt].dci_length, sizeof_bytes);
- LOG_DDD("dci_cnt %d (format_css %d crc_scrambled %d) L %d, firstCCE %d pdu[0] 0x%lx pdu[1] 0x%lx \n",
- *dci_cnt, format_css,*crc_scrambled,dci_alloc[*dci_cnt].L, dci_alloc[*dci_cnt].firstCCE,dci_alloc[*dci_cnt].dci_pdu[0],dci_alloc[*dci_cnt].dci_pdu[1]);
- if ((format_css == cformat0_0_and_1_0) || (format_uss == uformat0_0_and_1_0)) {
- if ((*crc_scrambled == _p_rnti) || (*crc_scrambled == _si_rnti) || (*crc_scrambled == _ra_rnti)) {
- dci_alloc[*dci_cnt].format = format1_0;
- *dci_cnt = *dci_cnt + 1;
- *format_found=_format_1_0_found;
- // LOG_DDD("a format1_0=%d and dci_cnt=%d\n",*format_found,*dci_cnt);
- } else {
- if ((dci_estimation[0]&1) == 0) {
- dci_alloc[*dci_cnt].format = format0_0;
- *dci_cnt = *dci_cnt + 1;
- *format_found=_format_0_0_found;
- // LOG_DDD("b format0_0=%d and dci_cnt=%d\n",*format_found,*dci_cnt);
- }
-
- if ((dci_estimation[0]&1) == 1) {
- dci_alloc[*dci_cnt].format = format1_0;
- *dci_cnt = *dci_cnt + 1;
- *format_found=_format_1_0_found;
- // LOG_DDD("c format1_0=%d and dci_cnt=%d\n",*format_found,*dci_cnt);
- }
- }
- }
-
- if (format_css == cformat2_0) {
- dci_alloc[*dci_cnt].format = format2_0;
- *dci_cnt = *dci_cnt + 1;
- *format_found=_format_2_0_found;
- }
-
- if (format_css == cformat2_1) {
- dci_alloc[*dci_cnt].format = format2_1;
- *dci_cnt = *dci_cnt + 1;
- *format_found=_format_2_1_found;
- }
-
- if (format_css == cformat2_2) {
- dci_alloc[*dci_cnt].format = format2_2;
- *dci_cnt = *dci_cnt + 1;
- *format_found=_format_2_2_found;
- }
-
- if (format_css == cformat2_3) {
- dci_alloc[*dci_cnt].format = format2_3;
- *dci_cnt = *dci_cnt + 1;
- *format_found=_format_2_3_found;
- }
-
- if (format_uss == uformat0_1_and_1_1) {
- if ((dci_estimation[0]&1) == 0) {
- dci_alloc[*dci_cnt].format = format0_1;
- *dci_cnt = *dci_cnt + 1;
- *format_found=_format_0_1_found;
- }
-
- if ((dci_estimation[0]&1) == 1) {
- dci_alloc[*dci_cnt].format = format1_1;
- *dci_cnt = *dci_cnt + 1;
- *format_found=_format_1_1_found;
- }
- }
-
- // store first nCCE of group for PUCCH transmission of ACK/NAK
- pdcch_vars[eNB_id]->nCCE[nr_slot_rx] = CCEind;
-
- // if (crc == si_rnti) {
- // dci_alloc[*dci_cnt].format = format_si;
- // *dci_cnt = *dci_cnt + 1;
- // } else if (crc == p_rnti) {
- // dci_alloc[*dci_cnt].format = format_p;
- // *dci_cnt = *dci_cnt + 1;
- // } else if (crc == ra_rnti) {
- // dci_alloc[*dci_cnt].format = format_ra;
- // // store first nCCE of group for PUCCH transmission of ACK/NAK
- // pdcch_vars[eNB_id]->nCCE[nr_slot_rx] = CCEind;
- // *dci_cnt = *dci_cnt + 1;
- // } else if (crc == pdcch_vars[eNB_id]->crnti) {
-
- // if ((mode & UL_DCI) && (format_c == format0)
- // && ((dci_decoded_output[current_thread_id][0] & 0x80)
- // == 0)) { // check if pdu is format 0 or 1A
- // if (*format0_found == 0) {
- // dci_alloc[*dci_cnt].format = format0;
- // *format0_found = 1;
- // *dci_cnt = *dci_cnt + 1;
- // pdcch_vars[eNB_id]->nCCE[nr_slot_rx] = CCEind;
- // }
- // } else if (format_c == format0) { // this is a format 1A DCI
- // dci_alloc[*dci_cnt].format = format1A;
- // *dci_cnt = *dci_cnt + 1;
- // pdcch_vars[eNB_id]->nCCE[nr_slot_rx] = CCEind;
- // } else {
- // // store first nCCE of group for PUCCH transmission of ACK/NAK
- // if (*format_c_found == 0) {
- // dci_alloc[*dci_cnt].format = format_c;
- // *dci_cnt = *dci_cnt + 1;
- // *format_c_found = 1;
- // pdcch_vars[eNB_id]->nCCE[nr_slot_rx] = CCEind;
- // }
- // }
- // }
- //LOG_I(PHY,"DCI decoding CRNTI [format: %d, nCCE[nr_slot_rx: %d]: %d ], AggregationLevel %d \n",format_c, nr_slot_rx, pdcch_vars[eNB_id]->nCCE[nr_slot_rx],L2);
- // memcpy(&dci_alloc[*dci_cnt].dci_pdu[0],dci_decoded_output,sizeof_bytes);
- switch (1 << L) {
- case 1:
- *CCEmap |= (1 << (CCEind & 0x1f));
- break;
-
- case 2:
- *CCEmap |= (1 << (CCEind & 0x1f));
- break;
-
- case 4:
- *CCEmap |= (1 << (CCEind & 0x1f));
- break;
-
- case 8:
- *CCEmap |= (1 << (CCEind & 0x1f));
- break;
-
- case 16:
- *CCEmap |= (1 << (CCEind & 0x1f));
- break;
- }
-
-#ifdef DEBUG_DCI_DECODING
- LOG_I(PHY,"[DCI search] Found DCI %d rnti %x Aggregation %d length %d format %d in CCE %d (CCEmap %x) candidate %d / %d \n",
- *dci_cnt,crc,1<pdcch_vars[ue->current_thread_id[nr_slot_rx]];
- NR_UE_PDCCH *pdcch_vars2 = ue->pdcch_vars[ue->current_thread_id[nr_slot_rx]][eNB_id];
- uint16_t pdcch_DMRS_scrambling_id = pdcch_vars2->coreset[p].pdcchDMRSScramblingID;
- uint64_t coreset_freq_dom = pdcch_vars2->coreset[p].frequencyDomainResources;
- int coreset_time_dur = pdcch_vars2->coreset[p].duration;
- uint16_t coreset_nbr_rb=0;
-
- for (int i = 0; i < 45; i++) {
- // this loop counts each bit of the bit map coreset_freq_dom, and increments nbr_RB_coreset for each bit set to '1'
- if (((coreset_freq_dom & 0x1FFFFFFFFFFF) >> i) & 0x1) coreset_nbr_rb++;
- }
-
- coreset_nbr_rb = 6 * coreset_nbr_rb;
- // coreset_time_dur,coreset_nbr_rb,
- NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
- //uint8_t mi;// = get_mi(&ue->frame_parms, nr_slot_rx);
- //uint8_t tmode = ue->transmission_mode[eNB_id];
- //uint8_t frame_type = frame_parms->frame_type;
- uint8_t format_0_0_1_0_size_bits = 0, format_0_0_1_0_size_bytes = 0; //FIXME
- uint8_t format_0_1_1_1_size_bits = 0, format_0_1_1_1_size_bytes = 0; //FIXME
- uint8_t format_2_0_size_bits = 0, format_2_0_size_bytes = 0; //FIXME
- uint8_t format_2_1_size_bits = 0, format_2_1_size_bytes = 0; //FIXME
- uint8_t format_2_2_size_bits = 0, format_2_2_size_bytes = 0; //FIXME
- uint8_t format_2_3_size_bits = 0, format_2_3_size_bytes = 0; //FIXME
- /*
- *
- * The implementation of this function will depend on the information given by the searchSpace IE
- *
- * In LTE the UE has no knowledge about:
- * - the type of search (common or ue-specific)
- * - the DCI format it is going to be decoded when performing the PDCCH monitoring
- * So the blind decoding has to be done for common and ue-specific searchSpaces for each aggregation level and for each dci format
- *
- * In NR the UE has a knowledge about the search Space type and the DCI format it is going to be decoded,
- * so in the blind decoding we can call the function nr_dci_decoding_procedure0 with the searchSpace type and the dci format parameter
- * We will call this function as many times as aggregation levels indicated in searchSpace
- * Implementation according to 38.213 v15.1.0 Section 10.
- *
- */
- NR_UE_SEARCHSPACE_CSS_DCI_FORMAT_t css_dci_format = pdcch_vars2->searchSpace[s].searchSpaceType.common_dci_formats; //FIXME!!!
- NR_UE_SEARCHSPACE_USS_DCI_FORMAT_t uss_dci_format = pdcch_vars2->searchSpace[s].searchSpaceType.ue_specific_dci_formats; //FIXME!!!
- // The following initialization is only for test purposes. To be removed
- // NR_UE_SEARCHSPACE_CSS_DCI_FORMAT_t
- css_dci_format = cformat0_0_and_1_0;
- //NR_UE_SEARCHSPACE_USS_DCI_FORMAT_t
- uss_dci_format = uformat0_0_and_1_0;
- /*
- * Possible overlap between RE for SS/PBCH blocks (described in section 10, 38.213) has not been implemented yet
- * This can be implemented by setting variable 'mode = NO_DCI' when overlap occurs
- */
- //dci_detect_mode_t mode = 3; //dci_detect_mode_select(&ue->frame_parms, nr_slot_rx);
- LOG_DD("searSpaceType=%d\n",do_common);
- LOG_DD("%s_dci_format=%d\n",do_common?"uss":"css",css_dci_format);
-
-
- // A set of PDCCH candidates for a UE to monitor is defined in terms of PDCCH search spaces
- if (do_common==0) { // COMMON SearchSpaceType assigned to current SearchSpace/CORESET
- // Type0-PDCCH common search space for a DCI format with CRC scrambled by a SI-RNTI
- // number of consecutive resource blocks and a number of consecutive symbols for
- // the control resource set of the Type0-PDCCH common search space from
- // the four most significant bits of RMSI-PDCCH-Config as described in Tables 13-1 through 13-10
- // and determines PDCCH monitoring occasions
- // from the four least significant bits of RMSI-PDCCH-Config,
- // included in MasterInformationBlock, as described in Tables 13-11 through 13-15
- // Type0A-PDCCH common search space for a DCI format with CRC scrambled by a SI-RNTI
- // Type1-PDCCH common search space for a DCI format with CRC scrambled by a RA-RNTI, or a TC-RNTI, or a C-RNTI
- // Type2-PDCCH common search space for a DCI format with CRC scrambled by a P-RNTI
- if (css_dci_format == cformat0_0_and_1_0) {
- // 38.213 v15.1.0 Table 10.1-1: CCE aggregation levels and maximum number of PDCCH candidates per CCE
- // aggregation level for Type0/Type0A/Type2-PDCCH common search space
- // CCE Aggregation Level Number of Candidates
- // 4 4
- // 8 2
- // 16 1
- // FIXME
- // We shall consider Table 10.1-1 to calculate the blind decoding only for Type0/Type0A/Type2-PDCCH
- // Shall we consider the nrofCandidates in SearSpace IE that considers Aggregation Levels 1,2,4,8,16? Our implementation considers Table 10.1-1
- // blind decoding (Type0-PDCCH,Type0A-PDCCH,Type1-PDCCH,Type2-PDCCH)
- // for format0_0 => we are NOT implementing format0_0 for common search spaces. FIXME!
- // for format0_0 and format1_0, first we calculate dci pdu size
- format_0_0_1_0_size_bits = nr_dci_format_size(ue,eNB_id,nr_slot_rx,p,_c_rnti,n_RB_ULBWP,n_RB_DLBWP,dci_fields_sizes,0);
- format_0_0_1_0_size_bytes = (format_0_0_1_0_size_bits%8 == 0) ? (uint8_t)floor(format_0_0_1_0_size_bits/8) : (uint8_t)(floor(format_0_0_1_0_size_bits/8) + 1);
- LOG_DD("calculating dci format size for common searchSpaces with format css_dci_format=%d, format_0_0_1_0_size_bits=%d, format_0_0_1_0_size_bytes=%d\n",
- css_dci_format,format_0_0_1_0_size_bits,format_0_0_1_0_size_bytes);
-
- for (int aggregationLevel = 0; aggregationLevel<5 ; aggregationLevel++) { // We fix aggregationLevel to 3 for testing=> nbr of CCE=8
- //for (int aggregationLevel = 2; aggregationLevel<5 ; aggregationLevel++) {
- // for aggregation level aggregationLevel. The number of candidates (for L2= 2^aggregationLevel) will be calculated in function nr_dci_decoding_procedure0
- LOG_DD("common searchSpaces with format css_dci_format=%d and aggregation_level=%d\n",
- css_dci_format,(1<current_thread_id[nr_slot_rx], frame_parms,
- crc_scrambled_values, aggregationLevel,
- cformat0_0_and_1_0, uformat0_0_and_1_0,
- format_0_0_1_0_size_bits, format_0_0_1_0_size_bytes, &dci_cnt,
- &crc_scrambled_, &format_found_, pdcch_DMRS_scrambling_id,&CCEmap0, &CCEmap1, &CCEmap2);
-
- if (dci_cnt != old_dci_cnt) {
- // we will exit the loop as we have found the DCI
- aggregationLevel = 5;
- format_0_0_1_0_size_bits = nr_dci_format_size(ue,eNB_id,nr_slot_rx,p,crc_scrambled_,n_RB_ULBWP,n_RB_DLBWP,dci_fields_sizes,
- 0); // after decoding dci successfully we recalculate dci pdu size with correct crc scrambled to get the right field sizes
- old_dci_cnt = dci_cnt;
-
- for (int i=0; icurrent_thread_id[nr_slot_rx], frame_parms,
- crc_scrambled_values, aggregationLevelSFI,
- cformat2_0, uformat0_0_and_1_0,
- format_2_0_size_bits, format_2_0_size_bytes, &dci_cnt,
- &crc_scrambled_, &format_found_,pdcch_DMRS_scrambling_id, &CCEmap0, &CCEmap1, &CCEmap2);
-
- if (dci_cnt != old_dci_cnt) {
- // we will exit the loop as we have found the DCI
- aggregationLevelSFI = 5;
- old_dci_cnt = dci_cnt;
-
- for (int i=0; icurrent_thread_id[nr_slot_rx], frame_parms,
- crc_scrambled_values, aggregationLevel,
- cformat2_1, uformat0_0_and_1_0,
- format_2_1_size_bits, format_2_1_size_bytes, &dci_cnt,
- &crc_scrambled_, &format_found_,pdcch_DMRS_scrambling_id, &CCEmap0, &CCEmap1, &CCEmap2);
-
- if (dci_cnt != old_dci_cnt) {
- // we will exit the loop as we have found the DCI
- aggregationLevel = 5;
- old_dci_cnt = dci_cnt;
-
- for (int i=0; icurrent_thread_id[nr_slot_rx], frame_parms,
- crc_scrambled_values, aggregationLevel,
- cformat2_2, uformat0_0_and_1_0,
- format_2_2_size_bits, format_2_2_size_bytes, &dci_cnt,
- &crc_scrambled_, &format_found_,pdcch_DMRS_scrambling_id, &CCEmap0, &CCEmap1, &CCEmap2);
-
- if (dci_cnt != old_dci_cnt) {
- // we will exit the loop as we have found the DCI
- aggregationLevel = 5;
- old_dci_cnt = dci_cnt;
-
- for (int i=0; icurrent_thread_id[nr_slot_rx], frame_parms,
- crc_scrambled_values, aggregationLevel,
- cformat2_3, uformat0_0_and_1_0,
- format_2_3_size_bits, format_2_3_size_bytes, &dci_cnt,
- &crc_scrambled_, &format_found_,pdcch_DMRS_scrambling_id, &CCEmap0, &CCEmap1, &CCEmap2);
-
- if (dci_cnt != old_dci_cnt) {
- // we will exit the loop as we have found the DCI
- aggregationLevel = 5;
- old_dci_cnt = dci_cnt;
-
- for (int i=0; i nbr of CCE=8
- //for (int aggregationLevel = 2; aggregationLevel<5 ; aggregationLevel++) {
- // for aggregation level aggregationLevel. The number of candidates (for L2= 2^aggregationLevel) will be calculated in function nr_dci_decoding_procedure0
- LOG_DD("common searchSpaces with format css_dci_format=%d and aggregation_level=%d\n",
- css_dci_format,(1<current_thread_id[nr_slot_rx], frame_parms,
- crc_scrambled_values, aggregationLevel,
- cformat0_0_and_1_0, uformat0_0_and_1_0,
- format_0_0_1_0_size_bits, format_0_0_1_0_size_bytes, &dci_cnt,
- &crc_scrambled_, &format_found_,pdcch_DMRS_scrambling_id, &CCEmap0, &CCEmap1, &CCEmap2);
-
- if (dci_cnt != old_dci_cnt) {
- // we will exit the loop as we have found the DCI
- aggregationLevel = 5;
- old_dci_cnt = dci_cnt;
-
- for (int i=0; i nbr of CCE=8
- //for (int aggregationLevel = 2; aggregationLevel<5 ; aggregationLevel++) {
- // for aggregation level aggregationLevel. The number of candidates (for L2= 2^aggregationLevel) will be calculated in function nr_dci_decoding_procedure0
- LOG_DD("common searchSpaces with format css_dci_format=%d and aggregation_level=%d\n",
- css_dci_format,(1<current_thread_id[nr_slot_rx], frame_parms,
- crc_scrambled_values, aggregationLevel,
- cformat0_0_and_1_0, uformat0_1_and_1_1,
- format_0_1_1_1_size_bits, format_0_1_1_1_size_bytes, &dci_cnt,
- &crc_scrambled_, &format_found_,pdcch_DMRS_scrambling_id, &CCEmap0, &CCEmap1, &CCEmap2);
-
- if (dci_cnt != old_dci_cnt) {
- // we will exit the loop as we have found the DCI
- aggregationLevel = 5;
- old_dci_cnt = dci_cnt;
-
- for (int i=0; i
-#endif
-
-
#define MAX_DCI_SIZE_BITS 45
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
index 509e42d663..975d7077a0 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
@@ -497,6 +497,8 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
}
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_LDPC, VCD_FUNCTION_IN);
+ p_decParams->block_length=length_dec;
+ nrLDPC_initcall(p_decParams, (int8_t*)&pl[0], llrProcBuf);
no_iteration_ldpc = nrLDPC_decoder(p_decParams,
(int8_t *)&pl[0],
llrProcBuf,
@@ -956,7 +958,8 @@ uint32_t nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
for (i=0, j=0; j < ((kc*harq_process->Z)>>4)+1; i+=2, j++) {
pl[j] = _mm_packs_epi16(pv[i],pv[i+1]);
}
-
+ p_decParams->block_length=length_dec;
+ nrLDPC_initcall(p_decParams, (int8_t*)&pl[0], llrProcBuf);
no_iteration_ldpc = nrLDPC_decoder(p_decParams,
(int8_t *)&pl[0],
llrProcBuf,
@@ -1340,7 +1343,8 @@ void nr_dlsch_decoding_process(void *arg) {
for (i=0, j=0; j < ((kc*harq_process->Z)>>4)+1; i+=2, j++) {
pl[j] = _mm_packs_epi16(pv[i],pv[i+1]);
}
-
+ p_decParams->block_length=length_dec;
+ nrLDPC_initcall(p_decParams, (int8_t*)&pl[0], llrProcBuf);
no_iteration_ldpc = nrLDPC_decoder(p_decParams,
(int8_t *)&pl[0],
llrProcBuf,
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
index 618e5680e8..0894ae9166 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
@@ -43,12 +43,6 @@
#include "PHY/NR_REFSIG/dmrs_nr.h"
#include "common/utils/nr/nr_common.h"
-#ifndef USER_MODE
-#define NOCYGWIN_STATIC static
-#else
-#define NOCYGWIN_STATIC
-#endif
-
/* dynamic shift for LLR computation for TM3/4
* set as command line argument, see lte-softmodem.c
* default value: 0
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c b/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c
index 6b8014b5ce..767edf9cc6 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c
@@ -38,6 +38,7 @@
#include "PHY/NR_UE_ESTIMATION/nr_estimation.h"
#include "SCHED_NR_UE/defs.h"
#include "common/utils/LOG/vcd_signal_dumper.h"
+#include "common/utils/nr/nr_common.h"
#include "common_lib.h"
#include
@@ -484,9 +485,9 @@ int nr_initial_sync(UE_nr_rxtx_proc_t *proc,
for(int n_ss = 0; n_ssnb_search_space; n_ss++) {
uint8_t nb_symb_pdcch = pdcch_vars->pdcch_config[n_ss].coreset.duration;
+ int start_symb = pdcch_vars->pdcch_config[n_ss].coreset.StartSymbolIndex;
get_coreset_rballoc(pdcch_vars->pdcch_config[n_ss].coreset.frequency_domain_resource,&coreset_nb_rb,&coreset_start_rb);
-
- for (uint16_t l=0; lnr_of_symbols,pucch_pdu->start_symbol_index,pucch_pdu->prb_start,pucch_pdu->second_hop_prb,pucch_pdu->group_hop_flag,pucch_pdu->sequence_hop_flag,pucch_pdu->mcs);
-
+ LOG_D(PHY,"pucch0: slot %d nr_symbols %d, start_symbol %d, prb_start %d, second_hop_prb %d, group_hop_flag %d, sequence_hop_flag %d, mcs %d\n",
+ nr_slot_tx,pucch_pdu->nr_of_symbols,pucch_pdu->start_symbol_index,pucch_pdu->prb_start,pucch_pdu->second_hop_prb,pucch_pdu->group_hop_flag,pucch_pdu->sequence_hop_flag,pucch_pdu->mcs);
#ifdef DEBUG_NR_PUCCH_TX
printf("\t [nr_generate_pucch0] sequence generation: variable initialization for test\n");
diff --git a/openair1/PHY/TOOLS/lte_enb_scope.c b/openair1/PHY/TOOLS/lte_enb_scope.c
index 220df5b54a..bed507feee 100644
--- a/openair1/PHY/TOOLS/lte_enb_scope.c
+++ b/openair1/PHY/TOOLS/lte_enb_scope.c
@@ -69,18 +69,12 @@ void reset_stats(FL_OBJECT *button, long arg) {
static void *scope_thread_eNB(void *arg) {
-# ifdef ENABLE_XFORMS_WRITE_STATS
- FILE *eNB_stats;
-# endif
struct sched_param sched_param;
int UE_id, CC_id;
int ue_cnt=0;
sched_param.sched_priority = sched_get_priority_min(SCHED_FIFO)+1;
sched_setscheduler(0, SCHED_FIFO,&sched_param);
printf("Scope thread has priority %d\n",sched_param.sched_priority);
-# ifdef ENABLE_XFORMS_WRITE_STATS
- eNB_stats = fopen("eNB_stats.txt", "w");
-#endif
while (!oai_exit) {
ue_cnt=0;
@@ -99,16 +93,6 @@ static void *scope_thread_eNB(void *arg) {
usleep(100*1000);
}
- // printf("%s",stats_buffer);
-# ifdef ENABLE_XFORMS_WRITE_STATS
-
- if (eNB_stats) {
- rewind (eNB_stats);
- fwrite (stats_buffer, 1, len, eNB_stats);
- fclose (eNB_stats);
- }
-
-# endif
pthread_exit((void *)arg);
}
diff --git a/openair1/PHY/TOOLS/lte_ue_scope.c b/openair1/PHY/TOOLS/lte_ue_scope.c
index 20d88ebdab..00560f2d74 100644
--- a/openair1/PHY/TOOLS/lte_ue_scope.c
+++ b/openair1/PHY/TOOLS/lte_ue_scope.c
@@ -72,16 +72,10 @@ void reset_stats(FL_OBJECT *button, long arg) {
static void *scope_thread_UE(void *arg) {
char stats_buffer[16384];
-# ifdef ENABLE_XFORMS_WRITE_STATS
- FILE *UE_stats, *eNB_stats;
-# endif
struct sched_param sched_param;
sched_param.sched_priority = sched_get_priority_min(SCHED_FIFO)+1;
sched_setscheduler(0, SCHED_FIFO,&sched_param);
printf("Scope thread has priority %d\n",sched_param.sched_priority);
-# ifdef ENABLE_XFORMS_WRITE_STATS
- UE_stats = fopen("UE_stats.txt", "w");
-#endif
while (!oai_exit) {
// dump_ue_stats (PHY_vars_UE_g[0][0], &PHY_vars_UE_g[0][0]->proc.proc_rxtx[0],stats_buffer, 0, mode,rx_input_level_dBm);
@@ -94,16 +88,6 @@ static void *scope_thread_UE(void *arg) {
0,7);
// printf("%s",stats_buffer);
}
-
-# ifdef ENABLE_XFORMS_WRITE_STATS
-
- if (UE_stats) {
- rewind (UE_stats);
- fwrite (stats_buffer, 1, len, UE_stats);
- fclose (UE_stats);
- }
-
-# endif
pthread_exit((void *)arg);
}
diff --git a/openair1/PHY/TOOLS/nr_phy_scope.c b/openair1/PHY/TOOLS/nr_phy_scope.c
index fc1fa4c297..3440e4f28c 100644
--- a/openair1/PHY/TOOLS/nr_phy_scope.c
+++ b/openair1/PHY/TOOLS/nr_phy_scope.c
@@ -517,9 +517,6 @@ void phy_scope_gNB(OAI_phy_scope_t *form,
}
static void *scope_thread_gNB(void *arg) {
scopeData_t *p=(scopeData_t *) arg;
- //# ifdef ENABLE_XFORMS_WRITE_STATS
- // FILE *gNB_stats = fopen("gNB_stats.txt", "w");
- //#endif
size_t stksize=0;
pthread_attr_t atr;
pthread_attr_init(&atr);
diff --git a/openair1/PHY/defs_L1_NB_IoT.h b/openair1/PHY/defs_L1_NB_IoT.h
index cc3ec94a95..a4552c8c27 100644
--- a/openair1/PHY/defs_L1_NB_IoT.h
+++ b/openair1/PHY/defs_L1_NB_IoT.h
@@ -48,7 +48,6 @@
#ifdef MEX
#define msg mexPrintf
#else
- #ifdef OPENAIR2
#if ENABLE_RAL
#include "collection/hashtable/hashtable.h"
#include "COMMON/ral_messages_types.h"
@@ -56,9 +55,6 @@
#endif
#include "common/utils/LOG/log.h"
#define msg(aRGS...) LOG_D(PHY, ##aRGS)
- #else
- #define msg printf
- #endif
#endif
//use msg in the real-time thread context
#define msg_nrt printf
@@ -196,19 +192,6 @@ typedef struct {
NB_IoT_UE_DLSCH_t *dlsch_rn_MCH[10];
} PHY_VARS_RN_NB_IoT;
-/*
-#ifdef OCP_FRAMEWORK
-#include
-#else
-//typedef enum {normal_txrx=0,rx_calib_ue=1,rx_calib_ue_med=2,rx_calib_ue_byp=3,debug_prach=4,no_L2_connect=5,calib_prach_tx=6,rx_dump_frame=7,loop_through_memory=8} runmode_t;
-*/
-// enum transmission_access_mode {
-// NO_ACCESS=0,
-// POSTPONED_ACCESS,
-// CANCELED_ACCESS,
-// UNKNOWN_ACCESS,
-// SCHEDULED_ACCESS,
-// CBA_ACCESS};
typedef enum {
eNodeB_3GPP_NB_IoT=0, // classical eNodeB function
diff --git a/openair1/PHY/defs_UE.h b/openair1/PHY/defs_UE.h
index e17b752e7b..2d2697a4b7 100644
--- a/openair1/PHY/defs_UE.h
+++ b/openair1/PHY/defs_UE.h
@@ -87,7 +87,6 @@
#define LOG_W(x, ...) mexPrintf(__VA_ARGS__)
#define LOG_M(x, ...) mexPrintf(__VA_ARGS__)
#else
- #ifdef OPENAIR2
#if ENABLE_RAL
#include "collection/hashtable/hashtable.h"
#include "COMMON/ral_messages_types.h"
@@ -95,9 +94,6 @@
#endif
#include "common/utils/LOG/log.h"
#define msg(aRGS...) LOG_D(PHY, ##aRGS)
- #else
- #define msg printf
- #endif
#endif
diff --git a/openair1/PHY/defs_nr_UE.h b/openair1/PHY/defs_nr_UE.h
index 8ce18aa667..027e73ea4a 100644
--- a/openair1/PHY/defs_nr_UE.h
+++ b/openair1/PHY/defs_nr_UE.h
@@ -51,16 +51,12 @@
#ifdef MEX
#define msg mexPrintf
#else
- #ifdef OPENAIR2
#if ENABLE_RAL
#include "common/utils/hashtable/hashtable.h"
#include "COMMON/ral_messages_types.h"
#include "UTIL/queue.h"
#endif
#define msg(aRGS...) LOG_D(PHY, ##aRGS)
- #else
- #define msg printf
- #endif
#endif
//use msg in the real-time thread context
#define msg_nrt printf
@@ -638,7 +634,7 @@ typedef struct {
uint8_t dciFormat;
uint8_t agregationLevel;
int nb_search_space;
- fapi_nr_dl_config_dci_dl_pdu_rel15_t pdcch_config[FAPI_NR_MAX_SS_PER_CORESET];
+ fapi_nr_dl_config_dci_dl_pdu_rel15_t pdcch_config[FAPI_NR_MAX_SS];
// frame and slot for sib1 in initial sync
uint16_t sfn;
uint16_t slot;
@@ -921,9 +917,10 @@ typedef struct {
uint8_t init_sync_frame;
/// temporary offset during cell search prior to MIB decoding
int ssb_offset;
- uint16_t symbol_offset; // offset in terms of symbols for detected ssb in sync
- int rx_offset; /// Timing offset
+ uint16_t symbol_offset; /// offset in terms of symbols for detected ssb in sync
+ int rx_offset; /// Timing offset
int rx_offset_diff; /// Timing adjustment for ofdm symbol0 on HW USRP
+ int max_pos_fil; /// Timing offset IIR filter
int time_sync_cell;
/// Timing Advance updates variables
diff --git a/openair1/PHY/phy_extern.h b/openair1/PHY/phy_extern.h
index d5fea5aec6..1ce042d086 100644
--- a/openair1/PHY/phy_extern.h
+++ b/openair1/PHY/phy_extern.h
@@ -55,12 +55,6 @@ extern char mode_string[4][20];
extern unsigned char NB_RU;
-#ifndef OPENAIR2
-extern unsigned char NB_eNB_INST;
-extern uint16_t NB_UE_INST;
-extern unsigned char NB_RN_INST;
-#endif
-
extern int flag_LA;
extern double sinr_bler_map[MCS_COUNT][2][MCS_TABLE_LENGTH_MAX];
extern double sinr_bler_map_up[MCS_COUNT][2][16];
diff --git a/openair1/PHY/phy_extern_nr_ue.h b/openair1/PHY/phy_extern_nr_ue.h
index f1704a7902..66d554f245 100644
--- a/openair1/PHY/phy_extern_nr_ue.h
+++ b/openair1/PHY/phy_extern_nr_ue.h
@@ -63,12 +63,6 @@ extern char mode_string[4][20];
extern unsigned char NB_RU;
-#ifndef OPENAIR2
-extern unsigned char NB_eNB_INST;
-extern uint16_t NB_UE_INST;
-extern unsigned char NB_RN_INST;
-#endif
-
extern int flag_LA;
extern double sinr_bler_map[MCS_COUNT][2][MCS_TABLE_LENGTH_MAX];
extern double sinr_bler_map_up[MCS_COUNT][2][16];
diff --git a/openair1/PHY/phy_extern_ue.h b/openair1/PHY/phy_extern_ue.h
index 9f227806fd..cff03e375d 100644
--- a/openair1/PHY/phy_extern_ue.h
+++ b/openair1/PHY/phy_extern_ue.h
@@ -53,12 +53,6 @@ extern int flagMag;
extern char mode_string[4][20];
-#ifndef OPENAIR2
-extern unsigned char NB_eNB_INST;
-extern uint16_t NB_UE_INST;
-extern unsigned char NB_RN_INST;
-#endif
-
extern int flag_LA;
extern double sinr_bler_map[MCS_COUNT][2][MCS_TABLE_LENGTH_MAX];
extern double sinr_bler_map_up[MCS_COUNT][2][16];
diff --git a/openair1/PHY/phy_vars.h b/openair1/PHY/phy_vars.h
index 9edb7031b9..5879784827 100644
--- a/openair1/PHY/phy_vars.h
+++ b/openair1/PHY/phy_vars.h
@@ -55,13 +55,6 @@ const short conjugate2[8]__attribute__((aligned(16))) = {1,-1,1,-1,1,-1,1,-1};
unsigned char NB_RU=0;
-#ifndef OPENAIR2
-//unsigned char NB_eNB_INST=0;
-//uint16_t NB_UE_INST=0;
-//unsigned char NB_RN_INST=0;
-//unsigned char NB_INST=0;
-#endif
-
int number_of_cards;
diff --git a/openair1/PHY/phy_vars_nr_ue.h b/openair1/PHY/phy_vars_nr_ue.h
index baa64561f0..cfdfbeb49d 100644
--- a/openair1/PHY/phy_vars_nr_ue.h
+++ b/openair1/PHY/phy_vars_nr_ue.h
@@ -57,13 +57,6 @@ const short conjugate2[8]__attribute__((aligned(16))) = {1,-1,1,-1,1,-1,1,-1};
unsigned char NB_RU=0;
-#ifndef OPENAIR2
-unsigned char NB_eNB_INST=0;
-uint16_t NB_UE_INST=0;
-unsigned char NB_RN_INST=0;
-unsigned char NB_INST=0;
-#endif
-
int number_of_cards;
diff --git a/openair1/PHY/phy_vars_ue.h b/openair1/PHY/phy_vars_ue.h
index 469a5c4754..ca35ab6629 100644
--- a/openair1/PHY/phy_vars_ue.h
+++ b/openair1/PHY/phy_vars_ue.h
@@ -47,14 +47,6 @@ const short conjugate2[8]__attribute__((aligned(16))) = {1,-1,1,-1,1,-1,1,-1};
#include "SIMULATION/ETH_TRANSPORT/vars.h"
-#ifndef OPENAIR2
- unsigned char NB_eNB_INST=0;
- uint16_t NB_UE_INST=0;
- unsigned char NB_RN_INST=0;
- unsigned char NB_INST=0;
-#endif
-
-
int number_of_cards;
diff --git a/openair1/PHY/types_NB_IoT.h b/openair1/PHY/types_NB_IoT.h
index 6735092583..e41129169c 100644
--- a/openair1/PHY/types_NB_IoT.h
+++ b/openair1/PHY/types_NB_IoT.h
@@ -22,11 +22,6 @@
#ifndef __openair_TYPES_NB_IOT_H__
#define __openair_TYPES_NB_IOT_H__
-#ifdef USER_MODE
#include
-#else
-#include
-#endif
-
#endif /*__openair_TYPES_NB_IOT_H__ */
diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c
index 63cf6f2f2d..1685e206ae 100644
--- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c
+++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c
@@ -403,8 +403,6 @@ void nr_fill_indication(PHY_VARS_gNB *gNB, int frame, int slot_rx, int ULSCH_id,
pthread_mutex_lock(&gNB->UL_INFO_mutex);
- int timing_advance_update, cqi;
- int sync_pos;
NR_gNB_ULSCH_t *ulsch = gNB->ulsch[ULSCH_id][0];
NR_UL_gNB_HARQ_t *harq_process = ulsch->harq_processes[harq_pid];
NR_gNB_SCH_STATS_t *stats=get_ulsch_stats(gNB,ulsch);
@@ -412,19 +410,20 @@ void nr_fill_indication(PHY_VARS_gNB *gNB, int frame, int slot_rx, int ULSCH_id,
nfapi_nr_pusch_pdu_t *pusch_pdu = &harq_process->ulsch_pdu;
// pdu->data = gNB->ulsch[ULSCH_id+1][0]->harq_processes[harq_pid]->b;
- sync_pos = nr_est_timing_advance_pusch(gNB, ULSCH_id); // estimate timing advance for MAC
+ int sync_pos = nr_est_timing_advance_pusch(gNB, ULSCH_id); // estimate timing advance for MAC
// scale the 16 factor in N_TA calculation in 38.213 section 4.2 according to the used FFT size
uint16_t bw_scaling = 16 * gNB->frame_parms.ofdm_symbol_size / 2048;
- int sync_pos_rounded;
+
// do some integer rounding to improve TA accuracy
+ int sync_pos_rounded;
if (sync_pos > 0)
sync_pos_rounded = sync_pos + (bw_scaling / 2) - 1;
else
- sync_pos_rounded = sync_pos - (bw_scaling / 2) - 1;
+ sync_pos_rounded = sync_pos - (bw_scaling / 2) + 1;
if (stats) stats->sync_pos = sync_pos;
- timing_advance_update = sync_pos_rounded / bw_scaling;
+ int timing_advance_update = sync_pos_rounded / bw_scaling;
// put timing advance command in 0..63 range
timing_advance_update += 31;
@@ -449,6 +448,7 @@ void nr_fill_indication(PHY_VARS_gNB *gNB, int frame, int slot_rx, int ULSCH_id,
LOG_D(PHY, "Estimated SNR for PUSCH is = %f dB (ulsch_power %f, noise %f)\n", SNRtimes10/10.0,dB_fixed_x10(gNB->pusch_vars[ULSCH_id]->ulsch_power_tot)/10.0,dB_fixed_x10(gNB->pusch_vars[ULSCH_id]->ulsch_noise_power_tot)/10.0);
+ int cqi;
if (SNRtimes10 < -640) cqi=0;
else if (SNRtimes10 > 635) cqi=255;
else cqi=(640+SNRtimes10)/5;
diff --git a/openair1/SCHED_NR_UE/fapi_nr_ue_l1.h b/openair1/SCHED_NR_UE/fapi_nr_ue_l1.h
index 9b7b87a18c..f00ce14b56 100755
--- a/openair1/SCHED_NR_UE/fapi_nr_ue_l1.h
+++ b/openair1/SCHED_NR_UE/fapi_nr_ue_l1.h
@@ -44,4 +44,4 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response);
int8_t nr_ue_phy_config_request(nr_phy_config_t *phy_config);
-#endif
\ No newline at end of file
+#endif
diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
index 34fcec07b0..ea644dda05 100644
--- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
+++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
@@ -768,7 +768,8 @@ int nr_ue_pdsch_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, int gNB_
uint16_t s1 = dlsch0_harq->nb_symbols;
bool is_SI = dlsch0->rnti_type == _SI_RNTI_;
- LOG_D(PHY,"[UE %d] PDSCH type %d active in nr_slot_rx %d, harq_pid %d (%d), rb_start %d, nb_rb %d, symbol_start %d, nb_symbols %d, DMRS mask %x\n",ue->Mod_id,pdsch,nr_slot_rx,harq_pid,dlsch0_harq->status,pdsch_start_rb,pdsch_nb_rb,s0,s1,dlsch0_harq->dlDmrsSymbPos);
+ LOG_D(PHY,"[UE %d] PDSCH type %d active in nr_slot_rx %d, harq_pid %d (%d), rb_start %d, nb_rb %d, symbol_start %d, nb_symbols %d, DMRS mask %x\n",
+ ue->Mod_id,pdsch,nr_slot_rx,harq_pid,dlsch0_harq->status,pdsch_start_rb,pdsch_nb_rb,s0,s1,dlsch0_harq->dlDmrsSymbPos);
for (m = s0; m < (s0 +s1); m++) {
if (dlsch0_harq->dlDmrsSymbPos & (1 << m)) {
@@ -1707,8 +1708,8 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
for (uint16_t l=0; lfirst_carrier_offset, pdcch_vars->pdcch_config[n_ss].BWPStart, coreset_start_rb);
+ LOG_D(PHY, "pdcch_channel_estimation: first_carrier_offset %d, BWPStart %d, coreset_start_rb %d, coreset_nb_rb %d\n",
+ fp->first_carrier_offset, pdcch_vars->pdcch_config[n_ss].BWPStart, coreset_start_rb, coreset_nb_rb);
if (coreset_nb_rb > 0)
nr_pdcch_channel_estimation(ue,
diff --git a/openair1/SIMULATION/LTE_PHY/gpib_send.c b/openair1/SIMULATION/LTE_PHY/gpib_send.c
index a8ae48cdfa..06ce60da0f 100644
--- a/openair1/SIMULATION/LTE_PHY/gpib_send.c
+++ b/openair1/SIMULATION/LTE_PHY/gpib_send.c
@@ -19,10 +19,10 @@
* contact@openairinterface.org
*/
-#include
-#include
-#include
-#include"gpib_send.h"
+#include
+#include
+#include
+#include "gpib_send.h"
void gpib_send(unsigned int gpib_board, unsigned int gpib_device, char *command_string )
{
unsigned short addlist[2] = {gpib_device, NOADDR};
diff --git a/openair2/COMMON/mac_rrc_primitives.h b/openair2/COMMON/mac_rrc_primitives.h
index 5a45f2f196..d258bb872a 100644
--- a/openair2/COMMON/mac_rrc_primitives.h
+++ b/openair2/COMMON/mac_rrc_primitives.h
@@ -22,9 +22,7 @@
#ifndef __MAC_RRC_PRIMITIVES_H__
#define __MAC_RRC_PRIMITIVES_H__
-#ifndef OPENAIR2_IN
- #include "LAYER2/RLC/rlc.h"
-#endif
+#include "LAYER2/RLC/rlc.h"
#include "COMMON/platform_types.h"
#include "COMMON/platform_constants.h"
#include "openair2/RRC/LTE/rrc_defs.h"
@@ -306,8 +304,6 @@ typedef struct {
-#ifndef OPENAIR2_IN
-
typedef struct { //RRC_INTERFACE_FUNCTIONS
unsigned int Frame_index;
unsigned short UE_index[NB_MODULES_MAX][NB_SIG_CNX_UE];
@@ -375,10 +371,6 @@ typedef struct {
} MAC_RLC_XFACE;
-#endif
-
-
-
//#define IDLE 0
#define NEED_RADIO_CONFIG 3
#define RADIO_CONFIG_TX 2
diff --git a/openair2/COMMON/platform_constants.h b/openair2/COMMON/platform_constants.h
index c56a31711a..355f56f9c9 100644
--- a/openair2/COMMON/platform_constants.h
+++ b/openair2/COMMON/platform_constants.h
@@ -77,7 +77,7 @@
#else
#define MAX_MOBILES_PER_ENB 4
#define MAX_MOBILES_PER_ENB_NB_IoT 4
- #define MAX_MOBILES_PER_GNB 2//16
+ #define MAX_MOBILES_PER_GNB 4//16
#define MAX_eNB 2
#define MAX_gNB 2
#endif
diff --git a/openair2/COMMON/rrm_config_structs.h b/openair2/COMMON/rrm_config_structs.h
deleted file mode 100644
index 9d060d102d..0000000000
--- a/openair2/COMMON/rrm_config_structs.h
+++ /dev/null
@@ -1,195 +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
- */
-
-/*
- rrm_config_structs.h
- -------------------
- AUTHOR : Linus GASSER modified by Lionel GAUTHIER Raymond KNOPP
- COMPANY : EURECOM
- EMAIL : linus.gasser@epfl.ch
- EMAIL : lionel.gauthier@eurecom.fr
- EMAIL : raymond.knopp@eurecom.fr
-
-
-
- ***************************************************************************/
-#ifdef OLD_RRC_CELLULAR
-# ifndef __RRM_CONFIG_STRUCTS_H__
-# define __RRM_CONFIG_STRUCTS_H__
-
-# include "platform_types.h"
-# include "platform_constants.h"
-# include "rrm_constants.h"
-# include "rlc.h"
-
-typedef volatile struct {
- uint32_t e_r;
- int timer_poll;
- int timer_poll_prohibit;
- int timer_discard;
- int timer_poll_periodic;
- int timer_status_prohibit;
- int timer_status_periodic;
- int timer_rst;
- int timer_mrw;
- int missing_pdu_indicator;
- uint32_t pdu_size;
- // int in_sequence_delivery; // not implemented
- uint8_t max_rst;
- uint8_t max_dat;
- uint16_t poll_pdu;
- uint16_t poll_sdu;
- uint8_t poll_window;
- uint32_t tx_window_size;
- uint32_t rx_window_size;
- uint8_t max_mrw;
- uint8_t last_transmission_pdu_poll_trigger;
- uint8_t last_retransmission_pdu_poll_trigger;
- enum RLC_SDU_DISCARD_MODE sdu_discard_mode;
- uint32_t send_mrw;
-} AM;
-
-typedef volatile struct {
- uint32_t e_r;
- uint32_t timer_discard;
- uint32_t sdu_discard_mode;
- uint32_t segmentation_indication;
- uint32_t delivery_of_erroneous_sdu;
-} TM;
-
-typedef volatile struct {
- uint32_t e_r;
- uint32_t timer_discard;
- uint32_t sdu_discard_mode;
-} UM;
-
-typedef volatile struct {
- uint8_t logch_identity;
- uint8_t mac_logch_priority;
-} MAP_INFO;
-
-typedef volatile struct {
- uint32_t rlc_mode;
- AM am;
- TM tm;
- UM um;
-} RLC_INFO;
-
-typedef volatile struct {
- int header_compression_algorithm;
-} PDCP_INFO;
-
-
-
-
-typedef volatile struct {
- rb_type_t rb_type;
- RLC_INFO rlc_info;
- PDCP_INFO pdcp_info;
- uint16_t rb_id;
- // Added for OPENAIR MAC
- //LCHAN_DESC Lchan_desc;
-
-} RADIOBEARER;
-
-
-typedef volatile struct {
- int TIMER300;
- int TIMER302;
- int TIMER305;
- int TIMER307;
- int TIMER308;
- int TIMER312;
- int TIMER313;
- int TIMER314;
- int TIMER315;
-} L3TIMERS_;
-
-typedef volatile struct {
- int COUNTERN300;
- int COUNTERN302;
- int COUNTERN308;
- int COUNTERN312;
- int COUNTERN313;
-} L3COUNTERS_;
-
-
-typedef volatile struct {
- int MaxNumRemote;
- L3TIMERS_ Timers;
- L3COUNTERS_ Counters;
-} L3_;
-
-
-typedef volatile struct {
- uint8_t rrm_action; // ACTION_NULL,ADD,REMOVE,MODIFY
- uint8_t rrm_element; // rb,trch,cctrch
- uint8_t rrm_element_index; // rb/trch/cctrch index
-} RRM_COMMAND_MT;
-
-typedef volatile struct {
- uint8_t rrm_action; // ACTION_NULL,ADD,REMOVE,MODIFY
- uint8_t mobile;
- uint8_t rrm_element; // rb,trch,cctrch
- uint8_t rrm_element_index; // rb/trch/cctrch index
-} RRM_COMMAND_RG;
-
-
-typedef volatile struct {
- uint8_t nb_commands;
- RRM_COMMAND_RG rrm_commands[JRRM_MAX_COMMANDS_PER_TRANSACTION];
-
-
- RADIOBEARER bearer[MAX_RB_RG];
- L3_ L3;
-
-} RG_CONFIG;
-
-typedef volatile struct {
- uint8_t nb_commands;
- RRM_COMMAND_MT rrm_commands[JRRM_MAX_COMMANDS_PER_TRANSACTION];
-
- RADIOBEARER bearer[MAX_RB_MOBILE];
- L3_ L3;
-
-} MT_CONFIG;
-
-# ifdef NODE_RG
-typedef volatile struct {
- RG_CONFIG rg_config;
- MT_CONFIG mt_config[MAX_MOBILES_PER_RG];
-} RRM_VARS;
-
-# else
-/* NODE_RG */
-typedef volatile struct {
- MT_CONFIG mt_config[MAX_MANAGED_RG_PER_MOBILE];
-
-
-
-} RRM_VARS;
-# endif
-/* NODE_RG */
-//typedef MT_CONFIG MAIN_MOBILE ;
-//typedef RG_CONFIG MAIN_RADIO_GATEWAY;
-
-# endif
-#endif
diff --git a/openair2/GNB_APP/MACRLC_nr_paramdef.h b/openair2/GNB_APP/MACRLC_nr_paramdef.h
index 838a5db762..7858cd6c32 100644
--- a/openair2/GNB_APP/MACRLC_nr_paramdef.h
+++ b/openair2/GNB_APP/MACRLC_nr_paramdef.h
@@ -55,7 +55,7 @@
#define CONFIG_STRING_MACRLC_REMOTE_S_PORTC "remote_s_portc"
#define CONFIG_STRING_MACRLC_LOCAL_S_PORTD "local_s_portd"
#define CONFIG_STRING_MACRLC_REMOTE_S_PORTD "remote_s_portd"
-#define CONFIG_STRING_MACRLC_ULSCH_MAX_SLOTS_INACTIVITY "ulsch_max_slots_inactivity"
+#define CONFIG_STRING_MACRLC_ULSCH_MAX_FRAME_INACTIVITY "ulsch_max_frame_inactivity"
#define CONFIG_STRING_MACRLC_PUSCHTARGETSNRX10 "pusch_TargetSNRx10"
#define CONFIG_STRING_MACRLC_PUCCHTARGETSNRX10 "pucch_TargetSNRx10"
#define CONFIG_STRING_MACRLC_PUCCHFAILURETHRES "pucch_FailureThres"
@@ -83,7 +83,7 @@
{CONFIG_STRING_MACRLC_REMOTE_S_PORTC, NULL, 0, uptr:NULL, defintval:50020, TYPE_UINT, 0}, \
{CONFIG_STRING_MACRLC_LOCAL_S_PORTD, NULL, 0, uptr:NULL, defintval:50021, TYPE_UINT, 0}, \
{CONFIG_STRING_MACRLC_REMOTE_S_PORTD, NULL, 0, uptr:NULL, defintval:50021, TYPE_UINT, 0}, \
-{CONFIG_STRING_MACRLC_ULSCH_MAX_SLOTS_INACTIVITY, "Maximum number of slots before a UE is scheduled ULSCH due to inactivity", 0, uptr:NULL, defintval:200, TYPE_UINT, 0}, \
+{CONFIG_STRING_MACRLC_ULSCH_MAX_FRAME_INACTIVITY, NULL, 0, uptr:NULL, defintval:10, TYPE_UINT, 0}, \
{CONFIG_STRING_MACRLC_PUSCHTARGETSNRX10, NULL, 0, iptr:NULL, defintval:200, TYPE_INT, 0}, \
{CONFIG_STRING_MACRLC_PUCCHTARGETSNRX10, NULL, 0, iptr:NULL, defintval:150, TYPE_INT, 0}, \
{CONFIG_STRING_MACRLC_PUCCHFAILURETHRES, NULL, 0, iptr:NULL, defintval:10, TYPE_INT, 0}, \
@@ -106,7 +106,7 @@
#define MACRLC_REMOTE_S_PORTC_IDX 14
#define MACRLC_LOCAL_S_PORTD_IDX 15
#define MACRLC_REMOTE_S_PORTD_IDX 16
-#define MACRLC_ULSCH_MAX_SLOTS_INACTIVITY 17
+#define MACRLC_ULSCH_MAX_FRAME_INACTIVITY 17
#define MACRLC_PUSCHTARGETSNRX10_IDX 18
#define MACRLC_PUCCHTARGETSNRX10_IDX 19
#define MACRLC_PUCCHFAILURETHRES_IDX 20
diff --git a/openair2/GNB_APP/gnb_config.c b/openair2/GNB_APP/gnb_config.c
index af21fd8b08..7c81a5ef49 100644
--- a/openair2/GNB_APP/gnb_config.c
+++ b/openair2/GNB_APP/gnb_config.c
@@ -754,7 +754,7 @@ void RCconfig_nr_macrlc() {
}else { // other midhaul
AssertFatal(1==0,"MACRLC %d: %s unknown southbound midhaul\n",j,*(MacRLC_ParamList.paramarray[j][MACRLC_TRANSPORT_S_PREFERENCE_IDX].strptr));
}
- RC.nrmac[j]->ulsch_max_slots_inactivity = *(MacRLC_ParamList.paramarray[j][MACRLC_ULSCH_MAX_SLOTS_INACTIVITY].uptr);
+ RC.nrmac[j]->ulsch_max_frame_inactivity = *(MacRLC_ParamList.paramarray[j][MACRLC_ULSCH_MAX_FRAME_INACTIVITY].uptr);
RC.nrmac[j]->num_ulprbbl = num_prbbl;
LOG_I(NR_MAC,"Blacklisted PRBS %d\n",num_prbbl);
memcpy(RC.nrmac[j]->ulprbbl,prbbl,275*sizeof(prbbl[0]));
diff --git a/openair2/GNB_APP/gnb_config.h b/openair2/GNB_APP/gnb_config.h
index 46102e4488..013997f439 100644
--- a/openair2/GNB_APP/gnb_config.h
+++ b/openair2/GNB_APP/gnb_config.h
@@ -42,10 +42,7 @@
#include "ngap_messages_types.h"
#include "f1ap_messages_types.h"
-#ifdef CMAKER
#include "rrc_messages_types.h"
-#endif
-
#include "intertask_interface.h"
#include "RRC/NR/nr_rrc_defs.h"
diff --git a/openair2/LAYER2/MAC/defs_NB_IoT.h b/openair2/LAYER2/MAC/defs_NB_IoT.h
index 78524e104d..d4945f0182 100644
--- a/openair2/LAYER2/MAC/defs_NB_IoT.h
+++ b/openair2/LAYER2/MAC/defs_NB_IoT.h
@@ -9,11 +9,9 @@
*/
#ifndef __LAYER2_MAC_DEFS_NB_IOT_H__
#define __LAYER2_MAC_DEFS_NB_IOT_H__
-#ifdef USER_MODE
#include
#include
#include
-#endif
//#include "COMMON/openair_defs.h"
#include "COMMON/platform_constants.h"
#include "COMMON/mac_rrc_primitives.h"
diff --git a/openair2/LAYER2/MAC/mac_vars.h b/openair2/LAYER2/MAC/mac_vars.h
index bd25bd6047..3b51820171 100644
--- a/openair2/LAYER2/MAC/mac_vars.h
+++ b/openair2/LAYER2/MAC/mac_vars.h
@@ -105,13 +105,11 @@ eNB_ULSCH_INFO eNB_ulsch_info[NUMBER_OF_eNB_MAX][MAX_NUM_CCs][MAX_MOBILES_PER_EN
eNB_DLSCH_INFO eNB_dlsch_info[NUMBER_OF_eNB_MAX][MAX_NUM_CCs][MAX_MOBILES_PER_ENB]; // eNBxUE = 8x8
-#ifdef OPENAIR2
unsigned char NB_eNB_INST = 0;
uint16_t NB_UE_INST = 0;
uint16_t NB_THREAD_INST = 0;
unsigned char NB_RN_INST = 0;
unsigned char NB_INST = 0;
-#endif
DCI0_5MHz_TDD_1_6_t UL_alloc_pdu;
diff --git a/openair2/LAYER2/MAC/ue_procedures.c b/openair2/LAYER2/MAC/ue_procedures.c
index 9ae8f82a00..21d349ea52 100644
--- a/openair2/LAYER2/MAC/ue_procedures.c
+++ b/openair2/LAYER2/MAC/ue_procedures.c
@@ -77,13 +77,6 @@ static int mbms_mch_i=0;
//static int num_msi_per_CSA[28];
-/*
- *
-#ifndef USER_MODE
-#define msg debug_msg
-#endif
- */
-
mapping BSR_names[] = {
{"NONE", 0},
{"SHORT BSR", 1},
@@ -1251,65 +1244,6 @@ int ue_query_mch_fembms(module_id_t module_idP, uint8_t CC_id, uint32_t frameP,
}
-
-
-#ifdef OLD
- // Acount for sf_allocable in CSA
- int num_sf_alloc = 0;
-
- for (l = 0; l < 8; l++) {
- if (UE_mac_inst[module_idP].commonSF_Alloc_r9_mbsfn_SubframeConfig[l] == NULL)
- continue;
-
- if (UE_mac_inst[module_idP].commonSF_Alloc_r9_mbsfn_SubframeConfig[l]->subframeAllocation.present != LTE_MBSFN_SubframeConfig__subframeAllocation_PR_oneFrame)
- continue;
-
- uint32_t common_mbsfn_SubframeConfig = UE_mac_inst[module_idP].commonSF_Alloc_r9_mbsfn_SubframeConfig[l]->subframeAllocation.choice.oneFrame.buf[0];
-
-
- for (j = 0; j < 6; j++)
- num_sf_alloc += ((common_mbsfn_SubframeConfig & (0x80 >> j)) == (0x80 >> j));
- //num_sf_alloc=1;
- }
-
- num_sf_alloc = 10;
-
- num_non_mbsfn_SubframeConfig = (UE_mac_inst[module_idP].non_mbsfn_SubframeConfig->subframeAllocation_r14.buf[0]<<1 | UE_mac_inst[module_idP].non_mbsfn_SubframeConfig->subframeAllocation_r14.buf[0]>>7);
- int ones=0;
- for(j=0; j < 16; j++){
- if(num_non_mbsfn_SubframeConfig & 1)
- ones++;
- num_non_mbsfn_SubframeConfig>>=1;
- }
-
- for (l = 0; l < 28; l++) {
- if (UE_mac_inst[module_idP].pmch_stop_mtch[l] >= 1/*num_sf_alloc*/) {
- if (UE_mac_inst[module_idP].pmch_stop_mtch[l] != 2047) {
- if (UE_mac_inst[module_idP].pmch_Config[UE_mac_inst[module_idP].msi_pmch] != NULL){
- mtch_mcs = UE_mac_inst[module_idP].pmch_Config[UE_mac_inst[module_idP].msi_pmch]->dataMCS_r9;
- //int common_mbsfn_alloc_offset = UE_mac_inst[module_idP].commonSF_Alloc_r9_mbsfn_SubframeConfig[0]->radioframeAllocationOffset;
- long common_mbsfn_period = 1 << UE_mac_inst[module_idP].commonSF_Alloc_r9_mbsfn_SubframeConfig[0]->radioframeAllocationPeriod;
- long commonSF_AllocPeriod = 4 << UE_mac_inst[module_idP].commonSF_AllocPeriod_r9;
- if(UE_mac_inst[module_idP].common_num_sf_alloc >= UE_mac_inst[module_idP].pmch_stop_mtch[l]){
- //LOG_E(MAC,"Attemp to UE_mac_inst[module_idP].common_num_sf_alloc %d\n",UE_mac_inst[module_idP].common_num_sf_alloc);
-
- mtch_mcs = -1;
- }/*else
- OG_W(MAC,"Attemp to UE_mac_inst[module_idP].common_num_sf_alloc %d\n",UE_mac_inst[module_idP].common_num_sf_alloc);*/
- LOG_D(MAC,"Attemp to UE_mac_inst[module_idP].common_num_sf_alloc %d num_sf_alloc %d commonSF_AllocPeriod %ld, common_mbsfn_period %ld num_non_mbsfn_SubframeConfig %x ones %d\n",UE_mac_inst[module_idP].common_num_sf_alloc,num_sf_alloc, commonSF_AllocPeriod,common_mbsfn_period,num_non_mbsfn_SubframeConfig,ones);
- UE_mac_inst[module_idP].common_num_sf_alloc++;
- UE_mac_inst[module_idP].common_num_sf_alloc = UE_mac_inst[module_idP].common_num_sf_alloc % (num_sf_alloc * commonSF_AllocPeriod / common_mbsfn_period-(1+ones)*(commonSF_AllocPeriod/4)); //TODO
- }
- else
- mtch_mcs = -1;
-
- mch_lcid = (uint8_t)l;
- break;
- }
- }
- }
-#endif
-
{
// Acount for sf_allocable in Common SF Allocation
int num_sf_alloc = 0;
@@ -1869,49 +1803,7 @@ int ue_query_mch(module_id_t module_idP, uint8_t CC_id, uint32_t frameP, uint32_
//}
}
-#ifdef OLD
- // Acount for sf_allocable in CSA
- int num_sf_alloc = 0;
- for (l = 0; l < 8; l++) {
- if (UE_mac_inst[module_idP].commonSF_Alloc_r9_mbsfn_SubframeConfig[l] == NULL)
- continue;
-
- if (UE_mac_inst[module_idP].commonSF_Alloc_r9_mbsfn_SubframeConfig[l]->subframeAllocation.present != LTE_MBSFN_SubframeConfig__subframeAllocation_PR_oneFrame)
- continue;
-
- uint32_t common_mbsfn_SubframeConfig = UE_mac_inst[module_idP].commonSF_Alloc_r9_mbsfn_SubframeConfig[l]->subframeAllocation.choice.oneFrame.buf[0];
-
- for (j = 0; j < 6; j++)
- num_sf_alloc += ((common_mbsfn_SubframeConfig & (0x80 >> j)) == (0x80 >> j));
- //num_sf_alloc=1;
- }
-
- for (l = 0; l < 28; l++) {
- if (UE_mac_inst[module_idP].pmch_stop_mtch[l] >= 1/*num_sf_alloc*/) {
- if (UE_mac_inst[module_idP].pmch_stop_mtch[l] != 2047) {
- if (UE_mac_inst[module_idP].pmch_Config[UE_mac_inst[module_idP].msi_pmch] != NULL){
- mtch_mcs = UE_mac_inst[module_idP].pmch_Config[UE_mac_inst[module_idP].msi_pmch]->dataMCS_r9;
- long common_mbsfn_period = 1 << UE_mac_inst[module_idP].commonSF_Alloc_r9_mbsfn_SubframeConfig[0]->radioframeAllocationPeriod;
- long commonSF_AllocPeriod = 4 << UE_mac_inst[module_idP].commonSF_AllocPeriod_r9;
- if(UE_mac_inst[module_idP].common_num_sf_alloc >= UE_mac_inst[module_idP].pmch_stop_mtch[l]){
- //LOG_E(MAC,"Attemp to UE_mac_inst[module_idP].common_num_sf_alloc %d\n",UE_mac_inst[module_idP].common_num_sf_alloc);
-
- mtch_mcs = -1;
- }/*else
- LOG_W(MAC,"Attemp to UE_mac_inst[module_idP].common_num_sf_alloc %d\n",UE_mac_inst[module_idP].common_num_sf_alloc);*/
- UE_mac_inst[module_idP].common_num_sf_alloc++;
- UE_mac_inst[module_idP].common_num_sf_alloc = UE_mac_inst[module_idP].common_num_sf_alloc % (num_sf_alloc * commonSF_AllocPeriod / common_mbsfn_period);
- }
- else
- mtch_mcs = -1;
-
- mch_lcid = (uint8_t)l;
- break;
- }
- }
- }
-#endif
{
// Acount for sf_allocable in Common SF Allocation
diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac.h b/openair2/LAYER2/NR_MAC_COMMON/nr_mac.h
index 09fb08d7c4..4ef0a55c6b 100644
--- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac.h
+++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac.h
@@ -40,6 +40,9 @@
#include "NR_SubcarrierSpacing.h"
+#define NR_SHORT_BSR_TABLE_SIZE 32
+#define NR_LONG_BSR_TABLE_SIZE 256
+
#define TABLE_38213_13_1_NUM_INDEXES 15
#define TABLE_38213_13_2_NUM_INDEXES 14
#define TABLE_38213_13_3_NUM_INDEXES 9
@@ -65,6 +68,11 @@ typedef enum frequency_range_e {
FR2
} frequency_range_t;
+#define NR_BSR_TRIGGER_NONE (0) /* No BSR Trigger */
+#define NR_BSR_TRIGGER_REGULAR (1) /* For Regular and ReTxBSR Expiry Triggers */
+#define NR_BSR_TRIGGER_PERIODIC (2) /* For BSR Periodic Timer Expiry Trigger */
+#define NR_BSR_TRIGGER_PADDING (4) /* For Padding BSR Trigger */
+
// For both DL/UL-SCH
// Except:
// - UL/DL-SCH: fixed-size MAC CE(known by LCID)
diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c
index 25dd8b0970..3f4be9dd58 100644
--- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c
+++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c
@@ -48,6 +48,33 @@ void reverse_n_bits(uint8_t *value, uint16_t bitlen) {
}
}
+//38.321 Table 6.1.3.1-1
+const uint32_t NR_SHORT_BSR_TABLE[NR_SHORT_BSR_TABLE_SIZE] = {
+ 0, 10, 14, 20, 28, 38, 53, 74,
+ 102, 142, 198, 276, 384, 535, 745, 1038,
+ 1446, 2014, 2806, 3909, 5446, 7587, 10570, 14726,
+20516, 28581, 39818, 55474, 77284, 107669, 150000, 300000
+};
+
+//38.321 Table 6.1.3.1-2
+const uint32_t NR_LONG_BSR_TABLE[NR_LONG_BSR_TABLE_SIZE] ={
+ 0, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 23, 25, 26,
+ 28, 30, 32, 34, 36, 38, 40, 43, 46, 49, 52, 55, 59, 62, 66, 71,
+ 75, 80, 85, 91, 97, 103, 110, 117, 124, 132, 141, 150, 160, 170, 181, 193,
+ 205, 218, 233, 248, 264, 281, 299, 318, 339, 361, 384, 409, 436, 464, 494, 526,
+ 560, 597, 635, 677, 720, 767, 817, 870, 926, 987, 1051, 1119, 1191, 1269, 1351, 1439,
+ 1532, 1631, 1737, 1850, 1970, 2098, 2234, 2379, 2533, 2698, 2873, 3059, 3258, 3469, 3694, 3934,
+ 4189, 4461, 4751, 5059, 5387, 5737, 6109, 6506, 6928, 7378, 7857, 8367, 8910, 9488, 10104, 10760,
+ 11458, 12202, 12994, 13838, 14736, 15692, 16711, 17795, 18951, 20181, 21491, 22885, 24371, 25953, 27638, 29431,
+ 31342, 33376, 35543, 37850, 40307, 42923, 45709, 48676, 51836, 55200, 58784, 62599, 66663, 70990, 75598, 80505,
+ 85730, 91295, 97221, 103532, 110252, 117409, 125030, 133146, 141789, 150992, 160793, 171231, 182345, 194182, 206786, 220209,
+ 234503, 249725, 265935, 283197, 301579, 321155, 342002, 364202, 387842, 413018, 439827, 468377, 498780, 531156, 565634, 602350,
+ 641449, 683087, 727427, 774645, 824928, 878475, 935498, 996222, 1060888, 1129752, 1203085, 1281179, 1364342, 1452903, 1547213, 1647644,
+ 1754595, 1868488, 1989774, 2118933, 2256475, 2402946, 2558924, 2725027, 2901912, 3090279, 3290873, 3504487, 3731968, 3974215, 4232186, 4506902,
+ 4799451, 5110989, 5442750, 5796046, 6172275, 6572925, 6999582, 7453933, 7937777, 8453028, 9001725, 9586039, 10208280, 10870913, 11576557, 12328006,
+13128233, 13980403, 14887889, 15854280, 16883401, 17979324, 19146385, 20389201, 21712690, 23122088, 24622972, 26221280, 27923336, 29735875, 31666069, 33721553,
+35910462, 38241455, 40723756, 43367187, 46182206, 49179951, 52372284, 55771835, 59392055, 63247269, 67352729, 71724679, 76380419, 81338368, 162676736, 4294967295
+};
// start symbols for SSB types A,B,C,D,E
uint16_t symbol_ssb_AC[8]={2,8,16,22,30,36,44,50};
diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_extern.h b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_extern.h
index 5b4ebe2397..5def748d42 100644
--- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_extern.h
+++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_extern.h
@@ -76,6 +76,9 @@ extern boolean_t pre_scd_activeUE[NUMBER_OF_UE_MAX];
extern eNB_UE_STATS pre_scd_eNB_UE_stats[MAX_NUM_CCs][NUMBER_OF_UE_MAX];
#endif*/
+extern const uint32_t NR_SHORT_BSR_TABLE[NR_SHORT_BSR_TABLE_SIZE];
+extern const uint32_t NR_LONG_BSR_TABLE[NR_LONG_BSR_TABLE_SIZE];
+
// Type0-PDCCH search space
extern const int32_t table_38213_13_1_c1[16];
extern const int32_t table_38213_13_1_c2[16];
diff --git a/openair2/LAYER2/NR_MAC_UE/config_ue.c b/openair2/LAYER2/NR_MAC_UE/config_ue.c
old mode 100755
new mode 100644
index 1accbf30cb..4408a96eef
--- a/openair2/LAYER2/NR_MAC_UE/config_ue.c
+++ b/openair2/LAYER2/NR_MAC_UE/config_ue.c
@@ -573,7 +573,7 @@ void config_control_ue(NR_UE_MAC_INST_t *mac){
struct NR_PDCCH_Config__searchSpacesToAddModList *searchSpacesToAddModList = pdcch_Config->choice.setup->searchSpacesToAddModList;
AssertFatal(searchSpacesToAddModList != NULL, "searchSpacesToAddModList is null\n");
AssertFatal(searchSpacesToAddModList->list.count > 0, "list of UE specifically configured Search Spaces is empty\n");
- AssertFatal(searchSpacesToAddModList->list.count < FAPI_NR_MAX_SS_PER_CORESET, "too many searchpaces per coreset %d\n", searchSpacesToAddModList->list.count);
+ AssertFatal(searchSpacesToAddModList->list.count < FAPI_NR_MAX_SS, "too many searchpaces per coreset %d\n", searchSpacesToAddModList->list.count);
struct NR_UplinkConfig__uplinkBWP_ToAddModList *uplinkBWP_ToAddModList = scd->uplinkConfig->uplinkBWP_ToAddModList;
if (ul_bwp_id > 0) {
@@ -597,7 +597,7 @@ void config_control_ue(NR_UE_MAC_INST_t *mac){
AssertFatal(*ss->controlResourceSetId == mac->coreset[dl_bwp_id][coreset_id - 1]->controlResourceSetId, "ss->controlResourceSetId is unknown\n");
AssertFatal(ss->monitoringSymbolsWithinSlot != NULL, "NR_SearchSpace->monitoringSymbolsWithinSlot is null\n");
AssertFatal(ss->monitoringSymbolsWithinSlot->buf != NULL, "NR_SearchSpace->monitoringSymbolsWithinSlot->buf is null\n");
- mac->SSpace[dl_bwp_id][0][ss_id] = ss;
+ mac->SSpace[dl_bwp_id][ss_id] = ss;
}
// Check available CSSs in the commonSearchSpaceList (list of additional common search spaces)
@@ -610,11 +610,23 @@ void config_control_ue(NR_UE_MAC_INST_t *mac){
AssertFatal(css->searchSpaceType != NULL, "css->searchSpaceType is null\n");
AssertFatal(css->monitoringSymbolsWithinSlot != NULL, "css->monitoringSymbolsWithinSlot is null\n");
AssertFatal(css->monitoringSymbolsWithinSlot->buf != NULL, "css->monitoringSymbolsWithinSlot->buf is null\n");
- mac->SSpace[dl_bwp_id][0][ss_id] = css;
+ mac->SSpace[dl_bwp_id][ss_id] = css;
ss_id++;
}
}
+// todo handle mac_LogicalChannelConfig
+int nr_rrc_mac_config_req_ue_logicalChannelBearer(
+ module_id_t module_id,
+ int cc_idP,
+ uint8_t gNB_index,
+ long logicalChannelIdentity,
+ boolean_t status){
+ NR_UE_MAC_INST_t *mac = get_mac_inst(module_id);
+ mac->logicalChannelBearer_exist[logicalChannelIdentity] = status;
+ return 0;
+}
+
int nr_rrc_mac_config_req_ue(
module_id_t module_id,
int cc_idP,
@@ -678,6 +690,17 @@ int nr_rrc_mac_config_req_ue(
LOG_I(MAC,"Applying CellGroupConfig from gNodeB\n");
mac->cg = cell_group_config;
mac->servCellIndex = cell_group_config->spCellConfig->servCellIndex ? *cell_group_config->spCellConfig->servCellIndex : 0;
+
+ mac->scheduling_info.periodicBSR_SF =
+ MAC_UE_BSR_TIMER_NOT_RUNNING;
+ mac->scheduling_info.retxBSR_SF =
+ MAC_UE_BSR_TIMER_NOT_RUNNING;
+ mac->BSR_reporting_active = NR_BSR_TRIGGER_NONE;
+ LOG_D(MAC, "[UE %d]: periodic BSR %d (SF), retx BSR %d (SF)\n",
+ module_id,
+ mac->scheduling_info.periodicBSR_SF,
+ mac->scheduling_info.retxBSR_SF);
+
config_control_ue(mac);
//config_common_ue(mac,module_id,cc_idP);
/*
diff --git a/openair2/LAYER2/NR_MAC_UE/mac_defs.h b/openair2/LAYER2/NR_MAC_UE/mac_defs.h
old mode 100755
new mode 100644
index cef97615f3..edfd37c3a0
--- a/openair2/LAYER2/NR_MAC_UE/mac_defs.h
+++ b/openair2/LAYER2/NR_MAC_UE/mac_defs.h
@@ -182,9 +182,9 @@ typedef struct {
uint16_t All_lcid_buffer_size_lastTTI;
/// buffer status for each lcid
uint8_t LCID_status[NR_MAX_NUM_LCID];
- /// SR pending as defined in 36.321
+ /// SR pending as defined in 38.321
uint8_t SR_pending;
- /// SR_COUNTER as defined in 36.321
+ /// SR_COUNTER as defined in 38.321
uint16_t SR_COUNTER;
/// logical channel group ide for each LCID
uint8_t LCGID[NR_MAX_NUM_LCID];
@@ -328,15 +328,6 @@ typedef struct {
} RAR_grant_t;
-typedef struct {
-
- uint8_t phr_reporting;
- uint16_t truncated_bsr;
- uint16_t short_bsr;
- uint16_t long_bsr;
-
-} NR_UE_MAC_CE_t;
-
typedef struct {
int n_HARQ_ACK;
uint32_t ack_payload;
@@ -353,6 +344,7 @@ typedef struct {
int8_t delta_pucch;
} PUCCH_sched_t;
+
/*!\brief Top level UE MAC structure */
typedef struct {
@@ -375,7 +367,7 @@ typedef struct {
NR_BWP_Downlink_t *DLbwp[MAX_NUM_BWP];
NR_BWP_Uplink_t *ULbwp[MAX_NUM_BWP];
NR_ControlResourceSet_t *coreset[MAX_NUM_BWP][FAPI_NR_MAX_CORESET_PER_BWP];
- NR_SearchSpace_t *SSpace[MAX_NUM_BWP][FAPI_NR_MAX_CORESET_PER_BWP][FAPI_NR_MAX_SS_PER_CORESET];
+ NR_SearchSpace_t *SSpace[MAX_NUM_BWP][FAPI_NR_MAX_SS];
lte_frame_type_t frame_type;
@@ -419,8 +411,15 @@ typedef struct {
nr_ue_if_module_t *if_module;
nr_phy_config_t phy_config;
+ /// BSR report flag management
+ uint8_t BSR_reporting_active;
+
+ /// LogicalChannelConfig has bearer.
+ boolean_t logicalChannelBearer_exist[NR_MAX_NUM_LCID];
NR_UE_SCHEDULING_INFO scheduling_info;
- NR_UE_MAC_CE_t nr_ue_mac_ce;
+
+ /// PHR
+ uint8_t PHR_reporting_active;
NR_Type0_PDCCH_CSS_config_t type0_PDCCH_CSS_config;
NR_SearchSpace_t *search_space_zero;
diff --git a/openair2/LAYER2/NR_MAC_UE/mac_proto.h b/openair2/LAYER2/NR_MAC_UE/mac_proto.h
old mode 100755
new mode 100644
index a078e385dc..a9632fb330
--- a/openair2/LAYER2/NR_MAC_UE/mac_proto.h
+++ b/openair2/LAYER2/NR_MAC_UE/mac_proto.h
@@ -40,6 +40,10 @@
#define NR_DL_MAX_DAI (4) /* TS 38.213 table 9.1.3-1 Value of counter DAI for DCI format 1_0 and 1_1 */
#define NR_DL_MAX_NB_CW (2) /* number of downlink code word */
+/**\brief initialize the field in nr_mac instance
+ \param module_id module id */
+void nr_ue_init_mac(module_id_t module_idP);
+
/**\brief decode mib pdu in NR_UE, from if_module ul_ind with P7 tx_ind message
\param module_id module id
\param cc_id component carrier id
@@ -74,6 +78,20 @@ int8_t nr_ue_decode_BCCH_DL_SCH(module_id_t module_id,
uint8_t *pduP,
uint32_t pdu_len);
+/**\brief primitive from RRC layer to MAC layer to set if bearer exists for a logical channel. todo handle mac_LogicalChannelConfig
+ \param module_id module id
+ \param cc_id component carrier id
+ \param gNB_index gNB index
+ \param long logicalChannelIdentity
+ \param boolean_t status*/
+int nr_rrc_mac_config_req_ue_logicalChannelBearer(
+ module_id_t module_id,
+ int cc_idP,
+ uint8_t gNB_index,
+ long logicalChannelIdentity,
+ boolean_t status
+);
+
/**\brief primitive from RRC layer to MAC layer for configuration L1/L2, now supported 4 rrc messages: MIB, cell_group_config for MAC/PHY, spcell_config(serving cell config)
\param module_id module id
\param cc_id component carrier id
@@ -125,7 +143,53 @@ void fill_scheduled_response(nr_scheduled_response_t *scheduled_response,
int slot,
int thread_id);
-int8_t nr_ue_get_SR(module_id_t module_idP, frame_t frameP, int slotP);
+/*! \fn int8_t nr_ue_get_SR(module_id_t module_idP, frame_t frameP, slot_t slotP);
+ \brief Called by PHY to get sdu for PUSCH transmission. It performs the following operations: Checks BSR for DCCH, DCCH1 and DTCH corresponding to previous values computed either in SR or BSR procedures. It gets rlc status indications on DCCH,DCCH1 and DTCH and forms BSR elements and PHR in MAC header. CRNTI element is not supported yet. It computes transport block for up to 3 SDUs and generates header and forms the complete MAC SDU.
+\param[in] Mod_id Instance id of UE in machine
+\param[in] frameP subframe number
+\param[in] slotP slot number
+*/
+int8_t nr_ue_get_SR(module_id_t module_idP, frame_t frameP, slot_t slotP);
+
+/*! \fn boolean_t update_bsr(module_id_t module_idP, frame_t frameP, slot_t slotP, uint8_t gNB_index)
+ \brief get the rlc stats and update the bsr level for each lcid
+\param[in] Mod_id instance of the UE
+\param[in] frameP Frame index
+\param[in] slot slotP number
+\param[in] uint8_t gNB_index
+*/
+boolean_t nr_update_bsr(module_id_t module_idP, frame_t frameP, slot_t slotP, uint8_t gNB_index);
+
+/*! \fn nr_locate_BsrIndexByBufferSize (int *table, int size, int value)
+ \brief locate the BSR level in the table as defined in 38.321. This function requires that he values in table to be monotonic, either increasing or decreasing. The returned value is not less than 0, nor greater than n-1, where n is the size of table.
+\param[in] *table Pointer to BSR table
+\param[in] size Size of the table
+\param[in] value Value of the buffer
+\return the index in the BSR_LEVEL table
+*/
+uint8_t nr_locate_BsrIndexByBufferSize(const uint32_t *table, int size,
+ int value);
+
+/*! \fn int nr_get_sf_periodicBSRTimer(uint8_t periodicBSR_Timer)
+ \brief get the number of subframe from the periodic BSR timer configured by the higher layers
+\param[in] periodicBSR_Timer timer for periodic BSR
+\return the number of subframe
+*/
+int nr_get_sf_periodicBSRTimer(uint8_t bucketSize);
+
+/*! \fn int nr_get_ms_bucketsizeduration(uint8_t bucketSize)
+ \brief get the time in ms form the bucket size duration configured by the higher layer
+\param[in] bucketSize the bucket size duration
+\return the time in ms
+*/
+int nr_get_ms_bucketsizeduration(uint8_t bucketsizeduration);
+
+/*! \fn int nr_get_sf_retxBSRTimer(uint8_t retxBSR_Timer)
+ \brief get the number of subframe form the bucket size duration configured by the higher layer
+\param[in] retxBSR_Timer timer for regular BSR
+\return the time in sf
+*/
+int nr_get_sf_retxBSRTimer(uint8_t retxBSR_Timer);
int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, frame_t frame, int slot, dci_pdu_rel15_t *dci, fapi_nr_dci_indication_pdu_t *dci_ind);
int nr_ue_process_dci_indication_pdu(module_id_t module_id, int cc_id, int gNB_index, frame_t frame, int slot, fapi_nr_dci_indication_pdu_t *dci);
@@ -170,7 +234,13 @@ void nr_ue_process_mac_pdu(nr_downlink_indication_t *dl_info,
int pdu_id);
int nr_write_ce_ulsch_pdu(uint8_t *mac_ce,
- NR_UE_MAC_INST_t *mac);
+ NR_UE_MAC_INST_t *mac,
+ uint8_t power_headroom, // todo: NR_POWER_HEADROOM_CMD *power_headroom,
+ uint16_t *crnti,
+ NR_BSR_SHORT *truncated_bsr,
+ NR_BSR_SHORT *short_bsr,
+ NR_BSR_LONG *long_bsr
+ );
void fill_dci_search_candidates(NR_SearchSpace_t *ss,fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15);
@@ -330,7 +400,7 @@ void nr_ra_succeeded(module_id_t mod_id, frame_t frame, int slot);
If the UE is not in PUSCH mode for a particular eNB index, this is assumed to be an Msg3 and MAC
attempts to retrieves the CCCH message from RRC. If the UE is in PUSCH mode for a particular eNB
index and PUCCH format 0 (Scheduling Request) is not activated, the MAC may use this resource for
-andom-access to transmit a BSR along with the C-RNTI control element (see 5.1.4 from 36.321)
+andom-access to transmit a BSR along with the C-RNTI control element (see 5.1.4 from 38.321)
@param mod_id Index of UE instance
@param CC_id Component Carrier Index
@param frame
diff --git a/openair2/LAYER2/NR_MAC_UE/main_ue_nr.c b/openair2/LAYER2/NR_MAC_UE/main_ue_nr.c
index b27837043f..af0c84dc4b 100644
--- a/openair2/LAYER2/NR_MAC_UE/main_ue_nr.c
+++ b/openair2/LAYER2/NR_MAC_UE/main_ue_nr.c
@@ -52,8 +52,9 @@ NR_UE_MAC_INST_t * nr_l2_init_ue(NR_UE_RRC_INST_t* rrc_inst) {
//init mac here
nr_ue_mac_inst = (NR_UE_MAC_INST_t *)calloc(sizeof(NR_UE_MAC_INST_t),NB_NR_UE_MAC_INST);
- for (int j=0;jscell_group_config) {
diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c
index c3c195a64a..2d059783fe 100644
--- a/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c
+++ b/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c
@@ -740,7 +740,7 @@ uint8_t nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources,
} else {
- size_sdu = nr_write_ce_ulsch_pdu(pdu, mac);
+ size_sdu = nr_write_ce_ulsch_pdu(pdu, mac, 0, &(mac->crnti), NULL, NULL, NULL);
pdu += size_sdu;
ra->Msg3_size = size_sdu;
diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c
index 2abcb60e91..ad82161fb9 100644
--- a/openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c
+++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c
@@ -76,7 +76,6 @@ void fill_dci_search_candidates(NR_SearchSpace_t *ss,fapi_nr_dl_config_dci_dl_pd
void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15, fapi_nr_dl_config_request_t *dl_config, int rnti_type, int ss_id){
uint16_t monitoringSymbolsWithinSlot = 0;
- uint8_t coreset_id = 1;
int sps = 0;
AssertFatal(mac->scc == NULL || mac->scc_SIB == NULL, "both scc and scc_SIB cannot be non-null\n");
@@ -97,11 +96,23 @@ void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t
NR_SearchSpace_t *ss;
NR_ControlResourceSet_t *coreset;
if(ss_id>=0) {
- ss = mac->SSpace[bwp_id][coreset_id - 1][ss_id];
+ if (rnti_type == NR_RNTI_TC || rnti_type == NR_RNTI_RA) {
+ ss = mac->ra.ss;
+ AssertFatal(mac->ra.ss->searchSpaceId == ss_id,"Search Space id %d does not correspond to the one in ra->ss %ld for RA procedures\n",
+ ss_id,mac->ra.ss->searchSpaceId);
+ }
+ else
+ ss = mac->SSpace[bwp_id][ss_id];
+ }
+ else
+ ss = mac->search_space_zero;
+
+ uint8_t coreset_id = *ss->controlResourceSetId;
+
+ if(coreset_id>0) {
coreset = mac->coreset[bwp_id][coreset_id - 1];
rel15->coreset.CoreSetType = NFAPI_NR_CSET_CONFIG_PDCCH_CONFIG;
} else {
- ss = mac->search_space_zero;
coreset = mac->coreset0;
if(rnti_type == NR_RNTI_SI) {
rel15->coreset.CoreSetType = NFAPI_NR_CSET_CONFIG_MIB_SIB1;
@@ -255,7 +266,7 @@ void ue_dci_configuration(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_request_t *dl
RA_config_t *ra = &mac->ra;
int ss_id;
- uint8_t bwp_id = (mac->cg) ? mac->DL_BWP_Id : 0, coreset_id = (mac->cg) ? 1 : 0;
+ uint8_t bwp_id = (mac->cg) ? mac->DL_BWP_Id : 0;
//NR_ServingCellConfig_t *scd = mac->scg->spCellConfig->spCellConfigDedicated;
NR_BWP_DownlinkDedicated_t *bwpd = (bwp_id>0) ? mac->DLbwp[bwp_id-1]->bwp_Dedicated : mac->cg->spCellConfig->spCellConfigDedicated->initialDownlinkBWP;
NR_BWP_DownlinkCommon_t *bwp_Common = (bwp_id>0) ? mac->DLbwp[bwp_id-1]->bwp_Common : &mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP;
@@ -264,9 +275,9 @@ void ue_dci_configuration(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_request_t *dl
// loop over all available SS for CORESET ID 1
if (bwpd) {
- for (ss_id = 0; ss_id < FAPI_NR_MAX_SS_PER_CORESET && mac->SSpace[bwp_id][coreset_id - 1][ss_id] != NULL; ss_id++){
+ for (ss_id = 0; ss_id < FAPI_NR_MAX_SS && mac->SSpace[bwp_id][ss_id] != NULL; ss_id++){
LOG_D(NR_MAC, "[DCI_CONFIG] ss_id %d\n",ss_id);
- NR_SearchSpace_t *ss = mac->SSpace[bwp_id][coreset_id - 1][ss_id];
+ NR_SearchSpace_t *ss = mac->SSpace[bwp_id][ss_id];
fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15 = &dl_config->dl_config_list[dl_config->number_pdus].dci_config_pdu.dci_config_rel15;
NR_SetupRelease_PDCCH_ConfigCommon_t *pdcch_ConfigCommon = bwp_Common->pdcch_ConfigCommon;
struct NR_PhysicalCellGroupConfig *phy_cgc = mac->cg->physicalCellGroupConfig;
diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
index e6bb66eaaf..d555014bc8 100644
--- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
+++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
@@ -134,6 +134,55 @@ const initial_pucch_resource_t initial_pucch_resource[16] = {
};
+void nr_ue_init_mac(module_id_t module_idP) {
+ int i;
+
+ NR_UE_MAC_INST_t *mac = get_mac_inst(module_idP);
+ // default values as deined in 38.331 sec 9.2.2
+ LOG_I(NR_MAC, "[UE%d] Applying default macMainConfig\n", module_idP);
+ //mac->scheduling_info.macConfig=NULL;
+ mac->scheduling_info.retxBSR_Timer = NR_BSR_Config__retxBSR_Timer_sf10240;
+ mac->scheduling_info.periodicBSR_Timer = NR_BSR_Config__periodicBSR_Timer_infinity;
+// mac->scheduling_info.periodicPHR_Timer = NR_MAC_MainConfig__phr_Config__setup__periodicPHR_Timer_sf20;
+// mac->scheduling_info.prohibitPHR_Timer = NR_MAC_MainConfig__phr_Config__setup__prohibitPHR_Timer_sf20;
+// mac->scheduling_info.PathlossChange_db = NR_MAC_MainConfig__phr_Config__setup__dl_PathlossChange_dB1;
+// mac->PHR_state = NR_MAC_MainConfig__phr_Config_PR_setup;
+ mac->scheduling_info.SR_COUNTER = 0;
+ mac->scheduling_info.sr_ProhibitTimer = 0;
+ mac->scheduling_info.sr_ProhibitTimer_Running = 0;
+// mac->scheduling_info.maxHARQ_Tx = NR_MAC_MainConfig__ul_SCH_Config__maxHARQ_Tx_n5;
+// mac->scheduling_info.ttiBundling = 0;
+// mac->scheduling_info.extendedBSR_Sizes_r10 = 0;
+// mac->scheduling_info.extendedPHR_r10 = 0;
+// mac->scheduling_info.drx_config = NULL;
+// mac->scheduling_info.phr_config = NULL;
+ // set init value 0xFFFF, make sure periodic timer and retx time counters are NOT active, after bsr transmission set the value configured by the NW.
+ mac->scheduling_info.periodicBSR_SF = MAC_UE_BSR_TIMER_NOT_RUNNING;
+ mac->scheduling_info.retxBSR_SF = MAC_UE_BSR_TIMER_NOT_RUNNING;
+ mac->BSR_reporting_active = BSR_TRIGGER_NONE;
+// mac->scheduling_info.periodicPHR_SF = nr_get_sf_perioidicPHR_Timer(mac->scheduling_info.periodicPHR_Timer);
+// mac->scheduling_info.prohibitPHR_SF = nr_get_sf_prohibitPHR_Timer(mac->scheduling_info.prohibitPHR_Timer);
+// mac->scheduling_info.PathlossChange_db = nr_get_db_dl_PathlossChange(mac->scheduling_info.PathlossChange);
+// mac->PHR_reporting_active = 0;
+
+ for (i = 0; i < NR_MAX_NUM_LCID; i++) {
+ LOG_D(NR_MAC, "[UE%d] Applying default logical channel config for LCGID %d\n",
+ module_idP, i);
+ mac->scheduling_info.Bj[i] = -1;
+ mac->scheduling_info.bucket_size[i] = -1;
+
+ if (i < UL_SCH_LCID_DTCH) { // initialize all control channels lcgid to 0
+ mac->scheduling_info.LCGID[i] = 0;
+ } else { // initialize all the data channels lcgid to 1
+ mac->scheduling_info.LCGID[i] = 1;
+ }
+
+ mac->scheduling_info.LCID_status[i] = LCID_EMPTY;
+ mac->scheduling_info.LCID_buffer_remain[i] = 0;
+ for (int i=0;ifirst_ul_tx[i]=1;
+ }
+}
+
void get_bwp_info(NR_UE_MAC_INST_t *mac,
int dl_bwp_id,
int ul_bwp_id,
@@ -2202,9 +2251,54 @@ bool trigger_periodic_scheduling_request(NR_UE_MAC_INST_t *mac,
return false;
}
+int8_t nr_ue_get_SR(module_id_t module_idP, frame_t frameP, slot_t slot){
+ // no UL-SCH resources available for this tti && UE has a valid PUCCH resources for SR configuration for this tti
+ DevCheck(module_idP < (int) NB_UE_INST, module_idP, NB_NR_UE_MAC_INST, 0);
+ NR_UE_MAC_INST_t *mac = get_mac_inst(module_idP);
+ DSR_TRANSMAX_t dsr_TransMax = sr_n64; // todo
+ LOG_D(NR_MAC, "[UE %d] Frame %d slot %d send SR indication (SR_COUNTER/dsr_TransMax %d/%d), SR_pending %d\n",
+ module_idP, frameP, slot,
+ mac->scheduling_info.SR_COUNTER,
+ (1 << (2 + dsr_TransMax)),
+ mac->scheduling_info.SR_pending); // todo
-int8_t nr_ue_get_SR(module_id_t module_idP, frame_t frameP, int slotP){
- return 0;
+ if ((mac->scheduling_info.SR_pending == 1) &&
+ (mac->scheduling_info.SR_COUNTER < (1 << (2 + dsr_TransMax)))) {
+ LOG_D(NR_MAC, "[UE %d] Frame %d slot %d PHY asks for SR (SR_COUNTER/dsr_TransMax %d/%d), SR_pending %d, increment SR_COUNTER\n",
+ module_idP, frameP, slot,
+ mac->scheduling_info.SR_COUNTER,
+ (1 << (2 + dsr_TransMax)),
+ mac->scheduling_info.SR_pending); // todo
+ mac->scheduling_info.SR_COUNTER++;
+
+ // start the sr-prohibittimer : rel 9 and above
+ if (mac->scheduling_info.sr_ProhibitTimer > 0) { // timer configured
+ mac->scheduling_info.sr_ProhibitTimer--;
+ mac->scheduling_info.
+ sr_ProhibitTimer_Running = 1;
+ } else {
+ mac->scheduling_info.
+ sr_ProhibitTimer_Running = 0;
+ }
+ //mac->ul_active =1;
+ return (1); //instruct phy to signal SR
+ } else {
+ // notify RRC to relase PUCCH/SRS
+ // clear any configured dl/ul
+ // initiate RA
+ if (mac->scheduling_info.SR_pending) {
+ // release all pucch resource
+ //mac->physicalConfigDedicated = NULL; // todo
+ //mac->ul_active = 0; // todo
+ mac->BSR_reporting_active =
+ NR_BSR_TRIGGER_NONE;
+ LOG_I(NR_MAC, "[UE %d] Release all SRs \n", module_idP);
+ }
+
+ mac->scheduling_info.SR_pending = 0;
+ mac->scheduling_info.SR_COUNTER = 0;
+ return (0);
+ }
}
@@ -3466,13 +3560,17 @@ void nr_ue_process_mac_pdu(nr_downlink_indication_t *dl_info,
* Return: number of written bytes
*/
int nr_write_ce_ulsch_pdu(uint8_t *mac_ce,
- NR_UE_MAC_INST_t *mac) {
+ NR_UE_MAC_INST_t *mac,
+ uint8_t power_headroom, // todo: NR_POWER_HEADROOM_CMD *power_headroom,
+ uint16_t *crnti,
+ NR_BSR_SHORT *truncated_bsr,
+ NR_BSR_SHORT *short_bsr,
+ NR_BSR_LONG *long_bsr) {
int mac_ce_len = 0;
uint8_t mac_ce_size = 0;
- NR_UE_MAC_CE_t *nr_ue_mac_ce = &mac->nr_ue_mac_ce;
-
- if (nr_ue_mac_ce->phr_reporting && mac->phr_Config != NULL) {
+ uint8_t *pdu = mac_ce;
+ if (power_headroom) {
// MAC CE fixed subheader
((NR_MAC_SUBHEADER_FIXED *) mac_ce)->R = 0;
@@ -3480,21 +3578,22 @@ int nr_write_ce_ulsch_pdu(uint8_t *mac_ce,
mac_ce++;
// PHR MAC CE (1 octet)
- ((NR_SINGLE_ENTRY_PHR_MAC_CE *) mac_ce)->PH = 0;
+ ((NR_SINGLE_ENTRY_PHR_MAC_CE *) mac_ce)->PH = power_headroom;
((NR_SINGLE_ENTRY_PHR_MAC_CE *) mac_ce)->R1 = 0;
- ((NR_SINGLE_ENTRY_PHR_MAC_CE *) mac_ce)->PCMAX = 0;
+ ((NR_SINGLE_ENTRY_PHR_MAC_CE *) mac_ce)->PCMAX = 0; // todo
((NR_SINGLE_ENTRY_PHR_MAC_CE *) mac_ce)->R2 = 0;
// update pointer and length
mac_ce_size = sizeof(NR_SINGLE_ENTRY_PHR_MAC_CE);
mac_ce += mac_ce_size;
mac_ce_len += mac_ce_size + sizeof(NR_MAC_SUBHEADER_FIXED);
-
+ LOG_D(NR_MAC, "[UE] Generating ULSCH PDU : power_headroom pdu %p mac_ce %p b\n",
+ pdu, mac_ce);
}
- if (!get_softmodem_params()->sa && get_softmodem_params()->do_ra && mac->ra.ra_state != RA_SUCCEEDED) {
+ if (crnti && (!get_softmodem_params()->sa && get_softmodem_params()->do_ra && mac->ra.ra_state != RA_SUCCEEDED)) {
- LOG_D(NR_MAC, "In %s: generating C-RNTI MAC CE with C-RNTI %x\n", __FUNCTION__, mac->crnti);
+ LOG_D(NR_MAC, "In %s: generating C-RNTI MAC CE with C-RNTI %x\n", __FUNCTION__, (*crnti));
// MAC CE fixed subheader
((NR_MAC_SUBHEADER_FIXED *) mac_ce)->R = 0;
@@ -3502,7 +3601,7 @@ int nr_write_ce_ulsch_pdu(uint8_t *mac_ce,
mac_ce++;
// C-RNTI MAC CE (2 octets)
- *(uint16_t *) mac_ce = mac->crnti;
+ *(uint16_t *) mac_ce = (*crnti);
// update pointer and length
mac_ce_size = sizeof(uint16_t);
@@ -3511,55 +3610,110 @@ int nr_write_ce_ulsch_pdu(uint8_t *mac_ce,
}
- if (nr_ue_mac_ce->truncated_bsr) {
+ if (truncated_bsr) {
- LOG_D(NR_MAC, "In %s: generating short truncated BSR MAC CE with command %x\n", __FUNCTION__, nr_ue_mac_ce->truncated_bsr);
-
- // MAC CE fixed subheader
+ // MAC CE fixed subheader
((NR_MAC_SUBHEADER_FIXED *) mac_ce)->R = 0;
((NR_MAC_SUBHEADER_FIXED *) mac_ce)->LCID = UL_SCH_LCID_S_TRUNCATED_BSR;
mac_ce++;
// Short truncated BSR MAC CE (1 octet)
- ((NR_BSR_SHORT_TRUNCATED *) mac_ce)-> Buffer_size = 0;
- ((NR_BSR_SHORT_TRUNCATED *) mac_ce)-> LcgID = 0;
+ ((NR_BSR_SHORT_TRUNCATED *) mac_ce)-> Buffer_size = truncated_bsr->Buffer_size;
+ ((NR_BSR_SHORT_TRUNCATED *) mac_ce)-> LcgID = truncated_bsr->LcgID;;
// update pointer and length
mac_ce_size = sizeof(NR_BSR_SHORT_TRUNCATED);
mac_ce += mac_ce_size;
mac_ce_len += mac_ce_size + sizeof(NR_MAC_SUBHEADER_FIXED);
+ LOG_D(NR_MAC, "[UE] Generating ULSCH PDU : truncated_bsr Buffer_size %d LcgID %d pdu %p mac_ce %p\n",
+ truncated_bsr->Buffer_size, truncated_bsr->LcgID, pdu, mac_ce);
- } else if (nr_ue_mac_ce->short_bsr) {
+ } else if (short_bsr) {
- LOG_D(NR_MAC, "In %s: generating short BSR MAC CE with command %x\n", __FUNCTION__, nr_ue_mac_ce->short_bsr);
-
- // MAC CE fixed subheader
+ // MAC CE fixed subheader
((NR_MAC_SUBHEADER_FIXED *) mac_ce)->R = 0;
((NR_MAC_SUBHEADER_FIXED *) mac_ce)->LCID = UL_SCH_LCID_S_BSR;
mac_ce++;
// Short truncated BSR MAC CE (1 octet)
- ((NR_BSR_SHORT *) mac_ce)->Buffer_size = nr_ue_mac_ce->short_bsr;
- ((NR_BSR_SHORT *) mac_ce)->LcgID = 0;
+ ((NR_BSR_SHORT *) mac_ce)->Buffer_size = short_bsr->Buffer_size;
+ ((NR_BSR_SHORT *) mac_ce)->LcgID = short_bsr->LcgID;
// update pointer and length
mac_ce_size = sizeof(NR_BSR_SHORT);
mac_ce += mac_ce_size;
mac_ce_len += mac_ce_size + sizeof(NR_MAC_SUBHEADER_FIXED);
+ LOG_D(NR_MAC, "[UE] Generating ULSCH PDU : short_bsr Buffer_size %d LcgID %d pdu %p mac_ce %p\n",
+ short_bsr->Buffer_size, short_bsr->LcgID, pdu, mac_ce);
+ } else if (long_bsr) {
- } else if (nr_ue_mac_ce->long_bsr) {
- // MAC CE variable subheader
- // todo ch 6.1.3.1. TS 38.321
- // ((NR_MAC_SUBHEADER_SHORT *) mac_pdu_ptr)->R = 0;
- // ((NR_MAC_SUBHEADER_SHORT *) mac_pdu_ptr)->F = 0;
- // ((NR_MAC_SUBHEADER_SHORT *) mac_pdu_ptr)->LCID = UL_SCH_LCID_L_BSR;
- // ((NR_MAC_SUBHEADER_SHORT *) mac_pdu_ptr)->L = 0;
- // sh_size = 2;
+ // MAC CE variable subheader
+ // ch 6.1.3.1. TS 38.321
+ ((NR_MAC_SUBHEADER_SHORT *) mac_ce)->R = 0;
+ ((NR_MAC_SUBHEADER_SHORT *) mac_ce)->F = 0;
+ ((NR_MAC_SUBHEADER_SHORT *) mac_ce)->LCID = UL_SCH_LCID_L_BSR;
- // Short truncated BSR MAC CE (1 octet)
- // ((NR_BSR_LONG *) mac_ce)->Buffer_size0 = short_bsr;
- // ((NR_BSR_LONG *) mac_ce)->LCGID0 = 0;
- // mac_ce_size = sizeof(NR_BSR_LONG); // size is variable
+ NR_MAC_SUBHEADER_SHORT *mac_pdu_subheader_ptr = (NR_MAC_SUBHEADER_SHORT *) mac_ce;
+ mac_ce += 2;
+
+ // Could move to nr_get_sdu()
+ uint8_t *Buffer_size_ptr= (uint8_t*) mac_ce + 1;
+ //int NR_BSR_LONG_SIZE = 1;
+ if (long_bsr->Buffer_size0 == 0) {
+ ((NR_BSR_LONG *) mac_ce)->LcgID0 = 0;
+ } else {
+ ((NR_BSR_LONG *) mac_ce)->LcgID0 = 1;
+ *Buffer_size_ptr++ = long_bsr->Buffer_size0;
+ }
+ if (long_bsr->Buffer_size1 == 0) {
+ ((NR_BSR_LONG *) mac_ce)->LcgID1 = 0;
+ } else {
+ ((NR_BSR_LONG *) mac_ce)->LcgID1 = 1;
+ *Buffer_size_ptr++ = long_bsr->Buffer_size1;
+ }
+ if (long_bsr->Buffer_size2 == 0) {
+ ((NR_BSR_LONG *) mac_ce)->LcgID2 = 0;
+ } else {
+ ((NR_BSR_LONG *) mac_ce)->LcgID2 = 1;
+ *Buffer_size_ptr++ = long_bsr->Buffer_size2;
+ }
+ if (long_bsr->Buffer_size3 == 0) {
+ ((NR_BSR_LONG *) mac_ce)->LcgID3 = 0;
+ } else {
+ ((NR_BSR_LONG *) mac_ce)->LcgID3 = 1;
+ *Buffer_size_ptr++ = long_bsr->Buffer_size3;
+ }
+ if (long_bsr->Buffer_size4 == 0) {
+ ((NR_BSR_LONG *) mac_ce)->LcgID4 = 0;
+ } else {
+ ((NR_BSR_LONG *) mac_ce)->LcgID4 = 1;
+ *Buffer_size_ptr++ = long_bsr->Buffer_size4;
+ }
+ if (long_bsr->Buffer_size5 == 0) {
+ ((NR_BSR_LONG *) mac_ce)->LcgID5 = 0;
+ } else {
+ ((NR_BSR_LONG *) mac_ce)->LcgID5 = 1;
+ *Buffer_size_ptr++ = long_bsr->Buffer_size5;
+ }
+ if (long_bsr->Buffer_size6 == 0) {
+ ((NR_BSR_LONG *) mac_ce)->LcgID6 = 0;
+ } else {
+ ((NR_BSR_LONG *) mac_ce)->LcgID6 = 1;
+ *Buffer_size_ptr++ = long_bsr->Buffer_size6;
+ }
+ if (long_bsr->Buffer_size7 == 0) {
+ ((NR_BSR_LONG *) mac_ce)->LcgID7 = 0;
+ } else {
+ ((NR_BSR_LONG *) mac_ce)->LcgID7 = 1;
+ *Buffer_size_ptr++ = long_bsr->Buffer_size7;
+ }
+ ((NR_MAC_SUBHEADER_SHORT *) mac_pdu_subheader_ptr)->L = mac_ce_size = (uint8_t*) Buffer_size_ptr - (uint8_t*) mac_ce;
+ LOG_D(NR_MAC, "[UE] Generating ULSCH PDU : long_bsr size %d Lcgbit 0x%02x Buffer_size %d %d %d %d %d %d %d %d\n", mac_ce_size, *((uint8_t*) mac_ce),
+ ((NR_BSR_LONG *) mac_ce)->Buffer_size0, ((NR_BSR_LONG *) mac_ce)->Buffer_size1, ((NR_BSR_LONG *) mac_ce)->Buffer_size2, ((NR_BSR_LONG *) mac_ce)->Buffer_size3,
+ ((NR_BSR_LONG *) mac_ce)->Buffer_size4, ((NR_BSR_LONG *) mac_ce)->Buffer_size5, ((NR_BSR_LONG *) mac_ce)->Buffer_size6, ((NR_BSR_LONG *) mac_ce)->Buffer_size7);
+ // update pointer and length
+ mac_ce = Buffer_size_ptr;
+ mac_ce_len += mac_ce_size + sizeof(NR_MAC_SUBHEADER_SHORT);
}
return mac_ce_len;
diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
index fb27118c29..cfa8b88f32 100644
--- a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
+++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
@@ -53,6 +53,8 @@
#include
+#include "LAYER2/NR_MAC_COMMON/nr_mac_extern.h"
+
static prach_association_pattern_t prach_assoc_pattern;
static ssb_list_info_t ssb_list;
@@ -164,13 +166,26 @@ fapi_nr_ul_config_request_t *get_ul_config_request(NR_UE_MAC_INST_t *mac, int sl
void ul_layers_config(NR_UE_MAC_INST_t * mac, nfapi_nr_ue_pusch_pdu_t *pusch_config_pdu, dci_pdu_rel15_t *dci) {
NR_ServingCellConfigCommon_t *scc = mac->scc;
- NR_PUSCH_Config_t *pusch_Config = mac->ULbwp[0]->bwp_Dedicated->pusch_Config->choice.setup;
+ NR_BWP_UplinkDedicated_t *ubwpd=NULL;
+
+ if (mac->cg &&
+ mac->cg->spCellConfig &&
+ mac->cg->spCellConfig->spCellConfigDedicated &&
+ mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig &&
+ mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP)
+ ubwpd = mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP;
+
+ NR_PUSCH_Config_t *pusch_Config = mac->ULbwp[0] ?
+ mac->ULbwp[0]->bwp_Dedicated->pusch_Config->choice.setup :
+ (ubwpd?
+ ubwpd->pusch_Config->choice.setup:
+ NULL);
long transformPrecoder;
- if (pusch_Config->transformPrecoder)
+ if (pusch_Config && pusch_Config->transformPrecoder)
transformPrecoder = *pusch_Config->transformPrecoder;
else {
- if(scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->msg3_transformPrecoder)
+ if(scc && scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->msg3_transformPrecoder)
transformPrecoder = NR_PUSCH_Config__transformPrecoder_enabled;
else
transformPrecoder = NR_PUSCH_Config__transformPrecoder_disabled;
@@ -904,7 +919,7 @@ NR_UE_L2_STATE_t nr_ue_scheduler(nr_downlink_indication_t *dl_info, nr_uplink_in
rel15->dci_format_options[0] = NR_DL_DCI_FORMAT_1_0;
if (mac->ra.ra_state == WAIT_CONTENTION_RESOLUTION)
rel15->dci_format_options[1] = NR_UL_DCI_FORMAT_0_0; // msg3 retransmission
- config_dci_pdu(mac, rel15, dl_config, mac->ra.ra_state == WAIT_RAR ? NR_RNTI_RA : NR_RNTI_TC , -1);
+ config_dci_pdu(mac, rel15, dl_config, mac->ra.ra_state == WAIT_RAR ? NR_RNTI_RA : NR_RNTI_TC , mac->ra.ss->searchSpaceId);
fill_dci_search_candidates(mac->ra.ss, rel15);
dl_config->number_pdus = 1;
LOG_D(MAC,"mac->cg %p: Calling fill_scheduled_response rnti %x, type0_pdcch, num_pdus %d\n",mac->cg,rel15->rnti,dl_config->number_pdus);
@@ -1004,10 +1019,324 @@ NR_UE_L2_STATE_t nr_ue_scheduler(nr_downlink_indication_t *dl_info, nr_uplink_in
}
}
+ if (dl_info) {
+ return (CONNECTION_OK);
+ }
+ module_id_t mod_id = ul_info->module_id;
+ frame_t txFrameP = ul_info->frame_tx;
+ slot_t txSlotP = ul_info->slot_tx;
+
+ // Handle the SR/BSR procedures per subframe
+ NR_UE_MAC_INST_t *mac = get_mac_inst(mod_id);
+ uint8_t gNB_indexP=0;
+
+ // Call BSR procedure as described in Section 5.4.5 in 38.321
+
+ // First check ReTxBSR Timer because it is always configured
+ // Decrement ReTxBSR Timer if it is running and not null
+ if ((mac->scheduling_info.retxBSR_SF != MAC_UE_BSR_TIMER_NOT_RUNNING) && (mac->scheduling_info.retxBSR_SF != 0)) {
+ mac->scheduling_info.retxBSR_SF--;
+ }
+
+ // Decrement Periodic Timer if it is running and not null
+ if ((mac->scheduling_info.periodicBSR_SF != MAC_UE_BSR_TIMER_NOT_RUNNING) && (mac->scheduling_info.periodicBSR_SF != 0)) {
+ mac->scheduling_info.periodicBSR_SF--;
+ }
+
+ //Check whether Regular BSR is triggered
+ if (nr_update_bsr(mod_id, txFrameP, txSlotP, gNB_indexP) == TRUE) {
+ // call SR procedure to generate pending SR and BSR for next PUCCH/PUSCH TxOp. This should implement the procedures
+ // outlined in Sections 5.4.4 an 5.4.5 of 38.321
+ mac->scheduling_info.SR_pending = 1;
+ // Regular BSR trigger
+ mac->BSR_reporting_active |= NR_BSR_TRIGGER_REGULAR;
+ LOG_D(NR_MAC, "[UE %d][BSR] Regular BSR Triggered Frame %d slot %d SR for PUSCH is pending\n",
+ mod_id, txFrameP, txSlotP);
+ }
return UE_CONNECTION_OK;
}
+boolean_t
+nr_update_bsr(module_id_t module_idP, frame_t frameP, slot_t slotP, uint8_t gNB_index) {
+ mac_rlc_status_resp_t rlc_status;
+ boolean_t bsr_regular_triggered = FALSE;
+ uint8_t lcid;
+ uint8_t lcgid;
+ uint8_t num_lcid_with_data = 0; // for LCID with data only if LCGID is defined
+ uint32_t lcgid_buffer_remain[NR_MAX_NUM_LCGID] = {0,0,0,0,0,0,0,0};
+ int32_t lcid_bytes_in_buffer[NR_MAX_NUM_LCID];
+ /* Array for ordering LCID with data per decreasing priority order */
+ uint8_t lcid_reordered_array[NR_MAX_NUM_LCID]=
+ {NR_MAX_NUM_LCID,NR_MAX_NUM_LCID,NR_MAX_NUM_LCID,NR_MAX_NUM_LCID,NR_MAX_NUM_LCID,NR_MAX_NUM_LCID,NR_MAX_NUM_LCID,NR_MAX_NUM_LCID,
+ NR_MAX_NUM_LCID,NR_MAX_NUM_LCID,NR_MAX_NUM_LCID,NR_MAX_NUM_LCID,NR_MAX_NUM_LCID,NR_MAX_NUM_LCID,NR_MAX_NUM_LCID,NR_MAX_NUM_LCID,
+ NR_MAX_NUM_LCID,NR_MAX_NUM_LCID,NR_MAX_NUM_LCID,NR_MAX_NUM_LCID,NR_MAX_NUM_LCID,NR_MAX_NUM_LCID,NR_MAX_NUM_LCID,NR_MAX_NUM_LCID,
+ NR_MAX_NUM_LCID,NR_MAX_NUM_LCID,NR_MAX_NUM_LCID,NR_MAX_NUM_LCID,NR_MAX_NUM_LCID,NR_MAX_NUM_LCID,NR_MAX_NUM_LCID,NR_MAX_NUM_LCID,
+ };
+ uint8_t pos_next = 0;
+ //uint8_t highest_priority = 16;
+ uint8_t array_index = 0;
+ // Reset All BSR Infos
+ lcid_bytes_in_buffer[0] = 0;
+ NR_UE_MAC_INST_t *mac = get_mac_inst(module_idP);
+ for (lcid=DCCH; lcid < NR_MAX_NUM_LCID; lcid++) {
+ // Reset transmission status
+ lcid_bytes_in_buffer[lcid] = 0;
+ mac->scheduling_info.LCID_status[lcid]=LCID_EMPTY;
+ }
+
+ for (lcgid=0; lcgid < NR_MAX_NUM_LCGID; lcgid++) {
+ // Reset Buffer Info
+ mac->scheduling_info.BSR[lcgid]=0;
+ mac->scheduling_info.BSR_bytes[lcgid]=0;
+ }
+
+ //Get Buffer Occupancy and fill lcid_reordered_array
+ for (lcid=DCCH; lcid < NR_MAX_NUM_LCID; lcid++) {
+ //if (mac->logicalChannelConfig[lcid]) {
+ if (mac->logicalChannelBearer_exist[lcid] ) { // todo
+ lcgid = mac->scheduling_info.LCGID[lcid];
+
+ // Store already available data to transmit per Group
+ if (lcgid < NR_MAX_NUM_LCGID) {
+ lcgid_buffer_remain[lcgid] += mac->scheduling_info.LCID_buffer_remain[lcid];
+ }
+
+ rlc_status = mac_rlc_status_ind(module_idP, mac->crnti,gNB_index,frameP,slotP,ENB_FLAG_NO,MBMS_FLAG_NO, lcid, 0, 0);
+
+ lcid_bytes_in_buffer[lcid] = rlc_status.bytes_in_buffer;
+
+ if (rlc_status.bytes_in_buffer > 0) {
+ LOG_D(NR_MAC,"[UE %d] PDCCH Tick : LCID%d LCGID%d has data to transmit =%d bytes at frame %d slot %d\n",
+ module_idP, lcid,lcgid,rlc_status.bytes_in_buffer,frameP,slotP);
+ mac->scheduling_info.LCID_status[lcid] = LCID_NOT_EMPTY;
+
+ //Update BSR_bytes and position in lcid_reordered_array only if Group is defined
+ if (lcgid < NR_MAX_NUM_LCGID) {
+ num_lcid_with_data ++;
+ // sum lcid buffer which has same lcgid
+ mac->scheduling_info.BSR_bytes[lcgid] += rlc_status.bytes_in_buffer;
+ //Fill in the array
+ array_index = 0;
+
+ do {
+ //if (mac->logicalChannelConfig[lcid]->ul_SpecificParameters->priority <= highest_priority) {
+ if (1) { // todo
+ //Insert if priority is higher or equal (lower or equal in value)
+ for (pos_next=num_lcid_with_data-1; pos_next > array_index; pos_next--) {
+ lcid_reordered_array[pos_next] = lcid_reordered_array[pos_next - 1];
+ }
+
+ lcid_reordered_array[array_index] = lcid;
+ break;
+ }
+
+ array_index ++;
+ } while ((array_index < num_lcid_with_data) && (array_index < NR_MAX_NUM_LCID));
+ }
+ }
+ }
+ }
+
+ // Check whether a regular BSR can be triggered according to the first cases in 38.321
+ if (num_lcid_with_data) {
+ LOG_D(NR_MAC, "[UE %d] PDCCH Tick at frame %d slot %d: NumLCID with data=%d Reordered LCID0=%d LCID1=%d LCID2=%d\n",
+ module_idP, frameP, slotP, num_lcid_with_data,
+ lcid_reordered_array[0], lcid_reordered_array[1],
+ lcid_reordered_array[2]);
+
+ for (array_index = 0; array_index < num_lcid_with_data; array_index++) {
+ lcid = lcid_reordered_array[array_index];
+
+ /* UL data, for a logical channel which belongs to a LCG, becomes available for transmission in the RLC entity
+ either the data belongs to a logical channel with higher priority than the priorities of the logical channels
+ which belong to any LCG and for which data is already available for transmission
+ */
+ {
+ bsr_regular_triggered = TRUE;
+ LOG_D(NR_MAC, "[UE %d] PDCCH Tick : MAC BSR Triggered LCID%d LCGID%d data become available at frame %d slot %d\n",
+ module_idP, lcid,
+ mac->scheduling_info.LCGID[lcid],
+ frameP, slotP);
+ break;
+ }
+ }
+
+ // Trigger Regular BSR if ReTxBSR Timer has expired and UE has data for transmission
+ if (mac->scheduling_info.retxBSR_SF == 0) {
+ bsr_regular_triggered = TRUE;
+
+ if ((mac->BSR_reporting_active & NR_BSR_TRIGGER_REGULAR) == 0) {
+ LOG_I(NR_MAC, "[UE %d] PDCCH Tick : MAC BSR Triggered ReTxBSR Timer expiry at frame %d slot %d\n",
+ module_idP, frameP, slotP);
+ }
+ }
+ }
+
+ //Store Buffer Occupancy in remain buffers for next TTI
+ for (lcid = DCCH; lcid < NR_MAX_NUM_LCID; lcid++) {
+ mac->scheduling_info.LCID_buffer_remain[lcid] = lcid_bytes_in_buffer[lcid];
+ }
+
+ return bsr_regular_triggered;
+}
+
+uint8_t
+nr_locate_BsrIndexByBufferSize(const uint32_t *table, int size, int value) {
+ uint8_t ju, jm, jl;
+ int ascend;
+ //DevAssert(size > 0);
+ //DevAssert(size <= 256);
+
+ if (value == 0) {
+ return 0; //elseif (value > 150000) return 63;
+ }
+
+ jl = 0; // lower bound
+ ju = size - 1; // upper bound
+ ascend = (table[ju] >= table[jl]) ? 1 : 0; // determine the order of the the table: 1 if ascending order of table, 0 otherwise
+
+ while (ju - jl > 1) { //If we are not yet done,
+ jm = (ju + jl) >> 1; //compute a midpoint,
+
+ if ((value >= table[jm]) == ascend) {
+ jl = jm; // replace the lower limit
+ } else {
+ ju = jm; //replace the upper limit
+ }
+
+ LOG_T(NR_MAC, "[UE] searching BSR index %d for (BSR TABLE %d < value %d)\n",
+ jm, table[jm], value);
+ }
+
+ if (value == table[jl]) {
+ return jl;
+ } else {
+ return jl + 1; //equally ju
+ }
+}
+
+int nr_get_sf_periodicBSRTimer(uint8_t sf_offset) {
+ switch (sf_offset) {
+ case NR_BSR_Config__periodicBSR_Timer_sf1:
+ return 1;
+ break;
+
+ case NR_BSR_Config__periodicBSR_Timer_sf5:
+ return 5;
+ break;
+
+ case NR_BSR_Config__periodicBSR_Timer_sf10:
+ return 10;
+ break;
+
+ case NR_BSR_Config__periodicBSR_Timer_sf16:
+ return 16;
+ break;
+
+ case NR_BSR_Config__periodicBSR_Timer_sf20:
+ return 20;
+ break;
+
+ case NR_BSR_Config__periodicBSR_Timer_sf32:
+ return 32;
+ break;
+
+ case NR_BSR_Config__periodicBSR_Timer_sf40:
+ return 40;
+ break;
+
+ case NR_BSR_Config__periodicBSR_Timer_sf64:
+ return 64;
+ break;
+
+ case NR_BSR_Config__periodicBSR_Timer_sf80:
+ return 80;
+ break;
+
+ case NR_BSR_Config__periodicBSR_Timer_sf128:
+ return 128;
+ break;
+
+ case NR_BSR_Config__periodicBSR_Timer_sf160:
+ return 160;
+ break;
+
+ case NR_BSR_Config__periodicBSR_Timer_sf320:
+ return 320;
+ break;
+
+ case NR_BSR_Config__periodicBSR_Timer_sf640:
+ return 640;
+ break;
+
+ case NR_BSR_Config__periodicBSR_Timer_sf1280:
+ return 1280;
+ break;
+
+ case NR_BSR_Config__periodicBSR_Timer_sf2560:
+ return 2560;
+ break;
+
+ case NR_BSR_Config__periodicBSR_Timer_infinity:
+ default:
+ return 0xFFFF;
+ break;
+ }
+}
+
+int nr_get_sf_retxBSRTimer(uint8_t sf_offset) {
+ switch (sf_offset) {
+ case NR_BSR_Config__retxBSR_Timer_sf10:
+ return 10;
+ break;
+
+ case NR_BSR_Config__retxBSR_Timer_sf20:
+ return 20;
+ break;
+
+ case NR_BSR_Config__retxBSR_Timer_sf40:
+ return 40;
+ break;
+
+ case NR_BSR_Config__retxBSR_Timer_sf80:
+ return 80;
+ break;
+
+ case NR_BSR_Config__retxBSR_Timer_sf160:
+ return 160;
+ break;
+
+ case NR_BSR_Config__retxBSR_Timer_sf320:
+ return 320;
+ break;
+
+ case NR_BSR_Config__retxBSR_Timer_sf640:
+ return 640;
+ break;
+
+ case NR_BSR_Config__retxBSR_Timer_sf1280:
+ return 1280;
+ break;
+
+ case NR_BSR_Config__retxBSR_Timer_sf2560:
+ return 2560;
+ break;
+
+ case NR_BSR_Config__retxBSR_Timer_sf5120:
+ return 5120;
+ break;
+
+ case NR_BSR_Config__retxBSR_Timer_sf10240:
+ return 10240;
+ break;
+
+ default:
+ return -1;
+ break;
+ }
+}
+
// PUSCH scheduler:
// - Calculate the slot in which ULSCH should be scheduled. This is current slot + K2,
// - where K2 is the offset between the slot in which UL DCI is received and the slot
@@ -2041,6 +2370,261 @@ void nr_ue_sib1_scheduler(module_id_t module_idP,
#define MAX_LCID 8 // NR_MAX_NUM_LCID shall be used but the mac_rlc_data_req function can fetch data for max 8 LCID
+typedef struct {
+ uint8_t bsr_len;
+ uint8_t bsr_ce_len;
+ uint8_t bsr_header_len;
+ uint8_t phr_len;
+ uint8_t phr_ce_len;
+ uint8_t phr_header_len;
+ uint16_t sdu_length_total;
+ NR_BSR_SHORT *bsr_s;
+ NR_BSR_LONG *bsr_l;
+ NR_BSR_SHORT *bsr_t;
+ //NR_POWER_HEADROOM_CMD *phr_pr;
+ int tot_mac_ce_len;
+ uint8_t total_mac_pdu_header_len;
+} NR_UE_MAC_CE_INFO;
+
+/*
+nr_ue_get_sdu_mac_ce_pre finds length in various mac_ce field
+Need nothing from mac_ce_p:
+Update the following in mac_ce_p:
+ bsr_len;
+ bsr_ce_len;
+ bsr_header_len;
+ phr_len; TBD
+ phr_ce_len; TBD
+ phr_header_len; TBD
+*/
+int nr_ue_get_sdu_mac_ce_pre(module_id_t module_idP,
+ int CC_id,
+ frame_t frameP,
+ sub_frame_t subframe,
+ uint8_t gNB_index,
+ uint8_t *ulsch_buffer,
+ uint16_t buflen,
+ NR_UE_MAC_CE_INFO *mac_ce_p) {
+ NR_UE_MAC_INST_t *mac = get_mac_inst(module_idP);
+
+ int num_lcg_id_with_data = 0;
+ // Preparing the MAC CEs sub-PDUs and get the total size
+ mac_ce_p->bsr_header_len = 0;
+ mac_ce_p->phr_header_len = 0; //sizeof(SCH_SUBHEADER_FIXED);
+ int lcg_id = 0;
+ while (lcg_id < NR_MAX_NUM_LCGID) {
+ if (mac->scheduling_info.BSR_bytes[lcg_id]) {
+ num_lcg_id_with_data++;
+ }
+
+ lcg_id++;
+ }
+
+ //Restart ReTxBSR Timer at new grant indication (38.321)
+ if (mac->scheduling_info.retxBSR_SF != MAC_UE_BSR_TIMER_NOT_RUNNING) {
+ mac->scheduling_info.retxBSR_SF = nr_get_sf_retxBSRTimer(mac->scheduling_info.retxBSR_Timer);
+ }
+
+ // periodicBSR-Timer expires, trigger BSR
+ if ((mac->scheduling_info.periodicBSR_Timer != NR_BSR_Config__periodicBSR_Timer_infinity)
+ && (mac->scheduling_info.periodicBSR_SF == 0)) {
+ // Trigger BSR Periodic
+ mac->BSR_reporting_active |= NR_BSR_TRIGGER_PERIODIC;
+ LOG_D(NR_MAC, "[UE %d] MAC BSR Triggered PeriodicBSR Timer expiry at frame%d subframe %d TBS=%d\n",
+ module_idP, frameP, subframe, buflen);
+ }
+
+ //Compute BSR Length if Regular or Periodic BSR is triggered
+ //WARNING: if BSR long is computed, it may be changed to BSR short during or after multiplexing if there remains less than 1 LCGROUP with data after Tx
+ if (mac->BSR_reporting_active) {
+ AssertFatal((mac->BSR_reporting_active & NR_BSR_TRIGGER_PADDING) == 0,
+ "Inconsistent BSR Trigger=%d !\n",
+ mac->BSR_reporting_active);
+
+ //A Regular or Periodic BSR can only be sent if TBS is sufficient as transmitting only a BSR is not allowed if UE has data to transmit
+ if (num_lcg_id_with_data <= 1) {
+ if (buflen >= (sizeof(NR_BSR_SHORT)+sizeof(NR_MAC_SUBHEADER_FIXED)+1)) {
+ mac_ce_p->bsr_ce_len = sizeof(NR_BSR_SHORT); //1 byte
+ mac_ce_p->bsr_header_len = sizeof(NR_MAC_SUBHEADER_FIXED); //1 byte
+ }
+ } else {
+ if (buflen >= (num_lcg_id_with_data+1+sizeof(NR_MAC_SUBHEADER_SHORT)+1)) {
+ mac_ce_p->bsr_ce_len = num_lcg_id_with_data + 1; //variable size
+ mac_ce_p->bsr_header_len = sizeof(NR_MAC_SUBHEADER_SHORT); //2 bytes
+ }
+ }
+ }
+
+ mac_ce_p->bsr_len = mac_ce_p->bsr_ce_len + mac_ce_p->bsr_header_len;
+ return (mac_ce_p->bsr_len + mac_ce_p->phr_len);
+}
+
+/*
+nr_ue_get_sdu_mac_ce_post recalculates length and prepares the mac_ce field
+Need the following from mac_ce_p:
+ bsr_ce_len
+ bsr_len
+ sdu_length_total
+ total_mac_pdu_header_len
+Update the following in mac_ce_p:
+ bsr_ce_len
+ bsr_header_len
+ bsr_len
+ tot_mac_ce_len
+ total_mac_pdu_header_len
+ bsr_s
+ bsr_l
+ bsr_t
+*/
+void nr_ue_get_sdu_mac_ce_post(module_id_t module_idP,
+ int CC_id,
+ frame_t frameP,
+ sub_frame_t subframe,
+ uint8_t gNB_index,
+ uint8_t *ulsch_buffer,
+ uint16_t buflen,
+ NR_UE_MAC_CE_INFO *mac_ce_p) {
+ NR_UE_MAC_INST_t *mac = get_mac_inst(module_idP);
+
+ // Compute BSR Values and update Nb LCGID with data after multiplexing
+ unsigned short padding_len = 0;
+ uint8_t lcid = 0;
+ int lcg_id = 0;
+ int num_lcg_id_with_data = 0;
+ int lcg_id_bsr_trunc = 0;
+ for (lcg_id = 0; lcg_id < NR_MAX_NUM_LCGID; lcg_id++) {
+ if (mac_ce_p->bsr_ce_len == sizeof(NR_BSR_SHORT)) {
+ mac->scheduling_info.BSR[lcg_id] = nr_locate_BsrIndexByBufferSize(NR_SHORT_BSR_TABLE, NR_SHORT_BSR_TABLE_SIZE, mac->scheduling_info.BSR_bytes[lcg_id]);
+ } else {
+ mac->scheduling_info.BSR[lcg_id] = nr_locate_BsrIndexByBufferSize(NR_LONG_BSR_TABLE, NR_LONG_BSR_TABLE_SIZE, mac->scheduling_info.BSR_bytes[lcg_id]);
+ }
+ if (mac->scheduling_info.BSR_bytes[lcg_id]) {
+ num_lcg_id_with_data++;
+ lcg_id_bsr_trunc = lcg_id;
+ }
+ }
+
+ // TS 38.321 Section 5.4.5
+ // Check BSR padding: it is done after PHR according to Logical Channel Prioritization order
+ // Check for max padding size, ie MAC Hdr for last RLC PDU = 1
+ /* For Padding BSR:
+ - if the number of padding bits is equal to or larger than the size of the Short BSR plus its subheader but smaller than the size of the Long BSR plus its subheader:
+ - if more than one LCG has data available for transmission in the TTI where the BSR is transmitted: report Truncated BSR of the LCG with the highest priority logical channel with data available for transmission;
+ - else report Short BSR.
+ - else if the number of padding bits is equal to or larger than the size of the Long BSR plus its subheader, report Long BSR.
+ */
+ if (mac_ce_p->sdu_length_total) {
+ padding_len = buflen - (mac_ce_p->total_mac_pdu_header_len + mac_ce_p->sdu_length_total);
+ }
+
+ if ((padding_len) && (mac_ce_p->bsr_len == 0)) {
+ /* if the number of padding bits is equal to or larger than the size of the Long BSR plus its subheader, report Long BSR */
+ if (padding_len >= (num_lcg_id_with_data+1+sizeof(NR_MAC_SUBHEADER_SHORT))) {
+ mac_ce_p->bsr_ce_len = num_lcg_id_with_data + 1; //variable size
+ mac_ce_p->bsr_header_len = sizeof(NR_MAC_SUBHEADER_SHORT); //2 bytes
+ // Trigger BSR Padding
+ mac->BSR_reporting_active |= NR_BSR_TRIGGER_PADDING;
+ } else if (padding_len >= (sizeof(NR_BSR_SHORT)+sizeof(NR_MAC_SUBHEADER_FIXED))) {
+ mac_ce_p->bsr_ce_len = sizeof(NR_BSR_SHORT); //1 byte
+ mac_ce_p->bsr_header_len = sizeof(NR_MAC_SUBHEADER_FIXED); //1 byte
+
+ if (num_lcg_id_with_data > 1) {
+ // REPORT SHORT TRUNCATED BSR
+ //Get LCGID of highest priority LCID with data (todo)
+ for (lcid = DCCH; lcid < NR_MAX_NUM_LCID; lcid++) {
+ lcg_id = mac->scheduling_info.LCGID[lcid];
+ if ((lcg_id < NR_MAX_NUM_LCGID) && (mac->scheduling_info.BSR_bytes[lcg_id])) {
+ lcg_id_bsr_trunc = lcg_id;
+ }
+ }
+ } else {
+ //Report SHORT BSR, clear bsr_t
+ mac_ce_p->bsr_t = NULL;
+ }
+
+ // Trigger BSR Padding
+ mac->BSR_reporting_active |= NR_BSR_TRIGGER_PADDING;
+ }
+
+ mac_ce_p->bsr_len = mac_ce_p->bsr_header_len + mac_ce_p->bsr_ce_len;
+ mac_ce_p->tot_mac_ce_len += mac_ce_p->bsr_len;
+ mac_ce_p->total_mac_pdu_header_len += mac_ce_p->bsr_len;
+ }
+
+ //Fill BSR Infos
+ if (mac_ce_p->bsr_ce_len == 0) {
+ mac_ce_p->bsr_s = NULL;
+ mac_ce_p->bsr_l = NULL;
+ mac_ce_p->bsr_t = NULL;
+ } else if (mac_ce_p->bsr_header_len == sizeof(NR_MAC_SUBHEADER_SHORT)) {
+ mac_ce_p->bsr_s = NULL;
+ mac_ce_p->bsr_t = NULL;
+ mac_ce_p->bsr_l->Buffer_size0 = mac->scheduling_info.BSR[0];
+ mac_ce_p->bsr_l->Buffer_size1 = mac->scheduling_info.BSR[1];
+ mac_ce_p->bsr_l->Buffer_size2 = mac->scheduling_info.BSR[2];
+ mac_ce_p->bsr_l->Buffer_size3 = mac->scheduling_info.BSR[3];
+ mac_ce_p->bsr_l->Buffer_size4 = mac->scheduling_info.BSR[4];
+ mac_ce_p->bsr_l->Buffer_size5 = mac->scheduling_info.BSR[5];
+ mac_ce_p->bsr_l->Buffer_size6 = mac->scheduling_info.BSR[6];
+ mac_ce_p->bsr_l->Buffer_size7 = mac->scheduling_info.BSR[7];
+ LOG_D(NR_MAC, "[UE %d] Frame %d subframe %d BSR Trig=%d report LONG BSR (level LCGID0 %d,level LCGID1 %d,level LCGID2 %d,level LCGID3 %d level LCGID4 %d,level LCGID5 %d,level LCGID6 %d,level LCGID7 %d)\n",
+ module_idP, frameP, subframe,
+ mac->BSR_reporting_active,
+ mac->scheduling_info.BSR[0],
+ mac->scheduling_info.BSR[1],
+ mac->scheduling_info.BSR[2],
+ mac->scheduling_info.BSR[3],
+ mac->scheduling_info.BSR[4],
+ mac->scheduling_info.BSR[5],
+ mac->scheduling_info.BSR[6],
+ mac->scheduling_info.BSR[7]);
+ } else if (mac_ce_p->bsr_header_len == sizeof(NR_MAC_SUBHEADER_FIXED)) {
+ mac_ce_p->bsr_l = NULL;
+
+ if ((mac_ce_p->bsr_t != NULL) && (mac->BSR_reporting_active & NR_BSR_TRIGGER_PADDING)) {
+ //Truncated BSR
+ mac_ce_p->bsr_s = NULL;
+ mac_ce_p->bsr_t->LcgID = lcg_id_bsr_trunc;
+ mac_ce_p->bsr_t->Buffer_size = mac->scheduling_info.BSR[lcg_id_bsr_trunc];
+ LOG_D(NR_MAC, "[UE %d] Frame %d subframe %d BSR Trig=%d report TRUNCATED BSR with level %d for LCGID %d\n",
+ module_idP, frameP, subframe,
+ mac->BSR_reporting_active,
+ mac->scheduling_info.BSR[lcg_id_bsr_trunc], lcg_id_bsr_trunc);
+ } else {
+ mac_ce_p->bsr_t = NULL;
+ mac_ce_p->bsr_s->LcgID = lcg_id_bsr_trunc;
+ mac_ce_p->bsr_s->Buffer_size = mac->scheduling_info.BSR[lcg_id_bsr_trunc];
+ LOG_D(NR_MAC, "[UE %d] Frame %d subframe %d BSR Trig=%d report SHORT BSR with level %d for LCGID %d\n",
+ module_idP, frameP, subframe,
+ mac->BSR_reporting_active,
+ mac->scheduling_info.BSR[lcg_id_bsr_trunc], lcg_id_bsr_trunc);
+ }
+ }
+
+ LOG_D(NR_MAC, "[UE %d][SR] Gave SDU to PHY, clearing any scheduling request\n", module_idP);
+ mac->scheduling_info.SR_pending = 0;
+ mac->scheduling_info.SR_COUNTER = 0;
+
+ /* Actions when a BSR is sent */
+ if (mac_ce_p->bsr_ce_len) {
+ LOG_D(NR_MAC, "[UE %d] MAC BSR Sent !! bsr (ce%d,hdr%d) buff_len %d\n",
+ module_idP, mac_ce_p->bsr_ce_len, mac_ce_p->bsr_header_len, buflen);
+ // Reset ReTx BSR Timer
+ mac->scheduling_info.retxBSR_SF = nr_get_sf_retxBSRTimer(mac->scheduling_info.retxBSR_Timer);
+ LOG_D(NR_MAC, "[UE %d] MAC ReTx BSR Timer Reset =%d\n", module_idP, mac->scheduling_info.retxBSR_SF);
+
+ // Reset Periodic Timer except when BSR is truncated
+ if ((mac_ce_p->bsr_t == NULL) && (mac->scheduling_info.periodicBSR_Timer != NR_BSR_Config__periodicBSR_Timer_infinity)) {
+ mac->scheduling_info.periodicBSR_SF = nr_get_sf_periodicBSRTimer(mac->scheduling_info.periodicBSR_Timer);
+ LOG_D(NR_MAC, "[UE %d] MAC Periodic BSR Timer Reset =%d\n",
+ module_idP,
+ mac->scheduling_info.periodicBSR_SF);
+ }
+
+ // Reset BSR Trigger flags
+ mac->BSR_reporting_active = BSR_TRIGGER_NONE;
+ }
+}
/**
* Function: to fetch data to be transmitted from RLC, place it in the ULSCH PDU buffer
@@ -2061,31 +2645,45 @@ uint8_t nr_ue_get_sdu(module_id_t module_idP,
uint8_t gNB_index,
uint8_t *ulsch_buffer,
uint16_t buflen) {
-
+ NR_UE_MAC_CE_INFO mac_ce_info;
+ NR_UE_MAC_CE_INFO *mac_ce_p=&mac_ce_info;
int16_t buflen_remain = 0;
+ mac_ce_p->bsr_len = 0;
+ mac_ce_p->bsr_ce_len = 0;
+ mac_ce_p->bsr_header_len = 0;
+ mac_ce_p->phr_len = 0;
+ //mac_ce_p->phr_ce_len = 0;
+ //mac_ce_p->phr_header_len = 0;
+
uint8_t lcid = 0;
uint16_t sdu_length = 0;
uint16_t num_sdus = 0;
- uint16_t sdu_length_total = 0;
+ mac_ce_p->sdu_length_total = 0;
+ NR_BSR_SHORT bsr_short, bsr_truncated;
+ NR_BSR_LONG bsr_long;
+ mac_ce_p->bsr_s = &bsr_short;
+ mac_ce_p->bsr_l = &bsr_long;
+ mac_ce_p->bsr_t = &bsr_truncated;
+ //NR_POWER_HEADROOM_CMD phr;
+ //mac_ce_p->phr_p = &phr;
NR_UE_MAC_INST_t *mac = get_mac_inst(module_idP);
+ //int highest_priority = 16;
const uint8_t sh_size = sizeof(NR_MAC_SUBHEADER_LONG);
// Pointer used to build the MAC PDU by placing the RLC SDUs in the ULSCH buffer
uint8_t *pdu = ulsch_buffer;
- // Preparing the MAC CEs sub-PDUs and get the total size
- unsigned char mac_header_control_elements[16] = {0};
- int tot_mac_ce_len = nr_write_ce_ulsch_pdu(&mac_header_control_elements[0], mac);
- uint8_t total_mac_pdu_header_len = tot_mac_ce_len;
+ //nr_ue_get_sdu_mac_ce_pre updates all mac_ce related header field related to length
+ mac_ce_p->tot_mac_ce_len = nr_ue_get_sdu_mac_ce_pre(module_idP, CC_id, frameP, subframe, gNB_index, ulsch_buffer, buflen, mac_ce_p);
+ mac_ce_p->total_mac_pdu_header_len = mac_ce_p->tot_mac_ce_len;
LOG_D(NR_MAC, "In %s: [UE %d] [%d.%d] process UL transport block at with size TBS = %d bytes \n", __FUNCTION__, module_idP, frameP, subframe, buflen);
// Check for DCCH first
// TO DO: Multiplex in the order defined by the logical channel prioritization
- for (lcid = UL_SCH_LCID_SRB1;
- lcid < MAX_LCID; lcid++) {
+ for (lcid = UL_SCH_LCID_SRB1; lcid < MAX_LCID; lcid++) {
- buflen_remain = buflen - (total_mac_pdu_header_len + sdu_length_total + sh_size);
+ buflen_remain = buflen - (mac_ce_p->total_mac_pdu_header_len + mac_ce_p->sdu_length_total + sh_size);
LOG_D(NR_MAC, "In %s: [UE %d] [%d.%d] UL-DXCH -> ULSCH, RLC with LCID 0x%02x (TBS %d bytes, sdu_length_total %d bytes, MAC header len %d bytes, buflen_remain %d bytes)\n",
__FUNCTION__,
@@ -2094,8 +2692,8 @@ uint8_t nr_ue_get_sdu(module_id_t module_idP,
subframe,
lcid,
buflen,
- sdu_length_total,
- tot_mac_ce_len,
+ mac_ce_p->sdu_length_total,
+ mac_ce_p->tot_mac_ce_len,
buflen_remain);
while (buflen_remain > 0){
@@ -2125,7 +2723,7 @@ uint8_t nr_ue_get_sdu(module_id_t module_idP,
if (sdu_length > 0) {
- LOG_D(MAC, "In %s: Generating UL MAC sub-PDU for SDU %d, length %d bytes, RB with LCID 0x%02x (buflen (TBS) %d bytes)\n", __FUNCTION__,
+ LOG_D(NR_MAC, "In %s: Generating UL MAC sub-PDU for SDU %d, length %d bytes, RB with LCID 0x%02x (buflen (TBS) %d bytes)\n", __FUNCTION__,
num_sdus + 1,
sdu_length,
lcid,
@@ -2145,40 +2743,53 @@ uint8_t nr_ue_get_sdu(module_id_t module_idP,
#endif
pdu += sdu_length;
- sdu_length_total += sdu_length;
- total_mac_pdu_header_len += sh_size;
+ mac_ce_p->sdu_length_total += sdu_length;
+ mac_ce_p->total_mac_pdu_header_len += sh_size;
num_sdus++;
} else {
pdu -= sh_size;
- LOG_D(MAC, "In %s: no data to transmit for RB with LCID 0x%02x\n", __FUNCTION__, lcid);
+ LOG_D(NR_MAC, "In %s: no data to transmit for RB with LCID 0x%02x\n", __FUNCTION__, lcid);
break;
}
- buflen_remain = buflen - (total_mac_pdu_header_len + sdu_length_total + sh_size);
+ buflen_remain = buflen - (mac_ce_p->total_mac_pdu_header_len + mac_ce_p->sdu_length_total + sh_size);
+ //Update Buffer remain and BSR bytes after transmission
+ mac->scheduling_info.LCID_buffer_remain[lcid] -= sdu_length;
+ mac->scheduling_info.BSR_bytes[mac->scheduling_info.LCGID[lcid]] -= sdu_length;
+ LOG_D(NR_MAC, "[UE %d] Update BSR [%d.%d] BSR_bytes for LCG%d=%d\n",
+ module_idP, frameP, subframe, mac->scheduling_info.LCGID[lcid],
+ mac->scheduling_info.BSR_bytes[mac->scheduling_info.LCGID[lcid]]);
+ if (mac->scheduling_info.BSR_bytes[mac->scheduling_info.LCGID[lcid]] < 0)
+ mac->scheduling_info.BSR_bytes[mac->scheduling_info.LCGID[lcid]] = 0;
}
}
- if (tot_mac_ce_len > 0) {
+ //nr_ue_get_sdu_mac_ce_post recalculates all mac_ce related header fields since buffer has been changed after mac_rlc_data_req.
+ //Also, BSR padding is handled here after knowing mac_ce_p->sdu_length_total.
+ nr_ue_get_sdu_mac_ce_post(module_idP, CC_id, frameP, subframe, gNB_index, ulsch_buffer, buflen, mac_ce_p);
- LOG_D(NR_MAC, "In %s copying %d bytes of MAC CEs to the UL PDU \n", __FUNCTION__, tot_mac_ce_len);
- memcpy((void *) pdu, (void *) mac_header_control_elements, tot_mac_ce_len);
- pdu += (unsigned char) tot_mac_ce_len;
+ if (mac_ce_p->tot_mac_ce_len > 0) {
+
+ LOG_D(NR_MAC, "In %s copying %d bytes of MAC CEs to the UL PDU \n", __FUNCTION__, mac_ce_p->tot_mac_ce_len);
+ nr_write_ce_ulsch_pdu(pdu, mac, 0, NULL, mac_ce_p->bsr_t, mac_ce_p->bsr_s, mac_ce_p->bsr_l);
+ pdu += (unsigned char) mac_ce_p->tot_mac_ce_len;
#ifdef ENABLE_MAC_PAYLOAD_DEBUG
- LOG_I(NR_MAC, "In %s: dumping MAC CE with length tot_mac_ce_len %d: \n", __FUNCTION__, tot_mac_ce_len);
- log_dump(NR_MAC, mac_header_control_elements, tot_mac_ce_len, LOG_DUMP_CHAR, "\n");
+ LOG_I(NR_MAC, "In %s: dumping MAC CE with length tot_mac_ce_len %d: \n", __FUNCTION__, mac_ce_p->tot_mac_ce_len);
+ log_dump(NR_MAC, mac_header_control_elements, mac_ce_p->tot_mac_ce_len, LOG_DUMP_CHAR, "\n");
#endif
}
- buflen_remain = buflen - (total_mac_pdu_header_len + sdu_length_total);
+ buflen_remain = buflen - (mac_ce_p->total_mac_pdu_header_len + mac_ce_p->sdu_length_total);
// Compute final offset for padding and fill remainder of ULSCH with 0
if (buflen_remain > 0) {
+ LOG_D(NR_MAC, "In %s filling remainder %d bytes to the UL PDU \n", __FUNCTION__, buflen_remain);
((NR_MAC_SUBHEADER_FIXED *) pdu)->R = 0;
((NR_MAC_SUBHEADER_FIXED *) pdu)->LCID = UL_SCH_LCID_PADDING;
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
index c6752d37c2..71bab705ef 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
@@ -261,6 +261,8 @@ void schedule_nr_prach(module_id_t module_idP, frame_t frameP, sub_frame_t slotP
else
mu = scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing;
+ int bwp_start = NRRIV2PRBOFFSET(scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
+
uint8_t fdm = cfg->prach_config.num_prach_fd_occasions.value;
// prach is scheduled according to configuration index and tables 6.3.3.2.2 to 6.3.3.2.4
if ( get_nr_prach_info_from_index(config_index,
@@ -387,7 +389,7 @@ void schedule_nr_prach(module_id_t module_idP, frame_t frameP, sub_frame_t slotP
const int16_t N_RA_RB = get_N_RA_RB(cfg->prach_config.prach_sub_c_spacing.value, mu_pusch);
uint16_t *vrb_map_UL = &cc->vrb_map_UL[slotP * MAX_BWP_SIZE];
for (int i = 0; i < N_RA_RB * fdm; ++i)
- vrb_map_UL[rach_ConfigGeneric->msg1_FrequencyStart + i] = 0xff; // all symbols
+ vrb_map_UL[bwp_start + rach_ConfigGeneric->msg1_FrequencyStart + i] = 0xff; // all symbols
}
}
}
@@ -772,7 +774,6 @@ void nr_generate_Msg3_retransmission(module_id_t module_idP, int CC_id, frame_t
// generation of DCI 0_0 to schedule msg3 retransmission
NR_SearchSpace_t *ss = ra->ra_ss;
- NR_Type0_PDCCH_CSS_config_t *type0_PDCCH_CSS_config = *ss->controlResourceSetId==0 ? &nr_mac->type0_PDCCH_CSS_config[ra->beam_id] : NULL;
NR_ControlResourceSet_t *coreset = get_coreset(module_idP, scc, NULL, ss, NR_SearchSpace__searchSpaceType_PR_common);
AssertFatal(coreset!=NULL,"Coreset cannot be null for RA-Msg3 retransmission\n");
@@ -787,7 +788,7 @@ void nr_generate_Msg3_retransmission(module_id_t module_idP, int CC_id, frame_t
ul_dci_request_pdu->PDUSize = (uint8_t)(2+sizeof(nfapi_nr_dl_tti_pdcch_pdu));
pdcch_pdu_rel15 = &ul_dci_request_pdu->pdcch_pdu.pdcch_pdu_rel15;
ul_dci_req->numPdus += 1;
- nr_configure_pdcch(pdcch_pdu_rel15, ss, coreset, scc, genericParameters, type0_PDCCH_CSS_config);
+ nr_configure_pdcch(nr_mac, pdcch_pdu_rel15, ss, coreset, scc, genericParameters, NULL);
nr_mac->pdcch_pdu_idx[CC_id][ra->bwp_id][coresetid] = pdcch_pdu_rel15;
}
@@ -917,10 +918,19 @@ void nr_get_Msg3alloc(module_id_t module_id,
LOG_D(NR_MAC, "[RAPROC] Msg3 slot %d: current slot %u Msg3 frame %u k2 %u Msg3_tda_id %u start symbol index %u\n", ra->Msg3_slot, current_slot, ra->Msg3_frame, k2,ra->Msg3_tda_id, StartSymbolIndex);
uint16_t *vrb_map_UL =
&RC.nrmac[module_id]->common_channels[CC_id].vrb_map_UL[ra->Msg3_slot * MAX_BWP_SIZE];
- const uint16_t bwpSize = NRRIV2BW(ubwp ?
- ubwp->bwp_Common->genericParameters.locationAndBandwidth :
- scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth,
- MAX_BWP_SIZE);
+
+ int bwpSize = NRRIV2BW(scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
+ int bwpStart = NRRIV2PRBOFFSET(scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
+
+ if (ra->CellGroup) {
+ AssertFatal(ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count == 1,
+ "downlinkBWP_ToAddModList has %d BWP!\n", ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count);
+ NR_BWP_Uplink_t *ubwp = ra->CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[ra->bwp_id - 1];
+ int act_bwp_start = NRRIV2PRBOFFSET(ubwp->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
+ int act_bwp_size = NRRIV2BW(ubwp->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
+ if (!((bwpStart >= act_bwp_start) && ((bwpStart+bwpSize) <= (act_bwp_start+act_bwp_size))))
+ bwpStart = act_bwp_start;
+ }
/* search msg3_nb_rb free RBs */
int rbSize = 0;
@@ -928,16 +938,17 @@ void nr_get_Msg3alloc(module_id_t module_id,
while (rbSize < msg3_nb_rb) {
rbStart += rbSize; /* last iteration rbSize was not enough, skip it */
rbSize = 0;
- while (rbStart < bwpSize && vrb_map_UL[rbStart])
+ while (rbStart < bwpSize && vrb_map_UL[rbStart + bwpStart])
rbStart++;
AssertFatal(rbStart < bwpSize - msg3_nb_rb, "no space to allocate Msg 3 for RA!\n");
while (rbStart + rbSize < bwpSize
- && !vrb_map_UL[rbStart + rbSize]
+ && !vrb_map_UL[rbStart + bwpStart + rbSize]
&& rbSize < msg3_nb_rb)
rbSize++;
}
ra->msg3_nb_rb = msg3_nb_rb;
ra->msg3_first_rb = rbStart;
+ ra->msg3_bwp_start = bwpStart;
}
@@ -1023,12 +1034,12 @@ void nr_add_msg3(module_id_t module_idP, int CC_id, frame_t frameP, sub_frame_t
uint16_t *vrb_map_UL =
&RC.nrmac[module_idP]->common_channels[CC_id].vrb_map_UL[ra->Msg3_slot * MAX_BWP_SIZE];
for (int i = 0; i < ra->msg3_nb_rb; ++i) {
- AssertFatal(!vrb_map_UL[i + ra->msg3_first_rb],
+ AssertFatal(!vrb_map_UL[i + ra->msg3_first_rb + ra->msg3_bwp_start],
"RB %d in %4d.%2d is already taken, cannot allocate Msg3!\n",
i + ra->msg3_first_rb,
ra->Msg3_frame,
ra->Msg3_slot);
- vrb_map_UL[i + ra->msg3_first_rb] = 1;
+ vrb_map_UL[i + ra->msg3_first_rb + ra->msg3_bwp_start] = 1;
}
LOG_D(NR_MAC, "[gNB %d][RAPROC] Frame %d, Slot %d : CC_id %d RA is active, Msg3 in (%d,%d)\n", module_idP, frameP, slotP, CC_id, ra->Msg3_frame, ra->Msg3_slot);
@@ -1047,9 +1058,6 @@ void nr_add_msg3(module_id_t module_idP, int CC_id, frame_t frameP, sub_frame_t
memset(pusch_pdu, 0, sizeof(nfapi_nr_pusch_pdu_t));
int ibwp_size = NRRIV2BW(scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
- int ibwp_start = NRRIV2PRBOFFSET(scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
- int abwp_size = ibwp_size;
- int abwp_start = ibwp_start;
int scs = scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.subcarrierSpacing;
int fh = 0;
int startSymbolAndLength = scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list.array[ra->Msg3_tda_id]->startSymbolAndLength;
@@ -1062,8 +1070,6 @@ void nr_add_msg3(module_id_t module_idP, int CC_id, frame_t frameP, sub_frame_t
startSymbolAndLength = ubwp->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list.array[ra->Msg3_tda_id]->startSymbolAndLength;
mappingtype = ubwp->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list.array[ra->Msg3_tda_id]->mappingType;
- abwp_size = NRRIV2BW(ubwp->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
- abwp_start = NRRIV2PRBOFFSET(ubwp->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
scs = ubwp->bwp_Common->genericParameters.subcarrierSpacing;
fh = ubwp->bwp_Dedicated->pusch_Config->choice.setup->frequencyHopping ? 1 : 0;
}
@@ -1078,17 +1084,11 @@ void nr_add_msg3(module_id_t module_idP, int CC_id, frame_t frameP, sub_frame_t
ra->msg3_round,
ra->rnti);
- int bwp_start;
- if ((ibwp_start < abwp_start) || (ibwp_size > abwp_size))
- bwp_start = abwp_start;
- else
- bwp_start = ibwp_start;
-
fill_msg3_pusch_pdu(pusch_pdu,scc,
ra->msg3_round,
startSymbolAndLength,
ra->rnti, scs,
- ibwp_size, bwp_start,
+ ibwp_size, ra->msg3_bwp_start,
mappingtype, fh,
ra->msg3_first_rb, ra->msg3_nb_rb);
future_ul_tti_req->n_pdus += 1;
@@ -1150,7 +1150,7 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
uint16_t *vrb_map = cc[CC_id].vrb_map;
for (int i = 0; (i < rbSize) && (rbStart <= (BWPSize - rbSize)); i++) {
- if (vrb_map[rbStart + i]) {
+ if (vrb_map[BWPStart + rbStart + i]) {
rbStart += i;
i = 0;
}
@@ -1204,7 +1204,7 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
dl_tti_pdcch_pdu->PDUSize = (uint8_t)(2 + sizeof(nfapi_nr_dl_tti_pdcch_pdu));
dl_req->nPDUs += 1;
pdcch_pdu_rel15 = &dl_tti_pdcch_pdu->pdcch_pdu.pdcch_pdu_rel15;
- nr_configure_pdcch(pdcch_pdu_rel15, ss, coreset, scc, genericParameters, type0_PDCCH_CSS_config);
+ nr_configure_pdcch(nr_mac, pdcch_pdu_rel15, ss, coreset, scc, genericParameters, NULL);
nr_mac->pdcch_pdu_idx[CC_id][bwpid][coresetid] = pdcch_pdu_rel15;
}
@@ -1364,7 +1364,7 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
// Mark the corresponding RBs as used
for (int rb = 0; rb < rbSize; rb++) {
- vrb_map[rb + rbStart] = 1;
+ vrb_map[BWPStart + rb + rbStart] = 1;
}
ra->state = WAIT_Msg3;
@@ -1547,7 +1547,7 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
int i = 0;
while ((i < rbSize) && (rbStart + rbSize <= BWPSize)) {
- if (vrb_map[rbStart + i]) {
+ if (vrb_map[BWPStart + rbStart + i]) {
rbStart += i+1;
i = 0;
} else {
@@ -1580,7 +1580,7 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
dl_tti_pdcch_pdu->PDUSize = (uint8_t)(2 + sizeof(nfapi_nr_dl_tti_pdcch_pdu));
dl_req->nPDUs += 1;
pdcch_pdu_rel15 = &dl_tti_pdcch_pdu->pdcch_pdu.pdcch_pdu_rel15;
- nr_configure_pdcch(pdcch_pdu_rel15, ss, coreset, scc, genericParameters, type0_PDCCH_CSS_config);
+ nr_configure_pdcch(nr_mac, pdcch_pdu_rel15, ss, coreset, scc, genericParameters, NULL);
nr_mac->pdcch_pdu_idx[CC_id][bwpid][coresetid] = pdcch_pdu_rel15;
}
@@ -1723,7 +1723,7 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
// Mark the corresponding RBs as used
for (int rb = 0; rb < pdsch_pdu_rel15->rbSize; rb++) {
- vrb_map[rb + pdsch_pdu_rel15->rbStart] = 1;
+ vrb_map[BWPStart + rb + pdsch_pdu_rel15->rbStart] = 1;
}
LOG_D(NR_MAC,"BWPSize: %i\n", pdcch_pdu_rel15->BWPSize);
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c
index 79f6dbee1b..df25b085e6 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c
@@ -60,22 +60,21 @@ uint16_t get_ssboffset_pointa(NR_ServingCellConfigCommon_t *scc,const long band)
int ratio;
switch (*scc->ssbSubcarrierSpacing) {
case NR_SubcarrierSpacing_kHz15:
- AssertFatal(band <= 79,
+ AssertFatal(band <= 95,
"Band %ld is not possible for SSB with 15 kHz SCS\n",
band);
- if (band < 77) // below 3GHz
- ratio = 3; // NRARFCN step is 5 kHz
- else
- ratio = 1; // NRARFCN step is 15 kHz
+ // no band available above 3GHz using 15kHz
+ ratio = 3; // NRARFCN step is 5 kHz
break;
case NR_SubcarrierSpacing_kHz30:
- AssertFatal(band <= 79,
- "Band %ld is not possible for SSB with 15 kHz SCS\n",
+ AssertFatal(band <= 96,
+ "Band %ld is not possible for SSB with 30 kHz SCS\n",
band);
- if (band < 77) // below 3GHz
- ratio = 6; // NRARFCN step is 5 kHz
+ if (band == 46 || band == 48 || band == 77 ||
+ band == 78 || band == 79 || band == 96) // above 3GHz
+ ratio = 2; // NRARFCN step is 15 kHz
else
- ratio = 2; // NRARFCN step is 15 kHz
+ ratio = 6; // NRARFCN step is 5 kHz
break;
case NR_SubcarrierSpacing_kHz120:
AssertFatal(band >= 257,
@@ -339,6 +338,8 @@ uint32_t schedule_control_sib1(module_id_t module_id,
gNB_mac->sched_ctrlCommon->coreset = calloc(1,sizeof(*gNB_mac->sched_ctrlCommon->coreset));
fill_searchSpaceZero(gNB_mac->sched_ctrlCommon->search_space,type0_PDCCH_CSS_config);
fill_coresetZero(gNB_mac->sched_ctrlCommon->coreset,type0_PDCCH_CSS_config);
+ gNB_mac->cset0_bwp_start = type0_PDCCH_CSS_config->cset_start_rb;
+ gNB_mac->cset0_bwp_size = type0_PDCCH_CSS_config->num_rbs;
}
gNB_mac->sched_ctrlCommon->pdsch_semi_static.time_domain_allocation = time_domain_allocation;
@@ -436,7 +437,8 @@ void nr_fill_nfapi_dl_sib1_pdu(int Mod_idP,
dl_tti_pdcch_pdu->PDUSize = (uint8_t)(2+sizeof(nfapi_nr_dl_tti_pdcch_pdu));
dl_req->nPDUs += 1;
nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu_rel15 = &dl_tti_pdcch_pdu->pdcch_pdu.pdcch_pdu_rel15;
- nr_configure_pdcch(pdcch_pdu_rel15,
+ nr_configure_pdcch(NULL,
+ pdcch_pdu_rel15,
gNB_mac->sched_ctrlCommon->search_space,
gNB_mac->sched_ctrlCommon->coreset,
scc,
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
index 6ecf62c47b..f48f2d80e4 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
@@ -446,7 +446,7 @@ void nr_store_dlsch_buffer(module_id_t module_id,
if (sched_ctrl->num_total_bytes == 0
&& !sched_ctrl->ta_apply) /* If TA should be applied, give at least one RB */
- return;
+ continue;
LOG_D(NR_MAC,
"[%s][%d.%d], %s%d->DLSCH, RLC status %d bytes TA %d\n",
@@ -481,7 +481,7 @@ bool allocate_dl_retransmission(module_id_t module_id,
&RC.nrmac[module_id]->common_channels[0].ServingCellConfigCommon->downlinkConfigCommon->initialDownlinkBWP->genericParameters;
const uint16_t bwpSize = NRRIV2BW(genericParameters->locationAndBandwidth, MAX_BWP_SIZE);
- int rbStart = NRRIV2PRBOFFSET(genericParameters->locationAndBandwidth, MAX_BWP_SIZE);
+ int rbStart = 0; // start wrt BWPstart
NR_pdsch_semi_static_t *ps = &sched_ctrl->pdsch_semi_static;
const long f = (sched_ctrl->active_bwp ||bwpd) ? sched_ctrl->search_space->searchSpaceType->choice.ue_Specific->dci_Formats : 0;
@@ -671,7 +671,7 @@ void pf_dl(module_id_t module_id,
&scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters;
const uint16_t bwpSize = NRRIV2BW(genericParameters->locationAndBandwidth,MAX_BWP_SIZE);
- int rbStart = NRRIV2PRBOFFSET(genericParameters->locationAndBandwidth, MAX_BWP_SIZE);
+ int rbStart = 0; // start wrt BWPstart
/* Find a free CCE */
bool freeCCE = find_free_CCE(module_id, slot, UE_id);
@@ -760,6 +760,10 @@ void nr_fr1_dlsch_preprocessor(module_id_t module_id, frame_t frame, sub_frame_t
sched_ctrl->active_bwp->bwp_Common->genericParameters.locationAndBandwidth:
scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth,
MAX_BWP_SIZE);
+ const uint16_t BWPStart = NRRIV2PRBOFFSET(sched_ctrl->active_bwp ?
+ sched_ctrl->active_bwp->bwp_Common->genericParameters.locationAndBandwidth:
+ scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth,
+ MAX_BWP_SIZE);
uint16_t *vrb_map = RC.nrmac[module_id]->common_channels[CC_id].vrb_map;
uint8_t rballoc_mask[bwpSize];
@@ -767,7 +771,7 @@ void nr_fr1_dlsch_preprocessor(module_id_t module_id, frame_t frame, sub_frame_t
for (int i = 0; i < bwpSize; i++) {
// calculate mask: init with "NOT" vrb_map:
// if any RB in vrb_map is blocked (1), the current RBG will be 0
- rballoc_mask[i] = !vrb_map[i];
+ rballoc_mask[i] = !vrb_map[i+BWPStart];
n_rb_sched += rballoc_mask[i];
}
@@ -934,7 +938,7 @@ void nr_schedule_ue_spec(module_id_t module_id,
LOG_D(NR_MAC,"Trying to configure DL pdcch for UE %d, bwp %d, cs %d\n",UE_id,bwpid,coresetid);
NR_SearchSpace_t *ss = (bwp||bwpd) ? sched_ctrl->search_space:gNB_mac->sched_ctrlCommon->search_space;
NR_ControlResourceSet_t *coreset = (bwp||bwpd)? sched_ctrl->coreset:gNB_mac->sched_ctrlCommon->coreset;
- nr_configure_pdcch(pdcch_pdu, ss, coreset, scc, genericParameters, NULL);
+ nr_configure_pdcch(gNB_mac, pdcch_pdu, ss, coreset, scc, genericParameters, NULL);
gNB_mac->pdcch_pdu_idx[CC_id][bwpid][coresetid] = pdcch_pdu;
}
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c
index 976a883455..f1005cea70 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c
@@ -280,6 +280,7 @@ void nr_preprocessor_phytest(module_id_t module_id,
NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
/* find largest unallocated chunk */
const int bwpSize = NRRIV2BW(sched_ctrl->active_bwp->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
+ const int BWPStart = NRRIV2PRBOFFSET(sched_ctrl->active_bwp->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
int rbStart = 0;
int rbSize = 0;
if (target_dl_bw>bwpSize)
@@ -288,11 +289,11 @@ void nr_preprocessor_phytest(module_id_t module_id,
/* loop ensures that we allocate exactly target_dl_bw, or return */
while (true) {
/* advance to first free RB */
- while (rbStart < bwpSize && vrb_map[rbStart])
+ while (rbStart < bwpSize && vrb_map[rbStart + BWPStart])
rbStart++;
rbSize = 1;
/* iterate until we are at target_dl_bw or no available RBs */
- while (rbStart + rbSize < bwpSize && !vrb_map[rbStart + rbSize] && rbSize < target_dl_bw)
+ while (rbStart + rbSize < bwpSize && !vrb_map[rbStart + rbSize + BWPStart] && rbSize < target_dl_bw)
rbSize++;
/* found target_dl_bw? */
if (rbSize == target_dl_bw)
@@ -397,7 +398,7 @@ void nr_preprocessor_phytest(module_id_t module_id,
/* mark the corresponding RBs as used */
for (int rb = 0; rb < sched_pdsch->rbSize; rb++)
- vrb_map[rb + sched_pdsch->rbStart] = 1;
+ vrb_map[rb + sched_pdsch->rbStart + BWPStart] = 1;
if ((frame&127) == 0) LOG_D(MAC,"phytest: %d.%d DL mcs %d, DL rbStart %d, DL rbSize %d\n", frame, slot, sched_pdsch->mcs, rbStart,rbSize);
}
@@ -459,8 +460,11 @@ bool nr_ul_preprocessor_phytest(module_id_t module_id, frame_t frame, sub_frame_
uint16_t rbSize;
const int bw = NRRIV2BW(sched_ctrl->active_ubwp ?
- sched_ctrl->active_ubwp->bwp_Common->genericParameters.locationAndBandwidth :
- scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
+ sched_ctrl->active_ubwp->bwp_Common->genericParameters.locationAndBandwidth :
+ scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
+ const int BWPStart = NRRIV2PRBOFFSET(sched_ctrl->active_ubwp ?
+ sched_ctrl->active_ubwp->bwp_Common->genericParameters.locationAndBandwidth :
+ scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
if (target_ul_bw>bw)
rbSize = bw;
@@ -471,7 +475,7 @@ bool nr_ul_preprocessor_phytest(module_id_t module_id, frame_t frame, sub_frame_
&RC.nrmac[module_id]->common_channels[CC_id].vrb_map_UL[sched_slot * MAX_BWP_SIZE];
const uint16_t symb = ((1 << ps->nrOfSymbols) - 1) << ps->startSymbolIndex;
for (int i = rbStart; i < rbStart + rbSize; ++i) {
- if ((vrb_map_UL[i] & symb) != 0) {
+ if ((vrb_map_UL[i+BWPStart] & symb) != 0) {
LOG_E(MAC,
"%s(): %4d.%2d RB %d is already reserved, cannot schedule UE\n",
__func__,
@@ -540,6 +544,6 @@ bool nr_ul_preprocessor_phytest(module_id_t module_id, frame_t frame, sub_frame_
/* mark the corresponding RBs as used */
for (int rb = rbStart; rb < rbStart + rbSize; rb++)
- vrb_map_UL[rb] = 1;
+ vrb_map_UL[rb+BWPStart] = 1;
return true;
}
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
index c20055507e..7387bfe698 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
@@ -723,7 +723,8 @@ int nr_get_default_pucch_res(int pucch_ResourceCommon) {
return(default_pucch_csset[pucch_ResourceCommon]);
}
-void nr_configure_pdcch(nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu,
+void nr_configure_pdcch(gNB_MAC_INST *gNB_mac,
+ nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu,
NR_SearchSpace_t *ss,
NR_ControlResourceSet_t *coreset,
NR_ServingCellConfigCommon_t *scc,
@@ -731,9 +732,19 @@ void nr_configure_pdcch(nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu,
NR_Type0_PDCCH_CSS_config_t *type0_PDCCH_CSS_config) {
int sps;
- if (bwp && *ss->controlResourceSetId!=0) { // This is not for coreset0
- pdcch_pdu->BWPSize = NRRIV2BW(bwp->locationAndBandwidth, MAX_BWP_SIZE);
- pdcch_pdu->BWPStart = NRRIV2PRBOFFSET(bwp->locationAndBandwidth, MAX_BWP_SIZE);
+ AssertFatal(*ss->controlResourceSetId == coreset->controlResourceSetId,
+ "coreset id in SS %ld does not correspond to the one in coreset %ld",
+ *ss->controlResourceSetId, coreset->controlResourceSetId);
+
+ if (bwp) { // This is not for SIB1
+ if(coreset->controlResourceSetId == 0){
+ pdcch_pdu->BWPSize = gNB_mac->cset0_bwp_size;
+ pdcch_pdu->BWPStart = gNB_mac->cset0_bwp_start;
+ }
+ else {
+ pdcch_pdu->BWPSize = NRRIV2BW(bwp->locationAndBandwidth, MAX_BWP_SIZE);
+ pdcch_pdu->BWPStart = NRRIV2PRBOFFSET(bwp->locationAndBandwidth, MAX_BWP_SIZE);
+ }
pdcch_pdu->SubcarrierSpacing = bwp->subcarrierSpacing;
pdcch_pdu->CyclicPrefix = (bwp->cyclicPrefix==NULL) ? 0 : *bwp->cyclicPrefix;
@@ -2257,20 +2268,20 @@ void nr_csirs_scheduling(int Mod_idP,
csirs_pdu_rel15->row = 1;
csirs_pdu_rel15->freq_domain = ((resourceMapping.frequencyDomainAllocation.choice.row1.buf[0])>>4)&0x0f;
for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
- vrb_map[rb] |= (1 << csirs_pdu_rel15->symb_l0);
+ vrb_map[rb+csirs_pdu_rel15->bwp_start] |= (1 << csirs_pdu_rel15->symb_l0);
break;
case NR_CSI_RS_ResourceMapping__frequencyDomainAllocation_PR_row2:
csirs_pdu_rel15->row = 2;
csirs_pdu_rel15->freq_domain = (((resourceMapping.frequencyDomainAllocation.choice.row2.buf[1]>>4)&0x0f) |
((resourceMapping.frequencyDomainAllocation.choice.row2.buf[0]<<8)&0xff0));
for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
- vrb_map[rb] |= (1 << csirs_pdu_rel15->symb_l0);
+ vrb_map[rb+csirs_pdu_rel15->bwp_start] |= (1 << csirs_pdu_rel15->symb_l0);
break;
case NR_CSI_RS_ResourceMapping__frequencyDomainAllocation_PR_row4:
csirs_pdu_rel15->row = 4;
csirs_pdu_rel15->freq_domain = ((resourceMapping.frequencyDomainAllocation.choice.row4.buf[0])>>5)&0x07;
for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
- vrb_map[rb] |= (1 << csirs_pdu_rel15->symb_l0);
+ vrb_map[rb+csirs_pdu_rel15->bwp_start] |= (1 << csirs_pdu_rel15->symb_l0);
break;
case NR_CSI_RS_ResourceMapping__frequencyDomainAllocation_PR_other:
csirs_pdu_rel15->freq_domain = ((resourceMapping.frequencyDomainAllocation.choice.other.buf[0])>>2)&0x3f;
@@ -2281,18 +2292,18 @@ void nr_csirs_scheduling(int Mod_idP,
case NR_CSI_RS_ResourceMapping__nrofPorts_p2:
csirs_pdu_rel15->row = 3;
for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
- vrb_map[rb] |= (1 << csirs_pdu_rel15->symb_l0);
+ vrb_map[rb+csirs_pdu_rel15->bwp_start] |= (1 << csirs_pdu_rel15->symb_l0);
break;
case NR_CSI_RS_ResourceMapping__nrofPorts_p4:
csirs_pdu_rel15->row = 5;
for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
- vrb_map[rb] |= ((1 << csirs_pdu_rel15->symb_l0) | (2 << csirs_pdu_rel15->symb_l0));
+ vrb_map[rb+csirs_pdu_rel15->bwp_start] |= ((1 << csirs_pdu_rel15->symb_l0) | (2 << csirs_pdu_rel15->symb_l0));
break;
case NR_CSI_RS_ResourceMapping__nrofPorts_p8:
if (resourceMapping.cdm_Type == NR_CSI_RS_ResourceMapping__cdm_Type_cdm4_FD2_TD2) {
csirs_pdu_rel15->row = 8;
for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
- vrb_map[rb] |= ((1 << csirs_pdu_rel15->symb_l0) | (2 << csirs_pdu_rel15->symb_l0));
+ vrb_map[rb+csirs_pdu_rel15->bwp_start] |= ((1 << csirs_pdu_rel15->symb_l0) | (2 << csirs_pdu_rel15->symb_l0));
}
else{
int num_k = 0;
@@ -2301,12 +2312,12 @@ void nr_csirs_scheduling(int Mod_idP,
if(num_k==4) {
csirs_pdu_rel15->row = 6;
for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
- vrb_map[rb] |= (1 << csirs_pdu_rel15->symb_l0);
+ vrb_map[rb+csirs_pdu_rel15->bwp_start] |= (1 << csirs_pdu_rel15->symb_l0);
}
else {
csirs_pdu_rel15->row = 7;
for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
- vrb_map[rb] |= ((1 << csirs_pdu_rel15->symb_l0) | (2 << csirs_pdu_rel15->symb_l0));
+ vrb_map[rb+csirs_pdu_rel15->bwp_start] |= ((1 << csirs_pdu_rel15->symb_l0) | (2 << csirs_pdu_rel15->symb_l0));
}
}
break;
@@ -2314,12 +2325,12 @@ void nr_csirs_scheduling(int Mod_idP,
if (resourceMapping.cdm_Type == NR_CSI_RS_ResourceMapping__cdm_Type_cdm4_FD2_TD2) {
csirs_pdu_rel15->row = 10;
for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
- vrb_map[rb] |= ((1 << csirs_pdu_rel15->symb_l0) | (2 << csirs_pdu_rel15->symb_l0));
+ vrb_map[rb+csirs_pdu_rel15->bwp_start] |= ((1 << csirs_pdu_rel15->symb_l0) | (2 << csirs_pdu_rel15->symb_l0));
}
else {
csirs_pdu_rel15->row = 9;
for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
- vrb_map[rb] |= (1 << csirs_pdu_rel15->symb_l0);
+ vrb_map[rb+csirs_pdu_rel15->bwp_start] |= (1 << csirs_pdu_rel15->symb_l0);
}
break;
case NR_CSI_RS_ResourceMapping__nrofPorts_p16:
@@ -2328,24 +2339,24 @@ void nr_csirs_scheduling(int Mod_idP,
else
csirs_pdu_rel15->row = 11;
for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
- vrb_map[rb] |= ((1 << csirs_pdu_rel15->symb_l0) | (2 << csirs_pdu_rel15->symb_l0));
+ vrb_map[rb+csirs_pdu_rel15->bwp_start] |= ((1 << csirs_pdu_rel15->symb_l0) | (2 << csirs_pdu_rel15->symb_l0));
break;
case NR_CSI_RS_ResourceMapping__nrofPorts_p24:
if (resourceMapping.cdm_Type == NR_CSI_RS_ResourceMapping__cdm_Type_cdm4_FD2_TD2) {
csirs_pdu_rel15->row = 14;
for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
- vrb_map[rb] |= ((3 << csirs_pdu_rel15->symb_l0) | (3 << csirs_pdu_rel15->symb_l1));
+ vrb_map[rb+csirs_pdu_rel15->bwp_start] |= ((3 << csirs_pdu_rel15->symb_l0) | (3 << csirs_pdu_rel15->symb_l1));
}
else{
if (resourceMapping.cdm_Type == NR_CSI_RS_ResourceMapping__cdm_Type_cdm8_FD2_TD4) {
csirs_pdu_rel15->row = 15;
for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
- vrb_map[rb] |= (7 << csirs_pdu_rel15->symb_l0);
+ vrb_map[rb+csirs_pdu_rel15->bwp_start] |= (7 << csirs_pdu_rel15->symb_l0);
}
else {
csirs_pdu_rel15->row = 13;
for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
- vrb_map[rb] |= ((3 << csirs_pdu_rel15->symb_l0) | (3 << csirs_pdu_rel15->symb_l1));
+ vrb_map[rb+csirs_pdu_rel15->bwp_start] |= ((3 << csirs_pdu_rel15->symb_l0) | (3 << csirs_pdu_rel15->symb_l1));
}
}
break;
@@ -2353,18 +2364,18 @@ void nr_csirs_scheduling(int Mod_idP,
if (resourceMapping.cdm_Type == NR_CSI_RS_ResourceMapping__cdm_Type_cdm4_FD2_TD2) {
csirs_pdu_rel15->row = 17;
for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
- vrb_map[rb] |= ((3 << csirs_pdu_rel15->symb_l0) | (3 << csirs_pdu_rel15->symb_l1));
+ vrb_map[rb+csirs_pdu_rel15->bwp_start] |= ((3 << csirs_pdu_rel15->symb_l0) | (3 << csirs_pdu_rel15->symb_l1));
}
else{
if (resourceMapping.cdm_Type == NR_CSI_RS_ResourceMapping__cdm_Type_cdm8_FD2_TD4) {
csirs_pdu_rel15->row = 18;
for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
- vrb_map[rb] |= (7 << csirs_pdu_rel15->symb_l0);
+ vrb_map[rb+csirs_pdu_rel15->bwp_start] |= (7 << csirs_pdu_rel15->symb_l0);
}
else {
csirs_pdu_rel15->row = 16;
for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
- vrb_map[rb] |= ((3 << csirs_pdu_rel15->symb_l0) | (3 << csirs_pdu_rel15->symb_l1));
+ vrb_map[rb+csirs_pdu_rel15->bwp_start] |= ((3 << csirs_pdu_rel15->symb_l0) | (3 << csirs_pdu_rel15->symb_l1));
}
}
break;
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c
index f2ce8498fd..e226a2992d 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c
@@ -294,6 +294,7 @@ uint8_t compute_ri_bitlen(struct NR_CSI_ReportConfig *csi_reportconfig,
}
else
AssertFatal(1==0,"Other configurations not yet implemented\n");
+ return -1;
}
void compute_li_bitlen(struct NR_CSI_ReportConfig *csi_reportconfig,
@@ -520,6 +521,11 @@ void nr_csi_meas_reporting(int Mod_idP,
curr_pucch->csi_bits +=
nr_get_csi_bitlen(Mod_idP,UE_id,csi_report_id);
+ NR_BWP_t *genericParameters = sched_ctrl->active_ubwp ?
+ &sched_ctrl->active_ubwp->bwp_Common->genericParameters:
+ &scc->uplinkConfigCommon->initialUplinkBWP->genericParameters;
+ int bwp_start = NRRIV2PRBOFFSET(genericParameters->locationAndBandwidth,MAX_BWP_SIZE);
+
// going through the list of PUCCH resources to find the one indexed by resource_id
uint16_t *vrb_map_UL = &RC.nrmac[Mod_idP]->common_channels[0].vrb_map_UL[sched_slot * MAX_BWP_SIZE];
const int m = pucch_Config->resourceToAddModList->list.count;
@@ -550,7 +556,7 @@ void nr_csi_meas_reporting(int Mod_idP,
}
// verify resources are free
for (int i = start; i < start + len; ++i) {
- vrb_map_UL[i] |= mask;
+ vrb_map_UL[i+bwp_start] |= mask;
}
}
}
@@ -1390,18 +1396,32 @@ int nr_acknack_scheduling(int mod_id,
pucch_Config = RC.nrmac[mod_id]->UE_info.CellGroup[UE_id]->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup;
}
+ NR_BWP_t *genericParameters = sched_ctrl->active_ubwp ?
+ &sched_ctrl->active_ubwp->bwp_Common->genericParameters:
+ &scc->uplinkConfigCommon->initialUplinkBWP->genericParameters;
+ int bwp_start = NRRIV2PRBOFFSET(genericParameters->locationAndBandwidth,MAX_BWP_SIZE);
+
/* verify that at that slot and symbol, resources are free. We only do this
* for initialCyclicShift 0 (we assume it always has that one), so other
* initialCyclicShifts can overlap with ICS 0!*/
if (pucch_Config) {
const NR_PUCCH_Resource_t *resource = pucch_Config->resourceToAddModList->list.array[pucch->resource_indicator];
DevAssert(resource->format.present == NR_PUCCH_Resource__format_PR_format0);
+ int second_hop_prb = resource->secondHopPRB!= NULL ? *resource->secondHopPRB : 0;
+ int nr_of_symbols = resource->format.choice.format0->nrofSymbols;
if (resource->format.choice.format0->initialCyclicShift == 0) {
uint16_t *vrb_map_UL = &RC.nrmac[mod_id]->common_channels[CC_id].vrb_map_UL[pucch->ul_slot * MAX_BWP_SIZE];
- const uint16_t symb = 1 << resource->format.choice.format0->startingSymbolIndex;
- if ((vrb_map_UL[resource->startingPRB] & symb) != 0)
- LOG_W(NR_MAC, "symbol 0x%x is not free for PUCCH alloc in vrb_map_UL at RB %ld and slot %d.%d\n", symb, resource->startingPRB, pucch->frame, pucch->ul_slot);
- vrb_map_UL[resource->startingPRB] |= symb;
+ for (int l=0; lformat.choice.format0->startingSymbolIndex + l);
+ int prb;
+ if (l==1 && second_hop_prb != 0)
+ prb = second_hop_prb;
+ else
+ prb = resource->startingPRB;
+ if ((vrb_map_UL[bwp_start+prb] & symb) != 0)
+ LOG_W(MAC, "symbol 0x%x is not free for PUCCH alloc in vrb_map_UL at RB %ld and slot %d.%d\n", symb, resource->startingPRB, pucch->frame, pucch->ul_slot);
+ vrb_map_UL[bwp_start+prb] |= symb;
+ }
}
}
return 0;
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
index 51192b4d63..9a6fa32b5f 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
@@ -34,34 +34,7 @@
#include "common/utils/nr/nr_common.h"
#include
-
-//38.321 Table 6.1.3.1-1
-const uint32_t NR_SHORT_BSR_TABLE[32] = {
- 0, 10, 14, 20, 28, 38, 53, 74,
- 102, 142, 198, 276, 384, 535, 745, 1038,
- 1446, 2014, 2806, 3909, 5446, 7587, 10570, 14726,
-20516, 28581, 39818, 55474, 77284, 107669, 150000, 300000
-};
-
-//38.321 Table 6.1.3.1-2
-const uint32_t NR_LONG_BSR_TABLE[256] ={
- 0, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 23, 25, 26,
- 28, 30, 32, 34, 36, 38, 40, 43, 46, 49, 52, 55, 59, 62, 66, 71,
- 75, 80, 85, 91, 97, 103, 110, 117, 124, 132, 141, 150, 160, 170, 181, 193,
- 205, 218, 233, 248, 264, 281, 299, 318, 339, 361, 384, 409, 436, 464, 494, 526,
- 560, 597, 635, 677, 720, 767, 817, 870, 926, 987, 1051, 1119, 1191, 1269, 1351, 1439,
- 1532, 1631, 1737, 1850, 1970, 2098, 2234, 2379, 2533, 2698, 2873, 3059, 3258, 3469, 3694, 3934,
- 4189, 4461, 4751, 5059, 5387, 5737, 6109, 6506, 6928, 7378, 7857, 8367, 8910, 9488, 10104, 10760,
- 11458, 12202, 12994, 13838, 14736, 15692, 16711, 17795, 18951, 20181, 21491, 22885, 24371, 25953, 27638, 29431,
- 31342, 33376, 35543, 37850, 40307, 42923, 45709, 48676, 51836, 55200, 58784, 62599, 66663, 70990, 75598, 80505,
- 85730, 91295, 97221, 103532, 110252, 117409, 125030, 133146, 141789, 150992, 160793, 171231, 182345, 194182, 206786, 220209,
- 234503, 249725, 265935, 283197, 301579, 321155, 342002, 364202, 387842, 413018, 439827, 468377, 498780, 531156, 565634, 602350,
- 641449, 683087, 727427, 774645, 824928, 878475, 935498, 996222, 1060888, 1129752, 1203085, 1281179, 1364342, 1452903, 1547213, 1647644,
- 1754595, 1868488, 1989774, 2118933, 2256475, 2402946, 2558924, 2725027, 2901912, 3090279, 3290873, 3504487, 3731968, 3974215, 4232186, 4506902,
- 4799451, 5110989, 5442750, 5796046, 6172275, 6572925, 6999582, 7453933, 7937777, 8453028, 9001725, 9586039, 10208280, 10870913, 11576557, 12328006,
-13128233, 13980403, 14887889, 15854280, 16883401, 17979324, 19146385, 20389201, 21712690, 23122088, 24622972, 26221280, 27923336, 29735875, 31666069, 33721553,
-35910462, 38241455, 40723756, 43367187, 46182206, 49179951, 52372284, 55771835, 59392055, 63247269, 67352729, 71724679, 76380419, 81338368, 162676736, 4294967295
-};
+#include "LAYER2/NR_MAC_COMMON/nr_mac_extern.h"
int get_dci_format(NR_UE_sched_ctrl_t *sched_ctrl) {
@@ -896,7 +869,7 @@ bool nr_UE_is_to_be_scheduled(module_id_t mod_id, int CC_id, int UE_id, frame_t
* (2) there is a scheduling request
* (3) or we did not schedule it in more than 10 frames */
const bool has_data = sched_ctrl->estimated_ul_buffer > sched_ctrl->sched_ul_bytes;
- const bool high_inactivity = diff >= nrmac->ulsch_max_slots_inactivity;
+ const bool high_inactivity = diff >= nrmac->ulsch_max_frame_inactivity * n;
LOG_D(NR_MAC,
"%4d.%2d UL inactivity %d slots has_data %d SR %d\n",
frame,
@@ -930,7 +903,7 @@ bool allocate_ul_retransmission(module_id_t module_id,
NR_CellGroupConfig_t *cg = UE_info->CellGroup[UE_id];
NR_BWP_UplinkDedicated_t *ubwpd= cg ? cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP:NULL;
NR_BWP_t *genericParameters = sched_ctrl->active_ubwp ? &sched_ctrl->active_ubwp->bwp_Common->genericParameters : &scc->uplinkConfigCommon->initialUplinkBWP->genericParameters;
- int rbStart = sched_ctrl->active_ubwp ? NRRIV2PRBOFFSET(genericParameters->locationAndBandwidth, MAX_BWP_SIZE) : 0;
+ int rbStart = 0; // wrt BWP start
const uint16_t bwpSize = NRRIV2BW(genericParameters->locationAndBandwidth, MAX_BWP_SIZE);
const uint8_t num_dmrs_cdm_grps_no_data = (sched_ctrl->active_bwp || ubwpd) ? 1 : 2;
@@ -1066,10 +1039,10 @@ void pf_ul(module_id_t module_id,
LOG_D(NR_MAC,"pf_ul: preparing UL scheduling for UE %d\n",UE_id);
NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
NR_BWP_t *genericParameters = sched_ctrl->active_ubwp ? &sched_ctrl->active_ubwp->bwp_Common->genericParameters : &scc->uplinkConfigCommon->initialUplinkBWP->genericParameters;
+ int rbStart = 0; // wrt BWP start
NR_CellGroupConfig_t *cg = UE_info->CellGroup[UE_id];
NR_BWP_UplinkDedicated_t *ubwpd= cg ? cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP : NULL;
- int rbStart = sched_ctrl->active_ubwp ? NRRIV2PRBOFFSET(genericParameters->locationAndBandwidth, MAX_BWP_SIZE) : 0;
const uint16_t bwpSize = NRRIV2BW(genericParameters->locationAndBandwidth, MAX_BWP_SIZE);
NR_sched_pusch_t *sched_pusch = &sched_ctrl->sched_pusch;
NR_pusch_semi_static_t *ps = &sched_ctrl->pusch_semi_static;
@@ -1320,6 +1293,10 @@ bool nr_fr1_ulsch_preprocessor(module_id_t module_id, frame_t frame, sub_frame_t
sched_ctrl->active_ubwp->bwp_Common->genericParameters.locationAndBandwidth:
scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth,
MAX_BWP_SIZE);
+ const uint16_t bwpStart = NRRIV2PRBOFFSET(sched_ctrl->active_ubwp ?
+ sched_ctrl->active_ubwp->bwp_Common->genericParameters.locationAndBandwidth:
+ scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth,
+ MAX_BWP_SIZE);
const struct NR_PUSCH_TimeDomainResourceAllocationList *tdaList = sched_ctrl->active_ubwp ?
sched_ctrl->active_ubwp->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList:
scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList;
@@ -1333,10 +1310,10 @@ bool nr_fr1_ulsch_preprocessor(module_id_t module_id, frame_t frame, sub_frame_t
if (RC.nrmac[module_id]->ulprbbl[i] == 1) vrb_map_UL[i]=symb;
for (int i = 0; i < bwpSize; i++) {
- while ((vrb_map_UL[i] & symb) != 0 && i < bwpSize)
+ while ((vrb_map_UL[bwpStart + i] & symb) != 0 && i < bwpSize)
i++;
st = i;
- while ((vrb_map_UL[i] & symb) == 0 && i < bwpSize)
+ while ((vrb_map_UL[bwpStart + i] & symb) == 0 && i < bwpSize)
i++;
if (i - st > len) {
len = i - st;
@@ -1659,7 +1636,7 @@ void nr_schedule_ulsch(module_id_t module_id, frame_t frame, sub_frame_t slot)
ul_dci_request_pdu->PDUSize = (uint8_t)(2+sizeof(nfapi_nr_dl_tti_pdcch_pdu));
pdcch_pdu = &ul_dci_request_pdu->pdcch_pdu.pdcch_pdu_rel15;
ul_dci_req->numPdus += 1;
- nr_configure_pdcch(pdcch_pdu, ss, coreset, scc, genericParameters, NULL);
+ nr_configure_pdcch(nr_mac, pdcch_pdu, ss, coreset, scc, genericParameters, NULL);
pdcch_pdu_bwp_coreset[bwpid][coresetid] = pdcch_pdu;
}
diff --git a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h
index 5136a4a57c..3b275ca8a0 100644
--- a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h
+++ b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h
@@ -248,7 +248,8 @@ void find_search_space(int ss_type,
NR_BWP_Downlink_t *bwp,
NR_SearchSpace_t *ss);
-void nr_configure_pdcch(nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu,
+void nr_configure_pdcch(gNB_MAC_INST *gNB_mac,
+ nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu,
NR_SearchSpace_t *ss,
NR_ControlResourceSet_t *coreset,
NR_ServingCellConfigCommon_t *scc,
diff --git a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
index b2735b2428..699b92a831 100644
--- a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
+++ b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
@@ -145,6 +145,8 @@ typedef struct {
uint8_t msg3_first_rb;
/// Msg3 number of RB
uint8_t msg3_nb_rb;
+ /// Msg3 BWP start
+ uint8_t msg3_bwp_start;
/// Msg3 TPC command
uint8_t msg3_TPC;
/// Msg3 ULdelay command
@@ -748,7 +750,7 @@ typedef struct gNB_MAC_INST_s {
int *preferred_ul_tda[MAX_NUM_BWP];
/// maximum number of slots before a UE will be scheduled ULSCH automatically
- uint32_t ulsch_max_slots_inactivity;
+ uint32_t ulsch_max_frame_inactivity;
/// DL preprocessor for differentiated scheduling
nr_pp_impl_dl pre_processor_dl;
@@ -756,6 +758,8 @@ typedef struct gNB_MAC_INST_s {
nr_pp_impl_ul pre_processor_ul;
NR_UE_sched_ctrl_t *sched_ctrlCommon;
+ uint16_t cset0_bwp_start;
+ uint16_t cset0_bwp_size;
NR_Type0_PDCCH_CSS_config_t type0_PDCCH_CSS_config[64];
bool first_MIB;
diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp.h b/openair2/LAYER2/PDCP_v10.1.0/pdcp.h
index 0c3dd2f04f..9d9224d660 100644
--- a/openair2/LAYER2/PDCP_v10.1.0/pdcp.h
+++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp.h
@@ -67,9 +67,7 @@ typedef struct {
} pdcp_params_t;
-#ifndef PDCP_USE_NETLINK
- #define PDCP_USE_NETLINK ( get_pdcp_optmask() & PDCP_USE_NETLINK_BIT)
-#endif
+#define PDCP_USE_NETLINK ( get_pdcp_optmask() & PDCP_USE_NETLINK_BIT)
#define LINK_ENB_PDCP_TO_IP_DRIVER ( get_pdcp_optmask() & LINK_ENB_PDCP_TO_IP_DRIVER_BIT)
#define LINK_ENB_PDCP_TO_GTPV1U ( get_pdcp_optmask() & LINK_ENB_PDCP_TO_GTPV1U_BIT)
#define UE_NAS_USE_TUN ( get_pdcp_optmask() & UE_NAS_USE_TUN_BIT)
@@ -501,7 +499,6 @@ typedef struct {
#define REORDERING_WINDOW_SN_7BIT 64
#define REORDERING_WINDOW_SN_12BIT 2048
-extern signed int pdcp_2_nas_irq;
extern pdcp_stats_t UE_pdcp_stats[MAX_MOBILES_PER_ENB];
extern pdcp_stats_t eNB_pdcp_stats[NUMBER_OF_eNB_MAX];
diff --git a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.h b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.h
index c6ab681819..57e2116a72 100644
--- a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.h
+++ b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.h
@@ -37,7 +37,6 @@
//-----------------------------------------------------------------------------
# include "rlc_tm_entity.h"
# include "mem_block.h"
-//# include "rrm_config_structs.h"
# include "rlc_tm_structs.h"
//# include "rlc.h"
# include "platform_types.h"
diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_control_primitives.c b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_control_primitives.c
index 940740943e..05c3423f76 100644
--- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_control_primitives.c
+++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_control_primitives.c
@@ -27,7 +27,6 @@
#include "rlc_um.h"
#include "rlc_primitives.h"
#include "list.h"
-#include "rrm_config_structs.h"
#include "LAYER2/MAC/mac_extern.h"
#include "common/utils/LOG/log.h"
diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_very_simple_test.h b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_very_simple_test.h
index 598518f1c8..b762a4fdb4 100644
--- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_very_simple_test.h
+++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_very_simple_test.h
@@ -33,7 +33,6 @@
//-----------------------------------------------------------------------------
# include "rlc_um_entity.h"
# include "mem_block.h"
-# include "rrm_config_structs.h"
# include "rlc_um_structs.h"
# include "rlc_um_constants.h"
//-----------------------------------------------------------------------------
diff --git a/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c b/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c
index f9076c50ae..bf9435346f 100644
--- a/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c
+++ b/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c
@@ -36,6 +36,7 @@
#include "pdcp.h"
#include "LAYER2/nr_rlc/nr_rlc_oai_api.h"
#include
+#include "openair2/SDAP/nr_sdap/nr_sdap_gnb.h"
#define TODO do { \
printf("%s:%d:%s: todo\n", __FILE__, __LINE__, __FUNCTION__); \
@@ -447,10 +448,18 @@ static void deliver_sdu_drb(void *_ue, nr_pdcp_entity_t *entity,
if(IS_SOFTMODEM_NOS1 || UE_NAS_USE_TUN){
LOG_D(PDCP, "IP packet received, to be sent to TUN interface");
- len = write(nas_sock_fd[0], buf, size);
+
+ if(entity->has_sdapDLheader){
+ size -= SDAP_HDR_LENGTH;
+ len = write(nas_sock_fd[0], &buf[SDAP_HDR_LENGTH], size);
+ } else {
+ len = write(nas_sock_fd[0], buf, size);
+ }
+
if (len != size) {
LOG_E(PDCP, "%s:%d:%s: fatal\n", __FILE__, __LINE__, __FUNCTION__);
}
+
}
else{
for (i = 0; i < 5; i++) {
@@ -480,7 +489,10 @@ static void deliver_sdu_drb(void *_ue, nr_pdcp_entity_t *entity,
GTPV1U_GNB_TUNNEL_DATA_REQ(message_p).offset = GTPU_HEADER_OVERHEAD_MAX;
GTPV1U_GNB_TUNNEL_DATA_REQ(message_p).rnti = ue->rnti;
GTPV1U_GNB_TUNNEL_DATA_REQ(message_p).pdusession_id = entity->pdusession_id;
- if (offset==1) LOG_D(PDCP, "%s() (drb %d) SDAP header %2x\n",__func__, rb_id, buf[0]);
+ if (offset==1) {
+ LOG_I(PDCP, "%s() (drb %d) SDAP header %2x\n",__func__, rb_id, buf[0]);
+ sdap_gnb_ul_header_handler(buf[0]); // Handler for the UL gNB SDAP Header
+ }
LOG_D(PDCP, "%s() (drb %d) sending message to gtp size %d\n", __func__, rb_id, size-offset);
itti_send_msg_to_task(TASK_VARIABLE, INSTANCE_DEFAULT, message_p);
}
@@ -828,10 +840,6 @@ static void add_drb_am(int is_gnb, int rnti, struct NR_DRB_ToAddMod *s,
has_sdap = 1;
has_sdapULheader = s->cnAssociation->choice.sdap_Config->sdap_HeaderUL == NR_SDAP_Config__sdap_HeaderUL_present ? 1 : 0;
has_sdapDLheader = s->cnAssociation->choice.sdap_Config->sdap_HeaderDL == NR_SDAP_Config__sdap_HeaderDL_present ? 1 : 0;
- if (has_sdapDLheader==1) {
- LOG_E(PDCP,"%s:%d:%s: fatal, no support for SDAP DL yet\n",__FILE__,__LINE__,__FUNCTION__);
- exit(-1);
- }
}
/* TODO(?): accept different UL and DL SN sizes? */
if (sn_size_ul != sn_size_dl) {
@@ -903,9 +911,7 @@ boolean_t nr_rrc_pdcp_config_asn1_req(
uint8_t *const kRRCint,
uint8_t *const kUPenc,
uint8_t *const kUPint
-#if (LTE_RRC_VERSION >= MAKE_VERSION(9, 0, 0))
,LTE_PMCH_InfoList_r9_t *pmch_InfoList_r9
-#endif
,rb_id_t *const defaultDRB,
struct NR_CellGroupConfig__rlc_BearerToAddModList *rlc_bearer2add_list)
//struct NR_RLC_Config *rlc_Config)
@@ -975,9 +981,7 @@ boolean_t rrc_pdcp_config_asn1_req(
uint8_t *const kRRCenc,
uint8_t *const kRRCint,
uint8_t *const kUPenc
-#if (LTE_RRC_VERSION >= MAKE_VERSION(9, 0, 0))
,LTE_PMCH_InfoList_r9_t *pmch_InfoList_r9
-#endif
,rb_id_t *const defaultDRB)
{
return 0;
@@ -1240,10 +1244,8 @@ boolean_t pdcp_data_req(
const sdu_size_t sdu_buffer_size,
unsigned char *const sdu_buffer,
const pdcp_transmission_mode_t mode
-#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
,const uint32_t *const sourceL2Id
,const uint32_t *const destinationL2Id
-#endif
)
{
if (srb_flagP) {
diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c b/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c
index 8bf65835dc..046696d12f 100644
--- a/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c
+++ b/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c
@@ -270,7 +270,7 @@ mac_rlc_status_resp_t mac_rlc_status_ind(
+ buf_stat.retx_size
+ buf_stat.tx_size;
} else {
- if (!(frameP%128)) //to supress this warning message
+ if (!(frameP%128)) //to suppress this warning message
LOG_W(RLC, "[%s] Radio Bearer (channel ID %d) is NULL for UE with rntiP %x\n", __FUNCTION__, channel_idP, rntiP);
ret.bytes_in_buffer = 0;
}
@@ -334,6 +334,8 @@ rlc_buffer_occupancy_t mac_rlc_get_buffer_occupancy_ind(
+ buf_stat.retx_size
+ buf_stat.tx_size;
} else {
+ if (!(frameP%128)) //to suppress this warning message
+ LOG_W(RLC, "[%s] Radio Bearer (channel ID %d) is NULL for UE with rntiP %x\n", __FUNCTION__, channel_idP, rntiP);
ret = 0;
}
@@ -953,16 +955,16 @@ rlc_op_status_t nr_rrc_rlc_config_asn1_req (const protocol_ctxt_t * const ctxt
if ((drb2add_listP != NULL) && (rlc_bearer2add_list != NULL)) {
for (i = 0; i < drb2add_listP->list.count; i++) {
if (rlc_bearer2add_list != NULL) {
- for(j = 0; j < rlc_bearer2add_list->list.count; j++){
- if(rlc_bearer2add_list->list.array[j]->servedRadioBearer != NULL){
- if(rlc_bearer2add_list->list.array[j]->servedRadioBearer->present == NR_RLC_BearerConfig__servedRadioBearer_PR_drb_Identity){
- if(drb2add_listP->list.array[i]->drb_Identity == rlc_bearer2add_list->list.array[j]->servedRadioBearer->choice.drb_Identity){
- add_drb(rnti, drb2add_listP->list.array[i], rlc_bearer2add_list->list.array[j]);
+ for(j = 0; j < rlc_bearer2add_list->list.count; j++){
+ if(rlc_bearer2add_list->list.array[j]->servedRadioBearer != NULL){
+ if(rlc_bearer2add_list->list.array[j]->servedRadioBearer->present == NR_RLC_BearerConfig__servedRadioBearer_PR_drb_Identity){
+ if(drb2add_listP->list.array[i]->drb_Identity == rlc_bearer2add_list->list.array[j]->servedRadioBearer->choice.drb_Identity){
+ add_drb(rnti, drb2add_listP->list.array[i], rlc_bearer2add_list->list.array[j]);
+ }
}
- }
+ }
}
}
- }
}
}
diff --git a/openair2/LAYER2/openair2_proc.c b/openair2/LAYER2/openair2_proc.c
index 3d2c06f489..7ffdc75195 100644
--- a/openair2/LAYER2/openair2_proc.c
+++ b/openair2/LAYER2/openair2_proc.c
@@ -362,264 +362,5 @@ int dump_eNB_l2_stats(char *buffer, int length) {
return len + 1 /* SR: for trailing \0 */;
}
-#ifdef PROC
-int openair2_stats_read(char *buffer, char **my_buffer, off_t off, int length) {
- int len = 0,fg,Overhead, Sign;
- unsigned int i,j,k,kk;
- unsigned int Mod_id = 0,CH_index;
- unsigned int tx_pdcp_sdu;
- unsigned int tx_pdcp_sdu_discarded;
- unsigned int tx_retransmit_pdu_unblock;
- unsigned int tx_retransmit_pdu_by_status;
- unsigned int tx_retransmit_pdu;
- unsigned int tx_data_pdu;
- unsigned int tx_control_pdu;
- unsigned int rx_sdu;
- unsigned int rx_error_pdu;
- unsigned int rx_data_pdu;
- unsigned int rx_data_pdu_out_of_window;
- unsigned int rx_control_pdu;
- // if (mac_xface->is_cluster_head == 0) {
- for (k=0; kIs_cluster_head[k] == 0) {
-#ifndef PHY_EMUL_ONE_MACHINE
- Mod_id=k-NB_CH_INST;
- len+=sprintf(&buffer[len],"UE TTI: %d\n",Mac_rlc_xface->frame);
-
- for (CH_index = 0; CH_index>5,
- UE_mac_inst[Mod_id].Dcch_lchan[CH_index].Lchan_info.NB_RX,
- UE_mac_inst[Mod_id].Dcch_lchan[CH_index].Lchan_info.NB_RX_ERRORS);
-
- for(i=1; i>5,
- Pdcp_stats_rx[k][CH_index][i],
- Pdcp_stats_rx_rate[k][CH_index][i],
- (10*Pdcp_stats_rx_rate[k][CH_index][i])>>5,
- Sign*(10*Overhead)>>5);
- int status = rlc_stat_req (k,
- UE_mac_inst[Mod_id].Dtch_lchan[i][CH_index].Lchan_info.Lchan_id.Index,
- &tx_pdcp_sdu,
- &tx_pdcp_sdu_discarded,
- &tx_retransmit_pdu_unblock,
- &tx_retransmit_pdu_by_status,
- &tx_retransmit_pdu,
- &tx_data_pdu,
- &tx_control_pdu,
- &rx_sdu,
- &rx_error_pdu,
- &rx_data_pdu,
- &rx_data_pdu_out_of_window,
- &rx_control_pdu) ;
-
- if (status == RLC_OP_STATUS_OK) {
- len+=sprintf(&buffer[len],"RLC LCHAN %d, NB_SDU_TO_TX = %u\tNB_SDU_DISC %u\tNB_RX_SDU %u\n",
- UE_mac_inst[Mod_id].Dtch_lchan[i][CH_index].Lchan_info.Lchan_id.Index,
- tx_pdcp_sdu,
- tx_pdcp_sdu_discarded,
- rx_sdu);
- len+=sprintf(&buffer[len],"RLC LCHAN %d, NB_TB_TX_DATA = %u\tNB_TB_TX_CONTROL %u\tNB_TX_TB_RETRANS %u",
- UE_mac_inst[Mod_id].Dtch_lchan[i][CH_index].Lchan_info.Lchan_id.Index,
- tx_data_pdu,
- tx_control_pdu,
- tx_retransmit_pdu);
- len+=sprintf(&buffer[len],"\tRLC LCHAN %d, NB_TX_TB_RETRANS_BY_STATUS = %u\tNB_TX_TB_RETRANS_PADD %u\n",
- UE_mac_inst[Mod_id].Dtch_lchan[i][CH_index].Lchan_info.Lchan_id.Index,
- tx_retransmit_pdu_by_status,
- tx_retransmit_pdu_unblock);
- len+=sprintf(&buffer[len],"RLC LCHAN %d, NB_RX_DATA = %u\tNB_RX_TB_OUT_WIN %u\tNB_RX_TB_CORRUPT %u\n",
- UE_mac_inst[Mod_id].Dtch_lchan[i][CH_index].Lchan_info.Lchan_id.Index,
- rx_data_pdu,
- rx_data_pdu_out_of_window,
- rx_error_pdu);
- }
-
- len+=sprintf(&buffer[len],"[MAC]: LCHAN %d, NB_TX_MAC = %d (%d bits/TTI, %d kbits/s), NB_RX_MAC = %d (%d errors)\n",
- UE_mac_inst[Mod_id].Dtch_lchan[i][CH_index].Lchan_info.Lchan_id.Index,
- UE_mac_inst[Mod_id].Dtch_lchan[i][CH_index].Lchan_info.NB_TX,
- UE_mac_inst[Mod_id].Dtch_lchan[i][CH_index].Lchan_info.output_rate,
- (10*UE_mac_inst[Mod_id].Dtch_lchan[i][CH_index].Lchan_info.output_rate)>>5,
- UE_mac_inst[Mod_id].Dtch_lchan[i][CH_index].Lchan_info.NB_RX,
- UE_mac_inst[Mod_id].Dtch_lchan[i][CH_index].Lchan_info.NB_RX_ERRORS);
- len+=sprintf(&buffer[len]," TX per TB: ");
-
- for(kk=0; kkIs_cluster_head[k] ==1) {
- Mod_id=k;
- len+=sprintf(&buffer[len],
- "------------------------------------------------------------------- TTI: %d------------------------------------------------------------------\n",
- Mac_rlc_xface->frame);
-
- for(i=1; i<=NB_CNX_CH; i++) {
- if (CH_mac_inst[Mod_id].Dcch_lchan[i].Active==1) {
- len+=sprintf(&buffer[len],"\nMR index %u: DL SINR (feedback) %d dB, CQI: %s\n\n",
- i,//CH_rrc_inst[Mod_id].Info.UE_info[i].L2_id[0],
- CH_mac_inst[Mod_id].Def_meas[i].Wideband_sinr,
- print_cqi(CH_mac_inst[Mod_id].Def_meas[i].cqi));
- len+=sprintf(&buffer[len],
- "[MAC] LCHAN %d (DCCH), NB_TX_MAC= %d (%d bits/TTI, %d kbits/s), NB_RX_MAC= %d (errors %d, sacch errors %d, sach errors %d, sach_missing %d)\n\n",
- CH_mac_inst[Mod_id].Dcch_lchan[i].Lchan_info.Lchan_id.Index,
- CH_mac_inst[Mod_id].Dcch_lchan[i].Lchan_info.NB_TX,
- CH_mac_inst[Mod_id].Dcch_lchan[i].Lchan_info.output_rate,
- (10*CH_mac_inst[Mod_id].Dcch_lchan[i].Lchan_info.output_rate)>>5,
- CH_mac_inst[Mod_id].Dcch_lchan[i].Lchan_info.NB_RX,
- CH_mac_inst[Mod_id].Dcch_lchan[i].Lchan_info.NB_RX_ERRORS,
- CH_mac_inst[Mod_id].Dcch_lchan[i].Lchan_info.NB_RX_SACCH_ERRORS,
- CH_mac_inst[Mod_id].Dcch_lchan[i].Lchan_info.NB_RX_SACH_ERRORS,
- CH_mac_inst[Mod_id].Dcch_lchan[i].Lchan_info.NB_RX_SACH_MISSING);
-
- for(j=0; j>5,
- Pdcp_stats_rx[k][i][j],
- Pdcp_stats_rx_rate[k][i][j],
- (10*Pdcp_stats_rx_rate[k][i][j])>>5,
- Sign*(10*Overhead)>>5);
- int status = rlc_stat_req (k,
- CH_mac_inst[Mod_id].Dtch_lchan[j][i].Lchan_info.Lchan_id.Index,
- &tx_pdcp_sdu,
- &tx_pdcp_sdu_discarded,
- &tx_retransmit_pdu_unblock,
- &tx_retransmit_pdu_by_status,
- &tx_retransmit_pdu,
- &tx_data_pdu,
- &tx_control_pdu,
- &rx_sdu,
- &rx_error_pdu,
- &rx_data_pdu,
- &rx_data_pdu_out_of_window,
- &rx_control_pdu) ;
- /*
- if (status == RLC_OP_STATUS_OK) {
- len+=sprintf(&buffer[len],"\t[RLC] LCHAN %d, NB_SDU_TO_TX = %d\tNB_SDU_DISC %d\tNB_RX_SDU %d\n",
- CH_mac_inst[Mod_id].Dtch_lchan[j][i].Lchan_info.Lchan_id.Index,
- tx_pdcp_sdu,
- tx_pdcp_sdu_discarded,
- rx_sdu);
- len+=sprintf(&buffer[len],"\t[RLC] LCHAN %d, NB_TB_TX_DATA = %d\tNB_TB_TX_CONTROL %d\tNB_TX_TB_RETRANS %\n",
- CH_mac_inst[Mod_id].Dtch_lchan[j][i].Lchan_info.Lchan_id.Index,
- tx_data_pdu,
- tx_control_pdu,
- tx_retransmit_pdu);
- len+=sprintf(&buffer[len],"\t[RLC] LCHAN %d, NB_TX_TB_RETRANS_BY_STATUS = %d\tNB_TX_TB_RETRANS_PADD %d\n",
- CH_mac_inst[Mod_id].Dtch_lchan[j][i].Lchan_info.Lchan_id.Index,
- tx_retransmit_pdu_by_status,
- tx_retransmit_pdu_unblock);
- len+=sprintf(&buffer[len],"\t[RLC] LCHAN %d, NB_RX_DATA = %d\tNB_RX_TB_OUT_WIN %d\tNB_RX_TB_CORRUPT %d\n",
- CH_mac_inst[Mod_id].Dtch_lchan[j][i].Lchan_info.Lchan_id.Index,
- rx_data_pdu,
- rx_data_pdu_out_of_window,
- rx_error_pdu);
- }
- */
- len+=sprintf(&buffer[len],
- "[MAC]LCHAN %d (CNX %u,RAB %u), NB_TX_MAC= %d (%d bits/TTI, %d kbit/s), NB_RX_MAC= %d (errors %d, sacch_errors %d, sach_errors %d, sach_missing %d)\n",
- CH_mac_inst[Mod_id].Dtch_lchan[j][i].Lchan_info.Lchan_id.Index,
- i,j,
- CH_mac_inst[Mod_id].Dtch_lchan[j][i].Lchan_info.NB_TX,
- CH_mac_inst[Mod_id].Dtch_lchan[j][i].Lchan_info.output_rate,
- (10*CH_mac_inst[Mod_id].Dtch_lchan[j][i].Lchan_info.output_rate)>>5,
- CH_mac_inst[Mod_id].Dtch_lchan[j][i].Lchan_info.NB_RX,
- CH_mac_inst[Mod_id].Dtch_lchan[j][i].Lchan_info.NB_RX_ERRORS,
- CH_mac_inst[Mod_id].Dtch_lchan[j][i].Lchan_info.NB_RX_SACCH_ERRORS,
- CH_mac_inst[Mod_id].Dtch_lchan[j][i].Lchan_info.NB_RX_SACH_ERRORS,
- CH_mac_inst[Mod_id].Dtch_lchan[j][i].Lchan_info.NB_RX_SACH_MISSING);
- len+=sprintf(&buffer[len],"[MAC][SCHEDULER] TX Arrival Rate %d, TX Service Rate %d, RX Arrival rate %d, RX Service rate %d, NB_BW_REQ_RX %d\n\n",
- CH_mac_inst[Mod_id].Dtch_lchan[j][i].Lchan_info.Arrival_rate,
- CH_mac_inst[Mod_id].Dtch_lchan[j][i].Lchan_info.Tx_rate,
- CH_mac_inst[Mod_id].Dtch_lchan[j][i].Lchan_info.Req_rate,
- CH_mac_inst[Mod_id].Dtch_lchan[j][i].Lchan_info.Rx_rate,
- CH_mac_inst[Mod_id].Dtch_lchan[j][i].Lchan_info.NB_BW_REQ_RX);
- /*
- len+=sprintf(&buffer[len]," TX per TB: ");
- for(kk=0;kklen);
#endif
-#else
- bytes_wrote = rtf_put(NAS2PDCP_FIFO, &pdcph, NAS_PDCPH_SIZE);
-#ifdef NAS_DEBUG_SEND
- printk("[NAS] Wrote %d bytes (header for %d byte skb) to PDCP fifo\n",
- bytes_wrote,skb->len);
-#endif
-#endif //PDCP_USE_NETLINK
if (bytes_wrote != NAS_PDCPH_SIZE) {
printk("NAS_COMMON_QOS_SEND: problem while writing PDCP's header (bytes wrote = %d )\n",bytes_wrote);
printk("rb_id %ld, Wrote %d, Header Size %lu\n", pdcph.rb_id , bytes_wrote, NAS_PDCPH_SIZE);
-#ifndef PDCP_USE_NETLINK
- rtf_reset(NAS2PDCP_FIFO);
-#endif //PDCP_USE_NETLINK
return;
}
-#ifdef PDCP_USE_NETLINK
bytes_wrote += nas_netlink_send((char *)skb->data,skb->len);
-#else
- bytes_wrote += rtf_put(NAS2PDCP_FIFO, skb->data, skb->len);
-#endif //PDCP_USE_NETLINK
if (bytes_wrote != skb->len+NAS_PDCPH_SIZE) {
printk("NAS_COMMON_QOS_SEND: Inst %d, RB_ID %ld: problem while writing PDCP's data, bytes_wrote = %d, Data_len %d, PDCPH_SIZE %lu\n",
@@ -427,9 +410,6 @@ void nas_COMMON_QOS_send(struct sk_buff *skb, struct cx_entity *cx, struct class
bytes_wrote,
skb->len,
NAS_PDCPH_SIZE); // congestion
-#ifndef PDCP_USE_NETLINK
- rtf_reset(NAS2PDCP_FIFO);
-#endif //PDCP_USE_NETLINK
return;
}
@@ -449,69 +429,6 @@ void nas_COMMON_QOS_send(struct sk_buff *skb, struct cx_entity *cx, struct class
#endif
}
-#ifndef PDCP_USE_NETLINK
-//---------------------------------------------------------------------------
-void nas_COMMON_QOS_receive()
-{
- //---------------------------------------------------------------------------
- uint8_t sapi;
- struct pdcp_data_ind_header_s pdcph;
- unsigned char data_buffer[2048];
- struct classifier_entity *rclass;
- struct nas_priv *priv;
- int bytes_read;
-
- // Start debug information
-#ifdef NAS_DEBUG_RECEIVE
- printk("NAS_COMMON_QOS_RECEIVE - begin \n");
-#endif
-
- // End debug information
-
- bytes_read = rtf_get(PDCP2PDCP_USE_RT_FIFO,&pdcph, NAS_PDCPH_SIZE);
-
- while (bytes_read>0) {
- if (bytes_read != NAS_PDCPH_SIZE) {
- printk("NAS_COMMON_QOS_RECEIVE: problem while reading PDCP header\n");
- return;
- }
-
- priv=netdev_priv(nasdev[pdcph.inst]);
- rclass = nas_COMMON_search_class_for_rb(pdcph.rb_id,priv);
-
- bytes_read+= rtf_get(PDCP2PDCP_USE_RT_FIFO,
- data_buffer,
- pdcph.data_size);
-
-#ifdef NAS_DEBUG_RECEIVE
- printk("NAS_COMMON_QOS_RECEIVE - Got header for RB %d, Inst %d \n",
- pdcph.rb_id,
- pdcph.inst);
-#endif
-
- if (rclass) {
-#ifdef NAS_DEBUG_RECEIVE
- printk("[NAS][COMMON] Found corresponding connection in classifier for RAB\n");
-#endif //NAS_DEBUG_RECEIVE
-
- nas_COMMON_receive(pdcph.data_size,
- (void *)data_buffer,
- pdcph.inst,
- rclass,
- pdcph.rb_id);
- }
-
- bytes_read = rtf_get(PDCP2PDCP_USE_RT_FIFO, &pdcph, NAS_PDCPH_SIZE);
- }
-
-
-
-#ifdef NAS_DEBUG_RECEIVE
- printk("NAS_COMMON_QOS_RECEIVE - end \n");
-#endif
-}
-
-#else
void nas_COMMON_QOS_receive(struct nlmsghdr *nlh)
{
@@ -542,7 +459,6 @@ void nas_COMMON_QOS_receive(struct nlmsghdr *nlh)
}
}
-#endif //PDCP_USE_NETLINK
//---------------------------------------------------------------------------
struct cx_entity *nas_COMMON_search_cx(nasLocalConnectionRef_t lcr,struct nas_priv *priv)
diff --git a/openair2/NETWORK_DRIVER/MESH/device.c b/openair2/NETWORK_DRIVER/MESH/device.c
index 47c68466bd..f63408259c 100644
--- a/openair2/NETWORK_DRIVER/MESH/device.c
+++ b/openair2/NETWORK_DRIVER/MESH/device.c
@@ -53,10 +53,8 @@
struct net_device *nasdev[NB_INSTANCES_MAX];
-#ifdef PDCP_USE_NETLINK
extern void nas_netlink_release(void);
extern int nas_netlink_init(void);
-#endif
//int bytes_wrote;
//int bytes_read;
@@ -82,38 +80,6 @@ int find_inst(struct net_device *dev)
//---------------------------------------------------------------------------
-#ifndef PDCP_USE_NETLINK
-//void interrupt(void){
-void *nas_interrupt(void)
-{
- //---------------------------------------------------------------------------
- uint8_t cxi;
-
- // struct nas_priv *priv=netdev_priv(dev_id);
- // unsigned int flags;
-
- // priv->lock = SPIN_LOCK_UNLOCKED;
-
-#ifdef DEBUG_INTERRUPT
- printk("INTERRUPT - begin\n");
-#endif
- // spin_lock_irqsave(&priv->lock,flags);
- cxi=0;
- // mesh_GC_receive();
- // mesh_DC_receive(naspriv->cx+cxi);
-#ifndef PDCP_USE_NETLINK
- nas_COMMON_QOS_receive();
-#endif
- // spin_unlock_irqrestore(&priv->lock,flags);
-#ifdef DEBUG_INTERRUPT
- printk("INTERRUPT: end\n");
-#endif
- // return 0;
- return NULL;
-}
-#endif //NETLINK
-
-//---------------------------------------------------------------------------
// Called by ifconfig when the device is activated by ifconfig
int nas_open(struct net_device *dev)
{
@@ -121,15 +87,6 @@ int nas_open(struct net_device *dev)
printk("OPEN: begin\n");
// MOD_INC_USE_COUNT;
// Address has already been set at init
-#ifndef PDCP_USE_NETLINK
-
- if (pdcp_2_nas_irq==-EBUSY) {
- printk("OPEN: irq failure\n");
- return -EBUSY;
- }
-
-#endif //PDCP_USE_NETLINK
-
/*
netif_start_queue(dev);
//
@@ -449,16 +406,6 @@ int init_module (void)
printk("Starting NASMESH, number of IMEI paramters %d, IMEI %X%X\n",m_arg,nas_IMEI[0],nas_IMEI[1]);
-#ifndef PDCP_USE_NETLINK
-
- if (pdcp_2_nas_irq == -EBUSY || pdcp_2_nas_irq == -EINVAL) {
- printk("[NAS][INIT] No interrupt resource available\n");
- return -EBUSY;
- } else
- printk("[NAS][INIT]: Interrupt %d\n", pdcp_2_nas_irq);
-
-#endif //NETLINK
-
for (inst=0; instirq, NULL);
- // End IRQ linux
-
- }
-
-#else // NETLINK
-
-
-
-#endif //NETLINK
-
for (inst=0; instlength);
#endif
++cx->retry;
-#ifdef PDCP_USE_NETLINK
-#else
- // bytes_wrote = rtf_put(cx->sap[NAS_DC_INPUT_SAPI], p, p->length);
-#endif
cx->countimer=gpriv->timer_establishment;
if (bytes_wrote==p->length) {
@@ -353,11 +349,6 @@ int nas_mesh_DC_send_cx_release_request(struct cx_entity *cx,
p->length = NAS_TL_SIZE + sizeof(struct NASConnReleaseReq);
p->nasUEDCPrimitive.conn_release_req.localConnectionRef = cx->lcr;
p->nasUEDCPrimitive.conn_release_req.releaseCause = NAS_CX_RELEASE_UNDEF_CAUSE;
-#ifdef PDCP_USE_NETLINK
-
-#else
- // bytes_wrote = rtf_put(cx->sap[NAS_DC_INPUT_SAPI], p, p->length);
-#endif
if (bytes_wrote==p->length) {
cx->state=NAS_IDLE;
@@ -441,22 +432,12 @@ void nas_mesh_DC_send_sig_data_request(struct sk_buff *skb,
p->nasUEDCPrimitive.data_transfer_req.localConnectionRef = cx->lcr;
p->nasUEDCPrimitive.data_transfer_req.priority = 3; // TBD
p->nasUEDCPrimitive.data_transfer_req.nasDataLength = (skb->len)+1; //adds category character
-#ifdef PDCP_USE_NETLINK
-#else
- // bytes_wrote = rtf_put(cx->sap[NAS_DC_INPUT_SAPI], p, p->length);
-#endif
if (bytes_wrote!=p->length) {
printk("NAS_MESH_DC_SEND_SIG: Header sent failure in DC-FIFO\n");
return;
}
-#ifdef PDCP_USE_NETLINK
-#else
- // bytes_wrote += rtf_put(cx->sap[NAS_DC_INPUT_SAPI], &data_type, 1);
- // bytes_wrote += rtf_put(cx->sap[NAS_DC_INPUT_SAPI], skb->data, skb->len);
-#endif
-
if (bytes_wrote != p->length + skb->len + 1) {
printk("NAS_MESH_DC_SEND_SIG: Data sent failure in DC-FIFO\n");
return;
@@ -511,22 +492,12 @@ void nas_mesh_DC_send_peer_sig_data_request(struct cx_entity *cx, uint8_t sig_ca
p->nasUEDCPrimitive.data_transfer_req.localConnectionRef = cx->lcr;
p->nasUEDCPrimitive.data_transfer_req.priority = 3; // TBD
p->nasUEDCPrimitive.data_transfer_req.nasDataLength = (nas_length)+1; //adds category character
-#ifdef PDCP_USE_NETLINK
-#else
- // bytes_wrote = rtf_put(cx->sap[NAS_DC_INPUT_SAPI], p, p->length);
-#endif
if (bytes_wrote!=p->length) {
printk("NAS_MESH_DC_PEER_SEND_SIG: Header sent failure in DC-FIFO\n");
return;
}
-#ifdef PDCP_USE_NETLINK
-#else
- // bytes_wrote += rtf_put(cx->sap[NAS_DC_INPUT_SAPI], &data_type, 1);
- // bytes_wrote += rtf_put(cx->sap[NAS_DC_INPUT_SAPI], (char *)nas_data, nas_length);
-#endif
-
if (bytes_wrote != p->length + nas_length + 1) {
printk("NAS_MESH_DC_PEER_SEND_SIG: Data sent failure in DC-FIFO\n");
return;
@@ -665,9 +636,6 @@ void nas_mesh_DC_decode_sig_data_ind(struct cx_entity *cx, struct nas_ue_dc_elem
}
// End debug information
-#ifndef PDCP_USE_NETLINK
- // nas_COMMON_receive(p->length, p->nasUEDCPrimitive.data_transfer_ind.nasDataLength, cx->sap[NAS_DC_OUTPUT_SAPI]);
-#endif
#ifdef NAS_DEBUG_DC
printk("NAS_MESH_DC_RECEIVE: DATA_TRANSFER_IND reception\n");
printk(" Local Connection reference %u\n",p->nasUEDCPrimitive.data_transfer_ind.localConnectionRef);
@@ -842,20 +810,12 @@ int nas_mesh_DC_receive(struct cx_entity *cx,struct nas_priv *gpriv)
}
// End debug information
-#ifdef PDCP_USE_NETLINK
-#else
- // bytes_read = rtf_get(cx->sap[NAS_DC_OUTPUT_SAPI] , gpriv->rbuffer, NAS_TL_SIZE);
-#endif
if (bytes_read>0) {
struct nas_ue_dc_element *p;
p= (struct nas_ue_dc_element *)(gpriv->rbuffer);
//get the rest of the primitive
-#ifdef PDCP_USE_NETLINK
-#else
- // bytes_read += rtf_get(cx->sap[NAS_DC_OUTPUT_SAPI], (uint8_t *)p+NAS_TL_SIZE, p->length-NAS_TL_SIZE);
-#endif
if (bytes_read!=p->length) {
printk("NAS_MESH_DC_RECEIVE: Problem while reading primitive header\n");
@@ -982,19 +942,11 @@ int nas_mesh_GC_receive(struct nas_priv *gpriv)
#ifdef NAS_DEBUG_GC
printk("NAS_MESH_GC_RECEIVE - begin \n");
#endif
-#ifdef PDCP_USE_NETLINK
-#else
- // bytes_read = rtf_get(gpriv->sap[NAS_GC_SAPI], gpriv->rbuffer, NAS_TL_SIZE);
-#endif
if (bytes_read>0) {
struct nas_ue_gc_element *p;
p= (struct nas_ue_gc_element *)(gpriv->rbuffer);
//get the rest of the primitive
-#ifdef PDCP_USE_NETLINK
-#else
- // bytes_read += rtf_get(gpriv->sap[NAS_GC_SAPI], (uint8_t *)p+NAS_TL_SIZE, p->length-NAS_TL_SIZE);
-#endif
if (bytes_read!=p->length) {
printk("NAS_MESH_GC_RECEIVE: Problem while reading primitive's header\n");
@@ -1004,10 +956,6 @@ int nas_mesh_GC_receive(struct nas_priv *gpriv)
// start decoding message
switch (p->type) {
case INFO_BROADCAST_IND :
-#ifdef PDCP_USE_NETLINK
-#else
- // bytes_read += rtf_get(gpriv->sap[NAS_GC_SAPI], (uint8_t *)p+p->length, p->nasUEGCPrimitive.broadcast_ind.nasDataLength);
-#endif
if (bytes_read!=p->length+p->nasUEGCPrimitive.broadcast_ind.nasDataLength) {
printk("NAS_MESH_GC_RECEIVE: INFO_BROADCAST_IND reception, Problem while reading primitive's data\n");
return bytes_read;
diff --git a/openair2/NETWORK_DRIVER/MESH/proto_extern.h b/openair2/NETWORK_DRIVER/MESH/proto_extern.h
index ac92b2f8bd..332540f3b7 100644
--- a/openair2/NETWORK_DRIVER/MESH/proto_extern.h
+++ b/openair2/NETWORK_DRIVER/MESH/proto_extern.h
@@ -110,14 +110,6 @@ void nas_COMMON_del_send(struct sk_buff *skb,
struct cx_entity *cx,
struct classifier_entity *gc,int inst, struct nas_priv *gpriv);
-#ifndef PDCP_USE_NETLINK
-/**
-\fn void nas_COMMON_QOS_receive()
-\brief Retrieve PDU from PDCP for connection
- */
-void nas_COMMON_QOS_receive(void);
-#endif //PDCP_USE_NETLINK
-
/**
\fn struct rb_entity *nas_COMMON_add_rb(struct cx_entity *cx, nasRadioBearerId_t rabi, nasQoSTrafficClass_t qos)
\brief Add a radio-bearer descriptor
@@ -168,7 +160,6 @@ struct classifier_entity
*/
void nas_COMMON_flush_rb(struct cx_entity *cx);
-#ifdef PDCP_USE_NETLINK
/**
\fn int nas_netlink_send(unsigned char *data,unsigned int len)
\brief Request the transfer of data by PDCP via netlink socket
@@ -185,7 +176,6 @@ int nas_netlink_send(unsigned char *data,unsigned int len);
*/
void nas_COMMON_QOS_receive(struct nlmsghdr *nlh);
-#endif //PDCP_USE_NETLINK
//nasmesh.c
/**
@@ -305,13 +295,10 @@ void nas_tool_print_buffer(char * buffer,int length);
void nas_print_rb_entity(struct rb_entity *rb);
void nas_print_classifier(struct classifier_entity *gc);
-#ifdef PDCP_USE_NETLINK
// nas_netlink.c
void nas_netlink_release(void);
int nas_netlink_init(void);
-#endif
-
/** @} */
#endif
diff --git a/openair2/RRC/LITE/rrc_common.c b/openair2/RRC/LITE/rrc_common.c
index f0279f0ef2..a4239e857d 100644
--- a/openair2/RRC/LITE/rrc_common.c
+++ b/openair2/RRC/LITE/rrc_common.c
@@ -97,35 +97,6 @@ rrc_init_global_param(
//-----------------------------------------------------------------------------
{
- //#ifdef USER_MODE
- // Rrc_xface = (RRC_XFACE*)malloc16(sizeof(RRC_XFACE));
- //#endif //USRE_MODE
-
- // Rrc_xface->openair_rrc_top_init = openair_rrc_top_init;
- // Rrc_xface->openair_rrc_eNB_init = openair_rrc_eNB_init;
- // Rrc_xface->openair_rrc_UE_init = openair_rrc_ue_init;
- // Rrc_xface->mac_rrc_data_ind = mac_rrc_data_ind;
- //Rrc_xface->mac_rrc_data_req = mac_rrc_data_req;
- // Rrc_xface->rrc_data_indP = (void *)rlcrrc_data_ind;
- // Rrc_xface->rrc_rx_tx = rrc_rx_tx;
- // Rrc_xface->mac_rrc_meas_ind = mac_rrc_meas_ind;
- // Rrc_xface->get_rrc_status = get_rrc_status;
-
- //Rrc_xface->rrc_get_status = ...
-
- // Mac_rlc_xface->mac_out_of_sync_ind=mac_out_of_sync_ind;
-
-#ifndef NO_RRM
- // Rrc_xface->fn_rrc=fn_rrc;
-#endif
- // LOG_D(RRC, "[RRC]INIT_GLOBAL_PARAM: Mac_rlc_xface %p, rrc_rlc_register %p,rlcrrc_data_ind%p\n",Mac_rlc_xface,Mac_rlc_xface->rrc_rlc_register_rrc,rlcrrc_data_ind);
- /*
- if((Mac_rlc_xface==NULL) || (Mac_rlc_xface->rrc_rlc_register_rrc==NULL) ||
- (rlcrrc_data_ind==NULL)) {
- LOG_E(RRC,"Data structured is not initialized \n");
- return -1;
- }
- */
rrc_rlc_register_rrc (rrc_data_ind, NULL); //register with rlc
DCCH_LCHAN_DESC.transport_block_size = 4;
diff --git a/openair2/RRC/LTE/MESSAGES/asn1_msg_NB_IoT.h b/openair2/RRC/LTE/MESSAGES/asn1_msg_NB_IoT.h
index 6b56be1022..a862af7836 100644
--- a/openair2/RRC/LTE/MESSAGES/asn1_msg_NB_IoT.h
+++ b/openair2/RRC/LTE/MESSAGES/asn1_msg_NB_IoT.h
@@ -28,7 +28,6 @@
* \email: raymond.knopp@eurecom.fr ,navid.nikaein@eurecom.fr, michele.paffetti@studio.unibo.it
*/
-#ifdef USER_MODE
#include
#include
#include /* for atoi(3) */
@@ -36,9 +35,6 @@
#include /* for strerror(3) */
#include /* for EX_* exit codes */
#include /* for errno */
-#else
-#include /* Needed by all modules */
-#endif
#include
#include /* for _ASN_DEFAULT_STACK_MAX */
diff --git a/openair2/RRC/LTE/MESSAGES/asn1_patch b/openair2/RRC/LTE/MESSAGES/asn1_patch
deleted file mode 100644
index 8682f17895..0000000000
--- a/openair2/RRC/LTE/MESSAGES/asn1_patch
+++ /dev/null
@@ -1,522 +0,0 @@
-diff -cB /homes/kaltenbe/Devel/openair/openair_branches/openair_lte/openair2/RRC/LITE/MESSAGES/asn1c/asn1c/skeletons/asn_codecs_prim.c patch_dir/asn_codecs_prim.c
-*** /homes/kaltenbe/Devel/openair/openair_branches/openair_lte/openair2/RRC/LITE/MESSAGES/asn1c/asn1c/skeletons/asn_codecs_prim.c 2011-03-31 10:22:56.000000000 +0200
---- patch_dir/asn_codecs_prim.c 2011-05-31 10:28:26.000000000 +0200
-***************
-*** 4,10 ****
- */
- #include
- #include
-- #include
-
- /*
- * Decode an always-primitive type.
---- 4,9 ----
-diff -cB /homes/kaltenbe/Devel/openair/openair_branches/openair_lte/openair2/RRC/LITE/MESSAGES/asn1c/asn1c/skeletons/asn_internal.h patch_dir/asn_internal.h
-*** /homes/kaltenbe/Devel/openair/openair_branches/openair_lte/openair2/RRC/LITE/MESSAGES/asn1c/asn1c/skeletons/asn_internal.h 2011-03-31 10:22:57.000000000 +0200
---- patch_dir/asn_internal.h 2011-05-31 10:28:26.000000000 +0200
-***************
-*** 10,20 ****
---- 10,31 ----
- #define _ASN_INTERNAL_H_
-
- #include "asn_application.h" /* Application-visible API */
-+ #ifndef USER_MODE
-+ #include
-+ #include
-+ #include "rtai_mem.h"
-+ #endif
-
- #ifndef __NO_ASSERT_H__ /* Include assert.h only for internal use. */
- #include /* for assert() macro */
- #endif
-
-+ #ifndef USER_MODE
-+ #ifndef assert
-+ #define assert(expr) ((expr) ? (void) 0 : printk("Assertion failed in %s:%d\n", __FILE__, __LINE__))
-+ #endif
-+ #endif
-+
- #ifdef __cplusplus
- extern "C" {
- #endif
-***************
-*** 23,32 ****
---- 34,51 ----
- #define ASN1C_ENVIRONMENT_VERSION 922 /* Compile-time version */
- int get_asn1c_environment_version(void); /* Run-time version */
-
-+ #ifdef USER_MODE
- #define CALLOC(nmemb, size) calloc(nmemb, size)
- #define MALLOC(size) malloc(size)
- #define REALLOC(oldptr, size) realloc(oldptr, size)
- #define FREEMEM(ptr) free(ptr)
-+ #else
-+ #define CALLOC(nmemb, size) rt_calloc(nmemb,size)
-+ #define MALLOC(size) rt_malloc(size)
-+ #define REALLOC(oldptr, size) rt_realloc(oldptr, size)
-+ #define FREEMEM(ptr) rt_free(ptr);
-+ #endif
-+
-
- /*
- * A macro for debugging the ASN.1 internals.
-***************
-*** 38,45 ****
- #ifdef ASN_THREAD_SAFE
- #define asn_debug_indent 0
- #else /* !ASN_THREAD_SAFE */
-! int asn_debug_indent;
- #endif /* ASN_THREAD_SAFE */
- #define ASN_DEBUG(fmt, args...) do { \
- int adi = asn_debug_indent; \
- while(adi--) fprintf(stderr, " "); \
---- 57,65 ----
- #ifdef ASN_THREAD_SAFE
- #define asn_debug_indent 0
- #else /* !ASN_THREAD_SAFE */
-! extern int asn_debug_indent;
- #endif /* ASN_THREAD_SAFE */
-+ #ifdef USER_MODE
- #define ASN_DEBUG(fmt, args...) do { \
- int adi = asn_debug_indent; \
- while(adi--) fprintf(stderr, " "); \
-***************
-*** 47,52 ****
---- 67,81 ----
- fprintf(stderr, " (%s:%d)\n", \
- __FILE__, __LINE__); \
- } while(0)
-+ #else
-+ #define ASN_DEBUG(fmt, args...) do { \
-+ int adi = asn_debug_indent; \
-+ while(adi--) printk(" "); \
-+ printk(fmt, ##args); \
-+ printk(" (%s:%d)\n", \
-+ __FILE__, __LINE__); \
-+ } while(0)
-+ #endif
- #else /* !__GNUC__ */
- void ASN_DEBUG_f(const char *fmt, ...);
- #define ASN_DEBUG ASN_DEBUG_f
-diff -cB /homes/kaltenbe/Devel/openair/openair_branches/openair_lte/openair2/RRC/LITE/MESSAGES/asn1c/asn1c/skeletons/asn_SET_OF.c patch_dir/asn_SET_OF.c
-*** /homes/kaltenbe/Devel/openair/openair_branches/openair_lte/openair2/RRC/LITE/MESSAGES/asn1c/asn1c/skeletons/asn_SET_OF.c 2011-03-31 10:22:56.000000000 +0200
---- patch_dir/asn_SET_OF.c 2011-05-31 10:28:26.000000000 +0200
-***************
-*** 4,10 ****
- */
- #include
- #include
-- #include
-
- /*
- * Add another element into the set.
---- 4,9 ----
-***************
-*** 21,26 ****
---- 20,27 ----
- /*
- * Make sure there's enough space to insert an element.
- */
-+ ASN_DEBUG("SET ADD: count %d, size %d",as->count,as->size);
-+
- if(as->count == as->size) {
- int _newsize = as->size ? (as->size << 1) : 4;
- void *_new_arr;
-diff -cB /homes/kaltenbe/Devel/openair/openair_branches/openair_lte/openair2/RRC/LITE/MESSAGES/asn1c/asn1c/skeletons/asn_system.h patch_dir/asn_system.h
-*** /homes/kaltenbe/Devel/openair/openair_branches/openair_lte/openair2/RRC/LITE/MESSAGES/asn1c/asn1c/skeletons/asn_system.h 2011-03-31 10:22:57.000000000 +0200
---- patch_dir/asn_system.h 2011-05-31 10:28:26.000000000 +0200
-***************
-*** 13,25 ****
- #include "config.h"
- #endif
-
-! #include /* For snprintf(3) */
-! #include /* For *alloc(3) */
-! #include /* For memcpy(3) */
-! #include /* For size_t */
-! #include /* For LONG_MAX */
-! #include /* For va_start */
-! #include /* for offsetof and ptrdiff_t */
-
- #ifdef WIN32
-
---- 13,39 ----
- #include "config.h"
- #endif
-
-! #ifdef USER_MODE
-! #include // For snprintf(3)
-! #include // For *alloc(3)
-! #include // For memcpy(3)
-! #include // For size_t
-! #include // For LONG_MAX
-! #include // For va_start
-! #include // for offsetof and ptrdiff_t
-! #include // For errno
-! #else
-! typedef char FILE;
-! #include
-! #include // For snprintf
-! #include // For sort
-! #define qsort(base,num,size,cmp_func) sort(base,num,size,cmp_func,NULL)
-! #include // For errno
-! #ifndef errno
-! extern int errno;
-! #endif
-! #include "bsearch.h"
-! #endif
-
- #ifdef WIN32
-
-***************
-*** 63,69 ****
- #include
- #else /* !defined(__vxworks) */
-
-! #include /* C99 specifies this file */
- /*
- * 1. Earlier FreeBSD version didn't have ,
- * but was present.
---- 77,85 ----
- #include
- #else /* !defined(__vxworks) */
-
-! #ifdef USER_MODE
-! #include /*C99 specifies this file */
-! #endif
- /*
- * 1. Earlier FreeBSD version didn't have ,
- * but was present.
-***************
-*** 81,91 ****
- #define inline
- #endif /* __GNUC__ */
- #else
-! #include /* SUSv2+ and C99 specify this file, for uintXX_t */
- #endif /* defined(sun) */
- #endif
-
-! #include /* for ntohl() */
- #define sys_ntohl(foo) ntohl(foo)
-
- #endif /* defined(__vxworks) */
---- 97,109 ----
- #define inline
- #endif /* __GNUC__ */
- #else
-! #ifdef USER_MODE
-! #include /*SUSv2+ and C99 specify this file, for uintXX_t */
-! #endif
- #endif /* defined(sun) */
- #endif
-
-! /*#include for ntohl() */
- #define sys_ntohl(foo) ntohl(foo)
-
- #endif /* defined(__vxworks) */
-diff -cB /homes/kaltenbe/Devel/openair/openair_branches/openair_lte/openair2/RRC/LITE/MESSAGES/asn1c/asn1c/skeletons/ber_tlv_tag.c patch_dir/ber_tlv_tag.c
-*** /homes/kaltenbe/Devel/openair/openair_branches/openair_lte/openair2/RRC/LITE/MESSAGES/asn1c/asn1c/skeletons/ber_tlv_tag.c 2011-03-31 10:22:56.000000000 +0200
---- patch_dir/ber_tlv_tag.c 2011-05-31 10:28:26.000000000 +0200
-***************
-*** 4,10 ****
- */
- #include
- #include
-- #include
-
- ssize_t
- ber_fetch_tag(const void *ptr, size_t size, ber_tlv_tag_t *tag_r) {
---- 4,9 ----
-***************
-*** 57,63 ****
- return 0; /* Want more */
- }
-
-!
- ssize_t
- ber_tlv_tag_fwrite(ber_tlv_tag_t tag, FILE *f) {
- char buf[sizeof("[APPLICATION ]") + 32];
---- 56,62 ----
- return 0; /* Want more */
- }
-
-! #ifdef USER_MODE
- ssize_t
- ber_tlv_tag_fwrite(ber_tlv_tag_t tag, FILE *f) {
- char buf[sizeof("[APPLICATION ]") + 32];
-***************
-*** 71,76 ****
---- 70,76 ----
-
- return fwrite(buf, 1, ret, f);
- }
-+ #endif
-
- ssize_t
- ber_tlv_tag_snprint(ber_tlv_tag_t tag, char *buf, size_t size) {
-diff -cB /homes/kaltenbe/Devel/openair/openair_branches/openair_lte/openair2/RRC/LITE/MESSAGES/asn1c/asn1c/skeletons/constraints.c patch_dir/constraints.c
-*** /homes/kaltenbe/Devel/openair/openair_branches/openair_lte/openair2/RRC/LITE/MESSAGES/asn1c/asn1c/skeletons/constraints.c 2011-03-31 10:22:57.000000000 +0200
---- patch_dir/constraints.c 2011-05-31 10:28:26.000000000 +0200
-***************
-*** 1,4 ****
-! #include "asn_internal.h"
- #include "constraints.h"
-
- int
---- 1,4 ----
-! #include
- #include "constraints.h"
-
- int
-diff -cB /homes/kaltenbe/Devel/openair/openair_branches/openair_lte/openair2/RRC/LITE/MESSAGES/asn1c/asn1c/skeletons/constr_TYPE.c patch_dir/constr_TYPE.c
-*** /homes/kaltenbe/Devel/openair/openair_branches/openair_lte/openair2/RRC/LITE/MESSAGES/asn1c/asn1c/skeletons/constr_TYPE.c 2011-03-31 10:22:56.000000000 +0200
---- patch_dir/constr_TYPE.c 2011-05-31 10:28:26.000000000 +0200
-***************
-*** 4,10 ****
- */
- #include
- #include
-- #include
-
- /*
- * Version of the ASN.1 infrastructure shipped with compiler.
---- 4,9 ----
-***************
-*** 29,34 ****
---- 28,34 ----
- return type_descriptor->outmost_tag(type_descriptor, struct_ptr, 0, 0);
- }
-
-+ #ifdef USER_MODE
- /*
- * Print the target language's structure in human readable form.
- */
-***************
-*** 75,77 ****
---- 75,78 ----
- fprintf(stderr, "\n");
- va_end(ap);
- }
-+ #endif
-diff -cB /homes/kaltenbe/Devel/openair/openair_branches/openair_lte/openair2/RRC/LITE/MESSAGES/asn1c/asn1c/skeletons/der_encoder.c patch_dir/der_encoder.c
-*** /homes/kaltenbe/Devel/openair/openair_branches/openair_lte/openair2/RRC/LITE/MESSAGES/asn1c/asn1c/skeletons/der_encoder.c 2011-03-31 10:22:56.000000000 +0200
---- patch_dir/der_encoder.c 2011-05-31 10:28:26.000000000 +0200
-***************
-*** 3,9 ****
- * Redistribution and modifications are permitted subject to BSD license.
- */
- #include
-- #include
-
- static ssize_t der_write_TL(ber_tlv_tag_t tag, ber_tlv_len_t len,
- asn_app_consume_bytes_f *cb, void *app_key, int constructed);
---- 3,8 ----
-***************
-*** 81,89 ****
---- 80,90 ----
- asn_app_consume_bytes_f *cb,
- void *app_key) {
- ber_tlv_tag_t *tags; /* Copy of tags stream */
-+ ber_tlv_tag_t tags_array[8];
- int tags_count; /* Number of tags */
- size_t overall_length;
- ssize_t *lens;
-+ ssize_t lens_array[8];
- int i;
-
- ASN_DEBUG("Writing tags (%s, tm=%d, tc=%d, tag=%s, mtc=%d)",
-***************
-*** 102,111 ****
- * and initialize it appropriately.
- */
- int stag_offset;
-! tags = (ber_tlv_tag_t *)alloca((sd->tags_count + 1) * sizeof(ber_tlv_tag_t));
- if(!tags) { /* Can fail on !x86 */
-! errno = ENOMEM;
-! return -1;
- }
- tags_count = sd->tags_count
- + 1 /* EXPLICIT or IMPLICIT tag is given */
---- 103,121 ----
- * and initialize it appropriately.
- */
- int stag_offset;
-! //tags = (ber_tlv_tag_t *)alloca((sd->tags_count + 1) * sizeof(ber_tlv_tag_t));
-! tags = &(tags_array[0]);
-! if ((sd->tags_count + 1)>=8) {
-! #ifdef USER_MODE
-! printf("der_encoder.c: ERROR tags array too small. Increase size!\n");
-! exit(-1);
-! #endif
-! errno = ENOMEM;
-! return -1;
-! }
- if(!tags) { /* Can fail on !x86 */
-! errno = ENOMEM;
-! return -1;
- }
- tags_count = sd->tags_count
- + 1 /* EXPLICIT or IMPLICIT tag is given */
-***************
-*** 124,135 ****
- if(tags_count == 0)
- return 0;
-
-! lens = (ssize_t *)alloca(tags_count * sizeof(lens[0]));
- if(!lens) {
-! errno = ENOMEM;
-! return -1;
- }
-!
- /*
- * Array of tags is initialized.
- * Now, compute the size of the TLV pairs, from right to left.
---- 134,154 ----
- if(tags_count == 0)
- return 0;
-
-! //lens = (ssize_t *)alloca(tags_count * sizeof(lens[0]));
-! lens = &(lens_array[0]);
-! if (tags_count>=8) {
-! #ifdef USER_MODE
-! printf("der_encoder.c: ERROR lens array too small. Increase size!\n");
-! exit(-1);
-! #endif
-! errno = ENOMEM;
-! return -1;
-! }
- if(!lens) {
-! errno = ENOMEM;
-! return -1;
- }
-!
- /*
- * Array of tags is initialized.
- * Now, compute the size of the TLV pairs, from right to left.
-diff -cB /homes/kaltenbe/Devel/openair/openair_branches/openair_lte/openair2/RRC/LITE/MESSAGES/asn1c/asn1c/skeletons/INTEGER.c patch_dir/INTEGER.c
-*** /homes/kaltenbe/Devel/openair/openair_branches/openair_lte/openair2/RRC/LITE/MESSAGES/asn1c/asn1c/skeletons/INTEGER.c 2011-03-31 10:22:56.000000000 +0200
---- patch_dir/INTEGER.c 2011-05-31 10:28:26.000000000 +0200
-***************
-*** 6,12 ****
- #include
- #include
- #include /* Encoder and decoder of a primitive type */
-- #include
-
- /*
- * INTEGER basic type description.
---- 6,11 ----
-***************
-*** 103,109 ****
- static ssize_t
- INTEGER__dump(asn_TYPE_descriptor_t *td, const INTEGER_t *st, asn_app_consume_bytes_f *cb, void *app_key, int plainOrXER) {
- asn_INTEGER_specifics_t *specs=(asn_INTEGER_specifics_t *)td->specifics;
-! char scratch[32]; /* Enough for 64-bit integer */
- uint8_t *buf = st->buf;
- uint8_t *buf_end = st->buf + st->size;
- signed long accum;
---- 102,108 ----
- static ssize_t
- INTEGER__dump(asn_TYPE_descriptor_t *td, const INTEGER_t *st, asn_app_consume_bytes_f *cb, void *app_key, int plainOrXER) {
- asn_INTEGER_specifics_t *specs=(asn_INTEGER_specifics_t *)td->specifics;
-! char scratch[128];
- uint8_t *buf = st->buf;
- uint8_t *buf_end = st->buf + st->size;
- signed long accum;
-***************
-*** 142,149 ****
---- 141,152 ----
-
- el = INTEGER_map_value2enum(specs, accum);
- if(el) {
-+ scrsize = sizeof(scratch);
-+ scr = scratch;
-+ /* cannot use alloca in kernel
- scrsize = el->enum_len + 32;
- scr = (char *)alloca(scrsize);
-+ */
- if(plainOrXER == 0)
- ret = snprintf(scr, scrsize,
- "%ld (%s)", accum, el->enum_name);
-diff -cB /homes/kaltenbe/Devel/openair/openair_branches/openair_lte/openair2/RRC/LITE/MESSAGES/asn1c/asn1c/skeletons/NativeEnumerated.c patch_dir/NativeEnumerated.c
-*** /homes/kaltenbe/Devel/openair/openair_branches/openair_lte/openair2/RRC/LITE/MESSAGES/asn1c/asn1c/skeletons/NativeEnumerated.c 2011-03-31 10:22:57.000000000 +0200
---- patch_dir/NativeEnumerated.c 2011-05-31 10:28:26.000000000 +0200
-***************
-*** 46,51 ****
---- 46,52 ----
- asn_app_consume_bytes_f *cb, void *app_key) {
- asn_INTEGER_specifics_t *specs=(asn_INTEGER_specifics_t *)td->specifics;
- asn_enc_rval_t er;
-+ char scratch[128];
- const long *native = (const long *)sptr;
- const asn_INTEGER_enum_map_t *el;
-
-***************
-*** 57,63 ****
- el = INTEGER_map_value2enum(specs, *native);
- if(el) {
- size_t srcsize = el->enum_len + 5;
-! char *src = (char *)alloca(srcsize);
-
- er.encoded = snprintf(src, srcsize, "<%s/>", el->enum_name);
- assert(er.encoded > 0 && (size_t)er.encoded < srcsize);
---- 58,64 ----
- el = INTEGER_map_value2enum(specs, *native);
- if(el) {
- size_t srcsize = el->enum_len + 5;
-! char *src = (char *)scratch; //alloca(srcsize);
-
- er.encoded = snprintf(src, srcsize, "<%s/>", el->enum_name);
- assert(er.encoded > 0 && (size_t)er.encoded < srcsize);
-diff -cB /homes/kaltenbe/Devel/openair/openair_branches/openair_lte/openair2/RRC/LITE/MESSAGES/asn1c/asn1c/skeletons/OCTET_STRING.c patch_dir/OCTET_STRING.c
-*** /homes/kaltenbe/Devel/openair/openair_branches/openair_lte/openair2/RRC/LITE/MESSAGES/asn1c/asn1c/skeletons/OCTET_STRING.c 2011-03-31 10:22:55.000000000 +0200
---- patch_dir/OCTET_STRING.c 2011-05-31 10:28:26.000000000 +0200
-***************
-*** 6,12 ****
- #include
- #include
- #include /* for .bits_unused member */
-- #include
-
- /*
- * OCTET STRING basic type description.
---- 6,11 ----
-diff -cB /homes/kaltenbe/Devel/openair/openair_branches/openair_lte/openair2/RRC/LITE/MESSAGES/asn1c/asn1c/skeletons/xer_encoder.c patch_dir/xer_encoder.c
-*** /homes/kaltenbe/Devel/openair/openair_branches/openair_lte/openair2/RRC/LITE/MESSAGES/asn1c/asn1c/skeletons/xer_encoder.c 2011-04-11 18:03:26.000000000 +0200
---- patch_dir/xer_encoder.c 2011-05-31 10:28:26.000000000 +0200
-***************
-*** 3,10 ****
- * Redistribution and modifications are permitted subject to BSD license.
- */
- #include
-! #include
-! #include
-
- /*
- * The XER encoder of any type. May be invoked by the application.
---- 3,10 ----
- * Redistribution and modifications are permitted subject to BSD license.
- */
- #include
-! //#include
-! //#include
-
- /*
- * The XER encoder of any type. May be invoked by the application.
-***************
-*** 41,46 ****
---- 41,47 ----
- * This is a helper function for xer_fprint, which directs all incoming data
- * into the provided file descriptor.
- */
-+ #ifdef USER_MODE
- static int
- xer__print2fp(const void *buffer, size_t size, void *app_key) {
- FILE *stream = (FILE *)app_key;
-***************
-*** 65,67 ****
---- 66,69 ----
-
- return fflush(stream);
- }
-+ #endif
diff --git a/openair2/RRC/LTE/rrc_UE.c b/openair2/RRC/LTE/rrc_UE.c
index 30fb20b727..4b862fa11d 100644
--- a/openair2/RRC/LTE/rrc_UE.c
+++ b/openair2/RRC/LTE/rrc_UE.c
@@ -393,15 +393,7 @@ char openair_rrc_ue_init( const module_id_t ue_mod_idP, const unsigned char eNB_
init_SI_UE(&ctxt,eNB_index);
LOG_D(RRC,PROTOCOL_RRC_CTXT_FMT" INIT: phy_sync_2_ch_ind\n",
PROTOCOL_RRC_CTXT_ARGS(&ctxt));
-#ifndef NO_RRM
- send_msg(&S_rrc,msg_rrc_phy_synch_to_CH_ind(ctxt.module_id,eNB_index,UE_rrc_inst[ctxt.module_id].Mac_id));
-#endif
-#ifndef NO_RRM
- send_msg(&S_rrc,msg_rrc_phy_synch_to_CH_ind(ctxt.module_id,eNB_index,UE_rrc_inst[ctxt.module_id].Mac_id));
-#endif
-#ifdef NO_RRM //init ch SRB0, SRB1 & BDTCH
openair_rrc_on_ue(&ctxt);
-#endif
return 0;
}
@@ -2249,9 +2241,6 @@ rrc_ue_decode_dcch(
}
}
-#ifndef NO_RRM
- send_msg(&S_rrc,msg_rrc_end_scan_req(ctxt_pP->module_id,eNB_indexP));
-#endif
}
const char siWindowLength[9][5] = {"1ms","2ms","5ms","10ms","15ms","20ms","40ms","80ms","ERR"};
@@ -2530,14 +2519,6 @@ int decode_BCCH_MBMS_DLSCH_Message(
break;
}
}*/
- /*if ((rrc_get_sub_state(ctxt_pP->module_id) == RRC_SUB_STATE_IDLE_SIB_COMPLETE)
- #if defined(ENABLE_USE_MME)
- && (UE_rrc_inst[ctxt_pP->module_id].initialNasMsg.data != NULL)
- #endif
- ) {
- rrc_ue_generate_RRCConnectionRequest(ctxt_pP, 0);
- rrc_set_sub_state( ctxt_pP->module_id, RRC_SUB_STATE_IDLE_CONNECTING );
- }*/
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_BCCH, VCD_FUNCTION_OUT );
return 0;
}
diff --git a/openair2/RRC/LTE/rrc_defs.h b/openair2/RRC/LTE/rrc_defs.h
index f5b1db8b8c..40aad67a06 100644
--- a/openair2/RRC/LTE/rrc_defs.h
+++ b/openair2/RRC/LTE/rrc_defs.h
@@ -173,13 +173,6 @@ extern pthread_mutex_t slrb_mutex;
//the thread function
void *send_UE_status_notification(void *);
-
-
-//#include "COMMON/openair_defs.h"
-#ifndef USER_MODE
- //#include
-#endif
-
#include "LTE_SystemInformationBlockType1.h"
#include "LTE_SystemInformation.h"
#include "LTE_RRCConnectionReconfiguration.h"
@@ -217,12 +210,6 @@ void *send_UE_status_notification(void *);
#define NB_SIG_CNX_UE 2 //MAX_MANAGED_RG_PER_MOBILE
#define NB_CNX_UE 2//MAX_MANAGED_RG_PER_MOBILE
-#ifndef NO_RRM
- #include "L3_rrc_interface.h"
- #include "rrc_rrm_msg.h"
- #include "rrc_rrm_interface.h"
-#endif
-
#include "intertask_interface.h"
diff --git a/openair2/RRC/LTE/rrc_eNB.c b/openair2/RRC/LTE/rrc_eNB.c
index a03fb51749..819608fbe2 100644
--- a/openair2/RRC/LTE/rrc_eNB.c
+++ b/openair2/RRC/LTE/rrc_eNB.c
@@ -3618,9 +3618,7 @@ void rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt_t
NULL,
NULL,
NULL
-#if (LTE_RRC_VERSION >= MAKE_VERSION(9, 0, 0))
, (LTE_PMCH_InfoList_r9_t *) NULL
-#endif
, NULL);
/* Refresh SRBs/DRBs */
@@ -3629,11 +3627,9 @@ void rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt_t
*SRB_configList2, // NULL,
*DRB_configList,
NULL
-#if (LTE_RRC_VERSION >= MAKE_VERSION(9, 0, 0))
, (LTE_PMCH_InfoList_r9_t *) NULL,
0,
0
-#endif
);
}
@@ -6331,9 +6327,7 @@ rrc_eNB_generate_HO_RRCConnectionReconfiguration(const protocol_ctxt_t *const ct
NULL,
NULL,
NULL
-#if (LTE_RRC_VERSION >= MAKE_VERSION(9, 0, 0))
, (LTE_PMCH_InfoList_r9_t *) NULL
-#endif
, NULL);
/* Refresh SRBs/DRBs */
@@ -6342,11 +6336,9 @@ rrc_eNB_generate_HO_RRCConnectionReconfiguration(const protocol_ctxt_t *const ct
*SRB_configList2, // NULL,
*DRB_configList,
NULL
-#if (LTE_RRC_VERSION >= MAKE_VERSION(9, 0, 0))
, (LTE_PMCH_InfoList_r9_t *) NULL,
0,
0
-#endif
);
}
@@ -7287,9 +7279,6 @@ rrc_eNB_decode_ccch(
PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP),
rrcConnectionReestablishmentRequest->ue_Identity.physCellId,
ue_context_p->ue_context.reestablishment_cause);
-#ifndef NO_RRM
- send_msg(&S_rrc, msg_rrc_MR_attach_ind(ctxt_pP->module_id, Mac_id));
-#else
ue_context_p->ue_context.primaryCC_id = CC_id;
//LG COMMENT Idx = (ue_mod_idP * NB_RB_MAX) + DCCH;
Idx = DCCH;
@@ -7343,7 +7332,6 @@ rrc_eNB_decode_ccch(
);
}
-#endif //NO_RRM
}
break;
@@ -7532,9 +7520,6 @@ rrc_eNB_decode_ccch(
}
}
-#ifndef NO_RRM
- send_msg(&S_rrc, msg_rrc_MR_attach_ind(ctxt_pP->module_id, Mac_id));
-#else
ue_context_p->ue_context.primaryCC_id = CC_id;
//LG COMMENT Idx = (ue_mod_idP * NB_RB_MAX) + DCCH;
Idx = DCCH;
@@ -7587,7 +7572,6 @@ rrc_eNB_decode_ccch(
);
}
-#endif //NO_RRM
break;
default:
diff --git a/openair2/RRC/LTE/rrc_rrm_interface.c b/openair2/RRC/LTE/rrc_rrm_interface.c
deleted file mode 100644
index fe15dae46d..0000000000
--- a/openair2/RRC/LTE/rrc_rrm_interface.c
+++ /dev/null
@@ -1,277 +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
- */
-
-/*!
-*******************************************************************************
-
-\file rrm_sock.c
-
-\brief RRM (Radio Ressource Manager ) Socket: communication withe other medium:
- - RRC ,
- - CMM ,
- - PUSU
-
-\author BURLOT Pascal
-
-\date 10/07/08
-
-
-\par Historique:
- P.BURLOT 2009-01-20
- + send a message via fifo:
- - sending header
- - and data if any
-
-*******************************************************************************
-*/
-
-#ifndef RRC_RRM_FIFOS_XFACE
- #include
- #include
- #include
- #include
- #include
-
- #include
- #include
-
-#else
-
- #include
-
-#endif
-
-#include "rrc_rrm_interface.h"
-#include "defs.h"
-//! \brief Taille maximale de la charge utile
-#define SIZE_MAX_PAYLOAD 2048
-//! \brief PID de l'espace utilisateur (Netlink mode)
-//#define PID_USERSPACE 0xAA
-
-
-
-
-
-#ifndef RRC_RRM_FIFOS_XFACE
-
-/*!
-*******************************************************************************
-\brief This function opens a unix socket for the rrm communication
-\return The return value is a socket handle
-*/
-int open_socket(
- sock_rrm_t *s, ///< socket descriptor
- char *path_local, ///< local socket path if unix socket
- char *path_dest, ///< host Socket path if unix socket
- int rrm_inst ///< instance of the rrm entity
-) {
- /* Unix socket */
- int socket_fd ;
- int len ;
-
- if ((socket_fd = socket(AF_UNIX, SOCK_DGRAM, 0)) == -1) {
- perror("unix socket");
- return -1 ;
- }
-
- memset(&(s->un_local_addr), 0, sizeof(struct sockaddr_un));
- s->un_local_addr.sun_family = AF_UNIX;
- sprintf(s->un_local_addr.sun_path,"%s%d", path_local, rrm_inst );
- unlink(s->un_local_addr.sun_path);
- msg("local %s\n",s->un_local_addr.sun_path);
- len = strlen((s->un_local_addr).sun_path) + sizeof((s->un_local_addr).sun_family);
-
- if (bind(socket_fd, (struct sockaddr *)&(s->un_local_addr), len) == -1) {
- perror("bind");
- return -1 ;
- }
-
- memset(&(s->un_dest_addr), 0, sizeof(struct sockaddr_un));
- s->un_dest_addr.sun_family = AF_UNIX;
- sprintf(s->un_dest_addr.sun_path,"%s%d", path_dest, rrm_inst );
- msg("Dest %s\n",s->un_dest_addr.sun_path);
- s->s = socket_fd ;
- return socket_fd ;
-}
-/*!
-*******************************************************************************
-\brief This function closes a RRM socket
-\return none
-*/
-void close_socket(
- sock_rrm_t *sock ///< the socket handle
-) {
- shutdown(sock->s, SHUT_RDWR);
- close(sock->s);
-}
-
-/*!
-*******************************************************************************
-\brief This function send a buffer message to the unix socket
-\return if OK then "0" is returned else "-1"
-*/
-char BUFF[2048];
-int send_msg_sock(
- sock_rrm_t *s, ///< socket descriptor
- msg_t *smsg ///< the message to send
-) {
- /* Unix socket */
- int ret = 0 ;
- // char *buf = NULL;
- struct msghdr msghd ;
- struct iovec iov;
- int taille = sizeof(msg_head_t) ;
-
- if ( smsg == NULL ) {
- return -1 ;
- }
-
- if ( smsg->data != NULL ) {
- taille += smsg->head.size ;
- }
-
- //buf = RRM_MALLOC(char, taille);
- //if (buf ==NULL)
- //return -1 ;
- memcpy( BUFF, &(smsg->head), sizeof(msg_head_t) ) ;
- memcpy( BUFF+sizeof(msg_head_t), smsg->data, smsg->head.size ) ;
- iov.iov_base = (void *)BUFF;
- iov.iov_len = taille ;
- msghd.msg_name = (void *)&(s->un_dest_addr);
- msghd.msg_namelen = sizeof(s->un_dest_addr);
- msghd.msg_iov = &iov;
- msghd.msg_iovlen = 1;
- msghd.msg_control = NULL ;
- msghd.msg_controllen = 0 ;
-
- if ( sendmsg(s->s, &msghd, 0) < 0 ) {
- ret = -1;
- msg("socket %d, dest %s\n",s->s,s->un_dest_addr.sun_path);
- perror("sendmsg:unix socket");
- }
-
- //RRM_FREE(buf) ;
- //RRM_FREE(msg->data) ;
- //RRM_FREE(msg) ;
- return ret ;
-}
-
-/*!
-*******************************************************************************
-\brief This function read a buffer from a unix socket
-\return the function returns a message pointer. If the pointeur is NULL, a error
- is happened.
-*/
-char *recv_msg(
- sock_rrm_t *s ///< socket descriptor
-) {
- /* Unix socket */
- char *buf = NULL;
- char *smsg = NULL;
- struct msghdr msghd ;
- struct iovec iov;
- int size_msg ;
- msg_head_t *head ;
- int ret ;
- int taille = SIZE_MAX_PAYLOAD ;
- buf = RRM_CALLOC( char,taille);
-
- if ( buf == NULL ) {
- return NULL ;
- }
-
- iov.iov_base = (void *)buf;
- iov.iov_len = taille ;
- msghd.msg_name = (void *)&(s->un_dest_addr);
- msghd.msg_namelen = sizeof(s->un_dest_addr);
- msghd.msg_iov = &iov;
- msghd.msg_iovlen = 1;
- msghd.msg_control = NULL ;
- msghd.msg_controllen= 0 ;
- ret = recvmsg(s->s, &msghd, 0 ) ;
-
- if ( ret <= 0 ) {
- // non-blocking socket
- // perror("PB recvmsg_un");
- RRM_FREE(buf);
- return NULL ;
- }
-
- if (msghd.msg_flags != 0 ) {
- fprintf(stderr,"error recvmsg_un: 0x%02x\n", msghd.msg_flags) ;
- RRM_FREE(buf);
- return NULL ;
- }
-
- head = (msg_head_t *) buf ;
- size_msg = sizeof(msg_head_t) + head->size ;
- smsg = RRM_CALLOC(char, size_msg ) ;
-
- if ( smsg != NULL ) {
- memcpy( smsg, buf, size_msg ) ;
- }
-
- RRM_FREE( buf ) ;
- return smsg ;
-}
-
-#else //XFACE
-
-int send_msg_fifo(int *s, msg_t *fmsg) {
- int ret = 0, ret1;
- int taille = sizeof(msg_head_t) ;
- msg("write on fifos %d, msg %p\n",*s,fmsg);
-
- if ( fmsg == NULL ) {
- return -1 ;
- }
-
- // envoi le header
- ret1 = rtf_put (*s,(char *) &(fmsg->head), taille);
-
- if(ret1 <0) {
- msg("rtf_put H ERR %d\n",ret1);
- rtf_reset(*s);
- return ret1;
- }
-
- ret=ret1;
-
- // envoi les datas si elles sont definis
- if ( fmsg->data != NULL ) {
- ret1 += rtf_put (*s,(char *) fmsg->data, fmsg->head.size);
-
- if(ret1 <0) {
- msg("rtf_put D ERR %d\n",ret1);
- rtf_reset(*s);
- return ret1;
- }
- }
-
- ret+=ret1;
- return ret;
-}
-
-#endif //XFACE
-
-int send_msg(void *s, msg_t *smsg) {
- send_msg_sock((sock_rrm_t *)s, smsg);
-}
diff --git a/openair2/RRC/NR/MESSAGES/asn1_msg.c b/openair2/RRC/NR/MESSAGES/asn1_msg.c
index eb6f86fda6..0d95fce930 100755
--- a/openair2/RRC/NR/MESSAGES/asn1_msg.c
+++ b/openair2/RRC/NR/MESSAGES/asn1_msg.c
@@ -133,18 +133,6 @@
#include "common/ran_context.h"
-//#include "PHY/defs.h"
-/*#ifndef USER_MODE
-#define msg printk
-#ifndef errno
-int errno;
-#endif
-#else
-# if !defined (msg)
-# define msg printf
-# endif
-#endif*/
-
//#define XER_PRINT
typedef struct xer_sprint_string_s {
@@ -1182,9 +1170,9 @@ void fill_initial_SpCellConfig(rnti_t rnti,
AssertFatal(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.subcarrierSpacing==NR_SubcarrierSpacing_kHz30,
"SCS != 30kHz\n");
AssertFatal(scc->tdd_UL_DL_ConfigurationCommon->pattern1.dl_UL_TransmissionPeriodicity==NR_TDD_UL_DL_Pattern__dl_UL_TransmissionPeriodicity_ms5,
- "TDD period != 5ms : %ld\n",scc->tdd_UL_DL_ConfigurationCommon->pattern1.dl_UL_TransmissionPeriodicity);
-
- schedulingRequestResourceConfig->periodicityAndOffset->choice.sl40 = 8+(10*((rnti>>1)&3)) + (rnti&1);
+ "TDD period != 5ms : %ld\n",scc->tdd_UL_DL_ConfigurationCommon->pattern1.dl_UL_TransmissionPeriodicity);
+
+ schedulingRequestResourceConfig->periodicityAndOffset->choice.sl40 = 8 + 10*((rnti>>1)&3) + (rnti&1);
schedulingRequestResourceConfig->resource = calloc(1,sizeof(*schedulingRequestResourceConfig->resource));
*schedulingRequestResourceConfig->resource = 0;
ASN_SEQUENCE_ADD(&pucch_Config->schedulingRequestResourceToAddModList->list,schedulingRequestResourceConfig);
diff --git a/openair2/RRC/NR/rrc_gNB.c b/openair2/RRC/NR/rrc_gNB.c
index 655e6973a1..34e570070d 100755
--- a/openair2/RRC/NR/rrc_gNB.c
+++ b/openair2/RRC/NR/rrc_gNB.c
@@ -106,9 +106,7 @@ extern boolean_t nr_rrc_pdcp_config_asn1_req(
uint8_t *const kRRCint,
uint8_t *const kUPenc,
uint8_t *const kUPint
- #if (LTE_RRC_VERSION >= MAKE_VERSION(9, 0, 0))
,LTE_PMCH_InfoList_r9_t *pmch_InfoList_r9
- #endif
,rb_id_t *const defaultDRB,
struct NR_CellGroupConfig__rlc_BearerToAddModList *rlc_bearer2add_list);
@@ -1010,7 +1008,7 @@ rrc_gNB_generate_dedicatedRRCReconfiguration(
sdap_config = CALLOC(1, sizeof(NR_SDAP_Config_t));
memset(sdap_config, 0, sizeof(NR_SDAP_Config_t));
sdap_config->pdu_Session = ue_context_pP->ue_context.pduSession[i].param.pdusession_id;
- sdap_config->sdap_HeaderDL = NR_SDAP_Config__sdap_HeaderDL_absent;
+ sdap_config->sdap_HeaderDL = NR_SDAP_Config__sdap_HeaderDL_present;
sdap_config->sdap_HeaderUL = NR_SDAP_Config__sdap_HeaderUL_absent;
sdap_config->defaultDRB = TRUE;
sdap_config->mappedQoS_FlowsToAdd = calloc(1, sizeof(struct NR_SDAP_Config__mappedQoS_FlowsToAdd));
@@ -1043,7 +1041,7 @@ rrc_gNB_generate_dedicatedRRCReconfiguration(
DRB_config->pdcp_Config->moreThanOneRLC = NULL;
DRB_config->pdcp_Config->t_Reordering = calloc(1, sizeof(*DRB_config->pdcp_Config->t_Reordering));
- *DRB_config->pdcp_Config->t_Reordering = NR_PDCP_Config__t_Reordering_ms750;
+ *DRB_config->pdcp_Config->t_Reordering = NR_PDCP_Config__t_Reordering_ms0;
DRB_config->pdcp_Config->ext1 = NULL;
if (rrc->security.do_drb_integrity) {
@@ -1305,51 +1303,22 @@ rrc_gNB_process_RRCReconfigurationComplete(
ue_context_pP->ue_context.ue_reestablishment_timer = 0;
-#ifndef PHYSIM
- uint8_t *k_kdf = NULL;
/* Derive the keys from kgnb */
if (DRB_configList != NULL) {
- k_kdf = NULL;
nr_derive_key_up_enc(ue_context_pP->ue_context.ciphering_algorithm,
ue_context_pP->ue_context.kgnb,
- &k_kdf);
- /* kUPenc: last 128 bits of key derivation function which returns 256 bits */
- kUPenc = malloc(16);
- if (kUPenc == NULL) exit(1);
- memcpy(kUPenc, k_kdf+16, 16);
- free(k_kdf);
-
- k_kdf = NULL;
+ &kUPenc);
nr_derive_key_up_int(ue_context_pP->ue_context.integrity_algorithm,
ue_context_pP->ue_context.kgnb,
- &k_kdf);
- /* kUPint: last 128 bits of key derivation function which returns 256 bits */
- kUPint = malloc(16);
- if (kUPint == NULL) exit(1);
- memcpy(kUPint, k_kdf+16, 16);
- free(k_kdf);
+ &kUPint);
}
- k_kdf = NULL;
nr_derive_key_rrc_enc(ue_context_pP->ue_context.ciphering_algorithm,
ue_context_pP->ue_context.kgnb,
- &k_kdf);
- /* kRRCenc: last 128 bits of key derivation function which returns 256 bits */
- kRRCenc = malloc(16);
- if (kRRCenc == NULL) exit(1);
- memcpy(kRRCenc, k_kdf+16, 16);
- free(k_kdf);
-
- k_kdf = NULL;
+ &kRRCenc);
nr_derive_key_rrc_int(ue_context_pP->ue_context.integrity_algorithm,
ue_context_pP->ue_context.kgnb,
- &k_kdf);
- /* kRRCint: last 128 bits of key derivation function which returns 256 bits */
- kRRCint = malloc(16);
- if (kRRCint == NULL) exit(1);
- memcpy(kRRCint, k_kdf+16, 16);
- free(k_kdf);
-#endif
+ &kRRCint);
/* Refresh SRBs/DRBs */
MSC_LOG_TX_MESSAGE(MSC_RRC_GNB, MSC_PDCP_ENB, NULL, 0, MSC_AS_TIME_FMT" CONFIG_REQ UE %x DRB (security unchanged)",
MSC_AS_TIME_ARGS(ctxt_pP),
@@ -3305,57 +3274,6 @@ void *rrc_gnb_task(void *args_p) {
case GTPV1U_GNB_DELETE_TUNNEL_RESP:
break;
- /*
- #if defined(ENABLE_USE_MME)
-
- // Messages from S1AP
- case S1AP_DOWNLINK_NAS:
- rrc_eNB_process_S1AP_DOWNLINK_NAS(msg_p, msg_name_p, instance, &rrc_gNB_mui);
- break;
-
- case S1AP_INITIAL_CONTEXT_SETUP_REQ:
- rrc_eNB_process_S1AP_INITIAL_CONTEXT_SETUP_REQ(msg_p, msg_name_p, instance);
- break;
-
- case S1AP_UE_CTXT_MODIFICATION_REQ:
- rrc_eNB_process_S1AP_UE_CTXT_MODIFICATION_REQ(msg_p, msg_name_p, instance);
- break;
-
- case S1AP_PAGING_IND:
- LOG_D(RRC, "[eNB %d] Received Paging message from S1AP: %s\n", instance, msg_name_p);
- rrc_eNB_process_PAGING_IND(msg_p, msg_name_p, instance);
- break;
-
- case S1AP_E_RAB_SETUP_REQ:
- rrc_eNB_process_S1AP_E_RAB_SETUP_REQ(msg_p, msg_name_p, instance);
- LOG_D(RRC, "[eNB %d] Received the message %s\n", instance, msg_name_p);
- break;
-
- case S1AP_E_RAB_MODIFY_REQ:
- rrc_eNB_process_S1AP_E_RAB_MODIFY_REQ(msg_p, msg_name_p, instance);
- break;
-
- case S1AP_E_RAB_RELEASE_COMMAND:
- rrc_eNB_process_S1AP_E_RAB_RELEASE_COMMAND(msg_p, msg_name_p, instance);
- break;
-
- case S1AP_UE_CONTEXT_RELEASE_REQ:
- rrc_eNB_process_S1AP_UE_CONTEXT_RELEASE_REQ(msg_p, msg_name_p, instance);
- break;
-
- case S1AP_UE_CONTEXT_RELEASE_COMMAND:
- rrc_eNB_process_S1AP_UE_CONTEXT_RELEASE_COMMAND(msg_p, msg_name_p, instance);
- break;
-
- case GTPV1U_ENB_DELETE_TUNNEL_RESP:
- ///Nothing to do. Apparently everything is done in S1AP processing
- //LOG_I(RRC, "[eNB %d] Received message %s, not processed because procedure not synched\n",
- //instance, msg_name_p);
- AssertFatal(false, "Removed double mechanism for same feature: now delete_tunnel() function should be called\n");
- break;
-
- #endif
- */
/* Messages from gNB app */
case NRRRC_CONFIGURATION_REQ:
LOG_I(NR_RRC, "[gNB %ld] Received %s : %p\n", instance, msg_name_p,&NRRRC_CONFIGURATION_REQ(msg_p));
diff --git a/openair2/RRC/NR/rrc_gNB_NGAP.c b/openair2/RRC/NR/rrc_gNB_NGAP.c
index 714db9da30..60ee99a172 100644
--- a/openair2/RRC/NR/rrc_gNB_NGAP.c
+++ b/openair2/RRC/NR/rrc_gNB_NGAP.c
@@ -308,43 +308,19 @@ nr_rrc_pdcp_config_security(
uint8_t *kUPenc = NULL;
static int print_keys= 1;
-#ifndef PHYSIM
-
- uint8_t *k_kdf = NULL;
-
/* Derive the keys from kgnb */
if (SRB_configList != NULL) {
- k_kdf = NULL;
nr_derive_key_up_enc(ue_context_pP->ue_context.ciphering_algorithm,
ue_context_pP->ue_context.kgnb,
- &k_kdf);
- /* kUPenc: last 128 bits of key derivation function which returns 256 bits */
- kUPenc = malloc(16);
- if (kUPenc == NULL) exit(1);
- memcpy(kUPenc, k_kdf+16, 16);
- free(k_kdf);
+ &kUPenc);
}
- k_kdf = NULL;
nr_derive_key_rrc_enc(ue_context_pP->ue_context.ciphering_algorithm,
ue_context_pP->ue_context.kgnb,
- &k_kdf);
- /* kRRCenc: last 128 bits of key derivation function which returns 256 bits */
- kRRCenc = malloc(16);
- if (kRRCenc == NULL) exit(1);
- memcpy(kRRCenc, k_kdf+16, 16);
- free(k_kdf);
-
- k_kdf = NULL;
+ &kRRCenc);
nr_derive_key_rrc_int(ue_context_pP->ue_context.integrity_algorithm,
ue_context_pP->ue_context.kgnb,
- &k_kdf);
- /* kRRCint: last 128 bits of key derivation function which returns 256 bits */
- kRRCint = malloc(16);
- if (kRRCint == NULL) exit(1);
- memcpy(kRRCint, k_kdf+16, 16);
- free(k_kdf);
-#endif
+ &kRRCint);
if (!IS_SOFTMODEM_IQPLAYER) {
SET_LOG_DUMP(DEBUG_SECURITY) ;
}
diff --git a/openair2/RRC/NR/rrc_gNB_nsa.c b/openair2/RRC/NR/rrc_gNB_nsa.c
index 52f451d7bb..f9fce48f41 100644
--- a/openair2/RRC/NR/rrc_gNB_nsa.c
+++ b/openair2/RRC/NR/rrc_gNB_nsa.c
@@ -52,9 +52,7 @@ extern boolean_t nr_rrc_pdcp_config_asn1_req(
uint8_t *const kRRCint,
uint8_t *const kUPenc,
uint8_t *const kUPint
- #if (LTE_RRC_VERSION >= MAKE_VERSION(9, 0, 0))
,LTE_PMCH_InfoList_r9_t *pmch_InfoList_r9
- #endif
,rb_id_t *const defaultDRB,
struct NR_CellGroupConfig__rlc_BearerToAddModList *rlc_bearer2add_list);
@@ -215,25 +213,12 @@ void rrc_add_nsa_user(gNB_RRC_INST *rrc,struct rrc_gNB_ue_context_s *ue_context_
LOG_I(RRC, "selecting integrity algorithm %d\n", ue_context_p->ue_context.integrity_algorithm);
/* derive UP security key */
- unsigned char *kUPenc_kdf;
nr_derive_key_up_enc(ue_context_p->ue_context.ciphering_algorithm,
ue_context_p->ue_context.kgnb,
- &kUPenc_kdf);
- /* kUPenc: last 128 bits of key derivation function which returns 256 bits */
- kUPenc = malloc(16);
- if (kUPenc == NULL) exit(1);
- memcpy(kUPenc, kUPenc_kdf+16, 16);
- free(kUPenc_kdf);
-
- unsigned char *kUPint_kdf;
+ &kUPenc);
nr_derive_key_up_int(ue_context_p->ue_context.integrity_algorithm,
ue_context_p->ue_context.kgnb,
- &kUPint_kdf);
- /* kUPint: last 128 bits of key derivation function which returns 256 bits */
- kUPint = malloc(16);
- if (kUPint == NULL) exit(1);
- memcpy(kUPint, kUPint_kdf+16, 16);
- free(kUPint_kdf);
+ &kUPint);
e_NR_CipheringAlgorithm cipher_algo;
switch (ue_context_p->ue_context.ciphering_algorithm) {
diff --git a/openair2/RRC/NR_UE/rrc_UE.c b/openair2/RRC/NR_UE/rrc_UE.c
index 7c664d292d..61f757ed53 100644
--- a/openair2/RRC/NR_UE/rrc_UE.c
+++ b/openair2/RRC/NR_UE/rrc_UE.c
@@ -187,9 +187,7 @@ extern boolean_t nr_rrc_pdcp_config_asn1_req(
uint8_t *const kRRCint,
uint8_t *const kUPenc,
uint8_t *const kUPint
- #if (LTE_RRC_VERSION >= MAKE_VERSION(9, 0, 0))
,LTE_PMCH_InfoList_r9_t *pmch_InfoList_r9
- #endif
,rb_id_t *const defaultDRB,
struct NR_CellGroupConfig__rlc_BearerToAddModList *rlc_bearer2add_list);
@@ -1661,45 +1659,40 @@ int8_t nr_rrc_ue_decode_ccch( const protocol_ctxt_t *const ctxt_pP, const NR_SRB
uint8_t *kRRCenc = NULL;
uint8_t *kUPenc = NULL;
uint8_t *kRRCint = NULL;
- pdcp_t *pdcp_p = NULL;
- hash_key_t key = HASHTABLE_NOT_A_KEY_VALUE;
- hashtable_rc_t h_rc;
- key = PDCP_COLL_KEY_VALUE(ctxt_pP->module_id, ctxt_pP->rnti, ctxt_pP->enb_flag, DCCH, SRB_FLAG_YES);
- h_rc = hashtable_get(pdcp_coll_p, key, (void **) &pdcp_p);
+ nr_derive_key_up_enc(NR_UE_rrc_inst[ctxt_pP->module_id].cipheringAlgorithm,
+ NR_UE_rrc_inst[ctxt_pP->module_id].kgnb,
+ &kUPenc);
+ nr_derive_key_rrc_enc(NR_UE_rrc_inst[ctxt_pP->module_id].cipheringAlgorithm,
+ NR_UE_rrc_inst[ctxt_pP->module_id].kgnb,
+ &kRRCenc);
+ nr_derive_key_rrc_int(NR_UE_rrc_inst[ctxt_pP->module_id].integrityProtAlgorithm,
+ NR_UE_rrc_inst[ctxt_pP->module_id].kgnb,
+ &kRRCint);
+ LOG_I(NR_RRC, "driving kRRCenc, kRRCint and kUPenc from KgNB="
+ "%02x%02x%02x%02x"
+ "%02x%02x%02x%02x"
+ "%02x%02x%02x%02x"
+ "%02x%02x%02x%02x"
+ "%02x%02x%02x%02x"
+ "%02x%02x%02x%02x"
+ "%02x%02x%02x%02x"
+ "%02x%02x%02x%02x\n",
+ NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[0], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[1], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[2], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[3],
+ NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[4], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[5], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[6], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[7],
+ NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[8], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[9], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[10], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[11],
+ NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[12], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[13], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[14], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[15],
+ NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[16], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[17], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[18], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[19],
+ NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[20], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[21], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[22], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[23],
+ NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[24], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[25], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[26], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[27],
+ NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[28], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[29], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[30], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[31]);
- if (h_rc == HASH_TABLE_OK) {
- LOG_D(NR_RRC, "PDCP_COLL_KEY_VALUE() returns valid key = %ld\n", key);
- LOG_D(NR_RRC, "driving kRRCenc, kRRCint and kUPenc from KgNB="
- "%02x%02x%02x%02x"
- "%02x%02x%02x%02x"
- "%02x%02x%02x%02x"
- "%02x%02x%02x%02x"
- "%02x%02x%02x%02x"
- "%02x%02x%02x%02x"
- "%02x%02x%02x%02x"
- "%02x%02x%02x%02x\n",
- NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[0], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[1], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[2], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[3],
- NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[4], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[5], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[6], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[7],
- NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[8], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[9], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[10], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[11],
- NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[12], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[13], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[14], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[15],
- NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[16], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[17], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[18], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[19],
- NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[20], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[21], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[22], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[23],
- NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[24], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[25], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[26], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[27],
- NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[28], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[29], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[30], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[31]);
- derive_key_rrc_enc(NR_UE_rrc_inst[ctxt_pP->module_id].cipheringAlgorithm,NR_UE_rrc_inst[ctxt_pP->module_id].kgnb, &kRRCenc);
- derive_key_rrc_int(NR_UE_rrc_inst[ctxt_pP->module_id].integrityProtAlgorithm,NR_UE_rrc_inst[ctxt_pP->module_id].kgnb, &kRRCint);
- derive_key_up_enc(NR_UE_rrc_inst[ctxt_pP->module_id].cipheringAlgorithm,NR_UE_rrc_inst[ctxt_pP->module_id].kgnb, &kUPenc);
-
- if (securityMode != 0xff) {
- pdcp_config_set_security(ctxt_pP, pdcp_p, 0, 0,
- NR_UE_rrc_inst[ctxt_pP->module_id].cipheringAlgorithm
- | (NR_UE_rrc_inst[ctxt_pP->module_id].integrityProtAlgorithm << 4),
- kRRCenc, kRRCint, kUPenc);
- } else {
- LOG_I(NR_RRC, "skipped pdcp_config_set_security() as securityMode == 0x%02x", securityMode);
- }
+ if (securityMode != 0xff) {
+ pdcp_config_set_security(ctxt_pP, NULL, DCCH, DCCH+2,
+ NR_UE_rrc_inst[ctxt_pP->module_id].cipheringAlgorithm
+ | (NR_UE_rrc_inst[ctxt_pP->module_id].integrityProtAlgorithm << 4),
+ kRRCenc, kRRCint, kUPenc);
} else {
- LOG_I(NR_RRC, "Could not get PDCP instance where key=0x%ld\n", key);
+ LOG_I(NR_RRC, "skipped pdcp_config_set_security() as securityMode == 0x%02x", securityMode);
}
if (securityModeCommand->criticalExtensions.present == NR_SecurityModeCommand__criticalExtensions_PR_securityModeCommand) {
@@ -2044,21 +2037,12 @@ nr_rrc_ue_establish_srb2(
}
}
- uint8_t *k_kdf = NULL;
uint8_t *kRRCenc = NULL;
uint8_t *kRRCint = NULL;
nr_derive_key_rrc_enc(NR_UE_rrc_inst[ctxt_pP->module_id].cipheringAlgorithm,
- NR_UE_rrc_inst[ctxt_pP->module_id].kgnb, &k_kdf);
- kRRCenc = malloc(16);
- if (kRRCenc == NULL) exit(1);
- memcpy(kRRCenc, k_kdf + 16, 16);
- free(k_kdf);
+ NR_UE_rrc_inst[ctxt_pP->module_id].kgnb, &kRRCenc);
nr_derive_key_rrc_int(NR_UE_rrc_inst[ctxt_pP->module_id].integrityProtAlgorithm,
- NR_UE_rrc_inst[ctxt_pP->module_id].kgnb, &k_kdf);
- kRRCint = malloc(16);
- if (kRRCint == NULL) exit(1);
- memcpy(kRRCint, k_kdf + 16, 16);
- free(k_kdf);
+ NR_UE_rrc_inst[ctxt_pP->module_id].kgnb, &kRRCint);
// Refresh SRBs
nr_rrc_pdcp_config_asn1_req(ctxt_pP,
@@ -2100,6 +2084,7 @@ nr_rrc_ue_establish_srb2(
LOG_I(NR_RRC, "[FRAME %05d][RRC_UE][MOD %02d][][--- MAC_CONFIG_REQ (SRB1 gNB %d) --->][MAC_UE][MOD %02d][]\n",
ctxt_pP->frame, ctxt_pP->module_id, gNB_index, ctxt_pP->module_id);
+ nr_rrc_mac_config_req_ue_logicalChannelBearer(ctxt_pP->module_id,0,gNB_index,1,true); //todo handle mac_LogicalChannelConfig
// rrc_mac_config_req_ue
}
} else {
@@ -2115,6 +2100,7 @@ nr_rrc_ue_establish_srb2(
LOG_I(NR_RRC, "[FRAME %05d][RRC_UE][MOD %02d][][--- MAC_CONFIG_REQ (SRB2 gNB %d) --->][MAC_UE][MOD %02d][]\n",
ctxt_pP->frame, ctxt_pP->module_id, gNB_index, ctxt_pP->module_id);
+ nr_rrc_mac_config_req_ue_logicalChannelBearer(ctxt_pP->module_id,0,gNB_index,2,true); //todo handle mac_LogicalChannelConfig
// rrc_mac_config_req_ue
}
} // srb2
@@ -2135,28 +2121,33 @@ nr_rrc_ue_establish_srb2(
memcpy(NR_UE_rrc_inst[ctxt_pP->module_id].DRB_config[gNB_index][DRB_id-1],
radioBearerConfig->drb_ToAddModList->list.array[cnt], sizeof(NR_DRB_ToAddMod_t));
} else {
- LOG_D(NR_RRC, "Adding DRB %ld %p\n", DRB_id-1, radioBearerConfig->drb_ToAddModList->list.array[cnt]);
+ //LOG_D(NR_RRC, "Adding DRB %ld %p\n", DRB_id-1, radioBearerConfig->drb_ToAddModList->list.array[cnt]);
NR_UE_rrc_inst[ctxt_pP->module_id].DRB_config[gNB_index][DRB_id-1] = radioBearerConfig->drb_ToAddModList->list.array[cnt];
+ int j;
+ struct NR_CellGroupConfig__rlc_BearerToAddModList *rlc_bearer2add_list = NR_UE_rrc_inst[ctxt_pP->module_id].cell_group_config->rlc_BearerToAddModList;
+ if (rlc_bearer2add_list != NULL) {
+ for(j = 0; j < rlc_bearer2add_list->list.count; j++){
+ if(rlc_bearer2add_list->list.array[j]->servedRadioBearer != NULL){
+ if(rlc_bearer2add_list->list.array[j]->servedRadioBearer->present == NR_RLC_BearerConfig__servedRadioBearer_PR_drb_Identity){
+ if(DRB_id == rlc_bearer2add_list->list.array[j]->servedRadioBearer->choice.drb_Identity){
+ LOG_I(NR_RRC, "[FRAME %05d][RRC_UE][MOD %02d][][--- MAC_CONFIG_REQ (DRB lcid %ld gNB %d) --->][MAC_UE][MOD %02d][]\n",
+ ctxt_pP->frame, ctxt_pP->module_id, rlc_bearer2add_list->list.array[j]->logicalChannelIdentity, 0, ctxt_pP->module_id);
+ nr_rrc_mac_config_req_ue_logicalChannelBearer(ctxt_pP->module_id,0,0,rlc_bearer2add_list->list.array[j]->logicalChannelIdentity,true); //todo handle mac_LogicalChannelConfig
+ }
+ }
+ }
+ }
+ }
}
}
- uint8_t *k_kdf = NULL;
uint8_t *kUPenc = NULL;
uint8_t *kUPint = NULL;
nr_derive_key_up_enc(NR_UE_rrc_inst[ctxt_pP->module_id].cipheringAlgorithm,
- NR_UE_rrc_inst[ctxt_pP->module_id].kgnb, &k_kdf);
- kUPenc = malloc(16);
- if (kUPenc == NULL) exit(1);
- memcpy(kUPenc, k_kdf + 16, 16);
- free(k_kdf);
-
+ NR_UE_rrc_inst[ctxt_pP->module_id].kgnb, &kUPenc);
nr_derive_key_up_int(NR_UE_rrc_inst[ctxt_pP->module_id].integrityProtAlgorithm,
- NR_UE_rrc_inst[ctxt_pP->module_id].kgnb, &k_kdf);
- kUPint = malloc(16);
- if (kUPint == NULL) exit(1);
- memcpy(kUPint, k_kdf + 16, 16);
- free(k_kdf);
+ NR_UE_rrc_inst[ctxt_pP->module_id].kgnb, &kUPint);
MSC_LOG_TX_MESSAGE(
MSC_RRC_UE,
@@ -2199,6 +2190,15 @@ nr_rrc_ue_establish_srb2(
}
}
+ if (NR_UE_rrc_inst[ctxt_pP->module_id].cell_group_config->rlc_BearerToReleaseList != NULL) {
+ for (i = 0; i < NR_UE_rrc_inst[ctxt_pP->module_id].cell_group_config->rlc_BearerToReleaseList->list.count; i++) {
+ NR_LogicalChannelIdentity_t lcid = *NR_UE_rrc_inst[ctxt_pP->module_id].cell_group_config->rlc_BearerToReleaseList->list.array[i];
+ LOG_I(NR_RRC, "[FRAME %05d][RRC_UE][MOD %02d][][--- MAC_CONFIG_REQ (RB lcid %ld gNB %d release) --->][MAC_UE][MOD %02d][]\n",
+ ctxt_pP->frame, ctxt_pP->module_id, lcid, 0, ctxt_pP->module_id);
+ nr_rrc_mac_config_req_ue_logicalChannelBearer(ctxt_pP->module_id,0,0,lcid,false); //todo handle mac_LogicalChannelConfig
+ }
+ }
+
NR_UE_rrc_inst[ctxt_pP->module_id].Info[gNB_index].State = NR_RRC_CONNECTED;
LOG_I(NR_RRC,"[UE %d] State = NR_RRC_CONNECTED (gNB %d)\n", ctxt_pP->module_id, gNB_index);
}
@@ -2511,6 +2511,28 @@ nr_rrc_ue_establish_srb2(
NR_RRC_DCCH_DATA_IND (msg_p).gNB_index);
break;
+ case NAS_KENB_REFRESH_REQ:
+ memcpy((void *)NR_UE_rrc_inst[ue_mod_id].kgnb, (void *)NAS_KENB_REFRESH_REQ(msg_p).kenb, sizeof(NR_UE_rrc_inst[ue_mod_id].kgnb));
+ LOG_D(RRC, "[UE %d] Received %s: refreshed RRC::KgNB = "
+ "%02x%02x%02x%02x"
+ "%02x%02x%02x%02x"
+ "%02x%02x%02x%02x"
+ "%02x%02x%02x%02x"
+ "%02x%02x%02x%02x"
+ "%02x%02x%02x%02x"
+ "%02x%02x%02x%02x"
+ "%02x%02x%02x%02x\n",
+ ue_mod_id, ITTI_MSG_NAME (msg_p),
+ NR_UE_rrc_inst[ue_mod_id].kgnb[0], NR_UE_rrc_inst[ue_mod_id].kgnb[1], NR_UE_rrc_inst[ue_mod_id].kgnb[2], NR_UE_rrc_inst[ue_mod_id].kgnb[3],
+ NR_UE_rrc_inst[ue_mod_id].kgnb[4], NR_UE_rrc_inst[ue_mod_id].kgnb[5], NR_UE_rrc_inst[ue_mod_id].kgnb[6], NR_UE_rrc_inst[ue_mod_id].kgnb[7],
+ NR_UE_rrc_inst[ue_mod_id].kgnb[8], NR_UE_rrc_inst[ue_mod_id].kgnb[9], NR_UE_rrc_inst[ue_mod_id].kgnb[10], NR_UE_rrc_inst[ue_mod_id].kgnb[11],
+ NR_UE_rrc_inst[ue_mod_id].kgnb[12], NR_UE_rrc_inst[ue_mod_id].kgnb[13], NR_UE_rrc_inst[ue_mod_id].kgnb[14], NR_UE_rrc_inst[ue_mod_id].kgnb[15],
+ NR_UE_rrc_inst[ue_mod_id].kgnb[16], NR_UE_rrc_inst[ue_mod_id].kgnb[17], NR_UE_rrc_inst[ue_mod_id].kgnb[18], NR_UE_rrc_inst[ue_mod_id].kgnb[19],
+ NR_UE_rrc_inst[ue_mod_id].kgnb[20], NR_UE_rrc_inst[ue_mod_id].kgnb[21], NR_UE_rrc_inst[ue_mod_id].kgnb[22], NR_UE_rrc_inst[ue_mod_id].kgnb[23],
+ NR_UE_rrc_inst[ue_mod_id].kgnb[24], NR_UE_rrc_inst[ue_mod_id].kgnb[25], NR_UE_rrc_inst[ue_mod_id].kgnb[26], NR_UE_rrc_inst[ue_mod_id].kgnb[27],
+ NR_UE_rrc_inst[ue_mod_id].kgnb[28], NR_UE_rrc_inst[ue_mod_id].kgnb[29], NR_UE_rrc_inst[ue_mod_id].kgnb[30], NR_UE_rrc_inst[ue_mod_id].kgnb[31]);
+ break;
+
case NAS_UPLINK_DATA_REQ: {
uint32_t length;
uint8_t *buffer;
diff --git a/openair2/RRC/NR_UE/rrc_list.h b/openair2/RRC/NR_UE/rrc_list.h
index 32a452e4a2..20a0adad56 100644
--- a/openair2/RRC/NR_UE/rrc_list.h
+++ b/openair2/RRC/NR_UE/rrc_list.h
@@ -111,4 +111,4 @@
#define RRC_LIST_ENTRY(list, i) \
list.entries[i]
-#endif
\ No newline at end of file
+#endif
diff --git a/openair2/SDAP/nr_sdap/nr_sdap_gnb.c b/openair2/SDAP/nr_sdap/nr_sdap_gnb.c
new file mode 100644
index 0000000000..5f0a2640e9
--- /dev/null
+++ b/openair2/SDAP/nr_sdap/nr_sdap_gnb.c
@@ -0,0 +1,87 @@
+/*
+ * 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 "nr_sdap_gnb.h"
+#include
+
+boolean_t sdap_gnb_data_req(protocol_ctxt_t *ctxt_p,
+ const srb_flag_t srb_flag,
+ const rb_id_t rb_id,
+ const mui_t mui,
+ const confirm_t confirm,
+ const sdu_size_t sdu_buffer_size,
+ unsigned char *const sdu_buffer,
+ const pdcp_transmission_mode_t pt_mode,
+ const uint32_t *sourceL2Id,
+ const uint32_t *destinationL2Id
+ ) {
+ if(sdu_buffer == NULL) {
+ LOG_E(PDCP, "%s:%d:%s: SDAP Layer gNB - NULL sdu_buffer \n", __FILE__, __LINE__, __FUNCTION__);
+ exit(1);
+ }
+
+ if(sdu_buffer_size == 0) {
+ LOG_E(PDCP, "%s:%d:%s: SDAP Layer gNB - NULL or 0 sdu_buffer_size \n", __FILE__, __LINE__, __FUNCTION__);
+ exit(1);
+ }
+
+ uint8_t *sdap_buf = (uint8_t *)malloc(sdu_buffer_size+SDAP_HDR_LENGTH);
+ nr_sdap_dl_hdr_t sdap_hdr;
+ sdap_hdr.RDI = 0; // SDAP_Hardcoded -
+ sdap_hdr.RQI = 0; // SDAP_Hardcoded - Should get this info from DL_PDU_SESSION_INFORMATION
+ sdap_hdr.QFI = 1; // SDAP_Hardcoded - Should get this info from DL_PDU_SESSION_INFORMATION
+ memcpy(&sdap_buf[0], &sdap_hdr, 1);
+ memcpy(&sdap_buf[1], sdu_buffer, sdu_buffer_size);
+ rb_id_t sdap_drb_id = rb_id; // SDAP_Hardcoded - Should get this info from QFI to DRB mapping table
+ boolean_t ret = pdcp_data_req(ctxt_p,
+ srb_flag,
+ sdap_drb_id,
+ mui,
+ confirm,
+ sdu_buffer_size+1,
+ sdap_buf,
+ pt_mode,
+ sourceL2Id,
+ destinationL2Id);
+
+ if(!ret) {
+ LOG_E(PDCP, "%s:%d:%s: SDAP Layer gNB - PDCP DL refused PDU\n", __FILE__, __LINE__, __FUNCTION__);
+ free(sdap_buf);
+ return 0;
+ }
+
+ free(sdap_buf);
+ return 1;
+}
+
+void sdap_gnb_ul_header_handler(char sdap_gnb_ul_hdr) {
+ nr_sdap_ul_hdr_t *sdap_hdr_ul = (nr_sdap_ul_hdr_t *)&sdap_gnb_ul_hdr;
+
+ switch (sdap_hdr_ul->DC) {
+ case SDAP_HDR_UL_DATA_PDU:
+ LOG_I(PDCP, "%s:%d:%s: SDAP Layer gNB - UL Received SDAP Data PDU\n", __FILE__, __LINE__, __FUNCTION__);
+ break;
+
+ case SDAP_HDR_UL_CTRL_PDU:
+ LOG_I(PDCP, "%s:%d:%s: SDAP Layer gNB - Received SDAP Control PDU\n", __FILE__, __LINE__, __FUNCTION__);
+ break;
+ }
+}
\ No newline at end of file
diff --git a/openair2/SDAP/nr_sdap/nr_sdap_gnb.h b/openair2/SDAP/nr_sdap/nr_sdap_gnb.h
new file mode 100644
index 0000000000..243aa89010
--- /dev/null
+++ b/openair2/SDAP/nr_sdap/nr_sdap_gnb.h
@@ -0,0 +1,61 @@
+/*
+ * 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
+ */
+
+#ifndef _NR_SDAP_GNB_
+#define _NR_SDAP_GNB_
+
+#include "openair2/COMMON/platform_types.h"
+#include "common/utils/LOG/log.h"
+
+#define SDAP_BITMASK_DC (0x80)
+#define SDAP_BITMASK_R (0x40)
+#define SDAP_BITMASK_QFI (0x3F)
+#define SDAP_HDR_UL_DATA_PDU (1)
+#define SDAP_HDR_UL_CTRL_PDU (0)
+#define SDAP_HDR_LENGTH (1)
+
+typedef struct nr_sdap_dl_hdr_s {
+ uint8_t QFI:6;
+ uint8_t RQI:1;
+ uint8_t RDI:1;
+} __attribute__((packed)) nr_sdap_dl_hdr_t;
+
+typedef struct nr_sdap_ul_hdr_s {
+ uint8_t QFI:6;
+ uint8_t R:1;
+ uint8_t DC:1;
+} __attribute__((packed)) nr_sdap_ul_hdr_t;
+
+boolean_t sdap_gnb_data_req(protocol_ctxt_t *ctxt_p,
+ const srb_flag_t srb_flag,
+ const rb_id_t rb_id,
+ const mui_t mui,
+ const confirm_t confirm,
+ const sdu_size_t sdu_buffer_size,
+ unsigned char *const sdu_buffer,
+ const pdcp_transmission_mode_t pt_mode,
+ const uint32_t *sourceL2Id,
+ const uint32_t *destinationL2Id
+ );
+
+void sdap_gnb_ul_header_handler(char sdap_gnb_ul_hdr);
+
+#endif
\ No newline at end of file
diff --git a/openair2/SIMULATION/NR_RRC/itti_sim.c b/openair2/SIMULATION/NR_RRC/itti_sim.c
index 0cd022217d..67a03d8b06 100644
--- a/openair2/SIMULATION/NR_RRC/itti_sim.c
+++ b/openair2/SIMULATION/NR_RRC/itti_sim.c
@@ -60,10 +60,6 @@ unsigned short config_frames[4] = {2,9,11,13};
#include "common/utils/LOG/vcd_signal_dumper.h"
#include "UTIL/OPT/opt.h"
-#ifndef OPENAIR2
- #include "UTIL/OTG/otg_vars.h"
-#endif
-
#include "intertask_interface.h"
diff --git a/openair2/UTIL/OMG/makefile_old b/openair2/UTIL/OMG/makefile_old
deleted file mode 100644
index 7bc551cb03..0000000000
--- a/openair2/UTIL/OMG/makefile_old
+++ /dev/null
@@ -1,123 +0,0 @@
-include $(OPENAIR_TARGETS)/Makefile.common
-ifdef TEST_OMG
-
-CC= gcc
-
-OBJstatic = OMG.c common.c static.c
-OBJrwp = OMG.c common.c job.c rwp.c
-OBJrwalk = OMG.c common.c job.c rwalk.c
-OBJtrace = OMG.c common.c job.c trace.c mobility_parser.c hashtable.c
-OBJsumo = OMG.c common.c sumo.c client_traci_OMG.c socket_traci_OMG.c storage_traci_OMG.c id_manager.c
-
-OBJ = OMG.c common.c static.c job.c rwp.c rwalk.c trace.c sumo.c mobility_parser.c hashtable.c client_traci_OMG.c socket_traci_OMG.c storage_traci_OMG.c id_manager.c
-
-CFLAGS += -m32 -DTEST_OMG
-
-.PHONY: help staticOMG rwpOMG clean
-
-help:
- @echo ' "make staticOMG" to compile the STATIC version'
- @echo ' "make rwpOMG" to compile the RWP version'
- @echo ' "make rwalkOMG" to compile the RWALK version'
- @echo ' "make traceOMG" to compile the TRACE version'
- @echo ' "make sumoOMG" to compile the SUMO version'
- @echo ' "make clean" to remove the generated files and restore the original distribution'
- @echo ' "make OMG" to compile the complete version'
-
-
-staticOMG: ${OBJstatic}
- ${CC} ${OBJstatic} -o staticOMG $(CFLAGS)
-
-
-rwpOMG: ${OBJrwp}
- ${CC} ${OBJrwp} -lm -o rwpOMG $(CFLAGS)
- @#-lm: used to link to math lib
-
-traceOMG:${OBJtrace}
- ${CC} ${OBJtrace} -lm -o traceOMG $(CFLAGS)
-
-rwalkOMG: ${OBJrwalk}
- ${CC} ${OBJrwalk} -lm -o rwalkOMG $(CFLAGS)
-
-sumoOMG: ${OBJsumo}
- ${CC} ${OBJsumo} -lm -o rwalkOMG $(CFLAGS)
-
-OMG: ${OBJ}
- ${CC} ${OBJ} -lm -o OMG $(CFLAGS)
-
-clean:
- @echo "Cleaning"
- @rm OMG
- @#rm rwpOMG
- @#rm rwalkOMG
- @#rm traceOMG
- @#rm staticOMG
- @#rm OMG
-
-else
-
-TOP_DIR = ../..
-OPENAIR1_TOP = ../..
-OPENAIR2_TOP = ../../../openair2
-OPENAIR3_TOP = ../../../openair3
-OPENAIR3 = $(OPENAIR3_DIR)
-
-CFLAGS += -DPHYSIM -DNODE_RG -DNB_ANTENNAS_RX=2 -DNB_ANTENNAS_TX=2 -DMAX_MODULES=1 -I/usr/include/X11 #-Wno-packed-bitfield-compat
-
-
-CFLAGS += -DOPENAIR_LTE -DOPENAIR2 #-DOFDMA_ULSCH -DIFFT_FPGA -DIFFT_FPGA_UE
-
-#CFLAGS += -DXFORMS
-
-ifdef DEBUG_PHY
-CFLAGS += -DDEBUG_PHY
-endif
-
-ifdef PDCP_USE_NETLINK
-CFLAGS += -DPDCP_USE_NETLINK -DLINUX -DDEBUG_CONTROL
-endif
-
-include $(OPENAIR1_DIR)/PHY/Makefile.inc
-include $(OPENAIR1_DIR)/SCHED/Makefile.inc
-include $(OPENAIR2_DIR)/LAYER2/Makefile.inc
-include $(OPENAIR1_DIR)/SIMULATION/ETH_TRANSPORT/Makefile.inc
-
-SIMULATION_OBJS = $(TOP_DIR)/SIMULATION/TOOLS/gauss.o
-SIMULATION_OBJS += $(TOP_DIR)/SIMULATION/TOOLS/random_channel.o
-SIMULATION_OBJS += $(TOP_DIR)/SIMULATION/TOOLS/rangen_double.o
-SIMULATION_OBJS += $(TOP_DIR)/SIMULATION/TOOLS/taus.o
-SIMULATION_OBJS += $(TOP_DIR)/SIMULATION/TOOLS/multipath_channel.o
-SIMULATION_OBJS += $(TOP_DIR)/SIMULATION/RF/rf.o
-SIMULATION_OBJS += $(TOP_DIR)/SIMULATION/RF/adc.o
-SIMULATION_OBJS += $(TOP_DIR)/SIMULATION/RF/dac.o
-
-OBJ = $(PHY_OBJS) $(SIMULATION_OBJS) $(ETHERNET_TRANSPORT_OBJS) $(TOOLS_OBJS) $(SCHED_OBJS) $(STATS_OBJS)
-
-all: physim
-
-
-$(OBJ) : %.o : %.c
- $(CC) -c $(CFLAGS) $(EXTRA_CFLAGS) -DPHY_CONTEXT=1 -I$(TOP_DIR) $(L2_incl) -o $@ $<
-
-$(L2_OBJS) : %.o : %.c
- $(CC) -c $(CFLAGS) $(EXTRA_CFLAGS) -DMAC_CONTEXT=1 -DPHY_CONTEXT=1 -I$(TOP_DIR) $(L2_incl) -o $@ $<
-
-physim : $(OBJ) $(L2_OBJS) OMG.c common.c static.c job.c rwp.c rwalk.c hashtable.c mobility_parser.c trace.c -I$(TOP_DIR) $(L2_incl) -o physim $(CFLAGS) $(EXTRA_CFLAGS) $(OBJ) $(L2_OBJS) -lm -lforms -L/usr/local/lib -lforms -lX11 -L/usr/X11R6/lib -lXpm -lblas -lpthread
-
-clean:
- rm -f physim
- rm -f $(OBJ)
- rm -f $(L2_OBJS)
- rm -f *.o
- rm -f *.exe*
-
-cleanl1:
- rm -f physim
- rm -f $(OBJ)
- rm -f *.o
- rm -f *.exe
-cleanl2:
- rm -f $(L2_OBJS)
-
-endif
-
diff --git a/openair2/UTIL/OSA/osa_key_deriver.c b/openair2/UTIL/OSA/osa_key_deriver.c
index 159ee7f159..c02b999490 100644
--- a/openair2/UTIL/OSA/osa_key_deriver.c
+++ b/openair2/UTIL/OSA/osa_key_deriver.c
@@ -121,6 +121,8 @@ int nr_derive_key(algorithm_type_dist_t alg_type, uint8_t alg_id,
string[6] = 0x01;
kdf(string, 7, key, 32, out, 32);
+ // in NR, we use the last 16 bytes, ignoring the first 16 ones
+ memcpy(*out, *out+16, 16);
return 0;
}
diff --git a/openair2/UTIL/OTG/otg_kpi.c b/openair2/UTIL/OTG/otg_kpi.c
index ac2fff89fe..c55aecf239 100644
--- a/openair2/UTIL/OTG/otg_kpi.c
+++ b/openair2/UTIL/OTG/otg_kpi.c
@@ -37,8 +37,8 @@ unsigned int start_log_GP=0;
unsigned int start_log_GP_bg=0;
unsigned int start_log_jitter=0;
-#include"otg_kpi.h"
-#include"otg_externs.h"
+#include "otg_kpi.h"
+#include "otg_externs.h"
extern unsigned char NB_eNB_INST;
extern uint16_t NB_UE_INST;
diff --git a/openair2/UTIL/OTG/otg_rx_socket.h b/openair2/UTIL/OTG/otg_rx_socket.h
index e7062aaf58..b0c6d1b364 100644
--- a/openair2/UTIL/OTG/otg_rx_socket.h
+++ b/openair2/UTIL/OTG/otg_rx_socket.h
@@ -32,7 +32,7 @@
#ifndef __OTG_RX_SOCKET_H__
#define __OTG_RX_SOCKET_H__
-#include"otg.h"
+#include "otg.h"
//-----------------------begin func proto-------------------
diff --git a/openair2/UTIL/OTG/otg_tx_socket.c b/openair2/UTIL/OTG/otg_tx_socket.c
index 073b9b6ddd..070e44f361 100644
--- a/openair2/UTIL/OTG/otg_tx_socket.c
+++ b/openair2/UTIL/OTG/otg_tx_socket.c
@@ -30,7 +30,7 @@
* \warning
*/
-#include"otg_tx_socket.h"
+#include "otg_tx_socket.h"
#include "otg_vars.h"
diff --git a/openair2/UTIL/OTG/otg_tx_socket.h b/openair2/UTIL/OTG/otg_tx_socket.h
index 17568244fa..1d2345c242 100644
--- a/openair2/UTIL/OTG/otg_tx_socket.h
+++ b/openair2/UTIL/OTG/otg_tx_socket.h
@@ -37,8 +37,8 @@
#include
#include
#include
-#include"otg.h"
-#include"otg_tx.h"
+#include "otg.h"
+#include "otg_tx.h"
//-----------------------begin func proto-------------------
diff --git a/openair3/GTPV1-U/gtpv1u_eNB_defs.h b/openair3/GTPV1-U/gtpv1u_eNB_defs.h
index 79d9a1dcdd..fb317e4ca6 100644
--- a/openair3/GTPV1-U/gtpv1u_eNB_defs.h
+++ b/openair3/GTPV1-U/gtpv1u_eNB_defs.h
@@ -111,14 +111,6 @@ typedef struct gtpv1u_data_s {
uint16_t seq_num;
uint8_t restart_counter;
-#ifdef GTPU_IN_KERNEL
- char *interface_name;
- int interface_index;
-
- struct iovec *malloc_ring;
- void *sock_mmap_ring[16];
- int sock_desc[16]; // indexed by marking
-#endif
} gtpv1u_data_t;
int
diff --git a/openair3/GTPV1-U/gtpv1u_gNB_defs.h b/openair3/GTPV1-U/gtpv1u_gNB_defs.h
index ddc8b4445e..d4356aa3cf 100644
--- a/openair3/GTPV1-U/gtpv1u_gNB_defs.h
+++ b/openair3/GTPV1-U/gtpv1u_gNB_defs.h
@@ -102,14 +102,6 @@ typedef struct nr_gtpv1u_data_s {
uint16_t seq_num;
uint8_t restart_counter;
-#ifdef GTPU_IN_KERNEL
- char *interface_name;
- int interface_index;
-
- struct iovec *malloc_ring;
- void *sock_mmap_ring[16];
- int sock_desc[16]; // indexed by marking
-#endif
} nr_gtpv1u_data_t;
diff --git a/openair3/NAS/NR_UE/nr_nas_msg_sim.c b/openair3/NAS/NR_UE/nr_nas_msg_sim.c
index 77931cbb19..ad2f2c7c3c 100644
--- a/openair3/NAS/NR_UE/nr_nas_msg_sim.c
+++ b/openair3/NAS/NR_UE/nr_nas_msg_sim.c
@@ -47,6 +47,8 @@
uint8_t *registration_request_buf;
uint32_t registration_request_len;
extern char *baseNetAddress;
+extern uint16_t NB_UE_INST;
+static ue_sa_security_key_t ** ue_security_key;
static int nas_protected_security_header_encode(
char *buffer,
@@ -251,6 +253,108 @@ void derive_knas(algorithm_type_dist_t nas_alg_type, uint8_t nas_alg_id, uint8_t
knas_int[i] = out[16 + i];
}
+void derive_kgnb(uint8_t kamf[32], uint32_t count, uint8_t *kgnb){
+ /* Compute the KDF input parameter
+ * S = FC(0x6E) || UL NAS Count || 0x00 0x04 || 0x01 || 0x00 0x01
+ */
+ uint8_t input[32];
+ // uint16_t length = 4;
+ // int offset = 0;
+ uint8_t out[32] = { 0 };
+
+ LOG_TRACE(INFO, "%s with count= %d", __FUNCTION__, count);
+ memset(input, 0, 32);
+ input[0] = 0x6E;
+ // P0
+ input[1] = count >> 24;
+ input[2] = (uint8_t)(count >> 16);
+ input[3] = (uint8_t)(count >> 8);
+ input[4] = (uint8_t)count;
+ // L0
+ input[5] = 0;
+ input[6] = 4;
+ // P1
+ input[7] = 0x01;
+ // L1
+ input[8] = 0;
+ input[9] = 1;
+
+ kdf(kamf, 32, input, 10, out, 32);
+ for (int i = 0; i < 32; i++)
+ kgnb[i] = out[i];
+ printf("kgnb : ");
+ for(int pp=0;pp<32;pp++)
+ printf("%02x ",kgnb[pp]);
+ printf("\n");
+}
+
+void derive_ue_keys(int Mod_id, uint8_t *buf, uicc_t *uicc) {
+ uint8_t ak[6];
+ uint8_t sqn[6];
+
+ AssertFatal (Mod_id < NB_UE_INST, "Failed, Mod_id %d is over NB_UE_INST!\n", Mod_id);
+ if(ue_security_key[Mod_id]){
+ // clear old key
+ memset(ue_security_key[Mod_id],0,sizeof(ue_sa_security_key_t));
+ }else{
+ // Allocate new memory
+ ue_security_key[Mod_id]=(ue_sa_security_key_t *)calloc(1,sizeof(ue_sa_security_key_t));
+ }
+ uint8_t *kausf = ue_security_key[Mod_id]->kausf;
+ uint8_t *kseaf = ue_security_key[Mod_id]->kseaf;
+ uint8_t *kamf = ue_security_key[Mod_id]->kamf;
+ uint8_t *knas_int = ue_security_key[Mod_id]->knas_int;
+ uint8_t *output = ue_security_key[Mod_id]->res;
+ uint8_t *rand = ue_security_key[Mod_id]->rand;
+ uint8_t *kgnb = ue_security_key[Mod_id]->kgnb;
+
+ // get RAND for authentication request
+ for(int index = 0; index < 16;index++){
+ rand[index] = buf[8+index];
+ }
+
+ uint8_t resTemp[16];
+ uint8_t ck[16], ik[16];
+ f2345(uicc->key, rand, resTemp, ck, ik, ak, uicc->opc);
+
+ transferRES(ck, ik, resTemp, rand, output, uicc);
+
+ for(int index = 0; index < 6; index++){
+ sqn[index] = buf[26+index];
+ }
+
+ derive_kausf(ck, ik, sqn, kausf, uicc);
+ derive_kseaf(kausf, kseaf, uicc);
+ derive_kamf(kseaf, kamf, 0x0000, uicc);
+ derive_knas(0x02, 2, kamf, knas_int);
+ derive_kgnb(kamf,0,kgnb);
+
+ printf("kausf:");
+ for(int i = 0; i < 32; i++){
+ printf("%x ", kausf[i]);
+ }
+ printf("\n");
+
+ printf("kseaf:");
+ for(int i = 0; i < 32; i++){
+ printf("%x ", kseaf[i]);
+ }
+
+ printf("\n");
+
+ printf("kamf:");
+ for(int i = 0; i < 32; i++){
+ printf("%x ", kamf[i]);
+ }
+ printf("\n");
+
+ printf("knas_int:\n");
+ for(int i = 0; i < 16; i++){
+ printf("%x ", knas_int[i]);
+ }
+ printf("\n");
+}
+
void generateRegistrationRequest(as_nas_info_t *initialNasMsg, int Mod_id) {
int size = sizeof(mm_msg_header_t);
fgs_nas_message_t nas_msg={0};
@@ -373,69 +477,13 @@ void generateIdentityResponse(as_nas_info_t *initialNasMsg, uint8_t identitytype
}
-OctetString knas_int;
-static void generateAuthenticationResp(as_nas_info_t *initialNasMsg, uint8_t *buf, uicc_t *uicc){
+static void generateAuthenticationResp(int Mod_id,as_nas_info_t *initialNasMsg, uint8_t *buf, uicc_t *uicc){
- uint8_t ak[6];
-
- uint8_t kausf[32];
- uint8_t sqn[6];
- uint8_t kseaf[32];
- uint8_t kamf[32];
+ derive_ue_keys(Mod_id,buf,uicc);
OctetString res;
-
- // get RAND for authentication request
- unsigned char rand[16];
- for(int index = 0; index < 16;index++){
- rand[index] = buf[8+index];
- }
-
- uint8_t resTemp[16];
- uint8_t ck[16], ik[16], output[16];
- f2345(uicc->key, rand, resTemp, ck, ik, ak, uicc->opc);
-
- transferRES(ck, ik, resTemp, rand, output, uicc);
-
- // get knas_int
- knas_int.length = 16;
- knas_int.value = malloc(knas_int.length);
- for(int index = 0; index < 6; index++){
- sqn[index] = buf[26+index];
- }
-
- derive_kausf(ck, ik, sqn, kausf, uicc);
- derive_kseaf(kausf, kseaf, uicc);
- derive_kamf(kseaf, kamf, 0x0000, uicc);
- derive_knas(0x02, 2, kamf, knas_int.value);
-
- printf("kausf:");
- for(int i = 0; i < 32; i++){
- printf("%x ", kausf[i]);
- }
- printf("\n");
-
- printf("kseaf:");
- for(int i = 0; i < 32; i++){
- printf("%x ", kseaf[i]);
- }
-
- printf("\n");
-
- printf("kamf:");
- for(int i = 0; i < 32; i++){
- printf("%x ", kamf[i]);
- }
- printf("\n");
-
- printf("knas_int:\n");
- for(int i = 0; i < 16; i++){
- printf("%x ", knas_int.value[i]);
- }
- printf("\n");
-
- // set res
res.length = 16;
- res.value = output;
+ res.value = calloc(1,16);
+ memcpy(res.value,ue_security_key[Mod_id]->res,16);
int size = sizeof(mm_msg_header_t);
fgs_nas_message_t nas_msg;
@@ -465,7 +513,14 @@ static void generateAuthenticationResp(as_nas_info_t *initialNasMsg, uint8_t *bu
initialNasMsg->length = mm_msg_encode(mm_msg, (uint8_t*)(initialNasMsg->data), size);
}
-static void generateSecurityModeComplete(as_nas_info_t *initialNasMsg)
+int nas_itti_kgnb_refresh_req(const uint8_t kgnb[32], int instance) {
+ MessageDef *message_p;
+ message_p = itti_alloc_new_message(TASK_NAS_NRUE, 0, NAS_KENB_REFRESH_REQ);
+ memcpy(NAS_KENB_REFRESH_REQ(message_p).kenb, kgnb, sizeof(NAS_KENB_REFRESH_REQ(message_p).kenb));
+ return itti_send_msg_to_task(TASK_RRC_NRUE, instance, message_p);
+}
+
+static void generateSecurityModeComplete(int Mod_id,as_nas_info_t *initialNasMsg)
{
int size = sizeof(mm_msg_header_t);
fgs_nas_message_t nas_msg;
@@ -512,7 +567,7 @@ static void generateSecurityModeComplete(as_nas_info_t *initialNasMsg)
initialNasMsg->length = security_header_len + mm_msg_encode(mm_msg, (uint8_t*)(initialNasMsg->data+security_header_len), size-security_header_len);
- stream_cipher.key = knas_int.value;
+ stream_cipher.key = ue_security_key[Mod_id]->knas_int;
stream_cipher.key_length = 16;
stream_cipher.count = 0;
stream_cipher.bearer = 1;
@@ -532,7 +587,7 @@ static void generateSecurityModeComplete(as_nas_info_t *initialNasMsg)
}
}
-static void generateRegistrationComplete(as_nas_info_t *initialNasMsg, SORTransparentContainer *sortransparentcontainer) {
+static void generateRegistrationComplete(int Mod_id, as_nas_info_t *initialNasMsg, SORTransparentContainer *sortransparentcontainer) {
//wait send RRCReconfigurationComplete and InitialContextSetupResponse
sleep(1);
int length = 0;
@@ -592,7 +647,7 @@ static void generateRegistrationComplete(as_nas_info_t *initialNasMsg, SORTransp
}
initialNasMsg->length = length;
- stream_cipher.key = knas_int.value;
+ stream_cipher.key = ue_security_key[Mod_id]->knas_int;
stream_cipher.key_length = 16;
stream_cipher.count = 1;
stream_cipher.bearer = 1;
@@ -625,7 +680,7 @@ void decodeDownlinkNASTransport(as_nas_info_t *initialNasMsg, uint8_t * pdu_buff
}
}
-static void generatePduSessionEstablishRequest(uicc_t * uicc, as_nas_info_t *initialNasMsg){
+static void generatePduSessionEstablishRequest(int Mod_id, uicc_t * uicc, as_nas_info_t *initialNasMsg){
//wait send RegistrationComplete
usleep(100*150);
int size = 0;
@@ -699,7 +754,7 @@ static void generatePduSessionEstablishRequest(uicc_t * uicc, as_nas_info_t *ini
initialNasMsg->length = security_header_len + mm_msg_encode(mm_msg, (uint8_t*)(initialNasMsg->data+security_header_len), size-security_header_len);
- stream_cipher.key = knas_int.value;
+ stream_cipher.key = ue_security_key[Mod_id]->knas_int;
stream_cipher.key_length = 16;
stream_cipher.count = 0;
stream_cipher.bearer = 1;
@@ -729,6 +784,8 @@ void *nas_nrue_task(void *args_p)
uint8_t msg_type = 0;
uint8_t *pdu_buffer = NULL;
+
+ ue_security_key=(ue_sa_security_key_t **)calloc(1,sizeof(ue_sa_security_key_t*)*NB_UE_INST);
itti_mark_task_ready (TASK_NAS_NRUE);
MSC_START_USE();
@@ -813,7 +870,7 @@ void *nas_nrue_task(void *args_p)
as_nas_info_t initialNasMsg;
memset(&initialNasMsg, 0, sizeof(as_nas_info_t));
- generateRegistrationComplete(&initialNasMsg, NULL);
+ generateRegistrationComplete(Mod_id,&initialNasMsg, NULL);
if(initialNasMsg.length > 0){
MessageDef *message_p;
message_p = itti_alloc_new_message(TASK_NAS_NRUE, 0, NAS_UPLINK_DATA_REQ);
@@ -826,7 +883,7 @@ void *nas_nrue_task(void *args_p)
as_nas_info_t pduEstablishMsg;
memset(&pduEstablishMsg, 0, sizeof(as_nas_info_t));
- generatePduSessionEstablishRequest(uicc, &pduEstablishMsg);
+ generatePduSessionEstablishRequest(Mod_id, uicc, &pduEstablishMsg);
if(pduEstablishMsg.length > 0){
MessageDef *message_p;
message_p = itti_alloc_new_message(TASK_NAS_NRUE, 0, NAS_UPLINK_DATA_REQ);
@@ -893,10 +950,11 @@ void *nas_nrue_task(void *args_p)
generateIdentityResponse(&initialNasMsg,*(pdu_buffer+3), uicc);
break;
case FGS_AUTHENTICATION_REQUEST:
- generateAuthenticationResp(&initialNasMsg, pdu_buffer, uicc);
+ generateAuthenticationResp(Mod_id,&initialNasMsg, pdu_buffer, uicc);
break;
case FGS_SECURITY_MODE_COMMAND:
- generateSecurityModeComplete(&initialNasMsg);
+ nas_itti_kgnb_refresh_req(ue_security_key[Mod_id]->kgnb, instance);
+ generateSecurityModeComplete(Mod_id,&initialNasMsg);
break;
case FGS_DOWNLINK_NAS_TRANSPORT:
decodeDownlinkNASTransport(&initialNasMsg, pdu_buffer);
diff --git a/openair3/NAS/NR_UE/nr_nas_msg_sim.h b/openair3/NAS/NR_UE/nr_nas_msg_sim.h
index 753ebf1762..1b59366037 100644
--- a/openair3/NAS/NR_UE/nr_nas_msg_sim.h
+++ b/openair3/NAS/NR_UE/nr_nas_msg_sim.h
@@ -64,6 +64,16 @@
#define INITIAL_REGISTRATION 0b001
+/* Security Key for SA UE */
+typedef struct {
+ uint8_t kausf[32];
+ uint8_t kseaf[32];
+ uint8_t kamf[32];
+ uint8_t knas_int[16];
+ uint8_t res[16];
+ uint8_t rand[16];
+ uint8_t kgnb[32];
+} ue_sa_security_key_t;
typedef enum fgs_protocol_discriminator_e {
/* Protocol discriminator identifier for 5GS Mobility Management */
diff --git a/openair3/ocp-gtpu/gtp_itf.cpp b/openair3/ocp-gtpu/gtp_itf.cpp
index ca199c1308..a3eeb26540 100644
--- a/openair3/ocp-gtpu/gtp_itf.cpp
+++ b/openair3/ocp-gtpu/gtp_itf.cpp
@@ -17,6 +17,7 @@ extern "C" {
#include
#include
#include
+#include "openair2/SDAP/nr_sdap/nr_sdap_gnb.h"
//#include
#pragma pack(1)
@@ -539,8 +540,8 @@ int gtpv1u_create_ngu_tunnel( const instance_t instance,
create_tunnel_req->incoming_rb_id[i],
create_tunnel_req->pdusession_id[i],
create_tunnel_req->upf_NGu_teid[i],
- create_tunnel_req->upf_addr[i], dstport,
- pdcp_data_req);
+ create_tunnel_req->upf_addr[i], dstport,
+ sdap_gnb_data_req);
create_tunnel_resp->status=0;
create_tunnel_resp->rnti=create_tunnel_req->rnti;
create_tunnel_resp->num_tunnels=create_tunnel_req->num_tunnels;
diff --git a/targets/ARCH/COMMON/common_lib.h b/targets/ARCH/COMMON/common_lib.h
index 7b934822ea..0c71a9999a 100644
--- a/targets/ARCH/COMMON/common_lib.h
+++ b/targets/ARCH/COMMON/common_lib.h
@@ -57,9 +57,7 @@
#define RAU_REMOTE_THIRDPARTY_RADIO_HEAD 2
#define MAX_WRITE_THREAD_PACKAGE 10
#define MAX_WRITE_THREAD_BUFFER_SIZE 8
-#ifndef MAX_CARDS
- #define MAX_CARDS 8
-#endif
+#define MAX_CARDS 8
typedef int64_t openair0_timestamp;
typedef volatile int64_t openair0_vtimestamp;
diff --git a/targets/COMMON/create_tasks.c b/targets/COMMON/create_tasks.c
index 3e0d97f60a..ffeb368e73 100644
--- a/targets/COMMON/create_tasks.c
+++ b/targets/COMMON/create_tasks.c
@@ -25,7 +25,6 @@
# include "targets/RT/USER/lte-softmodem.h"
# include "common/ran_context.h"
-#ifdef OPENAIR2
#include "sctp_eNB_task.h"
#include "x2ap_eNB.h"
#include "s1ap_eNB.h"
@@ -36,7 +35,6 @@
#include "lteRALenb.h"
#endif
#include "RRC/LTE/rrc_defs.h"
-#endif
# include "f1ap_cu_task.h"
# include "f1ap_du_task.h"
# include "enb_app.h"
diff --git a/targets/COMMON/create_tasks_mbms.c b/targets/COMMON/create_tasks_mbms.c
index 579e851ea7..8b1736853f 100644
--- a/targets/COMMON/create_tasks_mbms.c
+++ b/targets/COMMON/create_tasks_mbms.c
@@ -25,7 +25,6 @@
# include "targets/RT/USER/lte-softmodem.h"
# include "common/ran_context.h"
-#ifdef OPENAIR2
#include "sctp_eNB_task.h"
#include "x2ap_eNB.h"
#include "s1ap_eNB.h"
@@ -40,7 +39,6 @@
#include "lteRALenb.h"
#endif
#include "RRC/LTE/rrc_defs.h"
-#endif
# include "f1ap_cu_task.h"
# include "f1ap_du_task.h"
# include "enb_app.h"
diff --git a/targets/COMMON/create_tasks_ue.c b/targets/COMMON/create_tasks_ue.c
index 06f36641e7..3b9b7cf7bb 100644
--- a/targets/COMMON/create_tasks_ue.c
+++ b/targets/COMMON/create_tasks_ue.c
@@ -23,7 +23,6 @@
# include "create_tasks.h"
# include "common/utils/LOG/log.h"
-#ifdef OPENAIR2
#include "sctp_eNB_task.h"
#include "s1ap_eNB.h"
#include "openair3/NAS/UE/nas_ue_task.h"
@@ -34,7 +33,6 @@
#include "lteRALenb.h"
#endif
#include "RRC/LTE/rrc_defs.h"
-#endif
# include "enb_app.h"
int create_tasks_ue(uint32_t ue_nb) {
diff --git a/targets/Makefile.common b/targets/Makefile.common
deleted file mode 100644
index ecd5f3821a..0000000000
--- a/targets/Makefile.common
+++ /dev/null
@@ -1,248 +0,0 @@
-# This file gathers compilation directive shared between lte-softmodem and oaisim
-export COMMON_UTILS_DIR = $(OPENAIR_DIR)/common/utils
-export UE_NAS_DIR = $(OPENAIR_DIR)/openair3/NAS
-export S1AP_DIR = $(OPENAIR_DIR)/openair3/S1AP
-export X2AP_DIR = $(OPENAIR_DIR)/openair2/X2AP
-export SCTP_DIR = $(OPENAIR_DIR)/openair3/SCTP
-export UDP_DIR = $(OPENAIR_DIR)/openair3/UDP
-export GTPV1U_DIR = $(OPENAIR_DIR)/openair3/GTPV1-U
-export SECU_DIR = $(OPENAIR_DIR)/openair3/SECU
-
-UE_NAS_OBJ_DIR = $(subst $(OPENAIR_DIR),$(OBJS_DIR),$(UE_NAS_DIR))
-SECU_OBJ_DIR = $(subst $(OPENAIR_DIR),$(OBJS_DIR),$(SECU_DIR))
-S1AP_OBJ_DIR = $(subst $(OPENAIR_DIR),$(OBJS_DIR),$(S1AP_DIR))
-X2AP_OBJ_DIR = $(subst $(OPENAIR_DIR),$(OBJS_DIR),$(X2AP_DIR))
-SCTP_OBJ_DIR = $(subst $(OPENAIR_DIR),$(OBJS_DIR),$(SCTP_DIR))
-UDP_OBJ_DIR = $(subst $(OPENAIR_DIR),$(OBJS_DIR),$(UDP_DIR))
-GTPV1U_OBJ_DIR = $(subst $(OPENAIR_DIR),$(OBJS_DIR),$(GTPV1U_DIR))
-
-#Export common cflags (between softmodem and oaisim)
-COMMON_CFLAGS = \
- -D'FIRMWARE_VERSION="$(SVN_REV) - $(DATE_REV)"' \
- -Wall \
- -fno-strict-aliasing \
- -O2 \
- -Werror=implicit-function-declaration
-
-# the code already uses C99 integer type (like int32_t)
-# switch on full support for C99 + GNU extensions
-CFLAGS += -std=gnu99
-
-ITTI_MESSAGES_H = messages_xml.h
-ITTI_MESSAGES_XML = messages.xml
-ITTI_MESSAGES_FILE = $(ITTI_DIR)/intertask_interface_types.h
-
-include $(COMMON_UTILS_DIR)/Makefile.inc
-include $(OPENAIR_TARGETS)/COMMON/Makefile.inc
-include $(OPENAIR2_DIR)/NAS/Makefile.inc
-
-ifeq ($(SECU), 1)
-ifeq ($(NETTLE_FOUND), 0)
-@(warning "Nettle library >= 2.5 is not installed on your system, nettle-dev lib needed, continuing with security disabled")
-SECU=0
-else
-ifeq ($(OPENSSL_FOUND), 0)
-@(warning "openssl library is not installed on your system, openssl lib needed, continuing with security disabled")
-SECU=0
-else
-LIBS += $(OPENSSL_LIBS) $(NETTLE_LIBS)
-endif
-endif
-endif
-
-CFLAGS += -DJUMBO_FRAME
-
-ifdef MAX_NUM_CCs
-CFLAGS += -DMAX_NUM_CCs=$(MAX_NUM_CCs)
-COMMON_CFLAGS += -DMAX_NUM_CCs=$(MAX_NUM_CCs)
-else
-CFLAGS += -DMAX_NUM_CCs=1
-COMMON_CFLAGS += -DMAX_NUM_CCs=1
-endif
-
-ifeq ($(ENABLE_RAL), 1)
-CFLAGS += -DENABLE_RAL
-endif
-
-ifeq ($(PDCP_USE_NETLINK),1)
-CFLAGS += -DPDCP_USE_NETLINK
-endif
-ifeq ($(LIBCONFIG_LONG),1)
-CFLAGS += -DLIBCONFIG_LONG
-endif
-
-# add R9
-ifeq ($(USE_MME), R10)
-COMMON_CFLAGS += -DENABLE_USE_MME
-ENABLE_ITTI = 1
-ifeq ($(LINK_ENB_PDCP_TO_GTPV1U), 1)
- COMMON_CFLAGS += -DLINK_ENB_PDCP_TO_GTPV1U
-# COMMON_CFLAGS += -I$(UDP_DIR)
-# COMMON_CFLAGS += -I$(GTPV1U_DIR)
-# COMMON_CFLAGS += -I$(GTPV1U_DIR)/nw-gtpv1u/shared
-endif
-endif
-
-ifeq ($(ENABLE_ITTI),1)
-COMMON_CFLAGS += -DENABLE_ITTI
-COMMON_CFLAGS += -I$(OPENAIR1_DIR)
-COMMON_CFLAGS += -I$(OPENAIR2_DIR)/NAS
-COMMON_CFLAGS += $(L2_incl)
-COMMON_CFLAGS += $(UTILS_incl)
-SHARED_DEPENDENCIES += $(ITTI_MESSAGES_H)
-endif
-
-ifeq ($(USE_MME), R10)
-LIBS += $(UE_NAS_OBJ_DIR)/libuenas.a $(SECU_OBJ_DIR)/libsecu.a
-LIBS += $(S1AP_OBJ_DIR)/libs1ap.a $(SCTP_OBJ_DIR)/libsctp.a -lsctp -lcrypt
-LIBS += $(UDP_OBJ_DIR)/libudp.a $(GTPV1U_OBJ_DIR)/libgtpv1u.a
-
-ifdef X2AP
-LIBS += $(X2AP_OBJ_DIR)/libx2ap.a
-SHARED_DEPENDENCIES += $(UE_NAS_OBJ_DIR)/libuenas.a $(SECU_OBJ_DIR)/libsecu.a $(X2AP_OBJ_DIR)/libx2ap.a $(S1AP_OBJ_DIR)/libs1ap.a $(SCTP_OBJ_DIR)/libsctp.a $(UDP_OBJ_DIR)/libudp.a $(GTPV1U_OBJ_DIR)/libgtpv1u.a
-else
-SHARED_DEPENDENCIES += $(UE_NAS_OBJ_DIR)/libuenas.a $(SECU_OBJ_DIR)/libsecu.a $(S1AP_OBJ_DIR)/libs1ap.a $(SCTP_OBJ_DIR)/libsctp.a $(UDP_OBJ_DIR)/libudp.a $(GTPV1U_OBJ_DIR)/libgtpv1u.a
-endif
-
-COMMON_CFLAGS += -DLOG_NO_THREAD
-#-DEMIT_ASN_DEBUG
-
-openair_cn_available := $(shell if [ -d "$(UE_NAS_DIR)" ]; then echo "0" ; else echo "1" ; fi )
-ifeq ($(openair_cn_available), 0)
-COMMON_CFLAGS += -DENABLE_NAS_UE_LOGGING
-COMMON_CFLAGS += -I$(OPENAIR_DIR)/openair3/NAS/EURECOM-NAS/src/api/network
-COMMON_CFLAGS += -I$(OPENAIR_DIR)/openair3/NAS/EURECOM-NAS/src/include
-COMMON_CFLAGS += -I$(OPENAIR_DIR)/openair3/NAS/EURECOM-NAS/src/ies
-COMMON_CFLAGS += -I$(OPENAIR_DIR)/openair3/NAS/EURECOM-NAS/src/emm/msg
-COMMON_CFLAGS += -I$(OPENAIR_DIR)/openair3/NAS/EURECOM-NAS/src/esm/msg
-COMMON_CFLAGS += -I$(OPENAIR_DIR)/openair3/NAS/EURECOM-NAS/src/util
-endif
-
-UENAS_CFLAGS = $(COMMON_CFLAGS)
-UENAS_CFLAGS += -I$(SECU_DIR)
-export UENAS_CFLAGS
-
-SECU_CFLAGS = $(COMMON_CFLAGS)
-SECU_CFLAGS += -I$(OPENAIR_DIR)/openair3/COMMON
-SECU_CFLAGS += -I$(OPENAIR_DIR)/openair3/UTILS
-SECU_CFLAGS += -I$(SECU_DIR)
-export SECU_CFLAGS
-
-COMMON_MME_CFLAGS = -I$(SECU_DIR)
-COMMON_MME_CFLAGS += -I$(SCTP_DIR)
-COMMON_MME_CFLAGS += -I$(X2AP_DIR)
-COMMON_MME_CFLAGS += -I$(S1AP_DIR)
-COMMON_MME_CFLAGS += -I$(UDP_DIR)
-COMMON_MME_CFLAGS += -I$(GTPV1U_DIR)
-
-S1AP_CFLAGS = $(COMMON_CFLAGS) $(COMMON_MME_CFLAGS)
-S1AP_CFLAGS += -DENB_MODE
-S1AP_CFLAGS += -I$(TOP_DIR)
-S1AP_CFLAGS += $(UTIL_incl)
-export S1AP_CFLAGS
-
-X2AP_CFLAGS = $(COMMON_CFLAGS)
-X2AP_CFLAGS += -DENB_MODE
-X2AP_CFLAGS += -I$(TOP_DIR)
-X2AP_CFLAGS += $(UTIL_incl)
-export X2AP_CFLAGS
-
-UDP_CFLAGS = $(COMMON_CFLAGS) $(COMMON_MME_CFLAGS)
-UDP_CFLAGS += -DENB_MODE
-UDP_CFLAGS += -I$(TOP_DIR)
-UDP_CFLAGS += $(UTIL_incl)
-UDP_CFLAGS += -I$(OPENAIR_DIR)/openair2/ENB_APP
-export UDP_CFLAGS
-
-GTPV1U_CFLAGS = $(COMMON_CFLAGS) $(COMMON_MME_CFLAGS)
-GTPV1U_CFLAGS += -DENB_MODE
-GTPV1U_CFLAGS += -I$(TOP_DIR)
-GTPV1U_CFLAGS += -I$(GTPV1U_DIR)/nw-gtpv1u/include
-GTPV1U_CFLAGS += -I$(GTPV1U_DIR)/nw-gtpv1u/shared
-GTPV1U_CFLAGS += -I$(OPENAIR_DIR)/openair2/ENB_APP
-GTPV1U_CFLAGS += $(UTIL_incl) -I$(OPENAIR3_DIR)/UTILS
-export GTPV1U_CFLAGS
-
-GTPV1U_ENB_CFLAGS = $(COMMON_CFLAGS)
-GTPV1U_ENB_CFLAGS += $(OPENAIR_DIR)/openair2/COMMON
-GTPV1U_ENB_CFLAGS += -I$(X2AP_DIR)
-GTPV1U_ENB_CFLAGS += -I$(S1AP_DIR)
-GTPV1U_ENB_CFLAGS += -I$(UDP_DIR)
-GTPV1U_ENB_CFLAGS += -I$(GTPV1U_DIR)
-GTPV1U_ENB_CFLAGS += -DENB_MODE
-GTPV1U_ENB_CFLAGS += -I$(TOP_DIR)
-GTPV1U_ENB_CFLAGS += -I$(GTPV1U_DIR)/nw-gtpv1u/include
-GTPV1U_ENB_CFLAGS += -I$(GTPV1U_DIR)/nw-gtpv1u/shared
-GTPV1U_ENB_CFLAGS += -I$(OPENAIR_DIR)/openair2/ENB_APP
-GTPV1U_ENB_CFLAGS += $(UTIL_incl) -I$(OPENAIR3_DIR)/UTILS
-export GTPV1U_ENB_CFLAGS
-
-
-$(UE_NAS_OBJ_DIR)/libuenas.a: force_look
- @$(MAKE) -C $(UE_NAS_DIR) -f Makefile.UE $(UE_NAS_OBJ_DIR)/libuenas.a OUTDIR=$(UE_NAS_OBJ_DIR)
-$(SECU_OBJ_DIR)/libsecu.a: force_look
- @$(MAKE) -C $(SECU_DIR) -f Makefile.eNB $(SECU_OBJ_DIR)/libsecu.a OUTDIR=$(SECU_OBJ_DIR)
-$(X2AP_OBJ_DIR)/libx2ap.a: force_look
- @$(MAKE) -C $(X2AP_DIR) -f Makefile.inc $(X2AP_OBJ_DIR)/libx2ap.a OUTDIR=$(X2AP_OBJ_DIR)
-$(S1AP_OBJ_DIR)/libs1ap.a: force_look
- @$(MAKE) -C $(S1AP_DIR) -f Makefile.eNB $(S1AP_OBJ_DIR)/libs1ap.a OUTDIR=$(S1AP_OBJ_DIR)
-$(SCTP_OBJ_DIR)/libsctp.a: force_look
- @$(MAKE) -C $(SCTP_DIR) -f Makefile.eNB $(SCTP_OBJ_DIR)/libsctp.a OUTDIR=$(SCTP_OBJ_DIR)
-$(UDP_OBJ_DIR)/libudp.a: force_look
- @$(MAKE) -C $(UDP_DIR) -f Makefile.eNB $(UDP_OBJ_DIR)/libudp.a OUTDIR=$(UDP_OBJ_DIR)
-$(GTPV1U_OBJ_DIR)/libgtpv1u.a: force_look
- @$(MAKE) -C $(GTPV1U_DIR) -f Makefile.eNB $(GTPV1U_OBJ_DIR)/libgtpv1u.a OUTDIR=$(GTPV1U_OBJ_DIR)
-
-OBJ = $(NAS_UE_OBJS) $(SECU_OBJS)
-endif
-
-export COMMON_CFLAGS
-
-ifeq ($(ENABLE_ITTI),1)
-CFLAGS += $(COMMON_CFLAGS) $(COMMON_MME_CFLAGS) $(TARGETS_COMMON_incl)
-OBJ += $(TARGETS_COMMON_OBJS)
-
-gccxml_available = $(shell if [ `gccxml --version | grep GCC-XML -c` = "0" ]; then echo "0" ; else echo "1" ; fi )
-ifeq ($(gccxml_available), 0)
-$(error gccxml is missing, please install)
-endif
-CFLAGS += -I$(OPENAIR2_DIR)/COMMON -DENABLE_ITTI $(UTILS_incl)
-endif
-
-$(ITTI_MESSAGES_XML): $(ITTI_MESSAGES_FILE)
- @echo "Generating messages.xml ..."
- @gccxml $(COMMON_CFLAGS) $< -fxml=$@ -I$(ITTI_DIR)
- @$(CC) -MM $(COMMON_CFLAGS) $< > $(basename $@).d
- @mv -f $(basename $@).d $(basename $@).d.tmp
- @sed -e 's|.*:|$@:|' < $(basename $@).d.tmp > $(basename $@).d
- @sed -e 's/.*://' -e 's/\\$$//' < $(basename $@).d.tmp | fmt -1 | \
- sed -e 's/^ *//' -e 's/$$/:/' >> $(basename $@).d
- @rm -f $(basename $@).d.tmp
-
-$(ITTI_MESSAGES_H): $(ITTI_MESSAGES_XML)
- @echo "Generating messages_xml.h ..."
- @sed -e 's/[ ]*//' -e 's/"/\\"/g' -e 's/^/"/' -e 's/$$/\\n"/' $< > $@
-
-force_look:
- @true
-
-common-clean:
- @$(RM_F_V) $(ITTI_MESSAGES_H) $(ITTI_MESSAGES_XML) $(ITTI_MESSAGES_XML:.xml=.d)
- @$(MAKE) -C $(LFDS_DIR) -f makefile.linux clean OUTDIR=$(LFDS_OBJ_DIR)
- @if [ -d $(UE_NAS_OBJ_DIR) ]; then $(MAKE) -C $(UE_NAS_DIR) -f Makefile.UE clean OUTDIR=$(UE_NAS_OBJ_DIR); fi
- @if [ -d $(SECU_OBJ_DIR) ]; then $(MAKE) -C $(SECU_DIR) -f Makefile.eNB clean OUTDIR=$(SECU_OBJ_DIR); fi
- @if [ -d $(X2AP_OBJ_DIR) ]; then $(MAKE) -C $(X2AP_DIR) -f Makefile.inc clean OUTDIR=$(X2AP_OBJ_DIR); fi
- @if [ -d $(S1AP_OBJ_DIR) ]; then $(MAKE) -C $(S1AP_DIR) -f Makefile.eNB clean OUTDIR=$(S1AP_OBJ_DIR); fi
- @if [ -d $(SCTP_OBJ_DIR) ]; then $(MAKE) -C $(SCTP_DIR) -f Makefile.eNB clean OUTDIR=$(SCTP_OBJ_DIR); fi
- @if [ -d $(UDP_OBJ_DIR) ]; then $(MAKE) -C $(UDP_DIR) -f Makefile.eNB clean OUTDIR=$(UDP_OBJ_DIR); fi
- @if [ -d $(GTPV1U_OBJ_DIR) ]; then $(MAKE) -C $(GTPV1U_DIR) -f Makefile.eNB clean OUTDIR=$(GTPV1U_OBJ_DIR); fi
-
-common-cleanall:
- @if [ -d $(UE_NAS_OBJ_DIR) ]; then $(MAKE) -C $(UE_NAS_DIR) -f Makefile.UE cleanall OUTDIR=$(UE_NAS_OBJ_DIR); fi
- @if [ -d $(SECU_OBJ_DIR) ]; then $(MAKE) -C $(SECU_DIR) -f Makefile.eNB cleanall OUTDIR=$(SECU_OBJ_DIR); fi
- @if [ -d $(X2AP_OBJ_DIR) ]; then $(MAKE) -C $(X2AP_DIR) -f Makefile.inc cleanall OUTDIR=$(X2AP_OBJ_DIR); fi
- @if [ -d $(S1AP_OBJ_DIR) ]; then $(MAKE) -C $(S1AP_DIR) -f Makefile.eNB cleanall OUTDIR=$(S1AP_OBJ_DIR); fi
- @if [ -d $(SCTP_OBJ_DIR) ]; then $(MAKE) -C $(SCTP_DIR) -f Makefile.eNB cleanall OUTDIR=$(SCTP_OBJ_DIR); fi
- @if [ -d $(UDP_OBJ_DIR) ]; then $(MAKE) -C $(UDP_DIR) -f Makefile.eNB cleanall OUTDIR=$(UDP_OBJ_DIR); fi
- @if [ -d $(GTPV1U_OBJ_DIR) ]; then $(MAKE) -C $(GTPV1U_DIR) -f Makefile.eNB cleanall OUTDIR=$(GTPV1U_OBJ_DIR); fi
-
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf
index 644981173b..62b89188f9 100644
--- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf
@@ -230,7 +230,6 @@ MACRLCs = (
num_cc = 1;
tr_s_preference = "local_L1";
tr_n_preference = "local_RRC";
- ulsch_max_slots_inactivity = 10;
pusch_TargetSNRx10 = 150;
pucch_TargetSNRx10 = 200;
}
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf
index 9c0427789d..ac8622fbc5 100644
--- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf
@@ -230,7 +230,6 @@ MACRLCs = (
num_cc = 1;
tr_s_preference = "local_L1";
tr_n_preference = "local_RRC";
- ulsch_max_slots_inactivity = 10;
pusch_TargetSNRx10 = 150;
pucch_TargetSNRx10 = 200;
}
diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c
index 31c142c8da..632a47707b 100644
--- a/targets/RT/USER/lte-enb.c
+++ b/targets/RT/USER/lte-enb.c
@@ -88,10 +88,6 @@
#include "enb_config.h"
#include "targets/RT/USER/lte-softmodem.h"
-#ifndef OPENAIR2
- #include "UTIL/OTG/otg_extern.h"
-#endif
-
#include "s1ap_eNB.h"
#include "SIMULATION/ETH_TRANSPORT/proto.h"
diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c
index a67b58d61a..ed9daf23f6 100644
--- a/targets/RT/USER/lte-softmodem.c
+++ b/targets/RT/USER/lte-softmodem.c
@@ -82,10 +82,6 @@ unsigned short config_frames[4] = {2,9,11,13};
#include "enb_config.h"
//#include "PHY/TOOLS/time_meas.h"
-#ifndef OPENAIR2
- #include "UTIL/OTG/otg_vars.h"
-#endif
-
#include "create_tasks.h"
diff --git a/targets/RT/USER/lte-ue.c b/targets/RT/USER/lte-ue.c
index 6e6c2533b4..1fae6c1e66 100644
--- a/targets/RT/USER/lte-ue.c
+++ b/targets/RT/USER/lte-ue.c
@@ -2067,7 +2067,6 @@ void init_UE_threads_stub(int inst)
}
-#ifdef OPENAIR2
void fill_ue_band_info(void)
{
LTE_UE_EUTRA_Capability_t *UE_EUTRA_Capability = UE_rrc_inst[0].UECap->UE_EUTRA_Capability;
@@ -2092,7 +2091,6 @@ void fill_ue_band_info(void)
}
}
}
-#endif
int setup_ue_buffers(PHY_VARS_UE **phy_vars_ue,
openair0_config_t *openair0_cfg)
diff --git a/targets/RT/USER/lte-uesoftmodem.c b/targets/RT/USER/lte-uesoftmodem.c
index 25bbef0bc6..da9b0fdfba 100644
--- a/targets/RT/USER/lte-uesoftmodem.c
+++ b/targets/RT/USER/lte-uesoftmodem.c
@@ -75,10 +75,6 @@
#include "common/utils/LOG/vcd_signal_dumper.h"
#include "UTIL/OPT/opt.h"
-#ifndef OPENAIR2
- #include "UTIL/OTG/otg_vars.h"
-#endif
-
#include "create_tasks.h"
#include "system.h"