diff --git a/openair-cn/COMMON/s1ap_messages_def.h b/openair-cn/COMMON/s1ap_messages_def.h index c53005a2d159235b92a94de17bcc24afad2fc25f..8a794f22b01949e9542fc6c34bb41290a1210711 100644 --- a/openair-cn/COMMON/s1ap_messages_def.h +++ b/openair-cn/COMMON/s1ap_messages_def.h @@ -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) diff --git a/openair-cn/COMMON/s1ap_messages_types.h b/openair-cn/COMMON/s1ap_messages_types.h index 1d091e3429553f93545ada1ef546f55f5d74b7e3..c6f867865b9cb73ee7d1df6b08dddbefe5057439 100644 --- a/openair-cn/COMMON/s1ap_messages_types.h +++ b/openair-cn/COMMON/s1ap_messages_types.h @@ -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_ */ diff --git a/openair-cn/COMMON/sgw_lite_def.h b/openair-cn/COMMON/sgw_lite_def.h index 88032a138acbf49af2cb63d4425ed85d04f76e6a..3f1814b028d318fcd7afa9cb53f975b5dab12178 100644 --- a/openair-cn/COMMON/sgw_lite_def.h +++ b/openair-cn/COMMON/sgw_lite_def.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) diff --git a/openair-cn/COMMON/sgw_lite_messages_types.h b/openair-cn/COMMON/sgw_lite_messages_types.h index 83b364c412e192d42e8ef3c1575f894f5b38609c..178618423b3aeb7bdcbfe2046ae7b3317945ab81 100644 --- a/openair-cn/COMMON/sgw_lite_messages_types.h +++ b/openair-cn/COMMON/sgw_lite_messages_types.h @@ -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 diff --git a/openair-cn/MME_APP/mme_app_bearer.c b/openair-cn/MME_APP/mme_app_bearer.c index 9383bbcfabad4be075ae43bd5cefc3a8c45775e3..5c027aa1a268ecd810fbcad240fe4e96f1e6a474 100644 --- a/openair-cn/MME_APP/mme_app_bearer.c +++ b/openair-cn/MME_APP/mme_app_bearer.c @@ -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( diff --git a/openair-cn/MME_APP/mme_app_context.c b/openair-cn/MME_APP/mme_app_context.c index 64c5893ae4ce05b0f04fc837903ace8913b76bce..589710d45ab65a1ba0f744f4b832acced8585584 100644 --- a/openair-cn/MME_APP/mme_app_context.c +++ b/openair-cn/MME_APP/mme_app_context.c @@ -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); +} diff --git a/openair-cn/MME_APP/mme_app_main.c b/openair-cn/MME_APP/mme_app_main.c index 8c4ffc3698cfc4cfa227adbbc04b805c5d97e961..9026532bc5a0755ce97c949137be13d02c147bcc 100644 --- a/openair-cn/MME_APP/mme_app_main.c +++ b/openair-cn/MME_APP/mme_app_main.c @@ -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)); diff --git a/openair-cn/MME_APP/mme_app_ue_context.h b/openair-cn/MME_APP/mme_app_ue_context.h index 682c196b334b95f0e061545f53b2333ccb7172d9..6ac65697baa4f28c19a5c43f341555c8cac4cfcb 100644 --- a/openair-cn/MME_APP/mme_app_ue_context.h +++ b/openair-cn/MME_APP/mme_app_ue_context.h @@ -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_ */ /* @} */ diff --git a/openair-cn/NAS/EURECOM-NAS/src/api/network/nas_message.c b/openair-cn/NAS/EURECOM-NAS/src/api/network/nas_message.c index 22fc6dbe1fa5e0f416daf6b0420e8e64e1246a16..9896ebfde06cca3539ac47789c26e69b6e5a679d 100644 --- a/openair-cn/NAS/EURECOM-NAS/src/api/network/nas_message.c +++ b/openair-cn/NAS/EURECOM-NAS/src/api/network/nas_message.c @@ -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 diff --git a/openair-cn/NAS/EURECOM-NAS/src/util/nas_log.h b/openair-cn/NAS/EURECOM-NAS/src/util/nas_log.h index 9c3bfb0983f966433659035d68f97a528fd46c83..b947e3356393f2adba4642a74edd155e7999a03f 100644 --- a/openair-cn/NAS/EURECOM-NAS/src/util/nas_log.h +++ b/openair-cn/NAS/EURECOM-NAS/src/util/nas_log.h @@ -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); \ diff --git a/openair-cn/S11/s11_mme_session_manager.c b/openair-cn/S11/s11_mme_session_manager.c index 57f752611f4e19e0ac515e2b2de75e809ccf403b..d0fe543a8cba3d44bb59502382c921933887653e 100644 --- a/openair-cn/S11/s11_mme_session_manager.c +++ b/openair-cn/S11/s11_mme_session_manager.c @@ -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()"); +} diff --git a/openair-cn/S11/s11_mme_session_manager.h b/openair-cn/S11/s11_mme_session_manager.h index 1f7f83f065d885421cdcef81df4b34928d84c757..dd11f859bc78517987ddb00a8c604e10101e8540 100644 --- a/openair-cn/S11/s11_mme_session_manager.h +++ b/openair-cn/S11/s11_mme_session_manager.h @@ -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, diff --git a/openair-cn/S11/s11_mme_task.c b/openair-cn/S11/s11_mme_task.c index f9cf96a1b44f6bb29a0a43d6dacbf0aa6326d91f..fad5aecda7593616f6dde0a8bb3f484343c8ec2e 100644 --- a/openair-cn/S11/s11_mme_task.c +++ b/openair-cn/S11/s11_mme_task.c @@ -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; diff --git a/openair-cn/S1AP/s1ap_mme_handlers.c b/openair-cn/S1AP/s1ap_mme_handlers.c index 0e6bd10d811ee2940a628e86f7b3e9dccbca5bec..3682bb45dfca4bde382da27e58ac2e31dbf270b8 100644 --- a/openair-cn/S1AP/s1ap_mme_handlers.c +++ b/openair-cn/S1AP/s1ap_mme_handlers.c @@ -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", diff --git a/openair-cn/SGW-LITE/sgw_lite_handlers.c b/openair-cn/SGW-LITE/sgw_lite_handlers.c index eef43d1a1f2e47a04d702b0df6951a166343cf4d..ca751ad55542c5b8e1a43a56a07d3caf6572550b 100644 --- a/openair-cn/SGW-LITE/sgw_lite_handlers.c +++ b/openair-cn/SGW-LITE/sgw_lite_handlers.c @@ -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; +} + diff --git a/openair-cn/SGW-LITE/sgw_lite_handlers.h b/openair-cn/SGW-LITE/sgw_lite_handlers.h index ad5ee3ff78df0bb8a8c44998f07088d0f186f394..1f74f802bdf58453def8bb745dccb7e1a85e9972 100644 --- a/openair-cn/SGW-LITE/sgw_lite_handlers.h +++ b/openair-cn/SGW-LITE/sgw_lite_handlers.h @@ -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_ */ diff --git a/openair-cn/SGW-LITE/sgw_lite_ie_defs.h b/openair-cn/SGW-LITE/sgw_lite_ie_defs.h index 06180da5e411d16379e4e8d65248ee7206850a11..7e95a583988cc3760edc49337ed1c8e5a0237019 100644 --- a/openair-cn/SGW-LITE/sgw_lite_ie_defs.h +++ b/openair-cn/SGW-LITE/sgw_lite_ie_defs.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 */ diff --git a/openair-cn/SGW-LITE/sgw_lite_task.c b/openair-cn/SGW-LITE/sgw_lite_task.c index 8a9a913550172b4dc0f51dfa22081b54bbc51a57..c2349af66c617077a00e871c4bfb96c6d32ea947 100644 --- a/openair-cn/SGW-LITE/sgw_lite_task.c +++ b/openair-cn/SGW-LITE/sgw_lite_task.c @@ -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); } diff --git a/openair-cn/UTILS/mme_config.c b/openair-cn/UTILS/mme_config.c index 3597e657283acdf73b2e9f51300fcff7399b15c2..6f401ae5f74dbb09f85f5c5203b59d38587e805d 100644 --- a/openair-cn/UTILS/mme_config.c +++ b/openair-cn/UTILS/mme_config.c @@ -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;