Added an RRC UE task and inserted some message based communications between MAC or PDCP and RRC when ITTI is enabled.

Uniformized some parameter types.
Fixed some warnings.

git-svn-id: http://svn.eurecom.fr/openair4G/trunk@4286 818b1a75-f10b-46b9-bf7c-635c3b92a50f
This commit is contained in:
winckel
2013-10-25 16:20:37 +00:00
parent 06665e9de6
commit 1378c4fbfb
12 changed files with 508 additions and 244 deletions
+2 -2
View File
@@ -331,8 +331,8 @@ typedef struct{ //RRC_INTERFACE_FUNCTIONS
char (*openair_rrc_eNB_init)(u8 ); char (*openair_rrc_eNB_init)(u8 );
char (*openair_rrc_UE_init)(u8, u8); char (*openair_rrc_UE_init)(u8, u8);
RRC_status_t (*rrc_rx_tx)(u8,u32,u8,u8); RRC_status_t (*rrc_rx_tx)(u8,u32,u8,u8);
u8 (*mac_rrc_data_ind)(u8,u32,unsigned short,char *,unsigned short,u8 eNB_flag, u8 eNB_index); u8 (*mac_rrc_data_ind)(u8,u32,u16,u8 *,u16,u8 eNB_flag, u8 eNB_index);
u8 (*mac_rrc_data_req)(u8,u32,unsigned short,u8,char *,u8 eNB_flag, u8 eNB_index); u8 (*mac_rrc_data_req)(u8,u32,u16,u8,u8 *,u8 eNB_flag, u8 eNB_index);
void (*mac_rrc_meas_ind)(u8,MAC_MEAS_REQ_ENTRY*); void (*mac_rrc_meas_ind)(u8,MAC_MEAS_REQ_ENTRY*);
void (*def_meas_ind)(u8, u8); void (*def_meas_ind)(u8, u8);
void (*rrc_data_indP) (module_id_t , rb_id_t , sdu_size_t , char*); void (*rrc_data_indP) (module_id_t , rb_id_t , sdu_size_t , char*);
+6 -4
View File
@@ -265,7 +265,7 @@ void terminate_ra_proc(u8 Mod_id,u32 frame,u16 rnti,unsigned char *msg3, u16 msg
} }
if (Is_rrc_registered == 1) if (Is_rrc_registered == 1)
mac_rrc_data_ind(Mod_id,frame,CCCH,(char *)payload_ptr,rx_lengths[0],1,Mod_id,0); mac_rrc_data_ind(Mod_id,frame,CCCH,(u8 *)payload_ptr,rx_lengths[0],1,Mod_id,0);
// add_user. This is needed to have the rnti for configuring UE (PHY). The UE is removed if RRC // add_user. This is needed to have the rnti for configuring UE (PHY). The UE is removed if RRC
// doesn't provide a CCCH SDU // doesn't provide a CCCH SDU
@@ -979,7 +979,7 @@ void schedule_SI(unsigned char Mod_id,u32 frame, unsigned char *nprb,unsigned in
bcch_sdu_length = mac_rrc_data_req(Mod_id, bcch_sdu_length = mac_rrc_data_req(Mod_id,
frame, frame,
BCCH,1, BCCH,1,
(char*)&eNB_mac_inst[Mod_id].BCCH_pdu.payload[0], &eNB_mac_inst[Mod_id].BCCH_pdu.payload[0],
1, 1,
Mod_id, Mod_id,
0); // not used in this case 0); // not used in this case
@@ -1595,7 +1595,7 @@ void schedule_RA(unsigned char Mod_id,u32 frame, unsigned char subframe,unsigned
rrc_sdu_length = mac_rrc_data_req(Mod_id, rrc_sdu_length = mac_rrc_data_req(Mod_id,
frame, frame,
CCCH,1, CCCH,1,
(char*)&eNB_mac_inst[Mod_id].CCCH_pdu.payload[0], &eNB_mac_inst[Mod_id].CCCH_pdu.payload[0],
1, 1,
Mod_id, Mod_id,
0); // not used in this case 0); // not used in this case
@@ -3376,7 +3376,7 @@ void schedule_ue_spec(unsigned char Mod_id,
u16 sdu_length_total=0; u16 sdu_length_total=0;
// unsigned char loop_count; // unsigned char loop_count;
unsigned char DAI; unsigned char DAI;
u16 i=0,ii=0,tpmi0=1; u16 i=0;
u8 dl_pow_off[NUMBER_OF_UE_MAX]; u8 dl_pow_off[NUMBER_OF_UE_MAX];
unsigned char rballoc_sub_UE[NUMBER_OF_UE_MAX][N_RBGS_MAX]; unsigned char rballoc_sub_UE[NUMBER_OF_UE_MAX][N_RBGS_MAX];
// unsigned char rballoc_sub[N_RBGS_MAX]; // unsigned char rballoc_sub[N_RBGS_MAX];
@@ -4191,7 +4191,9 @@ void eNB_dlsch_ulsch_scheduler(u8 Mod_id,u8 cooperation_flag, u32 frame, u8 subf
unsigned int nCCE=0; unsigned int nCCE=0;
int mbsfn_status=0; int mbsfn_status=0;
u32 RBalloc=0; u32 RBalloc=0;
#ifdef EXMIMO
int ret; int ret;
#endif
DCI_PDU *DCI_pdu= &eNB_mac_inst[Mod_id].DCI_pdu; DCI_PDU *DCI_pdu= &eNB_mac_inst[Mod_id].DCI_pdu;
// LOG_D(MAC,"[eNB %d] Frame %d, Subframe %d, entering MAC scheduler\n",Mod_id, frame, subframe); // LOG_D(MAC,"[eNB %d] Frame %d, Subframe %d, entering MAC scheduler\n",Mod_id, frame, subframe);
+1 -1
View File
@@ -240,7 +240,7 @@ PRACH_RESOURCES_t *ue_get_rach(u8 Mod_id,u32 frame, u8 eNB_index,u8 subframe){
Size = mac_rrc_data_req(Mod_id, Size = mac_rrc_data_req(Mod_id,
frame, frame,
CCCH,1, CCCH,1,
(char*)&UE_mac_inst[Mod_id].CCCH_pdu.payload[sizeof(SCH_SUBHEADER_SHORT)+1],0, &UE_mac_inst[Mod_id].CCCH_pdu.payload[sizeof(SCH_SUBHEADER_SHORT)+1],0,
eNB_index); eNB_index);
Size16 = (u16)Size; Size16 = (u16)Size;
+3 -3
View File
@@ -348,13 +348,13 @@ void ue_send_sdu(u8 Mod_id,u32 frame,u8 *sdu,u16 sdu_len,u8 eNB_index) {
#if defined(ENABLE_MAC_PAYLOAD_DEBUG) #if defined(ENABLE_MAC_PAYLOAD_DEBUG)
int j; int j;
for (j=0;j<rx_lengths[i];j++) for (j=0;j<rx_lengths[i];j++)
LOG_T(MAC,"%x.",(unsigned char)payload_ptr[j]); LOG_T(MAC,"%x.",(u8)payload_ptr[j]);
LOG_T(MAC,"\n"); LOG_T(MAC,"\n");
#endif #endif
mac_rrc_data_ind(Mod_id, mac_rrc_data_ind(Mod_id,
frame, frame,
CCCH, CCCH,
(char *)payload_ptr,rx_lengths[i],0,eNB_index,0); (u8 *)payload_ptr,rx_lengths[i],0,eNB_index,0);
} }
else if (rx_lcids[i] == DCCH) { else if (rx_lcids[i] == DCCH) {
@@ -415,7 +415,7 @@ void ue_decode_si(u8 Mod_id,u32 frame, u8 eNB_index, void *pdu,u16 len) {
mac_rrc_data_ind(Mod_id, mac_rrc_data_ind(Mod_id,
frame, frame,
BCCH, BCCH,
(char *)pdu, (u8 *)pdu,
len, len,
0, 0,
eNB_index, eNB_index,
@@ -87,7 +87,7 @@
#include "openair_rrc_L2_interface.h" #include "openair_rrc_L2_interface.h"
/********************************************************************************************************************/ /********************************************************************************************************************/
s8 mac_rrc_data_req(u8 Mod_id, u32 frame, u16 Srb_id, u8 Nb_tb,char *Buffer,u8 eNB_flag,u8 eNB_index, u8 mbsfn_sync_area){ s8 mac_rrc_data_req(u8 Mod_id, u32 frame, u16 Srb_id, u8 Nb_tb,u8 *Buffer,u8 eNB_flag,u8 eNB_index, u8 mbsfn_sync_area){
/********************************************************************************************************************/ /********************************************************************************************************************/
#ifdef CELLULAR #ifdef CELLULAR
return(rrc_L2_data_req_rx(Mod_id,Srb_id,Nb_tb,Buffer,eNB_index)); return(rrc_L2_data_req_rx(Mod_id,Srb_id,Nb_tb,Buffer,eNB_index));
@@ -96,7 +96,7 @@ s8 mac_rrc_data_req(u8 Mod_id, u32 frame, u16 Srb_id, u8 Nb_tb,char *Buffer,u8 e
#endif //CELLULAR #endif //CELLULAR
} }
s8 mac_rrc_data_ind(u8 Mod_id, u32 frame, u16 Srb_id, char *Sdu,u16 Sdu_len,u8 eNB_flag, u8 eNB_index,u8 mbsfn_sync_area){ s8 mac_rrc_data_ind(u8 Mod_id, u32 frame, u16 Srb_id, u8 *Sdu,u16 Sdu_len,u8 eNB_flag, u8 eNB_index,u8 mbsfn_sync_area){
#ifdef CELLULAR #ifdef CELLULAR
return(rrc_L2_mac_data_ind_rx(Mod_id, Srb_id, Sdu, Sdu_len, eNB_index)); return(rrc_L2_mac_data_ind_rx(Mod_id, Srb_id, Sdu, Sdu_len, eNB_index));
#else #else
@@ -40,8 +40,8 @@
#include "COMMON/mac_rrc_primitives.h" #include "COMMON/mac_rrc_primitives.h"
s8 mac_rrc_data_req( u8 Mod_id, u32 frame, u16 Srb_id, u8 Nb_tb,char *Buffer,u8 eNB_flag,u8 eNB_index, u8 mbsfn_sync_area); s8 mac_rrc_data_req( u8 Mod_id, u32 frame, u16 Srb_id, u8 Nb_tb,u8 *Buffer,u8 eNB_flag,u8 eNB_index, u8 mbsfn_sync_area);
s8 mac_rrc_data_ind( u8 Mod_id, u32 frame, u16 Srb_id, char *Sdu, u16 Sdu_len,u8 eNB_flag, u8 eNB_index,u8 mbsfn_sync_area); s8 mac_rrc_data_ind( u8 Mod_id, u32 frame, u16 Srb_id, u8 *Sdu, u16 Sdu_len,u8 eNB_flag, u8 eNB_index,u8 mbsfn_sync_area);
void mac_lite_sync_ind( u8 Mod_id, u8 status); void mac_lite_sync_ind( u8 Mod_id, u8 status);
void mac_rrc_meas_ind(u8,MAC_MEAS_REQ_ENTRY*); void mac_rrc_meas_ind(u8,MAC_MEAS_REQ_ENTRY*);
void rlcrrc_data_ind( u8 Mod_id, u32 frame, u8 eNB_flag,unsigned int Rb_id, u32 sdu_size,u8 *Buffer); void rlcrrc_data_ind( u8 Mod_id, u32 frame, u8 eNB_flag,unsigned int Rb_id, u32 sdu_size,u8 *Buffer);
+136 -14
View File
@@ -52,6 +52,10 @@ extern eNB_MAC_INST *eNB_mac_inst;
extern UE_MAC_INST *UE_mac_inst; extern UE_MAC_INST *UE_mac_inst;
#endif #endif
#if defined(ENABLE_ITTI)
# include "intertask_interface.h"
#endif
//#define RRC_DATA_REQ_DEBUG //#define RRC_DATA_REQ_DEBUG
#define DEBUG_RRC #define DEBUG_RRC
@@ -178,23 +182,44 @@ s8 mac_rrc_lite_data_req( u8 Mod_id,
return(0); return(0);
} }
s8 mac_rrc_lite_data_ind(u8 Mod_id, u32 frame, u16 Srb_id, char *Sdu, u16 Sdu_len,u8 eNB_flag,u8 eNB_index,u8 mbsfn_sync_area){ s8 mac_rrc_lite_data_ind(u8 Mod_id, u32 frame, u16 Srb_id, u8 *Sdu, u16 sdu_size,u8 eNB_flag,u8 eNB_index,u8 mbsfn_sync_area){
SRB_INFO *Srb_info; SRB_INFO *Srb_info;
/*
int si_window; int si_window;
*/
if(eNB_flag == 0){ if(eNB_flag == 0){
if(Srb_id == BCCH){ if(Srb_id == BCCH){
LOG_T(RRC,"[UE %d] Received SDU for BCCH on SRB %d from eNB %d\n",Mod_id,Srb_id,eNB_index); LOG_T(RRC,"[UE %d] Received SDU for BCCH on SRB %d from eNB %d\n",Mod_id,Srb_id,eNB_index);
decode_BCCH_DLSCH_Message(Mod_id,frame,eNB_index,Sdu,Sdu_len);
#if defined(ENABLE_ITTI)
{
MessageDef *message_p;
// Uses a new buffer to avoid issue with MAC buffer content that could be changed by MAC (asynchronous message handling).
u8 *message_buffer;
message_buffer = malloc (sdu_size);
memcpy (message_buffer, Sdu, sdu_size);
message_p = itti_alloc_new_message (TASK_MAC, RRC_MAC_BCCH_DATA_IND);
RRC_MAC_BCCH_DATA_IND (message_p).frame = frame;
RRC_MAC_BCCH_DATA_IND (message_p).sdu_size = sdu_size;
RRC_MAC_BCCH_DATA_IND (message_p).sdu_p = message_buffer;
RRC_MAC_BCCH_DATA_IND (message_p).enb_index = eNB_index;
itti_send_msg_to_task (TASK_RRC_UE, Mod_id, message_p);
}
#else
decode_BCCH_DLSCH_Message(Mod_id,frame,eNB_index,Sdu,sdu_size);
/* /*
if ((frame %2) == 0) { if ((frame %2) == 0) {
if (UE_rrc_inst[Mod_id].Info[eNB_index].SIB1Status == 0) { if (UE_rrc_inst[Mod_id].Info[eNB_index].SIB1Status == 0) {
LOG_D(RRC,"[UE %d] Frame %d : Received SIB1 from eNB %d (%d bytes)\n",Mod_id,frame,eNB_index,Sdu_len); LOG_D(RRC,"[UE %d] Frame %d : Received SIB1 from eNB %d (%d bytes)\n",Mod_id,frame,eNB_index,sdu_size);
if (UE_rrc_inst[Mod_id].SIB1[eNB_index]) if (UE_rrc_inst[Mod_id].SIB1[eNB_index])
memcpy(UE_rrc_inst[Mod_id].SIB1[eNB_index],&Sdu[0],Sdu_len); memcpy(UE_rrc_inst[Mod_id].SIB1[eNB_index],&Sdu[0],sdu_size);
else { else {
LOG_E(RRC,"[FATAL ERROR] SIB1 buffer for eNB %d not allocated, exiting ...\n",eNB_index); LOG_E(RRC,"[FATAL ERROR] SIB1 buffer for eNB %d not allocated, exiting ...\n",eNB_index);
mac_xface->macphy_exit(""); mac_xface->macphy_exit("");
@@ -208,8 +233,8 @@ s8 mac_rrc_lite_data_ind(u8 Mod_id, u32 frame, u16 Srb_id, char *Sdu, u16 Sdu_le
if ((UE_rrc_inst[Mod_id].Info[eNB_index].SIB1Status == 1) && if ((UE_rrc_inst[Mod_id].Info[eNB_index].SIB1Status == 1) &&
(UE_rrc_inst[Mod_id].Info[eNB_index].SIStatus == 0)) { (UE_rrc_inst[Mod_id].Info[eNB_index].SIStatus == 0)) {
si_window = (frame%UE_rrc_inst[Mod_id].Info[eNB_index].SIperiod)/frame%UE_rrc_inst[Mod_id].Info[eNB_index].SIwindowsize; si_window = (frame%UE_rrc_inst[Mod_id].Info[eNB_index].SIperiod)/frame%UE_rrc_inst[Mod_id].Info[eNB_index].SIwindowsize;
LOG_D(RRC,"[UE %d] Frame %d : Received SI (%d bytes), in window %d (SIperiod %d, SIwindowsize %d)\n",Mod_id,frame,Sdu_len,si_window,UE_rrc_inst[Mod_id].Info[eNB_index].SIperiod,UE_rrc_inst[Mod_id].Info[eNB_index].SIwindowsize); LOG_D(RRC,"[UE %d] Frame %d : Received SI (%d bytes), in window %d (SIperiod %d, SIwindowsize %d)\n",Mod_id,frame,sdu_size,si_window,UE_rrc_inst[Mod_id].Info[eNB_index].SIperiod,UE_rrc_inst[Mod_id].Info[eNB_index].SIwindowsize);
memcpy(UE_rrc_inst[Mod_id].SI[eNB_index],&Sdu[0],Sdu_len); memcpy(UE_rrc_inst[Mod_id].SI[eNB_index],&Sdu[0],sdu_size);
if (decode_SI(Mod_id,frame,eNB_index,si_window)==0) { if (decode_SI(Mod_id,frame,eNB_index,si_window)==0) {
LOG_D(RRC,"[UE %d] Frame %d :Decoded SI successfully\n",Mod_id,frame); LOG_D(RRC,"[UE %d] Frame %d :Decoded SI successfully\n",Mod_id,frame);
UE_rrc_inst[Mod_id].Info[eNB_index].SIStatus = 1; UE_rrc_inst[Mod_id].Info[eNB_index].SIStatus = 1;
@@ -229,17 +254,37 @@ s8 mac_rrc_lite_data_ind(u8 Mod_id, u32 frame, u16 Srb_id, char *Sdu, u16 Sdu_le
} }
} }
*/ */
#endif
} }
if((Srb_id & RAB_OFFSET) == CCCH){ if((Srb_id & RAB_OFFSET) == CCCH){
if (sdu_size>0) {
LOG_T(RRC,"[UE %d] Received SDU for CCCH on SRB %d from eNB %d\n",Mod_id,Srb_id & RAB_OFFSET,eNB_index);
#if defined(ENABLE_ITTI)
{
MessageDef *message_p;
// Uses a new buffer to avoid issue with MAC buffer content that could be changed by MAC (asynchronous message handling).
u8 *message_buffer;
message_buffer = malloc (sdu_size);
memcpy (message_buffer, Sdu, sdu_size);
message_p = itti_alloc_new_message (TASK_MAC, RRC_MAC_CCCH_DATA_IND);
RRC_MAC_CCCH_DATA_IND (message_p).frame = frame;
RRC_MAC_CCCH_DATA_IND (message_p).sdu_size = sdu_size;
RRC_MAC_CCCH_DATA_IND (message_p).sdu_p = message_buffer;
RRC_MAC_CCCH_DATA_IND (message_p).enb_index = eNB_index;
itti_send_msg_to_task (TASK_RRC_UE, Mod_id, message_p);
}
#else
Srb_info = &UE_rrc_inst[Mod_id].Srb0[eNB_index]; Srb_info = &UE_rrc_inst[Mod_id].Srb0[eNB_index];
if (Sdu_len>0) { memcpy(Srb_info->Rx_buffer.Payload,Sdu,sdu_size);
LOG_T(RRC,"[UE %d] Received SDU for CCCH on SRB %d from eNB %d\n",Mod_id,Srb_id & RAB_OFFSET,eNB_index); Srb_info->Rx_buffer.payload_size = sdu_size;
memcpy(Srb_info->Rx_buffer.Payload,Sdu,Sdu_len);
Srb_info->Rx_buffer.payload_size = Sdu_len;
rrc_ue_decode_ccch(Mod_id, frame, Srb_info, eNB_index); rrc_ue_decode_ccch(Mod_id, frame, Srb_info, eNB_index);
#endif
} }
} }
@@ -247,7 +292,28 @@ s8 mac_rrc_lite_data_ind(u8 Mod_id, u32 frame, u16 Srb_id, char *Sdu, u16 Sdu_le
if ((Srb_id & RAB_OFFSET) == MCCH) { if ((Srb_id & RAB_OFFSET) == MCCH) {
LOG_T(RRC,"[UE %d] Frame %d: Received SDU on MBSFN sync area %d for MCCH on SRB %d from eNB %d\n", LOG_T(RRC,"[UE %d] Frame %d: Received SDU on MBSFN sync area %d for MCCH on SRB %d from eNB %d\n",
Mod_id,frame, mbsfn_sync_area, Srb_id & RAB_OFFSET,eNB_index); Mod_id,frame, mbsfn_sync_area, Srb_id & RAB_OFFSET,eNB_index);
decode_MCCH_Message(Mod_id, frame, eNB_index, Sdu, Sdu_len,mbsfn_sync_area);
#if defined(ENABLE_ITTI)
{
MessageDef *message_p;
// Uses a new buffer to avoid issue with MAC buffer content that could be changed by MAC (asynchronous message handling).
u8 *message_buffer;
message_buffer = malloc (sdu_size);
memcpy (message_buffer, Sdu, sdu_size);
message_p = itti_alloc_new_message (TASK_MAC, RRC_MAC_MCCH_DATA_IND);
RRC_MAC_MCCH_DATA_IND (message_p).frame = frame;
RRC_MAC_MCCH_DATA_IND (message_p).sdu_size = sdu_size;
RRC_MAC_MCCH_DATA_IND (message_p).sdu_p = message_buffer;
RRC_MAC_MCCH_DATA_IND (message_p).enb_index = eNB_index;
RRC_MAC_MCCH_DATA_IND (message_p).mbsfn_sync_area = mbsfn_sync_area;
itti_send_msg_to_task (TASK_RRC_UE, Mod_id, message_p);
}
#else
decode_MCCH_Message(Mod_id, frame, eNB_index, Sdu, sdu_size, mbsfn_sync_area);
#endif
} }
#endif // Rel10 #endif // Rel10
@@ -269,6 +335,16 @@ s8 mac_rrc_lite_data_ind(u8 Mod_id, u32 frame, u16 Srb_id, char *Sdu, u16 Sdu_le
//-------------------------------------------------------------------------------------------// //-------------------------------------------------------------------------------------------//
void mac_lite_sync_ind(u8 Mod_id,u8 Status){ void mac_lite_sync_ind(u8 Mod_id,u8 Status){
//-------------------------------------------------------------------------------------------// //-------------------------------------------------------------------------------------------//
#if defined(ENABLE_ITTI)
{
MessageDef *message_p;
message_p = itti_alloc_new_message (TASK_MAC, RRC_MAC_SYNC_IND);
RRC_MAC_SYNC_IND(message_p).status = Status;
itti_send_msg_to_task (TASK_RRC_UE, Mod_id, message_p);
}
#endif
} }
// this function is Not USED anymore // this function is Not USED anymore
@@ -281,18 +357,52 @@ void rrc_lite_data_ind( u8 Mod_id, u32 frame, u8 eNB_flag,u32 Srb_id, u32 sdu_si
(eNB_flag == 1)? "eNB": "UE", (eNB_flag == 1)? "eNB": "UE",
(eNB_flag == 1)? Mod_id : UE_index, (eNB_flag == 1)? Mod_id : UE_index,
frame, DCCH_index,Srb_id-1,sdu_size); frame, DCCH_index,Srb_id-1,sdu_size);
if (eNB_flag ==1)
if (eNB_flag ==1) {
rrc_eNB_decode_dcch(Mod_id,frame,DCCH_index,UE_index,Buffer,sdu_size); rrc_eNB_decode_dcch(Mod_id,frame,DCCH_index,UE_index,Buffer,sdu_size);
else }
else {
#if defined(ENABLE_ITTI)
{
MessageDef *message_p;
// Uses a new buffer to avoid issue with PDCP buffer content that could be changed by PDCP (asynchronous message handling).
u8 *message_buffer;
message_buffer = malloc (sdu_size);
memcpy (message_buffer, Buffer, sdu_size);
message_p = itti_alloc_new_message (TASK_PDCP, RRC_DCCH_DATA_IND);
RRC_DCCH_DATA_IND (message_p).frame = frame;
RRC_DCCH_DATA_IND (message_p).dcch_index = DCCH_index;
RRC_DCCH_DATA_IND (message_p).sdu_size = sdu_size;
RRC_DCCH_DATA_IND (message_p).sdu_p = message_buffer;
RRC_DCCH_DATA_IND (message_p).ue_index = UE_index;
itti_send_msg_to_task (TASK_RRC_UE, Mod_id - NB_eNB_INST, message_p);
}
#else
rrc_ue_decode_dcch(Mod_id-NB_eNB_INST,frame,DCCH_index,Buffer,UE_index); rrc_ue_decode_dcch(Mod_id-NB_eNB_INST,frame,DCCH_index,Buffer,UE_index);
#endif
}
} }
void rrc_lite_in_sync_ind(u8 Mod_id, u32 frame, u16 eNB_index) { void rrc_lite_in_sync_ind(u8 Mod_id, u32 frame, u16 eNB_index) {
#if defined(ENABLE_ITTI)
{
MessageDef *message_p;
message_p = itti_alloc_new_message (TASK_MAC, RRC_MAC_IN_SYNC_IND);
RRC_MAC_IN_SYNC_IND (message_p).frame = frame;
RRC_MAC_IN_SYNC_IND (message_p).enb_index = eNB_index;
itti_send_msg_to_task (TASK_RRC_UE, Mod_id, message_p);
}
#else
UE_rrc_inst[Mod_id].Info[eNB_index].N310_cnt=0; UE_rrc_inst[Mod_id].Info[eNB_index].N310_cnt=0;
if (UE_rrc_inst[Mod_id].Info[eNB_index].T310_active==1) if (UE_rrc_inst[Mod_id].Info[eNB_index].T310_active==1)
UE_rrc_inst[Mod_id].Info[eNB_index].N311_cnt++; UE_rrc_inst[Mod_id].Info[eNB_index].N311_cnt++;
#endif
} }
void rrc_lite_out_of_sync_ind(u8 Mod_id, u32 frame, u16 eNB_index){ void rrc_lite_out_of_sync_ind(u8 Mod_id, u32 frame, u16 eNB_index){
@@ -305,7 +415,19 @@ void rrc_lite_out_of_sync_ind(u8 Mod_id, u32 frame, u16 eNB_index){
UE_rrc_inst[Mod_id].Info[eNB_index].N310_cnt, UE_rrc_inst[Mod_id].Info[eNB_index].N310_cnt,
UE_rrc_inst[Mod_id].Info[eNB_index].N311_cnt); UE_rrc_inst[Mod_id].Info[eNB_index].N311_cnt);
#if defined(ENABLE_ITTI)
{
MessageDef *message_p;
message_p = itti_alloc_new_message (TASK_MAC, RRC_MAC_OUT_OF_SYNC_IND);
RRC_MAC_OUT_OF_SYNC_IND (message_p).frame = frame;
RRC_MAC_OUT_OF_SYNC_IND (message_p).enb_index = eNB_index;
itti_send_msg_to_task (TASK_RRC_UE, Mod_id, message_p);
}
#else
UE_rrc_inst[Mod_id].Info[eNB_index].N310_cnt++; UE_rrc_inst[Mod_id].Info[eNB_index].N310_cnt++;
#endif
} }
+29 -5
View File
@@ -51,6 +51,10 @@
#include "ReportConfigToAddModList.h" #include "ReportConfigToAddModList.h"
#include "MeasIdToAddModList.h" #include "MeasIdToAddModList.h"
#if defined(ENABLE_ITTI)
# include "intertask_interface.h"
#endif
//#include "PHY/defs.h" //#include "PHY/defs.h"
#ifndef USER_MODE #ifndef USER_MODE
#define msg printk #define msg printk
@@ -1627,7 +1631,7 @@ uint8_t do_MBSFNAreaConfig(LTE_DL_FRAME_PARMS *frame_parms,
} }
#endif #endif
uint8_t do_MeasurementReport(uint8_t *buffer,int measid,int phy_id,int rsrp_s,int rsrq_s,int rsrp_t,int rsrq_t) { uint8_t do_MeasurementReport(uint8_t *buffer,int measid,int phy_id,int rsrp_s,int rsrq_s,long rsrp_t,long rsrq_t) {
asn_enc_rval_t enc_rval; asn_enc_rval_t enc_rval;
@@ -1725,7 +1729,7 @@ uint8_t do_MeasurementReport(uint8_t *buffer,int measid,int phy_id,int rsrp_s,in
return((enc_rval.encoded+7)/8); return((enc_rval.encoded+7)/8);
} }
OAI_UECapability_t UECapability; static OAI_UECapability_t UECapability; /* TODO declared static to allow returning this has an address should be allocated in a cleaner way. */
SupportedBandEUTRA_t Bandlist[4]; SupportedBandEUTRA_t Bandlist[4];
BandInfoEUTRA_t BandInfo_meas[4]; BandInfoEUTRA_t BandInfo_meas[4];
InterFreqBandInfo_t InterFreqBandInfo[4][4]; InterFreqBandInfo_t InterFreqBandInfo[4][4];
@@ -1778,7 +1782,7 @@ OAI_UECapability_t *fill_ue_capability() {
UE_EUTRA_Capability = CALLOC(1,sizeof(*UE_EUTRA_Capability)); UE_EUTRA_Capability = CALLOC(1,sizeof(*UE_EUTRA_Capability));
memset(UE_EUTRA_Capability,0,sizeof(*UE_EUTRA_Capability)); memset(UE_EUTRA_Capability,0,sizeof(*UE_EUTRA_Capability));
// UE_EUTRA_Capability->accessStratumRelease = 0;//AccessStratumRelease_rel8; UE_EUTRA_Capability->accessStratumRelease = 0;//AccessStratumRelease_rel8;
UE_EUTRA_Capability->ue_Category = 4; UE_EUTRA_Capability->ue_Category = 4;
UE_EUTRA_Capability->pdcp_Parameters.supportedROHC_Profiles.profile0x0001=0; UE_EUTRA_Capability->pdcp_Parameters.supportedROHC_Profiles.profile0x0001=0;
UE_EUTRA_Capability->pdcp_Parameters.supportedROHC_Profiles.profile0x0002=0; UE_EUTRA_Capability->pdcp_Parameters.supportedROHC_Profiles.profile0x0002=0;
@@ -1837,11 +1841,31 @@ OAI_UECapability_t *fill_ue_capability() {
(void*)UE_EUTRA_Capability, (void*)UE_EUTRA_Capability,
&UECapability.sdu[0], &UECapability.sdu[0],
MAX_UE_CAPABILITY_SIZE); MAX_UE_CAPABILITY_SIZE);
#if defined(ENABLE_ITTI)
/* Test code */
{
MessageDef *message_p;
message_p = itti_alloc_new_message (TASK_RRC_UE, RRC_UE_EUTRA_CAPABILITY);
memcpy (&message_p->msg, UE_EUTRA_Capability, sizeof(RrcUeEutraCapability));
itti_send_msg_to_task (TASK_RRC_UE, INSTANCE_DEFAULT, message_p);
}
#endif
UECapability.sdu_size = (enc_rval.encoded + 7) / 8; UECapability.sdu_size = (enc_rval.encoded + 7) / 8;
LOG_I(PHY, "[RRC]UE Capability encoded, %d bytes (%d bits)\n", UECapability.sdu_size, enc_rval.encoded+7); LOG_I(PHY, "[RRC]UE Capability encoded, %d bytes (%d bits)\n", UECapability.sdu_size, enc_rval.encoded+7);
{
char *sdu;
sdu = malloc (3 * UECapability.sdu_size);
for (i = 0; i < UECapability.sdu_size; i++) for (i = 0; i < UECapability.sdu_size; i++)
printf("%02x.",UECapability.sdu[i]); sprintf (&sdu[3 * i], "%02x.", UECapability.sdu[i]);
printf("\n");
LOG_D(PHY, "[RRC]UE Capability encoded, %s\n", sdu);
}
return(&UECapability); return(&UECapability);
} }
+8 -1
View File
@@ -459,10 +459,15 @@ void rrc_eNB_process_RRCConnectionReconfigurationComplete(u8 Mod_id,u32 frame,u8
\param UE_index Index of UE transmitting the messages*/ \param UE_index Index of UE transmitting the messages*/
void rrc_eNB_generate_defaultRRCConnectionReconfiguration(u8 Mod_id, u32 frame, u16 UE_index, u8 *nas_pdu, u32 nas_length); void rrc_eNB_generate_defaultRRCConnectionReconfiguration(u8 Mod_id, u32 frame, u16 UE_index, u8 *nas_pdu, u32 nas_length);
#if defined(ENABLE_ITTI)
/**\brief RRC UE task.
\param void *args_p Pointer on arguments to start the task. */
void *rrc_ue_task(void *args_p);
#endif
//L2_interface.c //L2_interface.c
s8 mac_rrc_lite_data_req( u8 Mod_id, u32 frame, unsigned short Srb_id, u8 Nb_tb,char *Buffer,u8 eNB_flag, u8 eNB_index, u8 mbsfn_sync_area); s8 mac_rrc_lite_data_req( u8 Mod_id, u32 frame, unsigned short Srb_id, u8 Nb_tb,char *Buffer,u8 eNB_flag, u8 eNB_index, u8 mbsfn_sync_area);
s8 mac_rrc_lite_data_ind( u8 Mod_id, u32 frame, unsigned short Srb_id, char *Sdu, unsigned short Sdu_len,u8 eNB_flag,u8 eNB_index, u8 mbsfn_sync_area); s8 mac_rrc_lite_data_ind( u8 Mod_id, u32 frame, unsigned short Srb_id, u8 *Sdu, unsigned short Sdu_len,u8 eNB_flag,u8 eNB_index, u8 mbsfn_sync_area);
void mac_sync_ind( u8 Mod_id, u8 status); void mac_sync_ind( u8 Mod_id, u8 status);
void rrc_lite_data_ind( u8 Mod_id, u32 frame, u8 eNB_flag, u32 Rb_id, u32 sdu_size,u8 *Buffer); void rrc_lite_data_ind( u8 Mod_id, u32 frame, u8 eNB_flag, u32 Rb_id, u32 sdu_size,u8 *Buffer);
void rrc_lite_out_of_sync_ind(u8 Mod_id, u32 frame, unsigned short eNB_index); void rrc_lite_out_of_sync_ind(u8 Mod_id, u32 frame, unsigned short eNB_index);
@@ -470,6 +475,8 @@ void rrc_lite_out_of_sync_ind(u8 Mod_id, u32 frame, unsigned short eNB_index);
int decode_MCCH_Message(u8 Mod_id, u32 frame, u8 eNB_index, u8 *Sdu, u8 Sdu_len,u8 mbsfn_sync_area); int decode_MCCH_Message(u8 Mod_id, u32 frame, u8 eNB_index, u8 *Sdu, u8 Sdu_len,u8 mbsfn_sync_area);
void decode_MBSFNAreaConfiguration(u8 Mod_id, u8 eNB_index, u32 frame,u8 mbsfn_sync_area); void decode_MBSFNAreaConfiguration(u8 Mod_id, u8 eNB_index, u32 frame,u8 mbsfn_sync_area);
int decode_BCCH_DLSCH_Message(u8 Mod_id,u32 frame,u8 eNB_index,u8 *Sdu,u8 Sdu_len);
int decode_SIB1(u8 Mod_id,u8 CH_index); int decode_SIB1(u8 Mod_id,u8 CH_index);
int decode_SI(u8 Mod_id,u32 frame,u8 CH_index,u8 si_window); int decode_SI(u8 Mod_id,u32 frame,u8 CH_index,u8 si_window);
+147 -32
View File
@@ -36,7 +36,6 @@
* \email: raymond.knopp@eurecom.fr and navid.nikaein@eurecom.fr * \email: raymond.knopp@eurecom.fr and navid.nikaein@eurecom.fr
*/ */
#include "defs.h" #include "defs.h"
#include "extern.h" #include "extern.h"
#include "LAYER2/MAC/extern.h" #include "LAYER2/MAC/extern.h"
@@ -45,6 +44,12 @@
#include "LAYER2/RLC/rlc.h" #include "LAYER2/RLC/rlc.h"
#include "COMMON/mac_rrc_primitives.h" #include "COMMON/mac_rrc_primitives.h"
#include "UTIL/LOG/log.h" #include "UTIL/LOG/log.h"
#include "asn1_msg.h"
#if defined(ENABLE_ITTI)
# include "intertask_interface.h"
#endif
#define DEBUG_RRC 1 #define DEBUG_RRC 1
extern eNB_MAC_INST *eNB_mac_inst; extern eNB_MAC_INST *eNB_mac_inst;
extern UE_MAC_INST *UE_mac_inst; extern UE_MAC_INST *UE_mac_inst;
@@ -61,7 +66,8 @@ void openair_rrc_on(u8 Mod_id,u8 eNB_flag){
rrc_config_buffer (&eNB_rrc_inst[Mod_id].Srb0, CCCH, 1); rrc_config_buffer (&eNB_rrc_inst[Mod_id].Srb0, CCCH, 1);
eNB_rrc_inst[Mod_id].Srb0.Active = 1; eNB_rrc_inst[Mod_id].Srb0.Active = 1;
} else{ }
else {
LOG_I(RRC, "[UE %d] OPENAIR RRC IN....\n", Mod_id); LOG_I(RRC, "[UE %d] OPENAIR RRC IN....\n", Mod_id);
for (i = 0; i < NB_eNB_INST; i++) { for (i = 0; i < NB_eNB_INST; i++) {
LOG_D(RRC, "[RRC][UE %d] Activating CCCH (eNB %d)\n", Mod_id, i); LOG_D(RRC, "[RRC][UE %d] Activating CCCH (eNB %d)\n", Mod_id, i);
@@ -76,7 +82,6 @@ void openair_rrc_on(u8 Mod_id,u8 eNB_flag){
int rrc_init_global_param(void) { int rrc_init_global_param(void) {
//#ifdef USER_MODE //#ifdef USER_MODE
// Rrc_xface = (RRC_XFACE*)malloc16(sizeof(RRC_XFACE)); // Rrc_xface = (RRC_XFACE*)malloc16(sizeof(RRC_XFACE));
//#endif //USRE_MODE //#endif //USRE_MODE
@@ -108,7 +113,6 @@ int rrc_init_global_param(void){
*/ */
rrc_rlc_register_rrc (rlcrrc_data_ind, NULL); //register with rlc rrc_rlc_register_rrc (rlcrrc_data_ind, NULL); //register with rlc
DCCH_LCHAN_DESC.transport_block_size = 4; DCCH_LCHAN_DESC.transport_block_size = 4;
DCCH_LCHAN_DESC.max_transport_blocks = 16; DCCH_LCHAN_DESC.max_transport_blocks = 16;
DCCH_LCHAN_DESC.Delay_class = 1; DCCH_LCHAN_DESC.Delay_class = 1;
@@ -140,7 +144,6 @@ int rrc_init_global_param(void){
return 0; return 0;
} }
#ifndef NO_RRM #ifndef NO_RRM
/*------------------------------------------------------------------------------*/ /*------------------------------------------------------------------------------*/
int L3_xface_init(void) { int L3_xface_init(void) {
@@ -156,8 +159,7 @@ int L3_xface_init(void){
if (open_socket (&S_rrc, RRC_RRM_SOCK_PATH, RRM_RRC_SOCK_PATH, 0) == -1) if (open_socket (&S_rrc, RRC_RRM_SOCK_PATH, RRM_RRC_SOCK_PATH, 0) == -1)
return (-1); return (-1);
if (S_rrc.s == -1) if (S_rrc.s == -1) {
{
return (-1); return (-1);
} }
@@ -203,18 +205,15 @@ void rrc_config_buffer(SRB_INFO *Srb_info, u8 Lchan_type, u8 Role){
Srb_info->Tx_buffer.payload_size = 0; Srb_info->Tx_buffer.payload_size = 0;
} }
/*------------------------------------------------------------------------------*/ /*------------------------------------------------------------------------------*/
void openair_rrc_top_init(int eMBMS_active, u8 cba_group_active) { void openair_rrc_top_init(int eMBMS_active, u8 cba_group_active) {
/*-----------------------------------------------------------------------------*/ /*-----------------------------------------------------------------------------*/
int i; int i;
uint8_t size;
OAI_UECapability_t *UECap; OAI_UECapability_t *UECap;
// uint8_t dummy_buffer[100]; // uint8_t dummy_buffer[100];
LOG_D(RRC,"[OPENAIR][INIT] Init function start: NB_UE_INST=%d, NB_eNB_INST=%d\n", LOG_D(RRC, "[OPENAIR][INIT] Init function start: NB_UE_INST=%d, NB_eNB_INST=%d\n", NB_UE_INST, NB_eNB_INST);
NB_UE_INST,NB_eNB_INST);
if (NB_UE_INST > 0) { if (NB_UE_INST > 0) {
UE_rrc_inst = (UE_RRC_INST*) malloc16(NB_UE_INST*sizeof(UE_RRC_INST)); UE_rrc_inst = (UE_RRC_INST*) malloc16(NB_UE_INST*sizeof(UE_RRC_INST));
@@ -238,10 +237,10 @@ void openair_rrc_top_init(int eMBMS_active, u8 cba_group_active){
UE_rrc_inst[i].MBMS_flag = (uint8_t)eMBMS_active; UE_rrc_inst[i].MBMS_flag = (uint8_t)eMBMS_active;
} }
#endif #endif
} else }
else
UE_rrc_inst = NULL; UE_rrc_inst = NULL;
if (NB_eNB_INST > 0) { if (NB_eNB_INST > 0) {
eNB_rrc_inst = (eNB_RRC_INST*) malloc16(NB_eNB_INST*sizeof(eNB_RRC_INST)); eNB_rrc_inst = (eNB_RRC_INST*) malloc16(NB_eNB_INST*sizeof(eNB_RRC_INST));
memset (eNB_rrc_inst, 0, NB_eNB_INST * sizeof(eNB_RRC_INST)); memset (eNB_rrc_inst, 0, NB_eNB_INST * sizeof(eNB_RRC_INST));
@@ -256,8 +255,10 @@ void openair_rrc_top_init(int eMBMS_active, u8 cba_group_active){
eNB_rrc_inst[i].num_active_cba_groups = cba_group_active; eNB_rrc_inst[i].num_active_cba_groups = cba_group_active;
} }
#endif #endif
LOG_D(RRC,"ALLOCATE %d Bytes for eNB_RRC_INST @ %p\n",(unsigned int)(NB_eNB_INST*sizeof(eNB_RRC_INST)),eNB_rrc_inst); LOG_D(RRC,
}else "ALLOCATE %d Bytes for eNB_RRC_INST @ %p\n", (unsigned int)(NB_eNB_INST*sizeof(eNB_RRC_INST)), eNB_rrc_inst);
}
else
eNB_rrc_inst = NULL; eNB_rrc_inst = NULL;
#ifndef NO_RRM #ifndef NO_RRM
#ifndef USER_MODE #ifndef USER_MODE
@@ -271,7 +272,6 @@ void openair_rrc_top_init(int eMBMS_active, u8 cba_group_active){
#endif //NO_RRM #endif //NO_RRM
Data_to_read = 0; Data_to_read = 0;
#endif //USER_MODE #endif //USER_MODE
} }
void rrc_top_cleanup(void) { void rrc_top_cleanup(void) {
@@ -283,10 +283,14 @@ void rrc_top_cleanup(void){
} }
u16 T300[8] = {100,200,300,400,600,1000,1500,2000}; u16 T300[8] =
u16 T310[8] = {0,50,100,200,500,1000,2000}; {100, 200, 300, 400, 600, 1000, 1500, 2000};
u16 N310[8] = {1,2,3,4,6,8,10,20}; u16 T310[8] =
u16 N311[8] = {1,2,3,4,6,8,10,20}; {0, 50, 100, 200, 500, 1000, 2000};
u16 N310[8] =
{1, 2, 3, 4, 6, 8, 10, 20};
u16 N311[8] =
{1, 2, 3, 4, 6, 8, 10, 20};
void rrc_t310_expiration(u32 frame, u8 Mod_id, u8 eNB_index) { void rrc_t310_expiration(u32 frame, u8 Mod_id, u8 eNB_index) {
@@ -302,9 +306,12 @@ void rrc_t310_expiration(u32 frame,u8 Mod_id,u8 eNB_index) {
UE_rrc_inst[Mod_id].Srb1[eNB_index].Srb_info.Tx_buffer.payload_size = 0; UE_rrc_inst[Mod_id].Srb1[eNB_index].Srb_info.Tx_buffer.payload_size = 0;
if (UE_rrc_inst[Mod_id].Srb2[eNB_index].Active == 1) { if (UE_rrc_inst[Mod_id].Srb2[eNB_index].Active == 1) {
msg("[RRC Inst %d] eNB_index %d, Remove RB %d\n ",Mod_id,eNB_index,UE_rrc_inst[Mod_id].Srb2[eNB_index].Srb_info.Srb_id); msg ("[RRC Inst %d] eNB_index %d, Remove RB %d\n ", Mod_id, eNB_index,
rrc_pdcp_config_req (Mod_id+NB_eNB_INST, frame, 0, ACTION_REMOVE, UE_rrc_inst[Mod_id].Srb2[eNB_index].Srb_info.Srb_id); UE_rrc_inst[Mod_id].Srb2[eNB_index].Srb_info.Srb_id);
rrc_rlc_config_req(Mod_id+NB_eNB_INST,frame,0,ACTION_REMOVE,UE_rrc_inst[Mod_id].Srb2[eNB_index].Srb_info.Srb_id,SIGNALLING_RADIO_BEARER,Rlc_info_um); rrc_pdcp_config_req (Mod_id + NB_eNB_INST, frame, 0, ACTION_REMOVE,
UE_rrc_inst[Mod_id].Srb2[eNB_index].Srb_info.Srb_id);
rrc_rlc_config_req (Mod_id + NB_eNB_INST, frame, 0, ACTION_REMOVE,
UE_rrc_inst[Mod_id].Srb2[eNB_index].Srb_info.Srb_id, SIGNALLING_RADIO_BEARER, Rlc_info_um);
UE_rrc_inst[Mod_id].Srb2[eNB_index].Active = 0; UE_rrc_inst[Mod_id].Srb2[eNB_index].Active = 0;
UE_rrc_inst[Mod_id].Srb2[eNB_index].Status = IDLE; UE_rrc_inst[Mod_id].Srb2[eNB_index].Status = IDLE;
UE_rrc_inst[Mod_id].Srb2[eNB_index].Next_check_frame = 0; UE_rrc_inst[Mod_id].Srb2[eNB_index].Next_check_frame = 0;
@@ -322,9 +329,10 @@ RRC_status_t rrc_rx_tx(u8 Mod_id,u32 frame, u8 eNB_flag,u8 index){
if (UE_rrc_inst[Mod_id].Info[index].T300_active == 1) { if (UE_rrc_inst[Mod_id].Info[index].T300_active == 1) {
if ((UE_rrc_inst[Mod_id].Info[index].T300_cnt % 10) == 0) if ((UE_rrc_inst[Mod_id].Info[index].T300_cnt % 10) == 0)
LOG_D(RRC,"[UE %d][RAPROC] Frame %d T300 Count %d ms\n",Mod_id,frame, LOG_D(RRC,
UE_rrc_inst[Mod_id].Info[index].T300_cnt); "[UE %d][RAPROC] Frame %d T300 Count %d ms\n", Mod_id, frame, UE_rrc_inst[Mod_id].Info[index].T300_cnt);
if (UE_rrc_inst[Mod_id].Info[index].T300_cnt == T300[UE_rrc_inst[Mod_id].sib2[index]->ue_TimersAndConstants.t300]) { if (UE_rrc_inst[Mod_id].Info[index].T300_cnt
== T300[UE_rrc_inst[Mod_id].sib2[index]->ue_TimersAndConstants.t300]) {
UE_rrc_inst[Mod_id].Info[index].T300_active = 0; UE_rrc_inst[Mod_id].Info[index].T300_active = 0;
// ALLOW CCCH to be used // ALLOW CCCH to be used
UE_rrc_inst[Mod_id].Srb0[index].Tx_buffer.payload_size = 0; UE_rrc_inst[Mod_id].Srb0[index].Tx_buffer.payload_size = 0;
@@ -334,7 +342,8 @@ RRC_status_t rrc_rx_tx(u8 Mod_id,u32 frame, u8 eNB_flag,u8 index){
UE_rrc_inst[Mod_id].Info[index].T300_cnt++; UE_rrc_inst[Mod_id].Info[index].T300_cnt++;
} }
if (UE_rrc_inst[Mod_id].sib2[index]) { if (UE_rrc_inst[Mod_id].sib2[index]) {
if (UE_rrc_inst[Mod_id].Info[index].N310_cnt==N310[UE_rrc_inst[Mod_id].sib2[index]->ue_TimersAndConstants.n310]) { if (UE_rrc_inst[Mod_id].Info[index].N310_cnt
== N310[UE_rrc_inst[Mod_id].sib2[index]->ue_TimersAndConstants.n310]) {
UE_rrc_inst[Mod_id].Info[index].T310_active = 1; UE_rrc_inst[Mod_id].Info[index].T310_active = 1;
} }
} }
@@ -346,15 +355,15 @@ RRC_status_t rrc_rx_tx(u8 Mod_id,u32 frame, u8 eNB_flag,u8 index){
} }
if (UE_rrc_inst[Mod_id].Info[index].T310_active == 1) { if (UE_rrc_inst[Mod_id].Info[index].T310_active == 1) {
if (UE_rrc_inst[Mod_id].Info[index].N311_cnt == if (UE_rrc_inst[Mod_id].Info[index].N311_cnt
N311[UE_rrc_inst[Mod_id].sib2[index]->ue_TimersAndConstants.n311]) { == N311[UE_rrc_inst[Mod_id].sib2[index]->ue_TimersAndConstants.n311]) {
UE_rrc_inst[Mod_id].Info[index].T310_active = 0; UE_rrc_inst[Mod_id].Info[index].T310_active = 0;
UE_rrc_inst[Mod_id].Info[index].N311_cnt = 0; UE_rrc_inst[Mod_id].Info[index].N311_cnt = 0;
} }
if ((UE_rrc_inst[Mod_id].Info[index].T310_cnt % 10) == 0) if ((UE_rrc_inst[Mod_id].Info[index].T310_cnt % 10) == 0)
LOG_D(RRC,"[UE %d] Frame %d T310 Count %d ms\n",Mod_id,frame, LOG_D(RRC, "[UE %d] Frame %d T310 Count %d ms\n", Mod_id, frame, UE_rrc_inst[Mod_id].Info[index].T310_cnt);
UE_rrc_inst[Mod_id].Info[index].T310_cnt); if (UE_rrc_inst[Mod_id].Info[index].T310_cnt
if (UE_rrc_inst[Mod_id].Info[index].T310_cnt == T310[UE_rrc_inst[Mod_id].sib2[index]->ue_TimersAndConstants.t310]) { == T310[UE_rrc_inst[Mod_id].sib2[index]->ue_TimersAndConstants.t310]) {
UE_rrc_inst[Mod_id].Info[index].T310_active = 0; UE_rrc_inst[Mod_id].Info[index].T310_active = 0;
rrc_t310_expiration (frame, Mod_id, index); rrc_t310_expiration (frame, Mod_id, index);
return (RRC_PHY_RESYNCH); return (RRC_PHY_RESYNCH);
@@ -365,3 +374,109 @@ RRC_status_t rrc_rx_tx(u8 Mod_id,u32 frame, u8 eNB_flag,u8 index){
return (RRC_OK); return (RRC_OK);
} }
#if defined(ENABLE_ITTI)
void *rrc_ue_task(void *args_p) {
MessageDef *msg_p;
char *msg_name;
instance_t instance;
SRB_INFO *srb_info_p;
itti_mark_task_ready (TASK_RRC_UE);
while(1)
{
// Wait for a message
itti_receive_msg (TASK_RRC_UE, &msg_p);
msg_name = ITTI_MSG_NAME (msg_p);
instance = ITTI_MSG_INSTANCE (msg_p);
switch (msg_p->header.messageId) {
case TERMINATE_MESSAGE:
itti_exit_task ();
break;
case MESSAGE_TEST:
LOG_D(RRC, "Received %s\n", msg_name);
break;
case RRC_MAC_IN_SYNC_IND:
LOG_D(RRC, "Received %s: instance %d, frame %d, eNB %d\n", msg_name, instance,
RRC_MAC_IN_SYNC_IND (msg_p).frame, RRC_MAC_IN_SYNC_IND (msg_p).enb_index);
UE_rrc_inst[instance].Info[RRC_MAC_IN_SYNC_IND (msg_p).enb_index].N310_cnt = 0;
if (UE_rrc_inst[instance].Info[RRC_MAC_IN_SYNC_IND (msg_p).enb_index].T310_active == 1)
UE_rrc_inst[instance].Info[RRC_MAC_IN_SYNC_IND (msg_p).enb_index].N311_cnt++;
break;
case RRC_MAC_OUT_OF_SYNC_IND:
LOG_D(RRC, "Received %s: instance %d, frame %d, eNB %d\n", msg_name, instance,
RRC_MAC_OUT_OF_SYNC_IND (msg_p).frame, RRC_MAC_OUT_OF_SYNC_IND (msg_p).enb_index);
UE_rrc_inst[instance].Info[RRC_MAC_OUT_OF_SYNC_IND (msg_p).enb_index].N310_cnt ++;
break;
case RRC_MAC_BCCH_DATA_IND:
LOG_D(RRC, "Received %s: instance %d, frame %d, eNB %d\n", msg_name, instance,
RRC_MAC_BCCH_DATA_IND (msg_p).frame, RRC_MAC_BCCH_DATA_IND (msg_p).enb_index);
decode_BCCH_DLSCH_Message (instance, RRC_MAC_BCCH_DATA_IND (msg_p).frame,
RRC_MAC_BCCH_DATA_IND (msg_p).enb_index, RRC_MAC_BCCH_DATA_IND (msg_p).sdu_p,
RRC_MAC_BCCH_DATA_IND (msg_p).sdu_size);
// Message buffer has been processed, free it now.
free (RRC_MAC_BCCH_DATA_IND (msg_p).sdu_p);
break;
case RRC_MAC_CCCH_DATA_IND:
LOG_D(RRC, "Received %s: instance %d, frame %d, eNB %d\n", msg_name, instance,
RRC_MAC_CCCH_DATA_IND (msg_p).frame, RRC_MAC_CCCH_DATA_IND (msg_p).enb_index);
srb_info_p = &UE_rrc_inst[instance].Srb0[RRC_MAC_CCCH_DATA_IND (msg_p).enb_index];
memcpy (srb_info_p->Rx_buffer.Payload, RRC_MAC_CCCH_DATA_IND (msg_p).sdu_p,
RRC_MAC_CCCH_DATA_IND (msg_p).sdu_size);
srb_info_p->Rx_buffer.payload_size = RRC_MAC_CCCH_DATA_IND (msg_p).sdu_size;
rrc_ue_decode_ccch (instance, RRC_MAC_CCCH_DATA_IND (msg_p).frame, srb_info_p,
RRC_MAC_CCCH_DATA_IND (msg_p).enb_index);
// Message buffer has been processed, free it now.
free (RRC_MAC_CCCH_DATA_IND (msg_p).sdu_p);
break;
#ifdef Rel10
case RRC_MAC_MCCH_DATA_IND:
LOG_D(RRC, "Received %s: instance %d, frame %d, eNB %d, mbsfn SA %d\n", msg_name, instance,
RRC_MAC_MCCH_DATA_IND (msg_p).frame, RRC_MAC_MCCH_DATA_IND (msg_p).eNB_index, RRC_MAC_MCCH_DATA_IND (msg_p).mbsfn_sync_area);
decode_MCCH_Message (instance, RRC_MAC_MCCH_DATA_IND (msg_p).frame, RRC_MAC_MCCH_DATA_IND (msg_p).eNB_index,
RRC_MAC_MCCH_DATA_IND (msg_p).sdu_p, RRC_MAC_MCCH_DATA_IND (msg_p).sdu_size,
RRC_MAC_MCCH_DATA_IND (msg_p).mbsfn_sync_area);
// Message buffer has been processed, free it now.
free (RRC_MAC_MCCH_DATA_IND (msg_p).sdu_p);
break;
#endif
case RRC_DCCH_DATA_IND:
LOG_D(RRC, "Received %s: instance %d, frame %d, DCCH %d, UE %d\n", msg_name, instance,
RRC_DCCH_DATA_IND (msg_p).frame, RRC_DCCH_DATA_IND (msg_p).dcch_index, RRC_DCCH_DATA_IND (msg_p).ue_index);
rrc_ue_decode_dcch (instance, RRC_DCCH_DATA_IND (msg_p).frame,
RRC_DCCH_DATA_IND (msg_p).dcch_index, RRC_DCCH_DATA_IND (msg_p).sdu_p,
RRC_DCCH_DATA_IND (msg_p).ue_index);
// Message buffer has been processed, free it now.
free (RRC_DCCH_DATA_IND (msg_p).sdu_p);
break;
default:
LOG_E(RRC, "Received unexpected message %s\n", msg_name);
break;
}
free (msg_p);
}
}
#endif
+2 -21
View File
@@ -377,28 +377,12 @@ void *l2l1_task(void *args_p) {
#if defined(ENABLE_ITTI) #if defined(ENABLE_ITTI)
MessageDef *message_p; MessageDef *message_p;
long timer_id;
itti_mark_task_ready (TASK_L2L1); itti_mark_task_ready (TASK_L2L1);
/* Test code */
{
message_p = itti_alloc_new_message(TASK_L2L1, MESSAGE_TEST);
itti_send_msg_to_task(TASK_L2L1, INSTANCE_DEFAULT, message_p);
/* Request for periodic timer */
if (timer_setup(1, 0, TASK_L2L1, INSTANCE_DEFAULT,
TIMER_PERIODIC, NULL, &timer_id) < 0)
{
LOG_E(EMU, "Failed to request new timer with %ds "
"of periocidity\n", 1);
timer_id = 0;
}
}
#endif #endif
for (frame = 0; frame < oai_emulation.info.n_frames; frame++) { for (frame = 0; frame < oai_emulation.info.n_frames; frame++) {
#if defined(ENABLE_ITTI) #if defined(ENABLE_ITTI)
// Checks if a message has been sent to L2L1 task // Checks if a message has been sent to L2L1 task
itti_poll_msg(TASK_L2L1, INSTANCE_ALL, &message_p); itti_poll_msg(TASK_L2L1, INSTANCE_ALL, &message_p);
@@ -811,9 +795,6 @@ void *l2l1_task(void *args_p) {
} //end of frame } //end of frame
#if defined(ENABLE_ITTI) #if defined(ENABLE_ITTI)
/* Stops test timer */
timer_remove(timer_id);
itti_terminate_tasks(TASK_L2L1); itti_terminate_tasks(TASK_L2L1);
#endif #endif
@@ -1004,7 +985,7 @@ int main(int argc, char **argv) {
LOG_N(EMU, "\n\n>>>>>>>>>>>>>>>>>>>>>>>>>>> OAIEMU initialization done <<<<<<<<<<<<<<<<<<<<<<<<<<\n\n"); LOG_N(EMU, "\n\n>>>>>>>>>>>>>>>>>>>>>>>>>>> OAIEMU initialization done <<<<<<<<<<<<<<<<<<<<<<<<<<\n\n");
#if defined(ENABLE_ITTI) #if defined(ENABLE_ITTI)
if (itti_create_task(TASK_L2L1, &l2l1_task, NULL) < 0) { if (itti_create_task(TASK_L2L1, l2l1_task, NULL) < 0) {
LOG_E(EMU, "Create task failed"); LOG_E(EMU, "Create task failed");
LOG_D(EMU, "Initializing L2L1 task interface: FAILED\n"); LOG_D(EMU, "Initializing L2L1 task interface: FAILED\n");
return -1; return -1;
+14 -1
View File
@@ -27,6 +27,10 @@
#include "cor_SF_sim.h" #include "cor_SF_sim.h"
#if defined(ENABLE_ITTI)
# include "intertask_interface.h"
#endif
#ifdef SMBV #ifdef SMBV
extern u8 config_smbv; extern u8 config_smbv;
extern char smbv_ip[16]; extern char smbv_ip[16];
@@ -110,7 +114,7 @@ void get_simulation_options(int argc, char *argv[]) {
{NULL, 0, NULL, 0} {NULL, 0, NULL, 0}
}; };
while ((c = getopt_long (argc, argv, "aA:b:B:c:C:D:d:eE:f:FGg:hi:IJ:j:k:L:l:m:M:n:N:oO:p:P:Q:rR:s:S:t:T:u:U:vVx:y:w:W:X:z:Z:", long_options, &option_index)) != -1) { while ((c = getopt_long (argc, argv, "aA:b:B:c:C:D:d:eE:f:FGg:hi:IJ:j:k:L:l:m:M:n:N:oO:p:P:Q:rR:s:S:t:T:u:U:vVw:W:x:X:y:Y:z:Z:", long_options, &option_index)) != -1) {
switch (c) { switch (c) {
case 0: case 0:
if (! strcmp(long_options[option_index].name, "pdcp_period")) { if (! strcmp(long_options[option_index].name, "pdcp_period")) {
@@ -568,6 +572,15 @@ void init_openair2() {
#ifdef OPENAIR2 #ifdef OPENAIR2
s32 i; s32 i;
s32 UE_id; s32 UE_id;
#if defined(ENABLE_ITTI)
if (itti_create_task(TASK_RRC_UE, rrc_ue_task, NULL) < 0) {
LOG_E(EMU, "Create task failed");
LOG_D(EMU, "Initializing RRC UE task interface: FAILED\n");
exit (-1);;
}
#endif
l2_init (&PHY_vars_eNB_g[0]->lte_frame_parms,oai_emulation.info.eMBMS_active_state, oai_emulation.info.cba_group_active); l2_init (&PHY_vars_eNB_g[0]->lte_frame_parms,oai_emulation.info.eMBMS_active_state, oai_emulation.info.cba_group_active);
printf ("after L2 init: Nid_cell %d\n", PHY_vars_eNB_g[0]->lte_frame_parms.Nid_cell); printf ("after L2 init: Nid_cell %d\n", PHY_vars_eNB_g[0]->lte_frame_parms.Nid_cell);
printf ("after L2 init: frame_type %d,tdd_config %d\n", printf ("after L2 init: frame_type %d,tdd_config %d\n",