Merge remote-tracking branch 'origin/NR_SA_F1AP_5GRECORDS' into develop-NR_SA_F1AP_5GRECORDS-lts2
# Conflicts: # cmake_targets/CMakeLists.txt # cmake_targets/build_oai # cmake_targets/tools/build_helper # executables/nr-gnb.c # openair1/PHY/INIT/nr_init_ru.c # openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c # openair1/PHY/NR_TRANSPORT/nr_ulsch.c # openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c # openair1/PHY/NR_UE_TRANSPORT/nr_prach.c # openair1/SCHED_NR/phy_procedures_nr_gNB.c # openair1/SCHED_NR_UE/pucch_uci_ue_nr.c # openair2/F1AP/f1ap_du_rrc_message_transfer.c # openair2/F1AP/f1ap_du_rrc_message_transfer.h # openair2/F1AP/f1ap_du_task.c # openair2/GNB_APP/gnb_app.c # openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c # openair2/LAYER2/NR_MAC_gNB/config.c # openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c # openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c # openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c # openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c # openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c # openair2/LAYER2/nr_pdcp/nr_pdcp_entity.c # openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c # openair2/RRC/LTE/rrc_eNB_GTPV1U.c # openair2/RRC/NR/L2_nr_interface.c # openair2/RRC/NR/MESSAGES/asn1_msg.c # openair2/RRC/NR/rrc_gNB.c # openair2/RRC/NR/rrc_gNB_NGAP.c # openair2/RRC/NR_UE/rrc_UE.c # openair3/NAS/NR_UE/nr_nas_msg_sim.c # openair3/ocp-gtpu/gtp_itf.cpp # targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
This commit is contained in:
@@ -38,13 +38,6 @@
|
||||
#include "common/ran_context.h"
|
||||
#include "openair3/UTILS/conversions.h"
|
||||
|
||||
// undefine C_RNTI from
|
||||
// openair1/PHY/LTE_TRANSPORT/transport_common.h which
|
||||
// replaces in ie->value.choice.C_RNTI, causing
|
||||
// a compile error
|
||||
#undef C_RNTI
|
||||
|
||||
|
||||
// Bing Kai: create CU and DU context, and put all the information there.
|
||||
uint64_t du_ue_f1ap_id = 0;
|
||||
uint32_t f1ap_assoc_id = 0;
|
||||
|
||||
@@ -39,8 +39,10 @@
|
||||
|
||||
#include "rrc_extern.h"
|
||||
#include "rrc_eNB_UE_context.h"
|
||||
#include "openair2/RRC/NR/rrc_gNB_UE_context.h"
|
||||
#include "rrc_eNB_S1AP.h"
|
||||
#include "rrc_eNB_GTPV1U.h"
|
||||
#include "openair2/RRC/NR/rrc_gNB_NGAP.h"
|
||||
|
||||
extern f1ap_setup_req_t *f1ap_du_data_from_du;
|
||||
extern f1ap_cudu_inst_t f1ap_cu_inst[MAX_eNB];
|
||||
@@ -1029,35 +1031,55 @@ int CU_handle_UE_CONTEXT_RELEASE_COMPLETE(instance_t instance,
|
||||
// F1AP_CriticalityDiagnostics_IE_List
|
||||
}
|
||||
|
||||
struct rrc_eNB_ue_context_s *ue_context_p =
|
||||
rrc_eNB_get_ue_context(RC.rrc[instance], rnti);
|
||||
protocol_ctxt_t ctxt;
|
||||
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, instance, ENB_FLAG_YES, rnti, 0, 0, instance);
|
||||
|
||||
if (ue_context_p) {
|
||||
/* The following is normally done in the function rrc_rx_tx() */
|
||||
rrc_eNB_send_S1AP_UE_CONTEXT_RELEASE_CPLT(instance,
|
||||
ue_context_p->ue_context.eNB_ue_s1ap_id);
|
||||
if (RC.nrrrc[instance]->node_type == ngran_gNB_CU) {
|
||||
struct rrc_gNB_ue_context_s *ue_context_p =
|
||||
rrc_gNB_get_ue_context(RC.nrrrc[instance], rnti);
|
||||
|
||||
rrc_eNB_send_GTPV1U_ENB_DELETE_TUNNEL_REQ(instance, ue_context_p);
|
||||
// erase data of GTP tunnels in UE context
|
||||
for (int e_rab = 0; e_rab < ue_context_p->ue_context.nb_of_e_rabs; e_rab++) {
|
||||
ue_context_p->ue_context.enb_gtp_teid[e_rab] = 0;
|
||||
memset(&ue_context_p->ue_context.enb_gtp_addrs[e_rab],
|
||||
0, sizeof(ue_context_p->ue_context.enb_gtp_addrs[e_rab]));
|
||||
ue_context_p->ue_context.enb_gtp_ebi[e_rab] = 0;
|
||||
if (ue_context_p) {
|
||||
MessageDef *msg = itti_alloc_new_message(TASK_CU_F1, 0, NGAP_UE_CONTEXT_RELEASE_COMPLETE);
|
||||
NGAP_UE_CONTEXT_RELEASE_COMPLETE(msg).gNB_ue_ngap_id = ue_context_p->ue_context.gNB_ue_ngap_id;
|
||||
itti_send_msg_to_task(TASK_NGAP, instance, msg);
|
||||
|
||||
rrc_gNB_remove_ue_context(&ctxt, RC.nrrrc[instance], ue_context_p);
|
||||
} else {
|
||||
LOG_E(F1AP, "could not find ue_context of UE RNTI %x\n", rnti);
|
||||
}
|
||||
#ifdef ITTI_SIM
|
||||
return 0;
|
||||
#endif
|
||||
|
||||
struct rrc_ue_s1ap_ids_s *rrc_ue_s1ap_ids =
|
||||
rrc_eNB_S1AP_get_ue_ids(RC.rrc[instance], 0,
|
||||
ue_context_p->ue_context.eNB_ue_s1ap_id);
|
||||
if (rrc_ue_s1ap_ids)
|
||||
rrc_eNB_S1AP_remove_ue_ids(RC.rrc[instance], rrc_ue_s1ap_ids);
|
||||
|
||||
/* trigger UE release in RRC */
|
||||
rrc_eNB_remove_ue_context(&ctxt, RC.rrc[instance], ue_context_p);
|
||||
} else {
|
||||
LOG_E(F1AP, "could not find ue_context of UE RNTI %x\n", rnti);
|
||||
struct rrc_eNB_ue_context_s *ue_context_p =
|
||||
rrc_eNB_get_ue_context(RC.rrc[instance], rnti);
|
||||
|
||||
if (ue_context_p) {
|
||||
/* The following is normally done in the function rrc_rx_tx() */
|
||||
rrc_eNB_send_S1AP_UE_CONTEXT_RELEASE_CPLT(instance,
|
||||
ue_context_p->ue_context.eNB_ue_s1ap_id);
|
||||
|
||||
rrc_eNB_send_GTPV1U_ENB_DELETE_TUNNEL_REQ(instance, ue_context_p);
|
||||
// erase data of GTP tunnels in UE context
|
||||
for (int e_rab = 0; e_rab < ue_context_p->ue_context.nb_of_e_rabs; e_rab++) {
|
||||
ue_context_p->ue_context.enb_gtp_teid[e_rab] = 0;
|
||||
memset(&ue_context_p->ue_context.enb_gtp_addrs[e_rab],
|
||||
0, sizeof(ue_context_p->ue_context.enb_gtp_addrs[e_rab]));
|
||||
ue_context_p->ue_context.enb_gtp_ebi[e_rab] = 0;
|
||||
}
|
||||
|
||||
struct rrc_ue_s1ap_ids_s *rrc_ue_s1ap_ids =
|
||||
rrc_eNB_S1AP_get_ue_ids(RC.rrc[instance], 0,
|
||||
ue_context_p->ue_context.eNB_ue_s1ap_id);
|
||||
if (rrc_ue_s1ap_ids)
|
||||
rrc_eNB_S1AP_remove_ue_ids(RC.rrc[instance], rrc_ue_s1ap_ids);
|
||||
|
||||
/* trigger UE release in RRC */
|
||||
rrc_eNB_remove_ue_context(&ctxt, RC.rrc[instance], ue_context_p);
|
||||
} else {
|
||||
LOG_E(F1AP, "could not find ue_context of UE RNTI %x\n", rnti);
|
||||
}
|
||||
}
|
||||
|
||||
pdcp_remove_UE(&ctxt);
|
||||
|
||||
@@ -56,13 +56,6 @@
|
||||
#include "intertask_interface.h"
|
||||
#include "LAYER2/NR_MAC_gNB/mac_proto.h"
|
||||
|
||||
// undefine C_RNTI from
|
||||
// openair1/PHY/LTE_TRANSPORT/transport_common.h which
|
||||
// replaces in ie->value.choice.C_RNTI, causing
|
||||
// a compile error
|
||||
|
||||
#undef C_RNTI
|
||||
|
||||
extern f1ap_setup_req_t *f1ap_du_data;
|
||||
extern RAN_CONTEXT_t RC;
|
||||
extern f1ap_cudu_inst_t f1ap_du_inst[MAX_eNB];
|
||||
@@ -990,135 +983,6 @@ int DU_send_UL_NR_RRC_MESSAGE_TRANSFER(instance_t instance,
|
||||
msg->rrc_container_length);
|
||||
ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
|
||||
|
||||
if (msg->srb_id == 1 || msg->srb_id == 2) {
|
||||
struct rrc_gNB_ue_context_s* ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[instance], rnti);
|
||||
|
||||
|
||||
NR_UL_DCCH_Message_t* ul_dcch_msg=NULL;
|
||||
asn_dec_rval_t dec_rval;
|
||||
dec_rval = uper_decode(NULL,
|
||||
&asn_DEF_NR_UL_DCCH_Message,
|
||||
(void**)&ul_dcch_msg,
|
||||
&ie->value.choice.RRCContainer.buf[1], // buf[0] includes the pdcp header
|
||||
msg->rrc_container_length, 0, 0);
|
||||
|
||||
if ((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)) {
|
||||
LOG_E(F1AP, " Failed to decode UL-DCCH (%zu bytes)\n",dec_rval.consumed);
|
||||
/* for rfsim, because UE send RRCSetupRequest in SRB1 */
|
||||
// NR_UL_CCCH_Message_t *ul_ccch_msg;
|
||||
// dec_rval = uper_decode(NULL,
|
||||
// &asn_DEF_NR_UL_CCCH_Message,
|
||||
// (void**)&ul_ccch_msg,
|
||||
// &ie->value.choice.RRCContainer.buf[1], // buf[0] includes the pdcp header
|
||||
// msg->rrc_container_length, 0, 0);
|
||||
// if ((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)) {
|
||||
// LOG_E(F1AP, " Failed to decode UL-CCCH (%zu bytes)\n",dec_rval.consumed);
|
||||
// } else {
|
||||
// LOG_I(F1AP, "decode UL-CCCH success \n");
|
||||
// LOG_I(F1AP, "Received message: present %d and c1 present %d\n",
|
||||
// ul_ccch_msg->message.present, ul_ccch_msg->message.choice.c1->present);
|
||||
|
||||
// if (ul_ccch_msg->message.present == NR_UL_CCCH_MessageType_PR_c1) {
|
||||
// if (ul_ccch_msg->message.choice.c1->present == NR_UL_CCCH_MessageType__c1_PR_rrcSetupRequest) {
|
||||
// LOG_I(F1AP, "[MSG] RRC Setup Request\n");
|
||||
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
}
|
||||
else
|
||||
LOG_I(F1AP, "Received message: present %d and c1 present %d\n",
|
||||
ul_dcch_msg->message.present, ul_dcch_msg->message.choice.c1->present);
|
||||
|
||||
if (ul_dcch_msg->message.present == NR_UL_DCCH_MessageType_PR_c1) {
|
||||
|
||||
switch (ul_dcch_msg->message.choice.c1->present) {
|
||||
case NR_UL_DCCH_MessageType__c1_PR_NOTHING: /* No components present */
|
||||
break;
|
||||
|
||||
case NR_UL_DCCH_MessageType__c1_PR_measurementReport:
|
||||
break;
|
||||
|
||||
case NR_UL_DCCH_MessageType__c1_PR_rrcReconfigurationComplete:
|
||||
LOG_I(F1AP, "[MSG] RRC UL rrcReconfigurationComplete\n");
|
||||
|
||||
/* CDRX: activated when RRC Connection Reconfiguration Complete is received */
|
||||
#if(0)
|
||||
int UE_id_mac = find_nr_UE_id(instance, rnti);
|
||||
|
||||
if (UE_id_mac == -1) {
|
||||
LOG_E(F1AP, "Can't find UE_id(MAC) of UE rnti %x\n", rnti);
|
||||
break;
|
||||
}
|
||||
|
||||
UE_sched_ctrl_t *UE_scheduling_control = &(RC.nrmac[instance]->UE_info.UE_sched_ctrl[UE_id_mac]);
|
||||
|
||||
if (UE_scheduling_control->cdrx_waiting_ack == TRUE) {
|
||||
UE_scheduling_control->cdrx_waiting_ack = FALSE;
|
||||
UE_scheduling_control->cdrx_configured = TRUE; // Set to TRUE when RRC Connection Reconfiguration Complete is received
|
||||
LOG_I(F1AP, "CDRX configuration activated after RRC Connection Reconfiguration Complete reception\n");
|
||||
}
|
||||
/* End of CDRX processing */
|
||||
#endif
|
||||
break;
|
||||
|
||||
case NR_UL_DCCH_MessageType__c1_PR_rrcSetupComplete:
|
||||
LOG_I(F1AP, "[MSG] RRC UL rrcSetupComplete \n");
|
||||
|
||||
if(!ue_context_p){
|
||||
LOG_E(F1AP, "Did not find the UE context associated with UE RNTOI %x, ue_context_p is NULL\n", rnti);
|
||||
|
||||
} else {
|
||||
LOG_I(F1AP, "Processing RRCSetupComplete UE %x\n", rnti);
|
||||
ue_context_p->ue_context.StatusRrc = NR_RRC_CONNECTED;
|
||||
}
|
||||
break;
|
||||
|
||||
case NR_UL_DCCH_MessageType__c1_PR_rrcReestablishmentComplete:
|
||||
LOG_I(F1AP, "[MSG] RRC ReestablishmentComplete \n");
|
||||
break;
|
||||
|
||||
case NR_UL_DCCH_MessageType__c1_PR_rrcResumeComplete:
|
||||
LOG_I(F1AP, "[MSG] RRC ResumeComplete \n");
|
||||
break;
|
||||
|
||||
case NR_UL_DCCH_MessageType__c1_PR_securityModeComplete:
|
||||
LOG_I(F1AP, "[MSG] RRC securityModeComplete \n");
|
||||
break;
|
||||
|
||||
case NR_UL_DCCH_MessageType__c1_PR_securityModeFailure:
|
||||
LOG_I(F1AP, "[MSG] RRC securityModeFailure \n");
|
||||
break;
|
||||
|
||||
case NR_UL_DCCH_MessageType__c1_PR_ulInformationTransfer:
|
||||
LOG_I(F1AP, "[MSG] RRC UL Information Transfer \n");
|
||||
break;
|
||||
|
||||
case NR_UL_DCCH_MessageType__c1_PR_locationMeasurementIndication:
|
||||
break;
|
||||
|
||||
case NR_UL_DCCH_MessageType__c1_PR_ueCapabilityInformation:
|
||||
LOG_I(F1AP, "[MSG] RRC ueCapabilityInformation \n");
|
||||
break;
|
||||
|
||||
case NR_UL_DCCH_MessageType__c1_PR_ueAssistanceInformation:
|
||||
break;
|
||||
|
||||
case NR_UL_DCCH_MessageType__c1_PR_failureInformation:
|
||||
break;
|
||||
|
||||
case NR_UL_DCCH_MessageType__c1_PR_scgFailureInformation:
|
||||
break;
|
||||
|
||||
case NR_UL_DCCH_MessageType__c1_PR_scgFailureInformationEUTRA:
|
||||
break;
|
||||
|
||||
default:
|
||||
LOG_E(NR_RRC, "Unknown UL DCCH message type, present %d \n", ul_dcch_msg->message.choice.c1->present);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
/* encode */
|
||||
if (f1ap_encode_pdu(&pdu, &buffer, &len) < 0) {
|
||||
LOG_E(F1AP, "Failed to encode F1 UL RRC MESSAGE TRANSFER \n");
|
||||
@@ -1295,47 +1159,17 @@ int DU_handle_DL_NR_RRC_MESSAGE_TRANSFER(instance_t instance,
|
||||
rrcSetup_ies->masterCellGroup.size,0,0);
|
||||
AssertFatal(dec_rval.code == RC_OK, "could not decode masterCellGroup\n");
|
||||
|
||||
// configure MAC
|
||||
gNB_RRC_INST *rrc = RC.nrrrc[ctxt.module_id];
|
||||
rrc_mac_config_req_gNB(ctxt.module_id,
|
||||
rrc->carrier.ssb_SubcarrierOffset,
|
||||
rrc->carrier.pdsch_AntennaPorts,
|
||||
rrc->carrier.pusch_AntennaPorts,
|
||||
NULL,
|
||||
0,
|
||||
ue_context_p->ue_context.rnti,
|
||||
ue_context_p->ue_context.masterCellGroup
|
||||
);
|
||||
apply_macrlc_config(rrc,ue_context_p,&ctxt);
|
||||
|
||||
// rrc_rlc_config_asn1_req
|
||||
nr_rrc_rlc_config_asn1_req(&ctxt,
|
||||
ue_context_p->ue_context.SRB_configList,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL);
|
||||
gNB_RRC_UE_t *ue_p = &ue_context_p->ue_context;
|
||||
AssertFatal(ue_p->Srb0.Active == 1,"SRB0 is not active\n");
|
||||
|
||||
// This should be somewhere in the f1ap_cudu_ue_inst_t
|
||||
/*int macrlc_instance = 0;
|
||||
memcpy((void*)ue_p->Srb0.Tx_buffer.Payload,
|
||||
(void*)ie->value.choice.RRCContainer.buf,
|
||||
rrc_dl_sdu_len); // ie->value.choice.RRCContainer.size
|
||||
|
||||
rnti_t rnti = f1ap_get_rnti_by_du_id(&f1ap_du_inst[0], du_ue_f1ap_id);
|
||||
struct rrc_gNB_ue_context_s *ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[macrlc_instance],rnti);
|
||||
*/
|
||||
gNB_RRC_UE_t *ue_p = &ue_context_p->ue_context;
|
||||
AssertFatal(ue_p->Srb0.Active == 1,"SRB0 is not active\n");
|
||||
ue_p->Srb0.Tx_buffer.payload_size = rrc_dl_sdu_len;
|
||||
|
||||
memcpy((void*)ue_p->Srb0.Tx_buffer.Payload,
|
||||
(void*)ie->value.choice.RRCContainer.buf,
|
||||
rrc_dl_sdu_len); // ie->value.choice.RRCContainer.size
|
||||
|
||||
ue_p->Srb0.Tx_buffer.payload_size = rrc_dl_sdu_len;
|
||||
|
||||
// NR_MAC_CellGroupConfig_t *mac_CellGroupConfig = NULL;
|
||||
// if (cellGroupConfig->mac_CellGroupConfig)
|
||||
// mac_CellGroupConfig = cellGroupConfig->mac_CellGroupConfig;
|
||||
|
||||
// rrc_mac_config_req_gNB
|
||||
break;
|
||||
} // case
|
||||
|
||||
|
||||
@@ -38,13 +38,8 @@
|
||||
|
||||
#include "rrc_extern.h"
|
||||
#include "rrc_eNB_UE_context.h"
|
||||
|
||||
// undefine C_RNTI from
|
||||
// openair1/PHY/LTE_TRANSPORT/transport_common.h which
|
||||
// replaces in ie->value.choice.C_RNTI, causing
|
||||
// a compile error
|
||||
|
||||
#undef C_RNTI
|
||||
#include "openair2/RRC/NR/rrc_gNB_UE_context.h"
|
||||
#include "openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h"
|
||||
|
||||
extern f1ap_setup_req_t *f1ap_du_data;
|
||||
extern f1ap_cudu_inst_t f1ap_du_inst[MAX_eNB];
|
||||
@@ -664,11 +659,21 @@ int DU_handle_UE_CONTEXT_RELEASE_COMMAND(instance_t instance,
|
||||
rnti, ctxt.rnti);
|
||||
int UE_out_of_sync = 0;
|
||||
|
||||
for (int n = 0; n < MAX_MOBILES_PER_ENB; ++n) {
|
||||
if (RC.mac[instance]->UE_info.active[n] == TRUE
|
||||
&& rnti == UE_RNTI(instance, n)) {
|
||||
UE_out_of_sync = RC.mac[instance]->UE_info.UE_sched_ctrl[n].ul_out_of_sync;
|
||||
break;
|
||||
if (RC.nrrrc[instance]->node_type == ngran_gNB_DU) {
|
||||
for (int n = 0; n < MAX_MOBILES_PER_GNB; ++n) {
|
||||
if (RC.nrmac[instance]->UE_info.active[n] == TRUE
|
||||
&& rnti == RC.nrmac[instance]->UE_info.rnti[n]) {
|
||||
UE_out_of_sync = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for (int n = 0; n < MAX_MOBILES_PER_ENB; ++n) {
|
||||
if (RC.mac[instance]->UE_info.active[n] == TRUE
|
||||
&& rnti == UE_RNTI(instance, n)) {
|
||||
UE_out_of_sync = RC.mac[instance]->UE_info.UE_sched_ctrl[n].ul_out_of_sync;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -718,6 +723,15 @@ int DU_handle_UE_CONTEXT_RELEASE_COMMAND(instance_t instance,
|
||||
}
|
||||
}
|
||||
|
||||
if (RC.nrrrc[instance]->node_type == ngran_gNB_DU) {
|
||||
// struct rrc_gNB_ue_context_s *ue_context_p;
|
||||
|
||||
f1ap_ue_context_release_cplt_t cplt;
|
||||
cplt.rnti = ctxt.rnti;
|
||||
DU_send_UE_CONTEXT_RELEASE_COMPLETE(instance, &cplt);
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct rrc_eNB_ue_context_s *ue_context_p;
|
||||
|
||||
ue_context_p = rrc_eNB_get_ue_context(RC.rrc[ctxt.module_id], ctxt.rnti);
|
||||
|
||||
Reference in New Issue
Block a user