- physical simulators - LTE eNB - LTE UE - 5G-NR gNB Still NR-UE does not build and eNB segs fault at start of program Signed-off-by: Raphael Defosseux <raphael.defosseux@eurecom.fr>
1235 lines
56 KiB
C
1235 lines
56 KiB
C
/*
|
|
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
|
* contributor license agreements. See the NOTICE file distributed with
|
|
* this work for additional information regarding copyright ownership.
|
|
* The OpenAirInterface Software Alliance licenses this file to You under
|
|
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
|
* except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.openairinterface.org/?page_id=698
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*-------------------------------------------------------------------------------
|
|
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
|
* contact@openairinterface.org
|
|
*/
|
|
|
|
/*! \file rrc_eNB_M2AP.c
|
|
* \brief rrc M2AP procedures for eNB
|
|
* \author Javier Morgade
|
|
* \version 0.1
|
|
* \company Vicomtech Spain
|
|
* \email: javier.morgade@ieee.org
|
|
*/
|
|
|
|
# include "rrc_defs.h"
|
|
# include "rrc_extern.h"
|
|
# include "RRC/LTE/MESSAGES/asn1_msg.h"
|
|
# include "rrc_eNB_M2AP.h"
|
|
//# include "rrc_eNB_UE_context.h"
|
|
# include "msc.h"
|
|
# include "asn1_conversions.h"
|
|
# include "intertask_interface.h"
|
|
# include "common/ran_context.h"
|
|
|
|
extern RAN_CONTEXT_t RC;
|
|
|
|
static m2ap_setup_resp_t * m2ap_setup_resp_g=NULL;
|
|
static m2ap_mbms_scheduling_information_t *m2ap_mbms_scheduling_information_g=NULL;
|
|
|
|
|
|
static void
|
|
rrc_M2AP_openair_rrc_top_init_MBMS(int eMBMS_active){
|
|
module_id_t module_id;
|
|
int CC_id;
|
|
|
|
(void)CC_id;
|
|
LOG_D(RRC, "[OPENAIR][INIT] Init function start: NB_eNB_INST=%d\n", RC.nb_inst);
|
|
|
|
if (RC.nb_inst > 0) {
|
|
LOG_I(RRC,"[eNB] eMBMS active state is %d \n", eMBMS_active);
|
|
|
|
for (module_id=0; module_id<NB_eNB_INST; module_id++) {
|
|
for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) {
|
|
RC.rrc[module_id]->carrier[CC_id].MBMS_flag = (uint8_t)eMBMS_active;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
static uint8_t rrc_M2AP_do_MBSFNAreaConfig(
|
|
uint8_t Mod_id,
|
|
uint8_t sync_area,
|
|
uint8_t *buffer,
|
|
LTE_MCCH_Message_t *mcch_message,
|
|
LTE_MBSFNAreaConfiguration_r9_t **mbsfnAreaConfiguration,
|
|
const m2ap_mbms_scheduling_information_t *const m2ap_mbms_scheduling_information
|
|
) {
|
|
int i,j,k;
|
|
|
|
asn_enc_rval_t enc_rval;
|
|
LTE_MBSFN_SubframeConfig_t *mbsfn_SubframeConfig1;
|
|
LTE_PMCH_Info_r9_t *pmch_Info_1;
|
|
LTE_MBMS_SessionInfo_r9_t *mbms_Session_1;
|
|
// MBMS_SessionInfo_r9_t *mbms_Session_2;
|
|
//eNB_RRC_INST *rrc = RC.rrc[Mod_id];
|
|
//rrc_eNB_carrier_data_t *carrier = &rrc->carrier[0];
|
|
memset(mcch_message,0,sizeof(LTE_MCCH_Message_t));
|
|
mcch_message->message.present = LTE_MCCH_MessageType_PR_c1;
|
|
mcch_message->message.choice.c1.present = LTE_MCCH_MessageType__c1_PR_mbsfnAreaConfiguration_r9;
|
|
*mbsfnAreaConfiguration = &mcch_message->message.choice.c1.choice.mbsfnAreaConfiguration_r9;
|
|
// Common Subframe Allocation (CommonSF-Alloc-r9)
|
|
|
|
for(i=0; i<m2ap_mbms_scheduling_information->num_mbms_area_config_list; i++){
|
|
for(j=0;j < m2ap_mbms_scheduling_information->mbms_area_config_list[i].num_mbms_sf_config_list; j++){
|
|
|
|
mbsfn_SubframeConfig1= CALLOC(1,sizeof(*mbsfn_SubframeConfig1));
|
|
memset((void *)mbsfn_SubframeConfig1,0,sizeof(*mbsfn_SubframeConfig1));
|
|
//
|
|
mbsfn_SubframeConfig1->radioframeAllocationPeriod= m2ap_mbms_scheduling_information->mbms_area_config_list[i].mbms_sf_config_list[j].radioframe_allocation_period;//LTE_MBSFN_SubframeConfig__radioframeAllocationPeriod_n4;
|
|
mbsfn_SubframeConfig1->radioframeAllocationOffset= m2ap_mbms_scheduling_information->mbms_area_config_list[i].mbms_sf_config_list[j].radioframe_allocation_offset;
|
|
if(m2ap_mbms_scheduling_information->mbms_area_config_list[i].mbms_sf_config_list[j].is_four_sf){
|
|
mbsfn_SubframeConfig1->subframeAllocation.present= LTE_MBSFN_SubframeConfig__subframeAllocation_PR_fourFrames;
|
|
mbsfn_SubframeConfig1->subframeAllocation.choice.oneFrame.buf= MALLOC(3);
|
|
mbsfn_SubframeConfig1->subframeAllocation.choice.oneFrame.buf[2] = ((m2ap_mbms_scheduling_information->mbms_area_config_list[i].mbms_sf_config_list[j].subframe_allocation) & 0xFF);
|
|
mbsfn_SubframeConfig1->subframeAllocation.choice.oneFrame.buf[1] = ((m2ap_mbms_scheduling_information->mbms_area_config_list[i].mbms_sf_config_list[j].subframe_allocation>>8) & 0xFF);
|
|
mbsfn_SubframeConfig1->subframeAllocation.choice.oneFrame.buf[0] = ((m2ap_mbms_scheduling_information->mbms_area_config_list[i].mbms_sf_config_list[j].subframe_allocation>>16) & 0xFF);
|
|
mbsfn_SubframeConfig1->subframeAllocation.choice.oneFrame.size= 3;
|
|
mbsfn_SubframeConfig1->subframeAllocation.choice.oneFrame.bits_unused= 0;
|
|
|
|
|
|
}else {
|
|
mbsfn_SubframeConfig1->subframeAllocation.present= LTE_MBSFN_SubframeConfig__subframeAllocation_PR_oneFrame;
|
|
mbsfn_SubframeConfig1->subframeAllocation.choice.oneFrame.buf= MALLOC(1);
|
|
mbsfn_SubframeConfig1->subframeAllocation.choice.oneFrame.size= 1;
|
|
mbsfn_SubframeConfig1->subframeAllocation.choice.oneFrame.bits_unused= 2;
|
|
mbsfn_SubframeConfig1->subframeAllocation.choice.oneFrame.buf[0] = (m2ap_mbms_scheduling_information->mbms_area_config_list[i].mbms_sf_config_list[j].subframe_allocation & 0x3F)<<2;
|
|
}
|
|
|
|
ASN_SEQUENCE_ADD(&(*mbsfnAreaConfiguration)->commonSF_Alloc_r9.list,mbsfn_SubframeConfig1);
|
|
}
|
|
// commonSF-AllocPeriod-r9
|
|
(*mbsfnAreaConfiguration)->commonSF_AllocPeriod_r9= m2ap_mbms_scheduling_information->mbms_area_config_list[i].common_sf_allocation_period;//LTE_MBSFNAreaConfiguration_r9__commonSF_AllocPeriod_r9_rf16;
|
|
// PMCHs Information List (PMCH-InfoList-r9)
|
|
for(j=0; j < m2ap_mbms_scheduling_information->mbms_area_config_list[i].num_pmch_config_list; j++){
|
|
// PMCH_1 Config
|
|
pmch_Info_1 = CALLOC(1,sizeof(LTE_PMCH_Info_r9_t));
|
|
memset((void *)pmch_Info_1,0,sizeof(LTE_PMCH_Info_r9_t));
|
|
/*
|
|
* take the value of last mbsfn subframe in this CSA period because there is only one PMCH in this mbsfn area
|
|
* Note: this has to be set based on the subframeAllocation and CSA
|
|
*/
|
|
pmch_Info_1->pmch_Config_r9.sf_AllocEnd_r9= m2ap_mbms_scheduling_information->mbms_area_config_list[i].pmch_config_list[j].allocated_sf_end;
|
|
pmch_Info_1->pmch_Config_r9.dataMCS_r9= m2ap_mbms_scheduling_information->mbms_area_config_list[i].pmch_config_list[j].data_mcs;
|
|
pmch_Info_1->pmch_Config_r9.mch_SchedulingPeriod_r9= LTE_PMCH_Config_r9__mch_SchedulingPeriod_r9_rf16;
|
|
// MBMSs-SessionInfoList-r9
|
|
for(k=0; k < m2ap_mbms_scheduling_information->mbms_area_config_list[i].pmch_config_list[j].num_mbms_session_list; k++){
|
|
// pmch_Info_1->mbms_SessionInfoList_r9 = CALLOC(1,sizeof(struct MBMS_SessionInfoList_r9));
|
|
// Session 1
|
|
mbms_Session_1 = CALLOC(1,sizeof(LTE_MBMS_SessionInfo_r9_t));
|
|
memset(mbms_Session_1,0,sizeof(LTE_MBMS_SessionInfo_r9_t));
|
|
// TMGI value
|
|
mbms_Session_1->tmgi_r9.plmn_Id_r9.present= LTE_TMGI_r9__plmn_Id_r9_PR_plmn_Index_r9;
|
|
mbms_Session_1->tmgi_r9.plmn_Id_r9.choice.plmn_Index_r9= 1;
|
|
// Service ID
|
|
//uint8_t TMGI[5] = {4,3,2,1,0};//TMGI is a string of octet, ref. TS 24.008 fig. 10.5.4a
|
|
char buf[4];
|
|
buf[0] = m2ap_mbms_scheduling_information->mbms_area_config_list[i].pmch_config_list[j].mbms_session_list[k].service_id << 24;
|
|
buf[1] = m2ap_mbms_scheduling_information->mbms_area_config_list[i].pmch_config_list[j].mbms_session_list[k].service_id << 16;
|
|
buf[2] = m2ap_mbms_scheduling_information->mbms_area_config_list[i].pmch_config_list[j].mbms_session_list[k].service_id << 8;
|
|
buf[3] = m2ap_mbms_scheduling_information->mbms_area_config_list[i].pmch_config_list[j].mbms_session_list[k].service_id << 0;
|
|
//INT32_TO_BUFFER(m2ap_mbms_scheduling_information->mbms_area_config_list[i].pmch_config_list[j].mbms_session_list[k].service_id,buf);
|
|
memset(&mbms_Session_1->tmgi_r9.serviceId_r9,0,sizeof(OCTET_STRING_t));// need to check
|
|
OCTET_STRING_fromBuf(&mbms_Session_1->tmgi_r9.serviceId_r9,(const char *)&buf[1],3);
|
|
// Session ID is still missing here, it can be used as an rab id or mrb id
|
|
mbms_Session_1->sessionId_r9 = CALLOC(1,sizeof(OCTET_STRING_t));
|
|
mbms_Session_1->sessionId_r9->buf= MALLOC(1);
|
|
mbms_Session_1->sessionId_r9->size= 1;
|
|
mbms_Session_1->sessionId_r9->buf[0]= m2ap_mbms_scheduling_information->mbms_area_config_list[i].pmch_config_list[j].mbms_session_list[k].service_id; //1;
|
|
// Logical Channel ID
|
|
mbms_Session_1->logicalChannelIdentity_r9=m2ap_mbms_scheduling_information->mbms_area_config_list[i].pmch_config_list[j].mbms_session_list[k].lcid; //1;
|
|
LOG_D(RRC,"lcid %lu %d\n",mbms_Session_1->logicalChannelIdentity_r9,m2ap_mbms_scheduling_information->mbms_area_config_list[i].pmch_config_list[j].mbms_session_list[k].lcid);
|
|
LOG_D(RRC,"service_id %d\n",m2ap_mbms_scheduling_information->mbms_area_config_list[i].pmch_config_list[j].mbms_session_list[k].service_id);
|
|
ASN_SEQUENCE_ADD(&pmch_Info_1->mbms_SessionInfoList_r9.list,mbms_Session_1);
|
|
}
|
|
ASN_SEQUENCE_ADD(&(*mbsfnAreaConfiguration)->pmch_InfoList_r9.list,pmch_Info_1);
|
|
}
|
|
}
|
|
|
|
if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
|
|
xer_fprint(stdout,&asn_DEF_LTE_MCCH_Message,(void *)mcch_message);
|
|
}
|
|
|
|
enc_rval = uper_encode_to_buffer(&asn_DEF_LTE_MCCH_Message,
|
|
NULL,
|
|
(void *)mcch_message,
|
|
buffer,
|
|
100);
|
|
|
|
if(enc_rval.encoded == -1) {
|
|
LOG_I(RRC, "[eNB AssertFatal]ASN1 message encoding failed (%s, %lu)!\n",
|
|
enc_rval.failed_type->name, enc_rval.encoded);
|
|
return -1;
|
|
}
|
|
|
|
LOG_I(RRC,"[eNB] MCCH Message Encoded %zd bits (%zd bytes)\n",enc_rval.encoded,(enc_rval.encoded+7)/8);
|
|
|
|
if (enc_rval.encoded==-1) {
|
|
msg("[RRC] ASN1 : MCCH encoding failed for MBSFNAreaConfiguration\n");
|
|
return(-1);
|
|
}
|
|
|
|
return((enc_rval.encoded+7)/8);
|
|
|
|
}
|
|
|
|
static void rrc_M2AP_init_MBMS(
|
|
module_id_t enb_mod_idP,
|
|
int CC_id,
|
|
frame_t frameP
|
|
){
|
|
// init the configuration for MTCH
|
|
protocol_ctxt_t ctxt;
|
|
|
|
if (RC.rrc[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_I(RRC, "[eNB %d] Frame %d : Radio Bearer config request for MBMS\n", enb_mod_idP, frameP); //check the lcid
|
|
// Configuring PDCP and RLC for MBMS Radio Bearer
|
|
rrc_pdcp_config_asn1_req(&ctxt,
|
|
(LTE_SRB_ToAddModList_t *)NULL, // LTE_SRB_ToAddModList
|
|
(LTE_DRB_ToAddModList_t *)NULL, // LTE_DRB_ToAddModList
|
|
(LTE_DRB_ToReleaseList_t *)NULL,
|
|
0, // security mode
|
|
NULL, // key rrc encryption
|
|
NULL, // key rrc integrity
|
|
NULL // key encryption
|
|
, &(RC.rrc[enb_mod_idP]->carrier[CC_id].mcch_message->pmch_InfoList_r9)
|
|
,NULL);
|
|
|
|
if (!NODE_IS_CU(RC.rrc[enb_mod_idP]->node_type)) {
|
|
rrc_rlc_config_asn1_req(&ctxt,
|
|
NULL, // LTE_SRB_ToAddModList
|
|
NULL, // LTE_DRB_ToAddModList
|
|
NULL, // DRB_ToReleaseList
|
|
&(RC.rrc[enb_mod_idP]->carrier[CC_id].mcch_message->pmch_InfoList_r9)
|
|
,0, 0
|
|
);
|
|
}
|
|
//rrc_mac_config_req();
|
|
}
|
|
}
|
|
|
|
|
|
static void rrc_M2AP_init_MCCH(
|
|
const protocol_ctxt_t *const ctxt_pP,
|
|
uint8_t enb_mod_idP,
|
|
int CC_id,
|
|
const m2ap_mbms_scheduling_information_t *const m2ap_mbms_scheduling_information
|
|
){
|
|
|
|
int sync_area = 0;
|
|
// initialize RRC_eNB_INST MCCH entry
|
|
eNB_RRC_INST *rrc = RC.rrc[enb_mod_idP];
|
|
|
|
RC.rrc[enb_mod_idP]->carrier[CC_id].MCCH_MESSAGE =
|
|
malloc(RC.rrc[enb_mod_idP]->carrier[CC_id].num_mbsfn_sync_area * sizeof(uint8_t *));
|
|
|
|
for (sync_area = 0; sync_area < RC.rrc[enb_mod_idP]->carrier[CC_id].num_mbsfn_sync_area; sync_area++) {
|
|
RC.rrc[enb_mod_idP]->carrier[CC_id].sizeof_MCCH_MESSAGE[sync_area] = 0;
|
|
RC.rrc[enb_mod_idP]->carrier[CC_id].MCCH_MESSAGE[sync_area] = (uint8_t *) malloc16(32);
|
|
AssertFatal(RC.rrc[enb_mod_idP]->carrier[CC_id].MCCH_MESSAGE[sync_area] != NULL,
|
|
"[eNB %d]init_MCCH: FATAL, no memory for MCCH MESSAGE allocated \n", enb_mod_idP);
|
|
RC.rrc[enb_mod_idP]->carrier[CC_id].sizeof_MCCH_MESSAGE[sync_area] = rrc_M2AP_do_MBSFNAreaConfig(enb_mod_idP,
|
|
sync_area,
|
|
(uint8_t *)RC.rrc[enb_mod_idP]->carrier[CC_id].MCCH_MESSAGE[sync_area],
|
|
&RC.rrc[enb_mod_idP]->carrier[CC_id].mcch,
|
|
&RC.rrc[enb_mod_idP]->carrier[CC_id].mcch_message,
|
|
m2ap_mbms_scheduling_information
|
|
);
|
|
LOG_I(RRC, "mcch message pointer %p for sync area %d \n",
|
|
RC.rrc[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 %ld\n", enb_mod_idP,
|
|
RC.rrc[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, RC.rrc[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,
|
|
RC.rrc[enb_mod_idP]->carrier[CC_id].mcch_message->commonSF_Alloc_r9.list.array[0]->subframeAllocation.
|
|
choice.oneFrame.buf[0]);
|
|
AssertFatal(RC.rrc[enb_mod_idP]->carrier[CC_id].sizeof_MCCH_MESSAGE[sync_area] != 255,
|
|
"RC.rrc[enb_mod_idP]->carrier[CC_id].sizeof_MCCH_MESSAGE[sync_area] == 255");
|
|
RC.rrc[enb_mod_idP]->carrier[CC_id].MCCH_MESS[sync_area].Active = 1;
|
|
}
|
|
|
|
|
|
if (NODE_IS_MONOLITHIC(rrc->node_type)) {
|
|
rrc_mac_config_req_eNB(enb_mod_idP, CC_id,
|
|
0,0,0,0,0,
|
|
0,
|
|
0,//rnti
|
|
(LTE_BCCH_BCH_Message_t *)NULL,
|
|
(LTE_RadioResourceConfigCommonSIB_t *) NULL,
|
|
(LTE_RadioResourceConfigCommonSIB_t *) NULL,
|
|
(struct LTE_PhysicalConfigDedicated *)NULL,
|
|
(LTE_SCellToAddMod_r10_t *)NULL,
|
|
//(struct LTE_PhysicalConfigDedicatedSCell_r10 *)NULL,
|
|
(LTE_MeasObjectToAddMod_t **) NULL,
|
|
(LTE_MAC_MainConfig_t *) NULL,
|
|
0,
|
|
(struct LTE_LogicalChannelConfig *)NULL,
|
|
(LTE_MeasGapConfig_t *) NULL,
|
|
(LTE_TDD_Config_t *) NULL,
|
|
(LTE_MobilityControlInfo_t *)NULL,
|
|
(LTE_SchedulingInfoList_t *) NULL,
|
|
0, NULL, NULL, (LTE_MBSFN_SubframeConfigList_t *) NULL
|
|
,
|
|
0,
|
|
(LTE_MBSFN_AreaInfoList_r9_t *) NULL,
|
|
(LTE_PMCH_InfoList_r9_t *) & (RC.rrc[enb_mod_idP]->carrier[CC_id].mcch_message->pmch_InfoList_r9),
|
|
(LTE_SystemInformationBlockType1_v1310_IEs_t *)NULL,
|
|
0,
|
|
(LTE_BCCH_DL_SCH_Message_MBMS_t *) NULL,
|
|
(LTE_SchedulingInfo_MBMS_r14_t *) NULL,
|
|
(struct LTE_NonMBSFN_SubframeConfig_r14 *) NULL,
|
|
(LTE_SystemInformationBlockType1_MBMS_r14_t *) NULL,
|
|
(LTE_MBSFN_AreaInfoList_r9_t *) NULL
|
|
);
|
|
}
|
|
|
|
return;
|
|
}
|
|
//static uint8_t rrc_M2AP_do_SIB1(
|
|
// const protocol_ctxt_t *const ctxt_pP,
|
|
// uint8_t Mod_id,
|
|
// int CC_id,
|
|
// const m2ap_setup_resp_t *const m2ap_setup_resp,
|
|
// const m2ap_mbms_scheduling_information_t *const m2ap_mbms_scheduling_information
|
|
//){
|
|
// int i/*,j,l*/;
|
|
//
|
|
// //eNB_RRC_INST *rrc = RC.rrc[ctxt_pP->module_id];
|
|
// //rrc_eNB_carrier_data_t *carrier=&rrc->carrier[CC_id];
|
|
//
|
|
// asn_enc_rval_t enc_rval;
|
|
//
|
|
// uint8_t *buffer;
|
|
//
|
|
// LTE_SystemInformationBlockType1_t **sib1;
|
|
//
|
|
// LTE_BCCH_DL_SCH_Message_t *bcch_message = &RC.rrc[Mod_id]->carrier[CC_id].systemInformation;
|
|
//
|
|
// if (ctxt_pP->brOption) {
|
|
// buffer = RC.rrc[Mod_id]->carrier[CC_id].SIB1_BR;
|
|
// bcch_message = &RC.rrc[Mod_id]->carrier[CC_id].siblock1_BR;
|
|
// sib1 = &RC.rrc[Mod_id]->carrier[CC_id].sib1_BR;
|
|
// }
|
|
// else
|
|
// {
|
|
// buffer = RC.rrc[Mod_id]->carrier[CC_id].SIB1;
|
|
// bcch_message = &RC.rrc[Mod_id]->carrier[CC_id].siblock1;
|
|
// sib1 = &RC.rrc[Mod_id]->carrier[CC_id].sib1;
|
|
// }
|
|
//
|
|
// *sib1 = &bcch_message->message.choice.c1.choice.systemInformationBlockType1;
|
|
//
|
|
// uint8_t find_sib13=0;
|
|
// for(i=0; i<(*sib1)->schedulingInfoList.list.count; i++){
|
|
// //for(j=0; j<(*sib1)->schedulingInfoList.list.array[i]->sib_MappingInfo.list.count;j++)
|
|
// // if((*sib1)->schedulingInfoList.list.array[i]->sib_MappingInfo.list.array[j] == LTE_SIB_Type_sibType13_v920)
|
|
// // find_sib13=1;
|
|
// }
|
|
// if(!find_sib13){
|
|
// LTE_SchedulingInfo_t schedulingInfo;
|
|
// LTE_SIB_Type_t sib_type;
|
|
// memset(&schedulingInfo,0,sizeof(LTE_SchedulingInfo_t));
|
|
// memset(&sib_type,0,sizeof(LTE_SIB_Type_t));
|
|
//
|
|
// schedulingInfo.si_Periodicity=LTE_SchedulingInfo__si_Periodicity_rf8;
|
|
// sib_type=LTE_SIB_Type_sibType13_v920;
|
|
// ASN_SEQUENCE_ADD(&(*sib1)->schedulingInfoList.list,&schedulingInfo);
|
|
// }
|
|
//
|
|
// enc_rval = uper_encode_to_buffer(&asn_DEF_LTE_BCCH_DL_SCH_Message,
|
|
// NULL,
|
|
// (void *)bcch_message,
|
|
// buffer,
|
|
// 900);
|
|
// AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n",
|
|
// enc_rval.failed_type->name, enc_rval.encoded);
|
|
// LOG_W(RRC,"[eNB] SystemInformationBlockType1 Encoded %zd bits (%zd bytes) with new SIB13(%d) \n",enc_rval.encoded,(enc_rval.encoded+7)/8,find_sib13);
|
|
//
|
|
//
|
|
// RC.rrc[ctxt_pP->module_id]->carrier[CC_id].sizeof_SIB1 = ((enc_rval.encoded+7)/8);
|
|
//
|
|
//
|
|
//
|
|
//
|
|
// return 0;
|
|
//}
|
|
|
|
|
|
|
|
static uint8_t rrc_M2AP_do_SIB23_SIB2(
|
|
const protocol_ctxt_t *const ctxt_pP,
|
|
uint8_t Mod_id,
|
|
int CC_id,
|
|
const m2ap_mbms_scheduling_information_t *const m2ap_mbms_scheduling_information
|
|
){
|
|
|
|
int i,j,l;
|
|
|
|
eNB_RRC_INST *rrc = RC.rrc[ctxt_pP->module_id];
|
|
rrc_eNB_carrier_data_t *carrier=&rrc->carrier[CC_id];
|
|
|
|
|
|
//struct LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member *sib13_part=NULL;
|
|
LTE_MBSFN_SubframeConfigList_t *MBSFNSubframeConfigList/*,*MBSFNSubframeConfigList_copy*/;
|
|
//LTE_MBSFN_AreaInfoList_r9_t *MBSFNArea_list/*,*MBSFNArea_list_copy*/;
|
|
|
|
asn_enc_rval_t enc_rval;
|
|
|
|
LTE_BCCH_DL_SCH_Message_t *bcch_message = &RC.rrc[Mod_id]->carrier[CC_id].systemInformation;
|
|
uint8_t *buffer;
|
|
LTE_SystemInformationBlockType2_t **sib2;
|
|
|
|
|
|
if(ctxt_pP->brOption){
|
|
buffer = RC.rrc[Mod_id]->carrier[CC_id].SIB23_BR;
|
|
sib2 = &RC.rrc[Mod_id]->carrier[CC_id].sib2_BR;
|
|
LOG_I(RRC,"Running SIB2/3 Encoding for eMTC\n");
|
|
|
|
} else {
|
|
buffer = RC.rrc[Mod_id]->carrier[CC_id].SIB23;
|
|
sib2 = &RC.rrc[Mod_id]->carrier[CC_id].sib2;
|
|
}
|
|
|
|
|
|
|
|
if (bcch_message) {
|
|
//memset(bcch_message,0,sizeof(LTE_BCCH_DL_SCH_Message_t));
|
|
} else {
|
|
LOG_E(RRC,"[eNB %d] BCCH_MESSAGE is null, exiting\n", Mod_id);
|
|
exit(-1);
|
|
}
|
|
|
|
if (!sib2) {
|
|
LOG_E(RRC,"[eNB %d] sib2 is null, exiting\n", Mod_id);
|
|
exit(-1);
|
|
}
|
|
|
|
//if (!sib3) {
|
|
// LOG_E(RRC,"[eNB %d] sib3 is null, exiting\n", Mod_id);
|
|
// exit(-1);
|
|
//}
|
|
|
|
for (i=0; i < bcch_message->message.choice.c1.choice.systemInformation.criticalExtensions.choice.systemInformation_r8.sib_TypeAndInfo.list.count; i++) {
|
|
struct LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member *typeandinfo;
|
|
typeandinfo = bcch_message->message.choice.c1.choice.systemInformation.criticalExtensions.choice.systemInformation_r8.sib_TypeAndInfo.list.array[i];
|
|
switch(typeandinfo->present) {
|
|
case LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_NOTHING:
|
|
break;
|
|
case LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib3:
|
|
break;
|
|
case LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib4:
|
|
break;
|
|
case LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib5:
|
|
break;
|
|
case LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib6:
|
|
break;
|
|
case LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib7:
|
|
break;
|
|
case LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib8:
|
|
break;
|
|
case LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib9:
|
|
break;
|
|
case LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib10:
|
|
break;
|
|
case LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib11:
|
|
break;
|
|
case LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib12_v920:
|
|
break;
|
|
case LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib13_v920:
|
|
break;
|
|
case LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib14_v1130:
|
|
break;
|
|
case LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib15_v1130:
|
|
break;
|
|
case LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib16_v1130:
|
|
break;
|
|
case LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib17_v1250:
|
|
break;
|
|
case LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib18_v1250:
|
|
break;
|
|
case LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib19_v1250:
|
|
break;
|
|
case LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib20_v1310:
|
|
break;
|
|
case LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib21_v1430:
|
|
break;
|
|
case LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib24_v1530:
|
|
break;
|
|
case LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib25_v1530:
|
|
break;
|
|
case LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib26_v1530:
|
|
break;
|
|
case LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib2:
|
|
|
|
LOG_I(RRC,"Adding MBSFN subframe Configuration 1 to SIB2, %p %p\n",&typeandinfo->choice.sib2,*sib2);
|
|
|
|
for(j=0; j < m2ap_mbms_scheduling_information->num_mbms_area_config_list ; j++) {
|
|
|
|
(&typeandinfo->choice.sib2)->mbsfn_SubframeConfigList = CALLOC(1,sizeof(struct LTE_MBSFN_SubframeConfigList));
|
|
MBSFNSubframeConfigList = (&typeandinfo->choice.sib2)->mbsfn_SubframeConfigList;
|
|
|
|
for(l=0; l < m2ap_mbms_scheduling_information->mbms_area_config_list[j].num_mbms_sf_config_list; l++){
|
|
LTE_MBSFN_SubframeConfig_t *sib2_mbsfn_SubframeConfig1;
|
|
sib2_mbsfn_SubframeConfig1= CALLOC(1,sizeof(*sib2_mbsfn_SubframeConfig1));
|
|
memset((void *)sib2_mbsfn_SubframeConfig1,0,sizeof(*sib2_mbsfn_SubframeConfig1));
|
|
|
|
sib2_mbsfn_SubframeConfig1->radioframeAllocationPeriod = m2ap_mbms_scheduling_information->mbms_area_config_list[j].mbms_sf_config_list[l].radioframe_allocation_period;
|
|
sib2_mbsfn_SubframeConfig1->radioframeAllocationOffset = m2ap_mbms_scheduling_information->mbms_area_config_list[j].mbms_sf_config_list[l].radioframe_allocation_offset;
|
|
|
|
|
|
if(m2ap_mbms_scheduling_information->mbms_area_config_list[j].mbms_sf_config_list[l].is_four_sf){
|
|
sib2_mbsfn_SubframeConfig1->subframeAllocation.present= LTE_MBSFN_SubframeConfig__subframeAllocation_PR_fourFrames;
|
|
|
|
sib2_mbsfn_SubframeConfig1->subframeAllocation.choice.oneFrame.buf= MALLOC(3);
|
|
sib2_mbsfn_SubframeConfig1->subframeAllocation.choice.oneFrame.size= 3;
|
|
sib2_mbsfn_SubframeConfig1->subframeAllocation.choice.oneFrame.bits_unused= 0;
|
|
sib2_mbsfn_SubframeConfig1->subframeAllocation.choice.oneFrame.buf[2] = ((m2ap_mbms_scheduling_information->mbms_area_config_list[j].mbms_sf_config_list[j].subframe_allocation) & 0xFF);
|
|
sib2_mbsfn_SubframeConfig1->subframeAllocation.choice.oneFrame.buf[1] = ((m2ap_mbms_scheduling_information->mbms_area_config_list[j].mbms_sf_config_list[j].subframe_allocation>>8) & 0xFF);
|
|
sib2_mbsfn_SubframeConfig1->subframeAllocation.choice.oneFrame.buf[0] = ((m2ap_mbms_scheduling_information->mbms_area_config_list[j].mbms_sf_config_list[l].subframe_allocation>>16) & 0xFF);
|
|
|
|
}else{
|
|
sib2_mbsfn_SubframeConfig1->subframeAllocation.present= LTE_MBSFN_SubframeConfig__subframeAllocation_PR_oneFrame;
|
|
sib2_mbsfn_SubframeConfig1->subframeAllocation.choice.oneFrame.buf= MALLOC(1);
|
|
sib2_mbsfn_SubframeConfig1->subframeAllocation.choice.oneFrame.size= 1;
|
|
sib2_mbsfn_SubframeConfig1->subframeAllocation.choice.oneFrame.bits_unused= 2;
|
|
sib2_mbsfn_SubframeConfig1->subframeAllocation.choice.oneFrame.buf[0]=(m2ap_mbms_scheduling_information->mbms_area_config_list[j].mbms_sf_config_list[j].subframe_allocation<<2);
|
|
|
|
|
|
}
|
|
|
|
ASN_SEQUENCE_ADD(&MBSFNSubframeConfigList->list,sib2_mbsfn_SubframeConfig1);
|
|
}
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
}
|
|
|
|
|
|
//xer_fprint(stdout, &asn_DEF_LTE_BCCH_DL_SCH_Message, (void *)bcch_message);
|
|
|
|
enc_rval = uper_encode_to_buffer(&asn_DEF_LTE_BCCH_DL_SCH_Message,
|
|
NULL,
|
|
(void *)bcch_message,
|
|
buffer,
|
|
900);
|
|
AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n",
|
|
enc_rval.failed_type->name, enc_rval.encoded);
|
|
|
|
LOG_I(RRC,"[eNB] MBMS SIB2 SystemInformation Encoded %zd bits (%zd bytes)\n",enc_rval.encoded,(enc_rval.encoded+7)/8);
|
|
|
|
if (enc_rval.encoded==-1) {
|
|
msg("[RRC] ASN1 : SI encoding failed for SIB23\n");
|
|
return(-1);
|
|
}
|
|
|
|
carrier->MBMS_flag =1;
|
|
|
|
if (NODE_IS_MONOLITHIC(rrc->node_type)) {
|
|
rrc_mac_config_req_eNB(ctxt_pP->module_id, CC_id,
|
|
0,0,0,0,0,
|
|
0,
|
|
0,//rnti
|
|
(LTE_BCCH_BCH_Message_t *)NULL,
|
|
(LTE_RadioResourceConfigCommonSIB_t *) NULL,
|
|
(LTE_RadioResourceConfigCommonSIB_t *) NULL,
|
|
(struct LTE_PhysicalConfigDedicated *)NULL,
|
|
(LTE_SCellToAddMod_r10_t *)NULL,
|
|
//(struct LTE_PhysicalConfigDedicatedSCell_r10 *)NULL,
|
|
(LTE_MeasObjectToAddMod_t **) NULL,
|
|
(LTE_MAC_MainConfig_t *) NULL,
|
|
0,
|
|
(struct LTE_LogicalChannelConfig *)NULL,
|
|
(LTE_MeasGapConfig_t *) NULL,
|
|
(LTE_TDD_Config_t *) NULL,
|
|
(LTE_MobilityControlInfo_t *)NULL,
|
|
(LTE_SchedulingInfoList_t *) NULL,
|
|
0, NULL,
|
|
(LTE_AdditionalSpectrumEmission_t *)NULL,
|
|
(LTE_MBSFN_SubframeConfigList_t *) carrier->sib2->mbsfn_SubframeConfigList,
|
|
carrier->MBMS_flag,
|
|
(LTE_MBSFN_AreaInfoList_r9_t *) NULL,
|
|
(LTE_PMCH_InfoList_r9_t *) NULL,
|
|
(LTE_SystemInformationBlockType1_v1310_IEs_t *)NULL,
|
|
0,
|
|
(LTE_BCCH_DL_SCH_Message_MBMS_t *) NULL,
|
|
(LTE_SchedulingInfo_MBMS_r14_t *) NULL,
|
|
(struct LTE_NonMBSFN_SubframeConfig_r14 *) NULL,
|
|
(LTE_SystemInformationBlockType1_MBMS_r14_t *) NULL,
|
|
(LTE_MBSFN_AreaInfoList_r9_t *) NULL
|
|
);
|
|
}
|
|
|
|
RC.rrc[ctxt_pP->module_id]->carrier[CC_id].sizeof_SIB23 = ((enc_rval.encoded+7)/8);
|
|
|
|
return 0;
|
|
}
|
|
|
|
static uint8_t rrc_M2AP_do_SIB23_SIB13(
|
|
const protocol_ctxt_t *const ctxt_pP,
|
|
uint8_t Mod_id,
|
|
int CC_id,
|
|
const m2ap_setup_resp_t *const m2ap_setup_resp
|
|
){
|
|
|
|
int i;
|
|
eNB_RRC_INST *rrc = RC.rrc[ctxt_pP->module_id];
|
|
rrc_eNB_carrier_data_t *carrier=&rrc->carrier[CC_id];
|
|
|
|
|
|
struct LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member *sib13_part=NULL;
|
|
//LTE_MBSFN_SubframeConfigList_t *MBSFNSubframeConfigList;
|
|
LTE_MBSFN_AreaInfoList_r9_t *MBSFNArea_list;
|
|
|
|
asn_enc_rval_t enc_rval;
|
|
|
|
LTE_BCCH_DL_SCH_Message_t *bcch_message = &RC.rrc[Mod_id]->carrier[CC_id].systemInformation;
|
|
uint8_t *buffer;
|
|
LTE_SystemInformationBlockType2_t **sib2;
|
|
|
|
|
|
if(ctxt_pP->brOption){
|
|
buffer = RC.rrc[Mod_id]->carrier[CC_id].SIB23_BR;
|
|
sib2 = &RC.rrc[Mod_id]->carrier[CC_id].sib2_BR;
|
|
LOG_I(RRC,"Running SIB2/3 Encoding for eMTC\n");
|
|
} else {
|
|
buffer = RC.rrc[Mod_id]->carrier[CC_id].SIB23;
|
|
sib2 = &RC.rrc[Mod_id]->carrier[CC_id].sib2;
|
|
}
|
|
|
|
if (bcch_message) {
|
|
//memset(bcch_message,0,sizeof(LTE_BCCH_DL_SCH_Message_t));
|
|
} else {
|
|
LOG_E(RRC,"[eNB %d] BCCH_MESSAGE is null, exiting\n", Mod_id);
|
|
exit(-1);
|
|
}
|
|
|
|
if (!sib2) {
|
|
LOG_E(RRC,"[eNB %d] sib2 is null, exiting\n", Mod_id);
|
|
exit(-1);
|
|
}
|
|
|
|
//if (!sib3) {
|
|
// LOG_E(RRC,"[eNB %d] sib3 is null, exiting\n", Mod_id);
|
|
// exit(-1);
|
|
//}
|
|
|
|
/*for (int i=0; i<(*si)->criticalExtensions.choice.systemInformation_r8.sib_TypeAndInfo.list.count; i++) {
|
|
struct LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member *typeandinfo;
|
|
typeandinfo = (*si)->criticalExtensions.choice.systemInformation_r8.sib_TypeAndInfo.list.array[i];
|
|
switch(typeandinfo->present) {
|
|
case LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib2:
|
|
LTE_SystemInformationBlockType2_t *sib2 = &typeandinfo->choice.sib2
|
|
LOG_I(RRC,"Adding MBSFN subframe Configuration 1 to SIB2\n");
|
|
LTE_MBSFN_SubframeConfig_t *sib2_mbsfn_SubframeConfig1;
|
|
(*sib2)->mbsfn_SubframeConfigList = CALLOC(1,sizeof(struct LTE_MBSFN_SubframeConfigList));
|
|
MBSFNSubframeConfigList = (*sib2)->mbsfn_SubframeConfigList;
|
|
sib2_mbsfn_SubframeConfig1= CALLOC(1,sizeof(*sib2_mbsfn_SubframeConfig1));
|
|
memset((void *)sib2_mbsfn_SubframeConfig1,0,sizeof(*sib2_mbsfn_SubframeConfig1));
|
|
sib2_mbsfn_SubframeConfig1->radioframeAllocationPeriod= LTE_MBSFN_SubframeConfig__radioframeAllocationPeriod_n4;
|
|
sib2_mbsfn_SubframeConfig1->radioframeAllocationOffset= 1;
|
|
sib2_mbsfn_SubframeConfig1->subframeAllocation.present= LTE_MBSFN_SubframeConfig__subframeAllocation_PR_oneFrame;
|
|
sib2_mbsfn_SubframeConfig1->subframeAllocation.choice.oneFrame.buf= MALLOC(1);
|
|
sib2_mbsfn_SubframeConfig1->subframeAllocation.choice.oneFrame.size= 1;
|
|
sib2_mbsfn_SubframeConfig1->subframeAllocation.choice.oneFrame.bits_unused= 2;
|
|
sib2_mbsfn_SubframeConfig1->subframeAllocation.choice.oneFrame.buf[0]=0x38<<2;
|
|
|
|
ASN_SEQUENCE_ADD(&MBSFNSubframeConfigList->list,sib2_mbsfn_SubframeConfig1);
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
}*/
|
|
|
|
|
|
LTE_SystemInformationBlockType13_r9_t **sib13 = &RC.rrc[Mod_id]->carrier[CC_id].sib13;
|
|
|
|
struct LTE_MBSFN_AreaInfo_r9 *MBSFN_Area1/*, *MBSFN_Area2*/;
|
|
sib13_part = CALLOC(1,sizeof(struct LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member));
|
|
memset(sib13_part,0,sizeof(struct LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member));
|
|
sib13_part->present = LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib13_v920;
|
|
|
|
*sib13 = &sib13_part->choice.sib13_v920;
|
|
|
|
(*sib13)->notificationConfig_r9.notificationRepetitionCoeff_r9=LTE_MBMS_NotificationConfig_r9__notificationRepetitionCoeff_r9_n2;
|
|
(*sib13)->notificationConfig_r9.notificationOffset_r9=0;
|
|
(*sib13)->notificationConfig_r9.notificationSF_Index_r9=1;
|
|
|
|
// MBSFN-AreaInfoList
|
|
MBSFNArea_list= &(*sib13)->mbsfn_AreaInfoList_r9;//CALLOC(1,sizeof(*MBSFNArea_list));
|
|
memset(MBSFNArea_list,0,sizeof(*MBSFNArea_list));
|
|
|
|
for( i=0; i < m2ap_setup_resp->num_mcch_config_per_mbsfn; i++){
|
|
// MBSFN Area 1
|
|
MBSFN_Area1= CALLOC(1, sizeof(*MBSFN_Area1));
|
|
MBSFN_Area1->mbsfn_AreaId_r9= m2ap_setup_resp->mcch_config_per_mbsfn[i].mbsfn_area;
|
|
MBSFN_Area1->non_MBSFNregionLength= m2ap_setup_resp->mcch_config_per_mbsfn[i].pdcch_length;
|
|
MBSFN_Area1->notificationIndicator_r9= 0;
|
|
MBSFN_Area1->mcch_Config_r9.mcch_RepetitionPeriod_r9= m2ap_setup_resp->mcch_config_per_mbsfn[i].repetition_period;//LTE_MBSFN_AreaInfo_r9__mcch_Config_r9__mcch_RepetitionPeriod_r9_rf32;
|
|
MBSFN_Area1->mcch_Config_r9.mcch_Offset_r9= m2ap_setup_resp->mcch_config_per_mbsfn[i].offset; // in accordance with mbsfn subframe configuration in sib2
|
|
MBSFN_Area1->mcch_Config_r9.mcch_ModificationPeriod_r9= m2ap_setup_resp->mcch_config_per_mbsfn[i].modification_period;
|
|
|
|
// Subframe Allocation Info
|
|
MBSFN_Area1->mcch_Config_r9.sf_AllocInfo_r9.buf= MALLOC(1);
|
|
MBSFN_Area1->mcch_Config_r9.sf_AllocInfo_r9.size= 1;
|
|
MBSFN_Area1->mcch_Config_r9.sf_AllocInfo_r9.buf[0]=m2ap_setup_resp->mcch_config_per_mbsfn[i].subframe_allocation_info<<2; // FDD: SF1
|
|
MBSFN_Area1->mcch_Config_r9.sf_AllocInfo_r9.bits_unused= 2;
|
|
MBSFN_Area1->mcch_Config_r9.signallingMCS_r9= m2ap_setup_resp->mcch_config_per_mbsfn[i].mcs;
|
|
ASN_SEQUENCE_ADD(&MBSFNArea_list->list,MBSFN_Area1);
|
|
}
|
|
|
|
ASN_SEQUENCE_ADD(&bcch_message->message.choice.c1.choice.systemInformation.criticalExtensions.choice.systemInformation_r8.sib_TypeAndInfo.list, sib13_part);
|
|
|
|
//xer_fprint(stdout, &asn_DEF_LTE_BCCH_DL_SCH_Message, (void *)bcch_message);
|
|
|
|
enc_rval = uper_encode_to_buffer(&asn_DEF_LTE_BCCH_DL_SCH_Message,
|
|
NULL,
|
|
(void *)bcch_message,
|
|
buffer,
|
|
900);
|
|
AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n",
|
|
enc_rval.failed_type->name, enc_rval.encoded);
|
|
|
|
LOG_I(RRC,"[eNB] MBMS SIB13 SystemInformation Encoded %zd bits (%zd bytes)\n",enc_rval.encoded,(enc_rval.encoded+7)/8);
|
|
|
|
if (enc_rval.encoded==-1) {
|
|
msg("[RRC] ASN1 : SI encoding failed for SIB23\n");
|
|
return(-1);
|
|
}
|
|
|
|
if (NODE_IS_MONOLITHIC(rrc->node_type)) {
|
|
rrc_mac_config_req_eNB(ctxt_pP->module_id, CC_id,
|
|
0,0,0,0,0,
|
|
0,
|
|
0,//rnti
|
|
(LTE_BCCH_BCH_Message_t *)NULL,
|
|
(LTE_RadioResourceConfigCommonSIB_t *) NULL,
|
|
(LTE_RadioResourceConfigCommonSIB_t *) NULL,
|
|
(struct LTE_PhysicalConfigDedicated *)NULL,
|
|
(LTE_SCellToAddMod_r10_t *)NULL,
|
|
//(struct LTE_PhysicalConfigDedicatedSCell_r10 *)NULL,
|
|
(LTE_MeasObjectToAddMod_t **) NULL,
|
|
(LTE_MAC_MainConfig_t *) NULL,
|
|
0,
|
|
(struct LTE_LogicalChannelConfig *)NULL,
|
|
(LTE_MeasGapConfig_t *) NULL,
|
|
(LTE_TDD_Config_t *) NULL,
|
|
(LTE_MobilityControlInfo_t *)NULL,
|
|
(LTE_SchedulingInfoList_t *) NULL,
|
|
0, NULL, NULL, (LTE_MBSFN_SubframeConfigList_t *) NULL
|
|
,
|
|
0,
|
|
(LTE_MBSFN_AreaInfoList_r9_t *) & carrier->sib13->mbsfn_AreaInfoList_r9,
|
|
(LTE_PMCH_InfoList_r9_t *) NULL,
|
|
(LTE_SystemInformationBlockType1_v1310_IEs_t *)NULL,
|
|
0,
|
|
(LTE_BCCH_DL_SCH_Message_MBMS_t *) NULL,
|
|
(LTE_SchedulingInfo_MBMS_r14_t *) NULL,
|
|
(struct LTE_NonMBSFN_SubframeConfig_r14 *) NULL,
|
|
(LTE_SystemInformationBlockType1_MBMS_r14_t *) NULL,
|
|
(LTE_MBSFN_AreaInfoList_r9_t *) NULL
|
|
);
|
|
}
|
|
|
|
RC.rrc[ctxt_pP->module_id]->carrier[CC_id].sizeof_SIB23 = ((enc_rval.encoded+7)/8);
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
static uint8_t rrc_M2AP_do_SIB23_SIB2_SIB13(
|
|
const protocol_ctxt_t *const ctxt_pP,
|
|
uint8_t Mod_id,
|
|
int CC_id,
|
|
const m2ap_setup_resp_t *const m2ap_setup_resp,
|
|
const m2ap_mbms_scheduling_information_t *const m2ap_mbms_scheduling_information
|
|
){
|
|
|
|
int i,j,l;
|
|
|
|
eNB_RRC_INST *rrc = RC.rrc[ctxt_pP->module_id];
|
|
rrc_eNB_carrier_data_t *carrier=&rrc->carrier[CC_id];
|
|
|
|
|
|
struct LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member *sib13_part=NULL;
|
|
LTE_MBSFN_SubframeConfigList_t *MBSFNSubframeConfigList/*,*MBSFNSubframeConfigList_copy*/;
|
|
|
|
asn_enc_rval_t enc_rval;
|
|
|
|
LTE_BCCH_DL_SCH_Message_t *bcch_message = &RC.rrc[Mod_id]->carrier[CC_id].systemInformation;
|
|
uint8_t *buffer;
|
|
LTE_SystemInformationBlockType2_t **sib2;
|
|
|
|
LTE_MBSFN_AreaInfoList_r9_t *MBSFNArea_list/*,*MBSFNArea_list_copy*/;
|
|
LTE_SystemInformationBlockType13_r9_t **sib13 = &RC.rrc[Mod_id]->carrier[CC_id].sib13;
|
|
struct LTE_MBSFN_AreaInfo_r9 *MBSFN_Area1;
|
|
|
|
if(ctxt_pP->brOption){
|
|
buffer = RC.rrc[Mod_id]->carrier[CC_id].SIB23_BR;
|
|
sib2 = &RC.rrc[Mod_id]->carrier[CC_id].sib2_BR;
|
|
LOG_I(RRC,"Running SIB2/3 Encoding for eMTC\n");
|
|
|
|
} else {
|
|
buffer = RC.rrc[Mod_id]->carrier[CC_id].SIB23;
|
|
sib2 = &RC.rrc[Mod_id]->carrier[CC_id].sib2;
|
|
}
|
|
|
|
if (bcch_message) {
|
|
//memset(bcch_message,0,sizeof(LTE_BCCH_DL_SCH_Message_t));
|
|
} else {
|
|
LOG_E(RRC,"[eNB %d] BCCH_MESSAGE is null, exiting\n", Mod_id);
|
|
exit(-1);
|
|
}
|
|
|
|
if (!sib2) {
|
|
LOG_E(RRC,"[eNB %d] sib2 is null, exiting\n", Mod_id);
|
|
exit(-1);
|
|
}
|
|
|
|
if(!sib13){
|
|
LOG_I(RRC,"[eNB %d] sib13 is null, it should get created\n",Mod_id);
|
|
}
|
|
|
|
//if (!sib3) {
|
|
// LOG_E(RRC,"[eNB %d] sib3 is null, exiting\n", Mod_id);
|
|
// exit(-1);
|
|
//}
|
|
|
|
for (i=0; i < bcch_message->message.choice.c1.choice.systemInformation.criticalExtensions.choice.systemInformation_r8.sib_TypeAndInfo.list.count; i++) {
|
|
struct LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member *typeandinfo;
|
|
typeandinfo = bcch_message->message.choice.c1.choice.systemInformation.criticalExtensions.choice.systemInformation_r8.sib_TypeAndInfo.list.array[i];
|
|
switch(typeandinfo->present) {
|
|
case LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_NOTHING:
|
|
break;
|
|
case LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib3:
|
|
break;
|
|
case LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib4:
|
|
break;
|
|
case LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib5:
|
|
break;
|
|
case LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib6:
|
|
break;
|
|
case LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib7:
|
|
break;
|
|
case LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib8:
|
|
break;
|
|
case LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib9:
|
|
break;
|
|
case LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib10:
|
|
break;
|
|
case LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib11:
|
|
break;
|
|
case LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib12_v920:
|
|
break;
|
|
case LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib13_v920:
|
|
*sib13=&typeandinfo->choice.sib13_v920;
|
|
(*sib13)->notificationConfig_r9.notificationRepetitionCoeff_r9=LTE_MBMS_NotificationConfig_r9__notificationRepetitionCoeff_r9_n2;
|
|
(*sib13)->notificationConfig_r9.notificationOffset_r9=0;
|
|
(*sib13)->notificationConfig_r9.notificationSF_Index_r9=1;
|
|
// MBSFN-AreaInfoList
|
|
MBSFNArea_list= &(*sib13)->mbsfn_AreaInfoList_r9;//CALLOC(1,sizeof(*MBSFNArea_list));
|
|
memset(MBSFNArea_list,0,sizeof(*MBSFNArea_list));
|
|
|
|
for( j=0; j < m2ap_setup_resp->num_mcch_config_per_mbsfn; j++){
|
|
// MBSFN Area 1
|
|
MBSFN_Area1= CALLOC(1, sizeof(*MBSFN_Area1));
|
|
MBSFN_Area1->mbsfn_AreaId_r9= m2ap_setup_resp->mcch_config_per_mbsfn[j].mbsfn_area;
|
|
MBSFN_Area1->non_MBSFNregionLength= m2ap_setup_resp->mcch_config_per_mbsfn[j].pdcch_length;
|
|
MBSFN_Area1->notificationIndicator_r9= 0;
|
|
MBSFN_Area1->mcch_Config_r9.mcch_RepetitionPeriod_r9= m2ap_setup_resp->mcch_config_per_mbsfn[j].repetition_period;//LTE_MBSFN_AreaInfo_r9__mcch_Config_r9__mcch_RepetitionPeriod_r9_rf32;
|
|
MBSFN_Area1->mcch_Config_r9.mcch_Offset_r9= m2ap_setup_resp->mcch_config_per_mbsfn[j].offset; // in accordance with mbsfn subframe configuration in sib2
|
|
MBSFN_Area1->mcch_Config_r9.mcch_ModificationPeriod_r9= m2ap_setup_resp->mcch_config_per_mbsfn[j].modification_period;
|
|
|
|
// Subframe Allocation Info
|
|
MBSFN_Area1->mcch_Config_r9.sf_AllocInfo_r9.buf= MALLOC(1);
|
|
MBSFN_Area1->mcch_Config_r9.sf_AllocInfo_r9.size= 1;
|
|
MBSFN_Area1->mcch_Config_r9.sf_AllocInfo_r9.buf[0]=m2ap_setup_resp->mcch_config_per_mbsfn[j].subframe_allocation_info<<2; // FDD: SF1
|
|
MBSFN_Area1->mcch_Config_r9.sf_AllocInfo_r9.bits_unused= 2;
|
|
MBSFN_Area1->mcch_Config_r9.signallingMCS_r9= m2ap_setup_resp->mcch_config_per_mbsfn[j].mcs;
|
|
ASN_SEQUENCE_ADD(&MBSFNArea_list->list,MBSFN_Area1);
|
|
}
|
|
break;
|
|
case LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib14_v1130:
|
|
break;
|
|
case LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib15_v1130:
|
|
break;
|
|
case LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib16_v1130:
|
|
break;
|
|
case LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib17_v1250:
|
|
break;
|
|
case LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib18_v1250:
|
|
break;
|
|
case LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib19_v1250:
|
|
break;
|
|
case LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib20_v1310:
|
|
break;
|
|
case LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib21_v1430:
|
|
break;
|
|
case LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib24_v1530:
|
|
break;
|
|
case LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib25_v1530:
|
|
break;
|
|
case LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib26_v1530:
|
|
break;
|
|
case LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib2:
|
|
|
|
LOG_I(RRC,"Adding MBSFN subframe Configuration 1 to SIB2, %p %p\n",&typeandinfo->choice.sib2,*sib2);
|
|
|
|
for(j=0; j < m2ap_mbms_scheduling_information->num_mbms_area_config_list ; j++) {
|
|
|
|
(&typeandinfo->choice.sib2)->mbsfn_SubframeConfigList = CALLOC(1,sizeof(struct LTE_MBSFN_SubframeConfigList));
|
|
MBSFNSubframeConfigList = (&typeandinfo->choice.sib2)->mbsfn_SubframeConfigList;
|
|
|
|
for(l=0; l < m2ap_mbms_scheduling_information->mbms_area_config_list[j].num_mbms_sf_config_list; l++){
|
|
LTE_MBSFN_SubframeConfig_t *sib2_mbsfn_SubframeConfig1;
|
|
sib2_mbsfn_SubframeConfig1= CALLOC(1,sizeof(*sib2_mbsfn_SubframeConfig1));
|
|
memset((void *)sib2_mbsfn_SubframeConfig1,0,sizeof(*sib2_mbsfn_SubframeConfig1));
|
|
|
|
sib2_mbsfn_SubframeConfig1->radioframeAllocationPeriod = m2ap_mbms_scheduling_information->mbms_area_config_list[j].mbms_sf_config_list[l].radioframe_allocation_period;
|
|
sib2_mbsfn_SubframeConfig1->radioframeAllocationOffset = m2ap_mbms_scheduling_information->mbms_area_config_list[j].mbms_sf_config_list[l].radioframe_allocation_offset;
|
|
|
|
|
|
if(m2ap_mbms_scheduling_information->mbms_area_config_list[j].mbms_sf_config_list[l].is_four_sf){
|
|
sib2_mbsfn_SubframeConfig1->subframeAllocation.present= LTE_MBSFN_SubframeConfig__subframeAllocation_PR_fourFrames;
|
|
|
|
sib2_mbsfn_SubframeConfig1->subframeAllocation.choice.oneFrame.buf= MALLOC(3);
|
|
sib2_mbsfn_SubframeConfig1->subframeAllocation.choice.oneFrame.size= 3;
|
|
sib2_mbsfn_SubframeConfig1->subframeAllocation.choice.oneFrame.bits_unused= 0;
|
|
sib2_mbsfn_SubframeConfig1->subframeAllocation.choice.oneFrame.buf[2] = ((m2ap_mbms_scheduling_information->mbms_area_config_list[j].mbms_sf_config_list[j].subframe_allocation) & 0xFF);
|
|
sib2_mbsfn_SubframeConfig1->subframeAllocation.choice.oneFrame.buf[1] = ((m2ap_mbms_scheduling_information->mbms_area_config_list[j].mbms_sf_config_list[j].subframe_allocation>>8) & 0xFF);
|
|
sib2_mbsfn_SubframeConfig1->subframeAllocation.choice.oneFrame.buf[0] = ((m2ap_mbms_scheduling_information->mbms_area_config_list[j].mbms_sf_config_list[l].subframe_allocation>>16) & 0xFF);
|
|
|
|
}else{
|
|
sib2_mbsfn_SubframeConfig1->subframeAllocation.present= LTE_MBSFN_SubframeConfig__subframeAllocation_PR_oneFrame;
|
|
sib2_mbsfn_SubframeConfig1->subframeAllocation.choice.oneFrame.buf= MALLOC(1);
|
|
sib2_mbsfn_SubframeConfig1->subframeAllocation.choice.oneFrame.size= 1;
|
|
sib2_mbsfn_SubframeConfig1->subframeAllocation.choice.oneFrame.bits_unused= 2;
|
|
sib2_mbsfn_SubframeConfig1->subframeAllocation.choice.oneFrame.buf[0]=(m2ap_mbms_scheduling_information->mbms_area_config_list[j].mbms_sf_config_list[j].subframe_allocation<<2);
|
|
|
|
|
|
}
|
|
|
|
ASN_SEQUENCE_ADD(&MBSFNSubframeConfigList->list,sib2_mbsfn_SubframeConfig1);
|
|
}
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
}
|
|
|
|
if(*sib13==NULL){
|
|
sib13_part = CALLOC(1,sizeof(struct LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member));
|
|
memset(sib13_part,0,sizeof(struct LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member));
|
|
sib13_part->present = LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib13_v920;
|
|
*sib13 = &sib13_part->choice.sib13_v920;
|
|
(*sib13)->notificationConfig_r9.notificationRepetitionCoeff_r9=LTE_MBMS_NotificationConfig_r9__notificationRepetitionCoeff_r9_n2;
|
|
(*sib13)->notificationConfig_r9.notificationOffset_r9=0;
|
|
(*sib13)->notificationConfig_r9.notificationSF_Index_r9=1;
|
|
|
|
// MBSFN-AreaInfoList
|
|
MBSFNArea_list= &(*sib13)->mbsfn_AreaInfoList_r9;//CALLOC(1,sizeof(*MBSFNArea_list));
|
|
memset(MBSFNArea_list,0,sizeof(*MBSFNArea_list));
|
|
|
|
for( i=0; i < m2ap_setup_resp->num_mcch_config_per_mbsfn; i++){
|
|
// MBSFN Area 1
|
|
MBSFN_Area1= CALLOC(1, sizeof(*MBSFN_Area1));
|
|
MBSFN_Area1->mbsfn_AreaId_r9= m2ap_setup_resp->mcch_config_per_mbsfn[i].mbsfn_area;
|
|
MBSFN_Area1->non_MBSFNregionLength= m2ap_setup_resp->mcch_config_per_mbsfn[i].pdcch_length;
|
|
MBSFN_Area1->notificationIndicator_r9= 0;
|
|
MBSFN_Area1->mcch_Config_r9.mcch_RepetitionPeriod_r9= m2ap_setup_resp->mcch_config_per_mbsfn[i].repetition_period;//LTE_MBSFN_AreaInfo_r9__mcch_Config_r9__mcch_RepetitionPeriod_r9_rf32;
|
|
MBSFN_Area1->mcch_Config_r9.mcch_Offset_r9= m2ap_setup_resp->mcch_config_per_mbsfn[i].offset; // in accordance with mbsfn subframe configuration in sib2
|
|
MBSFN_Area1->mcch_Config_r9.mcch_ModificationPeriod_r9= m2ap_setup_resp->mcch_config_per_mbsfn[i].modification_period;
|
|
|
|
// Subframe Allocation Info
|
|
MBSFN_Area1->mcch_Config_r9.sf_AllocInfo_r9.buf= MALLOC(1);
|
|
MBSFN_Area1->mcch_Config_r9.sf_AllocInfo_r9.size= 1;
|
|
MBSFN_Area1->mcch_Config_r9.sf_AllocInfo_r9.buf[0]=m2ap_setup_resp->mcch_config_per_mbsfn[i].subframe_allocation_info<<2; // FDD: SF1
|
|
MBSFN_Area1->mcch_Config_r9.sf_AllocInfo_r9.bits_unused= 2;
|
|
MBSFN_Area1->mcch_Config_r9.signallingMCS_r9= m2ap_setup_resp->mcch_config_per_mbsfn[i].mcs;
|
|
ASN_SEQUENCE_ADD(&MBSFNArea_list->list,MBSFN_Area1);
|
|
}
|
|
|
|
ASN_SEQUENCE_ADD(&bcch_message->message.choice.c1.choice.systemInformation.criticalExtensions.choice.systemInformation_r8.sib_TypeAndInfo.list, sib13_part);
|
|
}
|
|
|
|
|
|
//xer_fprint(stdout, &asn_DEF_LTE_BCCH_DL_SCH_Message, (void *)bcch_message);
|
|
|
|
enc_rval = uper_encode_to_buffer(&asn_DEF_LTE_BCCH_DL_SCH_Message,
|
|
NULL,
|
|
(void *)bcch_message,
|
|
buffer,
|
|
900);
|
|
AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n",
|
|
enc_rval.failed_type->name, enc_rval.encoded);
|
|
|
|
LOG_I(RRC,"[eNB] MBMS SIB2 SystemInformation Encoded %zd bits (%zd bytes)\n",enc_rval.encoded,(enc_rval.encoded+7)/8);
|
|
|
|
if (enc_rval.encoded==-1) {
|
|
msg("[RRC] ASN1 : SI encoding failed for SIB23\n");
|
|
return(-1);
|
|
}
|
|
|
|
carrier->MBMS_flag =1;
|
|
|
|
if (NODE_IS_MONOLITHIC(rrc->node_type)) {
|
|
rrc_mac_config_req_eNB(ctxt_pP->module_id, CC_id,
|
|
0,0,0,0,0,
|
|
0,
|
|
0,//rnti
|
|
(LTE_BCCH_BCH_Message_t *)NULL,
|
|
(LTE_RadioResourceConfigCommonSIB_t *) NULL,
|
|
(LTE_RadioResourceConfigCommonSIB_t *) NULL,
|
|
(struct LTE_PhysicalConfigDedicated *)NULL,
|
|
(LTE_SCellToAddMod_r10_t *)NULL,
|
|
//(struct LTE_PhysicalConfigDedicatedSCell_r10 *)NULL,
|
|
(LTE_MeasObjectToAddMod_t **) NULL,
|
|
(LTE_MAC_MainConfig_t *) NULL,
|
|
0,
|
|
(struct LTE_LogicalChannelConfig *)NULL,
|
|
(LTE_MeasGapConfig_t *) NULL,
|
|
(LTE_TDD_Config_t *) NULL,
|
|
(LTE_MobilityControlInfo_t *)NULL,
|
|
(LTE_SchedulingInfoList_t *) NULL,
|
|
0, NULL,
|
|
(LTE_AdditionalSpectrumEmission_t *)NULL,
|
|
(LTE_MBSFN_SubframeConfigList_t *) carrier->sib2->mbsfn_SubframeConfigList,
|
|
carrier->MBMS_flag,
|
|
(LTE_MBSFN_AreaInfoList_r9_t *) & carrier->sib13->mbsfn_AreaInfoList_r9,
|
|
(LTE_PMCH_InfoList_r9_t *) NULL,
|
|
(LTE_SystemInformationBlockType1_v1310_IEs_t *)NULL,
|
|
0,
|
|
(LTE_BCCH_DL_SCH_Message_MBMS_t *) NULL,
|
|
(LTE_SchedulingInfo_MBMS_r14_t *) NULL,
|
|
(struct LTE_NonMBSFN_SubframeConfig_r14 *) NULL,
|
|
(LTE_SystemInformationBlockType1_MBMS_r14_t *) NULL,
|
|
(LTE_MBSFN_AreaInfoList_r9_t *) NULL
|
|
);
|
|
}
|
|
|
|
RC.rrc[ctxt_pP->module_id]->carrier[CC_id].sizeof_SIB23 = ((enc_rval.encoded+7)/8);
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
int
|
|
rrc_eNB_process_M2AP_SETUP_RESP(
|
|
const protocol_ctxt_t *const ctxt_pP,
|
|
int CC_id,
|
|
instance_t instance,
|
|
const m2ap_setup_resp_t *const m2ap_setup_resp
|
|
)
|
|
{
|
|
//protocol_ctxt_t ctxt;
|
|
//LOG_W(RRC,"instance %d\n",instance);
|
|
|
|
AssertFatal(RC.rrc[ctxt_pP->module_id]->carrier[0].SIB23 != NULL,"Memory fo SIB23 not allocated");
|
|
AssertFatal(m2ap_setup_resp != NULL, "m2ap_setup_resp memory not allocated");
|
|
|
|
|
|
pthread_mutex_lock(&RC.rrc[ctxt_pP->module_id]->cell_info_mutex);
|
|
//RC.rrc[ctxt_pP->module_id]->carrier[CC_id].num_mbsfn_sync_area = m2ap_setup_resp->num_mcch_config_per_mbsfn;
|
|
//rrc_M2AP_do_SIB23_SIB13(ctxt_pP,ctxt_pP->module_id,CC_id,m2ap_setup_resp);
|
|
m2ap_setup_resp_g = (m2ap_setup_resp_t*)calloc(1,sizeof(m2ap_setup_resp_t));
|
|
memcpy(m2ap_setup_resp_g,m2ap_setup_resp,sizeof(m2ap_setup_resp_t));
|
|
pthread_mutex_unlock(&RC.rrc[ctxt_pP->module_id]->cell_info_mutex);
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
int
|
|
rrc_eNB_process_M2AP_MBMS_SCHEDULING_INFORMATION(
|
|
const protocol_ctxt_t *const ctxt_pP,
|
|
int CC_id,
|
|
instance_t instance,
|
|
const m2ap_mbms_scheduling_information_t *const m2ap_mbms_scheduling_information
|
|
)
|
|
{
|
|
//protocol_ctxt_t ctxt;
|
|
//LOG_W(RRC,"instance %d\n",instance);
|
|
|
|
AssertFatal(RC.rrc[ctxt_pP->module_id]->carrier[0].SIB23 != NULL,"Memory fo SIB23 not allocated");
|
|
AssertFatal(m2ap_mbms_scheduling_information != NULL, "m2ap_mbms_scheduling_information memory not allocated");
|
|
|
|
//RC.rrc[ctxt_pP->module_id]->carrier[CC_id].num_mbsfn_sync_area = m2ap_setup_resp->num_mcch_config_per_mbsfn;
|
|
|
|
pthread_mutex_lock(&RC.rrc[ctxt_pP->module_id]->cell_info_mutex);
|
|
m2ap_mbms_scheduling_information_g = (m2ap_mbms_scheduling_information_t*)calloc(1,sizeof(m2ap_mbms_scheduling_information_t));
|
|
memcpy(m2ap_mbms_scheduling_information_g,m2ap_mbms_scheduling_information,sizeof(m2ap_mbms_scheduling_information_t));
|
|
|
|
/*if(m2ap_setup_resp_g != NULL){
|
|
RC.rrc[ctxt_pP->module_id]->carrier[CC_id].num_mbsfn_sync_area = m2ap_setup_resp_g->num_mcch_config_per_mbsfn;
|
|
rrc_M2AP_do_SIB23_SIB2(ctxt_pP,ctxt_pP->module_id,CC_id,m2ap_mbms_scheduling_information);
|
|
rrc_M2AP_do_SIB23_SIB13(ctxt_pP,ctxt_pP->module_id,CC_id,m2ap_setup_resp_g);
|
|
rrc_M2AP_init_MCCH(ctxt_pP,ctxt_pP->module_id,CC_id,m2ap_mbms_scheduling_information);
|
|
rrc_M2AP_init_MBMS(ctxt_pP->module_id, CC_id, 0);
|
|
rrc_M2AP_openair_rrc_top_init_MBMS(RC.rrc[ctxt_pP->module_id]->carrier[CC_id].MBMS_flag);
|
|
}*/
|
|
MessageDef *msg_p;
|
|
msg_p = itti_alloc_new_message (TASK_RRC_ENB, M2AP_MBMS_SCHEDULING_INFORMATION_RESP);
|
|
itti_send_msg_to_task (TASK_M2AP_ENB, ENB_MODULE_ID_TO_INSTANCE(instance), msg_p);
|
|
|
|
pthread_mutex_unlock(&RC.rrc[ctxt_pP->module_id]->cell_info_mutex);
|
|
|
|
|
|
return 0;
|
|
}
|
|
|
|
int
|
|
rrc_eNB_process_M2AP_MBMS_SESSION_START_REQ(
|
|
const protocol_ctxt_t *const ctxt_pP,
|
|
int CC_id,
|
|
instance_t instance,
|
|
const m2ap_session_start_req_t *const m2ap_mbms_session_start_req
|
|
)
|
|
{
|
|
int split_cfg=0;
|
|
pthread_mutex_lock(&RC.rrc[ctxt_pP->module_id]->cell_info_mutex);
|
|
if(m2ap_setup_resp_g != NULL && m2ap_mbms_scheduling_information_g !=NULL ){
|
|
RC.rrc[ctxt_pP->module_id]->carrier[CC_id].num_mbsfn_sync_area = m2ap_setup_resp_g->num_mcch_config_per_mbsfn;
|
|
|
|
//rrc_M2AP_do_SIB1(ctxt_pP,ctxt_pP->module_id,CC_id,NULL,NULL);
|
|
if(split_cfg){
|
|
rrc_M2AP_do_SIB23_SIB2(ctxt_pP,ctxt_pP->module_id,CC_id,m2ap_mbms_scheduling_information_g);
|
|
rrc_M2AP_do_SIB23_SIB13(ctxt_pP,ctxt_pP->module_id,CC_id,m2ap_setup_resp_g);
|
|
}else{
|
|
rrc_M2AP_do_SIB23_SIB2_SIB13(ctxt_pP,ctxt_pP->module_id,CC_id,m2ap_setup_resp_g,m2ap_mbms_scheduling_information_g);
|
|
}
|
|
rrc_M2AP_init_MCCH(ctxt_pP,ctxt_pP->module_id,CC_id,m2ap_mbms_scheduling_information_g);
|
|
rrc_M2AP_init_MBMS(ctxt_pP->module_id, CC_id, 0);
|
|
rrc_M2AP_openair_rrc_top_init_MBMS(RC.rrc[ctxt_pP->module_id]->carrier[CC_id].MBMS_flag);
|
|
}
|
|
pthread_mutex_unlock(&RC.rrc[ctxt_pP->module_id]->cell_info_mutex);
|
|
|
|
MessageDef *msg_p;
|
|
msg_p = itti_alloc_new_message (TASK_RRC_ENB, M2AP_MBMS_SESSION_START_RESP);
|
|
itti_send_msg_to_task (TASK_M2AP_ENB, ENB_MODULE_ID_TO_INSTANCE(instance), msg_p);
|
|
|
|
return 0;
|
|
}
|
|
|
|
int
|
|
rrc_eNB_process_M2AP_MBMS_SESSION_STOP_REQ(
|
|
const protocol_ctxt_t *const ctxt_pP,
|
|
const m2ap_session_stop_req_t *const m2ap_session_stop_req
|
|
)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
int
|
|
rrc_eNB_process_M2AP_RESET(
|
|
const protocol_ctxt_t *const ctxt_pP,
|
|
const m2ap_reset_t *const m2ap_reset
|
|
)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
int
|
|
rrc_eNB_process_M2AP_ENB_CONFIGURATION_UPDATE_ACK(
|
|
const protocol_ctxt_t *const ctxt_pP,
|
|
const m2ap_enb_configuration_update_ack_t *const m2ap_enb_configuration_update_ack
|
|
)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
int
|
|
rrc_eNB_process_M2AP_ERROR_INDICATION(
|
|
const protocol_ctxt_t *const ctxt_pP,
|
|
const m2ap_error_indication_t *const m2ap_error_indication
|
|
)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
int
|
|
rrc_eNB_process_M2AP_MBMS_SERVICE_COUNTING_REQ(
|
|
const protocol_ctxt_t *const ctxt_pP,
|
|
const m2ap_mbms_service_counting_req_t *const m2ap_mbms_service_counting_req
|
|
)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
int
|
|
rrc_eNB_process_M2AP_MCE_CONFIGURATION_UPDATE(
|
|
const protocol_ctxt_t *const ctxt_pP,
|
|
const m2ap_mce_configuration_update_t *const m2ap_mce_configuration_update
|
|
)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
void rrc_eNB_send_M2AP_MBMS_SCHEDULING_INFORMATION_RESP(
|
|
const protocol_ctxt_t *const ctxt_pP
|
|
//,const rrc_eNB_mbms_context_t *const rrc_eNB_mbms_context
|
|
)
|
|
{
|
|
MessageDef *msg_p;
|
|
msg_p = itti_alloc_new_message (TASK_RRC_ENB, M2AP_MBMS_SCHEDULING_INFORMATION_RESP);
|
|
itti_send_msg_to_task (TASK_M2AP_ENB, ENB_MODULE_ID_TO_INSTANCE(ctxt_pP->instance), msg_p);
|
|
}
|
|
|
|
void rrc_eNB_send_M2AP_MBMS_SESSION_START_RESP(
|
|
const protocol_ctxt_t *const ctxt_pP
|
|
//,const rrc_eNB_mbms_context_t *const rrc_eNB_mbms_context
|
|
)
|
|
{
|
|
MessageDef *msg_p;
|
|
msg_p = itti_alloc_new_message (TASK_RRC_ENB, M2AP_MBMS_SESSION_START_RESP);
|
|
itti_send_msg_to_task (TASK_M2AP_ENB, ENB_MODULE_ID_TO_INSTANCE(ctxt_pP->instance), msg_p);
|
|
}
|
|
|
|
void rrc_eNB_send_M2AP_MBMS_SESSION_STOP_RESP(
|
|
const protocol_ctxt_t *const ctxt_pP
|
|
//,const rrc_eNB_mbms_context_t *const rrc_eNB_mbms_context
|
|
)
|
|
{
|
|
MessageDef *msg_p;
|
|
msg_p = itti_alloc_new_message (TASK_RRC_ENB, M2AP_MBMS_SESSION_STOP_RESP);
|
|
itti_send_msg_to_task (TASK_M2AP_ENB, ENB_MODULE_ID_TO_INSTANCE(ctxt_pP->instance), msg_p);
|
|
}
|
|
|
|
void rrc_eNB_send_M2AP_MBMS_SESSION_UPDATE_RESP(
|
|
const protocol_ctxt_t *const ctxt_pP
|
|
//,const rrc_eNB_mbms_context_t *const rrc_eNB_mbms_context
|
|
)
|
|
{
|
|
MessageDef *msg_p;
|
|
msg_p = itti_alloc_new_message (TASK_RRC_ENB, M2AP_MBMS_SESSION_UPDATE_RESP);
|
|
itti_send_msg_to_task (TASK_M2AP_ENB, ENB_MODULE_ID_TO_INSTANCE(ctxt_pP->instance), msg_p);
|
|
}
|