Implementation for supporting Service Update
[sim/e2-interface.git] / e2sim / previous / e2apv1sim / e2sim / src / E2APr / e2ap_message_handler.cpp
index d3778c0..0bd6479 100644 (file)
@@ -1,9 +1,8 @@
-\r
-\r
 /*****************************************************************************\r
 #                                                                            *\r
 # Copyright 2019 AT&T Intellectual Property                                  *\r
 # Copyright 2019 Nokia                                                       *\r
+# Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved.      *\r
 #                                                                            *\r
 # Licensed under the Apache License, Version 2.0 (the "License");            *\r
 # you may not use this file except in compliance with the License.           *\r
@@ -38,27 +37,27 @@ void e2ap_handle_sctp_data(int &socket_fd, sctp_buffer_t &data, bool xmlenc)
   fprintf(stderr, "decoding...\n");\r
 \r
   asn_transfer_syntax syntax;\r
-  \r
+\r
 \r
   syntax = ATS_ALIGNED_BASIC_PER;\r
-  \r
+\r
 \r
   fprintf(stderr, "full buffer\n%s\n", data.buffer);\r
   //  e2ap_asn1c_decode_pdu(pdu, data.buffer, data.len);\r
 \r
   auto rval = asn_decode(nullptr, syntax, &asn_DEF_E2AP_PDU, (void **) &pdu,\r
                    data.buffer, data.len);\r
-  \r
+\r
 \r
   int index = (int)pdu->present;\r
   fprintf(stderr, "length of data %d\n", rval.consumed);\r
   fprintf(stderr, "result %d\n", rval.code);\r
   fprintf(stderr, "index is %d\n", index);\r
-  \r
-  fprintf(stderr, "showing xer of data\n");  \r
-  \r
+\r
+  fprintf(stderr, "showing xer of data\n");\r
+\r
   xer_fprint(stderr, &asn_DEF_E2AP_PDU, pdu);\r
-  \r
+\r
   int procedureCode = e2ap_asn1c_get_procedureCode(pdu);\r
   index = (int)pdu->present;\r
 \r
@@ -67,7 +66,7 @@ void e2ap_handle_sctp_data(int &socket_fd, sctp_buffer_t &data, bool xmlenc)
 \r
   switch(procedureCode)\r
     {\r
-      \r
+\r
     case ProcedureCode_id_E2setup:\r
       switch(index)\r
        {\r
@@ -75,40 +74,40 @@ void e2ap_handle_sctp_data(int &socket_fd, sctp_buffer_t &data, bool xmlenc)
          e2ap_handle_E2SetupRequest(pdu, socket_fd);\r
           LOG_I("[E2AP] Received SETUP-REQUEST");\r
           break;\r
-         \r
+\r
         case E2AP_PDU_PR_successfulOutcome:\r
           LOG_I("[E2AP] Received SETUP-RESPONSE-SUCCESS");\r
           break;\r
-         \r
+\r
         case E2AP_PDU_PR_unsuccessfulOutcome:\r
           LOG_I("[E2AP] Received SETUP-RESPONSE-FAILURE");\r
           break;\r
-         \r
+\r
         default:\r
           LOG_E("[E2AP] Invalid message index=%d in E2AP-PDU", index);\r
           break;\r
        }\r
-      break;    \r
-      \r
+      break;\r
+\r
     case ProcedureCode_id_Reset: //reset = 7\r
       switch(index)\r
        {\r
         case E2AP_PDU_PR_initiatingMessage:\r
           LOG_I("[E2AP] Received RESET-REQUEST");\r
           break;\r
-         \r
+\r
         case E2AP_PDU_PR_successfulOutcome:\r
           break;\r
-         \r
+\r
         case E2AP_PDU_PR_unsuccessfulOutcome:\r
           break;\r
-         \r
+\r
         default:\r
           LOG_E("[E2AP] Invalid message index=%d in E2AP-PDU", index);\r
           break;\r
        }\r
       break;\r
-      \r
+\r
     case ProcedureCode_id_RICindication: // 205\r
       switch(index)\r
        {\r
@@ -119,33 +118,103 @@ void e2ap_handle_sctp_data(int &socket_fd, sctp_buffer_t &data, bool xmlenc)
         case E2AP_PDU_PR_successfulOutcome:\r
           LOG_I("[E2AP] Received RIC-INDICATION-RESPONSE");\r
           break;\r
-         \r
+\r
         case E2AP_PDU_PR_unsuccessfulOutcome:\r
           LOG_I("[E2AP] Received RIC-INDICATION-FAILURE");\r
           break;\r
-         \r
+\r
         default:\r
           LOG_E("[E2AP] Invalid message index=%d in E2AP-PDU %d", index,\r
                                     (int)ProcedureCode_id_RICindication);\r
           break;\r
        }\r
       break;\r
-      \r
+\r
+      case ProcedureCode_id_RICserviceQuery:\r
+        switch (index)\r
+          {\r
+            case E2AP_PDU_PR_initiatingMessage:\r
+            LOG_I("[E2AP] Received RIC-Service-Query")\r
+            e2ap_handle_E2SeviceUpdate(pdu, socket_fd);\r
+            break;\r
+\r
+            default:\r
+              LOG_E("[E2AP] Invalid message index=%d in E2AP-PDU %d", index,\r
+                                      (int)ProcedureCode_id_RICserviceQuery);\r
+            break;\r
+          }\r
+        break;\r
+\r
+      case ProcedureCode_id_RICserviceUpdate:\r
+        switch (index)\r
+          {\r
+            case E2AP_PDU_PR_successfulOutcome:\r
+            LOG_I("[E2AP] Received RIC-SERVICE-UPDATE-SUCCESS")\r
+            break;\r
+\r
+            case E2AP_PDU_PR_unsuccessfulOutcome:\r
+            LOG_I("[E2AP] Received RIC-SERVICE-UPDATE-FAILURE")\r
+            break;\r
+\r
+            default:\r
+              LOG_E("[E2AP] Invalid message index=%d in E2AP-PDU %d", index,\r
+                                      (int)ProcedureCode_id_RICserviceUpdate);\r
+            break;\r
+          }\r
+        break;\r
+\r
     default:\r
-      \r
+\r
       LOG_E("[E2AP] No available handler for procedureCode=%d", procedureCode);\r
 \r
       break;\r
     }\r
 }\r
 \r
+void e2ap_handle_E2SeviceUpdate(E2AP_PDU_t* pdu, int &socket_fd) {\r
+\r
+auto buffer_size = MAX_SCTP_BUFFER;\r
+  unsigned char buffer[MAX_SCTP_BUFFER];\r
+  E2AP_PDU_t* pdu = (E2AP_PDU_t*)calloc(1,sizeof(E2AP_PDU));\r
+  generate_e2apv1_service_update(pdu);\r
+\r
+  printf("After generating e2setup req\n");\r
+\r
+  xer_fprint(stderr, &asn_DEF_E2AP_PDU, pdu);\r
+\r
+  printf("After XER Encoding\n");\r
+\r
+  sctp_buffer_t data;\r
+\r
+  char *error_buf = (char*)calloc(300, sizeof(char));\r
+  size_t errlen;\r
+\r
+  asn_check_constraints(&asn_DEF_E2AP_PDU, pdu, error_buf, &errlen);\r
+  printf("error length %d\n", errlen);\r
+  printf("error buf %s\n", error_buf);\r
+\r
+  auto er = asn_encode_to_buffer(nullptr, ATS_ALIGNED_BASIC_PER, &asn_DEF_E2AP_PDU, pdu, buffer, buffer_size);\r
+  //auto er = asn_encode_to_buffer(nullptr, ATS_BASIC_XER, &asn_DEF_E2AP_PDU, pdu_setup, buffer, buffer_size);\r
+  data.len = er.encoded;\r
+  fprintf(stderr, "er encoded is %d\n", er.encoded);\r
+\r
+  memcpy(data.buffer, buffer, er.encoded);\r
+\r
+  //send response data over sctp\r
+  if(sctp_send_data(socket_fd, data) > 0) {\r
+    LOG_I("[SCTP] Sent E2-SERVICE-UPDATE");\r
+  } else {\r
+    LOG_E("[SCTP] Unable to send E2-SERVICE-UPDATE to peer");\r
+  }\r
+}\r
+\r
 void e2ap_handle_E2SetupRequest(E2AP_PDU_t* pdu, int &socket_fd) {\r
 \r
-  \r
+\r
   E2AP_PDU_t* res_pdu = (E2AP_PDU_t*)calloc(1, sizeof(E2AP_PDU));\r
   generate_e2apv1_setup_response(res_pdu);\r
 \r
-  \r
+\r
   LOG_D("[E2AP] Created E2-SETUP-RESPONSE");\r
 \r
   e2ap_asn1c_print_pdu(res_pdu);\r
@@ -153,13 +222,13 @@ void e2ap_handle_E2SetupRequest(E2AP_PDU_t* pdu, int &socket_fd) {
 \r
   auto buffer_size = MAX_SCTP_BUFFER;\r
   unsigned char buffer[MAX_SCTP_BUFFER];\r
-  \r
+\r
   sctp_buffer_t data;\r
   auto er = asn_encode_to_buffer(nullptr, ATS_BASIC_XER, &asn_DEF_E2AP_PDU, res_pdu, buffer, buffer_size);\r
 \r
   data.len = er.encoded;\r
-  fprintf(stderr, "er encoded is %d\n", er.encoded);  \r
-  \r
+  fprintf(stderr, "er encoded is %d\n", er.encoded);\r
+\r
   //data.len = e2ap_asn1c_encode_pdu(res_pdu, &buf);\r
   memcpy(data.buffer, buffer, er.encoded);\r
 \r
@@ -182,21 +251,21 @@ void e2ap_handle_E2SetupRequest(E2AP_PDU_t* pdu, int &socket_fd) {
 \r
   auto buffer_size2 = MAX_SCTP_BUFFER;\r
   unsigned char buffer2[MAX_SCTP_BUFFER];\r
-  \r
+\r
   sctp_buffer_t data2;\r
 \r
   auto er2 = asn_encode_to_buffer(nullptr, ATS_ALIGNED_BASIC_PER, &asn_DEF_E2AP_PDU, pdu_sub, buffer2, buffer_size2);\r
-  \r
+\r
   data2.len = er2.encoded;\r
   memcpy(data2.buffer, buffer2, er2.encoded);\r
-  \r
+\r
   fprintf(stderr, "er encded is %d\n", er2.encoded);\r
 \r
   if(sctp_send_data(socket_fd, data2) > 0) {\r
     LOG_I("[SCTP] Sent E2-SUBSCRIPTION-REQUEST");\r
   } else {\r
     LOG_E("[SCTP] Unable to send E2-SUBSCRIPTION-REQUEST to peer");\r
-  }  \r
+  }\r
 \r
 \r
 }\r
@@ -217,7 +286,7 @@ void e2ap_handle_RICSubscriptionRequest(E2AP_PDU_t* pdu, int &socket_fd)
 \r
   auto buffer_size2 = MAX_SCTP_BUFFER;\r
   unsigned char buffer2[MAX_SCTP_BUFFER];\r
-  \r
+\r
   sctp_buffer_t data2;\r
 \r
   auto er2 = asn_encode_to_buffer(nullptr, ATS_ALIGNED_BASIC_PER, &asn_DEF_E2AP_PDU, pdu_resp, buffer2, buffer_size2);\r
@@ -232,8 +301,8 @@ void e2ap_handle_RICSubscriptionRequest(E2AP_PDU_t* pdu, int &socket_fd)
   } else {\r
     LOG_E("[SCTP] Unable to send RIC-SUBSCRIPTION-RESPONSE to peer");\r
   }\r
-  \r
-  \r
+\r
+\r
   //Send back an Indication\r
 \r
   E2AP_PDU_t* pdu_ind = (E2AP_PDU_t*)calloc(1,sizeof(E2AP_PDU));\r
@@ -244,7 +313,7 @@ void e2ap_handle_RICSubscriptionRequest(E2AP_PDU_t* pdu, int &socket_fd)
 \r
   auto buffer_size = MAX_SCTP_BUFFER;\r
   unsigned char buffer[MAX_SCTP_BUFFER];\r
-  \r
+\r
   sctp_buffer_t data;\r
 \r
   auto er = asn_encode_to_buffer(nullptr, ATS_ALIGNED_BASIC_PER, &asn_DEF_E2AP_PDU, pdu_ind, buffer, buffer_size);\r
@@ -258,10 +327,6 @@ void e2ap_handle_RICSubscriptionRequest(E2AP_PDU_t* pdu, int &socket_fd)
     LOG_I("[SCTP] Sent RIC-INDICATION-REQUEST");\r
   } else {\r
     LOG_E("[SCTP] Unable to send RIC-INDICATION-REQUEST to peer");\r
-  }  \r
+  }\r
 \r
 }\r
-\r
-\r
-\r
-\r