From 2eaeef69e994647878b0cb3e32d24778a1dca70e Mon Sep 17 00:00:00 2001
From: Lionel Gauthier <lionel.gauthier@eurecom.fr>
Date: Mon, 13 Oct 2014 14:56:17 +0000
Subject: [PATCH] UE context release command TO BE CONTINUED

git-svn-id: http://svn.eurecom.fr/openair4G/trunk@5877 818b1a75-f10b-46b9-bf7c-635c3b92a50f
---
 openair-cn/S1AP/s1ap_eNB_decoder.c  | 48 ++++++++++++++++++++++-------
 openair-cn/S1AP/s1ap_eNB_handlers.c | 36 +++++++++++++++++++++-
 2 files changed, 72 insertions(+), 12 deletions(-)

diff --git a/openair-cn/S1AP/s1ap_eNB_decoder.c b/openair-cn/S1AP/s1ap_eNB_decoder.c
index f42f599d46..d910e82a90 100644
--- a/openair-cn/S1AP/s1ap_eNB_decoder.c
+++ b/openair-cn/S1AP/s1ap_eNB_decoder.c
@@ -66,9 +66,20 @@ static int s1ap_eNB_decode_initiating_message(s1ap_message *message,
     {
         case S1ap_ProcedureCode_id_downlinkNASTransport:
             ret = s1ap_decode_s1ap_downlinknastransporties(
-                &message->msg.s1ap_DownlinkNASTransportIEs, &initiating_p->value);
-            s1ap_xer_print_s1ap_downlinknastransport(s1ap_xer__print2sp, message_string, message);
-            message_id = S1AP_DOWNLINK_NAS_LOG;
+                &message->msg.s1ap_DownlinkNASTransportIEs,
+                &initiating_p->value);
+            s1ap_xer_print_s1ap_downlinknastransport(s1ap_xer__print2sp,
+                    message_string,
+                    message);
+            message_id          = S1AP_DOWNLINK_NAS_LOG;
+            message_string_size = strlen(message_string);
+            message_p           = itti_alloc_new_message_sized(TASK_S1AP,
+                    message_id,
+                    message_string_size + sizeof (IttiMsgText));
+            message_p->ittiMsg.s1ap_downlink_nas_log.size = message_string_size;
+            memcpy(&message_p->ittiMsg.s1ap_downlink_nas_log.text, message_string, message_string_size);
+            itti_send_msg_to_task(TASK_UNKNOWN, INSTANCE_DEFAULT, message_p);
+            free(message_string);
             break;
 
         case S1ap_ProcedureCode_id_InitialContextSetup:
@@ -76,6 +87,29 @@ static int s1ap_eNB_decode_initiating_message(s1ap_message *message,
                 &message->msg.s1ap_InitialContextSetupRequestIEs, &initiating_p->value);
             s1ap_xer_print_s1ap_initialcontextsetuprequest(s1ap_xer__print2sp, message_string, message);
             message_id = S1AP_INITIAL_CONTEXT_SETUP_LOG;
+            message_string_size = strlen(message_string);
+            message_p           = itti_alloc_new_message_sized(TASK_S1AP,
+                    message_id,
+                    message_string_size + sizeof (IttiMsgText));
+            message_p->ittiMsg.s1ap_initial_context_setup_log.size = message_string_size;
+            memcpy(&message_p->ittiMsg.s1ap_initial_context_setup_log.text, message_string, message_string_size);
+            itti_send_msg_to_task(TASK_UNKNOWN, INSTANCE_DEFAULT, message_p);
+            free(message_string);
+            break;
+
+        case S1ap_ProcedureCode_id_UEContextRelease:
+            ret = s1ap_decode_s1ap_uecontextreleasecommandies(
+                &message->msg.s1ap_UEContextReleaseCommandIEs, &initiating_p->value);
+            s1ap_xer_print_s1ap_uecontextreleasecommand(s1ap_xer__print2sp, message_string, message);
+            message_id = S1AP_UE_CONTEXT_RELEASE_COMMAND_LOG;
+            message_string_size = strlen(message_string);
+            message_p           = itti_alloc_new_message_sized(TASK_S1AP,
+                    message_id,
+                    message_string_size + sizeof (IttiMsgText));
+            message_p->ittiMsg.s1ap_ue_context_release_command_log.size = message_string_size;
+            memcpy(&message_p->ittiMsg.s1ap_ue_context_release_command_log.text, message_string, message_string_size);
+            itti_send_msg_to_task(TASK_UNKNOWN, INSTANCE_DEFAULT, message_p);
+            free(message_string);
             break;
 
         default:
@@ -86,15 +120,7 @@ static int s1ap_eNB_decode_initiating_message(s1ap_message *message,
             return -1;
     }
 
-    message_string_size = strlen(message_string);
-
-    message_p = itti_alloc_new_message_sized(TASK_S1AP, message_id, message_string_size + sizeof (IttiMsgText));
-    message_p->ittiMsg.s1ap_downlink_nas_log.size = message_string_size;
-    memcpy(&message_p->ittiMsg.s1ap_downlink_nas_log.text, message_string, message_string_size);
-
-    itti_send_msg_to_task(TASK_UNKNOWN, INSTANCE_DEFAULT, message_p);
 
-    free(message_string);
 
     return ret;
 }
