\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
}\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
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
}\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
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
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
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
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
\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