From 445ca246ba8a4860bbe66ebb97c5f20ecc1dd387 Mon Sep 17 00:00:00 2001
From: Lionel Gauthier <lionel.gauthier@eurecom.fr>
Date: Tue, 23 Dec 2014 13:36:10 +0000
Subject: [PATCH] S1AP UE context release

git-svn-id: http://svn.eurecom.fr/openair4G/trunk@6314 818b1a75-f10b-46b9-bf7c-635c3b92a50f
---
 openair-cn/S1AP/Makefile.eNB              | 22 ++++---
 openair-cn/S1AP/s1ap_eNB.c                |  5 ++
 openair-cn/S1AP/s1ap_eNB_encoder.c        | 49 ++++++++++++++--
 openair-cn/S1AP/s1ap_eNB_nas_procedures.c | 71 -----------------------
 openair-cn/S1AP/s1ap_eNB_nas_procedures.h |  3 -
 openair-cn/SCTP/sctp_eNB_task.c           | 52 +++++++++--------
 6 files changed, 91 insertions(+), 111 deletions(-)

diff --git a/openair-cn/S1AP/Makefile.eNB b/openair-cn/S1AP/Makefile.eNB
index 8cba66a428..4547fdbaea 100644
--- a/openair-cn/S1AP/Makefile.eNB
+++ b/openair-cn/S1AP/Makefile.eNB
@@ -51,15 +51,19 @@ endif
 include $(ASN1MESSAGESDIR)/Makefile.inc
 
 libs1ap_OBJECTS = \
-	s1ap_eNB.o s1ap_common.o		\
-	s1ap_eNB_itti_messaging.o		\
-	s1ap_eNB_decoder.o			\
-	s1ap_eNB_encoder.o			\
-	s1ap_eNB_handlers.o			\
-	s1ap_eNB_nnsf.o	s1ap_eNB_ue_context.o	\
-	s1ap_eNB_trace.o s1ap_eNB_overload.o	\
-	s1ap_eNB_nas_procedures.o		\
-	s1ap_eNB_management_procedures.o	\
+	s1ap_common.o \
+	s1ap_eNB.o \
+	s1ap_eNB_context_management_procedures.o \
+	s1ap_eNB_decoder.o \
+	s1ap_eNB_encoder.o \
+	s1ap_eNB_handlers.o \
+	s1ap_eNB_itti_messaging.o \
+	s1ap_eNB_management_procedures.o \
+	s1ap_eNB_nas_procedures.o \
+	s1ap_eNB_nnsf.o \
+	s1ap_eNB_overload.o \
+	s1ap_eNB_trace.o \
+	s1ap_eNB_ue_context.o \
 	$(addprefix MESSAGES/, $(S1AP_ASN_MODULE_SOURCES))
 
 ifeq ($(USE_MME), R10)
diff --git a/openair-cn/S1AP/s1ap_eNB.c b/openair-cn/S1AP/s1ap_eNB.c
index 18137475be..161e36e4b8 100644
--- a/openair-cn/S1AP/s1ap_eNB.c
+++ b/openair-cn/S1AP/s1ap_eNB.c
@@ -51,6 +51,7 @@
 
 #include "s1ap_eNB_nas_procedures.h"
 #include "s1ap_eNB_management_procedures.h"
+#include "s1ap_eNB_context_management_procedures.h"
 
 #include "s1ap_eNB_itti_messaging.h"
 
@@ -300,6 +301,10 @@ void *s1ap_eNB_task(void *arg)
                 s1ap_ue_context_release_complete(ITTI_MESSAGE_GET_INSTANCE(received_msg),
                                               &S1AP_UE_CONTEXT_RELEASE_COMPLETE(received_msg));
             } break;
+            case S1AP_UE_CONTEXT_RELEASE_REQ: {
+                s1ap_ue_context_release_req(ITTI_MESSAGE_GET_INSTANCE(received_msg),
+                                              &S1AP_UE_CONTEXT_RELEASE_REQ(received_msg));
+            } break;
             default:
                 S1AP_ERROR("Received unhandled message: %d:%s\n",
                            ITTI_MSG_ID(received_msg), ITTI_MSG_NAME(received_msg));
