Merge remote-tracking branch 'origin/develop' into NR_coreset_harmonization
This commit is contained in:
@@ -4,11 +4,11 @@
|
|||||||
|
|
||||||
replicaCount: 1
|
replicaCount: 1
|
||||||
|
|
||||||
namespace: "oaicicd-ran-tmp"
|
namespace: "OAICICD_PROJECT"
|
||||||
|
|
||||||
image:
|
image:
|
||||||
registry: local
|
registry: local
|
||||||
repository: image-registry.openshift-image-registry.svc:5000/oaicicd-ran-tmp/oai-physim
|
repository: image-registry.openshift-image-registry.svc:5000/OAICICD_PROJECT/oai-physim
|
||||||
version: temp
|
version: temp
|
||||||
# pullPolicy: IfNotPresent or Never or Always
|
# pullPolicy: IfNotPresent or Never or Always
|
||||||
pullPolicy: Always
|
pullPolicy: Always
|
||||||
|
|||||||
@@ -4,11 +4,11 @@
|
|||||||
|
|
||||||
replicaCount: 1
|
replicaCount: 1
|
||||||
|
|
||||||
namespace: "oaicicd-ran-tmp"
|
namespace: "OAICICD_PROJECT"
|
||||||
|
|
||||||
image:
|
image:
|
||||||
registry: local
|
registry: local
|
||||||
repository: image-registry.openshift-image-registry.svc:5000/oaicicd-ran-tmp/oai-physim
|
repository: image-registry.openshift-image-registry.svc:5000/OAICICD_PROJECT/oai-physim
|
||||||
version: temp
|
version: temp
|
||||||
# pullPolicy: IfNotPresent or Never or Always
|
# pullPolicy: IfNotPresent or Never or Always
|
||||||
pullPolicy: Always
|
pullPolicy: Always
|
||||||
|
|||||||
@@ -4,11 +4,11 @@
|
|||||||
|
|
||||||
replicaCount: 1
|
replicaCount: 1
|
||||||
|
|
||||||
namespace: "oaicicd-ran-tmp"
|
namespace: "OAICICD_PROJECT"
|
||||||
|
|
||||||
image:
|
image:
|
||||||
registry: local
|
registry: local
|
||||||
repository: image-registry.openshift-image-registry.svc:5000/oaicicd-ran-tmp/oai-physim
|
repository: image-registry.openshift-image-registry.svc:5000/OAICICD_PROJECT/oai-physim
|
||||||
version: temp
|
version: temp
|
||||||
# pullPolicy: IfNotPresent or Never or Always
|
# pullPolicy: IfNotPresent or Never or Always
|
||||||
pullPolicy: Always
|
pullPolicy: Always
|
||||||
|
|||||||
@@ -4,11 +4,11 @@
|
|||||||
|
|
||||||
replicaCount: 1
|
replicaCount: 1
|
||||||
|
|
||||||
namespace: "oaicicd-ran-tmp"
|
namespace: "OAICICD_PROJECT"
|
||||||
|
|
||||||
image:
|
image:
|
||||||
registry: local
|
registry: local
|
||||||
repository: image-registry.openshift-image-registry.svc:5000/oaicicd-ran-tmp/oai-physim
|
repository: image-registry.openshift-image-registry.svc:5000/OAICICD_PROJECT/oai-physim
|
||||||
version: temp
|
version: temp
|
||||||
# pullPolicy: IfNotPresent or Never or Always
|
# pullPolicy: IfNotPresent or Never or Always
|
||||||
pullPolicy: Always
|
pullPolicy: Always
|
||||||
|
|||||||
@@ -4,11 +4,11 @@
|
|||||||
|
|
||||||
replicaCount: 1
|
replicaCount: 1
|
||||||
|
|
||||||
namespace: "oaicicd-ran-tmp"
|
namespace: "OAICICD_PROJECT"
|
||||||
|
|
||||||
image:
|
image:
|
||||||
registry: local
|
registry: local
|
||||||
repository: image-registry.openshift-image-registry.svc:5000/oaicicd-ran-tmp/oai-physim
|
repository: image-registry.openshift-image-registry.svc:5000/OAICICD_PROJECT/oai-physim
|
||||||
version: temp
|
version: temp
|
||||||
# pullPolicy: IfNotPresent or Never or Always
|
# pullPolicy: IfNotPresent or Never or Always
|
||||||
pullPolicy: Always
|
pullPolicy: Always
|
||||||
|
|||||||
@@ -4,11 +4,11 @@
|
|||||||
|
|
||||||
replicaCount: 1
|
replicaCount: 1
|
||||||
|
|
||||||
namespace: "oaicicd-ran-tmp"
|
namespace: "OAICICD_PROJECT"
|
||||||
|
|
||||||
image:
|
image:
|
||||||
registry: local
|
registry: local
|
||||||
repository: image-registry.openshift-image-registry.svc:5000/oaicicd-ran-tmp/oai-physim
|
repository: image-registry.openshift-image-registry.svc:5000/OAICICD_PROJECT/oai-physim
|
||||||
version: temp
|
version: temp
|
||||||
# pullPolicy: IfNotPresent or Never or Always
|
# pullPolicy: IfNotPresent or Never or Always
|
||||||
pullPolicy: Always
|
pullPolicy: Always
|
||||||
|
|||||||
@@ -4,11 +4,11 @@
|
|||||||
|
|
||||||
replicaCount: 1
|
replicaCount: 1
|
||||||
|
|
||||||
namespace: "oaicicd-ran-tmp"
|
namespace: "OAICICD_PROJECT"
|
||||||
|
|
||||||
image:
|
image:
|
||||||
registry: local
|
registry: local
|
||||||
repository: image-registry.openshift-image-registry.svc:5000/oaicicd-ran-tmp/oai-physim
|
repository: image-registry.openshift-image-registry.svc:5000/OAICICD_PROJECT/oai-physim
|
||||||
version: temp
|
version: temp
|
||||||
# pullPolicy: IfNotPresent or Never or Always
|
# pullPolicy: IfNotPresent or Never or Always
|
||||||
pullPolicy: Always
|
pullPolicy: Always
|
||||||
|
|||||||
@@ -4,11 +4,11 @@
|
|||||||
|
|
||||||
replicaCount: 1
|
replicaCount: 1
|
||||||
|
|
||||||
namespace: "oaicicd-ran-tmp"
|
namespace: "OAICICD_PROJECT"
|
||||||
|
|
||||||
image:
|
image:
|
||||||
registry: local
|
registry: local
|
||||||
repository: image-registry.openshift-image-registry.svc:5000/oaicicd-ran-tmp/oai-physim
|
repository: image-registry.openshift-image-registry.svc:5000/OAICICD_PROJECT/oai-physim
|
||||||
version: temp
|
version: temp
|
||||||
# pullPolicy: IfNotPresent or Never or Always
|
# pullPolicy: IfNotPresent or Never or Always
|
||||||
pullPolicy: Always
|
pullPolicy: Always
|
||||||
|
|||||||
@@ -4,11 +4,11 @@
|
|||||||
|
|
||||||
replicaCount: 1
|
replicaCount: 1
|
||||||
|
|
||||||
namespace: "oaicicd-ran-tmp"
|
namespace: "OAICICD_PROJECT"
|
||||||
|
|
||||||
image:
|
image:
|
||||||
registry: local
|
registry: local
|
||||||
repository: image-registry.openshift-image-registry.svc:5000/oaicicd-ran-tmp/oai-physim
|
repository: image-registry.openshift-image-registry.svc:5000/OAICICD_PROJECT/oai-physim
|
||||||
version: temp
|
version: temp
|
||||||
# pullPolicy: IfNotPresent or Never or Always
|
# pullPolicy: IfNotPresent or Never or Always
|
||||||
pullPolicy: Always
|
pullPolicy: Always
|
||||||
|
|||||||
@@ -4,11 +4,11 @@
|
|||||||
|
|
||||||
replicaCount: 1
|
replicaCount: 1
|
||||||
|
|
||||||
namespace: "oaicicd-ran-tmp"
|
namespace: "OAICICD_PROJECT"
|
||||||
|
|
||||||
image:
|
image:
|
||||||
registry: local
|
registry: local
|
||||||
repository: image-registry.openshift-image-registry.svc:5000/oaicicd-ran-tmp/oai-physim
|
repository: image-registry.openshift-image-registry.svc:5000/OAICICD_PROJECT/oai-physim
|
||||||
version: temp
|
version: temp
|
||||||
# pullPolicy: IfNotPresent or Never or Always
|
# pullPolicy: IfNotPresent or Never or Always
|
||||||
pullPolicy: Always
|
pullPolicy: Always
|
||||||
|
|||||||
@@ -4,11 +4,11 @@
|
|||||||
|
|
||||||
replicaCount: 1
|
replicaCount: 1
|
||||||
|
|
||||||
namespace: "oaicicd-ran-tmp"
|
namespace: "OAICICD_PROJECT"
|
||||||
|
|
||||||
image:
|
image:
|
||||||
registry: local
|
registry: local
|
||||||
repository: image-registry.openshift-image-registry.svc:5000/oaicicd-ran-tmp/oai-physim
|
repository: image-registry.openshift-image-registry.svc:5000/OAICICD_PROJECT/oai-physim
|
||||||
version: temp
|
version: temp
|
||||||
# pullPolicy: IfNotPresent or Never or Always
|
# pullPolicy: IfNotPresent or Never or Always
|
||||||
pullPolicy: Always
|
pullPolicy: Always
|
||||||
|
|||||||
@@ -4,11 +4,11 @@
|
|||||||
|
|
||||||
replicaCount: 1
|
replicaCount: 1
|
||||||
|
|
||||||
namespace: "oaicicd-ran-tmp"
|
namespace: "OAICICD_PROJECT"
|
||||||
|
|
||||||
image:
|
image:
|
||||||
registry: local
|
registry: local
|
||||||
repository: image-registry.openshift-image-registry.svc:5000/oaicicd-ran-tmp/oai-physim
|
repository: image-registry.openshift-image-registry.svc:5000/OAICICD_PROJECT/oai-physim
|
||||||
version: temp
|
version: temp
|
||||||
# pullPolicy: IfNotPresent or Never or Always
|
# pullPolicy: IfNotPresent or Never or Always
|
||||||
pullPolicy: Always
|
pullPolicy: Always
|
||||||
|
|||||||
@@ -1,12 +1,26 @@
|
|||||||
apiVersion: rbac.authorization.k8s.io/v1beta1
|
apiVersion: rbac.authorization.k8s.io/v1
|
||||||
kind: ClusterRoleBinding
|
kind: Role
|
||||||
metadata:
|
metadata:
|
||||||
name: {{ .Chart.Name }}-{{ .Values.global.namespace }}-rbac
|
name: {{ .Chart.Name }}-{{ .Release.Namespace }}-role
|
||||||
roleRef:
|
rules:
|
||||||
apiGroup: rbac.authorization.k8s.io
|
- apiGroups:
|
||||||
kind: ClusterRole
|
- security.openshift.io
|
||||||
name: cluster-admin
|
resourceNames:
|
||||||
|
- privileged
|
||||||
|
resources:
|
||||||
|
- securitycontextconstraints
|
||||||
|
verbs:
|
||||||
|
- use
|
||||||
|
---
|
||||||
|
apiVersion: rbac.authorization.k8s.io/v1
|
||||||
|
kind: RoleBinding
|
||||||
|
metadata:
|
||||||
|
name: {{ .Chart.Name }}-{{ .Release.Namespace }}-binding
|
||||||
subjects:
|
subjects:
|
||||||
- kind: ServiceAccount
|
- kind: ServiceAccount
|
||||||
name: {{ .Values.global.serviceAccountName }}
|
name: {{ .Values.global.serviceAccountName }}
|
||||||
namespace: {{ .Values.global.namespace }}
|
namespace: {{ .Release.Namespace }}
|
||||||
|
roleRef:
|
||||||
|
kind: Role
|
||||||
|
name: {{ .Chart.Name }}-{{ .Release.Namespace }}-role
|
||||||
|
apiGroup: rbac.authorization.k8s.io
|
||||||
|
|||||||
@@ -4,9 +4,9 @@
|
|||||||
|
|
||||||
global:
|
global:
|
||||||
serviceAccountName: oai-physim-sa
|
serviceAccountName: oai-physim-sa
|
||||||
namespace: "oaicicd-ran-tmp"
|
namespace: "OAICICD_PROJECT"
|
||||||
image:
|
image:
|
||||||
repository: image-registry.openshift-image-registry.svc:5000/oaicicd-ran-tmp/oai-physim
|
repository: image-registry.openshift-image-registry.svc:5000/OAICICD_PROJECT/oai-physim
|
||||||
version: TAG
|
version: TAG
|
||||||
|
|
||||||
## Declaring values specific to coressponding physim to overwrite
|
## Declaring values specific to coressponding physim to overwrite
|
||||||
|
|||||||
@@ -26,6 +26,9 @@ def nodeExecutor = params.nodeExecutor
|
|||||||
// Name of the phone resource
|
// Name of the phone resource
|
||||||
def ciServerResource = params.serverResource
|
def ciServerResource = params.serverResource
|
||||||
|
|
||||||
|
// Docker Hub account to push to
|
||||||
|
def DH_Account = "oaisoftwarealliance"
|
||||||
|
|
||||||
pipeline {
|
pipeline {
|
||||||
agent {
|
agent {
|
||||||
label nodeExecutor
|
label nodeExecutor
|
||||||
@@ -66,11 +69,11 @@ pipeline {
|
|||||||
def listOfImages = ["oai-enb", "oai-gnb", "oai-lte-ue", "oai-nr-ue"]
|
def listOfImages = ["oai-enb", "oai-gnb", "oai-lte-ue", "oai-nr-ue"]
|
||||||
sh "docker login -u ${DH_Username} -p ${DH_Password} > /dev/null 2>&1"
|
sh "docker login -u ${DH_Username} -p ${DH_Password} > /dev/null 2>&1"
|
||||||
listOfImages.eachWithIndex { item, iindex ->
|
listOfImages.eachWithIndex { item, iindex ->
|
||||||
sh "docker image tag ${item}:develop ${DH_Username}/${item}:develop"
|
sh "docker image tag ${item}:develop ${DH_Account}/${item}:develop"
|
||||||
sh "docker image tag ${item}:develop ${DH_Username}/${item}:${WEEK_TAG}"
|
sh "docker image tag ${item}:develop ${DH_Account}/${item}:${WEEK_TAG}"
|
||||||
sh "docker push --quiet ${DH_Username}/${item}:${WEEK_TAG}"
|
sh "docker push --quiet ${DH_Account}/${item}:${WEEK_TAG}"
|
||||||
sh "docker push --quiet ${DH_Username}/${item}:develop"
|
sh "docker push --quiet ${DH_Account}/${item}:develop"
|
||||||
sh "docker rmi ${DH_Username}/${item}:${WEEK_TAG} ${DH_Username}/${item}:develop"
|
sh "docker rmi ${DH_Account}/${item}:${WEEK_TAG} ${DH_Account}/${item}:develop"
|
||||||
}
|
}
|
||||||
sh "docker logout > /dev/null 2>&1"
|
sh "docker logout > /dev/null 2>&1"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ steps:
|
|||||||
|
|
||||||
|
|
||||||
ADB: #on Caracal
|
ADB: #on Caracal
|
||||||
ADBIPAddress : 192.168.18.196
|
ADBIPAddress : 172.21.16.132
|
||||||
ADBUserName : oaici
|
ADBUserName : oaici
|
||||||
ADBPassword : KkexF6CErOi1fNuebCPsuIVK
|
ADBPassword : KkexF6CErOi1fNuebCPsuIVK
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ idefix:
|
|||||||
LogStore : /media/usb-drive/ci_qlogs
|
LogStore : /media/usb-drive/ci_qlogs
|
||||||
PLMN : 22201
|
PLMN : 22201
|
||||||
UENetwork : wwan0
|
UENetwork : wwan0
|
||||||
HostIPAddress : 192.168.18.188
|
HostIPAddress : 172.21.16.135
|
||||||
HostUsername : oaicicd
|
HostUsername : oaicicd
|
||||||
HostPassword : oaicicd
|
HostPassword : oaicicd
|
||||||
HostSourceCodePath : none
|
HostSourceCodePath : none
|
||||||
@@ -32,7 +32,7 @@ nrmodule2_quectel:
|
|||||||
LogStore : /media/ci_qlogs
|
LogStore : /media/ci_qlogs
|
||||||
PLMN : 20897
|
PLMN : 20897
|
||||||
UENetwork : wwan0
|
UENetwork : wwan0
|
||||||
HostIPAddress : 192.168.18.189
|
HostIPAddress : 172.21.16.139
|
||||||
HostUsername : nrmodule2
|
HostUsername : nrmodule2
|
||||||
HostPassword : linux
|
HostPassword : linux
|
||||||
HostSourceCodePath : none
|
HostSourceCodePath : none
|
||||||
@@ -40,6 +40,7 @@ nrmodule2_quectel:
|
|||||||
- sudo -S ip link set dev wwan1 mtu 1500
|
- sudo -S ip link set dev wwan1 mtu 1500
|
||||||
MTU : 1500
|
MTU : 1500
|
||||||
|
|
||||||
|
# CAUTION: 192.168.18.89 address has to be changed when the server is moved
|
||||||
#single UE single ping
|
#single UE single ping
|
||||||
amarisoft_ue_1:
|
amarisoft_ue_1:
|
||||||
ID: amarisoft_ue_1
|
ID: amarisoft_ue_1
|
||||||
@@ -97,7 +98,7 @@ dummy:
|
|||||||
DetachScript : ''
|
DetachScript : ''
|
||||||
PLMN : 22201
|
PLMN : 22201
|
||||||
UENetwork : wwan0
|
UENetwork : wwan0
|
||||||
HostIPAddress : 192.168.18.188
|
HostIPAddress : 172.21.16.135
|
||||||
HostUsername : oaicicd
|
HostUsername : oaicicd
|
||||||
HostPassword : oaicicd
|
HostPassword : oaicicd
|
||||||
HostSourceCodePath : none
|
HostSourceCodePath : none
|
||||||
|
|||||||
@@ -243,7 +243,7 @@ class Containerize():
|
|||||||
# Build the base image only on Push Events (not on Merge Requests)
|
# Build the base image only on Push Events (not on Merge Requests)
|
||||||
# On when the base image docker file is being modified.
|
# On when the base image docker file is being modified.
|
||||||
if forceBaseImageBuild:
|
if forceBaseImageBuild:
|
||||||
mySSH.command(self.cli + ' build ' + self.cliBuildOptions + ' --target ' + baseImage + ' --tag ' + baseImage + ':' + baseTag + ' --file docker/Dockerfile.base' + self.dockerfileprefix + ' --build-arg NEEDED_GIT_PROXY="http://proxy.eurecom.fr:8080" . > cmake_targets/log/ran-base.log 2>&1', '\$', 1600)
|
mySSH.command(self.cli + ' build ' + self.cliBuildOptions + ' --target ' + baseImage + ' --tag ' + baseImage + ':' + baseTag + ' --file docker/Dockerfile.base' + self.dockerfileprefix + ' . > cmake_targets/log/ran-base.log 2>&1', '\$', 1600)
|
||||||
# First verify if the base image was properly created.
|
# First verify if the base image was properly created.
|
||||||
status = True
|
status = True
|
||||||
mySSH.command(self.cli + ' image inspect --format=\'Size = {{.Size}} bytes\' ' + baseImage + ':' + baseTag, '\$', 5)
|
mySSH.command(self.cli + ' image inspect --format=\'Size = {{.Size}} bytes\' ' + baseImage + ':' + baseTag, '\$', 5)
|
||||||
@@ -294,6 +294,9 @@ class Containerize():
|
|||||||
if image != 'ran-build':
|
if image != 'ran-build':
|
||||||
mySSH.command('sed -i -e "s#' + "ran-build" + ':latest#' + "ran-build" + ':' + imageTag + '#" docker/Dockerfile.' + pattern + self.dockerfileprefix, '\$', 5)
|
mySSH.command('sed -i -e "s#' + "ran-build" + ':latest#' + "ran-build" + ':' + imageTag + '#" docker/Dockerfile.' + pattern + self.dockerfileprefix, '\$', 5)
|
||||||
mySSH.command(self.cli + ' build ' + self.cliBuildOptions + ' --target ' + image + ' --tag ' + image + ':' + imageTag + ' --file docker/Dockerfile.' + pattern + self.dockerfileprefix + ' . > cmake_targets/log/' + image + '.log 2>&1', '\$', 1200)
|
mySSH.command(self.cli + ' build ' + self.cliBuildOptions + ' --target ' + image + ' --tag ' + image + ':' + imageTag + ' --file docker/Dockerfile.' + pattern + self.dockerfileprefix + ' . > cmake_targets/log/' + image + '.log 2>&1', '\$', 1200)
|
||||||
|
# Flatten Image
|
||||||
|
if image != 'ran-build':
|
||||||
|
mySSH.command('python3 ./ci-scripts/flatten_image.py --tag ' + image + ':' + imageTag, '\$', 300)
|
||||||
# split the log
|
# split the log
|
||||||
mySSH.command('mkdir -p cmake_targets/log/' + image, '\$', 5)
|
mySSH.command('mkdir -p cmake_targets/log/' + image, '\$', 5)
|
||||||
mySSH.command('python3 ci-scripts/docker_log_split.py --logfilename=cmake_targets/log/' + image + '.log', '\$', 5)
|
mySSH.command('python3 ci-scripts/docker_log_split.py --logfilename=cmake_targets/log/' + image + '.log', '\$', 5)
|
||||||
@@ -1146,19 +1149,19 @@ class Containerize():
|
|||||||
mySSH.open(ipAddr, userName, password)
|
mySSH.open(ipAddr, userName, password)
|
||||||
# Check if route to asterix gnb exists
|
# Check if route to asterix gnb exists
|
||||||
mySSH.command('ip route | grep --colour=never "192.168.68.64/26"', '\$', 10)
|
mySSH.command('ip route | grep --colour=never "192.168.68.64/26"', '\$', 10)
|
||||||
result = re.search('192.168.18.194', mySSH.getBefore())
|
result = re.search('172.21.16.127', mySSH.getBefore())
|
||||||
if result is None:
|
if result is None:
|
||||||
mySSH.command('echo ' + password + ' | sudo -S ip route add 192.168.68.64/26 via 192.168.18.194 dev eno1', '\$', 10)
|
mySSH.command('echo ' + password + ' | sudo -S ip route add 192.168.68.64/26 via 172.21.16.127 dev eno1', '\$', 10)
|
||||||
# Check if route to obelix enb exists
|
# Check if route to obelix enb exists
|
||||||
mySSH.command('ip route | grep --colour=never "192.168.68.128/26"', '\$', 10)
|
mySSH.command('ip route | grep --colour=never "192.168.68.128/26"', '\$', 10)
|
||||||
result = re.search('192.168.18.193', mySSH.getBefore())
|
result = re.search('172.21.16.128', mySSH.getBefore())
|
||||||
if result is None:
|
if result is None:
|
||||||
mySSH.command('echo ' + password + ' | sudo -S ip route add 192.168.68.128/26 via 192.168.18.193 dev eno1', '\$', 10)
|
mySSH.command('echo ' + password + ' | sudo -S ip route add 192.168.68.128/26 via 172.21.16.128 dev eno1', '\$', 10)
|
||||||
# Check if route to nepes gnb exists
|
# Check if route to nepes gnb exists
|
||||||
mySSH.command('ip route | grep --colour=never "192.168.68.192/26"', '\$', 10)
|
mySSH.command('ip route | grep --colour=never "192.168.68.192/26"', '\$', 10)
|
||||||
result = re.search('192.168.18.209', mySSH.getBefore())
|
result = re.search('172.21.16.137', mySSH.getBefore())
|
||||||
if result is None:
|
if result is None:
|
||||||
mySSH.command('echo ' + password + ' | sudo -S ip route add 192.168.68.192/26 via 192.168.18.209 dev eno1', '\$', 10)
|
mySSH.command('echo ' + password + ' | sudo -S ip route add 192.168.68.192/26 via 172.21.16.137 dev eno1', '\$', 10)
|
||||||
# Check if forwarding is enabled
|
# Check if forwarding is enabled
|
||||||
mySSH.command('sysctl net.ipv4.conf.all.forwarding', '\$', 10)
|
mySSH.command('sysctl net.ipv4.conf.all.forwarding', '\$', 10)
|
||||||
result = re.search('net.ipv4.conf.all.forwarding = 1', mySSH.getBefore())
|
result = re.search('net.ipv4.conf.all.forwarding = 1', mySSH.getBefore())
|
||||||
@@ -1174,19 +1177,19 @@ class Containerize():
|
|||||||
mySSH.open(ipAddr, userName, password)
|
mySSH.open(ipAddr, userName, password)
|
||||||
# Check if route to porcepix epc exists
|
# Check if route to porcepix epc exists
|
||||||
mySSH.command('ip route | grep --colour=never "192.168.61.192/26"', '\$', 10)
|
mySSH.command('ip route | grep --colour=never "192.168.61.192/26"', '\$', 10)
|
||||||
result = re.search('192.168.18.210', mySSH.getBefore())
|
result = re.search('172.21.16.136', mySSH.getBefore())
|
||||||
if result is None:
|
if result is None:
|
||||||
mySSH.command('echo ' + password + ' | sudo -S ip route add 192.168.61.192/26 via 192.168.18.210 dev em1', '\$', 10)
|
mySSH.command('echo ' + password + ' | sudo -S ip route add 192.168.61.192/26 via 172.21.16.136 dev em1', '\$', 10)
|
||||||
# Check if route to porcepix cn5g exists
|
# Check if route to porcepix cn5g exists
|
||||||
mySSH.command('ip route | grep --colour=never "192.168.70.128/26"', '\$', 10)
|
mySSH.command('ip route | grep --colour=never "192.168.70.128/26"', '\$', 10)
|
||||||
result = re.search('192.168.18.210', mySSH.getBefore())
|
result = re.search('172.21.16.136', mySSH.getBefore())
|
||||||
if result is None:
|
if result is None:
|
||||||
mySSH.command('echo ' + password + ' | sudo -S ip route add 192.168.70.128/26 via 192.168.18.210 dev em1', '\$', 10)
|
mySSH.command('echo ' + password + ' | sudo -S ip route add 192.168.70.128/26 via 172.21.16.136 dev em1', '\$', 10)
|
||||||
# Check if X2 route to obelix enb exists
|
# Check if X2 route to obelix enb exists
|
||||||
mySSH.command('ip route | grep --colour=never "192.168.68.128/26"', '\$', 10)
|
mySSH.command('ip route | grep --colour=never "192.168.68.128/26"', '\$', 10)
|
||||||
result = re.search('192.168.18.193', mySSH.getBefore())
|
result = re.search('172.21.16.128', mySSH.getBefore())
|
||||||
if result is None:
|
if result is None:
|
||||||
mySSH.command('echo ' + password + ' | sudo -S ip route add 192.168.68.128/26 via 192.168.18.193 dev em1', '\$', 10)
|
mySSH.command('echo ' + password + ' | sudo -S ip route add 192.168.68.128/26 via 172.21.16.128 dev em1', '\$', 10)
|
||||||
# Check if forwarding is enabled
|
# Check if forwarding is enabled
|
||||||
mySSH.command('sysctl net.ipv4.conf.all.forwarding', '\$', 10)
|
mySSH.command('sysctl net.ipv4.conf.all.forwarding', '\$', 10)
|
||||||
result = re.search('net.ipv4.conf.all.forwarding = 1', mySSH.getBefore())
|
result = re.search('net.ipv4.conf.all.forwarding = 1', mySSH.getBefore())
|
||||||
@@ -1202,19 +1205,19 @@ class Containerize():
|
|||||||
mySSH.open(ipAddr, userName, password)
|
mySSH.open(ipAddr, userName, password)
|
||||||
# Check if route to porcepix epc exists
|
# Check if route to porcepix epc exists
|
||||||
mySSH.command('ip route | grep --colour=never "192.168.61.192/26"', '\$', 10)
|
mySSH.command('ip route | grep --colour=never "192.168.61.192/26"', '\$', 10)
|
||||||
result = re.search('192.168.18.210', mySSH.getBefore())
|
result = re.search('172.21.16.136', mySSH.getBefore())
|
||||||
if result is None:
|
if result is None:
|
||||||
mySSH.command('echo ' + password + ' | sudo -S ip route add 192.168.61.192/26 via 192.168.18.210 dev eno1', '\$', 10)
|
mySSH.command('echo ' + password + ' | sudo -S ip route add 192.168.61.192/26 via 172.21.16.136 dev eno1', '\$', 10)
|
||||||
# Check if X2 route to asterix gnb exists
|
# Check if X2 route to asterix gnb exists
|
||||||
mySSH.command('ip route | grep --colour=never "192.168.68.64/26"', '\$', 10)
|
mySSH.command('ip route | grep --colour=never "192.168.68.64/26"', '\$', 10)
|
||||||
result = re.search('192.168.18.194', mySSH.getBefore())
|
result = re.search('172.21.16.127', mySSH.getBefore())
|
||||||
if result is None:
|
if result is None:
|
||||||
mySSH.command('echo ' + password + ' | sudo -S ip route add 192.168.68.64/26 via 192.168.18.194 dev eno1', '\$', 10)
|
mySSH.command('echo ' + password + ' | sudo -S ip route add 192.168.68.64/26 via 172.21.16.127 dev eno1', '\$', 10)
|
||||||
# Check if X2 route to nepes gnb exists
|
# Check if X2 route to nepes gnb exists
|
||||||
mySSH.command('ip route | grep --colour=never "192.168.68.192/26"', '\$', 10)
|
mySSH.command('ip route | grep --colour=never "192.168.68.192/26"', '\$', 10)
|
||||||
result = re.search('192.168.18.209', mySSH.getBefore())
|
result = re.search('172.21.16.137', mySSH.getBefore())
|
||||||
if result is None:
|
if result is None:
|
||||||
mySSH.command('echo ' + password + ' | sudo -S ip route add 192.168.68.192/26 via 192.168.18.209 dev eno1', '\$', 10)
|
mySSH.command('echo ' + password + ' | sudo -S ip route add 192.168.68.192/26 via 172.21.16.137 dev eno1', '\$', 10)
|
||||||
# Check if forwarding is enabled
|
# Check if forwarding is enabled
|
||||||
mySSH.command('sysctl net.ipv4.conf.all.forwarding', '\$', 10)
|
mySSH.command('sysctl net.ipv4.conf.all.forwarding', '\$', 10)
|
||||||
result = re.search('net.ipv4.conf.all.forwarding = 1', mySSH.getBefore())
|
result = re.search('net.ipv4.conf.all.forwarding = 1', mySSH.getBefore())
|
||||||
@@ -1230,14 +1233,14 @@ class Containerize():
|
|||||||
mySSH.open(ipAddr, userName, password)
|
mySSH.open(ipAddr, userName, password)
|
||||||
# Check if route to porcepix epc exists
|
# Check if route to porcepix epc exists
|
||||||
mySSH.command('ip route | grep --colour=never "192.168.61.192/26"', '\$', 10)
|
mySSH.command('ip route | grep --colour=never "192.168.61.192/26"', '\$', 10)
|
||||||
result = re.search('192.168.18.210', mySSH.getBefore())
|
result = re.search('172.21.16.136', mySSH.getBefore())
|
||||||
if result is None:
|
if result is None:
|
||||||
mySSH.command('echo ' + password + ' | sudo -S ip route add 192.168.61.192/26 via 192.168.18.210 dev enp0s31f6', '\$', 10)
|
mySSH.command('echo ' + password + ' | sudo -S ip route add 192.168.61.192/26 via 172.21.16.136 dev enp0s31f6', '\$', 10)
|
||||||
# Check if X2 route to obelix enb exists
|
# Check if X2 route to obelix enb exists
|
||||||
mySSH.command('ip route | grep --colour=never "192.168.68.128/26"', '\$', 10)
|
mySSH.command('ip route | grep --colour=never "192.168.68.128/26"', '\$', 10)
|
||||||
result = re.search('192.168.18.193', mySSH.getBefore())
|
result = re.search('172.21.16.128', mySSH.getBefore())
|
||||||
if result is None:
|
if result is None:
|
||||||
mySSH.command('echo ' + password + ' | sudo -S ip route add 192.168.68.128/26 via 192.168.18.193 dev enp0s31f6', '\$', 10)
|
mySSH.command('echo ' + password + ' | sudo -S ip route add 192.168.68.128/26 via 172.21.16.128 dev enp0s31f6', '\$', 10)
|
||||||
# Check if forwarding is enabled
|
# Check if forwarding is enabled
|
||||||
mySSH.command('sysctl net.ipv4.conf.all.forwarding', '\$', 10)
|
mySSH.command('sysctl net.ipv4.conf.all.forwarding', '\$', 10)
|
||||||
result = re.search('net.ipv4.conf.all.forwarding = 1', mySSH.getBefore())
|
result = re.search('net.ipv4.conf.all.forwarding = 1', mySSH.getBefore())
|
||||||
|
|||||||
@@ -64,10 +64,10 @@ class Log_Mgt:
|
|||||||
if m is not None:
|
if m is not None:
|
||||||
return int(m.group(1))
|
return int(m.group(1))
|
||||||
|
|
||||||
def __RemoveOldest(self):
|
def __RemoveOldest(self, days):
|
||||||
mySSH = sshconnection.SSHConnection()
|
mySSH = sshconnection.SSHConnection()
|
||||||
mySSH.open(self.IPAddress, self.Username, self.Password)
|
mySSH.open(self.IPAddress, self.Username, self.Password)
|
||||||
COMMAND='echo ' + self.Password + ' | sudo -S find ' + self.path + ' -type f -mtime +14 -delete'
|
COMMAND='echo ' + self.Password + ' | sudo -S find ' + self.path + ' -type f -mtime +' + str(days) + ' -delete'
|
||||||
mySSH.command(COMMAND,'\$',20)
|
mySSH.command(COMMAND,'\$',20)
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
|
|
||||||
@@ -79,13 +79,18 @@ class Log_Mgt:
|
|||||||
|
|
||||||
|
|
||||||
def LogRotation(self):
|
def LogRotation(self):
|
||||||
used_space = self.__CheckUsedSpace() #avail space in target folder
|
doLoop = True
|
||||||
if used_space > 80 :
|
nbDays = 14
|
||||||
logging.debug('\u001B[1;37;41m Used Disk > 80%, on ' + self.Username+'@'+self.IPAddress + '\u001B[0m')
|
while doLoop and nbDays > 1:
|
||||||
logging.debug('\u001B[1;37;41m Removing Artifacts older than 14 days \u001B[0m')
|
used_space = self.__CheckUsedSpace() #avail space in target folder
|
||||||
self.__RemoveOldest()
|
if used_space > 80 :
|
||||||
else:
|
logging.debug('\u001B[1;37;41m Used Disk (' + str(used_space) + '%) > 80%, on ' + self.Username+'@'+self.IPAddress + '\u001B[0m')
|
||||||
logging.debug('Used Disk < 80%, on ' + self.Username+'@'+self.IPAddress +', no cleaning required')
|
logging.debug('\u001B[1;37;41m Removing Artifacts older than ' + str(nbDays) + ' days \u001B[0m')
|
||||||
|
self.__RemoveOldest(nbDays)
|
||||||
|
nbDays -= 1
|
||||||
|
else:
|
||||||
|
logging.debug('Used Disk (' + str(used_space) + '%) < 80%, on ' + self.Username+'@'+self.IPAddress +', no cleaning required')
|
||||||
|
doLoop = False
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -107,14 +107,15 @@ class Module_UE:
|
|||||||
def GetModuleIPAddress(self):
|
def GetModuleIPAddress(self):
|
||||||
HOST=self.HostUsername+'@'+self.HostIPAddress
|
HOST=self.HostUsername+'@'+self.HostIPAddress
|
||||||
response= []
|
response= []
|
||||||
tentative = 3
|
tentative = 8
|
||||||
while (len(response)==0) and (tentative>0):
|
while (len(response)==0) and (tentative>0):
|
||||||
COMMAND="ip a show dev " + self.UENetwork + " | grep --colour=never inet | grep " + self.UENetwork
|
COMMAND="ip a show dev " + self.UENetwork + " | grep --colour=never inet | grep " + self.UENetwork
|
||||||
logging.debug(COMMAND)
|
if tentative == 8:
|
||||||
|
logging.debug(COMMAND)
|
||||||
ssh = subprocess.Popen(["ssh", "%s" % HOST, COMMAND],shell=False,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
|
ssh = subprocess.Popen(["ssh", "%s" % HOST, COMMAND],shell=False,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
|
||||||
response = ssh.stdout.readlines()
|
response = ssh.stdout.readlines()
|
||||||
tentative-=1
|
tentative-=1
|
||||||
time.sleep(10)
|
time.sleep(2)
|
||||||
if (tentative==0) and (len(response)==0):
|
if (tentative==0) and (len(response)==0):
|
||||||
logging.debug('\u001B[1;37;41m Module IP Address Not Found! Time expired \u001B[0m')
|
logging.debug('\u001B[1;37;41m Module IP Address Not Found! Time expired \u001B[0m')
|
||||||
return -1
|
return -1
|
||||||
|
|||||||
@@ -439,7 +439,7 @@ class OaiCiTest():
|
|||||||
while cnt < 4:
|
while cnt < 4:
|
||||||
Module_UE.Command("wup")
|
Module_UE.Command("wup")
|
||||||
logging.debug("Waiting for IP address to be assigned")
|
logging.debug("Waiting for IP address to be assigned")
|
||||||
time.sleep(20)
|
time.sleep(5)
|
||||||
logging.debug("Retrieve IP address")
|
logging.debug("Retrieve IP address")
|
||||||
status=Module_UE.GetModuleIPAddress()
|
status=Module_UE.GetModuleIPAddress()
|
||||||
if status==0:
|
if status==0:
|
||||||
@@ -1111,7 +1111,7 @@ class OaiCiTest():
|
|||||||
while cnt < 4:
|
while cnt < 4:
|
||||||
Module_UE.Command("wup")
|
Module_UE.Command("wup")
|
||||||
logging.debug("Waiting for IP address to be assigned")
|
logging.debug("Waiting for IP address to be assigned")
|
||||||
time.sleep(20)
|
time.sleep(5)
|
||||||
logging.debug("Retrieve IP address")
|
logging.debug("Retrieve IP address")
|
||||||
status=Module_UE.GetModuleIPAddress()
|
status=Module_UE.GetModuleIPAddress()
|
||||||
if status==0:
|
if status==0:
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ import logging
|
|||||||
#to create a SSH object locally in the methods
|
#to create a SSH object locally in the methods
|
||||||
import sshconnection
|
import sshconnection
|
||||||
#to update the HTML object
|
#to update the HTML object
|
||||||
import html
|
import cls_oai_html
|
||||||
from multiprocessing import SimpleQueue
|
from multiprocessing import SimpleQueue
|
||||||
#for log folder maintenance
|
#for log folder maintenance
|
||||||
import os
|
import os
|
||||||
|
|||||||
+22
-10
@@ -33,7 +33,7 @@
|
|||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
import logging
|
import logging
|
||||||
import sshconnection as SSH
|
import sshconnection as SSH
|
||||||
import html
|
import cls_oai_html
|
||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
import time
|
import time
|
||||||
@@ -153,6 +153,7 @@ class PhySim:
|
|||||||
mySSH.command(f'oc project {ocProjectName}', '\$', 30)
|
mySSH.command(f'oc project {ocProjectName}', '\$', 30)
|
||||||
if mySSH.getBefore().count(f'Already on project "{ocProjectName}"') == 0 and mySSH.getBefore().count(f'Now using project "{self.OCProjectName}"') == 0:
|
if mySSH.getBefore().count(f'Already on project "{ocProjectName}"') == 0 and mySSH.getBefore().count(f'Now using project "{self.OCProjectName}"') == 0:
|
||||||
logging.error(f'\u001B[1m Unable to access OC project {ocProjectName}\u001B[0m')
|
logging.error(f'\u001B[1m Unable to access OC project {ocProjectName}\u001B[0m')
|
||||||
|
mySSH.command('oc logout', '\$', 30)
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
HTML.CreateHtmlTestRow('N/A', 'KO', CONST.OC_PROJECT_FAIL)
|
HTML.CreateHtmlTestRow('N/A', 'KO', CONST.OC_PROJECT_FAIL)
|
||||||
RAN.prematureExit = True
|
RAN.prematureExit = True
|
||||||
@@ -161,9 +162,10 @@ class PhySim:
|
|||||||
logging.debug(f'\u001B[1m Now using project {ocProjectName}\u001B[0m')
|
logging.debug(f'\u001B[1m Now using project {ocProjectName}\u001B[0m')
|
||||||
|
|
||||||
# Tag the image and push to the OC cluster
|
# Tag the image and push to the OC cluster
|
||||||
mySSH.command('oc whoami -t | sudo podman login -u ' + ocUserName + ' --password-stdin https://default-route-openshift-image-registry.apps.5glab.nsa.eurecom.fr/ --tls-verify=false', '\$', 30)
|
mySSH.command('oc whoami -t | sudo podman login -u ' + ocUserName + ' --password-stdin https://default-route-openshift-image-registry.apps.oai.cs.eurecom.fr/ --tls-verify=false', '\$', 30)
|
||||||
if mySSH.getBefore().count('Login Succeeded!') == 0:
|
if mySSH.getBefore().count('Login Succeeded!') == 0:
|
||||||
logging.error('\u001B[1m Podman Login to OC Cluster Registry Failed\u001B[0m')
|
logging.error('\u001B[1m Podman Login to OC Cluster Registry Failed\u001B[0m')
|
||||||
|
mySSH.command('oc logout', '\$', 30)
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
HTML.CreateHtmlTestRow('N/A', 'KO', CONST.OC_LOGIN_FAIL)
|
HTML.CreateHtmlTestRow('N/A', 'KO', CONST.OC_LOGIN_FAIL)
|
||||||
RAN.prematureExit = True
|
RAN.prematureExit = True
|
||||||
@@ -171,9 +173,11 @@ class PhySim:
|
|||||||
else:
|
else:
|
||||||
logging.debug('\u001B[1m Podman Login to OC Cluster Registry Successfully\u001B[0m')
|
logging.debug('\u001B[1m Podman Login to OC Cluster Registry Successfully\u001B[0m')
|
||||||
time.sleep(2)
|
time.sleep(2)
|
||||||
mySSH.command('oc create -f openshift/oai-physim-image-stream.yml', '\$', 30)
|
mySSH.command('oc create -f openshift/oai-physim-image-stream.yml || true', '\$', 30)
|
||||||
if mySSH.getBefore().count('(AlreadyExists):') == 0 and mySSH.getBefore().count('created') == 0:
|
if mySSH.getBefore().count('(AlreadyExists):') == 0 and mySSH.getBefore().count('created') == 0:
|
||||||
logging.error(f'\u001B[1m Image Stream "oai-physim" Creation Failed on OC Cluster {ocProjectName}\u001B[0m')
|
logging.error(f'\u001B[1m Image Stream "oai-physim" Creation Failed on OC Cluster {ocProjectName}\u001B[0m')
|
||||||
|
mySSH.command('sudo podman logout https://default-route-openshift-image-registry.apps.oai.cs.eurecom.fr/', '\$', 6)
|
||||||
|
mySSH.command('oc logout', '\$', 30)
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
HTML.CreateHtmlTestRow('N/A', 'KO', CONST.OC_IS_FAIL)
|
HTML.CreateHtmlTestRow('N/A', 'KO', CONST.OC_IS_FAIL)
|
||||||
RAN.prematureExit = True
|
RAN.prematureExit = True
|
||||||
@@ -181,11 +185,13 @@ class PhySim:
|
|||||||
else:
|
else:
|
||||||
logging.debug(f'\u001B[1m Image Stream "oai-physim" created on OC project {ocProjectName}\u001B[0m')
|
logging.debug(f'\u001B[1m Image Stream "oai-physim" created on OC project {ocProjectName}\u001B[0m')
|
||||||
time.sleep(2)
|
time.sleep(2)
|
||||||
mySSH.command(f'sudo podman tag oai-physim:{imageTag} default-route-openshift-image-registry.apps.5glab.nsa.eurecom.fr/{self.OCProjectName}/oai-physim:{imageTag}', '\$', 30)
|
mySSH.command(f'sudo podman tag oai-physim:{imageTag} default-route-openshift-image-registry.apps.oai.cs.eurecom.fr/{self.OCProjectName}/oai-physim:{imageTag}', '\$', 30)
|
||||||
time.sleep(2)
|
time.sleep(2)
|
||||||
mySSH.command(f'sudo podman push default-route-openshift-image-registry.apps.5glab.nsa.eurecom.fr/{self.OCProjectName}/oai-physim:{imageTag} --tls-verify=false', '\$', 180)
|
mySSH.command(f'sudo podman push default-route-openshift-image-registry.apps.oai.cs.eurecom.fr/{self.OCProjectName}/oai-physim:{imageTag} --tls-verify=false', '\$', 180)
|
||||||
if mySSH.getBefore().count('Storing signatures') == 0:
|
if mySSH.getBefore().count('Storing signatures') == 0:
|
||||||
logging.error('\u001B[1m Image "oai-physim" push to OC Cluster Registry Failed\u001B[0m')
|
logging.error('\u001B[1m Image "oai-physim" push to OC Cluster Registry Failed\u001B[0m')
|
||||||
|
mySSH.command('sudo podman logout https://default-route-openshift-image-registry.apps.oai.cs.eurecom.fr/', '\$', 6)
|
||||||
|
mySSH.command('oc logout', '\$', 30)
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
HTML.CreateHtmlTestRow('N/A', 'KO', CONST.OC_IS_FAIL)
|
HTML.CreateHtmlTestRow('N/A', 'KO', CONST.OC_IS_FAIL)
|
||||||
RAN.prematureExit = True
|
RAN.prematureExit = True
|
||||||
@@ -195,8 +201,9 @@ class PhySim:
|
|||||||
|
|
||||||
# Using helm charts deployment
|
# Using helm charts deployment
|
||||||
time.sleep(5)
|
time.sleep(5)
|
||||||
|
mySSH.command(f'grep -rl OAICICD_PROJECT ./charts/ | xargs sed -i -e "s#OAICICD_PROJECT#{ocProjectName}#"', '\$', 30)
|
||||||
mySSH.command(f'sed -i -e "s#TAG#{imageTag}#g" ./charts/physims/values.yaml', '\$', 6)
|
mySSH.command(f'sed -i -e "s#TAG#{imageTag}#g" ./charts/physims/values.yaml', '\$', 6)
|
||||||
mySSH.command('helm install physim ./charts/physims/ | tee -a cmake_targets/log/physim_helm_summary.txt 2>&1', '\$', 30)
|
mySSH.command('helm install physim ./charts/physims/ 2>&1 | tee -a cmake_targets/log/physim_helm_summary.txt', '\$', 30)
|
||||||
if mySSH.getBefore().count('STATUS: deployed') == 0:
|
if mySSH.getBefore().count('STATUS: deployed') == 0:
|
||||||
logging.error('\u001B[1m Deploying PhySim Failed using helm chart on OC Cluster\u001B[0m')
|
logging.error('\u001B[1m Deploying PhySim Failed using helm chart on OC Cluster\u001B[0m')
|
||||||
mySSH.command('helm uninstall physim >> cmake_targets/log/physim_helm_summary.txt 2>&1', '\$', 30)
|
mySSH.command('helm uninstall physim >> cmake_targets/log/physim_helm_summary.txt 2>&1', '\$', 30)
|
||||||
@@ -206,8 +213,10 @@ class PhySim:
|
|||||||
mySSH.command('oc get pods -l app.kubernetes.io/instance=physim', '\$', 6, resync=True)
|
mySSH.command('oc get pods -l app.kubernetes.io/instance=physim', '\$', 6, resync=True)
|
||||||
if re.search('No resources found', mySSH.getBefore()):
|
if re.search('No resources found', mySSH.getBefore()):
|
||||||
isFinished1 = True
|
isFinished1 = True
|
||||||
mySSH.command(f'sudo podman rmi default-route-openshift-image-registry.apps.5glab.nsa.eurecom.fr/{self.OCProjectName}/oai-physim:{imageTag}', '\$', 30)
|
mySSH.command(f'sudo podman rmi default-route-openshift-image-registry.apps.oai.cs.eurecom.fr/{self.OCProjectName}/oai-physim:{imageTag}', '\$', 30)
|
||||||
mySSH.command('oc delete is oai-physim', '\$', 30)
|
mySSH.command('oc delete is oai-physim', '\$', 30)
|
||||||
|
mySSH.command('sudo podman logout https://default-route-openshift-image-registry.apps.oai.cs.eurecom.fr/', '\$', 6)
|
||||||
|
mySSH.command('oc logout', '\$', 30)
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
self.AnalyzeLogFile_phySim(HTML)
|
self.AnalyzeLogFile_phySim(HTML)
|
||||||
RAN.prematureExit = True
|
RAN.prematureExit = True
|
||||||
@@ -227,7 +236,7 @@ class PhySim:
|
|||||||
if isRunning == False:
|
if isRunning == False:
|
||||||
logging.error('\u001B[1m Some PODS Running FAILED \u001B[0m')
|
logging.error('\u001B[1m Some PODS Running FAILED \u001B[0m')
|
||||||
mySSH.command('oc get pods -l app.kubernetes.io/instance=physim 2>&1 | tee -a cmake_targets/log/physim_pods_summary.txt', '\$', 6)
|
mySSH.command('oc get pods -l app.kubernetes.io/instance=physim 2>&1 | tee -a cmake_targets/log/physim_pods_summary.txt', '\$', 6)
|
||||||
mySSH.command('helm uninstall physim >> cmake_targets/log/physim_helm_summary.txt 2>&1', '\$', 6)
|
mySSH.command('helm uninstall physim 2>&1 >> cmake_targets/log/physim_helm_summary.txt', '\$', 6)
|
||||||
self.AnalyzeLogFile_phySim(HTML)
|
self.AnalyzeLogFile_phySim(HTML)
|
||||||
isFinished1 = False
|
isFinished1 = False
|
||||||
while(isFinished1 == False):
|
while(isFinished1 == False):
|
||||||
@@ -235,8 +244,10 @@ class PhySim:
|
|||||||
mySSH.command('oc get pods -l app.kubernetes.io/instance=physim', '\$', 6, resync=True)
|
mySSH.command('oc get pods -l app.kubernetes.io/instance=physim', '\$', 6, resync=True)
|
||||||
if re.search('No resources found', mySSH.getBefore()):
|
if re.search('No resources found', mySSH.getBefore()):
|
||||||
isFinished1 = True
|
isFinished1 = True
|
||||||
mySSH.command(f'sudo podman rmi default-route-openshift-image-registry.apps.5glab.nsa.eurecom.fr/{self.OCProjectName}/oai-physim:{imageTag}', '\$', 6)
|
mySSH.command(f'sudo podman rmi default-route-openshift-image-registry.apps.oai.cs.eurecom.fr/{self.OCProjectName}/oai-physim:{imageTag}', '\$', 6)
|
||||||
mySSH.command('oc delete is oai-physim', '\$', 6)
|
mySSH.command('oc delete is oai-physim', '\$', 6)
|
||||||
|
mySSH.command('sudo podman logout https://default-route-openshift-image-registry.apps.oai.cs.eurecom.fr/', '\$', 6)
|
||||||
|
mySSH.command('oc logout', '\$', 30)
|
||||||
HTML.CreateHtmlTestRow('N/A', 'KO', CONST.OC_PHYSIM_DEPLOY_FAIL)
|
HTML.CreateHtmlTestRow('N/A', 'KO', CONST.OC_PHYSIM_DEPLOY_FAIL)
|
||||||
HTML.CreateHtmlTestRowPhySimTestResult(self.testSummary,self.testResult)
|
HTML.CreateHtmlTestRowPhySimTestResult(self.testSummary,self.testResult)
|
||||||
RAN.prematureExit = True
|
RAN.prematureExit = True
|
||||||
@@ -293,9 +304,10 @@ class PhySim:
|
|||||||
isFinished1 = True
|
isFinished1 = True
|
||||||
if isFinished1 == True:
|
if isFinished1 == True:
|
||||||
logging.debug('\u001B[1m UnDeployed PhySim Successfully on OC Cluster\u001B[0m')
|
logging.debug('\u001B[1m UnDeployed PhySim Successfully on OC Cluster\u001B[0m')
|
||||||
mySSH.command(f'sudo podman rmi default-route-openshift-image-registry.apps.5glab.nsa.eurecom.fr/{self.OCProjectName}/oai-physim:{imageTag}', '\$', 6)
|
mySSH.command(f'sudo podman rmi default-route-openshift-image-registry.apps.oai.cs.eurecom.fr/{self.OCProjectName}/oai-physim:{imageTag}', '\$', 6)
|
||||||
mySSH.command('oc delete is oai-physim', '\$', 6)
|
mySSH.command('oc delete is oai-physim', '\$', 6)
|
||||||
logging.debug('\u001B[1m Deleted the Image and ImageStream\u001B[0m')
|
logging.debug('\u001B[1m Deleted the Image and ImageStream\u001B[0m')
|
||||||
|
mySSH.command('sudo podman logout https://default-route-openshift-image-registry.apps.oai.cs.eurecom.fr/', '\$', 6)
|
||||||
mySSH.command('oc logout', '\$', 6)
|
mySSH.command('oc logout', '\$', 6)
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
self.AnalyzeLogFile_phySim(HTML)
|
self.AnalyzeLogFile_phySim(HTML)
|
||||||
|
|||||||
@@ -237,7 +237,7 @@ RUs = (
|
|||||||
max_pdschReferenceSignalPower = -27;
|
max_pdschReferenceSignalPower = -27;
|
||||||
max_rxgain = 75;
|
max_rxgain = 75;
|
||||||
eNB_instances = [0];
|
eNB_instances = [0];
|
||||||
sdr_addrs = "mgmt_addr=192.168.18.241,addr=192.168.20.2,second_addr=192.168.10.2";
|
sdr_addrs = "mgmt_addr=172.21.19.13,addr=192.168.20.2,second_addr=192.168.10.2";
|
||||||
|
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -237,7 +237,7 @@ RUs = (
|
|||||||
max_pdschReferenceSignalPower = -27;
|
max_pdschReferenceSignalPower = -27;
|
||||||
max_rxgain = 75;
|
max_rxgain = 75;
|
||||||
eNB_instances = [0];
|
eNB_instances = [0];
|
||||||
sdr_addrs = "mgmt_addr=192.168.18.241,addr=192.168.20.2,second_addr=192.168.10.2";
|
sdr_addrs = "mgmt_addr=172.21.19.13,addr=192.168.20.2,second_addr=192.168.10.2";
|
||||||
|
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -237,7 +237,7 @@ RUs = (
|
|||||||
max_pdschReferenceSignalPower = -27;
|
max_pdschReferenceSignalPower = -27;
|
||||||
max_rxgain = 75;
|
max_rxgain = 75;
|
||||||
eNB_instances = [0];
|
eNB_instances = [0];
|
||||||
sdr_addrs = "mgmt_addr=192.168.18.241,addr=192.168.20.2,second_addr=192.168.10.2";
|
sdr_addrs = "mgmt_addr=172.21.19.13,addr=192.168.20.2,second_addr=192.168.10.2";
|
||||||
|
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -239,7 +239,7 @@ RUs = (
|
|||||||
#beamforming 1x4 matrix:
|
#beamforming 1x4 matrix:
|
||||||
bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000];
|
bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000];
|
||||||
#clock_src = "external";
|
#clock_src = "external";
|
||||||
sdr_addrs = "mgmt_addr=192.168.18.240,addr=192.168.10.2,second_addr=192.168.20.2,clock_source=internal,time_source=internal"
|
sdr_addrs = "mgmt_addr=172.21.19.14,addr=192.168.10.2,second_addr=192.168.20.2,clock_source=internal,time_source=internal"
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -240,7 +240,7 @@ RUs = (
|
|||||||
#beamforming 1x4 matrix:
|
#beamforming 1x4 matrix:
|
||||||
bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000];
|
bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000];
|
||||||
#clock_src = "external";
|
#clock_src = "external";
|
||||||
sdr_addrs = "mgmt_addr=192.168.18.240,addr=192.168.10.2,second_addr=192.168.20.2,clock_source=internal,time_source=internal"
|
sdr_addrs = "mgmt_addr=172.21.19.14,addr=192.168.10.2,second_addr=192.168.20.2,clock_source=internal,time_source=internal"
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -209,9 +209,9 @@ gNBs =
|
|||||||
{
|
{
|
||||||
|
|
||||||
GNB_INTERFACE_NAME_FOR_NG_AMF = "em1";
|
GNB_INTERFACE_NAME_FOR_NG_AMF = "em1";
|
||||||
GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.18.194/24";
|
GNB_IPV4_ADDRESS_FOR_NG_AMF = "172.21.16.127/24";
|
||||||
GNB_INTERFACE_NAME_FOR_NGU = "em1";
|
GNB_INTERFACE_NAME_FOR_NGU = "em1";
|
||||||
GNB_IPV4_ADDRESS_FOR_NGU = "192.168.18.194/24";
|
GNB_IPV4_ADDRESS_FOR_NGU = "172.21.16.127/24";
|
||||||
GNB_PORT_FOR_S1U = 2152; # Spec 2152
|
GNB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -258,7 +258,7 @@ RUs = (
|
|||||||
## beamforming 4x4 matrix:
|
## beamforming 4x4 matrix:
|
||||||
#bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000, 0x00000000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff];
|
#bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000, 0x00000000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff];
|
||||||
|
|
||||||
sdr_addrs = "mgmt_addr=192.168.18.252,addr=192.168.10.2,second_addr=192.168.20.2,clock_source=internal,time_source=internal"
|
sdr_addrs = "mgmt_addr=172.21.19.14,addr=192.168.10.2,second_addr=192.168.20.2,clock_source=internal,time_source=internal"
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -206,9 +206,9 @@ gNBs =
|
|||||||
{
|
{
|
||||||
|
|
||||||
GNB_INTERFACE_NAME_FOR_NG_AMF = "em1";
|
GNB_INTERFACE_NAME_FOR_NG_AMF = "em1";
|
||||||
GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.18.194/24";
|
GNB_IPV4_ADDRESS_FOR_NG_AMF = "172.21.16.127/24";
|
||||||
GNB_INTERFACE_NAME_FOR_NGU = "em1";
|
GNB_INTERFACE_NAME_FOR_NGU = "em1";
|
||||||
GNB_IPV4_ADDRESS_FOR_NGU = "192.168.18.194/24";
|
GNB_IPV4_ADDRESS_FOR_NGU = "172.21.16.127/24";
|
||||||
GNB_PORT_FOR_S1U = 2152; # Spec 2152
|
GNB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -254,7 +254,7 @@ RUs = (
|
|||||||
## beamforming 4x4 matrix:
|
## beamforming 4x4 matrix:
|
||||||
#bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000, 0x00000000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff];
|
#bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000, 0x00000000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff];
|
||||||
|
|
||||||
sdr_addrs = "mgmt_addr=192.168.18.252,addr=192.168.10.2,second_addr=192.168.20.2,clock_source=internal,time_source=internal"
|
sdr_addrs = "mgmt_addr=172.21.19.14,addr=192.168.10.2,second_addr=192.168.20.2,clock_source=internal,time_source=internal"
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -225,6 +225,7 @@ RUs = (
|
|||||||
att_tx = 0;
|
att_tx = 0;
|
||||||
att_rx = 0;
|
att_rx = 0;
|
||||||
bands = [7];
|
bands = [7];
|
||||||
|
sl_ahead = 12;
|
||||||
max_pdschReferenceSignalPower = -27;
|
max_pdschReferenceSignalPower = -27;
|
||||||
max_rxgain = 75;
|
max_rxgain = 75;
|
||||||
eNB_instances = [0];
|
eNB_instances = [0];
|
||||||
|
|||||||
@@ -199,12 +199,12 @@ gNBs =
|
|||||||
);
|
);
|
||||||
|
|
||||||
MACRLCs = (
|
MACRLCs = (
|
||||||
{
|
{
|
||||||
num_cc = 1;
|
num_cc = 1;
|
||||||
tr_s_preference = "local_L1";
|
tr_s_preference = "local_L1";
|
||||||
tr_n_preference = "local_RRC";
|
tr_n_preference = "local_RRC";
|
||||||
ulsch_max_frame_inactivity = 1;
|
ulsch_max_frame_inactivity = 0;
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
L1s = (
|
L1s = (
|
||||||
@@ -213,6 +213,7 @@ L1s = (
|
|||||||
tr_n_preference = "local_mac";
|
tr_n_preference = "local_mac";
|
||||||
thread_pool_size = 8;
|
thread_pool_size = 8;
|
||||||
prach_dtx_threshold = 120;
|
prach_dtx_threshold = 120;
|
||||||
|
pucch0_dtx_threshold = 80;
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -230,7 +231,7 @@ RUs = (
|
|||||||
bf_weights = [0x00007fff, 0x00007fff];
|
bf_weights = [0x00007fff, 0x00007fff];
|
||||||
#clock_src = "external";
|
#clock_src = "external";
|
||||||
sf_extension = 0
|
sf_extension = 0
|
||||||
sdr_addrs = "mgmt_addr=192.168.18.252,addr=192.168.10.2,second_addr=192.168.20.2,clock_source=internal,time_source=internal"
|
sdr_addrs = "mgmt_addr=172.21.19.14,addr=192.168.10.2,second_addr=192.168.20.2,clock_source=internal,time_source=internal"
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -264,7 +264,7 @@ RUs = (
|
|||||||
## beamforming 4x4 matrix:
|
## beamforming 4x4 matrix:
|
||||||
#bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000, 0x00000000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff];
|
#bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000, 0x00000000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff];
|
||||||
sf_extension = 0
|
sf_extension = 0
|
||||||
sdr_addrs = "mgmt_addr=192.168.18.252,addr=192.168.10.2,second_addr=192.168.20.2,clock_source=internal,time_source=internal"
|
sdr_addrs = "mgmt_addr=172.21.19.14,addr=192.168.10.2,second_addr=192.168.20.2,clock_source=internal,time_source=internal"
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -261,7 +261,7 @@ RUs = (
|
|||||||
## beamforming 4x4 matrix:
|
## beamforming 4x4 matrix:
|
||||||
#bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000, 0x00000000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff];
|
#bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000, 0x00000000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff];
|
||||||
sf_extension = 0
|
sf_extension = 0
|
||||||
sdr_addrs = "mgmt_addr=192.168.18.252,addr=192.168.10.2,second_addr=192.168.20.2,clock_source=internal,time_source=internal"
|
sdr_addrs = "mgmt_addr=172.21.19.14,addr=192.168.10.2,second_addr=192.168.20.2,clock_source=internal,time_source=internal"
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,304 @@
|
|||||||
|
Active_gNBs = ( "gNB-OAI");
|
||||||
|
# Asn1_verbosity, choice in: none, info, annoying
|
||||||
|
Asn1_verbosity = "none";
|
||||||
|
|
||||||
|
gNBs =
|
||||||
|
(
|
||||||
|
{
|
||||||
|
////////// Identification parameters:
|
||||||
|
gNB_CU_ID = 0xe00;
|
||||||
|
|
||||||
|
# cell_type = "CELL_MACRO_GNB";
|
||||||
|
|
||||||
|
gNB_name = "gNB-OAI";
|
||||||
|
|
||||||
|
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||||
|
tracking_area_code = 1;
|
||||||
|
|
||||||
|
plmn_list = ({
|
||||||
|
mcc = 208;
|
||||||
|
mnc = 97;
|
||||||
|
mnc_length = 2;
|
||||||
|
snssaiList = (
|
||||||
|
{
|
||||||
|
sst = 1;
|
||||||
|
sd = 0x010203; // 0 false, else true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
sst = 1;
|
||||||
|
sd = 0x112233; // 0 false, else true
|
||||||
|
}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
nr_cellid = 12345678L
|
||||||
|
|
||||||
|
# tr_s_preference = "local_mac"
|
||||||
|
|
||||||
|
////////// Physical parameters:
|
||||||
|
|
||||||
|
ssb_SubcarrierOffset = 0;
|
||||||
|
pusch_AntennaPorts = 2;
|
||||||
|
ul_prbblacklist = "51,52,53,54"
|
||||||
|
do_SRS = 1;
|
||||||
|
|
||||||
|
pdcch_ConfigSIB1 = (
|
||||||
|
{
|
||||||
|
controlResourceSetZero = 11;
|
||||||
|
searchSpaceZero = 0;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
servingCellConfigCommon = (
|
||||||
|
{
|
||||||
|
#spCellConfigCommon
|
||||||
|
|
||||||
|
physCellId = 0;
|
||||||
|
|
||||||
|
# downlinkConfigCommon
|
||||||
|
#frequencyInfoDL
|
||||||
|
# this is 3301.68 MHz + 22*12*30e-3 MHz = 3309.6
|
||||||
|
#absoluteFrequencySSB = 620640;
|
||||||
|
# this is 3300.60 MHz + 53*12*30e-3 MHz = 3319.68
|
||||||
|
absoluteFrequencySSB = 621312;
|
||||||
|
# this is 3503.28 MHz + 22*12*30e-3 MHz = 3511.2
|
||||||
|
#absoluteFrequencySSB = 634080;
|
||||||
|
# this is 3600.48 MHz
|
||||||
|
#absoluteFrequencySSB = 640032;
|
||||||
|
#dl_frequencyBand = 78;
|
||||||
|
# this is 3301.68 MHz
|
||||||
|
#dl_absoluteFrequencyPointA = 620112;
|
||||||
|
# this is 3300.60 MHz
|
||||||
|
dl_absoluteFrequencyPointA = 620040;
|
||||||
|
# this is 3502.56 MHz
|
||||||
|
#dl_absoluteFrequencyPointA = 633552;
|
||||||
|
# this is 3600.48 MHz
|
||||||
|
#dl_absoluteFrequencyPointA = 640032;
|
||||||
|
#scs-SpecificCarrierList
|
||||||
|
dl_offstToCarrier = 0;
|
||||||
|
# subcarrierSpacing
|
||||||
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
|
dl_subcarrierSpacing = 1;
|
||||||
|
dl_carrierBandwidth = 106;
|
||||||
|
#initialDownlinkBWP
|
||||||
|
#genericParameters
|
||||||
|
# this is RBstart=0,L=106 (275*(L-1))+RBstart
|
||||||
|
initialDLBWPlocationAndBandwidth = 28875;
|
||||||
|
# subcarrierSpacing
|
||||||
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
|
initialDLBWPsubcarrierSpacing = 1;
|
||||||
|
#pdcch-ConfigCommon
|
||||||
|
initialDLBWPcontrolResourceSetZero = 11;
|
||||||
|
initialDLBWPsearchSpaceZero = 0;
|
||||||
|
|
||||||
|
#uplinkConfigCommon
|
||||||
|
#frequencyInfoUL
|
||||||
|
ul_frequencyBand = 78;
|
||||||
|
#scs-SpecificCarrierList
|
||||||
|
ul_offstToCarrier = 0;
|
||||||
|
# subcarrierSpacing
|
||||||
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
|
ul_subcarrierSpacing = 1;
|
||||||
|
ul_carrierBandwidth = 106;
|
||||||
|
pMax = 20;
|
||||||
|
#initialUplinkBWP
|
||||||
|
#genericParameters
|
||||||
|
initialULBWPlocationAndBandwidth = 28875;
|
||||||
|
# subcarrierSpacing
|
||||||
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
|
initialULBWPsubcarrierSpacing = 1;
|
||||||
|
#rach-ConfigCommon
|
||||||
|
#rach-ConfigGeneric
|
||||||
|
prach_ConfigurationIndex = 98;
|
||||||
|
#prach_msg1_FDM
|
||||||
|
#0 = one, 1=two, 2=four, 3=eight
|
||||||
|
prach_msg1_FDM = 0;
|
||||||
|
prach_msg1_FrequencyStart = 0;
|
||||||
|
zeroCorrelationZoneConfig = 12;
|
||||||
|
preambleReceivedTargetPower = -104;
|
||||||
|
#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
|
||||||
|
preambleTransMax = 6;
|
||||||
|
#powerRampingStep
|
||||||
|
# 0=dB0,1=dB2,2=dB4,3=dB6
|
||||||
|
powerRampingStep = 1;
|
||||||
|
#ra_ReponseWindow
|
||||||
|
#1,2,4,8,10,20,40,80
|
||||||
|
ra_ResponseWindow = 4;
|
||||||
|
#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
|
||||||
|
#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
|
||||||
|
ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 3;
|
||||||
|
#oneHalf (0..15) 4,8,12,16,...60,64
|
||||||
|
ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 15;
|
||||||
|
#ra_ContentionResolutionTimer
|
||||||
|
#(0..7) 8,16,24,32,40,48,56,64
|
||||||
|
ra_ContentionResolutionTimer = 7;
|
||||||
|
rsrp_ThresholdSSB = 19;
|
||||||
|
#prach-RootSequenceIndex_PR
|
||||||
|
#1 = 839, 2 = 139
|
||||||
|
prach_RootSequenceIndex_PR = 2;
|
||||||
|
prach_RootSequenceIndex = 1;
|
||||||
|
# SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
|
||||||
|
#
|
||||||
|
msg1_SubcarrierSpacing = 1,
|
||||||
|
# restrictedSetConfig
|
||||||
|
# 0=unrestricted, 1=restricted type A, 2=restricted type B
|
||||||
|
restrictedSetConfig = 0,
|
||||||
|
|
||||||
|
msg3_DeltaPreamble = 1;
|
||||||
|
p0_NominalWithGrant =-90;
|
||||||
|
|
||||||
|
# pucch-ConfigCommon setup :
|
||||||
|
# pucchGroupHopping
|
||||||
|
# 0 = neither, 1= group hopping, 2=sequence hopping
|
||||||
|
pucchGroupHopping = 0;
|
||||||
|
hoppingId = 40;
|
||||||
|
p0_nominal = -90;
|
||||||
|
# ssb_PositionsInBurs_BitmapPR
|
||||||
|
# 1=short, 2=medium, 3=long
|
||||||
|
ssb_PositionsInBurst_PR = 2;
|
||||||
|
ssb_PositionsInBurst_Bitmap = 1;
|
||||||
|
|
||||||
|
# ssb_periodicityServingCell
|
||||||
|
# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
|
||||||
|
ssb_periodicityServingCell = 2;
|
||||||
|
|
||||||
|
# dmrs_TypeA_position
|
||||||
|
# 0 = pos2, 1 = pos3
|
||||||
|
dmrs_TypeA_Position = 0;
|
||||||
|
|
||||||
|
# subcarrierSpacing
|
||||||
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
|
subcarrierSpacing = 1;
|
||||||
|
|
||||||
|
|
||||||
|
#tdd-UL-DL-ConfigurationCommon
|
||||||
|
# subcarrierSpacing
|
||||||
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
|
referenceSubcarrierSpacing = 1;
|
||||||
|
# pattern1
|
||||||
|
# dl_UL_TransmissionPeriodicity
|
||||||
|
# 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
|
||||||
|
dl_UL_TransmissionPeriodicity = 5;
|
||||||
|
nrofDownlinkSlots = 2;
|
||||||
|
nrofDownlinkSymbols = 6;
|
||||||
|
nrofUplinkSlots = 2;
|
||||||
|
nrofUplinkSymbols = 4;
|
||||||
|
|
||||||
|
ssPBCH_BlockPower = -25;
|
||||||
|
}
|
||||||
|
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
# ------- SCTP definitions
|
||||||
|
SCTP :
|
||||||
|
{
|
||||||
|
# Number of streams to use in input/output
|
||||||
|
SCTP_INSTREAMS = 2;
|
||||||
|
SCTP_OUTSTREAMS = 2;
|
||||||
|
};
|
||||||
|
|
||||||
|
////////// AMF parameters:
|
||||||
|
amf_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
||||||
|
ipv6 = "192:168:30::17";
|
||||||
|
active = "yes";
|
||||||
|
preference = "ipv4";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
NETWORK_INTERFACES :
|
||||||
|
{
|
||||||
|
|
||||||
|
GNB_INTERFACE_NAME_FOR_NG_AMF = "em1";
|
||||||
|
GNB_IPV4_ADDRESS_FOR_NG_AMF = "CI_GNB_IP_ADDR";
|
||||||
|
GNB_INTERFACE_NAME_FOR_NGU = "em1";
|
||||||
|
GNB_IPV4_ADDRESS_FOR_NGU = "CI_GNB_IP_ADDR";
|
||||||
|
GNB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
MACRLCs = (
|
||||||
|
{
|
||||||
|
num_cc = 1;
|
||||||
|
tr_s_preference = "local_L1";
|
||||||
|
tr_n_preference = "local_RRC";
|
||||||
|
# pusch_TargetSNRx10 = 200;
|
||||||
|
# pucch_TargetSNRx10 = 150;
|
||||||
|
ulsch_max_frame_inactivity = 0;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
L1s = (
|
||||||
|
{
|
||||||
|
num_cc = 1;
|
||||||
|
tr_n_preference = "local_mac";
|
||||||
|
thread_pool_size = 8;
|
||||||
|
prach_dtx_threshold = 120;
|
||||||
|
# pucch0_dtx_threshold = 150;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
RUs = (
|
||||||
|
{
|
||||||
|
local_rf = "yes"
|
||||||
|
nb_tx = 2
|
||||||
|
nb_rx = 2
|
||||||
|
att_tx = 0
|
||||||
|
att_rx = 0;
|
||||||
|
bands = [78];
|
||||||
|
max_pdschReferenceSignalPower = -27;
|
||||||
|
max_rxgain = 75;
|
||||||
|
eNB_instances = [0];
|
||||||
|
##beamforming 1x2 matrix: 1 layer x 2 antennas
|
||||||
|
bf_weights = [0x00007fff, 0x0000];
|
||||||
|
##beamforming 1x4 matrix: 1 layer x 4 antennas
|
||||||
|
#bf_weights = [0x00007fff, 0x0000,0x0000, 0x0000];
|
||||||
|
## beamforming 2x2 matrix:
|
||||||
|
# bf_weights = [0x00007fff, 0x00000000, 0x00000000, 0x00007fff];
|
||||||
|
## beamforming 4x4 matrix:
|
||||||
|
#bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000, 0x00000000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff];
|
||||||
|
sf_extension = 0
|
||||||
|
sdr_addrs = "mgmt_addr=172.21.19.14,addr=192.168.10.2,second_addr=192.168.20.2,clock_source=internal,time_source=internal"
|
||||||
|
sl_ahead = 5;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
THREAD_STRUCT = (
|
||||||
|
{
|
||||||
|
#three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
|
||||||
|
parallel_config = "PARALLEL_SINGLE_THREAD";
|
||||||
|
#two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
|
||||||
|
worker_config = "WORKER_ENABLE";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
security = {
|
||||||
|
# preferred ciphering algorithms
|
||||||
|
# the first one of the list that an UE supports in chosen
|
||||||
|
# valid values: nea0, nea1, nea2, nea3
|
||||||
|
ciphering_algorithms = ( "nea0" );
|
||||||
|
|
||||||
|
# preferred integrity algorithms
|
||||||
|
# the first one of the list that an UE supports in chosen
|
||||||
|
# valid values: nia0, nia1, nia2, nia3
|
||||||
|
integrity_algorithms = ( "nia2", "nia0" );
|
||||||
|
|
||||||
|
# setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter
|
||||||
|
# what 'ciphering_algorithms' configures; same thing for 'drb_integrity'
|
||||||
|
drb_ciphering = "yes";
|
||||||
|
drb_integrity = "no";
|
||||||
|
};
|
||||||
|
|
||||||
|
log_config :
|
||||||
|
{
|
||||||
|
global_log_level ="info";
|
||||||
|
hw_log_level ="info";
|
||||||
|
phy_log_level ="info";
|
||||||
|
mac_log_level ="info";
|
||||||
|
rlc_log_level ="info";
|
||||||
|
pdcp_log_level ="info";
|
||||||
|
rrc_log_level ="info";
|
||||||
|
f1ap_log_level ="debug";
|
||||||
|
};
|
||||||
@@ -263,7 +263,7 @@ RUs = (
|
|||||||
## beamforming 4x4 matrix:
|
## beamforming 4x4 matrix:
|
||||||
#bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000, 0x00000000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff];
|
#bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000, 0x00000000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff];
|
||||||
sf_extension = 0
|
sf_extension = 0
|
||||||
sdr_addrs = "mgmt_addr=192.168.18.252,addr=192.168.10.2,second_addr=192.168.20.2,clock_source=internal,time_source=internal"
|
sdr_addrs = "mgmt_addr=172.21.19.14,addr=192.168.10.2,second_addr=192.168.20.2,clock_source=internal,time_source=internal"
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -262,7 +262,7 @@ RUs = (
|
|||||||
## beamforming 4x4 matrix:
|
## beamforming 4x4 matrix:
|
||||||
#bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000, 0x00000000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff];
|
#bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000, 0x00000000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff];
|
||||||
sf_extension = 0
|
sf_extension = 0
|
||||||
sdr_addrs = "mgmt_addr=192.168.18.252,addr=192.168.10.2,second_addr=192.168.20.2,clock_source=internal,time_source=internal"
|
sdr_addrs = "mgmt_addr=172.21.19.14,addr=192.168.10.2,second_addr=192.168.20.2,clock_source=internal,time_source=internal"
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -203,7 +203,7 @@ MACRLCs = (
|
|||||||
tr_n_preference = "local_RRC";
|
tr_n_preference = "local_RRC";
|
||||||
pusch_TargetSNRx10 = 200;
|
pusch_TargetSNRx10 = 200;
|
||||||
pucch_TargetSNRx10 = 200;
|
pucch_TargetSNRx10 = 200;
|
||||||
ulsch_max_frame_inactivity = 1;
|
ulsch_max_frame_inactivity = 0;
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -221,11 +221,11 @@ RUs = (
|
|||||||
local_rf = "yes"
|
local_rf = "yes"
|
||||||
nb_tx = 1
|
nb_tx = 1
|
||||||
nb_rx = 1
|
nb_rx = 1
|
||||||
att_tx = 3
|
att_tx = 12
|
||||||
att_rx = 0;
|
att_rx = 12;
|
||||||
bands = [7];
|
bands = [7];
|
||||||
max_pdschReferenceSignalPower = -27;
|
max_pdschReferenceSignalPower = -27;
|
||||||
max_rxgain = 111;
|
max_rxgain = 114;
|
||||||
eNB_instances = [0];
|
eNB_instances = [0];
|
||||||
# sdr_addrs = "serial=30C51D4";
|
# sdr_addrs = "serial=30C51D4";
|
||||||
# clock_src = "external";
|
# clock_src = "external";
|
||||||
|
|||||||
@@ -63,8 +63,8 @@ gNBs =
|
|||||||
dl_carrierBandwidth = 106;
|
dl_carrierBandwidth = 106;
|
||||||
#initialDownlinkBWP
|
#initialDownlinkBWP
|
||||||
#genericParameters
|
#genericParameters
|
||||||
# this is RBstart=27,L=48 (275*(L-1))+RBstart
|
# this is RBstart=0,L=106 (275*(L-1))+RBstart
|
||||||
initialDLBWPlocationAndBandwidth = 13475; # 6366 12925 12956 28875 12952
|
initialDLBWPlocationAndBandwidth = 28875;
|
||||||
# subcarrierSpacing
|
# subcarrierSpacing
|
||||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
initialDLBWPsubcarrierSpacing = 1;
|
initialDLBWPsubcarrierSpacing = 1;
|
||||||
@@ -85,7 +85,7 @@ gNBs =
|
|||||||
pMax = 20;
|
pMax = 20;
|
||||||
#initialUplinkBWP
|
#initialUplinkBWP
|
||||||
#genericParameters
|
#genericParameters
|
||||||
initialULBWPlocationAndBandwidth = 13475;
|
initialULBWPlocationAndBandwidth = 28875;
|
||||||
# subcarrierSpacing
|
# subcarrierSpacing
|
||||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
initialULBWPsubcarrierSpacing = 1;
|
initialULBWPsubcarrierSpacing = 1;
|
||||||
|
|||||||
@@ -0,0 +1,116 @@
|
|||||||
|
"""
|
||||||
|
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
|
||||||
|
"""
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
import re
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
|
|
||||||
|
def main() -> None:
|
||||||
|
args = _parse_args()
|
||||||
|
status = perform_flattening(args.tag)
|
||||||
|
sys.exit(status)
|
||||||
|
|
||||||
|
def _parse_args() -> argparse.Namespace:
|
||||||
|
parser = argparse.ArgumentParser(description='Flattening Image')
|
||||||
|
|
||||||
|
parser.add_argument(
|
||||||
|
'--tag', '-t',
|
||||||
|
action='store',
|
||||||
|
required=True,
|
||||||
|
help='Image Tag in image-name:image tag format',
|
||||||
|
)
|
||||||
|
return parser.parse_args()
|
||||||
|
|
||||||
|
def perform_flattening(tag):
|
||||||
|
# First detect which docker/podman command to use
|
||||||
|
cli = ''
|
||||||
|
image_prefix = ''
|
||||||
|
cmd = 'which podman || true'
|
||||||
|
podman_check = subprocess.check_output(cmd, shell=True, universal_newlines=True)
|
||||||
|
if re.search('podman', podman_check.strip()):
|
||||||
|
cli = 'sudo podman'
|
||||||
|
image_prefix = 'localhost/'
|
||||||
|
if cli == '':
|
||||||
|
cmd = 'which docker || true'
|
||||||
|
docker_check = subprocess.check_output(cmd, shell=True, universal_newlines=True)
|
||||||
|
if re.search('docker', docker_check.strip()):
|
||||||
|
cli = 'docker'
|
||||||
|
image_prefix = ''
|
||||||
|
if cli == '':
|
||||||
|
print ('No docker / podman installed: quitting')
|
||||||
|
return -1
|
||||||
|
print (f'Flattening {tag}')
|
||||||
|
|
||||||
|
# Creating a container
|
||||||
|
cmd = cli + ' run --name test-flatten --entrypoint /bin/true -d ' + tag
|
||||||
|
print (cmd)
|
||||||
|
subprocess.check_output(cmd, shell=True, universal_newlines=True)
|
||||||
|
|
||||||
|
# Export / Import trick
|
||||||
|
cmd = cli + ' export test-flatten | ' + cli + ' import '
|
||||||
|
# Bizarro syntax issue with podman
|
||||||
|
if cli == 'docker':
|
||||||
|
cmd += ' --change "ENV PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" '
|
||||||
|
else:
|
||||||
|
cmd += ' --change "ENV PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" '
|
||||||
|
if re.search('oai-enb', tag):
|
||||||
|
cmd += ' --change "WORKDIR /opt/oai-enb" '
|
||||||
|
cmd += ' --change "EXPOSE 2152/udp" '
|
||||||
|
cmd += ' --change "EXPOSE 36412/udp" '
|
||||||
|
cmd += ' --change "EXPOSE 36422/udp" '
|
||||||
|
cmd += ' --change "CMD [\\"/opt/oai-enb/bin/lte-softmodem.Rel15\\", \\"-O\\", \\"/opt/oai-enb/etc/enb.conf\\"]" '
|
||||||
|
cmd += ' --change "ENTRYPOINT [\\"/opt/oai-enb/bin/entrypoint.sh\\"]" '
|
||||||
|
if re.search('oai-gnb', tag):
|
||||||
|
cmd += ' --change "WORKDIR /opt/oai-gnb" '
|
||||||
|
cmd += ' --change "EXPOSE 2152/udp" '
|
||||||
|
cmd += ' --change "EXPOSE 36422/udp" '
|
||||||
|
cmd += ' --change "CMD [\\"/opt/oai-gnb/bin/nr-softmodem.Rel15\\", \\"-O\\", \\"/opt/oai-gnb/etc/gnb.conf\\"]" '
|
||||||
|
cmd += ' --change "ENTRYPOINT [\\"/opt/oai-gnb/bin/entrypoint.sh\\"]" '
|
||||||
|
if re.search('oai-lte-ue', tag):
|
||||||
|
cmd += ' --change "WORKDIR /opt/oai-lte-ue" '
|
||||||
|
cmd += ' --change "CMD [\\"/opt/oai-lte-ue/bin/lte-uesoftmodem.Rel15\\"]" '
|
||||||
|
cmd += ' --change "ENTRYPOINT [\\"/opt/oai-lte-ue/bin/entrypoint.sh\\"]" '
|
||||||
|
if re.search('oai-nr-ue', tag):
|
||||||
|
cmd += ' --change "WORKDIR /opt/oai-nr-ue" '
|
||||||
|
cmd += ' --change "CMD [\\"/opt/oai-nr-ue/bin/nr-uesoftmodem.Rel15\\", \\"-O\\", \\"/opt/oai-nr-ue/etc/nr-ue.conf\\"]" '
|
||||||
|
cmd += ' --change "ENTRYPOINT [\\"/opt/oai-nr-ue/bin/entrypoint.sh\\"]" '
|
||||||
|
if re.search('oai-lte-ru', tag):
|
||||||
|
cmd += ' --change "WORKDIR /opt/oai-lte-ru" '
|
||||||
|
cmd += ' --change "CMD [\\"/opt/oai-lte-ru/bin/oairu.Rel15\\", \\"-O\\", \\"/opt/oai-lte-ru/etc/rru.conf\\"]" '
|
||||||
|
cmd += ' --change "ENTRYPOINT [\\"/opt/oai-lte-ru/bin/entrypoint.sh\\"]" '
|
||||||
|
if re.search('oai-physim', tag):
|
||||||
|
cmd += ' --change "WORKDIR /opt/oai-physim" '
|
||||||
|
cmd += ' - ' + image_prefix + tag
|
||||||
|
print (cmd)
|
||||||
|
subprocess.check_output(cmd, shell=True, universal_newlines=True)
|
||||||
|
|
||||||
|
# Remove container
|
||||||
|
cmd = cli + ' rm -f test-flatten'
|
||||||
|
print (cmd)
|
||||||
|
subprocess.check_output(cmd, shell=True, universal_newlines=True)
|
||||||
|
|
||||||
|
# At this point the original image is a dangling image.
|
||||||
|
# CI pipeline will clean up (`image prune --force`)
|
||||||
|
return 0
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
||||||
+9
-9
@@ -49,7 +49,7 @@ import cls_physim1 #class PhySim for physical simulators deploy and run
|
|||||||
import sshconnection
|
import sshconnection
|
||||||
import epc
|
import epc
|
||||||
import ran
|
import ran
|
||||||
import html
|
import cls_oai_html
|
||||||
|
|
||||||
|
|
||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
@@ -518,7 +518,7 @@ CiTestObj = cls_oaicitest.OaiCiTest()
|
|||||||
SSH = sshconnection.SSHConnection()
|
SSH = sshconnection.SSHConnection()
|
||||||
EPC = epc.EPCManagement()
|
EPC = epc.EPCManagement()
|
||||||
RAN = ran.RANManagement()
|
RAN = ran.RANManagement()
|
||||||
HTML = html.HTMLManagement()
|
HTML = cls_oai_html.HTMLManagement()
|
||||||
CONTAINERS = cls_containerize.Containerize()
|
CONTAINERS = cls_containerize.Containerize()
|
||||||
SCA = cls_static_code_analysis.StaticCodeAnalysis()
|
SCA = cls_static_code_analysis.StaticCodeAnalysis()
|
||||||
PHYSIM = cls_physim1.PhySim()
|
PHYSIM = cls_physim1.PhySim()
|
||||||
@@ -779,19 +779,19 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re
|
|||||||
HTML.CreateHtmlTabHeader()
|
HTML.CreateHtmlTabHeader()
|
||||||
|
|
||||||
# On CI bench w/ containers, we need to validate if IP routes are set
|
# On CI bench w/ containers, we need to validate if IP routes are set
|
||||||
if EPC.IPAddress == '192.168.18.210':
|
if EPC.IPAddress == '172.21.16.136':
|
||||||
CONTAINERS.CheckAndAddRoute('porcepix', EPC.IPAddress, EPC.UserName, EPC.Password)
|
CONTAINERS.CheckAndAddRoute('porcepix', EPC.IPAddress, EPC.UserName, EPC.Password)
|
||||||
if CONTAINERS.eNBIPAddress == '192.168.18.194':
|
if CONTAINERS.eNBIPAddress == '172.21.16.127':
|
||||||
CONTAINERS.CheckAndAddRoute('asterix', CONTAINERS.eNBIPAddress, CONTAINERS.eNBUserName, CONTAINERS.eNBPassword)
|
CONTAINERS.CheckAndAddRoute('asterix', CONTAINERS.eNBIPAddress, CONTAINERS.eNBUserName, CONTAINERS.eNBPassword)
|
||||||
if CONTAINERS.eNB1IPAddress == '192.168.18.194':
|
if CONTAINERS.eNB1IPAddress == '172.21.16.127':
|
||||||
CONTAINERS.CheckAndAddRoute('asterix', CONTAINERS.eNB1IPAddress, CONTAINERS.eNB1UserName, CONTAINERS.eNB1Password)
|
CONTAINERS.CheckAndAddRoute('asterix', CONTAINERS.eNB1IPAddress, CONTAINERS.eNB1UserName, CONTAINERS.eNB1Password)
|
||||||
if CONTAINERS.eNBIPAddress == '192.168.18.193':
|
if CONTAINERS.eNBIPAddress == '172.21.16.128':
|
||||||
CONTAINERS.CheckAndAddRoute('obelix', CONTAINERS.eNBIPAddress, CONTAINERS.eNBUserName, CONTAINERS.eNBPassword)
|
CONTAINERS.CheckAndAddRoute('obelix', CONTAINERS.eNBIPAddress, CONTAINERS.eNBUserName, CONTAINERS.eNBPassword)
|
||||||
if CONTAINERS.eNB1IPAddress == '192.168.18.193':
|
if CONTAINERS.eNB1IPAddress == '172.21.16.128':
|
||||||
CONTAINERS.CheckAndAddRoute('obelix', CONTAINERS.eNB1IPAddress, CONTAINERS.eNB1UserName, CONTAINERS.eNB1Password)
|
CONTAINERS.CheckAndAddRoute('obelix', CONTAINERS.eNB1IPAddress, CONTAINERS.eNB1UserName, CONTAINERS.eNB1Password)
|
||||||
if CONTAINERS.eNBIPAddress == '192.168.18.209':
|
if CONTAINERS.eNBIPAddress == '172.21.16.137':
|
||||||
CONTAINERS.CheckAndAddRoute('nepes', CONTAINERS.eNBIPAddress, CONTAINERS.eNBUserName, CONTAINERS.eNBPassword)
|
CONTAINERS.CheckAndAddRoute('nepes', CONTAINERS.eNBIPAddress, CONTAINERS.eNBUserName, CONTAINERS.eNBPassword)
|
||||||
if CONTAINERS.eNB1IPAddress == '192.168.18.209':
|
if CONTAINERS.eNB1IPAddress == '172.21.16.137':
|
||||||
CONTAINERS.CheckAndAddRoute('nepes', CONTAINERS.eNB1IPAddress, CONTAINERS.eNB1UserName, CONTAINERS.eNB1Password)
|
CONTAINERS.CheckAndAddRoute('nepes', CONTAINERS.eNB1IPAddress, CONTAINERS.eNB1UserName, CONTAINERS.eNB1Password)
|
||||||
|
|
||||||
CiTestObj.FailReportCnt = 0
|
CiTestObj.FailReportCnt = 0
|
||||||
|
|||||||
@@ -5,15 +5,15 @@ import subprocess
|
|||||||
import sys
|
import sys
|
||||||
|
|
||||||
AUTH_SERVICE = 'registry.docker.io'
|
AUTH_SERVICE = 'registry.docker.io'
|
||||||
AUTH_SCOPE = 'repository:rdefosseoai/oai-enb:pull'
|
AUTH_SCOPE = 'repository:oaisoftwarealliance/oai-enb:pull'
|
||||||
|
|
||||||
def main() -> None:
|
def main() -> None:
|
||||||
args = _parse_args()
|
args = _parse_args()
|
||||||
|
|
||||||
cmd = 'curl -fsSL "https://auth.docker.io/token?service=' + AUTH_SERVICE + '&scope=' + AUTH_SCOPE + '" | jq --raw-output ".token"'
|
cmd = 'curl -fsSL "https://auth.docker.io/token?service=' + AUTH_SERVICE + '&scope=' + AUTH_SCOPE + '" 2>/dev/null | jq --raw-output ".token"'
|
||||||
token = subprocess.check_output(cmd, shell=True, universal_newlines=True)
|
token = subprocess.check_output(cmd, shell=True, universal_newlines=True)
|
||||||
token = str(token).strip()
|
token = str(token).strip()
|
||||||
cmd = 'curl -fsSL -H "Authorization: Bearer ' + token + '" "https://index.docker.io/v2/rdefosseoai/oai-enb/tags/list" | jq .'
|
cmd = 'curl -fsSL -H "Authorization: Bearer ' + token + '" "https://index.docker.io/v2/oaisoftwarealliance/oai-enb/tags/list" 2>/dev/null | jq .'
|
||||||
listOfTags = subprocess.check_output(cmd, shell=True, universal_newlines=True)
|
listOfTags = subprocess.check_output(cmd, shell=True, universal_newlines=True)
|
||||||
|
|
||||||
foundTag = False
|
foundTag = False
|
||||||
|
|||||||
+30
-42
@@ -372,36 +372,28 @@ class RANManagement():
|
|||||||
else:
|
else:
|
||||||
pcapfile_prefix="gnb_"
|
pcapfile_prefix="gnb_"
|
||||||
mySSH.open(lIpAddr, lUserName, lPassWord)
|
mySSH.open(lIpAddr, lUserName, lPassWord)
|
||||||
mySSH.command('ip addr show | awk -f /tmp/active_net_interfaces.awk | egrep -v "lo|tun"', '\$', 5)
|
eth_interface = 'any'
|
||||||
result = re.search('interfaceToUse=(?P<eth_interface>[a-zA-Z0-9\-\_]+)done', mySSH.getBefore())
|
fltr = 'sctp'
|
||||||
if result is not None:
|
logging.debug('\u001B[1m Launching tshark on interface ' + eth_interface + ' with filter "' + fltr + '"\u001B[0m')
|
||||||
eth_interface = result.group('eth_interface')
|
pcapfile = pcapfile_prefix + self.testCase_id + '_log.pcap'
|
||||||
fltr = 'port 38412 or port 36412 or port 36422' # NGAP, S1AP, X2AP
|
mySSH.command('echo ' + lPassWord + ' | sudo -S rm -f /tmp/' + pcapfile , '\$', 5)
|
||||||
logging.debug('\u001B[1m Launching tshark on interface ' + eth_interface + ' with filter "' + fltr + '"\u001B[0m')
|
mySSH.command('echo $USER; nohup sudo -E tshark -i ' + eth_interface + ' -f "' + fltr + '" -w /tmp/' + pcapfile + ' > /dev/null 2>&1 &','\$', 5)
|
||||||
pcapfile = pcapfile_prefix + self.testCase_id + '_log.pcap'
|
|
||||||
mySSH.command('echo ' + lPassWord + ' | sudo -S rm -f /tmp/' + pcapfile , '\$', 5)
|
|
||||||
mySSH.command('echo $USER; nohup sudo -E tshark -i ' + eth_interface + ' -f "' + fltr + '" -w /tmp/' + pcapfile + ' > /dev/null 2>&1 &','\$', 5)
|
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# If tracer options is on, running tshark on EPC side and capture traffic b/ EPC and eNB
|
# If tracer options is on, running tshark on EPC side and capture traffic b/ EPC and eNB
|
||||||
result = re.search('T_stdout', str(self.Initialize_eNB_args))
|
localEpcIpAddr = EPC.IPAddress
|
||||||
if (result is not None):
|
localEpcUserName = EPC.UserName
|
||||||
localEpcIpAddr = EPC.IPAddress
|
localEpcPassword = EPC.Password
|
||||||
localEpcUserName = EPC.UserName
|
mySSH.open(localEpcIpAddr, localEpcUserName, localEpcPassword)
|
||||||
localEpcPassword = EPC.Password
|
eth_interface = 'any'
|
||||||
mySSH.open(localEpcIpAddr, localEpcUserName, localEpcPassword)
|
fltr = 'sctp'
|
||||||
mySSH.command('ip addr show | awk -f /tmp/active_net_interfaces.awk | egrep -v "lo|tun"', '\$', 5)
|
logging.debug('\u001B[1m Launching tshark on interface ' + eth_interface + ' with filter "' + fltr + '"\u001B[0m')
|
||||||
result = re.search('interfaceToUse=(?P<eth_interface>[a-zA-Z0-9\-\_]+)done', mySSH.getBefore())
|
self.epcPcapFile = 'enb_' + self.testCase_id + '_s1log.pcap'
|
||||||
if result is not None:
|
mySSH.command('echo ' + localEpcPassword + ' | sudo -S rm -f /tmp/' + self.epcPcapFile , '\$', 5)
|
||||||
eth_interface = result.group('eth_interface')
|
mySSH.command('echo $USER; nohup sudo tshark -f "host ' + lIpAddr +'" -i ' + eth_interface + ' -f "' + fltr + '" -w /tmp/' + self.epcPcapFile + ' > /tmp/tshark.log 2>&1 &', localEpcUserName, 5)
|
||||||
fltr = 'port 38412 or port 36412 or port 36422' # NGAP, S1AP, X2AP
|
mySSH.close()
|
||||||
logging.debug('\u001B[1m Launching tshark on interface ' + eth_interface + ' with filter "' + fltr + '"\u001B[0m')
|
|
||||||
self.epcPcapFile = 'enb_' + self.testCase_id + '_s1log.pcap'
|
|
||||||
mySSH.command('echo ' + localEpcPassword + ' | sudo -S rm -f /tmp/' + self.epcPcapFile , '\$', 5)
|
|
||||||
mySSH.command('echo $USER; nohup sudo tshark -f "host ' + lIpAddr +'" -i ' + eth_interface + ' -f "' + fltr + '" -w /tmp/' + self.epcPcapFile + ' > /tmp/tshark.log 2>&1 &', localEpcUserName, 5)
|
|
||||||
mySSH.close()
|
|
||||||
mySSH.open(lIpAddr, lUserName, lPassWord)
|
mySSH.open(lIpAddr, lUserName, lPassWord)
|
||||||
mySSH.command('cd ' + lSourcePath, '\$', 5)
|
mySSH.command('cd ' + lSourcePath, '\$', 5)
|
||||||
# Initialize_eNB_args usually start with -O and followed by the location in repository
|
# Initialize_eNB_args usually start with -O and followed by the location in repository
|
||||||
@@ -519,23 +511,19 @@ class RANManagement():
|
|||||||
logging.error('\u001B[1;37;41m eNB/gNB/ocp-eNB logging system did not show got sync! \u001B[0m')
|
logging.error('\u001B[1;37;41m eNB/gNB/ocp-eNB logging system did not show got sync! \u001B[0m')
|
||||||
HTML.CreateHtmlTestRow(self.air_interface[self.eNB_instance] + ' -O ' + config_file + extra_options, 'KO', CONST.ALL_PROCESSES_OK)
|
HTML.CreateHtmlTestRow(self.air_interface[self.eNB_instance] + ' -O ' + config_file + extra_options, 'KO', CONST.ALL_PROCESSES_OK)
|
||||||
# In case of T tracer recording, we need to kill tshark on EPC side
|
# In case of T tracer recording, we need to kill tshark on EPC side
|
||||||
result = re.search('T_stdout', str(self.Initialize_eNB_args))
|
localEpcIpAddr = EPC.IPAddress
|
||||||
if (result is not None):
|
localEpcUserName = EPC.UserName
|
||||||
localEpcIpAddr = EPC.IPAddress
|
localEpcPassword = EPC.Password
|
||||||
localEpcUserName = EPC.UserName
|
mySSH.open(localEpcIpAddr, localEpcUserName, localEpcPassword)
|
||||||
localEpcPassword = EPC.Password
|
logging.debug('\u001B[1m Stopping tshark \u001B[0m')
|
||||||
mySSH.open(localEpcIpAddr, localEpcUserName, localEpcPassword)
|
mySSH.command('echo ' + localEpcPassword + ' | sudo -S killall --signal SIGKILL tshark', '\$', 5)
|
||||||
logging.debug('\u001B[1m Stopping tshark \u001B[0m')
|
if self.epcPcapFile != '':
|
||||||
mySSH.command('echo ' + localEpcPassword + ' | sudo -S killall --signal SIGKILL tshark', '\$', 5)
|
mySSH.command('echo ' + localEpcPassword + ' | sudo -S chmod 666 /tmp/' + self.epcPcapFile, '\$', 5)
|
||||||
if self.epcPcapFile != '':
|
mySSH.close()
|
||||||
time.sleep(0.5)
|
if self.epcPcapFile != '':
|
||||||
mySSH.command('echo ' + localEpcPassword + ' | sudo -S chmod 666 /tmp/' + self.epcPcapFile, '\$', 5)
|
copyin_res = mySSH.copyin(localEpcIpAddr, localEpcUserName, localEpcPassword, '/tmp/' + self.epcPcapFile, '.')
|
||||||
mySSH.close()
|
if (copyin_res == 0):
|
||||||
time.sleep(1)
|
mySSH.copyout(lIpAddr, lUserName, lPassWord, self.epcPcapFile, lSourcePath + '/cmake_targets/.')
|
||||||
if self.epcPcapFile != '':
|
|
||||||
copyin_res = mySSH.copyin(localEpcIpAddr, localEpcUserName, localEpcPassword, '/tmp/' + self.epcPcapFile, '.')
|
|
||||||
if (copyin_res == 0):
|
|
||||||
mySSH.copyout(lIpAddr, lUserName, lPassWord, self.epcPcapFile, lSourcePath + '/cmake_targets/.')
|
|
||||||
self.prematureExit = True
|
self.prematureExit = True
|
||||||
return
|
return
|
||||||
else:
|
else:
|
||||||
|
|||||||
@@ -33,12 +33,10 @@
|
|||||||
000013
|
000013
|
||||||
020011
|
020011
|
||||||
020012
|
020012
|
||||||
100011
|
|
||||||
</TestCaseRequestedList>
|
|
||||||
<!-- Not done yet because of code instability
|
|
||||||
030011
|
030011
|
||||||
030012
|
030012
|
||||||
-->
|
100011
|
||||||
|
</TestCaseRequestedList>
|
||||||
<TestCaseExclusionList></TestCaseExclusionList>
|
<TestCaseExclusionList></TestCaseExclusionList>
|
||||||
|
|
||||||
<testCase id="000010">
|
<testCase id="000010">
|
||||||
@@ -104,7 +102,7 @@
|
|||||||
<server_container_name>rfsim5g-oai-ext-dn</server_container_name>
|
<server_container_name>rfsim5g-oai-ext-dn</server_container_name>
|
||||||
<client_container_name>rfsim5g-oai-nr-ue</client_container_name>
|
<client_container_name>rfsim5g-oai-nr-ue</client_container_name>
|
||||||
<server_options>-u -i 1 -s</server_options>
|
<server_options>-u -i 1 -s</server_options>
|
||||||
<client_options>-B 12.1.1.2 -c 192.168.72.135 -u -i 1 -t 30 -b 1M</client_options>
|
<client_options>-B 12.1.1.2 -c 192.168.72.135 -u -i 1 -t 30 -b 3M</client_options>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
<testCase id="100011">
|
<testCase id="100011">
|
||||||
|
|||||||
@@ -138,19 +138,19 @@
|
|||||||
|
|
||||||
<testCase id="070000">
|
<testCase id="070000">
|
||||||
<class>Iperf</class>
|
<class>Iperf</class>
|
||||||
<desc>iperf (DL/40Mbps/UDP)(60 sec)(single-ue profile)</desc>
|
<desc>iperf (DL/125Mbps/UDP)(60 sec)(single-ue profile)</desc>
|
||||||
<iperf_args>-u -b 40M -t 60 -i 1 -fm</iperf_args>
|
<iperf_args>-u -b 125M -t 60 -i 1 -fm</iperf_args>
|
||||||
<direction>DL</direction>
|
<direction>DL</direction>
|
||||||
<id>idefix</id>
|
<id>idefix</id>
|
||||||
<iperf_packetloss_threshold>20</iperf_packetloss_threshold>
|
<iperf_packetloss_threshold>1</iperf_packetloss_threshold>
|
||||||
<iperf_bitrate_threshold>85</iperf_bitrate_threshold>
|
<iperf_bitrate_threshold>95</iperf_bitrate_threshold>
|
||||||
<iperf_profile>single-ue</iperf_profile>
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
<testCase id="070001">
|
<testCase id="070001">
|
||||||
<class>Iperf</class>
|
<class>Iperf</class>
|
||||||
<desc>iperf (UL/3Mbps/UDP)(60 sec)(single-ue profile)</desc>
|
<desc>iperf (UL/8Mbps/UDP)(60 sec)(single-ue profile)</desc>
|
||||||
<iperf_args>-u -b 3M -t 60 -i 1 -fm</iperf_args>
|
<iperf_args>-u -b 8M -t 60 -i 1 -fm</iperf_args>
|
||||||
<direction>UL</direction>
|
<direction>UL</direction>
|
||||||
<id>idefix</id>
|
<id>idefix</id>
|
||||||
<iperf_packetloss_threshold>1</iperf_packetloss_threshold>
|
<iperf_packetloss_threshold>1</iperf_packetloss_threshold>
|
||||||
|
|||||||
@@ -68,7 +68,7 @@
|
|||||||
<air_interface>lte</air_interface>
|
<air_interface>lte</air_interface>
|
||||||
<eNB_Trace>yes</eNB_Trace>
|
<eNB_Trace>yes</eNB_Trace>
|
||||||
<eNB_Stats>yes</eNB_Stats>
|
<eNB_Stats>yes</eNB_Stats>
|
||||||
<USRP_IPAddress>192.168.18.241</USRP_IPAddress>
|
<USRP_IPAddress>172.21.19.13</USRP_IPAddress>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
@@ -81,7 +81,7 @@
|
|||||||
<air_interface>nr</air_interface>
|
<air_interface>nr</air_interface>
|
||||||
<eNB_Stats>yes</eNB_Stats>
|
<eNB_Stats>yes</eNB_Stats>
|
||||||
<rt_stats_cfg>datalog_rt_stats.2x2.yaml</rt_stats_cfg>
|
<rt_stats_cfg>datalog_rt_stats.2x2.yaml</rt_stats_cfg>
|
||||||
<USRP_IPAddress>192.168.18.252</USRP_IPAddress>
|
<USRP_IPAddress>172.21.19.14</USRP_IPAddress>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
<testCase id="000001">
|
<testCase id="000001">
|
||||||
@@ -115,11 +115,12 @@
|
|||||||
|
|
||||||
<testCase id="070000">
|
<testCase id="070000">
|
||||||
<class>Iperf</class>
|
<class>Iperf</class>
|
||||||
<desc>iperf (DL/60Mbps/UDP)(60 sec)(single-ue profile)</desc>
|
<desc>iperf (DL/125Mbps/UDP)(60 sec)(single-ue profile)</desc>
|
||||||
<iperf_args>-u -b 60M -t 60</iperf_args>
|
<iperf_args>-u -b 125M -t 60</iperf_args>
|
||||||
<direction>DL</direction>
|
<direction>DL</direction>
|
||||||
<id>nrmodule2_quectel</id>
|
<id>nrmodule2_quectel</id>
|
||||||
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
|
<iperf_packetloss_threshold>15</iperf_packetloss_threshold>
|
||||||
|
<iperf_bitrate_threshold>85</iperf_bitrate_threshold>
|
||||||
<iperf_profile>single-ue</iperf_profile>
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
|
|||||||
@@ -87,7 +87,7 @@
|
|||||||
<air_interface>lte</air_interface>
|
<air_interface>lte</air_interface>
|
||||||
<eNB_Trace>yes</eNB_Trace>
|
<eNB_Trace>yes</eNB_Trace>
|
||||||
<eNB_Stats>yes</eNB_Stats>
|
<eNB_Stats>yes</eNB_Stats>
|
||||||
<USRP_IPAddress>192.168.18.241</USRP_IPAddress>
|
<USRP_IPAddress>172.21.19.13</USRP_IPAddress>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
@@ -100,7 +100,7 @@
|
|||||||
<air_interface>nr</air_interface>
|
<air_interface>nr</air_interface>
|
||||||
<eNB_Stats>yes</eNB_Stats>
|
<eNB_Stats>yes</eNB_Stats>
|
||||||
<rt_stats_cfg>datalog_rt_stats.2x2.yaml</rt_stats_cfg>
|
<rt_stats_cfg>datalog_rt_stats.2x2.yaml</rt_stats_cfg>
|
||||||
<USRP_IPAddress>192.168.18.252</USRP_IPAddress>
|
<USRP_IPAddress>172.21.19.14</USRP_IPAddress>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
<testCase id="000001">
|
<testCase id="000001">
|
||||||
|
|||||||
@@ -74,7 +74,7 @@
|
|||||||
<testCase id="040000">
|
<testCase id="040000">
|
||||||
<class>Initialize_eNB</class>
|
<class>Initialize_eNB</class>
|
||||||
<desc>Initialize gNB</desc>
|
<desc>Initialize gNB</desc>
|
||||||
<Initialize_eNB_args>-O ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpb210.conf -E -q --RUs.[0].sdr_addrs "serial=30C51D4" --log_config.global_log_options level,nocolor,time,line_num,function</Initialize_eNB_args>
|
<Initialize_eNB_args>-O ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpb210.conf -E -q --RUs.[0].sdr_addrs "serial=30C51D4" --continuous-tx --log_config.global_log_options level,nocolor,time,line_num,function</Initialize_eNB_args>
|
||||||
<eNB_instance>1</eNB_instance>
|
<eNB_instance>1</eNB_instance>
|
||||||
<eNB_serverId>1</eNB_serverId>
|
<eNB_serverId>1</eNB_serverId>
|
||||||
<air_interface>nr</air_interface>
|
<air_interface>nr</air_interface>
|
||||||
@@ -117,37 +117,37 @@
|
|||||||
<iperf_args>-u -b 30M -t 30</iperf_args>
|
<iperf_args>-u -b 30M -t 30</iperf_args>
|
||||||
<direction>DL</direction>
|
<direction>DL</direction>
|
||||||
<id>idefix</id>
|
<id>idefix</id>
|
||||||
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
|
<iperf_packetloss_threshold>1</iperf_packetloss_threshold>
|
||||||
<iperf_bitrate_threshold>95</iperf_bitrate_threshold>
|
<iperf_bitrate_threshold>95</iperf_bitrate_threshold>
|
||||||
<iperf_profile>single-ue</iperf_profile>
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
<testCase id="070001">
|
<testCase id="070001">
|
||||||
<class>Iperf</class>
|
<class>Iperf</class>
|
||||||
<desc>iperf (DL/40Mbps/UDP)(30 sec)(single-ue profile)</desc>
|
<desc>iperf (DL/90Mbps/UDP)(30 sec)(single-ue profile)</desc>
|
||||||
<iperf_args>-u -b 40M -t 30</iperf_args>
|
<iperf_args>-u -b 90M -t 30</iperf_args>
|
||||||
<direction>DL</direction>
|
<direction>DL</direction>
|
||||||
<id>idefix</id>
|
<id>idefix</id>
|
||||||
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
|
<iperf_packetloss_threshold>1</iperf_packetloss_threshold>
|
||||||
<iperf_bitrate_threshold>95</iperf_bitrate_threshold>
|
<iperf_bitrate_threshold>95</iperf_bitrate_threshold>
|
||||||
<iperf_profile>single-ue</iperf_profile>
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
<testCase id="070002">
|
<testCase id="070002">
|
||||||
<class>Iperf</class>
|
<class>Iperf</class>
|
||||||
<desc>iperf (DL/60Mbps/UDP)(60 sec)(single-ue profile)</desc>
|
<desc>iperf (DL/125Mbps/UDP)(60 sec)(single-ue profile)</desc>
|
||||||
<iperf_args>-u -b 60M -t 60</iperf_args>
|
<iperf_args>-u -b 125M -t 60</iperf_args>
|
||||||
<direction>DL</direction>
|
<direction>DL</direction>
|
||||||
<id>idefix</id>
|
<id>idefix</id>
|
||||||
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
|
<iperf_packetloss_threshold>1</iperf_packetloss_threshold>
|
||||||
<iperf_bitrate_threshold>95</iperf_bitrate_threshold>
|
<iperf_bitrate_threshold>95</iperf_bitrate_threshold>
|
||||||
<iperf_profile>single-ue</iperf_profile>
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
<testCase id="070003">
|
<testCase id="070003">
|
||||||
<class>Iperf</class>
|
<class>Iperf</class>
|
||||||
<desc>iperf (UL/3Mbps/UDP)(60 sec)(single-ue profile)</desc>
|
<desc>iperf (UL/8Mbps/UDP)(60 sec)(single-ue profile)</desc>
|
||||||
<iperf_args>-u -b 3M -t 60</iperf_args>
|
<iperf_args>-u -b 8M -t 60</iperf_args>
|
||||||
<direction>UL</direction>
|
<direction>UL</direction>
|
||||||
<id>idefix</id>
|
<id>idefix</id>
|
||||||
<iperf_packetloss_threshold>1</iperf_packetloss_threshold>
|
<iperf_packetloss_threshold>1</iperf_packetloss_threshold>
|
||||||
|
|||||||
@@ -52,7 +52,7 @@
|
|||||||
<eNB_Trace>yes</eNB_Trace>
|
<eNB_Trace>yes</eNB_Trace>
|
||||||
<eNB_Stats>yes</eNB_Stats>
|
<eNB_Stats>yes</eNB_Stats>
|
||||||
<rt_stats_cfg>datalog_rt_stats.2x2.yaml</rt_stats_cfg>
|
<rt_stats_cfg>datalog_rt_stats.2x2.yaml</rt_stats_cfg>
|
||||||
<USRP_IPAddress>192.168.18.252</USRP_IPAddress>
|
<USRP_IPAddress>172.21.19.14</USRP_IPAddress>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
<testCase id="050000">
|
<testCase id="050000">
|
||||||
|
|||||||
@@ -60,7 +60,7 @@
|
|||||||
<air_interface>nr</air_interface>
|
<air_interface>nr</air_interface>
|
||||||
<eNB_Trace>yes</eNB_Trace>
|
<eNB_Trace>yes</eNB_Trace>
|
||||||
<eNB_Stats>yes</eNB_Stats>
|
<eNB_Stats>yes</eNB_Stats>
|
||||||
<USRP_IPAddress>192.168.18.252</USRP_IPAddress>
|
<USRP_IPAddress>172.21.19.14</USRP_IPAddress>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
<testCase id="000001">
|
<testCase id="000001">
|
||||||
|
|||||||
@@ -42,7 +42,7 @@
|
|||||||
<class>Initialize_OAI_UE</class>
|
<class>Initialize_OAI_UE</class>
|
||||||
<desc>Initialize OAI UE (N310)</desc>
|
<desc>Initialize OAI UE (N310)</desc>
|
||||||
<air_interface>nr</air_interface>
|
<air_interface>nr</air_interface>
|
||||||
<Initialize_OAI_UE_args>--sa -O ../../../ci-scripts/conf_files/ue.sa.conf --usrp-args "mgmt_addr=192.168.18.241,addr=192.168.10.2" --numerology 1 -r 106 --band 78 -C 3319680000 --nokrnmod 1 --ue-txgain 0 --ue-rxgain 70 --ue-fo-compensation --log_config.global_log_options level,nocolor,time</Initialize_OAI_UE_args>
|
<Initialize_OAI_UE_args>--sa -O ../../../ci-scripts/conf_files/ue.sa.conf --usrp-args "mgmt_addr=172.21.19.13,addr=192.168.10.2" --numerology 1 -r 106 --band 78 -C 3319680000 --nokrnmod 1 --ue-txgain 0 --ue-rxgain 70 --ue-fo-compensation --log_config.global_log_options level,nocolor,time</Initialize_OAI_UE_args>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
<testCase id="010002">
|
<testCase id="010002">
|
||||||
@@ -60,7 +60,7 @@
|
|||||||
<air_interface>nr</air_interface>
|
<air_interface>nr</air_interface>
|
||||||
<eNB_Trace>yes</eNB_Trace>
|
<eNB_Trace>yes</eNB_Trace>
|
||||||
<eNB_Stats>yes</eNB_Stats>
|
<eNB_Stats>yes</eNB_Stats>
|
||||||
<USRP_IPAddress>192.168.18.252</USRP_IPAddress>
|
<USRP_IPAddress>172.21.19.14</USRP_IPAddress>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
<testCase id="000001">
|
<testCase id="000001">
|
||||||
|
|||||||
@@ -60,7 +60,7 @@
|
|||||||
<air_interface>nr</air_interface>
|
<air_interface>nr</air_interface>
|
||||||
<eNB_Trace>yes</eNB_Trace>
|
<eNB_Trace>yes</eNB_Trace>
|
||||||
<eNB_Stats>yes</eNB_Stats>
|
<eNB_Stats>yes</eNB_Stats>
|
||||||
<USRP_IPAddress>192.168.18.252</USRP_IPAddress>
|
<USRP_IPAddress>172.21.19.14</USRP_IPAddress>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
<testCase id="000001">
|
<testCase id="000001">
|
||||||
|
|||||||
@@ -22,7 +22,7 @@
|
|||||||
-->
|
-->
|
||||||
<testCaseList>
|
<testCaseList>
|
||||||
<htmlTabRef>TEST-SA-FR1-Tab1</htmlTabRef>
|
<htmlTabRef>TEST-SA-FR1-Tab1</htmlTabRef>
|
||||||
<htmlTabName>SA Ping DL UL with QUECTEL</htmlTabName>
|
<htmlTabName>SA Ping DL UL with Quectel, 2.5ms TDD</htmlTabName>
|
||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
<repeatCount>1</repeatCount>
|
<repeatCount>1</repeatCount>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
@@ -63,14 +63,14 @@
|
|||||||
<testCase id="040000">
|
<testCase id="040000">
|
||||||
<class>Initialize_eNB</class>
|
<class>Initialize_eNB</class>
|
||||||
<desc>Initialize gNB</desc>
|
<desc>Initialize gNB</desc>
|
||||||
<Initialize_eNB_args>-O ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.conf --sa -q --usrp-tx-thread-config 1 --T_stdout 2 --log_config.global_log_options level,nocolor,time</Initialize_eNB_args>
|
<Initialize_eNB_args>-O ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.ddsuu.2x2.usrpn310.conf --sa -q --usrp-tx-thread-config 1 --T_stdout 2 --log_config.global_log_options level,nocolor,time</Initialize_eNB_args>
|
||||||
<eNB_instance>0</eNB_instance>
|
<eNB_instance>0</eNB_instance>
|
||||||
<eNB_serverId>0</eNB_serverId>
|
<eNB_serverId>0</eNB_serverId>
|
||||||
<air_interface>nr</air_interface>
|
<air_interface>nr</air_interface>
|
||||||
<eNB_Trace>yes</eNB_Trace>
|
<eNB_Trace>yes</eNB_Trace>
|
||||||
<eNB_Stats>yes</eNB_Stats>
|
<eNB_Stats>yes</eNB_Stats>
|
||||||
<rt_stats_cfg>datalog_rt_stats.2x2.yaml</rt_stats_cfg>
|
<rt_stats_cfg>datalog_rt_stats.2x2.yaml</rt_stats_cfg>
|
||||||
<USRP_IPAddress>192.168.18.252</USRP_IPAddress>
|
<USRP_IPAddress>172.21.19.14</USRP_IPAddress>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
<testCase id="000001">
|
<testCase id="000001">
|
||||||
@@ -92,7 +92,7 @@
|
|||||||
<id>nrmodule2_quectel</id>
|
<id>nrmodule2_quectel</id>
|
||||||
<ping_args>-c 40</ping_args>
|
<ping_args>-c 40</ping_args>
|
||||||
<ping_packetloss_threshold>1</ping_packetloss_threshold>
|
<ping_packetloss_threshold>1</ping_packetloss_threshold>
|
||||||
<ping_rttavg_threshold>20</ping_rttavg_threshold>
|
<ping_rttavg_threshold>10</ping_rttavg_threshold>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
<testCase id="050001">
|
<testCase id="050001">
|
||||||
@@ -101,7 +101,7 @@
|
|||||||
<id>nrmodule2_quectel</id>
|
<id>nrmodule2_quectel</id>
|
||||||
<ping_args>-c 100 -i 0,2</ping_args>
|
<ping_args>-c 100 -i 0,2</ping_args>
|
||||||
<ping_packetloss_threshold>1</ping_packetloss_threshold>
|
<ping_packetloss_threshold>1</ping_packetloss_threshold>
|
||||||
<ping_rttavg_threshold>20</ping_rttavg_threshold>
|
<ping_rttavg_threshold>10</ping_rttavg_threshold>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
<testCase id="070000">
|
<testCase id="070000">
|
||||||
|
|||||||
@@ -68,7 +68,7 @@
|
|||||||
<eNB_Trace>yes</eNB_Trace>
|
<eNB_Trace>yes</eNB_Trace>
|
||||||
<eNB_Stats>yes</eNB_Stats>
|
<eNB_Stats>yes</eNB_Stats>
|
||||||
<rt_stats_cfg>datalog_rt_stats.2x2.yaml</rt_stats_cfg>
|
<rt_stats_cfg>datalog_rt_stats.2x2.yaml</rt_stats_cfg>
|
||||||
<USRP_IPAddress>192.168.18.252</USRP_IPAddress>
|
<USRP_IPAddress>172.21.19.14</USRP_IPAddress>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
<testCase id="000001">
|
<testCase id="000001">
|
||||||
|
|||||||
@@ -74,7 +74,7 @@
|
|||||||
<eNB_Trace>yes</eNB_Trace>
|
<eNB_Trace>yes</eNB_Trace>
|
||||||
<eNB_Stats>yes</eNB_Stats>
|
<eNB_Stats>yes</eNB_Stats>
|
||||||
<rt_stats_cfg>datalog_rt_stats.2x2.yaml</rt_stats_cfg>
|
<rt_stats_cfg>datalog_rt_stats.2x2.yaml</rt_stats_cfg>
|
||||||
<USRP_IPAddress>192.168.18.252</USRP_IPAddress>
|
<USRP_IPAddress>172.21.19.14</USRP_IPAddress>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
<testCase id="000001">
|
<testCase id="000001">
|
||||||
|
|||||||
@@ -74,7 +74,7 @@
|
|||||||
<eNB_Trace>yes</eNB_Trace>
|
<eNB_Trace>yes</eNB_Trace>
|
||||||
<eNB_Stats>yes</eNB_Stats>
|
<eNB_Stats>yes</eNB_Stats>
|
||||||
<rt_stats_cfg>datalog_rt_stats.2x2.yaml</rt_stats_cfg>
|
<rt_stats_cfg>datalog_rt_stats.2x2.yaml</rt_stats_cfg>
|
||||||
<USRP_IPAddress>192.168.18.252</USRP_IPAddress>
|
<USRP_IPAddress>172.21.19.14</USRP_IPAddress>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
<testCase id="000001">
|
<testCase id="000001">
|
||||||
|
|||||||
@@ -65,7 +65,7 @@
|
|||||||
<air_interface>lte</air_interface>
|
<air_interface>lte</air_interface>
|
||||||
<eNB_Trace>yes</eNB_Trace>
|
<eNB_Trace>yes</eNB_Trace>
|
||||||
<eNB_Stats>yes</eNB_Stats>
|
<eNB_Stats>yes</eNB_Stats>
|
||||||
<USRP_IPAddress>192.168.18.241</USRP_IPAddress>
|
<USRP_IPAddress>172.21.19.13</USRP_IPAddress>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -65,7 +65,7 @@
|
|||||||
<air_interface>lte</air_interface>
|
<air_interface>lte</air_interface>
|
||||||
<eNB_Trace>yes</eNB_Trace>
|
<eNB_Trace>yes</eNB_Trace>
|
||||||
<eNB_Stats>yes</eNB_Stats>
|
<eNB_Stats>yes</eNB_Stats>
|
||||||
<USRP_IPAddress>192.168.18.241</USRP_IPAddress>
|
<USRP_IPAddress>172.21.19.13</USRP_IPAddress>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -31,9 +31,7 @@ This page is only valid for an `Ubuntu18` host.
|
|||||||
|
|
||||||
# 1. Retrieving the images on Docker-Hub #
|
# 1. Retrieving the images on Docker-Hub #
|
||||||
|
|
||||||
Currently the images are hosted under the user account `rdefosseoai`.
|
Currently the images are hosted under the team account `oaisoftwarealliance`. They were previously hosted under the user account `rdefosseoai`.
|
||||||
|
|
||||||
This may change in the future.
|
|
||||||
|
|
||||||
Once again you may need to log on [docker-hub](https://hub.docker.com/) if your organization has reached pulling limit as `anonymous`.
|
Once again you may need to log on [docker-hub](https://hub.docker.com/) if your organization has reached pulling limit as `anonymous`.
|
||||||
|
|
||||||
@@ -49,13 +47,13 @@ Now pull images.
|
|||||||
```bash
|
```bash
|
||||||
$ docker pull cassandra:2.1
|
$ docker pull cassandra:2.1
|
||||||
$ docker pull redis:6.0.5
|
$ docker pull redis:6.0.5
|
||||||
$ docker pull rdefosseoai/oai-hss:latest
|
$ docker pull oaisoftwarealliance/oai-hss:latest
|
||||||
$ docker pull rdefosseoai/magma-mme:latest
|
$ docker pull oaisoftwarealliance/magma-mme:latest
|
||||||
$ docker pull rdefosseoai/oai-spgwc:latest
|
$ docker pull oaisoftwarealliance/oai-spgwc:latest
|
||||||
$ docker pull rdefosseoai/oai-spgwu-tiny:latest
|
$ docker pull oaisoftwarealliance/oai-spgwu-tiny:latest
|
||||||
|
|
||||||
$ docker pull rdefosseoai/oai-enb:develop
|
$ docker pull oaisoftwarealliance/oai-enb:develop
|
||||||
$ docker pull rdefosseoai/oai-lte-ue:develop
|
$ docker pull oaisoftwarealliance/oai-lte-ue:develop
|
||||||
```
|
```
|
||||||
|
|
||||||
If the `redis` tag is not available, pick the newest available `6.0.x` tag at [Docker Hub Redis Tags](https://hub.docker.com/_/redis?tab=tags).
|
If the `redis` tag is not available, pick the newest available `6.0.x` tag at [Docker Hub Redis Tags](https://hub.docker.com/_/redis?tab=tags).
|
||||||
@@ -63,13 +61,13 @@ If the `redis` tag is not available, pick the newest available `6.0.x` tag at [D
|
|||||||
And **re-tag** them for tutorials' docker-compose file to work.
|
And **re-tag** them for tutorials' docker-compose file to work.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ docker image tag rdefosseoai/oai-spgwc:latest oai-spgwc:latest
|
$ docker image tag oaisoftwarealliance/oai-spgwc:latest oai-spgwc:latest
|
||||||
$ docker image tag rdefosseoai/oai-hss:latest oai-hss:latest
|
$ docker image tag oaisoftwarealliance/oai-hss:latest oai-hss:latest
|
||||||
$ docker image tag rdefosseoai/oai-spgwu-tiny:latest oai-spgwu-tiny:latest
|
$ docker image tag oaisoftwarealliance/oai-spgwu-tiny:latest oai-spgwu-tiny:latest
|
||||||
$ docker image tag rdefosseoai/magma-mme:latest magma-mme:latest
|
$ docker image tag oaisoftwarealliance/magma-mme:latest magma-mme:latest
|
||||||
|
|
||||||
$ docker image tag rdefosseoai/oai-enb:develop oai-enb:develop
|
$ docker image tag oaisoftwarealliance/oai-enb:develop oai-enb:develop
|
||||||
$ docker image tag rdefosseoai/oai-lte-ue:develop oai-lte-ue:develop
|
$ docker image tag oaisoftwarealliance/oai-lte-ue:develop oai-lte-ue:develop
|
||||||
```
|
```
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
@@ -505,7 +503,7 @@ In my traffic test, I was able to ping outside of my local network.
|
|||||||
in SPGW-C config:
|
in SPGW-C config:
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
DEFAULT_DNS_IPV4_ADDRESS: 192.168.18.129
|
DEFAULT_DNS_IPV4_ADDRESS: 172.21.3.100
|
||||||
DEFAULT_DNS_SEC_IPV4_ADDRESS: 8.8.4.4
|
DEFAULT_DNS_SEC_IPV4_ADDRESS: 8.8.4.4
|
||||||
PUSH_PROTOCOL_OPTION: 'true'
|
PUSH_PROTOCOL_OPTION: 'true'
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -115,7 +115,7 @@ services:
|
|||||||
TZ: Europe/Paris
|
TZ: Europe/Paris
|
||||||
SGW_INTERFACE_NAME_FOR_S11: eth0
|
SGW_INTERFACE_NAME_FOR_S11: eth0
|
||||||
PGW_INTERFACE_NAME_FOR_SX: eth0
|
PGW_INTERFACE_NAME_FOR_SX: eth0
|
||||||
DEFAULT_DNS_IPV4_ADDRESS: 192.168.18.129
|
DEFAULT_DNS_IPV4_ADDRESS: 172.21.3.100
|
||||||
DEFAULT_DNS_SEC_IPV4_ADDRESS: 8.8.4.4
|
DEFAULT_DNS_SEC_IPV4_ADDRESS: 8.8.4.4
|
||||||
PUSH_PROTOCOL_OPTION: 'true'
|
PUSH_PROTOCOL_OPTION: 'true'
|
||||||
APN_NI_1: oai.ipv4
|
APN_NI_1: oai.ipv4
|
||||||
|
|||||||
@@ -115,7 +115,7 @@ services:
|
|||||||
TZ: Europe/Paris
|
TZ: Europe/Paris
|
||||||
SGW_INTERFACE_NAME_FOR_S11: eth0
|
SGW_INTERFACE_NAME_FOR_S11: eth0
|
||||||
PGW_INTERFACE_NAME_FOR_SX: eth0
|
PGW_INTERFACE_NAME_FOR_SX: eth0
|
||||||
DEFAULT_DNS_IPV4_ADDRESS: 192.168.18.129
|
DEFAULT_DNS_IPV4_ADDRESS: 172.21.3.100
|
||||||
DEFAULT_DNS_SEC_IPV4_ADDRESS: 8.8.4.4
|
DEFAULT_DNS_SEC_IPV4_ADDRESS: 8.8.4.4
|
||||||
PUSH_PROTOCOL_OPTION: 'true'
|
PUSH_PROTOCOL_OPTION: 'true'
|
||||||
APN_NI_1: oai.ipv4
|
APN_NI_1: oai.ipv4
|
||||||
|
|||||||
@@ -115,7 +115,7 @@ services:
|
|||||||
TZ: Europe/Paris
|
TZ: Europe/Paris
|
||||||
SGW_INTERFACE_NAME_FOR_S11: eth0
|
SGW_INTERFACE_NAME_FOR_S11: eth0
|
||||||
PGW_INTERFACE_NAME_FOR_SX: eth0
|
PGW_INTERFACE_NAME_FOR_SX: eth0
|
||||||
DEFAULT_DNS_IPV4_ADDRESS: 192.168.18.129
|
DEFAULT_DNS_IPV4_ADDRESS: 172.21.3.100
|
||||||
DEFAULT_DNS_SEC_IPV4_ADDRESS: 8.8.4.4
|
DEFAULT_DNS_SEC_IPV4_ADDRESS: 8.8.4.4
|
||||||
PUSH_PROTOCOL_OPTION: 'true'
|
PUSH_PROTOCOL_OPTION: 'true'
|
||||||
APN_NI_1: oai.ipv4
|
APN_NI_1: oai.ipv4
|
||||||
|
|||||||
@@ -115,7 +115,7 @@ services:
|
|||||||
TZ: Europe/Paris
|
TZ: Europe/Paris
|
||||||
SGW_INTERFACE_NAME_FOR_S11: eth0
|
SGW_INTERFACE_NAME_FOR_S11: eth0
|
||||||
PGW_INTERFACE_NAME_FOR_SX: eth0
|
PGW_INTERFACE_NAME_FOR_SX: eth0
|
||||||
DEFAULT_DNS_IPV4_ADDRESS: 192.168.18.129
|
DEFAULT_DNS_IPV4_ADDRESS: 172.21.3.100
|
||||||
DEFAULT_DNS_SEC_IPV4_ADDRESS: 8.8.4.4
|
DEFAULT_DNS_SEC_IPV4_ADDRESS: 8.8.4.4
|
||||||
PUSH_PROTOCOL_OPTION: 'true'
|
PUSH_PROTOCOL_OPTION: 'true'
|
||||||
APN_NI_1: oai.ipv4
|
APN_NI_1: oai.ipv4
|
||||||
|
|||||||
@@ -120,7 +120,7 @@ services:
|
|||||||
- SMF_INTERFACE_PORT_FOR_SBI=80
|
- SMF_INTERFACE_PORT_FOR_SBI=80
|
||||||
- SMF_INTERFACE_HTTP2_PORT_FOR_SBI=9090
|
- SMF_INTERFACE_HTTP2_PORT_FOR_SBI=9090
|
||||||
- SMF_API_VERSION=v1
|
- SMF_API_VERSION=v1
|
||||||
- DEFAULT_DNS_IPV4_ADDRESS=192.168.18.129
|
- DEFAULT_DNS_IPV4_ADDRESS=172.21.3.100
|
||||||
- DEFAULT_DNS_SEC_IPV4_ADDRESS=4.4.4.4
|
- DEFAULT_DNS_SEC_IPV4_ADDRESS=4.4.4.4
|
||||||
- AMF_IPV4_ADDRESS=0.0.0.0
|
- AMF_IPV4_ADDRESS=0.0.0.0
|
||||||
- AMF_PORT=80
|
- AMF_PORT=80
|
||||||
|
|||||||
@@ -120,7 +120,7 @@ services:
|
|||||||
- SMF_INTERFACE_PORT_FOR_SBI=80
|
- SMF_INTERFACE_PORT_FOR_SBI=80
|
||||||
- SMF_INTERFACE_HTTP2_PORT_FOR_SBI=9090
|
- SMF_INTERFACE_HTTP2_PORT_FOR_SBI=9090
|
||||||
- SMF_API_VERSION=v1
|
- SMF_API_VERSION=v1
|
||||||
- DEFAULT_DNS_IPV4_ADDRESS=192.168.18.129
|
- DEFAULT_DNS_IPV4_ADDRESS=172.21.3.100
|
||||||
- DEFAULT_DNS_SEC_IPV4_ADDRESS=4.4.4.4
|
- DEFAULT_DNS_SEC_IPV4_ADDRESS=4.4.4.4
|
||||||
- AMF_IPV4_ADDRESS=0.0.0.0
|
- AMF_IPV4_ADDRESS=0.0.0.0
|
||||||
- AMF_PORT=80
|
- AMF_PORT=80
|
||||||
|
|||||||
@@ -18,9 +18,7 @@ This tutorial is only valid once this file is merged into the `develop` branch.
|
|||||||
|
|
||||||
# 1. Retrieving the images on Docker-Hub #
|
# 1. Retrieving the images on Docker-Hub #
|
||||||
|
|
||||||
Currently the images are hosted under the user account `rdefosseoai`.
|
Currently the images are hosted under the team account `oaisoftwarealliance`. They were previously hosted under the user account `rdefosseoai`.
|
||||||
|
|
||||||
This may change in the future.
|
|
||||||
|
|
||||||
Once again you may need to log on [docker-hub](https://hub.docker.com/) if your organization has reached pulling limit as `anonymous`.
|
Once again you may need to log on [docker-hub](https://hub.docker.com/) if your organization has reached pulling limit as `anonymous`.
|
||||||
|
|
||||||
@@ -35,27 +33,27 @@ Now pull images.
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ docker pull mysql:5.7
|
$ docker pull mysql:5.7
|
||||||
$ docker pull rdefosseoai/oai-amf:latest
|
$ docker pull oaisoftwarealliance/oai-amf:latest
|
||||||
$ docker pull rdefosseoai/oai-nrf:latest
|
$ docker pull oaisoftwarealliance/oai-nrf:latest
|
||||||
$ docker pull rdefosseoai/oai-smf:latest
|
$ docker pull oaisoftwarealliance/oai-smf:latest
|
||||||
$ docker pull rdefosseoai/oai-spgwu-tiny:latest
|
$ docker pull oaisoftwarealliance/oai-spgwu-tiny:latest
|
||||||
|
|
||||||
$ docker pull rdefosseoai/oai-gnb:develop
|
$ docker pull oaisoftwarealliance/oai-gnb:develop
|
||||||
$ docker pull rdefosseoai/oai-nr-ue:develop
|
$ docker pull oaisoftwarealliance/oai-nr-ue:develop
|
||||||
$ docker pull rdefosseoai/proxy:latest
|
$ docker pull oaisoftwarealliance/proxy:latest
|
||||||
```
|
```
|
||||||
|
|
||||||
And **re-tag** them for tutorials' docker-compose file to work.
|
And **re-tag** them for tutorials' docker-compose file to work.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ docker image tag rdefosseoai/oai-amf:latest oai-amf:latest
|
$ docker image tag oaisoftwarealliance/oai-amf:latest oai-amf:latest
|
||||||
$ docker image tag rdefosseoai/oai-nrf:latest oai-nrf:latest
|
$ docker image tag oaisoftwarealliance/oai-nrf:latest oai-nrf:latest
|
||||||
$ docker image tag rdefosseoai/oai-smf:latest oai-smf:latest
|
$ docker image tag oaisoftwarealliance/oai-smf:latest oai-smf:latest
|
||||||
$ docker image tag rdefosseoai/oai-spgwu-tiny:latest oai-spgwu-tiny:latest
|
$ docker image tag oaisoftwarealliance/oai-spgwu-tiny:latest oai-spgwu-tiny:latest
|
||||||
|
|
||||||
$ docker image tag rdefosseoai/oai-gnb:develop oai-gnb:develop
|
$ docker image tag oaisoftwarealliance/oai-gnb:develop oai-gnb:develop
|
||||||
$ docker image tag rdefosseoai/oai-nr-ue:develop oai-nr-ue:develop
|
$ docker image tag oaisoftwarealliance/oai-nr-ue:develop oai-nr-ue:develop
|
||||||
$ docker image tag rdefosseoai/proxy:latest oai-lte-multi-ue-proxy:latest
|
$ docker image tag oaisoftwarealliance/proxy:latest oai-lte-multi-ue-proxy:latest
|
||||||
```
|
```
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
@@ -326,16 +324,16 @@ Removing network l2sim-oai-traffic-net
|
|||||||
In the `SMF` section, provide your own DNS IP address:
|
In the `SMF` section, provide your own DNS IP address:
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
DEFAULT_DNS_IPV4_ADDRESS=192.168.18.129
|
DEFAULT_DNS_IPV4_ADDRESS=172.21.3.100
|
||||||
```
|
```
|
||||||
|
|
||||||
In the `gNB` section, provide your docker-host primary IP address and interface name: in our case `192.168.18.193` and `eno1`.
|
In the `gNB` section, provide your docker-host primary IP address and interface name: in our case `172.21.16.128` and `eno1`.
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
GNB_NGA_IF_NAME: eno1
|
GNB_NGA_IF_NAME: eno1
|
||||||
GNB_NGA_IP_ADDRESS: 192.168.18.193
|
GNB_NGA_IP_ADDRESS: 172.21.16.128
|
||||||
GNB_NGU_IF_NAME: eno1
|
GNB_NGU_IF_NAME: eno1
|
||||||
GNB_NGU_IP_ADDRESS: 192.168.18.193
|
GNB_NGU_IP_ADDRESS: 172.21.16.128
|
||||||
```
|
```
|
||||||
|
|
||||||
Same thing in the `nr-ue` section:
|
Same thing in the `nr-ue` section:
|
||||||
|
|||||||
@@ -120,7 +120,7 @@ services:
|
|||||||
- SMF_INTERFACE_PORT_FOR_SBI=80
|
- SMF_INTERFACE_PORT_FOR_SBI=80
|
||||||
- SMF_INTERFACE_HTTP2_PORT_FOR_SBI=9090
|
- SMF_INTERFACE_HTTP2_PORT_FOR_SBI=9090
|
||||||
- SMF_API_VERSION=v1
|
- SMF_API_VERSION=v1
|
||||||
- DEFAULT_DNS_IPV4_ADDRESS=192.168.18.129
|
- DEFAULT_DNS_IPV4_ADDRESS=172.21.3.100
|
||||||
- DEFAULT_DNS_SEC_IPV4_ADDRESS=4.4.4.4
|
- DEFAULT_DNS_SEC_IPV4_ADDRESS=4.4.4.4
|
||||||
- AMF_IPV4_ADDRESS=0.0.0.0
|
- AMF_IPV4_ADDRESS=0.0.0.0
|
||||||
- AMF_PORT=80
|
- AMF_PORT=80
|
||||||
@@ -241,9 +241,9 @@ services:
|
|||||||
NSSAI_SD1: 112233
|
NSSAI_SD1: 112233
|
||||||
AMF_IP_ADDRESS: 192.168.71.132
|
AMF_IP_ADDRESS: 192.168.71.132
|
||||||
GNB_NGA_IF_NAME: eno1
|
GNB_NGA_IF_NAME: eno1
|
||||||
GNB_NGA_IP_ADDRESS: 192.168.18.193
|
GNB_NGA_IP_ADDRESS: 172.21.16.128
|
||||||
GNB_NGU_IF_NAME: eno1
|
GNB_NGU_IF_NAME: eno1
|
||||||
GNB_NGU_IP_ADDRESS: 192.168.18.193
|
GNB_NGU_IP_ADDRESS: 172.21.16.128
|
||||||
LOCAL_S_IF_NAME: 'lo:'
|
LOCAL_S_IF_NAME: 'lo:'
|
||||||
REMOTE_S_ADDRESS: 127.0.0.1
|
REMOTE_S_ADDRESS: 127.0.0.1
|
||||||
LOCAL_S_ADDRESS: 127.0.0.2
|
LOCAL_S_ADDRESS: 127.0.0.2
|
||||||
|
|||||||
@@ -35,9 +35,7 @@ This page is only valid for an `Ubuntu18` host.
|
|||||||
|
|
||||||
# 1. Retrieving the images on Docker-Hub #
|
# 1. Retrieving the images on Docker-Hub #
|
||||||
|
|
||||||
Currently the images are hosted under the user account `rdefosseoai`.
|
Currently the images are hosted under the team account `oaisoftwarealliance`. They were previously hosted under the user account `rdefosseoai`.
|
||||||
|
|
||||||
This may change in the future.
|
|
||||||
|
|
||||||
Once again you may need to log on [docker-hub](https://hub.docker.com/) if your organization has reached pulling limit as `anonymous`.
|
Once again you may need to log on [docker-hub](https://hub.docker.com/) if your organization has reached pulling limit as `anonymous`.
|
||||||
|
|
||||||
@@ -52,25 +50,25 @@ Now pull images.
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ docker pull mysql:5.7
|
$ docker pull mysql:5.7
|
||||||
$ docker pull rdefosseoai/oai-amf:latest
|
$ docker pull oaisoftwarealliance/oai-amf:latest
|
||||||
$ docker pull rdefosseoai/oai-nrf:latest
|
$ docker pull oaisoftwarealliance/oai-nrf:latest
|
||||||
$ docker pull rdefosseoai/oai-smf:latest
|
$ docker pull oaisoftwarealliance/oai-smf:latest
|
||||||
$ docker pull rdefosseoai/oai-spgwu-tiny:latest
|
$ docker pull oaisoftwarealliance/oai-spgwu-tiny:latest
|
||||||
|
|
||||||
$ docker pull rdefosseoai/oai-gnb:develop
|
$ docker pull oaisoftwarealliance/oai-gnb:develop
|
||||||
$ docker pull rdefosseoai/oai-nr-ue:develop
|
$ docker pull oaisoftwarealliance/oai-nr-ue:develop
|
||||||
```
|
```
|
||||||
|
|
||||||
And **re-tag** them for tutorials' docker-compose file to work.
|
And **re-tag** them for tutorials' docker-compose file to work.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ docker image tag rdefosseoai/oai-amf:latest oai-amf:latest
|
$ docker image tag oaisoftwarealliance/oai-amf:latest oai-amf:latest
|
||||||
$ docker image tag rdefosseoai/oai-nrf:latest oai-nrf:latest
|
$ docker image tag oaisoftwarealliance/oai-nrf:latest oai-nrf:latest
|
||||||
$ docker image tag rdefosseoai/oai-smf:latest oai-smf:latest
|
$ docker image tag oaisoftwarealliance/oai-smf:latest oai-smf:latest
|
||||||
$ docker image tag rdefosseoai/oai-spgwu-tiny:latest oai-spgwu-tiny:latest
|
$ docker image tag oaisoftwarealliance/oai-spgwu-tiny:latest oai-spgwu-tiny:latest
|
||||||
|
|
||||||
$ docker image tag rdefosseoai/oai-gnb:develop oai-gnb:develop
|
$ docker image tag oaisoftwarealliance/oai-gnb:develop oai-gnb:develop
|
||||||
$ docker image tag rdefosseoai/oai-nr-ue:develop oai-nr-ue:develop
|
$ docker image tag oaisoftwarealliance/oai-nr-ue:develop oai-nr-ue:develop
|
||||||
```
|
```
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
|||||||
@@ -120,7 +120,7 @@ services:
|
|||||||
- SMF_INTERFACE_PORT_FOR_SBI=80
|
- SMF_INTERFACE_PORT_FOR_SBI=80
|
||||||
- SMF_INTERFACE_HTTP2_PORT_FOR_SBI=9090
|
- SMF_INTERFACE_HTTP2_PORT_FOR_SBI=9090
|
||||||
- SMF_API_VERSION=v1
|
- SMF_API_VERSION=v1
|
||||||
- DEFAULT_DNS_IPV4_ADDRESS=192.168.18.129
|
- DEFAULT_DNS_IPV4_ADDRESS=172.21.3.100
|
||||||
- DEFAULT_DNS_SEC_IPV4_ADDRESS=4.4.4.4
|
- DEFAULT_DNS_SEC_IPV4_ADDRESS=4.4.4.4
|
||||||
- AMF_IPV4_ADDRESS=0.0.0.0
|
- AMF_IPV4_ADDRESS=0.0.0.0
|
||||||
- AMF_PORT=80
|
- AMF_PORT=80
|
||||||
|
|||||||
@@ -132,7 +132,7 @@ services:
|
|||||||
TZ: Europe/Paris
|
TZ: Europe/Paris
|
||||||
SGW_INTERFACE_NAME_FOR_S11: eth0
|
SGW_INTERFACE_NAME_FOR_S11: eth0
|
||||||
PGW_INTERFACE_NAME_FOR_SX: eth0
|
PGW_INTERFACE_NAME_FOR_SX: eth0
|
||||||
DEFAULT_DNS_IPV4_ADDRESS: 192.168.18.129
|
DEFAULT_DNS_IPV4_ADDRESS: 172.21.3.100
|
||||||
DEFAULT_DNS_SEC_IPV4_ADDRESS: 8.8.4.4
|
DEFAULT_DNS_SEC_IPV4_ADDRESS: 8.8.4.4
|
||||||
PUSH_PROTOCOL_OPTION: 'true'
|
PUSH_PROTOCOL_OPTION: 'true'
|
||||||
APN_NI_1: oai.ipv4
|
APN_NI_1: oai.ipv4
|
||||||
|
|||||||
@@ -116,7 +116,7 @@ services:
|
|||||||
TZ: Europe/Paris
|
TZ: Europe/Paris
|
||||||
SGW_INTERFACE_NAME_FOR_S11: eth0
|
SGW_INTERFACE_NAME_FOR_S11: eth0
|
||||||
PGW_INTERFACE_NAME_FOR_SX: eth0
|
PGW_INTERFACE_NAME_FOR_SX: eth0
|
||||||
DEFAULT_DNS_IPV4_ADDRESS: 192.168.18.129
|
DEFAULT_DNS_IPV4_ADDRESS: 172.21.3.100
|
||||||
DEFAULT_DNS_SEC_IPV4_ADDRESS: 8.8.4.4
|
DEFAULT_DNS_SEC_IPV4_ADDRESS: 8.8.4.4
|
||||||
PUSH_PROTOCOL_OPTION: 'true'
|
PUSH_PROTOCOL_OPTION: 'true'
|
||||||
APN_NI_1: oai.ipv4
|
APN_NI_1: oai.ipv4
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ services:
|
|||||||
NB_PRB: 25
|
NB_PRB: 25
|
||||||
ENABLE_MEASUREMENT_REPORTS: 'yes'
|
ENABLE_MEASUREMENT_REPORTS: 'yes'
|
||||||
ENABLE_X2: 'yes'
|
ENABLE_X2: 'yes'
|
||||||
MME_S1C_IP_ADDRESS: 192.168.18.210
|
MME_S1C_IP_ADDRESS: 172.21.16.136
|
||||||
ENB_S1C_IF_NAME: eth0
|
ENB_S1C_IF_NAME: eth0
|
||||||
ENB_S1C_IP_ADDRESS: 192.168.68.130
|
ENB_S1C_IP_ADDRESS: 192.168.68.130
|
||||||
ENB_S1U_IF_NAME: eth0
|
ENB_S1U_IF_NAME: eth0
|
||||||
@@ -29,7 +29,7 @@ services:
|
|||||||
RRC_INACTIVITY_THRESHOLD: 0
|
RRC_INACTIVITY_THRESHOLD: 0
|
||||||
FLEXRAN_ENABLED: 'no'
|
FLEXRAN_ENABLED: 'no'
|
||||||
FLEXRAN_INTERFACE_NAME: eth0
|
FLEXRAN_INTERFACE_NAME: eth0
|
||||||
FLEXRAN_IPV4_ADDRESS: 192.168.18.210
|
FLEXRAN_IPV4_ADDRESS: 172.21.16.136
|
||||||
THREAD_PARALLEL_CONFIG: PARALLEL_SINGLE_THREAD
|
THREAD_PARALLEL_CONFIG: PARALLEL_SINGLE_THREAD
|
||||||
USE_ADDITIONAL_OPTIONS: --log_config.global_log_options level,nocolor,time,line_num,function
|
USE_ADDITIONAL_OPTIONS: --log_config.global_log_options level,nocolor,time,line_num,function
|
||||||
volumes:
|
volumes:
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ services:
|
|||||||
TAC: 1
|
TAC: 1
|
||||||
ENABLE_X2: 'yes'
|
ENABLE_X2: 'yes'
|
||||||
ENB_X2_IP_ADDRESS: 192.168.68.130
|
ENB_X2_IP_ADDRESS: 192.168.68.130
|
||||||
MME_S1C_IP_ADDRESS: 192.168.18.210
|
MME_S1C_IP_ADDRESS: 172.21.16.136
|
||||||
GNB_S1C_IF_NAME: eth0
|
GNB_S1C_IF_NAME: eth0
|
||||||
GNB_S1C_IP_ADDRESS: 192.168.68.194
|
GNB_S1C_IP_ADDRESS: 192.168.68.194
|
||||||
GNB_S1U_IF_NAME: eth0
|
GNB_S1U_IF_NAME: eth0
|
||||||
@@ -24,9 +24,9 @@ services:
|
|||||||
RRC_INACTIVITY_THRESHOLD: 0
|
RRC_INACTIVITY_THRESHOLD: 0
|
||||||
FLEXRAN_ENABLED: 'no'
|
FLEXRAN_ENABLED: 'no'
|
||||||
FLEXRAN_INTERFACE_NAME: eth0
|
FLEXRAN_INTERFACE_NAME: eth0
|
||||||
FLEXRAN_IPV4_ADDRESS: 192.168.18.210
|
FLEXRAN_IPV4_ADDRESS: 172.21.16.136
|
||||||
THREAD_PARALLEL_CONFIG: PARALLEL_RU_L1_TRX_SPLIT
|
THREAD_PARALLEL_CONFIG: PARALLEL_RU_L1_TRX_SPLIT
|
||||||
USE_ADDITIONAL_OPTIONS: -E -q --RUs.[0].sdr_addrs serial=30C51D4 --log_config.global_log_options level,nocolor,time,line_num,function
|
USE_ADDITIONAL_OPTIONS: -E -q --RUs.[0].sdr_addrs serial=30C51D4 --continuous-tx --log_config.global_log_options level,nocolor,time,line_num,function
|
||||||
volumes:
|
volumes:
|
||||||
- /dev:/dev
|
- /dev:/dev
|
||||||
networks:
|
networks:
|
||||||
|
|||||||
@@ -1093,7 +1093,7 @@
|
|||||||
(Test8: 217 PRB 100 PDSCH-PRBs 110 PDSCH-Offset),
|
(Test8: 217 PRB 100 PDSCH-PRBs 110 PDSCH-Offset),
|
||||||
(Test9: 106 PRBs 50 PDSCH-PRBs MCS Index 27),
|
(Test9: 106 PRBs 50 PDSCH-PRBs MCS Index 27),
|
||||||
(Test10: 106 PRBs 50 PDSCH-PRBs MCS Index 16),
|
(Test10: 106 PRBs 50 PDSCH-PRBs MCS Index 16),
|
||||||
(Test11: 106 MCS-TABLE 256 QAM MCS Index 27),
|
(Test11: 106 MCS-TABLE 256 QAM MCS Index 26),
|
||||||
(Test12: HARQ test 25% TP 4 rounds),
|
(Test12: HARQ test 25% TP 4 rounds),
|
||||||
(Test13: HARQ test 33% TP 3 rounds),
|
(Test13: HARQ test 33% TP 3 rounds),
|
||||||
(Test14: HARQ test 50% TP 2 rounds),
|
(Test14: HARQ test 50% TP 2 rounds),
|
||||||
@@ -1121,7 +1121,7 @@
|
|||||||
-n100 -R217 -a110 -s5 -b100
|
-n100 -R217 -a110 -s5 -b100
|
||||||
-n100 -e27 -s30
|
-n100 -e27 -s30
|
||||||
-n100 -e16 -s10
|
-n100 -e16 -s10
|
||||||
-n100 -q1 -e27 -s30
|
-n100 -q1 -e26 -s30
|
||||||
-n100 -s1 -t25
|
-n100 -s1 -t25
|
||||||
-n100 -s1 -t33
|
-n100 -s1 -t33
|
||||||
-n100 -s1 -t50
|
-n100 -s1 -t50
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
ran_build/
|
|
||||||
@@ -44,9 +44,9 @@
|
|||||||
#define _Assert_(cOND, aCTION, fORMAT, aRGS...) \
|
#define _Assert_(cOND, aCTION, fORMAT, aRGS...) \
|
||||||
do { \
|
do { \
|
||||||
if (!(cOND)) { \
|
if (!(cOND)) { \
|
||||||
fprintf(stderr, "\nAssertion ("#cOND") failed!\n" \
|
fprintf(stderr, "\nAssertion (%s) failed!\n" \
|
||||||
"In %s() %s:%d\n" fORMAT, \
|
"In %s() %s:%d\n" fORMAT, \
|
||||||
__FUNCTION__, __FILE__, __LINE__, ##aRGS); \
|
#cOND, __FUNCTION__, __FILE__, __LINE__, ##aRGS); \
|
||||||
aCTION; \
|
aCTION; \
|
||||||
} \
|
} \
|
||||||
} while(0)
|
} while(0)
|
||||||
|
|||||||
@@ -33,10 +33,8 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include "PHY/defs_eNB.h"
|
#include "PHY/defs_eNB.h"
|
||||||
#include "PHY/TOOLS/dB_routines.h"
|
#include <openair1/PHY/TOOLS/tools_defs.h>
|
||||||
|
#include <openair1/SCHED/sched_common_extern.h>
|
||||||
extern int16_t hundred_times_delta_TF[100];
|
|
||||||
extern uint16_t hundred_times_log10_NPRB[100];
|
|
||||||
|
|
||||||
int16_t estimate_ue_tx_power(int norm,uint32_t tbs, uint32_t nb_rb, uint8_t control_only, int ncp, uint8_t use_srs)
|
int16_t estimate_ue_tx_power(int norm,uint32_t tbs, uint32_t nb_rb, uint8_t control_only, int ncp, uint8_t use_srs)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -349,9 +349,9 @@ int get_dmrs_port(int nl, uint16_t dmrs_ports) {
|
|||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
lte_frame_type_t get_frame_type(uint16_t current_band, uint8_t scs_index)
|
frame_type_t get_frame_type(uint16_t current_band, uint8_t scs_index)
|
||||||
{
|
{
|
||||||
lte_frame_type_t current_type;
|
frame_type_t current_type;
|
||||||
int32_t delta_duplex = get_delta_duplex(current_band, scs_index);
|
int32_t delta_duplex = get_delta_duplex(current_band, scs_index);
|
||||||
|
|
||||||
if (delta_duplex == 0)
|
if (delta_duplex == 0)
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ void get_coreset_rballoc(uint8_t *FreqDomainResource,int *n_rb,int *rb_offset);
|
|||||||
uint16_t config_bandwidth(int mu, int nb_rb, int nr_band);
|
uint16_t config_bandwidth(int mu, int nb_rb, int nr_band);
|
||||||
int get_nr_table_idx(int nr_bandP, uint8_t scs_index);
|
int get_nr_table_idx(int nr_bandP, uint8_t scs_index);
|
||||||
int32_t get_delta_duplex(int nr_bandP, uint8_t scs_index);
|
int32_t get_delta_duplex(int nr_bandP, uint8_t scs_index);
|
||||||
lte_frame_type_t get_frame_type(uint16_t nr_bandP, uint8_t scs_index);
|
frame_type_t get_frame_type(uint16_t nr_bandP, uint8_t scs_index);
|
||||||
uint16_t get_band(uint64_t downlink_frequency, int32_t delta_duplex);
|
uint16_t get_band(uint64_t downlink_frequency, int32_t delta_duplex);
|
||||||
int NRRIV2BW(int locationAndBandwidth,int N_RB);
|
int NRRIV2BW(int locationAndBandwidth,int N_RB);
|
||||||
int NRRIV2PRBOFFSET(int locationAndBandwidth,int N_RB);
|
int NRRIV2PRBOFFSET(int locationAndBandwidth,int N_RB);
|
||||||
|
|||||||
+2
-2
@@ -165,7 +165,7 @@ From the `cmake_targets/ran_build/build` folder:
|
|||||||
|
|
||||||
gNB on machine 1:
|
gNB on machine 1:
|
||||||
|
|
||||||
`sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf --sa`
|
`sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf --gNBs.[0].min_rxtxtime 6 --sa`
|
||||||
|
|
||||||
UE on machine 2:
|
UE on machine 2:
|
||||||
|
|
||||||
@@ -173,7 +173,7 @@ UE on machine 2:
|
|||||||
|
|
||||||
With the RF simulator (on the same machine):
|
With the RF simulator (on the same machine):
|
||||||
|
|
||||||
`sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf --rfsim --sa`
|
`sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf --gNBs.[0].min_rxtxtime 6 --rfsim --sa`
|
||||||
|
|
||||||
`sudo ./nr-uesoftmodem -r 106 --numerology 1 --band 78 -C 3619200000 -s 516 --rfsim --sa`
|
`sudo ./nr-uesoftmodem -r 106 --numerology 1 --band 78 -C 3619200000 -s 516 --rfsim --sa`
|
||||||
|
|
||||||
|
|||||||
@@ -128,7 +128,6 @@ void rx_func(void *param) {
|
|||||||
int slot_rx = info->slot_rx;
|
int slot_rx = info->slot_rx;
|
||||||
int frame_tx = info->frame_tx;
|
int frame_tx = info->frame_tx;
|
||||||
int slot_tx = info->slot_tx;
|
int slot_tx = info->slot_tx;
|
||||||
sl_ahead = sf_ahead*gNB->frame_parms.slots_per_subframe;
|
|
||||||
nfapi_nr_config_request_scf_t *cfg = &gNB->gNB_config;
|
nfapi_nr_config_request_scf_t *cfg = &gNB->gNB_config;
|
||||||
|
|
||||||
start_meas(&softmodem_stats_rxtx_sf);
|
start_meas(&softmodem_stats_rxtx_sf);
|
||||||
@@ -457,6 +456,7 @@ void init_gNB_Tpool(int inst) {
|
|||||||
for (int i=0; i < 2; i++) {
|
for (int i=0; i < 2; i++) {
|
||||||
notifiedFIFO_elt_t *msgL1Tx = newNotifiedFIFO_elt(sizeof(processingData_L1tx_t),0,gNB->L1_tx_out,tx_func);
|
notifiedFIFO_elt_t *msgL1Tx = newNotifiedFIFO_elt(sizeof(processingData_L1tx_t),0,gNB->L1_tx_out,tx_func);
|
||||||
processingData_L1tx_t *msgDataTx = (processingData_L1tx_t *)NotifiedFifoData(msgL1Tx);
|
processingData_L1tx_t *msgDataTx = (processingData_L1tx_t *)NotifiedFifoData(msgL1Tx);
|
||||||
|
memset(msgDataTx,0, sizeof(processingData_L1tx_t));
|
||||||
init_DLSCH_struct(gNB, msgDataTx);
|
init_DLSCH_struct(gNB, msgDataTx);
|
||||||
memset(msgDataTx->ssb, 0, 64*sizeof(NR_gNB_SSB_t));
|
memset(msgDataTx->ssb, 0, 64*sizeof(NR_gNB_SSB_t));
|
||||||
pushNotifiedFIFO(gNB->L1_tx_free,msgL1Tx); // to unblock the process in the beginning
|
pushNotifiedFIFO(gNB->L1_tx_free,msgL1Tx); // to unblock the process in the beginning
|
||||||
|
|||||||
+17
-16
@@ -99,9 +99,6 @@ int attach_rru(RU_t *ru);
|
|||||||
int connect_rau(RU_t *ru);
|
int connect_rau(RU_t *ru);
|
||||||
static void NRRCconfig_RU(void);
|
static void NRRCconfig_RU(void);
|
||||||
|
|
||||||
uint16_t sf_ahead;
|
|
||||||
uint16_t slot_ahead;
|
|
||||||
uint16_t sl_ahead;
|
|
||||||
|
|
||||||
extern int emulate_rf;
|
extern int emulate_rf;
|
||||||
extern int numerology;
|
extern int numerology;
|
||||||
@@ -372,8 +369,8 @@ void fh_if4p5_south_in(RU_t *ru,
|
|||||||
proc->frame_rx = f;
|
proc->frame_rx = f;
|
||||||
proc->timestamp_rx = (proc->frame_rx * fp->samples_per_subframe * 10) + fp->get_samples_slot_timestamp(proc->tti_rx, fp, 0);
|
proc->timestamp_rx = (proc->frame_rx * fp->samples_per_subframe * 10) + fp->get_samples_slot_timestamp(proc->tti_rx, fp, 0);
|
||||||
// proc->timestamp_tx = proc->timestamp_rx + (4*fp->samples_per_subframe);
|
// proc->timestamp_tx = proc->timestamp_rx + (4*fp->samples_per_subframe);
|
||||||
proc->tti_tx = (sl+(fp->slots_per_subframe*sf_ahead))%fp->slots_per_frame;
|
proc->tti_tx = (sl+ru->sl_ahead)%fp->slots_per_frame;
|
||||||
proc->frame_tx = (sl>(fp->slots_per_frame-1-(fp->slots_per_subframe*sf_ahead))) ? (f+1)&1023 : f;
|
proc->frame_tx = (sl>(fp->slots_per_frame-1-(ru->sl_ahead))) ? (f+1)&1023 : f;
|
||||||
|
|
||||||
if (proc->first_rx == 0) {
|
if (proc->first_rx == 0) {
|
||||||
if (proc->tti_rx != *slot) {
|
if (proc->tti_rx != *slot) {
|
||||||
@@ -1300,8 +1297,7 @@ void *ru_thread( void *param ) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sf_ahead = (uint16_t) ceil((float)6/(0x01<<fp->numerology_index));
|
LOG_I(PHY, "Signaling main thread that RU %d is ready, sl_ahead %d\n",ru->idx,ru->sl_ahead);
|
||||||
LOG_I(PHY, "Signaling main thread that RU %d is ready, sf_ahead %d\n",ru->idx,sf_ahead);
|
|
||||||
pthread_mutex_lock(&RC.ru_mutex);
|
pthread_mutex_lock(&RC.ru_mutex);
|
||||||
RC.ru_mask &= ~(1<<ru->idx);
|
RC.ru_mask &= ~(1<<ru->idx);
|
||||||
pthread_cond_signal(&RC.ru_cond);
|
pthread_cond_signal(&RC.ru_cond);
|
||||||
@@ -1319,6 +1315,7 @@ void *ru_thread( void *param ) {
|
|||||||
else LOG_I(PHY,"RU %d rf device ready\n",ru->idx);
|
else LOG_I(PHY,"RU %d rf device ready\n",ru->idx);
|
||||||
} else LOG_I(PHY,"RU %d no rf device\n",ru->idx);
|
} else LOG_I(PHY,"RU %d no rf device\n",ru->idx);
|
||||||
|
|
||||||
|
LOG_I(PHY,"RU %d RF started\n",ru->idx);
|
||||||
// start trx write thread
|
// start trx write thread
|
||||||
if(usrp_tx_thread == 1) {
|
if(usrp_tx_thread == 1) {
|
||||||
if (ru->start_write_thread) {
|
if (ru->start_write_thread) {
|
||||||
@@ -1386,9 +1383,12 @@ void *ru_thread( void *param ) {
|
|||||||
opp_enabled = opp_enabled0;
|
opp_enabled = opp_enabled0;
|
||||||
}
|
}
|
||||||
if (initial_wait == 0 && ru->rx_fhaul.trials > 1000) reset_meas(&ru->rx_fhaul);
|
if (initial_wait == 0 && ru->rx_fhaul.trials > 1000) reset_meas(&ru->rx_fhaul);
|
||||||
proc->timestamp_tx = proc->timestamp_rx + (sf_ahead*fp->samples_per_subframe);
|
proc->timestamp_tx = proc->timestamp_rx;
|
||||||
proc->frame_tx = (proc->tti_rx > (fp->slots_per_frame-1-(fp->slots_per_subframe*sf_ahead))) ? (proc->frame_rx+1)&1023 : proc->frame_rx;
|
int sl=proc->tti_tx;
|
||||||
proc->tti_tx = (proc->tti_rx + (fp->slots_per_subframe*sf_ahead))%fp->slots_per_frame;
|
for (int slidx=0;slidx<ru->sl_ahead;slidx++)
|
||||||
|
proc->timestamp_tx += fp->get_samples_per_slot((sl+slidx)%fp->slots_per_frame,fp);
|
||||||
|
proc->frame_tx = (proc->tti_rx > (fp->slots_per_frame-1-(ru->sl_ahead))) ? (proc->frame_rx+1)&1023 : proc->frame_rx;
|
||||||
|
proc->tti_tx = (proc->tti_rx + ru->sl_ahead)%fp->slots_per_frame;
|
||||||
LOG_D(PHY,"AFTER fh_south_in - SFN/SL:%d%d RU->proc[RX:%d.%d TX:%d.%d] RC.gNB[0]:[RX:%d%d TX(SFN):%d]\n",
|
LOG_D(PHY,"AFTER fh_south_in - SFN/SL:%d%d RU->proc[RX:%d.%d TX:%d.%d] RC.gNB[0]:[RX:%d%d TX(SFN):%d]\n",
|
||||||
frame,slot,
|
frame,slot,
|
||||||
proc->frame_rx,proc->tti_rx,
|
proc->frame_rx,proc->tti_rx,
|
||||||
@@ -1419,7 +1419,6 @@ void *ru_thread( void *param ) {
|
|||||||
// Do PRACH RU processing
|
// Do PRACH RU processing
|
||||||
int prach_id=find_nr_prach_ru(ru,proc->frame_rx,proc->tti_rx,SEARCH_EXIST);
|
int prach_id=find_nr_prach_ru(ru,proc->frame_rx,proc->tti_rx,SEARCH_EXIST);
|
||||||
uint8_t prachStartSymbol,N_dur;
|
uint8_t prachStartSymbol,N_dur;
|
||||||
|
|
||||||
if (prach_id>=0) {
|
if (prach_id>=0) {
|
||||||
T(T_GNB_PHY_PRACH_INPUT_SIGNAL, T_INT(proc->frame_rx), T_INT(proc->tti_rx), T_INT(0),
|
T(T_GNB_PHY_PRACH_INPUT_SIGNAL, T_INT(proc->frame_rx), T_INT(proc->tti_rx), T_INT(0),
|
||||||
T_BUFFER(&ru->common.rxdata[0][fp->get_samples_slot_timestamp(proc->tti_rx-1,fp,0)]/*-ru->N_TA_offset*/, fp->get_samples_per_slot(proc->tti_rx,fp)*4*2));
|
T_BUFFER(&ru->common.rxdata[0][fp->get_samples_slot_timestamp(proc->tti_rx-1,fp,0)]/*-ru->N_TA_offset*/, fp->get_samples_per_slot(proc->tti_rx,fp)*4*2));
|
||||||
@@ -2091,9 +2090,7 @@ static void NRRCconfig_RU(void) {
|
|||||||
|
|
||||||
RC.ru[j]->max_pdschReferenceSignalPower = *(RUParamList.paramarray[j][RU_MAX_RS_EPRE_IDX].uptr);;
|
RC.ru[j]->max_pdschReferenceSignalPower = *(RUParamList.paramarray[j][RU_MAX_RS_EPRE_IDX].uptr);;
|
||||||
RC.ru[j]->max_rxgain = *(RUParamList.paramarray[j][RU_MAX_RXGAIN_IDX].uptr);
|
RC.ru[j]->max_rxgain = *(RUParamList.paramarray[j][RU_MAX_RXGAIN_IDX].uptr);
|
||||||
RC.ru[j]->num_bands = RUParamList.paramarray[j][RU_BAND_LIST_IDX].numelt;
|
|
||||||
RC.ru[j]->sf_extension = *(RUParamList.paramarray[j][RU_SF_EXTENSION_IDX].uptr);
|
RC.ru[j]->sf_extension = *(RUParamList.paramarray[j][RU_SF_EXTENSION_IDX].uptr);
|
||||||
for (i=0; i<RC.ru[j]->num_bands; i++) RC.ru[j]->band[i] = RUParamList.paramarray[j][RU_BAND_LIST_IDX].iptr[i];
|
|
||||||
} //strcmp(local_rf, "yes") == 0
|
} //strcmp(local_rf, "yes") == 0
|
||||||
else {
|
else {
|
||||||
printf("RU %d: Transport %s\n",j,*(RUParamList.paramarray[j][RU_TRANSPORT_PREFERENCE_IDX].strptr));
|
printf("RU %d: Transport %s\n",j,*(RUParamList.paramarray[j][RU_TRANSPORT_PREFERENCE_IDX].strptr));
|
||||||
@@ -2113,8 +2110,6 @@ static void NRRCconfig_RU(void) {
|
|||||||
RC.ru[j]->if_south = REMOTE_IF5;
|
RC.ru[j]->if_south = REMOTE_IF5;
|
||||||
RC.ru[j]->function = NGFI_RAU_IF5;
|
RC.ru[j]->function = NGFI_RAU_IF5;
|
||||||
RC.ru[j]->eth_params.transp_preference = ETH_UDP_IF5_ECPRI_MODE;
|
RC.ru[j]->eth_params.transp_preference = ETH_UDP_IF5_ECPRI_MODE;
|
||||||
} else if (strcmp(*(RUParamList.paramarray[j][RU_TRANSPORT_PREFERENCE_IDX].strptr), "udp_ecpri_if5") == 0) {
|
|
||||||
RC.ru[j]->if_south = REMOTE_IF5;
|
|
||||||
} else if (strcmp(*(RUParamList.paramarray[j][RU_TRANSPORT_PREFERENCE_IDX].strptr), "raw") == 0) {
|
} else if (strcmp(*(RUParamList.paramarray[j][RU_TRANSPORT_PREFERENCE_IDX].strptr), "raw") == 0) {
|
||||||
RC.ru[j]->if_south = REMOTE_IF5;
|
RC.ru[j]->if_south = REMOTE_IF5;
|
||||||
RC.ru[j]->function = NGFI_RAU_IF5;
|
RC.ru[j]->function = NGFI_RAU_IF5;
|
||||||
@@ -2137,7 +2132,13 @@ static void NRRCconfig_RU(void) {
|
|||||||
RC.ru[j]->if_frequency = *(RUParamList.paramarray[j][RU_IF_FREQUENCY].u64ptr);
|
RC.ru[j]->if_frequency = *(RUParamList.paramarray[j][RU_IF_FREQUENCY].u64ptr);
|
||||||
RC.ru[j]->if_freq_offset = *(RUParamList.paramarray[j][RU_IF_FREQ_OFFSET].iptr);
|
RC.ru[j]->if_freq_offset = *(RUParamList.paramarray[j][RU_IF_FREQ_OFFSET].iptr);
|
||||||
RC.ru[j]->do_precoding = *(RUParamList.paramarray[j][RU_DO_PRECODING].iptr);
|
RC.ru[j]->do_precoding = *(RUParamList.paramarray[j][RU_DO_PRECODING].iptr);
|
||||||
|
RC.ru[j]->sl_ahead = *(RUParamList.paramarray[j][RU_SL_AHEAD].iptr);
|
||||||
|
RC.ru[j]->num_bands = RUParamList.paramarray[j][RU_BAND_LIST_IDX].numelt;
|
||||||
|
for (i=0; i<RC.ru[j]->num_bands; i++) RC.ru[j]->band[i] = RUParamList.paramarray[j][RU_BAND_LIST_IDX].iptr[i];
|
||||||
|
RC.ru[j]->openair0_cfg.nr_flag = *(RUParamList.paramarray[j][RU_NR_FLAG].iptr);
|
||||||
|
RC.ru[j]->openair0_cfg.nr_band = RC.ru[j]->band[0];
|
||||||
|
RC.ru[j]->openair0_cfg.nr_scs_for_raster = *(RUParamList.paramarray[j][RU_NR_SCS_FOR_RASTER].iptr);
|
||||||
|
printf("[RU %d] Setting nr_flag %d, nr_band %d, nr_scs_for_raster %d\n",j,RC.ru[j]->openair0_cfg.nr_flag,RC.ru[j]->openair0_cfg.nr_band,RC.ru[j]->openair0_cfg.nr_scs_for_raster);
|
||||||
if (config_isparamset(RUParamList.paramarray[j], RU_BF_WEIGHTS_LIST_IDX)) {
|
if (config_isparamset(RUParamList.paramarray[j], RU_BF_WEIGHTS_LIST_IDX)) {
|
||||||
RC.ru[j]->nb_bfw = RUParamList.paramarray[j][RU_BF_WEIGHTS_LIST_IDX].numelt;
|
RC.ru[j]->nb_bfw = RUParamList.paramarray[j][RU_BF_WEIGHTS_LIST_IDX].numelt;
|
||||||
|
|
||||||
|
|||||||
@@ -51,7 +51,6 @@
|
|||||||
#define CONFIG_HLP_UEFO "set UE to enable estimation and compensation of frequency offset\n"
|
#define CONFIG_HLP_UEFO "set UE to enable estimation and compensation of frequency offset\n"
|
||||||
#define CONFIG_HLP_DUMPFRAME "dump UE received frame to rxsig_frame0.dat and exit\n"
|
#define CONFIG_HLP_DUMPFRAME "dump UE received frame to rxsig_frame0.dat and exit\n"
|
||||||
#define CONFIG_HLP_DLSHIFT "dynamic shift for LLR compuation for TM3/4 (default 0)\n"
|
#define CONFIG_HLP_DLSHIFT "dynamic shift for LLR compuation for TM3/4 (default 0)\n"
|
||||||
#define CONFIG_HLP_UELOOP "get softmodem (UE) to loop through memory instead of acquiring from HW\n"
|
|
||||||
#define CONFIG_HLP_PHYTST "test UE phy layer, mac disabled\n"
|
#define CONFIG_HLP_PHYTST "test UE phy layer, mac disabled\n"
|
||||||
#define CONFIG_HLP_DORA "test gNB and UE with RA procedures\n"
|
#define CONFIG_HLP_DORA "test gNB and UE with RA procedures\n"
|
||||||
#define CONFIG_HLP_DMAMAP "sets flag for improved EXMIMO UE performance\n"
|
#define CONFIG_HLP_DMAMAP "sets flag for improved EXMIMO UE performance\n"
|
||||||
|
|||||||
@@ -732,7 +732,7 @@ int main( int argc, char **argv ) {
|
|||||||
printf("wait_gNBs()\n");
|
printf("wait_gNBs()\n");
|
||||||
wait_gNBs();
|
wait_gNBs();
|
||||||
printf("About to Init RU threads RC.nb_RU:%d\n", RC.nb_RU);
|
printf("About to Init RU threads RC.nb_RU:%d\n", RC.nb_RU);
|
||||||
|
int sl_ahead=6;
|
||||||
if (RC.nb_RU >0) {
|
if (RC.nb_RU >0) {
|
||||||
printf("Initializing RU threads\n");
|
printf("Initializing RU threads\n");
|
||||||
init_NR_RU(get_softmodem_params()->rf_config_file);
|
init_NR_RU(get_softmodem_params()->rf_config_file);
|
||||||
@@ -740,7 +740,10 @@ int main( int argc, char **argv ) {
|
|||||||
for (ru_id=0; ru_id<RC.nb_RU; ru_id++) {
|
for (ru_id=0; ru_id<RC.nb_RU; ru_id++) {
|
||||||
RC.ru[ru_id]->rf_map.card=0;
|
RC.ru[ru_id]->rf_map.card=0;
|
||||||
RC.ru[ru_id]->rf_map.chain=CC_id+chain_offset;
|
RC.ru[ru_id]->rf_map.chain=CC_id+chain_offset;
|
||||||
|
if (ru_id==0) sl_ahead = RC.ru[ru_id]->sl_ahead;
|
||||||
|
else AssertFatal(RC.ru[ru_id]->sl_ahead != RC.ru[0]->sl_ahead,"RU %d has different sl_ahead %d than RU 0 %d\n",ru_id,RC.ru[ru_id]->sl_ahead,RC.ru[0]->sl_ahead);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
config_sync_var=0;
|
config_sync_var=0;
|
||||||
@@ -757,6 +760,7 @@ int main( int argc, char **argv ) {
|
|||||||
// once all RUs are ready initialize the rest of the gNBs ((dependence on final RU parameters after configuration)
|
// once all RUs are ready initialize the rest of the gNBs ((dependence on final RU parameters after configuration)
|
||||||
printf("ALL RUs ready - init gNBs\n");
|
printf("ALL RUs ready - init gNBs\n");
|
||||||
|
|
||||||
|
for (int idx=0;idx<RC.nb_nr_L1_inst;idx++) RC.gNB[idx]->if_inst->sl_ahead = sl_ahead;
|
||||||
if(IS_SOFTMODEM_DOSCOPE) {
|
if(IS_SOFTMODEM_DOSCOPE) {
|
||||||
sleep(1);
|
sleep(1);
|
||||||
scopeParms_t p;
|
scopeParms_t p;
|
||||||
|
|||||||
+7
-19
@@ -573,17 +573,7 @@ static void UE_synch(void *arg) {
|
|||||||
openair0_cfg[UE->rf_map.card].rx_freq[0],
|
openair0_cfg[UE->rf_map.card].rx_freq[0],
|
||||||
openair0_cfg[UE->rf_map.card].tx_freq[0]);
|
openair0_cfg[UE->rf_map.card].tx_freq[0]);
|
||||||
|
|
||||||
if (UE->mode != loop_through_memory) {
|
UE->rfdevice.trx_set_freq_func(&UE->rfdevice,&openair0_cfg[0],0);
|
||||||
UE->rfdevice.trx_set_freq_func(&UE->rfdevice,&openair0_cfg[0],0);
|
|
||||||
//UE->rfdevice.trx_set_gains_func(&openair0,&openair0_cfg[0]);
|
|
||||||
//UE->rfdevice.trx_stop_func(&UE->rfdevice);
|
|
||||||
// sleep(1);
|
|
||||||
/*if (UE->rfdevice.trx_start_func(&UE->rfdevice) != 0 ) {
|
|
||||||
LOG_E(HW,"Could not start the device\n");
|
|
||||||
oai_exit=1;
|
|
||||||
}*/
|
|
||||||
}
|
|
||||||
|
|
||||||
if (UE->UE_scan_carrier == 1) {
|
if (UE->UE_scan_carrier == 1) {
|
||||||
UE->UE_scan_carrier = 0;
|
UE->UE_scan_carrier = 0;
|
||||||
} else {
|
} else {
|
||||||
@@ -602,8 +592,7 @@ static void UE_synch(void *arg) {
|
|||||||
|
|
||||||
LOG_I(PHY, "Initial sync failed: trying carrier off %d Hz\n", freq_offset);
|
LOG_I(PHY, "Initial sync failed: trying carrier off %d Hz\n", freq_offset);
|
||||||
|
|
||||||
if (UE->mode != loop_through_memory)
|
UE->rfdevice.trx_set_freq_func(&UE->rfdevice,&openair0_cfg[0],0);
|
||||||
UE->rfdevice.trx_set_freq_func(&UE->rfdevice,&openair0_cfg[0],0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@@ -648,7 +637,7 @@ void processSlotTX(void *arg) {
|
|||||||
stop_meas(&UE->ue_ul_indication_stats);
|
stop_meas(&UE->ue_ul_indication_stats);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((UE->mode != loop_through_memory) && (rxtxD->ue_sched_mode != NOT_PUSCH)) {
|
if (rxtxD->ue_sched_mode != NOT_PUSCH) {
|
||||||
phy_procedures_nrUE_TX(UE,proc,0);
|
phy_procedures_nrUE_TX(UE,proc,0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -738,9 +727,10 @@ void processSlotRX(void *arg) {
|
|||||||
|
|
||||||
void dummyWrite(PHY_VARS_NR_UE *UE,openair0_timestamp timestamp, int writeBlockSize) {
|
void dummyWrite(PHY_VARS_NR_UE *UE,openair0_timestamp timestamp, int writeBlockSize) {
|
||||||
void *dummy_tx[UE->frame_parms.nb_antennas_tx];
|
void *dummy_tx[UE->frame_parms.nb_antennas_tx];
|
||||||
|
int16_t dummy_tx_data[UE->frame_parms.nb_antennas_tx][2*writeBlockSize]; // 2 because the function we call use pairs of int16_t implicitly as complex numbers
|
||||||
|
memset(dummy_tx_data, 0, sizeof(dummy_tx_data));
|
||||||
for (int i=0; i<UE->frame_parms.nb_antennas_tx; i++)
|
for (int i=0; i<UE->frame_parms.nb_antennas_tx; i++)
|
||||||
dummy_tx[i]=malloc16_clear(writeBlockSize*4);
|
dummy_tx[i]=dummy_tx_data[i];
|
||||||
|
|
||||||
AssertFatal( writeBlockSize ==
|
AssertFatal( writeBlockSize ==
|
||||||
UE->rfdevice.trx_write_func(&UE->rfdevice,
|
UE->rfdevice.trx_write_func(&UE->rfdevice,
|
||||||
@@ -750,8 +740,6 @@ void dummyWrite(PHY_VARS_NR_UE *UE,openair0_timestamp timestamp, int writeBlockS
|
|||||||
UE->frame_parms.nb_antennas_tx,
|
UE->frame_parms.nb_antennas_tx,
|
||||||
4),"");
|
4),"");
|
||||||
|
|
||||||
for (int i=0; i<UE->frame_parms.nb_antennas_tx; i++)
|
|
||||||
free(dummy_tx[i]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void readFrame(PHY_VARS_NR_UE *UE, openair0_timestamp *timestamp, bool toTrash) {
|
void readFrame(PHY_VARS_NR_UE *UE, openair0_timestamp *timestamp, bool toTrash) {
|
||||||
@@ -793,7 +781,7 @@ void syncInFrame(PHY_VARS_NR_UE *UE, openair0_timestamp *timestamp) {
|
|||||||
*timestamp += UE->frame_parms.get_samples_per_slot(1,&UE->frame_parms);
|
*timestamp += UE->frame_parms.get_samples_per_slot(1,&UE->frame_parms);
|
||||||
for ( int size=UE->rx_offset ; size > 0 ; size -= UE->frame_parms.samples_per_subframe ) {
|
for ( int size=UE->rx_offset ; size > 0 ; size -= UE->frame_parms.samples_per_subframe ) {
|
||||||
int unitTransfer=size>UE->frame_parms.samples_per_subframe ? UE->frame_parms.samples_per_subframe : size ;
|
int unitTransfer=size>UE->frame_parms.samples_per_subframe ? UE->frame_parms.samples_per_subframe : size ;
|
||||||
// we write before read becasue gNB waits for UE to write and both executions halt
|
// we write before read because gNB waits for UE to write and both executions halt
|
||||||
// this happens here as the read size is samples_per_subframe which is very much larger than samp_per_slot
|
// this happens here as the read size is samples_per_subframe which is very much larger than samp_per_slot
|
||||||
if (IS_SOFTMODEM_RFSIM) dummyWrite(UE,*timestamp, unitTransfer);
|
if (IS_SOFTMODEM_RFSIM) dummyWrite(UE,*timestamp, unitTransfer);
|
||||||
AssertFatal(unitTransfer ==
|
AssertFatal(unitTransfer ==
|
||||||
|
|||||||
@@ -245,14 +245,17 @@ nrUE_params_t *get_nrUE_params(void) {
|
|||||||
}
|
}
|
||||||
/* initialie thread pools used for NRUE processing paralleliation */
|
/* initialie thread pools used for NRUE processing paralleliation */
|
||||||
void init_tpools(uint8_t nun_dlsch_threads) {
|
void init_tpools(uint8_t nun_dlsch_threads) {
|
||||||
char *params = NULL;
|
char params[NR_RX_NB_TH*NR_NB_TH_SLOT*3+1]={0};
|
||||||
params = calloc(1,(NR_RX_NB_TH*NR_NB_TH_SLOT*3)+1);
|
|
||||||
for (int i=0; i<NR_RX_NB_TH*NR_NB_TH_SLOT; i++) {
|
for (int i=0; i<NR_RX_NB_TH*NR_NB_TH_SLOT; i++) {
|
||||||
memcpy(params+(i*3),"-1,",3);
|
memcpy(params+(i*3),"-1,",3);
|
||||||
}
|
}
|
||||||
initTpool(params, &(nrUE_params.Tpool), false);
|
if (getenv("noThreads")) {
|
||||||
free(params);
|
initTpool("n", &(nrUE_params.Tpool), false);
|
||||||
init_dlsch_tpool( nun_dlsch_threads);
|
init_dlsch_tpool(0);
|
||||||
|
} else {
|
||||||
|
initTpool(params, &(nrUE_params.Tpool), false);
|
||||||
|
init_dlsch_tpool( nun_dlsch_threads);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
static void get_options(void) {
|
static void get_options(void) {
|
||||||
|
|
||||||
|
|||||||
@@ -53,7 +53,6 @@ extern "C"
|
|||||||
|
|
||||||
|
|
||||||
#define CONFIG_HLP_DUMPFRAME "dump UE received frame to rxsig_frame0.dat and exit\n"
|
#define CONFIG_HLP_DUMPFRAME "dump UE received frame to rxsig_frame0.dat and exit\n"
|
||||||
#define CONFIG_HLP_UELOOP "get softmodem (UE) to loop through memory instead of acquiring from HW\n"
|
|
||||||
#define CONFIG_HLP_PHYTST "test UE phy layer, mac disabled\n"
|
#define CONFIG_HLP_PHYTST "test UE phy layer, mac disabled\n"
|
||||||
#define CONFIG_HLP_DORA "test gNB and UE with RA procedures\n"
|
#define CONFIG_HLP_DORA "test gNB and UE with RA procedures\n"
|
||||||
#define CONFIG_HLP_SA "run gNB in standalone mode\n"
|
#define CONFIG_HLP_SA "run gNB in standalone mode\n"
|
||||||
|
|||||||
@@ -200,7 +200,6 @@ void install_nr_schedule_handlers(NR_IF_Module_t *if_inst);
|
|||||||
void install_schedule_handlers(IF_Module_t *if_inst);
|
void install_schedule_handlers(IF_Module_t *if_inst);
|
||||||
extern int single_thread_flag;
|
extern int single_thread_flag;
|
||||||
extern uint16_t sf_ahead;
|
extern uint16_t sf_ahead;
|
||||||
extern uint16_t slot_ahead;
|
|
||||||
|
|
||||||
void oai_create_enb(void) {
|
void oai_create_enb(void) {
|
||||||
int bodge_counter=0;
|
int bodge_counter=0;
|
||||||
@@ -459,6 +458,7 @@ int wake_gNB_rxtx(PHY_VARS_gNB *gNB, uint16_t sfn, uint16_t slot) {
|
|||||||
//wait.tv_nsec = 0;
|
//wait.tv_nsec = 0;
|
||||||
// wake up TX for subframe n+sf_ahead
|
// wake up TX for subframe n+sf_ahead
|
||||||
// lock the TX mutex and make sure the thread is ready
|
// lock the TX mutex and make sure the thread is ready
|
||||||
|
AssertFatal(gNB->if_inst->sl_ahead==6,"gNB->if_inst->sl_ahead %d : This is hard-coded to 6 in nfapi P7!!!\n",gNB->if_inst->sl_ahead);
|
||||||
if (pthread_mutex_timedlock(&L1_proc->mutex,&wait) != 0) {
|
if (pthread_mutex_timedlock(&L1_proc->mutex,&wait) != 0) {
|
||||||
LOG_E( PHY, "[gNB] ERROR pthread_mutex_lock for gNB RXTX thread %d (IC %d)\n", L1_proc->slot_rx&1,L1_proc->instance_cnt );
|
LOG_E( PHY, "[gNB] ERROR pthread_mutex_lock for gNB RXTX thread %d (IC %d)\n", L1_proc->slot_rx&1,L1_proc->instance_cnt );
|
||||||
exit_fun( "error locking mutex_rxtx" );
|
exit_fun( "error locking mutex_rxtx" );
|
||||||
@@ -485,11 +485,11 @@ int wake_gNB_rxtx(PHY_VARS_gNB *gNB, uint16_t sfn, uint16_t slot) {
|
|||||||
// The last (TS_rx mod samples_per_frame) was n*samples_per_tti,
|
// The last (TS_rx mod samples_per_frame) was n*samples_per_tti,
|
||||||
// we want to generate subframe (n+N), so TS_tx = TX_rx+N*samples_per_tti,
|
// we want to generate subframe (n+N), so TS_tx = TX_rx+N*samples_per_tti,
|
||||||
// and proc->subframe_tx = proc->subframe_rx+sf_ahead
|
// and proc->subframe_tx = proc->subframe_rx+sf_ahead
|
||||||
L1_proc->timestamp_tx = proc->timestamp_rx + (slot_ahead *fp->samples_per_subframe);
|
L1_proc->timestamp_tx = proc->timestamp_rx + (gNB->if_inst->sl_ahead *fp->samples_per_subframe);
|
||||||
L1_proc->frame_rx = proc->frame_rx;
|
L1_proc->frame_rx = proc->frame_rx;
|
||||||
L1_proc->slot_rx = proc->slot_rx;
|
L1_proc->slot_rx = proc->slot_rx;
|
||||||
L1_proc->frame_tx = (L1_proc->slot_rx > (19-slot_ahead)) ? (L1_proc->frame_rx+1)&1023 : L1_proc->frame_rx;
|
L1_proc->frame_tx = (L1_proc->slot_rx > (19-gNB->if_inst->sl_ahead)) ? (L1_proc->frame_rx+1)&1023 : L1_proc->frame_rx;
|
||||||
L1_proc->slot_tx = (L1_proc->slot_rx + slot_ahead)%20;
|
L1_proc->slot_tx = (L1_proc->slot_rx + gNB->if_inst->sl_ahead)%20;
|
||||||
|
|
||||||
//LOG_D(PHY, "sfn/sf:%d%d proc[rx:%d%d] rx:%d%d] About to wake rxtx thread\n\n", sfn, slot, proc->frame_rx, proc->slot_rx, L1_proc->frame_rx, L1_proc->slot_rx);
|
//LOG_D(PHY, "sfn/sf:%d%d proc[rx:%d%d] rx:%d%d] About to wake rxtx thread\n\n", sfn, slot, proc->frame_rx, proc->slot_rx, L1_proc->frame_rx, L1_proc->slot_rx);
|
||||||
//NFAPI_TRACE(NFAPI_TRACE_INFO, "\nEntering wake_gNB_rxtx sfn %d slot %d\n",L1_proc->frame_rx,L1_proc->slot_rx);
|
//NFAPI_TRACE(NFAPI_TRACE_INFO, "\nEntering wake_gNB_rxtx sfn %d slot %d\n",L1_proc->frame_rx,L1_proc->slot_rx);
|
||||||
|
|||||||
@@ -32,7 +32,6 @@
|
|||||||
#define FAPI2_IP_DSCP 0
|
#define FAPI2_IP_DSCP 0
|
||||||
|
|
||||||
extern uint16_t sf_ahead;
|
extern uint16_t sf_ahead;
|
||||||
extern uint16_t slot_ahead;
|
|
||||||
|
|
||||||
//uint16_t sf_ahead=4;
|
//uint16_t sf_ahead=4;
|
||||||
|
|
||||||
@@ -933,7 +932,7 @@ int pnf_p7_slot_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn, uint16_t sl
|
|||||||
|
|
||||||
// save the curren time, sfn and slot
|
// save the curren time, sfn and slot
|
||||||
pnf_p7->slot_start_time_hr = pnf_get_current_time_hr();
|
pnf_p7->slot_start_time_hr = pnf_get_current_time_hr();
|
||||||
slot_ahead = 6;
|
int slot_ahead = 6;
|
||||||
uint32_t sfn_slot_tx = sfnslot_add_slot(sfn, slot, slot_ahead);
|
uint32_t sfn_slot_tx = sfnslot_add_slot(sfn, slot, slot_ahead);
|
||||||
uint16_t sfn_tx = NFAPI_SFNSLOT2SFN(sfn_slot_tx);
|
uint16_t sfn_tx = NFAPI_SFNSLOT2SFN(sfn_slot_tx);
|
||||||
uint8_t slot_tx = NFAPI_SFNSLOT2SLOT(sfn_slot_tx);
|
uint8_t slot_tx = NFAPI_SFNSLOT2SLOT(sfn_slot_tx);
|
||||||
|
|||||||
@@ -307,62 +307,76 @@ void nr_interleaving_ldpc(uint32_t E, uint8_t Qm, uint8_t *e,uint8_t *f)
|
|||||||
|
|
||||||
|
|
||||||
void nr_deinterleaving_ldpc(uint32_t E, uint8_t Qm, int16_t *e,int16_t *f)
|
void nr_deinterleaving_ldpc(uint32_t E, uint8_t Qm, int16_t *e,int16_t *f)
|
||||||
{
|
{
|
||||||
|
|
||||||
int16_t *e1,*e2,*e3,*e4,*e5,*e6,*e7;
|
|
||||||
switch(Qm) {
|
switch(Qm) {
|
||||||
case 2:
|
case 2:
|
||||||
e1=e+(E/2);
|
{
|
||||||
for (int j = 0,j2=0; j< E/2; j+=2,j2+=4){
|
AssertFatal(E%2==0,"");
|
||||||
e[j] = f[j2];
|
int16_t *e1=e+(E/2);
|
||||||
e1[j] = f[j2+1];
|
int16_t *end=f+E-1;
|
||||||
e[j+1] = f[j2+2];
|
while( f<end ){
|
||||||
e1[j+1] = f[j2+3];
|
*e++ = *f++;
|
||||||
|
*e1++ = *f++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
e1=e+(E/4);
|
{
|
||||||
e2=e1+(E/4);
|
AssertFatal(E%4==0,"");
|
||||||
e3=e2+(E/4);
|
int16_t *e1=e+(E/4);
|
||||||
for (int j = 0,j2=0; j< E/4; j++,j2+=4){
|
int16_t *e2=e1+(E/4);
|
||||||
e[j] = f[j2];
|
int16_t *e3=e2+(E/4);
|
||||||
e1[j] = f[j2+1];
|
int16_t *end=f+E-3;
|
||||||
e2[j] = f[j2+2];
|
while( f<end ){
|
||||||
e3[j] = f[j2+3];
|
*e++ = *f++;
|
||||||
|
*e1++ = *f++;
|
||||||
|
*e2++ = *f++;
|
||||||
|
*e3++ = *f++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 6:
|
case 6:
|
||||||
e1=e+(E/6);
|
{
|
||||||
e2=e1+(E/6);
|
AssertFatal(E%6==0,"");
|
||||||
e3=e2+(E/6);
|
int16_t *e1=e+(E/6);
|
||||||
e4=e3+(E/6);
|
int16_t *e2=e1+(E/6);
|
||||||
e5=e4+(E/6);
|
int16_t *e3=e2+(E/6);
|
||||||
for (int j = 0,j2=0; j< E/6; j++,j2+=6){
|
int16_t *e4=e3+(E/6);
|
||||||
e[j] = f[j2];
|
int16_t *e5=e4+(E/6);
|
||||||
e1[j] = f[j2+1];
|
int16_t *end=f+E-5;
|
||||||
e2[j] = f[j2+2];
|
while( f<end ){
|
||||||
e3[j] = f[j2+3];
|
*e++ = *f++;
|
||||||
e4[j] = f[j2+4];
|
*e1++ = *f++;
|
||||||
e5[j] = f[j2+5];
|
*e2++ = *f++;
|
||||||
|
*e3++ = *f++;
|
||||||
|
*e4++ = *f++;
|
||||||
|
*e5++ = *f++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 8:
|
case 8:
|
||||||
e1=e+(E/8);
|
{
|
||||||
e2=e1+(E/8);
|
AssertFatal(E%8==0,"");
|
||||||
e3=e2+(E/8);
|
int16_t *e1=e+(E/8);
|
||||||
e4=e3+(E/8);
|
int16_t *e2=e1+(E/8);
|
||||||
e5=e4+(E/8);
|
int16_t *e3=e2+(E/8);
|
||||||
e6=e5+(E/8);
|
int16_t *e4=e3+(E/8);
|
||||||
e7=e6+(E/8);
|
int16_t *e5=e4+(E/8);
|
||||||
for (int j = 0,j2=0; j< E/8; j++,j2+=8){
|
int16_t *e6=e5+(E/8);
|
||||||
e[j] = f[j2];
|
int16_t *e7=e6+(E/8);
|
||||||
e1[j] = f[j2+1];
|
int16_t *end=f+E-7;
|
||||||
e2[j] = f[j2+2];
|
while( f<end ){
|
||||||
e3[j] = f[j2+3];
|
*e++ = *f++;
|
||||||
e4[j] = f[j2+4];
|
*e1++ = *f++;
|
||||||
e5[j] = f[j2+5];
|
*e2++ = *f++;
|
||||||
e6[j] = f[j2+6];
|
*e3++ = *f++;
|
||||||
e7[j] = f[j2+7];
|
*e4++ = *f++;
|
||||||
|
*e5++ = *f++;
|
||||||
|
*e6++ = *f++;
|
||||||
|
*e7++ = *f++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@@ -409,7 +423,7 @@ int nr_rate_matching_ldpc(uint8_t Ilbrm,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (Foffset > E) {
|
if (Foffset > E) {
|
||||||
LOG_E(PHY,"nr_rate_matching: invalid parameters (Foffset %d > E %d)\n",Foffset,E);
|
LOG_E(PHY,"nr_rate_matching: invalid parameters (Foffset %d > E %d) F %d, k0 %d, Ncb %d, rvidx %d, Ilbrm %d\n",Foffset,E,F, ind, Ncb, rvidx, Ilbrm);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (Foffset > Ncb) {
|
if (Foffset > Ncb) {
|
||||||
|
|||||||
@@ -87,7 +87,7 @@ if ((Kprime%Kb) > 0)
|
|||||||
else
|
else
|
||||||
Z = (Kprime/Kb);
|
Z = (Kprime/Kb);
|
||||||
|
|
||||||
LOG_D(PHY,"nr segmetation B %u Bprime %u Kprime %u z %u \n", B, Bprime, Kprime, Z);
|
LOG_D(PHY,"nr segmentation B %u Bprime %u Kprime %u z %u \n", B, Bprime, Kprime, Z);
|
||||||
|
|
||||||
if (Z <= 2) {
|
if (Z <= 2) {
|
||||||
*K = 2;
|
*K = 2;
|
||||||
|
|||||||
@@ -359,6 +359,7 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB)
|
|||||||
ue->nr_srs_info->srs_estimated_channel_time_shifted[i] = (int32_t *) malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t));
|
ue->nr_srs_info->srs_estimated_channel_time_shifted[i] = (int32_t *) malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// RACH
|
// RACH
|
||||||
prach_vars[gNB_id]->prachF = (int16_t *)malloc16_clear( sizeof(int)*(7*2*sizeof(int)*(fp->ofdm_symbol_size*12)) );
|
prach_vars[gNB_id]->prachF = (int16_t *)malloc16_clear( sizeof(int)*(7*2*sizeof(int)*(fp->ofdm_symbol_size*12)) );
|
||||||
prach_vars[gNB_id]->prach = (int16_t *)malloc16_clear( sizeof(int)*(7*2*sizeof(int)*(fp->ofdm_symbol_size*12)) );
|
prach_vars[gNB_id]->prach = (int16_t *)malloc16_clear( sizeof(int)*(7*2*sizeof(int)*(fp->ofdm_symbol_size*12)) );
|
||||||
@@ -455,6 +456,7 @@ void term_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB)
|
|||||||
for (int gNB_id = 0; gNB_id < ue->n_connected_gNB; gNB_id++) {
|
for (int gNB_id = 0; gNB_id < ue->n_connected_gNB; gNB_id++) {
|
||||||
|
|
||||||
for (int th_id = 0; th_id < RX_NB_TH_MAX; th_id++) {
|
for (int th_id = 0; th_id < RX_NB_TH_MAX; th_id++) {
|
||||||
|
|
||||||
free_and_zero(ue->pdcch_vars[th_id][gNB_id]);
|
free_and_zero(ue->pdcch_vars[th_id][gNB_id]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -366,8 +366,10 @@ int nr_init_frame_parms_ue(NR_DL_FRAME_PARMS *fp,
|
|||||||
|
|
||||||
uint8_t sco = 0;
|
uint8_t sco = 0;
|
||||||
if (((fp->freq_range == nr_FR1) && (config->ssb_table.ssb_subcarrier_offset<24)) ||
|
if (((fp->freq_range == nr_FR1) && (config->ssb_table.ssb_subcarrier_offset<24)) ||
|
||||||
((fp->freq_range == nr_FR2) && (config->ssb_table.ssb_subcarrier_offset<12)) )
|
((fp->freq_range == nr_FR2) && (config->ssb_table.ssb_subcarrier_offset<12)) ) {
|
||||||
sco = config->ssb_table.ssb_subcarrier_offset;
|
if (fp->freq_range == nr_FR1)
|
||||||
|
sco = config->ssb_table.ssb_subcarrier_offset>>config->ssb_config.scs_common;
|
||||||
|
}
|
||||||
|
|
||||||
fp->ssb_start_subcarrier = (12 * config->ssb_table.ssb_offset_point_a + sco);
|
fp->ssb_start_subcarrier = (12 * config->ssb_table.ssb_offset_point_a + sco);
|
||||||
set_Lmax(fp);
|
set_Lmax(fp);
|
||||||
|
|||||||
@@ -102,7 +102,7 @@ int lte_est_freq_offset(int **dl_ch_estimates,
|
|||||||
{
|
{
|
||||||
|
|
||||||
int ch_offset, omega, dl_ch_shift;
|
int ch_offset, omega, dl_ch_shift;
|
||||||
struct complex16 omega_cpx;
|
c16_t omega_cpx;
|
||||||
double phase_offset;
|
double phase_offset;
|
||||||
int freq_offset_est;
|
int freq_offset_est;
|
||||||
unsigned char aa;
|
unsigned char aa;
|
||||||
@@ -142,8 +142,8 @@ int lte_est_freq_offset(int **dl_ch_estimates,
|
|||||||
// printf("Computing freq_offset\n");
|
// printf("Computing freq_offset\n");
|
||||||
omega = dot_product(dl_ch,dl_ch_prev,(frame_parms->N_RB_DL/2 - 1)*12,dl_ch_shift);
|
omega = dot_product(dl_ch,dl_ch_prev,(frame_parms->N_RB_DL/2 - 1)*12,dl_ch_shift);
|
||||||
//omega = dot_product(dl_ch,dl_ch_prev,frame_parms->ofdm_symbol_size,15);
|
//omega = dot_product(dl_ch,dl_ch_prev,frame_parms->ofdm_symbol_size,15);
|
||||||
omega_cpx.r = ((struct complex16*) &omega)->r;
|
omega_cpx.r = ((c16_t*) &omega)->r;
|
||||||
omega_cpx.i = ((struct complex16*) &omega)->i;
|
omega_cpx.i = ((c16_t*) &omega)->i;
|
||||||
|
|
||||||
dl_ch = (int16_t *)&dl_ch_estimates[aa][(((frame_parms->N_RB_DL/2) + 1)*12) + ch_offset];
|
dl_ch = (int16_t *)&dl_ch_estimates[aa][(((frame_parms->N_RB_DL/2) + 1)*12) + ch_offset];
|
||||||
|
|
||||||
@@ -155,8 +155,8 @@ int lte_est_freq_offset(int **dl_ch_estimates,
|
|||||||
// calculate omega = angle(conj(dl_ch)*dl_ch_prev))
|
// calculate omega = angle(conj(dl_ch)*dl_ch_prev))
|
||||||
omega = dot_product(dl_ch,dl_ch_prev,((frame_parms->N_RB_DL/2) - 1)*12,dl_ch_shift);
|
omega = dot_product(dl_ch,dl_ch_prev,((frame_parms->N_RB_DL/2) - 1)*12,dl_ch_shift);
|
||||||
|
|
||||||
omega_cpx.r += ((struct complex16*) &omega)->r;
|
omega_cpx.r += ((c16_t*) &omega)->r;
|
||||||
omega_cpx.i += ((struct complex16*) &omega)->i;
|
omega_cpx.i += ((c16_t*) &omega)->i;
|
||||||
|
|
||||||
// phase_offset += atan2((double)omega_cpx->i,(double)omega_cpx->r);
|
// phase_offset += atan2((double)omega_cpx->i,(double)omega_cpx->r);
|
||||||
phase_offset += atan2((double)omega_cpx.i,(double)omega_cpx.r);
|
phase_offset += atan2((double)omega_cpx.i,(double)omega_cpx.r);
|
||||||
@@ -195,7 +195,7 @@ int lte_mbsfn_est_freq_offset(int **dl_ch_estimates,
|
|||||||
{
|
{
|
||||||
|
|
||||||
int ch_offset, omega, dl_ch_shift;
|
int ch_offset, omega, dl_ch_shift;
|
||||||
struct complex16 *omega_cpx;
|
c16_t *omega_cpx;
|
||||||
double phase_offset;
|
double phase_offset;
|
||||||
int freq_offset_est;
|
int freq_offset_est;
|
||||||
unsigned char aa;
|
unsigned char aa;
|
||||||
@@ -234,7 +234,7 @@ int lte_mbsfn_est_freq_offset(int **dl_ch_estimates,
|
|||||||
// printf("Computing freq_offset\n");
|
// printf("Computing freq_offset\n");
|
||||||
omega = dot_product(dl_ch,dl_ch_prev,(frame_parms->N_RB_DL/2 - 1)*12,dl_ch_shift);
|
omega = dot_product(dl_ch,dl_ch_prev,(frame_parms->N_RB_DL/2 - 1)*12,dl_ch_shift);
|
||||||
//omega = dot_product(dl_ch,dl_ch_prev,frame_parms->ofdm_symbol_size,15);
|
//omega = dot_product(dl_ch,dl_ch_prev,frame_parms->ofdm_symbol_size,15);
|
||||||
omega_cpx = (struct complex16*) ω
|
omega_cpx = (c16_t*) ω
|
||||||
|
|
||||||
// printf("omega (%d,%d)\n",omega_cpx->r,omega_cpx->i);
|
// printf("omega (%d,%d)\n",omega_cpx->r,omega_cpx->i);
|
||||||
|
|
||||||
@@ -247,8 +247,8 @@ int lte_mbsfn_est_freq_offset(int **dl_ch_estimates,
|
|||||||
|
|
||||||
// calculate omega = angle(conj(dl_ch)*dl_ch_prev))
|
// calculate omega = angle(conj(dl_ch)*dl_ch_prev))
|
||||||
omega = dot_product(dl_ch,dl_ch_prev,((frame_parms->N_RB_DL/2) - 1)*12,dl_ch_shift);
|
omega = dot_product(dl_ch,dl_ch_prev,((frame_parms->N_RB_DL/2) - 1)*12,dl_ch_shift);
|
||||||
omega_cpx->r += ((struct complex16*) &omega)->r;
|
omega_cpx->r += ((c16_t*) &omega)->r;
|
||||||
omega_cpx->i += ((struct complex16*) &omega)->i;
|
omega_cpx->i += ((c16_t*) &omega)->i;
|
||||||
// phase_offset += atan2((double)omega_cpx->i,(double)omega_cpx->r);
|
// phase_offset += atan2((double)omega_cpx->i,(double)omega_cpx->r);
|
||||||
phase_offset += atan2((double)omega_cpx->i,(double)omega_cpx->r);
|
phase_offset += atan2((double)omega_cpx->i,(double)omega_cpx->r);
|
||||||
// printf("omega (%d,%d) -> %f\n",omega_cpx->r,omega_cpx->i,phase_offset);
|
// printf("omega (%d,%d) -> %f\n",omega_cpx->r,omega_cpx->i,phase_offset);
|
||||||
|
|||||||
@@ -34,9 +34,9 @@
|
|||||||
// Note: this is for prototype of generate_drs_pusch (OTA synchronization of RRUs)
|
// Note: this is for prototype of generate_drs_pusch (OTA synchronization of RRUs)
|
||||||
#include "PHY/LTE_UE_TRANSPORT/transport_proto_ue.h"
|
#include "PHY/LTE_UE_TRANSPORT/transport_proto_ue.h"
|
||||||
|
|
||||||
static struct complex16 *primary_synch0_time __attribute__((aligned(32)));
|
static c16_t *primary_synch0_time __attribute__((aligned(32)));
|
||||||
static struct complex16 *primary_synch1_time __attribute__((aligned(32)));
|
static c16_t *primary_synch1_time __attribute__((aligned(32)));
|
||||||
static struct complex16 *primary_synch2_time __attribute__((aligned(32)));
|
static c16_t *primary_synch2_time __attribute__((aligned(32)));
|
||||||
|
|
||||||
static void doIdft(int size, short *in, short *out) {
|
static void doIdft(int size, short *in, short *out) {
|
||||||
switch (size) {
|
switch (size) {
|
||||||
@@ -67,7 +67,7 @@ static void doIdft(int size, short *in, short *out) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void copyPrimary( struct complex16 *out, struct complex16 *in, int ofdmSize) {
|
static void copyPrimary( c16_t *out, struct complex16 *in, int ofdmSize) {
|
||||||
int k=ofdmSize-36;
|
int k=ofdmSize-36;
|
||||||
|
|
||||||
for (int i=0; i<72; i++) {
|
for (int i=0; i<72; i++) {
|
||||||
@@ -83,20 +83,20 @@ static void copyPrimary( struct complex16 *out, struct complex16 *in, int ofdmSi
|
|||||||
}
|
}
|
||||||
|
|
||||||
int lte_sync_time_init(LTE_DL_FRAME_PARMS *frame_parms ) { // LTE_UE_COMMON *common_vars
|
int lte_sync_time_init(LTE_DL_FRAME_PARMS *frame_parms ) { // LTE_UE_COMMON *common_vars
|
||||||
struct complex16 syncF_tmp[2048]__attribute__((aligned(32)))= {{0}};
|
c16_t syncF_tmp[2048]__attribute__((aligned(32)))= {{0}};
|
||||||
int sz=frame_parms->ofdm_symbol_size*sizeof(*primary_synch0_time);
|
int sz=frame_parms->ofdm_symbol_size*sizeof(*primary_synch0_time);
|
||||||
AssertFatal( NULL != (primary_synch0_time = (struct complex16 *)malloc16(sz)),"");
|
AssertFatal( NULL != (primary_synch0_time = (c16_t *)malloc16(sz)),"");
|
||||||
bzero(primary_synch0_time,sz);
|
bzero(primary_synch0_time,sz);
|
||||||
AssertFatal( NULL != (primary_synch1_time = (struct complex16 *)malloc16(sz)),"");
|
AssertFatal( NULL != (primary_synch1_time = (c16_t *)malloc16(sz)),"");
|
||||||
bzero(primary_synch1_time,sz);
|
bzero(primary_synch1_time,sz);
|
||||||
AssertFatal( NULL != (primary_synch2_time = (struct complex16 *)malloc16(sz)),"");
|
AssertFatal( NULL != (primary_synch2_time = (c16_t *)malloc16(sz)),"");
|
||||||
bzero(primary_synch2_time,sz);
|
bzero(primary_synch2_time,sz);
|
||||||
// generate oversampled sync_time sequences
|
// generate oversampled sync_time sequences
|
||||||
copyPrimary( syncF_tmp, (struct complex16 *) primary_synch0, frame_parms->ofdm_symbol_size);
|
copyPrimary( syncF_tmp, (c16_t *) primary_synch0, frame_parms->ofdm_symbol_size);
|
||||||
doIdft(frame_parms->N_RB_DL, (short *)syncF_tmp,(short *)primary_synch0_time);
|
doIdft(frame_parms->N_RB_DL, (short *)syncF_tmp,(short *)primary_synch0_time);
|
||||||
copyPrimary( syncF_tmp, (struct complex16 *) primary_synch1, frame_parms->ofdm_symbol_size);
|
copyPrimary( syncF_tmp, (c16_t *) primary_synch1, frame_parms->ofdm_symbol_size);
|
||||||
doIdft(frame_parms->N_RB_DL, (short *)syncF_tmp,(short *)primary_synch1_time);
|
doIdft(frame_parms->N_RB_DL, (short *)syncF_tmp,(short *)primary_synch1_time);
|
||||||
copyPrimary( syncF_tmp, (struct complex16 *) primary_synch2, frame_parms->ofdm_symbol_size);
|
copyPrimary( syncF_tmp, (c16_t *) primary_synch2, frame_parms->ofdm_symbol_size);
|
||||||
doIdft(frame_parms->N_RB_DL, (short *)syncF_tmp,(short *)primary_synch2_time);
|
doIdft(frame_parms->N_RB_DL, (short *)syncF_tmp,(short *)primary_synch2_time);
|
||||||
|
|
||||||
if ( LOG_DUMPFLAG(DEBUG_LTEESTIM)){
|
if ( LOG_DUMPFLAG(DEBUG_LTEESTIM)){
|
||||||
|
|||||||
@@ -2237,7 +2237,7 @@ int dlsch_modulation(PHY_VARS_eNB* phy_vars_eNB,
|
|||||||
int P1_SHIFT[13],P2_SHIFT[13];
|
int P1_SHIFT[13],P2_SHIFT[13];
|
||||||
int offset,nushiftmod3;
|
int offset,nushiftmod3;
|
||||||
|
|
||||||
uint8_t get_pmi_temp;
|
int get_pmi_temp;
|
||||||
|
|
||||||
MIMO_mode_t mimo_mode = -1;
|
MIMO_mode_t mimo_mode = -1;
|
||||||
uint8_t mprime=0,Ns;
|
uint8_t mprime=0,Ns;
|
||||||
|
|||||||
@@ -1052,7 +1052,7 @@ static inline int64_t clock_difftime_ns(struct timespec start, struct timespec e
|
|||||||
void send_IF5(RU_t *ru, openair0_timestamp proc_timestamp, int tti, uint8_t *seqno, uint16_t packet_type) {
|
void send_IF5(RU_t *ru, openair0_timestamp proc_timestamp, int tti, uint8_t *seqno, uint16_t packet_type) {
|
||||||
|
|
||||||
LTE_DL_FRAME_PARMS *fp=ru->frame_parms;
|
LTE_DL_FRAME_PARMS *fp=ru->frame_parms;
|
||||||
int32_t *txp[fp->nb_antennas_tx], *rxp[fp->nb_antennas_rx];
|
int32_t *txp[ru->nb_tx], *rxp[ru->nb_rx];
|
||||||
int32_t *tx_buffer=NULL;
|
int32_t *tx_buffer=NULL;
|
||||||
uint16_t packet_id=0, i=0;
|
uint16_t packet_id=0, i=0;
|
||||||
|
|
||||||
@@ -1106,9 +1106,9 @@ void send_IF5(RU_t *ru, openair0_timestamp proc_timestamp, int tti, uint8_t *seq
|
|||||||
|
|
||||||
NR_DL_FRAME_PARMS *nrfp = ru->nr_frame_parms;
|
NR_DL_FRAME_PARMS *nrfp = ru->nr_frame_parms;
|
||||||
|
|
||||||
int offset,siglen;
|
int offset,siglen,factor=1;
|
||||||
if (nrfp) {
|
if (nrfp) {
|
||||||
offset = nrfp->get_samples_slot_timestamp(tti,nrfp,0);
|
offset = nrfp->get_samples_slot_timestamp(tti,nrfp,0);
|
||||||
siglen = nrfp->get_samples_per_slot(tti,nrfp);
|
siglen = nrfp->get_samples_per_slot(tti,nrfp);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -1116,6 +1116,13 @@ void send_IF5(RU_t *ru, openair0_timestamp proc_timestamp, int tti, uint8_t *seq
|
|||||||
siglen = spsf;
|
siglen = spsf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ru->openair0_cfg.nr_flag==1) {
|
||||||
|
if (nrfp->N_RB_DL <= 162 && nrfp->N_RB_DL >= 106) factor = 2;
|
||||||
|
else if (nrfp->N_RB_DL < 106) factor=4;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
factor = 30720/spsf;
|
||||||
|
}
|
||||||
for (i=0; i < ru->nb_tx; i++)
|
for (i=0; i < ru->nb_tx; i++)
|
||||||
txp[i] = (int32_t*)&ru->common.txdata[i][offset];
|
txp[i] = (int32_t*)&ru->common.txdata[i][offset];
|
||||||
|
|
||||||
@@ -1124,8 +1131,9 @@ void send_IF5(RU_t *ru, openair0_timestamp proc_timestamp, int tti, uint8_t *seq
|
|||||||
//VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SEND_IF5_PKT_ID, packet_id );
|
//VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SEND_IF5_PKT_ID, packet_id );
|
||||||
//VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_IF0, 1 );
|
//VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_IF0, 1 );
|
||||||
clock_gettime( CLOCK_MONOTONIC, &start_comp);
|
clock_gettime( CLOCK_MONOTONIC, &start_comp);
|
||||||
|
|
||||||
ru->ifdevice.trx_write_func2(&ru->ifdevice,
|
ru->ifdevice.trx_write_func2(&ru->ifdevice,
|
||||||
(proc_timestamp + packet_id*spp_eth-500)*(30720/spsf),
|
(proc_timestamp + packet_id*spp_eth-600)*factor,
|
||||||
(void*)txp[aid],
|
(void*)txp[aid],
|
||||||
spp_eth,
|
spp_eth,
|
||||||
aid,
|
aid,
|
||||||
@@ -1326,6 +1334,8 @@ void recv_IF5(RU_t *ru, openair0_timestamp *proc_timestamp, int tti, uint16_t pa
|
|||||||
NR_DL_FRAME_PARMS *nrfp = ru->nr_frame_parms;
|
NR_DL_FRAME_PARMS *nrfp = ru->nr_frame_parms;
|
||||||
|
|
||||||
int offset,siglen;
|
int offset,siglen;
|
||||||
|
int factor=1;
|
||||||
|
int ts_offset;
|
||||||
if (nrfp) {
|
if (nrfp) {
|
||||||
offset = nrfp->get_samples_slot_timestamp(tti,nrfp,0);
|
offset = nrfp->get_samples_slot_timestamp(tti,nrfp,0);
|
||||||
siglen = nrfp->get_samples_per_slot(tti,nrfp);
|
siglen = nrfp->get_samples_per_slot(tti,nrfp);
|
||||||
@@ -1334,6 +1344,15 @@ void recv_IF5(RU_t *ru, openair0_timestamp *proc_timestamp, int tti, uint16_t pa
|
|||||||
offset = tti*fp->samples_per_subframe;
|
offset = tti*fp->samples_per_subframe;
|
||||||
siglen = spsf;
|
siglen = spsf;
|
||||||
}
|
}
|
||||||
|
if (ru->openair0_cfg.nr_flag==1) { // This check if RRU knows about NR numerologies
|
||||||
|
if (nrfp->N_RB_DL <= 162 && nrfp->N_RB_DL >= 106) factor = 2;
|
||||||
|
else if (nrfp->N_RB_DL < 106) factor=4;
|
||||||
|
ts_offset = 64;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
factor = 30720/spsf;
|
||||||
|
ts_offset = 256;
|
||||||
|
}
|
||||||
for (i=0; i < ru->nb_rx; i++)
|
for (i=0; i < ru->nb_rx; i++)
|
||||||
rxp[i] = &ru->common.rxdata[i][offset];
|
rxp[i] = &ru->common.rxdata[i][offset];
|
||||||
int aid;
|
int aid;
|
||||||
@@ -1352,12 +1371,12 @@ void recv_IF5(RU_t *ru, openair0_timestamp *proc_timestamp, int tti, uint16_t pa
|
|||||||
&aid);
|
&aid);
|
||||||
clock_gettime( CLOCK_MONOTONIC, &if_time);
|
clock_gettime( CLOCK_MONOTONIC, &if_time);
|
||||||
timeout[packet_id] = if_time.tv_nsec;
|
timeout[packet_id] = if_time.tv_nsec;
|
||||||
timestamp[packet_id] /= (30720/spsf);
|
timestamp[packet_id] /= factor; // for LTE this is the sample rate reduction w.r.t 30.72, for NR 122.88
|
||||||
LOG_D(PHY,"TTI %d: Received packet %d: aid %d, TS %llu, oldTS %llu, diff %lld, \n",tti,packet_id,aid,(unsigned long long)timestamp[packet_id],(unsigned long long)oldTS,(unsigned long long)(timestamp[packet_id]-timestamp[0]));
|
LOG_D(PHY,"TTI %d: factor = %d Received packet %d: aid %d, TS %llu, oldTS %llu, diff %lld, \n",tti,factor,packet_id,aid,(unsigned long long)timestamp[packet_id],(unsigned long long)oldTS,(unsigned long long)(timestamp[packet_id]-timestamp[0]));
|
||||||
|
|
||||||
if (aid==0) {
|
if (aid==0) {
|
||||||
if (firstTS==1) firstTS=0;
|
if (firstTS==1) firstTS=0;
|
||||||
else if (oldTS + 256 != timestamp[packet_id]) {
|
else if (oldTS + ts_offset != timestamp[packet_id]) {
|
||||||
LOG_I(PHY,"oldTS %llu, newTS %llu, diff %llu, timein %lu, timeout %lu\n",(long long unsigned int)oldTS,(long long unsigned int)timestamp[packet_id],(long long unsigned int)timestamp[packet_id]-oldTS,timein[packet_id],timeout[packet_id]);
|
LOG_I(PHY,"oldTS %llu, newTS %llu, diff %llu, timein %lu, timeout %lu\n",(long long unsigned int)oldTS,(long long unsigned int)timestamp[packet_id],(long long unsigned int)timestamp[packet_id]-oldTS,timein[packet_id],timeout[packet_id]);
|
||||||
for (int i=0;i<=packet_id;i++) LOG_I(PHY,"packet %d TS %llu, timein %lu, timeout %lu\n",i,(long long unsigned int)timestamp[i],timein[i],timeout[i]);
|
for (int i=0;i<=packet_id;i++) LOG_I(PHY,"packet %d TS %llu, timein %lu, timeout %lu\n",i,(long long unsigned int)timestamp[i],timein[i],timeout[i]);
|
||||||
AssertFatal(1==0,"fronthaul problem\n");
|
AssertFatal(1==0,"fronthaul problem\n");
|
||||||
@@ -1369,7 +1388,7 @@ void recv_IF5(RU_t *ru, openair0_timestamp *proc_timestamp, int tti, uint16_t pa
|
|||||||
|
|
||||||
// HYPOTHESIS: first packet per subframe has lowest timestamp of subframe
|
// HYPOTHESIS: first packet per subframe has lowest timestamp of subframe
|
||||||
// should detect out of order and act accordingly ....
|
// should detect out of order and act accordingly ....
|
||||||
AssertFatal(aid==0 || aid==1,"aid %d != 0 or 1\n",aid);
|
AssertFatal(aid==0 || aid==1 || aid==2 || aid==3,"aid %d != 0,1,2 or 3\n",aid);
|
||||||
LOG_D(PHY,"rxp[%d] %p, dest %p, offset %d (%llu,%llu)\n",aid,rxp[aid],rxp[aid]+(timestamp[packet_id]-timestamp[0]),(int)(timestamp[packet_id]-timestamp[0]),(long long unsigned int)timestamp[packet_id],(long long unsigned int)timestamp[0]);
|
LOG_D(PHY,"rxp[%d] %p, dest %p, offset %d (%llu,%llu)\n",aid,rxp[aid],rxp[aid]+(timestamp[packet_id]-timestamp[0]),(int)(timestamp[packet_id]-timestamp[0]),(long long unsigned int)timestamp[packet_id],(long long unsigned int)timestamp[0]);
|
||||||
memcpy((void*)(rxp[aid]+(timestamp[packet_id]-timestamp[0])),
|
memcpy((void*)(rxp[aid]+(timestamp[packet_id]-timestamp[0])),
|
||||||
(void*)temp_rx,
|
(void*)temp_rx,
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ void rx_prach0(PHY_VARS_eNB *eNB,
|
|||||||
uint8_t ce_level
|
uint8_t ce_level
|
||||||
) {
|
) {
|
||||||
int i;
|
int i;
|
||||||
lte_frame_type_t frame_type;
|
frame_type_t frame_type;
|
||||||
uint16_t rootSequenceIndex;
|
uint16_t rootSequenceIndex;
|
||||||
uint8_t prach_ConfigIndex;
|
uint8_t prach_ConfigIndex;
|
||||||
uint8_t Ncs_config;
|
uint8_t Ncs_config;
|
||||||
|
|||||||
@@ -399,7 +399,7 @@ void compute_prach_seq(uint16_t rootSequenceIndex,
|
|||||||
uint8_t prach_ConfigIndex,
|
uint8_t prach_ConfigIndex,
|
||||||
uint8_t zeroCorrelationZoneConfig,
|
uint8_t zeroCorrelationZoneConfig,
|
||||||
uint8_t highSpeedFlag,
|
uint8_t highSpeedFlag,
|
||||||
lte_frame_type_t frame_type,
|
frame_type_t frame_type,
|
||||||
uint32_t X_u[64][839]) {
|
uint32_t X_u[64][839]) {
|
||||||
// Compute DFT of x_u => X_u[k] = x_u(inv(u)*k)^* X_u[k] = exp(j\pi u*inv(u)*k*(inv(u)*k+1)/N_ZC)
|
// Compute DFT of x_u => X_u[k] = x_u(inv(u)*k)^* X_u[k] = exp(j\pi u*inv(u)*k*(inv(u)*k+1)/N_ZC)
|
||||||
unsigned int k,inv_u,i,NCS=0,num_preambles;
|
unsigned int k,inv_u,i,NCS=0,num_preambles;
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user