From b7530528e0f4ca6e6bb2f99ed278dd77c3fec1d9 Mon Sep 17 00:00:00 2001 From: Konstantinos Alexandris <konstantinos.alexandris@eurecom.fr> Date: Tue, 23 Apr 2019 12:03:22 +0200 Subject: [PATCH] To be tested: Add code for measurement report based on the neighbouring cells after x2 setup, ocs/ocn for multiple cells --- openair2/COMMON/x2ap_messages_def.h | 2 + openair2/COMMON/x2ap_messages_types.h | 12 +++ openair2/ENB_APP/flexran_agent_ran_api.c | 6 +- openair2/ENB_APP/flexran_agent_ran_api.h | 2 +- openair2/RRC/LTE/rrc_defs.h | 9 +- openair2/RRC/LTE/rrc_eNB.c | 126 +++++++++++++++++------ openair2/RRC/LTE/rrc_proto.h | 3 + openair2/X2AP/x2ap_eNB_handler.c | 17 +++ 8 files changed, 138 insertions(+), 39 deletions(-) diff --git a/openair2/COMMON/x2ap_messages_def.h b/openair2/COMMON/x2ap_messages_def.h index 2a040c8000e..c588753ca8b 100644 --- a/openair2/COMMON/x2ap_messages_def.h +++ b/openair2/COMMON/x2ap_messages_def.h @@ -39,6 +39,8 @@ MESSAGE_DEF(X2AP_REGISTER_ENB_CNF , MESSAGE_PRIORITY_MED, x2ap_reg MESSAGE_DEF(X2AP_DEREGISTERED_ENB_IND , MESSAGE_PRIORITY_MED, x2ap_deregistered_enb_ind_t , x2ap_deregistered_enb_ind) /* handover messages X2AP <-> RRC */ +MESSAGE_DEF(X2AP_SETUP_REQ , MESSAGE_PRIORITY_MED, x2ap_setup_req_t , x2ap_setup_req) +MESSAGE_DEF(X2AP_SETUP_RESP , MESSAGE_PRIORITY_MED, x2ap_setup_resp_t , x2ap_setup_resp) MESSAGE_DEF(X2AP_HANDOVER_REQ , MESSAGE_PRIORITY_MED, x2ap_handover_req_t , x2ap_handover_req) MESSAGE_DEF(X2AP_HANDOVER_REQ_ACK , MESSAGE_PRIORITY_MED, x2ap_handover_req_ack_t , x2ap_handover_req_ack) MESSAGE_DEF(X2AP_HANDOVER_CANCEL , MESSAGE_PRIORITY_MED, x2ap_handover_cancel_t , x2ap_handover_cancel) diff --git a/openair2/COMMON/x2ap_messages_types.h b/openair2/COMMON/x2ap_messages_types.h index 708430b8b2a..d284f4d0b9d 100644 --- a/openair2/COMMON/x2ap_messages_types.h +++ b/openair2/COMMON/x2ap_messages_types.h @@ -29,6 +29,8 @@ // Defines to access message fields. #define X2AP_REGISTER_ENB_REQ(mSGpTR) (mSGpTR)->ittiMsg.x2ap_register_enb_req +#define X2AP_SETUP_REQ(mSGpTR) (mSGpTR)->ittiMsg.x2ap_setup_req +#define X2AP_SETUP_RESP(mSGpTR) (mSGpTR)->ittiMsg.x2ap_setup_resp #define X2AP_HANDOVER_REQ(mSGpTR) (mSGpTR)->ittiMsg.x2ap_handover_req #define X2AP_HANDOVER_REQ_ACK(mSGpTR) (mSGpTR)->ittiMsg.x2ap_handover_req_ack #define X2AP_REGISTER_ENB_CNF(mSGpTR) (mSGpTR)->ittiMsg.x2ap_register_enb_cnf @@ -41,6 +43,16 @@ // eNB application layer -> X2AP messages +typedef struct x2ap_setup_req_s { + uint32_t Nid_cell[MAX_NUM_CCs]; + int num_cc; +} x2ap_setup_req_t; + +typedef struct x2ap_setup_resp_s { + uint32_t Nid_cell[MAX_NUM_CCs]; + int num_cc; +} x2ap_setup_resp_t; + /* X2AP UE CONTEXT RELEASE */ typedef struct x2ap_ue_context_release_s { /* used for X2AP->RRC in source and RRC->X2AP in target */ diff --git a/openair2/ENB_APP/flexran_agent_ran_api.c b/openair2/ENB_APP/flexran_agent_ran_api.c index 9e706302f35..fbda394db20 100644 --- a/openair2/ENB_APP/flexran_agent_ran_api.c +++ b/openair2/ENB_APP/flexran_agent_ran_api.c @@ -1586,15 +1586,15 @@ long flexran_get_rrc_ocp(mid_t mod_id, rnti_t rnti) { struct rrc_eNB_ue_context_s* ue_context_p = rrc_eNB_get_ue_context(RC.rrc[mod_id], rnti); if (!ue_context_p) return -1; if (!ue_context_p->ue_context.measurement_info) return -1; - return ue_context_p->ue_context.measurement_info->cellIndividualOffset; + return ue_context_p->ue_context.measurement_info->cellIndividualOffset[0]; } -long flexran_get_rrc_ocn(mid_t mod_id, rnti_t rnti) { +long flexran_get_rrc_ocn(mid_t mod_id, rnti_t rnti, long cell_id) { if (!rrc_is_present(mod_id)) return -1; struct rrc_eNB_ue_context_s* ue_context_p = rrc_eNB_get_ue_context(RC.rrc[mod_id], rnti); if (!ue_context_p) return -1; if (!ue_context_p->ue_context.measurement_info) return -1; - return ue_context_p->ue_context.measurement_info->cellIndividualOffset; + return ue_context_p->ue_context.measurement_info->cellIndividualOffset[cell_id+1]; } /* Periodic event */ diff --git a/openair2/ENB_APP/flexran_agent_ran_api.h b/openair2/ENB_APP/flexran_agent_ran_api.h index 0eee42bc2d6..224b19a2646 100644 --- a/openair2/ENB_APP/flexran_agent_ran_api.h +++ b/openair2/ENB_APP/flexran_agent_ran_api.h @@ -550,7 +550,7 @@ long flexran_get_rrc_ofn(mid_t mod_id, rnti_t rnti); long flexran_get_rrc_ocp(mid_t mod_id, rnti_t rnti); /* Get ocn offset */ -long flexran_get_rrc_ocn(mid_t mod_id, rnti_t rnti); +long flexran_get_rrc_ocn(mid_t mod_id, rnti_t rnti, long cell_id); /* Get Periodic Event max reported cells */ long flexran_get_rrc_per_event_maxReportCells(mid_t mod_id, rnti_t rnti); diff --git a/openair2/RRC/LTE/rrc_defs.h b/openair2/RRC/LTE/rrc_defs.h index 47a0ccbf244..a7ec8cc567f 100644 --- a/openair2/RRC/LTE/rrc_defs.h +++ b/openair2/RRC/LTE/rrc_defs.h @@ -61,6 +61,8 @@ #define MAX_PAYLOAD 1024 /* maximum payload size*/ +#define MAX_NUM_NEIGH_CELLs 6 /* maximum neighbouring cells number */ + #define UE_STATE_NOTIFICATION_INTERVAL 50 #define IPV4_ADDR "%u.%u.%u.%u" @@ -537,7 +539,7 @@ typedef struct MEASUREMENT_INFO_s { //TODO: Extend to multiple meas objects for OFP/OFN offsets long offsetFreq; //TODO: extend to multiple cells for OCP/OCN offsets - long cellIndividualOffset; + long cellIndividualOffset[MAX_NUM_NEIGH_CELLs+1]; EVENTS_t *events; } MEASUREMENT_INFO; @@ -822,6 +824,11 @@ typedef struct eNB_RRC_INST_s { /// NR cell id uint64_t nr_cellid; + // Neighborouring cells id + int num_neigh_cells; + int num_neigh_cells_cc[MAX_NUM_CCs]; + uint32_t neigh_cells_id[MAX_NUM_NEIGH_CELLs][MAX_NUM_CCs]; + // other RAN parameters int srb1_timer_poll_retransmit; int srb1_poll_pdu; diff --git a/openair2/RRC/LTE/rrc_eNB.c b/openair2/RRC/LTE/rrc_eNB.c index 96f0bb3dce9..c09fd86bd88 100644 --- a/openair2/RRC/LTE/rrc_eNB.c +++ b/openair2/RRC/LTE/rrc_eNB.c @@ -2942,8 +2942,9 @@ void rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt_t LTE_RSRP_Range_t *rsrp = NULL; struct LTE_MeasConfig__speedStatePars *Sparams = NULL; LTE_QuantityConfig_t *quantityConfig = NULL; - struct LTE_RRCConnectionReconfiguration_r8_IEs__dedicatedInfoNASList - *dedicatedInfoNASList = NULL; + LTE_CellsToAddMod_t *CellToAdd = NULL; + LTE_CellsToAddModList_t *CellsToAddModList = NULL; + struct LTE_RRCConnectionReconfiguration_r8_IEs__dedicatedInfoNASList *dedicatedInfoNASList = NULL; LTE_DedicatedInfoNAS_t *dedicatedInfoNas = NULL; /* For no gcc warnings */ @@ -3306,20 +3307,9 @@ void rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt_t MeasObj->measObject.choice.measObjectEUTRA.neighCellConfig.size = 1; MeasObj->measObject.choice.measObjectEUTRA.neighCellConfig.bits_unused = 6; MeasObj->measObject.choice.measObjectEUTRA.offsetFreq = NULL; // Default is 15 or 0dB - // MeasObj->measObject.choice.measObjectEUTRA.cellsToAddModList = - // (LTE_CellsToAddModList_t *) CALLOC(1, sizeof(*CellsToAddModList)); - // CellsToAddModList = MeasObj->measObject.choice.measObjectEUTRA.cellsToAddModList; - // - // // Add adjacent cell lists (6 per eNB) - // for (i = 0; i < 6; i++) { - // CellToAdd = (LTE_CellsToAddMod_t *) CALLOC(1, sizeof(*CellToAdd)); - // CellToAdd->cellIndex = i + 1; - // CellToAdd->physCellId = get_adjacent_cell_id(ctxt_pP->module_id, i); - // CellToAdd->cellIndividualOffset = LTE_Q_OffsetRange_dB0; - // ASN_SEQUENCE_ADD(&CellsToAddModList->list, CellToAdd); - // } - ASN_SEQUENCE_ADD(&MeasObj_list->list, MeasObj); - // LTE_RRCConnectionReconfiguration->criticalExtensions.choice.c1.choice.rrcConnectionReconfiguration_r8.measConfig->measObjectToAddModList = MeasObj_list; + MeasObj->measObject.choice.measObjectEUTRA.cellsToAddModList = + (LTE_CellsToAddModList_t *) CALLOC(1, sizeof(*CellsToAddModList)); + CellsToAddModList = MeasObj->measObject.choice.measObjectEUTRA.cellsToAddModList; if (!ue_context_pP->ue_context.measurement_info) { ue_context_pP->ue_context.measurement_info = CALLOC(1,sizeof(*(ue_context_pP->ue_context.measurement_info))); @@ -3327,7 +3317,20 @@ void rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt_t //TODO: Assign proper values ue_context_pP->ue_context.measurement_info->offsetFreq = 0; - ue_context_pP->ue_context.measurement_info->cellIndividualOffset = LTE_Q_OffsetRange_dB0; + ue_context_pP->ue_context.measurement_info->cellIndividualOffset[0] = 0; + + /* TODO: Extend to multiple carriers */ + // Add adjacent cell lists (max 6 per eNB) + for (i = 0; i < RC.rrc[ctxt_pP->module_id]->num_neigh_cells; i++) { + CellToAdd = (LTE_CellsToAddMod_t *) CALLOC(1, sizeof(*CellToAdd)); + CellToAdd->cellIndex = i + 1; + CellToAdd->physCellId = RC.rrc[ctxt_pP->module_id]->neigh_cells_id[i][0];//get_adjacent_cell_id(ctxt_pP->module_id, i); + CellToAdd->cellIndividualOffset = LTE_Q_OffsetRange_dB0; + ue_context_pP->ue_context.measurement_info->cellIndividualOffset[i+1] = CellToAdd->cellIndividualOffset; + ASN_SEQUENCE_ADD(&CellsToAddModList->list, CellToAdd); + } + ASN_SEQUENCE_ADD(&MeasObj_list->list, MeasObj); + // LTE_RRCConnectionReconfiguration->criticalExtensions.choice.c1.choice.rrcConnectionReconfiguration_r8.measConfig->measObjectToAddModList = MeasObj_list; if (!ue_context_pP->ue_context.measurement_info->events) { ue_context_pP->ue_context.measurement_info->events = CALLOC(1,sizeof(*(ue_context_pP->ue_context.measurement_info->events))); @@ -4398,6 +4401,50 @@ rrc_eNB_generate_HandoverPreparationInformation( *_size = ho_size; } +void rrc_eNB_process_x2_setup_request(int mod_id, x2ap_setup_req_t *m) { + + RC.rrc[mod_id]->num_neigh_cells ++; + + if (RC.rrc[mod_id]->num_neigh_cells > MAX_NUM_NEIGH_CELLs) { + LOG_E(RRC, "Error: number of neighbouring cells is exceeded \n"); + return; + } + + if (m->num_cc > MAX_NUM_CCs) { + LOG_E(RRC, "Error: number of neighbouring cells carriers is exceeded \n"); + return; + } + + RC.rrc[mod_id]->num_neigh_cells_cc[RC.rrc[mod_id]->num_neigh_cells-1] = m->num_cc; + + for (int i=0; i<m->num_cc; i++) { + RC.rrc[mod_id]->neigh_cells_id[RC.rrc[mod_id]->num_neigh_cells-1][i] = m->Nid_cell[i]; + } + +} + +void rrc_eNB_process_x2_setup_response(int mod_id, x2ap_setup_resp_t *m) { + + RC.rrc[mod_id]->num_neigh_cells ++; + + if (RC.rrc[mod_id]->num_neigh_cells > MAX_NUM_NEIGH_CELLs) { + LOG_E(RRC, "Error: number of neighbouring cells is exceeded \n"); + return; + } + + if (m->num_cc > MAX_NUM_CCs) { + LOG_E(RRC, "Error: number of neighbouring cells carriers is exceeded \n"); + return; + } + + RC.rrc[mod_id]->num_neigh_cells_cc[RC.rrc[mod_id]->num_neigh_cells-1] = m->num_cc; + + for (int i=0; i<m->num_cc; i++) { + RC.rrc[mod_id]->neigh_cells_id[RC.rrc[mod_id]->num_neigh_cells-1][i] = m->Nid_cell[i]; + } + +} + void rrc_eNB_process_handoverPreparationInformation(int mod_id, x2ap_handover_req_t *m) { struct rrc_eNB_ue_context_s *ue_context_target_p = NULL; /* TODO: get proper UE rnti */ @@ -4705,8 +4752,8 @@ rrc_eNB_generate_HO_RRCConnectionReconfiguration(const protocol_ctxt_t *const ct LTE_QuantityConfig_t *quantityConfig = NULL; LTE_MobilityControlInfo_t *mobilityInfo = NULL; LTE_SecurityConfigHO_t *securityConfigHO = NULL; - //CellsToAddMod_t *CellToAdd = NULL; - //CellsToAddModList_t *CellsToAddModList = NULL; + LTE_CellsToAddMod_t *CellToAdd = NULL; + LTE_CellsToAddModList_t *CellsToAddModList = NULL; struct LTE_RRCConnectionReconfiguration_r8_IEs__dedicatedInfoNASList *dedicatedInfoNASList = NULL; LTE_DedicatedInfoNAS_t *dedicatedInfoNas = NULL; /* for no gcc warnings */ @@ -5297,7 +5344,7 @@ rrc_eNB_generate_HO_RRCConnectionReconfiguration(const protocol_ctxt_t *const ct MeasId5->measObjectId = 1; MeasId5->reportConfigId = 6; ASN_SEQUENCE_ADD(&MeasId_list->list, MeasId5); - // rrcConnectionReconfiguration->criticalExtensions.choice.c1.choice.rrcConnectionReconfiguration_r8.measConfig->measIdToAddModList = MeasId_list; + // LTE_RRCConnectionReconfiguration->criticalExtensions.choice.c1.choice.rrcConnectionReconfiguration_r8.measConfig->measIdToAddModList = MeasId_list; // Add one EUTRA Measurement Object MeasObj_list = CALLOC(1, sizeof(*MeasObj_list)); memset((void *)MeasObj_list, 0, sizeof(*MeasObj_list)); @@ -5317,19 +5364,9 @@ rrc_eNB_generate_HO_RRCConnectionReconfiguration(const protocol_ctxt_t *const ct MeasObj->measObject.choice.measObjectEUTRA.neighCellConfig.size = 1; MeasObj->measObject.choice.measObjectEUTRA.neighCellConfig.bits_unused = 6; MeasObj->measObject.choice.measObjectEUTRA.offsetFreq = NULL; // Default is 15 or 0dB - //MeasObj->measObject.choice.measObjectEUTRA.cellsToAddModList = - //(CellsToAddModList_t *) CALLOC(1, sizeof(*CellsToAddModList)); - //CellsToAddModList = MeasObj->measObject.choice.measObjectEUTRA.cellsToAddModList; - // Add adjacent cell lists (6 per eNB) - //for (i = 0; i < 6; i++) { - //CellToAdd = (CellsToAddMod_t *) CALLOC(1, sizeof(*CellToAdd)); - //CellToAdd->cellIndex = 1;//i + 1; - //CellToAdd->physCellId = 1;//get_adjacent_cell_id(ctxt_pP->module_id, i); - //CellToAdd->cellIndividualOffset = Q_OffsetRange_dB0; - //ASN_SEQUENCE_ADD(&CellsToAddModList->list, CellToAdd); - //} - ASN_SEQUENCE_ADD(&MeasObj_list->list, MeasObj); - // rrcConnectionReconfiguration->criticalExtensions.choice.c1.choice.rrcConnectionReconfiguration_r8.measConfig->measObjectToAddModList = MeasObj_list; + MeasObj->measObject.choice.measObjectEUTRA.cellsToAddModList = + (LTE_CellsToAddModList_t *) CALLOC(1, sizeof(*CellsToAddModList)); + CellsToAddModList = MeasObj->measObject.choice.measObjectEUTRA.cellsToAddModList; if (!ue_context_pP->ue_context.measurement_info) { ue_context_pP->ue_context.measurement_info = CALLOC(1,sizeof(*(ue_context_pP->ue_context.measurement_info))); @@ -5337,7 +5374,20 @@ rrc_eNB_generate_HO_RRCConnectionReconfiguration(const protocol_ctxt_t *const ct //TODO: Assign proper values ue_context_pP->ue_context.measurement_info->offsetFreq = 0; - ue_context_pP->ue_context.measurement_info->cellIndividualOffset = LTE_Q_OffsetRange_dB0; + ue_context_pP->ue_context.measurement_info->cellIndividualOffset[0] = 0; + + /* TODO: Extend to multiple carriers */ + // Add adjacent cell lists (max 6 per eNB) + for (i = 0; i < RC.rrc[ctxt_pP->module_id]->num_neigh_cells; i++) { + CellToAdd = (LTE_CellsToAddMod_t *) CALLOC(1, sizeof(*CellToAdd)); + CellToAdd->cellIndex = i + 1; + CellToAdd->physCellId = RC.rrc[ctxt_pP->module_id]->neigh_cells_id[i][0];//get_adjacent_cell_id(ctxt_pP->module_id, i); + CellToAdd->cellIndividualOffset = LTE_Q_OffsetRange_dB0; + ue_context_pP->ue_context.measurement_info->cellIndividualOffset[i+1] = CellToAdd->cellIndividualOffset; + ASN_SEQUENCE_ADD(&CellsToAddModList->list, CellToAdd); + } + ASN_SEQUENCE_ADD(&MeasObj_list->list, MeasObj); + // LTE_RRCConnectionReconfiguration->criticalExtensions.choice.c1.choice.rrcConnectionReconfiguration_r8.measConfig->measObjectToAddModList = MeasObj_list; if (!ue_context_pP->ue_context.measurement_info->events) { ue_context_pP->ue_context.measurement_info->events = CALLOC(1,sizeof(*(ue_context_pP->ue_context.measurement_info->events))); @@ -8291,6 +8341,14 @@ void *rrc_enb_process_itti_msg(void *notUsed) { rrc_eNB_process_S1AP_PATH_SWITCH_REQ_ACK(msg_p, msg_name_p, instance); break; + case X2AP_SETUP_REQ: + rrc_eNB_process_x2_setup_request(instance, &X2AP_SETUP_REQ(msg_p)); + break; + + case X2AP_SETUP_RESP: + rrc_eNB_process_x2_setup_response(instance, &X2AP_SETUP_RESP(msg_p)); + break; + case X2AP_HANDOVER_REQ: LOG_I(RRC, "[eNB %d] target eNB Receives X2 HO Req %s\n", instance, msg_name_p); rrc_eNB_process_handoverPreparationInformation(instance, &X2AP_HANDOVER_REQ(msg_p)); diff --git a/openair2/RRC/LTE/rrc_proto.h b/openair2/RRC/LTE/rrc_proto.h index 34439753d8f..5fc935c0ea0 100644 --- a/openair2/RRC/LTE/rrc_proto.h +++ b/openair2/RRC/LTE/rrc_proto.h @@ -357,6 +357,9 @@ void *rrc_enb_task(void *args_p); \param void *args_p Pointer on arguments to start the task. */ void *rrc_ue_task(void *args_p); +void rrc_eNB_process_x2_setup_request(int mod_id, x2ap_setup_req_t *m); + +void rrc_eNB_process_x2_setup_response(int mod_id, x2ap_setup_resp_t *m); void rrc_eNB_process_handoverPreparationInformation(int mod_id, x2ap_handover_req_t *m); diff --git a/openair2/X2AP/x2ap_eNB_handler.c b/openair2/X2AP/x2ap_eNB_handler.c index ad1cac04793..2a44501a337 100644 --- a/openair2/X2AP/x2ap_eNB_handler.c +++ b/openair2/X2AP/x2ap_eNB_handler.c @@ -291,6 +291,7 @@ x2ap_eNB_handle_x2_setup_request(instance_t instance, x2ap_eNB_instance_t *instance_p; x2ap_eNB_data_t *x2ap_eNB_data; + MessageDef *msg; uint32_t eNB_id = 0; DevAssert (pdu != NULL); @@ -391,17 +392,25 @@ x2ap_eNB_handle_x2_setup_request(instance_t instance, X2AP_ERROR("%s %d: ie is a NULL pointer \n",__FILE__,__LINE__); return -1; } + + msg = itti_alloc_new_message(TASK_X2AP, X2AP_SETUP_REQ); + + X2AP_SETUP_REQ(msg).num_cc = ie->value.choice.ServedCells.list.count; + if (ie->value.choice.ServedCells.list.count > 0) { x2ap_eNB_data->num_cc = ie->value.choice.ServedCells.list.count; for (int i=0; i<ie->value.choice.ServedCells.list.count;i++) { servedCellMember = (ServedCells__Member *)ie->value.choice.ServedCells.list.array[i]; x2ap_eNB_data->Nid_cell[i] = servedCellMember->servedCellInfo.pCI; + X2AP_SETUP_REQ(msg).Nid_cell[i] = x2ap_eNB_data->Nid_cell[i]; } } instance_p = x2ap_eNB_get_instance(instance); DevAssert(instance_p != NULL); + itti_send_msg_to_task(TASK_RRC_ENB, instance_p->instance, msg); + return x2ap_eNB_generate_x2_setup_response(instance_p, x2ap_eNB_data); } @@ -418,6 +427,7 @@ int x2ap_eNB_handle_x2_setup_response(instance_t instance, x2ap_eNB_instance_t *instance_p; x2ap_eNB_data_t *x2ap_eNB_data; + MessageDef *msg; uint32_t eNB_id = 0; DevAssert (pdu != NULL); @@ -500,11 +510,16 @@ int x2ap_eNB_handle_x2_setup_response(instance_t instance, return -1; } + msg = itti_alloc_new_message(TASK_X2AP, X2AP_SETUP_RESP); + + X2AP_SETUP_RESP(msg).num_cc = ie->value.choice.ServedCells.list.count; + if (ie->value.choice.ServedCells.list.count > 0) { x2ap_eNB_data->num_cc = ie->value.choice.ServedCells.list.count; for (int i=0; i<ie->value.choice.ServedCells.list.count;i++) { servedCellMember = (ServedCells__Member *)ie->value.choice.ServedCells.list.array[i]; x2ap_eNB_data->Nid_cell[i] = servedCellMember->servedCellInfo.pCI; + X2AP_SETUP_RESP(msg).Nid_cell[i] = x2ap_eNB_data->Nid_cell[i]; } } @@ -521,6 +536,8 @@ int x2ap_eNB_handle_x2_setup_response(instance_t instance, instance_p->x2_target_enb_associated_nb ++; x2ap_handle_x2_setup_message(instance_p, x2ap_eNB_data, 0); + itti_send_msg_to_task(TASK_RRC_ENB, instance_p->instance, msg); + return 0; } -- GitLab