diff --git a/ci-scripts/Jenkinsfile-gitlab b/ci-scripts/Jenkinsfile-gitlab
index 7019d13124..92611670ba 100644
--- a/ci-scripts/Jenkinsfile-gitlab
+++ b/ci-scripts/Jenkinsfile-gitlab
@@ -237,7 +237,7 @@ pipeline {
sh "./ci-scripts/reportBuildLocally.sh --git-url ${GIT_URL} --job-name ${JOB_NAME} --build-id ${BUILD_ID} --trigger push --branch ${GIT_BRANCH} --commit ${GIT_COMMIT}"
}
if(fileExists('build_results.html')) {
- sh "sed -i -e 's#Build-ID: ${BUILD_ID}#Build-ID: ${BUILD_ID}#' build_results.html"
+ sh "sed -i -e 's#Build-ID: ${BUILD_ID}#Build-ID: ${BUILD_ID}#' build_results.html"
archiveArtifacts artifacts: 'build_results.html'
}
}
@@ -376,7 +376,7 @@ pipeline {
sh "./ci-scripts/reportTestLocally.sh --git-url ${GIT_URL} --job-name ${JOB_NAME} --build-id ${BUILD_ID} --trigger push --branch ${GIT_BRANCH} --commit ${GIT_COMMIT}"
}
if(fileExists('test_simulator_results.html')) {
- sh "sed -i -e 's#Build-ID: ${BUILD_ID}#Build-ID: ${BUILD_ID}#' test_simulator_results.html"
+ sh "sed -i -e 's#Build-ID: ${BUILD_ID}#Build-ID: ${BUILD_ID}#' test_simulator_results.html"
archiveArtifacts artifacts: 'test_simulator_results.html'
}
}
diff --git a/ci-scripts/reportTestLocally.sh b/ci-scripts/reportTestLocally.sh
index 9d7ce0ac40..569b62bc3d 100755
--- a/ci-scripts/reportTestLocally.sh
+++ b/ci-scripts/reportTestLocally.sh
@@ -317,117 +317,189 @@ then
echo "
Statistics | " >> ./test_simulator_results.html
echo " " >> ./test_simulator_results.html
- PING_TESTS=`ls $ARCHIVES_LOC/*ping*txt`
- for PING_CASE in $PING_TESTS
+ BW_CASES=(05 10 20)
+ for BW in ${BW_CASES[@]}
do
- echo " " >> ./test_simulator_results.html
- NAME=`echo $PING_CASE | sed -e "s#$ARCHIVES_LOC/##"`
- echo " | $NAME | " >> ./test_simulator_results.html
- CMD=`egrep "COMMAND IS" $PING_CASE | sed -e "s#COMMAND IS: ##"`
- echo " $CMD | " >> ./test_simulator_results.html
- FILE_COMPLETE=`egrep -c "ping statistics" $PING_CASE`
- if [ $FILE_COMPLETE -eq 0 ]
+ ENB_LOG=$ARCHIVES_LOC/enb_${BW}MHz.log
+ UE_LOG=`echo $ENB_LOG | sed -e "s#enb#ue#"`
+ if [ -f $ENB_LOG ] && [ -f $UE_LOG ]
then
- echo " KO | " >> ./test_simulator_results.html
+ NAME_ENB=`echo $ENB_LOG | sed -e "s#$ARCHIVES_LOC/##"`
+ NAME_UE=`echo $UE_LOG | sed -e "s#$ARCHIVES_LOC/##"`
+ echo "
" >> ./test_simulator_results.html
+ echo " | $NAME_ENB --- $NAME_UE | " >> ./test_simulator_results.html
echo " N/A | " >> ./test_simulator_results.html
- else
- NB_TR_PACKETS=`egrep "packets transmitted" $PING_CASE | sed -e "s# packets transmitted.*##"`
- NB_RC_PACKETS=`egrep "packets transmitted" $PING_CASE | sed -e "s#^.*packets transmitted, ##" -e "s# received,.*##"`
- if [ $NB_TR_PACKETS -eq $NB_RC_PACKETS ]
+ NB_ENB_GOT_SYNC=`egrep -c "got sync" $ENB_LOG`
+ NB_UE_GOT_SYNC=`egrep -c "got sync" $UE_LOG`
+ NB_ENB_SYNCED_WITH_UE=`egrep -c "got UE capabilities for UE" $ENB_LOG`
+ if [ $NB_ENB_GOT_SYNC -eq 1 ] && [ $NB_UE_GOT_SYNC -eq 2 ] && [ $NB_ENB_SYNCED_WITH_UE -eq 1 ]
then
echo " OK | " >> ./test_simulator_results.html
else
+ echo " OK | " >> ./test_simulator_results.html
+ fi
+ echo " " >> ./test_simulator_results.html
+ if [ $NB_ENB_GOT_SYNC -eq 1 ]
+ then
+ echo "- eNB --> got sync" >> ./test_simulator_results.html
+ else
+ echo "- eNB NEVER got sync" >> ./test_simulator_results.html
+ fi
+ if [ $NB_UE_GOT_SYNC -eq 2 ]
+ then
+ echo "- UE --> got sync" >> ./test_simulator_results.html
+ else
+ echo "- UE NEVER got sync" >> ./test_simulator_results.html
+ fi
+ if [ $NB_ENB_SYNCED_WITH_UE -eq 1 ]
+ then
+ echo "- UE attached to eNB" >> ./test_simulator_results.html
+ else
+ echo "- UE NEVER attached to eNB" >> ./test_simulator_results.html
+ fi
+ NB_SEGFAULT_ENB=`egrep -i -c "Segmentation Fault" $ENB_LOG`
+ if [ $NB_SEGFAULT_ENB -ne 0 ]
+ then
+ echo "- eNB --> Segmentation Fault" >> ./test_simulator_results.html
+ fi
+ NB_SEGFAULT_UE=`egrep -i -c "Segmentation Fault" $UE_LOG`
+ if [ $NB_SEGFAULT_UE -ne 0 ]
+ then
+ echo "- UE --> Segmentation Fault" >> ./test_simulator_results.html
+ fi
+ NB_ASSERTION_ENB=`egrep -i -c "Assertion" $ENB_LOG`
+ if [ $NB_ASSERTION_ENB -ne 0 ]
+ then
+ echo "- eNB --> Assertion" >> ./test_simulator_results.html
+ awk 'BEGIN{assertion=10}{if(assertion < 3){print " " $0; assertion++};if ($0 ~/Assertion/){print " " $0;assertion=1}}END{}' $ENB_LOG >> ./test_simulator_results.html
+ fi
+ NB_ASSERTION_UE=`egrep -i -c "Assertion" $UE_LOG`
+ if [ $NB_ASSERTION_UE -ne 0 ]
+ then
+ echo "- eNB --> Assertion" >> ./test_simulator_results.html
+ awk 'BEGIN{assertion=10}{if(assertion < 3){print " " $0; assertion++};if ($0 ~/Assertion/){print " " $0;assertion=1}}END{}' $UE_LOG >> ./test_simulator_results.html
+ fi
+ echo " | " >> ./test_simulator_results.html
+ echo "
" >> ./test_simulator_results.html
+ fi
+ PING_CASE=$ARCHIVES_LOC/${BW}MHz_ping_ue.txt
+ if [ -f $PING_CASE ]
+ then
+ echo " " >> ./test_simulator_results.html
+ NAME=`echo $PING_CASE | sed -e "s#$ARCHIVES_LOC/##"`
+ echo " | $NAME | " >> ./test_simulator_results.html
+ CMD=`egrep "COMMAND IS" $PING_CASE | sed -e "s#COMMAND IS: ##"`
+ echo " $CMD | " >> ./test_simulator_results.html
+ FILE_COMPLETE=`egrep -c "ping statistics" $PING_CASE`
+ if [ $FILE_COMPLETE -eq 0 ]
+ then
echo " KO | " >> ./test_simulator_results.html
+ echo " N/A | " >> ./test_simulator_results.html
+ else
+ NB_TR_PACKETS=`egrep "packets transmitted" $PING_CASE | sed -e "s# packets transmitted.*##"`
+ NB_RC_PACKETS=`egrep "packets transmitted" $PING_CASE | sed -e "s#^.*packets transmitted, ##" -e "s# received,.*##"`
+ if [ $NB_TR_PACKETS -eq $NB_RC_PACKETS ]
+ then
+ echo " OK | " >> ./test_simulator_results.html
+ else
+ echo " KO | " >> ./test_simulator_results.html
+ fi
+ echo " " >> ./test_simulator_results.html
+ echo " " >> ./test_simulator_results.html
+ STATS=`egrep "packets transmitted" $PING_CASE | sed -e "s#^.*received, ##" -e "s#, time.*##" -e "s# packet loss##"`
+ echo "Packet Loss : $STATS" >> ./test_simulator_results.html
+ RTTMIN=`egrep "rtt min" $PING_CASE | awk '{split($4,a,"/"); print a[1] " " $5}'`
+ echo "RTT Minimal : $RTTMIN" >> ./test_simulator_results.html
+ RTTAVG=`egrep "rtt min" $PING_CASE | awk '{split($4,a,"/"); print a[2] " " $5}'`
+ echo "RTT Average : $RTTAVG" >> ./test_simulator_results.html
+ RTTMAX=`egrep "rtt min" $PING_CASE | awk '{split($4,a,"/"); print a[3] " " $5}'`
+ echo "RTT Maximal : $RTTMAX" >> ./test_simulator_results.html
+ echo " " >> ./test_simulator_results.html
+ echo " | " >> ./test_simulator_results.html
+ fi
+ echo "
" >> ./test_simulator_results.html
+ fi
+
+ if [ -f $ARCHIVES_LOC/${BW}*iperf*dl*client*txt ]
+ then
+ IPERF_TESTS=`ls $ARCHIVES_LOC/${BW}*iperf*client*txt`
+ else
+ echo "There are no iperf files"
+ IPERF_TESTS=""
+ fi
+ for IPERF_CASE in $IPERF_TESTS
+ do
+ echo " " >> ./test_simulator_results.html
+ NAME=`echo $IPERF_CASE | sed -e "s#$ARCHIVES_LOC/##"`
+ echo " | $NAME | " >> ./test_simulator_results.html
+ CMD=`egrep "COMMAND IS" $IPERF_CASE | sed -e "s#COMMAND IS: ##"`
+ echo " $CMD | " >> ./test_simulator_results.html
+ REQ_BITRATE=`echo $CMD | sed -e "s#^.*-b ##" -e "s#-i 1.*##"`
+ if [[ $REQ_BITRATE =~ .*K.* ]]
+ then
+ REQ_BITRATE=`echo $REQ_BITRATE | sed -e "s#K##"`
+ FLOAT_REQ_BITRATE=`echo "$REQ_BITRATE * 1000.0" | bc -l`
+ fi
+ if [[ $REQ_BITRATE =~ .*M.* ]]
+ then
+ REQ_BITRATE=`echo $REQ_BITRATE | sed -e "s#M##"`
+ FLOAT_REQ_BITRATE=`echo "$REQ_BITRATE * 1000000.0" | bc -l`
+ fi
+ if [[ $REQ_BITRATE =~ .*G.* ]]
+ then
+ REQ_BITRATE=`echo $REQ_BITRATE | sed -e "s#G##"`
+ FLOAT_REQ_BITRATE=`echo "$REQ_BITRATE * 1000000000.0" | bc -l`
+ fi
+ FILE_COMPLETE=`egrep -c "Server Report" $IPERF_CASE`
+ if [ $FILE_COMPLETE -eq 0 ]
+ then
+ echo " KO | " >> ./test_simulator_results.html
+ SERVER_FILE=`echo $IPERF_CASE | sed -e "s#client#server#"`
+ FLOAT_EFF_BITRATE=`grep --color=never sec $SERVER_FILE | sed -e "s#^.*Bytes *##" -e "s#sec *.*#sec#" | awk 'BEGIN{s=0;n=0}{n++;if ($2 ~/Mbits/){a = $1 * 1000000};if ($2 ~/Kbits/){a = $1 * 1000};s=s+a}END{br=s/n; printf "%.0f", br}'`
+ EFFECTIVE_BITRATE=`grep --color=never sec $SERVER_FILE | sed -e "s#^.*Bytes *##" -e "s#sec *.*#sec#" | awk 'BEGIN{s=0;n=0}{n++;if ($2 ~/Mbits/){a = $1 * 1000000};if ($2 ~/Kbits/){a = $1 * 1000};s=s+a}END{br=s/n; if(br>1000000){printf "%.2f MBits/sec", br/1000000}}'`
+ PERF=`echo "100 * $FLOAT_EFF_BITRATE / $FLOAT_REQ_BITRATE" | bc -l | awk '{printf "%.2f", $0}'`
+ JITTER=`grep --color=never sec $SERVER_FILE | sed -e "s#^.*/sec *##" -e "s# *ms.*##" | awk 'BEGIN{s=0;n=0}{n++;s+=$1}END{jitter=s/n; printf "%.3f ms", jitter}'`
+ PACKETLOSS_NOSIGN=`grep --color=never sec $SERVER_FILE | sed -e "s#^.*(##" -e "s#%.*##" | awk 'BEGIN{s=0;n=0}{n++;s+=$1}END{per=s/n; printf "%.1f", per}'`
+ PACKETLOSS=`echo "${PACKETLOSS_NOSIGN}%"`
+ else
+ EFFECTIVE_BITRATE=`tail -n3 $IPERF_CASE | egrep "Mbits/sec" | sed -e "s#^.*MBytes *##" -e "s#sec.*#sec#"`
+ if [[ $EFFECTIVE_BITRATE =~ .*Kbits/sec.* ]]
+ then
+ EFFECTIVE_BITRATE=`echo $EFFECTIVE_BITRATE | sed -e "s# *Kbits/sec.*##"`
+ FLOAT_EFF_BITRATE=`echo "$EFFECTIVE_BITRATE * 1000" | bc -l`
+ fi
+ if [[ $EFFECTIVE_BITRATE =~ .*Mbits/sec.* ]]
+ then
+ EFFECTIVE_BITRATE=`echo $EFFECTIVE_BITRATE | sed -e "s# *Mbits/sec.*##"`
+ FLOAT_EFF_BITRATE=`echo "$EFFECTIVE_BITRATE * 1000000" | bc -l`
+ fi
+ if [[ $EFFECTIVE_BITRATE =~ .*Gbits/sec.* ]]
+ then
+ EFFECTIVE_BITRATE=`echo $EFFECTIVE_BITRATE | sed -e "s# *Gbits/sec.*##"`
+ FLOAT_EFF_BITRATE=`echo "$EFFECTIVE_BITRATE * 1000000000" | bc -l`
+ fi
+ PERF=`echo "100 * $FLOAT_EFF_BITRATE / $FLOAT_REQ_BITRATE" | bc -l | awk '{printf "%.2f", $0}'`
+ PERF_INT=`echo "100 * $FLOAT_EFF_BITRATE / $FLOAT_REQ_BITRATE" | bc -l | awk '{printf "%.0f", $0}'`
+ if [[ $PERF_INT -lt 90 ]]
+ then
+ echo " KO | " >> ./test_simulator_results.html
+ else
+ echo " OK | " >> ./test_simulator_results.html
+ fi
+ EFFECTIVE_BITRATE=`tail -n3 $IPERF_CASE | egrep "Mbits/sec" | sed -e "s#^.*MBytes *##" -e "s#sec.*#sec#"`
+ JITTER=`tail -n3 $IPERF_CASE | egrep "Mbits/sec" | sed -e "s#^.*Mbits/sec *##" -e "s#ms.*#ms#"`
+ PACKETLOSS=`tail -n3 $IPERF_CASE | egrep "Mbits/sec" | sed -e "s#^.*(##" -e "s#).*##"`
fi
echo " " >> ./test_simulator_results.html
echo " " >> ./test_simulator_results.html
- STATS=`egrep "packets transmitted" $PING_CASE | sed -e "s#^.*received, ##" -e "s#, time.*##" -e "s# packet loss##"`
- echo "Packet Loss : $STATS" >> ./test_simulator_results.html
- RTTMIN=`egrep "rtt min" $PING_CASE | awk '{split($4,a,"/"); print a[1] " " $5}'`
- echo "RTT Minimal : $RTTMIN" >> ./test_simulator_results.html
- RTTAVG=`egrep "rtt min" $PING_CASE | awk '{split($4,a,"/"); print a[2] " " $5}'`
- echo "RTT Average : $RTTAVG" >> ./test_simulator_results.html
- RTTMAX=`egrep "rtt min" $PING_CASE | awk '{split($4,a,"/"); print a[3] " " $5}'`
- echo "RTT Maximal : $RTTMAX" >> ./test_simulator_results.html
+ echo "Bitrate : $EFFECTIVE_BITRATE" >> ./test_simulator_results.html
+ echo "Bitrate Perf : $PERF %" >> ./test_simulator_results.html
+ echo "Jitter : $JITTER" >> ./test_simulator_results.html
+ echo "Packet Loss : $PACKETLOSS" >> ./test_simulator_results.html
echo " " >> ./test_simulator_results.html
echo " | " >> ./test_simulator_results.html
- fi
- echo "
" >> ./test_simulator_results.html
- done
-
- IPERF_TESTS=`ls $ARCHIVES_LOC/*iperf*client*txt`
- for IPERF_CASE in $IPERF_TESTS
- do
- echo " " >> ./test_simulator_results.html
- NAME=`echo $IPERF_CASE | sed -e "s#$ARCHIVES_LOC/##"`
- echo " | $NAME | " >> ./test_simulator_results.html
- CMD=`egrep "COMMAND IS" $IPERF_CASE | sed -e "s#COMMAND IS: ##"`
- echo " $CMD | " >> ./test_simulator_results.html
- REQ_BITRATE=`echo $CMD | sed -e "s#^.*-b ##" -e "s#-i 1.*##"`
- if [[ $REQ_BITRATE =~ .*K.* ]]
- then
- REQ_BITRATE=`echo $REQ_BITRATE | sed -e "s#K##"`
- FLOAT_REQ_BITRATE=`echo "$REQ_BITRATE * 1000.0" | bc -l`
- fi
- if [[ $REQ_BITRATE =~ .*M.* ]]
- then
- REQ_BITRATE=`echo $REQ_BITRATE | sed -e "s#M##"`
- FLOAT_REQ_BITRATE=`echo "$REQ_BITRATE * 1000000.0" | bc -l`
- fi
- if [[ $REQ_BITRATE =~ .*G.* ]]
- then
- REQ_BITRATE=`echo $REQ_BITRATE | sed -e "s#G##"`
- FLOAT_REQ_BITRATE=`echo "$REQ_BITRATE * 1000000000.0" | bc -l`
- fi
- FILE_COMPLETE=`egrep -c "Server Report" $IPERF_CASE`
- if [ $FILE_COMPLETE -eq 0 ]
- then
- echo " KO | " >> ./test_simulator_results.html
- SERVER_FILE=`echo $IPERF_CASE | sed -e "s#client#server#"`
- FLOAT_EFF_BITRATE=`grep --color=never sec $SERVER_FILE | sed -e "s#^.*Bytes *##" -e "s#sec *.*#sec#" | awk 'BEGIN{s=0;n=0}{n++;if ($2 ~/Mbits/){a = $1 * 1000000};if ($2 ~/Kbits/){a = $1 * 1000};s=s+a}END{br=s/n; printf "%.0f", br}'`
- EFFECTIVE_BITRATE=`grep --color=never sec $SERVER_FILE | sed -e "s#^.*Bytes *##" -e "s#sec *.*#sec#" | awk 'BEGIN{s=0;n=0}{n++;if ($2 ~/Mbits/){a = $1 * 1000000};if ($2 ~/Kbits/){a = $1 * 1000};s=s+a}END{br=s/n; if(br>1000000){printf "%.2f MBits/sec", br/1000000}}'`
- PERF=`echo "100 * $FLOAT_EFF_BITRATE / $FLOAT_REQ_BITRATE" | bc -l | awk '{printf "%.2f", $0}'`
- JITTER=`grep --color=never sec $SERVER_FILE | sed -e "s#^.*/sec *##" -e "s# *ms.*##" | awk 'BEGIN{s=0;n=0}{n++;s+=$1}END{jitter=s/n; printf "%.3f ms", jitter}'`
- PACKETLOSS_NOSIGN=`grep --color=never sec $SERVER_FILE | sed -e "s#^.*(##" -e "s#%.*##" | awk 'BEGIN{s=0;n=0}{n++;s+=$1}END{per=s/n; printf "%.1f", per}'`
- PACKETLOSS=`echo "${PACKETLOSS_NOSIGN}%"`
- else
- EFFECTIVE_BITRATE=`tail -n3 $IPERF_CASE | egrep "Mbits/sec" | sed -e "s#^.*MBytes *##" -e "s#sec.*#sec#"`
- if [[ $EFFECTIVE_BITRATE =~ .*Kbits/sec.* ]]
- then
- EFFECTIVE_BITRATE=`echo $EFFECTIVE_BITRATE | sed -e "s# *Kbits/sec.*##"`
- FLOAT_EFF_BITRATE=`echo "$EFFECTIVE_BITRATE * 1000" | bc -l`
- fi
- if [[ $EFFECTIVE_BITRATE =~ .*Mbits/sec.* ]]
- then
- EFFECTIVE_BITRATE=`echo $EFFECTIVE_BITRATE | sed -e "s# *Mbits/sec.*##"`
- FLOAT_EFF_BITRATE=`echo "$EFFECTIVE_BITRATE * 1000000" | bc -l`
- fi
- if [[ $EFFECTIVE_BITRATE =~ .*Gbits/sec.* ]]
- then
- EFFECTIVE_BITRATE=`echo $EFFECTIVE_BITRATE | sed -e "s# *Gbits/sec.*##"`
- FLOAT_EFF_BITRATE=`echo "$EFFECTIVE_BITRATE * 1000000000" | bc -l`
- fi
- PERF=`echo "100 * $FLOAT_EFF_BITRATE / $FLOAT_REQ_BITRATE" | bc -l | awk '{printf "%.2f", $0}'`
- PERF_INT=`echo "100 * $FLOAT_EFF_BITRATE / $FLOAT_REQ_BITRATE" | bc -l | awk '{printf "%.0f", $0}'`
- if [[ $PERF_INT -lt 90 ]]
- then
- echo " KO | " >> ./test_simulator_results.html
- else
- echo " OK | " >> ./test_simulator_results.html
- fi
- EFFECTIVE_BITRATE=`tail -n3 $IPERF_CASE | egrep "Mbits/sec" | sed -e "s#^.*MBytes *##" -e "s#sec.*#sec#"`
- JITTER=`tail -n3 $IPERF_CASE | egrep "Mbits/sec" | sed -e "s#^.*Mbits/sec *##" -e "s#ms.*#ms#"`
- PACKETLOSS=`tail -n3 $IPERF_CASE | egrep "Mbits/sec" | sed -e "s#^.*(##" -e "s#).*##"`
- fi
- echo " " >> ./test_simulator_results.html
- echo " " >> ./test_simulator_results.html
- echo "Bitrate : $EFFECTIVE_BITRATE" >> ./test_simulator_results.html
- echo "Bitrate Perf : $PERF %" >> ./test_simulator_results.html
- echo "Jitter : $JITTER" >> ./test_simulator_results.html
- echo "Packet Loss : $PACKETLOSS" >> ./test_simulator_results.html
- echo " " >> ./test_simulator_results.html
- echo " | " >> ./test_simulator_results.html
- echo "
" >> ./test_simulator_results.html
+ echo " " >> ./test_simulator_results.html
+ done
done
echo " " >> ./test_simulator_results.html
diff --git a/ci-scripts/runTestOnVM.sh b/ci-scripts/runTestOnVM.sh
index 6abdf35507..ea536b749a 100755
--- a/ci-scripts/runTestOnVM.sh
+++ b/ci-scripts/runTestOnVM.sh
@@ -89,13 +89,13 @@ function start_basic_sim_enb {
echo "grep N_RB_DL ci-lte-basic-sim.conf | sed -e 's#N_RB_DL.*=#N_RB_DL =#'" >> $1
echo "echo \"cd /home/ubuntu/tmp/cmake_targets/basic_simulator/enb/\"" >> $1
echo "cd /home/ubuntu/tmp/cmake_targets/basic_simulator/enb/" >> $1
- echo "echo \"./lte-softmodem -O /home/ubuntu/tmp/ci-scripts/conf_files/ci-lte-basic-sim.conf\" > ./my-lte-softmodem-run.sh " >> $1
+ echo "echo \"ulimit -c unlimited && ./lte-softmodem -O /home/ubuntu/tmp/ci-scripts/conf_files/ci-lte-basic-sim.conf\" > ./my-lte-softmodem-run.sh " >> $1
echo "chmod 775 ./my-lte-softmodem-run.sh" >> $1
echo "cat ./my-lte-softmodem-run.sh" >> $1
echo "sudo -E daemon --inherit --unsafe --name=enb_daemon --chdir=/home/ubuntu/tmp/cmake_targets/basic_simulator/enb -o /home/ubuntu/tmp/cmake_targets/log/$LOC_LOG_FILE ./my-lte-softmodem-run.sh" >> $1
ssh -o StrictHostKeyChecking=no ubuntu@$LOC_VM_IP_ADDR < $1
- sleep 60
+ sleep 10
rm $1
}
@@ -114,7 +114,7 @@ function start_basic_sim_ue {
local i="0"
echo "ifconfig oip1 | egrep -c \"inet addr\"" > $1
- while [ $i -lt 40 ]
+ while [ $i -lt 10 ]
do
sleep 5
CONNECTED=`ssh -o StrictHostKeyChecking=no ubuntu@$2 < $1`
@@ -237,16 +237,51 @@ function check_iperf {
}
function terminate_enb_ue_basic_sim {
- echo "echo \"sudo daemon --name=enb_daemon --stop\"" > $1
- echo "sudo daemon --name=enb_daemon --stop" >> $1
- echo "echo \"sudo daemon --name=ue_daemon --stop\"" >> $1
- echo "sudo daemon --name=ue_daemon --stop" >> $1
- echo "echo \"sudo killall --signal SIGKILL lte-softmodem\"" >> $1
- echo "sudo killall --signal SIGKILL lte-softmodem" >> $1
+ echo "NB_OAI_PROCESSES=\`ps -aux | grep modem | grep -v grep | grep -c softmodem\`" > $1
+ echo "if [ \$NB_OAI_PROCESSES -ne 0 ]; then echo \"sudo daemon --name=enb_daemon --stop\"; fi" >> $1
+ echo "if [ \$NB_OAI_PROCESSES -ne 0 ]; then sudo daemon --name=enb_daemon --stop; fi" >> $1
+ echo "if [ \$NB_OAI_PROCESSES -ne 0 ]; then echo \"sudo daemon --name=ue_daemon --stop\"; fi" >> $1
+ echo "if [ \$NB_OAI_PROCESSES -ne 0 ]; then sudo daemon --name=ue_daemon --stop; fi" >> $1
+ echo "if [ \$NB_OAI_PROCESSES -ne 0 ]; then sleep 5; fi" >> $1
+ echo "echo \"ps -aux | grep softmodem\"" >> $1
+ echo "ps -aux | grep softmodem | grep -v grep" >> $1
+ echo "NB_OAI_PROCESSES=\`ps -aux | grep modem | grep -v grep | grep -c softmodem\`" >> $1
+ echo "if [ \$NB_OAI_PROCESSES -ne 0 ]; then echo \"sudo killall --signal SIGINT lte-softmodem\"; fi" >> $1
+ echo "if [ \$NB_OAI_PROCESSES -ne 0 ]; then sudo killall --signal SIGINT lte-softmodem; fi" >> $1
+ echo "if [ \$NB_OAI_PROCESSES -ne 0 ]; then sleep 5; fi" >> $1
+ echo "echo \"ps -aux | grep softmodem\"" >> $1
+ echo "ps -aux | grep softmodem | grep -v grep" >> $1
+ echo "NB_OAI_PROCESSES=\`ps -aux | grep modem | grep -v grep | grep -c softmodem\`" >> $1
+ echo "if [ \$NB_OAI_PROCESSES -ne 0 ]; then echo \"sudo killall --signal SIGKILL lte-softmodem\"; fi" >> $1
+ echo "if [ \$NB_OAI_PROCESSES -ne 0 ]; then sudo killall --signal SIGKILL lte-softmodem; fi" >> $1
+ echo "if [ \$NB_OAI_PROCESSES -ne 0 ]; then echo \"sudo killall --signal SIGKILL lte-uesoftmodem\"; fi" >> $1
+ echo "if [ \$NB_OAI_PROCESSES -ne 0 ]; then sudo killall --signal SIGKILL lte-uesoftmodem; fi" >> $1
+ echo "if [ \$NB_OAI_PROCESSES -ne 0 ]; then sleep 5; fi" >> $1
+ echo "echo \"ps -aux | grep softmodem\"" >> $1
+ echo "ps -aux | grep softmodem | grep -v grep" >> $1
ssh -o StrictHostKeyChecking=no ubuntu@$2 < $1
rm -f $1
}
+function recover_core_dump {
+ local IS_SEG_FAULT=`egrep -ic "segmentation fault" $3`
+ if [ $IS_SEG_FAULT -ne 0 ]
+ then
+ local TC=`echo $3 | sed -e "s#^.*enb_##" -e "s#Hz.*#Hz#"`
+ echo "Segmentation fault detected on enb -> recovering core dump"
+ echo "cd /home/ubuntu/tmp/cmake_targets/basic_simulator/enb" > $1
+ echo "cp /home/ubuntu/tmp/ci-scripts/conf_files/ci-lte-basic-sim.conf ." >> $1
+ echo "sync" >> $1
+ echo "sudo tar -cjhf basic-simulator-enb-core-${TC}.bz2 core lte-softmodem *.so ci-lte-basic-sim.conf my-lte-softmodem-run.sh" >> $1
+ echo "sudo rm core" >> $1
+ echo "rm ci-lte-basic-sim.conf" >> $1
+ echo "sync" >> $1
+ ssh -o StrictHostKeyChecking=no ubuntu@$2 < $1
+ scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/basic_simulator/enb/basic-simulator-enb-core-${TC}.bz2 $4
+ rm -f $1
+ fi
+}
+
function terminate_ltebox_epc {
echo "echo \"cd /opt/ltebox/tools\"" > $1
echo "cd /opt/ltebox/tools" >> $1
@@ -675,6 +710,7 @@ then
terminate_enb_ue_basic_sim $VM_CMDS $VM_IP_ADDR
scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_ENB_LOG_FILE $ARCHIVES_LOC
scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_UE_LOG_FILE $ARCHIVES_LOC
+ recover_core_dump $VM_CMDS $VM_IP_ADDR $ARCHIVES_LOC/$CURRENT_ENB_LOG_FILE $ARCHIVES_LOC
terminate_ltebox_epc $EPC_VM_CMDS $EPC_VM_IP_ADDR
exit -1
fi
@@ -711,6 +747,7 @@ then
terminate_enb_ue_basic_sim $VM_CMDS $VM_IP_ADDR
scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_ENB_LOG_FILE $ARCHIVES_LOC
scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_UE_LOG_FILE $ARCHIVES_LOC
+ recover_core_dump $VM_CMDS $VM_IP_ADDR $ARCHIVES_LOC/$CURRENT_ENB_LOG_FILE $ARCHIVES_LOC
echo "############################################################"
echo "Starting the eNB at 10MHz"
@@ -729,6 +766,7 @@ then
terminate_enb_ue_basic_sim $VM_CMDS $VM_IP_ADDR
scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_ENB_LOG_FILE $ARCHIVES_LOC
scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_UE_LOG_FILE $ARCHIVES_LOC
+ recover_core_dump $VM_CMDS $VM_IP_ADDR $ARCHIVES_LOC/$CURRENT_ENB_LOG_FILE $ARCHIVES_LOC
terminate_ltebox_epc $EPC_VM_CMDS $EPC_VM_IP_ADDR
exit -1
fi
@@ -765,6 +803,7 @@ then
terminate_enb_ue_basic_sim $VM_CMDS $VM_IP_ADDR
scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_ENB_LOG_FILE $ARCHIVES_LOC
scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_UE_LOG_FILE $ARCHIVES_LOC
+ recover_core_dump $VM_CMDS $VM_IP_ADDR $ARCHIVES_LOC/$CURRENT_ENB_LOG_FILE $ARCHIVES_LOC
echo "############################################################"
echo "Starting the eNB at 20MHz"
@@ -783,6 +822,7 @@ then
terminate_enb_ue_basic_sim $VM_CMDS $VM_IP_ADDR
scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_ENB_LOG_FILE $ARCHIVES_LOC
scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_UE_LOG_FILE $ARCHIVES_LOC
+ recover_core_dump $VM_CMDS $VM_IP_ADDR $ARCHIVES_LOC/$CURRENT_ENB_LOG_FILE $ARCHIVES_LOC
terminate_ltebox_epc $EPC_VM_CMDS $EPC_VM_IP_ADDR
exit -1
fi
@@ -819,6 +859,7 @@ then
terminate_enb_ue_basic_sim $VM_CMDS $VM_IP_ADDR
scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_ENB_LOG_FILE $ARCHIVES_LOC
scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_UE_LOG_FILE $ARCHIVES_LOC
+ recover_core_dump $VM_CMDS $VM_IP_ADDR $ARCHIVES_LOC/$CURRENT_ENB_LOG_FILE $ARCHIVES_LOC
echo "############################################################"
echo "Terminate EPC"
diff --git a/ci-scripts/xml_files/enb_usrpb210_band40.xml b/ci-scripts/xml_files/enb_usrpb210_band40.xml
index 5b54d9b8df..e364d9acd4 100644
--- a/ci-scripts/xml_files/enb_usrpb210_band40.xml
+++ b/ci-scripts/xml_files/enb_usrpb210_band40.xml
@@ -32,13 +32,13 @@
Initialize_eNB
- Initialize eNB (FDD/Band40/10MHz)
+ Initialize eNB (FDD/Band40/5MHz)
-O ci-scripts/conf_files/enb.band40.tm1.25PRB.FairScheduler.usrpb210.conf --codingw --fepw
Initialize_eNB
- Initialize eNB (TDD/Band40/5MHz/info)
+ Initialize eNB (TDD/Band40/10MHz/info)
-O ci-scripts/conf_files/enb.band40.tm1.50PRB.FairScheduler.usrpb210.conf --codingw --fepw
diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt
index e92c822de3..5bf07dae01 100644
--- a/cmake_targets/CMakeLists.txt
+++ b/cmake_targets/CMakeLists.txt
@@ -170,11 +170,12 @@ set(CMAKE_C_FLAGS
"${CMAKE_C_FLAGS} ${C_FLAGS_PROCESSOR} -std=gnu99 -Wall -Wstrict-prototypes -fno-strict-aliasing -rdynamic -funroll-loops -Wno-packed-bitfield-compat -fPIC ")
# add autotools definitions that were maybe used!
set(CMAKE_C_FLAGS
- "${CMAKE_C_FLAGS} -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_FCNTL_H=1 -DHAVE_ARPA_INET_H=1 -DHAVE_SYS_TIME_H=1 -DHAVE_SYS_SOCKET_H=1 -DHAVE_STRERROR=1 -DHAVE_SOCKET=1 -DHAVE_MEMSET=1 -DHAVE_GETTIMEOFDAY=1 -DHAVE_STDLIB_H=1 -DHAVE_MALLOC=1 -DHAVE_LIBSCTP -DASN_DISABLE_OER_SUPPORT -D'MAKE_VERSION(a,b,c)=((a)*256+(b)*16+c)'"
+ "${CMAKE_C_FLAGS} -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_FCNTL_H=1 -DHAVE_ARPA_INET_H=1 -DHAVE_SYS_TIME_H=1 -DHAVE_SYS_SOCKET_H=1 -DHAVE_STRERROR=1 -DHAVE_SOCKET=1 -DHAVE_MEMSET=1 -DHAVE_GETTIMEOFDAY=1 -DHAVE_STDLIB_H=1 -DHAVE_MALLOC=1 -DHAVE_LIBSCTP -D'MAKE_VERSION(a,b,c)=((a)*256+(b)*16+c)'"
)
set(CMAKE_CXX_FLAGS
- "${CMAKE_CXX_FLAGS} ${C_FLAGS_PROCESSOR} -std=c++11 "
+ "${CMAKE_CXX_FLAGS} ${C_FLAGS_PROCESSOR} -std=c++11 -D'MAKE_VERSION(a,b,c)=((a)*256+(b)*16+c)'"
)
+add_definitions("-DASN_DISABLE_OER_SUPPORT")
#########################
@@ -256,16 +257,13 @@ add_boolean_option(BASIC_SIMULATOR False "Has to be True when building the b
add_boolean_option(DEBUG_CONSOLE False "makes debugging easier, disables stdout/stderr buffering")
add_boolean_option(ENABLE_ITTI True "ITTI is internal messaging, should remain enabled for most targets")
-set (ITTI_DIR ${OPENAIR_DIR}/common/utils/itti)
+set (OCP_ITTI ${OPENAIR_DIR}/common/utils/ocp_itti)
if (${ENABLE_ITTI})
add_library(ITTI
# add .h files if depend on (this one is generated)
- ${ITTI_DIR}/intertask_interface.h
- ${ITTI_DIR}/intertask_interface.c
- ${ITTI_DIR}/backtrace.c
- ${ITTI_DIR}/memory_pools.c
- ${ITTI_DIR}/signals.c
- ${ITTI_DIR}/timer.c
+ ${OCP_ITTI}/intertask_interface.cpp
+ ${OPENAIR_DIR}/common/utils/backtrace.c
+ ${OPENAIR_DIR}/common/utils/memory_pools.c
)
set(ITTI_LIB ITTI)
set(GTPU_need_ITTI ${OPENAIR3_DIR}/GTPV1-U/gtpv1u_eNB.c)
@@ -754,11 +752,14 @@ include_directories("${OPENAIR2_DIR}/LAYER2/PDCP_v10.1.0")
include_directories("${OPENAIR2_DIR}/RRC/LTE/MESSAGES")
include_directories("${OPENAIR2_DIR}/RRC/LTE")
include_directories("${OPENAIR_DIR}/common/utils")
-include_directories("${OPENAIR_DIR}/common/utils/itti")
+include_directories("${OPENAIR_DIR}/common/utils/ocp_itti")
include_directories("${OPENAIR3_DIR}/NAS/COMMON")
include_directories("${OPENAIR3_DIR}/NAS/COMMON/API/NETWORK")
include_directories("${OPENAIR3_DIR}/NAS/COMMON/EMM/MSG")
include_directories("${OPENAIR3_DIR}/NAS/COMMON/ESM/MSG")
+include_directories("${OPENAIR3_DIR}/NAS/UE/ESM")
+include_directories("${OPENAIR3_DIR}/NAS/UE/EMM")
+include_directories("${OPENAIR3_DIR}/NAS/UE/API/USER")
include_directories("${OPENAIR3_DIR}/NAS/COMMON/IES")
include_directories("${OPENAIR3_DIR}/NAS/COMMON/UTIL")
include_directories("${OPENAIR3_DIR}/SECU")
@@ -870,6 +871,7 @@ add_library(FLEXRAN_AGENT
${OPENAIR2_DIR}/ENB_APP/flexran_agent_net_comm.c
${OPENAIR2_DIR}/ENB_APP/flexran_agent_async.c
${OPENAIR2_DIR}/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac_internal.c
+ ${OPENAIR2_DIR}/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac_slice_verification.c
)
set(FLEXRAN_AGENT_LIB FLEXRAN_AGENT)
#include_directories(${OPENAIR2_DIR}/ENB_APP)
@@ -1115,6 +1117,7 @@ set(PHY_SRC
# actual source
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pss.c
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/sss.c
+ ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/sss_gen.c
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pilots.c
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pilots_mbsfn.c
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dlsch_coding.c
@@ -1144,6 +1147,7 @@ set(PHY_SRC_RU
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/if5_tools.c
${OPENAIR1_DIR}/PHY/MODULATION/slot_fep_ul.c
${OPENAIR1_DIR}/PHY/MODULATION/ul_7_5_kHz.c
+ ${OPENAIR1_DIR}/PHY/MODULATION/gen_75KHz.cpp
${OPENAIR1_DIR}/PHY/MODULATION/beamforming.c
${OPENAIR1_DIR}/PHY/MODULATION/compute_bf_weights.c
${OPENAIR1_DIR}/PHY/INIT/lte_init_ru.c
@@ -1154,6 +1158,7 @@ set(PHY_SRC_RU
set(PHY_SRC_UE
# actual source
${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/sss_ue.c
+ ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/sss_gen.c
${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c
${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/dlsch_llr_computation.c
${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/linear_preprocessing_rec.c
diff --git a/common/config/config_cmdline.c b/common/config/config_cmdline.c
index c9b1c32378..3bd41cf6cc 100644
--- a/common/config/config_cmdline.c
+++ b/common/config/config_cmdline.c
@@ -35,6 +35,7 @@
#include
#include
#include
+#include
#include "config_userapi.h"
@@ -141,25 +142,16 @@ char defbool[2]="1";
int config_process_cmdline(paramdef_t *cfgoptions,int numoptions, char *prefix)
{
-
-
-int c = config_get_if()->argc;
-int i,j;
-char *pp;
-char *cfgpath;
+ int c = config_get_if()->argc;
+ int i,j;
+ char *pp;
+ char cfgpath[512]; /* 512 should be enough for the sprintf below */
- j = (prefix ==NULL) ? 0 : strlen(prefix);
- cfgpath = malloc( j + MAX_OPTNAME_SIZE +1);
- if (cfgpath == NULL) {
- fprintf(stderr,"[CONFIG] %s %i malloc error, %s\n", __FILE__, __LINE__,strerror(errno));
- return -1;
- }
-
j = 0;
i = 0;
while (c > 0 ) {
char *oneargv = strdup(config_get_if()->argv[i]); /* we use strtok_r which modifies its string paramater, and we don't want argv to be modified */
-/* first check help options, either --help, -h or --help_ */
+ /* first check help options, either --help, -h or --help_ */
if (strncmp(oneargv, "-h",2) == 0 || strncmp(oneargv, "--help",6) == 0 ) {
char *tokctx;
pp=strtok_r(oneargv, "_",&tokctx);
@@ -182,7 +174,7 @@ char *cfgpath;
}
}
-/* now, check for non help options */
+ /* now, check for non help options */
if (oneargv[0] == '-') {
for(int n=0;n
#include
+#include
#include "config_userapi.h"
-extern void exit_fun(const char* s); // lte-softmodem clean exit function
configmodule_interface_t *config_get_if(void)
diff --git a/common/config/config_userapi.h b/common/config/config_userapi.h
index 217310db36..25306b8778 100644
--- a/common/config/config_userapi.h
+++ b/common/config/config_userapi.h
@@ -38,8 +38,6 @@
extern "C"
{
#endif
-/* get rid of "exit_fun undeclared" warning */
-extern void exit_fun(const char* s);
#define CONFIG_GETSOURCE ( (config_get_if()==NULL) ? NULL : config_get_if()->cfgmode )
#define CONFIG_GETNUMP ( (config_get_if()==NULL) ? 0 : config_get_if()->num_cfgP )
diff --git a/common/config/libconfig/config_libconfig.c b/common/config/libconfig/config_libconfig.c
index f192fd2dc5..cb6fa46293 100644
--- a/common/config/libconfig/config_libconfig.c
+++ b/common/config/libconfig/config_libconfig.c
@@ -91,8 +91,6 @@ int read_intarray(paramdef_t *cfgoptions,config_setting_t *setting, char *cfgpat
int config_libconfig_get(paramdef_t *cfgoptions,int numoptions, char *prefix )
{
-
-
config_setting_t *setting;
char *str;
int i,u;
@@ -103,15 +101,9 @@ int config_libconfig_get(paramdef_t *cfgoptions,int numoptions, char *prefix )
int notfound;
int defval;
int fatalerror=0;
- char *cfgpath; /* listname.[listindex].paramname */
int numdefvals=0;
-
- i = (prefix ==NULL) ? 0 : strlen(prefix);
- cfgpath = malloc( i+ MAX_OPTNAME_SIZE +1);
- if (cfgpath == NULL) {
- fprintf(stderr,"[LIBCONFIG] %s %i malloc error, %s\n", __FILE__, __LINE__,strerror(errno));
- return -1;
- }
+ char cfgpath[512]; /* 512 should be enough for the sprintf below */
+
for(i=0;i
#include "assertions.h"
-#include "signals.h"
#include "vcd_signal_dumper.h"
diff --git a/common/utils/assertions.h b/common/utils/assertions.h
index f6728caf7b..b872b009e2 100644
--- a/common/utils/assertions.h
+++ b/common/utils/assertions.h
@@ -19,9 +19,72 @@
* contact@openairinterface.org
*/
-#ifndef UTILS_ASSERTIONS_H_
-#define UTILS_ASSERTIONS_H_
+#include
+#include
+#include
+#ifdef CMAKER
+#include
+#endif
-#include "./itti/assertions.h"
+#if defined(ENB_MODE)
+# define display_backtrace()
+#else
+# include "backtrace.h"
+#endif
-#endif /* UTILS_ASSERTIONS_H_ */
+#ifndef ASSERTIONS_H_
+#define ASSERTIONS_H_
+
+void output_log_mem(void);
+#define _Assert_Exit_ \
+{ \
+ fprintf(stderr, "\nExiting execution\n"); \
+ display_backtrace(); \
+ fflush(stdout); \
+ fflush(stderr); \
+ exit(EXIT_FAILURE); \
+}
+
+#define _Assert_(cOND, aCTION, fORMAT, aRGS...) \
+do { \
+ if (!(cOND)) { \
+ fprintf(stderr, "\nAssertion ("#cOND") failed!\n" \
+ "In %s() %s:%d\n" fORMAT, \
+ __FUNCTION__, __FILE__, __LINE__, ##aRGS); \
+ aCTION; \
+ } \
+} while(0)
+
+#define AssertFatal(cOND, fORMAT, aRGS...) _Assert_(cOND, _Assert_Exit_, fORMAT, ##aRGS)
+
+#define AssertError(cOND, aCTION, fORMAT, aRGS...) _Assert_(cOND, aCTION, fORMAT, ##aRGS)
+
+
+
+#define DevCheck(cOND, vALUE1, vALUE2, vALUE3) \
+_Assert_(cOND, _Assert_Exit_, #vALUE1 ": %" PRIdMAX "\n" #vALUE2 ": %" PRIdMAX "\n" #vALUE3 ": %" PRIdMAX "\n\n", \
+ (intmax_t)vALUE1, (intmax_t)vALUE2, (intmax_t)vALUE3)
+
+#define DevCheck4(cOND, vALUE1, vALUE2, vALUE3, vALUE4) \
+_Assert_(cOND, _Assert_Exit_, #vALUE1": %" PRIdMAX "\n" #vALUE2 ": %" PRIdMAX "\n" #vALUE3 ": %" PRIdMAX "\n" #vALUE4 ": %" PRIdMAX "\n\n", \
+ (intmax_t)vALUE1, (intmax_t)vALUE2, (intmax_t)vALUE3, (intmax_t)vALUE4)
+
+#define DevParam(vALUE1, vALUE2, vALUE3) DevCheck(0, vALUE1, vALUE2, vALUE3)
+
+#define DevAssert(cOND) _Assert_(cOND, _Assert_Exit_, "")
+
+#define DevMessage(mESSAGE) _Assert_(0, _Assert_Exit_, #mESSAGE)
+
+#define CHECK_INIT_RETURN(fCT) \
+do { \
+ int fct_ret; \
+ if ((fct_ret = (fCT)) != 0) { \
+ fprintf(stderr, "Function "#fCT" has failed\n" \
+ "returning %d\n", fct_ret); \
+ fflush(stdout); \
+ fflush(stderr); \
+ exit(EXIT_FAILURE); \
+ } \
+} while(0)
+
+#endif /* ASSERTIONS_H_ */
diff --git a/common/utils/itti/backtrace.c b/common/utils/backtrace.c
similarity index 100%
rename from common/utils/itti/backtrace.c
rename to common/utils/backtrace.c
diff --git a/common/utils/itti/backtrace.h b/common/utils/backtrace.h
similarity index 100%
rename from common/utils/itti/backtrace.h
rename to common/utils/backtrace.h
diff --git a/common/utils/itti/Makefile.am b/common/utils/itti/Makefile.am
deleted file mode 100644
index 93f5704603..0000000000
--- a/common/utils/itti/Makefile.am
+++ /dev/null
@@ -1,32 +0,0 @@
-AM_CFLAGS = @ADD_CFLAGS@ \
- -I$(top_srcdir)/UTILS \
- -I$(top_srcdir)/COMMON \
- -I$(OPENAIR2_DIR)/UTIL/LFDS/liblfds6.1.1/liblfds611/inc \
- -DENABLE_EVENT_FD
-
-noinst_LTLIBRARIES = libitti.la
-
-BUILT_SOURCES = $(abs_top_builddir)/INTERTASK_INTERFACE/UTIL/LFDS/liblfds6.1.1/liblfds611/bin/liblfds611.a
-
-$(abs_top_builddir)/INTERTASK_INTERFACE/UTIL/LFDS/liblfds6.1.1/liblfds611/bin/liblfds611.a:
- @if [ ! -d $(abs_top_builddir)/INTERTASK_INTERFACE/UTIL/LFDS/liblfds6.1.1/liblfds611/bin ]; then mkdir -p $(abs_top_builddir)/INTERTASK_INTERFACE/UTIL/LFDS/liblfds6.1.1/liblfds611/bin; fi;
- @if [ ! -d $(abs_top_builddir)/INTERTASK_INTERFACE/UTIL/LFDS/liblfds6.1.1/liblfds611/obj ]; then mkdir -p $(abs_top_builddir)/INTERTASK_INTERFACE/UTIL/LFDS/liblfds6.1.1/liblfds611/obj; fi;
- @$(MAKE) -C $(OPENAIR2_DIR)/UTIL/LFDS/liblfds6.1.1/liblfds611/ -f makefile.linux OUTDIR=$(abs_top_builddir)/INTERTASK_INTERFACE/UTIL/LFDS/liblfds6.1.1/liblfds611
-
-libitti_la_LDFLAGS = -all-static
-libitti_la_SOURCES = \
- gtpv1_u_messages_def.h gtpv1_u_messages_types.h \
- nas_messages_def.h nas_messages_types.h \
- timer_messages_def.h timer_messages_types.h \
- s11_messages_def.h s11_messages_types.h \
- s1ap_messages_def.h s1ap_messages_types.h \
- s6a_messages_def.h s6a_messages_types.h \
- sgw_lite_def.h sgw_lite_messages_types.h \
- sctp_messages_def.h sctp_messages_types.h \
- udp_message_def.h udp_messages_types.h \
- intertask_interface.c intertask_interface.h \
- intertask_interface_dump.c intertask_interface_dump.h \
- assertions.h \
- backtrace.c backtrace.h \
- signals.c signals.h \
- timer.c timer.h
diff --git a/common/utils/itti/assertions.h b/common/utils/itti/assertions.h
deleted file mode 100644
index b872b009e2..0000000000
--- a/common/utils/itti/assertions.h
+++ /dev/null
@@ -1,90 +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
-#include
-#include
-#ifdef CMAKER
-#include
-#endif
-
-#if defined(ENB_MODE)
-# define display_backtrace()
-#else
-# include "backtrace.h"
-#endif
-
-#ifndef ASSERTIONS_H_
-#define ASSERTIONS_H_
-
-void output_log_mem(void);
-#define _Assert_Exit_ \
-{ \
- fprintf(stderr, "\nExiting execution\n"); \
- display_backtrace(); \
- fflush(stdout); \
- fflush(stderr); \
- exit(EXIT_FAILURE); \
-}
-
-#define _Assert_(cOND, aCTION, fORMAT, aRGS...) \
-do { \
- if (!(cOND)) { \
- fprintf(stderr, "\nAssertion ("#cOND") failed!\n" \
- "In %s() %s:%d\n" fORMAT, \
- __FUNCTION__, __FILE__, __LINE__, ##aRGS); \
- aCTION; \
- } \
-} while(0)
-
-#define AssertFatal(cOND, fORMAT, aRGS...) _Assert_(cOND, _Assert_Exit_, fORMAT, ##aRGS)
-
-#define AssertError(cOND, aCTION, fORMAT, aRGS...) _Assert_(cOND, aCTION, fORMAT, ##aRGS)
-
-
-
-#define DevCheck(cOND, vALUE1, vALUE2, vALUE3) \
-_Assert_(cOND, _Assert_Exit_, #vALUE1 ": %" PRIdMAX "\n" #vALUE2 ": %" PRIdMAX "\n" #vALUE3 ": %" PRIdMAX "\n\n", \
- (intmax_t)vALUE1, (intmax_t)vALUE2, (intmax_t)vALUE3)
-
-#define DevCheck4(cOND, vALUE1, vALUE2, vALUE3, vALUE4) \
-_Assert_(cOND, _Assert_Exit_, #vALUE1": %" PRIdMAX "\n" #vALUE2 ": %" PRIdMAX "\n" #vALUE3 ": %" PRIdMAX "\n" #vALUE4 ": %" PRIdMAX "\n\n", \
- (intmax_t)vALUE1, (intmax_t)vALUE2, (intmax_t)vALUE3, (intmax_t)vALUE4)
-
-#define DevParam(vALUE1, vALUE2, vALUE3) DevCheck(0, vALUE1, vALUE2, vALUE3)
-
-#define DevAssert(cOND) _Assert_(cOND, _Assert_Exit_, "")
-
-#define DevMessage(mESSAGE) _Assert_(0, _Assert_Exit_, #mESSAGE)
-
-#define CHECK_INIT_RETURN(fCT) \
-do { \
- int fct_ret; \
- if ((fct_ret = (fCT)) != 0) { \
- fprintf(stderr, "Function "#fCT" has failed\n" \
- "returning %d\n", fct_ret); \
- fflush(stdout); \
- fflush(stderr); \
- exit(EXIT_FAILURE); \
- } \
-} while(0)
-
-#endif /* ASSERTIONS_H_ */
diff --git a/common/utils/itti/intertask_interface.c b/common/utils/itti/intertask_interface.c
deleted file mode 100644
index d088b59c04..0000000000
--- a/common/utils/itti/intertask_interface.c
+++ /dev/null
@@ -1,930 +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 _GNU_SOURCE
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-
-#include
-#include
-
-#if !defined(TRUE)
-#define TRUE 1
-#endif
-
-#include "liblfds611.h"
-
-#include "assertions.h"
-#include "intertask_interface.h"
-
-#if T_TRACER
-#include "T.h"
-#endif
-
-/* Includes "intertask_interface_init.h" to check prototype coherence, but
- * disable threads and messages information generation.
- */
-#define CHECK_PROTOTYPE_ONLY
-#include "intertask_interface_init.h"
-#undef CHECK_PROTOTYPE_ONLY
-
-#include "signals.h"
-#include "timer.h"
-
-/* ITTI DEBUG groups */
-#define ITTI_DEBUG_POLL (1<<0)
-#define ITTI_DEBUG_SEND (1<<1)
-#define ITTI_DEBUG_EVEN_FD (1<<2)
-#define ITTI_DEBUG_INIT (1<<3)
-#define ITTI_DEBUG_EXIT (1<<4)
-#define ITTI_DEBUG_ISSUES (1<<5)
-#define ITTI_DEBUG_MP_STATISTICS (1<<6)
-
-const int itti_debug = (ITTI_DEBUG_ISSUES | ITTI_DEBUG_MP_STATISTICS);
-
-# define ITTI_DEBUG(m, x, args...) do { if ((m) & itti_debug) {fprintf(stdout, "[ITTI][D]"x, ##args); fflush (stdout);} } while(0);
-#define ITTI_ERROR(x, args...) do { fprintf(stdout, "[ITTI][E]"x, ##args); fflush (stdout); } while(0);
-
-/* Global message size */
-#define MESSAGE_SIZE(mESSAGEiD) (sizeof(MessageHeader) + itti_desc.messages_info[mESSAGEiD].size)
-
-
-extern int emulate_rf;
-
-typedef enum task_state_s {
- TASK_STATE_NOT_CONFIGURED, TASK_STATE_STARTING, TASK_STATE_READY, TASK_STATE_ENDED, TASK_STATE_MAX,
-} task_state_t;
-
-/* This list acts as a FIFO of messages received by tasks (RRC, NAS, ...) */
-typedef struct message_list_s {
- MessageDef *msg; ///< Pointer to the message
-
- message_number_t message_number; ///< Unique message number
- uint32_t message_priority; ///< Message priority
-} message_list_t;
-
-typedef struct thread_desc_s {
- /* pthread associated with the thread */
- pthread_t task_thread;
-
- /* State of the thread */
- volatile task_state_t task_state;
-
- /* This fd is used internally by ITTI. */
- int epoll_fd;
-
- /* The thread fd */
- int task_event_fd;
-
- /* Number of events to monitor */
- uint16_t nb_events;
-
-
- /* Array of events monitored by the task.
- * By default only one fd is monitored (the one used to received messages
- * from other tasks).
- * More events can be suscribed later by the task itself.
- */
- struct epoll_event *events;
-
- int epoll_nb_events;
-
- /* Flag to mark real time thread */
- unsigned real_time;
-
- /* Counter to indicate that messages are pending for the thread */
- unsigned messages_pending;
-} thread_desc_t;
-
-typedef struct task_desc_s {
- /* Queue of messages belonging to the task */
- struct lfds611_queue_state *message_queue;
-} task_desc_t;
-
-typedef struct itti_desc_s {
- thread_desc_t *threads;
- task_desc_t *tasks;
-
- /* Current message number. Incremented every call to send_msg_to_task */
- message_number_t message_number __attribute__((aligned(8)));
-
- thread_id_t thread_max;
- task_id_t task_max;
- MessagesIds messages_id_max;
-
- boolean_t thread_handling_signals;
- pthread_t thread_ref;
-
- const task_info_t *tasks_info;
- const message_info_t *messages_info;
-
- itti_lte_time_t lte_time;
-
- int running;
-
- volatile uint32_t created_tasks;
- volatile uint32_t ready_tasks;
- volatile int wait_tasks;
-} itti_desc_t;
-
-static itti_desc_t itti_desc;
-
-void *itti_malloc(task_id_t origin_task_id, task_id_t destination_task_id, ssize_t size)
-{
- void *ptr = NULL;
-
- ptr = malloc (size);
- if (ptr) memset(ptr,0,size);
-
- AssertFatal (ptr != NULL, "Memory allocation of %d bytes failed (%d -> %d)!\n", (int) size, origin_task_id, destination_task_id);
-
- return ptr;
-}
-
-int itti_free(task_id_t task_id, void *ptr)
-{
- int result = EXIT_SUCCESS;
- AssertFatal (ptr != NULL, "Trying to free a NULL pointer (%d)!\n", task_id);
-
- free (ptr);
-
- return (result);
-}
-
-static inline message_number_t itti_increment_message_number(void)
-{
- /* Atomic operation supported by GCC: returns the current message number
- * and then increment it by 1.
- * This can be done without mutex.
- */
- return __sync_fetch_and_add (&itti_desc.message_number, 1);
-}
-
-static inline uint32_t itti_get_message_priority(MessagesIds message_id)
-{
- AssertFatal (message_id < itti_desc.messages_id_max, "Message id (%d) is out of range (%d)!\n", message_id, itti_desc.messages_id_max);
-
- return (itti_desc.messages_info[message_id].priority);
-}
-
-const char *itti_get_message_name(MessagesIds message_id)
-{
- AssertFatal (message_id < itti_desc.messages_id_max, "Message id (%d) is out of range (%d)!\n", message_id, itti_desc.messages_id_max);
-
- return (itti_desc.messages_info[message_id].name);
-}
-
-const char *itti_get_task_name(task_id_t task_id)
-{
- if (itti_desc.task_max > 0) {
- AssertFatal (task_id < itti_desc.task_max, "Task id (%d) is out of range (%d)!\n", task_id, itti_desc.task_max);
- } else {
- return ("ITTI NOT INITIALIZED !!!");
- }
-
- return (itti_desc.tasks_info[task_id].name);
-}
-
-static task_id_t itti_get_current_task_id(void)
-{
- task_id_t task_id;
- thread_id_t thread_id;
- pthread_t thread = pthread_self ();
-
- for (task_id = TASK_FIRST; task_id < itti_desc.task_max; task_id++) {
- thread_id = TASK_GET_THREAD_ID(task_id);
-
- if (itti_desc.threads[thread_id].task_thread == thread) {
- return task_id;
- }
- }
-
- return TASK_UNKNOWN;
-}
-
-void itti_update_lte_time(uint32_t frame, uint8_t slot)
-{
- itti_desc.lte_time.frame = frame;
- itti_desc.lte_time.slot = slot;
-}
-
-int itti_send_broadcast_message(MessageDef *message_p)
-{
- task_id_t destination_task_id;
- task_id_t origin_task_id;
- thread_id_t origin_thread_id;
- uint32_t thread_id;
- int ret = 0;
- int result;
-
- AssertFatal (message_p != NULL, "Trying to broadcast a NULL message!\n");
-
- origin_task_id = message_p->ittiMsgHeader.originTaskId;
- origin_thread_id = TASK_GET_THREAD_ID(origin_task_id);
-
- destination_task_id = TASK_FIRST;
-
- for (thread_id = THREAD_FIRST; thread_id < itti_desc.thread_max; thread_id++) {
- MessageDef *new_message_p;
-
- while (thread_id != TASK_GET_THREAD_ID(destination_task_id)) {
- destination_task_id++;
- }
-
- /* Skip task that broadcast the message */
- if (thread_id != origin_thread_id) {
- /* Skip tasks which are not running */
- if (itti_desc.threads[thread_id].task_state == TASK_STATE_READY) {
- size_t size = sizeof(MessageHeader) + message_p->ittiMsgHeader.ittiMsgSize;
- new_message_p = itti_malloc( origin_task_id, destination_task_id, size );
- AssertFatal (new_message_p != NULL, "New message allocation failed!\n");
-
- memcpy( new_message_p, message_p, size );
- result = itti_send_msg_to_task (destination_task_id, INSTANCE_DEFAULT, new_message_p);
- AssertFatal (result >= 0, "Failed to send message %d to thread %d (task %d)!\n", message_p->ittiMsgHeader.messageId, thread_id, destination_task_id);
- }
- }
- }
-
- result = itti_free (ITTI_MSG_ORIGIN_ID(message_p), message_p);
- AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result);
-
- return ret;
-}
-
-MessageDef *itti_alloc_new_message_sized(task_id_t origin_task_id, MessagesIds message_id, MessageHeaderSize size)
-{
- MessageDef *temp = NULL;
-
- AssertFatal (message_id < itti_desc.messages_id_max, "Message id (%d) is out of range (%d)!\n", message_id, itti_desc.messages_id_max);
-
- if (origin_task_id == TASK_UNKNOWN) {
- /* Try to identify real origin task ID */
- origin_task_id = itti_get_current_task_id();
- }
-
- temp = itti_malloc (origin_task_id, TASK_UNKNOWN, sizeof(MessageHeader) + size);
-
- temp->ittiMsgHeader.messageId = message_id;
- temp->ittiMsgHeader.originTaskId = origin_task_id;
- temp->ittiMsgHeader.ittiMsgSize = size;
-
- return temp;
-}
-
-MessageDef *itti_alloc_new_message(task_id_t origin_task_id, MessagesIds message_id)
-{
- return itti_alloc_new_message_sized(origin_task_id, message_id, itti_desc.messages_info[message_id].size);
-}
-
-int itti_send_msg_to_task(task_id_t destination_task_id, instance_t instance, MessageDef *message)
-{
- thread_id_t destination_thread_id;
- task_id_t origin_task_id;
- message_list_t *new;
- uint32_t priority;
- message_number_t message_number;
- uint32_t message_id;
-
- AssertFatal (message != NULL, "Message is NULL!\n");
- AssertFatal (destination_task_id < itti_desc.task_max, "Destination task id (%d) is out of range (%d)\n", destination_task_id, itti_desc.task_max);
-
- destination_thread_id = TASK_GET_THREAD_ID(destination_task_id);
- message->ittiMsgHeader.destinationTaskId = destination_task_id;
- message->ittiMsgHeader.instance = instance;
- message->ittiMsgHeader.lte_time.frame = itti_desc.lte_time.frame;
- message->ittiMsgHeader.lte_time.slot = itti_desc.lte_time.slot;
- message_id = message->ittiMsgHeader.messageId;
- AssertFatal (message_id < itti_desc.messages_id_max, "Message id (%d) is out of range (%d)!\n", message_id, itti_desc.messages_id_max);
-
- origin_task_id = ITTI_MSG_ORIGIN_ID(message);
-
- priority = itti_get_message_priority (message_id);
-
- /* Increment the global message number */
- message_number = itti_increment_message_number ();
-
- if (destination_task_id != TASK_UNKNOWN) {
-
- if (itti_desc.threads[destination_thread_id].task_state == TASK_STATE_ENDED ||
- itti_desc.threads[destination_thread_id].task_state == TASK_STATE_NOT_CONFIGURED) {
- ITTI_DEBUG(ITTI_DEBUG_ISSUES, " Message %s, number %lu with priority %d can not be sent from %s to queue (%u:%s), unconfigured or ended destination task!\n",
- itti_desc.messages_info[message_id].name,
- message_number,
- priority,
- itti_get_task_name(origin_task_id),
- destination_task_id,
- itti_get_task_name(destination_task_id));
- } else {
- if(!emulate_rf){
- /* We cannot send a message if the task is not running */
- AssertFatal (itti_desc.threads[destination_thread_id].task_state == TASK_STATE_READY,
- "Task %s Cannot send message %s (%d) to thread %d, it is not in ready state (%d)!\n",
- itti_get_task_name(origin_task_id),
- itti_desc.messages_info[message_id].name,
- message_id,
- destination_thread_id,
- itti_desc.threads[destination_thread_id].task_state);
- }
-
- /* Allocate new list element */
- new = (message_list_t *) itti_malloc (origin_task_id, destination_task_id, sizeof(struct message_list_s));
-
- /* Fill in members */
- new->msg = message;
- new->message_number = message_number;
- new->message_priority = priority;
-
- /* Enqueue message in destination task queue */
- if (lfds611_queue_enqueue(itti_desc.tasks[destination_task_id].message_queue, new) == 0) {
- AssertFatal(0, "Error: lfds611_queue_enqueue returns 0, queue is full, exiting\n");
- }
-
- {
- /* Only use event fd for tasks, subtasks will pool the queue */
- if (TASK_GET_PARENT_TASK_ID(destination_task_id) == TASK_UNKNOWN) {
- ssize_t write_ret;
- eventfd_t sem_counter = 1;
-
- /* Call to write for an event fd must be of 8 bytes */
- write_ret = write (itti_desc.threads[destination_thread_id].task_event_fd, &sem_counter, sizeof(sem_counter));
- AssertFatal (write_ret == sizeof(sem_counter), "Write to task message FD (%d) failed (%d/%d)\n",
- destination_thread_id, (int) write_ret, (int) sizeof(sem_counter));
- }
- }
-
- ITTI_DEBUG(ITTI_DEBUG_SEND, " Message %s, number %lu with priority %d successfully sent from %s to queue (%u:%s)\n",
- itti_desc.messages_info[message_id].name,
- message_number,
- priority,
- itti_get_task_name(origin_task_id),
- destination_task_id,
- itti_get_task_name(destination_task_id));
- }
- } else {
- /* This is a debug message to TASK_UNKNOWN, we can release safely release it */
- int result = itti_free(origin_task_id, message);
- AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result);
- }
-
- return 0;
-}
-
-/* same as itti_send_msg_to_task but returns -1 in case of failure instead of crashing */
-/* TODO: this is a hack - the whole logic needs a proper rework. */
-/* look for HACK_RLC_UM_LIMIT for others places related to the hack. Please do not remove this comment. */
-int itti_try_send_msg_to_task(task_id_t destination_task_id, instance_t instance, MessageDef *message)
-{
- thread_id_t destination_thread_id;
- task_id_t origin_task_id;
- message_list_t *new;
- uint32_t priority;
- message_number_t message_number;
- uint32_t message_id;
-
- AssertFatal (message != NULL, "Message is NULL!\n");
- AssertFatal (destination_task_id < itti_desc.task_max, "Destination task id (%d) is out of range (%d)\n", destination_task_id, itti_desc.task_max);
-
- destination_thread_id = TASK_GET_THREAD_ID(destination_task_id);
- message->ittiMsgHeader.destinationTaskId = destination_task_id;
- message->ittiMsgHeader.instance = instance;
- message->ittiMsgHeader.lte_time.frame = itti_desc.lte_time.frame;
- message->ittiMsgHeader.lte_time.slot = itti_desc.lte_time.slot;
- message_id = message->ittiMsgHeader.messageId;
- AssertFatal (message_id < itti_desc.messages_id_max, "Message id (%d) is out of range (%d)!\n", message_id, itti_desc.messages_id_max);
-
- origin_task_id = ITTI_MSG_ORIGIN_ID(message);
-
- priority = itti_get_message_priority (message_id);
-
- /* Increment the global message number */
- message_number = itti_increment_message_number ();
-
- if (destination_task_id != TASK_UNKNOWN) {
-
- if (itti_desc.threads[destination_thread_id].task_state == TASK_STATE_ENDED ||
- itti_desc.threads[destination_thread_id].task_state == TASK_STATE_NOT_CONFIGURED) {
- ITTI_DEBUG(ITTI_DEBUG_ISSUES, " Message %s, number %lu with priority %d can not be sent from %s to queue (%u:%s), unconfigured or ended destination task!\n",
- itti_desc.messages_info[message_id].name,
- message_number,
- priority,
- itti_get_task_name(origin_task_id),
- destination_task_id,
- itti_get_task_name(destination_task_id));
- } else {
- /* We cannot send a message if the task is not running */
- AssertFatal (itti_desc.threads[destination_thread_id].task_state == TASK_STATE_READY,
- "Task %s Cannot send message %s (%d) to thread %d, it is not in ready state (%d)!\n",
- itti_get_task_name(origin_task_id),
- itti_desc.messages_info[message_id].name,
- message_id,
- destination_thread_id,
- itti_desc.threads[destination_thread_id].task_state);
-
- /* Allocate new list element */
- new = (message_list_t *) itti_malloc (origin_task_id, destination_task_id, sizeof(struct message_list_s));
-
- /* Fill in members */
- new->msg = message;
- new->message_number = message_number;
- new->message_priority = priority;
-
- /* Enqueue message in destination task queue */
- if (lfds611_queue_enqueue(itti_desc.tasks[destination_task_id].message_queue, new) == 0) {
- itti_free(origin_task_id, new);
- return -1;
- }
-
- {
- /* Only use event fd for tasks, subtasks will pool the queue */
- if (TASK_GET_PARENT_TASK_ID(destination_task_id) == TASK_UNKNOWN) {
- ssize_t write_ret;
- eventfd_t sem_counter = 1;
-
- /* Call to write for an event fd must be of 8 bytes */
- write_ret = write (itti_desc.threads[destination_thread_id].task_event_fd, &sem_counter, sizeof(sem_counter));
- AssertFatal (write_ret == sizeof(sem_counter), "Write to task message FD (%d) failed (%d/%d)\n",
- destination_thread_id, (int) write_ret, (int) sizeof(sem_counter));
- }
- }
-
- ITTI_DEBUG(ITTI_DEBUG_SEND, " Message %s, number %lu with priority %d successfully sent from %s to queue (%u:%s)\n",
- itti_desc.messages_info[message_id].name,
- message_number,
- priority,
- itti_get_task_name(origin_task_id),
- destination_task_id,
- itti_get_task_name(destination_task_id));
- }
- } else {
- /* This is a debug message to TASK_UNKNOWN, we can release safely release it */
- int result = itti_free(origin_task_id, message);
- AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result);
- }
-
- return 0;
-}
-
-void itti_subscribe_event_fd(task_id_t task_id, int fd)
-{
- thread_id_t thread_id;
- struct epoll_event event;
-
- AssertFatal (task_id < itti_desc.task_max, "Task id (%d) is out of range (%d)!\n", task_id, itti_desc.task_max);
-
- thread_id = TASK_GET_THREAD_ID(task_id);
- itti_desc.threads[thread_id].nb_events++;
-
- /* Reallocate the events */
- itti_desc.threads[thread_id].events = realloc(
- itti_desc.threads[thread_id].events,
- itti_desc.threads[thread_id].nb_events * sizeof(struct epoll_event));
-
- event.events = EPOLLIN | EPOLLERR;
- event.data.u64 = 0;
- event.data.fd = fd;
-
- /* Add the event fd to the list of monitored events */
- if (epoll_ctl(itti_desc.threads[thread_id].epoll_fd, EPOLL_CTL_ADD, fd,
- &event) != 0) {
- /* Always assert on this condition */
- AssertFatal (0, "epoll_ctl (EPOLL_CTL_ADD) failed for task %s, fd %d: %s!\n",
- itti_get_task_name(task_id), fd, strerror(errno));
- }
-
- ITTI_DEBUG(ITTI_DEBUG_EVEN_FD, " Successfully subscribed fd %d for task %s\n", fd, itti_get_task_name(task_id));
-}
-
-void itti_unsubscribe_event_fd(task_id_t task_id, int fd)
-{
- thread_id_t thread_id;
-
- AssertFatal (task_id < itti_desc.task_max, "Task id (%d) is out of range (%d)!\n", task_id, itti_desc.task_max);
- AssertFatal (fd >= 0, "File descriptor (%d) is invalid!\n", fd);
-
- thread_id = TASK_GET_THREAD_ID(task_id);
-
- /* Add the event fd to the list of monitored events */
- if (epoll_ctl(itti_desc.threads[thread_id].epoll_fd, EPOLL_CTL_DEL, fd, NULL) != 0) {
- /* Always assert on this condition */
- AssertFatal (0, "epoll_ctl (EPOLL_CTL_DEL) failed for task %s, fd %d: %s!\n",
- itti_get_task_name(task_id), fd, strerror(errno));
- }
-
- itti_desc.threads[thread_id].nb_events--;
- itti_desc.threads[thread_id].events = realloc(
- itti_desc.threads[thread_id].events,
- itti_desc.threads[thread_id].nb_events * sizeof(struct epoll_event));
-}
-
-int itti_get_events(task_id_t task_id, struct epoll_event **events)
-{
- thread_id_t thread_id;
-
- AssertFatal (task_id < itti_desc.task_max, "Task id (%d) is out of range (%d)\n", task_id, itti_desc.task_max);
-
- thread_id = TASK_GET_THREAD_ID(task_id);
- *events = itti_desc.threads[thread_id].events;
-
- return itti_desc.threads[thread_id].epoll_nb_events;
-}
-
-static inline void itti_receive_msg_internal_event_fd(task_id_t task_id, uint8_t polling, MessageDef **received_msg)
-{
- thread_id_t thread_id;
- int epoll_ret = 0;
- int epoll_timeout = 0;
- int i;
-
- AssertFatal (task_id < itti_desc.task_max, "Task id (%d) is out of range (%d)!\n", task_id, itti_desc.task_max);
- AssertFatal (received_msg != NULL, "Received message is NULL!\n");
-
- thread_id = TASK_GET_THREAD_ID(task_id);
- *received_msg = NULL;
-
- if (polling) {
- /* In polling mode we set the timeout to 0 causing epoll_wait to return
- * immediately.
- */
- epoll_timeout = 0;
- } else {
- /* timeout = -1 causes the epoll_wait to wait indefinitely.
- */
- epoll_timeout = -1;
- }
-
- do {
- epoll_ret = epoll_wait(itti_desc.threads[thread_id].epoll_fd,
- itti_desc.threads[thread_id].events,
- itti_desc.threads[thread_id].nb_events,
- epoll_timeout);
- } while (epoll_ret < 0 && errno == EINTR);
-
- if (epoll_ret < 0) {
- AssertFatal (0, "epoll_wait failed for task %s: %s!\n", itti_get_task_name(task_id), strerror(errno));
- }
-
- if (epoll_ret == 0 && polling) {
- /* No data to read -> return */
- return;
- }
-
- itti_desc.threads[thread_id].epoll_nb_events = epoll_ret;
-
- for (i = 0; i < epoll_ret; i++) {
- /* Check if there is an event for ITTI for the event fd */
- if ((itti_desc.threads[thread_id].events[i].events & EPOLLIN) &&
- (itti_desc.threads[thread_id].events[i].data.fd == itti_desc.threads[thread_id].task_event_fd)) {
- struct message_list_s *message = NULL;
- eventfd_t sem_counter;
- ssize_t read_ret;
- int result;
-
- /* Read will always return 1 */
- read_ret = read (itti_desc.threads[thread_id].task_event_fd, &sem_counter, sizeof(sem_counter));
- AssertFatal (read_ret == sizeof(sem_counter), "Read from task message FD (%d) failed (%d/%d)!\n", thread_id, (int) read_ret, (int) sizeof(sem_counter));
-
- if (lfds611_queue_dequeue (itti_desc.tasks[task_id].message_queue, (void **) &message) == 0) {
- /* No element in list -> this should not happen */
- AssertFatal (0, "No message in queue for task %d while there are %d events and some for the messages queue!\n", task_id, epoll_ret);
- }
-
- AssertFatal(message != NULL, "Message from message queue is NULL!\n");
- *received_msg = message->msg;
-
-
- result = itti_free (ITTI_MSG_ORIGIN_ID(*received_msg), message);
- AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result);
-
-
- /* Mark that the event has been processed */
- itti_desc.threads[thread_id].events[i].events &= ~EPOLLIN;
- return;
- }
- }
-}
-
-void itti_receive_msg(task_id_t task_id, MessageDef **received_msg)
-{
-
- itti_receive_msg_internal_event_fd(task_id, 0, received_msg);
-
-}
-
-void itti_poll_msg(task_id_t task_id, MessageDef **received_msg)
-{
- AssertFatal (task_id < itti_desc.task_max, "Task id (%d) is out of range (%d)!\n", task_id, itti_desc.task_max);
-
- *received_msg = NULL;
-
- {
- struct message_list_s *message;
-
- if (lfds611_queue_dequeue (itti_desc.tasks[task_id].message_queue, (void **) &message) == 1) {
- int result;
-
- *received_msg = message->msg;
- result = itti_free (ITTI_MSG_ORIGIN_ID(*received_msg), message);
- AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result);
- }
- }
-
- if (*received_msg == NULL) {
- ITTI_DEBUG(ITTI_DEBUG_POLL, " No message in queue[(%u:%s)]\n", task_id, itti_get_task_name(task_id));
- }
-
-}
-
-int itti_create_task(task_id_t task_id, void *(*start_routine)(void *), void *args_p)
-{
- thread_id_t thread_id = TASK_GET_THREAD_ID(task_id);
- int result;
-
- AssertFatal (start_routine != NULL, "Start routine is NULL!\n");
- AssertFatal (thread_id < itti_desc.thread_max, "Thread id (%d) is out of range (%d)!\n", thread_id, itti_desc.thread_max);
- AssertFatal (itti_desc.threads[thread_id].task_state == TASK_STATE_NOT_CONFIGURED, "Task %d, thread %d state is not correct (%d)!\n",
- task_id, thread_id, itti_desc.threads[thread_id].task_state);
-
- itti_desc.threads[thread_id].task_state = TASK_STATE_STARTING;
-
- ITTI_DEBUG(ITTI_DEBUG_INIT, " Creating thread for task %s ...\n", itti_get_task_name(task_id));
-
- result = pthread_create (&itti_desc.threads[thread_id].task_thread, NULL, start_routine, args_p);
- AssertFatal (result >= 0, "Thread creation for task %d, thread %d failed (%d)!\n", task_id, thread_id, result);
- char name[16];
- snprintf( name, sizeof(name), "ITTI %d", thread_id );
- pthread_setname_np( itti_desc.threads[thread_id].task_thread, name );
-
- itti_desc.created_tasks ++;
-
- /* Wait till the thread is completely ready */
- while (itti_desc.threads[thread_id].task_state != TASK_STATE_READY)
- usleep (1000);
-
- return 0;
-}
-
-void itti_set_task_real_time(task_id_t task_id)
-{
- thread_id_t thread_id = TASK_GET_THREAD_ID(task_id);
-
- DevCheck(thread_id < itti_desc.thread_max, thread_id, itti_desc.thread_max, 0);
-
- itti_desc.threads[thread_id].real_time = TRUE;
-}
-
-void itti_wait_ready(int wait_tasks)
-{
- itti_desc.wait_tasks = wait_tasks;
-
- ITTI_DEBUG(ITTI_DEBUG_INIT,
- " wait for tasks: %s, created tasks %d, ready tasks %d\n",
- itti_desc.wait_tasks ? "yes" : "no",
- itti_desc.created_tasks,
- itti_desc.ready_tasks);
-
- AssertFatal (itti_desc.created_tasks == itti_desc.ready_tasks, "Number of created tasks (%d) does not match ready tasks (%d), wait task %d!\n",
- itti_desc.created_tasks, itti_desc.ready_tasks, itti_desc.wait_tasks);
-}
-
-void itti_mark_task_ready(task_id_t task_id)
-{
- thread_id_t thread_id = TASK_GET_THREAD_ID(task_id);
-
- AssertFatal (thread_id < itti_desc.thread_max, "Thread id (%d) is out of range (%d)!\n", thread_id, itti_desc.thread_max);
-
- /* Mark the thread as using LFDS queue */
- lfds611_queue_use(itti_desc.tasks[task_id].message_queue);
-
-#if defined(UE_EXPANSION) || defined(RTAI)
- /* Assign low priority to created threads */
- {
- struct sched_param sched_param;
- sched_param.sched_priority = sched_get_priority_min(SCHED_FIFO) + 1;
- sched_setscheduler(0, SCHED_FIFO, &sched_param);
- }
-#endif
-
- itti_desc.threads[thread_id].task_state = TASK_STATE_READY;
- itti_desc.ready_tasks ++;
-
- while (itti_desc.wait_tasks != 0) {
- usleep (10000);
- }
-
- ITTI_DEBUG(ITTI_DEBUG_INIT, " task %s started\n", itti_get_task_name(task_id));
-}
-
-void itti_exit_task(void)
-{
- task_id_t task_id = itti_get_current_task_id();
- thread_id_t thread_id = TASK_GET_THREAD_ID(task_id);
-
-#if defined(OAI_EMU) || defined(RTAI)
- if (task_id > TASK_UNKNOWN) {
- VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_ITTI_RECV_MSG,
- __sync_and_and_fetch (&itti_desc.vcd_receive_msg, ~(1L << task_id)));
- }
-#endif
-
- itti_desc.threads[thread_id].task_state = TASK_STATE_NOT_CONFIGURED;
- itti_desc.created_tasks--;
- ITTI_DEBUG(ITTI_DEBUG_EXIT, "Thread for task %s (%d) exits\n", itti_get_task_name(task_id), task_id);
- pthread_exit (NULL);
-}
-
-void itti_terminate_tasks(task_id_t task_id)
-{
- // Sends Terminate signals to all tasks.
- itti_send_terminate_message (task_id);
-
- if (itti_desc.thread_handling_signals) {
- pthread_kill (itti_desc.thread_ref, SIGUSR1);
- }
-
- pthread_exit (NULL);
-}
-
-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)
-{
- task_id_t task_id;
- thread_id_t thread_id;
- int ret;
-
- itti_desc.message_number = 1;
-
- ITTI_DEBUG(ITTI_DEBUG_INIT, " Init: %d tasks, %d threads, %d messages\n", task_max, thread_max, messages_id_max);
-
- CHECK_INIT_RETURN(signal_mask());
-
- /* Saves threads and messages max values */
- itti_desc.task_max = task_max;
- itti_desc.thread_max = thread_max;
- itti_desc.messages_id_max = messages_id_max;
- itti_desc.thread_handling_signals = FALSE;
- itti_desc.tasks_info = tasks_info;
- itti_desc.messages_info = messages_info;
-
- /* Allocates memory for tasks info */
- itti_desc.tasks = calloc (itti_desc.task_max, sizeof(task_desc_t));
-
- /* Allocates memory for threads info */
- itti_desc.threads = calloc (itti_desc.thread_max, sizeof(thread_desc_t));
-
- /* Initializing each queue and related stuff */
- for (task_id = TASK_FIRST; task_id < itti_desc.task_max; task_id++) {
- ITTI_DEBUG(ITTI_DEBUG_INIT, " Initializing %stask %s%s%s\n",
- itti_desc.tasks_info[task_id].parent_task != TASK_UNKNOWN ? "sub-" : "",
- itti_desc.tasks_info[task_id].name,
- itti_desc.tasks_info[task_id].parent_task != TASK_UNKNOWN ? " with parent " : "",
- itti_desc.tasks_info[task_id].parent_task != TASK_UNKNOWN ?
- itti_get_task_name(itti_desc.tasks_info[task_id].parent_task) : "");
-
- ITTI_DEBUG(ITTI_DEBUG_INIT, " Creating queue of message of size %u\n", itti_desc.tasks_info[task_id].queue_size);
-
- ret = lfds611_queue_new(&itti_desc.tasks[task_id].message_queue, itti_desc.tasks_info[task_id].queue_size);
-
- if (0 == ret) {
- AssertFatal (0, "lfds611_queue_new failed for task %s!\n", itti_get_task_name(task_id));
- }
- }
-
- /* Initializing each thread */
- for (thread_id = THREAD_FIRST; thread_id < itti_desc.thread_max; thread_id++) {
- itti_desc.threads[thread_id].task_state = TASK_STATE_NOT_CONFIGURED;
-
- itti_desc.threads[thread_id].epoll_fd = epoll_create1(0);
-
- if (itti_desc.threads[thread_id].epoll_fd == -1) {
- /* Always assert on this condition */
- AssertFatal (0, "Failed to create new epoll fd: %s!\n", strerror(errno));
- }
-
- itti_desc.threads[thread_id].task_event_fd = eventfd(0, EFD_SEMAPHORE);
-
- if (itti_desc.threads[thread_id].task_event_fd == -1) {
- /* Always assert on this condition */
- AssertFatal (0, " eventfd failed: %s!\n", strerror(errno));
- }
-
- itti_desc.threads[thread_id].nb_events = 1;
-
- itti_desc.threads[thread_id].events = calloc(1, sizeof(struct epoll_event));
-
- itti_desc.threads[thread_id].events->events = EPOLLIN | EPOLLERR;
- itti_desc.threads[thread_id].events->data.fd = itti_desc.threads[thread_id].task_event_fd;
-
- /* Add the event fd to the list of monitored events */
- if (epoll_ctl(itti_desc.threads[thread_id].epoll_fd, EPOLL_CTL_ADD,
- itti_desc.threads[thread_id].task_event_fd, itti_desc.threads[thread_id].events) != 0) {
- /* Always assert on this condition */
- AssertFatal (0, " epoll_ctl (EPOLL_CTL_ADD) failed: %s!\n", strerror(errno));
- }
-
- ITTI_DEBUG(ITTI_DEBUG_EVEN_FD, " Successfully subscribed fd %d for thread %d\n",
- itti_desc.threads[thread_id].task_event_fd, thread_id);
-
- }
-
- itti_desc.running = 1;
- itti_desc.wait_tasks = 0;
- itti_desc.created_tasks = 0;
- itti_desc.ready_tasks = 0;
- CHECK_INIT_RETURN(timer_init ());
-
- return 0;
-}
-
-void itti_wait_tasks_end(void)
-{
- int end = 0;
- int thread_id;
- task_id_t task_id;
- int ready_tasks;
- int result;
- int retries = 10;
-
- itti_desc.thread_handling_signals = TRUE;
- itti_desc.thread_ref=pthread_self ();
-
- /* Handle signals here */
- while (end == 0) {
- signal_handle (&end);
- }
-
- printf("closing all tasks\n");
- sleep(1);
-
- do {
- ready_tasks = 0;
-
- task_id = TASK_FIRST;
-
- for (thread_id = THREAD_FIRST; thread_id < itti_desc.thread_max; thread_id++) {
- /* Skip tasks which are not running */
- if (itti_desc.threads[thread_id].task_state == TASK_STATE_READY) {
- while (thread_id != TASK_GET_THREAD_ID(task_id)) {
- task_id++;
- }
-
- result = pthread_tryjoin_np (itti_desc.threads[thread_id].task_thread, NULL);
-
- ITTI_DEBUG(ITTI_DEBUG_EXIT, " Thread %s join status %d\n", itti_get_task_name(task_id), result);
-
- if (result == 0) {
- /* Thread has terminated */
- itti_desc.threads[thread_id].task_state = TASK_STATE_ENDED;
- } else {
- /* Thread is still running, count it */
- ready_tasks++;
- }
- }
- }
-
- if (ready_tasks > 0) {
- usleep (100 * 1000);
- }
- } while ((ready_tasks > 0) && (retries--)&& (!end) );
-
- printf("ready_tasks %d\n",ready_tasks);
-
- itti_desc.running = 0;
-
- if (ready_tasks > 0) {
- ITTI_DEBUG(ITTI_DEBUG_ISSUES, " Some threads are still running, force exit\n");
- exit (0);
- }
-}
-
-void itti_send_terminate_message(task_id_t task_id)
-{
- MessageDef *terminate_message_p;
-
- terminate_message_p = itti_alloc_new_message (task_id, TERMINATE_MESSAGE);
-
- itti_send_broadcast_message (terminate_message_p);
-}
diff --git a/common/utils/itti/intertask_interface.h b/common/utils/itti/intertask_interface.h
deleted file mode 100644
index ada34ce1b7..0000000000
--- a/common/utils/itti/intertask_interface.h
+++ /dev/null
@@ -1,235 +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
- */
-
-/** @defgroup _intertask_interface_impl_ Intertask Interface Mechanisms
- * Implementation
- * @ingroup _ref_implementation_
- * @{
- */
-
-#include
-
-#ifndef INTERTASK_INTERFACE_H_
-#define INTERTASK_INTERFACE_H_
-
-#include
-#include
-#include
-
-#include "intertask_interface_conf.h"
-#include "intertask_interface_types.h"
-
-#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_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))
-
-/* Make the message number platform specific */
-typedef unsigned long message_number_t;
-#define MESSAGE_NUMBER_SIZE (sizeof(unsigned long))
-
-typedef enum message_priorities_e {
- MESSAGE_PRIORITY_MAX = 100,
- MESSAGE_PRIORITY_MAX_LEAST = 85,
- MESSAGE_PRIORITY_MED_PLUS = 70,
- MESSAGE_PRIORITY_MED = 55,
- MESSAGE_PRIORITY_MED_LEAST = 40,
- MESSAGE_PRIORITY_MIN_PLUS = 25,
- MESSAGE_PRIORITY_MIN = 10,
-} message_priorities_t;
-
-typedef struct message_info_s {
- task_id_t id;
- message_priorities_t priority;
- /* Message payload size */
- MessageHeaderSize size;
- /* Printable name */
- const char * const name;
-} message_info_t;
-
-typedef enum task_priorities_e {
- TASK_PRIORITY_MAX = 100,
- TASK_PRIORITY_MAX_LEAST = 85,
- TASK_PRIORITY_MED_PLUS = 70,
- TASK_PRIORITY_MED = 55,
- TASK_PRIORITY_MED_LEAST = 40,
- TASK_PRIORITY_MIN_PLUS = 25,
- TASK_PRIORITY_MIN = 10,
-} task_priorities_t;
-
-typedef struct task_info_s {
- thread_id_t thread;
- task_id_t parent_task;
- task_priorities_t priority;
- unsigned int queue_size;
- /* Printable name */
- const char * const name;
-} task_info_t;
-
-/** \brief Update the itti LTE time reference for messages
- \param current reference frame
- \param current reference slot
- @returns < 0 on failure, 0 otherwise
- **/
-void itti_update_lte_time(uint32_t frame, uint8_t slot);
-
-/** \brief Send a broadcast message to every task
- \param message_p Pointer to the message to send
- @returns < 0 on failure, 0 otherwise
- **/
-int itti_send_broadcast_message(MessageDef *message_p);
-
-/** \brief Send a message to a task (could be itself)
- \param task_id Task ID
- \param instance Instance of the task used for virtualization
- \param message Pointer to the message to send
- @returns -1 on failure, 0 otherwise
- **/
-int itti_send_msg_to_task(task_id_t task_id, instance_t instance, MessageDef *message);
-
-/* TODO: this is a hack. Almost no caller of itti_send_msg_to_task checks
- * the return value so it has been changed to crash the program in case
- * of failure instead of returning -1 as the documentation above says.
- * The RLC UM code may receive too much data when doing UDP at a higher
- * throughput than the link allows and so for this specific case we need
- * a version that actually returns -1 on failure.
- *
- * This needs to be cleaned at some point.
- */
-/* look for HACK_RLC_UM_LIMIT for others places related to the hack. Please do not remove this comment. */
-int itti_try_send_msg_to_task(task_id_t task_id, instance_t instance, MessageDef *message);
-
-/** \brief Add a new fd to monitor.
- * NOTE: it is up to the user to read data associated with the fd
- * \param task_id Task ID of the receiving task
- * \param fd The file descriptor to monitor
- **/
-void itti_subscribe_event_fd(task_id_t task_id, int fd);
-
-/** \brief Remove a fd from the list of fd to monitor
- * \param task_id Task ID of the task
- * \param fd The file descriptor to remove
- **/
-void itti_unsubscribe_event_fd(task_id_t task_id, int fd);
-
-/** \brief Return the list of events excluding the fd associated with itti
- * \param task_id Task ID of the task
- * \param events events list
- * @returns number of events to handle
- **/
-int itti_get_events(task_id_t task_id, struct epoll_event **events);
-
-/** \brief Retrieves a message in the queue associated to task_id.
- * If the queue is empty, the thread is blocked till a new message arrives.
- \param task_id Task ID of the receiving task
- \param received_msg Pointer to the allocated message
- **/
-void itti_receive_msg(task_id_t task_id, MessageDef **received_msg);
-
-/** \brief Try to retrieves a message in the queue associated to task_id.
- \param task_id Task ID of the receiving task
- \param received_msg Pointer to the allocated message
- **/
-void itti_poll_msg(task_id_t task_id, MessageDef **received_msg);
-
-/** \brief Start thread associated to the task
- * \param task_id task to start
- * \param start_routine entry point for the task
- * \param args_p Optional argument to pass to the start routine
- * @returns -1 on failure, 0 otherwise
- **/
-int itti_create_task(task_id_t task_id,
- void *(*start_routine) (void *),
- void *args_p);
-
-/** \brief Mark the task as a real time task
- * \param task_id task to mark as real time
- **/
-void itti_set_task_real_time(task_id_t task_id);
-
-/** \brief Indicates to ITTI if newly created tasks should wait for all tasks to be ready
- * \param wait_tasks non 0 to make new created tasks to wait, 0 to let created tasks to run
- **/
-void itti_wait_ready(int wait_tasks);
-
-/** \brief Mark the task as in ready state
- * \param task_id task to mark as ready
- **/
-void itti_mark_task_ready(task_id_t task_id);
-
-/** \brief Exit the current task.
- **/
-void itti_exit_task(void);
-
-/** \brief Indicate that the task is completed and initiate termination of all tasks.
- * \param task_id task that is completed
- **/
-void itti_terminate_tasks(task_id_t task_id);
-
-/** \brief Return the printable string associated with the message
- * \param message_id Id of the message
- **/
-const char *itti_get_message_name(MessagesIds message_id);
-
-/** \brief Return the printable string associated with a task id
- * \param thread_id Id of the task
- **/
-const char *itti_get_task_name(task_id_t task_id);
-
-/** \brief Alloc and memset(0) a new itti message.
- * \param origin_task_id Task ID of the sending task
- * \param message_id Message ID
- * @returns NULL in case of failure or newly allocated mesage ref
- **/
-MessageDef *itti_alloc_new_message(
- task_id_t origin_task_id,
- MessagesIds message_id);
-
-/** \brief Alloc and memset(0) a new itti message.
- * \param origin_task_id Task ID of the sending task
- * \param message_id Message ID
- * \param size size of the payload to send
- * @returns NULL in case of failure or newly allocated mesage ref
- **/
-MessageDef *itti_alloc_new_message_sized(
- task_id_t origin_task_id,
- MessagesIds message_id,
- MessageHeaderSize size);
-
-/** \brief handle signals and wait for all threads to join when the process complete.
- * This function should be called from the main thread after having created all ITTI tasks.
- **/
-void itti_wait_tasks_end(void);
-
-/** \brief Send a termination message to all tasks.
- * \param task_id task that is broadcasting the message.
- **/
-void itti_send_terminate_message(task_id_t task_id);
-
-void *itti_malloc(task_id_t origin_task_id, task_id_t destination_task_id, ssize_t size);
-
-int itti_free(task_id_t task_id, void *ptr);
-
-#endif /* INTERTASK_INTERFACE_H_ */
-/* @} */
diff --git a/common/utils/itti/intertask_interface_init.h b/common/utils/itti/intertask_interface_init.h
deleted file mode 100644
index dbd4e1b2ec..0000000000
--- a/common/utils/itti/intertask_interface_init.h
+++ /dev/null
@@ -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
- */
-
-/** @defgroup _intertask_interface_impl_ Intertask Interface Mechanisms
- * Implementation
- * @ingroup _ref_implementation_
- * @{
- */
-
-/********************************************************************************
- *
- * !!! This header should only be included by the file that initialize
- * the intertask interface module for the process !!!
- *
- * Other files should include "intertask_interface.h"
- *
- *******************************************************************************/
-
-#ifndef INTERTASK_INTERFACE_INIT_H_
-#define INTERTASK_INTERFACE_INIT_H_
-
-#include "intertask_interface.h"
-
-#ifndef CHECK_PROTOTYPE_ONLY
-
-/* Map task id to printable name. */
-const task_info_t tasks_info[] = {
- {0, TASK_UNKNOWN, 0, 0, "TASK_UNKNOWN"},
-#define TASK_DEF(tHREADiD, pRIO, qUEUEsIZE) { tHREADiD##_THREAD, TASK_UNKNOWN, pRIO, qUEUEsIZE, #tHREADiD },
-#define SUB_TASK_DEF(tHREADiD, sUBtASKiD, qUEUEsIZE) { sUBtASKiD##_THREAD, tHREADiD##_THREAD, 0, qUEUEsIZE, #sUBtASKiD },
-#include
-#undef SUB_TASK_DEF
-#undef TASK_DEF
-};
-
-/* Map message id to message information */
-const message_info_t messages_info[] = {
-#define MESSAGE_DEF(iD, pRIO, sTRUCT, fIELDnAME) { iD, pRIO, sizeof(sTRUCT), #iD },
-#include
-#undef MESSAGE_DEF
-};
-
-#endif
-
-/** \brief Init function for the intertask interface. Init queues, Mutexes and Cond vars.
- * \param thread_max Maximum number of threads
- * \param messages_id_max Maximum message id
- * \param threads_name Pointer on the threads name information as created by this include file
- * \param messages_info Pointer on messages information as created by this include file
- **/
-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);
-
-#endif /* INTERTASK_INTERFACE_INIT_H_ */
-/* @} */
diff --git a/common/utils/itti/intertask_interface_types.h b/common/utils/itti/intertask_interface_types.h
deleted file mode 100644
index af1b4e9aa9..0000000000
--- a/common/utils/itti/intertask_interface_types.h
+++ /dev/null
@@ -1,143 +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
- */
-
-/** @defgroup _intertask_interface_impl_ Intertask Interface Mechanisms
- * Implementation
- * @ingroup _ref_implementation_
- * @{
- */
-
-#ifndef INTERTASK_INTERFACE_TYPES_H_
-#define INTERTASK_INTERFACE_TYPES_H_
-
-#include "itti_types.h"
-#include "platform_types.h"
-
-/* Defines to handle bit fields on unsigned long values */
-#define UL_BIT_MASK(lENGTH) ((1UL << (lENGTH)) - 1UL)
-#define UL_BIT_SHIFT(vALUE, oFFSET) ((vALUE) << (oFFSET))
-#define UL_BIT_UNSHIFT(vALUE, oFFSET) ((vALUE) >> (oFFSET))
-
-#define UL_FIELD_MASK(oFFSET, lENGTH) UL_BIT_SHIFT(UL_BIT_MASK(lENGTH), (oFFSET))
-#define UL_FIELD_INSERT(vALUE, fIELD, oFFSET, lENGTH) (((vALUE) & (~UL_FIELD_MASK(oFFSET, lENGTH))) | UL_BIT_SHIFT(((fIELD) & UL_BIT_MASK(lENGTH)), oFFSET))
-#define UL_FIELD_EXTRACT(vALUE, oFFSET, lENGTH) (UL_BIT_UNSHIFT((vALUE), (oFFSET)) & UL_BIT_MASK(lENGTH))
-
-/* Definitions of task ID fields */
-#define TASK_THREAD_ID_OFFSET 8
-#define TASK_THREAD_ID_LENGTH 8
-
-#define TASK_SUB_TASK_ID_OFFSET 0
-#define TASK_SUB_TASK_ID_LENGTH 8
-
-/* Defines to extract task ID fields */
-#define TASK_GET_THREAD_ID(tASKiD) (itti_desc.tasks_info[tASKiD].thread)
-#define TASK_GET_PARENT_TASK_ID(tASKiD) (itti_desc.tasks_info[tASKiD].parent_task)
-/* Extract the instance from a message */
-#define ITTI_MESSAGE_GET_INSTANCE(mESSAGE) ((mESSAGE)->ittiMsgHeader.instance)
-
-#include
-
-/* This enum defines messages ids. Each one is unique. */
-typedef enum {
-#define MESSAGE_DEF(iD, pRIO, sTRUCT, fIELDnAME) iD,
-#include
-#undef MESSAGE_DEF
-
- MESSAGES_ID_MAX,
-} MessagesIds;
-
-//! Thread id of each task
-typedef enum {
- THREAD_NULL = 0,
-
-#define TASK_DEF(tHREADiD, pRIO, qUEUEsIZE) THREAD_##tHREADiD,
-#define SUB_TASK_DEF(tHREADiD, sUBtASKiD, qUEUEsIZE)
-#include
-#undef SUB_TASK_DEF
-#undef TASK_DEF
-
- THREAD_MAX,
- THREAD_FIRST = 1,
-} thread_id_t;
-
-//! Sub-tasks id, to defined offset form thread id
-typedef enum {
-#define TASK_DEF(tHREADiD, pRIO, qUEUEsIZE) tHREADiD##_THREAD = THREAD_##tHREADiD,
-#define SUB_TASK_DEF(tHREADiD, sUBtASKiD, qUEUEsIZE) sUBtASKiD##_THREAD = THREAD_##tHREADiD,
-#include
-#undef SUB_TASK_DEF
-#undef TASK_DEF
-} task_thread_id_t;
-
-//! Tasks id of each task
-typedef enum {
- TASK_UNKNOWN = 0,
-
-#define TASK_DEF(tHREADiD, pRIO, qUEUEsIZE) tHREADiD,
-#define SUB_TASK_DEF(tHREADiD, sUBtASKiD, qUEUEsIZE) sUBtASKiD,
-#include
-#undef SUB_TASK_DEF
-#undef TASK_DEF
-
- TASK_MAX,
- TASK_FIRST = 1,
-} task_id_t;
-
-typedef union msg_s {
-#define MESSAGE_DEF(iD, pRIO, sTRUCT, fIELDnAME) sTRUCT fIELDnAME;
-#include
-#undef MESSAGE_DEF
-} msg_t;
-
-typedef uint16_t MessageHeaderSize;
-
-typedef struct itti_lte_time_s {
- uint32_t frame;
- uint8_t slot;
-} itti_lte_time_t;
-
-/** @struct MessageHeader
- * @brief Message Header structure for inter-task communication.
- */
-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 */
-
- MessageHeaderSize ittiMsgSize; /**< Message size (not including header size) */
-
- itti_lte_time_t lte_time; /**< Reference LTE time */
-} MessageHeader;
-
-/** @struct MessageDef
- * @brief Message structure for inter-task communication.
- * \internal
- * The attached attribute \c __packed__ is neccessary, because the memory allocation code expects \ref ittiMsg directly following \ref ittiMsgHeader.
- */
-typedef struct __attribute__ ((__packed__)) MessageDef_s {
- MessageHeader ittiMsgHeader; /**< Message header */
- msg_t ittiMsg; /**< Union of payloads as defined in x_messages_def.h headers */
-} MessageDef;
-
-#endif /* INTERTASK_INTERFACE_TYPES_H_ */
-/* @} */
diff --git a/common/utils/itti/intertask_messages_def.h b/common/utils/itti/intertask_messages_def.h
deleted file mode 100644
index 57c344c813..0000000000
--- a/common/utils/itti/intertask_messages_def.h
+++ /dev/null
@@ -1,49 +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
- */
-
-/* This message asks for task initialization */
-MESSAGE_DEF(INITIALIZE_MESSAGE, MESSAGE_PRIORITY_MED, IttiMsgEmpty, initialize_message)
-
-/* This message asks for task activation */
-MESSAGE_DEF(ACTIVATE_MESSAGE, MESSAGE_PRIORITY_MED, IttiMsgEmpty, activate_message)
-
-/* This message asks for task deactivation */
-MESSAGE_DEF(DEACTIVATE_MESSAGE, MESSAGE_PRIORITY_MED, IttiMsgEmpty, deactivate_message)
-
-/* This message asks for task termination */
-MESSAGE_DEF(TERMINATE_MESSAGE, MESSAGE_PRIORITY_MAX, IttiMsgEmpty, terminate_message)
-
-/* Test message used for debug */
-MESSAGE_DEF(MESSAGE_TEST, MESSAGE_PRIORITY_MED, IttiMsgEmpty, message_test)
-
-/* Error message */
-MESSAGE_DEF(ERROR_LOG, MESSAGE_PRIORITY_MAX, IttiMsgEmpty, error_log)
-/* Warning message */
-MESSAGE_DEF(WARNING_LOG, MESSAGE_PRIORITY_MAX, IttiMsgEmpty, warning_log)
-/* Notice message */
-MESSAGE_DEF(NOTICE_LOG, MESSAGE_PRIORITY_MED, IttiMsgEmpty, notice_log)
-/* Info message */
-MESSAGE_DEF(INFO_LOG, MESSAGE_PRIORITY_MED, IttiMsgEmpty, info_log)
-/* Debug message */
-MESSAGE_DEF(DEBUG_LOG, MESSAGE_PRIORITY_MED, IttiMsgEmpty, debug_log)
-
-/* Generic log message for text */
-MESSAGE_DEF(GENERIC_LOG, MESSAGE_PRIORITY_MED, IttiMsgEmpty, generic_log)
diff --git a/common/utils/itti/intertask_messages_types.h b/common/utils/itti/intertask_messages_types.h
deleted file mode 100644
index 145f57648f..0000000000
--- a/common/utils/itti/intertask_messages_types.h
+++ /dev/null
@@ -1,40 +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
- */
-
-/*
- * intertask_messages_types.h
- *
- * Created on: Jan 14, 2014
- * Author: laurent winckel
- */
-
-#ifndef INTERTASK_MESSAGES_TYPES_H_
-#define INTERTASK_MESSAGES_TYPES_H_
-
-typedef struct IttiMsgEmpty_s {
-} IttiMsgEmpty;
-
-typedef struct IttiMsgText_s {
- uint32_t size;
- char text[];
-} IttiMsgText;
-
-#endif /* INTERTASK_MESSAGES_TYPES_H_ */
diff --git a/common/utils/itti/itti_types.h b/common/utils/itti/itti_types.h
deleted file mode 100644
index 2607c003b1..0000000000
--- a/common/utils/itti/itti_types.h
+++ /dev/null
@@ -1,82 +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
- */
-
-#ifndef _ITTI_TYPES_H_
-#define _ITTI_TYPES_H_
-
-/* The current file is included in the ue_ip.ko compilation.
- * For it to work we need to include linux/types.h and
- * not stdint.h.
- * A solution to this problem is to use #ifndef __KERNEL__.
- * Maybe a better solution would be to clean things up
- * so that ue_ip.ko does not include the current file.
- */
-#ifndef __KERNEL__
-# include
-#else
-# include
-#endif
-
-#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)
-
-#endif
-
diff --git a/common/utils/itti/messages_def.h b/common/utils/itti/messages_def.h
deleted file mode 100644
index f312669848..0000000000
--- a/common/utils/itti/messages_def.h
+++ /dev/null
@@ -1,26 +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
- */
-
-// These messages files are mandatory and must always be placed in first position
-#include "intertask_messages_def.h"
-#include "timer_messages_def.h"
-
-// Dummy file for the generic intertask interface definition. Actual definition should be in top level build directory.
diff --git a/common/utils/itti/signals.c b/common/utils/itti/signals.c
deleted file mode 100644
index f8dfe2d49b..0000000000
--- a/common/utils/itti/signals.c
+++ /dev/null
@@ -1,141 +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
-#include
-#include
-#include
-#include
-
-#include
-#include
-#include
-
-#include "intertask_interface.h"
-#include "timer.h"
-#include "backtrace.h"
-#include "assertions.h"
-
-#include "signals.h"
-#include "common/utils/LOG/log.h"
-
-#if defined (LOG_D) && defined (LOG_E)
-# define SIG_DEBUG(x, args...) LOG_D(RRC, x, ##args)
-# define SIG_ERROR(x, args...) LOG_E(RRC, x, ##args)
-#endif
-
-#ifndef SIG_DEBUG
-# define SIG_DEBUG(x, args...) do { fprintf(stdout, "[SIG][D]"x, ##args); } while(0)
-#endif
-#ifndef SIG_ERROR
-# define SIG_ERROR(x, args...) do { fprintf(stdout, "[SIG][E]"x, ##args); } while(0)
-#endif
-
-static sigset_t set;
-
-int signal_mask(void)
-{
- /* We set the signal mask to avoid threads other than the main thread
- * to receive the timer signal. Note that threads created will inherit this
- * configuration.
- */
- sigemptyset(&set);
-
- sigaddset (&set, SIGTIMER);
- sigaddset (&set, SIGUSR1);
- sigaddset (&set, SIGABRT);
- sigaddset (&set, SIGSEGV);
- sigaddset (&set, SIGINT);
-
- if (sigprocmask(SIG_BLOCK, &set, NULL) < 0) {
- perror ("sigprocmask");
- return -1;
- }
-
- return 0;
-}
-
-int signal_handle(int *end)
-{
- int ret;
- siginfo_t info;
-
- sigemptyset(&set);
-
- sigaddset (&set, SIGTIMER);
- sigaddset (&set, SIGUSR1);
- sigaddset (&set, SIGABRT);
- sigaddset (&set, SIGSEGV);
- sigaddset (&set, SIGINT);
-
- if (sigprocmask(SIG_BLOCK, &set, NULL) < 0) {
- perror ("sigprocmask");
- return -1;
- }
-
- /* Block till a signal is received.
- * NOTE: The signals defined by set are required to be blocked at the time
- * of the call to sigwait() otherwise sigwait() is not successful.
- */
- if ((ret = sigwaitinfo(&set, &info)) == -1) {
- perror ("sigwait");
- return ret;
- }
-
- //printf("Received signal %d\n", info.si_signo);
-
- /* Real-time signals are non constant and are therefore not suitable for
- * use in switch.
- */
- if (info.si_signo == SIGTIMER) {
- timer_handle_signal(&info);
- } else {
- /* Dispatch the signal to sub-handlers */
- switch(info.si_signo) {
- case SIGUSR1:
- SIG_DEBUG("Received SIGUSR1\n");
- *end = 1;
- break;
-
- case SIGSEGV: /* Fall through */
- case SIGABRT:
- SIG_DEBUG("Received SIGABORT\n");
- backtrace_handle_signal(&info);
- break;
-
- case SIGINT:
- printf("Received SIGINT\n");
- itti_send_terminate_message(TASK_UNKNOWN);
- *end = 1;
- break;
-
- default:
- SIG_ERROR("Received unknown signal %d\n", info.si_signo);
- break;
- }
- }
-
- return 0;
-}
diff --git a/common/utils/itti/tasks_def.h b/common/utils/itti/tasks_def.h
deleted file mode 100644
index d54d09a26a..0000000000
--- a/common/utils/itti/tasks_def.h
+++ /dev/null
@@ -1,25 +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
- */
-
-// This task is mandatory and must always be placed in first position
-TASK_DEF(TASK_TIMER, TASK_PRIORITY_MED, 10)
-
-// Dummy file for the generic intertask interface definition. Actual definition should be in top level build directory.
diff --git a/common/utils/itti/timer.c b/common/utils/itti/timer.c
deleted file mode 100644
index 720cf70d1f..0000000000
--- a/common/utils/itti/timer.c
+++ /dev/null
@@ -1,255 +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
-#include
-#include
-#include
-#include
-
-#include
-#include
-#include
-
-#include "assertions.h"
-#include "intertask_interface.h"
-#include "timer.h"
-#include "common/utils/LOG/log.h"
-#include "queue.h"
-
-#if defined (LOG_D) && defined (LOG_E)
-# define TMR_DEBUG(x, args...) LOG_D(TMR, x, ##args)
-# define TMR_ERROR(x, args...) LOG_E(TMR, x, ##args)
-#endif
-
-#ifndef TMR_DEBUG
-# define TMR_DEBUG(x, args...) do { fprintf(stdout, "[TMR][D]"x, ##args); } while(0)
-#endif
-#ifndef TMR_ERROR
-# define TMR_ERROR(x, args...) do { fprintf(stdout, "[TMR][E]"x, ##args); } while(0)
-#endif
-
-int timer_handle_signal(siginfo_t *info);
-
-struct timer_elm_s {
- task_id_t task_id; ///< Task ID which has requested the timer
- int32_t instance; ///< Instance of the task which has requested the timer
- timer_t timer; ///< Unique timer id
- timer_type_t type; ///< Timer type
- void *timer_arg; ///< Optional argument that will be passed when timer expires
- STAILQ_ENTRY(timer_elm_s) entries; ///< Pointer to next element
-};
-
-typedef struct timer_desc_s {
- STAILQ_HEAD(timer_list_head, timer_elm_s) timer_queue;
- pthread_mutex_t timer_list_mutex;
- struct timespec timeout;
-} timer_desc_t;
-
-static timer_desc_t timer_desc;
-
-#define TIMER_SEARCH(vAR, tIMERfIELD, tIMERvALUE, tIMERqUEUE) \
-do { \
- STAILQ_FOREACH(vAR, tIMERqUEUE, entries) { \
- if (((vAR)->tIMERfIELD == tIMERvALUE)) \
- break; \
- } \
-} while(0)
-
-int timer_handle_signal(siginfo_t *info)
-{
- struct timer_elm_s *timer_p;
- MessageDef *message_p;
- timer_has_expired_t *timer_expired_p;
- task_id_t task_id;
- int32_t instance;
-
- /* Get back pointer to timer list element */
- timer_p = (struct timer_elm_s *)info->si_ptr;
-
- // LG: To many traces for msc timer:
- TMR_DEBUG("Timer with id 0x%lx has expired\n", (long)timer_p->timer);
-
- task_id = timer_p->task_id;
- instance = timer_p->instance;
- message_p = itti_alloc_new_message(TASK_TIMER, TIMER_HAS_EXPIRED);
-
- timer_expired_p = &message_p->ittiMsg.timer_has_expired;
-
- timer_expired_p->timer_id = (long)timer_p->timer;
- timer_expired_p->arg = timer_p->timer_arg;
-
- /* Timer is a one shot timer, remove it */
- if (timer_p->type == TIMER_ONE_SHOT) {
- // if (timer_delete(timer_p->timer) < 0) {
- // TMR_DEBUG("Failed to delete timer 0x%lx\n", (long)timer_p->timer);
- // }
- // TMR_DEBUG("Removed timer 0x%lx\n", (long)timer_p->timer);
- // pthread_mutex_lock(&timer_desc.timer_list_mutex);
- // STAILQ_REMOVE(&timer_desc.timer_queue, timer_p, timer_elm_s, entries);
- // pthread_mutex_unlock(&timer_desc.timer_list_mutex);
- // free(timer_p);
- // timer_p = NULL;
- if (timer_remove((long)timer_p->timer) != 0) {
- TMR_DEBUG("Failed to delete timer 0x%lx\n", (long)timer_p->timer);
- }
- }
-
- /* Notify task of timer expiry */
- if (itti_send_msg_to_task(task_id, instance, message_p) < 0) {
- TMR_DEBUG("Failed to send msg TIMER_HAS_EXPIRED to task %u\n", task_id);
- free(message_p);
- return -1;
- }
-
-#if defined(ENB_AGENT_SB_IF)
-
-#endif
-
- return 0;
-}
-
-int timer_setup(
- uint32_t interval_sec,
- uint32_t interval_us,
- task_id_t task_id,
- int32_t instance,
- timer_type_t type,
- void *timer_arg,
- long *timer_id)
-{
- struct sigevent se;
- struct itimerspec its;
- struct timer_elm_s *timer_p;
- timer_t timer;
-
- if (timer_id == NULL) {
- return -1;
- }
-
- AssertFatal (type < TIMER_TYPE_MAX, "Invalid timer type (%d/%d)!\n", type, TIMER_TYPE_MAX);
-
- /* Allocate new timer list element */
- timer_p = malloc(sizeof(struct timer_elm_s));
-
- if (timer_p == NULL) {
- TMR_ERROR("Failed to create new timer element\n");
- return -1;
- }
-
- memset(&timer, 0, sizeof(timer_t));
- memset(&se, 0, sizeof(struct sigevent));
-
- timer_p->task_id = task_id;
- timer_p->instance = instance;
- timer_p->type = type;
- timer_p->timer_arg = timer_arg;
-
- /* Setting up alarm */
- /* Set and enable alarm */
- se.sigev_notify = SIGEV_SIGNAL;
- se.sigev_signo = SIGTIMER;
- se.sigev_value.sival_ptr = timer_p;
-
- /* At the timer creation, the timer structure will be filled in with timer_id,
- * which is unique for this process. This id is allocated by kernel and the
- * value might be used to distinguish timers.
- */
- if (timer_create(CLOCK_REALTIME, &se, &timer) < 0) {
- TMR_ERROR("Failed to create timer: (%s:%d)\n", strerror(errno), errno);
- free(timer_p);
- return -1;
- }
-
- /* Fill in the first expiration value. */
- its.it_value.tv_sec = interval_sec;
- its.it_value.tv_nsec = interval_us * 1000;
-
- if (type == TIMER_PERIODIC) {
- /* Asked for periodic timer. We set the interval time */
- its.it_interval.tv_sec = interval_sec;
- its.it_interval.tv_nsec = interval_us * 1000;
- } else {
- /* Asked for one-shot timer. Do not set the interval field */
- its.it_interval.tv_sec = 0;
- its.it_interval.tv_nsec = 0;
- }
-
- timer_settime(timer, 0, &its, NULL);
- /* Simply set the timer_id argument. so it can be used by caller */
- *timer_id = (long)timer;
- TMR_DEBUG("Requesting new %s timer with id 0x%lx that expires within "
- "%d sec and %d usec\n",
- type == TIMER_PERIODIC ? "periodic" : "single shot",
- *timer_id, interval_sec, interval_us);
-
- timer_p->timer = timer;
-
- /* Lock the queue and insert the timer at the tail */
- pthread_mutex_lock(&timer_desc.timer_list_mutex);
- STAILQ_INSERT_TAIL(&timer_desc.timer_queue, timer_p, entries);
- pthread_mutex_unlock(&timer_desc.timer_list_mutex);
-
- return 0;
-}
-
-int timer_remove(long timer_id)
-{
- int rc = 0;
- struct timer_elm_s *timer_p;
-
- TMR_DEBUG("Removing timer 0x%lx\n", timer_id);
-
- pthread_mutex_lock(&timer_desc.timer_list_mutex);
- TIMER_SEARCH(timer_p, timer, ((timer_t)timer_id), &timer_desc.timer_queue);
-
- /* We didn't find the timer in list */
- if (timer_p == NULL) {
- pthread_mutex_unlock(&timer_desc.timer_list_mutex);
- TMR_ERROR("Didn't find timer 0x%lx in list\n", timer_id);
- return -1;
- }
-
- STAILQ_REMOVE(&timer_desc.timer_queue, timer_p, timer_elm_s, entries);
- pthread_mutex_unlock(&timer_desc.timer_list_mutex);
-
- if (timer_delete(timer_p->timer) < 0) {
- TMR_ERROR("Failed to delete timer 0x%lx\n", (long)timer_p->timer);
- rc = -1;
- }
-
- free(timer_p);
- timer_p = NULL;
- return rc;
-}
-
-int timer_init(void)
-{
- TMR_DEBUG("Initializing TIMER task interface\n");
-
- memset(&timer_desc, 0, sizeof(timer_desc_t));
-
- STAILQ_INIT(&timer_desc.timer_queue);
- pthread_mutex_init(&timer_desc.timer_list_mutex, NULL);
-
- TMR_DEBUG("Initializing TIMER task interface: DONE\n");
- return 0;
-}
diff --git a/common/utils/itti/timer.h b/common/utils/itti/timer.h
deleted file mode 100644
index 4f568a348c..0000000000
--- a/common/utils/itti/timer.h
+++ /dev/null
@@ -1,69 +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 TIMER_H_
-#define TIMER_H_
-
-#include
-
-#define SIGTIMER SIGRTMIN
-
-typedef enum timer_type_s {
- TIMER_PERIODIC,
- TIMER_ONE_SHOT,
- TIMER_TYPE_MAX,
-} timer_type_t;
-
-int timer_handle_signal(siginfo_t *info);
-
-/** \brief Request a new timer
- * \param interval_sec timer interval in seconds
- * \param interval_us timer interval in micro seconds
- * \param task_id task id of the task requesting the timer
- * \param instance instance of the task requesting the timer
- * \param type timer type
- * \param timer_id unique timer identifier
- * @returns -1 on failure, 0 otherwise
- **/
-int timer_setup(
- uint32_t interval_sec,
- uint32_t interval_us,
- task_id_t task_id,
- int32_t instance,
- timer_type_t type,
- void *timer_arg,
- long *timer_id);
-
-/** \brief Remove the timer from list
- * \param timer_id unique timer id
- * @returns -1 on failure, 0 otherwise
- **/
-
-int timer_remove(long timer_id);
-#define timer_stop timer_remove
-
-/** \brief Initialize timer task and its API
- * \param mme_config MME common configuration
- * @returns -1 on failure, 0 otherwise
- **/
-int timer_init(void);
-
-#endif
diff --git a/common/utils/itti/timer_messages_def.h b/common/utils/itti/timer_messages_def.h
deleted file mode 100644
index 761034730d..0000000000
--- a/common/utils/itti/timer_messages_def.h
+++ /dev/null
@@ -1,22 +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
- */
-
-MESSAGE_DEF(TIMER_HAS_EXPIRED, MESSAGE_PRIORITY_MED_PLUS, timer_has_expired_t, timer_has_expired)
diff --git a/common/utils/itti/timer_messages_types.h b/common/utils/itti/timer_messages_types.h
deleted file mode 100644
index 0d06e3eebf..0000000000
--- a/common/utils/itti/timer_messages_types.h
+++ /dev/null
@@ -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
- */
-
-#ifndef TIMER_MESSAGES_TYPES_H_
-#define TIMER_MESSAGES_TYPES_H_
-
-//-------------------------------------------------------------------------------------------//
-// Defines to access message fields.
-#define TIMER_HAS_EXPIRED(mSGpTR) (mSGpTR)->ittiMsg.timer_has_expired
-
-//-------------------------------------------------------------------------------------------//
-typedef struct {
- void *arg;
- long timer_id;
-} timer_has_expired_t;
-
-#endif /* TIMER_MESSAGES_TYPES_H_ */
diff --git a/common/utils/load_module_shlib.c b/common/utils/load_module_shlib.c
index c0afdb0b64..a4b4742c94 100644
--- a/common/utils/load_module_shlib.c
+++ b/common/utils/load_module_shlib.c
@@ -120,75 +120,116 @@ int ret;
int load_module_shlib(char *modname,loader_shlibfunc_t *farray, int numf, void *autoinit_arg)
{
- void *lib_handle;
- initfunc_t fpi;
- checkverfunc_t fpc;
- getfarrayfunc_t fpg;
- char *shlib_path;
- char *afname=NULL;
- int ret=0;
+ void *lib_handle = NULL;
+ initfunc_t fpi;
+ checkverfunc_t fpc;
+ getfarrayfunc_t fpg;
+ char *shlib_path = NULL;
+ char *afname = NULL;
+ int ret = 0;
+ int lib_idx = -1;
- if (loader_data.shlibpath == NULL) {
- loader_init();
- }
+ if (!modname) {
+ fprintf(stderr, "[LOADER] load_module_shlib(): no library name given\n");
+ return -1;
+ }
- shlib_path = loader_format_shlibpath(modname);
+ if (!loader_data.shlibpath) {
+ loader_init();
+ }
- ret = 0;
- lib_handle = dlopen(shlib_path, RTLD_LAZY|RTLD_NODELETE|RTLD_GLOBAL);
- if (!lib_handle) {
- fprintf(stderr,"[LOADER] library %s is not loaded: %s\n", shlib_path,dlerror());
+ shlib_path = loader_format_shlibpath(modname);
+
+ for (int i = 0; i < loader_data.numshlibs; i++) {
+ if (strcmp(loader_data.shlibs[i].name, modname) == 0) {
+ printf("[LOADER] library %s has been loaded previously, reloading function pointers\n",
+ shlib_path);
+ lib_idx = i;
+ break;
+ }
+ }
+ if (lib_idx < 0) {
+ lib_idx = loader_data.numshlibs;
+ ++loader_data.numshlibs;
+ if (loader_data.numshlibs > loader_data.maxshlibs) {
+ fprintf(stderr, "[LOADER] can not load more than %d shlibs\n",
+ loader_data.maxshlibs);
ret = -1;
- } else {
- printf("[LOADER] library %s successfully loaded\n", shlib_path);
- afname=malloc(strlen(modname)+15);
- sprintf(afname,"%s_checkbuildver",modname);
- fpc = dlsym(lib_handle,afname);
- if (fpc != NULL ){
- int chkver_ret = fpc(loader_data.mainexec_buildversion, &(loader_data.shlibs[loader_data.numshlibs].shlib_buildversion));
- if (chkver_ret < 0) {
- fprintf(stderr,"[LOADER] %s %d lib %s, version mismatch",__FILE__, __LINE__, modname);
- exit_fun("[LOADER] unrecoverable error");
- }
+ goto load_module_shlib_exit;
+ }
+ loader_data.shlibs[lib_idx].name = strdup(modname);
+ loader_data.shlibs[lib_idx].thisshlib_path = strdup(shlib_path);
+ }
+
+ lib_handle = dlopen(shlib_path, RTLD_LAZY|RTLD_NODELETE|RTLD_GLOBAL);
+ if (!lib_handle) {
+ fprintf(stderr,"[LOADER] library %s is not loaded: %s\n", shlib_path,dlerror());
+ ret = -1;
+ goto load_module_shlib_exit;
+ }
+
+ printf("[LOADER] library %s successfully loaded\n", shlib_path);
+ afname = malloc(strlen(modname)+15);
+ if (!afname) {
+ fprintf(stderr, "[LOADER] unable to allocate memory for library %s\n", shlib_path);
+ ret = -1;
+ goto load_module_shlib_exit;
+ }
+ sprintf(afname,"%s_checkbuildver",modname);
+ fpc = dlsym(lib_handle,afname);
+ if (fpc) {
+ int chkver_ret = fpc(loader_data.mainexec_buildversion,
+ &(loader_data.shlibs[lib_idx].shlib_buildversion));
+ if (chkver_ret < 0) {
+ fprintf(stderr, "[LOADER] %s %d lib %s, version mismatch",
+ __FILE__, __LINE__, modname);
+ ret = -1;
+ goto load_module_shlib_exit;
+ }
+ }
+ sprintf(afname,"%s_autoinit",modname);
+ fpi = dlsym(lib_handle,afname);
+
+ if (fpi) {
+ fpi(autoinit_arg);
+ }
+
+ if (farray) {
+ if (!loader_data.shlibs[lib_idx].funcarray) {
+ loader_data.shlibs[lib_idx].funcarray = malloc(numf*sizeof(loader_shlibfunc_t));
+ if (!loader_data.shlibs[lib_idx].funcarray) {
+ fprintf(stderr, "[LOADER] load_module_shlib(): unable to allocate memory\n");
+ ret = -1;
+ goto load_module_shlib_exit;
}
- sprintf(afname,"%s_autoinit",modname);
- fpi = dlsym(lib_handle,afname);
-
- if (fpi != NULL ) {
- fpi(autoinit_arg);
+ }
+ loader_data.shlibs[lib_idx].numfunc = 0;
+ for (int i = 0; i < numf; i++) {
+ farray[i].fptr = dlsym(lib_handle,farray[i].fname);
+ if (!farray[i].fptr) {
+ fprintf(stderr, "[LOADER] load_module_shlib(): function %s not found: %s\n",
+ farray[i].fname, dlerror());
+ ret = -1;
+ goto load_module_shlib_exit;
}
+ loader_data.shlibs[lib_idx].funcarray[i].fname=strdup(farray[i].fname);
+ loader_data.shlibs[lib_idx].funcarray[i].fptr = farray[i].fptr;
+ loader_data.shlibs[lib_idx].numfunc++;
+ } /* for int i... */
+ } else { /* farray ! NULL */
+ sprintf(afname,"%s_getfarray",modname);
+ fpg = dlsym(lib_handle,afname);
+ if (fpg) {
+ loader_data.shlibs[lib_idx].numfunc =
+ fpg(&(loader_data.shlibs[lib_idx].funcarray));
+ }
+ } /* farray ! NULL */
- if (farray != NULL) {
- loader_data.shlibs[loader_data.numshlibs].funcarray=malloc(numf*sizeof(loader_shlibfunc_t));
- loader_data.shlibs[loader_data.numshlibs].numfunc=0;
- for (int i=0; i
+#include