Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
OpenXG-RAN
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
spbro
OpenXG-RAN
Commits
8d1f9259
Commit
8d1f9259
authored
May 02, 2024
by
root
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
changes-2 -2 may
parent
665e3e38
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
227 additions
and
2 deletions
+227
-2
openair2/COMMON/xnap_messages_types.h
openair2/COMMON/xnap_messages_types.h
+2
-2
openair2/F1AP/f1ap_cu_task.c
openair2/F1AP/f1ap_cu_task.c
+46
-0
openair2/RRC/NR/rrc_gNB_du.c
openair2/RRC/NR/rrc_gNB_du.c
+6
-0
openair2/XNAP/xnap_gNB_management_procedures.c
openair2/XNAP/xnap_gNB_management_procedures.c
+13
-0
openair2/XNAP/xnap_gNB_task.c
openair2/XNAP/xnap_gNB_task.c
+160
-0
No files found.
openair2/COMMON/xnap_messages_types.h
View file @
8d1f9259
...
@@ -107,7 +107,7 @@ typedef struct xnap_served_cell_info_t {
...
@@ -107,7 +107,7 @@ typedef struct xnap_served_cell_info_t {
uint16_t
nr_pci
;
// NR Physical Cell Ids
uint16_t
nr_pci
;
// NR Physical Cell Ids
/* Tracking area code */
/* Tracking area code */
uint32_t
tac
;
uint32_t
*
tac
;
xnap_mode_t
mode
;
xnap_mode_t
mode
;
union
{
union
{
...
@@ -122,7 +122,7 @@ typedef struct xnap_setup_req_s {
...
@@ -122,7 +122,7 @@ typedef struct xnap_setup_req_s {
uint64_t
gNB_id
;
uint64_t
gNB_id
;
/* Tracking area code */
/* Tracking area code */
uint16_t
num_tai
;
uint16_t
num_tai
;
uint32_t
tai_support
;
uint32_t
*
tai_support
;
xnap_plmn_t
plmn_support
;
xnap_plmn_t
plmn_support
;
// Number of slide support items
// Number of slide support items
uint16_t
num_snssai
;
uint16_t
num_snssai
;
...
...
openair2/F1AP/f1ap_cu_task.c
View file @
8d1f9259
...
@@ -118,6 +118,52 @@ static void cu_task_send_sctp_init_req(instance_t instance, char *my_addr) {
...
@@ -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
);
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
)
{
void
*
F1AP_CU_task
(
void
*
arg
)
{
MessageDef
*
received_msg
=
NULL
;
MessageDef
*
received_msg
=
NULL
;
int
result
;
int
result
;
...
...
openair2/RRC/NR/rrc_gNB_du.c
View file @
8d1f9259
...
@@ -177,6 +177,12 @@ void rrc_gNB_process_f1_setup_req(f1ap_setup_req_t *req, sctp_assoc_t assoc_id)
...
@@ -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
));
AssertFatal
(
num
==
3
,
"could not read RRC version string %s
\n
"
,
TO_STRING
(
NR_RRC_VERSION
));
if
(
rrc
->
node_name
!=
NULL
)
if
(
rrc
->
node_name
!=
NULL
)
resp
.
gNB_CU_name
=
strdup
(
rrc
->
node_name
);
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
);
rrc
->
mac_rrc
.
f1_setup_response
(
assoc_id
,
&
resp
);
/*
/*
...
...
openair2/XNAP/xnap_gNB_management_procedures.c
View file @
8d1f9259
...
@@ -79,6 +79,19 @@ void createXninst(instance_t instanceP, xnap_setup_req_t *req, xnap_net_config_t
...
@@ -79,6 +79,19 @@ void createXninst(instance_t instanceP, xnap_setup_req_t *req, xnap_net_config_t
pthread_mutex_unlock
(
&
xn_inst_mtx
);
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
)
void
xnap_dump_trees
(
const
instance_t
instance
)
{
{
pthread_mutex_lock
(
&
xn_inst_mtx
);
pthread_mutex_lock
(
&
xn_inst_mtx
);
...
...
openair2/XNAP/xnap_gNB_task.c
View file @
8d1f9259
...
@@ -43,6 +43,166 @@
...
@@ -43,6 +43,166 @@
RB_PROTOTYPE
(
xnap_gnb_tree
,
xnap_gNB_data_t
,
entry
,
xnap_gNB_compare_assoc_id
);
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
)
void
*
xnap_task
(
void
*
arg
)
{
{
MessageDef
*
received_msg
=
NULL
;
MessageDef
*
received_msg
=
NULL
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment