Commit 9ad2b40a authored by Vijay C's avatar Vijay C

Multi cell support for SIB4 and SIB5

parent 399ad2ec
...@@ -46,6 +46,13 @@ ...@@ -46,6 +46,13 @@
#include "LTE_LogicalChannelConfig.h" #include "LTE_LogicalChannelConfig.h"
#include "LTE_SecurityAlgorithmConfig.h" #include "LTE_SecurityAlgorithmConfig.h"
#include "LTE_CipheringAlgorithm-r12.h" #include "LTE_CipheringAlgorithm-r12.h"
#include "LTE_SIB-Type.h"
#include "LTE_Q-OffsetRange.h"
#include "LTE_SchedulingInfo.h"
#include "LTE_SpeedStateScaleFactors.h"
#include "LTE_InterFreqNeighCellInfo.h"
#include "LTE_PhysCellIdRange.h"
#include "LTE_NeighCellConfig.h"
#define MAX_RBS (LTE_maxDRB + 3) #define MAX_RBS (LTE_maxDRB + 3)
...@@ -296,6 +303,59 @@ typedef struct RadioResourceConfig_s { ...@@ -296,6 +303,59 @@ typedef struct RadioResourceConfig_s {
BOOLEAN_t mbms_dedicated_serving_cell; BOOLEAN_t mbms_dedicated_serving_cell;
} RadioResourceConfig; } RadioResourceConfig;
typedef struct lte_sib_MappingInfo_s {
e_LTE_SIB_Type LTE_SIB_Type[5];
}lte_sib_MappingInfo_t;
typedef struct lte_SchedulingInfo_s {
e_LTE_SchedulingInfo__si_Periodicity si_Periodicity;
lte_sib_MappingInfo_t sib_MappingInfo;
}lte_SchedulingInfo_t;
typedef struct PhysCellIdRange_s {
long start;
e_LTE_PhysCellIdRange__range range;
}PhysCellIdRange_t;
typedef struct threshX_Q_r9_s {
long threshX_HighQ_r9;
long threshX_LowQ_r9;
}threshX_Q_r9_t;
typedef struct InterFreqCarrierFreqInfo_s {
long dl_CarrierFreq[MAX_NUM_CCs];
long q_RxLevMin[MAX_NUM_CCs];
bool p_Max_Present[MAX_NUM_CCs];
long p_Max[MAX_NUM_CCs]; /* OPTIONAL */
long t_ReselectionEUTRA[MAX_NUM_CCs];
bool t_ReselectionEUTRA_SF_Present[MAX_NUM_CCs];
LTE_SpeedStateScaleFactors_t *t_ReselectionEUTRA_SF[MAX_NUM_CCs]; /* OPTIONAL */
long threshX_High[MAX_NUM_CCs];
long threshX_Low[MAX_NUM_CCs];
long allowedMeasBandwidth[MAX_NUM_CCs];
bool presenceAntennaPort1[MAX_NUM_CCs];
bool cellReselectionPriority_Present[MAX_NUM_CCs];
long *cellReselectionPriority[MAX_NUM_CCs];/* OPTIONAL */
LTE_NeighCellConfig_t neighCellConfig[MAX_NUM_CCs];
bool q_OffsetFreqPresent[MAX_NUM_CCs];
e_LTE_Q_OffsetRange *q_OffsetFreq[MAX_NUM_CCs];/* OPTIONAL */
bool interFreqNeighCellList_Present[MAX_NUM_CCs];
LTE_InterFreqNeighCellInfo_t *interFreqNeighCellList[MAX_NUM_CCs];/* OPTIONAL */
bool interFreqBlackCellList_Present[MAX_NUM_CCs];
PhysCellIdRange_t *interFreqBlackCellList[MAX_NUM_CCs];/* OPTIONAL */
bool q_QualMin_r9_Present[MAX_NUM_CCs];
long *q_QualMin_r9[MAX_NUM_CCs];/* OPTIONAL */
bool threshX_Q_r9_Present[MAX_NUM_CCs];
threshX_Q_r9_t threshX_Q_r9[MAX_NUM_CCs];/* OPTIONAL */
bool q_QualMinWB_r11_Present[MAX_NUM_CCs];
long *q_QualMinWB_r11[MAX_NUM_CCs];/* OPTIONAL */
}InterFreqCarrierFreqInfo_t;
typedef struct IntraFreqNeighCellInfo_s {
long physCellId;
e_LTE_Q_OffsetRange q_OffsetCell;
}IntraFreqNeighCellInfo_t;
// eNB: ENB_APP -> RRC messages // eNB: ENB_APP -> RRC messages
typedef struct RrcConfigurationReq_s { typedef struct RrcConfigurationReq_s {
uint16_t tac[MAX_NUM_CCs]; uint16_t tac[MAX_NUM_CCs];
...@@ -326,6 +386,8 @@ typedef struct RrcConfigurationReq_s { ...@@ -326,6 +386,8 @@ typedef struct RrcConfigurationReq_s {
int eMTC_configured; int eMTC_configured;
int SL_configured; int SL_configured;
uint8_t systemInfoValueTag[MAX_NUM_CCs]; uint8_t systemInfoValueTag[MAX_NUM_CCs];
int schedulingInfo_count;
lte_SchedulingInfo_t *schedulingInfo;
RadioResourceConfig radioresourceconfig[MAX_NUM_CCs]; RadioResourceConfig radioresourceconfig[MAX_NUM_CCs];
RadioResourceConfig radioresourceconfig_BR[MAX_NUM_CCs]; RadioResourceConfig radioresourceconfig_BR[MAX_NUM_CCs];
...@@ -415,6 +477,16 @@ typedef struct RrcConfigurationReq_s { ...@@ -415,6 +477,16 @@ typedef struct RrcConfigurationReq_s {
long sib3_q_RxLevMin[MAX_NUM_CCs]; long sib3_q_RxLevMin[MAX_NUM_CCs];
long t_ReselectionEUTRA[MAX_NUM_CCs]; long t_ReselectionEUTRA[MAX_NUM_CCs];
//SIB4
bool sib4_Present;
bool intraFreqNeighCellListPresent;
IntraFreqNeighCellInfo_t *intraFreqNeighCellList;
//SIB5
bool sib5_Present;
int InterFreqCarrierFreqInfoCount;
InterFreqCarrierFreqInfo_t *InterFreqCarrierFreqInfo;
//SIB18 //SIB18
e_LTE_SL_CP_Len_r12 rxPool_sc_CP_Len[MAX_NUM_CCs]; e_LTE_SL_CP_Len_r12 rxPool_sc_CP_Len[MAX_NUM_CCs];
e_LTE_SL_PeriodComm_r12 rxPool_sc_Period[MAX_NUM_CCs]; e_LTE_SL_PeriodComm_r12 rxPool_sc_Period[MAX_NUM_CCs];
......
...@@ -422,6 +422,7 @@ int RCconfig_RRC(uint32_t i, eNB_RRC_INST *rrc, int macrlc_has_f1) { ...@@ -422,6 +422,7 @@ int RCconfig_RRC(uint32_t i, eNB_RRC_INST *rrc, int macrlc_has_f1) {
paramlist_def_t PLMNParamList = {ENB_CONFIG_STRING_PLMN_LIST, NULL, 0}; paramlist_def_t PLMNParamList = {ENB_CONFIG_STRING_PLMN_LIST, NULL, 0};
/* map parameter checking array instances to parameter definition array instances */ /* map parameter checking array instances to parameter definition array instances */
checkedparam_t config_check_PLMNParams [] = PLMNPARAMS_CHECK; checkedparam_t config_check_PLMNParams [] = PLMNPARAMS_CHECK;
RRC_CONFIGURATION_REQ (msg_p).InterFreqCarrierFreqInfo = CALLOC(1,sizeof(struct InterFreqCarrierFreqInfo_s));
for (int I = 0; I < sizeof(PLMNParams) / sizeof(paramdef_t); ++I) for (int I = 0; I < sizeof(PLMNParams) / sizeof(paramdef_t); ++I)
PLMNParams[I].chkPptr = &(config_check_PLMNParams[I]); PLMNParams[I].chkPptr = &(config_check_PLMNParams[I]);
...@@ -433,6 +434,11 @@ int RCconfig_RRC(uint32_t i, eNB_RRC_INST *rrc, int macrlc_has_f1) { ...@@ -433,6 +434,11 @@ int RCconfig_RRC(uint32_t i, eNB_RRC_INST *rrc, int macrlc_has_f1) {
RRC_CONFIGURATION_REQ (msg_p).cellReselectionPriority[M]=7; RRC_CONFIGURATION_REQ (msg_p).cellReselectionPriority[M]=7;
RRC_CONFIGURATION_REQ (msg_p).sib3_q_RxLevMin[M]=-70; RRC_CONFIGURATION_REQ (msg_p).sib3_q_RxLevMin[M]=-70;
RRC_CONFIGURATION_REQ (msg_p).t_ReselectionEUTRA[M]=1; RRC_CONFIGURATION_REQ (msg_p).t_ReselectionEUTRA[M]=1;
RRC_CONFIGURATION_REQ (msg_p).InterFreqCarrierFreqInfo[k].dl_CarrierFreq[M]=300;
RRC_CONFIGURATION_REQ (msg_p).InterFreqCarrierFreqInfo[k].q_RxLevMin[M]=-53;
RRC_CONFIGURATION_REQ (msg_p).InterFreqCarrierFreqInfo[k].threshX_High[M]=10;
RRC_CONFIGURATION_REQ (msg_p).InterFreqCarrierFreqInfo[k].threshX_Low[M]=1;
RRC_CONFIGURATION_REQ (msg_p).InterFreqCarrierFreqInfo[k].allowedMeasBandwidth[M]=3;
} }
// In the configuration file it is in seconds. For RRC it has to be in milliseconds // In the configuration file it is in seconds. For RRC it has to be in milliseconds
...@@ -3060,12 +3066,12 @@ void extract_and_decode_SI(int inst,int si_ind,uint8_t *si_container,int si_cont ...@@ -3060,12 +3066,12 @@ void extract_and_decode_SI(int inst,int si_ind,uint8_t *si_container,int si_cont
break; break;
case LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib4: case LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib4:
//carrier->sib4 = &typeandinfo->choice.sib4; carrier->sib4 = &typeandinfo->choice.sib4;
LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB4 in CU F1AP_SETUP_RESP message\n", inst); LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB4 in CU F1AP_SETUP_RESP message\n", inst);
break; break;
case LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib5: case LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib5:
//carrier->sib5 = &typeandinfo->choice.sib5; carrier->sib5 = &typeandinfo->choice.sib5;
LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB5 in CU F1AP_SETUP_RESP message\n", inst); LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB5 in CU F1AP_SETUP_RESP message\n", inst);
break; break;
......
...@@ -81,11 +81,16 @@ mac_rrc_data_req( ...@@ -81,11 +81,16 @@ mac_rrc_data_req(
eNB_RRC_INST *rrc; eNB_RRC_INST *rrc;
rrc_eNB_carrier_data_t *carrier; rrc_eNB_carrier_data_t *carrier;
LTE_BCCH_BCH_Message_t *mib; LTE_BCCH_BCH_Message_t *mib;
LTE_SystemInformationBlockType1_t *SIB1;
LTE_SchedulingInfo_t *SchedulingInfo;
LTE_SIB_Type_t *sib_type;
LTE_BCCH_BCH_Message_MBMS_t *mib_fembms; LTE_BCCH_BCH_Message_MBMS_t *mib_fembms;
rrc = RC.rrc[Mod_idP]; rrc = RC.rrc[Mod_idP];
carrier = &rrc->carrier[CC_id]; carrier = &rrc->carrier[CC_id];
mib = &carrier->mib; mib = &carrier->mib;
mib_fembms = &carrier->mib_fembms; mib_fembms = &carrier->mib_fembms;
SIB1 = &carrier->SIB1;
SchedulingInfo = &SIB1->schedulingInfoList.list;
if((Srb_id & RAB_OFFSET) == BCCH_SI_MBMS){ if((Srb_id & RAB_OFFSET) == BCCH_SI_MBMS){
if (frameP%8 == 0) { if (frameP%8 == 0) {
...@@ -154,7 +159,25 @@ mac_rrc_data_req( ...@@ -154,7 +159,25 @@ mac_rrc_data_req(
} /* LOG_DEBUGFLAG(DEBUG_RRC) */ } /* LOG_DEBUGFLAG(DEBUG_RRC) */
return(RC.rrc[Mod_idP]->carrier[CC_id].sizeof_SIB23); return(RC.rrc[Mod_idP]->carrier[CC_id].sizeof_SIB23);
} else { }
else if ((true == RC.rrc[Mod_idP]->carrier[CC_id].sib5_Scheduled) && ((frameP%16) == 3)) {
memcpy(&buffer_pP[0],
RC.rrc[Mod_idP]->carrier[CC_id].SIB5,
RC.rrc[Mod_idP]->carrier[CC_id].sizeof_SIB5);
if (LOG_DEBUGFLAG(DEBUG_RRC)) {
LOG_T(RRC,"[eNB %d] Frame %d : BCCH request => SIB 5\n",Mod_idP,frameP);
for (int i=0; i<RC.rrc[Mod_idP]->carrier[CC_id].sizeof_SIB5; i++) {
LOG_T(RRC,"%x.",buffer_pP[i]);
}
LOG_T(RRC,"\n");
} /* LOG_DEBUGFLAG(DEBUG_RRC) */
return (RC.rrc[Mod_idP]->carrier[CC_id].sizeof_SIB5);
}
else {
return(0); return(0);
} }
} }
......
This diff is collapsed.
...@@ -131,6 +131,30 @@ uint8_t do_SIB23(uint8_t Mod_id,int CC_id, BOOLEAN_t brOption, ...@@ -131,6 +131,30 @@ uint8_t do_SIB23(uint8_t Mod_id,int CC_id, BOOLEAN_t brOption,
RrcConfigurationReq *configuration RrcConfigurationReq *configuration
); );
/**
\brief Generate a default configuration for SIB4 in one System Information PDU (eNB).
@param Mod_id Index of eNB (used to derive some parameters)
@param buffer Pointer to PER-encoded ASN.1 description of SI PDU
@param systemInformation Pointer to asn1c C representation of SI PDU
@param sib4 Pointer (returned) to sib4 component withing SI PDU
@return size of encoded bit stream in bytes*/
uint8_t do_SIB4(uint8_t Mod_id,int CC_id, BOOLEAN_t brOption,
RrcConfigurationReq *configuration
);
/**
\brief Generate a default configuration for SIB5 in one System Information PDU (eNB).
@param Mod_id Index of eNB (used to derive some parameters)
@param buffer Pointer to PER-encoded ASN.1 description of SI PDU
@param systemInformation Pointer to asn1c C representation of SI PDU
@param sib5 Pointer (returned) to sib5 component withing SI PDU
@return size of encoded bit stream in bytes*/
uint8_t do_SIB5(uint8_t Mod_id,int CC_id, BOOLEAN_t brOption,
RrcConfigurationReq *configuration
);
/** /**
\brief Generate an RRCConnectionRequest UL-CCCH-Message (UE) based on random string or S-TMSI. This \brief Generate an RRCConnectionRequest UL-CCCH-Message (UE) based on random string or S-TMSI. This
routine only generates an mo-data establishment cause. routine only generates an mo-data establishment cause.
......
...@@ -693,6 +693,10 @@ typedef struct { ...@@ -693,6 +693,10 @@ typedef struct {
uint8_t sizeof_SIB1; uint8_t sizeof_SIB1;
uint8_t *SIB23; uint8_t *SIB23;
uint8_t sizeof_SIB23; uint8_t sizeof_SIB23;
uint8_t *SIB4;
uint8_t sizeof_SIB4;
uint8_t *SIB5;
uint8_t sizeof_SIB5;
uint8_t *SIB1_BR; uint8_t *SIB1_BR;
uint8_t sizeof_SIB1_BR; uint8_t sizeof_SIB1_BR;
uint8_t *SIB23_BR; uint8_t *SIB23_BR;
...@@ -725,6 +729,8 @@ typedef struct { ...@@ -725,6 +729,8 @@ typedef struct {
LTE_SystemInformationBlockType1_t *sib1; LTE_SystemInformationBlockType1_t *sib1;
LTE_SystemInformationBlockType2_t *sib2; LTE_SystemInformationBlockType2_t *sib2;
LTE_SystemInformationBlockType3_t *sib3; LTE_SystemInformationBlockType3_t *sib3;
LTE_SystemInformationBlockType4_t *sib4;
LTE_SystemInformationBlockType5_t *sib5;
LTE_SystemInformationBlockType1_t *sib1_BR; LTE_SystemInformationBlockType1_t *sib1_BR;
LTE_SystemInformationBlockType2_t *sib2_BR; LTE_SystemInformationBlockType2_t *sib2_BR;
LTE_SystemInformationBlockType1_MBMS_r14_t *sib1_MBMS; LTE_SystemInformationBlockType1_MBMS_r14_t *sib1_MBMS;
...@@ -743,6 +749,7 @@ typedef struct { ...@@ -743,6 +749,7 @@ typedef struct {
LTE_MCCH_Message_t mcch_counting; LTE_MCCH_Message_t mcch_counting;
LTE_MBMSCountingRequest_r10_t *mcch_message_counting; LTE_MBMSCountingRequest_r10_t *mcch_message_counting;
SRB_INFO MCCH_MESS_COUNTING[8];// MAX_MBSFN_AREA SRB_INFO MCCH_MESS_COUNTING[8];// MAX_MBSFN_AREA
bool sib5_Scheduled;
//TTN - SIB 18,19,21 for D2D //TTN - SIB 18,19,21 for D2D
LTE_SystemInformationBlockType18_r12_t *sib18; LTE_SystemInformationBlockType18_r12_t *sib18;
......
...@@ -247,6 +247,8 @@ init_SI( ...@@ -247,6 +247,8 @@ init_SI(
if(NULL==carrier->MIB) {carrier->MIB = (uint8_t *) malloc16(4);} if(NULL==carrier->MIB) {carrier->MIB = (uint8_t *) malloc16(4);}
carrier->sizeof_SIB1 = 0; carrier->sizeof_SIB1 = 0;
carrier->sizeof_SIB23 = 0; carrier->sizeof_SIB23 = 0;
carrier->sizeof_SIB4 = 0;
carrier->sizeof_SIB5 = 0;
if(NULL==carrier->SIB1) {carrier->SIB1 = (uint8_t *) malloc16(32);} if(NULL==carrier->SIB1) {carrier->SIB1 = (uint8_t *) malloc16(32);}
AssertFatal(carrier->SIB1!=NULL,PROTOCOL_RRC_CTXT_FMT" init_SI: FATAL, no memory for SIB1 allocated\n", AssertFatal(carrier->SIB1!=NULL,PROTOCOL_RRC_CTXT_FMT" init_SI: FATAL, no memory for SIB1 allocated\n",
...@@ -337,6 +339,34 @@ init_SI( ...@@ -337,6 +339,34 @@ init_SI(
PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), PROTOCOL_RRC_CTXT_ARGS(ctxt_pP),
carrier->sib2->radioResourceConfigCommon.pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.cyclicShift); carrier->sib2->radioResourceConfigCommon.pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.cyclicShift);
if(true == configuration->sib4_Present) {
if(NULL == carrier->SIB4) {
carrier->SIB4 = (uint8_t *) malloc16(64);
}
AssertFatal(carrier->SIB4!=NULL,"cannot allocate memory for SIB4");
carrier->sizeof_SIB4 = do_SIB4(ctxt_pP->module_id,
CC_id,
FALSE,
configuration
);
LOG_I(RRC,"do_SIB4, size %d \n ", carrier->sizeof_SIB4);
AssertFatal(carrier->sizeof_SIB4 != 255,"FATAL, RC.rrc[mod].carrier[CC_id].sizeof_SIB4 == 255");
}
if(true == configuration->sib5_Present) {
if(NULL == carrier->SIB5) {
carrier->SIB5 = (uint8_t *) malloc16(64);
}
AssertFatal(carrier->SIB5!=NULL,"cannot allocate memory for SIB5");
carrier->sizeof_SIB5 = do_SIB5(ctxt_pP->module_id,
CC_id,
FALSE,
configuration
);
LOG_I(RRC,"do_SIB5, size %d \n ", carrier->sizeof_SIB5);
AssertFatal(carrier->sizeof_SIB5 != 255,"FATAL, RC.rrc[mod].carrier[CC_id].sizeof_SIB5 == 255");
}
if (carrier->MBMS_flag > 0) { if (carrier->MBMS_flag > 0) {
for (i = 0; i < carrier->sib2->mbsfn_SubframeConfigList->list.count; i++) { for (i = 0; i < carrier->sib2->mbsfn_SubframeConfigList->list.count; i++) {
// SIB 2 // SIB 2
......
This diff is collapsed.
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