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
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -29,8 +29,9 @@
|
||||
#ifndef S1AP_MESSAGES_TYPES_H_
|
||||
#define S1AP_MESSAGES_TYPES_H_
|
||||
|
||||
#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_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)
|
||||
|
||||
@@ -42,12 +42,14 @@
|
||||
#ifndef SGW_LITE_MESSAGES_TYPES_H_
|
||||
#define SGW_LITE_MESSAGES_TYPES_H_
|
||||
|
||||
#define SGW_CREATE_SESSION_REQUEST(mSGpTR) (mSGpTR)->ittiMsg.sgwCreateSessionRequest
|
||||
#define SGW_CREATE_SESSION_RESPONSE(mSGpTR) (mSGpTR)->ittiMsg.sgwCreateSessionResponse
|
||||
#define SGW_MODIFY_BEARER_REQUEST(mSGpTR) (mSGpTR)->ittiMsg.sgwModifyBearerRequest
|
||||
#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_CREATE_SESSION_REQUEST(mSGpTR) (mSGpTR)->ittiMsg.sgwCreateSessionRequest
|
||||
#define SGW_CREATE_SESSION_RESPONSE(mSGpTR) (mSGpTR)->ittiMsg.sgwCreateSessionResponse
|
||||
#define SGW_MODIFY_BEARER_REQUEST(mSGpTR) (mSGpTR)->ittiMsg.sgwModifyBearerRequest
|
||||
#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;
|
||||
ue_description_t *ue_ref = NULL;
|
||||
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;
|
||||
|
||||
Reference in New Issue
Block a user