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
zzha zzha
OpenXG-RAN
Commits
e155080e
Commit
e155080e
authored
Oct 30, 2023
by
Robert Schmidt
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Assoc ID CU->DU
parent
a377e523
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
124 additions
and
46 deletions
+124
-46
openair2/F1AP/f1ap_cu_task.c
openair2/F1AP/f1ap_cu_task.c
+1
-1
openair2/RRC/NR/mac_rrc_dl.h
openair2/RRC/NR/mac_rrc_dl.h
+8
-8
openair2/RRC/NR/mac_rrc_dl_direct.c
openair2/RRC/NR/mac_rrc_dl_direct.c
+56
-8
openair2/RRC/NR/mac_rrc_dl_f1ap.c
openair2/RRC/NR/mac_rrc_dl_f1ap.c
+16
-8
openair2/RRC/NR/rrc_gNB.c
openair2/RRC/NR/rrc_gNB.c
+36
-14
openair2/RRC/NR/rrc_gNB_du.c
openair2/RRC/NR/rrc_gNB_du.c
+7
-7
No files found.
openair2/F1AP/f1ap_cu_task.c
View file @
e155080e
...
...
@@ -145,7 +145,7 @@ void *F1AP_CU_task(void *arg) {
while
(
1
)
{
itti_receive_msg
(
TASK_CU_F1
,
&
received_msg
);
sctp_assoc_t
assoc_id
=
getCxt
(
0
)
!=
NULL
?
getCxt
(
0
)
->
assoc_id
:
0
;
sctp_assoc_t
assoc_id
=
ITTI_MSG_ORIGIN_INSTANCE
(
received_msg
)
;
LOG_D
(
F1AP
,
"CU Task Received %s for instance %ld: sending SCTP message via assoc_id %d
\n
"
,
ITTI_MSG_NAME
(
received_msg
),
ITTI_MSG_DESTINATION_INSTANCE
(
received_msg
),
assoc_id
);
switch
(
ITTI_MSG_ID
(
received_msg
))
{
...
...
openair2/RRC/NR/mac_rrc_dl.h
View file @
e155080e
...
...
@@ -25,16 +25,16 @@
#include "platform_types.h"
#include "f1ap_messages_types.h"
typedef
void
(
*
f1_setup_response_func_t
)(
const
f1ap_setup_resp_t
*
resp
);
typedef
void
(
*
f1_setup_failure_func_t
)(
const
f1ap_setup_failure_t
*
fail
);
typedef
void
(
*
f1_setup_response_func_t
)(
sctp_assoc_t
assoc_id
,
const
f1ap_setup_resp_t
*
resp
);
typedef
void
(
*
f1_setup_failure_func_t
)(
sctp_assoc_t
assoc_id
,
const
f1ap_setup_failure_t
*
fail
);
typedef
void
(
*
ue_context_setup_request_func_t
)(
const
f1ap_ue_context_setup_t
*
req
);
typedef
void
(
*
ue_context_modification_request_func_t
)(
const
f1ap_ue_context_modif_req_t
*
req
);
typedef
void
(
*
ue_context_modification_confirm_func_t
)(
const
f1ap_ue_context_modif_confirm_t
*
confirm
);
typedef
void
(
*
ue_context_modification_refuse_func_t
)(
const
f1ap_ue_context_modif_refuse_t
*
refuse
);
typedef
void
(
*
ue_context_release_command_func_t
)(
const
f1ap_ue_context_release_cmd_t
*
cmd
);
typedef
void
(
*
ue_context_setup_request_func_t
)(
sctp_assoc_t
assoc_id
,
const
f1ap_ue_context_setup_t
*
req
);
typedef
void
(
*
ue_context_modification_request_func_t
)(
sctp_assoc_t
assoc_id
,
const
f1ap_ue_context_modif_req_t
*
req
);
typedef
void
(
*
ue_context_modification_confirm_func_t
)(
sctp_assoc_t
assoc_id
,
const
f1ap_ue_context_modif_confirm_t
*
confirm
);
typedef
void
(
*
ue_context_modification_refuse_func_t
)(
sctp_assoc_t
assoc_id
,
const
f1ap_ue_context_modif_refuse_t
*
refuse
);
typedef
void
(
*
ue_context_release_command_func_t
)(
sctp_assoc_t
assoc_id
,
const
f1ap_ue_context_release_cmd_t
*
cmd
);
typedef
void
(
*
dl_rrc_message_transfer_func_t
)(
const
f1ap_dl_rrc_message_t
*
dl_rrc
);
typedef
void
(
*
dl_rrc_message_transfer_func_t
)(
sctp_assoc_t
assoc_id
,
const
f1ap_dl_rrc_message_t
*
dl_rrc
);
struct
nr_mac_rrc_dl_if_s
;
void
mac_rrc_dl_direct_init
(
struct
nr_mac_rrc_dl_if_s
*
mac_rrc
);
...
...
openair2/RRC/NR/mac_rrc_dl_direct.c
View file @
e155080e
...
...
@@ -24,14 +24,62 @@
#include "mac_rrc_dl.h"
#include "openair2/LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.h"
static
void
f1_setup_response_direct
(
sctp_assoc_t
assoc_id
,
const
f1ap_setup_resp_t
*
resp
)
{
AssertFatal
(
assoc_id
==
-
1
,
"illegal assoc_id %d
\n
"
,
assoc_id
);
f1_setup_response
(
resp
);
}
static
void
f1_setup_failure_direct
(
sctp_assoc_t
assoc_id
,
const
f1ap_setup_failure_t
*
fail
)
{
AssertFatal
(
assoc_id
==
-
1
,
"illegal assoc_id %d
\n
"
,
assoc_id
);
f1_setup_failure
(
fail
);
}
static
void
ue_context_setup_request_direct
(
sctp_assoc_t
assoc_id
,
const
f1ap_ue_context_setup_t
*
req
)
{
AssertFatal
(
assoc_id
==
-
1
,
"illegal assoc_id %d
\n
"
,
assoc_id
);
ue_context_setup_request
(
req
);
}
static
void
ue_context_modification_request_direct
(
sctp_assoc_t
assoc_id
,
const
f1ap_ue_context_modif_req_t
*
req
)
{
AssertFatal
(
assoc_id
==
-
1
,
"illegal assoc_id %d
\n
"
,
assoc_id
);
ue_context_modification_request
(
req
);
}
static
void
ue_context_modification_confirm_direct
(
sctp_assoc_t
assoc_id
,
const
f1ap_ue_context_modif_confirm_t
*
confirm
)
{
AssertFatal
(
assoc_id
==
-
1
,
"illegal assoc_id %d
\n
"
,
assoc_id
);
ue_context_modification_confirm
(
confirm
);
}
static
void
ue_context_modification_refuse_direct
(
sctp_assoc_t
assoc_id
,
const
f1ap_ue_context_modif_refuse_t
*
refuse
)
{
AssertFatal
(
assoc_id
==
-
1
,
"illegal assoc_id %d
\n
"
,
assoc_id
);
ue_context_modification_refuse
(
refuse
);
}
static
void
ue_context_release_command_direct
(
sctp_assoc_t
assoc_id
,
const
f1ap_ue_context_release_cmd_t
*
cmd
)
{
AssertFatal
(
assoc_id
==
-
1
,
"illegal assoc_id %d
\n
"
,
assoc_id
);
ue_context_release_command
(
cmd
);
}
static
void
dl_rrc_message_transfer_direct
(
sctp_assoc_t
assoc_id
,
const
f1ap_dl_rrc_message_t
*
dl_rrc
)
{
AssertFatal
(
assoc_id
==
-
1
,
"illegal assoc_id %d
\n
"
,
assoc_id
);
dl_rrc_message_transfer
(
dl_rrc
);
}
void
mac_rrc_dl_direct_init
(
nr_mac_rrc_dl_if_t
*
mac_rrc
)
{
mac_rrc
->
f1_setup_response
=
f1_setup_response
;
mac_rrc
->
f1_setup_failure
=
f1_setup_failure
;
mac_rrc
->
ue_context_setup_request
=
ue_context_setup_request
;
mac_rrc
->
ue_context_modification_request
=
ue_context_modification_request
;
mac_rrc
->
ue_context_modification_confirm
=
ue_context_modification_confirm
;
mac_rrc
->
ue_context_modification_refuse
=
ue_context_modification_refuse
;
mac_rrc
->
ue_context_release_command
=
ue_context_release_command
;
mac_rrc
->
dl_rrc_message_transfer
=
dl_rrc_message_transfer
;
mac_rrc
->
f1_setup_response
=
f1_setup_response
_direct
;
mac_rrc
->
f1_setup_failure
=
f1_setup_failure
_direct
;
mac_rrc
->
ue_context_setup_request
=
ue_context_setup_request
_direct
;
mac_rrc
->
ue_context_modification_request
=
ue_context_modification_request
_direct
;
mac_rrc
->
ue_context_modification_confirm
=
ue_context_modification_confirm
_direct
;
mac_rrc
->
ue_context_modification_refuse
=
ue_context_modification_refuse
_direct
;
mac_rrc
->
ue_context_release_command
=
ue_context_release_command
_direct
;
mac_rrc
->
dl_rrc_message_transfer
=
dl_rrc_message_transfer
_direct
;
}
openair2/RRC/NR/mac_rrc_dl_f1ap.c
View file @
e155080e
...
...
@@ -24,9 +24,10 @@
#include "mac_rrc_dl.h"
#include "nr_rrc_defs.h"
static
void
f1_setup_response_f1ap
(
const
f1ap_setup_resp_t
*
resp
)
static
void
f1_setup_response_f1ap
(
sctp_assoc_t
assoc_id
,
const
f1ap_setup_resp_t
*
resp
)
{
MessageDef
*
msg
=
itti_alloc_new_message
(
TASK_RRC_GNB
,
0
,
F1AP_SETUP_RESP
);
msg
->
ittiMsgHeader
.
originInstance
=
assoc_id
;
f1ap_setup_resp_t
*
f1ap_msg
=
&
F1AP_SETUP_RESP
(
msg
);
*
f1ap_msg
=
*
resp
;
if
(
resp
->
gNB_CU_name
!=
NULL
)
...
...
@@ -34,17 +35,19 @@ static void f1_setup_response_f1ap(const f1ap_setup_resp_t *resp)
itti_send_msg_to_task
(
TASK_CU_F1
,
0
,
msg
);
}
static
void
f1_setup_failure_f1ap
(
const
f1ap_setup_failure_t
*
fail
)
static
void
f1_setup_failure_f1ap
(
sctp_assoc_t
assoc_id
,
const
f1ap_setup_failure_t
*
fail
)
{
MessageDef
*
msg
=
itti_alloc_new_message
(
TASK_RRC_GNB
,
0
,
F1AP_SETUP_FAILURE
);
msg
->
ittiMsgHeader
.
originInstance
=
assoc_id
;
f1ap_setup_failure_t
*
f1ap_msg
=
&
F1AP_SETUP_FAILURE
(
msg
);
*
f1ap_msg
=
*
fail
;
itti_send_msg_to_task
(
TASK_CU_F1
,
0
,
msg
);
}
static
void
ue_context_setup_request_f1ap
(
const
f1ap_ue_context_setup_t
*
req
)
static
void
ue_context_setup_request_f1ap
(
sctp_assoc_t
assoc_id
,
const
f1ap_ue_context_setup_t
*
req
)
{
MessageDef
*
msg
=
itti_alloc_new_message
(
TASK_RRC_GNB
,
0
,
F1AP_UE_CONTEXT_SETUP_REQ
);
msg
->
ittiMsgHeader
.
originInstance
=
assoc_id
;
f1ap_ue_context_setup_t
*
f1ap_msg
=
&
F1AP_UE_CONTEXT_SETUP_REQ
(
msg
);
*
f1ap_msg
=
*
req
;
AssertFatal
(
req
->
cu_to_du_rrc_information
==
NULL
,
"cu_to_du_rrc_information not supported yet
\n
"
);
...
...
@@ -59,9 +62,10 @@ static void ue_context_setup_request_f1ap(const f1ap_ue_context_setup_t *req)
itti_send_msg_to_task
(
TASK_CU_F1
,
0
,
msg
);
}
static
void
ue_context_modification_request_f1ap
(
const
f1ap_ue_context_modif_req_t
*
req
)
static
void
ue_context_modification_request_f1ap
(
sctp_assoc_t
assoc_id
,
const
f1ap_ue_context_modif_req_t
*
req
)
{
MessageDef
*
msg
=
itti_alloc_new_message
(
TASK_RRC_GNB
,
0
,
F1AP_UE_CONTEXT_MODIFICATION_REQ
);
msg
->
ittiMsgHeader
.
originInstance
=
assoc_id
;
f1ap_ue_context_modif_req_t
*
f1ap_msg
=
&
F1AP_UE_CONTEXT_MODIFICATION_REQ
(
msg
);
*
f1ap_msg
=
*
req
;
if
(
req
->
cu_to_du_rrc_information
!=
NULL
)
{
...
...
@@ -110,9 +114,10 @@ static void ue_context_modification_request_f1ap(const f1ap_ue_context_modif_req
itti_send_msg_to_task
(
TASK_CU_F1
,
0
,
msg
);
}
static
void
ue_context_modification_confirm_f1ap
(
const
f1ap_ue_context_modif_confirm_t
*
confirm
)
static
void
ue_context_modification_confirm_f1ap
(
sctp_assoc_t
assoc_id
,
const
f1ap_ue_context_modif_confirm_t
*
confirm
)
{
MessageDef
*
msg
=
itti_alloc_new_message
(
TASK_MAC_GNB
,
0
,
F1AP_UE_CONTEXT_MODIFICATION_CONFIRM
);
msg
->
ittiMsgHeader
.
originInstance
=
assoc_id
;
f1ap_ue_context_modif_confirm_t
*
f1ap_msg
=
&
F1AP_UE_CONTEXT_MODIFICATION_CONFIRM
(
msg
);
f1ap_msg
->
gNB_CU_ue_id
=
confirm
->
gNB_CU_ue_id
;
f1ap_msg
->
gNB_DU_ue_id
=
confirm
->
gNB_DU_ue_id
;
...
...
@@ -127,17 +132,19 @@ static void ue_context_modification_confirm_f1ap(const f1ap_ue_context_modif_con
itti_send_msg_to_task
(
TASK_CU_F1
,
0
,
msg
);
}
static
void
ue_context_modification_refuse_f1ap
(
const
f1ap_ue_context_modif_refuse_t
*
refuse
)
static
void
ue_context_modification_refuse_f1ap
(
sctp_assoc_t
assoc_id
,
const
f1ap_ue_context_modif_refuse_t
*
refuse
)
{
MessageDef
*
msg
=
itti_alloc_new_message
(
TASK_MAC_GNB
,
0
,
F1AP_UE_CONTEXT_MODIFICATION_REFUSE
);
msg
->
ittiMsgHeader
.
originInstance
=
assoc_id
;
f1ap_ue_context_modif_refuse_t
*
f1ap_msg
=
&
F1AP_UE_CONTEXT_MODIFICATION_REFUSE
(
msg
);
*
f1ap_msg
=
*
refuse
;
itti_send_msg_to_task
(
TASK_CU_F1
,
0
,
msg
);
}
static
void
ue_context_release_command_f1ap
(
const
f1ap_ue_context_release_cmd_t
*
cmd
)
static
void
ue_context_release_command_f1ap
(
sctp_assoc_t
assoc_id
,
const
f1ap_ue_context_release_cmd_t
*
cmd
)
{
MessageDef
*
message_p
=
itti_alloc_new_message
(
TASK_RRC_GNB
,
0
,
F1AP_UE_CONTEXT_RELEASE_CMD
);
message_p
->
ittiMsgHeader
.
originInstance
=
assoc_id
;
f1ap_ue_context_release_cmd_t
*
msg
=
&
F1AP_UE_CONTEXT_RELEASE_CMD
(
message_p
);
*
msg
=
*
cmd
;
if
(
cmd
->
rrc_container_length
>
0
)
{
...
...
@@ -149,11 +156,12 @@ static void ue_context_release_command_f1ap(const f1ap_ue_context_release_cmd_t
itti_send_msg_to_task
(
TASK_CU_F1
,
0
,
message_p
);
}
static
void
dl_rrc_message_transfer_f1ap
(
const
f1ap_dl_rrc_message_t
*
dl_rrc
)
static
void
dl_rrc_message_transfer_f1ap
(
sctp_assoc_t
assoc_id
,
const
f1ap_dl_rrc_message_t
*
dl_rrc
)
{
/* TODO call F1AP function directly? no real-time constraint here */
MessageDef
*
message_p
=
itti_alloc_new_message
(
TASK_RRC_GNB
,
0
,
F1AP_DL_RRC_MESSAGE
);
message_p
->
ittiMsgHeader
.
originInstance
=
assoc_id
;
f1ap_dl_rrc_message_t
*
msg
=
&
F1AP_DL_RRC_MESSAGE
(
message_p
);
*
msg
=
*
dl_rrc
;
if
(
dl_rrc
->
old_gNB_DU_ue_id
)
{
...
...
openair2/RRC/NR/rrc_gNB.c
View file @
e155080e
...
...
@@ -110,6 +110,16 @@ static inline uint64_t bitStr_to_uint64(const BIT_STRING_t *asn);
mui_t
rrc_gNB_mui
=
0
;
// the assoc_id might be 0 (if the DU goes offline). Below helper macro to
// print an error and return from the function in that case
#define RETURN_IF_INVALID_ASSOC_ID(ue_data) \
{ \
if (ue_data.du_assoc_id == 0) { \
LOG_E(NR_RRC, "cannot send data: invalid assoc_id 0, DU offline\n"); \
return; \
} \
}
///---------------------------------------------------------------------------------------------------------------///
///---------------------------------------------------------------------------------------------------------------///
...
...
@@ -189,6 +199,7 @@ static void freeDRBlist(NR_DRB_ToAddModList_t *list)
typedef
struct
deliver_dl_rrc_message_data_s
{
const
gNB_RRC_INST
*
rrc
;
f1ap_dl_rrc_message_t
*
dl_rrc
;
sctp_assoc_t
assoc_id
;
}
deliver_dl_rrc_message_data_t
;
static
void
rrc_deliver_dl_rrc_message
(
void
*
deliver_pdu_data
,
ue_id_t
ue_id
,
int
srb_id
,
char
*
buf
,
int
size
,
int
sdu_id
)
{
...
...
@@ -197,7 +208,7 @@ static void rrc_deliver_dl_rrc_message(void *deliver_pdu_data, ue_id_t ue_id, in
data
->
dl_rrc
->
rrc_container
=
(
uint8_t
*
)
buf
;
data
->
dl_rrc
->
rrc_container_length
=
size
;
DevAssert
(
data
->
dl_rrc
->
srb_id
==
srb_id
);
data
->
rrc
->
mac_rrc
.
dl_rrc_message_transfer
(
data
->
dl_rrc
);
data
->
rrc
->
mac_rrc
.
dl_rrc_message_transfer
(
data
->
assoc_id
,
data
->
dl_rrc
);
}
...
...
@@ -205,8 +216,9 @@ void nr_rrc_transfer_protected_rrc_message(const gNB_RRC_INST *rrc, const gNB_RR
{
DevAssert
(
size
>
0
);
f1_ue_data_t
ue_data
=
cu_get_f1_ue_data
(
ue_p
->
rrc_ue_id
);
RETURN_IF_INVALID_ASSOC_ID
(
ue_data
);
f1ap_dl_rrc_message_t
dl_rrc
=
{.
gNB_CU_ue_id
=
ue_p
->
rrc_ue_id
,
.
gNB_DU_ue_id
=
ue_data
.
secondary_ue
,
.
srb_id
=
srb_id
};
deliver_dl_rrc_message_data_t
data
=
{.
rrc
=
rrc
,
.
dl_rrc
=
&
dl_rrc
};
deliver_dl_rrc_message_data_t
data
=
{.
rrc
=
rrc
,
.
dl_rrc
=
&
dl_rrc
,
.
assoc_id
=
ue_data
.
du_assoc_id
};
nr_pdcp_data_req_srb
(
ue_p
->
rrc_ue_id
,
srb_id
,
rrc_gNB_mui
++
,
size
,
(
unsigned
char
*
const
)
buffer
,
rrc_deliver_dl_rrc_message
,
&
data
);
}
...
...
@@ -452,6 +464,7 @@ static void rrc_gNB_generate_RRCSetup(instance_t instance,
freeSRBlist
(
SRBs
);
f1_ue_data_t
ue_data
=
cu_get_f1_ue_data
(
ue_p
->
rrc_ue_id
);
RETURN_IF_INVALID_ASSOC_ID
(
ue_data
);
f1ap_dl_rrc_message_t
dl_rrc
=
{
.
gNB_CU_ue_id
=
ue_p
->
rrc_ue_id
,
.
gNB_DU_ue_id
=
ue_data
.
secondary_ue
,
...
...
@@ -459,7 +472,7 @@ static void rrc_gNB_generate_RRCSetup(instance_t instance,
.
rrc_container_length
=
size
,
.
srb_id
=
CCCH
};
rrc
->
mac_rrc
.
dl_rrc_message_transfer
(
&
dl_rrc
);
rrc
->
mac_rrc
.
dl_rrc_message_transfer
(
ue_data
.
du_assoc_id
,
&
dl_rrc
);
}
static
void
rrc_gNB_generate_RRCReject
(
module_id_t
module_id
,
rrc_gNB_ue_context_t
*
const
ue_context_pP
)
...
...
@@ -481,6 +494,7 @@ static void rrc_gNB_generate_RRCReject(module_id_t module_id, rrc_gNB_ue_context
LOG_I
(
NR_RRC
,
" [RAPROC] ue %04x Logical Channel DL-CCCH, Generating NR_RRCReject (bytes %d)
\n
"
,
ue_p
->
rnti
,
size
);
f1_ue_data_t
ue_data
=
cu_get_f1_ue_data
(
ue_p
->
rrc_ue_id
);
RETURN_IF_INVALID_ASSOC_ID
(
ue_data
);
f1ap_dl_rrc_message_t
dl_rrc
=
{
.
gNB_CU_ue_id
=
ue_p
->
rrc_ue_id
,
.
gNB_DU_ue_id
=
ue_data
.
secondary_ue
,
...
...
@@ -490,7 +504,7 @@ static void rrc_gNB_generate_RRCReject(module_id_t module_id, rrc_gNB_ue_context
.
execute_duplication
=
1
,
.
RAT_frequency_priority_information
.
en_dc
=
0
};
rrc
->
mac_rrc
.
dl_rrc_message_transfer
(
&
dl_rrc
);
rrc
->
mac_rrc
.
dl_rrc_message_transfer
(
ue_data
.
du_assoc_id
,
&
dl_rrc
);
}
//-----------------------------------------------------------------------------
...
...
@@ -1038,12 +1052,13 @@ static void rrc_gNB_generate_RRCReestablishment(rrc_gNB_ue_context_t *ue_context
nr_pdcp_reestablishment
(
ue_p
->
rrc_ue_id
);
f1_ue_data_t
ue_data
=
cu_get_f1_ue_data
(
ue_p
->
rrc_ue_id
);
RETURN_IF_INVALID_ASSOC_ID
(
ue_data
);
uint32_t
old_gNB_DU_ue_id
=
old_rnti
;
f1ap_dl_rrc_message_t
dl_rrc
=
{.
gNB_CU_ue_id
=
ue_p
->
rrc_ue_id
,
.
gNB_DU_ue_id
=
ue_data
.
secondary_ue
,
.
srb_id
=
DCCH
,
.
old_gNB_DU_ue_id
=
&
old_gNB_DU_ue_id
};
deliver_dl_rrc_message_data_t
data
=
{.
rrc
=
rrc
,
.
dl_rrc
=
&
dl_rrc
};
deliver_dl_rrc_message_data_t
data
=
{.
rrc
=
rrc
,
.
dl_rrc
=
&
dl_rrc
,
.
assoc_id
=
ue_data
.
du_assoc_id
};
nr_pdcp_data_req_srb
(
ue_p
->
rrc_ue_id
,
DCCH
,
rrc_gNB_mui
++
,
size
,
(
unsigned
char
*
const
)
buffer
,
rrc_deliver_dl_rrc_message
,
&
data
);
}
...
...
@@ -1573,6 +1588,7 @@ static void handle_rrcReconfigurationComplete(const protocol_ctxt_t *const ctxt_
gNB_RRC_INST
*
rrc
=
RC
.
nrrrc
[
0
];
f1_ue_data_t
ue_data
=
cu_get_f1_ue_data
(
UE
->
rrc_ue_id
);
RETURN_IF_INVALID_ASSOC_ID
(
ue_data
);
f1ap_ue_context_modif_req_t
ue_context_modif_req
=
{
.
gNB_CU_ue_id
=
UE
->
rrc_ue_id
,
.
gNB_DU_ue_id
=
ue_data
.
secondary_ue
,
...
...
@@ -1583,7 +1599,7 @@ static void handle_rrcReconfigurationComplete(const protocol_ctxt_t *const ctxt_
.
servCellId
=
0
,
/* TODO: correct value? */
.
ReconfigComplOutcome
=
successful_reconfig
?
RRCreconf_success
:
RRCreconf_failure
,
};
rrc
->
mac_rrc
.
ue_context_modification_request
(
&
ue_context_modif_req
);
rrc
->
mac_rrc
.
ue_context_modification_request
(
ue_data
.
du_assoc_id
,
&
ue_context_modif_req
);
}
//-----------------------------------------------------------------------------
int
rrc_gNB_decode_dcch
(
const
protocol_ctxt_t
*
const
ctxt_pP
,
...
...
@@ -1953,7 +1969,7 @@ static void rrc_CU_process_ue_modification_required(MessageDef *msg_p)
.
cause
=
F1AP_CAUSE_RADIO_NETWORK
,
.
cause_value
=
F1AP_CauseRadioNetwork_unknown_or_already_allocated_gnb_cu_ue_f1ap_id
,
};
rrc
->
mac_rrc
.
ue_context_modification_refuse
(
&
refuse
);
rrc
->
mac_rrc
.
ue_context_modification_refuse
(
msg_p
->
ittiMsgHeader
.
originInstance
,
&
refuse
);
return
;
}
...
...
@@ -1978,7 +1994,7 @@ static void rrc_CU_process_ue_modification_required(MessageDef *msg_p)
.
cause
=
F1AP_CAUSE_PROTOCOL
,
.
cause_value
=
F1AP_CauseProtocol_transfer_syntax_error
,
};
rrc
->
mac_rrc
.
ue_context_modification_refuse
(
&
refuse
);
rrc
->
mac_rrc
.
ue_context_modification_refuse
(
msg_p
->
ittiMsgHeader
.
originInstance
,
&
refuse
);
return
;
}
...
...
@@ -2065,6 +2081,7 @@ void rrc_gNB_process_e1_bearer_context_setup_resp(e1ap_bearer_setup_resp_t *resp
}
f1_ue_data_t
ue_data
=
cu_get_f1_ue_data
(
UE
->
rrc_ue_id
);
RETURN_IF_INVALID_ASSOC_ID
(
ue_data
);
f1ap_ue_context_modif_req_t
ue_context_modif_req
=
{
.
gNB_CU_ue_id
=
UE
->
rrc_ue_id
,
.
gNB_DU_ue_id
=
ue_data
.
secondary_ue
,
...
...
@@ -2079,7 +2096,7 @@ void rrc_gNB_process_e1_bearer_context_setup_resp(e1ap_bearer_setup_resp_t *resp
.
drbs_to_be_setup
=
drbs
,
.
cu_to_du_rrc_information
=
cu2du_p
,
};
rrc
->
mac_rrc
.
ue_context_modification_request
(
&
ue_context_modif_req
);
rrc
->
mac_rrc
.
ue_context_modification_request
(
ue_data
.
du_assoc_id
,
&
ue_context_modif_req
);
}
void
rrc_gNB_process_e1_bearer_context_modif_resp
(
const
e1ap_bearer_modif_resp_t
*
resp
)
...
...
@@ -2380,6 +2397,7 @@ void *rrc_gnb_task(void *args_p) {
typedef
struct
deliver_ue_ctxt_setup_data_t
{
gNB_RRC_INST
*
rrc
;
f1ap_ue_context_setup_t
*
setup_req
;
sctp_assoc_t
assoc_id
;
}
deliver_ue_ctxt_setup_data_t
;
static
void
rrc_deliver_ue_ctxt_setup_req
(
void
*
deliver_pdu_data
,
ue_id_t
ue_id
,
int
srb_id
,
char
*
buf
,
int
size
,
int
sdu_id
)
{
...
...
@@ -2387,7 +2405,7 @@ static void rrc_deliver_ue_ctxt_setup_req(void *deliver_pdu_data, ue_id_t ue_id,
deliver_ue_ctxt_setup_data_t
*
data
=
deliver_pdu_data
;
data
->
setup_req
->
rrc_container
=
(
uint8_t
*
)
buf
;
data
->
setup_req
->
rrc_container_length
=
size
;
data
->
rrc
->
mac_rrc
.
ue_context_setup_request
(
data
->
setup_req
);
data
->
rrc
->
mac_rrc
.
ue_context_setup_request
(
data
->
assoc_id
,
data
->
setup_req
);
}
//-----------------------------------------------------------------------------
...
...
@@ -2421,6 +2439,7 @@ rrc_gNB_generate_SecurityModeCommand(
/* the callback will fill the UE context setup request and forward it */
f1_ue_data_t
ue_data
=
cu_get_f1_ue_data
(
ue_p
->
rrc_ue_id
);
RETURN_IF_INVALID_ASSOC_ID
(
ue_data
);
f1ap_ue_context_setup_t
ue_context_setup_req
=
{
.
gNB_CU_ue_id
=
ue_p
->
rrc_ue_id
,
.
gNB_DU_ue_id
=
ue_data
.
secondary_ue
,
...
...
@@ -2433,7 +2452,7 @@ rrc_gNB_generate_SecurityModeCommand(
.
drbs_to_be_setup
=
0
,
/* no new DRBs */
.
cu_to_du_rrc_information
=
cu2du_p
,
};
deliver_ue_ctxt_setup_data_t
data
=
{.
rrc
=
rrc
,
.
setup_req
=
&
ue_context_setup_req
};
deliver_ue_ctxt_setup_data_t
data
=
{.
rrc
=
rrc
,
.
setup_req
=
&
ue_context_setup_req
,
.
assoc_id
=
ue_data
.
du_assoc_id
};
nr_pdcp_data_req_srb
(
ctxt_pP
->
rntiMaybeUEid
,
DCCH
,
rrc_gNB_mui
++
,
size
,
buffer
,
rrc_deliver_ue_ctxt_setup_req
,
&
data
);
}
...
...
@@ -2467,6 +2486,7 @@ rrc_gNB_generate_UECapabilityEnquiry(
typedef
struct
deliver_ue_ctxt_release_data_t
{
gNB_RRC_INST
*
rrc
;
f1ap_ue_context_release_cmd_t
*
release_cmd
;
sctp_assoc_t
assoc_id
;
}
deliver_ue_ctxt_release_data_t
;
static
void
rrc_deliver_ue_ctxt_release_cmd
(
void
*
deliver_pdu_data
,
ue_id_t
ue_id
,
int
srb_id
,
char
*
buf
,
int
size
,
int
sdu_id
)
{
...
...
@@ -2474,7 +2494,7 @@ static void rrc_deliver_ue_ctxt_release_cmd(void *deliver_pdu_data, ue_id_t ue_i
deliver_ue_ctxt_release_data_t
*
data
=
deliver_pdu_data
;
data
->
release_cmd
->
rrc_container
=
(
uint8_t
*
)
buf
;
data
->
release_cmd
->
rrc_container_length
=
size
;
data
->
rrc
->
mac_rrc
.
ue_context_release_command
(
data
->
release_cmd
);
data
->
rrc
->
mac_rrc
.
ue_context_release_command
(
data
->
assoc_id
,
data
->
release_cmd
);
}
//-----------------------------------------------------------------------------
...
...
@@ -2500,6 +2520,7 @@ rrc_gNB_generate_RRCRelease(
gNB_RRC_INST
*
rrc
=
RC
.
nrrrc
[
ctxt_pP
->
module_id
];
const
gNB_RRC_UE_t
*
UE
=
&
ue_context_pP
->
ue_context
;
f1_ue_data_t
ue_data
=
cu_get_f1_ue_data
(
UE
->
rrc_ue_id
);
RETURN_IF_INVALID_ASSOC_ID
(
ue_data
);
f1ap_ue_context_release_cmd_t
ue_context_release_cmd
=
{
.
gNB_CU_ue_id
=
UE
->
rrc_ue_id
,
.
gNB_DU_ue_id
=
ue_data
.
secondary_ue
,
...
...
@@ -2507,7 +2528,7 @@ rrc_gNB_generate_RRCRelease(
.
cause_value
=
10
,
// 10 = F1AP_CauseRadioNetwork_normal_release
.
srb_id
=
DCCH
,
};
deliver_ue_ctxt_release_data_t
data
=
{.
rrc
=
rrc
,
.
release_cmd
=
&
ue_context_release_cmd
};
deliver_ue_ctxt_release_data_t
data
=
{.
rrc
=
rrc
,
.
release_cmd
=
&
ue_context_release_cmd
,
.
assoc_id
=
ue_data
.
du_assoc_id
};
nr_pdcp_data_req_srb
(
ctxt_pP
->
rntiMaybeUEid
,
DCCH
,
rrc_gNB_mui
++
,
size
,
buffer
,
rrc_deliver_ue_ctxt_release_cmd
,
&
data
);
sctp_assoc_t
assoc_id
=
get_existing_cuup_for_ue
(
rrc
,
UE
);
...
...
@@ -2644,6 +2665,7 @@ void rrc_gNB_trigger_release_bearer(int rnti)
f1ap_drb_to_be_released_t
drbs_to_be_released
[
1
]
=
{{.
rb_id
=
drb_id
}};
f1_ue_data_t
ue_data
=
cu_get_f1_ue_data
(
ue
->
rrc_ue_id
);
RETURN_IF_INVALID_ASSOC_ID
(
ue_data
);
f1ap_ue_context_modif_req_t
ue_context_modif_req
=
{
.
gNB_CU_ue_id
=
ue
->
rrc_ue_id
,
.
gNB_DU_ue_id
=
ue_data
.
secondary_ue
,
...
...
@@ -2659,7 +2681,7 @@ void rrc_gNB_trigger_release_bearer(int rnti)
.
drbs_to_be_released_length
=
1
,
.
drbs_to_be_released
=
drbs_to_be_released
,
};
rrc
->
mac_rrc
.
ue_context_modification_request
(
&
ue_context_modif_req
);
rrc
->
mac_rrc
.
ue_context_modification_request
(
ue_data
.
du_assoc_id
,
&
ue_context_modif_req
);
}
int
rrc_gNB_generate_pcch_msg
(
sctp_assoc_t
assoc_id
,
const
NR_SIB1_t
*
sib1
,
uint32_t
tmsi
,
uint8_t
paging_drx
)
...
...
openair2/RRC/NR/rrc_gNB_du.c
View file @
e155080e
...
...
@@ -54,13 +54,13 @@ void rrc_gNB_process_f1_setup_req(f1ap_setup_req_t *req, sctp_assoc_t assoc_id)
const
f1ap_setup_req_t
*
other
=
rrc
->
du
->
setup_req
;
LOG_E
(
NR_RRC
,
"can only handle one DU, but already serving DU %ld (%s)
\n
"
,
other
->
gNB_DU_id
,
other
->
gNB_DU_name
);
f1ap_setup_failure_t
fail
=
{.
cause
=
F1AP_CauseRadioNetwork_gNB_CU_Cell_Capacity_Exceeded
};
rrc
->
mac_rrc
.
f1_setup_failure
(
&
fail
);
rrc
->
mac_rrc
.
f1_setup_failure
(
assoc_id
,
&
fail
);
return
;
}
if
(
req
->
num_cells_available
!=
1
)
{
LOG_E
(
NR_RRC
,
"can only handle on DU cell, but gNB_DU %ld has %d
\n
"
,
req
->
gNB_DU_id
,
req
->
num_cells_available
);
f1ap_setup_failure_t
fail
=
{.
cause
=
F1AP_CauseRadioNetwork_gNB_CU_Cell_Capacity_Exceeded
};
rrc
->
mac_rrc
.
f1_setup_failure
(
&
fail
);
rrc
->
mac_rrc
.
f1_setup_failure
(
assoc_id
,
&
fail
);
return
;
}
f1ap_served_cell_info_t
*
cell_info
=
&
req
->
cell
[
0
].
info
;
...
...
@@ -74,7 +74,7 @@ void rrc_gNB_process_f1_setup_req(f1ap_setup_req_t *req, sctp_assoc_t assoc_id)
cell_info
->
plmn
.
mnc
,
cell_info
->
nr_cellid
);
f1ap_setup_failure_t
fail
=
{.
cause
=
F1AP_CauseRadioNetwork_plmn_not_served_by_the_gNB_CU
};
rrc
->
mac_rrc
.
f1_setup_failure
(
&
fail
);
rrc
->
mac_rrc
.
f1_setup_failure
(
assoc_id
,
&
fail
);
return
;
}
// if there is no system info or no SIB1 and we run in SA mode, we cannot handle it
...
...
@@ -82,7 +82,7 @@ void rrc_gNB_process_f1_setup_req(f1ap_setup_req_t *req, sctp_assoc_t assoc_id)
if
(
sys_info
==
NULL
||
sys_info
->
mib
==
NULL
||
(
sys_info
->
sib1
==
NULL
&&
get_softmodem_params
()
->
sa
))
{
LOG_E
(
NR_RRC
,
"no system information provided by DU, rejecting
\n
"
);
f1ap_setup_failure_t
fail
=
{.
cause
=
F1AP_CauseProtocol_semantic_error
};
rrc
->
mac_rrc
.
f1_setup_failure
(
&
fail
);
rrc
->
mac_rrc
.
f1_setup_failure
(
assoc_id
,
&
fail
);
return
;
}
...
...
@@ -94,7 +94,7 @@ void rrc_gNB_process_f1_setup_req(f1ap_setup_req_t *req, sctp_assoc_t assoc_id)
||
mib
->
message
.
choice
.
messageClassExtension
==
NULL
)
{
LOG_E
(
RRC
,
"Failed to decode NR_BCCH_BCH_MESSAGE (%zu bits) of DU, rejecting DU
\n
"
,
dec_rval
.
consumed
);
f1ap_setup_failure_t
fail
=
{.
cause
=
F1AP_CauseProtocol_semantic_error
};
rrc
->
mac_rrc
.
f1_setup_failure
(
&
fail
);
rrc
->
mac_rrc
.
f1_setup_failure
(
assoc_id
,
&
fail
);
ASN_STRUCT_FREE
(
asn_DEF_NR_BCCH_BCH_Message
,
mib
);
return
;
}
...
...
@@ -105,7 +105,7 @@ void rrc_gNB_process_f1_setup_req(f1ap_setup_req_t *req, sctp_assoc_t assoc_id)
if
(
dec_rval
.
code
!=
RC_OK
)
{
LOG_E
(
RRC
,
"Failed to decode NR_SIB1 (%zu bits) of DU, rejecting DU
\n
"
,
dec_rval
.
consumed
);
f1ap_setup_failure_t
fail
=
{.
cause
=
F1AP_CauseProtocol_semantic_error
};
rrc
->
mac_rrc
.
f1_setup_failure
(
&
fail
);
rrc
->
mac_rrc
.
f1_setup_failure
(
assoc_id
,
&
fail
);
ASN_STRUCT_FREE
(
asn_DEF_NR_SIB1
,
sib1
);
return
;
}
...
...
@@ -140,7 +140,7 @@ void rrc_gNB_process_f1_setup_req(f1ap_setup_req_t *req, sctp_assoc_t assoc_id)
f1ap_setup_resp_t
resp
=
{.
num_cells_to_activate
=
1
,
.
cells_to_activate
[
0
]
=
cell
};
if
(
rrc
->
node_name
!=
NULL
)
resp
.
gNB_CU_name
=
strdup
(
rrc
->
node_name
);
rrc
->
mac_rrc
.
f1_setup_response
(
&
resp
);
rrc
->
mac_rrc
.
f1_setup_response
(
assoc_id
,
&
resp
);
/*
MessageDef *msg_p2 = itti_alloc_new_message(TASK_RRC_GNB, 0, F1AP_GNB_CU_CONFIGURATION_UPDATE);
...
...
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