diff --git a/openair-cn/COMMON/s1ap_messages_def.h b/openair-cn/COMMON/s1ap_messages_def.h index b4107935b74006c527d95fea6659cf0bb0fdd992..776b8f683a0e278435a3e67588815c14b343f512 100644 --- a/openair-cn/COMMON/s1ap_messages_def.h +++ b/openair-cn/COMMON/s1ap_messages_def.h @@ -37,6 +37,7 @@ MESSAGE_DEF(S1AP_DOWNLINK_NAS_LOG , MESSAGE_PRIORITY_MED, IttiMsgText MESSAGE_DEF(S1AP_S1_SETUP_LOG , MESSAGE_PRIORITY_MED, IttiMsgText , s1ap_s1_setup_log) MESSAGE_DEF(S1AP_INITIAL_UE_MESSAGE_LOG , MESSAGE_PRIORITY_MED, IttiMsgText , s1ap_initial_ue_message_log) MESSAGE_DEF(S1AP_UE_CONTEXT_RELEASE_REQ_LOG, MESSAGE_PRIORITY_MED, IttiMsgText , s1ap_ue_context_release_req_log) +MESSAGE_DEF(S1AP_UE_CONTEXT_RELEASE_COMMAND_LOG, MESSAGE_PRIORITY_MED, IttiMsgText , s1ap_ue_context_release_command_log) MESSAGE_DEF(S1AP_UE_CONTEXT_RELEASE_LOG , MESSAGE_PRIORITY_MED, IttiMsgText , s1ap_ue_context_release_log) MESSAGE_DEF(S1AP_UE_CAPABILITIES_IND , MESSAGE_PRIORITY_MED, s1ap_ue_cap_ind_t , s1ap_ue_cap_ind) diff --git a/openair-cn/S1AP/s1ap_eNB_handlers.c b/openair-cn/S1AP/s1ap_eNB_handlers.c index 121efeed121051ecbb6d284d74f9294efbe31180..b1891018e89a1626265716b507910035e169a332 100644 --- a/openair-cn/S1AP/s1ap_eNB_handlers.c +++ b/openair-cn/S1AP/s1ap_eNB_handlers.c @@ -72,7 +72,7 @@ int s1ap_eNB_handle_initial_context_request(uint32_t assoc_id, struct s1ap_message_s *message_p); static -int s1ap_eNB_handle_ue_context_release(uint32_t assoc_id, +int s1ap_eNB_handle_ue_context_release_command(uint32_t assoc_id, uint32_t stream, struct s1ap_message_s *s1ap_message_p); @@ -101,7 +101,7 @@ s1ap_message_decoded_callback messages_callback[][3] = { { 0, 0, 0 }, /* UplinkS1cdma2000tunneling */ { 0, 0, 0 }, /* UEContextModification */ { 0, 0, 0 }, /* UECapabilityInfoIndication */ - { s1ap_eNB_handle_ue_context_release, 0, 0 }, /* UEContextRelease */ + { s1ap_eNB_handle_ue_context_release_command, 0, 0 }, /* UEContextRelease */ { 0, 0, 0 }, /* eNBStatusTransfer */ { 0, 0, 0 }, /* MMEStatusTransfer */ { s1ap_eNB_handle_deactivate_trace, 0, 0 }, /* DeactivateTrace */ @@ -519,12 +519,10 @@ int s1ap_eNB_handle_initial_context_request(uint32_t assoc_id, static -int s1ap_eNB_handle_ue_context_release(uint32_t assoc_id, +int s1ap_eNB_handle_ue_context_release_command(uint32_t assoc_id, uint32_t stream, struct s1ap_message_s *s1ap_message_p) { - int i; - s1ap_eNB_mme_data_t *mme_desc_p = NULL; s1ap_eNB_ue_context_t *ue_desc_p = NULL; MessageDef *message_p = NULL; @@ -540,8 +538,42 @@ int s1ap_eNB_handle_ue_context_release(uint32_t assoc_id, return -1; } -#warning "TODO" - S1AP_ERROR("s1ap_eNB_handle_ue_context_release to be continued\n"); - return 0; + S1ap_MME_UE_S1AP_ID_t mme_ue_s1ap_id; + S1ap_ENB_UE_S1AP_ID_t enb_ue_s1ap_id; + + switch (ueContextReleaseCommand_p->uE_S1AP_IDs.present) { + case S1ap_UE_S1AP_IDs_PR_uE_S1AP_ID_pair: + enb_ue_s1ap_id = ueContextReleaseCommand_p->uE_S1AP_IDs.choice.uE_S1AP_ID_pair.eNB_UE_S1AP_ID; + mme_ue_s1ap_id = ueContextReleaseCommand_p->uE_S1AP_IDs.choice.uE_S1AP_ID_pair.mME_UE_S1AP_ID; + + if ((ue_desc_p = s1ap_eNB_get_ue_context(mme_desc_p->s1ap_eNB_instance, + enb_ue_s1ap_id)) == NULL) { + S1AP_ERROR("[SCTP %d] Received UE context release command for non " + "existing UE context 0x%06x\n", + assoc_id, + enb_ue_s1ap_id); + /*MessageDef *msg_complete_p; + msg_complete_p = itti_alloc_new_message(TASK_RRC_ENB, S1AP_UE_CONTEXT_RELEASE_COMPLETE); + S1AP_UE_CONTEXT_RELEASE_COMPLETE(msg_complete_p).eNB_ue_s1ap_id = enb_ue_s1ap_id; + itti_send_msg_to_task(TASK_S1AP, ue_desc_p->eNB_instance->instance <=> 0, msg_complete_p); + */ + return -1; + } else { + message_p = itti_alloc_new_message(TASK_S1AP, S1AP_UE_CONTEXT_RELEASE_COMMAND); + S1AP_UE_CONTEXT_RELEASE_COMMAND(message_p).eNB_ue_s1ap_id = enb_ue_s1ap_id; + itti_send_msg_to_task(TASK_RRC_ENB, ue_desc_p->eNB_instance->instance, message_p); + return 0; + } + break; + +#warning "TODO mapping mme_ue_s1ap_id enb_ue_s1ap_id?" + case S1ap_UE_S1AP_IDs_PR_mME_UE_S1AP_ID: + mme_ue_s1ap_id = ueContextReleaseCommand_p->uE_S1AP_IDs.choice.mME_UE_S1AP_ID; + S1AP_ERROR("TO DO mapping mme_ue_s1ap_id enb_ue_s1ap_id"); + case S1ap_UE_S1AP_IDs_PR_NOTHING: + default: + S1AP_ERROR("S1AP_UE_CONTEXT_RELEASE_COMMAND not processed, missing info elements"); + return -1; + } }