diff --git a/openair2/E1AP/e1ap.c b/openair2/E1AP/e1ap.c index 8b6665fbfe45eff0582dc346ea819987b4b4192b..acdc6388a2fb808296f7b37b899cf80c87240800 100644 --- a/openair2/E1AP/e1ap.c +++ b/openair2/E1AP/e1ap.c @@ -233,7 +233,7 @@ int e1apCUCP_send_SETUP_RESPONSE(instance_t instance, } int e1apCUCP_send_SETUP_FAILURE(instance_t instance, - e1ap_setup_resp_t *e1ap_setup_resp) { + long transac_id) { E1AP_E1AP_PDU_t pdu = {0}; /* Create */ /* 0. pdu Type */ @@ -249,7 +249,7 @@ int e1apCUCP_send_SETUP_FAILURE(instance_t instance, ieC1->id = E1AP_ProtocolIE_ID_id_TransactionID; ieC1->criticality = E1AP_Criticality_reject; ieC1->value.present = E1AP_GNB_CU_UP_E1SetupResponseIEs__value_PR_TransactionID; - ieC1->value.choice.TransactionID = e1ap_setup_resp->transac_id; + ieC1->value.choice.TransactionID = transac_id; /* mandatory */ /* c2. cause (integer value) */ asn1cSequenceAdd(out->protocolIEs.list, E1AP_GNB_CU_UP_E1SetupFailureIEs_t, ieC2); @@ -311,6 +311,16 @@ int e1apCUCP_handle_SETUP_REQUEST(instance_t instance, } /* Create ITTI message and send to queue */ + MessageDef *msg_p = itti_alloc_new_message(TASK_CUCP_E1, instance, E1AP_SETUP_REQ); + memcpy(&E1AP_SETUP_REQ(msg_p), req, sizeof(e1ap_setup_req_t)); + + if (req->supported_plmns > 0) { + itti_send_msg_to_task(TASK_RRC_GNB, instance, msg_p); + } else { + e1apCUCP_send_SETUP_FAILURE(instance, req->transac_id); + itti_free(TASK_CUCP_E1, msg_p); + return -1; + } return 0; } @@ -1141,6 +1151,7 @@ void *E1AP_CUCP_task(void *arg) { LOG_I(E1AP, "Starting E1AP at CU CP\n"); MessageDef *msg = NULL; e1ap_common_init(); + int result; while (1) { itti_receive_msg(TASK_CUCP_E1, &msg); @@ -1178,16 +1189,27 @@ void *E1AP_CUCP_task(void *arg) { cuxp_task_handle_sctp_data_ind(myInstance, &msg->ittiMsg.sctp_data_ind); break; + case E1AP_SETUP_RESP: + LOG_I(E1AP, "CUCP Task Received E1AP_SETUP_RESP\n"); + e1apCUCP_send_SETUP_RESPONSE(myInstance, &E1AP_SETUP_RESP(msg)); + break; + default: LOG_E(E1AP, "Unknown message received in TASK_CUCP_E1\n"); break; } + + result = itti_free(ITTI_MSG_ORIGIN_ID(msg), msg); + AssertFatal(result == EXIT_SUCCESS, "Failed to free memory (%d) in E1AP_CUCP_task!\n", result); + msg = NULL; + } } void *E1AP_CUUP_task(void *arg) { LOG_I(E1AP, "Starting E1AP at CU UP\n"); e1ap_common_init(); + int result; // SCTP while (1) { @@ -1218,6 +1240,11 @@ void *E1AP_CUUP_task(void *arg) { LOG_E(E1AP, "Unknown message received in TASK_CUUP_E1\n"); break; } + + result = itti_free(ITTI_MSG_ORIGIN_ID(msg), msg); + AssertFatal(result == EXIT_SUCCESS, "Failed to free memory (%d) in E1AP_CUUP_task!\n", result); + msg = NULL; + } } diff --git a/openair2/RRC/NR/rrc_gNB.c b/openair2/RRC/NR/rrc_gNB.c index 8be829f51fbc8c1c8bc4019fd07b78149900bbe2..466c41957a32b8df03cf308b4f53788dc5444188 100755 --- a/openair2/RRC/NR/rrc_gNB.c +++ b/openair2/RRC/NR/rrc_gNB.c @@ -3876,6 +3876,26 @@ void nr_rrc_subframe_process(protocol_ctxt_t *const ctxt_pP, const int CC_id) { } } +void rrc_gNB_process_e1_setup_req(e1ap_setup_req_t *req, instance_t instance) { + + AssertFatal(req->supported_plmns <= PLMN_LIST_MAX_SIZE, "Supported PLMNs is more than PLMN_LIST_MAX_SIZE\n"); + gNB_RRC_INST *rrc = RC.nrrrc[0]; //TODO: remove hardcoding of RC index here + MessageDef *msg_p = itti_alloc_new_message(TASK_RRC_GNB, instance, E1AP_SETUP_RESP); + + e1ap_setup_resp_t *resp = &E1AP_SETUP_RESP(msg_p); + resp->transac_id = req->transac_id; + + for (int i=0; i < req->supported_plmns; i++) { + if (rrc->configuration.mcc[i] == req->plmns[i].mcc && + rrc->configuration.mnc[i] == req->plmns[i].mnc) { + LOG_E(NR_RRC, "PLMNs received from CUUP (mcc:%d, mnc:%d) did not match with PLMNs in RRC (mcc:%d, mnc:%d)\n", + req->plmns[i].mcc, req->plmns[i].mnc, rrc->configuration.mcc[i], rrc->configuration.mnc[i]); + } + } + + itti_send_msg_to_task(TASK_CUCP_E1, instance, msg_p); +} + ///---------------------------------------------------------------------------------------------------------------/// ///---------------------------------------------------------------------------------------------------------------/// void *rrc_gnb_task(void *args_p) { @@ -4034,6 +4054,11 @@ void *rrc_gnb_task(void *args_p) { rrc_gNB_process_NGAP_UE_CONTEXT_RELEASE_COMMAND(msg_p, msg_name_p, instance); break; + case E1AP_SETUP_REQ: + LOG_I(NR_RRC, "Received E1AP_SETUP_REQ for instance %d\n", (int)instance); + rrc_gNB_process_e1_setup_req(&E1AP_SETUP_REQ(msg_p), instance); + break; + default: LOG_E(NR_RRC, "[gNB %ld] Received unexpected message %s\n", instance, msg_name_p); break; @@ -4239,3 +4264,4 @@ void nr_rrc_trigger(protocol_ctxt_t *ctxt, int CC_id, int frame, int subframe) LOG_D(NR_RRC, "Time in RRC: %u/ %u \n", frame, subframe); itti_send_msg_to_task(TASK_RRC_GNB, ctxt->module_id, message_p); } +