Commit c943c756 authored by Lionel Gauthier's avatar Lionel Gauthier

UE context release, not finished.

It will seg fault the mme, but that was also the case before when UE retry connecting

git-svn-id: http://svn.eurecom.fr/openair4G/trunk@7300 818b1a75-f10b-46b9-bf7c-635c3b92a50f
parent c8d660ee
......@@ -43,3 +43,4 @@ MESSAGE_DEF(S1AP_UE_CONTEXT_RELEASE_LOG , MESSAGE_PRIORITY_MED, IttiMsgText
MESSAGE_DEF(S1AP_UE_CAPABILITIES_IND , MESSAGE_PRIORITY_MED, s1ap_ue_cap_ind_t , s1ap_ue_cap_ind)
MESSAGE_DEF(S1AP_ENB_DEREGISTERED_IND , MESSAGE_PRIORITY_MED, s1ap_eNB_deregistered_ind_t , s1ap_eNB_deregistered_ind)
MESSAGE_DEF(S1AP_DEREGISTER_UE_REQ , MESSAGE_PRIORITY_MED, s1ap_deregister_ue_req_t , s1ap_deregister_ue_req)
MESSAGE_DEF(S1AP_UE_CONTEXT_RELEASE_REQ , MESSAGE_PRIORITY_MED, s1ap_ue_context_release_req_t , s1ap_ue_context_release_req)
......@@ -31,6 +31,7 @@
#define S1AP_ENB_DEREGISTERED_IND(mSGpTR) (mSGpTR)->ittiMsg.s1ap_eNB_deregistered_ind
#define S1AP_DEREGISTER_UE_REQ(mSGpTR) (mSGpTR)->ittiMsg.s1ap_deregister_ue_req
#define S1AP_UE_CONTEXT_RELEASE_REQ(mSGpTR) (mSGpTR)->ittiMsg.s1ap_ue_context_release_req
typedef struct s1ap_initial_ue_message_s {
unsigned eNB_ue_s1ap_id:24;
......@@ -80,4 +81,8 @@ typedef struct s1ap_deregister_ue_req_s {
uint32_t mme_ue_s1ap_id;
} s1ap_deregister_ue_req_t;
typedef struct s1ap_ue_context_release_req_s {
uint32_t mme_ue_s1ap_id;
} s1ap_ue_context_release_req_t;
#endif /* S1AP_MESSAGES_TYPES_H_ */
......@@ -32,3 +32,5 @@ MESSAGE_DEF(SGW_MODIFY_BEARER_REQUEST, MESSAGE_PRIORITY_MED, SgwModifyBearerRe
MESSAGE_DEF(SGW_MODIFY_BEARER_RESPONSE, MESSAGE_PRIORITY_MED, SgwModifyBearerResponse, sgwModifyBearerResponse)
MESSAGE_DEF(SGW_DELETE_SESSION_REQUEST, MESSAGE_PRIORITY_MED, SgwDeleteSessionRequest, sgwDeleteSessionRequest)
MESSAGE_DEF(SGW_DELETE_SESSION_RESPONSE, MESSAGE_PRIORITY_MED, SgwDeleteSessionResponse, sgwDeleteSessionResponse)
MESSAGE_DEF(SGW_RELEASE_ACCESS_BEARERS_REQUEST, MESSAGE_PRIORITY_MED, SgwReleaseAccessBearersRequest, sgwReleaseAccessBearersRequest)
MESSAGE_DEF(SGW_RELEASE_ACCESS_BEARERS_RESPONSE, MESSAGE_PRIORITY_MED, SgwReleaseAccessBearersResponse, sgwReleaseAccessBearersResponse)
......@@ -48,6 +48,8 @@
#define SGW_MODIFY_BEARER_RESPONSE(mSGpTR) (mSGpTR)->ittiMsg.sgwModifyBearerResponse
#define SGW_DELETE_SESSION_REQUEST(mSGpTR) (mSGpTR)->ittiMsg.sgwDeleteSessionRequest
#define SGW_DELETE_SESSION_RESPONSE(mSGpTR) (mSGpTR)->ittiMsg.sgwDeleteSessionResponse
#define SGW_RELEASE_ACCESS_BEARERS_REQUEST(mSGpTR) (mSGpTR)->ittiMsg.sgwReleaseAccessBearersRequest
#define SGW_RELEASE_ACCESS_BEARERS_RESPONSE(mSGpTR) (mSGpTR)->ittiMsg.sgwReleaseAccessBearersResponse
/** @struct SgwCreateSessionRequest
......@@ -867,4 +869,53 @@ typedef struct SgwDeleteSessionResponse_s {
uint32_t peer_ip;
} SgwDeleteSessionResponse;
/** @struct SgwReleaseAccessBearersRequest
* @brief Release AccessBearers Request
*
* The Release Access Bearers Request message shall sent on the S11 interface by
* the MME to the SGW as part of the S1 release procedure.
* The message shall also be sent on the S4 interface by the SGSN to the SGW as
* part of the procedures:
* - RAB release using S4
* - Iu Release using S4
* - READY to STANDBY transition within the network
*/
typedef struct SgwReleaseAccessBearersRequest_s {
Teid_t teid; ///< Tunnel Endpoint Identifier
uint32_t num_rabs;
EBI_t list_of_rabs[8] ; ///< Shall be present on S4 interface when this message is
///< used to release a subset of all active RABs according to
///< the RAB release procedure.
///< Several IEs with this type and instance values shall be
///< included as necessary to represent a list of RABs to be
///< released.
node_type_t originating_node; ///< This IE shall be sent on S11 interface, if ISR is active in the MME.
///< This IE shall be sent on S4 interface, if ISR is active in the SGSN
// Private Extension Private Extension ///< optional
} SgwReleaseAccessBearersRequest;
/** @struct SgwReleaseAccessBearersResponse
* @brief Release AccessBearers Response
*
* The Release Access Bearers Response message is sent on the S11 interface by the SGW to the MME as part of the S1
* release procedure.
* The message shall also be sent on the S4 interface by the SGW to the SGSN as part of the procedures:
* - RAB release using S4
* - Iu Release using S4
* - READY to STANDBY transition within the network
* Possible Cause values are specified in Table 8.4-1. Message specific cause values are:
* - "Request accepted".
* - "Request accepted partially".
* - "Context not found
*/
typedef struct SgwReleaseAccessBearersResponse_s {
Teid_t teid; ///< Tunnel Endpoint Identifier
SGWCause_t cause;
// Recovery ///< optional This IE shall be included if contacting the peer for the first time
// Private Extension ///< optional
} SgwReleaseAccessBearersResponse;
#endif
......@@ -51,6 +51,46 @@
#include "msc.h"
int
mme_app_send_s11_release_access_bearers_req(
struct ue_context_s * const ue_context_pP)
{
uint8_t i = 0;
task_id_t to_task = TASK_UNKNOWN;
/* Keep the identifier to the default APN */
context_identifier_t context_identifier;
MessageDef *message_p = NULL;
SgwReleaseAccessBearersRequest *release_access_bearers_request_p = NULL;
DevAssert(ue_context_pP != NULL);
#if !defined(ENABLE_STANDALONE_EPC)
to_task = TASK_S11;
#else
to_task = TASK_SPGW_APP;
#endif
message_p = itti_alloc_new_message(TASK_MME_APP, SGW_RELEASE_ACCESS_BEARERS_REQUEST);
release_access_bearers_request_p = &message_p->ittiMsg.sgwReleaseAccessBearersRequest;
memset(release_access_bearers_request_p, 0, sizeof(SgwReleaseAccessBearersRequest));
release_access_bearers_request_p->teid = ue_context_pP->sgw_s11_teid;
release_access_bearers_request_p->num_rabs = 1;
release_access_bearers_request_p->list_of_rabs[0] = ue_context_pP->default_bearer_id;
release_access_bearers_request_p->originating_node = NODE_TYPE_MME;
MSC_LOG_TX_MESSAGE(
MSC_MMEAPP_MME,
(to_task == TASK_S11) ? MSC_S11_MME:MSC_SP_GWAPP_MME,
NULL,0,
"0 SGW_RELEASE_ACCESS_BEARERS_REQUEST teid %u ebi %u",
SGW_RELEASE_ACCESS_BEARERS_REQUEST(message_p).teid,
release_access_bearers_request_p->list_of_rabs[0]);
itti_send_msg_to_task(to_task, INSTANCE_DEFAULT, message_p);
}
int
mme_app_send_s11_create_session_req(
......
......@@ -49,6 +49,7 @@
#include "mme_app_extern.h"
#include "mme_app_ue_context.h"
#include "mme_app_defs.h"
#include "msc.h"
int ue_context_compare_identifiers(struct ue_context_s *p1,
struct ue_context_s *p2);
......@@ -59,8 +60,10 @@ RB_PROTOTYPE(ue_context_map, ue_context_s, rb_entry,
RB_GENERATE(ue_context_map, ue_context_s, rb_entry,
ue_context_compare_identifiers);
//------------------------------------------------------------------------------
extern inline int ue_context_compare_identifiers(
struct ue_context_s *p1, struct ue_context_s *p2)
//------------------------------------------------------------------------------
{
MME_APP_DEBUG(" ue_context_compare_identifiers IMSI %"SCNu64"\n", p1->imsi);
MME_APP_DEBUG(" ue_context_compare_identifiers mme_s11_teid %08x\n" , p1->mme_s11_teid);
......@@ -144,7 +147,9 @@ extern inline int ue_context_compare_identifiers(
return 0;
}
//------------------------------------------------------------------------------
ue_context_t *mme_create_new_ue_context(void)
//------------------------------------------------------------------------------
{
ue_context_t *new_p;
......@@ -159,8 +164,10 @@ ue_context_t *mme_create_new_ue_context(void)
}
//------------------------------------------------------------------------------
struct ue_context_s *mme_ue_context_exists_imsi(mme_ue_context_t *mme_ue_context,
mme_app_imsi_t imsi)
//------------------------------------------------------------------------------
{
struct ue_context_s reference;
......@@ -173,8 +180,10 @@ struct ue_context_s *mme_ue_context_exists_imsi(mme_ue_context_t *mme_ue_context
}
//------------------------------------------------------------------------------
struct ue_context_s *mme_ue_context_exists_s11_teid(mme_ue_context_t *mme_ue_context,
uint32_t teid)
//------------------------------------------------------------------------------
{
struct ue_context_s reference;
......@@ -188,9 +197,11 @@ struct ue_context_s *mme_ue_context_exists_s11_teid(mme_ue_context_t *mme_ue_con
//------------------------------------------------------------------------------
ue_context_t *mme_ue_context_exists_mme_ue_s1ap_id(
mme_ue_context_t *mme_ue_context,
uint32_t mme_ue_s1ap_id)
//------------------------------------------------------------------------------
{
struct ue_context_s reference;
......@@ -204,9 +215,11 @@ ue_context_t *mme_ue_context_exists_mme_ue_s1ap_id(
//------------------------------------------------------------------------------
ue_context_t *mme_ue_context_exists_nas_ue_id(
mme_ue_context_t *mme_ue_context,
uint32_t nas_ue_id)
//------------------------------------------------------------------------------
{
struct ue_context_s reference;
......@@ -221,8 +234,10 @@ ue_context_t *mme_ue_context_exists_nas_ue_id(
//------------------------------------------------------------------------------
ue_context_t *mme_ue_context_exists_guti(mme_ue_context_t *mme_ue_context,
GUTI_t guti)
//------------------------------------------------------------------------------
{
struct ue_context_s reference;
......@@ -236,7 +251,9 @@ ue_context_t *mme_ue_context_exists_guti(mme_ue_context_t *mme_ue_context,
&reference);
}
//------------------------------------------------------------------------------
int mme_insert_ue_context(mme_ue_context_t *mme_ue_context, struct ue_context_s *ue_context_p)
//------------------------------------------------------------------------------
{
struct ue_context_s *collision_p = NULL;
......@@ -258,7 +275,9 @@ int mme_insert_ue_context(mme_ue_context_t *mme_ue_context, struct ue_context_s
return 0;
}
//------------------------------------------------------------------------------
void mme_app_dump_ue_contexts(mme_ue_context_t *mme_ue_context)
//------------------------------------------------------------------------------
{
struct ue_context_s *context_p;
......@@ -426,3 +445,27 @@ void mme_app_dump_ue_contexts(mme_ue_context_t *mme_ue_context)
}
MME_APP_DEBUG("---------------------------------------------------------\n");
}
//------------------------------------------------------------------------------
void mme_app_handle_s1ap_ue_context_release_req(const s1ap_ue_context_release_req_t const *s1ap_ue_context_release_req)
//------------------------------------------------------------------------------
{
struct ue_context_s *ue_context_p = NULL;
MME_APP_DEBUG("Received S1AP_UE_CONTEXT_RELEASE_REQ from S1AP\n");
ue_context_p = mme_ue_context_exists_nas_ue_id(&mme_app_desc.mme_ue_contexts, s1ap_ue_context_release_req->mme_ue_s1ap_id);
if (ue_context_p == NULL) {
MSC_LOG_EVENT(
MSC_MMEAPP_MME,
"S1AP_UE_CONTEXT_RELEASE_REQ Unknown ue %u",s1ap_ue_context_release_req->mme_ue_s1ap_id);
MME_APP_ERROR("UE context doesn't exist for UE 0x%08X/dec%u\n",
s1ap_ue_context_release_req->mme_ue_s1ap_id,
s1ap_ue_context_release_req->mme_ue_s1ap_id);
return;
}
mme_app_send_s11_release_access_bearers_req(ue_context_p);
}
......@@ -147,6 +147,11 @@ void *mme_app_thread(void *args)
}
break;
case S1AP_UE_CONTEXT_RELEASE_REQ: {
mme_app_handle_s1ap_ue_context_release_req(&received_message_p->ittiMsg.s1ap_ue_context_release_req);
}
break;
default: {
MME_APP_DEBUG("Unkwnon message ID %d:%s\n",
ITTI_MSG_ID(received_message_p), ITTI_MSG_NAME(received_message_p));
......
......@@ -42,6 +42,7 @@
#include <inttypes.h> /* For sscanf formats */
#include <time.h> /* to provide time_t */
#include "s1ap_messages_types.h"
#include "nas_messages_types.h"
#include "s6a_messages_types.h"
#include "security_types.h"
......@@ -248,6 +249,9 @@ ue_context_t *mme_create_new_ue_context(void);
**/
void mme_app_dump_ue_contexts(mme_ue_context_t *mme_ue_context);
void mme_app_handle_s1ap_ue_context_release_req(const s1ap_ue_context_release_req_t const *s1ap_ue_context_release_req);
#endif /* MME_APP_UE_CONTEXT_H_ */
/* @} */
......@@ -315,12 +315,11 @@ int nas_message_decrypt(
/* Check NAS message integrity */
if (mac != header->message_authentication_code) {
LOG_TRACE(DEBUG,
"MAC Failure MSG:%08X(%u) <> INT ALGO:%08X(%u)",
header->message_authentication_code,
header->message_authentication_code,
mac,
mac);
"MAC Failure MSG:%08X(%u) <> INT ALGO:%08X(%u) Type of security context %u",
header->message_authentication_code,header->message_authentication_code,
mac,mac, (emm_security_context!=NULL)?emm_security_context->type:88);
#if defined(NAS_MME)
LOG_FUNC_RETURN (TLV_DECODE_MAC_MISMATCH);
#else
......
......@@ -125,18 +125,18 @@ do {
# define LOG_FUNC_IN \
do { \
LOG_D(NAS, " %s:%d %*sEntering %s()\n", __FILE__, __LINE__, nas_log_func_indent, "", __FUNCTION__); \
nas_log_func_indent += 4; \
nas_log_func_indent += 2; \
} while (0)
# define LOG_FUNC_OUT \
do { \
nas_log_func_indent -= 4; \
nas_log_func_indent -= 2; \
LOG_D(NAS, " %s:%d %*sLeaving %s()\n", __FILE__, __LINE__, nas_log_func_indent, "", __FUNCTION__); \
} while (0)
# define LOG_FUNC_RETURN(rETURNcODE) \
do { \
nas_log_func_indent -= 4; \
nas_log_func_indent -= 2; \
LOG_D(NAS, " %s:%d %*sLeaving %s(rc = %ld)\n", __FILE__, __LINE__, nas_log_func_indent, "", \
__FUNCTION__, (long) rETURNcODE); \
return (rETURNcODE); \
......
......@@ -204,3 +204,20 @@ int s11_mme_handle_create_session_response(NwGtpv2cStackHandleT *stack_p,
return itti_send_msg_to_task(TASK_MME_APP, INSTANCE_DEFAULT, message_p);
}
int s11_mme_release_access_bearers_request(NwGtpv2cStackHandleT *stack_p,
SgwReleaseAccessBearersRequest *release_access_bearers_p)
{
NwGtpv2cUlpApiT ulp_req;
NwRcT rc;
uint8_t restart_counter = 0;
DevAssert(stack_p != NULL);
DevAssert(release_access_bearers_p != NULL);
memset(&ulp_req, 0, sizeof(NwGtpv2cUlpApiT));
AssertFatal(0 == 1, "TODO s11_mme_release_access_bearers_request()");
}
......@@ -35,6 +35,12 @@
int s11_mme_create_session_request(NwGtpv2cStackHandleT *stack_p,
SgwCreateSessionRequest *create_session_p);
/* @brief Create a new Release Access Bearers Request and send it to provided S-GW.
*/
int s11_mme_release_access_bearers_request(NwGtpv2cStackHandleT *stack_p,
SgwReleaseAccessBearersRequest *release_access_bearers_p);
/* @brief Handle a Create Session Response received from S-GW.
*/
int s11_mme_handle_create_session_response(NwGtpv2cStackHandleT *stack_p,
......
......@@ -189,6 +189,13 @@ static void *s11_mme_thread(void *args)
}
break;
case SGW_RELEASE_ACCESS_BEARERS_REQUEST: {
s11_mme_release_access_bearers_request(
&s11_mme_stack_handle,
&received_message_p->ittiMsg.sgwReleaseAccessBearersRequest);
}
break;
case UDP_DATA_IND: {
/* We received new data to handle from the UDP layer */
NwRcT rc;
......
......@@ -598,8 +598,9 @@ int s1ap_mme_handle_initial_context_setup_response(
int s1ap_mme_handle_ue_context_release_request(uint32_t assoc_id,
uint32_t stream, struct s1ap_message_s *message)
{
S1ap_UEContextReleaseRequestIEs_t *ueContextReleaseRequest_p;
S1ap_UEContextReleaseRequestIEs_t *ueContextReleaseRequest_p = NULL;
ue_description_t *ue_ref = NULL;
MessageDef *message_p = NULL;
ueContextReleaseRequest_p = &message->msg.s1ap_UEContextReleaseRequestIEs;
......@@ -638,8 +639,27 @@ int s1ap_mme_handle_ue_context_release_request(uint32_t assoc_id,
* -> Send a UE context Release Command to eNB.
* TODO
*/
s1ap_mme_generate_ue_context_release_command(ue_ref);
//s1ap_mme_generate_ue_context_release_command(ue_ref);
// UE context will be removed when receiving UE_CONTEXT_RELEASE_COMPLETE
message_p = itti_alloc_new_message(TASK_S1AP, S1AP_UE_CONTEXT_RELEASE_REQ);
AssertFatal(message_p != NULL,"itti_alloc_new_message Failed");
memset((void*)&message_p->ittiMsg.mme_app_initial_context_setup_rsp,
0,
sizeof(mme_app_initial_context_setup_rsp_t));
S1AP_UE_CONTEXT_RELEASE_REQ(message_p).mme_ue_s1ap_id = ue_ref->mme_ue_s1ap_id;
MSC_LOG_TX_MESSAGE(
MSC_S1AP_MME,
MSC_MMEAPP_MME,
NULL,0,
"0 S1AP_UE_CONTEXT_RELEASE_REQ mme_ue_s1ap_id %u ",
S1AP_UE_CONTEXT_RELEASE_REQ(message_p).mme_ue_s1ap_id);
return itti_send_msg_to_task(TASK_MME_APP, INSTANCE_DEFAULT, message_p);
} else {
// TODO
S1AP_DEBUG("UE_CONTEXT_RELEASE_REQUEST ignored, cause mismatch eNB_ue_s1ap_id: ctxt 0x%08x != request 0x%08x",
......
......@@ -46,6 +46,7 @@
#include "common_types.h"
#include "intertask_interface.h"
#include "mme_config.h"
#include "msc.h"
#include "sgw_lite_defs.h"
#include "sgw_lite_handlers.h"
......@@ -53,7 +54,6 @@
#include "sgw_lite.h"
#include "pgw_lite_paa.h"
#include "spgw_config.h"
#include "msc.h"
extern sgw_app_t sgw_app;
extern spgw_config_t spgw_config;
......@@ -1122,3 +1122,62 @@ sgw_lite_handle_delete_session_request(
return -1;
}
int
sgw_lite_handle_release_access_bearers_request(
const SgwReleaseAccessBearersRequest * const release_access_bearers_req_pP)
{
task_id_t to_task;
hashtable_rc_t hash_rc;
SgwReleaseAccessBearersResponse *release_access_bearers_resp_p = NULL;
MessageDef *message_p = NULL;
s_plus_p_gw_eps_bearer_context_information_t *ctx_p = NULL;
#if defined(ENABLE_STANDALONE_EPC)
to_task = TASK_MME_APP;
#else
to_task = TASK_S11;
#endif
message_p = itti_alloc_new_message(TASK_SPGW_APP, SGW_RELEASE_ACCESS_BEARERS_RESPONSE);
if (message_p == NULL) {
return -1;
}
release_access_bearers_resp_p = &message_p->ittiMsg.sgwReleaseAccessBearersResponse;
hash_rc = hashtable_get(sgw_app.s11_bearer_context_information_hashtable,
release_access_bearers_req_pP->teid,
(void**)&ctx_p);
if (hash_rc == HASH_TABLE_OK) {
release_access_bearers_resp_p->cause = REQUEST_ACCEPTED;
release_access_bearers_resp_p->teid = ctx_p->sgw_eps_bearer_context_information.mme_teid_for_S11;
#warning "TODO Here the release (sgw_lite_handle_release_access_bearers_request)"
MSC_LOG_TX_MESSAGE(
MSC_SP_GWAPP_MME,
(to_task == TASK_MME_APP) ? MSC_MMEAPP_MME:MSC_S11_MME,
NULL,0,
"0 SGW_RELEASE_ACCESS_BEARERS_RESPONSE teid %u cause %u",
release_access_bearers_resp_p->teid,
release_access_bearers_resp_p->cause);
return itti_send_msg_to_task(to_task, INSTANCE_DEFAULT, message_p);
} else {
release_access_bearers_resp_p->cause = CONTEXT_NOT_FOUND;
release_access_bearers_resp_p->teid = 0;
MSC_LOG_TX_MESSAGE(
MSC_SP_GWAPP_MME,
(to_task == TASK_MME_APP) ? MSC_MMEAPP_MME:MSC_S11_MME,
NULL,0,
"0 SGW_RELEASE_ACCESS_BEARERS_RESPONSE CONTEXT_NOT_FOUND");
return itti_send_msg_to_task(to_task, INSTANCE_DEFAULT, message_p);
}
return -1;
}
......@@ -43,5 +43,5 @@ int sgw_lite_handle_gtpv1uCreateTunnelResp(const Gtpv1uCreateTunnelResp * const
int sgw_lite_handle_gtpv1uUpdateTunnelResp(const Gtpv1uUpdateTunnelResp * const endpoint_updated_p);
int sgw_lite_handle_modify_bearer_request (const SgwModifyBearerRequest * const modify_bearer_p);
int sgw_lite_handle_delete_session_request(const SgwDeleteSessionRequest * const delete_session_p);
int sgw_lite_handle_release_access_bearers_request(const SgwReleaseAccessBearersRequest * const release_access_bearers_req_pP);
#endif /* SGW_LITE_HANDLERS_H_ */
......@@ -464,6 +464,12 @@ typedef struct {
/* TODO: add packet filter list as defined in 3GPP TS 29.274 Table 10.5.162 */
} tft_t;
typedef enum node_type_e {
NODE_TYPE_MME = 0,
NODE_TYPE_SGSN = 1
} node_type_t;
/* Cause as defined in 3GPP TS 29.274 #8.4 */
typedef enum SGWCause_e {
/* Request / Initial message */
......
......@@ -78,6 +78,11 @@ static void *sgw_lite_intertask_interface(void *args_p)
}
break;
case SGW_RELEASE_ACCESS_BEARERS_REQUEST: {
sgw_lite_handle_release_access_bearers_request(&received_message_p->ittiMsg.sgwReleaseAccessBearersRequest);
}
break;
case SGW_DELETE_SESSION_REQUEST: {
sgw_lite_handle_delete_session_request(&received_message_p->ittiMsg.sgwDeleteSessionRequest);
}
......
......@@ -694,6 +694,7 @@ int config_parse_opt_line(int argc, char *argv[], mme_config_t *mme_config_p)
break;
case 'm': {
fprintf(stdout, "Logging Message chart(mscgen)\n");
MSC_INIT(MSC_EPC);
}
break;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment