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

This commit is contained in:
Louis Adrien Dufrene
2019-02-18 10:46:13 +01:00
177 changed files with 25622 additions and 23943 deletions
+1
View File
@@ -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.
+6 -1
View File
@@ -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 {
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''',
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 {
+92
View File
@@ -0,0 +1,92 @@
// *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*
+1
View File
@@ -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"
+3 -3
View File
@@ -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
;; ;;
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)
+17 -1
View File
@@ -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 {
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 {
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
+16
View File
@@ -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 {
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
+27 -2
View File
@@ -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 {
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 else
UE_SYNC=1 UE_SYNC=1
echo "L2-SIM UE is sync'ed w/eNB" 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
UE_SYNC=1
echo "L2-SIM UE oip1 is sync'ed w/ EPC"
fi fi
sleep 10 sleep 10
} }
+13 -2
View File
@@ -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() {
# 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
} }
+2 -1
View File
@@ -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);
} }
} }
+154 -94
View File
@@ -31,7 +31,7 @@ typedef struct {
int remote_port; int remote_port;
pthread_mutex_t lock; pthread_mutex_t lock;
pthread_cond_t cond; pthread_cond_t cond;
databuf * volatile head, *tail; databuf *volatile head, *tail;
uint64_t memusage; uint64_t memusage;
uint64_t last_warning_memusage; uint64_t last_warning_memusage;
} forward_data; } forward_data;
@@ -40,80 +40,115 @@ typedef struct {
/* utility functions */ /* utility functions */
/****************************************************************************/ /****************************************************************************/
static void new_thread(void *(*f)(void *), void *data) static 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);
}
} }
static int get_connection(char *addr, int port) static int get_connection(char *addr, int port) {
{
struct sockaddr_in a; struct sockaddr_in a;
socklen_t alen; socklen_t alen;
int s, t; int s, t;
printf("T tracer: waiting for connection on %s:%d\n", addr, port); printf("T tracer: waiting for connection on %s:%d\n", addr, port);
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);
}
t = 1; t = 1;
if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &t, sizeof(int)))
{ perror("setsockopt"); exit(1); } if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &t, 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("bind"); exit(1); } perror("bind");
exit(1);
}
if (listen(s, 5)) {
perror("bind");
exit(1);
}
alen = sizeof(a); alen = sizeof(a);
t = accept(s, (struct sockaddr *)&a, &alen); t = accept(s, (struct sockaddr *)&a, &alen);
if (t == -1) { perror("accept"); exit(1); }
if (t == -1) {
perror("accept");
exit(1);
}
close(s); close(s);
printf("T tracer: connected\n"); printf("T tracer: connected\n");
return t; return t;
} }
static void forward(void *_forwarder, char *buf, int size); static void forward(void *_forwarder, char *buf, int size);
void send_T_messages_txt(void *forwarder) void send_T_messages_txt(void *forwarder) {
{
char buf[T_BUFFER_MAX]; char buf[T_BUFFER_MAX];
char *T_LOCAL_buf = buf; char *T_LOCAL_buf = buf;
int T_LOCAL_size; int T_LOCAL_size;
unsigned char *src; unsigned char *src;
int src_len; int src_len;
/* trace T_message.txt /* trace T_message.txt
* Send several messages -1 with content followed by message -2. * Send several messages -1 with content followed by message -2.
*/ */
src = T_messages_txt; src = T_messages_txt;
src_len = T_messages_txt_len; src_len = T_messages_txt_len;
while (src_len) { while (src_len) {
int send_size = src_len; int send_size = src_len;
if (send_size > T_PAYLOAD_MAXSIZE - sizeof(int)) if (send_size > T_PAYLOAD_MAXSIZE - sizeof(int))
send_size = T_PAYLOAD_MAXSIZE - sizeof(int); send_size = T_PAYLOAD_MAXSIZE - sizeof(int);
/* TODO: be careful, we use internal T stuff, to rewrite? */ /* TODO: be careful, we use internal T stuff, to rewrite? */
T_LOCAL_size = 0; T_LOCAL_size = 0;
T_HEADER(T_ID(-1)); T_HEADER(T_ID(-1));
T_PUT_buffer(1, ((T_buffer){addr:(src), length:(send_size)})); T_PUT_buffer(1, ((T_buffer) {
addr:
(src), length:
(send_size)
}));
forward(forwarder, buf, T_LOCAL_size); forward(forwarder, buf, T_LOCAL_size);
src += send_size; src += send_size;
src_len -= send_size; src_len -= send_size;
} }
T_LOCAL_size = 0; T_LOCAL_size = 0;
T_HEADER(T_ID(-2)); T_HEADER(T_ID(-2));
forward(forwarder, buf, T_LOCAL_size); forward(forwarder, buf, T_LOCAL_size);
@@ -123,49 +158,54 @@ void send_T_messages_txt(void *forwarder)
/* forward functions */ /* forward functions */
/****************************************************************************/ /****************************************************************************/
static void *data_sender(void *_f) static void *data_sender(void *_f) {
{
forward_data *f = _f; forward_data *f = _f;
databuf *cur; databuf *cur;
char *buf, *b; char *buf, *b;
int size; int size;
wait: wait:
if (pthread_mutex_lock(&f->lock)) abort(); if (pthread_mutex_lock(&f->lock)) abort();
while (f->head == NULL) while (f->head == NULL)
if (pthread_cond_wait(&f->cond, &f->lock)) abort(); if (pthread_cond_wait(&f->cond, &f->lock)) abort();
cur = f->head; cur = f->head;
buf = cur->d; buf = cur->d;
size = cur->l; size = cur->l;
f->head = cur->next; f->head = cur->next;
f->memusage -= size; f->memusage -= size;
if (f->head == NULL) f->tail = NULL; if (f->head == NULL) f->tail = NULL;
if (pthread_mutex_unlock(&f->lock)) abort(); if (pthread_mutex_unlock(&f->lock)) abort();
free(cur); free(cur);
goto process; goto process;
process: process:
b = buf; b = buf;
if (f->socket_remote != -1) if (f->socket_remote != -1)
while (size) { while (size) {
int l = write(f->socket_remote, b, size); int l = write(f->socket_remote, b, size);
if (l <= 0) {
printf("T tracer: forward error\n"); if (l <= 0) {
close(f->socket_remote); printf("T tracer: forward error\n");
f->socket_remote = -1; close(f->socket_remote);
break; f->socket_remote = -1;
break;
}
size -= l;
b += l;
} }
size -= l;
b += l;
}
free(buf); free(buf);
goto wait; goto wait;
} }
static void *forward_remote_messages(void *_f)
{ static void *forward_remote_messages(void *_f) {
#define PUT(x) do { \ #define PUT(x) do { \
if (bufsize == bufmaxsize) { \ if (bufsize == bufmaxsize) { \
bufmaxsize += 4096; \ bufmaxsize += 4096; \
@@ -180,7 +220,6 @@ static void *forward_remote_messages(void *_f)
int len = l; \ int len = l; \
while (len) { PUT(*zz); zz++; len--; } \ while (len) { PUT(*zz); zz++; len--; } \
} while (0) } while (0)
forward_data *f = _f; forward_data *f = _f;
int from; int from;
int to; int to;
@@ -190,43 +229,53 @@ static void *forward_remote_messages(void *_f)
int bufsize = 0; int bufsize = 0;
int bufmaxsize = 0; int bufmaxsize = 0;
char t; char t;
again: again:
while (1) { while (1) {
from = f->socket_remote; from = f->socket_remote;
to = f->socket_local; to = f->socket_local;
bufsize = 0; bufsize = 0;
/* let's read and process messages */ /* let's read and process messages */
len = read(from, &t, 1); if (len <= 0) goto dead; len = read(from, &t, 1);
if (len <= 0) goto dead;
PUT(t); PUT(t);
switch (t) { switch (t) {
case 0: case 0:
case 1: case 1:
/* message 0 and 1: get a length and then 'length' numbers */
if (read(from, &len, sizeof(int)) != sizeof(int)) goto dead;
PUT_BUF(&len, 4);
while (len) {
if (read(from, &l, sizeof(int)) != sizeof(int)) goto dead;
PUT_BUF(&l, 4);
len--;
}
break;
case 2: break; /* message 0 and 1: get a length and then 'length' numbers */
default: if (read(from, &len, sizeof(int)) != sizeof(int)) goto dead;
printf("%s:%d:%s: unhandled message type %d\n",
__FILE__, __LINE__, __FUNCTION__, t); PUT_BUF(&len, 4);
abort();
while (len) {
if (read(from, &l, sizeof(int)) != sizeof(int)) goto dead;
PUT_BUF(&l, 4);
len--;
}
break;
case 2:
break;
default:
printf("%s:%d:%s: unhandled message type %d\n",
__FILE__, __LINE__, __FUNCTION__, t);
abort();
} }
b = buf; b = buf;
while (bufsize) { while (bufsize) {
l = write(to, b, bufsize); l = write(to, b, bufsize);
if (l <= 0) abort(); if (l <= 0) abort();
bufsize -= l; bufsize -= l;
b += l; b += l;
} }
@@ -236,71 +285,80 @@ dead:
/* socket died, let's stop all traces and wait for another tracer */ /* socket died, let's stop all traces and wait for another tracer */
/* TODO: be careful with those write, they might write less than wanted */ /* TODO: be careful with those write, they might write less than wanted */
buf[0] = 1; buf[0] = 1;
if (write(to, buf, 1) != 1) abort(); if (write(to, buf, 1) != 1) abort();
len = T_NUMBER_OF_IDS; len = T_NUMBER_OF_IDS;
if (write(to, &len, sizeof(int)) != sizeof(int)) abort(); if (write(to, &len, sizeof(int)) != sizeof(int)) abort();
l = 0; l = 0;
while (len) { while (len) {
if (write(to, &l, sizeof(int)) != sizeof(int)) abort(); if (write(to, &l, sizeof(int)) != sizeof(int)) abort();
len--; len--;
}; };
close(f->socket_remote); close(f->socket_remote);
f->socket_remote = get_connection("0.0.0.0", f->remote_port); f->socket_remote = get_connection("0.0.0.0", f->remote_port);
send_T_messages_txt(f); send_T_messages_txt(f);
goto again; goto again;
return NULL; return NULL;
} }
static void *forwarder(int port, int s) static void *forwarder(int port, int s) {
{
forward_data *f; forward_data *f;
f = malloc(sizeof(*f));
f = malloc(sizeof(*f)); if (f == NULL) abort(); if (f == NULL) abort();
pthread_mutex_init(&f->lock, NULL); pthread_mutex_init(&f->lock, NULL);
pthread_cond_init(&f->cond, NULL); pthread_cond_init(&f->cond, NULL);
f->socket_local = s; f->socket_local = s;
f->head = f->tail = NULL; f->head = f->tail = NULL;
f->memusage = 0; f->memusage = 0;
f->last_warning_memusage = 0; f->last_warning_memusage = 0;
printf("T tracer: waiting for remote tracer on port %d\n", port); printf("T tracer: waiting for remote tracer on port %d\n", port);
f->remote_port = port; f->remote_port = port;
f->socket_remote = get_connection("0.0.0.0", port); f->socket_remote = get_connection("0.0.0.0", port);
send_T_messages_txt(f); send_T_messages_txt(f);
new_thread(data_sender, f); new_thread(data_sender, f);
new_thread(forward_remote_messages, f); new_thread(forward_remote_messages, f);
return f; return f;
} }
static void forward(void *_forwarder, char *buf, int size) static void forward(void *_forwarder, char *buf, int size) {
{
forward_data *f = _forwarder; forward_data *f = _forwarder;
int32_t ssize = size; int32_t ssize = size;
databuf *new; databuf *new;
new = malloc(sizeof(*new));
new = malloc(sizeof(*new)); if (new == NULL) abort(); if (new == NULL) abort();
if (pthread_mutex_lock(&f->lock)) abort(); if (pthread_mutex_lock(&f->lock)) abort();
new->d = malloc(size + 4); if (new->d == NULL) abort(); new->d = malloc(size + 4);
if (new->d == NULL) abort();
/* put the size of the message at the head */ /* put the size of the message at the head */
memcpy(new->d, &ssize, 4); memcpy(new->d, &ssize, 4);
memcpy(new->d+4, buf, size); memcpy(new->d+4, buf, size);
new->l = size+4; new->l = size+4;
new->next = NULL; new->next = NULL;
if (f->head == NULL) f->head = new;
if (f->tail != NULL) f->tail->next = new;
f->tail = new;
if (f->head == NULL) f->head = new;
if (f->tail != NULL) f->tail->next = new;
f->tail = new;
#if BASIC_SIMULATOR #if BASIC_SIMULATOR
/* When runnng the basic simulator, the tracer may be too slow. /* When runnng the basic simulator, the tracer may be too slow.
* Let's not take too much memory in the tracee and * Let's not take too much memory in the tracee and
* wait if there is too much data to send. 200MB is * wait if there is too much data to send. 200MB is
@@ -308,26 +366,30 @@ static void forward(void *_forwarder, char *buf, int size)
*/ */
while (f->memusage > 200 * 1024 * 1024) { while (f->memusage > 200 * 1024 * 1024) {
if (pthread_cond_signal(&f->cond)) abort(); if (pthread_cond_signal(&f->cond)) abort();
if (pthread_mutex_unlock(&f->lock)) abort(); if (pthread_mutex_unlock(&f->lock)) abort();
usleep(1000); usleep(1000);
if (pthread_mutex_lock(&f->lock)) abort(); if (pthread_mutex_lock(&f->lock)) abort();
} }
#endif /* BASIC_SIMULATOR */
#endif /* BASIC_SIMULATOR */
f->memusage += size+4; f->memusage += size+4;
/* warn every 100MB */ /* warn every 100MB */
if (f->memusage > f->last_warning_memusage && if (f->memusage > f->last_warning_memusage &&
f->memusage - f->last_warning_memusage > 100000000) { f->memusage - f->last_warning_memusage > 100000000) {
f->last_warning_memusage += 100000000; f->last_warning_memusage += 100000000;
printf("T tracer: WARNING: memory usage is over %"PRIu64"MB\n", printf("T tracer: WARNING: memory usage is over %"PRIu64"MB\n",
f->last_warning_memusage / 1000000); f->last_warning_memusage / 1000000);
} else } else if (f->memusage < f->last_warning_memusage &&
if (f->memusage < f->last_warning_memusage && f->last_warning_memusage - f->memusage > 100000000) {
f->last_warning_memusage - f->memusage > 100000000) {
f->last_warning_memusage = (f->memusage/100000000) * 100000000; f->last_warning_memusage = (f->memusage/100000000) * 100000000;
} }
if (pthread_cond_signal(&f->cond)) abort(); if (pthread_cond_signal(&f->cond)) abort();
if (pthread_mutex_unlock(&f->lock)) abort(); if (pthread_mutex_unlock(&f->lock)) abort();
} }
@@ -335,14 +397,12 @@ static void forward(void *_forwarder, char *buf, int size)
/* local functions */ /* local functions */
/****************************************************************************/ /****************************************************************************/
static void wait_message(void) static void wait_message(void) {
{
while ((T_local_cache[T_busylist_head].busy & 0x02) == 0) usleep(1000); while ((T_local_cache[T_busylist_head].busy & 0x02) == 0) usleep(1000);
} }
void T_local_tracer_main(int remote_port, int wait_for_tracer, void T_local_tracer_main(int remote_port, int wait_for_tracer,
int local_socket, void *shm_array) int local_socket, void *shm_array) {
{
int s; int s;
int port = remote_port; int port = remote_port;
int dont_wait = wait_for_tracer ? 0 : 1; int dont_wait = wait_for_tracer ? 0 : 1;
@@ -350,16 +410,16 @@ void T_local_tracer_main(int remote_port, int wait_for_tracer,
/* write on a socket fails if the other end is closed and we get SIGPIPE */ /* write on a socket fails if the other end is closed and we get SIGPIPE */
if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) { if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) {
printf("local tracer received SIGPIPE\n"); printf("local tracer received SIGPIPE\n");
abort(); abort();
} }
T_local_cache = shm_array; T_local_cache = shm_array;
s = local_socket; s = local_socket;
if (dont_wait) { if (dont_wait) {
char t = 2; char t = 2;
if (write(s, &t, 1) != 1) abort(); if (write(s, &t, 1) != 1) abort();
} }
+15 -22
View File
@@ -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)
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)
/* 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,
* 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;
} }
+68 -32
View File
@@ -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)
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)
} }
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;
} }
+149 -83
View File
@@ -58,14 +58,11 @@ typedef struct {
} ev_data; } ev_data;
void trace(ev_data *d, int direction, int rnti_type, int rnti, void trace(ev_data *d, int direction, int rnti_type, int rnti,
int frame, int subframe, void *buf, int bufsize, int preamble) int frame, int subframe, void *buf, int bufsize, int preamble) {
{
ssize_t ret; ssize_t ret;
int fsf; int fsf;
int i; int i;
d->buf.osize = 0; d->buf.osize = 0;
PUTS(&d->buf, MAC_LTE_START_STRING); PUTS(&d->buf, MAC_LTE_START_STRING);
PUTC(&d->buf, FDD_RADIO); PUTC(&d->buf, FDD_RADIO);
PUTC(&d->buf, direction); PUTC(&d->buf, direction);
@@ -92,16 +89,17 @@ void trace(ev_data *d, int direction, int rnti_type, int rnti,
} }
PUTC(&d->buf, MAC_LTE_PAYLOAD_TAG); PUTC(&d->buf, MAC_LTE_PAYLOAD_TAG);
for (i = 0; i < bufsize; i++) for (i = 0; i < bufsize; i++)
PUTC(&d->buf, ((char*)buf)[i]); PUTC(&d->buf, ((char *)buf)[i]);
ret = sendto(d->socket, d->buf.obuf, d->buf.osize, 0, ret = sendto(d->socket, d->buf.obuf, d->buf.osize, 0,
(struct sockaddr *)&d->to, sizeof(struct sockaddr_in)); (struct sockaddr *)&d->to, sizeof(struct sockaddr_in));
if (ret != d->buf.osize) abort(); if (ret != d->buf.osize) abort();
} }
void ul(void *_d, event e) void ul(void *_d, event e) {
{
ev_data *d = _d; ev_data *d = _d;
trace(d, DIRECTION_UPLINK, C_RNTI, e.e[d->ul_rnti].i, trace(d, DIRECTION_UPLINK, C_RNTI, e.e[d->ul_rnti].i,
e.e[d->ul_frame].i, e.e[d->ul_subframe].i, e.e[d->ul_frame].i, e.e[d->ul_subframe].i,
@@ -109,13 +107,14 @@ void ul(void *_d, event e)
NO_PREAMBLE); NO_PREAMBLE);
} }
void dl(void *_d, event e) void dl(void *_d, event e) {
{
ev_data *d = _d; ev_data *d = _d;
if (e.e[d->dl_rnti].i == 0xffff) { if (e.e[d->dl_rnti].i == 0xffff) {
if (d->no_sib) return; if (d->no_sib) return;
if (d->max_sib && d->cur_sib == d->max_sib) return; if (d->max_sib && d->cur_sib == d->max_sib) return;
d->cur_sib++; d->cur_sib++;
} }
@@ -126,22 +125,21 @@ void dl(void *_d, event e)
NO_PREAMBLE); NO_PREAMBLE);
} }
void mib(void *_d, event e) void mib(void *_d, event e) {
{
ev_data *d = _d; ev_data *d = _d;
if (d->no_mib) return; if (d->no_mib) return;
if (d->max_mib && d->cur_mib == d->max_mib) return;
d->cur_mib++;
if (d->max_mib && d->cur_mib == d->max_mib) return;
d->cur_mib++;
trace(d, DIRECTION_DOWNLINK, NO_RNTI, 0, trace(d, DIRECTION_DOWNLINK, NO_RNTI, 0,
e.e[d->mib_frame].i, e.e[d->mib_subframe].i, e.e[d->mib_frame].i, e.e[d->mib_subframe].i,
e.e[d->mib_data].b, e.e[d->mib_data].bsize, e.e[d->mib_data].b, e.e[d->mib_data].bsize,
NO_PREAMBLE); NO_PREAMBLE);
} }
void preamble(void *_d, event e) void preamble(void *_d, event e) {
{
ev_data *d = _d; ev_data *d = _d;
trace(d, DIRECTION_UPLINK, NO_RNTI, 0, trace(d, DIRECTION_UPLINK, NO_RNTI, 0,
e.e[d->preamble_frame].i, e.e[d->preamble_subframe].i, e.e[d->preamble_frame].i, e.e[d->preamble_subframe].i,
@@ -149,8 +147,7 @@ void preamble(void *_d, event e)
e.e[d->preamble_preamble].i); e.e[d->preamble_preamble].i);
} }
void rar(void *_d, event e) void rar(void *_d, event e) {
{
ev_data *d = _d; ev_data *d = _d;
trace(d, DIRECTION_DOWNLINK, RA_RNTI, e.e[d->rar_rnti].i, trace(d, DIRECTION_DOWNLINK, RA_RNTI, e.e[d->rar_rnti].i,
e.e[d->rar_frame].i, e.e[d->rar_subframe].i, e.e[d->rar_frame].i, e.e[d->rar_subframe].i,
@@ -159,114 +156,118 @@ void rar(void *_d, event e)
} }
void setup_data(ev_data *d, void *database, int ul_id, int dl_id, int mib_id, void setup_data(ev_data *d, void *database, int ul_id, int dl_id, int mib_id,
int preamble_id, int rar_id) int preamble_id, int rar_id) {
{
database_event_format f; database_event_format f;
int i; int i;
d->ul_rnti = -1; d->ul_rnti = -1;
d->ul_frame = -1; d->ul_frame = -1;
d->ul_subframe = -1; d->ul_subframe = -1;
d->ul_data = -1; d->ul_data = -1;
d->dl_rnti = -1; d->dl_rnti = -1;
d->dl_frame = -1; d->dl_frame = -1;
d->dl_subframe = -1; d->dl_subframe = -1;
d->dl_data = -1; d->dl_data = -1;
d->mib_frame = -1; d->mib_frame = -1;
d->mib_subframe = -1; d->mib_subframe = -1;
d->mib_data = -1; d->mib_data = -1;
d->preamble_frame = -1; d->preamble_frame = -1;
d->preamble_subframe = -1; d->preamble_subframe = -1;
d->preamble_preamble = -1; d->preamble_preamble = -1;
d->rar_rnti = -1; d->rar_rnti = -1;
d->rar_frame = -1; d->rar_frame = -1;
d->rar_subframe = -1; d->rar_subframe = -1;
d->rar_data = -1; d->rar_data = -1;
#define G(var_name, var_type, var) \ #define G(var_name, var_type, var) \
if (!strcmp(f.name[i], var_name)) { \ if (!strcmp(f.name[i], var_name)) { \
if (strcmp(f.type[i], var_type)) goto error; \ if (strcmp(f.type[i], var_type)) goto error; \
var = i; \ var = i; \
continue; \ continue; \
} }
/* ul: rnti, frame, subframe, data */ /* ul: rnti, frame, subframe, data */
f = get_format(database, ul_id); f = get_format(database, ul_id);
for (i = 0; i < f.count; i++) { for (i = 0; i < f.count; i++) {
G("rnti", "int", d->ul_rnti); G("rnti", "int", d->ul_rnti);
G("frame", "int", d->ul_frame); G("frame", "int", d->ul_frame);
G("subframe", "int", d->ul_subframe); G("subframe", "int", d->ul_subframe);
G("data", "buffer", d->ul_data); G("data", "buffer", d->ul_data);
} }
if (d->ul_rnti == -1 || d->ul_frame == -1 || d->ul_subframe == -1 || if (d->ul_rnti == -1 || d->ul_frame == -1 || d->ul_subframe == -1 ||
d->ul_data == -1) goto error; d->ul_data == -1) goto error;
/* dl: rnti, frame, subframe, data */ /* dl: rnti, frame, subframe, data */
f = get_format(database, dl_id); f = get_format(database, dl_id);
for (i = 0; i < f.count; i++) { for (i = 0; i < f.count; i++) {
G("rnti", "int", d->dl_rnti); G("rnti", "int", d->dl_rnti);
G("frame", "int", d->dl_frame); G("frame", "int", d->dl_frame);
G("subframe", "int", d->dl_subframe); G("subframe", "int", d->dl_subframe);
G("data", "buffer", d->dl_data); G("data", "buffer", d->dl_data);
} }
if (d->dl_rnti == -1 || d->dl_frame == -1 || d->dl_subframe == -1 || if (d->dl_rnti == -1 || d->dl_frame == -1 || d->dl_subframe == -1 ||
d->dl_data == -1) goto error; d->dl_data == -1) goto error;
/* MIB: frame, subframe, data */ /* MIB: frame, subframe, data */
f = get_format(database, mib_id); f = get_format(database, mib_id);
for (i = 0; i < f.count; i++) { for (i = 0; i < f.count; i++) {
G("frame", "int", d->mib_frame); G("frame", "int", d->mib_frame);
G("subframe", "int", d->mib_subframe); G("subframe", "int", d->mib_subframe);
G("data", "buffer", d->mib_data); G("data", "buffer", d->mib_data);
} }
if (d->mib_frame == -1 || d->mib_subframe == -1 || d->mib_data == -1) if (d->mib_frame == -1 || d->mib_subframe == -1 || d->mib_data == -1)
goto error; goto error;
/* preamble: frame, subframe, preamble */ /* preamble: frame, subframe, preamble */
f = get_format(database, preamble_id); f = get_format(database, preamble_id);
for (i = 0; i < f.count; i++) { for (i = 0; i < f.count; i++) {
G("frame", "int", d->preamble_frame); G("frame", "int", d->preamble_frame);
G("subframe", "int", d->preamble_subframe); G("subframe", "int", d->preamble_subframe);
G("preamble", "int", d->preamble_preamble); G("preamble", "int", d->preamble_preamble);
} }
if (d->preamble_frame == -1 || d->preamble_subframe == -1 || if (d->preamble_frame == -1 || d->preamble_subframe == -1 ||
d->preamble_preamble == -1) goto error; d->preamble_preamble == -1) goto error;
/* rar: rnti, frame, subframe, data */ /* rar: rnti, frame, subframe, data */
f = get_format(database, rar_id); f = get_format(database, rar_id);
for (i = 0; i < f.count; i++) { for (i = 0; i < f.count; i++) {
G("rnti", "int", d->rar_rnti); G("rnti", "int", d->rar_rnti);
G("frame", "int", d->rar_frame); G("frame", "int", d->rar_frame);
G("subframe", "int", d->rar_subframe); G("subframe", "int", d->rar_subframe);
G("data", "buffer", d->rar_data); G("data", "buffer", d->rar_data);
} }
if (d->rar_rnti == -1 || d->rar_frame == -1 || d->rar_subframe == -1 || if (d->rar_rnti == -1 || d->rar_frame == -1 || d->rar_subframe == -1 ||
d->rar_data == -1) goto error; d->rar_data == -1) goto error;
#undef G #undef G
return; return;
error: error:
printf("bad T_messages.txt\n"); printf("bad T_messages.txt\n");
abort(); abort();
} }
void *receiver(void *_d) void *receiver(void *_d) {
{
ev_data *d = _d; ev_data *d = _d;
int s; int s;
char buf[100000]; char buf[100000];
s = socket(AF_INET, SOCK_DGRAM, 0); s = socket(AF_INET, SOCK_DGRAM, 0);
if (s == -1) { perror("socket"); abort(); }
if (bind(s, (struct sockaddr *)&d->to, sizeof(struct sockaddr_in)) == -1) if (s == -1) {
{ perror("bind"); abort(); } perror("socket");
abort();
}
if (bind(s, (struct sockaddr *)&d->to, sizeof(struct sockaddr_in)) == -1) {
perror("bind");
abort();
}
while (1) { while (1) {
if (recv(s, buf, 100000, 0) <= 0) abort(); if (recv(s, buf, 100000, 0) <= 0) abort();
@@ -275,33 +276,31 @@ void *receiver(void *_d)
return 0; return 0;
} }
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"
" -i <dump file> read events from this dump file\n" " -i <dump file> read events from this dump file\n"
" -ip <IP address> send packets to this IP address (default %s)\n" " -ip <IP address> send packets to this IP address (default %s)\n"
" -p <port> send packets to this port (default %d)\n" " -p <port> send packets to this port (default %d)\n"
" -no-mib do not report MIB\n" " -no-mib do not report MIB\n"
" -no-sib do not report SIBs\n" " -no-sib do not report SIBs\n"
" -max-mib <n> report at maximum n MIB\n" " -max-mib <n> report at maximum n MIB\n"
" -max-sib <n> report at maximum n SIBs\n" " -max-sib <n> report at maximum n SIBs\n"
" -live run live\n" " -live run live\n"
" -live-ip <IP address> tracee's IP address (default %p)\n" " -live-ip <IP address> tracee's IP address (default %s)\n"
" -live-port <por> tracee's port (default %d)\n" " -live-port <por> tracee's port (default %d)\n"
"-i and -live are mutually exclusive options. One of them must be provided\n" "-i and -live are mutually exclusive options. One of them must be provided\n"
"but not both.\n", "but not both.\n",
DEFAULT_IP, DEFAULT_IP,
DEFAULT_PORT, DEFAULT_PORT,
DEFAULT_LIVE_IP, DEFAULT_LIVE_IP,
DEFAULT_LIVE_PORT DEFAULT_LIVE_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;
char *input_filename = NULL; char *input_filename = NULL;
void *database; void *database;
@@ -315,28 +314,82 @@ int main(int n, char **v)
char *live_ip = DEFAULT_LIVE_IP; char *live_ip = DEFAULT_LIVE_IP;
int live_port = DEFAULT_LIVE_PORT; int live_port = DEFAULT_LIVE_PORT;
int live = 0; int live = 0;
memset(&d, 0, sizeof(ev_data)); memset(&d, 0, sizeof(ev_data));
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], "-i")) if (i > n-2) usage();
{ if (i > n-2) usage(); input_filename = v[++i]; continue; }
if (!strcmp(v[i], "-ip")) { if (i > n-2) usage(); ip = v[++i]; continue; } database_filename = v[++i];
if (!strcmp(v[i], "-p")) {if(i>n-2)usage(); port=atoi(v[++i]); continue; } continue;
if (!strcmp(v[i], "-no-mib")) { d.no_mib = 1; continue; } }
if (!strcmp(v[i], "-no-sib")) { d.no_sib = 1; continue; }
if (!strcmp(v[i], "-max-mib")) if (!strcmp(v[i], "-i")) {
{ if (i > n-2) usage(); d.max_mib = atoi(v[++i]); continue; } if (i > n-2) usage();
if (!strcmp(v[i], "-max-sib"))
{ if (i > n-2) usage(); d.max_sib = atoi(v[++i]); continue; } input_filename = v[++i];
if (!strcmp(v[i], "-live")) { live = 1; continue; } continue;
if (!strcmp(v[i], "-live-ip")) }
{ if (i > n-2) usage(); live_ip = v[++i]; continue; }
if (!strcmp(v[i], "-live-port")) if (!strcmp(v[i], "-ip")) {
{ if (i > n-2) usage(); live_port = atoi(v[++i]); continue; } if (i > n-2) usage();
ip = v[++i];
continue;
}
if (!strcmp(v[i], "-p")) {
if(i>n-2)usage();
port=atoi(v[++i]);
continue;
}
if (!strcmp(v[i], "-no-mib")) {
d.no_mib = 1;
continue;
}
if (!strcmp(v[i], "-no-sib")) {
d.no_sib = 1;
continue;
}
if (!strcmp(v[i], "-max-mib")) {
if (i > n-2) usage();
d.max_mib = atoi(v[++i]);
continue;
}
if (!strcmp(v[i], "-max-sib")) {
if (i > n-2) usage();
d.max_sib = atoi(v[++i]);
continue;
}
if (!strcmp(v[i], "-live")) {
live = 1;
continue;
}
if (!strcmp(v[i], "-live-ip")) {
if (i > n-2) usage();
live_ip = v[++i];
continue;
}
if (!strcmp(v[i], "-live-port")) {
if (i > n-2) usage();
live_port = atoi(v[++i]);
continue;
}
usage(); usage();
} }
@@ -357,25 +410,34 @@ int main(int n, char **v)
if (live == 0) { if (live == 0) {
in = open(input_filename, O_RDONLY); in = open(input_filename, O_RDONLY);
if (in == -1) { perror(input_filename); return 1; }
if (in == -1) {
perror(input_filename);
return 1;
}
} else } else
in = connect_to(live_ip, live_port); in = connect_to(live_ip, live_port);
database = parse_database(database_filename); database = parse_database(database_filename);
load_config_file(database_filename); load_config_file(database_filename);
h = new_handler(database); h = new_handler(database);
if (live) { if (live) {
char mt = 1; char mt = 1;
int number_of_events = number_of_ids(database); int number_of_events = number_of_ids(database);
int *is_on = calloc(number_of_events, sizeof(int)); int *is_on = calloc(number_of_events, sizeof(int));
if (is_on == NULL) { printf("ERROR: out of memory\n"); exit(1); }
if (is_on == NULL) {
printf("ERROR: out of memory\n");
exit(1);
}
on_off(database, "ENB_MAC_UE_UL_PDU_WITH_DATA", is_on, 1); on_off(database, "ENB_MAC_UE_UL_PDU_WITH_DATA", is_on, 1);
on_off(database, "ENB_MAC_UE_DL_PDU_WITH_DATA", is_on, 1); on_off(database, "ENB_MAC_UE_DL_PDU_WITH_DATA", is_on, 1);
on_off(database, "ENB_PHY_MIB", is_on, 1); on_off(database, "ENB_PHY_MIB", is_on, 1);
on_off(database, "ENB_PHY_INITIATE_RA_PROCEDURE", is_on, 1); on_off(database, "ENB_PHY_INITIATE_RA_PROCEDURE", is_on, 1);
on_off(database, "ENB_MAC_UE_DL_RAR_PDU_WITH_DATA", is_on, 1); on_off(database, "ENB_MAC_UE_DL_RAR_PDU_WITH_DATA", is_on, 1);
/* activate selected traces */ /* activate selected traces */
if (socket_send(in, &mt, 1) == -1 || if (socket_send(in, &mt, 1) == -1 ||
socket_send(in, &number_of_events, sizeof(int)) == -1 || socket_send(in, &number_of_events, sizeof(int)) == -1 ||
@@ -383,6 +445,7 @@ int main(int n, char **v)
printf("ERROR: socket_send failed\n"); printf("ERROR: socket_send failed\n");
exit(1); exit(1);
} }
free(is_on); free(is_on);
} }
@@ -392,31 +455,34 @@ int main(int n, char **v)
preamble_id = event_id_from_name(database, "ENB_PHY_INITIATE_RA_PROCEDURE"); preamble_id = event_id_from_name(database, "ENB_PHY_INITIATE_RA_PROCEDURE");
rar_id = event_id_from_name(database, "ENB_MAC_UE_DL_RAR_PDU_WITH_DATA"); rar_id = event_id_from_name(database, "ENB_MAC_UE_DL_RAR_PDU_WITH_DATA");
setup_data(&d, database, ul_id, dl_id, mib_id, preamble_id, rar_id); setup_data(&d, database, ul_id, dl_id, mib_id, preamble_id, rar_id);
register_handler_function(h, ul_id, ul, &d); register_handler_function(h, ul_id, ul, &d);
register_handler_function(h, dl_id, dl, &d); register_handler_function(h, dl_id, dl, &d);
register_handler_function(h, mib_id, mib, &d); register_handler_function(h, mib_id, mib, &d);
register_handler_function(h, preamble_id, preamble, &d); register_handler_function(h, preamble_id, preamble, &d);
register_handler_function(h, rar_id, rar, &d); register_handler_function(h, rar_id, rar, &d);
d.socket = socket(AF_INET, SOCK_DGRAM, 0); d.socket = socket(AF_INET, SOCK_DGRAM, 0);
if (d.socket == -1) { perror("socket"); exit(1); }
if (d.socket == -1) {
perror("socket");
exit(1);
}
d.to.sin_family = AF_INET; d.to.sin_family = AF_INET;
d.to.sin_port = htons(port); d.to.sin_port = htons(port);
d.to.sin_addr.s_addr = inet_addr(ip); d.to.sin_addr.s_addr = inet_addr(ip);
new_thread(receiver, &d); new_thread(receiver, &d);
OBUF ebuf = { osize: 0, omaxsize: 0, obuf: NULL }; OBUF ebuf = { osize: 0, omaxsize: 0, obuf: NULL };
/* read messages */ /* read messages */
while (1) { while (1) {
event e; event e;
e = get_event(in, &ebuf, database); e = get_event(in, &ebuf, database);
if (e.type == -1) break; if (e.type == -1) break;
if (!(e.type == ul_id || e.type == dl_id || e.type == mib_id || if (!(e.type == ul_id || e.type == dl_id || e.type == mib_id ||
e.type == preamble_id || e.type == rar_id)) continue; e.type == preamble_id || e.type == rar_id)) continue;
handle_event(h, e); handle_event(h, e);
} }
+99 -66
View File
@@ -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)
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)
/* 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)
/* 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); }
if (t == -1) {
perror("accept");
exit(1);
}
close(s); close(s);
printf("connected\n"); 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)
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:
/* 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);
+7 -8
View File
@@ -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)
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);
} }
+257 -217
View File
@@ -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
@@ -28,17 +28,33 @@
//------------------------------------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------------------------------
char* hashtable_rc_code2string(hashtable_rc_t rcP) char *hashtable_rc_code2string(hashtable_rc_t rcP)
//------------------------------------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------------------------------
{ {
switch (rcP) { switch (rcP) {
case HASH_TABLE_OK: return "HASH_TABLE_OK";break; case HASH_TABLE_OK:
case HASH_TABLE_INSERT_OVERWRITTEN_DATA: return "HASH_TABLE_INSERT_OVERWRITTEN_DATA";break; return "HASH_TABLE_OK";
case HASH_TABLE_KEY_NOT_EXISTS: return "HASH_TABLE_KEY_NOT_EXISTS";break; break;
case HASH_TABLE_KEY_ALREADY_EXISTS: return "HASH_TABLE_KEY_ALREADY_EXISTS";break;
case HASH_TABLE_BAD_PARAMETER_HASHTABLE: return "HASH_TABLE_BAD_PARAMETER_HASHTABLE";break; case HASH_TABLE_INSERT_OVERWRITTEN_DATA:
default: return "UNKNOWN hashtable_rc_t"; return "HASH_TABLE_INSERT_OVERWRITTEN_DATA";
} break;
case HASH_TABLE_KEY_NOT_EXISTS:
return "HASH_TABLE_KEY_NOT_EXISTS";
break;
case HASH_TABLE_KEY_ALREADY_EXISTS:
return "HASH_TABLE_KEY_ALREADY_EXISTS";
break;
case HASH_TABLE_BAD_PARAMETER_HASHTABLE:
return "HASH_TABLE_BAD_PARAMETER_HASHTABLE";
break;
default:
return "UNKNOWN hashtable_rc_t";
}
} }
//------------------------------------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------------------------------
/* /*
@@ -46,7 +62,7 @@ char* hashtable_rc_code2string(hashtable_rc_t rcP)
* hash_free_int_func() is used when this hashtable is used to store int values as data (pointer = value). * hash_free_int_func() is used when this hashtable is used to store int values as data (pointer = value).
*/ */
void hash_free_int_func(void* memoryP){} void hash_free_int_func(void *memoryP) {}
//------------------------------------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------------------------------
/* /*
@@ -55,9 +71,8 @@ void hash_free_int_func(void* memoryP){}
* This is a simple/naive hash function which adds the key's ASCII char values. It will probably generate lots of collisions on large hash tables. * This is a simple/naive hash function which adds the key's ASCII char values. It will probably generate lots of collisions on large hash tables.
*/ */
static hash_size_t def_hashfunc(const uint64_t keyP) static hash_size_t def_hashfunc(const uint64_t keyP) {
{ return (hash_size_t)keyP;
return (hash_size_t)keyP;
} }
//------------------------------------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------------------------------
@@ -67,132 +82,147 @@ static hash_size_t def_hashfunc(const uint64_t keyP)
* The user can also specify a hash function. If the hashfunc argument is NULL, a default hash function is used. * The user can also specify a hash function. If the hashfunc argument is NULL, a default hash function is used.
* If an error occurred, NULL is returned. All other values in the returned hash_table_t pointer should be released with hashtable_destroy(). * If an error occurred, NULL is returned. All other values in the returned hash_table_t pointer should be released with hashtable_destroy().
*/ */
hash_table_t *hashtable_create(const hash_size_t sizeP, hash_size_t (*hashfuncP)(const hash_key_t ), void (*freefuncP)(void*)) hash_table_t *hashtable_create(const hash_size_t sizeP, hash_size_t (*hashfuncP)(const hash_key_t ), void (*freefuncP)(void *)) {
{ hash_table_t *hashtbl = NULL;
hash_table_t *hashtbl = NULL;
if(!(hashtbl=malloc(sizeof(hash_table_t)))) { if(!(hashtbl=malloc(sizeof(hash_table_t)))) {
return NULL; return NULL;
} }
if(!(hashtbl->nodes=calloc(sizeP, sizeof(hash_node_t*)))) { if(!(hashtbl->nodes=calloc(sizeP, sizeof(hash_node_t *)))) {
free(hashtbl); free(hashtbl);
return NULL; return NULL;
} }
hashtbl->size=sizeP; hashtbl->size=sizeP;
if(hashfuncP) hashtbl->hashfunc=hashfuncP; if(hashfuncP) hashtbl->hashfunc=hashfuncP;
else hashtbl->hashfunc=def_hashfunc; else hashtbl->hashfunc=def_hashfunc;
if(freefuncP) hashtbl->freefunc=freefuncP; if(freefuncP) hashtbl->freefunc=freefuncP;
else hashtbl->freefunc=free; else hashtbl->freefunc=free;
return hashtbl; return hashtbl;
} }
//------------------------------------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------------------------------
/* /*
* Cleanup * Cleanup
* The hashtable_destroy() walks through the linked lists for each possible hash value, and releases the elements. It also releases the nodes array and the hash_table_t. * The hashtable_destroy() walks through the linked lists for each possible hash value, and releases the elements. It also releases the nodes array and the hash_table_t.
*/ */
hashtable_rc_t hashtable_destroy(hash_table_t * hashtblP) hashtable_rc_t hashtable_destroy(hash_table_t **hashtblP) {
{ hash_size_t n;
hash_size_t n; hash_node_t *node, *oldnode;
hash_node_t *node, *oldnode;
if (hashtblP == NULL) { if (*hashtblP == NULL) {
return HASH_TABLE_BAD_PARAMETER_HASHTABLE; return HASH_TABLE_BAD_PARAMETER_HASHTABLE;
} }
for(n=0; n<hashtblP->size; ++n) { for(n=0; n<(*hashtblP)->size; ++n) {
node=hashtblP->nodes[n]; node=(*hashtblP)->nodes[n];
while(node) {
oldnode=node;
node=node->next;
if (oldnode->data) {
hashtblP->freefunc(oldnode->data);
}
free(oldnode);
}
}
free(hashtblP->nodes);
free(hashtblP);
hashtblP=NULL;
return HASH_TABLE_OK;
}
//-------------------------------------------------------------------------------------------------------------------------------
hashtable_rc_t hashtable_is_key_exists (const hash_table_t * const hashtblP, const hash_key_t keyP)
//-------------------------------------------------------------------------------------------------------------------------------
{
hash_node_t *node = NULL;
hash_size_t hash = 0;
if (hashtblP == NULL) {
return HASH_TABLE_BAD_PARAMETER_HASHTABLE;
}
hash=hashtblP->hashfunc(keyP)%hashtblP->size;
node=hashtblP->nodes[hash];
while(node) { while(node) {
if(node->key == keyP) { oldnode=node;
return HASH_TABLE_OK; node=node->next;
}
if (oldnode->data) {
(*hashtblP)->freefunc(oldnode->data);
}
free(oldnode);
}
}
free((*hashtblP)->nodes);
free((*hashtblP));
*hashtblP=NULL;
return HASH_TABLE_OK;
}
//-------------------------------------------------------------------------------------------------------------------------------
hashtable_rc_t hashtable_is_key_exists (const hash_table_t *const hashtblP, const hash_key_t keyP)
//-------------------------------------------------------------------------------------------------------------------------------
{
hash_node_t *node = NULL;
hash_size_t hash = 0;
if (hashtblP == NULL) {
return HASH_TABLE_BAD_PARAMETER_HASHTABLE;
}
hash=hashtblP->hashfunc(keyP)%hashtblP->size;
node=hashtblP->nodes[hash];
while(node) {
if(node->key == keyP) {
return HASH_TABLE_OK;
}
node=node->next;
}
return HASH_TABLE_KEY_NOT_EXISTS;
}
//-------------------------------------------------------------------------------------------------------------------------------
hashtable_rc_t hashtable_apply_funct_on_elements (hash_table_t *const hashtblP, void functP(hash_key_t keyP, void *dataP, void *parameterP), void *parameterP)
//-------------------------------------------------------------------------------------------------------------------------------
{
hash_node_t *node = NULL;
unsigned int i = 0;
unsigned int num_elements = 0;
if (hashtblP == NULL) {
return HASH_TABLE_BAD_PARAMETER_HASHTABLE;
}
while ((num_elements < hashtblP->num_elements) && (i < hashtblP->size)) {
if (hashtblP->nodes[i] != NULL) {
node=hashtblP->nodes[i];
while(node) {
num_elements += 1;
functP(node->key, node->data, parameterP);
node=node->next; node=node->next;
}
} }
return HASH_TABLE_KEY_NOT_EXISTS;
i += 1;
}
return HASH_TABLE_OK;
} }
//------------------------------------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------------------------------
hashtable_rc_t hashtable_apply_funct_on_elements (hash_table_t *const hashtblP, void functP(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 )
//------------------------------------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------------------------------
{ {
hash_node_t *node = NULL; hash_node_t *node = NULL;
unsigned int i = 0; unsigned int i = 0;
unsigned int num_elements = 0;
if (hashtblP == NULL) { if (hashtblP == NULL) {
return HASH_TABLE_BAD_PARAMETER_HASHTABLE; *remaining_bytes_in_buffer_pP = snprintf(
} buffer_pP,
while ((num_elements < hashtblP->num_elements) && (i < hashtblP->size)) { *remaining_bytes_in_buffer_pP,
if (hashtblP->nodes[i] != NULL) { "HASH_TABLE_BAD_PARAMETER_HASHTABLE");
node=hashtblP->nodes[i]; return HASH_TABLE_BAD_PARAMETER_HASHTABLE;
while(node) { }
num_elements += 1;
functP(node->key, node->data, parameterP); while ((i < hashtblP->size) && (*remaining_bytes_in_buffer_pP > 0)) {
node=node->next; if (hashtblP->nodes[i] != NULL) {
} node=hashtblP->nodes[i];
}
i += 1; while(node) {
}
return HASH_TABLE_OK;
}
//-------------------------------------------------------------------------------------------------------------------------------
hashtable_rc_t hashtable_dump_content (const hash_table_t * const hashtblP, char * const buffer_pP, int * const remaining_bytes_in_buffer_pP )
//-------------------------------------------------------------------------------------------------------------------------------
{
hash_node_t *node = NULL;
unsigned int i = 0;
if (hashtblP == NULL) {
*remaining_bytes_in_buffer_pP = snprintf( *remaining_bytes_in_buffer_pP = snprintf(
buffer_pP, buffer_pP,
*remaining_bytes_in_buffer_pP, *remaining_bytes_in_buffer_pP,
"HASH_TABLE_BAD_PARAMETER_HASHTABLE"); "Key 0x%"PRIx64" Element %p\n",
return HASH_TABLE_BAD_PARAMETER_HASHTABLE; node->key,
node->data);
node=node->next;
}
} }
while ((i < hashtblP->size) && (*remaining_bytes_in_buffer_pP > 0)) {
if (hashtblP->nodes[i] != NULL) { i += 1;
node=hashtblP->nodes[i]; }
while(node) {
*remaining_bytes_in_buffer_pP = snprintf( return HASH_TABLE_OK;
buffer_pP,
*remaining_bytes_in_buffer_pP,
"Key 0x%"PRIx64" Element %p\n",
node->key,
node->data);
node=node->next;
}
}
i += 1;
}
return HASH_TABLE_OK;
} }
//------------------------------------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------------------------------
@@ -200,97 +230,110 @@ hashtable_rc_t hashtable_dump_content (const hash_table_t * const hashtblP, char
* Adding a new element * Adding a new element
* To make sure the hash value is not bigger than size, the result of the user provided hash function is used modulo size. * To make sure the hash value is not bigger than size, the result of the user provided hash function is used modulo size.
*/ */
hashtable_rc_t hashtable_insert(hash_table_t * const hashtblP, const hash_key_t keyP, void *dataP) hashtable_rc_t hashtable_insert(hash_table_t *const hashtblP, const hash_key_t keyP, void *dataP) {
{ hash_node_t *node = NULL;
hash_node_t *node = NULL; hash_size_t hash = 0;
hash_size_t hash = 0;
if (hashtblP == NULL) {
return HASH_TABLE_BAD_PARAMETER_HASHTABLE;
}
hash=hashtblP->hashfunc(keyP)%hashtblP->size;
node=hashtblP->nodes[hash]; if (hashtblP == NULL) {
while(node) { return HASH_TABLE_BAD_PARAMETER_HASHTABLE;
if(node->key == keyP) { }
if (node->data) {
hashtblP->freefunc(node->data); hash=hashtblP->hashfunc(keyP)%hashtblP->size;
} node=hashtblP->nodes[hash];
node->data=dataP;
return HASH_TABLE_INSERT_OVERWRITTEN_DATA; while(node) {
} if(node->key == keyP) {
node=node->next; if (node->data) {
hashtblP->freefunc(node->data);
}
node->data=dataP;
return HASH_TABLE_INSERT_OVERWRITTEN_DATA;
} }
if(!(node=malloc(sizeof(hash_node_t)))) return -1;
node->key=keyP; node=node->next;
node->data=dataP; }
if (hashtblP->nodes[hash]) {
node->next=hashtblP->nodes[hash]; if(!(node=malloc(sizeof(hash_node_t)))) return -1;
} else {
node->next = NULL; node->key=keyP;
} node->data=dataP;
hashtblP->nodes[hash]=node;
hashtblP->num_elements += 1; if (hashtblP->nodes[hash]) {
return HASH_TABLE_OK; node->next=hashtblP->nodes[hash];
} else {
node->next = NULL;
}
hashtblP->nodes[hash]=node;
hashtblP->num_elements += 1;
return HASH_TABLE_OK;
} }
//------------------------------------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------------------------------
/* /*
* To remove an element from the hash table, we just search for it in the linked list for that hash value, * To remove an element from the hash table, we just search for it in the linked list for that hash value,
* and remove it if it is found. If it was not found, it is an error and -1 is returned. * and remove it if it is found. If it was not found, it is an error and -1 is returned.
*/ */
hashtable_rc_t hashtable_remove(hash_table_t * const hashtblP, const hash_key_t keyP) hashtable_rc_t hashtable_remove(hash_table_t *const hashtblP, const hash_key_t keyP) {
{ hash_node_t *node, *prevnode=NULL;
hash_node_t *node, *prevnode=NULL; hash_size_t hash = 0;
hash_size_t hash = 0;
if (hashtblP == NULL) { if (hashtblP == NULL) {
return HASH_TABLE_BAD_PARAMETER_HASHTABLE; return HASH_TABLE_BAD_PARAMETER_HASHTABLE;
}
hash=hashtblP->hashfunc(keyP)%hashtblP->size;
node=hashtblP->nodes[hash];
while(node) {
if(node->key == keyP) {
if(prevnode) prevnode->next=node->next;
else hashtblP->nodes[hash]=node->next;
if (node->data) {
hashtblP->freefunc(node->data);
}
free(node);
hashtblP->num_elements -= 1;
return HASH_TABLE_OK;
} }
hash=hashtblP->hashfunc(keyP)%hashtblP->size;
node=hashtblP->nodes[hash]; prevnode=node;
while(node) { node=node->next;
if(node->key == keyP) { }
if(prevnode) prevnode->next=node->next;
else hashtblP->nodes[hash]=node->next; return HASH_TABLE_KEY_NOT_EXISTS;
if (node->data) {
hashtblP->freefunc(node->data);
}
free(node);
hashtblP->num_elements -= 1;
return HASH_TABLE_OK;
}
prevnode=node;
node=node->next;
}
return HASH_TABLE_KEY_NOT_EXISTS;
} }
//------------------------------------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------------------------------
/* /*
* Searching for an element is easy. We just search through the linked list for the corresponding hash value. * Searching for an element is easy. We just search through the linked list for the corresponding hash value.
* NULL is returned if we didn't find it. * NULL is returned if we didn't find it.
*/ */
hashtable_rc_t hashtable_get(const hash_table_t * const hashtblP, const hash_key_t keyP, void** dataP) hashtable_rc_t hashtable_get(const hash_table_t *const hashtblP, const hash_key_t keyP, void **dataP) {
{ hash_node_t *node = NULL;
hash_node_t *node = NULL; hash_size_t hash = 0;
hash_size_t hash = 0;
if (hashtblP == NULL) { if (hashtblP == NULL) {
*dataP = NULL;
return HASH_TABLE_BAD_PARAMETER_HASHTABLE;
}
hash=hashtblP->hashfunc(keyP)%hashtblP->size;
/* fprintf(stderr, "hashtable_get() key=%s, hash=%d\n", key, hash);*/
node=hashtblP->nodes[hash];
while(node) {
if(node->key == keyP) {
*dataP = node->data;
return HASH_TABLE_OK;
}
node=node->next;
}
*dataP = NULL; *dataP = NULL;
return HASH_TABLE_KEY_NOT_EXISTS; return HASH_TABLE_BAD_PARAMETER_HASHTABLE;
}
hash=hashtblP->hashfunc(keyP)%hashtblP->size;
/* fprintf(stderr, "hashtable_get() key=%s, hash=%d\n", key, hash);*/
node=hashtblP->nodes[hash];
while(node) {
if(node->key == keyP) {
*dataP = node->data;
return HASH_TABLE_OK;
}
node=node->next;
}
*dataP = NULL;
return HASH_TABLE_KEY_NOT_EXISTS;
} }
//------------------------------------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------------------------------
/* /*
@@ -304,36 +347,33 @@ hashtable_rc_t hashtable_get(const hash_table_t * const hashtblP, const hash_key
* After that, we can just free the old table and copy the elements from newtbl to hashtbl. * After that, we can just free the old table and copy the elements from newtbl to hashtbl.
*/ */
hashtable_rc_t hashtable_resize(hash_table_t * const hashtblP, const hash_size_t sizeP) hashtable_rc_t hashtable_resize(hash_table_t *const hashtblP, const hash_size_t sizeP) {
{ hash_table_t newtbl;
hash_table_t newtbl; hash_size_t n;
hash_size_t n; hash_node_t *node,*next;
hash_node_t *node,*next;
if (hashtblP == NULL) { if (hashtblP == NULL) {
return HASH_TABLE_BAD_PARAMETER_HASHTABLE; return HASH_TABLE_BAD_PARAMETER_HASHTABLE;
}
newtbl.size = sizeP;
newtbl.hashfunc = hashtblP->hashfunc;
if(!(newtbl.nodes=calloc(sizeP, sizeof(hash_node_t *)))) return -1;
for(n=0; n<hashtblP->size; ++n) {
for(node=hashtblP->nodes[n]; node; node=next) {
next = node->next;
hashtable_insert(&newtbl, node->key, node->data);
// Lionel GAUTHIER: BAD CODE TO BE REWRITTEN
hashtable_remove(hashtblP, node->key);
} }
}
newtbl.size = sizeP; free(hashtblP->nodes);
newtbl.hashfunc = hashtblP->hashfunc; hashtblP->size=newtbl.size;
hashtblP->nodes=newtbl.nodes;
if(!(newtbl.nodes=calloc(sizeP, sizeof(hash_node_t*)))) return -1; return HASH_TABLE_OK;
for(n=0; n<hashtblP->size; ++n) {
for(node=hashtblP->nodes[n]; node; node=next) {
next = node->next;
hashtable_insert(&newtbl, node->key, node->data);
// Lionel GAUTHIER: BAD CODE TO BE REWRITTEN
hashtable_remove(hashtblP, node->key);
}
}
free(hashtblP->nodes);
hashtblP->size=newtbl.size;
hashtblP->nodes=newtbl.nodes;
return HASH_TABLE_OK;
} }
+28 -28
View File
@@ -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;
#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);
+191 -174
View File
@@ -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
@@ -30,13 +30,12 @@
* This is a simple/naive hash function which adds the key's ASCII char values. It will probably generate lots of collisions on large hash tables. * This is a simple/naive hash function which adds the key's ASCII char values. It will probably generate lots of collisions on large hash tables.
*/ */
static hash_size_t def_hashfunc(const void *keyP, int key_sizeP) static hash_size_t def_hashfunc(const void *keyP, int key_sizeP) {
{ hash_size_t hash=0;
hash_size_t hash=0;
while(key_sizeP) hash^=((unsigned char*)keyP)[key_sizeP --]; while(key_sizeP) hash^=((unsigned char *)keyP)[key_sizeP --];
return hash; return hash;
} }
//------------------------------------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------------------------------
@@ -46,201 +45,221 @@ static hash_size_t def_hashfunc(const void *keyP, int key_sizeP)
* The user can also specify a hash function. If the hashfunc argument is NULL, a default hash function is used. * The user can also specify a hash function. If the hashfunc argument is NULL, a default hash function is used.
* If an error occurred, NULL is returned. All other values in the returned obj_hash_table_t pointer should be released with hashtable_destroy(). * If an error occurred, NULL is returned. All other values in the returned obj_hash_table_t pointer should be released with hashtable_destroy().
*/ */
obj_hash_table_t *obj_hashtable_create(hash_size_t sizeP, hash_size_t (*hashfuncP)(const void*, int ), void (*freekeyfuncP)(void*), void (*freedatafuncP)(void*)) obj_hash_table_t *obj_hashtable_create(hash_size_t sizeP, hash_size_t (*hashfuncP)(const void *, int ), void (*freekeyfuncP)(void *), void (*freedatafuncP)(void *)) {
{ obj_hash_table_t *hashtbl;
obj_hash_table_t *hashtbl;
if(!(hashtbl=malloc(sizeof(obj_hash_table_t)))) return NULL; if(!(hashtbl=malloc(sizeof(obj_hash_table_t)))) return NULL;
if(!(hashtbl->nodes=calloc(sizeP, sizeof(obj_hash_node_t*)))) { if(!(hashtbl->nodes=calloc(sizeP, sizeof(obj_hash_node_t *)))) {
free(hashtbl); free(hashtbl);
return NULL; return NULL;
} }
hashtbl->size=sizeP; hashtbl->size=sizeP;
if(hashfuncP) hashtbl->hashfunc=hashfuncP; if(hashfuncP) hashtbl->hashfunc=hashfuncP;
else hashtbl->hashfunc=def_hashfunc; else hashtbl->hashfunc=def_hashfunc;
if(freekeyfuncP) hashtbl->freekeyfunc=freekeyfuncP; if(freekeyfuncP) hashtbl->freekeyfunc=freekeyfuncP;
else hashtbl->freekeyfunc=free; else hashtbl->freekeyfunc=free;
if(freedatafuncP) hashtbl->freedatafunc=freedatafuncP; if(freedatafuncP) hashtbl->freedatafunc=freedatafuncP;
else hashtbl->freedatafunc=free; else hashtbl->freedatafunc=free;
return hashtbl; return hashtbl;
} }
//------------------------------------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------------------------------
/* /*
* Cleanup * Cleanup
* The hashtable_destroy() walks through the linked lists for each possible hash value, and releases the elements. It also releases the nodes array and the obj_hash_table_t. * The hashtable_destroy() walks through the linked lists for each possible hash value, and releases the elements. It also releases the nodes array and the obj_hash_table_t.
*/ */
hashtable_rc_t obj_hashtable_destroy(obj_hash_table_t *hashtblP) hashtable_rc_t obj_hashtable_destroy(obj_hash_table_t *hashtblP) {
{ hash_size_t n;
hash_size_t n; obj_hash_node_t *node, *oldnode;
obj_hash_node_t *node, *oldnode;
for(n=0; n<hashtblP->size; ++n) { for(n=0; n<hashtblP->size; ++n) {
node=hashtblP->nodes[n]; node=hashtblP->nodes[n];
while(node) {
oldnode=node; while(node) {
node=node->next; oldnode=node;
hashtblP->freekeyfunc(oldnode->key); node=node->next;
hashtblP->freedatafunc(oldnode->data); hashtblP->freekeyfunc(oldnode->key);
free(oldnode); hashtblP->freedatafunc(oldnode->data);
} free(oldnode);
} }
free(hashtblP->nodes); }
free(hashtblP);
return HASH_TABLE_OK; free(hashtblP->nodes);
free(hashtblP);
return HASH_TABLE_OK;
} }
//------------------------------------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------------------------------
hashtable_rc_t obj_hashtable_is_key_exists (obj_hash_table_t *hashtblP, void* keyP, int key_sizeP) hashtable_rc_t obj_hashtable_is_key_exists (obj_hash_table_t *hashtblP, void *keyP, int key_sizeP)
//------------------------------------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------------------------------
{ {
obj_hash_node_t *node; obj_hash_node_t *node;
hash_size_t hash; hash_size_t hash;
if (hashtblP == NULL) { if (hashtblP == NULL) {
return HASH_TABLE_BAD_PARAMETER_HASHTABLE; return HASH_TABLE_BAD_PARAMETER_HASHTABLE;
}
hash=hashtblP->hashfunc(keyP, key_sizeP)%hashtblP->size;
node=hashtblP->nodes[hash];
while(node) {
if(node->key == keyP) {
return HASH_TABLE_OK;
} else if (node->key_size == key_sizeP) {
if (memcmp(node->key, keyP, key_sizeP) == 0) {
return HASH_TABLE_OK;
}
} }
hash=hashtblP->hashfunc(keyP, key_sizeP)%hashtblP->size;
node=hashtblP->nodes[hash]; node=node->next;
while(node) { }
if(node->key == keyP) {
return HASH_TABLE_OK; return HASH_TABLE_KEY_NOT_EXISTS;
} else if (node->key_size == key_sizeP) {
if (memcmp(node->key, keyP, key_sizeP) == 0) {
return HASH_TABLE_OK;
}
}
node=node->next;
}
return HASH_TABLE_KEY_NOT_EXISTS;
} }
//------------------------------------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------------------------------
/* /*
* Adding a new element * Adding a new element
* To make sure the hash value is not bigger than size, the result of the user provided hash function is used modulo size. * To make sure the hash value is not bigger than size, the result of the user provided hash function is used modulo size.
*/ */
hashtable_rc_t obj_hashtable_insert(obj_hash_table_t *hashtblP, void* keyP, int key_sizeP, void *dataP) hashtable_rc_t obj_hashtable_insert(obj_hash_table_t *hashtblP, void *keyP, int key_sizeP, void *dataP) {
{ obj_hash_node_t *node;
obj_hash_node_t *node; hash_size_t hash;
hash_size_t hash;
if (hashtblP == NULL) { if (hashtblP == NULL) {
return HASH_TABLE_BAD_PARAMETER_HASHTABLE; return HASH_TABLE_BAD_PARAMETER_HASHTABLE;
}
hash=hashtblP->hashfunc(keyP, key_sizeP)%hashtblP->size;
node=hashtblP->nodes[hash];
while(node) {
if(node->key == keyP) {
if (node->data) {
hashtblP->freedatafunc(node->data);
}
node->data=dataP;
// waste of memory here (keyP is lost) we should free it now
return HASH_TABLE_INSERT_OVERWRITTEN_DATA;
} }
hash=hashtblP->hashfunc(keyP, key_sizeP)%hashtblP->size;
node=hashtblP->nodes[hash]; node=node->next;
while(node) { }
if(node->key == keyP) {
if (node->data) { if(!(node=malloc(sizeof(obj_hash_node_t)))) return -1;
hashtblP->freedatafunc(node->data);
} node->key=keyP;
node->data=dataP; node->data=dataP;
// waste of memory here (keyP is lost) we should free it now
return HASH_TABLE_INSERT_OVERWRITTEN_DATA; if (hashtblP->nodes[hash]) {
} node->next=hashtblP->nodes[hash];
node=node->next; } else {
} node->next = NULL;
if(!(node=malloc(sizeof(obj_hash_node_t)))) return -1; }
node->key=keyP;
node->data=dataP; hashtblP->nodes[hash]=node;
if (hashtblP->nodes[hash]) { return HASH_TABLE_OK;
node->next=hashtblP->nodes[hash];
} else {
node->next = NULL;
}
hashtblP->nodes[hash]=node;
return HASH_TABLE_OK;
} }
//------------------------------------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------------------------------
/* /*
* To remove an element from the hash table, we just search for it in the linked list for that hash value, * To remove an element from the hash table, we just search for it in the linked list for that hash value,
* and remove it if it is found. If it was not found, it is an error and -1 is returned. * and remove it if it is found. If it was not found, it is an error and -1 is returned.
*/ */
hashtable_rc_t obj_hashtable_remove(obj_hash_table_t *hashtblP, const void* keyP, int key_sizeP) hashtable_rc_t obj_hashtable_remove(obj_hash_table_t *hashtblP, const void *keyP, int key_sizeP) {
{ obj_hash_node_t *node, *prevnode=NULL;
obj_hash_node_t *node, *prevnode=NULL; hash_size_t hash;
hash_size_t hash;
if (hashtblP == NULL) { if (hashtblP == NULL) {
return HASH_TABLE_BAD_PARAMETER_HASHTABLE; return HASH_TABLE_BAD_PARAMETER_HASHTABLE;
}
hash=hashtblP->hashfunc(keyP, key_sizeP)%hashtblP->size;
node=hashtblP->nodes[hash];
while(node) {
if ((node->key == keyP) || ((node->key_size == key_sizeP) && (memcmp(node->key, keyP, key_sizeP) == 0))) {
if(prevnode) {
prevnode->next=node->next;
} else {
hashtblP->nodes[hash]=node->next;
}
hashtblP->freekeyfunc(node->key);
hashtblP->freedatafunc(node->data);
free(node);
return HASH_TABLE_OK;
} }
hash=hashtblP->hashfunc(keyP, key_sizeP)%hashtblP->size; prevnode=node;
node=hashtblP->nodes[hash]; node=node->next;
while(node) { }
if ((node->key == keyP) || ((node->key_size == key_sizeP) && (memcmp(node->key, keyP, key_sizeP) == 0))){
if(prevnode) { return HASH_TABLE_KEY_NOT_EXISTS;
prevnode->next=node->next;
} else {
hashtblP->nodes[hash]=node->next;
}
hashtblP->freekeyfunc(node->key);
hashtblP->freedatafunc(node->data);
free(node);
return HASH_TABLE_OK;
}
prevnode=node;
node=node->next;
}
return HASH_TABLE_KEY_NOT_EXISTS;
} }
//------------------------------------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------------------------------
/* /*
* Searching for an element is easy. We just search through the linked list for the corresponding hash value. * Searching for an element is easy. We just search through the linked list for the corresponding hash value.
* NULL is returned if we didn't find it. * NULL is returned if we didn't find it.
*/ */
hashtable_rc_t obj_hashtable_get(obj_hash_table_t *hashtblP, const void* keyP, int key_sizeP, void** dataP) hashtable_rc_t obj_hashtable_get(obj_hash_table_t *hashtblP, const void *keyP, int key_sizeP, void **dataP) {
{ obj_hash_node_t *node;
obj_hash_node_t *node; hash_size_t hash;
hash_size_t hash;
if (hashtblP == NULL) { if (hashtblP == NULL) {
*dataP = NULL;
return HASH_TABLE_BAD_PARAMETER_HASHTABLE;
}
hash=hashtblP->hashfunc(keyP, key_sizeP)%hashtblP->size;
node=hashtblP->nodes[hash];
while(node) {
if(node->key == keyP) {
*dataP = node->data;
return HASH_TABLE_OK;
} else if (node->key_size == key_sizeP) {
if (memcmp(node->key, keyP, key_sizeP) == 0) {
*dataP = node->data;
return HASH_TABLE_OK;
}
}
node=node->next;
}
*dataP = NULL; *dataP = NULL;
return HASH_TABLE_KEY_NOT_EXISTS; return HASH_TABLE_BAD_PARAMETER_HASHTABLE;
}
hash=hashtblP->hashfunc(keyP, key_sizeP)%hashtblP->size;
node=hashtblP->nodes[hash];
while(node) {
if(node->key == keyP) {
*dataP = node->data;
return HASH_TABLE_OK;
} else if (node->key_size == key_sizeP) {
if (memcmp(node->key, keyP, key_sizeP) == 0) {
*dataP = node->data;
return HASH_TABLE_OK;
}
}
node=node->next;
}
*dataP = NULL;
return HASH_TABLE_KEY_NOT_EXISTS;
} }
//------------------------------------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------------------------------
/* /*
* Function to return all keys of an object hash table * Function to return all keys of an object hash table
*/ */
hashtable_rc_t obj_hashtable_get_keys(obj_hash_table_t *hashtblP, void ** keysP, unsigned int *sizeP)
{
size_t n = 0;
obj_hash_node_t *node = NULL;
obj_hash_node_t *next = NULL;
*sizeP = 0; hashtable_rc_t obj_hashtable_get_keys(obj_hash_table_t *hashtblP, void **keysP, unsigned int *sizeP) {
keysP = calloc(hashtblP->num_elements, sizeof(void *)); size_t n = 0;
if (keysP) { obj_hash_node_t *node = NULL;
for(n=0; n<hashtblP->size; ++n) { obj_hash_node_t *next = NULL;
for(node=hashtblP->nodes[n]; node; node=next) { *sizeP = 0;
keysP[*sizeP++] = node->key; keysP = calloc(hashtblP->num_elements, sizeof(void *));
next = node->next;
} if (keysP) {
} for(n=0; n<hashtblP->size; ++n) {
return HASH_TABLE_OK; for(node=hashtblP->nodes[n]; node; node=next) {
keysP[*sizeP++] = node->key;
next = node->next;
}
} }
return HASH_TABLE_SYSTEM_ERROR;
// cppcheck-suppress memleak
return HASH_TABLE_OK;
}
return HASH_TABLE_SYSTEM_ERROR;
} }
//------------------------------------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------------------------------
/* /*
@@ -253,34 +272,32 @@ hashtable_rc_t obj_hashtable_get_keys(obj_hash_table_t *hashtblP, void ** keysP,
* This allows us to reuse hashtable_insert() and hashtable_remove(), when moving the elements to the new table. * This allows us to reuse hashtable_insert() and hashtable_remove(), when moving the elements to the new table.
* After that, we can just free the old table and copy the elements from newtbl to hashtbl. * After that, we can just free the old table and copy the elements from newtbl to hashtbl.
*/ */
hashtable_rc_t obj_hashtable_resize(obj_hash_table_t *hashtblP, hash_size_t sizeP) hashtable_rc_t obj_hashtable_resize(obj_hash_table_t *hashtblP, hash_size_t sizeP) {
{ obj_hash_table_t newtbl;
obj_hash_table_t newtbl; hash_size_t n;
hash_size_t n; obj_hash_node_t *node,*next;
obj_hash_node_t *node,*next;
if (hashtblP == NULL) { if (hashtblP == NULL) {
return HASH_TABLE_BAD_PARAMETER_HASHTABLE; return HASH_TABLE_BAD_PARAMETER_HASHTABLE;
}
newtbl.size = sizeP;
newtbl.hashfunc = hashtblP->hashfunc;
if(!(newtbl.nodes=calloc(sizeP, sizeof(obj_hash_node_t *)))) return HASH_TABLE_SYSTEM_ERROR;
for(n=0; n<hashtblP->size; ++n) {
for(node=hashtblP->nodes[n]; node; node=next) {
next = node->next;
obj_hashtable_insert(&newtbl, node->key, node->key_size, node->data);
obj_hashtable_remove(hashtblP, node->key, node->key_size);
} }
}
newtbl.size = sizeP; free(hashtblP->nodes);
newtbl.hashfunc = hashtblP->hashfunc; hashtblP->size=newtbl.size;
hashtblP->nodes=newtbl.nodes;
if(!(newtbl.nodes=calloc(sizeP, sizeof(obj_hash_node_t*)))) return HASH_TABLE_SYSTEM_ERROR; return HASH_TABLE_OK;
for(n=0; n<hashtblP->size; ++n) {
for(node=hashtblP->nodes[n]; node; node=next) {
next = node->next;
obj_hashtable_insert(&newtbl, node->key, node->key_size, node->data);
obj_hashtable_remove(hashtblP, node->key, node->key_size);
}
}
free(hashtblP->nodes);
hashtblP->size=newtbl.size;
hashtblP->nodes=newtbl.nodes;
return HASH_TABLE_OK;
} }
+19 -85
View File
@@ -23,19 +23,19 @@
#include "memory_pools.h" #include "memory_pools.h"
#if T_TRACER #if T_TRACER
#include <string.h> #include <string.h>
#include "T.h" #include "T.h"
#endif #endif
/*------------------------------------------------------------------------------*/ /*------------------------------------------------------------------------------*/
const static int mp_debug = 0; const static int mp_debug = 0;
# define MP_DEBUG(x, args...) do { if (mp_debug) fprintf(stdout, "[MP][D]"x, ##args); fflush (stdout); } \ # define MP_DEBUG(x, args...) do { if (mp_debug) fprintf(stdout, "[MP][D]"x, ##args); fflush (stdout); } \
while(0) while(0)
/*------------------------------------------------------------------------------*/ /*------------------------------------------------------------------------------*/
#ifndef CHARS_TO_UINT32 #ifndef CHARS_TO_UINT32
#define CHARS_TO_UINT32(c1, c2, c3, c4) (((c1) << 24) | ((c2) << 16) | ((c3) << 8) | (c4)) #define CHARS_TO_UINT32(c1, c2, c3, c4) (((c1) << 24) | ((c2) << 16) | ((c3) << 8) | (c4))
#endif #endif
#define MEMORY_POOL_ITEM_INFO_NUMBER 2 #define MEMORY_POOL_ITEM_INFO_NUMBER 2
@@ -129,33 +129,25 @@ static const pool_start_mark_t POOL_START_MARK = CHARS_TO_UINT32 ('P'
static const pools_start_mark_t POOLS_START_MARK = CHARS_TO_UINT32 ('P', 'S', 's', 't'); static const pools_start_mark_t POOLS_START_MARK = CHARS_TO_UINT32 ('P', 'S', 's', 't');
/*------------------------------------------------------------------------------*/ /*------------------------------------------------------------------------------*/
static inline uint32_t items_group_number_items (items_group_t *items_group) static inline uint32_t items_group_number_items (items_group_t *items_group) {
{
return items_group->number_plus_one - 1; return items_group->number_plus_one - 1;
} }
static inline uint32_t items_group_free_items (items_group_t *items_group) static inline uint32_t items_group_free_items (items_group_t *items_group) {
{
items_group_positions_t positions; items_group_positions_t positions;
uint32_t free_items; uint32_t free_items;
positions.all = items_group->positions.all; positions.all = items_group->positions.all;
free_items = items_group->number_plus_one + positions.ind.put - positions.ind.get; free_items = items_group->number_plus_one + positions.ind.put - positions.ind.get;
free_items %= items_group->number_plus_one; free_items %= items_group->number_plus_one;
return free_items; return free_items;
} }
static inline items_group_index_t items_group_get_free_item (items_group_t *items_group) static inline items_group_index_t items_group_get_free_item (items_group_t *items_group) {
{
items_group_position_t get_raw; items_group_position_t get_raw;
items_group_position_t put; items_group_position_t put;
items_group_position_t get; items_group_position_t get;
items_group_position_t free_items; items_group_position_t free_items;
items_group_index_t index = ITEMS_GROUP_INDEX_INVALID; items_group_index_t index = ITEMS_GROUP_INDEX_INVALID;
/* Get current put position */ /* Get current put position */
put = items_group->positions.ind.put % items_group->number_plus_one; put = items_group->positions.ind.put % items_group->number_plus_one;
/* Get current get position and increase it */ /* Get current get position and increase it */
@@ -193,11 +185,9 @@ static inline items_group_index_t items_group_get_free_item (items_group_t *item
return (index); return (index);
} }
static inline int items_group_put_free_item (items_group_t *items_group, items_group_index_t index) static inline int items_group_put_free_item (items_group_t *items_group, items_group_index_t index) {
{
items_group_position_t put_raw; items_group_position_t put_raw;
items_group_position_t put; items_group_position_t put;
/* Get current put position and increase it */ /* Get current put position and increase it */
put_raw = __sync_fetch_and_add (&items_group->positions.ind.put, 1); put_raw = __sync_fetch_and_add (&items_group->positions.ind.put, 1);
put = put_raw % items_group->number_plus_one; put = put_raw % items_group->number_plus_one;
@@ -209,70 +199,54 @@ static inline int items_group_put_free_item (items_group_t *items_group, items_g
AssertError (items_group->indexes[put] <= ITEMS_GROUP_INDEX_INVALID, return (EXIT_FAILURE), AssertError (items_group->indexes[put] <= ITEMS_GROUP_INDEX_INVALID, return (EXIT_FAILURE),
"Index at current put position (%d) is not marked as free (%d)!\n", put, items_group->number_plus_one); "Index at current put position (%d) is not marked as free (%d)!\n", put, items_group->number_plus_one);
/* Save freed item index at current put position */ /* Save freed item index at current put position */
items_group->indexes[put] = index; items_group->indexes[put] = index;
return (EXIT_SUCCESS); return (EXIT_SUCCESS);
} }
/*------------------------------------------------------------------------------*/ /*------------------------------------------------------------------------------*/
static inline memory_pools_t *memory_pools_from_handler (memory_pools_handle_t memory_pools_handle) static inline memory_pools_t *memory_pools_from_handler (memory_pools_handle_t memory_pools_handle) {
{
memory_pools_t *memory_pools; memory_pools_t *memory_pools;
/* Recover memory_pools */ /* Recover memory_pools */
memory_pools = (memory_pools_t *) memory_pools_handle; memory_pools = (memory_pools_t *) memory_pools_handle;
/* Sanity check on passed handle */ /* Sanity check on passed handle */
AssertError (memory_pools->start_mark == POOLS_START_MARK, memory_pools = NULL, AssertError (memory_pools->start_mark == POOLS_START_MARK, memory_pools = NULL,
"Handle %p is not a valid memory pools handle, start mark is missing!\n", memory_pools_handle); "Handle %p is not a valid memory pools handle, start mark is missing!\n", memory_pools_handle);
return (memory_pools); return (memory_pools);
} }
static inline memory_pool_item_t *memory_pool_item_from_handler (memory_pool_item_handle_t memory_pool_item_handle) static inline memory_pool_item_t *memory_pool_item_from_handler (memory_pool_item_handle_t memory_pool_item_handle) {
{
void *address; void *address;
memory_pool_item_t *memory_pool_item; memory_pool_item_t *memory_pool_item;
/* Recover memory_pools */ /* Recover memory_pools */
address = memory_pool_item_handle - sizeof(memory_pool_item_start_t); address = memory_pool_item_handle - sizeof(memory_pool_item_start_t);
memory_pool_item = (memory_pool_item_t *) address; memory_pool_item = (memory_pool_item_t *) address;
/* Sanity check on passed handle */ /* Sanity check on passed handle */
AssertError (memory_pool_item->start.start_mark == POOL_ITEM_START_MARK, memory_pool_item = NULL, AssertError (memory_pool_item->start.start_mark == POOL_ITEM_START_MARK, memory_pool_item = NULL,
"Handle %p is not a valid memory pool item handle, start mark is missing!\n", memory_pool_item); "Handle %p is not a valid memory pool item handle, start mark is missing!\n", memory_pool_item);
return (memory_pool_item); return (memory_pool_item);
} }
static inline memory_pool_item_t *memory_pool_item_from_index (memory_pool_t *memory_pool, items_group_index_t index) static inline memory_pool_item_t *memory_pool_item_from_index (memory_pool_t *memory_pool, items_group_index_t index) {
{
void *address; void *address;
address = (void *) memory_pool->items; address = (void *) memory_pool->items;
address += index * memory_pool->pool_item_size; address += index * memory_pool->pool_item_size;
return (address); return (address);
} }
/*------------------------------------------------------------------------------*/ /*------------------------------------------------------------------------------*/
memory_pools_handle_t memory_pools_create (uint32_t pools_number) memory_pools_handle_t memory_pools_create (uint32_t pools_number) {
{
memory_pools_t *memory_pools; memory_pools_t *memory_pools;
pool_id_t pool; pool_id_t pool;
AssertFatal (pools_number <= MAX_POOLS_NUMBER, "Too many memory pools requested (%d/%d)!\n", pools_number, MAX_POOLS_NUMBER); /* Limit to a reasonable number of pools */ AssertFatal (pools_number <= MAX_POOLS_NUMBER, "Too many memory pools requested (%d/%d)!\n", pools_number, MAX_POOLS_NUMBER); /* Limit to a reasonable number of pools */
/* Allocate memory_pools */ /* Allocate memory_pools */
memory_pools = malloc (sizeof(memory_pools_t)); memory_pools = malloc (sizeof(memory_pools_t));
AssertFatal (memory_pools != NULL, "Memory pools structure allocation failed!\n"); AssertFatal (memory_pools != NULL, "Memory pools structure allocation failed!\n");
/* Initialize memory_pools */ /* Initialize memory_pools */
{ {
memory_pools->start_mark = POOLS_START_MARK; memory_pools->start_mark = POOLS_START_MARK;
memory_pools->pools_number = pools_number; memory_pools->pools_number = pools_number;
memory_pools->pools_defined = 0; memory_pools->pools_defined = 0;
/* Allocate pools */ /* Allocate pools */
memory_pools->pools = calloc (pools_number, sizeof(memory_pool_t)); memory_pools->pools = calloc (pools_number, sizeof(memory_pool_t));
AssertFatal (memory_pools->pools != NULL, "Memory pools allocation failed!\n"); AssertFatal (memory_pools->pools != NULL, "Memory pools allocation failed!\n");
@@ -282,12 +256,10 @@ memory_pools_handle_t memory_pools_create (uint32_t pools_number)
memory_pools->pools[pool].start_mark = POOL_START_MARK; memory_pools->pools[pool].start_mark = POOL_START_MARK;
} }
} }
return ((memory_pools_handle_t) memory_pools); return ((memory_pools_handle_t) memory_pools);
} }
char *memory_pools_statistics(memory_pools_handle_t memory_pools_handle) char *memory_pools_statistics(memory_pools_handle_t memory_pools_handle) {
{
memory_pools_t *memory_pools; memory_pools_t *memory_pools;
pool_id_t pool; pool_id_t pool;
char *statistics; char *statistics;
@@ -296,13 +268,10 @@ char *memory_pools_statistics(memory_pools_handle_t memory_pools_handle)
uint32_t allocated_pools_memory = 0; uint32_t allocated_pools_memory = 0;
items_group_t *items_group; items_group_t *items_group;
uint32_t pool_items_size; uint32_t pool_items_size;
/* Recover memory_pools */ /* Recover memory_pools */
memory_pools = memory_pools_from_handler (memory_pools_handle); memory_pools = memory_pools_from_handler (memory_pools_handle);
AssertFatal (memory_pools != NULL, "Failed to retrieve memory pool for handle %p!\n", memory_pools_handle); AssertFatal (memory_pools != NULL, "Failed to retrieve memory pool for handle %p!\n", memory_pools_handle);
statistics = malloc(memory_pools->pools_defined * 200); statistics = malloc(memory_pools->pools_defined * 200);
printed_chars = sprintf (&statistics[0], "Pool: size, number, minimum, free, address space and memory used in Kbytes\n"); printed_chars = sprintf (&statistics[0], "Pool: size, number, minimum, free, address space and memory used in Kbytes\n");
for (pool = 0; pool < memory_pools->pools_defined; pool++) { for (pool = 0; pool < memory_pools->pools_defined; pool++) {
@@ -321,32 +290,25 @@ char *memory_pools_statistics(memory_pools_handle_t memory_pools_handle)
} }
printed_chars = sprintf (&statistics[printed_chars], "Pools memory %u Kbytes\n", allocated_pools_memory / (1024)); printed_chars = sprintf (&statistics[printed_chars], "Pools memory %u Kbytes\n", allocated_pools_memory / (1024));
return (statistics); return (statistics);
} }
int memory_pools_add_pool (memory_pools_handle_t memory_pools_handle, uint32_t pool_items_number, uint32_t pool_item_size) int memory_pools_add_pool (memory_pools_handle_t memory_pools_handle, uint32_t pool_items_number, uint32_t pool_item_size) {
{
memory_pools_t *memory_pools; memory_pools_t *memory_pools;
memory_pool_t *memory_pool; memory_pool_t *memory_pool;
pool_id_t pool; pool_id_t pool;
items_group_index_t item_index; items_group_index_t item_index;
memory_pool_item_t *memory_pool_item; memory_pool_item_t *memory_pool_item;
AssertFatal (pool_items_number <= MAX_POOL_ITEMS_NUMBER, "Too many items for a memory pool (%u/%d)!\n", pool_items_number, MAX_POOL_ITEMS_NUMBER); /* Limit to a reasonable number of items */ AssertFatal (pool_items_number <= MAX_POOL_ITEMS_NUMBER, "Too many items for a memory pool (%u/%d)!\n", pool_items_number, MAX_POOL_ITEMS_NUMBER); /* Limit to a reasonable number of items */
AssertFatal (pool_item_size <= MAX_POOL_ITEM_SIZE, "Item size is too big for memory pool items (%u/%d)!\n", pool_item_size, MAX_POOL_ITEM_SIZE); /* Limit to a reasonable item size */ AssertFatal (pool_item_size <= MAX_POOL_ITEM_SIZE, "Item size is too big for memory pool items (%u/%d)!\n", pool_item_size, MAX_POOL_ITEM_SIZE); /* Limit to a reasonable item size */
/* Recover memory_pools */ /* Recover memory_pools */
memory_pools = memory_pools_from_handler (memory_pools_handle); memory_pools = memory_pools_from_handler (memory_pools_handle);
AssertFatal (memory_pools != NULL, "Failed to retrieve memory pool for handle %p!\n", memory_pools_handle); AssertFatal (memory_pools != NULL, "Failed to retrieve memory pool for handle %p!\n", memory_pools_handle);
/* Check number of already created pools */ /* Check number of already created pools */
AssertFatal (memory_pools->pools_defined < memory_pools->pools_number, "Can not allocate more memory pool (%d)!\n", memory_pools->pools_number); AssertFatal (memory_pools->pools_defined < memory_pools->pools_number, "Can not allocate more memory pool (%d)!\n", memory_pools->pools_number);
/* Select pool */ /* Select pool */
pool = memory_pools->pools_defined; pool = memory_pools->pools_defined;
memory_pool = &memory_pools->pools[pool]; memory_pool = &memory_pools->pools[pool];
/* Initialize pool */ /* Initialize pool */
{ {
memory_pool->pool_id = pool; memory_pool->pool_id = pool;
@@ -357,7 +319,6 @@ int memory_pools_add_pool (memory_pools_handle_t memory_pools_handle, uint32_t p
memory_pool->items_group_free.minimum = pool_items_number; memory_pool->items_group_free.minimum = pool_items_number;
memory_pool->items_group_free.positions.ind.put = pool_items_number; memory_pool->items_group_free.positions.ind.put = pool_items_number;
memory_pool->items_group_free.positions.ind.get = 0; memory_pool->items_group_free.positions.ind.get = 0;
/* Allocate free indexes */ /* Allocate free indexes */
memory_pool->items_group_free.indexes = malloc(memory_pool->items_group_free.number_plus_one * sizeof(items_group_index_t)); memory_pool->items_group_free.indexes = malloc(memory_pool->items_group_free.number_plus_one * sizeof(items_group_index_t));
AssertFatal (memory_pool->items_group_free.indexes != NULL, "Memory pool indexes allocation failed!\n"); AssertFatal (memory_pool->items_group_free.indexes != NULL, "Memory pool indexes allocation failed!\n");
@@ -369,7 +330,6 @@ int memory_pools_add_pool (memory_pools_handle_t memory_pools_handle, uint32_t p
/* Last index is not allocated */ /* Last index is not allocated */
memory_pool->items_group_free.indexes[item_index] = ITEMS_GROUP_INDEX_INVALID; memory_pool->items_group_free.indexes[item_index] = ITEMS_GROUP_INDEX_INVALID;
/* Allocate items */ /* Allocate items */
memory_pool->items = calloc (pool_items_number, memory_pool->pool_item_size); memory_pool->items = calloc (pool_items_number, memory_pool->pool_item_size);
AssertFatal (memory_pool->items != NULL, "Memory pool items allocation failed!\n"); AssertFatal (memory_pool->items != NULL, "Memory pool items allocation failed!\n");
@@ -383,20 +343,16 @@ int memory_pools_add_pool (memory_pools_handle_t memory_pools_handle, uint32_t p
memory_pool_item->data[memory_pool->item_data_number] = POOL_ITEM_END_MARK; memory_pool_item->data[memory_pool->item_data_number] = POOL_ITEM_END_MARK;
} }
} }
memory_pools->pools_defined ++; memory_pools->pools_defined ++;
return (0); return (0);
} }
memory_pool_item_handle_t memory_pools_allocate (memory_pools_handle_t memory_pools_handle, uint32_t item_size, uint16_t info_0, uint16_t info_1) memory_pool_item_handle_t memory_pools_allocate (memory_pools_handle_t memory_pools_handle, uint32_t item_size, uint16_t info_0, uint16_t info_1) {
{
memory_pools_t *memory_pools; memory_pools_t *memory_pools;
memory_pool_item_t *memory_pool_item; memory_pool_item_t *memory_pool_item;
memory_pool_item_handle_t memory_pool_item_handle = NULL; memory_pool_item_handle_t memory_pool_item_handle = NULL;
pool_id_t pool; pool_id_t pool;
items_group_index_t item_index = ITEMS_GROUP_INDEX_INVALID; items_group_index_t item_index = ITEMS_GROUP_INDEX_INVALID;
/* Recover memory_pools */ /* Recover memory_pools */
memory_pools = memory_pools_from_handler (memory_pools_handle); memory_pools = memory_pools_from_handler (memory_pools_handle);
AssertError (memory_pools != NULL, {}, "Failed to retrieve memory pool for handle %p!\n", memory_pools_handle); AssertError (memory_pools != NULL, {}, "Failed to retrieve memory pool for handle %p!\n", memory_pools_handle);
@@ -424,12 +380,10 @@ memory_pool_item_handle_t memory_pools_allocate (memory_pools_handle_t memory_po
/* Sanity check on item status, must be free */ /* Sanity check on item status, must be free */
AssertFatal (memory_pool_item->start.item_status == ITEM_STATUS_FREE, "Item status is not set to free (%d) in pool %u, item %d!\n", AssertFatal (memory_pool_item->start.item_status == ITEM_STATUS_FREE, "Item status is not set to free (%d) in pool %u, item %d!\n",
memory_pool_item->start.item_status, pool, item_index); memory_pool_item->start.item_status, pool, item_index);
memory_pool_item->start.item_status = ITEM_STATUS_ALLOCATED; memory_pool_item->start.item_status = ITEM_STATUS_ALLOCATED;
memory_pool_item->start.info[0] = info_0; memory_pool_item->start.info[0] = info_0;
memory_pool_item->start.info[1] = info_1; memory_pool_item->start.info[1] = info_1;
memory_pool_item_handle = memory_pool_item->data; memory_pool_item_handle = memory_pool_item->data;
MP_DEBUG(" Alloc [%2u][%6d]{%6d}, %3u %3u, %6u, %p, %p, %p\n", MP_DEBUG(" Alloc [%2u][%6d]{%6d}, %3u %3u, %6u, %p, %p, %p\n",
pool, item_index, pool, item_index,
items_group_free_items (&memory_pools->pools[pool].items_group_free), items_group_free_items (&memory_pools->pools[pool].items_group_free),
@@ -445,8 +399,7 @@ memory_pool_item_handle_t memory_pools_allocate (memory_pools_handle_t memory_po
return memory_pool_item_handle; return memory_pool_item_handle;
} }
int memory_pools_free (memory_pools_handle_t memory_pools_handle, memory_pool_item_handle_t memory_pool_item_handle, uint16_t info_0) int memory_pools_free (memory_pools_handle_t memory_pools_handle, memory_pool_item_handle_t memory_pool_item_handle, uint16_t info_0) {
{
memory_pools_t *memory_pools; memory_pools_t *memory_pools;
memory_pool_item_t *memory_pool_item; memory_pool_item_t *memory_pool_item;
pool_id_t pool; pool_id_t pool;
@@ -455,36 +408,29 @@ int memory_pools_free (memory_pools_handle_t memory_pools_handle, memory_pool_it
uint32_t pool_item_size; uint32_t pool_item_size;
uint16_t info_1; uint16_t info_1;
int result; int result;
/* Recover memory_pools */ /* Recover memory_pools */
memory_pools = memory_pools_from_handler (memory_pools_handle); memory_pools = memory_pools_from_handler (memory_pools_handle);
AssertError (memory_pools != NULL, return (EXIT_FAILURE), "Failed to retrieve memory pools for handle %p!\n", memory_pools_handle); AssertError (memory_pools != NULL, return (EXIT_FAILURE), "Failed to retrieve memory pools for handle %p!\n", memory_pools_handle);
/* Recover memory pool item */ /* Recover memory pool item */
memory_pool_item = memory_pool_item_from_handler (memory_pool_item_handle); memory_pool_item = memory_pool_item_from_handler (memory_pool_item_handle);
AssertError (memory_pool_item != NULL, return (EXIT_FAILURE), "Failed to retrieve memory pool item for handle %p!\n", memory_pool_item_handle); AssertError (memory_pool_item != NULL, return (EXIT_FAILURE), "Failed to retrieve memory pool item for handle %p!\n", memory_pool_item_handle);
info_1 = memory_pool_item->start.info[1]; info_1 = memory_pool_item->start.info[1];
/* Recover pool index */ /* Recover pool index */
pool = memory_pool_item->start.pool_id; pool = memory_pool_item->start.pool_id;
AssertFatal (pool < memory_pools->pools_defined, "Pool index is invalid (%u/%u)!\n", pool, memory_pools->pools_defined); AssertFatal (pool < memory_pools->pools_defined, "Pool index is invalid (%u/%u)!\n", pool, memory_pools->pools_defined);
item_size = memory_pools->pools[pool].item_data_number; item_size = memory_pools->pools[pool].item_data_number;
pool_item_size = memory_pools->pools[pool].pool_item_size; pool_item_size = memory_pools->pools[pool].pool_item_size;
item_index = (((void *) memory_pool_item) - ((void *) memory_pools->pools[pool].items)) / pool_item_size; item_index = (((void *) memory_pool_item) - ((void *) memory_pools->pools[pool].items)) / pool_item_size;
MP_DEBUG(" Free [%2u][%6d]{%6d}, %3u %3u, %p, %p, %p, %u\n", MP_DEBUG(" Free [%2u][%6d]{%6d}, %3u %3u, %p, %p, %p, %u\n",
pool, item_index, pool, item_index,
items_group_free_items (&memory_pools->pools[pool].items_group_free), items_group_free_items (&memory_pools->pools[pool].items_group_free),
memory_pool_item->start.info[0], info_1, memory_pool_item->start.info[0], info_1,
memory_pool_item_handle, memory_pool_item, memory_pool_item_handle, memory_pool_item,
memory_pools->pools[pool].items, ((uint32_t) (item_size * sizeof(memory_pool_data_t)))); memory_pools->pools[pool].items, ((uint32_t) (item_size * sizeof(memory_pool_data_t))));
/* Sanity check on calculated item index */ /* Sanity check on calculated item index */
AssertFatal (memory_pool_item == memory_pool_item_from_index(&memory_pools->pools[pool], item_index), AssertFatal (memory_pool_item == memory_pool_item_from_index(&memory_pools->pools[pool], item_index),
"Incorrect memory pool item address (%p, %p) for pool %u, item %d!\n", "Incorrect memory pool item address (%p, %p) for pool %u, item %d!\n",
memory_pool_item, memory_pool_item_from_index(&memory_pools->pools[pool], item_index), pool, item_index); memory_pool_item,(void *)memory_pool_item_from_index(&memory_pools->pools[pool], item_index), pool, item_index);
/* Sanity check on end marker, must still be present (no write overflow) */ /* Sanity check on end marker, must still be present (no write overflow) */
AssertFatal (memory_pool_item->data[item_size] == POOL_ITEM_END_MARK, AssertFatal (memory_pool_item->data[item_size] == POOL_ITEM_END_MARK,
"Memory pool item is corrupted, end mark is not present for pool %u, item %d!\n", pool, item_index); "Memory pool item is corrupted, end mark is not present for pool %u, item %d!\n", pool, item_index);
@@ -492,31 +438,23 @@ int memory_pools_free (memory_pools_handle_t memory_pools_handle, memory_pool_it
AssertFatal (memory_pool_item->start.item_status == ITEM_STATUS_ALLOCATED, AssertFatal (memory_pool_item->start.item_status == ITEM_STATUS_ALLOCATED,
"Trying to free a non allocated (%x) memory pool item (pool %u, item %d)!\n", "Trying to free a non allocated (%x) memory pool item (pool %u, item %d)!\n",
memory_pool_item->start.item_status, pool, item_index); memory_pool_item->start.item_status, pool, item_index);
memory_pool_item->start.item_status = ITEM_STATUS_FREE; memory_pool_item->start.item_status = ITEM_STATUS_FREE;
result = items_group_put_free_item(&memory_pools->pools[pool].items_group_free, item_index); result = items_group_put_free_item(&memory_pools->pools[pool].items_group_free, item_index);
AssertError (result == EXIT_SUCCESS, {}, "Failed to free memory pool item (pool %u, item %d)!\n", pool, item_index); AssertError (result == EXIT_SUCCESS, {}, "Failed to free memory pool item (pool %u, item %d)!\n", pool, item_index);
return (result); return (result);
} }
void memory_pools_set_info (memory_pools_handle_t memory_pools_handle, memory_pool_item_handle_t memory_pool_item_handle, int index, uint16_t info) void memory_pools_set_info (memory_pools_handle_t memory_pools_handle, memory_pool_item_handle_t memory_pool_item_handle, int index, uint16_t info) {
{
memory_pools_t *memory_pools; memory_pools_t *memory_pools;
memory_pool_item_t *memory_pool_item; memory_pool_item_t *memory_pool_item;
pool_id_t pool; pool_id_t pool;
items_group_index_t item_index; items_group_index_t item_index;
uint32_t item_size; uint32_t item_size;
uint32_t pool_item_size; uint32_t pool_item_size;
AssertFatal (index < MEMORY_POOL_ITEM_INFO_NUMBER, "Incorrect info index (%d/%d)!\n", index, MEMORY_POOL_ITEM_INFO_NUMBER); AssertFatal (index < MEMORY_POOL_ITEM_INFO_NUMBER, "Incorrect info index (%d/%d)!\n", index, MEMORY_POOL_ITEM_INFO_NUMBER);
/* Recover memory pool item */ /* Recover memory pool item */
memory_pool_item = memory_pool_item_from_handler (memory_pool_item_handle); memory_pool_item = memory_pool_item_from_handler (memory_pool_item_handle);
AssertFatal (memory_pool_item != NULL, "Failed to retrieve memory pool item for handle %p!\n", memory_pool_item_handle); AssertFatal (memory_pool_item != NULL, "Failed to retrieve memory pool item for handle %p!\n", memory_pool_item_handle);
/* Set info[1] */ /* Set info[1] */
memory_pool_item->start.info[index] = info; memory_pool_item->start.info[index] = info;
@@ -525,26 +463,22 @@ void memory_pools_set_info (memory_pools_handle_t memory_pools_handle, memory_po
/* Recover memory_pools */ /* Recover memory_pools */
memory_pools = memory_pools_from_handler (memory_pools_handle); memory_pools = memory_pools_from_handler (memory_pools_handle);
AssertFatal (memory_pools != NULL, "Failed to retrieve memory pool for handle %p!\n", memory_pools_handle); AssertFatal (memory_pools != NULL, "Failed to retrieve memory pool for handle %p!\n", memory_pools_handle);
/* Recover pool index */ /* Recover pool index */
pool = memory_pool_item->start.pool_id; pool = memory_pool_item->start.pool_id;
AssertFatal (pool < memory_pools->pools_defined, "Pool index is invalid (%u/%u)!\n", pool, memory_pools->pools_defined); AssertFatal (pool < memory_pools->pools_defined, "Pool index is invalid (%u/%u)!\n", pool, memory_pools->pools_defined);
item_size = memory_pools->pools[pool].item_data_number; item_size = memory_pools->pools[pool].item_data_number;
pool_item_size = memory_pools->pools[pool].pool_item_size; pool_item_size = memory_pools->pools[pool].pool_item_size;
item_index = (((void *) memory_pool_item) - ((void *) memory_pools->pools[pool].items)) / pool_item_size; item_index = (((void *) memory_pool_item) - ((void *) memory_pools->pools[pool].items)) / pool_item_size;
MP_DEBUG(" Info [%2u][%6d]{%6d}, %3u %3u, %p, %p, %p, %u\n", MP_DEBUG(" Info [%2u][%6d]{%6d}, %3u %3u, %p, %p, %p, %u\n",
pool, item_index, pool, item_index,
items_group_free_items (&memory_pools->pools[pool].items_group_free), items_group_free_items (&memory_pools->pools[pool].items_group_free),
memory_pool_item->start.info[0], memory_pool_item->start.info[1], memory_pool_item->start.info[0], memory_pool_item->start.info[1],
memory_pool_item_handle, memory_pool_item, memory_pool_item_handle, memory_pool_item,
memory_pools->pools[pool].items, ((uint32_t) (item_size * sizeof(memory_pool_data_t)))); memory_pools->pools[pool].items, ((uint32_t) (item_size * sizeof(memory_pool_data_t))));
/* Sanity check on calculated item index */ /* Sanity check on calculated item index */
AssertFatal (memory_pool_item == memory_pool_item_from_index(&memory_pools->pools[pool], item_index), AssertFatal (memory_pool_item == memory_pool_item_from_index(&memory_pools->pools[pool], item_index),
"Incorrect memory pool item address (%p, %p) for pool %u, item %d!\n", "Incorrect memory pool item address (%p, %p) for pool %u, item %d!\n",
memory_pool_item, memory_pool_item_from_index(&memory_pools->pools[pool], item_index), pool, item_index); memory_pool_item, (void *)memory_pool_item_from_index(&memory_pools->pools[pool], item_index), pool, item_index);
/* Sanity check on end marker, must still be present (no write overflow) */ /* Sanity check on end marker, must still be present (no write overflow) */
AssertFatal (memory_pool_item->data[item_size] == POOL_ITEM_END_MARK, AssertFatal (memory_pool_item->data[item_size] == POOL_ITEM_END_MARK,
"Memory pool item is corrupted, end mark is not present for pool %u, item %d!\n", pool, item_index); "Memory pool item is corrupted, end mark is not present for pool %u, item %d!\n", pool, item_index);
+1 -1
View File
@@ -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;
+30 -21
View File
@@ -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[] = {
/* 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) {
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) {
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) {
}/* 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);
+2 -1
View File
@@ -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
${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
@@ -0,0 +1,99 @@
/*
* 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},\
}
@@ -0,0 +1,316 @@
/*
* 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.c
* \brief: implementation of telnet commands related to measurments
* \author Francois TABURET
* \date 2019
* \version 0.1
* \company NOKIA BellLabs France
* \email: francois.taburet@nokia-bell-labs.com
* \note
* \warning
*/
#define _GNU_SOURCE
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#define TELNETSERVERCODE
#include "telnetsrv.h"
#define TELNETSRV_MEASURMENTS_MAIN
#include "common/utils/LOG/log.h"
#include "common/config/config_userapi.h"
#include "telnetsrv_measurements.h"
#include "telnetsrv_ltemeasur_def.h"
#include "telnetsrv_cpumeasur_def.h"
#include "openair2/LAYER2/MAC/mac.h"
#include "openair1/PHY/phy_extern.h"
void measurcmd_display_macstats(telnet_printfunc_t prnt);
void measurcmd_display_macstats_ue(telnet_printfunc_t prnt);
void measurcmd_display_rlcstats(telnet_printfunc_t prnt);
void measurcmd_display_phycpu(telnet_printfunc_t prnt);
void measurcmd_display_maccpu(telnet_printfunc_t prnt);
void measurcmd_display_pdcpcpu(telnet_printfunc_t prnt);
static telnet_measurgroupdef_t measurgroups[] = {
{"enb", GROUP_LTESTATS,0, measurcmd_display_macstats, {NULL}},
{"enbues",GROUP_LTESTATS,0, measurcmd_display_macstats_ue,{NULL}},
{"rlc", GROUP_LTESTATS,0, measurcmd_display_rlcstats, {NULL}},
{"phycpu",GROUP_CPUSTATS,0, measurcmd_display_phycpu, {NULL}},
{"maccpu",GROUP_CPUSTATS,0, measurcmd_display_maccpu, {NULL}},
{"pdcpcpu",GROUP_CPUSTATS,0, measurcmd_display_pdcpcpu, {NULL}},
};
#define TELNET_NUM_MEASURGROUPS (sizeof(measurgroups)/sizeof(telnet_measurgroupdef_t))
static int eNB_id =0;
static char *grouptypes[] = {"ltestats","cpustats"};
static double cpufreq;
#define TELNET_NUM_MEASURTYPES (sizeof(grouptypes)/sizeof(char *))
#define HDR "---------------------------------"
void measurcmd_display_groups(telnet_printfunc_t prnt) {
prnt(" %*s %10s %s\n",TELNET_MAXMEASURNAME_LEN-1,"name","type","nombre de mesures");
for(int i=0; i<TELNET_NUM_MEASURGROUPS; i++)
prnt("%02d %*s %10s %i\n",i,TELNET_MAXMEASURNAME_LEN-1,measurgroups[i].groupname,
grouptypes[measurgroups[i].type], measurgroups[i].size);
} /* measurcmd_display_groups */
/*----------------------------------------------------------------------------------------------------*/
/* cpu measurements functions */
void measurcmd_display_cpumeasures(telnet_printfunc_t prnt, telnet_cpumeasurdef_t *cpumeasure, int cpumeasure_size) {
for (int i=0; i<cpumeasure_size; i++) {
prnt("%02d %*s: %15.3f us; %15d %s",i,TELNET_MAXMEASURNAME_LEN-1,(cpumeasure+i)->statname,
((cpumeasure+i)->astatptr->trials!=0)?(((cpumeasure+i)->astatptr->diff)/((cpumeasure+i)->astatptr->trials))/cpufreq/1000:0,
(cpumeasure+i)->astatptr->trials, ((i%2)==1)?"|\n":" | " );
}
prnt("\n\n");
} /* measurcmd_display_measures */
#define PRINT_CPUMEAS_STATE ((cpumeas(CPUMEAS_GETSTATE))?"enabled":"disabled")
void measurcmd_display_phycpu(telnet_printfunc_t prnt) {
PHY_VARS_eNB *phyvars = RC.eNB[eNB_id][0];
telnet_cpumeasurdef_t cpumeasur[]=CPU_PHYENB_MEASURE;
prnt("%s cpu (%1.1g GHz) measurements: PHY (cpustats %s) %s\n",HDR,cpufreq,
PRINT_CPUMEAS_STATE,HDR);
measurcmd_display_cpumeasures(prnt, cpumeasur, sizeof(cpumeasur)/sizeof(telnet_cpumeasurdef_t));
}
void measurcmd_display_maccpu(telnet_printfunc_t prnt) {
eNB_MAC_INST *macvars = RC.mac[eNB_id];
telnet_cpumeasurdef_t cpumeasur[]=CPU_MACENB_MEASURE;
prnt("%s cpu (%1.1g GHz) measurements: MAC (cpustats %s) %s\n",HDR,cpufreq,
PRINT_CPUMEAS_STATE,HDR);
measurcmd_display_cpumeasures(prnt, cpumeasur, sizeof(cpumeasur)/sizeof(telnet_cpumeasurdef_t));
}
void measurcmd_display_pdcpcpu(telnet_printfunc_t prnt) {
pdcp_stats_t *pdcpvars = &(eNB_pdcp_stats[eNB_id]);
telnet_cpumeasurdef_t cpumeasur[]=CPU_PDCPENB_MEASURE;
prnt("%s cpu (%1.1g GHz) measurements: PDCP (cpustats %s) %s \n",HDR,cpufreq,
PRINT_CPUMEAS_STATE,HDR);
measurcmd_display_cpumeasures(prnt, cpumeasur, sizeof(cpumeasur)/sizeof(telnet_cpumeasurdef_t));
}
/*----------------------------------------------------------------------------------------------------*/
/* lte measurements functions */
uint64_t measurcmd_getstatvalue(telnet_ltemeasurdef_t *measur,telnet_printfunc_t prnt) {
uint64_t val;
switch(measur->vtyp) {
case TELNET_VARTYPE_INT64:
val = (uint64_t)(*((uint64_t *)(measur->vptr)));
break;
case TELNET_VARTYPE_INT32:
val = (uint64_t)(*((uint32_t *)(measur->vptr)));
break;
case TELNET_VARTYPE_INT16:
val = (uint64_t)(*((uint16_t *)(measur->vptr)));
break;
case TELNET_VARTYPE_INT8:
val = (uint64_t)(*((uint8_t *)(measur->vptr)));
break;
case TELNET_VARTYPE_UINT:
val = (uint64_t)(*((unsigned int *)(measur->vptr)));
break;
default:
prnt("%s %i: unknown type \n",measur->statname,measur->vtyp);
val = (uint64_t)(*((uint64_t *)(measur->vptr)));
break;
}
return val;
} /* measurcmd_getstatvalue */
void measurcmd_display_measures(telnet_printfunc_t prnt, telnet_ltemeasurdef_t *statsptr, int stats_size) {
for (int i=0; i<stats_size; i++) {
prnt("%*s = %15llu%s",TELNET_MAXMEASURNAME_LEN-1,statsptr[i].statname,
measurcmd_getstatvalue(&(statsptr[i]),prnt), ((i%3)==2)?"\n":" ");
}
prnt("\n\n");
} /* measurcmd_display_measures */
void measurcmd_display_macstats_ue(telnet_printfunc_t prnt) {
UE_list_t *UE_list = &(RC.mac[eNB_id]->UE_list);
for (int UE_id=UE_list->head; UE_id>=0; UE_id=UE_list->next[UE_id]) {
for (int i=0; i<UE_list->numactiveCCs[UE_id]; i++) {
int CC_id = UE_list->ordered_CCids[i][UE_id];
prnt("%s UE %i Id %i CCid %i %s\n",HDR,i,UE_id,CC_id,HDR);
eNB_UE_STATS *macuestatptr = &(UE_list->eNB_UE_stats[CC_id][UE_id]);
telnet_ltemeasurdef_t statsptr[]=LTEMAC_UEMEASURE;
measurcmd_display_measures(prnt, statsptr, sizeof(statsptr)/sizeof(telnet_ltemeasurdef_t));
}
}
} /* measurcmd_display_macstats_ue */
void measurcmd_display_macstats(telnet_printfunc_t prnt) {
for (int CC_id=0 ; CC_id < MAX_NUM_CCs; CC_id++) {
eNB_STATS *macstatptr=&(RC.mac[eNB_id]->eNB_stats[CC_id]);
telnet_ltemeasurdef_t statsptr[]=LTEMAC_MEASURE;
prnt("%s eNB %i mac stats CC %i frame %u %s\n",
HDR, eNB_id, CC_id, RC.mac[eNB_id]->frame,HDR);
measurcmd_display_measures(prnt,statsptr,sizeof(statsptr)/sizeof(telnet_ltemeasurdef_t));
}
} /* measurcmd_display_macstats */
void measurcmd_display_one_rlcstat(telnet_printfunc_t prnt, int UE_id, telnet_ltemeasurdef_t *statsptr, int num_rlcmeasure, unsigned int *rlcstats,
char *rbid_str, protocol_ctxt_t *ctxt, const srb_flag_t srb_flagP, const rb_id_t rb_idP)
{
int rlc_status = rlc_stat_req(ctxt,srb_flagP,rb_idP,
rlcstats, rlcstats+1, rlcstats+2, rlcstats+3, rlcstats+4, rlcstats+5,
rlcstats+6, rlcstats+7, rlcstats+8, rlcstats+9, rlcstats+10, rlcstats+11,
rlcstats+12, rlcstats+13, rlcstats+14, rlcstats+15, rlcstats+16, rlcstats+17,
rlcstats+18, rlcstats+19, rlcstats+20, rlcstats+21, rlcstats+22, rlcstats+23,
rlcstats+24, rlcstats+25, rlcstats+26, rlcstats+27);
if (rlc_status == RLC_OP_STATUS_OK) {
prnt("%s UE %i RLC %s mode %s %s\n",HDR,UE_id, rbid_str,
(rlcstats[0]==RLC_MODE_AM)? "AM": (rlcstats[0]==RLC_MODE_UM)?"UM":"NONE",HDR);
measurcmd_display_measures(prnt, statsptr, num_rlcmeasure);
}
} /* status measurcmd_rlc_stat_req */
void measurcmd_display_rlcstats(telnet_printfunc_t prnt) {
protocol_ctxt_t ctxt;
UE_list_t *UE_list = &(RC.mac[eNB_id]->UE_list);
telnet_ltemeasurdef_t statsptr[]=LTE_RLCMEASURE;
int num_rlcmeasure = sizeof(statsptr)/sizeof(telnet_ltemeasurdef_t );
unsigned int *rlcstats = malloc(num_rlcmeasure*sizeof(unsigned int));
eNB_MAC_INST *eNB = RC.mac[eNB_id];
for(int i=0; i <num_rlcmeasure ; i++) {
statsptr[i].vptr = rlcstats + i;
}
for (int UE_id=UE_list->head; UE_id>=0; UE_id=UE_list->next[UE_id]) {
#define NB_eNB_INST 1
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt,eNB_id, ENB_FLAG_YES,UE_list->eNB_UE_stats[0][UE_id].crnti,
eNB->frame,eNB->subframe,eNB_id);
measurcmd_display_one_rlcstat(prnt, UE_id, statsptr, num_rlcmeasure, rlcstats, "DCCH", &ctxt, SRB_FLAG_YES, DCCH);
measurcmd_display_one_rlcstat(prnt, UE_id, statsptr, num_rlcmeasure, rlcstats, "DTCH", &ctxt, SRB_FLAG_NO, DTCH-2);
}
} /* measurcmd_display_macstats_ue */
/*------------------------------------------------------------------------------------------------------------------------*/
/* function called by the telnet server when measur command is entered */
int measurcmd_show(char *buf, int debug, telnet_printfunc_t prnt) {
char *subcmd=NULL;
int idx1, idx2;
int badcmd=1;
if (debug > 0)
prnt(" measurcmd_show received %s\n",buf);
// char tmp[20480];
// dump_eNB_l2_stats(tmp, 0);
// prnt("%s\n",tmp);
int s = sscanf(buf,"%ms %i-%i\n",&subcmd, &idx1,&idx2);
if (s>0) {
if ( strcmp(subcmd,"groups") == 0) {
measurcmd_display_groups(prnt);
badcmd=0;
} else {
for (int i=0; i<TELNET_NUM_MEASURTYPES; i++) {
if(strcmp(subcmd,grouptypes[i]) == 0) {
for(int j=0; j<TELNET_NUM_MEASURGROUPS; j++) {
if(i == measurgroups[j].type) {
badcmd=0;
measurgroups[j].displayfunc(prnt);
}
} /* for j...*/
}
}/* for i...*/
for (int i=0; i<TELNET_NUM_MEASURGROUPS; i++) {
if(strcmp(subcmd,measurgroups[i].groupname) == 0) {
measurgroups[i].displayfunc(prnt);
badcmd=0;
break;
}
}
}
free(subcmd);
} /* s>0 */
if (badcmd) {
prnt("%s: unknown measur command\n",buf);
}
return CMDSTATUS_FOUND;
}
int measurcmd_cpustats(char *buf, int debug, telnet_printfunc_t prnt) {
char *subcmd=NULL;
int idx1, idx2;
int badcmd=1;
if (debug > 0)
prnt(" measurcmd_show received %s\n",buf);
int s = sscanf(buf,"%ms %i-%i\n",&subcmd, &idx1,&idx2);
if (s>0) {
if ( strcmp(subcmd,"enable") == 0) {
cpumeas(CPUMEAS_ENABLE);
badcmd=0;
} else if ( strcmp(subcmd,"disable") == 0) {
cpumeas(CPUMEAS_DISABLE);
badcmd=0;
}
}
if (badcmd) {
prnt("Cpu measurments state: %s\n",PRINT_CPUMEAS_STATE);
}
free(subcmd);
return CMDSTATUS_FOUND;
}
/*-------------------------------------------------------------------------------------*/
/* function called at telnet server init to add the measur command */
void add_measur_cmds(void) {
add_telnetcmd("measur",measur_vardef,measur_cmdarray);
cpufreq = get_cpu_freq_GHz();
}
@@ -0,0 +1,88 @@
/*
* 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 */
+60 -76
View File
@@ -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 @@
#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) if (prnbuff == NULL) {
{ fprintf(stderr,"Error %s on malloc in init_phytelnet()\n",strerror(errno));
fprintf(stderr,"Error %s on malloc in init_phytelnet()\n",strerror(errno)); }
}
} }
void display_uestatshead( telnet_printfunc_t prnt) void display_uestatshead( telnet_printfunc_t prnt) {
{ prnt("cc ue rnti Dmcs Umcs tao tau Dbr Dtb \n");
prnt("cc ue rnti Dmcs Umcs tao tau Dbr Dtb \n");
} }
void dump_uestats(int debug, telnet_printfunc_t prnt, uint8_t prntflag) void dump_uestats(int debug, telnet_printfunc_t prnt, uint8_t prntflag) {
{ int p;
prnbuff=malloc(20480);
p=dump_eNB_l2_stats( prnbuff, 20480);
int p; if(prntflag>=1)
prnt("%s\n",prnbuff);
p=dump_eNB_l2_stats( prnbuff, 0);
if(prntflag>=1)
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 (debug > 0) if (strcasestr(buf,"phycnt") != NULL) {
prnt("phy interface module received %s\n",buf); display_phycounters(buf, debug, prnt);
if (strcasestr(buf,"phycnt") != NULL) }
{
display_phycounters(buf, debug, prnt); if (strcasestr(buf,"uestat") != NULL) {
} char *cptr=strcasestr(buf+sizeof("uestat"),"UE");
if (strcasestr(buf,"uestat") != NULL) display_uestatshead(prnt);
{
char *cptr=strcasestr(buf+sizeof("uestat"),"UE"); if (cptr != NULL) {
display_uestatshead(prnt); int ueidx = strtol( cptr+sizeof("UE"), NULL, 10);
if (cptr != NULL)
{ if (ueidx < NUMBER_OF_UE_MAX && ueidx >= 0) {
int ueidx = strtol( cptr+sizeof("UE"), NULL, 10); display_uestats(debug, prnt,ueidx);
if (ueidx < NUMBER_OF_UE_MAX && ueidx >= 0) }
{ } /* if cptr != NULL */
display_uestats(debug, prnt,ueidx); else {
} for (int ue=0; ue<NUMBER_OF_UE_MAX ; ue++) {
} /* if cptr != NULL */ display_uestats(debug, prnt,ue);
else }
{ } /* else cptr != NULL */
for (int ue=0; ue<NUMBER_OF_UE_MAX ; ue++) } /* uestat */
{
display_uestats(debug, prnt,ue); if (strcasestr(buf,"uedump") != NULL) {
} dump_uestats(debug, prnt,1);
} /* else cptr != NULL */ }
} /* uestat */
if (strcasestr(buf,"uedump") != NULL) return 0;
{
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);
} }
+3
View File
@@ -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 ##
File diff suppressed because it is too large Load Diff
+24 -21
View File
@@ -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 *
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;
File diff suppressed because it is too large Load Diff
+2 -1
View File
@@ -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
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;
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -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;
+3 -4
View File
@@ -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) {
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,
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,
} 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
+2 -1
View File
@@ -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)) {
+4 -27
View File
@@ -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,
} }
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,
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,
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,
((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,
#endif #endif
k++; k++;
} }
return(0); return(0);
+15 -28
View File
@@ -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] = {
-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)
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)
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)
// 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)
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)
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)
// 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)
// 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)
} }
#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();
+237 -292
View File
@@ -53,71 +53,73 @@
*/ */
#define is_not_pilot(pilots,first_pilot,re) (1) #define is_not_pilot(pilots,first_pilot,re) (1)
/*extern void thread_top_init(char *thread_name, /*extern void thread_top_init(char *thread_name,
int affinity, int affinity,
uint64_t runtime, uint64_t runtime,
uint64_t deadline, uint64_t deadline,
uint64_t period);*/ uint64_t period);*/
extern WORKER_CONF_t get_thread_worker_conf(void); extern WORKER_CONF_t get_thread_worker_conf(void);
void free_eNB_dlsch(LTE_eNB_DLSCH_t *dlsch) void free_eNB_dlsch(LTE_eNB_DLSCH_t *dlsch) {
{
int i, r, aa, layer; int i, r, aa, layer;
if (dlsch) { if (dlsch) {
for (layer=0; layer<4; layer++) { for (layer=0; layer<4; layer++) {
for (aa=0; aa<64; aa++) free16(dlsch->ue_spec_bf_weights[layer][aa], OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES*sizeof(int32_t)); for (aa=0; aa<64; aa++) free16(dlsch->ue_spec_bf_weights[layer][aa], OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES*sizeof(int32_t));
free16(dlsch->ue_spec_bf_weights[layer], 64*sizeof(int32_t*));
free16(dlsch->ue_spec_bf_weights[layer], 64*sizeof(int32_t *));
} }
for (i=0; i<dlsch->Mdlharq; i++) { for (i=0; i<dlsch->Mdlharq; i++) {
if (dlsch->harq_processes[i]) { if (dlsch->harq_processes[i]) {
if (dlsch->harq_processes[i]->b) { if (dlsch->harq_processes[i]->b) {
free16(dlsch->harq_processes[i]->b,MAX_DLSCH_PAYLOAD_BYTES); free16(dlsch->harq_processes[i]->b,MAX_DLSCH_PAYLOAD_BYTES);
dlsch->harq_processes[i]->b = NULL; dlsch->harq_processes[i]->b = NULL;
} }
for (r=0; r<MAX_NUM_DLSCH_SEGMENTS; r++) { for (r=0; r<MAX_NUM_DLSCH_SEGMENTS; r++) {
if (dlsch->harq_processes[i]->c[r]) { if (dlsch->harq_processes[i]->c[r]) {
free16(dlsch->harq_processes[i]->c[r],((r==0)?8:0) + 3+768); free16(dlsch->harq_processes[i]->c[r],((r==0)?8:0) + 3+768);
dlsch->harq_processes[i]->c[r] = NULL; dlsch->harq_processes[i]->c[r] = NULL;
} }
if (dlsch->harq_processes[i]->d[r]) { if (dlsch->harq_processes[i]->d[r]) {
free16(dlsch->harq_processes[i]->d[r],(96+12+3+(3*6144))); free16(dlsch->harq_processes[i]->d[r],(96+12+3+(3*6144)));
dlsch->harq_processes[i]->d[r] = NULL; dlsch->harq_processes[i]->d[r] = NULL;
} }
} }
free16(dlsch->harq_processes[i],sizeof(LTE_DL_eNB_HARQ_t));
dlsch->harq_processes[i] = NULL; free16(dlsch->harq_processes[i],sizeof(LTE_DL_eNB_HARQ_t));
dlsch->harq_processes[i] = NULL;
} }
} }
free16(dlsch,sizeof(LTE_eNB_DLSCH_t)); free16(dlsch,sizeof(LTE_eNB_DLSCH_t));
dlsch = NULL;
} }
} }
LTE_eNB_DLSCH_t *new_eNB_dlsch(unsigned char Kmimo,unsigned char Mdlharq,uint32_t Nsoft,unsigned char N_RB_DL, uint8_t abstraction_flag, LTE_DL_FRAME_PARMS* frame_parms) LTE_eNB_DLSCH_t *new_eNB_dlsch(unsigned char Kmimo,unsigned char Mdlharq,uint32_t Nsoft,unsigned char N_RB_DL, uint8_t abstraction_flag, LTE_DL_FRAME_PARMS *frame_parms) {
{
LTE_eNB_DLSCH_t *dlsch; LTE_eNB_DLSCH_t *dlsch;
unsigned char exit_flag = 0,i,j,r,aa,layer; unsigned char exit_flag = 0,i,j,r,aa,layer;
int re; int re;
unsigned char bw_scaling =1; unsigned char bw_scaling =1;
switch (N_RB_DL) { switch (N_RB_DL) {
case 6: case 6:
bw_scaling =16; bw_scaling =16;
break; break;
case 25: case 25:
bw_scaling =4; bw_scaling =4;
break; break;
case 50: case 50:
bw_scaling =2; bw_scaling =2;
break; break;
default: default:
bw_scaling =1; bw_scaling =1;
break; break;
} }
dlsch = (LTE_eNB_DLSCH_t *)malloc16(sizeof(LTE_eNB_DLSCH_t)); dlsch = (LTE_eNB_DLSCH_t *)malloc16(sizeof(LTE_eNB_DLSCH_t));
@@ -128,15 +130,16 @@ LTE_eNB_DLSCH_t *new_eNB_dlsch(unsigned char Kmimo,unsigned char Mdlharq,uint32_
dlsch->Mdlharq = Mdlharq; dlsch->Mdlharq = Mdlharq;
dlsch->Mlimit = 8; dlsch->Mlimit = 8;
dlsch->Nsoft = Nsoft; dlsch->Nsoft = Nsoft;
for (layer=0; layer<4; layer++) { for (layer=0; layer<4; layer++) {
dlsch->ue_spec_bf_weights[layer] = (int32_t**)malloc16(64*sizeof(int32_t*)); dlsch->ue_spec_bf_weights[layer] = (int32_t **)malloc16(64*sizeof(int32_t *));
for (aa=0; aa<64; aa++) { for (aa=0; aa<64; aa++) {
dlsch->ue_spec_bf_weights[layer][aa] = (int32_t *)malloc16(OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES*sizeof(int32_t)); dlsch->ue_spec_bf_weights[layer][aa] = (int32_t *)malloc16(OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES*sizeof(int32_t));
for (re=0;re<OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES; re++) {
dlsch->ue_spec_bf_weights[layer][aa][re] = 0x00007fff; for (re=0; re<OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES; re++) {
} dlsch->ue_spec_bf_weights[layer][aa][re] = 0x00007fff;
}
} }
} }
@@ -159,7 +162,7 @@ LTE_eNB_DLSCH_t *new_eNB_dlsch(unsigned char Kmimo,unsigned char Mdlharq,uint32_
if (dlsch->harq_processes[i]) { if (dlsch->harq_processes[i]) {
bzero(dlsch->harq_processes[i],sizeof(LTE_DL_eNB_HARQ_t)); bzero(dlsch->harq_processes[i],sizeof(LTE_DL_eNB_HARQ_t));
// dlsch->harq_processes[i]->first_tx=1; // dlsch->harq_processes[i]->first_tx=1;
dlsch->harq_processes[i]->b = (unsigned char*)malloc16(MAX_DLSCH_PAYLOAD_BYTES/bw_scaling); dlsch->harq_processes[i]->b = (unsigned char *)malloc16(MAX_DLSCH_PAYLOAD_BYTES/bw_scaling);
if (dlsch->harq_processes[i]->b) { if (dlsch->harq_processes[i]->b) {
bzero(dlsch->harq_processes[i]->b,MAX_DLSCH_PAYLOAD_BYTES/bw_scaling); bzero(dlsch->harq_processes[i]->b,MAX_DLSCH_PAYLOAD_BYTES/bw_scaling);
@@ -171,14 +174,16 @@ LTE_eNB_DLSCH_t *new_eNB_dlsch(unsigned char Kmimo,unsigned char Mdlharq,uint32_
if (abstraction_flag==0) { if (abstraction_flag==0) {
for (r=0; r<MAX_NUM_DLSCH_SEGMENTS/bw_scaling; r++) { for (r=0; r<MAX_NUM_DLSCH_SEGMENTS/bw_scaling; r++) {
// account for filler in first segment and CRCs for multiple segment case // account for filler in first segment and CRCs for multiple segment case
dlsch->harq_processes[i]->c[r] = (uint8_t*)malloc16(((r==0)?8:0) + 3+ 768); dlsch->harq_processes[i]->c[r] = (uint8_t *)malloc16(((r==0)?8:0) + 3+ 768);
dlsch->harq_processes[i]->d[r] = (uint8_t*)malloc16((96+12+3+(3*6144))); dlsch->harq_processes[i]->d[r] = (uint8_t *)malloc16((96+12+3+(3*6144)));
if (dlsch->harq_processes[i]->c[r]) { if (dlsch->harq_processes[i]->c[r]) {
bzero(dlsch->harq_processes[i]->c[r],((r==0)?8:0) + 3+ 768); bzero(dlsch->harq_processes[i]->c[r],((r==0)?8:0) + 3+ 768);
} else { } else {
printf("Can't get c\n"); printf("Can't get c\n");
exit_flag=2; exit_flag=2;
} }
if (dlsch->harq_processes[i]->d[r]) { if (dlsch->harq_processes[i]->d[r]) {
bzero(dlsch->harq_processes[i]->d[r],(96+12+3+(3*6144))); bzero(dlsch->harq_processes[i]->d[r],(96+12+3+(3*6144)));
} else { } else {
@@ -197,13 +202,12 @@ LTE_eNB_DLSCH_t *new_eNB_dlsch(unsigned char Kmimo,unsigned char Mdlharq,uint32_
for (i=0; i<Mdlharq; i++) { for (i=0; i<Mdlharq; i++) {
dlsch->harq_processes[i]->round=0; dlsch->harq_processes[i]->round=0;
for (j=0; j<96; j++) for (j=0; j<96; j++)
for (r=0; r<MAX_NUM_DLSCH_SEGMENTS/bw_scaling; r++) { for (r=0; r<MAX_NUM_DLSCH_SEGMENTS/bw_scaling; r++) {
// printf("dlsch->harq_processes[%d]->d[%d] %p\n",i,r,dlsch->harq_processes[i]->d[r]); // printf("dlsch->harq_processes[%d]->d[%d] %p\n",i,r,dlsch->harq_processes[i]->d[r]);
if (dlsch->harq_processes[i]->d[r]) if (dlsch->harq_processes[i]->d[r])
dlsch->harq_processes[i]->d[r][j] = LTE_NULL; dlsch->harq_processes[i]->d[r][j] = LTE_NULL;
} }
} }
return(dlsch); return(dlsch);
@@ -211,16 +215,12 @@ LTE_eNB_DLSCH_t *new_eNB_dlsch(unsigned char Kmimo,unsigned char Mdlharq,uint32_
} }
LOG_D(PHY,"new_eNB_dlsch exit flag %d, size of %ld\n", LOG_D(PHY,"new_eNB_dlsch exit flag %d, size of %ld\n",
exit_flag, sizeof(LTE_eNB_DLSCH_t)); exit_flag, sizeof(LTE_eNB_DLSCH_t));
free_eNB_dlsch(dlsch); free_eNB_dlsch(dlsch);
return(NULL); return(NULL);
} }
void clean_eNb_dlsch(LTE_eNB_DLSCH_t *dlsch) void clean_eNb_dlsch(LTE_eNB_DLSCH_t *dlsch) {
{
unsigned char Mdlharq; unsigned char Mdlharq;
unsigned char i,j,r; unsigned char i,j,r;
@@ -228,8 +228,10 @@ void clean_eNb_dlsch(LTE_eNB_DLSCH_t *dlsch)
Mdlharq = dlsch->Mdlharq; Mdlharq = dlsch->Mdlharq;
dlsch->rnti = 0; dlsch->rnti = 0;
#ifdef PHY_TX_THREAD #ifdef PHY_TX_THREAD
for (i=0; i<10; i++) for (i=0; i<10; i++)
dlsch->active[i] = 0; dlsch->active[i] = 0;
#else #else
dlsch->active = 0; dlsch->active = 0;
#endif #endif
@@ -244,11 +246,10 @@ void clean_eNb_dlsch(LTE_eNB_DLSCH_t *dlsch)
dlsch->harq_processes[i]->status = 0; dlsch->harq_processes[i]->status = 0;
dlsch->harq_processes[i]->round = 0; dlsch->harq_processes[i]->round = 0;
for (j=0; j<96; j++) for (j=0; j<96; j++)
for (r=0; r<MAX_NUM_DLSCH_SEGMENTS; r++) for (r=0; r<MAX_NUM_DLSCH_SEGMENTS; r++)
if (dlsch->harq_processes[i]->d[r]) if (dlsch->harq_processes[i]->d[r])
dlsch->harq_processes[i]->d[r][j] = LTE_NULL; dlsch->harq_processes[i]->d[r][j] = LTE_NULL;
} }
} }
} }
@@ -258,31 +259,24 @@ void clean_eNb_dlsch(LTE_eNB_DLSCH_t *dlsch)
int dlsch_encoding_2threads0(te_params *tep) { int dlsch_encoding_2threads0(te_params *tep) {
LTE_eNB_DLSCH_t *dlsch = tep->dlsch; LTE_eNB_DLSCH_t *dlsch = tep->dlsch;
unsigned int G = tep->G; unsigned int G = tep->G;
unsigned char harq_pid = tep->harq_pid; unsigned char harq_pid = tep->harq_pid;
unsigned int total_worker = tep->total_worker; unsigned int total_worker = tep->total_worker;
unsigned int current_worker = tep->current_worker; unsigned int current_worker = tep->current_worker;
unsigned short nb_rb = dlsch->harq_processes[harq_pid]->nb_rb; unsigned short nb_rb = dlsch->harq_processes[harq_pid]->nb_rb;
unsigned int Kr=0,Kr_bytes,r,r_offset=0; unsigned int Kr=0,Kr_bytes,r,r_offset=0;
// unsigned short m=dlsch->harq_processes[harq_pid]->mcs; // unsigned short m=dlsch->harq_processes[harq_pid]->mcs;
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING_W, VCD_FUNCTION_IN); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING_W, VCD_FUNCTION_IN);
if (dlsch->harq_processes[harq_pid]->round == 0) { // this is a new packet if (dlsch->harq_processes[harq_pid]->round == 0) { // this is a new packet
for (r=(dlsch->harq_processes[harq_pid]->C/(total_worker+1))*current_worker; r<(dlsch->harq_processes[harq_pid]->C/(total_worker+1))*(current_worker+1); r++) { for (r=(dlsch->harq_processes[harq_pid]->C/(total_worker+1))*current_worker; r<(dlsch->harq_processes[harq_pid]->C/(total_worker+1))*(current_worker+1); r++) {
if (r<dlsch->harq_processes[harq_pid]->Cminus) if (r<dlsch->harq_processes[harq_pid]->Cminus)
Kr = dlsch->harq_processes[harq_pid]->Kminus; Kr = dlsch->harq_processes[harq_pid]->Kminus;
else else
Kr = dlsch->harq_processes[harq_pid]->Kplus; Kr = dlsch->harq_processes[harq_pid]->Kplus;
Kr_bytes = Kr>>3; Kr_bytes = Kr>>3;
encoder(dlsch->harq_processes[harq_pid]->c[r], encoder(dlsch->harq_processes[harq_pid]->c[r],
Kr>>3, Kr>>3,
&dlsch->harq_processes[harq_pid]->d[r][96], &dlsch->harq_processes[harq_pid]->d[r][96],
@@ -293,25 +287,24 @@ int dlsch_encoding_2threads0(te_params *tep) {
&dlsch->harq_processes[harq_pid]->d[r][96], &dlsch->harq_processes[harq_pid]->d[r][96],
dlsch->harq_processes[harq_pid]->w[r]); dlsch->harq_processes[harq_pid]->w[r]);
} }
} }
// Fill in the "e"-sequence from 36-212, V8.6 2009-03, p. 16-17 (for each "e") and concatenate the // Fill in the "e"-sequence from 36-212, V8.6 2009-03, p. 16-17 (for each "e") and concatenate the
// outputs for each code segment, see Section 5.1.5 p.20 // outputs for each code segment, see Section 5.1.5 p.20
for (r=0,r_offset=0; r<(dlsch->harq_processes[harq_pid]->C/(total_worker+1))*(current_worker+1); r++) { for (r=0,r_offset=0; r<(dlsch->harq_processes[harq_pid]->C/(total_worker+1))*(current_worker+1); r++) {
if(r<(dlsch->harq_processes[harq_pid]->C/(total_worker+1))*(current_worker)){ if(r<(dlsch->harq_processes[harq_pid]->C/(total_worker+1))*(current_worker)) {
int Nl=dlsch->harq_processes[harq_pid]->Nl; int Nl=dlsch->harq_processes[harq_pid]->Nl;
int Qm=dlsch->harq_processes[harq_pid]->Qm; int Qm=dlsch->harq_processes[harq_pid]->Qm;
int C = dlsch->harq_processes[harq_pid]->C; int C = dlsch->harq_processes[harq_pid]->C;
int Gp = G/Nl/Qm; int Gp = G/Nl/Qm;
int GpmodC = Gp%C; int GpmodC = Gp%C;
if (r < (C-(GpmodC))) if (r < (C-(GpmodC)))
r_offset += Nl*Qm * (Gp/C); r_offset += Nl*Qm * (Gp/C);
else else
r_offset += Nl*Qm * ((GpmodC==0?0:1) + (Gp/C)); r_offset += Nl*Qm * ((GpmodC==0?0:1) + (Gp/C));
} } else {
else{
r_offset += lte_rate_matching_turbo(dlsch->harq_processes[harq_pid]->RTC[r], r_offset += lte_rate_matching_turbo(dlsch->harq_processes[harq_pid]->RTC[r],
G, //G G, //G
dlsch->harq_processes[harq_pid]->w[r], dlsch->harq_processes[harq_pid]->w[r],
@@ -330,7 +323,6 @@ int dlsch_encoding_2threads0(te_params *tep) {
} }
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING_W, VCD_FUNCTION_OUT); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING_W, VCD_FUNCTION_OUT);
return(0); return(0);
} }
@@ -339,19 +331,16 @@ extern int oai_exit;
void *te_thread(void *param) { void *te_thread(void *param) {
cpu_set_t cpuset; cpu_set_t cpuset;
CPU_ZERO(&cpuset); CPU_ZERO(&cpuset);
thread_top_init("te_thread",1,200000,250000,500000); thread_top_init("te_thread",1,200000,250000,500000);
pthread_setname_np( pthread_self(),"te processing"); pthread_setname_np( pthread_self(),"te processing");
LOG_I(PHY,"thread te created id=%ld\n", syscall(__NR_gettid)); LOG_I(PHY,"thread te created id=%ld\n", syscall(__NR_gettid));
te_params *tep = (te_params *)param; te_params *tep = (te_params *)param;
//wait_sync("te_thread");
while (!oai_exit) {
//wait_sync("te_thread");
while (!oai_exit) {
if (wait_on_condition(&tep->mutex_te,&tep->cond_te,&tep->instance_cnt_te,"te thread")<0) break; if (wait_on_condition(&tep->mutex_te,&tep->cond_te,&tep->instance_cnt_te,"te thread")<0) break;
if(oai_exit) break; if(oai_exit) break;
dlsch_encoding_2threads0(tep); dlsch_encoding_2threads0(tep);
@@ -363,6 +352,7 @@ void *te_thread(void *param) {
exit_fun( "ERROR pthread_cond_signal" ); exit_fun( "ERROR pthread_cond_signal" );
return(NULL); return(NULL);
} }
/*if(opp_enabled == 1 && te_wakeup_stats0->p_time>50*3000){ /*if(opp_enabled == 1 && te_wakeup_stats0->p_time>50*3000){
print_meas_now(te_wakeup_stats0,"coding_wakeup",stderr); print_meas_now(te_wakeup_stats0,"coding_wakeup",stderr);
printf("te_thread0 delay for waking up in frame_rx: %d subframe_rx: %d \n",proc->frame_rx,proc->subframe_rx); printf("te_thread0 delay for waking up in frame_rx: %d subframe_rx: %d \n",proc->frame_rx,proc->subframe_rx);
@@ -375,61 +365,56 @@ void *te_thread(void *param) {
int dlsch_encoding_2threads(PHY_VARS_eNB *eNB, int dlsch_encoding_2threads(PHY_VARS_eNB *eNB,
unsigned char *a, unsigned char *a,
uint8_t num_pdcch_symbols, uint8_t num_pdcch_symbols,
LTE_eNB_DLSCH_t *dlsch, LTE_eNB_DLSCH_t *dlsch,
int frame, int frame,
uint8_t subframe, uint8_t subframe,
time_stats_t *rm_stats, time_stats_t *rm_stats,
time_stats_t *te_stats, time_stats_t *te_stats,
time_stats_t *te_wait_stats, time_stats_t *te_wait_stats,
time_stats_t *te_main_stats, time_stats_t *te_main_stats,
time_stats_t *te_wakeup_stats0, time_stats_t *te_wakeup_stats0,
time_stats_t *te_wakeup_stats1, time_stats_t *te_wakeup_stats1,
time_stats_t *i_stats, time_stats_t *i_stats,
int worker_num) int worker_num) {
{
//start_meas(&eNB->dlsch_turbo_encoding_preperation_stats); //start_meas(&eNB->dlsch_turbo_encoding_preperation_stats);
LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms; LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms;
L1_proc_t *proc = &eNB->proc; L1_proc_t *proc = &eNB->proc;
unsigned int G; unsigned int G;
unsigned int crc=1; unsigned int crc=1;
unsigned char harq_pid = dlsch->harq_ids[frame%2][subframe]; unsigned char harq_pid = dlsch->harq_ids[frame%2][subframe];
if(harq_pid >= dlsch->Mdlharq) { if(harq_pid >= dlsch->Mdlharq) {
LOG_E(PHY,"dlsch_encoding_2threads illegal harq_pid %d\n", harq_pid); LOG_E(PHY,"dlsch_encoding_2threads illegal harq_pid %d\n", harq_pid);
return(-1); return(-1);
} }
unsigned short nb_rb = dlsch->harq_processes[harq_pid]->nb_rb; unsigned short nb_rb = dlsch->harq_processes[harq_pid]->nb_rb;
unsigned int A; unsigned int A;
unsigned char mod_order; unsigned char mod_order;
unsigned int Kr=0,Kr_bytes,r,r_offset=0; unsigned int Kr=0,Kr_bytes,r,r_offset=0;
// unsigned short m=dlsch->harq_processes[harq_pid]->mcs; // unsigned short m=dlsch->harq_processes[harq_pid]->mcs;
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING, VCD_FUNCTION_IN); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING, VCD_FUNCTION_IN);
A = dlsch->harq_processes[harq_pid]->TBS; //6228 A = dlsch->harq_processes[harq_pid]->TBS; //6228
mod_order = dlsch->harq_processes[harq_pid]->Qm; mod_order = dlsch->harq_processes[harq_pid]->Qm;
G = get_G(frame_parms,nb_rb,dlsch->harq_processes[harq_pid]->rb_alloc,mod_order,dlsch->harq_processes[harq_pid]->Nl,num_pdcch_symbols,frame,subframe,dlsch->harq_processes[harq_pid]->mimo_mode==TM7?7:0); G = get_G(frame_parms,nb_rb,dlsch->harq_processes[harq_pid]->rb_alloc,mod_order,dlsch->harq_processes[harq_pid]->Nl,num_pdcch_symbols,frame,subframe,
dlsch->harq_processes[harq_pid]->mimo_mode==TM7?7:0);
if (dlsch->harq_processes[harq_pid]->round == 0) { // this is a new packet if (dlsch->harq_processes[harq_pid]->round == 0) { // this is a new packet
start_meas(&eNB->dlsch_turbo_encoding_preperation_stats); start_meas(&eNB->dlsch_turbo_encoding_preperation_stats);
// Add 24-bit crc (polynomial A) to payload // Add 24-bit crc (polynomial A) to payload
crc = crc24a(a, crc = crc24a(a,
A)>>8; A)>>8;
stop_meas(&eNB->dlsch_turbo_encoding_preperation_stats); stop_meas(&eNB->dlsch_turbo_encoding_preperation_stats);
a[A>>3] = ((uint8_t*)&crc)[2]; a[A>>3] = ((uint8_t *)&crc)[2];
a[1+(A>>3)] = ((uint8_t*)&crc)[1]; a[1+(A>>3)] = ((uint8_t *)&crc)[1];
a[2+(A>>3)] = ((uint8_t*)&crc)[0]; a[2+(A>>3)] = ((uint8_t *)&crc)[0];
dlsch->harq_processes[harq_pid]->B = A+24; dlsch->harq_processes[harq_pid]->B = A+24;
memcpy(dlsch->harq_processes[harq_pid]->b,a,(A/8)+4); memcpy(dlsch->harq_processes[harq_pid]->b,a,(A/8)+4);
//stop_meas(&eNB->dlsch_turbo_encoding_preperation_stats); //stop_meas(&eNB->dlsch_turbo_encoding_preperation_stats);
start_meas(&eNB->dlsch_turbo_encoding_segmentation_stats); start_meas(&eNB->dlsch_turbo_encoding_segmentation_stats);
if (lte_segmentation(dlsch->harq_processes[harq_pid]->b, if (lte_segmentation(dlsch->harq_processes[harq_pid]->b,
dlsch->harq_processes[harq_pid]->c, dlsch->harq_processes[harq_pid]->c,
dlsch->harq_processes[harq_pid]->B, dlsch->harq_processes[harq_pid]->B,
@@ -442,48 +427,46 @@ int dlsch_encoding_2threads(PHY_VARS_eNB *eNB,
return(-1); return(-1);
stop_meas(&eNB->dlsch_turbo_encoding_segmentation_stats); stop_meas(&eNB->dlsch_turbo_encoding_segmentation_stats);
start_meas(&eNB->dlsch_turbo_encoding_signal_stats); start_meas(&eNB->dlsch_turbo_encoding_signal_stats);
for(int i=0;i<worker_num;i++)
{ for(int i=0; i<worker_num; i++) {
proc->tep[i].eNB = eNB; proc->tep[i].eNB = eNB;
proc->tep[i].dlsch = dlsch; proc->tep[i].dlsch = dlsch;
proc->tep[i].G = G; proc->tep[i].G = G;
proc->tep[i].harq_pid = harq_pid; proc->tep[i].harq_pid = harq_pid;
proc->tep[i].total_worker = worker_num; proc->tep[i].total_worker = worker_num;
proc->tep[i].current_worker = i; proc->tep[i].current_worker = i;
pthread_mutex_lock( &proc->tep[i].mutex_te ); pthread_mutex_lock( &proc->tep[i].mutex_te );
if (proc->tep[i].instance_cnt_te==0) { if (proc->tep[i].instance_cnt_te==0) {
printf("[eNB] TE thread busy\n"); printf("[eNB] TE thread busy\n");
exit_fun("TE thread busy"); exit_fun("TE thread busy");
pthread_mutex_unlock( &proc->tep[i].mutex_te ); pthread_mutex_unlock( &proc->tep[i].mutex_te );
return(-1); return(-1);
} }
++proc->tep[i].instance_cnt_te; ++proc->tep[i].instance_cnt_te;
// wakeup worker to do segments // wakeup worker to do segments
if (pthread_cond_signal(&proc->tep[i].cond_te) != 0) { if (pthread_cond_signal(&proc->tep[i].cond_te) != 0) {
printf("[eNB] ERROR pthread_cond_signal for te thread %d exit\n",i); printf("[eNB] ERROR pthread_cond_signal for te thread %d exit\n",i);
exit_fun( "ERROR pthread_cond_signal" ); exit_fun( "ERROR pthread_cond_signal" );
return (-1); return (-1);
} }
pthread_mutex_unlock( &proc->tep[i].mutex_te ); pthread_mutex_unlock( &proc->tep[i].mutex_te );
} }
stop_meas(&eNB->dlsch_turbo_encoding_signal_stats); stop_meas(&eNB->dlsch_turbo_encoding_signal_stats);
start_meas(te_main_stats); start_meas(te_main_stats);
for (r=(dlsch->harq_processes[harq_pid]->C/(worker_num+1))*worker_num; r<dlsch->harq_processes[harq_pid]->C; r++) {
for (r=(dlsch->harq_processes[harq_pid]->C/(worker_num+1))*worker_num; r<dlsch->harq_processes[harq_pid]->C; r++) {
if (r<dlsch->harq_processes[harq_pid]->Cminus) if (r<dlsch->harq_processes[harq_pid]->Cminus)
Kr = dlsch->harq_processes[harq_pid]->Kminus; Kr = dlsch->harq_processes[harq_pid]->Kminus;
else else
Kr = dlsch->harq_processes[harq_pid]->Kplus; Kr = dlsch->harq_processes[harq_pid]->Kplus;
Kr_bytes = Kr>>3; Kr_bytes = Kr>>3;
start_meas(te_stats); start_meas(te_stats);
encoder(dlsch->harq_processes[harq_pid]->c[r], encoder(dlsch->harq_processes[harq_pid]->c[r],
Kr>>3, Kr>>3,
@@ -491,7 +474,6 @@ int dlsch_encoding_2threads(PHY_VARS_eNB *eNB,
(r==0) ? dlsch->harq_processes[harq_pid]->F : 0 (r==0) ? dlsch->harq_processes[harq_pid]->F : 0
); );
stop_meas(te_stats); stop_meas(te_stats);
start_meas(i_stats); start_meas(i_stats);
dlsch->harq_processes[harq_pid]->RTC[r] = dlsch->harq_processes[harq_pid]->RTC[r] =
sub_block_interleaving_turbo(4+(Kr_bytes*8), sub_block_interleaving_turbo(4+(Kr_bytes*8),
@@ -499,17 +481,14 @@ int dlsch_encoding_2threads(PHY_VARS_eNB *eNB,
dlsch->harq_processes[harq_pid]->w[r]); dlsch->harq_processes[harq_pid]->w[r]);
stop_meas(i_stats); stop_meas(i_stats);
} }
} else {
} for(int i=0; i<worker_num; i++) {
else {
for(int i=0;i<worker_num;i++)
{
proc->tep[i].eNB = eNB; proc->tep[i].eNB = eNB;
proc->tep[i].dlsch = dlsch; proc->tep[i].dlsch = dlsch;
proc->tep[i].G = G; proc->tep[i].G = G;
proc->tep[i].total_worker = worker_num; proc->tep[i].total_worker = worker_num;
proc->tep[i].current_worker = i; proc->tep[i].current_worker = i;
if (pthread_cond_signal(&proc->tep[i].cond_te) != 0) { if (pthread_cond_signal(&proc->tep[i].cond_te) != 0) {
printf("[eNB] ERROR pthread_cond_signal for te thread exit\n"); printf("[eNB] ERROR pthread_cond_signal for te thread exit\n");
exit_fun( "ERROR pthread_cond_signal" ); exit_fun( "ERROR pthread_cond_signal" );
@@ -521,7 +500,6 @@ int dlsch_encoding_2threads(PHY_VARS_eNB *eNB,
// Fill in the "e"-sequence from 36-212, V8.6 2009-03, p. 16-17 (for each "e") and concatenate the // Fill in the "e"-sequence from 36-212, V8.6 2009-03, p. 16-17 (for each "e") and concatenate the
// outputs for each code segment, see Section 5.1.5 p.20 // outputs for each code segment, see Section 5.1.5 p.20
for (r=0,r_offset=0; r<dlsch->harq_processes[harq_pid]->C; r++) { for (r=0,r_offset=0; r<dlsch->harq_processes[harq_pid]->C; r++) {
// get information for E for the segments that are handled by the worker thread // get information for E for the segments that are handled by the worker thread
if (r<(dlsch->harq_processes[harq_pid]->C/(worker_num+1))*worker_num) { if (r<(dlsch->harq_processes[harq_pid]->C/(worker_num+1))*worker_num) {
int Nl=dlsch->harq_processes[harq_pid]->Nl; int Nl=dlsch->harq_processes[harq_pid]->Nl;
@@ -529,209 +507,186 @@ int dlsch_encoding_2threads(PHY_VARS_eNB *eNB,
int C = dlsch->harq_processes[harq_pid]->C; int C = dlsch->harq_processes[harq_pid]->C;
int Gp = G/Nl/Qm; int Gp = G/Nl/Qm;
int GpmodC = Gp%C; int GpmodC = Gp%C;
if (r < (C-(GpmodC))) if (r < (C-(GpmodC)))
r_offset += Nl*Qm * (Gp/C); r_offset += Nl*Qm * (Gp/C);
else else
r_offset += Nl*Qm * ((GpmodC==0?0:1) + (Gp/C)); r_offset += Nl*Qm * ((GpmodC==0?0:1) + (Gp/C));
} } else {
else {
start_meas(rm_stats); start_meas(rm_stats);
r_offset += lte_rate_matching_turbo(dlsch->harq_processes[harq_pid]->RTC[r], r_offset += lte_rate_matching_turbo(dlsch->harq_processes[harq_pid]->RTC[r],
G, //G G, //G
dlsch->harq_processes[harq_pid]->w[r], dlsch->harq_processes[harq_pid]->w[r],
dlsch->harq_processes[harq_pid]->e+r_offset, dlsch->harq_processes[harq_pid]->e+r_offset,
dlsch->harq_processes[harq_pid]->C, // C dlsch->harq_processes[harq_pid]->C, // C
dlsch->Nsoft, // Nsoft, dlsch->Nsoft, // Nsoft,
dlsch->Mdlharq, dlsch->Mdlharq,
dlsch->Kmimo, dlsch->Kmimo,
dlsch->harq_processes[harq_pid]->rvidx, dlsch->harq_processes[harq_pid]->rvidx,
dlsch->harq_processes[harq_pid]->Qm, dlsch->harq_processes[harq_pid]->Qm,
dlsch->harq_processes[harq_pid]->Nl, dlsch->harq_processes[harq_pid]->Nl,
r, r,
nb_rb); nb_rb);
// m); // r // m); // r
stop_meas(rm_stats); stop_meas(rm_stats);
} }
} }
stop_meas(te_main_stats);
stop_meas(te_main_stats);
start_meas(te_wait_stats); start_meas(te_wait_stats);
if(worker_num == 1)
{ if(worker_num == 1) {
wait_on_busy_condition(&proc->tep[0].mutex_te,&proc->tep[0].cond_te,&proc->tep[0].instance_cnt_te,"te thread 0"); wait_on_busy_condition(&proc->tep[0].mutex_te,&proc->tep[0].cond_te,&proc->tep[0].instance_cnt_te,"te thread 0");
} } else if(worker_num == 2) {
else if(worker_num == 2)
{
wait_on_busy_condition(&proc->tep[0].mutex_te,&proc->tep[0].cond_te,&proc->tep[0].instance_cnt_te,"te thread 0"); wait_on_busy_condition(&proc->tep[0].mutex_te,&proc->tep[0].cond_te,&proc->tep[0].instance_cnt_te,"te thread 0");
wait_on_busy_condition(&proc->tep[1].mutex_te,&proc->tep[1].cond_te,&proc->tep[1].instance_cnt_te,"te thread 1"); wait_on_busy_condition(&proc->tep[1].mutex_te,&proc->tep[1].cond_te,&proc->tep[1].instance_cnt_te,"te thread 1");
} } else {
else
{
wait_on_busy_condition(&proc->tep[0].mutex_te,&proc->tep[0].cond_te,&proc->tep[0].instance_cnt_te,"te thread 0"); wait_on_busy_condition(&proc->tep[0].mutex_te,&proc->tep[0].cond_te,&proc->tep[0].instance_cnt_te,"te thread 0");
wait_on_busy_condition(&proc->tep[1].mutex_te,&proc->tep[1].cond_te,&proc->tep[1].instance_cnt_te,"te thread 1"); wait_on_busy_condition(&proc->tep[1].mutex_te,&proc->tep[1].cond_te,&proc->tep[1].instance_cnt_te,"te thread 1");
wait_on_busy_condition(&proc->tep[2].mutex_te,&proc->tep[2].cond_te,&proc->tep[2].instance_cnt_te,"te thread 2"); wait_on_busy_condition(&proc->tep[2].mutex_te,&proc->tep[2].cond_te,&proc->tep[2].instance_cnt_te,"te thread 2");
} }
stop_meas(te_wait_stats); stop_meas(te_wait_stats);
/*if(opp_enabled == 1 && te_wait_stats->p_time>100*3000){ /*if(opp_enabled == 1 && te_wait_stats->p_time>100*3000){
print_meas_now(te_wait_stats,"coding_wait",stderr); print_meas_now(te_wait_stats,"coding_wait",stderr);
printf("coding delay in wait on codition in frame_rx: %d \n",proc->frame_rx); printf("coding delay in wait on codition in frame_rx: %d \n",proc->frame_rx);
}*/ }*/
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING, VCD_FUNCTION_OUT); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING, VCD_FUNCTION_OUT);
return(0); return(0);
} }
int dlsch_encoding_all(PHY_VARS_eNB *eNB, int dlsch_encoding_all(PHY_VARS_eNB *eNB,
unsigned char *a, unsigned char *a,
uint8_t num_pdcch_symbols, uint8_t num_pdcch_symbols,
LTE_eNB_DLSCH_t *dlsch, LTE_eNB_DLSCH_t *dlsch,
int frame, int frame,
uint8_t subframe, uint8_t subframe,
time_stats_t *rm_stats, time_stats_t *rm_stats,
time_stats_t *te_stats, time_stats_t *te_stats,
time_stats_t *te_wait_stats, time_stats_t *te_wait_stats,
time_stats_t *te_main_stats, time_stats_t *te_main_stats,
time_stats_t *te_wakeup_stats0, time_stats_t *te_wakeup_stats0,
time_stats_t *te_wakeup_stats1, time_stats_t *te_wakeup_stats1,
time_stats_t *i_stats) time_stats_t *i_stats) {
{ int encoding_return = 0;
int encoding_return = 0; unsigned int L,C,B;
unsigned int L,C,B; B = dlsch->harq_processes[dlsch->harq_ids[frame%2][subframe]]->B;
B = dlsch->harq_processes[dlsch->harq_ids[frame%2][subframe]]->B;
if(B<=6144)
{
L=0;
C=1;
}
else
{
L=24;
C = B/(6144-L);
if((6144-L)*C < B)
{
C = C+1;
}
}
if(B<=6144) {
L=0;
C=1;
} else {
L=24;
C = B/(6144-L);
if(get_thread_worker_conf() == WORKER_ENABLE) if((6144-L)*C < B) {
{ C = C+1;
if(C >= 8)//one main three worker
{
encoding_return =
dlsch_encoding_2threads(eNB,
a,
num_pdcch_symbols,
dlsch,
frame,
subframe,
rm_stats,
te_stats,
te_wait_stats,
te_main_stats,
te_wakeup_stats0,
te_wakeup_stats1,
i_stats,
3);
}
else if(C >= 6)//one main two worker
{
encoding_return =
dlsch_encoding_2threads(eNB,
a,
num_pdcch_symbols,
dlsch,
frame,
subframe,
rm_stats,
te_stats,
te_wait_stats,
te_main_stats,
te_wakeup_stats0,
te_wakeup_stats1,
i_stats,
2);
}
else if(C >= 4)//one main one worker
{
encoding_return =
dlsch_encoding_2threads(eNB,
a,
num_pdcch_symbols,
dlsch,
frame,
subframe,
rm_stats,
te_stats,
te_wait_stats,
te_main_stats,
te_wakeup_stats0,
te_wakeup_stats1,
i_stats,
1);
}
else
{
encoding_return =
dlsch_encoding(eNB,
a,
num_pdcch_symbols,
dlsch,
frame,
subframe,
rm_stats,
te_stats,
i_stats);
}
} }
else }
{
encoding_return = if(get_thread_worker_conf() == WORKER_ENABLE) {
dlsch_encoding(eNB, if(C >= 8) { //one main three worker
a, encoding_return =
num_pdcch_symbols, dlsch_encoding_2threads(eNB,
dlsch, a,
frame, num_pdcch_symbols,
subframe, dlsch,
rm_stats, frame,
te_stats, subframe,
i_stats); rm_stats,
te_stats,
te_wait_stats,
te_main_stats,
te_wakeup_stats0,
te_wakeup_stats1,
i_stats,
3);
} else if(C >= 6) { //one main two worker
encoding_return =
dlsch_encoding_2threads(eNB,
a,
num_pdcch_symbols,
dlsch,
frame,
subframe,
rm_stats,
te_stats,
te_wait_stats,
te_main_stats,
te_wakeup_stats0,
te_wakeup_stats1,
i_stats,
2);
} else if(C >= 4) { //one main one worker
encoding_return =
dlsch_encoding_2threads(eNB,
a,
num_pdcch_symbols,
dlsch,
frame,
subframe,
rm_stats,
te_stats,
te_wait_stats,
te_main_stats,
te_wakeup_stats0,
te_wakeup_stats1,
i_stats,
1);
} else {
encoding_return =
dlsch_encoding(eNB,
a,
num_pdcch_symbols,
dlsch,
frame,
subframe,
rm_stats,
te_stats,
i_stats);
} }
return encoding_return; } else {
encoding_return =
dlsch_encoding(eNB,
a,
num_pdcch_symbols,
dlsch,
frame,
subframe,
rm_stats,
te_stats,
i_stats);
}
return encoding_return;
} }
int dlsch_encoding(PHY_VARS_eNB *eNB, int dlsch_encoding(PHY_VARS_eNB *eNB,
unsigned char *a, unsigned char *a,
uint8_t num_pdcch_symbols, uint8_t num_pdcch_symbols,
LTE_eNB_DLSCH_t *dlsch, LTE_eNB_DLSCH_t *dlsch,
int frame, int frame,
uint8_t subframe, uint8_t subframe,
time_stats_t *rm_stats, time_stats_t *rm_stats,
time_stats_t *te_stats, time_stats_t *te_stats,
time_stats_t *i_stats) time_stats_t *i_stats) {
{
unsigned int G; unsigned int G;
unsigned int crc=1; unsigned int crc=1;
LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms; LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms;
unsigned char harq_pid = dlsch->harq_ids[frame%2][subframe]; unsigned char harq_pid = dlsch->harq_ids[frame%2][subframe];
if(harq_pid >= dlsch->Mdlharq) { if(harq_pid >= dlsch->Mdlharq) {
LOG_E(PHY,"dlsch_encoding illegal harq_pid %d\n", harq_pid); LOG_E(PHY,"dlsch_encoding illegal harq_pid %d\n", harq_pid);
return(-1); return(-1);
} }
unsigned short nb_rb = dlsch->harq_processes[harq_pid]->nb_rb; unsigned short nb_rb = dlsch->harq_processes[harq_pid]->nb_rb;
unsigned int A; unsigned int A;
unsigned char mod_order; unsigned char mod_order;
unsigned int Kr=0,Kr_bytes,r,r_offset=0; unsigned int Kr=0,Kr_bytes,r,r_offset=0;
// unsigned short m=dlsch->harq_processes[harq_pid]->mcs; // unsigned short m=dlsch->harq_processes[harq_pid]->mcs;
uint8_t beamforming_mode=0; uint8_t beamforming_mode=0;
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING, VCD_FUNCTION_IN); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING, VCD_FUNCTION_IN);
A = dlsch->harq_processes[harq_pid]->TBS; //6228 A = dlsch->harq_processes[harq_pid]->TBS; //6228
// printf("Encoder: A: %d\n",A); // printf("Encoder: A: %d\n",A);
mod_order = dlsch->harq_processes[harq_pid]->Qm; mod_order = dlsch->harq_processes[harq_pid]->Qm;
@@ -742,8 +697,8 @@ int dlsch_encoding(PHY_VARS_eNB *eNB,
beamforming_mode = 8; beamforming_mode = 8;
else if(dlsch->harq_processes[harq_pid]->mimo_mode == TM9_10) else if(dlsch->harq_processes[harq_pid]->mimo_mode == TM9_10)
beamforming_mode = 9; beamforming_mode = 9;
G = get_G(frame_parms,nb_rb,dlsch->harq_processes[harq_pid]->rb_alloc,mod_order,dlsch->harq_processes[harq_pid]->Nl,num_pdcch_symbols,frame,subframe,beamforming_mode);
G = get_G(frame_parms,nb_rb,dlsch->harq_processes[harq_pid]->rb_alloc,mod_order,dlsch->harq_processes[harq_pid]->Nl,num_pdcch_symbols,frame,subframe,beamforming_mode);
// if (dlsch->harq_processes[harq_pid]->Ndi == 1) { // this is a new packet // if (dlsch->harq_processes[harq_pid]->Ndi == 1) { // this is a new packet
if (dlsch->harq_processes[harq_pid]->round == 0) { // this is a new packet if (dlsch->harq_processes[harq_pid]->round == 0) { // this is a new packet
@@ -758,14 +713,12 @@ int dlsch_encoding(PHY_VARS_eNB *eNB,
printf("\n"); printf("\n");
*/ */
// Add 24-bit crc (polynomial A) to payload // Add 24-bit crc (polynomial A) to payload
crc = crc24a(a, crc = crc24a(a,
A)>>8; A)>>8;
a[A>>3] = ((uint8_t*)&crc)[2]; a[A>>3] = ((uint8_t *)&crc)[2];
a[1+(A>>3)] = ((uint8_t*)&crc)[1]; a[1+(A>>3)] = ((uint8_t *)&crc)[1];
a[2+(A>>3)] = ((uint8_t*)&crc)[0]; a[2+(A>>3)] = ((uint8_t *)&crc)[0];
// printf("CRC %x (A %d)\n",crc,A); // printf("CRC %x (A %d)\n",crc,A);
dlsch->harq_processes[harq_pid]->B = A+24; dlsch->harq_processes[harq_pid]->B = A+24;
// dlsch->harq_processes[harq_pid]->b = a; // dlsch->harq_processes[harq_pid]->b = a;
memcpy(dlsch->harq_processes[harq_pid]->b,a,(A/8)+4); memcpy(dlsch->harq_processes[harq_pid]->b,a,(A/8)+4);
@@ -782,25 +735,20 @@ int dlsch_encoding(PHY_VARS_eNB *eNB,
return(-1); return(-1);
for (r=0; r<dlsch->harq_processes[harq_pid]->C; r++) { for (r=0; r<dlsch->harq_processes[harq_pid]->C; r++) {
if (r<dlsch->harq_processes[harq_pid]->Cminus) if (r<dlsch->harq_processes[harq_pid]->Cminus)
Kr = dlsch->harq_processes[harq_pid]->Kminus; Kr = dlsch->harq_processes[harq_pid]->Kminus;
else else
Kr = dlsch->harq_processes[harq_pid]->Kplus; Kr = dlsch->harq_processes[harq_pid]->Kplus;
Kr_bytes = Kr>>3; Kr_bytes = Kr>>3;
#ifdef DEBUG_DLSCH_CODING #ifdef DEBUG_DLSCH_CODING
printf("Generating Code Segment %d (%d bits)\n",r,Kr); printf("Generating Code Segment %u (%u bits)\n",r,Kr);
// generate codewords // generate codewords
printf("bits_per_codeword (Kr)= %u, A %u\n",Kr,A);
printf("bits_per_codeword (Kr)= %d, A %d\n",Kr,A);
printf("N_RB = %d\n",nb_rb); printf("N_RB = %d\n",nb_rb);
printf("Ncp %d\n",frame_parms->Ncp); printf("Ncp %d\n",frame_parms->Ncp);
printf("mod_order %d\n",mod_order); printf("mod_order %d\n",mod_order);
#endif #endif
start_meas(te_stats); start_meas(te_stats);
encoder(dlsch->harq_processes[harq_pid]->c[r], encoder(dlsch->harq_processes[harq_pid]->c[r],
Kr>>3, Kr>>3,
@@ -821,7 +769,6 @@ int dlsch_encoding(PHY_VARS_eNB *eNB,
dlsch->harq_processes[harq_pid]->w[r]); dlsch->harq_processes[harq_pid]->w[r]);
stop_meas(i_stats); stop_meas(i_stats);
} }
} }
// Fill in the "e"-sequence from 36-212, V8.6 2009-03, p. 16-17 (for each "e") and concatenate the // Fill in the "e"-sequence from 36-212, V8.6 2009-03, p. 16-17 (for each "e") and concatenate the
@@ -829,16 +776,15 @@ int dlsch_encoding(PHY_VARS_eNB *eNB,
for (r=0; r<dlsch->harq_processes[harq_pid]->C; r++) { for (r=0; r<dlsch->harq_processes[harq_pid]->C; r++) {
#ifdef DEBUG_DLSCH_CODING #ifdef DEBUG_DLSCH_CODING
printf("Rate Matching, Code segment %d (coded bits (G) %d,unpunctured/repeated bits per code segment %d,mod_order %d, nb_rb %d)...\n", printf("Rate Matching, Code segment %u (coded bits (G) %u,unpunctured/repeated bits per code segment %u,mod_order %d, nb_rb %d)...\n",
r, r,
G, G,
Kr*3, Kr*3,
mod_order,nb_rb); mod_order,nb_rb);
#endif #endif
start_meas(rm_stats); start_meas(rm_stats);
#ifdef DEBUG_DLSCH_CODING #ifdef DEBUG_DLSCH_CODING
printf("rvidx in encoding = %d\n", dlsch->harq_processes[harq_pid]->rvidx); printf("rvidx in encoding = %d\n", dlsch->harq_processes[harq_pid]->rvidx);
#endif #endif
r_offset += lte_rate_matching_turbo(dlsch->harq_processes[harq_pid]->RTC[r], r_offset += lte_rate_matching_turbo(dlsch->harq_processes[harq_pid]->RTC[r],
G, //G G, //G
@@ -853,7 +799,7 @@ int dlsch_encoding(PHY_VARS_eNB *eNB,
dlsch->harq_processes[harq_pid]->Nl, dlsch->harq_processes[harq_pid]->Nl,
r, r,
nb_rb); nb_rb);
// m); // r // m); // r
stop_meas(rm_stats); stop_meas(rm_stats);
#ifdef DEBUG_DLSCH_CODING #ifdef DEBUG_DLSCH_CODING
@@ -864,7 +810,6 @@ int dlsch_encoding(PHY_VARS_eNB *eNB,
} }
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING, VCD_FUNCTION_OUT); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING, VCD_FUNCTION_OUT);
return(0); return(0);
} }
@@ -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,
((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;
} }
} }
+2 -2
View File
@@ -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,
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,
+189 -208
View File
@@ -33,105 +33,98 @@
#include "PHY/defs_eNB.h" #include "PHY/defs_eNB.h"
uint8_t get_mi(LTE_DL_FRAME_PARMS *frame_parms,uint8_t subframe) uint8_t get_mi(LTE_DL_FRAME_PARMS *frame_parms,uint8_t subframe) {
{
// for FDD // for FDD
if (frame_parms->frame_type == FDD) if (frame_parms->frame_type == FDD)
return 1; return 1;
// for TDD // for TDD
switch (frame_parms->tdd_config) { switch (frame_parms->tdd_config) {
case 0:
if ((subframe==0) || (subframe==5))
return(2);
else return(1);
case 0: break;
if ((subframe==0) || (subframe==5))
return(2);
else return(1);
break; case 1:
if ((subframe==0) || (subframe==5))
return(0);
else return(1);
case 1: break;
if ((subframe==0) || (subframe==5))
case 2:
if ((subframe==3) || (subframe==8))
return(1);
else return(0);
break;
case 3:
if ((subframe==0) || (subframe==8) || (subframe==9))
return(1);
else return(0);
break;
case 4:
if ((subframe==8) || (subframe==9))
return(1);
else return(0);
break;
case 5:
if (subframe==8)
return(1);
else return(0);
break;
case 6:
return(1);
break;
default:
return(0); return(0);
else return(1);
break;
case 2:
if ((subframe==3) || (subframe==8))
return(1);
else return(0);
break;
case 3:
if ((subframe==0) || (subframe==8) || (subframe==9))
return(1);
else return(0);
break;
case 4:
if ((subframe==8) || (subframe==9))
return(1);
else return(0);
break;
case 5:
if (subframe==8)
return(1);
else return(0);
break;
case 6:
return(1);
break;
default:
return(0);
} }
} }
unsigned char subframe2_ul_harq(LTE_DL_FRAME_PARMS *frame_parms,unsigned char subframe) unsigned char subframe2_ul_harq(LTE_DL_FRAME_PARMS *frame_parms,unsigned char subframe) {
{
if (frame_parms->frame_type == FDD) if (frame_parms->frame_type == FDD)
return(subframe&7); return(subframe&7);
switch (frame_parms->tdd_config) { switch (frame_parms->tdd_config) {
case 3: case 3:
if ( (subframe == 8) || (subframe == 9) ) { if ( (subframe == 8) || (subframe == 9) ) {
return(subframe-8); return(subframe-8);
} else if (subframe==0) } else if (subframe==0)
return(2); return(2);
else { else {
LOG_E(PHY,"phich.c: subframe2_ul_harq, illegal subframe %d for tdd_config %d\n", LOG_E(PHY,"phich.c: subframe2_ul_harq, illegal subframe %d for tdd_config %d\n",
subframe,frame_parms->tdd_config); subframe,frame_parms->tdd_config);
return(0); return(0);
} }
break; break;
case 4: case 4:
if ( (subframe == 8) || (subframe == 9) ) { if ( (subframe == 8) || (subframe == 9) ) {
return(subframe-8); return(subframe-8);
} else { } else {
LOG_E(PHY,"phich.c: subframe2_ul_harq, illegal subframe %d for tdd_config %d\n", LOG_E(PHY,"phich.c: subframe2_ul_harq, illegal subframe %d for tdd_config %d\n",
subframe,frame_parms->tdd_config); subframe,frame_parms->tdd_config);
return(0); return(0);
} }
break;
break;
} }
return(0); return(0);
} }
int phich_frame2_pusch_frame(LTE_DL_FRAME_PARMS *frame_parms, int frame, int subframe) int phich_frame2_pusch_frame(LTE_DL_FRAME_PARMS *frame_parms, int frame, int subframe) {
{
int pusch_frame; int pusch_frame;
if (frame_parms->frame_type == FDD) { if (frame_parms->frame_type == FDD) {
@@ -145,127 +138,124 @@ int phich_frame2_pusch_frame(LTE_DL_FRAME_PARMS *frame_parms, int frame, int sub
return pusch_frame % 1024; return pusch_frame % 1024;
} }
uint8_t phich_subframe2_pusch_subframe(LTE_DL_FRAME_PARMS *frame_parms,uint8_t subframe) uint8_t phich_subframe2_pusch_subframe(LTE_DL_FRAME_PARMS *frame_parms,uint8_t subframe) {
{
uint8_t pusch_subframe = 255; uint8_t pusch_subframe = 255;
if (frame_parms->frame_type == FDD) if (frame_parms->frame_type == FDD)
return subframe < 4 ? subframe + 6 : subframe - 4; return subframe < 4 ? subframe + 6 : subframe - 4;
switch (frame_parms->tdd_config) { switch (frame_parms->tdd_config) {
case 0: case 0:
if (subframe == 0) if (subframe == 0)
pusch_subframe = (3); pusch_subframe = (3);
else if (subframe == 5) { else if (subframe == 5) {
pusch_subframe = (8); pusch_subframe = (8);
} else if (subframe == 6) } else if (subframe == 6)
pusch_subframe = (2); pusch_subframe = (2);
else if (subframe == 1) else if (subframe == 1)
pusch_subframe = (7); pusch_subframe = (7);
else { else {
AssertFatal(1==0,"phich.c: phich_subframe2_pusch_subframe, illegal subframe %d for tdd_config %d\n", AssertFatal(1==0,"phich.c: phich_subframe2_pusch_subframe, illegal subframe %d for tdd_config %d\n",
subframe,frame_parms->tdd_config); subframe,frame_parms->tdd_config);
pusch_subframe = (0);
}
break;
case 1:
if (subframe == 6)
pusch_subframe = (2);
else if (subframe == 9)
pusch_subframe = (3);
else if (subframe == 1)
pusch_subframe = (7);
else if (subframe == 4)
pusch_subframe = (8);
else {
AssertFatal(1==0,"phich.c: phich_subframe2_pusch_subframe, illegal subframe %d for tdd_config %d\n",
subframe,frame_parms->tdd_config);
pusch_subframe = (0);
}
break;
case 2:
if (subframe == 8)
pusch_subframe = (2);
else if (subframe == 3)
pusch_subframe = (7);
else {
AssertFatal(1==0,"phich.c: phich_subframe2_pusch_subframe, illegal subframe %d for tdd_config %d\n",
subframe,frame_parms->tdd_config);
pusch_subframe = (0);
}
break;
case 3:
if ( (subframe == 8) || (subframe == 9) ) {
pusch_subframe = (subframe-6);
} else if (subframe==0)
pusch_subframe = (4);
else {
AssertFatal(1==0,"phich.c: phich_subframe2_pusch_subframe, illegal subframe %d for tdd_config %d\n",
subframe,frame_parms->tdd_config);
pusch_subframe = (0);
}
break;
case 4:
if ( (subframe == 8) || (subframe == 9) ) {
pusch_subframe = (subframe-6);
} else {
AssertFatal(1==0,"phich.c: phich_subframe2_pusch_subframe, illegal subframe %d for tdd_config %d\n",
subframe,frame_parms->tdd_config);
pusch_subframe = (0);
}
break;
case 5:
if (subframe == 8) {
pusch_subframe = (2);
} else {
AssertFatal(1==0,"phich.c: phich_subframe2_pusch_subframe, illegal subframe %d for tdd_config %d\n",
subframe,frame_parms->tdd_config);
pusch_subframe = (0);
}
break;
case 6:
if (subframe == 6) {
pusch_subframe = (2);
} else if (subframe == 9) {
pusch_subframe = (3);
} else if (subframe == 0) {
pusch_subframe = (4);
} else if (subframe == 1) {
pusch_subframe = (7);
} else if (subframe == 5) {
pusch_subframe = (8);
} else {
AssertFatal(1==0,"phich.c: phich_subframe2_pusch_subframe, illegal subframe %d for tdd_config %d\n",
subframe,frame_parms->tdd_config);
pusch_subframe = (0);
}
break;
default:
AssertFatal(1==0, "no implementation for TDD UL/DL-config = %d!\n", frame_parms->tdd_config);
pusch_subframe = (0); pusch_subframe = (0);
}
break;
case 1:
if (subframe == 6)
pusch_subframe = (2);
else if (subframe == 9)
pusch_subframe = (3);
else if (subframe == 1)
pusch_subframe = (7);
else if (subframe == 4)
pusch_subframe = (8);
else {
AssertFatal(1==0,"phich.c: phich_subframe2_pusch_subframe, illegal subframe %d for tdd_config %d\n",
subframe,frame_parms->tdd_config);
pusch_subframe = (0);
}
break;
case 2:
if (subframe == 8)
pusch_subframe = (2);
else if (subframe == 3)
pusch_subframe = (7);
else {
AssertFatal(1==0,"phich.c: phich_subframe2_pusch_subframe, illegal subframe %d for tdd_config %d\n",
subframe,frame_parms->tdd_config);
pusch_subframe = (0);
}
break;
case 3:
if ( (subframe == 8) || (subframe == 9) ) {
pusch_subframe = (subframe-6);
} else if (subframe==0)
pusch_subframe = (4);
else {
AssertFatal(1==0,"phich.c: phich_subframe2_pusch_subframe, illegal subframe %d for tdd_config %d\n",
subframe,frame_parms->tdd_config);
pusch_subframe = (0);
}
break;
case 4:
if ( (subframe == 8) || (subframe == 9) ) {
pusch_subframe = (subframe-6);
} else {
AssertFatal(1==0,"phich.c: phich_subframe2_pusch_subframe, illegal subframe %d for tdd_config %d\n",
subframe,frame_parms->tdd_config);
pusch_subframe = (0);
}
break;
case 5:
if (subframe == 8) {
pusch_subframe = (2);
} else {
AssertFatal(1==0,"phich.c: phich_subframe2_pusch_subframe, illegal subframe %d for tdd_config %d\n",
subframe,frame_parms->tdd_config);
pusch_subframe = (0);
}
break;
case 6:
if (subframe == 6) {
pusch_subframe = (2);
} else if (subframe == 9) {
pusch_subframe = (3);
} else if (subframe == 0) {
pusch_subframe = (4);
} else if (subframe == 1) {
pusch_subframe = (7);
} else if (subframe == 5) {
pusch_subframe = (8);
} else {
AssertFatal(1==0,"phich.c: phich_subframe2_pusch_subframe, illegal subframe %d for tdd_config %d\n",
subframe,frame_parms->tdd_config);
pusch_subframe = (0);
}
break;
default:
AssertFatal(1==0, "no implementation for TDD UL/DL-config = %d!\n", frame_parms->tdd_config);
pusch_subframe = (0);
} }
LOG_D(PHY, "subframe %d: PUSCH subframe = %d\n", subframe, pusch_subframe); LOG_D(PHY, "subframe %d: PUSCH subframe = %d\n", subframe, pusch_subframe);
return pusch_subframe; return pusch_subframe;
} }
int check_pcfich(LTE_DL_FRAME_PARMS *frame_parms,uint16_t reg) int check_pcfich(LTE_DL_FRAME_PARMS *frame_parms,uint16_t reg) {
{
if ((reg == frame_parms->pcfich_reg[0]) || if ((reg == frame_parms->pcfich_reg[0]) ||
(reg == frame_parms->pcfich_reg[1]) || (reg == frame_parms->pcfich_reg[1]) ||
(reg == frame_parms->pcfich_reg[2]) || (reg == frame_parms->pcfich_reg[2]) ||
@@ -275,9 +265,7 @@ int check_pcfich(LTE_DL_FRAME_PARMS *frame_parms,uint16_t reg)
return(0); return(0);
} }
void generate_phich_reg_mapping(LTE_DL_FRAME_PARMS *frame_parms) void generate_phich_reg_mapping(LTE_DL_FRAME_PARMS *frame_parms) {
{
unsigned short n0 = (frame_parms->N_RB_DL * 2) - 4; // 2 REG per RB less the 4 used by PCFICH in first symbol unsigned short n0 = (frame_parms->N_RB_DL * 2) - 4; // 2 REG per RB less the 4 used by PCFICH in first symbol
unsigned short n1 = (frame_parms->N_RB_DL * 3); // 3 REG per RB in second and third symbol unsigned short n1 = (frame_parms->N_RB_DL * 3); // 3 REG per RB in second and third symbol
unsigned short n2 = n1; unsigned short n2 = n1;
@@ -285,11 +273,9 @@ void generate_phich_reg_mapping(LTE_DL_FRAME_PARMS *frame_parms)
unsigned short Ngroup_PHICH; unsigned short Ngroup_PHICH;
// uint16_t *phich_reg = frame_parms->phich_reg; // uint16_t *phich_reg = frame_parms->phich_reg;
uint16_t *pcfich_reg = frame_parms->pcfich_reg; uint16_t *pcfich_reg = frame_parms->pcfich_reg;
// compute Ngroup_PHICH (see formula at beginning of Section 6.9 in 36-211 // compute Ngroup_PHICH (see formula at beginning of Section 6.9 in 36-211
Ngroup_PHICH = (frame_parms->phich_config_common.phich_resource*frame_parms->N_RB_DL)/48; Ngroup_PHICH = (frame_parms->phich_config_common.phich_resource*frame_parms->N_RB_DL)/48;
if (((frame_parms->phich_config_common.phich_resource*frame_parms->N_RB_DL)%48) > 0) if (((frame_parms->phich_config_common.phich_resource*frame_parms->N_RB_DL)%48) > 0)
Ngroup_PHICH++; Ngroup_PHICH++;
@@ -299,25 +285,24 @@ void generate_phich_reg_mapping(LTE_DL_FRAME_PARMS *frame_parms)
} }
#ifdef DEBUG_PHICH #ifdef DEBUG_PHICH
LOG_D(PHY,"Ngroup_PHICH %d (phich_config_common.phich_resource %d,phich_config_common.phich_duration %s, NidCell %d,Ncp %d, frame_type %d), smallest pcfich REG %d, n0 %d, n1 %d (first PHICH REG %d)\n", LOG_D(PHY,
((frame_parms->Ncp == NORMAL)?Ngroup_PHICH:(Ngroup_PHICH>>1)), "Ngroup_PHICH %d (phich_config_common.phich_resource %d,phich_config_common.phich_duration %s, NidCell %d,Ncp %d, frame_type %d), smallest pcfich REG %d, n0 %d, n1 %d (first PHICH REG %d)\n",
frame_parms->phich_config_common.phich_resource, ((frame_parms->Ncp == NORMAL)?Ngroup_PHICH:(Ngroup_PHICH>>1)),
frame_parms->phich_config_common.phich_duration==normal?"normal":"extended", frame_parms->phich_config_common.phich_resource,
frame_parms->Nid_cell,frame_parms->Ncp,frame_parms->frame_type, frame_parms->phich_config_common.phich_duration==normal?"normal":"extended",
pcfich_reg[frame_parms->pcfich_first_reg_idx], frame_parms->Nid_cell,frame_parms->Ncp,frame_parms->frame_type,
n0, pcfich_reg[frame_parms->pcfich_first_reg_idx],
n1, n0,
((frame_parms->Nid_cell))%n0); n1,
((frame_parms->Nid_cell))%n0);
#endif #endif
// This is the algorithm from Section 6.9.3 in 36-211, it works only for normal PHICH duration for now ... // This is the algorithm from Section 6.9.3 in 36-211, it works only for normal PHICH duration for now ...
for (mprime=0; for (mprime=0;
mprime<((frame_parms->Ncp == NORMAL)?Ngroup_PHICH:(Ngroup_PHICH>>1)); mprime<((frame_parms->Ncp == NORMAL)?Ngroup_PHICH:(Ngroup_PHICH>>1));
mprime++) { mprime++) {
if (frame_parms->phich_config_common.phich_duration==normal) { // normal PHICH duration if (frame_parms->phich_config_common.phich_duration==normal) { // normal PHICH duration
frame_parms->phich_reg[mprime][0] = (frame_parms->Nid_cell + mprime)%n0; frame_parms->phich_reg[mprime][0] = (frame_parms->Nid_cell + mprime)%n0;
if (frame_parms->phich_reg[mprime][0]>=pcfich_reg[frame_parms->pcfich_first_reg_idx]) if (frame_parms->phich_reg[mprime][0]>=pcfich_reg[frame_parms->pcfich_first_reg_idx])
@@ -334,10 +319,9 @@ void generate_phich_reg_mapping(LTE_DL_FRAME_PARMS *frame_parms)
frame_parms->phich_reg[mprime][1] = (frame_parms->Nid_cell + mprime + (n0/3))%n0; frame_parms->phich_reg[mprime][1] = (frame_parms->Nid_cell + mprime + (n0/3))%n0;
if (frame_parms->phich_reg[mprime][1]>=pcfich_reg[frame_parms->pcfich_first_reg_idx]) if (frame_parms->phich_reg[mprime][1]>=pcfich_reg[frame_parms->pcfich_first_reg_idx])
frame_parms->phich_reg[mprime][1]++; frame_parms->phich_reg[mprime][1]++;
if (frame_parms->phich_reg[mprime][1]>=pcfich_reg[(frame_parms->pcfich_first_reg_idx+1)&3]) if (frame_parms->phich_reg[mprime][1]>=pcfich_reg[(frame_parms->pcfich_first_reg_idx+1)&3])
frame_parms->phich_reg[mprime][1]++; frame_parms->phich_reg[mprime][1]++;
@@ -346,10 +330,9 @@ void generate_phich_reg_mapping(LTE_DL_FRAME_PARMS *frame_parms)
if (frame_parms->phich_reg[mprime][1]>=pcfich_reg[(frame_parms->pcfich_first_reg_idx+3)&3]) if (frame_parms->phich_reg[mprime][1]>=pcfich_reg[(frame_parms->pcfich_first_reg_idx+3)&3])
frame_parms->phich_reg[mprime][1]++; frame_parms->phich_reg[mprime][1]++;
frame_parms->phich_reg[mprime][2] = (frame_parms->Nid_cell + mprime + (2*n0/3))%n0; frame_parms->phich_reg[mprime][2] = (frame_parms->Nid_cell + mprime + (2*n0/3))%n0;
if (frame_parms->phich_reg[mprime][2]>=pcfich_reg[frame_parms->pcfich_first_reg_idx]) if (frame_parms->phich_reg[mprime][2]>=pcfich_reg[frame_parms->pcfich_first_reg_idx])
frame_parms->phich_reg[mprime][2]++; frame_parms->phich_reg[mprime][2]++;
@@ -361,21 +344,19 @@ void generate_phich_reg_mapping(LTE_DL_FRAME_PARMS *frame_parms)
if (frame_parms->phich_reg[mprime][2]>=pcfich_reg[(frame_parms->pcfich_first_reg_idx+3)&3]) if (frame_parms->phich_reg[mprime][2]>=pcfich_reg[(frame_parms->pcfich_first_reg_idx+3)&3])
frame_parms->phich_reg[mprime][2]++; frame_parms->phich_reg[mprime][2]++;
#ifdef DEBUG_PHICH #ifdef DEBUG_PHICH
printf("phich_reg :%d => %d,%d,%d\n",mprime,frame_parms->phich_reg[mprime][0],frame_parms->phich_reg[mprime][1],frame_parms->phich_reg[mprime][2]); printf("phich_reg :%d => %d,%d,%d\n",mprime,frame_parms->phich_reg[mprime][0],frame_parms->phich_reg[mprime][1],frame_parms->phich_reg[mprime][2]);
#endif #endif
} else { // extended PHICH duration } else { // extended PHICH duration
frame_parms->phich_reg[mprime<<1][0] = (frame_parms->Nid_cell + mprime)%n0; frame_parms->phich_reg[mprime<<1][0] = (frame_parms->Nid_cell + mprime)%n0;
frame_parms->phich_reg[1+(mprime<<1)][0] = (frame_parms->Nid_cell + mprime)%n0; frame_parms->phich_reg[1+(mprime<<1)][0] = (frame_parms->Nid_cell + mprime)%n0;
frame_parms->phich_reg[mprime<<1][1] = ((frame_parms->Nid_cell*n1/n0) + mprime + (n1/3))%n1; frame_parms->phich_reg[mprime<<1][1] = ((frame_parms->Nid_cell*n1/n0) + mprime + (n1/3))%n1;
frame_parms->phich_reg[mprime<<1][2] = ((frame_parms->Nid_cell*n2/n0) + mprime + (2*n2/3))%n2; frame_parms->phich_reg[mprime<<1][2] = ((frame_parms->Nid_cell*n2/n0) + mprime + (2*n2/3))%n2;
frame_parms->phich_reg[1+(mprime<<1)][1] = ((frame_parms->Nid_cell*n1/n0) + mprime + (n1/3))%n1; frame_parms->phich_reg[1+(mprime<<1)][1] = ((frame_parms->Nid_cell*n1/n0) + mprime + (n1/3))%n1;
frame_parms->phich_reg[1+(mprime<<1)][2] = ((frame_parms->Nid_cell*n2/n0) + mprime + (2*n2/3))%n2; frame_parms->phich_reg[1+(mprime<<1)][2] = ((frame_parms->Nid_cell*n2/n0) + mprime + (2*n2/3))%n2;
//#ifdef DEBUG_PHICH //#ifdef DEBUG_PHICH
printf("phich_reg :%d => %d,%d,%d\n",mprime<<1,frame_parms->phich_reg[mprime<<1][0],frame_parms->phich_reg[mprime][1],frame_parms->phich_reg[mprime][2]); printf("phich_reg :%u => %d,%d,%d\n",mprime<<1,frame_parms->phich_reg[mprime<<1][0],frame_parms->phich_reg[mprime][1],frame_parms->phich_reg[mprime][2]);
printf("phich_reg :%d => %d,%d,%d\n",1+(mprime<<1),frame_parms->phich_reg[1+(mprime<<1)][0],frame_parms->phich_reg[1+(mprime<<1)][1],frame_parms->phich_reg[1+(mprime<<1)][2]); printf("phich_reg :%d => %d,%d,%d\n",1+(mprime<<1),frame_parms->phich_reg[1+(mprime<<1)][0],frame_parms->phich_reg[1+(mprime<<1)][1],frame_parms->phich_reg[1+(mprime<<1)][2]);
//#endif //#endif
} }
+48 -46
View File
@@ -56,7 +56,7 @@ void rx_prach0(PHY_VARS_eNB *eNB,
#endif #endif
) { ) {
int i; int i;
LTE_DL_FRAME_PARMS *fp; LTE_DL_FRAME_PARMS *fp=NULL;
lte_frame_type_t frame_type; lte_frame_type_t frame_type;
uint16_t rootSequenceIndex; uint16_t rootSequenceIndex;
uint8_t prach_ConfigIndex; uint8_t prach_ConfigIndex;
@@ -66,7 +66,7 @@ void rx_prach0(PHY_VARS_eNB *eNB,
int subframe; int subframe;
int16_t *prachF=NULL; int16_t *prachF=NULL;
int16_t **rxsigF=NULL; int16_t **rxsigF=NULL;
int nb_rx; int nb_rx=0;
int16_t *prach2; int16_t *prach2;
uint8_t preamble_index; uint8_t preamble_index;
uint16_t NCS,NCS2; uint16_t NCS,NCS2;
@@ -96,13 +96,17 @@ void rx_prach0(PHY_VARS_eNB *eNB,
int prach_ifft_cnt=0; int prach_ifft_cnt=0;
#endif #endif
if (ru) {
fp = &ru->frame_parms; if(eNB) {
nb_rx = ru->nb_rx; fp = &(eNB->frame_parms);
} else if (eNB) {
fp = &eNB->frame_parms;
nb_rx = fp->nb_antennas_rx; nb_rx = fp->nb_antennas_rx;
} else AssertFatal(1==0,"rx_prach called without valid RU or eNB descriptor\n"); } else {
fp = &(ru->frame_parms);
nb_rx = ru->nb_rx;
}
AssertFatal(fp!=NULL,"rx_prach called without valid RU or eNB descriptor\n");
frame_type = fp->frame_type;
frame_type = fp->frame_type; frame_type = fp->frame_type;
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0)) #if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
@@ -148,29 +152,26 @@ void rx_prach0(PHY_VARS_eNB *eNB,
prachF = eNB->prach_vars_br.prachF; prachF = eNB->prach_vars_br.prachF;
rxsigF = eNB->prach_vars_br.rxsigF[ce_level]; rxsigF = eNB->prach_vars_br.rxsigF[ce_level];
if (LOG_DEBUGFLAG(PRACH)) { if (LOG_DEBUGFLAG(PRACH)){
if (((ru->proc.frame_prach)&1023) < 20) LOG_I(PHY, if (((eNB->proc.frame_prach)&1023) < 20) LOG_I(PHY,"PRACH (eNB) : running rx_prach (br_flag %d, ce_level %d) for frame %d subframe %d, prach_FreqOffset %d, prach_ConfigIndex %d, rootSequenceIndex %d, repetition number %d,numRepetitionsPrePreambleAttempt %d\n",
"PRACH (eNB) : running rx_prach (br_flag %d, ce_level %d) for frame %d subframe %d, prach_FreqOffset %d, prach_ConfigIndex %d, rootSequenceIndex %d, repetition number %d,numRepetitionsPrePreambleAttempt %d\n", br_flag,ce_level,eNB->proc.frame_prach,subframe,
br_flag,ce_level,ru->proc.frame_prach,subframe, fp->prach_emtc_config_common.prach_ConfigInfo.prach_FreqOffset[ce_level],
fp->prach_emtc_config_common.prach_ConfigInfo.prach_FreqOffset[ce_level], prach_ConfigIndex,rootSequenceIndex,
prach_ConfigIndex,rootSequenceIndex, eNB->prach_vars_br.repetition_number[ce_level],
eNB->prach_vars_br.repetition_number[ce_level], fp->prach_emtc_config_common.prach_ConfigInfo.prach_numRepetitionPerPreambleAttempt[ce_level]);
fp->prach_emtc_config_common.prach_ConfigInfo.prach_numRepetitionPerPreambleAttempt[ce_level]);
} }
} else } else
#endif #endif
{ {
prach_ifftp = eNB->prach_vars.prach_ifft[0]; prach_ifftp = eNB->prach_vars.prach_ifft[0];
subframe = eNB->proc.subframe_prach; subframe = eNB->proc.subframe_prach;
prachF = eNB->prach_vars.prachF; prachF = eNB->prach_vars.prachF;
rxsigF = eNB->prach_vars.rxsigF[0]; rxsigF = eNB->prach_vars.rxsigF[0];
if (LOG_DEBUGFLAG(PRACH)){
if (LOG_DEBUGFLAG(PRACH)) { if (((eNB->proc.frame_prach)&1023) < 20) LOG_I(PHY,"PRACH (eNB) : running rx_prach for subframe %d, prach_FreqOffset %d, prach_ConfigIndex %d , rootSequenceIndex %d\n", subframe,fp->prach_config_common.prach_ConfigInfo.prach_FreqOffset,prach_ConfigIndex,rootSequenceIndex);
if (((ru->proc.frame_prach)&1023) < 20) LOG_I(PHY,"PRACH (eNB) : running rx_prach for subframe %d, prach_FreqOffset %d, prach_ConfigIndex %d , rootSequenceIndex %d\n", subframe, }
fp->prach_config_common.prach_ConfigInfo.prach_FreqOffset,prach_ConfigIndex,rootSequenceIndex);
} }
} } else {
} else {
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0)) #if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
if (br_flag == 1) { if (br_flag == 1) {
@@ -421,7 +422,7 @@ void rx_prach0(PHY_VARS_eNB *eNB,
} }
} }
if ((eNB==NULL) && ru->function == NGFI_RRU_IF4p5) { if ((eNB==NULL) && ru->function == NGFI_RRU_IF4p5) {
/// **** send_IF4 of rxsigF to RAU **** /// /// **** send_IF4 of rxsigF to RAU **** ///
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0)) #if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
if (br_flag == 1) send_IF4p5(ru, ru->proc.frame_prach, ru->proc.subframe_prach, IF4p5_PRACH+1+ce_level); if (br_flag == 1) send_IF4p5(ru, ru->proc.frame_prach, ru->proc.subframe_prach, IF4p5_PRACH+1+ce_level);
@@ -445,26 +446,27 @@ void rx_prach0(PHY_VARS_eNB *eNB,
uint8_t update_TA2 = 1; uint8_t update_TA2 = 1;
switch (eNB->frame_parms.N_RB_DL) { switch (eNB->frame_parms.N_RB_DL) {
case 6:
update_TA = 16;
break;
case 25: case 6:
update_TA = 4; update_TA = 16;
break; break;
case 25:
update_TA = 4;
break;
case 50:
update_TA = 2;
break;
case 75:
update_TA = 3;
update_TA2 = 2;
break;
case 100:
update_TA = 1;
break;
case 50:
update_TA = 2;
break;
case 75:
update_TA = 3;
update_TA2 = 2;
break;
case 100:
update_TA = 1;
break;
} }
*max_preamble_energy=0; *max_preamble_energy=0;
+5 -6
View File
@@ -565,17 +565,16 @@ int is_prach_subframe0(LTE_DL_FRAME_PARMS *frame_parms,uint8_t prach_ConfigIndex
return(prach_mask); return(prach_mask);
} }
int is_prach_subframe(LTE_DL_FRAME_PARMS *frame_parms,uint32_t frame, uint8_t subframe) { int is_prach_subframe(LTE_DL_FRAME_PARMS *frame_parms, uint32_t frame, uint8_t subframe) {
uint8_t prach_ConfigIndex = frame_parms->prach_config_common.prach_ConfigInfo.prach_ConfigIndex; uint8_t prach_ConfigIndex = frame_parms->prach_config_common.prach_ConfigInfo.prach_ConfigIndex;
int prach_mask = is_prach_subframe0(frame_parms,prach_ConfigIndex,frame,subframe); int prach_mask = is_prach_subframe0(frame_parms, prach_ConfigIndex, frame, subframe);
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0)) #if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
int i; for (int i=0; i<4; i++) {
for (i=0;i<4;i++) {
if (frame_parms->prach_emtc_config_common.prach_ConfigInfo.prach_CElevel_enable[i] == 1) if (frame_parms->prach_emtc_config_common.prach_ConfigInfo.prach_CElevel_enable[i] == 1)
prach_mask|=(is_prach_subframe0(frame_parms,frame_parms->prach_emtc_config_common.prach_ConfigInfo.prach_ConfigIndex[i],frame,subframe)<<(i+1)); prach_mask |= (is_prach_subframe0(frame_parms, frame_parms->prach_emtc_config_common.prach_ConfigInfo.prach_ConfigIndex[i],
frame, subframe) << (i+1));
} }
#endif #endif
return(prach_mask); return(prach_mask);
File diff suppressed because it is too large Load Diff
@@ -687,7 +687,7 @@ void ulsch_detection_mrc(LTE_DL_FRAME_PARMS *frame_parms,
ul_ch_mag128_0[i] = _mm_adds_epi16(_mm_srai_epi16(ul_ch_mag128_0[i],1),_mm_srai_epi16(ul_ch_mag128_1[i],1)); ul_ch_mag128_0[i] = _mm_adds_epi16(_mm_srai_epi16(ul_ch_mag128_0[i],1),_mm_srai_epi16(ul_ch_mag128_1[i],1));
ul_ch_mag128_0b[i] = _mm_adds_epi16(_mm_srai_epi16(ul_ch_mag128_0b[i],1),_mm_srai_epi16(ul_ch_mag128_1b[i],1)); ul_ch_mag128_0b[i] = _mm_adds_epi16(_mm_srai_epi16(ul_ch_mag128_0b[i],1),_mm_srai_epi16(ul_ch_mag128_1b[i],1));
rxdataF_comp128_0[i] = _mm_add_epi16(rxdataF_comp128_0[i],(*(__m128i*)&jitterc[0])); rxdataF_comp128_0[i] = _mm_add_epi16(rxdataF_comp128_0[i],(*(__m128i*)&jitterc[0]));
}
#elif defined(__arm__) #elif defined(__arm__)
rxdataF_comp128_0 = (int16x8_t *)&rxdataF_comp[0][symbol*frame_parms->N_RB_DL*12]; rxdataF_comp128_0 = (int16x8_t *)&rxdataF_comp[0][symbol*frame_parms->N_RB_DL*12];
rxdataF_comp128_1 = (int16x8_t *)&rxdataF_comp[1][symbol*frame_parms->N_RB_DL*12]; rxdataF_comp128_1 = (int16x8_t *)&rxdataF_comp[1][symbol*frame_parms->N_RB_DL*12];
@@ -702,10 +702,10 @@ void ulsch_detection_mrc(LTE_DL_FRAME_PARMS *frame_parms,
ul_ch_mag128_0[i] = vhaddq_s16(ul_ch_mag128_0[i],ul_ch_mag128_1[i]); ul_ch_mag128_0[i] = vhaddq_s16(ul_ch_mag128_0[i],ul_ch_mag128_1[i]);
ul_ch_mag128_0b[i] = vhaddq_s16(ul_ch_mag128_0b[i],ul_ch_mag128_1b[i]); ul_ch_mag128_0b[i] = vhaddq_s16(ul_ch_mag128_0b[i],ul_ch_mag128_1b[i]);
rxdataF_comp128_0[i] = vqaddq_s16(rxdataF_comp128_0[i],(*(int16x8_t*)&jitterc[0])); rxdataF_comp128_0[i] = vqaddq_s16(rxdataF_comp128_0[i],(*(int16x8_t*)&jitterc[0]));
}
#endif #endif
}
} }
#if defined(__x86_64__) || defined(__i386__) #if defined(__x86_64__) || defined(__i386__)
+15 -2
View File
@@ -362,6 +362,10 @@ void pdcch_channel_level(int32_t **dl_ch_estimates_ext,
#elif defined(__arm__) #elif defined(__arm__)
int16x8_t *dl_ch128; int16x8_t *dl_ch128;
int32x4_t *avg128P; int32x4_t *avg128P;
#else
int16_t *dl_ch128;
int32_t *avg128P;
#error Unsupported CPU architecture, cannot build __FILE__
#endif #endif
for (aatx=0; aatx<frame_parms->nb_antenna_ports_eNB; aatx++) for (aatx=0; aatx<frame_parms->nb_antenna_ports_eNB; aatx++)
for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) { for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
@@ -370,7 +374,11 @@ void pdcch_channel_level(int32_t **dl_ch_estimates_ext,
avg128P = _mm_setzero_si128(); avg128P = _mm_setzero_si128();
dl_ch128=(__m128i *)&dl_ch_estimates_ext[(aatx<<1)+aarx][0]; dl_ch128=(__m128i *)&dl_ch_estimates_ext[(aatx<<1)+aarx][0];
#elif defined(__arm__) #elif defined(__arm__)
dl_ch128=&dl_ch_estimates_ext[(aatx<<1)+aarx][0];
#error __arm__ not yet implemented, cannot build __FILE__
#else
dl_ch128=&dl_ch_estimates_ext[(aatx<<1)+aarx][0];
#error Unsupported CPU architecture, cannot build __FILE__
#endif #endif
for (rb=0; rb<nb_rb; rb++) { for (rb=0; rb<nb_rb; rb++) {
@@ -379,7 +387,8 @@ void pdcch_channel_level(int32_t **dl_ch_estimates_ext,
avg128P = _mm_add_epi32(avg128P,_mm_madd_epi16(dl_ch128[1],dl_ch128[1])); avg128P = _mm_add_epi32(avg128P,_mm_madd_epi16(dl_ch128[1],dl_ch128[1]));
avg128P = _mm_add_epi32(avg128P,_mm_madd_epi16(dl_ch128[2],dl_ch128[2])); avg128P = _mm_add_epi32(avg128P,_mm_madd_epi16(dl_ch128[2],dl_ch128[2]));
#elif defined(__arm__) #elif defined(__arm__)
#else
#error Unsupported CPU architecture, cannot build __FILE__
#endif #endif
dl_ch128+=3; dl_ch128+=3;
/* /*
@@ -423,6 +432,8 @@ void pdcch_detection_mrc_i(LTE_DL_FRAME_PARMS *frame_parms,
__m128i *rxdataF_comp128_0,*rxdataF_comp128_1,*rxdataF_comp128_i0,*rxdataF_comp128_i1,*rho128_0,*rho128_1,*rho128_i0,*rho128_i1; __m128i *rxdataF_comp128_0,*rxdataF_comp128_1,*rxdataF_comp128_i0,*rxdataF_comp128_i1,*rho128_0,*rho128_1,*rho128_i0,*rho128_i1;
#elif defined(__arm__) #elif defined(__arm__)
int16x8_t *rxdataF_comp128_0,*rxdataF_comp128_1,*rxdataF_comp128_i0,*rxdataF_comp128_i1,*rho128_0,*rho128_1,*rho128_i0,*rho128_i1; int16x8_t *rxdataF_comp128_0,*rxdataF_comp128_1,*rxdataF_comp128_i0,*rxdataF_comp128_i1,*rho128_0,*rho128_1,*rho128_i0,*rho128_i1;
#else
#error Unsupported CPU architecture, cannot build __FILE__
#endif #endif
int32_t i; int32_t i;
@@ -436,6 +447,8 @@ void pdcch_detection_mrc_i(LTE_DL_FRAME_PARMS *frame_parms,
#elif defined(__arm__) #elif defined(__arm__)
rxdataF_comp128_0 = (int16x8_t *)&rxdataF_comp[(aatx<<1)][symbol*frame_parms->N_RB_DL*12]; rxdataF_comp128_0 = (int16x8_t *)&rxdataF_comp[(aatx<<1)][symbol*frame_parms->N_RB_DL*12];
rxdataF_comp128_1 = (int16x8_t *)&rxdataF_comp[(aatx<<1)+1][symbol*frame_parms->N_RB_DL*12]; rxdataF_comp128_1 = (int16x8_t *)&rxdataF_comp[(aatx<<1)+1][symbol*frame_parms->N_RB_DL*12];
#else
#error Unsupported CPU architecture, cannot build __FILE__
#endif #endif
// MRC on each re of rb on MF output // MRC on each re of rb on MF output
for (i=0; i<frame_parms->N_RB_DL*3; i++) { for (i=0; i<frame_parms->N_RB_DL*3; i++) {
+191 -244
View File
@@ -40,9 +40,7 @@
//#define DEBUG_DLSCH_DECODING //#define DEBUG_DLSCH_DECODING
//#define UE_DEBUG_TRACE 1 //#define UE_DEBUG_TRACE 1
void free_ue_dlsch(LTE_UE_DLSCH_t *dlsch) void free_ue_dlsch(LTE_UE_DLSCH_t *dlsch) {
{
int i,r; int i,r;
if (dlsch) { if (dlsch) {
@@ -70,34 +68,30 @@ void free_ue_dlsch(LTE_UE_DLSCH_t *dlsch)
} }
free16(dlsch,sizeof(LTE_UE_DLSCH_t)); free16(dlsch,sizeof(LTE_UE_DLSCH_t));
dlsch = NULL;
} }
} }
LTE_UE_DLSCH_t *new_ue_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint32_t Nsoft,uint8_t max_turbo_iterations,uint8_t N_RB_DL, uint8_t abstraction_flag) LTE_UE_DLSCH_t *new_ue_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint32_t Nsoft,uint8_t max_turbo_iterations,uint8_t N_RB_DL, uint8_t abstraction_flag) {
{
LTE_UE_DLSCH_t *dlsch; LTE_UE_DLSCH_t *dlsch;
uint8_t exit_flag = 0,i,r; uint8_t exit_flag = 0,i,r;
unsigned char bw_scaling =1; unsigned char bw_scaling =1;
switch (N_RB_DL) { switch (N_RB_DL) {
case 6: case 6:
bw_scaling =16; bw_scaling =16;
break; break;
case 25: case 25:
bw_scaling =4; bw_scaling =4;
break; break;
case 50: case 50:
bw_scaling =2; bw_scaling =2;
break; break;
default: default:
bw_scaling =1; bw_scaling =1;
break; break;
} }
dlsch = (LTE_UE_DLSCH_t *)malloc16(sizeof(LTE_UE_DLSCH_t)); dlsch = (LTE_UE_DLSCH_t *)malloc16(sizeof(LTE_UE_DLSCH_t));
@@ -116,7 +110,7 @@ LTE_UE_DLSCH_t *new_ue_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint32_t Nsoft,uint8_
if (dlsch->harq_processes[i]) { if (dlsch->harq_processes[i]) {
memset(dlsch->harq_processes[i],0,sizeof(LTE_DL_UE_HARQ_t)); memset(dlsch->harq_processes[i],0,sizeof(LTE_DL_UE_HARQ_t));
dlsch->harq_processes[i]->first_tx=1; dlsch->harq_processes[i]->first_tx=1;
dlsch->harq_processes[i]->b = (uint8_t*)malloc16(MAX_DLSCH_PAYLOAD_BYTES/bw_scaling); dlsch->harq_processes[i]->b = (uint8_t *)malloc16(MAX_DLSCH_PAYLOAD_BYTES/bw_scaling);
if (dlsch->harq_processes[i]->b) if (dlsch->harq_processes[i]->b)
memset(dlsch->harq_processes[i]->b,0,MAX_DLSCH_PAYLOAD_BYTES/bw_scaling); memset(dlsch->harq_processes[i]->b,0,MAX_DLSCH_PAYLOAD_BYTES/bw_scaling);
@@ -125,14 +119,14 @@ LTE_UE_DLSCH_t *new_ue_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint32_t Nsoft,uint8_
if (abstraction_flag == 0) { if (abstraction_flag == 0) {
for (r=0; r<MAX_NUM_DLSCH_SEGMENTS/bw_scaling; r++) { for (r=0; r<MAX_NUM_DLSCH_SEGMENTS/bw_scaling; r++) {
dlsch->harq_processes[i]->c[r] = (uint8_t*)malloc16(((r==0)?8:0) + 3+ 768); dlsch->harq_processes[i]->c[r] = (uint8_t *)malloc16(((r==0)?8:0) + 3+ 768);
if (dlsch->harq_processes[i]->c[r]) if (dlsch->harq_processes[i]->c[r])
memset(dlsch->harq_processes[i]->c[r],0,((r==0)?8:0) + 3+ 768); memset(dlsch->harq_processes[i]->c[r],0,((r==0)?8:0) + 3+ 768);
else else
exit_flag=2; exit_flag=2;
dlsch->harq_processes[i]->d[r] = (short*)malloc16(((3*8*6144)+12+96)*sizeof(short)); dlsch->harq_processes[i]->d[r] = (short *)malloc16(((3*8*6144)+12+96)*sizeof(short));
if (dlsch->harq_processes[i]->d[r]) if (dlsch->harq_processes[i]->d[r])
memset(dlsch->harq_processes[i]->d[r],0,((3*8*6144)+12+96)*sizeof(short)); memset(dlsch->harq_processes[i]->d[r],0,((3*8*6144)+12+96)*sizeof(short));
@@ -151,7 +145,6 @@ LTE_UE_DLSCH_t *new_ue_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint32_t Nsoft,uint8_
printf("new_ue_dlsch with size %zu: exit_flag = %u\n",sizeof(LTE_DL_UE_HARQ_t), exit_flag); printf("new_ue_dlsch with size %zu: exit_flag = %u\n",sizeof(LTE_DL_UE_HARQ_t), exit_flag);
free_ue_dlsch(dlsch); free_ue_dlsch(dlsch);
return(NULL); return(NULL);
} }
@@ -164,9 +157,7 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
uint8_t subframe, uint8_t subframe,
uint8_t harq_pid, uint8_t harq_pid,
uint8_t is_crnti, uint8_t is_crnti,
uint8_t llr8_flag) uint8_t llr8_flag) {
{
#if UE_TIMING_TRACE #if UE_TIMING_TRACE
time_stats_t *dlsch_rate_unmatching_stats=&phy_vars_ue->dlsch_rate_unmatching_stats; time_stats_t *dlsch_rate_unmatching_stats=&phy_vars_ue->dlsch_rate_unmatching_stats;
time_stats_t *dlsch_turbo_decoding_stats=&phy_vars_ue->dlsch_turbo_decoding_stats; time_stats_t *dlsch_turbo_decoding_stats=&phy_vars_ue->dlsch_turbo_decoding_stats;
@@ -186,26 +177,24 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
#if 0 #if 0
int Kr_last,skipped_last=0; int Kr_last,skipped_last=0;
uint8_t (*tc_2cw)(int16_t *y, uint8_t (*tc_2cw)(int16_t *y,
int16_t *y2, int16_t *y2,
uint8_t *, uint8_t *,
uint8_t *, uint8_t *,
uint16_t, uint16_t,
uint16_t, uint16_t,
uint16_t, uint16_t,
uint8_t, uint8_t,
uint8_t, uint8_t,
uint8_t, uint8_t,
time_stats_t *, time_stats_t *,
time_stats_t *, time_stats_t *,
time_stats_t *, time_stats_t *,
time_stats_t *, time_stats_t *,
time_stats_t *, time_stats_t *,
time_stats_t *, time_stats_t *,
time_stats_t *); time_stats_t *);
#endif #endif
decoder_if_t *tc; decoder_if_t *tc;
if (!dlsch_llr) { if (!dlsch_llr) {
printf("dlsch_decoding.c: NULL dlsch_llr pointer\n"); printf("dlsch_decoding.c: NULL dlsch_llr pointer\n");
@@ -229,42 +218,32 @@ decoder_if_t *tc;
if (dlsch->harq_ack[subframe].ack != 2) { if (dlsch->harq_ack[subframe].ack != 2) {
LOG_D(PHY, "[UE %d] DLSCH @ SF%d : ACK bit is %d instead of DTX even before PDSCH is decoded!\n", LOG_D(PHY, "[UE %d] DLSCH @ SF%d : ACK bit is %d instead of DTX even before PDSCH is decoded!\n",
phy_vars_ue->Mod_id, subframe, dlsch->harq_ack[subframe].ack); phy_vars_ue->Mod_id, subframe, dlsch->harq_ack[subframe].ack);
} }
if (llr8_flag == 0) { if (llr8_flag == 0) {
tc = decoder16; tc = decoder16;
} } else {
else
{
AssertFatal (harq_process->TBS >= 256 , "Mismatch flag nbRB=%d TBS=%d mcs=%d Qm=%d RIV=%d round=%d \n", AssertFatal (harq_process->TBS >= 256 , "Mismatch flag nbRB=%d TBS=%d mcs=%d Qm=%d RIV=%d round=%d \n",
harq_process->nb_rb, harq_process->TBS,harq_process->mcs,harq_process->Qm,harq_process->rvidx,harq_process->round); harq_process->nb_rb, harq_process->TBS,harq_process->mcs,harq_process->Qm,harq_process->rvidx,harq_process->round);
tc = decoder8; tc = decoder8;
} }
// nb_rb = dlsch->nb_rb; // nb_rb = dlsch->nb_rb;
/* /*
if (nb_rb > frame_parms->N_RB_DL) { if (nb_rb > frame_parms->N_RB_DL) {
printf("dlsch_decoding.c: Illegal nb_rb %d\n",nb_rb); printf("dlsch_decoding.c: Illegal nb_rb %d\n",nb_rb);
return(max_turbo_iterations); return(max_turbo_iterations);
}*/ }*/
/*harq_pid = dlsch->current_harq_pid[phy_vars_ue->current_thread_id[subframe]]; /*harq_pid = dlsch->current_harq_pid[phy_vars_ue->current_thread_id[subframe]];
if (harq_pid >= 8) { if (harq_pid >= 8) {
printf("dlsch_decoding.c: Illegal harq_pid %d\n",harq_pid); printf("dlsch_decoding.c: Illegal harq_pid %d\n",harq_pid);
return(max_turbo_iterations); return(max_turbo_iterations);
} }
*/ */
harq_process->trials[harq_process->round]++; harq_process->trials[harq_process->round]++;
A = harq_process->TBS; //2072 for QPSK 1/3 A = harq_process->TBS; //2072 for QPSK 1/3
ret = dlsch->max_turbo_iterations; ret = dlsch->max_turbo_iterations;
G = harq_process->G; G = harq_process->G;
//get_G(frame_parms,nb_rb,dlsch->rb_alloc,mod_order,num_pdcch_symbols,phy_vars_ue->frame,subframe); //get_G(frame_parms,nb_rb,dlsch->rb_alloc,mod_order,num_pdcch_symbols,phy_vars_ue->frame,subframe);
@@ -293,40 +272,37 @@ decoder_if_t *tc;
*/ */
err_flag = 0; err_flag = 0;
r_offset = 0; r_offset = 0;
unsigned char bw_scaling =1; unsigned char bw_scaling =1;
switch (frame_parms->N_RB_DL) { switch (frame_parms->N_RB_DL) {
case 6: case 6:
bw_scaling =16; bw_scaling =16;
break; break;
case 25: case 25:
bw_scaling =4; bw_scaling =4;
break; break;
case 50: case 50:
bw_scaling =2; bw_scaling =2;
break; break;
default: default:
bw_scaling =1; bw_scaling =1;
break; break;
} }
if (harq_process->C > MAX_NUM_DLSCH_SEGMENTS/bw_scaling) { if (harq_process->C > MAX_NUM_DLSCH_SEGMENTS/bw_scaling) {
LOG_E(PHY,"Illegal harq_process->C %d > %d\n",harq_process->C,MAX_NUM_DLSCH_SEGMENTS/bw_scaling); LOG_E(PHY,"Illegal harq_process->C %d > %d\n",harq_process->C,MAX_NUM_DLSCH_SEGMENTS/bw_scaling);
return((1+dlsch->max_turbo_iterations)); return((1+dlsch->max_turbo_iterations));
} }
#ifdef DEBUG_DLSCH_DECODING #ifdef DEBUG_DLSCH_DECODING
printf("Segmentation: C %d, Cminus %d, Kminus %d, Kplus %d\n",harq_process->C,harq_process->Cminus,harq_process->Kminus,harq_process->Kplus); printf("Segmentation: C %d, Cminus %d, Kminus %d, Kplus %d\n",harq_process->C,harq_process->Cminus,harq_process->Kminus,harq_process->Kplus);
#endif #endif
opp_enabled=1; opp_enabled=1;
for (r=0; r<harq_process->C; r++) { for (r=0; r<harq_process->C; r++) {
// Get Turbo interleaver parameters // Get Turbo interleaver parameters
if (r<harq_process->Cminus) if (r<harq_process->Cminus)
Kr = harq_process->Kminus; Kr = harq_process->Kminus;
@@ -334,15 +310,13 @@ decoder_if_t *tc;
Kr = harq_process->Kplus; Kr = harq_process->Kplus;
Kr_bytes = Kr>>3; Kr_bytes = Kr>>3;
#if UE_TIMING_TRACE #if UE_TIMING_TRACE
start_meas(dlsch_rate_unmatching_stats); start_meas(dlsch_rate_unmatching_stats);
#endif #endif
memset(&dummy_w[r][0],0,3*(6144+64)*sizeof(short)); memset(&dummy_w[r][0],0,3*(6144+64)*sizeof(short));
harq_process->RTC[r] = generate_dummy_w(4+(Kr_bytes*8), harq_process->RTC[r] = generate_dummy_w(4+(Kr_bytes*8),
(uint8_t*) &dummy_w[r][0], (uint8_t *) &dummy_w[r][0],
(r==0) ? harq_process->F : 0); (r==0) ? harq_process->F : 0);
#ifdef DEBUG_DLSCH_DECODING #ifdef DEBUG_DLSCH_DECODING
LOG_D(PHY,"HARQ_PID %d Rate Matching Segment %d (coded bits %d,unpunctured/repeated bits %d, TBS %d, mod_order %d, nb_rb %d, Nl %d, rv %d, round %d)...\n", LOG_D(PHY,"HARQ_PID %d Rate Matching Segment %d (coded bits %d,unpunctured/repeated bits %d, TBS %d, mod_order %d, nb_rb %d, Nl %d, rv %d, round %d)...\n",
harq_pid,r, G, harq_pid,r, G,
@@ -354,14 +328,14 @@ decoder_if_t *tc;
harq_process->rvidx, harq_process->rvidx,
harq_process->round); harq_process->round);
#endif #endif
#ifdef DEBUG_DLSCH_DECODING #ifdef DEBUG_DLSCH_DECODING
printf(" in decoding dlsch->harq_processes[harq_pid]->rvidx = %d\n", dlsch->harq_processes[harq_pid]->rvidx); printf(" in decoding dlsch->harq_processes[harq_pid]->rvidx = %d\n", dlsch->harq_processes[harq_pid]->rvidx);
#endif #endif
if (lte_rate_matching_turbo_rx(harq_process->RTC[r], if (lte_rate_matching_turbo_rx(harq_process->RTC[r],
G, G,
harq_process->w[r], harq_process->w[r],
(uint8_t*)&dummy_w[r][0], (uint8_t *)&dummy_w[r][0],
dlsch_llr+r_offset, dlsch_llr+r_offset,
harq_process->C, harq_process->C,
dlsch->Nsoft, dlsch->Nsoft,
@@ -378,14 +352,13 @@ decoder_if_t *tc;
#endif #endif
LOG_E(PHY,"dlsch_decoding.c: Problem in rate_matching\n"); LOG_E(PHY,"dlsch_decoding.c: Problem in rate_matching\n");
return(dlsch->max_turbo_iterations); return(dlsch->max_turbo_iterations);
} else } else {
{
#if UE_TIMING_TRACE #if UE_TIMING_TRACE
stop_meas(dlsch_rate_unmatching_stats); stop_meas(dlsch_rate_unmatching_stats);
#endif #endif
} }
r_offset += E;
r_offset += E;
/* /*
printf("Subblock deinterleaving, d %p w %p\n", printf("Subblock deinterleaving, d %p w %p\n",
harq_process->d[r], harq_process->d[r],
@@ -396,7 +369,6 @@ decoder_if_t *tc;
#endif #endif
sub_block_deinterleaving_turbo(4+Kr, sub_block_deinterleaving_turbo(4+Kr,
&harq_process->d[r][96], &harq_process->d[r][96],
harq_process->w[r]); harq_process->w[r]);
#if UE_TIMING_TRACE #if UE_TIMING_TRACE
stop_meas(dlsch_deinterleaving_stats); stop_meas(dlsch_deinterleaving_stats);
@@ -413,8 +385,6 @@ decoder_if_t *tc;
printf("%d : %d\n",i,harq_process->d[r][96+i]); printf("%d : %d\n",i,harq_process->d[r][96+i]);
printf("\n");*/ printf("\n");*/
#endif #endif
// printf("Clearing c, %p\n",harq_process->c[r]); // printf("Clearing c, %p\n",harq_process->c[r]);
memset(harq_process->c[r],0,Kr_bytes); memset(harq_process->c[r],0,Kr_bytes);
@@ -432,21 +402,22 @@ decoder_if_t *tc;
printf("%d : %d\n",i,harq_process->d[r][96+i]); printf("%d : %d\n",i,harq_process->d[r][96+i]);
printf("\n"); printf("\n");
*/ */
//#ifndef __AVX2__ //#ifndef __AVX2__
#if 1 #if 1
if (err_flag == 0) { if (err_flag == 0) {
/* /*
LOG_I(PHY, "turbo algo Kr=%d cb_cnt=%d C=%d nbRB=%d crc_type %d TBSInput=%d TBSHarq=%d TBSplus24=%d mcs=%d Qm=%d RIV=%d round=%d maxIter %d\n", LOG_I(PHY, "turbo algo Kr=%d cb_cnt=%d C=%d nbRB=%d crc_type %d TBSInput=%d TBSHarq=%d TBSplus24=%d mcs=%d Qm=%d RIV=%d round=%d maxIter %d\n",
Kr,r,harq_process->C,harq_process->nb_rb,crc_type,A,harq_process->TBS, Kr,r,harq_process->C,harq_process->nb_rb,crc_type,A,harq_process->TBS,
harq_process->B,harq_process->mcs,harq_process->Qm,harq_process->rvidx,harq_process->round,dlsch->max_turbo_iterations); harq_process->B,harq_process->mcs,harq_process->Qm,harq_process->rvidx,harq_process->round,dlsch->max_turbo_iterations);
*/ */
if (llr8_flag) { if (llr8_flag) {
AssertFatal (Kr >= 256, "turbo algo issue Kr=%d cb_cnt=%d C=%d nbRB=%d TBSInput=%d TBSHarq=%d TBSplus24=%d mcs=%d Qm=%d RIV=%d round=%d\n", AssertFatal (Kr >= 256, "turbo algo issue Kr=%d cb_cnt=%d C=%d nbRB=%d TBSInput=%d TBSHarq=%d TBSplus24=%d mcs=%d Qm=%d RIV=%d round=%d\n",
Kr,r,harq_process->C,harq_process->nb_rb,A,harq_process->TBS,harq_process->B,harq_process->mcs,harq_process->Qm,harq_process->rvidx,harq_process->round); Kr,r,harq_process->C,harq_process->nb_rb,A,harq_process->TBS,harq_process->B,harq_process->mcs,harq_process->Qm,harq_process->rvidx,harq_process->round);
} }
#if UE_TIMING_TRACE #if UE_TIMING_TRACE
start_meas(dlsch_turbo_decoding_stats); start_meas(dlsch_turbo_decoding_stats);
#endif #endif
LOG_D(PHY,"AbsSubframe %d.%d Start turbo segment %d/%d \n",frame%1024,subframe,r,harq_process->C-1); LOG_D(PHY,"AbsSubframe %d.%d Start turbo segment %d/%d \n",frame%1024,subframe,r,harq_process->C-1);
ret = tc ret = tc
@@ -465,17 +436,17 @@ decoder_if_t *tc;
&phy_vars_ue->dlsch_tc_ext_stats, &phy_vars_ue->dlsch_tc_ext_stats,
&phy_vars_ue->dlsch_tc_intl1_stats, &phy_vars_ue->dlsch_tc_intl1_stats,
&phy_vars_ue->dlsch_tc_intl2_stats); //(is_crnti==0)?harq_pid:harq_pid+1); &phy_vars_ue->dlsch_tc_intl2_stats); //(is_crnti==0)?harq_pid:harq_pid+1);
#if UE_TIMING_TRACE #if UE_TIMING_TRACE
stop_meas(dlsch_turbo_decoding_stats); stop_meas(dlsch_turbo_decoding_stats);
#endif #endif
} }
#else
if ((harq_process->C == 1) ||
((r==harq_process->C-1) && (skipped_last==0))) { // last segment with odd number of segments
#else
if ((harq_process->C == 1) ||
((r==harq_process->C-1) && (skipped_last==0))) { // last segment with odd number of segments
#if UE_TIMING_TRACE #if UE_TIMING_TRACE
start_meas(dlsch_turbo_decoding_stats); start_meas(dlsch_turbo_decoding_stats);
#endif #endif
ret = tc ret = tc
(&harq_process->d[r][96], (&harq_process->d[r][96],
@@ -491,123 +462,115 @@ decoder_if_t *tc;
&phy_vars_ue->dlsch_tc_ext_stats, &phy_vars_ue->dlsch_tc_ext_stats,
&phy_vars_ue->dlsch_tc_intl1_stats, &phy_vars_ue->dlsch_tc_intl1_stats,
&phy_vars_ue->dlsch_tc_intl2_stats); //(is_crnti==0)?harq_pid:harq_pid+1); &phy_vars_ue->dlsch_tc_intl2_stats); //(is_crnti==0)?harq_pid:harq_pid+1);
#if UE_TIMING_TRACE #if UE_TIMING_TRACE
stop_meas(dlsch_turbo_decoding_stats); stop_meas(dlsch_turbo_decoding_stats);
#endif #endif
// printf("single decode, exit\n"); // printf("single decode, exit\n");
// exit(-1); // exit(-1);
} } else {
else { // we can merge code segments
// we can merge code segments
if ((skipped_last == 0) && (r<harq_process->C-1)) { if ((skipped_last == 0) && (r<harq_process->C-1)) {
skipped_last = 1; skipped_last = 1;
Kr_last = Kr; Kr_last = Kr;
} } else {
else { skipped_last=0;
skipped_last=0;
if (Kr_last == Kr) { // decode 2 code segments with AVX2 version if (Kr_last == Kr) { // decode 2 code segments with AVX2 version
#ifdef DEBUG_DLSCH_DECODING #ifdef DEBUG_DLSCH_DECODING
printf("single decoding segment %d (%p)\n",r-1,&harq_process->d[r-1][96]); printf("single decoding segment %d (%p)\n",r-1,&harq_process->d[r-1][96]);
#endif #endif
#if UE_TIMING_TRACE #if UE_TIMING_TRACE
start_meas(dlsch_turbo_decoding_stats); start_meas(dlsch_turbo_decoding_stats);
#endif #endif
#ifdef DEBUG_DLSCH_DECODING #ifdef DEBUG_DLSCH_DECODING
printf("double decoding segments %d,%d (%p,%p)\n",r-1,r,&harq_process->d[r-1][96],&harq_process->d[r][96]); printf("double decoding segments %d,%d (%p,%p)\n",r-1,r,&harq_process->d[r-1][96],&harq_process->d[r][96]);
#endif #endif
ret = tc_2cw ret = tc_2cw
(&harq_process->d[r-1][96], (&harq_process->d[r-1][96],
&harq_process->d[r][96], &harq_process->d[r][96],
harq_process->c[r-1], harq_process->c[r-1],
harq_process->c[r], harq_process->c[r],
Kr, Kr,
dlsch->max_turbo_iterations, dlsch->max_turbo_iterations,
crc_type, crc_type,
(r==0) ? harq_process->F : 0, (r==0) ? harq_process->F : 0,
&phy_vars_ue->dlsch_tc_init_stats, &phy_vars_ue->dlsch_tc_init_stats,
&phy_vars_ue->dlsch_tc_alpha_stats, &phy_vars_ue->dlsch_tc_alpha_stats,
&phy_vars_ue->dlsch_tc_beta_stats, &phy_vars_ue->dlsch_tc_beta_stats,
&phy_vars_ue->dlsch_tc_gamma_stats, &phy_vars_ue->dlsch_tc_gamma_stats,
&phy_vars_ue->dlsch_tc_ext_stats, &phy_vars_ue->dlsch_tc_ext_stats,
&phy_vars_ue->dlsch_tc_intl1_stats, &phy_vars_ue->dlsch_tc_intl1_stats,
&phy_vars_ue->dlsch_tc_intl2_stats); //(is_crnti==0)?harq_pid:harq_pid+1); &phy_vars_ue->dlsch_tc_intl2_stats); //(is_crnti==0)?harq_pid:harq_pid+1);
/* /*
ret = tc ret = tc
(&harq_process->d[r-1][96], (&harq_process->d[r-1][96],
harq_process->c[r-1], harq_process->c[r-1],
Kr_last, Kr_last,
dlsch->max_turbo_iterations, dlsch->max_turbo_iterations,
crc_type, crc_type,
(r==0) ? harq_process->F : 0, (r==0) ? harq_process->F : 0,
&phy_vars_ue->dlsch_tc_init_stats, &phy_vars_ue->dlsch_tc_init_stats,
&phy_vars_ue->dlsch_tc_alpha_stats, &phy_vars_ue->dlsch_tc_alpha_stats,
&phy_vars_ue->dlsch_tc_beta_stats, &phy_vars_ue->dlsch_tc_beta_stats,
&phy_vars_ue->dlsch_tc_gamma_stats, &phy_vars_ue->dlsch_tc_gamma_stats,
&phy_vars_ue->dlsch_tc_ext_stats, &phy_vars_ue->dlsch_tc_ext_stats,
&phy_vars_ue->dlsch_tc_intl1_stats, &phy_vars_ue->dlsch_tc_intl1_stats,
&phy_vars_ue->dlsch_tc_intl2_stats); //(is_crnti==0)?harq_pid:harq_pid+1); &phy_vars_ue->dlsch_tc_intl2_stats); //(is_crnti==0)?harq_pid:harq_pid+1);
exit(-1);*/ exit(-1);*/
#if UE_TIMING_TRACE #if UE_TIMING_TRACE
stop_meas(dlsch_turbo_decoding_stats); stop_meas(dlsch_turbo_decoding_stats);
#endif #endif
} } else { // Kr_last != Kr
else { // Kr_last != Kr
#if UE_TIMING_TRACE #if UE_TIMING_TRACE
start_meas(dlsch_turbo_decoding_stats); start_meas(dlsch_turbo_decoding_stats);
#endif #endif
ret = tc ret = tc
(&harq_process->d[r-1][96], (&harq_process->d[r-1][96],
harq_process->c[r-1], harq_process->c[r-1],
Kr_last, Kr_last,
dlsch->max_turbo_iterations, dlsch->max_turbo_iterations,
crc_type, crc_type,
(r==0) ? harq_process->F : 0, (r==0) ? harq_process->F : 0,
&phy_vars_ue->dlsch_tc_init_stats, &phy_vars_ue->dlsch_tc_init_stats,
&phy_vars_ue->dlsch_tc_alpha_stats, &phy_vars_ue->dlsch_tc_alpha_stats,
&phy_vars_ue->dlsch_tc_beta_stats, &phy_vars_ue->dlsch_tc_beta_stats,
&phy_vars_ue->dlsch_tc_gamma_stats, &phy_vars_ue->dlsch_tc_gamma_stats,
&phy_vars_ue->dlsch_tc_ext_stats, &phy_vars_ue->dlsch_tc_ext_stats,
&phy_vars_ue->dlsch_tc_intl1_stats, &phy_vars_ue->dlsch_tc_intl1_stats,
&phy_vars_ue->dlsch_tc_intl2_stats); //(is_crnti==0)?harq_pid:harq_pid+1); &phy_vars_ue->dlsch_tc_intl2_stats); //(is_crnti==0)?harq_pid:harq_pid+1);
#if UE_TIMING_TRACE #if UE_TIMING_TRACE
stop_meas(dlsch_turbo_decoding_stats); stop_meas(dlsch_turbo_decoding_stats);
start_meas(dlsch_turbo_decoding_stats);
start_meas(dlsch_turbo_decoding_stats);
#endif #endif
ret = tc
ret = tc (&harq_process->d[r][96],
(&harq_process->d[r][96], harq_process->c[r],
harq_process->c[r], Kr,
Kr, dlsch->max_turbo_iterations,
dlsch->max_turbo_iterations, crc_type,
crc_type, (r==0) ? harq_process->F : 0,
(r==0) ? harq_process->F : 0, &phy_vars_ue->dlsch_tc_init_stats,
&phy_vars_ue->dlsch_tc_init_stats, &phy_vars_ue->dlsch_tc_alpha_stats,
&phy_vars_ue->dlsch_tc_alpha_stats, &phy_vars_ue->dlsch_tc_beta_stats,
&phy_vars_ue->dlsch_tc_beta_stats, &phy_vars_ue->dlsch_tc_gamma_stats,
&phy_vars_ue->dlsch_tc_gamma_stats, &phy_vars_ue->dlsch_tc_ext_stats,
&phy_vars_ue->dlsch_tc_ext_stats, &phy_vars_ue->dlsch_tc_intl1_stats,
&phy_vars_ue->dlsch_tc_intl1_stats, &phy_vars_ue->dlsch_tc_intl2_stats); //(is_crnti==0)?harq_pid:harq_pid+1);
&phy_vars_ue->dlsch_tc_intl2_stats); //(is_crnti==0)?harq_pid:harq_pid+1);
#if UE_TIMING_TRACE #if UE_TIMING_TRACE
stop_meas(dlsch_turbo_decoding_stats);
stop_meas(dlsch_turbo_decoding_stats); /*printf("Segmentation: C %d r %d, dlsch_rate_unmatching_stats %5.3f dlsch_deinterleaving_stats %5.3f dlsch_turbo_decoding_stats %5.3f \n",
harq_process->C,
/*printf("Segmentation: C %d r %d, dlsch_rate_unmatching_stats %5.3f dlsch_deinterleaving_stats %5.3f dlsch_turbo_decoding_stats %5.3f \n", r,
harq_process->C, dlsch_rate_unmatching_stats->p_time/(cpuf*1000.0),
r, dlsch_deinterleaving_stats->p_time/(cpuf*1000.0),
dlsch_rate_unmatching_stats->p_time/(cpuf*1000.0), dlsch_turbo_decoding_stats->p_time/(cpuf*1000.0));*/
dlsch_deinterleaving_stats->p_time/(cpuf*1000.0),
dlsch_turbo_decoding_stats->p_time/(cpuf*1000.0));*/
#endif #endif
} }
} }
} }
#endif
#endif
if ((err_flag == 0) && (ret>=(1+dlsch->max_turbo_iterations))) {// a Code segment is in error so break; if ((err_flag == 0) && (ret>=(1+dlsch->max_turbo_iterations))) {// a Code segment is in error so break;
LOG_D(PHY,"AbsSubframe %d.%d CRC failed, segment %d/%d \n",frame%1024,subframe,r,harq_process->C-1); LOG_D(PHY,"AbsSubframe %d.%d CRC failed, segment %d/%d \n",frame%1024,subframe,r,harq_process->C-1);
@@ -617,16 +580,18 @@ decoder_if_t *tc;
int32_t frame_rx_prev = frame; int32_t frame_rx_prev = frame;
int32_t subframe_rx_prev = subframe - 1; int32_t subframe_rx_prev = subframe - 1;
if (subframe_rx_prev < 0) { if (subframe_rx_prev < 0) {
frame_rx_prev--; frame_rx_prev--;
subframe_rx_prev += 10; subframe_rx_prev += 10;
} }
frame_rx_prev = frame_rx_prev%1024; frame_rx_prev = frame_rx_prev%1024;
if (err_flag == 1) { if (err_flag == 1) {
#if UE_DEBUG_TRACE #if UE_DEBUG_TRACE
LOG_D(PHY,"[UE %d] DLSCH: Setting NAK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d, mcs %d) Kr %d r %d harq_process->round %d\n", LOG_D(PHY,"[UE %d] DLSCH: Setting NAK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d, mcs %d) Kr %d r %d harq_process->round %d\n",
phy_vars_ue->Mod_id, frame, subframe, harq_pid,harq_process->status, harq_process->round,harq_process->TBS,harq_process->mcs,Kr,r,harq_process->round); phy_vars_ue->Mod_id, frame, subframe, harq_pid,harq_process->status, harq_process->round,harq_process->TBS,harq_process->mcs,Kr,r,harq_process->round);
#endif #endif
dlsch->harq_ack[subframe].ack = 0; dlsch->harq_ack[subframe].ack = 0;
dlsch->harq_ack[subframe].harq_id = harq_pid; dlsch->harq_ack[subframe].harq_id = harq_pid;
@@ -634,39 +599,36 @@ decoder_if_t *tc;
harq_process->errors[harq_process->round]++; harq_process->errors[harq_process->round]++;
harq_process->round++; harq_process->round++;
// printf("Rate: [UE %d] DLSCH: Setting NACK for subframe %d (pid %d, round %d)\n",phy_vars_ue->Mod_id,subframe,harq_pid,harq_process->round); // printf("Rate: [UE %d] DLSCH: Setting NACK for subframe %d (pid %d, round %d)\n",phy_vars_ue->Mod_id,subframe,harq_pid,harq_process->round);
if (harq_process->round >= dlsch->Mdlharq) { if (harq_process->round >= dlsch->Mdlharq) {
harq_process->status = SCH_IDLE; harq_process->status = SCH_IDLE;
harq_process->round = 0; harq_process->round = 0;
} }
if(is_crnti)
{ if(is_crnti) {
LOG_D(PHY,"[UE %d] DLSCH: Setting NACK for subframe %d (pid %d, pid status %d, round %d/Max %d, TBS %d)\n", LOG_D(PHY,"[UE %d] DLSCH: Setting NACK for subframe %d (pid %d, pid status %d, round %d/Max %d, TBS %d)\n",
phy_vars_ue->Mod_id,subframe,harq_pid,harq_process->status,harq_process->round,dlsch->Mdlharq,harq_process->TBS); phy_vars_ue->Mod_id,subframe,harq_pid,harq_process->status,harq_process->round,dlsch->Mdlharq,harq_process->TBS);
} }
return((1+dlsch->max_turbo_iterations)); return((1+dlsch->max_turbo_iterations));
} else { } else {
#if UE_DEBUG_TRACE #if UE_DEBUG_TRACE
LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for subframe %d TBS %d mcs %d nb_rb %d\n", LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for subframe %d TBS %d mcs %d nb_rb %d\n",
phy_vars_ue->Mod_id,subframe,harq_process->TBS,harq_process->mcs,harq_process->nb_rb); phy_vars_ue->Mod_id,subframe,harq_process->TBS,harq_process->mcs,harq_process->nb_rb);
#endif #endif
harq_process->status = SCH_IDLE; harq_process->status = SCH_IDLE;
harq_process->round = 0; harq_process->round = 0;
dlsch->harq_ack[subframe].ack = 1; dlsch->harq_ack[subframe].ack = 1;
dlsch->harq_ack[subframe].harq_id = harq_pid; dlsch->harq_ack[subframe].harq_id = harq_pid;
dlsch->harq_ack[subframe].send_harq_status = 1; dlsch->harq_ack[subframe].send_harq_status = 1;
//LOG_I(PHY,"[UE %d] DLSCH: Setting ACK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d, mcs %d)\n", //LOG_I(PHY,"[UE %d] DLSCH: Setting ACK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d, mcs %d)\n",
// phy_vars_ue->Mod_id, frame, subframe, harq_pid, harq_process->status, harq_process->round,harq_process->TBS,harq_process->mcs); // phy_vars_ue->Mod_id, frame, subframe, harq_pid, harq_process->status, harq_process->round,harq_process->TBS,harq_process->mcs);
if(is_crnti) if(is_crnti) {
{ LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for subframe %d (pid %d, round %d, TBS %d)\n",phy_vars_ue->Mod_id,subframe,harq_pid,harq_process->round,harq_process->TBS);
LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for subframe %d (pid %d, round %d, TBS %d)\n",phy_vars_ue->Mod_id,subframe,harq_pid,harq_process->round,harq_process->TBS);
} }
//LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for subframe %d (pid %d, round %d)\n",phy_vars_ue->Mod_id,subframe,harq_pid,harq_process->round);
//LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for subframe %d (pid %d, round %d)\n",phy_vars_ue->Mod_id,subframe,harq_pid,harq_process->round);
} }
// Reassembly of Transport block here // Reassembly of Transport block here
@@ -706,24 +668,20 @@ decoder_if_t *tc;
} }
dlsch->last_iteration_cnt = ret; dlsch->last_iteration_cnt = ret;
return(ret); return(ret);
} }
int dlsch_encoding_SIC(PHY_VARS_UE *ue, int dlsch_encoding_SIC(PHY_VARS_UE *ue,
unsigned char *a, unsigned char *a,
uint8_t num_pdcch_symbols, uint8_t num_pdcch_symbols,
LTE_eNB_DLSCH_t *dlsch, LTE_eNB_DLSCH_t *dlsch,
int frame, int frame,
uint8_t subframe, uint8_t subframe,
time_stats_t *rm_stats, time_stats_t *rm_stats,
time_stats_t *te_stats, time_stats_t *te_stats,
time_stats_t *i_stats) time_stats_t *i_stats) {
{
unsigned int G; unsigned int G;
unsigned int crc=1; unsigned int crc=1;
LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
unsigned char harq_pid = ue->dlsch[subframe&2][0][0]->rnti; unsigned char harq_pid = ue->dlsch[subframe&2][0][0]->rnti;
unsigned short nb_rb = dlsch->harq_processes[harq_pid]->nb_rb; unsigned short nb_rb = dlsch->harq_processes[harq_pid]->nb_rb;
@@ -732,9 +690,7 @@ int dlsch_encoding_SIC(PHY_VARS_UE *ue,
unsigned int Kr=0,Kr_bytes,r,r_offset=0; unsigned int Kr=0,Kr_bytes,r,r_offset=0;
// unsigned short m=dlsch->harq_processes[harq_pid]->mcs; // unsigned short m=dlsch->harq_processes[harq_pid]->mcs;
uint8_t beamforming_mode=0; uint8_t beamforming_mode=0;
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING, VCD_FUNCTION_IN); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING, VCD_FUNCTION_IN);
A = dlsch->harq_processes[harq_pid]->TBS; //6228 A = dlsch->harq_processes[harq_pid]->TBS; //6228
// printf("Encoder: A: %d\n",A); // printf("Encoder: A: %d\n",A);
mod_order = dlsch->harq_processes[harq_pid]->Qm; mod_order = dlsch->harq_processes[harq_pid]->Qm;
@@ -745,13 +701,13 @@ int dlsch_encoding_SIC(PHY_VARS_UE *ue,
beamforming_mode = 8; beamforming_mode = 8;
else if(dlsch->harq_processes[harq_pid]->mimo_mode == TM9_10) else if(dlsch->harq_processes[harq_pid]->mimo_mode == TM9_10)
beamforming_mode = 9; beamforming_mode = 9;
G = get_G(frame_parms,nb_rb,dlsch->harq_processes[harq_pid]->rb_alloc,mod_order,dlsch->harq_processes[harq_pid]->Nl,num_pdcch_symbols,frame,subframe,beamforming_mode);
G = get_G(frame_parms,nb_rb,dlsch->harq_processes[harq_pid]->rb_alloc,mod_order,dlsch->harq_processes[harq_pid]->Nl,num_pdcch_symbols,frame,subframe,beamforming_mode);
// if (dlsch->harq_processes[harq_pid]->Ndi == 1) { // this is a new packet // if (dlsch->harq_processes[harq_pid]->Ndi == 1) { // this is a new packet
if (dlsch->harq_processes[harq_pid]->round == 0) { // this is a new packet if (dlsch->harq_processes[harq_pid]->round == 0) { // this is a new packet
#ifdef DEBUG_DLSCH_CODING #ifdef DEBUG_DLSCH_CODING
printf("SIC encoding thinks this is a new packet \n"); printf("SIC encoding thinks this is a new packet \n");
#endif #endif
/* /*
int i; int i;
@@ -763,11 +719,10 @@ int dlsch_encoding_SIC(PHY_VARS_UE *ue,
// Add 24-bit crc (polynomial A) to payload // Add 24-bit crc (polynomial A) to payload
crc = crc24a(a, crc = crc24a(a,
A)>>8; A)>>8;
a[A>>3] = ((uint8_t*)&crc)[2]; a[A>>3] = ((uint8_t *)&crc)[2];
a[1+(A>>3)] = ((uint8_t*)&crc)[1]; a[1+(A>>3)] = ((uint8_t *)&crc)[1];
a[2+(A>>3)] = ((uint8_t*)&crc)[0]; a[2+(A>>3)] = ((uint8_t *)&crc)[0];
// printf("CRC %x (A %d)\n",crc,A); // printf("CRC %x (A %d)\n",crc,A);
dlsch->harq_processes[harq_pid]->B = A+24; dlsch->harq_processes[harq_pid]->B = A+24;
// dlsch->harq_processes[harq_pid]->b = a; // dlsch->harq_processes[harq_pid]->b = a;
memcpy(dlsch->harq_processes[harq_pid]->b,a,(A/8)+4); memcpy(dlsch->harq_processes[harq_pid]->b,a,(A/8)+4);
@@ -784,25 +739,20 @@ int dlsch_encoding_SIC(PHY_VARS_UE *ue,
return(-1); return(-1);
for (r=0; r<dlsch->harq_processes[harq_pid]->C; r++) { for (r=0; r<dlsch->harq_processes[harq_pid]->C; r++) {
if (r<dlsch->harq_processes[harq_pid]->Cminus) if (r<dlsch->harq_processes[harq_pid]->Cminus)
Kr = dlsch->harq_processes[harq_pid]->Kminus; Kr = dlsch->harq_processes[harq_pid]->Kminus;
else else
Kr = dlsch->harq_processes[harq_pid]->Kplus; Kr = dlsch->harq_processes[harq_pid]->Kplus;
Kr_bytes = Kr>>3; Kr_bytes = Kr>>3;
#ifdef DEBUG_DLSCH_CODING #ifdef DEBUG_DLSCH_CODING
printf("Generating Code Segment %d (%d bits)\n",r,Kr); printf("Generating Code Segment %u (%u bits)\n",r,Kr);
// generate codewords // generate codewords
printf("bits_per_codeword (Kr)= %u, A %u\n",Kr,A);
printf("bits_per_codeword (Kr)= %d, A %d\n",Kr,A);
printf("N_RB = %d\n",nb_rb); printf("N_RB = %d\n",nb_rb);
printf("Ncp %d\n",frame_parms->Ncp); printf("Ncp %d\n",frame_parms->Ncp);
printf("mod_order %d\n",mod_order); printf("mod_order %d\n",mod_order);
#endif #endif
start_meas(te_stats); start_meas(te_stats);
encoder(dlsch->harq_processes[harq_pid]->c[r], encoder(dlsch->harq_processes[harq_pid]->c[r],
Kr>>3, Kr>>3,
@@ -823,7 +773,6 @@ int dlsch_encoding_SIC(PHY_VARS_UE *ue,
dlsch->harq_processes[harq_pid]->w[r]); dlsch->harq_processes[harq_pid]->w[r]);
stop_meas(i_stats); stop_meas(i_stats);
} }
} }
// Fill in the "e"-sequence from 36-212, V8.6 2009-03, p. 16-17 (for each "e") and concatenate the // Fill in the "e"-sequence from 36-212, V8.6 2009-03, p. 16-17 (for each "e") and concatenate the
@@ -831,13 +780,12 @@ int dlsch_encoding_SIC(PHY_VARS_UE *ue,
for (r=0; r<dlsch->harq_processes[harq_pid]->C; r++) { for (r=0; r<dlsch->harq_processes[harq_pid]->C; r++) {
#ifdef DEBUG_DLSCH_CODING #ifdef DEBUG_DLSCH_CODING
printf("Rate Matching, Code segment %d (coded bits (G) %d,unpunctured/repeated bits per code segment %d,mod_order %d, nb_rb %d)...\n", printf("Rate Matching, Code segment %u (coded bits (G) %u,unpunctured/repeated bits per code segment %u,mod_order %d, nb_rb %d)...\n",
r, r,
G, G,
Kr*3, Kr*3,
mod_order,nb_rb); mod_order,nb_rb);
#endif #endif
start_meas(rm_stats); start_meas(rm_stats);
#ifdef DEBUG_DLSCH_CODING #ifdef DEBUG_DLSCH_CODING
printf("rvidx in SIC encoding = %d\n", dlsch->harq_processes[harq_pid]->rvidx); printf("rvidx in SIC encoding = %d\n", dlsch->harq_processes[harq_pid]->rvidx);
@@ -866,6 +814,5 @@ int dlsch_encoding_SIC(PHY_VARS_UE *ue,
} }
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING, VCD_FUNCTION_OUT); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING, VCD_FUNCTION_OUT);
return(0); return(0);
} }
File diff suppressed because it is too large Load Diff
@@ -80,7 +80,6 @@ void free_ue_ulsch(LTE_UE_ULSCH_t *ulsch)
} }
} }
free16(ulsch,sizeof(LTE_UE_ULSCH_t)); free16(ulsch,sizeof(LTE_UE_ULSCH_t));
ulsch = NULL;
} }
} }
@@ -22,6 +22,7 @@ int f_read(char *calibF_fname, int nb_ant, int nb_freq, int32_t **tdd_calib_coef
} }
printf("%d\n",(int)tdd_calib_coeffs[0][0]); printf("%d\n",(int)tdd_calib_coeffs[0][0]);
printf("%d\n",(int)tdd_calib_coeffs[1][599]); printf("%d\n",(int)tdd_calib_coeffs[1][599]);
fclose(calibF_fd);
} else } else
printf("%s not found, running with defaults\n",calibF_fname); printf("%s not found, running with defaults\n",calibF_fname);
/* TODO: what to return? is this code used at all? */ /* TODO: what to return? is this code used at all? */
+79 -110
View File
@@ -33,9 +33,7 @@ int slot_fep(PHY_VARS_UE *ue,
unsigned char Ns, unsigned char Ns,
int sample_offset, int sample_offset,
int no_prefix, int no_prefix,
int reset_freq_est) int reset_freq_est) {
{
LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
LTE_UE_COMMON *common_vars = &ue->common_vars; LTE_UE_COMMON *common_vars = &ue->common_vars;
uint8_t eNB_id = 0;//ue_common_vars->eNb_id; uint8_t eNB_id = 0;//ue_common_vars->eNb_id;
@@ -48,43 +46,41 @@ int slot_fep(PHY_VARS_UE *ue,
int i; int i;
unsigned int frame_length_samples = frame_parms->samples_per_tti * 10; unsigned int frame_length_samples = frame_parms->samples_per_tti * 10;
unsigned int rx_offset; unsigned int rx_offset;
/*LTE_UE_DLSCH_t **dlsch_ue = phy_vars_ue->dlsch_ue[eNB_id]; /*LTE_UE_DLSCH_t **dlsch_ue = phy_vars_ue->dlsch_ue[eNB_id];
unsigned char harq_pid = dlsch_ue[0]->current_harq_pid; unsigned char harq_pid = dlsch_ue[0]->current_harq_pid;
LTE_DL_UE_HARQ_t *dlsch0_harq = dlsch_ue[0]->harq_processes[harq_pid]; LTE_DL_UE_HARQ_t *dlsch0_harq = dlsch_ue[0]->harq_processes[harq_pid];
int uespec_pilot[9][1200];*/ int uespec_pilot[9][1200];*/
void (*dft)(int16_t *,int16_t *, int); void (*dft)(int16_t *,int16_t *, int);
int tmp_dft_in[2048] __attribute__ ((aligned (32))); // This is for misalignment issues for 6 and 15 PRBs int tmp_dft_in[2048] __attribute__ ((aligned (32))); // This is for misalignment issues for 6 and 15 PRBs
switch (frame_parms->ofdm_symbol_size) { switch (frame_parms->ofdm_symbol_size) {
case 128: case 128:
dft = dft128; dft = dft128;
break; break;
case 256: case 256:
dft = dft256; dft = dft256;
break; break;
case 512: case 512:
dft = dft512; dft = dft512;
break; break;
case 1024: case 1024:
dft = dft1024; dft = dft1024;
break; break;
case 1536: case 1536:
dft = dft1536; dft = dft1536;
break; break;
case 2048: case 2048:
dft = dft2048; dft = dft2048;
break; break;
default: default:
dft = dft512; dft = dft512;
break; break;
} }
if (no_prefix) { if (no_prefix) {
@@ -97,7 +93,6 @@ int slot_fep(PHY_VARS_UE *ue,
// subframe_offset_F = frame_parms->ofdm_symbol_size * frame_parms->symbols_per_tti * (Ns>>1); // subframe_offset_F = frame_parms->ofdm_symbol_size * frame_parms->symbols_per_tti * (Ns>>1);
if (l<0 || l>=7-frame_parms->Ncp) { if (l<0 || l>=7-frame_parms->Ncp) {
printf("slot_fep: l must be between 0 and %d\n",7-frame_parms->Ncp); printf("slot_fep: l must be between 0 and %d\n",7-frame_parms->Ncp);
return(-1); return(-1);
@@ -108,17 +103,13 @@ int slot_fep(PHY_VARS_UE *ue,
return(-1); return(-1);
} }
for (aa=0; aa<frame_parms->nb_antennas_rx; aa++) { for (aa=0; aa<frame_parms->nb_antennas_rx; aa++) {
memset(&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],0,frame_parms->ofdm_symbol_size*sizeof(int)); memset(&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],0,frame_parms->ofdm_symbol_size*sizeof(int));
rx_offset = sample_offset + slot_offset + nb_prefix_samples0 + subframe_offset - SOFFSET; rx_offset = sample_offset + slot_offset + nb_prefix_samples0 + subframe_offset - SOFFSET;
// Align with 256 bit // Align with 256 bit
// rx_offset = rx_offset&0xfffffff8; // rx_offset = rx_offset&0xfffffff8;
if (l==0) { if (l==0) {
if (rx_offset > (frame_length_samples - frame_parms->ofdm_symbol_size)) if (rx_offset > (frame_length_samples - frame_parms->ofdm_symbol_size))
memcpy((short *)&common_vars->rxdata[aa][frame_length_samples], memcpy((short *)&common_vars->rxdata[aa][frame_length_samples],
(short *)&common_vars->rxdata[aa][0], (short *)&common_vars->rxdata[aa][0],
@@ -132,30 +123,29 @@ int slot_fep(PHY_VARS_UE *ue,
(int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1); (int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
} else { // use dft input from RX buffer directly } else { // use dft input from RX buffer directly
#if UE_TIMING_TRACE #if UE_TIMING_TRACE
start_meas(&ue->rx_dft_stats); start_meas(&ue->rx_dft_stats);
#endif #endif
dft((int16_t *)&common_vars->rxdata[aa][(rx_offset) % frame_length_samples], dft((int16_t *)&common_vars->rxdata[aa][(rx_offset) % frame_length_samples],
(int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1); (int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
#if UE_TIMING_TRACE #if UE_TIMING_TRACE
stop_meas(&ue->rx_dft_stats); stop_meas(&ue->rx_dft_stats);
#endif #endif
} }
} else { } else {
rx_offset += (frame_parms->ofdm_symbol_size+nb_prefix_samples)*l;// + rx_offset += (frame_parms->ofdm_symbol_size+nb_prefix_samples)*l;// +
// (frame_parms->ofdm_symbol_size+nb_prefix_samples)*(l-1); // (frame_parms->ofdm_symbol_size+nb_prefix_samples)*(l-1);
#ifdef DEBUG_FEP #ifdef DEBUG_FEP
// if (ue->frame <100) // if (ue->frame <100)
LOG_I(PHY,"slot_fep: frame %d: slot %d, symbol %d, nb_prefix_samples %d, nb_prefix_samples0 %d, slot_offset %d, subframe_offset %d, sample_offset %d,rx_offset %d, frame_length_samples %d\n", ue->proc.proc_rxtx[(Ns>>1)&1].frame_rx,Ns, symbol, LOG_I(PHY,"slot_fep: frame %d: slot %d, symbol %d, nb_prefix_samples %d, nb_prefix_samples0 %d, slot_offset %d, subframe_offset %d, sample_offset %d,rx_offset %d, frame_length_samples %d\n",
nb_prefix_samples,nb_prefix_samples0,slot_offset,subframe_offset,sample_offset,rx_offset,frame_length_samples); ue->proc.proc_rxtx[(Ns>>1)&1].frame_rx,Ns, symbol,
nb_prefix_samples,nb_prefix_samples0,slot_offset,subframe_offset,sample_offset,rx_offset,frame_length_samples);
#endif #endif
if (rx_offset > (frame_length_samples - frame_parms->ofdm_symbol_size)) if (rx_offset > (frame_length_samples - frame_parms->ofdm_symbol_size))
memcpy((void *)&common_vars->rxdata[aa][frame_length_samples], memcpy((void *)&common_vars->rxdata[aa][frame_length_samples],
(void *)&common_vars->rxdata[aa][0], (void *)&common_vars->rxdata[aa][0],
frame_parms->ofdm_symbol_size*sizeof(int)); frame_parms->ofdm_symbol_size*sizeof(int));
#if UE_TIMING_TRACE #if UE_TIMING_TRACE
start_meas(&ue->rx_dft_stats); start_meas(&ue->rx_dft_stats);
#endif #endif
@@ -167,27 +157,25 @@ int slot_fep(PHY_VARS_UE *ue,
dft((int16_t *)tmp_dft_in, dft((int16_t *)tmp_dft_in,
(int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1); (int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
} else { // use dft input from RX buffer directly } else { // use dft input from RX buffer directly
dft((int16_t *)&common_vars->rxdata[aa][(rx_offset) % frame_length_samples], dft((int16_t *)&common_vars->rxdata[aa][(rx_offset) % frame_length_samples],
(int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1); (int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
} }
#if UE_TIMING_TRACE #if UE_TIMING_TRACE
stop_meas(&ue->rx_dft_stats); stop_meas(&ue->rx_dft_stats);
#endif #endif
} }
#ifdef DEBUG_FEP
// if (ue->frame <100) #ifdef DEBUG_FEP
printf("slot_fep: frame %d: symbol %d rx_offset %d\n", ue->proc.proc_rxtx[(Ns>>1)&1].frame_rx, symbol,rx_offset); // if (ue->frame <100)
#endif printf("slot_fep: frame %d: symbol %d rx_offset %u\n", ue->proc.proc_rxtx[(Ns>>1)&1].frame_rx, symbol,rx_offset);
#endif
} }
if (ue->perfect_ce == 0) { if (ue->perfect_ce == 0) {
if ((l==0) || (l==(4-frame_parms->Ncp))) { if ((l==0) || (l==(4-frame_parms->Ncp))) {
for (aa=0; aa<frame_parms->nb_antenna_ports_eNB; aa++) { for (aa=0; aa<frame_parms->nb_antenna_ports_eNB; aa++) {
#ifdef DEBUG_FEP #ifdef DEBUG_FEP
printf("Channel estimation eNB %d, aatx %d, slot %d, symbol %d\n",eNB_id,aa,Ns,l); printf("Channel estimation eNB %d, aatx %d, slot %d, symbol %d\n",eNB_id,aa,Ns,l);
#endif #endif
@@ -212,7 +200,6 @@ int slot_fep(PHY_VARS_UE *ue,
} }
} }
// do frequency offset estimation here! // do frequency offset estimation here!
// use channel estimates from current symbol (=ch_t) and last symbol (ch_{t-1}) // use channel estimates from current symbol (=ch_t) and last symbol (ch_{t-1})
#ifdef DEBUG_FEP #ifdef DEBUG_FEP
@@ -220,23 +207,19 @@ int slot_fep(PHY_VARS_UE *ue,
#endif #endif
if (l==(4-frame_parms->Ncp)) { if (l==(4-frame_parms->Ncp)) {
#if UE_TIMING_TRACE #if UE_TIMING_TRACE
start_meas(&ue->dlsch_freq_offset_estimation_stats); start_meas(&ue->dlsch_freq_offset_estimation_stats);
#endif #endif
lte_est_freq_offset(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].dl_ch_estimates[0], lte_est_freq_offset(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].dl_ch_estimates[0],
frame_parms, frame_parms,
l, l,
&common_vars->freq_offset, &common_vars->freq_offset,
reset_freq_est); reset_freq_est);
#if UE_TIMING_TRACE #if UE_TIMING_TRACE
stop_meas(&ue->dlsch_freq_offset_estimation_stats); stop_meas(&ue->dlsch_freq_offset_estimation_stats);
#endif #endif
} }
} }
} }
#ifdef DEBUG_FEP #ifdef DEBUG_FEP
@@ -246,11 +229,10 @@ int slot_fep(PHY_VARS_UE *ue,
} }
int front_end_fft(PHY_VARS_UE *ue, int front_end_fft(PHY_VARS_UE *ue,
unsigned char l, unsigned char l,
unsigned char Ns, unsigned char Ns,
int sample_offset, int sample_offset,
int no_prefix) int no_prefix) {
{
LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
LTE_UE_COMMON *common_vars = &ue->common_vars; LTE_UE_COMMON *common_vars = &ue->common_vars;
unsigned char aa; unsigned char aa;
@@ -262,43 +244,41 @@ int front_end_fft(PHY_VARS_UE *ue,
unsigned int frame_length_samples = frame_parms->samples_per_tti * 10; unsigned int frame_length_samples = frame_parms->samples_per_tti * 10;
unsigned int rx_offset; unsigned int rx_offset;
uint8_t threadId; uint8_t threadId;
/*LTE_UE_DLSCH_t **dlsch_ue = phy_vars_ue->dlsch_ue[eNB_id]; /*LTE_UE_DLSCH_t **dlsch_ue = phy_vars_ue->dlsch_ue[eNB_id];
unsigned char harq_pid = dlsch_ue[0]->current_harq_pid; unsigned char harq_pid = dlsch_ue[0]->current_harq_pid;
LTE_DL_UE_HARQ_t *dlsch0_harq = dlsch_ue[0]->harq_processes[harq_pid]; LTE_DL_UE_HARQ_t *dlsch0_harq = dlsch_ue[0]->harq_processes[harq_pid];
int uespec_pilot[9][1200];*/ int uespec_pilot[9][1200];*/
void (*dft)(int16_t *,int16_t *, int); void (*dft)(int16_t *,int16_t *, int);
int tmp_dft_in[2048] __attribute__ ((aligned (32))); // This is for misalignment issues for 6 and 15 PRBs int tmp_dft_in[2048] __attribute__ ((aligned (32))); // This is for misalignment issues for 6 and 15 PRBs
switch (frame_parms->ofdm_symbol_size) { switch (frame_parms->ofdm_symbol_size) {
case 128: case 128:
dft = dft128; dft = dft128;
break; break;
case 256: case 256:
dft = dft256; dft = dft256;
break; break;
case 512: case 512:
dft = dft512; dft = dft512;
break; break;
case 1024: case 1024:
dft = dft1024; dft = dft1024;
break; break;
case 1536: case 1536:
dft = dft1536; dft = dft1536;
break; break;
case 2048: case 2048:
dft = dft2048; dft = dft2048;
break; break;
default: default:
dft = dft512; dft = dft512;
break; break;
} }
if (no_prefix) { if (no_prefix) {
@@ -311,7 +291,6 @@ int front_end_fft(PHY_VARS_UE *ue,
// subframe_offset_F = frame_parms->ofdm_symbol_size * frame_parms->symbols_per_tti * (Ns>>1); // subframe_offset_F = frame_parms->ofdm_symbol_size * frame_parms->symbols_per_tti * (Ns>>1);
if (l<0 || l>=7-frame_parms->Ncp) { if (l<0 || l>=7-frame_parms->Ncp) {
printf("slot_fep: l must be between 0 and %d\n",7-frame_parms->Ncp); printf("slot_fep: l must be between 0 and %d\n",7-frame_parms->Ncp);
return(-1); return(-1);
@@ -322,19 +301,16 @@ int front_end_fft(PHY_VARS_UE *ue,
return(-1); return(-1);
} }
threadId = ue->current_thread_id[Ns>>1]; threadId = ue->current_thread_id[Ns>>1];
for (aa=0; aa<frame_parms->nb_antennas_rx; aa++) {
// change thread index
memset(&common_vars->common_vars_rx_data_per_thread[threadId].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],0,frame_parms->ofdm_symbol_size*sizeof(int));
for (aa=0; aa<frame_parms->nb_antennas_rx; aa++) {
// change thread index
memset(&common_vars->common_vars_rx_data_per_thread[threadId].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],0,frame_parms->ofdm_symbol_size*sizeof(int));
rx_offset = sample_offset + slot_offset + nb_prefix_samples0 + subframe_offset - SOFFSET; rx_offset = sample_offset + slot_offset + nb_prefix_samples0 + subframe_offset - SOFFSET;
// Align with 256 bit // Align with 256 bit
// rx_offset = rx_offset&0xfffffff8; // rx_offset = rx_offset&0xfffffff8;
if (l==0) { if (l==0) {
if (rx_offset > (frame_length_samples - frame_parms->ofdm_symbol_size)) if (rx_offset > (frame_length_samples - frame_parms->ofdm_symbol_size))
memcpy((short *)&common_vars->rxdata[aa][frame_length_samples], memcpy((short *)&common_vars->rxdata[aa][frame_length_samples],
(short *)&common_vars->rxdata[aa][0], (short *)&common_vars->rxdata[aa][0],
@@ -348,21 +324,19 @@ int front_end_fft(PHY_VARS_UE *ue,
(int16_t *)&common_vars->common_vars_rx_data_per_thread[threadId].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1); (int16_t *)&common_vars->common_vars_rx_data_per_thread[threadId].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
} else { // use dft input from RX buffer directly } else { // use dft input from RX buffer directly
start_meas(&ue->rx_dft_stats); start_meas(&ue->rx_dft_stats);
dft((int16_t *)&common_vars->rxdata[aa][(rx_offset) % frame_length_samples], dft((int16_t *)&common_vars->rxdata[aa][(rx_offset) % frame_length_samples],
(int16_t *)&common_vars->common_vars_rx_data_per_thread[threadId].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1); (int16_t *)&common_vars->common_vars_rx_data_per_thread[threadId].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
stop_meas(&ue->rx_dft_stats); stop_meas(&ue->rx_dft_stats);
} }
} else { } else {
rx_offset += (frame_parms->ofdm_symbol_size+nb_prefix_samples)*l;// + rx_offset += (frame_parms->ofdm_symbol_size+nb_prefix_samples)*l;// +
// (frame_parms->ofdm_symbol_size+nb_prefix_samples)*(l-1); // (frame_parms->ofdm_symbol_size+nb_prefix_samples)*(l-1);
#ifdef DEBUG_FEP #ifdef DEBUG_FEP
// if (ue->frame <100) // if (ue->frame <100)
LOG_I(PHY,"slot_fep: frame %d: slot %d, threadId %d, symbol %d, nb_prefix_samples %d, nb_prefix_samples0 %d, slot_offset %d, subframe_offset %d, sample_offset %d,rx_offset %d, frame_length_samples %d\n", LOG_I(PHY,
ue->proc.proc_rxtx[threadId].frame_rx,Ns, threadId,symbol, "slot_fep: frame %d: slot %d, threadId %d, symbol %d, nb_prefix_samples %d, nb_prefix_samples0 %d, slot_offset %d, subframe_offset %d, sample_offset %d,rx_offset %d, frame_length_samples %d\n",
nb_prefix_samples,nb_prefix_samples0,slot_offset,subframe_offset,sample_offset,rx_offset,frame_length_samples); ue->proc.proc_rxtx[threadId].frame_rx,Ns, threadId,symbol,
nb_prefix_samples,nb_prefix_samples0,slot_offset,subframe_offset,sample_offset,rx_offset,frame_length_samples);
#endif #endif
if (rx_offset > (frame_length_samples - frame_parms->ofdm_symbol_size)) if (rx_offset > (frame_length_samples - frame_parms->ofdm_symbol_size))
@@ -379,29 +353,27 @@ int front_end_fft(PHY_VARS_UE *ue,
dft((int16_t *)tmp_dft_in, dft((int16_t *)tmp_dft_in,
(int16_t *)&common_vars->common_vars_rx_data_per_thread[threadId].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1); (int16_t *)&common_vars->common_vars_rx_data_per_thread[threadId].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
} else { // use dft input from RX buffer directly } else { // use dft input from RX buffer directly
dft((int16_t *)&common_vars->rxdata[aa][(rx_offset) % frame_length_samples], dft((int16_t *)&common_vars->rxdata[aa][(rx_offset) % frame_length_samples],
(int16_t *)&common_vars->common_vars_rx_data_per_thread[threadId].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1); (int16_t *)&common_vars->common_vars_rx_data_per_thread[threadId].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
} }
stop_meas(&ue->rx_dft_stats); stop_meas(&ue->rx_dft_stats);
} }
#ifdef DEBUG_FEP #ifdef DEBUG_FEP
// if (ue->frame <100) // if (ue->frame <100)
printf("slot_fep: frame %d: symbol %d rx_offset %d\n", ue->proc.proc_rxtx[threadId].frame_rx, symbol,rx_offset); printf("slot_fep: frame %d: symbol %d rx_offset %u\n", ue->proc.proc_rxtx[threadId].frame_rx, symbol,rx_offset);
#endif #endif
} }
return(0); return(0);
} }
int front_end_chanEst(PHY_VARS_UE *ue, int front_end_chanEst(PHY_VARS_UE *ue,
unsigned char l, unsigned char l,
unsigned char Ns, unsigned char Ns,
int reset_freq_est) int reset_freq_est) {
{
LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
LTE_UE_COMMON *common_vars = &ue->common_vars; LTE_UE_COMMON *common_vars = &ue->common_vars;
uint8_t eNB_id = 0;//ue_common_vars->eNb_id; uint8_t eNB_id = 0;//ue_common_vars->eNb_id;
@@ -417,7 +389,6 @@ int front_end_chanEst(PHY_VARS_UE *ue,
if (ue->perfect_ce == 0) { if (ue->perfect_ce == 0) {
if ((l==0) || (l==(4-frame_parms->Ncp))) { if ((l==0) || (l==(4-frame_parms->Ncp))) {
for (aa=0; aa<frame_parms->nb_antenna_ports_eNB; aa++) { for (aa=0; aa<frame_parms->nb_antenna_ports_eNB; aa++) {
#ifdef DEBUG_FEP #ifdef DEBUG_FEP
printf("Channel estimation eNB %d, aatx %d, slot %d, symbol %d\n",eNB_id,aa,Ns,l); printf("Channel estimation eNB %d, aatx %d, slot %d, symbol %d\n",eNB_id,aa,Ns,l);
#endif #endif
@@ -438,7 +409,6 @@ int front_end_chanEst(PHY_VARS_UE *ue,
} }
} }
// do frequency offset estimation here! // do frequency offset estimation here!
// use channel estimates from current symbol (=ch_t) and last symbol (ch_{t-1}) // use channel estimates from current symbol (=ch_t) and last symbol (ch_{t-1})
#ifdef DEBUG_FEP #ifdef DEBUG_FEP
@@ -451,12 +421,11 @@ int front_end_chanEst(PHY_VARS_UE *ue,
frame_parms, frame_parms,
l, l,
&common_vars->freq_offset, &common_vars->freq_offset,
reset_freq_est); reset_freq_est);
stop_meas(&ue->dlsch_freq_offset_estimation_stats); stop_meas(&ue->dlsch_freq_offset_estimation_stats);
} }
} }
} }
return(0); return(0);
} }
+1 -1
View File
@@ -9494,7 +9494,7 @@ int main(int argc, char**argv)
LOG_M("x24576.m","x24576",x,24576,1,1); LOG_M("x24576.m","x24576",x,24576,1,1);
int dftsizes[33]={24,36,48,60,72,96,108,120,144,180,192,216,240,288,300,324,360,384,432,480,540,576,600,648,720,768,864,900,960,972,1080,1152,1200}; int dftsizes[33]={24,36,48,60,72,96,108,120,144,180,192,216,240,288,300,324,360,384,432,480,540,576,600,648,720,768,864,900,960,972,1080,1152,1200};
void (*dft[33])(int16_t *x,int16_t *y,uint8_t scale) = {dft24,dft36,dft48,dft60,dft72,dft96,dft108,dft120,dft144,dft180,dft192,dft216,dft240,dft288,dft300,dft324,dft360,dft384,dft432,dft480,dft540,dft576,dft600,dft648,dft720,dft768,dft864,dft900,dft960,dft972,dft1080,dft1152,dft1200}; void (*dft)(int16_t *x,int16_t *y,uint8_t scale)[33] = {dft24,dft36,dft48,dft60,dft72,dft96,dft108,dft120,dft144,dft180,dft192,dft216,dft240,dft288,dft300,dft324,dft360,dft384,dft432,dft480,dft540,dft576,dft600,dft648,dft720,dft768,dft864,dft900,dft960,dft972,dft1080,dft1152,dft1200};
for (int n=0;n<33;n++) { for (int n=0;n<33;n++) {
// 4xN-point DFT // 4xN-point DFT
memset((void*)x,0,dftsizes[n]*8*sizeof(int16_t)); memset((void*)x,0,dftsizes[n]*8*sizeof(int16_t));
+1
View File
@@ -19,6 +19,7 @@ int f_read(char *calibF_fname, int nb_antM, int nb_freq, int16_t (*calibF_mtx)[n
} }
printf("%d\n",(int)calibF_mtx[0][0]); printf("%d\n",(int)calibF_mtx[0][0]);
printf("%d\n",(int)calibF_mtx[1][599]); printf("%d\n",(int)calibF_mtx[1][599]);
fclose(calibF_fd);
} else } else
printf("%s not found, running with defaults\n",calibF_fname); printf("%s not found, running with defaults\n",calibF_fname);
} }
+1 -7
View File
@@ -64,6 +64,7 @@ int smbv_init_config(const char* fname, uint16_t sequence_length)
if (sequence_length>4) { if (sequence_length>4) {
msg("ERROR invalid sequence length: %d, maximum is 4\n", sequence_length); msg("ERROR invalid sequence length: %d, maximum is 4\n", sequence_length);
fclose(f_ptr);
return -1; return -1;
} else } else
slen = sequence_length; slen = sequence_length;
@@ -448,13 +449,6 @@ int smbv_send_config (const char* fname, char* smbv_ip)
int bytes_sent, status, sockfd; int bytes_sent, status, sockfd;
char buf[BUFFER_LENGTH]; char buf[BUFFER_LENGTH];
if (fopen(fname,"r")!=NULL) {
msg("Configuration file: %s\n",fname);
} else {
msg("ERROR: can't open SMBV config file: %s\n",fname);
return -1;
}
memset(buf,0,BUFFER_LENGTH); memset(buf,0,BUFFER_LENGTH);
// first, load up address structs with getaddrinfo(): // first, load up address structs with getaddrinfo():
+20 -17
View File
@@ -29,7 +29,6 @@ int opp_enabled = 0;
double get_cpu_freq_GHz(void) { double get_cpu_freq_GHz(void) {
time_stats_t ts = {0}; time_stats_t ts = {0};
reset_meas(&ts); reset_meas(&ts);
ts.trials++; ts.trials++;
@@ -38,32 +37,40 @@ double get_cpu_freq_GHz(void) {
ts.diff = (rdtsc_oai()-ts.in); ts.diff = (rdtsc_oai()-ts.in);
cpu_freq_GHz = (double)ts.diff/1000000000; cpu_freq_GHz = (double)ts.diff/1000000000;
printf("CPU Freq is %f \n", cpu_freq_GHz); printf("CPU Freq is %f \n", cpu_freq_GHz);
return cpu_freq_GHz; return cpu_freq_GHz;
} }
int cpumeas(int action) {
switch (action) {
case CPUMEAS_ENABLE:
opp_enabled = 1;
break;
void print_meas_now(time_stats_t *ts, const char* name, FILE* file_name){ case CPUMEAS_DISABLE:
opp_enabled = 0;
break;
case CPUMEAS_GETSTATE:
default:
break;
}
return opp_enabled;
}
void print_meas_now(time_stats_t *ts, const char *name, FILE *file_name) {
if (opp_enabled) { if (opp_enabled) {
//static double cpu_freq_GHz = 3.2; //static double cpu_freq_GHz = 3.2;
//if (cpu_freq_GHz == 0.0) //if (cpu_freq_GHz == 0.0)
//cpu_freq_GHz = get_cpu_freq_GHz(); // super slow //cpu_freq_GHz = get_cpu_freq_GHz(); // super slow
if (ts->trials>0) { if (ts->trials>0) {
//fprintf(file_name,"Name %25s: Processing %15.3f ms for SF %d, diff_now %15.3f \n", name,(ts->p_time/(cpu_freq_GHz*1000000.0)),subframe,ts->p_time); //fprintf(file_name,"Name %25s: Processing %15.3f ms for SF %d, diff_now %15.3f \n", name,(ts->p_time/(cpu_freq_GHz*1000000.0)),subframe,ts->p_time);
fprintf(file_name,"%15.3f us, diff_now %15.3f \n",(ts->p_time/(cpu_freq_GHz*1000.0)),(double)ts->p_time); fprintf(file_name,"%15.3f us, diff_now %15.3f \n",(ts->p_time/(cpu_freq_GHz*1000.0)),(double)ts->p_time);
} }
} }
} }
void print_meas(time_stats_t *ts, const char* name, time_stats_t * total_exec_time, time_stats_t * sf_exec_time) void print_meas(time_stats_t *ts, const char *name, time_stats_t *total_exec_time, time_stats_t *sf_exec_time) {
{
if (opp_enabled) { if (opp_enabled) {
static int first_time = 0; static int first_time = 0;
static double cpu_freq_GHz = 0.0; static double cpu_freq_GHz = 0.0;
@@ -81,7 +88,6 @@ void print_meas(time_stats_t *ts, const char* name, time_stats_t * total_exec_ti
if (ts->trials>0) { if (ts->trials>0) {
//printf("%20s: total: %10.3f ms, average: %10.3f us (%10d trials)\n", name, ts->diff/cpu_freq_GHz/1000000.0, ts->diff/ts->trials/cpu_freq_GHz/1000.0, ts->trials); //printf("%20s: total: %10.3f ms, average: %10.3f us (%10d trials)\n", name, ts->diff/cpu_freq_GHz/1000000.0, ts->diff/ts->trials/cpu_freq_GHz/1000.0, ts->trials);
if ((total_exec_time == NULL) || (sf_exec_time== NULL)) { if ((total_exec_time == NULL) || (sf_exec_time== NULL)) {
fprintf(stderr, "%25s: %15.3f us; %15d;\n", fprintf(stderr, "%25s: %15.3f us; %15d;\n",
name, name,
@@ -98,12 +104,9 @@ void print_meas(time_stats_t *ts, const char* name, time_stats_t * total_exec_ti
} }
} }
} }
} }
double get_time_meas_us(time_stats_t *ts) double get_time_meas_us(time_stats_t *ts) {
{
static double cpu_freq_GHz = 0.0; static double cpu_freq_GHz = 0.0;
if (cpu_freq_GHz == 0.0) if (cpu_freq_GHz == 0.0)
+15 -24
View File
@@ -61,23 +61,21 @@ static inline void start_meas(time_stats_t *ts) __attribute__((always_inline));
static inline void stop_meas(time_stats_t *ts) __attribute__((always_inline)); static inline void stop_meas(time_stats_t *ts) __attribute__((always_inline));
void print_meas_now(time_stats_t *ts, const char* name, FILE* file_name); void print_meas_now(time_stats_t *ts, const char *name, FILE *file_name);
void print_meas(time_stats_t *ts, const char* name, time_stats_t * total_exec_time, time_stats_t * sf_exec_time); void print_meas(time_stats_t *ts, const char *name, time_stats_t *total_exec_time, time_stats_t *sf_exec_time);
double get_time_meas_us(time_stats_t *ts); double get_time_meas_us(time_stats_t *ts);
double get_cpu_freq_GHz(void); double get_cpu_freq_GHz(void);
#if defined(__i386__) #if defined(__i386__)
static inline unsigned long long rdtsc_oai(void) __attribute__((always_inline)); static inline unsigned long long rdtsc_oai(void) __attribute__((always_inline));
static inline unsigned long long rdtsc_oai(void) static inline unsigned long long rdtsc_oai(void) {
{
unsigned long long int x; unsigned long long int x;
__asm__ volatile (".byte 0x0f, 0x31" : "=A" (x)); __asm__ volatile (".byte 0x0f, 0x31" : "=A" (x));
return x; return x;
} }
#elif defined(__x86_64__) #elif defined(__x86_64__)
static inline unsigned long long rdtsc_oai(void) __attribute__((always_inline)); static inline unsigned long long rdtsc_oai(void) __attribute__((always_inline));
static inline unsigned long long rdtsc_oai(void) static inline unsigned long long rdtsc_oai(void) {
{
unsigned long long a, d; unsigned long long a, d;
__asm__ volatile ("rdtsc" : "=a" (a), "=d" (d)); __asm__ volatile ("rdtsc" : "=a" (a), "=d" (d));
return (d<<32) | a; return (d<<32) | a;
@@ -85,61 +83,54 @@ static inline unsigned long long rdtsc_oai(void)
#elif defined(__arm__) #elif defined(__arm__)
static inline uint32_t rdtsc_oai(void) __attribute__((always_inline)); static inline uint32_t rdtsc_oai(void) __attribute__((always_inline));
static inline uint32_t rdtsc_oai(void) static inline uint32_t rdtsc_oai(void) {
{
uint32_t r = 0; uint32_t r = 0;
asm volatile("mrc p15, 0, %0, c9, c13, 0" : "=r"(r) ); asm volatile("mrc p15, 0, %0, c9, c13, 0" : "=r"(r) );
return r; return r;
} }
#endif #endif
static inline void start_meas(time_stats_t *ts) #define CPUMEAS_DISABLE 0
{ #define CPUMEAS_ENABLE 1
#define CPUMEAS_GETSTATE 2
int cpumeas(int action);
static inline void start_meas(time_stats_t *ts) {
if (opp_enabled) { if (opp_enabled) {
if (ts->meas_flag==0) { if (ts->meas_flag==0) {
ts->trials++; ts->trials++;
ts->in = rdtsc_oai(); ts->in = rdtsc_oai();
ts->meas_flag=1; ts->meas_flag=1;
} } else {
else {
ts->in = rdtsc_oai(); ts->in = rdtsc_oai();
} }
} }
} }
static inline void stop_meas(time_stats_t *ts) static inline void stop_meas(time_stats_t *ts) {
{
if (opp_enabled) { if (opp_enabled) {
long long out = rdtsc_oai(); long long out = rdtsc_oai();
ts->diff += (out-ts->in); ts->diff += (out-ts->in);
/// process duration is the difference between two clock points /// process duration is the difference between two clock points
ts->p_time = (out-ts->in); ts->p_time = (out-ts->in);
ts->diff_square += (out-ts->in)*(out-ts->in); ts->diff_square += (out-ts->in)*(out-ts->in);
if ((out-ts->in) > ts->max) if ((out-ts->in) > ts->max)
ts->max = out-ts->in; ts->max = out-ts->in;
ts->meas_flag=0; ts->meas_flag=0;
} }
} }
static inline void reset_meas(time_stats_t *ts) { static inline void reset_meas(time_stats_t *ts) {
ts->trials=0; ts->trials=0;
ts->diff=0; ts->diff=0;
ts->p_time=0; ts->p_time=0;
ts->diff_square=0; ts->diff_square=0;
ts->max=0; ts->max=0;
ts->meas_flag=0; ts->meas_flag=0;
} }
static inline void copy_meas(time_stats_t *dst_ts,time_stats_t *src_ts) static inline void copy_meas(time_stats_t *dst_ts,time_stats_t *src_ts) {
{
if (opp_enabled) { if (opp_enabled) {
dst_ts->trials=src_ts->trials; dst_ts->trials=src_ts->trials;
dst_ts->diff=src_ts->diff; dst_ts->diff=src_ts->diff;
+6 -1
View File
@@ -1670,7 +1670,12 @@ int getM(PHY_VARS_eNB *eNB,int frame,int subframe) {
subframe, subframe,
m); m);
frame_tx = ul_ACK_subframe2_dl_frame(&eNB->frame_parms,frame, frame_tx = ul_ACK_subframe2_dl_frame(&eNB->frame_parms,frame,
subframe,subframe_tx); subframe,subframe_tx);
if (dlsch0 == NULL || dlsch1 == NULL) {
LOG_E(PHY, "dlsch0 and/or dlsch1 NULL, getM frame %i, subframe %i\n",frame,subframe);
return Mtx;
}
harq_pid = dlsch0->harq_ids[frame_tx%2][subframe_tx]; harq_pid = dlsch0->harq_ids[frame_tx%2][subframe_tx];
if (harq_pid>=0 && harq_pid<10) { if (harq_pid>=0 && harq_pid<10) {
+2 -12
View File
@@ -1900,16 +1900,6 @@ void ue_pucch_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin
uint8_t isShortenPucch = (pSoundingrs_ul_config_dedicated->srsCellSubframe && frame_parms->soundingrs_ul_config_common.ackNackSRS_SimultaneousTransmission); uint8_t isShortenPucch = (pSoundingrs_ul_config_dedicated->srsCellSubframe && frame_parms->soundingrs_ul_config_common.ackNackSRS_SimultaneousTransmission);
bundling_flag = ue->pucch_config_dedicated[eNB_id].tdd_AckNackFeedbackMode; bundling_flag = ue->pucch_config_dedicated[eNB_id].tdd_AckNackFeedbackMode;
if ((frame_parms->frame_type==FDD) ||
(bundling_flag==bundling) ||
((frame_parms->frame_type==TDD)&&(frame_parms->tdd_config==1)&&((subframe_tx!=2)||(subframe_tx!=7)))) {
format = pucch_format1a;
// LOG_D(PHY,"[UE] PUCCH 1a\n");
} else {
format = pucch_format1b;
// LOG_D(PHY,"[UE] PUCCH 1b\n");
}
// Part - I // Part - I
// Collect feedback that should be transmitted at this subframe // Collect feedback that should be transmitted at this subframe
// - SR // - SR
@@ -3000,7 +2990,7 @@ void ue_pdsch_procedures(PHY_VARS_UE *ue, UE_rxtx_proc_t *proc, int eNB_id, PDSC
int i_mod,eNB_id_i,dual_stream_UE; int i_mod,eNB_id_i,dual_stream_UE;
int first_symbol_flag=0; int first_symbol_flag=0;
if (dlsch0->active == 0) if (dlsch0 && dlsch0->active == 0)
return; return;
for (m=s0; m<=s1; m++) { for (m=s0; m<=s1; m++) {
@@ -4209,7 +4199,7 @@ int phy_procedures_slot_parallelization_UE_RX(PHY_VARS_UE *ue,UE_rxtx_proc_t *pr
ue->dlsch_ra[eNB_id]->active = 0; ue->dlsch_ra[eNB_id]->active = 0;
} }
if (LOG_DEBUGFLAG(UE_TIMING) if (LOG_DEBUGFLAG(UE_TIMING)) {
stop_meas(&ue->dlsch_procedures_stat[ue->current_thread_id[subframe_rx]]); stop_meas(&ue->dlsch_procedures_stat[ue->current_thread_id[subframe_rx]]);
LOG_I(PHY, "[AbsSFN %d.%d] Channel Decoder: %5.2f \n",frame_rx,subframe_rx,ue->dlsch_procedures_stat[ue->current_thread_id[subframe_rx]].p_time/(cpuf*1000.0)); LOG_I(PHY, "[AbsSFN %d.%d] Channel Decoder: %5.2f \n",frame_rx,subframe_rx,ue->dlsch_procedures_stat[ue->current_thread_id[subframe_rx]].p_time/(cpuf*1000.0));
} }
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+143 -183
View File
@@ -36,7 +36,7 @@
#include "LAYER2/MAC/vars.h" #include "LAYER2/MAC/vars.h"
#ifdef XFORMS #ifdef XFORMS
#include "PHY/TOOLS/lte_phy_scope.h" #include "PHY/TOOLS/lte_phy_scope.h"
#endif //XFORMS #endif //XFORMS
@@ -52,11 +52,8 @@ double cpuf;
DCI1E_5MHz_2A_M10PRB_TDD_t DLSCH_alloc_pdu2_1E[2]; DCI1E_5MHz_2A_M10PRB_TDD_t DLSCH_alloc_pdu2_1E[2];
#define UL_RB_ALLOC 0x1ff; #define UL_RB_ALLOC 0x1ff;
#define CCCH_RB_ALLOC computeRIV(eNB->frame_parms.N_RB_UL,0,2) #define CCCH_RB_ALLOC computeRIV(eNB->frame_parms.N_RB_UL,0,2)
int main(int argc, char **argv) int main(int argc, char **argv) {
{
char c; char c;
int i,l,l2,aa,aarx,k; int i,l,l2,aa,aarx,k;
double sigma2, sigma2_dB=0,SNR,snr0=-2.0,snr1=0.0; double sigma2, sigma2_dB=0,SNR,snr0=-2.0,snr1=0.0;
uint8_t snr1set=0; uint8_t snr1set=0;
@@ -64,48 +61,34 @@ int main(int argc, char **argv)
int **txdata; int **txdata;
double s_re0[2*30720],s_im0[2*30720],s_re1[2*30720],s_im1[2*30720]; double s_re0[2*30720],s_im0[2*30720],s_re1[2*30720],s_im1[2*30720];
double r_re0[2*30720],r_im0[2*30720],r_re1[2*30720],r_im1[2*30720]; double r_re0[2*30720],r_im0[2*30720],r_re1[2*30720],r_im1[2*30720];
double *s_re[2]={s_re0,s_re1},*s_im[2]={s_im0,s_im1},*r_re[2]={r_re0,r_re1},*r_im[2]={r_im0,r_im1}; double *s_re[2]= {s_re0,s_re1},*s_im[2]= {s_im0,s_im1},*r_re[2]= {r_re0,r_re1},*r_im[2]= {r_im0,r_im1};
double iqim = 0.0; double iqim = 0.0;
int subframe=1; int subframe=1;
char fname[40];//, vname[40]; char fname[40];//, vname[40];
uint8_t transmission_mode = 1,n_tx=1,n_rx=2; uint8_t transmission_mode = 1,n_tx=1,n_rx=2;
uint16_t Nid_cell=0; uint16_t Nid_cell=0;
FILE *fd; FILE *fd;
int eNB_id = 0; int eNB_id = 0;
unsigned char mcs=0,awgn_flag=0,round; unsigned char mcs=0,awgn_flag=0,round;
int n_frames=1; int n_frames=1;
channel_desc_t *eNB2UE; channel_desc_t *eNB2UE;
uint32_t nsymb,tx_lev,tx_lev_dB; uint32_t nsymb,tx_lev,tx_lev_dB;
uint8_t extended_prefix_flag=1; uint8_t extended_prefix_flag=1;
LTE_DL_FRAME_PARMS *frame_parms; LTE_DL_FRAME_PARMS *frame_parms;
int hold_channel=0; int hold_channel=0;
uint16_t NB_RB=25; uint16_t NB_RB=25;
int tdd_config=3; int tdd_config=3;
SCM_t channel_model=MBSFN; SCM_t channel_model=MBSFN;
unsigned char *input_buffer; unsigned char *input_buffer;
unsigned short input_buffer_length; unsigned short input_buffer_length;
unsigned int ret; unsigned int ret;
unsigned int trials,errs[4]= {0,0,0,0}; //,round_trials[4]={0,0,0,0}; unsigned int trials,errs[4]= {0,0,0,0}; //,round_trials[4]={0,0,0,0};
uint8_t N_RB_DL=25,osf=1; uint8_t N_RB_DL=25,osf=1;
uint32_t perfect_ce = 0; uint32_t perfect_ce = 0;
lte_frame_type_t frame_type = FDD; lte_frame_type_t frame_type = FDD;
uint32_t Nsoft = 1827072; uint32_t Nsoft = 1827072;
/* /*
#ifdef XFORMS #ifdef XFORMS
FD_lte_phy_scope_ue *form_ue; FD_lte_phy_scope_ue *form_ue;
char title[255]; char title[255];
@@ -113,114 +96,110 @@ int main(int argc, char **argv)
form_ue = create_lte_phy_scope_ue(); form_ue = create_lte_phy_scope_ue();
sprintf (title, "LTE DL SCOPE UE"); sprintf (title, "LTE DL SCOPE UE");
fl_show_form (form_ue->lte_phy_scope_ue, FL_PLACE_HOTSPOT, FL_FULLBORDER, title); fl_show_form (form_ue->lte_phy_scope_ue, FL_PLACE_HOTSPOT, FL_FULLBORDER, title);
#endif #endif
*/ */
cpuf = get_cpu_freq_GHz(); cpuf = get_cpu_freq_GHz();
logInit(); logInit();
number_of_cards = 1; number_of_cards = 1;
while ((c = getopt (argc, argv, "ahA:Cp:n:s:S:t:x:y:z:N:F:R:O:dm:i:Y")) != -1) { while ((c = getopt (argc, argv, "ahA:Cp:n:s:S:t:x:y:z:N:F:R:O:dm:i:Y")) != -1) {
switch (c) { switch (c) {
case 'a': case 'a':
awgn_flag=1; awgn_flag=1;
break; break;
case 'd': case 'd':
frame_type = 0; frame_type = 0;
break; break;
case 'n': case 'n':
n_frames = atoi(optarg); n_frames = atoi(optarg);
break; break;
case 'm': case 'm':
mcs=atoi(optarg); mcs=atoi(optarg);
break; break;
case 's': case 's':
snr0 = atof(optarg); snr0 = atof(optarg);
msg("Setting SNR0 to %f\n",snr0); msg("Setting SNR0 to %f\n",snr0);
break; break;
case 'i': case 'i':
input_snr_step = atof(optarg); input_snr_step = atof(optarg);
break; break;
case 'S': case 'S':
snr1 = atof(optarg); snr1 = atof(optarg);
snr1set=1; snr1set=1;
msg("Setting SNR1 to %f\n",snr1); msg("Setting SNR1 to %f\n",snr1);
break; break;
case 'p': // subframe no; case 'p': // subframe no;
subframe=atoi(optarg); subframe=atoi(optarg);
break; break;
case 'z': case 'z':
n_rx=atoi(optarg); n_rx=atoi(optarg);
if ((n_rx==0) || (n_rx>2)) { if ((n_rx==0) || (n_rx>2)) {
msg("Unsupported number of rx antennas %d\n",n_rx); msg("Unsupported number of rx antennas %d\n",n_rx);
exit(-1); exit(-1);
} }
break; break;
case 'N': case 'N':
Nid_cell = atoi(optarg); Nid_cell = atoi(optarg);
break; break;
case 'R': case 'R':
N_RB_DL = atoi(optarg); N_RB_DL = atoi(optarg);
if ((N_RB_DL!=6) && (N_RB_DL!=25) && (N_RB_DL!=50) && (N_RB_DL!=100)) { if ((N_RB_DL!=6) && (N_RB_DL!=25) && (N_RB_DL!=50) && (N_RB_DL!=100)) {
printf("Unsupported Bandwidth %d\n",N_RB_DL); printf("Unsupported Bandwidth %d\n",N_RB_DL);
exit(-1); exit(-1);
} }
break; break;
case 'O': case 'O':
osf = atoi(optarg); osf = atoi(optarg);
break; break;
case 'Y': case 'Y':
perfect_ce = 1; perfect_ce = 1;
break; break;
default: default:
case 'h': case 'h':
printf("%s -h(elp) -p(subframe) -N cell_id -g channel_model -n n_frames -t Delayspread -s snr0 -S snr1 -i snr increment -z RXant \n",argv[0]); printf("%s -h(elp) -p(subframe) -N cell_id -g channel_model -n n_frames -t Delayspread -s snr0 -S snr1 -i snr increment -z RXant \n",argv[0]);
printf("-h This message\n"); printf("-h This message\n");
printf("-a Use AWGN Channel\n"); printf("-a Use AWGN Channel\n");
printf("-p Use extended prefix mode\n"); printf("-p Use extended prefix mode\n");
printf("-d Use TDD\n"); printf("-d Use TDD\n");
printf("-n Number of frames to simulate\n"); printf("-n Number of frames to simulate\n");
printf("-s Starting SNR, runs from SNR0 to SNR0 + 5 dB. If n_frames is 1 then just SNR is simulated\n"); printf("-s Starting SNR, runs from SNR0 to SNR0 + 5 dB. If n_frames is 1 then just SNR is simulated\n");
printf("-S Ending SNR, runs from SNR0 to SNR1\n"); printf("-S Ending SNR, runs from SNR0 to SNR1\n");
printf("-t Delay spread for multipath channel\n"); printf("-t Delay spread for multipath channel\n");
printf("-g [A,B,C,D,E,F,G] Use 3GPP SCM (A,B,C,D) or 36-101 (E-EPA,F-EVA,G-ETU) models (ignores delay spread and Ricean factor)\n"); printf("-g [A,B,C,D,E,F,G] Use 3GPP SCM (A,B,C,D) or 36-101 (E-EPA,F-EVA,G-ETU) models (ignores delay spread and Ricean factor)\n");
printf("-x Transmission mode (1,2,6 for the moment)\n"); printf("-x Transmission mode (1,2,6 for the moment)\n");
printf("-y Number of TX antennas used in eNB\n"); printf("-y Number of TX antennas used in eNB\n");
printf("-z Number of RX antennas used in UE\n"); printf("-z Number of RX antennas used in UE\n");
printf("-i Relative strength of first intefering eNB (in dB) - cell_id mod 3 = 1\n"); printf("-i Relative strength of first intefering eNB (in dB) - cell_id mod 3 = 1\n");
printf("-j Relative strength of second intefering eNB (in dB) - cell_id mod 3 = 2\n"); printf("-j Relative strength of second intefering eNB (in dB) - cell_id mod 3 = 2\n");
printf("-N Nid_cell\n"); printf("-N Nid_cell\n");
printf("-R N_RB_DL\n"); printf("-R N_RB_DL\n");
printf("-O oversampling factor (1,2,4,8,16)\n"); printf("-O oversampling factor (1,2,4,8,16)\n");
printf("-A Interpolation_filname Run with Abstraction to generate Scatter plot using interpolation polynomial in file\n"); printf("-A Interpolation_filname Run with Abstraction to generate Scatter plot using interpolation polynomial in file\n");
printf("-C Generate Calibration information for Abstraction (effective SNR adjustment to remove Pe bias w.r.t. AWGN)\n"); printf("-C Generate Calibration information for Abstraction (effective SNR adjustment to remove Pe bias w.r.t. AWGN)\n");
printf("-f Output filename (.txt format) for Pe/SNR results\n"); printf("-f Output filename (.txt format) for Pe/SNR results\n");
printf("-F Input filename (.txt format) for RX conformance testing\n"); printf("-F Input filename (.txt format) for RX conformance testing\n");
exit (-1); exit (-1);
break; break;
} }
} }
if (awgn_flag == 1) if (awgn_flag == 1)
channel_model = AWGN; channel_model = AWGN;
@@ -229,7 +208,6 @@ int main(int argc, char **argv)
if ((subframe == 0) || (subframe == 5) || // TDD and FDD SFn 0,5; if ((subframe == 0) || (subframe == 5) || // TDD and FDD SFn 0,5;
((frame_type == FDD) && ((subframe == 4) || (subframe == 9))) || // FDD SFn 4,9; ((frame_type == FDD) && ((subframe == 4) || (subframe == 9))) || // FDD SFn 4,9;
((frame_type == TDD ) && ((subframe<3) || (subframe==6)))) { // TDD SFn 1,2,6; ((frame_type == TDD ) && ((subframe<3) || (subframe==6)))) { // TDD SFn 1,2,6;
printf("Illegal subframe %d for eMBMS transmission (frame_type %d)\n",subframe,frame_type); printf("Illegal subframe %d for eMBMS transmission (frame_type %d)\n",subframe,frame_type);
exit(-1); exit(-1);
} }
@@ -239,16 +217,16 @@ int main(int argc, char **argv)
lte_param_init(n_tx, lte_param_init(n_tx,
n_tx, n_tx,
n_rx, n_rx,
transmission_mode, transmission_mode,
extended_prefix_flag, extended_prefix_flag,
frame_type, frame_type,
Nid_cell, Nid_cell,
tdd_config, tdd_config,
N_RB_DL, N_RB_DL,
0, 0,
osf, osf,
perfect_ce); perfect_ce);
if (snr1set==0) { if (snr1set==0) {
if (n_frames==1) if (n_frames==1)
@@ -258,7 +236,6 @@ int main(int argc, char **argv)
} }
printf("SNR0 %f, SNR1 %f\n",snr0,snr1); printf("SNR0 %f, SNR1 %f\n",snr0,snr1);
frame_parms = &eNB->frame_parms; frame_parms = &eNB->frame_parms;
if (awgn_flag == 0) if (awgn_flag == 0)
@@ -270,7 +247,6 @@ int main(int argc, char **argv)
printf("Cannot open %s, check permissions\n",fname); printf("Cannot open %s, check permissions\n",fname);
exit(-1); exit(-1);
} }
if (awgn_flag==0) if (awgn_flag==0)
fprintf(fd,"SNR_%d_%d=[];errs_mch_%d_%d=[];mch_trials_%d_%d=[];\n", fprintf(fd,"SNR_%d_%d=[];errs_mch_%d_%d=[];mch_trials_%d_%d=[];\n",
@@ -284,23 +260,18 @@ int main(int argc, char **argv)
mcs,N_RB_DL); mcs,N_RB_DL);
fflush(fd); fflush(fd);
txdata = eNB->common_vars.txdata[0]; txdata = eNB->common_vars.txdata[0];
nsymb = 12; nsymb = 12;
printf("FFT Size %d, Extended Prefix %d, Samples per subframe %d, Symbols per subframe %d, AWGN %d\n",NUMBER_OF_OFDM_CARRIERS, printf("FFT Size %d, Extended Prefix %d, Samples per subframe %d, Symbols per subframe %d, AWGN %d\n",NUMBER_OF_OFDM_CARRIERS,
frame_parms->Ncp,frame_parms->samples_per_tti,nsymb,awgn_flag); frame_parms->Ncp,frame_parms->samples_per_tti,nsymb,awgn_flag);
eNB2UE = new_channel_desc_scm(eNB->frame_parms.nb_antennas_tx, eNB2UE = new_channel_desc_scm(eNB->frame_parms.nb_antennas_tx,
UE->frame_parms.nb_antennas_rx, UE->frame_parms.nb_antennas_rx,
channel_model, channel_model,
N_RB2sampling_rate(eNB->frame_parms.N_RB_DL), N_RB2sampling_rate(eNB->frame_parms.N_RB_DL),
N_RB2channel_bandwidth(eNB->frame_parms.N_RB_DL), N_RB2channel_bandwidth(eNB->frame_parms.N_RB_DL),
0, 0,
0, 0,
0); 0);
// Create transport channel structures for 2 transport blocks (MIMO) // Create transport channel structures for 2 transport blocks (MIMO)
eNB->dlsch_MCH = new_eNB_dlsch(1,8,Nsoft,N_RB_DL,0,&eNB->frame_parms); eNB->dlsch_MCH = new_eNB_dlsch(1,8,Nsoft,N_RB_DL,0,&eNB->frame_parms);
@@ -310,7 +281,6 @@ int main(int argc, char **argv)
} }
UE->dlsch_MCH[0] = new_ue_dlsch(1,8,Nsoft,MAX_TURBO_ITERATIONS_MBSFN,N_RB_DL,0); UE->dlsch_MCH[0] = new_ue_dlsch(1,8,Nsoft,MAX_TURBO_ITERATIONS_MBSFN,N_RB_DL,0);
eNB->frame_parms.num_MBSFN_config = 1; eNB->frame_parms.num_MBSFN_config = 1;
eNB->frame_parms.MBSFN_config[0].radioframeAllocationPeriod = 0; eNB->frame_parms.MBSFN_config[0].radioframeAllocationPeriod = 0;
eNB->frame_parms.MBSFN_config[0].radioframeAllocationOffset = 0; eNB->frame_parms.MBSFN_config[0].radioframeAllocationOffset = 0;
@@ -321,7 +291,6 @@ int main(int argc, char **argv)
UE->frame_parms.MBSFN_config[0].radioframeAllocationOffset = 0; UE->frame_parms.MBSFN_config[0].radioframeAllocationOffset = 0;
UE->frame_parms.MBSFN_config[0].fourFrames_flag = 0; UE->frame_parms.MBSFN_config[0].fourFrames_flag = 0;
UE->frame_parms.MBSFN_config[0].mbsfn_SubframeConfig=0xff; // activate all possible subframes UE->frame_parms.MBSFN_config[0].mbsfn_SubframeConfig=0xff; // activate all possible subframes
fill_eNB_dlsch_MCH(eNB,mcs,1,0); fill_eNB_dlsch_MCH(eNB,mcs,1,0);
fill_UE_dlsch_MCH(UE,mcs,1,0,0); fill_UE_dlsch_MCH(UE,mcs,1,0,0);
@@ -333,7 +302,6 @@ int main(int argc, char **argv)
exit(-1); exit(-1);
} }
input_buffer_length = eNB->dlsch_MCH->harq_processes[0]->TBS/8; input_buffer_length = eNB->dlsch_MCH->harq_processes[0]->TBS/8;
input_buffer = (unsigned char *)malloc(input_buffer_length+4); input_buffer = (unsigned char *)malloc(input_buffer_length+4);
memset(input_buffer,0,input_buffer_length+4); memset(input_buffer,0,input_buffer_length+4);
@@ -342,14 +310,12 @@ int main(int argc, char **argv)
input_buffer[i]= (unsigned char)(taus()&0xff); input_buffer[i]= (unsigned char)(taus()&0xff);
} }
snr_step = input_snr_step; snr_step = input_snr_step;
for (SNR=snr0; SNR<snr1; SNR+=snr_step) { for (SNR=snr0; SNR<snr1; SNR+=snr_step) {
UE->proc.proc_rxtx[0].frame_tx=0; UE->proc.proc_rxtx[0].frame_tx=0;
eNB->proc.proc_rxtx[0].frame_tx=0; eNB->proc.proc_rxtx[0].frame_tx=0;
eNB->proc.proc_rxtx[0].subframe_tx=subframe; eNB->proc.proc_rxtx[0].subframe_tx=subframe;
errs[0]=0; errs[0]=0;
errs[1]=0; errs[1]=0;
errs[2]=0; errs[2]=0;
@@ -365,14 +331,11 @@ int main(int argc, char **argv)
// printf("Trial %d\n",trials); // printf("Trial %d\n",trials);
fflush(stdout); fflush(stdout);
round=0; round=0;
//if (trials%100==0) //if (trials%100==0)
//eNB2UE[0]->first_run = 1; //eNB2UE[0]->first_run = 1;
eNB2UE->first_run = 1; eNB2UE->first_run = 1;
memset(&eNB->common_vars.txdataF[0][0][0],0,FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX*sizeof(int32_t)); memset(&eNB->common_vars.txdataF[0][0][0],0,FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX*sizeof(int32_t));
generate_mch(eNB,&eNB->proc.proc_rxtx[0],input_buffer); generate_mch(eNB,&eNB->proc.proc_rxtx[0],input_buffer);
PHY_ofdm_mod(eNB->common_vars.txdataF[0][0], // input, PHY_ofdm_mod(eNB->common_vars.txdataF[0][0], // input,
txdata[0], // output txdata[0], // output
frame_parms->ofdm_symbol_size, frame_parms->ofdm_symbol_size,
@@ -382,7 +345,7 @@ int main(int argc, char **argv)
if (n_frames==1) { if (n_frames==1) {
LOG_M("txsigF0.m","txsF0", &eNB->common_vars.txdataF[0][0][subframe*nsymb*eNB->frame_parms.ofdm_symbol_size], LOG_M("txsigF0.m","txsF0", &eNB->common_vars.txdataF[0][0][subframe*nsymb*eNB->frame_parms.ofdm_symbol_size],
nsymb*eNB->frame_parms.ofdm_symbol_size,1,1); nsymb*eNB->frame_parms.ofdm_symbol_size,1,1);
//if (eNB->frame_parms.nb_antennas_tx>1) //if (eNB->frame_parms.nb_antennas_tx>1)
//LOG_M("txsigF1.m","txsF1", &eNB->lte_eNB_common_vars.txdataF[eNB_id][1][subframe*nsymb*eNB->frame_parms.ofdm_symbol_size],nsymb*eNB->frame_parms.ofdm_symbol_size,1,1); //LOG_M("txsigF1.m","txsF1", &eNB->lte_eNB_common_vars.txdataF[eNB_id][1][subframe*nsymb*eNB->frame_parms.ofdm_symbol_size],nsymb*eNB->frame_parms.ofdm_symbol_size,1,1);
} }
@@ -400,11 +363,9 @@ int main(int argc, char **argv)
if (n_frames==1) { if (n_frames==1) {
printf("tx_lev = %d (%d dB)\n",tx_lev,tx_lev_dB); printf("tx_lev = %d (%d dB)\n",tx_lev,tx_lev_dB);
// LOG_M("txsig0.m","txs0", &eNB->common_vars.txdata[0][0][subframe* eNB->frame_parms.samples_per_tti], // LOG_M("txsig0.m","txs0", &eNB->common_vars.txdata[0][0][subframe* eNB->frame_parms.samples_per_tti],
// eNB->frame_parms.samples_per_tti,1,1); // eNB->frame_parms.samples_per_tti,1,1);
} }
for (i=0; i<2*frame_parms->samples_per_tti; i++) { for (i=0; i<2*frame_parms->samples_per_tti; i++) {
for (aa=0; aa<eNB->frame_parms.nb_antennas_tx; aa++) { for (aa=0; aa<eNB->frame_parms.nb_antennas_tx; aa++) {
s_re[aa][i] = ((double)(((short *)eNB->common_vars.txdata[0][aa]))[(2*subframe*UE->frame_parms.samples_per_tti) + (i<<1)]); s_re[aa][i] = ((double)(((short *)eNB->common_vars.txdata[0][aa]))[(2*subframe*UE->frame_parms.samples_per_tti) + (i<<1)]);
@@ -415,7 +376,6 @@ int main(int argc, char **argv)
//Multipath channel //Multipath channel
multipath_channel(eNB2UE,s_re,s_im,r_re,r_im, multipath_channel(eNB2UE,s_re,s_im,r_re,r_im,
2*frame_parms->samples_per_tti,hold_channel); 2*frame_parms->samples_per_tti,hold_channel);
//AWGN //AWGN
sigma2_dB = 10*log10((double)tx_lev) +10*log10((double)eNB->frame_parms.ofdm_symbol_size/(NB_RB*12)) - SNR; sigma2_dB = 10*log10((double)tx_lev) +10*log10((double)eNB->frame_parms.ofdm_symbol_size/(NB_RB*12)) - SNR;
sigma2 = pow(10,sigma2_dB/10); sigma2 = pow(10,sigma2_dB/10);
@@ -426,67 +386,70 @@ int main(int argc, char **argv)
for (i=0; i<2*frame_parms->samples_per_tti; i++) { for (i=0; i<2*frame_parms->samples_per_tti; i++) {
for (aa=0; aa<eNB->frame_parms.nb_antennas_rx; aa++) { for (aa=0; aa<eNB->frame_parms.nb_antennas_rx; aa++) {
//printf("s_re[0][%d]=> %f , r_re[0][%d]=> %f\n",i,s_re[aa][i],i,r_re[aa][i]); //printf("s_re[0][%d]=> %f , r_re[0][%d]=> %f\n",i,s_re[aa][i],i,r_re[aa][i]);
((short*) UE->common_vars.rxdata[aa])[(2*subframe*UE->frame_parms.samples_per_tti)+2*i] = ((short *) UE->common_vars.rxdata[aa])[(2*subframe*UE->frame_parms.samples_per_tti)+2*i] =
(short) (r_re[aa][i] + sqrt(sigma2/2)*gaussdouble(0.0,1.0)); (short) (r_re[aa][i] + sqrt(sigma2/2)*gaussdouble(0.0,1.0));
((short*) UE->common_vars.rxdata[aa])[(2*subframe*UE->frame_parms.samples_per_tti)+2*i+1] = ((short *) UE->common_vars.rxdata[aa])[(2*subframe*UE->frame_parms.samples_per_tti)+2*i+1] =
(short) (r_im[aa][i] + (iqim*r_re[aa][i]) + sqrt(sigma2/2)*gaussdouble(0.0,1.0)); (short) (r_im[aa][i] + (iqim*r_re[aa][i]) + sqrt(sigma2/2)*gaussdouble(0.0,1.0));
} }
} }
for (l=2; l<12; l++) { for (l=2; l<12; l++) {
slot_fep_mbsfn(UE, slot_fep_mbsfn(UE,
l, l,
subframe%10, subframe%10,
0, 0,
0); 0);
if (UE->perfect_ce==1) {
// fill in perfect channel estimates
freq_channel(eNB2UE,UE->frame_parms.N_RB_DL,12*UE->frame_parms.N_RB_DL + 1);
for(k=0; k<NUMBER_OF_eNB_MAX; k++) {
for(aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
for (i=0; i<frame_parms->N_RB_DL*12; i++) {
((int16_t *) UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[k][(aa<<1)+aarx])[2*i+(l*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(int16_t)(eNB2UE->chF[aarx+(aa*frame_parms->nb_antennas_rx)][i].x*AMP);
((int16_t *) UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[k][(aa<<1)+aarx])[2*i+1+(l*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(int16_t)(eNB2UE->chF[aarx+(aa*frame_parms->nb_antennas_rx)][i].y*AMP);
}
}
}
}
}
if (l==6) if (UE->perfect_ce==1) {
for (l2=2;l2<7;l2++) // fill in perfect channel estimates
rx_pmch(UE, freq_channel(eNB2UE,UE->frame_parms.N_RB_DL,12*UE->frame_parms.N_RB_DL + 1);
0,
subframe%10, for(k=0; k<NUMBER_OF_eNB_MAX; k++) {
l2); for(aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
if (l==6) for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
for (l2=2;l2<7;l2++) for (i=0; i<frame_parms->N_RB_DL*12; i++) {
rx_pmch(UE, ((int16_t *) UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[k][(aa<<1)+aarx])[2*i+(l*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(int16_t)(eNB2UE->chF[aarx+
0, (aa*frame_parms->nb_antennas_rx)][i].x*AMP);
subframe%10, ((int16_t *) UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[k][(aa<<1)+aarx])[2*i+1+(l*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(int16_t)(eNB2UE->chF[aarx+
l2); (aa*frame_parms->nb_antennas_rx)][i].y*AMP);
if (l==11) }
for (l2=7;l2<12;l2++) }
rx_pmch(UE, }
0, }
subframe%10, }
l2);
if (l==6)
for (l2=2; l2<7; l2++)
rx_pmch(UE,
0,
subframe%10,
l2);
if (l==6)
for (l2=2; l2<7; l2++)
rx_pmch(UE,
0,
subframe%10,
l2);
if (l==11)
for (l2=7; l2<12; l2++)
rx_pmch(UE,
0,
subframe%10,
l2);
} }
UE->dlsch_MCH[0]->harq_processes[0]->G = get_G(&UE->frame_parms, UE->dlsch_MCH[0]->harq_processes[0]->G = get_G(&UE->frame_parms,
UE->dlsch_MCH[0]->harq_processes[0]->nb_rb, UE->dlsch_MCH[0]->harq_processes[0]->nb_rb,
UE->dlsch_MCH[0]->harq_processes[0]->rb_alloc_even, UE->dlsch_MCH[0]->harq_processes[0]->rb_alloc_even,
get_Qm(UE->dlsch_MCH[0]->harq_processes[0]->mcs), get_Qm(UE->dlsch_MCH[0]->harq_processes[0]->mcs),
1,2, 1,2,
UE->proc.proc_rxtx[0].frame_tx,subframe,0); UE->proc.proc_rxtx[0].frame_tx,subframe,0);
UE->dlsch_MCH[0]->harq_processes[0]->Qm = get_Qm(UE->dlsch_MCH[0]->harq_processes[0]->mcs); UE->dlsch_MCH[0]->harq_processes[0]->Qm = get_Qm(UE->dlsch_MCH[0]->harq_processes[0]->mcs);
dlsch_unscrambling(&UE->frame_parms,1,UE->dlsch_MCH[0], dlsch_unscrambling(&UE->frame_parms,1,UE->dlsch_MCH[0],
UE->dlsch_MCH[0]->harq_processes[0]->G, UE->dlsch_MCH[0]->harq_processes[0]->G,
UE->pdsch_vars_MCH[0]->llr[0],0,subframe<<1); UE->pdsch_vars_MCH[0]->llr[0],0,subframe<<1);
ret = dlsch_decoding(UE, ret = dlsch_decoding(UE,
UE->pdsch_vars_MCH[0]->llr[0], UE->pdsch_vars_MCH[0]->llr[0],
&UE->frame_parms, &UE->frame_parms,
@@ -497,7 +460,7 @@ int main(int argc, char **argv)
0,0,0); 0,0,0);
if (n_frames==1) if (n_frames==1)
printf("MCH decoding returns %d\n",ret); printf("MCH decoding returns %u\n",ret);
if (ret == (1+UE->dlsch_MCH[0]->max_turbo_iterations)) if (ret == (1+UE->dlsch_MCH[0]->max_turbo_iterations))
errs[0]++; errs[0]++;
@@ -506,15 +469,15 @@ int main(int argc, char **argv)
eNB->proc.proc_rxtx[0].frame_tx++; eNB->proc.proc_rxtx[0].frame_tx++;
} }
printf("errors %d/%d (Pe %e)\n",errs[round],trials,(double)errs[round]/trials); printf("errors %u/%u (Pe %e)\n",errs[round],trials,(double)errs[round]/trials);
if (awgn_flag==0) if (awgn_flag==0)
fprintf(fd,"SNR_%d_%d = [SNR_%d_%d %f]; errs_mch_%d_%d =[errs_mch_%d_%d %d]; mch_trials_%d_%d =[mch_trials_%d_%d %d];\n", fprintf(fd,"SNR_%d_%d = [SNR_%d_%d %f]; errs_mch_%d_%d =[errs_mch_%d_%d %u]; mch_trials_%d_%d =[mch_trials_%d_%d %u];\n",
mcs,N_RB_DL,mcs,N_RB_DL,SNR, mcs,N_RB_DL,mcs,N_RB_DL,SNR,
mcs,N_RB_DL,mcs,N_RB_DL,errs[0], mcs,N_RB_DL,mcs,N_RB_DL,errs[0],
mcs,N_RB_DL,mcs,N_RB_DL,trials); mcs,N_RB_DL,mcs,N_RB_DL,trials);
else else
fprintf(fd,"SNR_awgn_%d = [SNR_awgn_%d %f]; errs_mch_awgn_%d =[errs_mch_awgn_%d %d]; mch_trials_awgn_%d =[mch_trials_awgn_%d %d];\n", fprintf(fd,"SNR_awgn_%d = [SNR_awgn_%d %f]; errs_mch_awgn_%d =[errs_mch_awgn_%d %u]; mch_trials_awgn_%d =[mch_trials_awgn_%d %u];\n",
N_RB_DL,N_RB_DL,SNR, N_RB_DL,N_RB_DL,SNR,
N_RB_DL,N_RB_DL,errs[0], N_RB_DL,N_RB_DL,errs[0],
N_RB_DL,N_RB_DL,trials); N_RB_DL,N_RB_DL,trials);
@@ -525,7 +488,6 @@ int main(int argc, char **argv)
break; break;
} }
if (n_frames==1) { if (n_frames==1) {
printf("Dumping PMCH files ( G %d)\n",UE->dlsch_MCH[0]->harq_processes[0]->G); printf("Dumping PMCH files ( G %d)\n",UE->dlsch_MCH[0]->harq_processes[0]->G);
dump_mch(UE,0, dump_mch(UE,0,
@@ -536,9 +498,7 @@ int main(int argc, char **argv)
printf("Freeing dlsch structures\n"); printf("Freeing dlsch structures\n");
free_eNB_dlsch(eNB->dlsch_MCH); free_eNB_dlsch(eNB->dlsch_MCH);
free_ue_dlsch(UE->dlsch_MCH[0]); free_ue_dlsch(UE->dlsch_MCH[0]);
fclose(fd); fclose(fd);
return(0); return(0);
} }
+175 -246
View File
@@ -37,7 +37,7 @@
#include "LAYER2/MAC/vars.h" #include "LAYER2/MAC/vars.h"
#ifdef XFORMS #ifdef XFORMS
#include "PHY/TOOLS/lte_phy_scope.h" #include "PHY/TOOLS/lte_phy_scope.h"
#endif #endif
#include "OCG_vars.h" #include "OCG_vars.h"
@@ -58,11 +58,8 @@ int32_t dummy2[2048*14];
int32_t dummy3[2048*14]; int32_t dummy3[2048*14];
int main(int argc, char **argv) int main(int argc, char **argv) {
{
char c; char c;
int i,l,aa; int i,l,aa;
double sigma2, sigma2_dB=0,SNR,snr0=-2.0,snr1; double sigma2, sigma2_dB=0,SNR,snr0=-2.0,snr1;
uint8_t snr1set=0; uint8_t snr1set=0;
@@ -81,127 +78,119 @@ int main(int argc, char **argv)
int trial, n_trials, ntrials=1, n_errors,n_errors2,n_alamouti; int trial, n_trials, ntrials=1, n_errors,n_errors2,n_alamouti;
uint8_t transmission_mode = 1,n_tx=1,n_rx=1; uint8_t transmission_mode = 1,n_tx=1,n_rx=1;
uint16_t Nid_cell=0; uint16_t Nid_cell=0;
int n_frames=1; int n_frames=1;
channel_desc_t *eNB2UE,*eNB2UE1 = NULL,*eNB2UE2 = NULL; channel_desc_t *eNB2UE,*eNB2UE1 = NULL,*eNB2UE2 = NULL;
uint32_t nsymb,tx_lev,tx_lev1 = 0,tx_lev2 = 0; uint32_t nsymb,tx_lev,tx_lev1 = 0,tx_lev2 = 0;
uint8_t extended_prefix_flag=0; uint8_t extended_prefix_flag=0;
int8_t interf1=-21,interf2=-21; int8_t interf1=-21,interf2=-21;
LTE_DL_FRAME_PARMS *frame_parms; LTE_DL_FRAME_PARMS *frame_parms;
FILE *input_fd=NULL,*pbch_file_fd=NULL; FILE *input_fd=NULL,*pbch_file_fd=NULL;
char input_val_str[50],input_val_str2[50]; char input_val_str[50],input_val_str2[50];
// double input_val1,input_val2; // double input_val1,input_val2;
// uint16_t amask=0; // uint16_t amask=0;
uint8_t frame_mod4,num_pdcch_symbols = 0; uint8_t frame_mod4,num_pdcch_symbols = 0;
uint16_t NB_RB=25; uint16_t NB_RB=25;
SCM_t channel_model=AWGN;//Rayleigh1_anticorr; SCM_t channel_model=AWGN;//Rayleigh1_anticorr;
//DCI_ALLOC_t dci_alloc[8]; //DCI_ALLOC_t dci_alloc[8];
uint8_t abstraction_flag=0;//,calibration_flag=0; uint8_t abstraction_flag=0;//,calibration_flag=0;
double pbch_sinr; double pbch_sinr;
int pbch_tx_ant; int pbch_tx_ant;
uint8_t N_RB_DL=25,osf=1; uint8_t N_RB_DL=25,osf=1;
unsigned char frame_type = 0; unsigned char frame_type = 0;
unsigned char pbch_phase = 0; unsigned char pbch_phase = 0;
#ifdef XFORMS #ifdef XFORMS
FD_lte_phy_scope_ue *form_ue; FD_lte_phy_scope_ue *form_ue;
char title[255]; char title[255];
#endif #endif
cpuf = get_cpu_freq_GHz(); cpuf = get_cpu_freq_GHz();
logInit(); logInit();
number_of_cards = 1; number_of_cards = 1;
while ((c = getopt (argc, argv, "f:hA:pf:g:i:j:n:s:S:t:x:y:z:N:F:GR:O:dP:")) != -1) { while ((c = getopt (argc, argv, "f:hA:pf:g:i:j:n:s:S:t:x:y:z:N:F:GR:O:dP:")) != -1) {
switch (c) { switch (c) {
case 'f': case 'f':
write_output_file=1; write_output_file=1;
output_fd = fopen(optarg,"w"); output_fd = fopen(optarg,"w");
if (output_fd==NULL) { if (output_fd==NULL) {
printf("Error opening %s\n",optarg); printf("Error opening %s\n",optarg);
exit(-1); exit(-1);
} }
break;
case 'd':
frame_type = 1;
break;
case 'g':
switch((char)*optarg) {
case 'A':
channel_model=SCM_A;
break; break;
case 'B': case 'd':
channel_model=SCM_B; frame_type = 1;
break; break;
case 'C': case 'g':
channel_model=SCM_C; switch((char)*optarg) {
case 'A':
channel_model=SCM_A;
break;
case 'B':
channel_model=SCM_B;
break;
case 'C':
channel_model=SCM_C;
break;
case 'D':
channel_model=SCM_D;
break;
case 'E':
channel_model=EPA;
break;
case 'F':
channel_model=EVA;
break;
case 'G':
channel_model=ETU;
break;
default:
msg("Unsupported channel model!\n");
exit(-1);
}
break; break;
case 'D': case 'i':
channel_model=SCM_D; interf1=atoi(optarg);
break; break;
case 'E': case 'j':
channel_model=EPA; interf2=atoi(optarg);
break; break;
case 'F': case 'n':
channel_model=EVA; n_frames = atoi(optarg);
break; break;
case 'G': case 's':
channel_model=ETU; snr0 = atof(optarg);
msg("Setting SNR0 to %f\n",snr0);
break; break;
default: case 'S':
msg("Unsupported channel model!\n"); snr1 = atof(optarg);
exit(-1); snr1set=1;
} msg("Setting SNR1 to %f\n",snr1);
break;
break;
case 'i':
interf1=atoi(optarg);
break;
case 'j':
interf2=atoi(optarg);
break;
case 'n':
n_frames = atoi(optarg);
break;
case 's':
snr0 = atof(optarg);
msg("Setting SNR0 to %f\n",snr0);
break;
case 'S':
snr1 = atof(optarg);
snr1set=1;
msg("Setting SNR1 to %f\n",snr1);
break;
/* /*
case 't': case 't':
Td= atof(optarg); Td= atof(optarg);
break; break;
*/ */
case 'p': case 'p':
extended_prefix_flag=1; extended_prefix_flag=1;
break; break;
/* /*
case 'r': case 'r':
@@ -212,111 +201,111 @@ int main(int argc, char **argv)
} }
break; break;
*/ */
case 'x': case 'x':
transmission_mode=atoi(optarg); transmission_mode=atoi(optarg);
if ((transmission_mode!=1) && if ((transmission_mode!=1) &&
(transmission_mode!=2) && (transmission_mode!=2) &&
(transmission_mode!=6)) { (transmission_mode!=6)) {
msg("Unsupported transmission mode %d\n",transmission_mode); msg("Unsupported transmission mode %d\n",transmission_mode);
exit(-1); exit(-1);
} }
break; break;
case 'y': case 'y':
n_tx=atoi(optarg); n_tx=atoi(optarg);
if ((n_tx==0) || (n_tx>2)) { if ((n_tx==0) || (n_tx>2)) {
msg("Unsupported number of tx antennas %d\n",n_tx); msg("Unsupported number of tx antennas %d\n",n_tx);
exit(-1); exit(-1);
} }
break; break;
case 'z': case 'z':
n_rx=atoi(optarg); n_rx=atoi(optarg);
if ((n_rx==0) || (n_rx>2)) { if ((n_rx==0) || (n_rx>2)) {
msg("Unsupported number of rx antennas %d\n",n_rx); msg("Unsupported number of rx antennas %d\n",n_rx);
exit(-1); exit(-1);
} }
break; break;
case 'A': case 'A':
abstraction_flag=1; abstraction_flag=1;
ntrials=10000; ntrials=10000;
msg("Running Abstraction test\n"); msg("Running Abstraction test\n");
pbch_file_fd=fopen(optarg,"r"); pbch_file_fd=fopen(optarg,"r");
if (pbch_file_fd==NULL) { if (pbch_file_fd==NULL) {
printf("Problem with filename %s\n",optarg); printf("Problem with filename %s\n",optarg);
exit(-1); exit(-1);
} }
break; break;
// case 'C': // case 'C':
// calibration_flag=1; // calibration_flag=1;
// msg("Running Abstraction calibration for Bias removal\n"); // msg("Running Abstraction calibration for Bias removal\n");
// break; // break;
case 'N': case 'N':
Nid_cell = atoi(optarg); Nid_cell = atoi(optarg);
break; break;
case 'R': case 'R':
N_RB_DL = atoi(optarg); N_RB_DL = atoi(optarg);
break; break;
case 'O': case 'O':
osf = atoi(optarg); osf = atoi(optarg);
break; break;
case 'F': case 'F':
input_fd = fopen(optarg,"r"); input_fd = fopen(optarg,"r");
if (input_fd==NULL) { if (input_fd==NULL) {
printf("Problem with filename %s\n",optarg); printf("Problem with filename %s\n",optarg);
exit(-1); exit(-1);
} }
break; break;
case 'P': case 'P':
pbch_phase = atoi(optarg); pbch_phase = atoi(optarg);
if (pbch_phase>3) if (pbch_phase>3)
printf("Illegal PBCH phase (0-3) got %d\n",pbch_phase); printf("Illegal PBCH phase (0-3) got %d\n",pbch_phase);
break; break;
default: default:
case 'h': case 'h':
printf("%s -h(elp) -p(extended_prefix) -N cell_id -f output_filename -F input_filename -g channel_model -n n_frames -t Delayspread -s snr0 -S snr1 -x transmission_mode -y TXant -z RXant -i Intefrence0 -j Interference1 -A interpolation_file -C(alibration offset dB) -N CellId\n", printf("%s -h(elp) -p(extended_prefix) -N cell_id -f output_filename -F input_filename -g channel_model -n n_frames -t Delayspread -s snr0 -S snr1 -x transmission_mode -y TXant -z RXant -i Intefrence0 -j Interference1 -A interpolation_file -C(alibration offset dB) -N CellId\n",
argv[0]); argv[0]);
printf("-h This message\n"); printf("-h This message\n");
printf("-p Use extended prefix mode\n"); printf("-p Use extended prefix mode\n");
printf("-d Use TDD\n"); printf("-d Use TDD\n");
printf("-n Number of frames to simulate\n"); printf("-n Number of frames to simulate\n");
printf("-s Starting SNR, runs from SNR0 to SNR0 + 5 dB. If n_frames is 1 then just SNR is simulated\n"); printf("-s Starting SNR, runs from SNR0 to SNR0 + 5 dB. If n_frames is 1 then just SNR is simulated\n");
printf("-S Ending SNR, runs from SNR0 to SNR1\n"); printf("-S Ending SNR, runs from SNR0 to SNR1\n");
printf("-t Delay spread for multipath channel\n"); printf("-t Delay spread for multipath channel\n");
printf("-g [A,B,C,D,E,F,G] Use 3GPP SCM (A,B,C,D) or 36-101 (E-EPA,F-EVA,G-ETU) models (ignores delay spread and Ricean factor)\n"); printf("-g [A,B,C,D,E,F,G] Use 3GPP SCM (A,B,C,D) or 36-101 (E-EPA,F-EVA,G-ETU) models (ignores delay spread and Ricean factor)\n");
printf("-x Transmission mode (1,2,6 for the moment)\n"); printf("-x Transmission mode (1,2,6 for the moment)\n");
printf("-y Number of TX antennas used in eNB\n"); printf("-y Number of TX antennas used in eNB\n");
printf("-z Number of RX antennas used in UE\n"); printf("-z Number of RX antennas used in UE\n");
printf("-i Relative strength of first intefering eNB (in dB) - cell_id mod 3 = 1\n"); printf("-i Relative strength of first intefering eNB (in dB) - cell_id mod 3 = 1\n");
printf("-j Relative strength of second intefering eNB (in dB) - cell_id mod 3 = 2\n"); printf("-j Relative strength of second intefering eNB (in dB) - cell_id mod 3 = 2\n");
printf("-N Nid_cell\n"); printf("-N Nid_cell\n");
printf("-R N_RB_DL\n"); printf("-R N_RB_DL\n");
printf("-O oversampling factor (1,2,4,8,16)\n"); printf("-O oversampling factor (1,2,4,8,16)\n");
printf("-A Interpolation_filname Run with Abstraction to generate Scatter plot using interpolation polynomial in file\n"); printf("-A Interpolation_filname Run with Abstraction to generate Scatter plot using interpolation polynomial in file\n");
// printf("-C Generate Calibration information for Abstraction (effective SNR adjustment to remove Pe bias w.r.t. AWGN)\n"); // printf("-C Generate Calibration information for Abstraction (effective SNR adjustment to remove Pe bias w.r.t. AWGN)\n");
printf("-f Output filename (.txt format) for Pe/SNR results\n"); printf("-f Output filename (.txt format) for Pe/SNR results\n");
printf("-F Input filename (.txt format) for RX conformance testing\n"); printf("-F Input filename (.txt format) for RX conformance testing\n");
exit (-1); exit (-1);
break; break;
} }
} }
@@ -324,7 +313,6 @@ int main(int argc, char **argv)
n_tx=2; n_tx=2;
lte_param_init(n_tx, n_tx,n_rx,transmission_mode,extended_prefix_flag,frame_type,Nid_cell,3,N_RB_DL,0,osf,0); lte_param_init(n_tx, n_tx,n_rx,transmission_mode,extended_prefix_flag,frame_type,Nid_cell,3,N_RB_DL,0,osf,0);
eNB1 = malloc(sizeof(PHY_VARS_eNB)); eNB1 = malloc(sizeof(PHY_VARS_eNB));
eNB2 = malloc(sizeof(PHY_VARS_eNB)); eNB2 = malloc(sizeof(PHY_VARS_eNB));
UE->measurements.n_adj_cells=2; UE->measurements.n_adj_cells=2;
@@ -334,19 +322,16 @@ int main(int argc, char **argv)
for (i=0; i<3; i++) for (i=0; i<3; i++)
lte_gold(&eNB->frame_parms,UE->lte_gold_table[i],Nid_cell+i); lte_gold(&eNB->frame_parms,UE->lte_gold_table[i],Nid_cell+i);
memcpy((void*)&eNB1->frame_parms,(void*)&eNB->frame_parms,sizeof(LTE_DL_FRAME_PARMS)); memcpy((void *)&eNB1->frame_parms,(void *)&eNB->frame_parms,sizeof(LTE_DL_FRAME_PARMS));
eNB1->frame_parms.Nid_cell=Nid_cell+1; eNB1->frame_parms.Nid_cell=Nid_cell+1;
eNB1->frame_parms.nushift=(Nid_cell+1)%6; eNB1->frame_parms.nushift=(Nid_cell+1)%6;
eNB1->Mod_id=1; eNB1->Mod_id=1;
memcpy((void *)&eNB2->frame_parms,(void *)&eNB->frame_parms,sizeof(LTE_DL_FRAME_PARMS));
memcpy((void*)&eNB2->frame_parms,(void*)&eNB->frame_parms,sizeof(LTE_DL_FRAME_PARMS));
eNB2->frame_parms.Nid_cell=Nid_cell+2; eNB2->frame_parms.Nid_cell=Nid_cell+2;
eNB2->frame_parms.nushift=(Nid_cell+2)%6; eNB2->frame_parms.nushift=(Nid_cell+2)%6;
eNB2->Mod_id=2; eNB2->Mod_id=2;
phy_init_lte_eNB(eNB1,0,0); phy_init_lte_eNB(eNB1,0,0);
phy_init_lte_eNB(eNB2,0,0); phy_init_lte_eNB(eNB2,0,0);
#ifdef XFORMS #ifdef XFORMS
fl_initialize (&argc, argv, NULL, 0, 0); fl_initialize (&argc, argv, NULL, 0, 0);
form_ue = create_lte_phy_scope_ue(); form_ue = create_lte_phy_scope_ue();
@@ -362,38 +347,27 @@ int main(int argc, char **argv)
} }
printf("SNR0 %f, SNR1 %f\n",snr0,snr1); printf("SNR0 %f, SNR1 %f\n",snr0,snr1);
frame_parms = &eNB->frame_parms; frame_parms = &eNB->frame_parms;
txdata = eNB->common_vars.txdata[0]; txdata = eNB->common_vars.txdata[0];
txdata1 = eNB1->common_vars.txdata[0]; txdata1 = eNB1->common_vars.txdata[0];
txdata2 = eNB2->common_vars.txdata[0]; txdata2 = eNB2->common_vars.txdata[0];
s_re = malloc(2*sizeof(double *));
s_im = malloc(2*sizeof(double *));
s_re = malloc(2*sizeof(double*)); s_re1 = malloc(2*sizeof(double *));
s_im = malloc(2*sizeof(double*)); s_im1 = malloc(2*sizeof(double *));
s_re1 = malloc(2*sizeof(double*)); s_re2 = malloc(2*sizeof(double *));
s_im1 = malloc(2*sizeof(double*)); s_im2 = malloc(2*sizeof(double *));
s_re2 = malloc(2*sizeof(double*)); r_re = malloc(2*sizeof(double *));
s_im2 = malloc(2*sizeof(double*)); r_im = malloc(2*sizeof(double *));
r_re = malloc(2*sizeof(double*)); r_re1 = malloc(2*sizeof(double *));
r_im = malloc(2*sizeof(double*)); r_im1 = malloc(2*sizeof(double *));
r_re1 = malloc(2*sizeof(double*)); r_re2 = malloc(2*sizeof(double *));
r_im1 = malloc(2*sizeof(double*)); r_im2 = malloc(2*sizeof(double *));
r_re2 = malloc(2*sizeof(double*));
r_im2 = malloc(2*sizeof(double*));
nsymb = (frame_parms->Ncp == 0) ? 14 : 12; nsymb = (frame_parms->Ncp == 0) ? 14 : 12;
printf("FFT Size %d, Extended Prefix %d, Samples per subframe %d, Symbols per subframe %d, interf (%d,%d)\n",NUMBER_OF_OFDM_CARRIERS, printf("FFT Size %d, Extended Prefix %d, Samples per subframe %d, Symbols per subframe %d, interf (%d,%d)\n",NUMBER_OF_OFDM_CARRIERS,
frame_parms->Ncp,frame_parms->samples_per_tti,nsymb,interf1,interf2); frame_parms->Ncp,frame_parms->samples_per_tti,nsymb,interf1,interf2);
printf("eNB1->common_vars.txdataF[0][0] = %p\n", printf("eNB1->common_vars.txdataF[0][0] = %p\n",
eNB1->common_vars.txdataF[0][0]); eNB1->common_vars.txdataF[0][0]);
DLSCH_alloc_pdu2.rah = 0; DLSCH_alloc_pdu2.rah = 0;
DLSCH_alloc_pdu2.rballoc = DLSCH_RB_ALLOC; DLSCH_alloc_pdu2.rballoc = DLSCH_RB_ALLOC;
DLSCH_alloc_pdu2.TPC = 0; DLSCH_alloc_pdu2.TPC = 0;
@@ -405,12 +379,11 @@ int main(int argc, char **argv)
DLSCH_alloc_pdu2.rv1 = 0; DLSCH_alloc_pdu2.rv1 = 0;
// Forget second codeword // Forget second codeword
DLSCH_alloc_pdu2.tpmi = (transmission_mode==6 ? 5 : 0) ; // precoding DLSCH_alloc_pdu2.tpmi = (transmission_mode==6 ? 5 : 0) ; // precoding
eNB2UE = new_channel_desc_scm(eNB->frame_parms.nb_antennas_tx, eNB2UE = new_channel_desc_scm(eNB->frame_parms.nb_antennas_tx,
UE->frame_parms.nb_antennas_rx, UE->frame_parms.nb_antennas_rx,
channel_model, channel_model,
N_RB2sampling_rate(eNB->frame_parms.N_RB_DL), N_RB2sampling_rate(eNB->frame_parms.N_RB_DL),
N_RB2channel_bandwidth(eNB->frame_parms.N_RB_DL), N_RB2channel_bandwidth(eNB->frame_parms.N_RB_DL),
0, 0,
0, 0,
0); 0);
@@ -419,8 +392,8 @@ int main(int argc, char **argv)
eNB2UE1 = new_channel_desc_scm(eNB->frame_parms.nb_antennas_tx, eNB2UE1 = new_channel_desc_scm(eNB->frame_parms.nb_antennas_tx,
UE->frame_parms.nb_antennas_rx, UE->frame_parms.nb_antennas_rx,
channel_model, channel_model,
N_RB2sampling_rate(eNB->frame_parms.N_RB_DL), N_RB2sampling_rate(eNB->frame_parms.N_RB_DL),
N_RB2channel_bandwidth(eNB->frame_parms.N_RB_DL), N_RB2channel_bandwidth(eNB->frame_parms.N_RB_DL),
0, 0,
4, 4,
0); 0);
@@ -429,20 +402,18 @@ int main(int argc, char **argv)
eNB2UE2 = new_channel_desc_scm(eNB->frame_parms.nb_antennas_tx, eNB2UE2 = new_channel_desc_scm(eNB->frame_parms.nb_antennas_tx,
UE->frame_parms.nb_antennas_rx, UE->frame_parms.nb_antennas_rx,
channel_model, channel_model,
N_RB2sampling_rate(eNB->frame_parms.N_RB_DL), N_RB2sampling_rate(eNB->frame_parms.N_RB_DL),
N_RB2channel_bandwidth(eNB->frame_parms.N_RB_DL), N_RB2channel_bandwidth(eNB->frame_parms.N_RB_DL),
0, 0,
8, 8,
0); 0);
if (eNB2UE==NULL) { if (eNB2UE==NULL) {
msg("Problem generating channel model. Exiting.\n"); msg("Problem generating channel model. Exiting.\n");
exit(-1); exit(-1);
} }
for (i=0; i<2; i++) { for (i=0; i<2; i++) {
s_re[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); s_re[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
bzero(s_re[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); bzero(s_re[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
s_im[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); s_im[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
@@ -455,7 +426,6 @@ int main(int argc, char **argv)
bzero(s_re2[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); bzero(s_re2[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
s_im2[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); s_im2[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
bzero(s_im2[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); bzero(s_im2[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
r_re[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); r_re[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
bzero(r_re[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); bzero(r_re[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
r_im[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); r_im[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
@@ -487,7 +457,6 @@ int main(int argc, char **argv)
} }
if (input_fd==NULL) { if (input_fd==NULL) {
// for (i=0;i<6;i++) // for (i=0;i<6;i++)
// pbch_pdu[i] = i; // pbch_pdu[i] = i;
pbch_pdu[0]=100; pbch_pdu[0]=100;
@@ -515,7 +484,6 @@ int main(int argc, char **argv)
&eNB->frame_parms, &eNB->frame_parms,
(eNB->frame_parms.Ncp==0) ? 5 : 4, (eNB->frame_parms.Ncp==0) ? 5 : 4,
10); 10);
} else { } else {
generate_sss(eNB->common_vars.txdataF[0], generate_sss(eNB->common_vars.txdataF[0],
AMP, AMP,
@@ -537,8 +505,6 @@ int main(int argc, char **argv)
&eNB->frame_parms, &eNB->frame_parms,
2, 2,
12); 12);
} }
/* /*
@@ -552,16 +518,12 @@ int main(int argc, char **argv)
dci_alloc[1].L = 3; dci_alloc[1].L = 3;
dci_alloc[1].rnti = 0x1234; dci_alloc[1].rnti = 0x1234;
*/ */
printf("Generating PBCH for mode1_flag = %d\n", eNB->frame_parms.mode1_flag); printf("Generating PBCH for mode1_flag = %d\n", eNB->frame_parms.mode1_flag);
generate_pilots(eNB, generate_pilots(eNB,
eNB->common_vars.txdataF[0], eNB->common_vars.txdataF[0],
AMP, AMP,
LTE_NUMBER_OF_SUBFRAMES_PER_FRAME); LTE_NUMBER_OF_SUBFRAMES_PER_FRAME);
/* /*
num_pdcch_symbols = generate_dci_top(1, num_pdcch_symbols = generate_dci_top(1,
dci_alloc, dci_alloc,
@@ -572,7 +534,6 @@ int main(int argc, char **argv)
0); 0);
*/ */
if (num_pdcch_symbols<3) { if (num_pdcch_symbols<3) {
printf("Less than 3 pdcch symbols\n"); printf("Less than 3 pdcch symbols\n");
// exit(-1); // exit(-1);
@@ -584,7 +545,7 @@ int main(int argc, char **argv)
dummybuf[2] = dummy2; dummybuf[2] = dummy2;
dummybuf[3] = dummy3; dummybuf[3] = dummy3;
generate_pbch(&eNB->pbch, generate_pbch(&eNB->pbch,
(int32_t**)dummybuf, (int32_t **)dummybuf,
AMP, AMP,
&eNB->frame_parms, &eNB->frame_parms,
pbch_pdu, pbch_pdu,
@@ -618,15 +579,12 @@ int main(int argc, char **argv)
eNB1->common_vars.txdataF[0], eNB1->common_vars.txdataF[0],
AMP, AMP,
LTE_NUMBER_OF_SUBFRAMES_PER_FRAME); LTE_NUMBER_OF_SUBFRAMES_PER_FRAME);
generate_pbch(&eNB1->pbch, generate_pbch(&eNB1->pbch,
eNB1->common_vars.txdataF[0], eNB1->common_vars.txdataF[0],
AMP, AMP,
&eNB1->frame_parms, &eNB1->frame_parms,
pbch_pdu, pbch_pdu,
0); 0);
} }
if (interf2>-20) { if (interf2>-20) {
@@ -638,27 +596,19 @@ int main(int argc, char **argv)
0); 0);
*/ */
generate_pilots(eNB2, generate_pilots(eNB2,
eNB2->common_vars.txdataF[0], eNB2->common_vars.txdataF[0],
AMP, AMP,
LTE_NUMBER_OF_SUBFRAMES_PER_FRAME); LTE_NUMBER_OF_SUBFRAMES_PER_FRAME);
generate_pbch(&eNB2->pbch, generate_pbch(&eNB2->pbch,
eNB2->common_vars.txdataF[0], eNB2->common_vars.txdataF[0],
AMP, AMP,
&eNB2->frame_parms, &eNB2->frame_parms,
pbch_pdu, pbch_pdu,
0); 0);
} }
// LOG_M("pilotsF.m","rsF",txdataF[0],frame_parms->ofdm_symbol_size,1,1); // LOG_M("pilotsF.m","rsF",txdataF[0],frame_parms->ofdm_symbol_size,1,1);
LOG_M("txsigF0.m","txsF0", eNB->common_vars.txdataF[0][0],FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX,1,1); LOG_M("txsigF0.m","txsF0", eNB->common_vars.txdataF[0][0],FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX,1,1);
if (eNB->frame_parms.nb_antennas_tx>1) if (eNB->frame_parms.nb_antennas_tx>1)
@@ -668,9 +618,6 @@ int main(int argc, char **argv)
tx_lev1 = 0; tx_lev1 = 0;
tx_lev2 = 0; tx_lev2 = 0;
for (aa=0; aa<eNB->frame_parms.nb_antennas_tx; aa++) { for (aa=0; aa<eNB->frame_parms.nb_antennas_tx; aa++) {
if (frame_parms->Ncp == 1) if (frame_parms->Ncp == 1)
PHY_ofdm_mod(eNB->common_vars.txdataF[0][aa], // input, PHY_ofdm_mod(eNB->common_vars.txdataF[0][aa], // input,
@@ -743,7 +690,6 @@ int main(int argc, char **argv)
} }
// tx_lev_dB = (unsigned int) dB_fixed(tx_lev); // tx_lev_dB = (unsigned int) dB_fixed(tx_lev);
LOG_M("txsig0.m","txs0", txdata[0],FRAME_LENGTH_COMPLEX_SAMPLES,1,1); LOG_M("txsig0.m","txs0", txdata[0],FRAME_LENGTH_COMPLEX_SAMPLES,1,1);
if (frame_parms->nb_antennas_tx>1) if (frame_parms->nb_antennas_tx>1)
@@ -762,17 +708,17 @@ int main(int argc, char **argv)
i=0; i=0;
while (!feof(input_fd)) { while (!feof(input_fd)) {
if (fscanf(input_fd,"%s %s",input_val_str,input_val_str2) != 2) { //&input_val1,&input_val2); if (fscanf(input_fd,"%49s %49s",input_val_str,input_val_str2) != 2) { //&input_val1,&input_val2);
printf("%s:%d:%s: error with fscanf, exiting\n", __FILE__, __LINE__, __FUNCTION__); printf("%s:%d:%s: error with fscanf, exiting\n", __FILE__, __LINE__, __FUNCTION__);
exit(1); exit(1);
} }
if ((i%4)==0) { if ((i%4)==0) {
((short*)txdata[0])[i/2] = (short)((1<<15)*strtod(input_val_str,NULL)); ((short *)txdata[0])[i/2] = (short)((1<<15)*strtod(input_val_str,NULL));
((short*)txdata[0])[(i/2)+1] = (short)((1<<15)*strtod(input_val_str2,NULL)); ((short *)txdata[0])[(i/2)+1] = (short)((1<<15)*strtod(input_val_str2,NULL));
if ((i/4)<100) if ((i/4)<100)
printf("sample %d => %e + j%e (%d +j%d)\n",i/4,strtod(input_val_str,NULL),strtod(input_val_str2,NULL),((short*)txdata[0])[i/4],((short*)txdata[0])[(i/4)+1]);//1,input_val2,); printf("sample %d => %e + j%e (%d +j%d)\n",i/4,strtod(input_val_str,NULL),strtod(input_val_str2,NULL),((short *)txdata[0])[i/4],((short *)txdata[0])[(i/4)+1]); //1,input_val2,);
} }
i++; i++;
@@ -789,7 +735,6 @@ int main(int argc, char **argv)
// tx_lev_dB = (unsigned int) dB_fixed(tx_lev); // tx_lev_dB = (unsigned int) dB_fixed(tx_lev);
} }
// multipath channel // multipath channel
for (i=0; i<2*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES; i++) { for (i=0; i<2*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES; i++) {
@@ -809,10 +754,7 @@ int main(int argc, char **argv)
} }
} }
for (SNR=snr0; SNR<snr1; SNR+=.2) { for (SNR=snr0; SNR<snr1; SNR+=.2) {
n_errors = 0; n_errors = 0;
n_errors2 = 0; n_errors2 = 0;
n_alamouti = 0; n_alamouti = 0;
@@ -824,8 +766,6 @@ int main(int argc, char **argv)
printf("*********************** trial %d ***************************\n",trial); printf("*********************** trial %d ***************************\n",trial);
while (pbch_sinr>-2.0) { while (pbch_sinr>-2.0) {
multipath_channel(eNB2UE,s_re,s_im,r_re,r_im, multipath_channel(eNB2UE,s_re,s_im,r_re,r_im,
2*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES,0); 2*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES,0);
@@ -882,8 +822,8 @@ int main(int argc, char **argv)
r_im[aa][i] += (pow(10.0,.05*interf1)*r_im1[aa][i] + pow(10.0,.05*interf2)*r_im2[aa][i]); r_im[aa][i] += (pow(10.0,.05*interf1)*r_im1[aa][i] + pow(10.0,.05*interf2)*r_im2[aa][i]);
} }
((short*) UE->common_vars.rxdata[aa])[2*i] = (short) (.167*(r_re[aa][i] +sqrt(sigma2/2)*gaussdouble(0.0,1.0))); ((short *) UE->common_vars.rxdata[aa])[2*i] = (short) (.167*(r_re[aa][i] +sqrt(sigma2/2)*gaussdouble(0.0,1.0)));
((short*) UE->common_vars.rxdata[aa])[2*i+1] = (short) (.167*(r_im[aa][i] + (iqim*r_re[aa][i]) + sqrt(sigma2/2)*gaussdouble(0.0,1.0))); ((short *) UE->common_vars.rxdata[aa])[2*i+1] = (short) (.167*(r_im[aa][i] + (iqim*r_re[aa][i]) + sqrt(sigma2/2)*gaussdouble(0.0,1.0)));
} }
} }
@@ -892,7 +832,6 @@ int main(int argc, char **argv)
10*log10(signal_energy(&UE->common_vars.rxdata[0][frame_parms->samples_per_tti/2],4*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES))); 10*log10(signal_energy(&UE->common_vars.rxdata[0][frame_parms->samples_per_tti/2],4*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES)));
} }
/* /*
// optional: read rx_frame from file // optional: read rx_frame from file
if ((rx_frame_file = fopen("rx_frame.dat","r")) == NULL) if ((rx_frame_file = fopen("rx_frame.dat","r")) == NULL)
@@ -911,19 +850,15 @@ int main(int argc, char **argv)
fclose(rx_frame_file); fclose(rx_frame_file);
*/ */
for (l=0; l<eNB->frame_parms.symbols_per_tti; l++) { for (l=0; l<eNB->frame_parms.symbols_per_tti; l++) {
// subframe_offset = (l/eNB->frame_parms.symbols_per_tti)*eNB->frame_parms.samples_per_tti; // subframe_offset = (l/eNB->frame_parms.symbols_per_tti)*eNB->frame_parms.samples_per_tti;
// printf("subframe_offset = %d\n",subframe_offset); // printf("subframe_offset = %d\n",subframe_offset);
slot_fep(UE, slot_fep(UE,
l%(eNB->frame_parms.symbols_per_tti/2), l%(eNB->frame_parms.symbols_per_tti/2),
l/(eNB->frame_parms.symbols_per_tti/2), l/(eNB->frame_parms.symbols_per_tti/2),
0, 0,
0, 0,
0); 0);
if (l==0) { if (l==0) {
lte_ue_measurements(UE, lte_ue_measurements(UE,
@@ -961,16 +896,14 @@ int main(int argc, char **argv)
//sprintf(fname,"dl_ch00_%d.m",l); //sprintf(fname,"dl_ch00_%d.m",l);
//sprintf(vname,"dl_ch00_%d",l); //sprintf(vname,"dl_ch00_%d",l);
//LOG_M(fname,vname,&(common_vars->dl_ch_estimates[0][frame_parms->ofdm_symbol_size*(l%6)]),frame_parms->ofdm_symbol_size,1,1); //LOG_M(fname,vname,&(common_vars->dl_ch_estimates[0][frame_parms->ofdm_symbol_size*(l%6)]),frame_parms->ofdm_symbol_size,1,1);
lte_est_freq_offset(UE->common_vars.common_vars_rx_data_per_thread[/*subframe*/0&0x1].dl_ch_estimates[0], lte_est_freq_offset(UE->common_vars.common_vars_rx_data_per_thread[/*subframe*/0&0x1].dl_ch_estimates[0],
&UE->frame_parms, &UE->frame_parms,
l, l,
&freq_offset, &freq_offset,
1); 1);
} }
if (l==((eNB->frame_parms.Ncp==0)?10:9)) { if (l==((eNB->frame_parms.Ncp==0)?10:9)) {
for (frame_mod4=0; frame_mod4<4; frame_mod4++) { for (frame_mod4=0; frame_mod4<4; frame_mod4++) {
pbch_tx_ant = rx_pbch(&UE->common_vars, pbch_tx_ant = rx_pbch(&UE->common_vars,
UE->pbch_vars[0], UE->pbch_vars[0],
@@ -1003,7 +936,6 @@ int main(int argc, char **argv)
} }
} }
if ((pbch_tx_ant>0) && (pbch_tx_ant<4)) { if ((pbch_tx_ant>0) && (pbch_tx_ant<4)) {
if (n_frames==1) if (n_frames==1)
msg("pbch decoded sucessfully mode1_flag %d, frame_mod4 %d, tx_ant %d!\n", msg("pbch decoded sucessfully mode1_flag %d, frame_mod4 %d, tx_ant %d!\n",
@@ -1023,7 +955,6 @@ int main(int argc, char **argv)
UE, UE,
0,0,1); 0,0,1);
#endif #endif
} //noise trials } //noise trials
if (abstraction_flag==1) { if (abstraction_flag==1) {
@@ -1049,7 +980,6 @@ int main(int argc, char **argv)
} // NSR } // NSR
if (n_frames==1) { if (n_frames==1) {
LOG_M("H00.m","h00",&(UE->common_vars.common_vars_rx_data_per_thread[/*subframe*/0&0x1].dl_ch_estimates[0][0][0]),((frame_parms->Ncp==0)?7:6)*(eNB->frame_parms.ofdm_symbol_size),1,1); LOG_M("H00.m","h00",&(UE->common_vars.common_vars_rx_data_per_thread[/*subframe*/0&0x1].dl_ch_estimates[0][0][0]),((frame_parms->Ncp==0)?7:6)*(eNB->frame_parms.ofdm_symbol_size),1,1);
if (n_tx==2) if (n_tx==2)
@@ -1062,7 +992,6 @@ int main(int argc, char **argv)
LOG_M("PBCH_rxF_llr.m","pbch_llr",UE->pbch_vars[0]->llr,(frame_parms->Ncp==0) ? 1920 : 1728,1,4); LOG_M("PBCH_rxF_llr.m","pbch_llr",UE->pbch_vars[0]->llr,(frame_parms->Ncp==0) ? 1920 : 1728,1,4);
} }
for (i=0; i<2; i++) { for (i=0; i<2; i++) {
free(s_re[i]); free(s_re[i]);
free(s_im[i]); free(s_im[i]);
@@ -1074,15 +1003,15 @@ int main(int argc, char **argv)
free(s_im); free(s_im);
free(r_re); free(r_re);
free(r_im); free(r_im);
lte_sync_time_free(); lte_sync_time_free();
if (write_output_file) if (write_output_file)
fclose(output_fd); fclose(output_fd);
return(n_errors); if (input_fd != NULL)
fclose(input_fd);
return(n_errors);
} }
File diff suppressed because it is too large Load Diff
+198 -236
View File
@@ -48,11 +48,8 @@ extern uint16_t prach_root_sequence_map0_3[838];
void dump_prach_config(LTE_DL_FRAME_PARMS *frame_parms,uint8_t subframe); void dump_prach_config(LTE_DL_FRAME_PARMS *frame_parms,uint8_t subframe);
int main(int argc, char **argv) int main(int argc, char **argv) {
{
char c; char c;
int i,aa,aarx; int i,aa,aarx;
double sigma2, sigma2_dB=0,SNR,snr0=-2.0,snr1=0.0,ue_speed0=0.0,ue_speed1=0.0; double sigma2, sigma2_dB=0,SNR,snr0=-2.0,snr1=0.0,ue_speed0=0.0,ue_speed1=0.0;
uint8_t snr1set=0; uint8_t snr1set=0;
@@ -64,7 +61,6 @@ int main(int argc, char **argv)
int trial; //, ntrials=1; int trial; //, ntrials=1;
uint8_t transmission_mode = 1,n_tx=1,n_rx=1; uint8_t transmission_mode = 1,n_tx=1,n_rx=1;
uint16_t Nid_cell=0; uint16_t Nid_cell=0;
uint8_t awgn_flag=0; uint8_t awgn_flag=0;
uint8_t hs_flag=0; uint8_t hs_flag=0;
int n_frames=1; int n_frames=1;
@@ -73,9 +69,7 @@ int main(int argc, char **argv)
uint8_t extended_prefix_flag=0; uint8_t extended_prefix_flag=0;
// int8_t interf1=-19,interf2=-19; // int8_t interf1=-19,interf2=-19;
LTE_DL_FRAME_PARMS *frame_parms; LTE_DL_FRAME_PARMS *frame_parms;
SCM_t channel_model=Rayleigh1; SCM_t channel_model=Rayleigh1;
// uint8_t abstraction_flag=0,calibration_flag=0; // uint8_t abstraction_flag=0,calibration_flag=0;
// double prach_sinr; // double prach_sinr;
uint8_t osf=1,N_RB_DL=25; uint8_t osf=1,N_RB_DL=25;
@@ -91,211 +85,212 @@ int main(int argc, char **argv)
double ue_speed = 0; double ue_speed = 0;
int NCS_config = 1,rootSequenceIndex=0; int NCS_config = 1,rootSequenceIndex=0;
int threequarter_fs = 0; int threequarter_fs = 0;
cpuf = get_cpu_freq_GHz(); cpuf = get_cpu_freq_GHz();
logInit(); logInit();
number_of_cards = 1; number_of_cards = 1;
while ((c = getopt (argc, argv, "hHaA:Cr:p:g:n:s:S:t:x:y:v:V:z:N:F:d:Z:L:R:E")) != -1) { while ((c = getopt (argc, argv, "hHaA:Cr:p:g:n:s:S:t:x:y:v:V:z:N:F:d:Z:L:R:E")) != -1) {
switch (c) { switch (c) {
case 'a': case 'a':
printf("Running AWGN simulation\n"); printf("Running AWGN simulation\n");
awgn_flag = 1; awgn_flag = 1;
/* ntrials not used later, no need to set */ /* ntrials not used later, no need to set */
//ntrials=1; //ntrials=1;
break;
case 'd':
delay = atoi(optarg);
break;
case 'g':
switch((char)*optarg) {
case 'A':
channel_model=SCM_A;
break; break;
case 'B': case 'd':
channel_model=SCM_B; delay = atoi(optarg);
break; break;
case 'C': case 'g':
channel_model=SCM_C; switch((char)*optarg) {
break; case 'A':
channel_model=SCM_A;
break;
case 'B':
channel_model=SCM_B;
break;
case 'C':
channel_model=SCM_C;
break;
case 'D':
channel_model=SCM_D;
break;
case 'E':
channel_model=EPA;
break;
case 'F':
channel_model=EVA;
break;
case 'G':
channel_model=ETU;
break;
case 'H':
channel_model=Rayleigh8;
break;
case 'I':
channel_model=Rayleigh1;
break;
case 'J':
channel_model=Rayleigh1_corr;
break;
case 'K':
channel_model=Rayleigh1_anticorr;
break;
case 'L':
channel_model=Rice8;
break;
case 'M':
channel_model=Rice1;
break;
case 'N':
channel_model=Rayleigh1_800;
break;
default:
msg("Unsupported channel model!\n");
exit(-1);
}
case 'D':
channel_model=SCM_D;
break; break;
case 'E': case 'E':
channel_model=EPA; threequarter_fs=1;
break; break;
case 'F': case 'n':
channel_model=EVA; n_frames = atoi(optarg);
break; break;
case 'G': case 's':
channel_model=ETU; snr0 = atof(optarg);
msg("Setting SNR0 to %f\n",snr0);
break;
case 'S':
snr1 = atof(optarg);
snr1set=1;
msg("Setting SNR1 to %f\n",snr1);
break;
case 'p':
preamble_tx=atoi(optarg);
break;
case 'v':
ue_speed0 = atoi(optarg);
break;
case 'V':
ue_speed1 = atoi(optarg);
ue_speed1set = 1;
break;
case 'Z':
NCS_config = atoi(optarg);
if ((NCS_config > 15) || (NCS_config < 0))
printf("Illegal NCS_config %d, (should be 0-15)\n",NCS_config);
break; break;
case 'H': case 'H':
channel_model=Rayleigh8; printf("High-Speed Flag enabled\n");
hs_flag = 1;
case 'I': break;
channel_model=Rayleigh1;
case 'J':
channel_model=Rayleigh1_corr;
case 'K':
channel_model=Rayleigh1_anticorr;
case 'L': case 'L':
channel_model=Rice8; rootSequenceIndex = atoi(optarg);
case 'M': if ((rootSequenceIndex < 0) || (rootSequenceIndex > 837))
channel_model=Rice1; printf("Illegal rootSequenceNumber %d, (should be 0-837)\n",rootSequenceIndex);
break;
case 'x':
transmission_mode=atoi(optarg);
if ((transmission_mode!=1) &&
(transmission_mode!=2) &&
(transmission_mode!=6)) {
msg("Unsupported transmission mode %d\n",transmission_mode);
exit(-1);
}
break;
case 'y':
n_tx=atoi(optarg);
if ((n_tx==0) || (n_tx>2)) {
msg("Unsupported number of tx antennas %d\n",n_tx);
exit(-1);
}
break;
case 'z':
n_rx=atoi(optarg);
if ((n_rx==0) || (n_rx>2)) {
msg("Unsupported number of rx antennas %d\n",n_rx);
exit(-1);
}
break;
case 'N': case 'N':
channel_model=Rayleigh1_800; Nid_cell = atoi(optarg);
break;
case 'R':
N_RB_DL = atoi(optarg);
break;
case 'O':
osf = atoi(optarg);
break;
case 'F':
break; break;
default: default:
msg("Unsupported channel model!\n"); case 'h':
exit(-1); printf("%s -h(elp) -a(wgn on) -p(extended_prefix) -N cell_id -f output_filename -F input_filename -g channel_model -n n_frames -s snr0 -S snr1 -x transmission_mode -y TXant -z RXant -i Intefrence0 -j Interference1 -A interpolation_file -C(alibration offset dB) -N CellId\n",
} argv[0]);
printf("-h This message\n");
break; printf("-a Use AWGN channel and not multipath\n");
printf("-n Number of frames to simulate\n");
case 'E': printf("-s Starting SNR, runs from SNR0 to SNR0 + 5 dB. If n_frames is 1 then just SNR is simulated\n");
threequarter_fs=1; printf("-S Ending SNR, runs from SNR0 to SNR1\n");
break; printf("-g [A,B,C,D,E,F,G,I,N] Use 3GPP SCM (A,B,C,D) or 36-101 (E-EPA,F-EVA,G-ETU) or Rayleigh1 (I) or Rayleigh1_800 (N) models (ignores delay spread and Ricean factor)\n");
printf("-z Number of RX antennas used in eNB\n");
case 'n': printf("-N Nid_cell\n");
n_frames = atoi(optarg); printf("-O oversampling factor (1,2,4,8,16)\n");
break; // printf("-f PRACH format (0=1,1=2,2=3,3=4)\n");
printf("-d Channel delay \n");
case 's': printf("-v Starting UE velocity in km/h, runs from 'v' to 'v+50km/h'. If n_frames is 1 just 'v' is simulated \n");
snr0 = atof(optarg); printf("-V Ending UE velocity in km/h, runs from 'v' to 'V'");
msg("Setting SNR0 to %f\n",snr0); printf("-L rootSequenceIndex (0-837)\n");
break; printf("-Z NCS_config (ZeroCorrelationZone) (0-15)\n");
printf("-H Run with High-Speed Flag enabled \n");
case 'S': printf("-R Number of PRB (6,15,25,50,75,100)\n");
snr1 = atof(optarg); printf("-F Input filename (.txt format) for RX conformance testing\n");
snr1set=1; exit (-1);
msg("Setting SNR1 to %f\n",snr1); break;
break;
case 'p':
preamble_tx=atoi(optarg);
break;
case 'v':
ue_speed0 = atoi(optarg);
break;
case 'V':
ue_speed1 = atoi(optarg);
ue_speed1set = 1;
break;
case 'Z':
NCS_config = atoi(optarg);
if ((NCS_config > 15) || (NCS_config < 0))
printf("Illegal NCS_config %d, (should be 0-15)\n",NCS_config);
break;
case 'H':
printf("High-Speed Flag enabled\n");
hs_flag = 1;
break;
case 'L':
rootSequenceIndex = atoi(optarg);
if ((rootSequenceIndex < 0) || (rootSequenceIndex > 837))
printf("Illegal rootSequenceNumber %d, (should be 0-837)\n",rootSequenceIndex);
break;
case 'x':
transmission_mode=atoi(optarg);
if ((transmission_mode!=1) &&
(transmission_mode!=2) &&
(transmission_mode!=6)) {
msg("Unsupported transmission mode %d\n",transmission_mode);
exit(-1);
}
break;
case 'y':
n_tx=atoi(optarg);
if ((n_tx==0) || (n_tx>2)) {
msg("Unsupported number of tx antennas %d\n",n_tx);
exit(-1);
}
break;
case 'z':
n_rx=atoi(optarg);
if ((n_rx==0) || (n_rx>2)) {
msg("Unsupported number of rx antennas %d\n",n_rx);
exit(-1);
}
break;
case 'N':
Nid_cell = atoi(optarg);
break;
case 'R':
N_RB_DL = atoi(optarg);
break;
case 'O':
osf = atoi(optarg);
break;
case 'F':
break;
default:
case 'h':
printf("%s -h(elp) -a(wgn on) -p(extended_prefix) -N cell_id -f output_filename -F input_filename -g channel_model -n n_frames -s snr0 -S snr1 -x transmission_mode -y TXant -z RXant -i Intefrence0 -j Interference1 -A interpolation_file -C(alibration offset dB) -N CellId\n",
argv[0]);
printf("-h This message\n");
printf("-a Use AWGN channel and not multipath\n");
printf("-n Number of frames to simulate\n");
printf("-s Starting SNR, runs from SNR0 to SNR0 + 5 dB. If n_frames is 1 then just SNR is simulated\n");
printf("-S Ending SNR, runs from SNR0 to SNR1\n");
printf("-g [A,B,C,D,E,F,G,I,N] Use 3GPP SCM (A,B,C,D) or 36-101 (E-EPA,F-EVA,G-ETU) or Rayleigh1 (I) or Rayleigh1_800 (N) models (ignores delay spread and Ricean factor)\n");
printf("-z Number of RX antennas used in eNB\n");
printf("-N Nid_cell\n");
printf("-O oversampling factor (1,2,4,8,16)\n");
// printf("-f PRACH format (0=1,1=2,2=3,3=4)\n");
printf("-d Channel delay \n");
printf("-v Starting UE velocity in km/h, runs from 'v' to 'v+50km/h'. If n_frames is 1 just 'v' is simulated \n");
printf("-V Ending UE velocity in km/h, runs from 'v' to 'V'");
printf("-L rootSequenceIndex (0-837)\n");
printf("-Z NCS_config (ZeroCorrelationZone) (0-15)\n");
printf("-H Run with High-Speed Flag enabled \n");
printf("-R Number of PRB (6,15,25,50,75,100)\n");
printf("-F Input filename (.txt format) for RX conformance testing\n");
exit (-1);
break;
} }
} }
@@ -304,17 +299,16 @@ int main(int argc, char **argv)
lte_param_init(n_tx, lte_param_init(n_tx,
n_tx, n_tx,
n_rx, n_rx,
transmission_mode, transmission_mode,
extended_prefix_flag, extended_prefix_flag,
FDD, FDD,
Nid_cell, Nid_cell,
3, 3,
N_RB_DL, N_RB_DL,
threequarter_fs, threequarter_fs,
osf, osf,
0); 0);
if (snr1set==0) { if (snr1set==0) {
if (n_frames==1) if (n_frames==1)
@@ -331,30 +325,22 @@ int main(int argc, char **argv)
} }
printf("SNR0 %f, SNR1 %f\n",snr0,snr1); printf("SNR0 %f, SNR1 %f\n",snr0,snr1);
frame_parms = &eNB->frame_parms; frame_parms = &eNB->frame_parms;
txdata = UE->common_vars.txdata; txdata = UE->common_vars.txdata;
printf("txdata %p\n",&txdata[0][subframe*frame_parms->samples_per_tti]); printf("txdata %p\n",&txdata[0][subframe*frame_parms->samples_per_tti]);
s_re = malloc(2*sizeof(double *));
s_re = malloc(2*sizeof(double*)); s_im = malloc(2*sizeof(double *));
s_im = malloc(2*sizeof(double*)); r_re = malloc(2*sizeof(double *));
r_re = malloc(2*sizeof(double*)); r_im = malloc(2*sizeof(double *));
r_im = malloc(2*sizeof(double*));
nsymb = (frame_parms->Ncp == 0) ? 14 : 12; nsymb = (frame_parms->Ncp == 0) ? 14 : 12;
printf("FFT Size %d, Extended Prefix %d, Samples per subframe %d, Symbols per subframe %d\n",NUMBER_OF_OFDM_CARRIERS, printf("FFT Size %d, Extended Prefix %d, Samples per subframe %d, Symbols per subframe %d\n",NUMBER_OF_OFDM_CARRIERS,
frame_parms->Ncp,frame_parms->samples_per_tti,nsymb); frame_parms->Ncp,frame_parms->samples_per_tti,nsymb);
msg("[SIM] Using SCM/101\n"); msg("[SIM] Using SCM/101\n");
UE2eNB = new_channel_desc_scm(UE->frame_parms.nb_antennas_tx, UE2eNB = new_channel_desc_scm(UE->frame_parms.nb_antennas_tx,
eNB->frame_parms.nb_antennas_rx, eNB->frame_parms.nb_antennas_rx,
channel_model, channel_model,
N_RB2sampling_rate(eNB->frame_parms.N_RB_UL), N_RB2sampling_rate(eNB->frame_parms.N_RB_UL),
N_RB2channel_bandwidth(eNB->frame_parms.N_RB_UL), N_RB2channel_bandwidth(eNB->frame_parms.N_RB_UL),
0.0, 0.0,
delay, delay,
0); 0);
@@ -365,12 +351,10 @@ int main(int argc, char **argv)
} }
for (i=0; i<2; i++) { for (i=0; i<2; i++) {
s_re[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); s_re[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
bzero(s_re[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); bzero(s_re[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
s_im[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); s_im[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
bzero(s_im[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); bzero(s_im[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
r_re[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); r_re[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
bzero(r_re[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); bzero(r_re[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
r_im[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); r_im[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
@@ -382,30 +366,22 @@ int main(int argc, char **argv)
UE->frame_parms.prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig=NCS_config; UE->frame_parms.prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig=NCS_config;
UE->frame_parms.prach_config_common.prach_ConfigInfo.highSpeedFlag=hs_flag; UE->frame_parms.prach_config_common.prach_ConfigInfo.highSpeedFlag=hs_flag;
UE->frame_parms.prach_config_common.prach_ConfigInfo.prach_FreqOffset=0; UE->frame_parms.prach_config_common.prach_ConfigInfo.prach_FreqOffset=0;
eNB->frame_parms.prach_config_common.rootSequenceIndex=rootSequenceIndex; eNB->frame_parms.prach_config_common.rootSequenceIndex=rootSequenceIndex;
eNB->frame_parms.prach_config_common.prach_ConfigInfo.prach_ConfigIndex=0; eNB->frame_parms.prach_config_common.prach_ConfigInfo.prach_ConfigIndex=0;
eNB->frame_parms.prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig=NCS_config; eNB->frame_parms.prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig=NCS_config;
eNB->frame_parms.prach_config_common.prach_ConfigInfo.highSpeedFlag=hs_flag; eNB->frame_parms.prach_config_common.prach_ConfigInfo.highSpeedFlag=hs_flag;
eNB->frame_parms.prach_config_common.prach_ConfigInfo.prach_FreqOffset=0; eNB->frame_parms.prach_config_common.prach_ConfigInfo.prach_FreqOffset=0;
eNB->node_function = eNodeB_3GPP; eNB->node_function = eNodeB_3GPP;
eNB->proc.subframe_rx = subframe; eNB->proc.subframe_rx = subframe;
eNB->proc.subframe_prach = subframe; eNB->proc.subframe_prach = subframe;
/* N_ZC not used later, so prach_fmt is also useless, don't set */ /* N_ZC not used later, so prach_fmt is also useless, don't set */
//prach_fmt = get_prach_fmt(eNB->frame_parms.prach_config_common.prach_ConfigInfo.prach_ConfigIndex, //prach_fmt = get_prach_fmt(eNB->frame_parms.prach_config_common.prach_ConfigInfo.prach_ConfigIndex,
// eNB->frame_parms.frame_type); // eNB->frame_parms.frame_type);
/* N_ZC not used later, no need to set */ /* N_ZC not used later, no need to set */
//N_ZC = (prach_fmt <4)?839:139; //N_ZC = (prach_fmt <4)?839:139;
compute_prach_seq(&eNB->frame_parms.prach_config_common,eNB->frame_parms.frame_type,eNB->X_u); compute_prach_seq(&eNB->frame_parms.prach_config_common,eNB->frame_parms.frame_type,eNB->X_u);
compute_prach_seq(&UE->frame_parms.prach_config_common,UE->frame_parms.frame_type,UE->X_u); compute_prach_seq(&UE->frame_parms.prach_config_common,UE->frame_parms.frame_type,UE->X_u);
UE->prach_vars[0]->amp = AMP; UE->prach_vars[0]->amp = AMP;
UE->prach_resources[0] = &prach_resources; UE->prach_resources[0] = &prach_resources;
if (preamble_tx == 99) if (preamble_tx == 99)
@@ -416,18 +392,14 @@ int main(int argc, char **argv)
UE->prach_resources[0]->ra_PreambleIndex = preamble_tx; UE->prach_resources[0]->ra_PreambleIndex = preamble_tx;
UE->prach_resources[0]->ra_TDD_map_index = 0; UE->prach_resources[0]->ra_TDD_map_index = 0;
tx_lev = generate_prach(UE, tx_lev = generate_prach(UE,
0, //eNB_id, 0, //eNB_id,
subframe, subframe,
0); //Nf 0); //Nf
/* tx_lev_dB not used later, no need to set */ /* tx_lev_dB not used later, no need to set */
//tx_lev_dB = (unsigned int) dB_fixed(tx_lev); //tx_lev_dB = (unsigned int) dB_fixed(tx_lev);
LOG_M("txsig0_new.m","txs0", &txdata[0][subframe*frame_parms->samples_per_tti],frame_parms->samples_per_tti,1,1); LOG_M("txsig0_new.m","txs0", &txdata[0][subframe*frame_parms->samples_per_tti],frame_parms->samples_per_tti,1,1);
//LOG_M("txsig1.m","txs1", txdata[1],FRAME_LENGTH_COMPLEX_SAMPLES,1,1); //LOG_M("txsig1.m","txs1", txdata[1],FRAME_LENGTH_COMPLEX_SAMPLES,1,1);
// multipath channel // multipath channel
dump_prach_config(&eNB->frame_parms,subframe); dump_prach_config(&eNB->frame_parms,subframe);
@@ -450,8 +422,6 @@ int main(int argc, char **argv)
} }
} }
for (SNR=snr0; SNR<snr1; SNR+=.2) { for (SNR=snr0; SNR<snr1; SNR+=.2) {
for (ue_speed=ue_speed0; ue_speed<ue_speed1; ue_speed+=10) { for (ue_speed=ue_speed0; ue_speed<ue_speed1; ue_speed+=10) {
delay_avg = 0.0; delay_avg = 0.0;
@@ -461,7 +431,6 @@ int main(int argc, char **argv)
prach_errors=0; prach_errors=0;
for (trial=0; trial<n_frames; trial++) { for (trial=0; trial<n_frames; trial++) {
sigma2_dB = 10*log10((double)tx_lev) - SNR; sigma2_dB = 10*log10((double)tx_lev) - SNR;
if (n_frames==1) if (n_frames==1)
@@ -471,7 +440,6 @@ int main(int argc, char **argv)
sigma2 = pow(10,sigma2_dB/10); sigma2 = pow(10,sigma2_dB/10);
// printf("Sigma2 %f (sigma2_dB %f)\n",sigma2,sigma2_dB); // printf("Sigma2 %f (sigma2_dB %f)\n",sigma2,sigma2_dB);
if (awgn_flag == 0) { if (awgn_flag == 0) {
multipath_tv_channel(UE2eNB,s_re,s_im,r_re,r_im, multipath_tv_channel(UE2eNB,s_re,s_im,r_re,r_im,
2*frame_parms->samples_per_tti,0); 2*frame_parms->samples_per_tti,0);
@@ -485,9 +453,8 @@ int main(int argc, char **argv)
for (i=0; i<frame_parms->samples_per_tti; i++) { for (i=0; i<frame_parms->samples_per_tti; i++) {
for (aa=0; aa<eNB->frame_parms.nb_antennas_rx; aa++) { for (aa=0; aa<eNB->frame_parms.nb_antennas_rx; aa++) {
((short *) &eNB->common_vars.rxdata[0][aa][subframe*frame_parms->samples_per_tti])[2*i] = (short) (.167*(r_re[aa][i] +sqrt(sigma2/2)*gaussdouble(0.0,1.0)));
((short*) &eNB->common_vars.rxdata[0][aa][subframe*frame_parms->samples_per_tti])[2*i] = (short) (.167*(r_re[aa][i] +sqrt(sigma2/2)*gaussdouble(0.0,1.0))); ((short *) &eNB->common_vars.rxdata[0][aa][subframe*frame_parms->samples_per_tti])[2*i+1] = (short) (.167*(r_im[aa][i] + (iqim*r_re[aa][i]) + sqrt(sigma2/2)*gaussdouble(0.0,1.0)));
((short*) &eNB->common_vars.rxdata[0][aa][subframe*frame_parms->samples_per_tti])[2*i+1] = (short) (.167*(r_im[aa][i] + (iqim*r_re[aa][i]) + sqrt(sigma2/2)*gaussdouble(0.0,1.0)));
} }
} }
@@ -496,7 +463,6 @@ int main(int argc, char **argv)
preamble_delay_list, preamble_delay_list,
0, //Nf 0, //Nf
0); //tdd_mapindex 0); //tdd_mapindex
preamble_energy_max = preamble_energy_list[0]; preamble_energy_max = preamble_energy_list[0];
preamble_max = 0; preamble_max = 0;
@@ -524,8 +490,8 @@ int main(int argc, char **argv)
LOG_M("prach0.m","prach0", &txdata[0][subframe*frame_parms->samples_per_tti],frame_parms->samples_per_tti,1,1); LOG_M("prach0.m","prach0", &txdata[0][subframe*frame_parms->samples_per_tti],frame_parms->samples_per_tti,1,1);
LOG_M("prachF0.m","prachF0", &eNB->prach_vars.prachF[0],24576,1,1); LOG_M("prachF0.m","prachF0", &eNB->prach_vars.prachF[0],24576,1,1);
LOG_M("rxsig0.m","rxs0", LOG_M("rxsig0.m","rxs0",
&eNB->common_vars.rxdata[0][0][subframe*frame_parms->samples_per_tti], &eNB->common_vars.rxdata[0][0][subframe*frame_parms->samples_per_tti],
frame_parms->samples_per_tti,1,1); frame_parms->samples_per_tti,1,1);
LOG_M("rxsigF0.m","rxsF0", eNB->prach_vars.rxsigF[0],6144,1,1); LOG_M("rxsigF0.m","rxsF0", eNB->prach_vars.rxsigF[0],6144,1,1);
LOG_M("prach_preamble.m","prachp",&eNB->X_u[0],839,1,1); LOG_M("prach_preamble.m","prachp",&eNB->X_u[0],839,1,1);
} }
@@ -539,7 +505,6 @@ int main(int argc, char **argv)
// printf("(%f,%f)\n",SNR,(double)prach_errors/(double)n_frames); // printf("(%f,%f)\n",SNR,(double)prach_errors/(double)n_frames);
} //SNR loop } //SNR loop
for (i=0; i<2; i++) { for (i=0; i<2; i++) {
free(s_re[i]); free(s_re[i]);
free(s_im[i]); free(s_im[i]);
@@ -551,11 +516,8 @@ int main(int argc, char **argv)
free(s_im); free(s_im);
free(r_re); free(r_re);
free(r_im); free(r_im);
lte_sync_time_free(); lte_sync_time_free();
return(0); return(0);
} }
+227 -274
View File
@@ -45,37 +45,29 @@ PHY_VARS_UE *UE;
double cpuf; double cpuf;
int main(int argc, char **argv) int main(int argc, char **argv) {
{
char c; char c;
int i,l,aa; int i,l,aa;
double sigma2, sigma2_dB=0,SNR,snr0=-2.0,snr1=0.0; double sigma2, sigma2_dB=0,SNR,snr0=-2.0,snr1=0.0;
uint8_t snr1set=0; uint8_t snr1set=0;
//mod_sym_t **txdataF; //mod_sym_t **txdataF;
int **txdata; int **txdata;
double s_re0[30720],s_re1[30720],s_im0[30720],s_im1[30720],r_re0[30720],r_im0[30720],r_re1[30720],r_im1[30720]; double s_re0[30720],s_re1[30720],s_im0[30720],s_im1[30720],r_re0[30720],r_im0[30720],r_re1[30720],r_im1[30720];
double *s_re[2]={s_re0,s_re1}; double *s_re[2]= {s_re0,s_re1};
double *s_im[2]={s_im0,s_im1}; double *s_im[2]= {s_im0,s_im1};
double *r_re[2]={r_re0,r_re1}; double *r_re[2]= {r_re0,r_re1};
double *r_im[2]={r_im0,r_im1}; double *r_im[2]= {r_im0,r_im1};
double ricean_factor=0.0000005,iqim=0.0; double ricean_factor=0.0000005,iqim=0.0;
int trial, n_trials, ntrials=1, n_errors; int trial, n_trials, ntrials=1, n_errors;
uint8_t transmission_mode = 1,n_tx=1,n_rx=1; uint8_t transmission_mode = 1,n_tx=1,n_rx=1;
unsigned char eNB_id = 0; unsigned char eNB_id = 0;
uint16_t Nid_cell=0; uint16_t Nid_cell=0;
int n_frames=1; int n_frames=1;
channel_desc_t *UE2eNB; channel_desc_t *UE2eNB;
uint32_t nsymb,tx_lev; uint32_t nsymb,tx_lev;
uint8_t extended_prefix_flag=0; uint8_t extended_prefix_flag=0;
LTE_DL_FRAME_PARMS *frame_parms; LTE_DL_FRAME_PARMS *frame_parms;
SCM_t channel_model=Rayleigh1_corr; SCM_t channel_model=Rayleigh1_corr;
// double pucch_sinr; // double pucch_sinr;
uint8_t osf=1,N_RB_DL=25; uint8_t osf=1,N_RB_DL=25;
uint32_t pucch_tx=0,pucch1_missed=0,pucch1_false=0,pucch3_false=0,sig; uint32_t pucch_tx=0,pucch1_missed=0,pucch1_false=0,pucch3_false=0,sig;
@@ -90,202 +82,203 @@ int main(int argc, char **argv)
double stat_no_sig,stat_sig; double stat_no_sig,stat_sig;
uint8_t N0=40; uint8_t N0=40;
uint8_t pucch1_thres=10; uint8_t pucch1_thres=10;
uint16_t n1_pucch = 0; uint16_t n1_pucch = 0;
uint16_t n2_pucch = 0; uint16_t n2_pucch = 0;
uint16_t n3_pucch = 20; uint16_t n3_pucch = 20;
uint16_t n_rnti=0x1234; uint16_t n_rnti=0x1234;
number_of_cards = 1; number_of_cards = 1;
cpuf = get_cpu_freq_GHz(); cpuf = get_cpu_freq_GHz();
while ((c = getopt (argc, argv, "har:pf:g:n:s:S:x:y:z:N:F:T:R:")) != -1) { while ((c = getopt (argc, argv, "har:pf:g:n:s:S:x:y:z:N:F:T:R:")) != -1) {
switch (c) { switch (c) {
case 'a': case 'a':
printf("Running AWGN simulation\n"); printf("Running AWGN simulation\n");
channel_model = AWGN; channel_model = AWGN;
ntrials=1; ntrials=1;
break;
case 'f':
if (atoi(optarg)==0)
pucch_format = pucch_format1;
else if (atoi(optarg)==1)
pucch_format = pucch_format1a;
else if (atoi(optarg)==2)
pucch_format = pucch_format1b;
else if (atoi(optarg)==6) // 3,4,5 is reserved for format2,2a,2b
pucch_format = pucch_format3;
else {
printf("Unsupported pucch_format %d\n",atoi(optarg));
exit(-1);
}
break;
case 'g':
switch((char)*optarg) {
case 'A':
channel_model=SCM_A;
break; break;
case 'B': case 'f':
channel_model=SCM_B; if (atoi(optarg)==0)
pucch_format = pucch_format1;
else if (atoi(optarg)==1)
pucch_format = pucch_format1a;
else if (atoi(optarg)==2)
pucch_format = pucch_format1b;
else if (atoi(optarg)==6) // 3,4,5 is reserved for format2,2a,2b
pucch_format = pucch_format3;
else {
printf("Unsupported pucch_format %d\n",atoi(optarg));
exit(-1);
}
break; break;
case 'C': case 'g':
channel_model=SCM_C; switch((char)*optarg) {
case 'A':
channel_model=SCM_A;
break;
case 'B':
channel_model=SCM_B;
break;
case 'C':
channel_model=SCM_C;
break;
case 'D':
channel_model=SCM_D;
break;
case 'E':
channel_model=EPA;
break;
case 'F':
channel_model=EVA;
break;
case 'G':
channel_model=ETU;
break;
case 'H':
channel_model=Rayleigh8;
break;
case 'I':
channel_model=Rayleigh1;
break;
case 'J':
channel_model=Rayleigh1_corr;
break;
case 'K':
channel_model=Rayleigh1_anticorr;
break;
case 'L':
channel_model=Rice8;
break;
case 'M':
channel_model=Rice1;
break;
default:
printf("Unsupported channel model!\n");
exit(-1);
}
break; break;
case 'D': case 'n':
channel_model=SCM_D; n_frames = atoi(optarg);
break; break;
case 'E': case 's':
channel_model=EPA; snr0 = atof(optarg);
printf("Setting SNR0 to %f\n",snr0);
break;
case 'S':
snr1 = atof(optarg);
snr1set=1;
printf("Setting SNR1 to %f\n",snr1);
break;
case 'p':
extended_prefix_flag=1;
break;
case 'r':
ricean_factor = pow(10,-.1*atof(optarg));
if (ricean_factor>1) {
printf("Ricean factor must be between 0 and 1\n");
exit(-1);
}
break;
case 'x':
transmission_mode=atoi(optarg);
if ((transmission_mode!=1) &&
(transmission_mode!=2) &&
(transmission_mode!=6)) {
printf("Unsupported transmission mode %d\n",transmission_mode);
exit(-1);
}
break;
case 'y':
n_tx=atoi(optarg);
if ((n_tx==0) || (n_tx>2)) {
printf("Unsupported number of tx antennas %d\n",n_tx);
exit(-1);
}
break;
case 'z':
n_rx=atoi(optarg);
if ((n_rx==0) || (n_rx>2)) {
printf("Unsupported number of rx antennas %d\n",n_rx);
exit(-1);
}
break;
case 'N':
N0 = atoi(optarg);
break;
case 'T':
pucch1_thres = atoi(optarg);
break;
case 'R':
N_RB_DL = atoi(optarg);
break;
case 'O':
osf = atoi(optarg);
break; break;
case 'F': case 'F':
channel_model=EVA;
break;
case 'G':
channel_model=ETU;
break;
case 'H':
channel_model=Rayleigh8;
case 'I':
channel_model=Rayleigh1;
case 'J':
channel_model=Rayleigh1_corr;
case 'K':
channel_model=Rayleigh1_anticorr;
case 'L':
channel_model=Rice8;
case 'M':
channel_model=Rice1;
break; break;
default: default:
printf("Unsupported channel model!\n"); case 'h':
exit(-1); printf("%s -h(elp) -a(wgn on) -p(extended_prefix) -N cell_id -f output_filename -F input_filename -g channel_model -n n_frames -t Delayspread -r Ricean_FactordB -s snr0 -S snr1 -x transmission_mode -y TXant -z RXant -N CellId\n",
} argv[0]);
printf("-h This message\n");
break; printf("-a Use AWGN channel and not multipath\n");
printf("-p Use extended prefix mode\n");
case 'n': printf("-n Number of frames to simulate\n");
n_frames = atoi(optarg); printf("-r Ricean factor (dB, 0 means Rayleigh, 100 is almost AWGN\n");
break; printf("-s Starting SNR, runs from SNR0 to SNR0 + 5 dB. If n_frames is 1 then just SNR is simulated\n");
printf("-S Ending SNR, runs from SNR0 to SNR1\n");
case 's': printf("-t Delay spread for multipath channel\n");
snr0 = atof(optarg); printf("-g [A,B,C,D,E,F,G] Use 3GPP SCM (A,B,C,D) or 36-101 (E-EPA,F-EVA,G-ETU) models (ignores delay spread and Ricean factor)\n");
printf("Setting SNR0 to %f\n",snr0); printf("-x Transmission mode (1,2,6 for the moment)\n");
break; printf("-y Number of TX antennas used in eNB\n");
printf("-z Number of RX antennas used in UE\n");
case 'S': printf("-i Relative strength of first intefering eNB (in dB) - cell_id mod 3 = 1\n");
snr1 = atof(optarg); printf("-j Relative strength of second intefering eNB (in dB) - cell_id mod 3 = 2\n");
snr1set=1; printf("-N Noise variance in dB\n");
printf("Setting SNR1 to %f\n",snr1); printf("-R N_RB_DL\n");
break; printf("-O oversampling factor (1,2,4,8,16)\n");
printf("-f PUCCH format (0=1,1=1a,2=1b,6=3), formats 2/2a/2b not supported\n");
case 'p': printf("-F Input filename (.txt format) for RX conformance testing\n");
extended_prefix_flag=1; exit (-1);
break; break;
case 'r':
ricean_factor = pow(10,-.1*atof(optarg));
if (ricean_factor>1) {
printf("Ricean factor must be between 0 and 1\n");
exit(-1);
}
break;
case 'x':
transmission_mode=atoi(optarg);
if ((transmission_mode!=1) &&
(transmission_mode!=2) &&
(transmission_mode!=6)) {
printf("Unsupported transmission mode %d\n",transmission_mode);
exit(-1);
}
break;
case 'y':
n_tx=atoi(optarg);
if ((n_tx==0) || (n_tx>2)) {
printf("Unsupported number of tx antennas %d\n",n_tx);
exit(-1);
}
break;
case 'z':
n_rx=atoi(optarg);
if ((n_rx==0) || (n_rx>2)) {
printf("Unsupported number of rx antennas %d\n",n_rx);
exit(-1);
}
break;
case 'N':
N0 = atoi(optarg);
break;
case 'T':
pucch1_thres = atoi(optarg);
break;
case 'R':
N_RB_DL = atoi(optarg);
break;
case 'O':
osf = atoi(optarg);
break;
case 'F':
break;
default:
case 'h':
printf("%s -h(elp) -a(wgn on) -p(extended_prefix) -N cell_id -f output_filename -F input_filename -g channel_model -n n_frames -t Delayspread -r Ricean_FactordB -s snr0 -S snr1 -x transmission_mode -y TXant -z RXant -N CellId\n",
argv[0]);
printf("-h This message\n");
printf("-a Use AWGN channel and not multipath\n");
printf("-p Use extended prefix mode\n");
printf("-n Number of frames to simulate\n");
printf("-r Ricean factor (dB, 0 means Rayleigh, 100 is almost AWGN\n");
printf("-s Starting SNR, runs from SNR0 to SNR0 + 5 dB. If n_frames is 1 then just SNR is simulated\n");
printf("-S Ending SNR, runs from SNR0 to SNR1\n");
printf("-t Delay spread for multipath channel\n");
printf("-g [A,B,C,D,E,F,G] Use 3GPP SCM (A,B,C,D) or 36-101 (E-EPA,F-EVA,G-ETU) models (ignores delay spread and Ricean factor)\n");
printf("-x Transmission mode (1,2,6 for the moment)\n");
printf("-y Number of TX antennas used in eNB\n");
printf("-z Number of RX antennas used in UE\n");
printf("-i Relative strength of first intefering eNB (in dB) - cell_id mod 3 = 1\n");
printf("-j Relative strength of second intefering eNB (in dB) - cell_id mod 3 = 2\n");
printf("-N Noise variance in dB\n");
printf("-R N_RB_DL\n");
printf("-O oversampling factor (1,2,4,8,16)\n");
printf("-f PUCCH format (0=1,1=1a,2=1b,6=3), formats 2/2a/2b not supported\n");
printf("-F Input filename (.txt format) for RX conformance testing\n");
exit (-1);
break;
} }
} }
@@ -299,17 +292,16 @@ int main(int argc, char **argv)
lte_param_init(n_tx, lte_param_init(n_tx,
n_tx, n_tx,
n_rx, n_rx,
transmission_mode, transmission_mode,
extended_prefix_flag, extended_prefix_flag,
FDD, FDD,
Nid_cell, Nid_cell,
3, 3,
N_RB_DL, N_RB_DL,
0, 0,
osf, osf,
0); 0);
if (snr1set==0) { if (snr1set==0) {
if (n_frames==1) if (n_frames==1)
@@ -319,42 +311,30 @@ int main(int argc, char **argv)
} }
printf("SNR0 %f, SNR1 %f\n",snr0,snr1); printf("SNR0 %f, SNR1 %f\n",snr0,snr1);
frame_parms = &eNB->frame_parms; frame_parms = &eNB->frame_parms;
txdata = eNB->common_vars.txdata[eNB_id]; txdata = eNB->common_vars.txdata[eNB_id];
nsymb = (frame_parms->Ncp == 0) ? 14 : 12; nsymb = (frame_parms->Ncp == 0) ? 14 : 12;
printf("FFT Size %d, Extended Prefix %d, Samples per subframe %d, Symbols per subframe %d\n",NUMBER_OF_OFDM_CARRIERS, printf("FFT Size %d, Extended Prefix %d, Samples per subframe %d, Symbols per subframe %d\n",NUMBER_OF_OFDM_CARRIERS,
frame_parms->Ncp,frame_parms->samples_per_tti,nsymb); frame_parms->Ncp,frame_parms->samples_per_tti,nsymb);
printf("[SIM] Using SCM/101\n"); printf("[SIM] Using SCM/101\n");
UE2eNB = new_channel_desc_scm(eNB->frame_parms.nb_antennas_tx, UE2eNB = new_channel_desc_scm(eNB->frame_parms.nb_antennas_tx,
UE->frame_parms.nb_antennas_rx, UE->frame_parms.nb_antennas_rx,
channel_model, channel_model,
N_RB2sampling_rate(eNB->frame_parms.N_RB_UL), N_RB2sampling_rate(eNB->frame_parms.N_RB_UL),
N_RB2channel_bandwidth(eNB->frame_parms.N_RB_UL), N_RB2channel_bandwidth(eNB->frame_parms.N_RB_UL),
0.0, 0.0,
0, 0,
0); 0);
if (UE2eNB==NULL) { if (UE2eNB==NULL) {
printf("Problem generating channel model. Exiting.\n"); printf("Problem generating channel model. Exiting.\n");
exit(-1); exit(-1);
} }
init_ncs_cell(&eNB->frame_parms,eNB->ncs_cell); init_ncs_cell(&eNB->frame_parms,eNB->ncs_cell);
init_ncs_cell(&UE->frame_parms,UE->ncs_cell); init_ncs_cell(&UE->frame_parms,UE->ncs_cell);
init_ul_hopping(&eNB->frame_parms); init_ul_hopping(&eNB->frame_parms);
init_ul_hopping(&UE->frame_parms); init_ul_hopping(&UE->frame_parms);
eNB->frame_parms.pucch_config_common.deltaPUCCH_Shift = 2; eNB->frame_parms.pucch_config_common.deltaPUCCH_Shift = 2;
eNB->frame_parms.pucch_config_common.nRB_CQI = 4; eNB->frame_parms.pucch_config_common.nRB_CQI = 4;
eNB->frame_parms.pucch_config_common.nCS_AN = 6; eNB->frame_parms.pucch_config_common.nCS_AN = 6;
@@ -362,40 +342,38 @@ int main(int argc, char **argv)
UE->frame_parms.pucch_config_common.nRB_CQI = 4; UE->frame_parms.pucch_config_common.nRB_CQI = 4;
UE->frame_parms.pucch_config_common.nCS_AN = 6; UE->frame_parms.pucch_config_common.nCS_AN = 6;
if( (pucch_format == pucch_format1) || (pucch_format == pucch_format1a) || (pucch_format == pucch_format1b) ) {
if( (pucch_format == pucch_format1) || (pucch_format == pucch_format1a) || (pucch_format == pucch_format1b) ){
pucch_payload = 0; pucch_payload = 0;
generate_pucch1x(UE->common_vars.txdataF, generate_pucch1x(UE->common_vars.txdataF,
frame_parms, frame_parms,
UE->ncs_cell, UE->ncs_cell,
pucch_format, pucch_format,
&pucch_config_dedicated, &pucch_config_dedicated,
n1_pucch, n1_pucch,
0, //shortened_format, 0, //shortened_format,
&pucch_payload, &pucch_payload,
AMP, //amp, AMP, //amp,
subframe); //subframe subframe); //subframe
}else if( pucch_format == pucch_format3){ } else if( pucch_format == pucch_format3) {
for(i=0;i<pucch3_payload_size;i++) for(i=0; i<pucch3_payload_size; i++)
pucch3_payload[i]=(uint8_t)(taus()&0x1); pucch3_payload[i]=(uint8_t)(taus()&0x1);
generate_pucch3x(UE->common_vars.txdataF, generate_pucch3x(UE->common_vars.txdataF,
frame_parms, frame_parms,
UE->ncs_cell, UE->ncs_cell,
pucch_format, pucch_format,
&pucch_config_dedicated, &pucch_config_dedicated,
n3_pucch, n3_pucch,
0, //shortened_format, 0, //shortened_format,
pucch3_payload, pucch3_payload,
AMP, //amp, AMP, //amp,
subframe, //subframe subframe, //subframe
n_rnti); //rnti n_rnti); //rnti
} }
LOG_M("txsigF0.m","txsF0", &UE->common_vars.txdataF[0][2*subframe*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX],OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX*nsymb,1,1); LOG_M("txsigF0.m","txsF0", &UE->common_vars.txdataF[0][2*subframe*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX],OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX*nsymb,1,1);
tx_lev = 0; tx_lev = 0;
for (aa=0; aa<eNB->frame_parms.nb_antennas_tx; aa++) { for (aa=0; aa<eNB->frame_parms.nb_antennas_tx; aa++) {
if (frame_parms->Ncp == 1) if (frame_parms->Ncp == 1)
PHY_ofdm_mod(&UE->common_vars.txdataF[aa][2*subframe*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX], // input, PHY_ofdm_mod(&UE->common_vars.txdataF[aa][2*subframe*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX], // input,
@@ -413,16 +391,12 @@ int main(int argc, char **argv)
//apply_7_5_kHz(UE,UE->common_vars.txdata[aa],1+(subframe<<1)); //apply_7_5_kHz(UE,UE->common_vars.txdata[aa],1+(subframe<<1));
apply_7_5_kHz(UE,&txdata[aa][eNB->frame_parms.samples_per_tti*subframe],0); apply_7_5_kHz(UE,&txdata[aa][eNB->frame_parms.samples_per_tti*subframe],0);
apply_7_5_kHz(UE,&txdata[aa][eNB->frame_parms.samples_per_tti*subframe],1); apply_7_5_kHz(UE,&txdata[aa][eNB->frame_parms.samples_per_tti*subframe],1);
} }
tx_lev += signal_energy(&txdata[aa][subframe*eNB->frame_parms.samples_per_tti], tx_lev += signal_energy(&txdata[aa][subframe*eNB->frame_parms.samples_per_tti],
OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES); OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES);
} }
LOG_M("txsig0.m","txs0", txdata[0], FRAME_LENGTH_COMPLEX_SAMPLES,1,1); LOG_M("txsig0.m","txs0", txdata[0], FRAME_LENGTH_COMPLEX_SAMPLES,1,1);
//LOG_M("txsig1.m","txs1", txdata[1],FRAME_LENGTH_COMPLEX_SAMPLES,1,1); //LOG_M("txsig1.m","txs1", txdata[1],FRAME_LENGTH_COMPLEX_SAMPLES,1,1);
@@ -435,28 +409,19 @@ int main(int argc, char **argv)
} }
} }
for (SNR=snr0; SNR<snr1; SNR+=.2) { for (SNR=snr0; SNR<snr1; SNR+=.2) {
printf("n_frames %d SNR %f\n",n_frames,SNR); printf("n_frames %d SNR %f\n",n_frames,SNR);
n_errors = 0; n_errors = 0;
pucch_tx = 0; pucch_tx = 0;
pucch1_missed=0; pucch1_missed=0;
pucch1_false=0; pucch1_false=0;
pucch3_false=0; pucch3_false=0;
stat_no_sig = 0; stat_no_sig = 0;
stat_sig = 0; stat_sig = 0;
for (trial=0; trial<n_frames; trial++) { for (trial=0; trial<n_frames; trial++) {
multipath_channel(UE2eNB,s_re,s_im,r_re,r_im, multipath_channel(UE2eNB,s_re,s_im,r_re,r_im,
eNB->frame_parms.samples_per_tti,0); eNB->frame_parms.samples_per_tti,0);
sigma2_dB = N0;//10*log10((double)tx_lev) - SNR; sigma2_dB = N0;//10*log10((double)tx_lev) - SNR;
tx_gain = sqrt(pow(10.0,.1*(N0+SNR))/(double)tx_lev); tx_gain = sqrt(pow(10.0,.1*(N0+SNR))/(double)tx_lev);
@@ -478,11 +443,11 @@ int main(int argc, char **argv)
sig=1; sig=1;
} else { } else {
if (trial<(n_frames>>1)) { if (trial<(n_frames>>1)) {
//printf("no sig =>"); //printf("no sig =>");
sig= 0; sig= 0;
} else { } else {
sig=1; sig=1;
//printf("sig =>"); //printf("sig =>");
pucch_tx++; pucch_tx++;
} }
} }
@@ -493,14 +458,11 @@ int main(int argc, char **argv)
// fill measurement symbol (19) with noise // fill measurement symbol (19) with noise
for (i=0; i<OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES; i++) { for (i=0; i<OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES; i++) {
for (aa=0; aa<eNB->frame_parms.nb_antennas_rx; aa++) { for (aa=0; aa<eNB->frame_parms.nb_antennas_rx; aa++) {
((short *) &eNB->common_vars.rxdata[0][aa][(frame_parms->samples_per_tti<<1) -frame_parms->ofdm_symbol_size])[2*i] = (short) ((sqrt(sigma2/2)*gaussdouble(0.0,1.0)));
((short*) &eNB->common_vars.rxdata[0][aa][(frame_parms->samples_per_tti<<1) -frame_parms->ofdm_symbol_size])[2*i] = (short) ((sqrt(sigma2/2)*gaussdouble(0.0,1.0))); ((short *) &eNB->common_vars.rxdata[0][aa][(frame_parms->samples_per_tti<<1) -frame_parms->ofdm_symbol_size])[2*i+1] = (short) ((sqrt(sigma2/2)*gaussdouble(0.0,1.0)));
((short*) &eNB->common_vars.rxdata[0][aa][(frame_parms->samples_per_tti<<1) -frame_parms->ofdm_symbol_size])[2*i+1] = (short) ((sqrt(sigma2/2)*gaussdouble(0.0,1.0)));
} }
} }
for (i=0; i<2*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES; i++) { for (i=0; i<2*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES; i++) {
for (aa=0; aa<eNB->frame_parms.nb_antennas_rx; aa++) { for (aa=0; aa<eNB->frame_parms.nb_antennas_rx; aa++) {
if (n_trials==0) { if (n_trials==0) {
@@ -508,14 +470,12 @@ int main(int argc, char **argv)
// r_im[aa][i] += (pow(10.0,.05*interf1)*r_im1[aa][i] + pow(10.0,.05*interf2)*r_im2[aa][i]); // r_im[aa][i] += (pow(10.0,.05*interf1)*r_im1[aa][i] + pow(10.0,.05*interf2)*r_im2[aa][i]);
} }
if (sig==1) { if (sig==1) {
((short*) &eNB->common_vars.rxdata[0][aa][subframe*frame_parms->samples_per_tti])[2*i] = (short) (((tx_gain*r_re[aa][i]) +sqrt(sigma2/2)*gaussdouble(0.0,1.0))); ((short *) &eNB->common_vars.rxdata[0][aa][subframe*frame_parms->samples_per_tti])[2*i] = (short) (((tx_gain*r_re[aa][i]) +sqrt(sigma2/2)*gaussdouble(0.0,1.0)));
((short*) &eNB->common_vars.rxdata[0][aa][subframe*frame_parms->samples_per_tti])[2*i+1] = (short) (((tx_gain*r_im[aa][i]) + (iqim*r_re[aa][i]*tx_gain) + sqrt(sigma2/2)*gaussdouble(0.0,1.0))); ((short *) &eNB->common_vars.rxdata[0][aa][subframe*frame_parms->samples_per_tti])[2*i+1] = (short) (((tx_gain*r_im[aa][i]) + (iqim*r_re[aa][i]*tx_gain) + sqrt(sigma2/2)*gaussdouble(0.0,1.0)));
} else { } else {
((short*) &eNB->common_vars.rxdata[0][aa][subframe*frame_parms->samples_per_tti])[2*i] = (short) ((sqrt(sigma2/2)*gaussdouble(0.0,1.0))); ((short *) &eNB->common_vars.rxdata[0][aa][subframe*frame_parms->samples_per_tti])[2*i] = (short) ((sqrt(sigma2/2)*gaussdouble(0.0,1.0)));
((short*) &eNB->common_vars.rxdata[0][aa][subframe*frame_parms->samples_per_tti])[2*i+1] = (short) ((sqrt(sigma2/2)*gaussdouble(0.0,1.0))); ((short *) &eNB->common_vars.rxdata[0][aa][subframe*frame_parms->samples_per_tti])[2*i+1] = (short) ((sqrt(sigma2/2)*gaussdouble(0.0,1.0)));
} }
} }
} }
@@ -524,7 +484,6 @@ int main(int argc, char **argv)
remove_7_5_kHz(eNB,1+(subframe<<1)); remove_7_5_kHz(eNB,1+(subframe<<1));
for (l=0; l<eNB->frame_parms.symbols_per_tti/2; l++) { for (l=0; l<eNB->frame_parms.symbols_per_tti/2; l++) {
slot_fep_ul(&eNB->frame_parms, slot_fep_ul(&eNB->frame_parms,
&eNB->common_vars, &eNB->common_vars,
l, l,
@@ -539,16 +498,13 @@ int main(int argc, char **argv)
0, 0,
0 0
); );
} }
// if (sig == 1) // if (sig == 1)
// printf("*"); // printf("*");
lte_eNB_I0_measurements(eNB, lte_eNB_I0_measurements(eNB,
subframe, subframe,
0, 0,
1); 1);
eNB->measurements[0].n0_power_tot_dB = N0;//(int8_t)(sigma2_dB-10*log10(eNB->frame_parms.ofdm_symbol_size/(12*NB_RB))); eNB->measurements[0].n0_power_tot_dB = N0;//(int8_t)(sigma2_dB-10*log10(eNB->frame_parms.ofdm_symbol_size/(12*NB_RB)));
stat = rx_pucch(eNB, stat = rx_pucch(eNB,
@@ -580,9 +536,9 @@ int main(int argc, char **argv)
}*/ }*/
} else if( (pucch_format==pucch_format1a) || (pucch_format==pucch_format1b) ) { } else if( (pucch_format==pucch_format1a) || (pucch_format==pucch_format1b) ) {
pucch1_false = (pucch_payload_rx != pucch_payload) ? (pucch1_false+1) : pucch1_false; pucch1_false = (pucch_payload_rx != pucch_payload) ? (pucch1_false+1) : pucch1_false;
} else if (pucch_format==pucch_format3){ } else if (pucch_format==pucch_format3) {
for(i=0;i<pucch3_payload_size;i++){ for(i=0; i<pucch3_payload_size; i++) {
if(pucch3_payload[i]!=pucch3_payload_rx[i]){ if(pucch3_payload[i]!=pucch3_payload_rx[i]) {
pucch3_false = (pucch3_false+1); pucch3_false = (pucch3_false+1);
break; break;
} }
@@ -611,11 +567,8 @@ int main(int argc, char **argv)
LOG_M("rxsigF0.m","rxsF0", &eNB->common_vars.rxdataF[0][0][0],512*nsymb*2,2,1); LOG_M("rxsigF0.m","rxsF0", &eNB->common_vars.rxdataF[0][0][0],512*nsymb*2,2,1);
} }
lte_sync_time_free(); lte_sync_time_free();
return(n_errors); return(n_errors);
} }
+214 -249
View File
@@ -38,7 +38,7 @@
#include "LAYER2/MAC/vars.h" #include "LAYER2/MAC/vars.h"
#ifdef XFORMS #ifdef XFORMS
#include "PHY/TOOLS/lte_phy_scope.h" #include "PHY/TOOLS/lte_phy_scope.h"
#endif #endif
#include "OCG_vars.h" #include "OCG_vars.h"
@@ -58,11 +58,8 @@ mod_sym_t dummy2[2048*14];
mod_sym_t dummy3[2048*14]; mod_sym_t dummy3[2048*14];
int main(int argc, char **argv) int main(int argc, char **argv) {
{
char c; char c;
int i,l,aa; int i,l,aa;
double sigma2, sigma2_dB=0,SNR,snr0=-2.0,snr1; double sigma2, sigma2_dB=0,SNR,snr0=-2.0,snr1;
uint8_t snr1set=0; uint8_t snr1set=0;
@@ -82,226 +79,192 @@ int main(int argc, char **argv)
int trial, n_trials, ntrials=1, n_errors,n_errors2,n_alamouti; int trial, n_trials, ntrials=1, n_errors,n_errors2,n_alamouti;
uint8_t transmission_mode = 1,n_tx=1,n_rx=1; uint8_t transmission_mode = 1,n_tx=1,n_rx=1;
uint16_t Nid_cell=0; uint16_t Nid_cell=0;
int n_frames=1; int n_frames=1;
channel_desc_t *eNB2UE,*eNB2UE1,*eNB2UE2; channel_desc_t *eNB2UE,*eNB2UE1,*eNB2UE2;
uint32_t nsymb,tx_lev,tx_lev1,tx_lev2; uint32_t nsymb,tx_lev,tx_lev1,tx_lev2;
uint8_t extended_prefix_flag=0; uint8_t extended_prefix_flag=0;
LTE_DL_FRAME_PARMS *frame_parms; LTE_DL_FRAME_PARMS *frame_parms;
FILE *input_fd=NULL,*pbch_file_fd=NULL; FILE *input_fd=NULL,*pbch_file_fd=NULL;
char input_val_str[50],input_val_str2[50]; char input_val_str[50],input_val_str2[50];
// double input_val1,input_val2; // double input_val1,input_val2;
// uint16_t amask=0; // uint16_t amask=0;
uint8_t frame_mod4,num_pdcch_symbols; uint8_t frame_mod4,num_pdcch_symbols;
uint16_t NB_RB=25; uint16_t NB_RB=25;
SCM_t channel_model=AWGN;//Rayleigh1_anticorr; SCM_t channel_model=AWGN;//Rayleigh1_anticorr;
DCI_ALLOC_t dci_alloc[8]; DCI_ALLOC_t dci_alloc[8];
uint8_t abstraction_flag=0;//,calibration_flag=0; uint8_t abstraction_flag=0;//,calibration_flag=0;
int pbch_tx_ant; int pbch_tx_ant;
uint8_t N_RB_DL=100,osf=1; uint8_t N_RB_DL=100,osf=1;
unsigned char frame_type = FDD; unsigned char frame_type = FDD;
unsigned char pbch_phase = 0; unsigned char pbch_phase = 0;
#ifdef XFORMS #ifdef XFORMS
FD_lte_phy_scope_ue *form_ue; FD_lte_phy_scope_ue *form_ue;
char title[255]; char title[255];
#endif #endif
logInit(); logInit();
number_of_cards = 1; number_of_cards = 1;
openair_daq_vars.rx_rf_mode = 1; openair_daq_vars.rx_rf_mode = 1;
/*
rxdataF = (int **)malloc16(2*sizeof(int*));
rxdataF[0] = (int *)malloc16(FRAME_LENGTH_BYTES);
rxdataF[1] = (int *)malloc16(FRAME_LENGTH_BYTES);
rxdata = (int **)malloc16(2*sizeof(int*));
rxdata[0] = (int *)malloc16(FRAME_LENGTH_BYTES);
rxdata[1] = (int *)malloc16(FRAME_LENGTH_BYTES);
*/
while ((c = getopt (argc, argv, "f:hpf:g:n:s:S:t:x:y:z:N:F:GdP:")) != -1) { while ((c = getopt (argc, argv, "f:hpf:g:n:s:S:t:x:y:z:N:F:GdP:")) != -1) {
switch (c) { switch (c) {
case 'f': case 'f':
write_output_file=1; write_output_file=1;
output_fd = fopen(optarg,"w"); output_fd = fopen(optarg,"w");
if (output_fd==NULL) { if (output_fd==NULL) {
printf("Error opening %s\n",optarg); printf("Error opening %s\n",optarg);
exit(-1); exit(-1);
} }
break; break;
case 'd': case 'd':
frame_type = TDD; frame_type = TDD;
break; break;
case 'g':
switch((char)*optarg) {
case 'A':
channel_model=SCM_A;
break;
case 'B':
channel_model=SCM_B;
break;
case 'C':
channel_model=SCM_C;
break;
case 'D':
channel_model=SCM_D;
break;
case 'E':
channel_model=EPA;
break;
case 'F':
channel_model=EVA;
break;
case 'G':
channel_model=ETU;
break;
default:
msg("Unsupported channel model!\n");
exit(-1);
}
break;
case 'n':
n_frames = atoi(optarg);
break;
case 's':
snr0 = atof(optarg);
msg("Setting SNR0 to %f\n",snr0);
break;
case 'S':
snr1 = atof(optarg);
snr1set=1;
msg("Setting SNR1 to %f\n",snr1);
break;
case 'p':
extended_prefix_flag=1;
break;
case 'x':
transmission_mode=atoi(optarg);
if ((transmission_mode!=1) &&
(transmission_mode!=2) &&
(transmission_mode!=6)) {
msg("Unsupported transmission mode %d\n",transmission_mode);
exit(-1);
}
break;
case 'y':
n_tx=atoi(optarg);
if ((n_tx==0) || (n_tx>2)) {
msg("Unsupported number of tx antennas %d\n",n_tx);
exit(-1);
}
break;
case 'z':
n_rx=atoi(optarg);
if ((n_rx==0) || (n_rx>2)) {
msg("Unsupported number of rx antennas %d\n",n_rx);
exit(-1);
}
break;
case 'g':
switch((char)*optarg) {
case 'A': case 'A':
channel_model=SCM_A; abstraction_flag=1;
ntrials=10000;
msg("Running Abstraction test\n");
pbch_file_fd=fopen(optarg,"r");
if (pbch_file_fd==NULL) {
printf("Problem with filename %s\n",optarg);
exit(-1);
}
break; break;
case 'B': case 'N':
channel_model=SCM_B; Nid_cell = atoi(optarg);
break;
case 'C':
channel_model=SCM_C;
break;
case 'D':
channel_model=SCM_D;
break;
case 'E':
channel_model=EPA;
break; break;
case 'F': case 'F':
channel_model=EVA; input_fd = fopen(optarg,"r");
if (input_fd==NULL) {
printf("Problem with filename %s\n",optarg);
exit(-1);
}
break; break;
case 'G': case 'P':
channel_model=ETU; pbch_phase = atoi(optarg);
if (pbch_phase>3)
printf("Illegal PBCH phase (0-3) got %d\n",pbch_phase);
break; break;
default: default:
msg("Unsupported channel model!\n"); case 'h':
exit(-1); printf("%s -h(elp) -p(extended_prefix) -N cell_id -f output_filename -F input_filename -g channel_model -n n_frames -t Delayspread -s snr0 -S snr1 -x transmission_mode -y TXant -z RXant -N CellId\n",
} argv[0]);
printf("-h This message\n");
break; printf("-p Use extended prefix mode\n");
printf("-d Use TDD\n");
case 'n': printf("-n Number of frames to simulate\n");
n_frames = atoi(optarg); printf("-s Starting SNR, runs from SNR0 to SNR0 + 5 dB. If n_frames is 1 then just SNR is simulated\n");
break; printf("-S Ending SNR, runs from SNR0 to SNR1\n");
printf("-t Delay spread for multipath channel\n");
case 's': printf("-g [A,B,C,D,E,F,G] Use 3GPP SCM (A,B,C,D) or 36-101 (E-EPA,F-EVA,G-ETU) models (ignores delay spread and Ricean factor)\n");
snr0 = atof(optarg); printf("-x Transmission mode (1,2,6 for the moment)\n");
msg("Setting SNR0 to %f\n",snr0); printf("-y Number of TX antennas used in eNB\n");
break; printf("-z Number of RX antennas used in UE\n");
printf("-N Nid_cell\n");
case 'S': printf("-f Output filename (.txt format) for Pe/SNR results\n");
snr1 = atof(optarg); printf("-F Input filename (.txt format) for RX conformance testing\n");
snr1set=1; exit (-1);
msg("Setting SNR1 to %f\n",snr1);
break;
/*
case 't':
Td= atof(optarg);
break; break;
*/
case 'p':
extended_prefix_flag=1;
break;
/*
case 'r':
ricean_factor = pow(10,-.1*atof(optarg));
if (ricean_factor>1) {
printf("Ricean factor must be between 0 and 1\n");
exit(-1);
}
break;
*/
case 'x':
transmission_mode=atoi(optarg);
if ((transmission_mode!=1) &&
(transmission_mode!=2) &&
(transmission_mode!=6)) {
msg("Unsupported transmission mode %d\n",transmission_mode);
exit(-1);
}
break;
case 'y':
n_tx=atoi(optarg);
if ((n_tx==0) || (n_tx>2)) {
msg("Unsupported number of tx antennas %d\n",n_tx);
exit(-1);
}
break;
case 'z':
n_rx=atoi(optarg);
if ((n_rx==0) || (n_rx>2)) {
msg("Unsupported number of rx antennas %d\n",n_rx);
exit(-1);
}
break;
case 'A':
abstraction_flag=1;
ntrials=10000;
msg("Running Abstraction test\n");
pbch_file_fd=fopen(optarg,"r");
if (pbch_file_fd==NULL) {
printf("Problem with filename %s\n",optarg);
exit(-1);
}
break;
// case 'C':
// calibration_flag=1;
// msg("Running Abstraction calibration for Bias removal\n");
// break;
case 'N':
Nid_cell = atoi(optarg);
break;
case 'F':
input_fd = fopen(optarg,"r");
if (input_fd==NULL) {
printf("Problem with filename %s\n",optarg);
exit(-1);
}
break;
case 'P':
pbch_phase = atoi(optarg);
if (pbch_phase>3)
printf("Illegal PBCH phase (0-3) got %d\n",pbch_phase);
break;
default:
case 'h':
printf("%s -h(elp) -p(extended_prefix) -N cell_id -f output_filename -F input_filename -g channel_model -n n_frames -t Delayspread -s snr0 -S snr1 -x transmission_mode -y TXant -z RXant -N CellId\n",
argv[0]);
printf("-h This message\n");
printf("-p Use extended prefix mode\n");
printf("-d Use TDD\n");
printf("-n Number of frames to simulate\n");
printf("-s Starting SNR, runs from SNR0 to SNR0 + 5 dB. If n_frames is 1 then just SNR is simulated\n");
printf("-S Ending SNR, runs from SNR0 to SNR1\n");
printf("-t Delay spread for multipath channel\n");
printf("-g [A,B,C,D,E,F,G] Use 3GPP SCM (A,B,C,D) or 36-101 (E-EPA,F-EVA,G-ETU) models (ignores delay spread and Ricean factor)\n");
printf("-x Transmission mode (1,2,6 for the moment)\n");
printf("-y Number of TX antennas used in eNB\n");
printf("-z Number of RX antennas used in UE\n");
printf("-N Nid_cell\n");
printf("-f Output filename (.txt format) for Pe/SNR results\n");
printf("-F Input filename (.txt format) for RX conformance testing\n");
exit (-1);
break;
} }
} }
@@ -309,16 +272,15 @@ int main(int argc, char **argv)
n_tx=2; n_tx=2;
lte_param_init(n_tx, lte_param_init(n_tx,
n_rx, n_rx,
transmission_mode, transmission_mode,
extended_prefix_flag, extended_prefix_flag,
frame_type, frame_type,
Nid_cell, Nid_cell,
3, 3,
N_RB_DL, N_RB_DL,
osf, osf,
0); 0);
#ifdef XFORMS #ifdef XFORMS
fl_initialize (&argc, argv, NULL, 0, 0); fl_initialize (&argc, argv, NULL, 0, 0);
form_ue = create_lte_phy_scope_ue(); form_ue = create_lte_phy_scope_ue();
@@ -334,38 +296,27 @@ int main(int argc, char **argv)
} }
printf("SNR0 %f, SNR1 %f\n",snr0,snr1); printf("SNR0 %f, SNR1 %f\n",snr0,snr1);
frame_parms = &PHY_vars_eNB->lte_frame_parms; frame_parms = &PHY_vars_eNB->lte_frame_parms;
txdata = PHY_vars_eNB->lte_eNB_common_vars.txdata[0]; txdata = PHY_vars_eNB->lte_eNB_common_vars.txdata[0];
txdata1 = PHY_vars_eNB1->lte_eNB_common_vars.txdata[0]; txdata1 = PHY_vars_eNB1->lte_eNB_common_vars.txdata[0];
txdata2 = PHY_vars_eNB2->lte_eNB_common_vars.txdata[0]; txdata2 = PHY_vars_eNB2->lte_eNB_common_vars.txdata[0];
s_re = malloc(2*sizeof(double *));
s_im = malloc(2*sizeof(double *));
s_re = malloc(2*sizeof(double*)); s_re1 = malloc(2*sizeof(double *));
s_im = malloc(2*sizeof(double*)); s_im1 = malloc(2*sizeof(double *));
s_re1 = malloc(2*sizeof(double*)); s_re2 = malloc(2*sizeof(double *));
s_im1 = malloc(2*sizeof(double*)); s_im2 = malloc(2*sizeof(double *));
s_re2 = malloc(2*sizeof(double*)); r_re = malloc(2*sizeof(double *));
s_im2 = malloc(2*sizeof(double*)); r_im = malloc(2*sizeof(double *));
r_re = malloc(2*sizeof(double*)); r_re1 = malloc(2*sizeof(double *));
r_im = malloc(2*sizeof(double*)); r_im1 = malloc(2*sizeof(double *));
r_re1 = malloc(2*sizeof(double*)); r_re2 = malloc(2*sizeof(double *));
r_im1 = malloc(2*sizeof(double*)); r_im2 = malloc(2*sizeof(double *));
r_re2 = malloc(2*sizeof(double*));
r_im2 = malloc(2*sizeof(double*));
nsymb = (frame_parms->Ncp == 0) ? 14 : 12; nsymb = (frame_parms->Ncp == 0) ? 14 : 12;
printf("FFT Size %d, Extended Prefix %d, Samples per subframe %d, Symbols per subframe %d\n",NUMBER_OF_OFDM_CARRIERS, printf("FFT Size %d, Extended Prefix %d, Samples per subframe %d, Symbols per subframe %d\n",NUMBER_OF_OFDM_CARRIERS,
frame_parms->Ncp,frame_parms->samples_per_tti,nsymb); frame_parms->Ncp,frame_parms->samples_per_tti,nsymb);
printf("PHY_vars_eNB1->lte_eNB_common_vars.txdataF[0][0] = %p\n", printf("PHY_vars_eNB1->lte_eNB_common_vars.txdataF[0][0] = %p\n",
PHY_vars_eNB1->lte_eNB_common_vars.txdataF[0][0]); PHY_vars_eNB1->lte_eNB_common_vars.txdataF[0][0]);
DLSCH_alloc_pdu2.rah = 0; DLSCH_alloc_pdu2.rah = 0;
DLSCH_alloc_pdu2.rballoc = DLSCH_RB_ALLOC; DLSCH_alloc_pdu2.rballoc = DLSCH_RB_ALLOC;
DLSCH_alloc_pdu2.TPC = 0; DLSCH_alloc_pdu2.TPC = 0;
@@ -377,16 +328,14 @@ int main(int argc, char **argv)
DLSCH_alloc_pdu2.rv1 = 0; DLSCH_alloc_pdu2.rv1 = 0;
// Forget second codeword // Forget second codeword
DLSCH_alloc_pdu2.tpmi = (transmission_mode==6 ? 5 : 0) ; // precoding DLSCH_alloc_pdu2.tpmi = (transmission_mode==6 ? 5 : 0) ; // precoding
eNB2UE = new_channel_desc_scm(PHY_vars_eNB->lte_frame_parms.nb_antennas_tx, eNB2UE = new_channel_desc_scm(PHY_vars_eNB->lte_frame_parms.nb_antennas_tx,
PHY_vars_UE->lte_frame_parms.nb_antennas_rx, PHY_vars_UE->lte_frame_parms.nb_antennas_rx,
channel_model, channel_model,
N_RB2sampling_rate(PHY_vars_eNB->lte_frame_parms.N_RB_DL), N_RB2sampling_rate(PHY_vars_eNB->lte_frame_parms.N_RB_DL),
N_RB2channel_bandwidth(PHY_vars_eNB->lte_frame_parms.N_RB_DL), N_RB2channel_bandwidth(PHY_vars_eNB->lte_frame_parms.N_RB_DL),
0, 0,
0, 0,
0); 0);
if (eNB2UE==NULL) { if (eNB2UE==NULL) {
msg("Problem generating channel model. Exiting.\n"); msg("Problem generating channel model. Exiting.\n");
@@ -394,7 +343,6 @@ int main(int argc, char **argv)
} }
for (i=0; i<2; i++) { for (i=0; i<2; i++) {
s_re[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); s_re[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
bzero(s_re[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); bzero(s_re[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
s_im[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); s_im[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
@@ -407,7 +355,6 @@ int main(int argc, char **argv)
bzero(s_re2[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); bzero(s_re2[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
s_im2[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); s_im2[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
bzero(s_im2[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); bzero(s_im2[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
r_re[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); r_re[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
bzero(r_re[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); bzero(r_re[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
r_im[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); r_im[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
@@ -450,9 +397,7 @@ int main(int argc, char **argv)
(PHY_vars_eNB->lte_frame_parms.Ncp==0) ? 5 : 4, (PHY_vars_eNB->lte_frame_parms.Ncp==0) ? 5 : 4,
10); 10);
*/ */
} else { } else {
generate_sss(PHY_vars_eNB->lte_eNB_common_vars.txdataF[0], generate_sss(PHY_vars_eNB->lte_eNB_common_vars.txdataF[0],
AMP, AMP,
&PHY_vars_eNB->lte_frame_parms, &PHY_vars_eNB->lte_frame_parms,
@@ -473,11 +418,8 @@ int main(int argc, char **argv)
&PHY_vars_eNB->lte_frame_parms, &PHY_vars_eNB->lte_frame_parms,
2, 2,
12); 12);
} }
/* /*
generate_pilots(PHY_vars_eNB, generate_pilots(PHY_vars_eNB,
PHY_vars_eNB->lte_eNB_common_vars.txdataF[0], PHY_vars_eNB->lte_eNB_common_vars.txdataF[0],
@@ -494,7 +436,6 @@ int main(int argc, char **argv)
PHY_vars_eNB->lte_eNB_common_vars.txdataF[0], PHY_vars_eNB->lte_eNB_common_vars.txdataF[0],
0); 0);
*/ */
/* /*
if (num_pdcch_symbols<3) { if (num_pdcch_symbols<3) {
printf("Less than 3 pdcch symbols\n"); printf("Less than 3 pdcch symbols\n");
@@ -530,9 +471,6 @@ int main(int argc, char **argv)
tx_lev1 = 0; tx_lev1 = 0;
tx_lev2 = 0; tx_lev2 = 0;
for (aa=0; aa<PHY_vars_eNB->lte_frame_parms.nb_antennas_tx; aa++) { for (aa=0; aa<PHY_vars_eNB->lte_frame_parms.nb_antennas_tx; aa++) {
if (frame_parms->Ncp == 1) if (frame_parms->Ncp == 1)
PHY_ofdm_mod(PHY_vars_eNB->lte_eNB_common_vars.txdataF[0][aa], // input, PHY_ofdm_mod(PHY_vars_eNB->lte_eNB_common_vars.txdataF[0][aa], // input,
@@ -552,7 +490,6 @@ int main(int argc, char **argv)
OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES); OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES);
} }
LOG_M("txsig0.m","txs0", txdata[0],FRAME_LENGTH_COMPLEX_SAMPLES,1,1); LOG_M("txsig0.m","txs0", txdata[0],FRAME_LENGTH_COMPLEX_SAMPLES,1,1);
if (frame_parms->nb_antennas_tx>1) if (frame_parms->nb_antennas_tx>1)
@@ -567,19 +504,14 @@ int main(int argc, char **argv)
} }
} }
for (SNR=snr0; SNR<snr1; SNR+=.2) { for (SNR=snr0; SNR<snr1; SNR+=.2) {
n_errors = 0; n_errors = 0;
n_errors2 = 0; n_errors2 = 0;
n_alamouti = 0; n_alamouti = 0;
for (trial=0; trial<n_frames; trial++) { for (trial=0; trial<n_frames; trial++) {
multipath_channel(eNB2UE,s_re,s_im,r_re,r_im, multipath_channel(eNB2UE,s_re,s_im,r_re,r_im,
2*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES,0); 2*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES,0);
sigma2_dB = 10*log10((double)tx_lev) +10*log10((double)PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size/(double)(12*NB_RB)) - SNR; sigma2_dB = 10*log10((double)tx_lev) +10*log10((double)PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size/(double)(12*NB_RB)) - SNR;
if (n_frames==1) if (n_frames==1)
@@ -603,8 +535,8 @@ int main(int argc, char **argv)
//printf("n_trial %d\n",n_trials); //printf("n_trial %d\n",n_trials);
for (i=0; i<2*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES; i++) { for (i=0; i<2*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES; i++) {
for (aa=0; aa<PHY_vars_eNB->lte_frame_parms.nb_antennas_rx; aa++) { for (aa=0; aa<PHY_vars_eNB->lte_frame_parms.nb_antennas_rx; aa++) {
((short*) PHY_vars_UE->lte_ue_common_vars.rxdata[aa])[2*i] = (short) ((r_re[aa][i] +sqrt(sigma2/2)*gaussdouble(0.0,1.0))); ((short *) PHY_vars_UE->lte_ue_common_vars.rxdata[aa])[2*i] = (short) ((r_re[aa][i] +sqrt(sigma2/2)*gaussdouble(0.0,1.0)));
((short*) PHY_vars_UE->lte_ue_common_vars.rxdata[aa])[2*i+1] = (short) ((r_im[aa][i] + (iqim*r_re[aa][i]) + sqrt(sigma2/2)*gaussdouble(0.0,1.0))); ((short *) PHY_vars_UE->lte_ue_common_vars.rxdata[aa])[2*i+1] = (short) ((r_im[aa][i] + (iqim*r_re[aa][i]) + sqrt(sigma2/2)*gaussdouble(0.0,1.0)));
} }
} }
@@ -614,8 +546,6 @@ int main(int argc, char **argv)
printf("rx_level data symbol %f\n", printf("rx_level data symbol %f\n",
10*log10(signal_energy(&PHY_vars_UE->lte_ue_common_vars.rxdata[0][frame_parms->samples_per_tti/2],4*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES))); 10*log10(signal_energy(&PHY_vars_UE->lte_ue_common_vars.rxdata[0][frame_parms->samples_per_tti/2],4*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES)));
} }
} //noise trials } //noise trials
} // trials } // trials
@@ -629,30 +559,65 @@ int main(int argc, char **argv)
} // NSR } // NSR
if (n_frames==1) { if (n_frames==1) {
} }
for (i=0; i<2; i++) { for (i=0; i<2; i++) {
free(s_re[i]); free(s_re[i]);
free(s_im[i]); free(s_im[i]);
if (s_im1)
free(s_im1[i]);
if (s_im2)
free(s_im2[i]);
free(r_re[i]); free(r_re[i]);
if (r_re1)
free(r_re1[i]);
if (r_re2)
free(r_re2[i]);
free(r_im[i]); free(r_im[i]);
if (s_re1)
free(s_re1[i]);
if (s_re2)
free(s_re2[i]);
if (r_im1)
free(r_im1[i]);
if (r_im2)
free(r_im2[i]);
} }
free(s_re); free(s_re);
free(s_re1);
free(s_re2);
free(s_im); free(s_im);
free(s_im1);
free(s_im2);
free(r_re); free(r_re);
free(r_re1);
free(r_re2);
free(r_im); free(r_im);
free(r_im1);
free(r_im2);
lte_sync_time_free(); lte_sync_time_free();
if (write_output_file) if (write_output_file)
fclose(output_fd); fclose(output_fd);
return(n_errors); if (input_fd)
fclose(input_fd);
if (pbch_file_fd)
fclose(pbch_file_fd);
return(n_errors);
} }
File diff suppressed because it is too large Load Diff
+133 -147
View File
@@ -349,19 +349,6 @@ int main(int argc, char **argv) {
char input_val_str[50],input_val_str2[50]; char input_val_str[50],input_val_str2[50];
// FILE *rx_frame_file; // FILE *rx_frame_file;
FILE *csv_fdUL=NULL; FILE *csv_fdUL=NULL;
/*
FILE *fperen=NULL;
char fperen_name[512];
FILE *fmageren=NULL;
char fmageren_name[512];
FILE *flogeren=NULL;
char flogeren_name[512];
*/
/* FILE *ftxlev;
char ftxlev_name[512];
*/
char csv_fname[512]; char csv_fname[512];
static int n_frames=5000; static int n_frames=5000;
static int n_ch_rlz = 1; static int n_ch_rlz = 1;
@@ -405,7 +392,6 @@ int main(int argc, char **argv) {
cpu_freq_GHz = (double)get_cpu_freq_GHz(); cpu_freq_GHz = (double)get_cpu_freq_GHz();
cpuf = cpu_freq_GHz; cpuf = cpu_freq_GHz;
set_parallel_conf("PARALLEL_SINGLE_THREAD"); set_parallel_conf("PARALLEL_SINGLE_THREAD");
printf("Detected cpu_freq %f GHz\n",cpu_freq_GHz); printf("Detected cpu_freq %f GHz\n",cpu_freq_GHz);
AssertFatal(load_configmodule(argc,argv,CONFIG_ENABLECMDLINEONLY) != NULL, AssertFatal(load_configmodule(argc,argv,CONFIG_ENABLECMDLINEONLY) != NULL,
"cannot load configuration module, exiting\n"); "cannot load configuration module, exiting\n");
@@ -456,10 +442,8 @@ int main(int argc, char **argv) {
{ "help", "display help and exit", PARAMFLAG_BOOL, iptr:&help, defintval:0, TYPE_INT, 0 }, { "help", "display help and exit", PARAMFLAG_BOOL, iptr:&help, defintval:0, TYPE_INT, 0 },
{ "", "",0, iptr:NULL, defintval:0, TYPE_INT, 0 }, { "", "",0, iptr:NULL, defintval:0, TYPE_INT, 0 },
}; };
struct option * long_options = parse_oai_options(options); struct option *long_options = parse_oai_options(options);
int option_index; int option_index;
int res; int res;
while ((res=getopt_long_only(argc, argv, "", long_options, &option_index)) == 0) { while ((res=getopt_long_only(argc, argv, "", long_options, &option_index)) == 0) {
@@ -467,125 +451,125 @@ int main(int argc, char **argv) {
if (long_options[option_index].has_arg==no_argument) if (long_options[option_index].has_arg==no_argument)
*(bool *)options[option_index].iptr=1; *(bool *)options[option_index].iptr=1;
else switch (options[option_index].type) { else switch (options[option_index].type) {
case TYPE_INT: case TYPE_INT:
*(int *)options[option_index].iptr=atoi(optarg); *(int *)options[option_index].iptr=atoi(optarg);
break; break;
case TYPE_DOUBLE: case TYPE_DOUBLE:
*(double *)options[option_index].dblptr=atof(optarg); *(double *)options[option_index].dblptr=atof(optarg);
break; break;
case TYPE_UINT8: case TYPE_UINT8:
*(uint8_t *)options[option_index].dblptr=atoi(optarg); *(uint8_t *)options[option_index].dblptr=atoi(optarg);
break; break;
case TYPE_UINT16: case TYPE_UINT16:
*(uint16_t *)options[option_index].dblptr=atoi(optarg); *(uint16_t *)options[option_index].dblptr=atoi(optarg);
break; break;
default: default:
printf("not decoded type.\n"); printf("not decoded type.\n");
exit(1); exit(1);
} }
continue; continue;
} }
switch (long_options[option_index].name[0]) { switch (long_options[option_index].name[0]) {
case 'T': case 'T':
tdd_config=atoi(optarg); tdd_config=atoi(optarg);
frame_type=TDD; frame_type=TDD;
break; break;
case 'a': case 'a':
channel_model = AWGN; channel_model = AWGN;
chMod = 1; chMod = 1;
break; break;
case 'g': case 'g':
strncpy(channel_model_input,optarg,9); strncpy(channel_model_input,optarg,9);
struct tmp { struct tmp {
char opt; char opt;
int m; int m;
int M; int M;
} }
tmp[]= { tmp[]= {
{'A',SCM_A,2}, {'A',SCM_A,2},
{'B',SCM_B,3}, {'B',SCM_B,3},
{'C',SCM_C,4}, {'C',SCM_C,4},
{'D',SCM_D,5}, {'D',SCM_D,5},
{'E',EPA,6}, {'E',EPA,6},
{'G',ETU,8}, {'G',ETU,8},
{'H',Rayleigh8,9}, {'H',Rayleigh8,9},
{'I',Rayleigh1,10}, {'I',Rayleigh1,10},
{'J',Rayleigh1_corr,11}, {'J',Rayleigh1_corr,11},
{'K',Rayleigh1_anticorr,12}, {'K',Rayleigh1_anticorr,12},
{'L',Rice8,13}, {'L',Rice8,13},
{'M',Rice1,14}, {'M',Rice1,14},
{'N',AWGN,1}, {'N',AWGN,1},
{0,0,0} {0,0,0}
}; };
struct tmp *ptr; struct tmp *ptr;
for (ptr=tmp; ptr->opt!=0; ptr++) for (ptr=tmp; ptr->opt!=0; ptr++)
if ( ptr->opt == optarg[0] ) { if ( ptr->opt == optarg[0] ) {
channel_model=ptr->m; channel_model=ptr->m;
chMod=ptr->M; chMod=ptr->M;
break; break;
} }
AssertFatal(ptr->opt != 0, "Unsupported channel model: %s !\n", optarg ); AssertFatal(ptr->opt != 0, "Unsupported channel model: %s !\n", optarg );
break; break;
case 'x': case 'x':
transmission_m=atoi(optarg); transmission_m=atoi(optarg);
AssertFatal(transmission_m==1 || transmission_m==2, AssertFatal(transmission_m==1 || transmission_m==2,
"Unsupported transmission mode %d\n",transmission_m); "Unsupported transmission mode %d\n",transmission_m);
break; break;
case 'r': case 'r':
nb_rb = atoi(optarg); nb_rb = atoi(optarg);
nb_rb_set = 1; nb_rb_set = 1;
break; break;
//case 'c': //case 'c':
// cyclic_shift = atoi(optarg); // cyclic_shift = atoi(optarg);
// break; // break;
case 'i': case 'i':
input_fdUL = fopen(optarg,"r"); input_fdUL = fopen(optarg,"r");
printf("Reading in %s (%p)\n",optarg,input_fdUL); printf("Reading in %s (%p)\n",optarg,input_fdUL);
AssertFatal(input_fdUL != (FILE *)NULL,"Unknown file %s\n",optarg); AssertFatal(input_fdUL != (FILE *)NULL,"Unknown file %s\n",optarg);
break; break;
case 'A': case 'A':
beta_ACK = atoi(optarg); beta_ACK = atoi(optarg);
AssertFatal(beta_ACK>15,"beta_ack must be in (0..15)\n"); AssertFatal(beta_ACK>15,"beta_ack must be in (0..15)\n");
break; break;
case 'C': case 'C':
beta_CQI = atoi(optarg); beta_CQI = atoi(optarg);
AssertFatal((beta_CQI>15)||(beta_CQI<2),"beta_cqi must be in (2..15)\n"); AssertFatal((beta_CQI>15)||(beta_CQI<2),"beta_cqi must be in (2..15)\n");
break; break;
case 'R': case 'R':
beta_RI = atoi(optarg); beta_RI = atoi(optarg);
AssertFatal((beta_RI>15)||(beta_RI<2),"beta_ri must be in (0..13)\n"); AssertFatal((beta_RI>15)||(beta_RI<2),"beta_ri must be in (0..13)\n");
break; break;
case 'P': case 'P':
dump_perf=1; dump_perf=1;
opp_enabled=1; opp_enabled=1;
break; break;
case 'L': case 'L':
set_parallel_conf(optarg); set_parallel_conf(optarg);
break; break;
default: default:
printf("Wrong option: %s\n",long_options[option_index].name); printf("Wrong option: %s\n",long_options[option_index].name);
exit(1); exit(1);
break; break;
} }
} }
@@ -594,14 +578,15 @@ int main(int argc, char **argv) {
exit(1); exit(1);
} }
if (help || verbose ) if (help || verbose )
display_options_values(options, true); display_options_values(options, true);
if (help) if (help)
exit(0); exit(0);
if (thread_struct.parallel_conf != PARALLEL_SINGLE_THREAD) if (thread_struct.parallel_conf != PARALLEL_SINGLE_THREAD)
set_worker_conf("WORKER_ENABLE"); set_worker_conf("WORKER_ENABLE");
RC.nb_L1_inst = 1; RC.nb_L1_inst = 1;
RC.nb_RU = 1; RC.nb_RU = 1;
lte_param_init(&eNB,&UE,&ru, lte_param_init(&eNB,&UE,&ru,
@@ -619,7 +604,7 @@ int main(int argc, char **argv) {
threequarter_fs, threequarter_fs,
osf, osf,
0); 0);
RC.eNB = (PHY_VARS_eNB ***)malloc(sizeof(PHY_VARS_eNB **)); RC.eNB = (PHY_VARS_eNB ** *)malloc(sizeof(PHY_VARS_eNB **));
RC.eNB[0] = (PHY_VARS_eNB **)malloc(sizeof(PHY_VARS_eNB *)); RC.eNB[0] = (PHY_VARS_eNB **)malloc(sizeof(PHY_VARS_eNB *));
RC.ru = (RU_t **)malloc(sizeof(RC.ru)); RC.ru = (RU_t **)malloc(sizeof(RC.ru));
RC.eNB[0][0] = eNB; RC.eNB[0][0] = eNB;
@@ -637,7 +622,7 @@ int main(int argc, char **argv) {
eNB->UL_INFO.cqi_ind.cqi_raw_pdu_list = eNB->cqi_raw_pdu_list; eNB->UL_INFO.cqi_ind.cqi_raw_pdu_list = eNB->cqi_raw_pdu_list;
printf("lte_param_init done\n"); printf("lte_param_init done\n");
// for a call to phy_reset_ue later we need PHY_vars_UE_g allocated and pointing to UE // for a call to phy_reset_ue later we need PHY_vars_UE_g allocated and pointing to UE
PHY_vars_UE_g = (PHY_VARS_UE ***)malloc(sizeof(PHY_VARS_UE **)); PHY_vars_UE_g = (PHY_VARS_UE ** *)malloc(sizeof(PHY_VARS_UE **));
PHY_vars_UE_g[0] = (PHY_VARS_UE **) malloc(sizeof(PHY_VARS_UE *)); PHY_vars_UE_g[0] = (PHY_VARS_UE **) malloc(sizeof(PHY_VARS_UE *));
PHY_vars_UE_g[0][0] = UE; PHY_vars_UE_g[0][0] = UE;
@@ -822,7 +807,7 @@ int main(int argc, char **argv) {
if (cqi_flag == 1) coded_bits_per_codeword-=UE->ulsch[0]->O; if (cqi_flag == 1) coded_bits_per_codeword-=UE->ulsch[0]->O;
rate = (double)dlsch_tbs25[get_I_TBS(mcs)][nb_rb-1]/(coded_bits_per_codeword); rate = (double)dlsch_tbs25[get_I_TBS(mcs)][nb_rb-1]/(coded_bits_per_codeword);
printf("Rate = %f (mod %d), coded bits %d\n",rate,get_Qm_ul(mcs),coded_bits_per_codeword); printf("Rate = %f (mod %d), coded bits %u\n",rate,get_Qm_ul(mcs),coded_bits_per_codeword);
for (ch_realization=0; ch_realization<n_ch_rlz; ch_realization++) { for (ch_realization=0; ch_realization<n_ch_rlz; ch_realization++) {
/* /*
@@ -884,7 +869,7 @@ int main(int argc, char **argv) {
i=0; i=0;
while (!feof(input_fdUL)) { while (!feof(input_fdUL)) {
ret=fscanf(input_fdUL,"%s %s",input_val_str,input_val_str2);//&input_val1,&input_val2); ret=fscanf(input_fdUL,"%49s %49s",input_val_str,input_val_str2);//&input_val1,&input_val2);
if (ret != 2) printf("ERROR: error reading file\n"); if (ret != 2) printf("ERROR: error reading file\n");
@@ -971,7 +956,7 @@ int main(int argc, char **argv) {
eNB->ulsch[0]->harq_processes[harq_pid]->round=round; eNB->ulsch[0]->harq_processes[harq_pid]->round=round;
UE->ulsch[0]->harq_processes[harq_pid]->round=round; UE->ulsch[0]->harq_processes[harq_pid]->round=round;
if (n_frames==1) printf("filling ulsch: Trial %d : Round %d (subframe %d, frame %d)\n",trials,round,proc_rxtx_ue->subframe_tx,proc_rxtx_ue->frame_tx); if (n_frames==1) printf("filling ulsch: Trial %u : Round %d (subframe %d, frame %d)\n",trials,round,proc_rxtx_ue->subframe_tx,proc_rxtx_ue->frame_tx);
round_trials[round]++; round_trials[round]++;
UL_req.sfn_sf = (1<<4)+subframe; UL_req.sfn_sf = (1<<4)+subframe;
@@ -1062,10 +1047,10 @@ int main(int argc, char **argv) {
sigma2_dB = N0;//-10*log10(UE->frame_parms.ofdm_symbol_size/(UE->frame_parms.N_RB_DL*12));//10*log10((double)tx_lev) +10*log10(UE->frame_parms.ofdm_symbol_size/(UE->frame_parms.N_RB_DL*12)) - SNR; sigma2_dB = N0;//-10*log10(UE->frame_parms.ofdm_symbol_size/(UE->frame_parms.N_RB_DL*12));//10*log10((double)tx_lev) +10*log10(UE->frame_parms.ofdm_symbol_size/(UE->frame_parms.N_RB_DL*12)) - SNR;
sigma2 = pow(10,sigma2_dB/10); sigma2 = pow(10,sigma2_dB/10);
// compute tx_gain to achieve target SNR (per resource element!) // compute tx_gain to achieve target SNR (per resource element!)
tx_gain = sqrt(pow(10.0,.1*(N0+SNR))/(double)tx_lev);//*(nb_rb*12/(double)UE->frame_parms.ofdm_symbol_size)/(double)tx_lev); tx_gain = sqrt(pow(10.0,.1*(N0+SNR))/(double)tx_lev);// *(nb_rb*12/(double)UE->frame_parms.ofdm_symbol_size)/(double)tx_lev);
if (n_frames==1) if (n_frames==1)
printf("tx_lev = %d (%d.%d dB,%f), gain %f\n",tx_lev,tx_lev_dB/10,tx_lev_dB,10*log10((double)tx_lev),10*log10(tx_gain)); printf("tx_lev = %u (%u.%u dB,%f), gain %f\n",tx_lev,tx_lev_dB/10,tx_lev_dB,10*log10((double)tx_lev),10*log10(tx_gain));
// fill measurement symbol (19) with noise // fill measurement symbol (19) with noise
for (i=0; i<OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES; i++) { for (i=0; i<OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES; i++) {
@@ -1100,7 +1085,7 @@ int main(int argc, char **argv) {
// calculate freq domain representation to compute SINR // calculate freq domain representation to compute SINR
freq_channel(UE2eNB, N_RB_DL,12*N_RB_DL + 1); freq_channel(UE2eNB, N_RB_DL,12*N_RB_DL + 1);
// snr=pow(10.0,.1*SNR); // snr=pow(10.0,.1*SNR);
fprintf(csv_fdUL,"%f,%d,%d,%f,%f,%f,",SNR,tx_lev,tx_lev_dB,sigma2_dB,tx_gain,SNR2); fprintf(csv_fdUL,"%f,%u,%u,%f,%f,%f,",SNR,tx_lev,tx_lev_dB,sigma2_dB,tx_gain,SNR2);
//fprintf(csv_fdUL,"%f,",SNR); //fprintf(csv_fdUL,"%f,",SNR);
for (u=0; u<12*nb_rb; u++) { for (u=0; u<12*nb_rb; u++) {
@@ -1156,12 +1141,12 @@ int main(int argc, char **argv) {
if (eNB->frame_parms.nb_antennas_rx>1) LOG_M("rxsig1UL.m","rxs1", &ru->common.rxdata[1][eNB->frame_parms.samples_per_tti*subframe],eNB->frame_parms.samples_per_tti,1,1); if (eNB->frame_parms.nb_antennas_rx>1) LOG_M("rxsig1UL.m","rxs1", &ru->common.rxdata[1][eNB->frame_parms.samples_per_tti*subframe],eNB->frame_parms.samples_per_tti,1,1);
} }
start_meas(&eNB->phy_proc_rx); start_meas(&eNB->phy_proc_rx);
ru->feprx = (get_thread_worker_conf() == WORKER_ENABLE) ? ru_fep_full_2thread : fep_full; ru->feprx = (get_thread_worker_conf() == WORKER_ENABLE) ? ru_fep_full_2thread : fep_full;
ru->feprx(ru); ru->feprx(ru);
phy_procedures_eNB_uespec_RX(eNB,proc_rxtx); phy_procedures_eNB_uespec_RX(eNB,proc_rxtx);
stop_meas(&eNB->phy_proc_rx); stop_meas(&eNB->phy_proc_rx);
if (cqi_flag > 0) { if (cqi_flag > 0) {
cqi_error = 0; cqi_error = 0;
@@ -1227,10 +1212,11 @@ int main(int argc, char **argv) {
dump_ulsch(eNB,eNB->proc.frame_rx,subframe,0,round); dump_ulsch(eNB,eNB->proc.frame_rx,subframe,0,round);
if (round == 4) exit(-1); round=5;
} }
if (n_frames==1) printf("round %d errors %d/%d\n",round,errs[round],trials); if (n_frames==1) printf("round %d errors %u/%u\n",round,errs[round],trials);
round++; round++;
@@ -1288,7 +1274,7 @@ int main(int argc, char **argv) {
LOG_UDUMPMSG(SIM,dataArray(table_rx),table_rx->size,LOG_DUMP_DOUBLE,"The receiver raw data: \n"); LOG_UDUMPMSG(SIM,dataArray(table_rx),table_rx->size,LOG_DUMP_DOUBLE,"The receiver raw data: \n");
} }
printf("\n**********rb: %d ***mcs : %d *********SNR = %f dB (%f): TX %d dB (gain %f dB), N0W %f dB, I0 %d dB, delta_IF %d [ (%d,%d) dB / (%d,%d) dB ]**************************\n", printf("\n**********rb: %d ***mcs : %d *********SNR = %f dB (%f): TX %u dB (gain %f dB), N0W %f dB, I0 %d dB, delta_IF %d [ (%d,%d) dB / (%d,%d) dB ]**************************\n",
nb_rb,mcs,SNR,SNR2, nb_rb,mcs,SNR,SNR2,
tx_lev_dB, tx_lev_dB,
20*log10(tx_gain), 20*log10(tx_gain),
@@ -1300,7 +1286,7 @@ int main(int argc, char **argv) {
eNB->measurements.n0_power_dB[0], eNB->measurements.n0_power_dB[0],
eNB->measurements.n0_power_dB[1]); eNB->measurements.n0_power_dB[1]);
effective_rate = ((double)(round_trials[0])/((double)round_trials[0] + round_trials[1] + round_trials[2] + round_trials[3])); effective_rate = ((double)(round_trials[0])/((double)round_trials[0] + round_trials[1] + round_trials[2] + round_trials[3]));
printf("Errors (%d/%d %d/%d %d/%d %d/%d), Pe = (%e,%e,%e,%e) => effective rate %f (%3.1f%%,%f,%f), normalized delay %f (%f)\n", printf("Errors (%u/%u %u/%u %u/%u %u/%u), Pe = (%e,%e,%e,%e) => effective rate %f (%3.1f%%,%f,%f), normalized delay %f (%f)\n",
errs[0], errs[0],
round_trials[0], round_trials[0],
errs[1], errs[1],
@@ -1322,16 +1308,16 @@ int main(int argc, char **argv) {
(1.0*(round_trials[0]-errs[0])+2.0*(round_trials[1]-errs[1])+3.0*(round_trials[2]-errs[2])+4.0*(round_trials[3]-errs[3]))/((double)round_trials[0])); (1.0*(round_trials[0]-errs[0])+2.0*(round_trials[1]-errs[1])+3.0*(round_trials[2]-errs[2])+4.0*(round_trials[3]-errs[3]))/((double)round_trials[0]));
if (cqi_flag >0) { if (cqi_flag >0) {
printf("CQI errors %d/%d,false positives %d/%d, CQI false negatives %d/%d\n", printf("CQI errors %d/%u,false positives %d/%u, CQI false negatives %d/%u\n",
cqi_errors,round_trials[0]+round_trials[1]+round_trials[2]+round_trials[3], cqi_errors,round_trials[0]+round_trials[1]+round_trials[2]+round_trials[3],
cqi_crc_falsepositives,round_trials[0]+round_trials[1]+round_trials[2]+round_trials[3], cqi_crc_falsepositives,round_trials[0]+round_trials[1]+round_trials[2]+round_trials[3],
cqi_crc_falsenegatives,round_trials[0]+round_trials[1]+round_trials[2]+round_trials[3]); cqi_crc_falsenegatives,round_trials[0]+round_trials[1]+round_trials[2]+round_trials[3]);
} }
if (eNB->ulsch[0]->harq_processes[harq_pid]->o_ACK[0] > 0) if (eNB->ulsch[0]->harq_processes[harq_pid]->o_ACK[0] > 0)
printf("ACK/NAK errors %d/%d\n",ack_errors,round_trials[0]+round_trials[1]+round_trials[2]+round_trials[3]); printf("ACK/NAK errors %d/%u\n",ack_errors,round_trials[0]+round_trials[1]+round_trials[2]+round_trials[3]);
fprintf(bler_fd,"%f;%d;%d;%d;%f;%d;%d;%d;%d;%d;%d;%d;%d\n", fprintf(bler_fd,"%f;%d;%d;%d;%f;%u;%u;%u;%u;%u;%u;%u;%u\n",
SNR, SNR,
mcs, mcs,
nb_rb, nb_rb,
@@ -1358,15 +1344,15 @@ int main(int argc, char **argv) {
printStatIndent(&UE->ulsch_rate_matching_stats,"ULSCH rate-matching time"); printStatIndent(&UE->ulsch_rate_matching_stats,"ULSCH rate-matching time");
printStatIndent(&UE->ulsch_interleaving_stats,"ULSCH sub-block interleaving"); printStatIndent(&UE->ulsch_interleaving_stats,"ULSCH sub-block interleaving");
printStatIndent(&UE->ulsch_multiplexing_stats,"ULSCH multiplexing time"); printStatIndent(&UE->ulsch_multiplexing_stats,"ULSCH multiplexing time");
printf("\n"); printf("\n");
printDistribution(&eNB->phy_proc_rx,table_rx,"Total PHY proc rx subframe"); printDistribution(&eNB->phy_proc_rx,table_rx,"Total PHY proc rx subframe");
printDistribution(&ru->ofdm_demod_stats,table_rx_fft,"|__ OFDM_demod time"); printDistribution(&ru->ofdm_demod_stats,table_rx_fft,"|__ OFDM_demod time");
printDistribution(&eNB->ulsch_demodulation_stats,table_rx_demod,"|__ ULSCH demodulation time"); printDistribution(&eNB->ulsch_demodulation_stats,table_rx_demod,"|__ ULSCH demodulation time");
printDistribution(&eNB->ulsch_decoding_stats,table_rx_dec,"|__ ULSCH Decoding time"); printDistribution(&eNB->ulsch_decoding_stats,table_rx_dec,"|__ ULSCH Decoding time");
printf(" (%.2f Mbit/s, avg iter %.2f, max %.2f)\n", printf(" (%.2f Mbit/s, avg iter %.2f, max %.2f)\n",
UE->ulsch[0]->harq_processes[harq_pid]->TBS/1000.0, UE->ulsch[0]->harq_processes[harq_pid]->TBS/1000.0,
(double)iter_trials, (double)iter_trials,
(double)eNB->ulsch_decoding_stats.max*timeBase); (double)eNB->ulsch_decoding_stats.max*timeBase);
printStatIndent2(&eNB->ulsch_deinterleaving_stats,"sub-block interleaving" ); printStatIndent2(&eNB->ulsch_deinterleaving_stats,"sub-block interleaving" );
printStatIndent2(&eNB->ulsch_demultiplexing_stats,"sub-block demultiplexing" ); printStatIndent2(&eNB->ulsch_demultiplexing_stats,"sub-block demultiplexing" );
printStatIndent2(&eNB->ulsch_rate_unmatching_stats,"sub-block rate-matching" ); printStatIndent2(&eNB->ulsch_rate_unmatching_stats,"sub-block rate-matching" );
@@ -1404,7 +1390,7 @@ int main(int argc, char **argv) {
if ( (test_perf != 0) && (100 * effective_rate > test_perf )) { if ( (test_perf != 0) && (100 * effective_rate > test_perf )) {
//fprintf(time_meas_fd,"SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3\n"); //fprintf(time_meas_fd,"SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3\n");
fprintf(time_meas_fd,"%f;%d;%d;%f;%d;%d;%d;%d;%d;%d;%d;%d;", fprintf(time_meas_fd,"%f;%d;%d;%f;%u;%u;%u;%u;%u;%u;%u;%u;",
SNR, SNR,
mcs, mcs,
eNB->ulsch[0]->harq_processes[harq_pid]->TBS, eNB->ulsch[0]->harq_processes[harq_pid]->TBS,
@@ -1418,7 +1404,7 @@ int main(int argc, char **argv) {
errs[3], errs[3],
round_trials[3]); round_trials[3]);
//fprintf(time_meas_fd,"SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3;ND;\n"); //fprintf(time_meas_fd,"SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3;ND;\n");
fprintf(time_meas_fd,"%f;%d;%d;%f;%2.1f;%f;%d;%d;%d;%d;%d;%d;%d;%d;%e;%e;%e;%e;%f;%f;", fprintf(time_meas_fd,"%f;%d;%d;%f;%2.1f;%f;%u;%u;%u;%u;%u;%u;%u;%u;%e;%e;%e;%e;%f;%f;",
SNR, SNR,
mcs, mcs,
eNB->ulsch[0]->harq_processes[harq_pid]->TBS, eNB->ulsch[0]->harq_processes[harq_pid]->TBS,
@@ -1463,34 +1449,34 @@ int main(int argc, char **argv) {
); );
//fprintf(time_meas_fd,"UE_PROC_TX_STD;UE_PROC_TX_MAX;UE_PROC_TX_MIN;UE_PROC_TX_MED;UE_PROC_TX_Q1;UE_PROC_TX_Q3;UE_PROC_TX_DROPPED;\n"); //fprintf(time_meas_fd,"UE_PROC_TX_STD;UE_PROC_TX_MAX;UE_PROC_TX_MIN;UE_PROC_TX_MED;UE_PROC_TX_Q1;UE_PROC_TX_Q3;UE_PROC_TX_DROPPED;\n");
fprintf(time_meas_fd,"%f;%f;%f;%f;%f;%f;%d;", fprintf(time_meas_fd,"%f;%f;%f;%f;%f;%f;%d;",
squareRoot(&UE->phy_proc_tx), t_tx_max, t_tx_min, median(table_tx), q1(table_tx), q3(table_tx), n_tx_dropped); squareRoot(&UE->phy_proc_tx), t_tx_max, t_tx_min, median(table_tx), q1(table_tx), q3(table_tx), n_tx_dropped);
//fprintf(time_meas_fd,"IFFT;\n"); //fprintf(time_meas_fd,"IFFT;\n");
fprintf(time_meas_fd,"%f;%f;%f;%f;", fprintf(time_meas_fd,"%f;%f;%f;%f;",
squareRoot(&UE->ofdm_mod_stats), squareRoot(&UE->ofdm_mod_stats),
median(table_tx_ifft),q1(table_tx_ifft),q3(table_tx_ifft)); median(table_tx_ifft),q1(table_tx_ifft),q3(table_tx_ifft));
//fprintf(time_meas_fd,"MOD;\n"); //fprintf(time_meas_fd,"MOD;\n");
fprintf(time_meas_fd,"%f;%f;%f;%f;", fprintf(time_meas_fd,"%f;%f;%f;%f;",
squareRoot(&UE->ulsch_modulation_stats), squareRoot(&UE->ulsch_modulation_stats),
median(table_tx_mod), q1(table_tx_mod), q3(table_tx_mod)); median(table_tx_mod), q1(table_tx_mod), q3(table_tx_mod));
//fprintf(time_meas_fd,"ENC;\n"); //fprintf(time_meas_fd,"ENC;\n");
fprintf(time_meas_fd,"%f;%f;%f;%f;", fprintf(time_meas_fd,"%f;%f;%f;%f;",
squareRoot(&UE->ulsch_encoding_stats), squareRoot(&UE->ulsch_encoding_stats),
median(table_tx_enc),q1(table_tx_enc),q3(table_tx_enc)); median(table_tx_enc),q1(table_tx_enc),q3(table_tx_enc));
//fprintf(time_meas_fd,"eNB_PROC_RX_STD;eNB_PROC_RX_MAX;eNB_PROC_RX_MIN;eNB_PROC_RX_MED;eNB_PROC_RX_Q1;eNB_PROC_RX_Q3;eNB_PROC_RX_DROPPED;\n"); //fprintf(time_meas_fd,"eNB_PROC_RX_STD;eNB_PROC_RX_MAX;eNB_PROC_RX_MIN;eNB_PROC_RX_MED;eNB_PROC_RX_Q1;eNB_PROC_RX_Q3;eNB_PROC_RX_DROPPED;\n");
fprintf(time_meas_fd,"%f;%f;%f;%f;%f;%f;%d;", fprintf(time_meas_fd,"%f;%f;%f;%f;%f;%f;%d;",
squareRoot(&eNB->phy_proc_rx), t_rx_max, t_rx_min, squareRoot(&eNB->phy_proc_rx), t_rx_max, t_rx_min,
median(table_rx), q1(table_rx), q3(table_rx), n_rx_dropped); median(table_rx), q1(table_rx), q3(table_rx), n_rx_dropped);
//fprintf(time_meas_fd,"FFT;\n"); //fprintf(time_meas_fd,"FFT;\n");
fprintf(time_meas_fd,"%f;%f;%f;%f;", fprintf(time_meas_fd,"%f;%f;%f;%f;",
squareRoot(&ru->ofdm_demod_stats), squareRoot(&ru->ofdm_demod_stats),
median(table_rx_fft), q1(table_rx_fft), q3(table_rx_fft)); median(table_rx_fft), q1(table_rx_fft), q3(table_rx_fft));
//fprintf(time_meas_fd,"DEMOD;\n"); //fprintf(time_meas_fd,"DEMOD;\n");
fprintf(time_meas_fd,"%f;%f;%f;%f;", fprintf(time_meas_fd,"%f;%f;%f;%f;",
squareRoot(&eNB->ulsch_demodulation_stats), squareRoot(&eNB->ulsch_demodulation_stats),
median(table_rx_demod), q1(table_rx_demod), q3(table_rx_demod)); median(table_rx_demod), q1(table_rx_demod), q3(table_rx_demod));
//fprintf(time_meas_fd,"DEC;\n"); //fprintf(time_meas_fd,"DEC;\n");
fprintf(time_meas_fd,"%f;%f;%f;%f\n", fprintf(time_meas_fd,"%f;%f;%f;%f\n",
squareRoot(&eNB->ulsch_decoding_stats), squareRoot(&eNB->ulsch_decoding_stats),
median(table_rx_dec), q1(table_rx_dec), q3(table_rx_dec)); median(table_rx_dec), q1(table_rx_dec), q3(table_rx_dec));
printf("[passed] effective rate : %f (%2.1f%%,%f)): log and break \n",rate*effective_rate, 100*effective_rate, rate ); printf("[passed] effective rate : %f (%2.1f%%,%f)): log and break \n",rate*effective_rate, 100*effective_rate, rate );
break; break;
+13 -39
View File
@@ -32,17 +32,14 @@
// NEW code with lookup table for sin/cos based on delay profile (TO BE TESTED) // NEW code with lookup table for sin/cos based on delay profile (TO BE TESTED)
double **cos_lut=NULL,**sin_lut=NULL; double **cos_lut=NULL,* *sin_lut=NULL;
//#if 1 //#if 1
int init_freq_channel(channel_desc_t *desc,uint16_t nb_rb,int16_t n_samples) int init_freq_channel(channel_desc_t *desc,uint16_t nb_rb,int16_t n_samples) {
{
double delta_f,freq; // 90 kHz spacing double delta_f,freq; // 90 kHz spacing
double delay; double delay;
int16_t f; int16_t f;
@@ -50,21 +47,18 @@ int init_freq_channel(channel_desc_t *desc,uint16_t nb_rb,int16_t n_samples)
if ((n_samples&1)==0) { if ((n_samples&1)==0) {
fprintf(stderr, "freq_channel_init: n_samples has to be odd\n"); fprintf(stderr, "freq_channel_init: n_samples has to be odd\n");
return(-1); return(-1);
} }
cos_lut = (double **)malloc(n_samples*sizeof(double*)); cos_lut = (double **)malloc(n_samples*sizeof(double *));
sin_lut = (double **)malloc(n_samples*sizeof(double*)); sin_lut = (double **)malloc(n_samples*sizeof(double *));
delta_f = nb_rb*180000/(n_samples-1); delta_f = nb_rb*180000/(n_samples-1);
for (f=-(n_samples>>1); f<=(n_samples>>1); f++) { for (f=-(n_samples>>1); f<=(n_samples>>1); f++) {
freq=delta_f*(double)f*1e-6;// due to the fact that delays is in mus freq=delta_f*(double)f*1e-6;// due to the fact that delays is in mus
cos_lut[f+(n_samples>>1)] = (double *)malloc((int)desc->nb_taps*sizeof(double)); cos_lut[f+(n_samples>>1)] = (double *)malloc((int)desc->nb_taps*sizeof(double));
sin_lut[f+(n_samples>>1)] = (double *)malloc((int)desc->nb_taps*sizeof(double)); sin_lut[f+(n_samples>>1)] = (double *)malloc((int)desc->nb_taps*sizeof(double));
for (l=0; l<(int)desc->nb_taps; l++) { for (l=0; l<(int)desc->nb_taps; l++) {
if (desc->nb_taps==1) if (desc->nb_taps==1)
delay = desc->delays[l]; delay = desc->delays[l];
@@ -74,17 +68,13 @@ int init_freq_channel(channel_desc_t *desc,uint16_t nb_rb,int16_t n_samples)
cos_lut[f+(n_samples>>1)][l] = cos(2*M_PI*freq*delay); cos_lut[f+(n_samples>>1)][l] = cos(2*M_PI*freq*delay);
sin_lut[f+(n_samples>>1)][l] = sin(2*M_PI*freq*delay); sin_lut[f+(n_samples>>1)][l] = sin(2*M_PI*freq*delay);
//printf("values cos:%d, sin:%d\n", cos_lut[f][l], sin_lut[f][l]); //printf("values cos:%d, sin:%d\n", cos_lut[f][l], sin_lut[f][l]);
} }
} }
return(0); return(0);
} }
int freq_channel(channel_desc_t *desc,uint16_t nb_rb,int16_t n_samples) int freq_channel(channel_desc_t *desc,uint16_t nb_rb,int16_t n_samples) {
{
int16_t f,f2,d; int16_t f,f2,d;
uint8_t aarx,aatx,l; uint8_t aarx,aatx,l;
double *clut,*slut; double *clut,*slut;
@@ -95,7 +85,7 @@ int freq_channel(channel_desc_t *desc,uint16_t nb_rb,int16_t n_samples)
// n_samples has to be a odd number because we assume the spectrum is symmetric around the DC and includes the DC // n_samples has to be a odd number because we assume the spectrum is symmetric around the DC and includes the DC
if ((n_samples&1)==0) { if ((n_samples&1)==0) {
fprintf(stderr, "freq_channel: n_samples has to be odd\n"); fprintf(stderr, "freq_channel: n_samples has to be odd\n");
return(-1); return(-1);
} }
// printf("no of taps:%d,",(int)desc->nb_taps); // printf("no of taps:%d,",(int)desc->nb_taps);
@@ -104,6 +94,7 @@ int freq_channel(channel_desc_t *desc,uint16_t nb_rb,int16_t n_samples)
// we are initializing the lut for the largets possible n_samples=12*nb_rb+1 // we are initializing the lut for the largets possible n_samples=12*nb_rb+1
// if called with n_samples<12*nb_rb+1, we decimate the lut // if called with n_samples<12*nb_rb+1, we decimate the lut
n_samples_max=12*nb_rb+1; n_samples_max=12*nb_rb+1;
if (init_freq_channel(desc,nb_rb,n_samples_max)==0) if (init_freq_channel(desc,nb_rb,n_samples_max)==0)
freq_channel_init=1; freq_channel_init=1;
else else
@@ -111,9 +102,7 @@ int freq_channel(channel_desc_t *desc,uint16_t nb_rb,int16_t n_samples)
} }
d=(n_samples_max-1)/(n_samples-1); d=(n_samples_max-1)/(n_samples-1);
//printf("no_samples=%d, n_samples_max=%d, d=%d\n",n_samples,n_samples_max,d); //printf("no_samples=%d, n_samples_max=%d, d=%d\n",n_samples,n_samples_max,d);
start_meas(&desc->interp_freq); start_meas(&desc->interp_freq);
for (f=-n_samples_max/2,f2=-n_samples/2; f<n_samples_max/2; f+=d,f2++) { for (f=-n_samples_max/2,f2=-n_samples/2; f<n_samples_max/2; f+=d,f2++) {
@@ -126,7 +115,6 @@ int freq_channel(channel_desc_t *desc,uint16_t nb_rb,int16_t n_samples)
desc->chF[aarx+(aatx*desc->nb_rx)][n_samples/2+f2].y=0.0; desc->chF[aarx+(aatx*desc->nb_rx)][n_samples/2+f2].y=0.0;
for (l=0; l<(int)desc->nb_taps; l++) { for (l=0; l<(int)desc->nb_taps; l++) {
desc->chF[aarx+(aatx*desc->nb_rx)][n_samples/2+f2].x+=(desc->a[l][aarx+(aatx*desc->nb_rx)].x*clut[l]+ desc->chF[aarx+(aatx*desc->nb_rx)][n_samples/2+f2].x+=(desc->a[l][aarx+(aatx*desc->nb_rx)].x*clut[l]+
desc->a[l][aarx+(aatx*desc->nb_rx)].y*slut[l]); desc->a[l][aarx+(aatx*desc->nb_rx)].y*slut[l]);
desc->chF[aarx+(aatx*desc->nb_rx)][n_samples/2+f2].y+=(-desc->a[l][aarx+(aatx*desc->nb_rx)].x*slut[l]+ desc->chF[aarx+(aatx*desc->nb_rx)][n_samples/2+f2].y+=(-desc->a[l][aarx+(aatx*desc->nb_rx)].x*slut[l]+
@@ -137,7 +125,6 @@ int freq_channel(channel_desc_t *desc,uint16_t nb_rb,int16_t n_samples)
} }
stop_meas(&desc->interp_freq); stop_meas(&desc->interp_freq);
return(0); return(0);
} }
@@ -146,16 +133,13 @@ double compute_pbch_sinr(channel_desc_t *desc,
channel_desc_t *desc_i2, channel_desc_t *desc_i2,
double snr_dB,double snr_i1_dB, double snr_dB,double snr_i1_dB,
double snr_i2_dB, double snr_i2_dB,
uint16_t nb_rb) uint16_t nb_rb) {
{
double avg_sinr,snr=pow(10.0,.1*snr_dB),snr_i1=pow(10.0,.1*snr_i1_dB),snr_i2=pow(10.0,.1*snr_i2_dB); double avg_sinr,snr=pow(10.0,.1*snr_dB),snr_i1=pow(10.0,.1*snr_i1_dB),snr_i2=pow(10.0,.1*snr_i2_dB);
uint16_t f; uint16_t f;
uint8_t aarx,aatx; uint8_t aarx,aatx;
double S; double S;
struct complex S_i1; struct complex S_i1;
struct complex S_i2; struct complex S_i2;
avg_sinr=0.0; avg_sinr=0.0;
// printf("nb_rb %d\n",nb_rb); // printf("nb_rb %d\n",nb_rb);
@@ -202,18 +186,14 @@ double compute_sinr(channel_desc_t *desc,
channel_desc_t *desc_i2, channel_desc_t *desc_i2,
double snr_dB,double snr_i1_dB, double snr_dB,double snr_i1_dB,
double snr_i2_dB, double snr_i2_dB,
uint16_t nb_rb) uint16_t nb_rb) {
{
double avg_sinr,snr=pow(10.0,.1*snr_dB),snr_i1=pow(10.0,.1*snr_i1_dB),snr_i2=pow(10.0,.1*snr_i2_dB); double avg_sinr,snr=pow(10.0,.1*snr_dB),snr_i1=pow(10.0,.1*snr_i1_dB),snr_i2=pow(10.0,.1*snr_i2_dB);
uint16_t f; uint16_t f;
uint8_t aarx,aatx; uint8_t aarx,aatx;
double S; double S;
struct complex S_i1; struct complex S_i1;
struct complex S_i2; struct complex S_i2;
DevAssert( nb_rb > 0 ); DevAssert( nb_rb > 0 );
avg_sinr=0.0; avg_sinr=0.0;
// printf("nb_rb %d\n",nb_rb); // printf("nb_rb %d\n",nb_rb);
@@ -256,12 +236,9 @@ double compute_sinr(channel_desc_t *desc,
int pbch_polynomial_degree=6; int pbch_polynomial_degree=6;
double pbch_awgn_polynomial[7]= {-7.2926e-05, -2.8749e-03, -4.5064e-02, -3.5301e-01, -1.4655e+00, -3.6282e+00, -6.6907e+00}; double pbch_awgn_polynomial[7]= {-7.2926e-05, -2.8749e-03, -4.5064e-02, -3.5301e-01, -1.4655e+00, -3.6282e+00, -6.6907e+00};
void load_pbch_desc(FILE *pbch_file_fd) void load_pbch_desc(FILE *pbch_file_fd) {
{
int i, ret; int i, ret;
char dummy[25]; char dummy[25];
ret = fscanf(pbch_file_fd,"%d",&pbch_polynomial_degree); ret = fscanf(pbch_file_fd,"%d",&pbch_polynomial_degree);
if (ret < 0) { if (ret < 0) {
@@ -277,7 +254,7 @@ void load_pbch_desc(FILE *pbch_file_fd)
printf("PBCH polynomial : "); printf("PBCH polynomial : ");
for (i=0; i<=pbch_polynomial_degree; i++) { for (i=0; i<=pbch_polynomial_degree; i++) {
ret = fscanf(pbch_file_fd,"%s",dummy); ret = fscanf(pbch_file_fd,"%24s",dummy);
if (ret < 0) { if (ret < 0) {
printf("fscanf failed: %s\n", strerror(errno)); printf("fscanf failed: %s\n", strerror(errno));
@@ -291,9 +268,7 @@ void load_pbch_desc(FILE *pbch_file_fd)
printf("\n"); printf("\n");
} }
double pbch_bler(double sinr) double pbch_bler(double sinr) {
{
int i; int i;
double log10_bler=pbch_awgn_polynomial[pbch_polynomial_degree]; double log10_bler=pbch_awgn_polynomial[pbch_polynomial_degree];
double sinrpow=sinr; double sinrpow=sinr;
@@ -317,6 +292,5 @@ double pbch_bler(double sinr)
//printf ("sinr %f bler %f\n",sinr,bler); //printf ("sinr %f bler %f\n",sinr,bler);
return(bler); return(bler);
} }
+5 -32
View File
@@ -31,17 +31,14 @@
enum sector {SEC1, SEC2, SEC3}; enum sector {SEC1, SEC2, SEC3};
scenario_desc_t scenario; scenario_desc_t scenario;
void get_chan_desc(node_desc_t* node_tx, node_desc_t* node_rx, channel_desc_t *ch_desc, scenario_desc_t* scenario) void get_chan_desc(node_desc_t *node_tx, node_desc_t *node_rx, channel_desc_t *ch_desc, scenario_desc_t *scenario) {
{
double dist; double dist;
dist = sqrt(pow((node_tx->x - node_rx->x), 2) + pow((node_tx->y - node_rx->y), 2)); dist = sqrt(pow((node_tx->x - node_rx->x), 2) + pow((node_tx->y - node_rx->y), 2));
/* conversion of distance into KM 3gpp (36-942)*/ /* conversion of distance into KM 3gpp (36-942)*/
ch_desc->path_loss_dB = (128.1 + 37.6 * log10(dist/1000)); ch_desc->path_loss_dB = (128.1 + 37.6 * log10(dist/1000));
} }
int main() int main() {
{
int enb_count = 16; int enb_count = 16;
int ue_count = 50; int ue_count = 50;
double sect_angle[3]= {0,2*PI/3,4*PI/3}; double sect_angle[3]= {0,2*PI/3,4*PI/3};
@@ -75,19 +72,16 @@ int main()
"bler_9.csv", "bler_10.csv", "bler_11.csv", "bler_12.csv", "bler_13.csv", "bler_14.csv", "bler_15.csv", "bler_16.csv", "bler_9.csv", "bler_10.csv", "bler_11.csv", "bler_12.csv", "bler_13.csv", "bler_14.csv", "bler_15.csv", "bler_16.csv",
"bler_17.csv", "bler_18.csv", "bler_19.csv", "bler_20.csv", "bler_21.csv", "bler_22.csv" "bler_17.csv", "bler_18.csv", "bler_19.csv", "bler_20.csv", "bler_21.csv", "bler_22.csv"
}; };
double beta[MCS_COUNT] = {0, 0, 0, 0, 0.9459960937499999, 1.2912109374999994, 1.0133789062499998, 1.000390625, double beta[MCS_COUNT] = {0, 0, 0, 0, 0.9459960937499999, 1.2912109374999994, 1.0133789062499998, 1.000390625,
1.02392578125, 1.8595703124999998, 2.424389648437498, 2.3946533203124982, 2.5790039062499988, 1.02392578125, 1.8595703124999998, 2.424389648437498, 2.3946533203124982, 2.5790039062499988,
2.4084960937499984, 2.782617187499999, 2.7868652343749996, 3.92099609375, 4.0392578125, 2.4084960937499984, 2.782617187499999, 2.7868652343749996, 3.92099609375, 4.0392578125,
4.56109619140625, 5.03338623046875, 5.810888671875, 6.449108886718749 4.56109619140625, 5.03338623046875, 5.810888671875, 6.449108886718749
}; };
double enb_position[][2] = {{1100,1100},{1100,2100},{1100,3100},{1100,4100}, double enb_position[][2] = {{1100,1100},{1100,2100},{1100,3100},{1100,4100},
{2100,1100},{2100,2100},{2100,3100},{2100,4100}, {2100,1100},{2100,2100},{2100,3100},{2100,4100},
{3100,1100},{3100,2100},{3100,3100},{3100,4100}, {3100,1100},{3100,2100},{3100,3100},{3100,4100},
{4100,1100},{4100,2100},{4100,3100},{4100,4100} {4100,1100},{4100,2100},{4100,3100},{4100,4100}
}; };
double ue_position[][2] = {{3340,4740},{1500,620},{1780,4220},{1300,3540},{780,3100}, double ue_position[][2] = {{3340,4740},{1500,620},{1780,4220},{1300,3540},{780,3100},
{1140,540},{1340,3660},{860,1220},{2700,2140},{3860,3060}, {1140,540},{1340,3660},{860,1220},{2700,2140},{3860,3060},
{3740,1060},{1700,3060},{2180,1620},{4420,1060},{1300,3340}, {3740,1060},{1700,3060},{2180,1620},{4420,1060},{1300,3340},
@@ -99,15 +93,12 @@ int main()
{3420,2820},{1580,3940},{660,2100},{2740,1180},{2500,2500}, {3420,2820},{1580,3940},{660,2100},{2740,1180},{2500,2500},
{3580,3580},{3740,3140},{3020,3020},{4340,4140},{980,4300} {3580,3580},{3740,3140},{3020,3020},{4340,4140},{980,4300}
}; };
randominit(0); randominit(0);
///////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////
int tabl_len=0; int tabl_len=0;
double local_table[MCS_COUNT][9][9]; double local_table[MCS_COUNT][9][9];
for (mcs = 5; mcs <= MCS_COUNT; mcs++) { for (mcs = 5; mcs <= MCS_COUNT; mcs++) {
fp = fopen(file_name[mcs - 1],"r"); fp = fopen(file_name[mcs - 1],"r");
if (fp == NULL) { if (fp == NULL) {
@@ -117,7 +108,6 @@ int main()
tabl_len=0; tabl_len=0;
while (!feof(fp)) { while (!feof(fp)) {
sinr_bler = strtok(buffer, ";"); sinr_bler = strtok(buffer, ";");
local_table[mcs-1][0][tabl_len] = atof(sinr_bler); local_table[mcs-1][0][tabl_len] = atof(sinr_bler);
sinr_bler = strtok(NULL,";"); sinr_bler = strtok(NULL,";");
@@ -133,12 +123,8 @@ int main()
for (tabl_len=0; tabl_len<9; tabl_len++) for (tabl_len=0; tabl_len<9; tabl_len++)
printf("%lf %lf \n ",local_table[mcs-1][0][tabl_len],local_table[mcs-1][1][tabl_len]); printf("%lf %lf \n ",local_table[mcs-1][0][tabl_len],local_table[mcs-1][1][tabl_len]);
} }
//////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////
for (enb_index = 0; enb_index < enb_count; enb_index++) for (enb_index = 0; enb_index < enb_count; enb_index++)
@@ -172,7 +158,6 @@ int main()
ul_channel[ue_index][enb_index] = new_channel_desc_scm(1, 1, SCM_C, 7.68, 0, 0, 0); ul_channel[ue_index][enb_index] = new_channel_desc_scm(1, 1, SCM_C, 7.68, 0, 0, 0);
dl_channel[ue_index][enb_index] = new_channel_desc_scm(1, 1, SCM_C, 7.68, 0, 0, 0); dl_channel[ue_index][enb_index] = new_channel_desc_scm(1, 1, SCM_C, 7.68, 0, 0, 0);
//printf("ue %d enb %d\n", ue_index, enb_index); //printf("ue %d enb %d\n", ue_index, enb_index);
/* Calculating the angle in the range -pi to pi from the slope */ /* Calculating the angle in the range -pi to pi from the slope */
//(ue_data[ue_index])->alpha_rad[enb_index] = (double)(atan2((ue_data[ue_index]->x - enb_data[enb_index]->x), (ue_data[ue_index]->y - enb_data[enb_index]->y))); //(ue_data[ue_index])->alpha_rad[enb_index] = (double)(atan2((ue_data[ue_index]->x - enb_data[enb_index]->x), (ue_data[ue_index]->y - enb_data[enb_index]->y)));
ue_data[ue_index]->alpha_rad[enb_index] = atan2((ue_data[ue_index]->x - enb_data[enb_index]->x), (ue_data[ue_index]->y - enb_data[enb_index]->y)); ue_data[ue_index]->alpha_rad[enb_index] = atan2((ue_data[ue_index]->x - enb_data[enb_index]->x), (ue_data[ue_index]->y - enb_data[enb_index]->y));
@@ -190,8 +175,7 @@ int main()
/* gain = -min(Am , 12 * (theta/theta_3dB)^2) */ /* gain = -min(Am , 12 * (theta/theta_3dB)^2) */
gain_max = (gain_sec[SEC1] > gain_sec[SEC2]) ? ((gain_sec[SEC1] > gain_sec[SEC3]) ? gain_sec[SEC1]:gain_sec[SEC3]) : gain_max = (gain_sec[SEC1] > gain_sec[SEC2]) ? ((gain_sec[SEC1] > gain_sec[SEC3]) ? gain_sec[SEC1]:gain_sec[SEC3]) :
((gain_sec[SEC2] > gain_sec[SEC3]) ? gain_sec[SEC2]:gain_sec[SEC3]); ((gain_sec[SEC2] > gain_sec[SEC3]) ? gain_sec[SEC2]:gain_sec[SEC3]);
get_chan_desc(enb_data[enb_index], ue_data[ue_index], ul_channel[ue_index][enb_index], &scenario); get_chan_desc(enb_data[enb_index], ue_data[ue_index], ul_channel[ue_index][enb_index], &scenario);
get_chan_desc(enb_data[enb_index], ue_data[ue_index], dl_channel[ue_index][enb_index], &scenario); get_chan_desc(enb_data[enb_index], ue_data[ue_index], dl_channel[ue_index][enb_index], &scenario);
@@ -204,7 +188,6 @@ int main()
//return_value = random_channel(ul_channel[ue_index][enb_index]); //return_value = random_channel(ul_channel[ue_index][enb_index]);
return_value = random_channel(dl_channel[ue_index][enb_index]); return_value = random_channel(dl_channel[ue_index][enb_index]);
/* Thermal noise is calculated using 10log10(K*T*B) K = Boltzmann´s constant T = room temperature B = bandwidth */ /* Thermal noise is calculated using 10log10(K*T*B) K = Boltzmann´s constant T = room temperature B = bandwidth */
/* Taken as constant for the time being since the BW is not changing */ /* Taken as constant for the time being since the BW is not changing */
thermal_noise = -105; //value in dBm thermal_noise = -105; //value in dBm
@@ -222,7 +205,6 @@ int main()
- (thermal_noise + ue_data[ue_index]->rx_noise_level) - (thermal_noise + ue_data[ue_index]->rx_noise_level)
+ 10 * log10 (pow(dl_channel[ue_index][enb_index]->chF[0][count].r, 2) + 10 * log10 (pow(dl_channel[ue_index][enb_index]->chF[0][count].r, 2)
+ pow(dl_channel[ue_index][enb_index]->chF[0][count].i, 2)); + pow(dl_channel[ue_index][enb_index]->chF[0][count].i, 2));
//printf("Dl_link SNR for res. block %d is %lf\n", count, sinr[enb_index][count]); //printf("Dl_link SNR for res. block %d is %lf\n", count, sinr[enb_index][count]);
} }
} }
@@ -252,7 +234,6 @@ int main()
//printf("mcs value %d \n",mcs); //printf("mcs value %d \n",mcs);
//printf("beta value %lf \n",-beta[mcs-1]); //printf("beta value %lf \n",-beta[mcs-1]);
//printf("snr_eff value %lf \n",log(sinr_eff[ue_index][mcs-1])); //printf("snr_eff value %lf \n",log(sinr_eff[ue_index][mcs-1]));
sinr_eff[ue_index][mcs-1] = -beta[mcs-1] *log((sinr_eff[ue_index][mcs-1])/(2*nb_rb));// sinr_eff[ue_index][mcs-1] = -beta[mcs-1] *log((sinr_eff[ue_index][mcs-1])/(2*nb_rb));//
//printf("snr_eff value %lf \n",sinr_eff[ue_index][mcs-1]); //printf("snr_eff value %lf \n",sinr_eff[ue_index][mcs-1]);
sinr_eff[ue_index][mcs-1] = 10 * log10(sinr_eff[ue_index][mcs-1]); sinr_eff[ue_index][mcs-1] = 10 * log10(sinr_eff[ue_index][mcs-1]);
@@ -264,9 +245,7 @@ int main()
} }
sinr_eff[ue_index][mcs-1] /= 10; sinr_eff[ue_index][mcs-1] /= 10;
//printf("Effective snr %lf \n",sinr_eff[ue_index][mcs-1]); //printf("Effective snr %lf \n",sinr_eff[ue_index][mcs-1]);
bler[ue_index][mcs-1] = 0; bler[ue_index][mcs-1] = 0;
/*line_num = 0; /*line_num = 0;
@@ -295,37 +274,31 @@ int main()
} }
fclose(fp);*/ fclose(fp);*/
for (tabl_len=0; tabl_len<9; tabl_len++) { for (tabl_len=0; tabl_len<9; tabl_len++) {
if(tabl_len==0) if(tabl_len==0)
if (sinr_eff[ue_index][mcs-1] < local_table[mcs-1][0][tabl_len]) { if (sinr_eff[ue_index][mcs-1] < local_table[mcs-1][0][tabl_len]) {
bler[ue_index][mcs-1] = 1; bler[ue_index][mcs-1] = 1;
break; break;
} }
if (sinr_eff[ue_index][mcs-1] == local_table[mcs-1][0][tabl_len]) { if (sinr_eff[ue_index][mcs-1] == local_table[mcs-1][0][tabl_len]) {
bler[ue_index][mcs-1] = local_table[mcs-1][1][tabl_len]; bler[ue_index][mcs-1] = local_table[mcs-1][1][tabl_len];
} }
} }
//printf("\n###Dl_link UE %d attached to eNB %d \n MCS %d effective SNR %lf BLER %lf", ue_index, att_enb_index, mcs,sinr_eff[ue_index][mcs-1],bler[ue_index][mcs-1]); //printf("\n###Dl_link UE %d attached to eNB %d \n MCS %d effective SNR %lf BLER %lf", ue_index, att_enb_index, mcs,sinr_eff[ue_index][mcs-1],bler[ue_index][mcs-1]);
} }
//printf("\n\n"); //printf("\n\n");
printf("\n Ue_ix enb_ix mcs5 mcs6 mcs7 mcs8 mcs9 mcs10 mcs11 mcs12 mcs13\ printf("\n Ue_ix enb_ix mcs5 mcs6 mcs7 mcs8 mcs9 mcs10 mcs11 mcs12 mcs13\
mcs14 mcs15 mcs16 mcs17 mcs18 mcs19 mcs20 mcs21 mcs22\n"); mcs14 mcs15 mcs16 mcs17 mcs18 mcs19 mcs20 mcs21 mcs22\n");
printf("SINR %4d %4d %+4.2f %+4.2f %+4.2f %+4.2f %+4.2f %+4.2f %+4.2f %+4.2f\ printf("SINR %4d %4d %+4.2f %+4.2f %+4.2f %+4.2f %+4.2f %+4.2f %+4.2f %+4.2f\
%+4.2f %+4.2f %+4.2f %+4.2f %+4.2f %+4.2f %+4.2f %+4.2f %+4.2f %+4.2f\n", %+4.2f %+4.2f %+4.2f %+4.2f %+4.2f %+4.2f %+4.2f %+4.2f %+4.2f %+4.2f %+4.2f\n",
ue_index, att_enb_index, sinr_eff[ue_index][4], sinr_eff[ue_index][5], sinr_eff[ue_index][6], sinr_eff[ue_index][7], ue_index, att_enb_index, sinr_eff[ue_index][4], sinr_eff[ue_index][5], sinr_eff[ue_index][6], sinr_eff[ue_index][7],
sinr_eff[ue_index][8], sinr_eff[ue_index][9], sinr_eff[ue_index][10], sinr_eff[ue_index][11], sinr_eff[ue_index][12], sinr_eff[ue_index][8], sinr_eff[ue_index][9], sinr_eff[ue_index][10], sinr_eff[ue_index][11], sinr_eff[ue_index][12],
sinr_eff[ue_index][13], sinr_eff[ue_index][14], sinr_eff[ue_index][15], sinr_eff[ue_index][16], sinr_eff[ue_index][17], sinr_eff[ue_index][13], sinr_eff[ue_index][14], sinr_eff[ue_index][15], sinr_eff[ue_index][16], sinr_eff[ue_index][17],
sinr_eff[ue_index][18], sinr_eff[ue_index][19], sinr_eff[ue_index][20], sinr_eff[ue_index][21], sinr_eff[ue_index][22]); sinr_eff[ue_index][18], sinr_eff[ue_index][19], sinr_eff[ue_index][20], sinr_eff[ue_index][21], sinr_eff[ue_index][22]);
printf("BLER %4d %4d %+4.2f %+4.2f %+4.2f %+4.2f %+4.2f %+4.2f %+4.2f %+4.2f\ printf("BLER %4d %4d %+4.2f %+4.2f %+4.2f %+4.2f %+4.2f %+4.2f %+4.2f %+4.2f\
%+4.2f %+4.2f %+4.2f %+4.2f %+4.2f %+4.2f %+4.2f %+4.2f %+4.2f %+4.2f\n", %+4.2f %+4.2f %+4.2f %+4.2f %+4.2f %+4.2f %+4.2f %+4.2f %+4.2f %+4.2f %+4.2f\n",
ue_index, att_enb_index, bler[ue_index][4], bler[ue_index][5], bler[ue_index][6], bler[ue_index][7], ue_index, att_enb_index, bler[ue_index][4], bler[ue_index][5], bler[ue_index][6], bler[ue_index][7],
bler[ue_index][8], bler[ue_index][9], bler[ue_index][10], bler[ue_index][11], bler[ue_index][12], bler[ue_index][8], bler[ue_index][9], bler[ue_index][10], bler[ue_index][11], bler[ue_index][12],
bler[ue_index][13], bler[ue_index][14], bler[ue_index][15], bler[ue_index][16], bler[ue_index][17], bler[ue_index][13], bler[ue_index][14], bler[ue_index][15], bler[ue_index][16], bler[ue_index][17],
+6 -30
View File
@@ -27,20 +27,15 @@
unsigned int *generate_gauss_LUT(unsigned char Nbits, unsigned int *generate_gauss_LUT(unsigned char Nbits,
unsigned char L unsigned char L
) ) {
{
unsigned int *LUT_ptr,i; unsigned int *LUT_ptr,i;
LUT_ptr = (unsigned int *)malloc((1<<(Nbits-1))*sizeof(int)); LUT_ptr = (unsigned int *)malloc((1<<(Nbits-1))*sizeof(int));
assert(LUT_ptr); assert(LUT_ptr);
for (i=0; i<(1<<(Nbits-1)); i++) { for (i=0; i<(1<<(Nbits-1)); i++) {
LUT_ptr[i] = (unsigned int)((double)((unsigned int)(1<<31))*erf(i*L/(double)(1<<(Nbits-1)))); LUT_ptr[i] = (unsigned int)((double)((unsigned int)(1<<31))*erf(i*L/(double)(1<<(Nbits-1))));
#ifdef LUTDEBUG #ifdef LUTDEBUG
printf("pos %d : LUT_ptr[%d]=%x (%f)\n",i,i,LUT_ptr[i],(double)(erf(i*L/(double)(1<<(Nbits-1))))); printf("pos %u : LUT_ptr[%u]=%x (%f)\n",i,i,LUT_ptr[i],(double)(erf(i*L/(double)(1<<(Nbits-1)))));
#endif //LUTDEBUG #endif //LUTDEBUG
} }
@@ -51,40 +46,29 @@ unsigned int *generate_gauss_LUT(unsigned char Nbits,
int gauss(unsigned int *gauss_LUT, int gauss(unsigned int *gauss_LUT,
unsigned char Nbits unsigned char Nbits
) ) {
{
unsigned int search_pos,step_size,u,tmp,tmpm1,tmpp1,s; unsigned int search_pos,step_size,u,tmp,tmpm1,tmpp1,s;
// Get a 32-bit uniform random-variable // Get a 32-bit uniform random-variable
u = taus(); u = taus();
#ifdef DEBUG #ifdef DEBUG
printf("u = %u\n",u); printf("u = %u\n",u);
#endif //DEBUG #endif //DEBUG
// if it is larger than 2^31 (here negative), save the sign and rescale down to 31-bits. // if it is larger than 2^31 (here negative), save the sign and rescale down to 31-bits.
s = u & 0x80000000; s = u & 0x80000000;
u &= 0x7fffffff; u &= 0x7fffffff;
#ifdef DEBUG #ifdef DEBUG
printf("u = %x,s=%d\n",u,s); printf("u = %x,s=%u\n",u,s);
#endif //DEBUG #endif //DEBUG
search_pos = (1<<(Nbits-2)); // starting position of the binary search search_pos = (1<<(Nbits-2)); // starting position of the binary search
step_size = search_pos; step_size = search_pos;
do { do {
step_size >>= 1; step_size >>= 1;
tmp = gauss_LUT[search_pos]; tmp = gauss_LUT[search_pos];
tmpm1 = gauss_LUT[search_pos-1]; tmpm1 = gauss_LUT[search_pos-1];
tmpp1 = gauss_LUT[search_pos+1]; tmpp1 = gauss_LUT[search_pos+1];
#ifdef DEBUG #ifdef DEBUG
printf("search_pos %d, step_size %d: t %x tm %x,tp %x\n",search_pos,step_size,tmp,tmpm1,tmpp1); printf("search_pos %u, step_size %u: t %x tm %x,tp %x\n",search_pos,step_size,tmp,tmpm1,tmpp1);
#endif //DEBUG #endif //DEBUG
if (u <= tmp) if (u <= tmp)
@@ -96,12 +80,10 @@ int gauss(unsigned int *gauss_LUT,
return s==0 ? search_pos : - search_pos; return s==0 ? search_pos : - search_pos;
else else
search_pos += step_size; search_pos += step_size;
} while (step_size > 0); } while (step_size > 0);
// If it gets here we're beyond the positive edge so return max // If it gets here we're beyond the positive edge so return max
return s==0 ? (1<<(Nbits-1))-1 : 1-((1<<(Nbits-1))); return s==0 ? (1<<(Nbits-1))-1 : 1-((1<<(Nbits-1)));
} }
@@ -109,9 +91,7 @@ int gauss(unsigned int *gauss_LUT,
#define Nhistbits 8 #define Nhistbits 8
void main(int argc,char **argv) void main(int argc,char **argv) {
{
unsigned int *gauss_LUT_ptr,i; unsigned int *gauss_LUT_ptr,i;
unsigned int hist[(1<<Nhistbits)]; unsigned int hist[(1<<Nhistbits)];
int gvar,maxg=0,ming=9999999,maxnum=0,L,Ntrials,Nbits; int gvar,maxg=0,ming=9999999,maxnum=0,L,Ntrials,Nbits;
@@ -125,7 +105,6 @@ void main(int argc,char **argv)
Nbits = atoi(argv[1]); Nbits = atoi(argv[1]);
L = atoi(argv[2]); L = atoi(argv[2]);
Ntrials = atoi(argv[3]); Ntrials = atoi(argv[3]);
set_taus_seed(); set_taus_seed();
// Generate Gaussian LUT 12-bit quantization over 5 standard deviations // Generate Gaussian LUT 12-bit quantization over 5 standard deviations
gauss_LUT_ptr = generate_gauss_LUT(Nbits,L); gauss_LUT_ptr = generate_gauss_LUT(Nbits,L);
@@ -134,7 +113,6 @@ void main(int argc,char **argv)
hist[i] = 0; hist[i] = 0;
for (i=0; i<Ntrials; i++) { for (i=0; i<Ntrials; i++) {
gvar = gauss(gauss_LUT_ptr,Nbits); gvar = gauss(gauss_LUT_ptr,Nbits);
if (gvar == ((1<<(Nbits-1))-1)) if (gvar == ((1<<(Nbits-1))-1))
@@ -151,10 +129,8 @@ void main(int argc,char **argv)
printf("Tail probability = %e(%x)\n",2*erfc((double)L*gauss_LUT_ptr[(1<<(Nbits-1))-1]/(unsigned int)(1<<31)),gauss_LUT_ptr[(1<<(Nbits-1))-1]); printf("Tail probability = %e(%x)\n",2*erfc((double)L*gauss_LUT_ptr[(1<<(Nbits-1))-1]/(unsigned int)(1<<31)),gauss_LUT_ptr[(1<<(Nbits-1))-1]);
printf("max %d, min %d, mean %f, stddev %f, Pr(maxnum)=%e(%d)\n",maxg,ming,meang,sqrt(varg),(double)maxnum/Ntrials,maxnum); printf("max %d, min %d, mean %f, stddev %f, Pr(maxnum)=%e(%d)\n",maxg,ming,meang,sqrt(varg),(double)maxnum/Ntrials,maxnum);
// for (i=0;i<(1<<Nhistbits);i++) // for (i=0;i<(1<<Nhistbits);i++)
// printf("%d : %u\n",i,hist[i]); // printf("%d : %u\n",i,hist[i]);
free(gauss_LUT_ptr); free(gauss_LUT_ptr);
} }
@@ -37,24 +37,18 @@ void multipath_tv_channel(channel_desc_t *desc,
double **rx_sig_re, double **rx_sig_re,
double **rx_sig_im, double **rx_sig_im,
uint16_t length, uint16_t length,
uint8_t keep_channel) uint8_t keep_channel) {
{ double complex **tx,**rx,* **H_t,*rx_temp; //, *tv_H_t;
double complex **tx,**rx,***H_t,*rx_temp;//, *tv_H_t;
double path_loss = pow(10,desc->path_loss_dB/20); double path_loss = pow(10,desc->path_loss_dB/20);
int i,j,k,dd; int i,j,k,dd;
dd = abs(desc->channel_offset); dd = abs(desc->channel_offset);
#ifdef DEBUG_CH #ifdef DEBUG_CH
printf("[TV CHANNEL] keep = %d : path_loss = %g (%f), nb_rx %d, nb_tx %d, dd %d, len %d max_doppler %d\n",keep_channel,path_loss,desc->path_loss_dB,desc->nb_rx,desc->nb_tx,dd,desc->channel_length, printf("[TV CHANNEL] keep = %d : path_loss = %g (%f), nb_rx %d, nb_tx %d, dd %d, len %d max_doppler %g\n",keep_channel,path_loss,desc->path_loss_dB,desc->nb_rx,desc->nb_tx,dd,desc->channel_length,
desc->max_Doppler); desc->max_Doppler);
#endif #endif
tx = (double complex **)malloc(desc->nb_tx*sizeof(double complex)); tx = (double complex **)malloc(desc->nb_tx*sizeof(double complex));
rx = (double complex **)malloc(desc->nb_rx*sizeof(double complex)); rx = (double complex **)malloc(desc->nb_rx*sizeof(double complex));
H_t= (double complex ** *) malloc(desc->nb_tx*desc->nb_rx*sizeof(double complex **));
H_t= (double complex ***) malloc(desc->nb_tx*desc->nb_rx*sizeof(double complex **));
// tv_H_t = (double complex *) malloc(length*sizeof(double complex)); // tv_H_t = (double complex *) malloc(length*sizeof(double complex));
rx_temp= (double complex *) calloc(length,sizeof(double complex)); rx_temp= (double complex *) calloc(length,sizeof(double complex));
@@ -128,17 +122,13 @@ void multipath_tv_channel(channel_desc_t *desc,
} }
free(H_t); free(H_t);
free(rx_temp); free(rx_temp);
} }
//TODO: make phi_rad a parameter of this function //TODO: make phi_rad a parameter of this function
void tv_channel(channel_desc_t *desc,double complex ***H,uint16_t length) void tv_channel(channel_desc_t *desc,double complex ***H,uint16_t length) {
{
int i,j,p,l,k; int i,j,p,l,k;
double *alpha,*phi_rad,pi=acos(-1),*w_Hz; double *alpha,*phi_rad,pi=acos(-1),*w_Hz;
alpha = (double *)calloc(desc->nb_paths,sizeof(double)); alpha = (double *)calloc(desc->nb_paths,sizeof(double));
phi_rad = (double *)calloc(desc->nb_paths,sizeof(double)); phi_rad = (double *)calloc(desc->nb_paths,sizeof(double));
w_Hz = (double *)calloc(desc->nb_paths,sizeof(double)); w_Hz = (double *)calloc(desc->nb_paths,sizeof(double));
@@ -203,21 +193,17 @@ void tv_channel(channel_desc_t *desc,double complex ***H,uint16_t length)
} }
// time varying convolution // time varying convolution
void tv_conv(double complex **h, double complex *x, double complex *y, uint16_t nb_samples, uint8_t nb_taps, int dd) void tv_conv(double complex **h, double complex *x, double complex *y, uint16_t nb_samples, uint8_t nb_taps, int dd) {
{
int i,j; int i,j;
for(i=0; i<((int)nb_samples-dd); i++) { for(i=0; i<((int)nb_samples-dd); i++) {
for(j=0; j<nb_taps; j++) { for(j=0; j<nb_taps; j++) {
if(i>j) if(i>j)
y[i+dd] += creal(h[i][j])*creal(x[i-j])-cimag(h[i][j])*cimag(x[i-j]) + I*(creal(h[i][j])*cimag(x[i-j])+cimag(h[i][j])*creal(x[i-j])); y[i+dd] += creal(h[i][j])*creal(x[i-j])-cimag(h[i][j])*cimag(x[i-j]) + I*(creal(h[i][j])*cimag(x[i-j])+cimag(h[i][j])*creal(x[i-j]));
} }
} }
} }
double frand_a_b(double a, double b) double frand_a_b(double a, double b) {
{
return (rand()/(double)RAND_MAX)*(b-a)+a; return (rand()/(double)RAND_MAX)*(b-a)+a;
} }
+4
View File
@@ -39,6 +39,8 @@ MESSAGE_DEF(S1AP_PAGING_LOG , MESSAGE_PRIORITY_MED, IttiMsgText
MESSAGE_DEF(S1AP_E_RAB_RELEASE_REQUEST_LOG , MESSAGE_PRIORITY_MED, IttiMsgText , s1ap_e_rab_release_request_log) MESSAGE_DEF(S1AP_E_RAB_RELEASE_REQUEST_LOG , MESSAGE_PRIORITY_MED, IttiMsgText , s1ap_e_rab_release_request_log)
MESSAGE_DEF(S1AP_E_RAB_RELEASE_RESPONSE_LOG , MESSAGE_PRIORITY_MED, IttiMsgText , s1ap_e_rab_release_response_log) MESSAGE_DEF(S1AP_E_RAB_RELEASE_RESPONSE_LOG , MESSAGE_PRIORITY_MED, IttiMsgText , s1ap_e_rab_release_response_log)
MESSAGE_DEF(S1AP_ERROR_INDICATION_LOG , MESSAGE_PRIORITY_MED, IttiMsgText , s1ap_error_indication_log) MESSAGE_DEF(S1AP_ERROR_INDICATION_LOG , MESSAGE_PRIORITY_MED, IttiMsgText , s1ap_error_indication_log)
MESSAGE_DEF(S1AP_PATH_SWITCH_REQ_LOG , MESSAGE_PRIORITY_MED, IttiMsgText , s1ap_path_switch_req_log)
MESSAGE_DEF(S1AP_PATH_SWITCH_REQ_ACK_LOG , MESSAGE_PRIORITY_MED, IttiMsgText , s1ap_path_switch_req_ack_log)
/* eNB application layer -> S1AP messages */ /* eNB application layer -> S1AP messages */
MESSAGE_DEF(S1AP_REGISTER_ENB_REQ , MESSAGE_PRIORITY_MED, s1ap_register_enb_req_t , s1ap_register_enb_req) MESSAGE_DEF(S1AP_REGISTER_ENB_REQ , MESSAGE_PRIORITY_MED, s1ap_register_enb_req_t , s1ap_register_enb_req)
@@ -62,6 +64,8 @@ MESSAGE_DEF(S1AP_E_RAB_SETUP_RESP , MESSAGE_PRIORITY_MED, s1ap_e_rab_se
MESSAGE_DEF(S1AP_E_RAB_SETUP_REQUEST_FAIL , MESSAGE_PRIORITY_MED, s1ap_e_rab_setup_req_fail_t , s1ap_e_rab_setup_request_fail) MESSAGE_DEF(S1AP_E_RAB_SETUP_REQUEST_FAIL , MESSAGE_PRIORITY_MED, s1ap_e_rab_setup_req_fail_t , s1ap_e_rab_setup_request_fail)
MESSAGE_DEF(S1AP_E_RAB_MODIFY_RESP , MESSAGE_PRIORITY_MED, s1ap_e_rab_modify_resp_t , s1ap_e_rab_modify_resp) MESSAGE_DEF(S1AP_E_RAB_MODIFY_RESP , MESSAGE_PRIORITY_MED, s1ap_e_rab_modify_resp_t , s1ap_e_rab_modify_resp)
MESSAGE_DEF(S1AP_E_RAB_RELEASE_RESPONSE , MESSAGE_PRIORITY_MED, s1ap_e_rab_release_resp_t , s1ap_e_rab_release_resp) MESSAGE_DEF(S1AP_E_RAB_RELEASE_RESPONSE , MESSAGE_PRIORITY_MED, s1ap_e_rab_release_resp_t , s1ap_e_rab_release_resp)
MESSAGE_DEF(S1AP_PATH_SWITCH_REQ , MESSAGE_PRIORITY_MED, s1ap_path_switch_req_t , s1ap_path_switch_req)
MESSAGE_DEF(S1AP_PATH_SWITCH_REQ_ACK , MESSAGE_PRIORITY_MED, s1ap_path_switch_req_ack_t , s1ap_path_switch_req_ack)
/* S1AP -> RRC messages */ /* S1AP -> RRC messages */
MESSAGE_DEF(S1AP_DOWNLINK_NAS , MESSAGE_PRIORITY_MED, s1ap_downlink_nas_t , s1ap_downlink_nas ) MESSAGE_DEF(S1AP_DOWNLINK_NAS , MESSAGE_PRIORITY_MED, s1ap_downlink_nas_t , s1ap_downlink_nas )
+71 -4
View File
@@ -42,6 +42,8 @@
#define S1AP_E_RAB_SETUP_RESP(mSGpTR) (mSGpTR)->ittiMsg.s1ap_e_rab_setup_resp #define S1AP_E_RAB_SETUP_RESP(mSGpTR) (mSGpTR)->ittiMsg.s1ap_e_rab_setup_resp
#define S1AP_E_RAB_SETUP_FAIL(mSGpTR) (mSGpTR)->ittiMsg.s1ap_e_rab_setup_req_fail #define S1AP_E_RAB_SETUP_FAIL(mSGpTR) (mSGpTR)->ittiMsg.s1ap_e_rab_setup_req_fail
#define S1AP_E_RAB_MODIFY_RESP(mSGpTR) (mSGpTR)->ittiMsg.s1ap_e_rab_modify_resp #define S1AP_E_RAB_MODIFY_RESP(mSGpTR) (mSGpTR)->ittiMsg.s1ap_e_rab_modify_resp
#define S1AP_PATH_SWITCH_REQ(mSGpTR) (mSGpTR)->ittiMsg.s1ap_path_switch_req
#define S1AP_PATH_SWITCH_REQ_ACK(mSGpTR) (mSGpTR)->ittiMsg.s1ap_path_switch_req_ack
#define S1AP_DOWNLINK_NAS(mSGpTR) (mSGpTR)->ittiMsg.s1ap_downlink_nas #define S1AP_DOWNLINK_NAS(mSGpTR) (mSGpTR)->ittiMsg.s1ap_downlink_nas
#define S1AP_INITIAL_CONTEXT_SETUP_REQ(mSGpTR) (mSGpTR)->ittiMsg.s1ap_initial_context_setup_req #define S1AP_INITIAL_CONTEXT_SETUP_REQ(mSGpTR) (mSGpTR)->ittiMsg.s1ap_initial_context_setup_req
@@ -269,6 +271,17 @@ typedef struct e_rab_setup_s {
uint32_t gtp_teid; uint32_t gtp_teid;
} e_rab_setup_t; } e_rab_setup_t;
typedef struct e_rab_tobeswitched_s {
/* Unique e_rab_id for the UE. */
uint8_t e_rab_id;
/* The transport layer address for the IP packets */
transport_layer_addr_t sgw_addr;
/* S-GW Tunnel endpoint identifier */
uint32_t gtp_teid;
} e_rab_tobeswitched_t;
typedef struct e_rab_modify_s { typedef struct e_rab_modify_s {
/* Unique e_rab_id for the UE. */ /* Unique e_rab_id for the UE. */
uint8_t e_rab_id; uint8_t e_rab_id;
@@ -480,6 +493,8 @@ typedef struct s1ap_initial_context_setup_req_s {
/* eNB ue s1ap id as initialized by S1AP layer */ /* eNB ue s1ap id as initialized by S1AP layer */
unsigned eNB_ue_s1ap_id:24; unsigned eNB_ue_s1ap_id:24;
uint32_t mme_ue_s1ap_id;
/* UE aggregate maximum bitrate */ /* UE aggregate maximum bitrate */
ambr_t ue_ambr; ambr_t ue_ambr;
@@ -533,7 +548,7 @@ typedef struct s1ap_e_rab_setup_req_s {
uint16_t ue_initial_id; uint16_t ue_initial_id;
/* MME UE id */ /* MME UE id */
uint16_t mme_ue_s1ap_id; uint32_t mme_ue_s1ap_id;
/* eNB ue s1ap id as initialized by S1AP layer */ /* eNB ue s1ap id as initialized by S1AP layer */
unsigned eNB_ue_s1ap_id:24; unsigned eNB_ue_s1ap_id:24;
@@ -560,6 +575,58 @@ typedef struct s1ap_e_rab_setup_resp_s {
e_rab_failed_t e_rabs_failed[S1AP_MAX_E_RAB]; e_rab_failed_t e_rabs_failed[S1AP_MAX_E_RAB];
} s1ap_e_rab_setup_resp_t; } s1ap_e_rab_setup_resp_t;
typedef struct s1ap_path_switch_req_s {
unsigned eNB_ue_s1ap_id:24;
/* Number of e_rab setup-ed in the list */
uint8_t nb_of_e_rabs;
/* list of e_rab setup-ed by RRC layers */
e_rab_setup_t e_rabs_tobeswitched[S1AP_MAX_E_RAB];
/* MME UE id */
uint32_t mme_ue_s1ap_id;
s1ap_gummei_t ue_gummei;
uint16_t ue_initial_id;
/* Security algorithms */
security_capabilities_t security_capabilities;
} s1ap_path_switch_req_t;
typedef struct s1ap_path_switch_req_ack_s {
/* UE id for initial connection to S1AP */
uint16_t ue_initial_id;
unsigned eNB_ue_s1ap_id:24;
/* MME UE id */
uint32_t mme_ue_s1ap_id;
/* UE aggregate maximum bitrate */
ambr_t ue_ambr;
/* Number of e_rab setup-ed in the list */
uint8_t nb_e_rabs_tobeswitched;
/* list of e_rab to be switched by RRC layers */
e_rab_tobeswitched_t e_rabs_tobeswitched[S1AP_MAX_E_RAB];
/* Number of e_rabs to be released by RRC */
uint8_t nb_e_rabs_tobereleased;
/* list of e_rabs to be released */
e_rab_failed_t e_rabs_tobereleased[S1AP_MAX_E_RAB];
/* Security key */
int next_hop_chain_count;
uint8_t next_security_key[SECURITY_KEY_LENGTH];
} s1ap_path_switch_req_ack_t;
// S1AP --> RRC messages // S1AP --> RRC messages
typedef struct s1ap_ue_release_command_s { typedef struct s1ap_ue_release_command_s {
@@ -582,7 +649,7 @@ typedef struct s1ap_e_rab_modify_req_s {
uint16_t ue_initial_id; uint16_t ue_initial_id;
/* MME UE id */ /* MME UE id */
uint16_t mme_ue_s1ap_id; uint32_t mme_ue_s1ap_id;
/* eNB ue s1ap id as initialized by S1AP layer */ /* eNB ue s1ap id as initialized by S1AP layer */
unsigned eNB_ue_s1ap_id:24; unsigned eNB_ue_s1ap_id:24;
@@ -615,7 +682,7 @@ typedef struct e_rab_release_s {
typedef struct s1ap_e_rab_release_command_s { typedef struct s1ap_e_rab_release_command_s {
/* MME UE id */ /* MME UE id */
uint16_t mme_ue_s1ap_id; uint32_t mme_ue_s1ap_id;
/* eNB ue s1ap id as initialized by S1AP layer */ /* eNB ue s1ap id as initialized by S1AP layer */
unsigned eNB_ue_s1ap_id:24; unsigned eNB_ue_s1ap_id:24;
@@ -633,7 +700,7 @@ typedef struct s1ap_e_rab_release_command_s {
typedef struct s1ap_e_rab_release_resp_s { typedef struct s1ap_e_rab_release_resp_s {
/* MME UE id */ /* MME UE id */
uint16_t mme_ue_s1ap_id; uint32_t mme_ue_s1ap_id;
/* eNB ue s1ap id as initialized by S1AP layer */ /* eNB ue s1ap id as initialized by S1AP layer */
unsigned eNB_ue_s1ap_id:24; unsigned eNB_ue_s1ap_id:24;
+16 -2
View File
@@ -22,6 +22,7 @@
#ifndef X2AP_MESSAGES_TYPES_H_ #ifndef X2AP_MESSAGES_TYPES_H_
#define X2AP_MESSAGES_TYPES_H_ #define X2AP_MESSAGES_TYPES_H_
#include "s1ap_messages_types.h"
#include "LTE_PhysCellId.h" #include "LTE_PhysCellId.h"
//-------------------------------------------------------------------------------------------// //-------------------------------------------------------------------------------------------//
@@ -132,7 +133,7 @@ typedef struct x2ap_handover_req_s {
int source_rnti; /* TODO: to be fixed/remove */ int source_rnti; /* TODO: to be fixed/remove */
int source_x2id; /* TODO: to be fixed/remove */ int source_x2id; /* TODO: to be fixed/remove */
unsigned old_eNB_ue_s1ap_id:24; int old_eNB_ue_x2ap_id;
LTE_PhysCellId_t target_physCellId; LTE_PhysCellId_t target_physCellId;
@@ -158,10 +159,14 @@ typedef struct x2ap_handover_req_s {
/* list of e_rab setup-ed by RRC layers */ /* list of e_rab setup-ed by RRC layers */
e_rab_setup_t e_rabs_tobesetup[S1AP_MAX_E_RAB]; e_rab_setup_t e_rabs_tobesetup[S1AP_MAX_E_RAB];
/* ue_context_pP->ue_context.e_rab[i].param.sgw_addr; */ /* list of e_rab to be setup by RRC layers */
e_rab_t e_rab_param[S1AP_MAX_E_RAB];
x2ap_lastvisitedcell_info_t lastvisitedcell_info; x2ap_lastvisitedcell_info_t lastvisitedcell_info;
uint8_t rrc_buffer[1024 /* arbitrary, big enough */];
int rrc_buffer_size;
/* TODO: this parameter has to be removed */ /* TODO: this parameter has to be removed */
int target_mod_id; int target_mod_id;
} x2ap_handover_req_t; } x2ap_handover_req_t;
@@ -171,6 +176,15 @@ typedef struct x2ap_handover_req_ack_s {
int source_x2id; /* TODO: to be fixed/remove */ int source_x2id; /* TODO: to be fixed/remove */
/* TODO: this parameter has to be removed */ /* TODO: this parameter has to be removed */
int target_mod_id; int target_mod_id;
uint8_t nb_e_rabs_tobesetup;
/* list of e_rab setup-ed by RRC layers */
e_rab_setup_t e_rabs_tobesetup[S1AP_MAX_E_RAB];
/* list of e_rab to be setup by RRC layers */
e_rab_t e_rab_param[S1AP_MAX_E_RAB];
uint8_t rrc_buffer[1024 /* arbitrary, big enough */]; uint8_t rrc_buffer[1024 /* arbitrary, big enough */];
int rrc_buffer_size; int rrc_buffer_size;
+122 -152
View File
@@ -34,11 +34,11 @@
#include "log_extern.h" #include "log_extern.h"
#include "assertions.h" #include "assertions.h"
#if defined(ENABLE_ITTI) #if defined(ENABLE_ITTI)
# include "intertask_interface.h" #include "intertask_interface.h"
# if defined(ENABLE_USE_MME) #if defined(ENABLE_USE_MME)
# include "s1ap_eNB.h" #include "s1ap_eNB.h"
# include "sctp_eNB_task.h" #include "sctp_eNB_task.h"
# endif #endif
#endif #endif
#include "SystemInformationBlockType2.h" #include "SystemInformationBlockType2.h"
@@ -56,11 +56,10 @@
void RCconfig_NbIoTL1(void) { void RCconfig_NbIoTL1(void) {
paramdef_t NbIoT_L1_Params[] = L1PARAMS_DESC; paramdef_t NbIoT_L1_Params[] = L1PARAMS_DESC;
paramlist_def_t NbIoT_L1_ParamList = {NBIOT_L1LIST_CONFIG_STRING,NULL,0}; paramlist_def_t NbIoT_L1_ParamList = {NBIOT_L1LIST_CONFIG_STRING,NULL,0};
/* No component carrier for NbIoT, ignore number of CC */
// NbIoT_L1_Params[L1_CC_IDX ].paramflags = PARAMFLAG_DONOTREAD;
config_getlist( &NbIoT_L1_ParamList,NbIoT_L1_Params,sizeof(NbIoT_L1_Params)/sizeof(paramdef_t), NULL);
/* No component carrier for NbIoT, ignore number of CC */
// NbIoT_L1_Params[L1_CC_IDX ].paramflags = PARAMFLAG_DONOTREAD;
config_getlist( &NbIoT_L1_ParamList,NbIoT_L1_Params,sizeof(NbIoT_L1_Params)/sizeof(paramdef_t), NULL);
if (NbIoT_L1_ParamList.numelt > 0) { if (NbIoT_L1_ParamList.numelt > 0) {
if (RC.L1_NB_IoT == NULL) { if (RC.L1_NB_IoT == NULL) {
RC.L1_NB_IoT = (PHY_VARS_eNB_NB_IoT **)malloc(RC.nb_nb_iot_L1_inst*sizeof(PHY_VARS_eNB_NB_IoT *)); RC.L1_NB_IoT = (PHY_VARS_eNB_NB_IoT **)malloc(RC.nb_nb_iot_L1_inst*sizeof(PHY_VARS_eNB_NB_IoT *));
@@ -68,219 +67,190 @@ void RCconfig_NbIoTL1(void) {
memset(RC.L1_NB_IoT,0,RC.nb_nb_iot_L1_inst*sizeof(PHY_VARS_eNB_NB_IoT *)); memset(RC.L1_NB_IoT,0,RC.nb_nb_iot_L1_inst*sizeof(PHY_VARS_eNB_NB_IoT *));
} }
for(int j = 0; j <NbIoT_L1_ParamList.numelt ; j++) {
for(int j = 0; j <NbIoT_L1_ParamList.numelt ; j++) {
if (RC.L1_NB_IoT[j] == NULL) { if (RC.L1_NB_IoT[j] == NULL) {
RC.L1_NB_IoT[j] = (PHY_VARS_eNB_NB_IoT *)malloc(sizeof(PHY_VARS_eNB_NB_IoT)); RC.L1_NB_IoT[j] = (PHY_VARS_eNB_NB_IoT *)malloc(sizeof(PHY_VARS_eNB_NB_IoT));
LOG_I(PHY,"RC.L1_NB_IoT[%d] = %p\n",j,RC.L1_NB_IoT[j]); LOG_I(PHY,"RC.L1_NB_IoT[%d] = %p\n",j,RC.L1_NB_IoT[j]);
memset(RC.L1_NB_IoT[j],0,sizeof(PHY_VARS_eNB_NB_IoT)); memset(RC.L1_NB_IoT[j],0,sizeof(PHY_VARS_eNB_NB_IoT));
} }
if (strcmp(*(NbIoT_L1_ParamList.paramarray[j][L1_TRANSPORT_N_PREFERENCE_IDX].strptr), "local_mac") == 0) {
if (strcmp(*(NbIoT_L1_ParamList.paramarray[j][L1_TRANSPORT_N_PREFERENCE_IDX].strptr), "local_mac") == 0) {
} else if (strcmp(*(NbIoT_L1_ParamList.paramarray[j][L1_TRANSPORT_N_PREFERENCE_IDX].strptr), "nfapi") == 0) {
RC.L1_NB_IoT[j]->eth_params_n.local_if_name = strdup(*(NbIoT_L1_ParamList.paramarray[j][L1_LOCAL_N_IF_NAME_IDX].strptr));
RC.L1_NB_IoT[j]->eth_params_n.my_addr = strdup(*(NbIoT_L1_ParamList.paramarray[j][L1_LOCAL_N_ADDRESS_IDX].strptr));
RC.L1_NB_IoT[j]->eth_params_n.remote_addr = strdup(*(NbIoT_L1_ParamList.paramarray[j][L1_REMOTE_N_ADDRESS_IDX].strptr));
RC.L1_NB_IoT[j]->eth_params_n.my_portc = *(NbIoT_L1_ParamList.paramarray[j][L1_LOCAL_N_PORTC_IDX].iptr);
RC.L1_NB_IoT[j]->eth_params_n.remote_portc = *(NbIoT_L1_ParamList.paramarray[j][L1_REMOTE_N_PORTC_IDX].iptr);
RC.L1_NB_IoT[j]->eth_params_n.my_portd = *(NbIoT_L1_ParamList.paramarray[j][L1_LOCAL_N_PORTD_IDX].iptr);
RC.L1_NB_IoT[j]->eth_params_n.remote_portd = *(NbIoT_L1_ParamList.paramarray[j][L1_REMOTE_N_PORTD_IDX].iptr);
RC.L1_NB_IoT[j]->eth_params_n.transp_preference = ETH_UDP_MODE;
} else { // other midhaul
} }
else if (strcmp(*(NbIoT_L1_ParamList.paramarray[j][L1_TRANSPORT_N_PREFERENCE_IDX].strptr), "nfapi") == 0) {
RC.L1_NB_IoT[j]->eth_params_n.local_if_name = strdup(*(NbIoT_L1_ParamList.paramarray[j][L1_LOCAL_N_IF_NAME_IDX].strptr));
RC.L1_NB_IoT[j]->eth_params_n.my_addr = strdup(*(NbIoT_L1_ParamList.paramarray[j][L1_LOCAL_N_ADDRESS_IDX].strptr));
RC.L1_NB_IoT[j]->eth_params_n.remote_addr = strdup(*(NbIoT_L1_ParamList.paramarray[j][L1_REMOTE_N_ADDRESS_IDX].strptr));
RC.L1_NB_IoT[j]->eth_params_n.my_portc = *(NbIoT_L1_ParamList.paramarray[j][L1_LOCAL_N_PORTC_IDX].iptr);
RC.L1_NB_IoT[j]->eth_params_n.remote_portc = *(NbIoT_L1_ParamList.paramarray[j][L1_REMOTE_N_PORTC_IDX].iptr);
RC.L1_NB_IoT[j]->eth_params_n.my_portd = *(NbIoT_L1_ParamList.paramarray[j][L1_LOCAL_N_PORTD_IDX].iptr);
RC.L1_NB_IoT[j]->eth_params_n.remote_portd = *(NbIoT_L1_ParamList.paramarray[j][L1_REMOTE_N_PORTD_IDX].iptr);
RC.L1_NB_IoT[j]->eth_params_n.transp_preference = ETH_UDP_MODE;
}
else { // other midhaul
}
}// j=0..num_inst }// j=0..num_inst
printf("Initializing northbound interface for NB-IoT L1\n"); printf("Initializing northbound interface for NB-IoT L1\n");
l1_north_init_NB_IoT(); l1_north_init_NB_IoT();
} else { } else {
LOG_I(PHY,"No " NBIOT_L1LIST_CONFIG_STRING " configuration found"); LOG_I(PHY,"No " NBIOT_L1LIST_CONFIG_STRING " configuration found");
} }
} }
void RCconfig_NbIoTmacrlc(void) { void RCconfig_NbIoTmacrlc(void) {
paramdef_t NbIoT_MacRLC_Params[] = MACRLCPARAMS_DESC; paramdef_t NbIoT_MacRLC_Params[] = MACRLCPARAMS_DESC;
paramlist_def_t NbIoT_MacRLC_ParamList = {NBIOT_MACRLCLIST_CONFIG_STRING,NULL,0}; paramlist_def_t NbIoT_MacRLC_ParamList = {NBIOT_MACRLCLIST_CONFIG_STRING,NULL,0};
/* No component carrier for NbIoT, ignore number of CC */
// NbIoT_MacRLC_Params[MACRLC_CC_IDX ].paramflags = PARAMFLAG_DONOTREAD;
/* No component carrier for NbIoT, ignore number of CC */ config_getlist( &NbIoT_MacRLC_ParamList,NbIoT_MacRLC_Params,sizeof(NbIoT_MacRLC_Params)/sizeof(paramdef_t), NULL);
// NbIoT_MacRLC_Params[MACRLC_CC_IDX ].paramflags = PARAMFLAG_DONOTREAD;
config_getlist( &NbIoT_MacRLC_ParamList,NbIoT_MacRLC_Params,sizeof(NbIoT_MacRLC_Params)/sizeof(paramdef_t), NULL);
if ( NbIoT_MacRLC_ParamList.numelt > 0) { if ( NbIoT_MacRLC_ParamList.numelt > 0) {
mac_top_init_eNB_NB_IoT(); mac_top_init_eNB_NB_IoT();
for (int j=0;j<RC.nb_nb_iot_macrlc_inst;j++) {
for (int j=0; j<RC.nb_nb_iot_macrlc_inst; j++) {
if (strcmp(*(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_TRANSPORT_N_PREFERENCE_IDX].strptr), "local_RRC") == 0) { if (strcmp(*(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_TRANSPORT_N_PREFERENCE_IDX].strptr), "local_RRC") == 0) {
// check number of instances is same as RRC/PDCP // check number of instances is same as RRC/PDCP
} else if (strcmp(*(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_TRANSPORT_N_PREFERENCE_IDX].strptr), "cudu") == 0) { } else if (strcmp(*(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_TRANSPORT_N_PREFERENCE_IDX].strptr), "cudu") == 0) {
RC.nb_iot_mac[j]->eth_params_n.local_if_name = strdup(*(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_N_IF_NAME_IDX].strptr)); RC.nb_iot_mac[j]->eth_params_n.local_if_name = strdup(*(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_N_IF_NAME_IDX].strptr));
RC.nb_iot_mac[j]->eth_params_n.my_addr = strdup(*(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_N_ADDRESS_IDX].strptr)); RC.nb_iot_mac[j]->eth_params_n.my_addr = strdup(*(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_N_ADDRESS_IDX].strptr));
RC.nb_iot_mac[j]->eth_params_n.remote_addr = strdup(*(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_REMOTE_N_ADDRESS_IDX].strptr)); RC.nb_iot_mac[j]->eth_params_n.remote_addr = strdup(*(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_REMOTE_N_ADDRESS_IDX].strptr));
RC.nb_iot_mac[j]->eth_params_n.my_portc = *(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_N_PORTC_IDX].iptr); RC.nb_iot_mac[j]->eth_params_n.my_portc = *(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_N_PORTC_IDX].iptr);
RC.nb_iot_mac[j]->eth_params_n.remote_portc = *(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_REMOTE_N_PORTC_IDX].iptr); RC.nb_iot_mac[j]->eth_params_n.remote_portc = *(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_REMOTE_N_PORTC_IDX].iptr);
RC.nb_iot_mac[j]->eth_params_n.my_portd = *(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_N_PORTD_IDX].iptr); RC.nb_iot_mac[j]->eth_params_n.my_portd = *(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_N_PORTD_IDX].iptr);
RC.nb_iot_mac[j]->eth_params_n.remote_portd = *(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_REMOTE_N_PORTD_IDX].iptr);; RC.nb_iot_mac[j]->eth_params_n.remote_portd = *(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_REMOTE_N_PORTD_IDX].iptr);;
RC.nb_iot_mac[j]->eth_params_n.transp_preference = ETH_UDP_MODE; RC.nb_iot_mac[j]->eth_params_n.transp_preference = ETH_UDP_MODE;
} else { // other midhaul } else { // other midhaul
AssertFatal(1==0,"MACRLC %d: %s unknown northbound midhaul\n",j, *(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_TRANSPORT_N_PREFERENCE_IDX].strptr)); AssertFatal(1==0,"MACRLC %d: %s unknown northbound midhaul\n",j, *(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_TRANSPORT_N_PREFERENCE_IDX].strptr));
} }
if (strcmp(*(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_TRANSPORT_S_PREFERENCE_IDX].strptr), "local_L1") == 0) { if (strcmp(*(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_TRANSPORT_S_PREFERENCE_IDX].strptr), "local_L1") == 0) {
} else if (strcmp(*(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_TRANSPORT_S_PREFERENCE_IDX].strptr), "nfapi") == 0) { } else if (strcmp(*(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_TRANSPORT_S_PREFERENCE_IDX].strptr), "nfapi") == 0) {
RC.nb_iot_mac[j]->eth_params_s.local_if_name = strdup(*(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_S_IF_NAME_IDX].strptr)); RC.nb_iot_mac[j]->eth_params_s.local_if_name = strdup(*(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_S_IF_NAME_IDX].strptr));
RC.nb_iot_mac[j]->eth_params_s.my_addr = strdup(*(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_S_ADDRESS_IDX].strptr)); RC.nb_iot_mac[j]->eth_params_s.my_addr = strdup(*(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_S_ADDRESS_IDX].strptr));
RC.nb_iot_mac[j]->eth_params_s.remote_addr = strdup(*(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_REMOTE_S_ADDRESS_IDX].strptr)); RC.nb_iot_mac[j]->eth_params_s.remote_addr = strdup(*(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_REMOTE_S_ADDRESS_IDX].strptr));
RC.nb_iot_mac[j]->eth_params_s.my_portc = *(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_S_PORTC_IDX].iptr); RC.nb_iot_mac[j]->eth_params_s.my_portc = *(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_S_PORTC_IDX].iptr);
RC.nb_iot_mac[j]->eth_params_s.remote_portc = *(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_REMOTE_S_PORTC_IDX].iptr); RC.nb_iot_mac[j]->eth_params_s.remote_portc = *(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_REMOTE_S_PORTC_IDX].iptr);
RC.nb_iot_mac[j]->eth_params_s.my_portd = *(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_S_PORTD_IDX].iptr); RC.nb_iot_mac[j]->eth_params_s.my_portd = *(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_S_PORTD_IDX].iptr);
RC.nb_iot_mac[j]->eth_params_s.remote_portd = *(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_REMOTE_S_PORTD_IDX].iptr); RC.nb_iot_mac[j]->eth_params_s.remote_portd = *(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_REMOTE_S_PORTD_IDX].iptr);
RC.nb_iot_mac[j]->eth_params_s.transp_preference = ETH_UDP_MODE; RC.nb_iot_mac[j]->eth_params_s.transp_preference = ETH_UDP_MODE;
} else { // other midhaul } else { // other midhaul
AssertFatal(1==0,"MACRLC %d: %s unknown southbound midhaul\n",j,*(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_TRANSPORT_S_PREFERENCE_IDX].strptr)); AssertFatal(1==0,"MACRLC %d: %s unknown southbound midhaul\n",j,*(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_TRANSPORT_S_PREFERENCE_IDX].strptr));
} }
}// j=0..num_inst */ }// j=0..num_inst */
} else {// MacRLC_ParamList.numelt > 0 } else {// MacRLC_ParamList.numelt > 0
AssertFatal (0, AssertFatal (0,
"No " NBIOT_MACRLCLIST_CONFIG_STRING " configuration found"); "No " NBIOT_MACRLCLIST_CONFIG_STRING " configuration found");
} }
} }
int RCconfig_NbIoTRRC(MessageDef *msg_p, int nbiotrrc_id,eNB_RRC_INST_NB_IoT *nbiotrrc) { int RCconfig_NbIoTRRC(MessageDef *msg_p, int nbiotrrc_id,eNB_RRC_INST_NB_IoT *nbiotrrc) {
char instprefix[MAX_OPTNAME_SIZE*3 + 32]; char instprefix[MAX_OPTNAME_SIZE*3 + 32];
checkedparam_t NBIoTCheckParams[] = NBIOT_RRCPARAMS_CHECK_DESC_0_14;
checkedparam_t NBIoTCheckParamsB[] = NBIOT_RRCPARAMS_CHECK_DESC_15_end;
checkedparam_t NBIoTCheckParams[] = NBIOT_RRCPARAMS_CHECK_DESC;
paramdef_t NBIoTParams[] = NBIOTRRCPARAMS_DESC; paramdef_t NBIoTParams[] = NBIOTRRCPARAMS_DESC;
paramdef_t NBIoTPrachParams[] = NBIOTRRC_NPRACH_PARAMS_DESC; paramdef_t NBIoTPrachParams[] = NBIOTRRC_NPRACH_PARAMS_DESC;
checkedparam_t NBIoTPrachCheckParams[] = NBIOT_RRCLIST_NPRACHPARAMSCHECK_DESC; checkedparam_t NBIoTPrachCheckParams[] = NBIOT_RRCLIST_NPRACHPARAMSCHECK_DESC;
paramdef_t NBIoTRRCRefParams[] = NBIOTRRCPARAMS_RRCREF_DESC; paramdef_t NBIoTRRCRefParams[] = NBIOTRRCPARAMS_RRCREF_DESC;
paramdef_t NBIoTLteCCParams[] = NBIOT_LTECCPARAMS_DESC; paramdef_t NBIoTLteCCParams[] = NBIOT_LTECCPARAMS_DESC;
checkedparam_t NBIoTLteCCCheckParams[] = NBIOT_LTECCPARAMS_CHECK_DESC; checkedparam_t NBIoTLteCCCheckParams[] = NBIOT_LTECCPARAMS_CHECK_DESC;
/* map parameter checking array instances to parameter definition array instances */
/* map parameter checking array instances to parameter definition array instances */
for (int i=0; (i<sizeof(NBIoTParams)/sizeof(paramdef_t)) && (i<sizeof(NBIoTCheckParams)/sizeof(checkedparam_t)); i++ ) { for (int i=0; (i<sizeof(NBIoTParams)/sizeof(paramdef_t)) && (i<sizeof(NBIoTCheckParams)/sizeof(checkedparam_t)); i++ ) {
NBIoTParams[i].chkPptr = &(NBIoTCheckParams[i]); NBIoTParams[i].chkPptr = &(NBIoTCheckParams[i]);
}
for (int i=0; (i<sizeof(NBIoTPrachParams)/sizeof(paramdef_t)) && (i<sizeof(NBIoTPrachCheckParams)/sizeof(checkedparam_t)); i++ ) {
NBIoTPrachParams[i].chkPptr = &(NBIoTPrachCheckParams[i]);
} }
/* brut force itti message fields assignment, to be redesigned with itti replacement */ for (int i=0; (i<sizeof(NBIoTParams)/sizeof(paramdef_t)) && (i<sizeof(NBIoTCheckParamsB)/sizeof(checkedparam_t)); i++ ) {
NBIoTParams[i+15].chkPptr = &(NBIoTCheckParamsB[i]);
}
for (int i=0; (i<sizeof(NBIoTPrachParams)/sizeof(paramdef_t)) && (i<sizeof(NBIoTPrachCheckParams)/sizeof(checkedparam_t)); i++ ) {
NBIoTPrachParams[i].chkPptr = &(NBIoTPrachCheckParams[i]);
}
/* brut force itti message fields assignment, to be redesigned with itti replacement */
NBIoTParams[NBIOT_RACH_RARESPONSEWINDOWSIZE_NB_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).rach_raResponseWindowSize_NB); NBIoTParams[NBIOT_RACH_RARESPONSEWINDOWSIZE_NB_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).rach_raResponseWindowSize_NB);
NBIoTParams[NBIOT_RACH_MACCONTENTIONRESOLUTIONTIMER_NB_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).rach_macContentionResolutionTimer_NB); NBIoTParams[NBIOT_RACH_MACCONTENTIONRESOLUTIONTIMER_NB_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).rach_macContentionResolutionTimer_NB);
NBIoTParams[NBIOT_RACH_POWERRAMPINGSTEP_NB_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).rach_powerRampingStep_NB); NBIoTParams[NBIOT_RACH_POWERRAMPINGSTEP_NB_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).rach_powerRampingStep_NB);
NBIoTParams[NBIOT_RACH_PREAMBLEINITIALRECEIVEDTARGETPOWER_NB_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).rach_preambleInitialReceivedTargetPower_NB); NBIoTParams[NBIOT_RACH_PREAMBLEINITIALRECEIVEDTARGETPOWER_NB_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).rach_preambleInitialReceivedTargetPower_NB);
NBIoTParams[NBIOT_RACH_PREAMBLETRANSMAX_CE_NB_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax_CE_NB); NBIoTParams[NBIOT_RACH_PREAMBLETRANSMAX_CE_NB_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax_CE_NB);
NBIoTParams[NBIOT_BCCH_MODIFICATIONPERIODCOEFF_NB_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).bcch_modificationPeriodCoeff_NB); NBIoTParams[NBIOT_BCCH_MODIFICATIONPERIODCOEFF_NB_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).bcch_modificationPeriodCoeff_NB);
NBIoTParams[NBIOT_PCCH_DEFAULTPAGINGCYCLE_NB_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).pcch_defaultPagingCycle_NB); NBIoTParams[NBIOT_PCCH_DEFAULTPAGINGCYCLE_NB_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).pcch_defaultPagingCycle_NB);
NBIoTParams[NBIOT_NPRACH_CP_LENGTH_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).nprach_CP_Length); NBIoTParams[NBIOT_NPRACH_CP_LENGTH_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).nprach_CP_Length);
NBIoTParams[NBIOT_NPRACH_RSRP_RANGE_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).nprach_rsrp_range); NBIoTParams[NBIOT_NPRACH_RSRP_RANGE_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).nprach_rsrp_range);
NBIoTParams[NBIOT_MAXNUMPREAMBLEATTEMPTCE_NB_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).maxNumPreambleAttemptCE_NB); NBIoTParams[NBIOT_MAXNUMPREAMBLEATTEMPTCE_NB_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).maxNumPreambleAttemptCE_NB);
NBIoTParams[NBIOT_NPDSCH_NRS_POWER_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).npdsch_nrs_Power);
NBIoTParams[NBIOT_NPDSCH_NRS_POWER_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).npdsch_nrs_Power); NBIoTParams[NBIOT_NPUSCH_ACK_NACK_NUMREPETITIONS_NB_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p). npusch_ack_nack_numRepetitions_NB);
NBIoTParams[NBIOT_NPUSCH_ACK_NACK_NUMREPETITIONS_NB_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p). npusch_ack_nack_numRepetitions_NB); NBIoTParams[NBIOT_NPUSCH_SRS_SUBFRAMECONFIG_NB_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p). npusch_srs_SubframeConfig_NB);
NBIoTParams[NBIOT_NPUSCH_SRS_SUBFRAMECONFIG_NB_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p). npusch_srs_SubframeConfig_NB); NBIoTParams[NBIOT_NPUSCH_THREETONE_CYCLICSHIFT_R13_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).npusch_threeTone_CyclicShift_r13);
NBIoTParams[NBIOT_NPUSCH_THREETONE_CYCLICSHIFT_R13_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).npusch_threeTone_CyclicShift_r13);
NBIoTParams[NBIOT_NPUSCH_SIXTONE_CYCLICSHIFT_R13_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).npusch_sixTone_CyclicShift_r13); NBIoTParams[NBIOT_NPUSCH_SIXTONE_CYCLICSHIFT_R13_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).npusch_sixTone_CyclicShift_r13);
NBIoTParams[NBIOT_NPUSCH_GROUPASSIGNMENTNPUSCH_R13_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).npusch_groupAssignmentNPUSCH_r13); NBIoTParams[NBIOT_NPUSCH_GROUPASSIGNMENTNPUSCH_R13_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).npusch_groupAssignmentNPUSCH_r13);
NBIoTParams[NBIOT_DL_GAPTHRESHOLD_NB_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).dl_GapThreshold_NB); NBIoTParams[NBIOT_DL_GAPTHRESHOLD_NB_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).dl_GapThreshold_NB);
NBIoTParams[NBIOT_DL_GAPPERIODICITY_NB_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).dl_GapPeriodicity_NB); NBIoTParams[NBIOT_DL_GAPPERIODICITY_NB_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).dl_GapPeriodicity_NB);
NBIoTParams[NBIOT_NPUSCH_P0_NOMINALNPUSCH_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).npusch_p0_NominalNPUSCH);
NBIoTParams[NBIOT_NPUSCH_P0_NOMINALNPUSCH_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).npusch_p0_NominalNPUSCH); NBIoTParams[NBIOT_DELTAPREAMBLEMSG3_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).deltaPreambleMsg3);
NBIoTParams[NBIOT_UE_TIMERSANDCONSTANTS_T300_NB_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t300_NB);
NBIoTParams[NBIOT_DELTAPREAMBLEMSG3_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).deltaPreambleMsg3);
NBIoTParams[NBIOT_UE_TIMERSANDCONSTANTS_T300_NB_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t300_NB);
NBIoTParams[NBIOT_UE_TIMERSANDCONSTANTS_T301_NB_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t301_NB); NBIoTParams[NBIOT_UE_TIMERSANDCONSTANTS_T301_NB_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t301_NB);
NBIoTParams[NBIOT_UE_TIMERSANDCONSTANTS_T310_NB_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t310_NB); NBIoTParams[NBIOT_UE_TIMERSANDCONSTANTS_T310_NB_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t310_NB);
NBIoTParams[NBIOT_UE_TIMERSANDCONSTANTS_T311_NB_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t311_NB); NBIoTParams[NBIOT_UE_TIMERSANDCONSTANTS_T311_NB_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t311_NB);
NBIoTParams[NBIOT_UE_TIMERSANDCONSTANTS_N310_NB_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_n310_NB); NBIoTParams[NBIOT_UE_TIMERSANDCONSTANTS_N310_NB_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_n310_NB);
NBIoTParams[NBIOT_UE_TIMERSANDCONSTANTS_N311_NB_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_n311_NB); NBIoTParams[NBIOT_UE_TIMERSANDCONSTANTS_N311_NB_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_n311_NB);
sprintf(instprefix, NBIOT_RRCLIST_CONFIG_STRING ".[%i]",nbiotrrc_id); sprintf(instprefix, NBIOT_RRCLIST_CONFIG_STRING ".[%i]",nbiotrrc_id);
config_get( NBIoTParams,sizeof(NBIoTParams)/sizeof(paramdef_t),instprefix); config_get( NBIoTParams,sizeof(NBIoTParams)/sizeof(paramdef_t),instprefix);
NBIOTRRC_CONFIGURATION_REQ (msg_p).nprach_SubcarrierMSG3_RangeStart = config_get_processedint( &(NBIoTParams[NBIOT_NPRACH_SUBCARRIERMSG3_RANGESTART_IDX]) ); NBIOTRRC_CONFIGURATION_REQ (msg_p).nprach_SubcarrierMSG3_RangeStart = config_get_processedint( &(NBIoTParams[NBIOT_NPRACH_SUBCARRIERMSG3_RANGESTART_IDX]) );
NBIOTRRC_CONFIGURATION_REQ (msg_p).npusch_groupHoppingEnabled = config_get_processedint( &(NBIoTParams[NBIOT_NPUSCH_GROUPHOPPINGENABLED_IDX] ) ); NBIOTRRC_CONFIGURATION_REQ (msg_p).npusch_groupHoppingEnabled = config_get_processedint( &(NBIoTParams[NBIOT_NPUSCH_GROUPHOPPINGENABLED_IDX] ) );
NBIOTRRC_CONFIGURATION_REQ (msg_p).dl_GapDurationCoeff_NB = config_get_processedint( &(NBIoTParams[NBIOT_DL_GAPDURATIONCOEFF_NB_IDX] ) ); NBIOTRRC_CONFIGURATION_REQ (msg_p).dl_GapDurationCoeff_NB = config_get_processedint( &(NBIoTParams[NBIOT_DL_GAPDURATIONCOEFF_NB_IDX] ) );
NBIOTRRC_CONFIGURATION_REQ (msg_p).npusch_alpha = config_get_processedint( &(NBIoTParams[NBIOT_NPUSCH_ALPHA_IDX] ) ); NBIOTRRC_CONFIGURATION_REQ (msg_p).npusch_alpha = config_get_processedint( &(NBIoTParams[NBIOT_NPUSCH_ALPHA_IDX] ) );
for (int i=0; i<MAX_NUM_NBIOT_CELEVELS; i++) { for (int i=0; i<MAX_NUM_NBIOT_CELEVELS; i++) {
char *tmpptr=NULL; char *tmpptr=NULL;
NBIoTPrachParams[NBIOT_NPRACH_PERIODICITY_IDX ].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).nprach_Periodicity[i]); NBIoTPrachParams[NBIOT_NPRACH_PERIODICITY_IDX ].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).nprach_Periodicity[i]);
NBIoTPrachParams[NBIOT_NPRACH_STARTTIME_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).nprach_StartTime[i]); NBIoTPrachParams[NBIOT_NPRACH_STARTTIME_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).nprach_StartTime[i]);
NBIoTPrachParams[NBIOT_NPRACH_SUBCARRIEROFFSET_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).nprach_SubcarrierOffset[i]); NBIoTPrachParams[NBIOT_NPRACH_SUBCARRIEROFFSET_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).nprach_SubcarrierOffset[i]);
NBIoTPrachParams[NBIOT_NPRACH_NUMSUBCARRIERS_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).nprach_NumSubcarriers[i]); NBIoTPrachParams[NBIOT_NPRACH_NUMSUBCARRIERS_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).nprach_NumSubcarriers[i]);
NBIoTPrachParams[NBIOT_NUMREPETITIONSPERPREAMBLEATTEMPT_NB_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).numRepetitionsPerPreambleAttempt_NB[i]); NBIoTPrachParams[NBIOT_NUMREPETITIONSPERPREAMBLEATTEMPT_NB_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).numRepetitionsPerPreambleAttempt_NB[i]);
NBIoTParams[NBIOT_NPDCCH_NUMREPETITIONS_RA_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).npdcch_NumRepetitions_RA[i]); NBIoTParams[NBIOT_NPDCCH_NUMREPETITIONS_RA_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).npdcch_NumRepetitions_RA[i]);
NBIoTParams[NBIOT_NPDCCH_STARTSF_CSS_RA_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).npdcch_StartSF_CSS_RA[i]); NBIoTParams[NBIOT_NPDCCH_STARTSF_CSS_RA_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).npdcch_StartSF_CSS_RA[i]);
NBIoTParams[NBIOT_NPDCCH_OFFSET_RA_IDX].strptr = &tmpptr; NBIoTParams[NBIOT_NPDCCH_OFFSET_RA_IDX].strptr = &tmpptr;
sprintf(instprefix, "%s.[%i].%s.[%i]",NBIOT_RRCLIST_CONFIG_STRING, nbiotrrc_id,NBIOT_RRCLIST_NPRACHPARAMS_CONFIG_STRING,i); sprintf(instprefix, "%s.[%i].%s.[%i]",NBIOT_RRCLIST_CONFIG_STRING, nbiotrrc_id,NBIOT_RRCLIST_NPRACHPARAMS_CONFIG_STRING,i);
config_get( NBIoTPrachParams,sizeof(NBIoTPrachParams)/sizeof(paramdef_t),instprefix); config_get( NBIoTPrachParams,sizeof(NBIoTPrachParams)/sizeof(paramdef_t),instprefix);
NBIOTRRC_CONFIGURATION_REQ (msg_p).npdcch_Offset_RA[i] = config_get_processedint( &(NBIoTPrachParams[NBIOT_NPDCCH_OFFSET_RA_IDX]) ); NBIOTRRC_CONFIGURATION_REQ (msg_p).npdcch_Offset_RA[i] = config_get_processedint( &(NBIoTPrachParams[NBIOT_NPDCCH_OFFSET_RA_IDX]) );
} }
/* get the LTE RRC and CC this NB-IoT RRC instance is attached to */
/* get the LTE RRC and CC this NB-IoT RRC instance is attached to */
sprintf(instprefix, NBIOT_RRCLIST_CONFIG_STRING ".[%i]." NBIOT_LTERRCREF_CONFIG_STRING, nbiotrrc_id ); sprintf(instprefix, NBIOT_RRCLIST_CONFIG_STRING ".[%i]." NBIOT_LTERRCREF_CONFIG_STRING, nbiotrrc_id );
config_get( NBIoTRRCRefParams,sizeof(NBIoTRRCRefParams)/sizeof(paramdef_t),instprefix); config_get( NBIoTRRCRefParams,sizeof(NBIoTRRCRefParams)/sizeof(paramdef_t),instprefix);
/* read SIB1 parameters in the LTE RRC and CC sections */
/* read SIB1 parameters in the LTE RRC and CC sections */
sprintf(instprefix, ENB_CONFIG_STRING_ENB_LIST ".[%i]." ENB_CONFIG_STRING_COMPONENT_CARRIERS ".[%i]", sprintf(instprefix, ENB_CONFIG_STRING_ENB_LIST ".[%i]." ENB_CONFIG_STRING_COMPONENT_CARRIERS ".[%i]",
*(NBIoTRRCRefParams[NBIOT_RRCINST_IDX].uptr), *(NBIoTRRCRefParams[NBIOT_CCINST_IDX].uptr)); *(NBIoTRRCRefParams[NBIOT_RRCINST_IDX].uptr), *(NBIoTRRCRefParams[NBIOT_CCINST_IDX].uptr));
NBIoTLteCCParams[LTECCPARAMS_TDD_CONFIG_IDX ].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).tdd_config);
NBIoTLteCCParams[LTECCPARAMS_TDD_CONFIG_IDX ].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).tdd_config); NBIoTLteCCParams[LTECCPARAMS_TDD_CONFIG_S_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).tdd_config_s);
NBIoTLteCCParams[LTECCPARAMS_TDD_CONFIG_S_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).tdd_config_s); NBIoTLteCCParams[LTECCPARAMS_EUTRA_BAND_IDX ].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).eutra_band);
NBIoTLteCCParams[LTECCPARAMS_EUTRA_BAND_IDX ].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).eutra_band); NBIoTLteCCParams[LTECCPARAMS_DOWNLINK_FREQUENCY_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).downlink_frequency);
NBIoTLteCCParams[LTECCPARAMS_DOWNLINK_FREQUENCY_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).downlink_frequency);
NBIoTLteCCParams[LTECCPARAMS_UPLINK_FREQUENCY_OFFSET_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).uplink_frequency_offset); NBIoTLteCCParams[LTECCPARAMS_UPLINK_FREQUENCY_OFFSET_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).uplink_frequency_offset);
NBIoTLteCCParams[LTECCPARAMS_NID_CELL_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).Nid_cell); NBIoTLteCCParams[LTECCPARAMS_NID_CELL_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).Nid_cell);
NBIoTLteCCParams[LTECCPARAMS_N_RB_DL_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).N_RB_DL); NBIoTLteCCParams[LTECCPARAMS_N_RB_DL_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).N_RB_DL);
for (int i=0; (i<sizeof(NBIoTLteCCParams)/sizeof(paramdef_t)) && (i<sizeof(NBIoTLteCCCheckParams)/sizeof(checkedparam_t)); i++ ) { for (int i=0; (i<sizeof(NBIoTLteCCParams)/sizeof(paramdef_t)) && (i<sizeof(NBIoTLteCCCheckParams)/sizeof(checkedparam_t)); i++ ) {
NBIoTLteCCParams[i].chkPptr = &(NBIoTLteCCCheckParams[i]); NBIoTLteCCParams[i].chkPptr = &(NBIoTLteCCCheckParams[i]);
} }
config_get( NBIoTLteCCParams,sizeof(NBIoTLteCCParams)/sizeof(paramdef_t),instprefix);
NBIOTRRC_CONFIGURATION_REQ (msg_p).frame_type = config_get_processedint( &(NBIoTLteCCParams[LTECCPARAMS_FRAME_TYPE_IDX]) ); config_get( NBIoTLteCCParams,sizeof(NBIoTLteCCParams)/sizeof(paramdef_t),instprefix);
NBIOTRRC_CONFIGURATION_REQ (msg_p).frame_type = config_get_processedint( &(NBIoTLteCCParams[LTECCPARAMS_FRAME_TYPE_IDX]) );
NBIOTRRC_CONFIGURATION_REQ (msg_p).prefix_type = config_get_processedint( &(NBIoTLteCCParams[LTECCPARAMS_PREFIX_TYPE_IDX]) ); NBIOTRRC_CONFIGURATION_REQ (msg_p).prefix_type = config_get_processedint( &(NBIoTLteCCParams[LTECCPARAMS_PREFIX_TYPE_IDX]) );
NBIOTRRC_CONFIGURATION_REQ (msg_p).prefix_type = config_get_processedint( &(NBIoTLteCCParams[LTECCPARAMS_PREFIX_TYPE_UL_IDX]) ); NBIOTRRC_CONFIGURATION_REQ (msg_p).prefix_type = config_get_processedint( &(NBIoTLteCCParams[LTECCPARAMS_PREFIX_TYPE_UL_IDX]) );
return 0; return 0;
} }
void RCConfig_NbIoT(RAN_CONTEXT_t *RC) { void RCConfig_NbIoT(RAN_CONTEXT_t *RC) {
paramlist_def_t NbIoT_MACRLCParamList = {NBIOT_MACRLCLIST_CONFIG_STRING,NULL,0}; paramlist_def_t NbIoT_MACRLCParamList = {NBIOT_MACRLCLIST_CONFIG_STRING,NULL,0};
paramlist_def_t NbIoT_L1ParamList = {NBIOT_L1LIST_CONFIG_STRING,NULL,0}; paramlist_def_t NbIoT_L1ParamList = {NBIOT_L1LIST_CONFIG_STRING,NULL,0};
paramlist_def_t NbIoT_ParamList = {NBIOT_RRCLIST_CONFIG_STRING,NULL,0}; paramlist_def_t NbIoT_ParamList = {NBIOT_RRCLIST_CONFIG_STRING,NULL,0};
config_getlist( &NbIoT_ParamList,NULL,0,NULL); config_getlist( &NbIoT_ParamList,NULL,0,NULL);
RC->nb_nb_iot_rrc_inst = NbIoT_ParamList.numelt; RC->nb_nb_iot_rrc_inst = NbIoT_ParamList.numelt;
config_getlist( &NbIoT_MACRLCParamList,NULL,0, NULL);
RC->nb_nb_iot_macrlc_inst = NbIoT_MACRLCParamList.numelt;
// Get num L1 instances
config_getlist( &NbIoT_L1ParamList,NULL,0, NULL);
config_getlist( &NbIoT_MACRLCParamList,NULL,0, NULL); RC->nb_nb_iot_L1_inst = NbIoT_L1ParamList.numelt;
RC->nb_nb_iot_macrlc_inst = NbIoT_MACRLCParamList.numelt;
// Get num L1 instances
config_getlist( &NbIoT_L1ParamList,NULL,0, NULL);
RC->nb_nb_iot_L1_inst = NbIoT_L1ParamList.numelt;
} }
+3 -1
View File
@@ -1909,7 +1909,7 @@ int RCconfig_S1(
default: { default: {
LOG_E(S1AP, "Default I-DRX value in conf file is invalid (%i). Should be 32, 64, 128 or 256. \ LOG_E(S1AP, "Default I-DRX value in conf file is invalid (%i). Should be 32, 64, 128 or 256. \
Default DRX set to 32 in MME configuration\n", Default DRX set to 32 in MME configuration\n",
ccparams_lte.pcch_defaultPagingCycle); ccparams_lte.pcch_defaultPagingCycle);
S1AP_REGISTER_ENB_REQ(msg_p).default_drx = 0; S1AP_REGISTER_ENB_REQ(msg_p).default_drx = 0;
} }
@@ -1927,7 +1927,9 @@ int RCconfig_S1(
if (strcmp(*(S1ParamList.paramarray[l][ENB_MME_IP_ADDRESS_PREFERENCE_IDX].strptr), "ipv4") == 0) { if (strcmp(*(S1ParamList.paramarray[l][ENB_MME_IP_ADDRESS_PREFERENCE_IDX].strptr), "ipv4") == 0) {
S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[l].ipv4 = 1; S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[l].ipv4 = 1;
S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[l].ipv6 = 0;
} else if (strcmp(*(S1ParamList.paramarray[l][ENB_MME_IP_ADDRESS_PREFERENCE_IDX].strptr), "ipv6") == 0) { } else if (strcmp(*(S1ParamList.paramarray[l][ENB_MME_IP_ADDRESS_PREFERENCE_IDX].strptr), "ipv6") == 0) {
S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[l].ipv4 = 0;
S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[l].ipv6 = 1; S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[l].ipv6 = 1;
} else if (strcmp(*(S1ParamList.paramarray[l][ENB_MME_IP_ADDRESS_PREFERENCE_IDX].strptr), "no") == 0) { } else if (strcmp(*(S1ParamList.paramarray[l][ENB_MME_IP_ADDRESS_PREFERENCE_IDX].strptr), "no") == 0) {
S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[l].ipv4 = 1; S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[l].ipv4 = 1;
File diff suppressed because it is too large Load Diff
+70 -80
View File
@@ -17,10 +17,10 @@
*------------------------------------------------------------------------------- *-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance: * For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org * contact@openairinterface.org
*/ */
/*! \file flexran_agent_timer.c /*! \file flexran_agent_timer.c
* \brief FlexRAN Timer * \brief FlexRAN Timer
* \author shahab SHARIAT BAGHERI * \author shahab SHARIAT BAGHERI
* \date 2017 * \date 2017
* \version 0.1 * \version 0.1
@@ -35,23 +35,23 @@
//struct flexran_agent_map agent_map; //struct flexran_agent_map agent_map;
flexran_agent_timer_instance_t timer_instance; flexran_agent_timer_instance_t timer_instance;
int agent_timer_init = 0; int agent_timer_init = 0;
err_code_t flexran_agent_init_timer(void){ err_code_t flexran_agent_init_timer(void) {
LOG_I(FLEXRAN_AGENT, "init RB tree\n"); LOG_I(FLEXRAN_AGENT, "init RB tree\n");
if (!agent_timer_init) { if (!agent_timer_init) {
RB_INIT(&timer_instance.flexran_agent_head); RB_INIT(&timer_instance.flexran_agent_head);
agent_timer_init = 1; agent_timer_init = 1;
} }
return PROTOCOL__FLEXRAN_ERR__NO_ERR; return PROTOCOL__FLEXRAN_ERR__NO_ERR;
} }
RB_GENERATE(flexran_agent_map, flexran_agent_timer_element_s, entry, flexran_agent_compare_timer); RB_GENERATE(flexran_agent_map, flexran_agent_timer_element_s, entry, flexran_agent_compare_timer);
/* The timer_id might not be the best choice for the comparison */ /* The timer_id might not be the best choice for the comparison */
int flexran_agent_compare_timer(struct flexran_agent_timer_element_s *a, struct flexran_agent_timer_element_s *b){ int flexran_agent_compare_timer(struct flexran_agent_timer_element_s *a, struct flexran_agent_timer_element_s *b) {
if (a->timer_id < b->timer_id) return -1; if (a->timer_id < b->timer_id) return -1;
if (a->timer_id > b->timer_id) return 1; if (a->timer_id > b->timer_id) return 1;
// equal timers // equal timers
@@ -59,52 +59,53 @@ int flexran_agent_compare_timer(struct flexran_agent_timer_element_s *a, struct
} }
err_code_t flexran_agent_create_timer(uint32_t interval_sec, err_code_t flexran_agent_create_timer(uint32_t interval_sec,
uint32_t interval_usec, uint32_t interval_usec,
agent_id_t agent_id, agent_id_t agent_id,
instance_t instance, instance_t instance,
uint32_t timer_type, uint32_t timer_type,
xid_t xid, xid_t xid,
flexran_agent_timer_callback_t cb, flexran_agent_timer_callback_t cb,
void* timer_args, void *timer_args,
long *timer_id){ long *timer_id) {
struct flexran_agent_timer_element_s *e = calloc(1, sizeof(*e)); struct flexran_agent_timer_element_s *e = calloc(1, sizeof(*e));
DevAssert(e != NULL); DevAssert(e != NULL);
//uint32_t timer_id;
//uint32_t timer_id;
int ret=-1; int ret=-1;
if ((interval_sec == 0) && (interval_usec == 0 )) if ((interval_sec == 0) && (interval_usec == 0 )) {
free(e);
return TIMER_NULL; return TIMER_NULL;
if (timer_type >= FLEXRAN_AGENT_TIMER_TYPE_MAX)
return TIMER_TYPE_INVALIDE;
if (timer_type == FLEXRAN_AGENT_TIMER_TYPE_ONESHOT){
ret = timer_setup(interval_sec,
interval_usec,
TASK_FLEXRAN_AGENT,
instance,
TIMER_ONE_SHOT,
timer_args,
timer_id);
e->type = TIMER_ONE_SHOT;
} }
else if (timer_type == FLEXRAN_AGENT_TIMER_TYPE_PERIODIC ){
ret = timer_setup(interval_sec, if (timer_type >= FLEXRAN_AGENT_TIMER_TYPE_MAX) {
interval_usec, free(e);
TASK_FLEXRAN_AGENT, return TIMER_TYPE_INVALIDE;
instance, }
TIMER_PERIODIC,
timer_args, if (timer_type == FLEXRAN_AGENT_TIMER_TYPE_ONESHOT) {
timer_id); ret = timer_setup(interval_sec,
interval_usec,
TASK_FLEXRAN_AGENT,
instance,
TIMER_ONE_SHOT,
timer_args,
timer_id);
e->type = TIMER_ONE_SHOT;
} else if (timer_type == FLEXRAN_AGENT_TIMER_TYPE_PERIODIC ) {
ret = timer_setup(interval_sec,
interval_usec,
TASK_FLEXRAN_AGENT,
instance,
TIMER_PERIODIC,
timer_args,
timer_id);
e->type = TIMER_PERIODIC; e->type = TIMER_PERIODIC;
} }
if (ret < 0 ) { if (ret < 0 ) {
return TIMER_SETUP_FAILED; free(e);
return TIMER_SETUP_FAILED;
} }
e->agent_id = agent_id; e->agent_id = agent_id;
@@ -112,19 +113,16 @@ err_code_t flexran_agent_create_timer(uint32_t interval_sec,
e->state = FLEXRAN_AGENT_TIMER_STATE_ACTIVE; e->state = FLEXRAN_AGENT_TIMER_STATE_ACTIVE;
e->timer_id = *timer_id; e->timer_id = *timer_id;
e->xid = xid; e->xid = xid;
e->timer_args = timer_args; e->timer_args = timer_args;
e->cb = cb; e->cb = cb;
/*element should be a real pointer*/ /*element should be a real pointer*/
RB_INSERT(flexran_agent_map, &timer_instance.flexran_agent_head, e); RB_INSERT(flexran_agent_map, &timer_instance.flexran_agent_head, e);
LOG_I(FLEXRAN_AGENT,"Created a new timer with id 0x%lx for agent %d, instance %d \n", LOG_I(FLEXRAN_AGENT,"Created a new timer with id 0x%lx for agent %d, instance %d \n",
e->timer_id, e->agent_id, e->instance); e->timer_id, e->agent_id, e->instance);
return 0;
return 0;
} }
err_code_t flexran_agent_destroy_timer(long timer_id){ err_code_t flexran_agent_destroy_timer(long timer_id) {
struct flexran_agent_timer_element_s *e = get_timer_entry(timer_id); struct flexran_agent_timer_element_s *e = get_timer_entry(timer_id);
if (e != NULL ) { if (e != NULL ) {
@@ -132,13 +130,12 @@ err_code_t flexran_agent_destroy_timer(long timer_id){
flexran_agent_destroy_flexran_message(e->timer_args->msg); flexran_agent_destroy_flexran_message(e->timer_args->msg);
free(e); free(e);
} }
if (timer_remove(timer_id) < 0 )
goto error;
return 0;
error: if (timer_remove(timer_id) < 0 )
goto error;
return 0;
error:
LOG_E(FLEXRAN_AGENT, "timer can't be removed\n"); LOG_E(FLEXRAN_AGENT, "timer can't be removed\n");
return TIMER_REMOVED_FAILED ; return TIMER_REMOVED_FAILED ;
} }
@@ -152,66 +149,59 @@ err_code_t flexran_agent_destroy_timer_by_task_id(xid_t xid) {
RB_REMOVE(flexran_agent_map, &timer_instance.flexran_agent_head, e); RB_REMOVE(flexran_agent_map, &timer_instance.flexran_agent_head, e);
flexran_agent_destroy_flexran_message(e->timer_args->msg); flexran_agent_destroy_flexran_message(e->timer_args->msg);
free(e); free(e);
if (timer_remove(timer_id) < 0 ) {
goto error; if (timer_remove(timer_id) < 0 ) {
goto error;
} }
} }
} }
return 0; return 0;
error:
error:
LOG_E(FLEXRAN_AGENT, "timer can't be removed\n"); LOG_E(FLEXRAN_AGENT, "timer can't be removed\n");
return TIMER_REMOVED_FAILED ; return TIMER_REMOVED_FAILED ;
} }
err_code_t flexran_agent_destroy_timers(void){ err_code_t flexran_agent_destroy_timers(void) {
struct flexran_agent_timer_element_s *e = NULL; struct flexran_agent_timer_element_s *e = NULL;
RB_FOREACH(e, flexran_agent_map, &timer_instance.flexran_agent_head) { RB_FOREACH(e, flexran_agent_map, &timer_instance.flexran_agent_head) {
RB_REMOVE(flexran_agent_map, &timer_instance.flexran_agent_head, e); RB_REMOVE(flexran_agent_map, &timer_instance.flexran_agent_head, e);
timer_remove(e->timer_id); timer_remove(e->timer_id);
flexran_agent_destroy_flexran_message(e->timer_args->msg); flexran_agent_destroy_flexran_message(e->timer_args->msg);
free(e); free(e);
} }
return 0; return 0;
} }
void flexran_agent_sleep_until(struct timespec *ts, int delay) { void flexran_agent_sleep_until(struct timespec *ts, int delay) {
ts->tv_nsec += delay; ts->tv_nsec += delay;
if(ts->tv_nsec >= 1000*1000*1000){
if(ts->tv_nsec >= 1000*1000*1000) {
ts->tv_nsec -= 1000*1000*1000; ts->tv_nsec -= 1000*1000*1000;
ts->tv_sec++; ts->tv_sec++;
} }
clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, ts, NULL); clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, ts, NULL);
} }
err_code_t flexran_agent_stop_timer(long timer_id){ err_code_t flexran_agent_stop_timer(long timer_id) {
struct flexran_agent_timer_element_s *e=NULL; struct flexran_agent_timer_element_s *e=NULL;
struct flexran_agent_timer_element_s search; struct flexran_agent_timer_element_s search;
memset(&search, 0, sizeof(struct flexran_agent_timer_element_s)); memset(&search, 0, sizeof(struct flexran_agent_timer_element_s));
search.timer_id = timer_id; search.timer_id = timer_id;
e = RB_FIND(flexran_agent_map, &timer_instance.flexran_agent_head, &search); e = RB_FIND(flexran_agent_map, &timer_instance.flexran_agent_head, &search);
if (e != NULL ) { if (e != NULL ) {
e->state = FLEXRAN_AGENT_TIMER_STATE_STOPPED; e->state = FLEXRAN_AGENT_TIMER_STATE_STOPPED;
} }
timer_remove(timer_id); timer_remove(timer_id);
return 0; return 0;
} }
struct flexran_agent_timer_element_s * get_timer_entry(long timer_id) { struct flexran_agent_timer_element_s *get_timer_entry(long timer_id) {
struct flexran_agent_timer_element_s search; struct flexran_agent_timer_element_s search;
memset(&search, 0, sizeof(struct flexran_agent_timer_element_s)); memset(&search, 0, sizeof(struct flexran_agent_timer_element_s));
search.timer_id = timer_id; search.timer_id = timer_id;
return RB_FIND(flexran_agent_map, &timer_instance.flexran_agent_head, &search);
return RB_FIND(flexran_agent_map, &timer_instance.flexran_agent_head, &search);
} }
+39 -40
View File
@@ -134,42 +134,37 @@ static const eutra_bandentry_t eutra_bandtable[] = {
{68, 6980, 7280, 7530, 7830, 67536} {68, 6980, 7280, 7530, 7830, 67536}
}; };
uint32_t to_earfcn(int eutra_bandP, uint32_t dl_CarrierFreq, uint32_t bw)
{
#define BANDTABLE_SIZE (sizeof(eutra_bandtable)/sizeof(eutra_bandentry_t))
uint32_t to_earfcn(int eutra_bandP, uint32_t dl_CarrierFreq, uint32_t bw) {
uint32_t dl_CarrierFreq_by_100k = dl_CarrierFreq / 100000; uint32_t dl_CarrierFreq_by_100k = dl_CarrierFreq / 100000;
int bw_by_100 = bw / 100; int bw_by_100 = bw / 100;
int i; int i;
AssertFatal(eutra_bandP < 69, "eutra_band %d > 68\n", eutra_bandP); AssertFatal(eutra_bandP < 69, "eutra_band %d > 68\n", eutra_bandP);
for (i = 0; i < 69 && eutra_bandtable[i].band != eutra_bandP; i++);
for (i = 0; i < BANDTABLE_SIZE && eutra_bandtable[i].band != eutra_bandP; i++);
AssertFatal(dl_CarrierFreq_by_100k >= eutra_bandtable[i].dl_min, AssertFatal(dl_CarrierFreq_by_100k >= eutra_bandtable[i].dl_min,
"Band %d, bw %u : DL carrier frequency %u Hz < %u\n", "Band %d, bw %u : DL carrier frequency %u Hz < %u\n",
eutra_bandP, bw, dl_CarrierFreq, eutra_bandP, bw, dl_CarrierFreq,
eutra_bandtable[i].dl_min); eutra_bandtable[i].dl_min);
AssertFatal(dl_CarrierFreq_by_100k <= AssertFatal(dl_CarrierFreq_by_100k <=
(eutra_bandtable[i].dl_max - bw_by_100), (eutra_bandtable[i].dl_max - bw_by_100),
"Band %d, bw %u: DL carrier frequency %u Hz > %d\n", "Band %d, bw %u: DL carrier frequency %u Hz > %d\n",
eutra_bandP, bw, dl_CarrierFreq, eutra_bandP, bw, dl_CarrierFreq,
eutra_bandtable[i].dl_max - bw_by_100); eutra_bandtable[i].dl_max - bw_by_100);
return (dl_CarrierFreq_by_100k - eutra_bandtable[i].dl_min + return (dl_CarrierFreq_by_100k - eutra_bandtable[i].dl_min +
(eutra_bandtable[i].N_OFFs_DL / 10)); (eutra_bandtable[i].N_OFFs_DL / 10));
} }
uint32_t to_earfcn_DL(int eutra_bandP, long long int dl_CarrierFreq, uint32_t bw) uint32_t to_earfcn_DL(int eutra_bandP, long long int dl_CarrierFreq, uint32_t bw) {
{
uint32_t dl_CarrierFreq_by_100k = dl_CarrierFreq / 100000; uint32_t dl_CarrierFreq_by_100k = dl_CarrierFreq / 100000;
int bw_by_100 = bw / 100; int bw_by_100 = bw / 100;
int i; int i;
AssertFatal(eutra_bandP < 69, "eutra_band %d > 68\n", eutra_bandP); AssertFatal(eutra_bandP < 69, "eutra_band %d > 68\n", eutra_bandP);
for (i = 0; i < 69 && eutra_bandtable[i].band != eutra_bandP; i++);
for (i = 0; i < BANDTABLE_SIZE && eutra_bandtable[i].band != eutra_bandP; i++);
AssertFatal(dl_CarrierFreq_by_100k >= eutra_bandtable[i].dl_min, AssertFatal(dl_CarrierFreq_by_100k >= eutra_bandtable[i].dl_min,
"Band %d, bw %u : DL carrier frequency %lld Hz < %u\n", "Band %d, bw %u : DL carrier frequency %lld Hz < %u\n",
@@ -180,22 +175,17 @@ uint32_t to_earfcn_DL(int eutra_bandP, long long int dl_CarrierFreq, uint32_t bw
"Band %d, bw %u : DL carrier frequency %lld Hz > %d\n", "Band %d, bw %u : DL carrier frequency %lld Hz > %d\n",
eutra_bandP, bw, dl_CarrierFreq, eutra_bandP, bw, dl_CarrierFreq,
eutra_bandtable[i].dl_max - bw_by_100); eutra_bandtable[i].dl_max - bw_by_100);
return (dl_CarrierFreq_by_100k - eutra_bandtable[i].dl_min + return (dl_CarrierFreq_by_100k - eutra_bandtable[i].dl_min +
(eutra_bandtable[i].N_OFFs_DL / 10)); (eutra_bandtable[i].N_OFFs_DL / 10));
} }
uint32_t to_earfcn_UL(int eutra_bandP, long long int ul_CarrierFreq, uint32_t bw) uint32_t to_earfcn_UL(int eutra_bandP, long long int ul_CarrierFreq, uint32_t bw) {
{
uint32_t ul_CarrierFreq_by_100k = ul_CarrierFreq / 100000; uint32_t ul_CarrierFreq_by_100k = ul_CarrierFreq / 100000;
int bw_by_100 = bw / 100; int bw_by_100 = bw / 100;
int i; int i;
AssertFatal(eutra_bandP < 69, "eutra_band %d > 68\n", eutra_bandP); AssertFatal(eutra_bandP < 69, "eutra_band %d > 68\n", eutra_bandP);
for (i = 0; i < 69 && eutra_bandtable[i].band != eutra_bandP; i++);
for (i = 0; i < BANDTABLE_SIZE && eutra_bandtable[i].band != eutra_bandP; i++);
AssertFatal(ul_CarrierFreq_by_100k >= eutra_bandtable[i].ul_min, AssertFatal(ul_CarrierFreq_by_100k >= eutra_bandtable[i].ul_min,
"Band %d, bw %u : UL carrier frequency %lld Hz < %u\n", "Band %d, bw %u : UL carrier frequency %lld Hz < %u\n",
@@ -206,30 +196,26 @@ uint32_t to_earfcn_UL(int eutra_bandP, long long int ul_CarrierFreq, uint32_t bw
"Band %d, bw %u : UL carrier frequency %lld Hz > %d\n", "Band %d, bw %u : UL carrier frequency %lld Hz > %d\n",
eutra_bandP, bw, ul_CarrierFreq, eutra_bandP, bw, ul_CarrierFreq,
eutra_bandtable[i].ul_max - bw_by_100); eutra_bandtable[i].ul_max - bw_by_100);
return (ul_CarrierFreq_by_100k - eutra_bandtable[i].ul_min + return (ul_CarrierFreq_by_100k - eutra_bandtable[i].ul_min +
((eutra_bandtable[i].N_OFFs_DL + 180000) / 10)); ((eutra_bandtable[i].N_OFFs_DL + 180000) / 10));
} }
uint32_t from_earfcn(int eutra_bandP, uint32_t dl_earfcn) uint32_t from_earfcn(int eutra_bandP, uint32_t dl_earfcn) {
{
int i; int i;
AssertFatal(eutra_bandP < 69, "eutra_band %d > 68\n", eutra_bandP); AssertFatal(eutra_bandP < 69, "eutra_band %d > 68\n", eutra_bandP);
for (i = 0; i < 69 && eutra_bandtable[i].band != eutra_bandP; i++);
for (i = 0; i < BANDTABLE_SIZE && eutra_bandtable[i].band != eutra_bandP; i++);
return (eutra_bandtable[i].dl_min + return (eutra_bandtable[i].dl_min +
(dl_earfcn - (eutra_bandtable[i].N_OFFs_DL / 10))) * 100000; (dl_earfcn - (eutra_bandtable[i].N_OFFs_DL / 10))) * 100000;
} }
int32_t get_uldl_offset(int eutra_bandP) int32_t get_uldl_offset(int eutra_bandP) {
{
int i; int i;
for (i = 0; i < 69 && eutra_bandtable[i].band != eutra_bandP; i++); for (i = 0; i < BANDTABLE_SIZE && eutra_bandtable[i].band != eutra_bandP; i++);
return (eutra_bandtable[i].dl_min - eutra_bandtable[i].ul_min); return (eutra_bandtable[i].dl_min - eutra_bandtable[i].ul_min);
} }
@@ -892,6 +878,19 @@ int rrc_mac_config_req_eNB(module_id_t Mod_idP,
} }
} // mib != NULL } // mib != NULL
if (mobilityControlInfo !=NULL){
if ((UE_id = add_new_ue(Mod_idP, CC_idP,
rntiP, -1
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
,
-1
#endif
)) == -1)
{
LOG_E(MAC, "%s:%d: fatal\n", __FILE__, __LINE__);
abort();
}
}
// SRB2_lchan_config->choice.explicitValue.ul_SpecificParameters->logicalChannelGroup // SRB2_lchan_config->choice.explicitValue.ul_SpecificParameters->logicalChannelGroup
if (logicalChannelConfig != NULL) { // check for eMTC specific things if (logicalChannelConfig != NULL) { // check for eMTC specific things
+3 -1
View File
@@ -374,7 +374,9 @@ rrc_mac_config_req_ue(module_id_t Mod_idP,
#endif #endif
if (measObj != NULL) { if (measObj != NULL) {
if (measObj[0] != NULL) { if (measObj[0] != NULL &&
measObj[0]->measObject.present == LTE_MeasObjectToAddMod__measObject_PR_measObjectEUTRA &&
measObj[0]->measObject.choice.measObjectEUTRA.cellsToAddModList != NULL) {
UE_mac_inst[Mod_idP].n_adj_cells = UE_mac_inst[Mod_idP].n_adj_cells =
measObj[0]->measObject.choice. measObj[0]->measObject.choice.
measObjectEUTRA.cellsToAddModList->list.count; measObjectEUTRA.cellsToAddModList->list.count;
+9 -9
View File
@@ -112,7 +112,7 @@ add_msg3(module_id_t module_idP, int CC_id, RA_t * ra, frame_t frameP,
nfapi_hi_dci0_request_body_t *hi_dci0_req_body; nfapi_hi_dci0_request_body_t *hi_dci0_req_body;
nfapi_hi_dci0_request_pdu_t *hi_dci0_pdu; nfapi_hi_dci0_request_pdu_t *hi_dci0_pdu;
uint8_t sf_ahead_dl; uint8_t sf_ahead_dl;
uint8_t rvseq[4] = { 0, 2, 3, 1 }; uint8_t rvseq[4] = {0, 2, 3, 1};
ul_req = &mac->UL_req_tmp[CC_id][ra->Msg3_subframe]; ul_req = &mac->UL_req_tmp[CC_id][ra->Msg3_subframe];
@@ -1536,14 +1536,14 @@ cancel_ra_proc(module_id_t module_idP, int CC_id, frame_t frameP,
module_idP, CC_id, frameP, rnti); module_idP, CC_id, frameP, rnti);
for (i = 0; i < NB_RA_PROC_MAX; i++) { for (i = 0; i < NB_RA_PROC_MAX; i++) {
if (rnti == ra[i].rnti) { if (rnti == ra[i].rnti) {
ra[i].state = IDLE; ra[i].state = IDLE;
ra[i].timing_offset = 0; ra[i].timing_offset = 0;
ra[i].RRC_timer = 20; ra[i].RRC_timer = 20;
ra[i].rnti = 0; ra[i].rnti = 0;
ra[i].msg3_round = 0; ra[i].msg3_round = 0;
LOG_I(MAC,"[eNB %d][RAPROC] CC_id %d Frame %d Canceled RA procedure for UE rnti %x\n", module_idP, CC_id, frameP, rnti); LOG_I(MAC,"[eNB %d][RAPROC] CC_id %d Frame %d Canceled RA procedure for UE rnti %x\n", module_idP, CC_id, frameP, rnti);
} }
} }
} }
+2 -2
View File
@@ -1017,7 +1017,7 @@ schedule_ue_spec_fairRR(module_id_t module_idP,
eNB_UE_stats->dlsch_mcs1 = cqi_to_mcs[ue_sched_ctl->dl_cqi[CC_id]]; eNB_UE_stats->dlsch_mcs1 = cqi_to_mcs[ue_sched_ctl->dl_cqi[CC_id]];
} }
eNB_UE_stats->dlsch_mcs1 = eNB_UE_stats->dlsch_mcs1; //cmin(eNB_UE_stats->dlsch_mcs1, openair_daq_vars.target_ue_dl_mcs); //eNB_UE_stats->dlsch_mcs1 = cmin(eNB_UE_stats->dlsch_mcs1, openair_daq_vars.target_ue_dl_mcs);
// store stats // store stats
//UE_list->eNB_UE_stats[CC_id][UE_id].dl_cqi= eNB_UE_stats->dl_cqi; //UE_list->eNB_UE_stats[CC_id][UE_id].dl_cqi= eNB_UE_stats->dl_cqi;
@@ -2591,7 +2591,7 @@ schedule_ulsch_fairRR(module_id_t module_idP, frame_t frameP,
frame_parms->prach_config_common.prach_ConfigInfo.prach_ConfigIndex, frame_parms->prach_config_common.prach_ConfigInfo.prach_ConfigIndex,
frame_parms->prach_config_common.prach_ConfigInfo.prach_FreqOffset, frame_parms->prach_config_common.prach_ConfigInfo.prach_FreqOffset,
0,//tdd_mapindex 0,//tdd_mapindex
frameP); //Nf frameP); //Nf --> shouldn't it be sched_frame ???
ulsch_ue_select[CC_id].list[ulsch_ue_select[CC_id].ue_num].nb_rb = 6; ulsch_ue_select[CC_id].list[ulsch_ue_select[CC_id].ue_num].nb_rb = 6;
ulsch_ue_select[CC_id].list[ulsch_ue_select[CC_id].ue_num].UE_id = -1; ulsch_ue_select[CC_id].list[ulsch_ue_select[CC_id].ue_num].UE_id = -1;
ulsch_ue_select[CC_id].ue_num++; ulsch_ue_select[CC_id].ue_num++;
+258 -289
View File
@@ -100,12 +100,8 @@ void reverse_index(int N,
int IncreaseValue, ThresholdValue; int IncreaseValue, ThresholdValue;
int sumV; int sumV;
int i; int i;
r = choose(N, M) - 1 - r;
r = choose(N, memset((void *) v, 0, M * sizeof(int));
M) - 1 - r;
memset((void *) v,
0,
M * sizeof(int));
sumV = 0; sumV = 0;
i = M; i = M;
@@ -586,27 +582,39 @@ is_UL_sf(COMMON_channels_t *ccP,
break; break;
case 3: case 3:
if (subframeP <= 1 || subframeP >= 5) if ((subframeP <= 1) || (subframeP >= 5))
return 0; return (0);
else if ((subframeP > 1) && (subframeP < 5))
return (1);
else
AssertFatal(1 == 0, "Unknown subframe number\n");
return 1; break;
case 4: case 4:
if (subframeP <= 1 || subframeP >= 4) if ((subframeP <= 1) || (subframeP >= 4))
return 0; return (0);
else if ((subframeP > 1) && (subframeP < 4))
return (1);
else
AssertFatal(1 == 0, "Unknown subframe number\n");
return 1; break;
case 5: case 5:
if (subframeP <= 1 || subframeP >= 3) if ((subframeP <= 1) || (subframeP >= 3))
return 0; return (0);
else if ((subframeP > 1) && (subframeP < 3))
return (1);
else
AssertFatal(1 == 0, "Unknown subframe number\n");
return 1; break;
default: default:
AssertFatal(1 == 0, "subframe %d Unsupported TDD configuration %d\n", AssertFatal(1 == 0,
subframeP, "subframe %d Unsupported TDD configuration %d\n",
(int) ccP->tdd_Config->subframeAssignment); subframeP, (int) ccP->tdd_Config->subframeAssignment);
break; break;
} }
return 0; return 0;
@@ -760,10 +768,8 @@ get_pucch1_absSF(COMMON_channels_t *cc,
tdd_Config->subframeAssignment); tdd_Config->subframeAssignment);
return 0; return 0;
} }
AssertFatal(1 == 0, "Impossible dlsch subframe %d for TDD configuration %ld\n",
sf, AssertFatal(1 == 0, "Shouldn't get here\n");
tdd_Config->subframeAssignment);
return 0;
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
@@ -843,11 +849,11 @@ get_csi_params(COMMON_channels_t *cc,
int *H) int *H)
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
{ {
AssertFatal(cqi_ReportPeriodic != NULL, "cqi_ReportPeriodic is null!\n");
uint16_t cqi_PMI_ConfigIndex = cqi_ReportPeriodic->choice.setup.cqi_pmi_ConfigIndex; uint16_t cqi_PMI_ConfigIndex = cqi_ReportPeriodic->choice.setup.cqi_pmi_ConfigIndex;
uint8_t Jtab[6] = { 0, 2, 2, 3, 4, 4 }; uint8_t Jtab[6] = { 0, 2, 2, 3, 4, 4 };
AssertFatal(cqi_ReportPeriodic != NULL, "cqi_ReportPeriodic is null!\n");
if (cc->tdd_Config == NULL) { //FDD if (cc->tdd_Config == NULL) { //FDD
if (cqi_PMI_ConfigIndex <= 1) { // 2 ms CQI_PMI period if (cqi_PMI_ConfigIndex <= 1) { // 2 ms CQI_PMI period
*Npd = 2; *Npd = 2;
@@ -921,8 +927,7 @@ uint8_t
get_dl_cqi_pmi_size_pusch(COMMON_channels_t *cc, get_dl_cqi_pmi_size_pusch(COMMON_channels_t *cc,
uint8_t tmode, uint8_t tmode,
uint8_t ri, uint8_t ri,
LTE_CQI_ReportModeAperiodic_t * LTE_CQI_ReportModeAperiodic_t *cqi_ReportModeAperiodic)
cqi_ReportModeAperiodic)
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
{ {
int Ntab[6] = { 0, 4, 7, 9, 10, 13 }; int Ntab[6] = { 0, 4, 7, 9, 10, 13 };
@@ -1109,9 +1114,8 @@ fill_nfapi_dl_dci_1A(nfapi_dl_config_request_pdu_t *dl_config_pdu,
uint8_t vrb_flag) uint8_t vrb_flag)
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
{ {
memset((void *) dl_config_pdu, memset((void *) dl_config_pdu, 0,sizeof(nfapi_dl_config_request_pdu_t));
0,
sizeof(nfapi_dl_config_request_pdu_t));
dl_config_pdu->pdu_type = NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE; dl_config_pdu->pdu_type = NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE;
dl_config_pdu->pdu_size = (uint8_t) (2 + sizeof(nfapi_dl_config_dci_dl_pdu)); dl_config_pdu->pdu_size = (uint8_t) (2 + sizeof(nfapi_dl_config_dci_dl_pdu));
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.tl.tag = NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL8_TAG; dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.tl.tag = NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL8_TAG;
@@ -1149,7 +1153,6 @@ program_dlsch_acknak(module_id_t module_idP,
int use_simultaneous_pucch_pusch = 0; int use_simultaneous_pucch_pusch = 0;
nfapi_ul_config_ulsch_harq_information *ulsch_harq_information = NULL; nfapi_ul_config_ulsch_harq_information *ulsch_harq_information = NULL;
nfapi_ul_config_harq_information *harq_information = NULL; nfapi_ul_config_harq_information *harq_information = NULL;
#if (LTE_RRC_VERSION >= MAKE_VERSION(10, 2, 0)) #if (LTE_RRC_VERSION >= MAKE_VERSION(10, 2, 0))
struct LTE_PhysicalConfigDedicated__ext2 *ext2 = UE_list->UE_template[CC_idP][UE_idP].physicalConfigDedicated->ext2; struct LTE_PhysicalConfigDedicated__ext2 *ext2 = UE_list->UE_template[CC_idP][UE_idP].physicalConfigDedicated->ext2;
if (ext2 && if (ext2 &&
@@ -1157,8 +1160,8 @@ program_dlsch_acknak(module_id_t module_idP,
ext2->pucch_ConfigDedicated_v1020->simultaneousPUCCH_PUSCH_r10 && ext2->pucch_ConfigDedicated_v1020->simultaneousPUCCH_PUSCH_r10 &&
*ext2->pucch_ConfigDedicated_v1020->simultaneousPUCCH_PUSCH_r10 == LTE_PUCCH_ConfigDedicated_v1020__simultaneousPUCCH_PUSCH_r10_true) *ext2->pucch_ConfigDedicated_v1020->simultaneousPUCCH_PUSCH_r10 == LTE_PUCCH_ConfigDedicated_v1020__simultaneousPUCCH_PUSCH_r10_true)
use_simultaneous_pucch_pusch = 1; use_simultaneous_pucch_pusch = 1;
#endif
#endif
// pucch1 and pusch feedback is similar, namely in n+k subframes from now // pucch1 and pusch feedback is similar, namely in n+k subframes from now
// This is used in the following "if/else" condition to check if there isn't or is already an UL grant in n+k // This is used in the following "if/else" condition to check if there isn't or is already an UL grant in n+k
int16_t ul_absSF = get_pucch1_absSF(&cc[CC_idP], int16_t ul_absSF = get_pucch1_absSF(&cc[CC_idP],
@@ -1433,8 +1436,7 @@ getNp(int dl_Bandwidth,
uint8_t plus1) uint8_t plus1)
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
{ {
AssertFatal(dl_Bandwidth<6,"dl_Bandwidth %d>5\n", AssertFatal(dl_Bandwidth < 6, "dl_Bandwidth %d>5\n", dl_Bandwidth);
dl_Bandwidth);
if (nCCE >= Np[dl_Bandwidth][2]) { if (nCCE >= Np[dl_Bandwidth][2]) {
return(Np[dl_Bandwidth][2+plus1]); return(Np[dl_Bandwidth][2+plus1]);
@@ -1463,7 +1465,6 @@ fill_nfapi_harq_information(module_id_t module_idP,
AssertFatal(UE_id >= 0, "UE_id cannot be found, impossible\n"); AssertFatal(UE_id >= 0, "UE_id cannot be found, impossible\n");
AssertFatal(UE_list != NULL, "UE_list is null\n"); AssertFatal(UE_list != NULL, "UE_list is null\n");
harq_information->harq_information_rel11.tl.tag = NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL11_TAG; harq_information->harq_information_rel11.tl.tag = NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL11_TAG;
harq_information->harq_information_rel11.num_ant_ports = 1; harq_information->harq_information_rel11.num_ant_ports = 1;
@@ -1548,14 +1549,12 @@ fill_nfapi_uci_acknak(module_id_t module_idP,
nfapi_ul_config_request_t *ul_req = &eNB->UL_req_tmp[CC_idP][ackNAK_absSF % 10]; nfapi_ul_config_request_t *ul_req = &eNB->UL_req_tmp[CC_idP][ackNAK_absSF % 10];
nfapi_ul_config_request_body_t *ul_req_body = &ul_req->ul_config_request_body; nfapi_ul_config_request_body_t *ul_req_body = &ul_req->ul_config_request_body;
nfapi_ul_config_request_pdu_t *ul_config_pdu = &ul_req_body->ul_config_pdu_list[ul_req_body->number_of_pdus]; nfapi_ul_config_request_pdu_t *ul_config_pdu = &ul_req_body->ul_config_pdu_list[ul_req_body->number_of_pdus];
memset((void *) ul_config_pdu, 0, sizeof(nfapi_ul_config_request_pdu_t));
memset((void *) ul_config_pdu,
0,
sizeof(nfapi_ul_config_request_pdu_t));
ul_config_pdu->pdu_type = NFAPI_UL_CONFIG_UCI_HARQ_PDU_TYPE; ul_config_pdu->pdu_type = NFAPI_UL_CONFIG_UCI_HARQ_PDU_TYPE;
ul_config_pdu->pdu_size = (uint8_t) (2 + sizeof(nfapi_ul_config_uci_harq_pdu)); ul_config_pdu->pdu_size = (uint8_t) (2 + sizeof(nfapi_ul_config_uci_harq_pdu));
ul_config_pdu->uci_harq_pdu.ue_information.ue_information_rel8.tl.tag = NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL8_TAG; ul_config_pdu->uci_harq_pdu.ue_information.ue_information_rel8.tl.tag = NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL8_TAG;
ul_config_pdu->uci_harq_pdu.ue_information.ue_information_rel8.handle = 0; // don't know how to use this ul_config_pdu->uci_harq_pdu.ue_information.ue_information_rel8.handle = 0; // don't know how to use this
ul_config_pdu->uci_harq_pdu.ue_information.ue_information_rel8.rnti = rntiP; ul_config_pdu->uci_harq_pdu.ue_information.ue_information_rel8.rnti = rntiP;
fill_nfapi_harq_information(module_idP, fill_nfapi_harq_information(module_idP,
@@ -1576,7 +1575,6 @@ fill_nfapi_uci_acknak(module_id_t module_idP,
ul_req_body->tl.tag = NFAPI_UL_CONFIG_REQUEST_BODY_TAG; ul_req_body->tl.tag = NFAPI_UL_CONFIG_REQUEST_BODY_TAG;
ul_req->header.message_id = NFAPI_UL_CONFIG_REQUEST; ul_req->header.message_id = NFAPI_UL_CONFIG_REQUEST;
ul_req->sfn_sf = (ackNAK_absSF/10) << 4 | ackNAK_absSF%10; ul_req->sfn_sf = (ackNAK_absSF/10) << 4 | ackNAK_absSF%10;
return (((ackNAK_absSF / 10) << 4) + (ackNAK_absSF % 10)); return (((ackNAK_absSF / 10) << 4) + (ackNAK_absSF % 10));
} }
@@ -1610,9 +1608,7 @@ fill_nfapi_dlsch_config(eNB_MAC_INST *eNB,
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
{ {
nfapi_dl_config_request_pdu_t *dl_config_pdu = &dl_req->dl_config_pdu_list[dl_req->number_pdu]; nfapi_dl_config_request_pdu_t *dl_config_pdu = &dl_req->dl_config_pdu_list[dl_req->number_pdu];
memset((void *) dl_config_pdu, memset((void *) dl_config_pdu, 0, sizeof(nfapi_dl_config_request_pdu_t));
0,
sizeof(nfapi_dl_config_request_pdu_t));
dl_config_pdu->pdu_type = NFAPI_DL_CONFIG_DLSCH_PDU_TYPE; dl_config_pdu->pdu_type = NFAPI_DL_CONFIG_DLSCH_PDU_TYPE;
dl_config_pdu->pdu_size = (uint8_t) (2 + sizeof(nfapi_dl_config_dlsch_pdu)); dl_config_pdu->pdu_size = (uint8_t) (2 + sizeof(nfapi_dl_config_dlsch_pdu));
@@ -1654,9 +1650,11 @@ fill_nfapi_tx_req(nfapi_tx_request_body_t *tx_req_body,
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
{ {
nfapi_tx_request_pdu_t *TX_req = &tx_req_body->tx_pdu_list[tx_req_body->number_of_pdus]; nfapi_tx_request_pdu_t *TX_req = &tx_req_body->tx_pdu_list[tx_req_body->number_of_pdus];
LOG_D(MAC, "Filling TX_req %d for pdu length %d\n", LOG_D(MAC, "Filling TX_req %d for pdu length %d\n",
tx_req_body->number_of_pdus, tx_req_body->number_of_pdus,
pdu_length); pdu_length);
TX_req->pdu_length = pdu_length; TX_req->pdu_length = pdu_length;
TX_req->pdu_index = pdu_index; TX_req->pdu_index = pdu_index;
TX_req->num_segments = 1; TX_req->num_segments = 1;
@@ -1689,11 +1687,10 @@ fill_nfapi_ulsch_config_request_rel8(nfapi_ul_config_request_pdu_t *ul_config_pd
uint8_t current_tx_nb, uint8_t current_tx_nb,
uint8_t n_srs, uint8_t n_srs,
uint16_t size) uint16_t size)
//------------------------------------------------------------------------------
{ {
memset((void *) ul_config_pdu, uint8_t ri_size = 0;
0,
sizeof(nfapi_ul_config_request_pdu_t)); memset((void *) ul_config_pdu, 0, sizeof(nfapi_ul_config_request_pdu_t));
ul_config_pdu->pdu_type = NFAPI_UL_CONFIG_ULSCH_PDU_TYPE; ul_config_pdu->pdu_type = NFAPI_UL_CONFIG_ULSCH_PDU_TYPE;
ul_config_pdu->pdu_size = (uint8_t) (2 + sizeof(nfapi_ul_config_ulsch_pdu)); ul_config_pdu->pdu_size = (uint8_t) (2 + sizeof(nfapi_ul_config_ulsch_pdu));
ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8.tl.tag = NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL8_TAG; ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8.tl.tag = NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL8_TAG;
@@ -1728,10 +1725,10 @@ fill_nfapi_ulsch_config_request_rel8(nfapi_ul_config_request_pdu_t *ul_config_pd
LOG_D(MAC, "report_type %d\n", LOG_D(MAC, "report_type %d\n",
ul_config_pdu->ulsch_cqi_ri_pdu.cqi_ri_information.cqi_ri_information_rel9.report_type); ul_config_pdu->ulsch_cqi_ri_pdu.cqi_ri_information.cqi_ri_information_rel9.report_type);
if (cc->p_eNB <= 2 && (tmode == 3 || tmode == 4 || tmode == 8 || tmode == 9 || tmode == 10)) if (cc->p_eNB <= 2 && (tmode == 3 || tmode == 4 || tmode == 8 || tmode == 9 || tmode == 10)) ri_size = 1;
ul_config_pdu->ulsch_cqi_ri_pdu.cqi_ri_information.cqi_ri_information_rel9.aperiodic_cqi_pmi_ri_report.cc[0].ri_size = 1; else if (cc->p_eNB <= 2) ri_size = 0;
else if (cc->p_eNB <= 2) ul_config_pdu->ulsch_cqi_ri_pdu.cqi_ri_information.cqi_ri_information_rel9.aperiodic_cqi_pmi_ri_report.cc[0].ri_size = 0; else if (cc->p_eNB == 4) ri_size = 2;
else if (cc->p_eNB == 4) ul_config_pdu->ulsch_cqi_ri_pdu.cqi_ri_information.cqi_ri_information_rel9.aperiodic_cqi_pmi_ri_report.cc[0].ri_size = 2; ul_config_pdu->ulsch_cqi_ri_pdu.cqi_ri_information.cqi_ri_information_rel9.aperiodic_cqi_pmi_ri_report.cc[0].ri_size = ri_size;
AssertFatal(physicalConfigDedicated->cqi_ReportConfig != NULL,"physicalConfigDedicated->cqi_ReportConfig is null!\n"); AssertFatal(physicalConfigDedicated->cqi_ReportConfig != NULL,"physicalConfigDedicated->cqi_ReportConfig is null!\n");
AssertFatal(physicalConfigDedicated->cqi_ReportConfig->cqi_ReportModeAperiodic != NULL,"physicalConfigDedicated->cqi_ReportModeAperiodic is null!\n"); AssertFatal(physicalConfigDedicated->cqi_ReportConfig->cqi_ReportModeAperiodic != NULL,"physicalConfigDedicated->cqi_ReportModeAperiodic is null!\n");
@@ -2084,6 +2081,7 @@ get_aggregation(uint8_t bw_index,
cqi, cqi,
bw_index, bw_index,
dci_fmt); dci_fmt);
return 1 << aggregation; return 1 << aggregation;
} }
@@ -2133,17 +2131,16 @@ add_new_ue(module_id_t mod_idP,
rntiP, rntiP,
UE_list->avail, UE_list->avail,
UE_list->num_UEs); UE_list->num_UEs);
dump_ue_list(UE_list,
0); dump_ue_list(UE_list, 0);
for (i = 0; i < MAX_MOBILES_PER_ENB; i++) { for (i = 0; i < MAX_MOBILES_PER_ENB; i++) {
if (UE_list->active[i] == TRUE) if (UE_list->active[i] == TRUE)
continue; continue;
UE_id = i; UE_id = i;
memset(&UE_list->UE_template[cc_idP][UE_id], memset(&UE_list->UE_template[cc_idP][UE_id], 0, sizeof(UE_TEMPLATE));
0,
sizeof(UE_TEMPLATE));
UE_list->UE_template[cc_idP][UE_id].rnti = rntiP; UE_list->UE_template[cc_idP][UE_id].rnti = rntiP;
UE_list->UE_template[cc_idP][UE_id].configured = FALSE; UE_list->UE_template[cc_idP][UE_id].configured = FALSE;
UE_list->numactiveCCs[UE_id] = 1; UE_list->numactiveCCs[UE_id] = 1;
@@ -2157,7 +2154,6 @@ add_new_ue(module_id_t mod_idP,
#if defined(USRP_REC_PLAY) // not specific to record/playback ? #if defined(USRP_REC_PLAY) // not specific to record/playback ?
UE_list->UE_template[cc_idP][UE_id].pre_assigned_mcs_ul = 0; UE_list->UE_template[cc_idP][UE_id].pre_assigned_mcs_ul = 0;
#endif #endif
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0)) #if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
UE_list->UE_template[cc_idP][UE_id].rach_resource_type = rach_resource_type; UE_list->UE_template[cc_idP][UE_id].rach_resource_type = rach_resource_type;
#endif #endif
@@ -2498,10 +2494,7 @@ UE_is_to_be_scheduled(module_id_t module_idP,
UE_sched_ctrl *UE_sched_ctl = &RC.mac[module_idP]->UE_list.UE_sched_ctrl[UE_id]; UE_sched_ctrl *UE_sched_ctl = &RC.mac[module_idP]->UE_list.UE_sched_ctrl[UE_id];
// do not schedule UE if UL is not working // do not schedule UE if UL is not working
if (UE_sched_ctl->ul_failure_timer > 0) if (UE_sched_ctl->ul_failure_timer > 0 || UE_sched_ctl->ul_out_of_sync > 0)
return 0;
if (UE_sched_ctl->ul_out_of_sync > 0)
return 0; return 0;
rnti_t ue_rnti = UE_RNTI(module_idP, rnti_t ue_rnti = UE_RNTI(module_idP,
@@ -2889,18 +2882,21 @@ get_nb_subband(int N_RB_DL)
return nb_sb; return nb_sb;
} }
/*
//------------------------------------------------------------------------------
void void
init_CCE_table(int module_idP, init_CCE_table(int module_idP,
int CC_idP) int CC_idP)
//------------------------------------------------------------------------------
{ {
memset(RC.mac[module_idP]->CCE_table[CC_idP], memset(RC.mac[module_idP]->CCE_table[CC_idP],
0, 0,
800 * sizeof(int)); 800 * sizeof(int));
} }
*/
void
init_CCE_table(int *CCE_table)
{
memset(CCE_table, 0, 800 * sizeof(int));
}
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
int int
@@ -3022,8 +3018,7 @@ dump_CCE_table(int *CCE_table,
printf("CCE 0: "); printf("CCE 0: ");
for (i = 0; i < nCCE; i++) { for (i = 0; i < nCCE; i++) {
printf("%1d.", printf("%1d.", CCE_table[i]);
CCE_table[i]);
if ((i & 7) == 7) if ((i & 7) == 7)
printf("\n CCE %d: ", printf("\n CCE %d: ",
@@ -3206,25 +3201,21 @@ allocate_CCEs(int module_idP,
int test_onlyP) int test_onlyP)
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
{ {
int *CCE_table = RC.mac[module_idP]->CCE_table[CC_idP]; eNB_MAC_INST *eNB = RC.mac[module_idP];
nfapi_dl_config_request_body_t *DL_req = int *CCE_table = eNB->CCE_table[CC_idP];
&RC.mac[module_idP]->DL_req[CC_idP].dl_config_request_body; nfapi_dl_config_request_body_t *DL_req = &eNB->DL_req[CC_idP].dl_config_request_body;
nfapi_hi_dci0_request_body_t *HI_DCI0_req = nfapi_hi_dci0_request_body_t *HI_DCI0_req = &eNB->HI_DCI0_req[CC_idP][subframeP].hi_dci0_request_body;
&RC.mac[module_idP]->HI_DCI0_req[CC_idP][subframeP].hi_dci0_request_body; nfapi_dl_config_request_pdu_t *dl_config_pdu = &DL_req->dl_config_pdu_list[0];
nfapi_dl_config_request_pdu_t *dl_config_pdu = nfapi_hi_dci0_request_pdu_t *hi_dci0_pdu = &HI_DCI0_req->hi_dci0_pdu_list[0];
&DL_req->dl_config_pdu_list[0]; COMMON_channels_t *cc = &eNB->common_channels[CC_idP];
nfapi_hi_dci0_request_pdu_t *hi_dci0_pdu = int nCCE_max = get_nCCE_max(cc, 1, subframeP);
&HI_DCI0_req->hi_dci0_pdu_list[0];
int nCCE_max =
get_nCCE_max(&RC.mac[module_idP]->common_channels[CC_idP], 1,
subframeP);
int fCCE; int fCCE;
int i, j, idci; int i, j, idci;
int nCCE = 0; int nCCE = 0;
int max_symbol; int max_symbol;
eNB_MAC_INST *eNB = RC.mac[module_idP];
COMMON_channels_t *cc = &eNB->common_channels[CC_idP];
int ackNAK_absSF = get_pucch1_absSF(cc, (frameP*10+subframeP)); int ackNAK_absSF = get_pucch1_absSF(cc, (frameP*10+subframeP));
nfapi_dl_config_request_pdu_t *dl_config_pduLoop;
nfapi_hi_dci0_request_pdu_t *hi_dci0_pduLoop;
if (cc->tdd_Config!=NULL && is_S_sf(cc,subframeP) > 0) if (cc->tdd_Config!=NULL && is_S_sf(cc,subframeP) > 0)
max_symbol = 2; max_symbol = 2;
@@ -3232,110 +3223,95 @@ allocate_CCEs(int module_idP,
max_symbol = 3; max_symbol = 3;
nfapi_ul_config_request_body_t *ul_req = &eNB->UL_req_tmp[CC_idP][ackNAK_absSF % 10].ul_config_request_body; nfapi_ul_config_request_body_t *ul_req = &eNB->UL_req_tmp[CC_idP][ackNAK_absSF % 10].ul_config_request_body;
LOG_D(MAC, LOG_D(MAC, "Allocate CCEs subframe %d, test %d : (DL PDU %d, DL DCI %d, UL %d)\n",
"Allocate CCEs subframe %d, test %d : (DL PDU %d, DL DCI %d, UL %d)\n", subframeP,
subframeP, test_onlyP, DL_req->number_pdu, DL_req->number_dci, test_onlyP,
DL_req->number_pdu,
DL_req->number_dci,
HI_DCI0_req->number_of_dci); HI_DCI0_req->number_of_dci);
DL_req->number_pdcch_ofdm_symbols = 1; DL_req->number_pdcch_ofdm_symbols = 1;
try_again: try_again:
init_CCE_table(module_idP, CC_idP);
init_CCE_table(CCE_table);
nCCE = 0; nCCE = 0;
for (i = 0, idci = 0; i < DL_req->number_pdu; i++) { for (i = 0, idci = 0; i < DL_req->number_pdu; i++) {
dl_config_pduLoop = &dl_config_pdu[i];
// allocate DL common DCIs first // allocate DL common DCIs first
if ((dl_config_pdu[i].pdu_type == NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE) if (dl_config_pduLoop->pdu_type == NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE &&
&& (dl_config_pdu[i].dci_dl_pdu.dci_dl_pdu_rel8.rnti_type == dl_config_pduLoop->dci_dl_pdu.dci_dl_pdu_rel8.rnti_type == 2) {
2)) { LOG_D(MAC, "Trying to allocate COMMON DCI %d/%d (%d,%d) : rnti %x, aggreg %d nCCE %d / %d (num_pdcch_symbols %d)\n",
LOG_D(MAC, idci,
"Trying to allocate COMMON DCI %d/%d (%d,%d) : rnti %x, aggreg %d nCCE %d / %d (num_pdcch_symbols %d)\n", DL_req->number_dci + HI_DCI0_req->number_of_dci,
idci, DL_req->number_dci + HI_DCI0_req->number_of_dci, DL_req->number_dci,
DL_req->number_dci, HI_DCI0_req->number_of_dci, HI_DCI0_req->number_of_dci,
dl_config_pdu[i].dci_dl_pdu.dci_dl_pdu_rel8.rnti, dl_config_pduLoop->dci_dl_pdu.dci_dl_pdu_rel8.rnti,
dl_config_pdu[i].dci_dl_pdu. dl_config_pduLoop->dci_dl_pdu.dci_dl_pdu_rel8.aggregation_level,
dci_dl_pdu_rel8.aggregation_level, nCCE, nCCE_max, nCCE,
nCCE_max,
DL_req->number_pdcch_ofdm_symbols); DL_req->number_pdcch_ofdm_symbols);
if (nCCE + if (nCCE + (dl_config_pduLoop->dci_dl_pdu.dci_dl_pdu_rel8.aggregation_level) > nCCE_max) {
(dl_config_pdu[i].dci_dl_pdu.
dci_dl_pdu_rel8.aggregation_level) > nCCE_max) {
if (DL_req->number_pdcch_ofdm_symbols == max_symbol) if (DL_req->number_pdcch_ofdm_symbols == max_symbol)
goto failed; return -1;
LOG_D(MAC, LOG_D(MAC, "Can't fit DCI allocations with %d PDCCH symbols, increasing by 1\n",
"Can't fit DCI allocations with %d PDCCH symbols, increasing by 1\n",
DL_req->number_pdcch_ofdm_symbols); DL_req->number_pdcch_ofdm_symbols);
DL_req->number_pdcch_ofdm_symbols++; DL_req->number_pdcch_ofdm_symbols++;
nCCE_max = nCCE_max = get_nCCE_max(cc, DL_req->number_pdcch_ofdm_symbols, subframeP);
get_nCCE_max(&RC.mac[module_idP]->
common_channels[CC_idP],
DL_req->number_pdcch_ofdm_symbols,
subframeP);
goto try_again; goto try_again;
} }
// number of CCEs left can potentially hold this allocation // number of CCEs left can potentially hold this allocation
fCCE = get_nCCE_offset(CCE_table, fCCE = get_nCCE_offset(CCE_table,
dl_config_pdu[i]. dl_config_pduLoop->dci_dl_pdu.dci_dl_pdu_rel8.aggregation_level,
dci_dl_pdu.dci_dl_pdu_rel8. nCCE_max,
aggregation_level, nCCE_max, 1, 1,
dl_config_pdu[i]. dl_config_pduLoop->dci_dl_pdu.dci_dl_pdu_rel8.rnti,
dci_dl_pdu.dci_dl_pdu_rel8.rnti,
subframeP); subframeP);
if (fCCE == -1) { if (fCCE == -1) {
if (DL_req->number_pdcch_ofdm_symbols == max_symbol) { if (DL_req->number_pdcch_ofdm_symbols == max_symbol) {
LOG_D(MAC, LOG_D(MAC, "subframe %d: Dropping Allocation for RNTI %x\n",
"subframe %d: Dropping Allocation for RNTI %x\n", subframeP,
subframeP, dl_config_pduLoop->dci_dl_pdu.dci_dl_pdu_rel8.rnti);
dl_config_pdu[i].dci_dl_pdu.dci_dl_pdu_rel8.
rnti);
for (j = 0; j <= i; j++) { for (j = 0; j <= i; j++) {
if (dl_config_pdu[j].pdu_type == dl_config_pduLoop = &dl_config_pdu[j];
NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE) if (dl_config_pduLoop->pdu_type == NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE)
LOG_D(MAC, LOG_D(MAC, "DCI %d/%d (%d,%d) : rnti %x dci format %d, aggreg %d nCCE %d / %d (num_pdcch_symbols %d)\n",
"DCI %d/%d (%d,%d) : rnti %x dci format %d, aggreg %d nCCE %d / %d (num_pdcch_symbols %d)\n",
j, j,
DL_req->number_dci + DL_req->number_dci + HI_DCI0_req->number_of_dci,
HI_DCI0_req->number_of_dci,
DL_req->number_dci, DL_req->number_dci,
HI_DCI0_req->number_of_dci, HI_DCI0_req->number_of_dci,
dl_config_pdu[j]. dl_config_pduLoop->dci_dl_pdu.dci_dl_pdu_rel8.rnti,
dci_dl_pdu.dci_dl_pdu_rel8.rnti, dl_config_pduLoop->dci_dl_pdu.dci_dl_pdu_rel8.dci_format,
dl_config_pdu[j]. dl_config_pduLoop->dci_dl_pdu.dci_dl_pdu_rel8.aggregation_level,
dci_dl_pdu.dci_dl_pdu_rel8.dci_format, nCCE, nCCE_max, DL_req->number_pdcch_ofdm_symbols);
dl_config_pdu[j].
dci_dl_pdu.dci_dl_pdu_rel8.
aggregation_level, nCCE, nCCE_max,
DL_req->number_pdcch_ofdm_symbols);
} }
//dump_CCE_table(CCE_table,nCCE_max,subframeP,dci_alloc->rnti,1<<dci_alloc->L); //dump_CCE_table(CCE_table,nCCE_max,subframeP,dci_alloc->rnti,1<<dci_alloc->L);
goto failed; return -1;
} }
LOG_D(MAC, LOG_D(MAC, "Can't fit DCI allocations with %d PDCCH symbols (rnti condition), increasing by 1\n",
"Can't fit DCI allocations with %d PDCCH symbols (rnti condition), increasing by 1\n",
DL_req->number_pdcch_ofdm_symbols); DL_req->number_pdcch_ofdm_symbols);
DL_req->number_pdcch_ofdm_symbols++; DL_req->number_pdcch_ofdm_symbols++;
nCCE_max = get_nCCE_max(&RC.mac[module_idP]-> nCCE_max = get_nCCE_max(cc, DL_req->number_pdcch_ofdm_symbols, subframeP);
common_channels[CC_idP],
DL_req->number_pdcch_ofdm_symbols,
subframeP);
goto try_again; goto try_again;
} // fCCE==-1 } // fCCE==-1
// the allocation is feasible, rnti rule passes // the allocation is feasible, rnti rule passes
nCCE += dl_config_pdu[i].dci_dl_pdu.dci_dl_pdu_rel8.aggregation_level; nCCE += dl_config_pduLoop->dci_dl_pdu.dci_dl_pdu_rel8.aggregation_level;
LOG_D(MAC, "Allocating at nCCE %d\n", fCCE); LOG_D(MAC, "Allocating at nCCE %d\n", fCCE);
if ((test_onlyP%2) == 0) { if ((test_onlyP%2) == 0) {
dl_config_pdu[i].dci_dl_pdu.dci_dl_pdu_rel8.cce_idx = fCCE; dl_config_pduLoop->dci_dl_pdu.dci_dl_pdu_rel8.cce_idx = fCCE;
LOG_D(MAC, LOG_D(MAC, "Allocate COMMON DCI CCEs subframe %d, test %d => L %d fCCE %d\n",
"Allocate COMMON DCI CCEs subframe %d, test %d => L %d fCCE %d\n", subframeP,
subframeP, test_onlyP, test_onlyP,
dl_config_pdu[i].dci_dl_pdu. dl_config_pduLoop->dci_dl_pdu.dci_dl_pdu_rel8.aggregation_level,
dci_dl_pdu_rel8.aggregation_level, fCCE); fCCE);
} }
idci++; idci++;
@@ -3343,89 +3319,79 @@ try_again:
} // for i = 0 ... num_DL_DCIs } // for i = 0 ... num_DL_DCIs
// no try to allocate UL DCIs // no try to allocate UL DCIs
for (i = 0; i < HI_DCI0_req->number_of_dci + HI_DCI0_req->number_of_hi; for (i = 0; i < HI_DCI0_req->number_of_dci + HI_DCI0_req->number_of_hi; i++) {
i++) { hi_dci0_pduLoop = &hi_dci0_pdu[i];
// allocate UL DCIs // allocate UL DCIs
if (hi_dci0_pdu[i].pdu_type == NFAPI_HI_DCI0_DCI_PDU_TYPE) { if (hi_dci0_pdu[i].pdu_type == NFAPI_HI_DCI0_DCI_PDU_TYPE) {
LOG_D(MAC, LOG_D(MAC, "Trying to allocate format 0 DCI %d/%d (%d,%d) : rnti %x, aggreg %d nCCE %d / %d (num_pdcch_symbols %d)\n",
"Trying to allocate format 0 DCI %d/%d (%d,%d) : rnti %x, aggreg %d nCCE %d / %d (num_pdcch_symbols %d)\n", idci,
idci, DL_req->number_dci + HI_DCI0_req->number_of_dci, DL_req->number_dci + HI_DCI0_req->number_of_dci,
DL_req->number_dci, HI_DCI0_req->number_of_dci, DL_req->number_dci,
hi_dci0_pdu[i].dci_pdu.dci_pdu_rel8.rnti, HI_DCI0_req->number_of_dci,
hi_dci0_pdu[i].dci_pdu.dci_pdu_rel8.aggregation_level, hi_dci0_pduLoop->dci_pdu.dci_pdu_rel8.rnti,
nCCE, nCCE_max, DL_req->number_pdcch_ofdm_symbols); hi_dci0_pduLoop->dci_pdu.dci_pdu_rel8.aggregation_level,
nCCE, nCCE_max,
DL_req->number_pdcch_ofdm_symbols);
if (nCCE + (hi_dci0_pdu[i].dci_pdu.dci_pdu_rel8.aggregation_level) > nCCE_max) { if (nCCE + hi_dci0_pduLoop->dci_pdu.dci_pdu_rel8.aggregation_level > nCCE_max) {
if (DL_req->number_pdcch_ofdm_symbols == max_symbol) if (DL_req->number_pdcch_ofdm_symbols == max_symbol)
goto failed; return -1;
LOG_D(MAC, LOG_D(MAC, "Can't fit DCI allocations with %d PDCCH symbols, increasing by 1\n",
"Can't fit DCI allocations with %d PDCCH symbols, increasing by 1\n",
DL_req->number_pdcch_ofdm_symbols); DL_req->number_pdcch_ofdm_symbols);
DL_req->number_pdcch_ofdm_symbols++; DL_req->number_pdcch_ofdm_symbols++;
nCCE_max = nCCE_max = get_nCCE_max(cc, DL_req->number_pdcch_ofdm_symbols, subframeP);
get_nCCE_max(&RC.mac[module_idP]->common_channels[CC_idP],
DL_req->number_pdcch_ofdm_symbols,
subframeP);
goto try_again; goto try_again;
} }
// number of CCEs left can potentially hold this allocation // number of CCEs left can potentially hold this allocation
fCCE = get_nCCE_offset(CCE_table, fCCE = get_nCCE_offset(CCE_table,
hi_dci0_pdu[i].dci_pdu. hi_dci0_pduLoop->dci_pdu.dci_pdu_rel8.aggregation_level,
dci_pdu_rel8.aggregation_level, nCCE_max,
nCCE_max, 0, 0,
hi_dci0_pdu[i].dci_pdu.dci_pdu_rel8. hi_dci0_pduLoop->dci_pdu.dci_pdu_rel8.rnti,
rnti, subframeP); subframeP);
if (fCCE == -1) { if (fCCE == -1) {
if (DL_req->number_pdcch_ofdm_symbols == max_symbol) { if (DL_req->number_pdcch_ofdm_symbols == max_symbol) {
LOG_D(MAC, LOG_D(MAC, "subframe %d: Dropping Allocation for RNTI %x\n",
"subframe %d: Dropping Allocation for RNTI %x\n", subframeP,
subframeP, hi_dci0_pduLoop->dci_pdu.dci_pdu_rel8.rnti);
hi_dci0_pdu[i].dci_pdu.dci_pdu_rel8.rnti);
for (j = 0; j <= i; j++) { for (j = 0; j <= i; j++) {
if (hi_dci0_pdu[j].pdu_type == hi_dci0_pduLoop = &hi_dci0_pdu[j];
NFAPI_HI_DCI0_DCI_PDU_TYPE) if (hi_dci0_pdu[j].pdu_type == NFAPI_HI_DCI0_DCI_PDU_TYPE)
LOG_D(MAC, LOG_D(MAC, "DCI %d/%d (%d,%d) : rnti %x dci format %d, aggreg %d nCCE %d / %d (num_pdcch_symbols %d)\n",
"DCI %d/%d (%d,%d) : rnti %x dci format %d, aggreg %d nCCE %d / %d (num_pdcch_symbols %d)\n",
j, j,
DL_req->number_dci + HI_DCI0_req->number_of_dci, DL_req->number_dci + HI_DCI0_req->number_of_dci,
DL_req->number_dci, DL_req->number_dci,
HI_DCI0_req->number_of_dci, HI_DCI0_req->number_of_dci,
hi_dci0_pdu[j].dci_pdu.dci_pdu_rel8.rnti, hi_dci0_pduLoop->dci_pdu.dci_pdu_rel8.rnti,
hi_dci0_pdu[j].dci_pdu.dci_pdu_rel8. hi_dci0_pduLoop->dci_pdu.dci_pdu_rel8.dci_format,
dci_format, hi_dci0_pduLoop->dci_pdu.dci_pdu_rel8.aggregation_level,
hi_dci0_pdu[j].dci_pdu. nCCE, nCCE_max, DL_req->number_pdcch_ofdm_symbols);
dci_pdu_rel8.aggregation_level, nCCE,
nCCE_max,
DL_req->number_pdcch_ofdm_symbols);
} }
//dump_CCE_table(CCE_table,nCCE_max,subframeP,dci_alloc->rnti,1<<dci_alloc->L); //dump_CCE_table(CCE_table,nCCE_max,subframeP,dci_alloc->rnti,1<<dci_alloc->L);
goto failed; return -1;
} }
LOG_D(MAC, LOG_D(MAC, "Can't fit DCI allocations with %d PDCCH symbols (rnti condition), increasing by 1\n",
"Can't fit DCI allocations with %d PDCCH symbols (rnti condition), increasing by 1\n",
DL_req->number_pdcch_ofdm_symbols); DL_req->number_pdcch_ofdm_symbols);
DL_req->number_pdcch_ofdm_symbols++; DL_req->number_pdcch_ofdm_symbols++;
nCCE_max = nCCE_max = get_nCCE_max(cc, DL_req->number_pdcch_ofdm_symbols, subframeP);
get_nCCE_max(&RC.mac[module_idP]->common_channels[CC_idP],
DL_req->number_pdcch_ofdm_symbols,
subframeP);
goto try_again; goto try_again;
} // fCCE==-1 } // fCCE==-1
// the allocation is feasible, rnti rule passes // the allocation is feasible, rnti rule passes
nCCE += hi_dci0_pdu[i].dci_pdu.dci_pdu_rel8.aggregation_level; nCCE += hi_dci0_pduLoop->dci_pdu.dci_pdu_rel8.aggregation_level;
LOG_D(MAC, "Allocating at nCCE %d\n", fCCE); LOG_D(MAC, "Allocating at nCCE %d\n",
fCCE);
if ((test_onlyP%2) == 0) { if ((test_onlyP%2) == 0) {
hi_dci0_pdu[i].dci_pdu.dci_pdu_rel8.cce_index = fCCE; hi_dci0_pduLoop->dci_pdu.dci_pdu_rel8.cce_index = fCCE;
LOG_D(MAC, "Allocate CCEs subframe %d, test %d\n", LOG_D(MAC, "Allocate CCEs subframe %d, test %d\n",
subframeP, test_onlyP); subframeP,
test_onlyP);
} }
idci++; idci++;
@@ -3433,87 +3399,81 @@ try_again:
} // for i = 0 ... num_UL_DCIs } // for i = 0 ... num_UL_DCIs
for (i = 0; i < DL_req->number_pdu; i++) { for (i = 0; i < DL_req->number_pdu; i++) {
dl_config_pduLoop = &dl_config_pdu[i];
// allocate DL UE specific DCIs // allocate DL UE specific DCIs
if ((dl_config_pdu[i].pdu_type == NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE) if ((dl_config_pdu[i].pdu_type == NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE)
&& (dl_config_pdu[i].dci_dl_pdu.dci_dl_pdu_rel8.rnti_type == && (dl_config_pduLoop->dci_dl_pdu.dci_dl_pdu_rel8.rnti_type == 1)) {
1)) { LOG_D(MAC, "Trying to allocate DL UE-SPECIFIC DCI %d/%d (%d,%d) : rnti %x, aggreg %d nCCE %d / %d (num_pdcch_symbols %d)\n",
LOG_D(MAC, idci,
"Trying to allocate DL UE-SPECIFIC DCI %d/%d (%d,%d) : rnti %x, aggreg %d nCCE %d / %d (num_pdcch_symbols %d)\n", DL_req->number_dci + HI_DCI0_req->number_of_dci,
idci, DL_req->number_dci + HI_DCI0_req->number_of_dci,
DL_req->number_dci, HI_DCI0_req->number_of_dci, DL_req->number_dci, HI_DCI0_req->number_of_dci,
dl_config_pdu[i].dci_dl_pdu.dci_dl_pdu_rel8.rnti, dl_config_pduLoop->dci_dl_pdu.dci_dl_pdu_rel8.rnti,
dl_config_pdu[i].dci_dl_pdu. dl_config_pduLoop->dci_dl_pdu.dci_dl_pdu_rel8.aggregation_level,
dci_dl_pdu_rel8.aggregation_level, nCCE, nCCE_max, nCCE,
nCCE_max,
DL_req->number_pdcch_ofdm_symbols); DL_req->number_pdcch_ofdm_symbols);
if (nCCE + (dl_config_pdu[i].dci_dl_pdu.dci_dl_pdu_rel8.aggregation_level) > nCCE_max) { if (nCCE + (dl_config_pduLoop->dci_dl_pdu.dci_dl_pdu_rel8.aggregation_level) > nCCE_max) {
if (DL_req->number_pdcch_ofdm_symbols == max_symbol) if (DL_req->number_pdcch_ofdm_symbols == max_symbol)
goto failed; return -1;
LOG_D(MAC, LOG_D(MAC, "Can't fit DCI allocations with %d PDCCH symbols, increasing by 1\n",
"Can't fit DCI allocations with %d PDCCH symbols, increasing by 1\n",
DL_req->number_pdcch_ofdm_symbols); DL_req->number_pdcch_ofdm_symbols);
DL_req->number_pdcch_ofdm_symbols++; DL_req->number_pdcch_ofdm_symbols++;
nCCE_max = get_nCCE_max(&RC.mac[module_idP]->common_channels[CC_idP], nCCE_max = get_nCCE_max(cc, DL_req->number_pdcch_ofdm_symbols, subframeP);
DL_req->number_pdcch_ofdm_symbols,
subframeP);
goto try_again; goto try_again;
} }
// number of CCEs left can potentially hold this allocation // number of CCEs left can potentially hold this allocation
fCCE = get_nCCE_offset(CCE_table, fCCE = get_nCCE_offset(CCE_table,
dl_config_pdu[i].dci_dl_pdu.dci_dl_pdu_rel8.aggregation_level, nCCE_max, 0, dl_config_pduLoop->dci_dl_pdu.dci_dl_pdu_rel8.aggregation_level,
dl_config_pdu[i].dci_dl_pdu.dci_dl_pdu_rel8.rnti, nCCE_max,
0,
dl_config_pduLoop->dci_dl_pdu.dci_dl_pdu_rel8.rnti,
subframeP); subframeP);
if (fCCE == -1) { if (fCCE == -1) {
if (DL_req->number_pdcch_ofdm_symbols == max_symbol) { if (DL_req->number_pdcch_ofdm_symbols == max_symbol) {
LOG_I(MAC, LOG_I(MAC, "subframe %d: Dropping Allocation for RNTI %x\n",
"subframe %d: Dropping Allocation for RNTI %x\n", subframeP,
subframeP, dl_config_pduLoop->dci_dl_pdu.dci_dl_pdu_rel8.rnti);
dl_config_pdu[i].dci_dl_pdu.dci_dl_pdu_rel8.
rnti);
for (j = 0; j <= i; j++) { for (j = 0; j <= i; j++) {
if (dl_config_pdu[j].pdu_type == NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE) dl_config_pduLoop = &dl_config_pdu[j];
LOG_D(MAC, if (dl_config_pduLoop->pdu_type == NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE)
"DCI %d/%d (%d,%d) : rnti %x dci format %d, aggreg %d nCCE %d / %d (num_pdcch_symbols %d)\n", LOG_D(MAC, "DCI %d/%d (%d,%d) : rnti %x dci format %d, aggreg %d nCCE %d / %d (num_pdcch_symbols %d)\n",
j, j,
DL_req->number_dci + HI_DCI0_req->number_of_dci, DL_req->number_dci + HI_DCI0_req->number_of_dci,
DL_req->number_dci, DL_req->number_dci,
HI_DCI0_req->number_of_dci, HI_DCI0_req->number_of_dci,
dl_config_pdu[j].dci_dl_pdu.dci_dl_pdu_rel8.rnti, dl_config_pduLoop->dci_dl_pdu.dci_dl_pdu_rel8.rnti,
dl_config_pdu[j].dci_dl_pdu.dci_dl_pdu_rel8.dci_format, dl_config_pduLoop->dci_dl_pdu.dci_dl_pdu_rel8.dci_format,
dl_config_pdu[j].dci_dl_pdu.dci_dl_pdu_rel8. dl_config_pduLoop->dci_dl_pdu.dci_dl_pdu_rel8.aggregation_level,
aggregation_level,
nCCE, nCCE,
nCCE_max, nCCE_max,
DL_req->number_pdcch_ofdm_symbols); DL_req->number_pdcch_ofdm_symbols);
} }
//dump_CCE_table(CCE_table,nCCE_max,subframeP,dci_alloc->rnti,1<<dci_alloc->L); //dump_CCE_table(CCE_table,nCCE_max,subframeP,dci_alloc->rnti,1<<dci_alloc->L);
goto failed; return -1;
} }
LOG_D(MAC, LOG_D(MAC, "Can't fit DCI allocations with %d PDCCH symbols (rnti condition), increasing by 1\n",
"Can't fit DCI allocations with %d PDCCH symbols (rnti condition), increasing by 1\n",
DL_req->number_pdcch_ofdm_symbols); DL_req->number_pdcch_ofdm_symbols);
DL_req->number_pdcch_ofdm_symbols++; DL_req->number_pdcch_ofdm_symbols++;
nCCE_max = nCCE_max = get_nCCE_max(cc, DL_req->number_pdcch_ofdm_symbols, subframeP);
get_nCCE_max(&RC.mac[module_idP]->common_channels[CC_idP],
DL_req->number_pdcch_ofdm_symbols,
subframeP);
goto try_again; goto try_again;
} // fCCE==-1 } // fCCE==-1
// the allocation is feasible, rnti rule passes // the allocation is feasible, rnti rule passes
nCCE += dl_config_pdu[i].dci_dl_pdu.dci_dl_pdu_rel8.aggregation_level; nCCE += dl_config_pduLoop->dci_dl_pdu.dci_dl_pdu_rel8.aggregation_level;
LOG_D(MAC, "Allocating at nCCE %d\n", fCCE); LOG_D(MAC, "Allocating at nCCE %d\n",
fCCE);
if ((test_onlyP%2) == 0) { if ((test_onlyP%2) == 0) {
dl_config_pdu[i].dci_dl_pdu.dci_dl_pdu_rel8.cce_idx = fCCE; dl_config_pduLoop->dci_dl_pdu.dci_dl_pdu_rel8.cce_idx = fCCE;
LOG_D(MAC, "Allocate CCEs subframe %d, test %d\n", LOG_D(MAC, "Allocate CCEs subframe %d, test %d\n",
subframeP, test_onlyP); subframeP,
test_onlyP);
} }
if ((test_onlyP/2) == 1) { if ((test_onlyP/2) == 1) {
@@ -3534,10 +3494,7 @@ try_again:
idci++; idci++;
} }
} // for i = 0 ... num_DL_DCIs } // for i = 0 ... num_DL_DCIs
return 0; return 0;
failed:
return -1;
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
@@ -3624,14 +3581,11 @@ CCE_allocation_infeasible(int module_idP,
nfapi_dl_config_request_pdu_t *dl_config_pdu = &DL_req->dl_config_pdu_list[DL_req->number_pdu]; nfapi_dl_config_request_pdu_t *dl_config_pdu = &DL_req->dl_config_pdu_list[DL_req->number_pdu];
nfapi_hi_dci0_request_body_t *HI_DCI0_req = &RC.mac[module_idP]->HI_DCI0_req[CC_idP][subframe].hi_dci0_request_body; nfapi_hi_dci0_request_body_t *HI_DCI0_req = &RC.mac[module_idP]->HI_DCI0_req[CC_idP][subframe].hi_dci0_request_body;
nfapi_hi_dci0_request_pdu_t *hi_dci0_pdu = &HI_DCI0_req->hi_dci0_pdu_list[HI_DCI0_req->number_of_dci + HI_DCI0_req->number_of_hi]; nfapi_hi_dci0_request_pdu_t *hi_dci0_pdu = &HI_DCI0_req->hi_dci0_pdu_list[HI_DCI0_req->number_of_dci + HI_DCI0_req->number_of_hi];
int ret; boolean_t res = TRUE;
boolean_t res = FALSE;
if (format_flag != 2) { // DL DCI if (format_flag != 2) { // DL DCI
if (DL_req->number_pdu == MAX_NUM_DL_PDU) { if (DL_req->number_pdu == MAX_NUM_DL_PDU) {
LOG_W(MAC, LOG_W(MAC, "Subframe %d: FAPI DL structure is full, skip scheduling UE %d\n", subframe, rnti);
"Subframe %d: FAPI DL structure is full, skip scheduling UE %d\n",
subframe, rnti);
} else { } else {
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.tl.tag = NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL8_TAG; dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.tl.tag = NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL8_TAG;
dl_config_pdu->pdu_type = NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE; dl_config_pdu->pdu_type = NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE;
@@ -3639,34 +3593,25 @@ CCE_allocation_infeasible(int module_idP,
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.rnti_type = (format_flag == 0) ? 2 : 1; dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.rnti_type = (format_flag == 0) ? 2 : 1;
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.aggregation_level = aggregation; dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.aggregation_level = aggregation;
DL_req->number_pdu++; DL_req->number_pdu++;
LOG_D(MAC, LOG_D(MAC, "Subframe %d: Checking CCE feasibility format %d : (%x,%d) \n",
"Subframe %d: Checking CCE feasibility format %d : (%x,%d) (%x,%d,%d)\n", subframe, format_flag, rnti, aggregation);
subframe, format_flag, rnti, aggregation,
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.rnti,
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.
aggregation_level,
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.rnti_type);
ret = allocate_CCEs(module_idP, CC_idP, 0, subframe, 0);
if (ret == -1) res = TRUE;
if (allocate_CCEs(module_idP, CC_idP, 0, subframe, 0) != -1)
res = FALSE;
DL_req->number_pdu--; DL_req->number_pdu--;
} }
} else { // ue-specific UL DCI } else { // ue-specific UL DCI
if (HI_DCI0_req->number_of_dci + HI_DCI0_req->number_of_hi == MAX_NUM_HI_DCI0_PDU) { if (HI_DCI0_req->number_of_dci + HI_DCI0_req->number_of_hi == MAX_NUM_HI_DCI0_PDU) {
LOG_W(MAC, LOG_W(MAC, "Subframe %d: FAPI UL structure is full, skip scheduling UE %d\n", subframe, rnti);
"Subframe %d: FAPI UL structure is full, skip scheduling UE %d\n",
subframe, rnti);
} else { } else {
hi_dci0_pdu->pdu_type = NFAPI_HI_DCI0_DCI_PDU_TYPE; hi_dci0_pdu->pdu_type = NFAPI_HI_DCI0_DCI_PDU_TYPE;
hi_dci0_pdu->dci_pdu.dci_pdu_rel8.tl.tag = NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL8_TAG; hi_dci0_pdu->dci_pdu.dci_pdu_rel8.tl.tag = NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL8_TAG;
hi_dci0_pdu->dci_pdu.dci_pdu_rel8.rnti = rnti; hi_dci0_pdu->dci_pdu.dci_pdu_rel8.rnti = rnti;
hi_dci0_pdu->dci_pdu.dci_pdu_rel8.aggregation_level = aggregation; hi_dci0_pdu->dci_pdu.dci_pdu_rel8.aggregation_level = aggregation;
HI_DCI0_req->number_of_dci++; HI_DCI0_req->number_of_dci++;
ret = allocate_CCEs(module_idP, CC_idP, 0, subframe, 0);
if (ret == -1) res = TRUE;
if (allocate_CCEs(module_idP, CC_idP, 0, subframe, 0) != -1)
res = FALSE;
HI_DCI0_req->number_of_dci--; HI_DCI0_req->number_of_dci--;
} }
} }
@@ -4165,15 +4110,24 @@ extract_harq(module_id_t mod_idP,
sched_ctl->tbcnt[CC_idP][harq_pid] = 0; sched_ctl->tbcnt[CC_idP][harq_pid] = 0;
} }
if (num_ack_nak == 2 && sched_ctl->round[CC_idP][harq_pid] < 8 && sched_ctl->tbcnt[CC_idP][harq_pid] == 1 && pdu[0] == 2 && pdu[1] == 2) { if ((num_ack_nak == 2)
&& (sched_ctl->round[CC_idP][harq_pid] < 8)
&& (sched_ctl->tbcnt[CC_idP][harq_pid] == 1)
&& (pdu[0] == 2) && (pdu[1] == 2)) {
sched_ctl->round[CC_idP][harq_pid]++; sched_ctl->round[CC_idP][harq_pid]++;
if (sched_ctl->round[CC_idP][harq_pid] == 4) { if (sched_ctl->round[CC_idP][harq_pid] == 4) {
sched_ctl->round[CC_idP][harq_pid] = 8; // release HARQ process sched_ctl->round[CC_idP][harq_pid] = 8; // release HARQ process
sched_ctl->tbcnt[CC_idP][harq_pid] = 0; sched_ctl->tbcnt[CC_idP][harq_pid] = 0;
} }
} else if ((num_ack_nak == 2 && sched_ctl->round[CC_idP][harq_pid] < 8 && sched_ctl->tbcnt[0][harq_pid] == 2 && pdu[0] == 1 && pdu[1] == 2) || } else if (((num_ack_nak == 2)
(num_ack_nak == 2 && sched_ctl->round[CC_idP][harq_pid] < 8 && sched_ctl->tbcnt[CC_idP][harq_pid] == 2 && pdu[0] == 2 && pdu[1] == 1)) { && (sched_ctl->round[CC_idP][harq_pid] < 8)
&& (sched_ctl->tbcnt[0][harq_pid] == 2)
&& (pdu[0] == 1) && (pdu[1] == 2))
|| ((num_ack_nak == 2)
&& (sched_ctl->round[CC_idP][harq_pid] < 8)
&& (sched_ctl->tbcnt[CC_idP][harq_pid] == 2)
&& (pdu[0] == 2) && (pdu[1] == 1))) {
sched_ctl->round[CC_idP][harq_pid]++; sched_ctl->round[CC_idP][harq_pid]++;
sched_ctl->tbcnt[CC_idP][harq_pid] = 1; sched_ctl->tbcnt[CC_idP][harq_pid] = 1;
@@ -4181,7 +4135,10 @@ extract_harq(module_id_t mod_idP,
sched_ctl->round[CC_idP][harq_pid] = 8; // release HARQ process sched_ctl->round[CC_idP][harq_pid] = 8; // release HARQ process
sched_ctl->tbcnt[CC_idP][harq_pid] = 0; /* TODO: do we have to set it to 0? */ sched_ctl->tbcnt[CC_idP][harq_pid] = 0; /* TODO: do we have to set it to 0? */
} }
} else if (num_ack_nak == 2 && sched_ctl->round[CC_idP][harq_pid] < 8 && sched_ctl->tbcnt[CC_idP][harq_pid] == 2 && pdu[0] == 2 && pdu[1] == 2) { } else if ((num_ack_nak == 2)
&& (sched_ctl->round[CC_idP][harq_pid] < 8)
&& (sched_ctl->tbcnt[CC_idP][harq_pid] == 2)
&& (pdu[0] == 2) && (pdu[1] == 2)) {
sched_ctl->round[CC_idP][harq_pid]++; sched_ctl->round[CC_idP][harq_pid]++;
if (sched_ctl->round[CC_idP][harq_pid] == 4) { if (sched_ctl->round[CC_idP][harq_pid] == 4) {
@@ -4206,27 +4163,39 @@ extract_harq(module_id_t mod_idP,
AssertFatal(numCC == 2, "Should not receive harq indication with channel selection with %d active CCs\n", AssertFatal(numCC == 2, "Should not receive harq indication with channel selection with %d active CCs\n",
numCC); numCC);
if (num_ack_nak == 2 && sched_ctl->round[pCCid][harq_pid] < 8 && if ((num_ack_nak == 2)
sched_ctl->round[1 - pCCid][harq_pid] < 8 && sched_ctl->tbcnt[pCCid][harq_pid] == 1 && sched_ctl->tbcnt[1 - pCCid][harq_pid] == 1) { && (sched_ctl->round[pCCid][harq_pid] < 8)
&& (sched_ctl->round[1 - pCCid][harq_pid] < 8)
&& (sched_ctl->tbcnt[pCCid][harq_pid] == 1)
&& (sched_ctl->tbcnt[1 - pCCid][harq_pid] == 1)) {
AssertFatal(pdu[0] <= 3, "pdu[0] %d is not ACK/NAK/DTX\n", AssertFatal(pdu[0] <= 3, "pdu[0] %d is not ACK/NAK/DTX\n",
pdu[0]); pdu[0]);
AssertFatal(pdu[1] <= 3, "pdu[1] %d is not ACK/NAK/DTX\n", AssertFatal(pdu[1] <= 3, "pdu[1] %d is not ACK/NAK/DTX\n",
pdu[1]); pdu[1]);
if (pdu[0] == 1) sched_ctl->round[pCCid][harq_pid] = 8; if (pdu[0] == 1)
sched_ctl->round[pCCid][harq_pid] = 8;
else { else {
sched_ctl->round[pCCid][harq_pid]++; sched_ctl->round[pCCid][harq_pid]++;
if (sched_ctl->round[pCCid][harq_pid] == 4) sched_ctl->round[pCCid][harq_pid] = 8;
if (sched_ctl->round[pCCid][harq_pid] == 4)
sched_ctl->round[pCCid][harq_pid] = 8;
} }
if (pdu[1] == 1) sched_ctl->round[1 - pCCid][harq_pid] = 8; if (pdu[1] == 1)
sched_ctl->round[1 - pCCid][harq_pid] = 8;
else { else {
sched_ctl->round[1 - pCCid][harq_pid]++; sched_ctl->round[1 - pCCid][harq_pid]++;
if (sched_ctl->round[1 - pCCid][harq_pid] == 4) sched_ctl->round[1 - pCCid][harq_pid] = 8;
if (sched_ctl->round[1 - pCCid][harq_pid] == 4)
sched_ctl->round[1 - pCCid][harq_pid] = 8;
} }
} // A=2 } // A=2
else if (num_ack_nak == 3 && sched_ctl->round[pCCid][harq_pid] < 8 && else if ((num_ack_nak == 3)
sched_ctl->tbcnt[pCCid][harq_pid] == 2 && sched_ctl->round[1 - pCCid][harq_pid] < 8 && sched_ctl->tbcnt[1 - pCCid][harq_pid] == 1) { && (sched_ctl->round[pCCid][harq_pid] < 8)
&& (sched_ctl->tbcnt[pCCid][harq_pid] == 2)
&& (sched_ctl->round[1 - pCCid][harq_pid] < 8)
&& (sched_ctl->tbcnt[1 - pCCid][harq_pid] == 1)) {
AssertFatal(pdu[0] <= 3, "pdu[0] %d is not ACK/NAK/DTX\n", AssertFatal(pdu[0] <= 3, "pdu[0] %d is not ACK/NAK/DTX\n",
pdu[0]); pdu[0]);
AssertFatal(pdu[1] <= 3, "pdu[1] %d is not ACK/NAK/DTX\n", AssertFatal(pdu[1] <= 3, "pdu[1] %d is not ACK/NAK/DTX\n",
@@ -4273,8 +4242,11 @@ extract_harq(module_id_t mod_idP,
} }
} }
} // A=3 primary cell has 2 TBs } // A=3 primary cell has 2 TBs
else if (num_ack_nak == 3 && sched_ctl->round[1 - pCCid][harq_pid] < 8 && else if ((num_ack_nak == 3)
sched_ctl->round[pCCid][harq_pid] < 8 && sched_ctl->tbcnt[1 - pCCid][harq_pid] == 2 && sched_ctl->tbcnt[pCCid][harq_pid] == 1) { && (sched_ctl->round[1 - pCCid][harq_pid] < 8)
&& (sched_ctl->round[pCCid][harq_pid] < 8)
&& (sched_ctl->tbcnt[1 - pCCid][harq_pid] == 2)
&& (sched_ctl->tbcnt[pCCid][harq_pid] == 1)) {
AssertFatal(pdu[0] <= 3, "pdu[0] %d is not ACK/NAK/DTX\n", AssertFatal(pdu[0] <= 3, "pdu[0] %d is not ACK/NAK/DTX\n",
pdu[0]); pdu[0]);
AssertFatal(pdu[1] <= 3, "pdu[1] %d is not ACK/NAK/DTX\n", AssertFatal(pdu[1] <= 3, "pdu[1] %d is not ACK/NAK/DTX\n",
@@ -4323,8 +4295,11 @@ extract_harq(module_id_t mod_idP,
} // A=3 secondary cell has 2 TBs } // A=3 secondary cell has 2 TBs
#if MAX_NUM_CCs>1 #if MAX_NUM_CCs>1
else if (num_ack_nak == 4 && sched_ctl->round[0][harq_pid] < 8 && else if ((num_ack_nak == 4)
sched_ctl->round[1][harq_pid] < 8 && sched_ctl->tbcnt[1 - pCCid][harq_pid] == 2 && sched_ctl->tbcnt[pCCid][harq_pid] == 2) { && (sched_ctl->round[0][harq_pid] < 8)
&& (sched_ctl->round[1][harq_pid] < 8)
&& (sched_ctl->tbcnt[1 - pCCid][harq_pid] == 2)
&& (sched_ctl->tbcnt[pCCid][harq_pid] == 2)) {
AssertFatal(pdu[0] <= 3, "pdu[0] %d is not ACK/NAK/DTX\n", AssertFatal(pdu[0] <= 3, "pdu[0] %d is not ACK/NAK/DTX\n",
pdu[0]); pdu[0]);
AssertFatal(pdu[1] <= 3, "pdu[1] %d is not ACK/NAK/DTX\n", AssertFatal(pdu[1] <= 3, "pdu[1] %d is not ACK/NAK/DTX\n",
@@ -4976,14 +4951,11 @@ SR_indication(module_id_t mod_idP,
T_INT(frameP), T_INT(frameP),
T_INT(subframeP), T_INT(subframeP),
T_INT(rntiP)); T_INT(rntiP));
int UE_id = find_UE_id(mod_idP, int UE_id = find_UE_id(mod_idP, rntiP);
rntiP);
UE_list_t *UE_list = &RC.mac[mod_idP]->UE_list; UE_list_t *UE_list = &RC.mac[mod_idP]->UE_list;
if (UE_id != -1) { if (UE_id != -1) {
if (mac_eNB_get_rrc_status(mod_idP, if (mac_eNB_get_rrc_status(mod_idP, UE_RNTI(mod_idP, UE_id)) < RRC_CONNECTED) {
UE_RNTI(mod_idP,
UE_id)) < RRC_CONNECTED) {
LOG_D(MAC, "[eNB %d][SR %x] Frame %d subframeP %d Signaling SR for UE %d on CC_id %d\n", LOG_D(MAC, "[eNB %d][SR %x] Frame %d subframeP %d Signaling SR for UE %d on CC_id %d\n",
mod_idP, mod_idP,
rntiP, rntiP,
@@ -4994,10 +4966,8 @@ SR_indication(module_id_t mod_idP,
} }
UE_list->UE_template[cc_idP][UE_id].ul_SR = 1; UE_list->UE_template[cc_idP][UE_id].ul_SR = 1;
UE_list->UE_template[cc_idP][UE_id].ul_active = TRUE; UE_list->UE_template[cc_idP][UE_id].ul_active = TRUE;
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_SR_INDICATION, VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_SR_INDICATION, 1);
1); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_SR_INDICATION, 0);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_SR_INDICATION,
0);
} else { } else {
// AssertFatal(0, "find_UE_id(%u,rnti %d) not found", enb_mod_idP, rntiP); // AssertFatal(0, "find_UE_id(%u,rnti %d) not found", enb_mod_idP, rntiP);
// AssertError(0, 0, "Frame %d: find_UE_id(%u,rnti %d) not found\n", frameP, enb_mod_idP, rntiP); // AssertError(0, 0, "Frame %d: find_UE_id(%u,rnti %d) not found\n", frameP, enb_mod_idP, rntiP);
@@ -5087,8 +5057,7 @@ harq_indication(module_id_t mod_idP,
rnti_t rnti = harq_pdu->rx_ue_information.rnti; rnti_t rnti = harq_pdu->rx_ue_information.rnti;
uint8_t ul_cqi = harq_pdu->ul_cqi_information.ul_cqi; uint8_t ul_cqi = harq_pdu->ul_cqi_information.ul_cqi;
uint8_t channel = harq_pdu->ul_cqi_information.channel; uint8_t channel = harq_pdu->ul_cqi_information.channel;
int UE_id = find_UE_id(mod_idP, int UE_id = find_UE_id(mod_idP, rnti);
rnti);
if (UE_id == -1) { if (UE_id == -1) {
LOG_W(MAC, "harq_indication: UE %x not found\n", LOG_W(MAC, "harq_indication: UE %x not found\n",
File diff suppressed because it is too large Load Diff
+1
View File
@@ -995,6 +995,7 @@ typedef struct {
uint8_t crnti_reconfigurationcomplete_flag; uint8_t crnti_reconfigurationcomplete_flag;
uint8_t cqi_req_flag; uint8_t cqi_req_flag;
} UE_sched_ctrl; } UE_sched_ctrl;
/*! \brief eNB template for the Random access information */ /*! \brief eNB template for the Random access information */
typedef struct { typedef struct {
/// Flag to indicate this process is active /// Flag to indicate this process is active
+2 -2
View File
@@ -452,7 +452,7 @@ uint8_t get_aggregation(uint8_t bw_index, uint8_t cqi, uint8_t dci_fmt);
int8_t find_active_UEs_with_traffic(module_id_t module_idP); int8_t find_active_UEs_with_traffic(module_id_t module_idP);
void init_CCE_table(int module_idP, int CC_idP); void init_CCE_table(int *CCE_table);
int get_nCCE_offset(int *CCE_table, int get_nCCE_offset(int *CCE_table,
const unsigned char L, const unsigned char L,
@@ -734,7 +734,7 @@ void ulsch_scheduler_pre_processor(module_id_t module_idP, int slice_idx, int fr
uint16_t * first_rb); uint16_t * first_rb);
void store_ulsch_buffer(module_id_t module_idP, int frameP, void store_ulsch_buffer(module_id_t module_idP, int frameP,
sub_frame_t subframeP); sub_frame_t subframeP);
void sort_ue_ul(module_id_t module_idP, int frameP, sub_frame_t subframeP); void sort_ue_ul(module_id_t module_idP, int slice_idx, int frameP, sub_frame_t subframeP, rnti_t *rntiTable);
void assign_max_mcs_min_rb(module_id_t module_idP, int slice_idx, int frameP, void assign_max_mcs_min_rb(module_id_t module_idP, int slice_idx, int frameP,
sub_frame_t subframeP, uint16_t * first_rb); sub_frame_t subframeP, uint16_t * first_rb);
void adjust_bsr_info(int buffer_occupancy, uint16_t TBS, void adjust_bsr_info(int buffer_occupancy, uint16_t TBS,
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+12 -59
View File
@@ -128,6 +128,8 @@ void rlc_am_v9_3_0_test_windows()
rlc_am_entity_t am2; rlc_am_entity_t am2;
unsigned int i; unsigned int i;
unsigned int j; unsigned int j;
memset(am1,0,sizeof(rlc_am_entity_t));
memset(am2,0,sizeof(rlc_am_entity_t));
rlc_am_init(&am1, g_frame); rlc_am_init(&am1, g_frame);
rlc_am_init(&am2, g_frame); rlc_am_init(&am2, g_frame);
@@ -215,19 +217,16 @@ void rlc_am_v9_3_0_test_windows()
assert(rlc_am_in_rx_window(&am1, i) == 0); assert(rlc_am_in_rx_window(&am1, i) == 0);
} }
} }
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void rlc_am_v9_3_0_test_read_write_bit_field() void rlc_am_v9_3_0_test_read_write_bit_field()
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
{ {
unsigned int bit_pos_write = 0; // range from 0 (MSB/left) to 7 (LSB/right) unsigned int bit_pos_write = 0; // range from 0 (MSB/left) to 7 (LSB/right)
uint8_t* byte_pos_write = g_buffer; uint8_t *byte_pos_write = g_buffer;
unsigned int bit_pos_read = 0; // range from 0 (MSB/left) to 7 (LSB/right) unsigned int bit_pos_read = 0; // range from 0 (MSB/left) to 7 (LSB/right)
uint8_t* byte_pos_read = g_buffer; uint8_t *byte_pos_read = g_buffer;
uint16_t read_value; uint16_t read_value;
memset (g_buffer, 0, sizeof(g_buffer)); memset (g_buffer, 0, sizeof(g_buffer));
// byte 0 // byte 0
rlc_am_write8_bit_field(&byte_pos_write, &bit_pos_write, 1, 1); rlc_am_write8_bit_field(&byte_pos_write, &bit_pos_write, 1, 1);
@@ -240,7 +239,6 @@ void rlc_am_v9_3_0_test_read_write_bit_field()
rlc_am_write8_bit_field(&byte_pos_write, &bit_pos_write, 1, 0); rlc_am_write8_bit_field(&byte_pos_write, &bit_pos_write, 1, 0);
assert(g_buffer[0] == 0x96); assert(g_buffer[0] == 0x96);
assert(g_buffer[1] == 0x00); assert(g_buffer[1] == 0x00);
// byte 1 // byte 1
rlc_am_write8_bit_field(&byte_pos_write, &bit_pos_write, 1, 1); rlc_am_write8_bit_field(&byte_pos_write, &bit_pos_write, 1, 1);
rlc_am_write8_bit_field(&byte_pos_write, &bit_pos_write, 1, 1); rlc_am_write8_bit_field(&byte_pos_write, &bit_pos_write, 1, 1);
@@ -251,10 +249,8 @@ void rlc_am_v9_3_0_test_read_write_bit_field()
rlc_am_write8_bit_field(&byte_pos_write, &bit_pos_write, 1, 0); rlc_am_write8_bit_field(&byte_pos_write, &bit_pos_write, 1, 0);
rlc_am_write8_bit_field(&byte_pos_write, &bit_pos_write, 1, 1); rlc_am_write8_bit_field(&byte_pos_write, &bit_pos_write, 1, 1);
assert(g_buffer[0] == 0x96); assert(g_buffer[0] == 0x96);
assert(g_buffer[1] == 0xD9); assert(g_buffer[1] == 0xD9);
assert(g_buffer[2] == 0x00); assert(g_buffer[2] == 0x00);
// byte 2 // byte 2
rlc_am_write8_bit_field(&byte_pos_write, &bit_pos_write, 1, 0); rlc_am_write8_bit_field(&byte_pos_write, &bit_pos_write, 1, 0);
rlc_am_write8_bit_field(&byte_pos_write, &bit_pos_write, 1, 0); rlc_am_write8_bit_field(&byte_pos_write, &bit_pos_write, 1, 0);
@@ -266,7 +262,6 @@ void rlc_am_v9_3_0_test_read_write_bit_field()
rlc_am_write8_bit_field(&byte_pos_write, &bit_pos_write, 1, 1); rlc_am_write8_bit_field(&byte_pos_write, &bit_pos_write, 1, 1);
assert(g_buffer[0] == 0x96); assert(g_buffer[0] == 0x96);
assert(g_buffer[1] == 0xD9); assert(g_buffer[1] == 0xD9);
assert(g_buffer[2] == 0x11); assert(g_buffer[2] == 0x11);
assert(g_buffer[3] == 0x00); assert(g_buffer[3] == 0x00);
// byte 3 & 4 // byte 3 & 4
@@ -282,7 +277,6 @@ void rlc_am_v9_3_0_test_read_write_bit_field()
assert(g_buffer[0] == 0x96); assert(g_buffer[0] == 0x96);
assert(g_buffer[1] == 0xD9); assert(g_buffer[1] == 0xD9);
assert(g_buffer[2] == 0x11); assert(g_buffer[2] == 0x11);
assert(g_buffer[3] == 0x99); assert(g_buffer[3] == 0x99);
assert(g_buffer[4] == 0xA7); assert(g_buffer[4] == 0xA7);
assert(g_buffer[5] == 0x00); assert(g_buffer[5] == 0x00);
@@ -298,7 +292,6 @@ void rlc_am_v9_3_0_test_read_write_bit_field()
assert(g_buffer[2] == 0x11); assert(g_buffer[2] == 0x11);
assert(g_buffer[3] == 0x99); assert(g_buffer[3] == 0x99);
assert(g_buffer[4] == 0xA7); assert(g_buffer[4] == 0xA7);
assert(g_buffer[5] == 0xF4); assert(g_buffer[5] == 0xF4);
assert(g_buffer[6] == 0x86); assert(g_buffer[6] == 0x86);
assert(g_buffer[7] == 0x00); assert(g_buffer[7] == 0x00);
@@ -317,7 +310,6 @@ void rlc_am_v9_3_0_test_read_write_bit_field()
assert(g_buffer[4] == 0xA7); assert(g_buffer[4] == 0xA7);
assert(g_buffer[5] == 0xF4); assert(g_buffer[5] == 0xF4);
assert(g_buffer[6] == 0x86); assert(g_buffer[6] == 0x86);
assert(g_buffer[7] == 0xCD); assert(g_buffer[7] == 0xCD);
assert(g_buffer[8] == 0x7D); assert(g_buffer[8] == 0x7D);
assert(g_buffer[9] == 0x58); assert(g_buffer[9] == 0x58);
@@ -337,7 +329,6 @@ void rlc_am_v9_3_0_test_read_write_bit_field()
assert(g_buffer[7] == 0xCD); assert(g_buffer[7] == 0xCD);
assert(g_buffer[8] == 0x7D); assert(g_buffer[8] == 0x7D);
assert(g_buffer[9] == 0x58); assert(g_buffer[9] == 0x58);
assert(g_buffer[10] == 0xAA); assert(g_buffer[10] == 0xAA);
assert(g_buffer[11] == 0xDB); assert(g_buffer[11] == 0xDB);
assert(g_buffer[12] == 0xAA); assert(g_buffer[12] == 0xAA);
@@ -368,7 +359,6 @@ void rlc_am_v9_3_0_test_read_write_bit_field()
assert(g_buffer[12] == 0xAA); assert(g_buffer[12] == 0xAA);
assert(g_buffer[13] == 0xBD); assert(g_buffer[13] == 0xBD);
assert(g_buffer[14] == 0x34); assert(g_buffer[14] == 0x34);
assert(g_buffer[15] == 0xE0); assert(g_buffer[15] == 0xE0);
assert(g_buffer[16] == 0x3F); assert(g_buffer[16] == 0x3F);
assert(g_buffer[17] == 0x84); assert(g_buffer[17] == 0x84);
@@ -385,7 +375,6 @@ void rlc_am_v9_3_0_test_read_write_bit_field()
assert(g_buffer[28] == 0x87); assert(g_buffer[28] == 0x87);
assert(g_buffer[29] == 0x88); assert(g_buffer[29] == 0x88);
assert(g_buffer[30] == 0x00); assert(g_buffer[30] == 0x00);
// 0x96 0xD9 // 0x96 0xD9
read_value = rlc_am_read_bit_field(&byte_pos_read, &bit_pos_read, 1);// b0 read_value = rlc_am_read_bit_field(&byte_pos_read, &bit_pos_read, 1);// b0
assert(read_value == 1); assert(read_value == 1);
@@ -419,7 +408,6 @@ void rlc_am_v9_3_0_test_read_write_bit_field()
assert(read_value == 0); assert(read_value == 0);
read_value = rlc_am_read_bit_field(&byte_pos_read, &bit_pos_read, 1);// b15 read_value = rlc_am_read_bit_field(&byte_pos_read, &bit_pos_read, 1);// b15
assert(read_value == 1); assert(read_value == 1);
// 0x11 0x99 // 0x11 0x99
read_value = rlc_am_read_bit_field(&byte_pos_read, &bit_pos_read, 2); read_value = rlc_am_read_bit_field(&byte_pos_read, &bit_pos_read, 2);
assert(read_value == 0); assert(read_value == 0);
@@ -439,7 +427,6 @@ void rlc_am_v9_3_0_test_read_write_bit_field()
assert(read_value == 2); assert(read_value == 2);
read_value = rlc_am_read_bit_field(&byte_pos_read, &bit_pos_read, 2); read_value = rlc_am_read_bit_field(&byte_pos_read, &bit_pos_read, 2);
assert(read_value == 1); assert(read_value == 1);
// 0xA7 0xF4 0x86 0xCD 0x7D; // 0xA7 0xF4 0x86 0xCD 0x7D;
read_value = rlc_am_read_bit_field(&byte_pos_read, &bit_pos_read, 10); read_value = rlc_am_read_bit_field(&byte_pos_read, &bit_pos_read, 10);
assert(read_value == 0x29F); assert(read_value == 0x29F);
@@ -449,10 +436,8 @@ void rlc_am_v9_3_0_test_read_write_bit_field()
assert(read_value == 0x1B3); assert(read_value == 0x1B3);
read_value = rlc_am_read_bit_field(&byte_pos_read, &bit_pos_read, 10); read_value = rlc_am_read_bit_field(&byte_pos_read, &bit_pos_read, 10);
assert(read_value == 0x17D); assert(read_value == 0x17D);
// 0x58 0xAA 0xDB 0xAA 0xBD 0x34 // 0x58 0xAA 0xDB 0xAA 0xBD 0x34
// 0xE0 0x3F 0x84 0xBA 0x91 0xEC // 0xE0 0x3F 0x84 0xBA 0x91 0xEC
read_value = rlc_am_read_bit_field(&byte_pos_read, &bit_pos_read, 1); read_value = rlc_am_read_bit_field(&byte_pos_read, &bit_pos_read, 1);
assert(read_value == 0); assert(read_value == 0);
read_value = rlc_am_read_bit_field(&byte_pos_read, &bit_pos_read, 10); read_value = rlc_am_read_bit_field(&byte_pos_read, &bit_pos_read, 10);
@@ -475,7 +460,6 @@ void rlc_am_v9_3_0_test_read_write_bit_field()
assert(read_value == 0x2EA); assert(read_value == 0x2EA);
read_value = rlc_am_read_bit_field(&byte_pos_read, &bit_pos_read, 10); read_value = rlc_am_read_bit_field(&byte_pos_read, &bit_pos_read, 10);
assert(read_value == 0x11E); assert(read_value == 0x11E);
bit_pos_read = 0; bit_pos_read = 0;
byte_pos_read = g_buffer; byte_pos_read = g_buffer;
// 0x96 0xD9 0x11 0x99 0xA7 0xF4 0x86 0xCD 0x7D 0x58 0xAA 0xDB 0xAA 0xBD 0x34 // 0x96 0xD9 0x11 0x99 0xA7 0xF4 0x86 0xCD 0x7D 0x58 0xAA 0xDB 0xAA 0xBD 0x34
@@ -523,30 +507,24 @@ void rlc_am_v9_3_0_test_send_sdu(rlc_am_entity_t *am_txP, int sdu_indexP)
printf("[FRAME %05d][RLC][MOD %02d][RB %02d] TX SDU %d %04d bytes\n",g_frame,am_txP->module_id, am_txP->rb_id, sdu_indexP, strlen(g_sdus[sdu_indexP]) + 1); printf("[FRAME %05d][RLC][MOD %02d][RB %02d] TX SDU %d %04d bytes\n",g_frame,am_txP->module_id, am_txP->rb_id, sdu_indexP, strlen(g_sdus[sdu_indexP]) + 1);
memset (sdu->data, 0, sizeof (struct rlc_am_data_req_alloc)); memset (sdu->data, 0, sizeof (struct rlc_am_data_req_alloc));
strcpy (&sdu->data[sizeof (struct rlc_am_data_req_alloc)],g_sdus[sdu_indexP]); strcpy (&sdu->data[sizeof (struct rlc_am_data_req_alloc)],g_sdus[sdu_indexP]);
((struct rlc_am_data_req *) (sdu->data))->data_size = strlen(g_sdus[sdu_indexP])+ 1; ((struct rlc_am_data_req *) (sdu->data))->data_size = strlen(g_sdus[sdu_indexP])+ 1;
((struct rlc_am_data_req *) (sdu->data))->conf = 1; ((struct rlc_am_data_req *) (sdu->data))->conf = 1;
((struct rlc_am_data_req *) (sdu->data))->mui = g_mui++; ((struct rlc_am_data_req *) (sdu->data))->mui = g_mui++;
((struct rlc_am_data_req *) (sdu->data))->data_offset = sizeof (struct rlc_am_data_req_alloc); ((struct rlc_am_data_req *) (sdu->data))->data_offset = sizeof (struct rlc_am_data_req_alloc);
rlc_am_data_req(am_txP, g_frame, sdu); rlc_am_data_req(am_txP, g_frame, sdu);
g_send_sdu_ids[g_send_id_write_index[am_txP->rb_id]++][am_txP->rb_id] = sdu_indexP; g_send_sdu_ids[g_send_id_write_index[am_txP->rb_id]++][am_txP->rb_id] = sdu_indexP;
assert(g_send_id_write_index[am_txP->rb_id] < TEST_MAX_SEND_SDU); assert(g_send_id_write_index[am_txP->rb_id] < TEST_MAX_SEND_SDU);
} else { } else {
printf("Out of memory error\n"); printf("Out of memory error\n");
// exit(-1); // exit(-1);
} }
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void rlc_am_v9_3_0_test_mac_rlc_loop (struct mac_data_ind *data_indP, struct mac_data_req *data_requestP, int* drop_countP, int *tx_packetsP, void rlc_am_v9_3_0_test_mac_rlc_loop (struct mac_data_ind *data_indP, struct mac_data_req *data_requestP, int *drop_countP, int *tx_packetsP,
int* dropped_tx_packetsP) //----------------------------------------------------------------------------- int *dropped_tx_packetsP) { //-----------------------------------------------------------------------------
{ mem_block_t *tb_src;
mem_block_t *tb_dst;
mem_block_t* tb_src;
mem_block_t* tb_dst;
unsigned int tb_size; unsigned int tb_size;
data_indP->no_tb = 0; data_indP->no_tb = 0;
while (data_requestP->data.nb_elements > 0) { while (data_requestP->data.nb_elements > 0) {
@@ -554,10 +532,9 @@ void rlc_am_v9_3_0_test_mac_rlc_loop (struct mac_data_ind *data_indP, struct ma
if (tb_src != NULL) { if (tb_src != NULL) {
tb_size = ((struct mac_tb_req *) (tb_src->data))->tb_size_in_bits >> 3; tb_size = ((struct mac_tb_req *) (tb_src->data))->tb_size_in_bits >> 3;
printf("[RLC-LOOP] FOUND TB SIZE IN BITS %d IN BYTES %d sizeof (mac_rlc_max_rx_header_size_t) %d\n", printf("[RLC-LOOP] FOUND TB SIZE IN BITS %d IN BYTES %u sizeof (mac_rlc_max_rx_header_size_t) %d\n",
((struct mac_tb_req *) (tb_src->data))->tb_size_in_bits, ((struct mac_tb_req *) (tb_src->data))->tb_size_in_bits,
tb_size, sizeof (mac_rlc_max_rx_header_size_t)); tb_size, sizeof (mac_rlc_max_rx_header_size_t));
*tx_packetsP = *tx_packetsP + 1; *tx_packetsP = *tx_packetsP + 1;
if (*drop_countP == 0) { if (*drop_countP == 0) {
@@ -568,16 +545,14 @@ void rlc_am_v9_3_0_test_mac_rlc_loop (struct mac_data_ind *data_indP, struct ma
((struct mac_tb_ind *) (tb_dst->data))->data_ptr = &tb_dst->data[sizeof (mac_rlc_max_rx_header_size_t)]; ((struct mac_tb_ind *) (tb_dst->data))->data_ptr = &tb_dst->data[sizeof (mac_rlc_max_rx_header_size_t)];
((struct mac_tb_ind *) (tb_dst->data))->size = tb_size; ((struct mac_tb_ind *) (tb_dst->data))->size = tb_size;
((struct mac_tb_ind *) (tb_dst->data))->error_indication = 0; ((struct mac_tb_ind *) (tb_dst->data))->error_indication = 0;
memcpy(((struct mac_tb_ind *) (tb_dst->data))->data_ptr, memcpy(((struct mac_tb_ind *) (tb_dst->data))->data_ptr,
&((struct mac_tb_req *) (tb_src->data))->data_ptr[0], &((struct mac_tb_req *) (tb_src->data))->data_ptr[0],
tb_size); tb_size);
list_add_tail_eurecom(tb_dst, &data_indP->data); list_add_tail_eurecom(tb_dst, &data_indP->data);
data_indP->no_tb += 1; data_indP->no_tb += 1;
} else { } else {
printf("Out of memory error\n"); printf("Out of memory error\n");
// exit(-1); // exit(-1);
} }
} else { } else {
printf("[RLC-LOOP] DROPPING 1 TB\n"); printf("[RLC-LOOP] DROPPING 1 TB\n");
@@ -607,8 +582,6 @@ void rlc_am_v9_3_0_test_exchange_pdus(rlc_am_entity_t *am_txP,
struct mac_status_ind tx_status; struct mac_status_ind tx_status;
struct mac_status_resp mac_rlc_status_resp_tx; struct mac_status_resp mac_rlc_status_resp_tx;
struct mac_status_resp mac_rlc_status_resp_rx; struct mac_status_resp mac_rlc_status_resp_rx;
memset(&data_request_tx, 0, sizeof(struct mac_data_req)); memset(&data_request_tx, 0, sizeof(struct mac_data_req));
memset(&data_request_rx, 0, sizeof(struct mac_data_req)); memset(&data_request_rx, 0, sizeof(struct mac_data_req));
memset(&data_ind_tx, 0, sizeof(struct mac_data_ind)); memset(&data_ind_tx, 0, sizeof(struct mac_data_ind));
@@ -616,19 +589,15 @@ void rlc_am_v9_3_0_test_exchange_pdus(rlc_am_entity_t *am_txP,
memset(&tx_status, 0, sizeof(struct mac_status_ind)); memset(&tx_status, 0, sizeof(struct mac_status_ind));
memset(&mac_rlc_status_resp_tx, 0, sizeof(struct mac_status_resp)); memset(&mac_rlc_status_resp_tx, 0, sizeof(struct mac_status_resp));
memset(&mac_rlc_status_resp_rx, 0, sizeof(struct mac_status_resp)); memset(&mac_rlc_status_resp_rx, 0, sizeof(struct mac_status_resp));
mac_rlc_status_resp_tx = rlc_am_mac_status_indication(am_txP, g_frame, bytes_txP, tx_status); mac_rlc_status_resp_tx = rlc_am_mac_status_indication(am_txP, g_frame, bytes_txP, tx_status);
data_request_tx = rlc_am_mac_data_request(am_txP, g_frame); data_request_tx = rlc_am_mac_data_request(am_txP, g_frame);
mac_rlc_status_resp_rx = rlc_am_mac_status_indication(am_rxP, g_frame, bytes_rxP, tx_status); mac_rlc_status_resp_rx = rlc_am_mac_status_indication(am_rxP, g_frame, bytes_rxP, tx_status);
data_request_rx = rlc_am_mac_data_request(am_rxP, g_frame); data_request_rx = rlc_am_mac_data_request(am_rxP, g_frame);
rlc_am_v9_3_0_test_mac_rlc_loop(&data_ind_rx, &data_request_tx, &g_drop_tx, &g_tx_packets, &g_dropped_tx_packets); rlc_am_v9_3_0_test_mac_rlc_loop(&data_ind_rx, &data_request_tx, &g_drop_tx, &g_tx_packets, &g_dropped_tx_packets);
rlc_am_v9_3_0_test_mac_rlc_loop(&data_ind_tx, &data_request_rx, &g_drop_rx, &g_rx_packets, &g_dropped_rx_packets); rlc_am_v9_3_0_test_mac_rlc_loop(&data_ind_tx, &data_request_rx, &g_drop_rx, &g_rx_packets, &g_dropped_rx_packets);
rlc_am_mac_data_indication(am_rxP, g_frame, am_txP->is_enb, data_ind_rx); rlc_am_mac_data_indication(am_rxP, g_frame, am_txP->is_enb, data_ind_rx);
rlc_am_mac_data_indication(am_txP, g_frame, am_txP->is_enb, data_ind_tx); rlc_am_mac_data_indication(am_txP, g_frame, am_txP->is_enb, data_ind_tx);
g_frame += 1; g_frame += 1;
//rlc_am_tx_buffer_display(am_txP,NULL); //rlc_am_tx_buffer_display(am_txP,NULL);
//assert(am_txP->t_status_prohibit.time_out != 1); //assert(am_txP->t_status_prohibit.time_out != 1);
//assert(am_rxP->t_status_prohibit.time_out != 1); //assert(am_rxP->t_status_prohibit.time_out != 1);
@@ -660,14 +629,12 @@ void rlc_am_v9_3_0_test_data_ind (module_id_t module_idP, rb_id_t rb_idP, sdu_si
assert(g_send_id_write_index[rb_idP^1] > g_send_id_read_index[rb_idP]); assert(g_send_id_write_index[rb_idP^1] > g_send_id_read_index[rb_idP]);
if (g_send_sdu_ids[g_send_id_read_index[rb_idP]][rb_idP^1] != i) { if (g_send_sdu_ids[g_send_id_read_index[rb_idP]][rb_idP^1] != i) {
printf("[FRAME %05d][RLC][MOD %d][RB %d][DATA-IND] g_send_sdu_ids[%d] = %d\n",g_frame,module_idP, rb_idP, g_send_id_read_index[rb_idP]-2, printf("[FRAME %05d][RLC][MOD %d][RB %d][DATA-IND] g_send_sdu_ids[%d] = %d\n",g_frame,module_idP, rb_idP, g_send_id_read_index[rb_idP]-2,
g_send_sdu_ids[g_send_id_read_index[rb_idP]-2][rb_idP^1]); g_send_sdu_ids[g_send_id_read_index[rb_idP]-2][rb_idP^1]);
printf("[FRAME %05d][RLC][MOD %d][RB %d][DATA-IND] g_send_sdu_ids[%d] = %d\n",g_frame,module_idP, rb_idP, g_send_id_read_index[rb_idP]-1, printf("[FRAME %05d][RLC][MOD %d][RB %d][DATA-IND] g_send_sdu_ids[%d] = %d\n",g_frame,module_idP, rb_idP, g_send_id_read_index[rb_idP]-1,
g_send_sdu_ids[g_send_id_read_index[rb_idP]-1][rb_idP^1]); g_send_sdu_ids[g_send_id_read_index[rb_idP]-1][rb_idP^1]);
printf("[FRAME %05d][RLC][MOD %d][RB %d][DATA-IND] g_send_sdu_ids[%d] = %d\n",g_frame,module_idP, rb_idP, g_send_id_read_index[rb_idP], printf("[FRAME %05d][RLC][MOD %d][RB %d][DATA-IND] g_send_sdu_ids[%d] = %d\n",g_frame,module_idP, rb_idP, g_send_id_read_index[rb_idP],
g_send_sdu_ids[g_send_id_read_index[rb_idP]][rb_idP^1]); g_send_sdu_ids[g_send_id_read_index[rb_idP]][rb_idP^1]);
printf("[FRAME %05d][RLC][MOD %d][RB %d][DATA-IND] g_send_id_read_index = %d sdu sent = %d\n",g_frame,module_idP, rb_idP, g_send_id_read_index[rb_idP], i); printf("[FRAME %05d][RLC][MOD %d][RB %d][DATA-IND] g_send_id_read_index = %d sdu sent = %d\n",g_frame,module_idP, rb_idP, g_send_id_read_index[rb_idP], i);
} }
@@ -693,17 +660,13 @@ void rlc_am_v9_3_0_test_tx_rx()
uint32_t t_reordering = 5000; uint32_t t_reordering = 5000;
uint32_t t_status_prohibit = 10; uint32_t t_status_prohibit = 10;
int i,j,r; int i,j,r;
srand (0); srand (0);
rlc_am_init(&g_am_tx, g_frame); rlc_am_init(&g_am_tx, g_frame);
rlc_am_init(&g_am_rx, g_frame); rlc_am_init(&g_am_rx, g_frame);
rlc_am_set_debug_infos(&g_am_tx, g_frame, 0, 0, 0, 1, 1 /* LC-id = DRB-id */); rlc_am_set_debug_infos(&g_am_tx, g_frame, 0, 0, 0, 1, 1 /* LC-id = DRB-id */);
rlc_am_set_debug_infos(&g_am_rx, g_frame, 1, 1, 1, 1, 1 /* LC-id = DRB-id */); rlc_am_set_debug_infos(&g_am_rx, g_frame, 1, 1, 1, 1, 1 /* LC-id = DRB-id */);
rlc_am_configure(&g_am_tx, g_frame, max_retx_threshold, poll_pdu, poll_byte, t_poll_retransmit, t_reordering, t_status_prohibit); rlc_am_configure(&g_am_tx, g_frame, max_retx_threshold, poll_pdu, poll_byte, t_poll_retransmit, t_reordering, t_status_prohibit);
rlc_am_configure(&g_am_rx, g_frame, max_retx_threshold, poll_pdu, poll_byte, t_poll_retransmit, t_reordering, t_status_prohibit); rlc_am_configure(&g_am_rx, g_frame, max_retx_threshold, poll_pdu, poll_byte, t_poll_retransmit, t_reordering, t_status_prohibit);
#ifdef TEST1 #ifdef TEST1
srand (0); srand (0);
rlc_am_v9_3_0_test_reset_sdus(); rlc_am_v9_3_0_test_reset_sdus();
@@ -730,7 +693,6 @@ void rlc_am_v9_3_0_test_tx_rx()
rlc_am_rx_list_display(&g_am_rx, "RLC-AM RX:"); rlc_am_rx_list_display(&g_am_rx, "RLC-AM RX:");
assert (g_send_id_read_index[1] == g_send_id_write_index[0]); assert (g_send_id_read_index[1] == g_send_id_write_index[0]);
printf("\n\n\n\n\n\n-----------------------------------------------------------------------------------------rlc_am_v9_3_0_test 1: END OF SIMPLE TEST SEVERAL SDUs IN PDU\n\n\n\n"); printf("\n\n\n\n\n\n-----------------------------------------------------------------------------------------rlc_am_v9_3_0_test 1: END OF SIMPLE TEST SEVERAL SDUs IN PDU\n\n\n\n");
rlc_am_v9_3_0_test_reset_sdus(); rlc_am_v9_3_0_test_reset_sdus();
// RANDOM TESTS // RANDOM TESTS
@@ -800,7 +762,6 @@ void rlc_am_v9_3_0_test_tx_rx()
rlc_am_v9_3_0_test_exchange_pdus(&g_am_tx, &g_am_rx, 2000, 200); rlc_am_v9_3_0_test_exchange_pdus(&g_am_tx, &g_am_rx, 2000, 200);
rlc_am_v9_3_0_test_exchange_pdus(&g_am_tx, &g_am_rx, 2000, 200); rlc_am_v9_3_0_test_exchange_pdus(&g_am_tx, &g_am_rx, 2000, 200);
rlc_am_v9_3_0_test_exchange_pdus(&g_am_tx, &g_am_rx, 2000, 200); rlc_am_v9_3_0_test_exchange_pdus(&g_am_tx, &g_am_rx, 2000, 200);
rlc_am_v9_3_0_test_send_sdu(&g_am_tx, 1); rlc_am_v9_3_0_test_send_sdu(&g_am_tx, 1);
rlc_am_v9_3_0_test_exchange_pdus(&g_am_tx, &g_am_rx, 30, 200); rlc_am_v9_3_0_test_exchange_pdus(&g_am_tx, &g_am_rx, 30, 200);
rlc_am_v9_3_0_test_exchange_pdus(&g_am_tx, &g_am_rx, 31, 200); rlc_am_v9_3_0_test_exchange_pdus(&g_am_tx, &g_am_rx, 31, 200);
@@ -957,7 +918,6 @@ void rlc_am_v9_3_0_test_tx_rx()
rlc_am_v9_3_0_test_exchange_pdus(&g_am_tx, &g_am_rx, 15, 100); rlc_am_v9_3_0_test_exchange_pdus(&g_am_tx, &g_am_rx, 15, 100);
rlc_am_v9_3_0_test_exchange_pdus(&g_am_tx, &g_am_rx, 15, 100); rlc_am_v9_3_0_test_exchange_pdus(&g_am_tx, &g_am_rx, 15, 100);
rlc_am_v9_3_0_test_exchange_pdus(&g_am_tx, &g_am_rx, 15, 100); rlc_am_v9_3_0_test_exchange_pdus(&g_am_tx, &g_am_rx, 15, 100);
t_poll_retransmit = 6; t_poll_retransmit = 6;
rlc_am_configure(&g_am_tx, g_frame, max_retx_threshold, poll_pdu, poll_byte, t_poll_retransmit, t_reordering, t_status_prohibit); rlc_am_configure(&g_am_tx, g_frame, max_retx_threshold, poll_pdu, poll_byte, t_poll_retransmit, t_reordering, t_status_prohibit);
@@ -1178,7 +1138,6 @@ void rlc_am_v9_3_0_test_tx_rx()
assert (g_send_id_read_index[0] == g_send_id_write_index[1]); assert (g_send_id_read_index[0] == g_send_id_write_index[1]);
printf("REAL BLER TX=%d (TARGET=%d) BLER RX=%d (TARGET=%d) \n",(g_dropped_tx_packets*100)/g_tx_packets, g_target_tx_error_rate, printf("REAL BLER TX=%d (TARGET=%d) BLER RX=%d (TARGET=%d) \n",(g_dropped_tx_packets*100)/g_tx_packets, g_target_tx_error_rate,
(g_dropped_rx_packets*100)/g_rx_packets, g_target_rx_error_rate); (g_dropped_rx_packets*100)/g_rx_packets, g_target_rx_error_rate);
} }
} }
@@ -1193,11 +1152,10 @@ void rlc_am_v9_3_0_test_print_trace (void)
size_t size; size_t size;
char **strings; char **strings;
size_t i; size_t i;
size = backtrace (array, 100); size = backtrace (array, 100);
strings = backtrace_symbols (array, size); strings = backtrace_symbols (array, size);
printf ("Obtained %lu stack frames.\n", (unsigned long)size);
printf ("Obtained %d 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]);
@@ -1213,15 +1171,10 @@ void rlc_am_v9_3_0_test(void)
// initscr(); // initscr();
// cbreak(); // cbreak();
// keypad(stdscr, TRUE); // keypad(stdscr, TRUE);
// under test // under test
pool_buffer_init(); pool_buffer_init();
set_comp_log(RLC, LOG_ERR, LOG_MED, 1); set_comp_log(RLC, LOG_ERR, LOG_MED, 1);
rlc_am_v9_3_0_test_tx_rx(); rlc_am_v9_3_0_test_tx_rx();
// already tested // already tested
rlc_am_v9_3_0_test_windows(); rlc_am_v9_3_0_test_windows();
rlc_am_v9_3_0_test_read_write_bit_field(); rlc_am_v9_3_0_test_read_write_bit_field();
+16 -104
View File
@@ -125,7 +125,7 @@ static int8_t *g_sdus[] = {"En dépit de son volontarisme affiché, le premier m
#define RLC_2_PRINT_BUFFER_LEN 10000 #define RLC_2_PRINT_BUFFER_LEN 10000
static char rlc_2_print_buffer[RLC_2_PRINT_BUFFER_LEN]; static char rlc_2_print_buffer[RLC_2_PRINT_BUFFER_LEN];
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void rlc_util_print_hex_octets(comp_name_t componentP, unsigned char* dataP, unsigned long sizeP) void rlc_util_print_hex_octets(comp_name_t componentP, unsigned char *dataP, unsigned long sizeP)
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
{ {
unsigned long octet_index = 0; unsigned long octet_index = 0;
@@ -136,7 +136,6 @@ void rlc_util_print_hex_octets(comp_name_t componentP, unsigned char* dataP, uns
return; return;
} }
LOG_D(RLC, "------+-------------------------------------------------|\n"); LOG_D(RLC, "------+-------------------------------------------------|\n");
LOG_D(RLC, " | 0 1 2 3 4 5 6 7 8 9 a b c d e f |\n"); LOG_D(RLC, " | 0 1 2 3 4 5 6 7 8 9 a b c d e f |\n");
LOG_D(RLC, "------+-------------------------------------------------|\n"); LOG_D(RLC, "------+-------------------------------------------------|\n");
@@ -149,7 +148,8 @@ void rlc_util_print_hex_octets(comp_name_t componentP, unsigned char* dataP, uns
buffer_marker = 0; buffer_marker = 0;
} }
buffer_marker+=snprintf(&rlc_2_print_buffer[buffer_marker], RLC_2_PRINT_BUFFER_LEN - buffer_marker, " %04ld |", octet_index); buffer_marker+=snprintf(&rlc_2_print_buffer[buffer_marker], RLC_2_PRINT_BUFFER_LEN - buffer_marker,
" %04lu |", octet_index);
} }
/* /*
@@ -180,17 +180,13 @@ void rlc_um_v9_3_0_test_windows_10()
rlc_um_entity_t um1; rlc_um_entity_t um1;
rlc_um_entity_t um2; rlc_um_entity_t um2;
unsigned int h,w, sn, result; unsigned int h,w, sn, result;
uint32_t timer_reordering = 2000; uint32_t timer_reordering = 2000;
uint32_t sn_field_length = 10; uint32_t sn_field_length = 10;
uint32_t is_mXch = 0; // boolean, true if configured for MTCH or MCCH uint32_t is_mXch = 0; // boolean, true if configured for MTCH or MCCH
rlc_um_init(&um1); rlc_um_init(&um1);
rlc_um_init(&um2); rlc_um_init(&um2);
rlc_um_set_debug_infos(&um1, g_frame, 0, 0, 0, 1, 1 /*LC-id = RAB-id*/); rlc_um_set_debug_infos(&um1, g_frame, 0, 0, 0, 1, 1 /*LC-id = RAB-id*/);
rlc_um_set_debug_infos(&um2, g_frame, 1, 1, 1, 1, 1 /*LC-id = RAB-id*/); rlc_um_set_debug_infos(&um2, g_frame, 1, 1, 1, 1, 1 /*LC-id = RAB-id*/);
rlc_um_configure(&um1, g_frame, timer_reordering, sn_field_length, sn_field_length, is_mXch); rlc_um_configure(&um1, g_frame, timer_reordering, sn_field_length, sn_field_length, is_mXch);
rlc_um_configure(&um2, g_frame, timer_reordering, sn_field_length, sn_field_length, is_mXch); rlc_um_configure(&um2, g_frame, timer_reordering, sn_field_length, sn_field_length, is_mXch);
@@ -223,7 +219,6 @@ void rlc_um_v9_3_0_test_windows_10()
assert(rlc_um_in_window(&um1, g_frame, (um1.vr_uh - um1.rx_um_window_size) & RLC_UM_SN_10_BITS_MASK, sn, (um1.vr_uh -1) & RLC_UM_SN_10_BITS_MASK) < 0); assert(rlc_um_in_window(&um1, g_frame, (um1.vr_uh - um1.rx_um_window_size) & RLC_UM_SN_10_BITS_MASK, sn, (um1.vr_uh -1) & RLC_UM_SN_10_BITS_MASK) < 0);
assert(rlc_um_in_reordering_window(&um1, g_frame, sn) < 0); assert(rlc_um_in_reordering_window(&um1, g_frame, sn) < 0);
} }
} }
} }
} }
@@ -234,17 +229,13 @@ void rlc_um_v9_3_0_test_windows_5()
rlc_um_entity_t um1; rlc_um_entity_t um1;
rlc_um_entity_t um2; rlc_um_entity_t um2;
unsigned int h,w, sn, result; unsigned int h,w, sn, result;
uint32_t timer_reordering = 2000; uint32_t timer_reordering = 2000;
uint32_t sn_field_length = 5; uint32_t sn_field_length = 5;
uint32_t is_mXch = 0; // boolean, true if configured for MTCH or MCCH uint32_t is_mXch = 0; // boolean, true if configured for MTCH or MCCH
rlc_um_init(&um1); rlc_um_init(&um1);
rlc_um_init(&um2); rlc_um_init(&um2);
rlc_um_set_debug_infos(&um1, g_frame, 0, 0, 0, 1, 1 /* LC-id = DRB-id */); rlc_um_set_debug_infos(&um1, g_frame, 0, 0, 0, 1, 1 /* LC-id = DRB-id */);
rlc_um_set_debug_infos(&um2, g_frame, 1, 1, 1, 1, 1 /* LC-id = DRB-id */); rlc_um_set_debug_infos(&um2, g_frame, 1, 1, 1, 1, 1 /* LC-id = DRB-id */);
rlc_um_configure(&um1, g_frame, timer_reordering, sn_field_length, sn_field_length, is_mXch); rlc_um_configure(&um1, g_frame, timer_reordering, sn_field_length, sn_field_length, is_mXch);
rlc_um_configure(&um2, g_frame, timer_reordering, sn_field_length, sn_field_length, is_mXch); rlc_um_configure(&um2, g_frame, timer_reordering, sn_field_length, sn_field_length, is_mXch);
@@ -277,7 +268,6 @@ void rlc_um_v9_3_0_test_windows_5()
assert(rlc_um_in_window(&um1, g_frame, (um1.vr_uh - um1.rx_um_window_size) & RLC_UM_SN_5_BITS_MASK, sn, (um1.vr_uh -1) & RLC_UM_SN_5_BITS_MASK) < 0); assert(rlc_um_in_window(&um1, g_frame, (um1.vr_uh - um1.rx_um_window_size) & RLC_UM_SN_5_BITS_MASK, sn, (um1.vr_uh -1) & RLC_UM_SN_5_BITS_MASK) < 0);
assert(rlc_um_in_reordering_window(&um1, g_frame, sn) < 0); assert(rlc_um_in_reordering_window(&um1, g_frame, sn) < 0);
} }
} }
} }
} }
@@ -308,25 +298,23 @@ void rlc_um_v9_3_0_test_send_sdu(rlc_um_entity_t *um_txP, int sdu_indexP)
printf("[FRAME %05d][RLC][MOD %02d][RB %02d] TX SDU %d %04d bytes\n",g_frame,um_txP->module_id, um_txP->rb_id, sdu_indexP, strlen(g_sdus[sdu_indexP]) + 1); printf("[FRAME %05d][RLC][MOD %02d][RB %02d] TX SDU %d %04d bytes\n",g_frame,um_txP->module_id, um_txP->rb_id, sdu_indexP, strlen(g_sdus[sdu_indexP]) + 1);
memset (sdu->data, 0, sizeof (struct rlc_um_data_req_alloc)); memset (sdu->data, 0, sizeof (struct rlc_um_data_req_alloc));
strcpy (&sdu->data[sizeof (struct rlc_um_data_req_alloc)],g_sdus[sdu_indexP]); strcpy (&sdu->data[sizeof (struct rlc_um_data_req_alloc)],g_sdus[sdu_indexP]);
((struct rlc_um_data_req *) (sdu->data))->data_size = strlen(g_sdus[sdu_indexP])+ 1; ((struct rlc_um_data_req *) (sdu->data))->data_size = strlen(g_sdus[sdu_indexP])+ 1;
((struct rlc_um_data_req *) (sdu->data))->data_offset = sizeof (struct rlc_um_data_req_alloc); ((struct rlc_um_data_req *) (sdu->data))->data_offset = sizeof (struct rlc_um_data_req_alloc);
rlc_um_data_req(um_txP, g_frame, sdu); rlc_um_data_req(um_txP, g_frame, sdu);
g_send_sdu_ids[g_send_id_write_index[um_txP->rb_id]++][um_txP->rb_id] = sdu_indexP; g_send_sdu_ids[g_send_id_write_index[um_txP->rb_id]++][um_txP->rb_id] = sdu_indexP;
assert(g_send_id_write_index[um_txP->rb_id] < TEST_MAX_SEND_SDU); assert(g_send_id_write_index[um_txP->rb_id] < TEST_MAX_SEND_SDU);
} else { } else {
printf("Out of memory error\n"); printf("Out of memory error\n");
// exit(-1); // exit(-1);
} }
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void rlc_um_v9_3_0_buffer_delayed_rx_mac_data_ind(struct mac_data_ind* data_indP, signed int time_delayedP) void rlc_um_v9_3_0_buffer_delayed_rx_mac_data_ind(struct mac_data_ind *data_indP, signed int time_delayedP)
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
{ {
int frame_modulo; int frame_modulo;
mem_block_t* tb; mem_block_t *tb;
if (time_delayedP <= 0) { if (time_delayedP <= 0) {
frame_modulo = g_frame % MAX_TIME_DELAYED_PDU_DUE_TO_HARQ; frame_modulo = g_frame % MAX_TIME_DELAYED_PDU_DUE_TO_HARQ;
@@ -351,11 +339,11 @@ void rlc_um_v9_3_0_buffer_delayed_rx_mac_data_ind(struct mac_data_ind* data_indP
assert(data_indP->data.head == NULL); assert(data_indP->data.head == NULL);
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void rlc_um_v9_3_0_buffer_delayed_tx_mac_data_ind(struct mac_data_ind* data_indP, signed int time_delayedP) void rlc_um_v9_3_0_buffer_delayed_tx_mac_data_ind(struct mac_data_ind *data_indP, signed int time_delayedP)
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
{ {
int frame_modulo; int frame_modulo;
mem_block_t* tb; mem_block_t *tb;
if (time_delayedP <= 0) { if (time_delayedP <= 0) {
frame_modulo = g_frame % MAX_TIME_DELAYED_PDU_DUE_TO_HARQ; frame_modulo = g_frame % MAX_TIME_DELAYED_PDU_DUE_TO_HARQ;
@@ -381,16 +369,13 @@ void rlc_um_v9_3_0_buffer_delayed_tx_mac_data_ind(struct mac_data_ind* data_indP
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void rlc_um_v9_3_0_test_mac_rlc_loop (struct mac_data_ind* data_indP, struct mac_data_req* data_requestP, int* drop_countP, int* tx_packetsP, void rlc_um_v9_3_0_test_mac_rlc_loop (struct mac_data_ind *data_indP, struct mac_data_req *data_requestP, int *drop_countP, int *tx_packetsP,
int* dropped_tx_packetsP) int *dropped_tx_packetsP)
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
{ {
mem_block_t *tb_src;
mem_block_t *tb_dst;
mem_block_t* tb_src;
mem_block_t* tb_dst;
unsigned int tb_size; unsigned int tb_size;
data_indP->no_tb = 0; data_indP->no_tb = 0;
while (data_requestP->data.nb_elements > 0) { while (data_requestP->data.nb_elements > 0) {
@@ -398,14 +383,14 @@ void rlc_um_v9_3_0_test_mac_rlc_loop (struct mac_data_ind* data_indP, struct ma
if (tb_src != NULL) { if (tb_src != NULL) {
tb_size = ((struct mac_tb_req *) (tb_src->data))->tb_size_in_bits >> 3; tb_size = ((struct mac_tb_req *) (tb_src->data))->tb_size_in_bits >> 3;
printf("[RLC-LOOP] FOUND TB SIZE IN BITS %d IN BYTES %d sizeof (mac_rlc_max_rx_header_size_t) %d\n", printf("[RLC-LOOP] FOUND TB SIZE IN BITS %d IN BYTES %u sizeof (mac_rlc_max_rx_header_size_t) %d\n",
((struct mac_tb_req *) (tb_src->data))->tb_size_in_bits, ((struct mac_tb_req *) (tb_src->data))->tb_size_in_bits,
tb_size, sizeof (mac_rlc_max_rx_header_size_t)); tb_size, sizeof (mac_rlc_max_rx_header_size_t));
*tx_packetsP = *tx_packetsP + 1; *tx_packetsP = *tx_packetsP + 1;
if (*drop_countP == 0) { if (*drop_countP == 0) {
tb_dst = get_free_mem_block(sizeof (mac_rlc_max_rx_header_size_t) + tb_size, __func__); tb_dst = get_free_mem_block(sizeof (mac_rlc_max_rx_header_size_t) + tb_size, __func__);
if (tb_dst != NULL) { if (tb_dst != NULL) {
memset(tb_dst->data, 0, sizeof (mac_rlc_max_rx_header_size_t) + tb_size); memset(tb_dst->data, 0, sizeof (mac_rlc_max_rx_header_size_t) + tb_size);
//printf("[RLC-LOOP] Testing tb_dst (1)\n"); //printf("[RLC-LOOP] Testing tb_dst (1)\n");
@@ -415,18 +400,16 @@ void rlc_um_v9_3_0_test_mac_rlc_loop (struct mac_data_ind* data_indP, struct ma
((struct mac_tb_ind *) (tb_dst->data))->data_ptr = &tb_dst->data[sizeof (mac_rlc_max_rx_header_size_t)]; ((struct mac_tb_ind *) (tb_dst->data))->data_ptr = &tb_dst->data[sizeof (mac_rlc_max_rx_header_size_t)];
((struct mac_tb_ind *) (tb_dst->data))->size = tb_size; ((struct mac_tb_ind *) (tb_dst->data))->size = tb_size;
((struct mac_tb_ind *) (tb_dst->data))->error_indication = 0; ((struct mac_tb_ind *) (tb_dst->data))->error_indication = 0;
memcpy(((struct mac_tb_ind *) (tb_dst->data))->data_ptr, memcpy(((struct mac_tb_ind *) (tb_dst->data))->data_ptr,
&((struct mac_tb_req *) (tb_src->data))->data_ptr[0], &((struct mac_tb_req *) (tb_src->data))->data_ptr[0],
tb_size); tb_size);
list_add_tail_eurecom(tb_dst, &data_indP->data); list_add_tail_eurecom(tb_dst, &data_indP->data);
data_indP->no_tb += 1; data_indP->no_tb += 1;
//printf("[RLC-LOOP] Testing tb_dst (2)\n"); //printf("[RLC-LOOP] Testing tb_dst (2)\n");
check_free_mem_block(tb_dst, __func__); check_free_mem_block(tb_dst, __func__);
} else { } else {
printf("Out of memory error\n"); printf("Out of memory error\n");
// exit(-1); // exit(-1);
} }
} else { } else {
printf("[RLC-LOOP] DROPPING 1 TB\n"); printf("[RLC-LOOP] DROPPING 1 TB\n");
@@ -434,10 +417,8 @@ void rlc_um_v9_3_0_test_mac_rlc_loop (struct mac_data_ind* data_indP, struct ma
*dropped_tx_packetsP = *dropped_tx_packetsP + 1; *dropped_tx_packetsP = *dropped_tx_packetsP + 1;
} }
//printf("[RLC-LOOP] Testing tb_src\n"); //printf("[RLC-LOOP] Testing tb_src\n");
check_free_mem_block(tb_src, __func__); check_free_mem_block(tb_src, __func__);
free_mem_block(tb_src, __func__); free_mem_block(tb_src, __func__);
if (data_indP->no_tb > 0) { if (data_indP->no_tb > 0) {
@@ -460,8 +441,6 @@ void rlc_um_v9_3_0_test_exchange_pdus(rlc_um_entity_t *um_txP,
struct mac_status_ind tx_status; struct mac_status_ind tx_status;
struct mac_status_resp mac_rlc_status_resp_tx; struct mac_status_resp mac_rlc_status_resp_tx;
struct mac_status_resp mac_rlc_status_resp_rx; struct mac_status_resp mac_rlc_status_resp_rx;
memset(&data_request_tx, 0, sizeof(struct mac_data_req)); memset(&data_request_tx, 0, sizeof(struct mac_data_req));
memset(&data_request_rx, 0, sizeof(struct mac_data_req)); memset(&data_request_rx, 0, sizeof(struct mac_data_req));
memset(&data_ind_tx, 0, sizeof(struct mac_data_ind)); memset(&data_ind_tx, 0, sizeof(struct mac_data_ind));
@@ -469,13 +448,10 @@ void rlc_um_v9_3_0_test_exchange_pdus(rlc_um_entity_t *um_txP,
memset(&tx_status, 0, sizeof(struct mac_status_ind)); memset(&tx_status, 0, sizeof(struct mac_status_ind));
memset(&mac_rlc_status_resp_tx, 0, sizeof(struct mac_status_resp)); memset(&mac_rlc_status_resp_tx, 0, sizeof(struct mac_status_resp));
memset(&mac_rlc_status_resp_rx, 0, sizeof(struct mac_status_resp)); memset(&mac_rlc_status_resp_rx, 0, sizeof(struct mac_status_resp));
mac_rlc_status_resp_tx = rlc_um_mac_status_indication(um_txP, g_frame, 1, bytes_txP, tx_status,ENB_FLAG_YES); mac_rlc_status_resp_tx = rlc_um_mac_status_indication(um_txP, g_frame, 1, bytes_txP, tx_status,ENB_FLAG_YES);
data_request_tx = rlc_um_mac_data_request(um_txP, g_frame); data_request_tx = rlc_um_mac_data_request(um_txP, g_frame);
mac_rlc_status_resp_rx = rlc_um_mac_status_indication(um_rxP, g_frame, 0, bytes_rxP, tx_status,ENB_FLAG_YES); mac_rlc_status_resp_rx = rlc_um_mac_status_indication(um_rxP, g_frame, 0, bytes_rxP, tx_status,ENB_FLAG_YES);
data_request_rx = rlc_um_mac_data_request(um_rxP, g_frame); data_request_rx = rlc_um_mac_data_request(um_rxP, g_frame);
rlc_um_v9_3_0_test_mac_rlc_loop(&data_ind_rx, &data_request_tx, &g_drop_tx, &g_tx_packets, &g_dropped_tx_packets); rlc_um_v9_3_0_test_mac_rlc_loop(&data_ind_rx, &data_request_tx, &g_drop_tx, &g_tx_packets, &g_dropped_tx_packets);
rlc_um_v9_3_0_test_mac_rlc_loop(&data_ind_tx, &data_request_rx, &g_drop_rx, &g_rx_packets, &g_dropped_rx_packets); rlc_um_v9_3_0_test_mac_rlc_loop(&data_ind_tx, &data_request_rx, &g_drop_rx, &g_rx_packets, &g_dropped_rx_packets);
rlc_um_mac_data_indication(um_rxP, g_frame, um_rxP->is_enb, data_ind_rx); rlc_um_mac_data_indication(um_rxP, g_frame, um_rxP->is_enb, data_ind_rx);
@@ -506,8 +482,6 @@ void rlc_um_v9_3_0_test_exchange_delayed_pdus(rlc_um_entity_t *um_txP,
struct mac_status_resp mac_rlc_status_resp_tx; struct mac_status_resp mac_rlc_status_resp_tx;
struct mac_status_resp mac_rlc_status_resp_rx; struct mac_status_resp mac_rlc_status_resp_rx;
int frame_modulo = g_frame % MAX_TIME_DELAYED_PDU_DUE_TO_HARQ; int frame_modulo = g_frame % MAX_TIME_DELAYED_PDU_DUE_TO_HARQ;
memset(&data_request_tx, 0, sizeof(struct mac_data_req)); memset(&data_request_tx, 0, sizeof(struct mac_data_req));
memset(&data_request_rx, 0, sizeof(struct mac_data_req)); memset(&data_request_rx, 0, sizeof(struct mac_data_req));
memset(&data_ind_tx, 0, sizeof(struct mac_data_ind)); memset(&data_ind_tx, 0, sizeof(struct mac_data_ind));
@@ -515,23 +489,16 @@ void rlc_um_v9_3_0_test_exchange_delayed_pdus(rlc_um_entity_t *um_txP,
memset(&tx_status, 0, sizeof(struct mac_status_ind)); memset(&tx_status, 0, sizeof(struct mac_status_ind));
memset(&mac_rlc_status_resp_tx, 0, sizeof(struct mac_status_resp)); memset(&mac_rlc_status_resp_tx, 0, sizeof(struct mac_status_resp));
memset(&mac_rlc_status_resp_rx, 0, sizeof(struct mac_status_resp)); memset(&mac_rlc_status_resp_rx, 0, sizeof(struct mac_status_resp));
mac_rlc_status_resp_tx = rlc_um_mac_status_indication(um_txP, g_frame, 1, bytes_txP, tx_status,ENB_FLAG_YES); mac_rlc_status_resp_tx = rlc_um_mac_status_indication(um_txP, g_frame, 1, bytes_txP, tx_status,ENB_FLAG_YES);
data_request_tx = rlc_um_mac_data_request(um_txP, g_frame); data_request_tx = rlc_um_mac_data_request(um_txP, g_frame);
mac_rlc_status_resp_rx = rlc_um_mac_status_indication(um_rxP, g_frame, 0, bytes_rxP, tx_status,ENB_FLAG_YES); mac_rlc_status_resp_rx = rlc_um_mac_status_indication(um_rxP, g_frame, 0, bytes_rxP, tx_status,ENB_FLAG_YES);
data_request_rx = rlc_um_mac_data_request(um_rxP, g_frame); data_request_rx = rlc_um_mac_data_request(um_rxP, g_frame);
rlc_um_v9_3_0_test_mac_rlc_loop(&data_ind_rx, &data_request_tx, &g_drop_tx, &g_tx_packets, &g_dropped_tx_packets); rlc_um_v9_3_0_test_mac_rlc_loop(&data_ind_rx, &data_request_tx, &g_drop_tx, &g_tx_packets, &g_dropped_tx_packets);
rlc_um_v9_3_0_test_mac_rlc_loop(&data_ind_tx, &data_request_rx, &g_drop_rx, &g_rx_packets, &g_dropped_rx_packets); rlc_um_v9_3_0_test_mac_rlc_loop(&data_ind_tx, &data_request_rx, &g_drop_rx, &g_rx_packets, &g_dropped_rx_packets);
rlc_um_v9_3_0_buffer_delayed_rx_mac_data_ind(&data_ind_rx, time_tx_delayedP); rlc_um_v9_3_0_buffer_delayed_rx_mac_data_ind(&data_ind_rx, time_tx_delayedP);
rlc_um_v9_3_0_buffer_delayed_tx_mac_data_ind(&data_ind_tx, time_rx_delayedP); rlc_um_v9_3_0_buffer_delayed_tx_mac_data_ind(&data_ind_tx, time_rx_delayedP);
rlc_um_mac_data_indication(um_rxP, g_frame, um_rxP->is_enb, g_rx_delayed_indications[frame_modulo]); rlc_um_mac_data_indication(um_rxP, g_frame, um_rxP->is_enb, g_rx_delayed_indications[frame_modulo]);
memset(&g_rx_delayed_indications[frame_modulo], 0, sizeof(struct mac_data_ind)); memset(&g_rx_delayed_indications[frame_modulo], 0, sizeof(struct mac_data_ind));
rlc_um_mac_data_indication(um_txP, g_frame, um_txP->is_enb, g_tx_delayed_indications[frame_modulo]); rlc_um_mac_data_indication(um_txP, g_frame, um_txP->is_enb, g_tx_delayed_indications[frame_modulo]);
memset(&g_tx_delayed_indications[frame_modulo], 0, sizeof(struct mac_data_ind)); memset(&g_tx_delayed_indications[frame_modulo], 0, sizeof(struct mac_data_ind));
@@ -564,14 +531,12 @@ void rlc_um_v9_3_0_test_data_ind (module_id_t module_idP, rb_id_t rb_idP, sdu_si
assert(g_send_id_write_index[rb_idP^1] > g_send_id_read_index[rb_idP]); assert(g_send_id_write_index[rb_idP^1] > g_send_id_read_index[rb_idP]);
if (g_send_sdu_ids[g_send_id_read_index[rb_idP]][rb_idP^1] != i) { if (g_send_sdu_ids[g_send_id_read_index[rb_idP]][rb_idP^1] != i) {
printf("[FRAME %05d][RLC][MOD %d][RB %d][DATA-IND] g_send_sdu_ids[%d] = %d\n",g_frame,module_idP, rb_idP, g_send_id_read_index[rb_idP]-2, printf("[FRAME %05d][RLC][MOD %d][RB %d][DATA-IND] g_send_sdu_ids[%d] = %d\n",g_frame,module_idP, rb_idP, g_send_id_read_index[rb_idP]-2,
g_send_sdu_ids[g_send_id_read_index[rb_idP]-2][rb_idP^1]); g_send_sdu_ids[g_send_id_read_index[rb_idP]-2][rb_idP^1]);
printf("[FRAME %05d][RLC][MOD %d][RB %d][DATA-IND] g_send_sdu_ids[%d] = %d\n",g_frame,module_idP, rb_idP, g_send_id_read_index[rb_idP]-1, printf("[FRAME %05d][RLC][MOD %d][RB %d][DATA-IND] g_send_sdu_ids[%d] = %d\n",g_frame,module_idP, rb_idP, g_send_id_read_index[rb_idP]-1,
g_send_sdu_ids[g_send_id_read_index[rb_idP]-1][rb_idP^1]); g_send_sdu_ids[g_send_id_read_index[rb_idP]-1][rb_idP^1]);
printf("[FRAME %05d][RLC][MOD %d][RB %d][DATA-IND] g_send_sdu_ids[%d] = %d\n",g_frame,module_idP, rb_idP, g_send_id_read_index[rb_idP], printf("[FRAME %05d][RLC][MOD %d][RB %d][DATA-IND] g_send_sdu_ids[%d] = %d\n",g_frame,module_idP, rb_idP, g_send_id_read_index[rb_idP],
g_send_sdu_ids[g_send_id_read_index[rb_idP]][rb_idP^1]); g_send_sdu_ids[g_send_id_read_index[rb_idP]][rb_idP^1]);
printf("[FRAME %05d][RLC][MOD %d][RB %d][DATA-IND] g_send_id_read_index = %d sdu sent = %d\n",g_frame,module_idP, rb_idP, g_send_id_read_index[rb_idP], i); printf("[FRAME %05d][RLC][MOD %d][RB %d][DATA-IND] g_send_id_read_index = %d sdu sent = %d\n",g_frame,module_idP, rb_idP, g_send_id_read_index[rb_idP], i);
} }
@@ -607,23 +572,15 @@ void rlc_um_v9_3_0_test_reordering(uint32_t sn_field_lengthP)
{ {
rlc_um_info_t um_info; rlc_um_info_t um_info;
int i,j,r; int i,j,r;
um_info.timer_reordering = (32 * sn_field_lengthP * sn_field_lengthP)/100; um_info.timer_reordering = (32 * sn_field_lengthP * sn_field_lengthP)/100;
um_info.sn_field_length = sn_field_lengthP; um_info.sn_field_length = sn_field_lengthP;
um_info.is_mXch = 0; um_info.is_mXch = 0;
srand (0); srand (0);
config_req_rlc_um (&um_tx, 0,0,0, &um_info, 0, SIGNALLING_RADIO_BEARER, SIGNALLING_RADIO_BEARER /*LC-id = DRB-id*/); config_req_rlc_um (&um_tx, 0,0,0, &um_info, 0, SIGNALLING_RADIO_BEARER, SIGNALLING_RADIO_BEARER /*LC-id = DRB-id*/);
config_req_rlc_um (&um_rx, 0,1,1, &um_info, 1, SIGNALLING_RADIO_BEARER, SIGNALLING_RADIO_BEARER /*LC-id = DRB-id*/); config_req_rlc_um (&um_rx, 0,1,1, &um_info, 1, SIGNALLING_RADIO_BEARER, SIGNALLING_RADIO_BEARER /*LC-id = DRB-id*/);
rlc_um_display_rx_window(&um_tx); rlc_um_display_rx_window(&um_tx);
rlc_um_display_rx_window(&um_rx); rlc_um_display_rx_window(&um_rx);
srand (0); srand (0);
// BIG SDU SMALL PDUS NO ERRORS // BIG SDU SMALL PDUS NO ERRORS
rlc_um_v9_3_0_test_reset_sdus(); rlc_um_v9_3_0_test_reset_sdus();
@@ -665,21 +622,16 @@ void rlc_um_v9_3_0_test_reordering(uint32_t sn_field_lengthP)
rlc_um_v9_3_0_test_exchange_delayed_pdus(&um_tx, &um_rx, 2000, 200, 0, 0, INCREMENT_FRAME_YES); rlc_um_v9_3_0_test_exchange_delayed_pdus(&um_tx, &um_rx, 2000, 200, 0, 0, INCREMENT_FRAME_YES);
rlc_um_v9_3_0_test_exchange_delayed_pdus(&um_tx, &um_rx, 2000, 200, 0, 0, INCREMENT_FRAME_YES); rlc_um_v9_3_0_test_exchange_delayed_pdus(&um_tx, &um_rx, 2000, 200, 0, 0, INCREMENT_FRAME_YES);
rlc_um_v9_3_0_test_exchange_delayed_pdus(&um_tx, &um_rx, 2000, 200, 0, 0, INCREMENT_FRAME_YES); rlc_um_v9_3_0_test_exchange_delayed_pdus(&um_tx, &um_rx, 2000, 200, 0, 0, INCREMENT_FRAME_YES);
assert (g_send_id_read_index[1] == g_send_id_write_index[0]); assert (g_send_id_read_index[1] == g_send_id_write_index[0]);
printf("\n\n\n\n\n\n\n\n"); printf("\n\n\n\n\n\n\n\n");
} }
printf("\n\n\n\n\n\n-----------------------------------------------------------------------------------------rlc_um_v9_3_0_test_reordering 3: END OF TEST BIG SDU, SMALL PDUs\n\n\n\n"); printf("\n\n\n\n\n\n-----------------------------------------------------------------------------------------rlc_um_v9_3_0_test_reordering 3: END OF TEST BIG SDU, SMALL PDUs\n\n\n\n");
rlc_um_v9_3_0_test_reset_sdus(); rlc_um_v9_3_0_test_reset_sdus();
for (j = 0; j < 16; j++) { for (j = 0; j < 16; j++) {
//i = getchar(); //i = getchar();
rlc_um_v9_3_0_test_reset_sdus(); rlc_um_v9_3_0_test_reset_sdus();
rlc_um_v9_3_0_test_send_sdu(&um_tx, 1); rlc_um_v9_3_0_test_send_sdu(&um_tx, 1);
for (i = 0; i < 32; i++) { for (i = 0; i < 32; i++) {
@@ -688,8 +640,6 @@ void rlc_um_v9_3_0_test_reordering(uint32_t sn_field_lengthP)
rlc_um_v9_3_0_test_exchange_delayed_pdus(&um_tx, &um_rx, 2000, 200, 0, 0, INCREMENT_FRAME_YES); rlc_um_v9_3_0_test_exchange_delayed_pdus(&um_tx, &um_rx, 2000, 200, 0, 0, INCREMENT_FRAME_YES);
assert (g_send_id_read_index[1] == g_send_id_write_index[0]); assert (g_send_id_read_index[1] == g_send_id_write_index[0]);
rlc_um_v9_3_0_test_send_sdu(&um_tx, 1); rlc_um_v9_3_0_test_send_sdu(&um_tx, 1);
rlc_um_v9_3_0_test_exchange_delayed_pdus(&um_tx, &um_rx, 3, 200, 0, 0, INCREMENT_FRAME_YES); rlc_um_v9_3_0_test_exchange_delayed_pdus(&um_tx, &um_rx, 3, 200, 0, 0, INCREMENT_FRAME_YES);
rlc_um_v9_3_0_test_exchange_delayed_pdus(&um_tx, &um_rx, 3, 200, 0, 0, INCREMENT_FRAME_YES); rlc_um_v9_3_0_test_exchange_delayed_pdus(&um_tx, &um_rx, 3, 200, 0, 0, INCREMENT_FRAME_YES);
@@ -702,7 +652,6 @@ void rlc_um_v9_3_0_test_reordering(uint32_t sn_field_lengthP)
rlc_um_v9_3_0_test_exchange_delayed_pdus(&um_tx, &um_rx, 2000, 200, 0, 0, INCREMENT_FRAME_YES); rlc_um_v9_3_0_test_exchange_delayed_pdus(&um_tx, &um_rx, 2000, 200, 0, 0, INCREMENT_FRAME_YES);
printf("g_send_id_read_index[1]=%d g_send_id_write_index[0]=%d Loop %d (1)\n", g_send_id_read_index[1], g_send_id_write_index[0], j); printf("g_send_id_read_index[1]=%d g_send_id_write_index[0]=%d Loop %d (1)\n", g_send_id_read_index[1], g_send_id_write_index[0], j);
assert (g_send_id_read_index[1] != g_send_id_write_index[0]); assert (g_send_id_read_index[1] != g_send_id_write_index[0]);
rlc_um_v9_3_0_test_send_sdu(&um_tx, 1); rlc_um_v9_3_0_test_send_sdu(&um_tx, 1);
rlc_um_v9_3_0_test_exchange_delayed_pdus(&um_tx, &um_rx, 3, 200, 0, 0, INCREMENT_FRAME_YES); rlc_um_v9_3_0_test_exchange_delayed_pdus(&um_tx, &um_rx, 3, 200, 0, 0, INCREMENT_FRAME_YES);
@@ -716,7 +665,6 @@ void rlc_um_v9_3_0_test_reordering(uint32_t sn_field_lengthP)
rlc_um_v9_3_0_test_exchange_delayed_pdus(&um_tx, &um_rx, 2000, 200, 0, 0, INCREMENT_FRAME_YES); rlc_um_v9_3_0_test_exchange_delayed_pdus(&um_tx, &um_rx, 2000, 200, 0, 0, INCREMENT_FRAME_YES);
printf("g_send_id_read_index[1]=%d g_send_id_write_index[0]=%d Loop %d (2)\n", g_send_id_read_index[1], g_send_id_write_index[0], j); printf("g_send_id_read_index[1]=%d g_send_id_write_index[0]=%d Loop %d (2)\n", g_send_id_read_index[1], g_send_id_write_index[0], j);
assert (g_send_id_read_index[1] != g_send_id_write_index[0]); assert (g_send_id_read_index[1] != g_send_id_write_index[0]);
} }
@@ -728,21 +676,14 @@ void rlc_um_v9_3_0_test_tx_rx_10(void)
{ {
rlc_um_info_t um_info; rlc_um_info_t um_info;
int i,j,r; int i,j,r;
um_info.timer_reordering = 32; um_info.timer_reordering = 32;
um_info.sn_field_length = 10; um_info.sn_field_length = 10;
um_info.is_mXch = 0; um_info.is_mXch = 0;
srand (0); srand (0);
config_req_rlc_um (&um_tx, 0,0,0, &um_info, 0, SIGNALLING_RADIO_BEARER, SIGNALLING_RADIO_BEARER /*LC-id = DRB-id*/); config_req_rlc_um (&um_tx, 0,0,0, &um_info, 0, SIGNALLING_RADIO_BEARER, SIGNALLING_RADIO_BEARER /*LC-id = DRB-id*/);
config_req_rlc_um (&um_rx, 0,1,1, &um_info, 1, SIGNALLING_RADIO_BEARER, SIGNALLING_RADIO_BEARER /*LC-id = DRB-id*/); config_req_rlc_um (&um_rx, 0,1,1, &um_info, 1, SIGNALLING_RADIO_BEARER, SIGNALLING_RADIO_BEARER /*LC-id = DRB-id*/);
rlc_um_display_rx_window(&um_tx); rlc_um_display_rx_window(&um_tx);
rlc_um_display_rx_window(&um_rx); rlc_um_display_rx_window(&um_rx);
#ifdef TEST1 #ifdef TEST1
srand (0); srand (0);
rlc_um_v9_3_0_test_reset_sdus(); rlc_um_v9_3_0_test_reset_sdus();
@@ -765,7 +706,6 @@ void rlc_um_v9_3_0_test_tx_rx_10(void)
rlc_um_v9_3_0_test_exchange_pdus(&um_tx, &um_rx, 1000, 200); rlc_um_v9_3_0_test_exchange_pdus(&um_tx, &um_rx, 1000, 200);
rlc_um_v9_3_0_test_exchange_pdus(&um_tx, &um_rx, 1000, 200); rlc_um_v9_3_0_test_exchange_pdus(&um_tx, &um_rx, 1000, 200);
rlc_um_v9_3_0_test_exchange_pdus(&um_tx, &um_rx, 1000, 200); rlc_um_v9_3_0_test_exchange_pdus(&um_tx, &um_rx, 1000, 200);
assert (g_send_id_read_index[1] == g_send_id_write_index[0]); assert (g_send_id_read_index[1] == g_send_id_write_index[0]);
printf("\n\n\n\n\n\n-----------------------------------------------------------------------------------------rlc_um_v9_3_0_test 1: END OF SIMPLE TEST SEVERAL SDUs IN PDU\n\n\n\n"); printf("\n\n\n\n\n\n-----------------------------------------------------------------------------------------rlc_um_v9_3_0_test 1: END OF SIMPLE TEST SEVERAL SDUs IN PDU\n\n\n\n");
sleep(2); sleep(2);
@@ -837,7 +777,6 @@ void rlc_um_v9_3_0_test_tx_rx_10(void)
rlc_um_v9_3_0_test_exchange_pdus(&um_tx, &um_rx, 2000, 200); rlc_um_v9_3_0_test_exchange_pdus(&um_tx, &um_rx, 2000, 200);
rlc_um_v9_3_0_test_exchange_pdus(&um_tx, &um_rx, 2000, 200); rlc_um_v9_3_0_test_exchange_pdus(&um_tx, &um_rx, 2000, 200);
rlc_um_v9_3_0_test_exchange_pdus(&um_tx, &um_rx, 2000, 200); rlc_um_v9_3_0_test_exchange_pdus(&um_tx, &um_rx, 2000, 200);
rlc_um_v9_3_0_test_send_sdu(&um_tx, 1); rlc_um_v9_3_0_test_send_sdu(&um_tx, 1);
rlc_um_v9_3_0_test_exchange_pdus(&um_tx, &um_rx, 30, 200); rlc_um_v9_3_0_test_exchange_pdus(&um_tx, &um_rx, 30, 200);
rlc_um_v9_3_0_test_exchange_pdus(&um_tx, &um_rx, 31, 200); rlc_um_v9_3_0_test_exchange_pdus(&um_tx, &um_rx, 31, 200);
@@ -983,8 +922,6 @@ void rlc_um_v9_3_0_test_tx_rx_10(void)
rlc_um_v9_3_0_test_send_sdu(&um_tx, g_random_sdu); rlc_um_v9_3_0_test_send_sdu(&um_tx, g_random_sdu);
g_random_sdu = rand() % 37; g_random_sdu = rand() % 37;
//rlc_um_v9_3_0_test_send_sdu(&um_rx, g_random_sdu); //rlc_um_v9_3_0_test_send_sdu(&um_rx, g_random_sdu);
g_random_nb_frames = rand() % 4; g_random_nb_frames = rand() % 4;
for (j = 0; j < g_random_nb_frames; j++) { for (j = 0; j < g_random_nb_frames; j++) {
@@ -995,7 +932,6 @@ void rlc_um_v9_3_0_test_tx_rx_10(void)
//rlc_um_display_rx_window(&um_tx); //rlc_um_display_rx_window(&um_tx);
rlc_um_display_rx_window(&um_rx); rlc_um_display_rx_window(&um_rx);
int dropped = (rand() % 3); int dropped = (rand() % 3);
if ((dropped == 0) && (g_tx_packets > 0)) { if ((dropped == 0) && (g_tx_packets > 0)) {
@@ -1028,7 +964,6 @@ void rlc_um_v9_3_0_test_tx_rx_10(void)
g_target_tx_error_rate, g_target_tx_error_rate,
(g_rx_packets >0)?(g_dropped_rx_packets*100)/g_rx_packets:0, (g_rx_packets >0)?(g_dropped_rx_packets*100)/g_rx_packets:0,
g_target_rx_error_rate); g_target_rx_error_rate);
} }
} }
@@ -1057,21 +992,14 @@ void rlc_um_v9_3_0_test_tx_rx_5(void)
{ {
rlc_um_info_t um_info; rlc_um_info_t um_info;
int i,j,r; int i,j,r;
um_info.timer_reordering = 32; um_info.timer_reordering = 32;
um_info.sn_field_length = 5; um_info.sn_field_length = 5;
um_info.is_mXch = 0; um_info.is_mXch = 0;
srand (0); srand (0);
config_req_rlc_um (&um_tx, 0,0,0, &um_info, 0, SIGNALLING_RADIO_BEARER, SIGNALLING_RADIO_BEARER /*LC-id = DRB-id*/); config_req_rlc_um (&um_tx, 0,0,0, &um_info, 0, SIGNALLING_RADIO_BEARER, SIGNALLING_RADIO_BEARER /*LC-id = DRB-id*/);
config_req_rlc_um (&um_rx, 0,1,1, &um_info, 1, SIGNALLING_RADIO_BEARER, SIGNALLING_RADIO_BEARER /*LC-id = DRB-id*/); config_req_rlc_um (&um_rx, 0,1,1, &um_info, 1, SIGNALLING_RADIO_BEARER, SIGNALLING_RADIO_BEARER /*LC-id = DRB-id*/);
rlc_um_display_rx_window(&um_tx); rlc_um_display_rx_window(&um_tx);
rlc_um_display_rx_window(&um_rx); rlc_um_display_rx_window(&um_rx);
#ifdef TEST1 #ifdef TEST1
srand (0); srand (0);
printf("\n\n\n\n\n\n-----------------------------------------------------------------------------------------rlc_um_v9_3_0_test_5 1: START OF SIMPLE TEST SEVERAL SDUs IN PDU\n\n\n\n"); printf("\n\n\n\n\n\n-----------------------------------------------------------------------------------------rlc_um_v9_3_0_test_5 1: START OF SIMPLE TEST SEVERAL SDUs IN PDU\n\n\n\n");
@@ -1095,7 +1023,6 @@ void rlc_um_v9_3_0_test_tx_rx_5(void)
rlc_um_v9_3_0_test_exchange_pdus(&um_tx, &um_rx, 1000, 200); rlc_um_v9_3_0_test_exchange_pdus(&um_tx, &um_rx, 1000, 200);
rlc_um_v9_3_0_test_exchange_pdus(&um_tx, &um_rx, 1000, 200); rlc_um_v9_3_0_test_exchange_pdus(&um_tx, &um_rx, 1000, 200);
rlc_um_v9_3_0_test_exchange_pdus(&um_tx, &um_rx, 1000, 200); rlc_um_v9_3_0_test_exchange_pdus(&um_tx, &um_rx, 1000, 200);
assert (g_send_id_read_index[1] == g_send_id_write_index[0]); assert (g_send_id_read_index[1] == g_send_id_write_index[0]);
printf("\n\n\n\n\n\n-----------------------------------------------------------------------------------------rlc_um_v9_3_0_test_5 1: END OF SIMPLE TEST SEVERAL SDUs IN PDU\n\n\n\n"); printf("\n\n\n\n\n\n-----------------------------------------------------------------------------------------rlc_um_v9_3_0_test_5 1: END OF SIMPLE TEST SEVERAL SDUs IN PDU\n\n\n\n");
sleep(2); sleep(2);
@@ -1163,7 +1090,6 @@ void rlc_um_v9_3_0_test_tx_rx_5(void)
rlc_um_v9_3_0_test_exchange_pdus(&um_tx, &um_rx, 2000, 200); rlc_um_v9_3_0_test_exchange_pdus(&um_tx, &um_rx, 2000, 200);
rlc_um_v9_3_0_test_exchange_pdus(&um_tx, &um_rx, 2000, 200); rlc_um_v9_3_0_test_exchange_pdus(&um_tx, &um_rx, 2000, 200);
rlc_um_v9_3_0_test_exchange_pdus(&um_tx, &um_rx, 2000, 200); rlc_um_v9_3_0_test_exchange_pdus(&um_tx, &um_rx, 2000, 200);
rlc_um_v9_3_0_test_send_sdu(&um_tx, 1); rlc_um_v9_3_0_test_send_sdu(&um_tx, 1);
rlc_um_v9_3_0_test_exchange_pdus(&um_tx, &um_rx, 26, 200); rlc_um_v9_3_0_test_exchange_pdus(&um_tx, &um_rx, 26, 200);
rlc_um_v9_3_0_test_exchange_pdus(&um_tx, &um_rx, 27, 200); rlc_um_v9_3_0_test_exchange_pdus(&um_tx, &um_rx, 27, 200);
@@ -1301,8 +1227,6 @@ void rlc_um_v9_3_0_test_tx_rx_5(void)
rlc_um_v9_3_0_test_send_sdu(&um_tx, g_random_sdu); rlc_um_v9_3_0_test_send_sdu(&um_tx, g_random_sdu);
g_random_sdu = rand() % 37; g_random_sdu = rand() % 37;
//rlc_um_v9_3_0_test_send_sdu(&um_rx, g_random_sdu); //rlc_um_v9_3_0_test_send_sdu(&um_rx, g_random_sdu);
g_random_nb_frames = rand() % 4; g_random_nb_frames = rand() % 4;
for (j = 0; j < g_random_nb_frames; j++) { for (j = 0; j < g_random_nb_frames; j++) {
@@ -1313,7 +1237,6 @@ void rlc_um_v9_3_0_test_tx_rx_5(void)
//rlc_um_display_rx_window(&um_tx); //rlc_um_display_rx_window(&um_tx);
rlc_um_display_rx_window(&um_rx); rlc_um_display_rx_window(&um_rx);
int dropped = (rand() % 3); int dropped = (rand() % 3);
if ((dropped == 0) && (g_tx_packets > 0)) { if ((dropped == 0) && (g_tx_packets > 0)) {
@@ -1346,7 +1269,6 @@ void rlc_um_v9_3_0_test_tx_rx_5(void)
g_target_tx_error_rate, g_target_tx_error_rate,
(g_rx_packets >0)?(g_dropped_rx_packets*100)/g_rx_packets:0, (g_rx_packets >0)?(g_dropped_rx_packets*100)/g_rx_packets:0,
g_target_rx_error_rate); g_target_rx_error_rate);
} }
} }
@@ -1378,11 +1300,9 @@ void rlc_um_v9_3_0_test_print_trace (void)
size_t size; size_t size;
char **strings; char **strings;
size_t i; size_t i;
size = backtrace (array, 100); size = backtrace (array, 100);
strings = backtrace_symbols (array, size); strings = backtrace_symbols (array, size);
printf ("Obtained %lu stack frames.\n", (unsigned long)size);
printf ("Obtained %d 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]);
@@ -1395,23 +1315,15 @@ void rlc_um_v9_3_0_test(void)
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
{ {
pool_buffer_init(); pool_buffer_init();
set_comp_log(RLC, LOG_TRACE, LOG_MED, 1); set_comp_log(RLC, LOG_TRACE, LOG_MED, 1);
// tested OK // tested OK
rlc_um_v9_3_0_test_reordering(10); rlc_um_v9_3_0_test_reordering(10);
rlc_um_v9_3_0_test_tx_rx_10(); rlc_um_v9_3_0_test_tx_rx_10();
// tested OK // tested OK
rlc_um_v9_3_0_test_windows_10(); rlc_um_v9_3_0_test_windows_10();
rlc_um_v9_3_0_test_tx_rx_5(); rlc_um_v9_3_0_test_tx_rx_5();
rlc_um_v9_3_0_test_windows_5(); rlc_um_v9_3_0_test_windows_5();
rlc_um_v9_3_0_test_reordering(5); rlc_um_v9_3_0_test_reordering(5);
printf("rlc_um_v9_3_0_test: END OF TESTS\n"); printf("rlc_um_v9_3_0_test: END OF TESTS\n");
exit(0); exit(0);
} }
+1 -1
View File
@@ -677,7 +677,7 @@ void
rlc_module_cleanup (void) rlc_module_cleanup (void)
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
{ {
hashtable_destroy(rlc_coll_p); hashtable_destroy(&rlc_coll_p);
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void void
File diff suppressed because it is too large Load Diff
+147 -175
View File
@@ -46,22 +46,22 @@
#define NIPADDR(addr) \ #define NIPADDR(addr) \
(uint8_t)(addr & 0x000000FF), \ (uint8_t)(addr & 0x000000FF), \
(uint8_t)((addr & 0x0000FF00) >> 8), \ (uint8_t)((addr & 0x0000FF00) >> 8), \
(uint8_t)((addr & 0x00FF0000) >> 16), \ (uint8_t)((addr & 0x00FF0000) >> 16), \
(uint8_t)((addr & 0xFF000000) >> 24) (uint8_t)((addr & 0xFF000000) >> 24)
#define NIP6ADDR(addr) \ #define NIP6ADDR(addr) \
ntohs((addr)->s6_addr16[0]), \ ntohs((addr)->s6_addr16[0]), \
ntohs((addr)->s6_addr16[1]), \ ntohs((addr)->s6_addr16[1]), \
ntohs((addr)->s6_addr16[2]), \ ntohs((addr)->s6_addr16[2]), \
ntohs((addr)->s6_addr16[3]), \ ntohs((addr)->s6_addr16[3]), \
ntohs((addr)->s6_addr16[4]), \ ntohs((addr)->s6_addr16[4]), \
ntohs((addr)->s6_addr16[5]), \ ntohs((addr)->s6_addr16[5]), \
ntohs((addr)->s6_addr16[6]), \ ntohs((addr)->s6_addr16[6]), \
ntohs((addr)->s6_addr16[7]) ntohs((addr)->s6_addr16[7])
// Global variables // Global variables
@@ -76,12 +76,9 @@ struct oai_nw_drv_ioctl gifr;
void IAL_NAS_ioctl_init(int inst) void IAL_NAS_ioctl_init(int inst)
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
{ {
struct oai_nw_drv_msg_statistic_reply *msgrep; struct oai_nw_drv_msg_statistic_reply *msgrep;
int err,rc; int err,rc;
sprintf(gifr.name, "oai%d",inst); sprintf(gifr.name, "oai%d",inst);
// Get an UDP IPv6 socket ?? // Get an UDP IPv6 socket ??
fd=socket(AF_INET6, SOCK_DGRAM, 0); fd=socket(AF_INET6, SOCK_DGRAM, 0);
@@ -91,7 +88,6 @@ void IAL_NAS_ioctl_init(int inst)
} }
sprintf(gifr.name, "oai%d",inst); sprintf(gifr.name, "oai%d",inst);
gifr.type = OAI_NW_DRV_MSG_STATISTIC_REQUEST; gifr.type = OAI_NW_DRV_MSG_STATISTIC_REQUEST;
memset ((void *)dummy_buffer,0,800); memset ((void *)dummy_buffer,0,800);
gifr.msg= &(dummy_buffer[0]); gifr.msg= &(dummy_buffer[0]);
@@ -160,7 +156,6 @@ int main(int argc,char **argv)
char addr_str[46]; char addr_str[46];
char mask_len_delims[] = "/"; char mask_len_delims[] = "/";
char *result; char *result;
// scan options // scan options
rb[0] = '\0'; rb[0] = '\0';
cx[0] = '\0'; cx[0] = '\0';
@@ -171,156 +166,155 @@ int main(int argc,char **argv)
while ((c = getopt (argc, argv, "adr:i:c:f:l:m:s:t:x:y:z:")) != -1) while ((c = getopt (argc, argv, "adr:i:c:f:l:m:s:t:x:y:z:")) != -1)
switch (c) { switch (c) {
case 'a': case 'a':
action = ADD_RB; action = ADD_RB;
break;
case 'd':
action = DEL_RB;
break;
case 'r':
strcpy(rb,optarg);
rbset = 1;
break;
case 'i':
strcpy(inst,optarg);
instset = 1;
break;
case 'c':
strcpy(cx,optarg);
cxset = 1;
break;
case 'f':
strcpy(classref,optarg);
classrefset = 1;
break;
case 'l':
strcpy(mpls_outgoinglabel,optarg);
mpls_outlabelset=1;
break;
case 'm':
strcpy(mpls_incominglabel,optarg);
mpls_inlabelset=1;
break;
case 's':
result = strtok( optarg, mask_len_delims );
if ( result != NULL ) {
inet_aton(result,&saddr_ipv4);
printf("Arg Source Addr IPv4 string: %s\n",result);
saddr_ipv4set = 1;
} else {
printf("Arg Source Addr IPv4 string: ERROR\n");
break; break;
}
result = strtok( NULL, mask_len_delims ); case 'd':
action = DEL_RB;
if ( result != NULL ) {
splen = atoi(result);
} else {
splen = 32;
}
printf("Arg Source Addr IPv4 mask len: %d\n",splen);
break;
case 't':
result = strtok( optarg, mask_len_delims );
if ( result != NULL ) {
inet_aton(result,&daddr_ipv4);
printf("Arg Dest Addr IPv4 string: %s\n",result);
daddr_ipv4set = 1;
} else {
printf("Arg Dest Addr IPv4 string: ERROR\n");
break; break;
}
result = strtok( NULL, mask_len_delims ); case 'r':
strcpy(rb,optarg);
if ( result != NULL ) { rbset = 1;
dplen = atoi(result);
} else {
dplen = 32;
}
printf("Arg Dest Addr IPv4 mask len: %d\n",dplen);
break;
case 'x':
result = strtok( optarg, mask_len_delims );
if ( result != NULL ) {
printf("Arg Source Addr IPv6 string: %s\n",result);
inet_pton(AF_INET6,result,(void *)&saddr_ipv6);
saddr_ipv6set = 1;
} else {
printf("Arg Source Addr IPv6 string: ERROR\n");
break; break;
}
result = strtok( NULL, mask_len_delims ); case 'i':
strcpy(inst,optarg);
if ( result != NULL ) { instset = 1;
splen = atoi(result);
} else {
splen = 128;
}
printf("Arg Source Addr IPv6 mask len: %d\n",splen);
break;
case 'y':
result = strtok( optarg, mask_len_delims );
if ( result != NULL ) {
printf("Arg Dest Addr IPv6 string: %s\n",result);
inet_pton(AF_INET6,result,(void *)&daddr_ipv6);
daddr_ipv6set = 1;
} else {
printf("Arg Dest Addr IPv6 string: ERROR\n");
break; break;
}
result = strtok( NULL, mask_len_delims ); case 'c':
strcpy(cx,optarg);
cxset = 1;
break;
if ( result != NULL ) { case 'f':
dplen = atoi(result); strcpy(classref,optarg);
} else { classrefset = 1;
dplen = 128; break;
}
printf("Arg Dest Addr IPv6 mask len: %d\n",dplen); case 'l':
break; strcpy(mpls_outgoinglabel,optarg);
mpls_outlabelset=1;
break;
case 'z': case 'm':
dscpset=1; strcpy(mpls_incominglabel,optarg);
strcpy(dscp,optarg); mpls_inlabelset=1;
break; break;
case '?': case 's':
if (isprint (optopt)) result = strtok( optarg, mask_len_delims );
fprintf (stderr, "Unknown option `-%c'.\n", optopt);
else
fprintf (stderr,
"Unknown option character `\\x%x'.\n",
optopt);
return 1; if ( result != NULL ) {
inet_aton(result,&saddr_ipv4);
printf("Arg Source Addr IPv4 string: %s\n",result);
saddr_ipv4set = 1;
} else {
printf("Arg Source Addr IPv4 string: ERROR\n");
break;
}
default: result = strtok( NULL, mask_len_delims );
abort ();
if ( result != NULL ) {
splen = atoi(result);
} else {
splen = 32;
}
printf("Arg Source Addr IPv4 mask len: %d\n",splen);
break;
case 't':
result = strtok( optarg, mask_len_delims );
if ( result != NULL ) {
inet_aton(result,&daddr_ipv4);
printf("Arg Dest Addr IPv4 string: %s\n",result);
daddr_ipv4set = 1;
} else {
printf("Arg Dest Addr IPv4 string: ERROR\n");
break;
}
result = strtok( NULL, mask_len_delims );
if ( result != NULL ) {
dplen = atoi(result);
} else {
dplen = 32;
}
printf("Arg Dest Addr IPv4 mask len: %d\n",dplen);
break;
case 'x':
result = strtok( optarg, mask_len_delims );
if ( result != NULL ) {
printf("Arg Source Addr IPv6 string: %s\n",result);
inet_pton(AF_INET6,result,(void *)&saddr_ipv6);
saddr_ipv6set = 1;
} else {
printf("Arg Source Addr IPv6 string: ERROR\n");
break;
}
result = strtok( NULL, mask_len_delims );
if ( result != NULL ) {
splen = atoi(result);
} else {
splen = 128;
}
printf("Arg Source Addr IPv6 mask len: %d\n",splen);
break;
case 'y':
result = strtok( optarg, mask_len_delims );
if ( result != NULL ) {
printf("Arg Dest Addr IPv6 string: %s\n",result);
inet_pton(AF_INET6,result,(void *)&daddr_ipv6);
daddr_ipv6set = 1;
} else {
printf("Arg Dest Addr IPv6 string: ERROR\n");
break;
}
result = strtok( NULL, mask_len_delims );
if ( result != NULL ) {
dplen = atoi(result);
} else {
dplen = 128;
}
printf("Arg Dest Addr IPv6 mask len: %d\n",dplen);
break;
case 'z':
dscpset=1;
strcpy(dscp,optarg);
break;
case '?':
if (isprint (optopt))
fprintf (stderr, "Unknown option `-%c'.\n", optopt);
else
fprintf (stderr,
"Unknown option character `\\x%x'.\n",
optopt);
return 1;
default:
abort ();
} }
printf ("action = %d, rb = %s,cx = %s\n", action, rb, cx); printf ("action = %d, rb = %s,cx = %s\n", action, rb, cx);
if (rbset==0) { if (rbset==0) {
@@ -364,13 +358,11 @@ int main(int argc,char **argv)
} }
IAL_NAS_ioctl_init(atoi(inst)); IAL_NAS_ioctl_init(atoi(inst));
msgreq = (struct oai_nw_drv_msg_rb_establishment_request *)(gifr.msg); msgreq = (struct oai_nw_drv_msg_rb_establishment_request *)(gifr.msg);
msgreq->rab_id = atoi(rb); msgreq->rab_id = atoi(rb);
msgreq->lcr = atoi(cx); msgreq->lcr = atoi(cx);
msgreq->qos = 0; msgreq->qos = 0;
if (action == ADD_RB) { if (action == ADD_RB) {
gifr.type = OAI_NW_DRV_MSG_RB_ESTABLISHMENT_REQUEST; gifr.type = OAI_NW_DRV_MSG_RB_ESTABLISHMENT_REQUEST;
printf("OAI_NW_DRV_MSG_RB_ESTABLISHMENT_REQUEST: RB %d LCR %d QOS %d\n ", msgreq->rab_id, msgreq->lcr, msgreq->qos); printf("OAI_NW_DRV_MSG_RB_ESTABLISHMENT_REQUEST: RB %d LCR %d QOS %d\n ", msgreq->rab_id, msgreq->lcr, msgreq->qos);
@@ -405,8 +397,6 @@ int main(int argc,char **argv)
printf(" IPV4: Dest = %d.%d.%d.%d/%d\n", NIPADDR(msgreq_class->daddr.ipv4), msgreq_class->dplen); printf(" IPV4: Dest = %d.%d.%d.%d/%d\n", NIPADDR(msgreq_class->daddr.ipv4), msgreq_class->dplen);
gifr.type = OAI_NW_DRV_MSG_CLASS_ADD_REQUEST; gifr.type = OAI_NW_DRV_MSG_CLASS_ADD_REQUEST;
err=ioctl(fd, OAI_NW_DRV_IOCTL_RRM, &gifr); err=ioctl(fd, OAI_NW_DRV_IOCTL_RRM, &gifr);
msgreq_class->rab_id = atoi(rb); msgreq_class->rab_id = atoi(rb);
msgreq_class->lcr = atoi(cx); msgreq_class->lcr = atoi(cx);
msgreq_class->version = 4; msgreq_class->version = 4;
@@ -420,7 +410,6 @@ int main(int argc,char **argv)
printf("OAI_NW_DRV_MSG_CLASS_ADD_REQUEST: OAI_NW_DRV_DIRECTION_RECEIVE RB %d LCR %d ClassRef %d ", msgreq_class->rab_id, msgreq_class->lcr, msgreq_class->classref); printf("OAI_NW_DRV_MSG_CLASS_ADD_REQUEST: OAI_NW_DRV_DIRECTION_RECEIVE RB %d LCR %d ClassRef %d ", msgreq_class->rab_id, msgreq_class->lcr, msgreq_class->classref);
printf("IPV4: Source = %d.%d.%d.%d/%d ", NIPADDR(msgreq_class->saddr.ipv4), msgreq_class->splen); printf("IPV4: Source = %d.%d.%d.%d/%d ", NIPADDR(msgreq_class->saddr.ipv4), msgreq_class->splen);
printf("IPV4: Dest = %d.%d.%d.%d/%d\n", NIPADDR(msgreq_class->daddr.ipv4), msgreq_class->dplen); printf("IPV4: Dest = %d.%d.%d.%d/%d\n", NIPADDR(msgreq_class->daddr.ipv4), msgreq_class->dplen);
gifr.type = OAI_NW_DRV_MSG_CLASS_ADD_REQUEST; gifr.type = OAI_NW_DRV_MSG_CLASS_ADD_REQUEST;
err=ioctl(fd, OAI_NW_DRV_IOCTL_RRM, &gifr); err=ioctl(fd, OAI_NW_DRV_IOCTL_RRM, &gifr);
} }
@@ -443,7 +432,6 @@ int main(int argc,char **argv)
msgreq_class->fct = OAI_NW_DRV_FCT_QOS_SEND; msgreq_class->fct = OAI_NW_DRV_FCT_QOS_SEND;
// TO BE FIXED WHEN WE CAN SPECIFY A PROTOCOL-based rule // TO BE FIXED WHEN WE CAN SPECIFY A PROTOCOL-based rule
msgreq_class->protocol = OAI_NW_DRV_PROTOCOL_DEFAULT; msgreq_class->protocol = OAI_NW_DRV_PROTOCOL_DEFAULT;
memcpy(&msgreq_class->saddr.ipv6,&saddr_ipv6,16); memcpy(&msgreq_class->saddr.ipv6,&saddr_ipv6,16);
memcpy(&msgreq_class->daddr.ipv6,&daddr_ipv6,16); memcpy(&msgreq_class->daddr.ipv6,&daddr_ipv6,16);
printf("OAI_NW_DRV_MSG_CLASS_ADD_REQUEST: OAI_NW_DRV_DIRECTION_SEND RB %d LCR %d ClassRef %d ", msgreq_class->rab_id, msgreq_class->lcr, msgreq_class->classref); printf("OAI_NW_DRV_MSG_CLASS_ADD_REQUEST: OAI_NW_DRV_DIRECTION_SEND RB %d LCR %d ClassRef %d ", msgreq_class->rab_id, msgreq_class->lcr, msgreq_class->classref);
@@ -451,7 +439,6 @@ int main(int argc,char **argv)
printf("IPV6: Dest = %x:%x:%x:%x:%x:%x:%x:%x/%d\n", NIP6ADDR(&msgreq_class->daddr.ipv6), msgreq_class->dplen); printf("IPV6: Dest = %x:%x:%x:%x:%x:%x:%x:%x/%d\n", NIP6ADDR(&msgreq_class->daddr.ipv6), msgreq_class->dplen);
gifr.type = OAI_NW_DRV_MSG_CLASS_ADD_REQUEST; gifr.type = OAI_NW_DRV_MSG_CLASS_ADD_REQUEST;
err=ioctl(fd, OAI_NW_DRV_IOCTL_RRM, &gifr); err=ioctl(fd, OAI_NW_DRV_IOCTL_RRM, &gifr);
msgreq_class->rab_id = atoi(rb); msgreq_class->rab_id = atoi(rb);
msgreq_class->lcr = atoi(cx); msgreq_class->lcr = atoi(cx);
msgreq_class->dplen = splen; msgreq_class->dplen = splen;
@@ -468,7 +455,6 @@ int main(int argc,char **argv)
} }
if (mpls_inlabelset == 1) { if (mpls_inlabelset == 1) {
msgreq_class = (struct oai_nw_drv_msg_class_add_request *)(gifr.msg); msgreq_class = (struct oai_nw_drv_msg_class_add_request *)(gifr.msg);
msgreq_class->rab_id = atoi(rb); msgreq_class->rab_id = atoi(rb);
msgreq_class->lcr = atoi(cx); msgreq_class->lcr = atoi(cx);
@@ -483,40 +469,26 @@ int main(int argc,char **argv)
//msgreq_class->classref = 4 + (msgreq_class->lcr<<3); //msgreq_class->classref = 4 + (msgreq_class->lcr<<3);
msgreq_class->dir=OAI_NW_DRV_DIRECTION_SEND; msgreq_class->dir=OAI_NW_DRV_DIRECTION_SEND;
msgreq_class->fct=OAI_NW_DRV_FCT_QOS_SEND; msgreq_class->fct=OAI_NW_DRV_FCT_QOS_SEND;
// TO BE FIXED WHEN WE CAN SPECIFY A PROTOCOL-based rule // TO BE FIXED WHEN WE CAN SPECIFY A PROTOCOL-based rule
msgreq_class->protocol = OAI_NW_DRV_PROTOCOL_DEFAULT; msgreq_class->protocol = OAI_NW_DRV_PROTOCOL_DEFAULT;
mpls_outlabel = atoi(mpls_outgoinglabel); mpls_outlabel = atoi(mpls_outgoinglabel);
printf("Setting MPLS outlabel %u with exp %d\n",mpls_outlabel,msgreq_class->dscp);
printf("Setting MPLS outlabel %d with exp %d\n",mpls_outlabel,msgreq_class->dscp);
msgreq_class->daddr.mpls_label = mpls_outlabel; msgreq_class->daddr.mpls_label = mpls_outlabel;
gifr.type = OAI_NW_DRV_MSG_CLASS_ADD_REQUEST; gifr.type = OAI_NW_DRV_MSG_CLASS_ADD_REQUEST;
err=ioctl(fd, OAI_NW_DRV_IOCTL_RRM, &gifr); err=ioctl(fd, OAI_NW_DRV_IOCTL_RRM, &gifr);
msgreq_class->rab_id = atoi(rb); msgreq_class->rab_id = atoi(rb);
msgreq_class->lcr = atoi(cx); msgreq_class->lcr = atoi(cx);
msgreq_class->classref = atoi(classref) + 1 + (msgreq_class->lcr<<8); msgreq_class->classref = atoi(classref) + 1 + (msgreq_class->lcr<<8);
//msgreq_class->classref = 5 + (msgreq_class->lcr<<3); //msgreq_class->classref = 5 + (msgreq_class->lcr<<3);
msgreq_class->dir=OAI_NW_DRV_DIRECTION_RECEIVE; msgreq_class->dir=OAI_NW_DRV_DIRECTION_RECEIVE;
// TO BE FIXED WHEN WE CAN SPECIFY A PROTOCOL-based rule // TO BE FIXED WHEN WE CAN SPECIFY A PROTOCOL-based rule
msgreq_class->protocol = OAI_NW_DRV_PROTOCOL_DEFAULT; msgreq_class->protocol = OAI_NW_DRV_PROTOCOL_DEFAULT;
mpls_inlabel = atoi(mpls_incominglabel); mpls_inlabel = atoi(mpls_incominglabel);
printf("Setting MPLS inlabel %u with exp %d\n",mpls_inlabel,msgreq_class->dscp);
printf("Setting MPLS inlabel %d with exp %d\n",mpls_inlabel,msgreq_class->dscp);
msgreq_class->daddr.mpls_label = mpls_inlabel; msgreq_class->daddr.mpls_label = mpls_inlabel;
gifr.type = OAI_NW_DRV_MSG_CLASS_ADD_REQUEST; gifr.type = OAI_NW_DRV_MSG_CLASS_ADD_REQUEST;
err=ioctl(fd, OAI_NW_DRV_IOCTL_RRM, &gifr); err=ioctl(fd, OAI_NW_DRV_IOCTL_RRM, &gifr);
} }
} else if (action == DEL_RB) { } else if (action == DEL_RB) {
gifr.type = OAI_NW_DRV_MSG_RB_RELEASE_REQUEST; gifr.type = OAI_NW_DRV_MSG_RB_RELEASE_REQUEST;
err=ioctl(fd, OAI_NW_DRV_IOCTL_RRM, &gifr); err=ioctl(fd, OAI_NW_DRV_IOCTL_RRM, &gifr);
+81 -120
View File
@@ -108,12 +108,9 @@ int NAS_RALconnect(void)
void IAL_NAS_ioctl_init(int inst) void IAL_NAS_ioctl_init(int inst)
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
{ {
struct nas_msg_statistic_reply *msgrep; struct nas_msg_statistic_reply *msgrep;
int err; int err;
sprintf(gifr.name, "oai%d",inst); sprintf(gifr.name, "oai%d",inst);
// Get an UDP IPv6 socket ?? // Get an UDP IPv6 socket ??
fd=socket(AF_INET6, SOCK_DGRAM, 0); fd=socket(AF_INET6, SOCK_DGRAM, 0);
@@ -123,7 +120,6 @@ void IAL_NAS_ioctl_init(int inst)
} }
sprintf(gifr.name, "oai%d",inst); sprintf(gifr.name, "oai%d",inst);
gifr.type = NAS_MSG_STATISTIC_REQUEST; gifr.type = NAS_MSG_STATISTIC_REQUEST;
memset ((void *)dummy_buffer,0,800); memset ((void *)dummy_buffer,0,800);
gifr.msg= &(dummy_buffer[0]); gifr.msg= &(dummy_buffer[0]);
@@ -139,8 +135,6 @@ void IAL_NAS_ioctl_init(int inst)
printf("tx_bytes = %u, rx_bytes = %u\n", msgrep->tx_bytes, msgrep->rx_bytes); printf("tx_bytes = %u, rx_bytes = %u\n", msgrep->tx_bytes, msgrep->rx_bytes);
printf("tx_errors = %u, rx_errors = %u\n", msgrep->tx_errors, msgrep->rx_errors); printf("tx_errors = %u, rx_errors = %u\n", msgrep->tx_errors, msgrep->rx_errors);
printf("tx_dropped = %u, rx_dropped = %u\n", msgrep->tx_dropped, msgrep->rx_dropped); printf("tx_dropped = %u, rx_dropped = %u\n", msgrep->tx_dropped, msgrep->rx_dropped);
} }
@@ -160,11 +154,7 @@ int main(int argc,char **argv)
in_addr_t saddr_ipv4 = 0,daddr_ipv4 = 0; in_addr_t saddr_ipv4 = 0,daddr_ipv4 = 0;
struct in6_addr saddr_ipv6,daddr_ipv6; struct in6_addr saddr_ipv6,daddr_ipv6;
unsigned int mpls_outlabel=0,mpls_inlabel=0; unsigned int mpls_outlabel=0,mpls_inlabel=0;
char addr_str[46]; char addr_str[46];
// scan options // scan options
rb[0] = '\0'; rb[0] = '\0';
cx[0] = '\0'; cx[0] = '\0';
@@ -174,89 +164,87 @@ int main(int argc,char **argv)
while ((c = getopt (argc, argv, "adr:i:c:l:m:s:t:x:y:z:")) != -1) while ((c = getopt (argc, argv, "adr:i:c:l:m:s:t:x:y:z:")) != -1)
switch (c) { switch (c) {
case 'a': case 'a':
action = ADD_RB; action = ADD_RB;
break; break;
case 'd': case 'd':
action = DEL_RB; action = DEL_RB;
break; break;
case 'r': case 'r':
strcpy(rb,optarg); strcpy(rb,optarg);
rbset = 1; rbset = 1;
break; break;
case 'i': case 'i':
strcpy(inst,optarg); strcpy(inst,optarg);
instset = 1; instset = 1;
break; break;
case 'c': case 'c':
strcpy(cx,optarg); strcpy(cx,optarg);
cxset = 1; cxset = 1;
break; break;
case 'l': case 'l':
strcpy(mpls_outgoinglabel,optarg); strcpy(mpls_outgoinglabel,optarg);
mpls_outlabelset=1; mpls_outlabelset=1;
break; break;
case 'm': case 'm':
strcpy(mpls_incominglabel,optarg); strcpy(mpls_incominglabel,optarg);
mpls_inlabelset=1; mpls_inlabelset=1;
break; break;
case 's': { case 's': {
struct in_addr a; struct in_addr a;
inet_aton(optarg,&a); inet_aton(optarg,&a);
saddr_ipv4 = a.s_addr; saddr_ipv4 = a.s_addr;
saddr_ipv4set = 1; saddr_ipv4set = 1;
break; break;
}
case 't': {
struct in_addr a;
inet_aton(optarg,&a);
daddr_ipv4 = a.s_addr;
daddr_ipv4set = 1;
break;
}
case 'x':
printf("IPv6: %s\n",optarg);
inet_pton(AF_INET6,optarg,(void *)&saddr_ipv6);
saddr_ipv6set = 1;
break;
case 'y':
inet_pton(AF_INET6,optarg,(void *)&daddr_ipv6);
daddr_ipv6set = 1;
break;
case 'z':
dscpset=1;
strcpy(dscp,optarg);
break;
case '?':
if (isprint (optopt))
fprintf (stderr, "Unknown option `-%c'.\n", optopt);
else
fprintf (stderr,
"Unknown option character `\\x%x'.\n",
optopt);
return 1;
default:
abort ();
} }
case 't': {
struct in_addr a;
inet_aton(optarg,&a);
daddr_ipv4 = a.s_addr;
daddr_ipv4set = 1;
break;
}
case 'x':
printf("IPv6: %s\n",optarg);
inet_pton(AF_INET6,optarg,(void *)&saddr_ipv6);
saddr_ipv6set = 1;
break;
case 'y':
inet_pton(AF_INET6,optarg,(void *)&daddr_ipv6);
daddr_ipv6set = 1;
break;
case 'z':
dscpset=1;
strcpy(dscp,optarg);
break;
case '?':
if (isprint (optopt))
fprintf (stderr, "Unknown option `-%c'.\n", optopt);
else
fprintf (stderr,
"Unknown option character `\\x%x'.\n",
optopt);
return 1;
default:
abort ();
}
printf ("action = %d, rb = %s,cx = %s\n", action, rb, cx); printf ("action = %d, rb = %s,cx = %s\n", action, rb, cx);
if (rbset==0) { if (rbset==0) {
printf("ERROR: Specify a RAB id!!\n"); printf("ERROR: Specify a RAB id!!\n");
exit(-1); exit(-1);
@@ -293,31 +281,27 @@ int main(int argc,char **argv)
} }
IAL_NAS_ioctl_init(atoi(inst)); IAL_NAS_ioctl_init(atoi(inst));
msgreq = (struct nas_msg_rb_establishment_request *)(gifr.msg); msgreq = (struct nas_msg_rb_establishment_request *)(gifr.msg);
msgreq->rab_id = atoi(rb); msgreq->rab_id = atoi(rb);
msgreq->lcr = atoi(cx); msgreq->lcr = atoi(cx);
msgreq->qos = 0; msgreq->qos = 0;
if (action == ADD_RB) { if (action == ADD_RB) {
gifr.type = NAS_MSG_RB_ESTABLISHMENT_REQUEST; gifr.type = NAS_MSG_RB_ESTABLISHMENT_REQUEST;
err=ioctl(fd, NAS_IOCTL_RRM, &gifr); err=ioctl(fd, NAS_IOCTL_RRM, &gifr);
if (err == -1) perror("ioctl");
if (err == -1) perror("ioctl");
if (saddr_ipv4set == 1) { if (saddr_ipv4set == 1) {
msgreq_class = (struct nas_msg_class_add_request *)(gifr.msg); msgreq_class = (struct nas_msg_class_add_request *)(gifr.msg);
msgreq_class->rab_id = atoi(rb); msgreq_class->rab_id = atoi(rb);
msgreq_class->lcr = atoi(cx); msgreq_class->lcr = atoi(cx);
msgreq_class->version = 4; msgreq_class->version = 4;
msgreq_class->classref = 0 + (msgreq_class->lcr<<3); msgreq_class->classref = 0 + (msgreq_class->lcr<<3);
msgreq_class->dir = NAS_DIRECTION_SEND; msgreq_class->dir = NAS_DIRECTION_SEND;
msgreq_class->fct = NAS_FCT_QOS_SEND; msgreq_class->fct = NAS_FCT_QOS_SEND;
msgreq_class->saddr.ipv4 = saddr_ipv4; msgreq_class->saddr.ipv4 = saddr_ipv4;
msgreq_class->daddr.ipv4 = daddr_ipv4; msgreq_class->daddr.ipv4 = daddr_ipv4;
// TO BE FIXED WHEN WE CAN SPECIFY A PROTOCOL-based rule // TO BE FIXED WHEN WE CAN SPECIFY A PROTOCOL-based rule
msgreq_class->protocol = NAS_PROTOCOL_DEFAULT; msgreq_class->protocol = NAS_PROTOCOL_DEFAULT;
@@ -326,21 +310,20 @@ int main(int argc,char **argv)
else else
msgreq_class->dscp=atoi(dscp); msgreq_class->dscp=atoi(dscp);
gifr.type = NAS_MSG_CLASS_ADD_REQUEST; gifr.type = NAS_MSG_CLASS_ADD_REQUEST;
err=ioctl(fd, NAS_IOCTL_RRM, &gifr); err=ioctl(fd, NAS_IOCTL_RRM, &gifr);
if (err == -1) perror("ioctl"); if (err == -1) perror("ioctl");
msgreq_class->rab_id = atoi(rb); msgreq_class->rab_id = atoi(rb);
msgreq_class->lcr = atoi(cx); msgreq_class->lcr = atoi(cx);
msgreq_class->classref = 1+(msgreq_class->lcr<<3); msgreq_class->classref = 1+(msgreq_class->lcr<<3);
msgreq_class->dir = NAS_DIRECTION_RECEIVE; msgreq_class->dir = NAS_DIRECTION_RECEIVE;
msgreq_class->daddr.ipv4 = saddr_ipv4; msgreq_class->daddr.ipv4 = saddr_ipv4;
msgreq_class->saddr.ipv4 = daddr_ipv4; msgreq_class->saddr.ipv4 = daddr_ipv4;
gifr.type = NAS_MSG_CLASS_ADD_REQUEST; gifr.type = NAS_MSG_CLASS_ADD_REQUEST;
err=ioctl(fd, NAS_IOCTL_RRM, &gifr); err=ioctl(fd, NAS_IOCTL_RRM, &gifr);
if (err == -1) perror("ioctl"); if (err == -1) perror("ioctl");
} }
@@ -358,38 +341,32 @@ int main(int argc,char **argv)
msgreq_class->classref = 2+(msgreq_class->lcr<<3); msgreq_class->classref = 2+(msgreq_class->lcr<<3);
msgreq_class->dir=NAS_DIRECTION_SEND; msgreq_class->dir=NAS_DIRECTION_SEND;
msgreq_class->fct=NAS_FCT_QOS_SEND; msgreq_class->fct=NAS_FCT_QOS_SEND;
// TO BE FIXED WHEN WE CAN SPECIFY A PROTOCOL-based rule // TO BE FIXED WHEN WE CAN SPECIFY A PROTOCOL-based rule
msgreq_class->protocol = NAS_PROTOCOL_DEFAULT; msgreq_class->protocol = NAS_PROTOCOL_DEFAULT;
memcpy(&msgreq_class->saddr.ipv6,&saddr_ipv6,16); memcpy(&msgreq_class->saddr.ipv6,&saddr_ipv6,16);
memcpy(&msgreq_class->daddr.ipv6,&daddr_ipv6,16); memcpy(&msgreq_class->daddr.ipv6,&daddr_ipv6,16);
inet_ntop(AF_INET6,(void *)&saddr_ipv6,addr_str,46); inet_ntop(AF_INET6,(void *)&saddr_ipv6,addr_str,46);
printf("IPV6: Source %s\n",addr_str); printf("IPV6: Source %s\n",addr_str);
inet_ntop(AF_INET6,(void *)&daddr_ipv6,addr_str,46); inet_ntop(AF_INET6,(void *)&daddr_ipv6,addr_str,46);
printf("IPV6: Dest %s\n",addr_str); printf("IPV6: Dest %s\n",addr_str);
gifr.type = NAS_MSG_CLASS_ADD_REQUEST; gifr.type = NAS_MSG_CLASS_ADD_REQUEST;
err=ioctl(fd, NAS_IOCTL_RRM, &gifr); err=ioctl(fd, NAS_IOCTL_RRM, &gifr);
if (err == -1) perror("ioctl"); if (err == -1) perror("ioctl");
msgreq_class->rab_id = atoi(rb); msgreq_class->rab_id = atoi(rb);
msgreq_class->lcr = atoi(cx); msgreq_class->lcr = atoi(cx);
msgreq_class->classref = 3+(msgreq_class->lcr<<3); msgreq_class->classref = 3+(msgreq_class->lcr<<3);
msgreq_class->dir=NAS_DIRECTION_RECEIVE; msgreq_class->dir=NAS_DIRECTION_RECEIVE;
memcpy(&msgreq_class->daddr.ipv6,&saddr_ipv6,16); memcpy(&msgreq_class->daddr.ipv6,&saddr_ipv6,16);
memcpy(&msgreq_class->saddr.ipv6,&daddr_ipv6,16); memcpy(&msgreq_class->saddr.ipv6,&daddr_ipv6,16);
gifr.type = NAS_MSG_CLASS_ADD_REQUEST; gifr.type = NAS_MSG_CLASS_ADD_REQUEST;
err=ioctl(fd, NAS_IOCTL_RRM, &gifr); err=ioctl(fd, NAS_IOCTL_RRM, &gifr);
if (err == -1) perror("ioctl"); if (err == -1) perror("ioctl");
} }
if (mpls_inlabelset == 1) { if (mpls_inlabelset == 1) {
msgreq_class = (struct nas_msg_class_add_request *)(gifr.msg); msgreq_class = (struct nas_msg_class_add_request *)(gifr.msg);
msgreq_class->rab_id = atoi(rb); msgreq_class->rab_id = atoi(rb);
msgreq_class->lcr = atoi(cx); msgreq_class->lcr = atoi(cx);
@@ -403,50 +380,34 @@ int main(int argc,char **argv)
msgreq_class->classref = 4 + (msgreq_class->lcr<<3); msgreq_class->classref = 4 + (msgreq_class->lcr<<3);
msgreq_class->dir=NAS_DIRECTION_SEND; msgreq_class->dir=NAS_DIRECTION_SEND;
msgreq_class->fct=NAS_FCT_QOS_SEND; msgreq_class->fct=NAS_FCT_QOS_SEND;
// TO BE FIXED WHEN WE CAN SPECIFY A PROTOCOL-based rule // TO BE FIXED WHEN WE CAN SPECIFY A PROTOCOL-based rule
msgreq_class->protocol = NAS_PROTOCOL_DEFAULT; msgreq_class->protocol = NAS_PROTOCOL_DEFAULT;
mpls_outlabel = atoi(mpls_outgoinglabel); mpls_outlabel = atoi(mpls_outgoinglabel);
printf("Setting MPLS outlabel %u with exp %d\n",mpls_outlabel,msgreq_class->dscp);
printf("Setting MPLS outlabel %d with exp %d\n",mpls_outlabel,msgreq_class->dscp);
msgreq_class->daddr.mpls_label = mpls_outlabel; msgreq_class->daddr.mpls_label = mpls_outlabel;
gifr.type = NAS_MSG_CLASS_ADD_REQUEST; gifr.type = NAS_MSG_CLASS_ADD_REQUEST;
err=ioctl(fd, NAS_IOCTL_RRM, &gifr); err=ioctl(fd, NAS_IOCTL_RRM, &gifr);
if (err == -1) perror("ioctl"); if (err == -1) perror("ioctl");
msgreq_class->rab_id = atoi(rb); msgreq_class->rab_id = atoi(rb);
msgreq_class->lcr = atoi(cx); msgreq_class->lcr = atoi(cx);
msgreq_class->classref = 5 + (msgreq_class->lcr<<3); msgreq_class->classref = 5 + (msgreq_class->lcr<<3);
msgreq_class->dir=NAS_DIRECTION_RECEIVE; msgreq_class->dir=NAS_DIRECTION_RECEIVE;
// TO BE FIXED WHEN WE CAN SPECIFY A PROTOCOL-based rule // TO BE FIXED WHEN WE CAN SPECIFY A PROTOCOL-based rule
msgreq_class->protocol = NAS_PROTOCOL_DEFAULT; msgreq_class->protocol = NAS_PROTOCOL_DEFAULT;
mpls_inlabel = atoi(mpls_incominglabel); mpls_inlabel = atoi(mpls_incominglabel);
printf("Setting MPLS inlabel %u with exp %d\n",mpls_inlabel,msgreq_class->dscp);
printf("Setting MPLS inlabel %d with exp %d\n",mpls_inlabel,msgreq_class->dscp);
msgreq_class->daddr.mpls_label = mpls_inlabel; msgreq_class->daddr.mpls_label = mpls_inlabel;
gifr.type = NAS_MSG_CLASS_ADD_REQUEST; gifr.type = NAS_MSG_CLASS_ADD_REQUEST;
err=ioctl(fd, NAS_IOCTL_RRM, &gifr); err=ioctl(fd, NAS_IOCTL_RRM, &gifr);
if (err == -1) perror("ioctl"); if (err == -1) perror("ioctl");
} }
} else if (action == DEL_RB) { } else if (action == DEL_RB) {
gifr.type = NAS_MSG_RB_RELEASE_REQUEST; gifr.type = NAS_MSG_RB_RELEASE_REQUEST;
err=ioctl(fd, NAS_IOCTL_RRM, &gifr); err=ioctl(fd, NAS_IOCTL_RRM, &gifr);
if (err == -1) perror("ioctl"); if (err == -1) perror("ioctl");
} }
} }
+77 -140
View File
@@ -37,7 +37,7 @@
//#define MPLS //#define MPLS
#ifdef MPLS #ifdef MPLS
#include <net/mpls.h> #include <net/mpls.h>
#endif #endif
@@ -46,12 +46,9 @@
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// Add a new classifier rule (send direction) // Add a new classifier rule (send direction)
struct classifier_entity *nas_CLASS_add_sclassifier(struct cx_entity *cx, uint8_t dscp, uint16_t classref) struct classifier_entity *nas_CLASS_add_sclassifier(struct cx_entity *cx, uint8_t dscp, uint16_t classref) {
{
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
struct classifier_entity *gc; struct classifier_entity *gc;
#ifdef NAS_DEBUG_CLASS #ifdef NAS_DEBUG_CLASS
printk("NAS_CLASS_ADD_SCLASSIFIER: begin for dscp %d, classref %d\n", dscp,classref); printk("NAS_CLASS_ADD_SCLASSIFIER: begin for dscp %d, classref %d\n", dscp,classref);
#endif #endif
@@ -91,8 +88,7 @@ struct classifier_entity *nas_CLASS_add_sclassifier(struct cx_entity *cx, uint8_
// Add a new classifier rule (receive direction) // Add a new classifier rule (receive direction)
struct classifier_entity *nas_CLASS_add_rclassifier(uint8_t dscp, struct classifier_entity *nas_CLASS_add_rclassifier(uint8_t dscp,
uint16_t classref, uint16_t classref,
struct nas_priv *gpriv) struct nas_priv *gpriv) {
{
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
struct classifier_entity *gc; struct classifier_entity *gc;
#ifdef NAS_DEBUG_CLASS #ifdef NAS_DEBUG_CLASS
@@ -125,8 +121,7 @@ struct classifier_entity *nas_CLASS_add_rclassifier(uint8_t dscp,
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// Add a new classifier rule (forwarding) // Add a new classifier rule (forwarding)
struct classifier_entity *nas_CLASS_add_fclassifier(struct cx_entity *cx, uint8_t dscp, uint16_t classref) struct classifier_entity *nas_CLASS_add_fclassifier(struct cx_entity *cx, uint8_t dscp, uint16_t classref) {
{
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
struct classifier_entity *gc; struct classifier_entity *gc;
#ifdef NAS_DEBUG_CLASS #ifdef NAS_DEBUG_CLASS
@@ -166,8 +161,7 @@ struct classifier_entity *nas_CLASS_add_fclassifier(struct cx_entity *cx, uint8_
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
void nas_CLASS_flush_sclassifier(struct cx_entity *cx) void nas_CLASS_flush_sclassifier(struct cx_entity *cx) {
{
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
uint8_t dscpi; uint8_t dscpi;
struct classifier_entity *gc; struct classifier_entity *gc;
@@ -196,8 +190,7 @@ void nas_CLASS_flush_sclassifier(struct cx_entity *cx)
#endif #endif
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
void nas_CLASS_flush_fclassifier(struct cx_entity *cx) void nas_CLASS_flush_fclassifier(struct cx_entity *cx) {
{
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
uint8_t dscpi; uint8_t dscpi;
struct classifier_entity *gc; struct classifier_entity *gc;
@@ -227,8 +220,7 @@ void nas_CLASS_flush_fclassifier(struct cx_entity *cx)
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
void nas_CLASS_flush_rclassifier(struct nas_priv *gpriv) void nas_CLASS_flush_rclassifier(struct nas_priv *gpriv) {
{
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
uint8_t dscpi; uint8_t dscpi;
struct classifier_entity *gc; struct classifier_entity *gc;
@@ -251,8 +243,7 @@ void nas_CLASS_flush_rclassifier(struct nas_priv *gpriv)
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// Delete a classifier rule (send direction) // Delete a classifier rule (send direction)
void nas_CLASS_del_sclassifier(struct cx_entity *cx, uint8_t dscp, uint16_t classref) void nas_CLASS_del_sclassifier(struct cx_entity *cx, uint8_t dscp, uint16_t classref) {
{
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
struct classifier_entity *p,*np; struct classifier_entity *p,*np;
#ifdef NAS_DEBUG_CLASS #ifdef NAS_DEBUG_CLASS
@@ -295,8 +286,7 @@ void nas_CLASS_del_sclassifier(struct cx_entity *cx, uint8_t dscp, uint16_t clas
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// Delete a classifier rule (send direction) // Delete a classifier rule (send direction)
void nas_CLASS_del_fclassifier(struct cx_entity *cx, uint8_t dscp, uint16_t classref) void nas_CLASS_del_fclassifier(struct cx_entity *cx, uint8_t dscp, uint16_t classref) {
{
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
struct classifier_entity *p,*np; struct classifier_entity *p,*np;
#ifdef NAS_DEBUG_CLASS #ifdef NAS_DEBUG_CLASS
@@ -339,8 +329,7 @@ void nas_CLASS_del_fclassifier(struct cx_entity *cx, uint8_t dscp, uint16_t clas
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// Delete a classifier rule (receive direction) // Delete a classifier rule (receive direction)
void nas_CLASS_del_rclassifier(uint8_t dscp, uint16_t classref,struct nas_priv *gpriv) void nas_CLASS_del_rclassifier(uint8_t dscp, uint16_t classref,struct nas_priv *gpriv) {
{
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
struct classifier_entity *p,*np; struct classifier_entity *p,*np;
#ifdef NAS_DEBUG_CLASS #ifdef NAS_DEBUG_CLASS
@@ -379,8 +368,7 @@ struct cx_entity *nas_CLASS_cx6(struct sk_buff *skb,
unsigned char dscp, unsigned char dscp,
struct nas_priv *gpriv, struct nas_priv *gpriv,
int inst, int inst,
unsigned char *cx_searcher) unsigned char *cx_searcher) {
{
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
unsigned char cxi; unsigned char cxi;
unsigned int *addr,*dst=NULL; unsigned int *addr,*dst=NULL;
@@ -388,17 +376,12 @@ struct cx_entity *nas_CLASS_cx6(struct sk_buff *skb,
struct classifier_entity *p=NULL; struct classifier_entity *p=NULL;
if (skb!=NULL) { if (skb!=NULL) {
for (cxi=*cx_searcher; cxi<NAS_CX_MAX; cxi++) { for (cxi=*cx_searcher; cxi<NAS_CX_MAX; cxi++) {
(*cx_searcher)++; (*cx_searcher)++;
p = gpriv->cx[cxi].sclassifier[dscp]; p = gpriv->cx[cxi].sclassifier[dscp];
while (p!=NULL) { while (p!=NULL) {
if (p->version == 6) { // verify that this is an IPv4 rule if (p->version == 6) { // verify that this is an IPv4 rule
if ((addr = (unsigned int *)(&(p->daddr.ipv6)))== NULL) { if ((addr = (unsigned int *)(&(p->daddr.ipv6)))== NULL) {
printk("nas_CLASS_cx6: addr is null \n"); printk("nas_CLASS_cx6: addr is null \n");
p = p->next; p = p->next;
@@ -409,9 +392,8 @@ struct cx_entity *nas_CLASS_cx6(struct sk_buff *skb,
printk("cx %d : %X,%X.%X,%X\n",cxi,addr[0],addr[1],addr[2],addr[3]); printk("cx %d : %X,%X.%X,%X\n",cxi,addr[0],addr[1],addr[2],addr[3]);
#endif //NAS_DEBUG_CLASS #endif //NAS_DEBUG_CLASS
//if ((dst = (unsigned int*)&(((struct rt6_info *)skbdst)->rt6i_gateway)) == 0){
if ( (dst = &((struct iphdr*)(skb_network_header(skb)))->daddr) == NULL) {
if ( (dst = &((struct iphdr *)(skb_network_header(skb)))->daddr) == NULL) {
printk("nas_CLASS_cx6: dst addr is null \n"); printk("nas_CLASS_cx6: dst addr is null \n");
p = p->next; p = p->next;
continue; continue;
@@ -446,11 +428,15 @@ struct cx_entity *nas_CLASS_cx6(struct sk_buff *skb,
} }
} }
printk("nas_CLASS_cx6 NOT FOUND: %X.%X.%X.%X\n",
dst[0], if (dst ) {
dst[1], printk("nas_CLASS_cx6 NOT FOUND: %X.%X.%X.%X\n",
dst[2], dst[0],
dst[3]); dst[1],
dst[2],
dst[3]);
}
return default_ip; return default_ip;
} }
@@ -460,8 +446,7 @@ struct cx_entity *nas_CLASS_cx4(struct sk_buff *skb,
unsigned char dscp, unsigned char dscp,
struct nas_priv *gpriv, struct nas_priv *gpriv,
int inst, int inst,
unsigned char *cx_searcher) unsigned char *cx_searcher) {
{
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
unsigned char cxi; unsigned char cxi;
unsigned char *addr; unsigned char *addr;
@@ -473,10 +458,9 @@ struct cx_entity *nas_CLASS_cx4(struct sk_buff *skb,
// return(gpriv->cx); //dump to clusterhead // return(gpriv->cx); //dump to clusterhead
if (skb!=NULL) { if (skb!=NULL) {
daddr = ((struct iphdr*)(skb_network_header(skb)))->daddr; daddr = ((struct iphdr *)(skb_network_header(skb)))->daddr;
if (daddr!=0) { if (daddr!=0) {
#ifdef NAS_DEBUG_CLASS #ifdef NAS_DEBUG_CLASS
printk("[NAS][CLASS][IPv4] Searching for %d.%d.%d.%d\n", printk("[NAS][CLASS][IPv4] Searching for %d.%d.%d.%d\n",
((unsigned char *)&daddr)[0], ((unsigned char *)&daddr)[0],
@@ -491,7 +475,6 @@ struct cx_entity *nas_CLASS_cx4(struct sk_buff *skb,
while (p!=NULL) { while (p!=NULL) {
if (p->version == 4) { // verify that this is an IPv4 rule if (p->version == 4) { // verify that this is an IPv4 rule
#ifdef NAS_DEBUG_CLASS #ifdef NAS_DEBUG_CLASS
addr = (char *)(&(p->daddr.ipv4)); addr = (char *)(&(p->daddr.ipv4));
printk("found classifier cx %d for destination: %d.%d.%d.%d\n",cxi,addr[0],addr[1],addr[2],addr[3]); printk("found classifier cx %d for destination: %d.%d.%d.%d\n",cxi,addr[0],addr[1],addr[2],addr[3]);
@@ -536,32 +519,23 @@ struct cx_entity *nas_CLASS_MPLS(struct sk_buff *skb,
unsigned char exp, unsigned char exp,
struct nas_priv *gpriv, struct nas_priv *gpriv,
int inst, int inst,
unsigned char *cx_searcher) unsigned char *cx_searcher) {
{
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
unsigned char cxi; unsigned char cxi;
struct cx_entity *default_label=NULL; struct cx_entity *default_label=NULL;
struct classifier_entity *p=NULL; struct classifier_entity *p=NULL;
// if (inst >0) // if (inst >0)
// return(gpriv->cx); //dump to clusterhead // return(gpriv->cx); //dump to clusterhead
#ifdef NAS_DEBUG_CLASS #ifdef NAS_DEBUG_CLASS
printk("[NAS][CLASS][MPLS] Searching for label %d\n",MPLSCB(skb)->label); printk("[NAS][CLASS][MPLS] Searching for label %d\n",MPLSCB(skb)->label);
#endif #endif
for (cxi=*cx_searcher; cxi<NAS_CX_MAX; ++cxi) { for (cxi=*cx_searcher; cxi<NAS_CX_MAX; ++cxi) {
(*cx_searcher)++; (*cx_searcher)++;
p = gpriv->cx[cxi].sclassifier[exp]; p = gpriv->cx[cxi].sclassifier[exp];
while (p!=NULL) { while (p!=NULL) {
if (p->version == NAS_MPLS_VERSION_CODE) { // verify that this is an MPLS rule if (p->version == NAS_MPLS_VERSION_CODE) { // verify that this is an MPLS rule
#ifdef NAS_DEBUG_CLASS #ifdef NAS_DEBUG_CLASS
printk("cx %d : label %d\n",cxi,p->daddr.mpls_label); printk("cx %d : label %d\n",cxi,p->daddr.mpls_label);
#endif //NAS_DEBUG_CLASS #endif //NAS_DEBUG_CLASS
@@ -588,11 +562,8 @@ struct cx_entity *nas_CLASS_MPLS(struct sk_buff *skb,
// goto to next classification rule for the connection // goto to next classification rule for the connection
p = p->next; p = p->next;
} }
} }
return default_label; return default_label;
} }
@@ -600,8 +571,7 @@ struct cx_entity *nas_CLASS_MPLS(struct sk_buff *skb,
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// Search the sending function // Search the sending function
void nas_CLASS_send(struct sk_buff *skb,int inst) void nas_CLASS_send(struct sk_buff *skb,int inst) {
{
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
struct classifier_entity *p, *sp; struct classifier_entity *p, *sp;
uint8_t *protocolh,version; uint8_t *protocolh,version;
@@ -609,15 +579,10 @@ void nas_CLASS_send(struct sk_buff *skb,int inst)
uint16_t classref; uint16_t classref;
struct cx_entity *cx; struct cx_entity *cx;
//unsigned int i; //unsigned int i;
//unsigned int router_adv = 0; //unsigned int router_adv = 0;
struct net_device *dev=nasdev[inst]; struct net_device *dev=nasdev[inst];
struct nas_priv *gpriv=netdev_priv(dev); struct nas_priv *gpriv=netdev_priv(dev);
unsigned char cx_searcher,no_connection=1; unsigned char cx_searcher,no_connection=1;
#ifdef NAS_DEBUG_CLASS #ifdef NAS_DEBUG_CLASS
printk("NAS_CLASS_SEND: begin - inst %d\n",inst); printk("NAS_CLASS_SEND: begin - inst %d\n",inst);
#endif #endif
@@ -629,9 +594,7 @@ void nas_CLASS_send(struct sk_buff *skb,int inst)
return; return;
} }
#ifdef NAS_DEBUG_SEND #ifdef NAS_DEBUG_SEND
printk("[NAS][CLASS][SEND] Got packet from kernel:\n"); printk("[NAS][CLASS][SEND] Got packet from kernel:\n");
for (i=0; i<256; i++) for (i=0; i<256; i++)
@@ -641,80 +604,65 @@ void nas_CLASS_send(struct sk_buff *skb,int inst)
#endif #endif
// find all connections related to socket // find all connections related to socket
cx_searcher = 0; cx_searcher = 0;
no_connection = 1; no_connection = 1;
//while (cx_searcher<NAS_CX_MAX) { //while (cx_searcher<NAS_CX_MAX) {
cx = NULL; cx = NULL;
// Address classification // Address classification
switch (ntohs(skb->protocol)) { switch (ntohs(skb->protocol)) {
case ETH_P_IPV6: case ETH_P_IPV6:
version = 6; version = 6;
protocolh=nas_TOOL_get_protocol6(
protocolh=nas_TOOL_get_protocol6( (struct ipv6hdr *)(skb_network_header(skb)),
(struct ipv6hdr *)(skb_network_header(skb)), &protocol);
&protocol); dscp=nas_TOOL_get_dscp6(
dscp=nas_TOOL_get_dscp6( (struct ipv6hdr *)(skb_network_header(skb))
(struct ipv6hdr *)(skb_network_header(skb)) );
);
#ifdef NAS_DEBUG_CLASS #ifdef NAS_DEBUG_CLASS
printk("NAS_CLASS_SEND: %p %d %p %d %p \n",skb, dscp, gpriv, inst, &cx_searcher); printk("NAS_CLASS_SEND: %p %d %p %d %p \n",skb, dscp, gpriv, inst, &cx_searcher);
#endif #endif
cx=nas_CLASS_cx6(skb,dscp,gpriv,inst,&cx_searcher); cx=nas_CLASS_cx6(skb,dscp,gpriv,inst,&cx_searcher);
#ifdef NAS_DEBUG_CLASS #ifdef NAS_DEBUG_CLASS
printk("NAS_CLASS_SEND: Got IPv6 packet, dscp = %d\n",dscp); printk("NAS_CLASS_SEND: Got IPv6 packet, dscp = %d\n",dscp);
#endif #endif
break; break;
case ETH_P_IP: case ETH_P_IP:
dscp=nas_TOOL_get_dscp4((struct iphdr *)(skb_network_header(skb)));
cx=nas_CLASS_cx4(skb,dscp,gpriv,inst,&cx_searcher);
dscp=nas_TOOL_get_dscp4((struct iphdr *)(skb_network_header(skb))); protocolh=nas_TOOL_get_protocol4(
cx=nas_CLASS_cx4(skb,dscp,gpriv,inst,&cx_searcher); (struct iphdr *)(skb_network_header(skb)),
protocolh=nas_TOOL_get_protocol4( &protocol);
(struct iphdr *)(skb_network_header(skb)),
&protocol);
#ifdef NAS_DEBUG_CLASS #ifdef NAS_DEBUG_CLASS
printk("NAS_CLASS_SEND: Got IPv4 packet (%x), dscp = %d, cx = %x\n",ntohs(skb->protocol),dscp,cx); printk("NAS_CLASS_SEND: Got IPv4 packet (%x), dscp = %d, cx = %x\n",ntohs(skb->protocol),dscp,cx);
#endif #endif
version = 4; version = 4;
break;
break;
#ifdef MPLS #ifdef MPLS
case ETH_P_MPLS_UC: case ETH_P_MPLS_UC:
cx=nas_CLASS_MPLS(skb,MPLSCB(skb)->exp,gpriv,inst,&cx_searcher); cx=nas_CLASS_MPLS(skb,MPLSCB(skb)->exp,gpriv,inst,&cx_searcher);
#ifdef NAS_DEBUG_CLASS #ifdef NAS_DEBUG_CLASS
printk("NAS_CLASS_SEND: Got MPLS unicast packet, exp = %d, label = %d, cx = %x\n",MPLSCB(skb)->exp,MPLSCB(skb)->label,cx); printk("NAS_CLASS_SEND: Got MPLS unicast packet, exp = %d, label = %d, cx = %x\n",MPLSCB(skb)->exp,MPLSCB(skb)->label,cx);
#endif
dscp = MPLSCB(skb)->exp;
version = NAS_MPLS_VERSION_CODE;
protocol = version;
break;
#endif #endif
dscp = MPLSCB(skb)->exp; default:
version = NAS_MPLS_VERSION_CODE; printk("NAS_CLASS_SEND: Unknown protocol\n");
protocol = version; version = 0;
break; return;
#endif
default:
printk("NAS_CLASS_SEND: Unknown protocol\n");
version = 0;
return;
} }
// If a valid connection for the DSCP/EXP with destination address // If a valid connection for the DSCP/EXP with destination address
// is found scan all protocol-based classification rules // is found scan all protocol-based classification rules
if (cx) { if (cx) {
classref=0; classref=0;
sp=NULL; sp=NULL;
#ifdef NAS_DEBUG_CLASS #ifdef NAS_DEBUG_CLASS
printk("[NAS][CLASSIFIER] DSCP/EXP %d : looking for classifier entry\n",dscp); printk("[NAS][CLASSIFIER] DSCP/EXP %d : looking for classifier entry\n",dscp);
#endif #endif
@@ -738,12 +686,10 @@ void nas_CLASS_send(struct sk_buff *skb,int inst)
classref=sp->classref; classref=sp->classref;
break; break;
} }
} }
if (sp!=NULL) { if (sp!=NULL) {
#ifdef NAS_DEBUG_CLASS #ifdef NAS_DEBUG_CLASS
char sfct[10], sprotocol[10]; char sfct[10], sprotocol[10];
if (sp->fct==nas_COMMON_QOS_send) if (sp->fct==nas_COMMON_QOS_send)
@@ -759,41 +705,38 @@ void nas_CLASS_send(struct sk_buff *skb,int inst)
strcpy(sfct, "dc"); strcpy(sfct, "dc");
switch(protocol) { switch(protocol) {
case NAS_PROTOCOL_UDP: case NAS_PROTOCOL_UDP:
strcpy(sprotocol, "udp"); strcpy(sprotocol, "udp");
printk("udp packet\n"); printk("udp packet\n");
break; break;
case NAS_PROTOCOL_TCP: case NAS_PROTOCOL_TCP:
strcpy(sprotocol, "tcp"); strcpy(sprotocol, "tcp");
printk("tcp packet\n"); printk("tcp packet\n");
break; break;
case NAS_PROTOCOL_ICMP4: case NAS_PROTOCOL_ICMP4:
strcpy(sprotocol, "icmp4"); strcpy(sprotocol, "icmp4");
printk("icmp4 packet\n"); printk("icmp4 packet\n");
break; break;
case NAS_PROTOCOL_ICMP6: case NAS_PROTOCOL_ICMP6:
strcpy(sprotocol, "icmp6"); strcpy(sprotocol, "icmp6");
print_TOOL_pk_icmp6((struct icmp6hdr*)protocolh); print_TOOL_pk_icmp6((struct icmp6hdr *)protocolh);
break; break;
#ifdef MPLS #ifdef MPLS
case NAS_MPLS_VERSION_CODE: case NAS_MPLS_VERSION_CODE:
strcpy(sprotocol,"mpls"); strcpy(sprotocol,"mpls");
break; break;
#endif #endif
} }
printk("NAS_CLASS_SEND: (dscp %u, %s) received, (classref %u, fct %s, rab_id %u) classifier rule\n", printk("NAS_CLASS_SEND: (dscp %u, %s) received, (classref %u, fct %s, rab_id %u) classifier rule\n",
dscp, sprotocol, sp->classref, sfct, sp->rab_id); dscp, sprotocol, sp->classref, sfct, sp->rab_id);
#endif #endif
sp->fct(skb, cx, sp,inst, NULL); sp->fct(skb, cx, sp,inst, NULL);
} // if classifier entry match found } // if classifier entry match found
else { else {
printk("NAS_CLASS_SEND: no corresponding item in the classifier, so the message is dropped\n"); printk("NAS_CLASS_SEND: no corresponding item in the classifier, so the message is dropped\n");
// nas_COMMON_del_send(skb, cx, NULL,inst); // nas_COMMON_del_send(skb, cx, NULL,inst);
@@ -802,20 +745,14 @@ void nas_CLASS_send(struct sk_buff *skb,int inst)
no_connection = 0; no_connection = 0;
} // if connection found } // if connection found
#ifdef NAS_DEBUG_CLASS #ifdef NAS_DEBUG_CLASS
if (no_connection == 1) if (no_connection == 1)
printk("NAS_CLASS_SEND: no corresponding connection, so the message is dropped\n"); printk("NAS_CLASS_SEND: no corresponding connection, so the message is dropped\n");
#endif /* NAS_DEBUG_CLASS */ #endif /* NAS_DEBUG_CLASS */
// } // while loop over connections // } // while loop over connections
#ifdef NAS_DEBUG_CLASS #ifdef NAS_DEBUG_CLASS
printk("NAS_CLASS_SEND: end\n"); printk("NAS_CLASS_SEND: end\n");
#endif #endif
} }
+2 -2
View File
@@ -110,7 +110,7 @@ int ue_ip_netlink_init(void)
# if LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0) # if LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0)
THIS_MODULE, THIS_MODULE,
# endif # endif
&cfg &cfg);
#else /* LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0) */ #else /* LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0) */
nas_nl_sk = netlink_kernel_create( nas_nl_sk = netlink_kernel_create(
&init_net, &init_net,
@@ -120,7 +120,7 @@ int ue_ip_netlink_init(void)
&nasmesh_mutex, // NULL &nasmesh_mutex, // NULL
THIS_MODULE); THIS_MODULE);
#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0) */ #endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0) */
);
if (nas_nl_sk == NULL) { if (nas_nl_sk == NULL) {

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