Commit 8d1f9259 authored by root's avatar root

changes-2 -2 may

parent 665e3e38
......@@ -107,7 +107,7 @@ typedef struct xnap_served_cell_info_t {
uint16_t nr_pci;// NR Physical Cell Ids
/* Tracking area code */
uint32_t tac;
uint32_t *tac;
xnap_mode_t mode;
union {
......@@ -122,7 +122,7 @@ typedef struct xnap_setup_req_s {
uint64_t gNB_id;
/* Tracking area code */
uint16_t num_tai;
uint32_t tai_support;
uint32_t *tai_support;
xnap_plmn_t plmn_support;
// Number of slide support items
uint16_t num_snssai;
......
......@@ -118,6 +118,52 @@ static void cu_task_send_sctp_init_req(instance_t instance, char *my_addr) {
itti_send_msg_to_task(TASK_SCTP, instance, message_p);
}
void cu_register_xn(uint32_t gnb_id_num,*cell)
{
MessageDef *msg;
for (uint32_t gnb_id = 0; (gnb_id < gnb_id_num); gnb_id++) {
msg = itti_alloc_new_message(TASK_CU_F1, 0, XNAP_REGISTER_GNB_REQ);
LOG_I(XNAP, "GNB_ID: %d \n", gnb_id);
uint64_t id;
char *name = NULL;
xnap_register_gnb_req_t *req = &XNAP_REGISTER_GNB_REQ(message_p);
req->setup_req.info->tac = cell->tac;
req->setup_req.info->plmn = cell->plmn;
req->setup_req.info->nr_cellid = cell->nr_cellid;
req->setup_req.info->nr_pci = cell->nr_pci;
if (cell->mode == F1AP_MODE_TDD) {
req->setup_req.info->mode = XNAP_MODE_TDD;
req->setup_req.info.tdd = cell->tdd;
/*tdd->freqinfo.arfcn = frequencyInfoDL->absoluteFrequencyPointA;
tdd->tbw.scs = frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing;
tdd->tbw.nrb = frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth;
tdd->freqinfo.band = *frequencyInfoDL->frequencyBandList.list.array[0];*/
} else {
req->setup_req.info->mode = XNAP_MODE_FDD;
req->setup_req.info.fdd = cell->fdd;
/*fdd->dl_freqinfo.arfcn = frequencyInfoDL->absoluteFrequencyPointA;
fdd->ul_freqinfo.arfcn = *scc->uplinkConfigCommon->frequencyInfoUL->absoluteFrequencyPointA;
fdd->dl_tbw.scs = frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing;
fdd->ul_tbw.scs = scc->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing;
fdd->dl_tbw.nrb = frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth;
fdd->ul_tbw.nrb = scc->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth;
fdd->dl_freqinfo.band = *frequencyInfoDL->frequencyBandList.list.array[0];
fdd->ul_freqinfo.band = *scc->uplinkConfigCommon->frequencyInfoUL->frequencyBandList->list.array[0];*/
}
req->setup_req.info->measurement_timing_information = cell->measurement_timing_information;
gNB_RRC_INST *rrc = RC.nrrrc[0];
req->setup_req.gNB_id = rrc->node_id;
req->setup_req.tai_support = cell->tac;
req->setup_req.plmn_support = cell->plmn;
req->net_config = nc;
req->gNB_name = rrc->node_name;
itti_send_msg_to_task(TASK_XNAP, GNB_MODULE_ID_TO_INSTANCE(gnb_id), msg);
}
}
void *F1AP_CU_task(void *arg) {
MessageDef *received_msg = NULL;
int result;
......
......@@ -177,6 +177,12 @@ void rrc_gNB_process_f1_setup_req(f1ap_setup_req_t *req, sctp_assoc_t assoc_id)
AssertFatal(num == 3, "could not read RRC version string %s\n", TO_STRING(NR_RRC_VERSION));
if (rrc->node_name != NULL)
resp.gNB_CU_name = strdup(rrc->node_name);
xnap_gNB_instance_t *instance_xn = xnap_gNB_get_instance(instance);
if (instance_xn != NULL) {
LOG_D(NR_RRC, "XNAP is enabled, Triggering SCTP Association \n");
if (instance_xn.setup_req ==NULL) {
CU_register_xn(cell_info,instance_xn->nc);
rrc->mac_rrc.f1_setup_response(assoc_id, &resp);
/*
......
......@@ -79,6 +79,19 @@ void createXninst(instance_t instanceP, xnap_setup_req_t *req, xnap_net_config_t
pthread_mutex_unlock(&xn_inst_mtx);
}
void updateXninst(instance_t instanceP, xnap_setup_req_t *req, xnap_net_config_t *nc)
{
DevAssert(instanceP == 0);
pthread_mutex_lock(&xn_inst_mtx);
AssertFatal(xn_inst[instanceP] != NULL, "XN instance not found\n");
if (req)
xn_inst[instanceP]->setup_req = *req;
if (nc)
xn_inst[instanceP]->net_config = *nc;
pthread_mutex_unlock(&xn_inst_mtx);
}
void xnap_dump_trees(const instance_t instance)
{
pthread_mutex_lock(&xn_inst_mtx);
......
......@@ -43,6 +43,166 @@
RB_PROTOTYPE(xnap_gnb_tree, xnap_gNB_data_t, entry, xnap_gNB_compare_assoc_id);
static void xnap_gNB_handle_sctp_data_ind(instance_t instance, sctp_data_ind_t *sctp_data_ind);
static void xnap_gNB_handle_sctp_association_ind(instance_t instance, sctp_new_association_ind_t *sctp_new_association_ind);
// static void xnap_gNB_handle_register_gNB(instance_t instance, xnap_register_gnb_req_t *xnap_register_gNB);
static void xnap_gNB_send_sctp_assoc_req(instance_t instance_p, xnap_net_config_t *nc, int index);
static void xnap_gNB_handle_sctp_association_resp(instance_t instance, sctp_new_association_resp_t *sctp_new_association_resp);
static void xnap_gNB_handle_sctp_data_ind(instance_t instance, sctp_data_ind_t *sctp_data_ind)
{
int result;
DevAssert(sctp_data_ind != NULL);
xnap_gNB_handle_message(instance,
sctp_data_ind->assoc_id,
sctp_data_ind->stream,
sctp_data_ind->buffer,
sctp_data_ind->buffer_length);
result = itti_free(TASK_UNKNOWN, sctp_data_ind->buffer);
AssertFatal(result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result);
}
static void xnap_gNB_handle_sctp_association_resp(instance_t instance, sctp_new_association_resp_t *sctp_new_association_resp)
{
xnap_gNB_instance_t *instance_xn = xnap_gNB_get_instance(instance); // managementproc;
DevAssert(sctp_new_association_resp != NULL);
DevAssert(instance_xn != NULL);
/*Return if connection to gNB failed- to be modified if needed. (Exit on error in X2AP)*/
if (sctp_new_association_resp->sctp_state == SCTP_STATE_UNREACHABLE) {
LOG_E(XNAP,
"association with gNB failed, is it running? If no, run it first. If yes, check IP addresses in your configuration "
"file.\n");
return;
}
if (sctp_new_association_resp->sctp_state != SCTP_STATE_ESTABLISHED) {
LOG_W(XNAP,
"Received unsuccessful result for SCTP association state (%u), assoc_id (%d), instance %ld, cnx_id %u \n",
sctp_new_association_resp->sctp_state,
sctp_new_association_resp->assoc_id,
instance,
sctp_new_association_resp->ulp_cnx_id);
xnap_handle_xn_setup_message(instance,
sctp_new_association_resp->assoc_id,
sctp_new_association_resp->sctp_state == SCTP_STATE_SHUTDOWN);
// sleep(3);
// xnap_gNB_send_sctp_assoc_req(instance, &instance_xn->net_config, sctp_new_association_resp->ulp_cnx_id);
return; // exit -1 for debugging
}
xnap_gNB_data_t *xnap_gnb_data_p = calloc(1, sizeof(*xnap_gnb_data_p));
AssertFatal(xnap_gnb_data_p != NULL, "out of memory\n");
xnap_gnb_data_p->cnx_id = sctp_new_association_resp->ulp_cnx_id;
xnap_gnb_data_p->assoc_id = sctp_new_association_resp->assoc_id;
xnap_gnb_data_p->state = XNAP_GNB_STATE_WAITING;
xnap_gnb_data_p->in_streams = sctp_new_association_resp->in_streams;
xnap_gnb_data_p->out_streams = sctp_new_association_resp->out_streams;
//xnap_dump_trees(instance);
xnap_insert_gnb(instance, xnap_gnb_data_p);
xnap_dump_trees(instance);
xnap_gNB_generate_xn_setup_request(sctp_new_association_resp->assoc_id, &instance_xn->setup_req);
}
int xnap_gNB_init_sctp(instance_t instance_p, xnap_net_config_t *nc)
{
// Create and alloc new message
MessageDef *message;
sctp_init_t *sctp_init = NULL;
DevAssert(nc != NULL);
message = itti_alloc_new_message(TASK_XNAP, 0, SCTP_INIT_MSG_MULTI_REQ);
sctp_init = &message->ittiMsg.sctp_init_multi;
sctp_init->port = nc->gnb_port_for_XNC;
sctp_init->ppid = XNAP_SCTP_PPID;
sctp_init->ipv4 = 1;
sctp_init->ipv6 = 0;
sctp_init->nb_ipv4_addr = 1;
#if 0
memcpy(&sctp_init->ipv4_address,
nc->gnb_xn_ip_address,
sizeof(*nc->gnb_xn_ip_address));
#endif
sctp_init->ipv4_address[0] = inet_addr(nc->gnb_xn_ip_address.ipv4_address);
sctp_init->nb_ipv6_addr = 0;
sctp_init->ipv6_address[0] = "0:0:0:0:0:0:0:1";
return itti_send_msg_to_task(TASK_SCTP, instance_p, message);
}
static void xnap_gNB_send_sctp_assoc_req(instance_t instance, xnap_net_config_t *nc, int index)
{
MessageDef *message = NULL;
sctp_new_association_req_t *sctp_new_association_req = NULL;
DevAssert(nc != NULL);
message = itti_alloc_new_message(TASK_XNAP, 0, SCTP_NEW_ASSOCIATION_REQ);
sctp_new_association_req = &message->ittiMsg.sctp_new_association_req;
sctp_new_association_req->port = nc->gnb_port_for_XNC;
sctp_new_association_req->ppid = XNAP_SCTP_PPID;
sctp_new_association_req->in_streams = nc->sctp_streams.sctp_in_streams;
sctp_new_association_req->out_streams = nc->sctp_streams.sctp_out_streams;
memcpy(&sctp_new_association_req->remote_address,
&nc->target_gnb_xn_ip_address[index],
sizeof(nc->target_gnb_xn_ip_address[index]));
memcpy(&sctp_new_association_req->local_address, &nc->gnb_xn_ip_address, sizeof(nc->gnb_xn_ip_address));
sctp_new_association_req->ulp_cnx_id = index;
itti_send_msg_to_task(TASK_SCTP, instance, message);
}
static void xnap_gNB_handle_sctp_init_msg_multi_cnf(instance_t instance, sctp_init_msg_multi_cnf_t *m)
{
xnap_gNB_instance_t *instance_xn = xnap_gNB_get_instance(instance);
DevAssert(m != NULL);
DevAssert(instance_xn != NULL);
// instance->multi_sd = m->multi_sd;
/* Exit if CNF message reports failure.
* Failure means multi_sd < 0.
*/
if (m->multi_sd < 0) {
LOG_E(XNAP, "Error: be sure to properly configure XN in your configuration file.\n");
DevAssert(m->multi_sd >= 0);
}
/* Trying to connect to the provided list of gNB ip address */
for (int index = 0; index < instance_xn->net_config.nb_xn; index++) {
LOG_I(XNAP, "gNB[%ld] gNB id %lx index %d acting as an initiator (client)\n", instance, instance_xn->setup_req.gNB_id, index);
instance_xn->xn_target_gnb_pending_nb++;
xnap_gNB_send_sctp_assoc_req(instance, &instance_xn->net_config, index);
}
}
static void xnap_gNB_handle_sctp_association_ind(instance_t instance, sctp_new_association_ind_t *sctp_new_association_ind)
{
xnap_gNB_instance_t *instance_p = xnap_gNB_get_instance(instance);
DevAssert(instance_p != NULL);
xnap_gNB_data_t *xnap_gnb_data_p;
DevAssert(sctp_new_association_ind != NULL);
LOG_W(XNAP, "SCTP Association IND Received.\n");
//xnap_dump_trees(instance);
xnap_gnb_data_p = xnap_get_gNB(instance, sctp_new_association_ind->assoc_id);
if (xnap_gnb_data_p == NULL) {
LOG_W(XNAP, "xnap_gnb_data_p does not exist, creating new descriptor\n");
/* TODO: Create new gNB descriptor-not yet associated? */
xnap_gNB_data_t *xnap_gnb_data_p = calloc(1, sizeof(*xnap_gnb_data_p));
AssertFatal(xnap_gnb_data_p != NULL, "out of memory\n");
xnap_gnb_data_p->assoc_id = sctp_new_association_ind->assoc_id;
xnap_gnb_data_p->state = XNAP_GNB_STATE_WAITING;
xnap_gnb_data_p->in_streams = sctp_new_association_ind->in_streams;
xnap_gnb_data_p->out_streams = sctp_new_association_ind->out_streams;
//xnap_dump_trees(instance);
xnap_insert_gnb(instance, xnap_gnb_data_p);
xnap_dump_trees(instance);
} else {
xnap_gnb_data_p->in_streams = sctp_new_association_ind->in_streams;
xnap_gnb_data_p->out_streams = sctp_new_association_ind->out_streams;
LOG_W(XNAP, "Updated streams for assoc id: %d \n", sctp_new_association_ind->assoc_id);
}
xnap_dump_trees(instance);
}
void *xnap_task(void *arg)
{
MessageDef *received_msg = NULL;
......
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