Merge develop(w51 2) to nfapi_nr
Setting of nFAPI mode in NR yet to be updated
This commit is contained in:
@@ -40,7 +40,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
|
||||||
@@ -78,6 +78,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)
|
||||||
@@ -89,6 +90,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)
|
||||||
@@ -98,6 +100,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)
|
||||||
@@ -107,6 +110,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)
|
||||||
@@ -116,50 +120,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)
|
||||||
|
|||||||
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)
|
||||||
|
|
||||||
+173
-49
@@ -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
|
||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
@@ -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()
|
||||||
@@ -1400,14 +1459,23 @@ class OaiCiTest():
|
|||||||
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:
|
else:
|
||||||
SSH.command('echo $USER; nohup iperf -s -i 1 -p ' + str(port) + ' > iperf_server_' + self.testCase_id + '_' + device_id + '.log &', EPC.UserName, 5)
|
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:
|
||||||
|
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,6 +2105,9 @@ 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)
|
||||||
|
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.command('killall --signal SIGKILL iperf', EPC.UserName, 5)
|
||||||
SSH.close()
|
SSH.close()
|
||||||
else:
|
else:
|
||||||
@@ -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'
|
||||||
|
try:
|
||||||
subprocess.run(cmd, shell=True)
|
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):
|
||||||
|
|||||||
@@ -215,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";
|
||||||
|
|||||||
@@ -215,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";
|
||||||
|
|||||||
@@ -215,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";
|
||||||
|
|||||||
@@ -239,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";
|
||||||
|
|||||||
@@ -448,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";
|
||||||
|
|||||||
@@ -251,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";
|
||||||
|
|||||||
@@ -395,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";
|
||||||
|
|||||||
@@ -228,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";
|
||||||
|
|||||||
@@ -228,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";
|
||||||
|
|||||||
@@ -228,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";
|
||||||
|
|||||||
@@ -226,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";
|
||||||
|
|||||||
@@ -247,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";
|
||||||
|
|||||||
@@ -256,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";
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ eNBs =
|
|||||||
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";
|
||||||
@@ -66,10 +66,12 @@ eNBs =
|
|||||||
phich_duration = "NORMAL";
|
phich_duration = "NORMAL";
|
||||||
phich_resource = "ONESIXTH";
|
phich_resource = "ONESIXTH";
|
||||||
srs_enable = "DISABLE";
|
srs_enable = "DISABLE";
|
||||||
/* srs_BandwidthConfig =;
|
/*
|
||||||
|
srs_BandwidthConfig =;
|
||||||
srs_SubframeConfig =;
|
srs_SubframeConfig =;
|
||||||
srs_ackNackST =;
|
srs_ackNackST =;
|
||||||
srs_MaxUpPts =;*/
|
srs_MaxUpPts =;
|
||||||
|
*/
|
||||||
|
|
||||||
pusch_p0_Nominal = -96;
|
pusch_p0_Nominal = -96;
|
||||||
pusch_alpha = "AL1";
|
pusch_alpha = "AL1";
|
||||||
@@ -119,7 +121,8 @@ eNBs =
|
|||||||
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_hoppingParameter = 0;
|
||||||
rxPool_dataHoppingConfig_numSubbands = "ns1";
|
rxPool_dataHoppingConfig_numSubbands = "ns1";
|
||||||
rxPool_dataHoppingConfig_rbOffset = 0;
|
rxPool_dataHoppingConfig_rbOffset = 0;
|
||||||
rxPool_commTxResourceUC-ReqAllowed = "TRUE";
|
rxPool_commTxResourceUC-ReqAllowed = "TRUE";
|
||||||
@@ -136,7 +139,7 @@ eNBs =
|
|||||||
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;
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -204,7 +207,8 @@ eNBs =
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
MACRLCs = (
|
MACRLCs =
|
||||||
|
(
|
||||||
{
|
{
|
||||||
num_cc = 1;
|
num_cc = 1;
|
||||||
tr_s_preference = "local_L1";
|
tr_s_preference = "local_L1";
|
||||||
@@ -215,14 +219,16 @@ MACRLCs = (
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
L1s = (
|
L1s =
|
||||||
|
(
|
||||||
{
|
{
|
||||||
num_cc = 1;
|
num_cc = 1;
|
||||||
tr_n_preference = "local_mac";
|
tr_n_preference = "local_mac";
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
RUs = (
|
RUs =
|
||||||
|
(
|
||||||
{
|
{
|
||||||
local_rf = "yes"
|
local_rf = "yes"
|
||||||
nb_tx = 1
|
nb_tx = 1
|
||||||
@@ -233,11 +239,11 @@ RUs = (
|
|||||||
max_pdschReferenceSignalPower = -27;
|
max_pdschReferenceSignalPower = -27;
|
||||||
max_rxgain = 125;
|
max_rxgain = 125;
|
||||||
eNB_instances = [0];
|
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";
|
||||||
@@ -250,14 +256,14 @@ 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";
|
||||||
@@ -272,5 +278,5 @@ NETWORK_CONTROLLER :
|
|||||||
pdcp_log_verbosity ="medium";
|
pdcp_log_verbosity ="medium";
|
||||||
rrc_log_level ="info";
|
rrc_log_level ="info";
|
||||||
rrc_log_verbosity ="medium";
|
rrc_log_verbosity ="medium";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -255,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
+1
-1
@@ -266,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";
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -249,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";
|
||||||
|
|||||||
@@ -244,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";
|
||||||
|
|||||||
Executable → Regular
+6
-1
@@ -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,6 +23,9 @@ gNBs =
|
|||||||
|
|
||||||
ssb_SubcarrierOffset = 31; //0;
|
ssb_SubcarrierOffset = 31; //0;
|
||||||
pdsch_AntennaPorts = 1;
|
pdsch_AntennaPorts = 1;
|
||||||
|
pusch_TargetSNRx10 = 200;
|
||||||
|
pucch_TargetSNRx10 = 200;
|
||||||
|
|
||||||
|
|
||||||
servingCellConfigCommon = (
|
servingCellConfigCommon = (
|
||||||
{
|
{
|
||||||
@@ -260,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";
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -235,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";
|
||||||
|
|||||||
@@ -235,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";
|
||||||
|
|||||||
@@ -235,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";
|
||||||
|
|||||||
@@ -254,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";
|
||||||
|
|||||||
@@ -254,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";
|
||||||
|
|||||||
@@ -254,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";
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
RUs = (
|
RUs =
|
||||||
|
(
|
||||||
{
|
{
|
||||||
local_if_name = "lo";
|
local_if_name = "lo";
|
||||||
remote_address = "127.0.0.1"
|
remote_address = "127.0.0.1"
|
||||||
@@ -17,7 +18,8 @@ RUs = (
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
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,7 +28,8 @@ THREAD_STRUCT = (
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
log_config = {
|
log_config =
|
||||||
|
{
|
||||||
global_log_level ="error";
|
global_log_level ="error";
|
||||||
global_log_verbosity ="medium";
|
global_log_verbosity ="medium";
|
||||||
hw_log_level ="error";
|
hw_log_level ="error";
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
RUs = (
|
RUs =
|
||||||
|
(
|
||||||
{
|
{
|
||||||
local_if_name = "lo";
|
local_if_name = "lo";
|
||||||
remote_address = "127.0.0.1"
|
remote_address = "127.0.0.1"
|
||||||
@@ -17,7 +18,8 @@ RUs = (
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
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,7 +28,8 @@ THREAD_STRUCT = (
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
log_config = {
|
log_config =
|
||||||
|
{
|
||||||
global_log_level ="error";
|
global_log_level ="error";
|
||||||
global_log_verbosity ="medium";
|
global_log_verbosity ="medium";
|
||||||
hw_log_level ="error";
|
hw_log_level ="error";
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
+191
-26
@@ -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,6 +551,14 @@ 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 inspect prod-oai-hss', '\$', 10)
|
||||||
|
result = re.search('No such object', mySSH.getBefore())
|
||||||
|
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:/openair-hss/hss_check_run.log .', '\$', 60)
|
||||||
mySSH.command('docker cp ' + self.containerPrefix + '-oai-hss:/tmp/hss_check_run.pcap .', '\$', 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)
|
mySSH.command('zip hss.log.zip hss_check_run.*', '\$', 60)
|
||||||
@@ -432,6 +581,14 @@ 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 inspect prod-oai-mme', '\$', 10)
|
||||||
|
result = re.search('No such object', mySSH.getBefore())
|
||||||
|
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:/openair-mme/mme_check_run.log .', '\$', 60)
|
||||||
mySSH.command('docker cp ' + self.containerPrefix + '-oai-mme:/tmp/mme_check_run.pcap .', '\$', 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)
|
mySSH.command('zip mme.log.zip mme_check_run.*', '\$', 60)
|
||||||
@@ -451,6 +608,14 @@ 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 inspect prod-oai-mme', '\$', 10)
|
||||||
|
result = re.search('No such object', mySSH.getBefore())
|
||||||
|
if result is not None:
|
||||||
|
mySSH.command('cd ../logs', '\$', 5)
|
||||||
|
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-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-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-spgwc:/tmp/spgwc_check_run.pcap .', '\$', 60)
|
||||||
|
|||||||
+87
-44
@@ -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
|
||||||
@@ -97,24 +98,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
|
||||||
@@ -131,9 +142,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')
|
||||||
@@ -142,9 +155,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')
|
||||||
@@ -161,9 +176,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')
|
||||||
@@ -287,6 +304,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')
|
||||||
|
|
||||||
@@ -338,11 +376,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
|
||||||
|
|
||||||
@@ -353,7 +387,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)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -382,10 +416,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)
|
||||||
@@ -397,22 +431,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)
|
||||||
@@ -494,7 +528,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 == '':
|
||||||
@@ -565,7 +599,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
|
||||||
@@ -625,17 +659,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':
|
||||||
@@ -655,17 +688,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':
|
||||||
@@ -673,17 +706,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':
|
||||||
@@ -697,6 +734,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:
|
||||||
@@ -706,14 +749,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
|
||||||
|
|||||||
+91
-84
@@ -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,8 +390,7 @@ 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);
|
||||||
@@ -409,8 +398,9 @@ class RANManagement():
|
|||||||
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,6 +693,10 @@ 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
|
||||||
@@ -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'):
|
||||||
@@ -902,6 +899,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=''
|
||||||
@@ -1017,8 +1025,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/) {
|
||||||
|
if ($0 ~/KBytes/) {
|
||||||
|
split($0,a,"KBytes")
|
||||||
|
} else {
|
||||||
split($0,a,"MBytes")
|
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
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|
||||||
+17
-21
@@ -31,9 +31,9 @@
|
|||||||
010001
|
010001
|
||||||
000001
|
000001
|
||||||
050000
|
050000
|
||||||
050001
|
000001
|
||||||
050002
|
060000
|
||||||
050003
|
060001
|
||||||
000001
|
000001
|
||||||
010002
|
010002
|
||||||
000001
|
000001
|
||||||
@@ -93,30 +93,26 @@
|
|||||||
<class>Ping</class>
|
<class>Ping</class>
|
||||||
<desc>Ping: 20pings in 20sec</desc>
|
<desc>Ping: 20pings in 20sec</desc>
|
||||||
<ping_args>-c 20</ping_args>
|
<ping_args>-c 20</ping_args>
|
||||||
<ping_packetloss_threshold>0</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>0</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>
|
||||||
|
|
||||||
<testCase id="050002">
|
<testCase id="060001">
|
||||||
<class>Ping</class>
|
<class>Iperf</class>
|
||||||
<desc>Ping: 100pings in 20sec</desc>
|
<desc>iperf (UL/1.5Mbps/UDP)(60 sec)(single-ue profile)</desc>
|
||||||
<ping_args>-c 100 -i 0.2</ping_args>
|
<iperf_args>-u -b 1.5M -t 60 -i 1 -R</iperf_args>
|
||||||
<ping_packetloss_threshold>0</ping_packetloss_threshold>
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
<testCase id="050003">$
|
|
||||||
<class>Ping</class>$
|
|
||||||
<desc>Ping: 100pings in 20sec size 1000</desc>$
|
|
||||||
<ping_args>-c 100 -i 0.2 -s 1000</ping_args>$
|
|
||||||
<ping_packetloss_threshold>0</ping_packetloss_threshold>$
|
|
||||||
</testCase>$
|
|
||||||
|
|
||||||
<testCase id="070000">
|
<testCase id="070000">
|
||||||
<class>Terminate_eNB</class>
|
<class>Terminate_eNB</class>
|
||||||
<desc>Terminate eNB</desc>
|
<desc>Terminate eNB</desc>
|
||||||
@@ -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>
|
||||||
@@ -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
|
||||||
@@ -1968,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
|
||||||
@@ -3452,7 +3453,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})
|
||||||
|
|||||||
@@ -1098,7 +1098,9 @@
|
|||||||
(Test13: HARQ test 50% TP (2 rounds),
|
(Test13: HARQ test 50% TP (2 rounds),
|
||||||
(Test14: 3 PTRS, 8 Interpolated Symbols),
|
(Test14: 3 PTRS, 8 Interpolated Symbols),
|
||||||
(Test15: 6 PTRS, 5 Interpolated Symbols),
|
(Test15: 6 PTRS, 5 Interpolated Symbols),
|
||||||
(Test16: 11 PTRS, 0 Interpolated Symbols)</desc>
|
(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>
|
||||||
@@ -1120,8 +1122,10 @@
|
|||||||
-n100 -s1 -t50
|
-n100 -s1 -t50
|
||||||
-n100 -s5 -T 2 2 2
|
-n100 -s5 -T 2 2 2
|
||||||
-n100 -s5 -T 2 1 2
|
-n100 -s5 -T 2 1 2
|
||||||
-n100 -s5 -T 2 0 4</main_exec_args>
|
-n100 -s5 -T 2 0 4
|
||||||
<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</tags>
|
-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>
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
+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
|
||||||
|
|||||||
+66
-10
@@ -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,16 +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
|
||||||
|
|||||||
@@ -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@"
|
||||||
|
|
||||||
@@ -0,0 +1,89 @@
|
|||||||
|
#/*
|
||||||
|
# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
# * contributor license agreements. See the NOTICE file distributed with
|
||||||
|
# * this work for additional information regarding copyright ownership.
|
||||||
|
# * The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
# * the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
# * except in compliance with the License.
|
||||||
|
# * You may obtain a copy of the License at
|
||||||
|
# *
|
||||||
|
# * http://www.openairinterface.org/?page_id=698
|
||||||
|
# *
|
||||||
|
# * Unless required by applicable law or agreed to in writing, software
|
||||||
|
# * distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# * See the License for the specific language governing permissions and
|
||||||
|
# * limitations under the License.
|
||||||
|
# *-------------------------------------------------------------------------------
|
||||||
|
# * For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
# * contact@openairinterface.org
|
||||||
|
# */
|
||||||
|
#---------------------------------------------------------------------
|
||||||
|
|
||||||
|
#-----------------------------------------------------------
|
||||||
|
# Import
|
||||||
|
#-----------------------------------------------------------
|
||||||
|
import re
|
||||||
|
import yaml
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
#read yaml input parameters
|
||||||
|
f = open(f'{sys.argv[1]}',)
|
||||||
|
data = yaml.full_load(f)
|
||||||
|
dir = os.listdir(f'{data[0]["paths"]["source_dir"]}')
|
||||||
|
|
||||||
|
|
||||||
|
#identify configs, read and replace corresponding values
|
||||||
|
for config in data[1]["configurations"]:
|
||||||
|
filePrefix = config["filePrefix"]
|
||||||
|
outputfilename = config["outputfilename"]
|
||||||
|
for inputfile in dir:
|
||||||
|
if inputfile.find(filePrefix) >=0:
|
||||||
|
prefix_outputfile = {"cu": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}',
|
||||||
|
"du": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}',
|
||||||
|
"rru.fdd": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}',
|
||||||
|
"rru.tdd": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}',
|
||||||
|
"enb.band7.tm1.25PRB.usrpb210": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}',
|
||||||
|
"enb.band40.tm1.25PRB.FairScheduler.usrpb210": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}',
|
||||||
|
"rcc.band7.tm1.nfapi": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}'
|
||||||
|
}
|
||||||
|
if filePrefix in prefix_outputfile:
|
||||||
|
outputfile1 = prefix_outputfile[filePrefix]
|
||||||
|
|
||||||
|
directory = f'{data[0]["paths"]["dest_dir"]}'
|
||||||
|
if not os.path.exists(directory):
|
||||||
|
os.makedirs(directory, exist_ok=True)
|
||||||
|
|
||||||
|
with open(f'{data[0]["paths"]["source_dir"]}{inputfile}', mode='r') as inputfile, \
|
||||||
|
open(outputfile1, mode='w') as outputfile:
|
||||||
|
for line in inputfile:
|
||||||
|
count = 0
|
||||||
|
for key in config["config"]:
|
||||||
|
if line.find(key["key"]) >= 0:
|
||||||
|
count += 1
|
||||||
|
if re.search(r'preference', line):
|
||||||
|
templine = line
|
||||||
|
elif re.search(r'plmn_list', line):
|
||||||
|
templine = re.sub(r'[0-9]+', '""', line)
|
||||||
|
templine = re.sub(r'\"\"', key["env"]["mcc"], templine, 1)
|
||||||
|
templine = re.sub(r'\"\"', key["env"]["mnc"], templine, 1)
|
||||||
|
templine = re.sub(r'\"\"', key["env"]["mnc_length"], templine, 1)
|
||||||
|
elif re.search('downlink_frequency', line):
|
||||||
|
templine = re.sub(r'[0-9]+', key["env"], line)
|
||||||
|
elif re.search('uplink_frequency_offset', line):
|
||||||
|
templine = re.sub(r'[0-9]+', key["env"], line)
|
||||||
|
|
||||||
|
elif re.search(r'"(.*?)"', line):
|
||||||
|
templine = re.sub(r'(?<=")[^"]*(?=")', key["env"], line)
|
||||||
|
elif re.search(r'[0-9]', line):
|
||||||
|
templine = re.sub(r'\d+', key["env"], line)
|
||||||
|
outputfile.write(templine)
|
||||||
|
|
||||||
|
if count == 0:
|
||||||
|
outputfile.write(line)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
+14
-1
@@ -72,6 +72,7 @@
|
|||||||
#include "common/utils/LOG/vcd_signal_dumper.h"
|
#include "common/utils/LOG/vcd_signal_dumper.h"
|
||||||
#include "UTIL/OPT/opt.h"
|
#include "UTIL/OPT/opt.h"
|
||||||
#include "enb_config.h"
|
#include "enb_config.h"
|
||||||
|
#include "gnb_paramdef.h"
|
||||||
|
|
||||||
|
|
||||||
#ifndef OPENAIR2
|
#ifndef OPENAIR2
|
||||||
@@ -101,6 +102,7 @@ extern int transmission_mode;
|
|||||||
|
|
||||||
extern uint16_t sf_ahead;
|
extern uint16_t sf_ahead;
|
||||||
extern uint16_t sl_ahead;
|
extern uint16_t sl_ahead;
|
||||||
|
|
||||||
//pthread_t main_gNB_thread;
|
//pthread_t main_gNB_thread;
|
||||||
|
|
||||||
time_stats_t softmodem_stats_mt; // main thread
|
time_stats_t softmodem_stats_mt; // main thread
|
||||||
@@ -884,7 +886,18 @@ void init_gNB_proc(int inst) {
|
|||||||
|
|
||||||
gNB->threadPool = (tpool_t*)malloc(sizeof(tpool_t));
|
gNB->threadPool = (tpool_t*)malloc(sizeof(tpool_t));
|
||||||
gNB->respDecode = (notifiedFIFO_t*) malloc(sizeof(notifiedFIFO_t));
|
gNB->respDecode = (notifiedFIFO_t*) malloc(sizeof(notifiedFIFO_t));
|
||||||
char ul_pool[] = "-1,-1";
|
int numCPU = sysconf(_SC_NPROCESSORS_ONLN);
|
||||||
|
uint32_t num_threads_pusch;
|
||||||
|
paramdef_t PUSCHThreads[] = NUM_THREADS_DESC;
|
||||||
|
config_get( PUSCHThreads,sizeof(PUSCHThreads)/sizeof(paramdef_t),NULL);
|
||||||
|
int threadCnt = min(numCPU, num_threads_pusch);
|
||||||
|
char ul_pool[80];
|
||||||
|
sprintf(ul_pool,"-1");
|
||||||
|
int s_offset = 0;
|
||||||
|
for (int icpu=1; icpu<threadCnt; icpu++) {
|
||||||
|
sprintf(ul_pool+2+s_offset,",-1");
|
||||||
|
s_offset += 3;
|
||||||
|
}
|
||||||
initTpool(ul_pool, gNB->threadPool, false);
|
initTpool(ul_pool, gNB->threadPool, false);
|
||||||
initNotifiedFIFO(gNB->respDecode);
|
initNotifiedFIFO(gNB->respDecode);
|
||||||
}
|
}
|
||||||
|
|||||||
+18
-37
@@ -422,12 +422,10 @@ void processSlotRX( PHY_VARS_NR_UE *UE, UE_nr_rxtx_proc_t *proc) {
|
|||||||
//printf(">>> nr_ue_pdcch_procedures ended\n");
|
//printf(">>> nr_ue_pdcch_procedures ended\n");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if(IS_SOFTMODEM_NOS1){ //&& proc->nr_slot_rx==1
|
if(IS_SOFTMODEM_NOS1){
|
||||||
//Hardcoded rnti value
|
NR_UE_MAC_INST_t *mac = get_mac_inst(0);
|
||||||
protocol_ctxt_t ctxt;
|
protocol_ctxt_t ctxt;
|
||||||
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, UE->Mod_id, ENB_FLAG_NO,
|
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, UE->Mod_id, ENB_FLAG_NO, mac->crnti, proc->frame_rx, proc->nr_slot_rx, 0);
|
||||||
0x1234, proc->frame_rx,
|
|
||||||
proc->nr_slot_rx, 0);
|
|
||||||
pdcp_run(&ctxt);
|
pdcp_run(&ctxt);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -468,32 +466,13 @@ void UE_processing(void *arg) {
|
|||||||
processingData_t *rxtxD = (processingData_t *) arg;
|
processingData_t *rxtxD = (processingData_t *) arg;
|
||||||
UE_nr_rxtx_proc_t *proc = &rxtxD->proc;
|
UE_nr_rxtx_proc_t *proc = &rxtxD->proc;
|
||||||
PHY_VARS_NR_UE *UE = rxtxD->UE;
|
PHY_VARS_NR_UE *UE = rxtxD->UE;
|
||||||
|
|
||||||
processSlotRX(UE, proc);
|
|
||||||
processSlotTX(UE, proc);
|
|
||||||
|
|
||||||
/* UL time alignment
|
|
||||||
// If the current tx frame and slot match the TA configuration in ul_time_alignment
|
|
||||||
// then timing advance is processed and set to be applied in the next UL transmission */
|
|
||||||
if (UE->mac_enabled == 1) {
|
|
||||||
uint8_t gNB_id = 0;
|
|
||||||
NR_UL_TIME_ALIGNMENT_t *ul_time_alignment = &UE->ul_time_alignment[gNB_id];
|
|
||||||
int slot_tx = proc->nr_slot_tx;
|
int slot_tx = proc->nr_slot_tx;
|
||||||
int frame_tx = proc->frame_tx;
|
int frame_tx = proc->frame_tx;
|
||||||
|
|
||||||
if (frame_tx == ul_time_alignment->ta_frame && slot_tx == ul_time_alignment->ta_slot) {
|
processSlotRX(UE, proc);
|
||||||
uint8_t numerology = UE->frame_parms.numerology_index;
|
processSlotTX(UE, proc);
|
||||||
uint16_t bwp_ul_NB_RB = UE->frame_parms.N_RB_UL;
|
ue_ta_procedures(UE, slot_tx, frame_tx);
|
||||||
|
|
||||||
LOG_D(PHY,"Applying timing advance -- frame %d -- slot %d\n", frame_tx, slot_tx);
|
|
||||||
|
|
||||||
//if (nfapi_mode!=3){
|
|
||||||
nr_process_timing_advance(UE->Mod_id, UE->CC_id, ul_time_alignment->ta_command, numerology, bwp_ul_NB_RB);
|
|
||||||
ul_time_alignment->ta_frame = -1;
|
|
||||||
ul_time_alignment->ta_slot = -1;
|
|
||||||
//}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void dummyWrite(PHY_VARS_NR_UE *UE,openair0_timestamp timestamp, int writeBlockSize) {
|
void dummyWrite(PHY_VARS_NR_UE *UE,openair0_timestamp timestamp, int writeBlockSize) {
|
||||||
@@ -605,7 +584,7 @@ void *UE_thread(void *arg) {
|
|||||||
//this thread should be over the processing thread to keep in real time
|
//this thread should be over the processing thread to keep in real time
|
||||||
PHY_VARS_NR_UE *UE = (PHY_VARS_NR_UE *) arg;
|
PHY_VARS_NR_UE *UE = (PHY_VARS_NR_UE *) arg;
|
||||||
// int tx_enabled = 0;
|
// int tx_enabled = 0;
|
||||||
openair0_timestamp timestamp;
|
openair0_timestamp timestamp, writeTimestamp;
|
||||||
void *rxp[NB_ANTENNAS_RX], *txp[NB_ANTENNAS_TX];
|
void *rxp[NB_ANTENNAS_RX], *txp[NB_ANTENNAS_TX];
|
||||||
int start_rx_stream = 0;
|
int start_rx_stream = 0;
|
||||||
AssertFatal(0== openair0_device_load(&(UE->rfdevice), &openair0_cfg[0]), "");
|
AssertFatal(0== openair0_device_load(&(UE->rfdevice), &openair0_cfg[0]), "");
|
||||||
@@ -736,11 +715,6 @@ void *UE_thread(void *arg) {
|
|||||||
UE->rx_offset_diff;
|
UE->rx_offset_diff;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (UE->timing_advance != timing_advance) {
|
|
||||||
writeBlockSize -= UE->timing_advance - timing_advance;
|
|
||||||
timing_advance = UE->timing_advance;
|
|
||||||
}
|
|
||||||
|
|
||||||
AssertFatal(readBlockSize ==
|
AssertFatal(readBlockSize ==
|
||||||
UE->rfdevice.trx_read_func(&UE->rfdevice,
|
UE->rfdevice.trx_read_func(&UE->rfdevice,
|
||||||
×tamp,
|
×tamp,
|
||||||
@@ -788,12 +762,19 @@ void *UE_thread(void *arg) {
|
|||||||
LOG_E(PHY,"Decoded frame index (%d) is not compatible with current context (%d), UE should go back to synch mode\n",
|
LOG_E(PHY,"Decoded frame index (%d) is not compatible with current context (%d), UE should go back to synch mode\n",
|
||||||
decoded_frame_rx, curMsg->proc.frame_rx );
|
decoded_frame_rx, curMsg->proc.frame_rx );
|
||||||
|
|
||||||
|
// use previous timing_advance value to compute writeTimestamp
|
||||||
|
writeTimestamp = timestamp + UE->frame_parms.get_samples_slot_timestamp(slot_nr, &UE->frame_parms,DURATION_RX_TO_TX - RX_NB_TH) -
|
||||||
|
firstSymSamp - openair0_cfg[0].tx_sample_advance - UE->N_TA_offset - timing_advance;
|
||||||
|
|
||||||
|
// but use current UE->timing_advance value to compute writeBlockSize
|
||||||
|
if (UE->timing_advance != timing_advance) {
|
||||||
|
writeBlockSize -= UE->timing_advance - timing_advance;
|
||||||
|
timing_advance = UE->timing_advance;
|
||||||
|
}
|
||||||
|
|
||||||
AssertFatal( writeBlockSize ==
|
AssertFatal( writeBlockSize ==
|
||||||
UE->rfdevice.trx_write_func(&UE->rfdevice,
|
UE->rfdevice.trx_write_func(&UE->rfdevice,
|
||||||
timestamp+
|
writeTimestamp,
|
||||||
UE->frame_parms.get_samples_slot_timestamp(slot_nr,
|
|
||||||
&UE->frame_parms,DURATION_RX_TO_TX - RX_NB_TH) - firstSymSamp -
|
|
||||||
openair0_cfg[0].tx_sample_advance - UE->N_TA_offset - UE->timing_advance,
|
|
||||||
txp,
|
txp,
|
||||||
writeBlockSize,
|
writeBlockSize,
|
||||||
UE->frame_parms.nb_antennas_tx,
|
UE->frame_parms.nb_antennas_tx,
|
||||||
|
|||||||
@@ -152,6 +152,7 @@ double cpuf;
|
|||||||
runmode_t mode = normal_txrx;
|
runmode_t mode = normal_txrx;
|
||||||
int UE_scan = 0;
|
int UE_scan = 0;
|
||||||
int chain_offset = 0;
|
int chain_offset = 0;
|
||||||
|
int card_offset = 0;
|
||||||
uint64_t num_missed_slots = 0; // counter for the number of missed slots
|
uint64_t num_missed_slots = 0; // counter for the number of missed slots
|
||||||
int transmission_mode = 1;
|
int transmission_mode = 1;
|
||||||
int numerology = 0;
|
int numerology = 0;
|
||||||
@@ -307,6 +308,9 @@ void set_options(int CC_id, PHY_VARS_NR_UE *UE){
|
|||||||
UE->rx_total_gain_dB = (int)rx_gain[CC_id][0] + rx_gain_off;
|
UE->rx_total_gain_dB = (int)rx_gain[CC_id][0] + rx_gain_off;
|
||||||
UE->tx_total_gain_dB = (int)tx_gain[CC_id][0];
|
UE->tx_total_gain_dB = (int)tx_gain[CC_id][0];
|
||||||
UE->tx_power_max_dBm = tx_max_power[CC_id];
|
UE->tx_power_max_dBm = tx_max_power[CC_id];
|
||||||
|
UE->rf_map.card = card_offset;
|
||||||
|
UE->rf_map.chain = CC_id + chain_offset;
|
||||||
|
UE->timing_advance = timing_advance;
|
||||||
|
|
||||||
LOG_I(PHY,"Set UE mode %d, UE_fo_compensation %d, UE_scan %d, UE_scan_carrier %d, UE_no_timing_correction %d \n", mode, UE_fo_compensation, UE_scan, UE_scan_carrier, UE_no_timing_correction);
|
LOG_I(PHY,"Set UE mode %d, UE_fo_compensation %d, UE_scan %d, UE_scan_carrier %d, UE_no_timing_correction %d \n", mode, UE_fo_compensation, UE_scan, UE_scan_carrier, UE_no_timing_correction);
|
||||||
|
|
||||||
@@ -576,12 +580,6 @@ int main( int argc, char **argv ) {
|
|||||||
load_softscope("nr",PHY_vars_UE_g[0][0]);
|
load_softscope("nr",PHY_vars_UE_g[0][0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
for(int CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
|
|
||||||
PHY_vars_UE_g[0][CC_id]->rf_map.card=0;
|
|
||||||
PHY_vars_UE_g[0][CC_id]->rf_map.chain=CC_id+chain_offset;
|
|
||||||
PHY_vars_UE_g[0][CC_id]->timing_advance = timing_advance;
|
|
||||||
}
|
|
||||||
|
|
||||||
init_NR_UE_threads(1);
|
init_NR_UE_threads(1);
|
||||||
printf("UE threads created by %ld\n", gettid());
|
printf("UE threads created by %ld\n", gettid());
|
||||||
|
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ extern "C"
|
|||||||
#define CONFIG_HLP_ITTIL "Generate ITTI analyzser logs (similar to wireshark logs but with more details)\n"
|
#define CONFIG_HLP_ITTIL "Generate ITTI analyzser logs (similar to wireshark logs but with more details)\n"
|
||||||
#define CONFIG_HLP_DLMCS "Set the maximum downlink MCS\n"
|
#define CONFIG_HLP_DLMCS "Set the maximum downlink MCS\n"
|
||||||
#define CONFIG_HLP_STMON "Enable processing timing measurement of lte softmodem on per subframe basis \n"
|
#define CONFIG_HLP_STMON "Enable processing timing measurement of lte softmodem on per subframe basis \n"
|
||||||
|
#define CONFIG_HLP_256QAM "Use the 256 QAM mcs table for PDSCH\n"
|
||||||
|
|
||||||
//#define CONFIG_HLP_NUMUES "Set the number of UEs for the emulation"
|
//#define CONFIG_HLP_NUMUES "Set the number of UEs for the emulation"
|
||||||
#define CONFIG_HLP_MSLOTS "Skip the missed slots/subframes \n"
|
#define CONFIG_HLP_MSLOTS "Skip the missed slots/subframes \n"
|
||||||
@@ -109,6 +109,7 @@ extern "C"
|
|||||||
#define TIMING_SOURCE softmodem_params.timing_source
|
#define TIMING_SOURCE softmodem_params.timing_source
|
||||||
#define SEND_DMRSSYNC softmodem_params.send_dmrs_sync
|
#define SEND_DMRSSYNC softmodem_params.send_dmrs_sync
|
||||||
#define USIM_TEST softmodem_params.usim_test
|
#define USIM_TEST softmodem_params.usim_test
|
||||||
|
#define USE_256QAM_TABLE softmodem_params.use_256qam_table
|
||||||
|
|
||||||
#define DEFAULT_RFCONFIG_FILE "/usr/local/etc/syriq/ue.band7.tm1.PRB100.NR40.dat";
|
#define DEFAULT_RFCONFIG_FILE "/usr/local/etc/syriq/ue.band7.tm1.PRB100.NR40.dat";
|
||||||
|
|
||||||
@@ -137,6 +138,7 @@ extern "C"
|
|||||||
{"basicsim", CONFIG_HLP_RFSIM, PARAMFLAG_BOOL, uptr:&basicsim, defintval:0, TYPE_INT, 0}, \
|
{"basicsim", CONFIG_HLP_RFSIM, PARAMFLAG_BOOL, uptr:&basicsim, defintval:0, TYPE_INT, 0}, \
|
||||||
{"nokrnmod", CONFIG_HLP_NOKRNMOD, PARAMFLAG_BOOL, uptr:&nokrnmod, defintval:0, TYPE_INT, 0}, \
|
{"nokrnmod", CONFIG_HLP_NOKRNMOD, PARAMFLAG_BOOL, uptr:&nokrnmod, defintval:0, TYPE_INT, 0}, \
|
||||||
{"nbiot-disable", CONFIG_HLP_DISABLNBIOT, PARAMFLAG_BOOL, uptr:&nonbiot, defuintval:0, TYPE_INT, 0}, \
|
{"nbiot-disable", CONFIG_HLP_DISABLNBIOT, PARAMFLAG_BOOL, uptr:&nonbiot, defuintval:0, TYPE_INT, 0}, \
|
||||||
|
{"use-256qam-table", CONFIG_HLP_256QAM, PARAMFLAG_BOOL, iptr:&USE_256QAM_TABLE, defintval:0, TYPE_INT, 0}, \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -222,6 +224,7 @@ typedef struct {
|
|||||||
uint32_t timing_source;
|
uint32_t timing_source;
|
||||||
int hw_timing_advance;
|
int hw_timing_advance;
|
||||||
uint32_t send_dmrs_sync;
|
uint32_t send_dmrs_sync;
|
||||||
|
int use_256qam_table;
|
||||||
} softmodem_params_t;
|
} softmodem_params_t;
|
||||||
|
|
||||||
extern uint64_t get_softmodem_optmask(void);
|
extern uint64_t get_softmodem_optmask(void);
|
||||||
|
|||||||
@@ -347,13 +347,13 @@ void nr_deinterleaving_ldpc(uint32_t E, uint8_t Qm, int16_t *e,int16_t *f)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 8:
|
case 8:
|
||||||
e1=e+(E/6);
|
e1=e+(E/8);
|
||||||
e2=e1+(E/6);
|
e2=e1+(E/8);
|
||||||
e3=e2+(E/6);
|
e3=e2+(E/8);
|
||||||
e4=e3+(E/6);
|
e4=e3+(E/8);
|
||||||
e5=e4+(E/6);
|
e5=e4+(E/8);
|
||||||
e6=e5+(E/6);
|
e6=e5+(E/8);
|
||||||
e7=e6+(E/6);
|
e7=e6+(E/8);
|
||||||
for (int j = 0,j2=0; j< E/8; j++,j2+=8){
|
for (int j = 0,j2=0; j< E/8; j++,j2+=8){
|
||||||
e[j] = f[j2];
|
e[j] = f[j2];
|
||||||
e1[j] = f[j2+1];
|
e1[j] = f[j2+1];
|
||||||
@@ -407,8 +407,16 @@ int nr_rate_matching_ldpc(uint8_t Ilbrm,
|
|||||||
#ifdef RM_DEBUG
|
#ifdef RM_DEBUG
|
||||||
printf("nr_rate_matching_ldpc: E %d, F %d, Foffset %d, k0 %d, Ncb %d, rvidx %d\n", E, F, Foffset,ind, Ncb, rvidx);
|
printf("nr_rate_matching_ldpc: E %d, F %d, Foffset %d, k0 %d, Ncb %d, rvidx %d\n", E, F, Foffset,ind, Ncb, rvidx);
|
||||||
#endif
|
#endif
|
||||||
AssertFatal(Foffset <= E,"Foffset %d > E %d\n",Foffset,E);
|
AssertFatal(Foffset <= E,
|
||||||
AssertFatal(Foffset <= Ncb,"Foffset %d > Ncb %d\n",Foffset,Ncb);
|
"Foffset %d > E %d "
|
||||||
|
"(Ilbrm %d, Tbslbrm %d, Z %d, BG %d, C %d)\n",
|
||||||
|
Foffset, E,
|
||||||
|
Ilbrm, Tbslbrm, Z, BG, C);
|
||||||
|
AssertFatal(Foffset <= Ncb,
|
||||||
|
"Foffset %d > Ncb %d "
|
||||||
|
"(Ilbrm %d, Tbslbrm %d, Z %d, BG %d, C %d)\n",
|
||||||
|
Foffset, Ncb,
|
||||||
|
Ilbrm, Tbslbrm, Z, BG, C);
|
||||||
|
|
||||||
if (ind >= Foffset && ind < (F+Foffset)) ind = F+Foffset;
|
if (ind >= Foffset && ind < (F+Foffset)) ind = F+Foffset;
|
||||||
|
|
||||||
|
|||||||
@@ -393,6 +393,7 @@ void phy_init_nr_ue__PDSCH(NR_UE_PDSCH *const pdsch,
|
|||||||
//pdsch->dl_ch_rho2_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
//pdsch->dl_ch_rho2_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
|
||||||
pdsch->dl_ch_mag0 = (int32_t **)malloc16_clear( 8*sizeof(int32_t *) );
|
pdsch->dl_ch_mag0 = (int32_t **)malloc16_clear( 8*sizeof(int32_t *) );
|
||||||
pdsch->dl_ch_magb0 = (int32_t **)malloc16_clear( 8*sizeof(int32_t *) );
|
pdsch->dl_ch_magb0 = (int32_t **)malloc16_clear( 8*sizeof(int32_t *) );
|
||||||
|
pdsch->dl_ch_magr0 = (int32_t **)malloc16_clear( 8*sizeof(int32_t *) );
|
||||||
pdsch->ptrs_phase_per_slot = (int32_t **)malloc16_clear( 8*sizeof(int32_t *) );
|
pdsch->ptrs_phase_per_slot = (int32_t **)malloc16_clear( 8*sizeof(int32_t *) );
|
||||||
pdsch->ptrs_re_per_slot = (int32_t **)malloc16_clear( 8*sizeof(int32_t *) );
|
pdsch->ptrs_re_per_slot = (int32_t **)malloc16_clear( 8*sizeof(int32_t *) );
|
||||||
pdsch->dl_ch_ptrs_estimates_ext = (int32_t **)malloc16_clear( 8*sizeof(int32_t *) );
|
pdsch->dl_ch_ptrs_estimates_ext = (int32_t **)malloc16_clear( 8*sizeof(int32_t *) );
|
||||||
@@ -416,6 +417,7 @@ void phy_init_nr_ue__PDSCH(NR_UE_PDSCH *const pdsch,
|
|||||||
//pdsch->dl_ch_rho2_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
|
//pdsch->dl_ch_rho2_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
|
||||||
pdsch->dl_ch_mag0[idx] = (int32_t *)malloc16_clear( sizeof(int32_t) * num );
|
pdsch->dl_ch_mag0[idx] = (int32_t *)malloc16_clear( sizeof(int32_t) * num );
|
||||||
pdsch->dl_ch_magb0[idx] = (int32_t *)malloc16_clear( sizeof(int32_t) * num );
|
pdsch->dl_ch_magb0[idx] = (int32_t *)malloc16_clear( sizeof(int32_t) * num );
|
||||||
|
pdsch->dl_ch_magr0[idx] = (int32_t *)malloc16_clear( sizeof(int32_t) * num );
|
||||||
pdsch->ptrs_re_per_slot[idx] = (int32_t *)malloc16_clear(sizeof(int32_t) * 14);
|
pdsch->ptrs_re_per_slot[idx] = (int32_t *)malloc16_clear(sizeof(int32_t) * 14);
|
||||||
pdsch->ptrs_phase_per_slot[idx] = (int32_t *)malloc16_clear( sizeof(int32_t) * 14 );
|
pdsch->ptrs_phase_per_slot[idx] = (int32_t *)malloc16_clear( sizeof(int32_t) * 14 );
|
||||||
pdsch->dl_ch_ptrs_estimates_ext[idx]= (int32_t *)malloc16_clear( sizeof(int32_t) * num);
|
pdsch->dl_ch_ptrs_estimates_ext[idx]= (int32_t *)malloc16_clear( sizeof(int32_t) * num);
|
||||||
@@ -472,6 +474,10 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue,
|
|||||||
ue->total_TBS_last[eNB_id] = 0;
|
ue->total_TBS_last[eNB_id] = 0;
|
||||||
ue->bitrate[eNB_id] = 0;
|
ue->bitrate[eNB_id] = 0;
|
||||||
ue->total_received_bits[eNB_id] = 0;
|
ue->total_received_bits[eNB_id] = 0;
|
||||||
|
|
||||||
|
ue->ul_time_alignment[eNB_id].apply_ta = 0;
|
||||||
|
ue->ul_time_alignment[eNB_id].ta_frame = -1;
|
||||||
|
ue->ul_time_alignment[eNB_id].ta_slot = -1;
|
||||||
}
|
}
|
||||||
// init NR modulation lookup tables
|
// init NR modulation lookup tables
|
||||||
nr_generate_modulation_table();
|
nr_generate_modulation_table();
|
||||||
|
|||||||
@@ -41,12 +41,10 @@ int nr_get_ssb_start_symbol(NR_DL_FRAME_PARMS *fp)
|
|||||||
int case_E[8] = {8, 12, 16, 20, 32, 36, 40, 44};
|
int case_E[8] = {8, 12, 16, 20, 32, 36, 40, 44};
|
||||||
|
|
||||||
switch(mu) {
|
switch(mu) {
|
||||||
|
|
||||||
case NR_MU_0: // case A
|
case NR_MU_0: // case A
|
||||||
n = i_ssb >> 1;
|
n = i_ssb >> 1;
|
||||||
symbol = case_AC[i_ssb % 2] + 14*n;
|
symbol = case_AC[i_ssb % 2] + 14*n;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case NR_MU_1:
|
case NR_MU_1:
|
||||||
if (type == 1){ // case B
|
if (type == 1){ // case B
|
||||||
n = i_ssb >> 2;
|
n = i_ssb >> 2;
|
||||||
@@ -57,20 +55,16 @@ int nr_get_ssb_start_symbol(NR_DL_FRAME_PARMS *fp)
|
|||||||
symbol = case_AC[i_ssb % 2] + 14*n;
|
symbol = case_AC[i_ssb % 2] + 14*n;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case NR_MU_3: // case D
|
case NR_MU_3: // case D
|
||||||
n_temp = i_ssb >> 2;
|
n_temp = i_ssb >> 2;
|
||||||
n = n_temp + (n_temp >> 2);
|
n = n_temp + (n_temp >> 2);
|
||||||
symbol = case_BD[i_ssb % 4] + 28*n;
|
symbol = case_BD[i_ssb % 4] + 28*n;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case NR_MU_4: // case E
|
case NR_MU_4: // case E
|
||||||
n_temp = i_ssb >> 3;
|
n_temp = i_ssb >> 3;
|
||||||
n = n_temp + (n_temp >> 2);
|
n = n_temp + (n_temp >> 2);
|
||||||
symbol = case_E[i_ssb % 8] + 56*n;
|
symbol = case_E[i_ssb % 8] + 56*n;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
AssertFatal(0==1, "Invalid numerology index %d for the synchronization block\n", mu);
|
AssertFatal(0==1, "Invalid numerology index %d for the synchronization block\n", mu);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,6 +47,7 @@ void lte_eNB_I0_measurements(PHY_VARS_eNB *eNB,
|
|||||||
uint32_t rb;
|
uint32_t rb;
|
||||||
int32_t *ul_ch;
|
int32_t *ul_ch;
|
||||||
int32_t n0_power_tot;
|
int32_t n0_power_tot;
|
||||||
|
int64_t n0_power_tot2;
|
||||||
int len;
|
int len;
|
||||||
int offset;
|
int offset;
|
||||||
// noise measurements
|
// noise measurements
|
||||||
@@ -75,15 +76,20 @@ void lte_eNB_I0_measurements(PHY_VARS_eNB *eNB,
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
n0_power_tot2=0;
|
||||||
|
int nb_rb=0;
|
||||||
for (rb=0; rb<frame_parms->N_RB_UL; rb++) {
|
for (rb=0; rb<frame_parms->N_RB_UL; rb++) {
|
||||||
|
|
||||||
n0_power_tot=0;
|
n0_power_tot=0;
|
||||||
if ((rb_mask[rb>>5]&(1<<(rb&31))) == 0) { // check that rb was not used in this subframe
|
int offset0= (frame_parms->first_carrier_offset + (rb*12))%frame_parms->ofdm_symbol_size;
|
||||||
for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
|
|
||||||
|
|
||||||
|
if ((rb_mask[rb>>5]&(1<<(rb&31))) == 0) { // check that rb was not used in this subframe
|
||||||
|
nb_rb++;
|
||||||
|
for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
|
||||||
|
measurements->n0_subband_power[aarx][rb] = 0;
|
||||||
|
for (int s=0;s<14-(frame_parms->Ncp<<1);s++) {
|
||||||
// select the 7th symbol in an uplink subframe
|
// select the 7th symbol in an uplink subframe
|
||||||
offset = (frame_parms->first_carrier_offset + (rb*12))%frame_parms->ofdm_symbol_size;
|
offset = offset0 + (s*frame_parms->ofdm_symbol_size);
|
||||||
offset += (7*frame_parms->ofdm_symbol_size);
|
|
||||||
ul_ch = &common_vars->rxdataF[aarx][offset];
|
ul_ch = &common_vars->rxdataF[aarx][offset];
|
||||||
len = 12;
|
len = 12;
|
||||||
// just do first half of middle PRB for odd number of PRBs
|
// just do first half of middle PRB for odd number of PRBs
|
||||||
@@ -91,27 +97,26 @@ void lte_eNB_I0_measurements(PHY_VARS_eNB *eNB,
|
|||||||
(rb==(frame_parms->N_RB_UL>>1))) {
|
(rb==(frame_parms->N_RB_UL>>1))) {
|
||||||
len=6;
|
len=6;
|
||||||
}
|
}
|
||||||
if (clear == 1)
|
|
||||||
measurements->n0_subband_power[aarx][rb]=0;
|
|
||||||
|
|
||||||
AssertFatal(ul_ch, "RX signal buffer (freq) problem");
|
AssertFatal(ul_ch, "RX signal buffer (freq) problem");
|
||||||
|
|
||||||
|
|
||||||
measurements->n0_subband_power[aarx][rb] = signal_energy_nodc(ul_ch,len);
|
measurements->n0_subband_power[aarx][rb] += signal_energy_nodc(ul_ch,len);
|
||||||
//((k1*(signal_energy_nodc(ul_ch,len)))
|
|
||||||
// + (k2*measurements->n0_subband_power[aarx][rb]));
|
|
||||||
|
|
||||||
measurements->n0_subband_power_dB[aarx][rb] = dB_fixed(measurements->n0_subband_power[aarx][rb]);
|
|
||||||
// printf("subframe %d (%d): eNB %d, aarx %d, rb %d len %d: energy %d (%d dB)\n",subframe,offset,eNB_id,aarx,rb,len,signal_energy_nodc(ul_ch,len),
|
|
||||||
// measurements->n0_subband_power_dB[aarx][rb]);
|
|
||||||
n0_power_tot += measurements->n0_subband_power[aarx][rb];
|
|
||||||
}
|
}
|
||||||
|
measurements->n0_subband_power[aarx][rb]/=(14-(frame_parms->Ncp<<1));
|
||||||
|
measurements->n0_subband_power_dB[aarx][rb] = dB_fixed(measurements->n0_subband_power[aarx][rb]);
|
||||||
|
n0_power_tot += measurements->n0_subband_power[aarx][rb];
|
||||||
|
|
||||||
measurements->n0_subband_power_tot_dB[rb] = dB_fixed(n0_power_tot);
|
}
|
||||||
|
n0_power_tot/=frame_parms->nb_antennas_rx;
|
||||||
|
n0_power_tot2 += n0_power_tot;
|
||||||
|
measurements->n0_subband_power_tot_dB[rb] = dB_fixed(n0_power_tot/frame_parms->nb_antennas_rx);
|
||||||
measurements->n0_subband_power_tot_dBm[rb] = measurements->n0_subband_power_tot_dB[rb] - eNB->rx_total_gain_dB - dB_fixed(frame_parms->N_RB_UL);
|
measurements->n0_subband_power_tot_dBm[rb] = measurements->n0_subband_power_tot_dB[rb] - eNB->rx_total_gain_dB - dB_fixed(frame_parms->N_RB_UL);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (nb_rb>0) measurements->n0_subband_power_avg_dB = dB_fixed(n0_power_tot2/nb_rb);
|
||||||
}
|
}
|
||||||
|
|
||||||
void lte_eNB_srs_measurements(PHY_VARS_eNB *eNB,
|
void lte_eNB_srs_measurements(PHY_VARS_eNB *eNB,
|
||||||
|
|||||||
@@ -1070,6 +1070,8 @@ void send_IF5(RU_t *ru, openair0_timestamp proc_timestamp, int subframe, uint8_t
|
|||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF5, 1 );
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF5, 1 );
|
||||||
if (packet_type == IF5_RRH_GW_DL) {
|
if (packet_type == IF5_RRH_GW_DL) {
|
||||||
if (eth->compression == ALAW_COMPRESS) {
|
if (eth->compression == ALAW_COMPRESS) {
|
||||||
|
AssertFatal(1==0,"IF5 compression needs reworking\n");
|
||||||
|
/*
|
||||||
if (eth->flags == ETH_RAW_MODE) {
|
if (eth->flags == ETH_RAW_MODE) {
|
||||||
data_block = (uint16_t*)(alaw_buffer + APP_HEADER_SIZE_BYTES + MAC_HEADER_SIZE_BYTES);
|
data_block = (uint16_t*)(alaw_buffer + APP_HEADER_SIZE_BYTES + MAC_HEADER_SIZE_BYTES);
|
||||||
} else {
|
} else {
|
||||||
@@ -1100,29 +1102,32 @@ void send_IF5(RU_t *ru, openair0_timestamp proc_timestamp, int subframe, uint8_t
|
|||||||
LOG_D(HW,"[SF %d] IF_Write_Time: %"PRId64"\n",subframe,clock_difftime_ns(start_comp, end_comp));
|
LOG_D(HW,"[SF %d] IF_Write_Time: %"PRId64"\n",subframe,clock_difftime_ns(start_comp, end_comp));
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_IF0, 0 );
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_IF0, 0 );
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
} else if (eth->compression == NO_COMPRESS) {
|
} else if (eth->compression == NO_COMPRESS) {
|
||||||
|
|
||||||
for (i=0; i < fp->nb_antennas_tx; i++)
|
for (i=0; i < ru->nb_tx; i++)
|
||||||
txp[i] = (void*)&ru->common.txdata[i][subframe*fp->samples_per_tti];
|
txp[i] = (int32_t*)&ru->common.txdata[i][subframe*fp->samples_per_tti];
|
||||||
|
|
||||||
for (packet_id=0; packet_id < spsf / spp_eth; packet_id++) {
|
for (packet_id=0; packet_id < spsf / spp_eth; packet_id++) {
|
||||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SEND_IF5_PKT_ID, packet_id );
|
for (int aid=0; aid<ru->nb_tx;aid++) {
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_IF0, 1 );
|
//VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SEND_IF5_PKT_ID, packet_id );
|
||||||
|
//VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_IF0, 1 );
|
||||||
clock_gettime( CLOCK_MONOTONIC, &start_comp);
|
clock_gettime( CLOCK_MONOTONIC, &start_comp);
|
||||||
ru->ifdevice.trx_write_func(&ru->ifdevice,
|
ru->ifdevice.trx_write_func2(&ru->ifdevice,
|
||||||
(proc_timestamp + packet_id*spp_eth),
|
(proc_timestamp + packet_id*spp_eth-500)*(30720/spsf),
|
||||||
(void**)txp,
|
(void*)txp[aid],
|
||||||
spp_eth,
|
spp_eth,
|
||||||
fp->nb_antennas_tx,
|
aid,
|
||||||
0);
|
0);
|
||||||
|
LOG_D(HW,"SF %d : packet %d, TS %llu\n",subframe,packet_id,(unsigned long long)(proc_timestamp+packet_id*spp_eth));
|
||||||
clock_gettime( CLOCK_MONOTONIC, &end_comp);
|
clock_gettime( CLOCK_MONOTONIC, &end_comp);
|
||||||
LOG_D(HW,"[SF %d] IF_Write_Time: %"PRId64"\n",subframe,clock_difftime_ns(start_comp, end_comp));
|
LOG_D(HW,"[SF %d] IF_Write_Time: %"PRId64"\n",subframe,clock_difftime_ns(start_comp, end_comp));
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_IF0, 0 );
|
//VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_IF0, 0 );
|
||||||
for (i=0; i < fp->nb_antennas_tx; i++)
|
txp[aid] += spp_eth;
|
||||||
txp[i] += spp_eth;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
} else if (packet_type == IF5_RRH_GW_UL) {
|
} else if (packet_type == IF5_RRH_GW_UL) {
|
||||||
if (eth->compression == ALAW_COMPRESS) {
|
if (eth->compression == ALAW_COMPRESS) {
|
||||||
if (eth->flags == ETH_RAW_MODE) {
|
if (eth->flags == ETH_RAW_MODE) {
|
||||||
@@ -1131,8 +1136,8 @@ void send_IF5(RU_t *ru, openair0_timestamp proc_timestamp, int subframe, uint8_t
|
|||||||
data_block = (uint16_t*)(alaw_buffer + APP_HEADER_SIZE_BYTES);
|
data_block = (uint16_t*)(alaw_buffer + APP_HEADER_SIZE_BYTES);
|
||||||
}
|
}
|
||||||
for (packet_id=0; packet_id < spsf / spp_eth; packet_id++) {
|
for (packet_id=0; packet_id < spsf / spp_eth; packet_id++) {
|
||||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SEND_IF5_PKT_ID, packet_id );
|
//VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SEND_IF5_PKT_ID, packet_id );
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_COMPR_IF, 1 );
|
//VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_COMPR_IF, 1 );
|
||||||
clock_gettime( CLOCK_MONOTONIC, &start_comp);
|
clock_gettime( CLOCK_MONOTONIC, &start_comp);
|
||||||
for (i=0; i < fp->nb_antennas_rx; i++) {
|
for (i=0; i < fp->nb_antennas_rx; i++) {
|
||||||
for (element_id=0; element_id< spp_eth; element_id++){
|
for (element_id=0; element_id< spp_eth; element_id++){
|
||||||
@@ -1142,8 +1147,8 @@ void send_IF5(RU_t *ru, openair0_timestamp proc_timestamp, int subframe, uint8_t
|
|||||||
}
|
}
|
||||||
clock_gettime( CLOCK_MONOTONIC, &end_comp);
|
clock_gettime( CLOCK_MONOTONIC, &end_comp);
|
||||||
LOG_D(HW,"[SF %d] Compress_Time: %"PRId64"\n",subframe,clock_difftime_ns(start_comp, end_comp));
|
LOG_D(HW,"[SF %d] Compress_Time: %"PRId64"\n",subframe,clock_difftime_ns(start_comp, end_comp));
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_COMPR_IF, 0 );
|
//VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_COMPR_IF, 0 );
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_IF0, 1 );
|
//VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_IF0, 1 );
|
||||||
clock_gettime( CLOCK_MONOTONIC, &start_comp);
|
clock_gettime( CLOCK_MONOTONIC, &start_comp);
|
||||||
ru->ifdevice.trx_write_func(&ru->ifdevice,
|
ru->ifdevice.trx_write_func(&ru->ifdevice,
|
||||||
(proc_timestamp + packet_id*spp_eth),
|
(proc_timestamp + packet_id*spp_eth),
|
||||||
@@ -1310,9 +1315,9 @@ void send_IF5(RU_t *ru, openair0_timestamp proc_timestamp, int subframe, uint8_t
|
|||||||
void recv_IF5(RU_t *ru, openair0_timestamp *proc_timestamp, int subframe, uint16_t packet_type) {
|
void recv_IF5(RU_t *ru, openair0_timestamp *proc_timestamp, int subframe, uint16_t packet_type) {
|
||||||
|
|
||||||
LTE_DL_FRAME_PARMS *fp=ru->frame_parms;
|
LTE_DL_FRAME_PARMS *fp=ru->frame_parms;
|
||||||
int32_t *txp[fp->nb_antennas_tx], *rxp[fp->nb_antennas_rx];
|
int32_t *txp[ru->nb_tx], *rxp[ru->nb_rx];
|
||||||
|
|
||||||
uint16_t packet_id=0, i=0, element_id=0;
|
uint16_t packet_id=0, i=0;
|
||||||
#ifdef DEBUG_UL_MOBIPASS
|
#ifdef DEBUG_UL_MOBIPASS
|
||||||
//int8_t dummy_buffer_rx[fp->samples_per_tti*2];
|
//int8_t dummy_buffer_rx[fp->samples_per_tti*2];
|
||||||
uint8_t rxe;
|
uint8_t rxe;
|
||||||
@@ -1321,11 +1326,12 @@ void recv_IF5(RU_t *ru, openair0_timestamp *proc_timestamp, int subframe, uint16
|
|||||||
|
|
||||||
int32_t spp_eth = (int32_t) ru->ifdevice.openair0_cfg->samples_per_packet;
|
int32_t spp_eth = (int32_t) ru->ifdevice.openair0_cfg->samples_per_packet;
|
||||||
int32_t spsf = (int32_t) ru->ifdevice.openair0_cfg->samples_per_frame/10;
|
int32_t spsf = (int32_t) ru->ifdevice.openair0_cfg->samples_per_frame/10;
|
||||||
void *alaw_buffer = ru->ifbuffer.rx;
|
|
||||||
uint16_t *data_block = NULL;
|
|
||||||
uint16_t *j = NULL;
|
|
||||||
|
|
||||||
openair0_timestamp timestamp[spsf / spp_eth];
|
openair0_timestamp timestamp[ru->nb_rx*spsf / spp_eth];
|
||||||
|
long timein[ru->nb_rx*spsf/spp_eth];
|
||||||
|
long timeout[ru->nb_rx*spsf/spp_eth];
|
||||||
|
struct timespec if_time;
|
||||||
|
|
||||||
memset(timestamp, 0, sizeof(timestamp));
|
memset(timestamp, 0, sizeof(timestamp));
|
||||||
eth_state_t *eth = (eth_state_t*) (ru->ifdevice.priv);
|
eth_state_t *eth = (eth_state_t*) (ru->ifdevice.priv);
|
||||||
|
|
||||||
@@ -1333,6 +1339,9 @@ void recv_IF5(RU_t *ru, openair0_timestamp *proc_timestamp, int subframe, uint16
|
|||||||
|
|
||||||
if (packet_type == IF5_RRH_GW_DL) {
|
if (packet_type == IF5_RRH_GW_DL) {
|
||||||
if (eth->compression == ALAW_COMPRESS) {
|
if (eth->compression == ALAW_COMPRESS) {
|
||||||
|
AssertFatal(1==0,"IF5 compression needs reworking\n");
|
||||||
|
|
||||||
|
/*
|
||||||
if (eth->flags == ETH_RAW_MODE) {
|
if (eth->flags == ETH_RAW_MODE) {
|
||||||
data_block = (uint16_t*)(alaw_buffer + APP_HEADER_SIZE_BYTES + MAC_HEADER_SIZE_BYTES);
|
data_block = (uint16_t*)(alaw_buffer + APP_HEADER_SIZE_BYTES + MAC_HEADER_SIZE_BYTES);
|
||||||
} else {
|
} else {
|
||||||
@@ -1364,13 +1373,14 @@ void recv_IF5(RU_t *ru, openair0_timestamp *proc_timestamp, int subframe, uint16
|
|||||||
LOG_D(HW,"[SF %d] Decomperss_Time: %"PRId64"\n",subframe,clock_difftime_ns(start_decomp, end_decomp));
|
LOG_D(HW,"[SF %d] Decomperss_Time: %"PRId64"\n",subframe,clock_difftime_ns(start_decomp, end_decomp));
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_DECOMPR_IF, 0 );
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_DECOMPR_IF, 0 );
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
} else if (eth->compression == NO_COMPRESS) {
|
} else if (eth->compression == NO_COMPRESS) {
|
||||||
for (i=0; i < fp->nb_antennas_tx; i++)
|
for (i=0; i < fp->nb_antennas_tx; i++)
|
||||||
txp[i] = (void*)&ru->common.txdata[i][subframe*fp->samples_per_tti];
|
txp[i] = (void*)&ru->common.txdata[i][subframe*fp->samples_per_tti];
|
||||||
|
|
||||||
for (packet_id=0; packet_id < spsf / spp_eth; packet_id++) {
|
for (packet_id=0; packet_id < spsf / spp_eth; packet_id++) {
|
||||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RECV_IF5_PKT_ID, packet_id );
|
//VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RECV_IF5_PKT_ID, packet_id );
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ_IF0, 1 );
|
//VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ_IF0, 1 );
|
||||||
clock_gettime( CLOCK_MONOTONIC, &start_decomp);
|
clock_gettime( CLOCK_MONOTONIC, &start_decomp);
|
||||||
ru->ifdevice.trx_read_func(&ru->ifdevice,
|
ru->ifdevice.trx_read_func(&ru->ifdevice,
|
||||||
×tamp[packet_id],
|
×tamp[packet_id],
|
||||||
@@ -1379,7 +1389,7 @@ void recv_IF5(RU_t *ru, openair0_timestamp *proc_timestamp, int subframe, uint16
|
|||||||
fp->nb_antennas_tx);
|
fp->nb_antennas_tx);
|
||||||
clock_gettime( CLOCK_MONOTONIC, &end_decomp);
|
clock_gettime( CLOCK_MONOTONIC, &end_decomp);
|
||||||
LOG_D(HW,"[SF %d] IF_Read_Time: %"PRId64"\n",subframe,clock_difftime_ns(start_decomp, end_decomp));
|
LOG_D(HW,"[SF %d] IF_Read_Time: %"PRId64"\n",subframe,clock_difftime_ns(start_decomp, end_decomp));
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ_IF0, 0 );
|
//VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ_IF0, 0 );
|
||||||
for (i=0; i < fp->nb_antennas_tx; i++)
|
for (i=0; i < fp->nb_antennas_tx; i++)
|
||||||
txp[i] += spp_eth;
|
txp[i] += spp_eth;
|
||||||
|
|
||||||
@@ -1389,6 +1399,8 @@ void recv_IF5(RU_t *ru, openair0_timestamp *proc_timestamp, int subframe, uint16
|
|||||||
|
|
||||||
} else if (packet_type == IF5_RRH_GW_UL) {
|
} else if (packet_type == IF5_RRH_GW_UL) {
|
||||||
if (eth->compression == ALAW_COMPRESS) {
|
if (eth->compression == ALAW_COMPRESS) {
|
||||||
|
AssertFatal(1==0,"IF5 compression needs reworking\n");
|
||||||
|
/*
|
||||||
if (eth->flags == ETH_RAW_MODE) {
|
if (eth->flags == ETH_RAW_MODE) {
|
||||||
data_block = (uint16_t*)(alaw_buffer + APP_HEADER_SIZE_BYTES + MAC_HEADER_SIZE_BYTES);
|
data_block = (uint16_t*)(alaw_buffer + APP_HEADER_SIZE_BYTES + MAC_HEADER_SIZE_BYTES);
|
||||||
} else {
|
} else {
|
||||||
@@ -1419,197 +1431,55 @@ void recv_IF5(RU_t *ru, openair0_timestamp *proc_timestamp, int subframe, uint16
|
|||||||
LOG_D(HW,"[SF %d] Decomperss_Time: %"PRId64"\n",subframe,clock_difftime_ns(start_decomp, end_decomp));
|
LOG_D(HW,"[SF %d] Decomperss_Time: %"PRId64"\n",subframe,clock_difftime_ns(start_decomp, end_decomp));
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_DECOMPR_IF, 0 );
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_DECOMPR_IF, 0 );
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
} else if (eth->compression == NO_COMPRESS) {
|
} else if (eth->compression == NO_COMPRESS) {
|
||||||
for (i=0; i < fp->nb_antennas_rx; i++)
|
int16_t temp_rx[spp_eth*2] __attribute__((aligned(32)));
|
||||||
rxp[i] = (void*)&ru->common.rxdata[i][subframe*fp->samples_per_tti];
|
for (i=0; i < ru->nb_rx; i++)
|
||||||
|
rxp[i] = &ru->common.rxdata[i][subframe*fp->samples_per_tti];
|
||||||
|
int aid;
|
||||||
|
int firstTS=1;
|
||||||
|
openair0_timestamp oldTS=0;
|
||||||
|
|
||||||
for (packet_id=0; packet_id < spsf / spp_eth; packet_id++) {
|
for (packet_id=0; packet_id < ru->nb_rx*spsf / spp_eth; packet_id++) {
|
||||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SEND_IF5_PKT_ID, packet_id );
|
//VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SEND_IF5_PKT_ID, packet_id );
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ_IF0, 1 );
|
//VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ_IF0, 1 );
|
||||||
clock_gettime( CLOCK_MONOTONIC, &start_decomp);
|
clock_gettime( CLOCK_MONOTONIC, &if_time);
|
||||||
ru->ifdevice.trx_read_func(&ru->ifdevice,
|
timein[packet_id] = if_time.tv_nsec;
|
||||||
|
ru->ifdevice.trx_read_func2(&ru->ifdevice,
|
||||||
×tamp[packet_id],
|
×tamp[packet_id],
|
||||||
(void**)rxp,
|
(void*)temp_rx,
|
||||||
spp_eth,
|
spp_eth,
|
||||||
fp->nb_antennas_rx);
|
&aid);
|
||||||
|
clock_gettime( CLOCK_MONOTONIC, &if_time);
|
||||||
|
timeout[packet_id] = if_time.tv_nsec;
|
||||||
|
timestamp[packet_id] /= (30720/spsf);
|
||||||
|
LOG_D(PHY,"subframe %d: Received packet %d: aid %d, TS %llu, oldTS %llu, diff %lld, \n",subframe,packet_id,aid,(unsigned long long)timestamp[packet_id],(unsigned long long)oldTS,(unsigned long long)(timestamp[packet_id]-timestamp[0]));
|
||||||
|
if (aid==0) {
|
||||||
|
if (firstTS==1) firstTS=0;
|
||||||
|
else if (oldTS + 256 != timestamp[packet_id]) {
|
||||||
|
LOG_I(PHY,"oldTS %llu, newTS %llu, diff %llu, timein %lu, timeout %lu\n",(long long unsigned int)oldTS,(long long unsigned int)timestamp[packet_id],(long long unsigned int)timestamp[packet_id]-oldTS,timein[packet_id],timeout[packet_id]);
|
||||||
|
for (int i=0;i<=packet_id;i++) LOG_I(PHY,"packet %d TS %llu, timein %lu, timeout %lu\n",i,(long long unsigned int)timestamp[i],timein[i],timeout[i]);
|
||||||
|
AssertFatal(1==0,"fronthaul problem\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
oldTS = timestamp[packet_id];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// HYPOTHESIS: first packet per subframe has lowest timestamp of subframe
|
||||||
|
// should detect out of order and act accordingly ....
|
||||||
|
AssertFatal(aid==0 || aid==1,"aid %d != 0 or 1\n",aid);
|
||||||
|
//LOG_I(PHY,"rxp[%d] %p, dest %p, offset %d (%lld,%lld)\n",aid,rxp[aid],rxp[aid]+(timestamp[packet_id]-timestamp[0]),(timestamp[packet_id]-timestamp[0]),timestamp[packet_id],timestamp[0]);
|
||||||
|
memcpy((void*)(rxp[aid]+(timestamp[packet_id]-timestamp[0])),
|
||||||
|
(void*)temp_rx,
|
||||||
|
spp_eth<<2);
|
||||||
clock_gettime( CLOCK_MONOTONIC, &end_decomp);
|
clock_gettime( CLOCK_MONOTONIC, &end_decomp);
|
||||||
LOG_D(HW,"[SF %d] IF_Read_Time: %"PRId64"\n",subframe,clock_difftime_ns(start_decomp, end_decomp));
|
LOG_D(HW,"[SF %d] IF_Read_Time: %"PRId64"\n",subframe,clock_difftime_ns(start_decomp, end_decomp));
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ_IF0, 0 );
|
//VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ_IF0, 0 );
|
||||||
for (i=0; i < fp->nb_antennas_rx; i++)
|
|
||||||
rxp[i] += spp_eth;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*proc_timestamp = timestamp[0];
|
*proc_timestamp = timestamp[0];
|
||||||
|
|
||||||
} else if (packet_type == IF5_MOBIPASS) {
|
|
||||||
if (ru->if_timing == synch_to_mobipass_standalone) {
|
|
||||||
uint16_t db_fulllength = PAYLOAD_MOBIPASS_NUM_SAMPLES;
|
|
||||||
openair0_timestamp timestamp_mobipass[fp->samples_per_tti/db_fulllength];
|
|
||||||
int32_t *rx_buffer=NULL;
|
|
||||||
__m128i *data_block=NULL, *data_block_head=NULL;
|
|
||||||
__m128i *rxp128;
|
|
||||||
__m128i r0;
|
|
||||||
|
|
||||||
unsigned char _rx_buffer[MAC_HEADER_SIZE_BYTES + sizeof_IF5_mobipass_header_t + db_fulllength*sizeof(int16_t)];
|
|
||||||
rx_buffer = (int32_t *)_rx_buffer;
|
|
||||||
data_block_head = (__m128i *)((uint8_t *)rx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF5_mobipass_header_t);
|
|
||||||
|
|
||||||
rxp[0] = (void*)&ru->common.rxdata[0][subframe*ru->frame_parms->samples_per_tti];
|
|
||||||
rxp128 = (__m128i *) (rxp[0]);
|
|
||||||
|
|
||||||
packet_id=0;
|
|
||||||
while(packet_id<fp->samples_per_tti/db_fulllength) {
|
|
||||||
data_block = data_block_head;
|
|
||||||
|
|
||||||
ru->ifdevice.trx_read_func(&ru->ifdevice,
|
|
||||||
×tamp_mobipass[packet_id],
|
|
||||||
(void**)&rx_buffer,
|
|
||||||
db_fulllength,
|
|
||||||
1
|
|
||||||
);
|
|
||||||
|
|
||||||
//store rxdata and increase packet_id
|
|
||||||
rxp[0] = (void*)&ru->common.rxdata[0][(subframe*ru->frame_parms->samples_per_tti)+packet_id*db_fulllength];
|
|
||||||
rxp128 = (__m128i *) (rxp[0]);
|
|
||||||
for (i=0; i<db_fulllength>>2; i+=2) {
|
|
||||||
r0 = _mm_loadu_si128(data_block++);
|
|
||||||
*rxp128++ =_mm_slli_epi16(_mm_srai_epi16(_mm_unpacklo_epi8(r0,r0),8),4);
|
|
||||||
*rxp128++ =_mm_slli_epi16(_mm_srai_epi16(_mm_unpackhi_epi8(r0,r0),8),4);
|
|
||||||
}
|
|
||||||
packet_id++;
|
|
||||||
}//end while
|
|
||||||
|
|
||||||
*proc_timestamp = ntohl(timestamp_mobipass[0]);
|
|
||||||
} else {
|
|
||||||
|
|
||||||
uint16_t db_fulllength = PAYLOAD_MOBIPASS_NUM_SAMPLES;
|
|
||||||
openair0_timestamp timestamp_mobipass[fp->samples_per_tti/db_fulllength];
|
|
||||||
#ifdef DEBUG_UL_MOBIPASS
|
|
||||||
int lower_offset = 0;
|
|
||||||
int upper_offset = 70000;
|
|
||||||
#endif
|
|
||||||
int subframe_skip = 0;
|
|
||||||
int reset_flag = 0;
|
|
||||||
int32_t *rx_buffer=NULL;
|
|
||||||
__m128i *data_block=NULL, *data_block_head=NULL;
|
|
||||||
__m128i *rxp128;
|
|
||||||
__m128i r0;
|
|
||||||
|
|
||||||
//rx_buffer = memalign(16, MAC_HEADER_SIZE_BYTES + sizeof_IF5_mobipass_header_t + db_fulllength*sizeof(int16_t));
|
|
||||||
rx_buffer = malloc(MAC_HEADER_SIZE_BYTES + sizeof_IF5_mobipass_header_t + db_fulllength*sizeof(int16_t));
|
|
||||||
IF5_mobipass_header_t *header = (IF5_mobipass_header_t *)((uint8_t *)rx_buffer + MAC_HEADER_SIZE_BYTES);
|
|
||||||
data_block_head = (__m128i *)((uint8_t *)rx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF5_mobipass_header_t);
|
|
||||||
|
|
||||||
rxp[0] = (void*)&ru->common.rxdata[0][subframe*ru->frame_parms->samples_per_tti];
|
|
||||||
rxp128 = (__m128i *) (rxp[0]);
|
|
||||||
|
|
||||||
RU_proc_t *proc = &ru->proc;
|
|
||||||
/*
|
|
||||||
// while(packet_id<fp->samples_per_tti/db_fulllength) {
|
|
||||||
data_block = data_block_head;
|
|
||||||
|
|
||||||
eNB->ifdevice.trx_read_func(&eNB->ifdevice,
|
|
||||||
&ts0,
|
|
||||||
(void**)&rx_buffer,
|
|
||||||
db_fulllength,
|
|
||||||
1
|
|
||||||
);
|
|
||||||
|
|
||||||
if ((header->seqno == 1)&&(first_packet==1)) {
|
|
||||||
first_packet = 0; //ignore the packets before synchnorization
|
|
||||||
packet_id = 0;
|
|
||||||
ts_offset = ntohl(ts0);
|
|
||||||
}
|
|
||||||
if (first_packet==0) {
|
|
||||||
packet_cnt++;
|
|
||||||
ts = ntohl(ts0);
|
|
||||||
packet_id = (ts-ts_offset)/db_fulllength;
|
|
||||||
packet_id = packet_id % (fp->samples_per_tti/db_fulllength);
|
|
||||||
|
|
||||||
printf("[IF5_tools]packet_id:%d\n", packet_id);
|
|
||||||
// if (ts_stored == 0) {
|
|
||||||
// ts_stored = 1;
|
|
||||||
*proc_timestamp = ntohl(ts - (packet_id*db_fulllength));
|
|
||||||
// }
|
|
||||||
rxp[0] = (void*)&eNB->common_vars.rxdata[0][0][(subframe*eNB->frame_parms.samples_per_tti)+packet_id*db_fulllength];
|
|
||||||
rxp128 = (__m128i *) (rxp[0]);
|
|
||||||
|
|
||||||
for (i=0; i<db_fulllength>>2; i+=2) {
|
|
||||||
r0 = _mm_loadu_si128(data_block++);
|
|
||||||
*rxp128++ =_mm_slli_epi16(_mm_srai_epi16(_mm_unpacklo_epi8(r0,r0),8),4);
|
|
||||||
*rxp128++ =_mm_slli_epi16(_mm_srai_epi16(_mm_unpackhi_epi8(r0,r0),8),4);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// }//end while
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
packet_id=0;
|
|
||||||
while(packet_id<fp->samples_per_tti/db_fulllength) {
|
|
||||||
data_block = data_block_head;
|
|
||||||
|
|
||||||
|
|
||||||
ru->ifdevice.trx_read_func(&ru->ifdevice,
|
|
||||||
×tamp_mobipass[packet_id],
|
|
||||||
(void**)&rx_buffer,
|
|
||||||
db_fulllength,
|
|
||||||
1
|
|
||||||
);
|
|
||||||
#ifdef DEBUG_UL_MOBIPASS
|
|
||||||
if (((proc->timestamp_tx + lower_offset) > ntohl(timestamp_mobipass[packet_id])) || ((proc->timestamp_tx + upper_offset) < ntohl(timestamp_mobipass[packet_id]))) {
|
|
||||||
//ignore the packet
|
|
||||||
subframe_skip_extra = (subframe_skip_extra + 1)%67;
|
|
||||||
LOG_D("[Mobipass] ignored packet, id:[%d,%d], proc->timestamp_tx:%llu, proc->timestamp_rx:%llu, seqno:%d\n", packet_id,subframe_skip_extra, proc->timestamp_tx, ntohl(timestamp_mobipass[packet_id]), header->seqno);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
//skip SUBFRAME_SKIP_NUM_MOBIPASS additional UL packets
|
|
||||||
if ((start_flag == 1) && (subframe_skip < SUBFRAME_SKIP_NUM_MOBIPASS)){
|
|
||||||
subframe_skip++;
|
|
||||||
offset_cnt = header->seqno;
|
|
||||||
} else {
|
|
||||||
if ((offset_cnt != header->seqno) && (start_flag == 0) && (proc->first_rx > 3)){
|
|
||||||
#ifdef DEBUG_UL_MOBIPASS
|
|
||||||
LOG_D(PHY,"[Mobipass] Reset sequence number, offset_cnt:%d, header->seqno:%d, packet_id:%d\n", offset_cnt, header->seqno, packet_id);
|
|
||||||
#endif
|
|
||||||
reset_flag=1;
|
|
||||||
}
|
|
||||||
if ((reset_flag == 1) && (proc->first_rx > 3 ) && (start_flag == 0) && (packet_id == 0)) {
|
|
||||||
packet_id = 1;
|
|
||||||
reset_flag = 0;
|
|
||||||
}
|
|
||||||
start_flag = 0;
|
|
||||||
|
|
||||||
//store rxdata and increase packet_id
|
|
||||||
rxp[0] = (void*)&ru->common.rxdata[0][(subframe*ru->frame_parms->samples_per_tti)+packet_id*db_fulllength];
|
|
||||||
rxp128 = (__m128i *) (rxp[0]);
|
|
||||||
for (i=0; i<db_fulllength>>2; i+=2) {
|
|
||||||
r0 = _mm_loadu_si128(data_block++);
|
|
||||||
*rxp128++ =_mm_slli_epi16(_mm_srai_epi16(_mm_unpacklo_epi8(r0,r0),8),4);
|
|
||||||
*rxp128++ =_mm_slli_epi16(_mm_srai_epi16(_mm_unpackhi_epi8(r0,r0),8),4);
|
|
||||||
}
|
|
||||||
packet_id++;
|
|
||||||
offset_cnt = (header->seqno+1)&255;
|
|
||||||
}
|
|
||||||
}//end while
|
|
||||||
|
|
||||||
*proc_timestamp = ntohl(timestamp_mobipass[0]);
|
|
||||||
#ifdef DEBUG_UL_MOBIPASS
|
|
||||||
LOG_I(PHY,"[Mobipass][Recv_MOBIPASS] timestamp: %llu\n ", *proc_timestamp);
|
|
||||||
if (eNB->CC_id>0) {
|
|
||||||
rxe = dB_fixed(signal_energy(rxp[0],fp->samples_per_tti));
|
|
||||||
if (rxe > 0){
|
|
||||||
LOG_I(PHY,"[Mobipass] frame:%d, subframe:%d, energy %d\n", (*proc_timestamp/(10*fp->samples_per_tti))&1023,subframe, rxe);
|
|
||||||
|
|
||||||
// LOG_M("rxsigmb.m","rxs",(void*)dummy_buffer_rx, fp->samples_per_tti,1, 5);
|
|
||||||
// exit(-1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
free(rx_buffer);
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
AssertFatal(1==0, "recv_IF5 - Unknown packet_type %x", packet_type);
|
AssertFatal(1==0, "recv_IF5 - Unknown packet_type %x", packet_type);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -89,7 +89,7 @@ void rx_prach0(PHY_VARS_eNB *eNB,
|
|||||||
int32_t *prach_ifft=(int32_t *)NULL;
|
int32_t *prach_ifft=(int32_t *)NULL;
|
||||||
int32_t **prach_ifftp=(int32_t **)NULL;
|
int32_t **prach_ifftp=(int32_t **)NULL;
|
||||||
int prach_ifft_cnt=0;
|
int prach_ifft_cnt=0;
|
||||||
|
int exit_flag=0;
|
||||||
LTE_DL_FRAME_PARMS *fp;
|
LTE_DL_FRAME_PARMS *fp;
|
||||||
int nb_rx;
|
int nb_rx;
|
||||||
if(eNB) {
|
if(eNB) {
|
||||||
@@ -177,32 +177,33 @@ void rx_prach0(PHY_VARS_eNB *eNB,
|
|||||||
}
|
}
|
||||||
|
|
||||||
AssertFatal(ru!=NULL,"ru is null\n");
|
AssertFatal(ru!=NULL,"ru is null\n");
|
||||||
|
int8_t dBEn0=0;
|
||||||
for (aa=0; aa<nb_rx; aa++) {
|
for (aa=0; aa<nb_rx; aa++) {
|
||||||
if (ru->if_south == LOCAL_RF) { // set the time-domain signal if we have to use it in this node
|
if (ru->if_south == LOCAL_RF || ru->function == NGFI_RAU_IF5) { // set the time-domain signal if we have to use it in this node
|
||||||
// DJP - indexing below in subframe zero takes us off the beginning of the array???
|
// DJP - indexing below in subframe zero takes us off the beginning of the array???
|
||||||
prach[aa] = (int16_t *)&ru->common.rxdata[aa][(subframe*fp->samples_per_tti)-ru->N_TA_offset];
|
prach[aa] = (int16_t *)&ru->common.rxdata[aa][(subframe*fp->samples_per_tti)-ru->N_TA_offset];
|
||||||
|
|
||||||
if (LOG_DUMPFLAG(PRACH)) {
|
if (LOG_DUMPFLAG(PRACH)) {
|
||||||
int32_t en0=signal_energy((int32_t *)prach[aa],fp->samples_per_tti);
|
int32_t en0=signal_energy((int32_t *)prach[aa],fp->samples_per_tti);
|
||||||
int8_t dbEn0 = dB_fixed(en0);
|
dBEn0 = dB_fixed(en0);
|
||||||
int8_t rach_dBm = dbEn0 - ru->rx_total_gain_dB;
|
int8_t rach_dBm = dBEn0 - ru->rx_total_gain_dB;
|
||||||
char buffer[80];
|
char buffer[80];
|
||||||
|
|
||||||
if (dbEn0>32 && prach[0]!= NULL) {
|
if (dBEn0>30 && prach[0]!= NULL) {
|
||||||
static int counter=0;
|
static int counter=0;
|
||||||
sprintf(buffer, "%s%d", "/tmp/prach_rx",counter);
|
sprintf(buffer, "%s%d", "/tmp/prach_rx.m",counter);
|
||||||
LOG_M(buffer,"prach_rx",prach[0],fp->samples_per_tti,1,13);
|
LOG_M(buffer,"prach_rx",prach[0],fp->samples_per_tti,1,1);
|
||||||
|
exit_flag=1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dB_fixed(en0)>32) {
|
if (dBEn0>30) {
|
||||||
sprintf(buffer, "rach_dBm:%d",rach_dBm);
|
sprintf(buffer, "rach_dBm:%d",rach_dBm);
|
||||||
|
|
||||||
if (prach[0]!= NULL) LOG_M("prach_rx","prach_rx",prach[0],fp->samples_per_tti,1,1);
|
if (prach[0]!= NULL) LOG_M("prach_rx.m","prach_rx",prach[0],fp->samples_per_tti,1,1);
|
||||||
|
|
||||||
LOG_I(PHY,"RU %d, br_flag %d ce_level %d frame %d subframe %d per_tti:%d prach:%p (energy %d) TA:%d %s rxdata:%p index:%d\n",
|
LOG_I(PHY,"RU %d, br_flag %d ce_level %d frame %d subframe %d per_tti:%d prach:%p (energy %d) TA:%d %s rxdata:%p index:%d\n",
|
||||||
ru->idx,br_flag,ce_level,frame_prach,subframe,fp->samples_per_tti,
|
ru->idx,br_flag,ce_level,frame_prach,subframe,fp->samples_per_tti,
|
||||||
prach[aa],dbEn0,ru->N_TA_offset,buffer,ru->common.rxdata[aa],
|
prach[aa],dBEn0,ru->N_TA_offset,buffer,ru->common.rxdata[aa],
|
||||||
(subframe*fp->samples_per_tti)-ru->N_TA_offset);
|
(subframe*fp->samples_per_tti)-ru->N_TA_offset);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -415,7 +416,7 @@ void rx_prach0(PHY_VARS_eNB *eNB,
|
|||||||
if ( LOG_DEBUGFLAG(PRACH)) {
|
if ( LOG_DEBUGFLAG(PRACH)) {
|
||||||
int en = dB_fixed(signal_energy((int32_t *)&rxsigF[0][0],840));
|
int en = dB_fixed(signal_energy((int32_t *)&rxsigF[0][0],840));
|
||||||
|
|
||||||
if ((en > 60)&&(br_flag==1)) LOG_I(PHY,"PRACH (br_flag %d,ce_level %d, n_ra_prb %d, k %d): Frame %d, Subframe %d => %d dB\n",br_flag,ce_level,n_ra_prb,k,frame_prach,subframe,en);
|
if ((en > 10)&&(br_flag==1)) LOG_I(PHY,"PRACH (br_flag %d,ce_level %d, n_ra_prb %d, k %d): Frame %d, Subframe %d => %d dB\n",br_flag,ce_level,n_ra_prb,k,frame_prach,subframe,en);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -454,9 +455,9 @@ void rx_prach0(PHY_VARS_eNB *eNB,
|
|||||||
|
|
||||||
for (preamble_index=0 ; preamble_index<64 ; preamble_index++) {
|
for (preamble_index=0 ; preamble_index<64 ; preamble_index++) {
|
||||||
if (LOG_DEBUGFLAG(PRACH)) {
|
if (LOG_DEBUGFLAG(PRACH)) {
|
||||||
int en = dB_fixed(signal_energy((int32_t *)&rxsigF[0][0],840));
|
// int en = dB_fixed(signal_energy((int32_t *)&rxsigF[0][0],840));
|
||||||
|
|
||||||
if (en>60) LOG_I(PHY,"frame %d, subframe %d : Trying preamble %d (br_flag %d)\n",frame_prach,subframe,preamble_index,br_flag);
|
if (dBEn0>30) LOG_I(PHY,"frame %d, subframe %d : Trying preamble %d (br_flag %d)\n",frame_prach,subframe,preamble_index,br_flag);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (restricted_set == 0) {
|
if (restricted_set == 0) {
|
||||||
@@ -539,10 +540,10 @@ void rx_prach0(PHY_VARS_eNB *eNB,
|
|||||||
|
|
||||||
// Compute DFT of RX signal (conjugate input, results in conjugate output) for each new rootSequenceIndex
|
// Compute DFT of RX signal (conjugate input, results in conjugate output) for each new rootSequenceIndex
|
||||||
if (LOG_DEBUGFLAG(PRACH)) {
|
if (LOG_DEBUGFLAG(PRACH)) {
|
||||||
int en = dB_fixed(signal_energy((int32_t *)&rxsigF[0][0],840));
|
//en = dB_fixed(signal_energy((int32_t *)&rxsigF[0][0],840));
|
||||||
|
|
||||||
if (en>60) LOG_I(PHY,"frame %d, subframe %d : preamble index %d: offset %d, preamble shift %d (br_flag %d, en %d)\n",
|
if (dBEn0>30) LOG_I(PHY,"frame %d, subframe %d : preamble index %d: offset %d, preamble shift %d (br_flag %d, en %d)\n",
|
||||||
frame_prach,subframe,preamble_index,preamble_offset,preamble_shift,br_flag,en);
|
frame_prach,subframe,preamble_index,preamble_offset,preamble_shift,br_flag,dBEn0);
|
||||||
}
|
}
|
||||||
|
|
||||||
log2_ifft_size = 10;
|
log2_ifft_size = 10;
|
||||||
@@ -633,9 +634,9 @@ void rx_prach0(PHY_VARS_eNB *eNB,
|
|||||||
*max_preamble = preamble_index;
|
*max_preamble = preamble_index;
|
||||||
|
|
||||||
if (LOG_DEBUGFLAG(PRACH)) {
|
if (LOG_DEBUGFLAG(PRACH)) {
|
||||||
int en = dB_fixed(signal_energy((int32_t *)&rxsigF[0][0],840));
|
// int en = dB_fixed(signal_energy((int32_t *)&rxsigF[0][0],840));
|
||||||
|
|
||||||
if ((en>60) && (br_flag==1))
|
if (dBEn0>30)
|
||||||
LOG_D(PHY,"frame %d, subframe %d : max_preamble_energy %d, max_preamble_delay %d, max_preamble %d (br_flag %d,ce_level %d, levdB %d, lev %d)\n",
|
LOG_D(PHY,"frame %d, subframe %d : max_preamble_energy %d, max_preamble_delay %d, max_preamble %d (br_flag %d,ce_level %d, levdB %d, lev %d)\n",
|
||||||
frame_prach,subframe,
|
frame_prach,subframe,
|
||||||
*max_preamble_energy,*max_preamble_delay,
|
*max_preamble_energy,*max_preamble_delay,
|
||||||
@@ -648,10 +649,10 @@ void rx_prach0(PHY_VARS_eNB *eNB,
|
|||||||
|
|
||||||
*avg_preamble_energy=dB_fixed(avg_en/64);
|
*avg_preamble_energy=dB_fixed(avg_en/64);
|
||||||
|
|
||||||
if (LOG_DUMPFLAG(PRACH)) {
|
if (exit_flag==1) {
|
||||||
int en = dB_fixed(signal_energy((int32_t *)&rxsigF[0][0],840));
|
int en = dB_fixed(signal_energy((int32_t *)&rxsigF[0][0],840));
|
||||||
|
|
||||||
if (en>60) {
|
if (en>30) {
|
||||||
k = (12*n_ra_prb) - 6*fp->N_RB_UL;
|
k = (12*n_ra_prb) - 6*fp->N_RB_UL;
|
||||||
|
|
||||||
if (k<0) k+=fp->ofdm_symbol_size;
|
if (k<0) k+=fp->ofdm_symbol_size;
|
||||||
@@ -665,19 +666,20 @@ void rx_prach0(PHY_VARS_eNB *eNB,
|
|||||||
LOG_M("prach_rxF_comp0.m","prach_rxF_comp0",prachF,1024,1,1);
|
LOG_M("prach_rxF_comp0.m","prach_rxF_comp0",prachF,1024,1,1);
|
||||||
LOG_M("Xu.m","xu",Xu,N_ZC,1,1);
|
LOG_M("Xu.m","xu",Xu,N_ZC,1,1);
|
||||||
LOG_M("prach_ifft0.m","prach_t0",prach_ifft,1024,1,1);
|
LOG_M("prach_ifft0.m","prach_t0",prach_ifft,1024,1,1);
|
||||||
exit(-1);
|
LOG_M("SF2_3.m","sf2_3",&ru->common.rxdata[0][2*fp->samples_per_tti],2*fp->samples_per_tti,1,1);
|
||||||
} else {
|
} else {
|
||||||
LOG_E(PHY,"Dumping prach (br_flag %d), k = %d (n_ra_prb %d)\n",br_flag,k,n_ra_prb);
|
LOG_E(PHY,"Dumping prach (br_flag %d), k = %d (n_ra_prb %d)\n",br_flag,k,n_ra_prb);
|
||||||
LOG_M("rxsigF_br.m","prach_rxF_br",&rxsigF[0][0],12288,1,1);
|
LOG_M("rxsigF_br.m","prach_rxF_br",&rxsigF[0][0],12288,1,1);
|
||||||
LOG_M("prach_rxF_comp0_br.m","prach_rxF_comp0_br",prachF,1024,1,1);
|
LOG_M("prach_rxF_comp0_br.m","prach_rxF_comp0_br",prachF,1024,1,1);
|
||||||
LOG_M("Xu_br.m","xu_br",Xu,N_ZC,1,1);
|
LOG_M("Xu_br.m","xu_br",Xu,N_ZC,1,1);
|
||||||
LOG_M("prach_ifft0_br.m","prach_t0_br",prach_ifft,1024,1,1);
|
LOG_M("prach_ifft0_br.m","prach_t0_br",prach_ifft,1024,1,1);
|
||||||
exit(-1);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} /* LOG_DUMPFLAG(PRACH) */
|
} /* LOG_DUMPFLAG(PRACH) */
|
||||||
|
|
||||||
if (eNB) stop_meas(&eNB->rx_prach);
|
if (eNB) stop_meas(&eNB->rx_prach);
|
||||||
|
AssertFatal(exit_flag==0,"exiting\n");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -90,9 +90,8 @@ void PHY_ofdm_mod(int *input, /// pointer to complex input
|
|||||||
|
|
||||||
if(nb_symbols == 0) return;
|
if(nb_symbols == 0) return;
|
||||||
|
|
||||||
short temp[2*2*6144*4] __attribute__((aligned(32)));
|
int16_t temp[2*2*6144*4] __attribute__((aligned(32)));
|
||||||
unsigned short i,j;
|
int i,j;
|
||||||
short k;
|
|
||||||
|
|
||||||
volatile int *output_ptr=(int*)0;
|
volatile int *output_ptr=(int*)0;
|
||||||
|
|
||||||
@@ -190,18 +189,9 @@ void PHY_ofdm_mod(int *input, /// pointer to complex input
|
|||||||
if (fftsize==128)
|
if (fftsize==128)
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
/*for (j=0; j<fftsize ; j++) {
|
memcpy((void*)output_ptr,(void*)temp_ptr,fftsize<<2);
|
||||||
output_ptr[j] = temp_ptr[j];
|
|
||||||
}*/
|
|
||||||
memcpy1((void*)output_ptr,(void*)temp_ptr,fftsize<<2);
|
|
||||||
}
|
}
|
||||||
|
memcpy((void*)&output_ptr[-nb_prefix_samples],(void*)&output_ptr[fftsize-nb_prefix_samples],nb_prefix_samples<<2);
|
||||||
j=fftsize;
|
|
||||||
|
|
||||||
for (k=-1; k>=-nb_prefix_samples; k--) {
|
|
||||||
output_ptr[k] = output_ptr[--j];
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CYCLIC_SUFFIX:
|
case CYCLIC_SUFFIX:
|
||||||
|
|||||||
@@ -107,9 +107,10 @@ void nr_gold_pdcch(PHY_VARS_NR_UE* ue,
|
|||||||
}
|
}
|
||||||
|
|
||||||
void nr_gold_pdsch(PHY_VARS_NR_UE* ue,
|
void nr_gold_pdsch(PHY_VARS_NR_UE* ue,
|
||||||
|
unsigned char ns,
|
||||||
unsigned short *n_idDMRS)
|
unsigned short *n_idDMRS)
|
||||||
{
|
{
|
||||||
unsigned char ns,l;
|
unsigned char l;
|
||||||
unsigned int n,x1,x2,x2tmp0;
|
unsigned int n,x1,x2,x2tmp0;
|
||||||
int nscid;
|
int nscid;
|
||||||
unsigned int nid;
|
unsigned int nid;
|
||||||
@@ -125,10 +126,7 @@ void nr_gold_pdsch(PHY_VARS_NR_UE* ue,
|
|||||||
|
|
||||||
//printf("gold pdsch nid %d lbar %d\n",nid,lbar);
|
//printf("gold pdsch nid %d lbar %d\n",nid,lbar);
|
||||||
|
|
||||||
for (ns=0; ns<20; ns++) {
|
|
||||||
|
|
||||||
for (l=0; l<14; l++) {
|
for (l=0; l<14; l++) {
|
||||||
|
|
||||||
x2tmp0 = ((14*ns+l+1)*((nid<<1)+1))<<17;
|
x2tmp0 = ((14*ns+l+1)*((nid<<1)+1))<<17;
|
||||||
x2 = (x2tmp0+(nid<<1)+nscid)%(1<<31); //cinit
|
x2 = (x2tmp0+(nid<<1)+nscid)%(1<<31); //cinit
|
||||||
LOG_D(PHY,"UE DMRS slot %d, symb %d, x2 %x, nscid %d\n",ns,l,x2,nscid);
|
LOG_D(PHY,"UE DMRS slot %d, symb %d, x2 %x, nscid %d\n",ns,l,x2,nscid);
|
||||||
@@ -155,8 +153,6 @@ void nr_gold_pdsch(PHY_VARS_NR_UE* ue,
|
|||||||
// if ((ns==2)&&(l==0))
|
// if ((ns==2)&&(l==0))
|
||||||
//printf("n=%d : c %x\n",n,x1^x2);
|
//printf("n=%d : c %x\n",n,x1^x2);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -61,6 +61,7 @@ void nr_gold_pdcch(PHY_VARS_NR_UE* ue,
|
|||||||
unsigned short length_dmrs);
|
unsigned short length_dmrs);
|
||||||
|
|
||||||
void nr_gold_pdsch(PHY_VARS_NR_UE* ue,
|
void nr_gold_pdsch(PHY_VARS_NR_UE* ue,
|
||||||
|
unsigned char ns,
|
||||||
unsigned short *n_idDMRS);
|
unsigned short *n_idDMRS);
|
||||||
|
|
||||||
void nr_init_pusch_dmrs(PHY_VARS_NR_UE* ue,
|
void nr_init_pusch_dmrs(PHY_VARS_NR_UE* ue,
|
||||||
|
|||||||
@@ -292,7 +292,7 @@ void nr_processULSegment(void* arg) {
|
|||||||
int no_iteration_ldpc;
|
int no_iteration_ldpc;
|
||||||
int Kr;
|
int Kr;
|
||||||
int Kr_bytes;
|
int Kr_bytes;
|
||||||
int K_bytes_F;
|
int K_bits_F;
|
||||||
uint8_t crc_type;
|
uint8_t crc_type;
|
||||||
int i;
|
int i;
|
||||||
int j;
|
int j;
|
||||||
@@ -318,8 +318,7 @@ void nr_processULSegment(void* arg) {
|
|||||||
|
|
||||||
Kr = ulsch_harq->K;
|
Kr = ulsch_harq->K;
|
||||||
Kr_bytes = Kr>>3;
|
Kr_bytes = Kr>>3;
|
||||||
|
K_bits_F = Kr-ulsch_harq->F;
|
||||||
K_bytes_F = Kr_bytes-(ulsch_harq->F>>3);
|
|
||||||
|
|
||||||
t_nrLDPC_time_stats procTime;
|
t_nrLDPC_time_stats procTime;
|
||||||
t_nrLDPC_time_stats* p_procTime = &procTime ;
|
t_nrLDPC_time_stats* p_procTime = &procTime ;
|
||||||
@@ -402,23 +401,19 @@ void nr_processULSegment(void* arg) {
|
|||||||
|
|
||||||
//start_meas(&phy_vars_gNB->ulsch_ldpc_decoding_stats);
|
//start_meas(&phy_vars_gNB->ulsch_ldpc_decoding_stats);
|
||||||
|
|
||||||
memset(pv,0,2*ulsch_harq->Z*sizeof(int16_t));
|
//set first 2*Z_c bits to zeros
|
||||||
memset((pv+K_bytes_F),127,ulsch_harq->F*sizeof(int16_t));
|
memset(&z[0],0,2*ulsch_harq->Z*sizeof(int16_t));
|
||||||
|
//set Filler bits
|
||||||
for (i=((2*p_decoderParms->Z)>>3), j = 0; i < K_bytes_F; i++, j++) {
|
memset((&z[0]+K_bits_F),127,ulsch_harq->F*sizeof(int16_t));
|
||||||
pv[i]= _mm_loadu_si128((__m128i*)(&ulsch_harq->d[r][8*j]));
|
//Move coded bits before filler bits
|
||||||
}
|
memcpy((&z[0]+2*ulsch_harq->Z),ulsch_harq->d[r],(K_bits_F-2*ulsch_harq->Z)*sizeof(int16_t));
|
||||||
|
//skip filler bits
|
||||||
AssertFatal(kc!=255,"");
|
memcpy((&z[0]+Kr),ulsch_harq->d[r]+(Kr-2*ulsch_harq->Z),(kc*ulsch_harq->Z-Kr)*sizeof(int16_t));
|
||||||
j+=(ulsch_harq->F>>3);
|
//Saturate coded bits before decoding into 8 bits values
|
||||||
for (i=Kr_bytes; i < ((kc*p_decoderParms->Z)>>3); i++, j++) {
|
for (i=0, j=0; j < ((kc*ulsch_harq->Z)>>4)+1; i+=2, j++)
|
||||||
pv[i]= _mm_loadu_si128((__m128i*)(&ulsch_harq->d[r][8*j]));
|
{
|
||||||
}
|
|
||||||
|
|
||||||
for (i=0, j=0; j < ((kc*p_decoderParms->Z)>>4); i+=2, j++) {
|
|
||||||
pl[j] = _mm_packs_epi16(pv[i],pv[i+1]);
|
pl[j] = _mm_packs_epi16(pv[i],pv[i+1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
@@ -523,31 +518,27 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
|
|||||||
|
|
||||||
if ((A <=292) || ((A<=3824) && (Coderate <= 0.6667)) || Coderate <= 0.25){
|
if ((A <=292) || ((A<=3824) && (Coderate <= 0.6667)) || Coderate <= 0.25){
|
||||||
p_decParams->BG = 2;
|
p_decParams->BG = 2;
|
||||||
|
kc = 52;
|
||||||
if (Coderate < 0.3333) {
|
if (Coderate < 0.3333) {
|
||||||
p_decParams->R = 15;
|
p_decParams->R = 15;
|
||||||
kc = 52;
|
|
||||||
}
|
}
|
||||||
else if (Coderate <0.6667) {
|
else if (Coderate <0.6667) {
|
||||||
p_decParams->R = 13;
|
p_decParams->R = 13;
|
||||||
kc = 32;
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
p_decParams->R = 23;
|
p_decParams->R = 23;
|
||||||
kc = 17;
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
p_decParams->BG = 1;
|
p_decParams->BG = 1;
|
||||||
|
kc = 68;
|
||||||
if (Coderate < 0.6667) {
|
if (Coderate < 0.6667) {
|
||||||
p_decParams->R = 13;
|
p_decParams->R = 13;
|
||||||
kc = 68;
|
|
||||||
}
|
}
|
||||||
else if (Coderate <0.8889) {
|
else if (Coderate <0.8889) {
|
||||||
p_decParams->R = 23;
|
p_decParams->R = 23;
|
||||||
kc = 35;
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
p_decParams->R = 89;
|
p_decParams->R = 89;
|
||||||
kc = 27;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ void
|
|||||||
phy_adjust_gain_nr (PHY_VARS_NR_UE *ue, uint32_t rx_power_fil_dB, uint8_t eNB_id)
|
phy_adjust_gain_nr (PHY_VARS_NR_UE *ue, uint32_t rx_power_fil_dB, uint8_t eNB_id)
|
||||||
{
|
{
|
||||||
|
|
||||||
LOG_I(PHY,"Gain control: rssi %d (%d,%d)\n",
|
LOG_D(PHY,"Gain control: rssi %d (%d,%d)\n",
|
||||||
rx_power_fil_dB,
|
rx_power_fil_dB,
|
||||||
ue->measurements.rssi,
|
ue->measurements.rssi,
|
||||||
ue->measurements.rx_power_avg_dB[eNB_id]
|
ue->measurements.rx_power_avg_dB[eNB_id]
|
||||||
@@ -61,7 +61,7 @@ phy_adjust_gain_nr (PHY_VARS_NR_UE *ue, uint32_t rx_power_fil_dB, uint8_t eNB_id
|
|||||||
ue->rx_total_gain_dB = MIN_RF_GAIN;
|
ue->rx_total_gain_dB = MIN_RF_GAIN;
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_I(PHY,"Gain control: rx_total_gain_dB = %d TARGET_RX_POWER %d (max %d,rxpf %d)\n",ue->rx_total_gain_dB,TARGET_RX_POWER,MAX_RF_GAIN,rx_power_fil_dB);
|
LOG_D(PHY,"Gain control: rx_total_gain_dB = %d TARGET_RX_POWER %d (max %d,rxpf %d)\n",ue->rx_total_gain_dB,TARGET_RX_POWER,MAX_RF_GAIN,rx_power_fil_dB);
|
||||||
|
|
||||||
#ifdef DEBUG_PHY
|
#ifdef DEBUG_PHY
|
||||||
/* if ((ue->frame%100==0) || (ue->frame < 10))
|
/* if ((ue->frame%100==0) || (ue->frame < 10))
|
||||||
|
|||||||
@@ -47,6 +47,7 @@ void nr_adjust_synch_ue(NR_DL_FRAME_PARMS *frame_parms,
|
|||||||
int temp = 0, i, aa, max_val = 0, max_pos = 0;
|
int temp = 0, i, aa, max_val = 0, max_pos = 0;
|
||||||
int diff;
|
int diff;
|
||||||
short Re,Im,ncoef;
|
short Re,Im,ncoef;
|
||||||
|
uint8_t sync_offset = 0;
|
||||||
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ADJUST_SYNCH, VCD_FUNCTION_IN);
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ADJUST_SYNCH, VCD_FUNCTION_IN);
|
||||||
|
|
||||||
@@ -80,11 +81,14 @@ void nr_adjust_synch_ue(NR_DL_FRAME_PARMS *frame_parms,
|
|||||||
// do not filter to have proactive timing adjustment
|
// do not filter to have proactive timing adjustment
|
||||||
//max_pos_fil = max_pos;
|
//max_pos_fil = max_pos;
|
||||||
|
|
||||||
if(subframe == 0)
|
|
||||||
{
|
|
||||||
diff = max_pos_fil - (frame_parms->nb_prefix_samples>>3);
|
diff = max_pos_fil - (frame_parms->nb_prefix_samples>>3);
|
||||||
|
|
||||||
if ( abs(diff) < SYNCH_HYST )
|
if (frame_parms->freq_range==nr_FR2)
|
||||||
|
sync_offset = 2;
|
||||||
|
else
|
||||||
|
sync_offset = 0;
|
||||||
|
|
||||||
|
if ( abs(diff) < (SYNCH_HYST+sync_offset) )
|
||||||
ue->rx_offset = 0;
|
ue->rx_offset = 0;
|
||||||
else
|
else
|
||||||
ue->rx_offset = diff;
|
ue->rx_offset = diff;
|
||||||
@@ -134,5 +138,5 @@ void nr_adjust_synch_ue(NR_DL_FRAME_PARMS *frame_parms,
|
|||||||
#endif //DEBUG_PHY
|
#endif //DEBUG_PHY
|
||||||
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ADJUST_SYNCH, VCD_FUNCTION_OUT);
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ADJUST_SYNCH, VCD_FUNCTION_OUT);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -86,17 +86,17 @@ void nr_adjust_synch_ue(NR_DL_FRAME_PARMS *frame_parms,
|
|||||||
|
|
||||||
void nr_ue_measurements(PHY_VARS_NR_UE *ue,
|
void nr_ue_measurements(PHY_VARS_NR_UE *ue,
|
||||||
UE_nr_rxtx_proc_t *proc,
|
UE_nr_rxtx_proc_t *proc,
|
||||||
unsigned int subframe_offset,
|
uint8_t slot);
|
||||||
unsigned char N0_symbol,
|
|
||||||
unsigned char abstraction_flag,
|
|
||||||
unsigned char rank_adaptation,
|
|
||||||
uint8_t subframe);
|
|
||||||
|
|
||||||
void nr_ue_rsrp_measurements(PHY_VARS_NR_UE *ue,
|
void nr_ue_rsrp_measurements(PHY_VARS_NR_UE *ue,
|
||||||
UE_nr_rxtx_proc_t *proc,
|
UE_nr_rxtx_proc_t *proc,
|
||||||
uint8_t slot,
|
uint8_t slot,
|
||||||
uint8_t abstraction_flag);
|
uint8_t abstraction_flag);
|
||||||
|
|
||||||
|
void nr_ue_rrc_measurements(PHY_VARS_NR_UE *ue,
|
||||||
|
UE_nr_rxtx_proc_t *proc,
|
||||||
|
uint8_t slot);
|
||||||
|
|
||||||
void phy_adjust_gain_nr(PHY_VARS_NR_UE *ue,
|
void phy_adjust_gain_nr(PHY_VARS_NR_UE *ue,
|
||||||
uint32_t rx_power_fil_dB,
|
uint32_t rx_power_fil_dB,
|
||||||
uint8_t eNB_id);
|
uint8_t eNB_id);
|
||||||
|
|||||||
@@ -19,6 +19,18 @@
|
|||||||
* contact@openairinterface.org
|
* contact@openairinterface.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*! \file nr_ue_measurements.c
|
||||||
|
* \brief UE measurements routines
|
||||||
|
* \author R. Knopp, G. Casati
|
||||||
|
* \date 2020
|
||||||
|
* \version 0.1
|
||||||
|
* \company Eurecom, Fraunhofer IIS
|
||||||
|
* \email: knopp@eurecom.fr, guido.casati@iis.fraunhofer.de
|
||||||
|
* \note
|
||||||
|
* \warning
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "nr-softmodem-common.h"
|
||||||
#include "PHY/defs_nr_UE.h"
|
#include "PHY/defs_nr_UE.h"
|
||||||
#include "PHY/phy_extern_nr_ue.h"
|
#include "PHY/phy_extern_nr_ue.h"
|
||||||
#include "common/utils/LOG/log.h"
|
#include "common/utils/LOG/log.h"
|
||||||
@@ -33,29 +45,6 @@
|
|||||||
//#define DEBUG_MEAS_UE
|
//#define DEBUG_MEAS_UE
|
||||||
//#define DEBUG_RANK_EST
|
//#define DEBUG_RANK_EST
|
||||||
|
|
||||||
#if 0
|
|
||||||
int16_t cond_num_threshold = 0;
|
|
||||||
|
|
||||||
void print_shorts(char *s,short *x)
|
|
||||||
{
|
|
||||||
|
|
||||||
|
|
||||||
printf("%s : %d,%d,%d,%d,%d,%d,%d,%d\n",s,
|
|
||||||
x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7]
|
|
||||||
);
|
|
||||||
|
|
||||||
}
|
|
||||||
void print_ints(char *s,int *x)
|
|
||||||
{
|
|
||||||
|
|
||||||
|
|
||||||
printf("%s : %d,%d,%d,%d\n",s,
|
|
||||||
x[0],x[1],x[2],x[3]
|
|
||||||
);
|
|
||||||
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int16_t get_nr_PL(uint8_t Mod_id, uint8_t CC_id, uint8_t gNB_index){
|
int16_t get_nr_PL(uint8_t Mod_id, uint8_t CC_id, uint8_t gNB_index){
|
||||||
|
|
||||||
PHY_VARS_NR_UE *ue = PHY_vars_UE_g[Mod_id][CC_id];
|
PHY_VARS_NR_UE *ue = PHY_vars_UE_g[Mod_id][CC_id];
|
||||||
@@ -105,117 +94,84 @@ float_t get_nr_RSRP(module_id_t Mod_id,uint8_t CC_id,uint8_t gNB_index)
|
|||||||
return -140.0;
|
return -140.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void nr_ue_measurements(PHY_VARS_NR_UE *ue,
|
void nr_ue_measurements(PHY_VARS_NR_UE *ue,
|
||||||
UE_nr_rxtx_proc_t *proc,
|
UE_nr_rxtx_proc_t *proc,
|
||||||
unsigned int subframe_offset,
|
uint8_t slot)
|
||||||
unsigned char N0_symbol,
|
|
||||||
unsigned char abstraction_flag,
|
|
||||||
unsigned char rank_adaptation,
|
|
||||||
uint8_t subframe)
|
|
||||||
{
|
{
|
||||||
int aarx,aatx,eNB_id=0; //,gain_offset=0;
|
int aarx, aatx, gNB_id = 0;
|
||||||
//int rx_power[NUMBER_OF_CONNECTED_eNB_MAX];
|
|
||||||
|
|
||||||
/*#if defined(__x86_64__) || defined(__i386__)
|
|
||||||
__m128i *dl_ch0_128, *dl_ch1_128;
|
|
||||||
#elif defined(__arm__)
|
|
||||||
int16x8_t *dl_ch0_128, *dl_ch1_128get_PL;
|
|
||||||
#endif*/
|
|
||||||
|
|
||||||
NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
|
NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
|
||||||
//unsigned int limit, subband;
|
int ch_offset = frame_parms->ofdm_symbol_size*2;
|
||||||
//int nb_subbands, subband_size, last_subband_size, *dl_ch0, *dl_ch1, N_RB_DL = frame_parms->N_RB_DL;
|
NR_UE_DLSCH_t *dlsch = ue->dlsch[proc->thread_id][gNB_id][0];
|
||||||
|
uint8_t harq_pid = dlsch->current_harq_pid;
|
||||||
int ch_offset, rank_tm3_tm4 = 0;
|
int N_RB_DL = dlsch->harq_processes[harq_pid]->nb_rb;
|
||||||
|
|
||||||
ue->measurements.nb_antennas_rx = frame_parms->nb_antennas_rx;
|
ue->measurements.nb_antennas_rx = frame_parms->nb_antennas_rx;
|
||||||
|
|
||||||
/*int16_t *dl_ch;
|
|
||||||
dl_ch = (int16_t *)&ue->pdsch_vars[proc->thread_id][0]->dl_ch_estimates[eNB_id][ch_offset];*/
|
|
||||||
|
|
||||||
ch_offset = ue->frame_parms.ofdm_symbol_size*2;
|
|
||||||
|
|
||||||
//printf("testing measurements\n");
|
|
||||||
// signal measurements
|
// signal measurements
|
||||||
|
for (gNB_id = 0; gNB_id < ue->n_connected_eNB; gNB_id++){
|
||||||
|
|
||||||
for (eNB_id=0; eNB_id<ue->n_connected_eNB; eNB_id++) {
|
ue->measurements.rx_power_tot[gNB_id] = 0;
|
||||||
for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
|
|
||||||
for (aatx=0; aatx<frame_parms->nb_antenna_ports_gNB; aatx++) {
|
|
||||||
ue->measurements.rx_spatial_power[eNB_id][aatx][aarx] =
|
|
||||||
(signal_energy_nodc(&ue->pdsch_vars[proc->thread_id][0]->dl_ch_estimates[eNB_id][ch_offset],
|
|
||||||
(50*12)));
|
|
||||||
//- ue->measurements.n0_power[aarx];
|
|
||||||
|
|
||||||
if (ue->measurements.rx_spatial_power[eNB_id][aatx][aarx]<0)
|
for (aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++){
|
||||||
ue->measurements.rx_spatial_power[eNB_id][aatx][aarx] = 0; //ue->measurements.n0_power[aarx];
|
|
||||||
|
|
||||||
ue->measurements.rx_spatial_power_dB[eNB_id][aatx][aarx] = (unsigned short) dB_fixed(ue->measurements.rx_spatial_power[eNB_id][aatx][aarx]);
|
ue->measurements.rx_power[gNB_id][aarx] = 0;
|
||||||
|
|
||||||
if (aatx==0)
|
for (aatx = 0; aatx < frame_parms->nb_antenna_ports_gNB; aatx++){
|
||||||
ue->measurements.rx_power[eNB_id][aarx] = ue->measurements.rx_spatial_power[eNB_id][aatx][aarx];
|
|
||||||
else
|
|
||||||
ue->measurements.rx_power[eNB_id][aarx] += ue->measurements.rx_spatial_power[eNB_id][aatx][aarx];
|
|
||||||
} //aatx
|
|
||||||
|
|
||||||
ue->measurements.rx_power_dB[eNB_id][aarx] = (unsigned short) dB_fixed(ue->measurements.rx_power[eNB_id][aarx]);
|
ue->measurements.rx_spatial_power[gNB_id][aatx][aarx] = (signal_energy_nodc(&ue->pdsch_vars[proc->thread_id][0]->dl_ch_estimates[gNB_id][ch_offset], N_RB_DL*NR_NB_SC_PER_RB));
|
||||||
|
|
||||||
if (aarx==0)
|
if (ue->measurements.rx_spatial_power[gNB_id][aatx][aarx]<0)
|
||||||
ue->measurements.rx_power_tot[eNB_id] = ue->measurements.rx_power[eNB_id][aarx];
|
ue->measurements.rx_spatial_power[gNB_id][aatx][aarx] = 0;
|
||||||
else
|
|
||||||
ue->measurements.rx_power_tot[eNB_id] += ue->measurements.rx_power[eNB_id][aarx];
|
|
||||||
} //aarx
|
|
||||||
|
|
||||||
ue->measurements.rx_power_tot_dB[eNB_id] = (unsigned short) dB_fixed(ue->measurements.rx_power_tot[eNB_id]);
|
ue->measurements.rx_spatial_power_dB[gNB_id][aatx][aarx] = (unsigned short) dB_fixed(ue->measurements.rx_spatial_power[gNB_id][aatx][aarx]);
|
||||||
|
ue->measurements.rx_power[gNB_id][aarx] += ue->measurements.rx_spatial_power[gNB_id][aatx][aarx];
|
||||||
|
|
||||||
} //eNB_id
|
}
|
||||||
|
|
||||||
//printf("ue measurement addr dlch %p\n", dl_ch);
|
ue->measurements.rx_power_dB[gNB_id][aarx] = (unsigned short) dB_fixed(ue->measurements.rx_power[gNB_id][aarx]);
|
||||||
|
ue->measurements.rx_power_tot[gNB_id] += ue->measurements.rx_power[gNB_id][aarx];
|
||||||
|
|
||||||
eNB_id=0;
|
}
|
||||||
|
|
||||||
if (ue->transmission_mode[eNB_id]!=4 && ue->transmission_mode[eNB_id]!=3)
|
ue->measurements.rx_power_tot_dB[gNB_id] = (unsigned short) dB_fixed(ue->measurements.rx_power_tot[gNB_id]);
|
||||||
ue->measurements.rank[eNB_id] = 0;
|
|
||||||
else
|
}
|
||||||
ue->measurements.rank[eNB_id] = rank_tm3_tm4;
|
|
||||||
// printf ("tx mode %d\n", ue->transmission_mode[eNB_id]);
|
|
||||||
// printf ("rank %d\n", ue->PHY_measurements.rank[eNB_id]);
|
|
||||||
|
|
||||||
// filter to remove jitter
|
// filter to remove jitter
|
||||||
if (ue->init_averaging == 0) {
|
if (ue->init_averaging == 0) {
|
||||||
for (eNB_id = 0; eNB_id < ue->n_connected_eNB; eNB_id++)
|
|
||||||
ue->measurements.rx_power_avg[eNB_id] = (int)
|
|
||||||
(((k1*((long long int)(ue->measurements.rx_power_avg[eNB_id]))) +
|
|
||||||
(k2*((long long int)(ue->measurements.rx_power_tot[eNB_id]))))>>10);
|
|
||||||
|
|
||||||
//LOG_I(PHY,"Noise Power Computation: k1 %d k2 %d n0 avg %d n0 tot %d\n", k1, k2, ue->measurements.n0_power_avg,
|
for (gNB_id = 0; gNB_id < ue->n_connected_eNB; gNB_id++)
|
||||||
// ue->measurements.n0_power_tot);
|
ue->measurements.rx_power_avg[gNB_id] = (int)(((k1*((long long int)(ue->measurements.rx_power_avg[gNB_id]))) + (k2*((long long int)(ue->measurements.rx_power_tot[gNB_id])))) >> 10);
|
||||||
ue->measurements.n0_power_avg = (int)
|
|
||||||
(((k1*((long long int) (ue->measurements.n0_power_avg))) +
|
ue->measurements.n0_power_avg = (int)(((k1*((long long int) (ue->measurements.n0_power_avg))) + (k2*((long long int) (ue->measurements.n0_power_tot))))>>10);
|
||||||
(k2*((long long int) (ue->measurements.n0_power_tot))))>>10);
|
|
||||||
|
LOG_D(PHY, "Noise Power Computation: k1 %lld k2 %lld n0 avg %u n0 tot %u\n", k1, k2, ue->measurements.n0_power_avg, ue->measurements.n0_power_tot);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
for (eNB_id = 0; eNB_id < ue->n_connected_eNB; eNB_id++)
|
|
||||||
ue->measurements.rx_power_avg[eNB_id] = ue->measurements.rx_power_tot[eNB_id];
|
for (gNB_id = 0; gNB_id < ue->n_connected_eNB; gNB_id++)
|
||||||
|
ue->measurements.rx_power_avg[gNB_id] = ue->measurements.rx_power_tot[gNB_id];
|
||||||
|
|
||||||
ue->measurements.n0_power_avg = ue->measurements.n0_power_tot;
|
ue->measurements.n0_power_avg = ue->measurements.n0_power_tot;
|
||||||
ue->init_averaging = 0;
|
ue->init_averaging = 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (eNB_id = 0; eNB_id < ue->n_connected_eNB; eNB_id++) {
|
for (gNB_id = 0; gNB_id < ue->n_connected_eNB; gNB_id++) {
|
||||||
ue->measurements.rx_power_avg_dB[eNB_id] = dB_fixed( ue->measurements.rx_power_avg[eNB_id]);
|
|
||||||
ue->measurements.wideband_cqi_tot[eNB_id] = dB_fixed2(ue->measurements.rx_power_tot[eNB_id],ue->measurements.n0_power_tot);
|
ue->measurements.rx_power_avg_dB[gNB_id] = dB_fixed( ue->measurements.rx_power_avg[gNB_id]);
|
||||||
ue->measurements.wideband_cqi_avg[eNB_id] = dB_fixed2(ue->measurements.rx_power_avg[eNB_id],ue->measurements.n0_power_avg);
|
ue->measurements.wideband_cqi_tot[gNB_id] = dB_fixed2(ue->measurements.rx_power_tot[gNB_id], ue->measurements.n0_power_tot);
|
||||||
ue->measurements.rx_rssi_dBm[eNB_id] = ue->measurements.rx_power_avg_dB[eNB_id] - ue->rx_total_gain_dB;
|
ue->measurements.wideband_cqi_avg[gNB_id] = dB_fixed2(ue->measurements.rx_power_avg[gNB_id], ue->measurements.n0_power_avg);
|
||||||
//#ifdef DEBUG_MEAS_UE
|
ue->measurements.rx_rssi_dBm[gNB_id] = ue->measurements.rx_power_avg_dB[gNB_id] - ue->rx_total_gain_dB;
|
||||||
LOG_D(PHY,"[eNB %d] Subframe %d, RSSI %d dBm, RSSI (digital) %d dB, WBandCQI %d dB, rxPwrAvg %d, n0PwrAvg %d\n",
|
|
||||||
eNB_id,
|
LOG_D(PHY, "[gNB %d] Slot %d, RSSI %d dBm, RSSI (digital) %d dB, WBandCQI %d dB, rxPwrAvg %d, n0PwrAvg %d\n",
|
||||||
subframe,
|
gNB_id,
|
||||||
ue->measurements.rx_rssi_dBm[eNB_id],
|
slot,
|
||||||
ue->measurements.rx_power_avg_dB[eNB_id],
|
ue->measurements.rx_rssi_dBm[gNB_id],
|
||||||
ue->measurements.wideband_cqi_avg[eNB_id],
|
ue->measurements.rx_power_avg_dB[gNB_id],
|
||||||
ue->measurements.rx_power_avg[eNB_id],
|
ue->measurements.wideband_cqi_avg[gNB_id],
|
||||||
|
ue->measurements.rx_power_avg[gNB_id],
|
||||||
ue->measurements.n0_power_tot);
|
ue->measurements.n0_power_tot);
|
||||||
//#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(__x86_64__) || defined(__i386__)
|
#if defined(__x86_64__) || defined(__i386__)
|
||||||
@@ -243,7 +199,7 @@ void nr_ue_rsrp_measurements(PHY_VARS_NR_UE *ue,
|
|||||||
unsigned int ssb_offset = ue->frame_parms.first_carrier_offset + ue->frame_parms.ssb_start_subcarrier;
|
unsigned int ssb_offset = ue->frame_parms.first_carrier_offset + ue->frame_parms.ssb_start_subcarrier;
|
||||||
if (ssb_offset>= ue->frame_parms.ofdm_symbol_size) ssb_offset-=ue->frame_parms.ofdm_symbol_size;
|
if (ssb_offset>= ue->frame_parms.ofdm_symbol_size) ssb_offset-=ue->frame_parms.ofdm_symbol_size;
|
||||||
|
|
||||||
symbol_offset = ue->frame_parms.ofdm_symbol_size*(ue->symbol_offset+1);
|
symbol_offset = ue->frame_parms.ofdm_symbol_size*((ue->symbol_offset+1)%(ue->frame_parms.symbols_per_slot));
|
||||||
|
|
||||||
ue->measurements.rsrp[eNB_offset] = 0;
|
ue->measurements.rsrp[eNB_offset] = 0;
|
||||||
|
|
||||||
@@ -286,7 +242,7 @@ void nr_ue_rsrp_measurements(PHY_VARS_NR_UE *ue,
|
|||||||
|
|
||||||
if (eNB_offset == 0)
|
if (eNB_offset == 0)
|
||||||
|
|
||||||
LOG_I(PHY,"[UE %d] slot %d RRC Measurements (idx %d, Cell id %d) => rsrp: %3.1f dBm/RE (%d)\n",
|
LOG_D(PHY,"[UE %d] slot %d RSRP Measurements (idx %d, Cell id %d) => rsrp: %3.1f dBm/RE (%d)\n",
|
||||||
ue->Mod_id,
|
ue->Mod_id,
|
||||||
slot,eNB_offset,
|
slot,eNB_offset,
|
||||||
(eNB_offset>0) ? ue->measurements.adj_cell_id[eNB_offset-1] : ue->frame_parms.Nid_cell,
|
(eNB_offset>0) ? ue->measurements.adj_cell_id[eNB_offset-1] : ue->frame_parms.Nid_cell,
|
||||||
@@ -294,3 +250,66 @@ void nr_ue_rsrp_measurements(PHY_VARS_NR_UE *ue,
|
|||||||
ue->measurements.rsrp[eNB_offset]);
|
ue->measurements.rsrp[eNB_offset]);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void nr_ue_rrc_measurements(PHY_VARS_NR_UE *ue,
|
||||||
|
UE_nr_rxtx_proc_t *proc,
|
||||||
|
uint8_t slot){
|
||||||
|
|
||||||
|
uint8_t k;
|
||||||
|
int aarx, nb_nulls;
|
||||||
|
int16_t *rxF_sss;
|
||||||
|
uint8_t k_left = 48;
|
||||||
|
uint8_t k_right = 183;
|
||||||
|
uint8_t k_length = 8;
|
||||||
|
uint8_t l_sss = ue->symbol_offset + 2;
|
||||||
|
unsigned int ssb_offset = ue->frame_parms.first_carrier_offset + ue->frame_parms.ssb_start_subcarrier;
|
||||||
|
ue->measurements.n0_power_tot = 0;
|
||||||
|
|
||||||
|
LOG_D(PHY, "In %s doing measurements for ssb_offset %d l_sss %d \n", __FUNCTION__, ssb_offset, l_sss);
|
||||||
|
|
||||||
|
for (aarx = 0; aarx<ue->frame_parms.nb_antennas_rx; aarx++) {
|
||||||
|
|
||||||
|
nb_nulls = 0;
|
||||||
|
ue->measurements.n0_power[aarx] = 0;
|
||||||
|
rxF_sss = (int16_t *)&ue->common_vars.common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aarx][(l_sss*ue->frame_parms.ofdm_symbol_size) + ssb_offset];
|
||||||
|
|
||||||
|
//-ve spectrum from SSS
|
||||||
|
for(k = k_left; k < k_left + k_length; k++){
|
||||||
|
|
||||||
|
#ifdef DEBUG_MEAS_RRC
|
||||||
|
LOG_I(PHY, "In %s -rxF_sss %d %d\n", __FUNCTION__, rxF_sss[k*2], rxF_sss[k*2 + 1]);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
ue->measurements.n0_power[aarx] += (((int32_t)rxF_sss[k*2]*rxF_sss[k*2]) + ((int32_t)rxF_sss[k*2 + 1]*rxF_sss[k*2 + 1]));
|
||||||
|
nb_nulls++;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//+ve spectrum from SSS
|
||||||
|
for(k = k_right; k < k_right + k_length; k++){
|
||||||
|
|
||||||
|
#ifdef DEBUG_MEAS_RRC
|
||||||
|
LOG_I(PHY, "In %s +rxF_sss %d %d\n", __FUNCTION__, rxF_sss[k*2], rxF_sss[k*2 + 1]);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
ue->measurements.n0_power[aarx] += (((int32_t)rxF_sss[k*2]*rxF_sss[k*2]) + ((int32_t)rxF_sss[k*2 + 1]*rxF_sss[k*2 + 1]));
|
||||||
|
nb_nulls++;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
ue->measurements.n0_power[aarx] /= nb_nulls;
|
||||||
|
ue->measurements.n0_power_dB[aarx] = (unsigned short) dB_fixed(ue->measurements.n0_power[aarx]);
|
||||||
|
ue->measurements.n0_power_tot += ue->measurements.n0_power[aarx];
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
ue->measurements.n0_power_tot_dB = (unsigned short) dB_fixed(ue->measurements.n0_power_tot/aarx);
|
||||||
|
|
||||||
|
#ifdef DEBUG_MEAS_RRC
|
||||||
|
int nf_usrp = ue->measurements.n0_power_tot_dB + 30 - ((int)openair0_cfg[0].rx_gain[0] - (int)openair0_cfg[0].rx_gain_offset[0]) - 90 - (-174 + dB_fixed(30000/*scs*/) + dB_fixed(ue->frame_parms.ofdm_symbol_size));
|
||||||
|
LOG_D(PHY, "In %s slot %d NF USRP %d dBm\n", __FUNCTION__, nf_usrp);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
LOG_D(PHY, "In %s slot %d Noise Level %d ue->measurements.n0_power_tot_dB %d \n", __FUNCTION__, slot, ue->measurements.n0_power_tot, ue->measurements.n0_power_tot_dB);
|
||||||
|
|
||||||
|
}
|
||||||
|
|||||||
@@ -154,9 +154,11 @@ void nr_pdcch_demapping_deinterleaving(uint32_t *llr,
|
|||||||
|
|
||||||
for (int i=0; i<9; i++) {
|
for (int i=0; i<9; i++) {
|
||||||
z[index_z + i] = llr[index_llr + i];
|
z[index_z + i] = llr[index_llr + i];
|
||||||
|
#ifdef NR_PDCCH_DCI_DEBUG
|
||||||
LOG_D(PHY,"[reg=%d,bundle_j=%d] z[%d]=(%d,%d) <-> \t[f_reg=%d,fbundle_j=%d] llr[%d]=(%d,%d) \n",
|
LOG_D(PHY,"[reg=%d,bundle_j=%d] z[%d]=(%d,%d) <-> \t[f_reg=%d,fbundle_j=%d] llr[%d]=(%d,%d) \n",
|
||||||
reg,bundle_j,(index_z + i),*(int16_t *) &z[index_z + i],*(1 + (int16_t *) &z[index_z + i]),
|
reg,bundle_j,(index_z + i),*(int16_t *) &z[index_z + i],*(1 + (int16_t *) &z[index_z + i]),
|
||||||
f_reg,f_bundle_j,(index_llr + i),*(int16_t *) &llr[index_llr + i], *(1 + (int16_t *) &llr[index_llr + i]));
|
f_reg,f_bundle_j,(index_llr + i),*(int16_t *) &llr[index_llr + i], *(1 + (int16_t *) &llr[index_llr + i]));
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((reg%reg_bundle_size_L) == 0) r++;
|
if ((reg%reg_bundle_size_L) == 0) r++;
|
||||||
@@ -373,7 +375,10 @@ void nr_pdcch_extract_rbs_single(int32_t **rxdataF,
|
|||||||
for (int rb=0;rb<coreset_nbr_rb;rb++,c_rb++) {
|
for (int rb=0;rb<coreset_nbr_rb;rb++,c_rb++) {
|
||||||
c_rb_by6 = c_rb/6;
|
c_rb_by6 = c_rb/6;
|
||||||
// skip zeros in frequency domain bitmap
|
// skip zeros in frequency domain bitmap
|
||||||
while ((coreset_freq_dom[c_rb_by6>>3] & (1<<(c_rb_by6&7))) == 0) c_rb+=6;
|
while ((coreset_freq_dom[c_rb_by6>>3] & (1<<(7-(c_rb_by6&7)))) == 0) {
|
||||||
|
c_rb+=6;
|
||||||
|
c_rb_by6 = c_rb/6;
|
||||||
|
}
|
||||||
|
|
||||||
LOG_DDD("c_rb=%d\n",c_rb);
|
LOG_DDD("c_rb=%d\n",c_rb);
|
||||||
rxF=NULL;
|
rxF=NULL;
|
||||||
|
|||||||
@@ -241,7 +241,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
|
|||||||
uint32_t G;
|
uint32_t G;
|
||||||
uint32_t ret,offset;
|
uint32_t ret,offset;
|
||||||
int32_t no_iteration_ldpc, length_dec;
|
int32_t no_iteration_ldpc, length_dec;
|
||||||
uint32_t r,r_offset=0,Kr=8424,Kr_bytes,K_bytes_F,err_flag=0;
|
uint32_t r,r_offset=0,Kr=8424,Kr_bytes,K_bits_F,err_flag=0;
|
||||||
uint8_t crc_type;
|
uint8_t crc_type;
|
||||||
int8_t llrProcBuf[NR_LDPC_MAX_NUM_LLR] __attribute__ ((aligned(32)));
|
int8_t llrProcBuf[NR_LDPC_MAX_NUM_LLR] __attribute__ ((aligned(32)));
|
||||||
t_nrLDPC_dec_params decParams;
|
t_nrLDPC_dec_params decParams;
|
||||||
@@ -349,32 +349,28 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
|
|||||||
if ((A <=292) || ((A<=3824) && (Coderate <= 0.6667)) || Coderate <= 0.25)
|
if ((A <=292) || ((A<=3824) && (Coderate <= 0.6667)) || Coderate <= 0.25)
|
||||||
{
|
{
|
||||||
p_decParams->BG = 2;
|
p_decParams->BG = 2;
|
||||||
|
kc = 52;
|
||||||
if (Coderate < 0.3333){
|
if (Coderate < 0.3333){
|
||||||
p_decParams->R = 15;
|
p_decParams->R = 15;
|
||||||
kc = 52;
|
|
||||||
}
|
}
|
||||||
else if (Coderate <0.6667){
|
else if (Coderate <0.6667){
|
||||||
p_decParams->R = 13;
|
p_decParams->R = 13;
|
||||||
kc = 32;
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
p_decParams->R = 23;
|
p_decParams->R = 23;
|
||||||
kc = 17;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
p_decParams->BG = 1;
|
p_decParams->BG = 1;
|
||||||
|
kc = 68;
|
||||||
if (Coderate < 0.6667){
|
if (Coderate < 0.6667){
|
||||||
p_decParams->R = 13;
|
p_decParams->R = 13;
|
||||||
kc = 68;
|
|
||||||
}
|
}
|
||||||
else if (Coderate <0.8889){
|
else if (Coderate <0.8889){
|
||||||
p_decParams->R = 23;
|
p_decParams->R = 23;
|
||||||
kc = 35;
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
p_decParams->R = 89;
|
p_decParams->R = 89;
|
||||||
kc = 27;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -434,8 +430,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
|
|||||||
|
|
||||||
Kr = harq_process->K; // [hna] overwrites this line "Kr = p_decParams->Z*kb"
|
Kr = harq_process->K; // [hna] overwrites this line "Kr = p_decParams->Z*kb"
|
||||||
Kr_bytes = Kr>>3;
|
Kr_bytes = Kr>>3;
|
||||||
|
K_bits_F = Kr-harq_process->F;
|
||||||
K_bytes_F = Kr_bytes-(harq_process->F>>3);
|
|
||||||
|
|
||||||
for (r=0; r<harq_process->C; r++) {
|
for (r=0; r<harq_process->C; r++) {
|
||||||
|
|
||||||
@@ -558,24 +553,16 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
|
|||||||
|
|
||||||
//printf("harq process dr iteration %d\n", p_decParams->numMaxIter);
|
//printf("harq process dr iteration %d\n", p_decParams->numMaxIter);
|
||||||
|
|
||||||
memset(pv,0,2*harq_process->Z*sizeof(int16_t));
|
//set first 2*Z_c bits to zeros
|
||||||
//memset(pl,0,2*p_decParams->Z*sizeof(int8_t));
|
memset(&z[0],0,2*harq_process->Z*sizeof(int16_t));
|
||||||
memset((pv+K_bytes_F),127,harq_process->F*sizeof(int16_t));
|
//set Filler bits
|
||||||
|
memset((&z[0]+K_bits_F),127,harq_process->F*sizeof(int16_t));
|
||||||
|
//Move coded bits before filler bits
|
||||||
for (i=((2*p_decParams->Z)>>3), j = 0; i < K_bytes_F; i++, j++)
|
memcpy((&z[0]+2*harq_process->Z),harq_process->d[r],(K_bits_F-2*harq_process->Z)*sizeof(int16_t));
|
||||||
{
|
//skip filler bits
|
||||||
pv[i]= _mm_loadu_si128((__m128i*)(&harq_process->d[r][8*j]));
|
memcpy((&z[0]+Kr),harq_process->d[r]+(Kr-2*harq_process->Z),(kc*harq_process->Z-Kr)*sizeof(int16_t));
|
||||||
}
|
//Saturate coded bits before decoding into 8 bits values
|
||||||
// Kbytes_F = Kr_bytes - F>>3
|
for (i=0, j=0; j < ((kc*harq_process->Z)>>4)+1; i+=2, j++)
|
||||||
j+=(harq_process->F>>3);
|
|
||||||
// for (i=Kr_bytes,j=K_bytes_F-((2*p_decParams->Z)>>3); i < ((kc*p_decParams->Z)>>3); i++, j++)
|
|
||||||
for (i=Kr_bytes; i < ((kc*p_decParams->Z)>>3); i++,j++)
|
|
||||||
{
|
|
||||||
pv[i]= _mm_loadu_si128((__m128i*)(&harq_process->d[r][8*j]));
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i=0, j=0; j < ((kc*p_decParams->Z)>>4); i+=2, j++)
|
|
||||||
{
|
{
|
||||||
pl[j] = _mm_packs_epi16(pv[i],pv[i+1]);
|
pl[j] = _mm_packs_epi16(pv[i],pv[i+1]);
|
||||||
}
|
}
|
||||||
@@ -776,7 +763,7 @@ uint32_t nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
|
|||||||
uint32_t A,E;
|
uint32_t A,E;
|
||||||
uint32_t G;
|
uint32_t G;
|
||||||
uint32_t ret,offset;
|
uint32_t ret,offset;
|
||||||
uint32_t r,r_offset=0,Kr=8424,Kr_bytes,err_flag=0,K_bytes_F;
|
uint32_t r,r_offset=0,Kr=8424,Kr_bytes,err_flag=0,K_bits_F;
|
||||||
uint8_t crc_type;
|
uint8_t crc_type;
|
||||||
//UE_rxtx_proc_t *proc = &phy_vars_ue->proc;
|
//UE_rxtx_proc_t *proc = &phy_vars_ue->proc;
|
||||||
int32_t no_iteration_ldpc,length_dec;
|
int32_t no_iteration_ldpc,length_dec;
|
||||||
@@ -895,32 +882,28 @@ uint32_t nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
|
|||||||
if ((A <=292) || ((A<=3824) && (Coderate <= 0.6667)) || Coderate <= 0.25)
|
if ((A <=292) || ((A<=3824) && (Coderate <= 0.6667)) || Coderate <= 0.25)
|
||||||
{
|
{
|
||||||
p_decParams->BG = 2;
|
p_decParams->BG = 2;
|
||||||
|
kc = 52;
|
||||||
if (Coderate < 0.3333){
|
if (Coderate < 0.3333){
|
||||||
p_decParams->R = 15;
|
p_decParams->R = 15;
|
||||||
kc = 52;
|
|
||||||
}
|
}
|
||||||
else if (Coderate <0.6667){
|
else if (Coderate <0.6667){
|
||||||
p_decParams->R = 13;
|
p_decParams->R = 13;
|
||||||
kc = 32;
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
p_decParams->R = 23;
|
p_decParams->R = 23;
|
||||||
kc = 17;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
p_decParams->BG = 1;
|
p_decParams->BG = 1;
|
||||||
|
kc = 68;
|
||||||
if (Coderate < 0.6667){
|
if (Coderate < 0.6667){
|
||||||
p_decParams->R = 13;
|
p_decParams->R = 13;
|
||||||
kc = 68;
|
|
||||||
}
|
}
|
||||||
else if (Coderate <0.8889){
|
else if (Coderate <0.8889){
|
||||||
p_decParams->R = 23;
|
p_decParams->R = 23;
|
||||||
kc = 35;
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
p_decParams->R = 89;
|
p_decParams->R = 89;
|
||||||
kc = 27;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1020,7 +1003,7 @@ uint32_t nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
|
|||||||
|
|
||||||
Kr = harq_process->K;
|
Kr = harq_process->K;
|
||||||
Kr_bytes = Kr>>3;
|
Kr_bytes = Kr>>3;
|
||||||
K_bytes_F = Kr_bytes-(harq_process->F>>3);
|
K_bits_F = Kr-harq_process->F;
|
||||||
|
|
||||||
E = nr_get_E(G, harq_process->C, harq_process->Qm, harq_process->Nl, r);
|
E = nr_get_E(G, harq_process->C, harq_process->Qm, harq_process->Nl, r);
|
||||||
|
|
||||||
@@ -1152,24 +1135,16 @@ uint32_t nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
|
|||||||
inv_d[cnt] = (1)*harq_process->d[r][cnt];
|
inv_d[cnt] = (1)*harq_process->d[r][cnt];
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
memset(pv,0,2*p_decParams->Z*sizeof(int16_t));
|
//set first 2*Z_c bits to zeros
|
||||||
//memset(pl,0,2*p_decParams->Z*sizeof(int8_t));
|
memset(&z[0],0,2*harq_process->Z*sizeof(int16_t));
|
||||||
memset((pv+K_bytes_F),127,harq_process->F*sizeof(int16_t));
|
//set Filler bits
|
||||||
|
memset((&z[0]+K_bits_F),127,harq_process->F*sizeof(int16_t));
|
||||||
|
//Move coded bits before filler bits
|
||||||
for (i=((2*p_decParams->Z)>>3), j = 0; i < K_bytes_F; i++, j++)
|
memcpy((&z[0]+2*harq_process->Z),harq_process->d[r],(K_bits_F-2*harq_process->Z)*sizeof(int16_t));
|
||||||
{
|
//skip filler bits
|
||||||
pv[i]= _mm_loadu_si128((__m128i*)(&harq_process->d[r][8*j]));
|
memcpy((&z[0]+Kr),harq_process->d[r]+(Kr-2*harq_process->Z),(kc*harq_process->Z-Kr)*sizeof(int16_t));
|
||||||
}
|
//Saturate coded bits before decoding into 8 bits values
|
||||||
|
for (i=0, j=0; j < ((kc*harq_process->Z)>>4)+1; i+=2, j++)
|
||||||
j+=(harq_process->F>>3);
|
|
||||||
// for (i=Kr_bytes,j=K_bytes_F-((2*p_decParams->Z)>>3); i < ((kc*p_decParams->Z)>>3); i++, j++)
|
|
||||||
for (i=Kr_bytes; i < ((kc*p_decParams->Z)>>3); i++,j++)
|
|
||||||
{
|
|
||||||
pv[i]= _mm_loadu_si128((__m128i*)(&harq_process->d[r][8*j]));
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i=0, j=0; j < ((kc*p_decParams->Z)>>4); i+=2, j++)
|
|
||||||
{
|
{
|
||||||
pl[j] = _mm_packs_epi16(pv[i],pv[i+1]);
|
pl[j] = _mm_packs_epi16(pv[i],pv[i+1]);
|
||||||
}
|
}
|
||||||
@@ -1395,7 +1370,7 @@ void nr_dlsch_decoding_process(void *arg)
|
|||||||
uint32_t A,E;
|
uint32_t A,E;
|
||||||
uint32_t G;
|
uint32_t G;
|
||||||
uint32_t ret,offset;
|
uint32_t ret,offset;
|
||||||
uint32_t r,r_offset=0,Kr,Kr_bytes,err_flag=0,K_bytes_F;
|
uint32_t r,r_offset=0,Kr,Kr_bytes,err_flag=0,K_bits_F;
|
||||||
uint8_t crc_type;
|
uint8_t crc_type;
|
||||||
uint8_t C,Cprime;
|
uint8_t C,Cprime;
|
||||||
uint8_t Qm;
|
uint8_t Qm;
|
||||||
@@ -1457,32 +1432,28 @@ void nr_dlsch_decoding_process(void *arg)
|
|||||||
if ((A <=292) || ((A<=3824) && (Coderate <= 0.6667)) || Coderate <= 0.25)
|
if ((A <=292) || ((A<=3824) && (Coderate <= 0.6667)) || Coderate <= 0.25)
|
||||||
{
|
{
|
||||||
p_decParams->BG = 2;
|
p_decParams->BG = 2;
|
||||||
|
kc = 52;
|
||||||
if (Coderate < 0.3333){
|
if (Coderate < 0.3333){
|
||||||
p_decParams->R = 15;
|
p_decParams->R = 15;
|
||||||
kc = 52;
|
|
||||||
}
|
}
|
||||||
else if (Coderate <0.6667){
|
else if (Coderate <0.6667){
|
||||||
p_decParams->R = 13;
|
p_decParams->R = 13;
|
||||||
kc = 32;
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
p_decParams->R = 23;
|
p_decParams->R = 23;
|
||||||
kc = 17;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
p_decParams->BG = 1;
|
p_decParams->BG = 1;
|
||||||
|
kc = 68;
|
||||||
if (Coderate < 0.6667){
|
if (Coderate < 0.6667){
|
||||||
p_decParams->R = 13;
|
p_decParams->R = 13;
|
||||||
kc = 68;
|
|
||||||
}
|
}
|
||||||
else if (Coderate <0.8889){
|
else if (Coderate <0.8889){
|
||||||
p_decParams->R = 23;
|
p_decParams->R = 23;
|
||||||
kc = 35;
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
p_decParams->R = 89;
|
p_decParams->R = 89;
|
||||||
kc = 27;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1561,7 +1532,7 @@ void nr_dlsch_decoding_process(void *arg)
|
|||||||
|
|
||||||
Kr = harq_process->K;
|
Kr = harq_process->K;
|
||||||
Kr_bytes = Kr>>3;
|
Kr_bytes = Kr>>3;
|
||||||
K_bytes_F = Kr_bytes-(harq_process->F>>3);
|
K_bits_F = Kr-harq_process->F;
|
||||||
|
|
||||||
E = nr_get_E(G, harq_process->C, harq_process->Qm, harq_process->Nl, r);
|
E = nr_get_E(G, harq_process->C, harq_process->Qm, harq_process->Nl, r);
|
||||||
|
|
||||||
@@ -1681,23 +1652,16 @@ void nr_dlsch_decoding_process(void *arg)
|
|||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
memset(pv,0,2*p_decParams->Z*sizeof(int16_t));
|
//set first 2*Z_c bits to zeros
|
||||||
//memset(pl,0,2*p_decParams->Z*sizeof(int8_t));
|
memset(&z[0],0,2*harq_process->Z*sizeof(int16_t));
|
||||||
memset((pv+K_bytes_F),127,harq_process->F*sizeof(int16_t));
|
//set Filler bits
|
||||||
|
memset((&z[0]+K_bits_F),127,harq_process->F*sizeof(int16_t));
|
||||||
for (i=((2*p_decParams->Z)>>3), j = 0; i < K_bytes_F; i++, j++)
|
//Move coded bits before filler bits
|
||||||
{
|
memcpy((&z[0]+2*harq_process->Z),harq_process->d[r],(K_bits_F-2*harq_process->Z)*sizeof(int16_t));
|
||||||
pv[i]= _mm_loadu_si128((__m128i*)(&harq_process->d[r][8*j]));
|
//skip filler bits
|
||||||
}
|
memcpy((&z[0]+Kr),harq_process->d[r]+(Kr-2*harq_process->Z),(kc*harq_process->Z-Kr)*sizeof(int16_t));
|
||||||
|
//Saturate coded bits before decoding into 8 bits values
|
||||||
j+=(harq_process->F>>3);
|
for (i=0, j=0; j < ((kc*harq_process->Z)>>4)+1; i+=2, j++)
|
||||||
// for (i=Kr_bytes,j=K_bytes_F-((2*p_decParams->Z)>>3); i < ((kc*p_decParams->Z)>>3); i++, j++)
|
|
||||||
for (i=Kr_bytes; i < ((kc*p_decParams->Z)>>3); i++,j++)
|
|
||||||
{
|
|
||||||
pv[i]= _mm_loadu_si128((__m128i*)(&harq_process->d[r][8*j]));
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i=0, j=0; j < ((kc*p_decParams->Z)>>4); i+=2, j++)
|
|
||||||
{
|
{
|
||||||
pl[j] = _mm_packs_epi16(pv[i],pv[i+1]);
|
pl[j] = _mm_packs_epi16(pv[i],pv[i+1]);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -546,6 +546,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
pdsch_vars[eNB_id]->dl_ch_estimates_ext,
|
pdsch_vars[eNB_id]->dl_ch_estimates_ext,
|
||||||
pdsch_vars[eNB_id]->dl_ch_mag0,
|
pdsch_vars[eNB_id]->dl_ch_mag0,
|
||||||
pdsch_vars[eNB_id]->dl_ch_magb0,
|
pdsch_vars[eNB_id]->dl_ch_magb0,
|
||||||
|
pdsch_vars[eNB_id]->dl_ch_magr0,
|
||||||
pdsch_vars[eNB_id]->rxdataF_comp0,
|
pdsch_vars[eNB_id]->rxdataF_comp0,
|
||||||
(aatx>1) ? pdsch_vars[eNB_id]->rho : NULL,
|
(aatx>1) ? pdsch_vars[eNB_id]->rho : NULL,
|
||||||
frame_parms,
|
frame_parms,
|
||||||
@@ -860,6 +861,7 @@ void nr_dlsch_channel_compensation(int **rxdataF_ext,
|
|||||||
int **dl_ch_estimates_ext,
|
int **dl_ch_estimates_ext,
|
||||||
int **dl_ch_mag,
|
int **dl_ch_mag,
|
||||||
int **dl_ch_magb,
|
int **dl_ch_magb,
|
||||||
|
int **dl_ch_magr,
|
||||||
int **rxdataF_comp,
|
int **rxdataF_comp,
|
||||||
int **rho,
|
int **rho,
|
||||||
NR_DL_FRAME_PARMS *frame_parms,
|
NR_DL_FRAME_PARMS *frame_parms,
|
||||||
@@ -876,17 +878,23 @@ void nr_dlsch_channel_compensation(int **rxdataF_ext,
|
|||||||
|
|
||||||
unsigned short rb;
|
unsigned short rb;
|
||||||
unsigned char aatx,aarx;
|
unsigned char aatx,aarx;
|
||||||
__m128i *dl_ch128,*dl_ch128_2,*dl_ch_mag128,*dl_ch_mag128b,*rxdataF128,*rxdataF_comp128,*rho128;
|
__m128i *dl_ch128,*dl_ch128_2,*dl_ch_mag128,*dl_ch_mag128b,*dl_ch_mag128r,*rxdataF128,*rxdataF_comp128,*rho128;
|
||||||
__m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp128,QAM_amp128b;
|
__m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp128,QAM_amp128b,QAM_amp128r;
|
||||||
QAM_amp128b = _mm_setzero_si128();
|
QAM_amp128b = _mm_setzero_si128();
|
||||||
|
|
||||||
for (aatx=0; aatx<frame_parms->nb_antenna_ports_gNB; aatx++) {
|
for (aatx=0; aatx<frame_parms->nb_antenna_ports_gNB; aatx++) {
|
||||||
if (mod_order == 4) {
|
if (mod_order == 4) {
|
||||||
QAM_amp128 = _mm_set1_epi16(QAM16_n1); // 2/sqrt(10)
|
QAM_amp128 = _mm_set1_epi16(QAM16_n1); // 2/sqrt(10)
|
||||||
QAM_amp128b = _mm_setzero_si128();
|
QAM_amp128b = _mm_setzero_si128();
|
||||||
|
QAM_amp128r = _mm_setzero_si128();
|
||||||
} else if (mod_order == 6) {
|
} else if (mod_order == 6) {
|
||||||
QAM_amp128 = _mm_set1_epi16(QAM64_n1); //
|
QAM_amp128 = _mm_set1_epi16(QAM64_n1); //
|
||||||
QAM_amp128b = _mm_set1_epi16(QAM64_n2);
|
QAM_amp128b = _mm_set1_epi16(QAM64_n2);
|
||||||
|
QAM_amp128r = _mm_setzero_si128();
|
||||||
|
} else if (mod_order == 8) {
|
||||||
|
QAM_amp128 = _mm_set1_epi16(QAM256_n1);
|
||||||
|
QAM_amp128b = _mm_set1_epi16(QAM256_n2);
|
||||||
|
QAM_amp128r = _mm_set1_epi16(QAM256_n3);
|
||||||
}
|
}
|
||||||
|
|
||||||
// printf("comp: rxdataF_comp %p, symbol %d\n",rxdataF_comp[0],symbol);
|
// printf("comp: rxdataF_comp %p, symbol %d\n",rxdataF_comp[0],symbol);
|
||||||
@@ -896,6 +904,7 @@ void nr_dlsch_channel_compensation(int **rxdataF_ext,
|
|||||||
dl_ch128 = (__m128i *)&dl_ch_estimates_ext[(aatx<<1)+aarx][symbol*nb_rb*12];
|
dl_ch128 = (__m128i *)&dl_ch_estimates_ext[(aatx<<1)+aarx][symbol*nb_rb*12];
|
||||||
dl_ch_mag128 = (__m128i *)&dl_ch_mag[(aatx<<1)+aarx][symbol*nb_rb*12];
|
dl_ch_mag128 = (__m128i *)&dl_ch_mag[(aatx<<1)+aarx][symbol*nb_rb*12];
|
||||||
dl_ch_mag128b = (__m128i *)&dl_ch_magb[(aatx<<1)+aarx][symbol*nb_rb*12];
|
dl_ch_mag128b = (__m128i *)&dl_ch_magb[(aatx<<1)+aarx][symbol*nb_rb*12];
|
||||||
|
dl_ch_mag128r = (__m128i *)&dl_ch_magr[(aatx<<1)+aarx][symbol*nb_rb*12];
|
||||||
rxdataF128 = (__m128i *)&rxdataF_ext[aarx][symbol*nb_rb*12];
|
rxdataF128 = (__m128i *)&rxdataF_ext[aarx][symbol*nb_rb*12];
|
||||||
rxdataF_comp128 = (__m128i *)&rxdataF_comp[(aatx<<1)+aarx][symbol*nb_rb*12];
|
rxdataF_comp128 = (__m128i *)&rxdataF_comp[(aatx<<1)+aarx][symbol*nb_rb*12];
|
||||||
|
|
||||||
@@ -916,6 +925,7 @@ void nr_dlsch_channel_compensation(int **rxdataF_ext,
|
|||||||
|
|
||||||
dl_ch_mag128[0] = _mm_unpacklo_epi16(mmtmpD0,mmtmpD0);
|
dl_ch_mag128[0] = _mm_unpacklo_epi16(mmtmpD0,mmtmpD0);
|
||||||
dl_ch_mag128b[0] = dl_ch_mag128[0];
|
dl_ch_mag128b[0] = dl_ch_mag128[0];
|
||||||
|
dl_ch_mag128r[0] = dl_ch_mag128[0];
|
||||||
dl_ch_mag128[0] = _mm_mulhi_epi16(dl_ch_mag128[0],QAM_amp128);
|
dl_ch_mag128[0] = _mm_mulhi_epi16(dl_ch_mag128[0],QAM_amp128);
|
||||||
dl_ch_mag128[0] = _mm_slli_epi16(dl_ch_mag128[0],1);
|
dl_ch_mag128[0] = _mm_slli_epi16(dl_ch_mag128[0],1);
|
||||||
//print_ints("Re(ch):",(int16_t*)&mmtmpD0);
|
//print_ints("Re(ch):",(int16_t*)&mmtmpD0);
|
||||||
@@ -923,6 +933,7 @@ void nr_dlsch_channel_compensation(int **rxdataF_ext,
|
|||||||
//print_shorts("mag:",(int16_t*)&dl_ch_mag128[0]);
|
//print_shorts("mag:",(int16_t*)&dl_ch_mag128[0]);
|
||||||
dl_ch_mag128[1] = _mm_unpackhi_epi16(mmtmpD0,mmtmpD0);
|
dl_ch_mag128[1] = _mm_unpackhi_epi16(mmtmpD0,mmtmpD0);
|
||||||
dl_ch_mag128b[1] = dl_ch_mag128[1];
|
dl_ch_mag128b[1] = dl_ch_mag128[1];
|
||||||
|
dl_ch_mag128r[1] = dl_ch_mag128[1];
|
||||||
dl_ch_mag128[1] = _mm_mulhi_epi16(dl_ch_mag128[1],QAM_amp128);
|
dl_ch_mag128[1] = _mm_mulhi_epi16(dl_ch_mag128[1],QAM_amp128);
|
||||||
dl_ch_mag128[1] = _mm_slli_epi16(dl_ch_mag128[1],1);
|
dl_ch_mag128[1] = _mm_slli_epi16(dl_ch_mag128[1],1);
|
||||||
|
|
||||||
@@ -933,6 +944,7 @@ void nr_dlsch_channel_compensation(int **rxdataF_ext,
|
|||||||
|
|
||||||
dl_ch_mag128[2] = _mm_unpacklo_epi16(mmtmpD1,mmtmpD1);
|
dl_ch_mag128[2] = _mm_unpacklo_epi16(mmtmpD1,mmtmpD1);
|
||||||
dl_ch_mag128b[2] = dl_ch_mag128[2];
|
dl_ch_mag128b[2] = dl_ch_mag128[2];
|
||||||
|
dl_ch_mag128r[2] = dl_ch_mag128[2];
|
||||||
|
|
||||||
dl_ch_mag128[2] = _mm_mulhi_epi16(dl_ch_mag128[2],QAM_amp128);
|
dl_ch_mag128[2] = _mm_mulhi_epi16(dl_ch_mag128[2],QAM_amp128);
|
||||||
dl_ch_mag128[2] = _mm_slli_epi16(dl_ch_mag128[2],1);
|
dl_ch_mag128[2] = _mm_slli_epi16(dl_ch_mag128[2],1);
|
||||||
@@ -945,9 +957,18 @@ void nr_dlsch_channel_compensation(int **rxdataF_ext,
|
|||||||
dl_ch_mag128b[1] = _mm_mulhi_epi16(dl_ch_mag128b[1],QAM_amp128b);
|
dl_ch_mag128b[1] = _mm_mulhi_epi16(dl_ch_mag128b[1],QAM_amp128b);
|
||||||
dl_ch_mag128b[1] = _mm_slli_epi16(dl_ch_mag128b[1],1);
|
dl_ch_mag128b[1] = _mm_slli_epi16(dl_ch_mag128b[1],1);
|
||||||
|
|
||||||
|
dl_ch_mag128r[0] = _mm_mulhi_epi16(dl_ch_mag128r[0],QAM_amp128r);
|
||||||
|
dl_ch_mag128r[0] = _mm_slli_epi16(dl_ch_mag128r[0],1);
|
||||||
|
|
||||||
|
dl_ch_mag128r[1] = _mm_mulhi_epi16(dl_ch_mag128r[1],QAM_amp128r);
|
||||||
|
dl_ch_mag128r[1] = _mm_slli_epi16(dl_ch_mag128r[1],1);
|
||||||
|
|
||||||
if (pilots==0) {
|
if (pilots==0) {
|
||||||
dl_ch_mag128b[2] = _mm_mulhi_epi16(dl_ch_mag128b[2],QAM_amp128b);
|
dl_ch_mag128b[2] = _mm_mulhi_epi16(dl_ch_mag128b[2],QAM_amp128b);
|
||||||
dl_ch_mag128b[2] = _mm_slli_epi16(dl_ch_mag128b[2],1);
|
dl_ch_mag128b[2] = _mm_slli_epi16(dl_ch_mag128b[2],1);
|
||||||
|
|
||||||
|
dl_ch_mag128r[2] = _mm_mulhi_epi16(dl_ch_mag128r[2],QAM_amp128r);
|
||||||
|
dl_ch_mag128r[2] = _mm_slli_epi16(dl_ch_mag128r[2],1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1015,12 +1036,14 @@ void nr_dlsch_channel_compensation(int **rxdataF_ext,
|
|||||||
dl_ch128+=3;
|
dl_ch128+=3;
|
||||||
dl_ch_mag128+=3;
|
dl_ch_mag128+=3;
|
||||||
dl_ch_mag128b+=3;
|
dl_ch_mag128b+=3;
|
||||||
|
dl_ch_mag128r+=3;
|
||||||
rxdataF128+=3;
|
rxdataF128+=3;
|
||||||
rxdataF_comp128+=3;
|
rxdataF_comp128+=3;
|
||||||
} else { // we have a smaller PDSCH in symbols with pilots so skip last group of 4 REs and increment less
|
} else { // we have a smaller PDSCH in symbols with pilots so skip last group of 4 REs and increment less
|
||||||
dl_ch128+=2;
|
dl_ch128+=2;
|
||||||
dl_ch_mag128+=2;
|
dl_ch_mag128+=2;
|
||||||
dl_ch_mag128b+=2;
|
dl_ch_mag128b+=2;
|
||||||
|
dl_ch_mag128r+=2;
|
||||||
rxdataF128+=2;
|
rxdataF128+=2;
|
||||||
rxdataF_comp128+=2;
|
rxdataF_comp128+=2;
|
||||||
}
|
}
|
||||||
@@ -2620,6 +2643,29 @@ static int nr_dlsch_llr(NR_UE_PDSCH **pdsch_vars,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case 8:
|
||||||
|
if ((rx_type==rx_standard) || (codeword_TB1 == -1)) {
|
||||||
|
nr_dlsch_256qam_llr(frame_parms,
|
||||||
|
pdsch_vars[eNB_id]->rxdataF_comp0,
|
||||||
|
(int16_t*)pllr_symbol_cw0,
|
||||||
|
pdsch_vars[eNB_id]->dl_ch_mag0,
|
||||||
|
pdsch_vars[eNB_id]->dl_ch_magb0,
|
||||||
|
pdsch_vars[eNB_id]->dl_ch_magr0,
|
||||||
|
symbol,len,first_symbol_flag,nb_rb,
|
||||||
|
pdsch_vars[eNB_id]->llr_offset[symbol],
|
||||||
|
beamforming_mode);
|
||||||
|
} else if (codeword_TB0 == -1){
|
||||||
|
nr_dlsch_256qam_llr(frame_parms,
|
||||||
|
pdsch_vars[eNB_id]->rxdataF_comp0,
|
||||||
|
pllr_symbol_cw1,
|
||||||
|
pdsch_vars[eNB_id]->dl_ch_mag0,
|
||||||
|
pdsch_vars[eNB_id]->dl_ch_magb0,
|
||||||
|
pdsch_vars[eNB_id]->dl_ch_magr0,
|
||||||
|
symbol,len,first_symbol_flag,nb_rb,
|
||||||
|
pdsch_vars[eNB_id]->llr_offset[symbol],
|
||||||
|
beamforming_mode);
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
LOG_W(PHY,"rx_dlsch.c : Unknown mod_order!!!!\n");
|
LOG_W(PHY,"rx_dlsch.c : Unknown mod_order!!!!\n");
|
||||||
return(-1);
|
return(-1);
|
||||||
@@ -2660,6 +2706,19 @@ static int nr_dlsch_llr(NR_UE_PDSCH **pdsch_vars,
|
|||||||
beamforming_mode);
|
beamforming_mode);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case 8 :
|
||||||
|
if (rx_type==rx_standard) {
|
||||||
|
nr_dlsch_256qam_llr(frame_parms,
|
||||||
|
pdsch_vars[eNB_id]->rxdataF_comp0,
|
||||||
|
pllr_symbol_cw0,
|
||||||
|
pdsch_vars[eNB_id]->dl_ch_mag0,
|
||||||
|
pdsch_vars[eNB_id]->dl_ch_magb0,
|
||||||
|
pdsch_vars[eNB_id]->dl_ch_magr0,
|
||||||
|
symbol,len,first_symbol_flag,nb_rb,
|
||||||
|
pdsch_vars[eNB_id]->llr_offset[symbol],
|
||||||
|
beamforming_mode);
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
LOG_W(PHY,"rx_dlsch.c : Unknown mod_order!!!!\n");
|
LOG_W(PHY,"rx_dlsch.c : Unknown mod_order!!!!\n");
|
||||||
return(-1);
|
return(-1);
|
||||||
|
|||||||
@@ -1089,6 +1089,108 @@ void nr_dlsch_64qam_llr_SIC(NR_DL_FRAME_PARMS *frame_parms,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
//#endif
|
//#endif
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------------------
|
||||||
|
// 256-QAM
|
||||||
|
//----------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
void nr_dlsch_256qam_llr(NR_DL_FRAME_PARMS *frame_parms,
|
||||||
|
int32_t **rxdataF_comp,
|
||||||
|
int16_t *dlsch_llr,
|
||||||
|
int32_t **dl_ch_mag,
|
||||||
|
int32_t **dl_ch_magb,
|
||||||
|
int32_t **dl_ch_magr,
|
||||||
|
uint8_t symbol,
|
||||||
|
uint32_t len,
|
||||||
|
uint8_t first_symbol_flag,
|
||||||
|
uint16_t nb_rb,
|
||||||
|
uint32_t llr_offset,
|
||||||
|
uint8_t beamforming_mode)
|
||||||
|
{
|
||||||
|
__m128i *rxF = (__m128i*)&rxdataF_comp[0][(symbol*nb_rb*12)];
|
||||||
|
__m128i *ch_mag,*ch_magb,*ch_magr;
|
||||||
|
|
||||||
|
int i,len2;
|
||||||
|
unsigned char len_mod4;
|
||||||
|
short *llr;
|
||||||
|
int16_t *llr2;
|
||||||
|
int8_t *pllr_symbol;
|
||||||
|
|
||||||
|
/*
|
||||||
|
if (first_symbol_flag==1)
|
||||||
|
llr = dlsch_llr;
|
||||||
|
else
|
||||||
|
llr = *llr_save;
|
||||||
|
*/
|
||||||
|
llr = dlsch_llr;
|
||||||
|
|
||||||
|
pllr_symbol = (int8_t*)dlsch_llr;
|
||||||
|
pllr_symbol += llr_offset;
|
||||||
|
|
||||||
|
ch_mag = (__m128i*)&dl_ch_mag[0][(symbol*nb_rb*12)];
|
||||||
|
ch_magb = (__m128i*)&dl_ch_magb[0][(symbol*nb_rb*12)];
|
||||||
|
ch_magr = (__m128i*)&dl_ch_magr[0][(symbol*nb_rb*12)];
|
||||||
|
llr2 = llr;
|
||||||
|
llr += (len*8);
|
||||||
|
|
||||||
|
len_mod4 =len&3;
|
||||||
|
len2=len>>2; // length in quad words (4 REs)
|
||||||
|
len2+=((len_mod4==0)?0:1);
|
||||||
|
|
||||||
|
for (i=0; i<len2; i++) {
|
||||||
|
xmm1 = _mm_abs_epi16(rxF[i]);
|
||||||
|
xmm1 = _mm_subs_epi16(ch_mag[i],xmm1);
|
||||||
|
xmm2 = _mm_abs_epi16(xmm1);
|
||||||
|
xmm2 = _mm_subs_epi16(ch_magb[i],xmm2);
|
||||||
|
xmm3 = _mm_abs_epi16(xmm2);
|
||||||
|
xmm3 = _mm_subs_epi16(ch_magr[i], xmm3);
|
||||||
|
|
||||||
|
llr2[0] = ((short *)&rxF[i])[0];
|
||||||
|
llr2[1] = ((short *)&rxF[i])[1];
|
||||||
|
llr2[2] = _mm_extract_epi16(xmm1,0);
|
||||||
|
llr2[3] = _mm_extract_epi16(xmm1,1);//((short *)&xmm1)[j+1];
|
||||||
|
llr2[4] = _mm_extract_epi16(xmm2,0);//((short *)&xmm2)[j];
|
||||||
|
llr2[5] = _mm_extract_epi16(xmm2,1);//((short *)&xmm2)[j+1];
|
||||||
|
llr2[6] = _mm_extract_epi16(xmm3,0);
|
||||||
|
llr2[7] = _mm_extract_epi16(xmm3,1);
|
||||||
|
|
||||||
|
llr2+=8;
|
||||||
|
llr2[0] = ((short *)&rxF[i])[2];
|
||||||
|
llr2[1] = ((short *)&rxF[i])[3];
|
||||||
|
llr2[2] = _mm_extract_epi16(xmm1,2);
|
||||||
|
llr2[3] = _mm_extract_epi16(xmm1,3);//((short *)&xmm1)[j+1];
|
||||||
|
llr2[4] = _mm_extract_epi16(xmm2,2);//((short *)&xmm2)[j];
|
||||||
|
llr2[5] = _mm_extract_epi16(xmm2,3);//((short *)&xmm2)[j+1];
|
||||||
|
llr2[6] = _mm_extract_epi16(xmm3,2);
|
||||||
|
llr2[7] = _mm_extract_epi16(xmm3,3);
|
||||||
|
|
||||||
|
llr2+=8;
|
||||||
|
llr2[0] = ((short *)&rxF[i])[4];
|
||||||
|
llr2[1] = ((short *)&rxF[i])[5];
|
||||||
|
llr2[2] = _mm_extract_epi16(xmm1,4);
|
||||||
|
llr2[3] = _mm_extract_epi16(xmm1,5);//((short *)&xmm1)[j+1];
|
||||||
|
llr2[4] = _mm_extract_epi16(xmm2,4);//((short *)&xmm2)[j];
|
||||||
|
llr2[5] = _mm_extract_epi16(xmm2,5);//((short *)&xmm2)[j+1];
|
||||||
|
llr2[6] = _mm_extract_epi16(xmm3,4);
|
||||||
|
llr2[7] = _mm_extract_epi16(xmm3,5);
|
||||||
|
|
||||||
|
llr2+=8;
|
||||||
|
llr2[0] = ((short *)&rxF[i])[6];
|
||||||
|
llr2[1] = ((short *)&rxF[i])[7];
|
||||||
|
llr2[2] = _mm_extract_epi16(xmm1,6);
|
||||||
|
llr2[3] = _mm_extract_epi16(xmm1,7);//((short *)&xmm1)[j+1];
|
||||||
|
llr2[4] = _mm_extract_epi16(xmm2,6);//((short *)&xmm2)[j];
|
||||||
|
llr2[5] = _mm_extract_epi16(xmm2,7);//((short *)&xmm2)[j+1];
|
||||||
|
llr2[6] = _mm_extract_epi16(xmm3,6);
|
||||||
|
llr2[7] = _mm_extract_epi16(xmm3,7);
|
||||||
|
llr2+=8;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
_mm_empty();
|
||||||
|
_m_empty();
|
||||||
|
}
|
||||||
|
|
||||||
//==============================================================================================
|
//==============================================================================================
|
||||||
// DUAL-STREAM
|
// DUAL-STREAM
|
||||||
//==============================================================================================
|
//==============================================================================================
|
||||||
|
|||||||
@@ -304,8 +304,11 @@ int nr_initial_sync(UE_nr_rxtx_proc_t *proc, PHY_VARS_NR_UE *ue, runmode_t mode,
|
|||||||
if (ret == 0) {
|
if (ret == 0) {
|
||||||
// sync at symbol ue->symbol_offset
|
// sync at symbol ue->symbol_offset
|
||||||
// computing the offset wrt the beginning of the frame
|
// computing the offset wrt the beginning of the frame
|
||||||
sync_pos_frame = (fp->ofdm_symbol_size + fp->nb_prefix_samples0)+((ue->symbol_offset)-1)*(fp->ofdm_symbol_size + fp->nb_prefix_samples);
|
int mu = fp->numerology_index;
|
||||||
|
// number of symbols with different prefix length
|
||||||
|
// every 7*(1<<mu) symbols there is a different prefix length (38.211 5.3.1)
|
||||||
|
int n_symb_prefix0 = (ue->symbol_offset/(7*(1<<mu)))+1;
|
||||||
|
sync_pos_frame = n_symb_prefix0*(fp->ofdm_symbol_size + fp->nb_prefix_samples0)+(ue->symbol_offset-n_symb_prefix0)*(fp->ofdm_symbol_size + fp->nb_prefix_samples);
|
||||||
if (ue->ssb_offset < sync_pos_frame)
|
if (ue->ssb_offset < sync_pos_frame)
|
||||||
ue->rx_offset = fp->samples_per_frame - sync_pos_frame + ue->ssb_offset;
|
ue->rx_offset = fp->samples_per_frame - sync_pos_frame + ue->ssb_offset;
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -538,6 +538,7 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue,
|
|||||||
M = NR_POLAR_PBCH_E;
|
M = NR_POLAR_PBCH_E;
|
||||||
nushift = (Lmax==4)? i_ssb&3 : i_ssb&7;
|
nushift = (Lmax==4)? i_ssb&3 : i_ssb&7;
|
||||||
uint32_t unscrambling_mask = (Lmax==64)?0x100006D:0x1000041;
|
uint32_t unscrambling_mask = (Lmax==64)?0x100006D:0x1000041;
|
||||||
|
|
||||||
nr_pbch_unscrambling(nr_ue_pbch_vars,frame_parms->Nid_cell,nushift,M,NR_POLAR_PBCH_E,0,0);
|
nr_pbch_unscrambling(nr_ue_pbch_vars,frame_parms->Nid_cell,nushift,M,NR_POLAR_PBCH_E,0,0);
|
||||||
//polar decoding de-rate matching
|
//polar decoding de-rate matching
|
||||||
const t_nrPolar_params *currentPtr = nr_polar_params( NR_POLAR_PBCH_MESSAGE_TYPE, NR_POLAR_PBCH_PAYLOAD_BITS, NR_POLAR_PBCH_AGGREGATION_LEVEL,1,&ue->polarList);
|
const t_nrPolar_params *currentPtr = nr_polar_params( NR_POLAR_PBCH_MESSAGE_TYPE, NR_POLAR_PBCH_PAYLOAD_BITS, NR_POLAR_PBCH_AGGREGATION_LEVEL,1,&ue->polarList);
|
||||||
|
|||||||
@@ -564,6 +564,18 @@ void nr_dlsch_64qam_llr(NR_DL_FRAME_PARMS *frame_parms,
|
|||||||
uint32_t llr_offset,
|
uint32_t llr_offset,
|
||||||
uint8_t beamforming_mode);
|
uint8_t beamforming_mode);
|
||||||
|
|
||||||
|
void nr_dlsch_256qam_llr(NR_DL_FRAME_PARMS *frame_parms,
|
||||||
|
int32_t **rxdataF_comp,
|
||||||
|
int16_t *dlsch_llr,
|
||||||
|
int32_t **dl_ch_mag,
|
||||||
|
int32_t **dl_ch_magb,
|
||||||
|
int32_t **dl_ch_magr,
|
||||||
|
uint8_t symbol,
|
||||||
|
uint32_t len,
|
||||||
|
uint8_t first_symbol_flag,
|
||||||
|
uint16_t nb_rb,
|
||||||
|
uint32_t llr_offset,
|
||||||
|
uint8_t beamforming_mode);
|
||||||
|
|
||||||
/** \fn dlsch_siso(NR_DL_FRAME_PARMS *frame_parms,
|
/** \fn dlsch_siso(NR_DL_FRAME_PARMS *frame_parms,
|
||||||
int32_t **rxdataF_comp,
|
int32_t **rxdataF_comp,
|
||||||
@@ -798,6 +810,7 @@ void nr_dlsch_channel_compensation(int32_t **rxdataF_ext,
|
|||||||
int32_t **dl_ch_estimates_ext,
|
int32_t **dl_ch_estimates_ext,
|
||||||
int32_t **dl_ch_mag,
|
int32_t **dl_ch_mag,
|
||||||
int32_t **dl_ch_magb,
|
int32_t **dl_ch_magb,
|
||||||
|
int32_t **dl_ch_magr,
|
||||||
int32_t **rxdataF_comp,
|
int32_t **rxdataF_comp,
|
||||||
int32_t **rho,
|
int32_t **rho,
|
||||||
NR_DL_FRAME_PARMS *frame_parms,
|
NR_DL_FRAME_PARMS *frame_parms,
|
||||||
|
|||||||
@@ -389,6 +389,8 @@ typedef struct {
|
|||||||
short n0_subband_power_tot_dB[100];
|
short n0_subband_power_tot_dB[100];
|
||||||
//! estimated avg noise power per RB (dBm)
|
//! estimated avg noise power per RB (dBm)
|
||||||
short n0_subband_power_tot_dBm[100];
|
short n0_subband_power_tot_dBm[100];
|
||||||
|
//! etimated avg noise power over all RB (dB)
|
||||||
|
short n0_subband_power_avg_dB;
|
||||||
// eNB measurements (per user)
|
// eNB measurements (per user)
|
||||||
//! estimated received spatial signal power (linear)
|
//! estimated received spatial signal power (linear)
|
||||||
unsigned int rx_spatial_power[NUMBER_OF_UE_MAX][2][2];
|
unsigned int rx_spatial_power[NUMBER_OF_UE_MAX][2][2];
|
||||||
|
|||||||
+13
-12
@@ -626,32 +626,33 @@ typedef struct {
|
|||||||
short n0_subband_power_tot_dB[275];
|
short n0_subband_power_tot_dB[275];
|
||||||
//! estimated avg noise power per RB (dBm)
|
//! estimated avg noise power per RB (dBm)
|
||||||
short n0_subband_power_tot_dBm[275];
|
short n0_subband_power_tot_dBm[275];
|
||||||
|
|
||||||
// gNB measurements (per user)
|
// gNB measurements (per user)
|
||||||
//! estimated received spatial signal power (linear)
|
//! estimated received spatial signal power (linear)
|
||||||
unsigned int rx_spatial_power[NUMBER_OF_NR_DLSCH_MAX][2][2];
|
unsigned int rx_spatial_power[NUMBER_OF_NR_ULSCH_MAX][NB_ANTENNAS_TX][NB_ANTENNAS_RX];
|
||||||
//! estimated received spatial signal power (dB)
|
//! estimated received spatial signal power (dB)
|
||||||
unsigned short rx_spatial_power_dB[NUMBER_OF_NR_DLSCH_MAX][2][2];
|
unsigned short rx_spatial_power_dB[NUMBER_OF_NR_ULSCH_MAX][NB_ANTENNAS_TX][NB_ANTENNAS_RX];
|
||||||
//! estimated rssi (dBm)
|
//! estimated rssi (dBm)
|
||||||
short rx_rssi_dBm[NUMBER_OF_NR_DLSCH_MAX];
|
short rx_rssi_dBm[NUMBER_OF_NR_ULSCH_MAX];
|
||||||
//! estimated correlation (wideband linear) between spatial channels (computed in dlsch_demodulation)
|
//! estimated correlation (wideband linear) between spatial channels (computed in dlsch_demodulation)
|
||||||
int rx_correlation[NUMBER_OF_NR_DLSCH_MAX][2];
|
int rx_correlation[NUMBER_OF_NR_ULSCH_MAX][2];
|
||||||
//! estimated correlation (wideband dB) between spatial channels (computed in dlsch_demodulation)
|
//! estimated correlation (wideband dB) between spatial channels (computed in dlsch_demodulation)
|
||||||
int rx_correlation_dB[NUMBER_OF_NR_DLSCH_MAX][2];
|
int rx_correlation_dB[NUMBER_OF_NR_ULSCH_MAX][2];
|
||||||
|
|
||||||
/// Wideband CQI (= SINR)
|
/// Wideband CQI (= SINR)
|
||||||
int wideband_cqi[NUMBER_OF_NR_DLSCH_MAX][MAX_NUM_RU_PER_gNB];
|
int wideband_cqi[NUMBER_OF_NR_ULSCH_MAX][MAX_NUM_RU_PER_gNB];
|
||||||
/// Wideband CQI in dB (= SINR dB)
|
/// Wideband CQI in dB (= SINR dB)
|
||||||
int wideband_cqi_dB[NUMBER_OF_NR_DLSCH_MAX][MAX_NUM_RU_PER_gNB];
|
int wideband_cqi_dB[NUMBER_OF_NR_ULSCH_MAX][MAX_NUM_RU_PER_gNB];
|
||||||
/// Wideband CQI (sum of all RX antennas, in dB)
|
/// Wideband CQI (sum of all RX antennas, in dB)
|
||||||
char wideband_cqi_tot[NUMBER_OF_NR_DLSCH_MAX];
|
char wideband_cqi_tot[NUMBER_OF_NR_ULSCH_MAX];
|
||||||
/// Subband CQI per RX antenna and RB (= SINR)
|
/// Subband CQI per RX antenna and RB (= SINR)
|
||||||
int subband_cqi[NUMBER_OF_NR_DLSCH_MAX][MAX_NUM_RU_PER_gNB][275];
|
int subband_cqi[NUMBER_OF_NR_ULSCH_MAX][MAX_NUM_RU_PER_gNB][275];
|
||||||
/// Total Subband CQI and RB (= SINR)
|
/// Total Subband CQI and RB (= SINR)
|
||||||
int subband_cqi_tot[NUMBER_OF_NR_DLSCH_MAX][275];
|
int subband_cqi_tot[NUMBER_OF_NR_ULSCH_MAX][275];
|
||||||
/// Subband CQI in dB and RB (= SINR dB)
|
/// Subband CQI in dB and RB (= SINR dB)
|
||||||
int subband_cqi_dB[NUMBER_OF_NR_DLSCH_MAX][MAX_NUM_RU_PER_gNB][275];
|
int subband_cqi_dB[NUMBER_OF_NR_ULSCH_MAX][MAX_NUM_RU_PER_gNB][275];
|
||||||
/// Total Subband CQI and RB
|
/// Total Subband CQI and RB
|
||||||
int subband_cqi_tot_dB[NUMBER_OF_NR_DLSCH_MAX][275];
|
int subband_cqi_tot_dB[NUMBER_OF_NR_ULSCH_MAX][275];
|
||||||
/// PRACH background noise level
|
/// PRACH background noise level
|
||||||
int prach_I0;
|
int prach_I0;
|
||||||
} PHY_MEASUREMENTS_gNB;
|
} PHY_MEASUREMENTS_gNB;
|
||||||
|
|||||||
@@ -212,10 +212,8 @@ typedef struct {
|
|||||||
unsigned short rx_spatial_power_dB[NUMBER_OF_CONNECTED_eNB_MAX][2][2];
|
unsigned short rx_spatial_power_dB[NUMBER_OF_CONNECTED_eNB_MAX][2][2];
|
||||||
|
|
||||||
/// estimated received signal power (sum over all TX antennas)
|
/// estimated received signal power (sum over all TX antennas)
|
||||||
//int wideband_cqi[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX];
|
|
||||||
int rx_power[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX];
|
int rx_power[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX];
|
||||||
/// estimated received signal power (sum over all TX antennas)
|
/// estimated received signal power (sum over all TX antennas)
|
||||||
//int wideband_cqi_dB[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX];
|
|
||||||
unsigned short rx_power_dB[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX];
|
unsigned short rx_power_dB[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX];
|
||||||
|
|
||||||
/// estimated received signal power (sum over all TX/RX antennas)
|
/// estimated received signal power (sum over all TX/RX antennas)
|
||||||
@@ -379,6 +377,8 @@ typedef struct {
|
|||||||
/// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
|
/// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
|
||||||
/// - second index: ? [0..168*N_RB_DL[
|
/// - second index: ? [0..168*N_RB_DL[
|
||||||
int32_t **dl_ch_magb1[8][8];
|
int32_t **dl_ch_magb1[8][8];
|
||||||
|
/// \brief Magnitude of Downlink Channel, first layer (256QAM level).
|
||||||
|
int32_t **dl_ch_magr0;
|
||||||
/// \brief Cross-correlation of two eNB signals.
|
/// \brief Cross-correlation of two eNB signals.
|
||||||
/// - first index: rx antenna [0..nb_antennas_rx[
|
/// - first index: rx antenna [0..nb_antennas_rx[
|
||||||
/// - second index: symbol [0..]
|
/// - second index: symbol [0..]
|
||||||
|
|||||||
@@ -228,7 +228,7 @@ typedef struct {
|
|||||||
/// Pointer to Msg3 payload for UL-grant
|
/// Pointer to Msg3 payload for UL-grant
|
||||||
uint8_t *Msg3;
|
uint8_t *Msg3;
|
||||||
/// Frame of last completed synch
|
/// Frame of last completed synch
|
||||||
uint8_t sync_frame;
|
uint16_t sync_frame;
|
||||||
/// Flag to indicate that prach is ready to start: it is enabled with an initial delay after the sync
|
/// Flag to indicate that prach is ready to start: it is enabled with an initial delay after the sync
|
||||||
uint8_t init_msg1;
|
uint8_t init_msg1;
|
||||||
} NR_PRACH_RESOURCES_t;
|
} NR_PRACH_RESOURCES_t;
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user