diff --git a/openair-cn/S1AP/s1ap_eNB_handlers.c b/openair-cn/S1AP/s1ap_eNB_handlers.c
index 0a0efd315d..121efeed12 100644
--- a/openair-cn/S1AP/s1ap_eNB_handlers.c
+++ b/openair-cn/S1AP/s1ap_eNB_handlers.c
@@ -71,6 +71,11 @@ int s1ap_eNB_handle_initial_context_request(uint32_t               assoc_id,
                                             uint32_t               stream,
                                             struct s1ap_message_s *message_p);
 
+static
+int s1ap_eNB_handle_ue_context_release(uint32_t               assoc_id,
+                                            uint32_t               stream,
+                                            struct s1ap_message_s *s1ap_message_p);
+
 /* Handlers matrix. Only eNB related procedure present here */
 s1ap_message_decoded_callback messages_callback[][3] = {
     { 0, 0, 0 }, /* HandoverPreparation */
@@ -96,7 +101,7 @@ s1ap_message_decoded_callback messages_callback[][3] = {
     { 0, 0, 0 }, /* UplinkS1cdma2000tunneling */
     { 0, 0, 0 }, /* UEContextModification */
     { 0, 0, 0 }, /* UECapabilityInfoIndication */
-    { 0, 0, 0 }, /* UEContextRelease */
+    { s1ap_eNB_handle_ue_context_release, 0, 0 }, /* UEContextRelease */
     { 0, 0, 0 }, /* eNBStatusTransfer */
     { 0, 0, 0 }, /* MMEStatusTransfer */
     { s1ap_eNB_handle_deactivate_trace, 0, 0 }, /* DeactivateTrace */
@@ -511,3 +516,32 @@ int s1ap_eNB_handle_initial_context_request(uint32_t               assoc_id,
 
     return 0;
 }
+
+
+static
+int s1ap_eNB_handle_ue_context_release(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;
+
+    S1ap_UEContextReleaseCommandIEs_t *ueContextReleaseCommand_p;
+    DevAssert(s1ap_message_p != NULL);
+
+    ueContextReleaseCommand_p = &s1ap_message_p->msg.s1ap_UEContextReleaseCommandIEs;
+
+    if ((mme_desc_p = s1ap_eNB_get_MME(NULL, assoc_id, 0)) == NULL) {
+        S1AP_ERROR("[SCTP %d] Received UE context release command for non "
+                   "existing MME context\n", assoc_id);
+        return -1;
+    }
+
+#warning "TODO"
+    S1AP_ERROR("s1ap_eNB_handle_ue_context_release to be continued\n");
+    return 0;
+}
+
-- 
GitLab