From 0e6e84c3c0c2693350df38c61d98cbf6ce568460 Mon Sep 17 00:00:00 2001 From: Cedric Roux <cedric.roux@eurecom.fr> Date: Fri, 22 May 2015 07:53:10 +0000 Subject: [PATCH] carrier aggregation preparatory work: - mac_rrc_data_req/mac_rrc_data_ind API modification - ITTI message RRC_MAC_CCCH_DATA_IND updated - substructure "carrier" introduced in "eNB_rrc_inst" - ASN.1 messages SIB1/SIB23 adapted - handover not correctly handled (CC_id not used) git-svn-id: http://svn.eurecom.fr/openair4G/trunk@7456 818b1a75-f10b-46b9-bf7c-635c3b92a50f --- openair2/COMMON/mac_messages_types.h | 1 + openair2/LAYER2/MAC/eNB_scheduler_RA.c | 1 + openair2/LAYER2/MAC/eNB_scheduler_bch.c | 1 + openair2/LAYER2/MAC/eNB_scheduler_mch.c | 1 + openair2/LAYER2/MAC/eNB_scheduler_ulsch.c | 1 + openair2/LAYER2/MAC/ra_procedures.c | 1 + openair2/LAYER2/MAC/ue_procedures.c | 3 + .../L2_INTERFACE/openair_rrc_L2_interface.c | 4 + .../L2_INTERFACE/openair_rrc_L2_interface.h | 2 + openair2/RRC/LITE/L2_interface.c | 59 +-- openair2/RRC/LITE/MESSAGES/asn1_msg.c | 120 +++--- openair2/RRC/LITE/MESSAGES/asn1_msg.h | 4 +- openair2/RRC/LITE/defs.h | 10 +- openair2/RRC/LITE/proto.h | 8 +- openair2/RRC/LITE/rrc_UE.c | 1 + openair2/RRC/LITE/rrc_common.c | 22 +- openair2/RRC/LITE/rrc_eNB.c | 343 ++++++++++-------- 17 files changed, 330 insertions(+), 252 deletions(-) diff --git a/openair2/COMMON/mac_messages_types.h b/openair2/COMMON/mac_messages_types.h index cd9108f277e..9de402edb52 100644 --- a/openair2/COMMON/mac_messages_types.h +++ b/openair2/COMMON/mac_messages_types.h @@ -99,6 +99,7 @@ typedef struct RrcMacCcchDataInd_s { uint32_t sdu_size; uint8_t sdu[CCCH_SDU_SIZE]; uint8_t enb_index; + int CC_id; } RrcMacCcchDataInd; typedef struct RrcMacMcchDataReq_s { diff --git a/openair2/LAYER2/MAC/eNB_scheduler_RA.c b/openair2/LAYER2/MAC/eNB_scheduler_RA.c index 45d902657dd..1c8f316e4c7 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_RA.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_RA.c @@ -109,6 +109,7 @@ void schedule_RA(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP,un // Get RRCConnectionSetup for Piggyback rrc_sdu_length = mac_rrc_data_req(module_idP, + CC_id, frameP, CCCH, 1, // 1 transport block diff --git a/openair2/LAYER2/MAC/eNB_scheduler_bch.c b/openair2/LAYER2/MAC/eNB_scheduler_bch.c index 131e287cdbc..9adb5692bc4 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_bch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_bch.c @@ -93,6 +93,7 @@ schedule_SI( BCCH_alloc_pdu=(void*)&eNB->common_channels[CC_id].BCCH_alloc_pdu; bcch_sdu_length = mac_rrc_data_req(module_idP, + CC_id, frameP, BCCH,1, &eNB->common_channels[CC_id].BCCH_pdu.payload[0], diff --git a/openair2/LAYER2/MAC/eNB_scheduler_mch.c b/openair2/LAYER2/MAC/eNB_scheduler_mch.c index f7c3f3a83de..a9e9e9a1b8d 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_mch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_mch.c @@ -425,6 +425,7 @@ int schedule_MBMS(module_id_t module_idP, uint8_t CC_id, frame_t frameP, sub_fra module_idP,frameP, subframeP, i, j); mcch_sdu_length = mac_rrc_data_req(module_idP, + CC_id, frameP, MCCH,1, &eNB_mac_inst[module_idP].common_channels[CC_id].MCCH_pdu.payload[0], diff --git a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c index 5e9a32cbdc9..d86c5c5c4c9 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c @@ -225,6 +225,7 @@ void rx_sdu( if (Is_rrc_registered == 1) mac_rrc_data_ind( enb_mod_idP, + CC_idP, frameP, rntiP, CCCH, diff --git a/openair2/LAYER2/MAC/ra_procedures.c b/openair2/LAYER2/MAC/ra_procedures.c index 84c148033c1..9ea210a271f 100644 --- a/openair2/LAYER2/MAC/ra_procedures.c +++ b/openair2/LAYER2/MAC/ra_procedures.c @@ -294,6 +294,7 @@ PRACH_RESOURCES_t *ue_get_rach(module_id_t module_idP,int CC_id,frame_t frameP, printf("RA not active\n"); // check if RRC is ready to initiate the RA procedure Size = mac_rrc_data_req(module_idP, + CC_id, frameP, CCCH,1, &UE_mac_inst[module_idP].CCCH_pdu.payload[sizeof(SCH_SUBHEADER_SHORT)+1],0, diff --git a/openair2/LAYER2/MAC/ue_procedures.c b/openair2/LAYER2/MAC/ue_procedures.c index 6d307540929..053d78052ce 100644 --- a/openair2/LAYER2/MAC/ue_procedures.c +++ b/openair2/LAYER2/MAC/ue_procedures.c @@ -421,6 +421,7 @@ ue_send_sdu( LOG_T(MAC,"\n"); #endif mac_rrc_data_ind(module_idP, + CC_id, frameP, UE_mac_inst[module_idP].crnti, CCCH, @@ -498,6 +499,7 @@ void ue_decode_si(module_id_t module_idP,int CC_id,frame_t frameP, uint8_t eNB_i LOG_D(MAC,"[UE %d] Frame %d Sending SI to RRC (LCID Id %d,len %d)\n",module_idP,frameP,BCCH,len); mac_rrc_data_ind(module_idP, + CC_id, frameP, SI_RNTI, BCCH, @@ -590,6 +592,7 @@ void ue_send_mch_sdu(module_id_t module_idP, uint8_t CC_id, frame_t frameP, uint } else if (rx_lcids[i] == MCCH_LCHANID) { LOG_I(MAC,"[UE %d] Frame %d : SDU %d MCH->MCCH for sync area %d (eNB %d, %d bytes)\n",module_idP,frameP, i, sync_area, eNB_index, rx_lengths[i]); mac_rrc_data_ind(module_idP, + CC_id, frameP, M_RNTI, MCCH, diff --git a/openair2/RRC/L2_INTERFACE/openair_rrc_L2_interface.c b/openair2/RRC/L2_INTERFACE/openair_rrc_L2_interface.c index b22d059cd87..203dc436509 100644 --- a/openair2/RRC/L2_INTERFACE/openair_rrc_L2_interface.c +++ b/openair2/RRC/L2_INTERFACE/openair_rrc_L2_interface.c @@ -90,6 +90,7 @@ int8_t mac_rrc_data_req( const module_id_t module_idP, + const int CC_idP, const frame_t frameP, const rb_id_t srb_idP, const uint8_t nb_tbP, @@ -102,6 +103,7 @@ mac_rrc_data_req( { return(mac_rrc_lite_data_req( module_idP, + CC_idP, frameP, srb_idP, nb_tbP, @@ -116,6 +118,7 @@ mac_rrc_data_req( int8_t mac_rrc_data_ind( const module_id_t module_idP, + const int CC_idP, const frame_t frameP, const rnti_t rntiP, const rb_id_t srb_idP, @@ -129,6 +132,7 @@ mac_rrc_data_ind( { return(mac_rrc_lite_data_ind( module_idP, + CC_idP, frameP, rntiP, srb_idP, diff --git a/openair2/RRC/L2_INTERFACE/openair_rrc_L2_interface.h b/openair2/RRC/L2_INTERFACE/openair_rrc_L2_interface.h index 97a1a53849a..c7c4b02fe0e 100644 --- a/openair2/RRC/L2_INTERFACE/openair_rrc_L2_interface.h +++ b/openair2/RRC/L2_INTERFACE/openair_rrc_L2_interface.h @@ -44,6 +44,7 @@ int8_t mac_rrc_data_req( const module_id_t module_idP, + const int CC_idP, const frame_t frameP, const rb_id_t srb_idP, const uint8_t nb_tbP, @@ -56,6 +57,7 @@ mac_rrc_data_req( int8_t mac_rrc_data_ind( const module_id_t module_idP, + const int CC_idP, const frame_t frameP, const rnti_t rntiP, const rb_id_t srb_idP, diff --git a/openair2/RRC/LITE/L2_interface.c b/openair2/RRC/LITE/L2_interface.c index 4a1727104d8..5d21bfc02cb 100644 --- a/openair2/RRC/LITE/L2_interface.c +++ b/openair2/RRC/LITE/L2_interface.c @@ -69,6 +69,7 @@ mui_t mui=0; int8_t mac_rrc_lite_data_req( const module_id_t Mod_idP, + const int CC_id, const frame_t frameP, const rb_id_t Srb_id, const uint8_t Nb_tb, @@ -90,23 +91,25 @@ mac_rrc_lite_data_req( if( enb_flagP == ENB_FLAG_YES) { if((Srb_id & RAB_OFFSET) == BCCH) { - if(eNB_rrc_inst[Mod_idP].SI.Active==0) { + if(eNB_rrc_inst[Mod_idP].carrier[CC_id].SI.Active==0) { return 0; } // All even frames transmit SIB in SF 5 - if (eNB_rrc_inst[Mod_idP].sizeof_SIB1 == 255) { + if (eNB_rrc_inst[Mod_idP].carrier[CC_id].sizeof_SIB1 == 255) { LOG_E(RRC,"[eNB %d] MAC Request for SIB1 and SIB1 not initialized\n",Mod_idP); mac_xface->macphy_exit("mac_rrc_lite_data_req: MAC Request for SIB1 and SIB1 not initialized"); } if ((frameP%2) == 0) { - memcpy(&buffer_pP[0],eNB_rrc_inst[Mod_idP].SIB1,eNB_rrc_inst[Mod_idP].sizeof_SIB1); + memcpy(&buffer_pP[0], + eNB_rrc_inst[Mod_idP].carrier[CC_id].SIB1, + eNB_rrc_inst[Mod_idP].carrier[CC_id].sizeof_SIB1); #if defined(ENABLE_ITTI) { MessageDef *message_p; - int sib1_size = eNB_rrc_inst[Mod_idP].sizeof_SIB1; + int sib1_size = eNB_rrc_inst[Mod_idP].carrier[CC_id].sizeof_SIB1; int sdu_size = sizeof(RRC_MAC_BCCH_DATA_REQ (message_p).sdu); if (sib1_size > sdu_size) { @@ -118,7 +121,9 @@ mac_rrc_lite_data_req( RRC_MAC_BCCH_DATA_REQ (message_p).frame = frameP; RRC_MAC_BCCH_DATA_REQ (message_p).sdu_size = sib1_size; memset (RRC_MAC_BCCH_DATA_REQ (message_p).sdu, 0, BCCH_SDU_SIZE); - memcpy (RRC_MAC_BCCH_DATA_REQ (message_p).sdu, eNB_rrc_inst[Mod_idP].SIB1, sib1_size); + memcpy (RRC_MAC_BCCH_DATA_REQ (message_p).sdu, + eNB_rrc_inst[Mod_idP].carrier[CC_id].SIB1, + sib1_size); RRC_MAC_BCCH_DATA_REQ (message_p).enb_index = eNB_index; itti_send_msg_to_task (TASK_MAC_ENB, ENB_MODULE_ID_TO_INSTANCE(Mod_idP), message_p); @@ -128,22 +133,24 @@ mac_rrc_lite_data_req( #ifdef DEBUG_RRC LOG_T(RRC,"[eNB %d] Frame %d : BCCH request => SIB 1\n",Mod_idP,frameP); - for (i=0; i<eNB_rrc_inst[Mod_idP].sizeof_SIB1; i++) { + for (i=0; i<eNB_rrc_inst[Mod_idP].carrier[CC_id].sizeof_SIB1; i++) { LOG_T(RRC,"%x.",buffer_pP[i]); } LOG_T(RRC,"\n"); #endif - return (eNB_rrc_inst[Mod_idP].sizeof_SIB1); + return (eNB_rrc_inst[Mod_idP].carrier[CC_id].sizeof_SIB1); } // All RFN mod 8 transmit SIB2-3 in SF 5 else if ((frameP%8) == 1) { - memcpy(&buffer_pP[0],eNB_rrc_inst[Mod_idP].SIB23,eNB_rrc_inst[Mod_idP].sizeof_SIB23); + memcpy(&buffer_pP[0], + eNB_rrc_inst[Mod_idP].carrier[CC_id].SIB23, + eNB_rrc_inst[Mod_idP].carrier[CC_id].sizeof_SIB23); #if defined(ENABLE_ITTI) { MessageDef *message_p; - int sib23_size = eNB_rrc_inst[Mod_idP].sizeof_SIB23; + int sib23_size = eNB_rrc_inst[Mod_idP].carrier[CC_id].sizeof_SIB23; int sdu_size = sizeof(RRC_MAC_BCCH_DATA_REQ (message_p).sdu); if (sib23_size > sdu_size) { @@ -155,7 +162,9 @@ mac_rrc_lite_data_req( RRC_MAC_BCCH_DATA_REQ (message_p).frame = frameP; RRC_MAC_BCCH_DATA_REQ (message_p).sdu_size = sib23_size; memset (RRC_MAC_BCCH_DATA_REQ (message_p).sdu, 0, BCCH_SDU_SIZE); - memcpy (RRC_MAC_BCCH_DATA_REQ (message_p).sdu, eNB_rrc_inst[Mod_idP].SIB23, sib23_size); + memcpy (RRC_MAC_BCCH_DATA_REQ (message_p).sdu, + eNB_rrc_inst[Mod_idP].carrier[CC_id].SIB23, + sib23_size); RRC_MAC_BCCH_DATA_REQ (message_p).enb_index = eNB_index; itti_send_msg_to_task (TASK_MAC_ENB, ENB_MODULE_ID_TO_INSTANCE(Mod_idP), message_p); @@ -165,13 +174,13 @@ mac_rrc_lite_data_req( #ifdef DEBUG_RRC LOG_T(RRC,"[eNB %d] Frame %d BCCH request => SIB 2-3\n",Mod_idP,frameP); - for (i=0; i<eNB_rrc_inst[Mod_idP].sizeof_SIB23; i++) { + for (i=0; i<eNB_rrc_inst[Mod_idP].carrier[CC_id].sizeof_SIB23; i++) { LOG_T(RRC,"%x.",buffer_pP[i]); } LOG_T(RRC,"\n"); #endif - return(eNB_rrc_inst[Mod_idP].sizeof_SIB23); + return(eNB_rrc_inst[Mod_idP].carrier[CC_id].sizeof_SIB23); } else { return(0); } @@ -180,12 +189,12 @@ mac_rrc_lite_data_req( if( (Srb_id & RAB_OFFSET ) == CCCH) { LOG_T(RRC,"[eNB %d] Frame %d CCCH request (Srb_id %d)\n",Mod_idP,frameP, Srb_id); - if(eNB_rrc_inst[Mod_idP].Srb0.Active==0) { + if(eNB_rrc_inst[Mod_idP].carrier[CC_id].Srb0.Active==0) { LOG_E(RRC,"[eNB %d] CCCH Not active\n",Mod_idP); return -1; } - Srb_info=&eNB_rrc_inst[Mod_idP].Srb0; + Srb_info=&eNB_rrc_inst[Mod_idP].carrier[CC_id].Srb0; // check if data is there for MAC if(Srb_info->Tx_buffer.payload_size>0) { //Fill buffer @@ -224,7 +233,7 @@ mac_rrc_lite_data_req( #ifdef Rel10 if((Srb_id & RAB_OFFSET) == MCCH) { - if(eNB_rrc_inst[Mod_idP].MCCH_MESS[mbsfn_sync_area].Active==0) { + if(eNB_rrc_inst[Mod_idP].carrier[CC_id].MCCH_MESS[mbsfn_sync_area].Active==0) { return 0; // this parameter is set in function init_mcch in rrc_eNB.c } @@ -238,7 +247,7 @@ mac_rrc_lite_data_req( #if defined(ENABLE_ITTI) { MessageDef *message_p; - int mcch_size = eNB_rrc_inst[Mod_idP].sizeof_MCCH_MESSAGE[mbsfn_sync_area]; + int mcch_size = eNB_rrc_inst[Mod_idP].carrier[CC_id].sizeof_MCCH_MESSAGE[mbsfn_sync_area]; int sdu_size = sizeof(RRC_MAC_MCCH_DATA_REQ (message_p).sdu); if (mcch_size > sdu_size) { @@ -250,7 +259,9 @@ mac_rrc_lite_data_req( RRC_MAC_MCCH_DATA_REQ (message_p).frame = frameP; RRC_MAC_MCCH_DATA_REQ (message_p).sdu_size = mcch_size; memset (RRC_MAC_MCCH_DATA_REQ (message_p).sdu, 0, MCCH_SDU_SIZE); - memcpy (RRC_MAC_MCCH_DATA_REQ (message_p).sdu, eNB_rrc_inst[Mod_idP].MCCH_MESSAGE[mbsfn_sync_area], mcch_size); + memcpy (RRC_MAC_MCCH_DATA_REQ (message_p).sdu, + eNB_rrc_inst[Mod_idP].carrier[CC_id].MCCH_MESSAGE[mbsfn_sync_area], + mcch_size); RRC_MAC_MCCH_DATA_REQ (message_p).enb_index = eNB_index; RRC_MAC_MCCH_DATA_REQ (message_p).mbsfn_sync_area = mbsfn_sync_area; @@ -259,20 +270,20 @@ mac_rrc_lite_data_req( #endif memcpy(&buffer_pP[0], - eNB_rrc_inst[Mod_idP].MCCH_MESSAGE[mbsfn_sync_area], - eNB_rrc_inst[Mod_idP].sizeof_MCCH_MESSAGE[mbsfn_sync_area]); + eNB_rrc_inst[Mod_idP].carrier[CC_id].MCCH_MESSAGE[mbsfn_sync_area], + eNB_rrc_inst[Mod_idP].carrier[CC_id].sizeof_MCCH_MESSAGE[mbsfn_sync_area]); #ifdef DEBUG_RRC LOG_D(RRC,"[eNB %d] Frame %d : MCCH request => MCCH_MESSAGE \n",Mod_idP,frameP); - for (i=0; i<eNB_rrc_inst[Mod_idP].sizeof_MCCH_MESSAGE[mbsfn_sync_area]; i++) { + for (i=0; i<eNB_rrc_inst[Mod_idP].carrier[CC_id].sizeof_MCCH_MESSAGE[mbsfn_sync_area]; i++) { LOG_T(RRC,"%x.",buffer_pP[i]); } LOG_T(RRC,"\n"); #endif - return (eNB_rrc_inst[Mod_idP].sizeof_MCCH_MESSAGE[mbsfn_sync_area]); + return (eNB_rrc_inst[Mod_idP].carrier[CC_id].sizeof_MCCH_MESSAGE[mbsfn_sync_area]); // } //else //return(0); @@ -328,6 +339,7 @@ mac_rrc_lite_data_req( int8_t mac_rrc_lite_data_ind( const module_id_t module_idP, + const int CC_id, const frame_t frameP, const rnti_t rntiP, const rb_id_t srb_idP, @@ -446,7 +458,7 @@ mac_rrc_lite_data_ind( #endif // Rel10 } else { // This is an eNB - Srb_info = &eNB_rrc_inst[module_idP].Srb0; + Srb_info = &eNB_rrc_inst[module_idP].carrier[CC_id].Srb0; LOG_T(RRC,"[eNB %d] Received SDU for CCCH on SRB %d\n",module_idP,Srb_info->Srb_id); #if defined(ENABLE_ITTI) @@ -465,6 +477,7 @@ mac_rrc_lite_data_ind( RRC_MAC_CCCH_DATA_IND (message_p).frame = frameP; RRC_MAC_CCCH_DATA_IND (message_p).rnti = rntiP; RRC_MAC_CCCH_DATA_IND (message_p).sdu_size = sdu_size; + RRC_MAC_CCCH_DATA_IND (message_p).CC_id = CC_id; memset (RRC_MAC_CCCH_DATA_IND (message_p).sdu, 0, CCCH_SDU_SIZE); memcpy (RRC_MAC_CCCH_DATA_IND (message_p).sdu, sduP, sdu_size); itti_send_msg_to_task (TASK_RRC_ENB, ctxt.instance, message_p); @@ -475,7 +488,7 @@ mac_rrc_lite_data_ind( if (sdu_lenP > 0) { memcpy(Srb_info->Rx_buffer.Payload,sduP,sdu_lenP); Srb_info->Rx_buffer.payload_size = sdu_lenP; - rrc_eNB_decode_ccch(&ctxt,Srb_info); + rrc_eNB_decode_ccch(&ctxt, Srb_info, CC_id); } #endif diff --git a/openair2/RRC/LITE/MESSAGES/asn1_msg.c b/openair2/RRC/LITE/MESSAGES/asn1_msg.c index c76f028fb4f..45c4c4ff01b 100644 --- a/openair2/RRC/LITE/MESSAGES/asn1_msg.c +++ b/openair2/RRC/LITE/MESSAGES/asn1_msg.c @@ -407,7 +407,8 @@ uint8_t do_MIB(uint8_t Mod_id, LTE_DL_FRAME_PARMS *frame_parms, uint32_t frame, */ } -uint8_t do_SIB1(uint8_t Mod_id, LTE_DL_FRAME_PARMS *frame_parms, uint8_t *buffer, +uint8_t do_SIB1(uint8_t Mod_id, int CC_id, + LTE_DL_FRAME_PARMS *frame_parms, uint8_t *buffer, BCCH_DL_SCH_Message_t *bcch_message, SystemInformationBlockType1_t **sib1 #if defined(ENABLE_ITTI) @@ -533,7 +534,7 @@ uint8_t do_SIB1(uint8_t Mod_id, LTE_DL_FRAME_PARMS *frame_parms, uint8_t *buffer //*((*sib1)->p_Max) = 23; (*sib1)->freqBandIndicator = #if defined(ENABLE_ITTI) - configuration->eutra_band[0]; + configuration->eutra_band[CC_id]; #else 7; #endif @@ -549,21 +550,21 @@ uint8_t do_SIB1(uint8_t Mod_id, LTE_DL_FRAME_PARMS *frame_parms, uint8_t *buffer #if defined(ENABLE_ITTI) - if (configuration->frame_type[0] == TDD) + if (configuration->frame_type[CC_id] == TDD) #endif { (*sib1)->tdd_Config = CALLOC(1,sizeof(struct TDD_Config)); (*sib1)->tdd_Config->subframeAssignment = #if defined(ENABLE_ITTI) - configuration->tdd_config[0]; + configuration->tdd_config[CC_id]; #else frame_parms->tdd_config; #endif (*sib1)->tdd_Config->specialSubframePatterns = #if defined(ENABLE_ITTI) - configuration->tdd_config_s[0]; + configuration->tdd_config_s[CC_id]; #else frame_parms->tdd_config_S; #endif @@ -614,6 +615,7 @@ uint8_t do_SIB1(uint8_t Mod_id, LTE_DL_FRAME_PARMS *frame_parms, uint8_t *buffer } uint8_t do_SIB23(uint8_t Mod_id, + int CC_id, LTE_DL_FRAME_PARMS *frame_parms, uint8_t *buffer, BCCH_DL_SCH_Message_t *bcch_message, @@ -693,100 +695,100 @@ uint8_t do_SIB23(uint8_t Mod_id, #if defined(ENABLE_ITTI) - (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.preambleInfo.numberOfRA_Preambles = configuration->rach_numberOfRA_Preambles[0]; + (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.preambleInfo.numberOfRA_Preambles = configuration->rach_numberOfRA_Preambles[CC_id]; (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.preambleInfo.preamblesGroupAConfig = NULL; - if (configuration->rach_preamblesGroupAConfig[0]) { + if (configuration->rach_preamblesGroupAConfig[CC_id]) { (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.preambleInfo.preamblesGroupAConfig = CALLOC(1,sizeof(struct RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig)); (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.preambleInfo.preamblesGroupAConfig->sizeOfRA_PreamblesGroupA - = configuration->rach_sizeOfRA_PreamblesGroupA[0]; + = configuration->rach_sizeOfRA_PreamblesGroupA[CC_id]; (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.preambleInfo.preamblesGroupAConfig->messageSizeGroupA - = configuration->rach_messageSizeGroupA[0]; + = configuration->rach_messageSizeGroupA[CC_id]; (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.preambleInfo.preamblesGroupAConfig->messagePowerOffsetGroupB - = configuration->rach_messagePowerOffsetGroupB[0]; + = configuration->rach_messagePowerOffsetGroupB[CC_id]; } - (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.powerRampingParameters.powerRampingStep = configuration->rach_powerRampingStep[0]; + (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.powerRampingParameters.powerRampingStep = configuration->rach_powerRampingStep[CC_id]; (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.powerRampingParameters.preambleInitialReceivedTargetPower = - configuration->rach_preambleInitialReceivedTargetPower[0]; - (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.ra_SupervisionInfo.preambleTransMax = configuration->rach_preambleTransMax[0]; - (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.ra_SupervisionInfo.ra_ResponseWindowSize = configuration->rach_raResponseWindowSize[0]; + configuration->rach_preambleInitialReceivedTargetPower[CC_id]; + (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.ra_SupervisionInfo.preambleTransMax = configuration->rach_preambleTransMax[CC_id]; + (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.ra_SupervisionInfo.ra_ResponseWindowSize = configuration->rach_raResponseWindowSize[CC_id]; (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.ra_SupervisionInfo.mac_ContentionResolutionTimer = - configuration->rach_macContentionResolutionTimer[0]; - (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.maxHARQ_Msg3Tx = configuration->rach_maxHARQ_Msg3Tx[0]; + configuration->rach_macContentionResolutionTimer[CC_id]; + (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.maxHARQ_Msg3Tx = configuration->rach_maxHARQ_Msg3Tx[CC_id]; // BCCH-Config (*sib2)->radioResourceConfigCommon.bcch_Config.modificationPeriodCoeff - = configuration->bcch_modificationPeriodCoeff[0]; + = configuration->bcch_modificationPeriodCoeff[CC_id]; // PCCH-Config (*sib2)->radioResourceConfigCommon.pcch_Config.defaultPagingCycle - = configuration->pcch_defaultPagingCycle[0]; + = configuration->pcch_defaultPagingCycle[CC_id]; (*sib2)->radioResourceConfigCommon.pcch_Config.nB - = configuration->pcch_nB[0]; + = configuration->pcch_nB[CC_id]; // PRACH-Config (*sib2)->radioResourceConfigCommon.prach_Config.rootSequenceIndex - = configuration->prach_root[0]; + = configuration->prach_root[CC_id]; (*sib2)->radioResourceConfigCommon.prach_Config.prach_ConfigInfo.prach_ConfigIndex - = configuration->prach_config_index[0]; + = configuration->prach_config_index[CC_id]; (*sib2)->radioResourceConfigCommon.prach_Config.prach_ConfigInfo.highSpeedFlag - = configuration->prach_high_speed[0]; + = configuration->prach_high_speed[CC_id]; (*sib2)->radioResourceConfigCommon.prach_Config.prach_ConfigInfo.zeroCorrelationZoneConfig - = configuration->prach_zero_correlation[0]; + = configuration->prach_zero_correlation[CC_id]; (*sib2)->radioResourceConfigCommon.prach_Config.prach_ConfigInfo.prach_FreqOffset - = configuration->prach_freq_offset[0]; + = configuration->prach_freq_offset[CC_id]; // PDSCH-Config (*sib2)->radioResourceConfigCommon.pdsch_ConfigCommon.referenceSignalPower - = configuration->pdsch_referenceSignalPower[0]; + = configuration->pdsch_referenceSignalPower[CC_id]; (*sib2)->radioResourceConfigCommon.pdsch_ConfigCommon.p_b - = configuration->pdsch_p_b[0]; + = configuration->pdsch_p_b[CC_id]; // PUSCH-Config (*sib2)->radioResourceConfigCommon.pusch_ConfigCommon.pusch_ConfigBasic.n_SB - = configuration->pusch_n_SB[0]; + = configuration->pusch_n_SB[CC_id]; (*sib2)->radioResourceConfigCommon.pusch_ConfigCommon.pusch_ConfigBasic.hoppingMode - = configuration->pusch_hoppingMode[0]; + = configuration->pusch_hoppingMode[CC_id]; (*sib2)->radioResourceConfigCommon.pusch_ConfigCommon.pusch_ConfigBasic.pusch_HoppingOffset - = configuration->pusch_hoppingOffset[0]; + = configuration->pusch_hoppingOffset[CC_id]; (*sib2)->radioResourceConfigCommon.pusch_ConfigCommon.pusch_ConfigBasic.enable64QAM - = configuration->pusch_enable64QAM[0]; + = configuration->pusch_enable64QAM[CC_id]; (*sib2)->radioResourceConfigCommon.pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupHoppingEnabled - = configuration->pusch_groupHoppingEnabled[0]; + = configuration->pusch_groupHoppingEnabled[CC_id]; (*sib2)->radioResourceConfigCommon.pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH - = configuration->pusch_groupAssignment[0]; + = configuration->pusch_groupAssignment[CC_id]; (*sib2)->radioResourceConfigCommon.pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled - = configuration->pusch_sequenceHoppingEnabled[0]; + = configuration->pusch_sequenceHoppingEnabled[CC_id]; (*sib2)->radioResourceConfigCommon.pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.cyclicShift - = configuration->pusch_nDMRS1[0]; + = configuration->pusch_nDMRS1[CC_id]; // PUCCH-Config (*sib2)->radioResourceConfigCommon.pucch_ConfigCommon.deltaPUCCH_Shift - = configuration->pucch_delta_shift[0]; + = configuration->pucch_delta_shift[CC_id]; (*sib2)->radioResourceConfigCommon.pucch_ConfigCommon.nRB_CQI - = configuration->pucch_nRB_CQI[0]; + = configuration->pucch_nRB_CQI[CC_id]; (*sib2)->radioResourceConfigCommon.pucch_ConfigCommon.nCS_AN - = configuration->pucch_nCS_AN[0]; + = configuration->pucch_nCS_AN[CC_id]; #ifndef Rel10 (*sib2)->radioResourceConfigCommon.pucch_ConfigCommon.n1PUCCH_AN - = configuration->pucch_n1_AN[0]; + = configuration->pucch_n1_AN[CC_id]; #endif // SRS Config - if (configuration->srs_enable[0]) { + if (configuration->srs_enable[CC_id]) { (*sib2)->radioResourceConfigCommon.soundingRS_UL_ConfigCommon.present = SoundingRS_UL_ConfigCommon_PR_setup; (*sib2)->radioResourceConfigCommon.soundingRS_UL_ConfigCommon.choice.setup.srs_BandwidthConfig - = configuration->srs_BandwidthConfig[0]; + = configuration->srs_BandwidthConfig[CC_id]; (*sib2)->radioResourceConfigCommon.soundingRS_UL_ConfigCommon.choice.setup.srs_SubframeConfig - = configuration->srs_SubframeConfig[0]; + = configuration->srs_SubframeConfig[CC_id]; (*sib2)->radioResourceConfigCommon.soundingRS_UL_ConfigCommon.choice.setup.ackNackSRS_SimultaneousTransmission - = configuration->srs_ackNackST[0]; + = configuration->srs_ackNackST[CC_id]; - if (configuration->srs_MaxUpPts[0]) { + if (configuration->srs_MaxUpPts[CC_id]) { (*sib2)->radioResourceConfigCommon.soundingRS_UL_ConfigCommon.choice.setup.srs_MaxUpPts = CALLOC(1,sizeof(long)); *(*sib2)->radioResourceConfigCommon.soundingRS_UL_ConfigCommon.choice.setup.srs_MaxUpPts=1; @@ -801,40 +803,40 @@ uint8_t do_SIB23(uint8_t Mod_id, // uplinkPowerControlCommon (*sib2)->radioResourceConfigCommon.uplinkPowerControlCommon.p0_NominalPUSCH - = configuration->pusch_p0_Nominal[0]; + = configuration->pusch_p0_Nominal[CC_id]; (*sib2)->radioResourceConfigCommon.uplinkPowerControlCommon.p0_NominalPUCCH - = configuration->pucch_p0_Nominal[0]; + = configuration->pucch_p0_Nominal[CC_id]; (*sib2)->radioResourceConfigCommon.uplinkPowerControlCommon.alpha - = configuration->pusch_alpha[0]; + = configuration->pusch_alpha[CC_id]; (*sib2)->radioResourceConfigCommon.uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format1 - = configuration->pucch_deltaF_Format1[0]; + = configuration->pucch_deltaF_Format1[CC_id]; (*sib2)->radioResourceConfigCommon.uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format1b - = configuration->pucch_deltaF_Format1b[0]; + = configuration->pucch_deltaF_Format1b[CC_id]; (*sib2)->radioResourceConfigCommon.uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format2 - = configuration->pucch_deltaF_Format2[0]; + = configuration->pucch_deltaF_Format2[CC_id]; (*sib2)->radioResourceConfigCommon.uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format2a - = configuration->pucch_deltaF_Format2a[0]; + = configuration->pucch_deltaF_Format2a[CC_id]; (*sib2)->radioResourceConfigCommon.uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format2b - = configuration->pucch_deltaF_Format2b[0]; + = configuration->pucch_deltaF_Format2b[CC_id]; (*sib2)->radioResourceConfigCommon.uplinkPowerControlCommon.deltaPreambleMsg3 - = configuration->msg3_delta_Preamble[0]; + = configuration->msg3_delta_Preamble[CC_id]; (*sib2)->radioResourceConfigCommon.ul_CyclicPrefixLength - = configuration->ul_CyclicPrefixLength[0]; + = configuration->ul_CyclicPrefixLength[CC_id]; // UE Timers and Constants (*sib2)->ue_TimersAndConstants.t300 - = configuration->ue_TimersAndConstants_t300[0]; + = configuration->ue_TimersAndConstants_t300[CC_id]; (*sib2)->ue_TimersAndConstants.t301 - = configuration->ue_TimersAndConstants_t301[0]; + = configuration->ue_TimersAndConstants_t301[CC_id]; (*sib2)->ue_TimersAndConstants.t310 - = configuration->ue_TimersAndConstants_t310[0]; + = configuration->ue_TimersAndConstants_t310[CC_id]; (*sib2)->ue_TimersAndConstants.n310 - = configuration->ue_TimersAndConstants_n310[0]; + = configuration->ue_TimersAndConstants_n310[CC_id]; (*sib2)->ue_TimersAndConstants.t311 - = configuration->ue_TimersAndConstants_t311[0]; + = configuration->ue_TimersAndConstants_t311[CC_id]; (*sib2)->ue_TimersAndConstants.n311 - = configuration->ue_TimersAndConstants_n311[0]; + = configuration->ue_TimersAndConstants_n311[CC_id]; #else (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.preambleInfo.numberOfRA_Preambles=RACH_ConfigCommon__preambleInfo__numberOfRA_Preambles_n64; diff --git a/openair2/RRC/LITE/MESSAGES/asn1_msg.h b/openair2/RRC/LITE/MESSAGES/asn1_msg.h index 3279a472fe7..250712948a0 100644 --- a/openair2/RRC/LITE/MESSAGES/asn1_msg.h +++ b/openair2/RRC/LITE/MESSAGES/asn1_msg.h @@ -74,7 +74,8 @@ uint8_t get_adjacent_cell_mod_id(uint16_t phyCellId); @param sib1 Pointer to asn1c C representation of SIB1 @return size of encoded bit stream in bytes*/ -uint8_t do_SIB1(uint8_t Mod_id, LTE_DL_FRAME_PARMS *frame_parms, uint8_t *buffer, +uint8_t do_SIB1(uint8_t Mod_id, int CC_id, + LTE_DL_FRAME_PARMS *frame_parms, uint8_t *buffer, BCCH_DL_SCH_Message_t *bcch_message, SystemInformationBlockType1_t **sib1 #if defined(ENABLE_ITTI) @@ -94,6 +95,7 @@ uint8_t do_SIB1(uint8_t Mod_id, LTE_DL_FRAME_PARMS *frame_parms, uint8_t *buffer @return size of encoded bit stream in bytes*/ uint8_t do_SIB23(uint8_t Mod_id, + int CC_id, LTE_DL_FRAME_PARMS *frame_parms, uint8_t *buffer, BCCH_DL_SCH_Message_t *systemInformation, diff --git a/openair2/RRC/LITE/defs.h b/openair2/RRC/LITE/defs.h index bc09e1107ee..850f18115fc 100644 --- a/openair2/RRC/LITE/defs.h +++ b/openair2/RRC/LITE/defs.h @@ -377,7 +377,7 @@ typedef struct rrc_eNB_ue_context_s { struct eNB_RRC_UE_s ue_context; } rrc_eNB_ue_context_t; -typedef struct eNB_RRC_INST_s { +typedef struct { uint8_t *SIB1; uint8_t sizeof_SIB1; uint8_t *SIB23; @@ -404,11 +404,15 @@ typedef struct eNB_RRC_INST_s { uint8_t num_active_cba_groups; uint16_t cba_rnti[NUM_MAX_CBA_GROUP]; #endif + SRB_INFO SI; + SRB_INFO Srb0; +} rcc_eNB_carrier_data_t; + +typedef struct eNB_RRC_INST_s { + rcc_eNB_carrier_data_t carrier[MAX_NUM_CCs]; uid_allocator_t uid_allocator; // for rrc_ue_head RB_HEAD(rrc_ue_tree_s, rrc_eNB_ue_context_s) rrc_ue_head; // ue_context tree key search by rnti RB_HEAD(rrc_rnti_tree_s, rrc_ue_s1ap_ids_s) rrc_rnti_head; // ue-rnti tree key search by S1AP ids - SRB_INFO SI; - SRB_INFO Srb0; uint8_t HO_flag; uint8_t Nb_ue; #if defined(ENABLE_RAL) diff --git a/openair2/RRC/LITE/proto.h b/openair2/RRC/LITE/proto.h index 46ca4fdf750..c87df0fa4ce 100644 --- a/openair2/RRC/LITE/proto.h +++ b/openair2/RRC/LITE/proto.h @@ -207,7 +207,8 @@ uint8_t rrc_eNB_get_next_transaction_identifier(module_id_t module_idP); int rrc_eNB_decode_ccch( protocol_ctxt_t* const ctxt_pP, - const SRB_INFO* const Srb_info + const SRB_INFO* const Srb_info, + const int CC_id ); /**\brief Entry routine to decode a UL-DCCH-Message. Invokes PER decoder and parses message. @@ -228,7 +229,8 @@ rrc_eNB_decode_dcch( void rrc_eNB_generate_RRCConnectionSetup( const protocol_ctxt_t* const ctxt_pP, - rrc_eNB_ue_context_t* const ue_context_pP + rrc_eNB_ue_context_t* const ue_context_pP, + const int CC_id ); /**\brief Process the RRCConnectionSetupComplete based on information coming from UE @@ -295,6 +297,7 @@ rrc_eNB_generate_RRCConnectionReconfiguration_handover( int8_t mac_rrc_lite_data_req( const module_id_t Mod_idP, + const int CC_id, const frame_t frameP, const rb_id_t Srb_id, const uint8_t Nb_tb, @@ -307,6 +310,7 @@ mac_rrc_lite_data_req( int8_t mac_rrc_lite_data_ind( const module_id_t module_idP, + const int CC_id, const frame_t frameP, const rnti_t rntiP, const rb_id_t srb_idP, diff --git a/openair2/RRC/LITE/rrc_UE.c b/openair2/RRC/LITE/rrc_UE.c index a2c6d0cdc0a..47343cdbafc 100644 --- a/openair2/RRC/LITE/rrc_UE.c +++ b/openair2/RRC/LITE/rrc_UE.c @@ -3482,6 +3482,7 @@ void /* PDCP messages */ case RRC_DCCH_DATA_IND: +//RRC_DCCH_DATA_IND (msg_p).eNB_index=0; PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, RRC_DCCH_DATA_IND (msg_p).module_id, ENB_FLAG_NO, RRC_DCCH_DATA_IND (msg_p).rnti, RRC_DCCH_DATA_IND (msg_p).frame, 0,RRC_DCCH_DATA_IND (msg_p).eNB_index); LOG_I(RRC, "[UE %d] Received %s: frameP %d, DCCH %d, eNB %d\n", RRC_DCCH_DATA_IND (msg_p).module_id, diff --git a/openair2/RRC/LITE/rrc_common.c b/openair2/RRC/LITE/rrc_common.c index aa1155c6831..bf86d9024ee 100644 --- a/openair2/RRC/LITE/rrc_common.c +++ b/openair2/RRC/LITE/rrc_common.c @@ -68,15 +68,17 @@ openair_rrc_on( //----------------------------------------------------------------------------- { unsigned short i; + int CC_id; if (ctxt_pP->enb_flag == ENB_FLAG_YES) { LOG_I(RRC, PROTOCOL_RRC_CTXT_FMT" OPENAIR RRC IN....\n", PROTOCOL_RRC_CTXT_ARGS(ctxt_pP)); - rrc_config_buffer (&eNB_rrc_inst[ctxt_pP->module_id].SI, BCCH, 1); - eNB_rrc_inst[ctxt_pP->module_id].SI.Active = 1; - rrc_config_buffer (&eNB_rrc_inst[ctxt_pP->module_id].Srb0, CCCH, 1); - eNB_rrc_inst[ctxt_pP->module_id].Srb0.Active = 1; - + for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { + rrc_config_buffer (&eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].SI, BCCH, 1); + eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].SI.Active = 1; + rrc_config_buffer (&eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].Srb0, CCCH, 1); + eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].Srb0.Active = 1; + } } else { LOG_I(RRC, PROTOCOL_RRC_CTXT_FMT" OPENAIR RRC IN....\n", PROTOCOL_RRC_CTXT_ARGS(ctxt_pP)); @@ -249,7 +251,7 @@ openair_rrc_top_init( module_id_t module_id; OAI_UECapability_t *UECap = NULL; - // uint8_t dummy_buffer[100]; + int CC_id; LOG_D(RRC, "[OPENAIR][INIT] Init function start: NB_UE_INST=%d, NB_eNB_INST=%d\n", NB_UE_INST, NB_eNB_INST); @@ -292,14 +294,18 @@ openair_rrc_top_init( LOG_I(RRC,"[eNB] eMBMS active state is %d \n", eMBMS_active); for (module_id=0; module_id<NB_eNB_INST; module_id++) { - eNB_rrc_inst[module_id].MBMS_flag = (uint8_t)eMBMS_active; + for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { + eNB_rrc_inst[module_id].carrier[CC_id].MBMS_flag = (uint8_t)eMBMS_active; + } } #endif #ifdef CBA for (module_id=0; module_id<NB_eNB_INST; module_id++) { - eNB_rrc_inst[module_id].num_active_cba_groups = cba_group_active; + for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { + eNB_rrc_inst[module_id].carrier[CC_id].num_active_cba_groups = cba_group_active; + } } #endif diff --git a/openair2/RRC/LITE/rrc_eNB.c b/openair2/RRC/LITE/rrc_eNB.c index dca36b8bac3..cd0661dcdde 100644 --- a/openair2/RRC/LITE/rrc_eNB.c +++ b/openair2/RRC/LITE/rrc_eNB.c @@ -120,7 +120,8 @@ mui_t rrc_eNB_mui = 0; //----------------------------------------------------------------------------- static void init_SI( - const protocol_ctxt_t* const ctxt_pP + const protocol_ctxt_t* const ctxt_pP, + const int CC_id #if defined(ENABLE_ITTI) , RrcConfigurationReq * configuration @@ -178,9 +179,9 @@ init_SI( exit(-1); */ - eNB_rrc_inst[ctxt_pP->module_id].sizeof_SIB1 = 0; - eNB_rrc_inst[ctxt_pP->module_id].sizeof_SIB23 = 0; - eNB_rrc_inst[ctxt_pP->module_id].SIB1 = (uint8_t*) malloc16(32); + eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sizeof_SIB1 = 0; + eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sizeof_SIB23 = 0; + eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].SIB1 = (uint8_t*) malloc16(32); /* printf ("before SIB1 init : Nid_cell %d\n", mac_xface->lte_frame_parms->Nid_cell); @@ -189,13 +190,14 @@ init_SI( mac_xface->lte_frame_parms->tdd_config); */ - if (eNB_rrc_inst[ctxt_pP->module_id].SIB1) - eNB_rrc_inst[ctxt_pP->module_id].sizeof_SIB1 = do_SIB1( + if (eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].SIB1) + eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sizeof_SIB1 = do_SIB1( ctxt_pP->module_id, + CC_id, mac_xface->lte_frame_parms, - (uint8_t*)eNB_rrc_inst[ctxt_pP->module_id].SIB1, - &eNB_rrc_inst[ctxt_pP->module_id].siblock1, - &eNB_rrc_inst[ctxt_pP->module_id].sib1 + (uint8_t*)eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].SIB1, + &eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].siblock1, + &eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sib1 #if defined(ENABLE_ITTI) , configuration #endif @@ -212,23 +214,24 @@ init_SI( mac_xface->lte_frame_parms->frame_type, mac_xface->lte_frame_parms->tdd_config); */ - if (eNB_rrc_inst[ctxt_pP->module_id].sizeof_SIB1 == 255) { - mac_xface->macphy_exit("[RRC][init_SI] FATAL, eNB_rrc_inst[enb_mod_idP].sizeof_SIB1 == 255"); + if (eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sizeof_SIB1 == 255) { + mac_xface->macphy_exit("[RRC][init_SI] FATAL, eNB_rrc_inst[enb_mod_idP].carrier[CC_id].sizeof_SIB1 == 255"); } - eNB_rrc_inst[ctxt_pP->module_id].SIB23 = (uint8_t*) malloc16(64); + eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].SIB23 = (uint8_t*) malloc16(64); - if (eNB_rrc_inst[ctxt_pP->module_id].SIB23) { - eNB_rrc_inst[ctxt_pP->module_id].sizeof_SIB23 = do_SIB23( + if (eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].SIB23) { + eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sizeof_SIB23 = do_SIB23( ctxt_pP->module_id, + CC_id, mac_xface->lte_frame_parms, - eNB_rrc_inst[ctxt_pP->module_id].SIB23, - &eNB_rrc_inst[ctxt_pP->module_id].systemInformation, - &eNB_rrc_inst[ctxt_pP->module_id].sib2, - &eNB_rrc_inst[ctxt_pP->module_id].sib3 + eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].SIB23, + &eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].systemInformation, + &eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sib2, + &eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sib3 #ifdef Rel10 - , &eNB_rrc_inst[ctxt_pP->module_id].sib13, - eNB_rrc_inst[ctxt_pP->module_id].MBMS_flag + , &eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sib13, + eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].MBMS_flag #endif #if defined(ENABLE_ITTI) , configuration @@ -245,73 +248,78 @@ init_SI( #endif ); */ - if (eNB_rrc_inst[ctxt_pP->module_id].sizeof_SIB23 == 255) { - mac_xface->macphy_exit("[RRC][init_SI] FATAL, eNB_rrc_inst[mod].sizeof_SIB23 == 255"); + if (eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sizeof_SIB23 == 255) { + mac_xface->macphy_exit("[RRC][init_SI] FATAL, eNB_rrc_inst[mod].carrier[CC_id].sizeof_SIB23 == 255"); } LOG_T(RRC, PROTOCOL_RRC_CTXT_FMT" SIB2/3 Contents (partial)\n", PROTOCOL_RRC_CTXT_ARGS(ctxt_pP)); LOG_T(RRC, PROTOCOL_RRC_CTXT_FMT" pusch_config_common.n_SB = %ld\n", PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), - eNB_rrc_inst[ctxt_pP->module_id].sib2->radioResourceConfigCommon.pusch_ConfigCommon.pusch_ConfigBasic.n_SB); + eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sib2->radioResourceConfigCommon.pusch_ConfigCommon. + pusch_ConfigBasic.n_SB); LOG_T(RRC, PROTOCOL_RRC_CTXT_FMT" pusch_config_common.hoppingMode = %ld\n", PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), - eNB_rrc_inst[ctxt_pP->module_id].sib2->radioResourceConfigCommon.pusch_ConfigCommon.pusch_ConfigBasic.hoppingMode); + eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sib2->radioResourceConfigCommon.pusch_ConfigCommon. + pusch_ConfigBasic.hoppingMode); LOG_T(RRC, PROTOCOL_RRC_CTXT_FMT" pusch_config_common.pusch_HoppingOffset = %ld\n", PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), - eNB_rrc_inst[ctxt_pP->module_id].sib2->radioResourceConfigCommon.pusch_ConfigCommon. + eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sib2->radioResourceConfigCommon.pusch_ConfigCommon. pusch_ConfigBasic.pusch_HoppingOffset); LOG_T(RRC, PROTOCOL_RRC_CTXT_FMT" pusch_config_common.enable64QAM = %d\n", PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), - (int)eNB_rrc_inst[ctxt_pP->module_id].sib2->radioResourceConfigCommon.pusch_ConfigCommon. + (int)eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sib2->radioResourceConfigCommon.pusch_ConfigCommon. pusch_ConfigBasic.enable64QAM); LOG_T(RRC, PROTOCOL_RRC_CTXT_FMT" pusch_config_common.groupHoppingEnabled = %d\n", PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), - (int)eNB_rrc_inst[ctxt_pP->module_id].sib2->radioResourceConfigCommon.pusch_ConfigCommon. + (int)eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sib2->radioResourceConfigCommon.pusch_ConfigCommon. ul_ReferenceSignalsPUSCH.groupHoppingEnabled); LOG_T(RRC, PROTOCOL_RRC_CTXT_FMT" pusch_config_common.groupAssignmentPUSCH = %ld\n", PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), - eNB_rrc_inst[ctxt_pP->module_id].sib2->radioResourceConfigCommon.pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH); + eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sib2->radioResourceConfigCommon.pusch_ConfigCommon. + ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH); LOG_T(RRC, PROTOCOL_RRC_CTXT_FMT" pusch_config_common.sequenceHoppingEnabled = %d\n", PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), - (int)eNB_rrc_inst[ctxt_pP->module_id].sib2->radioResourceConfigCommon.pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled); + (int)eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sib2->radioResourceConfigCommon.pusch_ConfigCommon. + ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled); LOG_T(RRC, PROTOCOL_RRC_CTXT_FMT" pusch_config_common.cyclicShift = %ld\n", PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), - eNB_rrc_inst[ctxt_pP->module_id].sib2->radioResourceConfigCommon.pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.cyclicShift); + eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sib2->radioResourceConfigCommon.pusch_ConfigCommon. + ul_ReferenceSignalsPUSCH.cyclicShift); #ifdef Rel10 - if (eNB_rrc_inst[ctxt_pP->module_id].MBMS_flag > 0) { - for (i = 0; i < eNB_rrc_inst[ctxt_pP->module_id].sib2->mbsfn_SubframeConfigList->list.count; i++) { + if (eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].MBMS_flag > 0) { + for (i = 0; i < eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sib2->mbsfn_SubframeConfigList->list.count; i++) { // SIB 2 // LOG_D(RRC, "[eNB %d] mbsfn_SubframeConfigList.list.count = %ld\n", enb_mod_idP, eNB_rrc_inst[enb_mod_idP].sib2->mbsfn_SubframeConfigList->list.count); LOG_D(RRC, PROTOCOL_RRC_CTXT_FMT" SIB13 contents for MBSFN subframe allocation %d/%d(partial)\n", PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), i, - eNB_rrc_inst[ctxt_pP->module_id].sib2->mbsfn_SubframeConfigList->list.count); + eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sib2->mbsfn_SubframeConfigList->list.count); LOG_D(RRC, PROTOCOL_RRC_CTXT_FMT" mbsfn_Subframe_pattern is = %x\n", PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), - eNB_rrc_inst[ctxt_pP->module_id].sib2->mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[0] >> 0); + eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sib2->mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[0] >> 0); LOG_D(RRC, PROTOCOL_RRC_CTXT_FMT" radioframe_allocation_period = %ld (just index number, not the real value)\n", PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), - eNB_rrc_inst[ctxt_pP->module_id].sib2->mbsfn_SubframeConfigList->list.array[i]->radioframeAllocationPeriod); // need to display the real value, using array of char (like in dumping SIB2) + eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sib2->mbsfn_SubframeConfigList->list.array[i]->radioframeAllocationPeriod); // need to display the real value, using array of char (like in dumping SIB2) LOG_D(RRC, PROTOCOL_RRC_CTXT_FMT" radioframe_allocation_offset = %ld\n", PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), - eNB_rrc_inst[ctxt_pP->module_id].sib2->mbsfn_SubframeConfigList->list.array[i]->radioframeAllocationOffset); + eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sib2->mbsfn_SubframeConfigList->list.array[i]->radioframeAllocationOffset); } // SIB13 - for (i = 0; i < eNB_rrc_inst[ctxt_pP->module_id].sib13->mbsfn_AreaInfoList_r9.list.count; i++) { + for (i = 0; i < eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sib13->mbsfn_AreaInfoList_r9.list.count; i++) { LOG_D(RRC, PROTOCOL_RRC_CTXT_FMT" SIB13 contents for MBSFN sync area %d/2 (partial)\n", PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), i, - eNB_rrc_inst[ctxt_pP->module_id].sib13->mbsfn_AreaInfoList_r9.list.count); + eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sib13->mbsfn_AreaInfoList_r9.list.count); LOG_D(RRC, PROTOCOL_RRC_CTXT_FMT" MCCH Repetition Period: %d (just index number, not real value)\n", PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), - eNB_rrc_inst[ctxt_pP->module_id].sib13->mbsfn_AreaInfoList_r9.list.array[i]->mcch_Config_r9.mcch_RepetitionPeriod_r9); + eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sib13->mbsfn_AreaInfoList_r9.list.array[i]->mcch_Config_r9.mcch_RepetitionPeriod_r9); LOG_D(RRC, PROTOCOL_RRC_CTXT_FMT" MCCH Offset: %d\n", PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), - eNB_rrc_inst[ctxt_pP->module_id].sib13->mbsfn_AreaInfoList_r9.list.array[i]->mcch_Config_r9.mcch_Offset_r9); + eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sib13->mbsfn_AreaInfoList_r9.list.array[i]->mcch_Config_r9.mcch_Offset_r9); } } @@ -322,7 +330,7 @@ init_SI( PROTOCOL_RRC_CTXT_ARGS(ctxt_pP)); rrc_mac_config_req(ctxt_pP->module_id, ENB_FLAG_YES, 0, 0, (RadioResourceConfigCommonSIB_t *) & - eNB_rrc_inst[ctxt_pP->module_id].sib2->radioResourceConfigCommon, + eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sib2->radioResourceConfigCommon, (struct PhysicalConfigDedicated *)NULL, #ifdef Rel10 (SCellToAddMod_r10_t *)NULL, @@ -332,17 +340,17 @@ init_SI( (MAC_MainConfig_t *) NULL, 0, (struct LogicalChannelConfig *)NULL, (MeasGapConfig_t *) NULL, - eNB_rrc_inst[ctxt_pP->module_id].sib1->tdd_Config, + eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sib1->tdd_Config, NULL, &SIwindowsize, &SIperiod, - eNB_rrc_inst[ctxt_pP->module_id].sib2->freqInfo.ul_CarrierFreq, - eNB_rrc_inst[ctxt_pP->module_id].sib2->freqInfo.ul_Bandwidth, - &eNB_rrc_inst[ctxt_pP->module_id].sib2->freqInfo.additionalSpectrumEmission, - (MBSFN_SubframeConfigList_t*) eNB_rrc_inst[ctxt_pP->module_id].sib2->mbsfn_SubframeConfigList + eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sib2->freqInfo.ul_CarrierFreq, + eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sib2->freqInfo.ul_Bandwidth, + &eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sib2->freqInfo.additionalSpectrumEmission, + (MBSFN_SubframeConfigList_t*) eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sib2->mbsfn_SubframeConfigList #ifdef Rel10 , - eNB_rrc_inst[ctxt_pP->module_id].MBMS_flag, - (MBSFN_AreaInfoList_r9_t*) & eNB_rrc_inst[ctxt_pP->module_id].sib13->mbsfn_AreaInfoList_r9, + eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].MBMS_flag, + (MBSFN_AreaInfoList_r9_t*) & eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sib13->mbsfn_AreaInfoList_r9, (PMCH_InfoList_r9_t *) NULL #endif #ifdef CBA @@ -361,50 +369,51 @@ init_SI( /*------------------------------------------------------------------------------*/ static void init_MCCH( - module_id_t enb_mod_idP + module_id_t enb_mod_idP, + int CC_id ) //----------------------------------------------------------------------------- { int sync_area = 0; // initialize RRC_eNB_INST MCCH entry - eNB_rrc_inst[enb_mod_idP].MCCH_MESSAGE = malloc(eNB_rrc_inst[enb_mod_idP].num_mbsfn_sync_area * sizeof(uint32_t *)); + eNB_rrc_inst[enb_mod_idP].carrier[CC_id].MCCH_MESSAGE = + malloc(eNB_rrc_inst[enb_mod_idP].carrier[CC_id].num_mbsfn_sync_area * sizeof(uint32_t *)); - for (sync_area = 0; sync_area < eNB_rrc_inst[enb_mod_idP].num_mbsfn_sync_area; sync_area++) { + for (sync_area = 0; sync_area < eNB_rrc_inst[enb_mod_idP].carrier[CC_id].num_mbsfn_sync_area; sync_area++) { - eNB_rrc_inst[enb_mod_idP].sizeof_MCCH_MESSAGE[sync_area] = 0; - eNB_rrc_inst[enb_mod_idP].MCCH_MESSAGE[sync_area] = (uint8_t *) malloc16(32); + eNB_rrc_inst[enb_mod_idP].carrier[CC_id].sizeof_MCCH_MESSAGE[sync_area] = 0; + eNB_rrc_inst[enb_mod_idP].carrier[CC_id].MCCH_MESSAGE[sync_area] = (uint8_t *) malloc16(32); - if (eNB_rrc_inst[enb_mod_idP].MCCH_MESSAGE[sync_area] == NULL) { + if (eNB_rrc_inst[enb_mod_idP].carrier[CC_id].MCCH_MESSAGE[sync_area] == NULL) { LOG_E(RRC, "[eNB %d][MAIN] init_MCCH: FATAL, no memory for MCCH MESSAGE allocated \n", enb_mod_idP); mac_xface->macphy_exit("[RRC][init_MCCH] not enough memory\n"); } else { - eNB_rrc_inst[enb_mod_idP].sizeof_MCCH_MESSAGE[sync_area] = do_MBSFNAreaConfig(enb_mod_idP, + eNB_rrc_inst[enb_mod_idP].carrier[CC_id].sizeof_MCCH_MESSAGE[sync_area] = do_MBSFNAreaConfig(enb_mod_idP, mac_xface->lte_frame_parms, - sync_area, (uint8_t *) - eNB_rrc_inst[enb_mod_idP].MCCH_MESSAGE - [sync_area], - &eNB_rrc_inst[enb_mod_idP].mcch, - &eNB_rrc_inst - [enb_mod_idP].mcch_message); - - LOG_I(RRC, "mcch message pointer %p for sync area %d \n", eNB_rrc_inst[enb_mod_idP].MCCH_MESSAGE[sync_area], + sync_area, + (uint8_t *)eNB_rrc_inst[enb_mod_idP].carrier[CC_id].MCCH_MESSAGE[sync_area], + &eNB_rrc_inst[enb_mod_idP].carrier[CC_id].mcch, + &eNB_rrc_inst[enb_mod_idP].carrier[CC_id].mcch_message); + + LOG_I(RRC, "mcch message pointer %p for sync area %d \n", + eNB_rrc_inst[enb_mod_idP].carrier[CC_id].MCCH_MESSAGE[sync_area], sync_area); LOG_D(RRC, "[eNB %d] MCCH_MESSAGE contents for Sync Area %d (partial)\n", enb_mod_idP, sync_area); LOG_D(RRC, "[eNB %d] CommonSF_AllocPeriod_r9 %d\n", enb_mod_idP, - eNB_rrc_inst[enb_mod_idP].mcch_message->commonSF_AllocPeriod_r9); + eNB_rrc_inst[enb_mod_idP].carrier[CC_id].mcch_message->commonSF_AllocPeriod_r9); LOG_D(RRC, "[eNB %d] CommonSF_Alloc_r9.list.count (number of MBSFN Subframe Pattern) %d\n", - enb_mod_idP, eNB_rrc_inst[enb_mod_idP].mcch_message->commonSF_Alloc_r9.list.count); + enb_mod_idP, eNB_rrc_inst[enb_mod_idP].carrier[CC_id].mcch_message->commonSF_Alloc_r9.list.count); LOG_D(RRC, "[eNB %d] MBSFN Subframe Pattern: %02x (in hex)\n", enb_mod_idP, - eNB_rrc_inst[enb_mod_idP].mcch_message->commonSF_Alloc_r9.list.array[0]->subframeAllocation. + eNB_rrc_inst[enb_mod_idP].carrier[CC_id].mcch_message->commonSF_Alloc_r9.list.array[0]->subframeAllocation. choice.oneFrame.buf[0]); - if (eNB_rrc_inst[enb_mod_idP].sizeof_MCCH_MESSAGE[sync_area] == 255) { - mac_xface->macphy_exit("[RRC][init_MCCH] eNB_rrc_inst[enb_mod_idP].sizeof_MCCH_MESSAGE[sync_area] == 255"); + if (eNB_rrc_inst[enb_mod_idP].carrier[CC_id].sizeof_MCCH_MESSAGE[sync_area] == 255) { + mac_xface->macphy_exit("[RRC][init_MCCH] eNB_rrc_inst[enb_mod_idP].carrier[CC_id].sizeof_MCCH_MESSAGE[sync_area] == 255"); } else { - eNB_rrc_inst[enb_mod_idP].MCCH_MESS[sync_area].Active = 1; + eNB_rrc_inst[enb_mod_idP].carrier[CC_id].MCCH_MESS[sync_area].Active = 1; } } } @@ -434,7 +443,7 @@ init_MCCH( , 0, (MBSFN_AreaInfoList_r9_t *) NULL, - (PMCH_InfoList_r9_t *) & (eNB_rrc_inst[enb_mod_idP].mcch_message->pmch_InfoList_r9) + (PMCH_InfoList_r9_t *) & (eNB_rrc_inst[enb_mod_idP].carrier[CC_id].mcch_message->pmch_InfoList_r9) # endif # ifdef CBA , 0, 0 @@ -448,6 +457,7 @@ init_MCCH( //----------------------------------------------------------------------------- static void init_MBMS( module_id_t enb_mod_idP, + int CC_id, frame_t frameP ) //----------------------------------------------------------------------------- @@ -455,7 +465,7 @@ static void init_MBMS( // init the configuration for MTCH protocol_ctxt_t ctxt; - if (eNB_rrc_inst[enb_mod_idP].MBMS_flag > 0) { + if (eNB_rrc_inst[enb_mod_idP].carrier[CC_id].MBMS_flag > 0) { PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, enb_mod_idP, ENB_FLAG_YES, NOT_A_RNTI, frameP, 0,enb_mod_idP); LOG_D(RRC, "[eNB %d] Frame %d : Radio Bearer config request for MBMS\n", enb_mod_idP, frameP); //check the lcid @@ -470,7 +480,7 @@ static void init_MBMS( NULL, // key rrc integrity NULL // key encryption # ifdef Rel10 - , &(eNB_rrc_inst[enb_mod_idP].mcch_message->pmch_InfoList_r9) + , &(eNB_rrc_inst[enb_mod_idP].carrier[CC_id].mcch_message->pmch_InfoList_r9) # endif ); @@ -478,7 +488,7 @@ static void init_MBMS( NULL, // SRB_ToAddModList NULL, // DRB_ToAddModList NULL, // DRB_ToReleaseList - &(eNB_rrc_inst[enb_mod_idP].mcch_message->pmch_InfoList_r9)); + &(eNB_rrc_inst[enb_mod_idP].carrier[CC_id].mcch_message->pmch_InfoList_r9)); //rrc_mac_config_req(); } @@ -592,27 +602,30 @@ void rrc_eNB_emulation_notify_ue_module_id( { module_id_t enb_module_id; struct rrc_eNB_ue_context_s* ue_context_p = NULL; + int CC_id; // find enb_module_id for (enb_module_id = 0; enb_module_id < NUMBER_OF_eNB_MAX; enb_module_id++) { - if (eNB_rrc_inst[enb_module_id].sib1 != NULL) { - if ( - (eNB_rrc_inst[enb_module_id].sib1->cellAccessRelatedInfo.cellIdentity.buf[0] == cell_identity_byte0P) && - (eNB_rrc_inst[enb_module_id].sib1->cellAccessRelatedInfo.cellIdentity.buf[1] == cell_identity_byte1P) && - (eNB_rrc_inst[enb_module_id].sib1->cellAccessRelatedInfo.cellIdentity.buf[2] == cell_identity_byte2P) && - (eNB_rrc_inst[enb_module_id].sib1->cellAccessRelatedInfo.cellIdentity.buf[3] == cell_identity_byte3P) - ) { - oai_emulation.info.eNB_ue_module_id_to_rnti[enb_module_id][ue_module_idP] = rntiP; - ue_context_p = rrc_eNB_get_ue_context( - &eNB_rrc_inst[enb_module_id], - rntiP - ); - - if (NULL != ue_context_p) { - oai_emulation.info.eNB_ue_local_uid_to_ue_module_id[enb_module_id][ue_context_p->local_uid] = ue_module_idP; - } + for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { + if (eNB_rrc_inst[enb_module_id].carrier[CC_id].sib1 != NULL) { + if ( + (eNB_rrc_inst[enb_module_id].carrier[CC_id].sib1->cellAccessRelatedInfo.cellIdentity.buf[0] == cell_identity_byte0P) && + (eNB_rrc_inst[enb_module_id].carrier[CC_id].sib1->cellAccessRelatedInfo.cellIdentity.buf[1] == cell_identity_byte1P) && + (eNB_rrc_inst[enb_module_id].carrier[CC_id].sib1->cellAccessRelatedInfo.cellIdentity.buf[2] == cell_identity_byte2P) && + (eNB_rrc_inst[enb_module_id].carrier[CC_id].sib1->cellAccessRelatedInfo.cellIdentity.buf[3] == cell_identity_byte3P) + ) { + oai_emulation.info.eNB_ue_module_id_to_rnti[enb_module_id][ue_module_idP] = rntiP; + ue_context_p = rrc_eNB_get_ue_context( + &eNB_rrc_inst[enb_module_id], + rntiP + ); + + if (NULL != ue_context_p) { + oai_emulation.info.eNB_ue_local_uid_to_ue_module_id[enb_module_id][ue_context_p->local_uid] = ue_module_idP; + } - return; + return; + } } } } @@ -1760,7 +1773,7 @@ rrc_eNB_generate_HandoverPreparationInformation( handoverInfo->as_config.sourceDl_CarrierFreq = 36090; //Verify! memcpy((void *)&handoverInfo->as_config.sourceMasterInformationBlock, - (void*)&eNB_rrc_inst[ctxt_pP->module_id].mib, sizeof(MasterInformationBlock_t)); + (void*)&eNB_rrc_inst[ctxt_pP->module_id].carrier[0] /* CROUX TBC */.mib, sizeof(MasterInformationBlock_t)); memcpy((void *)&handoverInfo->as_config.sourceMeasConfig, (void*)ue_context_pP->ue_context.measConfig, sizeof(MeasConfig_t)); @@ -1773,13 +1786,13 @@ rrc_eNB_generate_HandoverPreparationInformation( 0, sizeof(SecurityAlgorithmConfig_t)); memcpy((void*)&ue_context_pP->ue_context.handover_info->as_config.sourceSystemInformationBlockType1, - (void*)&eNB_rrc_inst[ctxt_pP->module_id].SIB1, sizeof(SystemInformationBlockType1_t)); + (void*)&eNB_rrc_inst[ctxt_pP->module_id].carrier[0] /* CROUX TBC */.SIB1, sizeof(SystemInformationBlockType1_t)); memcpy((void*)&ue_context_pP->ue_context.handover_info->as_config.sourceSystemInformationBlockType2, - (void*)&eNB_rrc_inst[ctxt_pP->module_id].SIB23, sizeof(SystemInformationBlockType2_t)); + (void*)&eNB_rrc_inst[ctxt_pP->module_id].carrier[0] /* CROUX TBC */.SIB23, sizeof(SystemInformationBlockType2_t)); ue_context_pP->ue_context.handover_info->as_context.reestablishmentInfo = CALLOC(1, sizeof(ReestablishmentInfo_t)); ue_context_pP->ue_context.handover_info->as_context.reestablishmentInfo->sourcePhysCellId = - eNB_rrc_inst[ctxt_pP->module_id].physCellId; + eNB_rrc_inst[ctxt_pP->module_id].carrier[0] /* CROUX TBC */.physCellId; ue_context_pP->ue_context.handover_info->as_context.reestablishmentInfo->targetCellShortMAC_I.buf = NULL; // Check values later ue_context_pP->ue_context.handover_info->as_context.reestablishmentInfo->targetCellShortMAC_I.size = 0; ue_context_pP->ue_context.handover_info->as_context.reestablishmentInfo->targetCellShortMAC_I.bits_unused = 0; @@ -1806,7 +1819,7 @@ rrc_eNB_generate_HandoverPreparationInformation( "[eNB %d] Frame %d : Emulate sending HandoverPreparationInformation msg from eNB source %d to eNB target %d: source UE_id %x target UE_id %x source_modId: %d target_modId: %d\n", ctxt_pP->module_id, ctxt_pP->frame, - eNB_rrc_inst[ctxt_pP->module_id].physCellId, + eNB_rrc_inst[ctxt_pP->module_id].carrier[0] /* CROUX TBC */.physCellId, targetPhyId, ue_context_pP->ue_context.rnti, ue_context_target_p->ue_id_rnti, @@ -2613,35 +2626,35 @@ rrc_eNB_generate_RRCConnectionReconfiguration_handover( mobilityInfo->radioResourceConfigCommon.rach_ConfigCommon = CALLOC(1, sizeof(*mobilityInfo->radioResourceConfigCommon.rach_ConfigCommon)); memcpy((void *)mobilityInfo->radioResourceConfigCommon.rach_ConfigCommon, - (void *)&rrc_inst->sib2->radioResourceConfigCommon.rach_ConfigCommon, sizeof(RACH_ConfigCommon_t)); + (void *)&rrc_inst->carrier[0] /* CROUX TBC */.sib2->radioResourceConfigCommon.rach_ConfigCommon, sizeof(RACH_ConfigCommon_t)); mobilityInfo->radioResourceConfigCommon.prach_Config.prach_ConfigInfo = CALLOC(1, sizeof(*mobilityInfo->radioResourceConfigCommon.prach_Config.prach_ConfigInfo)); memcpy((void *)mobilityInfo->radioResourceConfigCommon.prach_Config.prach_ConfigInfo, - (void *)&rrc_inst->sib2->radioResourceConfigCommon.prach_Config.prach_ConfigInfo, + (void *)&rrc_inst->carrier[0] /* CROUX TBC */.sib2->radioResourceConfigCommon.prach_Config.prach_ConfigInfo, sizeof(PRACH_ConfigInfo_t)); mobilityInfo->radioResourceConfigCommon.prach_Config.rootSequenceIndex = - rrc_inst->sib2->radioResourceConfigCommon.prach_Config.rootSequenceIndex; + rrc_inst->carrier[0] /* CROUX TBC */.sib2->radioResourceConfigCommon.prach_Config.rootSequenceIndex; mobilityInfo->radioResourceConfigCommon.pdsch_ConfigCommon = CALLOC(1, sizeof(*mobilityInfo->radioResourceConfigCommon.pdsch_ConfigCommon)); memcpy((void *)mobilityInfo->radioResourceConfigCommon.pdsch_ConfigCommon, - (void *)&rrc_inst->sib2->radioResourceConfigCommon.pdsch_ConfigCommon, sizeof(PDSCH_ConfigCommon_t)); + (void *)&rrc_inst->carrier[0] /* CROUX TBC */.sib2->radioResourceConfigCommon.pdsch_ConfigCommon, sizeof(PDSCH_ConfigCommon_t)); memcpy((void *)&mobilityInfo->radioResourceConfigCommon.pusch_ConfigCommon, - (void *)&rrc_inst->sib2->radioResourceConfigCommon.pusch_ConfigCommon, sizeof(PUSCH_ConfigCommon_t)); + (void *)&rrc_inst->carrier[0] /* CROUX TBC */.sib2->radioResourceConfigCommon.pusch_ConfigCommon, sizeof(PUSCH_ConfigCommon_t)); mobilityInfo->radioResourceConfigCommon.phich_Config = NULL; mobilityInfo->radioResourceConfigCommon.pucch_ConfigCommon = CALLOC(1, sizeof(*mobilityInfo->radioResourceConfigCommon.pucch_ConfigCommon)); memcpy((void *)mobilityInfo->radioResourceConfigCommon.pucch_ConfigCommon, - (void *)&rrc_inst->sib2->radioResourceConfigCommon.pucch_ConfigCommon, sizeof(PUCCH_ConfigCommon_t)); + (void *)&rrc_inst->carrier[0] /* CROUX TBC */.sib2->radioResourceConfigCommon.pucch_ConfigCommon, sizeof(PUCCH_ConfigCommon_t)); mobilityInfo->radioResourceConfigCommon.soundingRS_UL_ConfigCommon = CALLOC(1, sizeof(*mobilityInfo->radioResourceConfigCommon.soundingRS_UL_ConfigCommon)); memcpy((void *)mobilityInfo->radioResourceConfigCommon.soundingRS_UL_ConfigCommon, - (void *)&rrc_inst->sib2->radioResourceConfigCommon.soundingRS_UL_ConfigCommon, + (void *)&rrc_inst->carrier[0] /* CROUX TBC */.sib2->radioResourceConfigCommon.soundingRS_UL_ConfigCommon, sizeof(SoundingRS_UL_ConfigCommon_t)); mobilityInfo->radioResourceConfigCommon.uplinkPowerControlCommon = CALLOC(1, sizeof(*mobilityInfo->radioResourceConfigCommon.uplinkPowerControlCommon)); memcpy((void *)mobilityInfo->radioResourceConfigCommon.uplinkPowerControlCommon, - (void *)&rrc_inst->sib2->radioResourceConfigCommon.uplinkPowerControlCommon, + (void *)&rrc_inst->carrier[0] /* CROUX TBC */.sib2->radioResourceConfigCommon.uplinkPowerControlCommon, sizeof(UplinkPowerControlCommon_t)); mobilityInfo->radioResourceConfigCommon.antennaInfoCommon = NULL; mobilityInfo->radioResourceConfigCommon.p_Max = NULL; // CALLOC(1,sizeof(*mobilityInfo->radioResourceConfigCommon.p_Max)); @@ -2649,7 +2662,7 @@ rrc_eNB_generate_RRCConnectionReconfiguration_handover( mobilityInfo->radioResourceConfigCommon.tdd_Config = NULL; //CALLOC(1,sizeof(TDD_Config_t)); //memcpy((void *)mobilityInfo->radioResourceConfigCommon.tdd_Config,(void *)rrc_inst->sib1->tdd_Config,sizeof(TDD_Config_t)); mobilityInfo->radioResourceConfigCommon.ul_CyclicPrefixLength = - rrc_inst->sib2->radioResourceConfigCommon.ul_CyclicPrefixLength; + rrc_inst->carrier[0] /* CROUX TBC */.sib2->radioResourceConfigCommon.ul_CyclicPrefixLength; //End of configuration of radioResourceConfigCommon mobilityInfo->carrierFreq = CALLOC(1, sizeof(*mobilityInfo->carrierFreq)); //CALLOC(1,sizeof(CarrierFreqEUTRA_t)); 36090 @@ -3117,7 +3130,8 @@ rrc_eNB_process_RRCConnectionReconfigurationComplete( void rrc_eNB_generate_RRCConnectionSetup( const protocol_ctxt_t* const ctxt_pP, - rrc_eNB_ue_context_t* const ue_context_pP + rrc_eNB_ue_context_t* const ue_context_pP, + const int CC_id ) //----------------------------------------------------------------------------- { @@ -3128,10 +3142,10 @@ rrc_eNB_generate_RRCConnectionSetup( int cnt; SRB_configList = &ue_context_pP->ue_context.SRB_configList; - eNB_rrc_inst[ctxt_pP->module_id].Srb0.Tx_buffer.payload_size = + eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].Srb0.Tx_buffer.payload_size = do_RRCConnectionSetup(ctxt_pP, ue_context_pP, - (uint8_t*) eNB_rrc_inst[ctxt_pP->module_id].Srb0.Tx_buffer.Payload, + (uint8_t*) eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].Srb0.Tx_buffer.Payload, (mac_xface->lte_frame_parms->nb_antennas_tx==2)?2:1, rrc_eNB_get_next_transaction_identifier(ctxt_pP->module_id), mac_xface->lte_frame_parms, @@ -3141,7 +3155,7 @@ rrc_eNB_generate_RRCConnectionSetup( #ifdef RRC_MSG_PRINT LOG_F(RRC,"[MSG] RRC Connection Setup\n"); - for (cnt = 0; cnt < eNB_rrc_inst[ctxt_pP->module_id].Srb0.Tx_buffer.payload_size; cnt++) { + for (cnt = 0; cnt < eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].Srb0.Tx_buffer.payload_size; cnt++) { LOG_F(RRC,"%02x ", ((uint8_t*)eNB_rrc_inst[ctxt_pP->module_id].Srb0.Tx_buffer.Payload)[cnt]); } @@ -3205,18 +3219,18 @@ rrc_eNB_generate_RRCConnectionSetup( MSC_LOG_TX_MESSAGE( MSC_RRC_ENB, MSC_RRC_UE, - eNB_rrc_inst[ctxt_pP->module_id].Srb0.Tx_buffer.Header, // LG WARNING - eNB_rrc_inst[ctxt_pP->module_id].Srb0.Tx_buffer.payload_size, + eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].Srb0.Tx_buffer.Header, // LG WARNING + eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].Srb0.Tx_buffer.payload_size, MSC_AS_TIME_FMT" RRCConnectionSetup UE %x size %u", MSC_AS_TIME_ARGS(ctxt_pP), ue_context_pP->ue_context.rnti, - eNB_rrc_inst[ctxt_pP->module_id].Srb0.Tx_buffer.payload_size); + eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].Srb0.Tx_buffer.payload_size); LOG_I(RRC, PROTOCOL_RRC_CTXT_UE_FMT" [RAPROC] Logical Channel DL-CCCH, Generating RRCConnectionSetup (bytes %d)\n", PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP), - eNB_rrc_inst[ctxt_pP->module_id].Srb0.Tx_buffer.payload_size); + eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].Srb0.Tx_buffer.payload_size); } @@ -3249,6 +3263,8 @@ openair_rrc_lite_eNB_init( //----------------------------------------------------------------------------- { protocol_ctxt_t ctxt; + int CC_id; + PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, enb_mod_idP, ENB_FLAG_YES, NOT_A_RNTI, 0, 0,enb_mod_idP); LOG_I(RRC, PROTOCOL_RRC_CTXT_FMT" Init...\n", @@ -3273,7 +3289,9 @@ openair_rrc_lite_eNB_init( // } // } eNB_rrc_inst[ctxt.module_id].Nb_ue = 0; - eNB_rrc_inst[ctxt.module_id].Srb0.Active = 0; + for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { + eNB_rrc_inst[ctxt.module_id].carrier[CC_id].Srb0.Active = 0; + } uid_linear_allocator_init(&eNB_rrc_inst[ctxt.module_id].uid_allocator); RB_INIT(&eNB_rrc_inst[ctxt.module_id].rrc_ue_head); RB_INIT(&eNB_rrc_inst[ctxt.module_id].rrc_rnti_head); @@ -3288,63 +3306,73 @@ openair_rrc_lite_eNB_init( #ifdef Rel10 // This has to come from some top-level configuration + // only CC_id 0 is logged LOG_I(RRC, PROTOCOL_RRC_CTXT_FMT" Rel10 RRC detected, MBMS flag %d\n", PROTOCOL_RRC_CTXT_ARGS(&ctxt), - eNB_rrc_inst[ctxt.module_id].MBMS_flag); + eNB_rrc_inst[ctxt.module_id].carrier[0].MBMS_flag); #else LOG_I(RRC, PROTOCOL_RRC_CTXT_FMT" Rel8 RRC\n", PROTOCOL_RRC_CTXT_ARGS(&ctxt)); #endif #ifdef CBA - for (j = 0; j < NUM_MAX_CBA_GROUP; j++) { - eNB_rrc_inst[ctxt.module_id].cba_rnti[j] = CBA_OFFSET + j; - } + for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { + for (j = 0; j < NUM_MAX_CBA_GROUP; j++) { + eNB_rrc_inst[ctxt.module_id].carrier[CC_id].cba_rnti[j] = CBA_OFFSET + j; + } - if (eNB_rrc_inst[ctxt.module_id].num_active_cba_groups > NUM_MAX_CBA_GROUP) { - eNB_rrc_inst[ctxt.module_id].num_active_cba_groups = NUM_MAX_CBA_GROUP; - } + if (eNB_rrc_inst[ctxt.module_id].carrier[CC_id].num_active_cba_groups > NUM_MAX_CBA_GROUP) { + eNB_rrc_inst[ctxt.module_id].carrier[CC_id].num_active_cba_groups = NUM_MAX_CBA_GROUP; + } - LOG_D(RRC, - PROTOCOL_RRC_CTXT_FMT" Initialization of 4 cba_RNTI values (%x %x %x %x) num active groups %d\n", - PROTOCOL_RRC_CTXT_ARGS(&ctxt), - enb_mod_idP, eNB_rrc_inst[ctxt.module_id].cba_rnti[0], - eNB_rrc_inst[ctxt.module_id].cba_rnti[1], eNB_rrc_inst[ctxt.module_id].cba_rnti[2], - eNB_rrc_inst[ctxt.module_id].cba_rnti[3], eNB_rrc_inst[ctxt.module_id].num_active_cba_groups); + LOG_D(RRC, + PROTOCOL_RRC_CTXT_FMT" Initialization of 4 cba_RNTI values (%x %x %x %x) num active groups %d\n", + PROTOCOL_RRC_CTXT_ARGS(&ctxt), + enb_mod_idP, eNB_rrc_inst[ctxt.module_id].carrier[CC_id].cba_rnti[0], + eNB_rrc_inst[ctxt.module_id].carrier[CC_id].cba_rnti[1], + eNB_rrc_inst[ctxt.module_id].carrier[CC_id].cba_rnti[2], + eNB_rrc_inst[ctxt.module_id].carrier[CC_id].cba_rnti[3], + eNB_rrc_inst[ctxt.module_id].carrier[CC_id].num_active_cba_groups); + } #endif - init_SI(&ctxt + for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { + init_SI(&ctxt, + CC_id #if defined(ENABLE_ITTI) - , configuration + , configuration #endif - ); + ); + } #ifdef Rel10 - switch (eNB_rrc_inst[ctxt.module_id].MBMS_flag) { - case 1: - case 2: - case 3: - LOG_I(RRC, PROTOCOL_RRC_CTXT_FMT" Configuring 1 MBSFN sync area\n", PROTOCOL_RRC_CTXT_ARGS(&ctxt)); - eNB_rrc_inst[ctxt.module_id].num_mbsfn_sync_area = 1; - break; - - case 4: - LOG_I(RRC, PROTOCOL_RRC_CTXT_FMT" Configuring 2 MBSFN sync area\n", PROTOCOL_RRC_CTXT_ARGS(&ctxt)); - eNB_rrc_inst[ctxt.module_id].num_mbsfn_sync_area = 2; - break; - - default: - eNB_rrc_inst[ctxt.module_id].num_mbsfn_sync_area = 0; - break; - } + for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { + switch (eNB_rrc_inst[ctxt.module_id].carrier[CC_id].MBMS_flag) { + case 1: + case 2: + case 3: + LOG_I(RRC, PROTOCOL_RRC_CTXT_FMT" Configuring 1 MBSFN sync area\n", PROTOCOL_RRC_CTXT_ARGS(&ctxt)); + eNB_rrc_inst[ctxt.module_id].carrier[CC_id].num_mbsfn_sync_area = 1; + break; - // if we are here the eNB_rrc_inst[enb_mod_idP].MBMS_flag > 0, - /// MCCH INIT - if (eNB_rrc_inst[ctxt.module_id].MBMS_flag > 0) { - init_MCCH(ctxt.module_id); - /// MTCH data bearer init - init_MBMS(ctxt.module_id, 0); + case 4: + LOG_I(RRC, PROTOCOL_RRC_CTXT_FMT" Configuring 2 MBSFN sync area\n", PROTOCOL_RRC_CTXT_ARGS(&ctxt)); + eNB_rrc_inst[ctxt.module_id].carrier[CC_id].num_mbsfn_sync_area = 2; + break; + + default: + eNB_rrc_inst[ctxt.module_id].carrier[CC_id].num_mbsfn_sync_area = 0; + break; + } + + // if we are here the eNB_rrc_inst[enb_mod_idP].MBMS_flag > 0, + /// MCCH INIT + if (eNB_rrc_inst[ctxt.module_id].carrier[CC_id].MBMS_flag > 0) { + init_MCCH(ctxt.module_id, CC_id); + /// MTCH data bearer init + init_MBMS(ctxt.module_id, CC_id, 0); + } } #endif @@ -3364,7 +3392,8 @@ openair_rrc_lite_eNB_init( int rrc_eNB_decode_ccch( protocol_ctxt_t* const ctxt_pP, - const SRB_INFO* const Srb_info + const SRB_INFO* const Srb_info, + const int CC_id ) //----------------------------------------------------------------------------- { @@ -3620,7 +3649,7 @@ rrc_eNB_decode_ccch( &DCCH_LCHAN_DESC, LCHAN_DESC_SIZE); - rrc_eNB_generate_RRCConnectionSetup(ctxt_pP, ue_context_p); + rrc_eNB_generate_RRCConnectionSetup(ctxt_pP, ue_context_p, CC_id); LOG_I(RRC, PROTOCOL_RRC_CTXT_UE_FMT"CALLING RLC CONFIG SRB1 (rbid %d)\n", PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP), Idx); @@ -4142,6 +4171,7 @@ rrc_enb_task( instance_t instance; int result; SRB_INFO *srb_info_p; + int CC_id; protocol_ctxt_t ctxt; itti_mark_task_ready(TASK_RRC_ENB); @@ -4174,13 +4204,14 @@ rrc_enb_task( PROTOCOL_RRC_CTXT_UE_ARGS(&ctxt), msg_name_p); - srb_info_p = &eNB_rrc_inst[instance].Srb0; + CC_id = RRC_MAC_CCCH_DATA_IND(msg_p).CC_id; + srb_info_p = &eNB_rrc_inst[instance].carrier[CC_id].Srb0; memcpy(srb_info_p->Rx_buffer.Payload, RRC_MAC_CCCH_DATA_IND(msg_p).sdu, 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_eNB_decode_ccch(&ctxt, srb_info_p); + rrc_eNB_decode_ccch(&ctxt, srb_info_p, CC_id); break; /* Messages from PDCP */ -- GitLab