diff --git a/openair-cn/S1AP/s1ap_eNB_encoder.c b/openair-cn/S1AP/s1ap_eNB_encoder.c
index 821f791747..2b58ae90e0 100644
--- a/openair-cn/S1AP/s1ap_eNB_encoder.c
+++ b/openair-cn/S1AP/s1ap_eNB_encoder.c
@@ -95,6 +95,11 @@ int s1ap_eNB_encode_ue_context_release_complete(
     uint8_t                           **buffer,
     uint32_t                           *length);
 
+static inline
+int s1ap_eNB_encode_ue_context_release_request(
+        S1ap_UEContextReleaseRequestIEs_t *s1ap_UEContextReleaseRequestIEs,
+    uint8_t                              **buffer,
+    uint32_t                              *length);
 
 int s1ap_eNB_encode_pdu(s1ap_message *message, uint8_t **buffer, uint32_t *len)
 {
@@ -170,6 +175,15 @@ int s1ap_eNB_encode_initiating(s1ap_message *s1ap_message_p,
             message_id = S1AP_NAS_NON_DELIVERY_IND_LOG;
             break;
 
+        case S1ap_ProcedureCode_id_UEContextReleaseRequest:
+            ret = s1ap_eNB_encode_ue_context_release_request(
+                &s1ap_message_p->msg.s1ap_UEContextReleaseRequestIEs, buffer, len);
+            s1ap_xer_print_s1ap_uecontextreleaserequest(s1ap_xer__print2sp,
+                                                          message_string, s1ap_message_p);
+            message_id = S1AP_UE_CONTEXT_RELEASE_REQ_LOG;
+            break;
+
+
         default:
             S1AP_DEBUG("Unknown procedure ID (%d) for initiating message\n",
                        (int)s1ap_message_p->procedureCode);
@@ -466,19 +480,19 @@ int s1ap_eNB_encode_initial_context_setup_response(
 
 static inline
 int s1ap_eNB_encode_ue_context_release_complete(
-		S1ap_UEContextReleaseCompleteIEs_t *s1ap_UEContextReleaseCompleteIEs,
+        S1ap_UEContextReleaseCompleteIEs_t *s1ap_UEContextReleaseCompleteIEs,
     uint8_t                              **buffer,
     uint32_t                              *length)
 {
-	S1ap_UEContextReleaseComplete_t  ue_context_release_complete;
-	S1ap_UEContextReleaseComplete_t *ue_context_release_complete_p =
+    S1ap_UEContextReleaseComplete_t  ue_context_release_complete;
+    S1ap_UEContextReleaseComplete_t *ue_context_release_complete_p =
         &ue_context_release_complete;
 
     memset((void *)ue_context_release_complete_p, 0,
            sizeof(ue_context_release_complete));
 
     if (s1ap_encode_s1ap_uecontextreleasecompleteies(
-    		ue_context_release_complete_p, s1ap_UEContextReleaseCompleteIEs) < 0)
+            ue_context_release_complete_p, s1ap_UEContextReleaseCompleteIEs) < 0)
     {
         return -1;
     }
@@ -491,3 +505,30 @@ int s1ap_eNB_encode_ue_context_release_complete(
             ue_context_release_complete_p);
 }
 
+static inline
+int s1ap_eNB_encode_ue_context_release_request(
+        S1ap_UEContextReleaseRequestIEs_t *s1ap_UEContextReleaseRequestIEs,
+    uint8_t                              **buffer,
+    uint32_t                              *length)
+{
+    S1ap_UEContextReleaseRequest_t  ue_context_release_request;
+    S1ap_UEContextReleaseRequest_t *ue_context_release_request_p =
+        &ue_context_release_request;
+
+    memset((void *)ue_context_release_request_p, 0,
+           sizeof(ue_context_release_request));
+
+    if (s1ap_encode_s1ap_uecontextreleaserequesties(
+                    ue_context_release_request_p, s1ap_UEContextReleaseRequestIEs) < 0)
+    {
+        return -1;
+    }
+
+    return s1ap_generate_initiating_message(buffer,
+            length,
+            S1ap_ProcedureCode_id_UEContextReleaseRequest,
+            S1ap_Criticality_reject,
+            &asn_DEF_S1ap_UEContextReleaseRequest,
+            ue_context_release_request_p);
+}
+
diff --git a/openair-cn/S1AP/s1ap_eNB_nas_procedures.c b/openair-cn/S1AP/s1ap_eNB_nas_procedures.c
index 49a9bf0109..bd4f67ccff 100644
--- a/openair-cn/S1AP/s1ap_eNB_nas_procedures.c
+++ b/openair-cn/S1AP/s1ap_eNB_nas_procedures.c
@@ -573,74 +573,3 @@ int s1ap_eNB_ue_capabilities(instance_t instance,
     return ret;
 }
 
-int s1ap_ue_context_release_complete(instance_t instance,
-		s1ap_ue_release_complete_t *ue_release_complete_p)
-{
-    s1ap_eNB_instance_t          *s1ap_eNB_instance_p = NULL;
-    struct s1ap_eNB_ue_context_s *ue_context_p        = NULL;
-
-    S1ap_UEContextReleaseCompleteIEs_t *ue_ctxt_release_complete_ies_p = NULL;
-
-    s1ap_message  message;
-
-    uint8_t  *buffer;
-    uint32_t length;
-    int      ret = -1;
-
-    /* Retrieve the S1AP eNB instance associated with Mod_id */
-    s1ap_eNB_instance_p = s1ap_eNB_get_instance(instance);
-
-    DevAssert(ue_release_complete_p != NULL);
-    DevAssert(s1ap_eNB_instance_p != NULL);
-
-    if ((ue_context_p = s1ap_eNB_get_ue_context(s1ap_eNB_instance_p,
-    		ue_release_complete_p->eNB_ue_s1ap_id)) == NULL)
-    {
-        /* The context for this eNB ue s1ap id doesn't exist in the map of eNB UEs */
-        S1AP_WARN("Failed to find ue context associated with eNB ue s1ap id: %u\n",
-        		ue_release_complete_p->eNB_ue_s1ap_id);
-        return -1;
-    }
-
-    /* Prepare the S1AP message to encode */
-    memset(&message, 0, sizeof(s1ap_message));
-
-    message.direction     = S1AP_PDU_PR_successfulOutcome;
-    message.procedureCode = S1ap_ProcedureCode_id_UEContextRelease;
-    //message.criticality   = S1ap_Criticality_reject;
-    message.direction     = S1AP_PDU_PR_successfulOutcome;
-
-    ue_ctxt_release_complete_ies_p = &message.msg.s1ap_UEContextReleaseCompleteIEs;
-
-    ue_ctxt_release_complete_ies_p->eNB_UE_S1AP_ID = ue_release_complete_p->eNB_ue_s1ap_id;
-    ue_ctxt_release_complete_ies_p->mme_ue_s1ap_id = ue_context_p->mme_ue_s1ap_id;
-    //ue_ctxt_release_complete_ies_p->criticalityDiagnostics
-    //ue_ctxt_release_complete_ies_p->presenceMask
-
-    if (s1ap_eNB_encode_pdu(&message, &buffer, &length) < 0) {
-        /* Encode procedure has failed... */
-        S1AP_ERROR("Failed to encode UE context release complete\n");
-        return -1;
-    }
-
-    /* UE associated signalling -> use the allocated stream */
-    s1ap_eNB_itti_send_sctp_data_req(s1ap_eNB_instance_p->instance,
-                                     ue_context_p->mme_ref->assoc_id, buffer,
-                                     length, ue_context_p->stream);
-
-
-    s1ap_eNB_itti_send_sctp_close_association(s1ap_eNB_instance_p->instance,
-                                     ue_context_p->mme_ref->assoc_id);
-
-
-
-    // release UE context
-    struct s1ap_eNB_ue_context_s *ue_context2_p = NULL;
-    if ((ue_context2_p = RB_REMOVE(s1ap_ue_map, &s1ap_eNB_instance_p->s1ap_ue_head, ue_context_p))
-            == NULL)
-    {
-        s1ap_eNB_free_ue_context(ue_context2_p);
-    }
-    return ret;
-}
-
diff --git a/openair-cn/S1AP/s1ap_eNB_nas_procedures.h b/openair-cn/S1AP/s1ap_eNB_nas_procedures.h
index 04d31b0f2a..c80d5f34c2 100644
--- a/openair-cn/S1AP/s1ap_eNB_nas_procedures.h
+++ b/openair-cn/S1AP/s1ap_eNB_nas_procedures.h
@@ -49,8 +49,5 @@ int s1ap_eNB_initial_ctxt_resp(
 int s1ap_eNB_ue_capabilities(instance_t instance,
                              s1ap_ue_cap_info_ind_t *ue_cap_info_ind_p);
 
-int s1ap_ue_context_release_complete(instance_t instance,
-                             s1ap_ue_release_complete_t *ue_release_complete_p);
-
 
 #endif /* S1AP_ENB_NAS_PROCEDURES_H_ */
diff --git a/openair-cn/SCTP/sctp_eNB_task.c b/openair-cn/SCTP/sctp_eNB_task.c
index d4d5338b7d..2636e5e797 100644
--- a/openair-cn/SCTP/sctp_eNB_task.c
+++ b/openair-cn/SCTP/sctp_eNB_task.c
@@ -97,8 +97,7 @@ static STAILQ_HEAD(sctp_cnx_list_head, sctp_cnx_list_elm_s) sctp_cnx_list;
 static uint16_t sctp_nb_cnx = 0;
 
 
-struct sctp_cnx_list_elm_s *sctp_get_cnx(int32_t assoc_id, int sd)
-{
+struct sctp_cnx_list_elm_s *sctp_get_cnx(int32_t assoc_id, int sd) {
     struct sctp_cnx_list_elm_s *elm;
 
     STAILQ_FOREACH(elm, &sctp_cnx_list, entries)
@@ -117,10 +116,11 @@ struct sctp_cnx_list_elm_s *sctp_get_cnx(int32_t assoc_id, int sd)
     return NULL;
 }
 
-void sctp_handle_new_association_req(
-    const instance_t instance,
-    const task_id_t requestor,
-    const sctp_new_association_req_t * const sctp_new_association_req_p)
+void
+sctp_handle_new_association_req(
+                const instance_t instance,
+                const task_id_t requestor,
+                const sctp_new_association_req_t * const sctp_new_association_req_p)
 {
     int                           sd;
     int32_t                       assoc_id;
@@ -358,9 +358,9 @@ void sctp_handle_new_association_req(
 }
 
 void sctp_send_data(
-		instance_t       instance,
-		task_id_t        task_id,
-		sctp_data_req_t *sctp_data_req_p)
+                instance_t       instance,
+                task_id_t        task_id,
+                sctp_data_req_t *sctp_data_req_p)
 {
     struct sctp_cnx_list_elm_s *sctp_cnx = NULL;
 
@@ -400,9 +400,9 @@ void sctp_send_data(
 }
 
 static int sctp_close_association(
-		const instance_t instance,
-	    const task_id_t  requestor,
-	    sctp_close_association_t     *close_association_p)
+                const instance_t instance,
+                const task_id_t  requestor,
+                sctp_close_association_t     *close_association_p)
 {
 
     struct sctp_cnx_list_elm_s *sctp_cnx = NULL;
@@ -507,11 +507,10 @@ static int sctp_create_new_listener(
 
     /* Some pre-bind socket configuration */
     if (sctp_set_init_opt(sd,
-    		sctp_cnx->in_streams,
-    		sctp_cnx->out_streams,
-            0,
-            0) < 0)
-    {
+                          sctp_cnx->in_streams,
+                          sctp_cnx->out_streams,
+                          0,
+                          0) < 0) {
         goto err;
     }
 
@@ -540,11 +539,12 @@ err:
     return -1;
 }
 
-static
-inline void sctp_eNB_accept_associations(struct sctp_cnx_list_elm_s *sctp_cnx)
+static inline
+void
+sctp_eNB_accept_associations(
+                struct sctp_cnx_list_elm_s *sctp_cnx)
 {
-    int client_sd;
-
+    int             client_sd;
     struct sockaddr saddr;
     socklen_t       saddr_size;
 
@@ -606,8 +606,10 @@ inline void sctp_eNB_accept_associations(struct sctp_cnx_list_elm_s *sctp_cnx)
     }
 }
 
-static
-inline void sctp_eNB_read_from_socket(struct sctp_cnx_list_elm_s *sctp_cnx)
+static inline
+void
+sctp_eNB_read_from_socket(
+                struct sctp_cnx_list_elm_s *sctp_cnx)
 {
     int                    flags = 0, n;
     socklen_t              from_len;
@@ -724,7 +726,9 @@ inline void sctp_eNB_read_from_socket(struct sctp_cnx_list_elm_s *sctp_cnx)
     }
 }
 
-void sctp_eNB_flush_sockets(struct epoll_event *events, int nb_events)
+void
+sctp_eNB_flush_sockets(
+                struct epoll_event *events, int nb_events)
 {
     int i;
     struct sctp_cnx_list_elm_s *sctp_cnx = NULL;
-- 
GitLab