e2sim: add support for Resource Status Request, Response, Update
[it/test.git] / simulators / e2sim / src / E2AP / e2ap_message_handler.cpp
index d8f5e6b..39347a1 100644 (file)
@@ -46,6 +46,7 @@ void e2ap_handle_sctp_data(int &socket_fd, sctp_buffer_t &data)
 \r
         case E2AP_PDU_PR_successfulOutcome: //successfulOutcome\r
           LOG_I("[E2AP] Received X2-SETUP-RESPONSE");\r
+          e2ap_handle_X2SetupResponse(pdu, socket_fd);\r
           break;\r
 \r
         case E2AP_PDU_PR_unsuccessfulOutcome:\r
@@ -138,6 +139,43 @@ void e2ap_handle_sctp_data(int &socket_fd, sctp_buffer_t &data)
       }\r
       break;\r
 \r
+    case ProcedureCode_id_resourceStatusReportingInitiation: //9\r
+      switch(index)\r
+      {\r
+        case E2AP_PDU_PR_initiatingMessage: //initiatingMessage\r
+          LOG_I("[E2AP] Received RESOURCE-STATUS-REQUEST");\r
+          e2ap_handle_ResourceStatusRequest(pdu, socket_fd);\r
+          break;\r
+\r
+        case E2AP_PDU_PR_successfulOutcome: //successfulOutcome\r
+          LOG_I("[E2AP] Received RESOURCE-STATUS-RESPONSE");\r
+          break;\r
+\r
+        case E2AP_PDU_PR_unsuccessfulOutcome:\r
+          LOG_I("[E2AP] Received RESOURCE-STATUS-FAILURE");\r
+          break;\r
+\r
+        default:\r
+          LOG_E("[E2AP] Invalid message index=%d in E2AP-PDU %d", index,\r
+                    (int)ProcedureCode_id_resourceStatusReportingInitiation);\r
+          break;\r
+      }\r
+      break;\r
+\r
+    case ProcedureCode_id_resourceStatusReporting: // 10\r
+      switch(index)\r
+      {\r
+        case E2AP_PDU_PR_initiatingMessage: //initiatingMessage\r
+          LOG_I("[E2AP] Received RESOURCE-STATUS-UPDATE");\r
+          break;\r
+\r
+        default:\r
+          LOG_E("[E2AP] Unable to process message index=%d in E2AP-PDU %d", index,\r
+                    (int)ProcedureCode_id_resourceStatusReporting);\r
+          break;\r
+      }\r
+      break;\r
+\r
     default:\r
       LOG_E("[E2AP] No available handler for procedureCode=%d", procedureCode);\r
       break;\r
@@ -160,7 +198,7 @@ void e2ap_handle_X2SetupRequest(E2AP_PDU_t* pdu, int &socket_fd)
   sctp_buffer_t data;\r
 \r
   data.len = e2ap_asn1c_encode_pdu(res_pdu, &buf);\r
-  memcpy(data.buffer, buf, data.len);\r
+  memcpy(data.buffer, buf, min(data.len, MAX_SCTP_BUFFER));\r
 \r
   //send response data over sctp\r
   if(sctp_send_data(socket_fd, data) > 0) {\r
@@ -170,6 +208,30 @@ void e2ap_handle_X2SetupRequest(E2AP_PDU_t* pdu, int &socket_fd)
   }\r
 }\r
 \r
