Commit f8ab4080 authored by Louis Adrien Dufrene's avatar Louis Adrien Dufrene

Merge from develop + modification of a X2AP file for code to compile

parents c7bce0f8 6a47f9e7
...@@ -61,3 +61,4 @@ v1.0.0 -> January 2019. This version first implements the architectural split de ...@@ -61,3 +61,4 @@ v1.0.0 -> January 2019. This version first implements the architectural split de
S1-flex has been introduced. S1-flex has been introduced.
New tools: config library, telnet server, ... New tools: config library, telnet server, ...
A lot of bugfixes and a proper automated Continuous Integration process validates contributions. A lot of bugfixes and a proper automated Continuous Integration process validates contributions.
v1.0.1 -> February 2019: Bug fix for the UE L1 simulator.
...@@ -104,6 +104,7 @@ pipeline { ...@@ -104,6 +104,7 @@ pipeline {
} else { } else {
echo "Git Branch is ${GIT_BRANCH}" echo "Git Branch is ${GIT_BRANCH}"
echo "Git Commit is ${GIT_COMMIT}" echo "Git Commit is ${GIT_COMMIT}"
sh "git log -n1 --pretty=format:\"%s\" > .git/CI_COMMIT_MSG"
sh "zip -r -qq localZip.zip ." sh "zip -r -qq localZip.zip ."
// Running astyle options on all C/H files in the repository // Running astyle options on all C/H files in the repository
...@@ -260,7 +261,7 @@ pipeline { ...@@ -260,7 +261,7 @@ pipeline {
expression {doRedHatBuild} expression {doRedHatBuild}
} }
steps { steps {
gitlabCommitStatus(name: "Build eNb-USRP-CentOS") { gitlabCommitStatus(name: "Build eNb-USRP-RHE") {
script { script {
try { try {
withCredentials([ withCredentials([
...@@ -572,6 +573,10 @@ OAI CI Team''', ...@@ -572,6 +573,10 @@ OAI CI Team''',
replyTo: 'no-reply@openairinterface.org', replyTo: 'no-reply@openairinterface.org',
subject: '$PROJECT_NAME - Build # $BUILD_NUMBER - $BUILD_STATUS!', subject: '$PROJECT_NAME - Build # $BUILD_NUMBER - $BUILD_STATUS!',
to: env.gitlabUserEmail to: env.gitlabUserEmail
if (fileExists('.git/CI_COMMIT_MSG')) {
sh "rm -f .git/CI_COMMIT_MSG"
}
} }
} }
success { success {
......
// *INDENT-OFF* cppcheck doesn't like "astyling" this file!!!!
// /*
// * 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
// */
//*****************************************************************************
//*****************************************************************************
// section for "valid" memory leaks: the related functions are allocators and
// the caller is responsible of freeing the memory. cppcheck has a mechanism
// to check more accuretaly this, by defining callers responsible of freeing
// but tools like valgring might be more suitable
//
//-----------------------------------------------------------------------------
// suppress error about keysP memory leak, free must be done by calling func
memleak:common/utils/hashtable/obj_hashtable.c
//-----------------------------------------------------------------------------
// suppress error about keys memory leak, free must be done by calling func
memleak:openair2/UTIL/OMG/omg_hashtable.c
//-----------------------------------------------------------------------------
// suppress error about data memory leak. This is the buffer where
// _emm_as_encode function creates the encoded buffer
//
memleak:openair3/NAS/UE/EMM/SAP/emm_as.c
//-----------------------------------------------------------------------------
//*****************************************************************************
// section for files not used in oai exec's included in CI.
// Possibly candidates for removal otherwise should be documented and updated
// for project rules enforcement
// ----------------------------------------------------------------------------
// likely sources for test programs, maintained?
invalidPrintfArgType_sint:openair1/PHY/CODING/TESTBENCH/ltetest.c
memleak:openair1/PHY/CODING/TESTBENCH/ltetest.c
invalidPrintfArgType_sint:openair1/PHY/CODING/TESTBENCH/pdcch_test.c
//
//-----------------------------------------------------------------------------
// oaisim deprecated, remove?
doubleFree:openair3/TEST/oaisim_mme_list_benchmark.c
//
//-----------------------------------------------------------------------------
// is itti analyzer deprecated
nullPointer:common/utils/itti_analyzer/itti_analyzer.c
nullPointerRedundantCheck:common/utils/itti_analyzer/libbuffers/buffers.c
doubleFree:common/utils/itti_analyzer/libbuffers/socket.c
memleak:common/utils/itti_analyzer/libbuffers/socket.c
memleak:common/utils/itti_analyzer/libparser/array_type.c
memleak:common/utils/itti_analyzer/libui/ui_callbacks.c
//-----------------------------------------------------------------------------
// obviously never even compiled!!!
syntaxError:openair1/SIMULATION/LTE_PHY/dlsim_tm4.c
//-----------------------------------------------------------------------------
// omg, otg commented out in cmakelist to be cleaned up definitely?
arrayIndexOutOfBounds:openair2/UTIL/OMG/omg.c
uninitvar:openair2/UTIL/OTG/otg_rx_socket.c
//
//*****************************************************************************
//
// True problems we don't know how to fix, Suppression is commented out,
// as these kind of problem need either to be fixed or can be suppressed
// when fully uderstood
//-----------------------------------------------------------------------------
// the function [nv]fapi_pnf_p7_config_create should return
// _this. _this points to a structure and a dynamically allocated field is
// returned. cppcheck suspects _this will never be released, so do i
// memleak:nfapi/open-nFAPI/pnf/src/pnf_p7_interface.c
// memleak:nfapi/open-nFAPI/vnf/src/vnf_p7_interface.c
//-----------------------------------------------------------------------------
// may be security_data->kenb.value is released from calling functions. But even
// when, for test, freeing it before returning from emm_proc_security_mode_command
// which does the allocation, cppcheck complains. So something might be wrong...
// memleak:openair3/NAS/UE/EMM/SecurityModeControl.c
//-----------------------------------------------------------------------------
// when used, nobody but the original developer can guess if sn_data_cnf is set or not
// cppcheck found that in some cases it is not, code needs cleanup before fixing that...
// uninitvar:openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_status_report.c
//*****************************************************************************
// *INDENT-ON*
...@@ -121,6 +121,7 @@ git config user.email "jenkins@openairinterface.org" ...@@ -121,6 +121,7 @@ git config user.email "jenkins@openairinterface.org"
git config user.name "OAI Jenkins" git config user.name "OAI Jenkins"
git checkout -f $SOURCE_COMMIT_ID git checkout -f $SOURCE_COMMIT_ID
git log -n1 --pretty=format:\"%s\" > .git/CI_COMMIT_MSG
git merge --ff $TARGET_COMMIT_ID -m "Temporary merge for CI" git merge --ff $TARGET_COMMIT_ID -m "Temporary merge for CI"
......
...@@ -264,7 +264,7 @@ case $key in ...@@ -264,7 +264,7 @@ case $key in
ARCHIVES_LOC=cppcheck ARCHIVES_LOC=cppcheck
LOG_PATTERN=cppcheck.xml LOG_PATTERN=cppcheck.xml
NB_PATTERN_FILES=1 NB_PATTERN_FILES=1
BUILD_OPTIONS="--enable=warning --force --xml --xml-version=2" BUILD_OPTIONS="--enable=warning --force --xml --xml-version=2 --suppressions-list=ci-scripts/cppcheck_suppressions.list"
NBARGS=$[$NBARGS+256] NBARGS=$[$NBARGS+256]
shift shift
;; ;;
...@@ -340,11 +340,11 @@ case $key in ...@@ -340,11 +340,11 @@ case $key in
;; ;;
cppcheck) cppcheck)
VM_NAME=ci-cppcheck VM_NAME=ci-cppcheck
VM_MEMORY=8192 VM_MEMORY=4096
ARCHIVES_LOC=cppcheck ARCHIVES_LOC=cppcheck
LOG_PATTERN=cppcheck.xml LOG_PATTERN=cppcheck.xml
NB_PATTERN_FILES=1 NB_PATTERN_FILES=1
BUILD_OPTIONS="--enable=warning --force --xml --xml-version=2" BUILD_OPTIONS="--enable=warning --force --xml --xml-version=2 --suppressions-list=ci-scripts/cppcheck_suppressions.list"
NBARGS=$[$NBARGS+256] NBARGS=$[$NBARGS+256]
;; ;;
enb-ethernet) enb-ethernet)
......
...@@ -363,6 +363,14 @@ function report_build { ...@@ -363,6 +363,14 @@ function report_build {
echo " <td bgcolor = \"lightcyan\" > <span class=\"glyphicon glyphicon-tag\"></span> Commit ID</td>" >> ./build_results.html echo " <td bgcolor = \"lightcyan\" > <span class=\"glyphicon glyphicon-tag\"></span> Commit ID</td>" >> ./build_results.html
echo " <td>$SOURCE_COMMIT_ID</td>" >> ./build_results.html echo " <td>$SOURCE_COMMIT_ID</td>" >> ./build_results.html
echo " </tr>" >> ./build_results.html echo " </tr>" >> ./build_results.html
if [ -e .git/CI_COMMIT_MSG ]
then
echo " <tr>" >> ./build_results.html
echo " <td bgcolor = \"lightcyan\" > <span class=\"glyphicon glyphicon-comment\"></span> Commit Message</td>" >> ./build_results.html
MSG=`cat .git/CI_COMMIT_MSG`
echo " <td>$MSG</td>" >> ./build_results.html
echo " </tr>" >> ./build_results.html
fi
fi fi
if [ $MR_TRIG -eq 1 ] if [ $MR_TRIG -eq 1 ]
then then
...@@ -374,6 +382,14 @@ function report_build { ...@@ -374,6 +382,14 @@ function report_build {
echo " <td bgcolor = \"lightcyan\" > <span class=\"glyphicon glyphicon-tag\"></span> Source Commit ID</td>" >> ./build_results.html echo " <td bgcolor = \"lightcyan\" > <span class=\"glyphicon glyphicon-tag\"></span> Source Commit ID</td>" >> ./build_results.html
echo " <td>$SOURCE_COMMIT_ID</td>" >> ./build_results.html echo " <td>$SOURCE_COMMIT_ID</td>" >> ./build_results.html
echo " </tr>" >> ./build_results.html echo " </tr>" >> ./build_results.html
if [ -e .git/CI_COMMIT_MSG ]
then
echo " <tr>" >> ./build_results.html
echo " <td bgcolor = \"lightcyan\" > <span class=\"glyphicon glyphicon-comment\"></span> Source Commit Message</td>" >> ./build_results.html
MSG=`cat .git/CI_COMMIT_MSG`
echo " <td>$MSG</td>" >> ./build_results.html
echo " </tr>" >> ./build_results.html
fi
echo " <tr>" >> ./build_results.html echo " <tr>" >> ./build_results.html
echo " <td bgcolor = \"lightcyan\" > <span class=\"glyphicon glyphicon-log-in\"></span> Target Branch</td>" >> ./build_results.html echo " <td bgcolor = \"lightcyan\" > <span class=\"glyphicon glyphicon-log-in\"></span> Target Branch</td>" >> ./build_results.html
echo " <td>$TARGET_BRANCH</td>" >> ./build_results.html echo " <td>$TARGET_BRANCH</td>" >> ./build_results.html
...@@ -492,7 +508,7 @@ function report_build { ...@@ -492,7 +508,7 @@ function report_build {
if [ -e ./archives/red_hat ] if [ -e ./archives/red_hat ]
then then
echo " <h2>Red Hat (CentOS Linux release 7.4.1708) -- Summary</h2>" >> ./build_results.html echo " <h2>Red Hat Enterprise Linux Server release 7.6) -- Summary</h2>" >> ./build_results.html
summary_table_header "Red Hat -- OAI Build eNB -- USRP option" ./archives/red_hat summary_table_header "Red Hat -- OAI Build eNB -- USRP option" ./archives/red_hat
summary_table_row "LTE SoftModem - Release 14" ./archives/red_hat/lte-softmodem.Rel14.txt "Built target lte-softmodem" ./enb_usrp_rh_row1.html summary_table_row "LTE SoftModem - Release 14" ./archives/red_hat/lte-softmodem.Rel14.txt "Built target lte-softmodem" ./enb_usrp_rh_row1.html
......
...@@ -139,6 +139,14 @@ function report_test { ...@@ -139,6 +139,14 @@ function report_test {
echo " <td bgcolor = \"lightcyan\" > <span class=\"glyphicon glyphicon-tag\"></span> Commit ID</td>" >> ./test_simulator_results.html echo " <td bgcolor = \"lightcyan\" > <span class=\"glyphicon glyphicon-tag\"></span> Commit ID</td>" >> ./test_simulator_results.html
echo " <td>$SOURCE_COMMIT_ID</td>" >> ./test_simulator_results.html echo " <td>$SOURCE_COMMIT_ID</td>" >> ./test_simulator_results.html
echo " </tr>" >> ./test_simulator_results.html echo " </tr>" >> ./test_simulator_results.html
if [ -e .git/CI_COMMIT_MSG ]
then
echo " <tr>" >> ./test_simulator_results.html
echo " <td bgcolor = \"lightcyan\" > <span class=\"glyphicon glyphicon-comment\"></span> Commit Message</td>" >> ./test_simulator_results.html
MSG=`cat .git/CI_COMMIT_MSG`
echo " <td>$MSG</td>" >> ./test_simulator_results.html
echo " </tr>" >> ./test_simulator_results.html
fi
fi fi
if [ $MR_TRIG -eq 1 ] if [ $MR_TRIG -eq 1 ]
then then
...@@ -150,6 +158,14 @@ function report_test { ...@@ -150,6 +158,14 @@ function report_test {
echo " <td bgcolor = \"lightcyan\" > <span class=\"glyphicon glyphicon-tag\"></span> Source Commit ID</td>" >> ./test_simulator_results.html echo " <td bgcolor = \"lightcyan\" > <span class=\"glyphicon glyphicon-tag\"></span> Source Commit ID</td>" >> ./test_simulator_results.html
echo " <td>$SOURCE_COMMIT_ID</td>" >> ./test_simulator_results.html echo " <td>$SOURCE_COMMIT_ID</td>" >> ./test_simulator_results.html
echo " </tr>" >> ./test_simulator_results.html echo " </tr>" >> ./test_simulator_results.html
if [ -e .git/CI_COMMIT_MSG ]
then
echo " <tr>" >> ./test_simulator_results.html
echo " <td bgcolor = \"lightcyan\" > <span class=\"glyphicon glyphicon-comment\"></span> Commit Message</td>" >> ./test_simulator_results.html
MSG=`cat .git/CI_COMMIT_MSG`
echo " <td>$MSG</td>" >> ./test_simulator_results.html
echo " </tr>" >> ./test_simulator_results.html
fi
echo " <tr>" >> ./test_simulator_results.html echo " <tr>" >> ./test_simulator_results.html
echo " <td bgcolor = \"lightcyan\" > <span class=\"glyphicon glyphicon-log-in\"></span> Target Branch</td>" >> ./test_simulator_results.html echo " <td bgcolor = \"lightcyan\" > <span class=\"glyphicon glyphicon-log-in\"></span> Target Branch</td>" >> ./test_simulator_results.html
echo " <td>$TARGET_BRANCH</td>" >> ./test_simulator_results.html echo " <td>$TARGET_BRANCH</td>" >> ./test_simulator_results.html
......
...@@ -569,6 +569,7 @@ function start_l2_sim_enb { ...@@ -569,6 +569,7 @@ function start_l2_sim_enb {
ENB_SYNC=1 ENB_SYNC=1
echo "L2-SIM eNB is sync'ed: waiting for UE(s) to connect" echo "L2-SIM eNB is sync'ed: waiting for UE(s) to connect"
fi fi
sleep 10
} }
function start_l2_sim_ue { function start_l2_sim_ue {
...@@ -604,10 +605,34 @@ function start_l2_sim_ue { ...@@ -604,10 +605,34 @@ function start_l2_sim_ue {
if [ $i -lt 50 ] if [ $i -lt 50 ]
then then
UE_SYNC=0 UE_SYNC=0
echo "L2-SIM UE is NOT sync'ed w/eNB" echo "L2-SIM UE is NOT sync'ed w/ eNB"
return
else
UE_SYNC=1
echo "L2-SIM UE is sync'ed w/ eNB"
fi
# Checking oip1 interface has now an IP address
i="0"
echo "ifconfig oip1 | egrep -c \"inet addr\"" > $1
while [ $i -lt 10 ]
do
sleep 5
CONNECTED=`ssh -o StrictHostKeyChecking=no ubuntu@$LOC_VM_IP_ADDR < $1`
if [ $CONNECTED -eq 1 ]
then
i="100"
else
i=$[$i+1]
fi
done
rm $1
if [ $i -lt 50 ]
then
UE_SYNC=0
echo "L2-SIM UE oip1 is NOT sync'ed w/ EPC"
else else
UE_SYNC=1 UE_SYNC=1
echo "L2-SIM UE is sync'ed w/eNB" echo "L2-SIM UE oip1 is sync'ed w/ EPC"
fi fi
sleep 10 sleep 10
} }
......
...@@ -102,6 +102,7 @@ check_supported_distribution() { ...@@ -102,6 +102,7 @@ check_supported_distribution() {
"ubuntu14.04") return 0 ;; "ubuntu14.04") return 0 ;;
"fedora24") return 0 ;; "fedora24") return 0 ;;
"rhel7") return 0 ;; "rhel7") return 0 ;;
"rhel7.6") return 0 ;;
"centos7") return 0 ;; "centos7") return 0 ;;
esac esac
return 1 return 1
...@@ -310,10 +311,20 @@ install_usrp_uhd_driver() { ...@@ -310,10 +311,20 @@ install_usrp_uhd_driver() {
# On newer kernels, it fails to install # On newer kernels, it fails to install
$SUDO apt-get -y install uhd-host $SUDO apt-get -y install uhd-host
fi fi
# quick workaround for RHE7.6
local distribution=$(get_distribution_release)
if [ -z $1 ]; then if [ -z $1 ]; then
$SUDO uhd_images_downloader if [[ "$distribution" == "rhel7.6" ]]; then
$SUDO /usr/local/bin/uhd_images_downloader
else
$SUDO uhd_images_downloader
fi
else else
$SUDO uhd_images_downloader -i $1 if [[ "$distribution" == "rhel7.6" ]]; then
$SUDO /usr/local/bin/uhd_images_downloader -i $1
else
$SUDO uhd_images_downloader -i $1
fi
fi fi
} }
......
...@@ -166,13 +166,14 @@ int config_check_unknown_cmdlineopt(char *prefix) { ...@@ -166,13 +166,14 @@ int config_check_unknown_cmdlineopt(char *prefix) {
int unknowndetected=0; int unknowndetected=0;
char testprefix[CONFIG_MAXOPTLENGTH]; char testprefix[CONFIG_MAXOPTLENGTH];
int finalcheck = 0; int finalcheck = 0;
memset(testprefix,0,sizeof(testprefix));
memset(testprefix,0,sizeof(testprefix)); memset(testprefix,0,sizeof(testprefix));
if (prefix != NULL) { if (prefix != NULL) {
if (strcmp(prefix,CONFIG_CHECKALLSECTIONS) == 0) if (strcmp(prefix,CONFIG_CHECKALLSECTIONS) == 0)
finalcheck = 1; finalcheck = 1;
else if (strlen(prefix) > 0) { else if (strlen(prefix) > 0) {
sprintf(testprefix,"--%.*s.",CONFIG_MAXOPTLENGTH-1,prefix); sprintf(testprefix,"--%.*s.",CONFIG_MAXOPTLENGTH-4,prefix);
} }
} }
......
This diff is collapsed.
...@@ -5,46 +5,41 @@ ...@@ -5,46 +5,41 @@
#include <string.h> #include <string.h>
unsigned long register_notifier(gui *_g, char *notification, widget *w, unsigned long register_notifier(gui *_g, char *notification, widget *w,
notifier handler, void *private) notifier handler, void *private) {
{
struct gui *g = _g; struct gui *g = _g;
unsigned long ret; unsigned long ret;
glock(g); glock(g);
if (g->next_notifier_id == 2UL * 1024 * 1024 * 1024) if (g->next_notifier_id == 2UL * 1024 * 1024 * 1024)
ERR("%s:%d: report a bug\n", __FILE__, __LINE__); ERR("%s:%d: report a bug\n", __FILE__, __LINE__);
g->notifiers = realloc(g->notifiers, g->notifiers = realloc(g->notifiers,
(g->notifiers_count+1) * sizeof(struct notifier)); (g->notifiers_count+1) * sizeof(struct notifier));
if (g->notifiers == NULL) abort(); if (g->notifiers == NULL) abort();
ret = g->next_notifier_id; ret = g->next_notifier_id;
g->notifiers[g->notifiers_count].handler = handler; g->notifiers[g->notifiers_count].handler = handler;
g->notifiers[g->notifiers_count].id = g->next_notifier_id; g->notifiers[g->notifiers_count].id = g->next_notifier_id;
g->next_notifier_id++; g->next_notifier_id++;
g->notifiers[g->notifiers_count].notification = strdup(notification); g->notifiers[g->notifiers_count].notification = strdup(notification);
if (g->notifiers[g->notifiers_count].notification == NULL) abort(); if (g->notifiers[g->notifiers_count].notification == NULL) abort();
g->notifiers[g->notifiers_count].w = w; g->notifiers[g->notifiers_count].w = w;
g->notifiers[g->notifiers_count].private = private; g->notifiers[g->notifiers_count].private = private;
/* initialize done to 1 so as not to call the handler if it's created /* initialize done to 1 so as not to call the handler if it's created
* by the call of another one that is in progress * by the call of another one that is in progress
*/ */
g->notifiers[g->notifiers_count].done = 1; g->notifiers[g->notifiers_count].done = 1;
g->notifiers_count++; g->notifiers_count++;
gunlock(g); gunlock(g);
return ret; return ret;
} }
void unregister_notifier(gui *_g, unsigned long notifier_id) void unregister_notifier(gui *_g, unsigned long notifier_id) {
{
struct gui *g = _g; struct gui *g = _g;
int i; int i;
glock(g); glock(g);
for (i = 0; i < g->notifiers_count; i++) for (i = 0; i < g->notifiers_count; i++)
...@@ -54,13 +49,12 @@ void unregister_notifier(gui *_g, unsigned long notifier_id) ...@@ -54,13 +49,12 @@ void unregister_notifier(gui *_g, unsigned long notifier_id)
ERR("%s:%d: notifier_id %ld not found\n", __FILE__,__LINE__,notifier_id); ERR("%s:%d: notifier_id %ld not found\n", __FILE__,__LINE__,notifier_id);
free(g->notifiers[i].notification); free(g->notifiers[i].notification);
memmove(g->notifiers + i, g->notifiers + i + 1, memmove(g->notifiers + i, g->notifiers + i + 1,
(g->notifiers_count-1 - i) * sizeof(struct notifier)); (g->notifiers_count-1 - i) * sizeof(struct notifier));
g->notifiers_count--; g->notifiers_count--;
g->notifiers = realloc(g->notifiers, g->notifiers = realloc(g->notifiers,
g->notifiers_count * sizeof(struct notifier)); g->notifiers_count * sizeof(struct notifier));
if (g->notifiers == NULL) abort(); if (g->notifiers == NULL) abort();
gunlock(g); gunlock(g);
...@@ -68,19 +62,19 @@ void unregister_notifier(gui *_g, unsigned long notifier_id) ...@@ -68,19 +62,19 @@ void unregister_notifier(gui *_g, unsigned long notifier_id)
/* called with lock ON */ /* called with lock ON */
void gui_notify(struct gui *g, char *notification, widget *w, void gui_notify(struct gui *g, char *notification, widget *w,
void *notification_data) void *notification_data) {
{
void *private; void *private;
notifier handler; notifier handler;
int i; int i;
/* this function is not re-entrant, for the moment keep as is /* this function is not re-entrant, for the moment keep as is
* and if the need is there, we'll make a new thread to handle * and if the need is there, we'll make a new thread to handle
* notifications (or something) * notifications (or something)
* for now let's crash in case of recursive call * for now let's crash in case of recursive call
*/ */
static int inside = 0; static int inside = 0;
if (inside) ERR("%s:%d: BUG! contact the authors\n", __FILE__, __LINE__); if (inside) ERR("%s:%d: BUG! contact the authors\n", __FILE__, __LINE__);
inside = 1; inside = 1;
/* clear all handlers */ /* clear all handlers */
...@@ -91,26 +85,25 @@ void gui_notify(struct gui *g, char *notification, widget *w, ...@@ -91,26 +85,25 @@ void gui_notify(struct gui *g, char *notification, widget *w,
* need to be careful here * need to be careful here
*/ */
loop: loop:
for (i = 0; i < g->notifiers_count; i++) { for (i = 0; i < g->notifiers_count; i++) {
if (g->notifiers[i].done == 1 || if (g->notifiers[i].done == 1 ||
g->notifiers[i].w != w || g->notifiers[i].w != w ||
strcmp(g->notifiers[i].notification, notification) != 0) strcmp(g->notifiers[i].notification, notification) != 0)
continue; continue;
break; break;
} }
if (i == g->notifiers_count) goto done; if (i == g->notifiers_count) goto done;
g->notifiers[i].done = 1; g->notifiers[i].done = 1;
handler = g->notifiers[i].handler; handler = g->notifiers[i].handler;
private = g->notifiers[i].private; private = g->notifiers[i].private;
gunlock(g); gunlock(g);
handler(private, g, notification, w, notification_data); handler(private, g, notification, w, notification_data);
glock(g); glock(g);
goto loop; goto loop;
done: done:
inside = 0; inside = 0;
} }
...@@ -7,21 +7,19 @@ ...@@ -7,21 +7,19 @@
#include "config.h" #include "config.h"
#include "../T_defs.h" #include "../T_defs.h"
void usage(void) void usage(void) {
{
printf( printf(
"options:\n" "options:\n"
" -d <database file> this option is mandatory\n" " -d <database file> this option is mandatory\n"
" -ip <host> connect to given IP address (default %s)\n" " -ip <host> connect to given IP address (default %s)\n"
" -p <port> connect to given port (default %d)\n", " -p <port> connect to given port (default %d)\n",
DEFAULT_REMOTE_IP, DEFAULT_REMOTE_IP,
DEFAULT_REMOTE_PORT DEFAULT_REMOTE_PORT
); );
exit(1); exit(1);
} }
int main(int n, char **v) int main(int n, char **v) {
{
char *database_filename = NULL; char *database_filename = NULL;
void *database; void *database;
char *ip = DEFAULT_REMOTE_IP; char *ip = DEFAULT_REMOTE_IP;
...@@ -36,11 +34,28 @@ int main(int n, char **v) ...@@ -36,11 +34,28 @@ int main(int n, char **v)
for (i = 1; i < n; i++) { for (i = 1; i < n; i++) {
if (!strcmp(v[i], "-h") || !strcmp(v[i], "--help")) usage(); if (!strcmp(v[i], "-h") || !strcmp(v[i], "--help")) usage();
if (!strcmp(v[i], "-d"))
{ if (i > n-2) usage(); database_filename = v[++i]; continue; } if (!strcmp(v[i], "-d")) {
if (!strcmp(v[i], "-ip")) { if (i > n-2) usage(); ip = v[++i]; continue; } if (i > n-2) usage();
if (!strcmp(v[i], "-p"))
{ if (i > n-2) usage(); port = atoi(v[++i]); continue; } database_filename = v[++i];
continue;
}
if (!strcmp(v[i], "-ip")) {
if (i > n-2) usage();
ip = v[++i];
continue;
}
if (!strcmp(v[i], "-p")) {
if (i > n-2) usage();
port = atoi(v[++i]);
continue;
}
usage(); usage();
} }
...@@ -50,71 +65,92 @@ int main(int n, char **v) ...@@ -50,71 +65,92 @@ int main(int n, char **v)
} }
database = parse_database(database_filename); database = parse_database(database_filename);
load_config_file(database_filename); load_config_file(database_filename);
number_of_events = number_of_ids(database); number_of_events = number_of_ids(database);
is_on = calloc(number_of_events, sizeof(int)); is_on = calloc(number_of_events, sizeof(int));
if (is_on == NULL) abort(); if (is_on == NULL) abort();
on_off(database, "ENB_PHY_INPUT_SIGNAL", is_on, 1); on_off(database, "ENB_PHY_INPUT_SIGNAL", is_on, 1);
on_off(database, "ENB_PHY_ULSCH_UE_NACK", is_on, 1); on_off(database, "ENB_PHY_ULSCH_UE_NACK", is_on, 1);
on_off(database, "ENB_PHY_ULSCH_UE_ACK", is_on, 1); on_off(database, "ENB_PHY_ULSCH_UE_ACK", is_on, 1);
ev_input = event_id_from_name(database, "ENB_PHY_INPUT_SIGNAL"); ev_input = event_id_from_name(database, "ENB_PHY_INPUT_SIGNAL");
ev_nack = event_id_from_name(database, "ENB_PHY_ULSCH_UE_NACK"); ev_nack = event_id_from_name(database, "ENB_PHY_ULSCH_UE_NACK");
ev_ack = event_id_from_name(database, "ENB_PHY_ULSCH_UE_ACK"); ev_ack = event_id_from_name(database, "ENB_PHY_ULSCH_UE_ACK");
socket = connect_to(ip, port); socket = connect_to(ip, port);
t = 1; t = 1;
if (socket_send(socket, &t, 1) == -1 || if (socket_send(socket, &t, 1) == -1 ||
socket_send(socket, &number_of_events, sizeof(int)) == -1 || socket_send(socket, &number_of_events, sizeof(int)) == -1 ||
socket_send(socket, is_on, number_of_events * sizeof(int)) == -1) socket_send(socket, is_on, number_of_events * sizeof(int)) == -1)
abort(); abort();
OBUF ebuf = { osize: 0, omaxsize: 0, obuf: NULL }; OBUF ebuf = { osize: 0, omaxsize: 0, obuf: NULL };
char dump[10][T_BUFFER_MAX]; char dump[10][T_BUFFER_MAX];
event dump_ev[10]; event dump_ev[10];
FILE *z = fopen("/tmp/dd", "w"); if (z == NULL) abort(); FILE *z = fopen("/tmp/dd", "w");
if (z == NULL) abort();
while (1) { while (1) {
char *v; char *v;
event e; event e;
e = get_event(socket, &ebuf, database); e = get_event(socket, &ebuf, database);
v = ebuf.obuf; v = ebuf.obuf;
if (e.type == -1) break; if (e.type == -1) break;
if (e.type == ev_input) { if (e.type == ev_input) {
int sf = e.e[2].i; int sf = e.e[2].i;
if (ebuf.osize > T_BUFFER_MAX)
{ printf("event size too big\n"); exit(1); } if (ebuf.osize > T_BUFFER_MAX) {
printf("event size too big\n");
exit(1);
}
memcpy(dump[sf], ebuf.obuf, ebuf.osize); memcpy(dump[sf], ebuf.obuf, ebuf.osize);
dump_ev[sf] = e; dump_ev[sf] = e;
printf("input %d/%d\n", e.e[1].i, sf); printf("input %d/%d\n", e.e[1].i, sf);
if (fwrite(dump_ev[sf].e[4].b, dump_ev[sf].e[4].bsize, 1, z) != 1) abort();
fflush(z); if (fwrite(dump_ev[sf].e[4].b, dump_ev[sf].e[4].bsize, 1, z) != 1) abort();
fflush(z);
} }
if (e.type == ev_nack) { if (e.type == ev_nack) {
int sf = e.e[2].i; int sf = e.e[2].i;
printf("nack %d/%d\n", e.e[1].i, sf); printf("nack %d/%d\n", e.e[1].i, sf);
FILE *f = fopen("/tmp/dump.raw", "w"); if (f == NULL) abort(); FILE *f = fopen("/tmp/dump.raw", "w");
if (f == NULL) abort();
if (fwrite(dump[sf] + ((char *)dump_ev[sf].e[4].b - v), if (fwrite(dump[sf] + ((char *)dump_ev[sf].e[4].b - v),
dump_ev[sf].e[4].bsize, 1, f) != 1) abort(); dump_ev[sf].e[4].bsize, 1, f) != 1) abort();
if (fclose(f)) abort(); if (fclose(f)) abort();
printf("dumped... press enter (delta %d)\n", (int)((char *)dump_ev[sf].e[4].b - v)); printf("dumped... press enter (delta %d)\n", (int)((char *)dump_ev[sf].e[4].b - v));
// getchar(); // getchar();
} }
if (e.type == ev_ack) { if (e.type == ev_ack) {
int sf = e.e[2].i; int sf = e.e[2].i;
printf("ack %d/%d\n", e.e[1].i, sf); printf("ack %d/%d\n", e.e[1].i, sf);
FILE *f = fopen("/tmp/dump.raw", "w"); if (f == NULL) abort(); FILE *f = fopen("/tmp/dump.raw", "w");
if (f == NULL) abort();
if (fwrite(dump[sf] + ((char *)dump_ev[sf].e[4].b - v), if (fwrite(dump[sf] + ((char *)dump_ev[sf].e[4].b - v),
dump_ev[sf].e[4].bsize, 1, f) != 1) abort(); dump_ev[sf].e[4].bsize, 1, f) != 1) abort();
if (fclose(f)) abort(); if (fclose(f)) abort();
printf("dumped... press enter (delta %d)\n", (int)((char *)dump_ev[sf].e[4].b - v)); printf("dumped... press enter (delta %d)\n", (int)((char *)dump_ev[sf].e[4].b - v));
// getchar(); // getchar();
} }
} }
if (z)
fclose(z);
return 0; return 0;
} }
This diff is collapsed.
...@@ -9,27 +9,38 @@ ...@@ -9,27 +9,38 @@
#include <arpa/inet.h> #include <arpa/inet.h>
#include <math.h> #include <math.h>
void new_thread(void *(*f)(void *), void *data) void new_thread(void *(*f)(void *), void *data) {
{
pthread_t t; pthread_t t;
pthread_attr_t att; pthread_attr_t att;
if (pthread_attr_init(&att)) if (pthread_attr_init(&att)) {
{ fprintf(stderr, "pthread_attr_init err\n"); exit(1); } fprintf(stderr, "pthread_attr_init err\n");
if (pthread_attr_setdetachstate(&att, PTHREAD_CREATE_DETACHED)) exit(1);
{ fprintf(stderr, "pthread_attr_setdetachstate err\n"); exit(1); } }
if (pthread_attr_setstacksize(&att, 10000000))
{ fprintf(stderr, "pthread_attr_setstacksize err\n"); exit(1); } if (pthread_attr_setdetachstate(&att, PTHREAD_CREATE_DETACHED)) {
if (pthread_create(&t, &att, f, data)) fprintf(stderr, "pthread_attr_setdetachstate err\n");
{ fprintf(stderr, "pthread_create err\n"); exit(1); } exit(1);
if (pthread_attr_destroy(&att)) }
{ fprintf(stderr, "pthread_attr_destroy err\n"); exit(1); }
if (pthread_attr_setstacksize(&att, 10000000)) {
fprintf(stderr, "pthread_attr_setstacksize err\n");
exit(1);
}
if (pthread_create(&t, &att, f, data)) {
fprintf(stderr, "pthread_create err\n");
exit(1);
}
if (pthread_attr_destroy(&att)) {
fprintf(stderr, "pthread_attr_destroy err\n");
exit(1);
}
} }
void sleepms(int ms) void sleepms(int ms) {
{
struct timespec t; struct timespec t;
t.tv_sec = ms / 1000; t.tv_sec = ms / 1000;
t.tv_nsec = (ms % 1000) * 1000000L; t.tv_nsec = (ms % 1000) * 1000000L;
...@@ -37,12 +48,15 @@ void sleepms(int ms) ...@@ -37,12 +48,15 @@ void sleepms(int ms)
if (nanosleep(&t, NULL)) abort(); if (nanosleep(&t, NULL)) abort();
} }
void bps(char *out, float v, char *suffix) void bps(char *out, float v, char *suffix) {
{
static char *bps_unit[4] = { "", "k", "M", "G" }; static char *bps_unit[4] = { "", "k", "M", "G" };
int flog; int flog;
if (v < 1000) flog = 0; else flog = floor(floor(log10(v)) / 3);
if (v < 1000) flog = 0;
else flog = floor(floor(log10(v)) / 3);
if (flog > 3) flog = 3; if (flog > 3) flog = 3;
v /= pow(10, flog*3); v /= pow(10, flog*3);
sprintf(out, "%g%s%s", round(v*100)/100, bps_unit[flog], suffix); sprintf(out, "%g%s%s", round(v*100)/100, bps_unit[flog], suffix);
} }
...@@ -51,25 +65,31 @@ void bps(char *out, float v, char *suffix) ...@@ -51,25 +65,31 @@ void bps(char *out, float v, char *suffix)
/* list */ /* list */
/****************************************************************************/ /****************************************************************************/
list *list_remove_head(list *l) list *list_remove_head(list *l) {
{
list *ret; list *ret;
if (l == NULL) return NULL; if (l == NULL) return NULL;
ret = l->next; ret = l->next;
if (ret != NULL) ret->last = l->last; if (ret != NULL) ret->last = l->last;
free(l); free(l);
return ret; return ret;
} }
list *list_append(list *l, void *data) list *list_append(list *l, void *data) {
{
list *new = calloc(1, sizeof(list)); list *new = calloc(1, sizeof(list));
if (new == NULL) abort(); if (new == NULL) abort();
new->data = data; new->data = data;
if (l == NULL) { if (l == NULL) {
new->last = new; new->last = new;
return new; return new;
} }
l->last->next = new; l->last->next = new;
l->last = new; l->last = new;
return l; return l;
...@@ -79,88 +99,107 @@ list *list_append(list *l, void *data) ...@@ -79,88 +99,107 @@ list *list_append(list *l, void *data)
/* socket */ /* socket */
/****************************************************************************/ /****************************************************************************/
int create_listen_socket(char *addr, int port) int create_listen_socket(char *addr, int port) {
{
struct sockaddr_in a; struct sockaddr_in a;
int s; int s;
int v; int v;
s = socket(AF_INET, SOCK_STREAM, 0); s = socket(AF_INET, SOCK_STREAM, 0);
if (s == -1) { perror("socket"); exit(1); }
if (s == -1) {
perror("socket");
exit(1);
}
v = 1; v = 1;
if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &v, sizeof(int)))
{ perror("setsockopt"); exit(1); } if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &v, sizeof(int))) {
perror("setsockopt");
exit(1);
}
a.sin_family = AF_INET; a.sin_family = AF_INET;
a.sin_port = htons(port); a.sin_port = htons(port);
a.sin_addr.s_addr = inet_addr(addr); a.sin_addr.s_addr = inet_addr(addr);
if (bind(s, (struct sockaddr *)&a, sizeof(a))) { perror("bind"); exit(1); } if (bind(s, (struct sockaddr *)&a, sizeof(a))) {
if (listen(s, 5)) { perror("listen"); exit(1); } perror("bind");
exit(1);
}
if (listen(s, 5)) {
perror("listen");
exit(1);
}
return s; return s;
} }
int socket_accept(int s) int socket_accept(int s) {
{
struct sockaddr_in a; struct sockaddr_in a;
socklen_t alen; socklen_t alen;
alen = sizeof(a); alen = sizeof(a);
return accept(s, (struct sockaddr *)&a, &alen); return accept(s, (struct sockaddr *)&a, &alen);
} }
int socket_send(int socket, void *buffer, int size) int socket_send(int socket, void *buffer, int size) {
{
char *x = buffer; char *x = buffer;
int ret; int ret;
while (size) { while (size) {
ret = write(socket, x, size); ret = write(socket, x, size);
if (ret <= 0) return -1; if (ret <= 0) return -1;
size -= ret; size -= ret;
x += ret; x += ret;
} }
return 0; return 0;
} }
int get_connection(char *addr, int port) int get_connection(char *addr, int port) {
{
int s, t; int s, t;
printf("waiting for connection on %s:%d\n", addr, port); printf("waiting for connection on %s:%d\n", addr, port);
s = create_listen_socket(addr, port); s = create_listen_socket(addr, port);
t = socket_accept(s); t = socket_accept(s);
if (t == -1) { perror("accept"); exit(1); }
close(s);
printf("connected\n"); if (t == -1) {
perror("accept");
exit(1);
}
close(s);
printf("connected\n");
return t; return t;
} }
int fullread(int fd, void *_buf, int count) int fullread(int fd, void *_buf, int count) {
{
char *buf = _buf; char *buf = _buf;
int ret = 0; int ret = 0;
int l; int l;
while (count) { while (count) {
l = read(fd, buf, count); l = read(fd, buf, count);
if (l <= 0) return -1; if (l <= 0) return -1;
count -= l; count -= l;
buf += l; buf += l;
ret += l; ret += l;
} }
return ret; return ret;
} }
int try_connect_to(char *addr, int port) int try_connect_to(char *addr, int port) {
{
int s; int s;
struct sockaddr_in a; struct sockaddr_in a;
s = socket(AF_INET, SOCK_STREAM, 0); s = socket(AF_INET, SOCK_STREAM, 0);
if (s == -1) { perror("socket"); exit(1); }
if (s == -1) {
perror("socket");
exit(1);
}
a.sin_family = AF_INET; a.sin_family = AF_INET;
a.sin_port = htons(port); a.sin_port = htons(port);
...@@ -175,14 +214,12 @@ int try_connect_to(char *addr, int port) ...@@ -175,14 +214,12 @@ int try_connect_to(char *addr, int port)
return s; return s;
} }
int connect_to(char *addr, int port) int connect_to(char *addr, int port) {
{
int s; int s;
printf("connecting to %s:%d\n", addr, port); printf("connecting to %s:%d\n", addr, port);
again: again:
s = try_connect_to(addr, port); s = try_connect_to(addr, port);
if (s == -1) { if (s == -1) {
printf("trying again in 1s\n"); printf("trying again in 1s\n");
sleep(1); sleep(1);
...@@ -196,49 +233,45 @@ again: ...@@ -196,49 +233,45 @@ again:
/* buffer */ /* buffer */
/****************************************************************************/ /****************************************************************************/
void PUTC(OBUF *o, char c) void PUTC(OBUF *o, char c) {
{
if (o->osize == o->omaxsize) { if (o->osize == o->omaxsize) {
o->omaxsize += 512; o->omaxsize += 512;
o->obuf = realloc(o->obuf, o->omaxsize); o->obuf = realloc(o->obuf, o->omaxsize);
if (o->obuf == NULL) abort(); if (o->obuf == NULL) abort();
} }
o->obuf[o->osize] = c; o->obuf[o->osize] = c;
o->osize++; o->osize++;
} }
void PUTS(OBUF *o, char *s) void PUTS(OBUF *o, char *s) {
{
while (*s) PUTC(o, *s++); while (*s) PUTC(o, *s++);
} }
static int clean(char c) static int clean(char c) {
{
if (!isprint(c)) c = ' '; if (!isprint(c)) c = ' ';
return c; return c;
} }
void PUTS_CLEAN(OBUF *o, char *s) void PUTS_CLEAN(OBUF *o, char *s) {
{
while (*s) PUTC(o, clean(*s++)); while (*s) PUTC(o, clean(*s++));
} }
void PUTI(OBUF *o, int i) void PUTI(OBUF *o, int i) {
{
char s[64]; char s[64];
sprintf(s, "%d", i); sprintf(s, "%d", i);
PUTS(o, s); PUTS(o, s);
} }
void PUTX2(OBUF *o, int i) void PUTX2(OBUF *o, int i) {
{
char s[64]; char s[64];
sprintf(s, "%2.2x", i); sprintf(s, "%2.2x", i);
PUTS(o, s); PUTS(o, s);
} }
void PUTUL(OBUF *o, unsigned long l) void PUTUL(OBUF *o, unsigned long l) {
{
char s[128]; char s[128];
sprintf(s, "%ld", l); sprintf(s, "%ld", l);
PUTS(o, s); PUTS(o, s);
......
...@@ -31,18 +31,18 @@ ...@@ -31,18 +31,18 @@
#include "backtrace.h" #include "backtrace.h"
/* Obtain a backtrace and print it to stdout. */ /* Obtain a backtrace and print it to stdout. */
void display_backtrace(void) void display_backtrace(void) {
{
void *array[10]; void *array[10];
size_t size; size_t size;
char **strings; char **strings;
size_t i; size_t i;
char* test=getenv("NO_BACKTRACE"); char *test=getenv("NO_BACKTRACE");
if (test!=0) *((int*)0)=0;
if (test!=0) *((int *)0)=0;
size = backtrace(array, 10); size = backtrace(array, 10);
strings = backtrace_symbols(array, size); strings = backtrace_symbols(array, size);
printf("Obtained %u stack frames.\n", (unsigned int)size);
printf("Obtained %zd stack frames.\n", size);
for (i = 0; i < size; i++) for (i = 0; i < size; i++)
printf("%s\n", strings[i]); printf("%s\n", strings[i]);
...@@ -50,8 +50,7 @@ void display_backtrace(void) ...@@ -50,8 +50,7 @@ void display_backtrace(void)
free(strings); free(strings);
} }
void backtrace_handle_signal(siginfo_t *info) void backtrace_handle_signal(siginfo_t *info) {
{
display_backtrace(); display_backtrace();
//exit(EXIT_FAILURE); //exit(EXIT_FAILURE);
} }
This diff is collapsed.
...@@ -2,9 +2,9 @@ ...@@ -2,9 +2,9 @@
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under * 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 * the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. * except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
* *
* http://www.openairinterface.org/?page_id=698 * http://www.openairinterface.org/?page_id=698
...@@ -31,41 +31,41 @@ typedef uint64_t hash_key_t; ...@@ -31,41 +31,41 @@ typedef uint64_t hash_key_t;
#define HASHTABLE_NOT_A_KEY_VALUE ((uint64_t)-1) #define HASHTABLE_NOT_A_KEY_VALUE ((uint64_t)-1)
typedef enum hashtable_return_code_e { typedef enum hashtable_return_code_e {
HASH_TABLE_OK = 0, HASH_TABLE_OK = 0,
HASH_TABLE_INSERT_OVERWRITTEN_DATA = 1, HASH_TABLE_INSERT_OVERWRITTEN_DATA = 1,
HASH_TABLE_KEY_NOT_EXISTS = 2, HASH_TABLE_KEY_NOT_EXISTS = 2,
HASH_TABLE_KEY_ALREADY_EXISTS = 3, HASH_TABLE_KEY_ALREADY_EXISTS = 3,
HASH_TABLE_BAD_PARAMETER_HASHTABLE = 4, HASH_TABLE_BAD_PARAMETER_HASHTABLE = 4,
HASH_TABLE_SYSTEM_ERROR = 5, HASH_TABLE_SYSTEM_ERROR = 5,
HASH_TABLE_CODE_MAX HASH_TABLE_CODE_MAX
} hashtable_rc_t; } hashtable_rc_t;
typedef struct hash_node_s { typedef struct hash_node_s {
hash_key_t key; hash_key_t key;
void *data; void *data;
struct hash_node_s *next; struct hash_node_s *next;
} hash_node_t; } hash_node_t;
typedef struct hash_table_s { typedef struct hash_table_s {
hash_size_t size; hash_size_t size;
hash_size_t num_elements; hash_size_t num_elements;
struct hash_node_s **nodes; struct hash_node_s **nodes;
hash_size_t (*hashfunc)(const hash_key_t); hash_size_t (*hashfunc)(const hash_key_t);
void (*freefunc)(void*); void (*freefunc)(void *);
} hash_table_t; } hash_table_t;
char* hashtable_rc_code2string(hashtable_rc_t rcP); char *hashtable_rc_code2string(hashtable_rc_t rcP);
void hash_free_int_func(void* memoryP); void hash_free_int_func(void *memoryP);
hash_table_t *hashtable_create (const hash_size_t size, hash_size_t (*hashfunc)(const hash_key_t ), void (*freefunc)(void*)); hash_table_t *hashtable_create (const hash_size_t size, hash_size_t (*hashfunc)(const hash_key_t ), void (*freefunc)(void *));
hashtable_rc_t hashtable_destroy(hash_table_t * const hashtbl); hashtable_rc_t hashtable_destroy(hash_table_t **hashtbl);
hashtable_rc_t hashtable_is_key_exists (const hash_table_t * const hashtbl, const uint64_t key); hashtable_rc_t hashtable_is_key_exists (const hash_table_t *const hashtbl, const uint64_t key);
hashtable_rc_t hashtable_apply_funct_on_elements (hash_table_t * const hashtblP, void funct(hash_key_t keyP, void* dataP, void* parameterP), void* parameterP); hashtable_rc_t hashtable_apply_funct_on_elements (hash_table_t *const hashtblP, void funct(hash_key_t keyP, void *dataP, void *parameterP), void *parameterP);
hashtable_rc_t hashtable_dump_content (const hash_table_t * const hashtblP, char * const buffer_pP, int * const remaining_bytes_in_buffer_pP ); hashtable_rc_t hashtable_dump_content (const hash_table_t *const hashtblP, char *const buffer_pP, int *const remaining_bytes_in_buffer_pP );
hashtable_rc_t hashtable_insert (hash_table_t * const hashtbl, const hash_key_t key, void *data); hashtable_rc_t hashtable_insert (hash_table_t *const hashtbl, const hash_key_t key, void *data);
hashtable_rc_t hashtable_remove (hash_table_t * const hashtbl, const hash_key_t key); hashtable_rc_t hashtable_remove (hash_table_t *const hashtbl, const hash_key_t key);
hashtable_rc_t hashtable_get (const hash_table_t * const hashtbl, const hash_key_t key, void **dataP); hashtable_rc_t hashtable_get (const hash_table_t *const hashtbl, const hash_key_t key, void **dataP);
hashtable_rc_t hashtable_resize (hash_table_t * const hashtbl, const hash_size_t size); hashtable_rc_t hashtable_resize (hash_table_t *const hashtbl, const hash_size_t size);
......
This diff is collapsed.
This diff is collapsed.
...@@ -62,9 +62,9 @@ typedef enum { ...@@ -62,9 +62,9 @@ typedef enum {
MSC_S11_MME, MSC_S11_MME,
MSC_S6A_MME, MSC_S6A_MME,
MSC_HSS, MSC_HSS,
MAX_MSC_PROTOS,
MSC_X2AP_SRC_ENB, MSC_X2AP_SRC_ENB,
MSC_X2AP_TARGET_ENB, MSC_X2AP_TARGET_ENB,
MAX_MSC_PROTOS,
} msc_proto_t; } msc_proto_t;
......
...@@ -58,7 +58,7 @@ ...@@ -58,7 +58,7 @@
#include "telnetsrv_phycmd.h" #include "telnetsrv_phycmd.h"
#include "telnetsrv_proccmd.h" #include "telnetsrv_proccmd.h"
static char *telnet_defstatmod[] = {"softmodem","phy","loader"}; static char *telnet_defstatmod[] = {"softmodem","phy","loader","measur"};
static telnetsrv_params_t telnetparams; static telnetsrv_params_t telnetparams;
#define TELNETSRV_LISTENADDR 0 #define TELNETSRV_LISTENADDR 0
#define TELNETSRV_LISTENPORT 1 #define TELNETSRV_LISTENPORT 1
...@@ -77,17 +77,17 @@ paramdef_t telnetoptions[] = { ...@@ -77,17 +77,17 @@ paramdef_t telnetoptions[] = {
/* configuration parameters for telnet utility */ /* configuration parameters for telnet utility */
/* optname helpstr paramflags XXXptr defXXXval type numelt */ /* optname helpstr paramflags XXXptr defXXXval type numelt */
/*--------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
{"listenaddr", "<listen ip address>\n", 0, uptr:&telnetparams.listenaddr, defstrval:"0.0.0.0", TYPE_IPV4ADDR, 0 }, {"listenaddr", "<listen ip address>", 0, uptr:&telnetparams.listenaddr, defstrval:"0.0.0.0", TYPE_IPV4ADDR, 0 },
{"listenport", "<local port>\n", 0, uptr:&(telnetparams.listenport), defuintval:9090, TYPE_UINT, 0 }, {"listenport", "<local port>", 0, uptr:&(telnetparams.listenport), defuintval:9090, TYPE_UINT, 0 },
{"priority", "<scheduling policy (0-99)\n", 0, iptr:&telnetparams.priority, defuintval:0, TYPE_INT, 0 }, {"priority", "<scheduling policy (0-99)", 0, iptr:&telnetparams.priority, defuintval:0, TYPE_INT, 0 },
{"debug", "<debug level>\n", 0, uptr:NULL, defuintval:0, TYPE_UINT, 0 }, {"debug", "<debug level>", 0, uptr:NULL, defuintval:0, TYPE_UINT, 0 },
{"loopcount", "<loop command iterations>\n", 0, uptr:&(telnetparams.loopcount), defuintval:10, TYPE_UINT, 0 }, {"loopcount", "<loop command iterations>", 0, uptr:&(telnetparams.loopcount), defuintval:10, TYPE_UINT, 0 },
{"loopdelay", "<loop command delay (ms)>\n", 0, uptr:&(telnetparams.loopdelay), defuintval:5000, TYPE_UINT, 0 }, {"loopdelay", "<loop command delay (ms)>", 0, uptr:&(telnetparams.loopdelay), defuintval:5000, TYPE_UINT, 0 },
{"histfile", "<history file name>\n", PARAMFLAG_NOFREE, strptr:&(telnetparams.histfile), defstrval:"oaitelnet.history", TYPE_STRING, 0 }, {"histfile", "<history file name>", PARAMFLAG_NOFREE, strptr:&(telnetparams.histfile), defstrval:"oaitelnet.history", TYPE_STRING, 0 },
{"histsize", "<history sizes>\n", 0, iptr:&(telnetparams.histsize), defuintval:50, TYPE_INT, 0 }, {"histsize", "<history sizes>", 0, iptr:&(telnetparams.histsize), defuintval:50, TYPE_INT, 0 },
{"phypbsize", "<phy dump buff size (bytes)>\n",0, uptr:&(telnetparams.phyprntbuff_size),defuintval:65000, TYPE_UINT, 0 }, {"phypbsize", "<phy dump buff size (bytes)>",0, uptr:&(telnetparams.phyprntbuff_size),defuintval:65000, TYPE_UINT, 0 },
{"staticmod", "<static modules selection>\n", 0, strlistptr:NULL, defstrlistval:telnet_defstatmod,TYPE_STRINGLIST,(sizeof(telnet_defstatmod)/sizeof(char *))}, {"staticmod", "<static modules selection>", 0, strlistptr:NULL, defstrlistval:telnet_defstatmod,TYPE_STRINGLIST,(sizeof(telnet_defstatmod)/sizeof(char *))},
{"shrmod", "<dynamic modules selection>\n", 0, strlistptr:NULL, defstrlistval:NULL,TYPE_STRINGLIST,0 } {"shrmod", "<dynamic modules selection>", 0, strlistptr:NULL, defstrlistval:NULL,TYPE_STRINGLIST,0 }
}; };
int get_phybsize(void) { int get_phybsize(void) {
...@@ -355,7 +355,7 @@ int setgetvar(int moduleindex,char getorset,char *params) { ...@@ -355,7 +355,7 @@ int setgetvar(int moduleindex,char getorset,char *params) {
char varname[TELNET_CMD_MAXSIZE]; char varname[TELNET_CMD_MAXSIZE];
char *varval=NULL; char *varval=NULL;
memset(varname,0,sizeof(varname)); memset(varname,0,sizeof(varname));
n = sscanf(params,"%s %ms",varname,&varval); n = sscanf(params,"%19s %ms",varname,&varval);
for ( i=0 ; telnetparams.CmdParsers[moduleindex].var[i].varvalptr != NULL ; i++) { for ( i=0 ; telnetparams.CmdParsers[moduleindex].var[i].varvalptr != NULL ; i++) {
if ( strncasecmp(telnetparams.CmdParsers[moduleindex].var[i].varname,varname,strlen(telnetparams.CmdParsers[moduleindex].var[i].varname)) == 0) { if ( strncasecmp(telnetparams.CmdParsers[moduleindex].var[i].varname,varname,strlen(telnetparams.CmdParsers[moduleindex].var[i].varname)) == 0) {
...@@ -475,7 +475,7 @@ int process_command(char *buf) { ...@@ -475,7 +475,7 @@ int process_command(char *buf) {
memset(cmdb,0,sizeof(cmdb)); memset(cmdb,0,sizeof(cmdb));
bufbck=strdup(buf); bufbck=strdup(buf);
rt=CMDSTATUS_NOTFOUND; rt=CMDSTATUS_NOTFOUND;
j = sscanf(buf,"%9s %9s %[^\t\n]",modulename,cmd,cmdb); j = sscanf(buf,"%9s %9s %2000[^\t\n]",modulename,cmd,cmdb);
if (telnetparams.telnetdbg > 0) if (telnetparams.telnetdbg > 0)
printf("process_command: %i words, module=%s cmd=%s, parameters= %s\n",j,modulename,cmd,cmdb); printf("process_command: %i words, module=%s cmd=%s, parameters= %s\n",j,modulename,cmd,cmdb);
...@@ -500,23 +500,32 @@ int process_command(char *buf) { ...@@ -500,23 +500,32 @@ int process_command(char *buf) {
}/* else */ }/* else */
}/* strncmp: module name test */ }/* strncmp: module name test */
else if (strncasecmp(modulename,"loop",4) == 0 ) { else if (strncasecmp(modulename,"loop",4) == 0 ) {
int lc;
int f = fcntl(telnetparams.new_socket,F_GETFL); int f = fcntl(telnetparams.new_socket,F_GETFL);
fcntl (telnetparams.new_socket, F_SETFL, O_NONBLOCK | f); int f1=fcntl (telnetparams.new_socket, F_SETFL, O_NONBLOCK | f);
for(lc=0; lc<telnetparams.loopcount; lc++) { if (f<0 || f1 <0) {
client_printf( " Loop won't be cancelable: %s\n",strerror(errno) );
}
for(int lc=0; lc<telnetparams.loopcount; lc++) {
char dummybuff[20]; char dummybuff[20];
char tbuff[64]; char tbuff[64];
int rs;
client_printf(CSI "1J" CSI "1;10H " STDFMT "%s %i/%i\n", client_printf(CSI "1J" CSI "1;10H " STDFMT "%s %i/%i\n",
get_time(tbuff,sizeof(tbuff)),lc,telnetparams.loopcount ); get_time(tbuff,sizeof(tbuff)),lc,telnetparams.loopcount );
process_command(bufbck+strlen("loop")+1); process_command(bufbck+strlen("loop")+1);
usleep(telnetparams.loopdelay * 1000); errno=0;
rs = read(telnetparams.new_socket,dummybuff,sizeof(dummybuff)); int rs = read(telnetparams.new_socket,dummybuff,sizeof(dummybuff));
if ( rs > 0 ) { if (telnetparams.telnetdbg > 0)
client_printf("Received \"%s\" status %d, errno %s while running loop\n",dummybuff,rs,strerror(errno));
if ( errno != EAGAIN && errno != EWOULDBLOCK) {
client_printf( STDFMT " Loop canceled, iteration %i/%i\n",lc,telnetparams.loopcount );
lc=telnetparams.loopcount;
break; break;
} }
usleep(telnetparams.loopdelay * 1000);
} }
fcntl (telnetparams.new_socket, F_SETFL, f); fcntl (telnetparams.new_socket, F_SETFL, f);
......
...@@ -69,7 +69,8 @@ typedef struct cmddef { ...@@ -69,7 +69,8 @@ typedef struct cmddef {
#define TELNET_VARTYPE_INT64 3 #define TELNET_VARTYPE_INT64 3
#define TELNET_VARTYPE_STRING 4 #define TELNET_VARTYPE_STRING 4
#define TELNET_VARTYPE_DOUBLE 5 #define TELNET_VARTYPE_DOUBLE 5
//#define TELNET_VARTYPE_PTR 6 #define TELNET_VARTYPE_INT8 6
#define TELNET_VARTYPE_UINT 7
typedef struct variabledef { typedef struct variabledef {
char varname[TELNET_CMD_MAXSIZE]; char varname[TELNET_CMD_MAXSIZE];
char vartype; char vartype;
......
...@@ -9,6 +9,7 @@ set(TELNETSRV_SOURCE ...@@ -9,6 +9,7 @@ set(TELNETSRV_SOURCE
${TELNETROOT}/telnetsrv_phycmd.c ${TELNETROOT}/telnetsrv_phycmd.c
${TELNETROOT}/telnetsrv_proccmd.c ${TELNETROOT}/telnetsrv_proccmd.c
${TELNETROOT}/telnetsrv_loader.c ${TELNETROOT}/telnetsrv_loader.c
${TELNETROOT}/telnetsrv_measurements.c
) )
#set(TELNETSRV_ETHDEVCMD_SOURCE #set(TELNETSRV_ETHDEVCMD_SOURCE
......
/*
* 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
*/
/*! \file common/utils/telnetsrv/telnetsrv_cpumeasur_def.h
* \brief: definitions of macro used to initialize the telnet_ltemeasurdef_t
* \ strucures arrays which are then used by the display functions
* \ in telnetsrv_measurements.c.
* \author Francois TABURET
* \date 2019
* \version 0.1
* \company NOKIA BellLabs France
* \email: francois.taburet@nokia-bell-labs.com
* \note
* \warning
*/
#define CPU_PHYENB_MEASURE \
{ \
{"phy_proc_tx", &(phyvars->phy_proc_tx),0},\
{"phy_proc_rx", &(phyvars->phy_proc_rx),0},\
{"rx_prach", &(phyvars->rx_prach),0},\
{"ofdm_mod", &(phyvars->ofdm_mod_stats),0},\
{"dlsch_common_and_dci", &(phyvars->dlsch_common_and_dci),0},\
{"dlsch_ue_specific", &(phyvars->dlsch_ue_specific),0},\
{"dlsch_encoding", &(phyvars->dlsch_encoding_stats),0},\
{"dlsch_modulation", &(phyvars->dlsch_modulation_stats),0},\
{"dlsch_scrambling", &(phyvars->dlsch_scrambling_stats),0},\
{"dlsch_rate_matching", &(phyvars->dlsch_rate_matching_stats),0},\
{"dlsch_turbo_encod_prep", &(phyvars->dlsch_turbo_encoding_preperation_stats),0},\
{"dlsch_turbo_encod_segm", &(phyvars->dlsch_turbo_encoding_segmentation_stats),0},\
{"dlsch_turbo_encod", &(phyvars->dlsch_turbo_encoding_stats),0},\
{"dlsch_turbo_encod_waiting", &(phyvars->dlsch_turbo_encoding_waiting_stats),0},\
{"dlsch_turbo_encod_signal", &(phyvars->dlsch_turbo_encoding_signal_stats),0},\
{"dlsch_turbo_encod_main", &(phyvars->dlsch_turbo_encoding_main_stats),0},\
{"dlsch_turbo_encod_wakeup0", &(phyvars->dlsch_turbo_encoding_wakeup_stats0),0},\
{"dlsch_turbo_encod_wakeup1", &(phyvars->dlsch_turbo_encoding_wakeup_stats1),0},\
{"dlsch_interleaving", &(phyvars->dlsch_interleaving_stats),0},\
{"rx_dft", &(phyvars->rx_dft_stats),0},\
{"ulsch_channel_estimation", &(phyvars->ulsch_channel_estimation_stats),0},\
{"ulsch_freq_offset_estimation", &(phyvars->ulsch_freq_offset_estimation_stats),0},\
{"ulsch_decoding", &(phyvars->ulsch_decoding_stats),0},\
{"ulsch_demodulation", &(phyvars->ulsch_demodulation_stats),0},\
{"ulsch_rate_unmatching", &(phyvars->ulsch_rate_unmatching_stats),0},\
{"ulsch_turbo_decoding", &(phyvars->ulsch_turbo_decoding_stats),0},\
{"ulsch_deinterleaving", &(phyvars->ulsch_deinterleaving_stats),0},\
{"ulsch_demultiplexing", &(phyvars->ulsch_demultiplexing_stats),0},\
{"ulsch_llr", &(phyvars->ulsch_llr_stats),0},\
{"ulsch_tc_init", &(phyvars->ulsch_tc_init_stats),0},\
{"ulsch_tc_alpha", &(phyvars->ulsch_tc_alpha_stats),0},\
{"ulsch_tc_beta", &(phyvars->ulsch_tc_beta_stats),0},\
{"ulsch_tc_gamma", &(phyvars->ulsch_tc_gamma_stats),0},\
{"ulsch_tc_ext", &(phyvars->ulsch_tc_ext_stats),0},\
{"ulsch_tc_intl1", &(phyvars->ulsch_tc_intl1_stats),0},\
{"ulsch_tc_intl2", &(phyvars->ulsch_tc_intl2_stats),0},\
}
#define CPU_MACENB_MEASURE \
{ \
{"eNB_scheduler", &(macvars->eNB_scheduler),0},\
{"schedule_si", &(macvars->schedule_si),0},\
{"schedule_ra", &(macvars->schedule_ra),0},\
{"schedule_ulsch", &(macvars->schedule_ulsch),0},\
{"fill_DLSCH_dci", &(macvars->fill_DLSCH_dci),0},\
{"schedule_dlsch_pre", &(macvars->schedule_dlsch_preprocessor),0},\
{"schedule_dlsch", &(macvars->schedule_dlsch),0},\
{"schedule_mch", &(macvars->schedule_mch),0},\
{"rx_ulsch_sdu", &(macvars->rx_ulsch_sdu),0},\
{"schedule_pch", &(macvars->schedule_pch),0},\
}
#define CPU_PDCPENB_MEASURE \
{ \
{"pdcp_run", &(pdcpvars->pdcp_run),0},\
{"data_req", &(pdcpvars->data_req),0},\
{"data_ind", &(pdcpvars->data_ind),0},\
{"apply_security", &(pdcpvars->apply_security),0},\
{"validate_security", &(pdcpvars->validate_security),0},\
{"pdcp_ip", &(pdcpvars->pdcp_ip),0},\
{"ip_pdcp", &(pdcpvars->ip_pdcp),0},\
}
This diff is collapsed.
/*
* 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
*/
/*! \file common/utils/telnetsrv/telnetsrv_measurements.h
* \brief: Include file defining constants, structures and function prototypes
* \ used to implement the measurements functionality of the telnet server
* \author Francois TABURET
* \date 2019
* \version 0.1
* \company NOKIA BellLabs France
* \email: francois.taburet@nokia-bell-labs.com
* \note
* \warning
*/
#include <dlfcn.h>
#include "telnetsrv.h"
#include "openair1/PHY/defs_eNB.h"
#ifdef TELNETSRV_MEASURMENTS_MAIN
#define TELNET_MAXMEASURNAME_LEN 30
#define TELNET_MAXMEASURGROUPS 10
telnetshell_vardef_t measur_vardef[] = {
{"",0,NULL}
};
typedef struct cpumeasurdef {
char statname[TELNET_MAXMEASURNAME_LEN];
time_stats_t *astatptr;
unsigned int statemask;
} telnet_cpumeasurdef_t;
typedef struct ltemeasurdef {
char statname[TELNET_MAXMEASURNAME_LEN];
void *vptr;
char vtyp;
unsigned int statemask;
} telnet_ltemeasurdef_t;
#define GROUP_LTESTATS 0
#define GROUP_CPUSTATS 1
typedef void(*measur_dislayfunc_t)(telnet_printfunc_t prnt);
typedef struct mesurgroupdef {
char groupname[TELNET_MAXMEASURNAME_LEN];
unsigned char type;
unsigned char size;
measur_dislayfunc_t displayfunc;
union {
telnet_cpumeasurdef_t *cpustats;
telnet_ltemeasurdef_t *ltestats;
};
} telnet_measurgroupdef_t;
#define MACSTATS_NAME(valptr) #valptr
#define LTEMAC_MEASURGROUP_NAME "ltemac"
#define PHYCPU_MEASURGROUP_NAME "phycpu"
int measurcmd_show(char *buf, int debug, telnet_printfunc_t prnt);
int measurcmd_cpustats(char *buf, int debug, telnet_printfunc_t prnt);
telnetshell_cmddef_t measur_cmdarray[] = {
{"show", "groups | <group name>" , measurcmd_show},
{"cpustats","[enable | disable]",measurcmd_cpustats},
{"","",NULL}
};
#else
extern void add_measur_cmds(void);
#endif /* TELNETSRV_MEASURCMD_MAIN */
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
* \note * \note
* \warning * \warning
*/ */
#define _GNU_SOURCE #define _GNU_SOURCE
#include <string.h> #include <string.h>
#include <pthread.h> #include <pthread.h>
...@@ -39,104 +39,88 @@ ...@@ -39,104 +39,88 @@
#define TELNETSRV_PHYCMD_MAIN #define TELNETSRV_PHYCMD_MAIN
#include "telnetsrv_phycmd.h" #include "telnetsrv_phycmd.h"
char *prnbuff; char *prnbuff;
extern int dump_eNB_stats(PHY_VARS_eNB *eNB, char* buffer, int length); extern int dump_eNB_l2_stats(char *buffer, int length);
void init_phytelnet(void) void init_phytelnet(void) {
{ prnbuff=malloc(get_phybsize() );
prnbuff=malloc(get_phybsize() );
if (prnbuff == NULL)
{
fprintf(stderr,"Error %s on malloc in init_phytelnet()\n",strerror(errno));
}
}
void display_uestatshead( telnet_printfunc_t prnt) if (prnbuff == NULL) {
{ fprintf(stderr,"Error %s on malloc in init_phytelnet()\n",strerror(errno));
prnt("cc ue rnti Dmcs Umcs tao tau Dbr Dtb \n"); }
} }
void dump_uestats(int debug, telnet_printfunc_t prnt, uint8_t prntflag) void display_uestatshead( telnet_printfunc_t prnt) {
{ prnt("cc ue rnti Dmcs Umcs tao tau Dbr Dtb \n");
}
int p; void dump_uestats(int debug, telnet_printfunc_t prnt, uint8_t prntflag) {
int p;
prnbuff=malloc(20480);
p=dump_eNB_l2_stats( prnbuff, 20480);
p=dump_eNB_l2_stats( prnbuff, 0); if(prntflag>=1)
if(prntflag>=1) prnt("%s\n",prnbuff);
prnt("%s\n",prnbuff);
if(debug>=1)
prnt("%i bytes printed\n",p);
if(debug>=1)
prnt("%i bytes printed\n",p);
free(prnbuff);
} }
void display_uestats(int debug, telnet_printfunc_t prnt, int ue) void display_uestats(int debug, telnet_printfunc_t prnt, int ue) {
{ for (int cc=0; cc<1 ; cc++) {
for (int cc=0; cc<1 ; cc++) }
{
}
} }
void display_phycounters(char *buf, int debug, telnet_printfunc_t prnt) void display_phycounters(char *buf, int debug, telnet_printfunc_t prnt) {
{ prnt(" DLSCH kb DLSCH kb/s\n");
prnt(" DLSCH kb DLSCH kb/s\n"); dump_uestats(debug, prnt,0);
dump_uestats(debug, prnt,0);
} }
int dump_phyvars(char *buf, int debug, telnet_printfunc_t prnt) int dump_phyvars(char *buf, int debug, telnet_printfunc_t prnt) {
{ if (debug > 0)
prnt("phy interface module received %s\n",buf);
if (strcasestr(buf,"phycnt") != NULL) {
if (debug > 0) display_phycounters(buf, debug, prnt);
prnt("phy interface module received %s\n",buf); }
if (strcasestr(buf,"phycnt") != NULL)
{ if (strcasestr(buf,"uestat") != NULL) {
display_phycounters(buf, debug, prnt); char *cptr=strcasestr(buf+sizeof("uestat"),"UE");
} display_uestatshead(prnt);
if (strcasestr(buf,"uestat") != NULL)
{ if (cptr != NULL) {
char *cptr=strcasestr(buf+sizeof("uestat"),"UE"); int ueidx = strtol( cptr+sizeof("UE"), NULL, 10);
display_uestatshead(prnt);
if (cptr != NULL) if (ueidx < NUMBER_OF_UE_MAX && ueidx >= 0) {
{ display_uestats(debug, prnt,ueidx);
int ueidx = strtol( cptr+sizeof("UE"), NULL, 10); }
if (ueidx < NUMBER_OF_UE_MAX && ueidx >= 0) } /* if cptr != NULL */
{ else {
display_uestats(debug, prnt,ueidx); for (int ue=0; ue<NUMBER_OF_UE_MAX ; ue++) {
} display_uestats(debug, prnt,ue);
} /* if cptr != NULL */ }
else } /* else cptr != NULL */
{ } /* uestat */
for (int ue=0; ue<NUMBER_OF_UE_MAX ; ue++)
{ if (strcasestr(buf,"uedump") != NULL) {
display_uestats(debug, prnt,ue); dump_uestats(debug, prnt,1);
} }
} /* else cptr != NULL */
} /* uestat */ return 0;
if (strcasestr(buf,"uedump") != NULL)
{
dump_uestats(debug, prnt,1);
}
return 0;
} }
telnetshell_cmddef_t phy_cmdarray[] = { telnetshell_cmddef_t phy_cmdarray[] = {
{"disp","[phycnt,uedump,uestat UE<x>]", dump_phyvars}, {"disp","[phycnt,uedump,uestat UE<x>]", dump_phyvars},
{"","",NULL}, {"","",NULL},
}; };
/*-------------------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------------------*/
void add_phy_cmds(void) void add_phy_cmds(void) {
{ init_phytelnet();
add_telnetcmd("phy", phy_vardef, phy_cmdarray);
init_phytelnet();
add_telnetcmd("phy", phy_vardef, phy_cmdarray);
} }
...@@ -124,6 +124,9 @@ The X2AP layer is based on **3GPP 36.423** v14.6.0 and implements the following ...@@ -124,6 +124,9 @@ The X2AP layer is based on **3GPP 36.423** v14.6.0 and implements the following
- X2 Setup Request - X2 Setup Request
- X2 Setup Response - X2 Setup Response
- X2 Setup Failure
- Handover Request
- Handover Request Acknowledge
## eNB Advanced Features ## ## eNB Advanced Features ##
......
This diff is collapsed.
...@@ -1545,7 +1545,7 @@ static uint8_t pack_tx_request_body_value(void* tlv, uint8_t **ppWritePackedMsg, ...@@ -1545,7 +1545,7 @@ static uint8_t pack_tx_request_body_value(void* tlv, uint8_t **ppWritePackedMsg,
// DJP - if(pusharray8(pdu->segments[j].segment_data, (uint32_t)(-1), pdu->segments[j].segment_length, ppWritePackedMsg, end) == 0) // DJP - if(pusharray8(pdu->segments[j].segment_data, (uint32_t)(-1), pdu->segments[j].segment_length, ppWritePackedMsg, end) == 0)
int push_ret = pusharray8(pdu->segments[j].segment_data, 65535, pdu->segments[j].segment_length, ppWritePackedMsg, end); int push_ret = pusharray8(pdu->segments[j].segment_data, 65535, pdu->segments[j].segment_length, ppWritePackedMsg, end);
if (0 && pdu->segments[j].segment_length == 3) if (pdu->segments[j].segment_length == 3)
{ {
NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() BCH? segment_data:%x %x %x\n", __FUNCTION__, NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() BCH? segment_data:%x %x %x\n", __FUNCTION__,
pdu->segments[j].segment_data[0], pdu->segments[j].segment_data[0],
...@@ -4429,40 +4429,43 @@ static uint8_t unpack_tx_request(uint8_t **ppReadPackedMsg, uint8_t *end, void * ...@@ -4429,40 +4429,43 @@ static uint8_t unpack_tx_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *
for(i = 0; i < totalNumPdus; ++i) for(i = 0; i < totalNumPdus; ++i)
{ {
nfapi_tx_request_pdu_t* pdu = &(pNfapiMsg->tx_request_body.tx_pdu_list[i]); nfapi_tx_request_pdu_t* pdu = &(pNfapiMsg->tx_request_body.tx_pdu_list[i]);
if (pdu) {
uint16_t length = 0;
uint16_t index = 0;
uint16_t length = 0; if(!(pull16(ppReadPackedMsg, &length, end) &&
uint16_t index = 0;
if(!(pull16(ppReadPackedMsg, &length, end) &&
pull16(ppReadPackedMsg, &index, end))) pull16(ppReadPackedMsg, &index, end)))
return 0; return 0;
pdu->pdu_length = length; pdu->pdu_length = length;
pdu->pdu_index = index; pdu->pdu_index = index;
// TODO : May need to rethink this bit // TODO : May need to rethink this bit
pdu->num_segments = 1; pdu->num_segments = 1;
pdu->segments[0].segment_length = pdu->pdu_length; pdu->segments[0].segment_length = pdu->pdu_length;
pdu->segments[0].segment_data = nfapi_p7_allocate(pdu->pdu_length, config); pdu->segments[0].segment_data = nfapi_p7_allocate(pdu->pdu_length, config);
if(pdu->segments[0].segment_data) if(pdu->segments[0].segment_data)
{ {
if(!pullarray8(ppReadPackedMsg, pdu->segments[0].segment_data, pdu->segments[0].segment_length, pdu->segments[0].segment_length, end)) if(!pullarray8(ppReadPackedMsg, pdu->segments[0].segment_data, pdu->segments[0].segment_length, pdu->segments[0].segment_length, end))
return 0; return 0;
if (0 && pdu->segments[0].segment_length == 3) if (pdu->segments[0].segment_length == 3)
{ {
NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() BCH? segment_data:%x %x %x\n", __FUNCTION__, NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() BCH? segment_data:%x %x %x\n", __FUNCTION__,
pdu->segments[0].segment_data[0], pdu->segments[0].segment_data[0],
pdu->segments[0].segment_data[1], pdu->segments[0].segment_data[1],
pdu->segments[0].segment_data[2] pdu->segments[0].segment_data[2]
); );
} }
} }
else else
{ {
NFAPI_TRACE(NFAPI_TRACE_ERROR, "unpack_tx_request: Failed to allocate pdu (len:%d) %d/%d %d\n", pdu->pdu_length, totalNumPdus, i, pdu->pdu_index); NFAPI_TRACE(NFAPI_TRACE_ERROR, "unpack_tx_request: Failed to allocate pdu (len:%d) %d/%d %d\n", pdu->pdu_length, totalNumPdus, i, pdu->pdu_index);
} }
} else {
NFAPI_TRACE(NFAPI_TRACE_ERROR, "NULL pdu\n");
}
} }
} }
break; break;
......
This diff is collapsed.
...@@ -101,7 +101,7 @@ class phy_info ...@@ -101,7 +101,7 @@ class phy_info
{ {
index = 0; index = 0;
id = 0; id = 0;
udp = 0;
local_port = 0; local_port = 0;
remote_addr = 0; remote_addr = 0;
remote_port = 0; remote_port = 0;
...@@ -178,6 +178,7 @@ class pnf_info ...@@ -178,6 +178,7 @@ class pnf_info
sync_mode = 0; sync_mode = 0;
location_mode = 0; location_mode = 0;
location_coordinates = 0;
dl_config_timing = 0; dl_config_timing = 0;
ul_config_timing = 0; ul_config_timing = 0;
tx_timing = 0; tx_timing = 0;
......
This diff is collapsed.
This diff is collapsed.
...@@ -130,7 +130,7 @@ ccodedot11_encode (unsigned int numbytes, ...@@ -130,7 +130,7 @@ ccodedot11_encode (unsigned int numbytes,
*outPtr++ = (out>>1)&1; *outPtr++ = (out>>1)&1;
#ifdef DEBUG_CCODE #ifdef DEBUG_CCODE
printf("%d: %u -> %d (%u)\n",dummy,state,out,ccodedot11_table[state]); printf("%u: %u -> %d (%u)\n",dummy,state,out,ccodedot11_table[state]);
dummy+=2; dummy+=2;
#endif //DEBUG_CCODE #endif //DEBUG_CCODE
bit_index=(bit_index==0)?1:0; bit_index=(bit_index==0)?1:0;
......
...@@ -236,7 +236,7 @@ void sub_block_deinterleaving_cc(uint32_t D,int8_t *d,int8_t *w) { ...@@ -236,7 +236,7 @@ void sub_block_deinterleaving_cc(uint32_t D,int8_t *d,int8_t *w) {
ND = Kpi - D; ND = Kpi - D;
#ifdef RM_DEBUG2 #ifdef RM_DEBUG2
printf("sub_block_interleaving_cc : D = %d (%d), d %p, w %p\n",D,D*3,d,w); printf("sub_block_interleaving_cc : D = %d (%d), d %p, w %p\n",D,D*3,d,w);
printf("RCC = %d, Kpi=%d, ND=%ld\n",RCC,Kpi,ND); printf("RCC = %d, Kpi=%d, ND=%ld\n",RCC,Kpi,(long)ND);
#endif #endif
ND3 = ND*3; ND3 = ND*3;
k=0; k=0;
...@@ -253,7 +253,8 @@ void sub_block_deinterleaving_cc(uint32_t D,int8_t *d,int8_t *w) { ...@@ -253,7 +253,8 @@ void sub_block_deinterleaving_cc(uint32_t D,int8_t *d,int8_t *w) {
d[index3-ND3+1] = w[Kpi+k]; d[index3-ND3+1] = w[Kpi+k];
d[index3-ND3+2] = w[(Kpi<<1)+k]; d[index3-ND3+2] = w[(Kpi<<1)+k];
#ifdef RM_DEBUG2 #ifdef RM_DEBUG2
printf("row %d, index %d k %d index3-ND3 %ld w(%d,%d,%d)\n",row,index,k,index3-ND3,w[k],w[Kpi+k],w[(Kpi<<1)+k]); printf("row %d, index %d k %d index3-ND3 %ld w(%d,%d,%d)\n",
row,index,k,(long)(index3-ND3),w[k],w[Kpi+k],w[(Kpi<<1)+k]);
#endif #endif
index3+=96; index3+=96;
index+=32; index+=32;
...@@ -453,7 +454,6 @@ uint32_t lte_rate_matching_turbo(uint32_t RTC, ...@@ -453,7 +454,6 @@ uint32_t lte_rate_matching_turbo(uint32_t RTC,
int threed =0; int threed =0;
uint32_t nulled=0; uint32_t nulled=0;
static unsigned char *counter_buffer[MAX_NUM_DLSCH_SEGMENTS][4]; static unsigned char *counter_buffer[MAX_NUM_DLSCH_SEGMENTS][4];
FILE *counter_fd;
char fname[512]; char fname[512];
#endif #endif
...@@ -476,7 +476,6 @@ uint32_t lte_rate_matching_turbo(uint32_t RTC, ...@@ -476,7 +476,6 @@ uint32_t lte_rate_matching_turbo(uint32_t RTC,
} else if(rvidx==3) { } else if(rvidx==3) {
sprintf(fname, "mcs%d_rate_matching_RB_%d.txt", m, nb_rb); sprintf(fname, "mcs%d_rate_matching_RB_%d.txt", m, nb_rb);
// sprintf(fname,"mcs0_rate_matching_RB_6.txt"); // sprintf(fname,"mcs0_rate_matching_RB_6.txt");
counter_fd = fopen(fname,"w");
} }
#endif #endif
......
...@@ -124,7 +124,8 @@ int lte_segmentation(unsigned char *input_buffer, ...@@ -124,7 +124,8 @@ int lte_segmentation(unsigned char *input_buffer,
Bprime,*Cplus,*Kplus,*Cminus,*Kminus); Bprime,*Cplus,*Kplus,*Cminus,*Kminus);
*F = ((*Cplus)*(*Kplus) + (*Cminus)*(*Kminus) - (Bprime)); *F = ((*Cplus)*(*Kplus) + (*Cminus)*(*Kminus) - (Bprime));
#ifdef DEBUG_SEGMENTATION #ifdef DEBUG_SEGMENTATION
printf("C %u, Cplus %u, Cminus %u, Kplus %u, Kminus %u, Bprime_bytes %u, Bprime %u, F %u\n",*C,*Cplus,*Cminus,*Kplus,*Kminus,Bprime>>3,Bprime,*F); printf("C %u, Cplus %u, Cminus %u, Kplus %u, Kminus %u, Bprime_bytes %u, Bprime %u, F %u\n",
*C,*Cplus,*Cminus,*Kplus,*Kminus,Bprime>>3,Bprime,*F);
#endif #endif
if ((input_buffer) && (output_buffers)) { if ((input_buffer) && (output_buffers)) {
......
...@@ -35,30 +35,22 @@ ...@@ -35,30 +35,22 @@
int lte_dl_mbsfn(PHY_VARS_eNB *eNB, int32_t *output, int lte_dl_mbsfn(PHY_VARS_eNB *eNB, int32_t *output,
short amp, short amp,
int subframe, int subframe,
unsigned char l) unsigned char l) {
{
unsigned int mprime,mprime_dword,mprime_qpsk_symb,m; unsigned int mprime,mprime_dword,mprime_qpsk_symb,m;
unsigned short k=0,a; unsigned short k=0,a;
int32_t qpsk[4]; int32_t qpsk[4];
a = (amp*ONE_OVER_SQRT2_Q15)>>15; a = (amp*ONE_OVER_SQRT2_Q15)>>15;
((short *)&qpsk[0])[0] = a; ((short *)&qpsk[0])[0] = a;
((short *)&qpsk[0])[1] = a; ((short *)&qpsk[0])[1] = a;
((short *)&qpsk[1])[0] = -a; ((short *)&qpsk[1])[0] = -a;
((short *)&qpsk[1])[1] = a; ((short *)&qpsk[1])[1] = a;
((short *)&qpsk[2])[0] = a; ((short *)&qpsk[2])[0] = a;
((short *)&qpsk[2])[1] = -a; ((short *)&qpsk[2])[1] = -a;
((short *)&qpsk[3])[0] = -a; ((short *)&qpsk[3])[0] = -a;
((short *)&qpsk[3])[1] = -a; ((short *)&qpsk[3])[1] = -a;
mprime = 3*(110 - eNB->frame_parms.N_RB_DL); mprime = 3*(110 - eNB->frame_parms.N_RB_DL);
for (m=0; m<eNB->frame_parms.N_RB_DL*6; m++) { for (m=0; m<eNB->frame_parms.N_RB_DL*6; m++) {
if ((l==0) || (l==2)) if ((l==0) || (l==2))
k = m<<1; k = m<<1;
else if (l==1) else if (l==1)
...@@ -69,7 +61,6 @@ int lte_dl_mbsfn(PHY_VARS_eNB *eNB, int32_t *output, ...@@ -69,7 +61,6 @@ int lte_dl_mbsfn(PHY_VARS_eNB *eNB, int32_t *output,
} }
k+=eNB->frame_parms.first_carrier_offset; k+=eNB->frame_parms.first_carrier_offset;
mprime_dword = mprime>>4; mprime_dword = mprime>>4;
mprime_qpsk_symb = mprime&0xf; mprime_qpsk_symb = mprime&0xf;
...@@ -80,22 +71,18 @@ int lte_dl_mbsfn(PHY_VARS_eNB *eNB, int32_t *output, ...@@ -80,22 +71,18 @@ int lte_dl_mbsfn(PHY_VARS_eNB *eNB, int32_t *output,
output[k] = qpsk[(eNB->lte_gold_mbsfn_table[subframe][l][mprime_dword]>>(2*mprime_qpsk_symb))&3]; output[k] = qpsk[(eNB->lte_gold_mbsfn_table[subframe][l][mprime_dword]>>(2*mprime_qpsk_symb))&3];
//output[k] = (lte_gold_table[eNB_offset][subframe][l][mprime_dword]>>(2*mprime_qpsk_symb))&3; //output[k] = (lte_gold_table[eNB_offset][subframe][l][mprime_dword]>>(2*mprime_qpsk_symb))&3;
#ifdef DEBUG_DL_MBSFN #ifdef DEBUG_DL_MBSFN
LOG_D(PHY,"subframe %d, l %d, m %d, mprime %d, mprime_dword %d, mprime_qpsk_symbol %d\n", LOG_D(PHY,"subframe %d, l %d, m %d, mprime %d, mprime_dword %d, mprime_qpsk_symbol %d\n",
subframe,l,m,mprime,mprime_dword,mprime_qpsk_symb); subframe,l,m,mprime,mprime_dword,mprime_qpsk_symb);
LOG_D(PHY,"index = %d (k %d)(%x)\n",(eNB->lte_gold_mbsfn_table[subframe][l][mprime_dword]>>(2*mprime_qpsk_symb))&3,k,eNB->lte_gold_mbsfn_table[subframe][l][mprime_dword]); LOG_D(PHY,"index = %d (k %d)(%x)\n",(eNB->lte_gold_mbsfn_table[subframe][l][mprime_dword]>>(2*mprime_qpsk_symb))&3,k,eNB->lte_gold_mbsfn_table[subframe][l][mprime_dword]);
#endif #endif
mprime++; mprime++;
#ifdef DEBUG_DL_MBSFN #ifdef DEBUG_DL_MBSFN
if (m<18) if (m<18)
printf("subframe %d, l %d output[%d] = (%d,%d)\n",subframe,l,k,((short *)&output[k])[0],((short *)&output[k])[1]); printf("subframe %d, l %d output[%d] = (%d,%d)\n",subframe,l,k,((short *)&output[k])[0],((short *)&output[k])[1]);
#endif #endif
} }
return(0); return(0);
...@@ -106,15 +93,11 @@ int lte_dl_mbsfn(PHY_VARS_eNB *eNB, int32_t *output, ...@@ -106,15 +93,11 @@ int lte_dl_mbsfn(PHY_VARS_eNB *eNB, int32_t *output,
int lte_dl_mbsfn_rx(PHY_VARS_UE *ue, int lte_dl_mbsfn_rx(PHY_VARS_UE *ue,
int *output, int *output,
int subframe, int subframe,
unsigned char l) unsigned char l) {
{
unsigned int mprime,mprime_dword,mprime_qpsk_symb,m; unsigned int mprime,mprime_dword,mprime_qpsk_symb,m;
unsigned short k=0; unsigned short k=0;
unsigned int qpsk[4]; unsigned int qpsk[4];
// This includes complex conjugate for channel estimation // This includes complex conjugate for channel estimation
((short *)&qpsk[0])[0] = ONE_OVER_SQRT2_Q15; ((short *)&qpsk[0])[0] = ONE_OVER_SQRT2_Q15;
((short *)&qpsk[0])[1] = -ONE_OVER_SQRT2_Q15; ((short *)&qpsk[0])[1] = -ONE_OVER_SQRT2_Q15;
((short *)&qpsk[1])[0] = -ONE_OVER_SQRT2_Q15; ((short *)&qpsk[1])[0] = -ONE_OVER_SQRT2_Q15;
...@@ -123,23 +106,18 @@ int lte_dl_mbsfn_rx(PHY_VARS_UE *ue, ...@@ -123,23 +106,18 @@ int lte_dl_mbsfn_rx(PHY_VARS_UE *ue,
((short *)&qpsk[2])[1] = ONE_OVER_SQRT2_Q15; ((short *)&qpsk[2])[1] = ONE_OVER_SQRT2_Q15;
((short *)&qpsk[3])[0] = -ONE_OVER_SQRT2_Q15; ((short *)&qpsk[3])[0] = -ONE_OVER_SQRT2_Q15;
((short *)&qpsk[3])[1] = ONE_OVER_SQRT2_Q15; ((short *)&qpsk[3])[1] = ONE_OVER_SQRT2_Q15;
mprime = 3*(110 - ue->frame_parms.N_RB_DL); mprime = 3*(110 - ue->frame_parms.N_RB_DL);
for (m=0; m<ue->frame_parms.N_RB_DL*6; m++) { for (m=0; m<ue->frame_parms.N_RB_DL*6; m++) {
mprime_dword = mprime>>4; mprime_dword = mprime>>4;
mprime_qpsk_symb = mprime&0xf; mprime_qpsk_symb = mprime&0xf;
// this is r_mprime from 3GPP 36-211 6.10.1.2 // this is r_mprime from 3GPP 36-211 6.10.1.2
output[k] = qpsk[(ue->lte_gold_mbsfn_table[subframe][l][mprime_dword]>>(2*mprime_qpsk_symb))&3]; output[k] = qpsk[(ue->lte_gold_mbsfn_table[subframe][l][mprime_dword]>>(2*mprime_qpsk_symb))&3];
#ifdef DEBUG_DL_MBSFN #ifdef DEBUG_DL_MBSFN
printf("subframe %d, l %d, m %d, mprime %d, mprime_dword %d, mprime_qpsk_symbol %d\n", printf("subframe %d, l %d, m %u, mprime %u, mprime_dword %u, mprime_qpsk_symbol %u\n",
subframe,l,m,mprime, mprime_dword,mprime_qpsk_symb); subframe,l,m,mprime, mprime_dword,mprime_qpsk_symb);
printf("index = %d (k %d) (%x)\n",(ue->lte_gold_mbsfn_table[subframe][l][mprime_dword]>>(2*mprime_qpsk_symb))&3,k,ue->lte_gold_mbsfn_table[subframe][l][mprime_dword]); printf("index = %d (k %d) (%x)\n",(ue->lte_gold_mbsfn_table[subframe][l][mprime_dword]>>(2*mprime_qpsk_symb))&3,k,ue->lte_gold_mbsfn_table[subframe][l][mprime_dword]);
#endif #endif
mprime++; mprime++;
#ifdef DEBUG_DL_MBSFN #ifdef DEBUG_DL_MBSFN
...@@ -148,7 +126,6 @@ int lte_dl_mbsfn_rx(PHY_VARS_UE *ue, ...@@ -148,7 +126,6 @@ int lte_dl_mbsfn_rx(PHY_VARS_UE *ue,
#endif #endif
k++; k++;
} }
return(0); return(0);
......
...@@ -20,9 +20,9 @@ ...@@ -20,9 +20,9 @@
*/ */
#ifdef MAIN #ifdef MAIN
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <math.h> #include <math.h>
#endif #endif
#include "lte_refsig.h" #include "lte_refsig.h"
#include "PHY/defs_eNB.h" #include "PHY/defs_eNB.h"
...@@ -43,8 +43,7 @@ char ref24[720] = { ...@@ -43,8 +43,7 @@ char ref24[720] = {
-1,3,1,-3,3,-1,1,3,-3,3,1,3,-3,3,1,1,-1,1,3,-3,3,-3,-1,-3,-3,3,-3,-3,-3,1,-3,-3,3,-1,1,1,1,3,1,-1,3,-3,-3,1,3,1,1,-3,3,-1,3,3,1,1,-3,3,3,3,3,1,-1,3,-1,1,1,-1,-3,-1,-1,1,3,3,-1,-3,1,1,3,-3,1,1,-3,-1,-1,1,3,1,3,1,-1,3,1,1,-3,-1,-3,-1,-1,-1,-1,-3,-3,-1,1,1,3,3,-1,3,-1,1,-1,-3,1,-1,-3,-3,1,-3,-1,-1,-3,1,1,3,-1,1,3,1,-3,1,-3,1,1,-1,-1,3,-1,-3,3,-3,-3,-3,1,1,1,1,-1,-1,3,-3,-3,3,-3,1,-1,-1,1,-1,1,1,-1,-3,-1,1,-1,3,-1,-3,-3,3,3,-1,-1,-3,-1,3,1,3,1,3,1,1,-1,3,1,-1,1,3,-3,-1,-1,1,-3,1,3,-3,1,-1,-3,3,-3,3,-1,-1,-1,-1,1,-3,-3,-3,1,-3,-3,-3,1,-3,1,1,-3,3,3,-1,-3,-1,3,-3,3,3,3,-1,1,1,-3,1,-1,1,1,-3,1,1,-1,1,-3,-3,3,-1,3,-1,-1,-3,-3,-3,-1,-3,-3,1,-1,1,3,3,-1,1,-1,3,1,3,3,-3,-3,1,3,1,-1,-3,-3,-3,3,3,-3,3,3,-1,-3,3,-1,1,-3,1,1,3,3,1,1,1,-1,-1,1,-3,3,-1,1,1,-3,3,3,-1,-3,3,-3,-1,-3,-1,3,-1,-1,-1,-1,-3,-1,3,3,1,-1,1,3,3,3,-1,1,1,-3,1,3,-1,-3,3,-3,-3,3,1,3,1,-3,3,1,3,1,1,3,3,-1,-1,-3,1,-3,-1,3,1,1,3,-1,-1,1,-3,1,3,-3,1,-1,-3,-1,3,1,3,1,-1,-3,-3,-1,-1,-3,-3,-3,-1,-1,-3,3,-1,-1,-1,-1,1,1,-3,3,1,3,3,1,-1,1,-3,1,-3,1,1,-3,-1,1,3,-1,3,3,-1,-3,1,-1,-3,3,3,3,-1,1,1,3,-1,-3,-1,3,-1,-1,-1,1,1,1,1,1,-1,3,-1,-3,1,1,3,-3,1,-3,-1,1,1,-3,-3,3,1,1,-3,1,3,3,1,-1,-3,3,-1,3,3,3,-3,1,-1,1,-1,-3,-1,1,3,-1,3,-3,-3,-1,-3,3,-3,-3,-3,-1,-1,-3,-1,-3,3,1,3,-3,-1,3,-1,1,-1,3,-3,1,-1,-3,-3,1,1,-1,1,-1,1,-1,3,1,-3,-1,1,-1,1,-1,-1,3,3,-3,-1,1,-3,-3,-1,-3,3,1,-1,-3,-1,-3,-3,3,-3,3,-3,-1,1,3,1,-3,1,3,3,-1,-3,-1,-1,-1,-1,3,3,3,1,3,3,-3,1,3,-1,3,-1,3,3,-3,3,1,-1,3,3,1,-1,3,3,-1,-3,3,-3,-1,-1,3,-1,3,-1,-1,1,1,1,1,-1,-1,-3,-1,3,1,-1,1,-1,3,-1,3,1,1,-1,-1,-3,1,1,-3,1,3,-3,1,1,-3,-3,-1,-1,-3,-1,1,3,1,1,-3,-1,-1,-3,3,-3,3,1,-3,3,-3,1,-1,1,-3,1,1,1,-1,-3,3,3,1,1,3,-1,-3,-1,-1,-1,3,1,-3,-3,-1,3,-3,-1,-3,-1,-3,-1,-1,-3,-1,-1,1,-3,-1,-1,1,-1,-3,1,1,-3,1,-3,-3,3,1,1,-1,3,-1,-1,1,1,-1,-1,-3,-1,3,-1,3,-1,1,3,1,-1,3,1,3,-3,-3,1,-1,-1,1,3 -1,3,1,-3,3,-1,1,3,-3,3,1,3,-3,3,1,1,-1,1,3,-3,3,-3,-1,-3,-3,3,-3,-3,-3,1,-3,-3,3,-1,1,1,1,3,1,-1,3,-3,-3,1,3,1,1,-3,3,-1,3,3,1,1,-3,3,3,3,3,1,-1,3,-1,1,1,-1,-3,-1,-1,1,3,3,-1,-3,1,1,3,-3,1,1,-3,-1,-1,1,3,1,3,1,-1,3,1,1,-3,-1,-3,-1,-1,-1,-1,-3,-3,-1,1,1,3,3,-1,3,-1,1,-1,-3,1,-1,-3,-3,1,-3,-1,-1,-3,1,1,3,-1,1,3,1,-3,1,-3,1,1,-1,-1,3,-1,-3,3,-3,-3,-3,1,1,1,1,-1,-1,3,-3,-3,3,-3,1,-1,-1,1,-1,1,1,-1,-3,-1,1,-1,3,-1,-3,-3,3,3,-1,-1,-3,-1,3,1,3,1,3,1,1,-1,3,1,-1,1,3,-3,-1,-1,1,-3,1,3,-3,1,-1,-3,3,-3,3,-1,-1,-1,-1,1,-3,-3,-3,1,-3,-3,-3,1,-3,1,1,-3,3,3,-1,-3,-1,3,-3,3,3,3,-1,1,1,-3,1,-1,1,1,-3,1,1,-1,1,-3,-3,3,-1,3,-1,-1,-3,-3,-3,-1,-3,-3,1,-1,1,3,3,-1,1,-1,3,1,3,3,-3,-3,1,3,1,-1,-3,-3,-3,3,3,-3,3,3,-1,-3,3,-1,1,-3,1,1,3,3,1,1,1,-1,-1,1,-3,3,-1,1,1,-3,3,3,-1,-3,3,-3,-1,-3,-1,3,-1,-1,-1,-1,-3,-1,3,3,1,-1,1,3,3,3,-1,1,1,-3,1,3,-1,-3,3,-3,-3,3,1,3,1,-3,3,1,3,1,1,3,3,-1,-1,-3,1,-3,-1,3,1,1,3,-1,-1,1,-3,1,3,-3,1,-1,-3,-1,3,1,3,1,-1,-3,-3,-1,-1,-3,-3,-3,-1,-1,-3,3,-1,-1,-1,-1,1,1,-3,3,1,3,3,1,-1,1,-3,1,-3,1,1,-3,-1,1,3,-1,3,3,-1,-3,1,-1,-3,3,3,3,-1,1,1,3,-1,-3,-1,3,-1,-1,-1,1,1,1,1,1,-1,3,-1,-3,1,1,3,-3,1,-3,-1,1,1,-3,-3,3,1,1,-3,1,3,3,1,-1,-3,3,-1,3,3,3,-3,1,-1,1,-1,-3,-1,1,3,-1,3,-3,-3,-1,-3,3,-3,-3,-3,-1,-1,-3,-1,-3,3,1,3,-3,-1,3,-1,1,-1,3,-3,1,-1,-3,-3,1,1,-1,1,-1,1,-1,3,1,-3,-1,1,-1,1,-1,-1,3,3,-3,-1,1,-3,-3,-1,-3,3,1,-1,-3,-1,-3,-3,3,-3,3,-3,-1,1,3,1,-3,1,3,3,-1,-3,-1,-1,-1,-1,3,3,3,1,3,3,-3,1,3,-1,3,-1,3,3,-3,3,1,-1,3,3,1,-1,3,3,-1,-3,3,-3,-1,-1,3,-1,3,-1,-1,1,1,1,1,-1,-1,-3,-1,3,1,-1,1,-1,3,-1,3,1,1,-1,-1,-3,1,1,-3,1,3,-3,1,1,-3,-3,-1,-1,-3,-1,1,3,1,1,-3,-1,-1,-3,3,-3,3,1,-3,3,-3,1,-1,1,-3,1,1,1,-1,-3,3,3,1,1,3,-1,-3,-1,-1,-1,3,1,-3,-3,-1,3,-3,-1,-3,-1,-3,-1,-1,-3,-1,-1,1,-3,-1,-1,1,-1,-3,1,1,-3,1,-3,-3,3,1,1,-1,3,-1,-1,1,1,-1,-1,-3,-1,3,-1,3,-1,1,3,1,-1,3,1,3,-3,-3,1,-1,-1,1,3
}; };
void generate_ul_ref_sigs(void) void generate_ul_ref_sigs(void) {
{
double qbar,phase; double qbar,phase;
unsigned int u,v,Msc_RS,q,m,n; unsigned int u,v,Msc_RS,q,m,n;
...@@ -53,7 +52,7 @@ void generate_ul_ref_sigs(void) ...@@ -53,7 +52,7 @@ void generate_ul_ref_sigs(void)
for (u=0; u<30; u++) { for (u=0; u<30; u++) {
for (v=0; v<2; v++) { for (v=0; v<2; v++) {
qbar = ref_primes[Msc_RS] * (u+1)/(double)31; qbar = ref_primes[Msc_RS] * (u+1)/(double)31;
ul_ref_sigs[u][v][Msc_RS] = (int16_t*)malloc16(2*sizeof(int16_t)*dftsizes[Msc_RS]); ul_ref_sigs[u][v][Msc_RS] = (int16_t *)malloc16(2*sizeof(int16_t)*dftsizes[Msc_RS]);
if ((((int)floor(2*qbar))&1) == 0) if ((((int)floor(2*qbar))&1) == 0)
q = (int)(floor(qbar+.5)) - v; q = (int)(floor(qbar+.5)) - v;
...@@ -61,7 +60,7 @@ void generate_ul_ref_sigs(void) ...@@ -61,7 +60,7 @@ void generate_ul_ref_sigs(void)
q = (int)(floor(qbar+.5)) + v; q = (int)(floor(qbar+.5)) + v;
#ifdef MAIN #ifdef MAIN
printf("Msc_RS %d (%d), u %d, v %d -> q %d (qbar %f)\n",Msc_RS,dftsizes[Msc_RS],u,v,q,qbar); printf("Msc_RS %u (%d), u %u, v %u -> q %u (qbar %f)\n",Msc_RS,dftsizes[Msc_RS],u,v,q,qbar);
#endif #endif
for (n=0; n<dftsizes[Msc_RS]; n++) { for (n=0; n<dftsizes[Msc_RS]; n++) {
...@@ -89,32 +88,26 @@ void generate_ul_ref_sigs(void) ...@@ -89,32 +88,26 @@ void generate_ul_ref_sigs(void)
// These are the sequences for RB 1 // These are the sequences for RB 1
for (u=0; u<30; u++) { for (u=0; u<30; u++) {
ul_ref_sigs[u][0][0] = (int16_t*)malloc16(2*sizeof(int16_t)*dftsizes[0]); ul_ref_sigs[u][0][0] = (int16_t *)malloc16(2*sizeof(int16_t)*dftsizes[0]);
for (n=0; n<dftsizes[0]; n++) { for (n=0; n<dftsizes[0]; n++) {
ul_ref_sigs[u][0][0][n<<1] =(int16_t)(floor(32767*cos(M_PI*ref12[(u*12) + n]/4))); ul_ref_sigs[u][0][0][n<<1] =(int16_t)(floor(32767*cos(M_PI*ref12[(u*12) + n]/4)));
ul_ref_sigs[u][0][0][1+(n<<1)]=(int16_t)(floor(32767*sin(M_PI*ref12[(u*12) + n]/4))); ul_ref_sigs[u][0][0][1+(n<<1)]=(int16_t)(floor(32767*sin(M_PI*ref12[(u*12) + n]/4)));
} }
} }
// These are the sequences for RB 2 // These are the sequences for RB 2
for (u=0; u<30; u++) { for (u=0; u<30; u++) {
ul_ref_sigs[u][0][1] = (int16_t*)malloc16(2*sizeof(int16_t)*dftsizes[1]); ul_ref_sigs[u][0][1] = (int16_t *)malloc16(2*sizeof(int16_t)*dftsizes[1]);
for (n=0; n<dftsizes[1]; n++) { for (n=0; n<dftsizes[1]; n++) {
ul_ref_sigs[u][0][1][n<<1] =(int16_t)(floor(32767*cos(M_PI*ref24[(u*24) + n]/4))); ul_ref_sigs[u][0][1][n<<1] =(int16_t)(floor(32767*cos(M_PI*ref24[(u*24) + n]/4)));
ul_ref_sigs[u][0][1][1+(n<<1)]=(int16_t)(floor(32767*sin(M_PI*ref24[(u*24) + n]/4))); ul_ref_sigs[u][0][1][1+(n<<1)]=(int16_t)(floor(32767*sin(M_PI*ref24[(u*24) + n]/4)));
} }
} }
} }
void generate_ul_ref_sigs_rx(void) void generate_ul_ref_sigs_rx(void) {
{
double qbar,phase; double qbar,phase;
unsigned int u,v,Msc_RS,q,m,n; unsigned int u,v,Msc_RS,q,m,n;
...@@ -123,7 +116,7 @@ void generate_ul_ref_sigs_rx(void) ...@@ -123,7 +116,7 @@ void generate_ul_ref_sigs_rx(void)
for (u=0; u<30; u++) { for (u=0; u<30; u++) {
for (v=0; v<2; v++) { for (v=0; v<2; v++) {
qbar = ref_primes[Msc_RS] * (u+1)/(double)31; qbar = ref_primes[Msc_RS] * (u+1)/(double)31;
ul_ref_sigs_rx[u][v][Msc_RS] = (int16_t*)malloc16(2*sizeof(int16_t)*dftsizes[Msc_RS]); ul_ref_sigs_rx[u][v][Msc_RS] = (int16_t *)malloc16(2*sizeof(int16_t)*dftsizes[Msc_RS]);
if ((((int)floor(2*qbar))&1) == 0) if ((((int)floor(2*qbar))&1) == 0)
q = (int)(floor(qbar+.5)) - v; q = (int)(floor(qbar+.5)) - v;
...@@ -131,7 +124,7 @@ void generate_ul_ref_sigs_rx(void) ...@@ -131,7 +124,7 @@ void generate_ul_ref_sigs_rx(void)
q = (int)(floor(qbar+.5)) + v; q = (int)(floor(qbar+.5)) + v;
#ifdef MAIN #ifdef MAIN
printf("Msc_RS %d (%d), u %d, v %d -> q %d (qbar %f)\n",Msc_RS,dftsizes[Msc_RS],u,v,q,qbar); printf("Msc_RS %u (%d), u %u, v %u -> q %u (qbar %f)\n",Msc_RS,dftsizes[Msc_RS],u,v,q,qbar);
#endif #endif
for (n=0; n<dftsizes[Msc_RS]; n++) { for (n=0; n<dftsizes[Msc_RS]; n++) {
...@@ -159,7 +152,7 @@ void generate_ul_ref_sigs_rx(void) ...@@ -159,7 +152,7 @@ void generate_ul_ref_sigs_rx(void)
// These are the sequences for RB 1 // These are the sequences for RB 1
for (u=0; u<30; u++) { for (u=0; u<30; u++) {
ul_ref_sigs_rx[u][0][0] = (int16_t*)malloc16(2*sizeof(int16_t)*dftsizes[0]); ul_ref_sigs_rx[u][0][0] = (int16_t *)malloc16(2*sizeof(int16_t)*dftsizes[0]);
for (n=0; n<dftsizes[0]; n++) { for (n=0; n<dftsizes[0]; n++) {
ul_ref_sigs_rx[u][0][0][n<<1] = (int16_t)(floor(32767*cos(M_PI*ref12[(u*12) + n]/4))); ul_ref_sigs_rx[u][0][0][n<<1] = (int16_t)(floor(32767*cos(M_PI*ref12[(u*12) + n]/4)));
...@@ -169,21 +162,17 @@ void generate_ul_ref_sigs_rx(void) ...@@ -169,21 +162,17 @@ void generate_ul_ref_sigs_rx(void)
// These are the sequences for RB 2 // These are the sequences for RB 2
for (u=0; u<30; u++) { for (u=0; u<30; u++) {
ul_ref_sigs_rx[u][0][1] = (int16_t*)malloc16(2*sizeof(int16_t)*dftsizes[1]); ul_ref_sigs_rx[u][0][1] = (int16_t *)malloc16(2*sizeof(int16_t)*dftsizes[1]);
for (n=0; n<dftsizes[1]; n++) { for (n=0; n<dftsizes[1]; n++) {
ul_ref_sigs_rx[u][0][1][n<<1] = (int16_t)(floor(32767*cos(M_PI*ref24[(u*24) + n]/4))); ul_ref_sigs_rx[u][0][1][n<<1] = (int16_t)(floor(32767*cos(M_PI*ref24[(u*24) + n]/4)));
ul_ref_sigs_rx[u][0][1][1+(n<<1)]= (int16_t)(floor(32767*sin(M_PI*ref24[(u*24) + n]/4))); ul_ref_sigs_rx[u][0][1][1+(n<<1)]= (int16_t)(floor(32767*sin(M_PI*ref24[(u*24) + n]/4)));
} }
} }
} }
void free_ul_ref_sigs(void) void free_ul_ref_sigs(void) {
{
unsigned int u,v,Msc_RS; unsigned int u,v,Msc_RS;
for (Msc_RS=0; Msc_RS<34; Msc_RS++) { for (Msc_RS=0; Msc_RS<34; Msc_RS++) {
...@@ -204,9 +193,7 @@ void free_ul_ref_sigs(void) ...@@ -204,9 +193,7 @@ void free_ul_ref_sigs(void)
} }
#ifdef MAIN #ifdef MAIN
main() main() {
{
generate_ul_ref_sigs(); generate_ul_ref_sigs();
generate_ul_ref_sigs_rx(); generate_ul_ref_sigs_rx();
free_ul_ref_sigs(); free_ul_ref_sigs();
......
This diff is collapsed.
...@@ -1960,6 +1960,10 @@ int allocate_REs_in_RB_MCH(int32_t **txdataF, ...@@ -1960,6 +1960,10 @@ int allocate_REs_in_RB_MCH(int32_t **txdataF,
case 4: //16QAM case 4: //16QAM
if (qam_table_s == NULL) {
LOG_E(PHY,"qam table pointer is NULL\n");
return -1;
}
qam16_table_offset_re = 0; qam16_table_offset_re = 0;
qam16_table_offset_im = 0; qam16_table_offset_im = 0;
...@@ -2029,7 +2033,9 @@ int allocate_REs_in_RB_MCH(int32_t **txdataF, ...@@ -2029,7 +2033,9 @@ int allocate_REs_in_RB_MCH(int32_t **txdataF,
((int16_t *)&txdataF[4][tti_offset])[1]=qam_table_s[qam64_table_offset_im];//(int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_im])>>15); ((int16_t *)&txdataF[4][tti_offset])[1]=qam_table_s[qam64_table_offset_im];//(int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_im])>>15);
break; break;
default:
LOG_E(PHY,"Invalid modulation order %i_n",mod_order);
break;
} }
} }
......
...@@ -308,7 +308,7 @@ int generate_pbch(LTE_eNB_PBCH *eNB_pbch, ...@@ -308,7 +308,7 @@ int generate_pbch(LTE_eNB_PBCH *eNB_pbch,
#ifdef DEBUG_PBCH #ifdef DEBUG_PBCH
if (frame_mod4==0) { if (frame_mod4==0) {
LOG_M"pbch_e.m","pbch_e", LOG_M("pbch_e.m","pbch_e",
eNB_pbch->pbch_e, eNB_pbch->pbch_e,
pbch_E, pbch_E,
1, 1,
...@@ -325,7 +325,7 @@ int generate_pbch(LTE_eNB_PBCH *eNB_pbch, ...@@ -325,7 +325,7 @@ int generate_pbch(LTE_eNB_PBCH *eNB_pbch,
pbch_E); pbch_E);
#ifdef DEBUG_PBCH #ifdef DEBUG_PBCH
if (frame_mod4==0) { if (frame_mod4==0) {
LOG_M"pbch_e_s.m","pbch_e_s", LOG_M("pbch_e_s.m","pbch_e_s",
eNB_pbch->pbch_e, eNB_pbch->pbch_e,
pbch_E, pbch_E,
1, 1,
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment