Files
openairinterface5g/openair2/M2AP/m2ap_MCE_interface_management.c
T
Javier Morgade ab04e0e469 M2AP 3GPP TS 36.443 interface implemented:
1.MCE (Multicast Control Entity) entity developed (new dedicated task developed: TASK_MCE_APP)
	2.eNB side M2 interface procedures (new dedicated task developed: TASK_M2AP_ENB)
	3.MCE side M2 interface procedures (new dedicated task developed: TASK_M2AP_MCE)
	4.ASN1 bindings for m2ap-14.0.0.asn1 implemented and tested
	5.MCE config parameters

	ACKNOWLEDGEMENT:
 	1. This commit was developed at Vicomtech (https://www.vicomtech.org) under UE project CDN-X-ALL: "CDN edge-cloud computing for efficient cache and reliable streaming aCROSS Aggregated unicast-multicast LinkS"
 	2. Project funded by Fed4FIRE+ OC5 (https://www.fed4fire.eu)

	Signed-off-by: Javier Morgade <javier.morgade@ieee.org>
2019-09-14 13:45:27 +02:00

1906 lines
93 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 m2ap_MCE_interface_management.c
* \brief m2ap interface management for MCE
* \author Javier Morgade
* \date 2019
* \version 0.1
* \company Vicomtech
* \email: javier.morgade@ieee.org
* \note
* \warning
*/
#include "m2ap_common.h"
#include "m2ap_encoder.h"
#include "m2ap_decoder.h"
#include "m2ap_itti_messaging.h"
#include "m2ap_MCE_interface_management.h"
#include "conversions.h"
extern m2ap_setup_req_t *m2ap_mce_data_from_enb;
/*
* MBMS Session start
*/
int MCE_send_MBMS_SESSION_START_REQUEST(instance_t instance/*, uint32_t assoc_id*/,m2ap_session_start_req_t* m2ap_session_start_req){
//AssertFatal(1==0,"Not implemented yet\n");
//module_id_t enb_mod_idP=0;
//module_id_t du_mod_idP=0;
M2AP_M2AP_PDU_t pdu;
M2AP_SessionStartRequest_t *out;
M2AP_SessionStartRequest_Ies_t *ie;
uint8_t *buffer;
uint32_t len;
//int i=0;
//int j=0;
/* Create */
/* 0. pdu Type */
memset(&pdu, 0, sizeof(pdu));
pdu.present = M2AP_M2AP_PDU_PR_initiatingMessage;
//pdu.choice.initiatingMessage = (M2AP_InitiatingMessage_t *)calloc(1, sizeof(M2AP_InitiatingMessage_t));
pdu.choice.initiatingMessage.procedureCode = M2AP_ProcedureCode_id_sessionStart;
pdu.choice.initiatingMessage.criticality = M2AP_Criticality_reject;
pdu.choice.initiatingMessage.value.present = M2AP_InitiatingMessage__value_PR_SessionStartRequest;
out = &pdu.choice.initiatingMessage.value.choice.SessionStartRequest;
/* mandatory */
/* c1. MCE_MBMS_M2AP_ID (integer value) */ //long
ie = (M2AP_SessionStartRequest_Ies_t *)calloc(1, sizeof(M2AP_SessionStartRequest_Ies_t));
ie->id = M2AP_ProtocolIE_ID_id_MCE_MBMS_M2AP_ID;
ie->criticality = M2AP_Criticality_reject;
ie->value.present = M2AP_SessionStartRequest_Ies__value_PR_MCE_MBMS_M2AP_ID;
//ie->value.choice.MCE_MBMS_M2AP_ID = /*F1AP_get_next_transaction_identifier(enb_mod_idP, du_mod_idP);*/ //?
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
/* mandatory */
/* c2. TMGI (integrer value) */
ie = (M2AP_SessionStartRequest_Ies_t *)calloc(1, sizeof(M2AP_SessionStartRequest_Ies_t));
ie->id = M2AP_ProtocolIE_ID_id_TMGI;
ie->criticality = M2AP_Criticality_reject;
ie->value.present = M2AP_SessionStartRequest_Ies__value_PR_TMGI;
MCC_MNC_TO_PLMNID(0,0,3,&ie->value.choice.TMGI.pLMNidentity);/*instance_p->mcc, instance_p->mnc, instance_p->mnc_digit_length,*/
uint8_t TMGI[5] = {4,3,2,1,0};
OCTET_STRING_fromBuf(&ie->value.choice.TMGI.serviceID,(const char*)&TMGI[2],3);
//&ie->choice.TMGI.pLMN_Identity);
//INT16_TO_OCTET_STRING(0,&ie->choice.TMGI.serviceId);
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
/* mandatory */
/* c3. MBMS_Session_ID (integrer value) */ //OCTET_STRING
if(0){
ie = (M2AP_SessionStartRequest_Ies_t *)calloc(1, sizeof(M2AP_SessionStartRequest_Ies_t));
ie->id = M2AP_ProtocolIE_ID_id_MBMS_Session_ID;
ie->criticality = M2AP_Criticality_reject;
ie->value.present = M2AP_SessionStartRequest_Ies__value_PR_MBMS_Session_ID;
//INT16_TO_OCTET_STRING(0,&ie->choice.MBMS_Session_ID);
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
}
/* mandatory */
/* c5. MBMS_Service_Area (integrer value) */ //OCTET_STRING
ie = (M2AP_SessionStartRequest_Ies_t *)calloc(1, sizeof(M2AP_SessionStartRequest_Ies_t));
ie->id = M2AP_ProtocolIE_ID_id_MBMS_Service_Area;
ie->criticality = M2AP_Criticality_reject;
ie->value.present = M2AP_SessionStartRequest_Ies__value_PR_MBMS_Service_Area;
//OCTET_STRING_fromBuf(&ie->value.choice.MBMS_Service_Area, m2ap_setup_resp->MCEname,
//strlen(m2ap_setup_resp->MCEname));
//INT16_TO_OCTET_STRING(0,&ie->choice.TMGI.serviceId);
ie->value.choice.MBMS_Service_Area.buf = calloc(3,sizeof(uint8_t));
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
/* mandatory */
/* c6. TNL_Information (integrer value) */
ie = (M2AP_SessionStartRequest_Ies_t *)calloc(1, sizeof(M2AP_SessionStartRequest_Ies_t));
ie->id = M2AP_ProtocolIE_ID_id_TNL_Information;
ie->criticality = M2AP_Criticality_reject;
ie->value.present = M2AP_SessionStartRequest_Ies__value_PR_TNL_Information;
//ie->value.choice.TNL_Information.iPMCAddress.buf = calloc(4,sizeof(uint8_t));
//ie->value.choice.TNL_Information.iPSourceAddress.buf = calloc(4,sizeof(uint8_t));
//TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(1234,&ie->value.choice.TNL_Information.iPMCAddress);
//TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(1234,&ie->value.choice.TNL_Information.iPSourceAddress);
OCTET_STRING_fromBuf(&ie->value.choice.TNL_Information.gTP_TEID, "1204",strlen("1234"));
OCTET_STRING_fromBuf(&ie->value.choice.TNL_Information.iPMCAddress, "1204",strlen("1234"));
OCTET_STRING_fromBuf(&ie->value.choice.TNL_Information.iPSourceAddress, "1204",strlen("1234"));
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
if(0){
// /* optional */
// /* c7. TNL_Information_1 (integrer value) */
// ie = (M2AP_SessionStartRequest_Ies_t *)calloc(1, sizeof(M2AP_SessionStartRequest_Ies_t));
// ie->id = M2AP_ProtocolIE_ID_id_TNL_Information_1;
// ie->criticality = M2AP_Criticality_reject;
// ie->value.present = M2AP_SessionStartRequest_Ies__value_PR_TNL_Information_1;
// //asn_int642INTEGER(&ie->value.choice.MBMS_Session_ID, f1ap_du_data->MBMS_Session_ID); //?
// ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
}
/* encode */
if (m2ap_encode_pdu(&pdu,&buffer,&len) < 0){
return -1;
}
//MCE_m2ap_itti_send_sctp_data_req(instance, m2ap_mce_data_from_mce->assoid,buffer,len,0);
m2ap_MCE_itti_send_sctp_data_req(instance,m2ap_mce_data_from_enb->assoc_id,buffer,len,0);
return 0;
}
int MCE_handle_MBMS_SESSION_START_RESPONSE(instance_t instance,
uint32_t assoc_id,
uint32_t stream,
M2AP_M2AP_PDU_t *pdu){
//AssertFatal(1==0,"Not implemented yet\n");
LOG_D(M2AP, "MCE_handle_MBMS_SESSION_START_RESPONSE\n");
AssertFatal(pdu->present == M2AP_M2AP_PDU_PR_successfulOutcome,
"pdu->present != M2AP_M2AP_PDU_PR_successfulOutcome\n");
AssertFatal(pdu->choice.successfulOutcome.procedureCode == M2AP_ProcedureCode_id_sessionStart,
"pdu->choice.successfulOutcome->procedureCode != M2AP_ProcedureCode_id_sessionStart\n");
AssertFatal(pdu->choice.successfulOutcome.criticality == M2AP_Criticality_reject,
"pdu->choice.successfulOutcome->criticality != M2AP_Criticality_reject\n");
AssertFatal(pdu->choice.successfulOutcome.value.present == M2AP_SuccessfulOutcome__value_PR_SessionStartResponse,
"pdu->choice.successfulOutcome.value.present != M2AP_SuccessfulOutcome__value_PR_SessionStartResponse\n");
M2AP_SessionStartResponse_t *in = &pdu->choice.successfulOutcome.value.choice.SessionStartResponse;
M2AP_SessionStartResponse_Ies_t *ie;
int MCE_MBMS_M2AP_ID=-1;
int ENB_MBMS_M2AP_ID=-1;
MessageDef *msg_g = itti_alloc_new_message(TASK_M2AP_MCE,M2AP_MBMS_SESSION_START_RESP); //TODO
LOG_D(M2AP, "M2AP: SessionStart-Resp: protocolIEs.list.count %d\n",
in->protocolIEs.list.count);
for (int i=0;i < in->protocolIEs.list.count; i++) {
ie = in->protocolIEs.list.array[i];
switch (ie->id) {
case M2AP_ProtocolIE_ID_id_MCE_MBMS_M2AP_ID:
AssertFatal(ie->criticality == M2AP_Criticality_reject,
"ie->criticality != M2AP_Criticality_reject\n");
AssertFatal(ie->value.present == M2AP_SessionStartResponse_Ies__value_PR_MCE_MBMS_M2AP_ID,
"ie->value.present != M2AP_sessionStartResponse_IEs__value_PR_MCE_MBMS_M2AP_ID\n");
MCE_MBMS_M2AP_ID=ie->value.choice.MCE_MBMS_M2AP_ID;
LOG_D(M2AP, "M2AP: SessionStart-Resp: MCE_MBMS_M2AP_ID %d\n",
MCE_MBMS_M2AP_ID);
break;
case M2AP_ProtocolIE_ID_id_ENB_MBMS_M2AP_ID:
AssertFatal(ie->criticality == M2AP_Criticality_reject,
"ie->criticality != M2AP_Criticality_reject\n");
AssertFatal(ie->value.present == M2AP_SessionStartResponse_Ies__value_PR_ENB_MBMS_M2AP_ID,
"ie->value.present != M2AP_sessionStartResponse_Ies__value_PR_ENB_MBMS_M2AP_ID\n");
ENB_MBMS_M2AP_ID=ie->value.choice.ENB_MBMS_M2AP_ID;
LOG_D(M2AP, "M2AP: SessionStart-Resp: ENB_MBMS_M2AP_ID %d\n",
ENB_MBMS_M2AP_ID);
break;
}
}
AssertFatal(MCE_MBMS_M2AP_ID!=-1,"MCE_MBMS_M2AP_ID was not sent\n");
AssertFatal(ENB_MBMS_M2AP_ID!=-1,"ENB_MBMS_M2AP_ID was not sent\n");
//M2AP_SESSION_START_RESP(msg_p).
// MSC_LOG_RX_MESSAGE(
// MSC_M2AP_MCE,
// MSC_M2AP_ENB,
//return 0;
// 0,
// 0,
// MSC_AS_TIME_FMT" MCE_handle_M2_SESSION_START_RESPONSE successfulOutcome assoc_id %d",
// 0,0,//MSC_AS_TIME_ARGS(ctxt_pP),
// assoc_id);
//
LOG_D(M2AP, "Sending M2AP_SESSION_START_RESP ITTI message to ENB_APP with assoc_id (%d->%d)\n",
assoc_id,ENB_MODULE_ID_TO_INSTANCE(assoc_id));
itti_send_msg_to_task(TASK_MCE_APP, ENB_MODULE_ID_TO_INSTANCE(assoc_id), msg_g);
return 0;
}
int MCE_handle_MBMS_SESSION_START_FAILURE(instance_t instance,
uint32_t assoc_id,
uint32_t stream,
M2AP_M2AP_PDU_t *pdu){
AssertFatal(1==0,"Not implemented yet\n");
}
/*
* MBMS Session stop
*/
int MCE_send_MBMS_SESSION_STOP_REQUEST(instance_t instance, m2ap_session_stop_req_t* m2ap_session_stop_req){
// module_id_t enb_mod_idP=0;
//module_id_t du_mod_idP=0;
M2AP_M2AP_PDU_t pdu;
M2AP_SessionStopRequest_t *out;
M2AP_SessionStopRequest_Ies_t *ie;
uint8_t *buffer;
uint32_t len;
//int i=0;
//int j=0;
/* Create */
/* 0. pdu Type */
memset(&pdu, 0, sizeof(pdu));
pdu.present = M2AP_M2AP_PDU_PR_initiatingMessage;
//pdu.choice.initiatingMessage = (M2AP_InitiatingMessage_t *)calloc(1, sizeof(M2AP_InitiatingMessage_t));
pdu.choice.initiatingMessage.procedureCode = M2AP_ProcedureCode_id_sessionStop;
pdu.choice.initiatingMessage.criticality = M2AP_Criticality_reject;
pdu.choice.initiatingMessage.value.present = M2AP_InitiatingMessage__value_PR_SessionStopRequest;
out = &pdu.choice.initiatingMessage.value.choice.SessionStopRequest;
/* mandatory */
/* c1. MCE_MBMS_M2AP_ID (integer value) */ //long
ie = (M2AP_SessionStopRequest_Ies_t *)calloc(1, sizeof(M2AP_SessionStopRequest_Ies_t));
ie->id = M2AP_ProtocolIE_ID_id_MCE_MBMS_M2AP_ID;
ie->criticality = M2AP_Criticality_reject;
ie->value.present = M2AP_SessionStopRequest_Ies__value_PR_MCE_MBMS_M2AP_ID;
ie->value.choice.MCE_MBMS_M2AP_ID = /*F1AP_get_next_transaction_identifier(enb_mod_idP, du_mod_idP);*/ //?
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
/* mandatory */
/* c2. ENB_MBMS_M2AP_ID (integer value) */ //long
ie = (M2AP_SessionStopRequest_Ies_t *)calloc(1, sizeof(M2AP_SessionStopRequest_Ies_t));
ie->id = M2AP_ProtocolIE_ID_id_ENB_MBMS_M2AP_ID;
ie->criticality = M2AP_Criticality_reject;
ie->value.present = M2AP_SessionStopRequest_Ies__value_PR_ENB_MBMS_M2AP_ID;
ie->value.choice.ENB_MBMS_M2AP_ID = /*F1AP_get_next_transaction_identifier(enb_mod_idP, du_mod_idP);*/ //?
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
/* encode */
if (m2ap_encode_pdu(&pdu,&buffer,&len) < 0){
return -1;
}
//MCE_m2ap_itti_send_sctp_data_req(instance, m2ap_mce_data_from_mce->assoid,buffer,len,0);
m2ap_MCE_itti_send_sctp_data_req(instance, m2ap_mce_data_from_enb->assoc_id,buffer,len,0);
return 0;
}
int MCE_handle_MBMS_SESSION_STOP_RESPONSE(instance_t instance,
uint32_t assoc_id,
uint32_t stream,
M2AP_M2AP_PDU_t *pdu){
//AssertFatal(1==0,"Not implemented yet\n");
LOG_D(M2AP, "MCE_handle_MBMS_SESSION_STOP_RESPONSE\n");
AssertFatal(pdu->present == M2AP_M2AP_PDU_PR_successfulOutcome,
"pdu->present != M2AP_M2AP_PDU_PR_successfulOutcome\n");
AssertFatal(pdu->choice.successfulOutcome.procedureCode == M2AP_ProcedureCode_id_sessionStop,
"pdu->choice.successfulOutcome->procedureCode != M2AP_ProcedureCode_id_sessionStop\n");
AssertFatal(pdu->choice.successfulOutcome.criticality == M2AP_Criticality_reject,
"pdu->choice.successfulOutcome->criticality != M2AP_Criticality_reject\n");
AssertFatal(pdu->choice.successfulOutcome.value.present == M2AP_SuccessfulOutcome__value_PR_SessionStopResponse,
"pdu->choice.successfulOutcome->value.present != M2AP_SuccessfulOutcome__value_PR_SessionStopResponse\n");
M2AP_SessionStopResponse_t *in = &pdu->choice.successfulOutcome.value.choice.SessionStopResponse;
M2AP_SessionStopResponse_Ies_t *ie;
int MCE_MBMS_M2AP_ID=-1;
int ENB_MBMS_M2AP_ID=-1;
MessageDef *msg_g = itti_alloc_new_message(TASK_M2AP_MCE,M2AP_MBMS_SESSION_STOP_RESP); //TODO
LOG_D(M2AP, "M2AP: SessionStop-Resp: protocolIEs.list.count %d\n",
in->protocolIEs.list.count);
for (int i=0;i < in->protocolIEs.list.count; i++) {
ie = in->protocolIEs.list.array[i];
switch (ie->id) {
case M2AP_ProtocolIE_ID_id_MCE_MBMS_M2AP_ID:
AssertFatal(ie->criticality == M2AP_Criticality_reject,
"ie->criticality != M2AP_Criticality_reject\n");
AssertFatal(ie->value.present == M2AP_SessionStopResponse_Ies__value_PR_MCE_MBMS_M2AP_ID,
"ie->value.present != M2AP_SessionStopResponse_Ies__value_PR_MCE_MBMS_M2AP_ID\n");
MCE_MBMS_M2AP_ID=ie->value.choice.MCE_MBMS_M2AP_ID;
LOG_D(M2AP, "M2AP: SessionStop-Resp: MCE_MBMS_M2AP_ID %d\n",
MCE_MBMS_M2AP_ID);
break;
case M2AP_ProtocolIE_ID_id_ENB_MBMS_M2AP_ID:
AssertFatal(ie->criticality == M2AP_Criticality_reject,
"ie->criticality != M2AP_Criticality_reject\n");
AssertFatal(ie->value.present == M2AP_SessionStopResponse_Ies__value_PR_ENB_MBMS_M2AP_ID,
"ie->value.present != M2AP_SessionStopResponse_Ies__value_PR_ENB_MBMS_M2AP_ID\n");
ENB_MBMS_M2AP_ID=ie->value.choice.ENB_MBMS_M2AP_ID;
LOG_D(M2AP, "M2AP: SessionStop-Resp: ENB_MBMS_M2AP_ID %d\n",
ENB_MBMS_M2AP_ID);
break;
}
}
AssertFatal(MCE_MBMS_M2AP_ID!=-1,"MCE_MBMS_M2AP_ID was not sent\n");
AssertFatal(ENB_MBMS_M2AP_ID!=-1,"ENB_MBMS_M2AP_ID was not sent\n");
// M2AP_SESSION_STOP_RESP(msg_p).
// MSC_LOG_RX_MESSAGE(
// MSC_M2AP_MCE,
// MSC_M2AP_ENB,
// 0,
// 0,
// MSC_AS_TIME_FMT" MCE_handle_M2_SESSION_STOP_RESPONSE successfulOutcome assoc_id %d",
// 0,0,//MSC_AS_TIME_ARGS(ctxt_pP),
// assoc_id);
// LOG_D(M2AP, "Sending M2AP_SESSION_START_RESP ITTI message to ENB_APP with assoc_id (%d->%d)\n",
// assoc_id,ENB_MODULE_ID_TO_INSTANCE(assoc_id));
itti_send_msg_to_task(TASK_MCE_APP, ENB_MODULE_ID_TO_INSTANCE(assoc_id), msg_g);
//
return 0;
}
int MCE_handle_MBMS_SESSION_STOP_FAILURE(instance_t instance,
uint32_t assoc_id,
uint32_t stream,
M2AP_M2AP_PDU_t *pdu){
AssertFatal(1==0,"Not implemented yet\n");
}
typedef struct M2AP_MBSFN_Area_Configuration{
M2AP_PMCH_Configuration_List_t PMCH_Configuration_List;
M2AP_MBSFN_Subframe_ConfigurationList_t MBSFN_Subframe_ConfigurationList;
M2AP_Common_Subframe_Allocation_Period_t Common_Subframe_Allocation_Period;
M2AP_MBSFN_Area_ID_t MBSFN_Area_ID;
M2AP_MBMS_Suspension_Notification_List_t MBMS_Suspension_Notification_List;
}M2AP_MBSFN_Area_Configuration_t;
/*
* MBMS Scheduling Information
*/
uint8_t m2ap_message[] = {0x00, 0x02, 0x00, 0x3a, 0x00, 0x00, 0x02, 0x00, 0x19, 0x00, 0x01, 0x00, 0x00,
0x0a, 0x00, 0x2e, 0x00, 0x00, 0x04, 0x00, 0x0b, 0x00, 0x12, 0x10, 0x00, 0x0c,
0x00, 0x0d, 0x00, 0x00, 0x3f, 0x13, 0x00, 0x00, 0x00, 0xf1, 0x10, 0x00, 0x00,
0x01, 0x08, 0x00, 0x16, 0x00, 0x07, 0x00, 0x00, 0x17, 0x00, 0x02, 0x00, 0x40,
0x00, 0x18, 0x00, 0x01, 0x80, 0x00, 0x1d, 0x00, 0x01, 0x01};
int MCE_send_MBMS_SCHEDULING_INFORMATION(instance_t instance, /*uint32_t assoc_id,*/m2ap_mbms_scheduling_information_t * m2ap_mbms_scheduling_information){
//module_id_t enb_mod_idP=0;
//module_id_t du_mod_idP=0;
M2AP_M2AP_PDU_t pdu;
M2AP_MbmsSchedulingInformation_t *out;
M2AP_MbmsSchedulingInformation_Ies_t *ie;
uint8_t *buffer/*,*buffer2*/;
uint32_t len/*,len2*/;
int i=0;
int j=0;
int k=0;
//int l=0;
//int l=0;
/* Create */
/* 0. pdu Type */
memset(&pdu, 0, sizeof(pdu));
pdu.present = M2AP_M2AP_PDU_PR_initiatingMessage;
//pdu.choice.initiatingMessage = (M2AP_InitiatingMessage_t *)calloc(1, sizeof(M2AP_InitiatingMessage_t));
pdu.choice.initiatingMessage.procedureCode = M2AP_ProcedureCode_id_mbmsSchedulingInformation;
pdu.choice.initiatingMessage.criticality = M2AP_Criticality_reject;
pdu.choice.initiatingMessage.value.present = M2AP_InitiatingMessage__value_PR_MbmsSchedulingInformation;
out = &pdu.choice.initiatingMessage.value.choice.MbmsSchedulingInformation;
/* mandatory */
/* c1. MCCH_Update_Time */ //long
ie=(M2AP_MbmsSchedulingInformation_Ies_t*)calloc(1,sizeof(M2AP_MbmsSchedulingInformation_Ies_t));
ie->id = M2AP_ProtocolIE_ID_id_MCCH_Update_Time;
ie->criticality = M2AP_Criticality_reject;
ie->value.present = M2AP_MbmsSchedulingInformation_Ies__value_PR_MCCH_Update_Time;
//ie->value.choice.MCCH_Update_Time = ;
ie->value.choice.MCCH_Update_Time = m2ap_mbms_scheduling_information->mcch_update_time;
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
/* mandatory */
/* c2. MBSFN_Area_Configuration_List */ //long
ie=(M2AP_MbmsSchedulingInformation_Ies_t*)calloc(1,sizeof(M2AP_MbmsSchedulingInformation_Ies_t));
ie->id = M2AP_ProtocolIE_ID_id_MBSFN_Area_Configuration_List;
ie->criticality = M2AP_Criticality_reject;
ie->value.present = M2AP_MbmsSchedulingInformation_Ies__value_PR_MBSFN_Area_Configuration_List;
for(i=0; i < m2ap_mbms_scheduling_information->num_mbms_area_config_list; i++){
M2AP_MBSFN_Area_Configuration_List_t * m2ap_mbsfn_area_configuration_list = (M2AP_MBSFN_Area_Configuration_List_t*)calloc(1,sizeof(M2AP_MBSFN_Area_Configuration_List_t));
/*M2AP_MBSFN_Area_Configuration_Item_t*/
M2AP_MBSFN_Area_Configuration_Item_t *mbsfn_area_configuration_item_ie;
mbsfn_area_configuration_item_ie =(M2AP_MBSFN_Area_Configuration_Item_t*)calloc(1,sizeof(M2AP_MBSFN_Area_Configuration_Item_t));
mbsfn_area_configuration_item_ie->id = M2AP_ProtocolIE_ID_id_PMCH_Configuration_List;
mbsfn_area_configuration_item_ie->criticality = M2AP_Criticality_reject;
mbsfn_area_configuration_item_ie->value.present = M2AP_MBSFN_Area_Configuration_Item__value_PR_PMCH_Configuration_List;
for(j=0; j < m2ap_mbms_scheduling_information->mbms_area_config_list[i].num_pmch_config_list; j++){
M2AP_PMCH_Configuration_ItemIEs_t * pmch_configuration_item_ies = (M2AP_PMCH_Configuration_ItemIEs_t*)calloc(1,sizeof(M2AP_PMCH_Configuration_ItemIEs_t));
pmch_configuration_item_ies->id = M2AP_ProtocolIE_ID_id_PMCH_Configuration_Item;
pmch_configuration_item_ies->criticality = M2AP_Criticality_reject;
pmch_configuration_item_ies->value.present = M2AP_PMCH_Configuration_ItemIEs__value_PR_PMCH_Configuration_Item;
M2AP_PMCH_Configuration_Item_t * pmch_configuration_item = (M2AP_PMCH_Configuration_Item_t*)calloc(1,sizeof(M2AP_PMCH_Configuration_Item_t));
pmch_configuration_item = &pmch_configuration_item_ies->value.choice.PMCH_Configuration_Item;
{
pmch_configuration_item->pmch_Configuration.dataMCS = m2ap_mbms_scheduling_information->mbms_area_config_list[i].pmch_config_list[j].data_mcs;
pmch_configuration_item->pmch_Configuration.mchSchedulingPeriod = m2ap_mbms_scheduling_information->mbms_area_config_list[i].pmch_config_list[j].mch_scheduling_period;
pmch_configuration_item->pmch_Configuration.allocatedSubframesEnd = m2ap_mbms_scheduling_information->mbms_area_config_list[i].pmch_config_list[j].allocated_sf_end;
for(k=0; k < m2ap_mbms_scheduling_information->mbms_area_config_list[i].pmch_config_list[j].num_mbms_session_list; k++){
MBMSsessionListPerPMCH_Item__Member *member;
member = (MBMSsessionListPerPMCH_Item__Member*)calloc(1,sizeof(MBMSsessionListPerPMCH_Item__Member));
MCC_MNC_TO_PLMNID(
m2ap_mbms_scheduling_information->mbms_area_config_list[i].pmch_config_list[j].mbms_session_list[k].mcc,
m2ap_mbms_scheduling_information->mbms_area_config_list[i].pmch_config_list[j].mbms_session_list[k].mnc,
m2ap_mbms_scheduling_information->mbms_area_config_list[i].pmch_config_list[j].mbms_session_list[k].mnc_length
,&member->tmgi.pLMNidentity);
//INT16_TO_OCTET_STRING(0,&imember->tmgi);
char buf[4];
INT32_TO_BUFFER(m2ap_mbms_scheduling_information->mbms_area_config_list[i].pmch_config_list[j].mbms_session_list[k].service_id,buf);
//uint8_t TMGI[5] = {4,3,2,1,0};
OCTET_STRING_fromBuf(&member->tmgi.serviceID,(const char*)&buf[1],3);
//LOG_D(M2AP,"%p,%p,%p,%li,%ld,%ld\n",pmch_configuration_item,&pmch_configuration_item->mbms_Session_List.list,member, m2ap_mbms_scheduling_information->mbms_area_config_list[i].pmch_config_list[j].mbms_session_list[k].lcid,sizeof(member->lcid),sizeof(m2ap_mbms_scheduling_information->mbms_area_config_list[i].pmch_config_list[j].mbms_session_list[k].lcid));
//long kk = m2ap_mbms_scheduling_information->mbms_area_config_list[i].pmch_config_list[j].mbms_session_list[k].lcid;
//uint64_t kk=(m2ap_mbms_scheduling_information->mbms_area_config_list[i].pmch_config_list[j].mbms_session_list[k].lcid);
//memcpy(&member->lcid,&m2ap_mbms_scheduling_information->mbms_area_config_list[i].pmch_config_list[j].mbms_session_list[k].lcid,sizeof(member->lcid));
// member->lcid = 1;
// for( l=2; l < 28;l++)
// LOG_E(M2AP,"%di\n",l);
// if(l == m2ap_mbms_scheduling_information->mbms_area_config_list[i].pmch_config_list[j].mbms_session_list[k].lcid){
// member->lcid++;//m2ap_mbms_scheduling_information->mbms_area_config_list[i].pmch_config_list[j].mbms_session_list[k].service_id;
// break;
// }
member->lcid = m2ap_mbms_scheduling_information->mbms_area_config_list[i].pmch_config_list[j].mbms_session_list[k].lcid;
//member->lcid = (M2AP_LCID_t*)calloc(1,sizeof(M2AP_LCID_t));
ASN_SEQUENCE_ADD(&pmch_configuration_item->mbms_Session_List.list,member);
}
}
/*M2AP_MBSFN_Subframe_ConfigurationList_t*/
// M2AP_MBSFN_Area_Configuration_Item_t *mbsfn_area_configuration_item_ie2;
//(mbsfn_area_configuration_item_ie+1) =(M2AP_MBSFN_Area_Configuration_Item_t*)calloc(1,sizeof(M2AP_MBSFN_Area_Configuration_Item_t));
ASN_SEQUENCE_ADD(&mbsfn_area_configuration_item_ie->value.choice.PMCH_Configuration_List.list,pmch_configuration_item_ies);
}
ASN_SEQUENCE_ADD(m2ap_mbsfn_area_configuration_list,mbsfn_area_configuration_item_ie);
/*M2AP_MBSFN_Area_Configuration_Item_t*/
M2AP_MBSFN_Area_Configuration_Item_t *mbsfn_area_configuration_item_ie_1;
mbsfn_area_configuration_item_ie_1 =(M2AP_MBSFN_Area_Configuration_Item_t*)calloc(1,sizeof(M2AP_MBSFN_Area_Configuration_Item_t));
(mbsfn_area_configuration_item_ie_1)->id = M2AP_ProtocolIE_ID_id_MBSFN_Subframe_Configuration_List;
(mbsfn_area_configuration_item_ie_1)->criticality = M2AP_Criticality_reject;
(mbsfn_area_configuration_item_ie_1)->value.present = M2AP_MBSFN_Area_Configuration_Item__value_PR_MBSFN_Subframe_ConfigurationList;
for(j=0; j < m2ap_mbms_scheduling_information->mbms_area_config_list[i].num_mbms_sf_config_list; j++){
M2AP_MBSFN_Subframe_ConfigurationItem_t * mbsfn_subframe_configuration_item_ies = (M2AP_MBSFN_Subframe_ConfigurationItem_t*)calloc(1,sizeof(M2AP_MBSFN_Subframe_ConfigurationItem_t));
mbsfn_subframe_configuration_item_ies->id = M2AP_ProtocolIE_ID_id_MBSFN_Subframe_Configuration_Item;
mbsfn_subframe_configuration_item_ies->criticality = M2AP_Criticality_reject;
mbsfn_subframe_configuration_item_ies->value.present = M2AP_MBSFN_Subframe_ConfigurationItem__value_PR_MBSFN_Subframe_Configuration;
M2AP_MBSFN_Subframe_Configuration_t * mbsfn_subframe_configuration = (M2AP_MBSFN_Subframe_Configuration_t*)calloc(1,sizeof(M2AP_MBSFN_Subframe_Configuration_t));
mbsfn_subframe_configuration = &mbsfn_subframe_configuration_item_ies->value.choice.MBSFN_Subframe_Configuration;
{
mbsfn_subframe_configuration->radioframeAllocationPeriod = m2ap_mbms_scheduling_information->mbms_area_config_list[i].mbms_sf_config_list[j].radioframe_allocation_period;
mbsfn_subframe_configuration->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_subframe_configuration->subframeAllocation.present = M2AP_MBSFN_Subframe_Configuration__subframeAllocation_PR_fourFrames;
mbsfn_subframe_configuration->subframeAllocation.choice.oneFrame.buf = MALLOC(3);
mbsfn_subframe_configuration->subframeAllocation.choice.oneFrame.buf[2] = ((m2ap_mbms_scheduling_information->mbms_area_config_list[i].mbms_sf_config_list[j].subframe_allocation) & 0xFF);
mbsfn_subframe_configuration->subframeAllocation.choice.oneFrame.buf[1] = ((m2ap_mbms_scheduling_information->mbms_area_config_list[i].mbms_sf_config_list[j].subframe_allocation>>8) & 0xFF);
mbsfn_subframe_configuration->subframeAllocation.choice.oneFrame.buf[0] = ((m2ap_mbms_scheduling_information->mbms_area_config_list[i].mbms_sf_config_list[j].subframe_allocation>>16) & 0xFF);
mbsfn_subframe_configuration->subframeAllocation.choice.oneFrame.size =3;
mbsfn_subframe_configuration->subframeAllocation.choice.oneFrame.bits_unused = 0;
}else{
mbsfn_subframe_configuration->subframeAllocation.present = M2AP_MBSFN_Subframe_Configuration__subframeAllocation_PR_oneFrame;
mbsfn_subframe_configuration->subframeAllocation.choice.oneFrame.buf = MALLOC(1);
mbsfn_subframe_configuration->subframeAllocation.choice.oneFrame.size = 1;
mbsfn_subframe_configuration->subframeAllocation.choice.oneFrame.bits_unused = 2;
//mbsfn_subframe_configuration->subframeAllocation.choice.oneFrame.buf[0] = 0x38<<2;
mbsfn_subframe_configuration->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(&(mbsfn_area_configuration_item_ie_1)->value.choice.MBSFN_Subframe_ConfigurationList.list,mbsfn_subframe_configuration_item_ies);
}
}
ASN_SEQUENCE_ADD(m2ap_mbsfn_area_configuration_list,mbsfn_area_configuration_item_ie_1);
/*M2AP_MBSFN_Area_Configuration_Item_t*/
M2AP_MBSFN_Area_Configuration_Item_t *mbsfn_area_configuration_item_ie_2;
mbsfn_area_configuration_item_ie_2 =(M2AP_MBSFN_Area_Configuration_Item_t*)calloc(1,sizeof(M2AP_MBSFN_Area_Configuration_Item_t));
(mbsfn_area_configuration_item_ie_2)->id = M2AP_ProtocolIE_ID_id_Common_Subframe_Allocation_Period;
(mbsfn_area_configuration_item_ie_2)->criticality = M2AP_Criticality_reject;
(mbsfn_area_configuration_item_ie_2)->value.present = M2AP_MBSFN_Area_Configuration_Item__value_PR_Common_Subframe_Allocation_Period;
(mbsfn_area_configuration_item_ie_2)->value.choice.Common_Subframe_Allocation_Period=m2ap_mbms_scheduling_information->mbms_area_config_list[i].common_sf_allocation_period;
ASN_SEQUENCE_ADD(m2ap_mbsfn_area_configuration_list,mbsfn_area_configuration_item_ie_2);
/*M2AP_MBSFN_Area_Configuration_Item_t*/
M2AP_MBSFN_Area_Configuration_Item_t *mbsfn_area_configuration_item_ie_3;
mbsfn_area_configuration_item_ie_3 =(M2AP_MBSFN_Area_Configuration_Item_t*)calloc(1,sizeof(M2AP_MBSFN_Area_Configuration_Item_t));
(mbsfn_area_configuration_item_ie_3)->id = M2AP_ProtocolIE_ID_id_MBSFN_Area_ID;
(mbsfn_area_configuration_item_ie_3)->criticality = M2AP_Criticality_reject;
(mbsfn_area_configuration_item_ie_3)->value.present = M2AP_MBSFN_Area_Configuration_Item__value_PR_MBSFN_Area_ID;
(mbsfn_area_configuration_item_ie_3)->value.choice.MBSFN_Area_ID = m2ap_mbms_scheduling_information->mbms_area_config_list[i].mbms_area_id;
ASN_SEQUENCE_ADD(m2ap_mbsfn_area_configuration_list,mbsfn_area_configuration_item_ie_3);
ASN_SET_ADD(&ie->value.choice.MBSFN_Area_Configuration_List,m2ap_mbsfn_area_configuration_list);
//-------------
// ASN_SEQUENCE_ADD(&ie->value.choice.MBSFN_Area_Configuration_List.list,mbsfn_area_configuration_item_ie);
//-------------
//-------------
// ASN_SEQUENCE_ADD(&ie->value.choice.MBSFN_Area_Configuration_List.list,mbsfn_area_configuration_item_ie+1);
//-------------
/* xer_fprint(stdout,&asn_DEF_M2AP_MBSFN_Area_Configuration_Item,mbsfn_area_configuration_item_ie);
xer_fprint(stdout,&asn_DEF_M2AP_MBSFN_Area_Configuration_Item,mbsfn_area_configuration_item_ie_1);
xer_fprint(stdout,&asn_DEF_M2AP_MBSFN_Area_Configuration_Item,mbsfn_area_configuration_item_ie_2);
xer_fprint(stdout,&asn_DEF_M2AP_MBSFN_Area_Configuration_Item,mbsfn_area_configuration_item_ie_3);
xer_fprint(stdout,&asn_DEF_M2AP_MBSFN_Area_Configuration_List, &ie->value.choice.MBSFN_Area_Configuration_List);*/
}
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
// LOG_D(M2AP,"%p\n",&pdu);
// LOG_D(M2AP,"%p\n",out);
// LOG_D(M2AP,"%p\n",ie);
// LOG_D(M2AP,"%p\n",mbsfn_area_configuration_item_ie);
// LOG_D(M2AP,"%p\n",&mbsfn_area_configuration_item_ie->value.choice);
// {
// /* PMCH_Configuration_List */
//
// M2AP_PMCH_Configuration_ItemIEs_t * pmch_configuration_item_ies;
// pmch_configuration_item_ies = (M2AP_PMCH_Configuration_ItemIEs_t*)calloc(1,sizeof(M2AP_PMCH_Configuration_ItemIEs_t));
// {
// pmch_configuration_item_ies->id = M2AP_ProtocolIE_ID_id_PMCH_Configuration_Item;
// pmch_configuration_item_ies->criticality = M2AP_Criticality_reject;
// pmch_configuration_item_ies->value.present = M2AP_PMCH_Configuration_ItemIEs__value_PR_PMCH_Configuration_Item;
// M2AP_PMCH_Configuration_Item_t * pmch_configuration_item;
// pmch_configuration_item = &pmch_configuration_item_ies->value.choice.PMCH_Configuration_Item;
// {
// //pmch_configuration_item->allocatedSubframesEnd;
// pmch_configuration_item->pmch_Configuration.dataMCS=13;
// //pmch_configuration_item->mchSchedulingPeriod;
// MBMSsessionListPerPMCH_Item__Member *member;
// member = (MBMSsessionListPerPMCH_Item__Member*)calloc(1,sizeof(MBMSsessionListPerPMCH_Item__Member));
// LOG_D(M2AP,"%p,%p,%p\n",pmch_configuration_item,&pmch_configuration_item->mbms_Session_List.list,member);
// ASN_SEQUENCE_ADD(&pmch_configuration_item->mbms_Session_List.list,member);
// }
// ////
// // //ASN_SEQUENCE_ADD(mbsfn_area_configuration_item_ie,pmch_configuration_item_ies);
//
// }
//
// M2AP_PMCH_Configuration_List_t * pmch_list = &mbsfn_area_configuration_item_ie->value.choice.PMCH_Configuration_List;
//
// ASN_SEQUENCE_ADD(&pmch_list->list,pmch_configuration_item_ies);
// LOG_D(M2AP,"%p,%p\n",&mbsfn_area_configuration_item_ie->value.choice.PMCH_Configuration_List.list,pmch_configuration_item_ies);
// //ASN_SEQUENCE_ADD(&mbsfn_area_configuration_item_ie->value.choice.PMCH_Configuration_List.list,pmch_configuration_item_ies);
// //ASN_SET_ADD(&mbsfn_area_configuration_item_ie->value.choice.PMCH_Configuration_List.list,pmch_configuration_item_ies);
// //ASN_SEQUENCE_ADD(mbsfn_area_configuration_item_ie,pmch_configuration_item_ies);
// /* MBSFN_Subframe_ConfigurationList */
// M2AP_MBSFN_Subframe_ConfigurationItem_t * mbsfn_subframe_configurationitem;
// mbsfn_subframe_configurationitem =(M2AP_MBSFN_Subframe_ConfigurationItem_t*)calloc(1,sizeof(M2AP_MBSFN_Subframe_ConfigurationItem_t));
// {
// mbsfn_subframe_configurationitem->id = M2AP_ProtocolIE_ID_id_MBSFN_Subframe_Configuration_Item;
// mbsfn_subframe_configurationitem->criticality = M2AP_Criticality_reject;
// mbsfn_subframe_configurationitem->value.present=M2AP_MBSFN_Subframe_ConfigurationItem__value_PR_MBSFN_Subframe_Configuration;
// }
//
// //ASN_SEQUENCE_ADD(&mbsfn_area_configuration_item_ie->value.choice.MBSFN_Subframe_ConfigurationList.list,mbsfn_subframe_configurationitem);
// LOG_D(M2AP,"%p,%p\n",&mbsfn_area_configuration_item_ie->value.choice.PMCH_Configuration_List.list,mbsfn_subframe_configurationitem);
// //ASN_SEQUENCE_ADD(&mbsfn_area_configuration_item_ie->value.choice.MBSFN_Subframe_ConfigurationList.list,mbsfn_subframe_configurationitem);
////
//// M2AP_Common_Subframe_Allocation_Period_t * common_subframe_allocation_period;
//// M2AP_MBSFN_Area_ID_t * mbsfn_area_id;
// }
// LOG_D(M2AP,"%p,%p\n",&ie->value.choice.MBSFN_Area_Configuration_List.list,mbsfn_area_configuration_item_ie);
// //ASN_SET_ADD(&ie->value.choice.MBSFN_Area_Configuration_List.list,mbsfn_area_configuration_item_ie);
// ASN_SET_ADD(&ie->value.choice.MBSFN_Area_Configuration_List.list,mbsfn_area_configuration_item_ie);
// M2AP_MBSFN_Area_Configuration_Item_t *mbsfn_area_configuration_item_ie_2;
// mbsfn_area_configuration_item_ie_2 =(M2AP_MBSFN_Area_Configuration_Item_t*)calloc(1,sizeof(M2AP_MBSFN_Area_Configuration_Item_t));
// {
// // mbsfn_area_configuration_item_ie->value.present = M2AP_MBSFN_Area_Configuration_Item__value_PR_PMCH_Configuration_List;
// /* PMCH_Configuration_List */
// // M2AP_PMCH_Configuration_ItemIEs_t * pmch_configuration_item_ies;
// // pmch_configuration_item_ies = (M2AP_PMCH_Configuration_ItemIEs_t*)calloc(1,sizeof(M2AP_PMCH_Configuration_ItemIEs_t));
// // pmch_configuration_item_ies->id = M2AP_ProtocolIE_ID_id_PMCH_Configuration_Item;
// // pmch_configuration_item_ies->criticality = M2AP_Criticality_reject;
// // pmch_configuration_item_ies->value.present = M2AP_PMCH_Configuration_ItemIEs__value_PR_PMCH_Configuration_Item;
// // M2AP_PMCH_Configuration_Item_t * pmch_configuration_item;
// // pmch_configuration_item = &pmch_configuration_item_ies->value.choice.PMCH_Configuration_Item;
// ////
// // ASN_SEQUENCE_ADD(mbsfn_area_configuration_item_ie,pmch_configuration_item_ies);
// /* MBSFN_Subframe_ConfigurationList */
// M2AP_MBSFN_Subframe_ConfigurationItem_t * mbsfn_subframe_configurationitem;
// mbsfn_subframe_configurationitem =(M2AP_MBSFN_Subframe_ConfigurationItem_t*)calloc(1,sizeof(M2AP_MBSFN_Subframe_ConfigurationItem_t));
// {
// mbsfn_subframe_configurationitem->id = M2AP_ProtocolIE_ID_id_MBSFN_Subframe_Configuration_Item;
// mbsfn_subframe_configurationitem->criticality = M2AP_Criticality_reject;
// mbsfn_subframe_configurationitem->value.present=M2AP_MBSFN_Subframe_ConfigurationItem__value_PR_MBSFN_Subframe_Configuration;
// //M2AP_MBSFN_Subframe_Configuration_t * mbsfn_subframe_configuration;
// //mbsfn_subframe_configuration = (M2AP_MBSFN_Subframe_Configuration_t*)calloc(1,sizeof(M2AP_MBSFN_Subframe_Configuration_t));
// //ASN_SEQUENCE_ADD(mbsfn_subframe_configurationitem,mbsfn_subframe_configuration);
// M2AP_MBSFN_Subframe_Configuration_t * mbsfn_subframe_configuration;
// mbsfn_subframe_configuration = &mbsfn_subframe_configurationitem->value.choice.MBSFN_Subframe_Configuration;
// }
//
// ASN_SEQUENCE_ADD(mbsfn_area_configuration_item_ie_2,mbsfn_subframe_configurationitem);
// }
// ASN_SEQUENCE_ADD(&ie->value.choice.MBSFN_Area_Configuration_List.list,mbsfn_area_configuration_item_ie_2);
// M2AP_MBSFN_Area_Configuration_List_t * m2ap_mbsfn_area_configuration_list;
// m2ap_mbsfn_area_configuration_list = &ie->value.choice.MBSFN_Area_Configuration_List;
// {
// M2AP_PMCH_Configuration_ItemIEs_t * pmch_configuration_item_ies;
// pmch_configuration_item_ies = (M2AP_PMCH_Configuration_ItemIEs_t*)calloc(1,sizeof(M2AP_PMCH_Configuration_ItemIEs_t));
// pmch_configuration_item_ies->id = M2AP_ProtocolIE_ID_id_PMCH_Configuration_Item;
// pmch_configuration_item_ies->criticality = M2AP_Criticality_reject;
// pmch_configuration_item_ies->value.present = M2AP_PMCH_Configuration_ItemIEs__value_PR_PMCH_Configuration_Item;
// M2AP_PMCH_Configuration_Item_t * pmch_configuration_item;
// pmch_configuration_item = &pmch_configuration_item_ies->value.choice.PMCH_Configuration_Item;
//
// ASN_SEQUENCE_ADD(&m2ap_mbsfn_area_configuration_list->PMCH_Configuration_List.list,pmch_configuration_item_ies);
// }
//
// int num_mbsfn_available =0; // ?
// LOG_I(M2AP, "num_mbsfn_available = %d \n", num_mbsfn_available);
// for (i=0;
// i<num_mbsfn_available;
// i++) {
//
// //M2AP_MBSFN_Area_Configuration_Item_t *mbms_mbsfn_area_configuration_item_ies;
// //mbms_mbsfn_area_configuration_item_ies = ( M2AP_MBSFN_Area_Configuration_Item_t *)calloc(1, sizeof(M2AP_MBSFN_Area_Configuration_Item_t ));
// //mbms_configuration_data_item_ies->id = M2AP_ProtocolIE_ID_id_MBSFN_Area_Configuration_Item;
// //mbms_configuration_data_item_ies>criticality = M2AP_Criticality_reject;
// //mbms_mbsfn_area_configuration_item_ies->value.present = M2AP_MBSFN_Area_Configuration_Item__value_PR_M2AP_MBSFN_Area_Configuration_Item;
//
// M2AP_MBSFN_Area_Configuration_Item_t * mbsfn_area_configuration_item;
// mbsfn_area_configuration_item = (M2AP_MBSFN_Area_Configuration_Item_t*)calloc(1,sizeof(M2AP_MBSFN_Area_Configuration_Item_t));
// //mbsfn_area_configuration_item = &mbms_mbsfn_area_configuration_item_ies->value.choice.M2AP_MBSFN_Area_Configuration_Item;
// mbsfn_area_configuration_item->value.present = M2AP_MBSFN_Area_Configuration_Item__value_PR_PMCH_Configuration_List;
//
// M2AP_PMCH_Configuration_ItemIEs_t * pmch_configuration_item_ies;
// pmch_configuration_item_ies = (M2AP_PMCH_Configuration_ItemIEs_t*)calloc(1,sizeof(M2AP_PMCH_Configuration_ItemIEs_t));
// pmch_configuration_item_ies->id = M2AP_ProtocolIE_ID_id_PMCH_Configuration_Item;
// pmch_configuration_item_ies->criticality = M2AP_Criticality_reject;
// pmch_configuration_item_ies->value.present = M2AP_PMCH_Configuration_ItemIEs__value_PR_PMCH_Configuration_Item;
// M2AP_PMCH_Configuration_Item_t * pmch_configuration_item;
// pmch_configuration_item = &pmch_configuration_item_ies->value.choice.PMCH_Configuration_Item;
// //memset((void*)&pmch_configuration_item,0,sizeof(M2AP_PMCH_Configuration_Item_t));
//
// ASN_SEQUENCE_ADD(&mbsfn_area_configuration_item->value.choice.PMCH_Configuration_List.list,pmch_configuration_item_ies);
//// if(0)
//// {
//// /* PMCH_Configuration_List */
//// LOG_I(M2AP, "num_pmch_available = %d \n", num_mbsfn_available);
//// int num_pmch_available =0; // ?
//// for (j=0;
//// j<num_pmch_available;
//// j++) {
//// M2AP_PMCH_Configuration_ItemIEs_t * pmch_configuration_item_ies;
//// pmch_configuration_item_ies->id = (M2AP_PMCH_Configuration_ItemIEs_t*)calloc(1,sizeof(M2AP_PMCH_Configuration_ItemIEs_t));
//// pmch_configuration_item_ies->criticality = M2AP_Criticality_reject;
//// pmch_configuration_item_ies->value.present = M2AP_PMCH_Configuration_ItemIEs__value_PR_PMCH_Configuration_Item;
////
//// M2AP_PMCH_Configuration_Item_t * pmch_configuration_item;
//// //pmch_configuration_item = (M2AP_PMCH_Configuration_Item_t*)calloc(1,sizeof(M2AP_PMCH_Configuration_Item_t));
//// pmch_configuration_item = &pmch_configuration_item_ies->value.choice.PMCH_Configuration_Item;
//// {
//// /* PMCH_Configuration */
//// /* allocateSubframesEnd */
//// //pmch_configuration_item.pmch_Configuration.allocatedSubframesEnd=;
//// /* dataMCS */
//// //pmch_configuration_item.pmch_Configuration.dataMCS=;
//// /* MCH_Scheduling_Period*/
//// //pmch_configuration_item.pmch_Configuration.mchSchedulingPeriod=;
////
//// /* MBMSsessionListPerPMCH */
//// LOG_I(M2AP, "num_mbms_session_available = %d \n", num_mbsfn_available);
//// int num_mbms_session_available =1; // ?
//// for(k=0;
//// k<num_mbms_session_available;
//// k++){
//// M2AP_MBMSsessionListPerPMCH_Item_t * session_list_per_pmch_item;
//// session_list_per_pmch_item=(M2AP_MBMSsessionListPerPMCH_Item_t*)calloc(1,sizeof(M2AP_MBMSsessionListPerPMCH_Item_t));
////
//// //session_list_per_pmch_item->tmgi=;
//// //session_list_per_pmch_item->lcid=;
//// //ASN_SEQUENCE_ADD(&pmch_configuration_item->mbms_Session_List.list,mbsfn_area_configuration_item);
//// }
////
//// }
//// ASN_SEQUENCE_ADD(&mbsfn_area_configuration_item->value.choice.PMCH_Configuration_List.list,pmch_configuration_item_ies);
//// }
////
//// /* MBSFN_Subframe_ConfigurationList */
//// int num_mbsfn_subframe_available=0;
//// for(j=0;
//// j<num_mbsfn_subframe_available;
//// j++){
//// M2AP_MBSFN_Subframe_ConfigurationItem_t * mbsfn_subframe_configuration_item;
//// mbsfn_subframe_configuration_item = (M2AP_MBSFN_Subframe_ConfigurationItem_t*)calloc(1,sizeof(M2AP_MBSFN_Subframe_ConfigurationItem_t));
//// //mbsfn_subframe_configuration_item->MBSFN_Subframe_Configuration.radioframeAllocationPeriod=;
//// //mbsfn_subframe_configuration_item->MBSFN_Subframe_Configuration.radioframeAllocationOffset=;
//// //mbsfn_subframe_configuration_item->MBSFN_Subframe_Configuration.subframeAllocation.oneFrame=;
//// //mbsfn_subframe_configuration_item->MBSFN_Subframe_Configuration.subframeAllocation.fourFrames=;
////
//// ASN_SEQUENCE_ADD(&mbsfn_area_configuration_item->value.choice.MBSFN_Subframe_ConfigurationList.list,mbsfn_subframe_configuration_item);
////
//// }
//// /* Common_subframe_Allocation_Period */
//// mbsfn_area_configuration_item->value.choice.Common_Subframe_Allocation_Period=0;
//// /* MBSFN_Area_ID */
//// mbsfn_area_configuration_item->value.choice.MBSFN_Area_ID=0;
//// /*MBMS_Suspension_Notification_List*/
//// //TODO
//// }
// //ASN_SEQUENCE_ADD(&ie->value.choice.MBSFN_Area_Configuration_List.list,mbsfn_area_configuration_item);
// ASN_SEQUENCE_ADD(&m2ap_mbsfn_area_configuration_list->list,mbsfn_area_configuration_item);
//
// }
/* encode */
if (m2ap_encode_pdu(&pdu,&buffer,&len) < 0){
return -1;
}
/*if (m2ap_encode_pdu(&pdu,&buffer,&len) < 0){
return -1;
}*/
/*buffer = &m2ap_message[0];
len = 62;
for(int i=0; i < len; i++ )
printf("%02X",buffer[i]);
printf("\n");*/
//printf("m2ap_mce_data_from_enb %p %p %d\n",m2ap_mce_data_from_enb, buffer, len);
m2ap_MCE_itti_send_sctp_data_req(instance,m2ap_mce_data_from_enb->assoc_id,buffer,len,0);
return 0;
// buffer2 = &m2ap_message[0];
// len2 = 62;
// for(int i=0; i < len2; i++ )
// printf("%02X",buffer2[i]);
// printf("\n");
//
// M2AP_M2AP_PDU_t pdu2;
// memset(&pdu2, 0, sizeof(pdu2));
// if (m2ap_decode_pdu(&pdu2, buffer2, len2) < 0) {
// LOG_E(M2AP, "SCHEDULING Failed to decode PDU\n");
// //return -1;
// }else{
// LOG_D(M2AP, "SCHEDULING OK to decode PDU\n");
// }
//
//
// M2AP_MbmsSchedulingInformation_t *container2;
// M2AP_MbmsSchedulingInformation_Ies_t *ie2;
// int i2 = 0;
// container2 = &pdu2.choice.initiatingMessage.value.choice.MbmsSchedulingInformation;
// M2AP_FIND_PROTOCOLIE_BY_ID(M2AP_MbmsSchedulingInformation_Ies_t, ie2, container2,M2AP_ProtocolIE_ID_id_MCCH_Update_Time ,true);
// LOG_D(M2AP, "SCHEDULING id %d\n",ie2->id);
// M2AP_FIND_PROTOCOLIE_BY_ID(M2AP_MbmsSchedulingInformation_Ies_t, ie2, container2,M2AP_ProtocolIE_ID_id_MBSFN_Area_Configuration_List ,true);
// LOG_D(M2AP, "SCHEDULING id %d\n",ie2->id);
//
//
//
// //M2AP_MBSFN_Area_Configuration_Item_t * kk = &ie->value.choice.MBSFN_Area_Configuration_List.list.array[0];
// //printf("M2AP_MBSFN_Area_Configuration_Item %d\n",kk->id);
//
// const asn_anonymous_sequence_ *list = _A_CSEQUENCE_FROM_VOID((void*)&ie2->value.choice.MBSFN_Area_Configuration_List);
// void * memb_ptr = list->array[0];
// const asn_anonymous_sequence_ *list2 = _A_CSEQUENCE_FROM_VOID((void*)memb_ptr);
//
//
// void * memb_ptr1 = list2->array[0];
// M2AP_MBSFN_Area_Configuration_Item_t * m2ap_mbsfn_area_configuration_item1 = (M2AP_MBSFN_Area_Configuration_Item_t*)memb_ptr1;
// M2AP_PMCH_Configuration_Item_t * m2ap_pmchconfiguration_item =&(((M2AP_PMCH_Configuration_ItemIEs_t*)m2ap_mbsfn_area_configuration_item1->value.choice.PMCH_Configuration_List.list.array[0])->value.choice.PMCH_Configuration_Item);
// printf("dataMCS %d\n",m2ap_pmchconfiguration_item->pmch_Configuration.dataMCS);
// m2ap_pmchconfiguration_item->pmch_Configuration.dataMCS=4;
// printf("allocatedSubframesEnd %d\n",m2ap_pmchconfiguration_item->pmch_Configuration.allocatedSubframesEnd);
// M2AP_PMCH_Configuration_t * m2ap_pmchconfiguration = &m2ap_pmchconfiguration_item->pmch_Configuration;
// printf("M2AP_PMCH_Configuration_t dataMCS %d\n",m2ap_pmchconfiguration->dataMCS);
// printf("M2AP_PMCH_Configuration_t allocatedSubframesEnd %d\n",m2ap_pmchconfiguration->allocatedSubframesEnd);
// M2AP_MBMSsessionListPerPMCH_Item_t * m2ap_mbsfnsessionlistperPMCH = &m2ap_pmchconfiguration_item->mbms_Session_List;
// M2AP_TMGI_t * tmgi = &m2ap_mbsfnsessionlistperPMCH->list.array[0]->tmgi;
// M2AP_PLMN_Identity_t * pLMNidentity = &tmgi->pLMNidentity;
// MCC_MNC_TO_PLMNID(0,1,3/*instance_p->mcc, instance_p->mnc, instance_p->mnc_digit_length,*/
// ,pLMNidentity);
//
//
// OCTET_STRING_t * serviceID = &tmgi->serviceID;
// M2AP_LCID_t * lcid = &m2ap_mbsfnsessionlistperPMCH->list.array[0]->lcid; //long
//
//
// void * memb_ptr2 = list2->array[1];
// M2AP_MBSFN_Area_Configuration_Item_t * m2ap_mbsfn_area_configuration_item2 = (M2AP_MBSFN_Area_Configuration_Item_t*)memb_ptr2;
// M2AP_MBSFN_Subframe_Configuration_t * m2ap_mbsfn_subframe_configuration_item =&(((M2AP_MBSFN_Subframe_ConfigurationItem_t*)m2ap_mbsfn_area_configuration_item2->value.choice.MBSFN_Subframe_ConfigurationList.list.array[0])->value.choice.MBSFN_Subframe_Configuration);
// //M2AP_MBSFN_Subframe_Configuration_t * m2ap_mbsfn_subframe_configuration = &m2ap_mbsfn_subframe_configuration_item->value.choice.MBSFN_Subframe_Configuration;
// printf("oneframe ? %d\n",(m2ap_mbsfn_subframe_configuration_item->subframeAllocation.present == M2AP_MBSFN_Subframe_Configuration__subframeAllocation_PR_oneFrame));
//
//
// void * memb_ptr3 = list2->array[2];
// M2AP_MBSFN_Area_Configuration_Item_t * m2ap_mbsfn_area_configuration_item3 = (M2AP_MBSFN_Area_Configuration_Item_t*)memb_ptr3;
// M2AP_Common_Subframe_Allocation_Period_t * m2ap_mbsfn_common_subframe_allocation_period = (M2AP_Common_Subframe_Allocation_Period_t*)m2ap_mbsfn_area_configuration_item3->value.choice.Common_Subframe_Allocation_Period;
//
// void * memb_ptr4 = list2->array[3];
// M2AP_MBSFN_Area_Configuration_Item_t * m2ap_mbsfn_area_configuration_item4 = (M2AP_MBSFN_Area_Configuration_Item_t*)memb_ptr4;
// M2AP_MBSFN_Area_ID_t * m2ap_mbsfn_area_id = (M2AP_MBSFN_Area_ID_t*)m2ap_mbsfn_area_configuration_item4->value.choice.MBSFN_Area_ID;
//
//
//
// //ASN_SEQUENCE_ADD(&ie->value.choice.MBSFN_Area_Configuration_List,list);
// ASN_SEQUENCE_ADD(&ie->value.choice.MBSFN_Area_Configuration_List,m2ap_mbsfn_area_configuration_list);
//
// LOG_D(M2AP,"Morgade\n");
// xer_fprint(stdout,&asn_DEF_M2AP_MBSFN_Area_Configuration_List, &ie->value.choice.MBSFN_Area_Configuration_List);
//
// /* encode */
// if (m2ap_encode_pdu(&pdu2,&buffer,&len) < 0){
// return -1;
// }
//
// //MCE_m2ap_itti_send_sctp_data_req(instance, m2ap_mce_data_from_mce->assoid,buffer,len,0);
// m2ap_MCE_itti_send_sctp_data_req(instance,assoc_id,buffer,len,0);
// return 0;
//
//
}
int MCE_handle_MBMS_SCHEDULING_INFORMATION_RESPONSE(instance_t instance,
uint32_t assoc_id,
uint32_t stream,
M2AP_M2AP_PDU_t *pdu){
LOG_D(M2AP, "MCE_handle_MBMS_SCHEDULING_INFORMATION_RESPONSE\n");
AssertFatal(pdu->present == M2AP_M2AP_PDU_PR_successfulOutcome,
"pdu->present != M2AP_M2AP_PDU_PR_successfulOutcome\n");
AssertFatal(pdu->choice.successfulOutcome.procedureCode == M2AP_ProcedureCode_id_mbmsSchedulingInformation,
"pdu->choice.successfulOutcome->procedureCode != M2AP_ProcedureCode_id_mbmsSchedulingInformation\n");
AssertFatal(pdu->choice.successfulOutcome.criticality == M2AP_Criticality_reject,
"pdu->choice.successfulOutcome->criticality != M2AP_Criticality_reject\n");
AssertFatal(pdu->choice.successfulOutcome.value.present == M2AP_SuccessfulOutcome__value_PR_MbmsSchedulingInformationResponse,
"pdu->choice.successfulOutcome->value.present != M2AP_SuccessfulOutcome__value_PR_MbmsSchedulingInformationResponse\n");
//M2AP_MbmsSchedulingInformationResponse_t *in = &pdu->choice.successfulOutcome.value.choice.MbmsSchedulingInformationResponse;
//M2AP_MbmsSchedulingInformationResponse_Ies_t *ie;
//int MCE_MBMS_M2AP_ID=-1;
//int ENB_MBMS_M2AP_ID=-1;
MessageDef *msg_g = itti_alloc_new_message(TASK_M2AP_MCE,M2AP_MBMS_SCHEDULING_INFORMATION_RESP); //TODO
// LOG_D(M2AP, "M2AP: SessionStop-Resp: protocolIEs.list.count %d\n",
// in->protocolIEs.list.count);
// for (int i=0;i < in->protocolIEs.list.count; i++) {
// ie = in->protocolIEs.list.array[i];
// //switch (ie->id) {
// //case M2AP_ProtocolIE_ID_id_MCE_MBMS_M2AP_ID:
// // AssertFatal(ie->criticality == M2AP_Criticality_reject,
// // "ie->criticality != M2AP_Criticality_reject\n");
// // AssertFatal(ie->value.present == M2AP_sessionStopIEs__value_PR_MCE_MBMS_M2AP_ID,
// // "ie->value.present != M2AP_sessionStopIEs__value_PR_MCE_MBMS_M2AP_ID\n");
// // TransactionId=ie->value.choice.MCE_MBMS_M2AP_ID;
// // LOG_D(M2AP, "M2AP: SessionStop-Resp: MCE_MBMS_M2AP_ID %d\n",
// // MCE_MBMS_M2AP_ID);
// // break;
// // case M2AP_ProtocolIE_ID_id_ENB_MBMS_M2AP_ID:
// // AssertFatal(ie->criticality == M2AP_Criticality_reject,
// // "ie->criticality != M2AP_Criticality_reject\n");
// // AssertFatal(ie->value.present == M2AP_sessionStopIEs__value_PR_ENB_MBMS_M2AP_ID,
// // "ie->value.present != M2AP_sessionStopIEs__value_PR_ENB_MBMS_M2AP_ID\n");
// // TransactionId=ie->value.choice.ENB_MBMS_M2AP_ID;
// // LOG_D(M2AP, "M2AP: SessionStop-Resp: ENB_MBMS_M2AP_ID %d\n",
// // ENB_MBMS_M2AP_ID);
// // break;
// //}
// }
//
// M2AP_SESSION_STOP_RESP(msg_p).
// MSC_LOG_RX_MESSAGE(
// MSC_M2AP_MCE,
// MSC_M2AP_ENB,
// 0,
// 0,
// MSC_AS_TIME_FMT" MCE_handle_M2_SCHEDULING_INFORMATION_RESPONSE successfulOutcome assoc_id %d",
// 0,0,//MSC_AS_TIME_ARGS(ctxt_pP),
// assoc_id);
//
// LOG_D(M2AP, "Sending M2AP_SCHEDULING_INFO_RESP ITTI message to ENB_APP with assoc_id (%d->%d)\n",
// assoc_id,ENB_MODULE_ID_TO_INSTANCE(assoc_id));
// itti_send_msg_to_task(TASK_ENB_APP, ENB_MODULE_ID_TO_INSTANCE(assoc_id), msg_p);
itti_send_msg_to_task(TASK_MCE_APP, ENB_MODULE_ID_TO_INSTANCE(instance), msg_g);
//
return 0;
}
/*
* Reset
*/
int MCE_send_RESET(instance_t instance, m2ap_reset_t * m2ap_reset) {
AssertFatal(1==0,"Not implemented yet\n");
//M2AP_Reset_t Reset;
}
int MCE_handle_RESET_ACKKNOWLEDGE(instance_t instance,
uint32_t assoc_id,
uint32_t stream,
M2AP_M2AP_PDU_t *pdu) {
AssertFatal(1==0,"Not implemented yet\n");
}
int MCE_handle_RESET(instance_t instance,
uint32_t assoc_id,
uint32_t stream,
M2AP_M2AP_PDU_t *pdu) {
AssertFatal(1==0,"Not implemented yet\n");
}
int MCE_send_RESET_ACKNOWLEDGE(instance_t instance, M2AP_ResetAcknowledge_t *ResetAcknowledge) {
AssertFatal(1==0,"Not implemented yet\n");
}
/*
* M2 Setup
*/
int MCE_handle_M2_SETUP_REQUEST(instance_t instance,
uint32_t assoc_id,
uint32_t stream,
M2AP_M2AP_PDU_t *pdu)
{
LOG_D(M2AP, "MCE_handle_M2_SETUP_REQUEST assoc_id %d\n",assoc_id);
MessageDef *message_p;
M2AP_M2SetupRequest_t *container;
M2AP_M2SetupRequest_Ies_t *ie;
int i = 0,j=0;
DevAssert(pdu != NULL);
container = &pdu->choice.initiatingMessage.value.choice.M2SetupRequest;
/* M2 Setup Request == Non UE-related procedure -> stream 0 */
if (stream != 0) {
LOG_D(M2AP, "[SCTP %d] Received m2 setup request on stream != 0 (%d)\n",
assoc_id, stream);
}
message_p = itti_alloc_new_message(TASK_MCE_APP, M2AP_SETUP_REQ);
/* assoc_id */
M2AP_SETUP_REQ(message_p).assoc_id = assoc_id;
/* GlobalENB_id */
// this function exits if the ie is mandatory
M2AP_FIND_PROTOCOLIE_BY_ID(M2AP_M2SetupRequest_Ies_t, ie, container,
M2AP_ProtocolIE_ID_id_GlobalENB_ID, true);
//asn_INTEGER2ulong(&ie->value.choice.GlobalENB_ID.eNB_ID, &M2AP_SETUP_REQ(message_p).GlobalENB_ID);
if(ie->value.choice.GlobalENB_ID.eNB_ID.present == M2AP_ENB_ID_PR_macro_eNB_ID){
}else if(ie->value.choice.GlobalENB_ID.eNB_ID.present == M2AP_ENB_ID_PR_short_Macro_eNB_ID){
}else if(ie->value.choice.GlobalENB_ID.eNB_ID.present == M2AP_ENB_ID_PR_long_Macro_eNB_ID){
}
LOG_D(M2AP, "M2AP_SETUP_REQ(message_p).GlobalENB_ID %lu \n", M2AP_SETUP_REQ(message_p).GlobalENB_ID);
/* ENB_name */
M2AP_FIND_PROTOCOLIE_BY_ID(M2AP_M2SetupRequest_Ies_t, ie, container,
M2AP_ProtocolIE_ID_id_ENBname, false);
if(ie!=NULL){
M2AP_SETUP_REQ(message_p).ENBname = calloc(ie->value.choice.ENBname.size + 1, sizeof(char));
memcpy(M2AP_SETUP_REQ(message_p).ENBname, ie->value.choice.ENBname.buf,
ie->value.choice.ENBname.size);
/* Convert the mme name to a printable string */
M2AP_SETUP_REQ(message_p).ENBname[ie->value.choice.ENBname.size] = '\0';
LOG_D(M2AP, "M2AP_SETUP_REQ(message_p).gNB_DU_name %s \n", M2AP_SETUP_REQ(message_p).ENBname);
}
/* ENB_MBMS_Configuration_data_List */
M2AP_FIND_PROTOCOLIE_BY_ID(M2AP_M2SetupRequest_Ies_t, ie, container,
M2AP_ProtocolIE_ID_id_ENB_MBMS_Configuration_data_List, true);
M2AP_SETUP_REQ(message_p).num_mbms_available = ie->value.choice.ENB_MBMS_Configuration_data_List.list.count;
LOG_D(M2AP, "M2AP_SETUP_REQ(message_p).num_mbms_available %d \n",
M2AP_SETUP_REQ(message_p).num_mbms_available);
int num_mbms_available = M2AP_SETUP_REQ(message_p).num_mbms_available;
for (i=0; i<num_mbms_available; i++) {
M2AP_ENB_MBMS_Configuration_data_Item_t *mbms_configuration_item_p;
mbms_configuration_item_p = &(((M2AP_ENB_MBMS_Configuration_data_ItemIEs_t *)ie->value.choice.ENB_MBMS_Configuration_data_List.list.array[i])->value.choice.ENB_MBMS_Configuration_data_Item);
/* eCGI */
//mbms_configuration_item_p->eCGI ... (M2AP_ECGI_t)
OCTET_STRING_TO_INT16(&(mbms_configuration_item_p->eCGI.pLMN_Identity),M2AP_SETUP_REQ(message_p).plmn_identity[i]);
//OCTET_STRING_TO_INT16(&(mbms_configuration_item_p->eCGI.eUTRANcellIdentifier),M2AP_SETUP_REQ(message_p).eutran_cell_identifier[i]);
/* mbsfnSynchronisationArea */
//mbms_configuration_item_p->mbsfnSynchronisationArea ... (M2AP_MBSFN_SynchronisationArea_ID_t)
M2AP_SETUP_REQ(message_p).mbsfn_synchronization_area[i]=mbms_configuration_item_p->mbsfnSynchronisationArea;
/* mbmsServiceAreaList */
//mbms_configuration_item_p->mbmsServiceAreaList ... (M2AP_MBMS_Service_Area_ID_List_t)
for(j=0;j<1;j++){
//OCTET_STRING_TO_INT16(&(mbms_configuration_item_p->mbmsServiceAreaList.list.array[j]), M2AP_SETUP_REQ(message_p).service_area_id[i][j]);
}
}
// /* tac */
// OCTET_STRING_TO_INT16(&(served_celles_item_p->served_Cell_Information.fiveGS_TAC), M2AP_SETUP_REQ(message_p).tac[i]);
// LOG_D(M2AP, "M2AP_SETUP_REQ(message_p).tac[%d] %d \n",
// i, M2AP_SETUP_REQ(message_p).tac[i]);
//
// /* - nRCGI */
// TBCD_TO_MCC_MNC(&(served_celles_item_p->served_Cell_Information.nRCGI.pLMN_Identity), M2AP_SETUP_REQ(message_p).mcc[i],
// M2AP_SETUP_REQ(message_p).mnc[i],
// M2AP_SETUP_REQ(message_p).mnc_digit_length[i]);
//
//
// // NR cellID
// BIT_STRING_TO_NR_CELL_IDENTITY(&served_celles_item_p->served_Cell_Information.nRCGI.nRCellIdentity,
// M2AP_SETUP_REQ(message_p).nr_cellid[i]);
// LOG_D(M2AP, "[SCTP %d] Received nRCGI: MCC %d, MNC %d, CELL_ID %llu\n", assoc_id,
// M2AP_SETUP_REQ(message_p).mcc[i],
// M2AP_SETUP_REQ(message_p).mnc[i],
// (long long unsigned int)M2AP_SETUP_REQ(message_p).nr_cellid[i]);
// LOG_D(M2AP, "nr_cellId : %x %x %x %x %x\n",
// served_celles_item_p->served_Cell_Information.nRCGI.nRCellIdentity.buf[0],
// served_celles_item_p->served_Cell_Information.nRCGI.nRCellIdentity.buf[1],
// served_celles_item_p->served_Cell_Information.nRCGI.nRCellIdentity.buf[2],
// served_celles_item_p->served_Cell_Information.nRCGI.nRCellIdentity.buf[3],
// served_celles_item_p->served_Cell_Information.nRCGI.nRCellIdentity.buf[4]);
// /* - nRPCI */
// M2AP_SETUP_REQ(message_p).nr_pci[i] = served_celles_item_p->served_Cell_Information.nRPCI;
// LOG_D(M2AP, "M2AP_SETUP_REQ(message_p).nr_pci[%d] %d \n",
// i, M2AP_SETUP_REQ(message_p).nr_pci[i]);
//
// // System Information
// /* mib */
// M2AP_SETUP_REQ(message_p).mib[i] = calloc(served_celles_item_p->gNB_DU_System_Information->mIB_message.size + 1, sizeof(char));
// memcpy(M2AP_SETUP_REQ(message_p).mib[i], served_celles_item_p->gNB_DU_System_Information->mIB_message.buf,
// served_celles_item_p->gNB_DU_System_Information->mIB_message.size);
// /* Convert the mme name to a printable string */
// M2AP_SETUP_REQ(message_p).mib[i][served_celles_item_p->gNB_DU_System_Information->mIB_message.size] = '\0';
// M2AP_SETUP_REQ(message_p).mib_length[i] = served_celles_item_p->gNB_DU_System_Information->mIB_message.size;
// LOG_D(M2AP, "M2AP_SETUP_REQ(message_p).mib[%d] %s , len = %d \n",
// i, M2AP_SETUP_REQ(message_p).mib[i], M2AP_SETUP_REQ(message_p).mib_length[i]);
//
// /* sib1 */
// M2AP_SETUP_REQ(message_p).sib1[i] = calloc(served_celles_item_p->gNB_DU_System_Information->sIB1_message.size + 1, sizeof(char));
// memcpy(M2AP_SETUP_REQ(message_p).sib1[i], served_celles_item_p->gNB_DU_System_Information->sIB1_message.buf,
// served_celles_item_p->gNB_DU_System_Information->sIB1_message.size);
// /* Convert the mme name to a printable string */
// M2AP_SETUP_REQ(message_p).sib1[i][served_celles_item_p->gNB_DU_System_Information->sIB1_message.size] = '\0';
// M2AP_SETUP_REQ(message_p).sib1_length[i] = served_celles_item_p->gNB_DU_System_Information->sIB1_message.size;
// LOG_D(M2AP, "M2AP_SETUP_REQ(message_p).sib1[%d] %s , len = %d \n",
// i, M2AP_SETUP_REQ(message_p).sib1[i], M2AP_SETUP_REQ(message_p).sib1_length[i]);
// }
//printf("m2ap_mce_data_from_enb->assoc_id %d %d\n",m2ap_mce_data_from_enb->assoc_id,assoc_id);
*m2ap_mce_data_from_enb = M2AP_SETUP_REQ(message_p);
//printf("m2ap_mce_data_from_enb->assoc_id %d %d\n",m2ap_mce_data_from_enb->assoc_id,assoc_id);
// MSC_LOG_TX_MESSAGE(
// MSC_M2AP_MCE,
// MSC_RRC_ENB,
// 0,
// 0,
// MSC_AS_TIME_FMT" MCE_handle_M2_SETUP_REQUEST",
// 0,0//MSC_AS_TIME_ARGS(ctxt_pP),
// );
//
if (num_mbms_available > 0) {
itti_send_msg_to_task(TASK_MCE_APP, ENB_MODULE_ID_TO_INSTANCE(instance), message_p);
} else {
//MCE_send_M2_SETUP_FAILURE(instance);
return -1;
}
// return 0;
//TEST POINT MCE -> eNB
// if(1){
// printf("instance %d\n",instance);
// //MCE_send_M2_SETUP_RESPONSE(instance,assoc_id,m2ap_mce_data_from_enb->assoc_id);
// //MCE_send_MBMS_SESSION_START_REQUEST(instance,assoc_id);
// //MCE_send_MBMS_SESSION_STOP_REQUEST(instance,assoc_id);
// //MCE_send_MBMS_SCHEDULING_INFORMATION(instance,assoc_id,NULL); //TODO
// }
// else
// MCE_send_M2_SETUP_FAILURE(instance,assoc_id);
return 0;
}
int MCE_send_M2_SETUP_RESPONSE(instance_t instance, /*uint32_t assoc_id,*/
m2ap_setup_resp_t *m2ap_setup_resp) {
//module_id_t mce_mod_idP;
//module_id_t enb_mod_idP;
// This should be fixed
//enb_mod_idP = (module_id_t)0;
//mce_mod_idP = (module_id_t)0;
M2AP_M2AP_PDU_t pdu;
M2AP_M2SetupResponse_t *out;
M2AP_M2SetupResponse_Ies_t *ie;
uint8_t *buffer;
uint32_t len;
int i = 0;
//int j = 0;
AssertFatal(m2ap_setup_resp!=NULL,"m2ap_setup_resp = NULL\n");
/* Create */
/* 0. Message Type */
memset(&pdu, 0, sizeof(pdu));
pdu.present = M2AP_M2AP_PDU_PR_successfulOutcome;
//pdu.choice.successfulOutcome = (M2AP_SuccessfulOutcome_t *)calloc(1, sizeof(M2AP_SuccessfulOutcome_t));
pdu.choice.successfulOutcome.procedureCode = M2AP_ProcedureCode_id_m2Setup;
pdu.choice.successfulOutcome.criticality = M2AP_Criticality_reject;
pdu.choice.successfulOutcome.value.present = M2AP_SuccessfulOutcome__value_PR_M2SetupResponse;
out = &pdu.choice.successfulOutcome.value.choice.M2SetupResponse;
/* mandatory */
/* c1. GlobalMCE ID (integer value)*/
ie = (M2AP_M2SetupResponse_Ies_t *)calloc(1, sizeof(M2AP_M2SetupResponse_Ies_t));
ie->id = M2AP_ProtocolIE_ID_id_GlobalMCE_ID;
ie->criticality = M2AP_Criticality_reject; //?
ie->value.present = M2AP_M2SetupResponse_Ies__value_PR_GlobalMCE_ID;
//ie->value.choice.TransactionID = M2AP_get_next_transaction_identifier(enb_mod_idP, cu_mod_idP);
MCC_MNC_TO_PLMNID(m2ap_setup_resp->mcc, m2ap_setup_resp->mnc, m2ap_setup_resp->mnc_digit_length,
&ie->value.choice.GlobalMCE_ID.pLMN_Identity);
ie->value.choice.GlobalMCE_ID.mCE_ID.buf =calloc(2, sizeof(uint8_t));
ie->value.choice.GlobalMCE_ID.mCE_ID.buf[0] = (m2ap_setup_resp->MCE_id) >> 8;
ie->value.choice.GlobalMCE_ID.mCE_ID.buf[1] = ((m2ap_setup_resp->MCE_id) & 0x0ff);
ie->value.choice.GlobalMCE_ID.mCE_ID.size=2;
//ie->value.choice.GlobalMCE_ID.mCE_ID.bits_unused=0;
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
/* optional */
/* c2. MCEname */
if (m2ap_setup_resp->MCE_name != NULL) {
ie = (M2AP_M2SetupResponse_Ies_t *)calloc(1, sizeof(M2AP_M2SetupResponse_Ies_t));
ie->id = M2AP_ProtocolIE_ID_id_MCEname;
ie->criticality = M2AP_Criticality_ignore;
ie->value.present = M2AP_M2SetupResponse_Ies__value_PR_MCEname;
OCTET_STRING_fromBuf(&ie->value.choice.MCEname, m2ap_setup_resp->MCE_name,
strlen(m2ap_setup_resp->MCE_name));
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
}
/* mandatory */
/* c3. cells to be Activated list */
ie = (M2AP_M2SetupResponse_Ies_t *)calloc(1, sizeof(M2AP_M2SetupResponse_Ies_t));
ie->id = M2AP_ProtocolIE_ID_id_MCCHrelatedBCCH_ConfigPerMBSFNArea;
ie->criticality = M2AP_Criticality_reject;
ie->value.present = M2AP_M2SetupResponse_Ies__value_PR_MCCHrelatedBCCH_ConfigPerMBSFNArea;
for( i=0; i < m2ap_setup_resp->num_mcch_config_per_mbsfn; i++)
{
M2AP_MCCHrelatedBCCH_ConfigPerMBSFNArea_ItemIEs_t * mcch_related_bcch_config_per_mbsfn_area_item_ies;
mcch_related_bcch_config_per_mbsfn_area_item_ies = (M2AP_MCCHrelatedBCCH_ConfigPerMBSFNArea_ItemIEs_t*)calloc(1,sizeof(M2AP_MCCHrelatedBCCH_ConfigPerMBSFNArea_ItemIEs_t));
mcch_related_bcch_config_per_mbsfn_area_item_ies->id=M2AP_ProtocolIE_ID_id_MCCHrelatedBCCH_ConfigPerMBSFNArea_Item;
mcch_related_bcch_config_per_mbsfn_area_item_ies->criticality = M2AP_Criticality_ignore;
mcch_related_bcch_config_per_mbsfn_area_item_ies->value.present=M2AP_MCCHrelatedBCCH_ConfigPerMBSFNArea_ItemIEs__value_PR_MCCHrelatedBCCH_ConfigPerMBSFNArea_Item;
M2AP_MCCHrelatedBCCH_ConfigPerMBSFNArea_Item_t * config_per_mbsfn_area_item;
config_per_mbsfn_area_item = &mcch_related_bcch_config_per_mbsfn_area_item_ies->value.choice.MCCHrelatedBCCH_ConfigPerMBSFNArea_Item;
{
config_per_mbsfn_area_item->pdcchLength=m2ap_setup_resp->mcch_config_per_mbsfn[i].pdcch_length;//M2AP_MCCHrelatedBCCH_ConfigPerMBSFNArea_Item__pdcchLength_s1;
config_per_mbsfn_area_item->offset=m2ap_setup_resp->mcch_config_per_mbsfn[i].offset;//0;
config_per_mbsfn_area_item->repetitionPeriod=m2ap_setup_resp->mcch_config_per_mbsfn[i].repetition_period;//M2AP_MCCHrelatedBCCH_ConfigPerMBSFNArea_Item__repetitionPeriod_rf32;
config_per_mbsfn_area_item->modificationPeriod=m2ap_setup_resp->mcch_config_per_mbsfn[i].modification_period;//M2AP_MCCHrelatedBCCH_ConfigPerMBSFNArea_Item__modificationPeriod_rf512;
config_per_mbsfn_area_item->subframeAllocationInfo.buf = MALLOC(1);
config_per_mbsfn_area_item->subframeAllocationInfo.size=1;
/*char * t;
int bits=7;
for( t = m2ap_setup_resp->mcch_config_per_mbsfn[i].subframe_allocation_info; *t != '\0'; t++,bits--){
if(*t=='1'){
config_per_mbsfn_area_item->subframeAllocationInfo.buf[0] |= (uint8_t)(0x1<<bits);
}
}*/
config_per_mbsfn_area_item->subframeAllocationInfo.buf[0] = (uint8_t)((m2ap_setup_resp->mcch_config_per_mbsfn[i].subframe_allocation_info & 0x3F)<<2);
//config_per_mbsfn_area_item->subframeAllocationInfo.buf[0]=0x1<<7;
config_per_mbsfn_area_item->subframeAllocationInfo.bits_unused=2;
//memset(&config_per_mbsfn_area_item->subframeAllocationInfo,0,sizeof(BIT_STRING_t));
config_per_mbsfn_area_item->modulationAndCodingScheme = m2ap_setup_resp->mcch_config_per_mbsfn[i].mcs;//M2AP_MCCHrelatedBCCH_ConfigPerMBSFNArea_Item__modulationAndCodingScheme_n2;
ASN_SEQUENCE_ADD(&ie->value.choice.MCCHrelatedBCCH_ConfigPerMBSFNArea.list,mcch_related_bcch_config_per_mbsfn_area_item_ies);
}
}
//config_per_mbsfn_area_item->cellInformationList = ;//(M2AP_Cell_Information_List*)calloc(1,sizeof(M2AP_Cell_Information_List));
//config_per_mbsfn_area_item->subframeAllocationInfo.bits_unused = 4;
//ASN_SEQUENCE_ADD(&ie->value.choice.MCCHrelatedBCCH_ConfigPerMBSFNArea.list,config_per_mbsfn_area_item);
//config_per_mbsfn_area_item = &ie->value.choice.MCCHrelatedBCCH_ConfigPerMBSFNArea;
//{
//}
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
/* M2AP_MCCHrelatedBCCH_ConfigPerMBSFNArea_t */
//...
// int num_cells_to_activate = f1ap_setup_resp->num_cells_to_activate;
// LOG_D(M2AP, "num_cells_to_activate = %d \n", num_cells_to_activate);
// for (i=0;
// i<num_cells_to_activate;
// i++) {
//
// M2AP_Cells_to_be_Activated_List_ItemIEs_t *cells_to_be_activated_list_item_ies;
// cells_to_be_activated_list_item_ies = (M2AP_Cells_to_be_Activated_List_ItemIEs_t *)calloc(1, sizeof(M2AP_Cells_to_be_Activated_List_ItemIEs_t));
// cells_to_be_activated_list_item_ies->id = M2AP_ProtocolIE_ID_id_Cells_to_be_Activated_List_Item;
// cells_to_be_activated_list_item_ies->criticality = M2AP_Criticality_reject;
// cells_to_be_activated_list_item_ies->value.present = M2AP_Cells_to_be_Activated_List_ItemIEs__value_PR_Cells_to_be_Activated_List_Item;
//
// /* 3.1 cells to be Activated list item */
// M2AP_Cells_to_be_Activated_List_Item_t cells_to_be_activated_list_item;
// memset((void *)&cells_to_be_activated_list_item, 0, sizeof(M2AP_Cells_to_be_Activated_List_Item_t));
//
// /* - nRCGI */
// M2AP_NRCGI_t nRCGI;
// MCC_MNC_TO_PLMNID(f1ap_setup_resp->mcc[i], f1ap_setup_resp->mnc[i], f1ap_setup_resp->mnc_digit_length[i],
// &nRCGI.pLMN_Identity);
// NR_CELL_ID_TO_BIT_STRING(f1ap_setup_resp->nr_cellid[i], &nRCGI.nRCellIdentity);
// cells_to_be_activated_list_item.nRCGI = nRCGI;
//
// /* optional */
// /* - nRPCI */
// if (1) {
// cells_to_be_activated_list_item.nRPCI = (M2AP_NRPCI_t *)calloc(1, sizeof(M2AP_NRPCI_t));
// *cells_to_be_activated_list_item.nRPCI = f1ap_setup_resp->nrpci[i]; // int 0..1007
// }
//
// /* optional */
// /* - gNB-MCE System Information */
// if (1) {
// /* 3.1.2 gNB-MCESystem Information */
// M2AP_Cells_to_be_Activated_List_ItemExtIEs_t *cells_to_be_activated_list_itemExtIEs;
// cells_to_be_activated_list_itemExtIEs = (M2AP_Cells_to_be_Activated_List_ItemExtIEs_t *)calloc(1, sizeof(M2AP_Cells_to_be_Activated_List_ItemExtIEs_t));
// cells_to_be_activated_list_itemExtIEs->id = M2AP_ProtocolIE_ID_id_gNB_MCESystemInformation;
// cells_to_be_activated_list_itemExtIEs->criticality = M2AP_Criticality_reject;
// cells_to_be_activated_list_itemExtIEs->extensionValue.present = M2AP_Cells_to_be_Activated_List_ItemExtIEs__extensionValue_PR_GNB_MCESystemInformation;
//
// M2AP_GNB_MCESystemInformation_t *gNB_MCESystemInformation = (M2AP_GNB_MCESystemInformation_t *)calloc(1, sizeof(M2AP_GNB_MCESystemInformation_t));
// //LOG_I(M2AP, "%s() SI %d size %d: ", __func__, i, f1ap_setup_resp->SI_container_length[i][0]);
// //for (int n = 0; n < f1ap_setup_resp->SI_container_length[i][0]; n++)
// // printf("%02x ", f1ap_setup_resp->SI_container[i][0][n]);
// //printf("\n");
// OCTET_STRING_fromBuf(&gNB_MCESystemInformation->sImessage,
// (const char*)f1ap_setup_resp->SI_container[i][0],
// f1ap_setup_resp->SI_container_length[i][0]);
//
// LOG_D(M2AP, "f1ap_setup_resp->SI_container_length = %d \n", f1ap_setup_resp->SI_container_length[0][0]);
// cells_to_be_activated_list_itemExtIEs->extensionValue.choice.GNB_MCESystemInformation = *gNB_MCESystemInformation;
//
//
// M2AP_ProtocolExtensionContainer_160P9_t p_160P9_t;
// memset((void *)&p_160P9_t, 0, sizeof(M2AP_ProtocolExtensionContainer_160P9_t));
//
// ASN_SEQUENCE_ADD(&p_160P9_t.list,
// cells_to_be_activated_list_itemExtIEs);
// cells_to_be_activated_list_item.iE_Extensions = (struct M2AP_ProtocolExtensionContainer*)&p_160P9_t;
//
// }
// /* ADD */
// cells_to_be_activated_list_item_ies->value.choice.Cells_to_be_Activated_List_Item = cells_to_be_activated_list_item;
// ASN_SEQUENCE_ADD(&ie->value.choice.Cells_to_be_Activated_List.list,
// cells_to_be_activated_list_item_ies);
// }
// ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
/* encode */
if (m2ap_encode_pdu(&pdu, &buffer, &len) < 0) {
LOG_E(M2AP, "Failed to encode M2 response\n");
return -1;
}
//MCE_m2ap_itti_send_sctp_data_req(instance, m2ap_mce_data_from_du->assoc_id, buffer, len, 0);
//printf(",m2ap_mce_data_from_enb->assoc_id %d\n",m2ap_mce_data_from_enb->assoc_id);
m2ap_MCE_itti_send_sctp_data_req(instance,m2ap_mce_data_from_enb->assoc_id,buffer,len,0);
return 0;
}
int MCE_send_M2_SETUP_FAILURE(instance_t instance,m2ap_setup_failure_t* m2ap_setup_failure) {
// module_id_t enb_mod_idP;
//module_id_t mce_mod_idP;
// This should be fixed
//enb_mod_idP = (module_id_t)0;
//mce_mod_idP = (module_id_t)0;
M2AP_M2AP_PDU_t pdu;
M2AP_M2SetupFailure_t *out;
M2AP_M2SetupFailure_Ies_t *ie;
uint8_t *buffer;
uint32_t len;
/* Create */
/* 0. Message Type */
memset(&pdu, 0, sizeof(pdu));
pdu.present = M2AP_M2AP_PDU_PR_unsuccessfulOutcome;
//pdu.choice.unsuccessfulOutcome = (M2AP_UnsuccessfulOutcome_t *)calloc(1, sizeof(M2AP_UnsuccessfulOutcome_t));
pdu.choice.unsuccessfulOutcome.procedureCode = M2AP_ProcedureCode_id_m2Setup;
pdu.choice.unsuccessfulOutcome.criticality = M2AP_Criticality_reject;
pdu.choice.unsuccessfulOutcome.value.present = M2AP_UnsuccessfulOutcome__value_PR_M2SetupFailure;
out = &pdu.choice.unsuccessfulOutcome.value.choice.M2SetupFailure;
/* mandatory */
/* c1. Transaction ID (integer value)*/
// ie = (M2AP_M2SetupFailure_Ies_t *)calloc(1, sizeof(M2AP_M2SetupFailure_Ies_t));
// ie->id = M2AP_ProtocolIE_ID_id_GlobalENB_ID;
// ie->criticality = M2AP_Criticality_reject;
// ie->value.present = M2AP_M2SetupFailure_Ies__value_PR_GlobalENB_ID;
// ie->value.choice.GlobalENB_ID = M2AP_get_next_transaction_identifier(enb_mod_idP, mce_mod_idP);
// ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
/* mandatory */
/* c2. Cause */
ie = (M2AP_M2SetupFailure_Ies_t *)calloc(1, sizeof(M2AP_M2SetupFailure_Ies_t));
ie->id = M2AP_ProtocolIE_ID_id_Cause;
ie->criticality = M2AP_Criticality_ignore;
ie->value.present = M2AP_M2SetupFailure_Ies__value_PR_Cause;
ie->value.choice.Cause.present = M2AP_Cause_PR_radioNetwork;
ie->value.choice.Cause.choice.radioNetwork = M2AP_CauseRadioNetwork_unspecified;
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
/* optional */
/* c3. TimeToWait */
if (0) {
ie = (M2AP_M2SetupFailure_Ies_t *)calloc(1, sizeof(M2AP_M2SetupFailure_Ies_t));
ie->id = M2AP_ProtocolIE_ID_id_TimeToWait;
ie->criticality = M2AP_Criticality_ignore;
ie->value.present = M2AP_M2SetupFailure_Ies__value_PR_TimeToWait;
ie->value.choice.TimeToWait = M2AP_TimeToWait_v10s;
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
}
/* optional */
/* c4. CriticalityDiagnostics*/
if (0) {
ie = (M2AP_M2SetupFailure_Ies_t *)calloc(1, sizeof(M2AP_M2SetupFailure_Ies_t));
ie->id = M2AP_ProtocolIE_ID_id_CriticalityDiagnostics;
ie->criticality = M2AP_Criticality_ignore;
ie->value.present = M2AP_M2SetupFailure_Ies__value_PR_CriticalityDiagnostics;
ie->value.choice.CriticalityDiagnostics.procedureCode = (M2AP_ProcedureCode_t *)calloc(1, sizeof(M2AP_ProcedureCode_t));
*ie->value.choice.CriticalityDiagnostics.procedureCode = M2AP_ProcedureCode_id_m2Setup;
ie->value.choice.CriticalityDiagnostics.triggeringMessage = (M2AP_TriggeringMessage_t *)calloc(1, sizeof(M2AP_TriggeringMessage_t));
*ie->value.choice.CriticalityDiagnostics.triggeringMessage = M2AP_TriggeringMessage_initiating_message;
ie->value.choice.CriticalityDiagnostics.procedureCriticality = (M2AP_Criticality_t *)calloc(1, sizeof(M2AP_Criticality_t));
*ie->value.choice.CriticalityDiagnostics.procedureCriticality = M2AP_Criticality_reject;
//ie->value.choice.CriticalityDiagnostics.transactionID = (M2AP_TransactionID_t *)calloc(1, sizeof(M2AP_TransactionID_t));
//*ie->value.choice.CriticalityDiagnostics.transactionID = 0;
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
}
/* encode */
if (m2ap_encode_pdu(&pdu, &buffer, &len) < 0) {
LOG_E(M2AP, "Failed to encode M2 setup request\n");
return -1;
}
//mce_m2ap_itti_send_sctp_data_req(instance, m2ap_mce_data_from_enb->assoc_id, buffer, len, 0);
m2ap_MCE_itti_send_sctp_data_req(instance,m2ap_mce_data_from_enb->assoc_id,buffer,len,0);
return 0;
}
/*
* MCE Configuration Update
*/
int MCE_send_MCE_CONFIGURATION_UPDATE(instance_t instance, module_id_t du_mod_idP){
AssertFatal(1==0,"Not implemented yet\n");
M2AP_M2AP_PDU_t pdu;
M2AP_MCEConfigurationUpdate_t *out;
M2AP_MCEConfigurationUpdate_Ies_t *ie;
uint8_t *buffer;
uint32_t len;
//int i = 0;
//int j = 0;
/* Create */
/* 0. pdu Type */
memset(&pdu, 0, sizeof(pdu));
pdu.present = M2AP_M2AP_PDU_PR_initiatingMessage;
//pdu.choice.initiatingMessage = (M2AP_InitiatingMessage_t *)calloc(1, sizeof(M2AP_InitiatingMessage_t));
pdu.choice.initiatingMessage.procedureCode = M2AP_ProcedureCode_id_mCEConfigurationUpdate;
pdu.choice.initiatingMessage.criticality = M2AP_Criticality_reject;
pdu.choice.initiatingMessage.value.present = M2AP_InitiatingMessage__value_PR_MCEConfigurationUpdate;
out = &pdu.choice.initiatingMessage.value.choice.MCEConfigurationUpdate;
/* mandatory */
/* c1. Transaction ID (integer value)*/
ie = (M2AP_MCEConfigurationUpdate_Ies_t *)calloc(1, sizeof(M2AP_MCEConfigurationUpdate_Ies_t));
ie->id = M2AP_ProtocolIE_ID_id_GlobalMCE_ID;
ie->criticality = M2AP_Criticality_reject; //?
ie->value.present = M2AP_MCEConfigurationUpdate_Ies__value_PR_GlobalMCE_ID;
//ie->value.choice.TransactionID = M2AP_get_next_transaction_identifier(enb_mod_idP, cu_mod_idP);
MCC_MNC_TO_PLMNID(0,0,3/*instance_p->mcc, instance_p->mnc, instance_p->mnc_digit_length,*/
,&ie->value.choice.GlobalMCE_ID.pLMN_Identity);
ie->value.choice.GlobalMCE_ID.mCE_ID.buf =calloc(2, sizeof(uint8_t));
ie->value.choice.GlobalMCE_ID.mCE_ID.size=2;
//ie->value.choice.GlobalMCE_ID.mCE_ID.bits_unused=6;
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
/* optional */
/* c2. MCEname */
//if (m2ap_setup_resp->MCEname != NULL) {
// ie = (M2AP_MCEConfigurationUpdate_Ies_t *)calloc(1, sizeof(M2AP_MCEConfigurationUpdate_Ies_t));
// ie->id = M2AP_ProtocolIE_ID_id_MCEname;
// ie->criticality = M2AP_Criticality_ignore;
// ie->value.present = M2AP_MCEConfigurationUpdate_Ies__value_PR_MCEname;
// OCTET_STRING_fromBuf(&ie->value.choice.MCEname, m2ap_setup_resp->MCEname,
// strlen(m2ap_setup_resp->MCEname));
// ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
//}
/* mandatory */
/* c3. cells to be Activated list */
ie = (M2AP_MCEConfigurationUpdate_Ies_t *)calloc(1, sizeof(M2AP_MCEConfigurationUpdate_Ies_t));
ie->id = M2AP_ProtocolIE_ID_id_MCCHrelatedBCCH_ConfigPerMBSFNArea;
ie->criticality = M2AP_Criticality_reject;
ie->value.present = M2AP_MCEConfigurationUpdate_Ies__value_PR_MCCHrelatedBCCH_ConfigPerMBSFNArea;
M2AP_MCCHrelatedBCCH_ConfigPerMBSFNArea_ItemIEs_t * mcch_related_bcch_config_per_mbsfn_area_item_ies;
mcch_related_bcch_config_per_mbsfn_area_item_ies = (M2AP_MCCHrelatedBCCH_ConfigPerMBSFNArea_ItemIEs_t*)calloc(1,sizeof(M2AP_MCCHrelatedBCCH_ConfigPerMBSFNArea_ItemIEs_t));
mcch_related_bcch_config_per_mbsfn_area_item_ies->id=M2AP_ProtocolIE_ID_id_MCCHrelatedBCCH_ConfigPerMBSFNArea_Item;
mcch_related_bcch_config_per_mbsfn_area_item_ies->criticality = M2AP_Criticality_ignore;
mcch_related_bcch_config_per_mbsfn_area_item_ies->value.present=M2AP_MCCHrelatedBCCH_ConfigPerMBSFNArea_ItemIEs__value_PR_MCCHrelatedBCCH_ConfigPerMBSFNArea_Item;
M2AP_MCCHrelatedBCCH_ConfigPerMBSFNArea_Item_t * config_per_mbsfn_area_item;
config_per_mbsfn_area_item = &mcch_related_bcch_config_per_mbsfn_area_item_ies->value.choice.MCCHrelatedBCCH_ConfigPerMBSFNArea_Item;
{
config_per_mbsfn_area_item->pdcchLength=M2AP_MCCHrelatedBCCH_ConfigPerMBSFNArea_Item__pdcchLength_s1;
config_per_mbsfn_area_item->offset=0;
config_per_mbsfn_area_item->repetitionPeriod=M2AP_MCCHrelatedBCCH_ConfigPerMBSFNArea_Item__repetitionPeriod_rf32;
config_per_mbsfn_area_item->modificationPeriod=M2AP_MCCHrelatedBCCH_ConfigPerMBSFNArea_Item__modificationPeriod_rf512;
config_per_mbsfn_area_item->subframeAllocationInfo.buf = MALLOC(1);
config_per_mbsfn_area_item->subframeAllocationInfo.size=1;
//config_per_mbsfn_area_item->subframeAllocationInfo.buf[0]=0x1<<7;
config_per_mbsfn_area_item->subframeAllocationInfo.bits_unused=2;
//memset(&config_per_mbsfn_area_item->subframeAllocationInfo,0,sizeof(BIT_STRING_t));
config_per_mbsfn_area_item->modulationAndCodingScheme = M2AP_MCCHrelatedBCCH_ConfigPerMBSFNArea_Item__modulationAndCodingScheme_n2;
ASN_SEQUENCE_ADD(&ie->value.choice.MCCHrelatedBCCH_ConfigPerMBSFNArea.list,mcch_related_bcch_config_per_mbsfn_area_item_ies);
}
//config_per_mbsfn_area_item->cellInformationList = ;//(M2AP_Cell_Information_List*)calloc(1,sizeof(M2AP_Cell_Information_List));
//config_per_mbsfn_area_item->subframeAllocationInfo.bits_unused = 4;
//ASN_SEQUENCE_ADD(&ie->value.choice.MCCHrelatedBCCH_ConfigPerMBSFNArea.list,config_per_mbsfn_area_item);
//config_per_mbsfn_area_item = &ie->value.choice.MCCHrelatedBCCH_ConfigPerMBSFNArea;
//{
//}
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
/* M2AP_MCCHrelatedBCCH_ConfigPerMBSFNArea_t */
//...
// int num_cells_to_activate = f1ap_setup_resp->num_cells_to_activate;
// LOG_D(M2AP, "num_cells_to_activate = %d \n", num_cells_to_activate);
// for (i=0;
// i<num_cells_to_activate;
// i++) {
//
// M2AP_Cells_to_be_Activated_List_ItemIEs_t *cells_to_be_activated_list_item_ies;
// cells_to_be_activated_list_item_ies = (M2AP_Cells_to_be_Activated_List_ItemIEs_t *)calloc(1, sizeof(M2AP_Cells_to_be_Activated_List_ItemIEs_t));
// cells_to_be_activated_list_item_ies->id = M2AP_ProtocolIE_ID_id_Cells_to_be_Activated_List_Item;
// cells_to_be_activated_list_item_ies->criticality = M2AP_Criticality_reject;
// cells_to_be_activated_list_item_ies->value.present = M2AP_Cells_to_be_Activated_List_ItemIEs__value_PR_Cells_to_be_Activated_List_Item;
//
// /* 3.1 cells to be Activated list item */
// M2AP_Cells_to_be_Activated_List_Item_t cells_to_be_activated_list_item;
// memset((void *)&cells_to_be_activated_list_item, 0, sizeof(M2AP_Cells_to_be_Activated_List_Item_t));
//
// /* - nRCGI */
// M2AP_NRCGI_t nRCGI;
// MCC_MNC_TO_PLMNID(f1ap_setup_resp->mcc[i], f1ap_setup_resp->mnc[i], f1ap_setup_resp->mnc_digit_length[i],
// &nRCGI.pLMN_Identity);
// NR_CELL_ID_TO_BIT_STRING(f1ap_setup_resp->nr_cellid[i], &nRCGI.nRCellIdentity);
// cells_to_be_activated_list_item.nRCGI = nRCGI;
//
// /* optional */
// /* - nRPCI */
// if (1) {
// cells_to_be_activated_list_item.nRPCI = (M2AP_NRPCI_t *)calloc(1, sizeof(M2AP_NRPCI_t));
// *cells_to_be_activated_list_item.nRPCI = f1ap_setup_resp->nrpci[i]; // int 0..1007
// }
//
// /* optional */
// /* - gNB-MCE System Information */
// if (1) {
// /* 3.1.2 gNB-MCESystem Information */
// M2AP_Cells_to_be_Activated_List_ItemExtIEs_t *cells_to_be_activated_list_itemExtIEs;
// cells_to_be_activated_list_itemExtIEs = (M2AP_Cells_to_be_Activated_List_ItemExtIEs_t *)calloc(1, sizeof(M2AP_Cells_to_be_Activated_List_ItemExtIEs_t));
// cells_to_be_activated_list_itemExtIEs->id = M2AP_ProtocolIE_ID_id_gNB_MCESystemInformation;
// cells_to_be_activated_list_itemExtIEs->criticality = M2AP_Criticality_reject;
// cells_to_be_activated_list_itemExtIEs->extensionValue.present = M2AP_Cells_to_be_Activated_List_ItemExtIEs__extensionValue_PR_GNB_MCESystemInformation;
//
// M2AP_GNB_MCESystemInformation_t *gNB_MCESystemInformation = (M2AP_GNB_MCESystemInformation_t *)calloc(1, sizeof(M2AP_GNB_MCESystemInformation_t));
// //LOG_I(M2AP, "%s() SI %d size %d: ", __func__, i, f1ap_setup_resp->SI_container_length[i][0]);
// //for (int n = 0; n < f1ap_setup_resp->SI_container_length[i][0]; n++)
// // printf("%02x ", f1ap_setup_resp->SI_container[i][0][n]);
// //printf("\n");
// OCTET_STRING_fromBuf(&gNB_MCESystemInformation->sImessage,
// (const char*)f1ap_setup_resp->SI_container[i][0],
// f1ap_setup_resp->SI_container_length[i][0]);
//
// LOG_D(M2AP, "f1ap_setup_resp->SI_container_length = %d \n", f1ap_setup_resp->SI_container_length[0][0]);
// cells_to_be_activated_list_itemExtIEs->extensionValue.choice.GNB_MCESystemInformation = *gNB_MCESystemInformation;
//
//
// M2AP_ProtocolExtensionContainer_160P9_t p_160P9_t;
// memset((void *)&p_160P9_t, 0, sizeof(M2AP_ProtocolExtensionContainer_160P9_t));
//
// ASN_SEQUENCE_ADD(&p_160P9_t.list,
// cells_to_be_activated_list_itemExtIEs);
// cells_to_be_activated_list_item.iE_Extensions = (struct M2AP_ProtocolExtensionContainer*)&p_160P9_t;
//
// }
// /* ADD */
// cells_to_be_activated_list_item_ies->value.choice.Cells_to_be_Activated_List_Item = cells_to_be_activated_list_item;
// ASN_SEQUENCE_ADD(&ie->value.choice.Cells_to_be_Activated_List.list,
// cells_to_be_activated_list_item_ies);
// }
// ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
/* encode */
if (m2ap_encode_pdu(&pdu, &buffer, &len) < 0) {
LOG_E(M2AP, "Failed to encode M2 response\n");
return -1;
}
//MCE_m2ap_itti_send_sctp_data_req(instance, m2ap_mce_data_from_du->assoc_id, buffer, len, 0);
//printf(",m2ap_mce_data_from_enb->assoc_id %d\n",m2ap_mce_data_from_enb->assoc_id);
m2ap_MCE_itti_send_sctp_data_req(instance,m2ap_mce_data_from_enb->assoc_id,buffer,len,0);
}
int MCE_handle_MCE_CONFIGURATION_UPDATE_FAILURE(instance_t instance,
uint32_t assoc_id,
uint32_t stream,
M2AP_M2AP_PDU_t *pdu){
AssertFatal(1==0,"Not implemented yet\n");
LOG_D(M2AP, "MCE_handle_MCE_CONFIGURATION_UPDATE_FAILURE\n");
M2AP_MCEConfigurationUpdateFailure_t *in = &pdu->choice.unsuccessfulOutcome.value.choice.MCEConfigurationUpdateFailure;
//M2AP_MCEConfigurationUpdateFailure_Ies_t *ie;
MessageDef *msg_p = itti_alloc_new_message (TASK_M2AP_MCE, M2AP_MCE_CONFIGURATION_UPDATE_FAILURE);
LOG_D(M2AP, "M2AP: MCEConfigurationUpdate-Failure: protocolIEs.list.count %d\n",
in->protocolIEs.list.count);
// for (int i=0;i < in->protocolIEs.list.count; i++) {
// ie = in->protocolIEs.list.array[i];
// // switch (ie->id) {
// // case M2AP_ProtocolIE_ID_id_TimeToWait:
// // AssertFatal(ie->criticality == M2AP_Criticality_ignore,
// // "ie->criticality != M2AP_Criticality_ignore\n");
// // AssertFatal(ie->value.present == M2AP_M2SetupFailure_Ies__value_PR_TimeToWait,
// // "ie->value.present != M2AP_M2SetupFailure_Ies__value_PR_TimeToWait\n");
// // LOG_D(M2AP, "M2AP: M2Setup-Failure: TimeToWait %d\n");/*,
// // GlobalMCE_ID);*/
// // break;
// // }
// }
//AssertFatal(GlobalMCE_ID!=-1,"GlobalMCE_ID was not sent\n");
//AssertFatal(num_cells_to_activate>0,"No cells activated\n");
//M2AP_SETUP_RESP (msg_p).num_cells_to_activate = num_cells_to_activate;
//for (int i=0;i<num_cells_to_activate;i++)
// AssertFatal(M2AP_SETUP_RESP (msg_p).num_SI[i] > 0, "System Information %d is missing",i);
//MSC_LOG_RX_MESSAGE(
// MSC_M2AP_eNB,
// MSC_M2AP_CU,
// 0,
// 0,
// MSC_AS_TIME_FMT" eNB_handle_M2_SETUP_RESPONSE successfulOutcome assoc_id %d",
// 0,0,//MSC_AS_TIME_ARGS(ctxt_pP),
// assoc_id);
//LOG_D(M2AP, "Sending M2AP_SETUP_RESP ITTI message to ENB_APP with assoc_id (%d->%d)\n",
// assoc_id,ENB_MOeNBLE_ID_TO_INSTANCE(assoc_id));
itti_send_msg_to_task(TASK_MCE_APP, ENB_MODULE_ID_TO_INSTANCE(assoc_id), msg_p);
return 0;
}
int MCE_handle_MCE_CONFIGURATION_UPDATE_ACKNOWLEDGE(instance_t instance,
uint32_t assoc_id,
uint32_t stream,
M2AP_M2AP_PDU_t *pdu){
AssertFatal(1==0,"Not implemented yet\n");
LOG_D(M2AP, "MCE_handle_MCE_CONFIGURATION_UPDATE_ACKNOWLEDGE assoc_id %d\n",assoc_id);
MessageDef *message_p;
//M2AP_MCEConfigurationUpdateAcknowledge_t *container;
//M2AP_MCEConfigurationUpdateAcknowledge_Ies_t *ie;
//int i = 0;
DevAssert(pdu != NULL);
//container = &pdu->choice.initiatingMessage.value.choice.MCEConfigurationUpdate;
/* M2 Setup Request == Non UE-related procedure -> stream 0 */
if (stream != 0) {
LOG_D(M2AP, "[SCTP %d] Received MMBS session start request on stream != 0 (%d)\n",
assoc_id, stream);
}
message_p = itti_alloc_new_message (TASK_M2AP_MCE, M2AP_MCE_CONFIGURATION_UPDATE_ACK);
itti_send_msg_to_task(TASK_MCE_APP, ENB_MODULE_ID_TO_INSTANCE(instance), message_p);
return 0;
}
/*
* ENB Configuration Update
*/
int MCE_handle_ENB_CONFIGURATION_UPDATE(instance_t instance,
uint32_t assoc_id,
uint32_t stream,
M2AP_M2AP_PDU_t *pdu){
AssertFatal(1==0,"Not implemented yet\n");
LOG_D(M2AP, "MCE_handle_MCE_CONFIGURATION_UPDATE_ACKNOWLEDGE assoc_id %d\n",assoc_id);
MessageDef *message_p;
//M2AP_MCEConfigurationUpdateAcknowledge_t *container;
//M2AP_MCEConfigurationUpdateAcknowledge_Ies_t *ie;
//int i = 0;
DevAssert(pdu != NULL);
//container = &pdu->choice.initiatingMessage.value.choice.MCEConfigurationUpdate;
/* M2 Setup Request == Non UE-related procedure -> stream 0 */
if (stream != 0) {
LOG_D(M2AP, "[SCTP %d] Received MMBS session start request on stream != 0 (%d)\n",
assoc_id, stream);
}
message_p = itti_alloc_new_message (TASK_M2AP_MCE, M2AP_MCE_CONFIGURATION_UPDATE_ACK);
itti_send_msg_to_task(TASK_MCE_APP, ENB_MODULE_ID_TO_INSTANCE(instance), message_p);
return 0;
}
int MCE_send_ENB_CONFIGURATION_UPDATE_FAILURE(instance_t instance,
m2ap_enb_configuration_update_failure_t * m2ap_enb_configuration_update_failure){
AssertFatal(1==0,"Not implemented yet\n");
}
int MCE_send_ENB_CONFIGURATION_UPDATE_ACKNOWLEDGE(instance_t instance,
m2ap_enb_configuration_update_ack_t *m2ap_enb_configuration_update_ack){
AssertFatal(1==0,"Not implemented yet\n");
}
/*
* Error Indication
*/
int MCE_handle_ERROR_INDICATION(instance_t instance,
uint32_t assoc_id,
uint32_t stream,
M2AP_M2AP_PDU_t *pdu) {
AssertFatal(1==0,"Not implemented yet\n");
}
int MCE_send_ERROR_INDICATION(instance_t instance, M2AP_ErrorIndication_t *ErrorIndication) {
AssertFatal(1==0,"Not implemented yet\n");
}
/*
* Session Update Request
*/
int MCE_send_MBMS_SESSION_UPDATE_REQUEST(instance_t instance, m2ap_mbms_session_update_req_t * m2ap_mbms_session_update_req){
AssertFatal(1==0,"Not implemented yet\n");
//M2AP_SessionUpdateRequest_t SessionUpdateRequest;
}
int MCE_handle_MBMS_SESSION_UPDATE_RESPONSE(instance_t instance,
uint32_t assoc_id,
uint32_t stream,
M2AP_M2AP_PDU_t *pdu){
AssertFatal(1==0,"Not implemented yet\n");
}
int MCE_handle_MBMS_SESSION_UPDATE_FAILURE(instance_t instance,
uint32_t assoc_id,
uint32_t stream,
M2AP_M2AP_PDU_t *pdu){
AssertFatal(1==0,"Not implemented yet\n");
}
/*
* Service Counting Request
*/
int MCE_send_MBMS_SERVICE_COUNTING_REQUEST(instance_t instance, module_id_t du_mod_idP){
AssertFatal(1==0,"Not implemented yet\n");
//M2AP_MbmsServiceCountingRequest_t MbmsServiceCountingRequest;
}
int MCE_handle_MBMS_SERVICE_COUNTING_RESPONSE(instance_t instance,
uint32_t assoc_id,
uint32_t stream,
M2AP_M2AP_PDU_t *pdu){
AssertFatal(1==0,"Not implemented yet\n");
}
int MCE_handle_MBMS_SESSION_COUNTING_FAILURE(instance_t instance,
uint32_t assoc_id,
uint32_t stream,
M2AP_M2AP_PDU_t *pdu){
AssertFatal(1==0,"Not implemented yet\n");
}
/*
* Service Counting Results Report
*/
int MCE_handle_MBMS_SESSION_COUNTING_RESULTS_REPORT(instance_t instance,
uint32_t assoc_id,
uint32_t stream,
M2AP_M2AP_PDU_t *pdu){
AssertFatal(1==0,"Not implemented yet\n");
}
/*
* Overload Notification
*/
int MCE_handle_MBMS_OVERLOAD_NOTIFICATION(instance_t instance,
uint32_t assoc_id,
uint32_t stream,
M2AP_M2AP_PDU_t *pdu){
AssertFatal(1==0,"Not implemented yet\n");
}