diff --git a/ci-scripts/Jenkinsfile-gitlab b/ci-scripts/Jenkinsfile-gitlab index f83ee6faf0a1c5de4e0e0efe09cf8fe2bf36d574..d4fe0d85552532732eaf167c290c9599a29eb0f6 100644 --- a/ci-scripts/Jenkinsfile-gitlab +++ b/ci-scripts/Jenkinsfile-gitlab @@ -286,7 +286,8 @@ pipeline { } } post { - always { + // In case of success we really pick the report from the exact slave build number + success { script { copyArtifacts(projectName: 'eNB-CI-FDD-Band7-B210', filter: 'test_results*.html', @@ -296,6 +297,21 @@ pipeline { } } } + // In case of any non-success, we are retrieving the HTML report of the last completed + // slave job. Note that we could use that syntax also in case of success. + // The only drop-back is that we may retrieve the HTML report of a previous build + cleanup { + script { + if (!fileExists('test_results-eNB-CI-FDD-Band7-B210.html')) { + copyArtifacts(projectName: 'eNB-CI-FDD-Band7-B210', + filter: 'test_results*.html', + selector: lastCompleted()) + if (fileExists('test_results-eNB-CI-FDD-Band7-B210.html')) { + archiveArtifacts artifacts: 'test_results-eNB-CI-FDD-Band7-B210.html' + } + } + } + } } } } diff --git a/ci-scripts/main.py b/ci-scripts/main.py index 4ba2fbcf5b8c1f650e7032f8348a919024abf326..83516d3358990c2d38befa48235ddd0d82e41bf0 100644 --- a/ci-scripts/main.py +++ b/ci-scripts/main.py @@ -45,7 +45,7 @@ import xml.etree.ElementTree as ET import logging import datetime import signal -from multiprocessing import Process,Lock +from multiprocessing import Process, Lock, SimpleQueue logging.basicConfig( level=logging.DEBUG, format="[%(asctime)s] %(name)s:%(levelname)s: %(message)s" @@ -154,6 +154,34 @@ class SSHConnection(): else: logging.debug('\u001B[1;37;41m Unexpected Others \u001B[0m') + def copy(self, ipaddress, username, password, source, destination): + logging.debug('scp '+ username + '@' + ipaddress + ':' + source + ' ' + destination) + scp_spawn = pexpect.spawn('scp '+ username + '@' + ipaddress + ':' + source + ' ' + destination, timeout = 5) + scp_response = scp_spawn.expect(['Are you sure you want to continue connecting (yes/no)?', 'password:', pexpect.EOF, pexpect.TIMEOUT]) + if scp_response == 0: + scp_spawn.sendline('yes') + scp_spawn.expect('password:') + scp_spawn.sendline(password) + scp_response = scp_spawn.expect(['\$', 'Permission denied', 'password:', pexpect.EOF, pexpect.TIMEOUT]) + if scp_response == 0: + pass + else: + logging.debug('1 - scp_response = ' + str(scp_response)) + sys.exit('SCP failed') + elif scp_response == 1: + scp_spawn.sendline(password) + scp_response = scp_spawn.expect(['\$', 'Permission denied', 'password:', pexpect.EOF, pexpect.TIMEOUT]) + if scp_response == 0 or scp_response == 3: + pass + else: + logging.debug('2 - scp_response = ' + str(scp_response)) + sys.exit('SCP failed') + elif scp_response == 2: + pass + else: + logging.debug('3 - scp_response = ' + str(scp_response)) + sys.exit('SCP failed') + def BuildeNB(self): if self.eNBIPAddress == '' or self.eNBRepository == '' or self.eNBBranch == '' or self.eNBUserName == '' or self.eNBPassword == '' or self.eNBSourceCodePath == '': Usage() @@ -274,7 +302,7 @@ class SSHConnection(): loopCounter = loopCounter - 1 if (loopCounter == 0): doLoop = False - logging.debug('\u001B[1;37;43m eNB logging system did not show got sync! See with attach later \u001B[0m') + logging.debug('\u001B[1;30;43m eNB logging system did not show got sync! See with attach later \u001B[0m') self.CreateHtmlTestRow(config_file, 'eNB not showing got sync!', 0) # Not getting got sync is bypassed for the moment #sys.exit(1) @@ -319,21 +347,32 @@ class SSHConnection(): job.join() self.CreateHtmlTestRow('N/A', 'OK', 0) - def AttachUE_common(self, device_id): + def AttachUE_common(self, device_id, statusQueue, lock): try: self.open(self.ADBIPAddress, self.ADBUserName, self.ADBPassword) self.command('stdbuf -o0 adb -s ' + device_id + ' shell /data/local/tmp/on', '\$', 60) time.sleep(2) - count = 45 + max_count = 45 + count = max_count while count > 0: self.command('stdbuf -o0 adb -s ' + device_id + ' shell dumpsys telephony.registry | grep mDataConnectionState', '\$', 15) result = re.search('mDataConnectionState.*=(?P<state>[0-9\-]+)', str(self.ssh.before)) if result is None: logging.debug('\u001B[1;37;41m mDataConnectionState Not Found! \u001B[0m') - sys.exit(1) + lock.acquire() + statusQueue.put(-1) + statusQueue.put(device_id) + statusQueue.put('mDataConnectionState Not Found!') + lock.release() + break mDataConnectionState = int(result.group('state')) if mDataConnectionState == 2: logging.debug('\u001B[1mUE (' + device_id + ') Attach Completed\u001B[0m') + lock.acquire() + statusQueue.put(max_count - count) + statusQueue.put(device_id) + statusQueue.put('Attach Completed') + lock.release() break count = count - 1 if count == 15 or count == 30: @@ -342,11 +381,15 @@ class SSHConnection(): time.sleep(0.5) self.command('stdbuf -o0 adb -s ' + device_id + ' shell /data/local/tmp/on', '\$', 60) time.sleep(0.5) - logging.debug('\u001B[1mWait UE (' + device_id + ') a second until mDataConnectionState=2 (' + str(45-count) + ' times)\u001B[0m') + logging.debug('\u001B[1mWait UE (' + device_id + ') a second until mDataConnectionState=2 (' + str(max_count-count) + ' times)\u001B[0m') time.sleep(1) if count == 0: logging.debug('\u001B[1;37;41m UE (' + device_id + ') Attach Failed \u001B[0m') - sys.exit(1) + lock.acquire() + statusQueue.put(-1) + statusQueue.put(device_id) + statusQueue.put('Attach Failed') + lock.release() self.close() except: os.kill(os.getppid(),signal.SIGUSR1) @@ -358,14 +401,39 @@ class SSHConnection(): initialize_eNB_flag = False self.CheckProcessExist(initialize_eNB_flag) multi_jobs = [] + status_queue = SimpleQueue() + lock = Lock() for device_id in self.UEDevices: - p = Process(target = SSH.AttachUE_common, args = (device_id,)) + p = Process(target = SSH.AttachUE_common, args = (device_id, status_queue, lock,)) p.daemon = True p.start() multi_jobs.append(p) for job in multi_jobs: job.join() - self.CreateHtmlTestRow('N/A', 'OK', len(self.UEDevices)) + + if (status_queue.empty()): + self.CreateHtmlTestRow('N/A', 'KO', len(self.UEDevices)) + sys.exit(1) + else: + attach_status = True + html_queue = SimpleQueue() + while (not status_queue.empty()): + count = status_queue.get() + if (count < 0): + attach_status = False + device_id = status_queue.get() + message = status_queue.get() + if (count < 0): + html_cell = "<pre>UE (" + device_id + ")\n" + message + "</pre>" + else: + html_cell = "<pre>UE (" + device_id + ")\n" + message + ' in ' + str(count + 2) + ' seconds</pre>' + html_queue.put(html_cell) + if (attach_status): + self.CreateHtmlTestRowQueue('N/A', 'OK', len(self.UEDevices), html_queue) + else: + self.CreateHtmlTestRowQueue('N/A', 'KO', len(self.UEDevices), html_queue) + self.CreateHtmlFooter() + sys.exit(1) def DetachUE_common(self, device_id): try: @@ -481,7 +549,7 @@ class SSHConnection(): self.UEIPAddresses.append(UE_IPAddress) self.close() - def Ping_common(self, lock, UE_IPAddress, device_id): + def Ping_common(self, lock, UE_IPAddress, device_id,statusQueue): try: self.open(self.EPCIPAddress, self.EPCUserName, self.EPCPassword) self.command('cd ' + self.EPCSourceCodePath, '\$', 5) @@ -490,32 +558,65 @@ class SSHConnection(): self.command('stdbuf -o0 ping ' + self.ping_args + ' ' + UE_IPAddress + ' 2>&1 | stdbuf -o0 tee -a ping_' + SSH.testCase_id + '_' + device_id + '.log', '\$', int(ping_time[0])*1.5) result = re.search(', (?P<packetloss>[0-9\.]+)% packet loss, time [0-9\.]+ms', str(self.ssh.before)) if result is None: - logging.debug('\u001B[1;37;41m Packet Loss Not Found! \u001B[0m') - sys.exit(1) + message = 'Packet Loss Not Found!' + logging.debug('\u001B[1;37;41m ' + message + ' \u001B[0m') + lock.acquire() + statusQueue.put(-1) + statusQueue.put(device_id) + statusQueue.put(message) + lock.release() + return packetloss = result.group('packetloss') if float(packetloss) == 100: - logging.debug('\u001B[1;37;41m Packet Loss is 100% \u001B[0m') - sys.exit(1) + message = 'Packet Loss is 100%' + logging.debug('\u001B[1;37;41m ' + message + ' \u001B[0m') + lock.acquire() + statusQueue.put(-1) + statusQueue.put(device_id) + statusQueue.put(message) + lock.release() + return result = re.search('rtt min\/avg\/max\/mdev = (?P<rtt_min>[0-9\.]+)\/(?P<rtt_avg>[0-9\.]+)\/(?P<rtt_max>[0-9\.]+)\/[0-9\.]+ ms', str(self.ssh.before)) if result is None: - logging.debug('\u001B[1;37;41m Ping RTT_Min RTT_Avg RTT_Max Not Found! \u001B[0m') - sys.exit(1) + message = 'Ping RTT_Min RTT_Avg RTT_Max Not Found!' + logging.debug('\u001B[1;37;41m ' + message + ' \u001B[0m') + lock.acquire() + statusQueue.put(-1) + statusQueue.put(device_id) + statusQueue.put(message) + lock.release() + return rtt_min = result.group('rtt_min') rtt_avg = result.group('rtt_avg') rtt_max = result.group('rtt_max') + pal_msg = 'Packet Loss : ' + packetloss + '%' + min_msg = 'RTT(Min) : ' + rtt_min + ' ms' + avg_msg = 'RTT(Avg) : ' + rtt_avg + ' ms' + max_msg = 'RTT(Max) : ' + rtt_max + ' ms' lock.acquire() logging.debug('\u001B[1;37;44m ping result (' + UE_IPAddress + ') \u001B[0m') - logging.debug('\u001B[1;34m Packet Loss : ' + packetloss + '%\u001B[0m') - logging.debug('\u001B[1;34m RTT(Min) : ' + rtt_min + ' ms' + '\u001B[0m') - logging.debug('\u001B[1;34m RTT(Avg) : ' + rtt_avg + ' ms' + '\u001B[0m') - logging.debug('\u001B[1;34m RTT(Max) : ' + rtt_max + ' ms' + '\u001B[0m') - lock.release() + logging.debug('\u001B[1;34m ' + pal_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 ' + max_msg + '\u001B[0m') + qMsg = pal_msg + '\n' + min_msg + '\n' + avg_msg + '\n' + max_msg + packetLossOK = True if packetloss is not None: if float(packetloss) > float(self.ping_packetloss_threshold): + qMsg += '\nPacket Loss too high' logging.debug('\u001B[1;37;41m Packet Loss too high \u001B[0m') - sys.exit(1) + packetLossOK = False elif float(packetloss) > 0: + qMsg += '\nPacket Loss is not 0%' logging.debug('\u001B[1;37;43m Packet Loss is not 0% \u001B[0m') + if (packetLossOK): + statusQueue.put(0) + else: + statusQueue.put(-1) + statusQueue.put(device_id) + statusQueue.put(UE_IPAddress) + statusQueue.put(qMsg) + lock.release() self.close() except: os.kill(os.getppid(),signal.SIGUSR1) @@ -530,16 +631,38 @@ class SSHConnection(): multi_jobs = [] i = 0 lock = Lock() + status_queue = SimpleQueue() for UE_IPAddress in self.UEIPAddresses: device_id = self.UEDevices[i] - p = Process(target = SSH.Ping_common, args = (lock,UE_IPAddress,device_id,)) + p = Process(target = SSH.Ping_common, args = (lock,UE_IPAddress,device_id,status_queue,)) p.daemon = True p.start() multi_jobs.append(p) i = i + 1 for job in multi_jobs: job.join() - self.CreateHtmlTestRow(self.ping_args, 'OK', 0) + + if (status_queue.empty()): + self.CreateHtmlTestRow(self.ping_args, 'KO', len(self.UEDevices)) + sys.exit(1) + else: + ping_status = True + html_queue = SimpleQueue() + while (not status_queue.empty()): + count = status_queue.get() + if (count < 0): + ping_status = False + device_id = status_queue.get() + ip_addr = status_queue.get() + message = status_queue.get() + html_cell = "<pre>UE (" + device_id + ")\nIP Address : " + ip_addr + "\n" + message + "</pre>" + html_queue.put(html_cell) + if (ping_status): + self.CreateHtmlTestRowQueue(self.ping_args, 'OK', len(self.UEDevices), html_queue) + else: + self.CreateHtmlTestRowQueue(self.ping_args, 'KO', len(self.UEDevices), html_queue) + self.CreateHtmlFooter() + sys.exit(1) def Iperf_ComputeTime(self): result = re.search('-t (?P<iperf_time>\d+)', str(self.iperf_args)) @@ -573,7 +696,7 @@ class SSHConnection(): sys.exit(1) return result - def Iperf_analyzeV2Output(self, lock, UE_IPAddress): + def Iperf_analyzeV2Output(self, lock, UE_IPAddress, device_id, statusQueue): result = re.search('Server Report:', str(self.ssh.before)) if result is None: result = re.search('read failed: Connection refused', str(self.ssh.before)) @@ -581,7 +704,7 @@ class SSHConnection(): logging.debug('\u001B[1;37;41m Could not connect to iperf server! \u001B[0m') else: logging.debug('\u001B[1;37;41m Server Report and Connection refused Not Found! \u001B[0m') - sys.exit(1) + return -1 result = re.search('Server Report:\\\\r\\\\n(?:|\[ *\d+\].*) (?P<bitrate>[0-9\.]+ [KMG]bits\/sec) +(?P<jitter>[0-9\.]+ ms) +(\d+\/..\d+) (\((?P<packetloss>[0-9\.]+)%\))', str(self.ssh.before)) if result is not None: bitrate = result.group('bitrate') @@ -589,41 +712,184 @@ class SSHConnection(): jitter = result.group('jitter') lock.acquire() logging.debug('\u001B[1;37;44m iperf result (' + UE_IPAddress + ') \u001B[0m') + iperfStatus = True + msg = '' if bitrate is not None: + msg += 'Bitrate : ' + bitrate + '\n' logging.debug('\u001B[1;34m Bitrate : ' + bitrate + '\u001B[0m') if packetloss is not None: + msg += 'Packet Loss : ' + packetloss + '%\n' logging.debug('\u001B[1;34m Packet Loss : ' + packetloss + '%\u001B[0m') if float(packetloss) > float(self.iperf_packetloss_threshold): + msg += 'Packet Loss too high!\n' logging.debug('\u001B[1;37;41m Packet Loss too high \u001B[0m') - lock.release() - sys.exit(1) + iperfStatus = False if jitter is not None: + msg += 'Jitter : ' + jitter + '\n' logging.debug('\u001B[1;34m Jitter : ' + jitter + '\u001B[0m') + if (iperfStatus): + statusQueue.put(0) + else: + statusQueue.put(-1) + statusQueue.put(device_id) + statusQueue.put(UE_IPAddress) + statusQueue.put(msg) + lock.release() + return 0 + + def Iperf_analyzeV2Server(self, lock, UE_IPAddress, device_id, statusQueue, iperf_real_options): + if (not os.path.isfile('iperf_server_' + SSH.testCase_id + '_' + device_id + '.log')): + lock.acquire() + statusQueue.put(-1) + statusQueue.put(device_id) + statusQueue.put(UE_IPAddress) + statusQueue.put('Could not analyze from server log') + lock.release() + return + # Computing the requested bandwidth in float + result = re.search('-b (?P<iperf_bandwidth>[0-9\.]+)[KMG]', str(iperf_real_options)) + if result is None: + logging.debug('Iperf bandwidth Not Found!') + lock.acquire() + statusQueue.put(-1) + statusQueue.put(device_id) + statusQueue.put(UE_IPAddress) + statusQueue.put('Could not compute Iperf bandwidth!') + lock.release() + return + else: + req_bandwidth = result.group('iperf_bandwidth') + req_bw = float(req_bandwidth) + result = re.search('-b [0-9\.]+K', str(iperf_real_options)) + if result is not None: + req_bandwidth = '%.1f Kbits/sec' % req_bw + req_bw = req_bw * 1000 + result = re.search('-b [0-9\.]+M', str(iperf_real_options)) + if result is not None: + req_bandwidth = '%.1f Mbits/sec' % req_bw + req_bw = req_bw * 1000000 + result = re.search('-b [0-9\.]+G', str(iperf_real_options)) + if result is not None: + req_bandwidth = '%.1f Gbits/sec' % req_bw + req_bw = req_bw * 1000000000 + + server_file = open('iperf_server_' + SSH.testCase_id + '_' + device_id + '.log', 'r') + br_sum = 0.0 + ji_sum = 0.0 + pl_sum = 0 + ps_sum = 0 + row_idx = 0 + for line in server_file.readlines(): + result = re.search('(?P<bitrate>[0-9\.]+ [KMG]bits\/sec) +(?P<jitter>[0-9\.]+ ms) +(?P<lostPack>[0-9]+)/ +(?P<sentPack>[0-9]+)', str(line)) + if result is not None: + bitrate = result.group('bitrate') + jitter = result.group('jitter') + packetlost = result.group('lostPack') + packetsent = result.group('sentPack') + br = bitrate.split(' ') + ji = jitter.split(' ') + row_idx = row_idx + 1 + curr_br = float(br[0]) + pl_sum = pl_sum + int(packetlost) + ps_sum = ps_sum + int(packetsent) + if (br[1] == 'Kbits/sec'): + curr_br = curr_br * 1000 + if (br[1] == 'Mbits/sec'): + curr_br = curr_br * 1000 * 1000 + br_sum = curr_br + br_sum + ji_sum = float(ji[0]) + ji_sum + if (row_idx > 0): + br_sum = br_sum / row_idx + ji_sum = ji_sum / row_idx + br_loss = 100 * br_sum / req_bw + if (br_sum > 1000): + br_sum = br_sum / 1000 + if (br_sum > 1000): + br_sum = br_sum / 1000 + bitrate = '%.2f Mbits/sec' % br_sum + else: + bitrate = '%.2f Kbits/sec' % br_sum + else: + bitrate = '%.2f bits/sec' % br_sum + bitperf = '%.2f ' % br_loss + bitperf += '%' + jitter = '%.2f ms' % (ji_sum) + if (ps_sum > 0): + pl = float(100 * pl_sum / ps_sum) + packetloss = '%2.1f ' % (pl) + packetloss += '%' + else: + packetloss = 'unknown' + lock.acquire() + if (br_loss < 90): + statusQueue.put(1) + else: + statusQueue.put(0) + statusQueue.put(device_id) + statusQueue.put(UE_IPAddress) + req_msg = 'Req Bitrate : ' + req_bandwidth + bir_msg = 'Bitrate : ' + bitrate + brl_msg = 'Bitrate Perf: ' + bitperf + jit_msg = 'Jitter : ' + jitter + pal_msg = 'Packet Loss : ' + packetloss + statusQueue.put(req_msg + '\n' + bir_msg + '\n' + brl_msg + '\n' + jit_msg + '\n' + pal_msg + '\n') + logging.debug('\u001B[1;37;45m iperf result (' + UE_IPAddress + ') \u001B[0m') + logging.debug('\u001B[1;35m ' + req_msg + '\u001B[0m') + logging.debug('\u001B[1;35m ' + bir_msg + '\u001B[0m') + logging.debug('\u001B[1;35m ' + brl_msg + '\u001B[0m') + logging.debug('\u001B[1;35m ' + jit_msg + '\u001B[0m') + logging.debug('\u001B[1;35m ' + pal_msg + '\u001B[0m') + lock.release() + else: + lock.acquire() + statusQueue.put(-1) + statusQueue.put(device_id) + statusQueue.put(UE_IPAddress) + statusQueue.put('Could not analyze from server log') lock.release() - def Iperf_analyzeV3Output(self, lock, UE_IPAddress): + server_file.close() + + + def Iperf_analyzeV3Output(self, lock, UE_IPAddress, device_id, statusQueue): result = re.search('(?P<bitrate>[0-9\.]+ [KMG]bits\/sec) +(?:|[0-9\.]+ ms +\d+\/\d+ \((?P<packetloss>[0-9\.]+)%\)) +(?:|receiver)\\\\r\\\\n(?:|\[ *\d+\] Sent \d+ datagrams)\\\\r\\\\niperf Done\.', str(self.ssh.before)) if result is None: result = re.search('(?P<error>iperf: error - [a-zA-Z0-9 :]+)', str(self.ssh.before)) + lock.acquire() + statusQueue.put(-1) + statusQueue.put(device_id) + statusQueue.put(UE_IPAddress) if result is not None: logging.debug('\u001B[1;37;41m ' + result.group('error') + ' \u001B[0m') + statusQueue.put(result.group('error')) else: logging.debug('\u001B[1;37;41m Bitrate and/or Packet Loss Not Found! \u001B[0m') - sys.exit(1) + statusQueue.put('Bitrate and/or Packet Loss Not Found!') + lock.release() + bitrate = result.group('bitrate') packetloss = result.group('packetloss') lock.acquire() logging.debug('\u001B[1;37;44m iperf result (' + UE_IPAddress + ') \u001B[0m') logging.debug('\u001B[1;34m Bitrate : ' + bitrate + '\u001B[0m') + msg = 'Bitrate : ' + bitrate + '\n' + iperfStatus = True if packetloss is not None: logging.debug('\u001B[1;34m Packet Loss : ' + packetloss + '%\u001B[0m') + msg += 'Packet Loss : ' + packetloss + '%\n' if float(packetloss) > float(self.iperf_packetloss_threshold): logging.debug('\u001B[1;37;41m Packet Loss too high \u001B[0m') - lock.release() - sys.exit(1) + msg += 'Packet Loss too high!\n' + iperfStatus = False + if (iperfStatus): + statusQueue.put(0) + else: + statusQueue.put(-1) + statusQueue.put(device_id) + statusQueue.put(UE_IPAddress) lock.release() - def Iperf_UL_common(self, lock, UE_IPAddress, device_id, idx, ue_num): + def Iperf_UL_common(self, lock, UE_IPAddress, device_id, idx, ue_num, statusQueue): ipnumbers = UE_IPAddress.split('.') if (len(ipnumbers) == 4): ipnumbers[3] = '1' @@ -645,25 +911,32 @@ class SSHConnection(): time.sleep(0.5) modified_options = self.Iperf_ComputeModifiedBW(idx, ue_num) + modified_options = modified_options.replace('-R','') time.sleep(0.5) self.command('rm -f iperf_' + SSH.testCase_id + '_' + device_id + '.log', '\$', 5) self.command('stdbuf -o0 adb -s ' + device_id + ' shell "/data/local/tmp/iperf -c ' + EPC_Iperf_UE_IPAddress + ' ' + modified_options + ' -p ' + str(port) + '" 2>&1 | stdbuf -o0 tee -a iperf_' + SSH.testCase_id + '_' + device_id + '.log', '\$', int(iperf_time)*5.0) - self.Iperf_analyzeV2Output(lock, UE_IPAddress) + clientStatus = self.Iperf_analyzeV2Output(lock, UE_IPAddress, device_id, statusQueue) # Launch iperf server on EPC side self.open(self.EPCIPAddress, self.EPCUserName, self.EPCPassword) self.command('killall --signal SIGKILL iperf', self.EPCUserName, 5) self.close() - - def Iperf_common(self, lock, UE_IPAddress, device_id, idx, ue_num): + if (clientStatus == -1): + time.sleep(1) + if (os.path.isfile('iperf_server_' + SSH.testCase_id + '_' + device_id + '.log')): + os.remove('iperf_server_' + SSH.testCase_id + '_' + device_id + '.log') + self.copy(self.EPCIPAddress, self.EPCUserName, self.EPCPassword, self.EPCSourceCodePath + '/scripts/iperf_server_' + SSH.testCase_id + '_' + device_id + '.log', '.') + self.Iperf_analyzeV2Server(lock, UE_IPAddress, device_id, statusQueue, modified_options) + + def Iperf_common(self, lock, UE_IPAddress, device_id, idx, ue_num, statusQueue): try: # Single-UE profile -- iperf only on one UE if SSH.iperf_profile == 'single-ue' and idx != 0: return useIperf3 = False self.open(self.ADBIPAddress, self.ADBUserName, self.ADBPassword) - # if by chance ADB server and EPC are on the same remote host, at least log collection will take of it + # if by chance ADB server and EPC are on the same remote host, at least log collection will take care of it self.command('if [ ! -d ' + self.EPCSourceCodePath + '/scripts ]; then mkdir -p ' + self.EPCSourceCodePath + '/scripts ; fi', '\$', 5) self.command('cd ' + self.EPCSourceCodePath + '/scripts', '\$', 5) # Checking if iperf / iperf3 are installed @@ -672,8 +945,16 @@ class SSHConnection(): if result is None: result = re.search('iperf', str(self.ssh.before)) if result is None: - logging.debug('\u001B[1;37;41m Neither iperf nor iperf3 installed on UE! \u001B[0m') - sys.exit(1) + message = 'Neither iperf nor iperf3 installed on UE!' + lock.acquire() + logging.debug('\u001B[1;37;41m ' + message + ' \u001B[0m') + statusQueue.put(-1) + statusQueue.put(device_id) + statusQueue.put(UE_IPAddress) + statusQueue.put(message) + lock.release() + return + #sys.exit(1) else: useIperf3 = True # in case of iperf, UL has its own function @@ -681,7 +962,7 @@ class SSHConnection(): result = re.search('-R', str(self.iperf_args)) if result is not None: self.close() - self.Iperf_UL_common(lock, UE_IPAddress, device_id, idx, ue_num) + self.Iperf_UL_common(lock, UE_IPAddress, device_id, idx, ue_num, statusQueue) return if (useIperf3): @@ -704,11 +985,12 @@ class SSHConnection(): if (useIperf3): self.command('stdbuf -o0 iperf3 -c ' + UE_IPAddress + ' ' + modified_options + ' 2>&1 | stdbuf -o0 tee -a iperf_' + SSH.testCase_id + '_' + device_id + '.log', '\$', int(iperf_time)*5.0) - self.Iperf_analyzeV3Output(lock, UE_IPAddress) + clientStatus = 0 + self.Iperf_analyzeV3Output(lock, UE_IPAddress, device_id, statusQueue) else: self.command('stdbuf -o0 iperf -c ' + UE_IPAddress + ' ' + modified_options + ' 2>&1 | stdbuf -o0 tee -a iperf_' + SSH.testCase_id + '_' + device_id + '.log', '\$', int(iperf_time)*5.0) - self.Iperf_analyzeV2Output(lock, UE_IPAddress) + clientStatus = self.Iperf_analyzeV2Output(lock, UE_IPAddress, device_id, statusQueue) self.close() self.open(self.ADBIPAddress, self.ADBUserName, self.ADBPassword) @@ -718,6 +1000,12 @@ class SSHConnection(): pid_iperf = result.group('pid') self.command('stdbuf -o0 adb -s ' + device_id + ' shell kill -KILL ' + pid_iperf, '\$', 5) self.close() + if (clientStatus == -1): + time.sleep(1) + if (os.path.isfile('iperf_server_' + SSH.testCase_id + '_' + device_id + '.log')): + os.remove('iperf_server_' + SSH.testCase_id + '_' + device_id + '.log') + self.copy(self.ADBIPAddress, self.ADBUserName, self.ADBPassword, self.EPCSourceCodePath + '/scripts/iperf_server_' + SSH.testCase_id + '_' + device_id + '.log', '.') + self.Iperf_analyzeV2Server(lock, UE_IPAddress, device_id, statusQueue, modified_options) except: os.kill(os.getppid(),signal.SIGUSR1) @@ -732,16 +1020,43 @@ class SSHConnection(): i = 0 ue_num = len(self.UEIPAddresses) lock = Lock() + status_queue = SimpleQueue() for UE_IPAddress in self.UEIPAddresses: device_id = self.UEDevices[i] - p = Process(target = SSH.Iperf_common, args = (lock,UE_IPAddress,device_id,i,ue_num,)) + p = Process(target = SSH.Iperf_common, args = (lock,UE_IPAddress,device_id,i,ue_num,status_queue,)) p.daemon = True p.start() multi_jobs.append(p) i = i + 1 for job in multi_jobs: job.join() - self.CreateHtmlTestRow(self.iperf_args, 'OK', 0) + + if (status_queue.empty()): + self.CreateHtmlTestRow(self.iperf_args, 'KO', len(self.UEDevices)) + sys.exit(1) + else: + iperf_status = True + iperf_noperf = False + html_queue = SimpleQueue() + while (not status_queue.empty()): + count = status_queue.get() + if (count < 0): + iperf_status = False + if (count > 0): + iperf_noperf = True + device_id = status_queue.get() + ip_addr = status_queue.get() + message = status_queue.get() + html_cell = "<pre>UE (" + device_id + ")\nIP Address : " + ip_addr + "\n" + message + "</pre>" + html_queue.put(html_cell) + if (iperf_noperf and iperf_status): + self.CreateHtmlTestRowQueue(self.iperf_args, 'PERF NOT MET', len(self.UEDevices), html_queue) + elif (iperf_status): + self.CreateHtmlTestRowQueue(self.iperf_args, 'OK', len(self.UEDevices), html_queue) + else: + self.CreateHtmlTestRowQueue(self.iperf_args, 'KO', len(self.UEDevices), html_queue) + self.CreateHtmlFooter() + sys.exit(1) def CheckProcessExist(self, initialize_eNB_flag): multi_jobs = [] @@ -872,6 +1187,7 @@ class SSHConnection(): self.command('cd /opt/ltebox/tools', '\$', 5) self.command('echo ' + self.EPCPassword + ' | sudo -S ./stop_mme', '\$', 5) self.close() + self.CreateHtmlTestRow('N/A', 'OK', 0) def TerminateSPGW(self): self.open(self.EPCIPAddress, self.EPCUserName, self.EPCPassword) @@ -1099,6 +1415,35 @@ class SSHConnection(): i += 1 self.htmlFile.write(' </tr>\n') + def CreateHtmlTestRowQueue(self, options, status, ue_status, ue_queue): + if ((not self.htmlFooterCreated) and (self.htmlHeaderCreated)): + addOrangeBK = False + self.htmlFile.write(' <tr>\n') + self.htmlFile.write(' <td bgcolor = "lightcyan" >' + SSH.testCase_id + '</td>\n') + self.htmlFile.write(' <td>' + SSH.desc + '</td>\n') + self.htmlFile.write(' <td>' + str(options) + '</td>\n') + if (str(status) == 'OK'): + self.htmlFile.write(' <td bgcolor = "lightgreen" >' + str(status) + '</td>\n') + elif (str(status) == 'KO'): + self.htmlFile.write(' <td bgcolor = "lightcoral" >' + str(status) + '</td>\n') + else: + addOrangeBK = True + self.htmlFile.write(' <td bgcolor = "orange" >' + str(status) + '</td>\n') + i = 0 + while (i < self.htmlUEConnected): + if (i < ue_status): + if (not ue_queue.empty()): + if (addOrangeBK): + self.htmlFile.write(' <td bgcolor = "orange" >' + str(ue_queue.get()) + '</td>\n') + else: + self.htmlFile.write(' <td>' + str(ue_queue.get()) + '</td>\n') + else: + self.htmlFile.write(' <td>-</td>\n') + else: + self.htmlFile.write(' <td>-</td>\n') + i += 1 + self.htmlFile.write(' </tr>\n') + #----------------------------------------------------------- # Usage() #----------------------------------------------------------- @@ -1110,8 +1455,8 @@ def Usage(): print(' --help Show this help.') print(' --mode=[Mode]') print(' TesteNB') - print(' TerminateeNB, TerminateEPC') - print(' LogCollectBuild, LogCollecteNB, LogCollectEPC, LogCollectADB') + print(' TerminateeNB, TerminateUE, TerminateHSS, TerminateMME, TerminateSPGW') + print(' LogCollectBuild, LogCollecteNB, LogCollectHSS, LogCollectMME, LogCollectSPGW, LogCollectPing, LogCollectIperf') print(' --eNBIPAddress=[eNB\'s IP Address]') print(' --eNBRepository=[eNB\'s Repository URL]') print(' --eNBBranch=[eNB\'s Branch Name]') diff --git a/ci-scripts/xml_files/enb_usrp210_band7.xml b/ci-scripts/xml_files/enb_usrp210_band7.xml index 7a56cf384c7bc50bc4e9d9cd3f56126c51be8cb5..444f91f09461fa86c90476d015199a8311365a42 100644 --- a/ci-scripts/xml_files/enb_usrp210_band7.xml +++ b/ci-scripts/xml_files/enb_usrp210_band7.xml @@ -21,13 +21,13 @@ --> <testCaseList> - <TestCaseRequestedList>010101 050101 060101 070101 040101 030101 040301 040501 040601 040602 040603 040604 040605 040641 040401 040201 030201 030111 040301 040511 040611 040612 040613 040614 040615 040651 040401 040201 030201 030121 040301 040521 040621 040622 040623 040661 040401 040201 030201 </TestCaseRequestedList> + <TestCaseRequestedList>010101 050101 060101 070101 040101 030101 040301 040501 040601 040602 040603 040604 040605 040641 040642 040401 040201 030201 030111 040301 040511 040611 040612 040613 040614 040615 040651 040652 040401 040201 030201 030121 040301 040521 040621 040622 040623 040624 040625 040662 040661 040401 040201 030201 </TestCaseRequestedList> <TestCaseExclusionList></TestCaseExclusionList> <testCase id="010101"> <class>Build_eNB</class> <desc>Build eNB (USRP)</desc> - <Build_eNB_args>-w USRP -x -c --eNB</Build_eNB_args> + <Build_eNB_args>-w USRP -c --eNB</Build_eNB_args> </testCase> <testCase id="030101"> @@ -138,6 +138,14 @@ <iperf_packetloss_threshold>50</iperf_packetloss_threshold> </testCase> + <testCase id="040642"> + <class>Iperf</class> + <desc>iperf (5MHz - UL/9Mbps/UDP)(60 sec)(single-ue profile)</desc> + <iperf_args>-u -b 9M -t 60 -i 1 -R</iperf_args> + <iperf_packetloss_threshold>50</iperf_packetloss_threshold> + <iperf_profile>single-ue</iperf_profile> + </testCase> + <testCase id="040611"> <class>Iperf</class> <desc>iperf (10MHz - DL/10Mbps/UDP)(60 sec)</desc> @@ -182,6 +190,14 @@ <iperf_packetloss_threshold>50</iperf_packetloss_threshold> </testCase> + <testCase id="040652"> + <class>Iperf</class> + <desc>iperf (10MHz - UL/20Mbps/UDP)(60 sec)(single-ue profile)</desc> + <iperf_args>-u -b 20M -t 60 -i 1 -R</iperf_args> + <iperf_packetloss_threshold>50</iperf_packetloss_threshold> + <iperf_profile>single-ue</iperf_profile> + </testCase> + <testCase id="040621"> <class>Iperf</class> <desc>iperf (20MHz - DL/20Mbps/UDP)(60 sec)</desc> @@ -211,7 +227,7 @@ <iperf_profile>single-ue</iperf_profile> </testCase> - <testCase id="040624"> + <testCase id="040625"> <class>Iperf</class> <desc>iperf (20MHz - DL/70Mbps/UDP)(60 sec)(unbalanced profile)</desc> <iperf_args>-u -b 70M -t 60 -i 1</iperf_args> @@ -226,6 +242,14 @@ <iperf_packetloss_threshold>50</iperf_packetloss_threshold> </testCase> + <testCase id="040662"> + <class>Iperf</class> + <desc>iperf (20MHz - UL/20Mbps/UDP)(60 sec)(single-ue profile)</desc> + <iperf_args>-u -b 20M -t 60 -i 1 -R</iperf_args> + <iperf_packetloss_threshold>50</iperf_packetloss_threshold> + <iperf_profile>single-ue</iperf_profile> + </testCase> + <testCase id="050101"> <class>Initialize_HSS</class> <desc>Initialize HSS</desc> diff --git a/ci-scripts/xml_files/test_case_list_template.xml b/ci-scripts/xml_files/test_case_list_template.xml index bc06dc75ce9a4a92b5496b5b50d20777360b46b3..25519dcd039f9a9ab1d479e83769a1d834e4acb9 100644 --- a/ci-scripts/xml_files/test_case_list_template.xml +++ b/ci-scripts/xml_files/test_case_list_template.xml @@ -29,13 +29,13 @@ <testCase id="010101"> <class>Build_eNB</class> <desc>Build eNB (USRP)</desc> - <Build_eNB_args>-w USRP -x -c --eNB</Build_eNB_args> + <Build_eNB_args>-w USRP -c --eNB</Build_eNB_args> </testCase> <testCase id="010102"> <class>Build_eNB</class> <desc>Build eNB (USRP)</desc> - <Build_eNB_args>-w BLADERF -x -c --eNB</Build_eNB_args> + <Build_eNB_args>-w BLADERF -c --eNB</Build_eNB_args> </testCase> <testCase id="030101"> diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 4c33eee8e4fb545700cb73467d4e9442a3691e47..fdb36a8e1da2d71a7298288d661d1016e0010d70 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -1890,9 +1890,13 @@ endif (${T_TRACER}) #This rule and the following deal with it. add_custom_command ( OUTPUT ${OPENAIR_DIR}/common/utils/T/T_IDs.h - COMMAND make + COMMAND $(MAKE) clean + COMMAND $(MAKE) + COMMAND $(MAKE) check_vcd WORKING_DIRECTORY ${OPENAIR_DIR}/common/utils/T DEPENDS ${OPENAIR_DIR}/common/utils/T/T_messages.txt + ${OPENAIR_DIR}/common/utils/LOG/vcd_signal_dumper.c + ${OPENAIR_DIR}/common/utils/LOG/vcd_signal_dumper.h ) #This rule is specifically needed to generate T files @@ -2197,7 +2201,8 @@ if (${T_TRACER}) oai_eth_transpro FLPT_MSG ASYNC_IF FLEXRAN_AGENT HASHTABLE MSC UTIL OMG_SUMO SECU_OSA SECU_CN SCHED_LIB PHY L2 default_sched remote_sched RAL CN_UTILS - GTPV1U SCTP_CLIENT UDP LIB_NAS_UE LFDS LFDS7 SIMU OPENAIR0_LIB PHY_MEX) + GTPV1U SCTP_CLIENT UDP LIB_NAS_UE LFDS LFDS7 SIMU OPENAIR0_LIB PHY_MEX + coding) if (TARGET ${i}) add_dependencies(${i} generate_T) endif() @@ -2240,7 +2245,7 @@ function(make_driver name dir) endforeach() CONFIGURE_FILE(${OPENAIR_CMAKE}/tools/Kbuild.cmake ${OPENAIR_BIN_DIR}/${name}/Kbuild) add_custom_command(OUTPUT ${name}.ko - COMMAND make -C ${module_build_path} M=${OPENAIR_BIN_DIR}/${name} + COMMAND $(MAKE) -C ${module_build_path} M=${OPENAIR_BIN_DIR}/${name} WORKING_DIRECTORY ${OPENAIR_BIN_DIR}/${name} COMMENT "building ${module}.ko" VERBATIM diff --git a/cmake_targets/tools/build_helper b/cmake_targets/tools/build_helper index 5ddce2340bebafaeb8894aae33ca7714fd36f7a0..3363bd2e7658feef8f91ec18b80f738b43cc440b 100755 --- a/cmake_targets/tools/build_helper +++ b/cmake_targets/tools/build_helper @@ -683,7 +683,7 @@ install_asn1c_from_source(){ # better to use a given commit than a branch in case the branch # is updated and requires modifications in the source of OAI #git checkout velichkov_s1ap_plus_option_group - git checkout ec830d70bbb014b769810355a2f321a91ccd8a58 + git checkout 73d6b23dcec9ab36605b4af884143824392134c1 autoreconf -iv ./configure make -j`nproc` diff --git a/common/utils/LOG/vcd_signal_dumper.h b/common/utils/LOG/vcd_signal_dumper.h index 3c722ac49aa1335b18497e360e142b46040f4f9c..749978bb48da6a0cae665968d04db65b97800925 100644 --- a/common/utils/LOG/vcd_signal_dumper.h +++ b/common/utils/LOG/vcd_signal_dumper.h @@ -39,7 +39,7 @@ /* WARNING: if you edit the enums below, update also string definitions in vcd_signal_dumper.c */ typedef enum { - VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX0_ENB = 0, + VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX0_ENB=0, VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX1_ENB, VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX0_ENB, VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX1_ENB, @@ -91,12 +91,12 @@ typedef enum { VCD_SIGNAL_DUMPER_VARIABLES_TX_SEQ_NUM, VCD_SIGNAL_DUMPER_VARIABLES_CNT, VCD_SIGNAL_DUMPER_VARIABLES_DUMMY_DUMP, - VCD_SIGNAL_DUMPER_VARIABLE_ITTI_SEND_MSG, - VCD_SIGNAL_DUMPER_VARIABLE_ITTI_POLL_MSG, - VCD_SIGNAL_DUMPER_VARIABLE_ITTI_RECV_MSG, - VCD_SIGNAL_DUMPER_VARIABLE_ITTI_ALLOC_MSG, - VCD_SIGNAL_DUMPER_VARIABLE_MP_ALLOC, - VCD_SIGNAL_DUMPER_VARIABLE_MP_FREE, + VCD_SIGNAL_DUMPER_VARIABLES_ITTI_SEND_MSG, + VCD_SIGNAL_DUMPER_VARIABLES_ITTI_POLL_MSG, + VCD_SIGNAL_DUMPER_VARIABLES_ITTI_RECV_MSG, + VCD_SIGNAL_DUMPER_VARIABLES_ITTI_ALLOC_MSG, + VCD_SIGNAL_DUMPER_VARIABLES_MP_ALLOC, + VCD_SIGNAL_DUMPER_VARIABLES_MP_FREE, VCD_SIGNAL_DUMPER_VARIABLES_UE_INST_CNT_RX, VCD_SIGNAL_DUMPER_VARIABLES_UE_INST_CNT_TX, VCD_SIGNAL_DUMPER_VARIABLES_DCI_INFO, diff --git a/common/utils/T/.gitignore b/common/utils/T/.gitignore index 817780592428b38fd48b57f26be6b3a73868ae63..d754ff7c38730801afa6f6629ef45b9c9d4dcc03 100644 --- a/common/utils/T/.gitignore +++ b/common/utils/T/.gitignore @@ -15,4 +15,5 @@ tracer/to_vcd tracer/extract_input_subframe tracer/extract_output_subframe tracer/extract +tracer/multi tracee/tracee diff --git a/common/utils/T/Makefile b/common/utils/T/Makefile index 5e1785ea91695ae36e08acab486c14c6b6b79e83..87a6e34c5d1e0ecd4636439d9eccf8aeacd26d38 100644 --- a/common/utils/T/Makefile +++ b/common/utils/T/Makefile @@ -18,6 +18,15 @@ T_messages.txt.h: T_messages.txt T_IDs.h: $(GENIDS) T_messages.txt ./$(GENIDS) T_messages.txt T_IDs.h +check_vcd: + gcc -Wall -I. -I.. -I../itti -Itracer -o _check_vcd check_vcd.c tracer/database.c tracer/utils.c -lm -pthread + ./_check_vcd || (rm -f ./_check_vcd ./T_IDs.h ./T_messages.txt.h && false) + rm -f ./_check_vcd + +.PHONY: check_vcd + clean: - rm -f *.o $(GENIDS) core T_IDs.h T_messages.txt.h - cd tracer && make clean + rm -f *.o $(GENIDS) core T_IDs.h T_messages.txt.h _check_vcd + +cleanall: clean + cd tracer && $(MAKE) clean diff --git a/common/utils/T/T.c b/common/utils/T/T.c index 8679a4185fdf2905b2850ce7115641827aef05a9..fbd3f75a0c195fbb9d41e927fe6b3bf13150ee41 100644 --- a/common/utils/T/T.c +++ b/common/utils/T/T.c @@ -31,6 +31,12 @@ volatile int _T_freelist_head; volatile int *T_freelist_head = &_T_freelist_head; T_cache_t *T_cache; +#if BASIC_SIMULATOR +/* global variables used by T_GET_SLOT, see in T.h */ +volatile uint64_t T_next_id; +volatile uint64_t T_active_id; +#endif + static void get_message(int s) { char t; @@ -91,7 +97,7 @@ static void new_thread(void *(*f)(void *), void *data) /* defined in local_tracer.c */ void T_local_tracer_main(int remote_port, int wait_for_tracer, - int local_socket, char *shm_file); + int local_socket, void *shm_array); /* We monitor the tracee and the local tracer processes. * When one dies we forcefully kill the other. @@ -114,22 +120,31 @@ void T_init(int remote_port, int wait_for_tracer, int dont_fork) { int socket_pair[2]; int s; - int T_shm_fd; int child1, child2; - char shm_file[128]; - - sprintf(shm_file, "/%s%d", T_SHM_FILENAME, getpid()); + int i; if (socketpair(AF_UNIX, SOCK_STREAM, 0, socket_pair)) { perror("socketpair"); abort(); } + /* setup shared memory */ + T_cache = mmap(NULL, T_CACHE_SIZE * sizeof(T_cache_t), + PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0); + if (T_cache == MAP_FAILED) + { perror("mmap"); abort(); } + + /* let's garbage the memory to catch some potential problems + * (think multiprocessor sync issues, barriers, etc.) + */ + memset(T_cache, 0x55, T_CACHE_SIZE * sizeof(T_cache_t)); + for (i = 0; i < T_CACHE_SIZE; i++) T_cache[i].busy = 0; + /* child1 runs the local tracer and child2 (or main) runs the tracee */ child1 = fork(); if (child1 == -1) abort(); if (child1 == 0) { close(socket_pair[1]); T_local_tracer_main(remote_port, wait_for_tracer, socket_pair[0], - shm_file); + T_cache); exit(0); } close(socket_pair[0]); @@ -138,6 +153,7 @@ void T_init(int remote_port, int wait_for_tracer, int dont_fork) child2 = fork(); if (child2 == -1) abort(); if (child2 != 0) { close(socket_pair[1]); + munmap(T_cache, T_CACHE_SIZE * sizeof(T_cache_t)); monitor_and_kill(child1, child2); } } @@ -148,34 +164,29 @@ void T_init(int remote_port, int wait_for_tracer, int dont_fork) T_socket = s; - /* setup shared memory */ - T_shm_fd = shm_open(shm_file, O_RDWR /*| O_SYNC*/, 0666); - shm_unlink(shm_file); - if (T_shm_fd == -1) { perror(shm_file); abort(); } - T_cache = mmap(NULL, T_CACHE_SIZE * sizeof(T_cache_t), - PROT_READ | PROT_WRITE, MAP_SHARED, T_shm_fd, 0); - if (T_cache == MAP_FAILED) - { perror(shm_file); abort(); } - close(T_shm_fd); - new_thread(T_receive_thread, NULL); } void T_Config_Init(void) { -int T_port; /* by default we wait for the tracer */ -int T_nowait; /* default port to listen to to wait for the tracer */ -int T_dont_fork; /* default is to fork, see 'T_init' to understand */ + int T_port; /* by default we wait for the tracer */ + int T_nowait; /* default port to listen to to wait for the tracer */ + int T_dont_fork; /* default is to fork, see 'T_init' to understand */ -paramdef_t ttraceparams[] = CMDLINE_TTRACEPARAMS_DESC ; + paramdef_t ttraceparams[] = CMDLINE_TTRACEPARAMS_DESC; -/* for a cleaner config file, TTracer params should be defined in a specific section... */ - config_get( ttraceparams,sizeof(ttraceparams)/sizeof(paramdef_t),TTRACER_CONFIG_PREFIX); + /* for a cleaner config file, TTracer params should be defined in a + * specific section... + */ + config_get(ttraceparams, + sizeof(ttraceparams) / sizeof(paramdef_t), + TTRACER_CONFIG_PREFIX); -/* compatibility: look for TTracer command line options in root section */ - config_process_cmdline( ttraceparams,sizeof(ttraceparams)/sizeof(paramdef_t),NULL); + /* compatibility: look for TTracer command line options in root section */ + config_process_cmdline(ttraceparams, + sizeof(ttraceparams) / sizeof(paramdef_t), + NULL); - if (T_stdout == 0) { + if (T_stdout == 0) T_init(T_port, 1-T_nowait, T_dont_fork); - } } diff --git a/common/utils/T/T.h b/common/utils/T/T.h index 755f5d4e3981fa0424a3a89436e343c6b7c83adc..18e4a590d9444d12257d5207b4e00446d2811f6b 100644 --- a/common/utils/T/T.h +++ b/common/utils/T/T.h @@ -112,13 +112,37 @@ extern volatile int *T_freelist_head; extern T_cache_t *T_cache; extern int *T_active; /* When running the basic simulator, we may fill the T cache too fast. - * Let's not crash if it's full, just wait. + * Let's serialize write accesses to the T cache. For that, we use a + * 'ticket' mechanism. To acquire a T slot the caller needs to own the + * current active ticket. We also wait for the slot to be free if + * it is already in use. */ #if BASIC_SIMULATOR -# define T_BASIC_SIMULATOR_WAIT \ - while (T_cache[T_LOCAL_slot].busy) usleep(100) +# define T_GET_SLOT \ + do { \ + extern volatile uint64_t T_next_id; \ + extern volatile uint64_t T_active_id; \ + uint64_t id; \ + /* get a ticket */ \ + id = __sync_fetch_and_add(&T_next_id, 1); \ + /* wait for our turn */ \ + while (id != __sync_fetch_and_add(&T_active_id, 0)) /* busy wait */; \ + /* this is our turn, try to acquire the slot until it's free */ \ + do { \ + T_LOCAL_busy = __sync_fetch_and_or(&T_cache[T_LOCAL_slot].busy, 0x01); \ + if (T_LOCAL_busy & 0x01) usleep(100); \ + } while (T_LOCAL_busy & 0x01); \ + /* check that there are still some tickets */ \ + if (__sync_fetch_and_add(&T_active_id, 0) == 0xffffffffffffffff) { \ + printf("T: reached the end of times, bye...\n"); \ + abort(); \ + } \ + /* free our ticket, which signals the next waiter that it's its turn */ \ + (void)__sync_fetch_and_add(&T_active_id, 1); \ + } while (0) #else -# define T_BASIC_SIMULATOR_WAIT /* */ +# define T_GET_SLOT \ + T_LOCAL_busy = __sync_fetch_and_or(&T_cache[T_LOCAL_slot].busy, 0x01); #endif /* used at header of Tn, allocates buffer */ @@ -126,11 +150,12 @@ extern int *T_active; char *T_LOCAL_buf; \ int T_LOCAL_size = 0; \ int T_LOCAL_slot; \ + int T_LOCAL_busy; \ T_LOCAL_slot = __sync_fetch_and_add(T_freelist_head, 1) \ & (T_CACHE_SIZE - 1); \ (void)__sync_fetch_and_and(T_freelist_head, T_CACHE_SIZE - 1); \ - T_BASIC_SIMULATOR_WAIT; \ - if (T_cache[T_LOCAL_slot].busy) { \ + T_GET_SLOT; \ + if (T_LOCAL_busy & 0x01) { \ printf("%s:%d:%s: T cache is full - consider increasing its size\n", \ __FILE__, __LINE__, __FUNCTION__); \ abort(); \ @@ -142,7 +167,7 @@ extern int *T_active; #define T_COMMIT() \ T_cache[T_LOCAL_slot].length = T_LOCAL_size; \ __sync_synchronize(); \ - T_cache[T_LOCAL_slot].busy = 1; \ + (void)__sync_fetch_and_or(&T_cache[T_LOCAL_slot].busy, 0x02); #define T_CHECK_SIZE(len, argnum) \ if (T_LOCAL_size + (len) > T_BUFFER_MAX) { \ @@ -578,10 +603,10 @@ extern int *T_active; /* optname helpstr paramflags XXXptr defXXXval type numelt */ /*------------------------------------------------------------------------------------------------------------------------------------------*/ #define CMDLINE_TTRACEPARAMS_DESC { \ -{"T_port", CONFIG_HLP_TPORT, 0, iptr:&T_port, defintval:2021, TYPE_INT, 0}, \ -{"T_nowait", CONFIG_HLP_NOTWAIT, PARAMFLAG_BOOL, iptr:&T_nowait, defintval:0, TYPE_INT, 0}, \ -{"T_dont_fork", CONFIG_HLP_TNOFORK, PARAMFLAG_BOOL, iptr:&T_dont_fork, defintval:0, TYPE_INT, 0}, \ -{"T_stdout", CONFIG_HLP_STDOUT, PARAMFLAG_BOOL, iptr:&T_stdout, defintval:1, TYPE_INT, 0}, \ +{"T_port", CONFIG_HLP_TPORT, 0, iptr:&T_port, defintval:2021, TYPE_INT, 0}, \ +{"T_nowait", CONFIG_HLP_NOTWAIT, PARAMFLAG_BOOL, iptr:&T_nowait, defintval:0, TYPE_INT, 0}, \ +{"T_dont_fork", CONFIG_HLP_TNOFORK, PARAMFLAG_BOOL, iptr:&T_dont_fork, defintval:0, TYPE_INT, 0}, \ +{"T_stdout", CONFIG_HLP_STDOUT, PARAMFLAG_BOOL, iptr:&T_stdout, defintval:1, TYPE_INT, 0}, \ } diff --git a/common/utils/T/T_defs.h b/common/utils/T/T_defs.h index b0b9940c30b669832edfe1a817d1f56ebec3a096..83a380662d025fcc8056375667d0d1f0f752998d 100644 --- a/common/utils/T/T_defs.h +++ b/common/utils/T/T_defs.h @@ -31,13 +31,15 @@ #endif typedef struct { + /* 'busy' is a bit field + * bit 0: 1 means that slot is acquired by writer + * bit 1: 1 means that slot is ready for consumption + */ volatile int busy; char buffer[T_BUFFER_MAX]; int length; } T_cache_t; -#define T_SHM_FILENAME "/T_shm_segment" - /* number of VCD functions (to be kept up to date! see in T_messages.txt) */ #define VCD_NUM_FUNCTIONS 190 diff --git a/common/utils/T/T_messages.txt b/common/utils/T/T_messages.txt index fd4425063b66a9d60f411e4a10560b5825caedce..676f329a0eb08fc4c2fb8e4efb2c69345e671f0e 100644 --- a/common/utils/T/T_messages.txt +++ b/common/utils/T/T_messages.txt @@ -749,6 +749,7 @@ ID = LEGACY_OSA_TRACE DESC = OSA legacy logs - trace level GROUP = ALL:LEGACY_OSA:LEGACY_GROUP_TRACE:LEGACY FORMAT = string,log + ID = LEGACY_SIM_INFO DESC = SIM legacy logs - info level GROUP = ALL:LEGACY_SIM:LEGACY_GROUP_INFO:LEGACY @@ -769,6 +770,7 @@ ID = LEGACY_SIM_TRACE DESC = SIM legacy logs - trace level GROUP = ALL:LEGACY_SIM:LEGACY_GROUP_TRACE:LEGACY FORMAT = string,log + # this is a bad hack but I won't fix (function util_print_hex_octets # in openairinterface5g/openair2/LAYER2/PDCP_v10.1.0/pdcp_util.c # does funky things with the LOG_x macros but we work on the C pre-processor @@ -922,30 +924,9 @@ ID = buf_test #VCD variables and functions #be careful! this must be synchronized with the code! -#also keep up to date VCD_NUM_VARIABLES and VCD_NUM_FUNCTIONS in T_defs.h - -#to synchronize: copy/paste from openair2/UTIL/LOG/vcd_signal_dumper.h -#the variables and functions name, replace "SIGNAL_DUMPER_VARIABLES" by -#"VARIABLE" and "SIGNAL_DUMPER_FUNCTIONS" by "FUNCTION" (check that -#everything is fine! for example we have -#VCD_SIGNAL_DUMPER_VARIABLE_ITTI_SEND_MSG that has VARIABLE without S) -#and then process with sed - -#to generate variables: -#sed -e "s/ VCD_VARIABLE_\(.*\)/ID = VCD_VARIABLE_\1\n DESC = VCD variable \1\n GROUP = ALL:VCD:ENB\n FORMAT = ulong,value/" < VCD >> T_messages.txt - -#to generate functions: -#sed -e "s/ VCD_FUNCTION_\(.*\)/ID = VCD_FUNCTION_\1\n DESC = VCD function \1\n GROUP = ALL:VCD:ENB\n FORMAT = int,value/" < VCD.functions >> T_messages.txt - -#you may want to manually edit groups for UE instead of eNB - -#then count functions and variables and update VCD_NUM_FUNCTIONS and -#VCD_NUM_VARIABLES in T_defs.h - -#also verify that VCD_FIRST_FUNCTION and VCD_FIRST_VARIABLE are correct -#in T_defs.h. They have to point to the first function and variable -#as defined below. Note also that the order of the VCD functions -#and variables must be the same as in the code. +#also keep up to date VCD_NUM_VARIABLES, VCD_NUM_FUNCTIONS, +#VCD_FIRST_FUNCTION and VCD_FIRST_VARIABLE in T_defs.h +#to check that everything is correct you can run: make _check_vcd #variables @@ -953,514 +934,642 @@ ID = VCD_VARIABLE_FRAME_NUMBER_TX0_ENB DESC = VCD variable FRAME_NUMBER_TX0_ENB GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = frame_number_TX0_eNB ID = VCD_VARIABLE_FRAME_NUMBER_TX1_ENB DESC = VCD variable FRAME_NUMBER_TX1_ENB GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = frame_number_TX1_eNB ID = VCD_VARIABLE_FRAME_NUMBER_RX0_ENB DESC = VCD variable FRAME_NUMBER_RX0_ENB GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = frame_number_RX0_eNB ID = VCD_VARIABLE_FRAME_NUMBER_RX1_ENB DESC = VCD variable FRAME_NUMBER_RX1_ENB GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = frame_number_RX1_eNB ID = VCD_VARIABLE_SUBFRAME_NUMBER_TX0_ENB DESC = VCD variable SUBFRAME_NUMBER_TX0_ENB GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = subframe_number_TX0_eNB ID = VCD_VARIABLE_SUBFRAME_NUMBER_TX1_ENB DESC = VCD variable SUBFRAME_NUMBER_TX1_ENB GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = subframe_number_TX1_eNB ID = VCD_VARIABLE_SUBFRAME_NUMBER_RX0_ENB DESC = VCD variable SUBFRAME_NUMBER_RX0_ENB GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = subframe_number_RX0_eNB ID = VCD_VARIABLE_SUBFRAME_NUMBER_RX1_ENB DESC = VCD variable SUBFRAME_NUMBER_RX1_ENB GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = subframe_number_RX1_eNB ID = VCD_VARIABLE_FRAME_NUMBER_TX0_RU DESC = VCD variable FRAME_NUMBER_TX0_RU GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = frame_number_TX0_RU ID = VCD_VARIABLE_FRAME_NUMBER_TX1_RU DESC = VCD variable FRAME_NUMBER_TX1_RU GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = frame_number_TX1_RU ID = VCD_VARIABLE_FRAME_NUMBER_RX0_RU DESC = VCD variable FRAME_NUMBER_RX0_RU GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = frame_number_RX0_RU ID = VCD_VARIABLE_FRAME_NUMBER_RX1_RU DESC = VCD variable FRAME_NUMBER_RX1_RU GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = frame_number_RX1_RU ID = VCD_VARIABLE_SUBFRAME_NUMBER_TX0_RU DESC = VCD variable SUBFRAME_NUMBER_TX0_RU GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = subframe_number_TX0_RU ID = VCD_VARIABLE_SUBFRAME_NUMBER_TX1_RU DESC = VCD variable SUBFRAME_NUMBER_TX1_RU GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = subframe_number_TX1_RU ID = VCD_VARIABLE_SUBFRAME_NUMBER_RX0_RU DESC = VCD variable SUBFRAME_NUMBER_RX0_RU GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = subframe_number_RX0_RU ID = VCD_VARIABLE_SUBFRAME_NUMBER_RX1_RU DESC = VCD variable SUBFRAME_NUMBER_RX1_RU GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = subframe_number_RX1_RU ID = VCD_VARIABLE_RUNTIME_TX_ENB DESC = VCD variable RUNTIME_TX_ENB GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = runtime_TX_eNB ID = VCD_VARIABLE_RUNTIME_RX_ENB DESC = VCD variable RUNTIME_RX_ENB GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = runtime_RX_eNB ID = VCD_VARIABLE_FRAME_NUMBER_TX0_UE DESC = VCD variable FRAME_NUMBER_TX0_UE GROUP = ALL:VCD:UE:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = frame_number_TX0_UE ID = VCD_VARIABLE_FRAME_NUMBER_TX1_UE DESC = VCD variable FRAME_NUMBER_TX1_UE GROUP = ALL:VCD:UE:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = frame_number_TX1_UE ID = VCD_VARIABLE_FRAME_NUMBER_RX0_UE DESC = VCD variable FRAME_NUMBER_RX0_UE GROUP = ALL:VCD:UE:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = frame_number_RX0_UE ID = VCD_VARIABLE_FRAME_NUMBER_RX1_UE DESC = VCD variable FRAME_NUMBER_RX1_UE GROUP = ALL:VCD:UE:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = frame_number_RX1_UE ID = VCD_VARIABLE_SUBFRAME_NUMBER_TX0_UE DESC = VCD variable SUBFRAME_NUMBER_TX0_UE GROUP = ALL:VCD:UE:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = subframe_TX0_UE ID = VCD_VARIABLE_SUBFRAME_NUMBER_TX1_UE DESC = VCD variable SUBFRAME_NUMBER_TX1_UE GROUP = ALL:VCD:UE:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = subframe_TX1_UE ID = VCD_VARIABLE_SUBFRAME_NUMBER_RX0_UE DESC = VCD variable SUBFRAME_NUMBER_RX0_UE GROUP = ALL:VCD:UE:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = subframe_RX0_UE ID = VCD_VARIABLE_SUBFRAME_NUMBER_RX1_UE DESC = VCD variable SUBFRAME_NUMBER_RX1_UE GROUP = ALL:VCD:UE:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = subframe_RX1_UE ID = VCD_VARIABLE_UE_RX_OFFSET DESC = VCD variable UE_RX_OFFSET GROUP = ALL:VCD:UE:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue_rx_offset ID = VCD_VARIABLE_DIFF DESC = VCD variable DIFF GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = diff2 ID = VCD_VARIABLE_HW_SUBFRAME DESC = VCD variable HW_SUBFRAME GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = hw_subframe ID = VCD_VARIABLE_HW_FRAME DESC = VCD variable HW_FRAME GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = hw_frame ID = VCD_VARIABLE_HW_SUBFRAME_RX DESC = VCD variable HW_SUBFRAME_RX GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = hw_subframe_rx ID = VCD_VARIABLE_HW_FRAME_RX DESC = VCD variable HW_FRAME_RX GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = hw_frame_rx ID = VCD_VARIABLE_TXCNT DESC = VCD variable TXCNT GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = txcnt ID = VCD_VARIABLE_RXCNT DESC = VCD variable RXCNT GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = rxcnt ID = VCD_VARIABLE_TRX_TS DESC = VCD variable TRX_TS GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = trx_ts ID = VCD_VARIABLE_TRX_TST DESC = VCD variable TRX_TST GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = trx_tst ID = VCD_VARIABLE_TRX_TS_UE DESC = VCD variable TRX_TS_UE GROUP = ALL:VCD:UE:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = trx_ts_ue ID = VCD_VARIABLE_TRX_TST_UE DESC = VCD variable TRX_TST_UE GROUP = ALL:VCD:UE:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = trx_tst_ue ID = VCD_VARIABLE_TRX_WRITE_FLAGS DESC = VCD variable TRX_WRITE_FLAGS GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = trx_write_flags ID = VCD_VARIABLE_TX_TS DESC = VCD variable TX_TS GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = tx_ts ID = VCD_VARIABLE_RX_TS DESC = VCD variable RX_TS GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = rx_ts ID = VCD_VARIABLE_RX_HWCNT DESC = VCD variable RX_HWCNT GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = hw_cnt_rx ID = VCD_VARIABLE_RX_LHWCNT DESC = VCD variable RX_LHWCNT GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = lhw_cnt_rx ID = VCD_VARIABLE_TX_HWCNT DESC = VCD variable TX_HWCNT GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = hw_cnt_tx ID = VCD_VARIABLE_TX_LHWCNT DESC = VCD variable TX_LHWCNT GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = lhw_cnt_tx ID = VCD_VARIABLE_RX_PCK DESC = VCD variable RX_PCK GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = pck_rx ID = VCD_VARIABLE_TX_PCK DESC = VCD variable TX_PCK GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = pck_tx ID = VCD_VARIABLE_RX_SEQ_NUM DESC = VCD variable RX_SEQ_NUM GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = rx_seq_num ID = VCD_VARIABLE_RX_SEQ_NUM_PRV DESC = VCD variable RX_SEQ_NUM_PRV GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = rx_seq_num_prv ID = VCD_VARIABLE_TX_SEQ_NUM DESC = VCD variable TX_SEQ_NUM GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = tx_seq_num ID = VCD_VARIABLE_CNT DESC = VCD variable CNT GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = cnt ID = VCD_VARIABLE_DUMMY_DUMP DESC = VCD variable DUMMY_DUMP GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = dummy_dump ID = VCD_VARIABLE_ITTI_SEND_MSG DESC = VCD variable ITTI_SEND_MSG GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = itti_send_msg ID = VCD_VARIABLE_ITTI_POLL_MSG DESC = VCD variable ITTI_POLL_MSG GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = itti_poll_msg ID = VCD_VARIABLE_ITTI_RECV_MSG DESC = VCD variable ITTI_RECV_MSG GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = itti_recv_msg ID = VCD_VARIABLE_ITTI_ALLOC_MSG DESC = VCD variable ITTI_ALLOC_MSG GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = itti_alloc_msg ID = VCD_VARIABLE_MP_ALLOC DESC = VCD variable MP_ALLOC GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = mp_alloc ID = VCD_VARIABLE_MP_FREE DESC = VCD variable MP_FREE GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = mp_free ID = VCD_VARIABLE_UE_INST_CNT_RX DESC = VCD variable UE_INST_CNT_RX GROUP = ALL:VCD:UE:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue_inst_cnt_rx ID = VCD_VARIABLE_UE_INST_CNT_TX DESC = VCD variable UE_INST_CNT_TX GROUP = ALL:VCD:UE:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue_inst_cnt_tx ID = VCD_VARIABLE_DCI_INFO DESC = VCD variable DCI_INFO GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = dci_info ID = VCD_VARIABLE_UE0_BSR DESC = VCD variable UE0_BSR GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_BSR ID = VCD_VARIABLE_UE0_BO DESC = VCD variable UE0_BO GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_BO ID = VCD_VARIABLE_UE0_SCHEDULED DESC = VCD variable UE0_SCHEDULED GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_scheduled ID = VCD_VARIABLE_UE0_TIMING_ADVANCE DESC = VCD variable UE0_TIMING_ADVANCE GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_timing_advance ID = VCD_VARIABLE_UE0_SR_ENERGY DESC = VCD variable UE0_SR_ENERGY GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_SR_ENERGY ID = VCD_VARIABLE_UE0_SR_THRES DESC = VCD variable UE0_SR_THRES GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_SR_THRES ID = VCD_VARIABLE_UE0_RSSI0 DESC = VCD variable UE0_RSSI0 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_rssi0 ID = VCD_VARIABLE_UE0_RSSI1 DESC = VCD variable UE0_RSSI1 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_rssi1 ID = VCD_VARIABLE_UE0_RSSI2 DESC = VCD variable UE0_RSSI2 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_rssi2 ID = VCD_VARIABLE_UE0_RSSI3 DESC = VCD variable UE0_RSSI3 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_rssi3 ID = VCD_VARIABLE_UE0_RSSI4 DESC = VCD variable UE0_RSSI4 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_rssi4 ID = VCD_VARIABLE_UE0_RSSI5 DESC = VCD variable UE0_RSSI5 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_rssi5 ID = VCD_VARIABLE_UE0_RSSI6 DESC = VCD variable UE0_RSSI6 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_rssi6 ID = VCD_VARIABLE_UE0_RSSI7 DESC = VCD variable UE0_RSSI7 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_rssi7 ID = VCD_VARIABLE_UE0_RES0 DESC = VCD variable UE0_RES0 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_res0 ID = VCD_VARIABLE_UE0_RES1 DESC = VCD variable UE0_RES1 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_res1 ID = VCD_VARIABLE_UE0_RES2 DESC = VCD variable UE0_RES2 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_res2 ID = VCD_VARIABLE_UE0_RES3 DESC = VCD variable UE0_RES3 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_res3 ID = VCD_VARIABLE_UE0_RES4 DESC = VCD variable UE0_RES4 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_res4 ID = VCD_VARIABLE_UE0_RES5 DESC = VCD variable UE0_RES5 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_res5 ID = VCD_VARIABLE_UE0_RES6 DESC = VCD variable UE0_RES6 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_res6 ID = VCD_VARIABLE_UE0_RES7 DESC = VCD variable UE0_RES7 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_res7 ID = VCD_VARIABLE_UE0_MCS0 DESC = VCD variable UE0_MCS0 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_MCS0 ID = VCD_VARIABLE_UE0_MCS1 DESC = VCD variable UE0_MCS1 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_MCS1 ID = VCD_VARIABLE_UE0_MCS2 DESC = VCD variable UE0_MCS2 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_MCS2 ID = VCD_VARIABLE_UE0_MCS3 DESC = VCD variable UE0_MCS3 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_MCS3 ID = VCD_VARIABLE_UE0_MCS4 DESC = VCD variable UE0_MCS4 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_MCS4 ID = VCD_VARIABLE_UE0_MCS5 DESC = VCD variable UE0_MCS5 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_MCS5 ID = VCD_VARIABLE_UE0_MCS6 DESC = VCD variable UE0_MCS6 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_MCS6 ID = VCD_VARIABLE_UE0_MCS7 DESC = VCD variable UE0_MCS7 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_MCS7 ID = VCD_VARIABLE_UE0_RB0 DESC = VCD variable UE0_RB0 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_RB0 ID = VCD_VARIABLE_UE0_RB1 DESC = VCD variable UE0_RB1 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_RB1 ID = VCD_VARIABLE_UE0_RB2 DESC = VCD variable UE0_RB2 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_RB2 ID = VCD_VARIABLE_UE0_RB3 DESC = VCD variable UE0_RB3 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_RB3 ID = VCD_VARIABLE_UE0_RB4 DESC = VCD variable UE0_RB4 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_RB4 ID = VCD_VARIABLE_UE0_RB5 DESC = VCD variable UE0_RB5 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_RB5 ID = VCD_VARIABLE_UE0_RB6 DESC = VCD variable UE0_RB6 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_RB6 ID = VCD_VARIABLE_UE0_RB7 DESC = VCD variable UE0_RB7 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_RB7 ID = VCD_VARIABLE_UE0_ROUND0 DESC = VCD variable UE0_ROUND0 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_ROUND0 ID = VCD_VARIABLE_UE0_ROUND1 DESC = VCD variable UE0_ROUND1 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_ROUND1 ID = VCD_VARIABLE_UE0_ROUND2 DESC = VCD variable UE0_ROUND2 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_ROUND2 ID = VCD_VARIABLE_UE0_ROUND3 DESC = VCD variable UE0_ROUND3 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_ROUND3 ID = VCD_VARIABLE_UE0_ROUND4 DESC = VCD variable UE0_ROUND4 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_ROUND4 ID = VCD_VARIABLE_UE0_ROUND5 DESC = VCD variable UE0_ROUND5 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_ROUND5 ID = VCD_VARIABLE_UE0_ROUND6 DESC = VCD variable UE0_ROUND6 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_ROUND6 ID = VCD_VARIABLE_UE0_ROUND7 DESC = VCD variable UE0_ROUND7 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_ROUND7 ID = VCD_VARIABLE_UE0_SFN0 DESC = VCD variable UE0_SFN0 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_SFN0 ID = VCD_VARIABLE_UE0_SFN1 DESC = VCD variable UE0_SFN1 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_SFN1 ID = VCD_VARIABLE_UE0_SFN2 DESC = VCD variable UE0_SFN2 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_SFN2 ID = VCD_VARIABLE_UE0_SFN3 DESC = VCD variable UE0_SFN3 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_SFN3 ID = VCD_VARIABLE_UE0_SFN4 DESC = VCD variable UE0_SFN4 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_SFN4 ID = VCD_VARIABLE_UE0_SFN5 DESC = VCD variable UE0_SFN5 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_SFN5 ID = VCD_VARIABLE_UE0_SFN6 DESC = VCD variable UE0_SFN6 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_SFN6 ID = VCD_VARIABLE_UE0_SFN7 DESC = VCD variable UE0_SFN7 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_SFN7 ID = VCD_VARIABLE_SEND_IF4_SYMBOL DESC = VCD variable SEND_IF4_SYMBOL GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = send_if4_symbol ID = VCD_VARIABLE_RECV_IF4_SYMBOL DESC = VCD variable RECV_IF4_SYMBOL GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = recv_if4_symbol ID = VCD_VARIABLE_SEND_IF5_PKT_ID DESC = VCD variable SEND_IF5_PKT_ID GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = send_if5_pkt_id ID = VCD_VARIABLE_RECV_IF5_PKT_ID DESC = VCD variable RECV_IF5_PKT_ID GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = recv_if5_pkt_id ID = VCD_VARIABLE_UE_PDCP_FLUSH_SIZE DESC = VCD variable UE_PDCP_FLUSH_SIZE GROUP = ALL:VCD:ENB:UE:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue_pdcp_flush_size ID = VCD_VARIABLE_UE_PDCP_FLUSH_ERR DESC = VCD variable UE_PDCP_FLUSH_ERR GROUP = ALL:VCD:ENB:UE:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue_pdcp_flush_err ID = VCD_VARIABLE_UE0_TRX_READ_NS DESC = VCD variable UE0_TRX_READ_NS GROUP = ALL:VCD:UE:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_trx_read_ns ID = VCD_VARIABLE_UE0_TRX_WRITE_NS DESC = VCD variable UE0_TRX_WRITE_NS GROUP = ALL:VCD:UE:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_trx_write_ns ID = VCD_VARIABLE_UE0_TRX_READ_NS_MISSING DESC = VCD variable UE0_TRX_READ_NS_MISSING GROUP = ALL:VCD:UE:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_trx_read_ns_missing ID = VCD_VARIABLE_UE0_TRX_WRITE_NS_MISSING DESC = VCD variable UE0_TRX_WRITE_NS_MISSING GROUP = ALL:VCD:UE:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_trx_write_ns_missing ID = VCD_VARIABLE_CPUID_ENB_THREAD_RXTX DESC = VCD variable CPUID_ENB_THREAD_RXTX GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = enb_thread_rxtx_CPUID ID = VCD_VARIABLE_CPUID_RU_THREAD DESC = VCD variable CPUID_RU_THREAD GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ru_thread_CPUID ID = VCD_VARIABLE_CPUID_RU_THREAD_TX DESC = VCD variable CPUID_RU_THREAD_TX GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ru_thread_tx_CPUID #functions @@ -1468,763 +1577,954 @@ ID = VCD_FUNCTION_RT_SLEEP DESC = VCD function RT_SLEEP GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = rt_sleep ID = VCD_FUNCTION_TRX_READ DESC = VCD function TRX_READ GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = trx_read ID = VCD_FUNCTION_TRX_WRITE DESC = VCD function TRX_WRITE GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = trx_write ID = VCD_FUNCTION_TRX_READ_UE DESC = VCD function TRX_READ_UE GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = trx_read_ue ID = VCD_FUNCTION_TRX_WRITE_UE DESC = VCD function TRX_WRITE_UE GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = trx_write_ue ID = VCD_FUNCTION_TRX_READ_IF DESC = VCD function TRX_READ_IF GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = trx_read_if ID = VCD_FUNCTION_TRX_WRITE_IF DESC = VCD function TRX_WRITE_IF GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = trx_write_if ID = VCD_FUNCTION_eNB_PROC_RXTX0 DESC = VCD function eNB_PROC_RXTX0 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = eNB_thread_rxtx0 ID = VCD_FUNCTION_eNB_PROC_RXTX1 DESC = VCD function eNB_PROC_RXTX1 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = eNB_thread_rxtx1 ID = VCD_FUNCTION_UE_THREAD_SYNCH DESC = VCD function UE_THREAD_SYNCH GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = ue_thread_synch ID = VCD_FUNCTION_UE_THREAD_RXTX0 DESC = VCD function UE_THREAD_RXTX0 GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = ue_thread_rxtx0 ID = VCD_FUNCTION_UE_THREAD_RXTX1 DESC = VCD function UE_THREAD_RXTX1 GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = ue_thread_rxtx1 ID = VCD_FUNCTION_TRX_READ_SF9 DESC = VCD function TRX_READ_SF9 GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = trx_read_sf9 ID = VCD_FUNCTION_TRX_WRITE_SF9 DESC = VCD function TRX_WRITE_SF9 GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = trx_write_sf9 ID = VCD_FUNCTION_UE_SIGNAL_COND_RXTX0 DESC = VCD function UE_SIGNAL_COND_RXTX0 GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = ue_signal_cond_rxtx0 ID = VCD_FUNCTION_UE_SIGNAL_COND_RXTX1 DESC = VCD function UE_SIGNAL_COND_RXTX1 GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = ue_signal_cond_rxtx1 ID = VCD_FUNCTION_UE_WAIT_COND_RXTX0 DESC = VCD function UE_WAIT_COND_RXTX0 GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = ue_wait_cond_rxtx0 ID = VCD_FUNCTION_UE_WAIT_COND_RXTX1 DESC = VCD function UE_WAIT_COND_RXTX1 GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = ue_wait_cond_rxtx1 ID = VCD_FUNCTION_UE_LOCK_MUTEX_RXTX_FOR_COND_WAIT0 DESC = VCD function UE_LOCK_MUTEX_RXTX_FOR_COND_WAIT0 GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = ue_lock_mutex_rxtx_for_cond_wait0 ID = VCD_FUNCTION_UE_LOCK_MUTEX_RXTX_FOR_COND_WAIT1 DESC = VCD function UE_LOCK_MUTEX_RXTX_FOR_COND_WAIT1 GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = ue_lock_mutex_rxtx_for_cond_wait1 ID = VCD_FUNCTION_UE_LOCK_MUTEX_RXTX_FOR_CNT_DECREMENT0 DESC = VCD function UE_LOCK_MUTEX_RXTX_FOR_CNT_DECREMENT0 GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = ue_lock_mutex_rxtx_for_cnt_decrement0 ID = VCD_FUNCTION_UE_LOCK_MUTEX_RXTX_FOR_CNT_DECREMENT1 DESC = VCD function UE_LOCK_MUTEX_RXTX_FOR_CNT_DECREMENT1 GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = ue_lock_mutex_rxtx_for_cnt_decrement1 ID = VCD_FUNCTION_UE_LOCK_MUTEX_RXTX_FOR_CNT_INCREMENT0 DESC = VCD function UE_LOCK_MUTEX_RXTX_FOR_CNT_INCREMENT0 GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = ue_lock_mutex_rxtx_for_cnt_increment0 ID = VCD_FUNCTION_UE_LOCK_MUTEX_RXTX_FOR_CNT_INCREMENT1 DESC = VCD function UE_LOCK_MUTEX_RXTX_FOR_CNT_INCREMENT1 GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = ue_lock_mutex_rxtx_for_cnt_increment1 ID = VCD_FUNCTION_SIM_DO_DL_SIGNAL DESC = VCD function SIM_DO_DL_SIGNAL GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = do_DL_sig ID = VCD_FUNCTION_SIM_DO_UL_SIGNAL DESC = VCD function SIM_DO_UL_SIGNAL GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = do_UL_sig ID = VCD_FUNCTION_SIM_UE_TRX_READ DESC = VCD function SIM_UE_TRX_READ GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = UE_trx_read ID = VCD_FUNCTION_eNB_TX DESC = VCD function eNB_TX GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = eNB_tx ID = VCD_FUNCTION_eNB_RX DESC = VCD function eNB_RX GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = eNB_rx ID = VCD_FUNCTION_eNB_TRX DESC = VCD function eNB_TRX GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = eNB_trx ID = VCD_FUNCTION_eNB_TM DESC = VCD function eNB_TM GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = eNB_tm ID = VCD_FUNCTION_eNB_RX_SLEEP DESC = VCD function eNB_RX_SLEEP GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = eNB_rx_sleep ID = VCD_FUNCTION_eNB_TX_SLEEP DESC = VCD function eNB_TX_SLEEP GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = eNB_tx_sleep ID = VCD_FUNCTION_eNB_PROC_SLEEP DESC = VCD function eNB_PROC_SLEEP GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = eNB_proc_sleep ID = VCD_FUNCTION_TRX_READ_RF DESC = VCD function TRX_READ_RF GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = trx_read_rf ID = VCD_FUNCTION_TRX_WRITE_RF DESC = VCD function TRX_WRITE_RF GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = trx_write_rf ID = VCD_FUNCTION_UE_SYNCH DESC = VCD function UE_SYNCH GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = ue_synch ID = VCD_FUNCTION_UE_SLOT_FEP DESC = VCD function UE_SLOT_FEP GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = ue_slot_fep ID = VCD_FUNCTION_UE_RRC_MEASUREMENTS DESC = VCD function UE_RRC_MEASUREMENTS GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = ue_rrc_measurements ID = VCD_FUNCTION_UE_GAIN_CONTROL DESC = VCD function UE_GAIN_CONTROL GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = ue_gain_control ID = VCD_FUNCTION_UE_ADJUST_SYNCH DESC = VCD function UE_ADJUST_SYNCH GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = ue_adjust_synch ID = VCD_FUNCTION_UE_MEASUREMENT_PROCEDURES DESC = VCD function UE_MEASUREMENT_PROCEDURES GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = lte_ue_measurement_procedures ID = VCD_FUNCTION_UE_PDCCH_PROCEDURES DESC = VCD function UE_PDCCH_PROCEDURES GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = lte_ue_pdcch_procedures ID = VCD_FUNCTION_UE_PBCH_PROCEDURES DESC = VCD function UE_PBCH_PROCEDURES GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = lte_ue_pbch_procedures ID = VCD_FUNCTION_PHY_PROCEDURES_ENB_TX DESC = VCD function PHY_PROCEDURES_ENB_TX GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_procedures_eNb_tx0 ID = VCD_FUNCTION_PHY_PROCEDURES_ENB_TX1 DESC = VCD function PHY_PROCEDURES_ENB_TX1 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_procedures_eNb_tx1 ID = VCD_FUNCTION_PHY_PROCEDURES_RU_FEPRX DESC = VCD function PHY_PROCEDURES_RU_FEPRX GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_procedures_ru_feprx0 ID = VCD_FUNCTION_PHY_PROCEDURES_RU_FEPRX1 DESC = VCD function PHY_PROCEDURES_RU_FEPRX1 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_procedures_ru_feprx1 ID = VCD_FUNCTION_PHY_PROCEDURES_RU_FEPTX_OFDM DESC = VCD function PHY_PROCEDURES_RU_FEPTX_OFDM GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_procedures_ru_feptx_ofdm0 ID = VCD_FUNCTION_PHY_PROCEDURES_RU_FEPTX_OFDM1 DESC = VCD function PHY_PROCEDURES_RU_FEPTX_OFDM1 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_procedures_ru_feptx_ofdm1 ID = VCD_FUNCTION_PHY_PROCEDURES_RU_FEPTX_PREC DESC = VCD function PHY_PROCEDURES_RU_FEPTX_PREC GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_procedures_ru_feptx_prec0 ID = VCD_FUNCTION_PHY_PROCEDURES_RU_FEPTX_PREC1 DESC = VCD function PHY_PROCEDURES_RU_FEPTX_PREC1 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_procedures_ru_feptx_prec1 ID = VCD_FUNCTION_PHY_PROCEDURES_ENB_RX_UESPEC DESC = VCD function PHY_PROCEDURES_ENB_RX_UESPEC GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_procedures_eNb_rx_uespec0 ID = VCD_FUNCTION_PHY_PROCEDURES_ENB_RX_UESPEC1 DESC = VCD function PHY_PROCEDURES_ENB_RX_UESPEC1 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_procedures_eNb_rx_uespec1 ID = VCD_FUNCTION_PHY_PROCEDURES_UE_TX DESC = VCD function PHY_PROCEDURES_UE_TX GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_procedures_ue_tx ID = VCD_FUNCTION_PHY_PROCEDURES_UE_RX DESC = VCD function PHY_PROCEDURES_UE_RX GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_procedures_ue_rx ID = VCD_FUNCTION_PHY_PROCEDURES_UE_TX_ULSCH_UESPEC DESC = VCD function PHY_PROCEDURES_UE_TX_ULSCH_UESPEC GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_procedures_ue_tx_ulsch_uespec ID = VCD_FUNCTION_PHY_PROCEDURES_UE_TX_PUCCH DESC = VCD function PHY_PROCEDURES_UE_TX_PUCCH GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_procedures_ue_tx_pucch ID = VCD_FUNCTION_PHY_PROCEDURES_UE_TX_ULSCH_COMMON DESC = VCD function PHY_PROCEDURES_UE_TX_ULSCH_COMMON GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_procedures_ue_tx_ulsch_common ID = VCD_FUNCTION_PHY_PROCEDURES_UE_TX_PRACH DESC = VCD function PHY_PROCEDURES_UE_TX_PRACH GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_procedures_ue_tx_prach ID = VCD_FUNCTION_PHY_PROCEDURES_UE_TX_ULSCH_RAR DESC = VCD function PHY_PROCEDURES_UE_TX_ULSCH_RAR GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_procedures_ue_tx_ulsch_rar ID = VCD_FUNCTION_PHY_PROCEDURES_ENB_LTE DESC = VCD function PHY_PROCEDURES_ENB_LTE GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_procedures_eNB_lte ID = VCD_FUNCTION_PHY_PROCEDURES_UE_LTE DESC = VCD function PHY_PROCEDURES_UE_LTE GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_procedures_UE_lte ID = VCD_FUNCTION_PDSCH_THREAD DESC = VCD function PDSCH_THREAD GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = pdsch_thread ID = VCD_FUNCTION_DLSCH_THREAD0 DESC = VCD function DLSCH_THREAD0 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = dlsch_thread0 ID = VCD_FUNCTION_DLSCH_THREAD1 DESC = VCD function DLSCH_THREAD1 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = dlsch_thread1 ID = VCD_FUNCTION_DLSCH_THREAD2 DESC = VCD function DLSCH_THREAD2 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = dlsch_thread2 ID = VCD_FUNCTION_DLSCH_THREAD3 DESC = VCD function DLSCH_THREAD3 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = dlsch_thread3 ID = VCD_FUNCTION_DLSCH_THREAD4 DESC = VCD function DLSCH_THREAD4 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = dlsch_thread4 ID = VCD_FUNCTION_DLSCH_THREAD5 DESC = VCD function DLSCH_THREAD5 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = dlsch_thread5 ID = VCD_FUNCTION_DLSCH_THREAD6 DESC = VCD function DLSCH_THREAD6 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = dlsch_thread6 ID = VCD_FUNCTION_DLSCH_THREAD7 DESC = VCD function DLSCH_THREAD7 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = dlsch_thread7 ID = VCD_FUNCTION_DLSCH_DECODING0 DESC = VCD function DLSCH_DECODING0 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = dlsch_decoding0 ID = VCD_FUNCTION_DLSCH_DECODING1 DESC = VCD function DLSCH_DECODING1 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = dlsch_decoding1 ID = VCD_FUNCTION_DLSCH_DECODING2 DESC = VCD function DLSCH_DECODING2 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = dlsch_decoding2 ID = VCD_FUNCTION_DLSCH_DECODING3 DESC = VCD function DLSCH_DECODING3 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = dlsch_decoding3 ID = VCD_FUNCTION_DLSCH_DECODING4 DESC = VCD function DLSCH_DECODING4 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = dlsch_decoding4 ID = VCD_FUNCTION_DLSCH_DECODING5 DESC = VCD function DLSCH_DECODING5 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = dlsch_decoding5 ID = VCD_FUNCTION_DLSCH_DECODING6 DESC = VCD function DLSCH_DECODING6 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = dlsch_decoding6 ID = VCD_FUNCTION_DLSCH_DECODING7 DESC = VCD function DLSCH_DECODING7 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = dlsch_decoding7 ID = VCD_FUNCTION_RX_PDCCH DESC = VCD function RX_PDCCH GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = rx_pdcch ID = VCD_FUNCTION_DCI_DECODING DESC = VCD function DCI_DECODING GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = dci_decoding ID = VCD_FUNCTION_RX_PHICH DESC = VCD function RX_PHICH GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = rx_phich ID = VCD_FUNCTION_PDSCH_PROC DESC = VCD function PDSCH_PROC GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = pdsch_procedures ID = VCD_FUNCTION_PDSCH_PROC_SI DESC = VCD function PDSCH_PROC_SI GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = pdsch_procedures_si ID = VCD_FUNCTION_PDSCH_PROC_P DESC = VCD function PDSCH_PROC_P GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = pdsch_procedures_p ID = VCD_FUNCTION_PDSCH_PROC_RA DESC = VCD function PDSCH_PROC_RA GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = pdsch_procedures_ra ID = VCD_FUNCTION_PHY_UE_CONFIG_SIB2 DESC = VCD function PHY_UE_CONFIG_SIB2 GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_ue_config_sib2 ID = VCD_FUNCTION_PHY_CONFIG_SIB1_ENB DESC = VCD function PHY_CONFIG_SIB1_ENB GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_phy_config_sib1_eNB ID = VCD_FUNCTION_PHY_CONFIG_SIB2_ENB DESC = VCD function PHY_CONFIG_SIB2_ENB GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_phy_config_sib2_eNB ID = VCD_FUNCTION_PHY_CONFIG_DEDICATED_ENB DESC = VCD function PHY_CONFIG_DEDICATED_ENB GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_phy_config_dedicated_eNB ID = VCD_FUNCTION_PHY_UE_COMPUTE_PRACH DESC = VCD function PHY_UE_COMPUTE_PRACH GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_ue_compute_prach ID = VCD_FUNCTION_PHY_ENB_ULSCH_MSG3 DESC = VCD function PHY_ENB_ULSCH_MSG3 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_enb_ulsch_msg3 ID = VCD_FUNCTION_PHY_ENB_ULSCH_DECODING0 DESC = VCD function PHY_ENB_ULSCH_DECODING0 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_enb_ulsch_decoding0 ID = VCD_FUNCTION_PHY_ENB_ULSCH_DECODING1 DESC = VCD function PHY_ENB_ULSCH_DECODING1 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_enb_ulsch_decoding1 ID = VCD_FUNCTION_PHY_ENB_ULSCH_DECODING2 DESC = VCD function PHY_ENB_ULSCH_DECODING2 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_enb_ulsch_decoding2 ID = VCD_FUNCTION_PHY_ENB_ULSCH_DECODING3 DESC = VCD function PHY_ENB_ULSCH_DECODING3 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_enb_ulsch_decoding3 ID = VCD_FUNCTION_PHY_ENB_ULSCH_DECODING4 DESC = VCD function PHY_ENB_ULSCH_DECODING4 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_enb_ulsch_decoding4 ID = VCD_FUNCTION_PHY_ENB_ULSCH_DECODING5 DESC = VCD function PHY_ENB_ULSCH_DECODING5 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_enb_ulsch_decoding5 ID = VCD_FUNCTION_PHY_ENB_ULSCH_DECODING6 DESC = VCD function PHY_ENB_ULSCH_DECODING6 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_enb_ulsch_decoding6 ID = VCD_FUNCTION_PHY_ENB_ULSCH_DECODING7 DESC = VCD function PHY_ENB_ULSCH_DECODING7 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_enb_ulsch_decoding7 ID = VCD_FUNCTION_PHY_ENB_SFGEN DESC = VCD function PHY_ENB_SFGEN GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_enb_sfgen ID = VCD_FUNCTION_PHY_ENB_PRACH_RX DESC = VCD function PHY_ENB_PRACH_RX GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_enb_prach_rx ID = VCD_FUNCTION_PHY_RU_PRACH_RX DESC = VCD function PHY_RU_PRACH_RX GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_ru_prach_rx ID = VCD_FUNCTION_PHY_ENB_PDCCH_TX DESC = VCD function PHY_ENB_PDCCH_TX GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_enb_pdcch_tx ID = VCD_FUNCTION_PHY_ENB_RS_TX DESC = VCD function PHY_ENB_RS_TX GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_enb_rs_tx ID = VCD_FUNCTION_UE_GENERATE_PRACH DESC = VCD function UE_GENERATE_PRACH GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_ue_generate_prach ID = VCD_FUNCTION_UE_ULSCH_MODULATION DESC = VCD function UE_ULSCH_MODULATION GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_ue_ulsch_modulation ID = VCD_FUNCTION_UE_ULSCH_ENCODING DESC = VCD function UE_ULSCH_ENCODING GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_ue_ulsch_encoding ID = VCD_FUNCTION_UE_ULSCH_ENCODING_FILL_CQI DESC = VCD function UE_ULSCH_ENCODING_FILL_CQI GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_ue_ulsch_encoding_fill_cqi ID = VCD_FUNCTION_UE_ULSCH_SCRAMBLING DESC = VCD function UE_ULSCH_SCRAMBLING GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_ue_ulsch_scrambling ID = VCD_FUNCTION_ENB_DLSCH_MODULATION DESC = VCD function ENB_DLSCH_MODULATION GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_eNB_dlsch_modulation ID = VCD_FUNCTION_ENB_DLSCH_ENCODING DESC = VCD function ENB_DLSCH_ENCODING GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_eNB_dlsch_encoding ID = VCD_FUNCTION_ENB_DLSCH_ENCODING_W DESC = VCD function ENB_DLSCH_ENCODING_W GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_eNB_dlsch_encoding_w ID = VCD_FUNCTION_ENB_DLSCH_SCRAMBLING DESC = VCD function ENB_DLSCH_SCRAMBLING GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_eNB_dlsch_scrambling ID = VCD_FUNCTION_ENB_BEAM_PRECODING DESC = VCD function ENB_BEAM_PRECODING GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_eNB_beam_precoding ID = VCD_FUNCTION_ENB_OFDM_MODULATION DESC = VCD function ENB_OFDM_MODULATION GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_eNB_ofdm_mod_l ID = VCD_FUNCTION_MACPHY_INIT DESC = VCD function MACPHY_INIT GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_macphy_init ID = VCD_FUNCTION_MACPHY_EXIT DESC = VCD function MACPHY_EXIT GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_macphy_exit ID = VCD_FUNCTION_ENB_DLSCH_ULSCH_SCHEDULER DESC = VCD function ENB_DLSCH_ULSCH_SCHEDULER GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_eNB_dlsch_ulsch_scheduler ID = VCD_FUNCTION_FILL_RAR DESC = VCD function FILL_RAR GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_fill_rar ID = VCD_FUNCTION_TERMINATE_RA_PROC DESC = VCD function TERMINATE_RA_PROC GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_terminate_ra_proc ID = VCD_FUNCTION_INITIATE_RA_PROC DESC = VCD function INITIATE_RA_PROC GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_initiate_ra_proc ID = VCD_FUNCTION_CANCEL_RA_PROC DESC = VCD function CANCEL_RA_PROC GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_cancel_ra_proc ID = VCD_FUNCTION_GET_DCI_SDU DESC = VCD function GET_DCI_SDU GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_get_dci_sdu ID = VCD_FUNCTION_GET_DLSCH_SDU DESC = VCD function GET_DLSCH_SDU GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_get_dlsch_sdu ID = VCD_FUNCTION_RX_SDU DESC = VCD function RX_SDU GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_rx_sdu ID = VCD_FUNCTION_MRBCH_PHY_SYNC_FAILURE DESC = VCD function MRBCH_PHY_SYNC_FAILURE GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_mrbch_phy_sync_failure ID = VCD_FUNCTION_SR_INDICATION DESC = VCD function SR_INDICATION GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_SR_indication ID = VCD_FUNCTION_DLSCH_PREPROCESSOR DESC = VCD function DLSCH_PREPROCESSOR GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = mac_dlsch_preprocessor ID = VCD_FUNCTION_SCHEDULE_DLSCH DESC = VCD function SCHEDULE_DLSCH GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = mac_schedule_dlsch ID = VCD_FUNCTION_FILL_DLSCH_DCI DESC = VCD function FILL_DLSCH_DCI GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = mac_fill_dlsch_dci ID = VCD_FUNCTION_OUT_OF_SYNC_IND DESC = VCD function OUT_OF_SYNC_IND GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_out_of_sync_ind ID = VCD_FUNCTION_UE_DECODE_SI DESC = VCD function UE_DECODE_SI GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_ue_decode_si ID = VCD_FUNCTION_UE_DECODE_PCCH DESC = VCD function UE_DECODE_PCCH GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_ue_decode_pcch ID = VCD_FUNCTION_UE_DECODE_CCCH DESC = VCD function UE_DECODE_CCCH GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_ue_decode_ccch ID = VCD_FUNCTION_UE_DECODE_BCCH DESC = VCD function UE_DECODE_BCCH GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_ue_decode_bcch ID = VCD_FUNCTION_UE_SEND_SDU DESC = VCD function UE_SEND_SDU GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_ue_send_sdu ID = VCD_FUNCTION_UE_GET_SDU DESC = VCD function UE_GET_SDU GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_ue_get_sdu ID = VCD_FUNCTION_UE_GET_RACH DESC = VCD function UE_GET_RACH GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_ue_get_rach ID = VCD_FUNCTION_UE_PROCESS_RAR DESC = VCD function UE_PROCESS_RAR GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_ue_process_rar ID = VCD_FUNCTION_UE_SCHEDULER DESC = VCD function UE_SCHEDULER GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_ue_scheduler ID = VCD_FUNCTION_UE_GET_SR DESC = VCD function UE_GET_SR GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_ue_get_sr ID = VCD_FUNCTION_UE_SEND_MCH_SDU DESC = VCD function UE_SEND_MCH_SDU GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = ue_send_mch_sdu ID = VCD_FUNCTION_RLC_DATA_REQ DESC = VCD function RLC_DATA_REQ GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = rlc_data_req #ID = VCD_FUNCTION_RLC_DATA_IND # DESC = VCD function RLC_DATA_IND # GROUP = ALL:VCD:ENB:VCD_FUNCTION # FORMAT = int,value +# VCD_NAME = rlc_data_ind ID = VCD_FUNCTION_MAC_RLC_STATUS_IND DESC = VCD function MAC_RLC_STATUS_IND GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = mac_rlc_status_ind ID = VCD_FUNCTION_MAC_RLC_DATA_REQ DESC = VCD function MAC_RLC_DATA_REQ GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = mac_rlc_data_req ID = VCD_FUNCTION_MAC_RLC_DATA_IND DESC = VCD function MAC_RLC_DATA_IND GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = mac_rlc_data_ind ID = VCD_FUNCTION_RLC_UM_TRY_REASSEMBLY DESC = VCD function RLC_UM_TRY_REASSEMBLY GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = rlc_um_try_reassembly ID = VCD_FUNCTION_RLC_UM_CHECK_TIMER_DAR_TIME_OUT DESC = VCD function RLC_UM_CHECK_TIMER_DAR_TIME_OUT GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = rlc_um_check_timer_dar_time_out ID = VCD_FUNCTION_RLC_UM_RECEIVE_PROCESS_DAR DESC = VCD function RLC_UM_RECEIVE_PROCESS_DAR GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = rlc_um_receive_process_dar ID = VCD_FUNCTION_PDCP_RUN DESC = VCD function PDCP_RUN GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = pdcp_run ID = VCD_FUNCTION_PDCP_DATA_REQ DESC = VCD function PDCP_DATA_REQ GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = pdcp_data_req ID = VCD_FUNCTION_PDCP_DATA_IND DESC = VCD function PDCP_DATA_IND GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = pdcp_data_ind ID = VCD_FUNCTION_PDCP_APPLY_SECURITY DESC = VCD function PDCP_APPLY_SECURITY GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = pdcp_apply_security ID = VCD_FUNCTION_PDCP_VALIDATE_SECURITY DESC = VCD function PDCP_VALIDATE_SECURITY GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = pdcp_validate_security ID = VCD_FUNCTION_PDCP_FIFO_READ DESC = VCD function PDCP_FIFO_READ GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = pdcp_fifo_read ID = VCD_FUNCTION_PDCP_FIFO_READ_BUFFER DESC = VCD function PDCP_FIFO_READ_BUFFER GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = pdcp_fifo_read_buffer ID = VCD_FUNCTION_PDCP_FIFO_FLUSH DESC = VCD function PDCP_FIFO_FLUSH GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = pdcp_fifo_flush ID = VCD_FUNCTION_PDCP_FIFO_FLUSH_BUFFER DESC = VCD function PDCP_FIFO_FLUSH_BUFFER GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = pdcp_fifo_flush_buffer ID = VCD_FUNCTION_RRC_RX_TX DESC = VCD function RRC_RX_TX GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = rrc_rx_tx ID = VCD_FUNCTION_RRC_MAC_CONFIG DESC = VCD function RRC_MAC_CONFIG GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = rrc_mac_config_req ID = VCD_FUNCTION_RRC_UE_DECODE_SIB1 DESC = VCD function RRC_UE_DECODE_SIB1 GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = rrc_ue_decode_sib1 ID = VCD_FUNCTION_RRC_UE_DECODE_SI DESC = VCD function RRC_UE_DECODE_SI GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = rrc_ue_decode_si ID = VCD_FUNCTION_GTPV1U_ENB_TASK DESC = VCD function GTPV1U_ENB_TASK GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = gtpv1u_enb_task ID = VCD_FUNCTION_GTPV1U_PROCESS_UDP_REQ DESC = VCD function GTPV1U_PROCESS_UDP_REQ GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = gtpv1u_process_udp_req ID = VCD_FUNCTION_GTPV1U_PROCESS_TUNNEL_DATA_REQ DESC = VCD function GTPV1U_PROCESS_TUNNEL_DATA_REQ GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = gtpv1u_process_tunnel_data_req ID = VCD_FUNCTION_UDP_ENB_TASK DESC = VCD function UDP_ENB_TASK GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = udp_enb_task ID = VCD_FUNCTION_EMU_TRANSPORT DESC = VCD function EMU_TRANSPORT GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = emu_transport ID = VCD_FUNCTION_LOG_RECORD DESC = VCD function LOG_RECORD GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = log_record ID = VCD_FUNCTION_ITTI_ENQUEUE_MESSAGE DESC = VCD function ITTI_ENQUEUE_MESSAGE GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = itti_enqueue_message ID = VCD_FUNCTION_ITTI_DUMP_ENQUEUE_MESSAGE DESC = VCD function ITTI_DUMP_ENQUEUE_MESSAGE GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = itti_dump_enqueue_message ID = VCD_FUNCTION_ITTI_DUMP_ENQUEUE_MESSAGE_MALLOC DESC = VCD function ITTI_DUMP_ENQUEUE_MESSAGE_MALLOC GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = itti_dump_enqueue_message_malloc ID = VCD_FUNCTION_ITTI_RELAY_THREAD DESC = VCD function ITTI_RELAY_THREAD GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = itti_relay_thread ID = VCD_FUNCTION_TEST DESC = VCD function TEST GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = test ID = VCD_FUNCTION_SEND_IF4 DESC = VCD function SEND_IF4 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = send_if4 ID = VCD_FUNCTION_RECV_IF4 DESC = VCD function RECV_IF4 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = recv_if4 ID = VCD_FUNCTION_SEND_IF5 DESC = VCD function SEND_IF5 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = send_if5 ID = VCD_FUNCTION_RECV_IF5 DESC = VCD function RECV_IF5 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = recv_if5 ID = VCD_FUNCTION_TRX_COMPR_IF DESC = VCD function TRX_COMPR_IF GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = compress_if ID = VCD_FUNCTION_TRX_DECOMPR_IF DESC = VCD function TRX_DECOMPR_IF GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = decompress_if ID = VCD_FUNCTION_NFAPI DESC = VCD function NFAPI GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = nfapi_subframe ID = VCD_FUNCTION_GENERATE_PCFICH DESC = VCD function GENERATE_PCFICH GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = generate_pcfich ID = VCD_FUNCTION_GENERATE_DCI0 DESC = VCD function GENERATE_DCI0 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = generate_dci0 ID = VCD_FUNCTION_GENERATE_DLSCH DESC = VCD function GENERATE_DLSCH GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = generate_dlsch ID = VCD_FUNCTION_GENERATE_PHICH DESC = VCD function GENERATE_PHICH GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = generate_phich ID = VCD_FUNCTION_PDCCH_SCRAMBLING DESC = VCD function PDCCH_SCRAMBLING GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = pdcch_scrambling ID = VCD_FUNCTION_PDCCH_MODULATION DESC = VCD function PDCCH_MODULATION GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = pdcch_modulation ID = VCD_FUNCTION_PDCCH_INTERLEAVING DESC = VCD function PDCCH_INTERLEAVING GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = pdcch_interleaving ID = VCD_FUNCTION_PDCCH_TX DESC = VCD function PDCCH_TX GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = pdcch_tx diff --git a/common/utils/T/check_vcd.c b/common/utils/T/check_vcd.c new file mode 100644 index 0000000000000000000000000000000000000000..1460d7e20a7dd861f39e4a45150e91377e0ed0da --- /dev/null +++ b/common/utils/T/check_vcd.c @@ -0,0 +1,249 @@ +/* + * To disable the checks done by this program, see below at the beginning + * of the function 'main'. + */ + +#include <stdio.h> +#include <string.h> +#include <stdarg.h> + +#include "database.h" + +#define T_TRACER 1 +#include "T.h" + +/* VCD specific defines and includes + * If the codebase changes, it may need to be updated + */ +#define ENB_MODE +#define ENABLE_USE_CPU_EXECUTION_TIME +#include "../LOG/vcd_signal_dumper.c" + +void err(char *fmt, ...) __attribute__ ((format (printf, 1, 2))); +void err(char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + + printf("\x1b[31m"); + printf("error: "); + vprintf(fmt, ap); + printf("\n" +"\x1b[33m\n" +"You probably added a VCD trace (variable or function) but you did not\n" +"update T_messages.txt and/or T_defs.h in common/utils/T/\n" +"\n" +"Be sure to add the new trace to T_messages.txt, at the right place in the\n" +"file. Do not forget to define VCD_NAME with an identical value as found\n" +"in the array eurecomVariablesNames or eurecomFunctionsNames.\n" +"\n" +"Be sure to update VCD_NUM_FUNCTIONS, VCD_NUM_VARIABLES, VCD_FIRST_FUNCTION\n" +"and VCD_FIRST_VARIABLE in T_defs.h\n" +"\n" +"The same procedure has to be followed when you delete a VCD trace.\n" +"Delete it in T_messages.txt as well and update T_defs.h\n" +"\n" +"You can disable those VCD checks at development time.\n" +"To disable the VCD checks see the file common/utils/T/check_vcd.c\n" +"Do not push any modification that disables the VCD checks to the\n" +"main repository.\n"); + + printf("\x1b[m\n"); + + va_end(ap); + + exit(1); +} + +int main(void) +{ + /* to disable the checks done by this program, uncomment the following + * line, ie. remove the leading '//' + */ + //return 0; + + void *database = parse_database("T_messages.txt"); + int number_of_events; + int first_var = -1; + int last_var; + int first_fun = -1; + int last_fun; + char *prefix; + int prefix_len; + char *name; + char *vcd_name; + int i; + FILE *in; + char *l = NULL; + size_t lsize; + + if (database == NULL) err("something wrong with T_messages.txt"); + + /* check the value of VCD_NUM_FUNCTIONS */ + if (VCD_NUM_FUNCTIONS != sizeof(eurecomFunctionsNames) / sizeof(char *)) + err("VCD_NUM_FUNCTIONS (%d) must be equal to %zd", + VCD_NUM_FUNCTIONS, + sizeof(eurecomFunctionsNames) / sizeof(char *)); + + /* check the value of VCD_NUM_VARIABLES */ + if (VCD_NUM_VARIABLES != sizeof(eurecomVariablesNames) / sizeof(char *)) + err("VCD_NUM_VARIABLES (%d) must be equal to %zd", + VCD_NUM_VARIABLES, + sizeof(eurecomVariablesNames) / sizeof(char *)); + + number_of_events = number_of_ids(database); + if (number_of_events == 0) err("no event defined in T_messages.txt"); + + /* T_messages.txt ends with VCD VARIABLES followed by VCD FUNCTIONS + * followed by nothing. + * Let's check. + */ + + /* check VCD VARIABLES traces in T_messages.txt */ + prefix = "VCD_VARIABLE_"; + prefix_len = strlen(prefix); + + for (i = 0; i < number_of_events; i++) { + name = event_name_from_id(database, i); + if (strncmp(name, prefix, prefix_len)) continue; + first_var = i; + break; + } + if (first_var == -1) + err("no VCD_VARIABLE_ found in T_messages.txt"); + for (; i < number_of_events; i++) { + name = event_name_from_id(database, i); + if (strncmp(name, prefix, prefix_len)) break; + } + last_var = i-1; + + /* check VCD FUNCTIONS traces in T_messages.txt */ + if (i == number_of_events) + err("no VCD_FUNCTION_ found in T_messages.txt"); + + prefix = "VCD_FUNCTION_"; + prefix_len = strlen(prefix); + + first_fun = i; + + name = event_name_from_id(database, i); + if (strncmp(name, prefix, prefix_len)) + err("last VCD_VARIABLE_ not followed by a VCD_FUNCTION_ in T_messages.txt"); + + for (; i < number_of_events; i++) { + name = event_name_from_id(database, i); + if (strncmp(name, prefix, prefix_len)) break; + } + + if (i != number_of_events) + err("T_messages.txt does not end with a VCD_FUNCTION_ trace"); + + last_fun = i-1; + + if (first_var != (unsigned)VCD_FIRST_VARIABLE) + err("VCD_FIRST_VARIABLE is not correct in T_defs.h"); + if (first_fun != (unsigned)VCD_FIRST_FUNCTION) + err("VCD_FIRST_FUNCTION is not correct in T_defs.h"); + if (last_var-first_var+1 != VCD_NUM_VARIABLES) + err("VCD_NUM_VARIABLES is not correct in T_defs.h"); + if (last_fun-first_fun+1 != VCD_NUM_FUNCTIONS) + err("VCD_NUM_FUNCTIONS is not correct in T_defs.h"); + + /* check that VCD_NAME is identical to + * eurecomVariablesNames[x]/eurecomFunctionsNames[x] + */ + prefix = "VCD_VARIABLE_"; + prefix_len = strlen(prefix); + + for (i = 0; i < number_of_events; i++) { + name = event_name_from_id(database, i); + if (strncmp(name, prefix, prefix_len)) continue; + vcd_name = event_vcd_name_from_id(database, i); + if (vcd_name == NULL) + err("%s has no VCD_NAME in T_messages.txt", name); + if (strcmp(vcd_name, eurecomVariablesNames[i - first_var])) + err("%s has a wrong VCD_NAME in T_messages.txt", name); + } + + prefix = "VCD_FUNCTION_"; + prefix_len = strlen(prefix); + + for (i = 0; i < number_of_events; i++) { + name = event_name_from_id(database, i); + if (strncmp(name, prefix, prefix_len)) continue; + vcd_name = event_vcd_name_from_id(database, i); + if (vcd_name == NULL) + err("%s has no VCD_NAME in T_messages.txt", name); + if (strcmp(vcd_name, eurecomFunctionsNames[i - first_fun])) + err("%s has a wrong VCD_NAME in T_messages.txt", name); + } + + /* check IDs - these checks are difficult because we parse + * common/utils/LOG/vcd_signal_dumper.h which is expected to + * be formatted as is: + * - define vcd_signal_dump_variables then vcd_signal_dump_functions + * - one VCD_XXXX per line starting with two spaces + * followed by ',' or '=' with no space in between + * - no #ifdef / #if is taken into account + * - we require VCD_SIGNAL_DUMPER_VARIABLES_END and + * VCD_SIGNAL_DUMPER_FUNCTIONS_END at the end of each array, + * each on a line of its own with two spaces before and nothing after. + * + * If these checks fail, consider formatting + * common/utils/LOG/vcd_signal_dumper.h as expected here, if + * it makes sense of course. Otherwise, change the code below. + * + * In common/utils/LOG/vcd_signal_dumper.h a valid name is + * either VCD_SIGNAL_DUMPER_VARIABLES_ABC or + * VCD_SIGNAL_DUMPER_FUNCTIONS_XYZ + * and in T_messages.txt the corresponding name has to be + * VCD_VARIABLE_ABC or VCD_FUNCTION_XYZ + */ + i = first_var; + in = fopen("../LOG/vcd_signal_dumper.h", "r"); + if (in == NULL) err("could not open ../LOG/vcd_signal_dumper.h"); + while (1) { + char *x = " VCD_SIGNAL_DUMPER_VARIABLES_"; + ssize_t r; + free(l); + l = NULL; + lsize = 0; + r = getline(&l, &lsize, in); + if (r == -1) break; + if (!strcmp(l, " VCD_SIGNAL_DUMPER_VARIABLES_END\n")) break; + /* remove ',' or '=' if found */ + { char *s=l; while (*s) { if (*s==','||*s=='=') { *s=0; break; } s++; } } + if (strncmp(l, x, strlen(x))) continue; + if (!(i >= first_var && i <= last_var)) + err("T_messages.txt is not correct with respect to VCD VARIABLES"); + name = event_name_from_id(database, i); + if (strcmp(l+strlen(x), name+strlen("VCD_VARIABLE_"))) + err("%s is not correct in T_messages.txt", name); + i++; + } + if (i != last_var + 1) err("VCD VARIABLES wrong in T_messages.txt"); + while (1) { + char *x = " VCD_SIGNAL_DUMPER_FUNCTIONS_"; + ssize_t r; + free(l); + l = NULL; + lsize = 0; + r = getline(&l, &lsize, in); + if (r == -1) break; + if (!strcmp(l, " VCD_SIGNAL_DUMPER_FUNCTIONS_END\n")) break; + /* remove ',' or '=' if found */ + { char *s=l; while (*s) { if (*s==','||*s=='=') { *s=0; break; } s++; } } + if (strncmp(l, x, strlen(x))) continue; + if (!(i >= first_fun && i <= last_fun)) + err("T_messages.txt is not correct with respect to VCD FUNCTIONS"); + name = event_name_from_id(database, i); + if (strcmp(l+strlen(x), name+strlen("VCD_FUNCTION_"))) + err("%s is not correct in T_messages.txt", name); + i++; + } + fclose(in); + if (i != last_fun + 1) err("VCD FUNCTIONS wrong in T_messages.txt"); + + return 0; +} diff --git a/common/utils/T/genids.c b/common/utils/T/genids.c index 734c506368ac348ba9db9ae2eae8048fcec929d6..8e5adbf587081322fc2d6047c7b4d246841bdc94 100644 --- a/common/utils/T/genids.c +++ b/common/utils/T/genids.c @@ -14,21 +14,21 @@ int cmp(const void *p1, const void *p2) } /* return 1 if s was not already known, 0 if it was */ -int new_unique_id(char *s) +int new_unique_id(char *s, char *input_file) { if (unique_ids_size) if (bsearch(&s, unique_ids, unique_ids_size, sizeof(char *), cmp) != NULL) { - printf("FATAL: ID %s is not unique\n", s); + printf("error: ID %s is not unique in %s\n", s, input_file); return 0; } if (unique_ids_size == unique_ids_maxsize) { unique_ids_maxsize += 256; unique_ids = realloc(unique_ids, unique_ids_maxsize * sizeof(char *)); - if (unique_ids == NULL) { printf("out of memory\n"); abort(); } + if (unique_ids == NULL) { printf("erorr: out of memory\n"); abort(); } } unique_ids[unique_ids_size] = strdup(s); if (unique_ids[unique_ids_size] == NULL) - { printf("out of memory\n"); abort(); } + { printf("erorr: out of memory\n"); abort(); } unique_ids_size++; qsort(unique_ids, unique_ids_size, sizeof(char *), cmp); return 1; @@ -43,7 +43,8 @@ void putname(int c) if (bufname_size == bufname_maxsize) { bufname_maxsize += 256; bufname = realloc(bufname, bufname_maxsize); - if (bufname == NULL) { printf("memory allocation error\n"); exit(1); } + if (bufname == NULL) + { printf("erorr: memory allocation error\n"); exit(1); } } bufname[bufname_size] = c; bufname_size++; @@ -58,7 +59,8 @@ void putvalue(int c) if (bufvalue_size == bufvalue_maxsize) { bufvalue_maxsize += 256; bufvalue = realloc(bufvalue, bufvalue_maxsize); - if (bufvalue == NULL) { printf("memory allocation error\n"); exit(1); } + if (bufvalue == NULL) + { printf("error: memory allocation error\n"); exit(1); } } bufvalue[bufvalue_size] = c; bufvalue_size++; @@ -119,7 +121,7 @@ int main(int n, char **v) char *in_name; char *out_name; - if (n != 3) { printf("gimme <source> <dest>\n"); exit(1); } + if (n != 3) { printf("error: gimme <source> <dest>\n"); exit(1); } n = 0; @@ -134,14 +136,13 @@ int main(int n, char **v) while (1) { get_line(in, &name, &value); if (name == NULL) break; - printf("name '%s' value '%s'\n", name, value); if (isspace(value[strlen(value)-1])) { - printf("bad value '%s' (no space at the end please!)\n", value); + printf("error: bad value '%s' (no space at the end please!)\n", value); unlink(out_name); exit(1); } if (!strcmp(name, "ID")) { - if (!new_unique_id(value)) { unlink(out_name); exit(1); } + if (!new_unique_id(value, in_name)) { unlink(out_name); exit(1); } fprintf(out, "#define T_%s T_ID(%d)\n", value, n); n++; } diff --git a/common/utils/T/local_tracer.c b/common/utils/T/local_tracer.c index c331daa4a9f0410d918ea317466b738479328d0a..f8e92881a96e79a000e57fcad814e8440719a895 100644 --- a/common/utils/T/local_tracer.c +++ b/common/utils/T/local_tracer.c @@ -337,54 +337,34 @@ static void forward(void *_forwarder, char *buf, int size) static void wait_message(void) { - while (T_local_cache[T_busylist_head].busy == 0) usleep(1000); -} - -static void init_shm(char *shm_file) -{ - int i; - int s = shm_open(shm_file, O_RDWR | O_CREAT /*| O_SYNC*/, 0666); - if (s == -1) { perror(shm_file); abort(); } - if (ftruncate(s, T_CACHE_SIZE * sizeof(T_cache_t))) - { perror(shm_file); abort(); } - T_local_cache = mmap(NULL, T_CACHE_SIZE * sizeof(T_cache_t), - PROT_READ | PROT_WRITE, MAP_SHARED, s, 0); - if (T_local_cache == MAP_FAILED) - { perror(shm_file); abort(); } - close(s); - - /* let's garbage the memory to catch some potential problems - * (think multiprocessor sync issues, barriers, etc.) - */ - memset(T_local_cache, 0x55, T_CACHE_SIZE * sizeof(T_cache_t)); - for (i = 0; i < T_CACHE_SIZE; i++) T_local_cache[i].busy = 0; + while ((T_local_cache[T_busylist_head].busy & 0x02) == 0) usleep(1000); } void T_local_tracer_main(int remote_port, int wait_for_tracer, - int local_socket, char *shm_file) + int local_socket, void *shm_array) { int s; int port = remote_port; int dont_wait = wait_for_tracer ? 0 : 1; void *f; - printf("local tracer starting\n"); + /* write on a socket fails if the other end is closed and we get SIGPIPE */ - if (signal(SIGPIPE, SIG_IGN) == SIG_ERR){ + if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) { printf("local tracer received SIGPIPE\n"); abort(); - } + } + + T_local_cache = shm_array; - init_shm(shm_file); s = local_socket; - printf("local tracer starting step 2\n"); + if (dont_wait) { char t = 2; - printf("local tracer in no wait mode \n"); if (write(s, &t, 1) != 1) abort(); } - printf("local tracer starting step 3\n"); + f = forwarder(port, s); - printf("local tracer main loop.... \n"); + /* read messages */ while (1) { wait_message(); diff --git a/common/utils/T/tracer/Makefile b/common/utils/T/tracer/Makefile index 1c4a77587c3916c9140a9ef71465b08e8a9313aa..3da4aa13a17528cc1396f5eedc2e40eee91c2cb1 100644 --- a/common/utils/T/tracer/Makefile +++ b/common/utils/T/tracer/Makefile @@ -7,7 +7,7 @@ LIBS=-lm XLIBS=-lX11 -lpng -lXft all: record replay extract_config textlog enb ue vcd macpdu2wireshark \ - extract_input_subframe extract_output_subframe to_vcd extract + extract_input_subframe extract_output_subframe to_vcd extract multi record: utils.o record.o database.o config.o $(CC) $(CFLAGS) -o record $^ $(LIBS) @@ -57,19 +57,22 @@ macpdu2wireshark: macpdu2wireshark.o database.o utils.o handler.o event.o \ config.o $(CC) $(CFLAGS) -o $@ $^ $(LIBS) +multi: multi.o utils.o database.o config.o + $(CC) $(CFLAGS) -o multi $^ $(LIBS) + .PHONY: all gui/gui.a view/view.a logger/logger.a filter/filter.a gui/gui.a: - cd gui && make + cd gui && $(MAKE) view/view.a: - cd view && make + cd view && $(MAKE) logger/logger.a: - cd logger && make + cd logger && $(MAKE) filter/filter.a: - cd filter && make + cd filter && $(MAKE) %.o: %.c $(CC) $(CFLAGS) -c -o $@ $< @@ -77,9 +80,9 @@ filter/filter.a: clean: rm -f *.o core tracer_remote textlog enb ue vcd record replay rm -f extract_config macpdu2wireshark extract_input_subframe - rm -f extract_output_subframe to_vcd extract - cd gui && make clean - cd view && make clean - cd logger && make clean - cd filter && make clean - cd hacks && make clean + rm -f extract_output_subframe to_vcd extract multi + cd gui && $(MAKE) clean + cd view && $(MAKE) clean + cd logger && $(MAKE) clean + cd filter && $(MAKE) clean + cd hacks && $(MAKE) clean diff --git a/common/utils/T/tracer/config.c b/common/utils/T/tracer/config.c index f88966ed79a111b2ab2d09d7110ae9da0c3781ea..723902ec9c8bbe518ca2eaad902c1903771e87f4 100644 --- a/common/utils/T/tracer/config.c +++ b/common/utils/T/tracer/config.c @@ -60,3 +60,9 @@ void verify_config(void) abort(); } } + +void get_local_config(char **txt, int *len) +{ + *txt = local; + *len = local_size; +} diff --git a/common/utils/T/tracer/config.h b/common/utils/T/tracer/config.h index f90869eb6621f89c5be80fc012e4edc7102a4652..07290c71a35c5605596ff3770a34db40ce5dbc0a 100644 --- a/common/utils/T/tracer/config.h +++ b/common/utils/T/tracer/config.h @@ -5,5 +5,6 @@ void clear_remote_config(void); void append_received_config_chunk(char *buf, int length); void load_config_file(char *filename); void verify_config(void); +void get_local_config(char **txt, int *len); #endif /* _CONFIG_H_ */ diff --git a/common/utils/T/tracer/database.c b/common/utils/T/tracer/database.c index f0908948e23cb81ac2809faa14b8856f53492075..543ab666640309719c2599ad00e7b4ff6b66caea 100644 --- a/common/utils/T/tracer/database.c +++ b/common/utils/T/tracer/database.c @@ -13,6 +13,7 @@ typedef struct { char **arg_type; char **arg_name; int asize; + char *vcd_name; int id; } id; @@ -138,6 +139,7 @@ id *add_id(database *r, char *idname, int i) r->i[r->isize].arg_type = NULL; r->i[r->isize].arg_name = NULL; r->i[r->isize].asize = 0; + r->i[r->isize].vcd_name = NULL; r->i[r->isize].id = i; r->isize++; qsort(r->i, r->isize, sizeof(id), id_cmp); @@ -224,6 +226,12 @@ void add_desc(id *i, char *desc) i->desc = strdup(desc); if (i->desc == NULL) abort(); } +void add_vcd_name(id *i, char *vcd_name) +{ + if (i == NULL) {printf("ERROR: VCD_NAME line before ID line\n");exit(1);} + i->vcd_name = strdup(vcd_name); if (i->vcd_name == NULL) abort(); +} + char *format_get_next_token(char **cur) { char *start; @@ -320,6 +328,7 @@ void *parse_database(char *filename) if (!strcmp(name, "GROUP")) add_groups(r, last_id, value); if (!strcmp(name, "DESC")) add_desc(last_id, value); if (!strcmp(name, "FORMAT")) add_format(last_id, value); + if (!strcmp(name, "VCD_NAME")) add_vcd_name(last_id, value); } fclose(in); @@ -424,6 +433,12 @@ char *event_name_from_id(void *_database, int id) return d->i[d->id_to_pos[id]].name; } +char *event_vcd_name_from_id(void *_database, int id) +{ + database *d = _database; + return d->i[d->id_to_pos[id]].vcd_name; +} + int event_id_from_name(void *_database, char *name) { database *d = _database; diff --git a/common/utils/T/tracer/database.h b/common/utils/T/tracer/database.h index c5cab05d9f7be0da0cc8d50fcf3fda243aec556a..9fdbaed7c685fb77979167f243fdd5732597566b 100644 --- a/common/utils/T/tracer/database.h +++ b/common/utils/T/tracer/database.h @@ -8,6 +8,7 @@ void list_ids(void *database); void list_groups(void *database); void on_off(void *d, char *item, int *a, int onoff); char *event_name_from_id(void *database, int id); +char *event_vcd_name_from_id(void *_database, int id); int event_id_from_name(void *database, char *name); int number_of_ids(void *database); int database_get_ids(void *database, char ***ids); diff --git a/common/utils/T/tracer/enb.c b/common/utils/T/tracer/enb.c index a30366faf1eb8e645d5efba1cf664985cc60c255..ea499a68f831b5e7d7bbecb144815e2d9ddc81d6 100644 --- a/common/utils/T/tracer/enb.c +++ b/common/utils/T/tracer/enb.c @@ -878,6 +878,7 @@ int main(int n, char **v) restart: clear_remote_config(); + if (enb_data.socket != -1) close(enb_data.socket); enb_data.socket = connect_to(ip, port); /* send the first message - activate selected traces */ diff --git a/common/utils/T/tracer/multi.c b/common/utils/T/tracer/multi.c new file mode 100644 index 0000000000000000000000000000000000000000..6a9de838c674b1473e54d99a147d91c9d431311e --- /dev/null +++ b/common/utils/T/tracer/multi.c @@ -0,0 +1,385 @@ +#include <stdio.h> +#include <stdlib.h> +#include <signal.h> +#include <string.h> +#include <poll.h> +#include <sys/socket.h> +#include <unistd.h> +#include "database.h" +#include "utils.h" +#include "../T.h" +#include "config.h" + +#define DEFAULT_LOCAL_PORT 2022 + +typedef struct { + int id; /* increases at each new tracer's connection */ + int s; /* socket */ + int *is_on; /* local vision of is_on for this tracer */ + int poll_id; /* -1: invalid, otherwise index in fds array */ +} ti_t; + +typedef struct { + ti_t *ti; /* data for tracers */ + int ti_size; + int ti_maxsize; +} multi_t; + +void set_is_on(int *is_on, int pos, int val) +{ + if (val) is_on[pos]++; else is_on[pos]--; + /* TODO: remove check? */ + if (is_on[pos] < 0) { printf("%s:%d:nonono\n",__FILE__,__LINE__); abort(); } +} + +int send_messages_txt(int s, char *T_messages_txt, int T_messages_txt_len) +{ + char buf[T_BUFFER_MAX]; + char *T_LOCAL_buf = buf; + int32_t T_LOCAL_size; + unsigned char *src; + int src_len; + + /* trace T_message.txt + * Send several messages -1 with content followed by message -2. + */ + src = (unsigned char *)T_messages_txt; + src_len = T_messages_txt_len; + while (src_len) { + int send_size = src_len; + if (send_size > T_PAYLOAD_MAXSIZE - sizeof(int)) + send_size = T_PAYLOAD_MAXSIZE - sizeof(int); + /* TODO: be careful, we use internal T stuff, to rewrite? */ + T_LOCAL_size = 0; + T_HEADER(T_ID(-1)); + T_PUT_buffer(1, ((T_buffer){addr:(src), length:(send_size)})); + if (socket_send(s, &T_LOCAL_size, 4) == -1) return -1; + if (socket_send(s, buf, T_LOCAL_size) == -1) return -1; + src += send_size; + src_len -= send_size; + } + T_LOCAL_size = 0; + T_HEADER(T_ID(-2)); + if (socket_send(s, &T_LOCAL_size, 4) == -1) return -1; + return socket_send(s, buf, T_LOCAL_size); +} + +void new_tracer(multi_t *m, int s, int is_on_size, char *t, int t_size, int id) +{ + if (send_messages_txt(s, t, t_size) == -1) { + printf("error sending T_messages.txt to new tracer %d => remove tracer\n", + id); + return; + } + if (m->ti_size == m->ti_maxsize) { + m->ti_maxsize += 64; + m->ti = realloc(m->ti, m->ti_maxsize * sizeof(ti_t)); + if (m->ti == NULL) abort(); + } + m->ti[m->ti_size].id = id; + m->ti[m->ti_size].s = s; + m->ti[m->ti_size].is_on = calloc(is_on_size, sizeof(int)); + if (m->ti[m->ti_size].is_on == NULL) abort(); + m->ti[m->ti_size].poll_id = -1; + m->ti_size++; +} + +void remove_tracer(multi_t *m, int t) +{ + free(m->ti[t].is_on); + shutdown(m->ti[t].s, SHUT_RDWR); + close(m->ti[t].s); + m->ti_size--; + memmove(&m->ti[t], &m->ti[t+1], (m->ti_size - t) * sizeof(ti_t)); +} + +int send_is_on(int socket, int number_of_events, int *is_on) +{ + int i; + char mt = 1; + if (socket_send(socket, &mt, 1) == -1 || + socket_send(socket, &number_of_events, sizeof(int)) == -1) return -1; + for (i = 0; i < number_of_events; i++) { + int v = is_on[i] ? 1 : 0; + if (socket_send(socket, &v, sizeof(int)) == -1) return -1; + } + return 0; +} + +int read_tracee(int s, OBUF *ebuf, int *_type, int32_t *_length) +{ + int type; + int32_t length; + char *v; + int vpos = 0; + + if (fullread(s, &length, 4) == -1) return -1; + if (ebuf->omaxsize < length) { + ebuf->omaxsize = (length + 65535) & ~65535; + ebuf->obuf = realloc(ebuf->obuf, ebuf->omaxsize); + if (ebuf->obuf == NULL) { printf("out of memory\n"); exit(1); } + } + v = ebuf->obuf; + memcpy(v+vpos, &length, 4); + vpos += 4; +#ifdef T_SEND_TIME + if (fullread(s,v+vpos,sizeof(struct timespec))==-1) return -1; + vpos += sizeof(struct timespec); + length -= sizeof(struct timespec); +#endif + if (fullread(s, &type, sizeof(int)) == -1) return -1; + memcpy(v+vpos, &type, sizeof(int)); + vpos += sizeof(int); + length -= sizeof(int); + if (fullread(s, v+vpos, length) == -1) return -1; + vpos += length; + + ebuf->osize = vpos; + + *_type = type; + *_length = length; + return 0; +} + +void forward_event(multi_t *m, int number_of_events, OBUF *ebuf, int type) +{ + int i; + + if (type < 0 || type >= number_of_events) + { printf("error: bad type of event to forward %d\n", type); abort(); } + + for (i = 0; i < m->ti_size; i++) { + if (!m->ti[i].is_on[type]) continue; + if (socket_send(m->ti[i].s, ebuf->obuf, ebuf->osize) == -1) + printf("warning: error forwarding event to tracer %d\n", m->ti[i].id); + } +} + +int connect_to_tracee(char *ip, int port, int number_of_events, int *is_on) +{ + int s; + + printf("connecting to %s:%d\n", ip, port); + + s = try_connect_to(ip, port); + if (s == -1) return -1; + + if (send_is_on(s, number_of_events, is_on) == -1) { + shutdown(s, SHUT_RDWR); + close(s); + return -1; + } + + return s; +} + +void usage(void) +{ + printf( +"options:\n" +" -d <database file> this option is mandatory\n" +" -ip <host> connect to given IP address (default %s)\n" +" -p <port> connect to given port (default %d)\n" +" -lp <port> listen on local port (default %d)\n", + DEFAULT_REMOTE_IP, + DEFAULT_REMOTE_PORT, + DEFAULT_LOCAL_PORT + ); + exit(1); +} + +int main(int n, char **v) +{ + char *database_filename = NULL; + void *database; + char *ip = DEFAULT_REMOTE_IP; + int port = DEFAULT_REMOTE_PORT; + int local_port = DEFAULT_LOCAL_PORT; + int *is_on; + int number_of_events; + int i, j; + char *T_messages_txt; + int T_messages_txt_len; + int l; /* listen socket for tracers' connections */ + int s = -1; /* socket connected to tracee. -1 if not connected */ + multi_t m; + int is_on_changed; + int current_nfd; + struct pollfd *fds = NULL; + int next_id = 0; + + memset(&m, 0, sizeof(m)); + + /* write on a socket fails if the other end is closed and we get SIGPIPE */ + if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) abort(); + + for (i = 1; i < n; i++) { + if (!strcmp(v[i], "-h") || !strcmp(v[i], "--help")) usage(); + if (!strcmp(v[i], "-d")) + { if (i > n-2) usage(); database_filename = v[++i]; continue; } + if (!strcmp(v[i], "-ip")) { if (i > n-2) usage(); ip = v[++i]; continue; } + if (!strcmp(v[i], "-p")) + { if (i > n-2) usage(); port = atoi(v[++i]); continue; } + if (!strcmp(v[i], "-lp")) + { if (i > n-2) usage(); local_port = atoi(v[++i]); continue; } + usage(); + } + + if (database_filename == NULL) { + printf("ERROR: provide a database file (-d)\n"); + exit(1); + } + + database = parse_database(database_filename); + + load_config_file(database_filename); + get_local_config(&T_messages_txt, &T_messages_txt_len); + + number_of_events = number_of_ids(database); + is_on = calloc(number_of_events, sizeof(int)); + if (is_on == NULL) abort(); + + /* create listener socket */ + l = create_listen_socket("0.0.0.0", local_port); + + OBUF ebuf = { osize: 0, omaxsize: 0, obuf: NULL }; + + current_nfd = 0; + + while (1) { + int nfd; + int timeout; + + if (s == -1) s = connect_to_tracee(ip, port, number_of_events, is_on); + + /* poll on s (if there), l, and all tracers' sockets */ + nfd = 1 + (s != -1) + m.ti_size; + if (nfd != current_nfd) { + current_nfd = nfd; + free(fds); + fds = calloc(nfd, sizeof(struct pollfd)); + if (fds == NULL) { perror("calloc"); exit(1); } + } + i = 0; + fds[i].fd = l; + fds[i].events = POLLIN; + i++; + if (s != -1) { + fds[i].fd = s; + fds[i].events = POLLIN; + i++; + } + for (j = 0; j < m.ti_size; j++) { + m.ti[j].poll_id = i; + fds[i].fd = m.ti[j].s; + fds[i].events = POLLIN; + i++; + } + if (s == -1) timeout = 1000; else timeout = -1; + if (poll(fds, nfd, timeout) == -1) { perror("poll"); exit(1); } + + if (fds[0].revents & ~POLLIN) { + printf("TODO: error on listen socket?\n"); + exit(1); + } + + /* new tracer connecting? */ + if (fds[0].revents & POLLIN) { + int t; + printf("tracer %d connecting\n", next_id); + t = socket_accept(l); + if (t == -1) perror("accept"); + else new_tracer(&m, t, number_of_events, + T_messages_txt, T_messages_txt_len, next_id); + next_id++; + } + + if (s != -1 && fds[1].revents & ~POLLIN) { + printf("TODO: error on tracee socket?\n"); + exit(1); + } + + /* data from tracee */ + if (s != -1 && fds[1].revents & POLLIN) { + int type; + int32_t length; + if (read_tracee(s, &ebuf, &type, &length) == -1) { + clear_remote_config(); + shutdown(s, SHUT_RDWR); + close(s); + s = -1; + } else { + if (type == -1) + append_received_config_chunk(ebuf.obuf+ebuf.osize-length, length); + else if (type == -2) verify_config(); + else forward_event(&m, number_of_events, &ebuf, type); + } + } + + /* status of each tracer */ + is_on_changed = 0; + for (j = 0; j < m.ti_size; j++) { + int l; + int s; + int *t_is_on; + if (m.ti[j].poll_id == -1) continue; + i = m.ti[j].poll_id; + s = m.ti[j].s; + t_is_on = m.ti[j].is_on; + if (fds[i].revents & (POLLHUP | POLLERR)) goto tracer_error; + /* error? */ + if (fds[i].revents & ~POLLIN) { + printf("TODO: error with tracer?\n"); + exit(1); + } + /* data in */ + if (fds[i].revents & POLLIN) { + char t; + int len; + int v; + if (fullread(s, &t, 1) != 1) goto tracer_error; + switch (t) { + case 0: + is_on_changed = 1; + if (fullread(s, &len, sizeof(int)) == -1) goto tracer_error; + for (l = 0; l < len; l++) { + if (fullread(s, &v, sizeof(int)) == -1) goto tracer_error; + if (v < 0 || v >= number_of_events) goto tracer_error; + t_is_on[v] = 1 - t_is_on[v]; + set_is_on(is_on, v, t_is_on[v]); + } + break; + case 1: + is_on_changed = 1; + if (fullread(s, &len, sizeof(int)) == -1) goto tracer_error; + if (len < 0 || len > number_of_events) goto tracer_error; + for (l = 0; l < len; l++) { + if (fullread(s, &v, sizeof(int)) == -1) goto tracer_error; + if (v < 0 || v > 1) goto tracer_error; + if (t_is_on[l] != v) set_is_on(is_on, l, v); + t_is_on[l] = v; + } + break; + case 2: break; + default: printf("error: unhandled message type %d\n", t); //abort(); + } + } + continue; +tracer_error: + printf("remove tracer %d\n", m.ti[j].id); + for (l = 0; l < number_of_events; l++) + if (m.ti[j].is_on[l]) { is_on_changed = 1; set_is_on(is_on, l, 0); } + remove_tracer(&m, j); + j--; + } + if (is_on_changed && s != -1) + if (send_is_on(s, number_of_events, is_on) == -1) { + clear_remote_config(); + shutdown(s, SHUT_RDWR); + close(s); + s = -1; + } + } + + return 0; +} diff --git a/common/utils/T/tracer/to_vcd.c b/common/utils/T/tracer/to_vcd.c index 1a67a9d4ffa6b631c59f9246516d61fe8e0efb12..998649af01543a531193640112832731657082d9 100644 --- a/common/utils/T/tracer/to_vcd.c +++ b/common/utils/T/tracer/to_vcd.c @@ -12,7 +12,14 @@ #include "logger/logger.h" #include "view/view.h" +enum var_type { + DEFAULT, + VCD_FUNCTION, + VCD_VARIABLE +}; + typedef struct { + enum var_type type; char *event; char *arg; char *vcd_name; @@ -44,16 +51,39 @@ void vcd_write_header(vcd_vars *v, int n) "$version\n" " to_vcd\n" "$end\n" -"$timescale 1ns $end\n" +"$timescale 1ns $end\n") <= 0) abort(); + + if (fprintf(out, "$scope module logic $end\n") <= 0) abort(); + for (i = 0; i < n; i++) + if (v[i].type == DEFAULT) + if (fprintf(out, "$var wire %d %s %s $end\n", + v[i].boolean ? 1 : 64, + v[i].vcd_name, v[i].vcd_name) <= 0) abort(); + if (fprintf(out, +"$upscope $end\n") <= 0) abort(); + if (fprintf(out, +"$scope module functions $end\n") <= 0) abort(); + for (i = 0; i < n; i++) + if (v[i].type == VCD_FUNCTION) + if (fprintf(out, "$var wire %d %s %s $end\n", + v[i].boolean ? 1 : 64, + v[i].vcd_name, v[i].vcd_name) <= 0) abort(); + if (fprintf(out, +"$upscope $end\n") <= 0) abort(); + + if (fprintf(out, +"$scope module variables $end\n") <= 0) abort(); for (i = 0; i < n; i++) - if (fprintf(out, "$var wire %d %s %s $end\n", - v[i].boolean ? 1 : 64, - v[i].vcd_name, v[i].vcd_name) <= 0) abort(); + if (v[i].type == VCD_VARIABLE) + if (fprintf(out, "$var wire %d %s %s $end\n", + v[i].boolean ? 1 : 64, + v[i].vcd_name, v[i].vcd_name) <= 0) abort(); + if (fprintf(out, +"$upscope $end\n") <= 0) abort(); if (fprintf(out, -"$upscope $end\n" "$enddefinitions $end\n" "$dumpvars\n") <= 0) abort(); @@ -194,12 +224,13 @@ void force_stop(int x) } vcd_vars *add_var(vcd_vars *vars, int nvars, - char *event, char *arg, char *vcd_name, int is_boolean) + char *event, char *arg, char *vcd_name, int is_boolean, enum var_type t) { if (nvars % 64 == 0) { vars = realloc(vars, (nvars+64) * sizeof(vcd_vars)); if (vars == NULL) abort(); } + vars[nvars].type = t; vars[nvars].event = event; vars[nvars].arg = arg; vars[nvars].vcd_name = vcd_name; @@ -240,7 +271,7 @@ int main(int n, char **v) char *event = v[++i]; char *arg = v[++i]; char *vcd_name = v[++i]; - vars = add_var(vars, nvars, event, arg, vcd_name, 1); + vars = add_var(vars, nvars, event, arg, vcd_name, 1, DEFAULT); nvars++; continue; } @@ -248,7 +279,7 @@ int main(int n, char **v) char *event = v[++i]; char *arg = v[++i]; char *vcd_name = v[++i]; - vars = add_var(vars, nvars, event, arg, vcd_name, 0); + vars = add_var(vars, nvars, event, arg, vcd_name, 0, DEFAULT); nvars++; continue; } @@ -283,20 +314,30 @@ int main(int n, char **v) /* activate all VCD traces */ for (i = 0; i < number_of_events; i++) { int is_boolean; + enum var_type type; int prefix_length; char *name = event_name_from_id(database, i); + char *vcd_name; char *var_prefix = "VCD_VARIABLE_"; char *fun_prefix = "VCD_FUNCTION_"; if (!strncmp(name, var_prefix, strlen(var_prefix))) { prefix_length = strlen(var_prefix); is_boolean = 0; + type = VCD_VARIABLE; } else if (!strncmp(name, fun_prefix, strlen(fun_prefix))) { prefix_length = strlen(fun_prefix); is_boolean = 1; + type = VCD_FUNCTION; } else continue; + vcd_name = event_vcd_name_from_id(database, i); + if (vcd_name == NULL) { + vcd_name = name+prefix_length; + printf("WARNING: ID %s does not define VCD_NAME in the file %s, using %s\n", + name, database_filename, vcd_name); + } vars = add_var(vars, nvars, - name, "value", name+prefix_length, is_boolean); + name, "value", vcd_name, is_boolean, type); nvars++; } } diff --git a/common/utils/T/tracer/ue.c b/common/utils/T/tracer/ue.c index 6a7d03c897357c5e0d2cbbe07239fcb2bf2ebcfc..7b03210cd2cb3d7884fa57c6531e08d58a3aa141 100644 --- a/common/utils/T/tracer/ue.c +++ b/common/utils/T/tracer/ue.c @@ -857,6 +857,7 @@ int main(int n, char **v) restart: clear_remote_config(); + if (ue_data.socket != -1) close(ue_data.socket); ue_data.socket = connect_to(ip, port); /* send the first message - activate selected traces */ diff --git a/common/utils/T/tracer/utils.c b/common/utils/T/tracer/utils.c index 507154673538a4570c058f1af5ecf4db8771871d..7f58b6f5aa0061189d01a5107d8e6dcea035138a 100644 --- a/common/utils/T/tracer/utils.c +++ b/common/utils/T/tracer/utils.c @@ -79,6 +79,36 @@ list *list_append(list *l, void *data) /* socket */ /****************************************************************************/ +int create_listen_socket(char *addr, int port) +{ + struct sockaddr_in a; + int s; + int v; + + s = socket(AF_INET, SOCK_STREAM, 0); + if (s == -1) { perror("socket"); exit(1); } + v = 1; + if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &v, sizeof(int))) + { perror("setsockopt"); exit(1); } + + a.sin_family = AF_INET; + a.sin_port = htons(port); + a.sin_addr.s_addr = inet_addr(addr); + + if (bind(s, (struct sockaddr *)&a, sizeof(a))) { perror("bind"); exit(1); } + if (listen(s, 5)) { perror("listen"); exit(1); } + + return s; +} + +int socket_accept(int s) +{ + struct sockaddr_in a; + socklen_t alen; + alen = sizeof(a); + return accept(s, (struct sockaddr *)&a, &alen); +} + int socket_send(int socket, void *buffer, int size) { char *x = buffer; @@ -94,26 +124,13 @@ int socket_send(int socket, void *buffer, int size) int get_connection(char *addr, int port) { - struct sockaddr_in a; - socklen_t alen; int s, t; printf("waiting for connection on %s:%d\n", addr, port); - s = socket(AF_INET, SOCK_STREAM, 0); - if (s == -1) { perror("socket"); exit(1); } - t = 1; - if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &t, sizeof(int))) - { perror("setsockopt"); exit(1); } - - a.sin_family = AF_INET; - a.sin_port = htons(port); - a.sin_addr.s_addr = inet_addr(addr); + s = create_listen_socket(addr, port); - if (bind(s, (struct sockaddr *)&a, sizeof(a))) { perror("bind"); exit(1); } - if (listen(s, 5)) { perror("bind"); exit(1); } - alen = sizeof(a); - t = accept(s, (struct sockaddr *)&a, &alen); + t = socket_accept(s); if (t == -1) { perror("accept"); exit(1); } close(s); @@ -137,14 +154,11 @@ int fullread(int fd, void *_buf, int count) return ret; } -int connect_to(char *addr, int port) +int try_connect_to(char *addr, int port) { int s; struct sockaddr_in a; - printf("connecting to %s:%d\n", addr, port); - -again: s = socket(AF_INET, SOCK_STREAM, 0); if (s == -1) { perror("socket"); exit(1); } @@ -155,6 +169,21 @@ again: if (connect(s, (struct sockaddr *)&a, sizeof(a)) == -1) { perror("connect"); close(s); + return -1; + } + + return s; +} + +int connect_to(char *addr, int port) +{ + int s; + + printf("connecting to %s:%d\n", addr, port); + +again: + s = try_connect_to(addr, port); + if (s == -1) { printf("trying again in 1s\n"); sleep(1); goto again; diff --git a/common/utils/T/tracer/utils.h b/common/utils/T/tracer/utils.h index 3be6cfe1a7f67af65282d7494c7d1a172fc163d7..6784117fa6cf66d3ffc33e191924f385dacc888d 100644 --- a/common/utils/T/tracer/utils.h +++ b/common/utils/T/tracer/utils.h @@ -24,11 +24,14 @@ list *list_append(list *l, void *data); #define DEFAULT_REMOTE_IP "127.0.0.1" #define DEFAULT_REMOTE_PORT 2021 +int create_listen_socket(char *addr, int port); +int socket_accept(int s); /* socket_send: return 0 if okay, -1 on error */ int socket_send(int socket, void *buffer, int size); int get_connection(char *addr, int port); /* fullread: return length read if okay (that is: 'count'), -1 on error */ int fullread(int fd, void *_buf, int count); +int try_connect_to(char *addr, int port); int connect_to(char *addr, int port); /****************************************************************************/ diff --git a/common/utils/itti/intertask_interface.c b/common/utils/itti/intertask_interface.c index 2e38b660d7e9256d4de3c88ab6acffe9186b7561..d088b59c041b8abeaf2408f0369a98588574537a 100644 --- a/common/utils/itti/intertask_interface.c +++ b/common/utils/itti/intertask_interface.c @@ -745,7 +745,7 @@ void itti_exit_task(void) #if defined(OAI_EMU) || defined(RTAI) if (task_id > TASK_UNKNOWN) { - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLE_ITTI_RECV_MSG, + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_ITTI_RECV_MSG, __sync_and_and_fetch (&itti_desc.vcd_receive_msg, ~(1L << task_id))); } #endif diff --git a/openair1/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c b/openair1/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c index a693cb55e4ce0a0922520b28b7540963458061cf..50b09102d88857b2b1a2cabf439e2e81a28f2d70 100644 --- a/openair1/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c +++ b/openair1/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c @@ -40,8 +40,14 @@ #include<math.h> #include <stdlib.h> #include <string.h> +#include <linux/version.h> +#if RHEL_RELEASE_CODE >= 1796 +#include <lapacke/lapacke_utils.h> +#include <lapacke/lapacke.h> +#else #include <lapacke_utils.h> #include <lapacke.h> +#endif #include <cblas.h> #include "linear_preprocessing_rec.h" diff --git a/openair1/PHY/LTE_UE_TRANSPORT/linear_preprocessing_rec.c b/openair1/PHY/LTE_UE_TRANSPORT/linear_preprocessing_rec.c index d85d440193757044eedadaf820ef4d46b47eddb6..7d063e326effc919180e5ebe12c02fa19d85b6a2 100644 --- a/openair1/PHY/LTE_UE_TRANSPORT/linear_preprocessing_rec.c +++ b/openair1/PHY/LTE_UE_TRANSPORT/linear_preprocessing_rec.c @@ -13,9 +13,14 @@ data storage. */ #include <stdlib.h> #include <cblas.h> #include <string.h> +#include <linux/version.h> +#if RHEL_RELEASE_CODE >= 1796 +#include <lapacke/lapacke_utils.h> +#include <lapacke/lapacke.h> +#else #include <lapacke_utils.h> #include <lapacke.h> - +#endif //#define DEBUG_PREPROC @@ -366,4 +371,4 @@ float sqrt_float(float x, float sqrt_x) { sqrt_x = (float)(sqrt((double)(x))); return sqrt_x; -} \ No newline at end of file +} diff --git a/openair2/ENB_APP/enb_config.c b/openair2/ENB_APP/enb_config.c index 9f2b4137a421688bbbfd985a7021e103c92ea493..7591bc3d07dd9b9ac2a80f7513f2ed37e95d7ae5 100644 --- a/openair2/ENB_APP/enb_config.c +++ b/openair2/ENB_APP/enb_config.c @@ -2355,12 +2355,12 @@ int RCconfig_S1(MessageDef *msg_p, uint32_t i) { #endif } if (strcmp(*(S1ParamList.paramarray[l][ENB_MME_IP_ADDRESS_PREFERENCE_IDX].strptr), "ipv4") == 0) { - S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[j].ipv4 = 1; + S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[l].ipv4 = 1; } else if (strcmp(*(S1ParamList.paramarray[l][ENB_MME_IP_ADDRESS_PREFERENCE_IDX].strptr), "ipv6") == 0) { - S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[j].ipv6 = 1; + S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[l].ipv6 = 1; } else if (strcmp(*(S1ParamList.paramarray[l][ENB_MME_IP_ADDRESS_PREFERENCE_IDX].strptr), "no") == 0) { - S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[j].ipv4 = 1; - S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[j].ipv6 = 1; + S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[l].ipv4 = 1; + S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[l].ipv6 = 1; } } diff --git a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c index 05498e4377b0abb24a883da61da4a027cebed93c..df52b83d729b4087ba4d137da71bfcb339440252 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c @@ -386,6 +386,7 @@ set_ul_DAI(int module_idP, int UE_idP, int CC_idP, int frameP, UE_list->UE_template[CC_idP][UE_idP].DAI_ul[3] = DAI; break; } + break; case 2: // if ((subframeP==3)||(subframeP==8)) diff --git a/openair2/NETWORK_DRIVER/MESH/device.c b/openair2/NETWORK_DRIVER/MESH/device.c index f8a420697a95d043d2f5870d2c55ca8279567ed5..f5d31742bc400c4cc055d8950ae633c65b9beec0 100644 --- a/openair2/NETWORK_DRIVER/MESH/device.c +++ b/openair2/NETWORK_DRIVER/MESH/device.c @@ -324,7 +324,11 @@ static const struct net_device_ops nasmesh_netdev_ops = { .ndo_set_mac_address = NULL, .ndo_set_config = nas_set_config, .ndo_do_ioctl = nas_CTL_ioctl, +#if RHEL_RELEASE_CODE>=1797 + .extended.ndo_change_mtu = nas_change_mtu, +#else .ndo_change_mtu = nas_change_mtu, +#endif .ndo_tx_timeout = nas_tx_timeout, }; diff --git a/openair2/NETWORK_DRIVER/UE_IP/device.c b/openair2/NETWORK_DRIVER/UE_IP/device.c index d9a91496859a70cb62c4d699206ce5178f259dfe..47c820fe775330dd0aa9de35052667f31e4b0266 100644 --- a/openair2/NETWORK_DRIVER/UE_IP/device.c +++ b/openair2/NETWORK_DRIVER/UE_IP/device.c @@ -349,7 +349,11 @@ static const struct net_device_ops ue_ip_netdev_ops = { .ndo_set_mac_address = ue_ip_set_mac_address, .ndo_set_config = ue_ip_set_config, .ndo_do_ioctl = NULL, - .ndo_change_mtu = ue_ip_change_mtu, +#if RHEL_RELEASE_CODE>=1797 + .extended.ndo_change_mtu = ue_ip_change_mtu, +#else + .ndo_change_mtu = ue_ip_change_mtu, +#endif .ndo_tx_timeout = ue_ip_tx_timeout, .ndo_change_rx_flags = ue_ip_change_rx_flags, }; diff --git a/openair3/S1AP/MESSAGES/ASN1/R15/s1ap-15.2.0.asn1 b/openair3/S1AP/MESSAGES/ASN1/R15/s1ap-15.2.0.asn1 index db1f1b59150a5d17de2764d473ddd2627dc91d23..97d0a6de871ff1b8c4dd48a45df457f7d423223a 100755 --- a/openair3/S1AP/MESSAGES/ASN1/R15/s1ap-15.2.0.asn1 +++ b/openair3/S1AP/MESSAGES/ASN1/R15/s1ap-15.2.0.asn1 @@ -6881,3 +6881,201 @@ id-EDT-Session ProtocolIE-ID ::= 281 id-CNTypeRestrictions ProtocolIE-ID ::= 282 END + +-- ************************************************************** +-- +-- Container definitions +-- +-- ************************************************************** + +S1AP-Containers { +itu-t (0) identified-organization (4) etsi (0) mobileDomain (0) +eps-Access (21) modules (3) s1ap (1) version1 (1) s1ap-Containers (5) } + +DEFINITIONS AUTOMATIC TAGS ::= + +BEGIN + +-- ************************************************************** +-- +-- IE parameter types from other modules. +-- +-- ************************************************************** + +IMPORTS + Criticality, + Presence, + PrivateIE-ID, + ProtocolExtensionID, + ProtocolIE-ID +FROM S1AP-CommonDataTypes + + maxPrivateIEs, + maxProtocolExtensions, + maxProtocolIEs +FROM S1AP-Constants; + +-- ************************************************************** +-- +-- Class Definition for Protocol IEs +-- +-- ************************************************************** + +S1AP-PROTOCOL-IES ::= CLASS { + &id ProtocolIE-ID UNIQUE, + &criticality Criticality, + &Value, + &presence Presence +} +WITH SYNTAX { + ID &id + CRITICALITY &criticality + TYPE &Value + PRESENCE &presence +} + +-- ************************************************************** +-- +-- Class Definition for Protocol IEs +-- +-- ************************************************************** + +S1AP-PROTOCOL-IES-PAIR ::= CLASS { + &id ProtocolIE-ID UNIQUE, + &firstCriticality Criticality, + &FirstValue, + &secondCriticality Criticality, + &SecondValue, + &presence Presence +} +WITH SYNTAX { + ID &id + FIRST CRITICALITY &firstCriticality + FIRST TYPE &FirstValue + SECOND CRITICALITY &secondCriticality + SECOND TYPE &SecondValue + PRESENCE &presence +} + +-- ************************************************************** +-- +-- Class Definition for Protocol Extensions +-- +-- ************************************************************** + +S1AP-PROTOCOL-EXTENSION ::= CLASS { + &id ProtocolExtensionID UNIQUE, + &criticality Criticality, + &Extension, + &presence Presence +} +WITH SYNTAX { + ID &id + CRITICALITY &criticality + EXTENSION &Extension + PRESENCE &presence +} + +-- ************************************************************** +-- +-- Class Definition for Private IEs +-- +-- ************************************************************** + +S1AP-PRIVATE-IES ::= CLASS { + &id PrivateIE-ID, + &criticality Criticality, + &Value, + &presence Presence +} +WITH SYNTAX { + ID &id + CRITICALITY &criticality + TYPE &Value + PRESENCE &presence +} + +-- ************************************************************** +-- +-- Container for Protocol IEs +-- +-- ************************************************************** + +ProtocolIE-Container {S1AP-PROTOCOL-IES : IEsSetParam} ::= + SEQUENCE (SIZE (0..maxProtocolIEs)) OF + ProtocolIE-Field {{IEsSetParam}} + +ProtocolIE-SingleContainer {S1AP-PROTOCOL-IES : IEsSetParam} ::= + ProtocolIE-Field {{IEsSetParam}} + +ProtocolIE-Field {S1AP-PROTOCOL-IES : IEsSetParam} ::= SEQUENCE { + id S1AP-PROTOCOL-IES.&id ({IEsSetParam}), + criticality S1AP-PROTOCOL-IES.&criticality ({IEsSetParam}{@id}), + value S1AP-PROTOCOL-IES.&Value ({IEsSetParam}{@id}) +} + +-- ************************************************************** +-- +-- Container for Protocol IE Pairs +-- +-- ************************************************************** + +ProtocolIE-ContainerPair {S1AP-PROTOCOL-IES-PAIR : IEsSetParam} ::= + SEQUENCE (SIZE (0..maxProtocolIEs)) OF + ProtocolIE-FieldPair {{IEsSetParam}} + +ProtocolIE-FieldPair {S1AP-PROTOCOL-IES-PAIR : IEsSetParam} ::= SEQUENCE { + id S1AP-PROTOCOL-IES-PAIR.&id ({IEsSetParam}), + firstCriticality S1AP-PROTOCOL-IES-PAIR.&firstCriticality ({IEsSetParam}{@id}), + firstValue S1AP-PROTOCOL-IES-PAIR.&FirstValue ({IEsSetParam}{@id}), + secondCriticality S1AP-PROTOCOL-IES-PAIR.&secondCriticality ({IEsSetParam}{@id}), + secondValue S1AP-PROTOCOL-IES-PAIR.&SecondValue ({IEsSetParam}{@id}) +} + +-- ************************************************************** +-- +-- Container Lists for Protocol IE Containers +-- +-- ************************************************************** + +ProtocolIE-ContainerList {INTEGER : lowerBound, INTEGER : upperBound, S1AP-PROTOCOL-IES : IEsSetParam} ::= + SEQUENCE (SIZE (lowerBound..upperBound)) OF + ProtocolIE-SingleContainer {{IEsSetParam}} + +ProtocolIE-ContainerPairList {INTEGER : lowerBound, INTEGER : upperBound, S1AP-PROTOCOL-IES-PAIR : IEsSetParam} ::= + SEQUENCE (SIZE (lowerBound..upperBound)) OF + ProtocolIE-ContainerPair {{IEsSetParam}} + +-- ************************************************************** +-- +-- Container for Protocol Extensions +-- +-- ************************************************************** + +ProtocolExtensionContainer {S1AP-PROTOCOL-EXTENSION : ExtensionSetParam} ::= + SEQUENCE (SIZE (1..maxProtocolExtensions)) OF + ProtocolExtensionField {{ExtensionSetParam}} + +ProtocolExtensionField {S1AP-PROTOCOL-EXTENSION : ExtensionSetParam} ::= SEQUENCE { + id S1AP-PROTOCOL-EXTENSION.&id ({ExtensionSetParam}), + criticality S1AP-PROTOCOL-EXTENSION.&criticality ({ExtensionSetParam}{@id}), + extensionValue S1AP-PROTOCOL-EXTENSION.&Extension ({ExtensionSetParam}{@id}) +} + +-- ************************************************************** +-- +-- Container for Private IEs +-- +-- ************************************************************** + +PrivateIE-Container {S1AP-PRIVATE-IES : IEsSetParam } ::= + SEQUENCE (SIZE (1.. maxPrivateIEs)) OF + PrivateIE-Field {{IEsSetParam}} + +PrivateIE-Field {S1AP-PRIVATE-IES : IEsSetParam} ::= SEQUENCE { + id S1AP-PRIVATE-IES.&id ({IEsSetParam}), + criticality S1AP-PRIVATE-IES.&criticality ({IEsSetParam}{@id}), + value S1AP-PRIVATE-IES.&Value ({IEsSetParam}{@id}) +} + +END diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index 699bc7f56b9f46e7e2505135fc4d2c89dea91bed..e84f99e67f4126d2a6ee8b0efe49099a12022a34 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -1131,13 +1131,6 @@ int main( int argc, char **argv ) rt_sleep_ns(10*100000000ULL); - if (nfapi_mode) { - - printf("NFAPI*** - mutex and cond created - will block shortly for completion of PNF connection\n"); - pthread_cond_init(&sync_cond,NULL); - pthread_mutex_init(&sync_mutex, NULL); - } - if (nfapi_mode) { printf("NFAPI*** - mutex and cond created - will block shortly for completion of PNF connection\n");