From 84d8f6c272c77094dcfef8a044599a4cdb0bcfd6 Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Tue, 18 Jul 2023 17:19:07 +0200 Subject: [PATCH] Add stubs for F1 Setup Request/Response/Failure messages --- openair2/F1AP/f1ap_du_interface_management.c | 71 ++++++++----------- .../LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.c | 11 +++ .../LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.h | 3 + openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul.h | 2 + .../LAYER2/NR_MAC_gNB/mac_rrc_ul_direct.c | 6 ++ openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul_f1ap.c | 6 ++ openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h | 1 + openair2/RRC/NR/mac_rrc_dl.h | 3 + openair2/RRC/NR/mac_rrc_dl_direct.c | 2 + openair2/RRC/NR/mac_rrc_dl_f1ap.c | 12 ++++ openair2/RRC/NR/nr_rrc_defs.h | 2 + 11 files changed, 78 insertions(+), 41 deletions(-) diff --git a/openair2/F1AP/f1ap_du_interface_management.c b/openair2/F1AP/f1ap_du_interface_management.c index 5dfe19119f..5cb3ab4b83 100644 --- a/openair2/F1AP/f1ap_du_interface_management.c +++ b/openair2/F1AP/f1ap_du_interface_management.c @@ -34,6 +34,7 @@ #include "f1ap_encoder.h" #include "f1ap_itti_messaging.h" #include "f1ap_du_interface_management.h" +#include "openair2/LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.h" #include "assertions.h" #include "GNB_APP/gnb_paramdef.h" @@ -309,10 +310,8 @@ int DU_send_F1_SETUP_REQUEST(instance_t instance, f1ap_setup_req_t *setup_req) return 0; } -int DU_handle_F1_SETUP_RESPONSE(instance_t instance, - uint32_t assoc_id, - uint32_t stream, - F1AP_F1AP_PDU_t *pdu) { +int DU_handle_F1_SETUP_RESPONSE(instance_t instance, uint32_t assoc_id, uint32_t stream, F1AP_F1AP_PDU_t *pdu) +{ LOG_D(F1AP, "DU_handle_F1_SETUP_RESPONSE\n"); AssertFatal(pdu->present == F1AP_F1AP_PDU_PR_successfulOutcome, "pdu->present != F1AP_F1AP_PDU_PR_successfulOutcome\n"); @@ -327,9 +326,7 @@ int DU_handle_F1_SETUP_RESPONSE(instance_t instance, int TransactionId = -1; int num_cells_to_activate = 0; F1AP_Cells_to_be_Activated_List_Item_t *cell; - MessageDef *msg_p = itti_alloc_new_message (TASK_DU_F1, 0, F1AP_SETUP_RESP); - LOG_D(F1AP, "F1AP: F1Setup-Resp: protocolIEs.list.count %d\n", - in->protocolIEs.list.count); + f1ap_setup_resp_t resp = {0}; for (int i=0; i < in->protocolIEs.list.count; i++) { ie = in->protocolIEs.list.array[i]; @@ -350,11 +347,10 @@ int DU_handle_F1_SETUP_RESPONSE(instance_t instance, "ie->criticality != F1AP_Criticality_ignore\n"); AssertFatal(ie->value.present == F1AP_F1SetupResponseIEs__value_PR_GNB_CU_Name, "ie->value.present != F1AP_F1SetupResponseIEs__value_PR_TransactionID\n"); - F1AP_SETUP_RESP (msg_p).gNB_CU_name = malloc(ie->value.choice.GNB_CU_Name.size+1); - memcpy(F1AP_SETUP_RESP (msg_p).gNB_CU_name,ie->value.choice.GNB_CU_Name.buf,ie->value.choice.GNB_CU_Name.size); - F1AP_SETUP_RESP (msg_p).gNB_CU_name[ie->value.choice.GNB_CU_Name.size]='\0'; - LOG_D(F1AP, "F1AP: F1Setup-Resp: gNB_CU_name %s\n", - F1AP_SETUP_RESP (msg_p).gNB_CU_name); + resp.gNB_CU_name = malloc(ie->value.choice.GNB_CU_Name.size+1); + memcpy(resp.gNB_CU_name, ie->value.choice.GNB_CU_Name.buf, ie->value.choice.GNB_CU_Name.size); + resp.gNB_CU_name[ie->value.choice.GNB_CU_Name.size] = '\0'; + LOG_D(F1AP, "F1AP: F1Setup-Resp: gNB_CU_name %s\n", resp.gNB_CU_name); break; case F1AP_ProtocolIE_ID_id_GNB_CU_RRC_Version: @@ -379,17 +375,16 @@ int DU_handle_F1_SETUP_RESPONSE(instance_t instance, "cells_to_be_activated_list_item_ies->value.present == F1AP_Cells_to_be_Activated_List_ItemIEs__value_PR_Cells_to_be_Activated_List_Item"); cell = &cells_to_be_activated_list_item_ies->value.choice.Cells_to_be_Activated_List_Item; TBCD_TO_MCC_MNC(&cell->nRCGI.pLMN_Identity, - F1AP_SETUP_RESP(msg_p).cells_to_activate[i].plmn.mcc, - F1AP_SETUP_RESP(msg_p).cells_to_activate[i].plmn.mnc, - F1AP_SETUP_RESP(msg_p).cells_to_activate[i].plmn.mnc_digit_length); + resp.cells_to_activate[i].plmn.mcc, + resp.cells_to_activate[i].plmn.mnc, + resp.cells_to_activate[i].plmn.mnc_digit_length); LOG_D(F1AP, "nr_cellId : %x %x %x %x %x\n", cell->nRCGI.nRCellIdentity.buf[0], cell->nRCGI.nRCellIdentity.buf[1], cell->nRCGI.nRCellIdentity.buf[2], cell->nRCGI.nRCellIdentity.buf[3], cell->nRCGI.nRCellIdentity.buf[4]); - BIT_STRING_TO_NR_CELL_IDENTITY(&cell->nRCGI.nRCellIdentity, - F1AP_SETUP_RESP (msg_p).cells_to_activate[i].nr_cellid); + BIT_STRING_TO_NR_CELL_IDENTITY(&cell->nRCGI.nRCellIdentity, resp.cells_to_activate[i].nr_cellid); F1AP_ProtocolExtensionContainer_10696P112_t *ext = (F1AP_ProtocolExtensionContainer_10696P112_t *)cell->iE_Extensions; if (ext==NULL) @@ -408,28 +403,26 @@ int DU_handle_F1_SETUP_RESPONSE(instance_t instance, case F1AP_Cells_to_be_Activated_List_ItemExtIEs__extensionValue_PR_AvailableSNPN_ID_List */ case F1AP_ProtocolIE_ID_id_gNB_CUSystemInformation: { - F1AP_SETUP_RESP (msg_p).cells_to_activate[i].nrpci = (cell->nRPCI != NULL) ? *cell->nRPCI : 0; + resp.cells_to_activate[i].nrpci = (cell->nRPCI != NULL) ? *cell->nRPCI : 0; F1AP_GNB_CUSystemInformation_t *gNB_CUSystemInformation = (F1AP_GNB_CUSystemInformation_t *)&cells_to_be_activated_list_itemExtIEs->extensionValue.choice.GNB_CUSystemInformation; - F1AP_SETUP_RESP (msg_p).cells_to_activate[i].num_SI = gNB_CUSystemInformation->sibtypetobeupdatedlist.list.count; + resp.cells_to_activate[i].num_SI = gNB_CUSystemInformation->sibtypetobeupdatedlist.list.count; AssertFatal(ext->list.count==1,"At least one SI message should be there, and only 1 for now!\n"); LOG_D(F1AP, "F1AP: Cell %d MCC %d MNC %d NRCellid %lx num_si %d\n", i, - F1AP_SETUP_RESP(msg_p).cells_to_activate[i].plmn.mcc, - F1AP_SETUP_RESP(msg_p).cells_to_activate[i].plmn.mnc, - F1AP_SETUP_RESP(msg_p).cells_to_activate[i].nr_cellid, - F1AP_SETUP_RESP(msg_p).cells_to_activate[i].num_SI); + resp.cells_to_activate[i].plmn.mcc, + resp.cells_to_activate[i].plmn.mnc, + resp.cells_to_activate[i].nr_cellid, + resp.cells_to_activate[i].num_SI); for (int si = 0; si < gNB_CUSystemInformation->sibtypetobeupdatedlist.list.count; si++) { F1AP_SibtypetobeupdatedListItem_t *sib_item = gNB_CUSystemInformation->sibtypetobeupdatedlist.list.array[si]; size_t size = sib_item->sIBmessage.size; - F1AP_SETUP_RESP (msg_p).cells_to_activate[i].SI_container_length[si] = size; + resp.cells_to_activate[i].SI_container_length[si] = size; LOG_D(F1AP, "F1AP: SI_container_length[%d][%ld] %ld bytes\n", i, sib_item->sIBtype, size); - F1AP_SETUP_RESP (msg_p).cells_to_activate[i].SI_container[si] = malloc(F1AP_SETUP_RESP (msg_p).cells_to_activate[i].SI_container_length[si]); - memcpy((void *)F1AP_SETUP_RESP (msg_p).cells_to_activate[i].SI_container[si], - (void *)sib_item->sIBmessage.buf, - size); - F1AP_SETUP_RESP (msg_p).cells_to_activate[i].SI_type[si]=sib_item->sIBtype; + resp.cells_to_activate[i].SI_container[si] = malloc(resp.cells_to_activate[i].SI_container_length[si]); + memcpy(resp.cells_to_activate[i].SI_container[si], sib_item->sIBmessage.buf, size); + resp.cells_to_activate[i].SI_type[si]=sib_item->sIBtype; } break; @@ -469,30 +462,26 @@ int DU_handle_F1_SETUP_RESPONSE(instance_t instance, AssertFatal(TransactionId!=-1,"TransactionId was not sent\n"); LOG_D(F1AP,"F1AP: num_cells_to_activate %d\n",num_cells_to_activate); - F1AP_SETUP_RESP (msg_p).num_cells_to_activate = num_cells_to_activate; + resp.num_cells_to_activate = num_cells_to_activate; // tmp - // F1AP_SETUP_RESP (msg_p).num_SI[0] = 1; for (int i=0; i 0, "System Information %d is missing",i); + AssertFatal(resp.cells_to_activate[i].num_SI > 0, "System Information %d is missing", i); LOG_D(F1AP, "Sending F1AP_SETUP_RESP ITTI message\n"); - itti_send_msg_to_task(TASK_GNB_APP, GNB_MODULE_ID_TO_INSTANCE(assoc_id), msg_p); + f1_setup_response(&resp); return 0; } // SETUP FAILURE -int DU_handle_F1_SETUP_FAILURE(instance_t instance, - uint32_t assoc_id, - uint32_t stream, - F1AP_F1AP_PDU_t *pdu) { - LOG_E(F1AP, "DU_handle_F1_SETUP_FAILURE\n"); +int DU_handle_F1_SETUP_FAILURE(instance_t instance, uint32_t assoc_id, uint32_t stream, F1AP_F1AP_PDU_t *pdu) +{ F1AP_F1SetupFailure_t *out; F1AP_F1SetupFailureIEs_t *ie; + f1ap_setup_failure_t fail = {0}; out = &pdu->choice.unsuccessfulOutcome->value.choice.F1SetupFailure; /* Transaction ID */ - F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_F1SetupFailureIEs_t, ie, out, - F1AP_ProtocolIE_ID_id_TransactionID, true); + F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_F1SetupFailureIEs_t, ie, out, F1AP_ProtocolIE_ID_id_TransactionID, true); /* Cause */ F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_F1SetupFailureIEs_t, ie, out, F1AP_ProtocolIE_ID_id_Cause, true); @@ -503,10 +492,10 @@ int DU_handle_F1_SETUP_FAILURE(instance_t instance, F1AP_ProtocolIE_ID_id_TimeToWait, true); } + f1_setup_failure(&fail); return 0; } - /* gNB-DU Configuration Update */ 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 e78b66fded..ae88609d5a 100644 --- a/openair2/LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.c +++ b/openair2/LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.c @@ -30,6 +30,17 @@ #include "uper_decoder.h" #include "uper_encoder.h" +void f1_setup_response(const f1ap_setup_resp_t *resp) +{ + AssertFatal(false, "not implemented\n"); +} + +void f1_setup_failure(const f1ap_setup_failure_t *failure) +{ + LOG_E(MAC, "the CU reported F1AP Setup Failure, is there a configuration mismatch?\n"); + exit(1); +} + static NR_RLC_BearerConfig_t *get_bearerconfig_from_srb(const f1ap_srb_to_be_setup_t *srb) { long priority = srb->srb_id; // high priority for SRB diff --git a/openair2/LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.h b/openair2/LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.h index ebe6ba5adc..32759b304f 100644 --- a/openair2/LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.h +++ b/openair2/LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.h @@ -25,6 +25,9 @@ #include "platform_types.h" #include "f1ap_messages_types.h" +void f1_setup_response(const f1ap_setup_resp_t *resp); +void f1_setup_failure(const f1ap_setup_failure_t *failure); + void ue_context_setup_request(const f1ap_ue_context_setup_t *req); void ue_context_modification_request(const f1ap_ue_context_modif_req_t *req); void ue_context_modification_confirm(const f1ap_ue_context_modif_confirm_t *confirm); diff --git a/openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul.h b/openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul.h index 43a4818e93..b90e490302 100644 --- a/openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul.h +++ b/openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul.h @@ -25,6 +25,8 @@ #include "platform_types.h" #include "f1ap_messages_types.h" +typedef void (*f1_setup_request_func_t)(const f1ap_setup_req_t* req); + typedef void (*ue_context_setup_response_func_t)(const f1ap_ue_context_setup_t* req, const f1ap_ue_context_setup_t *resp); typedef void (*ue_context_modification_response_func_t)(const f1ap_ue_context_modif_req_t *req, const f1ap_ue_context_modif_resp_t *resp); 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 299c5cb24a..fabd0df99e 100644 --- a/openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul_direct.c +++ b/openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul_direct.c @@ -24,6 +24,11 @@ #include "mac_rrc_ul.h" +static void f1_setup_request_direct(const f1ap_setup_req_t *req) +{ + AssertFatal(false, "not implemented\n"); +} + static void ue_context_setup_response_direct(const f1ap_ue_context_setup_t *req, const f1ap_ue_context_setup_t *resp) { DevAssert(req->drbs_to_be_setup_length == resp->drbs_to_be_setup_length); @@ -172,6 +177,7 @@ static void initial_ul_rrc_message_transfer_direct(module_id_t module_id, const void mac_rrc_ul_direct_init(struct nr_mac_rrc_ul_if_s *mac_rrc) { + mac_rrc->f1_setup_request = f1_setup_request_direct; mac_rrc->ue_context_setup_response = ue_context_setup_response_direct; mac_rrc->ue_context_modification_response = ue_context_modification_response_direct; mac_rrc->ue_context_modification_required = ue_context_modification_required_direct; 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 c873c569e5..1a65b70581 100644 --- a/openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul_f1ap.c +++ b/openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul_f1ap.c @@ -29,6 +29,11 @@ #include "mac_rrc_ul.h" +static void f1_setup_request_f1ap(const f1ap_setup_req_t *req) +{ + AssertFatal(false, "not implemented\n"); +} + static void ue_context_setup_response_f1ap(const f1ap_ue_context_setup_t *req, const f1ap_ue_context_setup_t *resp) { DevAssert(req->drbs_to_be_setup_length == resp->drbs_to_be_setup_length); @@ -161,6 +166,7 @@ static void initial_ul_rrc_message_transfer_f1ap(module_id_t module_id, const f1 void mac_rrc_ul_f1ap_init(struct nr_mac_rrc_ul_if_s *mac_rrc) { + mac_rrc->f1_setup_request = f1_setup_request_f1ap; mac_rrc->ue_context_setup_response = ue_context_setup_response_f1ap; mac_rrc->ue_context_modification_response = ue_context_modification_response_f1ap; mac_rrc->ue_context_modification_required = ue_context_modification_required_f1ap; diff --git a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h index 4bec3664c8..44e7eadb8a 100644 --- a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h +++ b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h @@ -656,6 +656,7 @@ typedef struct NR_bler_options { } NR_bler_options_t; typedef struct nr_mac_rrc_ul_if_s { + f1_setup_request_func_t f1_setup_request; ue_context_setup_response_func_t ue_context_setup_response; ue_context_modification_response_func_t ue_context_modification_response; ue_context_modification_required_func_t ue_context_modification_required; diff --git a/openair2/RRC/NR/mac_rrc_dl.h b/openair2/RRC/NR/mac_rrc_dl.h index 0180f972fe..9fc75b3073 100644 --- a/openair2/RRC/NR/mac_rrc_dl.h +++ b/openair2/RRC/NR/mac_rrc_dl.h @@ -25,6 +25,9 @@ #include "platform_types.h" #include "f1ap_messages_types.h" +typedef void (*f1_setup_response_func_t)(const f1ap_setup_resp_t *resp); +typedef void (*f1_setup_failure_func_t)(const f1ap_setup_failure_t *fail); + typedef void (*ue_context_setup_request_func_t)(const f1ap_ue_context_setup_t *req); typedef void (*ue_context_modification_request_func_t)(const f1ap_ue_context_modif_req_t *req); typedef void (*ue_context_modification_confirm_func_t)(const f1ap_ue_context_modif_confirm_t *confirm); diff --git a/openair2/RRC/NR/mac_rrc_dl_direct.c b/openair2/RRC/NR/mac_rrc_dl_direct.c index 423eac2462..c18a33954c 100644 --- a/openair2/RRC/NR/mac_rrc_dl_direct.c +++ b/openair2/RRC/NR/mac_rrc_dl_direct.c @@ -26,6 +26,8 @@ void mac_rrc_dl_direct_init(nr_mac_rrc_dl_if_t *mac_rrc) { + mac_rrc->f1_setup_response = f1_setup_response; + mac_rrc->f1_setup_failure = f1_setup_failure; mac_rrc->ue_context_setup_request = ue_context_setup_request; mac_rrc->ue_context_modification_request = ue_context_modification_request; mac_rrc->ue_context_modification_confirm = ue_context_modification_confirm; diff --git a/openair2/RRC/NR/mac_rrc_dl_f1ap.c b/openair2/RRC/NR/mac_rrc_dl_f1ap.c index 40eea4861c..8a827afe1b 100644 --- a/openair2/RRC/NR/mac_rrc_dl_f1ap.c +++ b/openair2/RRC/NR/mac_rrc_dl_f1ap.c @@ -24,6 +24,16 @@ #include "mac_rrc_dl.h" #include "nr_rrc_defs.h" +static void f1_setup_response_f1ap(const f1ap_setup_resp_t *resp) +{ + AssertFatal(false, "not implemented\n"); +} + +static void f1_setup_failure_f1ap(const f1ap_setup_failure_t *fail) +{ + AssertFatal(false, "not implemented\n"); +} + static void ue_context_setup_request_f1ap(const f1ap_ue_context_setup_t *req) { MessageDef *msg = itti_alloc_new_message(TASK_RRC_GNB, 0, F1AP_UE_CONTEXT_SETUP_REQ); @@ -133,6 +143,8 @@ static void dl_rrc_message_transfer_f1ap(const f1ap_dl_rrc_message_t *dl_rrc) void mac_rrc_dl_f1ap_init(nr_mac_rrc_dl_if_t *mac_rrc) { + mac_rrc->f1_setup_response = f1_setup_response_f1ap; + mac_rrc->f1_setup_failure = f1_setup_failure_f1ap; mac_rrc->ue_context_setup_request = ue_context_setup_request_f1ap; mac_rrc->ue_context_modification_request = ue_context_modification_request_f1ap; mac_rrc->ue_context_modification_confirm = ue_context_modification_confirm_f1ap; diff --git a/openair2/RRC/NR/nr_rrc_defs.h b/openair2/RRC/NR/nr_rrc_defs.h index a7c1d0fdfc..8e2a9d2842 100644 --- a/openair2/RRC/NR/nr_rrc_defs.h +++ b/openair2/RRC/NR/nr_rrc_defs.h @@ -362,6 +362,8 @@ typedef struct { } nr_security_configuration_t; typedef struct nr_mac_rrc_dl_if_s { + f1_setup_response_func_t f1_setup_response; + f1_setup_failure_func_t f1_setup_failure; ue_context_setup_request_func_t ue_context_setup_request; ue_context_modification_request_func_t ue_context_modification_request; ue_context_modification_confirm_func_t ue_context_modification_confirm;