Commit 4592bc3d authored by Vadym Furmanchuk's avatar Vadym Furmanchuk Committed by Jerome Peraldi

bug #136932 Add support 3GPP 36523 6.1.2.12 cellreselection

parent 35c0e856
...@@ -322,7 +322,8 @@ typedef struct lte_SchedulingInfo_s { ...@@ -322,7 +322,8 @@ typedef struct lte_SchedulingInfo_s {
typedef struct PhysCellIdRange_s { typedef struct PhysCellIdRange_s {
long start; long start;
e_LTE_PhysCellIdRange__range range; bool range_Present;
e_LTE_PhysCellIdRange__range range;
}PhysCellIdRange_t; }PhysCellIdRange_t;
typedef struct threshX_Q_r9_s { typedef struct threshX_Q_r9_s {
...@@ -492,9 +493,12 @@ typedef struct RrcConfigurationReq_s { ...@@ -492,9 +493,12 @@ typedef struct RrcConfigurationReq_s {
//SIB4 //SIB4
bool sib4_Present[MAX_NUM_CCs]; bool sib4_Present[MAX_NUM_CCs];
bool intraFreqNeighCellListPresent; bool intraFreqNeighCellListPresent[MAX_NUM_CCs];
int intraFreqNeighCellListCount; int intraFreqNeighCellListCount[MAX_NUM_CCs];
IntraFreqNeighCellInfo_t *intraFreqNeighCellList[MAX_NUM_CCs]; IntraFreqNeighCellInfo_t *intraFreqNeighCellList[MAX_NUM_CCs];
bool intraFreqBlackCellListPresent[MAX_NUM_CCs];
int intraFreqBlackCellListCount[MAX_NUM_CCs];
PhysCellIdRange_t *intraFreqBlackCellList[MAX_NUM_CCs];
//SIB5 //SIB5
bool sib5_Present[MAX_NUM_CCs]; bool sib5_Present[MAX_NUM_CCs];
......
...@@ -2369,24 +2369,41 @@ uint8_t do_SIB4(uint8_t Mod_id, ...@@ -2369,24 +2369,41 @@ uint8_t do_SIB4(uint8_t Mod_id,
exit(-1); exit(-1);
} }
LOG_I(RRC,"[eNB %d] Configuration SIB4, intraFreqNeighCellListPresent: %d \n", Mod_id, configuration->intraFreqNeighCellListPresent); LOG_I(RRC,"[eNB %d] Configuration SIB4, intraFreqNeighCellListPresent: %d \n", Mod_id, configuration->intraFreqNeighCellListPresent[CC_id]);
sib4_part = CALLOC(1,sizeof(struct LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member)); sib4_part = CALLOC(1,sizeof(struct LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member));
memset(sib4_part,0,sizeof(struct LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member)); memset(sib4_part,0,sizeof(struct LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member));
sib4_part->present = LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib4; sib4_part->present = LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib4;
*sib4 = &sib4_part->choice.sib4; *sib4 = &sib4_part->choice.sib4;
/* Checking if intraFreqNeighCellList is present in SIB4 */ /* Checking if intraFreqNeighCellList is present in SIB4 */
if(true == configuration->intraFreqNeighCellListPresent) { if(true == configuration->intraFreqNeighCellListPresent[CC_id]) {
(*sib4)->intraFreqNeighCellList = CALLOC(configuration->intraFreqNeighCellListCount,sizeof(struct LTE_IntraFreqNeighCellList)); (*sib4)->intraFreqNeighCellList = CALLOC(configuration->intraFreqNeighCellListCount[CC_id],sizeof(struct LTE_IntraFreqNeighCellList));
LTE_IntraFreqNeighCellInfo_t *IntraFreqNeighCellInfo; LTE_IntraFreqNeighCellInfo_t *IntraFreqNeighCellInfo;
/* Handling multiple entities in intraFreqNeighCellList for SIB4 message */ /* Handling multiple entities in intraFreqNeighCellList for SIB4 message */
for(int i = 0; i < configuration->intraFreqNeighCellListCount; i++){ for(int i = 0; i < configuration->intraFreqNeighCellListCount[CC_id]; i++){
IntraFreqNeighCellInfo = CALLOC(1,sizeof(struct LTE_IntraFreqNeighCellInfo)); IntraFreqNeighCellInfo = CALLOC(1,sizeof(struct LTE_IntraFreqNeighCellInfo));
IntraFreqNeighCellInfo->physCellId = configuration->intraFreqNeighCellList[CC_id][i].physCellId; IntraFreqNeighCellInfo->physCellId = configuration->intraFreqNeighCellList[CC_id][i].physCellId;
IntraFreqNeighCellInfo->q_OffsetCell = configuration->intraFreqNeighCellList[CC_id][i].q_OffsetCell; IntraFreqNeighCellInfo->q_OffsetCell = configuration->intraFreqNeighCellList[CC_id][i].q_OffsetCell;
asn1cSeqAdd(&(*sib4)->intraFreqNeighCellList->list,IntraFreqNeighCellInfo); asn1cSeqAdd(&(*sib4)->intraFreqNeighCellList->list,IntraFreqNeighCellInfo);
} }
} }
/* Checking if intraFreqBlackCellList is present in SIB4 */
if (true == configuration->intraFreqBlackCellListPresent[CC_id]) {
(*sib4)->intraFreqBlackCellList = CALLOC(configuration->intraFreqBlackCellListCount[CC_id], sizeof(struct LTE_IntraFreqBlackCellList));
LTE_PhysCellIdRange_t *PhysCellIdRange;
/* Handling multiple entities in intraFreqBlackCellList for SIB4 message */
for (int i = 0; i < configuration->intraFreqBlackCellListCount[CC_id]; i++) {
PhysCellIdRange = CALLOC(1, sizeof(struct LTE_PhysCellIdRange));
PhysCellIdRange->start = configuration->intraFreqBlackCellList[CC_id][i].start;
if (true == configuration->intraFreqBlackCellList[CC_id][i].range_Present) {
PhysCellIdRange->range = CALLOC(1, sizeof(long));
PhysCellIdRange->range = (long *)configuration->intraFreqBlackCellList[CC_id][i].range;
}
asn1cSeqAdd(&(*sib4)->intraFreqBlackCellList->list, PhysCellIdRange);
}
}
/* TODO : Need to handle all remaining ext and lateNonCriticalExtension IE properly */ /* TODO : Need to handle all remaining ext and lateNonCriticalExtension IE properly */
(*sib4)->lateNonCriticalExtension = NULL; (*sib4)->lateNonCriticalExtension = NULL;
(*sib4)->ext1 = NULL; (*sib4)->ext1 = NULL;
......
...@@ -534,14 +534,26 @@ int sys_add_reconfig_cell(struct SYSTEM_CTRL_REQ *req) ...@@ -534,14 +534,26 @@ int sys_add_reconfig_cell(struct SYSTEM_CTRL_REQ *req)
if(SQN_SystemInformation_r8_IEs_sib_TypeAndInfo_s_sib4 == AddOrReconfigure->Basic.v.BcchConfig.v.BcchInfo.v.SIs.v.v[i].message.v.c1.v.systemInformation.criticalExtensions.v.systemInformation_r8.sib_TypeAndInfo.v[j].d) { if(SQN_SystemInformation_r8_IEs_sib_TypeAndInfo_s_sib4 == AddOrReconfigure->Basic.v.BcchConfig.v.BcchInfo.v.SIs.v.v[i].message.v.c1.v.systemInformation.criticalExtensions.v.systemInformation_r8.sib_TypeAndInfo.v[j].d) {
RRC_CONFIGURATION_REQ(msg_p).sib4_Present[cell_index] = true; RRC_CONFIGURATION_REQ(msg_p).sib4_Present[cell_index] = true;
if(true == AddOrReconfigure->Basic.v.BcchConfig.v.BcchInfo.v.SIs.v.v[i].message.v.c1.v.systemInformation.criticalExtensions.v.systemInformation_r8.sib_TypeAndInfo.v[j].v.sib4.intraFreqNeighCellList.d) { if(true == AddOrReconfigure->Basic.v.BcchConfig.v.BcchInfo.v.SIs.v.v[i].message.v.c1.v.systemInformation.criticalExtensions.v.systemInformation_r8.sib_TypeAndInfo.v[j].v.sib4.intraFreqNeighCellList.d) {
RRC_CONFIGURATION_REQ(msg_p).intraFreqNeighCellListCount = AddOrReconfigure->Basic.v.BcchConfig.v.BcchInfo.v.SIs.v.v[i].message.v.c1.v.systemInformation.criticalExtensions.v.systemInformation_r8.sib_TypeAndInfo.v[j].v.sib4.intraFreqNeighCellList.v.d; RRC_CONFIGURATION_REQ(msg_p).intraFreqNeighCellListCount[cell_index] = AddOrReconfigure->Basic.v.BcchConfig.v.BcchInfo.v.SIs.v.v[i].message.v.c1.v.systemInformation.criticalExtensions.v.systemInformation_r8.sib_TypeAndInfo.v[j].v.sib4.intraFreqNeighCellList.v.d;
RRC_CONFIGURATION_REQ(msg_p).intraFreqNeighCellList[cell_index] = CALLOC(RRC_CONFIGURATION_REQ(msg_p).intraFreqNeighCellListCount,sizeof(struct IntraFreqNeighCellInfo_s)); RRC_CONFIGURATION_REQ(msg_p).intraFreqNeighCellList[cell_index] = CALLOC(RRC_CONFIGURATION_REQ(msg_p).intraFreqNeighCellListCount[cell_index],sizeof(struct IntraFreqNeighCellInfo_s));
RRC_CONFIGURATION_REQ(msg_p).intraFreqNeighCellListPresent = true; RRC_CONFIGURATION_REQ(msg_p).intraFreqNeighCellListPresent[cell_index] = true;
for(int k=0;k < AddOrReconfigure->Basic.v.BcchConfig.v.BcchInfo.v.SIs.v.v[i].message.v.c1.v.systemInformation.criticalExtensions.v.systemInformation_r8.sib_TypeAndInfo.v[j].v.sib4.intraFreqNeighCellList.v.d; k++) { for(int k=0;k < AddOrReconfigure->Basic.v.BcchConfig.v.BcchInfo.v.SIs.v.v[i].message.v.c1.v.systemInformation.criticalExtensions.v.systemInformation_r8.sib_TypeAndInfo.v[j].v.sib4.intraFreqNeighCellList.v.d; k++) {
RRC_CONFIGURATION_REQ(msg_p).intraFreqNeighCellList[cell_index][k].physCellId = AddOrReconfigure->Basic.v.BcchConfig.v.BcchInfo.v.SIs.v.v[i].message.v.c1.v.systemInformation.criticalExtensions.v.systemInformation_r8.sib_TypeAndInfo.v[j].v.sib4.intraFreqNeighCellList.v.v[k].physCellId; RRC_CONFIGURATION_REQ(msg_p).intraFreqNeighCellList[cell_index][k].physCellId = AddOrReconfigure->Basic.v.BcchConfig.v.BcchInfo.v.SIs.v.v[i].message.v.c1.v.systemInformation.criticalExtensions.v.systemInformation_r8.sib_TypeAndInfo.v[j].v.sib4.intraFreqNeighCellList.v.v[k].physCellId;
RRC_CONFIGURATION_REQ(msg_p).intraFreqNeighCellList[cell_index][k].q_OffsetCell = AddOrReconfigure->Basic.v.BcchConfig.v.BcchInfo.v.SIs.v.v[i].message.v.c1.v.systemInformation.criticalExtensions.v.systemInformation_r8.sib_TypeAndInfo.v[j].v.sib4.intraFreqNeighCellList.v.v[k].q_OffsetCell; RRC_CONFIGURATION_REQ(msg_p).intraFreqNeighCellList[cell_index][k].q_OffsetCell = AddOrReconfigure->Basic.v.BcchConfig.v.BcchInfo.v.SIs.v.v[i].message.v.c1.v.systemInformation.criticalExtensions.v.systemInformation_r8.sib_TypeAndInfo.v[j].v.sib4.intraFreqNeighCellList.v.v[k].q_OffsetCell;
} }
} }
if(true == AddOrReconfigure->Basic.v.BcchConfig.v.BcchInfo.v.SIs.v.v[i].message.v.c1.v.systemInformation.criticalExtensions.v.systemInformation_r8.sib_TypeAndInfo.v[j].v.sib4.intraFreqBlackCellList.d) {
RRC_CONFIGURATION_REQ(msg_p).intraFreqBlackCellListCount[cell_index] = AddOrReconfigure->Basic.v.BcchConfig.v.BcchInfo.v.SIs.v.v[i].message.v.c1.v.systemInformation.criticalExtensions.v.systemInformation_r8.sib_TypeAndInfo.v[j].v.sib4.intraFreqBlackCellList.v.d;
RRC_CONFIGURATION_REQ(msg_p).intraFreqBlackCellList[cell_index] = CALLOC(RRC_CONFIGURATION_REQ(msg_p).intraFreqBlackCellListCount[cell_index],sizeof(struct PhysCellIdRange_s));
RRC_CONFIGURATION_REQ(msg_p).intraFreqBlackCellListPresent[cell_index] = true;
for(int k=0;k < AddOrReconfigure->Basic.v.BcchConfig.v.BcchInfo.v.SIs.v.v[i].message.v.c1.v.systemInformation.criticalExtensions.v.systemInformation_r8.sib_TypeAndInfo.v[j].v.sib4.intraFreqBlackCellList.v.d; k++) {
RRC_CONFIGURATION_REQ(msg_p).intraFreqBlackCellList[cell_index][k].start = AddOrReconfigure->Basic.v.BcchConfig.v.BcchInfo.v.SIs.v.v[i].message.v.c1.v.systemInformation.criticalExtensions.v.systemInformation_r8.sib_TypeAndInfo.v[j].v.sib4.intraFreqBlackCellList.v.v[k].start;
if(AddOrReconfigure->Basic.v.BcchConfig.v.BcchInfo.v.SIs.v.v[i].message.v.c1.v.systemInformation.criticalExtensions.v.systemInformation_r8.sib_TypeAndInfo.v[j].v.sib4.intraFreqBlackCellList.v.v[k].range.d) {
RRC_CONFIGURATION_REQ(msg_p).intraFreqBlackCellList[cell_index][k].range_Present = true;
RRC_CONFIGURATION_REQ(msg_p).intraFreqBlackCellList[cell_index][k].range = AddOrReconfigure->Basic.v.BcchConfig.v.BcchInfo.v.SIs.v.v[i].message.v.c1.v.systemInformation.criticalExtensions.v.systemInformation_r8.sib_TypeAndInfo.v[j].v.sib4.intraFreqBlackCellList.v.v[k].range.v;
}
}
}
} }
/* SIB5: Received SIB5 from TTCN */ /* SIB5: Received SIB5 from TTCN */
if(SQN_SystemInformation_r8_IEs_sib_TypeAndInfo_s_sib5 == AddOrReconfigure->Basic.v.BcchConfig.v.BcchInfo.v.SIs.v.v[i].message.v.c1.v.systemInformation.criticalExtensions.v.systemInformation_r8.sib_TypeAndInfo.v[j].d) { if(SQN_SystemInformation_r8_IEs_sib_TypeAndInfo_s_sib5 == AddOrReconfigure->Basic.v.BcchConfig.v.BcchInfo.v.SIs.v.v[i].message.v.c1.v.systemInformation.criticalExtensions.v.systemInformation_r8.sib_TypeAndInfo.v[j].d) {
...@@ -588,6 +600,7 @@ int sys_add_reconfig_cell(struct SYSTEM_CTRL_REQ *req) ...@@ -588,6 +600,7 @@ int sys_add_reconfig_cell(struct SYSTEM_CTRL_REQ *req)
for(int m=0; m<AddOrReconfigure->Basic.v.BcchConfig.v.BcchInfo.v.SIs.v.v[i].message.v.c1.v.systemInformation.criticalExtensions.v.systemInformation_r8.sib_TypeAndInfo.v[j].v.sib5.interFreqCarrierFreqList.v[k].interFreqBlackCellList.v.d; m++) { for(int m=0; m<AddOrReconfigure->Basic.v.BcchConfig.v.BcchInfo.v.SIs.v.v[i].message.v.c1.v.systemInformation.criticalExtensions.v.systemInformation_r8.sib_TypeAndInfo.v[j].v.sib5.interFreqCarrierFreqList.v[k].interFreqBlackCellList.v.d; m++) {
RRC_CONFIGURATION_REQ(msg_p).InterFreqCarrierFreqInfo[cell_index][k].interFreqBlackCellList->start = AddOrReconfigure->Basic.v.BcchConfig.v.BcchInfo.v.SIs.v.v[i].message.v.c1.v.systemInformation.criticalExtensions.v.systemInformation_r8.sib_TypeAndInfo.v[j].v.sib5.interFreqCarrierFreqList.v[k].interFreqBlackCellList.v.v[m].start; RRC_CONFIGURATION_REQ(msg_p).InterFreqCarrierFreqInfo[cell_index][k].interFreqBlackCellList->start = AddOrReconfigure->Basic.v.BcchConfig.v.BcchInfo.v.SIs.v.v[i].message.v.c1.v.systemInformation.criticalExtensions.v.systemInformation_r8.sib_TypeAndInfo.v[j].v.sib5.interFreqCarrierFreqList.v[k].interFreqBlackCellList.v.v[m].start;
if(AddOrReconfigure->Basic.v.BcchConfig.v.BcchInfo.v.SIs.v.v[i].message.v.c1.v.systemInformation.criticalExtensions.v.systemInformation_r8.sib_TypeAndInfo.v[j].v.sib5.interFreqCarrierFreqList.v[k].interFreqBlackCellList.v.v[m].range.d) { if(AddOrReconfigure->Basic.v.BcchConfig.v.BcchInfo.v.SIs.v.v[i].message.v.c1.v.systemInformation.criticalExtensions.v.systemInformation_r8.sib_TypeAndInfo.v[j].v.sib5.interFreqCarrierFreqList.v[k].interFreqBlackCellList.v.v[m].range.d) {
RRC_CONFIGURATION_REQ(msg_p).InterFreqCarrierFreqInfo[cell_index][k].interFreqBlackCellList->range_Present = true;
RRC_CONFIGURATION_REQ(msg_p).InterFreqCarrierFreqInfo[cell_index][k].interFreqBlackCellList->range = AddOrReconfigure->Basic.v.BcchConfig.v.BcchInfo.v.SIs.v.v[i].message.v.c1.v.systemInformation.criticalExtensions.v.systemInformation_r8.sib_TypeAndInfo.v[j].v.sib5.interFreqCarrierFreqList.v[k].interFreqBlackCellList.v.v[m].range.v; RRC_CONFIGURATION_REQ(msg_p).InterFreqCarrierFreqInfo[cell_index][k].interFreqBlackCellList->range = AddOrReconfigure->Basic.v.BcchConfig.v.BcchInfo.v.SIs.v.v[i].message.v.c1.v.systemInformation.criticalExtensions.v.systemInformation_r8.sib_TypeAndInfo.v[j].v.sib5.interFreqCarrierFreqList.v[k].interFreqBlackCellList.v.v[m].range.v;
} }
} }
......
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