Merge conficts resolved

This commit is contained in:
Mahesh
2021-02-02 09:36:49 +05:30
244 changed files with 2801 additions and 12579 deletions
+101 -23
View File
@@ -37,6 +37,7 @@ import logging
import os
import time
from multiprocessing import Process, Lock, SimpleQueue
from zipfile import ZipFile
#-----------------------------------------------------------
# OAI Testing modules
@@ -80,7 +81,11 @@ class Containerize():
self.flexranCtrlDeployed = False
self.flexranCtrlIpAddress = ''
self.cli = ''
self.dockerfileprefix = ''
self.host = ''
self.allImagesSize = {}
self.collectInfo = {}
#-----------------------------------------------------------
# Container management functions
#-----------------------------------------------------------
@@ -110,10 +115,21 @@ class Containerize():
logging.debug('Building on server: ' + lIpAddr)
mySSH = SSH.SSHConnection()
mySSH.open(lIpAddr, lUserName, lPassWord)
# Checking the hostname to get adapted on cli and dockerfileprefixes
mySSH.command('hostnamectl', '\$', 5)
result = re.search('Ubuntu|Red Hat', mySSH.getBefore())
self.host = result.group(0)
if self.host == 'Ubuntu':
self.cli = 'docker'
self.dockerfileprefix = '.ubuntu18'
elif self.host == 'Red Hat':
self.cli = 'podman'
self.dockerfileprefix = '.rhel8.2'
imageNames = []
result = re.search('eNB', self.imageKind)
# Creating a tupple with the imageName and the DockerFile prefix pattern
# Creating a tupple with the imageName and the DockerFile prefix pattern on obelix
if result is not None:
imageNames.append(('oai-enb', 'eNB'))
else:
@@ -129,10 +145,13 @@ class Containerize():
imageNames.append(('oai-nr-ue', 'nrUE'))
if len(imageNames) == 0:
imageNames.append(('oai-enb', 'eNB'))
# Workaround for some servers, we need to erase completely the workspace
if self.forcedWorkspaceCleanup:
mySSH.command('echo ' + lPassWord + ' | sudo -S rm -Rf ' + lSourcePath, '\$', 15)
self.testCase_id = HTML.testCase_id
# on RedHat/CentOS .git extension is mandatory
result = re.search('([a-zA-Z0-9\:\-\.\/])+\.git', self.ranRepository)
if result is not None:
@@ -162,97 +181,156 @@ class Containerize():
else:
logging.debug('Merging with the target branch: ' + self.ranTargetBranch)
mySSH.command('git merge --ff origin/' + self.ranTargetBranch + ' -m "Temporary merge for CI"', '\$', 5)
# if asterix, copy the entitlement and subscription manager configurations
if self.host == 'Red Hat':
mySSH.command('mkdir -p tmp/ca/', '\$', 5)
mySSH.command('mkdir -p tmp/entitlement/', '\$', 5)
mySSH.command('sudo cp /etc/rhsm/ca/redhat-uep.pem tmp/ca/', '\$', 5)
mySSH.command('sudo cp /etc/pki/entitlement/*.pem tmp/entitlement/', '\$', 5)
#mySSH.close()
#return 0
sharedimage = 'ran-build'
# Let's remove any previous run artifacts if still there
mySSH.command('docker image prune --force', '\$', 5)
mySSH.command('docker image rm ran-build:' + imageTag, '\$', 5)
mySSH.command(self.cli + ' image prune --force', '\$', 5)
mySSH.command(self.cli + ' image rm ' + sharedimage + ':' + imageTag, '\$', 5)
for image,pattern in imageNames:
mySSH.command('docker image rm ' + image + ':' + imageTag, '\$', 5)
mySSH.command(self.cli + ' image rm ' + image + ':' + imageTag, '\$', 5)
# Build the shared image
mySSH.command('docker build --target ran-build --tag ran-build:' + imageTag + ' --file docker/Dockerfile.ran.ubuntu18 --build-arg NEEDED_GIT_PROXY="http://proxy.eurecom.fr:8080" . > cmake_targets/log/ran-build.log 2>&1', '\$', 800)
mySSH.command(self.cli + ' build --target ' + sharedimage + ' --tag ' + sharedimage + ':' + imageTag + ' --file docker/Dockerfile.ran' + self.dockerfileprefix + ' --build-arg NEEDED_GIT_PROXY="http://proxy.eurecom.fr:8080" . > cmake_targets/log/ran-build.log 2>&1', '\$', 1600)
# Build the target image(s)
previousImage='ran-build:' + imageTag
previousImage = sharedimage + ':' + imageTag
danglingShaOnes=[]
for image,pattern in imageNames:
# the archived Dockerfiles have "ran-build:latest" as base image
# we need to update them with proper tag
mySSH.command('sed -i -e "s#ran-build:latest#ran-build:' + imageTag + '#" docker/Dockerfile.' + pattern + '.ubuntu18', '\$', 5)
mySSH.command('docker build --target ' + image + ' --tag ' + image + ':' + imageTag + ' --file docker/Dockerfile.' + pattern + '.ubuntu18 . > cmake_targets/log/' + image + '.log 2>&1', '\$', 600)
mySSH.command('sed -i -e "s#' + sharedimage + ':latest#' + sharedimage + ':' + imageTag + '#" docker/Dockerfile.' + pattern + self.dockerfileprefix, '\$', 5)
mySSH.command(self.cli + ' build --target ' + image + ' --tag ' + image + ':' + imageTag + ' --file docker/Dockerfile.' + pattern + self.dockerfileprefix + ' . > cmake_targets/log/' + image + '.log 2>&1', '\$', 1200)
# Retrieving the dangling image(s) for the log collection
mySSH.command('docker images --filter "dangling=true" --filter "since=' + previousImage + '" -q | sed -e "s#^#sha=#"', '\$', 5)
mySSH.command(self.cli + ' images --filter "dangling=true" --filter "since=' + previousImage + '" -q | sed -e "s#^#sha=#"', '\$', 5)
result = re.search('sha=(?P<imageShaOne>[a-zA-Z0-9\-\_]+)', mySSH.getBefore())
if result is not None:
danglingShaOnes.append((image, result.group('imageShaOne')))
previousImage=image + ':' + imageTag
previousImage = image + ':' + imageTag
imageTag = 'ci-temp'
# First verify if images were properly created.
status = True
mySSH.command('docker image inspect --format=\'Size = {{.Size}} bytes\' ran-build:' + imageTag, '\$', 5)
mySSH.command(self.cli + ' image inspect --format=\'Size = {{.Size}} bytes\' ' + sharedimage + ':' + imageTag, '\$', 5)
if mySSH.getBefore().count('No such object') != 0:
logging.error('Could not build properly ran-build')
status = False
else:
result = re.search('Size = (?P<size>[0-9\-]+) bytes', mySSH.getBefore())
result = re.search('Size *= *(?P<size>[0-9\-]+) *bytes', mySSH.getBefore())
if result is not None:
imageSize = float(result.group('size'))
imageSize = imageSize / 1000
if imageSize < 1000:
logging.debug('\u001B[1m ran-build size is ' + ('%.0f' % imageSize) + ' kbytes\u001B[0m')
self.allImagesSize['ran-build'] = str(round(imageSize,1)) + ' kbytes'
else:
imageSize = imageSize / 1000
if imageSize < 1000:
logging.debug('\u001B[1m ran-build size is ' + ('%.0f' % imageSize) + ' Mbytes\u001B[0m')
self.allImagesSize['ran-build'] = str(round(imageSize,1)) + ' Mbytes'
else:
imageSize = imageSize / 1000
logging.debug('\u001B[1m ran-build size is ' + ('%.3f' % imageSize) + ' Gbytes\u001B[0m')
self.allImagesSize['ran-build'] = str(round(imageSize,1)) + ' Gbytes'
else:
logging.debug('ran-build size is unknown')
for image,pattern in imageNames:
mySSH.command('docker image inspect --format=\'Size = {{.Size}} bytes\' ' + image + ':' + imageTag, '\$', 5)
mySSH.command(self.cli + ' image inspect --format=\'Size = {{.Size}} bytes\' ' + image + ':' + imageTag, '\$', 5)
if mySSH.getBefore().count('No such object') != 0:
logging.error('Could not build properly ' + image)
status = False
else:
result = re.search('Size = (?P<size>[0-9\-]+) bytes', mySSH.getBefore())
result = re.search('Size *= *(?P<size>[0-9\-]+) *bytes', mySSH.getBefore())
if result is not None:
imageSize = float(result.group('size'))
imageSize = imageSize / 1000
if imageSize < 1000:
logging.debug('\u001B[1m ' + image + ' size is ' + ('%.0f' % imageSize) + ' kbytes\u001B[0m')
self.allImagesSize[image] = str(round(imageSize,1)) + ' kbytes'
else:
imageSize = imageSize / 1000
if imageSize < 1000:
logging.debug('\u001B[1m ' + image + ' size is ' + ('%.0f' % imageSize) + ' Mbytes\u001B[0m')
self.allImagesSize[image] = str(round(imageSize,1)) + ' Mbytes'
else:
imageSize = imageSize / 1000
logging.debug('\u001B[1m ' + image + ' size is ' + ('%.3f' % imageSize) + ' Gbytes\u001B[0m')
self.allImagesSize[image] = str(round(imageSize,1)) + ' Gbytes'
else:
logging.debug('ran-build size is unknown')
if not status:
mySSH.close()
logging.error('\u001B[1m Building OAI Images Failed\u001B[0m')
HTML.CreateHtmlTestRow(self.imageKind, 'KO', CONST.ALL_PROCESSES_OK)
#HTML.CreateHtmlNextTabHeaderTestRow(self.collectInfo, self.allImagesSize)
HTML.CreateHtmlTabFooter(False)
sys.exit(1)
# Recover build logs, for the moment only possible when build is successful
mySSH.command('docker create --name test ran-build:' + imageTag, '\$', 5)
mySSH.command(self.cli + ' create --name test ' + sharedimage + ':' + imageTag, '\$', 5)
mySSH.command('mkdir -p cmake_targets/log/ran-build', '\$', 5)
mySSH.command('docker cp test:/oai-ran/cmake_targets/log/. cmake_targets/log/ran-build', '\$', 5)
mySSH.command('docker rm -f test', '\$', 5)
mySSH.command(self.cli + ' cp test:/oai-ran/cmake_targets/log/. cmake_targets/log/ran-build', '\$', 5)
mySSH.command(self.cli + ' rm -f test', '\$', 5)
for image,shaone in danglingShaOnes:
mySSH.command('mkdir -p cmake_targets/log/' + image, '\$', 5)
mySSH.command('docker create --name test ' + shaone, '\$', 5)
mySSH.command('docker cp test:/oai-ran/cmake_targets/log/. cmake_targets/log/' + image, '\$', 5)
mySSH.command('docker rm -f test', '\$', 5)
mySSH.command('docker image prune --force', '\$', 5)
mySSH.command(self.cli + ' create --name test ' + shaone, '\$', 5)
mySSH.command(self.cli + ' cp test:/oai-ran/cmake_targets/log/. cmake_targets/log/' + image, '\$', 5)
mySSH.command(self.cli + ' rm -f test', '\$', 5)
mySSH.command(self.cli + ' image prune --force', '\$', 5)
mySSH.command('cd cmake_targets', '\$', 5)
mySSH.command('mkdir -p build_log_' + self.testCase_id, '\$', 5)
mySSH.command('mv log/* ' + 'build_log_' + self.testCase_id, '\$', 5)
#mySSH.close()
mySSH.command('cd /tmp/CI-eNB/cmake_targets', '\$', 5)
if (os.path.isfile('./build_log_' + self.testCase_id + '.zip')):
os.remove('./build_log_' + self.testCase_id + '.zip')
mySSH.command('zip -r -qq build_log_' + self.testCase_id + '.zip build_log_' + self.testCase_id, '\$', 5)
mySSH.copyin(lIpAddr, lUserName, lPassWord, lSourcePath + '/cmake_targets/build_log_' + self.testCase_id + '.zip', '.')
#mySSH.command('rm -f build_log_' + self.testCase_id + '.zip','\$', 5)
mySSH.close()
ZipFile('build_log_' + self.testCase_id + '.zip').extractall('.')
#Trying to identify the errors and warnings for each built images
imageNames1 = imageNames
shared = ('ran-build','ran')
imageNames1.insert(0, shared)
for image,pattern in imageNames1:
files = {}
file_list = [f for f in os.listdir('build_log_' + self.testCase_id + '/' + image) if os.path.isfile(os.path.join('build_log_' + self.testCase_id + '/' + image, f)) and f.endswith('.txt')]
for fil in file_list:
errorandwarnings = {}
warningsNo = 0
errorsNo = 0
with open('build_log_{}/{}/{}'.format(self.testCase_id,image,fil), mode='r') as inputfile:
for line in inputfile:
result = re.search(' ERROR ', str(line))
if result is not None:
errorsNo += 1
result = re.search(' error:', str(line))
if result is not None:
errorsNo += 1
result = re.search(' WARNING ', str(line))
if result is not None:
warningsNo += 1
result = re.search(' warning:', str(line))
if result is not None:
warningsNo += 1
errorandwarnings['errors'] = errorsNo
errorandwarnings['warnings'] = warningsNo
errorandwarnings['status'] = status
files[fil] = errorandwarnings
self.collectInfo[image] = files
logging.info('\u001B[1m Building OAI Image(s) Pass\u001B[0m')
HTML.CreateHtmlTestRow(self.imageKind, 'OK', CONST.ALL_PROCESSES_OK)
HTML.CreateHtmlNextTabHeaderTestRow(self.collectInfo, self.allImagesSize)
def DeployObject(self, HTML, EPC):
if self.eNB_serverId[self.eNB_instance] == '0':
@@ -206,9 +206,9 @@ eNBs =
MACRLCs = (
{
num_cc = 1;
local_s_if_name = "ens3";
remote_s_address = "CI_UE_IP_ADDR";
local_s_address = "CI_ENB_IP_ADDR";
local_s_if_name = "lo";
remote_s_address = "127.0.0.1";
local_s_address = "127.0.0.2";
local_s_portc = 50001;
remote_s_portc = 50000;
local_s_portd = 50011;
+3 -3
View File
@@ -20,9 +20,9 @@ L1s = (
{
num_cc = 1;
tr_n_preference = "nfapi";
local_n_if_name = "ens3";
remote_n_address = "CI_ENB_IP_ADDR";
local_n_address = "CI_UE_IP_ADDR";
local_n_if_name = "lo";
remote_n_address = "127.0.0.2";
local_n_address = "127.0.0.1";
local_n_portc = 50000;
remote_n_portc = 50001;
local_n_portd = 50010;
+48 -1
View File
@@ -218,7 +218,7 @@ class HTMLManagement():
self.htmlFile.write(' <div id="build-tab" class="tab-pane fade">\n')
self.htmlFile.write(' <table class="table" border = "1">\n')
self.htmlFile.write(' <tr bgcolor = "#33CCFF" >\n')
self.htmlFile.write(' <th>Relative Time (ms)</th>\n')
self.htmlFile.write(' <th>Relative Time (s)</th>\n')
self.htmlFile.write(' <th>Test Id</th>\n')
self.htmlFile.write(' <th>Test Desc</th>\n')
self.htmlFile.write(' <th>Test Options</th>\n')
@@ -399,6 +399,53 @@ class HTMLManagement():
self.htmlFile.write(' </tr>\n')
self.htmlFile.close()
def CreateHtmlNextTabHeaderTestRow(self, collectInfo, allImagesSize, machine='eNB'):
if (self.htmlFooterCreated or (not self.htmlHeaderCreated)):
return
self.htmlFile = open('test_results.html', 'a')
if bool(collectInfo) == False:
self.htmlFile.write(' <tr bgcolor = "red" >\n')
self.htmlFile.write(' <td colspan=' + str(5+self.htmlUEConnected) + '><b> ----IMAGES BUILDING FAILED - Unable to recover the image logs ---- </b></td>\n')
self.htmlFile.write(' </tr>\n')
else:
for image in collectInfo:
files = collectInfo[image]
# TabHeader for image logs on built shared and target images
self.htmlFile.write(' <tr bgcolor = "#F0F0F0" >\n')
self.htmlFile.write(' <td colspan=' + str(5+self.htmlUEConnected) + '><b> ---- ' + image + ' IMAGE STATUS ----> Size ' + allImagesSize[image] + ' </b></td>\n')
self.htmlFile.write(' </tr>\n')
self.htmlFile.write(' <tr bgcolor = "#33CCFF" >\n')
self.htmlFile.write(' <th colspan="2">Element</th>\n')
self.htmlFile.write(' <th>Nb Errors</th>\n')
self.htmlFile.write(' <th>Nb Warnings</th>\n')
self.htmlFile.write(' <th colspan=' + str(1+self.htmlUEConnected) + '>Status</th>\n')
self.htmlFile.write(' </tr>\n')
for fil in files:
parameters = files[fil]
# TestRow for image logs on built shared and target images
self.htmlFile.write(' <tr>\n')
self.htmlFile.write(' <td colspan="2" bgcolor = "lightcyan" >' + fil + ' </td>\n')
if (parameters['errors'] == 0):
self.htmlFile.write(' <td bgcolor = "green" >' + str(parameters['errors']) + '</td>\n')
else:
self.htmlFile.write(' <td bgcolor = "red" >' + str(parameters['errors']) + '</td>\n')
if (parameters['warnings'] == 0):
self.htmlFile.write(' <td bgcolor = "green" >' + str(parameters['warnings']) + '</td>\n')
elif ((parameters['warnings'] > 0) and (parameters['warnings'] <= 20)):
self.htmlFile.write(' <td bgcolor = "orange" >' + str(parameters['warnings']) + '</td>\n')
else:
self.htmlFile.write(' <td bgcolor = "red" >' + str(parameters['warnings']) + '</td>\n')
if (parameters['errors'] == 0) and (parameters['warnings'] == 0):
self.htmlFile.write(' <th colspan=' + str(1+self.htmlUEConnected) + ' bgcolor = "green" ><font color="white">OK </font></th>\n')
elif (parameters['errors'] == 0) and ((parameters['warnings'] > 0) and (parameters['warnings'] <= 20)):
self.htmlFile.write(' <th colspan=' + str(1+self.htmlUEConnected) + ' bgcolor = "orange" ><font color="white">OK </font></th>\n')
else:
self.htmlFile.write(' <th colspan=' + str(1+self.htmlUEConnected) + ' bgcolor = "red" > NOT OK </th>\n')
self.htmlFile.write(' </tr>\n')
self.htmlFile.close()
def CreateHtmlTestRowQueue(self, options, status, ue_status, ue_queue):
if ((not self.htmlFooterCreated) and (self.htmlHeaderCreated)):
self.htmlFile = open('test_results.html', 'a')
+2 -4
View File
@@ -52,13 +52,11 @@ class SSHConnection():
self.picocom_closure = True
def open(self, ipaddress, username, password):
extraSshOptions = ''
count = 0
connect_status = False
if ipaddress == '192.168.18.197':
extraSshOptions = ' -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no'
while count < 4:
self.ssh = pexpect.spawn('ssh', [username + '@' + ipaddress + extraSshOptions], timeout = 5)
self.ssh = pexpect.spawn('ssh -o PubkeyAuthentication=no {}@{}'.format(username,ipaddress))
self.ssh.timeout = 5
self.sshresponse = self.ssh.expect(['Are you sure you want to continue connecting (yes/no)?', 'password:', 'Last login', pexpect.EOF, pexpect.TIMEOUT])
if self.sshresponse == 0:
self.ssh.sendline('yes')
+1 -1
View File
@@ -52,7 +52,7 @@
<testCase id="090102">
<class>Initialize_OAI_UE</class>
<desc>Initialize NR UE USRP</desc>
<Initialize_OAI_UE_args>--phy-test --usrp-args "addr=192.168.30.2,second_addr=192.168.50.2,clock_source=external,time_source=external" --ue-rxgain 75 --rrc_config_path .</Initialize_OAI_UE_args>
<Initialize_OAI_UE_args>--phy-test --usrp-args "addr=192.168.30.2,second_addr=192.168.50.2,clock_source=external,time_source=external" --ue-rxgain 75 --rrc_config_path . --dlsch-parallel 4 </Initialize_OAI_UE_args>
<air_interface>NR</air_interface>
</testCase>
@@ -52,7 +52,7 @@
<testCase id="090104">
<class>Initialize_OAI_UE</class>
<desc>Initialize NR UE USRP</desc>
<Initialize_OAI_UE_args>--phy-test --usrp-args "addr=192.168.30.2,second_addr=192.168.50.2,clock_source=external,time_source=external" --ue-rxgain 75 --rrc_config_path .</Initialize_OAI_UE_args>
<Initialize_OAI_UE_args>--phy-test --usrp-args "addr=192.168.30.2,second_addr=192.168.50.2,clock_source=external,time_source=external" --ue-rxgain 75 --rrc_config_path . --dlsch-parallel 4 </Initialize_OAI_UE_args>
<air_interface>NR</air_interface>
</testCase>
+2 -1
View File
@@ -1758,6 +1758,7 @@ set(PHY_SRC_UE
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_prach.c
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_ulsch_llr_computation.c
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c
${OPENAIR1_DIR}/PHY/NR_REFSIG/ul_ref_seq_nr.c
${OPENAIR1_DIR}/PHY/NR_REFSIG/nr_dmrs_rx.c
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_csi_rs.c
${OPENAIR1_DIR}/PHY/NR_REFSIG/nr_gold.c
@@ -3085,7 +3086,7 @@ target_link_libraries (ocp-gnb
-Wl,--start-group
UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB SCHED_RU_LIB SCHED_NR_LIB PHY_NR PHY PHY_COMMON PHY_NR_COMMON PHY_RU LFDS NR_GTPV1U SECU_CN SECU_OSA
${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} LFDS7 ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} RRC_LIB NR_RRC_LIB
S1AP_LIB S1AP_ENB L2_LTE_NR L2_NR MAC_NR_COMMON NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB
NGAP_LIB NGAP_GNB S1AP_LIB S1AP_ENB L2_LTE_NR L2_NR MAC_NR_COMMON NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB
X2AP_LIB X2AP_ENB F1AP_LIB F1AP M2AP_LIB M2AP_ENB M3AP_LIB M3AP_ENB SIMU_COMMON
-Wl,--end-group z dl)
+9 -3
View File
@@ -1289,7 +1289,10 @@
(Test5: MCS 9 273 PRBs),
(Test6: DMRS Type A, 3 DMRS, 4 PTRS, 5 Interpolated Symbols),
(Test7: DMRS Type B, 3 DMRS, 2 PTRS, 7 Interpolated Symbols),
(Test8: DMRS Type B, 3 DMRS, 2 PTRS, 3 Interpolated Symbols)</desc>
(Test8: DMRS Type B, 3 DMRS, 2 PTRS, 3 Interpolated Symbols),
(Test9: SC-FDMA, 50 PRBs),
(Test10: SC-FDMA, 75 PRBs),
(Test11: SC-FDMA, 3 DMRS)</desc>
<pre_compile_prog></pre_compile_prog>
<compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</compile_prog>
<compile_prog_args> --phy_simulators -c </compile_prog_args>
@@ -1303,8 +1306,11 @@
-n100 -m9 -R273 -r273 -s5
-n100 -s5 -T 2 1 2 -U 2 0 2
-n100 -s5 -T 2 2 2 -U 2 1 2
-n100 -s5 -a4 -b8 -T 2 1 2 -U 2 1 3</main_exec_args>
<tags>nr_ulsim.test1 nr_ulsim.test2 nr_ulsim.test3 nr_ulsim.test4 nr_ulsim.test5 nr_ulsim.test6 nr_ulsim.test7 nr_ulsim.test8</tags>
-n100 -s5 -a4 -b8 -T 2 1 2 -U 2 1 3
-n100 -s20 -Z
-n100 -s20 -Z -r75
-n100 -s20 -Z -U 2 0 2</main_exec_args>
<tags>nr_ulsim.test1 nr_ulsim.test2 nr_ulsim.test3 nr_ulsim.test4 nr_ulsim.test5 nr_ulsim.test6 nr_ulsim.test7 nr_ulsim.test8 nr_ulsim.test9 nr_ulsim.test10 nr_ulsim.test11</tags>
<search_expr_true>PUSCH test OK</search_expr_true>
<search_expr_false>segmentation fault|assertion|exiting|fatal</search_expr_false>
<nruns>3</nruns>
+1 -1
View File
@@ -129,7 +129,7 @@ ID = ENB_MAC_UE_DL_PDU_WITH_DATA
FORMAT = int,eNB_ID : int,CC_id : int,rnti : int,frame : int,subframe : int,harq_pid : buffer,data
ID = ENB_MAC_SCHEDULING_REQUEST
DESC = MAC scheduling request detected for an UE
GROUP = ALL:MAC:ENB
GROUP = ALL:MAC:ENB:WIRESHARK
FORMAT = int,eNB_ID : int,CC_id : int,frame : int,subframe : int,rnti
ID = ENB_MAC_UE_DL_RAR_PDU_WITH_DATA
DESC = MAC downlink PDU for an UE
+101 -9
View File
@@ -18,6 +18,7 @@
#define DEFAULT_LIVE_PORT 2021
#define NO_PREAMBLE -1
#define NO_SR_RNTI -1
typedef struct {
int socket;
@@ -48,6 +49,10 @@ typedef struct {
int rar_frame;
int rar_subframe;
int rar_data;
/* SR */
int sr_rnti;
int sr_frame;
int sr_subframe;
/* NR traces */
/* NR ul */
@@ -80,6 +85,15 @@ typedef struct {
/* runtime vars */
int cur_mib;
int cur_sib;
/* hack to report UE id:
* each time we see a rnti, we allocate the next ue_id
* (two separate versions for lte and nr)
*/
int lte_rnti_to_ueid[65536];
int lte_next_ue_id;
int nr_rnti_to_ueid[65536];
int nr_next_ue_id;
} ev_data;
/****************************************************************************/
@@ -87,7 +101,8 @@ typedef struct {
/****************************************************************************/
void trace_lte(ev_data *d, int direction, int rnti_type, int rnti,
int frame, int subframe, void *buf, int bufsize, int preamble)
int frame, int subframe, void *buf, int bufsize, int preamble,
int sr_rnti)
{
ssize_t ret;
int fsf;
@@ -102,6 +117,18 @@ void trace_lte(ev_data *d, int direction, int rnti_type, int rnti,
PUTC(&d->buf, MAC_LTE_RNTI_TAG);
PUTC(&d->buf, (rnti>>8) & 255);
PUTC(&d->buf, rnti & 255);
/* put UE id */
if (rnti < 0 || rnti > 65535) { printf("bad rnti!\n"); exit(1); }
/* if no UE id allocated for this rnti then allocate the next one */
if (d->lte_rnti_to_ueid[rnti] == -1) {
d->lte_rnti_to_ueid[rnti] = d->lte_next_ue_id;
d->lte_next_ue_id++;
}
PUTC(&d->buf, MAC_LTE_UEID_TAG);
PUTC(&d->buf, (d->lte_rnti_to_ueid[rnti]>>8) & 255);
PUTC(&d->buf, d->lte_rnti_to_ueid[rnti] & 255);
}
/* for newer version of wireshark? */
@@ -118,6 +145,25 @@ void trace_lte(ev_data *d, int direction, int rnti_type, int rnti,
PUTC(&d->buf, 0); /* rach attempt - always 0 for us (not sure of this) */
}
if (sr_rnti != NO_SR_RNTI) {
PUTC(&d->buf, MAC_LTE_SR_TAG);
PUTC(&d->buf, 0); /* number of items byte 1 */
PUTC(&d->buf, 1); /* number of items byte 2 */
/* put UE id */
if (sr_rnti < 0 || sr_rnti > 65535) { printf("bad sr rnti!\n"); exit(1); }
/* if no UE id allocated for this rnti then allocate the next one */
if (d->lte_rnti_to_ueid[sr_rnti] == -1) {
d->lte_rnti_to_ueid[sr_rnti] = d->lte_next_ue_id;
d->lte_next_ue_id++;
}
PUTC(&d->buf, (d->lte_rnti_to_ueid[sr_rnti]>>8) & 255);
PUTC(&d->buf, d->lte_rnti_to_ueid[sr_rnti] & 255);
PUTC(&d->buf, (sr_rnti>>8) & 255);
PUTC(&d->buf, sr_rnti & 255);
}
PUTC(&d->buf, MAC_LTE_PAYLOAD_TAG);
for (i = 0; i < bufsize; i++)
@@ -135,7 +181,7 @@ void ul(void *_d, event e)
trace_lte(d, DIRECTION_UPLINK, C_RNTI, e.e[d->ul_rnti].i,
e.e[d->ul_frame].i, e.e[d->ul_subframe].i,
e.e[d->ul_data].b, e.e[d->ul_data].bsize,
NO_PREAMBLE);
NO_PREAMBLE, NO_SR_RNTI);
}
void dl(void *_d, event e)
@@ -154,7 +200,7 @@ void dl(void *_d, event e)
e.e[d->dl_rnti].i != 0xffff ? C_RNTI : SI_RNTI, e.e[d->dl_rnti].i,
e.e[d->dl_frame].i, e.e[d->dl_subframe].i,
e.e[d->dl_data].b, e.e[d->dl_data].bsize,
NO_PREAMBLE);
NO_PREAMBLE, NO_SR_RNTI);
}
void mib(void *_d, event e)
@@ -169,7 +215,7 @@ void mib(void *_d, event e)
trace_lte(d, DIRECTION_DOWNLINK, NO_RNTI, 0,
e.e[d->mib_frame].i, e.e[d->mib_subframe].i,
e.e[d->mib_data].b, e.e[d->mib_data].bsize,
NO_PREAMBLE);
NO_PREAMBLE, NO_SR_RNTI);
}
void preamble(void *_d, event e)
@@ -178,7 +224,7 @@ void preamble(void *_d, event e)
trace_lte(d, DIRECTION_UPLINK, NO_RNTI, 0,
e.e[d->preamble_frame].i, e.e[d->preamble_subframe].i,
NULL, 0,
e.e[d->preamble_preamble].i);
e.e[d->preamble_preamble].i, NO_SR_RNTI);
}
void rar(void *_d, event e)
@@ -187,7 +233,16 @@ void rar(void *_d, event e)
trace_lte(d, DIRECTION_DOWNLINK, RA_RNTI, e.e[d->rar_rnti].i,
e.e[d->rar_frame].i, e.e[d->rar_subframe].i,
e.e[d->rar_data].b, e.e[d->rar_data].bsize,
NO_PREAMBLE);
NO_PREAMBLE, NO_SR_RNTI);
}
void sr(void *_d, event e)
{
ev_data *d = _d;
trace_lte(d, DIRECTION_UPLINK, NO_RNTI, 0,
e.e[d->sr_frame].i, e.e[d->sr_subframe].i,
NULL, 0,
NO_PREAMBLE, e.e[d->sr_rnti].i);
}
/****************************************************************************/
@@ -198,6 +253,7 @@ void rar(void *_d, event e)
#define MAC_NR_PAYLOAD_TAG 0x01
#define MAC_NR_RNTI_TAG 0x02
#define MAC_NR_UEID_TAG 0x03
#define MAC_NR_FRAME_SLOT_TAG 0x07
#define NR_FDD_RADIO 1
@@ -225,6 +281,18 @@ void trace_nr(ev_data *d, int direction, int rnti_type, int rnti,
PUTC(&d->buf, MAC_NR_RNTI_TAG);
PUTC(&d->buf, (rnti>>8) & 255);
PUTC(&d->buf, rnti & 255);
/* put UE id */
if (rnti < 0 || rnti > 65535) { printf("bad rnti!\n"); exit(1); }
/* if no UE id allocated for this rnti then allocate the next one */
if (d->nr_rnti_to_ueid[rnti] == -1) {
d->nr_rnti_to_ueid[rnti] = d->nr_next_ue_id;
d->nr_next_ue_id++;
}
PUTC(&d->buf, MAC_NR_UEID_TAG);
PUTC(&d->buf, (d->nr_rnti_to_ueid[rnti]>>8) & 255);
PUTC(&d->buf, d->nr_rnti_to_ueid[rnti] & 255);
}
#if 0
@@ -298,7 +366,7 @@ void nr_rar(void *_d, event e)
/****************************************************************************/
void setup_data(ev_data *d, void *database, int ul_id, int dl_id, int mib_id,
int preamble_id, int rar_id,
int preamble_id, int rar_id, int sr_id,
int nr_ul_id, int nr_dl_id, int nr_mib_id, int nr_rar_id)
{
database_event_format f;
@@ -321,6 +389,9 @@ void setup_data(ev_data *d, void *database, int ul_id, int dl_id, int mib_id,
d->rar_frame = -1;
d->rar_subframe = -1;
d->rar_data = -1;
d->sr_rnti = -1;
d->sr_frame = -1;
d->sr_subframe = -1;
d->nr_ul_rnti = -1;
d->nr_ul_frame = -1;
@@ -407,6 +478,18 @@ void setup_data(ev_data *d, void *database, int ul_id, int dl_id, int mib_id,
if (d->rar_rnti == -1 || d->rar_frame == -1 || d->rar_subframe == -1 ||
d->rar_data == -1) goto error;
/* sr: rnti, frame, subframe */
f = get_format(database, sr_id);
for (i = 0; i < f.count; i++) {
G("rnti", "int", d->sr_rnti);
G("frame", "int", d->sr_frame);
G("subframe", "int", d->sr_subframe);
}
if (d->sr_rnti == -1 || d->sr_frame == -1 || d->sr_subframe == -1)
goto error;
/* NR ul: rnti, frame, slot, data */
f = get_format(database, nr_ul_id);
@@ -530,6 +613,7 @@ int main(int n, char **v)
int i;
int ul_id, dl_id, mib_id, preamble_id, rar_id;
int nr_ul_id, nr_dl_id, nr_mib_id, nr_rar_id;
int sr_id;
ev_data d;
char *ip = DEFAULT_IP;
int port = DEFAULT_PORT;
@@ -538,6 +622,11 @@ int main(int n, char **v)
int live = 0;
memset(&d, 0, sizeof(ev_data));
for (i = 0; i < 65536; i++) {
d.lte_rnti_to_ueid[i] = -1;
d.nr_rnti_to_ueid[i] = -1;
}
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; }
@@ -599,6 +688,7 @@ int main(int n, char **v)
on_off(database, "ENB_PHY_MIB", is_on, 1);
on_off(database, "ENB_PHY_INITIATE_RA_PROCEDURE", is_on, 1);
on_off(database, "ENB_MAC_UE_DL_RAR_PDU_WITH_DATA", is_on, 1);
on_off(database, "ENB_MAC_SCHEDULING_REQUEST", is_on, 1);
on_off(database, "GNB_MAC_UL_PDU_WITH_DATA", is_on, 1);
on_off(database, "GNB_MAC_DL_PDU_WITH_DATA", is_on, 1);
@@ -621,13 +711,14 @@ int main(int n, char **v)
mib_id = event_id_from_name(database, "ENB_PHY_MIB");
preamble_id = event_id_from_name(database, "ENB_PHY_INITIATE_RA_PROCEDURE");
rar_id = event_id_from_name(database, "ENB_MAC_UE_DL_RAR_PDU_WITH_DATA");
sr_id = event_id_from_name(database, "ENB_MAC_SCHEDULING_REQUEST");
nr_ul_id = event_id_from_name(database, "GNB_MAC_UL_PDU_WITH_DATA");
nr_dl_id = event_id_from_name(database, "GNB_MAC_DL_PDU_WITH_DATA");
nr_mib_id = event_id_from_name(database, "GNB_PHY_MIB");
nr_rar_id = event_id_from_name(database, "GNB_MAC_DL_RAR_PDU_WITH_DATA");
setup_data(&d, database, ul_id, dl_id, mib_id, preamble_id, rar_id,
setup_data(&d, database, ul_id, dl_id, mib_id, preamble_id, rar_id, sr_id,
nr_ul_id, nr_dl_id, nr_mib_id, nr_rar_id);
register_handler_function(h, ul_id, ul, &d);
@@ -635,6 +726,7 @@ int main(int n, char **v)
register_handler_function(h, mib_id, mib, &d);
register_handler_function(h, preamble_id, preamble, &d);
register_handler_function(h, rar_id, rar, &d);
register_handler_function(h, sr_id, sr, &d);
register_handler_function(h, nr_ul_id, nr_ul, &d);
register_handler_function(h, nr_dl_id, nr_dl, &d);
@@ -662,7 +754,7 @@ int main(int n, char **v)
if (e.type == -1) break;
if (!(e.type == ul_id || e.type == dl_id || e.type == mib_id ||
e.type == preamble_id || e.type == rar_id ||
e.type == preamble_id || e.type == rar_id || e.type == sr_id ||
e.type == nr_ul_id || e.type == nr_dl_id ||
e.type == nr_mib_id || e.type == nr_rar_id)) continue;
+14 -26
View File
@@ -11,26 +11,7 @@
*
* Copyright (C) 2009 Martin Mathieson. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE
* SPDX-License-Identifier: BSD-2-Clause
*/
#ifndef __COMMON_UTILS_T_TRACER_PACKET_MAC_LTE__H__
@@ -67,9 +48,9 @@
/* and implemented by this dissector, using the definitions */
/* below. A link to an example program showing you how to encode */
/* these headers and send LTE MAC PDUs on a UDP socket is */
/* provided at https://wiki.wireshark.org/MAC-LTE */
/* provided at https://wiki.wireshark.org/MAC-LTE */
/* */
/* A heuristic dissecter (enabled by a preference) will */
/* A heuristic dissector (enabled by a preference) will */
/* recognise a signature at the beginning of these frames. */
/*****************************************************************/
@@ -126,18 +107,25 @@
MCS index (1 byte), redundancy version (1 byte), resource block length (1 byte),
HARQ id (1 byte), NDI (1 byte), TB (1 byte), DL reTx (1 byte) */
#define MAC_LTE_SIMULT_PUCCH_PUSCH_PCELL 0x0C
#define MAC_LTE_SIMULT_PUCCH_PUSCH_PCELL_TAG 0x0C
/* 0 byte */
#define MAC_LTE_SIMULT_PUCCH_PUSCH_PSCELL 0x0D
#define MAC_LTE_SIMULT_PUCCH_PUSCH_PSCELL_TAG 0x0D
/* 0 byte */
#define MAC_LTE_CE_MODE 0x0E
#define MAC_LTE_CE_MODE_TAG 0x0E
/* 1 byte containing mac_lte_ce_mode enum value */
#define MAC_LTE_NB_MODE 0x0F
#define MAC_LTE_NB_MODE_TAG 0x0F
/* 1 byte containing mac_lte_nb_mode enum value */
#define MAC_LTE_N_UL_RB_TAG 0x10
/* 1 byte containing the number of UL resource blocks: 6, 15, 25, 50, 75 or 100 */
#define MAC_LTE_SR_TAG 0x11
/* 2 bytes for the number of items, followed by that number of ueid, rnti (2 bytes each) */
/* MAC PDU. Following this tag comes the actual MAC PDU (there is no length, the PDU
continues until the end of the frame) */
#define MAC_LTE_PAYLOAD_TAG 0x01
View File
-370
View File
@@ -1,370 +0,0 @@
Installation Instructions
*************************
Copyright (C) 1994-1996, 1999-2002, 2004-2013 Free Software Foundation,
Inc.
Copying and distribution of this file, with or without modification,
are permitted in any medium without royalty provided the copyright
notice and this notice are preserved. This file is offered as-is,
without warranty of any kind.
Basic Installation
==================
Briefly, the shell command `./configure && make && make install'
should configure, build, and install this package. The following
more-detailed instructions are generic; see the `README' file for
instructions specific to this package. Some packages provide this
`INSTALL' file but do not implement all of the features documented
below. The lack of an optional feature in a given package is not
necessarily a bug. More recommendations for GNU packages can be found
in *note Makefile Conventions: (standards)Makefile Conventions.
The `configure' shell script attempts to guess correct values for
various system-dependent variables used during compilation. It uses
those values to create a `Makefile' in each directory of the package.
It may also create one or more `.h' files containing system-dependent
definitions. Finally, it creates a shell script `config.status' that
you can run in the future to recreate the current configuration, and a
file `config.log' containing compiler output (useful mainly for
debugging `configure').
It can also use an optional file (typically called `config.cache'
and enabled with `--cache-file=config.cache' or simply `-C') that saves
the results of its tests to speed up reconfiguring. Caching is
disabled by default to prevent problems with accidental use of stale
cache files.
If you need to do unusual things to compile the package, please try
to figure out how `configure' could check whether to do them, and mail
diffs or instructions to the address given in the `README' so they can
be considered for the next release. If you are using the cache, and at
some point `config.cache' contains results you don't want to keep, you
may remove or edit it.
The file `configure.ac' (or `configure.in') is used to create
`configure' by a program called `autoconf'. You need `configure.ac' if
you want to change it or regenerate `configure' using a newer version
of `autoconf'.
The simplest way to compile this package is:
1. `cd' to the directory containing the package's source code and type
`./configure' to configure the package for your system.
Running `configure' might take a while. While running, it prints
some messages telling which features it is checking for.
2. Type `make' to compile the package.
3. Optionally, type `make check' to run any self-tests that come with
the package, generally using the just-built uninstalled binaries.
4. Type `make install' to install the programs and any data files and
documentation. When installing into a prefix owned by root, it is
recommended that the package be configured and built as a regular
user, and only the `make install' phase executed with root
privileges.
5. Optionally, type `make installcheck' to repeat any self-tests, but
this time using the binaries in their final installed location.
This target does not install anything. Running this target as a
regular user, particularly if the prior `make install' required
root privileges, verifies that the installation completed
correctly.
6. You can remove the program binaries and object files from the
source code directory by typing `make clean'. To also remove the
files that `configure' created (so you can compile the package for
a different kind of computer), type `make distclean'. There is
also a `make maintainer-clean' target, but that is intended mainly
for the package's developers. If you use it, you may have to get
all sorts of other programs in order to regenerate files that came
with the distribution.
7. Often, you can also type `make uninstall' to remove the installed
files again. In practice, not all packages have tested that
uninstallation works correctly, even though it is required by the
GNU Coding Standards.
8. Some packages, particularly those that use Automake, provide `make
distcheck', which can by used by developers to test that all other
targets like `make install' and `make uninstall' work correctly.
This target is generally not run by end users.
Compilers and Options
=====================
Some systems require unusual options for compilation or linking that
the `configure' script does not know about. Run `./configure --help'
for details on some of the pertinent environment variables.
You can give `configure' initial values for configuration parameters
by setting variables in the command line or in the environment. Here
is an example:
./configure CC=c99 CFLAGS=-g LIBS=-lposix
*Note Defining Variables::, for more details.
Compiling For Multiple Architectures
====================================
You can compile the package for more than one kind of computer at the
same time, by placing the object files for each architecture in their
own directory. To do this, you can use GNU `make'. `cd' to the
directory where you want the object files and executables to go and run
the `configure' script. `configure' automatically checks for the
source code in the directory that `configure' is in and in `..'. This
is known as a "VPATH" build.
With a non-GNU `make', it is safer to compile the package for one
architecture at a time in the source code directory. After you have
installed the package for one architecture, use `make distclean' before
reconfiguring for another architecture.
On MacOS X 10.5 and later systems, you can create libraries and
executables that work on multiple system types--known as "fat" or
"universal" binaries--by specifying multiple `-arch' options to the
compiler but only a single `-arch' option to the preprocessor. Like
this:
./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
CPP="gcc -E" CXXCPP="g++ -E"
This is not guaranteed to produce working output in all cases, you
may have to build one architecture at a time and combine the results
using the `lipo' tool if you have problems.
Installation Names
==================
By default, `make install' installs the package's commands under
`/usr/local/bin', include files under `/usr/local/include', etc. You
can specify an installation prefix other than `/usr/local' by giving
`configure' the option `--prefix=PREFIX', where PREFIX must be an
absolute file name.
You can specify separate installation prefixes for
architecture-specific files and architecture-independent files. If you
pass the option `--exec-prefix=PREFIX' to `configure', the package uses
PREFIX as the prefix for installing programs and libraries.
Documentation and other data files still use the regular prefix.
In addition, if you use an unusual directory layout you can give
options like `--bindir=DIR' to specify different values for particular
kinds of files. Run `configure --help' for a list of the directories
you can set and what kinds of files go in them. In general, the
default for these options is expressed in terms of `${prefix}', so that
specifying just `--prefix' will affect all of the other directory
specifications that were not explicitly provided.
The most portable way to affect installation locations is to pass the
correct locations to `configure'; however, many packages provide one or
both of the following shortcuts of passing variable assignments to the
`make install' command line to change installation locations without
having to reconfigure or recompile.
The first method involves providing an override variable for each
affected directory. For example, `make install
prefix=/alternate/directory' will choose an alternate location for all
directory configuration variables that were expressed in terms of
`${prefix}'. Any directories that were specified during `configure',
but not in terms of `${prefix}', must each be overridden at install
time for the entire installation to be relocated. The approach of
makefile variable overrides for each directory variable is required by
the GNU Coding Standards, and ideally causes no recompilation.
However, some platforms have known limitations with the semantics of
shared libraries that end up requiring recompilation when using this
method, particularly noticeable in packages that use GNU Libtool.
The second method involves providing the `DESTDIR' variable. For
example, `make install DESTDIR=/alternate/directory' will prepend
`/alternate/directory' before all installation names. The approach of
`DESTDIR' overrides is not required by the GNU Coding Standards, and
does not work on platforms that have drive letters. On the other hand,
it does better at avoiding recompilation issues, and works well even
when some directory options were not specified in terms of `${prefix}'
at `configure' time.
Optional Features
=================
If the package supports it, you can cause programs to be installed
with an extra prefix or suffix on their names by giving `configure' the
option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
Some packages pay attention to `--enable-FEATURE' options to
`configure', where FEATURE indicates an optional part of the package.
They may also pay attention to `--with-PACKAGE' options, where PACKAGE
is something like `gnu-as' or `x' (for the X Window System). The
`README' should mention any `--enable-' and `--with-' options that the
package recognizes.
For packages that use the X Window System, `configure' can usually
find the X include and library files automatically, but if it doesn't,
you can use the `configure' options `--x-includes=DIR' and
`--x-libraries=DIR' to specify their locations.
Some packages offer the ability to configure how verbose the
execution of `make' will be. For these packages, running `./configure
--enable-silent-rules' sets the default to minimal output, which can be
overridden with `make V=1'; while running `./configure
--disable-silent-rules' sets the default to verbose, which can be
overridden with `make V=0'.
Particular systems
==================
On HP-UX, the default C compiler is not ANSI C compatible. If GNU
CC is not installed, it is recommended to use the following options in
order to use an ANSI C compiler:
./configure CC="cc -Ae -D_XOPEN_SOURCE=500"
and if that doesn't work, install pre-built binaries of GCC for HP-UX.
HP-UX `make' updates targets which have the same time stamps as
their prerequisites, which makes it generally unusable when shipped
generated files such as `configure' are involved. Use GNU `make'
instead.
On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
parse its `<wchar.h>' header file. The option `-nodtk' can be used as
a workaround. If GNU CC is not installed, it is therefore recommended
to try
./configure CC="cc"
and if that doesn't work, try
./configure CC="cc -nodtk"
On Solaris, don't put `/usr/ucb' early in your `PATH'. This
directory contains several dysfunctional programs; working variants of
these programs are available in `/usr/bin'. So, if you need `/usr/ucb'
in your `PATH', put it _after_ `/usr/bin'.
On Haiku, software installed for all users goes in `/boot/common',
not `/usr/local'. It is recommended to use the following options:
./configure --prefix=/boot/common
Specifying the System Type
==========================
There may be some features `configure' cannot figure out
automatically, but needs to determine by the type of machine the package
will run on. Usually, assuming the package is built to be run on the
_same_ architectures, `configure' can figure that out, but if it prints
a message saying it cannot guess the machine type, give it the
`--build=TYPE' option. TYPE can either be a short name for the system
type, such as `sun4', or a canonical name which has the form:
CPU-COMPANY-SYSTEM
where SYSTEM can have one of these forms:
OS
KERNEL-OS
See the file `config.sub' for the possible values of each field. If
`config.sub' isn't included in this package, then this package doesn't
need to know the machine type.
If you are _building_ compiler tools for cross-compiling, you should
use the option `--target=TYPE' to select the type of system they will
produce code for.
If you want to _use_ a cross compiler, that generates code for a
platform different from the build platform, you should specify the
"host" platform (i.e., that on which the generated programs will
eventually be run) with `--host=TYPE'.
Sharing Defaults
================
If you want to set default values for `configure' scripts to share,
you can create a site shell script called `config.site' that gives
default values for variables like `CC', `cache_file', and `prefix'.
`configure' looks for `PREFIX/share/config.site' if it exists, then
`PREFIX/etc/config.site' if it exists. Or, you can set the
`CONFIG_SITE' environment variable to the location of the site script.
A warning: not all `configure' scripts look for a site script.
Defining Variables
==================
Variables not defined in a site shell script can be set in the
environment passed to `configure'. However, some packages may run
configure again during the build, and the customized values of these
variables may be lost. In order to avoid this problem, you should set
them in the `configure' command line, using `VAR=value'. For example:
./configure CC=/usr/local2/bin/gcc
causes the specified `gcc' to be used as the C compiler (unless it is
overridden in the site shell script).
Unfortunately, this technique does not work for `CONFIG_SHELL' due to
an Autoconf limitation. Until the limitation is lifted, you can use
this workaround:
CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash
`configure' Invocation
======================
`configure' recognizes the following options to control how it
operates.
`--help'
`-h'
Print a summary of all of the options to `configure', and exit.
`--help=short'
`--help=recursive'
Print a summary of the options unique to this package's
`configure', and exit. The `short' variant lists options used
only in the top level, while the `recursive' variant lists options
also present in any nested packages.
`--version'
`-V'
Print the version of Autoconf used to generate the `configure'
script, and exit.
`--cache-file=FILE'
Enable the cache: use and save the results of the tests in FILE,
traditionally `config.cache'. FILE defaults to `/dev/null' to
disable caching.
`--config-cache'
`-C'
Alias for `--cache-file=config.cache'.
`--quiet'
`--silent'
`-q'
Do not print messages saying which checks are being made. To
suppress all normal output, redirect it to `/dev/null' (any error
messages will still be shown).
`--srcdir=DIR'
Look for the package's source code in directory DIR. Usually
`configure' can determine that directory automatically.
`--prefix=DIR'
Use DIR as the installation prefix. *note Installation Names::
for more details, including other options available for fine-tuning
the installation locations.
`--no-create'
`-n'
Run the configure checks, but stop before creating any output
files.
`configure' also accepts some other, not widely useful, options. Run
`configure --help' for more details.
-17
View File
@@ -1,17 +0,0 @@
AM_CFLAGS = \
@ADD_CFLAGS@ \
-I$(top_srcdir)/common \
-I$(top_srcdir)/libparser \
-I$(top_srcdir)/libresolver \
-I$(top_srcdir)/libbuffers \
-I$(top_srcdir)/libui
SUBDIRS = libparser libresolver libbuffers libui .
itti_analyzer_LDADD = \
$(top_builddir)/libui/libui.la \
$(top_builddir)/libparser/libparser.la \
$(top_builddir)/libresolver/libresolver.la \
$(top_builddir)/libbuffers/libbuffers.la
bin_PROGRAMS = itti_analyzer
View File
-14
View File
@@ -1,14 +0,0 @@
To run itti_analyzer, please perform the following actions:
1) apt-get install autotools-dev automake libtool
2) libtoolize
3) ./autogen.sh
4) ./configure
5) make
6) ./itti_analyzer
-6
View File
@@ -1,6 +0,0 @@
#! /bin/sh
aclocal \
&& autoheader \
&& automake --add-missing \
&& autoconf
@@ -1,73 +0,0 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
/** @brief Intertask Interface common types
* Contains type definitions used for generating and parsing ITTI messages.
* @author Laurent Winckel <laurent.winckel@eurecom.fr>
*/
#ifndef _ITTI_TYPES_H_
#define _ITTI_TYPES_H_
#include <stdint.h>
#define CHARS_TO_UINT32(c1, c2, c3, c4) (((c4) << 24) | ((c3) << 16) | ((c2) << 8) | (c1))
#define MESSAGE_NUMBER_CHAR_FORMAT "%11u"
/* Intertask message types */
enum itti_message_types_e
{
ITTI_DUMP_XML_DEFINITION = CHARS_TO_UINT32 ('\n', 'I', 'x', 'd'),
ITTI_DUMP_XML_DEFINITION_END = CHARS_TO_UINT32 ('i', 'X', 'D', '\n'),
ITTI_DUMP_MESSAGE_TYPE = CHARS_TO_UINT32 ('\n', 'I', 'm', 's'),
ITTI_DUMP_MESSAGE_TYPE_END = CHARS_TO_UINT32 ('i', 'M', 'S', '\n'),
ITTI_STATISTIC_MESSAGE_TYPE = CHARS_TO_UINT32 ('\n', 'I', 's', 't'),
ITTI_STATISTIC_MESSAGE_TYPE_END = CHARS_TO_UINT32 ('i', 'S', 'T', '\n'),
/* This signal is not meant to be used by remote analyzer */
ITTI_DUMP_EXIT_SIGNAL = CHARS_TO_UINT32 ('e', 'X', 'I', 'T'),
};
typedef uint32_t itti_message_types_t;
/* Message header is the common part that should never change between
* remote process and this one.
*/
typedef struct {
/* The size of this structure */
uint32_t message_size;
itti_message_types_t message_type;
} itti_socket_header_t;
typedef struct {
char message_number_char[12]; /* 9 chars are needed to store an unsigned 32 bits value in decimal, but must be a multiple of 32 bits to avoid alignment issues */
} itti_signal_header_t;
#define INSTANCE_DEFAULT (UINT16_MAX - 1)
#define INSTANCE_ALL (UINT16_MAX)
typedef uint16_t instance_t;
#endif
-56
View File
@@ -1,56 +0,0 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
/*
* logs.h
*
* Created on: Nov 22, 2013
* Author: Laurent Winckel
*/
#ifndef LOGS_H_
#define LOGS_H_
/* Added definition of the g_info log function to complete the set of log functions from "gmessages.h" */
#include <glib/gmessages.h>
#ifdef G_HAVE_ISO_VARARGS
#define g_info(...) g_log (G_LOG_DOMAIN, \
G_LOG_LEVEL_INFO, \
__VA_ARGS__)
#else
static void
g_info (const gchar *format,
...)
{
va_list args;
va_start (args, format);
g_logv (G_LOG_DOMAIN, G_LOG_LEVEL_INFO, format, args);
va_end (args);
}
#endif
#endif /* LOGS_H_ */
-71
View File
@@ -1,71 +0,0 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#include <errno.h>
#include <string.h>
#ifndef RC_H_
#define RC_H_
#define RC_OK 0
#define RC_FAIL -1
#define RC_BAD_PARAM -2
#define RC_NULL_POINTER -3
static const char * const rc_strings[] =
{"Ok", "fail", "bad parameter", "null pointer"};
#define CHECK_FCT(fCT) \
do { \
int rET; \
if ((rET = fCT) != RC_OK) { \
fprintf(stderr, #fCT" has failed (%s:%d)\n", __FILE__, __LINE__); \
return rET; \
} \
} while(0)
#define CHECK_FCT_POSIX(fCT) \
do { \
if (fCT == -1) { \
fprintf(stderr, #fCT" has failed (%d:%s) (%s:%d)\n", errno, \
strerror(errno), __FILE__, __LINE__); \
return RC_FAIL; \
} \
} while(0)
#define CHECK_FCT_DO(fCT, dO) \
do { \
int rET; \
if ((rET = fCT) != RC_OK) { \
fprintf(stderr, #fCT" has returned %d (%s:%d)\n", rET, __FILE__, __LINE__); \
dO; \
} \
} while(0)
#define CHECK_BUFFER(bUFFER) \
do { \
if ((bUFFER) == NULL) { \
fprintf(stderr, #bUFFER" is NULL (%s:%d)\n", __FILE__, __LINE__); \
return RC_NULL_POINTER; \
} \
} while(0)
#endif /* RC_H_ */
-97
View File
@@ -1,97 +0,0 @@
AC_PREREQ([2.68])
define([svnversion], esyscmd([sh -c "svnversion ..|tr -d '\n'"]))
AC_DEFINE(SVN_REVISION, "svnversion", [SVN Revision])
AC_INIT([itti_analyzer], [0.2.svnversion], [openair_admin@eurecom.fr])
AC_CANONICAL_BUILD
AC_CANONICAL_TARGET
AM_INIT_AUTOMAKE([1.11 silent-rules])
AC_CONFIG_MACRO_DIR([m4])
AC_CONFIG_HEADERS([config.h])
AM_MAINTAINER_MODE
AM_SILENT_RULES([yes])
AM_PROG_LIBTOOL
AC_PROG_RANLIB
AC_PROG_CXX
AC_FUNC_ALLOCA
AC_FUNC_MALLOC
AC_FUNC_REALLOC
AC_TYPE_SIZE_T
AC_TYPE_SSIZE_T
AC_TYPE_INT8_T
AC_TYPE_INT16_T
AC_TYPE_INT32_T
AC_TYPE_INT64_T
AC_TYPE_UINT8_T
AC_TYPE_UINT16_T
AC_TYPE_UINT32_T
AC_TYPE_UINT64_T
AC_CHECK_FUNCS([memset])
AC_CHECK_FUNCS([socket])
AC_CHECK_FUNCS([strdup])
AC_CHECK_FUNCS([strerror])
AC_CHECK_FUNCS([select])
AC_CHECK_FUNCS([strstr])
AC_CHECK_HEADERS([arpa/inet.h])
AC_CHECK_HEADERS([fcntl.h])
AC_CHECK_HEADERS([libintl.h])
AC_CHECK_HEADERS([malloc.h])
AC_CHECK_HEADERS([stddef.h])
AC_CHECK_HEADERS([netinet/in.h])
AC_CHECK_LIB(m, log10)
PKG_CHECK_MODULES(XML2, [libxml-2.0 >= 2.7.8], [HAVE_XML2=true], [AC_MSG_ERROR(lixml-2.0 not installed)])
CFLAGS="$CFLAGS $XML2_CFLAGS"
LIBS="$LIBS $XML2_LIBS"
AM_PATH_GTK_3_0(3.0.0, [], AC_MSG_ERROR(Requirement not met: gtk >= 3.0.0))
CFLAGS="$CFLAGS $GTK_CFLAGS"
LIBS="$LIBS $GTK_LIBS"
dnl Add these flags
CFLAGS="$CFLAGS -Wall"
CFLAGS="$CFLAGS -Wshadow"
CFLAGS="$CFLAGS -Wcast-align"
CFLAGS="$CFLAGS -Wchar-subscripts"
CFLAGS="$CFLAGS -Wmissing-prototypes"
CFLAGS="$CFLAGS -Wmissing-declarations"
CFLAGS="$CFLAGS -Werror=implicit-function-declaration"
AC_SUBST([AM_CFLAGS])
AC_SUBST(ADD_CFLAGS)
dnl *** Autoconf support ***
AC_ARG_ENABLE(autoconf,
[ --disable-autoconf disable automatic generation of configure script ],
enable_autoconf=$enableval, enable_autoconf=yes
)
AC_PATH_PROG(AUTOCONF, autoconf, @echo autoconf not available)
AC_PATH_PROG(AUTOHEADER, autoheader, @echo autoheader not available)
if test -z "$AUTOCONF"; then enable_autoconf=no ; fi
if test -z "$AUTOHEADER"; then enable_autoconf=no ; fi
if test x$enable_autoconf = xyes; then
CONFIGURE_DEPENDS="configure.in aclocal.m4"
fi
AC_SUBST(CONFIGURE_DEPENDS)
AC_CONFIG_FILES(
libbuffers/Makefile \
libparser/Makefile \
libresolver/Makefile \
libui/Makefile \
Makefile \
)
AC_OUTPUT
-135
View File
@@ -1,135 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<filters>
<messages>
<INITIALIZE_MESSAGE enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<ACTIVATE_MESSAGE enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<DEACTIVATE_MESSAGE enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<TERMINATE_MESSAGE enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<MESSAGE_TEST enabled="0" foreground_color="#585858" background_color="#ffffff"/>
<ERROR_LOG enabled="1" foreground_color="#000000" background_color="#ff8080"/>
<WARNING_LOG enabled="1" foreground_color="#303030" background_color="#fff050"/>
<NOTICE_LOG enabled="0" foreground_color="#585858" background_color="#ffffa0"/>
<INFO_LOG enabled="0" foreground_color="#585858" background_color="#ffffff"/>
<DEBUG_LOG enabled="0" foreground_color="#585858" background_color="#ffffff"/>
<GENERIC_LOG enabled="1" foreground_color="#246b24" background_color="#ffffff"/>
<TIMER_HAS_EXPIRED enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<PHY_DEACTIVATE_REQ enabled="1" foreground_color="#000000" background_color="#bef2ff"/>
<PHY_FIND_CELL_REQ enabled="1" foreground_color="#000000" background_color="#bef2ff"/>
<PHY_FIND_NEXT_CELL_REQ enabled="1" foreground_color="#000000" background_color="#bef2ff"/>
<PHY_FIND_CELL_IND enabled="1" foreground_color="#585858" background_color="#bef2ff"/>
<RRC_MAC_IN_SYNC_IND enabled="0" foreground_color="#585858" background_color="#ffffff"/>
<RRC_MAC_OUT_OF_SYNC_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<RRC_MAC_BCCH_DATA_REQ enabled="0" foreground_color="#585858" background_color="#ffffff"/>
<RRC_MAC_BCCH_DATA_IND enabled="0" foreground_color="#585858" background_color="#ffffff"/>
<RRC_MAC_CCCH_DATA_REQ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<RRC_MAC_CCCH_DATA_CNF enabled="0" foreground_color="#585858" background_color="#ffffff"/>
<RRC_MAC_CCCH_DATA_IND enabled="1" foreground_color="#585858" background_color="#dfb9fc"/>
<RRC_MAC_MCCH_DATA_REQ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<RRC_MAC_MCCH_DATA_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<RRC_DCCH_DATA_REQ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<RRC_DCCH_DATA_IND enabled="1" foreground_color="#585858" background_color="#a7b1de"/>
<RRC_STATE_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<RRC_CONFIGURATION_REQ enabled="1" foreground_color="#ffffff" background_color="#4d2a73"/>
<NAS_CELL_SELECTION_REQ enabled="1" foreground_color="#ffffff" background_color="#2d315c"/>
<NAS_CONN_ESTABLI_REQ enabled="1" foreground_color="#ffffff" background_color="#2d315c"/>
<NAS_UPLINK_DATA_REQ enabled="1" foreground_color="#ffffff" background_color="#2d315c"/>
<NAS_RAB_ESTABLI_RSP enabled="1" foreground_color="#ffffff" background_color="#2d315c"/>
<NAS_CELL_SELECTION_CNF enabled="1" foreground_color="#e0e0e0" background_color="#2d315c"/>
<NAS_CELL_SELECTION_IND enabled="1" foreground_color="#e0e0e0" background_color="#2d315c"/>
<NAS_PAGING_IND enabled="1" foreground_color="#e0e0e0" background_color="#2d315c"/>
<NAS_CONN_ESTABLI_CNF enabled="1" foreground_color="#e0e0e0" background_color="#2d315c"/>
<NAS_CONN_RELEASE_IND enabled="1" foreground_color="#e0e0e0" background_color="#2d315c"/>
<NAS_UPLINK_DATA_CNF enabled="1" foreground_color="#e0e0e0" background_color="#2d315c"/>
<NAS_DOWNLINK_DATA_IND enabled="1" foreground_color="#e0e0e0" background_color="#2d315c"/>
<S1AP_REGISTER_ENB_REQ enabled="1" foreground_color="#000000" background_color="#cbffb1"/>
<S1AP_REGISTER_ENB_CNF enabled="1" foreground_color="#585858" background_color="#cbffb1"/>
<S1AP_DEREGISTERED_ENB_IND enabled="1" foreground_color="#585858" background_color="#cbffb1"/>
<S1AP_NAS_FIRST_REQ enabled="1" foreground_color="#000000" background_color="#cbffb1"/>
<S1AP_UPLINK_NAS enabled="1" foreground_color="#585858" background_color="#cbffb1"/>
<S1AP_UE_CAPABILITIES_IND enabled="1" foreground_color="#585858" background_color="#cbffb1"/>
<S1AP_INITIAL_CONTEXT_SETUP_RESP enabled="1" foreground_color="#19431e" background_color="#cbffb1"/>
<S1AP_INITIAL_CONTEXT_SETUP_FAIL enabled="1" foreground_color="#585858" background_color="#cbffb1"/>
<S1AP_NAS_NON_DELIVERY_IND enabled="1" foreground_color="#585858" background_color="#cbffb1"/>
<S1AP_UE_CONTEXT_RELEASE_RESP enabled="1" foreground_color="#585858" background_color="#cbffb1"/>
<S1AP_UE_CTXT_MODIFICATION_RESP enabled="1" foreground_color="#585858" background_color="#cbffb1"/>
<S1AP_UE_CTXT_MODIFICATION_FAIL enabled="1" foreground_color="#585858" background_color="#cbffb1"/>
<S1AP_DOWNLINK_NAS enabled="1" foreground_color="#585858" background_color="#cbffb1"/>
<S1AP_INITIAL_CONTEXT_SETUP_REQ enabled="1" foreground_color="#000000" background_color="#cbffb1"/>
<S1AP_UE_CTXT_MODIFICATION_REQ enabled="1" foreground_color="#000000" background_color="#cbffb1"/>
<S1AP_PAGING_IND enabled="1" foreground_color="#585858" background_color="#cbffb1"/>
<S1AP_UE_CONTEXT_RELEASE_REQ enabled="1" foreground_color="#000000" background_color="#cbffb1"/>
<SCTP_NEW_ASSOCIATION_REQ enabled="0" foreground_color="#000000" background_color="#aefeff"/>
<SCTP_NEW_ASSOCIATION_RESP enabled="0" foreground_color="#585858" background_color="#aefeff"/>
<SCTP_NEW_ASSOCIATION_IND enabled="1" foreground_color="#585858" background_color="#aefeff"/>
<SCTP_REGISTER_UPPER_LAYER enabled="1" foreground_color="#585858" background_color="#aefeff"/>
<SCTP_DATA_REQ enabled="1" foreground_color="#000000" background_color="#aefeff"/>
<SCTP_DATA_IND enabled="1" foreground_color="#585858" background_color="#aefeff"/>
<RRC_RAL_SYSTEM_CONFIGURATION_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<RRC_RAL_SYSTEM_INFORMATION_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<RRC_RAL_SCAN_REQ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<RRC_RAL_SCAN_CONF enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<RRC_RAL_CONFIGURE_THRESHOLD_REQ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<RRC_RAL_CONFIGURE_THRESHOLD_CONF enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<RRC_RAL_MEASUREMENT_REPORT_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<RRC_RAL_CONNECTION_ESTABLISHMENT_REQ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<RRC_RAL_CONNECTION_ESTABLISHMENT_CONF enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<RRC_RAL_CONNECTION_ESTABLISHMENT_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<RRC_RAL_CONNECTION_REESTABLISHMENT_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<RRC_RAL_CONNECTION_RECONFIGURATION_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<RRC_RAL_CONNECTION_RECONFIGURATION_HO_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<RRC_RAL_CONNECTION_RELEASE_REQ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<RRC_RAL_CONNECTION_RELEASE_CONF enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<RRC_RAL_CONNECTION_RELEASE_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<NAS_UPLINK_DATA_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
</messages>
<origin_tasks>
<TASK_UNKNOWN enabled="1"/>
<TASK_TIMER enabled="1"/>
<TASK_L2L1 enabled="1"/>
<TASK_BM enabled="1"/>
<TASK_PHY_ENB enabled="1"/>
<TASK_MAC_ENB enabled="1"/>
<TASK_RLC_ENB enabled="1"/>
<TASK_PDCP_ENB enabled="1"/>
<TASK_DATA_FORWARDING enabled="1"/>
<TASK_END_MARKER enabled="1"/>
<TASK_RRC_ENB enabled="1"/>
<TASK_RAL_ENB enabled="1"/>
<TASK_S1AP enabled="1"/>
<TASK_X2AP enabled="1"/>
<TASK_SCTP enabled="1"/>
<TASK_ENB_APP enabled="1"/>
<TASK_PHY_UE enabled="1"/>
<TASK_MAC_UE enabled="1"/>
<TASK_RLC_UE enabled="1"/>
<TASK_PDCP_UE enabled="1"/>
<TASK_RRC_UE enabled="1"/>
<TASK_NAS_UE enabled="1"/>
<TASK_RAL_UE enabled="1"/>
</origin_tasks>
<destination_tasks>
<TASK_UNKNOWN enabled="1"/>
<TASK_TIMER enabled="1"/>
<TASK_L2L1 enabled="1"/>
<TASK_BM enabled="1"/>
<TASK_PHY_ENB enabled="1"/>
<TASK_MAC_ENB enabled="1"/>
<TASK_RLC_ENB enabled="1"/>
<TASK_PDCP_ENB enabled="1"/>
<TASK_DATA_FORWARDING enabled="1"/>
<TASK_END_MARKER enabled="1"/>
<TASK_RRC_ENB enabled="1"/>
<TASK_RAL_ENB enabled="1"/>
<TASK_S1AP enabled="1"/>
<TASK_X2AP enabled="1"/>
<TASK_SCTP enabled="1"/>
<TASK_ENB_APP enabled="1"/>
<TASK_PHY_UE enabled="1"/>
<TASK_MAC_UE enabled="1"/>
<TASK_RLC_UE enabled="1"/>
<TASK_PDCP_UE enabled="1"/>
<TASK_RRC_UE enabled="1"/>
<TASK_NAS_UE enabled="1"/>
<TASK_RAL_UE enabled="1"/>
</destination_tasks>
</filters>
-131
View File
@@ -1,131 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<filters>
<messages>
<ACTIVATE_MESSAGE enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<DEACTIVATE_MESSAGE enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<DEBUG_LOG enabled="0" foreground_color="#585858" background_color="#ffffff"/>
<ERROR_LOG enabled="1" foreground_color="#000000" background_color="#ff8080"/>
<GENERIC_LOG enabled="1" foreground_color="#246b24" background_color="#ffffff"/>
<GTPV1U_CREATE_TUNNEL_REQ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<GTPV1U_CREATE_TUNNEL_RESP enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<GTPV1U_DELETE_TUNNEL_REQ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<GTPV1U_DELETE_TUNNEL_RESP enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<GTPV1U_TUNNEL_DATA_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<GTPV1U_TUNNEL_DATA_REQ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<GTPV1U_UPDATE_TUNNEL_REQ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<GTPV1U_UPDATE_TUNNEL_RESP enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<INFO_LOG enabled="0" foreground_color="#585858" background_color="#ffffff"/>
<INITIALIZE_MESSAGE enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<MESSAGE_TEST enabled="0" foreground_color="#585858" background_color="#ffffff"/>
<MME_APP_CONNECTION_ESTABLISHMENT_IND enabled="1" foreground_color="#90ff40" background_color="#805000"/>
<MME_APP_INITIAL_CONTEXT_SETUP_RSP enabled="1" foreground_color="#90ff40" background_color="#805000"/>
<NAS_AUTHENTICATION_PARAM_FAIL enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<NAS_AUTHENTICATION_PARAM_REQ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<NAS_AUTHENTICATION_PARAM_RSP enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<NAS_BEARER_PARAM enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<NAS_CONNECTION_ESTABLISHMENT_CNF enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<NAS_CONNECTION_ESTABLISHMENT_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<NAS_CONNECTION_RELEASE_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<NAS_CONN_ESTABLI_REQ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<NAS_DL_EMM_PLAIN_MSG enabled="1" foreground_color="#90ff40" background_color="#805000"/>
<NAS_DL_EMM_PROTECTED_MSG enabled="1" foreground_color="#90ff40" background_color="#805000"/>
<NAS_DL_EMM_RAW_MSG enabled="1" foreground_color="#90ff40" background_color="#805000"/>
<NAS_DL_ESM_PLAIN_MSG enabled="1" foreground_color="#90ff40" background_color="#906010"/>
<NAS_DL_ESM_PROTECTED_MSG enabled="1" foreground_color="#90ff40" background_color="#906010"/>
<NAS_DL_ESM_RAW_MSG enabled="1" foreground_color="#90ff40" background_color="#906010"/>
<NAS_DOWNLINK_DATA_CNF enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<NAS_DOWNLINK_DATA_REJ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<NAS_DOWNLINK_DATA_REQ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<NAS_NON_DELIVERY_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<NAS_PAGING_IND enabled="1" foreground_color="#e0e0e0" background_color="#2d315c"/>
<NAS_PDN_CONNECTIVITY_REQ enabled="1" foreground_color="#e0e0e0" background_color="#2d315c"/>
<NAS_RAB_ESTABLI_RSP enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<NAS_RAB_ESTABLISHMENT_REQ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<NAS_RAB_ESTABLISHMENT_RESP enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<NAS_RAB_RELEASE_REQ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<NAS_UL_EMM_PLAIN_MSG enabled="1" foreground_color="#ff8080" background_color="#805000"/>
<NAS_UL_EMM_PROTECTED_MSG enabled="1" foreground_color="#ff8080" background_color="#805000"/>
<NAS_UL_EMM_RAW_MSG enabled="1" foreground_color="#ff8080" background_color="#805000"/>
<NAS_UL_ESM_PLAIN_MSG enabled="1" foreground_color="#ff8080" background_color="#906010"/>
<NAS_UL_ESM_PROTECTED_MSG enabled="1" foreground_color="#ff8080" background_color="#906010"/>
<NAS_UL_ESM_RAW_MSG enabled="1" foreground_color="#ff8080" background_color="#906010"/>
<NAS_UPLINK_DATA_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<NAS_UPLINK_DATA_REQ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<NOTICE_LOG enabled="0" foreground_color="#585858" background_color="#ffffa0"/>
<S1AP_DEREGISTERED_ENB_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<S1AP_DEREGISTER_UE_REQ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<S1AP_DOWNLINK_NAS_LOG enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<S1AP_ENB_DEREGISTERED_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<S1AP_INITIAL_CONTEXT_SETUP_LOG enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<S1AP_INITIAL_CONTEXT_SETUP_REQ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<S1AP_INITIAL_UE_MESSAGE_LOG enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<S1AP_NAS_NON_DELIVERY_IND_LOG enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<S1AP_REGISTER_ENB_CNF enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<S1AP_S1_SETUP_LOG enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<S1AP_UE_CAPABILITIES_IND enabled="1" foreground_color="#585858" background_color="#cbffb1"/>
<S1AP_UE_CAPABILITY_IND_LOG enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<S1AP_UE_CONTEXT_RELEASE_COMMAND enabled="1" foreground_color="#585858" background_color="#cbffb1"/>
<S1AP_UE_CONTEXT_RELEASE_COMPLETE enabled="1" foreground_color="#585858" background_color="#cbffb1"/>
<S1AP_UE_CONTEXT_RELEASE_LOG enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<S1AP_UE_CONTEXT_RELEASE_REQ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<S1AP_UE_CONTEXT_RELEASE_REQ_LOG enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<S1AP_UPLINK_NAS_LOG enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<S6A_AUTH_INFO_ANS enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<S6A_AUTH_INFO_REQ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<S6A_UPDATE_LOCATION_ANS enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<S6A_UPDATE_LOCATION_REQ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<SCTP_CLOSE_ASSOCIATION enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<SCTP_DATA_IND enabled="1" foreground_color="#585858" background_color="#aefeff"/>
<SCTP_DATA_REQ enabled="1" foreground_color="#000000" background_color="#aefeff"/>
<SCTP_INIT_MSG enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<SCTP_NEW_ASSOCIATION enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<SCTP_NEW_ASSOCIATION_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<SCTP_NEW_ASSOCIATION_REQ enabled="1" foreground_color="#000000" background_color="#aefeff"/>
<SCTP_NEW_ASSOCIATION_RESP enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<SGI_CREATE_ENDPOINT_REQUEST enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<SGI_CREATE_ENDPOINT_RESPONSE enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<SGI_DELETE_ENDPOINT_REQUEST enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<SGI_DELETE_ENDPOINT_RESPONSE enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<SGI_UPDATE_ENDPOINT_REQUEST enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<SGI_UPDATE_ENDPOINT_RESPONSE enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<SGW_CREATE_SESSION_REQUEST enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<SGW_CREATE_SESSION_RESPONSE enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<SGW_DELETE_SESSION_REQUEST enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<SGW_DELETE_SESSION_RESPONSE enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<SGW_MODIFY_BEARER_REQUEST enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<SGW_MODIFY_BEARER_RESPONSE enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<SGW_RELEASE_ACCESS_BEARERS_RESPONSE enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<TERMINATE_MESSAGE enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<TIMER_HAS_EXPIRED enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<UDP_DATA_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<UDP_DATA_REQ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<UDP_INIT enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<WARNING_LOG enabled="1" foreground_color="#303030" background_color="#fff050"/>
</messages>
<origin_tasks>
<TASK_UNKNOWN enabled="1"/>
<TASK_TIMER enabled="0"/>
<TASK_GTPV1_U enabled="1"/>
<TASK_MME_APP enabled="1"/>
<TASK_NAS_MME enabled="1"/>
<TASK_S11 enabled="1"/>
<TASK_S1AP enabled="1"/>
<TASK_S6A enabled="1"/>
<TASK_SCTP enabled="1"/>
<TASK_SPGW_APP enabled="1"/>
<TASK_UDP enabled="1"/>
</origin_tasks>
<destination_tasks>
<TASK_UNKNOWN enabled="1"/>
<TASK_TIMER enabled="0"/>
<TASK_GTPV1_U enabled="1"/>
<TASK_MME_APP enabled="1"/>
<TASK_NAS_MME enabled="1"/>
<TASK_S11 enabled="1"/>
<TASK_S1AP enabled="1"/>
<TASK_S6A enabled="1"/>
<TASK_SCTP enabled="1"/>
<TASK_SPGW_APP enabled="1"/>
<TASK_UDP enabled="1"/>
</destination_tasks>
</filters>
@@ -1,174 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<filters>
<messages>
<INITIALIZE_MESSAGE enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<ACTIVATE_MESSAGE enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<DEACTIVATE_MESSAGE enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<TERMINATE_MESSAGE enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<MESSAGE_TEST enabled="0" foreground_color="#585858" background_color="#ffffff"/>
<ERROR_LOG enabled="1" foreground_color="#000000" background_color="#ff8080"/>
<WARNING_LOG enabled="1" foreground_color="#303030" background_color="#fff050"/>
<NOTICE_LOG enabled="0" foreground_color="#585858" background_color="#ffffa0"/>
<INFO_LOG enabled="0" foreground_color="#585858" background_color="#ffffff"/>
<DEBUG_LOG enabled="0" foreground_color="#585858" background_color="#ffffff"/>
<GENERIC_LOG enabled="1" foreground_color="#246b24" background_color="#ffffff"/>
<TIMER_HAS_EXPIRED enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<NAS_CELL_SELECTION_CNF enabled="1" foreground_color="#e0e0e0" background_color="#2d315c"/>
<NAS_CELL_SELECTION_IND enabled="1" foreground_color="#e0e0e0" background_color="#2d315c"/>
<NAS_CELL_SELECTION_REQ enabled="1" foreground_color="#ffffff" background_color="#2d315c"/>
<NAS_CONN_ESTABLI_CNF enabled="1" foreground_color="#e0e0e0" background_color="#2d315c"/>
<NAS_CONN_ESTABLI_REQ enabled="1" foreground_color="#ffffff" background_color="#2d315c"/>
<NAS_CONN_RELEASE_IND enabled="1" foreground_color="#e0e0e0" background_color="#2d315c"/>
<NAS_DL_EMM_PLAIN_MSG enabled="1" foreground_color="#90ff40" background_color="#805000"/>
<NAS_DL_EMM_PROTECTED_MSG enabled="1" foreground_color="#90ff40" background_color="#805000"/>
<NAS_DL_EMM_RAW_MSG enabled="1" foreground_color="#90ff40" background_color="#805000"/>
<NAS_DL_ESM_PLAIN_MSG enabled="1" foreground_color="#90ff40" background_color="#906010"/>
<NAS_DL_ESM_PROTECTED_MSG enabled="1" foreground_color="#90ff40" background_color="#906010"/>
<NAS_DL_ESM_RAW_MSG enabled="1" foreground_color="#90ff40" background_color="#906010"/>
<NAS_DOWNLINK_DATA_IND enabled="1" foreground_color="#e0e0e0" background_color="#2d315c"/>
<NAS_PAGING_IND enabled="1" foreground_color="#e0e0e0" background_color="#2d315c"/>
<NAS_RAB_ESTABLI_RSP enabled="1" foreground_color="#ffffff" background_color="#2d315c"/>
<NAS_UL_EMM_PLAIN_MSG enabled="1" foreground_color="#ff8080" background_color="#805000"/>
<NAS_UL_EMM_PROTECTED_MSG enabled="1" foreground_color="#ff8080" background_color="#805000"/>
<NAS_UL_EMM_RAW_MSG enabled="1" foreground_color="#ff8080" background_color="#805000"/>
<NAS_UL_ESM_PLAIN_MSG enabled="1" foreground_color="#ff8080" background_color="#906010"/>
<NAS_UL_ESM_PROTECTED_MSG enabled="1" foreground_color="#ff8080" background_color="#906010"/>
<NAS_UL_ESM_RAW_MSG enabled="1" foreground_color="#ff8080" background_color="#906010"/>
<NAS_UPLINK_DATA_CNF enabled="1" foreground_color="#e0e0e0" background_color="#2d315c"/>
<NAS_UPLINK_DATA_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<NAS_UPLINK_DATA_REQ enabled="1" foreground_color="#ffffff" background_color="#2d315c"/>
<PHY_DEACTIVATE_REQ enabled="1" foreground_color="#000000" background_color="#bef2ff"/>
<PHY_FIND_CELL_IND enabled="1" foreground_color="#585858" background_color="#bef2ff"/>
<PHY_FIND_CELL_REQ enabled="1" foreground_color="#000000" background_color="#bef2ff"/>
<PHY_FIND_NEXT_CELL_REQ enabled="1" foreground_color="#000000" background_color="#bef2ff"/>
<PHY_MEAS_REPORT_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<PHY_MEAS_THRESHOLD_CONF enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<PHY_MEAS_THRESHOLD_REQ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<RLC_AM_DATA_PDU_IND enabled="0" foreground_color="#585858" background_color="#ffffff"/>
<RLC_AM_DATA_PDU_REQ enabled="0" foreground_color="#585858" background_color="#ffffff"/>
<RLC_AM_SDU_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<RLC_AM_SDU_REQ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<RLC_AM_STATUS_PDU_IND enabled="0" foreground_color="#585858" background_color="#ffffff"/>
<RLC_AM_STATUS_PDU_REQ enabled="0" foreground_color="#585858" background_color="#ffffff"/>
<RLC_UM_DATA_PDU_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<RLC_UM_DATA_PDU_REQ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<RRC_CONFIGURATION_REQ enabled="1" foreground_color="#ffffff" background_color="#4d2a73"/>
<RRC_DCCH_DATA_IND enabled="1" foreground_color="#585858" background_color="#a7b1de"/>
<RRC_DCCH_DATA_REQ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<RRC_DL_BCCH enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<RRC_DL_CCCH enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<RRC_DL_DCCH enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<RRC_DL_MCCH enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<RRC_MAC_BCCH_DATA_IND enabled="0" foreground_color="#585858" background_color="#ffffff"/>
<RRC_MAC_BCCH_DATA_REQ enabled="0" foreground_color="#585858" background_color="#ffffff"/>
<RRC_MAC_CCCH_DATA_CNF enabled="0" foreground_color="#585858" background_color="#ffffff"/>
<RRC_MAC_CCCH_DATA_IND enabled="1" foreground_color="#585858" background_color="#dfb9fc"/>
<RRC_MAC_CCCH_DATA_REQ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<RRC_MAC_IN_SYNC_IND enabled="0" foreground_color="#585858" background_color="#ffffff"/>
<RRC_MAC_MCCH_DATA_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<RRC_MAC_MCCH_DATA_REQ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<RRC_MAC_OUT_OF_SYNC_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<RRC_RAL_CONFIGURE_THRESHOLD_CONF enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<RRC_RAL_CONFIGURE_THRESHOLD_REQ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<RRC_RAL_CONNECTION_ESTABLISHMENT_CONF enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<RRC_RAL_CONNECTION_ESTABLISHMENT_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<RRC_RAL_CONNECTION_ESTABLISHMENT_REQ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<RRC_RAL_CONNECTION_RECONFIGURATION_HO_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<RRC_RAL_CONNECTION_RECONFIGURATION_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<RRC_RAL_CONNECTION_REESTABLISHMENT_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<RRC_RAL_CONNECTION_RELEASE_CONF enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<RRC_RAL_CONNECTION_RELEASE_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<RRC_RAL_CONNECTION_RELEASE_REQ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<RRC_RAL_MEASUREMENT_REPORT_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<RRC_RAL_SCAN_CONF enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<RRC_RAL_SCAN_REQ enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<RRC_RAL_SYSTEM_CONFIGURATION_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<RRC_RAL_SYSTEM_INFORMATION_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<RRC_STATE_IND enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<RRC_UE_EUTRA_CAPABILITY enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<RRC_UL_CCCH enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<RRC_UL_DCCH enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<S1AP_DEREGISTERED_ENB_IND enabled="1" foreground_color="#585858" background_color="#cbffb1"/>
<S1AP_DOWNLINK_NAS enabled="1" foreground_color="#585858" background_color="#cbffb1"/>
<S1AP_DOWNLINK_NAS_LOG enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<S1AP_INITIAL_CONTEXT_SETUP_FAIL enabled="1" foreground_color="#585858" background_color="#cbffb1"/>
<S1AP_INITIAL_CONTEXT_SETUP_LOG enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<S1AP_INITIAL_CONTEXT_SETUP_REQ enabled="1" foreground_color="#000000" background_color="#cbffb1"/>
<S1AP_INITIAL_CONTEXT_SETUP_RESP enabled="1" foreground_color="#19431e" background_color="#cbffb1"/>
<S1AP_INITIAL_UE_MESSAGE_LOG enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<S1AP_NAS_FIRST_REQ enabled="1" foreground_color="#000000" background_color="#cbffb1"/>
<S1AP_NAS_NON_DELIVERY_IND enabled="1" foreground_color="#585858" background_color="#cbffb1"/>
<S1AP_NAS_NON_DELIVERY_IND_LOG enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<S1AP_PAGING_IND enabled="1" foreground_color="#585858" background_color="#cbffb1"/>
<S1AP_REGISTER_ENB_CNF enabled="1" foreground_color="#585858" background_color="#cbffb1"/>
<S1AP_REGISTER_ENB_REQ enabled="1" foreground_color="#000000" background_color="#cbffb1"/>
<S1AP_S1_SETUP_LOG enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<S1AP_UE_CAPABILITIES_IND enabled="1" foreground_color="#585858" background_color="#cbffb1"/>
<S1AP_UE_CAPABILITY_IND_LOG enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<S1AP_UE_CONTEXT_RELEASE_LOG enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<S1AP_UE_CONTEXT_RELEASE_REQ enabled="1" foreground_color="#000000" background_color="#cbffb1"/>
<S1AP_UE_CONTEXT_RELEASE_REQ_LOG enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<S1AP_UE_CONTEXT_RELEASE_RESP enabled="1" foreground_color="#585858" background_color="#cbffb1"/>
<S1AP_UE_CTXT_MODIFICATION_FAIL enabled="1" foreground_color="#585858" background_color="#cbffb1"/>
<S1AP_UE_CTXT_MODIFICATION_REQ enabled="1" foreground_color="#000000" background_color="#cbffb1"/>
<S1AP_UE_CTXT_MODIFICATION_RESP enabled="1" foreground_color="#585858" background_color="#cbffb1"/>
<S1AP_UPLINK_NAS enabled="1" foreground_color="#585858" background_color="#cbffb1"/>
<S1AP_UPLINK_NAS_LOG enabled="1" foreground_color="#585858" background_color="#ffffff"/>
<SCTP_DATA_IND enabled="1" foreground_color="#585858" background_color="#aefeff"/>
<SCTP_DATA_REQ enabled="1" foreground_color="#000000" background_color="#aefeff"/>
<SCTP_NEW_ASSOCIATION_IND enabled="1" foreground_color="#585858" background_color="#aefeff"/>
<SCTP_NEW_ASSOCIATION_REQ enabled="1" foreground_color="#000000" background_color="#aefeff"/>
<SCTP_NEW_ASSOCIATION_RESP enabled="1" foreground_color="#585858" background_color="#aefeff"/>
<SCTP_REGISTER_UPPER_LAYER enabled="1" foreground_color="#585858" background_color="#aefeff"/>
</messages>
<origin_tasks>
<TASK_UNKNOWN enabled="1"/>
<TASK_TIMER enabled="1"/>
<TASK_L2L1 enabled="1"/>
<TASK_BM enabled="1"/>
<TASK_PHY_ENB enabled="1"/>
<TASK_MAC_ENB enabled="1"/>
<TASK_RLC_ENB enabled="1"/>
<TASK_PDCP_ENB enabled="1"/>
<TASK_DATA_FORWARDING enabled="1"/>
<TASK_END_MARKER enabled="1"/>
<TASK_RRC_ENB enabled="1"/>
<TASK_RAL_ENB enabled="1"/>
<TASK_S1AP enabled="1"/>
<TASK_X2AP enabled="1"/>
<TASK_SCTP enabled="1"/>
<TASK_ENB_APP enabled="1"/>
<TASK_PHY_UE enabled="1"/>
<TASK_MAC_UE enabled="1"/>
<TASK_RLC_UE enabled="1"/>
<TASK_PDCP_UE enabled="1"/>
<TASK_RRC_UE enabled="1"/>
<TASK_NAS_UE enabled="1"/>
<TASK_RAL_UE enabled="1"/>
</origin_tasks>
<destination_tasks>
<TASK_UNKNOWN enabled="1"/>
<TASK_TIMER enabled="1"/>
<TASK_L2L1 enabled="1"/>
<TASK_BM enabled="1"/>
<TASK_PHY_ENB enabled="1"/>
<TASK_MAC_ENB enabled="1"/>
<TASK_RLC_ENB enabled="1"/>
<TASK_PDCP_ENB enabled="1"/>
<TASK_DATA_FORWARDING enabled="1"/>
<TASK_END_MARKER enabled="1"/>
<TASK_RRC_ENB enabled="1"/>
<TASK_RAL_ENB enabled="1"/>
<TASK_S1AP enabled="1"/>
<TASK_X2AP enabled="1"/>
<TASK_SCTP enabled="1"/>
<TASK_ENB_APP enabled="1"/>
<TASK_PHY_UE enabled="1"/>
<TASK_MAC_UE enabled="1"/>
<TASK_RLC_UE enabled="1"/>
<TASK_PDCP_UE enabled="1"/>
<TASK_RRC_UE enabled="1"/>
<TASK_NAS_UE enabled="1"/>
<TASK_RAL_UE enabled="1"/>
</destination_tasks>
</filters>
-145
View File
@@ -1,145 +0,0 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <gtk/gtk.h>
#include <libxml/parser.h>
#include "xml_parse.h"
#include "resolvers.h"
#include "locate_root.h"
#include "file.h"
#include "ui_main_screen.h"
#include "rc.h"
#define G_LOG_LEVELS (G_LOG_LEVEL_ERROR | \
G_LOG_LEVEL_CRITICAL | \
G_LOG_LEVEL_WARNING | \
G_LOG_LEVEL_MESSAGE | \
G_LOG_LEVEL_INFO | \
G_LOG_LEVEL_DEBUG)
int debug_buffers = 1;
int debug_parser = 0;
static void console_log_handler(const char *log_domain, GLogLevelFlags log_level,
const char *message, gpointer user_data)
{
GLogLevelFlags domain_log_level = (GLogLevelFlags) user_data;
time_t curr;
struct tm *today;
const char *level;
if (ui_main_data.log_flags & domain_log_level & log_level)
{
switch (log_level & G_LOG_LEVEL_MASK)
{
case G_LOG_LEVEL_ERROR:
level = "Err ";
break;
case G_LOG_LEVEL_CRITICAL:
level = "Crit";
break;
case G_LOG_LEVEL_WARNING:
level = "Warn";
break;
case G_LOG_LEVEL_MESSAGE:
level = "Msg ";
break;
case G_LOG_LEVEL_INFO:
level = "Info";
break;
case G_LOG_LEVEL_DEBUG:
level = "Dbg ";
break;
default:
fprintf(stderr, "unknown log_level %u\n", log_level);
level = NULL;
g_assert_not_reached();
break;
}
/* create a "timestamp" */
time(&curr);
today = localtime(&curr);
fprintf(stderr, "%02u:%02u:%02u %-9s %s %s\n", today->tm_hour, today->tm_min, today->tm_sec,
log_domain != NULL ? log_domain : "", level, message);
}
}
int main(int argc, char *argv[])
{
int ret = 0;
GLogLevelFlags log_flags;
log_flags = (GLogLevelFlags)
(G_LOG_LEVEL_ERROR |
G_LOG_LEVEL_CRITICAL |
G_LOG_LEVEL_WARNING |
G_LOG_LEVEL_MESSAGE |
G_LOG_LEVEL_INFO |
G_LOG_LEVEL_DEBUG);
/* This initialize the library and check potential ABI mismatches
* between the version it was compiled for and the actual shared
* library used.
*/
LIBXML_TEST_VERSION;
xmlInitParser();
/* Initialize the widget set */
gtk_init(&argc, &argv);
/* Parse command line options */
ui_gtk_parse_arg (argc, argv);
/* Set log handlers:
* Domain, Levels, Handler, Domain enabled levels */
g_log_set_handler( NULL, log_flags, console_log_handler, (gpointer) (G_LOG_LEVELS));
g_log_set_handler("BUFFERS", log_flags, console_log_handler, (gpointer) (G_LOG_LEVELS & (~(G_LOG_LEVEL_DEBUG))));
g_log_set_handler("PARSER", log_flags, console_log_handler, (gpointer) (G_LOG_LEVELS & (~(G_LOG_LEVEL_DEBUG))));
g_log_set_handler("RESOLVER", log_flags, console_log_handler, (gpointer) (G_LOG_LEVELS & (~(G_LOG_LEVEL_DEBUG))));
g_log_set_handler("UI", log_flags, console_log_handler, (gpointer) (G_LOG_LEVELS & (~(G_LOG_LEVEL_DEBUG))));
g_log_set_handler("UI_CB", log_flags, console_log_handler, (gpointer) (G_LOG_LEVELS));
g_log_set_handler("UI_FILTER", log_flags, console_log_handler, (gpointer) (G_LOG_LEVELS & (~(G_LOG_LEVEL_DEBUG))));
g_log_set_handler("UI_INTER", log_flags, console_log_handler, (gpointer) (G_LOG_LEVELS));
g_log_set_handler("UI_TREE", log_flags, console_log_handler, (gpointer) (G_LOG_LEVELS & (~(G_LOG_LEVEL_DEBUG))));
CHECK_FCT(ui_gtk_initialize(argc, argv));
/* Enter the main event loop, and wait for user interaction */
gtk_main ();
/* Free the global variables that may
* have been allocated by the parser.
*/
xmlCleanupParser ();
return ret;
}
@@ -1,13 +0,0 @@
AM_CFLAGS = \
@ADD_CFLAGS@ \
-I$(top_srcdir)/common \
-I$(top_srcdir)/libparser \
-I$(top_srcdir)/libui
noinst_LTLIBRARIES = libbuffers.la
libbuffers_la_LDFLAGS = -all-static
libbuffers_la_SOURCES = \
buffers.c buffers.h \
file.c file.h \
socket.c socket.h
@@ -1,241 +0,0 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define G_LOG_DOMAIN ("BUFFERS")
#include <glib.h>
#include "rc.h"
#include "buffers.h"
extern int debug_buffers;
static
int buffer_fetch(buffer_t *buffer, uint32_t offset, int size, void *value);
/* Try to fetch 8 bits unsigned from the buffer */
uint8_t buffer_get_uint8_t(buffer_t *buffer, uint32_t offset)
{
uint8_t value;
buffer_fetch(buffer, offset, 1, &value);
return value;
}
/* Try to fetch 16 bits unsigned from the buffer */
uint16_t buffer_get_uint16_t(buffer_t *buffer, uint32_t offset)
{
uint16_t value;
buffer_fetch(buffer, offset, 2, &value);
return value;
}
/* Try to fetch 32 bits unsigned from the buffer */
uint32_t buffer_get_uint32_t(buffer_t *buffer, uint32_t offset)
{
uint32_t value;
buffer_fetch(buffer, offset, 4, &value);
return value;
}
/* Try to fetch 64 bits unsigned from the buffer */
uint64_t buffer_get_uint64_t(buffer_t *buffer, uint32_t offset)
{
uint64_t value;
buffer_fetch(buffer, offset, 8, &value);
return value;
}
static
int buffer_fetch(buffer_t *buffer, uint32_t offset, int size, void *value)
{
if (buffer == NULL || value == NULL)
return -1;
if (size <= 0)
return -1;
if (buffer->size_bytes < ((offset >> 3) + size)) {
g_warning("Not enough data to fetch");
return -1;
}
memcpy(value, &buffer->data[offset >> 3], size);
buffer->buffer_current = &buffer->data[(offset >> 3) + size];
return 0;
}
int buffer_fetch_nbytes(buffer_t *buffer, uint32_t offset, int n_bytes, uint8_t *value)
{
if (buffer->size_bytes < ((offset >> 3) + n_bytes)) {
g_warning("Not enough data to fetch");
return -1;
}
memcpy(&value[0], &buffer->data[offset >> 3], n_bytes);
return 0;
}
int buffer_fetch_bits(buffer_t *buffer, uint32_t offset, int nbits, uint32_t *value)
{
uint32_t temp = 0;
int i;
if (buffer == NULL || value == NULL)
return RC_BAD_PARAM;
/* We cannot fetch more than 32 bits */
if (nbits > 32)
return RC_BAD_PARAM;
for (i = 0; i < nbits; i++)
{
temp |= ((buffer->data[(offset + i) / 8] >> ((offset + i) % 8)) & 1) << i;
}
*value = temp;
return RC_OK;
}
/**
* @brief Create a new buffer from data
* @param buffer caller reference where created buffer will be stored
* @param data Data to attach to the new buffer
* @param length Length of data buffer
* @param data_static flag that indicates if data pointer has been statically (= 0) or not (!= 0)
*/
int buffer_new_from_data(buffer_t **buffer, uint8_t *data, const uint32_t length,
int data_static)
{
buffer_t *new;
if (!buffer)
return RC_BAD_PARAM;
new = malloc(sizeof(buffer_t));
new->size_bytes = length;
if (data && length > 0) {
if (data_static == 0) {
new->data = malloc(sizeof(uint8_t) * new->size_bytes);
memcpy(new->data, data, new->size_bytes);
} else {
new->data = data;
}
new->buffer_current = &new->data[0];
} else {
new->buffer_current = NULL;
}
*buffer = new;
return 0;
}
#define INDENTED(fILE, x, y) \
do { \
int indentation = x; \
while(indentation--) fprintf(fILE, " "); \
y; \
} while(0)
#define INDENT_BREAK 20
void buffer_dump(buffer_t *buffer, FILE *to)
{
FILE *file = to;
uint32_t i;
if (!buffer)
return;
if (!to)
to = stdout;
fprintf(file, "<Buffer>\n");
INDENTED(file, 4, fprintf(file, "<Length>%u<Length>\n", buffer->size_bytes));
INDENTED(file, 4, fprintf(file, "<Bytes>\n"));
for (i = 0; i < buffer->size_bytes; i++)
{
if ((i % INDENT_BREAK) == 0)
fprintf(file, " ");
fprintf(file, "0x%02x ", buffer->data[i]);
if ((i % INDENT_BREAK) == (INDENT_BREAK - 1))
fprintf(file, "\n");
}
if ((i % INDENT_BREAK) != (INDENT_BREAK - 1))
fprintf(file, "\n");
INDENTED(file, 4, fprintf(file, "</Bytes>\n"));
fprintf(file, "</Buffer>\n");
}
int buffer_append_data(buffer_t *buffer, const uint8_t *data, const uint32_t length)
{
if (!buffer)
return -1;
if (data && length > 0) {
if (!buffer->data) {
buffer->size_bytes = length;
buffer->data = malloc(sizeof(uint8_t) * buffer->size_bytes);
memcpy(buffer->data, data, buffer->size_bytes);
} else {
buffer->data = realloc(buffer->data, sizeof(uint8_t) * (buffer->size_bytes + length));
memcpy(&buffer->data[buffer->size_bytes], data, length);
buffer->size_bytes += length;
}
buffer->buffer_current = &buffer->data[0];
}
return 0;
}
int buffer_has_enouch_data(buffer_t *buffer, uint32_t offset, uint32_t to_get)
{
int underflow;
if (!buffer)
return -1;
underflow = (buffer->size_bytes >= ((offset + to_get) / 8)) ? 0 : -1;
if (underflow && debug_buffers)
g_warning("Detected Underflow offset %u, to_get %u, buffer size %u\n",
offset, to_get, buffer->size_bytes);
return underflow;
}
void *buffer_at_offset(buffer_t *buffer, uint32_t offset)
{
// if (buffer_has_enouch_data(buffer, 0, offset) != 0) {
// return NULL;
// }
return &buffer->data[offset / 8];
}
@@ -1,66 +0,0 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#include <stdint.h>
#ifndef BUFFERS_H_
#define BUFFERS_H_
typedef struct buffer_s {
/* The size in bytes as read from socket */
uint32_t size_bytes;
/* Current position */
uint8_t *buffer_current;
/* The complete data */
uint8_t *data;
/* The message number as read from socket */
uint32_t message_number;
uint32_t message_id;
} buffer_t;
uint8_t buffer_get_uint8_t(buffer_t *buffer, uint32_t offset);
uint16_t buffer_get_uint16_t(buffer_t *buffer, uint32_t offset);
uint32_t buffer_get_uint32_t(buffer_t *buffer, uint32_t offset);
uint64_t buffer_get_uint64_t(buffer_t *buffer, uint32_t offset);
int buffer_fetch_bits(buffer_t *buffer, uint32_t offset, int nbits, uint32_t *value);
int buffer_fetch_nbytes(buffer_t *buffer, uint32_t offset, int n_bytes, uint8_t *value);
void buffer_dump(buffer_t *buffer, FILE *to);
int buffer_append_data(buffer_t *buffer, const uint8_t *data, const uint32_t length);
int buffer_new_from_data(buffer_t **buffer, uint8_t *data, const uint32_t length,
int data_static);
int buffer_has_enouch_data(buffer_t *buffer, uint32_t offset, uint32_t to_get);
void *buffer_at_offset(buffer_t *buffer, uint32_t offset);
#endif /* BUFFERS_H_ */
@@ -1,75 +0,0 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#define G_LOG_DOMAIN ("BUFFERS")
#include <glib.h>
#include "rc.h"
#include "buffers.h"
#include "file.h"
#define READ_BUFFER_SIZE 1024
int file_read_dump(buffer_t **buffer, const char *filename)
{
int fd = -1;
buffer_t *new_buf = NULL;
uint8_t data[READ_BUFFER_SIZE];
ssize_t current_read;
if (!filename)
return RC_BAD_PARAM;
if ((fd = open(filename, O_RDONLY)) == -1) {
g_warning("Cannot open %s for reading, returned %d:%s\n",
filename, errno, strerror(errno));
return RC_FAIL;
}
CHECK_FCT(buffer_new_from_data(&new_buf, NULL, 0, 0));
do {
current_read = read(fd, data, READ_BUFFER_SIZE);
if (current_read == -1)
{
g_warning("Failed to read data from file, returned %d:%s\n",
errno, strerror(errno));
return RC_FAIL;
}
CHECK_FCT(buffer_append_data(new_buf, data, current_read));
} while(current_read == READ_BUFFER_SIZE);
*buffer = new_buf;
buffer_dump(new_buf, stdout);
close(fd);
return RC_OK;
}
@@ -1,27 +0,0 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#ifndef FILE_H_
#define FILE_H_
int file_read_dump(buffer_t **buffer, const char *filename);
#endif /* FILE_H_ */
@@ -1,444 +0,0 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <fcntl.h>
#define G_LOG_DOMAIN ("BUFFERS")
#include <gtk/gtk.h>
#include "logs.h"
#include "itti_types.h"
#include "rc.h"
#include "ui_interface.h"
#include "ui_notifications.h"
#include "ui_notif_dlg.h"
#include "socket.h"
#include "buffers.h"
#include "xml_parse.h"
/* Retry connection after 100 ms */
#define SOCKET_US_BEFORE_CONNECT_RETRY (100 * 1000)
/* About 10 minutes time-out for connecting to peer */
#define SOCKET_NB_CONNECT_RETRY ((10 * 60 * 1000 * 1000) / SOCKET_US_BEFORE_CONNECT_RETRY)
#define SOCKET_NB_SIGNALS_BEFORE_SIGNALLING 10
#define SOCKET_MS_BEFORE_SIGNALLING 100
gboolean socket_abort_connection = FALSE;
void *socket_thread_fct(void *arg);
static ssize_t socket_read_data(socket_data_t *socket_data, void *buffer, size_t size, int flags)
{
ssize_t recv_ret;
recv_ret = recv(socket_data->sd, buffer, size, flags);
if (recv_ret == -1) {
/* Failure case */
switch (errno) {
// case EWOULDBLOCK:
case EAGAIN:
return -1;
default:
g_info("recv failed: %s", g_strerror(errno));
pthread_exit(NULL);
break;
}
} else if (recv_ret == 0) {
/* We lost the connection with other peer or shutdown asked */
ui_pipe_write_message(socket_data->pipe_fd,
UI_PIPE_CONNECTION_LOST, NULL, 0);
free(socket_data->ip_address);
free(socket_data);
pthread_exit(NULL);
}
return recv_ret;
}
static void socket_notify_gui_update(socket_data_t *socket_data)
{
pipe_new_signals_list_message_t pipe_signal_list_message;
pipe_signal_list_message.signal_list = socket_data->signal_list;
socket_data->signal_list = NULL;
socket_data->nb_signals_since_last_update = 0;
/* Send an update notification */
ui_pipe_write_message(socket_data->pipe_fd,
UI_PIPE_UPDATE_SIGNAL_LIST, &pipe_signal_list_message,
sizeof(pipe_signal_list_message));
/* Acquire the last data notification */
socket_data->last_data_notification = g_get_monotonic_time();
}
static int socket_read_itti_message(socket_data_t *socket_data,
itti_socket_header_t *message_header)
{
itti_signal_header_t itti_signal_header;
buffer_t *buffer;
uint8_t *data;
size_t data_length;
ssize_t data_read = 0;
ssize_t total_data_read = 0;
g_assert(message_header != NULL);
g_debug("Attempting to read signal header from socket");
/* Read the sub-header of signal */
while (data_read != sizeof(itti_signal_header_t)) {
data_read = socket_read_data(socket_data, &itti_signal_header,
sizeof(itti_signal_header_t), 0);
}
data_length = message_header->message_size - sizeof(itti_socket_header_t) - sizeof(itti_signal_header_t);
data = malloc(sizeof(uint8_t) * data_length);
while (total_data_read < data_length) {
data_read = socket_read_data(socket_data, &data[total_data_read],
data_length - total_data_read, 0);
/* We are waiting for data */
if (data_read < 0) {
usleep(10);
} else {
total_data_read += data_read;
}
}
/* Create the new buffer */
if (buffer_new_from_data(&buffer, data, data_length - sizeof(itti_message_types_t), 1) != RC_OK) {
g_error("Failed to create new buffer");
g_assert_not_reached();
}
sscanf (itti_signal_header.message_number_char, MESSAGE_NUMBER_CHAR_FORMAT, &buffer->message_number);
// buffer_dump(buffer, stdout);
/* Update the number of signals received since last GUI update */
socket_data->nb_signals_since_last_update++;
socket_data->signal_list = g_list_append(socket_data->signal_list, (gpointer)buffer);
if (socket_data->nb_signals_since_last_update >= SOCKET_NB_SIGNALS_BEFORE_SIGNALLING) {
socket_notify_gui_update(socket_data);
}
g_debug("Successfully read new signal %u from socket", buffer->message_number);
return total_data_read + sizeof(itti_signal_header);
}
static int socket_read_xml_definition(socket_data_t *socket_data,
itti_socket_header_t *message_header)
{
ssize_t data_read;
ssize_t total_data_read = 0;
char *xml_definition;
size_t xml_definition_length;
pipe_xml_definition_message_t pipe_xml_definition_message;
xml_definition_length = message_header->message_size - sizeof(*message_header);
xml_definition = malloc(xml_definition_length * sizeof(char));
g_debug("Attempting to read XML definition of size %zu from socket",
xml_definition_length);
/* XML definition is a long message... so function may take some time */
do {
data_read = socket_read_data(socket_data, &xml_definition[total_data_read],
xml_definition_length - total_data_read, 0);
/* We are waiting for data */
if (data_read < 0) {
usleep(10);
} else {
total_data_read += data_read;
}
} while (total_data_read != xml_definition_length);
pipe_xml_definition_message.xml_definition = xml_definition;
pipe_xml_definition_message.xml_definition_length = xml_definition_length - sizeof(itti_message_types_t);
g_debug("Received XML definition of size %zu, effectively read %zu bytes",
xml_definition_length, total_data_read);
ui_pipe_write_message(socket_data->pipe_fd, UI_PIPE_XML_DEFINITION,
&pipe_xml_definition_message, sizeof(pipe_xml_definition_message));
return total_data_read;
}
static int socket_read(socket_data_t *socket_data)
{
int ret = 0;
itti_socket_header_t message_header;
while (ret >= 0) {
ret = socket_read_data(socket_data, &message_header, sizeof(message_header), 0);
if (ret == -1) {
return 0;
}
switch(message_header.message_type) {
case ITTI_DUMP_XML_DEFINITION:
socket_read_xml_definition(socket_data, &message_header);
break;
case ITTI_DUMP_MESSAGE_TYPE:
socket_read_itti_message(socket_data, &message_header);
break;
case ITTI_STATISTIC_MESSAGE_TYPE:
default:
g_warning("Received unknow (or not implemented) message from socket type: %d",
message_header.message_type);
break;
}
}
return 0;
}
static int socket_handle_disconnect_evt(socket_data_t *socket_data)
{
/* Send shutdown to remote host */
CHECK_FCT_POSIX(shutdown(socket_data->sd, SHUT_RDWR));
/* Close file descriptor */
CHECK_FCT_POSIX(close(socket_data->sd));
socket_data->sd = -1;
/* Close pipe */
close(socket_data->pipe_fd);
/* Leaving the thread */
pthread_exit(NULL);
return 0;
}
static int pipe_read_message(socket_data_t *socket_data)
{
pipe_input_header_t input_header;
uint8_t *input_data = NULL;
size_t input_data_length = 0;
/* Read the header */
if (read(socket_data->pipe_fd, &input_header, sizeof(input_header)) < 0) {
g_warning("Failed to read from pipe %d: %s", socket_data->pipe_fd,
g_strerror(errno));
return -1;
}
input_data_length = input_header.message_size - sizeof(input_header);
/* Checking for non-header part */
if (input_data_length > 0) {
input_data = malloc(sizeof(uint8_t) * input_data_length);
if (read(socket_data->pipe_fd, input_data, input_data_length) < 0) {
g_warning("Failed to read from pipe %d: %s", socket_data->pipe_fd,
g_strerror(errno));
return -1;
}
}
switch (input_header.message_type) {
case UI_PIPE_DISCONNECT_EVT:
return socket_handle_disconnect_evt(socket_data);
default:
g_warning("[socket] Unhandled message type %u", input_header.message_type);
g_assert_not_reached();
}
return 0;
}
void *socket_thread_fct(void *arg)
{
int ret;
struct sockaddr_in si_me;
socket_data_t *socket_data;
int retry = SOCKET_NB_CONNECT_RETRY;
/* master file descriptor list */
fd_set master_fds;
/* temp file descriptor list for select() */
fd_set read_fds;
int fd_max = 0;
struct timeval tv;
socket_data = (socket_data_t *)arg;
g_assert(socket_data != NULL);
/* Preparing the socket */
if ((socket_data->sd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) {
g_warning("socket failed: %s", g_strerror(errno));
free(socket_data->ip_address);
free(socket_data);
pthread_exit(NULL);
}
memset((void *)&si_me, 0, sizeof(si_me));
si_me.sin_family = AF_INET;
si_me.sin_port = htons(socket_data->port);
if (inet_aton(socket_data->ip_address, &si_me.sin_addr) == 0) {
g_warning("inet_aton() failed\n");
free(socket_data->ip_address);
free(socket_data);
pthread_exit(NULL);
}
/* clear the master and temp sets */
FD_ZERO(&master_fds);
FD_ZERO(&read_fds);
/* Add the GUI pipe to the list of sockets to monitor */
FD_SET(socket_data->pipe_fd, &master_fds);
/* Add the client socket to the list of sockets to monitor */
FD_SET(socket_data->sd, &master_fds);
/* Update the fd_max with the MAX of socket/pipe */
fd_max = MAX(socket_data->pipe_fd, socket_data->sd);
/* Setup the timeout for select.
* When a timeout is caught, check for new notifications to send to GUI.
*/
tv.tv_sec = 0;
tv.tv_usec = 1000 * SOCKET_MS_BEFORE_SIGNALLING;
do {
/* Connecting to remote peer */
ret = connect(socket_data->sd, (struct sockaddr *) &si_me, sizeof(struct sockaddr_in));
if (ret < 0) {
if ((socket_abort_connection) || (retry < 0)) {
if (retry < 0) {
g_warning("Failed to connect to peer %s:%d", socket_data->ip_address, socket_data->port);
ui_pipe_write_message(socket_data->pipe_fd, UI_PIPE_CONNECTION_FAILED, NULL, 0);
}
free(socket_data->ip_address);
free(socket_data);
socket_abort_connection = FALSE;
/* Quit the thread */
pthread_exit(NULL);
}
usleep(SOCKET_US_BEFORE_CONNECT_RETRY);
retry--;
}
} while (ret < 0);
/* Set the socket as non-blocking */
fcntl(socket_data->sd, F_SETFL, O_NONBLOCK);
while (1) {
memcpy(&read_fds, &master_fds, sizeof(master_fds));
ret = select(fd_max + 1, &read_fds, NULL, NULL, &tv);
if (ret < 0) {
g_warning("Error in select: %s", g_strerror(errno));
free(socket_data->ip_address);
free(socket_data);
/* Quit the thread */
pthread_exit(NULL);
} else if (ret == 0) {
/* Timeout for select: check if there is new incoming messages
* since last GUI update
*/
if (socket_data->nb_signals_since_last_update > 0) {
g_debug("Timout on select and data new signal in list");
g_debug("-> notify GUI");
socket_notify_gui_update(socket_data);
}
/* Reset the timeval to the max value */
tv.tv_usec = 1000 * SOCKET_MS_BEFORE_SIGNALLING;
}
/* Checking if there is data to read from the pipe */
if (FD_ISSET(socket_data->pipe_fd, &read_fds)) {
FD_CLR(socket_data->pipe_fd, &read_fds);
pipe_read_message(socket_data);
}
/* Checking if there is data to read from the socket */
if (FD_ISSET(socket_data->sd, &read_fds)) {
FD_CLR(socket_data->sd, &read_fds);
socket_read(socket_data);
/* Update the timeout of select if there is data not notify to GUI */
if (socket_data->nb_signals_since_last_update > 0) {
gint64 current_time;
current_time = g_get_monotonic_time();
if ((current_time - socket_data->last_data_notification) > SOCKET_MS_BEFORE_SIGNALLING) {
socket_notify_gui_update(socket_data);
tv.tv_usec = 1000 * SOCKET_MS_BEFORE_SIGNALLING;
} else {
/* Update tv */
tv.tv_usec = (1000 * SOCKET_MS_BEFORE_SIGNALLING) - (current_time - socket_data->last_data_notification);
}
}
}
}
return NULL;
}
int socket_connect_to_remote_host(const char *remote_ip, const uint16_t port,
int pipe_fd)
{
socket_data_t *socket_data;
socket_data = calloc(1, sizeof(*socket_data));
socket_data->ip_address = strdup(remote_ip);
socket_data->pipe_fd = pipe_fd;
socket_data->port = port;
socket_data->sd = -1;
if (pthread_create(&socket_data->thread, NULL, socket_thread_fct, socket_data) != 0) {
g_warning("Failed to create thread %d:%s", errno, strerror(errno));
free(socket_data->ip_address);
free(socket_data);
return RC_FAIL;
}
return RC_OK;
}
@@ -1,52 +0,0 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#include <arpa/inet.h>
#include <netinet/in.h>
#ifndef SOCKET_H_
#define SOCKET_H_
typedef struct {
pthread_t thread;
int sd;
char *ip_address;
uint16_t port;
/* The pipe used between main thread (running GTK) and the socket thread */
int pipe_fd;
/* Time used to avoid refreshing UI every time a new signal is incoming */
gint64 last_data_notification;
uint8_t nb_signals_since_last_update;
/* The last signals received which are not yet been updated in GUI */
GList *signal_list;
} socket_data_t;
gboolean socket_abort_connection;
int socket_connect_to_remote_host(const char *remote_ip, const uint16_t port,
int pipe_fd);
int socket_disconnect_from_remote_host(void);
#endif /* SOCKET_H_ */
@@ -1,23 +0,0 @@
AM_CFLAGS = \
@ADD_CFLAGS@ \
-I$(top_srcdir)/common \
-I$(top_srcdir)/libbuffers \
-I$(top_srcdir)/libui
noinst_LTLIBRARIES = libparser.la
libparser_la_LDFLAGS = -all-static
libparser_la_SOURCES = \
xml_parse.c \
array_type.c array_type.h \
enum_type.c enum_type.h \
enum_value_type.c enum_value_type.h \
file_type.c file_type.h \
field_type.c field_type.h \
fundamental_type.c fundamental_type.h \
pointer_type.h pointer_type.c \
reference_type.c reference_type.h \
struct_type.c struct_type.h \
typedef_type.c typedef_type.h \
types.h types.c \
union_type.c union_type.h
@@ -1,180 +0,0 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#include <ctype.h>
#include <tgmath.h>
#define G_LOG_DOMAIN ("PARSER")
#include "array_type.h"
#include "fundamental_type.h"
#include "ui_interface.h"
int array_dissect_from_buffer(
types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line)
{
types_t *type_child;
int length = 0;
char cbuf[50];
DISPLAY_PARSE_INFO("array", type->name, offset, parent_offset);
/* Ignore TYPEDEF children */
for (type_child = type->child; type_child != NULL && type_child->type == TYPE_TYPEDEF;
type_child = type_child->child) {
}
if (type->name) {
INDENTED(stdout, indent, fprintf(stdout, "<%s>\n", type->name));
}
if (type->child != NULL) {
int items = type->size / type_child->size;
int i;
int zero_counter = 0;
gboolean is_string = FALSE;
char *string;
int nb_digits = 0;
/* Factorizes trailing 0 */
if ((items > 1) && (type_child->type == TYPE_FUNDAMENTAL))
{
for (i = items - 1; i >= 0; i--)
{
if (fundamental_read_from_buffer(type_child, buffer, parent_offset, offset + i * type_child->size) == 0)
{
zero_counter ++;
}
else
{
break;
}
}
/* Check if this is an array of 8 bits items and if at least the firsts ones are not null */
if ((type_child->size == 8) && (zero_counter >= 1) && ((items - zero_counter) >= 2))
{
int end = items - zero_counter;
/* check if this is a printable string */
is_string = TRUE;
string = malloc(end + 1);
for (i = 0; i < end; i++)
{
string[i] = fundamental_read_from_buffer(type_child, buffer, parent_offset, offset + i * type_child->size);
if (isprint(string[i]) == 0)
{
/* This is not a printable string */
is_string = FALSE;
break;
}
}
if (is_string)
{
string[i] = '\0';
INDENTED_STRING(cbuf, indent, length = sprintf(cbuf, "[0 .. %d] \"%s\"\n", end - 1, string));
ui_set_signal_text_cb(user_data, cbuf, length);
}
}
/* Do not factorize if there is only one null item */
if (zero_counter <= 1)
{
zero_counter = 0;
}
}
if (is_string == FALSE)
{
nb_digits = log10(items - zero_counter) + 1;
for (i = 0; i < (items - zero_counter); i++)
{
INDENTED_STRING(cbuf, indent, length = sprintf(cbuf, "[%*d] ", nb_digits, i));
ui_set_signal_text_cb(user_data, cbuf, length);
type->child->type_dissect_from_buffer (
type->child, ui_set_signal_text_cb, user_data, buffer, parent_offset,
offset + i * type_child->size, indent,
FALSE);
}
if (zero_counter > 0)
{
INDENTED_STRING(cbuf, indent, length = sprintf(cbuf, "[%d .. %d] ", i, items -1));
ui_set_signal_text_cb(user_data, cbuf, length);
type->child->type_dissect_from_buffer (
type->child, ui_set_signal_text_cb, user_data,
buffer, parent_offset, offset + i * type_child->size, indent, FALSE);
}
}
}
if (type->name) {
INDENTED(stdout, indent, fprintf(stdout, "</%s>\n", type->name));
}
return 0;
}
int array_type_file_print(types_t *type, int indent, FILE *file) {
if (type == NULL)
return -1;
INDENTED(file, indent, fprintf(file, "<Array>\n"));
INDENTED(file, indent+4, fprintf(file, "Id .........: %d\n", type->id));
INDENTED(file, indent+4, fprintf(file, "Min ........: %d\n", type->min));
INDENTED(file, indent+4, fprintf(file, "Max ........: %d\n", type->max));
INDENTED(file, indent+4, fprintf(file, "Type .......: %d\n", type->type_xml));
INDENTED(file, indent+4, fprintf(file, "Size .......: %d\n", type->size));
INDENTED(file, indent+4, fprintf(file, "Align ......: %d\n", type->align));
if (type->file_ref != NULL)
type->file_ref->type_file_print (type->file_ref, indent + 4, file);
if (type->child != NULL)
type->child->type_file_print (type->child, indent + 4, file);
INDENTED(file, indent, fprintf(file, "</Array>\n"));
return 0;
}
int array_type_hr_display(types_t *type, int indent) {
if (type == NULL)
return -1;
INDENTED(stdout, indent, printf("<Array>\n"));
INDENTED(stdout, indent+4, printf("Id .........: %d\n", type->id));
INDENTED(stdout, indent+4, printf("Min ........: %d\n", type->min));
INDENTED(stdout, indent+4, printf("Max ........: %d\n", type->max));
INDENTED(stdout, indent+4, printf("Type .......: %d\n", type->type_xml));
INDENTED(stdout, indent+4, printf("Size .......: %d\n", type->size));
INDENTED(stdout, indent+4, printf("Align ......: %d\n", type->align));
if (type->file_ref != NULL)
type->file_ref->type_hr_display (type->file_ref, indent + 4);
if (type->child != NULL)
type->child->type_hr_display (type->child, indent + 4);
INDENTED(stdout, indent, printf("</Array>\n"));
return 0;
}
@@ -1,35 +0,0 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#include "types.h"
#ifndef ARRAY_TYPE_H_
#define ARRAY_TYPE_H_
int array_dissect_from_buffer(
types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line);
int array_type_hr_display(types_t *type, int indent);
int array_type_file_print(types_t *type, int indent, FILE *file);
#endif /* ARRAY_TYPE_H_ */
@@ -1,124 +0,0 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#define G_LOG_DOMAIN ("PARSER")
#include "enum_type.h"
#include "ui_interface.h"
char *enum_type_get_name_from_value(types_t *type, uint32_t value)
{
char *enum_name = "UNKNOWN";
types_t *enum_value;
/* Loop on each enumeration values */
for (enum_value = type->child; enum_value; enum_value = enum_value->next) {
if (value == enum_value->init_value) {
enum_name = enum_value->name;
break;
}
}
return enum_name;
}
int enum_type_dissect_from_buffer(
types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line)
{
uint32_t value = 0;
types_t *values;
DISPLAY_PARSE_INFO("enum", type->name, offset, parent_offset);
value = buffer_get_uint32_t(buffer, parent_offset + offset);
for (values = type->child; values; values = values->next) {
if (value == values->init_value) {
values->parent = type;
values->type_dissect_from_buffer(
values, ui_set_signal_text_cb, user_data, buffer, offset, parent_offset,
type->name == NULL ? indent: indent + DISPLAY_TAB_SIZE, FALSE);
break;
}
}
if (values == NULL) {
int length = 0;
char cbuf[50];
length = sprintf(cbuf, "(0x%08x) UNKNOWN;\n", value);
ui_set_signal_text_cb(user_data, cbuf, length);
}
return 0;
}
int enum_type_file_print(types_t *type, int indent, FILE *file)
{
types_t *values;
if (type == NULL)
return -1;
INDENTED(file, indent, fprintf(file, "<Enumeration>\n"));
INDENTED(file, indent+4, fprintf(file, "Name .......: %s\n", type->name));
INDENTED(file, indent+4, fprintf(file, "Size .......: %d\n", type->size));
INDENTED(file, indent+4, fprintf(file, "Align ......: %d\n", type->align));
INDENTED(file, indent+4, fprintf(file, "Artificial .: %d\n", type->artificial));
INDENTED(file, indent+4, fprintf(file, "File .......: %s\n", type->file));
INDENTED(file, indent+4, fprintf(file, "Line .......: %d\n", type->line));
if (type->file_ref != NULL)
type->file_ref->type_file_print(type->file_ref, indent+4, file);
/* Call enum values display */
for (values = type->child; values; values = values->next) {
values->type_file_print(values, indent + 4, file);
}
INDENTED(file, indent, fprintf(file, "</Enumeration>\n"));
return 0;
}
int enum_type_hr_display(types_t *type, int indent)
{
types_t *values;
if (type == NULL)
return -1;
INDENTED(stdout, indent, printf("<Enumeration>\n"));
INDENTED(stdout, indent+4, printf("Name .......: %s\n", type->name));
INDENTED(stdout, indent+4, printf("Size .......: %d\n", type->size));
INDENTED(stdout, indent+4, printf("Align ......: %d\n", type->align));
INDENTED(stdout, indent+4, printf("Artificial .: %d\n", type->artificial));
INDENTED(stdout, indent+4, printf("File .......: %s\n", type->file));
INDENTED(stdout, indent+4, printf("Line .......: %d\n", type->line));
if (type->file_ref != NULL)
type->file_ref->type_hr_display(type->file_ref, indent+4);
/* Call enum values display */
for (values = type->child; values; values = values->next) {
values->type_hr_display(values, indent + 4);
}
INDENTED(stdout, indent, printf("</Enumeration>\n"));
return 0;
}
@@ -1,37 +0,0 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#include "types.h"
#ifndef ENUM_TYPE_H_
#define ENUM_TYPE_H_
char *enum_type_get_name_from_value(types_t *type, uint32_t value);
int enum_type_dissect_from_buffer(
types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line);
int enum_type_file_print(types_t *type, int indent, FILE *file);
int enum_type_hr_display(types_t *type, int indent);
#endif /* ENUM_TYPE_H_ */
@@ -1,99 +0,0 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#define G_LOG_DOMAIN ("PARSER")
#include "enum_value_type.h"
#include "ui_interface.h"
uint32_t last_enum_value;
int enum_value_dissect_from_buffer(
types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line)
{
types_t *type_parent = NULL;
uint32_t value = 0;
DISPLAY_PARSE_INFO("enum_value", type->name, offset, parent_offset);
value = buffer_get_uint32_t(buffer, parent_offset + offset);
if (type->name) {
int length = 0;
char cbuf[50 + strlen(type->name)];
/* Search for enum variable name and check if it is used in association with a union type */
{
if (type->parent != NULL) {
/* Ignore ENUMERATION and TYPEDEF parents */
for (type_parent = type->parent; (type_parent != NULL) && ((type_parent->type == TYPE_ENUMERATION) || (type_parent->type == TYPE_TYPEDEF));
type_parent = type_parent->parent) {
}
}
if ((type_parent != NULL) && (type_parent->name != NULL) && (strcmp(type_parent->name, "present") == 0))
{
/* ASN1 union, keep the "present" member */
last_enum_value = value;
}
else
{
last_enum_value = 0;
}
}
length = sprintf(cbuf, "(0x%08x) %s;\n", value, type->name);
ui_set_signal_text_cb(user_data, cbuf, length);
}
return 0;
}
int enum_value_file_print(types_t *type, int indent, FILE *file)
{
if (type == NULL)
return -1;
INDENTED(file, indent, fprintf(file, "<Value>\n"));
INDENTED(file, indent+4, fprintf(file, "Name .......: %s\n", type->name));
INDENTED(file, indent+4, fprintf(file, "Value ......: %d\n", type->init_value));
if (type->file_ref != NULL)
type->file_ref->type_file_print(type->file_ref, indent+4, file);
INDENTED(file, indent, fprintf(file, "</Value>\n"));
return 0;
}
int enum_value_type_hr_display(types_t *type, int indent)
{
if (type == NULL)
return -1;
INDENTED(stdout, indent, printf("<Value>\n"));
INDENTED(stdout, indent+4, printf("Name .......: %s\n", type->name));
INDENTED(stdout, indent+4, printf("Value ......: %d\n", type->init_value));
if (type->file_ref != NULL)
type->file_ref->type_hr_display(type->file_ref, indent+4);
INDENTED(stdout, indent, printf("</Value>\n"));
return 0;
}
@@ -1,37 +0,0 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#include "types.h"
#ifndef ENUM_VALUE_TYPE_H_
#define ENUM_VALUE_TYPE_H_
extern uint32_t last_enum_value;
int enum_value_dissect_from_buffer(
types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line);
int enum_value_file_print(types_t *type, int indent, FILE *file);
int enum_value_type_hr_display(types_t *type, int indent);
#endif /* ENUM_VALUE_TYPE_H_ */
@@ -1,180 +0,0 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#define G_LOG_DOMAIN ("PARSER")
#include "rc.h"
#include "field_type.h"
#include "buffers.h"
#include "ui_interface.h"
int field_dissect_from_buffer(
types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line)
{
int length = 0;
char cbuf[50 + (type->name ? strlen (type->name) : 0)];
types_t *type_child;
char array_info[50];
new_line = FALSE;
DISPLAY_PARSE_INFO("field", type->name, offset, parent_offset);
CHECK_FCT(buffer_has_enouch_data(buffer, parent_offset + offset, type->size / 8));
if (type->bits == -1) {
if ((type->name != NULL) && (strcmp(type->name, "_asn_ctx") == 0)) {
/* Hide ASN1 asn_struct_ctx_t struct that hold context for parsing across buffer boundaries */
/*
INDENTED_STRING(cbuf, indent, sprintf(cbuf, ".asn_ctx ...\n"));
length = strlen (cbuf);
ui_set_signal_text_cb(user_data, cbuf, length);
*/
}
else {
if (type->child != NULL) {
/* Ignore TYPEDEF children */
for (type_child = type->child; type_child != NULL && type_child->type == TYPE_TYPEDEF; type_child =
type_child->child) {
}
if (type_child->type == TYPE_ARRAY) {
types_t *type_array_child;
/* Ignore TYPEDEF children */
for (type_array_child = type_child->child;
type_array_child != NULL && type_array_child->type == TYPE_TYPEDEF; type_array_child =
type_array_child->child) {
}
sprintf (array_info, "[%d]", type_child->size / type_array_child->size);
}
else {
array_info[0] = '\0';
}
DISPLAY_TYPE("Fld");
INDENTED_STRING(cbuf, indent, length = sprintf(cbuf, ".%s%s = ", type->name ? type->name : "Field", array_info));
ui_set_signal_text_cb(user_data, cbuf, length);
if (type_child->type == TYPE_ARRAY) {
DISPLAY_BRACE(ui_set_signal_text_cb(user_data, "{", 1);)
ui_set_signal_text_cb(user_data, "\n", 1);
new_line = TRUE;
}
/*
if (type_child->type == TYPE_STRUCT || type_child->type == TYPE_UNION) {
DISPLAY_BRACE(ui_set_signal_text_cb(user_data, "{", 1);)
ui_set_signal_text_cb(user_data, "\n", 1);
new_line = TRUE;
}
*/
type->child->parent = type;
type->child->type_dissect_from_buffer(
type->child, ui_set_signal_text_cb, user_data, buffer,
parent_offset, offset + type->offset, new_line ? indent + DISPLAY_TAB_SIZE : indent, new_line);
DISPLAY_BRACE(
if (type_child->type == TYPE_ARRAY) {
DISPLAY_TYPE("Fld");
INDENTED_STRING(cbuf, indent, length = sprintf(cbuf, "};\n"));
ui_set_signal_text_cb(user_data, cbuf, length);
});
/*
DISPLAY_BRACE(
if (type_child->type == TYPE_STRUCT || type_child->type == TYPE_UNION) {
DISPLAY_TYPE("Fld");
INDENTED_STRING(cbuf, indent, sprintf(cbuf, "};\n"));
length = strlen (cbuf);
ui_set_signal_text_cb(user_data, cbuf, length);
});
*/
}
}
}
else {
/* The field is only composed of bits */
uint32_t value = 0;
CHECK_FCT(buffer_fetch_bits(buffer, offset + type->offset + parent_offset, type->bits, &value));
DISPLAY_TYPE("Fld");
INDENTED_STRING(cbuf, indent,
length = sprintf(cbuf, ".%s:%d = (0x%0*x) %d;\n", type->name ? type->name : "Field", type->bits, (type->bits + 3) / 4, value, value));
ui_set_signal_text_cb(user_data, cbuf, length);
}
return 0;
}
int field_type_file_print(types_t *type, int indent, FILE *file) {
if (type == NULL)
return -1;
INDENTED(file, indent, fprintf(file, "<Field>\n"));
INDENTED(file, indent+4, fprintf(file, "Id .........: %d\n", type->id));
INDENTED(file, indent+4, fprintf(file, "Name .......: %s\n", type->name));
INDENTED(file, indent+4, fprintf(file, "Bits .......: %d\n", type->bits));
INDENTED(file, indent+4, fprintf(file, "Type .......: %d\n", type->type_xml));
INDENTED(file, indent+4, fprintf(file, "Offset .....: %d\n", type->offset));
INDENTED(file, indent+4, fprintf(file, "Context ....: %d\n", type->context));
INDENTED(file, indent+4, fprintf(file, "File .......: %s\n", type->file));
INDENTED(file, indent+4, fprintf(file, "Line .......: %d\n", type->line));
if (type->file_ref != NULL)
type->file_ref->type_file_print (type->file_ref, indent + 4, file);
if (type->child != NULL)
type->child->type_file_print (type->child, indent + 4, file);
INDENTED(file, indent, fprintf(file, "</Field>\n"));
return 0;
}
int field_type_hr_display(types_t *type, int indent) {
if (type == NULL)
return -1;
INDENTED(stdout, indent, printf("<Field>\n"));
INDENTED(stdout, indent+4, printf("Id .........: %d\n", type->id));
INDENTED(stdout, indent+4, printf("Name .......: %s\n", type->name));
INDENTED(stdout, indent+4, printf("Bits .......: %d\n", type->bits));
INDENTED(stdout, indent+4, printf("Type .......: %d\n", type->type_xml));
INDENTED(stdout, indent+4, printf("Offset .....: %d\n", type->offset));
INDENTED(stdout, indent+4, printf("Context ....: %d\n", type->context));
INDENTED(stdout, indent+4, printf("File .......: %s\n", type->file));
INDENTED(stdout, indent+4, printf("Line .......: %d\n", type->line));
if (type->file_ref != NULL)
type->file_ref->type_hr_display (type->file_ref, indent + 4);
if (type->child != NULL)
type->child->type_hr_display (type->child, indent + 4);
INDENTED(stdout, indent, printf("</Field>\n"));
return 0;
}
@@ -1,35 +0,0 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#include "types.h"
#ifndef FIELD_TYPE_H_
#define FIELD_TYPE_H_
int field_dissect_from_buffer(
types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line);
int field_type_file_print(types_t *type, int indent, FILE *file);
int field_type_hr_display(types_t *type, int indent);
#endif /* FIELD_TYPE_H_ */
@@ -1,53 +0,0 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#define G_LOG_DOMAIN ("PARSER")
#include "file_type.h"
int file_type_file_print(types_t *type, int indent, FILE *file)
{
if (type == NULL)
return -1;
INDENTED(file, indent, fprintf(file, "<File>\n"));
INDENTED(file, indent+4, fprintf(file, "Id .........: %d\n", type->id));
INDENTED(file, indent+4, fprintf(file, "Name .......: %s\n", type->name));
INDENTED(file, indent, fprintf(file, "</File>\n"));
return 0;
}
int file_type_hr_display(types_t *type, int indent)
{
if (type == NULL)
return -1;
INDENTED(stdout, indent, printf("<File>\n"));
INDENTED(stdout, indent+4, printf("Id .........: %d\n", type->id));
INDENTED(stdout, indent+4, printf("Name .......: %s\n", type->name));
INDENTED(stdout, indent, printf("</File>\n"));
return 0;
}
@@ -1,31 +0,0 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#include "types.h"
#ifndef FILE_TYPE_H_
#define FILE_TYPE_H_
int file_type_file_print(types_t *type, int indent, FILE *file);
int file_type_hr_display(types_t *type, int indent);
#endif /* FILE_TYPE_H_ */
@@ -1,144 +0,0 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <inttypes.h>
#define G_LOG_DOMAIN ("PARSER")
#include "fundamental_type.h"
#include "ui_interface.h"
uint64_t fundamental_read_from_buffer(types_t *type, buffer_t *buffer, uint32_t offset, uint32_t parent_offset) {
uint64_t value;
switch (type->size) {
case 8:
value = buffer_get_uint8_t (buffer, offset + parent_offset);
break;
case 16:
value = buffer_get_uint16_t (buffer, offset + parent_offset);
break;
case 32:
value = buffer_get_uint32_t (buffer, offset + parent_offset);
break;
case 64:
value = buffer_get_uint64_t (buffer, offset + parent_offset);
break;
default:
/* ??? */
value = 0;
break;
}
return value;
}
int fundamental_dissect_from_buffer(
types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line)
{
int length = 0;
char cbuf[200];
int type_unsigned;
uint8_t value8;
uint16_t value16;
uint32_t value32;
uint64_t value64;
DISPLAY_PARSE_INFO("fundamental", type->name, offset, parent_offset);
memset (cbuf, 0, 200);
type_unsigned = strstr (type->name, "unsigned") == NULL ? 0 : 1;
value64 = fundamental_read_from_buffer(type, buffer, offset, parent_offset);
indent = new_line ? indent : 0;
if (indent > 0)
{
DISPLAY_TYPE("Fun");
}
switch (type->size) {
case 8:
value8 = (uint8_t) value64;
INDENTED_STRING(cbuf, indent,
length = sprintf(cbuf, type_unsigned ? "(0x%02" PRIx8 ") %3" PRIu8 ";\n" : "(0x%02" PRIx8 ") %4" PRId8 ";\n", value8, value8));
break;
case 16:
value16 = (uint16_t) value64;
INDENTED_STRING(cbuf, indent,
length = sprintf(cbuf, type_unsigned ? "(0x%04" PRIx16 ") %5" PRIu16 ";\n" : "(0x%04" PRIx16 ") %6" PRId16 ";\n", value16, value16));
break;
case 32:
value32 = (uint32_t) value64;
INDENTED_STRING(cbuf, indent,
length = sprintf(cbuf, type_unsigned ? "(0x%08" PRIx32 ") %9" PRIu32 ";\n" : "(0x%08" PRIx32 ") %10" PRId32 ";\n", value32, value32));
break;
case 64:
INDENTED_STRING(cbuf, indent,
length = sprintf(cbuf, type_unsigned ? "(0x%016" PRIx64 ") %20" PRIu64 ";\n" : "(0x%016" PRIx64 ") %20" PRId64 ";\n", value64, value64));
break;
default:
/* ??? */
break;
}
ui_set_signal_text_cb(user_data, cbuf, length);
return 0;
}
int fundamental_type_file_print(types_t *type, int indent, FILE *file) {
if (type == NULL)
return -1;
INDENTED(file, indent, fprintf(file, "<Fundamental>\n"));
INDENTED(file, indent+4, fprintf(file, "Name .......: %s\n", type->name));
INDENTED(file, indent+4, fprintf(file, "Id .........: %d\n", type->id));
INDENTED(file, indent+4, fprintf(file, "Size .......: %d\n", type->size));
INDENTED(file, indent+4, fprintf(file, "Align ......: %d\n", type->align));
if (type->file_ref != NULL)
type->file_ref->type_file_print (type->file_ref, indent + 4, file);
INDENTED(file, indent, fprintf(file, "</Fundamental>\n"));
return 0;
}
int fundamental_type_hr_display(types_t *type, int indent) {
if (type == NULL)
return -1;
INDENTED(stdout, indent, printf("<Fundamental>\n"));
INDENTED(stdout, indent+4, printf("Name .......: %s\n", type->name));
INDENTED(stdout, indent+4, printf("Id .........: %d\n", type->id));
INDENTED(stdout, indent+4, printf("Size .......: %d\n", type->size));
INDENTED(stdout, indent+4, printf("Align ......: %d\n", type->align));
if (type->file_ref != NULL)
type->file_ref->type_hr_display (type->file_ref, indent + 4);
INDENTED(stdout, indent, printf("</Fundamental>\n"));
return 0;
}
@@ -1,37 +0,0 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#include "types.h"
#ifndef FUNDAMENTAL_TYPE_H_
#define FUNDAMENTAL_TYPE_H_
uint64_t fundamental_read_from_buffer(types_t *type, buffer_t *buffer, uint32_t offset, uint32_t parent_offset);
int fundamental_dissect_from_buffer(
types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line);
int fundamental_type_file_print(types_t *type, int indent, FILE *file);
int fundamental_type_hr_display(types_t *type, int indent);
#endif /* FUNDAMENTAL_TYPE_H_ */
@@ -1,35 +0,0 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#include "fundamental_type.h"
#include "struct_type.h"
#ifndef INTERTASK_CONTEXTS_H_
#define INTERTASK_CONTEXTS_H_
typedef struct {
/* List of fundamental types that can contruct any other type */
fundamental_type_t *ft_list;
struct_type_t *struct_list;
} intertask_context_t;
#endif /* INTERTASK_CONTEXTS_H_ */
@@ -1,103 +0,0 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#define G_LOG_DOMAIN ("PARSER")
#include "pointer_type.h"
#include "ui_interface.h"
int pointer_dissect_from_buffer(
types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line)
{
int length = 0, i;
char cbuf[200];
DISPLAY_PARSE_INFO("pointer", type->name, offset, parent_offset);
memset (cbuf, 0, 200);
uint8_t value[type->size / 8];
buffer_fetch_nbytes(buffer, parent_offset + offset, type->size / 8, value);
indent = new_line ? indent : 0;
if (indent > 0)
{
DISPLAY_TYPE("Ptr");
}
if (type->child && type->child->name) {
/*
INDENTED(stdout, indent, fprintf(stdout, "<%s>0x%08x</%s>\n",
type->child->name, value, type->child->name));
*/
INDENTED_STRING(cbuf, indent, length = sprintf(cbuf, "(%s *) 0x", type->child->name));
}
else {
/*
INDENTED(stdout, indent, fprintf(stdout, "<Pointer>0x%08x</Pointer>\n",
value));
*/
INDENTED_STRING(cbuf, indent, length = sprintf(cbuf, "(void *) 0x"));
}
/* Append the value */
for (i = type->size / 8 - 1; i >= 0; i--) {
length += sprintf(&cbuf[length], "%02x", value[i]);
}
length += sprintf(&cbuf[length], ";\n");
ui_set_signal_text_cb(user_data, cbuf, length);
return 0;
}
int pointer_type_file_print(types_t *type, int indent, FILE *file) {
if (type == NULL)
return -1;
INDENTED(file, indent, fprintf(file, "<Pointer>\n"));
INDENTED(file, indent+4, fprintf(file, "Id .........: %d\n", type->id));
INDENTED(file, indent+4, fprintf(file, "Type .......: %d\n", type->type_xml));
INDENTED(file, indent+4, fprintf(file, "Size .......: %d\n", type->size));
INDENTED(file, indent+4, fprintf(file, "Align ......: %d\n", type->align));
if (type->child != NULL) {
if (type->child->type == TYPE_FUNCTION) {
INDENTED(file, indent+4, fprintf(file, "<Function>\n"));
INDENTED(file, indent+8, fprintf(file, "<Args>To be done</Args>\n"));
INDENTED(file, indent+4, fprintf(file, "</Function>\n"));
} else {
type->child->type_file_print (type->child, indent + 4, file);
}
}
if (type->file_ref != NULL)
type->file_ref->type_file_print (type->file_ref, indent + 4, file);
INDENTED(file, indent, fprintf(file, "</Pointer>\n"));
return 0;
}
int pointer_type_hr_display(types_t *type, int indent) {
return pointer_type_file_print(type, indent, stdout);
}
@@ -1,35 +0,0 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#include "types.h"
#ifndef POINTER_TYPE_H_
#define POINTER_TYPE_H_
int pointer_dissect_from_buffer(
types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line);
int pointer_type_file_print(types_t *type, int indent, FILE *file);
int pointer_type_hr_display(types_t *type, int indent);
#endif /* POINTER_TYPE_H_ */
@@ -1,96 +0,0 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#define G_LOG_DOMAIN ("PARSER")
#include "reference_type.h"
#include "ui_interface.h"
int reference_dissect_from_buffer(
types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line)
{
DISPLAY_PARSE_INFO("reference", type->name, offset, parent_offset);
if (type->name) {
INDENTED(stdout, indent, fprintf(stdout, "<%s>\n", type->name));
}
if (type->child != NULL)
type->child->type_dissect_from_buffer(type->child, ui_set_signal_text_cb,
user_data, buffer, offset, parent_offset,
type->name == NULL ? indent: indent + DISPLAY_TAB_SIZE, TRUE);
if (type->name) {
INDENTED(stdout, indent, fprintf(stdout, "</%s>\n", type->name));
}
return 0;
}
int reference_type_file_print(types_t *type, int indent, FILE *file)
{
if (type == NULL)
return -1;
INDENTED(file, indent, fprintf(file, "<Reference>\n"));
INDENTED(file, indent+4, fprintf(file, "Name .......: %s\n", type->name));
INDENTED(file, indent+4, fprintf(file, "Id .........: %d\n", type->id));
INDENTED(file, indent+4, fprintf(file, "Type .......: %d\n", type->type_xml));
INDENTED(file, indent+4, fprintf(file, "Size .......: %d\n", type->size));
INDENTED(file, indent+4, fprintf(file, "Align ......: %d\n", type->align));
INDENTED(file, indent+4, fprintf(file, "Context ....: %d\n", type->context));
INDENTED(file, indent+4, fprintf(file, "Offset .....: %d\n", type->offset));
INDENTED(file, indent+4, fprintf(file, "Line .......: %d\n", type->line));
INDENTED(file, indent+4, fprintf(file, "File .......: %s\n", type->file));
if (type->child != NULL)
type->child->type_file_print(type->child, indent+4, file);
if (type->file_ref != NULL)
type->file_ref->type_file_print(type->file_ref, indent+4, file);
INDENTED(file, indent, fprintf(file, "</Reference>\n"));
return 0;
}
int reference_type_hr_display(types_t *type, int indent)
{
if (type == NULL)
return -1;
INDENTED(stdout, indent, printf("<Reference>\n"));
INDENTED(stdout, indent+4, printf("Name .......: %s\n", type->name));
INDENTED(stdout, indent+4, printf("Id .........: %d\n", type->id));
INDENTED(stdout, indent+4, printf("Type .......: %d\n", type->type_xml));
INDENTED(stdout, indent+4, printf("Size .......: %d\n", type->size));
INDENTED(stdout, indent+4, printf("Align ......: %d\n", type->align));
INDENTED(stdout, indent+4, printf("Context ....: %d\n", type->context));
INDENTED(stdout, indent+4, printf("Offset .....: %d\n", type->offset));
INDENTED(stdout, indent+4, printf("Line .......: %d\n", type->line));
INDENTED(stdout, indent+4, printf("File .......: %s\n", type->file));
if (type->child != NULL)
type->child->type_hr_display(type->child, indent+4);
if (type->file_ref != NULL)
type->file_ref->type_hr_display(type->file_ref, indent+4);
INDENTED(stdout, indent, printf("</Reference>\n"));
return 0;
}
@@ -1,35 +0,0 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#include "types.h"
#ifndef REFERENCE_TYPE_H_
#define REFERENCE_TYPE_H_
int reference_dissect_from_buffer(
types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line);
int reference_type_file_print(types_t *type, int indent, FILE *file);
int reference_type_hr_display(types_t *type, int indent);
#endif /* REFERENCE_TYPE_H_ */
@@ -1,148 +0,0 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#define G_LOG_DOMAIN ("PARSER")
#include "rc.h"
#include "struct_type.h"
#include "buffers.h"
#include "ui_callbacks.h"
#include "ui_interface.h"
int struct_dissect_from_buffer(
types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line)
{
int i;
char cbuf[50 + (type->name ? strlen (type->name) : 0)];
int length = 0;
char *name;
memset (cbuf, 0, sizeof(cbuf));
DISPLAY_PARSE_INFO("structure", type->name, offset, parent_offset);
if (new_line) {
DISPLAY_TYPE("Str");
}
if (type->name) {
name = type->name;
}
else {
name = "_anonymous_";
}
if ((strcmp (name, "IttiMsgText_s") == 0) &&
(type->members_child[0] != NULL) && (strcmp (type->members_child[0]->name, "size") == 0) &&
(type->members_child[1] != NULL) && (strcmp (type->members_child[1]->name, "text") == 0)) {
uint8_t *buf;
length = buffer_get_uint32_t (buffer, offset + parent_offset);
buf = malloc (length + 1);
buf[0] = '\n';
buffer_fetch_nbytes(buffer, parent_offset + offset + 32, length, &buf[1]);
length = ui_callback_check_string ((char *) &buf[1], length, 0);
ui_set_signal_text_cb(user_data, (char *) buf, length + 1);
}
else
{
INDENTED_STRING(cbuf, new_line ? indent : 0, length = sprintf (cbuf, "%s :", name));
DISPLAY_BRACE(length += sprintf(&cbuf[length], " {"););
length += sprintf(&cbuf[length], "\n");
ui_set_signal_text_cb(user_data, cbuf, length);
for (i = 0; i < type->nb_members; i++) {
if (type->members_child[i] != NULL)
type->members_child[i]->type_dissect_from_buffer (
type->members_child[i], ui_set_signal_text_cb, user_data,
buffer, offset, parent_offset, indent + DISPLAY_TAB_SIZE, TRUE);
}
}
DISPLAY_BRACE(
DISPLAY_TYPE("Str");
INDENTED_STRING(cbuf, indent, length = sprintf(cbuf, "};\n"));
ui_set_signal_text_cb(user_data, cbuf, length);)
return 0;
}
int struct_type_file_print(types_t *type, int indent, FILE *file) {
int i;
if (type == NULL)
return -1;
if (file == NULL)
return -1;
INDENTED(file, indent, fprintf(file, "<Struct>\n"));
INDENTED(file, indent+4, fprintf(file, "Name .......: %s\n", type->name));
INDENTED(file, indent+4, fprintf(file, "Id .........: %d\n", type->id));
INDENTED(file, indent+4, fprintf(file, "Size .......: %d\n", type->size));
INDENTED(file, indent+4, fprintf(file, "Align ......: %d\n", type->align));
INDENTED(file, indent+4, fprintf(file, "Artificial .: %d\n", type->artificial));
INDENTED(file, indent+4, fprintf(file, "File .......: %s\n", type->file));
INDENTED(file, indent+4, fprintf(file, "Line .......: %d\n", type->line));
INDENTED(file, indent+4, fprintf(file, "Members ....: %s\n", type->members));
INDENTED(file, indent+4, fprintf(file, "Mangled ....: %s\n", type->mangled));
INDENTED(file, indent+4, fprintf(file, "Demangled ..: %s\n", type->demangled));
if (type->file_ref != NULL)
type->file_ref->type_file_print (type->file_ref, indent + 4, file);
for (i = 0; i < type->nb_members; i++) {
if (type->members_child[i] != NULL)
type->members_child[i]->type_file_print (type->members_child[i], indent + 4, file);
}
INDENTED(file, indent, fprintf(file, "</Struct>\n"));
return 0;
}
int struct_type_hr_display(types_t *type, int indent) {
int i;
if (type == NULL)
return -1;
INDENTED(stdout, indent, printf("<Struct>\n"));
INDENTED(stdout, indent+4, printf("Name .......: %s\n", type->name));
INDENTED(stdout, indent+4, printf("Id .........: %d\n", type->id));
INDENTED(stdout, indent+4, printf("Size .......: %d\n", type->size));
INDENTED(stdout, indent+4, printf("Align ......: %d\n", type->align));
INDENTED(stdout, indent+4, printf("Artificial .: %d\n", type->artificial));
INDENTED(stdout, indent+4, printf("File .......: %s\n", type->file));
INDENTED(stdout, indent+4, printf("Line .......: %d\n", type->line));
INDENTED(stdout, indent+4, printf("Members ....: %s\n", type->members));
INDENTED(stdout, indent+4, printf("Mangled ....: %s\n", type->mangled));
INDENTED(stdout, indent+4, printf("Demangled ..: %s\n", type->demangled));
if (type->file_ref != NULL)
type->file_ref->type_hr_display (type->file_ref, indent + 4);
for (i = 0; i < type->nb_members; i++) {
if (type->members_child[i] != NULL)
type->members_child[i]->type_hr_display (type->members_child[i], indent + 4);
}
INDENTED(stdout, indent, printf("</Struct>\n"));
return 0;
}
@@ -1,35 +0,0 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#include "types.h"
#ifndef STRUCT_TYPE_H_
#define STRUCT_TYPE_H_
int struct_dissect_from_buffer(
types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line);
int struct_type_hr_display(types_t *type, int indent);
int struct_type_file_print(types_t *type, int indent, FILE *file);
#endif /* STRUCT_TYPE_H_ */
@@ -1,113 +0,0 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#define G_LOG_DOMAIN ("PARSER")
#include "typedef_type.h"
#include "ui_interface.h"
int typedef_dissect_from_buffer(
types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line)
{
int length = 0;
char cbuf[50 + (type->name ? strlen (type->name) : 0)];
types_t *type_child = NULL;
DISPLAY_PARSE_INFO("typedef", type->name, offset, parent_offset);
if (type->child != NULL) {
/* Ignore TYPEDEF children */
for (type_child = type->child; type_child != NULL && type_child->type == TYPE_TYPEDEF; type_child =
type_child->child) {
}
}
if ((type_child == NULL) || (type_child->type != TYPE_FUNDAMENTAL))
{
INDENTED_STRING(cbuf, new_line ? indent : 0, length = sprintf (cbuf, "%s, ", type->name));
ui_set_signal_text_cb(user_data, cbuf, length);
new_line = FALSE;
}
/* Simply call next_type */
if (type->child != NULL) {
type->child->parent = type;
type->child->type_dissect_from_buffer(
type->child, ui_set_signal_text_cb, user_data, buffer, offset, parent_offset, indent, new_line);
}
return 0;
}
int typedef_type_file_print(types_t *type, int indent, FILE *file)
{
if (type == NULL)
return -1;
INDENTED(file, indent, fprintf(file, "<Typedef>\n"));
INDENTED(file, indent+4, fprintf(file, "Name .......: %s\n", type->name));
INDENTED(file, indent+4, fprintf(file, "Type .......: %d\n", type->type_xml));
INDENTED(file, indent+4, fprintf(file, "Size .......: %d\n", type->size));
INDENTED(file, indent+4, fprintf(file, "Align ......: %d\n", type->align));
INDENTED(file, indent+4, fprintf(file, "Artificial .: %d\n", type->artificial));
INDENTED(file, indent+4, fprintf(file, "File .......: %s\n", type->file));
INDENTED(file, indent+4, fprintf(file, "Line .......: %d\n", type->line));
INDENTED(file, indent+4, fprintf(file, "Members ....: %s\n", type->members));
INDENTED(file, indent+4, fprintf(file, "Mangled ....: %s\n", type->mangled));
INDENTED(file, indent+4, fprintf(file, "Demangled ..: %s\n", type->demangled));
if (type->file_ref != NULL)
type->file_ref->type_file_print(type->file_ref, indent+4, file);
if (type->child != NULL)
type->child->type_file_print(type->child, indent+4, file);
INDENTED(file, indent, fprintf(file, "</Typedef>\n"));
return 0;
}
int typedef_type_hr_display(types_t *type, int indent)
{
if (type == NULL)
return -1;
INDENTED(stdout, indent, printf("<Typedef>\n"));
INDENTED(stdout, indent+4, printf("Name .......: %s\n", type->name));
INDENTED(stdout, indent+4, printf("Type .......: %d\n", type->type_xml));
INDENTED(stdout, indent+4, printf("Size .......: %d\n", type->size));
INDENTED(stdout, indent+4, printf("Align ......: %d\n", type->align));
INDENTED(stdout, indent+4, printf("Artificial .: %d\n", type->artificial));
INDENTED(stdout, indent+4, printf("File .......: %s\n", type->file));
INDENTED(stdout, indent+4, printf("Line .......: %d\n", type->line));
INDENTED(stdout, indent+4, printf("Members ....: %s\n", type->members));
INDENTED(stdout, indent+4, printf("Mangled ....: %s\n", type->mangled));
INDENTED(stdout, indent+4, printf("Demangled ..: %s\n", type->demangled));
if (type->file_ref != NULL)
type->file_ref->type_hr_display(type->file_ref, indent+4);
if (type->child != NULL)
type->child->type_hr_display(type->child, indent+4);
INDENTED(stdout, indent, printf("</Typedef>\n"));
return 0;
}
@@ -1,35 +0,0 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#include "types.h"
#ifndef TYPEDEF_TYPE_H_
#define TYPEDEF_TYPE_H_
int typedef_type_file_print(types_t *type, int indent, FILE *file);
int typedef_type_hr_display(types_t *type, int indent);
int typedef_dissect_from_buffer(
types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line);
#endif /* TYPEDEF_TYPE_H_ */
@@ -1,147 +0,0 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define G_LOG_DOMAIN ("PARSER")
#include "types.h"
#include "array_type.h"
#include "enum_type.h"
#include "fundamental_type.h"
#include "struct_type.h"
#include "union_type.h"
#include "typedef_type.h"
#include "enum_value_type.h"
#include "file_type.h"
#include "field_type.h"
#include "reference_type.h"
#include "pointer_type.h"
types_t *type_new(enum type_e type)
{
types_t *new_p;
new_p = calloc(1, sizeof(types_t));
new_p->type = type;
switch(type) {
case TYPE_FUNCTION:
/* Nothing to do for now. Display is done by pointer type */
break;
case TYPE_ENUMERATION:
new_p->type_hr_display = enum_type_hr_display;
new_p->type_file_print = enum_type_file_print;
new_p->type_dissect_from_buffer = enum_type_dissect_from_buffer;
break;
case TYPE_FUNDAMENTAL:
new_p->type_hr_display = fundamental_type_hr_display;
new_p->type_file_print = fundamental_type_file_print;
new_p->type_dissect_from_buffer = fundamental_dissect_from_buffer;
break;
case TYPE_STRUCT:
new_p->type_hr_display = struct_type_hr_display;
new_p->type_file_print = struct_type_file_print;
new_p->type_dissect_from_buffer = struct_dissect_from_buffer;
break;
case TYPE_UNION:
new_p->type_hr_display = union_type_hr_display;
new_p->type_file_print = union_type_file_print;
new_p->type_dissect_from_buffer = union_dissect_from_buffer;
break;
case TYPE_TYPEDEF:
new_p->type_hr_display = typedef_type_hr_display;
new_p->type_file_print = typedef_type_file_print;
new_p->type_dissect_from_buffer = typedef_dissect_from_buffer;
break;
case TYPE_ENUMERATION_VALUE:
new_p->type_hr_display = enum_value_type_hr_display;
new_p->type_file_print = enum_value_file_print;
new_p->type_dissect_from_buffer = enum_value_dissect_from_buffer;
break;
case TYPE_FILE:
new_p->type_hr_display = file_type_hr_display;
new_p->type_file_print = file_type_file_print;
// new_p->type_dissect_from_buffer = file_dissect_from_buffer;
break;
case TYPE_FIELD:
new_p->type_hr_display = field_type_hr_display;
new_p->type_file_print = field_type_file_print;
new_p->type_dissect_from_buffer = field_dissect_from_buffer;
break;
case TYPE_REFERENCE:
new_p->type_hr_display = reference_type_hr_display;
new_p->type_file_print = reference_type_file_print;
new_p->type_dissect_from_buffer = reference_dissect_from_buffer;
break;
case TYPE_ARRAY:
new_p->type_hr_display = array_type_hr_display;
new_p->type_file_print = array_type_file_print;
new_p->type_dissect_from_buffer = array_dissect_from_buffer;
break;
case TYPE_POINTER:
new_p->type_hr_display = pointer_type_hr_display;
new_p->type_file_print = pointer_type_file_print;
new_p->type_dissect_from_buffer = pointer_dissect_from_buffer;
break;
default:
break;
}
return new_p;
}
int types_insert_tail(types_t **head, types_t *to_insert)
{
if (to_insert == NULL || head == NULL)
return -1;
if (*head == NULL) {
*head = to_insert;
} else {
types_t *last = *head;
while(last->next != NULL) {
last = last->next;
}
last->next = to_insert;
to_insert->previous = last;
}
to_insert->head = *head;
return 0;
}
void types_hr_display(types_t *head)
{
types_t *current = head;
if (head == NULL) {
printf("Empty list\n");
/* Empty list */
return;
}
while((current = current->next) != NULL)
{
current->type_hr_display(current, 0);
}
}
@@ -1,187 +0,0 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#include <stdio.h>
#include "buffers.h"
#include "ui_main_screen.h"
#include "ui_interface.h"
#ifndef TYPES_H_
#define TYPES_H_
/* Activate to display the type at the beginning of the line (debug option) */
#define ENABLE_DISPLAY_TYPE 0
/* Activate to display the parse information before processing each item (debug option) */
#define ENABLE_DISPLAY_PARSE_INFO 0
/* Activate to show braces, in increase the number of displayed lines (formating option)*/
#define ENABLE_DISPLAY_BRACE 1
#if (ENABLE_DISPLAY_TYPE != 0)
# define DISPLAY_TYPE(tYPE) ui_set_signal_text_cb(user_data, tYPE" ", strlen(tYPE) + 1);
#else
# define DISPLAY_TYPE(tYPE)
#endif
#define DISPLAY_TAB_SIZE (2)
#if (ENABLE_DISPLAY_PARSE_INFO != 0)
# define DISPLAY_PARSE_INFO(tYPE, nAME, oFFSET, pARENToFFSET) \
{ \
char buf[200]; \
sprintf(buf, "/* %s \"%s\" %d %d */\n", tYPE, nAME, oFFSET, pARENToFFSET); \
ui_set_signal_text_cb(user_data, buf, strlen(buf)); \
}
#else
# define DISPLAY_PARSE_INFO(tYPE, nAME, oFFSET, pARENToFFSET)
#endif
#if (ENABLE_DISPLAY_BRACE != 0)
# define DISPLAY_BRACE(cODE) if (ui_main_data.display_brace) {cODE}
#else
# define DISPLAY_BRACE(cODE)
#endif
enum type_e {
TYPE_ENUMERATION,
TYPE_ENUMERATION_VALUE,
TYPE_STRUCT,
TYPE_UNION,
TYPE_FUNDAMENTAL,
TYPE_TYPEDEF,
TYPE_ARRAY,
TYPE_REFERENCE,
TYPE_FIELD,
TYPE_FUNCTION,
TYPE_ARGUMENT,
TYPE_POINTER,
TYPE_FILE,
};
/* Forward declarations */
struct types_s;
typedef int (*type_hr_display_t)(struct types_s *type, int indent);
typedef int (*type_ui_display_t)(struct types_s *type, int indent);
typedef int (*type_file_print_t)(struct types_s *type, int indent, FILE *file);
/**
* type_dissect_from_buffer_t
* @param type The current type
* @param ui_set_signal_text_cb GUI display function
* @param user_data Transparent data to pass to the GUI display function
* @param buffer The buffer containing data to dissect
* @param offset offset of field from the beginning of the parent
* @param parent_offset offset of the parent from begining
**/
typedef int (*type_dissect_from_buffer_t)(
struct types_s *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line);
typedef struct types_s {
/* The type of the current description */
enum type_e type;
/* Printable name for the current type */
char *name;
int type_xml;
int size;
int align;
int bits;
/* Used only for arrays */
int min;
int max;
int context;
/* Init value for enumerations */
int init_value;
int incomplete;
/* Id of the type as defined in XML file */
int id;
int artificial;
char *mangled;
char *demangled;
/* List of members in constructed types */
char *members;
/* The file containing the definition */
char *file;
/* Line number of the current definition */
int line;
/* offset of the field in the parent type
* -1 means no parent
*/
int offset;
struct types_s *previous;
struct types_s *next;
struct types_s *parent;
struct types_s *child;
struct types_s *file_ref;
/* Reference to the head */
struct types_s *head;
/* For structures or union */
int nb_members;
struct types_s **members_child;
/* Some procedures to display the type on terminal */
type_hr_display_t type_hr_display;
/* Some procedures to display the type on UI */
type_ui_display_t type_ui_display;
/* Procedure to display the type to a file */
type_file_print_t type_file_print;
/* Dissect the type */
type_dissect_from_buffer_t type_dissect_from_buffer;
} types_t;
types_t *type_new(enum type_e type);
int types_insert_tail(types_t **head, types_t *to_insert);
void types_hr_display(types_t *head);
#define INDENTED(fILE, x, y) \
do { \
int indentation = x; \
while(indentation--) fprintf(fILE, " "); \
y; \
} while(0)
#define INDENTED_STRING(sTR, x, y) \
do { \
int indentation = x; \
while(indentation--) ui_set_signal_text_cb(user_data, " ", 1); \
y; \
} while(0)
#endif /* TYPES_H_ */
@@ -1,188 +0,0 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#define G_LOG_DOMAIN ("PARSER")
#include "rc.h"
#include "enum_value_type.h"
#include "union_type.h"
#include "../libresolver/locate_root.h"
#include "ui_interface.h"
/* There is only one special case of union which is associated to an index: the message id */
int union_msg_dissect_from_buffer(
types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line)
{
uint32_t message_id;
int length = 0;
char cbuf[200];
DISPLAY_PARSE_INFO("union_msg", type->name, offset, parent_offset);
CHECK_FCT(get_message_id(type->head, buffer, &message_id));
if (type->name) {
DISPLAY_TYPE("Uni");
length = sprintf(cbuf, "%s |", type->name);
DISPLAY_BRACE(length += sprintf(&cbuf[length], " {"););
length += sprintf(&cbuf[length], "\n");
ui_set_signal_text_cb(user_data, cbuf, length);
}
if (type->members_child[message_id] != NULL)
type->members_child[message_id]->type_dissect_from_buffer(
type->members_child[message_id], ui_set_signal_text_cb, user_data,
buffer, offset, parent_offset, type->name == NULL ? indent : indent + DISPLAY_TAB_SIZE, TRUE);
DISPLAY_BRACE(
if (type->name) {
DISPLAY_TYPE("Uni");
INDENTED_STRING(cbuf, indent, length = sprintf(cbuf, "};\n"));
ui_set_signal_text_cb(user_data, cbuf, length);
});
return RC_OK;
}
int union_dissect_from_buffer(
types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line)
{
int length = 0;
char cbuf[50 + (type->name ? strlen (type->name) : 0)];
char *name;
int union_child = 0;
DISPLAY_PARSE_INFO("union", type->name, offset, parent_offset);
memset (cbuf, 0, sizeof(cbuf));
// CHECK_FCT(buffer_has_enouch_data(buffer, offset + parent_offset, type->size / 8));
if (type->name) {
name = type->name;
}
else {
name = "_anonymous_";
}
if (new_line) {
DISPLAY_TYPE("Uni");
}
INDENTED_STRING(cbuf, new_line ? indent : 0, length = sprintf(cbuf, "%s |", name));
DISPLAY_BRACE(length += sprintf(&cbuf[length], " {"););
length += sprintf(&cbuf[length], "\n");
ui_set_signal_text_cb(user_data, cbuf, length);
if (type->name) {
if (type->parent != NULL)
{
if ((type->parent->name != NULL) && (strcmp(type->parent->name, "choice") == 0))
{
/* ASN1 union */
if ((last_enum_value > 0) && (last_enum_value <= type->nb_members))
{
union_child = last_enum_value - 1;
g_debug("ASN1 union \"%s\' detected, use member %d", type->name, union_child);
}
}
}
}
/* Only dissect the first field present in unions */
if (type->members_child[union_child] != NULL)
type->members_child[union_child]->type_dissect_from_buffer(
type->members_child[union_child], ui_set_signal_text_cb, user_data, buffer,
offset, parent_offset, indent + DISPLAY_TAB_SIZE, TRUE);
DISPLAY_BRACE(
DISPLAY_TYPE("Uni");
INDENTED_STRING(cbuf, indent, sprintf(cbuf, "};\n"));
length = strlen (cbuf);
ui_set_signal_text_cb(user_data, cbuf, length););
return 0;
}
int union_type_file_print(types_t *type, int indent, FILE *file) {
int i;
if (type == NULL)
return -1;
INDENTED(file, indent, fprintf(file, "<Union>\n"));
INDENTED(file, indent+4, fprintf(file, "Name .......: %s\n", type->name));
INDENTED(file, indent+4, fprintf(file, "Id .........: %d\n", type->id));
INDENTED(file, indent+4, fprintf(file, "Size .......: %d\n", type->size));
INDENTED(file, indent+4, fprintf(file, "Align ......: %d\n", type->align));
INDENTED(file, indent+4, fprintf(file, "Artificial .: %d\n", type->artificial));
INDENTED(file, indent+4, fprintf(file, "File .......: %s\n", type->file));
INDENTED(file, indent+4, fprintf(file, "Line .......: %d\n", type->line));
INDENTED(file, indent+4, fprintf(file, "Members ....: %s\n", type->members));
INDENTED(file, indent+4, fprintf(file, "Mangled ....: %s\n", type->mangled));
INDENTED(file, indent+4, fprintf(file, "Demangled ..: %s\n", type->demangled));
if (type->file_ref != NULL)
type->file_ref->type_file_print (type->file_ref, indent + 4, file);
for (i = 0; i < type->nb_members; i++) {
if (type->members_child[i] != NULL)
type->members_child[i]->type_file_print (type->members_child[i], indent + 4, file);
}
INDENTED(file, indent, fprintf(file, "</Union>\n"));
return 0;
}
int union_type_hr_display(types_t *type, int indent) {
int i;
if (type == NULL)
return -1;
INDENTED(stdout, indent, printf("<Union>\n"));
INDENTED(stdout, indent+4, printf("Name .......: %s\n", type->name));
INDENTED(stdout, indent+4, printf("Id .........: %d\n", type->id));
INDENTED(stdout, indent+4, printf("Size .......: %d\n", type->size));
INDENTED(stdout, indent+4, printf("Align ......: %d\n", type->align));
INDENTED(stdout, indent+4, printf("Artificial .: %d\n", type->artificial));
INDENTED(stdout, indent+4, printf("File .......: %s\n", type->file));
INDENTED(stdout, indent+4, printf("Line .......: %d\n", type->line));
INDENTED(stdout, indent+4, printf("Members ....: %s\n", type->members));
INDENTED(stdout, indent+4, printf("Mangled ....: %s\n", type->mangled));
INDENTED(stdout, indent+4, printf("Demangled ..: %s\n", type->demangled));
if (type->file_ref != NULL)
type->file_ref->type_hr_display (type->file_ref, indent + 4);
for (i = 0; i < type->nb_members; i++) {
if (type->members_child[i] != NULL)
type->members_child[i]->type_hr_display (type->members_child[i], indent + 4);
}
INDENTED(stdout, indent, printf("</Union>\n"));
return 0;
}
@@ -1,39 +0,0 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#include "types.h"
#ifndef UNION_TYPE_H_
#define UNION_TYPE_H_
int union_msg_dissect_from_buffer(
types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line);
int union_dissect_from_buffer(
types_t *type, ui_set_signal_text_cb_t ui_set_signal_text_cb, gpointer user_data,
buffer_t *buffer, uint32_t offset, uint32_t parent_offset, int indent, gboolean new_line);
int union_type_file_print(types_t *type, int indent, FILE *file);
int union_type_hr_display(types_t *type, int indent);
#endif /* UNION_TYPE_H_ */
@@ -1,904 +0,0 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#include <string.h>
#include <unistd.h>
#define G_LOG_DOMAIN ("PARSER")
#include <gtk/gtk.h>
#include <libxml/parser.h>
#include <libxml/tree.h>
#include "logs.h"
#include "types.h"
#include "xml_parse.h"
#include "union_type.h"
#include "ui_interface.h"
#include "ui_main_screen.h"
#include "ui_notif_dlg.h"
#include "ui_filters.h"
#include "../libresolver/locate_root.h"
#include "../libresolver/resolvers.h"
extern int debug_parser;
#if (ENABLE_DISPLAY_PARSE_INFO != 0)
# define INDENT_START 30
#else
# define INDENT_START 0
#endif
void *xml_raw_data;
uint32_t xml_raw_data_size;
types_t *xml_head;
types_t *root;
static int xml_parse_doc(xmlDocPtr doc);
static int parse_attribute_name(xmlNode *node, types_t *type, int mandatory) {
xmlAttrPtr node_attribute;
if ((node_attribute = xmlHasProp (node, (xmlChar *) "name")) == NULL) {
if (mandatory) {
g_error("cannot retrieve name attribute in node %s, %s:%ld",
(char *)node->name, node->doc->URL, XML_GET_LINE(node));
return -1;
}
else {
g_debug("cannot retrieve name attribute in node %s, %s:%ld",
(char *)node->name, node->doc->URL, XML_GET_LINE(node));
return 0;
}
}
type->name = strdup ((char *) node_attribute->children->content);
return 0;
}
static int parse_attribute_id(xmlNode *node, types_t *type) {
xmlAttrPtr node_attribute;
if ((node_attribute = xmlHasProp (node, (xmlChar *) "id")) == NULL) {
g_error("cannot retrieve id attribute in node %s, %s:%ld",
(char *)node->name, node->doc->URL, XML_GET_LINE(node));
return -1;
}
type->id = atoi ((char *) &node_attribute->children->content[1]);
return 0;
}
static int parse_attribute_size(xmlNode *node, types_t *type, int mandatory) {
xmlAttrPtr node_attribute;
if ((node_attribute = xmlHasProp (node, (xmlChar *) "size")) == NULL) {
if (mandatory) {
g_error("cannot retrieve size attribute in node %s, %s:%ld",
(char *)node->name, node->doc->URL, XML_GET_LINE(node));
type->size = -1;
return -1;
}
else {
g_debug("cannot retrieve size attribute in node %s, %s:%ld",
(char *)node->name, node->doc->URL, XML_GET_LINE(node));
type->size = -1;
return 0;
}
}
type->size = atoi ((char *) node_attribute->children->content);
return 0;
}
static int parse_attribute_align(xmlNode *node, types_t *type, int mandatory) {
xmlAttrPtr node_attribute;
if ((node_attribute = xmlHasProp (node, (xmlChar *) "align")) == NULL) {
if (mandatory) {
g_error("cannot retrieve align attribute in node %s, %s:%ld",
(char *)node->name, node->doc->URL, XML_GET_LINE(node));
type->align = -1;
return -1;
}
else {
g_debug("cannot retrieve align attribute in node %s, %s:%ld",
(char *)node->name, node->doc->URL, XML_GET_LINE(node));
type->align = -1;
return 0;
}
}
type->align = atoi ((char *) node_attribute->children->content);
return 0;
}
static int parse_attribute_line(xmlNode *node, types_t *type) {
xmlAttrPtr node_attribute;
if ((node_attribute = xmlHasProp (node, (xmlChar *) "line")) == NULL) {
type->line = -1;
return 0;
}
type->line = atoi ((char *) node_attribute->children->content);
return 0;
}
static int parse_attribute_file(xmlNode *node, types_t *type) {
xmlAttrPtr node_attribute;
if ((node_attribute = xmlHasProp (node, (xmlChar *) "file")) == NULL) {
type->file = NULL;
return 0;
}
type->file = strdup ((char *) node_attribute->children->content);
return 0;
}
static int parse_attribute_context(xmlNode *node, types_t *type, int mandatory) {
xmlAttrPtr node_attribute;
if ((node_attribute = xmlHasProp (node, (xmlChar *) "context")) == NULL) {
if (mandatory) {
g_error("cannot retrieve context attribute in node %s, %s:%ld",
(char *)node->name, node->doc->URL, XML_GET_LINE(node));
type->context = -1;
return -1;
}
else {
type->context = -1;
return 0;
}
}
type->context = atoi ((char *) &node_attribute->children->content[1]);
return 0;
}
static int parse_attribute_artificial(xmlNode *node, types_t *type) {
xmlAttrPtr node_attribute;
if ((node_attribute = xmlHasProp (node, (xmlChar *) "artificial")) == NULL) {
g_debug("cannot retrieve artificial attribute in node %s, %s:%ld",
(char *)node->name, node->doc->URL, XML_GET_LINE(node));
type->artificial = -1;
return 0;
}
type->artificial = atoi ((char *) &node_attribute->children->content[1]);
return 0;
}
static int parse_attribute_init(xmlNode *node, types_t *type) {
xmlAttrPtr node_attribute;
if ((node_attribute = xmlHasProp (node, (xmlChar *) "init")) == NULL) {
g_error("cannot retrieve init attribute in node %s, %s:%ld",
(char *)node->name, node->doc->URL, XML_GET_LINE(node));
type->init_value = -1;
return 0;
}
type->init_value = atoi ((char *) node_attribute->children->content);
return 0;
}
static int parse_attribute_members(xmlNode *node, types_t *type, int mandatory) {
xmlAttrPtr node_attribute;
if ((node_attribute = xmlHasProp (node, (xmlChar *) "members")) == NULL) {
if (mandatory) {
g_error("cannot retrieve members attribute in node %s, %s:%ld",
(char *)node->name, node->doc->URL, XML_GET_LINE(node));
type->members = 0;
return -1;
}
else {
g_debug("cannot retrieve members attribute in node %s, %s:%ld",
(char *)node->name, node->doc->URL, XML_GET_LINE(node));
type->members = 0;
return 0;
}
}
type->members = strdup ((char *) node_attribute->children->content);
return 0;
}
static int parse_attribute_mangled(xmlNode *node, types_t *type, int mandatory) {
xmlAttrPtr node_attribute;
if ((node_attribute = xmlHasProp (node, (xmlChar *) "mangled")) == NULL) {
if (mandatory) {
g_error("cannot retrieve mangled attribute in node %s, %s:%ld",
(char *)node->name, node->doc->URL, XML_GET_LINE(node));
type->mangled = 0;
return -1;
}
else {
g_debug("cannot retrieve mangled attribute in node %s, %s:%ld",
(char *)node->name, node->doc->URL, XML_GET_LINE(node));
type->mangled = 0;
return 0;
}
}
type->mangled = strdup ((char *) node_attribute->children->content);
return 0;
}
static int parse_attribute_demangled(xmlNode *node, types_t *type, int mandatory) {
xmlAttrPtr node_attribute;
if ((node_attribute = xmlHasProp (node, (xmlChar *) "mangled")) == NULL) {
if (mandatory) {
g_error("cannot retrieve demangled attribute in node %s, %s:%ld",
(char *)node->name, node->doc->URL, XML_GET_LINE(node));
type->demangled = 0;
return -1;
}
else {
g_debug("cannot retrieve demangled attribute in node %s, %s:%ld",
(char *)node->name, node->doc->URL, XML_GET_LINE(node));
type->demangled = 0;
return 0;
}
}
type->demangled = strdup ((char *) node_attribute->children->content);
return 0;
}
static int parse_attribute_offset(xmlNode *node, types_t *type, int mandatory) {
xmlAttrPtr node_attribute;
if ((node_attribute = xmlHasProp (node, (xmlChar *) "offset")) == NULL) {
if (mandatory) {
g_error("cannot retrieve offset attribute in node %s, %s:%ld",
(char *)node->name, node->doc->URL, XML_GET_LINE(node));
type->offset = -1;
return -1;
}
else {
g_debug("cannot retrieve offset attribute in node %s, %s:%ld",
(char *)node->name, node->doc->URL, XML_GET_LINE(node));
type->offset = -1;
return 0;
}
}
type->offset = atoi ((char *) node_attribute->children->content);
return 0;
}
static int parse_attribute_bits(xmlNode *node, types_t *type, int mandatory) {
xmlAttrPtr node_attribute;
if ((node_attribute = xmlHasProp (node, (xmlChar *) "bits")) == NULL) {
if (mandatory) {
g_error("cannot retrieve bits attribute in node %s, %s:%ld",
(char *)node->name, node->doc->URL, XML_GET_LINE(node));
type->bits = -1;
return -1;
}
else {
g_debug("cannot retrieve bits attribute in node %s, %s:%ld",
(char *)node->name, node->doc->URL, XML_GET_LINE(node));
type->bits = -1;
return 0;
}
}
type->bits = atoi ((char *) node_attribute->children->content);
return 0;
}
static int parse_attribute_type(xmlNode *node, types_t *type, int mandatory) {
xmlAttrPtr node_attribute;
if ((node_attribute = xmlHasProp (node, (xmlChar *) "type")) == NULL) {
if (mandatory) {
g_error("cannot retrieve type attribute in node %s, %s:%ld",
(char *)node->name, node->doc->URL, XML_GET_LINE(node));
type->type_xml = 0;
return -1;
}
else {
g_debug("cannot retrieve type attribute in node %s, %s:%ld",
(char *)node->name, node->doc->URL, XML_GET_LINE(node));
type->type_xml = 0;
return 0;
}
}
type->type_xml = atoi ((char *) &node_attribute->children->content[1]);
return 0;
}
static int parse_attribute_min(xmlNode *node, types_t *type, int mandatory) {
xmlAttrPtr node_attribute;
if ((node_attribute = xmlHasProp (node, (xmlChar *) "min")) == NULL) {
if (mandatory) {
g_error("cannot retrieve min attribute in node %s, %s:%ld",
(char *)node->name, node->doc->URL, XML_GET_LINE(node));
type->min = 0;
return -1;
}
else {
g_debug("cannot retrieve min attribute in node %s, %s:%ld",
(char *)node->name, node->doc->URL, XML_GET_LINE(node));
type->min = 0;
return 0;
}
}
type->min = atoi ((char *) node_attribute->children->content);
return 0;
}
static int parse_attribute_max(xmlNode *node, types_t *type, int mandatory) {
xmlAttrPtr node_attribute;
if ((node_attribute = xmlHasProp (node, (xmlChar *) "max")) == NULL) {
if (mandatory) {
g_error("cannot retrieve max attribute in node %s, %s:%ld",
(char *)node->name, node->doc->URL, XML_GET_LINE(node));
type->max = 0;
return -1;
}
else {
g_debug("cannot retrieve max attribute in node %s, %s:%ld",
(char *)node->name, node->doc->URL, XML_GET_LINE(node));
type->max = 0;
return 0;
}
}
type->max = atoi ((char *) &node_attribute->children->content[1]);
return 0;
}
static int parse_enum_values(xmlNode *node, types_t *parent) {
types_t *new;
if (node == NULL || parent == NULL)
return -1;
new = type_new (TYPE_ENUMERATION_VALUE);
CHECK_FCT(parse_attribute_name(node, new, 1));
CHECK_FCT(parse_attribute_init(node, new));
CHECK_FCT(types_insert_tail(&parent->child, new));
return 0;
}
static int parse_enumeration(xmlNode *node, types_t **head) {
types_t *new;
xmlNode *enum_value_node;
if (node == NULL)
return -1;
new = type_new (TYPE_ENUMERATION);
CHECK_FCT(parse_attribute_name(node, new, 1));
CHECK_FCT(parse_attribute_id(node, new));
CHECK_FCT(parse_attribute_size(node, new, 1));
CHECK_FCT(parse_attribute_align(node, new, 1));
CHECK_FCT(parse_attribute_context(node, new, 0));
CHECK_FCT(parse_attribute_line(node, new));
CHECK_FCT(parse_attribute_file(node, new));
CHECK_FCT(parse_attribute_artificial(node, new));
CHECK_FCT(types_insert_tail(head, new));
/* Parse enum values */
for (enum_value_node = node->children; enum_value_node; enum_value_node = enum_value_node->next) {
if (strcmp ((char *) enum_value_node->name, "EnumValue") == 0)
CHECK_FCT(parse_enum_values(enum_value_node, new));
}
return 0;
}
static int parse_union(xmlNode *node, types_t **head) {
types_t *new;
if (node == NULL)
return -1;
new = type_new (TYPE_UNION);
CHECK_FCT(parse_attribute_name(node, new, 0));
CHECK_FCT(parse_attribute_id(node, new));
CHECK_FCT(parse_attribute_size(node, new, 1));
CHECK_FCT(parse_attribute_align(node, new, 1));
CHECK_FCT(parse_attribute_context(node, new, 0));
CHECK_FCT(parse_attribute_members(node, new, 0));
CHECK_FCT(parse_attribute_line(node, new));
CHECK_FCT(parse_attribute_file(node, new));
CHECK_FCT(parse_attribute_artificial(node, new));
CHECK_FCT(parse_attribute_mangled(node, new, 0));
CHECK_FCT(parse_attribute_demangled(node, new, 0));
if (new->name)
if (strcmp (new->name, "msg_s") == 0)
new->type_dissect_from_buffer = union_msg_dissect_from_buffer;
CHECK_FCT(types_insert_tail(head, new));
return 0;
}
static int parse_fundamental(xmlNode *node, types_t **head) {
types_t *new;
if (node == NULL)
return -1;
new = type_new (TYPE_FUNDAMENTAL);
CHECK_FCT(parse_attribute_name(node, new, 1));
CHECK_FCT(parse_attribute_id(node, new));
CHECK_FCT(parse_attribute_size(node, new, 0));
CHECK_FCT(parse_attribute_align(node, new, 0));
CHECK_FCT(types_insert_tail(head, new));
return 0;
}
static int parse_struct(xmlNode *node, types_t **head) {
types_t *new;
if (node == NULL)
return -1;
new = type_new (TYPE_STRUCT);
CHECK_FCT(parse_attribute_name(node, new, 0));
CHECK_FCT(parse_attribute_id(node, new));
CHECK_FCT(parse_attribute_size(node, new, 0));
CHECK_FCT(parse_attribute_align(node, new, 0));
CHECK_FCT(parse_attribute_file(node, new));
CHECK_FCT(parse_attribute_line(node, new));
CHECK_FCT(parse_attribute_context(node, new, 0));
CHECK_FCT(parse_attribute_artificial(node, new));
CHECK_FCT(parse_attribute_members(node, new, 0));
CHECK_FCT(parse_attribute_mangled(node, new, 0));
CHECK_FCT(parse_attribute_demangled(node, new, 0));
CHECK_FCT(types_insert_tail(head, new));
return 0;
}
static int parse_typedef(xmlNode *node, types_t **head) {
types_t *new;
if (node == NULL)
return -1;
new = type_new (TYPE_TYPEDEF);
CHECK_FCT(parse_attribute_name(node, new, 1));
CHECK_FCT(parse_attribute_id(node, new));
CHECK_FCT(parse_attribute_file(node, new));
CHECK_FCT(parse_attribute_line(node, new));
CHECK_FCT(parse_attribute_type(node, new, 1));
CHECK_FCT(parse_attribute_size(node, new, 0));
CHECK_FCT(parse_attribute_align(node, new, 0));
CHECK_FCT(parse_attribute_context(node, new, 0));
CHECK_FCT(parse_attribute_artificial(node, new));
CHECK_FCT(parse_attribute_members(node, new, 0));
CHECK_FCT(parse_attribute_mangled(node, new, 0));
CHECK_FCT(parse_attribute_demangled(node, new, 0));
CHECK_FCT(types_insert_tail(head, new));
return 0;
}
static int parse_field(xmlNode *node, types_t **head) {
types_t *new;
if (node == NULL)
return -1;
new = type_new (TYPE_FIELD);
CHECK_FCT(parse_attribute_name(node, new, 1));
CHECK_FCT(parse_attribute_id(node, new));
CHECK_FCT(parse_attribute_type(node, new, 1));
CHECK_FCT(parse_attribute_size(node, new, 0));
CHECK_FCT(parse_attribute_bits(node, new, 0));
CHECK_FCT(parse_attribute_offset(node, new, 0));
CHECK_FCT(parse_attribute_align(node, new, 0));
CHECK_FCT(parse_attribute_context(node, new, 0));
CHECK_FCT(parse_attribute_artificial(node, new));
CHECK_FCT(parse_attribute_members(node, new, 0));
CHECK_FCT(parse_attribute_mangled(node, new, 0));
CHECK_FCT(parse_attribute_demangled(node, new, 0));
CHECK_FCT(types_insert_tail(head, new));
return 0;
}
static int parse_file(xmlNode *node, types_t **head) {
types_t *new;
if (node == NULL)
return -1;
new = type_new (TYPE_FILE);
CHECK_FCT(parse_attribute_name(node, new, 1));
CHECK_FCT(parse_attribute_id(node, new));
CHECK_FCT(types_insert_tail(head, new));
return 0;
}
static int parse_reference_type(xmlNode *node, types_t **head) {
types_t *new;
if (node == NULL)
return -1;
new = type_new (TYPE_REFERENCE);
CHECK_FCT(parse_attribute_id(node, new));
CHECK_FCT(parse_attribute_type(node, new, 1));
CHECK_FCT(parse_attribute_size(node, new, 1));
CHECK_FCT(parse_attribute_align(node, new, 1));
CHECK_FCT(parse_attribute_context(node, new, 0));
CHECK_FCT(parse_attribute_offset(node, new, 0));
CHECK_FCT(parse_attribute_file(node, new));
CHECK_FCT(parse_attribute_line(node, new));
CHECK_FCT(types_insert_tail(head, new));
return 0;
}
static int parse_array_type(xmlNode *node, types_t **head) {
types_t *new;
if (node == NULL)
return -1;
new = type_new (TYPE_ARRAY);
CHECK_FCT(parse_attribute_id(node, new));
CHECK_FCT(parse_attribute_type(node, new, 1));
CHECK_FCT(parse_attribute_size(node, new, 0));
CHECK_FCT(parse_attribute_align(node, new, 1));
CHECK_FCT(parse_attribute_min(node, new, 1));
CHECK_FCT(parse_attribute_max(node, new, 1));
CHECK_FCT(types_insert_tail(head, new));
return 0;
}
static int parse_pointer_type(xmlNode *node, types_t **head) {
types_t *new;
if (node == NULL)
return -1;
new = type_new (TYPE_POINTER);
CHECK_FCT(parse_attribute_id(node, new));
CHECK_FCT(parse_attribute_type(node, new, 1));
CHECK_FCT(parse_attribute_size(node, new, 1));
CHECK_FCT(parse_attribute_align(node, new, 1));
CHECK_FCT(types_insert_tail(head, new));
return 0;
}
static int parse_function_type(xmlNode *node, types_t **head) {
types_t *new;
if (node == NULL)
return -1;
new = type_new (TYPE_FUNCTION);
CHECK_FCT(parse_attribute_id(node, new));
CHECK_FCT(types_insert_tail(head, new));
return 0;
}
/**
* print_element_names:
* @a_node: the initial xml node to consider.
*
* Prints the names of the all the xml elements
* that are siblings or children of a given xml node.
*/
static int parse_elements(xmlNode * a_node, types_t **head) {
xmlNode *cur_node = NULL;
xmlNode *child_node = NULL;
for (cur_node = a_node; cur_node; cur_node = cur_node->next) {
for (child_node = cur_node->children; child_node; child_node = child_node->next) {
if (child_node->type == XML_ELEMENT_NODE) {
if (strcmp ((char *) child_node->name, "Enumeration") == 0) {
CHECK_FCT_DO(parse_enumeration(child_node, head), return RC_FAIL);
}
else
if (strcmp ((char *) child_node->name, "FundamentalType") == 0) {
CHECK_FCT_DO(parse_fundamental(child_node, head), return RC_FAIL);
}
else
if (strcmp ((char *) child_node->name, "Struct") == 0) {
CHECK_FCT_DO(parse_struct(child_node, head), return RC_FAIL);
}
else
if (strcmp ((char *) child_node->name, "Union") == 0) {
CHECK_FCT_DO(parse_union(child_node, head), return RC_FAIL);
}
else
if (strcmp ((char *) child_node->name, "Typedef") == 0) {
CHECK_FCT_DO(parse_typedef(child_node, head), return RC_FAIL);
}
else
if (strcmp ((char *) child_node->name, "File") == 0) {
CHECK_FCT_DO(parse_file(child_node, head), return RC_FAIL);
}
else
if (strcmp ((char *) child_node->name, "Field") == 0) {
CHECK_FCT_DO(parse_field(child_node, head), return RC_FAIL);
}
else
if (strcmp ((char *) child_node->name, "ReferenceType") == 0) {
CHECK_FCT_DO(parse_reference_type(child_node, head), return RC_FAIL);
}
else
if (strcmp ((char *) child_node->name, "ArrayType") == 0) {
CHECK_FCT_DO(parse_array_type(child_node, head), return RC_FAIL);
}
else
if (strcmp ((char *) child_node->name, "PointerType") == 0) {
CHECK_FCT_DO(parse_pointer_type(child_node, head), return RC_FAIL);
}
else
if (strcmp ((char *) child_node->name, "FunctionType") == 0) {
CHECK_FCT_DO(parse_function_type(child_node, head), return RC_FAIL);
}
}
}
}
return RC_OK;
}
static int free_elements(types_t *parent, int indent) {
types_t *cur_node = parent;
types_t *child_node;
g_debug("%*s%p %s", indent, "", cur_node, cur_node->name != NULL ? cur_node->name : "");
for (; cur_node != NULL; cur_node = cur_node->next) {
if (cur_node->child != NULL) {
child_node = cur_node->child;
cur_node->child = NULL; /* Clear the child pointer to avoid re-processing it, we are handling a graph with loops */
CHECK_FCT_DO(free_elements((child_node), indent + 2), return RC_FAIL);
}
}
free (cur_node);
return RC_OK;
}
int xml_parse_buffer(char *xml_buffer, const int size) {
xmlDocPtr doc; /* the resulting document tree */
if (xml_buffer == NULL) {
return RC_NULL_POINTER;
}
if (xml_raw_data != NULL)
{
/* Free previous raw data */
free (xml_raw_data);
}
xml_raw_data = xml_buffer;
xml_raw_data_size = size;
if (xml_head != NULL)
{
/* Free previous definitions */
free_elements(xml_head, 0);
g_info("xml_parse_buffer freed previous definitions");
}
xml_head = NULL;
root = NULL;
messages_id_enum = NULL;
lte_time_type = NULL;
lte_time_frame_type = NULL;
lte_time_slot_type = NULL;
origin_task_id_type = NULL;
destination_task_id_type = NULL;
instance_type = NULL;
message_header_type = NULL;
message_type = NULL;
message_size_type = NULL;
g_info("Parsing XML definition from buffer ...");
doc = xmlReadMemory(xml_buffer, size, NULL, NULL, 0);
if (doc == NULL) {
g_warning("Failed to parse XML buffer: %s", xml_buffer);
ui_notification_dialog(GTK_MESSAGE_ERROR, FALSE, "parse messages format definition", "Fail to parse XML buffer");
return RC_FAIL;
}
return xml_parse_doc(doc);
}
static int update_filters() {
types_t *types;
ui_init_filters(FALSE, TRUE);
types = messages_id_enum;
if (types != NULL)
{
types = types->child;
while (types != NULL)
{
if (strcmp (types->name, "MESSAGES_ID_MAX") != 0)
{
ui_filters_add (FILTER_MESSAGES, types->init_value, types->name, ENTRY_ENABLED_UNDEFINED, NULL, NULL);
}
types = types->next;
}
}
types = origin_task_id_type;
if (types != NULL)
{
types = types->child->child;
while (types != NULL) {
if ((strcmp (types->name, "TASK_FIRST") != 0) && (strcmp (types->name, "TASK_MAX") != 0))
{
ui_filters_add(FILTER_ORIGIN_TASKS, types->init_value, types->name, ENTRY_ENABLED_UNDEFINED, NULL, NULL);
}
types = types->next;
}
}
types = destination_task_id_type;
if (types != NULL)
{
types = types->child->child;
while (types != NULL) {
if ((strcmp (types->name, "TASK_FIRST") != 0) && (strcmp (types->name, "TASK_MAX") != 0))
{
ui_filters_add(FILTER_DESTINATION_TASKS, types->init_value, types->name, ENTRY_ENABLED_UNDEFINED, NULL, NULL);
}
types = types->next;
}
}
return RC_OK;
}
static int xml_parse_doc(xmlDocPtr doc) {
xmlNode *root_element = NULL;
int ret = 0;
FILE *dissect_file = NULL;
if (ui_main_data.dissect_file_name != NULL) {
dissect_file = fopen (ui_main_data.dissect_file_name, "w");
}
/* Get the root element node */
root_element = xmlDocGetRootElement(doc);
ret = parse_elements(root_element, &xml_head);
/* Free the document */
xmlFreeDoc(doc);
if (ret == RC_OK) {
resolve_typedefs (&xml_head);
resolve_pointer_type (&xml_head);
resolve_field (&xml_head);
resolve_array (&xml_head);
resolve_reference (&xml_head);
resolve_struct (&xml_head);
resolve_file (&xml_head);
resolve_union (&xml_head);
resolve_function (&xml_head);
/* Locate the root element which corresponds to the MessageDef struct */
CHECK_FCT(locate_root("MessageDef", xml_head, &root));
/* Locate the LTE time fields */
if (locate_type("lte_time", xml_head, &lte_time_type) == RC_OK)
{
CHECK_FCT(locate_type("frame", lte_time_type->child->child, &lte_time_frame_type));
CHECK_FCT(locate_type("slot", lte_time_type->child->child, &lte_time_slot_type));
}
/* Locate the message id field */
CHECK_FCT(locate_type("MessagesIds", xml_head, &messages_id_enum));
/* Locate the header part of a message */
CHECK_FCT(locate_type("ittiMsgHeader", xml_head, &message_header_type));
/* Locate the main message part */
CHECK_FCT(locate_type("ittiMsg", xml_head, &message_type));
/* Locate the origin task id field */
CHECK_FCT(locate_type_children("originTaskId", message_header_type->child->child, &origin_task_id_type));
/* Locate the destination task id field */
CHECK_FCT(locate_type_children("destinationTaskId", message_header_type->child->child, &destination_task_id_type));
/* Locate the instance field */
CHECK_FCT(locate_type_children("instance", message_header_type->child->child, &instance_type));
/* Locate the message size field */
CHECK_FCT(locate_type_children("ittiMsgSize", message_header_type->child->child, &message_size_type));
// root->type_hr_display(root, 0);
update_filters();
if (dissect_file != NULL) {
g_debug("generating dissected types file \"%s\" ...", ui_main_data.dissect_file_name);
root->type_file_print (root, 0, dissect_file);
}
}
if (dissect_file != NULL) {
fclose (dissect_file);
}
g_message("Parsed XML definition");
return ret;
}
int dissect_signal_header(buffer_t *buffer, ui_set_signal_text_cb_t ui_set_signal_text_cb,
gpointer cb_user_data)
{
if (message_header_type == NULL) {
g_error("No messages format definition provided");
return RC_FAIL;
}
if (buffer == NULL) {
g_error("Failed buffer is NULL");
return RC_FAIL;
}
message_header_type->type_dissect_from_buffer(
message_header_type, ui_set_signal_text_cb, cb_user_data,
buffer, 0, 0, INDENT_START, TRUE);
return RC_OK;
}
int dissect_signal(buffer_t *buffer, ui_set_signal_text_cb_t ui_set_signal_text_cb,
gpointer cb_user_data)
{
if (message_type == NULL) {
g_error("No messages format definition provided");
return RC_FAIL;
}
if (buffer == NULL) {
g_error("Failed buffer is NULL");
return RC_FAIL;
}
message_type->type_dissect_from_buffer(message_type, ui_set_signal_text_cb, cb_user_data,
buffer, 0, 0, INDENT_START, TRUE);
return RC_OK;
}
@@ -1,43 +0,0 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#include "rc.h"
#include "types.h"
#ifndef XML_PARSE_H_
#define XML_PARSE_H_
extern void *xml_raw_data;
extern uint32_t xml_raw_data_size;
extern types_t *root;
int xml_parse_file(const char *filename);
int xml_parse_buffer(char *xml_buffer, const int size);
int dissect_signal(buffer_t *buffer, ui_set_signal_text_cb_t ui_set_signal_text_cb,
gpointer user_data);
int dissect_signal_header(buffer_t *buffer, ui_set_signal_text_cb_t ui_set_signal_text_cb,
gpointer cb_user_data);
#endif /* XML_PARSE_H_ */
@@ -1,13 +0,0 @@
AM_CFLAGS = \
@ADD_CFLAGS@ \
-I$(top_srcdir)/common \
-I$(top_srcdir)/libparser \
-I$(top_srcdir)/libui \
-I$(top_srcdir)/libbuffers
noinst_LTLIBRARIES = libresolver.la
libresolver_la_LDFLAGS = -all-static
libresolver_la_SOURCES = \
locate_root.c locate_root.h \
resolvers.c resolvers.h
@@ -1,251 +0,0 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#include <stdio.h>
#include <string.h>
#define G_LOG_DOMAIN ("RESOLVER")
#include <glib.h>
#include "logs.h"
#include "rc.h"
#include "types.h"
#include "enum_type.h"
#include "locate_root.h"
#include "xml_parse.h"
types_t *messages_id_enum;
types_t *lte_time_type;
types_t *lte_time_frame_type;
types_t *lte_time_slot_type;
types_t *origin_task_id_type;
types_t *destination_task_id_type;
types_t *instance_type;
types_t *message_header_type;
types_t *message_type;
types_t *message_size_type;
int locate_root(const char *root_name, types_t *head, types_t **root_elm) {
types_t *next_type;
int next_counter = 0;
/* The root element is for example : MessageDef.
* This element is the entry for other sub-types.
*/
if (!root_name || (strlen (root_name) == 0)) {
g_warning("FATAL: no root element name provided");
return -1;
}
if (!head) {
g_warning("Empty list detected");
return -1;
}
if (!root_elm) {
g_warning("NULL root reference");
return -1;
}
for (next_type = head; next_type; next_type = next_type->next) {
if (next_type->name == NULL)
continue;
if (strcmp (root_name, next_type->name) == 0) {
/* Matching reference */
break;
}
next_counter ++;
}
g_info("locate_root: %s %d", root_name, next_counter);
*root_elm = next_type;
return (next_type == NULL) ? -2 : 0;
}
int locate_type(const char *type_name, types_t *head, types_t **type) {
types_t *next_type;
int next_counter = 0;
/* The root element is for example : MessageDef.
* This element is the entry for other sub-types.
*/
if (!type_name) {
g_warning("FATAL: no element name provided");
return RC_BAD_PARAM;
}
if (!head) {
g_warning("Empty list detected");
return RC_BAD_PARAM;
}
for (next_type = head; next_type; next_type = next_type->next) {
if (next_type->name == NULL)
continue;
if (strcmp (type_name, next_type->name) == 0) {
/* Matching reference */
break;
}
next_counter ++;
}
g_info("locate_type: %s %d %p", type_name, next_counter, next_type);
if (type)
*type = next_type;
return (next_type == NULL) ? RC_FAIL : RC_OK;
}
int locate_type_children(const char *type_name, types_t *head, types_t **type) {
types_t *found_type = NULL;
int i;
/* The root element is for example : MessageDef.
* This element is the entry for other sub-types.
*/
if (!type_name) {
g_warning("FATAL: no element name provided");
return RC_BAD_PARAM;
}
if (!head) {
g_warning("Empty list detected");
return RC_BAD_PARAM;
}
for (i = 0; i < head->nb_members; i++) {
if (head->members_child[i]->name == NULL)
continue;
if (strcmp (type_name, head->members_child[i]->name) == 0) {
/* Matching reference */
found_type = head->members_child[i];
break;
}
}
g_info("locate_type: %s %d %p", type_name, i, found_type);
if (type)
*type = found_type;
return (found_type == NULL) ? RC_FAIL : RC_OK;
}
uint32_t get_message_header_type_size(void)
{
/* Typedef */
if (message_header_type->child != NULL) {
/* Struct */
if (message_header_type->child->child != NULL) {
return message_header_type->child->child->size;
}
}
return 0;
}
uint32_t get_message_size(buffer_t *buffer)
{
uint32_t value = 0;
if (message_size_type != NULL)
{
types_t *temp = message_size_type;
while (temp->size == -1) {
temp = temp->child;
}
/* Fetch instance value */
buffer_fetch_bits (buffer, message_size_type->offset, temp->size, &value);
}
return value;
}
uint32_t get_lte_frame(buffer_t *buffer) {
uint32_t value = 0;
if (lte_time_type !=NULL)
{
/* Fetch instance value */
buffer_fetch_bits (buffer, lte_time_type->offset + lte_time_frame_type->offset, lte_time_frame_type->child->child->size, &value);
}
return value;
}
uint32_t get_lte_slot(buffer_t *buffer) {
uint32_t value = 0;
if (lte_time_type !=NULL)
{
/* Fetch instance value */
buffer_fetch_bits (buffer, lte_time_type->offset + lte_time_slot_type->offset, lte_time_slot_type->child->child->size, &value);
}
return value;
}
uint32_t get_message_id(types_t *head, buffer_t *buffer, uint32_t *message_id) {
uint32_t value;
g_assert(message_id != NULL);
g_assert(buffer != NULL);
/* MessageId is an offset from start of buffer */
value = buffer_get_uint32_t(buffer, messages_id_enum->offset);
*message_id = value;
return RC_OK;
}
uint32_t get_task_id(buffer_t *buffer, types_t *task_id_type) {
uint32_t task_id_value;
/* Fetch task id value */
if (buffer_fetch_bits (buffer, task_id_type->offset, task_id_type->child->size, &task_id_value) != RC_OK)
{
return ~0;
}
return task_id_value;
}
char *task_id_to_string(uint32_t task_id_value, types_t *task_id_type) {
char *task_id = "UNKNOWN";
if (task_id_value < ((uint32_t) ~0))
{
/* Search task id name */
task_id = enum_type_get_name_from_value (task_id_type->child, task_id_value);
}
return task_id;
}
uint32_t get_instance(buffer_t *buffer) {
uint32_t instance_value;
/* Fetch instance value */
buffer_fetch_bits (buffer, instance_type->offset, instance_type->child->child->child->size, &instance_value);
return instance_value;
}
char *message_id_to_string(uint32_t message_id)
{
return enum_type_get_name_from_value(messages_id_enum, message_id);
}
@@ -1,62 +0,0 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#ifndef LOCATE_ROOT_H_
#define LOCATE_ROOT_H_
#include "types.h"
extern types_t *messages_id_enum;
extern types_t *lte_time_type;
extern types_t *lte_time_frame_type;
extern types_t *lte_time_slot_type;
extern types_t *origin_task_id_type;
extern types_t *destination_task_id_type;
extern types_t *instance_type;
extern types_t *message_header_type;
extern types_t *message_type;
extern types_t *message_size_type;
int locate_root(const char *root_name, types_t *head, types_t **root);
int locate_type(const char *type_name, types_t *head, types_t **type);
int locate_type_children(const char *type_name, types_t *head, types_t **type);
uint32_t get_message_header_type_size(void);
uint32_t get_message_size(buffer_t *buffer);
uint32_t get_lte_frame(buffer_t *buffer);
uint32_t get_lte_slot(buffer_t *buffer);
uint32_t get_message_id(types_t *head, buffer_t *buffer, uint32_t *message_id);
char *message_id_to_string(uint32_t message_id);
uint32_t get_task_id(buffer_t *buffer, types_t *task_id_type);
char *task_id_to_string(uint32_t task_id_value, types_t *task_id_type);
uint32_t get_instance(buffer_t *buffer);
#endif /* LOCATE_ROOT_H_ */
@@ -1,384 +0,0 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define G_LOG_DOMAIN ("RESOLVER")
#include <glib.h>
#include "types.h"
#include "resolvers.h"
typedef enum {
RESOLV_OK = 0,
RESOLV_ERROR = -1,
RESOLV_LIST_EMPTY = -2,
RESOLV_NOT_FOUND = -3,
} resolv_rc_e;
static int search_id(types_t *head, types_t **found, int id)
{
types_t *next_type;
if (!head) {
g_warning("Empty list detected");
return RESOLV_LIST_EMPTY;
}
for (next_type = head; next_type; next_type = next_type->next)
{
if (next_type->id == id && next_type->type != TYPE_FILE)
break;
}
if (found)
*found = next_type;
return next_type == NULL ? RESOLV_NOT_FOUND : RESOLV_OK;
}
int search_file(types_t *head, types_t **found, int file_id)
{
types_t *next_type;
if (!head) {
g_warning("Empty list detected");
return RESOLV_LIST_EMPTY;
}
for (next_type = head; next_type; next_type = next_type->next)
{
if (next_type->type != TYPE_FILE)
continue;
if (file_id == next_type->id)
break;
}
if (found)
*found = next_type;
return next_type == NULL ? RESOLV_NOT_FOUND : RESOLV_OK;
}
int resolve_typedefs(types_t **head)
{
types_t *next_type;
if (!head) {
g_warning("Empty list detected");
return RESOLV_LIST_EMPTY;
}
for (next_type = *head; next_type; next_type = next_type->next)
{
/* Only resolve typedef */
if (next_type->type != TYPE_TYPEDEF)
continue;
// printf("Trying to resolve typedef %s with type %d\n", next_type->name, next_type->id);
if (search_id(*head, &next_type->child, next_type->type_xml) != RESOLV_OK) {
/* We have to remove this reference */
}/* else {
next_type->type_hr_display(next_type, 0);
}*/
}
return 0;
}
int resolve_struct(types_t **head)
{
types_t *next_type;
if (!head) {
g_warning("Empty list detected");
return RESOLV_LIST_EMPTY;
}
for (next_type = *head; next_type; next_type = next_type->next)
{
char *member;
char *members;
/* Only resolve typedef */
if (next_type->type != TYPE_STRUCT)
continue;
g_debug("Trying to resolve struct members %s with type %d", next_type->name, next_type->id);
/* Struct may have no member */
if (next_type->members == NULL)
continue;
/* We have to copy the string as strtok will split the string in argument */
members = strdup(next_type->members);
/* Split the string on spaces and _ */
member = strtok(members, " _");
while(member != NULL)
{
if (next_type->nb_members == 0) {
next_type->members_child = malloc(sizeof(types_t *));
} else {
next_type->members_child = realloc(next_type->members_child,
(next_type->nb_members + 1) * sizeof(types_t *));
}
if (search_id(*head, &next_type->members_child[next_type->nb_members], atoi(member)) != RESOLV_OK) {
/* We have to remove this reference */
}
if ((next_type->members_child[next_type->nb_members] != NULL)
&& (next_type->members_child[next_type->nb_members]->type != TYPE_FIELD))
{
/* Only keep field child for structure, other member can be present
* for defining types (union or struct) used by fields but should not be considered. */
next_type->members_child[next_type->nb_members] = NULL;
/* We have to remove this reference */
}
next_type->nb_members++;
/* Pick up the next string available */
member = strtok(NULL, " _");
}
free(members);
}
return 0;
}
int resolve_union(types_t **head)
{
types_t *next_type;
if (!head) {
g_warning("Empty list detected");
return RESOLV_LIST_EMPTY;
}
for (next_type = *head; next_type; next_type = next_type->next)
{
char *member;
char *members;
/* Only resolve typedef */
if (next_type->type != TYPE_UNION)
continue;
g_debug("Trying to resolve union members %s with type %d\n", next_type->name, next_type->id);
/* Struct may have no member */
if (next_type->members == NULL)
continue;
/* We have to copy the string as strtok will modify the string in argument */
members = strdup(next_type->members);
/* Split the string on spaces and _ */
member = strtok(members, " _");
while(member != NULL)
{
if (next_type->nb_members == 0) {
next_type->members_child = malloc(sizeof(types_t *));
} else {
next_type->members_child = realloc(next_type->members_child,
(next_type->nb_members + 1) * sizeof(types_t *));
}
if (search_id(*head, &next_type->members_child[next_type->nb_members], atoi(member)) != RESOLV_OK) {
/* We have to remove this reference */
}
next_type->nb_members++;
/* Pick up the next string available */
member = strtok(NULL, " _");
}
free(members);
}
return 0;
}
int resolve_pointer_type(types_t **head)
{
types_t *next_type;
if (!head) {
g_warning("Empty list detected");
return RESOLV_LIST_EMPTY;
}
for (next_type = *head; next_type; next_type = next_type->next)
{
/* Only resolve typedef */
if (next_type->type != TYPE_POINTER)
continue;
g_debug("Trying to resolve pointer id %d with type %d",
next_type->id, next_type->type_xml);
if (search_id(*head, &next_type->child, next_type->type_xml) != RESOLV_OK) {
/* We have to remove this reference */
}
// next_type->type_hr_display(next_type, 0);
}
return 0;
}
int resolve_reference(types_t **head)
{
types_t *next_type;
if (!head) {
g_warning("Empty list detected");
return RESOLV_LIST_EMPTY;
}
for (next_type = *head; next_type; next_type = next_type->next)
{
/* Only resolve typedef */
if (next_type->type != TYPE_REFERENCE)
continue;
g_debug("Trying to resolve reference id %d with type %d\n",
next_type->id, next_type->type_xml);
if (search_id(*head, &next_type->child, next_type->type_xml) != RESOLV_OK) {
/* We have to remove this reference */
}
// next_type->type_hr_display(next_type, 0);
}
return 0;
}
int resolve_field(types_t **head)
{
types_t *next_type;
if (!head) {
g_warning("Empty list detected");
return RESOLV_LIST_EMPTY;
}
for (next_type = *head; next_type; next_type = next_type->next)
{
/* Only resolve typedef */
if (next_type->type != TYPE_FIELD)
continue;
g_debug("Trying to resolve pointer id %d with type %d\n",
next_type->id, next_type->type_xml);
if (search_id(*head, &next_type->child, next_type->type_xml) != RESOLV_OK) {
/* We have to remove this reference */
}
// next_type->type_hr_display(next_type, 0);
}
return 0;
}
int resolve_array(types_t **head)
{
types_t *next_type;
if (!head) {
g_warning("Empty list detected");
return RESOLV_LIST_EMPTY;
}
for (next_type = *head; next_type; next_type = next_type->next)
{
/* Only resolve typedef */
if (next_type->type != TYPE_ARRAY)
continue;
g_debug("Trying to resolve array id %d with type %d\n",
next_type->id, next_type->type_xml);
if (search_id(*head, &next_type->child, next_type->type_xml) != RESOLV_OK) {
/* We have to remove this reference */
}
// next_type->type_hr_display(next_type, 0);
}
return 0;
}
int resolve_function(types_t **head)
{
types_t *next_type;
if (!head) {
g_warning("Empty list detected");
return RESOLV_LIST_EMPTY;
}
for (next_type = *head; next_type; next_type = next_type->next)
{
/* Only resolve typedef */
if (next_type->type != TYPE_FUNCTION)
continue;
g_debug("Trying to resolve function id %d with type %d",
next_type->id, next_type->type_xml);
if (search_id(*head, &next_type->child, next_type->type_xml) != RESOLV_OK) {
/* We have to remove this reference */
}
// next_type->type_hr_display(next_type, 0);
}
return 0;
}
int resolve_file(types_t **head)
{
types_t *next_type;
if (!head) {
g_warning("Empty list detected");
return RESOLV_LIST_EMPTY;
}
for (next_type = *head; next_type; next_type = next_type->next)
{
/* Only resolve typedef */
if (next_type->type == TYPE_FILE)
continue;
/* No reference to a file */
if (next_type->file == NULL) {
continue;
}
g_debug("Trying to resolve file %s\n", next_type->file);
if (search_file(*head, &next_type->file_ref, atoi(&next_type->file[1])) != RESOLV_OK) {
/* We have to remove this reference */
}
// next_type->type_hr_display(next_type, 0);
}
return 0;
}
@@ -1,45 +0,0 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#ifndef RESOLVERS_H_
#define RESOLVERS_H_
int resolve_typedefs(types_t **head);
int resolve_struct(types_t **head);
int resolve_pointer_type(types_t **head);
int resolve_field(types_t **head);
int resolve_array(types_t **head);
int resolve_reference(types_t **head);
int resolve_union(types_t **head);
int resolve_file(types_t **head);
int resolve_function(types_t **head);
int search_file(types_t *head, types_t **found, int id);
#endif /* RESOLVERS_H_ */
@@ -1,21 +0,0 @@
AM_CFLAGS = \
@ADD_CFLAGS@ \
-I$(top_srcdir)/common \
-I$(top_srcdir)/libbuffers \
-I$(top_srcdir)/libparser \
-I$(top_srcdir)/libresolver
noinst_LTLIBRARIES = libui.la
libui_la_LDFLAGS = -all-static
libui_la_SOURCES = \
ui_main_screen.c ui_main_screen.h \
ui_menu_bar.c ui_menu_bar.h \
ui_callbacks.c ui_callbacks.h \
ui_tree_view.c ui_tree_view.h \
ui_signal_dissect_view.c ui_signal_dissect_view.h \
ui_notifications.c ui_notifications.h \
ui_notif_dlg.c ui_notif_dlg.h \
ui_interface.c ui_interface.h \
ui_notebook.c ui_notebook.h \
ui_filters.c ui_filters.h
@@ -1,983 +0,0 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#if HAVE_CONFIG_H
# include "config.h"
#endif
#include <stdlib.h>
#include <stdint.h>
#define G_LOG_DOMAIN ("UI_CB")
#include <gtk/gtk.h>
#include "logs.h"
#include "rc.h"
#include "socket.h"
#include "ui_notif_dlg.h"
#include "ui_main_screen.h"
#include "ui_menu_bar.h"
#include "ui_callbacks.h"
#include "ui_interface.h"
#include "ui_notifications.h"
#include "ui_tree_view.h"
#include "ui_signal_dissect_view.h"
#include "ui_filters.h"
#include "ui_notebook.h"
#include "types.h"
#include "locate_root.h"
#include "xml_parse.h"
static gboolean refresh_message_list = TRUE;
static gboolean filters_changed = FALSE;
static gboolean operation_running = FALSE;
static const char *ui_ip;
static uint16_t ui_port;
static GtkWidget *dialogbox_connect;
static gboolean ui_auto_reconnect;
gboolean ui_callback_on_open_messages(GtkWidget *widget, gpointer data)
{
gboolean refresh = (data != NULL) ? TRUE : FALSE;
g_message("Open messages event occurred %d", refresh);
if (operation_running == FALSE)
{
operation_running = TRUE;
if (refresh && (ui_main_data.messages_file_name != NULL))
{
ui_messages_read (ui_main_data.messages_file_name);
}
else
{
ui_messages_open_file_chooser ();
}
operation_running = FALSE;
}
return TRUE;
}
gboolean ui_callback_on_save_messages(GtkWidget *widget, gpointer data)
{
gboolean filtered = (data != NULL) ? TRUE : FALSE;
g_message("Save messages event occurred %d", filtered);
if (operation_running == FALSE)
{
operation_running = TRUE;
ui_messages_save_file_chooser(filtered);
operation_running = FALSE;
}
return TRUE;
}
gboolean ui_callback_on_filters_enabled(GtkToolButton *button, gpointer data)
{
gboolean enabled;
gboolean changed;
enabled = gtk_toggle_tool_button_get_active (GTK_TOGGLE_TOOL_BUTTON(button));
g_info("Filters enabled event occurred %d", enabled);
changed = ui_filters_enable (enabled);
if (changed)
{
/* Set the tool tip text */
if (enabled)
{
gtk_tool_item_set_tooltip_text (GTK_TOOL_ITEM(button), "Disable messages filtering");
}
else
{
gtk_tool_item_set_tooltip_text (GTK_TOOL_ITEM(button), "Enable messages filtering");
}
ui_tree_view_refilter ();
}
return TRUE;
}
gboolean ui_callback_on_open_filters(GtkWidget *widget, gpointer data)
{
gboolean refresh = (data != NULL) ? TRUE : FALSE;
g_message("Open filters event occurred");
if (operation_running == FALSE)
{
operation_running = TRUE;
if (refresh && (ui_main_data.filters_file_name != NULL))
{
ui_filters_read (ui_main_data.filters_file_name);
}
else
{
ui_filters_open_file_chooser ();
}
operation_running = FALSE;
}
return TRUE;
}
gboolean ui_callback_on_save_filters(GtkWidget *widget, gpointer data)
{
if (operation_running == FALSE)
{
operation_running = TRUE;
g_message("Save filters event occurred");
ui_filters_save_file_chooser();
operation_running = FALSE;
}
return TRUE;
}
gboolean ui_callback_on_enable_filters(GtkWidget *widget, gpointer data)
{
gboolean enabled;
enabled = gtk_toggle_tool_button_get_active (GTK_TOGGLE_TOOL_BUTTON(ui_main_data.filters_enabled));
gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON(ui_main_data.filters_enabled), !enabled);
return TRUE;
}
gboolean ui_callback_on_about(GtkWidget *widget, gpointer data)
{
#if defined(PACKAGE_STRING)
ui_notification_dialog (GTK_MESSAGE_INFO, FALSE, "about", "Eurecom %s", PACKAGE_STRING);
#else
ui_notification_dialog (GTK_MESSAGE_INFO, FALSE, "about", "Eurecom itti_analyzer");
#endif
return TRUE;
}
gint ui_callback_check_string (const char *string, const gint lenght, const guint message_number)
{
gint real_length;
real_length = strnlen (string, lenght);
if (lenght != real_length)
{
if (message_number)
{
g_warning("Bad string format for message %u, '\\0' found before end of string (%d/%d)\n", message_number, real_length, lenght);
}
else
{
g_warning("Bad string format, '\\0' found before end of string (%d/%d)\n", real_length, lenght);
}
return (real_length);
}
else
{
return (lenght);
}
}
gboolean ui_callback_on_select_signal(GtkTreeSelection *selection, GtkTreeModel *model, GtkTreePath *path,
gboolean path_currently_selected, gpointer user_data)
{
static gpointer buffer_current;
ui_text_view_t *text_view;
GtkTreeIter iter;
g_debug("Message selected %d %p %p %s", path_currently_selected, buffer_current, path, gtk_tree_path_to_string(path));
if (!path_currently_selected)
{
text_view = (ui_text_view_t *) user_data;
g_assert(text_view != NULL);
if (gtk_tree_model_get_iter (model, &iter, path))
{
gpointer buffer;
uint32_t message_number;
uint32_t message_id;
uint32_t origin_task_id;
uint32_t destination_task_id;
char *instance_name;
uint32_t instance;
char label[100];
gtk_tree_model_get (model, &iter, COL_MSG_NUM, &message_number, COL_MESSAGE_ID, &message_id,
COL_FROM_TASK_ID, &origin_task_id, COL_TO_TASK_ID, &destination_task_id, COL_INSTANCE, &instance_name,
COL_INSTANCE_ID, &instance, COL_BUFFER, &buffer, -1);
g_debug(" Get iter %p %p", buffer_current, buffer);
if (ui_tree_view_last_event)
{
g_debug("last_event %p %d %d", ui_tree_view_last_event, ui_tree_view_last_event->type, ui_tree_view_last_event->button);
if (ui_tree_view_last_event->type == GDK_BUTTON_PRESS)
{
/* Callback is due to a button click */
if (ui_tree_view_last_event->button == 1)
{
/* It was a left mouse click */
gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON(ui_main_data.signals_go_to_last_button), FALSE);
}
if (ui_tree_view_last_event->button == 3)
{
/* It was a right mouse click */
int item;
/* Clear event */
ui_tree_view_last_event = NULL;
/* Create filter menus to refers its items in the pop-up menu */
ui_create_filter_menus ();
g_info("Message selected right click %d %d %d %d", message_id, origin_task_id, destination_task_id, instance);
/* Message Id menu */
{
/* Invalidate associated menu item to avoid issue with call back when updating the menu item check state */
ui_tree_view_menu_enable[MENU_MESSAGE].filter_item = NULL;
item = ui_filters_search_id (&ui_filters.messages, message_id);
/* Update the menu item check state based on message ID state */
gtk_check_menu_item_set_active (
GTK_CHECK_MENU_ITEM(ui_tree_view_menu_enable[MENU_MESSAGE].menu_enable),
ui_filters.messages.items[item].enabled);
/* Set menu item label */
sprintf (label, "Message: %s", message_id_to_string (message_id));
gtk_menu_item_set_label (GTK_MENU_ITEM(ui_tree_view_menu_enable[MENU_MESSAGE].menu_enable),
label);
/* Save menu item associated to this row */
ui_tree_view_menu_enable[MENU_MESSAGE].filter_item = &ui_filters.messages.items[item];
}
/* Origin task id */
{
/* Invalidate associated menu item to avoid issue with call back when updating the menu item check state */
ui_tree_view_menu_enable[MENU_FROM_TASK].filter_item = NULL;
item = ui_filters_search_id (&ui_filters.origin_tasks, origin_task_id);
/* Update the menu item check state based on message ID state */
gtk_check_menu_item_set_active (
GTK_CHECK_MENU_ITEM(ui_tree_view_menu_enable[MENU_FROM_TASK].menu_enable),
ui_filters.origin_tasks.items[item].enabled);
/* Set menu item label */
sprintf (label, "From: %s", task_id_to_string (origin_task_id, origin_task_id_type));
gtk_menu_item_set_label (
GTK_MENU_ITEM(ui_tree_view_menu_enable[MENU_FROM_TASK].menu_enable), label);
/* Save menu item associated to this row */
ui_tree_view_menu_enable[MENU_FROM_TASK].filter_item = &ui_filters.origin_tasks.items[item];
}
/* Destination task id */
{
/* Invalidate associated menu item to avoid issue with call back when updating the menu item check state */
ui_tree_view_menu_enable[MENU_TO_TASK].filter_item = NULL;
item = ui_filters_search_id (&ui_filters.destination_tasks, destination_task_id);
/* Update the menu item check state based on message ID state */
gtk_check_menu_item_set_active (
GTK_CHECK_MENU_ITEM(ui_tree_view_menu_enable[MENU_TO_TASK].menu_enable),
ui_filters.destination_tasks.items[item].enabled);
/* Set menu item label */
sprintf (label, "To: %s",
task_id_to_string (destination_task_id, destination_task_id_type));
gtk_menu_item_set_label (GTK_MENU_ITEM(ui_tree_view_menu_enable[MENU_TO_TASK].menu_enable),
label);
/* Save menu item associated to this row */
ui_tree_view_menu_enable[MENU_TO_TASK].filter_item =
&ui_filters.destination_tasks.items[item];
}
/* Instance */
{
/* Invalidate associated menu item to avoid issue with call back when updating the menu item check state */
ui_tree_view_menu_enable[MENU_INSTANCE].filter_item = NULL;
item = ui_filters_search_id (&ui_filters.instances, instance);
/* Update the menu item check state based on message ID state */
gtk_check_menu_item_set_active (
GTK_CHECK_MENU_ITEM(ui_tree_view_menu_enable[MENU_INSTANCE].menu_enable),
ui_filters.instances.items[item].enabled);
/* Set menu item label */
sprintf (label, "Instance: %s", instance_name);
gtk_menu_item_set_label (GTK_MENU_ITEM(ui_tree_view_menu_enable[MENU_INSTANCE].menu_enable),
label);
/* Save menu item associated to this row */
ui_tree_view_menu_enable[MENU_INSTANCE].filter_item = &ui_filters.instances.items[item];
}
gtk_menu_popup (GTK_MENU (ui_tree_view_menu), NULL, NULL, NULL, NULL, 0,
gtk_get_current_event_time ());
}
}
/* Clear event */
ui_tree_view_last_event = NULL;
}
if (buffer_current != buffer)
{
buffer_current = buffer;
/* Clear the view */
CHECK_FCT_DO(ui_signal_dissect_clear_view(text_view), return FALSE);
if (ui_main_data.display_message_header)
{
CHECK_FCT_DO(dissect_signal_header((buffer_t*)buffer, ui_signal_set_text, text_view), return FALSE);
}
if ((strcmp (message_id_to_string (message_id), "ERROR_LOG") == 0)
|| (strcmp (message_id_to_string (message_id), "WARNING_LOG") == 0)
|| (strcmp (message_id_to_string (message_id), "NOTICE_LOG") == 0)
|| (strcmp (message_id_to_string (message_id), "INFO_LOG") == 0)
|| (strcmp (message_id_to_string (message_id), "DEBUG_LOG") == 0)
|| (strcmp (message_id_to_string (message_id), "GENERIC_LOG") == 0))
{
gchar *data;
gint data_size;
uint32_t message_header_type_size;
if (ui_main_data.display_message_header)
{
ui_signal_set_text (text_view, "\n", 1);
}
message_header_type_size = get_message_header_type_size ();
data = (gchar *) buffer_at_offset ((buffer_t*) buffer, message_header_type_size);
data_size = get_message_size ((buffer_t*) buffer);
data_size = ui_callback_check_string (data, data_size, message_number);
g_info(" dump message %d: header type size: %u, data size: %u, buffer %p, follow last %d",
message_number, message_header_type_size, data_size, buffer, ui_main_data.follow_last);
ui_signal_set_text (text_view, data, data_size);
}
else
{
g_info(" dissect message %d: id %d, buffer %p, follow last %d", message_number, message_id, buffer, ui_main_data.follow_last);
/* Dissect the signal */
CHECK_FCT_DO(dissect_signal((buffer_t*)buffer, ui_signal_set_text, text_view), return FALSE);
}
}
}
}
return TRUE;
}
gboolean ui_callback_on_menu_enable(GtkWidget *widget, gpointer data)
{
ui_tree_view_menu_enable_t *menu_enable = data;
if (menu_enable->filter_item != NULL)
{
gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM(menu_enable->filter_item->menu_item),
gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM(menu_enable->menu_enable)));
menu_enable->filter_item = NULL;
}
return TRUE;
}
gboolean ui_callback_on_menu_color(GtkWidget *widget, gpointer data)
{
ui_tree_view_menu_color_t *menu_color = data;
GdkRGBA color;
GtkWidget *color_chooser;
gint response;
color_chooser = gtk_color_chooser_dialog_new ("Select message background color", GTK_WINDOW(ui_main_data.window));
gtk_color_chooser_set_use_alpha (GTK_COLOR_CHOOSER(color_chooser), FALSE);
response = gtk_dialog_run (GTK_DIALOG (color_chooser));
if (response == GTK_RESPONSE_OK)
{
int red, green, blue;
char *color_string;
color_string =
menu_color->foreground ?
menu_color->menu_enable->filter_item->foreground :
menu_color->menu_enable->filter_item->background;
gtk_color_chooser_get_rgba (GTK_COLOR_CHOOSER(color_chooser), &color);
red = (int) (color.red * 255);
green = (int) (color.green * 255);
blue = (int) (color.blue * 255);
snprintf (color_string, COLOR_SIZE, "#%02x%02x%02x", red, green, blue);
ui_tree_view_refilter ();
g_info("Selected color for %s %f->%02x %f->%02x %f->%02x %s",
menu_color->menu_enable->filter_item->name, color.red, red, color.green, green, color.blue, blue, color_string);
}
gtk_widget_destroy (color_chooser);
return TRUE;
}
void ui_signal_add_to_list(gpointer data, gpointer user_data)
{
gboolean goto_last = user_data ? TRUE : FALSE;
buffer_t *signal_buffer;
GtkTreePath *path;
GtkTreeViewColumn *focus_column;
uint32_t lte_frame;
uint32_t lte_slot;
uint32_t origin_task_id;
uint32_t destination_task_id;
uint32_t instance;
char lte_time[15];
g_assert(data != NULL);
g_assert(origin_task_id_type != NULL);
g_assert(destination_task_id_type != NULL);
gtk_tree_view_get_cursor (GTK_TREE_VIEW(ui_main_data.messages_list), &path, &focus_column);
signal_buffer = (buffer_t *) data;
lte_frame = get_lte_frame (signal_buffer);
lte_slot = get_lte_slot (signal_buffer);
sprintf (lte_time, "%d.%02d", lte_frame, lte_slot);
get_message_id (root, signal_buffer, &signal_buffer->message_id);
origin_task_id = get_task_id (signal_buffer, origin_task_id_type);
destination_task_id = get_task_id (signal_buffer, destination_task_id_type);
instance = get_instance (signal_buffer);
ui_tree_view_new_signal_ind (signal_buffer->message_number, lte_time, signal_buffer->message_id,
message_id_to_string (signal_buffer->message_id), origin_task_id,
task_id_to_string (origin_task_id, origin_task_id_type), destination_task_id,
task_id_to_string (destination_task_id, destination_task_id_type), instance, data);
if ((strcmp (message_id_to_string (signal_buffer->message_id), "ERROR_LOG") == 0)
|| (strcmp (message_id_to_string (signal_buffer->message_id), "WARNING_LOG") == 0)
|| (strcmp (message_id_to_string (signal_buffer->message_id), "NOTICE_LOG") == 0)
|| (strcmp (message_id_to_string (signal_buffer->message_id), "INFO_LOG") == 0)
|| (strcmp (message_id_to_string (signal_buffer->message_id), "DEBUG_LOG") == 0)
|| (strcmp (message_id_to_string (signal_buffer->message_id), "GENERIC_LOG") == 0))
{
gchar *string_terminal;
gint string_terminal_size;
uint32_t message_header_type_size;
message_header_type_size = get_message_header_type_size ();
string_terminal = (gchar *) buffer_at_offset ((buffer_t*) signal_buffer, message_header_type_size);
string_terminal_size = get_message_size ((buffer_t*) signal_buffer);
string_terminal_size = ui_callback_check_string (string_terminal, string_terminal_size, signal_buffer->message_number);
ui_notebook_terminal_append_data(string_terminal, string_terminal_size);
}
/* Increment number of messages */
ui_main_data.nb_message_received++;
if ((ui_main_data.follow_last) && (goto_last))
{
/* Advance to the new last signal */
ui_tree_view_select_row (ui_tree_view_get_filtered_number () - 1);
}
}
static gboolean ui_handle_update_signal_list(gint fd, void *data, size_t data_length)
{
pipe_new_signals_list_message_t *signal_list_message;
/* Enable buttons to move in the list of signals */
ui_set_sensitive_move_buttons (TRUE);
signal_list_message = (pipe_new_signals_list_message_t *) data;
g_assert(signal_list_message != NULL);
g_assert(signal_list_message->signal_list != NULL);
g_list_foreach (signal_list_message->signal_list, ui_signal_add_to_list, (gpointer) TRUE);
/* Free the list but not user data associated with each element */
g_list_free (signal_list_message->signal_list);
/* Free the message */
free (signal_list_message);
ui_gtk_flush_events ();
return TRUE;
}
static gboolean ui_handle_socket_connection_failed(gint fd)
{
gtk_dialog_response(GTK_DIALOG (dialogbox_connect), GTK_RESPONSE_REJECT);
return TRUE;
}
static gboolean ui_handle_socket_connection_lost(gint fd)
{
if (operation_running)
{
operation_running = FALSE;
if (ui_auto_reconnect)
{
ui_callback_on_connect (NULL, (gpointer) FALSE);
}
else
{
ui_enable_connect_button();
ui_set_sensitive_save_message_buttons (TRUE);
}
}
return TRUE;
}
static gboolean ui_handle_socket_xml_definition(gint fd, void *data, size_t data_length)
{
pipe_xml_definition_message_t *xml_definition_message;
xml_definition_message = (pipe_xml_definition_message_t *) data;
g_assert(xml_definition_message != NULL);
g_assert(data_length == sizeof(pipe_xml_definition_message_t));
xml_parse_buffer (xml_definition_message->xml_definition, xml_definition_message->xml_definition_length);
return TRUE;
}
gboolean ui_pipe_callback(gint source, gpointer user_data)
{
void *input_data = NULL;
size_t input_data_length = 0;
pipe_input_header_t input_header;
/* Read the header */
if (read (source, &input_header, sizeof(input_header)) < 0)
{
g_warning("Failed to read from pipe %d: %s", source, g_strerror(errno));
return FALSE;
}
input_data_length = input_header.message_size - sizeof(input_header);
/* Checking for non-header part */
if (input_data_length > 0)
{
input_data = malloc (input_data_length);
if (read (source, input_data, input_data_length) < 0)
{
g_warning("Failed to read from pipe %d: %s", source, g_strerror(errno));
return FALSE;
}
}
switch (input_header.message_type)
{
case UI_PIPE_CONNECTION_FAILED:
return ui_handle_socket_connection_failed (source);
case UI_PIPE_CONNECTION_LOST:
return ui_handle_socket_connection_lost (source);
case UI_PIPE_XML_DEFINITION:
gtk_dialog_response(GTK_DIALOG (dialogbox_connect), GTK_RESPONSE_OK);
return ui_handle_socket_xml_definition (source, input_data, input_data_length);
case UI_PIPE_UPDATE_SIGNAL_LIST:
return ui_handle_update_signal_list (source, input_data, input_data_length);
default:
g_warning("[gui] Unhandled message type %u", input_header.message_type);
g_assert_not_reached();
}
return FALSE;
}
gboolean ui_callback_on_auto_reconnect(GtkWidget *widget, gpointer data)
{
gboolean enabled;
gboolean changed = TRUE;
gboolean toggle = (data != NULL) ? TRUE : FALSE;
enabled = gtk_toggle_tool_button_get_active (GTK_TOGGLE_TOOL_BUTTON(ui_main_data.auto_reconnect));
if (toggle)
{
gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON(ui_main_data.auto_reconnect), !enabled);
return TRUE;
}
g_info("Auto reconnect event occurred %d %d ", toggle, enabled);
ui_auto_reconnect = enabled;
if (changed)
{
/* Set the tool tip text */
if (enabled)
{
gtk_tool_item_set_tooltip_text (GTK_TOOL_ITEM(ui_main_data.auto_reconnect), "Disable automatic reconnection");
}
else
{
gtk_tool_item_set_tooltip_text (GTK_TOOL_ITEM(ui_main_data.auto_reconnect), "Enable automatic reconnection");
}
}
return TRUE;
}
void ui_callback_dialogbox_connect_destroy(void)
{
if (dialogbox_connect != NULL)
{
gtk_widget_destroy (dialogbox_connect);
dialogbox_connect = NULL;
g_message("Connect dialogbox destroyed");
}
}
gboolean ui_callback_on_connect(GtkWidget *widget, gpointer data)
{
/* We have to retrieve the ip address and ui_port of remote host */
gboolean start = (data != NULL) ? TRUE : FALSE;
int pipe_fd[2];
if (start)
{
ui_port = atoi (gtk_entry_get_text (GTK_ENTRY(ui_main_data.port_entry)));
ui_ip = gtk_entry_get_text (GTK_ENTRY(ui_main_data.ip_entry));
}
g_message("Connect event occurred to %s:%d %s", ui_ip, ui_port, start ? "START" : "RETRY");
if (start)
{
if (strlen (ui_ip) == 0)
{
ui_notification_dialog (GTK_MESSAGE_ERROR, FALSE, "Connect", "Empty host ip address");
return FALSE;
}
if (ui_port == 0)
{
ui_notification_dialog (GTK_MESSAGE_ERROR, FALSE, "Connect", "Invalid host ui_port value");
return FALSE;
}
}
if (operation_running == FALSE)
{
operation_running = TRUE;
ui_pipe_new (pipe_fd, ui_pipe_callback, NULL);
memcpy (ui_main_data.pipe_fd, pipe_fd, sizeof(int) * 2);
/* Disable the connect button */
ui_disable_connect_button ();
ui_set_title ("connecting to %s:%d ...", ui_ip, ui_port);
{
const static char *message_formats[] =
{
"Connecting to %s:%d ...",
"Connection lost!\n\n" "Trying to reconnect to %s:%d ..."
};
gint response;
gint x, y;
gint w, h;
if (socket_connect_to_remote_host (ui_ip, ui_port, pipe_fd[1]) != 0)
{
ui_enable_connect_button ();
operation_running = FALSE;
return FALSE;
}
/* Create dialog box for connect message:
* - non modal mode does not seems to work, don't set the parent window to allow some interactions with it!
*/
dialogbox_connect = gtk_message_dialog_new (NULL, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_OTHER,
GTK_BUTTONS_CANCEL, message_formats[start ? 0 : 1], ui_ip, ui_port);
gtk_window_set_title (GTK_WINDOW(dialogbox_connect), "Connect");
/* Set the window at center of main window manually as there is no parent defined */
gtk_window_get_position (GTK_WINDOW(ui_main_data.window), &x, &y);
gtk_window_get_size (GTK_WINDOW(ui_main_data.window), &w, &h);
g_message("Main window position: %d,%d dimension: %d,%d", x, y, w, h);
x += w / 2;
y += h / 2;
g_message("Connect window position %d,%d", x, y);
gtk_window_set_gravity (GTK_WINDOW(dialogbox_connect), GDK_GRAVITY_CENTER);
gtk_window_move (GTK_WINDOW(dialogbox_connect), x, y);
response = gtk_dialog_run (GTK_DIALOG (dialogbox_connect));
g_message("Connect dialog response %s (%d)", gtk_get_respose_string(response), response);
if (response == GTK_RESPONSE_NONE)
{
/* Dialogbox has been destroyed when program is exited, do nothing */
return (TRUE);
}
if (response == GTK_RESPONSE_OK)
{
/* Connection is established */
ui_set_sensitive_save_message_buttons (FALSE);
ui_callback_signal_clear_list (NULL, NULL);
ui_set_title ("%s:%d", ui_ip, ui_port);
}
else
{
/* Connection can not be established */
if (response == GTK_RESPONSE_REJECT)
{
/* Connection retry time-out */
ui_notification_dialog (GTK_MESSAGE_WARNING, FALSE, "Connect", "Failed to connect to provided host/ip address");
}
/* Re-enable connect button */
ui_enable_connect_button();
operation_running = FALSE;
}
ui_callback_dialogbox_connect_destroy ();
}
}
return TRUE;
}
gboolean ui_callback_on_disconnect(GtkWidget *widget, gpointer data)
{
g_message("Disconnect event occurred");
ui_pipe_write_message (ui_main_data.pipe_fd[0], UI_PIPE_DISCONNECT_EVT, NULL, 0);
if (dialogbox_connect != NULL)
{
gtk_dialog_response(GTK_DIALOG (dialogbox_connect), GTK_RESPONSE_CLOSE);
}
else
{
ui_enable_connect_button ();
operation_running = FALSE;
}
return TRUE;
}
gboolean ui_callback_signal_go_to_first(GtkWidget *widget, gpointer data)
{
gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON(ui_main_data.signals_go_to_last_button), FALSE);
ui_tree_view_select_row (0);
return TRUE;
}
gboolean ui_callback_signal_go_to(GtkWidget *widget, gpointer data)
{
gtk_window_set_focus (GTK_WINDOW(ui_main_data.window), ui_main_data.signals_go_to_entry);
return TRUE;
}
gboolean ui_callback_signal_go_to_entry(GtkWidget *widget, gpointer data)
{
gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON(ui_main_data.signals_go_to_last_button), FALSE);
// gtk_entry_buffer_set_text(GTK_ENTRY(ui_main_data.signals_go_to_entry), "");
gtk_window_set_focus (GTK_WINDOW(ui_main_data.window), ui_main_data.messages_list);
return TRUE;
}
gboolean ui_callback_signal_go_to_last(GtkWidget *widget, gpointer data)
{
gboolean enable = (data != NULL) ? TRUE : FALSE;
gboolean enabled;
if (enable)
{
gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON(ui_main_data.signals_go_to_last_button), TRUE);
return TRUE;
}
enabled = gtk_toggle_tool_button_get_active (GTK_TOGGLE_TOOL_BUTTON(ui_main_data.signals_go_to_last_button));
g_info("Button signal go to last event occurred %d %d", enable, enabled);
if (enabled)
{
ui_main_data.follow_last = TRUE;
ui_tree_view_select_row (ui_tree_view_get_filtered_number () - 1);
}
else
{
ui_main_data.follow_last = FALSE;
}
return TRUE;
}
gboolean ui_callback_display_message_header(GtkWidget *widget, gpointer data)
{
ui_main_data.display_message_header = !ui_main_data.display_message_header;
// TODO refresh textview.
return TRUE;
}
gboolean ui_callback_display_brace(GtkWidget *widget, gpointer data)
{
ui_main_data.display_brace = !ui_main_data.display_brace;
// TODO refresh textview.
return TRUE;
}
gboolean ui_callback_signal_clear_list(GtkWidget *widget, gpointer data)
{
/* Disable buttons to move in the list of signals */
ui_set_sensitive_move_buttons (FALSE);
ui_set_title ("");
/* Clear list of signals */
ui_tree_view_destroy_list (ui_main_data.messages_list);
if (ui_main_data.text_view != NULL)
{
ui_signal_dissect_clear_view (ui_main_data.text_view);
}
ui_notebook_terminal_clear();
return TRUE;
}
static void ui_callback_on_menu_items_selected(GtkWidget *widget, gpointer data)
{
gboolean active = data != NULL;
if (GTK_IS_CHECK_MENU_ITEM(widget))
{
gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM(widget), active);
}
}
gboolean ui_callback_on_menu_none(GtkWidget *widget, gpointer data)
{
GtkWidget *menu = (GtkWidget *) data;
g_info("ui_callback_on_menu_none occurred %lx %lx)", (long) widget, (long) data);
refresh_message_list = FALSE;
gtk_container_foreach (GTK_CONTAINER(menu), ui_callback_on_menu_items_selected, (gpointer) FALSE);
refresh_message_list = TRUE;
if (filters_changed)
{
ui_tree_view_refilter ();
filters_changed = FALSE;
}
return TRUE;
}
gboolean ui_callback_on_menu_all(GtkWidget *widget, gpointer data)
{
GtkWidget *menu = (GtkWidget *) data;
g_info("ui_callback_on_menu_all occurred %lx %lx)", (long) widget, (long) data);
refresh_message_list = FALSE;
gtk_container_foreach (GTK_CONTAINER(menu), ui_callback_on_menu_items_selected, (gpointer) TRUE);
refresh_message_list = TRUE;
if (filters_changed)
{
ui_tree_view_refilter ();
filters_changed = FALSE;
}
return TRUE;
}
gboolean ui_callback_on_menu_item_selected(GtkWidget *widget, gpointer data)
{
ui_filter_item_t *filter_entry = data;
gboolean enabled;
enabled = gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM(widget));
if (filter_entry->enabled != enabled)
{
filter_entry->enabled = enabled;
if (refresh_message_list)
{
ui_tree_view_refilter ();
}
else
{
filters_changed = TRUE;
}
}
g_info("ui_callback_on_menu_item_selected occurred %p %p %s %d (%d messages to display)", widget, data, filter_entry->name, enabled, ui_tree_view_get_filtered_number());
return TRUE;
}
gboolean ui_callback_on_tree_column_header_click(GtkWidget *widget, gpointer data)
{
col_type_t col = (col_type_t) data;
g_info("ui_callback_on_tree_column_header_click %d", col);
switch (col)
{
case COL_MESSAGE:
ui_show_filter_menu (&ui_main_data.menu_filter_messages, &ui_filters.messages);
break;
case COL_FROM_TASK:
ui_show_filter_menu (&ui_main_data.menu_filter_origin_tasks, &ui_filters.origin_tasks);
break;
case COL_TO_TASK:
ui_show_filter_menu (&ui_main_data.menu_filter_destination_tasks, &ui_filters.destination_tasks);
break;
case COL_INSTANCE:
ui_show_filter_menu (&ui_main_data.menu_filter_instances, &ui_filters.instances);
break;
default:
g_warning("Unknown column filter %d in call to ui_callback_on_tree_column_header_click", col);
return FALSE;
}
return TRUE;
}
@@ -1,114 +0,0 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#ifndef UI_CALLBACKS_H_
#define UI_CALLBACKS_H_
#include <gtk/gtk.h>
gboolean ui_callback_on_open_messages(GtkWidget *widget,
gpointer data);
gboolean ui_callback_on_save_messages(GtkWidget *widget,
gpointer data);
gboolean ui_callback_on_filters_enabled(GtkToolButton *button,
gpointer data);
gboolean ui_callback_on_open_filters(GtkWidget *widget,
gpointer data);
gboolean ui_callback_on_save_filters(GtkWidget *widget,
gpointer data);
gboolean ui_callback_on_enable_filters(GtkWidget *widget,
gpointer data);
gboolean ui_callback_on_about(GtkWidget *widget,
gpointer data);
gint ui_callback_check_string (const char *string,
const gint lenght,
const guint message_number);
gboolean ui_pipe_callback(gint source, gpointer user_data);
gboolean ui_callback_on_auto_reconnect(GtkWidget *widget,
gpointer data);
void ui_callback_dialogbox_connect_destroy(void);
gboolean ui_callback_on_connect(GtkWidget *widget,
gpointer data);
gboolean ui_callback_on_disconnect(GtkWidget *widget,
gpointer data);
gboolean ui_callback_on_tree_view_select(GtkWidget *widget,
GdkEvent *event,
gpointer data);
gboolean ui_callback_on_select_signal(GtkTreeSelection *selection,
GtkTreeModel *model,
GtkTreePath *path,
gboolean path_currently_selected,
gpointer userdata);
void ui_signal_add_to_list(gpointer data,
gpointer user_data);
gboolean ui_callback_on_menu_enable (GtkWidget *widget, gpointer data);
gboolean ui_callback_on_menu_color (GtkWidget *widget, gpointer data);
gboolean ui_callback_signal_go_to_first(GtkWidget *widget,
gpointer data);
gboolean ui_callback_signal_go_to(GtkWidget *widget,
gpointer data);
gboolean ui_callback_signal_go_to_entry(GtkWidget *widget,
gpointer data);
gboolean ui_callback_signal_go_to_last(GtkWidget *widget,
gpointer data);
gboolean ui_callback_display_message_header(GtkWidget *widget,
gpointer data);
gboolean ui_callback_display_brace(GtkWidget *widget,
gpointer data);
gboolean ui_callback_signal_clear_list(GtkWidget *widget,
gpointer data);
gboolean ui_callback_on_menu_none(GtkWidget *widget,
gpointer data);
gboolean ui_callback_on_menu_all(GtkWidget *widget,
gpointer data);
gboolean ui_callback_on_menu_item_selected(GtkWidget *widget,
gpointer data);
gboolean ui_callback_on_tree_column_header_click(GtkWidget *widget,
gpointer data);
#endif /* UI_CALLBACKS_H_ */
@@ -1,609 +0,0 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#include <stdio.h>
#include <stdlib.h>
#define G_LOG_DOMAIN ("UI_FILTER")
#include <glib.h>
#include <libxml/parser.h>
#include <libxml/tree.h>
#include "ui_callbacks.h"
#include "ui_main_screen.h"
#include "ui_filters.h"
#include "ui_tree_view.h"
#include "ui_notif_dlg.h"
#include "rc.h"
const uint32_t FILTER_ALLOC_NUMBER = 100;
const uint32_t FILTER_ID_UNDEFINED = ~0;
const char * const COLOR_WHITE = "#ffffff";
const char * const COLOR_DARK_GREY = "#585858";
#define ENABLED_NAME "enabled"
#define FOREGROUND_NAME "foreground_color"
#define BACKGROUND_NAME "background_color"
ui_filters_t ui_filters;
static int ui_init_filter(ui_filter_t *filter, int reset, int clear_ids, char *name)
{
if (filter->items == NULL)
{
filter->name = name;
/* Allocate some filter entries */
filter->items = malloc (FILTER_ALLOC_NUMBER * sizeof(ui_filter_item_t));
filter->allocated = FILTER_ALLOC_NUMBER;
}
if (reset)
{
/* Reset number of used filter entries */
filter->used = 0;
}
else
{
if (clear_ids)
{
/* Clear entries IDs */
int item;
for (item = 0; item < filter->used; item++)
{
filter->items[item].id = FILTER_ID_UNDEFINED;
}
}
}
return (RC_OK);
}
int ui_init_filters(int reset, int clear_ids)
{
ui_init_filter (&ui_filters.messages, reset, clear_ids, "messages");
ui_init_filter (&ui_filters.origin_tasks, reset, clear_ids, "origin_tasks");
ui_init_filter (&ui_filters.destination_tasks, reset, clear_ids, "destination_tasks");
ui_init_filter (&ui_filters.instances, reset, clear_ids, "instances");
ui_destroy_filter_menus ();
return (RC_OK);
}
gboolean ui_filters_enable(gboolean enabled)
{
gboolean changed = ui_filters.filters_enabled != enabled;
if (changed)
{
ui_filters.filters_enabled = enabled;
}
return changed;
}
static int ui_filters_search_name(ui_filter_t *filter, const char *name)
{
int item;
for (item = 0; item < filter->used; item++)
{
if (strncmp (name, filter->items[item].name, SIGNAL_NAME_LENGTH) == 0)
{
return (item);
}
}
return (item);
}
int ui_filters_search_id(ui_filter_t *filter, uint32_t value)
{
int item;
for (item = 0; item < filter->used; item++)
{
if (filter->items[item].id == value)
{
return (item);
}
}
return (-1);
}
static void ui_filter_set_enabled(uint8_t *enabled, ui_entry_enabled_e entry_enabled, gboolean new)
{
if (entry_enabled == ENTRY_ENABLED_UNDEFINED)
{
if (new)
{
*enabled = TRUE;
}
}
else
{
if (entry_enabled == ENTRY_ENABLED_FALSE)
{
*enabled = FALSE;
}
else
{
*enabled = TRUE;
}
}
}
static int ui_filter_add(ui_filter_t *filter, uint32_t value, const char *name, ui_entry_enabled_e entry_enabled,
const char *foreground, const char *background)
{
int item = ui_filters_search_name (filter, name);
if (item >= filter->allocated)
{
/* Increase number of filter entries */
filter->items = realloc (filter->items, (filter->allocated + FILTER_ALLOC_NUMBER) * sizeof(ui_filter_item_t));
filter->allocated += FILTER_ALLOC_NUMBER;
}
if (value != FILTER_ID_UNDEFINED)
{
filter->items[item].id = value;
}
if (item >= filter->used)
{
/* New entry */
strncpy (filter->items[item].name, name, SIGNAL_NAME_LENGTH);
ui_filter_set_enabled (&filter->items[item].enabled, entry_enabled, TRUE);
strncpy (filter->items[item].foreground, foreground != NULL ? foreground : COLOR_DARK_GREY, COLOR_SIZE);
strncpy (filter->items[item].background, background != NULL ? background : COLOR_WHITE, COLOR_SIZE);
filter->used++;
}
else
{
ui_filter_set_enabled (&filter->items[item].enabled, entry_enabled, FALSE);
if (foreground != NULL)
{
strncpy (filter->items[item].foreground, foreground, COLOR_SIZE);
}
if (background != NULL)
{
strncpy (filter->items[item].background, background, COLOR_SIZE);
}
}
g_debug("filter \"%s\" add %d \"%s\" %d", filter->name, value, name, entry_enabled);
return (item);
}
void ui_filters_add(ui_filter_e filter, uint32_t value, const char *name, ui_entry_enabled_e entry_enabled,
const char *foreground, const char *background)
{
switch (filter)
{
case FILTER_MESSAGES:
ui_filter_add (&ui_filters.messages, value, name, entry_enabled, foreground, background);
break;
case FILTER_ORIGIN_TASKS:
ui_filter_add (&ui_filters.origin_tasks, value, name, entry_enabled, foreground, background);
break;
case FILTER_DESTINATION_TASKS:
ui_filter_add (&ui_filters.destination_tasks, value, name, entry_enabled, foreground, background);
break;
case FILTER_INSTANCES:
ui_filter_add (&ui_filters.instances, value, name, entry_enabled, foreground, background);
break;
default:
g_warning("unknown filter type %d", filter);
break;
}
}
static gboolean ui_item_enabled(ui_filter_t *filter, const uint32_t value)
{
int item;
if (value != (uint32_t) ~0)
{
item = ui_filters_search_id (filter, value);
if (item >= 0)
{
return (filter->items[item].enabled ? TRUE : FALSE);
}
}
return (FALSE);
}
gboolean ui_filters_message_enabled(const uint32_t message, const uint32_t origin_task, const uint32_t destination_task,
const uint32_t instance)
{
gboolean result;
result = (ui_item_enabled (&ui_filters.messages, message) && ui_item_enabled (&ui_filters.origin_tasks, origin_task)
&& ui_item_enabled (&ui_filters.destination_tasks, destination_task)
&& ui_item_enabled (&ui_filters.instances, instance));
return result;
}
static ui_filter_e ui_filter_from_name(const char *name)
{
if (strcmp (name, ui_filters.messages.name) == 0)
{
return FILTER_MESSAGES;
}
if (strcmp (name, ui_filters.origin_tasks.name) == 0)
{
return FILTER_ORIGIN_TASKS;
}
if (strcmp (name, ui_filters.destination_tasks.name) == 0)
{
return FILTER_DESTINATION_TASKS;
}
if (strcmp (name, ui_filters.instances.name) == 0)
{
return FILTER_INSTANCES;
}
return FILTER_UNKNOWN;
}
static int xml_parse_filters(xmlDocPtr doc, const char *file_name)
{
xmlNode *root_element = NULL;
xmlNode *filter_node = NULL;
xmlNode *cur_node = NULL;
ui_filter_e filter;
guint filters_entries = 0;
int ret = RC_FAIL;
/* Get the root element node */
root_element = xmlDocGetRootElement (doc);
if (root_element != NULL)
{
/* Search for the start of filters definition */
for (cur_node = root_element; (cur_node != NULL) && (strcmp ((char *) cur_node->name, "filters") != 0);
cur_node = cur_node->next)
;
if (cur_node != NULL)
{
/* Search for filter header */
for (filter_node = cur_node->children; filter_node != NULL;)
{
/* Search for next element node */
for (; (filter_node != NULL) && (filter_node->type != XML_ELEMENT_NODE); filter_node =
filter_node->next)
;
if (filter_node != NULL)
{
filter = ui_filter_from_name ((const char*) filter_node->name);
g_debug("Found filter %s %d", filter_node->name, filter);
if (filter == FILTER_UNKNOWN)
{
g_warning("Unknown filter \"%s\"", filter_node->name);
}
else
{
/* Search for entries */
for (cur_node = filter_node->children; cur_node != NULL;)
{
/* Search for next element node */
for (; (cur_node != NULL) && (cur_node->type != XML_ELEMENT_NODE); cur_node =
cur_node->next)
;
if (cur_node != NULL)
{
xmlAttr *prop_node;
ui_entry_enabled_e enabled = ENTRY_ENABLED_UNDEFINED;
char *foreground = NULL;
char *background = NULL;
for (prop_node = cur_node->properties; prop_node != NULL; prop_node = prop_node->next)
{
if (strcmp ((char *) prop_node->name, ENABLED_NAME) == 0)
{
enabled =
prop_node->children->content[0] == '0' ?
ENTRY_ENABLED_FALSE : ENTRY_ENABLED_TRUE;
}
if (strcmp ((char *) prop_node->name, FOREGROUND_NAME) == 0)
{
foreground = (char *) prop_node->children->content;
}
if (strcmp ((char *) prop_node->name, BACKGROUND_NAME) == 0)
{
background = (char *) prop_node->children->content;
}
}
g_debug(" Found entry %s %s", cur_node->name, cur_node->properties->children->content);
ui_filters_add (filter, FILTER_ID_UNDEFINED, (const char*) cur_node->name, enabled,
foreground, background);
filters_entries++;
cur_node = cur_node->next;
}
}
}
filter_node = filter_node->next;
}
}
/* Filters have changed destroy filter menus and update tree view */
ui_destroy_filter_menus ();
/* Reactivate filtering */
gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON(ui_main_data.filters_enabled), TRUE);
ui_tree_view_refilter ();
}
}
/* Free the document */
xmlFreeDoc (doc);
if (filters_entries > 0)
{
ret = RC_OK;
}
g_message("Parsed XML filters file \"%s\", found %d entries (%d messages to display)", file_name, filters_entries, ui_tree_view_get_filtered_number());
return ret;
}
int ui_filters_read(const char *file_name)
{
xmlDocPtr doc; /* the resulting document tree */
int ret;
if (file_name == NULL)
{
g_warning("No name for filters file");
return RC_FAIL;
}
doc = xmlReadFile (file_name, NULL, 0);
if (doc == NULL)
{
ui_notification_dialog (GTK_MESSAGE_ERROR, FALSE, "open filters", "Failed to parse file \"%s\"", file_name);
return RC_FAIL;
}
ret = xml_parse_filters (doc, file_name);
if (ret != RC_OK)
{
ui_notification_dialog (GTK_MESSAGE_WARNING, FALSE, "open filters", "Found no filter definitions in \"%s\"",
file_name);
return RC_FAIL;
}
return ret;
}
static void write_filter(FILE *filter_file, ui_filter_t *filter, gboolean save_colors)
{
int item;
fprintf (filter_file, " <%s>\n", filter->name);
for (item = 0; item < filter->used; item++)
{
if (save_colors)
{
fprintf (filter_file,
" <%s " ENABLED_NAME "=\"%d\" " FOREGROUND_NAME "=\"%s\" " BACKGROUND_NAME "=\"%s\"/>\n",
filter->items[item].name, filter->items[item].enabled ? 1 : 0, filter->items[item].foreground,
filter->items[item].background);
}
else
{
fprintf (filter_file, " <%s " ENABLED_NAME "=\"%d\"/>\n", filter->items[item].name,
filter->items[item].enabled ? 1 : 0);
}
}
fprintf (filter_file, " </%s>\n", filter->name);
}
int ui_filters_file_write(const char *file_name)
{
FILE *filter_file;
if (file_name == NULL)
{
g_warning("No name for filters file");
return RC_FAIL;
}
filter_file = fopen (file_name, "w");
if (filter_file == NULL)
{
ui_notification_dialog (GTK_MESSAGE_ERROR, FALSE, "Failed to open file \"%s\": %s", file_name, g_strerror (errno));
return RC_FAIL;
}
fprintf (filter_file, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
"<filters>\n");
write_filter (filter_file, &ui_filters.messages, TRUE);
write_filter (filter_file, &ui_filters.origin_tasks, FALSE);
write_filter (filter_file, &ui_filters.destination_tasks, FALSE);
fprintf (filter_file, "</filters>\n");
fclose (filter_file);
return RC_OK;
}
static void ui_create_filter_menu(GtkWidget **menu, ui_filter_t *filter)
{
if (*menu == NULL)
{
GtkWidget *menu_items;
int item;
gpointer data;
*menu = gtk_menu_new ();
/* Create the "NONE" menu-item */
{
/* Create a new menu-item with a name */
menu_items = gtk_menu_item_new_with_label ("NONE");
/* Add it to the menu. */
gtk_menu_shell_append (GTK_MENU_SHELL(*menu), menu_items);
g_debug("ui_create_filter_menu %lx", (long) menu_items);
g_signal_connect(G_OBJECT(menu_items), "activate", G_CALLBACK(ui_callback_on_menu_none), *menu);
/* Show the widget */
gtk_widget_show (menu_items);
}
/* Create the "ALL" menu-item */
{
/* Create a new menu-item with a name */
menu_items = gtk_menu_item_new_with_label ("ALL");
/* Add it to the menu. */
gtk_menu_shell_append (GTK_MENU_SHELL(*menu), menu_items);
g_debug("ui_create_filter_menu %lx", (long) menu_items);
g_signal_connect(G_OBJECT(menu_items), "activate", G_CALLBACK(ui_callback_on_menu_all), *menu);
/* Show the widget */
gtk_widget_show (menu_items);
}
/* Create separator */
{
menu_items = gtk_menu_item_new ();
/* Add it to the menu. */
gtk_menu_shell_append (GTK_MENU_SHELL(*menu), menu_items);
/* Show the widget */
gtk_widget_show (menu_items);
}
/* Creates menu-items */
for (item = 0; item < filter->used; item++)
{
/* Create a new menu-item with a name */
menu_items = gtk_check_menu_item_new_with_label (filter->items[item].name);
/* Add it to the menu. */
gtk_menu_shell_append (GTK_MENU_SHELL(*menu), menu_items);
gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM(menu_items), filter->items[item].enabled);
/* Connect function to be called when the menu item is selected */
data = &filter->items[item];
g_debug("ui_create_filter_menu %lx %lx", (long) menu_items, (long) data);
g_signal_connect(G_OBJECT(menu_items), "activate", G_CALLBACK(ui_callback_on_menu_item_selected), data);
/* Save the menu_item reference */
filter->items[item].menu_item = menu_items;
/* Show the widget */
gtk_widget_show (menu_items);
}
}
}
void ui_create_filter_menus(void)
{
ui_create_filter_menu (&ui_main_data.menu_filter_messages, &ui_filters.messages);
ui_create_filter_menu (&ui_main_data.menu_filter_origin_tasks, &ui_filters.origin_tasks);
ui_create_filter_menu (&ui_main_data.menu_filter_destination_tasks, &ui_filters.destination_tasks);
ui_create_filter_menu (&ui_main_data.menu_filter_instances, &ui_filters.instances);
}
static void ui_destroy_filter_menu_item(GtkWidget *widget, gpointer data)
{
if (GTK_IS_MENU_ITEM(widget))
{
gtk_widget_destroy (widget);
}
}
static void ui_destroy_filter_menu_widget(GtkWidget **menu)
{
if (*menu != NULL)
{
gtk_container_foreach (GTK_CONTAINER(*menu), ui_destroy_filter_menu_item, NULL);
gtk_widget_destroy (*menu);
*menu = NULL;
}
}
void ui_destroy_filter_menus(void)
{
ui_destroy_filter_menu_widget (&ui_main_data.menu_filter_messages);
ui_destroy_filter_menu_widget (&ui_main_data.menu_filter_origin_tasks);
ui_destroy_filter_menu_widget (&ui_main_data.menu_filter_destination_tasks);
ui_destroy_filter_menu_widget (&ui_main_data.menu_filter_instances);
}
void ui_destroy_filter_menu(ui_filter_e filter)
{
switch (filter)
{
case FILTER_MESSAGES:
ui_destroy_filter_menu_widget (&ui_main_data.menu_filter_messages);
break;
case FILTER_ORIGIN_TASKS:
ui_destroy_filter_menu_widget (&ui_main_data.menu_filter_origin_tasks);
break;
case FILTER_DESTINATION_TASKS:
ui_destroy_filter_menu_widget (&ui_main_data.menu_filter_destination_tasks);
break;
case FILTER_INSTANCES:
ui_destroy_filter_menu_widget (&ui_main_data.menu_filter_instances);
break;
default:
g_warning("unknown filter type %d", filter);
break;
}
}
void ui_show_filter_menu(GtkWidget **menu, ui_filter_t *filter)
{
ui_create_filter_menu (menu, filter);
gtk_menu_popup (GTK_MENU (*menu), NULL, NULL, NULL, NULL, 0, gtk_get_current_event_time ());
}
@@ -1,95 +0,0 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#ifndef UI_FILTERS_H_
#define UI_FILTERS_H_
#include <stdint.h>
#include "itti_types.h"
#define SIGNAL_NAME_LENGTH 100
#define COLOR_SIZE 10
typedef enum
{
FILTER_UNKNOWN, FILTER_MESSAGES, FILTER_ORIGIN_TASKS, FILTER_DESTINATION_TASKS, FILTER_INSTANCES,
} ui_filter_e;
typedef enum
{
ENTRY_ENABLED_FALSE, ENTRY_ENABLED_TRUE, ENTRY_ENABLED_UNDEFINED,
} ui_entry_enabled_e;
typedef struct
{
uint32_t id;
char name[SIGNAL_NAME_LENGTH];
uint8_t enabled;
char foreground[COLOR_SIZE];
char background[COLOR_SIZE];
GtkWidget *menu_item;
} ui_filter_item_t;
typedef struct
{
char *name;
uint32_t allocated;
uint32_t used;
ui_filter_item_t *items;
} ui_filter_t;
typedef struct
{
gboolean filters_enabled;
ui_filter_t messages;
ui_filter_t origin_tasks;
ui_filter_t destination_tasks;
ui_filter_t instances;
} ui_filters_t;
extern ui_filters_t ui_filters;
int ui_init_filters(int reset, int clear_ids);
gboolean ui_filters_enable(gboolean enabled);
int ui_filters_search_id(ui_filter_t *filter, uint32_t value);
void ui_filters_add(ui_filter_e filter, uint32_t value, const char *name, ui_entry_enabled_e entry_enabled,
const char *foreground, const char *background);
gboolean ui_filters_message_enabled(const uint32_t message, const uint32_t origin_task, const uint32_t destination_task,
const uint32_t instance);
int ui_filters_read(const char *file_name);
int ui_filters_file_write(const char *file_name);
void ui_create_filter_menus(void);
void ui_destroy_filter_menus(void);
void ui_destroy_filter_menu(ui_filter_e filter);
void ui_show_filter_menu(GtkWidget **menu, ui_filter_t *filter);
#endif /* UI_FILTERS_H_ */
@@ -1,122 +0,0 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#include <pthread.h>
#include <stdint.h>
#include <unistd.h>
#define G_LOG_DOMAIN ("UI_INTER")
#include <gtk/gtk.h>
#include "ui_interface.h"
#include "ui_tree_view.h"
#include "ui_notifications.h"
#include "ui_signal_dissect_view.h"
#include "socket.h"
#include "xml_parse.h"
static
gboolean ui_callback_on_pipe_notification(
GIOChannel *source, GIOCondition condition, gpointer user_data)
{
pipe_input_t *pipe_input = (pipe_input_t *)user_data;
/* avoid reentrancy problems and stack overflow */
g_source_remove(pipe_input->pipe_input_id);
g_debug("Received new data on pipe %d", pipe_input->pipe_input_id);
if (pipe_input->input_cb(pipe_input->source_fd, pipe_input->user_data)) {
/* restore pipe handler */
pipe_input->pipe_input_id = g_io_add_watch_full(pipe_input->pipe_channel,
G_PRIORITY_HIGH,
(GIOCondition)(G_IO_IN|G_IO_ERR|G_IO_HUP),
ui_callback_on_pipe_notification,
pipe_input,
NULL);
}
return TRUE;
}
int ui_pipe_new(int pipe_fd[2], pipe_input_cb_t input_cb, gpointer user_data)
{
static pipe_input_t pipe_input;
g_assert(pipe_fd != NULL);
/* Create a pipe between GUI and a thread or a process */
if (socketpair(AF_UNIX, SOCK_DGRAM, 0, pipe_fd) < 0) {
g_warning("Failed to create socketpair %s", g_strerror(errno));
return RC_FAIL;
}
/* Source taken from wireshark SVN repository */
pipe_input.source_fd = pipe_fd[0];
pipe_input.input_cb = input_cb;
pipe_input.user_data = user_data;
pipe_input.pipe_channel = g_io_channel_unix_new(pipe_fd[0]);
g_io_channel_set_encoding(pipe_input.pipe_channel, NULL, NULL);
pipe_input.pipe_input_id = g_io_add_watch_full(pipe_input.pipe_channel,
G_PRIORITY_HIGH,
G_IO_IN | G_IO_ERR | G_IO_HUP,
ui_callback_on_pipe_notification,
&pipe_input,
NULL);
return RC_OK;
}
int ui_pipe_write_message(int pipe_fd, const uint16_t message_type,
const void * const message, const uint16_t message_size)
{
int ret;
pipe_input_header_t pipe_input_header;
pipe_input_header.message_size = message_size + sizeof(pipe_input_header);
pipe_input_header.message_type = message_type;
if (message_size > 0 && message == NULL) {
g_error("message size = %u but message is NULL", message_size);
g_assert_not_reached();
}
ret = write(pipe_fd, &pipe_input_header, sizeof(pipe_input_header));
if (ret < 0) {
g_warning("Failed to write header to pipe: %s", g_strerror(errno));
return ret;
}
/* Only write the message to pipe if valid data to transmit */
if (message_size > 0) {
ret = write(pipe_fd, message, message_size);
if (ret < 0) {
g_warning("Failed to write message of size %u at 0x%p to pipe: %s",
message_size, message, g_strerror(errno));
return ret;
}
}
return 0;
}
@@ -1,78 +0,0 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#include <glib.h>
#ifndef UI_INTERFACE_H_
#define UI_INTERFACE_H_
/*******************************************************************************
* Functions used between dissectors and GUI to update signal dissection
******************************************************************************/
typedef gboolean (*ui_set_signal_text_cb_t) (gpointer user_data, gchar *text, gint length);
/*******************************************************************************
* Pipe interface between GUI thread and other thread
******************************************************************************/
typedef gboolean (*pipe_input_cb_t) (gint source, gpointer user_data);
typedef struct {
int source_fd;
guint pipe_input_id;
GIOChannel *pipe_channel;
pipe_input_cb_t input_cb;
gpointer user_data;
} pipe_input_t;
int ui_pipe_new(int pipe_fd[2], pipe_input_cb_t input_cb, gpointer user_data);
int ui_pipe_write_message(int pipe_fd, const uint16_t message_type,
const void * const message, const uint16_t message_size);
typedef struct {
uint16_t message_size;
uint16_t message_type;
} pipe_input_header_t;
enum ui_pipe_messages_id_e {
/* Other thread -> GUI interface ids */
UI_PIPE_CONNECTION_FAILED,
UI_PIPE_CONNECTION_LOST,
UI_PIPE_XML_DEFINITION,
UI_PIPE_UPDATE_SIGNAL_LIST,
/* GUI -> other threads */
UI_PIPE_DISCONNECT_EVT
};
typedef struct {
char *xml_definition;
size_t xml_definition_length;
} pipe_xml_definition_message_t;
typedef struct {
GList *signal_list;
} pipe_new_signals_list_message_t;
#endif /* UI_INTERFACE_H_ */
@@ -1,238 +0,0 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#if HAVE_CONFIG_H
# include "config.h"
#endif
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define G_LOG_DOMAIN ("UI")
#include <gtk/gtk.h>
#include "logs.h"
#include "rc.h"
#include "ui_callbacks.h"
#include "ui_interface.h"
#include "ui_main_screen.h"
#include "ui_menu_bar.h"
#include "ui_tree_view.h"
#include "ui_notebook.h"
#include "ui_notifications.h"
#include "ui_filters.h"
ui_main_data_t ui_main_data;
static void ui_help(void)
{
printf ("Usage: itti_analyser [options]\n\n"
"Options:\n"
" -d DISSECT write DISSECT file with message types parse details\n"
" -f FILTERS read filters from FILTERS file\n"
" -h display this help and exit\n"
" -i IP set ip address to IP\n"
" -l LEVEL set log level to LEVEL in the range of 2 to 7\n"
" -m MESSAGES read messages from MESSAGES file\n"
" -p PORT set port to PORT\n");
}
void ui_gtk_parse_arg(int argc, char *argv[])
{
char c;
/* Clear of ui_main_data not needed */
// memset (&ui_main_data, 0, sizeof(ui_main_data_t));
/* Set some default initialization value for the IP address */
ui_main_data.ip_entry_init = "127.0.0.1";
ui_main_data.port_entry_init = "10006";
/* Set default log level to at least warning level messages */
ui_main_data.log_flags = (G_LOG_LEVEL_MASK & (~(G_LOG_LEVEL_MESSAGE | G_LOG_LEVEL_INFO | G_LOG_LEVEL_DEBUG)));
while ((c = getopt (argc, argv, "d:f:hi:l:m:p:")) != -1)
{
switch (c)
{
case 'd':
ui_main_data.dissect_file_name = malloc (strlen (optarg) + 1);
if (ui_main_data.dissect_file_name != NULL)
{
strcpy (ui_main_data.dissect_file_name, optarg);
}
break;
case 'f':
ui_main_data.filters_file_name = malloc (strlen (optarg) + 1);
if (ui_main_data.filters_file_name != NULL)
{
strcpy (ui_main_data.filters_file_name, optarg);
}
break;
case 'h':
ui_help ();
exit (0);
break;
case 'i':
ui_main_data.ip_entry_init = optarg;
break;
case 'l':
{
GLogLevelFlags log_flag;
log_flag = 1 << atoi(optarg);
if (log_flag < G_LOG_LEVEL_ERROR)
{
log_flag = G_LOG_LEVEL_ERROR;
}
else
{
if (log_flag > G_LOG_LEVEL_DEBUG)
{
log_flag = G_LOG_LEVEL_DEBUG;
}
}
ui_main_data.log_flags = ((log_flag << 1) - 1) & G_LOG_LEVEL_MASK;
break;
}
case 'm':
ui_main_data.messages_file_name = malloc (strlen (optarg) + 1);
if (ui_main_data.messages_file_name != NULL)
{
strcpy (ui_main_data.messages_file_name, optarg);
}
break;
case 'p':
ui_main_data.port_entry_init = optarg;
break;
default:
ui_help ();
exit (-1);
break;
}
}
}
static int ui_idle_callback(gpointer data)
{
g_info("Entering idle state");
gtk_window_set_focus (GTK_WINDOW(ui_main_data.window), ui_main_data.messages_list);
/* Read filters file */
if (ui_main_data.filters_file_name != NULL)
{
ui_filters_read(ui_main_data.filters_file_name);
}
/* Read messages file */
if (ui_main_data.messages_file_name != NULL)
{
ui_messages_read (ui_main_data.messages_file_name);
}
/* One shot execution */
return FALSE;
}
void ui_set_title(const char *fmt, ...)
{
va_list args;
char *name;
char buffer[200];
char title[220];
#if defined(PACKAGE_STRING)
name = PACKAGE_NAME;
#else
name = "itti_analyzer";
#endif
va_start(args, fmt);
vsnprintf (buffer, sizeof(buffer), fmt, args);
snprintf (title, sizeof(title), "%s %s", name, buffer);
va_end (args);
gtk_window_set_title (GTK_WINDOW(ui_main_data.window), title);
}
void ui_main_window_destroy (void)
{
ui_callback_dialogbox_connect_destroy();
ui_progressbar_window_destroy();
gtk_main_quit();
}
int ui_gtk_initialize(int argc, char *argv[])
{
GtkWidget *vbox;
/* Create the main window */
ui_main_data.window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
ui_init_filters (TRUE, FALSE);
// gtk_window_set_default_icon_from_file ("../analyzer.png", NULL);
gtk_window_set_default_icon_name (GTK_STOCK_FIND);
gtk_window_set_position (GTK_WINDOW(ui_main_data.window), GTK_WIN_POS_CENTER);
gtk_window_set_default_size (GTK_WINDOW(ui_main_data.window), 1024, 800);
ui_set_title("");
gtk_window_set_resizable (GTK_WINDOW(ui_main_data.window), TRUE);
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
CHECK_FCT(ui_menu_bar_create(vbox));
CHECK_FCT(ui_toolbar_create(vbox));
CHECK_FCT(ui_notebook_create(vbox));
gtk_container_add (GTK_CONTAINER(ui_main_data.window), vbox);
/* Assign the destroy event */
g_signal_connect(ui_main_data.window, "destroy", ui_main_window_destroy, NULL);
/* Show the application window */
gtk_widget_show_all (ui_main_data.window);
g_idle_add (ui_idle_callback, NULL);
return RC_OK;
}
void ui_gtk_flush_events(void)
{
while (gtk_events_pending ())
{
gtk_main_iteration();
}
}
@@ -1,96 +0,0 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#ifndef UI_MAIN_SCREEN_H_
#define UI_MAIN_SCREEN_H_
#include <gtk/gtk.h>
#include "ui_signal_dissect_view.h"
typedef struct {
GtkWidget *window;
GtkWidget *ip_entry;
char *ip_entry_init;
GtkWidget *port_entry;
char *port_entry_init;
GtkWidget *progressbar_window;
GtkWidget *progressbar;
GtkWidget *messages_list;
ui_text_view_t *text_view;
/* Buttons */
GtkToolItem *filters_enabled;
GtkToolItem *open_filters_file;
GtkToolItem *refresh_filters_file;
GtkToolItem *save_filters_file;
GtkToolItem *open_replay_file;
GtkToolItem *refresh_replay_file;
GtkToolItem *stop_loading;
GtkToolItem *save_replay_file;
GtkToolItem *save_replay_file_filtered;
GtkToolItem *auto_reconnect;
GtkToolItem *connect;
GtkToolItem *disconnect;
/* Signal list buttons */
/* Clear signals button */
GtkWidget *signals_go_to_entry;
GtkToolItem *signals_go_to_last_button;
GtkToolItem *signals_go_to_first_button;
gboolean display_message_header;
gboolean display_brace;
GtkTreeSelection *selection;
gboolean follow_last;
/* Nb of messages received */
guint nb_message_received;
GLogLevelFlags log_flags;
char *dissect_file_name;
char *filters_file_name;
char *messages_file_name;
GtkWidget *menu_filter_messages;
GtkWidget *menu_filter_origin_tasks;
GtkWidget *menu_filter_destination_tasks;
GtkWidget *menu_filter_instances;
int pipe_fd[2];
} ui_main_data_t;
extern ui_main_data_t ui_main_data;
void ui_gtk_parse_arg(int argc, char *argv[]);
void ui_set_title(const char *fmt, ...);
void ui_main_window_destroy (void);
int ui_gtk_initialize(int argc, char *argv[]);
void ui_gtk_flush_events(void);
#endif /* UI_MAIN_SCREEN_H_ */
@@ -1,503 +0,0 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#define G_LOG_DOMAIN ("UI")
#include <gtk/gtk.h>
#include <gdk/gdkkeysyms.h>
#include "rc.h"
#include "ui_main_screen.h"
#include "ui_menu_bar.h"
#include "ui_callbacks.h"
#include "ui_notifications.h"
static const guint BUTTON_SPACE = 0;
static const guint LABEL_SPACE = 5;
static const guint SEPARATOR_SPACE = 5;
void ui_set_sensitive_move_buttons(gboolean enable)
{
gtk_widget_set_sensitive(GTK_WIDGET(ui_main_data.signals_go_to_last_button), enable);
gtk_widget_set_sensitive(GTK_WIDGET(ui_main_data.signals_go_to_first_button), enable);
}
void ui_set_sensitive_save_message_buttons(gboolean enable)
{
if (ui_main_data.nb_message_received == 0)
{
enable = FALSE;
}
gtk_widget_set_sensitive(GTK_WIDGET(ui_main_data.save_replay_file), enable);
gtk_widget_set_sensitive(GTK_WIDGET(ui_main_data.save_replay_file_filtered), enable);
}
int ui_menu_bar_create(GtkWidget *vbox)
{
GtkAccelGroup *accel_group;
GtkWidget *menu_bar;
GtkWidget *system_menu;
GtkWidget *system;
GtkWidget *quit;
GtkWidget *filters_menu;
GtkWidget *filters;
GtkWidget *open_filters;
GtkWidget *reload_filters;
GtkWidget *save_filters;
GtkWidget *enable_filters;
GtkWidget *messages_menu;
GtkWidget *messages;
GtkWidget *open_messages;
GtkWidget *reload_messages;
GtkWidget *stop_loading;
GtkWidget *save_messages;
GtkWidget *save_messages_filtered;
GtkWidget *goto_first_messages;
GtkWidget *goto_messages;
GtkWidget *goto_last_messages;
GtkWidget *display_message_header;
GtkWidget *display_brace;
GtkWidget *connect_menu;
GtkWidget *connect;
GtkWidget *auto_reconnect;
GtkWidget *connect_to;
GtkWidget *disconnect;
GtkWidget *help_menu;
GtkWidget *help;
GtkWidget *about;
if (!vbox)
return RC_BAD_PARAM;
accel_group = gtk_accel_group_new();
gtk_window_add_accel_group(GTK_WINDOW(ui_main_data.window), accel_group);
menu_bar = gtk_menu_bar_new();
/* Create the System sub-menu */
{
system = gtk_menu_item_new_with_mnemonic ("_System");
gtk_menu_shell_append (GTK_MENU_SHELL(menu_bar), system);
system_menu = gtk_menu_new ();
gtk_menu_item_set_submenu (GTK_MENU_ITEM(system), system_menu);
/* Create the Filters menu items */
{
quit = gtk_menu_item_new_with_mnemonic ("_Quit");
gtk_widget_add_accelerator (quit, "activate", accel_group, GDK_KEY_q, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
gtk_menu_shell_append (GTK_MENU_SHELL(system_menu), quit);
g_signal_connect(G_OBJECT(quit), "activate", ui_main_window_destroy, NULL);
}
}
/* Create the Filters sub-menu */
{
filters = gtk_menu_item_new_with_mnemonic ("_Filters");
gtk_menu_shell_append (GTK_MENU_SHELL(menu_bar), filters);
filters_menu = gtk_menu_new ();
gtk_menu_item_set_submenu (GTK_MENU_ITEM(filters), filters_menu);
/* Create the Filters menu items */
{
open_filters = gtk_menu_item_new_with_mnemonic ("_Open filters file");
gtk_widget_add_accelerator (open_filters, "activate", accel_group, GDK_KEY_p, GDK_CONTROL_MASK,
GTK_ACCEL_VISIBLE);
gtk_menu_shell_append (GTK_MENU_SHELL(filters_menu), open_filters);
g_signal_connect(G_OBJECT(open_filters), "activate", G_CALLBACK(ui_callback_on_open_filters), (gpointer) FALSE);
reload_filters = gtk_menu_item_new_with_mnemonic ("_Reload filters file");
gtk_widget_add_accelerator (reload_filters, "activate", accel_group, GDK_KEY_d, GDK_CONTROL_MASK,
GTK_ACCEL_VISIBLE);
gtk_widget_add_accelerator (reload_filters, "activate", accel_group, GDK_KEY_F4, 0, GTK_ACCEL_VISIBLE);
gtk_menu_shell_append (GTK_MENU_SHELL(filters_menu), reload_filters);
g_signal_connect(G_OBJECT(reload_filters), "activate", G_CALLBACK(ui_callback_on_open_filters),
(gpointer) TRUE);
save_filters = gtk_menu_item_new_with_mnemonic ("_Save filters file");
gtk_widget_add_accelerator (save_filters, "activate", accel_group, GDK_KEY_v, GDK_CONTROL_MASK,
GTK_ACCEL_VISIBLE);
gtk_menu_shell_append (GTK_MENU_SHELL(filters_menu), save_filters);
g_signal_connect(G_OBJECT(save_filters), "activate", G_CALLBACK(ui_callback_on_save_filters), NULL);
gtk_menu_shell_append (GTK_MENU_SHELL(filters_menu), gtk_menu_item_new ()); // Separator
enable_filters = gtk_menu_item_new_with_mnemonic ("_Enable filtering");
gtk_widget_add_accelerator (enable_filters, "activate", accel_group, GDK_KEY_e, GDK_CONTROL_MASK,
GTK_ACCEL_VISIBLE);
gtk_menu_shell_append (GTK_MENU_SHELL(filters_menu), enable_filters);
g_signal_connect(G_OBJECT(enable_filters), "activate", G_CALLBACK(ui_callback_on_enable_filters), NULL);
}
}
/* Create the Messages sub-menu */
{
messages = gtk_menu_item_new_with_mnemonic ("_Messages");
gtk_menu_shell_append (GTK_MENU_SHELL(menu_bar), messages);
messages_menu = gtk_menu_new ();
gtk_menu_item_set_submenu (GTK_MENU_ITEM(messages), messages_menu);
/* Crate the Messages menu items */
{
open_messages = gtk_menu_item_new_with_mnemonic ("_Open messages file");
gtk_widget_add_accelerator (open_messages, "activate", accel_group, GDK_KEY_o, GDK_CONTROL_MASK,
GTK_ACCEL_VISIBLE);
gtk_menu_shell_append (GTK_MENU_SHELL(messages_menu), open_messages);
g_signal_connect(G_OBJECT(open_messages), "activate", G_CALLBACK(ui_callback_on_open_messages),
(gpointer) FALSE);
reload_messages = gtk_menu_item_new_with_mnemonic ("_Reload messages file");
gtk_widget_add_accelerator (reload_messages, "activate", accel_group, GDK_KEY_r, GDK_CONTROL_MASK,
GTK_ACCEL_VISIBLE);
gtk_widget_add_accelerator (reload_messages, "activate", accel_group, GDK_KEY_F5, 0, GTK_ACCEL_VISIBLE);
gtk_menu_shell_append (GTK_MENU_SHELL(messages_menu), reload_messages);
g_signal_connect(G_OBJECT(reload_messages), "activate", G_CALLBACK(ui_callback_on_open_messages),
(gpointer) TRUE);
stop_loading = gtk_menu_item_new_with_mnemonic ("S_top loading messages file");
gtk_widget_add_accelerator (stop_loading, "activate", accel_group, GDK_KEY_x, GDK_CONTROL_MASK,
GTK_ACCEL_VISIBLE);
gtk_menu_shell_append (GTK_MENU_SHELL(messages_menu), stop_loading);
g_signal_connect(G_OBJECT(stop_loading), "activate", G_CALLBACK(ui_progressbar_window_destroy),
NULL);
save_messages = gtk_menu_item_new_with_mnemonic ("S_ave messages file (all)");
gtk_widget_add_accelerator (save_messages, "activate", accel_group, GDK_KEY_a, GDK_CONTROL_MASK,
GTK_ACCEL_VISIBLE);
gtk_menu_shell_append (GTK_MENU_SHELL(messages_menu), save_messages);
g_signal_connect(G_OBJECT(save_messages), "activate", G_CALLBACK(ui_callback_on_save_messages),
(gpointer) FALSE);
save_messages_filtered = gtk_menu_item_new_with_mnemonic ("_Save messages file (filtered)");
gtk_widget_add_accelerator (save_messages_filtered, "activate", accel_group, GDK_KEY_s, GDK_CONTROL_MASK,
GTK_ACCEL_VISIBLE);
gtk_menu_shell_append (GTK_MENU_SHELL(messages_menu), save_messages_filtered);
g_signal_connect(G_OBJECT(save_messages_filtered), "activate", G_CALLBACK(ui_callback_on_save_messages),
(gpointer) TRUE);
gtk_menu_shell_append (GTK_MENU_SHELL(messages_menu), gtk_menu_item_new ()); // Separator
goto_first_messages = gtk_menu_item_new_with_mnemonic ("Go to _first message");
gtk_widget_add_accelerator (goto_first_messages, "activate", accel_group, GDK_KEY_f, GDK_CONTROL_MASK,
GTK_ACCEL_VISIBLE);
gtk_menu_shell_append (GTK_MENU_SHELL(messages_menu), goto_first_messages);
g_signal_connect(G_OBJECT(goto_first_messages), "activate", G_CALLBACK(ui_callback_signal_go_to_first),
NULL);
goto_messages = gtk_menu_item_new_with_mnemonic ("_Go to message ...");
gtk_widget_add_accelerator (goto_messages, "activate", accel_group, GDK_KEY_g, GDK_CONTROL_MASK,
GTK_ACCEL_VISIBLE);
gtk_menu_shell_append (GTK_MENU_SHELL(messages_menu), goto_messages);
g_signal_connect(G_OBJECT(goto_messages), "activate", G_CALLBACK(ui_callback_signal_go_to), NULL);
goto_last_messages = gtk_menu_item_new_with_mnemonic ("Go to _last message");
gtk_widget_add_accelerator (goto_last_messages, "activate", accel_group, GDK_KEY_l, GDK_CONTROL_MASK,
GTK_ACCEL_VISIBLE);
gtk_menu_shell_append (GTK_MENU_SHELL(messages_menu), goto_last_messages);
g_signal_connect(G_OBJECT(goto_last_messages), "activate", G_CALLBACK(ui_callback_signal_go_to_last), (gpointer) TRUE);
gtk_menu_shell_append (GTK_MENU_SHELL(messages_menu), gtk_menu_item_new ()); // Separator
display_message_header = gtk_menu_item_new_with_mnemonic ("Display message _header");
gtk_widget_add_accelerator (display_message_header, "activate", accel_group, GDK_KEY_h, GDK_CONTROL_MASK,
GTK_ACCEL_VISIBLE);
gtk_menu_shell_append (GTK_MENU_SHELL(messages_menu), display_message_header);
g_signal_connect(G_OBJECT(display_message_header), "activate",
G_CALLBACK(ui_callback_display_message_header), NULL);
display_brace = gtk_menu_item_new_with_mnemonic ("Display _brace");
gtk_widget_add_accelerator (display_brace, "activate", accel_group, GDK_KEY_b, GDK_CONTROL_MASK,
GTK_ACCEL_VISIBLE);
gtk_menu_shell_append (GTK_MENU_SHELL(messages_menu), display_brace);
g_signal_connect(G_OBJECT(display_brace), "activate", G_CALLBACK(ui_callback_display_brace), NULL);
}
}
/* Create the Connect sub-menu */
{
connect = gtk_menu_item_new_with_mnemonic ("_Connect");
gtk_menu_shell_append (GTK_MENU_SHELL(menu_bar), connect);
connect_menu = gtk_menu_new ();
gtk_menu_item_set_submenu (GTK_MENU_ITEM(connect), connect_menu);
/* Create the Help menu item */
{
auto_reconnect = gtk_menu_item_new_with_mnemonic ("_Automatic reconnection");
gtk_widget_add_accelerator (auto_reconnect, "activate", accel_group, GDK_KEY_t, GDK_CONTROL_MASK,
GTK_ACCEL_VISIBLE);
gtk_menu_shell_append (GTK_MENU_SHELL(connect_menu), auto_reconnect);
g_signal_connect(G_OBJECT(auto_reconnect), "activate", G_CALLBACK(ui_callback_on_auto_reconnect), (gpointer) TRUE);
connect_to = gtk_menu_item_new_with_mnemonic ("_Connect");
gtk_widget_add_accelerator (connect_to, "activate", accel_group, GDK_KEY_c, GDK_CONTROL_MASK,
GTK_ACCEL_VISIBLE);
gtk_menu_shell_append (GTK_MENU_SHELL(connect_menu), connect_to);
g_signal_connect(G_OBJECT(connect_to), "activate", G_CALLBACK(ui_callback_on_connect), (gpointer) TRUE);
disconnect = gtk_menu_item_new_with_mnemonic ("_Disconnect");
gtk_widget_add_accelerator (disconnect, "activate", accel_group, GDK_KEY_u, GDK_CONTROL_MASK,
GTK_ACCEL_VISIBLE);
gtk_menu_shell_append (GTK_MENU_SHELL(connect_menu), disconnect);
g_signal_connect(G_OBJECT(disconnect), "activate", G_CALLBACK(ui_callback_on_disconnect), NULL);
}
}
/* Create the Help sub-menu */
{
help = gtk_menu_item_new_with_mnemonic ("_Help");
gtk_menu_shell_append (GTK_MENU_SHELL(menu_bar), help);
help_menu = gtk_menu_new ();
gtk_menu_item_set_submenu (GTK_MENU_ITEM(help), help_menu);
/* Create the Help menu item */
{
about = gtk_menu_item_new_with_mnemonic ("_About");
gtk_menu_shell_append (GTK_MENU_SHELL(help_menu), about);
g_signal_connect(G_OBJECT(about), "activate", G_CALLBACK(ui_callback_on_about), NULL);
}
}
/* Add the menubar to the vbox */
gtk_box_pack_start(GTK_BOX(vbox), menu_bar, FALSE, FALSE, 3);
return RC_OK;
}
int ui_toolbar_create(GtkWidget *vbox)
{
GtkWidget *hbox;
GtkWidget *messages_label;
GtkWidget *ip_label;
GtkWidget *port_label;
if (!vbox)
return RC_BAD_PARAM;
hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
messages_label = gtk_label_new("Messages");
/* Button to Enable filtering */
{
ui_main_data.filters_enabled = gtk_toggle_tool_button_new();
gtk_tool_button_set_label (GTK_TOOL_BUTTON(ui_main_data.filters_enabled), "Filters");
g_signal_connect(G_OBJECT(ui_main_data.filters_enabled), "clicked",
G_CALLBACK(ui_callback_on_filters_enabled), NULL);
gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON(ui_main_data.filters_enabled), TRUE);
}
/* Button to open filters file */
{
ui_main_data.open_filters_file = gtk_tool_button_new_from_stock(GTK_STOCK_OPEN);
gtk_tool_item_set_tooltip_text(GTK_TOOL_ITEM(ui_main_data.open_filters_file), "Open filters file");
g_signal_connect(G_OBJECT(ui_main_data.open_filters_file), "clicked",
G_CALLBACK(ui_callback_on_open_filters), (gpointer) FALSE);
}
/* Button to refresh filters file */
{
ui_main_data.refresh_filters_file = gtk_tool_button_new_from_stock(GTK_STOCK_REFRESH);
gtk_tool_item_set_tooltip_text(GTK_TOOL_ITEM(ui_main_data.refresh_filters_file), "Reload filters file");
g_signal_connect(G_OBJECT(ui_main_data.refresh_filters_file), "clicked",
G_CALLBACK(ui_callback_on_open_filters), (gpointer) TRUE);
}
/* Button to save filters file */
{
ui_main_data.save_filters_file = gtk_tool_button_new_from_stock(GTK_STOCK_SAVE);
gtk_tool_item_set_tooltip_text(GTK_TOOL_ITEM(ui_main_data.save_filters_file), "Save filters file");
g_signal_connect(G_OBJECT(ui_main_data.save_filters_file), "clicked",
G_CALLBACK(ui_callback_on_save_filters), NULL);
}
/* Button to open messages file */
{
ui_main_data.open_replay_file = gtk_tool_button_new_from_stock(GTK_STOCK_OPEN);
gtk_tool_item_set_tooltip_text(GTK_TOOL_ITEM(ui_main_data.open_replay_file), "Open messages file");
g_signal_connect(G_OBJECT(ui_main_data.open_replay_file), "clicked",
G_CALLBACK(ui_callback_on_open_messages), (gpointer) FALSE);
}
/* Button to refresh messages file */
{
ui_main_data.refresh_replay_file = gtk_tool_button_new_from_stock(GTK_STOCK_REFRESH);
gtk_tool_item_set_tooltip_text(GTK_TOOL_ITEM(ui_main_data.refresh_replay_file), "Reload messages file");
g_signal_connect(G_OBJECT(ui_main_data.refresh_replay_file), "clicked",
G_CALLBACK(ui_callback_on_open_messages), (gpointer) TRUE);
}
/* Stop reading messages file */
{
ui_main_data.stop_loading = gtk_tool_button_new_from_stock(GTK_STOCK_STOP);
gtk_tool_item_set_tooltip_text(GTK_TOOL_ITEM(ui_main_data.stop_loading), "Stop loading messages file");
g_signal_connect(G_OBJECT(ui_main_data.stop_loading), "clicked",
ui_progressbar_window_destroy, NULL);
}
/* Button to save messages file */
{
ui_main_data.save_replay_file = gtk_tool_button_new_from_stock(GTK_STOCK_SAVE);
gtk_tool_item_set_tooltip_text(GTK_TOOL_ITEM(ui_main_data.save_replay_file), "Save messages file (all)");
g_signal_connect(G_OBJECT(ui_main_data.save_replay_file), "clicked",
G_CALLBACK(ui_callback_on_save_messages), (gpointer) FALSE);
}
/* Button to save messages file */
{
ui_main_data.save_replay_file_filtered = gtk_tool_button_new_from_stock(GTK_STOCK_SAVE_AS);
gtk_tool_item_set_tooltip_text(GTK_TOOL_ITEM(ui_main_data.save_replay_file_filtered), "Save messages file (filtered)");
g_signal_connect(G_OBJECT(ui_main_data.save_replay_file_filtered), "clicked",
G_CALLBACK(ui_callback_on_save_messages), (gpointer) TRUE);
}
/* Button to go to first signal in list */
{
ui_main_data.signals_go_to_first_button = gtk_tool_button_new_from_stock(GTK_STOCK_GOTO_FIRST);
/* Set the tooltip text */
gtk_tool_item_set_tooltip_text(GTK_TOOL_ITEM(ui_main_data.signals_go_to_first_button), "Goto first signal");
gtk_widget_set_sensitive(GTK_WIDGET(ui_main_data.signals_go_to_first_button), FALSE);
g_signal_connect(G_OBJECT(ui_main_data.signals_go_to_first_button), "clicked",
G_CALLBACK(ui_callback_signal_go_to_first), NULL);
}
/* Entry to go to given signal number */
{
ui_main_data.signals_go_to_entry = gtk_entry_new ();
gtk_entry_set_width_chars (GTK_ENTRY(ui_main_data.signals_go_to_entry), 10);
// gtk_entry_set_input_purpose (GTK_ENTRY(ui_main_data.signals_go_to_entry), GTK_INPUT_PURPOSE_DIGITS);
g_signal_connect(G_OBJECT(ui_main_data.signals_go_to_entry), "activate",
G_CALLBACK(ui_callback_signal_go_to_entry), NULL);
}
/* Button to go to last signal in list */
{
ui_main_data.signals_go_to_last_button = gtk_toggle_tool_button_new_from_stock(GTK_STOCK_GOTO_LAST);
/* Set the tooltip text */
gtk_tool_item_set_tooltip_text(GTK_TOOL_ITEM(ui_main_data.signals_go_to_last_button), "Goto last signal");
gtk_widget_set_sensitive(GTK_WIDGET(ui_main_data.signals_go_to_last_button), FALSE);
g_signal_connect(G_OBJECT(ui_main_data.signals_go_to_last_button), "clicked",
G_CALLBACK(ui_callback_signal_go_to_last), (gpointer) FALSE);
gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON(ui_main_data.signals_go_to_last_button), TRUE);
}
/* Button to automatically try to reconnect */
{
ui_main_data.auto_reconnect = gtk_toggle_tool_button_new();
gtk_tool_button_set_label (GTK_TOOL_BUTTON(ui_main_data.auto_reconnect), "Auto");
g_signal_connect(G_OBJECT(ui_main_data.auto_reconnect), "clicked",
G_CALLBACK(ui_callback_on_auto_reconnect), (gpointer) FALSE);
gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON(ui_main_data.auto_reconnect), FALSE);
}
/* Button to connect to remote */
{
ui_main_data.connect = gtk_tool_button_new_from_stock(GTK_STOCK_CONNECT);
/* Set the tooltip text */
gtk_tool_item_set_tooltip_text(GTK_TOOL_ITEM(ui_main_data.connect), "Connect to remote host");
g_signal_connect(G_OBJECT(ui_main_data.connect), "clicked",
G_CALLBACK(ui_callback_on_connect), (gpointer) TRUE);
}
/* Button to disconnect from remote */
{
ui_main_data.disconnect = gtk_tool_button_new_from_stock(GTK_STOCK_DISCONNECT);
/* Set the tooltip text */
gtk_tool_item_set_tooltip_text(GTK_TOOL_ITEM(ui_main_data.disconnect), "Disconnect from remote host");
/* Disabled at startup. Will be activated when a connection is established */
gtk_widget_set_sensitive(GTK_WIDGET(ui_main_data.disconnect), FALSE);
g_signal_connect(G_OBJECT(ui_main_data.disconnect), "clicked",
G_CALLBACK(ui_callback_on_disconnect), NULL);
}
ip_label = gtk_label_new("ip:");
port_label = gtk_label_new("port:");
ui_main_data.ip_entry = gtk_entry_new();
/* Width of 15 characters for port number (ipv4 address) */
gtk_entry_set_width_chars(GTK_ENTRY(ui_main_data.ip_entry), 15);
gtk_entry_set_text(GTK_ENTRY(ui_main_data.ip_entry), ui_main_data.ip_entry_init);
ui_main_data.port_entry = gtk_entry_new();
/* Width of 5 characters for port number (uint16_t) */
gtk_entry_set_width_chars(GTK_ENTRY(ui_main_data.port_entry), 5);
gtk_entry_set_text(GTK_ENTRY(ui_main_data.port_entry), ui_main_data.port_entry_init);
gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(ui_main_data.filters_enabled), FALSE, FALSE, LABEL_SPACE);
gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(ui_main_data.open_filters_file), FALSE, FALSE, BUTTON_SPACE);
gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(ui_main_data.refresh_filters_file), FALSE, FALSE, BUTTON_SPACE);
gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(ui_main_data.save_filters_file), FALSE, FALSE, BUTTON_SPACE);
gtk_box_pack_start(GTK_BOX(hbox), gtk_separator_new(GTK_ORIENTATION_VERTICAL), FALSE, FALSE, SEPARATOR_SPACE);
gtk_box_pack_start(GTK_BOX(hbox), messages_label, FALSE, FALSE, LABEL_SPACE);
gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(ui_main_data.open_replay_file), FALSE, FALSE, BUTTON_SPACE);
gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(ui_main_data.refresh_replay_file), FALSE, FALSE, BUTTON_SPACE);
gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(ui_main_data.stop_loading), FALSE, FALSE, BUTTON_SPACE);
gtk_widget_set_sensitive(GTK_WIDGET(ui_main_data.stop_loading), FALSE);
gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(ui_main_data.save_replay_file), FALSE, FALSE, BUTTON_SPACE);
gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(ui_main_data.save_replay_file_filtered), FALSE, FALSE, BUTTON_SPACE);
ui_set_sensitive_save_message_buttons(FALSE);
gtk_box_pack_start(GTK_BOX(hbox), gtk_separator_new(GTK_ORIENTATION_VERTICAL), FALSE, FALSE, SEPARATOR_SPACE);
gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(ui_main_data.signals_go_to_first_button), FALSE, FALSE, BUTTON_SPACE);
gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(ui_main_data.signals_go_to_entry), FALSE, FALSE, BUTTON_SPACE);
gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(ui_main_data.signals_go_to_last_button), FALSE, FALSE, BUTTON_SPACE);
gtk_box_pack_start(GTK_BOX(hbox), gtk_separator_new(GTK_ORIENTATION_VERTICAL), FALSE, FALSE, SEPARATOR_SPACE);
gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(ui_main_data.auto_reconnect), FALSE, FALSE, LABEL_SPACE);
gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(ui_main_data.connect), FALSE, FALSE, BUTTON_SPACE);
gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(ui_main_data.disconnect), FALSE, FALSE, BUTTON_SPACE);
gtk_box_pack_start(GTK_BOX(hbox), ip_label, FALSE, FALSE, LABEL_SPACE);
gtk_box_pack_start(GTK_BOX(hbox), ui_main_data.ip_entry, FALSE, FALSE, BUTTON_SPACE);
gtk_box_pack_start(GTK_BOX(hbox), port_label, FALSE, FALSE, LABEL_SPACE);
gtk_box_pack_start(GTK_BOX(hbox), ui_main_data.port_entry, FALSE, FALSE, BUTTON_SPACE);
gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 5);
return RC_OK;
}
@@ -1,33 +0,0 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#ifndef UI_MENU_BAR_H_
#define UI_MENU_BAR_H_
void ui_set_sensitive_move_buttons(gboolean enable);
void ui_set_sensitive_save_message_buttons(gboolean enable);
int ui_menu_bar_create(GtkWidget *vbox);
int ui_toolbar_create(GtkWidget *vbox);
#endif /* UI_MENU_BAR_H_ */
@@ -1,88 +0,0 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#if HAVE_CONFIG_H
# include "config.h"
#endif
#include <stdio.h>
#include <stdint.h>
#define G_LOG_DOMAIN ("UI")
#include <gtk/gtk.h>
#include "rc.h"
#include "ui_notebook.h"
#include "ui_tree_view.h"
#include "ui_signal_dissect_view.h"
static ui_text_view_t *terminal_view;
void ui_notebook_terminal_clear(void)
{
ui_signal_dissect_clear_view(terminal_view);
}
void ui_notebook_terminal_append_data(gchar *text, gint length)
{
ui_signal_set_text(terminal_view, text, length);
}
int ui_notebook_create(GtkWidget *vbox)
{
GtkWidget *notebook;
GtkWidget *vbox_notebook, *vbox_terminal;
if (!vbox)
return RC_BAD_PARAM;
notebook = gtk_notebook_new();
vbox_notebook = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
ui_tree_view_create(NULL, vbox_notebook);
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox_notebook, NULL);
gtk_notebook_set_tab_label_text (GTK_NOTEBOOK(notebook), vbox_notebook, "Messages list");
#if defined (FILTERS_TAB)
vbox_notebook = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox_notebook, NULL);
gtk_notebook_set_tab_label_text (GTK_NOTEBOOK(notebook), vbox_notebook, "Filters");
#endif
vbox_notebook = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox_notebook, NULL);
gtk_notebook_set_tab_label_text (GTK_NOTEBOOK(notebook), vbox_notebook, "Terminal");
vbox_terminal = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
terminal_view = ui_signal_dissect_new(vbox_terminal);
gtk_box_pack_start (GTK_BOX(vbox_notebook), vbox_terminal, TRUE, TRUE, 5);
/* Add the notebook to the vbox of the main window */
gtk_box_pack_start(GTK_BOX(vbox), notebook, TRUE, TRUE, 0);
return RC_OK;
}
@@ -1,31 +0,0 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#ifndef UI_NOTEBOOK_H_
#define UI_NOTEBOOK_H_
void ui_notebook_terminal_clear(void);
int ui_notebook_create(GtkWidget *vbox);
void ui_notebook_terminal_append_data(gchar *text, gint length);
#endif /* UI_NOTEBOOK_H_ */
@@ -1,83 +0,0 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#define G_LOG_DOMAIN ("UI")
#include "rc.h"
#include "ui_notif_dlg.h"
#include "ui_main_screen.h"
static const char * const gtk_response_strings[] =
{"GTK_RESPONSE_NONE", "GTK_RESPONSE_REJECT", "GTK_RESPONSE_ACCEPT", "GTK_RESPONSE_DELETE_EVENT", "GTK_RESPONSE_OK",
"GTK_RESPONSE_CANCEL", "GTK_RESPONSE_CLOSE", "GTK_RESPONSE_YES", "GTK_RESPONSE_NO", "GTK_RESPONSE_APPLY", "GTK_RESPONSE_HELP"};
static const char * const title_type_strings[] =
{"Info", "Warning", "Question", "Error", "Other"};
const char * gtk_get_respose_string (gint response)
{
gint response_index = - response - 1;
if ((0 <= response_index) && (response_index < (sizeof (gtk_response_strings) / sizeof (gtk_response_strings[0]))))
{
return (gtk_response_strings[response_index]);
}
else
{
return ("Invalid response value!");
}
}
int ui_notification_dialog(GtkMessageType type, gboolean cancel, const char *title, const char *fmt, ...)
{
va_list args;
GtkWidget *dialogbox;
char buffer[200];
int result = RC_OK;
va_start(args, fmt);
vsnprintf (buffer, sizeof(buffer), fmt, args);
g_warning("%s", buffer);
dialogbox = gtk_message_dialog_new (GTK_WINDOW(ui_main_data.window), GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL, type,
cancel ? GTK_BUTTONS_OK_CANCEL : GTK_BUTTONS_OK, "%s",
buffer);
/* Set the window at center of main window */
gtk_window_set_position (GTK_WINDOW(dialogbox), GTK_WIN_POS_CENTER_ON_PARENT);
gtk_dialog_set_default_response (GTK_DIALOG(dialogbox), GTK_RESPONSE_OK);
snprintf (buffer, sizeof(buffer), "%s: %s", title_type_strings[type], title);
gtk_window_set_title (GTK_WINDOW(dialogbox), buffer);
if (gtk_dialog_run (GTK_DIALOG (dialogbox)) == GTK_RESPONSE_CANCEL)
{
result = RC_FAIL;
}
gtk_widget_destroy (dialogbox);
va_end(args);
return result;
}
@@ -1,31 +0,0 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#include <gtk/gtk.h>
#ifndef UI_NOTIF_DLG_H_
#define UI_NOTIF_DLG_H_
const char *gtk_get_respose_string (gint response);
extern int ui_notification_dialog(GtkMessageType type, gboolean cancel, const char *title, const char *fmt, ...);
#endif /* UI_NOTIF_DLG_H_ */
@@ -1,636 +0,0 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#include <fcntl.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdarg.h>
#define G_LOG_DOMAIN ("UI")
#include <sys/stat.h>
#include <gtk/gtk.h>
#include "logs.h"
#include "itti_types.h"
#include "rc.h"
#include "ui_interface.h"
#include "ui_main_screen.h"
#include "ui_menu_bar.h"
#include "ui_notifications.h"
#include "ui_notif_dlg.h"
#include "ui_callbacks.h"
#include "ui_filters.h"
#include "ui_tree_view.h"
#include "locate_root.h"
#include "xml_parse.h"
#include "socket.h"
static const itti_message_types_t itti_dump_xml_definition_end = ITTI_DUMP_XML_DEFINITION_END;
static const itti_message_types_t itti_dump_message_type_end = ITTI_DUMP_MESSAGE_TYPE_END;
static FILE *messages_file;
static uint32_t message_number;
static gboolean ui_abort;
int ui_disable_connect_button(void)
{
/* Disable Connect button and enable disconnect button */
gtk_widget_set_sensitive (GTK_WIDGET (ui_main_data.connect), FALSE);
gtk_widget_set_sensitive (GTK_WIDGET (ui_main_data.disconnect), TRUE);
socket_abort_connection = FALSE;
return RC_OK;
}
int ui_enable_connect_button(void)
{
/* Disable Disconnect button and enable connect button */
gtk_widget_set_sensitive (GTK_WIDGET (ui_main_data.connect), TRUE);
gtk_widget_set_sensitive (GTK_WIDGET (ui_main_data.disconnect), FALSE);
socket_abort_connection = TRUE;
ui_set_sensitive_save_message_buttons (TRUE);
ui_set_title ("");
return RC_OK;
}
static void ui_change_cursor(gboolean busy)
{
static GdkWindow *window;
if (busy)
{
GdkDisplay *display;
GdkCursor *cursor;
// gint x, y;
cursor = gdk_cursor_new (GDK_WATCH);
display = gdk_display_get_default ();
window = gtk_widget_get_window (GTK_WIDGET(ui_main_data.window));
// window = gdk_display_get_window_at_pointer(display, &x, &y);
gdk_window_set_cursor (window, cursor);
gdk_display_sync (display);
g_object_unref (cursor);
// gtk_widget_set_sensitive (ui_main_data.window, FALSE);
ui_gtk_flush_events ();
}
else
{
gdk_window_set_cursor (window, NULL);
// gtk_widget_set_sensitive (ui_main_data.window, TRUE);
ui_gtk_flush_events ();
}
}
static void gtk_filter_add(GtkWidget *file_chooser, const gchar *title, const gchar *pattern)
{
GtkFileFilter *file_filter = gtk_file_filter_new ();
gtk_file_filter_set_name (file_filter, title);
gtk_file_filter_add_pattern (file_filter, pattern);
gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(file_chooser), file_filter);
}
int ui_messages_read(char *file_name)
{
int result = RC_OK;
int source;
int read_data = 0;
void *input_data = NULL;
size_t input_data_length = 0;
int read_messages = 0;
ui_change_cursor (TRUE);
source = open (file_name, O_RDONLY);
if (source < 0)
{
ui_notification_dialog (GTK_MESSAGE_ERROR, FALSE, "open messages", "Failed to open file \"%s\": %s", file_name,
g_strerror (errno));
result = RC_FAIL;
}
else
{
itti_socket_header_t message_header;
struct stat st;
int size;
double read_fraction = 0.f;
if (stat (file_name, &st) < 0)
{
ui_notification_dialog (GTK_MESSAGE_ERROR, FALSE, "get file length",
"Failed to retrieve length for file \"%s\": %s", file_name, g_strerror (errno));
result = RC_FAIL;
}
size = st.st_size;
ui_callback_signal_clear_list (NULL, NULL);
/* Initialize the progress bar */
ui_abort = FALSE;
ui_progress_bar_set_fraction (0);
do
{
read_data = read (source, &message_header, sizeof(itti_socket_header_t));
if (read_data == -1)
{
ui_notification_dialog (GTK_MESSAGE_ERROR, FALSE, "open messages", "Failed to read from file \"%s\": %s",
file_name, g_strerror (errno));
result = RC_FAIL;
break;
}
if (read_data == 0)
{
break;
}
if (read_data < sizeof(itti_socket_header_t))
{
if (ui_notification_dialog (GTK_MESSAGE_WARNING, TRUE, "open messages",
"Failed to read a complete message header from file \"%s\": %s", file_name, g_strerror (errno)) == RC_FAIL)
{
read_data = 0;
}
}
else
{
read_fraction += (double) read_data / size;
input_data_length = message_header.message_size - sizeof(itti_socket_header_t);
g_debug("%x, %x, %zd", message_header.message_type, message_header.message_size, input_data_length);
/* Checking for non-header part */
if (input_data_length > 0)
{
input_data = malloc (input_data_length);
read_data = read (source, input_data, input_data_length);
if (read_data < input_data_length)
{
if (ui_notification_dialog (GTK_MESSAGE_WARNING, TRUE, "open messages",
"Failed to read a complete message from file \"%s\": %s", file_name, g_strerror (errno)) == RC_FAIL)
{
read_data = 0;
}
break;
}
read_fraction += (double) input_data_length / size;
}
switch (message_header.message_type)
{
case ITTI_DUMP_XML_DEFINITION:
ui_gtk_flush_events ();
if (memcmp (&(((char *) input_data)[input_data_length - sizeof (itti_message_types_t)]),
&itti_dump_xml_definition_end, sizeof (itti_message_types_t)) == 0)
{
result = xml_parse_buffer (input_data, input_data_length - sizeof (itti_message_types_t));
if (result != RC_OK)
{
ui_notification_dialog (GTK_MESSAGE_ERROR, FALSE, "open messages",
"Error in parsing XML definitions in file \"%s\": %s", file_name,
rc_strings[-result]);
read_data = 0;
}
ui_gtk_flush_events ();
g_message("Parsed XML definition from file \"%s\"", file_name);
}
else
{
ui_notification_dialog (GTK_MESSAGE_ERROR, FALSE, "open messages",
"Error in parsing XML definitions in file \"%s\", end mark is missing", file_name);
}
/* Data input buffer is kept in case user when to save the log file later */
break;
case ITTI_DUMP_MESSAGE_TYPE:
{
itti_signal_header_t *itti_signal_header = input_data;
buffer_t *buffer;
if (memcmp (&(((char *) input_data)[input_data_length - sizeof (itti_message_types_t)]),
&itti_dump_message_type_end, sizeof (itti_message_types_t)) == 0)
{
/* Create the new buffer */
if (buffer_new_from_data (&buffer, input_data + sizeof(itti_signal_header_t),
input_data_length - sizeof(itti_signal_header_t) - sizeof(itti_message_types_t), 0) != RC_OK)
{
g_error("Failed to create new buffer");
g_assert_not_reached ();
}
sscanf (itti_signal_header->message_number_char, MESSAGE_NUMBER_CHAR_FORMAT, &buffer->message_number);
ui_signal_add_to_list (buffer, ((read_messages % 1000) == 0) ? (gpointer) 1 : NULL);
if ((read_messages % 100) == 0)
{
ui_progress_bar_set_fraction (read_fraction);
ui_gtk_flush_events ();
}
read_messages++;
}
else
{
if (ui_notification_dialog (GTK_MESSAGE_WARNING, TRUE, "open messages",
"Failed to read a message from file \"%s\", end mark is missing", file_name) == RC_FAIL)
{
read_data = 0;
}
break;
}
free (input_data);
break;
}
case ITTI_STATISTIC_MESSAGE_TYPE:
default:
if (ui_notification_dialog (GTK_MESSAGE_WARNING, TRUE, "open messages",
"Unknown (or not implemented) record type: %d in file \"%s\"",
message_header.message_type, file_name) == RC_FAIL)
{
read_data = 0;
}
free (input_data);
break;
}
}
} while ((ui_abort == FALSE) && (read_data > 0));
if (read_messages > 0)
{
char *basename;
/* Enable buttons to move in the list of signals */
ui_set_sensitive_move_buttons (TRUE);
if (ui_main_data.follow_last)
{
/* Advance to the last signal */
ui_tree_view_select_row (ui_tree_view_get_filtered_number () - 1);
}
basename = g_path_get_basename (file_name);
ui_set_title ("\"%s\"", basename);
}
else
{
result = RC_FAIL;
}
ui_progress_bar_terminate ();
g_message("Read %d messages (%d to display) from file \"%s\"\n", read_messages, ui_tree_view_get_filtered_number(), file_name);
close (source);
}
ui_change_cursor (FALSE);
return result;
}
static void ui_message_write_callback(const gpointer buffer, const gchar *signal_name)
{
buffer_t *signal_buffer = (buffer_t *) buffer;
itti_socket_header_t message_header;
itti_signal_header_t itti_signal_header;
uint32_t message_size;
message_size = signal_buffer->size_bytes;
message_header.message_size = sizeof(itti_socket_header_t) + sizeof(itti_signal_header) + message_size + sizeof(itti_message_types_t);
message_header.message_type = ITTI_DUMP_MESSAGE_TYPE;
sprintf(itti_signal_header.message_number_char, MESSAGE_NUMBER_CHAR_FORMAT, message_number);
itti_signal_header.message_number_char[sizeof(itti_signal_header.message_number_char) - 1] = '\n';
message_number++;
fwrite (&message_header, sizeof(message_header), 1, messages_file);
fwrite (&itti_signal_header, sizeof(itti_signal_header), 1, messages_file);
fwrite (signal_buffer->data, message_size, 1, messages_file);
fwrite (&itti_dump_message_type_end, sizeof(itti_message_types_t), 1, messages_file);
}
static int ui_messages_file_write(char *file_name, gboolean filtered)
{
if (file_name == NULL)
{
g_warning("No name for log file");
return RC_FAIL;
}
messages_file = fopen (file_name, "w");
if (messages_file == NULL)
{
ui_notification_dialog (GTK_MESSAGE_ERROR, FALSE, "Failed to open file \"%s\": %s", file_name, g_strerror (errno));
return RC_FAIL;
}
/* Write XML definitions */
{
itti_socket_header_t message_header;
message_header.message_size = sizeof(itti_socket_header_t) + xml_raw_data_size + sizeof(itti_message_types_t);
message_header.message_type = ITTI_DUMP_XML_DEFINITION;
fwrite (&message_header, sizeof(message_header), 1, messages_file);
fwrite (xml_raw_data, xml_raw_data_size, 1, messages_file);
fwrite (&itti_dump_xml_definition_end, sizeof(itti_message_types_t), 1, messages_file);
}
/* Write messages */
{
message_number = 1;
ui_tree_view_foreach_message (ui_message_write_callback, filtered);
}
fclose (messages_file);
return RC_OK;
}
int ui_messages_open_file_chooser(void)
{
int result = RC_OK;
GtkWidget *filechooser;
gboolean response_accept;
char *filename;
filechooser = gtk_file_chooser_dialog_new ("Select file", GTK_WINDOW (ui_main_data.window),
GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,
GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL);
gtk_filter_add (filechooser, "Log files", "*.log");
gtk_filter_add (filechooser, "All files", "*");
/* Process the response */
response_accept = gtk_dialog_run (GTK_DIALOG (filechooser)) == GTK_RESPONSE_ACCEPT;
if (response_accept)
{
filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (filechooser));
}
gtk_widget_destroy (filechooser);
if (response_accept)
{
ui_set_sensitive_save_message_buttons (FALSE);
result = ui_messages_read (filename);
if (result == RC_OK)
{
/* Update messages file name for future use */
if (ui_main_data.messages_file_name != NULL)
{
g_free (ui_main_data.messages_file_name);
}
ui_main_data.messages_file_name = filename;
ui_set_sensitive_save_message_buttons (TRUE);
}
else
{
g_free (filename);
}
}
return result;
}
int ui_messages_save_file_chooser(gboolean filtered)
{
int result = RC_OK;
GtkWidget *filechooser;
/* Check if there is something to save */
if (xml_raw_data_size > 0)
{
static const char *title[] =
{
"Save file (all messages)",
"Save file (filtered messages)",
};
filechooser = gtk_file_chooser_dialog_new (title[filtered], GTK_WINDOW (ui_main_data.window),
GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL,
GTK_RESPONSE_CANCEL, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL);
gtk_filter_add (filechooser, "Log files", "*.log");
gtk_filter_add (filechooser, "All files", "*");
gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (filechooser), TRUE);
if (ui_main_data.messages_file_name != NULL)
{
gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (filechooser), ui_main_data.messages_file_name);
}
else
{
gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (filechooser), "messages.log");
}
/* Process the response */
if (gtk_dialog_run (GTK_DIALOG (filechooser)) == GTK_RESPONSE_ACCEPT)
{
char *filename;
filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (filechooser));
result = ui_messages_file_write (filename, filtered);
if (result == RC_OK)
{
/* Update filters file name for future use */
if (ui_main_data.messages_file_name != NULL)
{
g_free (ui_main_data.messages_file_name);
}
ui_main_data.messages_file_name = filename;
}
else
{
g_free (filename);
}
}
gtk_widget_destroy (filechooser);
}
return result;
}
int ui_filters_open_file_chooser(void)
{
int result = RC_OK;
GtkWidget *filechooser;
gboolean response_accept;
char *filename;
filechooser = gtk_file_chooser_dialog_new ("Select file", GTK_WINDOW (ui_main_data.window),
GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,
GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL);
gtk_filter_add (filechooser, "Filters files", "*.xml");
gtk_filter_add (filechooser, "All files", "*");
/* Process the response */
response_accept = gtk_dialog_run (GTK_DIALOG (filechooser)) == GTK_RESPONSE_ACCEPT;
if (response_accept)
{
filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (filechooser));
}
gtk_widget_destroy (filechooser);
if (response_accept)
{
result = ui_filters_read (filename);
if (result == RC_OK)
{
/* Update filters file name for future use */
if (ui_main_data.filters_file_name != NULL)
{
g_free (ui_main_data.filters_file_name);
}
ui_main_data.filters_file_name = filename;
}
else
{
g_free (filename);
}
}
return result;
}
int ui_filters_save_file_chooser(void)
{
int result = RC_OK;
GtkWidget *filechooser;
filechooser = gtk_file_chooser_dialog_new ("Save file", GTK_WINDOW (ui_main_data.window),
GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL);
gtk_filter_add (filechooser, "Filters files", "*.xml");
gtk_filter_add (filechooser, "All files", "*");
gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (filechooser), TRUE);
if (ui_main_data.filters_file_name != NULL)
{
gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (filechooser), ui_main_data.filters_file_name);
}
else
{
gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (filechooser), "filters.xml");
}
/* Process the response */
if (gtk_dialog_run (GTK_DIALOG (filechooser)) == GTK_RESPONSE_ACCEPT)
{
char *filename;
filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (filechooser));
result = ui_filters_file_write (filename);
if (result == RC_OK)
{
/* Update filters file name for future use */
if (ui_main_data.filters_file_name != NULL)
{
g_free (ui_main_data.filters_file_name);
}
ui_main_data.filters_file_name = filename;
}
else
{
g_free (filename);
}
}
gtk_widget_destroy (filechooser);
return result;
}
void ui_progressbar_window_destroy (void)
{
ui_abort = TRUE;
ui_progress_bar_terminate();
}
int ui_progress_bar_set_fraction(double fraction)
{
if (ui_abort == FALSE)
{
/* If not exist instantiate */
if (!ui_main_data.progressbar && !ui_main_data.progressbar_window)
{
ui_main_data.progressbar_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
/* Keep progress bar window on top of main window */
gtk_window_set_transient_for (GTK_WINDOW(ui_main_data.progressbar_window), GTK_WINDOW(ui_main_data.window));
/* Set the window at center of main window */
gtk_window_set_position (GTK_WINDOW(ui_main_data.progressbar_window), GTK_WIN_POS_CENTER_ON_PARENT);
gtk_window_set_title (GTK_WINDOW(ui_main_data.progressbar_window), "Processing");
gtk_container_set_border_width (GTK_CONTAINER (ui_main_data.progressbar_window), 10);
ui_main_data.progressbar = gtk_progress_bar_new ();
gtk_container_add (GTK_CONTAINER (ui_main_data.progressbar_window), ui_main_data.progressbar);
/* Assign the destroy event */
g_signal_connect(ui_main_data.progressbar_window, "destroy", ui_progressbar_window_destroy, NULL);
gtk_widget_show_all (ui_main_data.progressbar_window);
gtk_widget_set_sensitive(GTK_WIDGET(ui_main_data.stop_loading), TRUE);
}
gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR(ui_main_data.progressbar), fraction);
// ui_gtk_flush_events();
}
return RC_OK;
}
int ui_progress_bar_terminate(void)
{
if (ui_main_data.progressbar)
{
gtk_widget_destroy (ui_main_data.progressbar);
ui_main_data.progressbar = NULL;
}
if (ui_main_data.progressbar_window)
{
gtk_widget_destroy (ui_main_data.progressbar_window);
ui_main_data.progressbar_window = NULL;
}
gtk_widget_set_sensitive(GTK_WIDGET(ui_main_data.stop_loading), FALSE);
return RC_OK;
}
@@ -1,47 +0,0 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#ifndef UI_NOTIFICATIONS_H_
#define UI_NOTIFICATIONS_H_
typedef void (*message_write_callback_t) (const gpointer buffer, const gchar *signal_name);
int ui_disable_connect_button(void);
int ui_enable_connect_button(void);
int ui_messages_read(char *filename);
int ui_messages_open_file_chooser(void);
int ui_messages_save_file_chooser(gboolean filtered);
int ui_filters_open_file_chooser(void);
int ui_filters_save_file_chooser(void);
void ui_progressbar_window_destroy(void);
int ui_progress_bar_set_fraction(double fraction);
int ui_progress_bar_terminate(void);
#endif /* UI_NOTIFICATIONS_H_ */
@@ -1,117 +0,0 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#include <string.h>
#define G_LOG_DOMAIN ("UI")
#include <gtk/gtk.h>
#include "rc.h"
#include "ui_main_screen.h"
#include "ui_menu_bar.h"
#include "ui_signal_dissect_view.h"
ui_text_view_t *ui_signal_dissect_new(GtkWidget *hbox)
{
GtkWidget *scrolled_window;
ui_text_view_t *new_text_view;
new_text_view = malloc(sizeof(ui_text_view_t));
new_text_view->text_view = gtk_text_view_new();
scrolled_window = gtk_scrolled_window_new(NULL, NULL);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),
GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
/* Change the font of the widget */
new_text_view->text_view_font = pango_font_description_new();
g_debug("Default family is: %s\n", pango_font_description_get_family(new_text_view->text_view_font));
pango_font_description_set_family(new_text_view->text_view_font, "Monospace");
pango_font_description_set_absolute_size(new_text_view->text_view_font, 10 * PANGO_SCALE);
g_debug("Font family has been set to: %s\n", pango_font_description_get_family(new_text_view->text_view_font));
gtk_widget_override_font(new_text_view->text_view, new_text_view->text_view_font);
/* Disable editable attribute */
gtk_text_view_set_editable(GTK_TEXT_VIEW(new_text_view->text_view), FALSE);
gtk_container_add(GTK_CONTAINER(scrolled_window), new_text_view->text_view);
gtk_paned_pack2 (GTK_PANED (hbox), scrolled_window, TRUE, FALSE);
return new_text_view;
}
int ui_signal_dissect_clear_view(ui_text_view_t *text_view)
{
GtkTextBuffer *text_buffer;
g_assert(text_view != NULL);
if (text_view->text_view != NULL)
{
/* Create an empty text buffer */
text_buffer = gtk_text_buffer_new(NULL);
gtk_text_buffer_set_text(text_buffer, "", 0);
gtk_text_view_set_buffer(GTK_TEXT_VIEW(text_view->text_view), text_buffer);
}
return RC_OK;
}
gboolean ui_signal_set_text(gpointer user_data, gchar *text, gint length)
{
GtkTextBuffer *text_buffer;
ui_text_view_t *text_view;
if (length < 0)
return FALSE;
text_view = (ui_text_view_t *)user_data;
g_assert(text != NULL);
g_assert(text_view != NULL);
g_assert(text_view->text_view != NULL);
g_assert(GTK_IS_TEXT_VIEW(GTK_TEXT_VIEW(text_view->text_view)));
text_buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_view->text_view));
if (text_buffer) {
/* We already have a text buffer, use it */
gtk_text_buffer_insert_at_cursor(text_buffer, text, length);
} else {
/* No buffer currently in use, create a new one */
text_buffer = gtk_text_buffer_new(NULL);
gtk_text_buffer_set_text(text_buffer, text, length);
gtk_text_view_set_buffer(GTK_TEXT_VIEW(text_view->text_view),
text_buffer);
}
return TRUE;
}
@@ -1,36 +0,0 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#ifndef UI_SIGNAL_DISSECT_VIEW_H_
#define UI_SIGNAL_DISSECT_VIEW_H_
typedef struct {
GtkWidget *text_view;
PangoFontDescription *text_view_font;
} ui_text_view_t;
ui_text_view_t *ui_signal_dissect_new(GtkWidget *hbox);
int ui_signal_dissect_clear_view(ui_text_view_t *text_view);
gboolean ui_signal_set_text(gpointer user_data, gchar *text, gint length);
#endif /*UI_SIGNAL_DISSECT_VIEW_H_ */
@@ -1,610 +0,0 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#include <stdlib.h>
#include <stdint.h>
#define G_LOG_DOMAIN ("UI_TREE")
#include <gtk/gtk.h>
#include "logs.h"
#include "rc.h"
#include "buffers.h"
#include "ui_main_screen.h"
#include "ui_tree_view.h"
#include "ui_callbacks.h"
#include "ui_filters.h"
#include "ui_signal_dissect_view.h"
typedef struct
{
GtkListStore *store;
GtkTreeModelFilter *filtered;
uint32_t filtered_last_msg;
uint32_t filtered_msg_number;
uint32_t instance_number;
} ui_store_t;
static ui_store_t ui_store;
GtkWidget *ui_tree_view_menu;
ui_tree_view_menu_enable_t ui_tree_view_menu_enable[NUM_MENU_TYPE];
GdkEventButton *ui_tree_view_last_event;
static gboolean ui_tree_filter_messages(GtkTreeModel *model, GtkTreeIter *iter, ui_store_t *store)
{
uint32_t msg_number;
uint32_t message_id;
uint32_t origin_task_id;
uint32_t destination_task_id;
uint32_t instance;
gboolean enabled = TRUE;
if (ui_filters.filters_enabled)
{
gtk_tree_model_get (model, iter, COL_MSG_NUM, &msg_number, COL_MESSAGE_ID, &message_id, COL_FROM_TASK_ID,
&origin_task_id, COL_TO_TASK_ID, &destination_task_id, COL_INSTANCE_ID, &instance, -1);
if (msg_number != 0)
{
enabled = ui_filters_message_enabled (message_id, origin_task_id, destination_task_id, instance);
if ((enabled) && (store->filtered_last_msg < msg_number))
{
store->filtered_last_msg = msg_number;
store->filtered_msg_number++;
}
g_debug("ui_tree_filter_messages: %p %p %d m:%d o:%d d:%d i:%d %d %d", model, iter, msg_number, message_id, origin_task_id, destination_task_id, instance, enabled, store->filtered_msg_number);
}
}
return enabled;
}
static gboolean onButtonPressed(GtkWidget *treeview, GdkEventButton *event, gpointer userdata)
{
g_info("onButtonPressed %p %p %p %d %d", treeview, event, userdata, event->type, event->button);
ui_tree_view_last_event = event;
return FALSE;
}
/*
static gboolean onButtonRelease(GtkWidget *treeview, GdkEventButton *event, gpointer userdata)
{
g_info("onButtonRelease %p %p %p %d %d", treeview, event, userdata, event->type, event->button);
// last_event = event;
return FALSE;
}
*/
static void ui_tree_view_init_list(GtkWidget *list)
{
GtkCellRenderer *renderer_left;
GtkCellRenderer *renderer_right;
GtkTreeViewColumn *column;
renderer_left = gtk_cell_renderer_text_new ();
gtk_cell_renderer_set_padding (renderer_left, 5, 0);
renderer_right = gtk_cell_renderer_text_new ();
gtk_cell_renderer_set_alignment (renderer_right, 1, 0.5);
gtk_cell_renderer_set_padding (renderer_right, 5, 0);
column = gtk_tree_view_column_new_with_attributes ("MN", renderer_right, "text", COL_MSG_NUM, "foreground",
COL_FOREGROUND, "background", COL_BACKGROUND, NULL);
gtk_tree_view_column_set_resizable (column, TRUE);
gtk_tree_view_column_set_alignment (column, 0.5);
gtk_tree_view_append_column (GTK_TREE_VIEW(list), column);
column = gtk_tree_view_column_new_with_attributes ("LTE Time", renderer_right, "text", COL_LTE_TIME, NULL);
gtk_tree_view_column_set_resizable (column, TRUE);
gtk_tree_view_column_set_alignment (column, 0.5);
gtk_tree_view_append_column (GTK_TREE_VIEW(list), column);
column = gtk_tree_view_column_new_with_attributes ("Message", renderer_left, "text", COL_MESSAGE, "foreground",
COL_FOREGROUND, "background", COL_BACKGROUND, "strikethrough",
COL_STRIKETHROUGH, "style", COL_STYLE, "weight", COL_WEIGHT, "underline", COL_UNDERLINE, NULL);
gtk_tree_view_column_set_resizable (column, TRUE);
gtk_tree_view_column_set_alignment (column, 0.5);
gtk_tree_view_append_column (GTK_TREE_VIEW(list), column);
g_signal_connect(G_OBJECT(column), "clicked", G_CALLBACK(ui_callback_on_tree_column_header_click),
(gpointer) COL_MESSAGE);
column = gtk_tree_view_column_new_with_attributes ("From", renderer_left, "text", COL_FROM_TASK, NULL);
gtk_tree_view_column_set_alignment (column, 0.5);
gtk_tree_view_column_set_resizable (column, TRUE);
gtk_tree_view_append_column (GTK_TREE_VIEW(list), column);
g_signal_connect(G_OBJECT(column), "clicked", G_CALLBACK(ui_callback_on_tree_column_header_click),
(gpointer) COL_FROM_TASK);
column = gtk_tree_view_column_new_with_attributes ("To", renderer_left, "text", COL_TO_TASK, NULL);
gtk_tree_view_column_set_alignment (column, 0.5);
gtk_tree_view_column_set_resizable (column, TRUE);
gtk_tree_view_append_column (GTK_TREE_VIEW(list), column);
g_signal_connect(G_OBJECT(column), "clicked", G_CALLBACK(ui_callback_on_tree_column_header_click),
(gpointer) COL_TO_TASK);
column = gtk_tree_view_column_new_with_attributes ("Ins", renderer_right, "text", COL_INSTANCE, NULL);
gtk_tree_view_column_set_alignment (column, 0.5);
gtk_tree_view_append_column (GTK_TREE_VIEW(list), column);
g_signal_connect(G_OBJECT(column), "clicked", G_CALLBACK(ui_callback_on_tree_column_header_click),
(gpointer) COL_INSTANCE);
ui_store.store = gtk_list_store_new (NUM_COLS, // Number of columns
// Displayed columns
G_TYPE_UINT, // COL_MSG_NUM
G_TYPE_STRING, // COL_LTE_TIME
G_TYPE_STRING, // COL_MESSAGE
G_TYPE_STRING, // COL_FROM_TASK
G_TYPE_STRING, // COL_TO_TASK
G_TYPE_STRING, // COL_INSTANCE
// Not displayed columns
// Id of some message fields to speed-up filtering
G_TYPE_UINT, // COL_MESSAGE_ID
G_TYPE_UINT, // COL_FROM_TASK_ID
G_TYPE_UINT, // COL_TO_TASK_ID
G_TYPE_UINT, // COL_INSTANCE_ID
G_TYPE_STRING, // COL_FOREGROUND
G_TYPE_STRING, // COL_BACKGROUND
G_TYPE_BOOLEAN, // COL_STRIKETHROUGH
G_TYPE_UINT,
G_TYPE_UINT,
G_TYPE_UINT,
// Reference to the buffer here to avoid maintaining multiple lists.
G_TYPE_POINTER);
if (ui_store.store == NULL)
{
g_error("gtk_list_store_new failed");
}
ui_store.filtered = GTK_TREE_MODEL_FILTER (gtk_tree_model_filter_new (GTK_TREE_MODEL (ui_store.store), NULL));
gtk_tree_model_filter_set_visible_func (ui_store.filtered, (GtkTreeModelFilterVisibleFunc) ui_tree_filter_messages,
&ui_store, NULL);
gtk_tree_view_set_model (GTK_TREE_VIEW(list), GTK_TREE_MODEL(ui_store.filtered));
gtk_tree_view_columns_autosize (GTK_TREE_VIEW(list));
}
static void ui_tree_view_add_to_list(GtkWidget *list, const gchar *lte_time, const uint32_t message_number,
const uint32_t message_id, const gchar *signal_name, const uint32_t origin_task_id,
const char *origin_task_name, const uint32_t destination_task_id,
const char *destination_task_name, uint32_t instance_id, const char *instance_name, gpointer buffer)
{
static int counter = 0;
GtkTreeIter iter;
gboolean enabled;
int message_index;
g_info("ui_tree_view_add_to_list: %d %d %d %d %d", message_number, message_id, origin_task_id, destination_task_id, instance_id);
enabled = ui_filters_message_enabled (message_id, origin_task_id, destination_task_id, instance_id);
message_index = ui_filters_search_id (&ui_filters.messages, message_id);
g_info("ui_tree_view_add_to_list: %d %d", enabled, message_index);
gtk_list_store_append (ui_store.store, &iter);
gtk_list_store_set (ui_store.store, &iter,
/* Columns */
COL_MSG_NUM,
message_number, COL_LTE_TIME, lte_time, COL_MESSAGE, signal_name, COL_FROM_TASK, origin_task_name,
COL_TO_TASK, destination_task_name, COL_INSTANCE, instance_name, COL_MESSAGE_ID, message_id,
COL_FROM_TASK_ID, origin_task_id, COL_TO_TASK_ID, destination_task_id, COL_INSTANCE_ID, instance_id,
COL_BUFFER, buffer, COL_FOREGROUND, ui_filters.messages.items[message_index].foreground, COL_BACKGROUND,
ui_filters.messages.items[message_index].background, COL_STRIKETHROUGH, !enabled,
// COL_STYLE, (counter % 2) == 0 ? PANGO_STYLE_ITALIC : PANGO_STYLE_NORMAL,
// COL_WEIGHT, ((counter + 2) % 4) < 2 ? PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL,
// COL_UNDERLINE, ((counter + 4) % 8) < 4 ?PANGO_UNDERLINE_SINGLE : PANGO_UNDERLINE_NONE,
COL_STYLE, PANGO_STYLE_NORMAL,
COL_WEIGHT, PANGO_WEIGHT_NORMAL,
COL_UNDERLINE, PANGO_UNDERLINE_NONE,
/* End of columns */
-1);
counter++;
}
void ui_tree_view_destroy_list(GtkWidget *list)
{
g_assert(list != NULL);
gtk_list_store_clear (ui_store.store);
ui_store.filtered_last_msg = 0;
ui_store.filtered_msg_number = 0;
ui_store.instance_number = 0;
/* Reset number of messages */
ui_main_data.nb_message_received = 0;
}
/* Search for the message with its message number equal to the given value or the previous one */
static gboolean ui_tree_view_search(GtkTreeModel *model, gint column, const gchar *key, GtkTreeIter *iter,
gpointer search_data)
{
uint32_t msg_number;
uint32_t key_value = atoi (key);
gtk_tree_model_get (model, iter, column, &msg_number, -1);
g_debug("ui_tree_view_search %d %d", key_value, msg_number);
if (key_value == msg_number)
{
/* Value found, use this message */
return 0;
}
{
GtkTreeIter iter_next = *iter;
if (gtk_tree_model_iter_next (model, &iter_next))
{
gtk_tree_model_get (model, &iter_next, column, &msg_number, -1);
if (key_value < msg_number)
{
/* Next value will be greater, use this message */
return 0;
}
}
else
{
/* Last value, use this message */
return 0;
}
}
return 1;
}
static void ui_tree_view_create_menu(GtkWidget **menu)
{
GtkWidget *menu_items;
*menu = gtk_menu_new ();
/* Create the "Message enable" menu-item */
{
/* Create a new menu-item */
menu_items = gtk_check_menu_item_new ();
ui_tree_view_menu_enable[MENU_MESSAGE].menu_enable = menu_items;
/* Add it to the menu. */
gtk_menu_shell_append (GTK_MENU_SHELL(*menu), menu_items);
g_signal_connect(G_OBJECT(menu_items), "activate", G_CALLBACK(ui_callback_on_menu_enable),
&ui_tree_view_menu_enable[MENU_MESSAGE]);
/* Show the widget */
gtk_widget_show (menu_items);
}
/* Create the "Destination task enable" menu-item */
{
/* Create a new menu-item */
menu_items = gtk_check_menu_item_new ();
ui_tree_view_menu_enable[MENU_FROM_TASK].menu_enable = menu_items;
/* Add it to the menu. */
gtk_menu_shell_append (GTK_MENU_SHELL(*menu), menu_items);
g_signal_connect(G_OBJECT(menu_items), "activate", G_CALLBACK(ui_callback_on_menu_enable),
&ui_tree_view_menu_enable[MENU_FROM_TASK]);
/* Show the widget */
gtk_widget_show (menu_items);
}
/* Create the "Origin task enable" menu-item */
{
/* Create a new menu-item */
menu_items = gtk_check_menu_item_new ();
ui_tree_view_menu_enable[MENU_TO_TASK].menu_enable = menu_items;
/* Add it to the menu. */
gtk_menu_shell_append (GTK_MENU_SHELL(*menu), menu_items);
g_signal_connect(G_OBJECT(menu_items), "activate", G_CALLBACK(ui_callback_on_menu_enable),
&ui_tree_view_menu_enable[MENU_TO_TASK]);
/* Show the widget */
gtk_widget_show (menu_items);
}
/* Create the "Instance enable" menu-item */
{
/* Create a new menu-item */
menu_items = gtk_check_menu_item_new ();
ui_tree_view_menu_enable[MENU_INSTANCE].menu_enable = menu_items;
/* Add it to the menu. */
gtk_menu_shell_append (GTK_MENU_SHELL(*menu), menu_items);
g_signal_connect(G_OBJECT(menu_items), "activate", G_CALLBACK(ui_callback_on_menu_enable),
&ui_tree_view_menu_enable[MENU_INSTANCE]);
/* Show the widget */
gtk_widget_show (menu_items);
}
/* Create the "Foreground color" menu-item */
{
static ui_tree_view_menu_color_t menu_color_foreground =
{TRUE, &ui_tree_view_menu_enable[MENU_MESSAGE]};
/* Create a new menu-item with a name */
menu_items = gtk_menu_item_new_with_label ("Select message foreground color");
/* Add it to the menu. */
gtk_menu_shell_append (GTK_MENU_SHELL(*menu), menu_items);
g_signal_connect(G_OBJECT(menu_items), "activate", G_CALLBACK(ui_callback_on_menu_color),
&menu_color_foreground);
/* Show the widget */
gtk_widget_show (menu_items);
}
/* Create the "Background color" menu-item */
{
static ui_tree_view_menu_color_t menu_color_background =
{FALSE, &ui_tree_view_menu_enable[MENU_MESSAGE]};
/* Create a new menu-item with a name */
menu_items = gtk_menu_item_new_with_label ("Select message background color");
/* Add it to the menu. */
gtk_menu_shell_append (GTK_MENU_SHELL(*menu), menu_items);
g_signal_connect(G_OBJECT(menu_items), "activate", G_CALLBACK(ui_callback_on_menu_color),
&menu_color_background);
/* Show the widget */
gtk_widget_show (menu_items);
}
}
int ui_tree_view_create(GtkWidget *window, GtkWidget *vbox)
{
GtkWidget *hbox;
GtkTreeSelection *selection;
GtkWidget *scrolled_window;
scrolled_window = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW(scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
ui_main_data.messages_list = gtk_tree_view_new ();
gtk_tree_view_set_headers_visible (GTK_TREE_VIEW(ui_main_data.messages_list), TRUE);
gtk_tree_view_set_search_equal_func (GTK_TREE_VIEW(ui_main_data.messages_list), ui_tree_view_search, NULL, NULL);
gtk_tree_view_set_search_entry (GTK_TREE_VIEW(ui_main_data.messages_list),
GTK_ENTRY(ui_main_data.signals_go_to_entry));
/* Disable multiple selection */
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(ui_main_data.messages_list));
gtk_tree_selection_set_mode (selection, GTK_SELECTION_BROWSE);
hbox = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
gtk_container_add (GTK_CONTAINER(scrolled_window), ui_main_data.messages_list);
ui_tree_view_init_list (ui_main_data.messages_list);
gtk_tree_view_set_headers_clickable (GTK_TREE_VIEW(ui_main_data.messages_list), TRUE);
gtk_scrolled_window_set_min_content_width (GTK_SCROLLED_WINDOW(scrolled_window), 680);
gtk_paned_pack1 (GTK_PANED (hbox), scrolled_window, FALSE, TRUE);
ui_main_data.text_view = ui_signal_dissect_new (hbox);
gtk_box_pack_start (GTK_BOX(vbox), hbox, TRUE, TRUE, 5);
g_signal_connect(G_OBJECT(ui_main_data.messages_list), "button-press-event", G_CALLBACK (onButtonPressed), NULL);
// g_signal_connect(G_OBJECT(ui_main_data.signalslist), "button-release-event", G_CALLBACK (onButtonRelease), NULL);
/* Connect callback on row selection */
gtk_tree_selection_set_select_function (selection, ui_callback_on_select_signal, ui_main_data.text_view, NULL);
ui_store.filtered_last_msg = 0;
ui_store.filtered_msg_number = 0;
ui_store.instance_number = 0;
ui_main_data.selection = selection;
ui_tree_view_create_menu (&ui_tree_view_menu);
return 0;
}
int ui_tree_view_new_signal_ind(const uint32_t message_number, const gchar *lte_time, const uint32_t message_id,
const char *message_name, const uint32_t origin_task_id, const char *origin_task_name,
const uint32_t destination_task_id, const char *destination_task_name, uint32_t instance_id,
gpointer buffer)
{
char *instance_name = NULL;
char instance_name_buffer[10];
if (((instance_t) instance_id) < INSTANCE_DEFAULT)
{
if (ui_store.instance_number < (instance_id + 1))
{
int i;
for (i = ui_store.instance_number; i <= instance_id; i++)
{
sprintf (instance_name_buffer, "%d", i);
ui_filters_add (FILTER_INSTANCES, i, instance_name_buffer, ENTRY_ENABLED_TRUE, NULL, NULL);
}
ui_store.instance_number = (instance_id + 1);
ui_destroy_filter_menu (FILTER_INSTANCES);
}
sprintf (instance_name_buffer, "%d", instance_id);
instance_name = instance_name_buffer;
}
else
{
switch ((instance_t) instance_id)
{
case INSTANCE_DEFAULT:
instance_name = "DEF";
break;
case INSTANCE_ALL:
instance_name = "ALL";
break;
default:
break;
}
if ((instance_name != NULL) && (ui_filters_search_id (&ui_filters.instances, instance_id) < 0))
{
ui_filters_add (FILTER_INSTANCES, instance_id, instance_name, ENTRY_ENABLED_TRUE, NULL, NULL);
}
}
ui_tree_view_add_to_list (ui_main_data.messages_list, lte_time, message_number, message_id, message_name,
origin_task_id, origin_task_name, destination_task_id, destination_task_name, instance_id, instance_name,
buffer);
return RC_OK;
}
void ui_tree_view_select_row(gint row)
{
GtkTreePath *path_row;
if (row >= 0)
{
path_row = gtk_tree_path_new_from_indices (row, -1);
if ((ui_main_data.messages_list != NULL) && (path_row != NULL))
{
g_info("Select row %d", row);
/* Select the message in requested row */
gtk_tree_view_set_cursor (GTK_TREE_VIEW(ui_main_data.messages_list), path_row, NULL, FALSE);
/* Center the message in the middle of the list if possible */
gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW(ui_main_data.messages_list), path_row, NULL, TRUE, 0.5, 0.0);
}
}
}
static gboolean updateColors(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data)
{
uint32_t message_id;
uint32_t origin_task_id;
uint32_t destination_task_id;
uint32_t instance;
gboolean enabled = FALSE;
int message_index;
gtk_tree_model_get (model, iter, COL_MESSAGE_ID, &message_id, COL_FROM_TASK_ID, &origin_task_id, COL_TO_TASK_ID,
&destination_task_id, COL_INSTANCE_ID, &instance, -1);
enabled = ui_filters_message_enabled (message_id, origin_task_id, destination_task_id, instance);
message_index = ui_filters_search_id (&ui_filters.messages, message_id);
gtk_list_store_set (GTK_LIST_STORE(model), iter, COL_FOREGROUND,
ui_filters.messages.items[message_index].foreground, COL_BACKGROUND,
ui_filters.messages.items[message_index].background, COL_STRIKETHROUGH, !enabled, -1);
return FALSE;
}
void ui_tree_view_refilter()
{
ui_store.filtered_last_msg = 0;
ui_store.filtered_msg_number = 0;
/* Update foreground color of messages, this will also update filtered model */
if (ui_store.store != NULL)
{
gtk_tree_model_foreach (GTK_TREE_MODEL(ui_store.store), updateColors, NULL);
if (ui_main_data.messages_list != NULL)
{
GtkTreePath *path_row;
/* Get the currently selected message */
gtk_tree_view_get_cursor (GTK_TREE_VIEW(ui_main_data.messages_list), &path_row, NULL);
if (path_row != NULL)
{
/* Center the message in the middle of the list if possible */
gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW(ui_main_data.messages_list), path_row, NULL, TRUE, 0.5,
0.0);
g_info("ui_tree_view_refilter: center on message");
}
}
}
g_info("ui_tree_view_refilter: last message %d, %d messages displayed", ui_store.filtered_last_msg, ui_store.filtered_msg_number);
}
typedef struct foreach_message_params_s
{
message_write_callback_t callback;
gboolean filter;
} foreach_message_params_t;
static gboolean foreach_message(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data)
{
foreach_message_params_t *params = (foreach_message_params_t *) data;
const gchar *signal_name;
uint32_t message_id;
uint32_t origin_task_id;
uint32_t destination_task_id;
uint32_t instance;
gpointer buffer = NULL;
gtk_tree_model_get (model, iter, COL_MESSAGE, &signal_name, COL_MESSAGE_ID, &message_id, COL_FROM_TASK_ID, &origin_task_id, COL_TO_TASK_ID,
&destination_task_id, COL_INSTANCE_ID, &instance, COL_BUFFER, &buffer, -1);
if (params->filter == TRUE)
{
gboolean enabled = FALSE;
enabled = ui_filters_message_enabled (message_id, origin_task_id, destination_task_id, instance);
if (enabled == FALSE)
{
buffer = NULL;
}
}
if (buffer != NULL)
{
params->callback(buffer, signal_name);
}
return FALSE;
}
void ui_tree_view_foreach_message(message_write_callback_t callback, gboolean filter)
{
foreach_message_params_t params = {callback, filter};
gtk_tree_model_foreach (GTK_TREE_MODEL(ui_store.store), foreach_message, (void *) &params);
}
guint ui_tree_view_get_filtered_number(void)
{
return ui_store.filtered_msg_number;
}
@@ -1,96 +0,0 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#ifndef UI_TREE_VIEW_H_
#define UI_TREE_VIEW_H_
#include "ui_filters.h"
#include "ui_notifications.h"
typedef enum col_type_e
{
COL_MSG_NUM = 0,
COL_LTE_TIME,
COL_MESSAGE,
COL_FROM_TASK,
COL_TO_TASK,
COL_INSTANCE,
COL_MESSAGE_ID,
COL_FROM_TASK_ID,
COL_TO_TASK_ID,
COL_INSTANCE_ID,
COL_FOREGROUND,
COL_BACKGROUND,
COL_STRIKETHROUGH,
COL_STYLE,
COL_WEIGHT,
COL_UNDERLINE,
COL_BUFFER,
NUM_COLS
} col_type_t;
typedef enum ui_tree_view_menu_type_e
{
MENU_MESSAGE = 0,
MENU_FROM_TASK,
MENU_TO_TASK,
MENU_INSTANCE,
NUM_MENU_TYPE,
} ui_tree_view_menu_type_t;
typedef struct ui_tree_view_menu_enable_s
{
GtkWidget *menu_enable;
ui_filter_item_t *filter_item;
} ui_tree_view_menu_enable_t;
typedef struct ui_tree_view_menu_color_s
{
gboolean foreground;
ui_tree_view_menu_enable_t *menu_enable;
} ui_tree_view_menu_color_t;
extern GtkWidget *ui_tree_view_menu;
extern ui_tree_view_menu_enable_t ui_tree_view_menu_enable[NUM_MENU_TYPE];
extern GdkEventButton *ui_tree_view_last_event;
int ui_tree_view_create(GtkWidget *window, GtkWidget *vbox);
int ui_tree_view_new_signal_ind(const uint32_t message_number, const gchar *lte_time,
const uint32_t message_id, const char *message_name,
const uint32_t origin_task_id, const char *origin_task,
const uint32_t destination_task_id, const char *to_task,
uint32_t instance, gpointer buffer);
void ui_tree_view_destroy_list(GtkWidget *list);
void ui_tree_view_select_row(gint row);
void ui_tree_view_refilter(void);
void ui_tree_view_foreach_message(message_write_callback_t callback, gboolean filter);
guint ui_tree_view_get_filtered_number(void);
#endif /* UI_TREE_VIEW_H_ */
+1 -1
View File
@@ -88,7 +88,7 @@ void *msc_task(void *args_p)
if (received_message_p != NULL) {
// msg_name = ITTI_MSG_NAME (received_message_p);
// instance = ITTI_MSG_INSTANCE (received_message_p);
// instance = ITTI_MSG_DESTINATION_INSTANCE (received_message_p);
switch (ITTI_MSG_ID(received_message_p)) {
case TIMER_HAS_EXPIRED: {
msc_flush_messages();
+90 -77
View File
@@ -30,30 +30,32 @@ extern "C" {
#include <intertask_interface.h>
#include <common/utils/system.h>
typedef struct timer_elm_s {
timer_type_t type; ///< Timer type
long instance;
long duration;
uint64_t timeout;
void *timer_arg; ///< Optional argument that will be passed when timer expires
} timer_elm_t ;
typedef struct timer_elm_s {
timer_type_t type; ///< Timer type
long instance;
long duration;
uint64_t timeout;
void *timer_arg; ///< Optional argument that will be passed when timer expires
} timer_elm_t ;
typedef struct task_list_s {
task_info_t admin;
pthread_t thread;
pthread_mutex_t queue_cond_lock;
std::vector<MessageDef *> message_queue;
std::map<long,timer_elm_t> timer_map;
uint64_t next_timer=UINT64_MAX;
struct epoll_event *events =NULL;
int nb_fd_epoll=0;
int nb_events=0;
int epoll_fd=-1;
int sem_fd=-1;
} task_list_t;
typedef struct task_list_s {
task_info_t admin;
pthread_t thread;
pthread_mutex_t queue_cond_lock;
std::vector<MessageDef *> message_queue;
std::map<long,timer_elm_t> timer_map;
uint64_t next_timer=UINT64_MAX;
struct epoll_event *events =NULL;
int nb_fd_epoll=0;
int nb_events=0;
int epoll_fd=-1;
int sem_fd=-1;
} task_list_t;
int timer_expired(int fd);
task_list_t tasks[TASK_MAX];
int timer_expired(int fd);
static task_list_t **tasks=NULL;
static int nb_queues=0;
static pthread_mutex_t lock_nb_queues;
void *pool_buffer_init (void) {
return 0;
@@ -99,7 +101,7 @@ task_list_t tasks[TASK_MAX];
// #define S1AP_REGISTER_ENB_REQ(mSGpTR) (mSGpTR)->ittiMsg.s1ap_register_enb_req
// would become
// #define S1AP_REGISTER_ENB_REQ(mSGpTR) (s1ap_register_enb_req) mSGpTR)->ittiMsg
MessageDef *itti_alloc_new_message_sized(task_id_t origin_task_id, MessagesIds message_id, MessageHeaderSize size) {
MessageDef *itti_alloc_new_message_sized(task_id_t origin_task_id, instance_t originInstance, MessagesIds message_id, MessageHeaderSize size) {
MessageDef *temp = (MessageDef *)itti_malloc (origin_task_id, TASK_UNKNOWN, sizeof(MessageHeader) +32 + size);
temp->ittiMsgHeader.messageId = message_id;
temp->ittiMsgHeader.originTaskId = origin_task_id;
@@ -107,23 +109,24 @@ task_list_t tasks[TASK_MAX];
return temp;
}
MessageDef *itti_alloc_new_message(task_id_t origin_task_id, MessagesIds message_id) {
MessageDef *itti_alloc_new_message(task_id_t origin_task_id, instance_t originInstance, MessagesIds message_id) {
int size=sizeof(MessageHeader) + 32 + messages_info[message_id].size;
MessageDef *temp = (MessageDef *)itti_malloc (origin_task_id, TASK_UNKNOWN, size);
temp->ittiMsgHeader.messageId = message_id;
temp->ittiMsgHeader.originTaskId = origin_task_id;
temp->ittiMsgHeader.ittiMsgSize = size;
temp->ittiMsgHeader.destinationTaskId=TASK_UNKNOWN;
temp->ittiMsgHeader.instance=0;
temp->ittiMsgHeader.lte_time={0};
temp->ittiMsgHeader.originInstance=originInstance;
temp->ittiMsgHeader.destinationInstance=0;
temp->ittiMsgHeader.lte_time= {0};
return temp;
//return itti_alloc_new_message_sized(origin_task_id, message_id, messages_info[message_id].size);
}
static inline int itti_send_msg_to_task_locked(task_id_t destination_task_id, instance_t instance, MessageDef *message) {
task_list_t *t=tasks+destination_task_id;
static inline int itti_send_msg_to_task_locked(task_id_t destination_task_id, instance_t destinationInstance, MessageDef *message) {
task_list_t *t=tasks[destination_task_id];
message->ittiMsgHeader.destinationTaskId = destination_task_id;
message->ittiMsgHeader.instance = instance;
message->ittiMsgHeader.destinationInstance = destinationInstance;
message->ittiMsgHeader.lte_time.frame = 0;
message->ittiMsgHeader.lte_time.slot = 0;
int message_id = message->ittiMsgHeader.messageId;
@@ -142,25 +145,27 @@ task_list_t tasks[TASK_MAX];
return 0;
}
int itti_send_msg_to_task(task_id_t destination_task_id, instance_t instance, MessageDef *message) {
task_list_t *t=&tasks[destination_task_id];
int itti_send_msg_to_task(task_id_t destination_task_id, instance_t destinationInstance, MessageDef *message) {
task_list_t *t=tasks[destination_task_id];
pthread_mutex_lock (&t->queue_cond_lock);
int ret=itti_send_msg_to_task_locked(destination_task_id, instance, message);
int ret=itti_send_msg_to_task_locked(destination_task_id, destinationInstance, message);
while ( t->message_queue.size()>0 && t->admin.func != NULL ) {
if (t->message_queue.size()>1)
LOG_W(TMR,"queue in no thread mode is %ld\n", t->message_queue.size());
LOG_W(TMR,"queue in no thread mode is %ld\n", t->message_queue.size());
pthread_mutex_unlock (&t->queue_cond_lock);
t->admin.func(NULL);
pthread_mutex_lock (&t->queue_cond_lock);
}
pthread_mutex_unlock (&t->queue_cond_lock);
return ret;
}
void itti_subscribe_event_fd(task_id_t task_id, int fd) {
struct epoll_event event;
task_list_t *t=&tasks[task_id];
task_list_t *t=tasks[task_id];
t->nb_fd_epoll++;
t->events = (struct epoll_event *)realloc((void *)t->events,
t->nb_fd_epoll * sizeof(struct epoll_event));
@@ -173,7 +178,7 @@ task_list_t tasks[TASK_MAX];
}
void itti_unsubscribe_event_fd(task_id_t task_id, int fd) {
task_list_t *t=&tasks[task_id];
task_list_t *t=tasks[task_id];
AssertFatal (epoll_ctl(t->epoll_fd, EPOLL_CTL_DEL, fd, NULL) == 0,
"epoll_ctl (EPOLL_CTL_DEL) failed for task %s, fd %d: %s!\n",
itti_get_task_name(task_id), fd, strerror(errno));
@@ -181,7 +186,7 @@ task_list_t tasks[TASK_MAX];
}
static inline int itti_get_events_locked(task_id_t task_id, struct epoll_event **events) {
task_list_t *t=&tasks[task_id];
task_list_t *t=tasks[task_id];
uint64_t current_time=0;
do {
@@ -194,10 +199,11 @@ task_list_t tasks[TASK_MAX];
t->next_timer=UINT64_MAX;
// Proceed expired timer
for ( auto it=t->timer_map.begin() , next_it = it; it != t->timer_map.end() ; it = next_it ) {
for ( auto it=t->timer_map.begin(), next_it = it; it != t->timer_map.end() ; it = next_it ) {
++next_it;
if ( it->second.timeout < current_time ) {
MessageDef *message = itti_alloc_new_message(TASK_TIMER, TIMER_HAS_EXPIRED);
MessageDef *message = itti_alloc_new_message(TASK_TIMER, it->second.instance,TIMER_HAS_EXPIRED);
message->ittiMsg.timer_has_expired.timer_id=it->first;
message->ittiMsg.timer_has_expired.arg=it->second.timer_arg;
@@ -229,8 +235,9 @@ task_list_t tasks[TASK_MAX];
pthread_mutex_unlock(&t->queue_cond_lock);
LOG_D(TMR,"enter blocking wait for %s\n", itti_get_task_name(task_id));
t->nb_events = epoll_wait(t->epoll_fd,t->events,t->nb_fd_epoll, epoll_timeout);
if ( t->nb_events < 0 && (errno == EINTR || errno == EAGAIN ) )
pthread_mutex_lock(&t->queue_cond_lock);
pthread_mutex_lock(&t->queue_cond_lock);
} while (t->nb_events < 0 && (errno == EINTR || errno == EAGAIN ) );
AssertFatal (t->nb_events >=0,
@@ -259,13 +266,13 @@ task_list_t tasks[TASK_MAX];
}
int itti_get_events(task_id_t task_id, struct epoll_event **events) {
pthread_mutex_lock(&tasks[task_id].queue_cond_lock);
pthread_mutex_lock(&tasks[task_id]->queue_cond_lock);
return itti_get_events_locked(task_id, events);
}
void itti_receive_msg(task_id_t task_id, MessageDef **received_msg) {
// Reception of one message, blocking caller
task_list_t *t=&tasks[task_id];
task_list_t *t=tasks[task_id];
pthread_mutex_lock(&t->queue_cond_lock);
// Weird condition to deal with crap legacy itti interface
@@ -295,10 +302,9 @@ task_list_t tasks[TASK_MAX];
pthread_mutex_unlock (&t->queue_cond_lock);
}
void itti_poll_msg(task_id_t task_id, MessageDef **received_msg)
{
void itti_poll_msg(task_id_t task_id, MessageDef **received_msg) {
//reception of one message, non-blocking
task_list_t *t=&tasks[task_id];
task_list_t *t=tasks[task_id];
pthread_mutex_lock(&t->queue_cond_lock);
if (!t->message_queue.empty()) {
@@ -312,11 +318,10 @@ task_list_t tasks[TASK_MAX];
}
int itti_create_task(task_id_t task_id,
void *(*start_routine)(void *),
void *args_p)
{
task_list_t *t=&tasks[task_id];
threadCreate (&t->thread, start_routine, args_p, (char*)itti_get_task_name(task_id),-1,OAI_PRIORITY_RT);
void *(*start_routine)(void *),
void *args_p) {
task_list_t *t=tasks[task_id];
threadCreate (&t->thread, start_routine, args_p, (char *)itti_get_task_name(task_id),-1,OAI_PRIORITY_RT);
LOG_I(TMR,"Created Posix thread %s\n", itti_get_task_name(task_id) );
return 0;
}
@@ -325,31 +330,39 @@ task_list_t tasks[TASK_MAX];
pthread_exit (NULL);
}
void itti_terminate_tasks(task_id_t task_id)
{
void itti_terminate_tasks(task_id_t task_id) {
// Sends Terminate signals to all tasks.
itti_send_terminate_message (task_id);
usleep(100*1000); // Allow the tasks to receive the message before going returning to main thread
}
int itti_create_queue(const task_info_t *taskInfo) {
pthread_mutex_lock (&lock_nb_queues);
int newQueue=nb_queues++;
AssertFatal(tasks=(task_list_t **) realloc(tasks, nb_queues * sizeof(*tasks)),"");
tasks[newQueue]= new task_list_t;
pthread_mutex_unlock (&lock_nb_queues);
LOG_I(TMR,"Starting itti queue: %s as task %d\n", taskInfo->name, newQueue);
pthread_mutex_init(&tasks[newQueue]->queue_cond_lock, NULL);
memcpy(&tasks[newQueue]->admin, taskInfo, sizeof(task_info_t));
AssertFatal( ( tasks[newQueue]->epoll_fd = epoll_create1(0) ) >=0, "");
AssertFatal( ( tasks[newQueue]->sem_fd = eventfd(0, EFD_SEMAPHORE) ) >=0, "");
itti_subscribe_event_fd((task_id_t)newQueue, tasks[newQueue]->sem_fd);
if (tasks[newQueue]->admin.threadFunc != NULL)
itti_create_task((task_id_t)newQueue, tasks[newQueue]->admin.threadFunc, NULL);
return newQueue;
}
int itti_init(task_id_t task_max,
thread_id_t thread_max,
MessagesIds messages_id_max,
const task_info_t *tasks_info,
const message_info_t *messages_info)
{
AssertFatal(TASK_MAX<UINT16_MAX, "Max itti tasks");
const task_info_t *tasks
) {
pthread_mutex_init(&lock_nb_queues, NULL);
nb_queues=0;
for(int i=0; i<task_max; ++i) {
LOG_I(TMR,"Starting itti queue: %s as task %d\n", tasks_info[i].name, i);
pthread_mutex_init(&tasks[i].queue_cond_lock, NULL);
memcpy(&tasks[i].admin, &tasks_info[i], sizeof(task_info_t));
AssertFatal( ( tasks[i].epoll_fd = epoll_create1(0) ) >=0, "");
AssertFatal( ( tasks[i].sem_fd = eventfd(0, EFD_SEMAPHORE) ) >=0, "");
itti_subscribe_event_fd((task_id_t)i, tasks[i].sem_fd);
if (tasks[i].admin.threadFunc != NULL)
itti_create_task((task_id_t)i, tasks[i].admin.threadFunc, NULL);
itti_create_queue(&tasks[i]);
}
return 0;
@@ -359,12 +372,11 @@ task_list_t tasks[TASK_MAX];
uint32_t interval_sec,
uint32_t interval_us,
task_id_t task_id,
int32_t instance,
instance_t instance,
timer_type_t type,
void *timer_arg,
long *timer_id)
{
task_list_t *t=&tasks[task_id];
long *timer_id) {
task_list_t *t=tasks[task_id];
do {
// set the taskid in the timer id to keep compatible with the legacy API
@@ -397,13 +409,12 @@ task_list_t tasks[TASK_MAX];
return 0;
}
int timer_remove(long timer_id)
{
int timer_remove(long timer_id) {
task_id_t task_id=(task_id_t)(timer_id&0xffff);
int ret;
pthread_mutex_lock (&tasks[task_id].queue_cond_lock);
ret=tasks[task_id].timer_map.erase(timer_id);
pthread_mutex_unlock (&tasks[task_id].queue_cond_lock);
pthread_mutex_lock (&tasks[task_id]->queue_cond_lock);
ret=tasks[task_id]->timer_map.erase(timer_id);
pthread_mutex_unlock (&tasks[task_id]->queue_cond_lock);
if (ret==1)
return 0;
@@ -418,7 +429,7 @@ task_list_t tasks[TASK_MAX];
}
const char *itti_get_task_name(task_id_t task_id) {
return tasks[task_id].admin.name;
return tasks[task_id]->admin.name;
}
// void for compatibility
@@ -439,5 +450,7 @@ task_list_t tasks[TASK_MAX];
void itti_wait_ready(int wait_tasks) {
// Stupid function, kept for compatibility (the parameter is meaningless!!!)
}
int signal_mask(void) { return 0;}
int signal_mask(void) {
return 0;
}
}
+14 -10
View File
@@ -45,7 +45,7 @@ typedef struct {
uint32_t interval_sec;
uint32_t interval_us;
long task_id;
int32_t instance;
instance_t instance;
timer_type_t type;
void *timer_arg;
long timer_id;
@@ -264,7 +264,7 @@ void *rrc_enb_process_itti_msg(void *);
#include <openair3/NGAP/ngap_gNB.h>
#ifdef ITTI_SIM
#include <openair2/COMMON/itti_sim_messages_types.h>
#include <openair2/COMMON/itti_sim_messages_types.h>
#endif
/*
@@ -301,7 +301,7 @@ typedef struct {
//TASK_DEF(TASK_RRC_ENB, TASK_PRIORITY_MED, 200, NULL, NULL)
//TASK_DEF(TASK_GTPV1_U, TASK_PRIORITY_MED, 1000,NULL, NULL)
//TASK_DEF(TASK_UDP, TASK_PRIORITY_MED, 1000, NULL, NULL)
void * rrc_enb_process_msg(void*);
void *rrc_enb_process_msg(void *);
#define FOREACH_TASK(TASK_DEF) \
TASK_DEF(TASK_UNKNOWN, TASK_PRIORITY_MED, 50, NULL, NULL) \
TASK_DEF(TASK_TIMER, TASK_PRIORITY_MED, 10, NULL, NULL) \
@@ -403,7 +403,8 @@ typedef struct MessageHeader_s {
MessagesIds messageId; /**< Unique message id as referenced in enum MessagesIds */
task_id_t originTaskId; /**< ID of the sender task */
task_id_t destinationTaskId; /**< ID of the destination task */
instance_t instance; /**< Task instance for virtualization */
instance_t originInstance;
instance_t destinationInstance;
itti_lte_time_t lte_time;
MessageHeaderSize ittiMsgSize; /**< Message size (not including header size) */
} MessageHeader;
@@ -433,11 +434,11 @@ typedef struct MessageDef_s {
/* Extract the instance from a message */
#define ITTI_MESSAGE_GET_INSTANCE(mESSAGE) ((mESSAGE)->ittiMsgHeader.instance)
#define ITTI_MSG_ID(mSGpTR) ((mSGpTR)->ittiMsgHeader.messageId)
#define ITTI_MSG_ORIGIN_ID(mSGpTR) ((mSGpTR)->ittiMsgHeader.originTaskId)
#define ITTI_MSG_DESTINATION_ID(mSGpTR) ((mSGpTR)->ittiMsgHeader.destinationTaskId)
#define ITTI_MSG_INSTANCE(mSGpTR) ((mSGpTR)->ittiMsgHeader.instance)
#define ITTI_MSG_ORIGIN_INSTANCE(mSGpTR) ((mSGpTR)->ittiMsgHeader.originInstance)
#define ITTI_MSG_DESTINATION_INSTANCE(mSGpTR) ((mSGpTR)->ittiMsgHeader.destinationInstance)
#define ITTI_MSG_NAME(mSGpTR) itti_get_message_name(ITTI_MSG_ID(mSGpTR))
#define ITTI_MSG_ORIGIN_NAME(mSGpTR) itti_get_task_name(ITTI_MSG_ORIGIN_ID(mSGpTR))
#define ITTI_MSG_DESTINATION_NAME(mSGpTR) itti_get_task_name(ITTI_MSG_DESTINATION_ID(mSGpTR))
@@ -500,6 +501,8 @@ int itti_create_task(task_id_t task_id,
void *(*start_routine) (void *),
void *args_p);
int itti_create_queue(const task_info_t *task_info);
/** \brief Exit the current task.
**/
void itti_exit_task(void);
@@ -530,6 +533,7 @@ const char *itti_get_task_name(task_id_t task_id);
**/
MessageDef *itti_alloc_new_message(
task_id_t origin_task_id,
instance_t originInstance,
MessagesIds message_id);
/** \brief Alloc and memset(0) a new itti message.
@@ -540,6 +544,7 @@ MessageDef *itti_alloc_new_message(
**/
MessageDef *itti_alloc_new_message_sized(
task_id_t origin_task_id,
instance_t originInstance,
MessagesIds message_id,
MessageHeaderSize size);
@@ -547,7 +552,7 @@ MessageDef *itti_alloc_new_message_sized(
This function should be called from the main thread after having created all ITTI tasks.
**/
void itti_wait_tasks_end(void);
#define THREAD_MAX 0 //for compatibility
#define ADDED_QUEUES_MAX 10 // Fix me: MSC component too hard to understand, we keep room for 10 queues created dynamically
void itti_set_task_real_time(task_id_t task_id);
/** \brief Send a termination message to all tasks.
@@ -561,13 +566,12 @@ void *malloc_or_fail(size_t size);
int memory_read(const char *datafile, void *data, size_t size);
int itti_free(task_id_t task_id, void *ptr);
int itti_init(task_id_t task_max, thread_id_t thread_max, MessagesIds messages_id_max, const task_info_t *tasks_info,
const message_info_t *messages_info);
int itti_init(task_id_t task_max, const task_info_t *tasks_info);
int timer_setup(
uint32_t interval_sec,
uint32_t interval_us,
task_id_t task_id,
int32_t instance,
instance_t instance,
timer_type_t type,
void *timer_arg,
long *timer_id);
+1
View File
@@ -264,6 +264,7 @@ The following features are valid for the gNB and the 5G-NR UE.
* Highly efficient 3GPP compliant LDPC encoder and decoder (BG1 and BG2 supported)
* Highly efficient 3GPP compliant polar encoder and decoder
* Encoder and decoder for short blocks
* Support for UL transform precoding (SC-FDMA)
## gNB PHY Layer ##
+4 -4
View File
@@ -1057,7 +1057,7 @@ void terminate_task(module_id_t mod_id, task_id_t from, task_id_t to) {
LOG_I(ENB_APP, "sending TERMINATE_MESSAGE from task %s (%d) to task %s (%d)\n",
itti_get_task_name(from), from, itti_get_task_name(to), to);
MessageDef *msg;
msg = itti_alloc_new_message (from, TERMINATE_MESSAGE);
msg = itti_alloc_new_message (from, 0, TERMINATE_MESSAGE);
itti_send_msg_to_task (to, ENB_MODULE_ID_TO_INSTANCE(mod_id), msg);
}
@@ -1108,7 +1108,7 @@ int restart_L1L2(module_id_t enb_id) {
itti_mark_task_ready(TASK_RRC_ENB);
/* pass a reconfiguration request which will configure everything down to
* RC.eNB[i][j]->frame_parms, too */
msg_p = itti_alloc_new_message(TASK_ENB_APP, RRC_CONFIGURATION_REQ);
msg_p = itti_alloc_new_message(TASK_ENB_APP, 0, RRC_CONFIGURATION_REQ);
RRC_CONFIGURATION_REQ(msg_p) = RC.rrc[enb_id]->configuration;
itti_send_msg_to_task(TASK_RRC_ENB, ENB_MODULE_ID_TO_INSTANCE(enb_id), msg_p);
init_eNB_afterRU();
@@ -1142,7 +1142,7 @@ int main ( int argc, char **argv ) {
if (opp_enabled ==1)
reset_opp_meas();
itti_init(TASK_MAX, THREAD_MAX, MESSAGES_ID_MAX, tasks_info, messages_info);
itti_init(TASK_MAX, tasks_info);
init_opt();
#ifndef PACKAGE_VERSION
# define PACKAGE_VERSION "UNKNOWN-EXPERIMENTAL"
@@ -1197,7 +1197,7 @@ int main ( int argc, char **argv ) {
AssertFatal(create_tasks(1)==0,"cannot create ITTI tasks\n");
for (int enb_id = 0; enb_id < RC.nb_inst; enb_id++) {
MessageDef *msg_p = itti_alloc_new_message (TASK_ENB_APP, RRC_CONFIGURATION_REQ);
MessageDef *msg_p = itti_alloc_new_message (TASK_ENB_APP, 0, RRC_CONFIGURATION_REQ);
RRC_CONFIGURATION_REQ(msg_p) = RC.rrc[enb_id]->configuration;
itti_send_msg_to_task (TASK_RRC_ENB, ENB_MODULE_ID_TO_INSTANCE(enb_id), msg_p);
}
+4 -4
View File
@@ -604,7 +604,7 @@ void wait_gNBs(void) {
void terminate_task(task_id_t task_id, module_id_t mod_id) {
LOG_I(GNB_APP, "sending TERMINATE_MESSAGE to task %s (%d)\n", itti_get_task_name(task_id), task_id);
MessageDef *msg;
msg = itti_alloc_new_message (ENB_APP, TERMINATE_MESSAGE);
msg = itti_alloc_new_message (ENB_APP, 0, TERMINATE_MESSAGE);
itti_send_msg_to_task (task_id, ENB_MODULE_ID_TO_INSTANCE(mod_id), msg);
}
@@ -679,7 +679,7 @@ int restart_L1L2(module_id_t gnb_id) {
/* pass a reconfiguration request which will configure everything down to
* RC.eNB[i][j]->frame_parms, too */
msg_p = itti_alloc_new_message(TASK_ENB_APP, RRC_CONFIGURATION_REQ);
msg_p = itti_alloc_new_message(TASK_ENB_APP, 0, RRC_CONFIGURATION_REQ);
RRC_CONFIGURATION_REQ(msg_p) = RC.rrc[gnb_id]->configuration;
itti_send_msg_to_task(TASK_RRC_ENB, ENB_MODULE_ID_TO_INSTANCE(gnb_id), msg_p);
/* TODO XForms might need to be restarted, but it is currently (09/02/18)
@@ -784,9 +784,9 @@ int main( int argc, char **argv )
}
cpuf=get_cpu_freq_GHz();
itti_init(TASK_MAX, THREAD_MAX, MESSAGES_ID_MAX, tasks_info, messages_info);
itti_init(TASK_MAX, tasks_info);
// initialize mscgen log after ITTI
MSC_INIT(MSC_E_UTRAN, THREAD_MAX+TASK_MAX);
MSC_INIT(MSC_E_UTRAN, ADDED_QUEUES_MAX+TASK_MAX);
init_opt();
+1 -1
View File
@@ -488,7 +488,7 @@ int main( int argc, char **argv ) {
set_taus_seed (0);
cpuf=get_cpu_freq_GHz();
itti_init(TASK_MAX, THREAD_MAX, MESSAGES_ID_MAX, tasks_info, messages_info);
itti_init(TASK_MAX, tasks_info);
init_opt() ;
load_nrLDPClib();
+3 -3
View File
@@ -348,9 +348,9 @@ void init_main_gNB(void) {
LOG_I(PHY, "%s() RC.nb_nr_inst:%d RC.nrrrc:%p\n", __FUNCTION__, RC.nb_nr_inst, RC.nrrrc);
int gnb_id=0; // only 1 gnb per process, index 0 for now
RC.nrrrc[gnb_id] = (gNB_RRC_INST *)calloc(sizeof(gNB_RRC_INST),1);
MessageDef *msg_p = itti_alloc_new_message (TASK_GNB_APP, NRRRC_CONFIGURATION_REQ);
MessageDef *msg_p = itti_alloc_new_message (TASK_GNB_APP, 0, NRRRC_CONFIGURATION_REQ);
RCconfig_NRRRC(msg_p,gnb_id, RC.nrrrc[gnb_id]);
openair_rrc_gNB_configuration(GNB_INSTANCE_TO_MODULE_ID(ITTI_MSG_INSTANCE(msg_p)), &NRRRC_CONFIGURATION_REQ(msg_p));
openair_rrc_gNB_configuration(GNB_INSTANCE_TO_MODULE_ID(ITTI_MSG_DESTINATION_INSTANCE(msg_p)), &NRRRC_CONFIGURATION_REQ(msg_p));
//AssertFatal(itti_create_task(TASK_GNB_APP, gNB_app_task, NULL) >= 0, "");
AssertFatal(itti_create_task(TASK_RRC_GNB, rrc_gnb_task, NULL) >= 0, "");
//AssertFatal(itti_create_task(TASK_X2AP, x2ap_task, NULL) >= 0, "");
@@ -928,7 +928,7 @@ int main( int argc, char **argv ) {
get_common_options(SOFTMODEM_GNB_BIT );
AssertFatal(!CONFIG_ISFLAGSET(CONFIG_ABORT),"Getting configuration failed\n");
cpuf=get_cpu_freq_GHz();
itti_init(TASK_MAX, THREAD_MAX, MESSAGES_ID_MAX, tasks_info, messages_info);
itti_init(TASK_MAX, tasks_info);
set_taus_seed (0);
init_opt();
init_pdcp();
+29 -9
View File
@@ -504,11 +504,11 @@ int wake_eNB_rxtx(PHY_VARS_eNB *eNB, uint16_t sfn, uint16_t sf) {
// wake up TX for subframe n+sf_ahead
// lock the TX mutex and make sure the thread is ready
if (pthread_mutex_timedlock(&L1_proc->mutex,&wait) != 0) {
LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB RXTX thread %d (IC %d)\n", L1_proc->subframe_rx&1,L1_proc->instance_cnt );
exit_fun( "error locking mutex_rxtx" );
return(-1);
}
//if (pthread_mutex_timedlock(&L1_proc->mutex,&wait) != 0) {
// LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB RXTX thread %d (IC %d)\n", L1_proc->subframe_rx&1,L1_proc->instance_cnt );
// exit_fun( "error locking mutex_rxtx" );
// return(-1);
//}
{
static uint16_t old_sf = 0;
@@ -529,8 +529,31 @@ int wake_eNB_rxtx(PHY_VARS_eNB *eNB, uint16_t sfn, uint16_t sf) {
proc->frame_rx,
proc->subframe_rx);
}
// wake up TX for subframe n+sf_ahead
// lock the TX mutex and make sure the thread is ready
if (pthread_mutex_timedlock(&L1_proc->mutex,&wait) != 0) {
LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB RXTX thread %d (IC %d)\n", L1_proc->subframe_rx&1,L1_proc->instance_cnt );
//exit_fun( "error locking mutex_rxtx" );
return(-1);
}
static int busy_log_cnt=0;
if(L1_proc->instance_cnt < 0){
++L1_proc->instance_cnt;
if(busy_log_cnt!=0){
LOG_E(MAC,"RCC singal to rxtx frame %d subframe %d busy end %d (frame %d subframe %d)\n",L1_proc->frame_rx,L1_proc->subframe_rx,busy_log_cnt,proc->frame_rx,proc->subframe_rx);
}
busy_log_cnt=0;
}else{
if(busy_log_cnt==0){
LOG_E(MAC,"RCC singal to rxtx frame %d subframe %d busy %d (frame %d subframe %d)\n",L1_proc->frame_rx,L1_proc->subframe_rx,L1_proc->instance_cnt,proc->frame_rx,proc->subframe_rx);
}
pthread_mutex_unlock( &L1_proc->mutex );
busy_log_cnt++;
return(0);
}
pthread_mutex_unlock( &L1_proc->mutex );
++L1_proc->instance_cnt;
//LOG_D( PHY,"[VNF-subframe_ind] sfn/sf:%d:%d proc[frame_rx:%d subframe_rx:%d] L1_proc->instance_cnt_rxtx:%d \n", sfn, sf, proc->frame_rx, proc->subframe_rx, L1_proc->instance_cnt_rxtx);
// We have just received and processed the common part of a subframe, say n.
// TS_rx is the last received timestamp (start of 1st slot), TS_tx is the desired
@@ -553,9 +576,6 @@ int wake_eNB_rxtx(PHY_VARS_eNB *eNB, uint16_t sfn, uint16_t sf) {
return(-1);
}
//LOG_D(PHY,"%s() About to attempt pthread_mutex_unlock\n", __FUNCTION__);
pthread_mutex_unlock( &L1_proc->mutex );
//LOG_D(PHY,"%s() UNLOCKED pthread_mutex_unlock\n", __FUNCTION__);
return(0);
}
+11
View File
@@ -43,6 +43,8 @@
#include "SCHED_NR/fapi_nr_l1.h"
#include "nfapi_nr_interface.h"
#include "PHY/NR_REFSIG/ul_ref_seq_nr.h"
/*
extern uint32_t from_nrarfcn(int nr_bandP,uint32_t dl_nrarfcn);
extern openair0_config_t openair0_cfg[MAX_CARDS];
@@ -195,6 +197,10 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB,
}
}
/* Generate low PAPR type 1 sequences for PUSCH DMRS, these are used if transform precoding is enabled. */
generate_lowpapr_typ1_refsig_sequences(SHRT_MAX);
nr_init_csi_rs(gNB, 0); // TODO scramblingID currently hardcoded to 0, to be taken from higher layer parameter scramblingID when implemented
/// Transport init necessary for NR synchro
@@ -389,6 +395,11 @@ void phy_free_nr_gNB(PHY_VARS_gNB *gNB)
/*
for (UE_id = 0; UE_id < NUMBER_OF_UE_MAX; UE_id++) gNB->UE_stats_ptr[UE_id] = NULL;
*/
free_gnb_lowpapr_sequences();
}
//Adding nr_schedule_handler
@@ -786,33 +786,38 @@ int16_t lte_ul_freq_offset_estimation(LTE_DL_FRAME_PARMS *frame_parms,
Ravg[0]=0;
Ravg[1]=0;
int16_t iv, rv, phase_idx = 0;
__m128i avg128U1, avg128U2, R[3], mmtmpD0, mmtmpD1, mmtmpD2, mmtmpD3;
__m128i R[3], mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3;
__m128 avg128U1, avg128U2;
// round(tan((pi/4)*[1:1:N]/N)*pow2(15))
int16_t alpha[128] = {201, 402, 603, 804, 1006, 1207, 1408, 1610, 1811, 2013, 2215, 2417, 2619, 2822, 3024, 3227, 3431, 3634, 3838, 4042, 4246, 4450, 4655, 4861, 5066, 5272, 5479, 5686, 5893, 6101, 6309, 6518, 6727, 6937, 7147, 7358, 7570, 7782, 7995, 8208, 8422, 8637, 8852, 9068, 9285, 9503, 9721, 9940, 10160, 10381, 10603, 10825, 11049, 11273, 11498, 11725, 11952, 12180, 12410, 12640, 12872, 13104, 13338, 13573, 13809, 14046, 14285, 14525, 14766, 15009, 15253, 15498, 15745, 15993, 16243, 16494, 16747, 17001, 17257, 17515, 17774, 18035, 18298, 18563, 18829, 19098, 19368, 19640, 19915, 20191, 20470, 20750, 21033, 21318, 21605, 21895, 22187, 22481, 22778, 23078, 23380, 23685, 23992, 24302, 24615, 24931, 25250, 25572, 25897, 26226, 26557, 26892, 27230, 27572, 27917, 28266, 28618, 28975, 29335, 29699, 30067, 30440, 30817, 31198, 31583, 31973, 32368, 32767};
// compute log2_maxh (output_shift)
avg128U1 = _mm_setzero_si128();
avg128U2 = _mm_setzero_si128();
avg128U1 = _mm_setzero_ps();
avg128U2 = _mm_setzero_ps();
for (rb=0; rb<nb_rb; rb++) {
avg128U1 = _mm_add_epi32(avg128U1,_mm_madd_epi16(ul_ch1[0],ul_ch1[0]));
avg128U1 = _mm_add_epi32(avg128U1,_mm_madd_epi16(ul_ch1[1],ul_ch1[1]));
avg128U1 = _mm_add_epi32(avg128U1,_mm_madd_epi16(ul_ch1[2],ul_ch1[2]));
avg128U2 = _mm_add_epi32(avg128U2,_mm_madd_epi16(ul_ch2[0],ul_ch2[0]));
avg128U2 = _mm_add_epi32(avg128U2,_mm_madd_epi16(ul_ch2[1],ul_ch2[1]));
avg128U2 = _mm_add_epi32(avg128U2,_mm_madd_epi16(ul_ch2[2],ul_ch2[2]));
avg128U1 = _mm_add_ps(avg128U1,_mm_cvtepi32_ps(_mm_madd_epi16(ul_ch1[0],ul_ch1[0])));
avg128U1 = _mm_add_ps(avg128U1,_mm_cvtepi32_ps(_mm_madd_epi16(ul_ch1[1],ul_ch1[1])));
avg128U1 = _mm_add_ps(avg128U1,_mm_cvtepi32_ps(_mm_madd_epi16(ul_ch1[2],ul_ch1[2])));
avg128U2 = _mm_add_ps(avg128U2,_mm_cvtepi32_ps(_mm_madd_epi16(ul_ch2[0],ul_ch2[0])));
avg128U2 = _mm_add_ps(avg128U2,_mm_cvtepi32_ps(_mm_madd_epi16(ul_ch2[1],ul_ch2[1])));
avg128U2 = _mm_add_ps(avg128U2,_mm_cvtepi32_ps(_mm_madd_epi16(ul_ch2[2],ul_ch2[2])));
ul_ch1+=3;
ul_ch2+=3;
}
avg[0] = (((int *)&avg128U1)[0] +
((int *)&avg128U1)[1] +
((int *)&avg128U1)[2] +
((int *)&avg128U1)[3])/(nb_rb*12);
avg[1] = (((int *)&avg128U2)[0] +
((int *)&avg128U2)[1] +
((int *)&avg128U2)[2] +
((int *)&avg128U2)[3])/(nb_rb*12);
avg[0] = (int)( (((float*)&avg128U1)[0] +
((float*)&avg128U1)[1] +
((float*)&avg128U1)[2] +
((float*)&avg128U1)[3])/(float)(nb_rb*12) );
avg[1] = (int)( (((float*)&avg128U2)[0] +
((float*)&avg128U2)[1] +
((float*)&avg128U2)[2] +
((float*)&avg128U2)[3])/(float)(nb_rb*12) );
// msg("avg0 = %d, avg1 = %d\n",avg[0],avg[1]);
avg[0] = cmax(avg[0],avg[1]);
avg[1] = log2_approx(avg[0]);
+2
View File
@@ -2071,6 +2071,8 @@ void fill_ulsch(PHY_VARS_eNB *eNB,int UE_id,nfapi_ul_config_ulsch_pdu *ulsch_pdu
ulsch->harq_processes[harq_pid]->round++;
ulsch->harq_processes[harq_pid]->TBS = ulsch_pdu->ulsch_pdu_rel8.size<<3;
ulsch->harq_processes[harq_pid]->Msc_initial = 12*ulsch_pdu->ulsch_pdu_rel8.number_of_resource_blocks;
ulsch->harq_processes[harq_pid]->Or1 = 0;
ulsch->harq_processes[harq_pid]->Or2 = 0;
}
ulsch->rnti = ulsch_pdu->ulsch_pdu_rel8.rnti;

Some files were not shown because too many files have changed in this diff Show More