+void e2ap_handle_X2SetupResponse(E2AP_PDU_t* pdu, int &socket_fd)\r
+{\r
+  E2AP_PDU_t* req_pdu = e2ap_xml_to_pdu("E2AP_ResourceStatusRequest.xml");\r
+  // E2AP_PDU_t* req_pdu = e2ap_xml_to_pdu("E2AP_ResourceStatusRequest_bad.xml");\r
+\r
+  LOG_D("[E2AP] Created RESOURCE-STATUS-REQUEST");\r
+\r
+  e2ap_asn1c_print_pdu(req_pdu);\r
+\r
+  uint8_t       *buf;\r
+  sctp_buffer_t data;\r
+\r
+  data.len = e2ap_asn1c_encode_pdu(req_pdu, &buf);\r
+  memcpy(data.buffer, buf, min(data.len, MAX_SCTP_BUFFER));\r
+\r
+  //send response data over sctp\r
+  if(sctp_send_data(socket_fd, data) > 0) {\r
+    LOG_I("[SCTP] Sent RESOURCE-STATUS-REQUEST");\r
+  } else {\r
+    LOG_E("[SCTP] Unable to send RESOURCE-STATUS-REQUEST to peer");\r
+  }\r
+\r
+}\r
+\r
 /*\r
 Simply send back ENDCX2SetupResponse\r
 Todo: add more handling options (failure, duplicated request, etc.)\r
@@ -186,7 +248,7 @@ void e2ap_handle_ENDCX2SetupRequest(E2AP_PDU_t* pdu, int &socket_fd)
   sctp_buffer_t data;\r
 \r
   data.len = e2ap_asn1c_encode_pdu(res_pdu, &buf);\r
-  memcpy(data.buffer, buf, data.len);\r
+  memcpy(data.buffer, buf, min(data.len, MAX_SCTP_BUFFER));\r
 \r
   //send response data over sctp\r
   if(sctp_send_data(socket_fd, data) > 0) {\r
@@ -212,7 +274,7 @@ void e2ap_handle_RICSubscriptionRequest(E2AP_PDU_t* pdu, int &socket_fd)
   sctp_buffer_t data;\r
 \r
   data.len = e2ap_asn1c_encode_pdu(res_pdu, &buf);\r
-  memcpy(data.buffer, buf, data.len);\r
+  memcpy(data.buffer, buf, min(data.len, MAX_SCTP_BUFFER));\r
 \r
   //send response data over sctp\r
   if(sctp_send_data(socket_fd, data) > 0) {\r
@@ -234,7 +296,7 @@ void e2ap_handle_RICSubscriptionRequest_securityDemo(E2AP_PDU_t* pdu, int &socke
   sctp_buffer_t data;\r
 \r
   data.len = e2ap_asn1c_encode_pdu(res_pdu, &buf);\r
-  memcpy(data.buffer, buf, data.len);\r
+  memcpy(data.buffer, buf, min(data.len, MAX_SCTP_BUFFER));\r
 \r
   //send response data over sctp\r
   if(sctp_send_data(socket_fd, data) > 0) {\r
@@ -252,10 +314,10 @@ void e2ap_handle_RICSubscriptionRequest_securityDemo(E2AP_PDU_t* pdu, int &socke
   uint8_t *buf1, *buf2;\r
   sctp_buffer_t data1, data2;\r
   data1.len = e2ap_asn1c_encode_pdu(indication_type1, &buf1);\r
-  memcpy(data1.buffer, buf1, data1.len);\r
+  memcpy(data1.buffer, buf1, min(data1.len, MAX_SCTP_BUFFER));\r
 \r
   data2.len = e2ap_asn1c_encode_pdu(indication_type2, &buf2);\r
-  memcpy(data2.buffer, buf2, data2.len);\r
+  memcpy(data2.buffer, buf2, min(data2.len, MAX_SCTP_BUFFER));\r
 \r
   while(1){\r
     sleep(1);\r
@@ -279,76 +341,48 @@ void e2ap_handle_RICSubscriptionRequest_securityDemo(E2AP_PDU_t* pdu, int &socke
 \r
 }\r
 \r
-// void e2ap_handle_RICSubscriptionRequest_old(e2ap_pdu_t* pdu, int &socket_fd)\r
-// {\r
-//   RICsubscription_params_t params;\r
-//   e2ap_parse_RICsubscriptionRequest(pdu, params);\r
-//\r
-//   /* Example handling logic\r
-//   - Accept if request id is even-numbered -> send back response\r
-//     in this case, accept every other actions\r
-//\r
-//   - Reject if request id is odd-numbered -> send back failure\r
-//   */\r
-//\r
-//   e2ap_pdu_t* res_pdu = new_e2ap_pdu();\r
-//   bool is_failure = false;\r
-//\r
-//   if(params.request_id % 2 == 0)\r
-//   {\r
-//     for(size_t i = 0; i < params.actionList.size(); i++)\r
-//     {\r
-//       if(i%2 == 0){\r
-//         params.actionList[i].isAdmitted = true;\r
-//       } else {\r
-//         params.actionList[i].isAdmitted = false;\r
-//         params.actionList[i].notAdmitted_cause = RICcause_radioNetwork;\r
-//         params.actionList[i].notAdmitted_subCause = 5;\r
-//       }\r
-//     }\r
-//\r
-//     e2ap_create_RICsubscriptionResponse(res_pdu, params);\r
-//     LOG_I("[E2AP] Created RIC-SUBSCRIPTION-RESPONSE");\r
-//   }\r
-//   else\r
-//   {\r
-//     is_failure = true;\r
-//\r
-//     for(size_t i = 0; i < params.actionList.size(); i++)\r
-//     {\r
-//       params.actionList[i].isAdmitted = false;\r
-//       params.actionList[i].notAdmitted_cause = RICcause_radioNetwork;\r
-//       params.actionList[i].notAdmitted_subCause = 5;\r
-//     }\r
-//\r
-//     e2ap_create_RICsubscriptionFailure(res_pdu, params);\r
-//     LOG_I("[E2AP] Created RIC-SUBSCRIPTION-FAILURE");\r
-//   }\r
-//\r
-//   e2ap_print_pdu(res_pdu);\r
-//\r
-//   //Encode into buffer\r
-//   sctp_buffer_t data;\r
-//   e2ap_encode_pdu(res_pdu, data.buffer, sizeof(data.buffer), data.len);\r
-//\r
-//   //send response data over sctp\r
-//   if(sctp_send_data(socket_fd, data) > 0)\r
-//   {\r
-//     if(is_failure) {\r
-//       LOG_I("[SCTP] Sent RIC-SUBSCRIPTION-FAILURE");\r
-//     }\r
-//     else {\r
-//       LOG_I("[SCTP] Sent RIC-SUBSCRIPTION-RESPONSE");\r
-//     }\r
-//   }\r
-//   else\r
-//   {\r
-//     if(is_failure) {\r
-//       LOG_I("[SCTP] Unable to send RIC-SUBSCRIPTION-FAILURE");\r
-//     }\r
-//     else {\r
-//       LOG_E("[SCTP] Unable to send RIC-SUBSCRIPTION-RESPONSE");\r
-//     }\r
-//   }\r
-//\r
-// }\r
+void e2ap_handle_ResourceStatusRequest(E2AP_PDU_t* pdu, int &socket_fd)\r
+{\r
+  //send back ResourceStatusResponse, followed by resource status update\r
+  E2AP_PDU_t* res_pdu = e2ap_xml_to_pdu("E2AP_ResourceStatusResponse.xml");\r
+\r
+  LOG_D("[E2AP] Created RESOURCE-STATUS-RESPONSE");\r
+\r
+  e2ap_asn1c_print_pdu(res_pdu);\r
+\r
+  uint8_t       *buf;\r
+  sctp_buffer_t data;\r
+\r
+  data.len = e2ap_asn1c_encode_pdu(res_pdu, &buf);\r
+  memcpy(data.buffer, buf, min(data.len, MAX_SCTP_BUFFER));\r
+\r
+  //send response data over sctp\r
+  if(sctp_send_data(socket_fd, data) > 0) {\r
+    LOG_I("[SCTP] Sent RESOURCE-STATUS-RESPONSE");\r
+  } else {\r
+    LOG_E("[SCTP] Unable to send RESOURCE-STATUS-RESPONSE to peer");\r
+  }\r
+\r
+\r
+  //send ResourceStatusUpdate periodically\r
+  E2AP_PDU_t* update_pdu = e2ap_xml_to_pdu("E2AP_ResourceStatusUpdate.xml");\r
+\r
+  uint8_t       *update_buf;\r
+  sctp_buffer_t update_data;\r
+\r
+  update_data.len = e2ap_asn1c_encode_pdu(update_pdu, &update_buf);\r
+  memcpy(update_data.buffer, update_buf, min(update_data.len, MAX_SCTP_BUFFER));\r
+\r
+  while(1) {\r
+    // e2ap_asn1c_print_pdu(update_pdu);\r
+\r
+    if(sctp_send_data(socket_fd, update_data) > 0) {\r
+      LOG_I("[SCTP] Sent RESOURCE-STATUS-UPDATE");\r
+    } else {\r
+      LOG_E("[SCTP] Unable to send RESOURCE-STATUS-UPDATE to peer");\r
+    }\r
+\r
+    sleep(1);\r
+\r
+  }\r
+}\r