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
lizhongxiao
OpenXG-RAN
Commits
f9bb4150
Commit
f9bb4150
authored
Oct 03, 2021
by
Laurent Thomas
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
astyle only
parent
b7a91d56
Changes
11
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
333 additions
and
329 deletions
+333
-329
openair2/F1AP/f1ap_common.c
openair2/F1AP/f1ap_common.c
+4
-3
openair2/F1AP/f1ap_cu_interface_management.c
openair2/F1AP/f1ap_cu_interface_management.c
+19
-20
openair2/F1AP/f1ap_cu_rrc_message_transfer.c
openair2/F1AP/f1ap_cu_rrc_message_transfer.c
+0
-1
openair2/F1AP/f1ap_cu_task.c
openair2/F1AP/f1ap_cu_task.c
+9
-8
openair2/F1AP/f1ap_cu_ue_context_management.c
openair2/F1AP/f1ap_cu_ue_context_management.c
+55
-51
openair2/F1AP/f1ap_du_interface_management.c
openair2/F1AP/f1ap_du_interface_management.c
+4
-2
openair2/F1AP/f1ap_du_rrc_message_transfer.c
openair2/F1AP/f1ap_du_rrc_message_transfer.c
+4
-7
openair2/F1AP/f1ap_du_task.c
openair2/F1AP/f1ap_du_task.c
+14
-15
openair2/F1AP/f1ap_du_ue_context_management.c
openair2/F1AP/f1ap_du_ue_context_management.c
+218
-218
openair2/F1AP/f1ap_encoder.c
openair2/F1AP/f1ap_encoder.c
+2
-0
openair3/ocp-gtpu/gtp_itf.cpp
openair3/ocp-gtpu/gtp_itf.cpp
+4
-4
No files found.
openair2/F1AP/f1ap_common.c
View file @
f9bb4150
...
...
@@ -100,6 +100,7 @@ int f1ap_add_ue(F1_t isCu,
return
i
;
}
}
// We didn't find the rnti
for
(
int
i
=
0
;
i
<
MAX_MOBILES_PER_ENB
;
i
++
)
{
if
(
f1_inst
->
f1ap_ue
[
i
].
rnti
==
0
)
{
...
...
@@ -188,12 +189,12 @@ int f1ap_du_add_cu_ue_id(instance_t instanceP,
instance_t
du_ue_f1ap_id
,
instance_t
cu_ue_f1ap_id
)
{
f1ap_cudu_inst_t
*
f1_inst
=
getCxt
(
DUtype
,
instanceP
);
instance_t
f1ap_uid
=-
1
;
for
(
int
i
=
0
;
i
<
MAX_MOBILES_PER_ENB
;
i
++
)
{
if
(
f1_inst
->
f1ap_ue
[
i
].
du_ue_f1ap_id
==
du_ue_f1ap_id
)
{
f1ap_uid
=
i
;
break
;
f1ap_uid
=
i
;
break
;
}
}
...
...
openair2/F1AP/f1ap_cu_interface_management.c
View file @
f9bb4150
...
...
@@ -97,8 +97,6 @@ int CU_handle_F1_SETUP_REQUEST(instance_t instance,
/* assoc_id */
f1ap_setup_req_t
*
req
=&
getCxt
(
true
,
instance
)
->
setupReq
;
req
->
assoc_id
=
assoc_id
;
/* gNB_DU_id */
// this function exits if the ie is mandatory
...
...
@@ -124,8 +122,8 @@ int CU_handle_F1_SETUP_REQUEST(instance_t instance,
for
(
i
=
0
;
i
<
num_cells_available
;
i
++
)
{
F1AP_GNB_DU_Served_Cells_Item_t
*
served_cells_item_p
;
served_cells_item_p
=
&
(((
F1AP_GNB_DU_Served_Cells_ItemIEs_t
*
)
ie
->
value
.
choice
.
GNB_DU_Served_Cells_List
.
list
.
array
[
i
])
->
value
.
choice
.
GNB_DU_Served_Cells_Item
);
ie
->
value
.
choice
.
GNB_DU_Served_Cells_List
.
list
.
array
[
i
])
->
value
.
choice
.
GNB_DU_Served_Cells_Item
);
/* tac */
if
(
served_cells_item_p
->
served_Cell_Information
.
fiveGS_TAC
)
{
...
...
@@ -153,6 +151,7 @@ int CU_handle_F1_SETUP_REQUEST(instance_t instance,
f1ap_req
(
true
,
instance
)
->
cell_type
=
CELL_MACRO_GNB
;
else
f1ap_req
(
true
,
instance
)
->
cell_type
=
CELL_MACRO_ENB
;
LOG_I
(
F1AP
,
"Received Cell in %d context
\n
"
,
f1ap_req
(
true
,
instance
)
->
cell_type
==
CELL_MACRO_GNB
);
// System Information
/* mib */
...
...
@@ -209,10 +208,10 @@ int CU_handle_F1_SETUP_REQUEST(instance_t instance,
// uint16_t nr_sul_band[32];
// } tdd;
// } nr_mode_info[F1AP_MAX_NB_CELLS];
// We copy and store in F1 task data, RRC will free "req" as it frees all itti received messages
message_p
=
itti_alloc_new_message
(
TASK_CU_F1
,
0
,
F1AP_SETUP_REQ
);
memcpy
(
&
F1AP_SETUP_REQ
(
message_p
),
req
,
sizeof
(
f1ap_setup_req_t
)
);
if
(
num_cells_available
>
0
)
{
if
(
f1ap_req
(
true
,
instance
)
->
cell_type
==
CELL_MACRO_GNB
)
{
itti_send_msg_to_task
(
TASK_RRC_GNB
,
GNB_MODULE_ID_TO_INSTANCE
(
instance
),
message_p
);
...
...
@@ -521,14 +520,14 @@ int CU_send_gNB_CU_CONFIGURATION_UPDATE(instance_t instance, f1ap_gnb_cu_configu
ieC3->value.present = F1AP_GNBCUConfigurationUpdateIEs__value_PR_Cells_to_be_Deactivated_List;
for (int i=0; i<1; i++) {
asn1cSequenceAdd(ieC3->value.choice.Cells_to_be_Deactivated_List.list,
F1AP_Cells_to_be_Deactivated_List_ItemIEs_t, cells_to_be_deactivated);
asn1cSequenceAdd(ieC3->value.choice.Cells_to_be_Deactivated_List.list,
F1AP_Cells_to_be_Deactivated_List_ItemIEs_t, cells_to_be_deactivated);
cells_to_be_deactivated->id = F1AP_ProtocolIE_ID_id_Cells_to_be_Activated_List_Item;
cells_to_be_deactivated->criticality = F1AP_Criticality_reject;
cells_to_be_deactivated->value.present = F1AP_Cells_to_be_Deactivated_List_ItemIEs__value_PR_Cells_to_be_Deactivated_List_Item;
// 3.1 cells to be Deactivated list item
F1AP_Cells_to_be_Deactivated_List_Item_t *cells_to_be_deactivated_list=
cells_to_be_deactivated->value.choice.Cells_to_be_Deactivated_List_Item;
cells_to_be_deactivated->value.choice.Cells_to_be_Deactivated_List_Item;
addnRCGI(cells_to_be_deactivated_item->nRCGI, f1ap_setup_resp->cells_to_deactivate+i);
}
}
...
...
@@ -543,19 +542,19 @@ int CU_send_gNB_CU_CONFIGURATION_UPDATE(instance_t instance, f1ap_gnb_cu_configu
for (int i=0; i<1; i++) {
asn1cSequenceAdd(ieC4->value.choice.GNB_CU_TNL_Association_To_Add_List.list,
F1AP_GNB_CU_TNL_Association_To_Add_ItemIEs_t, gnb_cu_tnl_association_to_add;
F1AP_GNB_CU_TNL_Association_To_Add_ItemIEs_t, gnb_cu_tnl_association_to_add;
gnb_cu_tnl_association_to_add->id = F1AP_ProtocolIE_ID_id_GNB_CU_TNL_Association_To_Add_Item;
gnb_cu_tnl_association_to_add->criticality = F1AP_Criticality_reject;
gnb_cu_tnl_association_to_add->value.present = F1AP_GNB_CU_TNL_Association_To_Add_ItemIEs__value_PR_GNB_CU_TNL_Association_To_Add_Item;
// 4.1 GNB_CU_TNL_Association_To_Add_Item
F1AP_GNB_CU_TNL_Association_To_Add_Item_t *gnb_cu_tnl_association_to_add_item=
&gnb_cu_tnl_association_to_add_item_ies->value.choice.GNB_CU_TNL_Association_To_Add_Item;
&gnb_cu_tnl_association_to_add_item_ies->value.choice.GNB_CU_TNL_Association_To_Add_Item;
// 4.1.1 tNLAssociationTransportLayerAddress
F1AP_CP_TransportLayerAddress_t *transportLayerAddress=;
gnb_cu_tnl_association_to_add->value.choice.GNB_CU_TNL_Association_To_Add_Item;
gnb_cu_tnl_association_to_add->value.choice.GNB_CU_TNL_Association_To_Add_Item;
transportLayerAddress->present = F1AP_CP_TransportLayerAddress_PR_endpoint_IP_address;
TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(1234, &transportLayerAddress->choice.endpoint_IP_address);
...
...
@@ -577,18 +576,18 @@ int CU_send_gNB_CU_CONFIGURATION_UPDATE(instance_t instance, f1ap_gnb_cu_configu
ieC5->value.present = F1AP_GNBCUConfigurationUpdateIEs__value_PR_GNB_CU_TNL_Association_To_Remove_List;
for (int i=0; i<1; i++) {
asn1cSequenceAdd(ieC5->value.choice.GNB_CU_TNL_Association_To_Remove_List.list,
F1AP_GNB_CU_TNL_Association_To_Remove_ItemIEs_t, gnb_cu_tnl_association_to_remove);
F1AP_GNB_CU_TNL_Association_To_Remove_ItemIEs_t, gnb_cu_tnl_association_to_remove);
gnb_cu_tnl_association_to_remove->id = F1AP_ProtocolIE_ID_id_GNB_CU_TNL_Association_To_Remove_Item;
gnb_cu_tnl_association_to_remove->criticality = F1AP_Criticality_reject;
gnb_cu_tnl_association_to_remove->value.present = F1AP_GNB_CU_TNL_Association_To_Remove_ItemIEs__value_PR_GNB_CU_TNL_Association_To_Remove_Item;
// 4.1 GNB_CU_TNL_Association_To_Remove_Item
F1AP_GNB_CU_TNL_Association_To_Remove_Item_t *gnb_cu_tnl_association_to_remove_item=
&gnb_cu_tnl_association_to_remove->value.choice.GNB_CU_TNL_Association_To_Remove_Item;
&gnb_cu_tnl_association_to_remove->value.choice.GNB_CU_TNL_Association_To_Remove_Item;
// 4.1.1 tNLAssociationTransportLayerAddress
F1AP_CP_TransportLayerAddress_t *transportLayerAddress=
&gnb_cu_tnl_association_to_remove_item->tNLAssociationTransportLayerAddress;
&gnb_cu_tnl_association_to_remove_item->tNLAssociationTransportLayerAddress;
transportLayerAddress->present = F1AP_CP_TransportLayerAddress_PR_endpoint_IP_address;
TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(1234, &transportLayerAddress->choice.endpoint_IP_address);
...
...
@@ -609,7 +608,7 @@ int CU_send_gNB_CU_CONFIGURATION_UPDATE(instance_t instance, f1ap_gnb_cu_configu
for (int i=0; i<1; i++) {
asn1cSequenceAdd(ieC3->value.choice.GNB_CU_TNL_Association_To_Update_List.list,
F1AP_GNB_CU_TNL_Association_To_Update_ItemIEs_t, gnb_cu_tnl_association_to_update);
F1AP_GNB_CU_TNL_Association_To_Update_ItemIEs_t, gnb_cu_tnl_association_to_update);
gnb_cu_tnl_association_to_update->id = F1AP_ProtocolIE_ID_id_GNB_CU_TNL_Association_To_Update_Item;
gnb_cu_tnl_association_to_update->criticality = F1AP_Criticality_reject;
gnb_cu_tnl_association_to_update->value.present = F1AP_GNB_CU_TNL_Association_To_Update_ItemIEs__value_PR_GNB_CU_TNL_Association_To_Update_Item;
...
...
@@ -642,7 +641,7 @@ int CU_send_gNB_CU_CONFIGURATION_UPDATE(instance_t instance, f1ap_gnb_cu_configu
for (int i=0; i<1; i++) {
asn1cSequenceAdd(ieC7->value.choice.Cells_to_be_Barred_List.list,
F1AP_Cells_to_be_Barred_ItemIEs_t,cells_to_be_barred);
F1AP_Cells_to_be_Barred_ItemIEs_t,cells_to_be_barred);
cells_to_be_barred->id = F1AP_ProtocolIE_ID_id_Cells_to_be_Activated_List_Item;
cells_to_be_barred->criticality = F1AP_Criticality_reject;
cells_to_be_barred->value.present = F1AP_Cells_to_be_Barred_ItemIEs__value_PR_Cells_to_be_Barred_Item;
...
...
@@ -665,7 +664,7 @@ int CU_send_gNB_CU_CONFIGURATION_UPDATE(instance_t instance, f1ap_gnb_cu_configu
for (int i=0; i<1; i++) {
asn1cSequenceAdd(ieC8->value.choice.Protected_EUTRA_Resources_List.list,
F1AP_Protected_EUTRA_Resources_ItemIEs_t, protected_eutra_resources);
F1AP_Protected_EUTRA_Resources_ItemIEs_t, protected_eutra_resources);
// 8.1 SpectrumSharingGroupID
protected_eutra_resources->id = F1AP_ProtocolIE_ID_id_Protected_EUTRA_Resources_List;
protected_eutra_resources->criticality = F1AP_Criticality_reject;
...
...
@@ -675,11 +674,11 @@ int CU_send_gNB_CU_CONFIGURATION_UPDATE(instance_t instance, f1ap_gnb_cu_configu
sizeof(F1AP_Protected_EUTRA_Resources_Item_t));
asn1cSequenceAdd(protected_eutra_resources->value.choice.ListofEUTRACellsinGNBDUCoordination.list,
F1AP_Served_EUTRA_Cells_Information_t, served_eutra_cells_information);
F1AP_Served_EUTRA_Cells_Information_t, served_eutra_cells_information);
memset((void *)&served_eutra_cells_information, 0, sizeof(F1AP_Served_EUTRA_Cells_Information_t));
F1AP_EUTRA_Mode_Info_t *eUTRA_Mode_Info=
&served_eutra_cells_information.eUTRA_Mode_Info;
&served_eutra_cells_information.eUTRA_Mode_Info;
// eUTRAFDD
eUTRA_Mode_Info->present = F1AP_EUTRA_Mode_Info_PR_eUTRAFDD;
...
...
openair2/F1AP/f1ap_cu_rrc_message_transfer.c
View file @
f9bb4150
...
...
@@ -100,7 +100,6 @@ int CU_handle_INITIAL_UL_RRC_MESSAGE_TRANSFER(instance_t instance,
}
LOG_I
(
F1AP
,
"%s() RRCContainer (CCCH) size %ld: "
,
__func__
,
ie
->
value
.
choice
.
RRCContainer
.
size
);
/* DUtoCURRCContainer */
F1AP_FIND_PROTOCOLIE_BY_ID
(
F1AP_InitialULRRCMessageTransferIEs_t
,
ie
,
container
,
F1AP_ProtocolIE_ID_id_DUtoCURRCContainer
,
false
);
...
...
openair2/F1AP/f1ap_cu_task.c
View file @
f9bb4150
...
...
@@ -42,7 +42,7 @@
instance_t
CUuniqInstance
=
0
;
static
instance_t
cu_task_create_gtpu_instance_to_du
(
eth_params_t
*
IPaddrs
)
{
openAddr_t
tmp
=
{
0
};
openAddr_t
tmp
=
{
0
};
strncpy
(
tmp
.
originHost
,
IPaddrs
->
my_addr
,
sizeof
(
tmp
.
originHost
)
-
1
);
strncpy
(
tmp
.
destinationHost
,
IPaddrs
->
remote_addr
,
sizeof
(
tmp
.
destinationHost
)
-
1
);
sprintf
(
tmp
.
originService
,
"%d"
,
IPaddrs
->
my_portd
);
...
...
@@ -51,7 +51,7 @@ static instance_t cu_task_create_gtpu_instance_to_du(eth_params_t *IPaddrs) {
}
static
void
cu_task_handle_sctp_association_ind
(
instance_t
instance
,
sctp_new_association_ind_t
*
sctp_new_association_ind
,
eth_params_t
*
IPaddrs
)
{
eth_params_t
*
IPaddrs
)
{
createF1inst
(
true
,
instance
,
NULL
);
// save the assoc id
f1ap_setup_req_t
*
f1ap_cu_data
=
f1ap_req
(
true
,
instance
);
...
...
@@ -90,7 +90,7 @@ static void cu_task_handle_sctp_data_ind(instance_t instance, sctp_data_ind_t *s
AssertFatal
(
result
==
EXIT_SUCCESS
,
"Failed to free memory (%d)!
\n
"
,
result
);
}
static
void
cu_task_send_sctp_init_req
(
instance_t
instance
,
char
*
my_addr
)
{
static
void
cu_task_send_sctp_init_req
(
instance_t
instance
,
char
*
my_addr
)
{
// 1. get the itti msg, and retrive the enb_id from the message
// 2. use RC.rrc[enb_id] to fill the sctp_init_t with the ip, port
// 3. creat an itti message to init
...
...
@@ -103,7 +103,6 @@ static void cu_task_send_sctp_init_req(instance_t instance, char * my_addr) {
message_p
->
ittiMsg
.
sctp_init
.
ipv6
=
0
;
message_p
->
ittiMsg
.
sctp_init
.
nb_ipv4_addr
=
1
;
message_p
->
ittiMsg
.
sctp_init
.
ipv4_address
[
0
]
=
inet_addr
(
my_addr
);
/*
* SR WARNING: ipv6 multi-homing fails sometimes for localhost.
* * * * Disable it for now.
...
...
@@ -113,7 +112,7 @@ 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
*
F1AP_CU_task
(
void
*
arg
)
{
void
*
F1AP_CU_task
(
void
*
arg
)
{
MessageDef
*
received_msg
=
NULL
;
int
result
;
LOG_I
(
F1AP
,
"Starting F1AP at CU
\n
"
);
...
...
@@ -121,13 +120,15 @@ void * F1AP_CU_task(void *arg) {
pool_buffer_init
();
itti_mark_task_ready
(
TASK_CU_F1
);
eth_params_t
*
IPaddrs
;
// Hardcoded instance id!
if
(
RC
.
nrrrc
&&
RC
.
nrrrc
[
0
]
->
node_type
==
ngran_gNB_CU
)
IPaddrs
=&
RC
.
nrrrc
[
0
]
->
eth_params_s
;
else
else
IPaddrs
=&
RC
.
rrc
[
0
]
->
eth_params_s
;
cu_task_send_sctp_init_req
(
0
,
IPaddrs
->
my_addr
);
while
(
1
)
{
itti_receive_msg
(
TASK_CU_F1
,
&
received_msg
);
...
...
@@ -137,7 +138,7 @@ void * F1AP_CU_task(void *arg) {
ITTI_MSG_DESTINATION_INSTANCE
(
received_msg
));
cu_task_handle_sctp_association_ind
(
ITTI_MSG_ORIGIN_INSTANCE
(
received_msg
),
&
received_msg
->
ittiMsg
.
sctp_new_association_ind
,
IPaddrs
);
IPaddrs
);
break
;
case
SCTP_NEW_ASSOCIATION_RESP
:
...
...
openair2/F1AP/f1ap_cu_ue_context_management.c
View file @
f9bb4150
...
...
@@ -113,7 +113,7 @@ int CU_send_UE_CONTEXT_SETUP_REQUEST(instance_t instance,
ie4
->
criticality
=
F1AP_Criticality_reject
;
ie4
->
value
.
present
=
F1AP_UEContextSetupRequestIEs__value_PR_ServCellIndex
;
ie4
->
value
.
choice
.
ServCellIndex
=
0
;
/* optional */
/* c5. CellULConfigured */
if
(
0
)
{
...
...
@@ -130,6 +130,7 @@ int CU_send_UE_CONTEXT_SETUP_REQUEST(instance_t instance,
ie6
->
id
=
F1AP_ProtocolIE_ID_id_CUtoDURRCInformation
;
ie6
->
criticality
=
F1AP_Criticality_reject
;
ie6
->
value
.
present
=
F1AP_UEContextSetupRequestIEs__value_PR_CUtoDURRCInformation
;
/* optional */
/* 6.1 cG_ConfigInfo */
if
(
0
)
{
...
...
@@ -152,7 +153,7 @@ int CU_send_UE_CONTEXT_SETUP_REQUEST(instance_t instance,
ie7
->
id
=
F1AP_ProtocolIE_ID_id_Candidate_SpCell_List
;
//90
ie7
->
criticality
=
F1AP_Criticality_ignore
;
ie7
->
value
.
present
=
F1AP_UEContextSetupRequestIEs__value_PR_Candidate_SpCell_List
;
for
(
int
i
=
0
;
i
<
1
;
i
++
)
{
asn1cSequenceAdd
(
ie7
->
value
.
choice
.
Candidate_SpCell_List
.
list
,
F1AP_Candidate_SpCell_ItemIEs_t
,
candidate_spCell_item_ies
);
candidate_spCell_item_ies
->
id
=
F1AP_ProtocolIE_ID_id_Candidate_SpCell_Item
;
// 91
...
...
@@ -205,13 +206,14 @@ int CU_send_UE_CONTEXT_SETUP_REQUEST(instance_t instance,
OCTET_STRING_fromBuf
(
&
ie9
->
value
.
choice
.
ResourceCoordinationTransferContainer
,
"asdsa1d32sa1d31asd31as"
,
strlen
(
"asdsa1d32sa1d31asd31as"
));
}
/* mandatory */
/* mandatory */
/* c10. SCell_ToBeSetup_List */
asn1cSequenceAdd
(
out
->
protocolIEs
.
list
,
F1AP_UEContextSetupRequestIEs_t
,
ie10
);
ie10
->
id
=
F1AP_ProtocolIE_ID_id_SCell_ToBeSetup_List
;
ie10
->
criticality
=
F1AP_Criticality_ignore
;
ie10
->
value
.
present
=
F1AP_UEContextSetupRequestIEs__value_PR_SCell_ToBeSetup_List
;
for
(
int
i
=
0
;
i
<
1
;
i
++
)
{
//
asn1cSequenceAdd
(
ie10
->
value
.
choice
.
SCell_ToBeSetup_List
.
list
,
F1AP_SCell_ToBeSetup_ItemIEs_t
,
scell_toBeSetup_item_ies
);
...
...
@@ -391,7 +393,6 @@ int CU_send_UE_CONTEXT_SETUP_REQUEST(instance_t instance,
/* 12.1.2.2 sNSSAI */
{
/* sST */
OCTET_STRING_fromBuf
(
&
DRB_Information
->
sNSSAI
.
sST
,
"1"
,
1
);
/* OPTIONAL */
...
...
@@ -507,16 +508,15 @@ int CU_send_UE_CONTEXT_SETUP_REQUEST(instance_t instance,
int
sz
=
sizeof
(
f1ap_ue_context_setup_req
->
drbs_to_be_setup
[
i
].
up_dl_tnl
[
0
].
tl_address
);
memcpy
(
addr
.
buffer
,
&
f1ap_ue_context_setup_req
->
drbs_to_be_setup
[
i
].
up_dl_tnl
[
0
].
tl_address
,
sz
);
addr
.
length
=
sz
*
8
;
f1ap_ue_context_setup_req
->
drbs_to_be_setup
[
i
].
up_ul_tnl
[
j
].
teid
=
newGtpuCreateTunnel
(
getCxt
(
CUtype
,
instance
)
->
gtpInst
,
f1ap_ue_context_setup_req
->
rnti
,
f1ap_ue_context_setup_req
->
drbs_to_be_setup
[
i
].
drb_id
,
f1ap_ue_context_setup_req
->
drbs_to_be_setup
[
i
].
drb_id
,
0xFFFF
,
// We will set the right value from DU answer
addr
,
f1ap_ue_context_setup_req
->
drbs_to_be_setup
[
i
].
up_dl_tnl
[
0
].
port
,
cu_f1u_data_req
);
newGtpuCreateTunnel
(
getCxt
(
CUtype
,
instance
)
->
gtpInst
,
f1ap_ue_context_setup_req
->
rnti
,
f1ap_ue_context_setup_req
->
drbs_to_be_setup
[
i
].
drb_id
,
f1ap_ue_context_setup_req
->
drbs_to_be_setup
[
i
].
drb_id
,
0xFFFF
,
// We will set the right value from DU answer
addr
,
f1ap_ue_context_setup_req
->
drbs_to_be_setup
[
i
].
up_dl_tnl
[
0
].
port
,
cu_f1u_data_req
);
/* 12.3.1 ULTunnels_ToBeSetup_Item */
asn1cSequenceAdd
(
drbs_toBeSetup_item
->
uLUPTNLInformation_ToBeSetup_List
.
list
,
F1AP_ULUPTNLInformation_ToBeSetup_Item_t
,
uLUPTNLInformation_ToBeSetup_Item
);
...
...
@@ -525,10 +525,10 @@ int CU_send_UE_CONTEXT_SETUP_REQUEST(instance_t instance,
gTPTunnel
);
/* 12.3.1.1.1 transportLayerAddress */
TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING
(
f1ap_ue_context_setup_req
->
drbs_to_be_setup
[
i
].
up_ul_tnl
[
j
].
tl_address
,
&
gTPTunnel
->
transportLayerAddress
);
&
gTPTunnel
->
transportLayerAddress
);
/* 12.3.1.1.2 gTP_TEID */
INT32_TO_OCTET_STRING
(
f1ap_ue_context_setup_req
->
drbs_to_be_setup
[
i
].
up_ul_tnl
[
j
].
teid
,
&
gTPTunnel
->
gTP_TEID
);
&
gTPTunnel
->
gTP_TEID
);
}
/* 12.1.4 rLCMode */
...
...
@@ -641,111 +641,115 @@ int CU_handle_UE_CONTEXT_SETUP_RESPONSE(instance_t instance,
f1ap_ue_context_setup_t
*
f1ap_ue_context_setup_resp
=
&
F1AP_UE_CONTEXT_SETUP_RESP
(
msg_p
);
container
=
&
pdu
->
choice
.
successfulOutcome
->
value
.
choice
.
UEContextSetupResponse
;
int
i
;
/* GNB_CU_UE_F1AP_ID */
F1AP_FIND_PROTOCOLIE_BY_ID
(
F1AP_UEContextSetupResponseIEs_t
,
ie
,
container
,
F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID
,
true
);
f1ap_ue_context_setup_resp
->
gNB_CU_ue_id
=
ie
->
value
.
choice
.
GNB_CU_UE_F1AP_ID
;
f1ap_ue_context_setup_resp
->
gNB_CU_ue_id
=
ie
->
value
.
choice
.
GNB_CU_UE_F1AP_ID
;
LOG_D
(
F1AP
,
"f1ap_ue_context_setup_resp->gNB_CU_ue_id is: %d
\n
"
,
f1ap_ue_context_setup_resp
->
gNB_CU_ue_id
);
/* GNB_DU_UE_F1AP_ID */
F1AP_FIND_PROTOCOLIE_BY_ID
(
F1AP_UEContextSetupResponseIEs_t
,
ie
,
container
,
F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID
,
true
);
f1ap_ue_context_setup_resp
->
gNB_DU_ue_id
=
ie
->
value
.
choice
.
GNB_DU_UE_F1AP_ID
;
LOG_D
(
F1AP
,
"f1ap_ue_context_setup_resp->gNB_DU_ue_id is: %d
\n
"
,
f1ap_ue_context_setup_resp
->
gNB_DU_ue_id
);
f1ap_ue_context_setup_resp
->
rnti
=
f1ap_get_rnti_by_du_id
(
CUtype
,
instance
,
f1ap_ue_context_setup_resp
->
gNB_DU_ue_id
);
// DUtoCURRCInformation
f1ap_get_rnti_by_du_id
(
CUtype
,
instance
,
f1ap_ue_context_setup_resp
->
gNB_DU_ue_id
);
// DUtoCURRCInformation
F1AP_FIND_PROTOCOLIE_BY_ID
(
F1AP_UEContextSetupResponseIEs_t
,
ie
,
container
,
F1AP_ProtocolIE_ID_id_DUtoCURRCInformation
,
true
);
if
(
ie
==
NULL
){
if
(
ie
==
NULL
)
{
LOG_E
(
F1AP
,
"%s %d: ie is a NULL pointer
\n
"
,
__FILE__
,
__LINE__
);
return
-
1
;
}
f1ap_ue_context_setup_resp
->
du_to_cu_rrc_information
=
(
uint8_t
*
)
calloc
(
1
,
ie
->
value
.
choice
.
DUtoCURRCInformation
.
cellGroupConfig
.
size
);
f1ap_ue_context_setup_resp
->
du_to_cu_rrc_information
=
(
uint8_t
*
)
calloc
(
1
,
ie
->
value
.
choice
.
DUtoCURRCInformation
.
cellGroupConfig
.
size
);
memcpy
(
f1ap_ue_context_setup_resp
->
du_to_cu_rrc_information
,
ie
->
value
.
choice
.
DUtoCURRCInformation
.
cellGroupConfig
.
buf
,
ie
->
value
.
choice
.
DUtoCURRCInformation
.
cellGroupConfig
.
size
);
f1ap_ue_context_setup_resp
->
du_to_cu_rrc_information_length
=
ie
->
value
.
choice
.
DUtoCURRCInformation
.
cellGroupConfig
.
size
;
// DRBs_Setup_List
// DRBs_Setup_List
F1AP_FIND_PROTOCOLIE_BY_ID
(
F1AP_UEContextSetupResponseIEs_t
,
ie
,
container
,
F1AP_ProtocolIE_ID_id_DRBs_Setup_List
,
false
);
if
(
ie
!=
NULL
){
if
(
ie
!=
NULL
)
{
f1ap_ue_context_setup_resp
->
drbs_to_be_setup_length
=
ie
->
value
.
choice
.
DRBs_Setup_List
.
list
.
count
;
f1ap_ue_context_setup_resp
->
drbs_to_be_setup
=
calloc
(
f1ap_ue_context_setup_resp
->
drbs_to_be_setup_length
,
sizeof
(
f1ap_drb_to_be_setup_t
));
AssertFatal
(
f1ap_ue_context_setup_resp
->
drbs_to_be_setup
,
"could not allocate memory for f1ap_ue_context_setup_resp->drbs_setup
\n
"
);
"could not allocate memory for f1ap_ue_context_setup_resp->drbs_setup
\n
"
);
for
(
i
=
0
;
i
<
f1ap_ue_context_setup_resp
->
drbs_to_be_setup_length
;
++
i
)
{
f1ap_drb_to_be_setup_t
*
drb_p
=
&
f1ap_ue_context_setup_resp
->
drbs_to_be_setup
[
i
];
F1AP_DRBs_Setup_Item_t
*
drbs_setup_item_p
;
drbs_setup_item_p
=
&
((
F1AP_DRBs_Setup_ItemIEs_t
*
)
ie
->
value
.
choice
.
DRBs_Setup_List
.
list
.
array
[
i
])
->
value
.
choice
.
DRBs_Setup_Item
;
drb_p
->
drb_id
=
drbs_setup_item_p
->
dRBID
;
// TODO in the following, assume only one UP UL TNL is present.
// this matches/assumes OAI CU/DU implementation, can be up to 2!
// this matches/assumes OAI CU/DU implementation, can be up to 2!
drb_p
->
up_dl_tnl_length
=
1
;
AssertFatal
(
drbs_setup_item_p
->
dLUPTNLInformation_ToBeSetup_List
.
list
.
count
>
0
,
"no DL UP TNL Information in DRBs to be Setup list
\n
"
);
"no DL UP TNL Information in DRBs to be Setup list
\n
"
);
F1AP_DLUPTNLInformation_ToBeSetup_Item_t
*
dl_up_tnl_info_p
=
(
F1AP_DLUPTNLInformation_ToBeSetup_Item_t
*
)
drbs_setup_item_p
->
dLUPTNLInformation_ToBeSetup_List
.
list
.
array
[
0
];
F1AP_GTPTunnel_t
*
dl_up_tnl0
=
dl_up_tnl_info_p
->
dLUPTNLInformation
.
choice
.
gTPTunnel
;
BIT_STRING_TO_TRANSPORT_LAYER_ADDRESS_IPv4
(
&
dl_up_tnl0
->
transportLayerAddress
,
drb_p
->
up_dl_tnl
[
0
].
tl_address
);
OCTET_STRING_TO_INT32
(
&
dl_up_tnl0
->
gTP_TEID
,
drb_p
->
up_dl_tnl
[
0
].
teid
);
GtpuUpdateTunnelOutgoingTeid
(
getCxt
(
CUtype
,
instance
)
->
gtpInst
,
f1ap_ue_context_setup_resp
->
rnti
,
(
ebi_t
)
drbs_setup_item_p
->
dRBID
,
drb_p
->
up_dl_tnl
[
0
].
teid
);
f1ap_ue_context_setup_resp
->
rnti
,
(
ebi_t
)
drbs_setup_item_p
->
dRBID
,
drb_p
->
up_dl_tnl
[
0
].
teid
);
}
}
// SRBs_FailedToBeSetup_List
// SRBs_FailedToBeSetup_List
F1AP_FIND_PROTOCOLIE_BY_ID
(
F1AP_UEContextSetupResponseIEs_t
,
ie
,
container
,
F1AP_ProtocolIE_ID_id_SRBs_FailedToBeSetup_List
,
false
);
if
(
ie
!=
NULL
){
if
(
ie
!=
NULL
)
{
f1ap_ue_context_setup_resp
->
srbs_failed_to_be_setup_length
=
ie
->
value
.
choice
.
SRBs_FailedToBeSetup_List
.
list
.
count
;
f1ap_ue_context_setup_resp
->
srbs_failed_to_be_setup
=
calloc
(
f1ap_ue_context_setup_resp
->
srbs_failed_to_be_setup_length
,
sizeof
(
f1ap_rb_failed_to_be_setup_t
));
AssertFatal
(
f1ap_ue_context_setup_resp
->
srbs_failed_to_be_setup
,
"could not allocate memory for f1ap_ue_context_setup_resp->srbs_failed_to_be_setup
\n
"
);
"could not allocate memory for f1ap_ue_context_setup_resp->srbs_failed_to_be_setup
\n
"
);
for
(
i
=
0
;
i
<
f1ap_ue_context_setup_resp
->
srbs_failed_to_be_setup_length
;
++
i
)
{
f1ap_rb_failed_to_be_setup_t
*
srb_p
=
&
f1ap_ue_context_setup_resp
->
srbs_failed_to_be_setup
[
i
];
srb_p
->
rb_id
=
((
F1AP_SRBs_FailedToBeSetup_Item_t
*
)
ie
->
value
.
choice
.
SRBs_FailedToBeSetup_List
.
list
.
array
[
i
])
->
sRBID
;
}
}
// DRBs_FailedToBeSetup_List
// DRBs_FailedToBeSetup_List
F1AP_FIND_PROTOCOLIE_BY_ID
(
F1AP_UEContextSetupResponseIEs_t
,
ie
,
container
,
F1AP_ProtocolIE_ID_id_DRBs_FailedToBeSetup_List
,
false
);
if
(
ie
!=
NULL
){
if
(
ie
!=
NULL
)
{
f1ap_ue_context_setup_resp
->
drbs_failed_to_be_setup_length
=
ie
->
value
.
choice
.
DRBs_FailedToBeSetup_List
.
list
.
count
;
f1ap_ue_context_setup_resp
->
drbs_failed_to_be_setup
=
calloc
(
f1ap_ue_context_setup_resp
->
drbs_failed_to_be_setup_length
,
sizeof
(
f1ap_rb_failed_to_be_setup_t
));
AssertFatal
(
f1ap_ue_context_setup_resp
->
drbs_failed_to_be_setup
,
"could not allocate memory for f1ap_ue_context_setup_resp->drbs_failed_to_be_setup
\n
"
);
"could not allocate memory for f1ap_ue_context_setup_resp->drbs_failed_to_be_setup
\n
"
);
for
(
i
=
0
;
i
<
f1ap_ue_context_setup_resp
->
drbs_failed_to_be_setup_length
;
++
i
)
{
f1ap_rb_failed_to_be_setup_t
*
drb_p
=
&
f1ap_ue_context_setup_resp
->
drbs_failed_to_be_setup
[
i
];
drb_p
->
rb_id
=
((
F1AP_DRBs_FailedToBeSetup_Item_t
*
)
ie
->
value
.
choice
.
DRBs_FailedToBeSetup_List
.
list
.
array
[
i
])
->
dRBID
;
}
}
// SCell_FailedtoSetup_List
// SCell_FailedtoSetup_List
F1AP_FIND_PROTOCOLIE_BY_ID
(
F1AP_UEContextSetupResponseIEs_t
,
ie
,
container
,
F1AP_ProtocolIE_ID_id_SCell_FailedtoSetup_List
,
false
);
if
(
ie
!=
NULL
){
if
(
ie
!=
NULL
)
{
LOG_E
(
F1AP
,
"Not supporting handling of SCell_FailedtoSetup_List
\n
"
);
}
// SRBs_Setup_List
// SRBs_Setup_List
F1AP_FIND_PROTOCOLIE_BY_ID
(
F1AP_UEContextSetupResponseIEs_t
,
ie
,
container
,
F1AP_ProtocolIE_ID_id_SRBs_Setup_List
,
false
);
if
(
ie
!=
NULL
){
F1AP_ProtocolIE_ID_id_SRBs_Setup_List
,
false
);
if
(
ie
!=
NULL
)
{
f1ap_ue_context_setup_resp
->
srbs_to_be_setup_length
=
ie
->
value
.
choice
.
SRBs_Setup_List
.
list
.
count
;
f1ap_ue_context_setup_resp
->
srbs_to_be_setup
=
calloc
(
f1ap_ue_context_setup_resp
->
srbs_to_be_setup_length
,
sizeof
(
f1ap_srb_to_be_setup_t
));
AssertFatal
(
f1ap_ue_context_setup_resp
->
srbs_to_be_setup
,
"could not allocate memory for f1ap_ue_context_setup_resp->drbs_setup
\n
"
);
"could not allocate memory for f1ap_ue_context_setup_resp->drbs_setup
\n
"
);
for
(
i
=
0
;
i
<
f1ap_ue_context_setup_resp
->
srbs_to_be_setup_length
;
++
i
)
{
f1ap_srb_to_be_setup_t
*
srb_p
=
&
f1ap_ue_context_setup_resp
->
srbs_to_be_setup
[
i
];
F1AP_SRBs_Setup_Item_t
*
srbs_setup_item_p
;
...
...
@@ -1063,8 +1067,8 @@ int CU_send_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance) {
ie5
->
value
.
choice
.
DRXCycle
.
longDRXCycleLength
=
F1AP_LongDRXCycleLength_ms10
;
// enum
if
(
0
)
{
asn1cCallocOne
(
ie5
->
value
.
choice
.
DRXCycle
.
shortDRXCycleLength
,
F1AP_ShortDRXCycleLength_ms2
);
// enum
asn1cCallocOne
(
ie5
->
value
.
choice
.
DRXCycle
.
shortDRXCycleLength
,
F1AP_ShortDRXCycleLength_ms2
);
// enum
}
if
(
0
)
{
...
...
openair2/F1AP/f1ap_du_interface_management.c
View file @
f9bb4150
...
...
@@ -44,8 +44,10 @@ int to_NRNRB(int nrb) {
for
(
int
i
=
0
;
i
<
sizeofArray
(
nrb_lut
);
i
++
)
if
(
nrb_lut
[
i
]
==
nrb
)
return
i
;
if
(
!
RC
.
nrrrc
)
return
0
;
AssertFatal
(
1
==
0
,
"nrb %d is not in the list of possible NRNRB
\n
"
,
nrb
);
}
...
...
@@ -435,7 +437,7 @@ int DU_handle_F1_SETUP_RESPONSE(instance_t instance,
memcpy
((
void
*
)
F1AP_SETUP_RESP
(
msg_p
).
cells_to_activate
[
i
].
SI_container
[
si
],
(
void
*
)
sib_item
->
sIBmessage
.
buf
,
size
);
F1AP_SETUP_RESP
(
msg_p
).
cells_to_activate
[
i
].
SI_type
[
si
]
=
sib_item
->
sIBtype
;
F1AP_SETUP_RESP
(
msg_p
).
cells_to_activate
[
i
].
SI_type
[
si
]
=
sib_item
->
sIBtype
;
}
break
;
...
...
@@ -869,7 +871,7 @@ int DU_handle_gNB_CU_CONFIGURATION_UPDATE(instance_t instance,
memcpy
((
void
*
)
F1AP_GNB_CU_CONFIGURATION_UPDATE
(
msg_p
).
cells_to_activate
[
i
].
SI_container
[
si
],
(
void
*
)
sib_item
->
sIBmessage
.
buf
,
size
);
F1AP_GNB_CU_CONFIGURATION_UPDATE
(
msg_p
).
cells_to_activate
[
i
].
SI_type
[
si
]
=
sib_item
->
sIBtype
;
F1AP_GNB_CU_CONFIGURATION_UPDATE
(
msg_p
).
cells_to_activate
[
i
].
SI_type
[
si
]
=
sib_item
->
sIBtype
;
}
break
;
...
...
openair2/F1AP/f1ap_du_rrc_message_transfer.c
View file @
f9bb4150
...
...
@@ -137,7 +137,6 @@ int DU_handle_DL_RRC_MESSAGE_TRANSFER(instance_t instance,
/* RRC Container */
F1AP_FIND_PROTOCOLIE_BY_ID
(
F1AP_DLRRCMessageTransferIEs_t
,
ie
,
container
,
F1AP_ProtocolIE_ID_id_RRCContainer
,
true
);
rrc_dl_sdu_len
=
ie
->
value
.
choice
.
RRCContainer
.
size
;
/* optional */
...
...
@@ -763,7 +762,7 @@ int DU_send_INITIAL_UL_RRC_MESSAGE_TRANSFER(instance_t instanceP,
LOG_E
(
F1AP
,
"Failed to add UE
\n
"
);
return
-
1
;
}
/* Create */
/* 0. Message Type */
pdu
.
present
=
F1AP_F1AP_PDU_PR_initiatingMessage
;
...
...
@@ -920,7 +919,7 @@ int DU_handle_DL_NR_RRC_MESSAGE_TRANSFER(instance_t instance,
LOG_E
(
F1AP
,
"Failed to find the F1AP UID
\n
"
);
//return -1;
}
/* optional */
/* oldgNB_DU_UE_F1AP_ID */
if
(
0
)
{
...
...
@@ -932,7 +931,6 @@ int DU_handle_DL_NR_RRC_MESSAGE_TRANSFER(instance_t instance,
/* SRBID */
F1AP_FIND_PROTOCOLIE_BY_ID
(
F1AP_DLRRCMessageTransferIEs_t
,
ie
,
container
,
F1AP_ProtocolIE_ID_id_SRBID
,
true
);
uint64_t
srb_id
=
ie
->
value
.
choice
.
SRBID
;
LOG_D
(
F1AP
,
"srb_id %lu
\n
"
,
srb_id
);
...
...
@@ -985,13 +983,12 @@ int DU_handle_DL_NR_RRC_MESSAGE_TRANSFER(instance_t instance,
// decode RRC Container and act on the message type
AssertFatal
(
srb_id
<
3
,
"illegal srb_id
\n
"
);
MessageDef
*
msg
=
itti_alloc_new_message
(
TASK_DU_F1
,
0
,
NR_DU_RRC_DL_INDICATION
);
NRDuDlReq_t
*
req
=&
NRDuDlReq
(
msg
);
MessageDef
*
msg
=
itti_alloc_new_message
(
TASK_DU_F1
,
0
,
NR_DU_RRC_DL_INDICATION
);
NRDuDlReq_t
*
req
=&
NRDuDlReq
(
msg
);
req
->
rnti
=
f1ap_get_rnti_by_du_id
(
DUtype
,
instance
,
du_ue_f1ap_id
);
req
->
srb_id
=
srb_id
;
req
->
buf
=
get_free_mem_block
(
ie
->
value
.
choice
.
RRCContainer
.
size
,
__func__
);
memcpy
(
req
->
buf
->
data
,
ie
->
value
.
choice
.
RRCContainer
.
buf
,
ie
->
value
.
choice
.
RRCContainer
.
size
);
itti_send_msg_to_task
(
TASK_RRC_GNB
,
instance
,
msg
);
return
0
;
}
openair2/F1AP/f1ap_du_task.c
View file @
f9bb4150
...
...
@@ -85,7 +85,6 @@ void du_task_handle_sctp_association_resp(instance_t instance, sctp_new_associat
f1ap_du_data
->
sctp_out_streams
=
sctp_new_association_resp
->
out_streams
;
f1ap_du_data
->
default_sctp_stream_id
=
0
;
/* setup parameters for F1U and start the server */
DU_send_F1_SETUP_REQUEST
(
instance
);
}
...
...
@@ -98,8 +97,8 @@ void du_task_handle_sctp_data_ind(instance_t instance, sctp_data_ind_t *sctp_dat
AssertFatal
(
result
==
EXIT_SUCCESS
,
"Failed to free memory (%d)!
\n
"
,
result
);
}
static
instance_t
du_create_gtpu_instance_to_cu
(
char
*
CUaddr
,
uint16_t
CUport
,
char
*
DUaddr
,
uint16_t
DUport
)
{
openAddr_t
tmp
=
{
0
};
static
instance_t
du_create_gtpu_instance_to_cu
(
char
*
CUaddr
,
uint16_t
CUport
,
char
*
DUaddr
,
uint16_t
DUport
)
{
openAddr_t
tmp
=
{
0
};
strncpy
(
tmp
.
originHost
,
DUaddr
,
sizeof
(
tmp
.
originHost
)
-
1
);
strncpy
(
tmp
.
destinationHost
,
CUaddr
,
sizeof
(
tmp
.
destinationHost
)
-
1
);
sprintf
(
tmp
.
originService
,
"%d"
,
DUport
);
...
...
@@ -121,22 +120,22 @@ void *F1AP_DU_task(void *arg) {
switch
(
ITTI_MSG_ID
(
msg
))
{
case
F1AP_SETUP_REQ
:
// this is not a true F1 message, but rather an ITTI message sent by enb_app
// this is not a true F1 message, but rather an ITTI message sent by enb_app
// 1. save the itti msg so that you can use it to sen f1ap_setup_req, fill the f1ap_setup_req message,
// 2. store the message in f1ap context, that is also stored in RC
// 2. send a sctp_association req
LOG_I
(
F1AP
,
"DU Task Received F1AP_SETUP_REQ
\n
"
);
f1ap_setup_req_t
*
msgSetup
=&
F1AP_SETUP_REQ
(
msg
);
LOG_I
(
F1AP
,
"DU Task Received F1AP_SETUP_REQ
\n
"
);
f1ap_setup_req_t
*
msgSetup
=&
F1AP_SETUP_REQ
(
msg
);
createF1inst
(
false
,
myInstance
,
msgSetup
);
getCxt
(
DUtype
,
myInstance
)
->
gtpInst
=
du_create_gtpu_instance_to_cu
(
msgSetup
->
CU_f1_ip_address
.
ipv4_address
,
msgSetup
->
CUport
,
msgSetup
->
DU_f1_ip_address
.
ipv4_address
,
msgSetup
->
DUport
);
AssertFatal
(
getCxt
(
DUtype
,
myInstance
)
->
gtpInst
>
0
,
"Failed to create CU F1-U UDP listener"
);
// Fixme: fully inconsistent instances management
// dirty global var is a bad fix
extern
instance_t
legacyInstanceMapping
;
legacyInstanceMapping
=
DUuniqInstance
=
getCxt
(
DUtype
,
myInstance
)
->
gtpInst
;
getCxt
(
DUtype
,
myInstance
)
->
gtpInst
=
du_create_gtpu_instance_to_cu
(
msgSetup
->
CU_f1_ip_address
.
ipv4_address
,
msgSetup
->
CUport
,
msgSetup
->
DU_f1_ip_address
.
ipv4_address
,
msgSetup
->
DUport
);
AssertFatal
(
getCxt
(
DUtype
,
myInstance
)
->
gtpInst
>
0
,
"Failed to create CU F1-U UDP listener"
);
// Fixme: fully inconsistent instances management
// dirty global var is a bad fix
extern
instance_t
legacyInstanceMapping
;
legacyInstanceMapping
=
DUuniqInstance
=
getCxt
(
DUtype
,
myInstance
)
->
gtpInst
;
du_task_send_sctp_association_req
(
myInstance
,
msgSetup
);
break
;
...
...
openair2/F1AP/f1ap_du_ue_context_management.c
View file @
f9bb4150
...
...
@@ -43,15 +43,15 @@
#include <openair3/ocp-gtpu/gtp_itf.h>
boolean_t
lteDURecvCb
(
protocol_ctxt_t
*
ctxt_pP
,
const
srb_flag_t
srb_flagP
,
const
rb_id_t
rb_idP
,
const
mui_t
muiP
,
const
confirm_t
confirmP
,
const
sdu_size_t
sdu_buffer_sizeP
,
unsigned
char
*
const
sdu_buffer_pP
,
const
pdcp_transmission_mode_t
modeP
,
const
uint32_t
*
sourceL2Id
,
const
uint32_t
*
destinationL2Id
)
{
const
srb_flag_t
srb_flagP
,
const
rb_id_t
rb_idP
,
const
mui_t
muiP
,
const
confirm_t
confirmP
,
const
sdu_size_t
sdu_buffer_sizeP
,
unsigned
char
*
const
sdu_buffer_pP
,
const
pdcp_transmission_mode_t
modeP
,
const
uint32_t
*
sourceL2Id
,
const
uint32_t
*
destinationL2Id
)
{
// The buffer comes from the stack in gtp-u thread, we have a make a separate buffer to enqueue in a inter-thread message queue
mem_block_t
*
sdu
=
get_free_mem_block
(
sdu_buffer_sizeP
,
__func__
);
memcpy
(
sdu
->
data
,
sdu_buffer_pP
,
sdu_buffer_sizeP
);
...
...
@@ -134,53 +134,55 @@ int DU_handle_UE_CONTEXT_SETUP_REQUEST(instance_t instance,
/* DRB */
F1AP_UEContextSetupRequestIEs_t
*
ieDrb
;
F1AP_FIND_PROTOCOLIE_BY_ID
(
F1AP_UEContextSetupRequestIEs_t
,
ieDrb
,
container
,
F1AP_ProtocolIE_ID_id_DRBs_ToBeSetup_List
,
false
);
F1AP_ProtocolIE_ID_id_DRBs_ToBeSetup_List
,
false
);
if
(
ieDrb
!=
NULL
)
{
f1ap_ue_context_setup_req
->
drbs_to_be_setup_length
=
ieDrb
->
value
.
choice
.
DRBs_ToBeSetup_List
.
list
.
count
;
f1ap_ue_context_setup_req
->
drbs_to_be_setup
=
calloc
(
f1ap_ue_context_setup_req
->
drbs_to_be_setup_length
,
sizeof
(
f1ap_drb_to_be_setup_t
));
sizeof
(
f1ap_drb_to_be_setup_t
));
AssertFatal
(
f1ap_ue_context_setup_req
->
drbs_to_be_setup
,
"could not allocate memory for f1ap_ue_context_setup_req->drbs_to_be_setup
\n
"
);
"could not allocate memory for f1ap_ue_context_setup_req->drbs_to_be_setup
\n
"
);
for
(
i
=
0
;
i
<
f1ap_ue_context_setup_req
->
drbs_to_be_setup_length
;
++
i
)
{
f1ap_drb_to_be_setup_t
*
drb_p
=
&
f1ap_ue_context_setup_req
->
drbs_to_be_setup
[
i
];
F1AP_DRBs_ToBeSetup_Item_t
*
drbs_tobesetup_item_p
=
&
((
F1AP_DRBs_ToBeSetup_ItemIEs_t
*
)
ieDrb
->
value
.
choice
.
DRBs_ToBeSetup_List
.
list
.
array
[
i
])
->
value
.
choice
.
DRBs_ToBeSetup_Item
;
&
((
F1AP_DRBs_ToBeSetup_ItemIEs_t
*
)
ieDrb
->
value
.
choice
.
DRBs_ToBeSetup_List
.
list
.
array
[
i
])
->
value
.
choice
.
DRBs_ToBeSetup_Item
;
drb_p
->
drb_id
=
drbs_tobesetup_item_p
->
dRBID
;
/* TODO in the following, assume only one UP UL TNL is present.
* this matches/assumes OAI CU implementation, can be up to 2! */
drb_p
->
up_ul_tnl_length
=
1
;
AssertFatal
(
drbs_tobesetup_item_p
->
uLUPTNLInformation_ToBeSetup_List
.
list
.
count
>
0
,
"no UL UP TNL Information in DRBs to be Setup list
\n
"
);
"no UL UP TNL Information in DRBs to be Setup list
\n
"
);
F1AP_ULUPTNLInformation_ToBeSetup_Item_t
*
ul_up_tnl_info_p
=
(
F1AP_ULUPTNLInformation_ToBeSetup_Item_t
*
)
drbs_tobesetup_item_p
->
uLUPTNLInformation_ToBeSetup_List
.
list
.
array
[
0
];
F1AP_GTPTunnel_t
*
ul_up_tnl0
=
ul_up_tnl_info_p
->
uLUPTNLInformation
.
choice
.
gTPTunnel
;
BIT_STRING_TO_TRANSPORT_LAYER_ADDRESS_IPv4
(
&
ul_up_tnl0
->
transportLayerAddress
,
drb_p
->
up_ul_tnl
[
0
].
tl_address
);
OCTET_STRING_TO_INT32
(
&
ul_up_tnl0
->
gTP_TEID
,
drb_p
->
up_ul_tnl
[
0
].
teid
);
// 3GPP assumes GTP-U is on port 2152, but OAI is configurable
drb_p
->
up_ul_tnl
[
0
].
port
=
getCxt
(
false
,
instance
)
->
setupReq
.
CUport
;
switch
(
drbs_tobesetup_item_p
->
rLCMode
)
{
case
F1AP_RLCMode_rlc_am
:
drb_p
->
rlc_mode
=
RLC_MODE_AM
;
break
;
default:
drb_p
->
rlc_mode
=
RLC_MODE_TM
;
break
;
case
F1AP_RLCMode_rlc_am
:
drb_p
->
rlc_mode
=
RLC_MODE_AM
;
break
;
default:
drb_p
->
rlc_mode
=
RLC_MODE_TM
;
break
;
}
if
(
!
(
RC
.
nrrrc
&&
RC
.
nrrrc
[
instance
]
->
node_type
==
ngran_gNB_DU
))
{
transport_layer_addr_t
addr
;
transport_layer_addr_t
addr
;
memcpy
(
addr
.
buffer
,
&
drb_p
->
up_ul_tnl
[
0
].
tl_address
,
sizeof
(
drb_p
->
up_ul_tnl
[
0
].
tl_address
));
addr
.
length
=
sizeof
(
drb_p
->
up_ul_tnl
[
0
].
tl_address
)
*
8
;
drb_p
->
up_dl_tnl
[
0
].
teid
=
newGtpuCreateTunnel
(
INSTANCE_DEFAULT
,
f1ap_ue_context_setup_req
->
rnti
,
drb_p
->
drb_id
,
drb_p
->
drb_id
,
drb_p
->
up_ul_tnl
[
0
].
teid
,
addr
,
drb_p
->
up_ul_tnl
[
0
].
port
,
lteDURecvCb
);
drb_p
->
up_dl_tnl_length
++
;
f1ap_ue_context_setup_req
->
rnti
,
drb_p
->
drb_id
,
drb_p
->
drb_id
,
drb_p
->
up_ul_tnl
[
0
].
teid
,
addr
,
drb_p
->
up_ul_tnl
[
0
].
port
,
lteDURecvCb
);
drb_p
->
up_dl_tnl_length
++
;
}
}
}
...
...
@@ -188,15 +190,15 @@ int DU_handle_UE_CONTEXT_SETUP_REQUEST(instance_t instance,
/* SRB */
F1AP_UEContextSetupRequestIEs_t
*
ieSrb
;
F1AP_FIND_PROTOCOLIE_BY_ID
(
F1AP_UEContextSetupRequestIEs_t
,
ieSrb
,
container
,
F1AP_ProtocolIE_ID_id_SRBs_ToBeSetup_List
,
false
);
F1AP_ProtocolIE_ID_id_SRBs_ToBeSetup_List
,
false
);
if
(
ieSrb
!=
NULL
)
{
f1ap_ue_context_setup_req
->
srbs_to_be_setup_length
=
ieSrb
->
value
.
choice
.
SRBs_ToBeSetup_List
.
list
.
count
;
f1ap_ue_context_setup_req
->
srbs_to_be_setup
=
calloc
(
f1ap_ue_context_setup_req
->
srbs_to_be_setup_length
,
sizeof
(
f1ap_srb_to_be_setup_t
));
sizeof
(
f1ap_srb_to_be_setup_t
));
AssertFatal
(
f1ap_ue_context_setup_req
->
srbs_to_be_setup
,
"could not allocate memory for f1ap_ue_context_setup_req->srbs_to_be_setup
\n
"
);
"could not allocate memory for f1ap_ue_context_setup_req->srbs_to_be_setup
\n
"
);
for
(
i
=
0
;
i
<
f1ap_ue_context_setup_req
->
srbs_to_be_setup_length
;
++
i
)
{
f1ap_srb_to_be_setup_t
*
srb_p
=
&
f1ap_ue_context_setup_req
->
srbs_to_be_setup
[
i
];
F1AP_SRBs_ToBeSetup_Item_t
*
srbs_tobesetup_item_p
;
...
...
@@ -234,11 +236,12 @@ int DU_handle_UE_CONTEXT_SETUP_REQUEST(instance_t instance,
LOG_W
(
F1AP
,
"can't find RRCContainer in UEContextSetupRequestIEs by id %ld
\n
"
,
F1AP_ProtocolIE_ID_id_RRCContainer
);
}
if
(
RC
.
nrrrc
&&
RC
.
nrrrc
[
instance
]
->
node_type
==
ngran_gNB_DU
)
if
(
RC
.
nrrrc
&&
RC
.
nrrrc
[
instance
]
->
node_type
==
ngran_gNB_DU
)
itti_send_msg_to_task
(
TASK_RRC_GNB
,
instance
,
msg_p
);
else
// in 4G, race conditon is to fix
DU_send_UE_CONTEXT_SETUP_RESPONSE
(
instance
,
f1ap_ue_context_setup_req
);
return
0
;
}
...
...
@@ -261,7 +264,7 @@ int DU_send_UE_CONTEXT_SETUP_RESPONSE(instance_t instance, f1ap_ue_context_setup
ie1
->
id
=
F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID
;
ie1
->
criticality
=
F1AP_Criticality_reject
;
ie1
->
value
.
present
=
F1AP_UEContextSetupResponseIEs__value_PR_GNB_CU_UE_F1AP_ID
;
ie1
->
value
.
choice
.
GNB_CU_UE_F1AP_ID
=
req
->
gNB_CU_ue_id
;
ie1
->
value
.
choice
.
GNB_CU_UE_F1AP_ID
=
req
->
gNB_CU_ue_id
;
/* mandatory */
/* c2. GNB_DU_UE_F1AP_ID */
asn1cSequenceAdd
(
out
->
protocolIEs
.
list
,
F1AP_UEContextSetupResponseIEs_t
,
ie2
);
...
...
@@ -269,33 +272,32 @@ int DU_send_UE_CONTEXT_SETUP_RESPONSE(instance_t instance, f1ap_ue_context_setup
ie2
->
criticality
=
F1AP_Criticality_reject
;
ie2
->
value
.
present
=
F1AP_UEContextSetupResponseIEs__value_PR_GNB_DU_UE_F1AP_ID
;
ie2
->
value
.
choice
.
GNB_DU_UE_F1AP_ID
=
f1ap_get_du_ue_f1ap_id
(
DUtype
,
instance
,
req
->
rnti
);
/* mandatory */
/* c3. DUtoCURRCInformation */
//if (0) {
asn1cSequenceAdd
(
out
->
protocolIEs
.
list
,
F1AP_UEContextSetupResponseIEs_t
,
ie3
);
ie3
->
id
=
F1AP_ProtocolIE_ID_id_DUtoCURRCInformation
;
ie3
->
criticality
=
F1AP_Criticality_reject
;
ie3
->
value
.
present
=
F1AP_UEContextSetupResponseIEs__value_PR_DUtoCURRCInformation
;
{
/* cellGroupConfig */
OCTET_STRING_fromBuf
(
&
ie3
->
value
.
choice
.
DUtoCURRCInformation
.
cellGroupConfig
,
(
const
char
*
)
req
->
du_to_cu_rrc_information
,
req
->
du_to_cu_rrc_information_length
);
/* OPTIONAL */
/* measGapConfig */
if
(
0
)
{
asn1cCalloc
(
ie3
->
value
.
choice
.
DUtoCURRCInformation
.
measGapConfig
,
tmp
);
OCTET_STRING_fromBuf
(
tmp
,
"asdsa"
,
strlen
(
"asdsa"
));
}
asn1cSequenceAdd
(
out
->
protocolIEs
.
list
,
F1AP_UEContextSetupResponseIEs_t
,
ie3
);
ie3
->
id
=
F1AP_ProtocolIE_ID_id_DUtoCURRCInformation
;
ie3
->
criticality
=
F1AP_Criticality_reject
;
ie3
->
value
.
present
=
F1AP_UEContextSetupResponseIEs__value_PR_DUtoCURRCInformation
;
{
/* cellGroupConfig */
OCTET_STRING_fromBuf
(
&
ie3
->
value
.
choice
.
DUtoCURRCInformation
.
cellGroupConfig
,
(
const
char
*
)
req
->
du_to_cu_rrc_information
,
req
->
du_to_cu_rrc_information_length
);
/* OPTIONAL */
/* requestedP_MaxFR1 */
if
(
0
)
{
asn1cCalloc
(
ie3
->
value
.
choice
.
DUtoCURRCInformation
.
requestedP_MaxFR1
,
tmp
);
OCTET_STRING_fromBuf
(
tmp
,
"asdsa"
,
strlen
(
"asdsa"
));
}
/* OPTIONAL */
/* measGapConfig */
if
(
0
)
{
asn1cCalloc
(
ie3
->
value
.
choice
.
DUtoCURRCInformation
.
measGapConfig
,
tmp
);
OCTET_STRING_fromBuf
(
tmp
,
"asdsa"
,
strlen
(
"asdsa"
));
}
/* OPTIONAL */
/* requestedP_MaxFR1 */
if
(
0
)
{
asn1cCalloc
(
ie3
->
value
.
choice
.
DUtoCURRCInformation
.
requestedP_MaxFR1
,
tmp
);
OCTET_STRING_fromBuf
(
tmp
,
"asdsa"
,
strlen
(
"asdsa"
));
}
}
//}
/* optional */
...
...
@@ -337,6 +339,7 @@ int DU_send_UE_CONTEXT_SETUP_RESPONSE(instance_t instance, f1ap_ue_context_setup
ie7
->
id
=
F1AP_ProtocolIE_ID_id_DRBs_Setup_List
;
ie7
->
criticality
=
F1AP_Criticality_ignore
;
ie7
->
value
.
present
=
F1AP_UEContextSetupResponseIEs__value_PR_DRBs_Setup_List
;
for
(
int
i
=
0
;
i
<
req
->
drbs_to_be_setup_length
;
i
++
)
{
//
asn1cSequenceAdd
(
ie7
->
value
.
choice
.
DRBs_Setup_List
.
list
,
...
...
@@ -375,148 +378,148 @@ int DU_send_UE_CONTEXT_SETUP_RESPONSE(instance_t instance, f1ap_ue_context_setup
/* mandatory */
/* c8. SRBs_FailedToBeSetup_List */
if
(
0
){
asn1cSequenceAdd
(
out
->
protocolIEs
.
list
,
F1AP_UEContextSetupResponseIEs_t
,
ie8
);
ie8
->
id
=
F1AP_ProtocolIE_ID_id_SRBs_FailedToBeSetup_List
;
ie8
->
criticality
=
F1AP_Criticality_ignore
;
ie8
->
value
.
present
=
F1AP_UEContextSetupResponseIEs__value_PR_SRBs_FailedToBeSetup_List
;
for
(
int
i
=
0
;
i
<
1
;
i
++
)
{
//
asn1cSequenceAdd
(
ie8
->
value
.
choice
.
SRBs_FailedToBeSetup_List
.
list
,
F1AP_SRBs_FailedToBeSetup_ItemIEs_t
,
srbs_failedToBeSetup_item_ies
);
srbs_failedToBeSetup_item_ies
->
id
=
F1AP_ProtocolIE_ID_id_SRBs_FailedToBeSetup_Item
;
srbs_failedToBeSetup_item_ies
->
criticality
=
F1AP_Criticality_ignore
;
srbs_failedToBeSetup_item_ies
->
value
.
present
=
F1AP_SRBs_FailedToBeSetup_ItemIEs__value_PR_SRBs_FailedToBeSetup_Item
;
/* 8.1 SRBs_Setup_Item */
F1AP_SRBs_FailedToBeSetup_Item_t
*
srbs_failedToBeSetup_item
=
&
srbs_failedToBeSetup_item_ies
->
value
.
choice
.
SRBs_FailedToBeSetup_Item
;
/* sRBID */
srbs_failedToBeSetup_item
->
sRBID
=
13L
;
/* cause */
asn1cCalloc
(
srbs_failedToBeSetup_item
->
cause
,
tmp
);
// dummy value
tmp
->
present
=
F1AP_Cause_PR_radioNetwork
;
switch
(
tmp
->
present
)
{
case
F1AP_Cause_PR_radioNetwork
:
tmp
->
choice
.
radioNetwork
=
F1AP_CauseRadioNetwork_unspecified
;
break
;
case
F1AP_Cause_PR_transport
:
tmp
->
choice
.
transport
=
F1AP_CauseTransport_unspecified
;
break
;
case
F1AP_Cause_PR_protocol
:
tmp
->
choice
.
protocol
=
F1AP_CauseProtocol_unspecified
;
break
;
case
F1AP_Cause_PR_misc
:
tmp
->
choice
.
misc
=
F1AP_CauseMisc_unspecified
;
break
;
case
F1AP_Cause_PR_NOTHING
:
default:
break
;
}
// switch
}
// for i
if
(
0
)
{
asn1cSequenceAdd
(
out
->
protocolIEs
.
list
,
F1AP_UEContextSetupResponseIEs_t
,
ie8
);
ie8
->
id
=
F1AP_ProtocolIE_ID_id_SRBs_FailedToBeSetup_List
;
ie8
->
criticality
=
F1AP_Criticality_ignore
;
ie8
->
value
.
present
=
F1AP_UEContextSetupResponseIEs__value_PR_SRBs_FailedToBeSetup_List
;
for
(
int
i
=
0
;
i
<
1
;
i
++
)
{
//
asn1cSequenceAdd
(
ie8
->
value
.
choice
.
SRBs_FailedToBeSetup_List
.
list
,
F1AP_SRBs_FailedToBeSetup_ItemIEs_t
,
srbs_failedToBeSetup_item_ies
);
srbs_failedToBeSetup_item_ies
->
id
=
F1AP_ProtocolIE_ID_id_SRBs_FailedToBeSetup_Item
;
srbs_failedToBeSetup_item_ies
->
criticality
=
F1AP_Criticality_ignore
;
srbs_failedToBeSetup_item_ies
->
value
.
present
=
F1AP_SRBs_FailedToBeSetup_ItemIEs__value_PR_SRBs_FailedToBeSetup_Item
;
/* 8.1 SRBs_Setup_Item */
F1AP_SRBs_FailedToBeSetup_Item_t
*
srbs_failedToBeSetup_item
=
&
srbs_failedToBeSetup_item_ies
->
value
.
choice
.
SRBs_FailedToBeSetup_Item
;
/* sRBID */
srbs_failedToBeSetup_item
->
sRBID
=
13L
;
/* cause */
asn1cCalloc
(
srbs_failedToBeSetup_item
->
cause
,
tmp
);
// dummy value
tmp
->
present
=
F1AP_Cause_PR_radioNetwork
;
switch
(
tmp
->
present
)
{
case
F1AP_Cause_PR_radioNetwork
:
tmp
->
choice
.
radioNetwork
=
F1AP_CauseRadioNetwork_unspecified
;
break
;
case
F1AP_Cause_PR_transport
:
tmp
->
choice
.
transport
=
F1AP_CauseTransport_unspecified
;
break
;
case
F1AP_Cause_PR_protocol
:
tmp
->
choice
.
protocol
=
F1AP_CauseProtocol_unspecified
;
break
;
case
F1AP_Cause_PR_misc
:
tmp
->
choice
.
misc
=
F1AP_CauseMisc_unspecified
;
break
;
case
F1AP_Cause_PR_NOTHING
:
default:
break
;
}
// switch
}
// for i
}
/* */
/* c9. DRBs_FailedToBeSetup_List */
if
(
0
){
asn1cSequenceAdd
(
out
->
protocolIEs
.
list
,
F1AP_UEContextSetupResponseIEs_t
,
ie9
);
ie9
->
id
=
F1AP_ProtocolIE_ID_id_DRBs_FailedToBeSetup_List
;
ie9
->
criticality
=
F1AP_Criticality_ignore
;
ie9
->
value
.
present
=
F1AP_UEContextSetupResponseIEs__value_PR_DRBs_FailedToBeSetup_List
;
for
(
int
i
=
0
;
i
<
1
;
i
++
)
{
asn1cSequenceAdd
(
ie9
->
value
.
choice
.
DRBs_FailedToBeSetup_List
.
list
,
F1AP_DRBs_FailedToBeSetup_ItemIEs_t
,
drbs_failedToBeSetup_item_ies
);
drbs_failedToBeSetup_item_ies
->
id
=
F1AP_ProtocolIE_ID_id_DRBs_FailedToBeSetup_Item
;
drbs_failedToBeSetup_item_ies
->
criticality
=
F1AP_Criticality_ignore
;
drbs_failedToBeSetup_item_ies
->
value
.
present
=
F1AP_DRBs_FailedToBeSetup_ItemIEs__value_PR_DRBs_FailedToBeSetup_Item
;
/* 9.1 DRBs_Setup_Item */
/* ADD */
F1AP_DRBs_FailedToBeSetup_Item_t
*
drbs_failedToBeSetup_item
=
&
drbs_failedToBeSetup_item_ies
->
value
.
choice
.
DRBs_FailedToBeSetup_Item
;
/* dRBID */
drbs_failedToBeSetup_item
->
dRBID
=
14
;
/* cause */
asn1cCalloc
(
drbs_failedToBeSetup_item
->
cause
,
tmp
);
// dummy value
tmp
->
present
=
F1AP_Cause_PR_radioNetwork
;
switch
(
tmp
->
present
)
{
case
F1AP_Cause_PR_radioNetwork
:
tmp
->
choice
.
radioNetwork
=
F1AP_CauseRadioNetwork_unspecified
;
break
;
case
F1AP_Cause_PR_transport
:
tmp
->
choice
.
transport
=
F1AP_CauseTransport_unspecified
;
break
;
case
F1AP_Cause_PR_protocol
:
tmp
->
choice
.
protocol
=
F1AP_CauseProtocol_unspecified
;
break
;
case
F1AP_Cause_PR_misc
:
tmp
->
choice
.
misc
=
F1AP_CauseMisc_unspecified
;
break
;
case
F1AP_Cause_PR_NOTHING
:
default:
break
;
}
// switch
}
// for i
if
(
0
)
{
asn1cSequenceAdd
(
out
->
protocolIEs
.
list
,
F1AP_UEContextSetupResponseIEs_t
,
ie9
);
ie9
->
id
=
F1AP_ProtocolIE_ID_id_DRBs_FailedToBeSetup_List
;
ie9
->
criticality
=
F1AP_Criticality_ignore
;
ie9
->
value
.
present
=
F1AP_UEContextSetupResponseIEs__value_PR_DRBs_FailedToBeSetup_List
;
for
(
int
i
=
0
;
i
<
1
;
i
++
)
{
asn1cSequenceAdd
(
ie9
->
value
.
choice
.
DRBs_FailedToBeSetup_List
.
list
,
F1AP_DRBs_FailedToBeSetup_ItemIEs_t
,
drbs_failedToBeSetup_item_ies
);
drbs_failedToBeSetup_item_ies
->
id
=
F1AP_ProtocolIE_ID_id_DRBs_FailedToBeSetup_Item
;
drbs_failedToBeSetup_item_ies
->
criticality
=
F1AP_Criticality_ignore
;
drbs_failedToBeSetup_item_ies
->
value
.
present
=
F1AP_DRBs_FailedToBeSetup_ItemIEs__value_PR_DRBs_FailedToBeSetup_Item
;
/* 9.1 DRBs_Setup_Item */
/* ADD */
F1AP_DRBs_FailedToBeSetup_Item_t
*
drbs_failedToBeSetup_item
=
&
drbs_failedToBeSetup_item_ies
->
value
.
choice
.
DRBs_FailedToBeSetup_Item
;
/* dRBID */
drbs_failedToBeSetup_item
->
dRBID
=
14
;
/* cause */
asn1cCalloc
(
drbs_failedToBeSetup_item
->
cause
,
tmp
);
// dummy value
tmp
->
present
=
F1AP_Cause_PR_radioNetwork
;
switch
(
tmp
->
present
)
{
case
F1AP_Cause_PR_radioNetwork
:
tmp
->
choice
.
radioNetwork
=
F1AP_CauseRadioNetwork_unspecified
;
break
;
case
F1AP_Cause_PR_transport
:
tmp
->
choice
.
transport
=
F1AP_CauseTransport_unspecified
;
break
;
case
F1AP_Cause_PR_protocol
:
tmp
->
choice
.
protocol
=
F1AP_CauseProtocol_unspecified
;
break
;
case
F1AP_Cause_PR_misc
:
tmp
->
choice
.
misc
=
F1AP_CauseMisc_unspecified
;
break
;
case
F1AP_Cause_PR_NOTHING
:
default:
break
;
}
// switch
}
// for i
}
// /* */
/* c10. SCell_FailedtoSetup_List */
if
(
0
){
asn1cSequenceAdd
(
out
->
protocolIEs
.
list
,
F1AP_UEContextSetupResponseIEs_t
,
ie10
);
ie10
->
id
=
F1AP_ProtocolIE_ID_id_SCell_FailedtoSetup_List
;
ie10
->
criticality
=
F1AP_Criticality_ignore
;
ie10
->
value
.
present
=
F1AP_UEContextSetupResponseIEs__value_PR_SCell_FailedtoSetup_List
;
for
(
int
i
=
0
;
i
<
1
;
i
++
)
{
asn1cSequenceAdd
(
ie10
->
value
.
choice
.
SCell_FailedtoSetup_List
.
list
,
F1AP_SCell_FailedtoSetup_ItemIEs_t
,
sCell_FailedtoSetup_item_ies
);
sCell_FailedtoSetup_item_ies
->
id
=
F1AP_ProtocolIE_ID_id_SCell_FailedtoSetup_Item
;
sCell_FailedtoSetup_item_ies
->
criticality
=
F1AP_Criticality_ignore
;
sCell_FailedtoSetup_item_ies
->
value
.
present
=
F1AP_SCell_FailedtoSetup_ItemIEs__value_PR_SCell_FailedtoSetup_Item
;
/* 10.1 DRBs_Setup_Item */
F1AP_SCell_FailedtoSetup_Item_t
*
sCell_FailedtoSetup_item
=
&
sCell_FailedtoSetup_item_ies
->
value
.
choice
.
SCell_FailedtoSetup_Item
;
/* sCell_ID */
addnRCGI
(
sCell_FailedtoSetup_item
->
sCell_ID
,
f1ap_req
(
false
,
instance
)
->
cell
+
i
);
/* cause */
asn1cCalloc
(
sCell_FailedtoSetup_item
->
cause
,
tmp
);
// dummy value
tmp
->
present
=
F1AP_Cause_PR_radioNetwork
;
switch
(
tmp
->
present
)
{
case
F1AP_Cause_PR_radioNetwork
:
tmp
->
choice
.
radioNetwork
=
F1AP_CauseRadioNetwork_unspecified
;
break
;
case
F1AP_Cause_PR_transport
:
tmp
->
choice
.
transport
=
F1AP_CauseTransport_unspecified
;
break
;
case
F1AP_Cause_PR_protocol
:
tmp
->
choice
.
protocol
=
F1AP_CauseProtocol_unspecified
;
break
;
case
F1AP_Cause_PR_misc
:
tmp
->
choice
.
misc
=
F1AP_CauseMisc_unspecified
;
break
;
case
F1AP_Cause_PR_NOTHING
:
default:
break
;
}
// switch
}
// for i
if
(
0
)
{
asn1cSequenceAdd
(
out
->
protocolIEs
.
list
,
F1AP_UEContextSetupResponseIEs_t
,
ie10
);
ie10
->
id
=
F1AP_ProtocolIE_ID_id_SCell_FailedtoSetup_List
;
ie10
->
criticality
=
F1AP_Criticality_ignore
;
ie10
->
value
.
present
=
F1AP_UEContextSetupResponseIEs__value_PR_SCell_FailedtoSetup_List
;
for
(
int
i
=
0
;
i
<
1
;
i
++
)
{
asn1cSequenceAdd
(
ie10
->
value
.
choice
.
SCell_FailedtoSetup_List
.
list
,
F1AP_SCell_FailedtoSetup_ItemIEs_t
,
sCell_FailedtoSetup_item_ies
);
sCell_FailedtoSetup_item_ies
->
id
=
F1AP_ProtocolIE_ID_id_SCell_FailedtoSetup_Item
;
sCell_FailedtoSetup_item_ies
->
criticality
=
F1AP_Criticality_ignore
;
sCell_FailedtoSetup_item_ies
->
value
.
present
=
F1AP_SCell_FailedtoSetup_ItemIEs__value_PR_SCell_FailedtoSetup_Item
;
/* 10.1 DRBs_Setup_Item */
F1AP_SCell_FailedtoSetup_Item_t
*
sCell_FailedtoSetup_item
=
&
sCell_FailedtoSetup_item_ies
->
value
.
choice
.
SCell_FailedtoSetup_Item
;
/* sCell_ID */
addnRCGI
(
sCell_FailedtoSetup_item
->
sCell_ID
,
f1ap_req
(
false
,
instance
)
->
cell
+
i
);
/* cause */
asn1cCalloc
(
sCell_FailedtoSetup_item
->
cause
,
tmp
);
// dummy value
tmp
->
present
=
F1AP_Cause_PR_radioNetwork
;
switch
(
tmp
->
present
)
{
case
F1AP_Cause_PR_radioNetwork
:
tmp
->
choice
.
radioNetwork
=
F1AP_CauseRadioNetwork_unspecified
;
break
;
case
F1AP_Cause_PR_transport
:
tmp
->
choice
.
transport
=
F1AP_CauseTransport_unspecified
;
break
;
case
F1AP_Cause_PR_protocol
:
tmp
->
choice
.
protocol
=
F1AP_CauseProtocol_unspecified
;
break
;
case
F1AP_Cause_PR_misc
:
tmp
->
choice
.
misc
=
F1AP_CauseMisc_unspecified
;
break
;
case
F1AP_Cause_PR_NOTHING
:
default:
break
;
}
// switch
}
// for i
}
/* mandatory */
...
...
@@ -528,7 +531,7 @@ int DU_send_UE_CONTEXT_SETUP_RESPONSE(instance_t instance, f1ap_ue_context_setup
for
(
int
i
=
0
;
i
<
req
->
srbs_to_be_setup_length
;
i
++
)
{
//
asn1cSequenceAdd
(
ie11
->
value
.
choice
.
SRBs_Setup_List
.
list
,
F1AP_SRBs_Setup_ItemIEs_t
,
srbs_setup_item_ies
);
F1AP_SRBs_Setup_ItemIEs_t
,
srbs_setup_item_ies
);
srbs_setup_item_ies
->
id
=
F1AP_ProtocolIE_ID_id_SRBs_Setup_Item
;
srbs_setup_item_ies
->
criticality
=
F1AP_Criticality_ignore
;
srbs_setup_item_ies
->
value
.
present
=
F1AP_SRBs_Setup_ItemIEs__value_PR_SRBs_Setup_Item
;
...
...
@@ -679,7 +682,6 @@ int DU_handle_UE_CONTEXT_RELEASE_COMMAND(instance_t instance,
AssertFatal
(
ctxt
.
rnti
==
rnti
,
"RNTI obtained through DU ID (%x) is different from CU ID (%x)
\n
"
,
rnti
,
ctxt
.
rnti
);
int
UE_out_of_sync
=
0
;
if
(
RC
.
nrrrc
&&
RC
.
nrrrc
[
instance
]
->
node_type
==
ngran_gNB_DU
)
{
...
...
@@ -753,34 +755,32 @@ int DU_handle_UE_CONTEXT_RELEASE_COMMAND(instance_t instance,
DU_send_UE_CONTEXT_RELEASE_COMPLETE
(
instance
,
&
cplt
);
return
0
;
}
else
{
struct
rrc_eNB_ue_context_s
*
ue_context_p
;
ue_context_p
=
rrc_eNB_get_ue_context
(
RC
.
rrc
[
ctxt
.
instance
],
ctxt
.
rnti
);
if
(
ue_context_p
&&
!
UE_out_of_sync
)
{
/* UE exists and is in sync so we start a timer before releasing the
* connection */
pthread_mutex_lock
(
&
rrc_release_freelist
);
for
(
uint16_t
release_num
=
0
;
release_num
<
NUMBER_OF_UE_MAX
;
release_num
++
)
{
if
(
rrc_release_info
.
RRC_release_ctrl
[
release_num
].
flag
==
0
)
{
if
(
ue_context_p
->
ue_context
.
ue_release_timer_s1
>
0
)
rrc_release_info
.
RRC_release_ctrl
[
release_num
].
flag
=
1
;
else
rrc_release_info
.
RRC_release_ctrl
[
release_num
].
flag
=
2
;
rrc_release_info
.
RRC_release_ctrl
[
release_num
].
rnti
=
ctxt
.
rnti
;
LOG_D
(
F1AP
,
"add rrc_release_info RNTI %x
\n
"
,
ctxt
.
rnti
);
// TODO: how to provide the correct MUI?
rrc_release_info
.
RRC_release_ctrl
[
release_num
].
rrc_eNB_mui
=
0
;
rrc_release_info
.
num_UEs
++
;
LOG_D
(
RRC
,
"Generate DLSCH Release send: index %d rnti %x mui %d flag %d
\n
"
,
release_num
,
ctxt
.
rnti
,
0
,
rrc_release_info
.
RRC_release_ctrl
[
release_num
].
flag
);
break
;
}
if
(
rrc_release_info
.
RRC_release_ctrl
[
release_num
].
flag
==
0
)
{
if
(
ue_context_p
->
ue_context
.
ue_release_timer_s1
>
0
)
rrc_release_info
.
RRC_release_ctrl
[
release_num
].
flag
=
1
;
else
rrc_release_info
.
RRC_release_ctrl
[
release_num
].
flag
=
2
;
rrc_release_info
.
RRC_release_ctrl
[
release_num
].
rnti
=
ctxt
.
rnti
;
LOG_D
(
F1AP
,
"add rrc_release_info RNTI %x
\n
"
,
ctxt
.
rnti
);
// TODO: how to provide the correct MUI?
rrc_release_info
.
RRC_release_ctrl
[
release_num
].
rrc_eNB_mui
=
0
;
rrc_release_info
.
num_UEs
++
;
LOG_D
(
RRC
,
"Generate DLSCH Release send: index %d rnti %x mui %d flag %d
\n
"
,
release_num
,
ctxt
.
rnti
,
0
,
rrc_release_info
.
RRC_release_ctrl
[
release_num
].
flag
);
break
;
}
}
pthread_mutex_unlock
(
&
rrc_release_freelist
);
ue_context_p
->
ue_context
.
ue_release_timer_s1
=
0
;
}
else
if
(
ue_context_p
&&
UE_out_of_sync
)
{
...
...
@@ -789,7 +789,7 @@ int DU_handle_UE_CONTEXT_RELEASE_COMMAND(instance_t instance,
}
else
{
LOG_E
(
F1AP
,
"no ue_context for RNTI %x, acknowledging release
\n
"
,
rnti
);
}
/* TODO send this once the connection has really been released */
f1ap_ue_context_release_cplt_t
cplt
;
cplt
.
rnti
=
ctxt
.
rnti
;
...
...
openair2/F1AP/f1ap_encoder.c
View file @
f9bb4150
...
...
@@ -50,10 +50,12 @@ int f1ap_encode_pdu(F1AP_F1AP_PDU_t *pdu, uint8_t **buffer, uint32_t *length) {
char
errbuf
[
128
];
/* Buffer for error message */
size_t
errlen
=
sizeof
(
errbuf
);
/* Size of the buffer */
int
ret
=
asn_check_constraints
(
&
asn_DEF_F1AP_F1AP_PDU
,
pdu
,
errbuf
,
&
errlen
);
/* assert(errlen < sizeof(errbuf)); // Guaranteed: you may rely on that */
if
(
ret
)
{
fprintf
(
stderr
,
"Constraint validation failed: %s
\n
"
,
errbuf
);
}
encoded
=
aper_encode_to_new_buffer
(
&
asn_DEF_F1AP_F1AP_PDU
,
0
,
pdu
,
(
void
**
)
buffer
);
if
(
encoded
<
0
)
{
...
...
openair3/ocp-gtpu/gtp_itf.cpp
View file @
f9bb4150
...
...
@@ -472,7 +472,7 @@ teid_t newGtpuCreateTunnel(instance_t instance, rnti_t rnti, int incoming_bearer
char
ip4
[
INET_ADDRSTRLEN
];
char
ip6
[
INET6_ADDRSTRLEN
];
LOG_I
(
GTPU
,
"[%ld] Created tunnel for RNTI %x, teid for DL: %x, teid for UL %x to remote IPv4: %s, IPv6 %s
\n
"
,
instance
,
instance
,
rnti
,
tmp
->
teid_incoming
,
tmp
->
teid_outgoing
,
...
...
@@ -485,7 +485,7 @@ int ocp_gtpv1u_create_s1u_tunnel(instance_t instance,
const
gtpv1u_enb_create_tunnel_req_t
*
create_tunnel_req
,
gtpv1u_enb_create_tunnel_resp_t
*
create_tunnel_resp
)
{
LOG_D
(
GTPU
,
"[%ld] Start create tunnels for RNTI %x, num_tunnels %d, sgw_S1u_teid %x
\n
"
,
instance
,
instance
,
create_tunnel_req
->
rnti
,
create_tunnel_req
->
num_tunnels
,
create_tunnel_req
->
sgw_S1u_teid
[
0
]);
...
...
@@ -520,7 +520,7 @@ int ocp_gtpv1u_update_s1u_tunnel(
const
rnti_t
prior_rnti
)
{
LOG_D
(
GTPU
,
"[%ld] Start update tunnels for old RNTI %x, new RNTI %x, num_tunnels %d, sgw_S1u_teid %x, eps_bearer_id %x
\n
"
,
instance
,
instance
,
prior_rnti
,
create_tunnel_req
->
rnti
,
create_tunnel_req
->
num_tunnels
,
...
...
@@ -553,7 +553,7 @@ int gtpv1u_create_ngu_tunnel( const instance_t instance,
const
gtpv1u_gnb_create_tunnel_req_t
*
const
create_tunnel_req
,
gtpv1u_gnb_create_tunnel_resp_t
*
const
create_tunnel_resp
)
{
LOG_D
(
GTPU
,
"[%ld] Start create tunnels for RNTI %x, num_tunnels %d, sgw_S1u_teid %x
\n
"
,
instance
,
instance
,
create_tunnel_req
->
rnti
,
create_tunnel_req
->
num_tunnels
,
create_tunnel_req
->
outgoing_teid
[
0
]);
...
...
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