Initial UL RRC Message: manage DU UE ID at CU
This commit is contained in:
@@ -53,9 +53,6 @@ int CU_handle_INITIAL_UL_RRC_MESSAGE_TRANSFER(instance_t instance,
|
||||
MessageDef *message_p;
|
||||
F1AP_InitialULRRCMessageTransfer_t *container;
|
||||
F1AP_InitialULRRCMessageTransferIEs_t *ie;
|
||||
rnti_t rnti;
|
||||
sdu_size_t ccch_sdu_len;
|
||||
int CC_id =0;
|
||||
DevAssert(pdu != NULL);
|
||||
|
||||
if (stream != 0) {
|
||||
@@ -68,6 +65,8 @@ int CU_handle_INITIAL_UL_RRC_MESSAGE_TRANSFER(instance_t instance,
|
||||
/* GNB_DU_UE_F1AP_ID */
|
||||
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_InitialULRRCMessageTransferIEs_t, ie, container,
|
||||
F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID, true);
|
||||
uint32_t du_ue_id = ie->value.choice.GNB_DU_UE_F1AP_ID;
|
||||
|
||||
/* NRCGI
|
||||
* Fixme: process NRCGI
|
||||
*/
|
||||
@@ -78,7 +77,7 @@ int CU_handle_INITIAL_UL_RRC_MESSAGE_TRANSFER(instance_t instance,
|
||||
/* RNTI */
|
||||
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_InitialULRRCMessageTransferIEs_t, ie, container,
|
||||
F1AP_ProtocolIE_ID_id_C_RNTI, true);
|
||||
rnti = ie->value.choice.C_RNTI;
|
||||
rnti_t rnti = ie->value.choice.C_RNTI;
|
||||
F1AP_InitialULRRCMessageTransferIEs_t *rrccont;
|
||||
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_InitialULRRCMessageTransferIEs_t, rrccont, container,
|
||||
F1AP_ProtocolIE_ID_id_RRCContainer, true);
|
||||
@@ -96,43 +95,21 @@ int CU_handle_INITIAL_UL_RRC_MESSAGE_TRANSFER(instance_t instance,
|
||||
}
|
||||
|
||||
// create an ITTI message and copy SDU
|
||||
if (f1ap_req(true, instance)->cell_type==CELL_MACRO_GNB) {
|
||||
message_p = itti_alloc_new_message (TASK_CU_F1, 0, F1AP_INITIAL_UL_RRC_MESSAGE);
|
||||
f1ap_initial_ul_rrc_message_t *ul_rrc = &F1AP_INITIAL_UL_RRC_MESSAGE(message_p);
|
||||
ul_rrc->nr_cellid = nr_cellid; // CU instance
|
||||
ul_rrc->crnti = rnti;
|
||||
ul_rrc->rrc_container_length = rrccont->value.choice.RRCContainer.size;
|
||||
ul_rrc->rrc_container = malloc(ul_rrc->rrc_container_length);
|
||||
memcpy(ul_rrc->rrc_container, rrccont->value.choice.RRCContainer.buf, ul_rrc->rrc_container_length);
|
||||
AssertFatal(du2cu != NULL, "no masterCellGroup in initial UL RRC message\n");
|
||||
ul_rrc->du2cu_rrc_container_length = du2cu->value.choice.DUtoCURRCContainer.size;
|
||||
ul_rrc->du2cu_rrc_container = malloc(ul_rrc->du2cu_rrc_container_length);
|
||||
memcpy(ul_rrc->du2cu_rrc_container, du2cu->value.choice.DUtoCURRCContainer.buf, ul_rrc->du2cu_rrc_container_length);
|
||||
itti_send_msg_to_task(TASK_RRC_GNB, instance, message_p);
|
||||
} else {
|
||||
message_p = itti_alloc_new_message (TASK_CU_F1, 0, RRC_MAC_CCCH_DATA_IND);
|
||||
memset (RRC_MAC_CCCH_DATA_IND (message_p).sdu, 0, CCCH_SDU_SIZE);
|
||||
ccch_sdu_len = rrccont->value.choice.RRCContainer.size;
|
||||
memcpy(RRC_MAC_CCCH_DATA_IND (message_p).sdu, rrccont->value.choice.RRCContainer.buf,
|
||||
ccch_sdu_len);
|
||||
NR_RRC_MAC_CCCH_DATA_IND (message_p).frame = 0;
|
||||
NR_RRC_MAC_CCCH_DATA_IND (message_p).slot = 0;
|
||||
NR_RRC_MAC_CCCH_DATA_IND (message_p).sdu_size = ccch_sdu_len;
|
||||
NR_RRC_MAC_CCCH_DATA_IND (message_p).nr_cellid = nr_cellid; // CU instance
|
||||
NR_RRC_MAC_CCCH_DATA_IND (message_p).rnti = rnti;
|
||||
NR_RRC_MAC_CCCH_DATA_IND (message_p).CC_id = CC_id;
|
||||
if (du2cu) {
|
||||
NR_RRC_MAC_CCCH_DATA_IND (message_p).du_to_cu_rrc_container = malloc(sizeof(OCTET_STRING_t));
|
||||
NR_RRC_MAC_CCCH_DATA_IND (message_p).du_to_cu_rrc_container->size = du2cu->value.choice.DUtoCURRCContainer.size;
|
||||
NR_RRC_MAC_CCCH_DATA_IND (message_p).du_to_cu_rrc_container->buf = malloc(du2cu->value.choice.DUtoCURRCContainer.size);
|
||||
memcpy(NR_RRC_MAC_CCCH_DATA_IND (message_p).du_to_cu_rrc_container->buf,
|
||||
du2cu->value.choice.DUtoCURRCContainer.buf,
|
||||
du2cu->value.choice.DUtoCURRCContainer.size);
|
||||
}
|
||||
itti_send_msg_to_task (TASK_RRC_ENB, instance, message_p);
|
||||
}
|
||||
AssertFatal(f1ap_req(true, instance)->cell_type == CELL_MACRO_GNB, "illegal cell type %d\n", f1ap_req(true, instance)->cell_type);
|
||||
message_p = itti_alloc_new_message(TASK_CU_F1, 0, F1AP_INITIAL_UL_RRC_MESSAGE);
|
||||
f1ap_initial_ul_rrc_message_t *ul_rrc = &F1AP_INITIAL_UL_RRC_MESSAGE(message_p);
|
||||
ul_rrc->gNB_DU_ue_id = du_ue_id;
|
||||
ul_rrc->nr_cellid = nr_cellid; // CU instance
|
||||
ul_rrc->crnti = rnti;
|
||||
ul_rrc->rrc_container_length = rrccont->value.choice.RRCContainer.size;
|
||||
ul_rrc->rrc_container = malloc(ul_rrc->rrc_container_length);
|
||||
memcpy(ul_rrc->rrc_container, rrccont->value.choice.RRCContainer.buf, ul_rrc->rrc_container_length);
|
||||
AssertFatal(du2cu != NULL, "no masterCellGroup in initial UL RRC message\n");
|
||||
ul_rrc->du2cu_rrc_container_length = du2cu->value.choice.DUtoCURRCContainer.size;
|
||||
ul_rrc->du2cu_rrc_container = malloc(ul_rrc->du2cu_rrc_container_length);
|
||||
memcpy(ul_rrc->du2cu_rrc_container, du2cu->value.choice.DUtoCURRCContainer.buf, ul_rrc->du2cu_rrc_container_length);
|
||||
itti_send_msg_to_task(TASK_RRC_GNB, instance, message_p);
|
||||
|
||||
//getCxt(true,ITTI_MSG_DESTINATION_ID(message_p))->f1ap_ue[f1ap_uid].du_ue_f1ap_id = du_ue_f1ap_id;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -145,19 +145,13 @@ int DU_handle_DL_RRC_MESSAGE_TRANSFER(instance_t instance,
|
||||
}
|
||||
|
||||
/* UL RRC Message Transfer */
|
||||
int DU_send_INITIAL_UL_RRC_MESSAGE_TRANSFER(instance_t instanceP,
|
||||
int CC_idP,
|
||||
int UE_id,
|
||||
rnti_t rntiP,
|
||||
const uint8_t *sduP,
|
||||
sdu_size_t sdu_lenP,
|
||||
const uint8_t *sdu2P,
|
||||
sdu_size_t sdu2_lenP) {
|
||||
int DU_send_INITIAL_UL_RRC_MESSAGE_TRANSFER(instance_t instanceP, const f1ap_initial_ul_rrc_message_t *msg)
|
||||
{
|
||||
F1AP_F1AP_PDU_t pdu= {0};
|
||||
F1AP_InitialULRRCMessageTransfer_t *out;
|
||||
uint8_t *buffer=NULL;
|
||||
uint32_t len=0;
|
||||
int f1ap_uid = f1ap_add_ue (DUtype, instanceP, rntiP);
|
||||
int f1ap_uid = f1ap_add_ue(DUtype, instanceP, msg->crnti);
|
||||
|
||||
if (f1ap_uid < 0 ) {
|
||||
LOG_E(F1AP, "Failed to add UE \n");
|
||||
@@ -178,7 +172,7 @@ int DU_send_INITIAL_UL_RRC_MESSAGE_TRANSFER(instance_t instanceP,
|
||||
ie1->id = F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
|
||||
ie1->criticality = F1AP_Criticality_reject;
|
||||
ie1->value.present = F1AP_InitialULRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
|
||||
ie1->value.choice.GNB_DU_UE_F1AP_ID = getCxt(DUtype, instanceP)->f1ap_ue[f1ap_uid].du_ue_f1ap_id;
|
||||
ie1->value.choice.GNB_DU_UE_F1AP_ID = msg->gNB_DU_ue_id;
|
||||
/* mandatory */
|
||||
/* c2. NRCGI */
|
||||
asn1cSequenceAdd(out->protocolIEs.list, F1AP_InitialULRRCMessageTransferIEs_t, ie2);
|
||||
@@ -193,25 +187,25 @@ int DU_send_INITIAL_UL_RRC_MESSAGE_TRANSFER(instance_t instanceP,
|
||||
ie3->id = F1AP_ProtocolIE_ID_id_C_RNTI;
|
||||
ie3->criticality = F1AP_Criticality_reject;
|
||||
ie3->value.present = F1AP_InitialULRRCMessageTransferIEs__value_PR_C_RNTI;
|
||||
ie3->value.choice.C_RNTI=rntiP;
|
||||
ie3->value.choice.C_RNTI = msg->crnti;
|
||||
/* mandatory */
|
||||
/* c4. RRCContainer */
|
||||
asn1cSequenceAdd(out->protocolIEs.list, F1AP_InitialULRRCMessageTransferIEs_t, ie4);
|
||||
ie4->id = F1AP_ProtocolIE_ID_id_RRCContainer;
|
||||
ie4->criticality = F1AP_Criticality_reject;
|
||||
ie4->value.present = F1AP_InitialULRRCMessageTransferIEs__value_PR_RRCContainer;
|
||||
OCTET_STRING_fromBuf(&ie4->value.choice.RRCContainer, (const char *)sduP, sdu_lenP);
|
||||
OCTET_STRING_fromBuf(&ie4->value.choice.RRCContainer, (const char *)msg->rrc_container, msg->rrc_container_length);
|
||||
|
||||
/* optional */
|
||||
/* c5. DUtoCURRCContainer */
|
||||
if (sdu2P) {
|
||||
if (msg->du2cu_rrc_container != NULL) {
|
||||
asn1cSequenceAdd(out->protocolIEs.list, F1AP_InitialULRRCMessageTransferIEs_t, ie5);
|
||||
ie5->id = F1AP_ProtocolIE_ID_id_DUtoCURRCContainer;
|
||||
ie5->criticality = F1AP_Criticality_reject;
|
||||
ie5->value.present = F1AP_InitialULRRCMessageTransferIEs__value_PR_DUtoCURRCContainer;
|
||||
OCTET_STRING_fromBuf(&ie5->value.choice.DUtoCURRCContainer,
|
||||
(const char *)sdu2P,
|
||||
sdu2_lenP);
|
||||
(const char *)msg->du2cu_rrc_container,
|
||||
msg->du2cu_rrc_container_length);
|
||||
}
|
||||
/* mandatory */
|
||||
/* c6. Transaction ID (integer value) */
|
||||
@@ -231,7 +225,6 @@ int DU_send_INITIAL_UL_RRC_MESSAGE_TRANSFER(instance_t instanceP,
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int DU_send_UL_NR_RRC_MESSAGE_TRANSFER(instance_t instance,
|
||||
const f1ap_ul_rrc_message_t *msg) {
|
||||
const rnti_t rnti = msg->rnti;
|
||||
|
||||
@@ -43,13 +43,6 @@ int DU_handle_DL_RRC_MESSAGE_TRANSFER(instance_t instance,
|
||||
|
||||
int DU_send_UL_NR_RRC_MESSAGE_TRANSFER(instance_t instance, const f1ap_ul_rrc_message_t *msg);
|
||||
|
||||
int DU_send_INITIAL_UL_RRC_MESSAGE_TRANSFER(instance_t instanceP,
|
||||
int CC_idP,
|
||||
int UE_id,
|
||||
rnti_t rntiP,
|
||||
const uint8_t *sduP,
|
||||
sdu_size_t sdu_lenP,
|
||||
const uint8_t *sdu2P,
|
||||
sdu_size_t sdu2_lenP);
|
||||
int DU_send_INITIAL_UL_RRC_MESSAGE_TRANSFER(instance_t instanceP, const f1ap_initial_ul_rrc_message_t *msg);
|
||||
|
||||
#endif /* F1AP_DU_RRC_MESSAGE_TRANSFER_H_ */
|
||||
|
||||
@@ -145,7 +145,7 @@ void *F1AP_DU_task(void *arg) {
|
||||
case F1AP_INITIAL_UL_RRC_MESSAGE: // from rrc
|
||||
{
|
||||
f1ap_initial_ul_rrc_message_t *msgRrc = &F1AP_INITIAL_UL_RRC_MESSAGE(msg);
|
||||
DU_send_INITIAL_UL_RRC_MESSAGE_TRANSFER(0, 0, 0, msgRrc->crnti, msgRrc->rrc_container, msgRrc->rrc_container_length, msgRrc->du2cu_rrc_container, msgRrc->du2cu_rrc_container_length);
|
||||
DU_send_INITIAL_UL_RRC_MESSAGE_TRANSFER(myInstance, msgRrc);
|
||||
} break;
|
||||
|
||||
case F1AP_UL_RRC_MESSAGE: // to rrc
|
||||
|
||||
@@ -2907,6 +2907,7 @@ void send_initial_ul_rrc_message(gNB_MAC_INST *mac, int rnti, const uint8_t *sdu
|
||||
|
||||
const f1ap_initial_ul_rrc_message_t ul_rrc_msg = {
|
||||
/* TODO: add mcc, mnc, cell_id, ..., is not available at MAC yet */
|
||||
.gNB_DU_ue_id = rnti,
|
||||
.crnti = rnti,
|
||||
.rrc_container = (uint8_t *) sdu,
|
||||
.rrc_container_length = sdu_len,
|
||||
|
||||
@@ -271,6 +271,7 @@ typedef struct gNB_RRC_UE_s {
|
||||
e_NR_IntegrityProtAlgorithm integrity_algorithm;
|
||||
|
||||
NR_UE_STATE_t StatusRrc;
|
||||
uint32_t cu_ue_id;
|
||||
rnti_t rnti;
|
||||
uint64_t random_ue_identity;
|
||||
|
||||
|
||||
+26
-12
@@ -489,7 +489,11 @@ static int rrc_gNB_generate_RRCSetup_for_RRCReestablishmentRequest(module_id_t m
|
||||
rrc_gNB_ue_context_t *ue_context_pP = NULL;
|
||||
gNB_RRC_INST *rrc_instance_p = RC.nrrrc[module_id];
|
||||
|
||||
ue_context_pP = rrc_gNB_create_ue_context(rnti, rrc_instance_p, 0);
|
||||
AssertFatal(!NODE_IS_CU(rrc_instance_p->node_type), "Not functional in F1-split: no DU UE ID available\n");
|
||||
/* for creating a UE context, we need the DU ID to be able to indicate the
|
||||
* DU. This is not yet implemented for Reestablishment. We know that in
|
||||
* monolithic, the DU UE ID is the RNTI, so use that for the moment */
|
||||
ue_context_pP = rrc_gNB_create_ue_context(rnti, rrc_instance_p, 0, rnti);
|
||||
|
||||
gNB_RRC_UE_t *ue_p = &ue_context_pP->ue_context;
|
||||
unsigned char buf[1024];
|
||||
@@ -1468,7 +1472,7 @@ int nr_rrc_reconfiguration_req(rrc_gNB_ue_context_t *const ue_context_pP
|
||||
}
|
||||
|
||||
/*------------------------------------------------------------------------------*/
|
||||
static int nr_rrc_gNB_decode_ccch(module_id_t module_id, rnti_t rnti, const uint8_t *buffer, int buffer_length, const uint8_t *du_to_cu_rrc_container, int du_to_cu_rrc_container_len)
|
||||
static int nr_rrc_gNB_decode_ccch(module_id_t module_id, const f1ap_initial_ul_rrc_message_t *msg)
|
||||
{
|
||||
module_id_t Idx;
|
||||
asn_dec_rval_t dec_rval;
|
||||
@@ -1476,9 +1480,11 @@ static int nr_rrc_gNB_decode_ccch(module_id_t module_id, rnti_t rnti, const uint
|
||||
gNB_RRC_INST *gnb_rrc_inst = RC.nrrrc[module_id];
|
||||
NR_RRCSetupRequest_IEs_t *rrcSetupRequest = NULL;
|
||||
NR_RRCReestablishmentRequest_IEs_t rrcReestablishmentRequest;
|
||||
rnti_t rnti = msg->crnti;
|
||||
|
||||
LOG_I(NR_RRC, "Decoding CCCH: RNTI %04x, payload_size %d\n", rnti, buffer_length);
|
||||
dec_rval = uper_decode(NULL, &asn_DEF_NR_UL_CCCH_Message, (void **) &ul_ccch_msg, buffer, buffer_length, 0, 0);
|
||||
LOG_I(NR_RRC, "Decoding CCCH: RNTI %04x, payload_size %d\n", rnti, msg->rrc_container_length);
|
||||
dec_rval =
|
||||
uper_decode(NULL, &asn_DEF_NR_UL_CCCH_Message, (void **)&ul_ccch_msg, msg->rrc_container, msg->rrc_container_length, 0, 0);
|
||||
|
||||
if (dec_rval.code != RC_OK || dec_rval.consumed == 0) {
|
||||
LOG_E(NR_RRC, " FATAL Error in receiving CCCH\n");
|
||||
@@ -1517,7 +1523,7 @@ static int nr_rrc_gNB_decode_ccch(module_id_t module_id, rnti_t rnti, const uint
|
||||
AssertFatal(false, "not implemented\n");
|
||||
}
|
||||
|
||||
ue_context_p = rrc_gNB_create_ue_context(rnti, gnb_rrc_inst, random_value);
|
||||
ue_context_p = rrc_gNB_create_ue_context(rnti, gnb_rrc_inst, random_value, msg->gNB_DU_ue_id);
|
||||
} else if (NR_InitialUE_Identity_PR_ng_5G_S_TMSI_Part1 == rrcSetupRequest->ue_Identity.present) {
|
||||
/* TODO */
|
||||
/* <5G-S-TMSI> = <AMF Set ID><AMF Pointer><5G-TMSI> 48-bit */
|
||||
@@ -1549,7 +1555,7 @@ static int nr_rrc_gNB_decode_ccch(module_id_t module_id, rnti_t rnti, const uint
|
||||
} else {
|
||||
LOG_I(NR_RRC, "UE %04x 5G-S-TMSI-Part1 doesn't exist, setting ng_5G_S_TMSI_Part1 => %ld\n", rnti, s_tmsi_part1);
|
||||
|
||||
ue_context_p = rrc_gNB_create_ue_context(rnti, gnb_rrc_inst, s_tmsi_part1);
|
||||
ue_context_p = rrc_gNB_create_ue_context(rnti, gnb_rrc_inst, s_tmsi_part1, msg->gNB_DU_ue_id);
|
||||
if (ue_context_p == NULL) {
|
||||
LOG_E(NR_RRC, "rrc_gNB_get_next_free_ue_context returned NULL\n");
|
||||
return -1;
|
||||
@@ -1563,7 +1569,7 @@ static int nr_rrc_gNB_decode_ccch(module_id_t module_id, rnti_t rnti, const uint
|
||||
uint64_t random_value = 0;
|
||||
memcpy(((uint8_t *)&random_value) + 3, rrcSetupRequest->ue_Identity.choice.randomValue.buf, rrcSetupRequest->ue_Identity.choice.randomValue.size);
|
||||
|
||||
ue_context_p = rrc_gNB_create_ue_context(rnti, gnb_rrc_inst, random_value);
|
||||
ue_context_p = rrc_gNB_create_ue_context(rnti, gnb_rrc_inst, random_value, msg->gNB_DU_ue_id);
|
||||
LOG_E(NR_RRC, "RRCSetupRequest without random UE identity or S-TMSI not supported, let's reject the UE %04x\n", rnti);
|
||||
rrc_gNB_generate_RRCReject(module_id, ue_context_p);
|
||||
break;
|
||||
@@ -1575,8 +1581,8 @@ static int nr_rrc_gNB_decode_ccch(module_id_t module_id, rnti_t rnti, const uint
|
||||
rrc_gNB_generate_RRCSetup(module_id,
|
||||
rnti,
|
||||
rrc_gNB_get_ue_context_by_rnti(gnb_rrc_inst, rnti),
|
||||
du_to_cu_rrc_container,
|
||||
du_to_cu_rrc_container_len);
|
||||
msg->du2cu_rrc_container,
|
||||
msg->du2cu_rrc_container_length);
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -1585,7 +1591,11 @@ static int nr_rrc_gNB_decode_ccch(module_id_t module_id, rnti_t rnti, const uint
|
||||
break;
|
||||
|
||||
case NR_UL_CCCH_MessageType__c1_PR_rrcReestablishmentRequest: {
|
||||
LOG_DUMPMSG(NR_RRC, DEBUG_RRC, (char *)(buffer), buffer_length, "[MSG] RRC Reestablishment Request\n");
|
||||
LOG_DUMPMSG(NR_RRC,
|
||||
DEBUG_RRC,
|
||||
(char *)(msg->rrc_container),
|
||||
msg->rrc_container_length,
|
||||
"[MSG] RRC Reestablishment Request\n");
|
||||
rrcReestablishmentRequest = ul_ccch_msg->message.choice.c1->choice.rrcReestablishmentRequest->rrcReestablishmentRequest;
|
||||
const NR_ReestablishmentCause_t cause = rrcReestablishmentRequest.reestablishmentCause;
|
||||
const long physCellId = rrcReestablishmentRequest.ue_Identity.physCellId;
|
||||
@@ -1662,7 +1672,11 @@ static int nr_rrc_gNB_decode_ccch(module_id_t module_id, rnti_t rnti, const uint
|
||||
// SRB2: set it to go through SRB1 with id 1 (DCCH)
|
||||
UE->Srb[2].Active = 1;
|
||||
protocol_ctxt_t ctxt = {.rntiMaybeUEid = rnti, .module_id = module_id, .instance = module_id, .enb_flag = 1, .eNB_index = module_id};
|
||||
rrc_gNB_generate_RRCReestablishment(&ctxt, ue_context_p, du_to_cu_rrc_container, gnb_rrc_inst->carrier.servingcellconfigcommon, 0);
|
||||
rrc_gNB_generate_RRCReestablishment(&ctxt,
|
||||
ue_context_p,
|
||||
msg->du2cu_rrc_container,
|
||||
gnb_rrc_inst->carrier.servingcellconfigcommon,
|
||||
0);
|
||||
|
||||
LOG_I(NR_RRC, "CALLING RLC CONFIG SRB1 (rbid %d)\n", Idx);
|
||||
} break;
|
||||
@@ -2224,7 +2238,7 @@ void rrc_gNB_process_initial_ul_rrc_message(const f1ap_initial_ul_rrc_message_t
|
||||
i = 0;
|
||||
LOG_W(RRC, "initial UL RRC message nr_cellid %ld does not match RRC's %ld\n", ul_rrc->nr_cellid, RC.nrrrc[0]->nr_cellid);
|
||||
}
|
||||
nr_rrc_gNB_decode_ccch(i, ul_rrc->crnti, ul_rrc->rrc_container, ul_rrc->rrc_container_length, ul_rrc->du2cu_rrc_container, ul_rrc->du2cu_rrc_container_length);
|
||||
nr_rrc_gNB_decode_ccch(i, ul_rrc);
|
||||
|
||||
if (ul_rrc->rrc_container)
|
||||
free(ul_rrc->rrc_container);
|
||||
|
||||
@@ -35,6 +35,7 @@
|
||||
|
||||
#include "common/utils/LOG/log.h"
|
||||
#include "rrc_gNB_UE_context.h"
|
||||
#include "openair2/F1AP/f1ap_ids.h"
|
||||
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
@@ -121,6 +122,7 @@ void rrc_gNB_remove_ue_context(gNB_RRC_INST *rrc_instance_pP, rrc_gNB_ue_context
|
||||
|
||||
RB_REMOVE(rrc_nr_ue_tree_s, &rrc_instance_pP->rrc_ue_head, ue_context_pP);
|
||||
uid_linear_allocator_free(&rrc_instance_pP->uid_allocator, ue_context_pP->ue_context.rrc_ue_id - 1);
|
||||
cu_remove_f1_ue_data(ue_context_pP->ue_context.cu_ue_id);
|
||||
rrc_gNB_free_mem_ue_context(ue_context_pP);
|
||||
LOG_I(NR_RRC, "Removed UE context\n");
|
||||
}
|
||||
@@ -165,7 +167,10 @@ void rrc_gNB_update_ue_context_rnti(rnti_t rnti, gNB_RRC_INST *rrc_instance_pP,
|
||||
}
|
||||
//-----------------------------------------------------------------------------
|
||||
// return a new ue context structure if ue_identityP, rnti not found in collection
|
||||
rrc_gNB_ue_context_t *rrc_gNB_create_ue_context(rnti_t rnti, gNB_RRC_INST *rrc_instance_pP, const uint64_t ue_identityP)
|
||||
rrc_gNB_ue_context_t *rrc_gNB_create_ue_context(rnti_t rnti,
|
||||
gNB_RRC_INST *rrc_instance_pP,
|
||||
const uint64_t ue_identityP,
|
||||
uint32_t du_ue_id)
|
||||
//-----------------------------------------------------------------------------
|
||||
{
|
||||
rrc_gNB_ue_context_t *ue_context_p = rrc_gNB_get_ue_context_by_rnti(rrc_instance_pP, rnti);
|
||||
@@ -179,9 +184,22 @@ rrc_gNB_ue_context_t *rrc_gNB_create_ue_context(rnti_t rnti, gNB_RRC_INST *rrc_i
|
||||
if (ue_context_p == NULL)
|
||||
return NULL;
|
||||
|
||||
ue_context_p->ue_context.rnti = rnti;
|
||||
ue_context_p->ue_context.random_ue_identity = ue_identityP;
|
||||
gNB_RRC_UE_t *ue = &ue_context_p->ue_context;
|
||||
ue->cu_ue_id = rnti;
|
||||
ue->rnti = rnti;
|
||||
ue->random_ue_identity = ue_identityP;
|
||||
f1_ue_data_t ue_data = {.secondary_ue = du_ue_id};
|
||||
AssertFatal(!cu_exists_f1_ue_data(ue->cu_ue_id),
|
||||
"UE F1 Context for ID %d already exists, logic bug\n",
|
||||
ue->cu_ue_id);
|
||||
cu_add_f1_ue_data(ue->cu_ue_id, &ue_data);
|
||||
|
||||
RB_INSERT(rrc_nr_ue_tree_s, &rrc_instance_pP->rrc_ue_head, ue_context_p);
|
||||
LOG_W(NR_RRC, " Created new UE context rnti: %04x, random ue id %lx, RRC ue id %u\n", rnti, ue_identityP, ue_context_p->ue_context.rrc_ue_id);
|
||||
LOG_I(NR_RRC,
|
||||
"Created new UE context: CU UE ID %u DU UE ID %u (rnti: %04x, random ue id %lx)\n",
|
||||
ue->cu_ue_id,
|
||||
du_ue_id,
|
||||
ue->rnti,
|
||||
ue->random_ue_identity);
|
||||
return ue_context_p;
|
||||
}
|
||||
|
||||
@@ -51,6 +51,9 @@ rrc_gNB_ue_context_t* rrc_gNB_ue_context_random_exist(gNB_RRC_INST* rrc_instance
|
||||
|
||||
rrc_gNB_ue_context_t* rrc_gNB_ue_context_5g_s_tmsi_exist(gNB_RRC_INST* rrc_instance_pP, const uint64_t s_TMSI);
|
||||
void rrc_gNB_update_ue_context_rnti(rnti_t rnti, gNB_RRC_INST* rrc_instance_pP, uint32_t gNB_ue_ngap_id);
|
||||
rrc_gNB_ue_context_t* rrc_gNB_create_ue_context(rnti_t rnti, gNB_RRC_INST* rrc_instance_pP, const uint64_t ue_identityP);
|
||||
rrc_gNB_ue_context_t* rrc_gNB_create_ue_context(rnti_t rnti,
|
||||
gNB_RRC_INST* rrc_instance_pP,
|
||||
const uint64_t ue_identityP,
|
||||
uint32_t du_ue_id);
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user