Implement retransmission checker, include unit test
This commit is contained in:
@@ -267,8 +267,6 @@ class Containerize():
|
|||||||
self.dockerfileprefix = ''
|
self.dockerfileprefix = ''
|
||||||
self.host = ''
|
self.host = ''
|
||||||
|
|
||||||
#checkers from xml
|
|
||||||
self.ran_checkers={}
|
|
||||||
self.num_attempts = 1
|
self.num_attempts = 1
|
||||||
|
|
||||||
self.flexricTag = ''
|
self.flexricTag = ''
|
||||||
|
|||||||
@@ -38,3 +38,97 @@ class ContainsString:
|
|||||||
if re.search(needle, line):
|
if re.search(needle, line):
|
||||||
return True, ""
|
return True, ""
|
||||||
return False, f"could not find '{needle}' in logs"
|
return False, f"could not find '{needle}' in logs"
|
||||||
|
|
||||||
|
class RetxCheck():
|
||||||
|
def _parseList(s):
|
||||||
|
if not s:
|
||||||
|
return []
|
||||||
|
return [int(n) for n in s.split(",")]
|
||||||
|
|
||||||
|
def _get_ul_dl(s):
|
||||||
|
dl, ul = (None, None)
|
||||||
|
for o in s.split(";", 1):
|
||||||
|
if o.startswith("dl="):
|
||||||
|
dl = o[3:]
|
||||||
|
elif o.startswith("ul="):
|
||||||
|
ul = o[3:]
|
||||||
|
else:
|
||||||
|
raise ValueError(f"unrecognized option {s}: needs format '[ul=,dl=]X,Y,...[;ul=Z,V,...]'")
|
||||||
|
return dl, ul
|
||||||
|
|
||||||
|
def _parseRetxCheckers(options):
|
||||||
|
if not "=" in options:
|
||||||
|
dlul = RetxCheck._parseList(options)
|
||||||
|
return dlul, dlul
|
||||||
|
dl, ul = RetxCheck._get_ul_dl(options)
|
||||||
|
return RetxCheck._parseList(dl), RetxCheck._parseList(ul)
|
||||||
|
|
||||||
|
def _analyzeUeRetx(rounds, checkers, regex):
|
||||||
|
perc = list(0 for i in checkers) # results in %
|
||||||
|
stats = list(False for i in checkers) # status if succeeded
|
||||||
|
tmp = re.match(regex, rounds)
|
||||||
|
if tmp is None:
|
||||||
|
logging.error('_analyzeUeRetx: did not match regex for DL retx analysis')
|
||||||
|
return stats
|
||||||
|
retx_data = [float(x) for x in tmp.groups()]
|
||||||
|
for i in range(0, len(perc)):
|
||||||
|
#case where numerator > denumerator with denum ==0 is disregarded, cannot hapen in principle, will lead to 0%
|
||||||
|
perc[i] = 0 if (retx_data[i] == 0) else 100 * retx_data[i + 1] / retx_data[i]
|
||||||
|
#treating % > 100 , % > requirement
|
||||||
|
stats[i] = perc[i] <= 100 and perc[i] <= checkers[i]
|
||||||
|
return stats
|
||||||
|
|
||||||
|
def _filter_retx_rounds(l):
|
||||||
|
# map to round number if False, else None
|
||||||
|
l = [i+1 if x is False else None for i, x in enumerate(l)]
|
||||||
|
# filter out None
|
||||||
|
return [x for x in l if x is not None]
|
||||||
|
|
||||||
|
def run(file, options):
|
||||||
|
# aggregate statistics per UE
|
||||||
|
dlsch_ulsch_stats = {}
|
||||||
|
status = True
|
||||||
|
with open(file, "r") as f:
|
||||||
|
for line in f.readlines():
|
||||||
|
keys = {'dlsch_rounds','ulsch_rounds'}
|
||||||
|
for k in keys:
|
||||||
|
result = re.search(k, line)
|
||||||
|
if result is None:
|
||||||
|
continue
|
||||||
|
result = re.search('UE (?:RNTI )?([0-9a-f]{4})', line)
|
||||||
|
if result is None:
|
||||||
|
logging.error(f'did not find RNTI while matching key {k}')
|
||||||
|
status = False
|
||||||
|
continue
|
||||||
|
rnti = result.group(1)
|
||||||
|
if not rnti in dlsch_ulsch_stats:
|
||||||
|
dlsch_ulsch_stats[rnti] = {}
|
||||||
|
dlsch_ulsch_stats[rnti][k]=re.sub(r'^.*\]\s+', r'' , line.rstrip())
|
||||||
|
|
||||||
|
dl, ul = RetxCheck._parseRetxCheckers(options)
|
||||||
|
msgs = []
|
||||||
|
for ue in dlsch_ulsch_stats:
|
||||||
|
dlulstat = dlsch_ulsch_stats[ue]
|
||||||
|
|
||||||
|
for key in dlulstat:
|
||||||
|
msgs.append(dlulstat[key])
|
||||||
|
|
||||||
|
retx_dl = RetxCheck._analyzeUeRetx(dlulstat['dlsch_rounds'], dl, r'^.*dlsch_rounds\s+(\d+)\/(\d+)\/(\d+)\/(\d+),\s+dlsch_errors\s+(\d+)')
|
||||||
|
retx_ul = RetxCheck._analyzeUeRetx(dlulstat['ulsch_rounds'], ul, r'^.*ulsch_rounds\s+(\d+)\/(\d+)\/(\d+)\/(\d+),\s+ulsch_errors\s+(\d+)')
|
||||||
|
|
||||||
|
if False in retx_dl or False in retx_ul:
|
||||||
|
dlstr = RetxCheck._filter_retx_rounds(retx_dl)
|
||||||
|
ulstr = RetxCheck._filter_retx_rounds(retx_ul)
|
||||||
|
msg = f"UE {ue}: retx rounds"
|
||||||
|
if dlstr:
|
||||||
|
msg = f"{msg} DL {dlstr}"
|
||||||
|
if ulstr:
|
||||||
|
msg = f"{msg} UL {ulstr}"
|
||||||
|
msg = f"{msg} exceeded threshold"
|
||||||
|
msgs.append('!!! Failure: ' + msg)
|
||||||
|
logging.error(f'\u001B[1;37;41m {msg}\u001B[0m')
|
||||||
|
status = False
|
||||||
|
else:
|
||||||
|
msg = f"UE {ue} retransmissions within bounds"
|
||||||
|
logging.debug(msg)
|
||||||
|
return status, "\n".join(msgs)
|
||||||
|
|||||||
@@ -108,13 +108,6 @@ def ExecuteActionWithParam(action, ctx, node):
|
|||||||
success = RAN.InitializeeNB(ctx, node, HTML)
|
success = RAN.InitializeeNB(ctx, node, HTML)
|
||||||
|
|
||||||
elif action == 'Terminate_eNB':
|
elif action == 'Terminate_eNB':
|
||||||
#retx checkers
|
|
||||||
string_field = test.findtext('d_retx_th')
|
|
||||||
if (string_field is not None):
|
|
||||||
RAN.ran_checkers['d_retx_th'] = [float(x) for x in string_field.split(',')]
|
|
||||||
string_field=test.findtext('u_retx_th')
|
|
||||||
if (string_field is not None):
|
|
||||||
RAN.ran_checkers['u_retx_th'] = [float(x) for x in string_field.split(',')]
|
|
||||||
services = []
|
services = []
|
||||||
analysis = test.find("analysis")
|
analysis = test.find("analysis")
|
||||||
if analysis is not None:
|
if analysis is not None:
|
||||||
|
|||||||
@@ -67,8 +67,6 @@ class RANManagement():
|
|||||||
self.eNBOptions = ['', '', '']
|
self.eNBOptions = ['', '', '']
|
||||||
self.eNBstatuses = [-1, -1, -1]
|
self.eNBstatuses = [-1, -1, -1]
|
||||||
self.runtime_stats= ''
|
self.runtime_stats= ''
|
||||||
#checkers from xml
|
|
||||||
self.ran_checkers={}
|
|
||||||
self.cmd_prefix = '' # prefix before {lte,nr}-softmodem
|
self.cmd_prefix = '' # prefix before {lte,nr}-softmodem
|
||||||
self.node = ''
|
self.node = ''
|
||||||
self.command = ''
|
self.command = ''
|
||||||
@@ -176,25 +174,6 @@ class RANManagement():
|
|||||||
HTML.CreateHtmlDataLogTable(datalog_rt_stats)
|
HTML.CreateHtmlDataLogTable(datalog_rt_stats)
|
||||||
return success
|
return success
|
||||||
|
|
||||||
def _analyzeUeRetx(self, rounds, checkers, regex):
|
|
||||||
if len(rounds) == 0 or len(checkers) == 0:
|
|
||||||
logging.warning(f'warning: rounds={rounds} checkers={checkers}')
|
|
||||||
return []
|
|
||||||
|
|
||||||
perc = list(0 for i in checkers) # results in %
|
|
||||||
stats = list(False for i in checkers) # status if succeeded
|
|
||||||
tmp = re.match(regex, rounds)
|
|
||||||
if tmp is None:
|
|
||||||
logging.error('_analyzeUeRetx: did not match regex for DL retx analysis')
|
|
||||||
return stats
|
|
||||||
retx_data = [float(x) for x in tmp.groups()]
|
|
||||||
for i in range(0, len(perc)):
|
|
||||||
#case where numerator > denumerator with denum ==0 is disregarded, cannot hapen in principle, will lead to 0%
|
|
||||||
perc[i] = 0 if (retx_data[i] == 0) else 100 * retx_data[i + 1] / retx_data[i]
|
|
||||||
#treating % > 100 , % > requirement
|
|
||||||
stats[i] = perc[i] <= 100 and perc[i] <= checkers[i]
|
|
||||||
return stats
|
|
||||||
|
|
||||||
def AnalyzeLogFile_eNB(self, eNBlogFile, HTML, checkers={}):
|
def AnalyzeLogFile_eNB(self, eNBlogFile, HTML, checkers={}):
|
||||||
if (not os.path.isfile(eNBlogFile)):
|
if (not os.path.isfile(eNBlogFile)):
|
||||||
return -1
|
return -1
|
||||||
@@ -239,8 +218,6 @@ class RANManagement():
|
|||||||
nbContextSwitches = ''
|
nbContextSwitches = ''
|
||||||
#NSA FR1 check
|
#NSA FR1 check
|
||||||
NSA_RAPROC_PUSCH_check = 0
|
NSA_RAPROC_PUSCH_check = 0
|
||||||
#dlsch and ulsch statistics (dictionary)
|
|
||||||
dlsch_ulsch_stats = {}
|
|
||||||
#count "problem receiving samples" msg
|
#count "problem receiving samples" msg
|
||||||
pb_receiving_samples_cnt = 0
|
pb_receiving_samples_cnt = 0
|
||||||
#count "removing UE" msg
|
#count "removing UE" msg
|
||||||
@@ -392,22 +369,6 @@ class RANManagement():
|
|||||||
if result is not None:
|
if result is not None:
|
||||||
NSA_RAPROC_PUSCH_check = 1
|
NSA_RAPROC_PUSCH_check = 1
|
||||||
|
|
||||||
# Collect information on UE DLSCH and ULSCH statistics
|
|
||||||
keys = {'dlsch_rounds','ulsch_rounds'}
|
|
||||||
for k in keys:
|
|
||||||
result = re.search(k, line)
|
|
||||||
if result is None:
|
|
||||||
continue
|
|
||||||
result = re.search('UE (?:RNTI )?([0-9a-f]{4})', line)
|
|
||||||
if result is None:
|
|
||||||
logging.error(f'did not find RNTI while matching key {k}')
|
|
||||||
continue
|
|
||||||
rnti = result.group(1)
|
|
||||||
|
|
||||||
#remove 1- all useless char before relevant info (ulsch or dlsch) 2- trailing char
|
|
||||||
if not rnti in dlsch_ulsch_stats: dlsch_ulsch_stats[rnti] = {}
|
|
||||||
dlsch_ulsch_stats[rnti][k]=re.sub(r'^.*\]\s+', r'' , line.rstrip())
|
|
||||||
|
|
||||||
result = re.search('Received NR_RRCReconfigurationComplete from UE', str(line))
|
result = re.search('Received NR_RRCReconfigurationComplete from UE', str(line))
|
||||||
if result is not None:
|
if result is not None:
|
||||||
nrRrcRcfgComplete += 1
|
nrRrcRcfgComplete += 1
|
||||||
@@ -505,23 +466,6 @@ class RANManagement():
|
|||||||
logging.debug(statMsg)
|
logging.debug(statMsg)
|
||||||
htmleNBFailureMsg += htmlMsg
|
htmleNBFailureMsg += htmlMsg
|
||||||
|
|
||||||
#ulsch and dlsch statistics and checkers
|
|
||||||
for ue in dlsch_ulsch_stats:
|
|
||||||
dlulstat = dlsch_ulsch_stats[ue]
|
|
||||||
#print statistics into html
|
|
||||||
statMsg=''
|
|
||||||
for key in dlulstat:
|
|
||||||
statMsg += dlulstat[key] + '\n'
|
|
||||||
logging.debug(dlulstat[key])
|
|
||||||
htmleNBFailureMsg += statMsg
|
|
||||||
|
|
||||||
retx_status[ue] = {}
|
|
||||||
dlcheckers = [] if 'd_retx_th' not in checkers else checkers['d_retx_th']
|
|
||||||
retx_status[ue]['dl'] = self._analyzeUeRetx(dlulstat['dlsch_rounds'], dlcheckers, r'^.*dlsch_rounds\s+(\d+)\/(\d+)\/(\d+)\/(\d+),\s+dlsch_errors\s+(\d+)')
|
|
||||||
ulcheckers = [] if 'u_retx_th' not in checkers else checkers['u_retx_th']
|
|
||||||
retx_status[ue]['ul'] = self._analyzeUeRetx(dlulstat['ulsch_rounds'], ulcheckers, r'^.*ulsch_rounds\s+(\d+)\/(\d+)\/(\d+)\/(\d+),\s+ulsch_errors\s+(\d+)')
|
|
||||||
|
|
||||||
|
|
||||||
if not showedByeMsg:
|
if not showedByeMsg:
|
||||||
logging.debug('\u001B[1;37;41m ' + nodeB_prefix + 'NB did not show "Bye." message at end, it likely did not stop properly! \u001B[0m')
|
logging.debug('\u001B[1;37;41m ' + nodeB_prefix + 'NB did not show "Bye." message at end, it likely did not stop properly! \u001B[0m')
|
||||||
htmleNBFailureMsg += 'No Bye. message found, did not stop properly\n'
|
htmleNBFailureMsg += 'No Bye. message found, did not stop properly\n'
|
||||||
@@ -557,16 +501,6 @@ class RANManagement():
|
|||||||
logging.debug(statMsg)
|
logging.debug(statMsg)
|
||||||
htmleNBFailureMsg += htmlMsg
|
htmleNBFailureMsg += htmlMsg
|
||||||
|
|
||||||
for ue in retx_status:
|
|
||||||
msg = f"retransmissions for UE {ue}: DL {retx_status[ue]['dl']} UL {retx_status[ue]['ul']}"
|
|
||||||
if False in retx_status[ue]['dl'] or False in retx_status[ue]['ul']:
|
|
||||||
msg = 'Failure: ' + msg
|
|
||||||
logging.error(f'\u001B[1;37;41m {msg}\u001B[0m')
|
|
||||||
htmleNBFailureMsg += f'{msg}\n'
|
|
||||||
global_status = CONST.ENB_RETX_ISSUE
|
|
||||||
else:
|
|
||||||
logging.debug(msg)
|
|
||||||
|
|
||||||
if RealTimeProcessingIssue:
|
if RealTimeProcessingIssue:
|
||||||
logging.debug('\u001B[1;37;41m ' + nodeB_prefix + 'NB ended with real time processing issue! \u001B[0m')
|
logging.debug('\u001B[1;37;41m ' + nodeB_prefix + 'NB ended with real time processing issue! \u001B[0m')
|
||||||
htmleNBFailureMsg += 'Fail due to real time processing issue\n'
|
htmleNBFailureMsg += 'Fail due to real time processing issue\n'
|
||||||
|
|||||||
@@ -12,6 +12,9 @@ sys.path.append('./') # to find OAI imports below
|
|||||||
import cls_loganalysis
|
import cls_loganalysis
|
||||||
|
|
||||||
class TestLogAnalysis(unittest.TestCase):
|
class TestLogAnalysis(unittest.TestCase):
|
||||||
|
def setUp(self):
|
||||||
|
self.maxDiff = None
|
||||||
|
|
||||||
def test_no_file(self):
|
def test_no_file(self):
|
||||||
f = "/total/fantasy/path/file.log"
|
f = "/total/fantasy/path/file.log"
|
||||||
result, _ = cls_loganalysis.Default.run(f, None)
|
result, _ = cls_loganalysis.Default.run(f, None)
|
||||||
@@ -22,5 +25,74 @@ class TestLogAnalysis(unittest.TestCase):
|
|||||||
result, _ = cls_loganalysis.Default.run(f, None)
|
result, _ = cls_loganalysis.Default.run(f, None)
|
||||||
self.assertTrue(result)
|
self.assertTrue(result)
|
||||||
|
|
||||||
|
def test_retx_check_good(self):
|
||||||
|
f = "tests/log-analysis/retx-check-good.log"
|
||||||
|
opt = "dl=1,0,0,0;ul=1,0,0,0"
|
||||||
|
result, log = cls_loganalysis.RetxCheck.run(f, opt)
|
||||||
|
expected = """UE f40a: dlsch_rounds 86/0/0/0, dlsch_errors 0, pucch0_DTX 0, BLER 0.00052 MCS (0) 0 CCE fail 3
|
||||||
|
UE f40a: ulsch_rounds 518/0/0/0, ulsch_errors 0, ulsch_DTX 0, BLER 0.00000 MCS (0) 0 (Qm 2 deltaMCS 0 dB) NPRB 5 SNR 51.0 dB CCE fail 0"""
|
||||||
|
self.assertTrue(result)
|
||||||
|
self.assertEqual(log, expected)
|
||||||
|
|
||||||
|
def test_retx_check_good_single_val(self):
|
||||||
|
f = "tests/log-analysis/retx-check-good.log"
|
||||||
|
opt = "1,0,0,0"
|
||||||
|
result, log = cls_loganalysis.RetxCheck.run(f, opt)
|
||||||
|
expected = """UE f40a: dlsch_rounds 86/0/0/0, dlsch_errors 0, pucch0_DTX 0, BLER 0.00052 MCS (0) 0 CCE fail 3
|
||||||
|
UE f40a: ulsch_rounds 518/0/0/0, ulsch_errors 0, ulsch_DTX 0, BLER 0.00000 MCS (0) 0 (Qm 2 deltaMCS 0 dB) NPRB 5 SNR 51.0 dB CCE fail 0"""
|
||||||
|
self.assertTrue(result)
|
||||||
|
self.assertEqual(log, expected)
|
||||||
|
|
||||||
|
def test_retx_check_good_ul_only(self):
|
||||||
|
f = "tests/log-analysis/retx-check-good.log"
|
||||||
|
opt = "ul=1,0,0,0"
|
||||||
|
result, log = cls_loganalysis.RetxCheck.run(f, opt)
|
||||||
|
expected = """UE f40a: dlsch_rounds 86/0/0/0, dlsch_errors 0, pucch0_DTX 0, BLER 0.00052 MCS (0) 0 CCE fail 3
|
||||||
|
UE f40a: ulsch_rounds 518/0/0/0, ulsch_errors 0, ulsch_DTX 0, BLER 0.00000 MCS (0) 0 (Qm 2 deltaMCS 0 dB) NPRB 5 SNR 51.0 dB CCE fail 0"""
|
||||||
|
self.assertTrue(result)
|
||||||
|
self.assertEqual(log, expected)
|
||||||
|
|
||||||
|
def test_retx_check_bad(self):
|
||||||
|
f = "tests/log-analysis/retx-check-bad.log"
|
||||||
|
opt = "dl=10,100,100,100;ul=10,100,100,100"
|
||||||
|
result, log = cls_loganalysis.RetxCheck.run(f, opt)
|
||||||
|
expected = """UE a491: dlsch_rounds 13/1/0/0, dlsch_errors 0, pucch0_DTX 0, BLER 0.11000 MCS (0) 0 CCE fail 0
|
||||||
|
UE a491: ulsch_rounds 23/1/0/0, ulsch_errors 0, ulsch_DTX 1, BLER 0.08447 MCS (0) 0 (Qm 2 deltaMCS 0 dB) NPRB 5 SNR 34.0 dB CCE fail 0
|
||||||
|
UE bf9b: dlsch_rounds 370/368/368/368, dlsch_errors 368, pucch0_DTX 1377, BLER 1.00000 MCS (0) 0 CCE fail 64
|
||||||
|
UE bf9b: ulsch_rounds 150/148/147/147, ulsch_errors 147, ulsch_DTX 589, BLER 1.00000 MCS (0) 0 (Qm 2 deltaMCS 0 dB) NPRB 104 SNR 38.0 dB CCE fail 0
|
||||||
|
!!! Failure: UE bf9b: retx rounds DL [1] UL [1] exceeded threshold
|
||||||
|
UE 257a: dlsch_rounds 68071/142/14/0, dlsch_errors 0, pucch0_DTX 10, BLER 0.00427 MCS (1) 25 CCE fail 0
|
||||||
|
UE 257a: ulsch_rounds 41777/2863/10/0, ulsch_errors 0, ulsch_DTX 17, BLER 0.11456 MCS (1) 10 (Qm 4 deltaMCS 0 dB) NPRB 5 SNR 29.0 dB CCE fail 0"""
|
||||||
|
self.assertFalse(result)
|
||||||
|
self.assertEqual(log, expected)
|
||||||
|
|
||||||
|
def test_retx_check_dl_only_bad(self):
|
||||||
|
f = "tests/log-analysis/retx-check-bad.log"
|
||||||
|
opt = "dl=10,80,100,100"
|
||||||
|
result, log = cls_loganalysis.RetxCheck.run(f, opt)
|
||||||
|
expected = """UE a491: dlsch_rounds 13/1/0/0, dlsch_errors 0, pucch0_DTX 0, BLER 0.11000 MCS (0) 0 CCE fail 0
|
||||||
|
UE a491: ulsch_rounds 23/1/0/0, ulsch_errors 0, ulsch_DTX 1, BLER 0.08447 MCS (0) 0 (Qm 2 deltaMCS 0 dB) NPRB 5 SNR 34.0 dB CCE fail 0
|
||||||
|
UE bf9b: dlsch_rounds 370/368/368/368, dlsch_errors 368, pucch0_DTX 1377, BLER 1.00000 MCS (0) 0 CCE fail 64
|
||||||
|
UE bf9b: ulsch_rounds 150/148/147/147, ulsch_errors 147, ulsch_DTX 589, BLER 1.00000 MCS (0) 0 (Qm 2 deltaMCS 0 dB) NPRB 104 SNR 38.0 dB CCE fail 0
|
||||||
|
!!! Failure: UE bf9b: retx rounds DL [1, 2] exceeded threshold
|
||||||
|
UE 257a: dlsch_rounds 68071/142/14/0, dlsch_errors 0, pucch0_DTX 10, BLER 0.00427 MCS (1) 25 CCE fail 0
|
||||||
|
UE 257a: ulsch_rounds 41777/2863/10/0, ulsch_errors 0, ulsch_DTX 17, BLER 0.11456 MCS (1) 10 (Qm 4 deltaMCS 0 dB) NPRB 5 SNR 29.0 dB CCE fail 0"""
|
||||||
|
self.assertFalse(result)
|
||||||
|
self.assertEqual(log, expected)
|
||||||
|
|
||||||
|
def test_retx_check_ul_bad(self):
|
||||||
|
f = "tests/log-analysis/retx-check-bad.log"
|
||||||
|
opt = "dl=100,100,100,100;ul=10,100,100,100"
|
||||||
|
result, log = cls_loganalysis.RetxCheck.run(f, opt)
|
||||||
|
expected = """UE a491: dlsch_rounds 13/1/0/0, dlsch_errors 0, pucch0_DTX 0, BLER 0.11000 MCS (0) 0 CCE fail 0
|
||||||
|
UE a491: ulsch_rounds 23/1/0/0, ulsch_errors 0, ulsch_DTX 1, BLER 0.08447 MCS (0) 0 (Qm 2 deltaMCS 0 dB) NPRB 5 SNR 34.0 dB CCE fail 0
|
||||||
|
UE bf9b: dlsch_rounds 370/368/368/368, dlsch_errors 368, pucch0_DTX 1377, BLER 1.00000 MCS (0) 0 CCE fail 64
|
||||||
|
UE bf9b: ulsch_rounds 150/148/147/147, ulsch_errors 147, ulsch_DTX 589, BLER 1.00000 MCS (0) 0 (Qm 2 deltaMCS 0 dB) NPRB 104 SNR 38.0 dB CCE fail 0
|
||||||
|
!!! Failure: UE bf9b: retx rounds UL [1] exceeded threshold
|
||||||
|
UE 257a: dlsch_rounds 68071/142/14/0, dlsch_errors 0, pucch0_DTX 10, BLER 0.00427 MCS (1) 25 CCE fail 0
|
||||||
|
UE 257a: ulsch_rounds 41777/2863/10/0, ulsch_errors 0, ulsch_DTX 17, BLER 0.11456 MCS (1) 10 (Qm 4 deltaMCS 0 dB) NPRB 5 SNR 29.0 dB CCE fail 0"""
|
||||||
|
self.assertFalse(result)
|
||||||
|
self.assertEqual(log, expected)
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
|||||||
@@ -0,0 +1,54 @@
|
|||||||
|
9185541.336575 [NR_RRC] I UE 1 Logical Channel DL-DCCH, Generate SecurityModeCommand (bytes 3)
|
||||||
|
9185541.356794 [NR_RRC] A [UL] (cellID bc614e, UE ID 1 RNTI a491) Received Security Mode Complete
|
||||||
|
9185541.357264 [NR_RRC] I UE 1: Logical Channel DL-DCCH, Generate NR UECapabilityEnquiry (bytes 8, xid 2)
|
||||||
|
9185541.373199 [NR_RRC] A [UL] (cellID bc614e, UE ID 1 RNTI a491) Received UE capabilities
|
||||||
|
9185541.373330 [NR_RRC] I Send message to ngap: NGAP_UE_CAPABILITIES_IND
|
||||||
|
9185541.373356 [NR_RRC] A [DL] (cellID bc614e, UE ID 1 RNTI a491) Send DL Information Transfer [53 bytes]
|
||||||
|
9185541.373368 [NR_RRC] I Send message to sctp: NGAP_InitialContextSetupResponse
|
||||||
|
9185541.390034 [NR_MAC] I Frame.Slot 384.0
|
||||||
|
UE RNTI a491 CU-UE-ID 1 in-sync PH 59 dB PCMAX 21 dBm, average RSRP -101 (4 meas)
|
||||||
|
UE a491: CQI 2, RI 2, PMI (0,0)
|
||||||
|
UE a491: dlsch_rounds 13/1/0/0, dlsch_errors 0, pucch0_DTX 0, BLER 0.11000 MCS (0) 0 CCE fail 0
|
||||||
|
UE a491: ulsch_rounds 23/1/0/0, ulsch_errors 0, ulsch_DTX 1, BLER 0.08447 MCS (0) 0 (Qm 2 deltaMCS 0 dB) NPRB 5 SNR 34.0 dB CCE fail 0
|
||||||
|
UE a491: MAC: TX 367 RX 3664 bytes
|
||||||
|
UE a491: LCID 1: TX 213 RX 1649 bytes
|
||||||
|
|
||||||
|
9185559.310044 [NR_MAC] I Frame.Slot 128.0
|
||||||
|
UE RNTI bf9b CU-UE-ID 1 in-sync PH 48 dB PCMAX 21 dBm
|
||||||
|
UE bf9b: dlsch_rounds 370/368/368/368, dlsch_errors 368, pucch0_DTX 1377, BLER 1.00000 MCS (0) 0 CCE fail 64
|
||||||
|
UE bf9b: ulsch_rounds 150/148/147/147, ulsch_errors 147, ulsch_DTX 589, BLER 1.00000 MCS (0) 0 (Qm 2 deltaMCS 0 dB) NPRB 104 SNR 38.0 dB CCE fail 0
|
||||||
|
UE bf9b: MAC: TX 10145 RX 82 bytes
|
||||||
|
UE bf9b: LCID 1: TX 5283 RX 53 bytes
|
||||||
|
|
||||||
|
9185582.350069 [NR_MAC] I Frame.Slot 384.0
|
||||||
|
UE RNTI 257a CU-UE-ID 2 in-sync PH 48 dB PCMAX 21 dBm, average RSRP -83 (16 meas)
|
||||||
|
UE 257a: CQI 15, RI 2, PMI (0,1)
|
||||||
|
UE 257a: UL-RI 2, TPMI 0
|
||||||
|
UE 257a: dlsch_rounds 153/1/0/0, dlsch_errors 0, pucch0_DTX 0, BLER 0.00000 MCS (1) 0 CCE fail 0
|
||||||
|
UE 257a: ulsch_rounds 562/2/1/0, ulsch_errors 0, ulsch_DTX 3, BLER 0.00000 MCS (1) 0 (Qm 2 deltaMCS 0 dB) NPRB 5 SNR 29.5 dB CCE fail 0
|
||||||
|
UE 257a: MAC: TX 13416 RX 26519 bytes
|
||||||
|
UE 257a: LCID 1: TX 523 RX 2046 bytes
|
||||||
|
UE 257a: LCID 2: TX 0 RX 0 bytes
|
||||||
|
UE 257a: LCID 4: TX 9800 RX 9945 bytes
|
||||||
|
|
||||||
|
9185687.310202 [NR_MAC] I Frame.Slot 640.0
|
||||||
|
UE RNTI 257a CU-UE-ID 2 in-sync PH 61 dB PCMAX 21 dBm, average RSRP -83 (16 meas)
|
||||||
|
UE 257a: CQI 15, RI 2, PMI (0,1)
|
||||||
|
UE 257a: UL-RI 2, TPMI 0
|
||||||
|
UE 257a: dlsch_rounds 64992/129/13/0, dlsch_errors 0, pucch0_DTX 10, BLER 0.00242 MCS (1) 27 CCE fail 0
|
||||||
|
UE 257a: ulsch_rounds 39328/2610/8/0, ulsch_errors 0, ulsch_DTX 14, BLER 0.11139 MCS (1) 9 (Qm 4 deltaMCS 0 dB) NPRB 273 SNR 25.5 dB CCE fail 0
|
||||||
|
UE 257a: MAC: TX 3344707955 RX 818603547 bytes
|
||||||
|
UE 257a: LCID 1: TX 832 RX 4312 bytes
|
||||||
|
UE 257a: LCID 2: TX 0 RX 0 bytes
|
||||||
|
UE 257a: LCID 4: TX 3322610250 RX 815642955 bytes
|
||||||
|
|
||||||
|
9185692.430254 [NR_MAC] I Frame.Slot 128.0
|
||||||
|
UE RNTI 257a CU-UE-ID 2 in-sync PH 48 dB PCMAX 21 dBm, average RSRP -84 (16 meas)
|
||||||
|
UE 257a: CQI 15, RI 2, PMI (0,1)
|
||||||
|
UE 257a: UL-RI 2, TPMI 0
|
||||||
|
UE 257a: dlsch_rounds 68071/142/14/0, dlsch_errors 0, pucch0_DTX 10, BLER 0.00427 MCS (1) 25 CCE fail 0
|
||||||
|
UE 257a: ulsch_rounds 41777/2863/10/0, ulsch_errors 0, ulsch_DTX 17, BLER 0.11456 MCS (1) 10 (Qm 4 deltaMCS 0 dB) NPRB 5 SNR 29.0 dB CCE fail 0
|
||||||
|
UE 257a: MAC: TX 3424886787 RX 879242724 bytes
|
||||||
|
UE 257a: LCID 1: TX 847 RX 4422 bytes
|
||||||
|
UE 257a: LCID 2: TX 0 RX 0 bytes
|
||||||
|
UE 257a: LCID 4: TX 3401067134 RX 875911216 bytes
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
7799905.793901 [NR_MAC] I Frame.Slot 256.0
|
||||||
|
UE RNTI f40a CU-UE-ID 2 in-sync PH 48 dB PCMAX 20 dBm, average RSRP -44 (16 meas)
|
||||||
|
UE f40a: dlsch_rounds 86/0/0/0, dlsch_errors 0, pucch0_DTX 0, BLER 0.00052 MCS (0) 0 CCE fail 3
|
||||||
|
UE f40a: ulsch_rounds 518/0/0/0, ulsch_errors 0, ulsch_DTX 0, BLER 0.00000 MCS (0) 0 (Qm 2 deltaMCS 0 dB) NPRB 5 SNR 51.0 dB CCE fail 0
|
||||||
|
UE f40a: MAC: TX 3836 RX 13684 bytes
|
||||||
|
UE f40a: LCID 1: TX 530 RX 281 bytes
|
||||||
|
UE f40a: LCID 2: TX 3 RX 35 bytes
|
||||||
|
UE f40a: LCID 4: TX 1886 RX 2100 bytes
|
||||||
@@ -113,8 +113,6 @@
|
|||||||
<desc>Undeploy all OAI 5G stack</desc>
|
<desc>Undeploy all OAI 5G stack</desc>
|
||||||
<node>localhost</node>
|
<node>localhost</node>
|
||||||
<yaml_path>ci-scripts/yaml_files/5g_fdd_rfsimulator</yaml_path>
|
<yaml_path>ci-scripts/yaml_files/5g_fdd_rfsimulator</yaml_path>
|
||||||
<d_retx_th>1,0,0,0</d_retx_th>
|
|
||||||
<u_retx_th>1,0,0,0</u_retx_th>
|
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
<testCase>
|
<testCase>
|
||||||
|
|||||||
Reference in New Issue
Block a user