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
f0923f68
Commit
f0923f68
authored
Aug 29, 2023
by
Robert Schmidt
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'origin/int-f1-ue-ctxt-modif-req' into integration_2023_w34
parents
1bb77d65
31af346e
Changes
28
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
28 changed files
with
836 additions
and
278 deletions
+836
-278
CMakeLists.txt
CMakeLists.txt
+3
-6
ci-scripts/yaml_files/sa_e1_b200_gnb/docker-compose.yml
ci-scripts/yaml_files/sa_e1_b200_gnb/docker-compose.yml
+1
-1
ci-scripts/yaml_files/sa_f1_b200_gnb/docker-compose.yml
ci-scripts/yaml_files/sa_f1_b200_gnb/docker-compose.yml
+1
-1
openair2/COMMON/f1ap_messages_def.h
openair2/COMMON/f1ap_messages_def.h
+3
-0
openair2/COMMON/f1ap_messages_types.h
openair2/COMMON/f1ap_messages_types.h
+25
-0
openair2/F1AP/f1ap_cu_task.c
openair2/F1AP/f1ap_cu_task.c
+10
-0
openair2/F1AP/f1ap_cu_ue_context_management.c
openair2/F1AP/f1ap_cu_ue_context_management.c
+258
-8
openair2/F1AP/f1ap_cu_ue_context_management.h
openair2/F1AP/f1ap_cu_ue_context_management.h
+5
-6
openair2/F1AP/f1ap_du_task.c
openair2/F1AP/f1ap_du_task.c
+4
-0
openair2/F1AP/f1ap_du_ue_context_management.c
openair2/F1AP/f1ap_du_ue_context_management.c
+247
-7
openair2/F1AP/f1ap_du_ue_context_management.h
openair2/F1AP/f1ap_du_ue_context_management.h
+4
-6
openair2/F1AP/f1ap_handlers.c
openair2/F1AP/f1ap_handlers.c
+1
-1
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
+4
-195
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
+26
-3
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c
+5
-3
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
+13
-5
openair2/LAYER2/NR_MAC_gNB/mac_proto.h
openair2/LAYER2/NR_MAC_gNB/mac_proto.h
+2
-0
openair2/LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.c
openair2/LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.c
+58
-0
openair2/LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.h
openair2/LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.h
+2
-0
openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul.h
openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul.h
+1
-0
openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul_direct.c
openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul_direct.c
+26
-0
openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul_f1ap.c
openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul_f1ap.c
+26
-0
openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
+1
-2
openair2/RRC/NR/mac_rrc_dl.h
openair2/RRC/NR/mac_rrc_dl.h
+2
-0
openair2/RRC/NR/mac_rrc_dl_direct.c
openair2/RRC/NR/mac_rrc_dl_direct.c
+2
-0
openair2/RRC/NR/mac_rrc_dl_f1ap.c
openair2/RRC/NR/mac_rrc_dl_f1ap.c
+27
-0
openair2/RRC/NR/nr_rrc_defs.h
openair2/RRC/NR/nr_rrc_defs.h
+2
-0
openair2/RRC/NR/rrc_gNB.c
openair2/RRC/NR/rrc_gNB.c
+77
-34
No files found.
CMakeLists.txt
View file @
f0923f68
...
...
@@ -1403,9 +1403,6 @@ if(E2_AGENT)
endif
()
add_library
(
MAC_NR
${
MAC_NR_SRC
}
)
target_link_libraries
(
MAC_NR PRIVATE asn1_lte_rrc_hdrs asn1_nr_rrc_hdrs
)
add_library
(
MAC_UE_NR
${
MAC_NR_SRC_UE
}
)
target_link_libraries
(
MAC_UE_NR PRIVATE asn1_lte_rrc_hdrs asn1_nr_rrc_hdrs
)
...
...
@@ -2233,7 +2230,7 @@ add_executable(nr_dlsim
${
PHY_INTERFACE_DIR
}
/queue_t.c
)
target_link_libraries
(
nr_dlsim PRIVATE
-Wl,--start-group UTIL SIMU SIMU_ETH PHY_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB SCHED_NR_UE_LIB MAC_
NR MAC_
UE_NR MAC_NR_COMMON nr_rrc CONFIG_LIB L2_NR HASHTABLE x2ap SECURITY ngap -lz -Wl,--end-group
-Wl,--start-group UTIL SIMU SIMU_ETH PHY_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB SCHED_NR_UE_LIB MAC_UE_NR MAC_NR_COMMON nr_rrc CONFIG_LIB L2_NR HASHTABLE x2ap SECURITY ngap -lz -Wl,--end-group
m pthread
${
T_LIB
}
ITTI dl shlib_loader
)
target_link_libraries
(
nr_dlsim PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs
)
...
...
@@ -2277,7 +2274,7 @@ if (ENABLE_LDPC_T1)
endif
()
target_link_libraries
(
nr_ulsim PRIVATE
-Wl,--start-group UTIL SIMU SIMU_ETH PHY_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB SCHED_NR_UE_LIB MAC_
NR MAC_
UE_NR MAC_NR_COMMON nr_rrc CONFIG_LIB L2_NR HASHTABLE x2ap SECURITY ngap -lz -Wl,--end-group
-Wl,--start-group UTIL SIMU SIMU_ETH PHY_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB SCHED_NR_UE_LIB MAC_UE_NR MAC_NR_COMMON nr_rrc CONFIG_LIB L2_NR HASHTABLE x2ap SECURITY ngap -lz -Wl,--end-group
m pthread
${
T_LIB
}
ITTI dl shlib_loader
)
target_link_libraries
(
nr_ulsim PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs
)
...
...
@@ -2339,7 +2336,7 @@ if (${T_TRACER})
NFAPI_COMMON_LIB NFAPI_LIB NFAPI_PNF_LIB NFAPI_VNF_LIB NFAPI_USER_LIB
MISC_NFAPI_LTE_LIB MISC_NFAPI_NR_LIB
PHY_COMMON PHY PHY_UE PHY_NR PHY_NR_COMMON PHY_NR_UE PHY_RU PHY_MEX
L2 L2_LTE L2_NR L2_LTE_NR L2_UE NR_L2_UE L2_UE_LTE_NR MAC_NR_COMMON MAC_
NR MAC_
UE_NR ngap
L2 L2_LTE L2_NR L2_LTE_NR L2_UE NR_L2_UE L2_UE_LTE_NR MAC_NR_COMMON MAC_UE_NR ngap
CN_UTILS GTPV1U SCTP_CLIENT MME_APP LIB_NAS_UE NB_IoT SIMU SIMU_ETH OPENAIR0_LIB
ldpc_orig ldpc_optim ldpc_optim8seg ldpc dfts
)
if
(
TARGET
${
i
}
)
...
...
ci-scripts/yaml_files/sa_e1_b200_gnb/docker-compose.yml
View file @
f0923f68
...
...
@@ -43,7 +43,7 @@ services:
container_name
:
sa-du-b200-gnb
environment
:
USE_B2XX
:
'
yes'
USE_ADDITIONAL_OPTIONS
:
--sa --RUs.[0].sdr_addrs serial=30C51D4 --continuous-tx -E --log_config.global_log_options level,nocolor,time,line_num,function --gNBs.[0].min_rxtxtime 2 --gNBs.[0].do_CSIRS 1 --gNBs.[0].do_SRS 1 --RUs.[0].att_rx 1
4 --RUs.[0].att_tx
14
USE_ADDITIONAL_OPTIONS
:
--sa --RUs.[0].sdr_addrs serial=30C51D4 --continuous-tx -E --log_config.global_log_options level,nocolor,time,line_num,function --gNBs.[0].min_rxtxtime 2 --gNBs.[0].do_CSIRS 1 --gNBs.[0].do_SRS 1 --RUs.[0].att_rx 1
8 --RUs.[0].att_tx
18
volumes
:
-
../../conf_files/gnb-du.sa.band78.106prb.usrpb200.conf:/opt/oai-gnb/etc/gnb.conf
-
/dev:/dev
...
...
ci-scripts/yaml_files/sa_f1_b200_gnb/docker-compose.yml
View file @
f0923f68
...
...
@@ -26,7 +26,7 @@ services:
container_name
:
sa-du-b200-gnb
environment
:
USE_B2XX
:
'
yes'
USE_ADDITIONAL_OPTIONS
:
--sa --RUs.[0].sdr_addrs serial=30C51D4 --continuous-tx -E --telnetsrv --telnetsrv.shrmod ci --log_config.global_log_options level,nocolor,time,line_num,function --gNBs.[0].min_rxtxtime 2 --gNBs.[0].do_CSIRS 1 --gNBs.[0].do_SRS 1 --RUs.[0].att_rx 1
4 --RUs.[0].att_tx
14
USE_ADDITIONAL_OPTIONS
:
--sa --RUs.[0].sdr_addrs serial=30C51D4 --continuous-tx -E --telnetsrv --telnetsrv.shrmod ci --log_config.global_log_options level,nocolor,time,line_num,function --gNBs.[0].min_rxtxtime 2 --gNBs.[0].do_CSIRS 1 --gNBs.[0].do_SRS 1 --RUs.[0].att_rx 1
8 --RUs.[0].att_tx
18
volumes
:
-
../../conf_files/gnb-du.sa.band78.106prb.usrpb200.conf:/opt/oai-gnb/etc/gnb.conf
-
/dev:/dev
...
...
openair2/COMMON/f1ap_messages_def.h
View file @
f0923f68
...
...
@@ -40,6 +40,7 @@ MESSAGE_DEF(F1AP_UL_RRC_MESSAGE , MESSAGE_PRIORITY_MED, f1ap_ul_r
MESSAGE_DEF
(
F1AP_UE_CONTEXT_RELEASE_REQ
,
MESSAGE_PRIORITY_MED
,
f1ap_ue_context_release_req_t
,
f1ap_ue_context_release_req
)
MESSAGE_DEF
(
F1AP_UE_CONTEXT_RELEASE_CMD
,
MESSAGE_PRIORITY_MED
,
f1ap_ue_context_release_cmd_t
,
f1ap_ue_context_release_cmd
)
MESSAGE_DEF
(
F1AP_UE_CONTEXT_RELEASE_COMPLETE
,
MESSAGE_PRIORITY_MED
,
f1ap_ue_context_release_complete_t
,
f1ap_ue_context_release_complete
)
MESSAGE_DEF
(
F1AP_UE_CONTEXT_MODIFICATION_REQUIRED
,
MESSAGE_PRIORITY_MED
,
f1ap_ue_context_modif_required_t
,
f1ap_ue_context_modification_required
)
/* RRC -> F1AP messages */
MESSAGE_DEF
(
F1AP_DL_RRC_MESSAGE
,
MESSAGE_PRIORITY_MED
,
f1ap_dl_rrc_message_t
,
f1ap_dl_rrc_message
)
...
...
@@ -48,6 +49,8 @@ MESSAGE_DEF(F1AP_UE_CONTEXT_SETUP_REQ, MESSAGE_PRIORITY_MED, f1ap_ue_context_se
MESSAGE_DEF
(
F1AP_UE_CONTEXT_SETUP_RESP
,
MESSAGE_PRIORITY_MED
,
f1ap_ue_context_setup_t
,
f1ap_ue_context_setup_resp
)
MESSAGE_DEF
(
F1AP_UE_CONTEXT_MODIFICATION_REQ
,
MESSAGE_PRIORITY_MED
,
f1ap_ue_context_modif_req_t
,
f1ap_ue_context_modification_req
)
MESSAGE_DEF
(
F1AP_UE_CONTEXT_MODIFICATION_RESP
,
MESSAGE_PRIORITY_MED
,
f1ap_ue_context_modif_resp_t
,
f1ap_ue_context_modification_resp
)
MESSAGE_DEF
(
F1AP_UE_CONTEXT_MODIFICATION_CONFIRM
,
MESSAGE_PRIORITY_MED
,
f1ap_ue_context_modif_confirm_t
,
f1ap_ue_context_modification_confirm
)
MESSAGE_DEF
(
F1AP_UE_CONTEXT_MODIFICATION_REFUSE
,
MESSAGE_PRIORITY_MED
,
f1ap_ue_context_modif_refuse_t
,
f1ap_ue_context_modification_refuse
)
/* CU -> DU*/
MESSAGE_DEF
(
F1AP_PAGING_IND
,
MESSAGE_PRIORITY_MED
,
f1ap_paging_ind_t
,
f1ap_paging_ind
)
openair2/COMMON/f1ap_messages_types.h
View file @
f0923f68
...
...
@@ -44,6 +44,9 @@
#define F1AP_UE_CONTEXT_MODIFICATION_REQ(mSGpTR) (mSGpTR)->ittiMsg.f1ap_ue_context_modification_req
#define F1AP_UE_CONTEXT_MODIFICATION_RESP(mSGpTR) (mSGpTR)->ittiMsg.f1ap_ue_context_modification_resp
#define F1AP_UE_CONTEXT_MODIFICATION_FAIL(mSGpTR) (mSGpTR)->ittiMsg.f1ap_ue_context_modification_fail
#define F1AP_UE_CONTEXT_MODIFICATION_REQUIRED(mSGpTR) (mSGpTR)->ittiMsg.f1ap_ue_context_modification_required
#define F1AP_UE_CONTEXT_MODIFICATION_CONFIRM(mSGpTR) (mSGpTR)->ittiMsg.f1ap_ue_context_modification_confirm
#define F1AP_UE_CONTEXT_MODIFICATION_REFUSE(mSGpTR) (mSGpTR)->ittiMsg.f1ap_ue_context_modification_refuse
#define F1AP_DL_RRC_MESSAGE(mSGpTR) (mSGpTR)->ittiMsg.f1ap_dl_rrc_message
#define F1AP_UE_CONTEXT_RELEASE_REQ(mSGpTR) (mSGpTR)->ittiMsg.f1ap_ue_context_release_req
...
...
@@ -417,6 +420,28 @@ typedef enum F1ap_Cause_e {
F1AP_CAUSE_MISC
,
}
f1ap_Cause_t
;
typedef
struct
f1ap_ue_context_modif_required_t
{
uint32_t
gNB_CU_ue_id
;
uint32_t
gNB_DU_ue_id
;
du_to_cu_rrc_information_t
*
du_to_cu_rrc_information
;
f1ap_Cause_t
cause
;
long
cause_value
;
}
f1ap_ue_context_modif_required_t
;
typedef
struct
f1ap_ue_context_modif_confirm_t
{
uint32_t
gNB_CU_ue_id
;
uint32_t
gNB_DU_ue_id
;
uint8_t
*
rrc_container
;
int
rrc_container_length
;
}
f1ap_ue_context_modif_confirm_t
;
typedef
struct
f1ap_ue_context_modif_refuse_t
{
uint32_t
gNB_CU_ue_id
;
uint32_t
gNB_DU_ue_id
;
f1ap_Cause_t
cause
;
long
cause_value
;
}
f1ap_ue_context_modif_refuse_t
;
typedef
struct
f1ap_ue_context_release_s
{
uint32_t
gNB_CU_ue_id
;
uint32_t
gNB_DU_ue_id
;
...
...
openair2/F1AP/f1ap_cu_task.c
View file @
f0923f68
...
...
@@ -184,6 +184,16 @@ void *F1AP_CU_task(void *arg) {
&
F1AP_PAGING_IND
(
received_msg
));
break
;
case
F1AP_UE_CONTEXT_MODIFICATION_CONFIRM
:
CU_send_UE_CONTEXT_MODIFICATION_CONFIRM
(
ITTI_MSG_DESTINATION_INSTANCE
(
received_msg
),
&
F1AP_UE_CONTEXT_MODIFICATION_CONFIRM
(
received_msg
));
break
;
case
F1AP_UE_CONTEXT_MODIFICATION_REFUSE
:
CU_send_UE_CONTEXT_MODIFICATION_REFUSE
(
ITTI_MSG_DESTINATION_INSTANCE
(
received_msg
),
&
F1AP_UE_CONTEXT_MODIFICATION_REFUSE
(
received_msg
));
break
;
// case F1AP_SETUP_RESPONSE: // This is from RRC
// CU_send_F1_SETUP_RESPONSE(instance, *f1ap_setup_ind, &(F1AP_SETUP_RESP) f1ap_setup_resp)
// break;
...
...
openair2/F1AP/f1ap_cu_ue_context_management.c
View file @
f0923f68
This diff is collapsed.
Click to expand it.
openair2/F1AP/f1ap_cu_ue_context_management.h
View file @
f0923f68
...
...
@@ -85,12 +85,11 @@ int CU_handle_UE_CONTEXT_MODIFICATION_FAILURE(instance_t instance,
/*
* UE Context Modification Required (gNB-DU initiated)
*/
int
CU_handle_UE_CONTEXT_MODIFICATION_REQUIRED
(
instance_t
instance
,
uint32_t
assoc_id
,
uint32_t
stream
,
F1AP_F1AP_PDU_t
*
pdu
);
int
CU_send_UE_CONTEXT_MODIFICATION_CONFIRM
(
instance_t
instance
,
F1AP_UEContextModificationConfirm_t
UEContextModificationConfirm_t
);
int
CU_handle_UE_CONTEXT_MODIFICATION_REQUIRED
(
instance_t
instance
,
uint32_t
assoc_id
,
uint32_t
stream
,
F1AP_F1AP_PDU_t
*
pdu
);
int
CU_send_UE_CONTEXT_MODIFICATION_CONFIRM
(
instance_t
instance
,
f1ap_ue_context_modif_confirm_t
*
confirm
);
int
CU_send_UE_CONTEXT_MODIFICATION_REFUSE
(
instance_t
instance
,
f1ap_ue_context_modif_refuse_t
*
refuse
);
/*
* UE Inactivity Notification
...
...
openair2/F1AP/f1ap_du_task.c
View file @
f0923f68
...
...
@@ -169,6 +169,10 @@ void *F1AP_DU_task(void *arg) {
DU_send_UE_CONTEXT_RELEASE_COMPLETE
(
myInstance
,
&
F1AP_UE_CONTEXT_RELEASE_COMPLETE
(
msg
));
break
;
case
F1AP_UE_CONTEXT_MODIFICATION_REQUIRED
:
DU_send_UE_CONTEXT_MODIFICATION_REQUIRED
(
myInstance
,
&
F1AP_UE_CONTEXT_MODIFICATION_REQUIRED
(
msg
));
break
;
case
TERMINATE_MESSAGE
:
LOG_W
(
F1AP
,
" *** Exiting F1AP thread
\n
"
);
itti_exit_task
();
...
...
openair2/F1AP/f1ap_du_ue_context_management.c
View file @
f0923f68
This diff is collapsed.
Click to expand it.
openair2/F1AP/f1ap_du_ue_context_management.h
View file @
f0923f68
...
...
@@ -79,13 +79,11 @@ int DU_send_UE_CONTEXT_MODIFICATION_FAILURE(instance_t instance);
/*
* UE Context Modification Required (gNB-DU initiated)
*/
int
DU_send_UE_CONTEXT_MODIFICATION_REQUIRED
(
instance_t
instance
);
int
DU_handle_UE_CONTEXT_MODIFICATION_CONFIRM
(
instance_t
instance
,
uint32_t
assoc_id
,
uint32_t
stream
,
F1AP_F1AP_PDU_t
*
pdu
);
int
DU_send_UE_CONTEXT_MODIFICATION_REQUIRED
(
instance_t
instance
,
f1ap_ue_context_modif_required_t
*
required
);
int
DU_send_UE_CONTEXT_SETUP_RESPONSE
(
instance_t
instance
,
f1ap_ue_context_setup_t
*
req
);
int
DU_handle_UE_CONTEXT_MODIFICATION_CONFIRM
(
instance_t
instance
,
uint32_t
assoc_id
,
uint32_t
stream
,
F1AP_F1AP_PDU_t
*
pdu
);
int
DU_handle_UE_CONTEXT_MODIFICATION_REFUSE
(
instance_t
instance
,
uint32_t
assoc_id
,
uint32_t
stream
,
F1AP_F1AP_PDU_t
*
pdu
);
/*
* UE Inactivity Notification
...
...
openair2/F1AP/f1ap_handlers.c
View file @
f0923f68
...
...
@@ -52,7 +52,7 @@ static const f1ap_message_processing_t f1ap_messages_processing[][3] = {
{
DU_handle_UE_CONTEXT_SETUP_REQUEST
,
CU_handle_UE_CONTEXT_SETUP_RESPONSE
,
0
},
/* UEContextSetup */
{
DU_handle_UE_CONTEXT_RELEASE_COMMAND
,
CU_handle_UE_CONTEXT_RELEASE_COMPLETE
,
0
},
/* UEContextRelease */
{
DU_handle_UE_CONTEXT_MODIFICATION_REQUEST
,
CU_handle_UE_CONTEXT_MODIFICATION_RESPONSE
,
0
},
/* UEContextModification */
{
0
,
0
,
0
},
/* UEContextModificationRequired */
{
CU_handle_UE_CONTEXT_MODIFICATION_REQUIRED
,
DU_handle_UE_CONTEXT_MODIFICATION_CONFIRM
,
DU_handle_UE_CONTEXT_MODIFICATION_REFUSE
},
/* UEContextModificationRequired */
{
0
,
0
,
0
},
/* UEMobilityCommand */
{
CU_handle_UE_CONTEXT_RELEASE_REQUEST
,
0
,
0
},
/* UEContextReleaseRequest */
{
CU_handle_INITIAL_UL_RRC_MESSAGE_TRANSFER
,
0
,
0
},
/* InitialULRRCMessageTransfer */
...
...
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
View file @
f0923f68
This diff is collapsed.
Click to expand it.
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
View file @
f0923f68
...
...
@@ -43,11 +43,13 @@
#include "UTIL/OPT/opt.h"
#include "openair2/LAYER2/nr_rlc/nr_rlc_oai_api.h"
#include "F1AP_CauseRadioNetwork.h"
#include "RRC/NR/MESSAGES/asn1_msg.h"
#include "intertask_interface.h"
#include "openair2/F1AP/f1ap_ids.h"
#include "F1AP_CauseRadioNetwork.h"
#include "T.h"
...
...
@@ -2945,12 +2947,33 @@ void nr_mac_check_ul_failure(const gNB_MAC_INST *nrmac, int rnti, NR_UE_sched_ct
* stop at 0 and we wait for a UE release command from upper layers */
if
(
sched_ctrl
->
ul_failure_timer
==
1
)
{
f1_ue_data_t
ue_data
=
du_get_f1_ue_data
(
rnti
);
f1ap_ue_context_release_
complete_t
complete
=
{
f1ap_ue_context_release_
req_t
request
=
{
.
gNB_CU_ue_id
=
ue_data
.
secondary_ue
,
.
gNB_DU_ue_id
=
rnti
,
.
cause
=
F1AP_CAUSE_RADIO_NETWORK
,
.
cause_value
=
12
,
// F1AP_CauseRadioNetwork_rl_failure_others
.
cause_value
=
F1AP_CauseRadioNetwork_rl_failure_others
,
};
nrmac
->
mac_rrc
.
ue_context_release_request
(
&
complete
);
nrmac
->
mac_rrc
.
ue_context_release_request
(
&
request
);
}
}
void
nr_mac_trigger_reconfiguration
(
const
gNB_MAC_INST
*
nrmac
,
const
NR_UE_info_t
*
UE
)
{
DevAssert
(
UE
->
CellGroup
!=
NULL
);
uint8_t
buf
[
2048
];
asn_enc_rval_t
enc_rval
=
uper_encode_to_buffer
(
&
asn_DEF_NR_CellGroupConfig
,
NULL
,
UE
->
CellGroup
,
buf
,
sizeof
(
buf
));
AssertFatal
(
enc_rval
.
encoded
>
0
,
"ASN1 encoding of CellGroupConfig failed, failed type %s
\n
"
,
enc_rval
.
failed_type
->
name
);
du_to_cu_rrc_information_t
du2cu
=
{
.
cellGroupConfig
=
buf
,
.
cellGroupConfig_length
=
(
enc_rval
.
encoded
+
7
)
>>
3
,
};
f1_ue_data_t
ue_data
=
du_get_f1_ue_data
(
UE
->
rnti
);
f1ap_ue_context_modif_required_t
required
=
{
.
gNB_CU_ue_id
=
ue_data
.
secondary_ue
,
.
gNB_DU_ue_id
=
UE
->
rnti
,
.
du_to_cu_rrc_information
=
&
du2cu
,
.
cause
=
F1AP_CAUSE_RADIO_NETWORK
,
.
cause_value
=
F1AP_CauseRadioNetwork_action_desirable_for_radio_reasons
,
};
nrmac
->
mac_rrc
.
ue_context_modification_required
(
&
required
);
}
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c
View file @
f0923f68
...
...
@@ -952,7 +952,8 @@ static NR_UE_harq_t *find_harq(frame_t frame, sub_frame_t slot, NR_UE_info_t * U
while
(
harq
->
feedback_frame
!=
frame
||
(
harq
->
feedback_frame
==
frame
&&
harq
->
feedback_slot
<
slot
))
{
LOG_W
(
NR_MAC
,
"expected HARQ pid %d feedback at %4d.%2d, but is at %4d.%2d instead (HARQ feedback is in the past)
\n
"
,
"UE %04x expected HARQ pid %d feedback at %4d.%2d, but is at %4d.%2d instead (HARQ feedback is in the past)
\n
"
,
UE
->
rnti
,
pid
,
harq
->
feedback_frame
,
harq
->
feedback_slot
,
...
...
@@ -968,7 +969,8 @@ static NR_UE_harq_t *find_harq(frame_t frame, sub_frame_t slot, NR_UE_info_t * U
/* feedbacks that we wait for in the future: don't do anything */
if
(
harq
->
feedback_slot
>
slot
)
{
LOG_W
(
NR_MAC
,
"expected HARQ pid %d feedback at %4d.%2d, but is at %4d.%2d instead (HARQ feedback is in the future)
\n
"
,
"UE %04x expected HARQ pid %d feedback at %4d.%2d, but is at %4d.%2d instead (HARQ feedback is in the future)
\n
"
,
UE
->
rnti
,
pid
,
harq
->
feedback_frame
,
harq
->
feedback_slot
,
...
...
@@ -1001,7 +1003,7 @@ void handle_nr_uci_pucch_0_1(module_id_t mod_id,
const
uint8_t
harq_confidence
=
uci_01
->
harq
->
harq_confidence_level
;
NR_UE_harq_t
*
harq
=
find_harq
(
frame
,
slot
,
UE
,
nrmac
->
dl_bler
.
harq_round_max
);
if
(
!
harq
)
{
LOG_E
(
NR_MAC
,
"
Oh no! Could not find a harq in %s!
\n
"
,
__FUNCTION__
);
LOG_E
(
NR_MAC
,
"
UE %04x: Could not find a HARQ process at %4d.%2d!
\n
"
,
UE
->
rnti
,
frame
,
slot
);
break
;
}
DevAssert
(
harq
->
is_waiting
);
...
...
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
View file @
f0923f68
...
...
@@ -223,9 +223,14 @@ static int nr_process_mac_pdu(instance_t module_idP,
for
(
int
i
=
0
;
i
<
NR_NB_RA_PROC_MAX
;
i
++
)
{
NR_RA_t
*
ra
=
&
RC
.
nrmac
[
module_idP
]
->
common_channels
[
CC_id
].
ra
[
i
];
if
(
ra
->
state
>=
WAIT_Msg3
&&
ra
->
rnti
==
UE
->
rnti
)
{
ra
->
crnti
=
((
pduP
[
1
]
&
0xFF
)
<<
8
)
|
(
pduP
[
2
]
&
0xFF
);
// remove UE context just created after Msg.3 in some milliseconds
// as the UE is one already known (not now, as the UE context is
// still needed for the moment)
nr_mac_trigger_release_timer
(
&
UE
->
UE_sched_ctrl
,
UE
->
current_UL_BWP
.
scs
);
//mac_remove_nr_ue(RC.nrmac[module_idP], ra->rnti);
// this UE is the one identified by the RNTI in pduP
ra
->
rnti
=
((
pduP
[
1
]
&
0xFF
)
<<
8
)
|
(
pduP
[
2
]
&
0xFF
);
ra
->
state
=
Msg3_dcch_dtch
;
LOG_I
(
NR_MAC
,
"Received UL_SCH_LCID_C_RNTI with C-RNTI 0x%04x
\n
"
,
ra
->
crnti
);
break
;
}
}
...
...
@@ -780,12 +785,13 @@ static void _nr_rx_sdu(const module_id_t gnb_mod_idP,
if
(
ra
->
state
==
Msg3_dcch_dtch
)
{
// Check if the UE identified by C-RNTI still exists at the gNB
NR_UE_info_t
*
UE_C
=
find_nr_UE
(
&
gNB_mac
->
UE_info
,
ra
->
c
rnti
);
NR_UE_info_t
*
UE_C
=
find_nr_UE
(
&
gNB_mac
->
UE_info
,
ra
->
rnti
);
if
(
!
UE_C
)
{
// The UE identified by C-RNTI no longer exists at the gNB
// Let's abort the current RA, so the UE will trigger a new RA later but using RRCSetupRequest instead. A better solution may be implemented
mac_remove_nr_ue
(
gNB_mac
,
ra
->
rnti
);
nr_clear_ra_proc
(
gnb_mod_idP
,
CC_idP
,
frameP
,
ra
);
LOG_W
(
NR_MAC
,
"No UE found with C-RNTI %04x, ignoring Msg.3 to have UE come back with new RA attempt
\n
"
,
ra
->
rnti
);
return
;
}
else
{
// The UE identified by C-RNTI still exists at the gNB
...
...
@@ -794,9 +800,11 @@ static void _nr_rx_sdu(const module_id_t gnb_mod_idP,
// Reset HARQ processes
reset_dl_harq_list
(
&
UE_C
->
UE_sched_ctrl
);
reset_ul_harq_list
(
&
UE_C
->
UE_sched_ctrl
);
// Trigger RRC Reconfiguration
LOG_I
(
NR_MAC
,
"Received UL_SCH_LCID_C_RNTI with C-RNTI 0x%04x, triggering RRC Reconfiguration
\n
"
,
UE_C
->
rnti
);
nr_mac_trigger_reconfiguration
(
RC
.
nrmac
[
gnb_mod_idP
],
UE_C
);
}
LOG_I
(
NR_MAC
,
"Activating scheduling response to MSG3 with DCCH/DTCCH and RNTI 0x%04x (state %d)
\n
"
,
ra
->
crnti
,
ra
->
state
);
}
else
{
LOG_I
(
NR_MAC
,
"Activating scheduling RA-Msg4 for TC_RNTI 0x%04x (state %d)
\n
"
,
...
...
openair2/LAYER2/NR_MAC_gNB/mac_proto.h
View file @
f0923f68
...
...
@@ -449,4 +449,6 @@ void nr_mac_trigger_ul_failure(NR_UE_sched_ctrl_t *sched_ctrl, NR_SubcarrierSpac
void
nr_mac_reset_ul_failure
(
NR_UE_sched_ctrl_t
*
sched_ctrl
);
void
nr_mac_check_ul_failure
(
const
gNB_MAC_INST
*
nrmac
,
int
rnti
,
NR_UE_sched_ctrl_t
*
sched_ctrl
);
void
nr_mac_trigger_reconfiguration
(
const
gNB_MAC_INST
*
nrmac
,
const
NR_UE_info_t
*
UE
);
#endif
/*__LAYER2_NR_MAC_PROTO_H__*/
openair2/LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.c
View file @
f0923f68
...
...
@@ -25,6 +25,7 @@
#include "openair2/F1AP/f1ap_ids.h"
#include "openair2/LAYER2/nr_rlc/nr_rlc_oai_api.h"
#include "openair2/RRC/NR/MESSAGES/asn1_msg.h"
#include "F1AP_CauseRadioNetwork.h"
#include "uper_decoder.h"
#include "uper_encoder.h"
...
...
@@ -243,6 +244,63 @@ void ue_context_modification_request(const f1ap_ue_context_modif_req_t *req)
}
}
void
ue_context_modification_confirm
(
const
f1ap_ue_context_modif_confirm_t
*
confirm
)
{
LOG_I
(
MAC
,
"Received UE Context Modification Confirm for UE %04x
\n
"
,
confirm
->
gNB_DU_ue_id
);
gNB_MAC_INST
*
mac
=
RC
.
nrmac
[
0
];
NR_SCHED_LOCK
(
&
mac
->
sched_lock
);
/* check first that the scheduler knows such UE */
NR_UE_info_t
*
UE
=
find_nr_UE
(
&
mac
->
UE_info
,
confirm
->
gNB_DU_ue_id
);
if
(
UE
==
NULL
)
{
LOG_E
(
MAC
,
"ERROR: unknown UE with RNTI %04x, ignoring UE Context Modification Confirm
\n
"
,
confirm
->
gNB_DU_ue_id
);
NR_SCHED_UNLOCK
(
&
mac
->
sched_lock
);
return
;
}
NR_SCHED_UNLOCK
(
&
mac
->
sched_lock
);
if
(
confirm
->
rrc_container_length
>
0
)
nr_rlc_srb_recv_sdu
(
confirm
->
gNB_DU_ue_id
,
DCCH
,
confirm
->
rrc_container
,
confirm
->
rrc_container_length
);
/* nothing else to be done? */
}
void
ue_context_modification_refuse
(
const
f1ap_ue_context_modif_refuse_t
*
refuse
)
{
/* Currently, we only use the UE Context Modification Required procedure to
* trigger a RRC reconfigurtion after Msg.3 with C-RNTI MAC CE. If the CU
* refuses, it cannot do this reconfiguration, leaving the UE in an
* unconfigured state. Therefore, we just free all RA-related info, and
* request the release of the UE. */
LOG_W
(
MAC
,
"Received UE Context Modification Refuse for %04x, requesting release
\n
"
,
refuse
->
gNB_DU_ue_id
);
gNB_MAC_INST
*
mac
=
RC
.
nrmac
[
0
];
NR_SCHED_LOCK
(
&
mac
->
sched_lock
);
NR_UE_info_t
*
UE
=
find_nr_UE
(
&
RC
.
nrmac
[
0
]
->
UE_info
,
refuse
->
gNB_DU_ue_id
);
if
(
UE
==
NULL
)
{
LOG_E
(
MAC
,
"ERROR: unknown UE with RNTI %04x, ignoring UE Context Modification Refuse
\n
"
,
refuse
->
gNB_DU_ue_id
);
NR_SCHED_UNLOCK
(
&
mac
->
sched_lock
);
return
;
}
const
int
CC_id
=
0
;
NR_COMMON_channels_t
*
cc
=
&
mac
->
common_channels
[
CC_id
];
for
(
int
i
=
0
;
i
<
NR_NB_RA_PROC_MAX
;
i
++
)
{
NR_RA_t
*
ra
=
&
cc
->
ra
[
i
];
if
(
ra
->
rnti
==
UE
->
rnti
)
nr_clear_ra_proc
(
0
,
CC_id
,
0
/* frame */
,
ra
);
}
NR_SCHED_UNLOCK
(
&
mac
->
sched_lock
);
f1ap_ue_context_release_req_t
request
=
{
.
gNB_CU_ue_id
=
refuse
->
gNB_CU_ue_id
,
.
gNB_DU_ue_id
=
refuse
->
gNB_DU_ue_id
,
.
cause
=
F1AP_CAUSE_RADIO_NETWORK
,
.
cause_value
=
F1AP_CauseRadioNetwork_procedure_cancelled
,
};
mac
->
mac_rrc
.
ue_context_release_request
(
&
request
);
}
void
ue_context_release_command
(
const
f1ap_ue_context_release_cmd_t
*
cmd
)
{
/* mark UE as to be deleted after PUSCH failure */
...
...
openair2/LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.h
View file @
f0923f68
...
...
@@ -27,6 +27,8 @@
void
ue_context_setup_request
(
const
f1ap_ue_context_setup_t
*
req
);
void
ue_context_modification_request
(
const
f1ap_ue_context_modif_req_t
*
req
);
void
ue_context_modification_confirm
(
const
f1ap_ue_context_modif_confirm_t
*
confirm
);
void
ue_context_modification_refuse
(
const
f1ap_ue_context_modif_refuse_t
*
refuse
);
void
ue_context_release_command
(
const
f1ap_ue_context_release_cmd_t
*
cmd
);
void
dl_rrc_message_transfer
(
const
f1ap_dl_rrc_message_t
*
dl_rrc
);
...
...
openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul.h
View file @
f0923f68
...
...
@@ -28,6 +28,7 @@
typedef
void
(
*
ue_context_setup_response_func_t
)(
const
f1ap_ue_context_setup_t
*
req
,
const
f1ap_ue_context_setup_t
*
resp
);
typedef
void
(
*
ue_context_modification_response_func_t
)(
const
f1ap_ue_context_modif_req_t
*
req
,
const
f1ap_ue_context_modif_resp_t
*
resp
);
typedef
void
(
*
ue_context_modification_required_func_t
)(
const
f1ap_ue_context_modif_required_t
*
t
);
typedef
void
(
*
ue_context_release_request_func_t
)(
const
f1ap_ue_context_release_req_t
*
req
);
typedef
void
(
*
ue_context_release_complete_func_t
)(
const
f1ap_ue_context_release_complete_t
*
complete
);
...
...
openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul_direct.c
View file @
f0923f68
...
...
@@ -111,6 +111,31 @@ static void ue_context_modification_response_direct(const f1ap_ue_context_modif_
itti_send_msg_to_task
(
TASK_RRC_GNB
,
0
,
msg
);
}
static
void
ue_context_modification_required_direct
(
const
f1ap_ue_context_modif_required_t
*
required
)
{
MessageDef
*
msg
=
itti_alloc_new_message
(
TASK_MAC_GNB
,
0
,
F1AP_UE_CONTEXT_MODIFICATION_REQUIRED
);
f1ap_ue_context_modif_required_t
*
f1ap_msg
=
&
F1AP_UE_CONTEXT_MODIFICATION_REQUIRED
(
msg
);
f1ap_msg
->
gNB_CU_ue_id
=
required
->
gNB_CU_ue_id
;
f1ap_msg
->
gNB_DU_ue_id
=
required
->
gNB_DU_ue_id
;
f1ap_msg
->
du_to_cu_rrc_information
=
NULL
;
if
(
required
->
du_to_cu_rrc_information
!=
NULL
)
{
f1ap_msg
->
du_to_cu_rrc_information
=
calloc
(
1
,
sizeof
(
*
f1ap_msg
->
du_to_cu_rrc_information
));
AssertFatal
(
f1ap_msg
->
du_to_cu_rrc_information
!=
NULL
,
"out of memory
\n
"
);
du_to_cu_rrc_information_t
*
du2cu
=
f1ap_msg
->
du_to_cu_rrc_information
;
AssertFatal
(
required
->
du_to_cu_rrc_information
->
cellGroupConfig
!=
NULL
&&
required
->
du_to_cu_rrc_information
->
cellGroupConfig_length
>
0
,
"cellGroupConfig is mandatory
\n
"
);
du2cu
->
cellGroupConfig_length
=
required
->
du_to_cu_rrc_information
->
cellGroupConfig_length
;
du2cu
->
cellGroupConfig
=
malloc
(
du2cu
->
cellGroupConfig_length
*
sizeof
(
*
du2cu
->
cellGroupConfig
));
AssertFatal
(
du2cu
->
cellGroupConfig
!=
NULL
,
"out of memory
\n
"
);
memcpy
(
du2cu
->
cellGroupConfig
,
required
->
du_to_cu_rrc_information
->
cellGroupConfig
,
du2cu
->
cellGroupConfig_length
);
AssertFatal
(
required
->
du_to_cu_rrc_information
->
measGapConfig
==
NULL
&&
required
->
du_to_cu_rrc_information
->
measGapConfig_length
==
0
,
"not handled yet
\n
"
);
AssertFatal
(
required
->
du_to_cu_rrc_information
->
requestedP_MaxFR1
==
NULL
&&
required
->
du_to_cu_rrc_information
->
requestedP_MaxFR1_length
==
0
,
"not handled yet
\n
"
);
}
f1ap_msg
->
cause
=
required
->
cause
;
f1ap_msg
->
cause_value
=
required
->
cause_value
;
itti_send_msg_to_task
(
TASK_RRC_GNB
,
0
,
msg
);
}
static
void
ue_context_release_request_direct
(
const
f1ap_ue_context_release_req_t
*
req
)
{
MessageDef
*
msg
=
itti_alloc_new_message
(
TASK_MAC_GNB
,
0
,
F1AP_UE_CONTEXT_RELEASE_REQ
);
...
...
@@ -151,6 +176,7 @@ void mac_rrc_ul_direct_init(struct nr_mac_rrc_ul_if_s *mac_rrc)
{
mac_rrc
->
ue_context_setup_response
=
ue_context_setup_response_direct
;
mac_rrc
->
ue_context_modification_response
=
ue_context_modification_response_direct
;
mac_rrc
->
ue_context_modification_required
=
ue_context_modification_required_direct
;
mac_rrc
->
ue_context_release_request
=
ue_context_release_request_direct
;
mac_rrc
->
ue_context_release_complete
=
ue_context_release_complete_direct
;
mac_rrc
->
initial_ul_rrc_message_transfer
=
initial_ul_rrc_message_transfer_direct
;
...
...
openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul_f1ap.c
View file @
f0923f68
...
...
@@ -96,6 +96,31 @@ static void ue_context_modification_response_f1ap(const f1ap_ue_context_modif_re
itti_send_msg_to_task
(
TASK_DU_F1
,
0
,
msg
);
}
static
void
ue_context_modification_required_f1ap
(
const
f1ap_ue_context_modif_required_t
*
required
)
{
MessageDef
*
msg
=
itti_alloc_new_message
(
TASK_MAC_GNB
,
0
,
F1AP_UE_CONTEXT_MODIFICATION_REQUIRED
);
f1ap_ue_context_modif_required_t
*
f1ap_msg
=
&
F1AP_UE_CONTEXT_MODIFICATION_REQUIRED
(
msg
);
f1ap_msg
->
gNB_CU_ue_id
=
required
->
gNB_CU_ue_id
;
f1ap_msg
->
gNB_DU_ue_id
=
required
->
gNB_DU_ue_id
;
f1ap_msg
->
du_to_cu_rrc_information
=
NULL
;
if
(
required
->
du_to_cu_rrc_information
!=
NULL
)
{
f1ap_msg
->
du_to_cu_rrc_information
=
calloc
(
1
,
sizeof
(
*
f1ap_msg
->
du_to_cu_rrc_information
));
AssertFatal
(
f1ap_msg
->
du_to_cu_rrc_information
!=
NULL
,
"out of memory
\n
"
);
du_to_cu_rrc_information_t
*
du2cu
=
f1ap_msg
->
du_to_cu_rrc_information
;
AssertFatal
(
required
->
du_to_cu_rrc_information
->
cellGroupConfig
!=
NULL
&&
required
->
du_to_cu_rrc_information
->
cellGroupConfig_length
>
0
,
"cellGroupConfig is mandatory
\n
"
);
du2cu
->
cellGroupConfig_length
=
required
->
du_to_cu_rrc_information
->
cellGroupConfig_length
;
du2cu
->
cellGroupConfig
=
malloc
(
du2cu
->
cellGroupConfig_length
*
sizeof
(
*
du2cu
->
cellGroupConfig
));
AssertFatal
(
du2cu
->
cellGroupConfig
!=
NULL
,
"out of memory
\n
"
);
memcpy
(
du2cu
->
cellGroupConfig
,
required
->
du_to_cu_rrc_information
->
cellGroupConfig
,
du2cu
->
cellGroupConfig_length
);
AssertFatal
(
required
->
du_to_cu_rrc_information
->
measGapConfig
==
NULL
&&
required
->
du_to_cu_rrc_information
->
measGapConfig_length
==
0
,
"not handled yet
\n
"
);
AssertFatal
(
required
->
du_to_cu_rrc_information
->
requestedP_MaxFR1
==
NULL
&&
required
->
du_to_cu_rrc_information
->
requestedP_MaxFR1_length
==
0
,
"not handled yet
\n
"
);
}
f1ap_msg
->
cause
=
required
->
cause
;
f1ap_msg
->
cause_value
=
required
->
cause_value
;
itti_send_msg_to_task
(
TASK_DU_F1
,
0
,
msg
);
}
static
void
ue_context_release_request_f1ap
(
const
f1ap_ue_context_release_req_t
*
req
)
{
MessageDef
*
msg
=
itti_alloc_new_message
(
TASK_MAC_GNB
,
0
,
F1AP_UE_CONTEXT_RELEASE_REQ
);
...
...
@@ -138,6 +163,7 @@ void mac_rrc_ul_f1ap_init(struct nr_mac_rrc_ul_if_s *mac_rrc)
{
mac_rrc
->
ue_context_setup_response
=
ue_context_setup_response_f1ap
;
mac_rrc
->
ue_context_modification_response
=
ue_context_modification_response_f1ap
;
mac_rrc
->
ue_context_modification_required
=
ue_context_modification_required_f1ap
;
mac_rrc
->
ue_context_release_request
=
ue_context_release_request_f1ap
;
mac_rrc
->
ue_context_release_complete
=
ue_context_release_complete_f1ap
;
mac_rrc
->
initial_ul_rrc_message_transfer
=
initial_ul_rrc_message_transfer_f1ap
;
...
...
openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
View file @
f0923f68
...
...
@@ -204,8 +204,6 @@ typedef struct {
NR_CellGroupConfig_t
*
CellGroup
;
/// Preambles for contention-free access
NR_preamble_ue_t
preambles
;
/// NSA: the UEs C-RNTI to use
rnti_t
crnti
;
/// CFRA flag
bool
cfra
;
// BWP for RA
...
...
@@ -660,6 +658,7 @@ typedef struct NR_bler_options {
typedef
struct
nr_mac_rrc_ul_if_s
{
ue_context_setup_response_func_t
ue_context_setup_response
;
ue_context_modification_response_func_t
ue_context_modification_response
;
ue_context_modification_required_func_t
ue_context_modification_required
;
ue_context_release_request_func_t
ue_context_release_request
;
ue_context_release_complete_func_t
ue_context_release_complete
;
initial_ul_rrc_message_transfer_func_t
initial_ul_rrc_message_transfer
;
...
...
openair2/RRC/NR/mac_rrc_dl.h
View file @
f0923f68
...
...
@@ -27,6 +27,8 @@
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
(
*
dl_rrc_message_transfer_func_t
)(
const
f1ap_dl_rrc_message_t
*
dl_rrc
);
...
...
openair2/RRC/NR/mac_rrc_dl_direct.c
View file @
f0923f68
...
...
@@ -28,6 +28,8 @@ void mac_rrc_dl_direct_init(nr_mac_rrc_dl_if_t *mac_rrc)
{
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
;
}
openair2/RRC/NR/mac_rrc_dl_f1ap.c
View file @
f0923f68
...
...
@@ -71,6 +71,31 @@ 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
)
{
MessageDef
*
msg
=
itti_alloc_new_message
(
TASK_MAC_GNB
,
0
,
F1AP_UE_CONTEXT_MODIFICATION_CONFIRM
);
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
;
f1ap_msg
->
rrc_container
=
NULL
;
f1ap_msg
->
rrc_container_length
=
0
;
if
(
confirm
->
rrc_container
!=
NULL
)
{
f1ap_msg
->
rrc_container
=
calloc
(
1
,
sizeof
(
*
f1ap_msg
->
rrc_container
));
AssertFatal
(
f1ap_msg
->
rrc_container
!=
NULL
,
"out of memory
\n
"
);
memcpy
(
f1ap_msg
->
rrc_container
,
confirm
->
rrc_container
,
confirm
->
rrc_container_length
);
f1ap_msg
->
rrc_container_length
=
confirm
->
rrc_container_length
;
}
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
)
{
MessageDef
*
msg
=
itti_alloc_new_message
(
TASK_MAC_GNB
,
0
,
F1AP_UE_CONTEXT_MODIFICATION_REFUSE
);
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
)
{
MessageDef
*
message_p
=
itti_alloc_new_message
(
TASK_RRC_GNB
,
0
,
F1AP_UE_CONTEXT_RELEASE_CMD
);
...
...
@@ -110,6 +135,8 @@ void mac_rrc_dl_f1ap_init(nr_mac_rrc_dl_if_t *mac_rrc)
{
mac_rrc
->
ue_context_setup_request
=
ue_context_setup_request_f1ap
;
mac_rrc
->
ue_context_modification_request
=
ue_context_modification_request_f1ap
;
mac_rrc
->
ue_context_modification_confirm
=
ue_context_modification_confirm_f1ap
;
mac_rrc
->
ue_context_modification_refuse
=
ue_context_modification_refuse_f1ap
;
mac_rrc
->
ue_context_release_command
=
ue_context_release_command_f1ap
;
mac_rrc
->
dl_rrc_message_transfer
=
dl_rrc_message_transfer_f1ap
;
}
openair2/RRC/NR/nr_rrc_defs.h
View file @
f0923f68
...
...
@@ -365,6 +365,8 @@ typedef struct {
typedef
struct
nr_mac_rrc_dl_if_s
{
ue_context_setup_request_func_t
ue_context_setup_request
;
ue_context_modification_request_func_t
ue_context_modification_request
;
ue_context_modification_confirm_func_t
ue_context_modification_confirm
;
ue_context_modification_refuse_func_t
ue_context_modification_refuse
;
ue_context_release_command_func_t
ue_context_release_command
;
dl_rrc_message_transfer_func_t
dl_rrc_message_transfer
;
}
nr_mac_rrc_dl_if_t
;
...
...
openair2/RRC/NR/rrc_gNB.c
View file @
f0923f68
...
...
@@ -43,7 +43,6 @@
#include "rrc_gNB_radio_bearers.h"
#include "RRC/L2_INTERFACE/openair_rrc_L2_interface.h"
#include "LAYER2/RLC/rlc.h"
#include "LAYER2/NR_MAC_gNB/mac_proto.h"
#include "common/utils/LOG/log.h"
#include "COMMON/mac_rrc_primitives.h"
...
...
@@ -68,7 +67,6 @@
#include "uper_encoder.h"
#include "uper_decoder.h"
#include "rlc.h"
#include "platform_types.h"
#include "common/utils/LOG/vcd_signal_dumper.h"
...
...
@@ -188,26 +186,6 @@ static void freeDRBlist(NR_DRB_ToAddModList_t *list)
return
;
}
static
void
nr_rrc_addmod_drbs
(
int
rnti
,
const
NR_DRB_ToAddModList_t
*
drb_list
,
const
struct
NR_CellGroupConfig__rlc_BearerToAddModList
*
bearer_list
)
{
if
(
drb_list
==
NULL
||
bearer_list
==
NULL
)
return
;
for
(
int
i
=
0
;
i
<
drb_list
->
list
.
count
;
i
++
)
{
const
NR_DRB_ToAddMod_t
*
drb
=
drb_list
->
list
.
array
[
i
];
for
(
int
j
=
0
;
j
<
bearer_list
->
list
.
count
;
j
++
)
{
const
NR_RLC_BearerConfig_t
*
bearer
=
bearer_list
->
list
.
array
[
j
];
if
(
bearer
->
servedRadioBearer
!=
NULL
&&
bearer
->
servedRadioBearer
->
present
==
NR_RLC_BearerConfig__servedRadioBearer_PR_drb_Identity
&&
drb
->
drb_Identity
==
bearer
->
servedRadioBearer
->
choice
.
drb_Identity
)
{
nr_rlc_add_drb
(
rnti
,
drb
->
drb_Identity
,
bearer
);
}
}
}
}
typedef
struct
deliver_dl_rrc_message_data_s
{
const
gNB_RRC_INST
*
rrc
;
f1ap_dl_rrc_message_t
*
dl_rrc
;
...
...
@@ -994,14 +972,6 @@ static void rrc_gNB_process_RRCReconfigurationComplete(const protocol_ctxt_t *co
kUPint
,
get_softmodem_params
()
->
sa
?
ue_p
->
masterCellGroup
->
rlc_BearerToAddModList
:
NULL
);
/* Refresh DRBs */
if
(
!
NODE_IS_CU
(
RC
.
nrrrc
[
ctxt_pP
->
module_id
]
->
node_type
))
{
LOG_D
(
NR_RRC
,
"Configuring RLC DRBs/SRBs for UE %04x
\n
"
,
ue_context_pP
->
ue_context
.
rnti
);
const
struct
NR_CellGroupConfig__rlc_BearerToAddModList
*
bearer_list
=
ue_context_pP
->
ue_context
.
masterCellGroup
->
rlc_BearerToAddModList
;
nr_rrc_addmod_drbs
(
ctxt_pP
->
rntiMaybeUEid
,
DRB_configList
,
bearer_list
);
}
/* Loop through DRBs and establish if necessary */
if
(
DRB_configList
!=
NULL
)
{
for
(
int
i
=
0
;
i
<
DRB_configList
->
list
.
count
;
i
++
)
{
...
...
@@ -1219,6 +1189,7 @@ int nr_rrc_reconfiguration_req(rrc_gNB_ue_context_t *const ue_context_pP
uint8_t
xid
=
rrc_gNB_get_next_transaction_identifier
(
ctxt_pP
->
module_id
);
gNB_RRC_UE_t
*
ue_p
=
&
ue_context_pP
->
ue_context
;
ue_p
->
xids
[
xid
]
=
RRC_DEDICATED_RECONF
;
NR_CellGroupConfig_t
*
masterCellGroup
=
ue_p
->
masterCellGroup
;
if
(
dl_bwp_id
>
0
)
{
...
...
@@ -1247,18 +1218,22 @@ int nr_rrc_reconfiguration_req(rrc_gNB_ue_context_t *const ue_context_pP
NULL
,
masterCellGroup
);
nr_rrc_mac_update_cellgroup
(
ue_context_pP
->
ue_context
.
rnti
,
masterCellGroup
);
gNB_RRC_INST
*
rrc
=
RC
.
nrrrc
[
ctxt_pP
->
module_id
];
nr_rrc_transfer_protected_rrc_message
(
rrc
,
ue_p
,
DCCH
,
buffer
,
size
);
if
(
NODE_IS_DU
(
rrc
->
node_type
)
||
NODE_IS_MONOLITHIC
(
rrc
->
node_type
))
{
uint32_t
delay_ms
=
ue_p
->
masterCellGroup
&&
ue_p
->
masterCellGroup
->
spCellConfig
&&
ue_p
->
masterCellGroup
->
spCellConfig
->
spCellConfigDedicated
nr_rrc_mac_update_cellgroup
(
ue_context_pP
->
ue_context
.
rnti
,
masterCellGroup
);
uint32_t
delay_ms
=
ue_p
->
masterCellGroup
&&
ue_p
->
masterCellGroup
->
spCellConfig
&&
ue_p
->
masterCellGroup
->
spCellConfig
->
spCellConfigDedicated
&&
ue_p
->
masterCellGroup
->
spCellConfig
->
spCellConfigDedicated
->
downlinkBWP_ToAddModList
?
NR_RRC_RECONFIGURATION_DELAY_MS
+
NR_RRC_BWP_SWITCHING_DELAY_MS
:
NR_RRC_RECONFIGURATION_DELAY_MS
;
nr_mac_enable_ue_rrc_processing_timer
(
ctxt_pP
->
module_id
,
ue_p
->
rnti
,
*
rrc
->
carrier
.
servingcellconfigcommon
->
ssbSubcarrierSpacing
,
delay_ms
);
nr_mac_enable_ue_rrc_processing_timer
(
ctxt_pP
->
module_id
,
ue_p
->
rnti
,
*
rrc
->
carrier
.
servingcellconfigcommon
->
ssbSubcarrierSpacing
,
delay_ms
);
}
return
0
;
...
...
@@ -1711,6 +1686,7 @@ static void handle_rrcReconfigurationComplete(const protocol_ctxt_t *const ctxt_
rrc_gNB_send_NGAP_INITIAL_CONTEXT_SETUP_RESP
(
ctxt_pP
,
ue_context_p
);
break
;
case
RRC_REESTABLISH_COMPLETE
:
case
RRC_DEDICATED_RECONF
:
/* do nothing */
break
;
default:
...
...
@@ -2131,6 +2107,69 @@ static void rrc_CU_process_ue_context_modification_response(MessageDef *msg_p, i
}
}
static
void
rrc_CU_process_ue_modification_required
(
MessageDef
*
msg_p
)
{
f1ap_ue_context_modif_required_t
*
required
=
&
F1AP_UE_CONTEXT_MODIFICATION_REQUIRED
(
msg_p
);
protocol_ctxt_t
ctxt
=
{.
rntiMaybeUEid
=
required
->
gNB_CU_ue_id
,
.
module_id
=
0
,
.
instance
=
0
,
.
enb_flag
=
1
,
.
eNB_index
=
0
};
gNB_RRC_INST
*
rrc
=
RC
.
nrrrc
[
ctxt
.
module_id
];
rrc_gNB_ue_context_t
*
ue_context_p
=
rrc_gNB_get_ue_context
(
rrc
,
required
->
gNB_CU_ue_id
);
if
(
ue_context_p
==
NULL
)
{
LOG_E
(
RRC
,
"Could not find UE context for CU UE ID %d, cannot handle UE context modification request
\n
"
,
required
->
gNB_CU_ue_id
);
f1ap_ue_context_modif_refuse_t
refuse
=
{
.
gNB_CU_ue_id
=
required
->
gNB_CU_ue_id
,
.
gNB_DU_ue_id
=
required
->
gNB_DU_ue_id
,
.
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
);
return
;
}
if
(
required
->
du_to_cu_rrc_information
&&
required
->
du_to_cu_rrc_information
->
cellGroupConfig
)
{
gNB_RRC_UE_t
*
UE
=
&
ue_context_p
->
ue_context
;
LOG_I
(
RRC
,
"UE Context Modification Required: new CellGroupConfig for UE ID %d/RNTI %04x, triggering reconfiguration
\n
"
,
UE
->
rrc_ue_id
,
UE
->
rnti
);
NR_CellGroupConfig_t
*
cellGroupConfig
=
NULL
;
asn_dec_rval_t
dec_rval
=
uper_decode_complete
(
NULL
,
&
asn_DEF_NR_CellGroupConfig
,
(
void
**
)
&
cellGroupConfig
,
(
uint8_t
*
)
required
->
du_to_cu_rrc_information
->
cellGroupConfig
,
required
->
du_to_cu_rrc_information
->
cellGroupConfig_length
);
if
(
dec_rval
.
code
!=
RC_OK
&&
dec_rval
.
consumed
==
0
)
{
LOG_E
(
RRC
,
"Cell group config decode error, refusing reconfiguration
\n
"
);
f1ap_ue_context_modif_refuse_t
refuse
=
{
.
gNB_CU_ue_id
=
required
->
gNB_CU_ue_id
,
.
gNB_DU_ue_id
=
required
->
gNB_DU_ue_id
,
.
cause
=
F1AP_CAUSE_PROTOCOL
,
.
cause_value
=
F1AP_CauseProtocol_transfer_syntax_error
,
};
rrc
->
mac_rrc
.
ue_context_modification_refuse
(
&
refuse
);
return
;
}
if
(
UE
->
masterCellGroup
)
{
ASN_STRUCT_FREE
(
asn_DEF_NR_CellGroupConfig
,
UE
->
masterCellGroup
);
LOG_I
(
RRC
,
"UE %d/RNTI %04x replacing existing CellGroupConfig with new one received from DU
\n
"
,
UE
->
rrc_ue_id
,
UE
->
rnti
);
}
UE
->
masterCellGroup
=
cellGroupConfig
;
if
(
LOG_DEBUGFLAG
(
DEBUG_ASN1
))
xer_fprint
(
stdout
,
&
asn_DEF_NR_CellGroupConfig
,
UE
->
masterCellGroup
);
/* trigger reconfiguration */
nr_rrc_reconfiguration_req
(
ue_context_p
,
&
ctxt
,
0
,
0
);
//rrc_gNB_generate_dedicatedRRCReconfiguration(&ctxt, ue_context_p);
//rrc_gNB_generate_defaultRRCReconfiguration(&ctxt, ue_context_p);
return
;
}
LOG_W
(
RRC
,
"nothing to be done after UE Context Modification Required for UE ID %d/RNTI %04x
\n
"
,
required
->
gNB_CU_ue_id
,
required
->
gNB_DU_ue_id
);
}
unsigned
int
mask_flip
(
unsigned
int
x
)
{
return
((((
x
>>
8
)
+
(
x
<<
8
))
&
0xffff
)
>>
6
);
}
...
...
@@ -2598,6 +2637,10 @@ void *rrc_gnb_task(void *args_p) {
rrc_CU_process_ue_context_modification_response
(
msg_p
,
instance
);
break
;
case
F1AP_UE_CONTEXT_MODIFICATION_REQUIRED
:
rrc_CU_process_ue_modification_required
(
msg_p
);
break
;
case
F1AP_UE_CONTEXT_RELEASE_REQ
:
rrc_CU_process_ue_context_release_request
(
msg_p
);
break
;
...
...
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