Commit 69cadc97 authored by winckel's avatar winckel

Added rsrq and rsrp to BCCH DATA IND message to allow reporting of signal...

Added rsrq and rsrp to BCCH DATA IND message to allow reporting of signal level and quality to upper layers.
 Added NAS_CELL_SELECTION_CNF response for NAS after successful decoding of SIB1.

git-svn-id: http://svn.eurecom.fr/openair4G/trunk@4811 818b1a75-f10b-46b9-bf7c-635c3b92a50f
parent 3086538e
...@@ -31,58 +31,60 @@ ...@@ -31,58 +31,60 @@
//-------------------------------------------------------------------------------------------// //-------------------------------------------------------------------------------------------//
// Messages between RRC and MAC layers // Messages between RRC and MAC layers
typedef struct RrcMacInSyncInd_s { typedef struct RrcMacInSyncInd_s {
uint32_t frame; uint32_t frame;
uint16_t enb_index; uint16_t enb_index;
} RrcMacInSyncInd; } RrcMacInSyncInd;
typedef RrcMacInSyncInd RrcMacOutOfSyncInd; typedef RrcMacInSyncInd RrcMacOutOfSyncInd;
typedef struct RrcMacBcchDataReq_s { typedef struct RrcMacBcchDataReq_s {
uint32_t frame; uint32_t frame;
uint32_t sdu_size; uint32_t sdu_size;
uint8_t sdu[BCCH_SDU_SIZE]; uint8_t sdu[BCCH_SDU_SIZE];
uint8_t enb_index; uint8_t enb_index;
} RrcMacBcchDataReq; } RrcMacBcchDataReq;
typedef struct RrcMacBcchDataInd_s { typedef struct RrcMacBcchDataInd_s {
uint32_t frame; uint32_t frame;
uint32_t sdu_size; uint32_t sdu_size;
uint8_t sdu[BCCH_SDU_SIZE]; uint8_t sdu[BCCH_SDU_SIZE];
uint8_t enb_index; uint8_t enb_index;
uint8_t rsrq;
uint8_t rsrp;
} RrcMacBcchDataInd; } RrcMacBcchDataInd;
typedef struct RrcMacCcchDataReq_s { typedef struct RrcMacCcchDataReq_s {
uint32_t frame; uint32_t frame;
uint32_t sdu_size; uint32_t sdu_size;
uint8_t sdu[CCCH_SDU_SIZE]; uint8_t sdu[CCCH_SDU_SIZE];
uint8_t enb_index; uint8_t enb_index;
} RrcMacCcchDataReq; } RrcMacCcchDataReq;
typedef struct RrcMacCcchDataCnf_s { typedef struct RrcMacCcchDataCnf_s {
uint8_t enb_index; uint8_t enb_index;
} RrcMacCcchDataCnf; } RrcMacCcchDataCnf;
typedef struct RrcMacCcchDataInd_s { typedef struct RrcMacCcchDataInd_s {
uint32_t frame; uint32_t frame;
uint32_t sdu_size; uint32_t sdu_size;
uint8_t sdu[CCCH_SDU_SIZE]; uint8_t sdu[CCCH_SDU_SIZE];
uint8_t enb_index; uint8_t enb_index;
} RrcMacCcchDataInd; } RrcMacCcchDataInd;
typedef struct RrcMacMcchDataReq_s { typedef struct RrcMacMcchDataReq_s {
uint32_t frame; uint32_t frame;
uint32_t sdu_size; uint32_t sdu_size;
uint8_t sdu[MCCH_SDU_SIZE]; uint8_t sdu[MCCH_SDU_SIZE];
uint8_t enb_index; uint8_t enb_index;
uint8_t mbsfn_sync_area; uint8_t mbsfn_sync_area;
} RrcMacMcchDataReq; } RrcMacMcchDataReq;
typedef struct RrcMacMcchDataInd_s { typedef struct RrcMacMcchDataInd_s {
uint32_t frame; uint32_t frame;
uint32_t sdu_size; uint32_t sdu_size;
uint8_t sdu[MCCH_SDU_SIZE]; uint8_t sdu[MCCH_SDU_SIZE];
uint8_t enb_index; uint8_t enb_index;
uint8_t mbsfn_sync_area; uint8_t mbsfn_sync_area;
} RrcMacMcchDataInd; } RrcMacMcchDataInd;
#endif /* MAC_MESSAGES_TYPES_H_ */ #endif /* MAC_MESSAGES_TYPES_H_ */
...@@ -322,11 +322,13 @@ s8 mac_rrc_lite_data_ind(u8 Mod_id, u32 frame, u16 Srb_id, u8 *Sdu, u16 sdu_size ...@@ -322,11 +322,13 @@ s8 mac_rrc_lite_data_ind(u8 Mod_id, u32 frame, u16 Srb_id, u8 *Sdu, u16 sdu_size
RRC_MAC_BCCH_DATA_IND (message_p).sdu_size = sdu_size; RRC_MAC_BCCH_DATA_IND (message_p).sdu_size = sdu_size;
memcpy (RRC_MAC_BCCH_DATA_IND (message_p).sdu, Sdu, sdu_size); memcpy (RRC_MAC_BCCH_DATA_IND (message_p).sdu, Sdu, sdu_size);
RRC_MAC_BCCH_DATA_IND (message_p).enb_index = eNB_index; RRC_MAC_BCCH_DATA_IND (message_p).enb_index = eNB_index;
RRC_MAC_BCCH_DATA_IND (message_p).rsrq = 30 /* TODO change phy to report rspq */;
RRC_MAC_BCCH_DATA_IND (message_p).rsrp = 45 /* TODO change phy to report rspp */;
itti_send_msg_to_task (TASK_RRC_UE, Mod_id + NB_eNB_INST, message_p); itti_send_msg_to_task (TASK_RRC_UE, Mod_id + NB_eNB_INST, message_p);
} }
#else #else
decode_BCCH_DLSCH_Message(Mod_id,frame,eNB_index,Sdu,sdu_size); decode_BCCH_DLSCH_Message(Mod_id,frame,eNB_index,Sdu,sdu_size, 0, 0);
/* /*
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) {
......
...@@ -39,6 +39,7 @@ ...@@ -39,6 +39,7 @@
#define RRC_UE_C #define RRC_UE_C
#include "assertions.h" #include "assertions.h"
#include "asn1_conversions.h"
#include "defs.h" #include "defs.h"
#include "PHY/TOOLS/dB_routines.h" #include "PHY/TOOLS/dB_routines.h"
#include "extern.h" #include "extern.h"
...@@ -1659,7 +1660,7 @@ const char SIBType[16][6] ={"SIB3\0","SIB4\0","SIB5\0","SIB6\0","SIB7\0","SIB8\0 ...@@ -1659,7 +1660,7 @@ const char SIBType[16][6] ={"SIB3\0","SIB4\0","SIB5\0","SIB6\0","SIB7\0","SIB8\0
const char SIBPeriod[7][7]= {"80ms\0","160ms\0","320ms\0","640ms\0","1280ms\0","2560ms\0","5120ms\0"}; const char SIBPeriod[7][7]= {"80ms\0","160ms\0","320ms\0","640ms\0","1280ms\0","2560ms\0","5120ms\0"};
int siPeriod_int[7] = {80,160,320,640,1280,2560,5120}; int siPeriod_int[7] = {80,160,320,640,1280,2560,5120};
int decode_BCCH_DLSCH_Message(u8 Mod_id,u32 frame,u8 eNB_index,u8 *Sdu,u8 Sdu_len) { int decode_BCCH_DLSCH_Message(u8 Mod_id,u32 frame,u8 eNB_index,u8 *Sdu,u8 Sdu_len, u8 rsrq, u8 rsrp) {
//BCCH_DL_SCH_Message_t bcch_message; //BCCH_DL_SCH_Message_t bcch_message;
BCCH_DL_SCH_Message_t *bcch_message=NULL;//_ptr=&bcch_message; BCCH_DL_SCH_Message_t *bcch_message=NULL;//_ptr=&bcch_message;
...@@ -1731,36 +1732,38 @@ int decode_BCCH_DLSCH_Message(u8 Mod_id,u32 frame,u8 eNB_index,u8 *Sdu,u8 Sdu_le ...@@ -1731,36 +1732,38 @@ int decode_BCCH_DLSCH_Message(u8 Mod_id,u32 frame,u8 eNB_index,u8 *Sdu,u8 Sdu_le
if (bcch_message->message.present == BCCH_DL_SCH_MessageType_PR_c1) { if (bcch_message->message.present == BCCH_DL_SCH_MessageType_PR_c1) {
switch (bcch_message->message.choice.c1.present) { switch (bcch_message->message.choice.c1.present) {
case BCCH_DL_SCH_MessageType__c1_PR_systemInformationBlockType1: case BCCH_DL_SCH_MessageType__c1_PR_systemInformationBlockType1:
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) {
memcpy((void*)*sib1, memcpy((void*)*sib1,
(void*)&bcch_message->message.choice.c1.choice.systemInformationBlockType1, (void*)&bcch_message->message.choice.c1.choice.systemInformationBlockType1,
sizeof(SystemInformationBlockType1_t)); sizeof(SystemInformationBlockType1_t));
LOG_D(RRC,"[UE %d] Decoding First SIB1\n",Mod_id); LOG_D(RRC,"[UE %d] Decoding First SIB1\n",Mod_id);
decode_SIB1(Mod_id,eNB_index); decode_SIB1(Mod_id, eNB_index, rsrq, rsrp);
//mac_xface->macphy_exit("after decode_SIB1"); //mac_xface->macphy_exit("after decode_SIB1");
}
} }
} break;
break;
case BCCH_DL_SCH_MessageType__c1_PR_systemInformation: case BCCH_DL_SCH_MessageType__c1_PR_systemInformation:
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)) {
// if ((frame %8) == 1) { // check only in odd frames for SI // if ((frame %8) == 1) { // check only in odd frames for SI
si_window = (frame%(UE_rrc_inst[Mod_id].Info[eNB_index].SIperiod/10))/(UE_rrc_inst[Mod_id].Info[eNB_index].SIwindowsize/10); si_window = (frame%(UE_rrc_inst[Mod_id].Info[eNB_index].SIperiod/10))/(UE_rrc_inst[Mod_id].Info[eNB_index].SIwindowsize/10);
memcpy((void*)si[si_window], memcpy((void*)si[si_window],
(void*)&bcch_message->message.choice.c1.choice.systemInformation, (void*)&bcch_message->message.choice.c1.choice.systemInformation,
sizeof(SystemInformation_t)); sizeof(SystemInformation_t));
LOG_D(RRC,"[UE %d] Decoding SI for frame %d, si_window %d\n",Mod_id,frame,si_window); LOG_D(RRC,"[UE %d] Decoding SI for frame %d, si_window %d\n",Mod_id,frame,si_window);
decode_SI(Mod_id,frame,eNB_index,si_window); decode_SI(Mod_id,frame,eNB_index,si_window);
//mac_xface->macphy_exit("after decode_SI"); //mac_xface->macphy_exit("after decode_SI");
// } // }
} }
break; break;
case BCCH_DL_SCH_MessageType__c1_PR_NOTHING:
default: case BCCH_DL_SCH_MessageType__c1_PR_NOTHING:
break; default:
break;
} }
} }
} }
...@@ -1773,7 +1776,7 @@ int decode_BCCH_DLSCH_Message(u8 Mod_id,u32 frame,u8 eNB_index,u8 *Sdu,u8 Sdu_le ...@@ -1773,7 +1776,7 @@ int decode_BCCH_DLSCH_Message(u8 Mod_id,u32 frame,u8 eNB_index,u8 *Sdu,u8 Sdu_le
} }
int decode_SIB1(u8 Mod_id,u8 eNB_index) { int decode_SIB1(u8 Mod_id,u8 eNB_index, u8 rsrq, u8 rsrp) {
SystemInformationBlockType1_t **sib1=&UE_rrc_inst[Mod_id].sib1[eNB_index]; SystemInformationBlockType1_t **sib1=&UE_rrc_inst[Mod_id].sib1[eNB_index];
int i; int i;
...@@ -1846,6 +1849,65 @@ int decode_SIB1(u8 Mod_id,u8 eNB_index) { ...@@ -1846,6 +1849,65 @@ int decode_SIB1(u8 Mod_id,u8 eNB_index) {
); );
UE_rrc_inst[Mod_id].Info[eNB_index].SIB1Status = 1; UE_rrc_inst[Mod_id].Info[eNB_index].SIB1Status = 1;
UE_rrc_inst[Mod_id].Info[eNB_index].SIB1systemInfoValueTag = (*sib1)->systemInfoValueTag;
#if defined(ENABLE_ITTI) && defined(ENABLE_USE_MME)
{
int cell_valid = 0;
if ((*sib1)->cellAccessRelatedInfo.cellBarred == SystemInformationBlockType1__cellAccessRelatedInfo__cellBarred_notBarred) {
/* Cell is not barred */
int plmn;
int plmn_number;
plmn_number = (*sib1)->cellAccessRelatedInfo.plmn_IdentityList.list.count;
/* Compare requested PLMN and PLMNs from SIB1*/
for (plmn = 0; plmn < plmn_number; plmn++) {
PLMN_Identity_t *plmn_Identity;
plmn_Identity = &(*sib1)->cellAccessRelatedInfo.plmn_IdentityList.list.array[plmn]->plmn_Identity;
if (((plmn_Identity->mcc == NULL)
||
((UE_rrc_inst[Mod_id].plmnID.MCCdigit1 == *(plmn_Identity->mcc->list.array[0])) &&
(UE_rrc_inst[Mod_id].plmnID.MCCdigit2 == *(plmn_Identity->mcc->list.array[1])) &&
(UE_rrc_inst[Mod_id].plmnID.MCCdigit3 == *(plmn_Identity->mcc->list.array[2]))))
&&
(UE_rrc_inst[Mod_id].plmnID.MNCdigit1 == *(plmn_Identity->mnc.list.array[0])) &&
(UE_rrc_inst[Mod_id].plmnID.MNCdigit2 == *(plmn_Identity->mnc.list.array[1])) &&
(((UE_rrc_inst[Mod_id].plmnID.MNCdigit3 == 0xf) && (plmn_Identity->mnc.list.count == 2))
||
(UE_rrc_inst[Mod_id].plmnID.MNCdigit3 == *(plmn_Identity->mnc.list.array[2])))) {
/* PLMN match, send a confirmation to NAS */
MessageDef *msg_p;
msg_p = itti_alloc_new_message(TASK_RRC_UE, NAS_CELL_SELECTION_CNF);
NAS_CELL_SELECTION_CNF (msg_p).errCode = AS_SUCCESS;
NAS_CELL_SELECTION_CNF (msg_p).cellID = BIT_STRING_to_uint32(&(*sib1)->cellAccessRelatedInfo.cellIdentity);
NAS_CELL_SELECTION_CNF (msg_p).tac = BIT_STRING_to_uint16(&(*sib1)->cellAccessRelatedInfo.trackingAreaCode);
NAS_CELL_SELECTION_CNF (msg_p).rat = 0xFF;
NAS_CELL_SELECTION_CNF (msg_p).rsrq = rsrq;
NAS_CELL_SELECTION_CNF (msg_p).rsrp = rsrp;
itti_send_msg_to_task(TASK_NAS_UE, Mod_id + NB_eNB_INST, msg_p);
cell_valid = 1;
break;
}
}
}
if (cell_valid == 0)
{
/* Cell can not be used, ask PHY to try the next one */
MessageDef *msg_p;
msg_p = itti_alloc_new_message(TASK_RRC_UE, PHY_FIND_NEXT_CELL_REQ);
itti_send_msg_to_task(TASK_PHY_UE, Mod_id + NB_eNB_INST, msg_p);
}
}
#endif
vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_RRC_UE_DECODE_SIB1, VCD_FUNCTION_OUT); vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_RRC_UE_DECODE_SIB1, VCD_FUNCTION_OUT);
return 0; return 0;
...@@ -2533,7 +2595,8 @@ void *rrc_ue_task(void *args_p) { ...@@ -2533,7 +2595,8 @@ void *rrc_ue_task(void *args_p) {
decode_BCCH_DLSCH_Message (Mod_id, RRC_MAC_BCCH_DATA_IND (msg_p).frame, decode_BCCH_DLSCH_Message (Mod_id, 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, RRC_MAC_BCCH_DATA_IND (msg_p).enb_index, RRC_MAC_BCCH_DATA_IND (msg_p).sdu,
RRC_MAC_BCCH_DATA_IND (msg_p).sdu_size); RRC_MAC_BCCH_DATA_IND (msg_p).sdu_size,
RRC_MAC_BCCH_DATA_IND (msg_p).rsrq, RRC_MAC_BCCH_DATA_IND (msg_p).rsrp);
break; break;
case RRC_MAC_CCCH_DATA_CNF: case RRC_MAC_CCCH_DATA_CNF:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment