* add RA procedures for handover, SR, and other DCCH messaging. Status: experimental
* fixed few issues in the testing scripts * pre-ci passed git-svn-id: http://svn.eurecom.fr/openair4G/trunk@4334 818b1a75-f10b-46b9-bf7c-635c3b92a50f
This commit is contained in:
@@ -316,7 +316,8 @@ int rrc_mac_config_req(u8 Mod_id,u8 eNB_flag,u8 UE_id,u8 eNB_index,
|
||||
(void *)mobilityControlInfo->radioResourceConfigCommon.ul_CyclicPrefixLength,
|
||||
sizeof(UL_CyclicPrefixLength_t));
|
||||
}
|
||||
|
||||
// store the previous rnti in case of failure, and set thenew rnti
|
||||
UE_mac_inst[Mod_id].crnti_before_ho = UE_mac_inst[Mod_id].crnti;
|
||||
UE_mac_inst[Mod_id].crnti = ((mobilityControlInfo->newUE_Identity.buf[0])|(mobilityControlInfo->newUE_Identity.buf[1]<<8));
|
||||
LOG_I(MAC,"[UE %d] Received new identity %x from %d\n", Mod_id, UE_mac_inst[Mod_id].crnti, eNB_index);
|
||||
UE_mac_inst[Mod_id].rach_ConfigDedicated = malloc(sizeof(*mobilityControlInfo->rach_ConfigDedicated));
|
||||
|
||||
@@ -711,6 +711,8 @@ typedef struct{
|
||||
u32 subframe;
|
||||
/// C-RNTI of UE
|
||||
u16 crnti;
|
||||
/// C-RNTI of UE before HO
|
||||
uint16_t crnti_before_ho; ///user id (rnti) of connected UEs
|
||||
/// uplink active flag
|
||||
uint8_t ul_active;
|
||||
/// pointer to RRC PHY configuration
|
||||
|
||||
@@ -227,7 +227,13 @@ PRACH_RESOURCES_t *ue_get_rach(u8 Mod_id,u32 frame, u8 eNB_index,u8 subframe){
|
||||
u16 Size16;
|
||||
struct RACH_ConfigCommon *rach_ConfigCommon = (struct RACH_ConfigCommon *)NULL;
|
||||
s32 frame_diff=0;
|
||||
|
||||
mac_rlc_status_resp_t rlc_status;
|
||||
u8 dcch_header_len=0;
|
||||
u8 dcch_header_len_tmp=0;
|
||||
u16 sdu_lengths[8];
|
||||
u8 sdu_lcids[8],payload_offset=0,num_sdus=0;
|
||||
u8 ulsch_buff[MAX_ULSCH_PAYLOAD_BYTES];
|
||||
u16 sdu_length_total=0;
|
||||
|
||||
if (UE_mode == PRACH) {
|
||||
if (UE_mac_inst[Mod_id].radioResourceConfigCommon)
|
||||
@@ -254,11 +260,9 @@ PRACH_RESOURCES_t *ue_get_rach(u8 Mod_id,u32 frame, u8 eNB_index,u8 subframe){
|
||||
|
||||
if (Size>0) {
|
||||
|
||||
|
||||
|
||||
UE_mac_inst[Mod_id].RA_active = 1;
|
||||
UE_mac_inst[Mod_id].RA_PREAMBLE_TRANSMISSION_COUNTER = 1;
|
||||
UE_mac_inst[Mod_id].RA_Msg3_size = Size+sizeof(SCH_SUBHEADER_SHORT)+sizeof(SCH_SUBHEADER_SHORT);
|
||||
UE_mac_inst[Mod_id].RA_Msg3_size = Size+sizeof(SCH_SUBHEADER_SHORT)+sizeof(SCH_SUBHEADER_SHORT);
|
||||
UE_mac_inst[Mod_id].RA_prachMaskIndex = 0;
|
||||
UE_mac_inst[Mod_id].RA_prach_resources.Msg3 = UE_mac_inst[Mod_id].CCCH_pdu.payload;
|
||||
UE_mac_inst[Mod_id].RA_backoff_cnt = 0; // add the backoff condition here if we have it from a previous RA reponse which failed (i.e. backoff indicator)
|
||||
@@ -289,6 +293,65 @@ PRACH_RESOURCES_t *ue_get_rach(u8 Mod_id,u32 frame, u8 eNB_index,u8 subframe){
|
||||
NULL, // short bsr
|
||||
NULL, // long_bsr
|
||||
1); //post_padding
|
||||
|
||||
return(&UE_mac_inst[Mod_id].RA_prach_resources);
|
||||
}
|
||||
else if (UE_mac_inst[Mod_id].scheduling_info.BSR_bytes[DCCH] > 0) {
|
||||
// This is for triggering a transmission on DCCH using PRACH (during handover, or sending SR for example)
|
||||
dcch_header_len = 2 + 2; /// SHORT Subheader + C-RNTI control element
|
||||
rlc_status = mac_rlc_status_ind(Mod_id+NB_eNB_INST,frame,0,RLC_MBMS_NO,
|
||||
DCCH,
|
||||
6);
|
||||
if (UE_mac_inst[Mod_id].crnti_before_ho)
|
||||
LOG_D(MAC,"[UE %d] Frame %d : UL-DCCH -> ULSCH, HO RRCConnectionReconfigurationComplete (%x, %x), RRC message has %d bytes to send throug PRACH (mac header len %d)\n",
|
||||
Mod_id,frame, UE_mac_inst[Mod_id].crnti,UE_mac_inst[Mod_id].crnti_before_ho, rlc_status.bytes_in_buffer,dcch_header_len);
|
||||
else
|
||||
LOG_D(MAC,"[UE %d] Frame %d : UL-DCCH -> ULSCH, RRC message has %d bytes to send through PRACH(mac header len %d)\n",
|
||||
Mod_id,frame, rlc_status.bytes_in_buffer,dcch_header_len);
|
||||
|
||||
sdu_lengths[0] = mac_rlc_data_req(Mod_id+NB_eNB_INST,frame,RLC_MBMS_NO,
|
||||
DCCH,
|
||||
(char *)&ulsch_buff[0]);
|
||||
|
||||
sdu_length_total = sdu_lengths[0];
|
||||
sdu_lcids[0] = DCCH;
|
||||
|
||||
LOG_D(MAC,"[UE %d] TX Got %d bytes for DCCH\n",Mod_id,sdu_lengths[0]);
|
||||
num_sdus = 1;
|
||||
update_bsr(Mod_id, frame, DCCH,UE_mac_inst[Mod_id].scheduling_info.LCGID[DCCH]);
|
||||
//header_len +=2;
|
||||
UE_mac_inst[Mod_id].RA_active = 1;
|
||||
UE_mac_inst[Mod_id].RA_PREAMBLE_TRANSMISSION_COUNTER = 1;
|
||||
UE_mac_inst[Mod_id].RA_Msg3_size = Size+dcch_header_len;
|
||||
UE_mac_inst[Mod_id].RA_prachMaskIndex = 0;
|
||||
UE_mac_inst[Mod_id].RA_prach_resources.Msg3 = ulsch_buff;
|
||||
UE_mac_inst[Mod_id].RA_backoff_cnt = 0; // add the backoff condition here if we have it from a previous RA reponse which failed (i.e. backoff indicator)
|
||||
if (rach_ConfigCommon) {
|
||||
UE_mac_inst[Mod_id].RA_window_cnt = 2+ rach_ConfigCommon->ra_SupervisionInfo.ra_ResponseWindowSize;
|
||||
if (UE_mac_inst[Mod_id].RA_window_cnt == 9)
|
||||
UE_mac_inst[Mod_id].RA_window_cnt = 10; // Note: 9 subframe window doesn't exist, after 8 is 10!
|
||||
}
|
||||
else {
|
||||
LOG_D(MAC,"[UE %d] FATAL Frame %d: rach_ConfigCommon is NULL !!!\n",Mod_id,frame);
|
||||
mac_xface->macphy_exit("");
|
||||
}
|
||||
UE_mac_inst[Mod_id].RA_tx_frame = frame;
|
||||
UE_mac_inst[Mod_id].RA_tx_subframe = subframe;
|
||||
UE_mac_inst[Mod_id].RA_backoff_frame = frame;
|
||||
UE_mac_inst[Mod_id].RA_backoff_subframe = subframe;
|
||||
// Fill in preamble and PRACH resource
|
||||
get_prach_resources(Mod_id,eNB_index,subframe,1,NULL);
|
||||
generate_ulsch_header((u8*)ulsch_buff, // mac header
|
||||
1, // num sdus
|
||||
0, // short pading
|
||||
&Size16, // sdu length
|
||||
&lcid, // sdu lcid
|
||||
NULL, // power headroom
|
||||
&UE_mac_inst[Mod_id].crnti, // crnti
|
||||
NULL, // truncated bsr
|
||||
NULL, // short bsr
|
||||
NULL, // long_bsr
|
||||
0); //post_padding
|
||||
|
||||
return(&UE_mac_inst[Mod_id].RA_prach_resources);
|
||||
}
|
||||
|
||||
@@ -1366,7 +1366,7 @@ UE_L2_STATE_t ue_scheduler(u8 Mod_id,u32 frame, u8 subframe, lte_subframe_t dire
|
||||
LOG_E(MAC,"RRC Loss of synch, returning PHY_RESYNCH\n");
|
||||
return(PHY_RESYNCH);
|
||||
case RRC_Handover_failed:
|
||||
LOG_D(MAC,"Handover failure for UE %d eNB_index %d\n",Mod_id,eNB_index);
|
||||
LOG_N(MAC,"Handover failure for UE %d eNB_index %d\n",Mod_id,eNB_index);
|
||||
//Invalid...need to add another MAC UE state for re-connection procedure
|
||||
mac_xface->phy_config_afterHO_ue(Mod_id,eNB_index,(MobilityControlInfo_t *)NULL,1);
|
||||
//return(3);
|
||||
@@ -1388,7 +1388,7 @@ UE_L2_STATE_t ue_scheduler(u8 Mod_id,u32 frame, u8 subframe, lte_subframe_t dire
|
||||
LOG_E(MAC,"FATAL: radioResourceConfigCommon is NULL!!!\n");
|
||||
mac_xface->macphy_exit("");
|
||||
vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SCHEDULER, VCD_FUNCTION_OUT);
|
||||
return(RRC_OK); // RRC_OK ???
|
||||
return(RRC_OK);
|
||||
}
|
||||
|
||||
LOG_I(MAC,"Frame %d: Contention resolution timer %d/%d\n",frame,UE_mac_inst[Mod_id].RA_contention_resolution_cnt,
|
||||
|
||||
@@ -205,6 +205,9 @@ emul_rt:
|
||||
|
||||
clean:
|
||||
(cd NAS/DRIVER/MESH && $(MAKE) clean)
|
||||
(cd NAS/DRIVER/LITE && $(MAKE) clean)
|
||||
rm -rf NAS/DRIVER/MESH/RB_TOOL/rb_tool
|
||||
rm -rf NAS/DRIVER/LITE/RB_TOOL/rb_tool
|
||||
|
||||
cleanall:
|
||||
find -name *.o -delete -print
|
||||
|
||||
+1
-1
@@ -15,7 +15,7 @@ First, you must have all four openair SW directories, openair1, openair2, openai
|
||||
1. The following packages must be available on your system:
|
||||
|
||||
- libblas and libblas-dev
|
||||
- libxml2 and libxml2-dev
|
||||
- libxml2 and libxml2-dev and gccxml
|
||||
- libforms-bin libforms-dev
|
||||
- libatlas-base-dev and libatlas-headers (for Ubuntu 11.04, libatlas-dev instead of libatlas-headers)
|
||||
- asn1c and the LTE ASN1 files (for more information on how to install this and generate the required files see the README file in openair2/RRC/LITE/MESSAGES)
|
||||
|
||||
@@ -407,14 +407,15 @@ oaisimCROWN: $(OBJ) $(ASN1_MSG_OBJS1) oaisimCROWN.c
|
||||
@echo "Compiling oaisimCROWN.c ..."
|
||||
@$(CC) oaisimCROWN.c -I$(TOP_DIR) $(L2_incl) $(UTIL_incl) $(UTILS_incl) -I$(ASN1_MSG_INC) $(S1AP_Incl) -o oaisimCROWN $(CFLAGS) $(EXTRA_CFLAGS) $(OBJ) $(ASN1_MSG_OBJS1) -lm -lblas -lpthread -llapack_atlas -lforms -lxml2 -lX11 -lXpm -lrt
|
||||
|
||||
test_nasmesh_fix:
|
||||
(cd $(OPENAIR2_DIR)/NAS/DRIVER/MESH/RB_TOOL && $(MAKE))
|
||||
(cd $(OPENAIR2_DIR) && $(MAKE) nasmesh_netlink_address_fix.ko)
|
||||
(cp $(OPENAIR2_DIR)/NAS/DRIVER/MESH/nasmesh.ko . )
|
||||
nasmesh_fix:
|
||||
(cd $(OPENAIR2_DIR)/NAS/DRIVER/MESH/RB_TOOL && $(MAKE))
|
||||
(cd $(OPENAIR2_DIR) && $(MAKE) nasmesh_netlink_address_fix.ko)
|
||||
(cp $(OPENAIR2_DIR)/NAS/DRIVER/MESH/nasmesh.ko . )
|
||||
nasmesh_fix_install:
|
||||
(cd $(OPENAIR2_DIR)/NAS/DRIVER/MESH/RB_TOOL && $(MAKE))
|
||||
(cd $(OPENAIR2_DIR) && $(MAKE) nasmesh_netlink_address_fix.ko)
|
||||
(sudo insmod $(OPENAIR2_DIR)/NAS/DRIVER/MESH/nasmesh.ko)
|
||||
(cp $(OPENAIR2_DIR)/NAS/DRIVER/MESH/nasmesh.ko . )
|
||||
nasmesh_nl:
|
||||
(cd $(OPENAIR2_DIR)/NAS/DRIVER/MESH/RB_TOOL && $(MAKE))
|
||||
(cd $(OPENAIR2_DIR) && $(MAKE) nasmesh_netlink.ko)
|
||||
@@ -425,7 +426,8 @@ rb_tool:
|
||||
nasmesh_install:
|
||||
(sudo rmmod nasmesh)
|
||||
(sudo insmod $(OPENAIR2_DIR)/NAS/DRIVER/MESH/nasmesh.ko)
|
||||
|
||||
nasmesh_clean:
|
||||
(cd $(OPENAIR2_DIR) && $(MAKE) clean)
|
||||
nas_sim_mt_cellular:
|
||||
( cd $(OPENAIR2_DIR)/NAS/SIMU_CELLULAR && make nasmt_sim CELLULAR=1 NO_RRM=1)
|
||||
|
||||
|
||||
@@ -416,7 +416,7 @@ void check_and_adjust_params() {
|
||||
LOG_I(EMU,"[INIT] Starting NAS netlink interface\n");
|
||||
ret = netlink_init();
|
||||
if (ret < 0)
|
||||
LOG_E(EMU,"[INIT] Netlink not available, careful ...\n");
|
||||
LOG_W(EMU,"[INIT] Netlink not available, careful ...\n");
|
||||
|
||||
if (ethernet_flag == 1) {
|
||||
oai_emulation.info.master[oai_emulation.info.master_id].nb_ue = oai_emulation.info.nb_ue_local + oai_emulation.info.nb_rn_local;
|
||||
|
||||
+17
-14
@@ -38,14 +38,14 @@ import log
|
||||
import openair
|
||||
import core
|
||||
|
||||
makerr1 = 'make: ***'
|
||||
makerr1 = '***'
|
||||
makerr2 = 'Error 1'
|
||||
|
||||
def execute(oai, user, pw, logfile):
|
||||
|
||||
case = '01'
|
||||
oai.send('cd $OPENAIR_TARGETS;')
|
||||
|
||||
|
||||
try:
|
||||
test = '00'
|
||||
name = 'Check oai.svn.add'
|
||||
@@ -64,7 +64,7 @@ def execute(oai, user, pw, logfile):
|
||||
log.ok(case, test, name, conf, '', logfile)
|
||||
|
||||
oai.send('cd SIMU/USER;')
|
||||
|
||||
|
||||
try:
|
||||
test = '01'
|
||||
name = 'Compile oai.rel8.make'
|
||||
@@ -88,15 +88,10 @@ def execute(oai, user, pw, logfile):
|
||||
oai.send('make cleanall;')
|
||||
oai.send('rm -f ./oaisim.rel8.nas;')
|
||||
oai.send('rm -f ./nasmesh;')
|
||||
oai.send('make nasmesh_clean;')
|
||||
oai.send_expect_false('make nasmesh_fix;', makerr1, 60)
|
||||
oai.send_expect_false('make NAS=1 -j4;', makerr1, 1500)
|
||||
oai.send('cp ./oaisim ./oaisim.rel8.nas;')
|
||||
if user == 'root' :
|
||||
oai.send_nowait('rmmod nasmesh;')
|
||||
oai.send_expect_false('make nasmesh_fix;', makerr1, 60)
|
||||
else :
|
||||
oai.send_nowait('echo '+pw+ ' | sudo -S rmmod nasmesh;')
|
||||
oai.send_expect_false('make test_nasmesh_fix;', makerr1, 60)
|
||||
oai.send_nowait('echo '+pw+ ' | sudo -S insmod ./nasmesh.ko;')
|
||||
|
||||
except log.err, e:
|
||||
log.fail(case, test, name, conf, e.value, diag, logfile)
|
||||
@@ -183,8 +178,10 @@ def execute(oai, user, pw, logfile):
|
||||
#oai.send('cp ./oaisim ./oaisim.rel8.cellular.rg;')
|
||||
#except log.err, e:
|
||||
#log.fail(case, test, name, conf, e.value, diag, logfile)
|
||||
#log.skip(case, test, name, conf, '', '', logfile)
|
||||
#else:
|
||||
#log.ok(case, test, name, conf, '', logfile)
|
||||
#log.skip(case, test, name, conf, '', '', logfile)
|
||||
|
||||
#try:
|
||||
#test = '08'
|
||||
@@ -199,12 +196,14 @@ def execute(oai, user, pw, logfile):
|
||||
#oai.send('cp ./oaisim ./oaisim.rel8.cellular.mt;')
|
||||
#except log.err, e:
|
||||
#log.fail(case, test, name, conf, e.value, diag, logfile)
|
||||
#log.skip(case, test, name, conf, '', '', logfile)
|
||||
#else:
|
||||
#log.ok(case, test, name, conf, '', logfile)
|
||||
#log.skip(case, test, name, conf, '', '', logfile)
|
||||
|
||||
#try:
|
||||
#test = '09'
|
||||
#name = 'Compile nas_sim_rg_cellular'
|
||||
#name = 'Compile oai.rel8.cellular.nas.eNB'
|
||||
#conf = 'make nas_sim_rg_cellular'
|
||||
#diag = 'check the compilation errors for NAS SIM RRC Cellular (node RG)'
|
||||
#oai.send('make clean;')
|
||||
@@ -215,12 +214,14 @@ def execute(oai, user, pw, logfile):
|
||||
#oai.send_expect_false('make nas_sim_rg_cellular -j4;', makerr1, 1500)
|
||||
#except log.err, e:
|
||||
#log.fail(case, test, name, conf, e.value, diag, logfile)
|
||||
#log.skip(case, test, name, conf, '', '', logfile)
|
||||
#else:
|
||||
#log.ok(case, test, name, conf, '', logfile)
|
||||
|
||||
#log.skip(case, test, name, conf, '', '', logfile)
|
||||
|
||||
#try:
|
||||
#test = '10'
|
||||
#name = 'Compile nas_sim_mt_cellular'
|
||||
#name = 'Compile oai.rel8.cellular.nas.UE'
|
||||
#conf = 'make nas_sim_mt_cellular'
|
||||
#diag = 'check the compilation errors for NAS SIM RRC Cellular (node MT)'
|
||||
#oai.send('make clean;')
|
||||
@@ -231,9 +232,11 @@ def execute(oai, user, pw, logfile):
|
||||
#oai.send_expect_false('make nas_sim_mt_cellular -j4;', makerr1, 1500)
|
||||
#except log.err, e:
|
||||
#log.fail(case, test, name, conf, e.value, diag, logfile)
|
||||
#log.skip(case, test, name, conf, '', '', logfile)
|
||||
#else:
|
||||
#log.ok(case, test, name, conf, '', logfile)
|
||||
|
||||
#log.skip(case, test, name, conf, '', '', logfile)
|
||||
|
||||
try:
|
||||
test = '11'
|
||||
name = 'Compile oai.rel8.itti.make'
|
||||
|
||||
@@ -93,6 +93,7 @@ def execute(oai, user, pw, logfile):
|
||||
test = '03'
|
||||
name = 'Run oai.rel8.abs.ping'
|
||||
diag = 'Data-plane is not working normally, check the OAI protocol stack, OAI driver, and normal operation of the OS'
|
||||
oai.driver(oai,user,pw)
|
||||
for i in range(NUM_UE) :
|
||||
for j in range(NUM_eNB) :
|
||||
conf = '-a -A AWGN -u' + str(i+1) +' -b'+ str(j+1)
|
||||
@@ -111,6 +112,8 @@ def execute(oai, user, pw, logfile):
|
||||
oai.send_nowait('echo '+pw+ ' | sudo -S pkill oaisim.rel8.nas;')
|
||||
time.sleep(1)
|
||||
oai.send_nowait('echo '+pw+ ' | sudo -S pkill oaisim.rel8.nas;')
|
||||
|
||||
oai.rm_driver(oai,user,pw)
|
||||
|
||||
except log.err, e:
|
||||
log.fail(case, test, name, conf, e.value, diag, logfile)
|
||||
|
||||
@@ -121,4 +121,27 @@ class openair(core):
|
||||
except Error, val:
|
||||
print "Error:", val
|
||||
|
||||
|
||||
def rm_driver(self,oai,user, pw):
|
||||
try:
|
||||
if user == 'root' :
|
||||
#oai.send_nowait('rmmod nasmesh;')
|
||||
os.system('rmmod nasmesh;')
|
||||
else :
|
||||
#oai.send_nowait('echo '+pw+ ' | sudo -S rmmod nasmesh;')
|
||||
os.system('echo '+pw+ ' | sudo -S rmmod nasmesh;')
|
||||
except Error, val:
|
||||
print "Error removing oai network driver module:", val
|
||||
|
||||
def driver(self,oai,user,pw):
|
||||
pwd = oai.send_recv('pwd')
|
||||
oai.send('cd $OPENAIR_TARGETS;')
|
||||
oai.send('cd SIMU/USER;')
|
||||
try:
|
||||
if user == 'root' :
|
||||
oai.send_nowait('insmod ./nasmesh.ko;')
|
||||
else :
|
||||
oai.send_nowait('echo '+pw+ ' | sudo -S insmod ./nasmesh.ko;')
|
||||
|
||||
oai.send_nowait('cd '+ pwd)
|
||||
except Error, val:
|
||||
print "Error inserting oai network driver module:", val
|
||||
|
||||
@@ -103,12 +103,15 @@ log.writefile(logfile,'====================start'+test+' at ' + ctime + '=======
|
||||
log.set_debug_level(debug)
|
||||
|
||||
oai.kill(user, pw)
|
||||
oai.rm_driver(oai,user,pw)
|
||||
|
||||
# start te test cases
|
||||
case01.execute(oai, user, pw, logfile)
|
||||
case02.execute(oai, user, pw, logfile)
|
||||
case03.execute(oai, user, pw, logfile)
|
||||
|
||||
oai.kill(user, pw)
|
||||
oai.rm_driver(oai,user,pw)
|
||||
|
||||
# perform the stats
|
||||
log.statistics(logfile)
|
||||
|
||||
Reference in New Issue
Block a user