Commit f8607ae6 authored by Vijitha M's avatar Vijitha M

Xn Handover request/ack- split

parent a108c031
......@@ -56,4 +56,5 @@ typedef enum { CPtype = 0, UPtype } E1_t;
#define GTPV1_U_PORT_NUMBER (2152)
typedef enum { non_dynamic, dynamic } fiveQI_type_t;
#define maxSRBs 4
#endif
......@@ -12,6 +12,7 @@
# define NUMBER_OF_SRS_MAX 16
# define NUMBER_OF_SCH_STATS_MAX 16
#define NUMBER_OF_DU_PER_CU_MAX 2
#define MAX_MANAGED_ENB_PER_MOBILE 2
#define MAX_MANAGED_GNB_PER_MOBILE 2
......
......@@ -423,6 +423,12 @@ typedef struct f1ap_ue_context_setup_s {
ReconfigurationCompl_t ReconfigComplOutcome;
uint8_t *rrc_container;
int rrc_container_length;
uint16_t mcc;
uint16_t mnc;
uint8_t mnc_digit_length;
uint16_t *crnti;
uint8_t *transmission_action_indicator;
} f1ap_ue_context_setup_t, f1ap_ue_context_modif_req_t, f1ap_ue_context_modif_resp_t;
typedef enum F1ap_Cause_e {
......@@ -439,6 +445,7 @@ typedef struct f1ap_ue_context_modif_required_t {
du_to_cu_rrc_information_t *du_to_cu_rrc_information;
f1ap_Cause_t cause;
long cause_value;
uint8_t *transmission_action_indicator; //not sure
} f1ap_ue_context_modif_required_t;
typedef struct f1ap_ue_context_modif_confirm_t {
......
......@@ -269,9 +269,10 @@ typedef struct xnap_ue_context_info_s {
} xnap_ue_context_info_t;
typedef struct xnap_handover_req_s {
int rnti; /* used for RRC->XNAP in source */
int xn_id; /* used for XNAP->RRC in target*/
uint32_t ng_node_ue_xnap_id;
int ue_id; /* used for RRC->XNAP in source */
//int xn_id; /* used for XNAP->RRC in target*/
uint32_t s_ng_node_ue_xnap_id;
uint32_t t_ng_node_ue_xnap_id;
xnap_plmn_t plmn_id;
xnap_Cause_t cause_type;
xnap_ngran_cgi_t target_cgi;
......@@ -280,14 +281,16 @@ typedef struct xnap_handover_req_s {
} xnap_handover_req_t;
typedef struct xnap_handover_req_ack_s {
uint32_t ng_node_ue_xnap_id;
int rnti;
int xn_id_target;
int ue_id;
uint32_t s_ng_node_ue_xnap_id;
uint32_t t_ng_node_ue_xnap_id;
xnap_ngran_cgi_t target_cgi;
xnap_plmn_t plmn_id;
xnap_guami_t guami;
xnap_ue_context_info_t ue_context;
xnap_uehistory_info_t uehistory_info;
uint8_t rrc_buffer[8192];
int rrc_buffer_size;
} xnap_handover_req_ack_t;
typedef struct xnap_handover_req_failure_s{
......
......@@ -574,6 +574,7 @@ int CU_send_UE_CONTEXT_SETUP_REQUEST(sctp_assoc_t assoc_id, f1ap_ue_context_setu
// return -1;
// }
LOG_D(F1AP,"F1AP UEContextSetupRequest Encoded %u bits\n", len);
LOG_I(F1AP,"F1AP UEContextSetupRequest Encoded %u bits\n", len);
f1ap_itti_send_sctp_data_req(assoc_id, buffer, len);
return 0;
}
......
......@@ -288,7 +288,7 @@ int DU_handle_UE_CONTEXT_SETUP_REQUEST(instance_t instance, sctp_assoc_t assoc_i
} else {
LOG_W(F1AP, "can't find RRCContainer in UEContextSetupRequestIEs by id %ld \n", F1AP_ProtocolIE_ID_id_RRCContainer);
}
LOG_I(F1AP, "F1AP UE context setup handled in DU\n");
ue_context_setup_request(f1ap_ue_context_setup_req);
return 0;
}
......
......@@ -146,6 +146,7 @@
#include "cmake_targets/ran_build/build/openair2/RRC/NR/MESSAGES/NR_HandoverPreparationInformation.h"
#include "cmake_targets/ran_build/build/openair2/RRC/NR/MESSAGES/NR_HandoverPreparationInformation-IEs.h"
#include "cmake_targets/ran_build/build/openair2/RRC/NR/MESSAGES/NR_UE-CapabilityRAT-Container.h"
#include "NR_HandoverCommand.h"
//#define XER_PRINT
......@@ -1273,3 +1274,30 @@ int do_NRHandoverPreparation(char *ho_buf, int ho_size, NR_UE_NR_Capability_t *
return((enc_rval.encoded+7)/8);
}
int16_t do_NR_HandoverCommand(uint8_t *ho_buf, int16_t ho_size, uint8_t *rrc_buffer, int16_t rrc_size) {
NR_HandoverCommand_t *ho_command = calloc(1,sizeof(NR_HandoverCommand_t));
ho_command->criticalExtensions.present = NR_HandoverCommand__criticalExtensions_PR_c1;
ho_command->criticalExtensions.choice.c1 = calloc(1,sizeof(struct NR_HandoverCommand__criticalExtensions__c1));
ho_command->criticalExtensions.choice.c1->present = NR_HandoverCommand__criticalExtensions__c1_PR_handoverCommand;
ho_command->criticalExtensions.choice.c1->choice.handoverCommand = calloc(1,sizeof(struct NR_HandoverCommand_IEs));
AssertFatal(OCTET_STRING_fromBuf(&ho_command->criticalExtensions.choice.c1->choice.handoverCommand->handoverCommandMessage, (char *)rrc_buffer, rrc_size) != -1,
"fatal: OCTET_STRING_fromBuf failed\n");
xer_fprint(stdout,&asn_DEF_NR_HandoverCommand, ho_command);
asn_enc_rval_t enc_rval = uper_encode_to_buffer(&asn_DEF_NR_HandoverCommand,
NULL,
ho_command,
ho_buf,
ho_size);
AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n",
enc_rval.failed_type->name, enc_rval.encoded);
return ((enc_rval.encoded+7)/8);
}
......@@ -148,5 +148,6 @@ void free_defaultMeasConfig(NR_MeasConfig_t *mc);
uint8_t do_NR_Paging(uint8_t Mod_id, uint8_t *buffer, uint32_t tmsi);
int do_NRHandoverPreparation(char *ho_buf, int ho_size, NR_UE_NR_Capability_t *ue_nr_cap, int rrc_size);
int16_t do_NR_HandoverCommand(uint8_t *ho_buf, int16_t ho_size, uint8_t *rrc_buffer, int16_t rrc_size);
#endif /* __RRC_NR_MESSAGES_ASN1_MSG__H__ */
......@@ -251,6 +251,7 @@ typedef enum {
typedef struct gNB_RRC_UE_s {
drb_t established_drbs[MAX_DRBS_PER_UE];
uint8_t DRB_active[MAX_DRBS_PER_UE];
NR_DRB_ToReleaseList_t *DRB_ReleaseList;
NR_SRB_INFO_TABLE_ENTRY Srb[NR_NUM_SRB];
......@@ -437,6 +438,8 @@ typedef struct gNB_RRC_INST_s {
RB_HEAD(rrc_neigh_cell_tree, nr_rrc_neighcells_container_t) neighs; // Neighbouring cells, indexed by assoc_id
size_t num_neighs;
instance_t f1_instance;
} gNB_RRC_INST;
#include "nr_rrc_proto.h" //should be put here otherwise compilation error
......
......@@ -34,5 +34,7 @@
#include "COMMON/mac_rrc_primitives.h"
#include "LAYER2/RLC/rlc.h"
#include "openair2/RRC/common.h"
extern uint16_t ho_rnti_map[NUMBER_OF_DU_PER_CU_MAX][4];
void openair_rrc_gNB_configuration(gNB_RRC_INST *rrc, gNB_RrcConfigurationReq *configuration);
#endif
......@@ -99,7 +99,8 @@ rrc_gNB_generate_RRCRelease(
const protocol_ctxt_t *const ctxt_pP,
rrc_gNB_ue_context_t *const ue_context_pP
);
void rrc_gNB_process_handoverprepinfo(sctp_assoc_t assoc_id, xnap_handover_req_t *m);
void rrc_gNB_process_handover_req_ack(sctp_assoc_t assoc_id, xnap_handover_req_ack_t *m);
/**\brief RRC eNB task.
\param args_p Pointer on arguments to start the task. */
void *rrc_gnb_task(void *args_p);
......
This diff is collapsed.
......@@ -184,6 +184,25 @@ uint8_t get_next_available_drb_id(gNB_RRC_UE_t *ue)
return DRB_INACTIVE;
}
uint8_t next_available_drb(gNB_RRC_UE_t *ue, rrc_pdu_session_param_t *pdusession, bool is_gbr)
{
uint8_t drb_id;
if (0 /*!is_gbr*/) { /* Find if Non-GBR DRB exists in the same PDU Session */
for (drb_id = 0; drb_id < MAX_DRBS_PER_UE; drb_id++)
if (pdusession->param.used_drbs[drb_id] == DRB_ACTIVE_NONGBR)
return drb_id + 1;
}
/* GBR Flow or a Non-GBR DRB does not exist in the same PDU Session, find an available DRB */
for (drb_id = 0; drb_id < MAX_DRBS_PER_UE; drb_id++)
if (ue->DRB_active[drb_id] == DRB_INACTIVE)
return drb_id + 1;
/* From this point, we need to handle the case that all DRBs are already used by the UE. */
LOG_E(RRC, "Error - All the DRBs are used - Handle this\n");
return DRB_INACTIVE;
}
bool drb_is_active(gNB_RRC_UE_t *ue, uint8_t drb_id)
{
drb_t *drb = get_drb(ue, drb_id);
......
......@@ -60,7 +60,7 @@ drb_t *generateDRB(gNB_RRC_UE_t *ue,
/// @brief return the next available (inactive) DRB ID of UE ue
uint8_t get_next_available_drb_id(gNB_RRC_UE_t *ue);
uint8_t next_available_drb(gNB_RRC_UE_t *ue, rrc_pdu_session_param_t *pdusession, bool is_gbr);
/// @brief check if DRB with ID drb_id of UE ue is active
bool drb_is_active(gNB_RRC_UE_t *ue, uint8_t drb_id);
......
This diff is collapsed.
......@@ -344,7 +344,7 @@ int xnap_gNB_handle_handover_request(instance_t instance, sctp_assoc_t assoc_id,
xnap_gNB_instance_t *instance_p;
xnap_id_manager *id_manager;
//xnap_gNB_data_t *xnap_gNB_data;
int ue_id;
int xn_id;
instance_p = xnap_gNB_get_instance(instance);
......@@ -372,25 +372,26 @@ int xnap_gNB_handle_handover_request(instance_t instance, sctp_assoc_t assoc_id,
LOG_E(XNAP, "XNAP_ProtocolIE_ID_id_sourceNG_RANnodeUEXnAPID, is NULL pointer \n");
return -1;
}else{
LOG_I(XNAP, "ue xnap id %d \n", req->ng_node_ue_xnap_id);
req->s_ng_node_ue_xnap_id = ie->value.choice.NG_RANnodeUEXnAPID;
LOG_I(XNAP, "ue xnap id %d \n", req->s_ng_node_ue_xnap_id);
}
id_manager = &instance_p->id_manager;
xnap_id_manager_init(id_manager);
ue_id = xnap_allocate_new_id(id_manager);
xn_id = xnap_allocate_new_id(id_manager);
if (ue_id == -1) {
if (xn_id == -1) {
LOG_E(XNAP,"could not allocate a new XNAP UE ID\n");
/* TODO: cancel handover: send HO preparation failure to source eNB */
exit(1);
}
xnap_set_ids(&instance_p->id_manager, ue_id, 0, ie->value.choice.NG_RANnodeUEXnAPID, ue_id);
xnap_id_set_state(&instance_p->id_manager, ue_id, XNID_STATE_TARGET);
//xnap_set_ids(&instance_p->id_manager, xn_id , 0, req->s_ng_node_ue_xnap_id, xn_id);
//xnap_id_set_state(&instance_p->id_manager, xn_id, XNID_STATE_TARGET);
XNAP_HANDOVER_REQ(message_p).xn_id = ue_id;
req->t_ng_node_ue_xnap_id = xn_id;
/*// Target Cell Global ID
XNAP_FIND_PROTOCOLIE_BY_ID(XNAP_HandoverRequest_IEs_t, ie, xnHandoverRequest, XNAP_ProtocolIE_ID_id_TargetCellCGI,true);
......@@ -428,27 +429,26 @@ int xnap_gNB_handle_handover_response(instance_t instance, sctp_assoc_t assoc_id
XNAP_HandoverRequestAcknowledge_t *xnHandoverRequestAck;
XNAP_HandoverRequestAcknowledge_IEs_t *ie;
xnap_gNB_instance_t *instance_p;
instance_p = xnap_gNB_get_instance(instance);
instance_p = xnap_gNB_get_instance(0);
//xnap_id_manager *id_manager;
//xnap_gNB_data_t *xnap_gNB_data;
int ue_id;
/*xnap_id_manager *id_manager;
xnap_gNB_data_t *xnap_gNB_data;
int ue_id;
int id_source;
int id_target;
int rnti;
int rnti;*/
DevAssert (pdu != NULL);
xnHandoverRequestAck = &pdu->choice.successfulOutcome->value.choice.HandoverRequestAcknowledge;
/*
if (stream == 0) {
LOG_E(XNAP,"Received new xn handover response on stream == 0\n");
return 0;
}
*/
MessageDef *message_p = itti_alloc_new_message(TASK_XNAP, 0, XNAP_HANDOVER_REQ_ACK);
message_p->ittiMsgHeader.originInstance = assoc_id;
//xnap_handover_req_ack_t *req = &XNAP_HANDOVER_REQ_ACK(message_p);
xnap_handover_req_ack_t *ack = &XNAP_HANDOVER_REQ_ACK(message_p);
//Source NG-RAN node UE XnAP ID
XNAP_FIND_PROTOCOLIE_BY_ID(XNAP_HandoverRequestAcknowledge_IEs_t, ie, xnHandoverRequestAck, XNAP_ProtocolIE_ID_id_sourceNG_RANnodeUEXnAPID, true);
......@@ -458,16 +458,35 @@ if (stream == 0) {
return -1;
}
id_source = ie->value.choice.NG_RANnodeUEXnAPID;
XNAP_FIND_PROTOCOLIE_BY_ID(XNAP_HandoverRequestAcknowledge_IEs_t, ie, xnHandoverRequestAck, XNAP_ProtocolIE_ID_id_targetCellGlobalID, true);
ack->s_ng_node_ue_xnap_id = ie->value.choice.NG_RANnodeUEXnAPID;
/* XNAP_FIND_PROTOCOLIE_BY_ID(XNAP_HandoverRequestAcknowledge_IEs_t, ie, xnHandoverRequestAck, XNAP_ProtocolIE_ID_id_targetCellGlobalID, true);
if (ie == NULL) {
LOG_E(XNAP, "XNAP_ProtocolIE_ID_id_targetCellGlobalID, is NULL pointer \n");
itti_free(ITTI_MSG_ORIGIN_ID(message_p),message_p);
return -1;
}
*/
XNAP_FIND_PROTOCOLIE_BY_ID(XNAP_HandoverRequestAcknowledge_IEs_t, ie, xnHandoverRequestAck, XNAP_ProtocolIE_ID_id_Target2SourceNG_RANnodeTranspContainer, true);
if (ie == NULL) {
LOG_E(XNAP, "iXNAP_ProtocolIE_ID_id_Target2SourceNG_RANnodeTranspContainer is NULL pointer \n");
itti_free(ITTI_MSG_ORIGIN_ID(message_p),message_p);
return -1;
}
OCTET_STRING_t *c = &ie->value.choice.OCTET_STRING;
if (c->size > 1024){
LOG_I(XNAP,"c is not NULL");
}
//{ printf("%s:%d: fatal: buffer too big\n", __FILE__, __LINE__); abort(); }
memcpy(ack->rrc_buffer, c->buf, c->size);
ack->rrc_buffer_size = c->size;
//memcpy(XNAP_HANDOVER_REQ_ACK(message_p).rrc_buffer, ie->value.choice.OCTET_STRING.buf, ie->value.choice.OCTET_STRING.size);
//XNAP_HANDOVER_REQ_ACK(message_p).rrc_buffer_size = ie->value.choice.OCTET_STRING.size;
/*
id_target = ie->value.choice.NG_RANnodeUEXnAPID_1;
ue_id = id_source;
......@@ -482,7 +501,7 @@ if (stream == 0) {
//xnap_set_reloc_overall_timer(&instance_p->id_manager, ue_id,xnap_timer_get_tti(&instance_p->timers));
XNAP_HANDOVER_REQ_ACK(message_p).rnti = rnti;
*/
itti_send_msg_to_task(TASK_RRC_GNB, instance_p->instance, message_p);
return 0;
......
......@@ -207,37 +207,34 @@ static void xnap_gNB_handle_sctp_association_ind(instance_t instance, sctp_new_a
}
static
void xnap_gNB_handle_handover_req(instance_t instance,
void xnap_gNB_handle_handover_prep(instance_t instance,
xnap_handover_req_t *xnap_handover_req)
{
xnap_gNB_instance_t *instance_p;
//xnap_gNB_data_t *target;
xnap_id_manager *id_manager;
int ue_id;
sctp_assoc_t assoc_id;
int target_nci = xnap_handover_req->target_cgi.cgi;
instance_p = xnap_gNB_get_instance(instance);
DevAssert(instance_p != NULL);
//target = xnap_is_gNB_pci_in_list(target_pci);Write new function for this if needed
//DevAssert(target != NULL);
int target_nci = xnap_handover_req->target_cgi.cgi;
assoc_id = xnap_gNB_get_assoc_id(instance_p,target_nci);
/* allocate xnap ID */
id_manager = &instance_p->id_manager;
xnap_id_manager_init(id_manager);
ue_id = xnap_allocate_new_id(id_manager);
//MessageDef *message_p = itti_alloc_new_message(TASK_XNAP, 0, XNAP_HANDOVER_REQ);
//message_p->ittiMsgHeader.originInstance = assoc_id;
assoc_id = xnap_gNB_get_assoc_id(instance_p,target_nci);
int xn_id = xnap_allocate_new_id(id_manager);
LOG_I(XNAP, "NR Cell ID: %d \n",target_nci);
LOG_I(XNAP, "Association ID: %d \n",assoc_id);
//xnap_handover_req_t *req = &XNAP_HANDOVER_REQ(message_p);
if (ue_id == -1) {
if (xn_id == -1) {
LOG_E(XNAP,"could not allocate a new XNAP UE ID\n");
/* TODO: cancel handover: send (to be defined) message to RRC */
exit(1);
}
xnap_handover_req->s_ng_node_ue_xnap_id = xn_id;
xnap_set_ids(id_manager, xnap_handover_req->s_ng_node_ue_xnap_id, xnap_handover_req->ue_id, xnap_handover_req->s_ng_node_ue_xnap_id, 0);
/* id_source is ue_id, id_target is unknown yet */
//xnap_set_ids(id_manager, ue_id, xnap_handover_req->rnti, ue_id, -1); //use?ho req structure wont have rnti- take from where it belongs to.
//xnap_id_set_state(id_manager, ue_id, XNID_STATE_SOURCE_PREPARE);// use?
......@@ -267,9 +264,7 @@ void *xnap_task(void *arg)
break;
case XNAP_REGISTER_GNB_REQ: {
xnap_setup_req_t *xnsetupmsg = &XNAP_REGISTER_GNB_REQ(received_msg).setup_req;
xnap_net_config_t *xn_nc = &XNAP_REGISTER_GNB_REQ(received_msg).net_config;
createXninst(ITTI_MSG_DESTINATION_INSTANCE(received_msg), xnsetupmsg, xn_nc);
xnap_gNB_init_sctp(ITTI_MSG_DESTINATION_INSTANCE(received_msg), xn_nc);
} break;
......@@ -282,7 +277,7 @@ void *xnap_task(void *arg)
break;
case XNAP_HANDOVER_REQ: // from rrc
xnap_gNB_handle_handover_req(ITTI_MSG_ORIGIN_INSTANCE(received_msg),
xnap_gNB_handle_handover_prep(ITTI_MSG_ORIGIN_INSTANCE(received_msg),
&XNAP_HANDOVER_REQ(received_msg));
break;
case XNAP_HANDOVER_REQ_ACK:
......
......@@ -28,16 +28,16 @@ void xnap_id_manager_init(xnap_id_manager *m)
int i;
memset(m, 0, sizeof(xnap_id_manager));
for (i = 0; i < XNAP_MAX_IDS; i++)
m->ids[i].rnti = -1;
m->ids[i].cu_ue_id = -1;
}
int xnap_allocate_new_id(xnap_id_manager *m)
{
int i;
printf("rnti: %d \n",m->ids[0].rnti);
printf("cu_ue_id: %d \n",m->ids[0].cu_ue_id);
for (i = 0; i < XNAP_MAX_IDS; i++)
if (m->ids[i].rnti == -1) {
m->ids[i].rnti = 0;
if (m->ids[i].cu_ue_id == -1) {
m->ids[i].cu_ue_id = 0;
m->ids[i].id_source = -1;
m->ids[i].id_target = -1;
return i;
......@@ -47,14 +47,14 @@ int xnap_allocate_new_id(xnap_id_manager *m)
void xnap_release_id(xnap_id_manager *m, int id)
{
m->ids[id].rnti = -1;
m->ids[id].cu_ue_id = -1;
}
int xnap_find_id(xnap_id_manager *m, int id_source, int id_target)
{
int i;
for (i = 0; i < XNAP_MAX_IDS; i++)
if (m->ids[i].rnti != -1 &&
if (m->ids[i].cu_ue_id != -1 &&
m->ids[i].id_source == id_source &&
m->ids[i].id_target == id_target)
return i;
......@@ -65,7 +65,7 @@ int xnap_find_id_from_id_source(xnap_id_manager *m, int id_source)
{
int i;
for (i = 0; i < XNAP_MAX_IDS; i++)
if (m->ids[i].rnti != -1 &&
if (m->ids[i].cu_ue_id != -1 &&
m->ids[i].id_source == id_source)
return i;
return -1;
......@@ -75,24 +75,24 @@ int xnap_find_id_from_id_target(xnap_id_manager *m, int id_target)
{
int i;
for (i = 0; i < XNAP_MAX_IDS; i++)
if (m->ids[i].rnti != -1 &&
if (m->ids[i].cu_ue_id != -1 &&
m->ids[i].id_target == id_target)
return i;
return -1;
}
int xnap_find_id_from_rnti(xnap_id_manager *m, int rnti)
int xnap_find_id_from_cu_ue_id(xnap_id_manager *m, int cu_ue_id)
{
int i;
for (i = 0; i < XNAP_MAX_IDS; i++)
if (m->ids[i].rnti == rnti)
if (m->ids[i].cu_ue_id == cu_ue_id)
return i;
return -1;
}
void xnap_set_ids(xnap_id_manager *m, int ue_id, int rnti, int id_source, int id_target)
void xnap_set_ids(xnap_id_manager *m, int ue_id, int cu_ue_id, int id_source, int id_target)
{
m->ids[ue_id].rnti = rnti;
m->ids[ue_id].cu_ue_id = cu_ue_id;
m->ids[ue_id].id_source = id_source;
m->ids[ue_id].id_target = id_target;
}
......@@ -138,9 +138,9 @@ int xnap_id_get_id_target(xnap_id_manager *m, int ue_id)
return m->ids[ue_id].id_target;
}
int xnap_id_get_rnti(xnap_id_manager *m, int ue_id)
int xnap_id_get_ueid(xnap_id_manager *m, int xn_id)
{
return m->ids[ue_id].rnti;
return m->ids[xn_id].cu_ue_id;
}
void *xnap_id_get_target(xnap_id_manager *m, int ue_id)
......
......@@ -43,7 +43,7 @@ typedef enum {
} xnid_state_t;
typedef struct {
int rnti; /* -1 when free */
int cu_ue_id; /* -1 when free */
int id_source;
int id_target;
......@@ -81,7 +81,8 @@ void xnap_set_dc_prep_timer(xnap_id_manager *m, int ue_id, uint64_t time);
void xnap_set_dc_overall_timer(xnap_id_manager *m, int ue_id, uint64_t time);
int xnap_id_get_id_source(xnap_id_manager *m, int ue_id);
int xnap_id_get_id_target(xnap_id_manager *m, int ue_id);
int xnap_id_get_rnti(xnap_id_manager *m, int ue_id);
int xnap_id_get_ueid(xnap_id_manager *m, int xn_id);
//int xnap_id_get_rnti(xnap_id_manager *m, int ue_id);
void *xnap_id_get_target(xnap_id_manager *m, int ue_id);
#endif /* X2AP_IDS_H_ */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment