* Update the relay node (RN) procedure when multicast relaying is enabled

* Fix the non-continous indexing of the PDCP array (replace rb_id by lc_id)
* Add a new test case 03 for Rel10 and eMBMS  
  


git-svn-id: http://svn.eurecom.fr/openair4G/trunk@4149 818b1a75-f10b-46b9-bf7c-635c3b92a50f
This commit is contained in:
Navid Nikaein
2013-09-17 05:45:21 +00:00
parent e46fb84684
commit c5196908d5
19 changed files with 437 additions and 199 deletions
+20 -22
View File
@@ -201,7 +201,7 @@ help (void) {
printf (" - wireshark: Enable tracing of layers above PHY using an UDP socket\n");
printf (" - pcap: Enable tracing of layers above PHY to a pcap file\n");
printf (" - tshark: Not implemented yet\n");
printf ("-Q Activate and set the MBMS service: 0 : not used (default eMBMS disabled), 1: eMBMS and RRC enabled, 2: eMBMS relaying and RRC enabled, 3: eMBMS enabled, RRC disabled, 4: eMBMS relaying enabled, RRC disabled\n");
printf ("-Q Activate and set the MBMS service: 0 : not used (default eMBMS disabled), 1: eMBMS and RRC Connection enabled, 2: eMBMS relaying and RRC Connection enabled, 3: eMBMS enabled, RRC Connection disabled, 4: eMBMS relaying enabled, RRC Connection disabled\n");
printf ("-R [6,15,25,50,75,100] Sets N_RB_DL\n");
printf ("-r Activates rate adaptation (DL for now)\n");
printf ("-s snr_dB set a fixed (average) SNR, this deactivates the openair channel model generator (OCM)\n");
@@ -368,7 +368,7 @@ int
s32 UE_id=0, eNB_id=0, RN_id=0;
relaying_mode_t r_mode=no_relay; // no relaying
relaying_type_t r_type=no_relay; // no relaying
// time calibration for soft realtime mode
lte_subframe_t direction;
@@ -631,7 +631,6 @@ int
direction = subframe_select(frame_parms,next_slot>>1);
r_mode = no_relay;
#ifdef PROC
if(Channel_Flag==1)
Channel_Func(s_re2,s_im2,r_re2,r_im2,r_re02,r_im02,r_re0_d,r_im0_d,r_re0_u,r_im0_u,eNB2UE,UE2eNB,enb_data,ue_data,abstraction_flag,frame_parms,slot);
@@ -647,8 +646,8 @@ int
eNB_id++) {
//printf ("debug: Nid_cell %d\n", PHY_vars_eNB_g[eNB_id]->lte_frame_parms.Nid_cell);
//printf ("debug: frame_type %d,tdd_config %d\n", PHY_vars_eNB_g[eNB_id]->lte_frame_parms.frame_type,PHY_vars_eNB_g[eNB_id]->lte_frame_parms.tdd_config);
LOG_D(EMU,"PHY procedures eNB %d mode %s for frame %d, slot %d (subframe TX %d, RX %d) TDD %d/%d Nid_cell %d\n",
eNB_id, (r_mode == 0)?"Normal":"Relaying", frame, slot, next_slot >> 1,last_slot>>1,
LOG_D(EMU,"PHY procedures eNB %d for frame %d, slot %d (subframe TX %d, RX %d) TDD %d/%d Nid_cell %d\n",
eNB_id, frame, slot, next_slot >> 1,last_slot>>1,
PHY_vars_eNB_g[eNB_id]->lte_frame_parms.frame_type,
PHY_vars_eNB_g[eNB_id]->lte_frame_parms.tdd_config,PHY_vars_eNB_g[eNB_id]->lte_frame_parms.Nid_cell);
@@ -659,7 +658,7 @@ int
pdcp_run(frame, 1, 0, eNB_id);//PHY_vars_eNB_g[eNB_id]->Mod_id
// PHY_vars_eNB_g[eNB_id]->frame = frame;
phy_procedures_eNB_lte (last_slot, next_slot, PHY_vars_eNB_g[eNB_id], abstraction_flag, r_mode);
phy_procedures_eNB_lte (last_slot, next_slot, PHY_vars_eNB_g[eNB_id], abstraction_flag, no_relay);
#ifdef PRINT_STATS
if(last_slot==9 && frame%10==0)
@@ -692,8 +691,8 @@ int
UE_id++){
if (frame >= (UE_id * 20)) { // activate UE only after 20*UE_id frames so that different UEs turn on separately
LOG_D(EMU,"PHY procedures UE %d mode %s for frame %d, slot %d (subframe TX %d, RX %d)\n",
UE_id, (r_mode == 0)?"Normal":"Relaying", frame, slot, next_slot >> 1,last_slot>>1);
LOG_D(EMU,"PHY procedures UE %d for frame %d, slot %d (subframe TX %d, RX %d)\n",
UE_id, frame, slot, next_slot >> 1,last_slot>>1);
if (PHY_vars_UE_g[UE_id]->UE_mode[0] != NOT_SYNCHED) {
if (frame>0) {
@@ -705,7 +704,7 @@ int
//Access layer
pdcp_run(frame, 0, UE_id, 0);
phy_procedures_UE_lte (last_slot, next_slot, PHY_vars_UE_g[UE_id], 0, abstraction_flag,normal_txrx, r_mode);
phy_procedures_UE_lte (last_slot, next_slot, PHY_vars_UE_g[UE_id], 0, abstraction_flag,normal_txrx, no_relay);
ue_data[UE_id]->tx_power_dBm = PHY_vars_UE_g[UE_id]->tx_power_dBm;
}
}
@@ -754,34 +753,33 @@ int
eNB_id= oai_emulation.info.first_enb_local+oai_emulation.info.nb_enb_local + RN_id; // NB_eNB_INST + RN_id
// currently only works in FDD
if (oai_emulation.info.eMBMS_active_state == 4){
r_mode = multicast_relay;
LOG_I(EMU,"Activating the multicast relaying\n");
r_type = multicast_relay;
//LOG_I(EMU,"Activating the multicast relaying\n");
}else {
LOG_E(EMU,"Not supported option when relaying is enabled %d\n", r_mode);
LOG_E(EMU,"Not supported eMBMS option when relaying is enabled %d\n", r_type);
exit(-1);
}
if ( oai_emulation.info.frame_type == 0) {
// RN == UE, do RX as in UE for SF0-SF5
// we could add another arg, such as operation, to call the top func phy_procedures_UE_lte
// RN == UE
if (frame>0) {
if (PHY_vars_UE_g[UE_id]->UE_mode[0] != NOT_SYNCHED) {
LOG_D(EMU,"PHY procedures UE %d mode %d for frame %d, slot %d (subframe TX %d, RX %d)\n",
UE_id, (r_mode == 0)?"Normal":"Relaying", frame, slot, next_slot >> 1,last_slot>>1);
LOG_D(EMU,"[RN %d] PHY procedures UE %d for frame %d, slot %d (subframe TX %d, RX %d)\n",
RN_id, UE_id, frame, slot, next_slot >> 1,last_slot>>1);
PHY_vars_UE_g[UE_id]->frame = frame;
phy_procedures_UE_lte (last_slot, next_slot, PHY_vars_UE_g[UE_id], 0, abstraction_flag,normal_txrx, r_mode);
phy_procedures_UE_lte (last_slot, next_slot, PHY_vars_UE_g[UE_id], 0, abstraction_flag,normal_txrx, r_type);
} else if (last_slot == (LTE_SLOTS_PER_FRAME-2)) {
initial_sync(PHY_vars_UE_g[UE_id],normal_txrx);
}
}
// RN == eNB, do Tx as in eNB for SF6-SF9
LOG_D(EMU,"PHY procedures eNB %d mode %s for frame %d, slot %d (subframe TX %d, RX %d)\n",
eNB_id, (r_mode == 0)?"Normal":"Relaying", frame, slot, next_slot >> 1,last_slot>>1);
phy_procedures_eNB_lte (last_slot, next_slot, PHY_vars_eNB_g[eNB_id], abstraction_flag, r_mode);
// RN == eNB
LOG_D(EMU,"[RN %d] PHY procedures eNB %d for frame %d, slot %d (subframe TX %d, RX %d)\n",
RN_id, eNB_id, frame, slot, next_slot >> 1,last_slot>>1);
phy_procedures_eNB_lte (last_slot, next_slot, PHY_vars_eNB_g[eNB_id], abstraction_flag, r_type);
}
else{
LOG_E(EMU,"TDD is not supported for multicast relaying %d\n", r_mode);
LOG_E(EMU,"TDD is not supported for multicast relaying %d\n", r_type);
exit(-1);
}
}
+1 -1
View File
@@ -141,7 +141,7 @@ void get_simulation_options(int argc, char *argv[]) {
break;
case 'Q':
//eMBMS_active=1;
// 0 : not used (default), 1: eMBMS and RRC enabled, 2: eMBMS relaying and RRC enabled, 3: eMBMS enabled, RRC disabled, 3: eMBMS relaying enabled, RRC disabled
// 0 : not used (default), 1: eMBMS and RRC enabled, 2: eMBMS relaying and RRC enabled, 3: eMBMS enabled, RRC disabled, 4: eMBMS relaying enabled, RRC disabled
oai_emulation.info.eMBMS_active_state = atoi (optarg);
break;
case 'R':
+14 -3
View File
@@ -10,15 +10,26 @@ Obj.# Case# Test# Description
01 01 04 Build dlsim Rel8
01 01 05 Build ulsim Rel8
01 01 06 Build oaisim Rel10
01 01 07 Build oaisim Rel8 with cellular RRC for eNB
01 01 08 Build oaisim Rel8 with cellular RRC for UE
01 02 Run OAI, and check the operation
01 02 Run OAI Rel8, and check the operation
01 02 00 Run OAI Rel8, and search for segmentation fault or exit
01 02 01 Run OAI Rel8, and search for execution errors
01 02 02 Run OAI Rel8 in abstraction mode and check that RRC proc is finished completely for the configured number of eNB and UE
01 02 03 Run OAI Rel8 in abstraction mode, send ping from from one eNB to each UE, and check that there is no packet losses
01 02 04 Run OAI Rel8 with full PHY, and check that the RRC proc for eNBsxUEs
01 02 05 Run OAI Rel10 in abstraction mode, and check the RRC proc for eNBsxUEs
01 02 05 Run OAI Rel10 in full phy mode, and check the RRC proc for eNBsxUEs
01 02 05 Run OAI Rel8 with full PHY in FDD mode, and check that the RRC proc for eNBsxUEs
01 03 Run OAI Rel10, and check the operation
01 03 00 Run OAI Rel10, and search for segmentation fault or exit
01 03 01 Run OAI Rel10, and search for execution errors
01 03 02 Run OAI Rel10 in abstraction mode, and check the RRC proc for eNBsxUEs
01 03 03 Run OAI Rel10 in full phy mode, and check the RRC proc for eNBsxUEs
01 03 04 Run OAI Rel10 in full phy mode in FDD mode, and check the RRC proc for eNBsxUEs
01 03 05 Run OAI Rel10 with eMBMS enabled, and check the SIB13 and MCCH
01 03 06 Run OAI Rel10 with eMBMS enabled, and check the MTCH
01 03 07 Run OAI Rel10 with eMBMS enabled and FDD mode, and check the MTCH
02 Functional test case
+4 -4
View File
@@ -172,9 +172,9 @@ def execute(oai, user, pw, logfile):
try:
test = '07'
name = 'Compile oai.rel8.cellular.rg.make'
name = 'Compile oai.rel8.cellular.eNB.make'
conf = 'make rrc_cellular=1 eNB_flag=1'
diag = 'check the compilation errors for RRC Cellular (node RG)'
diag = 'check the compilation errors for eNB/RG RRC Cellular'
oai.send('make clean;')
oai.send('make cleanall;')
oai.send('make cleanasn1;')
@@ -188,9 +188,9 @@ def execute(oai, user, pw, logfile):
try:
test = '08'
name = 'Compile oai.rel8.cellular.mt.make'
name = 'Compile oai.rel8.cellular.UE.make'
conf = 'make rrc_cellular=1 UE_flag=1'
diag = 'check the compilation errors for RRC Cellular (node MT)'
diag = 'check the compilation errors for UE/MT RRC Cellular'
oai.send('make clean;')
oai.send('make cleanall;')
oai.send('make cleanasn1;')
+6 -17
View File
@@ -130,26 +130,15 @@ def execute(oai, user, pw, logfile):
try:
test = '05'
name = 'Run oai.rel10.abs.rrc'
diag = 'RRC procedure is not finished completely, check the execution logs and trace BCCH, CCCH, and DCCH channels'
name = 'Run oai.rel8.phy.rrc.fdd'
diag = 'RRC procedure is not finished completely in FDD mode, check the execution logs and trace BCCH, CCCH, and DCCH channels'
for i in range(NUM_UE) :
for j in range(NUM_eNB) :
conf = '-a -A AWGN -n' + str((i+1+j) * 50) + ' -u' + str(i+1) +' -b'+ str(j+1)
oai.send_expect('./oaisim.rel10 ' + conf, ' Received RRCConnectionReconfigurationComplete from UE ' + str(i), (i+1) * 100)
conf = '-A AWGN -F -n' + str((i+1+j) * 50) + ' -u' + str(i+1) +' -b'+ str(j+1) + ' -s15 -x1'
oai.send_expect('./oaisim.rel8 ' + conf, ' Received RRCConnectionReconfigurationComplete from UE ' + str(i), (i+1) * 100)
except log.err, e:
log.fail(case, test, name, conf, e.value, diag, logfile)
else:
log.ok(case, test, name, conf, '', logfile)
log.ok(case, test, name, conf, '', logfile)
try:
test = '06'
name = 'Run oai.rel10.phy.rrc'
diag = 'RRC procedure is not finished completely, check the execution logs and trace BCCH, CCCH, and DCCH channels'
for i in range(NUM_UE) :
for j in range(NUM_eNB) :
conf = '-A AWGN -s 15 -x 1 -n' + str((i+1+j) * 50) + ' -u' + str(i+1) +' -b'+ str(j+1)
oai.send_expect('./oaisim.rel10 ' + conf, ' Received RRCConnectionReconfigurationComplete from UE ' + str(i), (i+1) * 100)
except log.err, e:
log.fail(case, test, name, conf, e.value, diag, logfile)
else:
log.ok(case, test, name, conf, '', logfile)
+156
View File
@@ -0,0 +1,156 @@
#******************************************************************************
# Eurecom OpenAirInterface
# Copyright(c) 1999 - 2013 Eurecom
# This program is free software; you can redistribute it and/or modify it
# under the terms and conditions of the GNU General Public License,
# version 2, as published by the Free Software Foundation.
# This program is distributed in the hope it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# more details.
# You should have received a copy of the GNU General Public License along with
# this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
# The full GNU General Public License is included in this distribution in
# the file called "COPYING".
# Contact Information
# Openair Admin: openair_admin@eurecom.fr
# Openair Tech : openair_tech@eurecom.fr
# Forums : http://forums.eurecom.fsr/openairinterface
# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France
#*****************************************************************************
# \file case03.py
# \brief test case 03 for OAI: executions
# \author Navid Nikaein
# \date 2013
# \version 0.1
# @ingroup _test
import time
import random
import log
import openair
import core
NUM_UE=2
NUM_eNB=1
NUM_TRIALS=3
def execute(oai, user, pw, logfile):
case = '03'
oai.send('cd $OPENAIR_TARGETS;')
oai.send('cd SIMU/USER;')
try:
test = '00'
name = 'Run oai.rel10.sf'
conf = '-a -A AWGN -n 100'
diag = 'OAI is not running normally (Segmentation fault / Exiting / FATAL), debugging might be needed'
oai.send_expect_false('./oaisim.rel10 ' + conf, 'Segmentation fault', 30)
oai.send_expect_false('./oaisim.rel10 ' + conf, 'Exiting', 30)
oai.send_expect_false('./oaisim.rel10 ' + conf, 'FATAL', 30)
except log.err, e:
log.fail(case, test, name, conf, e.value, diag, logfile)
else:
log.ok(case, test, name, conf, '', logfile)
try:
test = '01'
name = 'Run oai.rel10.err'
conf = '-a -A AWGN -n 100'
diag = 'Error(s) found in the execution, check the execution logs'
oai.send_expect_false('./oaisim.rel10 ' + conf, '[E]', 30)
except log.err, e:
log.fail(case, test, name, conf, e.value, diag, logfile)
else:
log.ok(case, test, name, conf, '', logfile)
try:
test = '02'
name = 'Run oai.rel10.abs.rrc'
diag = 'RRC procedure is not finished completely, check the execution logs and trace BCCH, CCCH, and DCCH channels'
for i in range(NUM_UE) :
for j in range(NUM_eNB) :
conf = '-a -A AWGN -n' + str((i+1+j) * 50) + ' -u' + str(i+1) +' -b'+ str(j+1)
oai.send_expect('./oaisim.rel10 ' + conf, ' Received RRCConnectionReconfigurationComplete from UE ' + str(i), (i+1) * 100)
except log.err, e:
log.fail(case, test, name, conf, e.value, diag, logfile)
else:
log.ok(case, test, name, conf, '', logfile)
try:
test = '03'
name = 'Run oai.rel10.phy.rrc'
diag = 'RRC procedure is not finished completely, check the execution logs and trace BCCH, CCCH, and DCCH channels'
for i in range(NUM_UE) :
for j in range(NUM_eNB) :
conf = '-A AWGN -s 15 -x 1 -n' + str((i+1+j) * 50) + ' -u' + str(i+1) +' -b'+ str(j+1)
oai.send_expect('./oaisim.rel10 ' + conf, ' Received RRCConnectionReconfigurationComplete from UE ' + str(i), (i+1) * 100)
except log.err, e:
log.fail(case, test, name, conf, e.value, diag, logfile)
else:
log.ok(case, test, name, conf, '', logfile)
try:
test = '04'
name = 'Run oai.rel10.phy.rrc.fdd'
diag = 'RRC procedure is not finished completely in FDD mode, check the execution logs and trace BCCH, CCCH, and DCCH channels'
for i in range(NUM_UE) :
for j in range(NUM_eNB) :
conf = '-A AWGN -F -s 15 -x 1 -n' + str((i+1+j) * 50) + ' -u' + str(i+1) +' -b'+ str(j+1)
oai.send_expect('./oaisim.rel10 ' + conf, ' Received RRCConnectionReconfigurationComplete from UE ' + str(i), (i+1) * 100)
except log.err, e:
log.fail(case, test, name, conf, e.value, diag, logfile)
else:
log.ok(case, test, name, conf, '', logfile)
try:
test = '05'
name = 'Run oai.rel10.phy.eMBMS.MCCH'
diag = 'eMBMS procedure is not finished completely, make sure that the SIB13/MCCH have been correclty received by UEs'
for i in range(NUM_UE) :
for j in range(NUM_eNB) :
conf = '-A AWGN -s 15 -x 1 -Q3 -n' + str((i+1+j) * 50) + ' -u' + str(i+1) +' -b'+ str(j+1)
oai.send_expect('./oaisim.rel10 ' + conf, ' Found MBSFNAreaConfiguration from eNB ' + str(j), (i+1) * 100)
except log.err, e:
log.fail(case, test, name, conf, e.value, diag, logfile)
else:
log.ok(case, test, name, conf, '', logfile)
try:
test = '06'
name = 'Run oai.rel10.phy.eMBMS.OTG'
diag = 'eMBMS multicast/broadcast data is not received, make sure that the SIB13/MCCH/MTCH have been correclty received by UEs'
for i in range(NUM_UE) :
for j in range(NUM_eNB) :
conf = '-A AWGN -s 15 -x 1 -T mscbr -Q3 -n' + str((i+1+j) * 100) + ' -u' + str(i+1) +' -b'+ str(j+1)
oai.send_expect('./oaisim.rel10 ' + conf, ' Received a multicast packet', (i+1) * 100)
except log.err, e:
log.fail(case, test, name, conf, e.value, diag, logfile)
else:
log.ok(case, test, name, conf, 'Note: check the packet loss from the OTG stats', logfile)
try:
test = '07'
name = 'Run oai.rel10.phy.eMBMS.OTG.fdd'
diag = 'eMBMS multicast/broadcast data is not received in fdd mode, make sure that the SIB13/MCCH/MTCH have been correclty received by UEs'
for i in range(NUM_UE) :
for j in range(NUM_eNB) :
conf = '-A AWGN -F -s 15 -x 1 -T mscbr -Q3 -n' + str((i+1+j) * 100) + ' -u' + str(i+1) +' -b'+ str(j+1)
oai.send_expect('./oaisim.rel10 ' + conf, ' Received a multicast packet', (i+1) * 100)
except log.err, e:
log.fail(case, test, name, conf, e.value, diag, logfile)
else:
log.ok(case, test, name, conf, 'Note: check the packet loss from the OTG stats', logfile)
+1 -1
View File
@@ -144,7 +144,7 @@ def ok(case, testnum, testname, conf, message, output):
report(case, testnum, testname, conf, 'passed', output)
log_record('passed', case + testnum + ' : ' + testname + ' ('+ conf+')')
if message :
log_record('passed', "Output follows:\n" + message )
print bcolors.okgreen + message + bcolors.normal
stats['passed'] += 1
+12 -6
View File
@@ -41,10 +41,13 @@ import os
import time
import datetime
import getpass
import math #from time import clock
import log
import case01
import case02
import case03
from openair import *
debug = 0
@@ -70,11 +73,11 @@ for arg in sys.argv:
# get the oai object
oai = openair('localdomain','localhost')
#start_time = time.time() # datetime.datetime.now()
try:
user = getpass.getuser()
print '\n*******Note that the user <'+user+'> should be a sudoer *******\n'
print '*******Connecting to the localhost to perform the test *******\n'
print '\n******* Note that the user <'+user+'> should be a sudoer *******\n'
print '******* Connecting to the localhost to perform the test *******\n'
if not pw :
print "username: " + user
@@ -95,14 +98,15 @@ test = 'test01'
ctime=datetime.datetime.utcnow().strftime("%Y-%m-%d.%Hh%M")
logfile = user+'.'+test+'.'+ctime+'.txt'
#print '=================start the ' + test + ' at ' + ctime + '=================\n'
print 'Results will be reported in log file : ' + logfile
#print 'Results will be reported in log file : ' + logfile
log.writefile(logfile,'====================start'+test+' at ' + ctime + '=======================\n')
log.set_debug_level(debug)
oai.kill(user, pw)
# start te test cases
case01.execute(oai, user, pw, logfile)
case02.execute(oai, user, pw, logfile)
#case01.execute(oai, user, pw, logfile)
#case02.execute(oai, user, pw, logfile)
#case03.execute(oai, user, pw, logfile)
oai.kill(user, pw)
@@ -115,4 +119,6 @@ oai.disconnect()
ctime=datetime.datetime.utcnow().strftime("%Y-%m-%d_%Hh%M")
log.writefile(logfile,'====================end the '+ test + ' at ' + ctime +'====================')
print 'Test results can be found in : ' + logfile
#print '\nThis test took %f minutes\n' % math.ceil((time.time() - start_time)/60)
#print '\n=====================end the '+ test + ' at ' + ctime + '====================='