diff --git a/openair2/COMMON/f1ap_messages_def.h b/openair2/COMMON/f1ap_messages_def.h index ec92ecbc32779c65e477c863cc7c40a1b2f3cfc4..9e341f9bcbc87c2a19f1e28ba7d994b31153f96a 100644 --- a/openair2/COMMON/f1ap_messages_def.h +++ b/openair2/COMMON/f1ap_messages_def.h @@ -35,6 +35,7 @@ MESSAGE_DEF(F1AP_UL_RRC_MESSAGE , MESSAGE_PRIORITY_MED, f1ap_ul_r //MESSAGE_DEF(F1AP_INITIAL_CONTEXT_SETUP_RESP, MESSAGE_PRIORITY_MED, f1ap_initial_context_setup_resp_t, f1ap_initial_context_setup_resp) //MESSAGE_DEF(F1AP_INITIAL_CONTEXT_SETUP_FAILURE, MESSAGE_PRIORITY_MED, f1ap_initial_context_setup_failure_t, f1ap_initial_context_setup_failure) MESSAGE_DEF(F1AP_UE_CONTEXT_RELEASE_REQ, MESSAGE_PRIORITY_MED, f1ap_ue_context_release_req_t, f1ap_ue_context_release_req) +MESSAGE_DEF(F1AP_UE_CONTEXT_RELEASE_CMD, MESSAGE_PRIORITY_MED, f1ap_ue_context_release_cmd_t, f1ap_ue_context_release_cmd) /* RRC -> F1AP messages */ diff --git a/openair2/COMMON/f1ap_messages_types.h b/openair2/COMMON/f1ap_messages_types.h index c083acef13d9bdeb69c3a23dd9b5f9a3017e1f61..9c69b74a874d75865218b3aa568343284a4fb005 100644 --- a/openair2/COMMON/f1ap_messages_types.h +++ b/openair2/COMMON/f1ap_messages_types.h @@ -42,6 +42,7 @@ #define F1AP_DL_RRC_MESSAGE(mSGpTR) (mSGpTR)->ittiMsg.f1ap_dl_rrc_message #define F1AP_UE_CONTEXT_RELEASE_REQ(mSGpTR) (mSGpTR)->ittiMsg.f1ap_ue_context_release_req +#define F1AP_UE_CONTEXT_RELEASE_CMD(mSGpTR) (mSGpTR)->ittiMsg.f1ap_ue_context_release_req #define F1AP_UE_CONTEXT_MODIFICATION_REQ(mSGpTR) (mSGpTR)->ittiMsg.f1ap_ue_context_modification_req /* Length of the transport layer address string diff --git a/openair2/F1AP/f1ap_cu_task.c b/openair2/F1AP/f1ap_cu_task.c index 3b64e5b2283061f316b81c1bd2375a61d3936915..f9f27e2653997819bc3d4d5113265270c76e6da4 100644 --- a/openair2/F1AP/f1ap_cu_task.c +++ b/openair2/F1AP/f1ap_cu_task.c @@ -34,6 +34,7 @@ #include "f1ap_handlers.h" #include "f1ap_cu_interface_management.h" #include "f1ap_cu_rrc_message_transfer.h" +#include "f1ap_cu_ue_context_management.h" #include "f1ap_cu_task.h" #include "proto_agent.h" @@ -170,6 +171,12 @@ void *F1AP_CU_task(void *arg) { &F1AP_DL_RRC_MESSAGE(received_msg)); break; + case F1AP_UE_CONTEXT_RELEASE_CMD: // from rrc + LOG_I(CU_F1AP, "CU Task Received F1AP_UE_CONTEXT_RELEASE_CMD\n"); + CU_send_UE_CONTEXT_RELEASE_COMMAND(ITTI_MESSAGE_GET_INSTANCE(received_msg), + &F1AP_UE_CONTEXT_RELEASE_CMD(received_msg)); + break; + // case F1AP_SETUP_RESPONSE: // This is from RRC // CU_send_F1_SETUP_RESPONSE(instance, *f1ap_setup_ind, &(F1AP_SETUP_RESP) f1ap_setup_resp) // break; diff --git a/openair2/F1AP/f1ap_cu_ue_context_management.c b/openair2/F1AP/f1ap_cu_ue_context_management.c index dc3dbfa818b688f2f31020556203961132ce5716..8a0ed86416c8f8992fce5dedd28959da7134e8a9 100644 --- a/openair2/F1AP/f1ap_cu_ue_context_management.c +++ b/openair2/F1AP/f1ap_cu_ue_context_management.c @@ -790,7 +790,7 @@ int CU_handle_UE_CONTEXT_RELEASE_REQUEST(instance_t instance, F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID, true); AssertFatal(rnti == f1ap_get_rnti_by_du_id(&f1ap_cu_ue[instance], ie->value.choice.GNB_DU_UE_F1AP_ID), - "RNTI obtained through DU ID is different from CU ID\n"); + "RNTI obtained through DU ID is different from CU ID\n"); /* Cause */ /* We don't care for the moment @@ -825,14 +825,13 @@ int CU_handle_UE_CONTEXT_RELEASE_REQUEST(instance_t instance, int CU_send_UE_CONTEXT_RELEASE_COMMAND(instance_t instance, - f1ap_ue_context_setup_req_t *f1ap_ue_context_setup_req) { + f1ap_ue_context_release_cmd_t *cmd) { F1AP_F1AP_PDU_t pdu; F1AP_UEContextReleaseCommand_t *out; F1AP_UEContextReleaseCommandIEs_t *ie; uint8_t *buffer; uint32_t len; - //int i = 0, j = 0; /* Create */ /* 0. Message Type */ @@ -850,7 +849,7 @@ int CU_send_UE_CONTEXT_RELEASE_COMMAND(instance_t instance, ie->id = F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID; ie->criticality = F1AP_Criticality_reject; ie->value.present = F1AP_UEContextReleaseCommandIEs__value_PR_GNB_CU_UE_F1AP_ID; - ie->value.choice.GNB_CU_UE_F1AP_ID = f1ap_ue_context_setup_req->gNB_CU_ue_id; + ie->value.choice.GNB_CU_UE_F1AP_ID = f1ap_get_cu_ue_f1ap_id(&f1ap_cu_ue[instance], cmd->rnti); ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie); /* mandatory */ @@ -859,7 +858,7 @@ int CU_send_UE_CONTEXT_RELEASE_COMMAND(instance_t instance, ie->id = F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID; ie->criticality = F1AP_Criticality_reject; ie->value.present = F1AP_UEContextReleaseCommandIEs__value_PR_GNB_DU_UE_F1AP_ID; - ie->value.choice.GNB_DU_UE_F1AP_ID = *f1ap_ue_context_setup_req->gNB_DU_ue_id; + ie->value.choice.GNB_DU_UE_F1AP_ID = f1ap_get_du_ue_f1ap_id(&f1ap_cu_ue[instance], cmd->rnti); ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie); /* mandatory */ @@ -869,25 +868,26 @@ int CU_send_UE_CONTEXT_RELEASE_COMMAND(instance_t instance, ie->criticality = F1AP_Criticality_ignore; ie->value.present = F1AP_UEContextReleaseCommandIEs__value_PR_Cause; - // dummy value - ie->value.choice.Cause.present = F1AP_Cause_PR_radioNetwork; - - switch(ie->value.choice.Cause.present) - { - case F1AP_Cause_PR_radioNetwork: - ie->value.choice.Cause.choice.radioNetwork = F1AP_CauseRadioNetwork_unspecified; + switch (cmd->cause) { + case F1AP_CAUSE_RADIO_NETWORK: + ie->value.choice.Cause.present = F1AP_Cause_PR_radioNetwork; + ie->value.choice.Cause.choice.radioNetwork = cmd->cause_value; break; - case F1AP_Cause_PR_transport: - ie->value.choice.Cause.choice.transport = F1AP_CauseTransport_unspecified; + case F1AP_CAUSE_TRANSPORT: + ie->value.choice.Cause.present = F1AP_Cause_PR_transport; + ie->value.choice.Cause.choice.transport = cmd->cause_value; break; - case F1AP_Cause_PR_protocol: - ie->value.choice.Cause.choice.protocol = F1AP_CauseProtocol_unspecified; + case F1AP_CAUSE_PROTOCOL: + ie->value.choice.Cause.present = F1AP_Cause_PR_protocol; + ie->value.choice.Cause.choice.protocol = cmd->cause_value; break; - case F1AP_Cause_PR_misc: - ie->value.choice.Cause.choice.misc = F1AP_CauseMisc_unspecified; + case F1AP_CAUSE_MISC: + ie->value.choice.Cause.present = F1AP_Cause_PR_misc; + ie->value.choice.Cause.choice.misc = cmd->cause_value; break; - case F1AP_Cause_PR_NOTHING: + case F1AP_CAUSE_NOTHING: default: + ie->value.choice.Cause.present = F1AP_Cause_PR_NOTHING; break; } ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie); @@ -899,8 +899,8 @@ int CU_send_UE_CONTEXT_RELEASE_COMMAND(instance_t instance, ie->criticality = F1AP_Criticality_ignore; ie->value.present = F1AP_UEContextReleaseCommandIEs__value_PR_RRCContainer; - OCTET_STRING_fromBuf(&ie->value.choice.RRCContainer, "asdsa1d32sa1d31asd31as", - strlen("asdsa1d32sa1d31asd31as")); + OCTET_STRING_fromBuf(&ie->value.choice.RRCContainer, (const char *)cmd->rrc_container, + cmd->rrc_container_length); ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie); /* encode */ @@ -909,41 +909,33 @@ int CU_send_UE_CONTEXT_RELEASE_COMMAND(instance_t instance, return -1; } - // send + cu_f1ap_itti_send_sctp_data_req(instance, f1ap_du_data_from_du->assoc_id, buffer, len, 0); return 0; } -// note: is temporary with F1AP_UE_CONTEXT_SETUP_REQ int CU_handle_UE_CONTEXT_RELEASE_COMPLETE(instance_t instance, uint32_t assoc_id, uint32_t stream, F1AP_F1AP_PDU_t *pdu) { - MessageDef *msg_p; // message to RRC F1AP_UEContextReleaseComplete_t *container; F1AP_UEContextReleaseCompleteIEs_t *ie; - //int i; + rnti_t rnti; DevAssert(pdu); - msg_p = itti_alloc_new_message(TASK_DU_F1, F1AP_UE_CONTEXT_SETUP_REQ); - f1ap_ue_context_setup_req_t *f1ap_ue_context_setup_req; - f1ap_ue_context_setup_req = &F1AP_UE_CONTEXT_SETUP_REQ(msg_p); - container = &pdu->choice.successfulOutcome->value.choice.UEContextReleaseComplete; - /* GNB_CU_UE_F1AP_ID */ F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextReleaseCompleteIEs_t, ie, container, F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID, true); - f1ap_ue_context_setup_req->gNB_CU_ue_id = ie->value.choice.GNB_CU_UE_F1AP_ID; + rnti = f1ap_get_rnti_by_cu_id(&f1ap_cu_ue[instance], ie->value.choice.GNB_CU_UE_F1AP_ID); /* GNB_DU_UE_F1AP_ID */ F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextReleaseCompleteIEs_t, ie, container, F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID, true); - f1ap_ue_context_setup_req->gNB_DU_ue_id = malloc(sizeof(uint32_t)); - AssertFatal(f1ap_ue_context_setup_req->gNB_DU_ue_id, - "can not allocate memory for f1ap_ue_context_setup_req->gNB_DU_ue_id\n"); - *f1ap_ue_context_setup_req->gNB_DU_ue_id = ie->value.choice.GNB_DU_UE_F1AP_ID; + AssertFatal(rnti == f1ap_get_rnti_by_du_id(&f1ap_cu_ue[instance], + ie->value.choice.GNB_DU_UE_F1AP_ID), + "RNTI obtained through DU ID is different from CU ID\n"); /* Optional*/ /* CriticalityDiagnostics */ @@ -958,7 +950,9 @@ int CU_handle_UE_CONTEXT_RELEASE_COMPLETE(instance_t instance, // F1AP_CriticalityDiagnostics_IE_List } - AssertFatal(0, "check configuration, send to appropriate handler\n"); + LOG_I(CU_F1AP, "Received UE CONTEXT RELEASE COMPLETE: Removing CU UE entry for RNTI %x\n", rnti); + f1ap_remove_ue(&f1ap_cu_ue[instance], rnti); + return 0; } diff --git a/openair2/F1AP/f1ap_cu_ue_context_management.h b/openair2/F1AP/f1ap_cu_ue_context_management.h index 77c3abea72317f48c67f6f1fa755db493910310f..cc4ca3e35f08cf768842e14a2410db6f4b828518 100644 --- a/openair2/F1AP/f1ap_cu_ue_context_management.h +++ b/openair2/F1AP/f1ap_cu_ue_context_management.h @@ -61,9 +61,8 @@ int CU_handle_UE_CONTEXT_RELEASE_REQUEST(instance_t instance, /* * UE Context Release (gNB-CU initiated) */ -// note: is temporary with f1ap_ue_context_setup_req_t int CU_send_UE_CONTEXT_RELEASE_COMMAND(instance_t instance, - f1ap_ue_context_setup_req_t *f1ap_ue_context_setup_req); + f1ap_ue_context_release_cmd_t *cmd); int CU_handle_UE_CONTEXT_RELEASE_COMPLETE(instance_t instance, uint32_t assoc_id, diff --git a/openair2/RRC/LTE/rrc_eNB.c b/openair2/RRC/LTE/rrc_eNB.c index c072eb92503c40b1f1a61ba42f40ca7407c9b2f1..2302e3f9da4691171340e1124ff3f1f67708a614 100644 --- a/openair2/RRC/LTE/rrc_eNB.c +++ b/openair2/RRC/LTE/rrc_eNB.c @@ -1068,8 +1068,13 @@ void release_UE_in_freeList(module_id_t mod_id) rrc_rlc_remove_ue(&ctxt); } else if (RC.rrc[mod_id]->node_type == ngran_eNB_CU || RC.rrc[mod_id]->node_type == ngran_ng_eNB_CU) { - // send UE_CONTEXT_RELEASE - AssertFatal(1==0,"Need to added context removal\n"); + MessageDef *m = itti_alloc_new_message(TASK_RRC_ENB, F1AP_UE_CONTEXT_RELEASE_CMD); + F1AP_UE_CONTEXT_RELEASE_CMD(m).rnti = rnti; + F1AP_UE_CONTEXT_RELEASE_CMD(m).cause = F1AP_CAUSE_RADIO_NETWORK; + F1AP_UE_CONTEXT_RELEASE_CMD(m).cause_value = 10; // 10 = F1AP_CauseRadioNetwork_normal_release + F1AP_UE_CONTEXT_RELEASE_CMD(m).rrc_container = NULL; + F1AP_UE_CONTEXT_RELEASE_CMD(m).rrc_container_length = 0; + itti_send_msg_to_task(TASK_CU_F1, mod_id, m); } pdcp_remove_UE(&ctxt); @@ -2176,14 +2181,24 @@ rrc_eNB_generate_RRCConnectionRelease( } } pthread_mutex_unlock(&rrc_release_freelist); - rrc_data_req( - ctxt_pP, - DCCH, - rrc_eNB_mui++, - SDU_CONFIRM_NO, - size, - buffer, - PDCP_TRANSMISSION_MODE_CONTROL); + if (RC.rrc[ctxt_pP->module_id]->node_type == ngran_eNB_CU + || RC.rrc[ctxt_pP->module_id]->node_type == ngran_ng_eNB_CU) { + MessageDef *m = itti_alloc_new_message(TASK_RRC_ENB, F1AP_UE_CONTEXT_RELEASE_CMD); + F1AP_UE_CONTEXT_RELEASE_CMD(m).rnti = ctxt_pP->rnti; + F1AP_UE_CONTEXT_RELEASE_CMD(m).cause = F1AP_CAUSE_RADIO_NETWORK; + F1AP_UE_CONTEXT_RELEASE_CMD(m).cause_value = 10; // 10 = F1AP_CauseRadioNetwork_normal_release + F1AP_UE_CONTEXT_RELEASE_CMD(m).rrc_container = buffer; + F1AP_UE_CONTEXT_RELEASE_CMD(m).rrc_container_length = size; + itti_send_msg_to_task(TASK_CU_F1, ctxt_pP->module_id, m); + } else { + rrc_data_req(ctxt_pP, + DCCH, + rrc_eNB_mui++, + SDU_CONFIRM_NO, + size, + buffer, + PDCP_TRANSMISSION_MODE_CONTROL); + } } uint8_t qci_to_priority[9]={2,4,3,5,1,6,7,8,9}; @@ -6487,8 +6502,13 @@ rrc_eNB_decode_ccch( rrc_mac_remove_ue(ctxt_pP->module_id, ue_context_p->ue_context.rnti); } else { - // send message to DU to remove context - AssertFatal(1==0,"Need to added context removal\n"); + MessageDef *m = itti_alloc_new_message(TASK_RRC_ENB, F1AP_UE_CONTEXT_RELEASE_CMD); + F1AP_UE_CONTEXT_RELEASE_CMD(m).rnti = ctxt_pP->rnti; + F1AP_UE_CONTEXT_RELEASE_CMD(m).cause = F1AP_CAUSE_RADIO_NETWORK; + F1AP_UE_CONTEXT_RELEASE_CMD(m).cause_value = 10; // 10 = F1AP_CauseRadioNetwork_normal_release + F1AP_UE_CONTEXT_RELEASE_CMD(m).rrc_container = NULL; + F1AP_UE_CONTEXT_RELEASE_CMD(m).rrc_container_length = 0; + itti_send_msg_to_task(TASK_CU_F1, ctxt_pP->module_id, m); } stmsi_received=1; /* replace rnti in the context */ @@ -6590,8 +6610,15 @@ rrc_eNB_decode_ccch( if (RC.rrc[ctxt_pP->module_id] == ngran_eNB) rrc_mac_remove_ue(ctxt_pP->module_id,ctxt_pP->rnti); else if (RC.rrc[ctxt_pP->module_id]->node_type == ngran_eNB_CU || - RC.rrc[ctxt_pP->module_id]->node_type == ngran_ng_eNB_CU) - AssertFatal(1==0,"Need to added context removal\n"); + RC.rrc[ctxt_pP->module_id]->node_type == ngran_ng_eNB_CU) { + MessageDef *m = itti_alloc_new_message(TASK_RRC_ENB, F1AP_UE_CONTEXT_RELEASE_CMD); + F1AP_UE_CONTEXT_RELEASE_CMD(m).rnti = ctxt_pP->rnti; + F1AP_UE_CONTEXT_RELEASE_CMD(m).cause = F1AP_CAUSE_RADIO_NETWORK; + F1AP_UE_CONTEXT_RELEASE_CMD(m).cause_value = 10; // 10 = F1AP_CauseRadioNetwork_normal_release + F1AP_UE_CONTEXT_RELEASE_CMD(m).rrc_container = NULL; + F1AP_UE_CONTEXT_RELEASE_CMD(m).rrc_container_length = 0; + itti_send_msg_to_task(TASK_CU_F1, ctxt_pP->module_id, m); + } return -1; }