Files
openairinterface5g/openair3/M3AP/m3ap_MME_interface_management.c
T
Javier Morgade 365527d401 M3AP 3GPP TS 36.444 interface implemented:
1.MME entity developed to handle M3 side (new dedicated task developed: TASK_MME_APP) (these procedures should be moved to OPENAIR-CN ... just implemented to easy the E-UTRAN MBMS stuff development)
        2.MCE side M3 interface procedures (new dedicated task developed: TASK_M3AP_MCE)
        3.MME side M3 interface procedures (new dedicated task developed: TASK_M2AP_MME) (these procedures should be moved to OPENAIR-CN ... just implemented to easy the E-UTRAN MBMS stuff development)
        4.ASN1 bindings for m3ap-14.0.0.asn1 implemented and tested
        5.MME 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:53:39 +02:00

1163 lines
51 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 m3ap_MME_interface_management.c
* \brief m3ap interface management for MME
* \author Javier Morgade
* \date 2019
* \version 0.1
* \company Vicomtech
* \email: javier.morgade@ieee.org
* \note
* \warning
*/
#include "m3ap_common.h"
#include "m3ap_encoder.h"
#include "m3ap_decoder.h"
#include "m3ap_itti_messaging.h"
#include "m3ap_MME_interface_management.h"
#include "conversions.h"
#include "M3AP_ECGI.h"
extern m3ap_setup_req_t *m3ap_mme_data_from_mce;
uint8_t m3ap_start_message[] = {
0x00, 0x00, 0x00, 0x4b, 0x00, 0x00, 0x07, 0x00,
0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00,
0x07, 0x00, 0x55, 0xf5, 0x01, 0x00, 0x00, 0x01,
0x00, 0x04, 0x00, 0x0d, 0x60, 0x01, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x40, 0x01,
0x7a, 0x00, 0x05, 0x00, 0x03, 0x07, 0x08, 0x00,
0x00, 0x06, 0x00, 0x04, 0x03, 0x00, 0x00, 0x00,
0x00, 0x10, 0x00, 0x01, 0x00, 0x00, 0x07, 0x00,
0x0e, 0x00, 0xe8, 0x0a, 0x0a, 0x0a, 0x00, 0x0a,
0xc8, 0x0a, 0xfe, 0x00, 0x00, 0x00, 0x01
};
/*
* MBMS Session start
*/
int MME_send_MBMS_SESSION_START_REQUEST(instance_t instance/*, uint32_t assoc_id*/,m3ap_session_start_req_t* m3ap_session_start_req){
//AssertFatal(1==0,"Not implemented yet\n");
//module_id_t enb_mod_idP=0;
//module_id_t du_mod_idP=0;
M3AP_M3AP_PDU_t pdu;
M3AP_MBMSSessionStartRequest_t *out;
M3AP_MBMSSessionStartRequest_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 = M3AP_M3AP_PDU_PR_initiatingMessage;
//pdu.choice.initiatingMessage = (M3AP_InitiatingMessage_t *)calloc(1, sizeof(M3AP_InitiatingMessage_t));
pdu.choice.initiatingMessage.procedureCode = M3AP_ProcedureCode_id_mBMSsessionStart;
pdu.choice.initiatingMessage.criticality = M3AP_Criticality_reject;
pdu.choice.initiatingMessage.value.present = M3AP_InitiatingMessage__value_PR_MBMSSessionStartRequest;
out = &pdu.choice.initiatingMessage.value.choice.MBMSSessionStartRequest;
/* mandatory */
/* c1. MME_MBMS_M3AP_ID (integer value) */ //long
ie = (M3AP_MBMSSessionStartRequest_IEs_t *)calloc(1, sizeof(M3AP_MBMSSessionStartRequest_IEs_t));
ie->id = M3AP_ProtocolIE_ID_id_MME_MBMS_M3AP_ID;
ie->criticality = M3AP_Criticality_reject;
ie->value.present = M3AP_MBMSSessionStartRequest_IEs__value_PR_MME_MBMS_M3AP_ID;
//ie->value.choice.MME_MBMS_M3AP_ID = /*F1AP_get_next_transaction_identifier(enb_mod_idP, du_mod_idP);*/ //?
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
/* mandatory */
/* c2. TMGI */
ie = (M3AP_MBMSSessionStartRequest_IEs_t *)calloc(1, sizeof(M3AP_MBMSSessionStartRequest_IEs_t));
ie->id = M3AP_ProtocolIE_ID_id_TMGI;
ie->criticality = M3AP_Criticality_reject;
ie->value.present = M3AP_MBMSSessionStartRequest_IEs__value_PR_TMGI;
M3AP_TMGI_t *tmgi = &ie->value.choice.TMGI;
{
MCC_MNC_TO_PLMNID(0,0,3,&tmgi->pLMNidentity);
uint8_t TMGI[5] = {4,3,2,1,0};
OCTET_STRING_fromBuf(&tmgi->serviceID,(const char*)&TMGI[2],3);
}
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
/* optional */
/* c2. MBMS_Session_ID */
if(0){
ie = (M3AP_MBMSSessionStartRequest_IEs_t *)calloc(1, sizeof(M3AP_MBMSSessionStartRequest_IEs_t));
ie->id = M3AP_ProtocolIE_ID_id_MBMS_Session_ID;
ie->criticality = M3AP_Criticality_ignore;
ie->value.present = M3AP_MBMSSessionStartRequest_IEs__value_PR_MBMS_Session_ID;
//M3AP_MBMS_Session_ID_t * mbms_session_id = &ie->value.choice.MBMS_Session_ID;
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
}
/* mandatory */
/* c2. MBMS_E_RAB_QoS_Parameters */
ie = (M3AP_MBMSSessionStartRequest_IEs_t *)calloc(1, sizeof(M3AP_MBMSSessionStartRequest_IEs_t));
ie->id = M3AP_ProtocolIE_ID_id_MBMS_E_RAB_QoS_Parameters;
ie->criticality = M3AP_Criticality_reject;
ie->value.present = M3AP_MBMSSessionStartRequest_IEs__value_PR_MBMS_E_RAB_QoS_Parameters;
M3AP_MBMS_E_RAB_QoS_Parameters_t * mbms_e_rab_qos_parameters = &ie->value.choice.MBMS_E_RAB_QoS_Parameters;
{
//M3AP_QCI_t * qci = &mbms_e_rab_qos_parameters->qCI; //long
mbms_e_rab_qos_parameters->qCI = 1;
//struct M3AP_GBR_QosInformation *gbrQosInformation; /* OPTIONAL */
}
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
/* mandatory */
/* c2. MBMS_Session_Duration */
ie = (M3AP_MBMSSessionStartRequest_IEs_t *)calloc(1, sizeof(M3AP_MBMSSessionStartRequest_IEs_t));
ie->id = M3AP_ProtocolIE_ID_id_MBMS_Session_Duration;
ie->criticality = M3AP_Criticality_reject;
ie->value.present = M3AP_MBMSSessionStartRequest_IEs__value_PR_MBMS_Session_Duration;
M3AP_MBMS_Session_Duration_t * mbms_session_duration = &ie->value.choice.MBMS_Session_Duration;
{
uint8_t duration[5] = {4,3,2,1,0};
OCTET_STRING_fromBuf(mbms_session_duration,(const char*)&duration[2],3);
}
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
/* mandatory */
/* c2 MBMS_Service_Area */
ie = (M3AP_MBMSSessionStartRequest_IEs_t *)calloc(1, sizeof(M3AP_MBMSSessionStartRequest_IEs_t));
ie->id = M3AP_ProtocolIE_ID_id_MBMS_Service_Area;
ie->criticality = M3AP_Criticality_ignore;
ie->value.present = M3AP_MBMSSessionStartRequest_IEs__value_PR_MBMS_Service_Area;
M3AP_MBMS_Service_Area_t * mbms_service_area = &ie->value.choice.MBMS_Service_Area;
{
uint8_t duration[5] = {4,3,2,1,0};
OCTET_STRING_fromBuf(mbms_service_area,(const char*)&duration[2],1);
}
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
/* mandatory */
/* c2 MinimumTimeToMBMSDataTransfer */
ie = (M3AP_MBMSSessionStartRequest_IEs_t *)calloc(1, sizeof(M3AP_MBMSSessionStartRequest_IEs_t));
ie->id = M3AP_ProtocolIE_ID_id_MinimumTimeToMBMSDataTransfer;
ie->criticality = M3AP_Criticality_reject;
ie->value.present = M3AP_MBMSSessionStartRequest_IEs__value_PR_MinimumTimeToMBMSDataTransfer;
M3AP_MinimumTimeToMBMSDataTransfer_t * minimumtimetombmsdatatransfer = &ie->value.choice.MinimumTimeToMBMSDataTransfer;
{
uint8_t duration[5] = {4,3,2,1,0};
OCTET_STRING_fromBuf(minimumtimetombmsdatatransfer,(const char*)&duration[2],1);
}
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
/* mandatory */
/* c2 TNL_Information */
ie = (M3AP_MBMSSessionStartRequest_IEs_t *)calloc(1, sizeof(M3AP_MBMSSessionStartRequest_IEs_t));
ie->id = M3AP_ProtocolIE_ID_id_TNL_Information;
ie->criticality = M3AP_Criticality_ignore;
ie->value.present = M3AP_MBMSSessionStartRequest_IEs__value_PR_TNL_Information;
M3AP_TNL_Information_t * tnl_information = &ie->value.choice.TNL_Information;
{
//OCTET_STRING_fromBuf(&tnl_information->iPMCAddress,"1204",strlen("1234"));
//OCTET_STRING_fromBuf(&tnl_information->iPSourceAddress,"1204",strlen("1234"));
//OCTET_STRING_fromBuf(&tnl_information->gTP_DLTEID,"1204",strlen("1234"));
uint32_t gtp_dlteid = 1;
GTP_TEID_TO_ASN1(gtp_dlteid,&tnl_information->gTP_DLTEID);
//tnl_information->iPMCAddress.buf = calloc(4,sizeof(uint8_t));
//tnl_information->iPMCAddress.buf[0]
//tnl_information->iPMCAddress.buf[1]
//tnl_information->iPMCAddress.buf[2]
//tnl_information->iPMCAddress.buf[3]
//tnl_information->iPMCAddress.buf.size = 4;
uint32_t ip= (224<<24) | (0) << 16 | (0) << 8 | (2);
INT32_TO_OCTET_STRING(ip,&tnl_information->iPMCAddress);
ip= (224<<24) | (0) << 16 | (0) << 8 | (2);
INT32_TO_OCTET_STRING(ip,&tnl_information->iPSourceAddress);
}
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
/* optional */
/* c2 Time_ofMBMS_DataTransfer */
if(0){
ie = (M3AP_MBMSSessionStartRequest_IEs_t *)calloc(1, sizeof(M3AP_MBMSSessionStartRequest_IEs_t));
ie->id = M3AP_ProtocolIE_ID_id_Time_ofMBMS_DataTransfer;
ie->criticality = M3AP_Criticality_ignore;
ie->value.present = M3AP_MBMSSessionStartRequest_IEs__value_PR_Absolute_Time_ofMBMS_Data;
//M3AP_Absolute_Time_ofMBMS_Data_t * absolute_time_ofmbms_data = &ie->value.choice.Absolute_Time_ofMBMS_Data;
//{
//char duration[5] = {4,3,2,1,0};
//OCTET_STRING_fromBuf(absolute_time_ofmbms_data,(const char*)&duration[2],3);
//}
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
}
/* optional */
/* c2 MBMS_Cell_List */
if(0){
ie = (M3AP_MBMSSessionStartRequest_IEs_t *)calloc(1, sizeof(M3AP_MBMSSessionStartRequest_IEs_t));
ie->id = M3AP_ProtocolIE_ID_id_MBMS_Cell_List;
ie->criticality = M3AP_Criticality_ignore;
ie->value.present = M3AP_MBMSSessionStartRequest_IEs__value_PR_MBMS_Cell_List;
M3AP_MBMS_Cell_List_t * mbms_cell_list = &ie->value.choice.MBMS_Cell_List;
M3AP_ECGI_t * ecgi = (M3AP_ECGI_t*)calloc(1,sizeof(M3AP_ECGI_t));
{
//MCC_MNC_TO_PLMNID(0,0,3,ecgi->pLMN_Identity);
//MACRO_ENB_ID_TO_CELL_IDENTITY(1,0,ecgi->eUTRANcellIdentifier);
ASN_SEQUENCE_ADD(&mbms_cell_list->list,ecgi);
}
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
}
/* encode */
if (m3ap_encode_pdu(&pdu,&buffer,&len) < 0){
return -1;
}
// buffer = &m3ap_start_message[0];
// len=8*9+7;
//
m3ap_MME_itti_send_sctp_data_req(instance, m3ap_mme_data_from_mce->assoc_id, buffer, len, 0);
return 0;
}
int MME_handle_MBMS_SESSION_START_RESPONSE(instance_t instance,
uint32_t assoc_id,
uint32_t stream,
M3AP_M3AP_PDU_t *pdu){
// AssertFatal(1==0,"Not implemented yet\n");
LOG_D(M3AP, "MME_handle_MBMS_SESSION_START_RESPONSE\n");
AssertFatal(pdu->present == M3AP_M3AP_PDU_PR_successfulOutcome,
"pdu->present != M3AP_M3AP_PDU_PR_successfulOutcome\n");
AssertFatal(pdu->choice.successfulOutcome.procedureCode == M3AP_ProcedureCode_id_mBMSsessionStart,
"pdu->choice.successfulOutcome->procedureCode != M3AP_ProcedureCode_id_sessionStart\n");
AssertFatal(pdu->choice.successfulOutcome.criticality == M3AP_Criticality_reject,
"pdu->choice.successfulOutcome->criticality != M3AP_Criticality_reject\n");
AssertFatal(pdu->choice.successfulOutcome.value.present == M3AP_SuccessfulOutcome__value_PR_MBMSSessionStartResponse,
"pdu->choice.successfulOutcome.value.present != M3AP_SuccessfulOutcome__value_PR_MBMSSessionStartResponse\n");
M3AP_MBMSSessionStartResponse_t *in = &pdu->choice.successfulOutcome.value.choice.MBMSSessionStartResponse;
M3AP_MBMSSessionStartResponse_IEs_t *ie;
int MME_MBMS_M3AP_ID=-1;
int MCE_MBMS_M3AP_ID=-1;
MessageDef *msg_g = itti_alloc_new_message(TASK_M3AP_MME,M3AP_MBMS_SESSION_START_RESP); //TODO
LOG_D(M3AP, "M3AP: 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 M3AP_ProtocolIE_ID_id_MME_MBMS_M3AP_ID:
AssertFatal(ie->criticality == M3AP_Criticality_reject,
"ie->criticality != M3AP_Criticality_reject\n");
AssertFatal(ie->value.present == M3AP_MBMSSessionStartResponse_IEs__value_PR_MME_MBMS_M3AP_ID,
"ie->value.present != M3AP_sessionStartResponse_IEs__value_PR_MME_MBMS_M3AP_ID\n");
MME_MBMS_M3AP_ID=ie->value.choice.MME_MBMS_M3AP_ID;
LOG_D(M3AP, "M3AP: SessionStart-Resp: MME_MBMS_M3AP_ID %d\n",
MME_MBMS_M3AP_ID);
break;
case M3AP_ProtocolIE_ID_id_MCE_MBMS_M3AP_ID:
AssertFatal(ie->criticality == M3AP_Criticality_reject,
"ie->criticality != M3AP_Criticality_reject\n");
AssertFatal(ie->value.present == M3AP_MBMSSessionStartResponse_IEs__value_PR_MCE_MBMS_M3AP_ID,
"ie->value.present != M3AP_sessionStartResponse_IEs__value_PR_MCE_MBMS_M3AP_ID\n");
MCE_MBMS_M3AP_ID=ie->value.choice.MCE_MBMS_M3AP_ID;
LOG_D(M3AP, "M3AP: SessionStart-Resp: MCE_MBMS_M3AP_ID %d\n",
MCE_MBMS_M3AP_ID);
break;
}
}
//AssertFatal(MME_MBMS_M3AP_ID!=-1,"MME_MBMS_M3AP_ID was not sent\n");
//AssertFatal(MCE_MBMS_M3AP_ID!=-1,"MCE_MBMS_M3AP_ID was not sent\n");
////M3AP_SESSION_START_RESP(msg_p).
//// MSC_LOG_RX_MESSAGE(
//// MSC_M3AP_MME,
//// MSC_M3AP_MCE,
// //return 0;
//// 0,
//// 0,
//// MSC_AS_TIME_FMT" MME_handle_M2_SESSION_START_RESPONSE successfulOutcome assoc_id %d",
//// 0,0,//MSC_AS_TIME_ARGS(ctxt_pP),
//// assoc_id);
////
// LOG_W(M3AP, "Sending M3AP_SESSION_START_RESP ITTI message to MCE_APP with assoc_id (%d->%d)\n",
// assoc_id,ENB_MODULE_ID_TO_INSTANCE(assoc_id));
itti_send_msg_to_task(TASK_MME_APP, ENB_MODULE_ID_TO_INSTANCE(assoc_id), msg_g);
return 0;
}
int MME_handle_MBMS_SESSION_START_FAILURE(instance_t instance,
uint32_t assoc_id,
uint32_t stream,
M3AP_M3AP_PDU_t *pdu){
AssertFatal(1==0,"Not implemented yet\n");
}
/*
* MBMS Session stop
*/
int MME_send_MBMS_SESSION_STOP_REQUEST(instance_t instance, m3ap_session_stop_req_t* m3ap_session_stop_req){
// module_id_t enb_mod_idP=0;
// module_id_t du_mod_idP=0;
M3AP_M3AP_PDU_t pdu;
M3AP_MBMSSessionStopRequest_t *out;
M3AP_MBMSSessionStopRequest_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 = M3AP_M3AP_PDU_PR_initiatingMessage;
//pdu.choice.initiatingMessage = (M3AP_InitiatingMessage_t *)calloc(1, sizeof(M3AP_InitiatingMessage_t));
pdu.choice.initiatingMessage.procedureCode = M3AP_ProcedureCode_id_mBMSsessionStop;
pdu.choice.initiatingMessage.criticality = M3AP_Criticality_reject;
pdu.choice.initiatingMessage.value.present = M3AP_InitiatingMessage__value_PR_MBMSSessionStopRequest;
out = &pdu.choice.initiatingMessage.value.choice.MBMSSessionStopRequest;
/* mandatory */
/* c1. MME_MBMS_M3AP_ID (integer value) */ //long
ie = (M3AP_MBMSSessionStopRequest_IEs_t *)calloc(1, sizeof(M3AP_MBMSSessionStopRequest_IEs_t));
ie->id = M3AP_ProtocolIE_ID_id_MME_MBMS_M3AP_ID;
ie->criticality = M3AP_Criticality_reject;
ie->value.present = M3AP_MBMSSessionStopRequest_IEs__value_PR_MME_MBMS_M3AP_ID;
//ie->value.choice.MME_MBMS_M3AP_ID = /*F1AP_get_next_transaction_identifier(enb_mod_idP, du_mod_idP);*/ //?
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
/* mandatory */
/* c2. MCE_MBMS_M3AP_ID (integer value) */ //long
ie = (M3AP_MBMSSessionStopRequest_IEs_t *)calloc(1, sizeof(M3AP_MBMSSessionStopRequest_IEs_t));
ie->id = M3AP_ProtocolIE_ID_id_MCE_MBMS_M3AP_ID;
ie->criticality = M3AP_Criticality_reject;
ie->value.present = M3AP_MBMSSessionStopRequest_IEs__value_PR_MCE_MBMS_M3AP_ID;
//ie->value.choice.MCE_MBMS_M3AP_ID = /*F1AP_get_next_transaction_identifier(enb_mod_idP, du_mod_idP);*/ //?
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
/* encode */
if (m3ap_encode_pdu(&pdu,&buffer,&len) < 0){
return -1;
}
//MME_m3ap_itti_send_sctp_data_req(instance, m3ap_mce_data_from_mce->assoid,buffer,len,0);
m3ap_MME_itti_send_sctp_data_req(instance, m3ap_mme_data_from_mce->assoc_id,buffer,len,0);
return 0;
}
int MME_handle_MBMS_SESSION_STOP_RESPONSE(instance_t instance,
uint32_t assoc_id,
uint32_t stream,
M3AP_M3AP_PDU_t *pdu){
//AssertFatal(1==0,"Not implemented yet\n");
LOG_D(M3AP, "eNB_handle_MBMS_SESSION_STOP_RESPONSE\n");
AssertFatal(pdu->present == M3AP_M3AP_PDU_PR_successfulOutcome,
"pdu->present != M3AP_M3AP_PDU_PR_successfulOutcome\n");
AssertFatal(pdu->choice.successfulOutcome.procedureCode == M3AP_ProcedureCode_id_mBMSsessionStop,
"pdu->choice.successfulOutcome->procedureCode != M3AP_ProcedureCode_id_sessionStop\n");
AssertFatal(pdu->choice.successfulOutcome.criticality == M3AP_Criticality_reject,
"pdu->choice.successfulOutcome->criticality != M3AP_Criticality_reject\n");
AssertFatal(pdu->choice.successfulOutcome.value.present == M3AP_SuccessfulOutcome__value_PR_MBMSSessionStopResponse,
"pdu->choice.successfulOutcome->value.present != M3AP_SuccessfulOutcome__value_PR_MBMSSessionStopResponse\n");
M3AP_MBMSSessionStopResponse_t *in = &pdu->choice.successfulOutcome.value.choice.MBMSSessionStopResponse;
M3AP_MBMSSessionStopResponse_IEs_t *ie;
int MME_MBMS_M3AP_ID=-1;
int MCE_MBMS_M3AP_ID=-1;
MessageDef *msg_g = itti_alloc_new_message(TASK_M3AP_MME,M3AP_MBMS_SESSION_STOP_RESP); //TODO
LOG_D(M3AP, "M3AP: MBMSSessionStop-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 M3AP_ProtocolIE_ID_id_MME_MBMS_M3AP_ID:
AssertFatal(ie->criticality == M3AP_Criticality_reject,
"ie->criticality != M3AP_Criticality_reject\n");
AssertFatal(ie->value.present == M3AP_MBMSSessionStopResponse_IEs__value_PR_MME_MBMS_M3AP_ID,
"ie->value.present != M3AP_MBMSStopResponse_IEs__value_PR_MME_MBMS_M3AP_ID\n");
MME_MBMS_M3AP_ID=ie->value.choice.MME_MBMS_M3AP_ID;
LOG_D(M3AP, "M3AP: MBMSSessionStop-Resp: MME_MBMS_M3AP_ID %d\n",
MME_MBMS_M3AP_ID);
break;
case M3AP_ProtocolIE_ID_id_MCE_MBMS_M3AP_ID:
AssertFatal(ie->criticality == M3AP_Criticality_reject,
"ie->criticality != M3AP_Criticality_reject\n");
AssertFatal(ie->value.present == M3AP_MBMSSessionStopResponse_IEs__value_PR_MCE_MBMS_M3AP_ID,
"ie->value.present != M3AP_MBMSStopResponse_IEs__value_PR_MCE_MBMS_M3AP_ID\n");
MCE_MBMS_M3AP_ID=ie->value.choice.MCE_MBMS_M3AP_ID;
LOG_D(M3AP, "M3AP: MBMSSessionStop-Resp: MCE_MBMS_M3AP_ID %d\n",
MCE_MBMS_M3AP_ID);
break;
}
}
//AssertFatal(MME_MBMS_M3AP_ID!=-1,"MME_MBMS_M3AP_ID was not sent\n");
//AssertFatal(MCE_MBMS_M3AP_ID!=-1,"MCE_MBMS_M3AP_ID was not sent\n");
// M3AP_SESSION_STOP_RESP(msg_p).
// MSC_LOG_RX_MESSAGE(
// MSC_M3AP_MME,
// MSC_M3AP_MCE,
// 0,
// 0,
// MSC_AS_TIME_FMT" MME_handle_M2_SESSION_STOP_RESPONSE successfulOutcome assoc_id %d",
// 0,0,//MSC_AS_TIME_ARGS(ctxt_pP),
// assoc_id);
// LOG_D(M3AP, "Sending M3AP_SESSION_START_RESP ITTI message to MCE_APP with assoc_id (%d->%d)\n",
// assoc_id,MCE_MODULE_ID_TO_INSTANCE(assoc_id));
itti_send_msg_to_task(TASK_MME_APP, ENB_MODULE_ID_TO_INSTANCE(assoc_id), msg_g);
// //
return 0;
}
int MME_handle_MBMS_SESSION_STOP_FAILURE(instance_t instance,
uint32_t assoc_id,
uint32_t stream,
M3AP_M3AP_PDU_t *pdu){
AssertFatal(1==0,"Not implemented yet\n");
}
/*
* Reset
*/
int MME_send_RESET(instance_t instance, m3ap_reset_t * m3ap_reset) {
AssertFatal(1==0,"Not implemented yet\n");
//M3AP_Reset_t Reset;
}
int MME_handle_RESET_ACKKNOWLEDGE(instance_t instance,
uint32_t assoc_id,
uint32_t stream,
M3AP_M3AP_PDU_t *pdu) {
AssertFatal(1==0,"Not implemented yet\n");
}
int MME_handle_RESET(instance_t instance,
uint32_t assoc_id,
uint32_t stream,
M3AP_M3AP_PDU_t *pdu) {
AssertFatal(1==0,"Not implemented yet\n");
}
int MME_send_RESET_ACKNOWLEDGE(instance_t instance, M3AP_ResetAcknowledge_t *ResetAcknowledge) {
AssertFatal(1==0,"Not implemented yet\n");
}
/*
* M3 Setup
*/
int MME_handle_M3_SETUP_REQUEST(instance_t instance,
uint32_t assoc_id,
uint32_t stream,
M3AP_M3AP_PDU_t *pdu)
{
LOG_D(M2AP, "MCE_handle_M3_SETUP_REQUEST assoc_id %d\n",assoc_id);
//AssertFatal(1==0,"Not implemented yet\n");
// LOG_W(M3AP, "MME_handle_M3_SETUP_REQUEST assoc_id %d\n",assoc_id);
//
MessageDef *message_p;
// M3AP_M3SetupRequest_t *container;
// M3AP_M3SetupRequestIEs_t *ie;
// int i = 0,j=0;
//
// DevAssert(pdu != NULL);
//
// container = &pdu->choice.initiatingMessage.value.choice.M3SetupRequest;
//
// /* M3 Setup Request == Non UE-related procedure -> stream 0 */
// if (stream != 0) {
// LOG_W(M3AP, "[SCTP %d] Received m3 setup request on stream != 0 (%d)\n",
// assoc_id, stream);
// }
//
message_p = itti_alloc_new_message(TASK_M3AP_MME, M3AP_SETUP_REQ);
//printf("M3AP_SETUP_REQ(message_p).assoc_id %d\n",M3AP_SETUP_REQ(message_p).assoc_id);
//
// /* assoc_id */
M3AP_SETUP_REQ(message_p).assoc_id = assoc_id;
//
// /* GlobalMCE_id */
// // this function exits if the ie is mandatory
// M3AP_FIND_PROTOCOLIE_BY_ID(M3AP_M3SetupRequestIEs_t, ie, container,
// M3AP_ProtocolIE_ID_id_Global_MCE_ID, true);
// asn_INTEGER2ulong(&ie->value.choice.GlobalMCE_ID, &M3AP_SETUP_REQ(message_p).GlobalMCE_ID);
// LOG_W(M3AP, "M3AP_SETUP_REQ(message_p).GlobalMCE_ID %lu \n", M3AP_SETUP_REQ(message_p).GlobalMCE_ID);
//
// /* MCE_name */
// M3AP_FIND_PROTOCOLIE_BY_ID(M3AP_M3SetupRequestIEs_t, ie, container,
// M3AP_ProtocolIE_ID_id_MCEname, true);
// M3AP_SETUP_REQ(message_p).MCEname = calloc(ie->value.choice.MCEname.size + 1, sizeof(char));
// memcpy(M3AP_SETUP_REQ(message_p).MCEname, ie->value.choice.MCEname.buf,
// ie->value.choice.MCEname.size);
//
// /* Convert the mme name to a printable string */
// M3AP_SETUP_REQ(message_p).MCEname[ie->value.choice.MCEname.size] = '\0';
// LOG_W(M3AP, "M3AP_SETUP_REQ(message_p).gNB_DU_name %s \n", M3AP_SETUP_REQ(message_p).MCEname);
// /* MCE_MBMS_Configuration_data_List */
// M3AP_FIND_PROTOCOLIE_BY_ID(M3AP_M3SetupRequestIEs_t, ie, container,
// M3AP_ProtocolIE_ID_id_MCE_MBMS_Configuration_data_List, true);
// M3AP_SETUP_REQ(message_p).num_mbms_available = ie->value.choice.MCE_MBMS_Configuration_data_List.list.count;
// LOG_W(M3AP, "M3AP_SETUP_REQ(message_p).num_mbms_available %d \n",
// M3AP_SETUP_REQ(message_p).num_mbms_available);
// int num_mbms_available = M3AP_SETUP_REQ(message_p).num_mbms_available;
// for (i=0; i<num_mbms_available; i++) {
// M3AP_MCE_MBMS_Configuration_data_Item_t *mbms_configuration_item_p;
// mbms_configuration_item_p = &(((M3AP_MCE_MBMS_Configuration_data_ItemIEs_t *)ie->value.choice.MCE_MBMS_Configuration_data_List.list.array[i])->value.choice.MCE_MBMS_Configuration_data_Item);
// /* eCGI */
// //mbms_configuration_item_p->eCGI ... (M3AP_ECGI_t)
//
// OCTET_STRING_TO_INT16(&(mbms_configuration_item_p->eCGI.pLMN_Identity),M3AP_SETUP_REQ(message_p).plmn_identity[i]);
// //OCTET_STRING_TO_INT16(&(mbms_configuration_item_p->eCGI.eUTRANcellIdentifier),M3AP_SETUP_REQ(message_p).eutran_cell_identifier[i]);
// /* mbsfnSynchronisationArea */
// //mbms_configuration_item_p->mbsfnSynchronisationArea ... (M3AP_MBSFN_SynchronisationArea_ID_t)
//
// M3AP_SETUP_REQ(message_p).mbsfn_synchronization_area[i]=mbms_configuration_item_p->mbsfnSynchronisationArea;
// /* mbmsServiceAreaList */
// //mbms_configuration_item_p->mbmsServiceAreaList ... (M3AP_MBMS_Service_Area_ID_List_t)
// for(j=0;j<1;j++){
// //OCTET_STRING_TO_INT16(&(mbms_configuration_item_p->mbmsServiceAreaList.list.array[j]), M3AP_SETUP_REQ(message_p).service_area_id[i][j]);
// }
//
// }
//
//// /* tac */
//// OCTET_STRING_TO_INT16(&(served_celles_item_p->served_Cell_Information.fiveGS_TAC), M3AP_SETUP_REQ(message_p).tac[i]);
//// LOG_D(M3AP, "M3AP_SETUP_REQ(message_p).tac[%d] %d \n",
//// i, M3AP_SETUP_REQ(message_p).tac[i]);
////
//// /* - nRCGI */
//// TBCD_TO_MCC_MNC(&(served_celles_item_p->served_Cell_Information.nRCGI.pLMN_Identity), M3AP_SETUP_REQ(message_p).mcc[i],
//// M3AP_SETUP_REQ(message_p).mnc[i],
//// M3AP_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,
//// M3AP_SETUP_REQ(message_p).nr_cellid[i]);
//// LOG_D(M3AP, "[SCTP %d] Received nRCGI: MCC %d, MNC %d, CELL_ID %llu\n", assoc_id,
//// M3AP_SETUP_REQ(message_p).mcc[i],
//// M3AP_SETUP_REQ(message_p).mnc[i],
//// (long long unsigned int)M3AP_SETUP_REQ(message_p).nr_cellid[i]);
//// LOG_D(M3AP, "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 */
//// M3AP_SETUP_REQ(message_p).nr_pci[i] = served_celles_item_p->served_Cell_Information.nRPCI;
//// LOG_D(M3AP, "M3AP_SETUP_REQ(message_p).nr_pci[%d] %d \n",
//// i, M3AP_SETUP_REQ(message_p).nr_pci[i]);
////
//// // System Information
//// /* mib */
//// M3AP_SETUP_REQ(message_p).mib[i] = calloc(served_celles_item_p->gNB_DU_System_Information->mIB_message.size + 1, sizeof(char));
//// memcpy(M3AP_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 */
//// M3AP_SETUP_REQ(message_p).mib[i][served_celles_item_p->gNB_DU_System_Information->mIB_message.size] = '\0';
//// M3AP_SETUP_REQ(message_p).mib_length[i] = served_celles_item_p->gNB_DU_System_Information->mIB_message.size;
//// LOG_D(M3AP, "M3AP_SETUP_REQ(message_p).mib[%d] %s , len = %d \n",
//// i, M3AP_SETUP_REQ(message_p).mib[i], M3AP_SETUP_REQ(message_p).mib_length[i]);
////
//// /* sib1 */
//// M3AP_SETUP_REQ(message_p).sib1[i] = calloc(served_celles_item_p->gNB_DU_System_Information->sIB1_message.size + 1, sizeof(char));
//// memcpy(M3AP_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 */
//// M3AP_SETUP_REQ(message_p).sib1[i][served_celles_item_p->gNB_DU_System_Information->sIB1_message.size] = '\0';
//// M3AP_SETUP_REQ(message_p).sib1_length[i] = served_celles_item_p->gNB_DU_System_Information->sIB1_message.size;
//// LOG_D(M3AP, "M3AP_SETUP_REQ(message_p).sib1[%d] %s , len = %d \n",
//// i, M3AP_SETUP_REQ(message_p).sib1[i], M3AP_SETUP_REQ(message_p).sib1_length[i]);
//// }
//
//
//printf("m3ap_mme_data_from_mce->assoc_id %d %d\n",m3ap_mme_data_from_mce->assoc_id,assoc_id);
*m3ap_mme_data_from_mce = M3AP_SETUP_REQ(message_p);
//printf("m3ap_mme_data_from_mce->assoc_id %d %d\n",m3ap_mme_data_from_mce->assoc_id,assoc_id);
//
//// MSC_LOG_TX_MESSAGE(
//// MSC_M3AP_MME,
//// MSC_RRC_MCE,
//// 0,
//// 0,
//// MSC_AS_TIME_FMT" MME_handle_M3_SETUP_REQUEST",
//// 0,0//MSC_AS_TIME_ARGS(ctxt_pP),
//// );
////
itti_send_msg_to_task(TASK_MME_APP, ENB_MODULE_ID_TO_INSTANCE(instance), message_p);
// if (num_mbms_available > 0) {
// itti_send_msg_to_task(TASK_MME_APP, MCE_MODULE_ID_TO_INSTANCE(instance), message_p);
// } else {
// //MME_send_M3_SETUP_FAILURE(instance);
// return -1;
// }
//// return 0;
// //TEST POINT MME -> eNB
// if(1){
// printf("instance %d\n",instance);
// //MME_send_M3_SETUP_RESPONSE(instance,assoc_id,m3ap_mce_data_from_enb->assoc_id);
// //MME_send_MBMS_SESSION_START_REQUEST(instance,assoc_id);
// //MME_send_MBMS_SESSION_STOP_REQUEST(instance,assoc_id);
// //MME_send_MBMS_SCHEDULING_INFORMATION(instance,assoc_id,NULL); //TODO
// }
// else
// MME_send_M3_SETUP_FAILURE(instance,assoc_id);
//
return 0;
}
int MME_send_M3_SETUP_RESPONSE(instance_t instance, /*uint32_t assoc_id,*/
m3ap_setup_resp_t *m3ap_setup_resp) {
M3AP_M3AP_PDU_t pdu;
M3AP_M3SetupResponse_t *out;
M3AP_M3SetupResponseIEs_t *ie;
uint8_t *buffer;
uint32_t len;
//int i = 0;
/* Create */
/* 0. Message Type */
memset(&pdu, 0, sizeof(pdu));
pdu.present = M3AP_M3AP_PDU_PR_successfulOutcome;
//pdu.choice.successfulOutcome = (M3AP_SuccessfulOutcome_t *)calloc(1, sizeof(M3AP_SuccessfulOutcome_t));
pdu.choice.successfulOutcome.procedureCode = M3AP_ProcedureCode_id_m3Setup;
pdu.choice.successfulOutcome.criticality = M3AP_Criticality_reject;
pdu.choice.successfulOutcome.value.present = M3AP_SuccessfulOutcome__value_PR_M3SetupResponse;
out = &pdu.choice.successfulOutcome.value.choice.M3SetupResponse;
/* mandatory */
/* c4. CriticalityDiagnostics*/
if (0) {
ie = (M3AP_M3SetupResponseIEs_t *)calloc(1, sizeof(M3AP_M3SetupResponseIEs_t));
ie->id = M3AP_ProtocolIE_ID_id_CriticalityDiagnostics;
ie->criticality = M3AP_Criticality_ignore;
ie->value.present = M3AP_M3SetupFailureIEs__value_PR_CriticalityDiagnostics;
ie->value.choice.CriticalityDiagnostics.procedureCode = (M3AP_ProcedureCode_t *)calloc(1, sizeof(M3AP_ProcedureCode_t));
*ie->value.choice.CriticalityDiagnostics.procedureCode = M3AP_ProcedureCode_id_m3Setup;
ie->value.choice.CriticalityDiagnostics.triggeringMessage = (M3AP_TriggeringMessage_t *)calloc(1, sizeof(M3AP_TriggeringMessage_t));
*ie->value.choice.CriticalityDiagnostics.triggeringMessage = M3AP_TriggeringMessage_initiating_message;
ie->value.choice.CriticalityDiagnostics.procedureCriticality = (M3AP_Criticality_t *)calloc(1, sizeof(M3AP_Criticality_t));
*ie->value.choice.CriticalityDiagnostics.procedureCriticality = M3AP_Criticality_reject;
//ie->value.choice.CriticalityDiagnostics.transactionID = (M2AP_TransactionID_t *)calloc(1, sizeof(M3AP_TransactionID_t));
//*ie->value.choice.CriticalityDiagnostics.transactionID = 0;
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
}
/* encode */
if (m3ap_encode_pdu(&pdu, &buffer, &len) < 0) {
LOG_E(M3AP, "Failed to encode M3 response\n");
return -1;
}
//printf(",m3ap_mme_data_from_mce->assoc_id %d\n",m3ap_mme_data_from_mce->assoc_id);
m3ap_MME_itti_send_sctp_data_req(instance,m3ap_mme_data_from_mce->assoc_id,buffer,len,0);
return 0;
}
int MME_send_M3_SETUP_FAILURE(instance_t instance,m3ap_setup_failure_t* m3ap_setup_failure) {
AssertFatal(1==0,"Not implemented yet\n");
// 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;
//
// M3AP_M3AP_PDU_t pdu;
// M3AP_M3SetupFailure_t *out;
// M3AP_M3SetupFailureIEs_t *ie;
//
// uint8_t *buffer;
// uint32_t len;
//
// /* Create */
// /* 0. Message Type */
// memset(&pdu, 0, sizeof(pdu));
// pdu.present = M3AP_M3AP_PDU_PR_unsuccessfulOutcome;
// //pdu.choice.unsuccessfulOutcome = (M3AP_UnsuccessfulOutcome_t *)calloc(1, sizeof(M3AP_UnsuccessfulOutcome_t));
// pdu.choice.unsuccessfulOutcome.procedureCode = M3AP_ProcedureCode_id_m3Setup;
// pdu.choice.unsuccessfulOutcome.criticality = M3AP_Criticality_reject;
// pdu.choice.unsuccessfulOutcome.value.present = M3AP_UnsuccessfulOutcome__value_PR_M2SetupFailure;
// out = &pdu.choice.unsuccessfulOutcome.value.choice.M2SetupFailure;
//
// /* mandatory */
// /* c1. Transaction ID (integer value)*/
// // ie = (M3AP_M3SetupFailure_Ies_t *)calloc(1, sizeof(M3AP_M3SetupFailure_Ies_t));
// // ie->id = M3AP_ProtocolIE_ID_id_GlobalMCE_ID;
// // ie->criticality = M3AP_Criticality_reject;
// // ie->value.present = M3AP_M3SetupFailure_Ies__value_PR_GlobalMCE_ID;
// // ie->value.choice.GlobalMCE_ID = M3AP_get_next_transaction_identifier(enb_mod_idP, mce_mod_idP);
// // ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
//
// /* mandatory */
// /* c2. Cause */
// ie = (M3AP_M3SetupFailureIEs_t *)calloc(1, sizeof(M3AP_M3SetupFailureIEs_t));
// ie->id = M3AP_ProtocolIE_ID_id_Cause;
// ie->criticality = M3AP_Criticality_ignore;
// ie->value.present = M3AP_M3SetupFailure_Ies__value_PR_Cause;
// ie->value.choice.Cause.present = M3AP_Cause_PR_radioNetwork;
// ie->value.choice.Cause.choice.radioNetwork = M3AP_CauseRadioNetwork_unspecified;
// ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
//
// /* optional */
// /* c3. TimeToWait */
// if (0) {
// ie = (M3AP_M3SetupFailureIEs_t *)calloc(1, sizeof(M3AP_M3SetupFailureIEs_t));
// ie->id = M3AP_ProtocolIE_ID_id_TimeToWait;
// ie->criticality = M3AP_Criticality_ignore;
// ie->value.present = M3AP_M3SetupFailure_Ies__value_PR_TimeToWait;
// ie->value.choice.TimeToWait = M3AP_TimeToWait_v10s;
// ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
// }
//
// /* optional */
// /* c4. CriticalityDiagnostics*/
// if (0) {
// ie = (M3AP_M3SetupFailureIEs_t *)calloc(1, sizeof(M3AP_M3SetupFailureIEs_t));
// ie->id = M3AP_ProtocolIE_ID_id_CriticalityDiagnostics;
// ie->criticality = M3AP_Criticality_ignore;
// ie->value.present = M3AP_M3SetupFailure_Ies__value_PR_CriticalityDiagnostics;
// ie->value.choice.CriticalityDiagnostics.procedureCode = (M3AP_ProcedureCode_t *)calloc(1, sizeof(M3AP_ProcedureCode_t));
// *ie->value.choice.CriticalityDiagnostics.procedureCode = M3AP_ProcedureCode_id_m3Setup;
// ie->value.choice.CriticalityDiagnostics.triggeringMessage = (M3AP_TriggeringMessage_t *)calloc(1, sizeof(M3AP_TriggeringMessage_t));
// *ie->value.choice.CriticalityDiagnostics.triggeringMessage = M3AP_TriggeringMessage_initiating_message;
// ie->value.choice.CriticalityDiagnostics.procedureCriticality = (M3AP_Criticality_t *)calloc(1, sizeof(M3AP_Criticality_t));
// *ie->value.choice.CriticalityDiagnostics.procedureCriticality = M3AP_Criticality_reject;
// //ie->value.choice.CriticalityDiagnostics.transactionID = (M3AP_TransactionID_t *)calloc(1, sizeof(M3AP_TransactionID_t));
// //*ie->value.choice.CriticalityDiagnostics.transactionID = 0;
// ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
// }
//
// /* encode */
// if (m3ap_encode_pdu(&pdu, &buffer, &len) < 0) {
// LOG_E(M3AP, "Failed to encode M2 setup request\n");
// return -1;
// }
//
// //mce_m3ap_itti_send_sctp_data_req(instance, m3ap_mce_data_from_enb->assoc_id, buffer, len, 0);
// m3ap_MME_itti_send_sctp_data_req(instance,m3ap_mme_data_from_mce->assoc_id,buffer,len,0);
return 0;
}
/*
* MME Configuration Update
*/
int MME_handle_MME_CONFIGURATION_UPDATE_FAILURE(instance_t instance,
uint32_t assoc_id,
uint32_t stream,
M3AP_M3AP_PDU_t *pdu){
AssertFatal(1==0,"Not implemented yet\n");
}
int MME_handle_MME_CONFIGURATION_UPDATE_ACKNOWLEDGE(instance_t instance,
uint32_t assoc_id,
uint32_t stream,
M3AP_M3AP_PDU_t *pdu){
AssertFatal(1==0,"Not implemented yet\n");
}
/*
* MCE Configuration Update
*/
int MME_handle_MCE_CONFIGURATION_UPDATE(instance_t instance,
uint32_t assoc_id,
uint32_t stream,
M3AP_M3AP_PDU_t *pdu){
AssertFatal(1==0,"Not implemented yet\n");
}
/*
* Error Indication
*/
int MME_handle_ERROR_INDICATION(instance_t instance,
uint32_t assoc_id,
uint32_t stream,
M3AP_M3AP_PDU_t *pdu) {
AssertFatal(1==0,"Not implemented yet\n");
}
int MME_send_ERROR_INDICATION(instance_t instance, M3AP_ErrorIndication_t *ErrorIndication) {
AssertFatal(1==0,"Not implemented yet\n");
}
/*
* Session Update Request
*/
int MME_send_MBMS_SESSION_UPDATE_REQUEST(instance_t instance, m3ap_mbms_session_update_req_t * m3ap_mbms_session_update_req){
M3AP_M3AP_PDU_t pdu;
M3AP_MBMSSessionUpdateRequest_t *out;
M3AP_MBMSSessionUpdateRequest_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 = M3AP_M3AP_PDU_PR_initiatingMessage;
//pdu.choice.initiatingMessage = (M3AP_InitiatingMessage_t *)calloc(1, sizeof(M3AP_InitiatingMessage_t));
pdu.choice.initiatingMessage.procedureCode = M3AP_ProcedureCode_id_mBMSsessionUpdate;
pdu.choice.initiatingMessage.criticality = M3AP_Criticality_reject;
pdu.choice.initiatingMessage.value.present = M3AP_InitiatingMessage__value_PR_MBMSSessionUpdateRequest;
out = &pdu.choice.initiatingMessage.value.choice.MBMSSessionUpdateRequest;
/* mandatory */
/* c1. MME_MBMS_M3AP_ID (integer value) */ //long
ie = (M3AP_MBMSSessionUpdateRequest_IEs_t *)calloc(1, sizeof(M3AP_MBMSSessionUpdateRequest_IEs_t));
ie->id = M3AP_ProtocolIE_ID_id_MME_MBMS_M3AP_ID;
ie->criticality = M3AP_Criticality_reject;
ie->value.present = M3AP_MBMSSessionUpdateRequest_IEs__value_PR_MME_MBMS_M3AP_ID;
//ie->value.choice.MME_MBMS_M3AP_ID = /*F1AP_get_next_transaction_identifier(enb_mod_idP, du_mod_idP);*/ //?
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
/* mandatory */
/* c2. MCE_MBMS_M3AP_ID (integer value) */ //long
ie = (M3AP_MBMSSessionUpdateRequest_IEs_t *)calloc(1, sizeof(M3AP_MBMSSessionUpdateRequest_IEs_t));
ie->id = M3AP_ProtocolIE_ID_id_MCE_MBMS_M3AP_ID;
ie->criticality = M3AP_Criticality_reject;
ie->value.present = M3AP_MBMSSessionUpdateRequest_IEs__value_PR_MCE_MBMS_M3AP_ID;
//ie->value.choice.MCE_MBMS_M3AP_ID = /*F1AP_get_next_transaction_identifier(enb_mod_idP, du_mod_idP);*/ //?
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
/* mandatory */
/* c2. TMGI */
ie = (M3AP_MBMSSessionUpdateRequest_IEs_t *)calloc(1, sizeof(M3AP_MBMSSessionUpdateRequest_IEs_t));
ie->id = M3AP_ProtocolIE_ID_id_TMGI;
ie->criticality = M3AP_Criticality_reject;
ie->value.present = M3AP_MBMSSessionUpdateRequest_IEs__value_PR_TMGI;
M3AP_TMGI_t *tmgi = &ie->value.choice.TMGI;
{
MCC_MNC_TO_PLMNID(0,0,3,&tmgi->pLMNidentity);
uint8_t TMGI[5] = {4,3,2,1,0};
OCTET_STRING_fromBuf(&tmgi->serviceID,(const char*)&TMGI[2],3);
}
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
/* optional */
/* c2. MBMS_Session_ID */
if(0){
ie = (M3AP_MBMSSessionUpdateRequest_IEs_t *)calloc(1, sizeof(M3AP_MBMSSessionUpdateRequest_IEs_t));
ie->id = M3AP_ProtocolIE_ID_id_MBMS_Session_ID;
ie->criticality = M3AP_Criticality_ignore;
ie->value.present = M3AP_MBMSSessionUpdateRequest_IEs__value_PR_MBMS_Session_ID;
//M3AP_MBMS_Session_ID_t * mbms_session_id = &ie->value.choice.MBMS_Session_ID;
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
}
/* mandatory */
/* c2. MBMS_E_RAB_QoS_Parameters */
ie = (M3AP_MBMSSessionUpdateRequest_IEs_t *)calloc(1, sizeof(M3AP_MBMSSessionUpdateRequest_IEs_t));
ie->id = M3AP_ProtocolIE_ID_id_MBMS_E_RAB_QoS_Parameters;
ie->criticality = M3AP_Criticality_reject;
ie->value.present = M3AP_MBMSSessionUpdateRequest_IEs__value_PR_MBMS_E_RAB_QoS_Parameters;
M3AP_MBMS_E_RAB_QoS_Parameters_t * mbms_e_rab_qos_parameters = &ie->value.choice.MBMS_E_RAB_QoS_Parameters;
{
//M3AP_QCI_t * qci = &mbms_e_rab_qos_parameters->qCI; //long
mbms_e_rab_qos_parameters->qCI=1;
//struct M3AP_GBR_QosInformation *gbrQosInformation; /* OPTIONAL */
}
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
/* mandatory */
/* c2. MBMS_Session_Duration */
ie = (M3AP_MBMSSessionUpdateRequest_IEs_t *)calloc(1, sizeof(M3AP_MBMSSessionUpdateRequest_IEs_t));
ie->id = M3AP_ProtocolIE_ID_id_MBMS_Session_Duration;
ie->criticality = M3AP_Criticality_reject;
ie->value.present = M3AP_MBMSSessionUpdateRequest_IEs__value_PR_MBMS_Session_Duration;
M3AP_MBMS_Session_Duration_t * mbms_session_duration = &ie->value.choice.MBMS_Session_Duration;
{
uint8_t duration[5] = {4,3,2,1,0};
OCTET_STRING_fromBuf(mbms_session_duration,(const char*)&duration[2],3);
}
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
/* optional */
/* c2 MBMS_Service_Area */
if(0){
ie = (M3AP_MBMSSessionUpdateRequest_IEs_t *)calloc(1, sizeof(M3AP_MBMSSessionUpdateRequest_IEs_t));
ie->id = M3AP_ProtocolIE_ID_id_MBMS_Service_Area;
ie->criticality = M3AP_Criticality_ignore;
ie->value.present = M3AP_MBMSSessionUpdateRequest_IEs__value_PR_MBMS_Service_Area;
//M3AP_MBMS_Service_Area_t * mbms_service_area = &ie->value.choice.MBMS_Service_Area;
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
}
/* mandatory */
/* c2 MinimumTimeToMBMSDataTransfer */
ie = (M3AP_MBMSSessionUpdateRequest_IEs_t *)calloc(1, sizeof(M3AP_MBMSSessionUpdateRequest_IEs_t));
ie->id = M3AP_ProtocolIE_ID_id_MinimumTimeToMBMSDataTransfer;
ie->criticality = M3AP_Criticality_reject;
ie->value.present = M3AP_MBMSSessionUpdateRequest_IEs__value_PR_MinimumTimeToMBMSDataTransfer;
M3AP_MinimumTimeToMBMSDataTransfer_t * minimumtimetombmsdatatransfer = &ie->value.choice.MinimumTimeToMBMSDataTransfer;
{
uint8_t duration[5] = {4,3,2,1,0};
OCTET_STRING_fromBuf(minimumtimetombmsdatatransfer,(const char*)&duration[2],1);
}
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
/* optional */
/* c2 TNL_Information */
if(0){
ie = (M3AP_MBMSSessionUpdateRequest_IEs_t *)calloc(1, sizeof(M3AP_MBMSSessionUpdateRequest_IEs_t));
ie->id = M3AP_ProtocolIE_ID_id_TNL_Information;
ie->criticality = M3AP_Criticality_ignore;
ie->value.present = M3AP_MBMSSessionUpdateRequest_IEs__value_PR_TNL_Information;
M3AP_TNL_Information_t * tnl_information = &ie->value.choice.TNL_Information;
{
OCTET_STRING_fromBuf(&tnl_information->iPMCAddress,"1204",strlen("1234"));
OCTET_STRING_fromBuf(&tnl_information->iPSourceAddress,"1204",strlen("1234"));
OCTET_STRING_fromBuf(&tnl_information->gTP_DLTEID,"1204",strlen("1234"));
}
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
}
/* optional */
/* c2 Time_ofMBMS_DataTransfer */
if(0){
ie = (M3AP_MBMSSessionUpdateRequest_IEs_t *)calloc(1, sizeof(M3AP_MBMSSessionUpdateRequest_IEs_t));
ie->id = M3AP_ProtocolIE_ID_id_Time_ofMBMS_DataTransfer;
ie->criticality = M3AP_Criticality_ignore;
ie->value.present = M3AP_MBMSSessionUpdateRequest_IEs__value_PR_Absolute_Time_ofMBMS_Data;
//M3AP_Absolute_Time_ofMBMS_Data_t * absolute_time_ofmbms_data = &ie->value.choice.Absolute_Time_ofMBMS_Data;
//{
//char duration[5] = {4,3,2,1,0};
//OCTET_STRING_fromBuf(absolute_time_ofmbms_data,(const char*)&duration[2],3);
//}
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
}
/* optional */
/* c2 MBMS_Cell_List */
if(0){
ie = (M3AP_MBMSSessionUpdateRequest_IEs_t *)calloc(1, sizeof(M3AP_MBMSSessionUpdateRequest_IEs_t));
ie->id = M3AP_ProtocolIE_ID_id_MBMS_Cell_List;
ie->criticality = M3AP_Criticality_ignore;
ie->value.present = M3AP_MBMSSessionUpdateRequest_IEs__value_PR_MBMS_Cell_List;
M3AP_MBMS_Cell_List_t * mbms_cell_list = &ie->value.choice.MBMS_Cell_List;
M3AP_ECGI_t * ecgi = (M3AP_ECGI_t*)calloc(1,sizeof(M3AP_ECGI_t));
{
//MCC_MNC_TO_PLMNID(0,0,3,ecgi->pLMN_Identity);
//MACRO_ENB_ID_TO_CELL_IDENTITY(1,0,ecgi->eUTRANcellIdentifier);
ASN_SEQUENCE_ADD(&mbms_cell_list->list,ecgi);
}
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
}
/* encode */
if (m3ap_encode_pdu(&pdu,&buffer,&len) < 0){
return -1;
}
//MME_m3ap_itti_send_sctp_data_req(instance, m3ap_mce_data_from_mce->assoid,buffer,len,0);
m3ap_MME_itti_send_sctp_data_req(instance, m3ap_mme_data_from_mce->assoc_id,buffer,len,0);
return 0;
}
int MME_handle_MBMS_SESSION_UPDATE_RESPONSE(instance_t instance,
uint32_t assoc_id,
uint32_t stream,
M3AP_M3AP_PDU_t *pdu){
//AssertFatal(1==0,"Not implemented yet\n");
LOG_D(M3AP, "MME_handle_MBMS_SESSION_UPDATE_RESPONSE\n");
AssertFatal(pdu->present == M3AP_M3AP_PDU_PR_successfulOutcome,
"pdu->present != M3AP_M3AP_PDU_PR_successfulOutcome\n");
AssertFatal(pdu->choice.successfulOutcome.procedureCode == M3AP_ProcedureCode_id_mBMSsessionUpdate,
"pdu->choice.successfulOutcome->procedureCode != M3AP_ProcedureCode_id_sessionUpdate\n");
AssertFatal(pdu->choice.successfulOutcome.criticality == M3AP_Criticality_reject,
"pdu->choice.successfulOutcome->criticality != M3AP_Criticality_reject\n");
AssertFatal(pdu->choice.successfulOutcome.value.present == M3AP_SuccessfulOutcome__value_PR_MBMSSessionUpdateResponse,
"pdu->choice.successfulOutcome.value.present != M3AP_SuccessfulOutcome__value_PR_MBMSSessionUpdateResponse\n");
M3AP_MBMSSessionUpdateResponse_t *in = &pdu->choice.successfulOutcome.value.choice.MBMSSessionUpdateResponse;
M3AP_MBMSSessionUpdateResponse_IEs_t *ie;
int MME_MBMS_M3AP_ID=-1;
int MCE_MBMS_M3AP_ID=-1;
MessageDef *msg_g = itti_alloc_new_message(TASK_M3AP_MME,M3AP_MBMS_SESSION_UPDATE_RESP); //TODO
LOG_D(M3AP, "M3AP: SessionUpdate-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 M3AP_ProtocolIE_ID_id_MME_MBMS_M3AP_ID:
AssertFatal(ie->criticality == M3AP_Criticality_reject,
"ie->criticality != M3AP_Criticality_reject\n");
AssertFatal(ie->value.present == M3AP_MBMSSessionUpdateResponse_IEs__value_PR_MME_MBMS_M3AP_ID,
"ie->value.present != M3AP_sessionUpdateResponse_IEs__value_PR_MME_MBMS_M3AP_ID\n");
MME_MBMS_M3AP_ID=ie->value.choice.MME_MBMS_M3AP_ID;
LOG_D(M3AP, "M3AP: SessionUpdate-Resp: MME_MBMS_M3AP_ID %d\n",
MME_MBMS_M3AP_ID);
break;
case M3AP_ProtocolIE_ID_id_MCE_MBMS_M3AP_ID:
AssertFatal(ie->criticality == M3AP_Criticality_reject,
"ie->criticality != M3AP_Criticality_reject\n");
AssertFatal(ie->value.present == M3AP_MBMSSessionUpdateResponse_IEs__value_PR_MCE_MBMS_M3AP_ID,
"ie->value.present != M3AP_sessionUpdateResponse_IEs__value_PR_MCE_MBMS_M3AP_ID\n");
MCE_MBMS_M3AP_ID=ie->value.choice.MCE_MBMS_M3AP_ID;
LOG_D(M3AP, "M3AP: SessionUpdate-Resp: MCE_MBMS_M3AP_ID %d\n",
MCE_MBMS_M3AP_ID);
break;
}
}
//AssertFatal(MME_MBMS_M3AP_ID!=-1,"MME_MBMS_M3AP_ID was not sent\n");
//AssertFatal(MCE_MBMS_M3AP_ID!=-1,"MCE_MBMS_M3AP_ID was not sent\n");
////M3AP_SESSION_START_RESP(msg_p).
//// MSC_LOG_RX_MESSAGE(
//// MSC_M3AP_MME,
//// MSC_M3AP_MCE,
// //return 0;
//// 0,
//// 0,
//// MSC_AS_TIME_FMT" MME_handle_M2_SESSION_START_RESPONSE successfulOutcome assoc_id %d",
//// 0,0,//MSC_AS_TIME_ARGS(ctxt_pP),
//// assoc_id);
////
// LOG_W(M3AP, "Sending M3AP_SESSION_START_RESP ITTI message to MCE_APP with assoc_id (%d->%d)\n",
// assoc_id,ENB_MODULE_ID_TO_INSTANCE(assoc_id));
itti_send_msg_to_task(TASK_MME_APP, ENB_MODULE_ID_TO_INSTANCE(assoc_id), msg_g);
return 0;
}
int MME_handle_MBMS_SESSION_UPDATE_FAILURE(instance_t instance,
uint32_t assoc_id,
uint32_t stream,
M3AP_M3AP_PDU_t *pdu){
AssertFatal(1==0,"Not implemented yet\n");
}
int MME_handle_MBMS_SERVICE_COUNTING_RESPONSE(instance_t instance,
uint32_t assoc_id,
uint32_t stream,
M3AP_M3AP_PDU_t *pdu){
AssertFatal(1==0,"Not implemented yet\n");
}
int MME_handle_MBMS_SESSION_COUNTING_FAILURE(instance_t instance,
uint32_t assoc_id,
uint32_t stream,
M3AP_M3AP_PDU_t *pdu){
AssertFatal(1==0,"Not implemented yet\n");
}
/*
* Service Counting Results Report
*/
int MME_handle_MBMS_SESSION_COUNTING_RESULTS_REPORT(instance_t instance,
uint32_t assoc_id,
uint32_t stream,
M3AP_M3AP_PDU_t *pdu){
AssertFatal(1==0,"Not implemented yet\n");
}
/*
* Overload Notification
*/
int MME_handle_MBMS_OVERLOAD_NOTIFICATION(instance_t instance,
uint32_t assoc_id,
uint32_t stream,
M3AP_M3AP_PDU_t *pdu){
AssertFatal(1==0,"Not implemented yet\n");
}