Merge remote-tracking branch 'origin/develop' into NR_10MHz
This commit is contained in:
@@ -41,7 +41,7 @@ import constants as CONST
|
|||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
def ArgsParse(argvs,CiTestObj,RAN,HTML,EPC,ldpc,HELP):
|
def ArgsParse(argvs,CiTestObj,RAN,HTML,EPC,ldpc,CONTAINERS,HELP):
|
||||||
|
|
||||||
|
|
||||||
py_param_file_present = False
|
py_param_file_present = False
|
||||||
@@ -79,6 +79,7 @@ def ArgsParse(argvs,CiTestObj,RAN,HTML,EPC,ldpc,HELP):
|
|||||||
RAN.ranRepository=matchReg.group(1)
|
RAN.ranRepository=matchReg.group(1)
|
||||||
HTML.ranRepository=matchReg.group(1)
|
HTML.ranRepository=matchReg.group(1)
|
||||||
ldpc.ranRepository=matchReg.group(1)
|
ldpc.ranRepository=matchReg.group(1)
|
||||||
|
CONTAINERS.ranRepository=matchReg.group(1)
|
||||||
elif re.match('^\-\-eNB_AllowMerge=(.+)$|^\-\-ranAllowMerge=(.+)$', myArgv, re.IGNORECASE):
|
elif re.match('^\-\-eNB_AllowMerge=(.+)$|^\-\-ranAllowMerge=(.+)$', myArgv, re.IGNORECASE):
|
||||||
if re.match('^\-\-eNB_AllowMerge=(.+)$', myArgv, re.IGNORECASE):
|
if re.match('^\-\-eNB_AllowMerge=(.+)$', myArgv, re.IGNORECASE):
|
||||||
matchReg = re.match('^\-\-eNB_AllowMerge=(.+)$', myArgv, re.IGNORECASE)
|
matchReg = re.match('^\-\-eNB_AllowMerge=(.+)$', myArgv, re.IGNORECASE)
|
||||||
@@ -90,6 +91,7 @@ def ArgsParse(argvs,CiTestObj,RAN,HTML,EPC,ldpc,HELP):
|
|||||||
CiTestObj.ranAllowMerge = True
|
CiTestObj.ranAllowMerge = True
|
||||||
RAN.ranAllowMerge=True
|
RAN.ranAllowMerge=True
|
||||||
HTML.ranAllowMerge=True
|
HTML.ranAllowMerge=True
|
||||||
|
CONTAINERS.ranAllowMerge=True
|
||||||
elif re.match('^\-\-eNBBranch=(.+)$|^\-\-ranBranch=(.+)$', myArgv, re.IGNORECASE):
|
elif re.match('^\-\-eNBBranch=(.+)$|^\-\-ranBranch=(.+)$', myArgv, re.IGNORECASE):
|
||||||
if re.match('^\-\-eNBBranch=(.+)$', myArgv, re.IGNORECASE):
|
if re.match('^\-\-eNBBranch=(.+)$', myArgv, re.IGNORECASE):
|
||||||
matchReg = re.match('^\-\-eNBBranch=(.+)$', myArgv, re.IGNORECASE)
|
matchReg = re.match('^\-\-eNBBranch=(.+)$', myArgv, re.IGNORECASE)
|
||||||
@@ -99,6 +101,7 @@ def ArgsParse(argvs,CiTestObj,RAN,HTML,EPC,ldpc,HELP):
|
|||||||
RAN.ranBranch=matchReg.group(1)
|
RAN.ranBranch=matchReg.group(1)
|
||||||
HTML.ranBranch=matchReg.group(1)
|
HTML.ranBranch=matchReg.group(1)
|
||||||
ldpc.ranBranch=matchReg.group(1)
|
ldpc.ranBranch=matchReg.group(1)
|
||||||
|
CONTAINERS.ranBranch=matchReg.group(1)
|
||||||
elif re.match('^\-\-eNBCommitID=(.*)$|^\-\-ranCommitID=(.*)$', myArgv, re.IGNORECASE):
|
elif re.match('^\-\-eNBCommitID=(.*)$|^\-\-ranCommitID=(.*)$', myArgv, re.IGNORECASE):
|
||||||
if re.match('^\-\-eNBCommitID=(.*)$', myArgv, re.IGNORECASE):
|
if re.match('^\-\-eNBCommitID=(.*)$', myArgv, re.IGNORECASE):
|
||||||
matchReg = re.match('^\-\-eNBCommitID=(.*)$', myArgv, re.IGNORECASE)
|
matchReg = re.match('^\-\-eNBCommitID=(.*)$', myArgv, re.IGNORECASE)
|
||||||
@@ -108,6 +111,7 @@ def ArgsParse(argvs,CiTestObj,RAN,HTML,EPC,ldpc,HELP):
|
|||||||
RAN.ranCommitID=matchReg.group(1)
|
RAN.ranCommitID=matchReg.group(1)
|
||||||
HTML.ranCommitID=matchReg.group(1)
|
HTML.ranCommitID=matchReg.group(1)
|
||||||
ldpc.ranCommitID=matchReg.group(1)
|
ldpc.ranCommitID=matchReg.group(1)
|
||||||
|
CONTAINERS.ranCommitID=matchReg.group(1)
|
||||||
elif re.match('^\-\-eNBTargetBranch=(.*)$|^\-\-ranTargetBranch=(.*)$', myArgv, re.IGNORECASE):
|
elif re.match('^\-\-eNBTargetBranch=(.*)$|^\-\-ranTargetBranch=(.*)$', myArgv, re.IGNORECASE):
|
||||||
if re.match('^\-\-eNBTargetBranch=(.*)$', myArgv, re.IGNORECASE):
|
if re.match('^\-\-eNBTargetBranch=(.*)$', myArgv, re.IGNORECASE):
|
||||||
matchReg = re.match('^\-\-eNBTargetBranch=(.*)$', myArgv, re.IGNORECASE)
|
matchReg = re.match('^\-\-eNBTargetBranch=(.*)$', myArgv, re.IGNORECASE)
|
||||||
@@ -117,50 +121,63 @@ def ArgsParse(argvs,CiTestObj,RAN,HTML,EPC,ldpc,HELP):
|
|||||||
RAN.ranTargetBranch=matchReg.group(1)
|
RAN.ranTargetBranch=matchReg.group(1)
|
||||||
HTML.ranTargetBranch=matchReg.group(1)
|
HTML.ranTargetBranch=matchReg.group(1)
|
||||||
ldpc.ranTargetBranch=matchReg.group(1)
|
ldpc.ranTargetBranch=matchReg.group(1)
|
||||||
|
CONTAINERS.ranTargetBranch=matchReg.group(1)
|
||||||
elif re.match('^\-\-eNBIPAddress=(.+)$|^\-\-eNB[1-2]IPAddress=(.+)$', myArgv, re.IGNORECASE):
|
elif re.match('^\-\-eNBIPAddress=(.+)$|^\-\-eNB[1-2]IPAddress=(.+)$', myArgv, re.IGNORECASE):
|
||||||
if re.match('^\-\-eNBIPAddress=(.+)$', myArgv, re.IGNORECASE):
|
if re.match('^\-\-eNBIPAddress=(.+)$', myArgv, re.IGNORECASE):
|
||||||
matchReg = re.match('^\-\-eNBIPAddress=(.+)$', myArgv, re.IGNORECASE)
|
matchReg = re.match('^\-\-eNBIPAddress=(.+)$', myArgv, re.IGNORECASE)
|
||||||
RAN.eNBIPAddress=matchReg.group(1)
|
RAN.eNBIPAddress=matchReg.group(1)
|
||||||
ldpc.eNBIpAddr=matchReg.group(1)
|
ldpc.eNBIpAddr=matchReg.group(1)
|
||||||
|
CONTAINERS.eNBIPAddress=matchReg.group(1)
|
||||||
elif re.match('^\-\-eNB1IPAddress=(.+)$', myArgv, re.IGNORECASE):
|
elif re.match('^\-\-eNB1IPAddress=(.+)$', myArgv, re.IGNORECASE):
|
||||||
matchReg = re.match('^\-\-eNB1IPAddress=(.+)$', myArgv, re.IGNORECASE)
|
matchReg = re.match('^\-\-eNB1IPAddress=(.+)$', myArgv, re.IGNORECASE)
|
||||||
RAN.eNB1IPAddress=matchReg.group(1)
|
RAN.eNB1IPAddress=matchReg.group(1)
|
||||||
|
CONTAINERS.eNB1IPAddress=matchReg.group(1)
|
||||||
elif re.match('^\-\-eNB2IPAddress=(.+)$', myArgv, re.IGNORECASE):
|
elif re.match('^\-\-eNB2IPAddress=(.+)$', myArgv, re.IGNORECASE):
|
||||||
matchReg = re.match('^\-\-eNB2IPAddress=(.+)$', myArgv, re.IGNORECASE)
|
matchReg = re.match('^\-\-eNB2IPAddress=(.+)$', myArgv, re.IGNORECASE)
|
||||||
RAN.eNB2IPAddress=matchReg.group(1)
|
RAN.eNB2IPAddress=matchReg.group(1)
|
||||||
|
CONTAINERS.eNB2IPAddress=matchReg.group(1)
|
||||||
elif re.match('^\-\-eNBUserName=(.+)$|^\-\-eNB[1-2]UserName=(.+)$', myArgv, re.IGNORECASE):
|
elif re.match('^\-\-eNBUserName=(.+)$|^\-\-eNB[1-2]UserName=(.+)$', myArgv, re.IGNORECASE):
|
||||||
if re.match('^\-\-eNBUserName=(.+)$', myArgv, re.IGNORECASE):
|
if re.match('^\-\-eNBUserName=(.+)$', myArgv, re.IGNORECASE):
|
||||||
matchReg = re.match('^\-\-eNBUserName=(.+)$', myArgv, re.IGNORECASE)
|
matchReg = re.match('^\-\-eNBUserName=(.+)$', myArgv, re.IGNORECASE)
|
||||||
RAN.eNBUserName=matchReg.group(1)
|
RAN.eNBUserName=matchReg.group(1)
|
||||||
ldpc.eNBUserName=matchReg.group(1)
|
ldpc.eNBUserName=matchReg.group(1)
|
||||||
|
CONTAINERS.eNBUserName=matchReg.group(1)
|
||||||
elif re.match('^\-\-eNB1UserName=(.+)$', myArgv, re.IGNORECASE):
|
elif re.match('^\-\-eNB1UserName=(.+)$', myArgv, re.IGNORECASE):
|
||||||
matchReg = re.match('^\-\-eNB1UserName=(.+)$', myArgv, re.IGNORECASE)
|
matchReg = re.match('^\-\-eNB1UserName=(.+)$', myArgv, re.IGNORECASE)
|
||||||
RAN.eNB1UserName=matchReg.group(1)
|
RAN.eNB1UserName=matchReg.group(1)
|
||||||
|
CONTAINERS.eNB1UserName=matchReg.group(1)
|
||||||
elif re.match('^\-\-eNB2UserName=(.+)$', myArgv, re.IGNORECASE):
|
elif re.match('^\-\-eNB2UserName=(.+)$', myArgv, re.IGNORECASE):
|
||||||
matchReg = re.match('^\-\-eNB2UserName=(.+)$', myArgv, re.IGNORECASE)
|
matchReg = re.match('^\-\-eNB2UserName=(.+)$', myArgv, re.IGNORECASE)
|
||||||
RAN.eNB2UserName=matchReg.group(1)
|
RAN.eNB2UserName=matchReg.group(1)
|
||||||
|
CONTAINERS.eNB2UserName=matchReg.group(1)
|
||||||
elif re.match('^\-\-eNBPassword=(.+)$|^\-\-eNB[1-2]Password=(.+)$', myArgv, re.IGNORECASE):
|
elif re.match('^\-\-eNBPassword=(.+)$|^\-\-eNB[1-2]Password=(.+)$', myArgv, re.IGNORECASE):
|
||||||
if re.match('^\-\-eNBPassword=(.+)$', myArgv, re.IGNORECASE):
|
if re.match('^\-\-eNBPassword=(.+)$', myArgv, re.IGNORECASE):
|
||||||
matchReg = re.match('^\-\-eNBPassword=(.+)$', myArgv, re.IGNORECASE)
|
matchReg = re.match('^\-\-eNBPassword=(.+)$', myArgv, re.IGNORECASE)
|
||||||
RAN.eNBPassword=matchReg.group(1)
|
RAN.eNBPassword=matchReg.group(1)
|
||||||
ldpc.eNBPassWord=matchReg.group(1)
|
ldpc.eNBPassWord=matchReg.group(1)
|
||||||
|
CONTAINERS.eNBPassword=matchReg.group(1)
|
||||||
elif re.match('^\-\-eNB1Password=(.+)$', myArgv, re.IGNORECASE):
|
elif re.match('^\-\-eNB1Password=(.+)$', myArgv, re.IGNORECASE):
|
||||||
matchReg = re.match('^\-\-eNB1Password=(.+)$', myArgv, re.IGNORECASE)
|
matchReg = re.match('^\-\-eNB1Password=(.+)$', myArgv, re.IGNORECASE)
|
||||||
RAN.eNB1Password=matchReg.group(1)
|
RAN.eNB1Password=matchReg.group(1)
|
||||||
|
CONTAINERS.eNB1Password=matchReg.group(1)
|
||||||
elif re.match('^\-\-eNB2Password=(.+)$', myArgv, re.IGNORECASE):
|
elif re.match('^\-\-eNB2Password=(.+)$', myArgv, re.IGNORECASE):
|
||||||
matchReg = re.match('^\-\-eNB2Password=(.+)$', myArgv, re.IGNORECASE)
|
matchReg = re.match('^\-\-eNB2Password=(.+)$', myArgv, re.IGNORECASE)
|
||||||
RAN.eNB2Password=matchReg.group(1)
|
RAN.eNB2Password=matchReg.group(1)
|
||||||
|
CONTAINERS.eNB2Password=matchReg.group(1)
|
||||||
elif re.match('^\-\-eNBSourceCodePath=(.+)$|^\-\-eNB[1-2]SourceCodePath=(.+)$', myArgv, re.IGNORECASE):
|
elif re.match('^\-\-eNBSourceCodePath=(.+)$|^\-\-eNB[1-2]SourceCodePath=(.+)$', myArgv, re.IGNORECASE):
|
||||||
if re.match('^\-\-eNBSourceCodePath=(.+)$', myArgv, re.IGNORECASE):
|
if re.match('^\-\-eNBSourceCodePath=(.+)$', myArgv, re.IGNORECASE):
|
||||||
matchReg = re.match('^\-\-eNBSourceCodePath=(.+)$', myArgv, re.IGNORECASE)
|
matchReg = re.match('^\-\-eNBSourceCodePath=(.+)$', myArgv, re.IGNORECASE)
|
||||||
RAN.eNBSourceCodePath=matchReg.group(1)
|
RAN.eNBSourceCodePath=matchReg.group(1)
|
||||||
ldpc.eNBSourceCodePath=matchReg.group(1)
|
ldpc.eNBSourceCodePath=matchReg.group(1)
|
||||||
|
CONTAINERS.eNBSourceCodePath=matchReg.group(1)
|
||||||
elif re.match('^\-\-eNB1SourceCodePath=(.+)$', myArgv, re.IGNORECASE):
|
elif re.match('^\-\-eNB1SourceCodePath=(.+)$', myArgv, re.IGNORECASE):
|
||||||
matchReg = re.match('^\-\-eNB1SourceCodePath=(.+)$', myArgv, re.IGNORECASE)
|
matchReg = re.match('^\-\-eNB1SourceCodePath=(.+)$', myArgv, re.IGNORECASE)
|
||||||
RAN.eNB1SourceCodePath=matchReg.group(1)
|
RAN.eNB1SourceCodePath=matchReg.group(1)
|
||||||
|
CONTAINERS.eNB1SourceCodePath=matchReg.group(1)
|
||||||
elif re.match('^\-\-eNB2SourceCodePath=(.+)$', myArgv, re.IGNORECASE):
|
elif re.match('^\-\-eNB2SourceCodePath=(.+)$', myArgv, re.IGNORECASE):
|
||||||
matchReg = re.match('^\-\-eNB2SourceCodePath=(.+)$', myArgv, re.IGNORECASE)
|
matchReg = re.match('^\-\-eNB2SourceCodePath=(.+)$', myArgv, re.IGNORECASE)
|
||||||
RAN.eNB2SourceCodePath=matchReg.group(1)
|
RAN.eNB2SourceCodePath=matchReg.group(1)
|
||||||
|
CONTAINERS.eNB2SourceCodePath=matchReg.group(1)
|
||||||
elif re.match('^\-\-EPCIPAddress=(.+)$', myArgv, re.IGNORECASE):
|
elif re.match('^\-\-EPCIPAddress=(.+)$', myArgv, re.IGNORECASE):
|
||||||
matchReg = re.match('^\-\-EPCIPAddress=(.+)$', myArgv, re.IGNORECASE)
|
matchReg = re.match('^\-\-EPCIPAddress=(.+)$', myArgv, re.IGNORECASE)
|
||||||
EPC.IPAddress=matchReg.group(1)
|
EPC.IPAddress=matchReg.group(1)
|
||||||
|
|||||||
@@ -178,6 +178,8 @@ function build_on_vm {
|
|||||||
echo "mkdir -p cmake_targets/log" >> $VM_CMDS
|
echo "mkdir -p cmake_targets/log" >> $VM_CMDS
|
||||||
echo "chmod 777 cmake_targets/log" >> $VM_CMDS
|
echo "chmod 777 cmake_targets/log" >> $VM_CMDS
|
||||||
echo "cp /home/ubuntu/zip-install.txt cmake_targets/log" >> $VM_CMDS
|
echo "cp /home/ubuntu/zip-install.txt cmake_targets/log" >> $VM_CMDS
|
||||||
|
# Patching the pistache build for Xenial (cmake too old for new commits)
|
||||||
|
echo "sed -i -e 's@cd pistache@cd pistache \&\& git checkout -f 9a65f40975fafca5bb5370ba6d0d00f42cbc4356@' ./tools/install_dependencies" >> $VM_CMDS
|
||||||
echo "echo \"./tools/install_dependencies \"" >> $VM_CMDS
|
echo "echo \"./tools/install_dependencies \"" >> $VM_CMDS
|
||||||
echo "./tools/install_dependencies > cmake_targets/log/install-build.txt 2>&1" >> $VM_CMDS
|
echo "./tools/install_dependencies > cmake_targets/log/install-build.txt 2>&1" >> $VM_CMDS
|
||||||
echo "echo \"mkdir build\"" >> $VM_CMDS
|
echo "echo \"mkdir build\"" >> $VM_CMDS
|
||||||
|
|||||||
Executable
+83
@@ -0,0 +1,83 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
"""
|
||||||
|
Created on Tue Jul 7 23:04:51 2020
|
||||||
|
|
||||||
|
@author: hardy
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
import yaml
|
||||||
|
import sys
|
||||||
|
import subprocess
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
f_yaml=sys.argv[1]
|
||||||
|
f_sh=sys.argv[2]
|
||||||
|
#filename='py_params_template.yaml'
|
||||||
|
with open(f_yaml,'r') as file:
|
||||||
|
# The FullLoader parameter handles the conversion from YAML
|
||||||
|
# scalar values to Python the dictionary format
|
||||||
|
print('Loading '+f_yaml)
|
||||||
|
params = yaml.load(file,Loader=yaml.FullLoader)
|
||||||
|
|
||||||
|
|
||||||
|
with open(f_sh,'w') as f:
|
||||||
|
f.write('#!/bin/sh\n')
|
||||||
|
for i in range (0, len(params['steps'])):
|
||||||
|
step=params['steps'][i].split(',')
|
||||||
|
mode=step[0]
|
||||||
|
f_xml=step[1]
|
||||||
|
line='python3 main.py ' + \
|
||||||
|
'--mode='+ mode + ' ' + \
|
||||||
|
'--ranRepository=' + params['ranRepository'] + ' ' + \
|
||||||
|
'--ranBranch=' + params['ranBranch'] + ' ' + \
|
||||||
|
'--ranCommitID=' + params['ranCommitID'] + ' ' + \
|
||||||
|
'--ranAllowMerge=' + params['ranAllowMerge'] + ' ' + \
|
||||||
|
'--ranTargetBranch=' + params['ranTargetBranch'] + ' ' + \
|
||||||
|
\
|
||||||
|
'--ADBIPAddress=' + params['ADB']['ADBIPAddress'] + ' ' + \
|
||||||
|
'--ADBUserName=' + params['ADB']['ADBUserName'] + ' ' + \
|
||||||
|
'--ADBPassword=' + params['ADB']['ADBPassword'] + ' ' + \
|
||||||
|
\
|
||||||
|
'--UEIPAddress=' + params['UE']['UEIPAddress'] + ' ' + \
|
||||||
|
'--UEUserName=' + params['UE']['UEUserName'] + ' ' + \
|
||||||
|
'--UEPassword=' + params['UE']['UEPassword'] + ' ' + \
|
||||||
|
'--UESourceCodePath=' + params['UE']['UESourceCodePath'] + ' ' + \
|
||||||
|
\
|
||||||
|
'--EPCIPAddress=' + params['EPC']['EPCIPAddress'] + ' ' + \
|
||||||
|
'--EPCUserName=' + params['EPC']['EPCUserName'] + ' ' + \
|
||||||
|
'--EPCPassword=' + params['EPC']['EPCPassword'] + ' ' + \
|
||||||
|
'--EPCSourceCodePath=' + params['EPC']['EPCSourceCodePath'] + ' ' + \
|
||||||
|
'--EPCType=' + params['EPC']['EPCType'] + ' ' + \
|
||||||
|
\
|
||||||
|
'--eNBIPAddress=' + params['RAN'][0]['eNBIPAddress'] + ' ' + \
|
||||||
|
'--eNBUserName=' + params['RAN'][0]['eNBUserName'] + ' ' + \
|
||||||
|
'--eNBPassword=' + params['RAN'][0]['eNBPassword'] + ' ' + \
|
||||||
|
'--eNBSourceCodePath=' + params['RAN'][0]['eNBSourceCodePath'] + ' ' + \
|
||||||
|
\
|
||||||
|
'--eNB1IPAddress=' + params['RAN'][1]['eNB1IPAddress'] + ' ' + \
|
||||||
|
'--eNB1UserName=' + params['RAN'][1]['eNB1UserName'] + ' ' + \
|
||||||
|
'--eNB1Password=' + params['RAN'][1]['eNB1Password'] + ' ' + \
|
||||||
|
'--eNB1SourceCodePath=' + params['RAN'][1]['eNB1SourceCodePath'] + ' '
|
||||||
|
if mode!="InitiateHtml":
|
||||||
|
line+='--XMLTestFile=' + f_xml
|
||||||
|
#if mode is InitiateHTML we have a special processing to mention all xml files from the list
|
||||||
|
#loop starting at 1 to avoid the xml file mentioned with InitiateHtml in yaml file (file is none)
|
||||||
|
else:
|
||||||
|
for i in range (1, len(params['steps'])):
|
||||||
|
step=params['steps'][i].split(',')
|
||||||
|
f_xml=step[1]
|
||||||
|
line+='--XMLTestFile=' + f_xml+' '
|
||||||
|
line+='\n'
|
||||||
|
print(line)
|
||||||
|
f.write(line)
|
||||||
|
subprocess.call(['chmod','777',f_sh])
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
|
|
||||||
|
|
||||||
Executable
+46
@@ -0,0 +1,46 @@
|
|||||||
|
|
||||||
|
ranRepository : https://gitlab.eurecom.fr/oai/openairinterface5g.git
|
||||||
|
ranBranch : BRANCH_NAME
|
||||||
|
ranCommitID : COMMIT_ID
|
||||||
|
ranAllowMerge : 'true'
|
||||||
|
ranTargetBranch : develop
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- InitiateHtml,none
|
||||||
|
- TesteNB,xml_files/fr1_multi_node_build.xml
|
||||||
|
- TesteNB,xml_files/fr1_epc_start.xml
|
||||||
|
- TesteNB,xml_files/fr1_ran_ue_base.xml #ue toggle, nodes initialize, ue toggle, ping, nodes terminate
|
||||||
|
- TesteNB,xml_files/fr1_epc_closure.xml
|
||||||
|
|
||||||
|
|
||||||
|
ADB: #on Caracal
|
||||||
|
ADBIPAddress : 192.168.18.196
|
||||||
|
ADBUserName : oaici
|
||||||
|
ADBPassword : KkexF6CErOi1fNuebCPsuIVK
|
||||||
|
|
||||||
|
RAN:
|
||||||
|
- eNBIPAddress : 192.168.18.199 #eNB on Minimassive
|
||||||
|
eNBUserName : oaicicd
|
||||||
|
eNBPassword : HzB*nkryaITdVd08TKlT#2Z5a!7M#~qn
|
||||||
|
eNBSourceCodePath : /tmp/CI-FR1-eNB
|
||||||
|
- eNB1IPAddress : 192.168.18.198 #gNB on Mozart
|
||||||
|
eNB1UserName : oaicicd
|
||||||
|
eNB1Password : 7zkDOFgh@w3HvRBMPTMh@BAx
|
||||||
|
eNB1SourceCodePath : /tmp/CI-FR1-gNB
|
||||||
|
|
||||||
|
|
||||||
|
EPC: #on Nikaia
|
||||||
|
EPCIPAddress : 192.168.18.99
|
||||||
|
EPCUserName : nikaia
|
||||||
|
EPCPassword : linux
|
||||||
|
EPCSourceCodePath : /tmp/CI-FR1-EPC
|
||||||
|
EPCType : ltebox
|
||||||
|
|
||||||
|
|
||||||
|
UE:
|
||||||
|
UEIPAddress : none
|
||||||
|
UEUserName : none
|
||||||
|
UEPassword : none
|
||||||
|
UESourceCodePath : none
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,410 @@
|
|||||||
|
#/*
|
||||||
|
# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
# * contributor license agreements. See the NOTICE file distributed with
|
||||||
|
# * this work for additional information regarding copyright ownership.
|
||||||
|
# * The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
# * the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
# * except in compliance with the License.
|
||||||
|
# * You may obtain a copy of the License at
|
||||||
|
# *
|
||||||
|
# * http://www.openairinterface.org/?page_id=698
|
||||||
|
# *
|
||||||
|
# * Unless required by applicable law or agreed to in writing, software
|
||||||
|
# * distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# * See the License for the specific language governing permissions and
|
||||||
|
# * limitations under the License.
|
||||||
|
# *-------------------------------------------------------------------------------
|
||||||
|
# * For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
# * contact@openairinterface.org
|
||||||
|
# */
|
||||||
|
#---------------------------------------------------------------------
|
||||||
|
# Python for CI of OAI-eNB + COTS-UE
|
||||||
|
#
|
||||||
|
# Required Python Version
|
||||||
|
# Python 3.x
|
||||||
|
#
|
||||||
|
# Required Python Package
|
||||||
|
# pexpect
|
||||||
|
#---------------------------------------------------------------------
|
||||||
|
|
||||||
|
#-----------------------------------------------------------
|
||||||
|
# Import
|
||||||
|
#-----------------------------------------------------------
|
||||||
|
import sys # arg
|
||||||
|
import re # reg
|
||||||
|
import logging
|
||||||
|
import os
|
||||||
|
import time
|
||||||
|
from multiprocessing import Process, Lock, SimpleQueue
|
||||||
|
|
||||||
|
#-----------------------------------------------------------
|
||||||
|
# OAI Testing modules
|
||||||
|
#-----------------------------------------------------------
|
||||||
|
import sshconnection as SSH
|
||||||
|
import helpreadme as HELP
|
||||||
|
import constants as CONST
|
||||||
|
|
||||||
|
#-----------------------------------------------------------
|
||||||
|
# Class Declaration
|
||||||
|
#-----------------------------------------------------------
|
||||||
|
class Containerize():
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
|
||||||
|
self.ranRepository = ''
|
||||||
|
self.ranBranch = ''
|
||||||
|
self.ranAllowMerge = False
|
||||||
|
self.ranCommitID = ''
|
||||||
|
self.ranTargetBranch = ''
|
||||||
|
self.eNBIPAddress = ''
|
||||||
|
self.eNBUserName = ''
|
||||||
|
self.eNBPassword = ''
|
||||||
|
self.eNBSourceCodePath = ''
|
||||||
|
self.eNB1IPAddress = ''
|
||||||
|
self.eNB1UserName = ''
|
||||||
|
self.eNB1Password = ''
|
||||||
|
self.eNB1SourceCodePath = ''
|
||||||
|
self.eNB2IPAddress = ''
|
||||||
|
self.eNB2UserName = ''
|
||||||
|
self.eNB2Password = ''
|
||||||
|
self.eNB2SourceCodePath = ''
|
||||||
|
self.forcedWorkspaceCleanup = False
|
||||||
|
self.imageKind = ''
|
||||||
|
self.eNB_instance = 0
|
||||||
|
self.eNB_serverId = ['', '', '']
|
||||||
|
self.yamlPath = ['', '', '']
|
||||||
|
self.eNB_logFile = ['', '', '']
|
||||||
|
|
||||||
|
self.testCase_id = ''
|
||||||
|
|
||||||
|
self.flexranCtrlDeployed = False
|
||||||
|
self.flexranCtrlIpAddress = ''
|
||||||
|
|
||||||
|
#-----------------------------------------------------------
|
||||||
|
# Container management functions
|
||||||
|
#-----------------------------------------------------------
|
||||||
|
|
||||||
|
def BuildImage(self, HTML):
|
||||||
|
if self.ranRepository == '' or self.ranBranch == '' or self.ranCommitID == '':
|
||||||
|
HELP.GenericHelp(CONST.Version)
|
||||||
|
sys.exit('Insufficient Parameter')
|
||||||
|
if self.eNB_serverId[self.eNB_instance] == '0':
|
||||||
|
lIpAddr = self.eNBIPAddress
|
||||||
|
lUserName = self.eNBUserName
|
||||||
|
lPassWord = self.eNBPassword
|
||||||
|
lSourcePath = self.eNBSourceCodePath
|
||||||
|
elif self.eNB_serverId[self.eNB_instance] == '1':
|
||||||
|
lIpAddr = self.eNB1IPAddress
|
||||||
|
lUserName = self.eNB1UserName
|
||||||
|
lPassWord = self.eNB1Password
|
||||||
|
lSourcePath = self.eNB1SourceCodePath
|
||||||
|
elif self.eNB_serverId[self.eNB_instance] == '2':
|
||||||
|
lIpAddr = self.eNB2IPAddress
|
||||||
|
lUserName = self.eNB2UserName
|
||||||
|
lPassWord = self.eNB2Password
|
||||||
|
lSourcePath = self.eNB2SourceCodePath
|
||||||
|
if lIpAddr == '' or lUserName == '' or lPassWord == '' or lSourcePath == '':
|
||||||
|
HELP.GenericHelp(CONST.Version)
|
||||||
|
sys.exit('Insufficient Parameter')
|
||||||
|
logging.debug('Building on server: ' + lIpAddr)
|
||||||
|
mySSH = SSH.SSHConnection()
|
||||||
|
mySSH.open(lIpAddr, lUserName, lPassWord)
|
||||||
|
|
||||||
|
imageNames = []
|
||||||
|
result = re.search('eNB', self.imageKind)
|
||||||
|
# Creating a tupple with the imageName and the DockerFile prefix pattern
|
||||||
|
if result is not None:
|
||||||
|
imageNames.append(('oai-enb', 'eNB'))
|
||||||
|
else:
|
||||||
|
result = re.search('gNB', self.imageKind)
|
||||||
|
if result is not None:
|
||||||
|
imageNames.append(('oai-gnb', 'gNB'))
|
||||||
|
else:
|
||||||
|
result = re.search('all', self.imageKind)
|
||||||
|
if result is not None:
|
||||||
|
imageNames.append(('oai-enb', 'eNB'))
|
||||||
|
imageNames.append(('oai-gnb', 'gNB'))
|
||||||
|
imageNames.append(('oai-lte-ue', 'lteUE'))
|
||||||
|
imageNames.append(('oai-nr-ue', 'nrUE'))
|
||||||
|
if len(imageNames) == 0:
|
||||||
|
imageNames.append(('oai-enb', 'eNB'))
|
||||||
|
# Workaround for some servers, we need to erase completely the workspace
|
||||||
|
if self.forcedWorkspaceCleanup:
|
||||||
|
mySSH.command('echo ' + lPassWord + ' | sudo -S rm -Rf ' + lSourcePath, '\$', 15)
|
||||||
|
self.testCase_id = HTML.testCase_id
|
||||||
|
# on RedHat/CentOS .git extension is mandatory
|
||||||
|
result = re.search('([a-zA-Z0-9\:\-\.\/])+\.git', self.ranRepository)
|
||||||
|
if result is not None:
|
||||||
|
full_ran_repo_name = self.ranRepository
|
||||||
|
else:
|
||||||
|
full_ran_repo_name = self.ranRepository + '.git'
|
||||||
|
mySSH.command('mkdir -p ' + lSourcePath, '\$', 5)
|
||||||
|
mySSH.command('cd ' + lSourcePath, '\$', 5)
|
||||||
|
mySSH.command('if [ ! -e .git ]; then stdbuf -o0 git clone ' + full_ran_repo_name + ' .; else stdbuf -o0 git fetch --prune; fi', '\$', 600)
|
||||||
|
# Raphael: here add a check if git clone or git fetch went smoothly
|
||||||
|
mySSH.command('git config user.email "jenkins@openairinterface.org"', '\$', 5)
|
||||||
|
mySSH.command('git config user.name "OAI Jenkins"', '\$', 5)
|
||||||
|
|
||||||
|
mySSH.command('echo ' + lPassWord + ' | sudo -S git clean -x -d -ff', '\$', 30)
|
||||||
|
mySSH.command('mkdir -p cmake_targets/log', '\$', 5)
|
||||||
|
# if the commit ID is provided use it to point to it
|
||||||
|
if self.ranCommitID != '':
|
||||||
|
mySSH.command('git checkout -f ' + self.ranCommitID, '\$', 5)
|
||||||
|
# if the branch is not develop, then it is a merge request and we need to do
|
||||||
|
# the potential merge. Note that merge conflicts should already been checked earlier
|
||||||
|
imageTag = 'develop'
|
||||||
|
if (self.ranAllowMerge):
|
||||||
|
imageTag = 'ci-temp'
|
||||||
|
if self.ranTargetBranch == '':
|
||||||
|
if (self.ranBranch != 'develop') and (self.ranBranch != 'origin/develop'):
|
||||||
|
mySSH.command('git merge --ff origin/develop -m "Temporary merge for CI"', '\$', 5)
|
||||||
|
else:
|
||||||
|
logging.debug('Merging with the target branch: ' + self.ranTargetBranch)
|
||||||
|
mySSH.command('git merge --ff origin/' + self.ranTargetBranch + ' -m "Temporary merge for CI"', '\$', 5)
|
||||||
|
# Let's remove any previous run artifacts if still there
|
||||||
|
mySSH.command('docker image prune --force', '\$', 5)
|
||||||
|
mySSH.command('docker image rm ran-build:' + imageTag, '\$', 5)
|
||||||
|
for image,pattern in imageNames:
|
||||||
|
mySSH.command('docker image rm ' + image + ':' + imageTag, '\$', 5)
|
||||||
|
# Build the shared image
|
||||||
|
mySSH.command('docker build --target ran-build --tag ran-build:' + imageTag + ' --file docker/Dockerfile.ran.ubuntu18 --build-arg NEEDED_GIT_PROXY="http://proxy.eurecom.fr:8080" . > cmake_targets/log/ran-build.log 2>&1', '\$', 800)
|
||||||
|
# Build the target image(s)
|
||||||
|
previousImage='ran-build:' + imageTag
|
||||||
|
danglingShaOnes=[]
|
||||||
|
for image,pattern in imageNames:
|
||||||
|
# the archived Dockerfiles have "ran-build:latest" as base image
|
||||||
|
# we need to update them with proper tag
|
||||||
|
mySSH.command('sed -i -e "s#ran-build:latest#ran-build:' + imageTag + '#" docker/Dockerfile.' + pattern + '.ubuntu18', '\$', 5)
|
||||||
|
mySSH.command('docker build --target ' + image + ' --tag ' + image + ':' + imageTag + ' --file docker/Dockerfile.' + pattern + '.ubuntu18 . > cmake_targets/log/' + image + '.log 2>&1', '\$', 600)
|
||||||
|
# Retrieving the dangling image(s) for the log collection
|
||||||
|
mySSH.command('docker images --filter "dangling=true" --filter "since=' + previousImage + '" -q | sed -e "s#^#sha=#"', '\$', 5)
|
||||||
|
result = re.search('sha=(?P<imageShaOne>[a-zA-Z0-9\-\_]+)', mySSH.getBefore())
|
||||||
|
if result is not None:
|
||||||
|
danglingShaOnes.append((image, result.group('imageShaOne')))
|
||||||
|
previousImage=image + ':' + imageTag
|
||||||
|
|
||||||
|
imageTag = 'ci-temp'
|
||||||
|
# First verify if images were properly created.
|
||||||
|
status = True
|
||||||
|
mySSH.command('docker image inspect --format=\'Size = {{.Size}} bytes\' ran-build:' + imageTag, '\$', 5)
|
||||||
|
if mySSH.getBefore().count('No such object') != 0:
|
||||||
|
logging.error('Could not build properly ran-build')
|
||||||
|
status = False
|
||||||
|
else:
|
||||||
|
result = re.search('Size = (?P<size>[0-9\-]+) bytes', mySSH.getBefore())
|
||||||
|
if result is not None:
|
||||||
|
imageSize = float(result.group('size'))
|
||||||
|
imageSize = imageSize / 1000
|
||||||
|
if imageSize < 1000:
|
||||||
|
logging.debug('\u001B[1m ran-build size is ' + ('%.0f' % imageSize) + ' kbytes\u001B[0m')
|
||||||
|
else:
|
||||||
|
imageSize = imageSize / 1000
|
||||||
|
if imageSize < 1000:
|
||||||
|
logging.debug('\u001B[1m ran-build size is ' + ('%.0f' % imageSize) + ' Mbytes\u001B[0m')
|
||||||
|
else:
|
||||||
|
imageSize = imageSize / 1000
|
||||||
|
logging.debug('\u001B[1m ran-build size is ' + ('%.3f' % imageSize) + ' Gbytes\u001B[0m')
|
||||||
|
else:
|
||||||
|
logging.debug('ran-build size is unknown')
|
||||||
|
for image,pattern in imageNames:
|
||||||
|
mySSH.command('docker image inspect --format=\'Size = {{.Size}} bytes\' ' + image + ':' + imageTag, '\$', 5)
|
||||||
|
if mySSH.getBefore().count('No such object') != 0:
|
||||||
|
logging.error('Could not build properly ' + image)
|
||||||
|
status = False
|
||||||
|
else:
|
||||||
|
result = re.search('Size = (?P<size>[0-9\-]+) bytes', mySSH.getBefore())
|
||||||
|
if result is not None:
|
||||||
|
imageSize = float(result.group('size'))
|
||||||
|
imageSize = imageSize / 1000
|
||||||
|
if imageSize < 1000:
|
||||||
|
logging.debug('\u001B[1m ' + image + ' size is ' + ('%.0f' % imageSize) + ' kbytes\u001B[0m')
|
||||||
|
else:
|
||||||
|
imageSize = imageSize / 1000
|
||||||
|
if imageSize < 1000:
|
||||||
|
logging.debug('\u001B[1m ' + image + ' size is ' + ('%.0f' % imageSize) + ' Mbytes\u001B[0m')
|
||||||
|
else:
|
||||||
|
imageSize = imageSize / 1000
|
||||||
|
logging.debug('\u001B[1m ' + image + ' size is ' + ('%.3f' % imageSize) + ' Gbytes\u001B[0m')
|
||||||
|
else:
|
||||||
|
logging.debug('ran-build size is unknown')
|
||||||
|
if not status:
|
||||||
|
mySSH.close()
|
||||||
|
logging.error('\u001B[1m Building OAI Images Failed\u001B[0m')
|
||||||
|
HTML.CreateHtmlTestRow(self.imageKind, 'KO', CONST.ALL_PROCESSES_OK)
|
||||||
|
HTML.CreateHtmlTabFooter(False)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
# Recover build logs, for the moment only possible when build is successful
|
||||||
|
mySSH.command('docker create --name test ran-build:' + imageTag, '\$', 5)
|
||||||
|
mySSH.command('mkdir -p cmake_targets/log/ran-build', '\$', 5)
|
||||||
|
mySSH.command('docker cp test:/oai-ran/cmake_targets/log/. cmake_targets/log/ran-build', '\$', 5)
|
||||||
|
mySSH.command('docker rm -f test', '\$', 5)
|
||||||
|
for image,shaone in danglingShaOnes:
|
||||||
|
mySSH.command('mkdir -p cmake_targets/log/' + image, '\$', 5)
|
||||||
|
mySSH.command('docker create --name test ' + shaone, '\$', 5)
|
||||||
|
mySSH.command('docker cp test:/oai-ran/cmake_targets/log/. cmake_targets/log/' + image, '\$', 5)
|
||||||
|
mySSH.command('docker rm -f test', '\$', 5)
|
||||||
|
mySSH.command('docker image prune --force', '\$', 5)
|
||||||
|
mySSH.command('cd cmake_targets', '\$', 5)
|
||||||
|
mySSH.command('mkdir -p build_log_' + self.testCase_id, '\$', 5)
|
||||||
|
mySSH.command('mv log/* ' + 'build_log_' + self.testCase_id, '\$', 5)
|
||||||
|
mySSH.close()
|
||||||
|
|
||||||
|
logging.info('\u001B[1m Building OAI Image(s) Pass\u001B[0m')
|
||||||
|
HTML.CreateHtmlTestRow(self.imageKind, 'OK', CONST.ALL_PROCESSES_OK)
|
||||||
|
|
||||||
|
def DeployObject(self, HTML, EPC):
|
||||||
|
if self.eNB_serverId[self.eNB_instance] == '0':
|
||||||
|
lIpAddr = self.eNBIPAddress
|
||||||
|
lUserName = self.eNBUserName
|
||||||
|
lPassWord = self.eNBPassword
|
||||||
|
lSourcePath = self.eNBSourceCodePath
|
||||||
|
elif self.eNB_serverId[self.eNB_instance] == '1':
|
||||||
|
lIpAddr = self.eNB1IPAddress
|
||||||
|
lUserName = self.eNB1UserName
|
||||||
|
lPassWord = self.eNB1Password
|
||||||
|
lSourcePath = self.eNB1SourceCodePath
|
||||||
|
elif self.eNB_serverId[self.eNB_instance] == '2':
|
||||||
|
lIpAddr = self.eNB2IPAddress
|
||||||
|
lUserName = self.eNB2UserName
|
||||||
|
lPassWord = self.eNB2Password
|
||||||
|
lSourcePath = self.eNB2SourceCodePath
|
||||||
|
if lIpAddr == '' or lUserName == '' or lPassWord == '' or lSourcePath == '':
|
||||||
|
HELP.GenericHelp(CONST.Version)
|
||||||
|
sys.exit('Insufficient Parameter')
|
||||||
|
logging.debug('\u001B[1m Deploying OAI Object on server: ' + lIpAddr + '\u001B[0m')
|
||||||
|
mySSH = SSH.SSHConnection()
|
||||||
|
mySSH.open(lIpAddr, lUserName, lPassWord)
|
||||||
|
# Putting the CPUs in a good state, we do that only on a few servers
|
||||||
|
mySSH.command('hostname', '\$', 5)
|
||||||
|
result = re.search('obelix|asterix', mySSH.getBefore())
|
||||||
|
if result is not None:
|
||||||
|
mySSH.command('if command -v cpupower &> /dev/null; then echo ' + lPassWord + ' | sudo -S cpupower idle-set -D 0; fi', '\$', 5)
|
||||||
|
time.sleep(5)
|
||||||
|
|
||||||
|
mySSH.command('cd ' + lSourcePath + '/' + self.yamlPath[self.eNB_instance], '\$', 5)
|
||||||
|
mySSH.command('cp docker-compose.yml ci-docker-compose.yml', '\$', 5)
|
||||||
|
imageTag = 'develop'
|
||||||
|
if (self.ranAllowMerge):
|
||||||
|
imageTag = 'ci-temp'
|
||||||
|
mySSH.command('sed -i -e "s/image: oai-enb:latest/image: oai-enb:' + imageTag + '/" ci-docker-compose.yml', '\$', 2)
|
||||||
|
localMmeIpAddr = EPC.MmeIPAddress
|
||||||
|
mySSH.command('sed -i -e "s/CI_MME_IP_ADDR/' + localMmeIpAddr + '/" ci-docker-compose.yml', '\$', 2)
|
||||||
|
if self.flexranCtrlDeployed:
|
||||||
|
mySSH.command('sed -i -e \'s/FLEXRAN_ENABLED:.*/FLEXRAN_ENABLED: "yes"/\' ci-docker-compose.yml', '\$', 2)
|
||||||
|
mySSH.command('sed -i -e "s/CI_FLEXRAN_CTL_IP_ADDR/' + self.flexranCtrlIpAddress + '/" ci-docker-compose.yml', '\$', 2)
|
||||||
|
else:
|
||||||
|
mySSH.command('sed -i -e "s/FLEXRAN_ENABLED:.*$/FLEXRAN_ENABLED: \"no\"/" ci-docker-compose.yml', '\$', 2)
|
||||||
|
mySSH.command('sed -i -e "s/CI_FLEXRAN_CTL_IP_ADDR/127.0.0.1/" ci-docker-compose.yml', '\$', 2)
|
||||||
|
# Currently support only one
|
||||||
|
mySSH.command('docker-compose --file ci-docker-compose.yml config --services | sed -e "s@^@service=@"', '\$', 2)
|
||||||
|
result = re.search('service=(?P<svc_name>[a-zA-Z0-9\_]+)', mySSH.getBefore())
|
||||||
|
if result is not None:
|
||||||
|
svcName = result.group('svc_name')
|
||||||
|
mySSH.command('docker-compose --file ci-docker-compose.yml up -d ' + svcName, '\$', 2)
|
||||||
|
|
||||||
|
# Checking Status
|
||||||
|
mySSH.command('docker-compose --file ci-docker-compose.yml config', '\$', 5)
|
||||||
|
result = re.search('container_name: (?P<container_name>[a-zA-Z0-9\-\_]+)', mySSH.getBefore())
|
||||||
|
unhealthyNb = 0
|
||||||
|
healthyNb = 0
|
||||||
|
startingNb = 0
|
||||||
|
containerName = ''
|
||||||
|
if result is not None:
|
||||||
|
containerName = result.group('container_name')
|
||||||
|
time.sleep(5)
|
||||||
|
cnt = 0
|
||||||
|
while (cnt < 3):
|
||||||
|
mySSH.command('docker inspect --format=\'{{.State.Health.Status}}\' ' + containerName, '\$', 5)
|
||||||
|
unhealthyNb = mySSH.getBefore().count('unhealthy')
|
||||||
|
healthyNb = mySSH.getBefore().count('healthy') - unhealthyNb
|
||||||
|
startingNb = mySSH.getBefore().count('starting')
|
||||||
|
if healthyNb == 1:
|
||||||
|
cnt = 10
|
||||||
|
else:
|
||||||
|
time.sleep(10)
|
||||||
|
cnt += 1
|
||||||
|
logging.debug(' -- ' + str(healthyNb) + ' healthy container(s)')
|
||||||
|
logging.debug(' -- ' + str(unhealthyNb) + ' unhealthy container(s)')
|
||||||
|
logging.debug(' -- ' + str(startingNb) + ' still starting container(s)')
|
||||||
|
|
||||||
|
status = False
|
||||||
|
if healthyNb == 1:
|
||||||
|
cnt = 0
|
||||||
|
while (cnt < 20):
|
||||||
|
mySSH.command('docker logs ' + containerName + ' | egrep --text --color=never -i "wait|sync|Starting"', '\$', 30)
|
||||||
|
result = re.search('got sync|Starting F1AP at CU', mySSH.getBefore())
|
||||||
|
if result is None:
|
||||||
|
time.sleep(6)
|
||||||
|
cnt += 1
|
||||||
|
else:
|
||||||
|
cnt = 100
|
||||||
|
status = True
|
||||||
|
logging.info('\u001B[1m Deploying OAI object Pass\u001B[0m')
|
||||||
|
time.sleep(10)
|
||||||
|
mySSH.close()
|
||||||
|
|
||||||
|
self.testCase_id = HTML.testCase_id
|
||||||
|
self.eNB_logFile[self.eNB_instance] = 'enb_' + self.testCase_id + '.log'
|
||||||
|
|
||||||
|
if status:
|
||||||
|
HTML.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK)
|
||||||
|
else:
|
||||||
|
HTML.CreateHtmlTestRow('N/A', 'KO', CONST.ALL_PROCESSES_OK)
|
||||||
|
|
||||||
|
def UndeployObject(self, HTML, RAN):
|
||||||
|
logging.info('\u001B[1m Undeploying OAI Object Pass\u001B[0m')
|
||||||
|
if self.eNB_serverId[self.eNB_instance] == '0':
|
||||||
|
lIpAddr = self.eNBIPAddress
|
||||||
|
lUserName = self.eNBUserName
|
||||||
|
lPassWord = self.eNBPassword
|
||||||
|
lSourcePath = self.eNBSourceCodePath
|
||||||
|
elif self.eNB_serverId[self.eNB_instance] == '1':
|
||||||
|
lIpAddr = self.eNB1IPAddress
|
||||||
|
lUserName = self.eNB1UserName
|
||||||
|
lPassWord = self.eNB1Password
|
||||||
|
lSourcePath = self.eNB1SourceCodePath
|
||||||
|
elif self.eNB_serverId[self.eNB_instance] == '2':
|
||||||
|
lIpAddr = self.eNB2IPAddress
|
||||||
|
lUserName = self.eNB2UserName
|
||||||
|
lPassWord = self.eNB2Password
|
||||||
|
lSourcePath = self.eNB2SourceCodePath
|
||||||
|
if lIpAddr == '' or lUserName == '' or lPassWord == '' or lSourcePath == '':
|
||||||
|
HELP.GenericHelp(CONST.Version)
|
||||||
|
sys.exit('Insufficient Parameter')
|
||||||
|
logging.debug('\u001B[1m Deploying OAI Object on server: ' + lIpAddr + '\u001B[0m')
|
||||||
|
mySSH = SSH.SSHConnection()
|
||||||
|
mySSH.open(lIpAddr, lUserName, lPassWord)
|
||||||
|
mySSH.command('cd ' + lSourcePath + '/' + self.yamlPath[self.eNB_instance], '\$', 5)
|
||||||
|
# Currently support only one
|
||||||
|
mySSH.command('docker-compose --file ci-docker-compose.yml config', '\$', 5)
|
||||||
|
result = re.search('container_name: (?P<container_name>[a-zA-Z0-9\-\_]+)', mySSH.getBefore())
|
||||||
|
if result is not None:
|
||||||
|
containerName = result.group('container_name')
|
||||||
|
mySSH.command('docker kill --signal INT ' + containerName, '\$', 30)
|
||||||
|
time.sleep(5)
|
||||||
|
mySSH.command('docker logs ' + containerName + ' > ' + lSourcePath + '/cmake_targets/' + self.eNB_logFile[self.eNB_instance], '\$', 30)
|
||||||
|
mySSH.command('docker rm -f ' + containerName, '\$', 30)
|
||||||
|
|
||||||
|
# Putting the CPUs back in a idle state, we do that only on a few servers
|
||||||
|
mySSH.command('hostname', '\$', 5)
|
||||||
|
result = re.search('obelix|asterix', mySSH.getBefore())
|
||||||
|
if result is not None:
|
||||||
|
mySSH.command('if command -v cpupower &> /dev/null; then echo ' + lPassWord + ' | sudo -S cpupower idle-set -E; fi', '\$', 5)
|
||||||
|
mySSH.close()
|
||||||
|
|
||||||
|
# Analyzing log file!
|
||||||
|
copyin_res = mySSH.copyin(lIpAddr, lUserName, lPassWord, lSourcePath + '/cmake_targets/' + self.eNB_logFile[self.eNB_instance], '.')
|
||||||
|
nodeB_prefix = 'e'
|
||||||
|
if (copyin_res == -1):
|
||||||
|
HTML.htmleNBFailureMsg='Could not copy ' + nodeB_prefix + 'NB logfile to analyze it!'
|
||||||
|
HTML.CreateHtmlTestRow('N/A', 'KO', CONST.ENB_PROCESS_NOLOGFILE_TO_ANALYZE)
|
||||||
|
else:
|
||||||
|
logging.debug('\u001B[1m Analyzing ' + nodeB_prefix + 'NB logfile \u001B[0m ' + self.eNB_logFile[self.eNB_instance])
|
||||||
|
logStatus = RAN.AnalyzeLogFile_eNB(self.eNB_logFile[self.eNB_instance], HTML)
|
||||||
|
if (logStatus < 0):
|
||||||
|
HTML.CreateHtmlTestRow(RAN.runtime_stats, 'KO', logStatus)
|
||||||
|
else:
|
||||||
|
HTML.CreateHtmlTestRow(RAN.runtime_stats, 'OK', CONST.ALL_PROCESSES_OK)
|
||||||
|
|
||||||
+178
-54
@@ -42,6 +42,7 @@ import xml.etree.ElementTree as ET
|
|||||||
import logging
|
import logging
|
||||||
import datetime
|
import datetime
|
||||||
import signal
|
import signal
|
||||||
|
import statistics as stat
|
||||||
from multiprocessing import Process, Lock, SimpleQueue
|
from multiprocessing import Process, Lock, SimpleQueue
|
||||||
logging.basicConfig(
|
logging.basicConfig(
|
||||||
level=logging.DEBUG,
|
level=logging.DEBUG,
|
||||||
@@ -53,6 +54,52 @@ import helpreadme as HELP
|
|||||||
import constants as CONST
|
import constants as CONST
|
||||||
import sshconnection
|
import sshconnection
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#-----------------------------------------------------------
|
||||||
|
# Utility functions
|
||||||
|
#-----------------------------------------------------------
|
||||||
|
|
||||||
|
def GetPingTimeAnalysis(ping_log_file):
|
||||||
|
#ping time values read from file
|
||||||
|
t_ping=[]
|
||||||
|
#ping stats (dictionary) to be returned by the function
|
||||||
|
ping_stat={}
|
||||||
|
if (os.path.isfile(ping_log_file)):
|
||||||
|
with open(ping_log_file,"r") as f:
|
||||||
|
for line in f:
|
||||||
|
#looking for time=xxx ms field
|
||||||
|
result=re.match('^.+time=(?P<ping_time>[0-9\.]+)',line)
|
||||||
|
if result != None:
|
||||||
|
t_ping.append(float(result.group('ping_time')))
|
||||||
|
|
||||||
|
#initial stats
|
||||||
|
ping_stat['min_0']=min(t_ping)
|
||||||
|
ping_stat['mean_0']=stat.mean(t_ping)
|
||||||
|
ping_stat['median_0']=stat.median(t_ping)
|
||||||
|
ping_stat['max_0']=max(t_ping)
|
||||||
|
|
||||||
|
#get index of max value
|
||||||
|
|
||||||
|
max_loc=t_ping.index(max(t_ping))
|
||||||
|
ping_stat['max_loc']=max_loc
|
||||||
|
#remove it
|
||||||
|
t_ping.pop(max_loc)
|
||||||
|
#new stats after removing max value
|
||||||
|
ping_stat['min_1']=min(t_ping)
|
||||||
|
ping_stat['mean_1']=stat.mean(t_ping)
|
||||||
|
ping_stat['median_1']=stat.median(t_ping)
|
||||||
|
ping_stat['max_1']=max(t_ping)
|
||||||
|
|
||||||
|
return ping_stat
|
||||||
|
|
||||||
|
else:
|
||||||
|
logging.error("Ping log file does not exist")
|
||||||
|
return -1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
# OaiCiTest Class Definition
|
# OaiCiTest Class Definition
|
||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
@@ -185,7 +232,7 @@ class OaiCiTest():
|
|||||||
SSH.command('mkdir -p log', '\$', 5)
|
SSH.command('mkdir -p log', '\$', 5)
|
||||||
SSH.command('chmod 777 log', '\$', 5)
|
SSH.command('chmod 777 log', '\$', 5)
|
||||||
# no need to remove in log (git clean did the trick)
|
# no need to remove in log (git clean did the trick)
|
||||||
SSH.command('stdbuf -o0 ./build_oai ' + self.Build_OAI_UE_args + ' 2>&1 | stdbuf -o0 tee compile_oai_ue.log', 'Bypassing the Tests|build have failed', 900)
|
SSH.command('stdbuf -o0 ./build_oai ' + self.Build_OAI_UE_args + ' 2>&1 | stdbuf -o0 tee compile_oai_ue.log', 'Bypassing the Tests|build have failed', 1200)
|
||||||
SSH.command('ls ran_build/build', '\$', 3)
|
SSH.command('ls ran_build/build', '\$', 3)
|
||||||
SSH.command('ls ran_build/build', '\$', 3)
|
SSH.command('ls ran_build/build', '\$', 3)
|
||||||
buildStatus = True
|
buildStatus = True
|
||||||
@@ -216,7 +263,7 @@ class OaiCiTest():
|
|||||||
HTML.CreateHtmlTabFooter(False)
|
HTML.CreateHtmlTabFooter(False)
|
||||||
self.ConditionalExit()
|
self.ConditionalExit()
|
||||||
|
|
||||||
def CheckFlexranCtrlInstallation(self,RAN,EPC):
|
def CheckFlexranCtrlInstallation(self,RAN,EPC,CONTAINERS):
|
||||||
if EPC.IPAddress == '' or EPC.UserName == '' or EPC.Password == '':
|
if EPC.IPAddress == '' or EPC.UserName == '' or EPC.Password == '':
|
||||||
return
|
return
|
||||||
SSH = sshconnection.SSHConnection()
|
SSH = sshconnection.SSHConnection()
|
||||||
@@ -225,7 +272,18 @@ class OaiCiTest():
|
|||||||
result = re.search('/opt/flexran_rtc/build/rt_controller', SSH.getBefore())
|
result = re.search('/opt/flexran_rtc/build/rt_controller', SSH.getBefore())
|
||||||
if result is not None:
|
if result is not None:
|
||||||
RAN.flexranCtrlInstalled=True
|
RAN.flexranCtrlInstalled=True
|
||||||
|
RAN.flexranCtrlIpAddress=EPC.IPAddress
|
||||||
logging.debug('Flexran Controller is installed')
|
logging.debug('Flexran Controller is installed')
|
||||||
|
else:
|
||||||
|
# Maybe flexran-rtc is deployed into a container
|
||||||
|
SSH.command('docker inspect --format="FLEX_RTC_IP_ADDR = {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}" prod-flexran-rtc', '\$', 5)
|
||||||
|
result = re.search('FLEX_RTC_IP_ADDR = (?P<flex_ip_addr>[0-9\.]+)', SSH.getBefore())
|
||||||
|
if result is not None:
|
||||||
|
RAN.flexranCtrlDeployed=True
|
||||||
|
RAN.flexranCtrlIpAddress=result.group('flex_ip_addr')
|
||||||
|
CONTAINERS.flexranCtrlDeployed=True
|
||||||
|
CONTAINERS.flexranCtrlIpAddress=result.group('flex_ip_addr')
|
||||||
|
logging.debug('Flexran Controller is deployed: ' + RAN.flexranCtrlIpAddress)
|
||||||
SSH.close()
|
SSH.close()
|
||||||
|
|
||||||
def InitializeFlexranCtrl(self, HTML,RAN,EPC):
|
def InitializeFlexranCtrl(self, HTML,RAN,EPC):
|
||||||
@@ -547,7 +605,7 @@ class OaiCiTest():
|
|||||||
HTML.htmlUEFailureMsg='nr-uesoftmodem did NOT synced'
|
HTML.htmlUEFailureMsg='nr-uesoftmodem did NOT synced'
|
||||||
HTML.CreateHtmlTestRow(self.air_interface + ' ' + self.Initialize_OAI_UE_args, 'KO', CONST.OAI_UE_PROCESS_COULD_NOT_SYNC, 'OAI UE')
|
HTML.CreateHtmlTestRow(self.air_interface + ' ' + self.Initialize_OAI_UE_args, 'KO', CONST.OAI_UE_PROCESS_COULD_NOT_SYNC, 'OAI UE')
|
||||||
logging.error('\033[91mInitialize OAI UE Failed! \033[0m')
|
logging.error('\033[91mInitialize OAI UE Failed! \033[0m')
|
||||||
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE)
|
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC)
|
||||||
|
|
||||||
def checkDevTTYisUnlocked(self):
|
def checkDevTTYisUnlocked(self):
|
||||||
SSH = sshconnection.SSHConnection()
|
SSH = sshconnection.SSHConnection()
|
||||||
@@ -625,7 +683,7 @@ class OaiCiTest():
|
|||||||
HTML.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK)
|
HTML.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK)
|
||||||
self.checkDevTTYisUnlocked()
|
self.checkDevTTYisUnlocked()
|
||||||
|
|
||||||
def AttachCatM(self,HTML,RAN,COTS_UE):
|
def AttachCatM(self,HTML,RAN,COTS_UE,EPC):
|
||||||
if self.ADBIPAddress == '' or self.ADBUserName == '' or self.ADBPassword == '':
|
if self.ADBIPAddress == '' or self.ADBUserName == '' or self.ADBPassword == '':
|
||||||
HELP.GenericHelp(CONST.Version)
|
HELP.GenericHelp(CONST.Version)
|
||||||
sys.exit('Insufficient Parameter')
|
sys.exit('Insufficient Parameter')
|
||||||
@@ -698,7 +756,7 @@ class OaiCiTest():
|
|||||||
html_cell = '<pre style="background-color:white">CAT-M module Attachment Failed</pre>'
|
html_cell = '<pre style="background-color:white">CAT-M module Attachment Failed</pre>'
|
||||||
html_queue.put(html_cell)
|
html_queue.put(html_cell)
|
||||||
HTML.CreateHtmlTestRowQueue('N/A', 'KO', 1, html_queue)
|
HTML.CreateHtmlTestRowQueue('N/A', 'KO', 1, html_queue)
|
||||||
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE)
|
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC)
|
||||||
|
|
||||||
def PingCatM(self,HTML,RAN,EPC,COTS_UE):
|
def PingCatM(self,HTML,RAN,EPC,COTS_UE):
|
||||||
if EPC.IPAddress == '' or EPC.UserName == '' or EPC.Password == '' or EPC.SourceCodePath == '':
|
if EPC.IPAddress == '' or EPC.UserName == '' or EPC.Password == '' or EPC.SourceCodePath == '':
|
||||||
@@ -709,7 +767,7 @@ class OaiCiTest():
|
|||||||
pStatus = self.CheckProcessExist(check_eNB, check_OAI_UE,RAN,EPC)
|
pStatus = self.CheckProcessExist(check_eNB, check_OAI_UE,RAN,EPC)
|
||||||
if (pStatus < 0):
|
if (pStatus < 0):
|
||||||
HTML.CreateHtmlTestRow(self.ping_args, 'KO', pStatus)
|
HTML.CreateHtmlTestRow(self.ping_args, 'KO', pStatus)
|
||||||
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE)
|
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC)
|
||||||
return
|
return
|
||||||
try:
|
try:
|
||||||
statusQueue = SimpleQueue()
|
statusQueue = SimpleQueue()
|
||||||
@@ -730,7 +788,7 @@ class OaiCiTest():
|
|||||||
moduleIPAddr = result.group('ipaddr')
|
moduleIPAddr = result.group('ipaddr')
|
||||||
else:
|
else:
|
||||||
HTML.CreateHtmlTestRow(self.ping_args, 'KO', pStatus)
|
HTML.CreateHtmlTestRow(self.ping_args, 'KO', pStatus)
|
||||||
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE)
|
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC)
|
||||||
return
|
return
|
||||||
ping_time = re.findall("-c (\d+)",str(self.ping_args))
|
ping_time = re.findall("-c (\d+)",str(self.ping_args))
|
||||||
device_id = 'catm'
|
device_id = 'catm'
|
||||||
@@ -794,7 +852,7 @@ class OaiCiTest():
|
|||||||
HTML.CreateHtmlTestRowQueue(self.ping_args, 'OK', 1, statusQueue)
|
HTML.CreateHtmlTestRowQueue(self.ping_args, 'OK', 1, statusQueue)
|
||||||
else:
|
else:
|
||||||
HTML.CreateHtmlTestRowQueue(self.ping_args, 'KO', 1, statusQueue)
|
HTML.CreateHtmlTestRowQueue(self.ping_args, 'KO', 1, statusQueue)
|
||||||
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE)
|
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC)
|
||||||
except:
|
except:
|
||||||
os.kill(os.getppid(),signal.SIGUSR1)
|
os.kill(os.getppid(),signal.SIGUSR1)
|
||||||
|
|
||||||
@@ -895,7 +953,7 @@ class OaiCiTest():
|
|||||||
pStatus = self.CheckProcessExist(check_eNB, check_OAI_UE,RAN,EPC)
|
pStatus = self.CheckProcessExist(check_eNB, check_OAI_UE,RAN,EPC)
|
||||||
if (pStatus < 0):
|
if (pStatus < 0):
|
||||||
HTML.CreateHtmlTestRow('N/A', 'KO', pStatus)
|
HTML.CreateHtmlTestRow('N/A', 'KO', pStatus)
|
||||||
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE)
|
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC)
|
||||||
return
|
return
|
||||||
multi_jobs = []
|
multi_jobs = []
|
||||||
status_queue = SimpleQueue()
|
status_queue = SimpleQueue()
|
||||||
@@ -914,7 +972,7 @@ class OaiCiTest():
|
|||||||
|
|
||||||
if (status_queue.empty()):
|
if (status_queue.empty()):
|
||||||
HTML.CreateHtmlTestRow('N/A', 'KO', CONST.ALL_PROCESSES_OK)
|
HTML.CreateHtmlTestRow('N/A', 'KO', CONST.ALL_PROCESSES_OK)
|
||||||
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE)
|
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC)
|
||||||
return
|
return
|
||||||
else:
|
else:
|
||||||
attach_status = True
|
attach_status = True
|
||||||
@@ -943,7 +1001,7 @@ class OaiCiTest():
|
|||||||
time.sleep(5)
|
time.sleep(5)
|
||||||
else:
|
else:
|
||||||
HTML.CreateHtmlTestRowQueue('N/A', 'KO', len(self.UEDevices), html_queue)
|
HTML.CreateHtmlTestRowQueue('N/A', 'KO', len(self.UEDevices), html_queue)
|
||||||
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE)
|
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC)
|
||||||
|
|
||||||
def DetachUE_common(self, device_id, idx,COTS_UE):
|
def DetachUE_common(self, device_id, idx,COTS_UE):
|
||||||
try:
|
try:
|
||||||
@@ -976,7 +1034,7 @@ class OaiCiTest():
|
|||||||
pStatus = self.CheckProcessExist(check_eNB, check_OAI_UE,RAN,EPC)
|
pStatus = self.CheckProcessExist(check_eNB, check_OAI_UE,RAN,EPC)
|
||||||
if (pStatus < 0):
|
if (pStatus < 0):
|
||||||
HTML.CreateHtmlTestRow('N/A', 'KO', pStatus)
|
HTML.CreateHtmlTestRow('N/A', 'KO', pStatus)
|
||||||
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE)
|
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC)
|
||||||
return
|
return
|
||||||
multi_jobs = []
|
multi_jobs = []
|
||||||
cnt = 0
|
cnt = 0
|
||||||
@@ -1227,6 +1285,8 @@ class OaiCiTest():
|
|||||||
if lDataConnectionState == 3:
|
if lDataConnectionState == 3:
|
||||||
dataConnectionState = 'Data State: SUSPENDED'
|
dataConnectionState = 'Data State: SUSPENDED'
|
||||||
result = re.search('mDataConnectionReason=(?P<dataConnectionReason>[0-9a-zA-Z_]+)', SSH.getBefore())
|
result = re.search('mDataConnectionReason=(?P<dataConnectionReason>[0-9a-zA-Z_]+)', SSH.getBefore())
|
||||||
|
time.sleep(1)
|
||||||
|
SSH.close()
|
||||||
dataConnectionReason = 'Data Reason: UNKNOWN'
|
dataConnectionReason = 'Data Reason: UNKNOWN'
|
||||||
if result is not None:
|
if result is not None:
|
||||||
dataConnectionReason = 'Data Reason: ' + result.group('dataConnectionReason')
|
dataConnectionReason = 'Data Reason: ' + result.group('dataConnectionReason')
|
||||||
@@ -1240,7 +1300,6 @@ class OaiCiTest():
|
|||||||
qMsg = serviceState + '\n' + dataConnectionState + '\n' + dataConnectionReason
|
qMsg = serviceState + '\n' + dataConnectionState + '\n' + dataConnectionReason
|
||||||
statusQueue.put(qMsg)
|
statusQueue.put(qMsg)
|
||||||
lock.release()
|
lock.release()
|
||||||
SSH.close()
|
|
||||||
except:
|
except:
|
||||||
os.kill(os.getppid(),signal.SIGUSR1)
|
os.kill(os.getppid(),signal.SIGUSR1)
|
||||||
|
|
||||||
@@ -1267,12 +1326,12 @@ class OaiCiTest():
|
|||||||
i += 1
|
i += 1
|
||||||
for job in multi_jobs:
|
for job in multi_jobs:
|
||||||
job.join()
|
job.join()
|
||||||
if RAN.flexranCtrlInstalled and RAN.flexranCtrlStarted:
|
if (RAN.flexranCtrlInstalled and RAN.flexranCtrlStarted) or RAN.flexranCtrlDeployed:
|
||||||
SSH = sshconnection.SSHConnection()
|
SSH = sshconnection.SSHConnection()
|
||||||
SSH.open(EPC.IPAddress, EPC.UserName, EPC.Password)
|
SSH.open(EPC.IPAddress, EPC.UserName, EPC.Password)
|
||||||
SSH.command('cd /opt/flexran_rtc', '\$', 5)
|
SSH.command('cd ' + EPC.SourceCodePath + '/scripts', '\$', 5)
|
||||||
SSH.command('curl http://localhost:9999/stats | jq \'.\' > log/check_status_' + self.testCase_id + '.log 2>&1', '\$', 5)
|
SSH.command('curl http://' + RAN.flexranCtrlIpAddress + ':9999/stats | jq \'.\' > check_status_' + self.testCase_id + '.log 2>&1', '\$', 5)
|
||||||
SSH.command('cat log/check_status_' + self.testCase_id + '.log | jq \'.eNB_config[0].UE\' | grep -c rnti | sed -e "s#^#Nb Connected UE = #"', '\$', 5)
|
SSH.command('cat check_status_' + self.testCase_id + '.log | jq \'.eNB_config[0].UE\' | grep -c rnti | sed -e "s#^#Nb Connected UE = #"', '\$', 5)
|
||||||
result = re.search('Nb Connected UE = (?P<nb_ues>[0-9]+)', SSH.getBefore())
|
result = re.search('Nb Connected UE = (?P<nb_ues>[0-9]+)', SSH.getBefore())
|
||||||
passStatus = True
|
passStatus = True
|
||||||
if result is not None:
|
if result is not None:
|
||||||
@@ -1291,7 +1350,7 @@ class OaiCiTest():
|
|||||||
|
|
||||||
if (status_queue.empty()):
|
if (status_queue.empty()):
|
||||||
HTML.CreateHtmlTestRow(htmlOptions, 'KO', CONST.ALL_PROCESSES_OK)
|
HTML.CreateHtmlTestRow(htmlOptions, 'KO', CONST.ALL_PROCESSES_OK)
|
||||||
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE)
|
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC)
|
||||||
else:
|
else:
|
||||||
check_status = True
|
check_status = True
|
||||||
html_queue = SimpleQueue()
|
html_queue = SimpleQueue()
|
||||||
@@ -1307,7 +1366,7 @@ class OaiCiTest():
|
|||||||
HTML.CreateHtmlTestRowQueue(htmlOptions, 'OK', len(self.UEDevices), html_queue)
|
HTML.CreateHtmlTestRowQueue(htmlOptions, 'OK', len(self.UEDevices), html_queue)
|
||||||
else:
|
else:
|
||||||
HTML.CreateHtmlTestRowQueue(htmlOptions, 'KO', len(self.UEDevices), html_queue)
|
HTML.CreateHtmlTestRowQueue(htmlOptions, 'KO', len(self.UEDevices), html_queue)
|
||||||
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE)
|
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC)
|
||||||
|
|
||||||
def GetAllUEIPAddresses(self):
|
def GetAllUEIPAddresses(self):
|
||||||
SSH = sshconnection.SSHConnection()
|
SSH = sshconnection.SSHConnection()
|
||||||
@@ -1397,17 +1456,26 @@ class OaiCiTest():
|
|||||||
if re.match('OAI-Rel14-Docker', EPC.Type, re.IGNORECASE):
|
if re.match('OAI-Rel14-Docker', EPC.Type, re.IGNORECASE):
|
||||||
launchFromTrfContainer = True
|
launchFromTrfContainer = True
|
||||||
if launchFromTrfContainer:
|
if launchFromTrfContainer:
|
||||||
ping_status = SSH.command('docker exec -it prod-trf-gen /bin/bash -c "ping ' + self.ping_args + ' ' + UE_IPAddress + '" 2>&1 | tee ping_' + self.testCase_id + '_' + device_id + '.log', '\$', int(ping_time[0])*1.5)
|
ping_status = SSH.command('docker exec -it prod-trf-gen /bin/bash -c "ping ' + self.ping_args + ' ' + UE_IPAddress + '" 2>&1 | tee ping_' + self.testCase_id + '_' + device_id + '.log', '\$', int(ping_time[0])*1.5)
|
||||||
else:
|
else:
|
||||||
ping_status = SSH.command('stdbuf -o0 ping ' + self.ping_args + ' ' + UE_IPAddress + ' 2>&1 | stdbuf -o0 tee ping_' + self.testCase_id + '_' + device_id + '.log', '\$', int(ping_time[0])*1.5)
|
ping_status = SSH.command('stdbuf -o0 ping ' + self.ping_args + ' ' + UE_IPAddress + ' 2>&1 | stdbuf -o0 tee ping_' + self.testCase_id + '_' + device_id + '.log', '\$', int(ping_time[0])*1.5)
|
||||||
|
#copy the ping log file to have it locally for analysis (ping stats)
|
||||||
|
SSH.copyin(EPC.IPAddress, EPC.UserName, EPC.Password, EPC.SourceCodePath + '/scripts/ping_' + self.testCase_id + '_' + device_id + '.log', '.')
|
||||||
else:
|
else:
|
||||||
|
#ping log file is on the python executor
|
||||||
cmd = 'ping ' + self.ping_args + ' ' + UE_IPAddress + ' 2>&1 > ping_' + self.testCase_id + '_' + device_id + '.log'
|
cmd = 'ping ' + self.ping_args + ' ' + UE_IPAddress + ' 2>&1 > ping_' + self.testCase_id + '_' + device_id + '.log'
|
||||||
message = cmd + '\n'
|
message = cmd + '\n'
|
||||||
logging.debug(cmd)
|
logging.debug(cmd)
|
||||||
ret = subprocess.run(cmd, shell=True)
|
ret = subprocess.run(cmd, shell=True)
|
||||||
ping_status = ret.returncode
|
ping_status = ret.returncode
|
||||||
|
#copy the ping log file to an other folder for log collection (source and destination are EPC)
|
||||||
SSH.copyout(EPC.IPAddress, EPC.UserName, EPC.Password, 'ping_' + self.testCase_id + '_' + device_id + '.log', EPC.SourceCodePath + '/scripts')
|
SSH.copyout(EPC.IPAddress, EPC.UserName, EPC.Password, 'ping_' + self.testCase_id + '_' + device_id + '.log', EPC.SourceCodePath + '/scripts')
|
||||||
|
#copy the ping log file to have it locally for analysis (ping stats)
|
||||||
|
logging.debug(EPC.SourceCodePath + 'ping_' + self.testCase_id + '_' + device_id + '.log')
|
||||||
|
SSH.copyin(EPC.IPAddress, EPC.UserName, EPC.Password, EPC.SourceCodePath +'/scripts/ping_' + self.testCase_id + '_' + device_id + '.log', '.')
|
||||||
|
|
||||||
SSH.open(EPC.IPAddress, EPC.UserName, EPC.Password)
|
SSH.open(EPC.IPAddress, EPC.UserName, EPC.Password)
|
||||||
|
#cat is executed on EPC
|
||||||
SSH.command('cat ' + EPC.SourceCodePath + '/scripts/ping_' + self.testCase_id + '_' + device_id + '.log', '\$', 5)
|
SSH.command('cat ' + EPC.SourceCodePath + '/scripts/ping_' + self.testCase_id + '_' + device_id + '.log', '\$', 5)
|
||||||
# TIMEOUT CASE
|
# TIMEOUT CASE
|
||||||
if ping_status < 0:
|
if ping_status < 0:
|
||||||
@@ -1416,6 +1484,7 @@ class OaiCiTest():
|
|||||||
SSH.close()
|
SSH.close()
|
||||||
self.ping_iperf_wrong_exit(lock, UE_IPAddress, device_id, statusQueue, message)
|
self.ping_iperf_wrong_exit(lock, UE_IPAddress, device_id, statusQueue, message)
|
||||||
return
|
return
|
||||||
|
#search is done on cat result
|
||||||
result = re.search(', (?P<packetloss>[0-9\.]+)% packet loss, time [0-9\.]+ms', SSH.getBefore())
|
result = re.search(', (?P<packetloss>[0-9\.]+)% packet loss, time [0-9\.]+ms', SSH.getBefore())
|
||||||
if result is None:
|
if result is None:
|
||||||
message = 'Packet Loss Not Found!'
|
message = 'Packet Loss Not Found!'
|
||||||
@@ -1450,7 +1519,27 @@ class OaiCiTest():
|
|||||||
logging.debug('\u001B[1;34m ' + min_msg + '\u001B[0m')
|
logging.debug('\u001B[1;34m ' + min_msg + '\u001B[0m')
|
||||||
logging.debug('\u001B[1;34m ' + avg_msg + '\u001B[0m')
|
logging.debug('\u001B[1;34m ' + avg_msg + '\u001B[0m')
|
||||||
logging.debug('\u001B[1;34m ' + max_msg + '\u001B[0m')
|
logging.debug('\u001B[1;34m ' + max_msg + '\u001B[0m')
|
||||||
qMsg = pal_msg + '\n' + min_msg + '\n' + avg_msg + '\n' + max_msg
|
|
||||||
|
#adding extra ping stats from local file
|
||||||
|
ping_log_file='ping_' + self.testCase_id + '_' + device_id + '.log'
|
||||||
|
logging.debug('Analyzing Ping log file : ' + os.getcwd() + '/' + ping_log_file)
|
||||||
|
ping_stat=GetPingTimeAnalysis(ping_log_file)
|
||||||
|
ping_stat_msg=''
|
||||||
|
if (ping_stat!=-1) and (len(ping_stat)!=0):
|
||||||
|
ping_stat_msg+='Ping stats before removing largest value : \n'
|
||||||
|
ping_stat_msg+='RTT(Min) : ' + str("{:.2f}".format(ping_stat['min_0'])) + 'ms \n'
|
||||||
|
ping_stat_msg+='RTT(Mean) : ' + str("{:.2f}".format(ping_stat['mean_0'])) + 'ms \n'
|
||||||
|
ping_stat_msg+='RTT(Median) : ' + str("{:.2f}".format(ping_stat['median_0'])) + 'ms \n'
|
||||||
|
ping_stat_msg+='RTT(Max) : ' + str("{:.2f}".format(ping_stat['max_0'])) + 'ms \n'
|
||||||
|
ping_stat_msg+='Max Index : ' + str(ping_stat['max_loc']) + '\n'
|
||||||
|
ping_stat_msg+='Ping stats after removing largest value : \n'
|
||||||
|
ping_stat_msg+='RTT(Min) : ' + str("{:.2f}".format(ping_stat['min_1'])) + 'ms \n'
|
||||||
|
ping_stat_msg+='RTT(Mean) : ' + str("{:.2f}".format(ping_stat['mean_1'])) + 'ms \n'
|
||||||
|
ping_stat_msg+='RTT(Median) : ' + str("{:.2f}".format(ping_stat['median_1'])) + 'ms \n'
|
||||||
|
ping_stat_msg+='RTT(Max) : ' + str("{:.2f}".format(ping_stat['max_1'])) + 'ms \n'
|
||||||
|
|
||||||
|
#building html message
|
||||||
|
qMsg = pal_msg + '\n' + min_msg + '\n' + avg_msg + '\n' + max_msg + '\n' + ping_stat_msg
|
||||||
packetLossOK = True
|
packetLossOK = True
|
||||||
if packetloss is not None:
|
if packetloss is not None:
|
||||||
if float(packetloss) > float(self.ping_packetloss_threshold):
|
if float(packetloss) > float(self.ping_packetloss_threshold):
|
||||||
@@ -1485,7 +1574,7 @@ class OaiCiTest():
|
|||||||
pStatus = self.CheckProcessExist(check_eNB, check_OAI_UE,RAN,EPC)
|
pStatus = self.CheckProcessExist(check_eNB, check_OAI_UE,RAN,EPC)
|
||||||
if (pStatus < 0):
|
if (pStatus < 0):
|
||||||
HTML.CreateHtmlTestRow(self.ping_args, 'KO', pStatus)
|
HTML.CreateHtmlTestRow(self.ping_args, 'KO', pStatus)
|
||||||
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE)
|
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC)
|
||||||
return
|
return
|
||||||
ping_from_eNB = re.search('oaitun_enb1', str(self.ping_args))
|
ping_from_eNB = re.search('oaitun_enb1', str(self.ping_args))
|
||||||
if ping_from_eNB is not None:
|
if ping_from_eNB is not None:
|
||||||
@@ -1587,12 +1676,12 @@ class OaiCiTest():
|
|||||||
pStatus = self.CheckProcessExist(check_eNB, check_OAI_UE,RAN,EPC)
|
pStatus = self.CheckProcessExist(check_eNB, check_OAI_UE,RAN,EPC)
|
||||||
if (pStatus < 0):
|
if (pStatus < 0):
|
||||||
HTML.CreateHtmlTestRow(self.ping_args, 'KO', pStatus)
|
HTML.CreateHtmlTestRow(self.ping_args, 'KO', pStatus)
|
||||||
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE)
|
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC)
|
||||||
return
|
return
|
||||||
ueIpStatus = self.GetAllUEIPAddresses()
|
ueIpStatus = self.GetAllUEIPAddresses()
|
||||||
if (ueIpStatus < 0):
|
if (ueIpStatus < 0):
|
||||||
HTML.CreateHtmlTestRow(self.ping_args, 'KO', CONST.UE_IP_ADDRESS_ISSUE)
|
HTML.CreateHtmlTestRow(self.ping_args, 'KO', CONST.UE_IP_ADDRESS_ISSUE)
|
||||||
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE)
|
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC)
|
||||||
return
|
return
|
||||||
multi_jobs = []
|
multi_jobs = []
|
||||||
i = 0
|
i = 0
|
||||||
@@ -1610,7 +1699,7 @@ class OaiCiTest():
|
|||||||
|
|
||||||
if (status_queue.empty()):
|
if (status_queue.empty()):
|
||||||
HTML.CreateHtmlTestRow(self.ping_args, 'KO', CONST.ALL_PROCESSES_OK)
|
HTML.CreateHtmlTestRow(self.ping_args, 'KO', CONST.ALL_PROCESSES_OK)
|
||||||
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE)
|
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC)
|
||||||
else:
|
else:
|
||||||
ping_status = True
|
ping_status = True
|
||||||
html_queue = SimpleQueue()
|
html_queue = SimpleQueue()
|
||||||
@@ -1627,7 +1716,7 @@ class OaiCiTest():
|
|||||||
HTML.CreateHtmlTestRowQueue(self.ping_args, 'OK', len(self.UEDevices), html_queue)
|
HTML.CreateHtmlTestRowQueue(self.ping_args, 'OK', len(self.UEDevices), html_queue)
|
||||||
else:
|
else:
|
||||||
HTML.CreateHtmlTestRowQueue(self.ping_args, 'KO', len(self.UEDevices), html_queue)
|
HTML.CreateHtmlTestRowQueue(self.ping_args, 'KO', len(self.UEDevices), html_queue)
|
||||||
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE)
|
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC)
|
||||||
|
|
||||||
def Iperf_ComputeTime(self):
|
def Iperf_ComputeTime(self):
|
||||||
result = re.search('-t (?P<iperf_time>\d+)', str(self.iperf_args))
|
result = re.search('-t (?P<iperf_time>\d+)', str(self.iperf_args))
|
||||||
@@ -1934,15 +2023,34 @@ class OaiCiTest():
|
|||||||
ret = subprocess.run(cmd, shell=True, stdout=subprocess.PIPE, encoding='utf-8')
|
ret = subprocess.run(cmd, shell=True, stdout=subprocess.PIPE, encoding='utf-8')
|
||||||
if ret.stdout is not None:
|
if ret.stdout is not None:
|
||||||
EPC_Iperf_UE_IPAddress = ret.stdout.strip()
|
EPC_Iperf_UE_IPAddress = ret.stdout.strip()
|
||||||
|
# When using a docker-based deployment, IPERF client shall be launched from trf container
|
||||||
|
launchFromTrfContainer = False
|
||||||
|
if re.match('OAI-Rel14-Docker', EPC.Type, re.IGNORECASE):
|
||||||
|
launchFromTrfContainer = True
|
||||||
|
SSH.open(EPC.IPAddress, EPC.UserName, EPC.Password)
|
||||||
|
SSH.command('docker inspect --format="TRF_IP_ADDR = {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}" prod-trf-gen', '\$', 5)
|
||||||
|
result = re.search('TRF_IP_ADDR = (?P<trf_ip_addr>[0-9\.]+)', SSH.getBefore())
|
||||||
|
if result is not None:
|
||||||
|
EPC_Iperf_UE_IPAddress = result.group('trf_ip_addr')
|
||||||
|
SSH.close()
|
||||||
port = 5001 + idx
|
port = 5001 + idx
|
||||||
|
udpOptions = ''
|
||||||
|
if udpIperf:
|
||||||
|
udpOptions = '-u '
|
||||||
if launchFromEpc:
|
if launchFromEpc:
|
||||||
SSH.open(EPC.IPAddress, EPC.UserName, EPC.Password)
|
SSH.open(EPC.IPAddress, EPC.UserName, EPC.Password)
|
||||||
SSH.command('cd ' + EPC.SourceCodePath + '/scripts', '\$', 5)
|
SSH.command('cd ' + EPC.SourceCodePath + '/scripts', '\$', 5)
|
||||||
SSH.command('rm -f iperf_server_' + self.testCase_id + '_' + device_id + '.log', '\$', 5)
|
SSH.command('rm -f iperf_server_' + self.testCase_id + '_' + device_id + '.log', '\$', 5)
|
||||||
if udpIperf:
|
if launchFromTrfContainer:
|
||||||
SSH.command('echo $USER; nohup iperf -u -s -i 1 -p ' + str(port) + ' > iperf_server_' + self.testCase_id + '_' + device_id + '.log &', EPC.UserName, 5)
|
if self.ueIperfVersion == self.dummyIperfVersion:
|
||||||
|
prefix = ''
|
||||||
|
else:
|
||||||
|
prefix = ''
|
||||||
|
if self.ueIperfVersion == '2.0.5':
|
||||||
|
prefix = '/iperf-2.0.5/bin/'
|
||||||
|
SSH.command('docker exec -d prod-trf-gen /bin/bash -c "nohup ' + prefix + 'iperf ' + udpOptions + '-s -i 1 -p ' + str(port) + ' > iperf_server_' + self.testCase_id + '_' + device_id + '.log &"', '\$', 5)
|
||||||
else:
|
else:
|
||||||
SSH.command('echo $USER; nohup iperf -s -i 1 -p ' + str(port) + ' > iperf_server_' + self.testCase_id + '_' + device_id + '.log &', EPC.UserName, 5)
|
SSH.command('echo $USER; nohup iperf ' + udpOptions + '-s -i 1 -p ' + str(port) + ' > iperf_server_' + self.testCase_id + '_' + device_id + '.log &', EPC.UserName, 5)
|
||||||
SSH.close()
|
SSH.close()
|
||||||
else:
|
else:
|
||||||
if self.ueIperfVersion == self.dummyIperfVersion:
|
if self.ueIperfVersion == self.dummyIperfVersion:
|
||||||
@@ -1951,10 +2059,7 @@ class OaiCiTest():
|
|||||||
prefix = ''
|
prefix = ''
|
||||||
if self.ueIperfVersion == '2.0.5':
|
if self.ueIperfVersion == '2.0.5':
|
||||||
prefix = '/opt/iperf-2.0.5/bin/'
|
prefix = '/opt/iperf-2.0.5/bin/'
|
||||||
if udpIperf:
|
cmd = 'nohup ' + prefix + 'iperf ' + udpOptions + '-s -i 1 -p ' + str(port) + ' > iperf_server_' + self.testCase_id + '_' + device_id + '.log 2>&1 &'
|
||||||
cmd = 'nohup ' + prefix + 'iperf -u -s -i 1 -p ' + str(port) + ' > iperf_server_' + self.testCase_id + '_' + device_id + '.log 2>&1 &'
|
|
||||||
else:
|
|
||||||
cmd = 'nohup ' + prefix + 'iperf -s -i 1 -p ' + str(port) + ' > iperf_server_' + self.testCase_id + '_' + device_id + '.log 2>&1 &'
|
|
||||||
logging.debug(cmd)
|
logging.debug(cmd)
|
||||||
subprocess.run(cmd, shell=True, stdout=subprocess.PIPE, encoding='utf-8')
|
subprocess.run(cmd, shell=True, stdout=subprocess.PIPE, encoding='utf-8')
|
||||||
time.sleep(0.5)
|
time.sleep(0.5)
|
||||||
@@ -2000,13 +2105,16 @@ class OaiCiTest():
|
|||||||
# Kill iperf server on EPC side
|
# Kill iperf server on EPC side
|
||||||
if launchFromEpc:
|
if launchFromEpc:
|
||||||
SSH.open(EPC.IPAddress, EPC.UserName, EPC.Password)
|
SSH.open(EPC.IPAddress, EPC.UserName, EPC.Password)
|
||||||
SSH.command('killall --signal SIGKILL iperf', EPC.UserName, 5)
|
if launchFromTrfContainer:
|
||||||
|
SSH.command('docker exec -it prod-trf-gen /bin/bash -c "killall --signal SIGKILL iperf"', '\$', 5)
|
||||||
|
else:
|
||||||
|
SSH.command('killall --signal SIGKILL iperf', EPC.UserName, 5)
|
||||||
SSH.close()
|
SSH.close()
|
||||||
else:
|
else:
|
||||||
cmd = 'killall --signal SIGKILL iperf'
|
cmd = 'killall --signal SIGKILL iperf'
|
||||||
logging.debug(cmd)
|
logging.debug(cmd)
|
||||||
subprocess.run(cmd, shell=True)
|
subprocess.run(cmd, shell=True)
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
SSH.copyout(EPC.IPAddress, EPC.UserName, EPC.Password, 'iperf_server_' + self.testCase_id + '_' + device_id + '.log', EPC.SourceCodePath + '/scripts')
|
SSH.copyout(EPC.IPAddress, EPC.UserName, EPC.Password, 'iperf_server_' + self.testCase_id + '_' + device_id + '.log', EPC.SourceCodePath + '/scripts')
|
||||||
# in case of failure, retrieve server log
|
# in case of failure, retrieve server log
|
||||||
if (clientStatus == -1) or (clientStatus == -2):
|
if (clientStatus == -1) or (clientStatus == -2):
|
||||||
@@ -2014,6 +2122,10 @@ class OaiCiTest():
|
|||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
if (os.path.isfile('iperf_server_' + self.testCase_id + '_' + device_id + '.log')):
|
if (os.path.isfile('iperf_server_' + self.testCase_id + '_' + device_id + '.log')):
|
||||||
os.remove('iperf_server_' + self.testCase_id + '_' + device_id + '.log')
|
os.remove('iperf_server_' + self.testCase_id + '_' + device_id + '.log')
|
||||||
|
if launchFromTrfContainer:
|
||||||
|
SSH.open(EPC.IPAddress, EPC.UserName, EPC.Password)
|
||||||
|
SSH.command('docker cp prod-trf-gen:/iperf-2.0.5/iperf_server_' + self.testCase_id + '_' + device_id + '.log ' + EPC.SourceCodePath + '/scripts', '\$', 5)
|
||||||
|
SSH.close()
|
||||||
SSH.copyin(EPC.IPAddress, EPC.UserName, EPC.Password, EPC.SourceCodePath+ '/scripts/iperf_server_' + self.testCase_id + '_' + device_id + '.log', '.')
|
SSH.copyin(EPC.IPAddress, EPC.UserName, EPC.Password, EPC.SourceCodePath+ '/scripts/iperf_server_' + self.testCase_id + '_' + device_id + '.log', '.')
|
||||||
self.Iperf_analyzeV2Server(lock, UE_IPAddress, device_id, statusQueue, modified_options)
|
self.Iperf_analyzeV2Server(lock, UE_IPAddress, device_id, statusQueue, modified_options)
|
||||||
# in case of OAI-UE
|
# in case of OAI-UE
|
||||||
@@ -2212,8 +2324,16 @@ class OaiCiTest():
|
|||||||
else:
|
else:
|
||||||
SSH.copyin(self.ADBIPAddress, self.ADBUserName, self.ADBPassword, EPC.SourceCodePath + '/scripts/iperf_server_' + self.testCase_id + '_' + device_id + '.log', '.')
|
SSH.copyin(self.ADBIPAddress, self.ADBUserName, self.ADBPassword, EPC.SourceCodePath + '/scripts/iperf_server_' + self.testCase_id + '_' + device_id + '.log', '.')
|
||||||
# fromdos has to be called on the python executor not on ADB server
|
# fromdos has to be called on the python executor not on ADB server
|
||||||
cmd = 'fromdos -o iperf_server_' + self.testCase_id + '_' + device_id + '.log'
|
cmd = 'fromdos -o iperf_server_' + self.testCase_id + '_' + device_id + '.log 2>&1 > /dev/null'
|
||||||
subprocess.run(cmd, shell=True)
|
try:
|
||||||
|
subprocess.run(cmd, shell=True)
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
cmd = 'dos2unix -o iperf_server_' + self.testCase_id + '_' + device_id + '.log 2>&1 > /dev/null'
|
||||||
|
try:
|
||||||
|
subprocess.run(cmd, shell=True)
|
||||||
|
except:
|
||||||
|
pass
|
||||||
self.Iperf_analyzeV2Server(lock, UE_IPAddress, device_id, statusQueue, modified_options)
|
self.Iperf_analyzeV2Server(lock, UE_IPAddress, device_id, statusQueue, modified_options)
|
||||||
|
|
||||||
# in case of OAI UE:
|
# in case of OAI UE:
|
||||||
@@ -2237,7 +2357,7 @@ class OaiCiTest():
|
|||||||
pStatus = self.CheckProcessExist(check_eNB, check_OAI_UE,RAN,EPC)
|
pStatus = self.CheckProcessExist(check_eNB, check_OAI_UE,RAN,EPC)
|
||||||
if (pStatus < 0):
|
if (pStatus < 0):
|
||||||
HTML.CreateHtmlTestRow(self.iperf_args, 'KO', pStatus)
|
HTML.CreateHtmlTestRow(self.iperf_args, 'KO', pStatus)
|
||||||
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE)
|
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC)
|
||||||
return
|
return
|
||||||
server_on_enb = re.search('-R', str(self.iperf_args))
|
server_on_enb = re.search('-R', str(self.iperf_args))
|
||||||
if server_on_enb is not None:
|
if server_on_enb is not None:
|
||||||
@@ -2335,7 +2455,7 @@ class OaiCiTest():
|
|||||||
HTML.CreateHtmlTestRowQueue(self.iperf_args, 'OK', len(self.UEDevices), html_queue)
|
HTML.CreateHtmlTestRowQueue(self.iperf_args, 'OK', len(self.UEDevices), html_queue)
|
||||||
else:
|
else:
|
||||||
HTML.CreateHtmlTestRowQueue(self.iperf_args, 'KO', len(self.UEDevices), html_queue)
|
HTML.CreateHtmlTestRowQueue(self.iperf_args, 'KO', len(self.UEDevices), html_queue)
|
||||||
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE)
|
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC)
|
||||||
|
|
||||||
def Iperf(self,HTML,RAN,EPC,COTS_UE):
|
def Iperf(self,HTML,RAN,EPC,COTS_UE):
|
||||||
result = re.search('noS1', str(RAN.Initialize_eNB_args))
|
result = re.search('noS1', str(RAN.Initialize_eNB_args))
|
||||||
@@ -2353,13 +2473,13 @@ class OaiCiTest():
|
|||||||
pStatus = self.CheckProcessExist(check_eNB, check_OAI_UE,RAN,EPC)
|
pStatus = self.CheckProcessExist(check_eNB, check_OAI_UE,RAN,EPC)
|
||||||
if (pStatus < 0):
|
if (pStatus < 0):
|
||||||
HTML.CreateHtmlTestRow(self.iperf_args, 'KO', pStatus)
|
HTML.CreateHtmlTestRow(self.iperf_args, 'KO', pStatus)
|
||||||
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE)
|
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC)
|
||||||
return
|
return
|
||||||
ueIpStatus = self.GetAllUEIPAddresses()
|
ueIpStatus = self.GetAllUEIPAddresses()
|
||||||
if (ueIpStatus < 0):
|
if (ueIpStatus < 0):
|
||||||
logging.debug('going here')
|
logging.debug('going here')
|
||||||
HTML.CreateHtmlTestRow(self.iperf_args, 'KO', CONST.UE_IP_ADDRESS_ISSUE)
|
HTML.CreateHtmlTestRow(self.iperf_args, 'KO', CONST.UE_IP_ADDRESS_ISSUE)
|
||||||
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE)
|
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC)
|
||||||
return
|
return
|
||||||
|
|
||||||
self.dummyIperfVersion = '2.0.10'
|
self.dummyIperfVersion = '2.0.10'
|
||||||
@@ -2390,7 +2510,7 @@ class OaiCiTest():
|
|||||||
|
|
||||||
if (status_queue.empty()):
|
if (status_queue.empty()):
|
||||||
HTML.CreateHtmlTestRow(self.iperf_args, 'KO', CONST.ALL_PROCESSES_OK)
|
HTML.CreateHtmlTestRow(self.iperf_args, 'KO', CONST.ALL_PROCESSES_OK)
|
||||||
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE)
|
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC)
|
||||||
else:
|
else:
|
||||||
iperf_status = True
|
iperf_status = True
|
||||||
iperf_noperf = False
|
iperf_noperf = False
|
||||||
@@ -2412,7 +2532,7 @@ class OaiCiTest():
|
|||||||
HTML.CreateHtmlTestRowQueue(self.iperf_args, 'OK', len(self.UEDevices), html_queue)
|
HTML.CreateHtmlTestRowQueue(self.iperf_args, 'OK', len(self.UEDevices), html_queue)
|
||||||
else:
|
else:
|
||||||
HTML.CreateHtmlTestRowQueue(self.iperf_args, 'KO', len(self.UEDevices), html_queue)
|
HTML.CreateHtmlTestRowQueue(self.iperf_args, 'KO', len(self.UEDevices), html_queue)
|
||||||
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE)
|
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC)
|
||||||
|
|
||||||
def CheckProcessExist(self, check_eNB, check_OAI_UE,RAN,EPC):
|
def CheckProcessExist(self, check_eNB, check_OAI_UE,RAN,EPC):
|
||||||
multi_jobs = []
|
multi_jobs = []
|
||||||
@@ -2832,7 +2952,7 @@ class OaiCiTest():
|
|||||||
job.join()
|
job.join()
|
||||||
HTML.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK)
|
HTML.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK)
|
||||||
|
|
||||||
def TerminateOAIUE(self,HTML,RAN,COTS_UE):
|
def TerminateOAIUE(self,HTML,RAN,COTS_UE,EPC):
|
||||||
SSH = sshconnection.SSHConnection()
|
SSH = sshconnection.SSHConnection()
|
||||||
SSH.open(self.UEIPAddress, self.UEUserName, self.UEPassword)
|
SSH.open(self.UEIPAddress, self.UEUserName, self.UEPassword)
|
||||||
SSH.command('cd ' + self.UESourceCodePath + '/cmake_targets', '\$', 5)
|
SSH.command('cd ' + self.UESourceCodePath + '/cmake_targets', '\$', 5)
|
||||||
@@ -2873,11 +2993,11 @@ class OaiCiTest():
|
|||||||
# Not an error then
|
# Not an error then
|
||||||
if (logStatus != CONST.OAI_UE_PROCESS_COULD_NOT_SYNC) or (ueAction != 'Sniffing'):
|
if (logStatus != CONST.OAI_UE_PROCESS_COULD_NOT_SYNC) or (ueAction != 'Sniffing'):
|
||||||
self.Initialize_OAI_UE_args = ''
|
self.Initialize_OAI_UE_args = ''
|
||||||
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE)
|
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC)
|
||||||
else:
|
else:
|
||||||
if (logStatus == CONST.OAI_UE_PROCESS_COULD_NOT_SYNC):
|
if (logStatus == CONST.OAI_UE_PROCESS_COULD_NOT_SYNC):
|
||||||
self.Initialize_OAI_UE_args = ''
|
self.Initialize_OAI_UE_args = ''
|
||||||
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE)
|
self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC)
|
||||||
else:
|
else:
|
||||||
logging.debug('\u001B[1m' + ueAction + ' Completed \u001B[0m')
|
logging.debug('\u001B[1m' + ueAction + ' Completed \u001B[0m')
|
||||||
HTML.htmlUEFailureMsg='<b>' + ueAction + ' Completed</b>\n' + HTML.htmlUEFailureMsg
|
HTML.htmlUEFailureMsg='<b>' + ueAction + ' Completed</b>\n' + HTML.htmlUEFailureMsg
|
||||||
@@ -2886,7 +3006,7 @@ class OaiCiTest():
|
|||||||
else:
|
else:
|
||||||
HTML.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK)
|
HTML.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK)
|
||||||
|
|
||||||
def AutoTerminateUEandeNB(self,HTML,RAN,COTS_UE):
|
def AutoTerminateUEandeNB(self,HTML,RAN,COTS_UE,EPC):
|
||||||
if (self.ADBIPAddress != 'none'):
|
if (self.ADBIPAddress != 'none'):
|
||||||
self.testCase_id = 'AUTO-KILL-UE'
|
self.testCase_id = 'AUTO-KILL-UE'
|
||||||
HTML.testCase_id=self.testCase_id
|
HTML.testCase_id=self.testCase_id
|
||||||
@@ -2900,15 +3020,19 @@ class OaiCiTest():
|
|||||||
self.desc = 'Automatic Termination of OAI-UE'
|
self.desc = 'Automatic Termination of OAI-UE'
|
||||||
HTML.desc='Automatic Termination of OAI-UE'
|
HTML.desc='Automatic Termination of OAI-UE'
|
||||||
self.ShowTestID()
|
self.ShowTestID()
|
||||||
self.TerminateOAIUE(HTML,RAN,COTS_UE)
|
self.TerminateOAIUE(HTML,RAN,COTS_UE,EPC)
|
||||||
if (RAN.Initialize_eNB_args != ''):
|
if (RAN.Initialize_eNB_args != ''):
|
||||||
self.testCase_id = 'AUTO-KILL-eNB'
|
self.testCase_id = 'AUTO-KILL-RAN'
|
||||||
HTML.testCase_id=self.testCase_id
|
HTML.testCase_id=self.testCase_id
|
||||||
self.desc = 'Automatic Termination of eNB'
|
self.desc = 'Automatic Termination of all RAN nodes'
|
||||||
HTML.desc='Automatic Termination of eNB'
|
HTML.desc='Automatic Termination of RAN nodes'
|
||||||
self.ShowTestID()
|
self.ShowTestID()
|
||||||
RAN.eNB_instance=0
|
#terminate all RAN nodes eNB/gNB/OCP
|
||||||
RAN.TerminateeNB()
|
for instance in range(0, len(RAN.air_interface)):
|
||||||
|
if RAN.air_interface[instance]!='':
|
||||||
|
logging.debug('Auto Termination of Instance ' + str(instance) + ' : ' + RAN.air_interface[instance])
|
||||||
|
RAN.eNB_instance=instance
|
||||||
|
RAN.TerminateeNB(HTML,EPC)
|
||||||
if RAN.flexranCtrlInstalled and RAN.flexranCtrlStarted:
|
if RAN.flexranCtrlInstalled and RAN.flexranCtrlStarted:
|
||||||
self.testCase_id = 'AUTO-KILL-flexran-ctl'
|
self.testCase_id = 'AUTO-KILL-flexran-ctl'
|
||||||
HTML.testCase_id=self.testCase_id
|
HTML.testCase_id=self.testCase_id
|
||||||
@@ -3050,7 +3174,7 @@ class OaiCiTest():
|
|||||||
SSH.command('cd ' + SourceCodePath, '\$', 5)
|
SSH.command('cd ' + SourceCodePath, '\$', 5)
|
||||||
SSH.command('cd cmake_targets', '\$', 5)
|
SSH.command('cd cmake_targets', '\$', 5)
|
||||||
SSH.command('rm -f build.log.zip', '\$', 5)
|
SSH.command('rm -f build.log.zip', '\$', 5)
|
||||||
SSH.command('zip build.log.zip build_log_*/*', '\$', 60)
|
SSH.command('zip -r build.log.zip build_log_*/*', '\$', 60)
|
||||||
SSH.close()
|
SSH.close()
|
||||||
|
|
||||||
def LogCollectPing(self,EPC):
|
def LogCollectPing(self,EPC):
|
||||||
|
|||||||
@@ -181,6 +181,7 @@ eNBs = (
|
|||||||
{
|
{
|
||||||
ipv4 = "CI_MME_IP_ADDR";
|
ipv4 = "CI_MME_IP_ADDR";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
@@ -214,7 +215,7 @@ log_config = {
|
|||||||
NETWORK_CONTROLLER : {
|
NETWORK_CONTROLLER : {
|
||||||
FLEXRAN_ENABLED = "no";
|
FLEXRAN_ENABLED = "no";
|
||||||
FLEXRAN_INTERFACE_NAME = "lo";
|
FLEXRAN_INTERFACE_NAME = "lo";
|
||||||
FLEXRAN_IPV4_ADDRESS = "127.0.0.1";
|
FLEXRAN_IPV4_ADDRESS = "CI_FLEXRAN_CTL_IP_ADDR";
|
||||||
FLEXRAN_PORT = 2210;
|
FLEXRAN_PORT = 2210;
|
||||||
FLEXRAN_CACHE = "/mnt/oai_agent_cache";
|
FLEXRAN_CACHE = "/mnt/oai_agent_cache";
|
||||||
FLEXRAN_AWAIT_RECONF = "no";
|
FLEXRAN_AWAIT_RECONF = "no";
|
||||||
|
|||||||
@@ -181,6 +181,7 @@ eNBs = (
|
|||||||
{
|
{
|
||||||
ipv4 = "CI_MME_IP_ADDR";
|
ipv4 = "CI_MME_IP_ADDR";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
@@ -214,7 +215,7 @@ log_config = {
|
|||||||
NETWORK_CONTROLLER : {
|
NETWORK_CONTROLLER : {
|
||||||
FLEXRAN_ENABLED = "no";
|
FLEXRAN_ENABLED = "no";
|
||||||
FLEXRAN_INTERFACE_NAME = "lo";
|
FLEXRAN_INTERFACE_NAME = "lo";
|
||||||
FLEXRAN_IPV4_ADDRESS = "127.0.0.1";
|
FLEXRAN_IPV4_ADDRESS = "CI_FLEXRAN_CTL_IP_ADDR";
|
||||||
FLEXRAN_PORT = 2210;
|
FLEXRAN_PORT = 2210;
|
||||||
FLEXRAN_CACHE = "/mnt/oai_agent_cache";
|
FLEXRAN_CACHE = "/mnt/oai_agent_cache";
|
||||||
FLEXRAN_AWAIT_RECONF = "no";
|
FLEXRAN_AWAIT_RECONF = "no";
|
||||||
|
|||||||
@@ -181,6 +181,7 @@ eNBs = (
|
|||||||
{
|
{
|
||||||
ipv4 = "CI_MME_IP_ADDR";
|
ipv4 = "CI_MME_IP_ADDR";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
@@ -214,7 +215,7 @@ log_config = {
|
|||||||
NETWORK_CONTROLLER : {
|
NETWORK_CONTROLLER : {
|
||||||
FLEXRAN_ENABLED = "no";
|
FLEXRAN_ENABLED = "no";
|
||||||
FLEXRAN_INTERFACE_NAME = "lo";
|
FLEXRAN_INTERFACE_NAME = "lo";
|
||||||
FLEXRAN_IPV4_ADDRESS = "127.0.0.1";
|
FLEXRAN_IPV4_ADDRESS = "CI_FLEXRAN_CTL_IP_ADDR";
|
||||||
FLEXRAN_PORT = 2210;
|
FLEXRAN_PORT = 2210;
|
||||||
FLEXRAN_CACHE = "/mnt/oai_agent_cache";
|
FLEXRAN_CACHE = "/mnt/oai_agent_cache";
|
||||||
FLEXRAN_AWAIT_RECONF = "no";
|
FLEXRAN_AWAIT_RECONF = "no";
|
||||||
|
|||||||
@@ -112,7 +112,7 @@ log_config = {
|
|||||||
NETWORK_CONTROLLER : {
|
NETWORK_CONTROLLER : {
|
||||||
FLEXRAN_ENABLED = "no";
|
FLEXRAN_ENABLED = "no";
|
||||||
FLEXRAN_INTERFACE_NAME = "lo";
|
FLEXRAN_INTERFACE_NAME = "lo";
|
||||||
FLEXRAN_IPV4_ADDRESS = "127.0.0.1";
|
FLEXRAN_IPV4_ADDRESS = "CI_FLEXRAN_CTL_IP_ADDR";
|
||||||
FLEXRAN_PORT = 2210;
|
FLEXRAN_PORT = 2210;
|
||||||
FLEXRAN_CACHE = "/mnt/oai_agent_cache";
|
FLEXRAN_CACHE = "/mnt/oai_agent_cache";
|
||||||
FLEXRAN_AWAIT_RECONF = "no";
|
FLEXRAN_AWAIT_RECONF = "no";
|
||||||
|
|||||||
@@ -112,7 +112,7 @@ log_config = {
|
|||||||
NETWORK_CONTROLLER : {
|
NETWORK_CONTROLLER : {
|
||||||
FLEXRAN_ENABLED = "no";
|
FLEXRAN_ENABLED = "no";
|
||||||
FLEXRAN_INTERFACE_NAME = "lo";
|
FLEXRAN_INTERFACE_NAME = "lo";
|
||||||
FLEXRAN_IPV4_ADDRESS = "127.0.0.1";
|
FLEXRAN_IPV4_ADDRESS = "CI_FLEXRAN_CTL_IP_ADDR";
|
||||||
FLEXRAN_PORT = 2210;
|
FLEXRAN_PORT = 2210;
|
||||||
FLEXRAN_CACHE = "/mnt/oai_agent_cache";
|
FLEXRAN_CACHE = "/mnt/oai_agent_cache";
|
||||||
FLEXRAN_AWAIT_RECONF = "no";
|
FLEXRAN_AWAIT_RECONF = "no";
|
||||||
|
|||||||
@@ -112,7 +112,7 @@ log_config = {
|
|||||||
NETWORK_CONTROLLER : {
|
NETWORK_CONTROLLER : {
|
||||||
FLEXRAN_ENABLED = "no";
|
FLEXRAN_ENABLED = "no";
|
||||||
FLEXRAN_INTERFACE_NAME = "lo";
|
FLEXRAN_INTERFACE_NAME = "lo";
|
||||||
FLEXRAN_IPV4_ADDRESS = "127.0.0.1";
|
FLEXRAN_IPV4_ADDRESS = "CI_FLEXRAN_CTL_IP_ADDR";
|
||||||
FLEXRAN_PORT = 2210;
|
FLEXRAN_PORT = 2210;
|
||||||
FLEXRAN_CACHE = "/mnt/oai_agent_cache";
|
FLEXRAN_CACHE = "/mnt/oai_agent_cache";
|
||||||
FLEXRAN_AWAIT_RECONF = "no";
|
FLEXRAN_AWAIT_RECONF = "no";
|
||||||
|
|||||||
@@ -175,6 +175,7 @@ eNBs =
|
|||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
@@ -238,7 +239,7 @@ NETWORK_CONTROLLER :
|
|||||||
{
|
{
|
||||||
FLEXRAN_ENABLED = "no";
|
FLEXRAN_ENABLED = "no";
|
||||||
FLEXRAN_INTERFACE_NAME = "eth0";
|
FLEXRAN_INTERFACE_NAME = "eth0";
|
||||||
FLEXRAN_IPV4_ADDRESS = "CI_MME_IP_ADDR";
|
FLEXRAN_IPV4_ADDRESS = "CI_FLEXRAN_CTL_IP_ADDR";
|
||||||
FLEXRAN_PORT = 2210;
|
FLEXRAN_PORT = 2210;
|
||||||
FLEXRAN_CACHE = "/mnt/oai_agent_cache";
|
FLEXRAN_CACHE = "/mnt/oai_agent_cache";
|
||||||
FLEXRAN_AWAIT_RECONF = "no";
|
FLEXRAN_AWAIT_RECONF = "no";
|
||||||
|
|||||||
@@ -356,6 +356,7 @@ eNBs =
|
|||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
@@ -447,7 +448,7 @@ NETWORK_CONTROLLER :
|
|||||||
{
|
{
|
||||||
FLEXRAN_ENABLED = "no";
|
FLEXRAN_ENABLED = "no";
|
||||||
FLEXRAN_INTERFACE_NAME = "lo";
|
FLEXRAN_INTERFACE_NAME = "lo";
|
||||||
FLEXRAN_IPV4_ADDRESS = "127.0.0.1";
|
FLEXRAN_IPV4_ADDRESS = "CI_FLEXRAN_CTL_IP_ADDR";
|
||||||
FLEXRAN_PORT = 2210;
|
FLEXRAN_PORT = 2210;
|
||||||
FLEXRAN_CACHE = "/mnt/oai_agent_cache";
|
FLEXRAN_CACHE = "/mnt/oai_agent_cache";
|
||||||
FLEXRAN_AWAIT_RECONF = "no";
|
FLEXRAN_AWAIT_RECONF = "no";
|
||||||
|
|||||||
@@ -177,6 +177,7 @@ eNBs =
|
|||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
@@ -250,7 +251,7 @@ NETWORK_CONTROLLER :
|
|||||||
{
|
{
|
||||||
FLEXRAN_ENABLED = "no";
|
FLEXRAN_ENABLED = "no";
|
||||||
FLEXRAN_INTERFACE_NAME = "eth0";
|
FLEXRAN_INTERFACE_NAME = "eth0";
|
||||||
FLEXRAN_IPV4_ADDRESS = "CI_MME_IP_ADDR";
|
FLEXRAN_IPV4_ADDRESS = "CI_FLEXRAN_CTL_IP_ADDR";
|
||||||
FLEXRAN_PORT = 2210;
|
FLEXRAN_PORT = 2210;
|
||||||
FLEXRAN_CACHE = "/mnt/oai_agent_cache";
|
FLEXRAN_CACHE = "/mnt/oai_agent_cache";
|
||||||
FLEXRAN_AWAIT_RECONF = "no";
|
FLEXRAN_AWAIT_RECONF = "no";
|
||||||
|
|||||||
@@ -178,6 +178,7 @@ eNBs =
|
|||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
@@ -394,7 +395,7 @@ NETWORK_CONTROLLER :
|
|||||||
{
|
{
|
||||||
FLEXRAN_ENABLED = "no";
|
FLEXRAN_ENABLED = "no";
|
||||||
FLEXRAN_INTERFACE_NAME = "eth0";
|
FLEXRAN_INTERFACE_NAME = "eth0";
|
||||||
FLEXRAN_IPV4_ADDRESS = "CI_MME_IP_ADDR";
|
FLEXRAN_IPV4_ADDRESS = "CI_FLEXRAN_CTL_IP_ADDR";
|
||||||
FLEXRAN_PORT = 2210;
|
FLEXRAN_PORT = 2210;
|
||||||
FLEXRAN_CACHE = "/mnt/oai_agent_cache";
|
FLEXRAN_CACHE = "/mnt/oai_agent_cache";
|
||||||
FLEXRAN_AWAIT_RECONF = "no";
|
FLEXRAN_AWAIT_RECONF = "no";
|
||||||
|
|||||||
@@ -136,6 +136,7 @@ eNBs =
|
|||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
@@ -227,7 +228,7 @@ NETWORK_CONTROLLER :
|
|||||||
{
|
{
|
||||||
FLEXRAN_ENABLED = "no";
|
FLEXRAN_ENABLED = "no";
|
||||||
FLEXRAN_INTERFACE_NAME = "lo";
|
FLEXRAN_INTERFACE_NAME = "lo";
|
||||||
FLEXRAN_IPV4_ADDRESS = "127.0.0.1";
|
FLEXRAN_IPV4_ADDRESS = "CI_FLEXRAN_CTL_IP_ADDR";
|
||||||
FLEXRAN_PORT = 2210;
|
FLEXRAN_PORT = 2210;
|
||||||
FLEXRAN_CACHE = "/mnt/oai_agent_cache";
|
FLEXRAN_CACHE = "/mnt/oai_agent_cache";
|
||||||
FLEXRAN_AWAIT_RECONF = "no";
|
FLEXRAN_AWAIT_RECONF = "no";
|
||||||
|
|||||||
@@ -136,6 +136,7 @@ eNBs =
|
|||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
@@ -227,7 +228,7 @@ NETWORK_CONTROLLER :
|
|||||||
{
|
{
|
||||||
FLEXRAN_ENABLED = "no";
|
FLEXRAN_ENABLED = "no";
|
||||||
FLEXRAN_INTERFACE_NAME = "lo";
|
FLEXRAN_INTERFACE_NAME = "lo";
|
||||||
FLEXRAN_IPV4_ADDRESS = "127.0.0.1";
|
FLEXRAN_IPV4_ADDRESS = "CI_FLEXRAN_CTL_IP_ADDR";
|
||||||
FLEXRAN_PORT = 2210;
|
FLEXRAN_PORT = 2210;
|
||||||
FLEXRAN_CACHE = "/mnt/oai_agent_cache";
|
FLEXRAN_CACHE = "/mnt/oai_agent_cache";
|
||||||
FLEXRAN_AWAIT_RECONF = "no";
|
FLEXRAN_AWAIT_RECONF = "no";
|
||||||
|
|||||||
@@ -136,6 +136,7 @@ eNBs =
|
|||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
@@ -227,7 +228,7 @@ NETWORK_CONTROLLER :
|
|||||||
{
|
{
|
||||||
FLEXRAN_ENABLED = "no";
|
FLEXRAN_ENABLED = "no";
|
||||||
FLEXRAN_INTERFACE_NAME = "lo";
|
FLEXRAN_INTERFACE_NAME = "lo";
|
||||||
FLEXRAN_IPV4_ADDRESS = "127.0.0.1";
|
FLEXRAN_IPV4_ADDRESS = "CI_FLEXRAN_CTL_IP_ADDR";
|
||||||
FLEXRAN_PORT = 2210;
|
FLEXRAN_PORT = 2210;
|
||||||
FLEXRAN_CACHE = "/mnt/oai_agent_cache";
|
FLEXRAN_CACHE = "/mnt/oai_agent_cache";
|
||||||
FLEXRAN_AWAIT_RECONF = "no";
|
FLEXRAN_AWAIT_RECONF = "no";
|
||||||
|
|||||||
@@ -136,6 +136,7 @@ eNBs =
|
|||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
@@ -225,7 +226,7 @@ NETWORK_CONTROLLER :
|
|||||||
{
|
{
|
||||||
FLEXRAN_ENABLED = "no";
|
FLEXRAN_ENABLED = "no";
|
||||||
FLEXRAN_INTERFACE_NAME = "lo";
|
FLEXRAN_INTERFACE_NAME = "lo";
|
||||||
FLEXRAN_IPV4_ADDRESS = "127.0.0.1";
|
FLEXRAN_IPV4_ADDRESS = "CI_FLEXRAN_CTL_IP_ADDR";
|
||||||
FLEXRAN_PORT = 2210;
|
FLEXRAN_PORT = 2210;
|
||||||
FLEXRAN_CACHE = "/mnt/oai_agent_cache";
|
FLEXRAN_CACHE = "/mnt/oai_agent_cache";
|
||||||
FLEXRAN_AWAIT_RECONF = "no";
|
FLEXRAN_AWAIT_RECONF = "no";
|
||||||
|
|||||||
@@ -173,6 +173,7 @@ eNBs =
|
|||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
@@ -246,7 +247,7 @@ NETWORK_CONTROLLER :
|
|||||||
{
|
{
|
||||||
FLEXRAN_ENABLED = "no";
|
FLEXRAN_ENABLED = "no";
|
||||||
FLEXRAN_INTERFACE_NAME = "lo";
|
FLEXRAN_INTERFACE_NAME = "lo";
|
||||||
FLEXRAN_IPV4_ADDRESS = "127.0.0.1";
|
FLEXRAN_IPV4_ADDRESS = "CI_FLEXRAN_CTL_IP_ADDR";
|
||||||
FLEXRAN_PORT = 2210;
|
FLEXRAN_PORT = 2210;
|
||||||
FLEXRAN_CACHE = "/mnt/oai_agent_cache";
|
FLEXRAN_CACHE = "/mnt/oai_agent_cache";
|
||||||
FLEXRAN_AWAIT_RECONF = "no";
|
FLEXRAN_AWAIT_RECONF = "no";
|
||||||
|
|||||||
@@ -176,6 +176,7 @@ eNBs =
|
|||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
@@ -255,7 +256,7 @@ NETWORK_CONTROLLER :
|
|||||||
{
|
{
|
||||||
FLEXRAN_ENABLED = "no";
|
FLEXRAN_ENABLED = "no";
|
||||||
FLEXRAN_INTERFACE_NAME = "eth0";
|
FLEXRAN_INTERFACE_NAME = "eth0";
|
||||||
FLEXRAN_IPV4_ADDRESS = "CI_MME_IP_ADDR";
|
FLEXRAN_IPV4_ADDRESS = "CI_FLEXRAN_CTL_IP_ADDR";
|
||||||
FLEXRAN_PORT = 2210;
|
FLEXRAN_PORT = 2210;
|
||||||
FLEXRAN_CACHE = "/mnt/oai_agent_cache";
|
FLEXRAN_CACHE = "/mnt/oai_agent_cache";
|
||||||
FLEXRAN_AWAIT_RECONF = "no";
|
FLEXRAN_AWAIT_RECONF = "no";
|
||||||
|
|||||||
@@ -28,83 +28,85 @@ eNBs =
|
|||||||
node_function = "3GPP_eNODEB";
|
node_function = "3GPP_eNODEB";
|
||||||
node_timing = "synch_to_ext_device";
|
node_timing = "synch_to_ext_device";
|
||||||
node_synch_ref = 0;
|
node_synch_ref = 0;
|
||||||
frame_type = "FDD";
|
frame_type = "FDD";
|
||||||
tdd_config = 3;
|
tdd_config = 3;
|
||||||
tdd_config_s = 0;
|
tdd_config_s = 0;
|
||||||
prefix_type = "NORMAL";
|
prefix_type = "NORMAL";
|
||||||
eutra_band = 7;
|
eutra_band = 7;
|
||||||
downlink_frequency = 2680000000L;
|
downlink_frequency = 2680000000L;
|
||||||
uplink_frequency_offset = -120000000;
|
uplink_frequency_offset = -120000000;
|
||||||
Nid_cell = 0;
|
Nid_cell = 0;
|
||||||
N_RB_DL = 25;
|
N_RB_DL = 25;
|
||||||
Nid_cell_mbsfn = 0;
|
Nid_cell_mbsfn = 0;
|
||||||
nb_antenna_ports = 1;
|
nb_antenna_ports = 1;
|
||||||
nb_antennas_tx = 1;
|
nb_antennas_tx = 1;
|
||||||
nb_antennas_rx = 1;
|
nb_antennas_rx = 1;
|
||||||
tx_gain = 90;
|
tx_gain = 90;
|
||||||
rx_gain = 125;
|
rx_gain = 125;
|
||||||
pbch_repetition = "FALSE";
|
pbch_repetition = "FALSE";
|
||||||
prach_root = 0;
|
prach_root = 0;
|
||||||
prach_config_index = 0;
|
prach_config_index = 0;
|
||||||
prach_high_speed = "DISABLE";
|
prach_high_speed = "DISABLE";
|
||||||
prach_zero_correlation = 1;
|
prach_zero_correlation = 1;
|
||||||
prach_freq_offset = 2;
|
prach_freq_offset = 2;
|
||||||
pucch_delta_shift = 1;
|
pucch_delta_shift = 1;
|
||||||
pucch_nRB_CQI = 0;
|
pucch_nRB_CQI = 0;
|
||||||
pucch_nCS_AN = 0;
|
pucch_nCS_AN = 0;
|
||||||
pucch_n1_AN = 0;
|
pucch_n1_AN = 0;
|
||||||
pdsch_referenceSignalPower = -25;
|
pdsch_referenceSignalPower= -25;
|
||||||
pdsch_p_b = 0;
|
pdsch_p_b = 0;
|
||||||
pusch_n_SB = 1;
|
pusch_n_SB = 1;
|
||||||
pusch_enable64QAM = "DISABLE";
|
pusch_enable64QAM = "DISABLE";
|
||||||
pusch_hoppingMode = "interSubFrame";
|
pusch_hoppingMode = "interSubFrame";
|
||||||
pusch_hoppingOffset = 0;
|
pusch_hoppingOffset = 0;
|
||||||
pusch_groupHoppingEnabled = "ENABLE";
|
pusch_groupHoppingEnabled = "ENABLE";
|
||||||
pusch_groupAssignment = 0;
|
pusch_groupAssignment = 0;
|
||||||
pusch_sequenceHoppingEnabled = "DISABLE";
|
pusch_sequenceHoppingEnabled = "DISABLE";
|
||||||
pusch_nDMRS1 = 1;
|
pusch_nDMRS1 = 1;
|
||||||
phich_duration = "NORMAL";
|
phich_duration = "NORMAL";
|
||||||
phich_resource = "ONESIXTH";
|
phich_resource = "ONESIXTH";
|
||||||
srs_enable = "DISABLE";
|
srs_enable = "DISABLE";
|
||||||
/* srs_BandwidthConfig =;
|
|
||||||
srs_SubframeConfig =;
|
|
||||||
srs_ackNackST =;
|
|
||||||
srs_MaxUpPts =;*/
|
|
||||||
|
|
||||||
pusch_p0_Nominal = -96;
|
|
||||||
pusch_alpha = "AL1";
|
|
||||||
pucch_p0_Nominal = -104;
|
|
||||||
msg3_delta_Preamble = 6;
|
|
||||||
pucch_deltaF_Format1 = "deltaF2";
|
|
||||||
pucch_deltaF_Format1b = "deltaF3";
|
|
||||||
pucch_deltaF_Format2 = "deltaF0";
|
|
||||||
pucch_deltaF_Format2a = "deltaF0";
|
|
||||||
pucch_deltaF_Format2b = "deltaF0";
|
|
||||||
|
|
||||||
rach_numberOfRA_Preambles = 64;
|
|
||||||
rach_preamblesGroupAConfig = "DISABLE";
|
|
||||||
/*
|
/*
|
||||||
rach_sizeOfRA_PreamblesGroupA = ;
|
srs_BandwidthConfig =;
|
||||||
rach_messageSizeGroupA = ;
|
srs_SubframeConfig =;
|
||||||
rach_messagePowerOffsetGroupB = ;
|
srs_ackNackST =;
|
||||||
|
srs_MaxUpPts =;
|
||||||
*/
|
*/
|
||||||
rach_powerRampingStep = 4;
|
|
||||||
rach_preambleInitialReceivedTargetPower = -108;
|
|
||||||
rach_preambleTransMax = 10;
|
|
||||||
rach_raResponseWindowSize = 10;
|
|
||||||
rach_macContentionResolutionTimer = 48;
|
|
||||||
rach_maxHARQ_Msg3Tx = 4;
|
|
||||||
|
|
||||||
pcch_default_PagingCycle = 128;
|
pusch_p0_Nominal = -96;
|
||||||
pcch_nB = "oneT";
|
pusch_alpha = "AL1";
|
||||||
bcch_modificationPeriodCoeff = 2;
|
pucch_p0_Nominal = -104;
|
||||||
ue_TimersAndConstants_t300 = 1000;
|
msg3_delta_Preamble = 6;
|
||||||
ue_TimersAndConstants_t301 = 1000;
|
pucch_deltaF_Format1 = "deltaF2";
|
||||||
ue_TimersAndConstants_t310 = 1000;
|
pucch_deltaF_Format1b = "deltaF3";
|
||||||
ue_TimersAndConstants_t311 = 10000;
|
pucch_deltaF_Format2 = "deltaF0";
|
||||||
ue_TimersAndConstants_n310 = 20;
|
pucch_deltaF_Format2a = "deltaF0";
|
||||||
ue_TimersAndConstants_n311 = 1;
|
pucch_deltaF_Format2b = "deltaF0";
|
||||||
ue_TransmissionMode = 1;
|
|
||||||
|
rach_numberOfRA_Preambles = 64;
|
||||||
|
rach_preamblesGroupAConfig = "DISABLE";
|
||||||
|
/*
|
||||||
|
rach_sizeOfRA_PreamblesGroupA = ;
|
||||||
|
rach_messageSizeGroupA = ;
|
||||||
|
rach_messagePowerOffsetGroupB = ;
|
||||||
|
*/
|
||||||
|
rach_powerRampingStep = 4;
|
||||||
|
rach_preambleInitialReceivedTargetPower = -108;
|
||||||
|
rach_preambleTransMax = 10;
|
||||||
|
rach_raResponseWindowSize = 10;
|
||||||
|
rach_macContentionResolutionTimer = 48;
|
||||||
|
rach_maxHARQ_Msg3Tx = 4;
|
||||||
|
|
||||||
|
pcch_default_PagingCycle = 128;
|
||||||
|
pcch_nB = "oneT";
|
||||||
|
bcch_modificationPeriodCoeff = 2;
|
||||||
|
ue_TimersAndConstants_t300 = 1000;
|
||||||
|
ue_TimersAndConstants_t301 = 1000;
|
||||||
|
ue_TimersAndConstants_t310 = 1000;
|
||||||
|
ue_TimersAndConstants_t311 = 10000;
|
||||||
|
ue_TimersAndConstants_n310 = 20;
|
||||||
|
ue_TimersAndConstants_n311 = 1;
|
||||||
|
ue_TransmissionMode = 1;
|
||||||
|
|
||||||
//Parameters for SIB18
|
//Parameters for SIB18
|
||||||
rxPool_sc_CP_Len = "normal";
|
rxPool_sc_CP_Len = "normal";
|
||||||
@@ -116,27 +118,28 @@ eNBs =
|
|||||||
rxPool_ResourceConfig_offsetIndicator_present = "prSmall";
|
rxPool_ResourceConfig_offsetIndicator_present = "prSmall";
|
||||||
rxPool_ResourceConfig_offsetIndicator_choice = 0;
|
rxPool_ResourceConfig_offsetIndicator_choice = 0;
|
||||||
rxPool_ResourceConfig_subframeBitmap_present = "prBs40";
|
rxPool_ResourceConfig_subframeBitmap_present = "prBs40";
|
||||||
rxPool_ResourceConfig_subframeBitmap_choice_bs_buf = "00000000000000000000";
|
rxPool_ResourceConfig_subframeBitmap_choice_bs_buf = "00000000000000000000";
|
||||||
rxPool_ResourceConfig_subframeBitmap_choice_bs_size = 5;
|
rxPool_ResourceConfig_subframeBitmap_choice_bs_size = 5;
|
||||||
rxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused = 0;
|
rxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused = 0;
|
||||||
/* rxPool_dataHoppingConfig_hoppingParameter = 0;
|
/*
|
||||||
rxPool_dataHoppingConfig_numSubbands = "ns1";
|
rxPool_dataHoppingConfig_hoppingParameter = 0;
|
||||||
rxPool_dataHoppingConfig_rbOffset = 0;
|
rxPool_dataHoppingConfig_numSubbands = "ns1";
|
||||||
rxPool_commTxResourceUC-ReqAllowed = "TRUE";
|
rxPool_dataHoppingConfig_rbOffset = 0;
|
||||||
|
rxPool_commTxResourceUC-ReqAllowed = "TRUE";
|
||||||
*/
|
*/
|
||||||
// Parameters for SIB19
|
// Parameters for SIB19
|
||||||
discRxPool_cp_Len = "normal"
|
discRxPool_cp_Len = "normal"
|
||||||
discRxPool_discPeriod = "rf32"
|
discRxPool_discPeriod = "rf32"
|
||||||
discRxPool_numRetx = 1;
|
discRxPool_numRetx = 1;
|
||||||
discRxPool_numRepetition = 2;
|
discRxPool_numRepetition = 2;
|
||||||
discRxPool_ResourceConfig_prb_Num = 5;
|
discRxPool_ResourceConfig_prb_Num = 5;
|
||||||
discRxPool_ResourceConfig_prb_Start = 3;
|
discRxPool_ResourceConfig_prb_Start = 3;
|
||||||
discRxPool_ResourceConfig_prb_End = 21;
|
discRxPool_ResourceConfig_prb_End = 21;
|
||||||
discRxPool_ResourceConfig_offsetIndicator_present = "prSmall";
|
discRxPool_ResourceConfig_offsetIndicator_present = "prSmall";
|
||||||
discRxPool_ResourceConfig_offsetIndicator_choice = 0;
|
discRxPool_ResourceConfig_offsetIndicator_choice = 0;
|
||||||
discRxPool_ResourceConfig_subframeBitmap_present = "prBs40";
|
discRxPool_ResourceConfig_subframeBitmap_present = "prBs40";
|
||||||
discRxPool_ResourceConfig_subframeBitmap_choice_bs_buf = "f0ffffffff";
|
discRxPool_ResourceConfig_subframeBitmap_choice_bs_buf = "f0ffffffff";
|
||||||
discRxPool_ResourceConfig_subframeBitmap_choice_bs_size = 5;
|
discRxPool_ResourceConfig_subframeBitmap_choice_bs_size= 5;
|
||||||
discRxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused = 0;
|
discRxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused = 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -176,6 +179,7 @@ eNBs =
|
|||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
@@ -203,40 +207,43 @@ eNBs =
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
MACRLCs = (
|
MACRLCs =
|
||||||
{
|
(
|
||||||
num_cc = 1;
|
{
|
||||||
tr_s_preference = "local_L1";
|
num_cc = 1;
|
||||||
tr_n_preference = "local_RRC";
|
tr_s_preference = "local_L1";
|
||||||
phy_test_mode = 0;
|
tr_n_preference = "local_RRC";
|
||||||
puSch10xSnr = 160;
|
phy_test_mode = 0;
|
||||||
puCch10xSnr = 160;
|
puSch10xSnr = 160;
|
||||||
}
|
puCch10xSnr = 160;
|
||||||
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
L1s = (
|
L1s =
|
||||||
{
|
(
|
||||||
num_cc = 1;
|
{
|
||||||
tr_n_preference = "local_mac";
|
num_cc = 1;
|
||||||
}
|
tr_n_preference = "local_mac";
|
||||||
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
RUs = (
|
RUs =
|
||||||
{
|
(
|
||||||
local_rf = "yes"
|
{
|
||||||
nb_tx = 1
|
local_rf = "yes"
|
||||||
nb_rx = 1
|
nb_tx = 1
|
||||||
att_tx = 0
|
nb_rx = 1
|
||||||
att_rx = 0;
|
att_tx = 0
|
||||||
bands = [7];
|
att_rx = 0;
|
||||||
max_pdschReferenceSignalPower = -27;
|
bands = [7];
|
||||||
max_rxgain = 125;
|
max_pdschReferenceSignalPower = -27;
|
||||||
eNB_instances = [0];
|
max_rxgain = 125;
|
||||||
|
eNB_instances = [0];
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
THREAD_STRUCT = (
|
THREAD_STRUCT =
|
||||||
|
(
|
||||||
{
|
{
|
||||||
#three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
|
#three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
|
||||||
parallel_config = "PARALLEL_SINGLE_THREAD";
|
parallel_config = "PARALLEL_SINGLE_THREAD";
|
||||||
@@ -249,27 +256,27 @@ NETWORK_CONTROLLER :
|
|||||||
{
|
{
|
||||||
FLEXRAN_ENABLED = "no";
|
FLEXRAN_ENABLED = "no";
|
||||||
FLEXRAN_INTERFACE_NAME = "eth0";
|
FLEXRAN_INTERFACE_NAME = "eth0";
|
||||||
FLEXRAN_IPV4_ADDRESS = "CI_MME_IP_ADDR";
|
FLEXRAN_IPV4_ADDRESS = "CI_FLEXRAN_CTL_IP_ADDR";
|
||||||
FLEXRAN_PORT = 2210;
|
FLEXRAN_PORT = 2210;
|
||||||
FLEXRAN_CACHE = "/mnt/oai_agent_cache";
|
FLEXRAN_CACHE = "/mnt/oai_agent_cache";
|
||||||
FLEXRAN_AWAIT_RECONF = "no";
|
FLEXRAN_AWAIT_RECONF = "no";
|
||||||
};
|
};
|
||||||
|
|
||||||
log_config :
|
log_config :
|
||||||
{
|
{
|
||||||
global_log_level ="info";
|
global_log_level ="info";
|
||||||
global_log_verbosity ="medium";
|
global_log_verbosity ="medium";
|
||||||
hw_log_level ="info";
|
hw_log_level ="info";
|
||||||
hw_log_verbosity ="medium";
|
hw_log_verbosity ="medium";
|
||||||
phy_log_level ="info";
|
phy_log_level ="info";
|
||||||
phy_log_verbosity ="medium";
|
phy_log_verbosity ="medium";
|
||||||
mac_log_level ="info";
|
mac_log_level ="info";
|
||||||
mac_log_verbosity ="high";
|
mac_log_verbosity ="high";
|
||||||
rlc_log_level ="info";
|
rlc_log_level ="info";
|
||||||
rlc_log_verbosity ="medium";
|
rlc_log_verbosity ="medium";
|
||||||
pdcp_log_level ="info";
|
pdcp_log_level ="info";
|
||||||
pdcp_log_verbosity ="medium";
|
pdcp_log_verbosity ="medium";
|
||||||
rrc_log_level ="info";
|
rrc_log_level ="info";
|
||||||
rrc_log_verbosity ="medium";
|
rrc_log_verbosity ="medium";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -181,6 +181,7 @@ eNBs =
|
|||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
@@ -254,7 +255,7 @@ NETWORK_CONTROLLER :
|
|||||||
{
|
{
|
||||||
FLEXRAN_ENABLED = "no";
|
FLEXRAN_ENABLED = "no";
|
||||||
FLEXRAN_INTERFACE_NAME = "lo";
|
FLEXRAN_INTERFACE_NAME = "lo";
|
||||||
FLEXRAN_IPV4_ADDRESS = "127.0.0.1";
|
FLEXRAN_IPV4_ADDRESS = "CI_FLEXRAN_CTL_IP_ADDR";
|
||||||
FLEXRAN_PORT = 2210;
|
FLEXRAN_PORT = 2210;
|
||||||
FLEXRAN_CACHE = "/mnt/oai_agent_cache";
|
FLEXRAN_CACHE = "/mnt/oai_agent_cache";
|
||||||
FLEXRAN_AWAIT_RECONF = "no";
|
FLEXRAN_AWAIT_RECONF = "no";
|
||||||
|
|||||||
Executable → Regular
+2
-1
@@ -183,6 +183,7 @@ eNBs =
|
|||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
@@ -265,7 +266,7 @@ RUs = (
|
|||||||
max_pdschReferenceSignalPower = -27;
|
max_pdschReferenceSignalPower = -27;
|
||||||
max_rxgain = 118;
|
max_rxgain = 118;
|
||||||
eNB_instances = [0];
|
eNB_instances = [0];
|
||||||
clock_src = "external";
|
# clock_src = "external";
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -176,6 +176,7 @@ eNBs =
|
|||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
@@ -248,7 +249,7 @@ NETWORK_CONTROLLER :
|
|||||||
{
|
{
|
||||||
FLEXRAN_ENABLED = "no";
|
FLEXRAN_ENABLED = "no";
|
||||||
FLEXRAN_INTERFACE_NAME = "lo";
|
FLEXRAN_INTERFACE_NAME = "lo";
|
||||||
FLEXRAN_IPV4_ADDRESS = "127.0.0.1";
|
FLEXRAN_IPV4_ADDRESS = "CI_FLEXRAN_CTL_IP_ADDR";
|
||||||
FLEXRAN_PORT = 2210;
|
FLEXRAN_PORT = 2210;
|
||||||
FLEXRAN_CACHE = "/mnt/oai_agent_cache";
|
FLEXRAN_CACHE = "/mnt/oai_agent_cache";
|
||||||
FLEXRAN_AWAIT_RECONF = "no";
|
FLEXRAN_AWAIT_RECONF = "no";
|
||||||
|
|||||||
@@ -175,6 +175,7 @@ eNBs =
|
|||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
@@ -243,7 +244,7 @@ NETWORK_CONTROLLER :
|
|||||||
{
|
{
|
||||||
FLEXRAN_ENABLED = "no";
|
FLEXRAN_ENABLED = "no";
|
||||||
FLEXRAN_INTERFACE_NAME = "eth0";
|
FLEXRAN_INTERFACE_NAME = "eth0";
|
||||||
FLEXRAN_IPV4_ADDRESS = "CI_MME_IP_ADDR";
|
FLEXRAN_IPV4_ADDRESS = "CI_FLEXRAN_CTL_IP_ADDR";
|
||||||
FLEXRAN_PORT = 2210;
|
FLEXRAN_PORT = 2210;
|
||||||
FLEXRAN_CACHE = "/mnt/oai_agent_cache";
|
FLEXRAN_CACHE = "/mnt/oai_agent_cache";
|
||||||
FLEXRAN_AWAIT_RECONF = "no";
|
FLEXRAN_AWAIT_RECONF = "no";
|
||||||
|
|||||||
@@ -204,6 +204,7 @@ gNBs =
|
|||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = ( { ipv4 = "192.168.12.26";
|
mme_ip_address = ( { ipv4 = "192.168.12.26";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
|
|||||||
Executable → Regular
+8
-2
@@ -1,6 +1,8 @@
|
|||||||
Active_gNBs = ( "gNB-Eurecom-5GNRBox");
|
Active_gNBs = ( "gNB-Eurecom-5GNRBox");
|
||||||
# Asn1_verbosity, choice in: none, info, annoying
|
# Asn1_verbosity, choice in: none, info, annoying
|
||||||
Asn1_verbosity = "none";
|
Asn1_verbosity = "none";
|
||||||
|
Num_Threads_PUSCH = 8
|
||||||
|
|
||||||
|
|
||||||
gNBs =
|
gNBs =
|
||||||
(
|
(
|
||||||
@@ -21,7 +23,10 @@ gNBs =
|
|||||||
|
|
||||||
ssb_SubcarrierOffset = 31; //0;
|
ssb_SubcarrierOffset = 31; //0;
|
||||||
pdsch_AntennaPorts = 1;
|
pdsch_AntennaPorts = 1;
|
||||||
|
pusch_TargetSNRx10 = 200;
|
||||||
|
pucch_TargetSNRx10 = 200;
|
||||||
|
|
||||||
|
|
||||||
servingCellConfigCommon = (
|
servingCellConfigCommon = (
|
||||||
{
|
{
|
||||||
#spCellConfigCommon
|
#spCellConfigCommon
|
||||||
@@ -201,6 +206,7 @@ gNBs =
|
|||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
@@ -259,7 +265,7 @@ RUs = (
|
|||||||
max_pdschReferenceSignalPower = -27;
|
max_pdschReferenceSignalPower = -27;
|
||||||
max_rxgain = 114;
|
max_rxgain = 114;
|
||||||
eNB_instances = [0];
|
eNB_instances = [0];
|
||||||
clock_src = "external";
|
# clock_src = "external";
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -173,6 +173,7 @@ eNBs =
|
|||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -174,6 +174,7 @@ eNBs =
|
|||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -174,6 +174,7 @@ eNBs =
|
|||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -136,6 +136,7 @@ eNBs =
|
|||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -141,6 +141,7 @@ eNBs =
|
|||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -139,6 +139,7 @@ eNBs =
|
|||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
@@ -234,7 +235,7 @@ NETWORK_CONTROLLER :
|
|||||||
{
|
{
|
||||||
FLEXRAN_ENABLED = "no";
|
FLEXRAN_ENABLED = "no";
|
||||||
FLEXRAN_INTERFACE_NAME = "lo";
|
FLEXRAN_INTERFACE_NAME = "lo";
|
||||||
FLEXRAN_IPV4_ADDRESS = "127.0.0.1";
|
FLEXRAN_IPV4_ADDRESS = "CI_FLEXRAN_CTL_IP_ADDR";
|
||||||
FLEXRAN_PORT = 2210;
|
FLEXRAN_PORT = 2210;
|
||||||
FLEXRAN_CACHE = "/mnt/oai_agent_cache";
|
FLEXRAN_CACHE = "/mnt/oai_agent_cache";
|
||||||
FLEXRAN_AWAIT_RECONF = "no";
|
FLEXRAN_AWAIT_RECONF = "no";
|
||||||
|
|||||||
@@ -139,6 +139,7 @@ eNBs =
|
|||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
@@ -234,7 +235,7 @@ NETWORK_CONTROLLER :
|
|||||||
{
|
{
|
||||||
FLEXRAN_ENABLED = "no";
|
FLEXRAN_ENABLED = "no";
|
||||||
FLEXRAN_INTERFACE_NAME = "lo";
|
FLEXRAN_INTERFACE_NAME = "lo";
|
||||||
FLEXRAN_IPV4_ADDRESS = "127.0.0.1";
|
FLEXRAN_IPV4_ADDRESS = "CI_FLEXRAN_CTL_IP_ADDR";
|
||||||
FLEXRAN_PORT = 2210;
|
FLEXRAN_PORT = 2210;
|
||||||
FLEXRAN_CACHE = "/mnt/oai_agent_cache";
|
FLEXRAN_CACHE = "/mnt/oai_agent_cache";
|
||||||
FLEXRAN_AWAIT_RECONF = "no";
|
FLEXRAN_AWAIT_RECONF = "no";
|
||||||
|
|||||||
@@ -139,6 +139,7 @@ eNBs =
|
|||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
@@ -234,7 +235,7 @@ NETWORK_CONTROLLER :
|
|||||||
{
|
{
|
||||||
FLEXRAN_ENABLED = "no";
|
FLEXRAN_ENABLED = "no";
|
||||||
FLEXRAN_INTERFACE_NAME = "lo";
|
FLEXRAN_INTERFACE_NAME = "lo";
|
||||||
FLEXRAN_IPV4_ADDRESS = "127.0.0.1";
|
FLEXRAN_IPV4_ADDRESS = "CI_FLEXRAN_CTL_IP_ADDR";
|
||||||
FLEXRAN_PORT = 2210;
|
FLEXRAN_PORT = 2210;
|
||||||
FLEXRAN_CACHE = "/mnt/oai_agent_cache";
|
FLEXRAN_CACHE = "/mnt/oai_agent_cache";
|
||||||
FLEXRAN_AWAIT_RECONF = "no";
|
FLEXRAN_AWAIT_RECONF = "no";
|
||||||
|
|||||||
@@ -176,6 +176,7 @@ eNBs =
|
|||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
@@ -253,7 +254,7 @@ NETWORK_CONTROLLER :
|
|||||||
{
|
{
|
||||||
FLEXRAN_ENABLED = "no";
|
FLEXRAN_ENABLED = "no";
|
||||||
FLEXRAN_INTERFACE_NAME = "lo";
|
FLEXRAN_INTERFACE_NAME = "lo";
|
||||||
FLEXRAN_IPV4_ADDRESS = "127.0.0.1";
|
FLEXRAN_IPV4_ADDRESS = "CI_FLEXRAN_CTL_IP_ADDR";
|
||||||
FLEXRAN_PORT = 2210;
|
FLEXRAN_PORT = 2210;
|
||||||
FLEXRAN_CACHE = "/mnt/oai_agent_cache";
|
FLEXRAN_CACHE = "/mnt/oai_agent_cache";
|
||||||
FLEXRAN_AWAIT_RECONF = "no";
|
FLEXRAN_AWAIT_RECONF = "no";
|
||||||
|
|||||||
@@ -176,6 +176,7 @@ eNBs =
|
|||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
@@ -253,7 +254,7 @@ NETWORK_CONTROLLER :
|
|||||||
{
|
{
|
||||||
FLEXRAN_ENABLED = "no";
|
FLEXRAN_ENABLED = "no";
|
||||||
FLEXRAN_INTERFACE_NAME = "lo";
|
FLEXRAN_INTERFACE_NAME = "lo";
|
||||||
FLEXRAN_IPV4_ADDRESS = "127.0.0.1";
|
FLEXRAN_IPV4_ADDRESS = "CI_FLEXRAN_CTL_IP_ADDR";
|
||||||
FLEXRAN_PORT = 2210;
|
FLEXRAN_PORT = 2210;
|
||||||
FLEXRAN_CACHE = "/mnt/oai_agent_cache";
|
FLEXRAN_CACHE = "/mnt/oai_agent_cache";
|
||||||
FLEXRAN_AWAIT_RECONF = "no";
|
FLEXRAN_AWAIT_RECONF = "no";
|
||||||
|
|||||||
@@ -176,6 +176,7 @@ eNBs =
|
|||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
@@ -253,7 +254,7 @@ NETWORK_CONTROLLER :
|
|||||||
{
|
{
|
||||||
FLEXRAN_ENABLED = "no";
|
FLEXRAN_ENABLED = "no";
|
||||||
FLEXRAN_INTERFACE_NAME = "lo";
|
FLEXRAN_INTERFACE_NAME = "lo";
|
||||||
FLEXRAN_IPV4_ADDRESS = "127.0.0.1";
|
FLEXRAN_IPV4_ADDRESS = "CI_FLEXRAN_CTL_IP_ADDR";
|
||||||
FLEXRAN_PORT = 2210;
|
FLEXRAN_PORT = 2210;
|
||||||
FLEXRAN_CACHE = "/mnt/oai_agent_cache";
|
FLEXRAN_CACHE = "/mnt/oai_agent_cache";
|
||||||
FLEXRAN_AWAIT_RECONF = "no";
|
FLEXRAN_AWAIT_RECONF = "no";
|
||||||
|
|||||||
@@ -144,6 +144,7 @@ eNBs =
|
|||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = ( { ipv4 = "192.168.15.130";
|
mme_ip_address = ( { ipv4 = "192.168.15.130";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -144,6 +144,7 @@ eNBs =
|
|||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = ( { ipv4 = "127.0.0.3";
|
mme_ip_address = ( { ipv4 = "127.0.0.3";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -174,6 +174,7 @@ eNBs =
|
|||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,23 +1,25 @@
|
|||||||
RUs = (
|
RUs =
|
||||||
{
|
(
|
||||||
local_if_name = "lo";
|
{
|
||||||
remote_address = "127.0.0.1"
|
local_if_name = "lo";
|
||||||
local_address = "127.0.0.2";
|
remote_address = "127.0.0.1"
|
||||||
local_portc = 50000;
|
local_address = "127.0.0.2";
|
||||||
remote_portc = 50000;
|
local_portc = 50000;
|
||||||
local_portd = 50001;
|
remote_portc = 50000;
|
||||||
remote_portd = 50001;
|
local_portd = 50001;
|
||||||
local_rf = "yes"
|
remote_portd = 50001;
|
||||||
tr_preference = "udp_if4p5";
|
local_rf = "yes"
|
||||||
nb_tx = 1;
|
tr_preference = "udp_if4p5";
|
||||||
nb_rx = 1;
|
nb_tx = 1;
|
||||||
max_pdschReferenceSignalPower = -27;
|
nb_rx = 1;
|
||||||
max_rxgain = 115;
|
max_pdschReferenceSignalPower = -27;
|
||||||
bands = [7];
|
max_rxgain = 115;
|
||||||
}
|
bands = [7];
|
||||||
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
THREAD_STRUCT = (
|
THREAD_STRUCT =
|
||||||
|
(
|
||||||
{
|
{
|
||||||
#three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
|
#three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
|
||||||
parallel_config = "PARALLEL_SINGLE_THREAD";
|
parallel_config = "PARALLEL_SINGLE_THREAD";
|
||||||
@@ -26,19 +28,20 @@ THREAD_STRUCT = (
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
log_config = {
|
log_config =
|
||||||
global_log_level ="error";
|
{
|
||||||
global_log_verbosity ="medium";
|
global_log_level ="error";
|
||||||
hw_log_level ="error";
|
global_log_verbosity ="medium";
|
||||||
hw_log_verbosity ="medium";
|
hw_log_level ="error";
|
||||||
phy_log_level ="error";
|
hw_log_verbosity ="medium";
|
||||||
phy_log_verbosity ="medium";
|
phy_log_level ="error";
|
||||||
mac_log_level ="error";
|
phy_log_verbosity ="medium";
|
||||||
mac_log_verbosity ="high";
|
mac_log_level ="error";
|
||||||
rlc_log_level ="error";
|
mac_log_verbosity ="high";
|
||||||
rlc_log_verbosity ="medium";
|
rlc_log_level ="error";
|
||||||
pdcp_log_level ="error";
|
rlc_log_verbosity ="medium";
|
||||||
pdcp_log_verbosity ="medium";
|
pdcp_log_level ="error";
|
||||||
rrc_log_level ="error";
|
pdcp_log_verbosity ="medium";
|
||||||
rrc_log_verbosity ="medium";
|
rrc_log_level ="error";
|
||||||
|
rrc_log_verbosity ="medium";
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,23 +1,25 @@
|
|||||||
RUs = (
|
RUs =
|
||||||
{
|
(
|
||||||
local_if_name = "lo";
|
{
|
||||||
remote_address = "127.0.0.1"
|
local_if_name = "lo";
|
||||||
local_address = "127.0.0.2";
|
remote_address = "127.0.0.1"
|
||||||
local_portc = 50000;
|
local_address = "127.0.0.2";
|
||||||
remote_portc = 50000;
|
local_portc = 50000;
|
||||||
local_portd = 50001;
|
remote_portc = 50000;
|
||||||
remote_portd = 50001;
|
local_portd = 50001;
|
||||||
local_rf = "yes"
|
remote_portd = 50001;
|
||||||
tr_preference = "udp_if4p5";
|
local_rf = "yes"
|
||||||
nb_tx = 1;
|
tr_preference = "udp_if4p5";
|
||||||
nb_rx = 1;
|
nb_tx = 1;
|
||||||
max_pdschReferenceSignalPower = -27;
|
nb_rx = 1;
|
||||||
max_rxgain = 115;
|
max_pdschReferenceSignalPower = -27;
|
||||||
bands = [40];
|
max_rxgain = 115;
|
||||||
}
|
bands = [40];
|
||||||
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
THREAD_STRUCT = (
|
THREAD_STRUCT =
|
||||||
|
(
|
||||||
{
|
{
|
||||||
#three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
|
#three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
|
||||||
parallel_config = "PARALLEL_SINGLE_THREAD";
|
parallel_config = "PARALLEL_SINGLE_THREAD";
|
||||||
@@ -26,19 +28,20 @@ THREAD_STRUCT = (
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
log_config = {
|
log_config =
|
||||||
global_log_level ="error";
|
{
|
||||||
global_log_verbosity ="medium";
|
global_log_level ="error";
|
||||||
hw_log_level ="error";
|
global_log_verbosity ="medium";
|
||||||
hw_log_verbosity ="medium";
|
hw_log_level ="error";
|
||||||
phy_log_level ="error";
|
hw_log_verbosity ="medium";
|
||||||
phy_log_verbosity ="medium";
|
phy_log_level ="error";
|
||||||
mac_log_level ="error";
|
phy_log_verbosity ="medium";
|
||||||
mac_log_verbosity ="high";
|
mac_log_level ="error";
|
||||||
rlc_log_level ="error";
|
mac_log_verbosity ="high";
|
||||||
rlc_log_verbosity ="medium";
|
rlc_log_level ="error";
|
||||||
pdcp_log_level ="error";
|
rlc_log_verbosity ="medium";
|
||||||
pdcp_log_verbosity ="medium";
|
pdcp_log_level ="error";
|
||||||
rrc_log_level ="error";
|
pdcp_log_verbosity ="medium";
|
||||||
rrc_log_verbosity ="medium";
|
rrc_log_level ="error";
|
||||||
|
rrc_log_verbosity ="medium";
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -59,6 +59,7 @@ OAI_UE_PROCESS_NO_TUNNEL_INTERFACE = -24
|
|||||||
OAI_UE_PROCESS_SEG_FAULT = -25
|
OAI_UE_PROCESS_SEG_FAULT = -25
|
||||||
OAI_UE_PROCESS_NO_MBMS_MSGS = -26
|
OAI_UE_PROCESS_NO_MBMS_MSGS = -26
|
||||||
OAI_UE_PROCESS_OK = +6
|
OAI_UE_PROCESS_OK = +6
|
||||||
|
INVALID_PARAMETER = -50
|
||||||
|
|
||||||
UE_STATUS_DETACHED = 0
|
UE_STATUS_DETACHED = 0
|
||||||
UE_STATUS_DETACHING = 1
|
UE_STATUS_DETACHING = 1
|
||||||
|
|||||||
@@ -84,6 +84,12 @@ nullPointer:common/utils/T/tracer/multi.c:265
|
|||||||
arrayIndexOutOfBounds:openair2/LAYER2/rlc_v2/tests/test.c:401
|
arrayIndexOutOfBounds:openair2/LAYER2/rlc_v2/tests/test.c:401
|
||||||
//
|
//
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
// this file is used for testing the NR RLC implementation, this error is
|
||||||
|
// not a problem, the programmer has to know what she does when writing
|
||||||
|
// the tests
|
||||||
|
arrayIndexOutOfBounds:openair2/LAYER2/nr_rlc/tests/test.c:451
|
||||||
|
//
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
// cppcheck does not understand the different lengths of arrays
|
// cppcheck does not understand the different lengths of arrays
|
||||||
arrayIndexOutOfBounds:openair1/SIMULATION/TOOLS/random_channel.c:705
|
arrayIndexOutOfBounds:openair1/SIMULATION/TOOLS/random_channel.c:705
|
||||||
arrayIndexOutOfBounds:openair1/SIMULATION/TOOLS/random_channel.c:706
|
arrayIndexOutOfBounds:openair1/SIMULATION/TOOLS/random_channel.c:706
|
||||||
|
|||||||
+202
-37
@@ -46,7 +46,6 @@ from multiprocessing import Process, Lock, SimpleQueue
|
|||||||
import sshconnection as SSH
|
import sshconnection as SSH
|
||||||
import helpreadme as HELP
|
import helpreadme as HELP
|
||||||
import constants as CONST
|
import constants as CONST
|
||||||
import html
|
|
||||||
|
|
||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
# Class Declaration
|
# Class Declaration
|
||||||
@@ -61,18 +60,18 @@ class EPCManagement():
|
|||||||
self.SourceCodePath = ''
|
self.SourceCodePath = ''
|
||||||
self.Type = ''
|
self.Type = ''
|
||||||
self.PcapFileName = ''
|
self.PcapFileName = ''
|
||||||
self.htmlObj = None
|
|
||||||
self.testCase_id = ''
|
self.testCase_id = ''
|
||||||
self.MmeIPAddress = ''
|
self.MmeIPAddress = ''
|
||||||
self.containerPrefix = 'prod'
|
self.containerPrefix = 'prod'
|
||||||
self.mmeConfFile = 'mme.conf'
|
self.mmeConfFile = 'mme.conf'
|
||||||
|
self.yamlPath = ''
|
||||||
|
|
||||||
|
|
||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
# EPC management functions
|
# EPC management functions
|
||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
|
|
||||||
def InitializeHSS(self):
|
def InitializeHSS(self, HTML):
|
||||||
if self.IPAddress == '' or self.UserName == '' or self.Password == '' or self.SourceCodePath == '' or self.Type == '':
|
if self.IPAddress == '' or self.UserName == '' or self.Password == '' or self.SourceCodePath == '' or self.Type == '':
|
||||||
HELP.GenericHelp(CONST.Version)
|
HELP.GenericHelp(CONST.Version)
|
||||||
HELP.EPCSrvHelp(self.IPAddress, self.UserName, self.Password, self.SourceCodePath, self.Type)
|
HELP.EPCSrvHelp(self.IPAddress, self.UserName, self.Password, self.SourceCodePath, self.Type)
|
||||||
@@ -114,10 +113,9 @@ class EPCManagement():
|
|||||||
else:
|
else:
|
||||||
logging.error('This option should not occur!')
|
logging.error('This option should not occur!')
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
if self.htmlObj is not None:
|
HTML.CreateHtmlTestRow(self.Type, 'OK', CONST.ALL_PROCESSES_OK)
|
||||||
self.htmlObj.CreateHtmlTestRow(self.Type, 'OK', CONST.ALL_PROCESSES_OK)
|
|
||||||
|
|
||||||
def InitializeMME(self):
|
def InitializeMME(self, HTML):
|
||||||
if self.IPAddress == '' or self.UserName == '' or self.Password == '' or self.SourceCodePath == '' or self.Type == '':
|
if self.IPAddress == '' or self.UserName == '' or self.Password == '' or self.SourceCodePath == '' or self.Type == '':
|
||||||
HELP.GenericHelp(CONST.Version)
|
HELP.GenericHelp(CONST.Version)
|
||||||
HELP.EPCSrvHelp(self.IPAddress, self.UserName, self.Password, self.SourceCodePath, self.Type)
|
HELP.EPCSrvHelp(self.IPAddress, self.UserName, self.Password, self.SourceCodePath, self.Type)
|
||||||
@@ -153,8 +151,7 @@ class EPCManagement():
|
|||||||
else:
|
else:
|
||||||
logging.error('This option should not occur!')
|
logging.error('This option should not occur!')
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
if self.htmlObj is not None:
|
HTML.CreateHtmlTestRow(self.Type, 'OK', CONST.ALL_PROCESSES_OK)
|
||||||
self.htmlObj.CreateHtmlTestRow(self.Type, 'OK', CONST.ALL_PROCESSES_OK)
|
|
||||||
|
|
||||||
def SetMmeIPAddress(self):
|
def SetMmeIPAddress(self):
|
||||||
# Not an error if we don't need an EPC
|
# Not an error if we don't need an EPC
|
||||||
@@ -175,7 +172,7 @@ class EPCManagement():
|
|||||||
else:
|
else:
|
||||||
self.MmeIPAddress = self.IPAddress
|
self.MmeIPAddress = self.IPAddress
|
||||||
|
|
||||||
def InitializeSPGW(self):
|
def InitializeSPGW(self, HTML):
|
||||||
if self.IPAddress == '' or self.UserName == '' or self.Password == '' or self.SourceCodePath == '' or self.Type == '':
|
if self.IPAddress == '' or self.UserName == '' or self.Password == '' or self.SourceCodePath == '' or self.Type == '':
|
||||||
HELP.GenericHelp(CONST.Version)
|
HELP.GenericHelp(CONST.Version)
|
||||||
HELP.EPCSrvHelp(self.IPAddress, self.UserName, self.Password, self.SourceCodePath, self.Type)
|
HELP.EPCSrvHelp(self.IPAddress, self.UserName, self.Password, self.SourceCodePath, self.Type)
|
||||||
@@ -212,15 +209,14 @@ class EPCManagement():
|
|||||||
else:
|
else:
|
||||||
logging.error('This option should not occur!')
|
logging.error('This option should not occur!')
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
if self.htmlObj is not None:
|
HTML.CreateHtmlTestRow(self.Type, 'OK', CONST.ALL_PROCESSES_OK)
|
||||||
self.htmlObj.CreateHtmlTestRow(self.Type, 'OK', CONST.ALL_PROCESSES_OK)
|
|
||||||
|
|
||||||
def CheckHSSProcess(self, status_queue):
|
def CheckHSSProcess(self, status_queue):
|
||||||
try:
|
try:
|
||||||
mySSH = SSH.SSHConnection()
|
mySSH = SSH.SSHConnection()
|
||||||
mySSH.open(self.IPAddress, self.UserName, self.Password)
|
mySSH.open(self.IPAddress, self.UserName, self.Password)
|
||||||
if re.match('OAI-Rel14-Docker', self.Type, re.IGNORECASE):
|
if re.match('OAI-Rel14-Docker', self.Type, re.IGNORECASE):
|
||||||
mySSH.command('docker exec -it ' + self.containerPrefix + '-oai-hss /bin/bash -c "ps aux | grep oai_hss"', '\$', 5)
|
mySSH.command('docker top ' + self.containerPrefix + '-oai-hss', '\$', 5)
|
||||||
else:
|
else:
|
||||||
mySSH.command('stdbuf -o0 ps -aux | grep --color=never hss | grep -v grep', '\$', 5)
|
mySSH.command('stdbuf -o0 ps -aux | grep --color=never hss | grep -v grep', '\$', 5)
|
||||||
if re.match('OAI-Rel14-CUPS', self.Type, re.IGNORECASE) or re.match('OAI-Rel14-Docker', self.Type, re.IGNORECASE):
|
if re.match('OAI-Rel14-CUPS', self.Type, re.IGNORECASE) or re.match('OAI-Rel14-Docker', self.Type, re.IGNORECASE):
|
||||||
@@ -245,7 +241,7 @@ class EPCManagement():
|
|||||||
mySSH = SSH.SSHConnection()
|
mySSH = SSH.SSHConnection()
|
||||||
mySSH.open(self.IPAddress, self.UserName, self.Password)
|
mySSH.open(self.IPAddress, self.UserName, self.Password)
|
||||||
if re.match('OAI-Rel14-Docker', self.Type, re.IGNORECASE):
|
if re.match('OAI-Rel14-Docker', self.Type, re.IGNORECASE):
|
||||||
mySSH.command('docker exec -it ' + self.containerPrefix + '-oai-mme /bin/bash -c "ps aux | grep oai_mme"', '\$', 5)
|
mySSH.command('docker top ' + self.containerPrefix + '-oai-mme', '\$', 5)
|
||||||
else:
|
else:
|
||||||
mySSH.command('stdbuf -o0 ps -aux | grep --color=never mme | grep -v grep', '\$', 5)
|
mySSH.command('stdbuf -o0 ps -aux | grep --color=never mme | grep -v grep', '\$', 5)
|
||||||
if re.match('OAI-Rel14-Docker', self.Type, re.IGNORECASE):
|
if re.match('OAI-Rel14-Docker', self.Type, re.IGNORECASE):
|
||||||
@@ -272,11 +268,11 @@ class EPCManagement():
|
|||||||
mySSH = SSH.SSHConnection()
|
mySSH = SSH.SSHConnection()
|
||||||
mySSH.open(self.IPAddress, self.UserName, self.Password)
|
mySSH.open(self.IPAddress, self.UserName, self.Password)
|
||||||
if re.match('OAI-Rel14-Docker', self.Type, re.IGNORECASE):
|
if re.match('OAI-Rel14-Docker', self.Type, re.IGNORECASE):
|
||||||
mySSH.command('docker exec -it ' + self.containerPrefix + '-oai-spgwc /bin/bash -c "ps aux | grep oai_spgwc"', '\$', 5)
|
mySSH.command('docker top ' + self.containerPrefix + '-oai-spgwc', '\$', 5)
|
||||||
result = re.search('oai_spgwc -o -c ', mySSH.getBefore())
|
result = re.search('oai_spgwc -', mySSH.getBefore())
|
||||||
if result is not None:
|
if result is not None:
|
||||||
mySSH.command('docker exec -it ' + self.containerPrefix + '-oai-spgwu-tiny /bin/bash -c "ps aux | grep oai_spgwu"', '\$', 5)
|
mySSH.command('docker top ' + self.containerPrefix + '-oai-spgwu-tiny', '\$', 5)
|
||||||
result = re.search('oai_spgwu -o -c ', mySSH.getBefore())
|
result = re.search('oai_spgwu -', mySSH.getBefore())
|
||||||
elif re.match('OAI-Rel14-CUPS', self.Type, re.IGNORECASE):
|
elif re.match('OAI-Rel14-CUPS', self.Type, re.IGNORECASE):
|
||||||
mySSH.command('stdbuf -o0 ps -aux | grep --color=never spgw | grep -v grep', '\$', 5)
|
mySSH.command('stdbuf -o0 ps -aux | grep --color=never spgw | grep -v grep', '\$', 5)
|
||||||
result = re.search('spgwu -c ', mySSH.getBefore())
|
result = re.search('spgwu -c ', mySSH.getBefore())
|
||||||
@@ -297,7 +293,7 @@ class EPCManagement():
|
|||||||
except:
|
except:
|
||||||
os.kill(os.getppid(),signal.SIGUSR1)
|
os.kill(os.getppid(),signal.SIGUSR1)
|
||||||
|
|
||||||
def TerminateHSS(self):
|
def TerminateHSS(self, HTML):
|
||||||
mySSH = SSH.SSHConnection()
|
mySSH = SSH.SSHConnection()
|
||||||
mySSH.open(self.IPAddress, self.UserName, self.Password)
|
mySSH.open(self.IPAddress, self.UserName, self.Password)
|
||||||
if re.match('OAI-Rel14-Docker', self.Type, re.IGNORECASE):
|
if re.match('OAI-Rel14-Docker', self.Type, re.IGNORECASE):
|
||||||
@@ -330,10 +326,9 @@ class EPCManagement():
|
|||||||
else:
|
else:
|
||||||
logging.error('This should not happen!')
|
logging.error('This should not happen!')
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
if self.htmlObj is not None:
|
HTML.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK)
|
||||||
self.htmlObj.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK)
|
|
||||||
|
|
||||||
def TerminateMME(self):
|
def TerminateMME(self, HTML):
|
||||||
mySSH = SSH.SSHConnection()
|
mySSH = SSH.SSHConnection()
|
||||||
mySSH.open(self.IPAddress, self.UserName, self.Password)
|
mySSH.open(self.IPAddress, self.UserName, self.Password)
|
||||||
if re.match('OAI-Rel14-Docker', self.Type, re.IGNORECASE):
|
if re.match('OAI-Rel14-Docker', self.Type, re.IGNORECASE):
|
||||||
@@ -357,10 +352,9 @@ class EPCManagement():
|
|||||||
else:
|
else:
|
||||||
logging.error('This should not happen!')
|
logging.error('This should not happen!')
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
if self.htmlObj is not None:
|
HTML.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK)
|
||||||
self.htmlObj.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK)
|
|
||||||
|
|
||||||
def TerminateSPGW(self):
|
def TerminateSPGW(self, HTML):
|
||||||
mySSH = SSH.SSHConnection()
|
mySSH = SSH.SSHConnection()
|
||||||
mySSH.open(self.IPAddress, self.UserName, self.Password)
|
mySSH.open(self.IPAddress, self.UserName, self.Password)
|
||||||
if re.match('OAI-Rel14-Docker', self.Type, re.IGNORECASE):
|
if re.match('OAI-Rel14-Docker', self.Type, re.IGNORECASE):
|
||||||
@@ -401,8 +395,155 @@ class EPCManagement():
|
|||||||
else:
|
else:
|
||||||
logging.error('This should not happen!')
|
logging.error('This should not happen!')
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
if self.htmlObj is not None:
|
HTML.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK)
|
||||||
self.htmlObj.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK)
|
|
||||||
|
def DeployEpc(self, HTML):
|
||||||
|
logging.debug('Trying to deploy')
|
||||||
|
if not re.match('OAI-Rel14-Docker', self.Type, re.IGNORECASE):
|
||||||
|
HTML.CreateHtmlTestRow(self.Type, 'KO', CONST.INVALID_PARAMETER)
|
||||||
|
HTML.CreateHtmlTabFooter(False)
|
||||||
|
sys.exit('Deploy not possible with this EPC type: ' + self.Type)
|
||||||
|
|
||||||
|
if self.IPAddress == '' or self.UserName == '' or self.Password == '' or self.SourceCodePath == '' or self.Type == '':
|
||||||
|
HELP.GenericHelp(CONST.Version)
|
||||||
|
HELP.EPCSrvHelp(self.IPAddress, self.UserName, self.Password, self.SourceCodePath, self.Type)
|
||||||
|
sys.exit('Insufficient EPC Parameters')
|
||||||
|
mySSH = SSH.SSHConnection()
|
||||||
|
mySSH.open(self.IPAddress, self.UserName, self.Password)
|
||||||
|
mySSH.command('docker-compose --version', '\$', 5)
|
||||||
|
result = re.search('docker-compose version 1', mySSH.getBefore())
|
||||||
|
if result is None:
|
||||||
|
mySSH.close()
|
||||||
|
HTML.CreateHtmlTestRow(self.Type, 'KO', CONST.INVALID_PARAMETER)
|
||||||
|
HTML.CreateHtmlTabFooter(False)
|
||||||
|
sys.exit('docker-compose not installed on ' + self.IPAddress)
|
||||||
|
|
||||||
|
mySSH.command('if [ -d ' + self.SourceCodePath + '/scripts ]; then echo ' + self.Password + ' | sudo -S rm -Rf ' + self.SourceCodePath + '/scripts ; fi', '\$', 5)
|
||||||
|
mySSH.command('if [ -d ' + self.SourceCodePath + '/logs ]; then echo ' + self.Password + ' | sudo -S rm -Rf ' + self.SourceCodePath + '/logs ; fi', '\$', 5)
|
||||||
|
mySSH.command('mkdir -p ' + self.SourceCodePath + '/scripts ' + self.SourceCodePath + '/logs', '\$', 5)
|
||||||
|
|
||||||
|
# deploying and configuring the cassandra database
|
||||||
|
# container names and services are currently hard-coded.
|
||||||
|
# they could be recovered by:
|
||||||
|
# - docker-compose config --services
|
||||||
|
# - docker-compose config | grep container_name
|
||||||
|
mySSH.command('cd ' + self.SourceCodePath + '/scripts', '\$', 5)
|
||||||
|
mySSH.copyout(self.IPAddress, self.UserName, self.Password, './' + self.yamlPath + '/docker-compose.yml', self.SourceCodePath + '/scripts')
|
||||||
|
mySSH.command('wget --quiet --tries=3 --retry-connrefused https://raw.githubusercontent.com/OPENAIRINTERFACE/openair-hss/develop/src/hss_rel14/db/oai_db.cql', '\$', 30)
|
||||||
|
mySSH.command('docker-compose down', '\$', 60)
|
||||||
|
mySSH.command('docker-compose up -d db_init', '\$', 60)
|
||||||
|
|
||||||
|
# databases take time...
|
||||||
|
time.sleep(10)
|
||||||
|
cnt = 0
|
||||||
|
db_init_status = False
|
||||||
|
while (cnt < 10):
|
||||||
|
mySSH.command('docker logs prod-db-init', '\$', 5)
|
||||||
|
result = re.search('OK', mySSH.getBefore())
|
||||||
|
if result is not None:
|
||||||
|
cnt = 10
|
||||||
|
db_init_status = True
|
||||||
|
else:
|
||||||
|
time.sleep(5)
|
||||||
|
cnt += 1
|
||||||
|
mySSH.command('docker rm -f prod-db-init', '\$', 5)
|
||||||
|
if not db_init_status:
|
||||||
|
HTML.CreateHtmlTestRow(self.Type, 'KO', CONST.INVALID_PARAMETER)
|
||||||
|
HTML.CreateHtmlTabFooter(False)
|
||||||
|
sys.exit('Cassandra DB deployment/configuration went wrong!')
|
||||||
|
|
||||||
|
# deploying EPC cNFs
|
||||||
|
mySSH.command('docker-compose up -d oai_spgwu', '\$', 60)
|
||||||
|
listOfContainers = 'prod-cassandra prod-oai-hss prod-oai-mme prod-oai-spgwc prod-oai-spgwu-tiny'
|
||||||
|
expectedHealthyContainers = 5
|
||||||
|
|
||||||
|
# Checking for additional services
|
||||||
|
mySSH.command('docker-compose config', '\$', 5)
|
||||||
|
configResponse = mySSH.getBefore()
|
||||||
|
if configResponse.count('flexran_rtc') == 1:
|
||||||
|
mySSH.command('docker-compose up -d flexran_rtc', '\$', 60)
|
||||||
|
listOfContainers += ' prod-flexran-rtc'
|
||||||
|
expectedHealthyContainers += 1
|
||||||
|
if configResponse.count('trf_gen') == 1:
|
||||||
|
mySSH.command('docker-compose up -d trf_gen', '\$', 60)
|
||||||
|
listOfContainers += ' prod-trf-gen'
|
||||||
|
expectedHealthyContainers += 1
|
||||||
|
|
||||||
|
# Checking if all are healthy
|
||||||
|
cnt = 0
|
||||||
|
while (cnt < 3):
|
||||||
|
mySSH.command('docker inspect --format=\'{{.State.Health.Status}}\' ' + listOfContainers, '\$', 10)
|
||||||
|
unhealthyNb = mySSH.getBefore().count('unhealthy')
|
||||||
|
healthyNb = mySSH.getBefore().count('healthy') - unhealthyNb
|
||||||
|
startingNb = mySSH.getBefore().count('starting')
|
||||||
|
if healthyNb == expectedHealthyContainers:
|
||||||
|
cnt = 10
|
||||||
|
else:
|
||||||
|
time.sleep(10)
|
||||||
|
cnt += 1
|
||||||
|
logging.debug(' -- ' + str(healthyNb) + ' healthy container(s)')
|
||||||
|
logging.debug(' -- ' + str(unhealthyNb) + ' unhealthy container(s)')
|
||||||
|
logging.debug(' -- ' + str(startingNb) + ' still starting container(s)')
|
||||||
|
if healthyNb == expectedHealthyContainers:
|
||||||
|
mySSH.command('docker exec -d prod-oai-hss /bin/bash -c "nohup tshark -i any -f \'port 9042 or port 3868\' -w /tmp/hss_check_run.pcap 2>&1 > /dev/null"', '\$', 5)
|
||||||
|
mySSH.command('docker exec -d prod-oai-mme /bin/bash -c "nohup tshark -i any -f \'port 3868 or port 2123 or port 36412\' -w /tmp/mme_check_run.pcap 2>&1 > /dev/null"', '\$', 10)
|
||||||
|
mySSH.command('docker exec -d prod-oai-spgwc /bin/bash -c "nohup tshark -i any -f \'port 2123 or port 8805\' -w /tmp/spgwc_check_run.pcap 2>&1 > /dev/null"', '\$', 10)
|
||||||
|
# on SPGW-U, not capturing on SGI to avoid huge file
|
||||||
|
mySSH.command('docker exec -d prod-oai-spgwu-tiny /bin/bash -c "nohup tshark -i any -f \'port 8805\' -w /tmp/spgwu_check_run.pcap 2>&1 > /dev/null"', '\$', 10)
|
||||||
|
mySSH.close()
|
||||||
|
logging.debug('Deployment OK')
|
||||||
|
HTML.CreateHtmlTestRow(self.Type, 'OK', CONST.ALL_PROCESSES_OK)
|
||||||
|
else:
|
||||||
|
mySSH.close()
|
||||||
|
logging.debug('Deployment went wrong')
|
||||||
|
HTML.CreateHtmlTestRow(self.Type, 'KO', CONST.INVALID_PARAMETER)
|
||||||
|
|
||||||
|
def UndeployEpc(self, HTML):
|
||||||
|
logging.debug('Trying to undeploy')
|
||||||
|
# No check down, we suppose everything done before.
|
||||||
|
|
||||||
|
mySSH = SSH.SSHConnection()
|
||||||
|
mySSH.open(self.IPAddress, self.UserName, self.Password)
|
||||||
|
# Recovering logs and pcap files
|
||||||
|
mySSH.command('cd ' + self.SourceCodePath + '/logs', '\$', 5)
|
||||||
|
mySSH.command('docker exec -it prod-oai-hss /bin/bash -c "killall --signal SIGINT oai_hss tshark"', '\$', 5)
|
||||||
|
mySSH.command('docker exec -it prod-oai-mme /bin/bash -c "killall --signal SIGINT tshark"', '\$', 5)
|
||||||
|
mySSH.command('docker exec -it prod-oai-spgwc /bin/bash -c "killall --signal SIGINT oai_spgwc tshark"', '\$', 5)
|
||||||
|
mySSH.command('docker exec -it prod-oai-spgwu-tiny /bin/bash -c "killall --signal SIGINT tshark"', '\$', 5)
|
||||||
|
mySSH.command('docker logs prod-oai-hss > hss_' + self.testCase_id + '.log', '\$', 5)
|
||||||
|
mySSH.command('docker logs prod-oai-mme > mme_' + self.testCase_id + '.log', '\$', 5)
|
||||||
|
mySSH.command('docker logs prod-oai-spgwc > spgwc_' + self.testCase_id + '.log', '\$', 5)
|
||||||
|
mySSH.command('docker logs prod-oai-spgwu-tiny > spgwu_' + self.testCase_id + '.log', '\$', 5)
|
||||||
|
mySSH.command('docker cp prod-oai-hss:/tmp/hss_check_run.pcap hss_' + self.testCase_id + '.pcap', '\$', 60)
|
||||||
|
mySSH.command('docker cp prod-oai-mme:/tmp/mme_check_run.pcap mme_' + self.testCase_id + '.pcap', '\$', 60)
|
||||||
|
mySSH.command('docker cp prod-oai-spgwc:/tmp/spgwc_check_run.pcap spgwc_' + self.testCase_id + '.pcap', '\$', 60)
|
||||||
|
mySSH.command('docker cp prod-oai-spgwu-tiny:/tmp/spgwu_check_run.pcap spgwu_' + self.testCase_id + '.pcap', '\$', 60)
|
||||||
|
# Remove all
|
||||||
|
mySSH.command('cd ' + self.SourceCodePath + '/scripts', '\$', 5)
|
||||||
|
listOfContainers = 'prod-cassandra prod-oai-hss prod-oai-mme prod-oai-spgwc prod-oai-spgwu-tiny'
|
||||||
|
nbContainers = 5
|
||||||
|
# Checking for additional services
|
||||||
|
mySSH.command('docker-compose config', '\$', 5)
|
||||||
|
configResponse = mySSH.getBefore()
|
||||||
|
if configResponse.count('flexran_rtc') == 1:
|
||||||
|
listOfContainers += ' prod-flexran-rtc'
|
||||||
|
nbContainers += 1
|
||||||
|
if configResponse.count('trf_gen') == 1:
|
||||||
|
listOfContainers += ' prod-trf-gen'
|
||||||
|
nbContainers += 1
|
||||||
|
|
||||||
|
mySSH.command('docker-compose down', '\$', 60)
|
||||||
|
mySSH.command('docker inspect --format=\'{{.State.Health.Status}}\' ' + listOfContainers, '\$', 10)
|
||||||
|
noMoreContainerNb = mySSH.getBefore().count('No such object')
|
||||||
|
mySSH.command('docker inspect --format=\'{{.Name}}\' prod-oai-public-net prod-oai-private-net', '\$', 10)
|
||||||
|
noMoreNetworkNb = mySSH.getBefore().count('No such object')
|
||||||
|
mySSH.close()
|
||||||
|
if noMoreContainerNb == nbContainers and noMoreNetworkNb == 2:
|
||||||
|
logging.debug('Undeployment OK')
|
||||||
|
HTML.CreateHtmlTestRow(self.Type, 'OK', CONST.ALL_PROCESSES_OK)
|
||||||
|
else:
|
||||||
|
logging.debug('Undeployment went wrong')
|
||||||
|
HTML.CreateHtmlTestRow(self.Type, 'KO', CONST.INVALID_PARAMETER)
|
||||||
|
|
||||||
def LogCollectHSS(self):
|
def LogCollectHSS(self):
|
||||||
mySSH = SSH.SSHConnection()
|
mySSH = SSH.SSHConnection()
|
||||||
@@ -410,9 +551,17 @@ class EPCManagement():
|
|||||||
mySSH.command('cd ' + self.SourceCodePath + '/scripts', '\$', 5)
|
mySSH.command('cd ' + self.SourceCodePath + '/scripts', '\$', 5)
|
||||||
mySSH.command('rm -f hss.log.zip', '\$', 5)
|
mySSH.command('rm -f hss.log.zip', '\$', 5)
|
||||||
if re.match('OAI-Rel14-Docker', self.Type, re.IGNORECASE):
|
if re.match('OAI-Rel14-Docker', self.Type, re.IGNORECASE):
|
||||||
mySSH.command('docker cp ' + self.containerPrefix + '-oai-hss:/openair-hss/hss_check_run.log .', '\$', 60)
|
mySSH.command('docker inspect prod-oai-hss', '\$', 10)
|
||||||
mySSH.command('docker cp ' + self.containerPrefix + '-oai-hss:/tmp/hss_check_run.pcap .', '\$', 60)
|
result = re.search('No such object', mySSH.getBefore())
|
||||||
mySSH.command('zip hss.log.zip hss_check_run.*', '\$', 60)
|
if result is not None:
|
||||||
|
mySSH.command('cd ../logs', '\$', 5)
|
||||||
|
mySSH.command('rm -f hss.log.zip', '\$', 5)
|
||||||
|
mySSH.command('zip hss.log.zip hss_*.*', '\$', 60)
|
||||||
|
mySSH.command('mv hss.log.zip ../scripts', '\$', 60)
|
||||||
|
else:
|
||||||
|
mySSH.command('docker cp ' + self.containerPrefix + '-oai-hss:/openair-hss/hss_check_run.log .', '\$', 60)
|
||||||
|
mySSH.command('docker cp ' + self.containerPrefix + '-oai-hss:/tmp/hss_check_run.pcap .', '\$', 60)
|
||||||
|
mySSH.command('zip hss.log.zip hss_check_run.*', '\$', 60)
|
||||||
elif re.match('OAI', self.Type, re.IGNORECASE) or re.match('OAI-Rel14-CUPS', self.Type, re.IGNORECASE):
|
elif re.match('OAI', self.Type, re.IGNORECASE) or re.match('OAI-Rel14-CUPS', self.Type, re.IGNORECASE):
|
||||||
mySSH.command('zip hss.log.zip hss*.log', '\$', 60)
|
mySSH.command('zip hss.log.zip hss*.log', '\$', 60)
|
||||||
mySSH.command('echo ' + self.Password + ' | sudo -S rm hss*.log', '\$', 5)
|
mySSH.command('echo ' + self.Password + ' | sudo -S rm hss*.log', '\$', 5)
|
||||||
@@ -432,9 +581,17 @@ class EPCManagement():
|
|||||||
mySSH.command('cd ' + self.SourceCodePath + '/scripts', '\$', 5)
|
mySSH.command('cd ' + self.SourceCodePath + '/scripts', '\$', 5)
|
||||||
mySSH.command('rm -f mme.log.zip', '\$', 5)
|
mySSH.command('rm -f mme.log.zip', '\$', 5)
|
||||||
if re.match('OAI-Rel14-Docker', self.Type, re.IGNORECASE):
|
if re.match('OAI-Rel14-Docker', self.Type, re.IGNORECASE):
|
||||||
mySSH.command('docker cp ' + self.containerPrefix + '-oai-mme:/openair-mme/mme_check_run.log .', '\$', 60)
|
mySSH.command('docker inspect prod-oai-mme', '\$', 10)
|
||||||
mySSH.command('docker cp ' + self.containerPrefix + '-oai-mme:/tmp/mme_check_run.pcap .', '\$', 60)
|
result = re.search('No such object', mySSH.getBefore())
|
||||||
mySSH.command('zip mme.log.zip mme_check_run.*', '\$', 60)
|
if result is not None:
|
||||||
|
mySSH.command('cd ../logs', '\$', 5)
|
||||||
|
mySSH.command('rm -f mme.log.zip', '\$', 5)
|
||||||
|
mySSH.command('zip mme.log.zip mme_*.*', '\$', 60)
|
||||||
|
mySSH.command('mv mme.log.zip ../scripts', '\$', 60)
|
||||||
|
else:
|
||||||
|
mySSH.command('docker cp ' + self.containerPrefix + '-oai-mme:/openair-mme/mme_check_run.log .', '\$', 60)
|
||||||
|
mySSH.command('docker cp ' + self.containerPrefix + '-oai-mme:/tmp/mme_check_run.pcap .', '\$', 60)
|
||||||
|
mySSH.command('zip mme.log.zip mme_check_run.*', '\$', 60)
|
||||||
elif re.match('OAI', self.Type, re.IGNORECASE) or re.match('OAI-Rel14-CUPS', self.Type, re.IGNORECASE):
|
elif re.match('OAI', self.Type, re.IGNORECASE) or re.match('OAI-Rel14-CUPS', self.Type, re.IGNORECASE):
|
||||||
mySSH.command('zip mme.log.zip mme*.log', '\$', 60)
|
mySSH.command('zip mme.log.zip mme*.log', '\$', 60)
|
||||||
mySSH.command('echo ' + self.Password + ' | sudo -S rm mme*.log', '\$', 5)
|
mySSH.command('echo ' + self.Password + ' | sudo -S rm mme*.log', '\$', 5)
|
||||||
@@ -451,11 +608,19 @@ class EPCManagement():
|
|||||||
mySSH.command('cd ' + self.SourceCodePath + '/scripts', '\$', 5)
|
mySSH.command('cd ' + self.SourceCodePath + '/scripts', '\$', 5)
|
||||||
mySSH.command('rm -f spgw.log.zip', '\$', 5)
|
mySSH.command('rm -f spgw.log.zip', '\$', 5)
|
||||||
if re.match('OAI-Rel14-Docker', self.Type, re.IGNORECASE):
|
if re.match('OAI-Rel14-Docker', self.Type, re.IGNORECASE):
|
||||||
mySSH.command('docker cp ' + self.containerPrefix + '-oai-spgwc:/openair-spgwc/spgwc_check_run.log .', '\$', 60)
|
mySSH.command('docker inspect prod-oai-mme', '\$', 10)
|
||||||
mySSH.command('docker cp ' + self.containerPrefix + '-oai-spgwu-tiny:/openair-spgwu-tiny/spgwu_check_run.log .', '\$', 60)
|
result = re.search('No such object', mySSH.getBefore())
|
||||||
mySSH.command('docker cp ' + self.containerPrefix + '-oai-spgwc:/tmp/spgwc_check_run.pcap .', '\$', 60)
|
if result is not None:
|
||||||
mySSH.command('docker cp ' + self.containerPrefix + '-oai-spgwu-tiny:/tmp/spgwu_check_run.pcap .', '\$', 60)
|
mySSH.command('cd ../logs', '\$', 5)
|
||||||
mySSH.command('zip spgw.log.zip spgw*_check_run.*', '\$', 60)
|
mySSH.command('rm -f spgw.log.zip', '\$', 5)
|
||||||
|
mySSH.command('zip spgw.log.zip spgw*.*', '\$', 60)
|
||||||
|
mySSH.command('mv spgw.log.zip ../scripts', '\$', 60)
|
||||||
|
else:
|
||||||
|
mySSH.command('docker cp ' + self.containerPrefix + '-oai-spgwc:/openair-spgwc/spgwc_check_run.log .', '\$', 60)
|
||||||
|
mySSH.command('docker cp ' + self.containerPrefix + '-oai-spgwu-tiny:/openair-spgwu-tiny/spgwu_check_run.log .', '\$', 60)
|
||||||
|
mySSH.command('docker cp ' + self.containerPrefix + '-oai-spgwc:/tmp/spgwc_check_run.pcap .', '\$', 60)
|
||||||
|
mySSH.command('docker cp ' + self.containerPrefix + '-oai-spgwu-tiny:/tmp/spgwu_check_run.pcap .', '\$', 60)
|
||||||
|
mySSH.command('zip spgw.log.zip spgw*_check_run.*', '\$', 60)
|
||||||
elif re.match('OAI', self.Type, re.IGNORECASE) or re.match('OAI-Rel14-CUPS', self.Type, re.IGNORECASE):
|
elif re.match('OAI', self.Type, re.IGNORECASE) or re.match('OAI-Rel14-CUPS', self.Type, re.IGNORECASE):
|
||||||
mySSH.command('zip spgw.log.zip spgw*.log', '\$', 60)
|
mySSH.command('zip spgw.log.zip spgw*.log', '\$', 60)
|
||||||
mySSH.command('echo ' + self.Password + ' | sudo -S rm spgw*.log', '\$', 5)
|
mySSH.command('echo ' + self.Password + ' | sudo -S rm spgw*.log', '\$', 5)
|
||||||
|
|||||||
+88
-45
@@ -41,6 +41,7 @@ import constants as CONST
|
|||||||
import cls_oaicitest #main class for OAI CI test framework
|
import cls_oaicitest #main class for OAI CI test framework
|
||||||
import cls_physim #class PhySim for physical simulators build and test
|
import cls_physim #class PhySim for physical simulators build and test
|
||||||
import cls_cots_ue #class CotsUe for Airplane mode control
|
import cls_cots_ue #class CotsUe for Airplane mode control
|
||||||
|
import cls_containerize #class Containerize for all container-based operations on RAN/UE objects
|
||||||
|
|
||||||
|
|
||||||
import sshconnection
|
import sshconnection
|
||||||
@@ -98,24 +99,34 @@ def AssignParams(params_dict):
|
|||||||
|
|
||||||
|
|
||||||
def GetParametersFromXML(action):
|
def GetParametersFromXML(action):
|
||||||
if action == 'Build_eNB':
|
if action == 'Build_eNB' or action == 'Build_Image':
|
||||||
RAN.Build_eNB_args=test.findtext('Build_eNB_args')
|
RAN.Build_eNB_args=test.findtext('Build_eNB_args')
|
||||||
|
CONTAINERS.imageKind=test.findtext('kind')
|
||||||
forced_workspace_cleanup = test.findtext('forced_workspace_cleanup')
|
forced_workspace_cleanup = test.findtext('forced_workspace_cleanup')
|
||||||
if (forced_workspace_cleanup is None):
|
if (forced_workspace_cleanup is None):
|
||||||
RAN.Build_eNB_forced_workspace_cleanup=False
|
RAN.Build_eNB_forced_workspace_cleanup=False
|
||||||
|
CONTAINERS.forcedWorkspaceCleanup=False
|
||||||
else:
|
else:
|
||||||
if re.match('true', forced_workspace_cleanup, re.IGNORECASE):
|
if re.match('true', forced_workspace_cleanup, re.IGNORECASE):
|
||||||
RAN.Build_eNB_forced_workspace_cleanup=True
|
RAN.Build_eNB_forced_workspace_cleanup=True
|
||||||
|
CONTAINERS.forcedWorkspaceCleanup=True
|
||||||
else:
|
else:
|
||||||
RAN.Build_eNB_forced_workspace_cleanup=False
|
RAN.Build_eNB_forced_workspace_cleanup=True
|
||||||
|
CONTAINERS.forcedWorkspaceCleanup=False
|
||||||
eNB_instance=test.findtext('eNB_instance')
|
eNB_instance=test.findtext('eNB_instance')
|
||||||
if (eNB_instance is None):
|
if (eNB_instance is None):
|
||||||
RAN.eNB_instance=0
|
RAN.eNB_instance=0
|
||||||
|
CONTAINERS.eNB_instance=0
|
||||||
else:
|
else:
|
||||||
RAN.eNB_instance=int(eNB_instance)
|
RAN.eNB_instance=int(eNB_instance)
|
||||||
RAN.eNB_serverId=test.findtext('eNB_serverId')
|
CONTAINERS.eNB_instance=int(eNB_instance)
|
||||||
if (RAN.eNB_serverId is None):
|
eNB_serverId=test.findtext('eNB_serverId')
|
||||||
RAN.eNB_serverId='0'
|
if (eNB_serverId is None):
|
||||||
|
RAN.eNB_serverId[RAN.eNB_instance]='0'
|
||||||
|
CONTAINERS.eNB_serverId[RAN.eNB_instance]='0'
|
||||||
|
else:
|
||||||
|
RAN.eNB_serverId[RAN.eNB_instance]=eNB_serverId
|
||||||
|
CONTAINERS.eNB_serverId[CONTAINERS.eNB_instance]=eNB_serverId
|
||||||
xmlBgBuildField = test.findtext('backgroundBuild')
|
xmlBgBuildField = test.findtext('backgroundBuild')
|
||||||
if (xmlBgBuildField is None):
|
if (xmlBgBuildField is None):
|
||||||
RAN.backgroundBuild=False
|
RAN.backgroundBuild=False
|
||||||
@@ -132,9 +143,11 @@ def GetParametersFromXML(action):
|
|||||||
RAN.eNB_instance=0
|
RAN.eNB_instance=0
|
||||||
else:
|
else:
|
||||||
RAN.eNB_instance=int(eNB_instance)
|
RAN.eNB_instance=int(eNB_instance)
|
||||||
RAN.eNB_serverId=test.findtext('eNB_serverId')
|
eNB_serverId=test.findtext('eNB_serverId')
|
||||||
if (RAN.eNB_serverId is None):
|
if (eNB_serverId is None):
|
||||||
RAN.eNB_serverId='0'
|
RAN.eNB_serverId[RAN.eNB_instance]='0'
|
||||||
|
else:
|
||||||
|
RAN.eNB_serverId[RAN.eNB_instance]=eNB_serverId
|
||||||
|
|
||||||
elif action == 'Initialize_eNB':
|
elif action == 'Initialize_eNB':
|
||||||
RAN.Initialize_eNB_args=test.findtext('Initialize_eNB_args')
|
RAN.Initialize_eNB_args=test.findtext('Initialize_eNB_args')
|
||||||
@@ -143,9 +156,11 @@ def GetParametersFromXML(action):
|
|||||||
RAN.eNB_instance=0
|
RAN.eNB_instance=0
|
||||||
else:
|
else:
|
||||||
RAN.eNB_instance=int(eNB_instance)
|
RAN.eNB_instance=int(eNB_instance)
|
||||||
RAN.eNB_serverId=test.findtext('eNB_serverId')
|
eNB_serverId=test.findtext('eNB_serverId')
|
||||||
if (RAN.eNB_serverId is None):
|
if (eNB_serverId is None):
|
||||||
RAN.eNB_serverId='0'
|
RAN.eNB_serverId[RAN.eNB_instance]='0'
|
||||||
|
else:
|
||||||
|
RAN.eNB_serverId[RAN.eNB_instance]=eNB_serverId
|
||||||
|
|
||||||
#local variable air_interface
|
#local variable air_interface
|
||||||
air_interface = test.findtext('air_interface')
|
air_interface = test.findtext('air_interface')
|
||||||
@@ -162,10 +177,12 @@ def GetParametersFromXML(action):
|
|||||||
RAN.eNB_instance=0
|
RAN.eNB_instance=0
|
||||||
else:
|
else:
|
||||||
RAN.eNB_instance=int(eNB_instance)
|
RAN.eNB_instance=int(eNB_instance)
|
||||||
RAN.eNB_serverId=test.findtext('eNB_serverId')
|
eNB_serverId=test.findtext('eNB_serverId')
|
||||||
if (RAN.eNB_serverId is None):
|
if (eNB_serverId is None):
|
||||||
RAN.eNB_serverId='0'
|
RAN.eNB_serverId[RAN.eNB_instance]='0'
|
||||||
|
else:
|
||||||
|
RAN.eNB_serverId[RAN.eNB_instance]=eNB_serverId
|
||||||
|
|
||||||
#local variable air_interface
|
#local variable air_interface
|
||||||
air_interface = test.findtext('air_interface')
|
air_interface = test.findtext('air_interface')
|
||||||
if (air_interface is None) or (air_interface.lower() not in ['nr','lte','ocp']):
|
if (air_interface is None) or (air_interface.lower() not in ['nr','lte','ocp']):
|
||||||
@@ -288,6 +305,27 @@ def GetParametersFromXML(action):
|
|||||||
if (string_field is not None):
|
if (string_field is not None):
|
||||||
EPC.mmeConfFile = string_field
|
EPC.mmeConfFile = string_field
|
||||||
|
|
||||||
|
elif action == 'Deploy_EPC':
|
||||||
|
string_field = test.findtext('parameters')
|
||||||
|
if (string_field is not None):
|
||||||
|
EPC.yamlPath = string_field
|
||||||
|
|
||||||
|
elif action == 'Deploy_Object' or action == 'Undeploy_Object':
|
||||||
|
eNB_instance=test.findtext('eNB_instance')
|
||||||
|
if (eNB_instance is None):
|
||||||
|
CONTAINERS.eNB_instance=0
|
||||||
|
else:
|
||||||
|
CONTAINERS.eNB_instance=int(eNB_instance)
|
||||||
|
eNB_serverId=test.findtext('eNB_serverId')
|
||||||
|
if (eNB_serverId is None):
|
||||||
|
CONTAINERS.eNB_serverId[CONTAINERS.eNB_instance]='0'
|
||||||
|
else:
|
||||||
|
CONTAINERS.eNB_serverId[CONTAINERS.eNB_instance]=eNB_serverId
|
||||||
|
string_field = test.findtext('yaml_path')
|
||||||
|
if (string_field is not None):
|
||||||
|
CONTAINERS.yamlPath[CONTAINERS.eNB_instance] = string_field
|
||||||
|
|
||||||
|
|
||||||
else: # ie action == 'Run_PhySim':
|
else: # ie action == 'Run_PhySim':
|
||||||
ldpc.runargs = test.findtext('physim_run_args')
|
ldpc.runargs = test.findtext('physim_run_args')
|
||||||
|
|
||||||
@@ -339,11 +377,7 @@ SSH = sshconnection.SSHConnection()
|
|||||||
EPC = epc.EPCManagement()
|
EPC = epc.EPCManagement()
|
||||||
RAN = ran.RANManagement()
|
RAN = ran.RANManagement()
|
||||||
HTML = html.HTMLManagement()
|
HTML = html.HTMLManagement()
|
||||||
|
CONTAINERS = cls_containerize.Containerize()
|
||||||
EPC.htmlObj=HTML
|
|
||||||
RAN.htmlObj=HTML
|
|
||||||
RAN.epcObj=EPC
|
|
||||||
|
|
||||||
|
|
||||||
ldpc=cls_physim.PhySim() #create an instance for LDPC test using GPU or CPU build
|
ldpc=cls_physim.PhySim() #create an instance for LDPC test using GPU or CPU build
|
||||||
|
|
||||||
@@ -354,7 +388,7 @@ ldpc=cls_physim.PhySim() #create an instance for LDPC test using GPU or CPU b
|
|||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
|
|
||||||
import args_parse
|
import args_parse
|
||||||
py_param_file_present, py_params, mode = args_parse.ArgsParse(sys.argv,CiTestObj,RAN,HTML,EPC,ldpc,HELP)
|
py_param_file_present, py_params, mode = args_parse.ArgsParse(sys.argv,CiTestObj,RAN,HTML,EPC,ldpc,CONTAINERS,HELP)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -383,10 +417,10 @@ if re.match('^TerminateeNB$', mode, re.IGNORECASE):
|
|||||||
if RAN.eNBIPAddress == '' or RAN.eNBUserName == '' or RAN.eNBPassword == '':
|
if RAN.eNBIPAddress == '' or RAN.eNBUserName == '' or RAN.eNBPassword == '':
|
||||||
HELP.GenericHelp(CONST.Version)
|
HELP.GenericHelp(CONST.Version)
|
||||||
sys.exit('Insufficient Parameter')
|
sys.exit('Insufficient Parameter')
|
||||||
RAN.eNB_serverId='0'
|
|
||||||
RAN.eNB_instance=0
|
RAN.eNB_instance=0
|
||||||
|
RAN.eNB_serverId[0]='0'
|
||||||
RAN.eNBSourceCodePath='/tmp/'
|
RAN.eNBSourceCodePath='/tmp/'
|
||||||
RAN.TerminateeNB()
|
RAN.TerminateeNB(HTML, EPC)
|
||||||
elif re.match('^TerminateUE$', mode, re.IGNORECASE):
|
elif re.match('^TerminateUE$', mode, re.IGNORECASE):
|
||||||
if (CiTestObj.ADBIPAddress == '' or CiTestObj.ADBUserName == '' or CiTestObj.ADBPassword == ''):
|
if (CiTestObj.ADBIPAddress == '' or CiTestObj.ADBUserName == '' or CiTestObj.ADBPassword == ''):
|
||||||
HELP.GenericHelp(CONST.Version)
|
HELP.GenericHelp(CONST.Version)
|
||||||
@@ -398,22 +432,22 @@ elif re.match('^TerminateOAIUE$', mode, re.IGNORECASE):
|
|||||||
HELP.GenericHelp(CONST.Version)
|
HELP.GenericHelp(CONST.Version)
|
||||||
sys.exit('Insufficient Parameter')
|
sys.exit('Insufficient Parameter')
|
||||||
signal.signal(signal.SIGUSR1, receive_signal)
|
signal.signal(signal.SIGUSR1, receive_signal)
|
||||||
CiTestObj.TerminateOAIUE(HTML,RAN,COTS_UE)
|
CiTestObj.TerminateOAIUE(HTML,RAN,COTS_UE,EPC)
|
||||||
elif re.match('^TerminateHSS$', mode, re.IGNORECASE):
|
elif re.match('^TerminateHSS$', mode, re.IGNORECASE):
|
||||||
if EPC.IPAddress == '' or EPC.UserName == '' or EPC.Password == '' or EPC.Type == '' or EPC.SourceCodePath == '':
|
if EPC.IPAddress == '' or EPC.UserName == '' or EPC.Password == '' or EPC.Type == '' or EPC.SourceCodePath == '':
|
||||||
HELP.GenericHelp(CONST.Version)
|
HELP.GenericHelp(CONST.Version)
|
||||||
sys.exit('Insufficient Parameter')
|
sys.exit('Insufficient Parameter')
|
||||||
EPC.TerminateHSS()
|
EPC.TerminateHSS(HTML)
|
||||||
elif re.match('^TerminateMME$', mode, re.IGNORECASE):
|
elif re.match('^TerminateMME$', mode, re.IGNORECASE):
|
||||||
if EPC.IPAddress == '' or EPC.UserName == '' or EPC.Password == '' or EPC.Type == '' or EPC.SourceCodePath == '':
|
if EPC.IPAddress == '' or EPC.UserName == '' or EPC.Password == '' or EPC.Type == '' or EPC.SourceCodePath == '':
|
||||||
HELP.GenericHelp(CONST.Version)
|
HELP.GenericHelp(CONST.Version)
|
||||||
sys.exit('Insufficient Parameter')
|
sys.exit('Insufficient Parameter')
|
||||||
EPC.TerminateMME()
|
EPC.TerminateMME(HTML)
|
||||||
elif re.match('^TerminateSPGW$', mode, re.IGNORECASE):
|
elif re.match('^TerminateSPGW$', mode, re.IGNORECASE):
|
||||||
if EPC.IPAddress == '' or EPC.UserName == '' or EPC.Password == '' or EPC.Type == '' or EPC.SourceCodePath== '':
|
if EPC.IPAddress == '' or EPC.UserName == '' or EPC.Password == '' or EPC.Type == '' or EPC.SourceCodePath== '':
|
||||||
HELP.GenericHelp(CONST.Version)
|
HELP.GenericHelp(CONST.Version)
|
||||||
sys.exit('Insufficient Parameter')
|
sys.exit('Insufficient Parameter')
|
||||||
EPC.TerminateSPGW()
|
EPC.TerminateSPGW(HTML)
|
||||||
elif re.match('^LogCollectBuild$', mode, re.IGNORECASE):
|
elif re.match('^LogCollectBuild$', mode, re.IGNORECASE):
|
||||||
if (RAN.eNBIPAddress == '' or RAN.eNBUserName == '' or RAN.eNBPassword == '' or RAN.eNBSourceCodePath == '') and (CiTestObj.UEIPAddress == '' or CiTestObj.UEUserName == '' or CiTestObj.UEPassword == '' or CiTestObj.UESourceCodePath == ''):
|
if (RAN.eNBIPAddress == '' or RAN.eNBUserName == '' or RAN.eNBPassword == '' or RAN.eNBSourceCodePath == '') and (CiTestObj.UEIPAddress == '' or CiTestObj.UEUserName == '' or CiTestObj.UEPassword == '' or CiTestObj.UESourceCodePath == ''):
|
||||||
HELP.GenericHelp(CONST.Version)
|
HELP.GenericHelp(CONST.Version)
|
||||||
@@ -495,7 +529,7 @@ elif re.match('^FinalizeHtml$', mode, re.IGNORECASE):
|
|||||||
HTML.CreateHtmlFooter(CiTestObj.finalStatus)
|
HTML.CreateHtmlFooter(CiTestObj.finalStatus)
|
||||||
elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re.IGNORECASE):
|
elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re.IGNORECASE):
|
||||||
logging.debug('\u001B[1m----------------------------------------\u001B[0m')
|
logging.debug('\u001B[1m----------------------------------------\u001B[0m')
|
||||||
logging.debug('\u001B[1m Starting Scenario \u001B[0m')
|
logging.debug('\u001B[1m Starting Scenario: ' + CiTestObj.testXMLfiles[0] + '\u001B[0m')
|
||||||
logging.debug('\u001B[1m----------------------------------------\u001B[0m')
|
logging.debug('\u001B[1m----------------------------------------\u001B[0m')
|
||||||
if re.match('^TesteNB$', mode, re.IGNORECASE):
|
if re.match('^TesteNB$', mode, re.IGNORECASE):
|
||||||
if RAN.eNBIPAddress == '' or RAN.ranRepository == '' or RAN.ranBranch == '' or RAN.eNBUserName == '' or RAN.eNBPassword == '' or RAN.eNBSourceCodePath == '' or EPC.IPAddress == '' or EPC.UserName == '' or EPC.Password == '' or EPC.Type == '' or EPC.SourceCodePath == '' or CiTestObj.ADBIPAddress == '' or CiTestObj.ADBUserName == '' or CiTestObj.ADBPassword == '':
|
if RAN.eNBIPAddress == '' or RAN.ranRepository == '' or RAN.ranBranch == '' or RAN.eNBUserName == '' or RAN.eNBPassword == '' or RAN.eNBSourceCodePath == '' or EPC.IPAddress == '' or EPC.UserName == '' or EPC.Password == '' or EPC.Type == '' or EPC.SourceCodePath == '' or CiTestObj.ADBIPAddress == '' or CiTestObj.ADBUserName == '' or CiTestObj.ADBPassword == '':
|
||||||
@@ -566,7 +600,7 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re
|
|||||||
logging.debug('ERROR: requested test is invalidly formatted: ' + test)
|
logging.debug('ERROR: requested test is invalidly formatted: ' + test)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
if (EPC.IPAddress != '') and (EPC.IPAddress != 'none'):
|
if (EPC.IPAddress != '') and (EPC.IPAddress != 'none'):
|
||||||
CiTestObj.CheckFlexranCtrlInstallation(RAN,EPC)
|
CiTestObj.CheckFlexranCtrlInstallation(RAN,EPC,CONTAINERS)
|
||||||
EPC.SetMmeIPAddress()
|
EPC.SetMmeIPAddress()
|
||||||
|
|
||||||
#get the list of tests to be done
|
#get the list of tests to be done
|
||||||
@@ -626,17 +660,16 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re
|
|||||||
RAN.prematureExit = True
|
RAN.prematureExit = True
|
||||||
break
|
break
|
||||||
if action == 'Build_eNB':
|
if action == 'Build_eNB':
|
||||||
RAN.BuildeNB()
|
RAN.BuildeNB(HTML)
|
||||||
elif action == 'WaitEndBuild_eNB':
|
elif action == 'WaitEndBuild_eNB':
|
||||||
RAN.WaitBuildeNBisFinished()
|
RAN.WaitBuildeNBisFinished(HTML)
|
||||||
elif action == 'Initialize_eNB':
|
elif action == 'Initialize_eNB':
|
||||||
check_eNB = False
|
check_eNB = False
|
||||||
check_OAI_UE = False
|
check_OAI_UE = False
|
||||||
RAN.pStatus=CiTestObj.CheckProcessExist(check_eNB, check_OAI_UE,RAN,EPC)
|
RAN.pStatus=CiTestObj.CheckProcessExist(check_eNB, check_OAI_UE,RAN,EPC)
|
||||||
|
RAN.InitializeeNB(HTML, EPC)
|
||||||
RAN.InitializeeNB()
|
|
||||||
elif action == 'Terminate_eNB':
|
elif action == 'Terminate_eNB':
|
||||||
RAN.TerminateeNB()
|
RAN.TerminateeNB(HTML, EPC)
|
||||||
elif action == 'Initialize_UE':
|
elif action == 'Initialize_UE':
|
||||||
CiTestObj.InitializeUE(HTML,COTS_UE)
|
CiTestObj.InitializeUE(HTML,COTS_UE)
|
||||||
elif action == 'Terminate_UE':
|
elif action == 'Terminate_UE':
|
||||||
@@ -656,17 +689,17 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re
|
|||||||
elif action == 'Initialize_OAI_UE':
|
elif action == 'Initialize_OAI_UE':
|
||||||
CiTestObj.InitializeOAIUE(HTML,RAN,EPC,COTS_UE)
|
CiTestObj.InitializeOAIUE(HTML,RAN,EPC,COTS_UE)
|
||||||
elif action == 'Terminate_OAI_UE':
|
elif action == 'Terminate_OAI_UE':
|
||||||
CiTestObj.TerminateOAIUE(HTML,RAN,COTS_UE)
|
CiTestObj.TerminateOAIUE(HTML,RAN,COTS_UE,EPC)
|
||||||
elif action == 'Initialize_CatM_module':
|
elif action == 'Initialize_CatM_module':
|
||||||
CiTestObj.InitializeCatM(HTML)
|
CiTestObj.InitializeCatM(HTML)
|
||||||
elif action == 'Terminate_CatM_module':
|
elif action == 'Terminate_CatM_module':
|
||||||
CiTestObj.TerminateCatM(HTML)
|
CiTestObj.TerminateCatM(HTML)
|
||||||
elif action == 'Attach_CatM_module':
|
elif action == 'Attach_CatM_module':
|
||||||
CiTestObj.AttachCatM(HTML,RAN,COTS_UE)
|
CiTestObj.AttachCatM(HTML,RAN,COTS_UE,EPC)
|
||||||
elif action == 'Detach_CatM_module':
|
elif action == 'Detach_CatM_module':
|
||||||
CiTestObj.TerminateCatM(HTML)
|
CiTestObj.TerminateCatM(HTML)
|
||||||
elif action == 'Ping_CatM_module':
|
elif action == 'Ping_CatM_module':
|
||||||
CiTestObj.PingCatM(HTML,RAN,EPC,COTS_UE)
|
CiTestObj.PingCatM(HTML,RAN,EPC,COTS_UE,EPC)
|
||||||
elif action == 'Ping':
|
elif action == 'Ping':
|
||||||
CiTestObj.Ping(HTML,RAN,EPC,COTS_UE)
|
CiTestObj.Ping(HTML,RAN,EPC,COTS_UE)
|
||||||
elif action == 'Iperf':
|
elif action == 'Iperf':
|
||||||
@@ -674,17 +707,21 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re
|
|||||||
elif action == 'Reboot_UE':
|
elif action == 'Reboot_UE':
|
||||||
CiTestObj.RebootUE(HTML,RAN,EPC)
|
CiTestObj.RebootUE(HTML,RAN,EPC)
|
||||||
elif action == 'Initialize_HSS':
|
elif action == 'Initialize_HSS':
|
||||||
EPC.InitializeHSS()
|
EPC.InitializeHSS(HTML)
|
||||||
elif action == 'Terminate_HSS':
|
elif action == 'Terminate_HSS':
|
||||||
EPC.TerminateHSS()
|
EPC.TerminateHSS(HTML)
|
||||||
elif action == 'Initialize_MME':
|
elif action == 'Initialize_MME':
|
||||||
EPC.InitializeMME()
|
EPC.InitializeMME(HTML)
|
||||||
elif action == 'Terminate_MME':
|
elif action == 'Terminate_MME':
|
||||||
EPC.TerminateMME()
|
EPC.TerminateMME(HTML)
|
||||||
elif action == 'Initialize_SPGW':
|
elif action == 'Initialize_SPGW':
|
||||||
EPC.InitializeSPGW()
|
EPC.InitializeSPGW(HTML)
|
||||||
elif action == 'Terminate_SPGW':
|
elif action == 'Terminate_SPGW':
|
||||||
EPC.TerminateSPGW()
|
EPC.TerminateSPGW(HTML)
|
||||||
|
elif action == 'Deploy_EPC':
|
||||||
|
EPC.DeployEpc(HTML)
|
||||||
|
elif action == 'Undeploy_EPC':
|
||||||
|
EPC.UndeployEpc(HTML)
|
||||||
elif action == 'Initialize_FlexranCtrl':
|
elif action == 'Initialize_FlexranCtrl':
|
||||||
CiTestObj.InitializeFlexranCtrl(HTML,RAN,EPC)
|
CiTestObj.InitializeFlexranCtrl(HTML,RAN,EPC)
|
||||||
elif action == 'Terminate_FlexranCtrl':
|
elif action == 'Terminate_FlexranCtrl':
|
||||||
@@ -698,6 +735,12 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re
|
|||||||
if ldpc.exitStatus==1:sys.exit()
|
if ldpc.exitStatus==1:sys.exit()
|
||||||
elif action == 'Run_PhySim':
|
elif action == 'Run_PhySim':
|
||||||
HTML=ldpc.Run_PhySim(HTML,CONST,id)
|
HTML=ldpc.Run_PhySim(HTML,CONST,id)
|
||||||
|
elif action == 'Build_Image':
|
||||||
|
CONTAINERS.BuildImage(HTML)
|
||||||
|
elif action == 'Deploy_Object':
|
||||||
|
CONTAINERS.DeployObject(HTML, EPC)
|
||||||
|
elif action == 'Undeploy_Object':
|
||||||
|
CONTAINERS.UndeployObject(HTML, RAN)
|
||||||
else:
|
else:
|
||||||
sys.exit('Invalid class (action) from xml')
|
sys.exit('Invalid class (action) from xml')
|
||||||
if not RAN.prematureExit:
|
if not RAN.prematureExit:
|
||||||
@@ -707,14 +750,14 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re
|
|||||||
HTML.testStabilityPointReached = True
|
HTML.testStabilityPointReached = True
|
||||||
CiTestObj.FailReportCnt += 1
|
CiTestObj.FailReportCnt += 1
|
||||||
if CiTestObj.FailReportCnt == CiTestObj.repeatCounts[0] and RAN.prematureExit:
|
if CiTestObj.FailReportCnt == CiTestObj.repeatCounts[0] and RAN.prematureExit:
|
||||||
logging.debug('Testsuite failed ' + str(CiTestObj.FailReportCnt) + ' time(s)')
|
logging.debug('Scenario failed ' + str(CiTestObj.FailReportCnt) + ' time(s)')
|
||||||
HTML.CreateHtmlTabFooter(False)
|
HTML.CreateHtmlTabFooter(False)
|
||||||
if CiTestObj.testUnstable and (CiTestObj.testStabilityPointReached or CiTestObj.testMinStableId == '999999'):
|
if CiTestObj.testUnstable and (CiTestObj.testStabilityPointReached or CiTestObj.testMinStableId == '999999'):
|
||||||
logging.debug('Scenario has reached minimal stability point -- Not a Failure')
|
logging.debug('Scenario has reached minimal stability point -- Not a Failure')
|
||||||
else:
|
else:
|
||||||
sys.exit('Failed Scenario')
|
sys.exit('Failed Scenario')
|
||||||
else:
|
else:
|
||||||
logging.info('Testsuite passed after ' + str(CiTestObj.FailReportCnt) + ' time(s)')
|
logging.info('Scenario passed after ' + str(CiTestObj.FailReportCnt) + ' time(s)')
|
||||||
HTML.CreateHtmlTabFooter(True)
|
HTML.CreateHtmlTabFooter(True)
|
||||||
elif re.match('^LoadParams$', mode, re.IGNORECASE):
|
elif re.match('^LoadParams$', mode, re.IGNORECASE):
|
||||||
pass
|
pass
|
||||||
|
|||||||
+93
-86
@@ -42,10 +42,8 @@ from multiprocessing import Process, Lock, SimpleQueue
|
|||||||
# OAI Testing modules
|
# OAI Testing modules
|
||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
import sshconnection as SSH
|
import sshconnection as SSH
|
||||||
import epc
|
|
||||||
import helpreadme as HELP
|
import helpreadme as HELP
|
||||||
import constants as CONST
|
import constants as CONST
|
||||||
import html
|
|
||||||
|
|
||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
# Class Declaration
|
# Class Declaration
|
||||||
@@ -77,19 +75,20 @@ class RANManagement():
|
|||||||
self.backgroundBuildTestId = ['', '', '']
|
self.backgroundBuildTestId = ['', '', '']
|
||||||
self.Build_eNB_forced_workspace_cleanup = False
|
self.Build_eNB_forced_workspace_cleanup = False
|
||||||
self.Initialize_eNB_args = ''
|
self.Initialize_eNB_args = ''
|
||||||
|
self.imageKind = ''
|
||||||
self.air_interface = ['', '', ''] #changed from 'lte' to '' may lead to side effects in main
|
self.air_interface = ['', '', ''] #changed from 'lte' to '' may lead to side effects in main
|
||||||
self.eNB_instance = 0
|
self.eNB_instance = 0
|
||||||
self.eNB_serverId = ''
|
self.eNB_serverId = ['', '', '']
|
||||||
self.eNBLogFiles = ['', '', '']
|
self.eNBLogFiles = ['', '', '']
|
||||||
self.eNBOptions = ['', '', '']
|
self.eNBOptions = ['', '', '']
|
||||||
self.eNBmbmsEnables = [False, False, False]
|
self.eNBmbmsEnables = [False, False, False]
|
||||||
self.eNBstatuses = [-1, -1, -1]
|
self.eNBstatuses = [-1, -1, -1]
|
||||||
self.flexranCtrlInstalled = False
|
self.flexranCtrlInstalled = False
|
||||||
self.flexranCtrlStarted = False
|
self.flexranCtrlStarted = False
|
||||||
|
self.flexranCtrlDeployed = False
|
||||||
|
self.flexranCtrlIpAddress = ''
|
||||||
self.testCase_id = ''
|
self.testCase_id = ''
|
||||||
self.epcPcapFile = ''
|
self.epcPcapFile = ''
|
||||||
self.htmlObj = None
|
|
||||||
self.epcObj = None
|
|
||||||
self.runtime_stats= ''
|
self.runtime_stats= ''
|
||||||
|
|
||||||
|
|
||||||
@@ -98,21 +97,21 @@ class RANManagement():
|
|||||||
# RAN management functions
|
# RAN management functions
|
||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
|
|
||||||
def BuildeNB(self):
|
def BuildeNB(self, HTML):
|
||||||
if self.ranRepository == '' or self.ranBranch == '' or self.ranCommitID == '':
|
if self.ranRepository == '' or self.ranBranch == '' or self.ranCommitID == '':
|
||||||
HELP.GenericHelp(CONST.Version)
|
HELP.GenericHelp(CONST.Version)
|
||||||
sys.exit('Insufficient Parameter')
|
sys.exit('Insufficient Parameter')
|
||||||
if self.eNB_serverId == '0':
|
if self.eNB_serverId[self.eNB_instance] == '0':
|
||||||
lIpAddr = self.eNBIPAddress
|
lIpAddr = self.eNBIPAddress
|
||||||
lUserName = self.eNBUserName
|
lUserName = self.eNBUserName
|
||||||
lPassWord = self.eNBPassword
|
lPassWord = self.eNBPassword
|
||||||
lSourcePath = self.eNBSourceCodePath
|
lSourcePath = self.eNBSourceCodePath
|
||||||
elif self.eNB_serverId == '1':
|
elif self.eNB_serverId[self.eNB_instance] == '1':
|
||||||
lIpAddr = self.eNB1IPAddress
|
lIpAddr = self.eNB1IPAddress
|
||||||
lUserName = self.eNB1UserName
|
lUserName = self.eNB1UserName
|
||||||
lPassWord = self.eNB1Password
|
lPassWord = self.eNB1Password
|
||||||
lSourcePath = self.eNB1SourceCodePath
|
lSourcePath = self.eNB1SourceCodePath
|
||||||
elif self.eNB_serverId == '2':
|
elif self.eNB_serverId[self.eNB_instance] == '2':
|
||||||
lIpAddr = self.eNB2IPAddress
|
lIpAddr = self.eNB2IPAddress
|
||||||
lUserName = self.eNB2UserName
|
lUserName = self.eNB2UserName
|
||||||
lPassWord = self.eNB2Password
|
lPassWord = self.eNB2Password
|
||||||
@@ -120,6 +119,7 @@ class RANManagement():
|
|||||||
if lIpAddr == '' or lUserName == '' or lPassWord == '' or lSourcePath == '':
|
if lIpAddr == '' or lUserName == '' or lPassWord == '' or lSourcePath == '':
|
||||||
HELP.GenericHelp(CONST.Version)
|
HELP.GenericHelp(CONST.Version)
|
||||||
sys.exit('Insufficient Parameter')
|
sys.exit('Insufficient Parameter')
|
||||||
|
logging.debug('Building on server: ' + lIpAddr)
|
||||||
mySSH = SSH.SSHConnection()
|
mySSH = SSH.SSHConnection()
|
||||||
mySSH.open(lIpAddr, lUserName, lPassWord)
|
mySSH.open(lIpAddr, lUserName, lPassWord)
|
||||||
|
|
||||||
@@ -137,10 +137,7 @@ class RANManagement():
|
|||||||
# Worakround for some servers, we need to erase completely the workspace
|
# Worakround for some servers, we need to erase completely the workspace
|
||||||
if self.Build_eNB_forced_workspace_cleanup:
|
if self.Build_eNB_forced_workspace_cleanup:
|
||||||
mySSH.command('echo ' + lPassWord + ' | sudo -S rm -Rf ' + lSourcePath, '\$', 15)
|
mySSH.command('echo ' + lPassWord + ' | sudo -S rm -Rf ' + lSourcePath, '\$', 15)
|
||||||
if self.htmlObj is not None:
|
self.testCase_id = HTML.testCase_id
|
||||||
self.testCase_id = self.htmlObj.testCase_id
|
|
||||||
else:
|
|
||||||
self.testCase_id = '000000'
|
|
||||||
# on RedHat/CentOS .git extension is mandatory
|
# on RedHat/CentOS .git extension is mandatory
|
||||||
result = re.search('([a-zA-Z0-9\:\-\.\/])+\.git', self.ranRepository)
|
result = re.search('([a-zA-Z0-9\:\-\.\/])+\.git', self.ranRepository)
|
||||||
if result is not None:
|
if result is not None:
|
||||||
@@ -181,8 +178,7 @@ class RANManagement():
|
|||||||
mismatch = True
|
mismatch = True
|
||||||
if not mismatch:
|
if not mismatch:
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
if self.htmlObj is not None:
|
HTML.CreateHtmlTestRow(self.Build_eNB_args, 'OK', CONST.ALL_PROCESSES_OK)
|
||||||
self.htmlObj.CreateHtmlTestRow(self.Build_eNB_args, 'OK', CONST.ALL_PROCESSES_OK)
|
|
||||||
return
|
return
|
||||||
|
|
||||||
mySSH.command('echo ' + lPassWord + ' | sudo -S git clean -x -d -ff', '\$', 30)
|
mySSH.command('echo ' + lPassWord + ' | sudo -S git clean -x -d -ff', '\$', 30)
|
||||||
@@ -209,26 +205,25 @@ class RANManagement():
|
|||||||
mySSH.command('echo ' + lPassWord + ' | sudo -S ls', '\$', 5)
|
mySSH.command('echo ' + lPassWord + ' | sudo -S ls', '\$', 5)
|
||||||
mySSH.command('echo $USER; nohup sudo -E ./my-lte-softmodem-build.sh' + ' > ' + lSourcePath + '/cmake_targets/compile_oai_enb.log ' + ' 2>&1 &', lUserName, 5)
|
mySSH.command('echo $USER; nohup sudo -E ./my-lte-softmodem-build.sh' + ' > ' + lSourcePath + '/cmake_targets/compile_oai_enb.log ' + ' 2>&1 &', lUserName, 5)
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
if self.htmlObj is not None:
|
HTML.CreateHtmlTestRow(self.Build_eNB_args, 'OK', CONST.ALL_PROCESSES_OK)
|
||||||
self.htmlObj.CreateHtmlTestRow(self.Build_eNB_args, 'OK', CONST.ALL_PROCESSES_OK)
|
|
||||||
self.backgroundBuildTestId[int(self.eNB_instance)] = self.testCase_id
|
self.backgroundBuildTestId[int(self.eNB_instance)] = self.testCase_id
|
||||||
return
|
return
|
||||||
mySSH.command('stdbuf -o0 ./build_oai ' + self.Build_eNB_args + ' 2>&1 | stdbuf -o0 tee compile_oai_enb.log', 'Bypassing the Tests|build have failed', 1500)
|
mySSH.command('stdbuf -o0 ./build_oai ' + self.Build_eNB_args + ' 2>&1 | stdbuf -o0 tee compile_oai_enb.log', 'Bypassing the Tests|build have failed', 1500)
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
self.checkBuildeNB(lIpAddr, lUserName, lPassWord, lSourcePath, self.testCase_id)
|
self.checkBuildeNB(lIpAddr, lUserName, lPassWord, lSourcePath, self.testCase_id, HTML)
|
||||||
|
|
||||||
def WaitBuildeNBisFinished(self):
|
def WaitBuildeNBisFinished(self, HTML):
|
||||||
if self.eNB_serverId == '0':
|
if self.eNB_serverId[self.eNB_instance] == '0':
|
||||||
lIpAddr = self.eNBIPAddress
|
lIpAddr = self.eNBIPAddress
|
||||||
lUserName = self.eNBUserName
|
lUserName = self.eNBUserName
|
||||||
lPassWord = self.eNBPassword
|
lPassWord = self.eNBPassword
|
||||||
lSourcePath = self.eNBSourceCodePath
|
lSourcePath = self.eNBSourceCodePath
|
||||||
elif self.eNB_serverId == '1':
|
elif self.eNB_serverId[self.eNB_instance] == '1':
|
||||||
lIpAddr = self.eNB1IPAddress
|
lIpAddr = self.eNB1IPAddress
|
||||||
lUserName = self.eNB1UserName
|
lUserName = self.eNB1UserName
|
||||||
lPassWord = self.eNB1Password
|
lPassWord = self.eNB1Password
|
||||||
lSourcePath = self.eNB1SourceCodePath
|
lSourcePath = self.eNB1SourceCodePath
|
||||||
elif self.eNB_serverId == '2':
|
elif self.eNB_serverId[self.eNB_instance] == '2':
|
||||||
lIpAddr = self.eNB2IPAddress
|
lIpAddr = self.eNB2IPAddress
|
||||||
lUserName = self.eNB2UserName
|
lUserName = self.eNB2UserName
|
||||||
lPassWord = self.eNB2Password
|
lPassWord = self.eNB2Password
|
||||||
@@ -236,6 +231,7 @@ class RANManagement():
|
|||||||
if lIpAddr == '' or lUserName == '' or lPassWord == '' or lSourcePath == '':
|
if lIpAddr == '' or lUserName == '' or lPassWord == '' or lSourcePath == '':
|
||||||
HELP.GenericHelp(CONST.Version)
|
HELP.GenericHelp(CONST.Version)
|
||||||
sys.exit('Insufficient Parameter')
|
sys.exit('Insufficient Parameter')
|
||||||
|
logging.debug('Waiting for end of build on server: ' + lIpAddr)
|
||||||
mySSH = SSH.SSHConnection()
|
mySSH = SSH.SSHConnection()
|
||||||
mySSH.open(lIpAddr, lUserName, lPassWord)
|
mySSH.open(lIpAddr, lUserName, lPassWord)
|
||||||
count = 40
|
count = 40
|
||||||
@@ -249,11 +245,10 @@ class RANManagement():
|
|||||||
count -= 1
|
count -= 1
|
||||||
time.sleep(30)
|
time.sleep(30)
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
self.checkBuildeNB(lIpAddr, lUserName, lPassWord, lSourcePath, self.backgroundBuildTestId[int(self.eNB_instance)])
|
self.checkBuildeNB(lIpAddr, lUserName, lPassWord, lSourcePath, self.backgroundBuildTestId[int(self.eNB_instance)], HTML)
|
||||||
|
|
||||||
def checkBuildeNB(self, lIpAddr, lUserName, lPassWord, lSourcePath, testcaseId):
|
def checkBuildeNB(self, lIpAddr, lUserName, lPassWord, lSourcePath, testcaseId, HTML):
|
||||||
if self.htmlObj is not None:
|
HTML.testCase_id=testcaseId
|
||||||
self.htmlObj.testCase_id=testcaseId
|
|
||||||
|
|
||||||
mySSH = SSH.SSHConnection()
|
mySSH = SSH.SSHConnection()
|
||||||
mySSH.open(lIpAddr, lUserName, lPassWord)
|
mySSH.open(lIpAddr, lUserName, lPassWord)
|
||||||
@@ -284,7 +279,7 @@ class RANManagement():
|
|||||||
mySSH.command('mkdir -p build_log_' + testcaseId, '\$', 5)
|
mySSH.command('mkdir -p build_log_' + testcaseId, '\$', 5)
|
||||||
mySSH.command('mv log/* ' + 'build_log_' + testcaseId, '\$', 5)
|
mySSH.command('mv log/* ' + 'build_log_' + testcaseId, '\$', 5)
|
||||||
mySSH.command('mv compile_oai_enb.log ' + 'build_log_' + testcaseId, '\$', 5)
|
mySSH.command('mv compile_oai_enb.log ' + 'build_log_' + testcaseId, '\$', 5)
|
||||||
if self.eNB_serverId != '0':
|
if self.eNB_serverId[self.eNB_instance] != '0':
|
||||||
mySSH.command('cd cmake_targets', '\$', 5)
|
mySSH.command('cd cmake_targets', '\$', 5)
|
||||||
mySSH.command('if [ -e tmp_build' + testcaseId + '.zip ]; then rm -f tmp_build' + testcaseId + '.zip; fi', '\$', 5)
|
mySSH.command('if [ -e tmp_build' + testcaseId + '.zip ]; then rm -f tmp_build' + testcaseId + '.zip; fi', '\$', 5)
|
||||||
mySSH.command('zip -r -qq tmp_build' + testcaseId + '.zip build_log_' + testcaseId, '\$', 5)
|
mySSH.command('zip -r -qq tmp_build' + testcaseId + '.zip build_log_' + testcaseId, '\$', 5)
|
||||||
@@ -307,27 +302,25 @@ class RANManagement():
|
|||||||
#generate logging info depending on buildStatus and air interface
|
#generate logging info depending on buildStatus and air interface
|
||||||
if buildStatus:
|
if buildStatus:
|
||||||
logging.info('\u001B[1m Building OAI ' + self.air_interface[self.eNB_instance] + ' Pass\u001B[0m')
|
logging.info('\u001B[1m Building OAI ' + self.air_interface[self.eNB_instance] + ' Pass\u001B[0m')
|
||||||
if self.htmlObj is not None:
|
HTML.CreateHtmlTestRow(self.Build_eNB_args, 'OK', CONST.ALL_PROCESSES_OK)
|
||||||
self.htmlObj.CreateHtmlTestRow(self.Build_eNB_args, 'OK', CONST.ALL_PROCESSES_OK)
|
|
||||||
else:
|
else:
|
||||||
logging.error('\u001B[1m Building OAI ' + self.air_interface[self.eNB_instance] + ' Failed\u001B[0m')
|
logging.error('\u001B[1m Building OAI ' + self.air_interface[self.eNB_instance] + ' Failed\u001B[0m')
|
||||||
if self.htmlObj is not None:
|
HTML.CreateHtmlTestRow(self.Build_eNB_args, 'KO', CONST.ALL_PROCESSES_OK)
|
||||||
self.htmlObj.CreateHtmlTestRow(self.Build_eNB_args, 'KO', CONST.ALL_PROCESSES_OK)
|
HTML.CreateHtmlTabFooter(False)
|
||||||
self.htmlObj.CreateHtmlTabFooter(False)
|
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
def InitializeeNB(self):
|
def InitializeeNB(self, HTML, EPC):
|
||||||
if self.eNB_serverId == '0':
|
if self.eNB_serverId[self.eNB_instance] == '0':
|
||||||
lIpAddr = self.eNBIPAddress
|
lIpAddr = self.eNBIPAddress
|
||||||
lUserName = self.eNBUserName
|
lUserName = self.eNBUserName
|
||||||
lPassWord = self.eNBPassword
|
lPassWord = self.eNBPassword
|
||||||
lSourcePath = self.eNBSourceCodePath
|
lSourcePath = self.eNBSourceCodePath
|
||||||
elif self.eNB_serverId == '1':
|
elif self.eNB_serverId[self.eNB_instance] == '1':
|
||||||
lIpAddr = self.eNB1IPAddress
|
lIpAddr = self.eNB1IPAddress
|
||||||
lUserName = self.eNB1UserName
|
lUserName = self.eNB1UserName
|
||||||
lPassWord = self.eNB1Password
|
lPassWord = self.eNB1Password
|
||||||
lSourcePath = self.eNB1SourceCodePath
|
lSourcePath = self.eNB1SourceCodePath
|
||||||
elif self.eNB_serverId == '2':
|
elif self.eNB_serverId[self.eNB_instance] == '2':
|
||||||
lIpAddr = self.eNB2IPAddress
|
lIpAddr = self.eNB2IPAddress
|
||||||
lUserName = self.eNB2UserName
|
lUserName = self.eNB2UserName
|
||||||
lPassWord = self.eNB2Password
|
lPassWord = self.eNB2Password
|
||||||
@@ -335,24 +328,21 @@ class RANManagement():
|
|||||||
if lIpAddr == '' or lUserName == '' or lPassWord == '' or lSourcePath == '':
|
if lIpAddr == '' or lUserName == '' or lPassWord == '' or lSourcePath == '':
|
||||||
HELP.GenericHelp(CONST.Version)
|
HELP.GenericHelp(CONST.Version)
|
||||||
sys.exit('Insufficient Parameter')
|
sys.exit('Insufficient Parameter')
|
||||||
|
logging.debug('Starting eNB/gNB on server: ' + lIpAddr)
|
||||||
|
|
||||||
if self.htmlObj is not None:
|
self.testCase_id = HTML.testCase_id
|
||||||
self.testCase_id = self.htmlObj.testCase_id
|
|
||||||
else:
|
|
||||||
self.testCase_id = '000000'
|
|
||||||
mySSH = SSH.SSHConnection()
|
mySSH = SSH.SSHConnection()
|
||||||
|
|
||||||
if (self.pStatus < 0):
|
if (self.pStatus < 0):
|
||||||
if self.htmlObj is not None:
|
HTML.CreateHtmlTestRow(self.air_interface[self.eNB_instance] + ' ' + self.Initialize_eNB_args, 'KO', self.pStatus)
|
||||||
self.htmlObj.CreateHtmlTestRow(self.air_interface[self.eNB_instance] + ' ' + self.Initialize_eNB_args, 'KO', self.pStatus)
|
HTML.CreateHtmlTabFooter(False)
|
||||||
self.htmlObj.CreateHtmlTabFooter(False)
|
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
# 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))
|
result = re.search('T_stdout', str(self.Initialize_eNB_args))
|
||||||
if (result is not None) and (self.epcObj is not None):
|
if (result is not None):
|
||||||
localEpcIpAddr = self.epcObj.IPAddress
|
localEpcIpAddr = EPC.IPAddress
|
||||||
localEpcUserName = self.epcObj.UserName
|
localEpcUserName = EPC.UserName
|
||||||
localEpcPassword = self.epcObj.Password
|
localEpcPassword = EPC.Password
|
||||||
mySSH.open(localEpcIpAddr, localEpcUserName, localEpcPassword)
|
mySSH.open(localEpcIpAddr, localEpcUserName, localEpcPassword)
|
||||||
mySSH.command('ip addr show | awk -f /tmp/active_net_interfaces.awk | egrep -v "lo|tun"', '\$', 5)
|
mySSH.command('ip addr show | awk -f /tmp/active_net_interfaces.awk | egrep -v "lo|tun"', '\$', 5)
|
||||||
result = re.search('interfaceToUse=(?P<eth_interface>[a-zA-Z0-9\-\_]+)done', mySSH.getBefore())
|
result = re.search('interfaceToUse=(?P<eth_interface>[a-zA-Z0-9\-\_]+)done', mySSH.getBefore())
|
||||||
@@ -400,17 +390,17 @@ class RANManagement():
|
|||||||
mySSH.command('echo ' + lPassWord + ' | sudo -S uhd_find_devices', '\$', 60)
|
mySSH.command('echo ' + lPassWord + ' | sudo -S uhd_find_devices', '\$', 60)
|
||||||
# Make a copy and adapt to EPC / eNB IP addresses
|
# Make a copy and adapt to EPC / eNB IP addresses
|
||||||
mySSH.command('cp ' + full_config_file + ' ' + ci_full_config_file, '\$', 5)
|
mySSH.command('cp ' + full_config_file + ' ' + ci_full_config_file, '\$', 5)
|
||||||
if self.epcObj is not None:
|
localMmeIpAddr = EPC.MmeIPAddress
|
||||||
localMmeIpAddr = self.epcObj.MmeIPAddress
|
mySSH.command('sed -i -e \'s/CI_MME_IP_ADDR/' + localMmeIpAddr + '/\' ' + ci_full_config_file, '\$', 2);
|
||||||
mySSH.command('sed -i -e \'s/CI_MME_IP_ADDR/' + localMmeIpAddr + '/\' ' + ci_full_config_file, '\$', 2);
|
|
||||||
mySSH.command('sed -i -e \'s/CI_ENB_IP_ADDR/' + lIpAddr + '/\' ' + ci_full_config_file, '\$', 2);
|
mySSH.command('sed -i -e \'s/CI_ENB_IP_ADDR/' + lIpAddr + '/\' ' + ci_full_config_file, '\$', 2);
|
||||||
mySSH.command('sed -i -e \'s/CI_GNB_IP_ADDR/' + lIpAddr + '/\' ' + ci_full_config_file, '\$', 2);
|
mySSH.command('sed -i -e \'s/CI_GNB_IP_ADDR/' + lIpAddr + '/\' ' + ci_full_config_file, '\$', 2);
|
||||||
mySSH.command('sed -i -e \'s/CI_RCC_IP_ADDR/' + self.eNBIPAddress + '/\' ' + ci_full_config_file, '\$', 2);
|
mySSH.command('sed -i -e \'s/CI_RCC_IP_ADDR/' + self.eNBIPAddress + '/\' ' + ci_full_config_file, '\$', 2);
|
||||||
mySSH.command('sed -i -e \'s/CI_RRU1_IP_ADDR/' + self.eNB1IPAddress + '/\' ' + ci_full_config_file, '\$', 2);
|
mySSH.command('sed -i -e \'s/CI_RRU1_IP_ADDR/' + self.eNB1IPAddress + '/\' ' + ci_full_config_file, '\$', 2);
|
||||||
mySSH.command('sed -i -e \'s/CI_RRU2_IP_ADDR/' + self.eNB2IPAddress + '/\' ' + ci_full_config_file, '\$', 2);
|
mySSH.command('sed -i -e \'s/CI_RRU2_IP_ADDR/' + self.eNB2IPAddress + '/\' ' + ci_full_config_file, '\$', 2);
|
||||||
mySSH.command('sed -i -e \'s/CI_FR1_CTL_ENB_IP_ADDR/' + self.eNBIPAddress + '/\' ' + ci_full_config_file, '\$', 2);
|
mySSH.command('sed -i -e \'s/CI_FR1_CTL_ENB_IP_ADDR/' + self.eNBIPAddress + '/\' ' + ci_full_config_file, '\$', 2);
|
||||||
if self.flexranCtrlInstalled and self.flexranCtrlStarted:
|
if (self.flexranCtrlInstalled and self.flexranCtrlStarted) or self.flexranCtrlDeployed:
|
||||||
mySSH.command('sed -i -e \'s/FLEXRAN_ENABLED.*;/FLEXRAN_ENABLED = "yes";/\' ' + ci_full_config_file, '\$', 2);
|
mySSH.command('sed -i -e \'s/FLEXRAN_ENABLED.*;/FLEXRAN_ENABLED = "yes";/\' ' + ci_full_config_file, '\$', 2);
|
||||||
|
mySSH.command('sed -i -e \'s/CI_FLEXRAN_CTL_IP_ADDR/' + self.flexranCtrlIpAddress + '/\' ' + ci_full_config_file, '\$', 2);
|
||||||
else:
|
else:
|
||||||
mySSH.command('sed -i -e \'s/FLEXRAN_ENABLED.*;/FLEXRAN_ENABLED = "no";/\' ' + ci_full_config_file, '\$', 2);
|
mySSH.command('sed -i -e \'s/FLEXRAN_ENABLED.*;/FLEXRAN_ENABLED = "no";/\' ' + ci_full_config_file, '\$', 2);
|
||||||
self.eNBmbmsEnables[int(self.eNB_instance)] = False
|
self.eNBmbmsEnables[int(self.eNB_instance)] = False
|
||||||
@@ -452,14 +442,13 @@ class RANManagement():
|
|||||||
mySSH.close()
|
mySSH.close()
|
||||||
doLoop = False
|
doLoop = False
|
||||||
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')
|
||||||
if self.htmlObj is not None:
|
HTML.CreateHtmlTestRow(self.air_interface[self.eNB_instance] + ' -O ' + config_file + extra_options, 'KO', CONST.ALL_PROCESSES_OK)
|
||||||
self.htmlObj.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))
|
result = re.search('T_stdout', str(self.Initialize_eNB_args))
|
||||||
if (result is not None) and (self.epcObj is not None):
|
if (result is not None):
|
||||||
localEpcIpAddr = self.epcObj.IPAddress
|
localEpcIpAddr = EPC.IPAddress
|
||||||
localEpcUserName = self.epcObj.UserName
|
localEpcUserName = EPC.UserName
|
||||||
localEpcPassword = self.epcObj.Password
|
localEpcPassword = EPC.Password
|
||||||
mySSH.open(localEpcIpAddr, localEpcUserName, localEpcPassword)
|
mySSH.open(localEpcIpAddr, localEpcUserName, localEpcPassword)
|
||||||
logging.debug('\u001B[1m Stopping tshark \u001B[0m')
|
logging.debug('\u001B[1m Stopping tshark \u001B[0m')
|
||||||
mySSH.command('echo ' + localEpcPassword + ' | sudo -S killall --signal SIGKILL tshark', '\$', 5)
|
mySSH.command('echo ' + localEpcPassword + ' | sudo -S killall --signal SIGKILL tshark', '\$', 5)
|
||||||
@@ -507,11 +496,10 @@ class RANManagement():
|
|||||||
else:
|
else:
|
||||||
logging.error('\u001B[1m oaitun_enm1 interface is either NOT mounted or NOT configured\u001B[0m')
|
logging.error('\u001B[1m oaitun_enm1 interface is either NOT mounted or NOT configured\u001B[0m')
|
||||||
if enbDidSync:
|
if enbDidSync:
|
||||||
self.eNBstatuses[int(self.eNB_instance)] = int(self.eNB_serverId)
|
self.eNBstatuses[int(self.eNB_instance)] = int(self.eNB_serverId[self.eNB_instance])
|
||||||
|
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
if self.htmlObj is not None:
|
HTML.CreateHtmlTestRow(self.air_interface[self.eNB_instance] + ' -O ' + config_file + extra_options, 'OK', CONST.ALL_PROCESSES_OK)
|
||||||
self.htmlObj.CreateHtmlTestRow(self.air_interface[self.eNB_instance] + ' -O ' + config_file + extra_options, 'OK', CONST.ALL_PROCESSES_OK)
|
|
||||||
logging.debug('\u001B[1m Initialize eNB/gNB/ocp-eNB Completed\u001B[0m')
|
logging.debug('\u001B[1m Initialize eNB/gNB/ocp-eNB Completed\u001B[0m')
|
||||||
|
|
||||||
def CheckeNBProcess(self, status_queue):
|
def CheckeNBProcess(self, status_queue):
|
||||||
@@ -546,18 +534,18 @@ class RANManagement():
|
|||||||
except:
|
except:
|
||||||
os.kill(os.getppid(),signal.SIGUSR1)
|
os.kill(os.getppid(),signal.SIGUSR1)
|
||||||
|
|
||||||
def TerminateeNB(self):
|
def TerminateeNB(self, HTML, EPC):
|
||||||
if self.eNB_serverId == '0':
|
if self.eNB_serverId[self.eNB_instance] == '0':
|
||||||
lIpAddr = self.eNBIPAddress
|
lIpAddr = self.eNBIPAddress
|
||||||
lUserName = self.eNBUserName
|
lUserName = self.eNBUserName
|
||||||
lPassWord = self.eNBPassword
|
lPassWord = self.eNBPassword
|
||||||
lSourcePath = self.eNBSourceCodePath
|
lSourcePath = self.eNBSourceCodePath
|
||||||
elif self.eNB_serverId == '1':
|
elif self.eNB_serverId[self.eNB_instance] == '1':
|
||||||
lIpAddr = self.eNB1IPAddress
|
lIpAddr = self.eNB1IPAddress
|
||||||
lUserName = self.eNB1UserName
|
lUserName = self.eNB1UserName
|
||||||
lPassWord = self.eNB1Password
|
lPassWord = self.eNB1Password
|
||||||
lSourcePath = self.eNB1SourceCodePath
|
lSourcePath = self.eNB1SourceCodePath
|
||||||
elif self.eNB_serverId == '2':
|
elif self.eNB_serverId[self.eNB_instance] == '2':
|
||||||
lIpAddr = self.eNB2IPAddress
|
lIpAddr = self.eNB2IPAddress
|
||||||
lUserName = self.eNB2UserName
|
lUserName = self.eNB2UserName
|
||||||
lPassWord = self.eNB2Password
|
lPassWord = self.eNB2Password
|
||||||
@@ -565,6 +553,7 @@ class RANManagement():
|
|||||||
if lIpAddr == '' or lUserName == '' or lPassWord == '' or lSourcePath == '':
|
if lIpAddr == '' or lUserName == '' or lPassWord == '' or lSourcePath == '':
|
||||||
HELP.GenericHelp(CONST.Version)
|
HELP.GenericHelp(CONST.Version)
|
||||||
sys.exit('Insufficient Parameter')
|
sys.exit('Insufficient Parameter')
|
||||||
|
logging.debug('Stopping eNB/gNB on server: ' + lIpAddr)
|
||||||
mySSH = SSH.SSHConnection()
|
mySSH = SSH.SSHConnection()
|
||||||
mySSH.open(lIpAddr, lUserName, lPassWord)
|
mySSH.open(lIpAddr, lUserName, lPassWord)
|
||||||
mySSH.command('cd ' + lSourcePath + '/cmake_targets', '\$', 5)
|
mySSH.command('cd ' + lSourcePath + '/cmake_targets', '\$', 5)
|
||||||
@@ -586,10 +575,10 @@ class RANManagement():
|
|||||||
mySSH.close()
|
mySSH.close()
|
||||||
# If tracer options is on, stopping tshark on EPC side
|
# If tracer options is on, stopping tshark on EPC side
|
||||||
result = re.search('T_stdout', str(self.Initialize_eNB_args))
|
result = re.search('T_stdout', str(self.Initialize_eNB_args))
|
||||||
if (result is not None) and (self.epcObj is not None):
|
if (result is not None):
|
||||||
localEpcIpAddr = self.epcObj.IPAddress
|
localEpcIpAddr = EPC.IPAddress
|
||||||
localEpcUserName = self.epcObj.UserName
|
localEpcUserName = EPC.UserName
|
||||||
localEpcPassword = self.epcObj.Password
|
localEpcPassword = EPC.Password
|
||||||
mySSH.open(localEpcIpAddr, localEpcUserName, localEpcPassword)
|
mySSH.open(localEpcIpAddr, localEpcUserName, localEpcPassword)
|
||||||
logging.debug('\u001B[1m Stopping tshark \u001B[0m')
|
logging.debug('\u001B[1m Stopping tshark \u001B[0m')
|
||||||
mySSH.command('echo ' + localEpcPassword + ' | sudo -S killall --signal SIGKILL tshark', '\$', 5)
|
mySSH.command('echo ' + localEpcPassword + ' | sudo -S killall --signal SIGKILL tshark', '\$', 5)
|
||||||
@@ -613,9 +602,8 @@ class RANManagement():
|
|||||||
mySSH.close()
|
mySSH.close()
|
||||||
mySSH.copyin(lIpAddr, lUserName, lPassWord, lSourcePath + '/cmake_targets/' + extracted_log_file, '.')
|
mySSH.copyin(lIpAddr, lUserName, lPassWord, lSourcePath + '/cmake_targets/' + extracted_log_file, '.')
|
||||||
logging.debug('\u001B[1m Analyzing eNB replay logfile \u001B[0m')
|
logging.debug('\u001B[1m Analyzing eNB replay logfile \u001B[0m')
|
||||||
logStatus = self.AnalyzeLogFile_eNB(extracted_log_file)
|
logStatus = self.AnalyzeLogFile_eNB(extracted_log_file, HTML)
|
||||||
if self.htmlObj is not None:
|
HTML.CreateHtmlTestRow(self.runtime_stats, 'OK', CONST.ALL_PROCESSES_OK)
|
||||||
self.htmlObj.CreateHtmlTestRow(self.runtime_stats, 'OK', CONST.ALL_PROCESSES_OK)
|
|
||||||
self.eNBLogFiles[int(self.eNB_instance)] = ''
|
self.eNBLogFiles[int(self.eNB_instance)] = ''
|
||||||
else:
|
else:
|
||||||
analyzeFile = False
|
analyzeFile = False
|
||||||
@@ -627,27 +615,23 @@ class RANManagement():
|
|||||||
copyin_res = mySSH.copyin(lIpAddr, lUserName, lPassWord, lSourcePath + '/cmake_targets/' + fileToAnalyze, '.')
|
copyin_res = mySSH.copyin(lIpAddr, lUserName, lPassWord, lSourcePath + '/cmake_targets/' + fileToAnalyze, '.')
|
||||||
if (copyin_res == -1):
|
if (copyin_res == -1):
|
||||||
logging.debug('\u001B[1;37;41m Could not copy ' + nodeB_prefix + 'NB logfile to analyze it! \u001B[0m')
|
logging.debug('\u001B[1;37;41m Could not copy ' + nodeB_prefix + 'NB logfile to analyze it! \u001B[0m')
|
||||||
if self.htmlObj is not None:
|
HTML.htmleNBFailureMsg='Could not copy ' + nodeB_prefix + 'NB logfile to analyze it!'
|
||||||
self.htmlObj.htmleNBFailureMsg='Could not copy ' + nodeB_prefix + 'NB logfile to analyze it!'
|
HTML.CreateHtmlTestRow('N/A', 'KO', CONST.ENB_PROCESS_NOLOGFILE_TO_ANALYZE)
|
||||||
self.htmlObj.CreateHtmlTestRow('N/A', 'KO', CONST.ENB_PROCESS_NOLOGFILE_TO_ANALYZE)
|
|
||||||
self.eNBmbmsEnables[int(self.eNB_instance)] = False
|
self.eNBmbmsEnables[int(self.eNB_instance)] = False
|
||||||
return
|
return
|
||||||
if self.eNB_serverId != '0':
|
if self.eNB_serverId[self.eNB_instance] != '0':
|
||||||
mySSH.copyout(self.eNBIPAddress, self.eNBUserName, self.eNBPassword, './' + fileToAnalyze, self.eNBSourceCodePath + '/cmake_targets/')
|
mySSH.copyout(self.eNBIPAddress, self.eNBUserName, self.eNBPassword, './' + fileToAnalyze, self.eNBSourceCodePath + '/cmake_targets/')
|
||||||
logging.debug('\u001B[1m Analyzing ' + nodeB_prefix + 'NB logfile \u001B[0m ' + fileToAnalyze)
|
logging.debug('\u001B[1m Analyzing ' + nodeB_prefix + 'NB logfile \u001B[0m ' + fileToAnalyze)
|
||||||
logStatus = self.AnalyzeLogFile_eNB(fileToAnalyze)
|
logStatus = self.AnalyzeLogFile_eNB(fileToAnalyze, HTML)
|
||||||
if (logStatus < 0):
|
if (logStatus < 0):
|
||||||
if self.htmlObj is not None:
|
HTML.CreateHtmlTestRow('N/A', 'KO', logStatus)
|
||||||
self.htmlObj.CreateHtmlTestRow('N/A', 'KO', logStatus)
|
|
||||||
self.preamtureExit = True
|
self.preamtureExit = True
|
||||||
self.eNBmbmsEnables[int(self.eNB_instance)] = False
|
self.eNBmbmsEnables[int(self.eNB_instance)] = False
|
||||||
return
|
return
|
||||||
else:
|
else:
|
||||||
if self.htmlObj is not None:
|
HTML.CreateHtmlTestRow(self.runtime_stats, 'OK', CONST.ALL_PROCESSES_OK)
|
||||||
self.htmlObj.CreateHtmlTestRow(self.runtime_stats, 'OK', CONST.ALL_PROCESSES_OK)
|
|
||||||
else:
|
else:
|
||||||
if self.htmlObj is not None:
|
HTML.CreateHtmlTestRow(self.runtime_stats, 'OK', CONST.ALL_PROCESSES_OK)
|
||||||
self.htmlObj.CreateHtmlTestRow(self.runtime_stats, 'OK', CONST.ALL_PROCESSES_OK)
|
|
||||||
self.eNBmbmsEnables[int(self.eNB_instance)] = False
|
self.eNBmbmsEnables[int(self.eNB_instance)] = False
|
||||||
self.eNBstatuses[int(self.eNB_instance)] = -1
|
self.eNBstatuses[int(self.eNB_instance)] = -1
|
||||||
|
|
||||||
@@ -661,7 +645,7 @@ class RANManagement():
|
|||||||
mySSH.command('echo ' + self.eNBPassword + ' | sudo -S rm enb*.log core* enb_*record.raw enb_*.pcap enb_*txt', '\$', 5)
|
mySSH.command('echo ' + self.eNBPassword + ' | sudo -S rm enb*.log core* enb_*record.raw enb_*.pcap enb_*txt', '\$', 5)
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
|
|
||||||
def AnalyzeLogFile_eNB(self, eNBlogFile):
|
def AnalyzeLogFile_eNB(self, eNBlogFile, HTML):
|
||||||
if (not os.path.isfile('./' + eNBlogFile)):
|
if (not os.path.isfile('./' + eNBlogFile)):
|
||||||
return -1
|
return -1
|
||||||
enb_log_file = open('./' + eNBlogFile, 'r')
|
enb_log_file = open('./' + eNBlogFile, 'r')
|
||||||
@@ -709,7 +693,11 @@ class RANManagement():
|
|||||||
NSA_RAPROC_PUSCH_check = 0
|
NSA_RAPROC_PUSCH_check = 0
|
||||||
#dlsch and ulsch statistics (dictionary)
|
#dlsch and ulsch statistics (dictionary)
|
||||||
dlsch_ulsch_stats = {}
|
dlsch_ulsch_stats = {}
|
||||||
|
#count "L1 thread not ready" msg
|
||||||
|
L1_thread_not_ready_cnt = 0
|
||||||
|
#count "problem receiving samples" msg
|
||||||
|
pb_receiving_samples_cnt = 0
|
||||||
|
|
||||||
for line in enb_log_file.readlines():
|
for line in enb_log_file.readlines():
|
||||||
# Runtime statistics
|
# Runtime statistics
|
||||||
result = re.search('Run time:' ,str(line))
|
result = re.search('Run time:' ,str(line))
|
||||||
@@ -874,6 +862,15 @@ class RANManagement():
|
|||||||
if result is not None:
|
if result is not None:
|
||||||
#remove 1- all useless char before relevant info (ulsch or dlsch) 2- trailing char
|
#remove 1- all useless char before relevant info (ulsch or dlsch) 2- trailing char
|
||||||
dlsch_ulsch_stats[k]=re.sub(r'^.*\]\s+', r'' , line.rstrip())
|
dlsch_ulsch_stats[k]=re.sub(r'^.*\]\s+', r'' , line.rstrip())
|
||||||
|
#count "L1 thread not ready" msg
|
||||||
|
result = re.search('\[PHY\]\s+L1_thread isn\'t ready', str(line))
|
||||||
|
if result is not None:
|
||||||
|
L1_thread_not_ready_cnt += 1
|
||||||
|
#count "problem receiving samples" msg
|
||||||
|
result = re.search('\[PHY\]\s+problem receiving samples', str(line))
|
||||||
|
if result is not None:
|
||||||
|
pb_receiving_samples_cnt += 1
|
||||||
|
|
||||||
enb_log_file.close()
|
enb_log_file.close()
|
||||||
logging.debug(' File analysis completed')
|
logging.debug(' File analysis completed')
|
||||||
if (self.air_interface[self.eNB_instance] == 'lte-softmodem') or (self.air_interface[self.eNB_instance] == 'ocp-enb'):
|
if (self.air_interface[self.eNB_instance] == 'lte-softmodem') or (self.air_interface[self.eNB_instance] == 'ocp-enb'):
|
||||||
@@ -903,6 +900,17 @@ class RANManagement():
|
|||||||
htmlMsg = statMsg+'\n'
|
htmlMsg = statMsg+'\n'
|
||||||
logging.debug(statMsg)
|
logging.debug(statMsg)
|
||||||
htmleNBFailureMsg += htmlMsg
|
htmleNBFailureMsg += htmlMsg
|
||||||
|
#L1 thread not ready log
|
||||||
|
statMsg = '[PHY] L1 thread is not ready msg count = '+str(L1_thread_not_ready_cnt)
|
||||||
|
htmlMsg = statMsg+'\n'
|
||||||
|
logging.debug(statMsg)
|
||||||
|
htmleNBFailureMsg += htmlMsg
|
||||||
|
#problem receiving samples log
|
||||||
|
statMsg = '[PHY] problem receiving samples msg count = '+str(pb_receiving_samples_cnt)
|
||||||
|
htmlMsg = statMsg+'\n'
|
||||||
|
logging.debug(statMsg)
|
||||||
|
htmleNBFailureMsg += htmlMsg
|
||||||
|
|
||||||
#ulsch and dlsch statistics
|
#ulsch and dlsch statistics
|
||||||
if len(dlsch_ulsch_stats)!=0: #check if dictionary is not empty
|
if len(dlsch_ulsch_stats)!=0: #check if dictionary is not empty
|
||||||
statMsg=''
|
statMsg=''
|
||||||
@@ -1018,8 +1026,7 @@ class RANManagement():
|
|||||||
logging.debug('\u001B[1;37;41m ' + rlcMsg + ' \u001B[0m')
|
logging.debug('\u001B[1;37;41m ' + rlcMsg + ' \u001B[0m')
|
||||||
htmleNBFailureMsg += rlcMsg + '\n'
|
htmleNBFailureMsg += rlcMsg + '\n'
|
||||||
global_status = CONST.ENB_PROCESS_REALTIME_ISSUE
|
global_status = CONST.ENB_PROCESS_REALTIME_ISSUE
|
||||||
if self.htmlObj is not None:
|
HTML.htmleNBFailureMsg=htmleNBFailureMsg
|
||||||
self.htmlObj.htmleNBFailureMsg=htmleNBFailureMsg
|
|
||||||
# Runtime statistics for console output and HTML
|
# Runtime statistics for console output and HTML
|
||||||
if runTime != '':
|
if runTime != '':
|
||||||
logging.debug(runTime)
|
logging.debug(runTime)
|
||||||
|
|||||||
@@ -2200,7 +2200,7 @@ function run_test_on_vm {
|
|||||||
mkdir --parents $ARCHIVES_LOC
|
mkdir --parents $ARCHIVES_LOC
|
||||||
fi
|
fi
|
||||||
|
|
||||||
local try_cnt="0"
|
local try_cnt=0
|
||||||
NR_STATUS=0
|
NR_STATUS=0
|
||||||
|
|
||||||
######### start of RA TEST loop
|
######### start of RA TEST loop
|
||||||
@@ -2232,7 +2232,7 @@ function run_test_on_vm {
|
|||||||
scp -o StrictHostKeyChecking=no ubuntu@$GNB_VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_GNB_LOG_FILE $ARCHIVES_LOC
|
scp -o StrictHostKeyChecking=no ubuntu@$GNB_VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_GNB_LOG_FILE $ARCHIVES_LOC
|
||||||
scp -o StrictHostKeyChecking=no ubuntu@$NR_UE_VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_NR_UE_LOG_FILE $ARCHIVES_LOC
|
scp -o StrictHostKeyChecking=no ubuntu@$NR_UE_VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_NR_UE_LOG_FILE $ARCHIVES_LOC
|
||||||
SYNC_STATUS=-1
|
SYNC_STATUS=-1
|
||||||
try_cnt=$[$try_cnt+1]
|
try_cnt=$((try_cnt+1))
|
||||||
continue
|
continue
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -2255,9 +2255,10 @@ function run_test_on_vm {
|
|||||||
if [ $RA_STATUS -ne 0 ]
|
if [ $RA_STATUS -ne 0 ]
|
||||||
then
|
then
|
||||||
echo "RA test NOT OK"
|
echo "RA test NOT OK"
|
||||||
try_cnt=$[$try_cnt+1]
|
echo "try_cnt = " $try_cnt
|
||||||
|
try_cnt=$((try_cnt+1))
|
||||||
else
|
else
|
||||||
try_cnt=$[$try_cnt+10]
|
try_cnt=$((try_cnt+10))
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
########### end RA test
|
########### end RA test
|
||||||
@@ -2266,7 +2267,7 @@ function run_test_on_vm {
|
|||||||
|
|
||||||
|
|
||||||
######### start of PHY TEST loop
|
######### start of PHY TEST loop
|
||||||
try_cnt="0"
|
try_cnt=0
|
||||||
while [ $try_cnt -lt 4 ]
|
while [ $try_cnt -lt 4 ]
|
||||||
do
|
do
|
||||||
|
|
||||||
@@ -2297,7 +2298,7 @@ function run_test_on_vm {
|
|||||||
scp -o StrictHostKeyChecking=no ubuntu@$GNB_VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_GNB_LOG_FILE $ARCHIVES_LOC
|
scp -o StrictHostKeyChecking=no ubuntu@$GNB_VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_GNB_LOG_FILE $ARCHIVES_LOC
|
||||||
scp -o StrictHostKeyChecking=no ubuntu@$NR_UE_VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_NR_UE_LOG_FILE $ARCHIVES_LOC
|
scp -o StrictHostKeyChecking=no ubuntu@$NR_UE_VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_NR_UE_LOG_FILE $ARCHIVES_LOC
|
||||||
SYNC_STATUS=-1
|
SYNC_STATUS=-1
|
||||||
try_cnt=$[$try_cnt+1]
|
try_cnt=$((try_cnt+1))
|
||||||
continue
|
continue
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -2337,7 +2338,7 @@ function run_test_on_vm {
|
|||||||
terminate_enb_ue_basic_sim $GNB_VM_CMDS $GNB_VM_IP_ADDR 1
|
terminate_enb_ue_basic_sim $GNB_VM_CMDS $GNB_VM_IP_ADDR 1
|
||||||
scp -o StrictHostKeyChecking=no ubuntu@$GNB_VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_GNB_LOG_FILE $ARCHIVES_LOC
|
scp -o StrictHostKeyChecking=no ubuntu@$GNB_VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_GNB_LOG_FILE $ARCHIVES_LOC
|
||||||
scp -o StrictHostKeyChecking=no ubuntu@$NR_UE_VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_NR_UE_LOG_FILE $ARCHIVES_LOC
|
scp -o StrictHostKeyChecking=no ubuntu@$NR_UE_VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_NR_UE_LOG_FILE $ARCHIVES_LOC
|
||||||
try_cnt=$[$try_cnt+1]
|
try_cnt=$((try_cnt+1))
|
||||||
continue
|
continue
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -2363,9 +2364,9 @@ function run_test_on_vm {
|
|||||||
if [ $IPERF_STATUS -ne 0 ]
|
if [ $IPERF_STATUS -ne 0 ]
|
||||||
then
|
then
|
||||||
echo "UL test not OK"
|
echo "UL test not OK"
|
||||||
try_cnt=$[$try_cnt+1]
|
try_cnt=$((try_cnt+1))
|
||||||
else
|
else
|
||||||
try_cnt=$[$try_cnt+10]
|
try_cnt=$((try_cnt+10))
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
######### end of loop
|
######### end of loop
|
||||||
|
|||||||
@@ -21,7 +21,11 @@
|
|||||||
BEGIN{max=0;min=10000}
|
BEGIN{max=0;min=10000}
|
||||||
{
|
{
|
||||||
if ($0 ~/Mbits/) {
|
if ($0 ~/Mbits/) {
|
||||||
split($0,a,"MBytes")
|
if ($0 ~/KBytes/) {
|
||||||
|
split($0,a,"KBytes")
|
||||||
|
} else {
|
||||||
|
split($0,a,"MBytes")
|
||||||
|
}
|
||||||
split(a[2],b)
|
split(a[2],b)
|
||||||
if (b[1]>max) {
|
if (b[1]>max) {
|
||||||
max=b[1]
|
max=b[1]
|
||||||
|
|||||||
@@ -19,6 +19,8 @@
|
|||||||
- Reboot_UE
|
- Reboot_UE
|
||||||
- Initialize_FlexranCtrl
|
- Initialize_FlexranCtrl
|
||||||
- Terminate_FlexranCtrl
|
- Terminate_FlexranCtrl
|
||||||
|
- Deploy_EPC
|
||||||
|
- Undeploy_EPC
|
||||||
- Initialize_HSS
|
- Initialize_HSS
|
||||||
- Terminate_HSS
|
- Terminate_HSS
|
||||||
- Initialize_MME
|
- Initialize_MME
|
||||||
@@ -32,3 +34,6 @@
|
|||||||
- Ping_CatM_module
|
- Ping_CatM_module
|
||||||
- IdleSleep
|
- IdleSleep
|
||||||
- Perform_X2_Handover
|
- Perform_X2_Handover
|
||||||
|
- Build_Image
|
||||||
|
- Deploy_Object
|
||||||
|
- Undeploy_Object
|
||||||
|
|||||||
@@ -32,7 +32,7 @@
|
|||||||
<testCase id="090101">
|
<testCase id="090101">
|
||||||
<class>Build_OAI_UE</class>
|
<class>Build_OAI_UE</class>
|
||||||
<desc>Build OAI UE</desc>
|
<desc>Build OAI UE</desc>
|
||||||
<Build_OAI_UE_args>-w USRP --UE</Build_OAI_UE_args>
|
<Build_OAI_UE_args>-w USRP --UE --ninja</Build_OAI_UE_args>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
</testCaseList>
|
</testCaseList>
|
||||||
|
|||||||
@@ -0,0 +1,40 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.openairinterface.org/?page_id=698
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
contact@openairinterface.org
|
||||||
|
|
||||||
|
-->
|
||||||
|
<testCaseList>
|
||||||
|
<htmlTabRef>build-tab</htmlTabRef>
|
||||||
|
<htmlTabName>Build</htmlTabName>
|
||||||
|
<htmlTabIcon>wrench</htmlTabIcon>
|
||||||
|
<TestCaseRequestedList>
|
||||||
|
000001
|
||||||
|
</TestCaseRequestedList>
|
||||||
|
<TestCaseExclusionList></TestCaseExclusionList>
|
||||||
|
|
||||||
|
<testCase id="000001">
|
||||||
|
<class>Build_Image</class>
|
||||||
|
<desc>Build eNB Image</desc>
|
||||||
|
<kind>all</kind>
|
||||||
|
<eNB_instance>0</eNB_instance>
|
||||||
|
<eNB_serverId>0</eNB_serverId>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
</testCaseList>
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.openairinterface.org/?page_id=698
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
contact@openairinterface.org
|
||||||
|
|
||||||
|
-->
|
||||||
|
<testCaseList>
|
||||||
|
<htmlTabRef>epc-deploy-tab</htmlTabRef>
|
||||||
|
<htmlTabName>EPC-Deploy</htmlTabName>
|
||||||
|
<htmlTabIcon>log-in</htmlTabIcon>
|
||||||
|
<TestCaseRequestedList>
|
||||||
|
000100
|
||||||
|
</TestCaseRequestedList>
|
||||||
|
<TestCaseExclusionList>
|
||||||
|
</TestCaseExclusionList>
|
||||||
|
|
||||||
|
<testCase id="000100">
|
||||||
|
<class>Deploy_EPC</class>
|
||||||
|
<desc>Deploy all EPC containers</desc>
|
||||||
|
<parameters>yaml_files/fr1_epc_tim</parameters>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
</testCaseList>
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.openairinterface.org/?page_id=698
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
contact@openairinterface.org
|
||||||
|
|
||||||
|
-->
|
||||||
|
<testCaseList>
|
||||||
|
<htmlTabRef>epc-undeploy-tab</htmlTabRef>
|
||||||
|
<htmlTabName>EPC-Undeploy</htmlTabName>
|
||||||
|
<htmlTabIcon>log-out</htmlTabIcon>
|
||||||
|
<TestCaseRequestedList>
|
||||||
|
000200
|
||||||
|
</TestCaseRequestedList>
|
||||||
|
<TestCaseExclusionList>
|
||||||
|
</TestCaseExclusionList>
|
||||||
|
|
||||||
|
<testCase id="000200">
|
||||||
|
<class>Undeploy_EPC</class>
|
||||||
|
<desc>Undeploy all EPC containers</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
</testCaseList>
|
||||||
@@ -0,0 +1,150 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.openairinterface.org/?page_id=698
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
contact@openairinterface.org
|
||||||
|
|
||||||
|
-->
|
||||||
|
<testCaseList>
|
||||||
|
<htmlTabRef>TEST-FR1-TM1</htmlTabRef>
|
||||||
|
<htmlTabName>FR1</htmlTabName>
|
||||||
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
|
<TestCaseRequestedList>
|
||||||
|
010000
|
||||||
|
030000
|
||||||
|
040000
|
||||||
|
010001
|
||||||
|
000001
|
||||||
|
050000
|
||||||
|
050001
|
||||||
|
050002
|
||||||
|
050002
|
||||||
|
000001
|
||||||
|
060000
|
||||||
|
060001
|
||||||
|
000001
|
||||||
|
010002
|
||||||
|
000001
|
||||||
|
070001
|
||||||
|
070000
|
||||||
|
010003
|
||||||
|
</TestCaseRequestedList>
|
||||||
|
<TestCaseExclusionList></TestCaseExclusionList>
|
||||||
|
|
||||||
|
<testCase id="010000">
|
||||||
|
<class>Initialize_UE</class>
|
||||||
|
<desc>Initialize UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="010003">
|
||||||
|
<class>Terminate_UE</class>
|
||||||
|
<desc>Terminate UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="010001">
|
||||||
|
<class>Attach_UE</class>
|
||||||
|
<desc>Attach UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="010002">
|
||||||
|
<class>Detach_UE</class>
|
||||||
|
<desc>Detach UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
|
<testCase id="030000">
|
||||||
|
<class>Initialize_eNB</class>
|
||||||
|
<desc>Initialize eNB</desc>
|
||||||
|
<Initialize_eNB_args>-O ci-scripts/conf_files/enb.band7.tm1.fr1.25PRB.usrpb210.conf</Initialize_eNB_args>
|
||||||
|
<eNB_instance>0</eNB_instance>
|
||||||
|
<eNB_serverId>0</eNB_serverId>
|
||||||
|
<air_interface>lte</air_interface>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
|
<testCase id="040000">
|
||||||
|
<class>Initialize_eNB</class>
|
||||||
|
<desc>Initialize gNB</desc>
|
||||||
|
<Initialize_eNB_args>-O ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpb210.conf -E</Initialize_eNB_args>
|
||||||
|
<eNB_instance>1</eNB_instance>
|
||||||
|
<eNB_serverId>1</eNB_serverId>
|
||||||
|
<air_interface>nr</air_interface>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="000001">
|
||||||
|
<class>IdleSleep</class>
|
||||||
|
<desc>Sleep</desc>
|
||||||
|
<idle_sleep_time_in_sec>20</idle_sleep_time_in_sec>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="050000">
|
||||||
|
<class>Ping</class>
|
||||||
|
<desc>Ping: 20pings in 20sec</desc>
|
||||||
|
<ping_args>-c 20</ping_args>
|
||||||
|
<ping_packetloss_threshold>50</ping_packetloss_threshold>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="050001">
|
||||||
|
<class>Ping</class>
|
||||||
|
<desc>Ping: 5pings in 1sec</desc>
|
||||||
|
<ping_args>-c 5 -i 0.2</ping_args>
|
||||||
|
<ping_packetloss_threshold>50</ping_packetloss_threshold>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="050002">
|
||||||
|
<class>Ping</class>
|
||||||
|
<desc>Ping: 100pings in 20sec</desc>
|
||||||
|
<ping_args>-c 100 -i 0.2</ping_args>
|
||||||
|
<ping_packetloss_threshold>50</ping_packetloss_threshold>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
|
<testCase id="060000">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (DL/1Mbps/UDP)(30 sec)(single-ue profile)</desc>
|
||||||
|
<iperf_args>-u -b 1M -t 30 -i 1</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="060001">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (UL/1Mbps/UDP)(30 sec)(single-ue profile)</desc>
|
||||||
|
<iperf_args>-u -b 1M -t 30 -i 1 -R</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="070000">
|
||||||
|
<class>Terminate_eNB</class>
|
||||||
|
<desc>Terminate eNB</desc>
|
||||||
|
<eNB_instance>0</eNB_instance>
|
||||||
|
<eNB_serverId>0</eNB_serverId>
|
||||||
|
<air_interface>lte</air_interface>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="070001">
|
||||||
|
<class>Terminate_eNB</class>
|
||||||
|
<desc>Terminate gNB</desc>
|
||||||
|
<eNB_instance>1</eNB_instance>
|
||||||
|
<eNB_serverId>1</eNB_serverId>
|
||||||
|
<air_interface>nr</air_interface>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
</testCaseList>
|
||||||
|
|
||||||
+21
-7
@@ -31,10 +31,14 @@
|
|||||||
010001
|
010001
|
||||||
000001
|
000001
|
||||||
050000
|
050000
|
||||||
050001
|
000001
|
||||||
|
060000
|
||||||
|
060001
|
||||||
|
000001
|
||||||
|
010002
|
||||||
|
000001
|
||||||
070001
|
070001
|
||||||
070000
|
070000
|
||||||
010002
|
|
||||||
010003
|
010003
|
||||||
</TestCaseRequestedList>
|
</TestCaseRequestedList>
|
||||||
<TestCaseExclusionList></TestCaseExclusionList>
|
<TestCaseExclusionList></TestCaseExclusionList>
|
||||||
@@ -92,11 +96,21 @@
|
|||||||
<ping_packetloss_threshold>50</ping_packetloss_threshold>
|
<ping_packetloss_threshold>50</ping_packetloss_threshold>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
<testCase id="050001">
|
|
||||||
<class>Ping</class>
|
<testCase id="060000">
|
||||||
<desc>Ping: 5pings in 1sec</desc>
|
<class>Iperf</class>
|
||||||
<ping_args>-c 5 -i 0.2</ping_args>
|
<desc>iperf (DL/2.5Mbps/UDP)(60 sec)(single-ue profile)</desc>
|
||||||
<ping_packetloss_threshold>50</ping_packetloss_threshold>
|
<iperf_args>-u -b 2.5M -t 60 -i 1</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="060001">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (UL/1.5Mbps/UDP)(60 sec)(single-ue profile)</desc>
|
||||||
|
<iperf_args>-u -b 1.5M -t 60 -i 1 -R</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
<testCase id="070000">
|
<testCase id="070000">
|
||||||
@@ -0,0 +1,133 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.openairinterface.org/?page_id=698
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
contact@openairinterface.org
|
||||||
|
|
||||||
|
-->
|
||||||
|
<testCaseList>
|
||||||
|
<htmlTabRef>test-deploy-enb-mono</htmlTabRef>
|
||||||
|
<htmlTabName>Test-Deploy-eNB-Mono</htmlTabName>
|
||||||
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
|
<repeatCount>1</repeatCount>
|
||||||
|
<TestCaseRequestedList>
|
||||||
|
040101
|
||||||
|
030101 000020 040301 000021 040501 040601 040611 040641 040651 040401 040201 030201
|
||||||
|
</TestCaseRequestedList>
|
||||||
|
<TestCaseExclusionList></TestCaseExclusionList>
|
||||||
|
|
||||||
|
<testCase id="000001">
|
||||||
|
<class>IdleSleep</class>
|
||||||
|
<desc>Waiting for 60 seconds</desc>
|
||||||
|
<idle_sleep_time_in_sec>60</idle_sleep_time_in_sec>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="000002">
|
||||||
|
<class>IdleSleep</class>
|
||||||
|
<desc>Waiting for 10 seconds</desc>
|
||||||
|
<idle_sleep_time_in_sec>10</idle_sleep_time_in_sec>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="000020">
|
||||||
|
<class>CheckStatusUE</class>
|
||||||
|
<desc>Check UE(s) status before attachment</desc>
|
||||||
|
<expectedNbOfConnectedUEs>0</expectedNbOfConnectedUEs>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="000021">
|
||||||
|
<class>CheckStatusUE</class>
|
||||||
|
<desc>Check UE(s) status after attachment</desc>
|
||||||
|
<expectedNbOfConnectedUEs>1</expectedNbOfConnectedUEs>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030101">
|
||||||
|
<class>Deploy_Object</class>
|
||||||
|
<desc>Deploy eNB (FDD/Band7/5MHz) in a container</desc>
|
||||||
|
<yaml_path>ci-scripts/yaml_files/fr1_enb_mono_fdd_tim</yaml_path>
|
||||||
|
<eNB_instance>0</eNB_instance>
|
||||||
|
<eNB_serverId>0</eNB_serverId>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030201">
|
||||||
|
<class>Undeploy_Object</class>
|
||||||
|
<desc>Undeploy eNB</desc>
|
||||||
|
<yaml_path>ci-scripts/yaml_files/fr1_enb_mono_fdd_tim</yaml_path>
|
||||||
|
<eNB_instance>0</eNB_instance>
|
||||||
|
<eNB_serverId>0</eNB_serverId>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040101">
|
||||||
|
<class>Initialize_UE</class>
|
||||||
|
<desc>Initialize UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040201">
|
||||||
|
<class>Terminate_UE</class>
|
||||||
|
<desc>Terminate UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040301">
|
||||||
|
<class>Attach_UE</class>
|
||||||
|
<desc>Attach UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040401">
|
||||||
|
<class>Detach_UE</class>
|
||||||
|
<desc>Detach UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040501">
|
||||||
|
<class>Ping</class>
|
||||||
|
<desc>ping (5MHz - 20 sec)</desc>
|
||||||
|
<ping_args>-c 20</ping_args>
|
||||||
|
<ping_packetloss_threshold>5</ping_packetloss_threshold>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040601">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (5MHz - DL/15Mbps/UDP)(30 sec)</desc>
|
||||||
|
<iperf_args>-u -b 15M -t 30 -i 1</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040611">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (5MHz - DL/TCP)(30 sec)</desc>
|
||||||
|
<iperf_args>-t 30 -i 1</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040641">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (5MHz - UL/7.5Mbps/UDP)(30 sec)</desc>
|
||||||
|
<iperf_args>-u -b 7.5M -t 30 -i 1 -R</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040651">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (5MHz - UL/TCP)(30 sec)</desc>
|
||||||
|
<iperf_args>-t 30 -i 1 -R</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
</testCaseList>
|
||||||
@@ -52,7 +52,7 @@
|
|||||||
<testCase id="090102">
|
<testCase id="090102">
|
||||||
<class>Initialize_OAI_UE</class>
|
<class>Initialize_OAI_UE</class>
|
||||||
<desc>Initialize NR UE USRP</desc>
|
<desc>Initialize NR UE USRP</desc>
|
||||||
<Initialize_OAI_UE_args>--phy-test --usrp-args "addr=192.168.30.2,second_addr=192.168.50.2,clock_source=external,time_source=external" --ue-rxgain 75 --threadoffset 16 --rrc_config_path .</Initialize_OAI_UE_args>
|
<Initialize_OAI_UE_args>--phy-test --usrp-args "addr=192.168.30.2,second_addr=192.168.50.2,clock_source=external,time_source=external" --ue-rxgain 75 --rrc_config_path .</Initialize_OAI_UE_args>
|
||||||
<air_interface>NR</air_interface>
|
<air_interface>NR</air_interface>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
|
|||||||
@@ -52,7 +52,7 @@
|
|||||||
<testCase id="090104">
|
<testCase id="090104">
|
||||||
<class>Initialize_OAI_UE</class>
|
<class>Initialize_OAI_UE</class>
|
||||||
<desc>Initialize NR UE USRP</desc>
|
<desc>Initialize NR UE USRP</desc>
|
||||||
<Initialize_OAI_UE_args>--phy-test --usrp-args "addr=192.168.30.2,second_addr=192.168.50.2,clock_source=external,time_source=external" --ue-rxgain 75 --threadoffset 16 --rrc_config_path .</Initialize_OAI_UE_args>
|
<Initialize_OAI_UE_args>--phy-test --usrp-args "addr=192.168.30.2,second_addr=192.168.50.2,clock_source=external,time_source=external" --ue-rxgain 75 --rrc_config_path .</Initialize_OAI_UE_args>
|
||||||
<air_interface>NR</air_interface>
|
<air_interface>NR</air_interface>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
|
|||||||
@@ -32,7 +32,7 @@
|
|||||||
<testCase id="090101">
|
<testCase id="090101">
|
||||||
<class>Build_OAI_UE</class>
|
<class>Build_OAI_UE</class>
|
||||||
<desc>Build OAI UE</desc>
|
<desc>Build OAI UE</desc>
|
||||||
<Build_OAI_UE_args>-w USRP --UE</Build_OAI_UE_args>
|
<Build_OAI_UE_args>-w USRP --UE --ninja</Build_OAI_UE_args>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
</testCaseList>
|
</testCaseList>
|
||||||
|
|||||||
@@ -0,0 +1,49 @@
|
|||||||
|
version: '3.8'
|
||||||
|
|
||||||
|
services:
|
||||||
|
enb_mono_fdd:
|
||||||
|
image: oai-enb:latest
|
||||||
|
privileged: true
|
||||||
|
container_name: prod-enb-mono-fdd
|
||||||
|
environment:
|
||||||
|
USE_FDD_MONO: 'yes'
|
||||||
|
USE_B2XX: 'yes'
|
||||||
|
ENB_NAME: eNB-in-docker
|
||||||
|
MCC: '222'
|
||||||
|
MNC: '01'
|
||||||
|
MNC_LENGTH: 2
|
||||||
|
TAC: 1
|
||||||
|
UTRA_BAND_ID: 7
|
||||||
|
DL_FREQUENCY_IN_MHZ: 2680
|
||||||
|
UL_FREQUENCY_OFFSET_IN_MHZ: 120
|
||||||
|
NID_CELL: 10
|
||||||
|
NB_PRB: 25
|
||||||
|
MME_S1C_IP_ADDRESS: CI_MME_IP_ADDR
|
||||||
|
ENB_S1C_IF_NAME: eth0
|
||||||
|
ENB_S1C_IP_ADDRESS: 192.168.61.30
|
||||||
|
ENB_S1U_IF_NAME: eth0
|
||||||
|
ENB_S1U_IP_ADDRESS: 192.168.61.30
|
||||||
|
ENB_X2_IP_ADDRESS: 192.168.61.30
|
||||||
|
FLEXRAN_ENABLED: 'no'
|
||||||
|
FLEXRAN_INTERFACE_NAME: eth0
|
||||||
|
FLEXRAN_IPV4_ADDRESS: CI_FLEXRAN_CTL_IP_ADDR
|
||||||
|
USE_ADDITIONAL_OPTIONS: '--RUs.[0].max_rxgain 115 --RUs.[0].max_pdschReferenceSignalPower -27 --eNBs.[0].component_carriers.[0].pucch_p0_Nominal -96'
|
||||||
|
volumes:
|
||||||
|
- /dev:/dev
|
||||||
|
networks:
|
||||||
|
public_net:
|
||||||
|
ipv4_address: 192.168.61.30
|
||||||
|
healthcheck:
|
||||||
|
# pgrep does NOT work
|
||||||
|
test: /bin/bash -c "ps aux | grep -v grep | grep -c softmodem"
|
||||||
|
interval: 10s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 5
|
||||||
|
|
||||||
|
networks:
|
||||||
|
public_net:
|
||||||
|
name: prod-oai-public-net
|
||||||
|
ipam:
|
||||||
|
config:
|
||||||
|
- subnet: 192.168.61.0/26
|
||||||
|
|
||||||
@@ -0,0 +1,203 @@
|
|||||||
|
version: '3.8'
|
||||||
|
|
||||||
|
services:
|
||||||
|
cassandra:
|
||||||
|
image: cassandra:2.1
|
||||||
|
container_name: prod-cassandra
|
||||||
|
networks:
|
||||||
|
private_net:
|
||||||
|
ipv4_address: 192.168.68.2
|
||||||
|
environment:
|
||||||
|
CASSANDRA_CLUSTER_NAME: "OAI HSS Cluster"
|
||||||
|
CASSANDRA_ENDPOINT_SNITCH: GossipingPropertyFileSnitch
|
||||||
|
healthcheck:
|
||||||
|
test: /bin/bash -c "nodetool status"
|
||||||
|
interval: 10s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 5
|
||||||
|
|
||||||
|
db_init:
|
||||||
|
image: cassandra:2.1
|
||||||
|
container_name: prod-db-init
|
||||||
|
depends_on: [cassandra]
|
||||||
|
deploy:
|
||||||
|
restart_policy:
|
||||||
|
condition: on-failure
|
||||||
|
max_attempts: 10
|
||||||
|
networks:
|
||||||
|
private_net:
|
||||||
|
ipv4_address: 192.168.68.4
|
||||||
|
volumes:
|
||||||
|
- ./oai_db.cql:/home/oai_db.cql
|
||||||
|
entrypoint: /bin/bash -c "cqlsh --file /home/oai_db.cql 192.168.68.2 && echo 'OK'"
|
||||||
|
|
||||||
|
oai_hss:
|
||||||
|
image: oai-hss:production
|
||||||
|
container_name: prod-oai-hss
|
||||||
|
privileged: true
|
||||||
|
depends_on: [cassandra]
|
||||||
|
networks:
|
||||||
|
private_net:
|
||||||
|
ipv4_address: 192.168.68.3
|
||||||
|
public_net:
|
||||||
|
ipv4_address: 192.168.61.2
|
||||||
|
environment:
|
||||||
|
REALM: openairinterface.org
|
||||||
|
HSS_FQDN: hss.openairinterface.org
|
||||||
|
PREFIX: /openair-hss/etc
|
||||||
|
cassandra_Server_IP: 192.168.68.2
|
||||||
|
OP_KEY: 1006020f0a478bf6b699f15c062e42b3
|
||||||
|
LTE_K: fec86ba6eb707ed08905757b1bb44b8f
|
||||||
|
APN1: oai.ipv4
|
||||||
|
APN2: internet
|
||||||
|
FIRST_IMSI: 222010100001120
|
||||||
|
NB_USERS: 10
|
||||||
|
healthcheck:
|
||||||
|
test: /bin/bash -c "pgrep oai_hss"
|
||||||
|
interval: 10s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 5
|
||||||
|
|
||||||
|
oai_mme:
|
||||||
|
image: oai-mme:production
|
||||||
|
container_name: prod-oai-mme
|
||||||
|
privileged: true
|
||||||
|
depends_on: [oai_hss]
|
||||||
|
networks:
|
||||||
|
public_net:
|
||||||
|
ipv4_address: 192.168.61.3
|
||||||
|
environment:
|
||||||
|
REALM: openairinterface.org
|
||||||
|
PREFIX: /openair-mme/etc
|
||||||
|
INSTANCE: 1
|
||||||
|
PID_DIRECTORY: /var/run
|
||||||
|
HSS_IP_ADDR: 192.168.61.2
|
||||||
|
HSS_HOSTNAME: hss
|
||||||
|
HSS_FQDN: hss.openairinterface.org
|
||||||
|
HSS_REALM: openairinterface.org
|
||||||
|
MCC: '222'
|
||||||
|
MNC: '01'
|
||||||
|
MME_GID: 32768
|
||||||
|
MME_CODE: 3
|
||||||
|
TAC_0: 1
|
||||||
|
TAC_1: 2
|
||||||
|
TAC_2: 3
|
||||||
|
MME_FQDN: mme.openairinterface.org
|
||||||
|
MME_S6A_IP_ADDR: 192.168.61.3
|
||||||
|
MME_INTERFACE_NAME_FOR_S1_MME: eth0
|
||||||
|
MME_IPV4_ADDRESS_FOR_S1_MME: 192.168.61.3
|
||||||
|
MME_INTERFACE_NAME_FOR_S11: eth0
|
||||||
|
MME_IPV4_ADDRESS_FOR_S11: 192.168.61.3
|
||||||
|
MME_INTERFACE_NAME_FOR_S10: lo
|
||||||
|
MME_IPV4_ADDRESS_FOR_S10: 127.0.0.10
|
||||||
|
OUTPUT: CONSOLE
|
||||||
|
SGW_IPV4_ADDRESS_FOR_S11_0: 192.168.61.4
|
||||||
|
PEER_MME_IPV4_ADDRESS_FOR_S10_0: 0.0.0.0
|
||||||
|
PEER_MME_IPV4_ADDRESS_FOR_S10_1: 0.0.0.0
|
||||||
|
MCC_SGW_0: '222'
|
||||||
|
MNC3_SGW_0: '001'
|
||||||
|
TAC_LB_SGW_0: '01'
|
||||||
|
TAC_HB_SGW_0: '00'
|
||||||
|
MCC_MME_0: '222'
|
||||||
|
MNC3_MME_0: '001'
|
||||||
|
TAC_LB_MME_0: '02'
|
||||||
|
TAC_HB_MME_0: '00'
|
||||||
|
MCC_MME_1: '222'
|
||||||
|
MNC3_MME_1: '001'
|
||||||
|
TAC_LB_MME_1: '03'
|
||||||
|
TAC_HB_MME_1: '00'
|
||||||
|
TAC_LB_SGW_TEST_0: '03'
|
||||||
|
TAC_HB_SGW_TEST_0: '00'
|
||||||
|
SGW_IPV4_ADDRESS_FOR_S11_TEST_0: 0.0.0.0
|
||||||
|
healthcheck:
|
||||||
|
test: /bin/bash -c "pgrep oai_mme"
|
||||||
|
interval: 10s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 5
|
||||||
|
|
||||||
|
oai_spgwc:
|
||||||
|
image: oai-spgwc:production
|
||||||
|
privileged: true
|
||||||
|
depends_on: [oai_mme]
|
||||||
|
container_name: prod-oai-spgwc
|
||||||
|
networks:
|
||||||
|
public_net:
|
||||||
|
ipv4_address: 192.168.61.4
|
||||||
|
environment:
|
||||||
|
PID_DIRECTORY: /var/run
|
||||||
|
SGW_INTERFACE_NAME_FOR_S11: eth0
|
||||||
|
SGW_IP_FOR_S5_S8_CP: 127.0.0.11/8
|
||||||
|
PGW_IP_FOR_S5_S8_CP: 127.0.0.12/8
|
||||||
|
PGW_INTERFACE_NAME_FOR_SX: eth0
|
||||||
|
DEFAULT_APN: oai.ipv4
|
||||||
|
DEFAULT_DNS_IPV4_ADDRESS: 192.168.18.129
|
||||||
|
DEFAULT_DNS_SEC_IPV4_ADDRESS: 8.8.4.4
|
||||||
|
UE_IP_ADDRESS_POOL: '12.1.1.2 - 12.1.1.254'
|
||||||
|
PUSH_PROTOCOL_OPTION: 'yes'
|
||||||
|
healthcheck:
|
||||||
|
test: /bin/bash -c "pgrep oai_spgwc"
|
||||||
|
interval: 10s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 5
|
||||||
|
|
||||||
|
oai_spgwu:
|
||||||
|
image: oai-spgwu-tiny:production
|
||||||
|
privileged: true
|
||||||
|
container_name: prod-oai-spgwu-tiny
|
||||||
|
depends_on: [oai_spgwc]
|
||||||
|
networks:
|
||||||
|
public_net:
|
||||||
|
ipv4_address: 192.168.61.5
|
||||||
|
environment:
|
||||||
|
PID_DIRECTORY: /var/run
|
||||||
|
INSTANCE: 1
|
||||||
|
SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP: eth0
|
||||||
|
PGW_INTERFACE_NAME_FOR_SGI: eth0
|
||||||
|
SGW_INTERFACE_NAME_FOR_SX: eth0
|
||||||
|
SPGWC0_IP_ADDRESS: 192.168.61.4
|
||||||
|
NETWORK_UE_IP: '12.1.1.0/24'
|
||||||
|
NETWORK_UE_NAT_OPTION: 'yes'
|
||||||
|
healthcheck:
|
||||||
|
test: /bin/bash -c "pgrep oai_spgwu"
|
||||||
|
interval: 10s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 5
|
||||||
|
|
||||||
|
flexran_rtc:
|
||||||
|
image: flexran-rtc:production
|
||||||
|
privileged: true
|
||||||
|
container_name: prod-flexran-rtc
|
||||||
|
networks:
|
||||||
|
public_net:
|
||||||
|
ipv4_address: 192.168.61.10
|
||||||
|
healthcheck:
|
||||||
|
test: /bin/bash -c "pgrep rt_controller"
|
||||||
|
interval: 10s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 5
|
||||||
|
|
||||||
|
trf_gen:
|
||||||
|
image: trf-gen:production
|
||||||
|
privileged: true
|
||||||
|
container_name: prod-trf-gen
|
||||||
|
networks:
|
||||||
|
public_net:
|
||||||
|
ipv4_address: 192.168.61.11
|
||||||
|
entrypoint: /bin/bash -c "ip route add 12.1.1.0/24 via 192.168.61.5 dev eth0; sleep infinity"
|
||||||
|
healthcheck:
|
||||||
|
test: /bin/bash -c "ping -c 2 192.168.61.5"
|
||||||
|
interval: 10s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 5
|
||||||
|
|
||||||
|
networks:
|
||||||
|
private_net:
|
||||||
|
name: prod-oai-private-net
|
||||||
|
ipam:
|
||||||
|
config:
|
||||||
|
- subnet: 192.168.68.0/26
|
||||||
|
public_net:
|
||||||
|
name: prod-oai-public-net
|
||||||
|
ipam:
|
||||||
|
config:
|
||||||
|
- subnet: 192.168.61.0/26
|
||||||
@@ -463,9 +463,9 @@ include_directories ("${RRC_FULL_DIR}")
|
|||||||
|
|
||||||
#NR RRC
|
#NR RRC
|
||||||
#######
|
#######
|
||||||
set (NR_RRC_ASN1_VERSION "NR_Rel15" )
|
set (NR_RRC_ASN1_VERSION "NR_Rel16" )
|
||||||
make_version(NR_RRC_VERSION 15 6 0)
|
make_version(NR_RRC_VERSION 16 1 0)
|
||||||
set (NR_RRC_GRAMMAR ${OPENAIR2_DIR}/RRC/NR/MESSAGES/asn1c/ASN1_files/nr-rrc-15.6.0.asn1)
|
set (NR_RRC_GRAMMAR ${OPENAIR2_DIR}/RRC/NR/MESSAGES/asn1c/ASN1_files/nr-rrc-16.1.0.asn1)
|
||||||
add_definitions(-DNR_RRC_VERSION=${NR_RRC_VERSION})
|
add_definitions(-DNR_RRC_VERSION=${NR_RRC_VERSION})
|
||||||
set (NR_RRC_FULL_DIR ${asn1_generated_dir}/RRC_${NR_RRC_ASN1_VERSION})
|
set (NR_RRC_FULL_DIR ${asn1_generated_dir}/RRC_${NR_RRC_ASN1_VERSION})
|
||||||
|
|
||||||
@@ -544,6 +544,59 @@ add_library(S1AP_ENB
|
|||||||
add_dependencies(S1AP_ENB rrc_flag s1ap_flag)
|
add_dependencies(S1AP_ENB rrc_flag s1ap_flag)
|
||||||
|
|
||||||
|
|
||||||
|
# NGAP
|
||||||
|
# Same limitation as described in RRC: unknown generated file list
|
||||||
|
# so we generate it at cmake time
|
||||||
|
##############
|
||||||
|
set (NGAP_RELEASE R15)
|
||||||
|
|
||||||
|
set(NGAP_DIR ${OPENAIR3_DIR}/NGAP)
|
||||||
|
make_version(NGAP_VERSION 15 8 0)
|
||||||
|
set(NGAP_ASN_FILES "ngap-15.8.0.asn1")
|
||||||
|
|
||||||
|
add_definitions(-DNGAP_VERSION=${NGAP_VERSION})
|
||||||
|
set(NGAP_ASN_DIR ${NGAP_DIR}/MESSAGES/ASN1/ASN1_files)
|
||||||
|
set(NGAP_C_DIR ${asn1_generated_dir}/NGAP_${NGAP_RELEASE})
|
||||||
|
|
||||||
|
# Warning: if you modify ASN.1 source file to generate new C files, cmake should be re-run instead of make
|
||||||
|
execute_process(COMMAND ${OPENAIR_CMAKE}/tools/make_asn1c_includes.sh "${NGAP_C_DIR}" "${NGAP_ASN_DIR}/${NGAP_ASN_FILES}" "NGAP_" -fno-include-deps -findirect-choice
|
||||||
|
RESULT_VARIABLE ret)
|
||||||
|
if (NOT ${ret} STREQUAL 0)
|
||||||
|
message(FATAL_ERROR "${ret}: error")
|
||||||
|
endif (NOT ${ret} STREQUAL 0)
|
||||||
|
file(GLOB NGAP_source ${NGAP_C_DIR}/*.c)
|
||||||
|
|
||||||
|
add_custom_target (
|
||||||
|
ngap_flag ALL
|
||||||
|
${OPENAIR_CMAKE}/tools/make_asn1c_includes.sh "${NGAP_C_DIR}" "${NGAP_ASN_DIR}/${NGAP_ASN_FILES}" "NGAP_" -fno-include-deps
|
||||||
|
DEPENDS "${NGAP_ASN_DIR}/${NGAP_ASN_FILES}"
|
||||||
|
)
|
||||||
|
|
||||||
|
add_library(NGAP_LIB
|
||||||
|
${NGAP_source}
|
||||||
|
# ${NGAP_DIR}/ngap_common.c
|
||||||
|
)
|
||||||
|
add_dependencies(NGAP_LIB rrc_flag ngap_flag)
|
||||||
|
|
||||||
|
include_directories ("${NGAP_C_DIR}")
|
||||||
|
include_directories ("${NGAP_DIR}")
|
||||||
|
|
||||||
|
add_library(NGAP_GNB
|
||||||
|
${NGAP_DIR}/ngap_gNB.c
|
||||||
|
${NGAP_DIR}/ngap_gNB_context_management_procedures.c
|
||||||
|
${NGAP_DIR}/ngap_gNB_decoder.c
|
||||||
|
${NGAP_DIR}/ngap_gNB_encoder.c
|
||||||
|
${NGAP_DIR}/ngap_gNB_handlers.c
|
||||||
|
${NGAP_DIR}/ngap_gNB_itti_messaging.c
|
||||||
|
${NGAP_DIR}/ngap_gNB_management_procedures.c
|
||||||
|
${NGAP_DIR}/ngap_gNB_nas_procedures.c
|
||||||
|
${NGAP_DIR}/ngap_gNB_nnsf.c
|
||||||
|
${NGAP_DIR}/ngap_gNB_overload.c
|
||||||
|
${NGAP_DIR}/ngap_gNB_trace.c
|
||||||
|
${NGAP_DIR}/ngap_gNB_ue_context.c
|
||||||
|
)
|
||||||
|
add_dependencies(NGAP_GNB rrc_flag ngap_flag)
|
||||||
|
|
||||||
#M2AP
|
#M2AP
|
||||||
# Same limitation as described in RRC/S1AP: unknown generated file list
|
# Same limitation as described in RRC/S1AP: unknown generated file list
|
||||||
# so we generate it at cmake time
|
# so we generate it at cmake time
|
||||||
@@ -933,6 +986,8 @@ add_boolean_option(MESSAGE_CHART_GENERATOR_PHY False "trace some PHY exchang
|
|||||||
add_boolean_option(UE_EXPANSION False "enable UE_EXPANSION with max 256 UE")
|
add_boolean_option(UE_EXPANSION False "enable UE_EXPANSION with max 256 UE")
|
||||||
add_boolean_option(PHY_TX_THREAD False "enable UE_EXPANSION with max 256 UE")
|
add_boolean_option(PHY_TX_THREAD False "enable UE_EXPANSION with max 256 UE")
|
||||||
add_boolean_option(PRE_SCD_THREAD False "enable UE_EXPANSION with max 256 UE")
|
add_boolean_option(PRE_SCD_THREAD False "enable UE_EXPANSION with max 256 UE")
|
||||||
|
add_boolean_option(UESIM_EXPANSION False "enable UESIM_EXPANSION with max 256 UE")
|
||||||
|
add_boolean_option(ITTI_SIM False "enable itti simulator")
|
||||||
|
|
||||||
########################
|
########################
|
||||||
# Include order
|
# Include order
|
||||||
@@ -1913,6 +1968,7 @@ set(NR_PDCP_SRC
|
|||||||
${OPENAIR2_DIR}/LAYER2/nr_pdcp/nr_pdcp_ue_manager.c
|
${OPENAIR2_DIR}/LAYER2/nr_pdcp/nr_pdcp_ue_manager.c
|
||||||
${OPENAIR2_DIR}/LAYER2/nr_pdcp/nr_pdcp_entity.c
|
${OPENAIR2_DIR}/LAYER2/nr_pdcp/nr_pdcp_entity.c
|
||||||
${OPENAIR2_DIR}/LAYER2/nr_pdcp/nr_pdcp_entity_drb_am.c
|
${OPENAIR2_DIR}/LAYER2/nr_pdcp/nr_pdcp_entity_drb_am.c
|
||||||
|
${OPENAIR2_DIR}/LAYER2/nr_pdcp/asn1_utils.c
|
||||||
)
|
)
|
||||||
|
|
||||||
set(L2_SRC
|
set(L2_SRC
|
||||||
@@ -1965,6 +2021,7 @@ set(L2_NR_SRC
|
|||||||
${NR_RRC_DIR}/rrc_gNB_internode.c
|
${NR_RRC_DIR}/rrc_gNB_internode.c
|
||||||
${NR_RRC_DIR}/rrc_gNB_reconfig.c
|
${NR_RRC_DIR}/rrc_gNB_reconfig.c
|
||||||
${NR_RRC_DIR}/rrc_gNB_UE_context.c
|
${NR_RRC_DIR}/rrc_gNB_UE_context.c
|
||||||
|
${NR_RRC_DIR}/rrc_gNB_NGAP.c
|
||||||
)
|
)
|
||||||
|
|
||||||
set(L2_SRC_UE
|
set(L2_SRC_UE
|
||||||
@@ -2031,6 +2088,7 @@ set (MAC_NR_SRC
|
|||||||
${NR_GNB_MAC_DIR}/gNB_scheduler_ulsch.c
|
${NR_GNB_MAC_DIR}/gNB_scheduler_ulsch.c
|
||||||
${NR_GNB_MAC_DIR}/gNB_scheduler_primitives.c
|
${NR_GNB_MAC_DIR}/gNB_scheduler_primitives.c
|
||||||
${NR_GNB_MAC_DIR}/gNB_scheduler_phytest.c
|
${NR_GNB_MAC_DIR}/gNB_scheduler_phytest.c
|
||||||
|
${NR_GNB_MAC_DIR}/gNB_scheduler_uci.c
|
||||||
${NR_GNB_MAC_DIR}/gNB_scheduler_RA.c
|
${NR_GNB_MAC_DIR}/gNB_scheduler_RA.c
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -2455,6 +2513,124 @@ if(NAS_UE)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
||||||
|
if(ITTI_SIM)
|
||||||
|
set(libnas_ue_api_OBJS
|
||||||
|
${NAS_SRC}UE/API/USER/at_command.c
|
||||||
|
${NAS_SRC}UE/API/USER/at_error.c
|
||||||
|
${NAS_SRC}UE/API/USER/at_response.c
|
||||||
|
${NAS_SRC}UE/API/USER/user_api.c
|
||||||
|
${NAS_SRC}UE/API/USER/user_indication.c
|
||||||
|
${NAS_SRC}UE/API/USIM/aka_functions.c
|
||||||
|
${NAS_SRC}UE/API/USIM/usim_api.c
|
||||||
|
)
|
||||||
|
set(libnas_ue_emm_OBJS
|
||||||
|
${NAS_SRC}UE/EMM/Attach.c
|
||||||
|
${NAS_SRC}UE/EMM/Authentication.c
|
||||||
|
${NAS_SRC}UE/EMM/Detach.c
|
||||||
|
${NAS_SRC}UE/EMM/emm_main.c
|
||||||
|
${NAS_SRC}UE/EMM/EmmStatusHdl.c
|
||||||
|
${NAS_SRC}UE/EMM/Identification.c
|
||||||
|
${NAS_SRC}UE/EMM/IdleMode.c
|
||||||
|
${NAS_SRC}UE/EMM/LowerLayer.c
|
||||||
|
${NAS_SRC}UE/EMM/SecurityModeControl.c
|
||||||
|
${NAS_SRC}UE/EMM/ServiceRequestHdl.c
|
||||||
|
${NAS_SRC}UE/EMM/TrackingAreaUpdate.c
|
||||||
|
)
|
||||||
|
set(libnas_ue_emm_sap_OBJS
|
||||||
|
${NAS_SRC}UE/EMM/SAP/emm_as.c
|
||||||
|
${NAS_SRC}UE/EMM/SAP/EmmDeregisteredAttachNeeded.c
|
||||||
|
${NAS_SRC}UE/EMM/SAP/EmmDeregisteredAttemptingToAttach.c
|
||||||
|
${NAS_SRC}UE/EMM/SAP/EmmDeregistered.c
|
||||||
|
${NAS_SRC}UE/EMM/SAP/EmmDeregisteredInitiated.c
|
||||||
|
${NAS_SRC}UE/EMM/SAP/EmmDeregisteredLimitedService.c
|
||||||
|
${NAS_SRC}UE/EMM/SAP/EmmDeregisteredNoCellAvailable.c
|
||||||
|
${NAS_SRC}UE/EMM/SAP/EmmDeregisteredNoImsi.c
|
||||||
|
${NAS_SRC}UE/EMM/SAP/EmmDeregisteredNormalService.c
|
||||||
|
${NAS_SRC}UE/EMM/SAP/EmmDeregisteredPlmnSearch.c
|
||||||
|
${NAS_SRC}UE/EMM/SAP/emm_esm.c
|
||||||
|
${NAS_SRC}UE/EMM/SAP/emm_fsm.c
|
||||||
|
${NAS_SRC}UE/EMM/SAP/EmmNull.c
|
||||||
|
${NAS_SRC}UE/EMM/SAP/emm_recv.c
|
||||||
|
${NAS_SRC}UE/EMM/SAP/emm_reg.c
|
||||||
|
${NAS_SRC}UE/EMM/SAP/EmmRegisteredAttemptingToUpdate.c
|
||||||
|
${NAS_SRC}UE/EMM/SAP/EmmRegistered.c
|
||||||
|
${NAS_SRC}UE/EMM/SAP/EmmRegisteredImsiDetachInitiated.c
|
||||||
|
${NAS_SRC}UE/EMM/SAP/EmmRegisteredInitiated.c
|
||||||
|
${NAS_SRC}UE/EMM/SAP/EmmRegisteredLimitedService.c
|
||||||
|
${NAS_SRC}UE/EMM/SAP/EmmRegisteredNoCellAvailable.c
|
||||||
|
${NAS_SRC}UE/EMM/SAP/EmmRegisteredNormalService.c
|
||||||
|
${NAS_SRC}UE/EMM/SAP/EmmRegisteredPlmnSearch.c
|
||||||
|
${NAS_SRC}UE/EMM/SAP/EmmRegisteredUpdateNeeded.c
|
||||||
|
${NAS_SRC}UE/EMM/SAP/emm_sap.c
|
||||||
|
${NAS_SRC}UE/EMM/SAP/emm_send.c
|
||||||
|
${NAS_SRC}UE/EMM/SAP/EmmServiceRequestInitiated.c
|
||||||
|
${NAS_SRC}UE/EMM/SAP/EmmTrackingAreaUpdatingInitiated.c
|
||||||
|
)
|
||||||
|
set (libnas_ue_esm_OBJS
|
||||||
|
${NAS_SRC}UE/ESM/DedicatedEpsBearerContextActivation.c
|
||||||
|
${NAS_SRC}UE/ESM/DefaultEpsBearerContextActivation.c
|
||||||
|
${NAS_SRC}UE/ESM/EpsBearerContextDeactivation.c
|
||||||
|
${NAS_SRC}UE/ESM/esm_ebr.c
|
||||||
|
${NAS_SRC}UE/ESM/esm_ebr_context.c
|
||||||
|
${NAS_SRC}UE/ESM/esm_ip.c
|
||||||
|
${NAS_SRC}UE/ESM/esm_main.c
|
||||||
|
${NAS_SRC}UE/ESM/esm_pt.c
|
||||||
|
${NAS_SRC}UE/ESM/EsmStatusHdl.c
|
||||||
|
${NAS_SRC}UE/ESM/PdnConnectivity.c
|
||||||
|
${NAS_SRC}UE/ESM/PdnDisconnect.c
|
||||||
|
)
|
||||||
|
set(libnas_ue_esm_sap_OBJS
|
||||||
|
${NAS_SRC}UE/ESM/SAP/esm_recv.c
|
||||||
|
${NAS_SRC}UE/ESM/SAP/esm_send.c
|
||||||
|
${NAS_SRC}UE/ESM/SAP/esm_sap.c
|
||||||
|
)
|
||||||
|
|
||||||
|
set(libnrnas_emm_msg_OBJS
|
||||||
|
${NAS_SRC}COMMON/EMM/MSG/RegistrationRequest.c
|
||||||
|
)
|
||||||
|
|
||||||
|
set(libnrnas_ies_OBJS
|
||||||
|
${NAS_SRC}COMMON/IES/ExtendedProtocolDiscriminator.c
|
||||||
|
${NAS_SRC}COMMON/IES/FGSMobileIdentity.c
|
||||||
|
${NAS_SRC}COMMON/IES/FGSRegistrationType.c
|
||||||
|
${NAS_SRC}COMMON/IES/SpareHalfOctet.c
|
||||||
|
${NAS_SRC}COMMON/IES/FGMMCapability.c
|
||||||
|
${NAS_SRC}COMMON/IES/NrUESecurityCapability.c
|
||||||
|
)
|
||||||
|
|
||||||
|
add_library(LIB_NAS_SIMUE
|
||||||
|
${NAS_SRC}UE/nas_itti_messaging.c
|
||||||
|
${NAS_SRC}UE/nas_network.c
|
||||||
|
${NAS_SRC}UE/nas_parser.c
|
||||||
|
${NAS_SRC}UE/nas_proc.c
|
||||||
|
${NAS_SRC}UE/nas_user.c
|
||||||
|
${NAS_SRC}NR_UE/nr_nas_msg_sim.c
|
||||||
|
${libnas_api_OBJS}
|
||||||
|
${libnas_ue_api_OBJS}
|
||||||
|
${libnas_emm_msg_OBJS}
|
||||||
|
${libnas_esm_msg_OBJS}
|
||||||
|
${libnas_ies_OBJS}
|
||||||
|
${libnas_utils_OBJS}
|
||||||
|
${libnas_ue_emm_OBJS}
|
||||||
|
${libnas_ue_emm_sap_OBJS}
|
||||||
|
${libnas_ue_esm_OBJS}
|
||||||
|
${libnas_ue_esm_sap_OBJS}
|
||||||
|
${libnrnas_emm_msg_OBJS}
|
||||||
|
${libnrnas_ies_OBJS}
|
||||||
|
)
|
||||||
|
add_dependencies(LIB_NAS_SIMUE rrc_flag)
|
||||||
|
set(NAS_SIM_LIB LIB_NAS_SIMUE)
|
||||||
|
|
||||||
|
include_directories(${NAS_SRC}NR_UE)
|
||||||
|
include_directories(${NAS_SRC}UE)
|
||||||
|
include_directories(${NAS_SRC}UE/API/USER)
|
||||||
|
include_directories(${NAS_SRC}UE/API/USIM)
|
||||||
|
include_directories(${NAS_SRC}UE/EMM)
|
||||||
|
include_directories(${NAS_SRC}UE/EMM/SAP)
|
||||||
|
include_directories(${NAS_SRC}UE/ESM)
|
||||||
|
include_directories(${NAS_SRC}UE/ESM/SAP)
|
||||||
|
endif()
|
||||||
|
|
||||||
# nbiot
|
# nbiot
|
||||||
add_definitions("-DNUMBER_OF_UE_MAX_NB_IoT=16")
|
add_definitions("-DNUMBER_OF_UE_MAX_NB_IoT=16")
|
||||||
set (NBIOT_SOURCES
|
set (NBIOT_SOURCES
|
||||||
@@ -2853,7 +3029,7 @@ target_link_libraries (nr-softmodem
|
|||||||
-Wl,--start-group
|
-Wl,--start-group
|
||||||
UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB SCHED_RU_LIB SCHED_NR_LIB PHY_NR PHY PHY_COMMON PHY_NR_COMMON PHY_RU LFDS NR_GTPV1U SECU_CN SECU_OSA
|
UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB SCHED_RU_LIB SCHED_NR_LIB PHY_NR PHY PHY_COMMON PHY_NR_COMMON PHY_RU LFDS NR_GTPV1U SECU_CN SECU_OSA
|
||||||
${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} LFDS7 ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} RRC_LIB NR_RRC_LIB
|
${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} LFDS7 ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} RRC_LIB NR_RRC_LIB
|
||||||
S1AP_LIB S1AP_ENB L2_LTE_NR L2_NR MAC_NR_COMMON NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB
|
NGAP_LIB NGAP_GNB S1AP_LIB S1AP_ENB L2_LTE_NR L2_NR MAC_NR_COMMON NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB
|
||||||
X2AP_LIB X2AP_ENB F1AP_LIB F1AP M2AP_LIB M2AP_ENB M3AP_LIB M3AP_ENB ${PROTO_AGENT_LIB} ${FSPT_MSG_LIB}
|
X2AP_LIB X2AP_ENB F1AP_LIB F1AP M2AP_LIB M2AP_ENB M3AP_LIB M3AP_ENB ${PROTO_AGENT_LIB} ${FSPT_MSG_LIB}
|
||||||
-Wl,--end-group z dl)
|
-Wl,--end-group z dl)
|
||||||
|
|
||||||
@@ -2935,7 +3111,7 @@ add_executable(nr-uesoftmodem
|
|||||||
|
|
||||||
target_link_libraries (nr-uesoftmodem
|
target_link_libraries (nr-uesoftmodem
|
||||||
-Wl,--start-group
|
-Wl,--start-group
|
||||||
RRC_LIB NR_RRC_LIB SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_RU_LIB SCHED_UE_LIB SCHED_NR_UE_LIB
|
RRC_LIB NR_RRC_LIB NGAP_LIB NGAP_GNB SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_RU_LIB SCHED_UE_LIB SCHED_NR_UE_LIB
|
||||||
PHY_COMMON PHY_NR_COMMON PHY_UE PHY_NR_UE PHY_RU LFDS NR_L2_UE L2_UE_LTE_NR MAC_NR_COMMON NFAPI_COMMON_LIB NFAPI_LIB NFAPI_PNF_LIB
|
PHY_COMMON PHY_NR_COMMON PHY_UE PHY_NR_UE PHY_RU LFDS NR_L2_UE L2_UE_LTE_NR MAC_NR_COMMON NFAPI_COMMON_LIB NFAPI_LIB NFAPI_PNF_LIB
|
||||||
NFAPI_USER_LIB S1AP_LIB S1AP_ENB
|
NFAPI_USER_LIB S1AP_LIB S1AP_ENB
|
||||||
${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} LFDS7 ${ATLAS_LIBRARIES} LIB_5GNAS_GNB
|
${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} LFDS7 ${ATLAS_LIBRARIES} LIB_5GNAS_GNB
|
||||||
@@ -3056,6 +3232,7 @@ add_executable(nr_dlschsim
|
|||||||
${OPENAIR_DIR}/common/utils/system.c
|
${OPENAIR_DIR}/common/utils/system.c
|
||||||
${OPENAIR_DIR}/common/utils/nr/nr_common.c
|
${OPENAIR_DIR}/common/utils/nr/nr_common.c
|
||||||
${OPENAIR_DIR}/common/utils/utils.c
|
${OPENAIR_DIR}/common/utils/utils.c
|
||||||
|
${OPENAIR_DIR}/common/utils/threadPool/thread-pool.c
|
||||||
${UTIL_SRC}
|
${UTIL_SRC}
|
||||||
${T_SOURCE}
|
${T_SOURCE}
|
||||||
${SHLIB_LOADER_SOURCES}
|
${SHLIB_LOADER_SOURCES}
|
||||||
@@ -3070,6 +3247,7 @@ add_executable(nr_pbchsim
|
|||||||
${OPENAIR_DIR}/common/utils/system.c
|
${OPENAIR_DIR}/common/utils/system.c
|
||||||
${OPENAIR_DIR}/common/utils/nr/nr_common.c
|
${OPENAIR_DIR}/common/utils/nr/nr_common.c
|
||||||
${OPENAIR_DIR}/common/utils/utils.c
|
${OPENAIR_DIR}/common/utils/utils.c
|
||||||
|
${OPENAIR_DIR}/common/utils/threadPool/thread-pool.c
|
||||||
${UTIL_SRC}
|
${UTIL_SRC}
|
||||||
${T_SOURCE}
|
${T_SOURCE}
|
||||||
${SHLIB_LOADER_SOURCES}
|
${SHLIB_LOADER_SOURCES}
|
||||||
@@ -3086,6 +3264,7 @@ add_executable(nr_pucchsim
|
|||||||
${OPENAIR_DIR}/common/utils/nr/nr_common.c
|
${OPENAIR_DIR}/common/utils/nr/nr_common.c
|
||||||
${OPENAIR_DIR}/common/utils/system.c
|
${OPENAIR_DIR}/common/utils/system.c
|
||||||
${OPENAIR_DIR}/common/utils/utils.c
|
${OPENAIR_DIR}/common/utils/utils.c
|
||||||
|
${OPENAIR_DIR}/common/utils/threadPool/thread-pool.c
|
||||||
${UTIL_SRC}
|
${UTIL_SRC}
|
||||||
${T_SOURCE}
|
${T_SOURCE}
|
||||||
${SHLIB_LOADER_SOURCES}
|
${SHLIB_LOADER_SOURCES}
|
||||||
@@ -3104,6 +3283,7 @@ add_executable(nr_dlsim
|
|||||||
${OPENAIR2_DIR}/RRC/NAS/nas_config.c
|
${OPENAIR2_DIR}/RRC/NAS/nas_config.c
|
||||||
${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c
|
${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c
|
||||||
${NFAPI_USER_DIR}/nfapi.c
|
${NFAPI_USER_DIR}/nfapi.c
|
||||||
|
${OPENAIR_DIR}/common/utils/threadPool/thread-pool.c
|
||||||
${UTIL_SRC}
|
${UTIL_SRC}
|
||||||
${T_SOURCE}
|
${T_SOURCE}
|
||||||
${SHLIB_LOADER_SOURCES}
|
${SHLIB_LOADER_SOURCES}
|
||||||
@@ -3123,6 +3303,7 @@ add_executable(nr_prachsim
|
|||||||
${OPENAIR2_DIR}/RRC/NAS/nas_config.c
|
${OPENAIR2_DIR}/RRC/NAS/nas_config.c
|
||||||
${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c
|
${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c
|
||||||
${NFAPI_USER_DIR}/nfapi.c
|
${NFAPI_USER_DIR}/nfapi.c
|
||||||
|
${OPENAIR_DIR}/common/utils/threadPool/thread-pool.c
|
||||||
${UTIL_SRC}
|
${UTIL_SRC}
|
||||||
${T_SOURCE}
|
${T_SOURCE}
|
||||||
${SHLIB_LOADER_SOURCES})
|
${SHLIB_LOADER_SOURCES})
|
||||||
@@ -3247,7 +3428,7 @@ if (${T_TRACER})
|
|||||||
foreach(i
|
foreach(i
|
||||||
#all "add_executable" definitions (except tests, rb_tool, updatefw)
|
#all "add_executable" definitions (except tests, rb_tool, updatefw)
|
||||||
lte-softmodem lte-uesoftmodem nr-softmodem
|
lte-softmodem lte-uesoftmodem nr-softmodem
|
||||||
nr-uesoftmodem dlsim dlsim_tm4 dlsim_tm7
|
nr-uesoftmodem dlsim dlsim_tm4 dlsim_tm7 nr-ittisim
|
||||||
ulsim pbchsim scansim mbmssim pdcchsim pucchsim prachsim
|
ulsim pbchsim scansim mbmssim pdcchsim pucchsim prachsim
|
||||||
syncsim nr_ulsim nr_dlsim nr_dlschsim nr_pbchsim nr_pucchsim
|
syncsim nr_ulsim nr_dlsim nr_dlschsim nr_pbchsim nr_pucchsim
|
||||||
nr_ulschsim ldpctest polartest smallblocktest cu_test du_test
|
nr_ulschsim ldpctest polartest smallblocktest cu_test du_test
|
||||||
@@ -3259,7 +3440,7 @@ if (${T_TRACER})
|
|||||||
SECU_OSA SECU_CN SCHED_LIB SCHED_NR_LIB SCHED_RU_LIB SCHED_UE_LIB SCHED_NR_UE_LIB default_sched remote_sched RAL
|
SECU_OSA SECU_CN SCHED_LIB SCHED_NR_LIB SCHED_RU_LIB SCHED_UE_LIB SCHED_NR_UE_LIB default_sched remote_sched RAL
|
||||||
NFAPI_COMMON_LIB NFAPI_LIB NFAPI_PNF_LIB NFAPI_VNF_LIB NFAPI_USER_LIB
|
NFAPI_COMMON_LIB NFAPI_LIB NFAPI_PNF_LIB NFAPI_VNF_LIB NFAPI_USER_LIB
|
||||||
PHY_COMMON PHY PHY_UE PHY_NR PHY_NR_COMMON PHY_NR_UE PHY_RU PHY_MEX
|
PHY_COMMON PHY PHY_UE PHY_NR PHY_NR_COMMON PHY_NR_UE PHY_RU PHY_MEX
|
||||||
L2 L2_LTE L2_NR L2_LTE_NR L2_UE NR_L2_UE L2_UE_LTE_NR MAC_NR_COMMON MAC_NR MAC_UE_NR
|
L2 L2_LTE L2_NR L2_LTE_NR L2_UE NR_L2_UE L2_UE_LTE_NR MAC_NR_COMMON MAC_NR MAC_UE_NR NGAP_GNB
|
||||||
CN_UTILS GTPV1U NR_GTPV1U SCTP_CLIENT MME_APP UDP LIB_NAS_UE NB_IoT LFDS LFDS7 SIMU_COMMON SIMU SIMU_ETH OPENAIR0_LIB
|
CN_UTILS GTPV1U NR_GTPV1U SCTP_CLIENT MME_APP UDP LIB_NAS_UE NB_IoT LFDS LFDS7 SIMU_COMMON SIMU SIMU_ETH OPENAIR0_LIB
|
||||||
ldpc_orig ldpc_optim ldpc_optim8seg ldpc PROTO_AGENT dfts)
|
ldpc_orig ldpc_optim ldpc_optim8seg ldpc PROTO_AGENT dfts)
|
||||||
if (TARGET ${i})
|
if (TARGET ${i})
|
||||||
@@ -3334,6 +3515,53 @@ add_executable(rb_tool
|
|||||||
)
|
)
|
||||||
target_include_directories(rb_tool PRIVATE ${OPENAIR2_DIR}/NETWORK_DRIVER/MESH/)
|
target_include_directories(rb_tool PRIVATE ${OPENAIR2_DIR}/NETWORK_DRIVER/MESH/)
|
||||||
|
|
||||||
|
# nr-ittisim
|
||||||
|
###################################################
|
||||||
|
|
||||||
|
add_executable(nr-ittisim
|
||||||
|
${rrc_h}
|
||||||
|
${nr_rrc_h}
|
||||||
|
${OPENAIR2_DIR}/GNB_APP/gnb_app.c
|
||||||
|
${OPENAIR2_DIR}/GNB_APP/gnb_config.c
|
||||||
|
${OPENAIR_DIR}/executables/nr-gnb.c
|
||||||
|
${OPENAIR_DIR}/executables/nr-ru.c
|
||||||
|
${OPENAIR2_DIR}/SIMULATION/NR_RRC/itti_sim.c
|
||||||
|
${OPENAIR_DIR}/executables/softmodem-common.c
|
||||||
|
${OPENAIR1_DIR}/SIMULATION/TOOLS/taus.c
|
||||||
|
${OPENAIR_TARGETS}/ARCH/COMMON/common_lib.c
|
||||||
|
${OPENAIR_TARGETS}/ARCH/COMMON/record_player.c
|
||||||
|
${OPENAIR2_DIR}/RRC/NAS/nas_config.c
|
||||||
|
${OPENAIR2_DIR}/RRC/NAS/rb_config.c
|
||||||
|
${OPENAIR3_DIR}/GTPV1-U/gtpv1u_gNB.c
|
||||||
|
${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c
|
||||||
|
${OPENAIR3_DIR}/NAS/UE/nas_ue_task.c
|
||||||
|
${OPENAIR_DIR}/common/utils/utils.c
|
||||||
|
${OPENAIR_DIR}/common/utils/system.c
|
||||||
|
${OPENAIR_DIR}/common/utils/nr/nr_common.c
|
||||||
|
${OPENAIR_DIR}/common/utils/threadPool/thread-pool.c
|
||||||
|
${GTPU_need_ITTI}
|
||||||
|
${XFORMSINTERFACE_SOURCE}
|
||||||
|
${T_SOURCE}
|
||||||
|
${CONFIG_SOURCES}
|
||||||
|
${SHLIB_LOADER_SOURCES}
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries (nr-ittisim
|
||||||
|
-Wl,--start-group
|
||||||
|
UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB SCHED_RU_LIB SCHED_NR_LIB PHY_NR PHY PHY_COMMON PHY_NR_COMMON PHY_RU LFDS NR_GTPV1U SECU_CN SECU_OSA
|
||||||
|
${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} LFDS7 ${MSC_LIB} ${RAL_LIB} ${NAS_SIM_LIB} RRC_LIB NR_RRC_LIB
|
||||||
|
NGAP_LIB NGAP_GNB S1AP_LIB S1AP_ENB L2_LTE_NR L2_NR MAC_NR_COMMON NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB
|
||||||
|
X2AP_LIB X2AP_ENB F1AP_LIB F1AP M2AP_LIB M2AP_ENB M3AP_LIB M3AP_ENB ${PROTO_AGENT_LIB} ${FSPT_MSG_LIB}
|
||||||
|
PHY_NR_UE SCHED_NR_UE_LIB NR_L2_UE
|
||||||
|
-Wl,--end-group z dl)
|
||||||
|
|
||||||
|
target_link_libraries (nr-ittisim ${LIBXML2_LIBRARIES})
|
||||||
|
target_link_libraries (nr-ittisim pthread m ${CONFIG_LIB} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} sctp ${XFORMS_LIBRARIES} ${PROTOBUF_LIB} ${CMAKE_DL_LIBS} ${LIBYAML_LIBRARIES} ${ATLAS_LIBRARIES})
|
||||||
|
target_link_libraries (nr-ittisim ${LIB_LMS_LIBRARIES})
|
||||||
|
target_link_libraries (nr-ittisim ${T_LIB})
|
||||||
|
|
||||||
|
add_dependencies( nr-ittisim ldpc_orig ldpc_optim ldpc_optim8seg ldpc )
|
||||||
|
|
||||||
# ???
|
# ???
|
||||||
####################
|
####################
|
||||||
list(APPEND oai_nw_drv_src device.c common.c ioctl.c classifier.c tool.c)
|
list(APPEND oai_nw_drv_src device.c common.c ioctl.c classifier.c tool.c)
|
||||||
|
|||||||
@@ -1095,7 +1095,12 @@
|
|||||||
(Test10: 106 PRBs 50 PDSCH-PRBs MCS Index 16),
|
(Test10: 106 PRBs 50 PDSCH-PRBs MCS Index 16),
|
||||||
(Test11: HARQ test 25% TP (4 rounds),
|
(Test11: HARQ test 25% TP (4 rounds),
|
||||||
(Test12: HARQ test 33% TP (3 rounds),
|
(Test12: HARQ test 33% TP (3 rounds),
|
||||||
(Test13: HARQ test 50% TP (2 rounds)</desc>
|
(Test13: HARQ test 50% TP (2 rounds),
|
||||||
|
(Test14: 3 PTRS, 8 Interpolated Symbols),
|
||||||
|
(Test15: 6 PTRS, 5 Interpolated Symbols),
|
||||||
|
(Test16: 11 PTRS, 0 Interpolated Symbols),
|
||||||
|
(Test17: 2 DMRS Symbols),
|
||||||
|
(Test18: 3 DMRS Symbols)</desc>
|
||||||
<pre_compile_prog></pre_compile_prog>
|
<pre_compile_prog></pre_compile_prog>
|
||||||
<compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</compile_prog>
|
<compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</compile_prog>
|
||||||
<compile_prog_args> --phy_simulators -c </compile_prog_args>
|
<compile_prog_args> --phy_simulators -c </compile_prog_args>
|
||||||
@@ -1114,8 +1119,13 @@
|
|||||||
-n100 -e16 -s10
|
-n100 -e16 -s10
|
||||||
-n100 -s1 -t25
|
-n100 -s1 -t25
|
||||||
-n100 -s1 -t33
|
-n100 -s1 -t33
|
||||||
-n100 -s1 -t50</main_exec_args>
|
-n100 -s1 -t50
|
||||||
<tags>nr_dlsim.test1 nr_dlsim.test2 nr_dlsim.test3 nr_dlsim.test4 nr_dlsim.test5 nr_dlsim.test6 nr_dlsim.test7 nr_dlsim.test8 nr_dlsim.test9 nr_dlsim.test10 nr_dlsim.test11 nr_dlsim.test12 nr_dlsim.test13</tags>
|
-n100 -s5 -T 2 2 2
|
||||||
|
-n100 -s5 -T 2 1 2
|
||||||
|
-n100 -s5 -T 2 0 4
|
||||||
|
-n100 -s2 -U 2 0 1
|
||||||
|
-n100 -s2 -U 2 0 2</main_exec_args>
|
||||||
|
<tags>nr_dlsim.test1 nr_dlsim.test2 nr_dlsim.test3 nr_dlsim.test4 nr_dlsim.test5 nr_dlsim.test6 nr_dlsim.test7 nr_dlsim.test8 nr_dlsim.test9 nr_dlsim.test10 nr_dlsim.test11 nr_dlsim.test12 nr_dlsim.test13 nr_dlsim.test14 nr_dlsim.test15 nr_dlsim.test16 nr_dlsim.test17 nr_dlsim.test18</tags>
|
||||||
<search_expr_true>PDSCH test OK</search_expr_true>
|
<search_expr_true>PDSCH test OK</search_expr_true>
|
||||||
<search_expr_false>segmentation fault|assertion|exiting|fatal</search_expr_false>
|
<search_expr_false>segmentation fault|assertion|exiting|fatal</search_expr_false>
|
||||||
<nruns>3</nruns>
|
<nruns>3</nruns>
|
||||||
@@ -1305,9 +1315,9 @@
|
|||||||
<desc>nr_prachsim Test cases. (Test1: 30kHz SCS, 106 PRBs, Prach format A2),
|
<desc>nr_prachsim Test cases. (Test1: 30kHz SCS, 106 PRBs, Prach format A2),
|
||||||
(Test2: 30kHz SCS, 217 PRBs, Prach format A2),
|
(Test2: 30kHz SCS, 217 PRBs, Prach format A2),
|
||||||
(Test3: 30kHz SCS, 273 PRBs, Prach format A2),
|
(Test3: 30kHz SCS, 273 PRBs, Prach format A2),
|
||||||
(Test4: 30kHz SCS, 106 PRBs, Prach format 0)
|
(Test4: 30kHz SCS, 106 PRBs, Prach format 0),
|
||||||
(Test5: 120kHz SCS, 32 PRBs, Prach format A2)
|
(Test5: 120kHz SCS, 32 PRBs, Prach format A2),
|
||||||
(Test5: 120kHz SCS, 66 PRBs, Prach format A2)</desc>
|
(Test6: 120kHz SCS, 66 PRBs, Prach format A2)</desc>
|
||||||
<pre_compile_prog></pre_compile_prog>
|
<pre_compile_prog></pre_compile_prog>
|
||||||
<compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</compile_prog>
|
<compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</compile_prog>
|
||||||
<compile_prog_args> --phy_simulators -c </compile_prog_args>
|
<compile_prog_args> --phy_simulators -c </compile_prog_args>
|
||||||
@@ -1320,7 +1330,7 @@
|
|||||||
-a -s -30 -n 100 -p 63 -R 106 -c 4
|
-a -s -30 -n 100 -p 63 -R 106 -c 4
|
||||||
-a -s -30 -n 100 -p 32 -R 32 -m 3 -c52
|
-a -s -30 -n 100 -p 32 -R 32 -m 3 -c52
|
||||||
-a -s -30 -n 100 -p 32 -R 66 -m 3 -c52</main_exec_args>
|
-a -s -30 -n 100 -p 32 -R 66 -m 3 -c52</main_exec_args>
|
||||||
<tags>nr_prachsim.test1 nr_prachsim.test2 nr_prachsim.test3 nr_prachsim.test4</tags>
|
<tags>nr_prachsim.test1 nr_prachsim.test2 nr_prachsim.test3 nr_prachsim.test4 nr_prachsim.test5 nr_prachsim.test6</tags>
|
||||||
<search_expr_true>PRACH test OK</search_expr_true>
|
<search_expr_true>PRACH test OK</search_expr_true>
|
||||||
<search_expr_false>segmentation fault|assertion|exiting|fatal</search_expr_false>
|
<search_expr_false>segmentation fault|assertion|exiting|fatal</search_expr_false>
|
||||||
<nruns>3</nruns>
|
<nruns>3</nruns>
|
||||||
|
|||||||
+14
-1
@@ -66,6 +66,7 @@ UE_TIMING_TRACE="False"
|
|||||||
USRP_REC_PLAY="False"
|
USRP_REC_PLAY="False"
|
||||||
BUILD_ECLIPSE=0
|
BUILD_ECLIPSE=0
|
||||||
NR="False"
|
NR="False"
|
||||||
|
ITTI_SIM="False"
|
||||||
OPTIONAL_LIBRARIES="telnetsrv enbscope uescope nrscope msc"
|
OPTIONAL_LIBRARIES="telnetsrv enbscope uescope nrscope msc"
|
||||||
trap handle_ctrl_c INT
|
trap handle_ctrl_c INT
|
||||||
|
|
||||||
@@ -159,6 +160,8 @@ Options
|
|||||||
Build for I/Q record-playback modes
|
Build for I/Q record-playback modes
|
||||||
-k | --skip-shared-libraries
|
-k | --skip-shared-libraries
|
||||||
Skip build for shared libraries to reduce compilation time when building frequently for debugging purposes
|
Skip build for shared libraries to reduce compilation time when building frequently for debugging purposes
|
||||||
|
--ittiSIM
|
||||||
|
Makes the itti simulator
|
||||||
-h | --help
|
-h | --help
|
||||||
Print this help
|
Print this help
|
||||||
|
|
||||||
@@ -413,6 +416,11 @@ function main() {
|
|||||||
CMAKE_CMD="$CMAKE_CMD -GNinja"
|
CMAKE_CMD="$CMAKE_CMD -GNinja"
|
||||||
MAKE_CMD=ninja
|
MAKE_CMD=ninja
|
||||||
shift;;
|
shift;;
|
||||||
|
--ittiSIM)
|
||||||
|
ittiSIM=1
|
||||||
|
ITTI_SIM="True"
|
||||||
|
echo_info "Will compile itti simulator"
|
||||||
|
shift;;
|
||||||
-h | --help)
|
-h | --help)
|
||||||
print_help
|
print_help
|
||||||
exit 1;;
|
exit 1;;
|
||||||
@@ -571,7 +579,7 @@ function main() {
|
|||||||
config_libconfig_shlib=params_libconfig
|
config_libconfig_shlib=params_libconfig
|
||||||
|
|
||||||
# first generate the CMakefile in the right directory
|
# first generate the CMakefile in the right directory
|
||||||
if [ "$eNB" = "1" -o "$eNBocp" = "1" -o "$UE" = "1" -o "$gNB" = "1" -o "$nrUE" = "1" -o "$HW" = "EXMIMO" ] ; then
|
if [ "$eNB" = "1" -o "$eNBocp" = "1" -o "$UE" = "1" -o "$gNB" = "1" -o "$nrUE" = "1" -o "$HW" = "EXMIMO" -o "$ittiSIM" = "1" ] ; then
|
||||||
|
|
||||||
# softmodem compilation
|
# softmodem compilation
|
||||||
|
|
||||||
@@ -595,6 +603,7 @@ function main() {
|
|||||||
echo "set ( UE_TIMING_TRACE $UE_TIMING_TRACE )" >> $cmake_file
|
echo "set ( UE_TIMING_TRACE $UE_TIMING_TRACE )" >> $cmake_file
|
||||||
echo "set ( USRP_REC_PLAY $USRP_REC_PLAY )" >> $cmake_file
|
echo "set ( USRP_REC_PLAY $USRP_REC_PLAY )" >> $cmake_file
|
||||||
echo "set ( SKIP_SHARED_LIB_FLAG $SKIP_SHARED_LIB_FLAG )" >> $cmake_file
|
echo "set ( SKIP_SHARED_LIB_FLAG $SKIP_SHARED_LIB_FLAG )" >> $cmake_file
|
||||||
|
echo "set ( ITTI_SIM $ITTI_SIM )" >> $cmake_file
|
||||||
echo 'include(${CMAKE_CURRENT_SOURCE_DIR}/../CMakeLists.txt)' >> $cmake_file
|
echo 'include(${CMAKE_CURRENT_SOURCE_DIR}/../CMakeLists.txt)' >> $cmake_file
|
||||||
cd $DIR/$build_dir/build
|
cd $DIR/$build_dir/build
|
||||||
eval $CMAKE_CMD
|
eval $CMAKE_CMD
|
||||||
@@ -616,6 +625,10 @@ function main() {
|
|||||||
execlist="$execlist nr-uesoftmodem"
|
execlist="$execlist nr-uesoftmodem"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [ "$ittiSIM" = "1" ] ; then
|
||||||
|
execlist="$execlist nr-ittisim"
|
||||||
|
fi
|
||||||
|
|
||||||
for f in $execlist ; do
|
for f in $execlist ; do
|
||||||
echo_info "Compiling $f..."
|
echo_info "Compiling $f..."
|
||||||
compilations \
|
compilations \
|
||||||
|
|||||||
@@ -16,4 +16,5 @@ set ( UE_DEBUG_TRACE False )
|
|||||||
set ( UE_TIMING_TRACE False )
|
set ( UE_TIMING_TRACE False )
|
||||||
set ( USRP_REC_PLAY False )
|
set ( USRP_REC_PLAY False )
|
||||||
set ( SKIP_SHARED_LIB_FLAG False )
|
set ( SKIP_SHARED_LIB_FLAG False )
|
||||||
|
set ( PHYSIM True)
|
||||||
include(${CMAKE_CURRENT_SOURCE_DIR}/../CMakeLists.txt)
|
include(${CMAKE_CURRENT_SOURCE_DIR}/../CMakeLists.txt)
|
||||||
|
|||||||
@@ -42,12 +42,12 @@ KERNEL_MAJOR=$(uname -r | cut -d '.' -f2)
|
|||||||
|
|
||||||
#check if we run inside a container
|
#check if we run inside a container
|
||||||
IS_CONTAINER=`egrep -c "docker|podman|kubepods" /proc/self/cgroup || true`
|
IS_CONTAINER=`egrep -c "docker|podman|kubepods" /proc/self/cgroup || true`
|
||||||
#sudo is not needed inside a container
|
#sudo is not needed when we are root
|
||||||
if [ $IS_CONTAINER -eq 0 ]
|
if [ "$UID" = 0 ]
|
||||||
then
|
then
|
||||||
SUDO='sudo -S -E'
|
|
||||||
else
|
|
||||||
SUDO=''
|
SUDO=''
|
||||||
|
else
|
||||||
|
SUDO='sudo -S -E'
|
||||||
fi
|
fi
|
||||||
|
|
||||||
###############################
|
###############################
|
||||||
@@ -114,6 +114,8 @@ check_supported_distribution() {
|
|||||||
"rhel7.7") return 0 ;;
|
"rhel7.7") return 0 ;;
|
||||||
"rhel7.8") return 0 ;;
|
"rhel7.8") return 0 ;;
|
||||||
"rhel8.2") return 0 ;;
|
"rhel8.2") return 0 ;;
|
||||||
|
"rhel8.3") return 0 ;;
|
||||||
|
"rhel8.4") return 0 ;;
|
||||||
"centos7") return 0 ;;
|
"centos7") return 0 ;;
|
||||||
esac
|
esac
|
||||||
return 1
|
return 1
|
||||||
@@ -251,18 +253,13 @@ install_protobuf_from_source(){
|
|||||||
#wget https://github.com/google/protobuf/releases/download/v2.6.1/protobuf-2.6.1.tar.gz
|
#wget https://github.com/google/protobuf/releases/download/v2.6.1/protobuf-2.6.1.tar.gz
|
||||||
#tar -xzvf protobuf-2.6.1.tar.gz --owner $USER --group $USER --no-same-owner
|
#tar -xzvf protobuf-2.6.1.tar.gz --owner $USER --group $USER --no-same-owner
|
||||||
#cd protobuf-2.6.1/
|
#cd protobuf-2.6.1/
|
||||||
|
|
||||||
if [ $IS_CONTAINER -eq 0 ]
|
if [ $IS_CONTAINER -eq 0 ]
|
||||||
then
|
then
|
||||||
rm -rf /tmp/protobuf-cpp-3.3.0.tar.gz* /tmp/protobuf-3.3.0
|
rm -rf /tmp/protobuf-cpp-3.3.0.tar.gz* /tmp/protobuf-3.3.0
|
||||||
wget --tries=3 --retry-connrefused https://github.com/google/protobuf/releases/download/v3.3.0/protobuf-cpp-3.3.0.tar.gz
|
wget --tries=3 --retry-connrefused https://github.com/google/protobuf/releases/download/v3.3.0/protobuf-cpp-3.3.0.tar.gz
|
||||||
tar -xzvf protobuf-cpp-3.3.0.tar.gz --owner $USER --group $(groups | cut -d" " -f1) --no-same-owner
|
tar -xzvf protobuf-cpp-3.3.0.tar.gz --owner $(id -u) --group $(id -g) --no-same-owner
|
||||||
cd protobuf-3.3.0/
|
cd protobuf-3.3.0/
|
||||||
./configure
|
|
||||||
echo "Compiling protobuf"
|
|
||||||
make -j`nproc`
|
|
||||||
$SUDO make install
|
|
||||||
$SUDO ldconfig
|
|
||||||
else
|
else
|
||||||
export LD_LIBRARY_PATH=/usr/local/lib #protoc needs to know where toclook for shared libs
|
export LD_LIBRARY_PATH=/usr/local/lib #protoc needs to know where toclook for shared libs
|
||||||
rm -rf /tmp/protobuf
|
rm -rf /tmp/protobuf
|
||||||
@@ -270,11 +267,12 @@ install_protobuf_from_source(){
|
|||||||
cd /tmp/protobuf
|
cd /tmp/protobuf
|
||||||
git submodule update --init --recursive
|
git submodule update --init --recursive
|
||||||
./autogen.sh
|
./autogen.sh
|
||||||
./configure
|
|
||||||
make -j`nproc`
|
|
||||||
make install
|
|
||||||
ldconfig
|
|
||||||
fi
|
fi
|
||||||
|
./configure
|
||||||
|
echo "Compiling protobuf"
|
||||||
|
make -j`nproc`
|
||||||
|
$SUDO make install
|
||||||
|
$SUDO ldconfig
|
||||||
) >& $protobuf_install_log
|
) >& $protobuf_install_log
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -19,6 +19,10 @@ if [ "$done_flag" -ot $ASN1_SOURCE_DIR ] ; then
|
|||||||
sed -i 's/18446744073709551615))/18446744073709551615U))/g' "$GENERATED_FULL_DIR"/${ASN1C_PREFIX}E-RABUsageReportItem.c
|
sed -i 's/18446744073709551615))/18446744073709551615U))/g' "$GENERATED_FULL_DIR"/${ASN1C_PREFIX}E-RABUsageReportItem.c
|
||||||
sed -i 's/18446744073709551615 }/18446744073709551615U }/g' "$GENERATED_FULL_DIR"/${ASN1C_PREFIX}E-RABUsageReportItem.c
|
sed -i 's/18446744073709551615 }/18446744073709551615U }/g' "$GENERATED_FULL_DIR"/${ASN1C_PREFIX}E-RABUsageReportItem.c
|
||||||
fi
|
fi
|
||||||
|
if [ "$ASN1C_PREFIX" = "NGAP_" ] ; then
|
||||||
|
sed -i 's/18446744073709551615))/18446744073709551615U))/g' "$GENERATED_FULL_DIR"/${ASN1C_PREFIX}VolumeTimedReport-Item.c
|
||||||
|
sed -i 's/18446744073709551615 }/18446744073709551615U }/g' "$GENERATED_FULL_DIR"/${ASN1C_PREFIX}VolumeTimedReport-Item.c
|
||||||
|
fi
|
||||||
|
|
||||||
fi
|
fi
|
||||||
touch $done_flag
|
touch $done_flag
|
||||||
|
|||||||
@@ -445,6 +445,7 @@ int logInit (void)
|
|||||||
register_log_component("NR_RRC","log",NR_RRC);
|
register_log_component("NR_RRC","log",NR_RRC);
|
||||||
register_log_component("NR_MAC","log",NR_MAC);
|
register_log_component("NR_MAC","log",NR_MAC);
|
||||||
register_log_component("NR_PHY","log",NR_PHY);
|
register_log_component("NR_PHY","log",NR_PHY);
|
||||||
|
register_log_component("NGAP","",NGAP);
|
||||||
|
|
||||||
for (int i=0 ; log_level_names[i].name != NULL ; i++)
|
for (int i=0 ; log_level_names[i].name != NULL ; i++)
|
||||||
g_log->level2string[i] = toupper(log_level_names[i].name[0]); // uppercased first letter of level name
|
g_log->level2string[i] = toupper(log_level_names[i].name[0]); // uppercased first letter of level name
|
||||||
|
|||||||
@@ -148,6 +148,7 @@ extern "C" {
|
|||||||
#define DEBUG_SECURITY (1<<11)
|
#define DEBUG_SECURITY (1<<11)
|
||||||
#define DEBUG_NAS (1<<12)
|
#define DEBUG_NAS (1<<12)
|
||||||
#define DEBUG_RLC (1<<13)
|
#define DEBUG_RLC (1<<13)
|
||||||
|
#define DEBUG_DLSCH_DECOD (1<<14)
|
||||||
#define UE_TIMING (1<<20)
|
#define UE_TIMING (1<<20)
|
||||||
|
|
||||||
|
|
||||||
@@ -166,6 +167,7 @@ extern "C" {
|
|||||||
{"SECURITY", DEBUG_SECURITY},\
|
{"SECURITY", DEBUG_SECURITY},\
|
||||||
{"NAS", DEBUG_NAS},\
|
{"NAS", DEBUG_NAS},\
|
||||||
{"RLC", DEBUG_RLC},\
|
{"RLC", DEBUG_RLC},\
|
||||||
|
{"DLSCH_DECOD", DEBUG_DLSCH_DECOD},\
|
||||||
{"UE_TIMING", UE_TIMING},\
|
{"UE_TIMING", UE_TIMING},\
|
||||||
{NULL,-1}\
|
{NULL,-1}\
|
||||||
}
|
}
|
||||||
@@ -226,6 +228,7 @@ typedef enum {
|
|||||||
X2AP,
|
X2AP,
|
||||||
M2AP,
|
M2AP,
|
||||||
M3AP,
|
M3AP,
|
||||||
|
NGAP,
|
||||||
GNB_APP,
|
GNB_APP,
|
||||||
NR_RRC,
|
NR_RRC,
|
||||||
NR_MAC,
|
NR_MAC,
|
||||||
|
|||||||
@@ -400,6 +400,27 @@ ID = LEGACY_S1AP_TRACE
|
|||||||
GROUP = ALL:LEGACY_S1AP:LEGACY_GROUP_TRACE:LEGACY
|
GROUP = ALL:LEGACY_S1AP:LEGACY_GROUP_TRACE:LEGACY
|
||||||
FORMAT = string,log
|
FORMAT = string,log
|
||||||
|
|
||||||
|
ID = LEGACY_NGAP_INFO
|
||||||
|
DESC = NGAP legacy logs - info level
|
||||||
|
GROUP = ALL:LEGACY_NGAP:LEGACY_GROUP_INFO:LEGACY
|
||||||
|
FORMAT = string,log
|
||||||
|
ID = LEGACY_NGAP_ERROR
|
||||||
|
DESC = NGAP legacy logs - error level
|
||||||
|
GROUP = ALL:LEGACY_NGAP:LEGACY_GROUP_ERROR:LEGACY
|
||||||
|
FORMAT = string,log
|
||||||
|
ID = LEGACY_NGAP_WARNING
|
||||||
|
DESC = NGAP legacy logs - warning level
|
||||||
|
GROUP = ALL:LEGACY_NGAP:LEGACY_GROUP_WARNING:LEGACY
|
||||||
|
FORMAT = string,log
|
||||||
|
ID = LEGACY_NGAP_DEBUG
|
||||||
|
DESC = NGAP legacy logs - debug level
|
||||||
|
GROUP = ALL:LEGACY_NGAP:LEGACY_GROUP_DEBUG:LEGACY
|
||||||
|
FORMAT = string,log
|
||||||
|
ID = LEGACY_NGAP_TRACE
|
||||||
|
DESC = NGAP legacy logs - trace level
|
||||||
|
GROUP = ALL:LEGACY_NGAP:LEGACY_GROUP_TRACE:LEGACY
|
||||||
|
FORMAT = string,log
|
||||||
|
|
||||||
ID = LEGACY_X2AP_INFO
|
ID = LEGACY_X2AP_INFO
|
||||||
DESC = X2AP legacy logs - info level
|
DESC = X2AP legacy logs - info level
|
||||||
GROUP = ALL:LEGACY_X2AP:LEGACY_GROUP_INFO:LEGACY
|
GROUP = ALL:LEGACY_X2AP:LEGACY_GROUP_INFO:LEGACY
|
||||||
|
|||||||
@@ -49,11 +49,14 @@ typedef enum {
|
|||||||
MSC_RLC_ENB,
|
MSC_RLC_ENB,
|
||||||
MSC_PDCP_ENB,
|
MSC_PDCP_ENB,
|
||||||
MSC_RRC_ENB,
|
MSC_RRC_ENB,
|
||||||
|
MSC_RRC_GNB,
|
||||||
MSC_IP_ENB,
|
MSC_IP_ENB,
|
||||||
MSC_S1AP_ENB,
|
MSC_S1AP_ENB,
|
||||||
|
MSC_NGAP_GNB,
|
||||||
MSC_GTPU_ENB,
|
MSC_GTPU_ENB,
|
||||||
MSC_GTPU_SGW,
|
MSC_GTPU_SGW,
|
||||||
MSC_S1AP_MME,
|
MSC_S1AP_MME,
|
||||||
|
MSC_NGAP_AMF,
|
||||||
MSC_MMEAPP_MME,
|
MSC_MMEAPP_MME,
|
||||||
MSC_NAS_MME,
|
MSC_NAS_MME,
|
||||||
MSC_NAS_EMM_MME,
|
MSC_NAS_EMM_MME,
|
||||||
|
|||||||
@@ -16,3 +16,8 @@
|
|||||||
#include "openair2/COMMON/gtpv1_u_messages_def.h"
|
#include "openair2/COMMON/gtpv1_u_messages_def.h"
|
||||||
#include "openair2/COMMON/flexran_messages_def.h"
|
#include "openair2/COMMON/flexran_messages_def.h"
|
||||||
#include "openair2/COMMON/f1ap_messages_def.h"
|
#include "openair2/COMMON/f1ap_messages_def.h"
|
||||||
|
#include "openair2/COMMON/ngap_messages_def.h"
|
||||||
|
#if ITTI_SIM
|
||||||
|
#include "openair2/COMMON/itti_sim_messages_def.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -194,7 +194,8 @@ task_list_t tasks[TASK_MAX];
|
|||||||
t->next_timer=UINT64_MAX;
|
t->next_timer=UINT64_MAX;
|
||||||
|
|
||||||
// Proceed expired timer
|
// Proceed expired timer
|
||||||
for ( auto it=t->timer_map.begin() ; it != t->timer_map.end() ; ++it ) {
|
for ( auto it=t->timer_map.begin() , next_it = it; it != t->timer_map.end() ; it = next_it ) {
|
||||||
|
++next_it;
|
||||||
if ( it->second.timeout < current_time ) {
|
if ( it->second.timeout < current_time ) {
|
||||||
MessageDef *message = itti_alloc_new_message(TASK_TIMER, TIMER_HAS_EXPIRED);
|
MessageDef *message = itti_alloc_new_message(TASK_TIMER, TIMER_HAS_EXPIRED);
|
||||||
message->ittiMsg.timer_has_expired.timer_id=it->first;
|
message->ittiMsg.timer_has_expired.timer_id=it->first;
|
||||||
|
|||||||
@@ -230,6 +230,7 @@ typedef struct IttiMsgText_s {
|
|||||||
#include <openair2/COMMON/sctp_messages_types.h>
|
#include <openair2/COMMON/sctp_messages_types.h>
|
||||||
#include <openair2/COMMON/udp_messages_types.h>
|
#include <openair2/COMMON/udp_messages_types.h>
|
||||||
#include <openair2/COMMON/gtpv1_u_messages_types.h>
|
#include <openair2/COMMON/gtpv1_u_messages_types.h>
|
||||||
|
#include <openair2/COMMON/ngap_messages_types.h>
|
||||||
#include <openair3/SCTP/sctp_eNB_task.h>
|
#include <openair3/SCTP/sctp_eNB_task.h>
|
||||||
#include <openair3/NAS/UE/nas_proc_defs.h>
|
#include <openair3/NAS/UE/nas_proc_defs.h>
|
||||||
#include <openair3/NAS/UE/ESM/esmData.h>
|
#include <openair3/NAS/UE/ESM/esmData.h>
|
||||||
@@ -260,6 +261,11 @@ typedef struct IttiMsgText_s {
|
|||||||
void *rrc_enb_process_itti_msg(void *);
|
void *rrc_enb_process_itti_msg(void *);
|
||||||
#include <openair3/SCTP/sctp_eNB_task.h>
|
#include <openair3/SCTP/sctp_eNB_task.h>
|
||||||
#include <openair3/S1AP/s1ap_eNB.h>
|
#include <openair3/S1AP/s1ap_eNB.h>
|
||||||
|
#include <openair3/NGAP/ngap_gNB.h>
|
||||||
|
|
||||||
|
#ifdef ITTI_SIM
|
||||||
|
#include <openair2/COMMON/itti_sim_messages_types.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
static const char *const messages_definition_xml = {
|
static const char *const messages_definition_xml = {
|
||||||
@@ -312,6 +318,7 @@ void * rrc_enb_process_msg(void*);
|
|||||||
TASK_DEF(TASK_RRC_GNB, TASK_PRIORITY_MED, 200, NULL,NULL)\
|
TASK_DEF(TASK_RRC_GNB, TASK_PRIORITY_MED, 200, NULL,NULL)\
|
||||||
TASK_DEF(TASK_RAL_ENB, TASK_PRIORITY_MED, 200, NULL, NULL) \
|
TASK_DEF(TASK_RAL_ENB, TASK_PRIORITY_MED, 200, NULL, NULL) \
|
||||||
TASK_DEF(TASK_S1AP, TASK_PRIORITY_MED, 200, NULL, NULL) \
|
TASK_DEF(TASK_S1AP, TASK_PRIORITY_MED, 200, NULL, NULL) \
|
||||||
|
TASK_DEF(TASK_NGAP, TASK_PRIORITY_MED, 200, NULL, NULL) \
|
||||||
TASK_DEF(TASK_X2AP, TASK_PRIORITY_MED, 200, NULL, NULL) \
|
TASK_DEF(TASK_X2AP, TASK_PRIORITY_MED, 200, NULL, NULL) \
|
||||||
TASK_DEF(TASK_M2AP_ENB, TASK_PRIORITY_MED, 200, NULL, NULL) \
|
TASK_DEF(TASK_M2AP_ENB, TASK_PRIORITY_MED, 200, NULL, NULL) \
|
||||||
TASK_DEF(TASK_M2AP_MCE, TASK_PRIORITY_MED, 200, NULL, NULL) \
|
TASK_DEF(TASK_M2AP_MCE, TASK_PRIORITY_MED, 200, NULL, NULL) \
|
||||||
@@ -329,6 +336,7 @@ void * rrc_enb_process_msg(void*);
|
|||||||
TASK_DEF(TASK_RLC_UE, TASK_PRIORITY_MED, 200, NULL, NULL) \
|
TASK_DEF(TASK_RLC_UE, TASK_PRIORITY_MED, 200, NULL, NULL) \
|
||||||
TASK_DEF(TASK_PDCP_UE, TASK_PRIORITY_MED, 200, NULL, NULL) \
|
TASK_DEF(TASK_PDCP_UE, TASK_PRIORITY_MED, 200, NULL, NULL) \
|
||||||
TASK_DEF(TASK_RRC_UE, TASK_PRIORITY_MED, 200, NULL, NULL) \
|
TASK_DEF(TASK_RRC_UE, TASK_PRIORITY_MED, 200, NULL, NULL) \
|
||||||
|
TASK_DEF(TASK_RRC_NRUE, TASK_PRIORITY_MED, 200, NULL, NULL) \
|
||||||
TASK_DEF(TASK_NAS_UE, TASK_PRIORITY_MED, 200, NULL, NULL) \
|
TASK_DEF(TASK_NAS_UE, TASK_PRIORITY_MED, 200, NULL, NULL) \
|
||||||
TASK_DEF(TASK_RAL_UE, TASK_PRIORITY_MED, 200, NULL, NULL) \
|
TASK_DEF(TASK_RAL_UE, TASK_PRIORITY_MED, 200, NULL, NULL) \
|
||||||
TASK_DEF(TASK_MSC, TASK_PRIORITY_MED, 200, NULL, NULL)\
|
TASK_DEF(TASK_MSC, TASK_PRIORITY_MED, 200, NULL, NULL)\
|
||||||
@@ -336,6 +344,8 @@ void * rrc_enb_process_msg(void*);
|
|||||||
TASK_DEF(TASK_UDP, TASK_PRIORITY_MED, 1000, NULL, NULL)\
|
TASK_DEF(TASK_UDP, TASK_PRIORITY_MED, 1000, NULL, NULL)\
|
||||||
TASK_DEF(TASK_CU_F1, TASK_PRIORITY_MED, 200, NULL, NULL) \
|
TASK_DEF(TASK_CU_F1, TASK_PRIORITY_MED, 200, NULL, NULL) \
|
||||||
TASK_DEF(TASK_DU_F1, TASK_PRIORITY_MED, 200, NULL, NULL) \
|
TASK_DEF(TASK_DU_F1, TASK_PRIORITY_MED, 200, NULL, NULL) \
|
||||||
|
TASK_DEF(TASK_RRC_UE_SIM, TASK_PRIORITY_MED, 200, NULL, NULL) \
|
||||||
|
TASK_DEF(TASK_RRC_GNB_SIM, TASK_PRIORITY_MED, 200, NULL, NULL) \
|
||||||
TASK_DEF(TASK_MAX, TASK_PRIORITY_MED, 200, NULL, NULL)
|
TASK_DEF(TASK_MAX, TASK_PRIORITY_MED, 200, NULL, NULL)
|
||||||
|
|
||||||
#define TASK_DEF(TaskID, pRIO, qUEUEsIZE, FuNc, ThreadFunc) { pRIO, qUEUEsIZE, #TaskID, FuNc, ThreadFunc },
|
#define TASK_DEF(TaskID, pRIO, qUEUEsIZE, FuNc, ThreadFunc) { pRIO, qUEUEsIZE, #TaskID, FuNc, ThreadFunc },
|
||||||
|
|||||||
@@ -92,7 +92,7 @@ void *one_thread(void *arg) {
|
|||||||
} while (true);
|
} while (true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void initTpool(char *params,tpool_t *pool, bool performanceMeas) {
|
void initNamedTpool(char *params,tpool_t *pool, bool performanceMeas, char *name) {
|
||||||
memset(pool,0,sizeof(*pool));
|
memset(pool,0,sizeof(*pool));
|
||||||
char *measr=getenv("threadPoolMeasurements");
|
char *measr=getenv("threadPoolMeasurements");
|
||||||
pool->measurePerf=performanceMeas;
|
pool->measurePerf=performanceMeas;
|
||||||
@@ -116,6 +116,7 @@ void initTpool(char *params,tpool_t *pool, bool performanceMeas) {
|
|||||||
pool->restrictRNTI=false;
|
pool->restrictRNTI=false;
|
||||||
curptr=strtok_r(parms_cpy,",",&saveptr);
|
curptr=strtok_r(parms_cpy,",",&saveptr);
|
||||||
struct one_thread * ptr;
|
struct one_thread * ptr;
|
||||||
|
char *tname = (name == NULL ? "Tpool" : name);
|
||||||
while ( curptr!=NULL ) {
|
while ( curptr!=NULL ) {
|
||||||
int c=toupper(curptr[0]);
|
int c=toupper(curptr[0]);
|
||||||
|
|
||||||
@@ -129,7 +130,7 @@ void initTpool(char *params,tpool_t *pool, bool performanceMeas) {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
ptr=pool->allthreads;
|
ptr=pool->allthreads;
|
||||||
pool->allthreads=(struct one_thread *)malloc(sizeof(struct one_thread));
|
pool->allthreads=(struct one_thread *)malloc(sizeof(struct one_thread));
|
||||||
pool->allthreads->next=ptr;
|
pool->allthreads->next=ptr;
|
||||||
printf("create a thread for core %d\n", atoi(curptr));
|
printf("create a thread for core %d\n", atoi(curptr));
|
||||||
@@ -138,7 +139,7 @@ void initTpool(char *params,tpool_t *pool, bool performanceMeas) {
|
|||||||
pool->allthreads->pool=pool;
|
pool->allthreads->pool=pool;
|
||||||
//Configure the thread scheduler policy for Linux
|
//Configure the thread scheduler policy for Linux
|
||||||
// set the thread name for debugging
|
// set the thread name for debugging
|
||||||
sprintf(pool->allthreads->name,"Tpool_%d",pool->allthreads->coreID);
|
sprintf(pool->allthreads->name,"%s%d_%d",tname,pool->nbThreads,pool->allthreads->coreID);
|
||||||
threadCreate(&pool->allthreads->threadID, one_thread, (void *)pool->allthreads,
|
threadCreate(&pool->allthreads->threadID, one_thread, (void *)pool->allthreads,
|
||||||
pool->allthreads->name, pool->allthreads->coreID, OAI_PRIORITY_RT);
|
pool->allthreads->name, pool->allthreads->coreID, OAI_PRIORITY_RT);
|
||||||
pool->nbThreads++;
|
pool->nbThreads++;
|
||||||
|
|||||||
@@ -45,7 +45,7 @@
|
|||||||
#define condwait(condition, mutex) AssertFatal(pthread_cond_wait(&condition, &mutex)==0,"");
|
#define condwait(condition, mutex) AssertFatal(pthread_cond_wait(&condition, &mutex)==0,"");
|
||||||
#define condbroadcast(signal) AssertFatal(pthread_cond_broadcast(&signal)==0,"");
|
#define condbroadcast(signal) AssertFatal(pthread_cond_broadcast(&signal)==0,"");
|
||||||
#define condsignal(signal) AssertFatal(pthread_cond_broadcast(&signal)==0,"");
|
#define condsignal(signal) AssertFatal(pthread_cond_broadcast(&signal)==0,"");
|
||||||
|
#define tpool_nbthreads(tpool) (tpool.nbThreads)
|
||||||
typedef struct notifiedFIFO_elt_s {
|
typedef struct notifiedFIFO_elt_s {
|
||||||
struct notifiedFIFO_elt_s *next;
|
struct notifiedFIFO_elt_s *next;
|
||||||
uint64_t key; //To filter out elements
|
uint64_t key; //To filter out elements
|
||||||
@@ -294,6 +294,6 @@ static inline int abortTpool(tpool_t *t, uint64_t key) {
|
|||||||
mutexunlock(nf->lockF);
|
mutexunlock(nf->lockF);
|
||||||
return nbRemoved;
|
return nbRemoved;
|
||||||
}
|
}
|
||||||
void initTpool(char *params,tpool_t *pool, bool performanceMeas);
|
void initNamedTpool(char *params,tpool_t *pool, bool performanceMeas, char *name);
|
||||||
|
#define initTpool(PARAMPTR,TPOOLPTR, MEASURFLAG) initNamedTpool(PARAMPTR,TPOOLPTR, MEASURFLAG, NULL)
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -112,13 +112,13 @@ No delete() call, same principle as not thread safe queues
|
|||||||
# Thread pools
|
# Thread pools
|
||||||
|
|
||||||
## initialization
|
## initialization
|
||||||
The clients can create one or more thread pools with init_tpool()
|
The clients can create one or more thread pools with `initTpool(char *params,tpool_t *pool, bool performanceMeas )` or `initNamedTpool(char *params,tpool_t *pool, bool performanceMeas , char *name)`
|
||||||
|
|
||||||
the params string structure: describes a list of cores, separated by "," that run a worker thread
|
the params string structure: describes a list of cores, separated by "," that run a worker thread
|
||||||
|
|
||||||
If the core exists on the CPU, the thread pool initialization sets the affinity between this thread and the related code (use negative values is allowed, so the thread will never be mapped on a specific core).
|
If the core exists on the CPU, the thread pool initialization sets the affinity between this thread and the related code (use negative values is allowed, so the thread will never be mapped on a specific core).
|
||||||
|
|
||||||
The threads are all Linux real time scheduler, their name is set automatically is "Tpool_<core id>"
|
The threads are all Linux real time scheduler, their name is set automatically to `Tpool<thread index>_<core id>` if initTpool is used or to `<name><thread index>_<core id>` when initNamedTpool is used.
|
||||||
|
|
||||||
## adding jobs
|
## adding jobs
|
||||||
The client create their jobs messages as a notifiedFIFO_elt_t, then they push it with pushTpool() (that internally calls push_notifiedFIFO())
|
The client create their jobs messages as a notifiedFIFO_elt_t, then they push it with pushTpool() (that internally calls push_notifiedFIFO())
|
||||||
@@ -132,11 +132,13 @@ A abort service abortTpool() allows to abort all jobs that match a key (see jobs
|
|||||||
Nevertheless, jobs already performed before the return of abortTpool() are pushed in the response Fifo queue.
|
Nevertheless, jobs already performed before the return of abortTpool() are pushed in the response Fifo queue.
|
||||||
|
|
||||||
## API details
|
## API details
|
||||||
Each thread pool (there can be several in the same process) should be initialized
|
Each thread pool (there can be several in the same process) should be initialized once using one of the two API's:
|
||||||
|
|
||||||
### initTpool(char *params,tpool_t *pool, bool performanceMeas) is to be called oncepool
|
### initNamedTpool(char *params,tpool_t *pool, bool performanceMeas,char *name)
|
||||||
|
|
||||||
the configuration parameter is a string, elements separated by ",":
|
### initTpool(char *params,tpool_t *pool, bool performanceMeas)
|
||||||
|
|
||||||
|
`params`: the configuration parameter is a string, elements separator is a comma ",". An element can be:
|
||||||
|
|
||||||
* N: if a N is in the parameter list, no threads are created
|
* N: if a N is in the parameter list, no threads are created
|
||||||
The purpose is to keep the same API in any case
|
The purpose is to keep the same API in any case
|
||||||
@@ -151,9 +153,11 @@ example: "-1,-1,-1"
|
|||||||
as there is no core number -1, the thread pool is made of 3 floating threads
|
as there is no core number -1, the thread pool is made of 3 floating threads
|
||||||
be careful with fix allocation: it is hard to be more clever than Linux kernel
|
be careful with fix allocation: it is hard to be more clever than Linux kernel
|
||||||
|
|
||||||
pool is the memory you allocated before to store the thread pool internal state (same concept as above queues)
|
`pool` is the memory you allocated before to store the thread pool internal state (same concept as above queues)
|
||||||
|
|
||||||
performanceMeas is a flag to enable measurements (well described in documentation)
|
`performanceMeas` is a flag to enable measurements (well described in documentation)
|
||||||
|
|
||||||
|
`name` is used to build the thread names.
|
||||||
|
|
||||||
### pushTpool(tpool_t *t, notifiedFIFO_elt_t *msg)
|
### pushTpool(tpool_t *t, notifiedFIFO_elt_t *msg)
|
||||||
|
|
||||||
|
|||||||
+4
-4
@@ -27,7 +27,7 @@ $ cd cmake_targets
|
|||||||
$ ./build_oai --eNB --UE
|
$ ./build_oai --eNB --UE
|
||||||
```
|
```
|
||||||
|
|
||||||
Both eNB (lte-softmodem) and UE (lte-uesoftmodem) are present on `cmake_targets/lte_build_oai/build` folder.
|
Both eNB (lte-softmodem) and UE (lte-uesoftmodem) are present on `cmake_targets/ran_build/build` folder.
|
||||||
|
|
||||||
More details are available on the [build page](BUILD.md).
|
More details are available on the [build page](BUILD.md).
|
||||||
|
|
||||||
@@ -50,7 +50,7 @@ Example 1: running in FDD mode with EPC.
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ source oaienv
|
$ source oaienv
|
||||||
$ cd cmake_targets/lte_build_oai/build
|
$ cd cmake_targets/ran_build/build
|
||||||
$ ENODEB=1 sudo -E ./lte-softmodem -O $OPENAIR_HOME/ci-scripts/conf_files/lte-fdd-basic-sim.conf --basicsim
|
$ ENODEB=1 sudo -E ./lte-softmodem -O $OPENAIR_HOME/ci-scripts/conf_files/lte-fdd-basic-sim.conf --basicsim
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -64,7 +64,7 @@ Example 2: running in TDD mode without any EPC.
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ source oaienv
|
$ source oaienv
|
||||||
$ cd cmake_targets/lte_build_oai/build
|
$ cd cmake_targets/ran_build/build
|
||||||
$ ENODEB=1 sudo -E ./lte-softmodem -O $OPENAIR_HOME/ci-scripts/conf_files/lte-tdd-basic-sim.conf --basicsim --noS1
|
$ ENODEB=1 sudo -E ./lte-softmodem -O $OPENAIR_HOME/ci-scripts/conf_files/lte-tdd-basic-sim.conf --basicsim --noS1
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -79,7 +79,7 @@ You need to set the correct OPC, USIM_API_K, MSIN (this is the end par of the IM
|
|||||||
```bash
|
```bash
|
||||||
$ source oaienv
|
$ source oaienv
|
||||||
# Edit openair3/NAS/TOOLS/ue_eurecom_test_sfr.conf
|
# Edit openair3/NAS/TOOLS/ue_eurecom_test_sfr.conf
|
||||||
$ cd cmake_targets/lte_build_oai/build
|
$ cd cmake_targets/ran_build/build
|
||||||
$ ../../nas_sim_tools/build/conf2uedata -c $OPENAIR_HOME/openair3/NAS/TOOLS/ue_eurecom_test_sfr.conf -o .
|
$ ../../nas_sim_tools/build/conf2uedata -c $OPENAIR_HOME/openair3/NAS/TOOLS/ue_eurecom_test_sfr.conf -o .
|
||||||
$ sudo -E ./lte-uesoftmodem -C 2625000000 -r 25 --ue-rxgain 140 --basicsim [--noS1]
|
$ sudo -E ./lte-uesoftmodem -C 2625000000 -r 25 --ue-rxgain 140 --basicsim [--noS1]
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -51,6 +51,19 @@ Calling the `build_oai` script with the -h option gives the list of all availabl
|
|||||||
|
|
||||||
# Building PHY Simulators
|
# Building PHY Simulators
|
||||||
|
|
||||||
|
The PHY layer simulators (LTE and NR) can be built as follows:
|
||||||
|
|
||||||
|
```
|
||||||
|
cd <your oai installation directory>/openairinterface5g/
|
||||||
|
source oaienv
|
||||||
|
cd cmake_targets/
|
||||||
|
./build_oai -I --phy_simulators
|
||||||
|
```
|
||||||
|
|
||||||
|
After completing the build, the binaries are available in the cmake_targets/phy_simulators/build directory.
|
||||||
|
A copy is also available in the target/bin directory, with all binaries suffixed by the 3GPP release number, today **.Rel15**.
|
||||||
|
|
||||||
|
|
||||||
Detailed information about these simulators can be found [in this dedicated page](https://gitlab.eurecom.fr/oai/openairinterface5g/wikis/OpenAirLTEPhySimul)
|
Detailed information about these simulators can be found [in this dedicated page](https://gitlab.eurecom.fr/oai/openairinterface5g/wikis/OpenAirLTEPhySimul)
|
||||||
|
|
||||||
# Building UEs, eNodeB and gNodeB Executables
|
# Building UEs, eNodeB and gNodeB Executables
|
||||||
|
|||||||
+10
-6
@@ -295,6 +295,7 @@ The following features are valid for the gNB and the 5G-NR UE.
|
|||||||
- NR RRC (38.331) Rel 15 messages using new asn1c
|
- NR RRC (38.331) Rel 15 messages using new asn1c
|
||||||
- LTE RRC (36.331) also updated to Rel 15
|
- LTE RRC (36.331) also updated to Rel 15
|
||||||
- Generation of CellGroupConfig (for eNB) and MIB
|
- Generation of CellGroupConfig (for eNB) and MIB
|
||||||
|
- Generation of system information block 1 (SIB1)
|
||||||
- Application to read configuration file and program gNB RRC
|
- Application to read configuration file and program gNB RRC
|
||||||
- RRC can configure PDCP, RLC, MAC
|
- RRC can configure PDCP, RLC, MAC
|
||||||
|
|
||||||
@@ -305,7 +306,8 @@ The following features are valid for the gNB and the 5G-NR UE.
|
|||||||
**gNB MAC**
|
**gNB MAC**
|
||||||
- MAC -> PHY configuration using NR FAPI P5 interface
|
- MAC -> PHY configuration using NR FAPI P5 interface
|
||||||
- MAC <-> PHY data interface using FAPI P7 interface for BCH PDU, DCI PDU, PDSCH PDU
|
- MAC <-> PHY data interface using FAPI P7 interface for BCH PDU, DCI PDU, PDSCH PDU
|
||||||
- Scheduler for RA procedreat gNB
|
- Scheduler procedures for SIB1
|
||||||
|
- Scheduler procedures for RA
|
||||||
- MAC downlink scheduler (fixed allocations)
|
- MAC downlink scheduler (fixed allocations)
|
||||||
- MAC header generation (including timing advance)
|
- MAC header generation (including timing advance)
|
||||||
- ACK / NACK handling and HARQ procedures for downlink
|
- ACK / NACK handling and HARQ procedures for downlink
|
||||||
@@ -350,11 +352,13 @@ The following features are valid for the gNB and the 5G-NR UE.
|
|||||||
|
|
||||||
## UE Higher Layers ##
|
## UE Higher Layers ##
|
||||||
|
|
||||||
**gNB MAC**
|
**UE MAC**
|
||||||
- Initial sync and MIB detection
|
* Minimum system information (MSI)
|
||||||
- MAC -> PHY configuration of PHY via UE FAPI P5 interface
|
- Initial sync and MIB detection
|
||||||
- Basic MAC to control PHY via UE FAPI P7 interface
|
- System information block 1 (SIB1) reception
|
||||||
- Random access procedure
|
* MAC -> PHY configuration of PHY via UE FAPI P5 interface
|
||||||
|
* Basic MAC to control PHY via UE FAPI P7 interface
|
||||||
|
* Random access procedure
|
||||||
|
|
||||||
|
|
||||||
**RLC**
|
**RLC**
|
||||||
|
|||||||
@@ -132,6 +132,40 @@ With the RF simulator (on the same machine):
|
|||||||
|
|
||||||
`sudo RFSIMULATOR=127.0.0.1 ./nr-uesoftmodem --do-ra --rfsim --parallel-config PARALLEL_SINGLE_THREAD`
|
`sudo RFSIMULATOR=127.0.0.1 ./nr-uesoftmodem --do-ra --rfsim --parallel-config PARALLEL_SINGLE_THREAD`
|
||||||
|
|
||||||
|
## sa setup with OAI
|
||||||
|
|
||||||
|
The sa flag is used to run gNB in standalone mode. Currently OAI in NR standalone mode transmits and receives SIB1.
|
||||||
|
|
||||||
|
In order to run gNB in standalone mode, the following flag is needed at gNB:
|
||||||
|
|
||||||
|
`--sa`
|
||||||
|
|
||||||
|
### Run OAI in sa mode
|
||||||
|
|
||||||
|
At the gNB the --sa flag does the following
|
||||||
|
- it reads the RRC configuration from the configuration file
|
||||||
|
- it encodes the RRCConfiguration and the RBconfig message and stores them in the binary files rbconfig.raw and reconfig.raw
|
||||||
|
- the RRC encodes SIB1 according the configuration file and transmits it through PDSCH
|
||||||
|
|
||||||
|
At the UE the --sa flag will
|
||||||
|
- read the binary files rbconfig.raw and reconfig.raw from the current directory (a different directory can be specified with the flag --rrc_config_path) and process them.
|
||||||
|
|
||||||
|
From the `cmake_targets/ran_build/build` folder:
|
||||||
|
|
||||||
|
gNB on machine 1:
|
||||||
|
|
||||||
|
`sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf --sa`
|
||||||
|
|
||||||
|
UE on machine 2:
|
||||||
|
|
||||||
|
`sudo ./nr-uesoftmodem --rrc_config_path . --sa`
|
||||||
|
|
||||||
|
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-uesoftmodem --rrc_config_path . --rfsim --sa`
|
||||||
|
|
||||||
## IF setup with OAI
|
## IF setup with OAI
|
||||||
|
|
||||||
The -C and -CO flags can be used together at UE side to set custom downlink and uplink FR1 intermediate frequencies for the IF equipment.
|
The -C and -CO flags can be used together at UE side to set custom downlink and uplink FR1 intermediate frequencies for the IF equipment.
|
||||||
|
|||||||
+116
-16
@@ -70,7 +70,7 @@ if the input is a UE RACH detection
|
|||||||
* nr_schedule_msg2()
|
* nr_schedule_msg2()
|
||||||
{: .func4}
|
{: .func4}
|
||||||
* handle_nr_uci()
|
* handle_nr_uci()
|
||||||
????
|
handles uplink control information, i.e., for the moment HARQ feedback.
|
||||||
{: .func4}
|
{: .func4}
|
||||||
* handle_nr_ulsch()
|
* handle_nr_ulsch()
|
||||||
handles ulsch data prepared by nr_fill_indication()
|
handles ulsch data prepared by nr_fill_indication()
|
||||||
@@ -143,7 +143,8 @@ the samples numbers are the future time for these samples emission on-air
|
|||||||
{: .func3}
|
{: .func3}
|
||||||
|
|
||||||
# Scheduler
|
# Scheduler
|
||||||
The scheduler is called by the chain: nr_ul_indication()=>gNB_dlsch_ulsch_scheduler()
|
|
||||||
|
The main scheduler function is called by the chain: nr_ul_indication()=>gNB_dlsch_ulsch_scheduler()
|
||||||
It calls sub functions to process each physical channel (rach, ...)
|
It calls sub functions to process each physical channel (rach, ...)
|
||||||
The scheduler uses and internal map of used RB: vrb_map and vrb_map_UL, so each specific channel scheduler can see the already filled RB in each subframe (the function gNB_dlsch_ulsch_scheduler() clears these two arrays when it starts)
|
The scheduler uses and internal map of used RB: vrb_map and vrb_map_UL, so each specific channel scheduler can see the already filled RB in each subframe (the function gNB_dlsch_ulsch_scheduler() clears these two arrays when it starts)
|
||||||
|
|
||||||
@@ -153,18 +154,71 @@ it sends a iiti message to activate the thread for RRC, the answer will be async
|
|||||||
|
|
||||||
Calls schedule_nr_mib() that calls mac_rrc_nr_data_req() to fill MIB,
|
Calls schedule_nr_mib() that calls mac_rrc_nr_data_req() to fill MIB,
|
||||||
|
|
||||||
Calls each channel allocation: schedule SI, schedule_ul, schedule_dl, ...
|
Calls schedule_nr_prach() which schedules the (fixed) PRACH region one frame in
|
||||||
this is a major entry for "phy-test" mode: in this mode, the allocation is fixed
|
advance.
|
||||||
all these channels goes to mac_rrc_nr_data_req() to get the data to transmit
|
|
||||||
|
|
||||||
nr_schedule_ue_spec() is called
|
Calls nr_csi_meas_reporting() to check when to schedule CSI in PUCCH.
|
||||||
* calls nr_simple_dlsch_preprocessor()=> mac_rlc_status_ind() mac_rlc_status_ind() locks and checks directly inside rlc data the quantity of waiting data. So, the scheduler can allocate RBs
|
|
||||||
* calls nr_update_pucch_scheduling()
|
|
||||||
* get_pdsch_to_harq_feedback() to schedule retransmission in DL
|
|
||||||
|
|
||||||
Calls nr_fill_nfapi_dl_pdu() to actually populate what should be done by the lower layers to make the Tx subframe
|
Calls nr_schedule_RA(): checks RA process 0's state. Schedules Msg.2 via
|
||||||
|
nr_generate_Msg2() if an RA process is ongoing, and pre-allocates the Msg. 3
|
||||||
|
for PUSCH as well.
|
||||||
|
|
||||||
|
Calls nr_schedule_ulsch(): It is divided into the "preprocessor" and the
|
||||||
|
"postprocessor": the first makes the scheduling decisions, the second fills
|
||||||
|
nFAPI structures to indicate to the PHY what it is supposed to do. To signal
|
||||||
|
which users have how many resources, the preprocessor populates the
|
||||||
|
NR_sched_pusch_t (for values changing every TTI, e.g., frequency domain
|
||||||
|
allocation) and NR_sched_pusch_save_t (for values changing less frequently, at
|
||||||
|
least in FR1 [to my understanding], e.g., DMRS fields when the time domain
|
||||||
|
allocation stays between TTIs) structures. Furthermore, the preprocessor is an
|
||||||
|
exchangeable module that might schedule differently, e.g., one user for
|
||||||
|
phytest, multiple users in FR1, or maybe FR2: phytest is in
|
||||||
|
nr_ul_preprocessor_phytest(), for FR1 is nr_simple_ulsch_preprocessor() [under
|
||||||
|
development], for FR2 does not exist yet.
|
||||||
|
* calls preprocessor via pre_processor_ul(): the preprocessor is responsible
|
||||||
|
for allocating CCEs (using allocate_nr_CCEs()). Note that we do not yet have
|
||||||
|
scheduling requests or buffer status reports, and only one UE. E.g.,
|
||||||
|
nr_simple_ulsch_preprocessor():
|
||||||
|
1) check whether the current frame/slot plus K2 is an UL slot, and return if
|
||||||
|
not.
|
||||||
|
2) Find first free start RB in vrb_map_UL, and as many free consecutive RBs
|
||||||
|
as possible.
|
||||||
|
3) allocate a CCE for the UE (and return if it is not possible)
|
||||||
|
4) Calculate DMRS stuff (nr_save_pusch_fields()) and the TBS.
|
||||||
|
5) Mark used resources in vrb_map_UL.
|
||||||
|
* loop through all users: get a free HARQ PID using select_ul_harq_pid() and
|
||||||
|
update statistics. Fill nFAPI structures directly for PUSCH, and call
|
||||||
|
config_uldci() and fill_dci_pdu_rel15() for DCI filling and PDCCH messages.
|
||||||
|
|
||||||
|
Calls nr_schedule_ue_spec(). It is divided into the "preprocessor" and the
|
||||||
|
"postprocessor": the first makes the scheduling decisions, the second fills
|
||||||
|
nFAPI structures to indicate to the PHY what it is supposed to do. To signal
|
||||||
|
which users have how many resources, the preprocessor populates the
|
||||||
|
NR_UE_sched_ctrl_t structure of affected users. In particular, the field rbSize
|
||||||
|
decides whether a user is to be allocated. Furthermore, the preprocessor is an
|
||||||
|
exchangeable module that might schedule differently, e.g., one user for
|
||||||
|
phytest, multiple users in FR1, or maybe FR2: phytest is in
|
||||||
|
nr_preprocessor_phytest(), for FR1 is nr_simple_dlsch_preprocessor() [under
|
||||||
|
development], for FR2 does not exist yet.
|
||||||
|
* calls preprocessor via pre_processor_dl(): the preprocessor is responsible
|
||||||
|
for allocating CCEs and PUCCH (using allocate_nr_CCEs() and
|
||||||
|
nr_acknack_scheduling()) and deciding on the frequency/time domain
|
||||||
|
allocation. E.g., nr_simple_dlsch_preprocessor():
|
||||||
|
1) mac_rlc_status_ind() locks and checks directly inside rlc data the
|
||||||
|
quantity of waiting data.
|
||||||
|
2) return from the preprocessor if there is no data and no timing advance to
|
||||||
|
send,
|
||||||
|
3) otherwise, allocate a CCE for the UE (and return if it is not possible)
|
||||||
|
4) find a PUCCH occasion for HARQ
|
||||||
|
5a) check if there is a retransmission: if yes, find free resources to
|
||||||
|
transmit using the same resources, else
|
||||||
|
5b) calculate the necessary RBs needed to get a TBS large enough to hold all
|
||||||
|
data, or until no more resources are available
|
||||||
|
6) Mark taken resources in the vrb_map
|
||||||
|
* loop through all users: check if a new TA is necessary. Then, if a user has
|
||||||
|
allocated resources, compute its TBS, and fill nFAPI structures
|
||||||
|
(nr_fill_nfapi_dl_pdu() to populate what should be done by the lower layers
|
||||||
|
to make the Tx subframe). Update statistics (round, sent bytes).
|
||||||
|
|
||||||
# RRC
|
# RRC
|
||||||
RRC is a regular thread with itti loop on queue: TASK_RRC_GNB
|
RRC is a regular thread with itti loop on queue: TASK_RRC_GNB
|
||||||
@@ -176,14 +230,56 @@ how does it communicate to scheduler ?
|
|||||||
|
|
||||||
|
|
||||||
# RLC
|
# RLC
|
||||||
RLC code is new implementation, not using OAI mechanisms: it is implmented directly on pthreads, ignoring OAI common functions.
|
RLC code is new implementation, not using OAI mechanisms: it is implemented directly on pthreads, ignoring OAI common functions.
|
||||||
It runs a thread waiting incoming data, but it is mainly running inside calling thread.
|
It is a library, running in thread RRC but also in PHY layer threads and some bits in pdcp running thread or F1 interface threads.
|
||||||
It is a library, running in thread RRC (except on itti message: F1AP_UL_RRC_MESSAGE for F1).
|
|
||||||
|
|
||||||
# NGAP
|
RLC data is isolated and encapsulated.
|
||||||
NGAP would be a itti thread as is S1AP (+twin thread SCTP that is almost void processing)?
|
It is stored under a global var: nr_rlc_ue_manager
|
||||||
About all messages are exchanged with RRC thread
|
The init function rlc_module_init() populates this global variable.
|
||||||
|
A small effort could lead us to return the pointer to the caller of rlc_module_init() (internal type: nr_rlc_ue_manager_internal_t)
|
||||||
|
but it returns void.
|
||||||
|
It could return the initialized pointer (as FILE* fopen() for example), then the RLC layer could have multiple instances in one process.
|
||||||
|
Even, a future evolution could remove this global rlc layer: rlc can be only a library that we create a instance for each UE because it doesn't shareany data between UEs.
|
||||||
|
|
||||||
|
For DL (respectively from UL in UE), the scheduler need to know the quantity of data waitin to be sent: it calls mac_rlc_status_ind()
|
||||||
|
That "peek" the size of the waiting data for a UE.
|
||||||
|
The scheduler then push orders to lower layers. The transport layer will actually pull data from RLC with: mac_rlc_data_req()
|
||||||
|
the low layer push data into rlc by: mac_rlc_data_ind()
|
||||||
|
Still on DL (gNB side), PDCP push incoming data into RLC by calling: rlc_data_req()
|
||||||
|
|
||||||
|
For UL, the low layer push data into rlc by: mac_rlc_data_ind()
|
||||||
|
Then, rlc push it to pdcp by calling pdcp_data_ind() from a complex rlc internal call back (deliver_sdu())
|
||||||
|
|
||||||
|
When adding a UE, external code have to call nr_rrc_rlc_config_asn1_req(), to remove it: rrc_rlc_remove_ue()
|
||||||
|
Inside UE, channels called drd or srb can be created: ??? and deleted: rrc_rlc_config_req()
|
||||||
|
|
||||||
|
nr_rlc_tick() must be called periodically to manage the internal timers
|
||||||
|
|
||||||
|
successful_delivery() and max_retx_reached(): in ??? trigger, the RLC sends a itti message to RRC: RLC_SDU_INDICATION (neutralized by #if 0 right now)
|
||||||
|
|
||||||
|
#PDCP
|
||||||
|
|
||||||
|
The PDCP implementation is also protected through a general mutex.
|
||||||
|
The design is very similar to rlc layer. The pdcp data is isolated and encapsulated.
|
||||||
|
|
||||||
|
pdcp_layer_init(): same as rlc init
|
||||||
|
we have to call a second init function: pdcp_module_init()
|
||||||
|
|
||||||
|
At Tx side (DL in gNB), pdcp_data_req() is the entry function that the upper layer calls.
|
||||||
|
The upper layer can be GTP or a PDCP internal thread enb_tun_read_thread() that read directly from Linux socket in case we skip 3GPP core implementation.
|
||||||
|
PDCP internals for pdcp_data_req() is thread safe: inside pdcp_data_req_drb(), the pdcp manager protects with the mutex the access to the SDU receiving function of PDCP (recv_sdu() callback, corresponding to nr_pdcp_entity_drb_am_recv_sdu() for DRBs). When it needs, the pdcp layer push this data to rlc by calling : rlc_data_req()
|
||||||
|
|
||||||
|
Also, incoming downlink sdu can comme from internal RRC: in this case, pdcp_run() reads a itti queue, for message RRC_DCCH_DATA_REQ, to0 only call 'pdcp_data_req()'
|
||||||
|
|
||||||
|
At Rx side, pdcp_data_ind() is the entry point that receives the data from RLC.
|
||||||
|
- Inside pdcp_data_ind(), the pdcp manager mutex protects the access to the PDU receiving function of PDCP (recv_pdu() callback corresponding to nr_pdcp_entity_drb_am_recv_pdu() for DRBs)
|
||||||
|
- Then deliver_sdu_drb() function sends the received data to GTP thread through an ITTI message (GTPV1U_ENB_TUNNEL_DATA_REQ).
|
||||||
|
|
||||||
|
pdcp_config_set_security(): not yet developped
|
||||||
|
|
||||||
|
nr_DRB_preconfiguration(): the mac layer calls this for ???
|
||||||
|
|
||||||
|
nr_rrc_pdcp_config_asn1_req() adds a UE in pdcp, pdcp_remove_UE() removes it
|
||||||
|
|
||||||
# GTP
|
# GTP
|
||||||
Gtp + UDP are two twin threads performing the data plane interface to the core network
|
Gtp + UDP are two twin threads performing the data plane interface to the core network
|
||||||
@@ -200,6 +296,10 @@ gtp thread calls directly pdcp_data_req(), so it runs inside it's context intern
|
|||||||
## inside other threads
|
## inside other threads
|
||||||
gtpv1u_create_s1u_tunnel(), delete tunnel, ... functions are called inside the other threads, without mutex.
|
gtpv1u_create_s1u_tunnel(), delete tunnel, ... functions are called inside the other threads, without mutex.
|
||||||
|
|
||||||
|
# NGAP
|
||||||
|
NGAP would be a itti thread as is S1AP (+twin thread SCTP that is almost void processing)?
|
||||||
|
About all messages are exchanged with RRC thread
|
||||||
|
|
||||||
|
|
||||||
<div class="panel panel-info">
|
<div class="panel panel-info">
|
||||||
**Note**
|
**Note**
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ WORKDIR /oai-ran
|
|||||||
#run build_oai to build the target image
|
#run build_oai to build the target image
|
||||||
RUN /bin/sh oaienv && \
|
RUN /bin/sh oaienv && \
|
||||||
cd cmake_targets && \
|
cd cmake_targets && \
|
||||||
|
rm -Rf log && \
|
||||||
mkdir -p log && \
|
mkdir -p log && \
|
||||||
./build_oai --eNB --ninja -w USRP
|
./build_oai --eNB --ninja -w USRP
|
||||||
|
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ WORKDIR /oai-ran
|
|||||||
#run build_oai to build the target image
|
#run build_oai to build the target image
|
||||||
RUN /bin/sh oaienv && \
|
RUN /bin/sh oaienv && \
|
||||||
cd cmake_targets && \
|
cd cmake_targets && \
|
||||||
|
rm -Rf log && \
|
||||||
mkdir -p log && \
|
mkdir -p log && \
|
||||||
./build_oai --eNB --ninja -w USRP
|
./build_oai --eNB --ninja -w USRP
|
||||||
|
|
||||||
|
|||||||
@@ -32,9 +32,14 @@ WORKDIR /oai-ran
|
|||||||
#run build_oai to build the target image
|
#run build_oai to build the target image
|
||||||
RUN /bin/sh oaienv && \
|
RUN /bin/sh oaienv && \
|
||||||
cd cmake_targets && \
|
cd cmake_targets && \
|
||||||
|
rm -Rf log && \
|
||||||
mkdir -p log && \
|
mkdir -p log && \
|
||||||
./build_oai --eNB --ninja -w USRP
|
./build_oai --eNB --ninja -w USRP
|
||||||
|
|
||||||
|
RUN apt-get install -y python3-pip && \
|
||||||
|
pip3 install --ignore-installed pyyaml && \
|
||||||
|
python3 ./docker/scripts/generateTemplate.py ./docker/scripts/enb_parameters.yaml
|
||||||
|
|
||||||
# debug
|
# debug
|
||||||
#RUN ldconfig -v && ldd /oai-ran/targets/bin/lte-softmodem.Rel15
|
#RUN ldconfig -v && ldd /oai-ran/targets/bin/lte-softmodem.Rel15
|
||||||
#RUN ls -ls /oai-ran/targets/bin
|
#RUN ls -ls /oai-ran/targets/bin
|
||||||
@@ -73,6 +78,7 @@ RUN apt-get update && \
|
|||||||
|
|
||||||
WORKDIR /opt/oai-enb/bin
|
WORKDIR /opt/oai-enb/bin
|
||||||
COPY --from=enb-build /oai-ran/targets/bin/lte-softmodem.Rel15 .
|
COPY --from=enb-build /oai-ran/targets/bin/lte-softmodem.Rel15 .
|
||||||
|
COPY --from=enb-build /oai-ran/docker/scripts/enb_entrypoint.sh entrypoint.sh
|
||||||
|
|
||||||
WORKDIR /usr/local/lib/
|
WORKDIR /usr/local/lib/
|
||||||
COPY --from=enb-build /oai-ran/targets/bin/liboai_eth_transpro.so.Rel15 .
|
COPY --from=enb-build /oai-ran/targets/bin/liboai_eth_transpro.so.Rel15 .
|
||||||
@@ -104,21 +110,17 @@ RUN ldconfig
|
|||||||
|
|
||||||
# Copy the relevant configuration files for eNB
|
# Copy the relevant configuration files for eNB
|
||||||
WORKDIR /opt/oai-enb/etc
|
WORKDIR /opt/oai-enb/etc
|
||||||
COPY --from=enb-build /oai-ran/ci-scripts/conf_files/enb.* ./
|
COPY --from=enb-build /oai-ran/docker/etc .
|
||||||
COPY --from=enb-build /oai-ran/ci-scripts/conf_files/rcc.* ./
|
|
||||||
COPY --from=enb-build /oai-ran/ci-scripts/conf_files/cu.* ./
|
|
||||||
COPY --from=enb-build /oai-ran/ci-scripts/conf_files/du.* ./
|
|
||||||
COPY --from=enb-build /oai-ran/ci-scripts/conf_files/rru.* ./
|
|
||||||
|
|
||||||
WORKDIR /opt/oai-enb
|
WORKDIR /opt/oai-enb
|
||||||
|
|
||||||
#EXPOSE 2152/udp # S1U, GTP/UDP
|
# 2152 --> S1U, GTP/UDP
|
||||||
|
# 36412 --> S1C, SCTP/UDP
|
||||||
|
# 36422 --> X2C, SCTP/UDP
|
||||||
|
EXPOSE 2152/udp 36412/udp 36422/udp
|
||||||
#EXPOSE 22100/tcp # ?
|
#EXPOSE 22100/tcp # ?
|
||||||
#EXPOSE 36412/udp # S1C, SCTP/UDP
|
|
||||||
#EXPOSE 36422/udp # X2C, SCTP/UDP
|
|
||||||
#EXPOSE 50000/udp # IF5 / ORI (control)
|
#EXPOSE 50000/udp # IF5 / ORI (control)
|
||||||
#EXPOSE 50001/udp # IF5 / ECPRI (data)
|
#EXPOSE 50001/udp # IF5 / ECPRI (data)
|
||||||
|
|
||||||
#CMD ["/opt/oai-enb/bin/lte-softmodem", "-O", "/opt/oai-enb/etc/enb.conf"]
|
ENTRYPOINT ["/opt/oai-enb/bin/entrypoint.sh"]
|
||||||
#ENTRYPOINT ["/opt/oai-enb/bin/entrypoint.sh"]
|
CMD ["/opt/oai-enb/bin/lte-softmodem.Rel15", "-O", "/opt/oai-enb/etc/enb.conf"]
|
||||||
CMD ["sleep", "infinity"]
|
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ WORKDIR /oai-ran
|
|||||||
#run build_oai to build the target image
|
#run build_oai to build the target image
|
||||||
RUN /bin/sh oaienv && \
|
RUN /bin/sh oaienv && \
|
||||||
cd cmake_targets && \
|
cd cmake_targets && \
|
||||||
|
rm -Rf log && \
|
||||||
mkdir -p log && \
|
mkdir -p log && \
|
||||||
./build_oai --gNB --ninja -w USRP
|
./build_oai --gNB --ninja -w USRP
|
||||||
|
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ WORKDIR /oai-ran
|
|||||||
#run build_oai to build the target image
|
#run build_oai to build the target image
|
||||||
RUN /bin/sh oaienv && \
|
RUN /bin/sh oaienv && \
|
||||||
cd cmake_targets && \
|
cd cmake_targets && \
|
||||||
|
rm -Rf log && \
|
||||||
mkdir -p log && \
|
mkdir -p log && \
|
||||||
./build_oai --gNB --ninja -w USRP
|
./build_oai --gNB --ninja -w USRP
|
||||||
|
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ WORKDIR /oai-ran
|
|||||||
#run build_oai to build the target image
|
#run build_oai to build the target image
|
||||||
RUN /bin/sh oaienv && \
|
RUN /bin/sh oaienv && \
|
||||||
cd cmake_targets && \
|
cd cmake_targets && \
|
||||||
|
rm -Rf log && \
|
||||||
mkdir -p log && \
|
mkdir -p log && \
|
||||||
./build_oai --gNB --ninja -w USRP
|
./build_oai --gNB --ninja -w USRP
|
||||||
|
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ WORKDIR /oai-ran
|
|||||||
#run build_oai to build the target image
|
#run build_oai to build the target image
|
||||||
RUN /bin/sh oaienv && \
|
RUN /bin/sh oaienv && \
|
||||||
cd cmake_targets && \
|
cd cmake_targets && \
|
||||||
|
rm -Rf log && \
|
||||||
mkdir -p log && \
|
mkdir -p log && \
|
||||||
./build_oai --UE --ninja -w USRP
|
./build_oai --UE --ninja -w USRP
|
||||||
|
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ WORKDIR /oai-ran
|
|||||||
#run build_oai to build the target image
|
#run build_oai to build the target image
|
||||||
RUN /bin/sh oaienv && \
|
RUN /bin/sh oaienv && \
|
||||||
cd cmake_targets && \
|
cd cmake_targets && \
|
||||||
|
rm -Rf log && \
|
||||||
mkdir -p log && \
|
mkdir -p log && \
|
||||||
./build_oai --UE --ninja -w USRP
|
./build_oai --UE --ninja -w USRP
|
||||||
|
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ WORKDIR /oai-ran
|
|||||||
#run build_oai to build the target image
|
#run build_oai to build the target image
|
||||||
RUN /bin/sh oaienv && \
|
RUN /bin/sh oaienv && \
|
||||||
cd cmake_targets && \
|
cd cmake_targets && \
|
||||||
|
rm -Rf log && \
|
||||||
mkdir -p log && \
|
mkdir -p log && \
|
||||||
./build_oai --UE --ninja -w USRP
|
./build_oai --UE --ninja -w USRP
|
||||||
|
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ WORKDIR /oai-ran
|
|||||||
#run build_oai to build the target image
|
#run build_oai to build the target image
|
||||||
RUN /bin/sh oaienv && \
|
RUN /bin/sh oaienv && \
|
||||||
cd cmake_targets && \
|
cd cmake_targets && \
|
||||||
|
rm -Rf log && \
|
||||||
mkdir -p log && \
|
mkdir -p log && \
|
||||||
./build_oai --nrUE --ninja -w USRP
|
./build_oai --nrUE --ninja -w USRP
|
||||||
|
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ WORKDIR /oai-ran
|
|||||||
#run build_oai to build the target image
|
#run build_oai to build the target image
|
||||||
RUN /bin/sh oaienv && \
|
RUN /bin/sh oaienv && \
|
||||||
cd cmake_targets && \
|
cd cmake_targets && \
|
||||||
|
rm -Rf log && \
|
||||||
mkdir -p log && \
|
mkdir -p log && \
|
||||||
./build_oai --nrUE --ninja -w USRP
|
./build_oai --nrUE --ninja -w USRP
|
||||||
|
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ WORKDIR /oai-ran
|
|||||||
#run build_oai to build the target image
|
#run build_oai to build the target image
|
||||||
RUN /bin/sh oaienv && \
|
RUN /bin/sh oaienv && \
|
||||||
cd cmake_targets && \
|
cd cmake_targets && \
|
||||||
|
rm -Rf log && \
|
||||||
mkdir -p log && \
|
mkdir -p log && \
|
||||||
./build_oai --nrUE --ninja -w USRP
|
./build_oai --nrUE --ninja -w USRP
|
||||||
|
|
||||||
|
|||||||
Executable
+65
@@ -0,0 +1,65 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
# Based another env var, pick one template to use
|
||||||
|
if [[ -v USE_FDD_CU ]]; then ln -s /opt/oai-enb/etc/cu.fdd.conf /opt/oai-enb/etc/enb.conf; fi
|
||||||
|
if [[ -v USE_FDD_DU ]]; then ln -s /opt/oai-enb/etc/du.fdd.conf /opt/oai-enb/etc/enb.conf; fi
|
||||||
|
if [[ -v USE_FDD_MONO ]]; then ln -s /opt/oai-enb/etc/enb.fdd.conf /opt/oai-enb/etc/enb.conf; fi
|
||||||
|
if [[ -v USE_TDD_MONO ]]; then ln -s /opt/oai-enb/etc/enb.tdd.conf /opt/oai-enb/etc/enb.conf; fi
|
||||||
|
if [[ -v USE_FDD_RCC ]]; then ln -s /opt/oai-enb/etc/rcc.if4p5.enb.fdd.conf /opt/oai-enb/etc/enb.conf; fi
|
||||||
|
if [[ -v USE_FDD_RRU ]]; then ln -s /opt/oai-enb/etc/rru.fdd.conf /opt/oai-enb/etc/enb.conf; fi
|
||||||
|
if [[ -v USE_TDD_RRU ]]; then ln -s /opt/oai-enb/etc/rru.tdd.conf /opt/oai-enb/etc/enb.conf; fi
|
||||||
|
|
||||||
|
# Only this template will be manipulated
|
||||||
|
CONFIG_FILES=`ls /opt/oai-enb/etc/enb.conf`
|
||||||
|
|
||||||
|
for c in ${CONFIG_FILES}; do
|
||||||
|
# grep variable names (format: ${VAR}) from template to be rendered
|
||||||
|
VARS=$(grep -oP '@[a-zA-Z0-9_]+@' ${c} | sort | uniq | xargs)
|
||||||
|
|
||||||
|
# create sed expressions for substituting each occurrence of ${VAR}
|
||||||
|
# with the value of the environment variable "VAR"
|
||||||
|
EXPRESSIONS=""
|
||||||
|
for v in ${VARS}; do
|
||||||
|
NEW_VAR=`echo $v | sed -e "s#@##g"`
|
||||||
|
if [[ "${!NEW_VAR}x" == "x" ]]; then
|
||||||
|
echo "Error: Environment variable '${NEW_VAR}' is not set." \
|
||||||
|
"Config file '$(basename $c)' requires all of $VARS."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
EXPRESSIONS="${EXPRESSIONS};s|${v}|${!NEW_VAR}|g"
|
||||||
|
done
|
||||||
|
EXPRESSIONS="${EXPRESSIONS#';'}"
|
||||||
|
|
||||||
|
# render template and inline replace config file
|
||||||
|
sed -i "${EXPRESSIONS}" ${c}
|
||||||
|
done
|
||||||
|
|
||||||
|
# Load the USRP binaries
|
||||||
|
if [[ -v USE_B2XX ]]; then
|
||||||
|
/usr/lib/uhd/utils/uhd_images_downloader.py -t b2xx
|
||||||
|
elif [[ -v USE_X3XX ]]; then
|
||||||
|
/usr/lib/uhd/utils/uhd_images_downloader.py -t x3xx
|
||||||
|
elif [[ -v USE_N3XX ]]; then
|
||||||
|
/usr/lib/uhd/utils/uhd_images_downloader.py -t n3xx
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "=================================="
|
||||||
|
echo "== Starting eNB soft modem"
|
||||||
|
if [[ -v USE_ADDITIONAL_OPTIONS ]]; then
|
||||||
|
echo "Additional option(s): ${USE_ADDITIONAL_OPTIONS}"
|
||||||
|
new_args=()
|
||||||
|
while [[ $# -gt 0 ]]; do
|
||||||
|
new_args+=("$1")
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
for word in ${USE_ADDITIONAL_OPTIONS}; do
|
||||||
|
new_args+=("$word")
|
||||||
|
done
|
||||||
|
echo "${new_args[@]}"
|
||||||
|
exec "${new_args[@]}"
|
||||||
|
else
|
||||||
|
echo "$@"
|
||||||
|
exec "$@"
|
||||||
|
fi
|
||||||
@@ -0,0 +1,248 @@
|
|||||||
|
#/*
|
||||||
|
# * 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
|
||||||
|
# */
|
||||||
|
|
||||||
|
---
|
||||||
|
- paths:
|
||||||
|
source_dir: "ci-scripts/conf_files/"
|
||||||
|
dest_dir: docker/etc
|
||||||
|
|
||||||
|
- configurations:
|
||||||
|
- filePrefix: cu
|
||||||
|
outputfilename: "cu.fdd.conf"
|
||||||
|
config:
|
||||||
|
- key: Active_eNBs
|
||||||
|
env: "@ENB_NAME@"
|
||||||
|
- key: eNB_name
|
||||||
|
env: "@ENB_NAME@"
|
||||||
|
- key: plmn_list
|
||||||
|
env:
|
||||||
|
mcc: "@MCC@"
|
||||||
|
mnc: "@MNC@"
|
||||||
|
mnc_length: "@MNC_LENGTH@"
|
||||||
|
- key: tracking_area_code
|
||||||
|
env: "@TAC@"
|
||||||
|
- key: local_s_if_name
|
||||||
|
env: "@F1_IF_NAME@"
|
||||||
|
- key: remote_s_address
|
||||||
|
env: "@F1_DU_IP_ADDRESS@"
|
||||||
|
- key: local_s_address
|
||||||
|
env: "@F1_CU_IP_ADDRESS@"
|
||||||
|
- key: eutra_band
|
||||||
|
env: "@UTRA_BAND_ID@"
|
||||||
|
- key: downlink_frequency
|
||||||
|
env: "@DL_FREQUENCY_IN_MHZ@000000"
|
||||||
|
- key: uplink_frequency_offset
|
||||||
|
env: "@UL_FREQUENCY_OFFSET_IN_MHZ@000000"
|
||||||
|
- key: Nid_cell
|
||||||
|
env: "@NID_CELL@"
|
||||||
|
- key: N_RB_DL
|
||||||
|
env: "@NB_PRB@"
|
||||||
|
- key: ipv4
|
||||||
|
env: "@MME_S1C_IP_ADDRESS@"
|
||||||
|
- key: ENB_INTERFACE_NAME_FOR_S1_MME
|
||||||
|
env: "@S1C_IF_NAME@"
|
||||||
|
- key: ENB_IPV4_ADDRESS_FOR_S1_MME
|
||||||
|
env: "@F1_CU_IP_ADDRESS@"
|
||||||
|
- key: ENB_INTERFACE_NAME_FOR_S1U
|
||||||
|
env: "@S1U_IF_NAME@"
|
||||||
|
- key: ENB_IPV4_ADDRESS_FOR_S1U
|
||||||
|
env: "@F1_CU_IP_ADDRESS@"
|
||||||
|
- key: ENB_IPV4_ADDRESS_FOR_X2C
|
||||||
|
env: "@F1_CU_IP_ADDRESS@"
|
||||||
|
|
||||||
|
- filePrefix: du
|
||||||
|
outputfilename: "du.fdd.conf"
|
||||||
|
config:
|
||||||
|
- key: Active_eNBs
|
||||||
|
env: "@ENB_NAME@"
|
||||||
|
- key: eNB_name
|
||||||
|
env: "@ENB_NAME@"
|
||||||
|
- key: plmn_list
|
||||||
|
env:
|
||||||
|
mcc: "@MCC@"
|
||||||
|
mnc: "@MNC@"
|
||||||
|
mnc_length: "@MNC_LENGTH@"
|
||||||
|
- key: tracking_area_code
|
||||||
|
env: "@TAC@"
|
||||||
|
- key: local_n_if_name
|
||||||
|
env: "@F1_IF_NAME@"
|
||||||
|
- key: remote_n_address
|
||||||
|
env: "@F1_DU_IP_ADDRESS@"
|
||||||
|
- key: local_n_address
|
||||||
|
env: "@F1_CU_IP_ADDRESS@"
|
||||||
|
- key: eutra_band
|
||||||
|
env: "@UTRA_BAND_ID@"
|
||||||
|
- key: downlink_frequency
|
||||||
|
env: "@DL_FREQUENCY_IN_MHZ@000000"
|
||||||
|
- key: uplink_frequency_offset
|
||||||
|
env: "@UL_FREQUENCY_OFFSET_IN_MHZ@000000"
|
||||||
|
- key: Nid_cell
|
||||||
|
env: "@NID_CELL@"
|
||||||
|
- key: N_RB_DL
|
||||||
|
env: "@NB_PRB@"
|
||||||
|
|
||||||
|
- filePrefix: rru.fdd
|
||||||
|
outputfilename: "rru.fdd.conf"
|
||||||
|
config:
|
||||||
|
- key: local_if_name
|
||||||
|
env: "@RRU_IF4P5_IF_NAME@"
|
||||||
|
- key: remote_address
|
||||||
|
env: "@RCC_REMOTE_IP_ADDRESS@"
|
||||||
|
- key: local_address
|
||||||
|
env: "@RRU_LOCAL_IP_ADDRESS@"
|
||||||
|
- key: bands
|
||||||
|
env: "@UTRA_BAND_ID@"
|
||||||
|
|
||||||
|
- filePrefix: rru.tdd
|
||||||
|
outputfilename: "rru.tdd.conf"
|
||||||
|
config:
|
||||||
|
- key: local_if_name
|
||||||
|
env: "@RRU_IF4P5_IF_NAME@"
|
||||||
|
- key: remote_address
|
||||||
|
env: "@RCC_REMOTE_IP_ADDRESS@"
|
||||||
|
- key: local_address
|
||||||
|
env: "@RRU_LOCAL_IP_ADDRESS@"
|
||||||
|
- key: bands
|
||||||
|
env: "@UTRA_BAND_ID@"
|
||||||
|
|
||||||
|
- filePrefix: enb.band7.tm1.25PRB.usrpb210
|
||||||
|
outputfilename: "enb.fdd.conf"
|
||||||
|
config:
|
||||||
|
- key: Active_eNBs
|
||||||
|
env: "@ENB_NAME@"
|
||||||
|
- key: eNB_name
|
||||||
|
env: "@ENB_NAME@"
|
||||||
|
- key: plmn_list
|
||||||
|
env:
|
||||||
|
mcc: "@MCC@"
|
||||||
|
mnc: "@MNC@"
|
||||||
|
mnc_length: "@MNC_LENGTH@"
|
||||||
|
- key: tracking_area_code
|
||||||
|
env: "@TAC@"
|
||||||
|
- key: eutra_band
|
||||||
|
env: "@UTRA_BAND_ID@"
|
||||||
|
- key: downlink_frequency
|
||||||
|
env: "@DL_FREQUENCY_IN_MHZ@000000"
|
||||||
|
- key: uplink_frequency_offset
|
||||||
|
env: "@UL_FREQUENCY_OFFSET_IN_MHZ@000000"
|
||||||
|
- key: Nid_cell
|
||||||
|
env: "@NID_CELL@"
|
||||||
|
- key: N_RB_DL
|
||||||
|
env: "@NB_PRB@"
|
||||||
|
- key: ipv4
|
||||||
|
env: "@MME_S1C_IP_ADDRESS@"
|
||||||
|
- key: ENB_INTERFACE_NAME_FOR_S1_MME
|
||||||
|
env: "@ENB_S1C_IF_NAME@"
|
||||||
|
- key: ENB_IPV4_ADDRESS_FOR_S1_MME
|
||||||
|
env: "@ENB_S1C_IP_ADDRESS@"
|
||||||
|
- key: ENB_INTERFACE_NAME_FOR_S1U
|
||||||
|
env: "@ENB_S1U_IF_NAME@"
|
||||||
|
- key: ENB_IPV4_ADDRESS_FOR_S1U
|
||||||
|
env: "@ENB_S1U_IP_ADDRESS@"
|
||||||
|
- key: ENB_IPV4_ADDRESS_FOR_X2C
|
||||||
|
env: "@ENB_X2_IP_ADDRESS@"
|
||||||
|
- key: FLEXRAN_ENABLED
|
||||||
|
env: "@FLEXRAN_ENABLED@"
|
||||||
|
- key: FLEXRAN_INTERFACE_NAME
|
||||||
|
env: "@FLEXRAN_INTERFACE_NAME@"
|
||||||
|
- key: FLEXRAN_IPV4_ADDRESS
|
||||||
|
env: "@FLEXRAN_IPV4_ADDRESS@"
|
||||||
|
|
||||||
|
- filePrefix: enb.band40.tm1.25PRB.FairScheduler.usrpb210
|
||||||
|
outputfilename: "enb.tdd.conf"
|
||||||
|
config:
|
||||||
|
- key: Active_eNBs
|
||||||
|
env: "@ENB_NAME@"
|
||||||
|
- key: eNB_name
|
||||||
|
env: "@ENB_NAME@"
|
||||||
|
- key: plmn_list
|
||||||
|
env:
|
||||||
|
mcc: "@MCC@"
|
||||||
|
mnc: "@MNC@"
|
||||||
|
mnc_length: "@MNC_LENGTH@"
|
||||||
|
- key: tracking_area_code
|
||||||
|
env: "@TAC@"
|
||||||
|
- key: eutra_band
|
||||||
|
env: "@UTRA_BAND_ID@"
|
||||||
|
- key: downlink_frequency
|
||||||
|
env: "@DL_FREQUENCY_IN_MHZ@000000"
|
||||||
|
- key: uplink_frequency_offset
|
||||||
|
env: "@UL_FREQUENCY_OFFSET_IN_MHZ@000000"
|
||||||
|
- key: Nid_cell
|
||||||
|
env: "@NID_CELL@"
|
||||||
|
- key: N_RB_DL
|
||||||
|
env: "@NB_PRB@"
|
||||||
|
- key: ipv4
|
||||||
|
env: "@MME_S1C_IP_ADDRESS@"
|
||||||
|
- key: ENB_INTERFACE_NAME_FOR_S1_MME
|
||||||
|
env: "@S1C_IF_NAME@"
|
||||||
|
- key: ENB_IPV4_ADDRESS_FOR_S1_MME
|
||||||
|
env: "@F1_CU_IP_ADDRESS@"
|
||||||
|
- key: ENB_INTERFACE_NAME_FOR_S1U
|
||||||
|
env: "@S1U_IF_NAME@"
|
||||||
|
- key: ENB_IPV4_ADDRESS_FOR_S1U
|
||||||
|
env: "@F1_CU_IP_ADDRESS@"
|
||||||
|
- key: ENB_IPV4_ADDRESS_FOR_X2C
|
||||||
|
env: "@F1_CU_IP_ADDRESS@"
|
||||||
|
|
||||||
|
- filePrefix: "rcc.band7.tm1.nfapi"
|
||||||
|
outputfilename: "rcc.if4p5.enb.fdd.conf"
|
||||||
|
config:
|
||||||
|
- key: Active_eNBs
|
||||||
|
env: "@ENB_NAME@"
|
||||||
|
- key: eNB_name
|
||||||
|
env: "@ENB_NAME@"
|
||||||
|
- key: plmn_list
|
||||||
|
env:
|
||||||
|
mcc: "@MCC@"
|
||||||
|
mnc: "@MNC@"
|
||||||
|
mnc_length: "@MNC_LENGTH@"
|
||||||
|
- key: tracking_area_code
|
||||||
|
env: "@TAC@"
|
||||||
|
- key: local_s_if_name
|
||||||
|
env: "@F1_IF_NAME@"
|
||||||
|
- key: remote_s_address
|
||||||
|
env: "@F1_DU_IP_ADDRESS@"
|
||||||
|
- key: local_s_address
|
||||||
|
env: "@F1_CU_IP_ADDRESS@"
|
||||||
|
- key: eutra_band
|
||||||
|
env: "@UTRA_BAND_ID@"
|
||||||
|
- key: downlink_frequency
|
||||||
|
env: "@DL_FREQUENCY_IN_MHZ@000000"
|
||||||
|
- key: uplink_frequency_offset
|
||||||
|
env: "@UL_FREQUENCY_OFFSET_IN_MHZ@000000"
|
||||||
|
- key: Nid_cell
|
||||||
|
env: "@NID_CELL@"
|
||||||
|
- key: N_RB_DL
|
||||||
|
env: "@NB_PRB@"
|
||||||
|
- key: ipv4
|
||||||
|
env: "@MME_S1C_IP_ADDRESS@"
|
||||||
|
- key: ENB_INTERFACE_NAME_FOR_S1_MME
|
||||||
|
env: "@S1C_IF_NAME@"
|
||||||
|
- key: ENB_IPV4_ADDRESS_FOR_S1_MME
|
||||||
|
env: "@F1_CU_IP_ADDRESS@"
|
||||||
|
- key: ENB_INTERFACE_NAME_FOR_S1U
|
||||||
|
env: "@S1U_IF_NAME@"
|
||||||
|
- key: ENB_IPV4_ADDRESS_FOR_S1U
|
||||||
|
env: "@F1_CU_IP_ADDRESS@"
|
||||||
|
- key: ENB_IPV4_ADDRESS_FOR_X2C
|
||||||
|
env: "@F1_CU_IP_ADDRESS@"
|
||||||
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user