diff --git a/openair2/F1AP/f1ap_cu_interface_management.c b/openair2/F1AP/f1ap_cu_interface_management.c index 8a6fd6311d..e697649fb5 100644 --- a/openair2/F1AP/f1ap_cu_interface_management.c +++ b/openair2/F1AP/f1ap_cu_interface_management.c @@ -39,7 +39,21 @@ int CU_handle_RESET_ACKNOWLEDGE(instance_t instance, sctp_assoc_t assoc_id, uint32_t stream, F1AP_F1AP_PDU_t *pdu) { - AssertFatal(1 == 0, "Not implemented yet\n"); + DevAssert(pdu != NULL); + + f1ap_reset_ack_t ack = {0}; + /* Decode */ + if (!decode_f1ap_reset_ack(pdu, &ack)) { + LOG_E(F1AP, "cannot decode F1AP Reset acknowledgement\n"); + free_f1ap_reset_ack(&ack); + return -1; + } + /* Send to RRC (ITTI) */ + MessageDef *message_p = itti_alloc_new_message(TASK_CU_F1, 0, F1AP_RESET_ACK); + message_p->ittiMsgHeader.originInstance = assoc_id; + F1AP_RESET_ACK(message_p) = ack; /* "move" message into ITTI, RRC thread will free it */ + itti_send_msg_to_task(TASK_RRC_GNB, GNB_MODULE_ID_TO_INSTANCE(instance), message_p); + return 0; } int CU_send_RESET_ACKNOWLEDGE(sctp_assoc_t assoc_id, const f1ap_reset_ack_t *ack) diff --git a/openair2/F1AP/f1ap_du_interface_management.c b/openair2/F1AP/f1ap_du_interface_management.c index 0d0c9c2946..7a892086b8 100644 --- a/openair2/F1AP/f1ap_du_interface_management.c +++ b/openair2/F1AP/f1ap_du_interface_management.c @@ -117,35 +117,21 @@ int DU_handle_RESET(instance_t instance, sctp_assoc_t assoc_id, uint32_t stream, int DU_send_RESET_ACKNOWLEDGE(sctp_assoc_t assoc_id, const f1ap_reset_ack_t *ack) { - F1AP_F1AP_PDU_t pdu= {0}; - uint8_t *buffer; - uint32_t len; - /* Create */ - /* 0. pdu Type */ - pdu.present = F1AP_F1AP_PDU_PR_successfulOutcome; - asn1cCalloc(pdu.choice.successfulOutcome, successMsg); - successMsg->procedureCode = F1AP_ProcedureCode_id_Reset; - successMsg->criticality = F1AP_Criticality_reject; - successMsg->value.present = F1AP_SuccessfulOutcome__value_PR_ResetAcknowledge; - F1AP_ResetAcknowledge_t *f1ResetAcknowledge = &successMsg->value.choice.ResetAcknowledge; - /* mandatory */ - /* c1. Transaction ID (integer value) */ - asn1cSequenceAdd(f1ResetAcknowledge->protocolIEs.list, F1AP_ResetAcknowledgeIEs_t, ieC1); - ieC1->id = F1AP_ProtocolIE_ID_id_TransactionID; - ieC1->criticality = F1AP_Criticality_reject; - ieC1->value.present = F1AP_ResetAcknowledgeIEs__value_PR_TransactionID; - ieC1->value.choice.TransactionID = ack->transaction_id; - - /* TODO: (Optional) partialF1Interface, criticality diagnostics */ - - /* encode */ - if (f1ap_encode_pdu(&pdu, &buffer, &len) < 0) { - LOG_E(F1AP, "Failed to encode F1ResetAcknowledge\n"); + F1AP_F1AP_PDU_t *pdu = encode_f1ap_reset_ack(ack); + if (!pdu) { + LOG_E(F1AP, "failed to create ASN.1 message for reset acknowledge\n"); return -1; } - /* send */ - ASN_STRUCT_RESET(asn_DEF_F1AP_F1AP_PDU, &pdu); + /* encode */ + uint8_t *buffer; + uint32_t len; + int encoded = f1ap_encode_pdu(pdu, &buffer, &len); + ASN_STRUCT_FREE(asn_DEF_F1AP_F1AP_PDU, pdu); + if (encoded <= 0) { + LOG_E(F1AP, "Failed to encode F1ResetAcknowledge\n"); + return -1; + } f1ap_itti_send_sctp_data_req(assoc_id, buffer, len); return 0; } diff --git a/openair2/F1AP/f1ap_du_task.c b/openair2/F1AP/f1ap_du_task.c index 0d675a76e1..c231561eec 100644 --- a/openair2/F1AP/f1ap_du_task.c +++ b/openair2/F1AP/f1ap_du_task.c @@ -35,6 +35,7 @@ #include "f1ap_du_ue_context_management.h" #include "f1ap_du_rrc_message_transfer.h" #include "lib/f1ap_rrc_message_transfer.h" +#include "lib/f1ap_interface_management.h" #include "f1ap_du_task.h" #include @@ -150,6 +151,7 @@ void *F1AP_DU_task(void *arg) { case F1AP_RESET_ACK: DU_send_RESET_ACKNOWLEDGE(assoc_id, &F1AP_RESET_ACK(msg)); + free_f1ap_reset_ack(&F1AP_RESET_ACK(msg)); break; case F1AP_GNB_CU_CONFIGURATION_UPDATE_ACKNOWLEDGE: diff --git a/openair2/LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.c b/openair2/LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.c index 124d63d293..f92559c4ee 100644 --- a/openair2/LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.c +++ b/openair2/LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.c @@ -125,12 +125,9 @@ void f1_reset_cu_initiated(const f1ap_reset_t *reset) { LOG_I(MAC, "F1 Reset initiated by CU\n"); - f1ap_reset_ack_t ack = {0}; + f1ap_reset_ack_t ack = {.transaction_id = reset->transaction_id}; if(reset->reset_type == F1AP_RESET_ALL) { du_clear_all_ue_states(); - ack = (f1ap_reset_ack_t) { - .transaction_id = reset->transaction_id - }; } else { // reset->reset_type == F1AP_RESET_PART_OF_F1_INTERFACE AssertFatal(1==0, "Not implemented yet\n"); diff --git a/openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul_direct.c b/openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul_direct.c index ad8978d514..e687991a5e 100644 --- a/openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul_direct.c +++ b/openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul_direct.c @@ -34,8 +34,10 @@ static void f1_reset_du_initiated_direct(const f1ap_reset_t *reset) static void f1_reset_acknowledge_cu_initiated_direct(const f1ap_reset_ack_t *ack) { - (void) ack; - AssertFatal(false, "%s() not implemented yet\n", __func__); + MessageDef *msg = itti_alloc_new_message(TASK_MAC_GNB, 0, F1AP_RESET_ACK); + msg->ittiMsgHeader.originInstance = -1; // means monolithic + F1AP_RESET_ACK(msg) = cp_f1ap_reset_ack(ack); + itti_send_msg_to_task(TASK_RRC_GNB, 0, msg); } static void f1_setup_request_direct(const f1ap_setup_req_t *req) diff --git a/openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul_f1ap.c b/openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul_f1ap.c index 544ab3889c..81373e0bc9 100644 --- a/openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul_f1ap.c +++ b/openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul_f1ap.c @@ -61,8 +61,7 @@ static void f1_reset_du_initiated_f1ap(const f1ap_reset_t *reset) static void f1_reset_acknowledge_cu_initiated_f1ap(const f1ap_reset_ack_t *ack) { MessageDef *msg = itti_alloc_new_message(TASK_MAC_GNB, 0, F1AP_RESET_ACK); - f1ap_reset_ack_t *f1ap_msg = &F1AP_RESET_ACK(msg); - *f1ap_msg = *ack; + F1AP_RESET_ACK(msg) = cp_f1ap_reset_ack(ack); itti_send_msg_to_task(TASK_DU_F1, 0, msg); } diff --git a/openair2/RRC/NR/rrc_gNB.c b/openair2/RRC/NR/rrc_gNB.c index fd69a4fafd..e8d65e5731 100644 --- a/openair2/RRC/NR/rrc_gNB.c +++ b/openair2/RRC/NR/rrc_gNB.c @@ -2607,6 +2607,11 @@ void *rrc_gnb_task(void *args_p) { LOG_E(NR_RRC, "Handling of F1AP_GNB_CU_CONFIGURATION_UPDATE_ACKNOWLEDGE not implemented\n"); break; + case F1AP_RESET_ACK: + LOG_I(NR_RRC, "received F1AP reset acknowledgement\n"); + free_f1ap_reset_ack(&F1AP_RESET_ACK(msg_p)); + break; + /* Messages from X2AP */ case X2AP_ENDC_SGNB_ADDITION_REQ: LOG_I(NR_RRC, "Received ENDC sgNB addition request from X2AP \n");