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
Michael Black
OpenXG-RAN
Commits
2e94b8ed
Commit
2e94b8ed
authored
May 26, 2023
by
Robert Schmidt
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'origin/int-f1-ue-ctxt-modif' into integration_2023_w21
parents
5be3dcf3
307e08cb
Changes
22
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
22 changed files
with
422 additions
and
376 deletions
+422
-376
executables/nr-cuup.c
executables/nr-cuup.c
+1
-1
openair2/COMMON/f1ap_messages_def.h
openair2/COMMON/f1ap_messages_def.h
+2
-2
openair2/COMMON/f1ap_messages_types.h
openair2/COMMON/f1ap_messages_types.h
+1
-2
openair2/F1AP/f1ap_cu_task.c
openair2/F1AP/f1ap_cu_task.c
+1
-1
openair2/F1AP/f1ap_cu_ue_context_management.c
openair2/F1AP/f1ap_cu_ue_context_management.c
+4
-3
openair2/F1AP/f1ap_cu_ue_context_management.h
openair2/F1AP/f1ap_cu_ue_context_management.h
+1
-2
openair2/F1AP/f1ap_du_ue_context_management.c
openair2/F1AP/f1ap_du_ue_context_management.c
+37
-31
openair2/F1AP/f1ap_du_ue_context_management.h
openair2/F1AP/f1ap_du_ue_context_management.h
+1
-1
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
+0
-10
openair2/LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.c
openair2/LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.c
+119
-25
openair2/LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.h
openair2/LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.h
+1
-0
openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul.h
openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul.h
+2
-0
openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul_direct.c
openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul_direct.c
+58
-0
openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul_f1ap.c
openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul_f1ap.c
+37
-0
openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
+1
-0
openair2/RRC/NR/cucp_cuup_direct.c
openair2/RRC/NR/cucp_cuup_direct.c
+22
-4
openair2/RRC/NR/mac_rrc_dl.h
openair2/RRC/NR/mac_rrc_dl.h
+1
-0
openair2/RRC/NR/mac_rrc_dl_direct.c
openair2/RRC/NR/mac_rrc_dl_direct.c
+1
-0
openair2/RRC/NR/mac_rrc_dl_f1ap.c
openair2/RRC/NR/mac_rrc_dl_f1ap.c
+33
-0
openair2/RRC/NR/nr_rrc_defs.h
openair2/RRC/NR/nr_rrc_defs.h
+1
-0
openair2/RRC/NR/nr_rrc_proto.h
openair2/RRC/NR/nr_rrc_proto.h
+1
-5
openair2/RRC/NR/rrc_gNB.c
openair2/RRC/NR/rrc_gNB.c
+97
-289
No files found.
executables/nr-cuup.c
View file @
2e94b8ed
...
...
@@ -84,7 +84,7 @@ int nr_rlc_get_available_tx_space(const rnti_t rntiP, const logical_chan_id_t ch
return
0
;
}
void
rrc_gNB_generate_dedicatedRRCReconfiguration
(
const
protocol_ctxt_t
*
const
ctxt_pP
,
rrc_gNB_ue_context_t
*
ue_context_pP
,
NR_CellGroupConfig_t
*
cell_groupConfig_from_DU
)
void
rrc_gNB_generate_dedicatedRRCReconfiguration
(
const
protocol_ctxt_t
*
const
ctxt_pP
,
rrc_gNB_ue_context_t
*
ue_context_pP
)
{
abort
();
}
...
...
openair2/COMMON/f1ap_messages_def.h
View file @
2e94b8ed
...
...
@@ -46,8 +46,8 @@ MESSAGE_DEF(F1AP_DL_RRC_MESSAGE , MESSAGE_PRIORITY_MED, f1ap_dl_rrc
//MESSAGE_DEF(F1AP_INITIAL_CONTEXT_SETUP_REQ , MESSAGE_PRIORITY_MED, f1ap_initial_context_setup_req_t , f1ap_initial_context_setup_req )
MESSAGE_DEF
(
F1AP_UE_CONTEXT_SETUP_REQ
,
MESSAGE_PRIORITY_MED
,
f1ap_ue_context_setup_t
,
f1ap_ue_context_setup_req
)
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_setup
_t
,
f1ap_ue_context_modification_req
)
MESSAGE_DEF
(
F1AP_UE_CONTEXT_MODIFICATION_RESP
,
MESSAGE_PRIORITY_MED
,
f1ap_ue_context_
setu
p_t
,
f1ap_ue_context_modification_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_res
p_t
,
f1ap_ue_context_modification_resp
)
/* 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 @
2e94b8ed
...
...
@@ -341,7 +341,6 @@ typedef struct f1ap_drb_to_be_setup_s {
typedef
struct
f1ap_srb_to_be_setup_s
{
long
srb_id
;
rlc_mode_t
rlc_mode
;
uint8_t
lcid
;
}
f1ap_srb_to_be_setup_t
;
...
...
@@ -409,7 +408,7 @@ typedef struct f1ap_ue_context_setup_s {
ReconfigurationCompl_t
ReconfigComplOutcome
;
uint8_t
*
rrc_container
;
int
rrc_container_length
;
}
f1ap_ue_context_setup_t
;
}
f1ap_ue_context_setup_t
,
f1ap_ue_context_modif_req_t
,
f1ap_ue_context_modif_resp_t
;
typedef
enum
F1ap_Cause_e
{
F1AP_CAUSE_NOTHING
,
/* No components present */
...
...
openair2/F1AP/f1ap_cu_task.c
View file @
2e94b8ed
...
...
@@ -171,7 +171,7 @@ void *F1AP_CU_task(void *arg) {
case
F1AP_UE_CONTEXT_MODIFICATION_REQ
:
CU_send_UE_CONTEXT_MODIFICATION_REQUEST
(
ITTI_MSG_DESTINATION_INSTANCE
(
received_msg
),
&
F1AP_UE_CONTEXT_
SETUP
_REQ
(
received_msg
));
&
F1AP_UE_CONTEXT_
MODIFICATION
_REQ
(
received_msg
));
break
;
case
F1AP_UE_CONTEXT_RELEASE_CMD
:
// from rrc
...
...
openair2/F1AP/f1ap_cu_ue_context_management.c
View file @
2e94b8ed
...
...
@@ -981,7 +981,8 @@ int CU_handle_UE_CONTEXT_RELEASE_COMPLETE(instance_t instance,
return
0
;
}
int
CU_send_UE_CONTEXT_MODIFICATION_REQUEST
(
instance_t
instance
,
f1ap_ue_context_setup_t
*
f1ap_ue_context_modification_req
)
{
int
CU_send_UE_CONTEXT_MODIFICATION_REQUEST
(
instance_t
instance
,
f1ap_ue_context_modif_req_t
*
f1ap_ue_context_modification_req
)
{
F1AP_F1AP_PDU_t
pdu
=
{
0
};
F1AP_UEContextModificationRequest_t
*
out
;
uint8_t
*
buffer
=
NULL
;
...
...
@@ -1600,7 +1601,7 @@ int CU_handle_UE_CONTEXT_MODIFICATION_RESPONSE(instance_t instance,
F1AP_UEContextModificationResponseIEs_t
*
ie
;
DevAssert
(
pdu
);
msg_p
=
itti_alloc_new_message
(
TASK_DU_F1
,
0
,
F1AP_UE_CONTEXT_MODIFICATION_RESP
);
f1ap_ue_context_
setu
p_t
*
f1ap_ue_context_modification_resp
=
&
F1AP_UE_CONTEXT_MODIFICATION_RESP
(
msg_p
);
f1ap_ue_context_
modif_res
p_t
*
f1ap_ue_context_modification_resp
=
&
F1AP_UE_CONTEXT_MODIFICATION_RESP
(
msg_p
);
container
=
&
pdu
->
choice
.
successfulOutcome
->
value
.
choice
.
UEContextModificationResponse
;
int
i
;
...
...
@@ -1609,7 +1610,7 @@ int CU_handle_UE_CONTEXT_MODIFICATION_RESPONSE(instance_t instance,
F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID
,
true
);
f1ap_ue_context_modification_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_modification_resp
->
gNB_CU_ue_id
);
LOG_D
(
F1AP
,
"f1ap_ue_context_
modif
_resp->gNB_CU_ue_id is: %d
\n
"
,
f1ap_ue_context_modification_resp
->
gNB_CU_ue_id
);
/* GNB_DU_UE_F1AP_ID */
F1AP_FIND_PROTOCOLIE_BY_ID
(
F1AP_UEContextModificationResponseIEs_t
,
ie
,
container
,
...
...
openair2/F1AP/f1ap_cu_ue_context_management.h
View file @
2e94b8ed
...
...
@@ -72,8 +72,7 @@ int CU_handle_UE_CONTEXT_RELEASE_COMPLETE(instance_t instance,
/*
* UE Context Modification (gNB-CU initiated)
*/
int
CU_send_UE_CONTEXT_MODIFICATION_REQUEST
(
instance_t
instance
,
f1ap_ue_context_setup_t
*
f1ap_ue_context_modification_req
);
int
CU_send_UE_CONTEXT_MODIFICATION_REQUEST
(
instance_t
instance
,
f1ap_ue_context_modif_req_t
*
f1ap_ue_context_modification_req
);
int
CU_handle_UE_CONTEXT_MODIFICATION_RESPONSE
(
instance_t
instance
,
uint32_t
assoc_id
,
uint32_t
stream
,
...
...
openair2/F1AP/f1ap_du_ue_context_management.c
View file @
2e94b8ed
...
...
@@ -37,29 +37,24 @@
#include "f1ap_du_ue_context_management.h"
#include "openair2/LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.h"
#include "rrc_extern.h"
#include "openair2/RRC/NR/rrc_gNB_UE_context.h"
#include "openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h"
#include <openair3/ocp-gtpu/gtp_itf.h>
bool
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
)
{
bool
DURecvCb
(
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
)
{
// 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
);
// weird rb id management in 4G, not fully understand (looks bad design)
// overcomplex: if i understand, on the interface DRB start at 4 because there can be SRB 0..3
// but it would be much simpler to use absolute numbering
// instead of this "srb flag" associated to these +/-4
du_rlc_data_req
(
ctxt_pP
,
srb_flagP
,
false
,
rb_idP
-
4
,
muiP
,
confirmP
,
sdu_buffer_sizeP
,
sdu
);
du_rlc_data_req
(
ctxt_pP
,
srb_flagP
,
false
,
rb_idP
,
muiP
,
confirmP
,
sdu_buffer_sizeP
,
sdu
);
return
true
;
}
...
...
@@ -138,7 +133,7 @@ int DU_handle_UE_CONTEXT_SETUP_REQUEST(instance_t instance,
f1ap_ue_context_setup_req
->
cu_to_du_rrc_information
->
uE_CapabilityRAT_ContainerList
=
(
uint8_t
*
)
calloc
(
1
,
ieCuRrcInfo
->
value
.
choice
.
CUtoDURRCInformation
.
uE_CapabilityRAT_ContainerList
->
size
);
memcpy
(
f1ap_ue_context_setup_req
->
cu_to_du_rrc_information
->
uE_CapabilityRAT_ContainerList
,
ieCuRrcInfo
->
value
.
choice
.
CUtoDURRCInformation
.
uE_CapabilityRAT_ContainerList
->
buf
,
ieCuRrcInfo
->
value
.
choice
.
CUtoDURRCInformation
.
uE_CapabilityRAT_ContainerList
->
size
);
f1ap_ue_context_setup_req
->
cu_to_du_rrc_information
->
uE_CapabilityRAT_ContainerList_length
=
ieCuRrcInfo
->
value
.
choice
.
CUtoDURRCInformation
.
uE_CapabilityRAT_ContainerList
->
size
;
LOG_
I
(
F1AP
,
"Size f1ap_ue_context_setup_req->cu_to_du_rrc_information->uE_CapabilityRAT_ContainerList_length: %d
\n
"
,
f1ap_ue_context_setup_req
->
cu_to_du_rrc_information
->
uE_CapabilityRAT_ContainerList_length
);
LOG_
D
(
F1AP
,
"Size f1ap_ue_context_setup_req->cu_to_du_rrc_information->uE_CapabilityRAT_ContainerList_length: %d
\n
"
,
f1ap_ue_context_setup_req
->
cu_to_du_rrc_information
->
uE_CapabilityRAT_ContainerList_length
);
}
}
...
...
@@ -810,17 +805,12 @@ static instance_t du_create_gtpu_instance_to_cu(char *CUaddr, uint16_t CUport, c
return
gtpv1Init
(
tmp
);
}
int
DU_handle_UE_CONTEXT_MODIFICATION_REQUEST
(
instance_t
instance
,
uint32_t
assoc_id
,
uint32_t
stream
,
F1AP_F1AP_PDU_t
*
pdu
)
{
MessageDef
*
msg_p
;
// message to RRC
int
DU_handle_UE_CONTEXT_MODIFICATION_REQUEST
(
instance_t
instance
,
uint32_t
assoc_id
,
uint32_t
stream
,
F1AP_F1AP_PDU_t
*
pdu
)
{
F1AP_UEContextModificationRequest_t
*
container
;
int
i
;
DevAssert
(
pdu
);
msg_p
=
itti_alloc_new_message
(
TASK_DU_F1
,
0
,
F1AP_UE_CONTEXT_MODIFICATION_REQ
);
f1ap_ue_context_setup_t
*
f1ap_ue_context_modification_req
=
&
F1AP_UE_CONTEXT_MODIFICATION_REQ
(
msg_p
);
f1ap_ue_context_modif_req_t
ue_context_modification
=
{
0
};
f1ap_ue_context_modif_req_t
*
f1ap_ue_context_modification_req
=
&
ue_context_modification
;
container
=
&
pdu
->
choice
.
initiatingMessage
->
value
.
choice
.
UEContextModificationRequest
;
/* mandatory */
...
...
@@ -841,7 +831,7 @@ int DU_handle_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance,
if
(
f1ap_ue_context_modification_req
->
rnti
<
0
)
LOG_E
(
F1AP
,
"Could not retrieve UE rnti based on the DU UE id
\n
"
);
else
LOG_
I
(
F1AP
,
"Retrieved rnti is: %d
\n
"
,
f1ap_ue_context_modification_req
->
rnti
);
LOG_
D
(
F1AP
,
"Retrieved rnti is: %d
\n
"
,
f1ap_ue_context_modification_req
->
rnti
);
/* SRB */
F1AP_UEContextModificationRequestIEs_t
*
ieSrb
;
...
...
@@ -967,15 +957,16 @@ int DU_handle_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance,
LOG_E
(
F1AP
,
" RRCContainer in UEContextModificationRequestIEs size id 0
\n
"
);
}
}
else
{
LOG_
W
(
F1AP
,
"can't find RRCContainer in UEContextModificationRequestIEs by id %ld
\n
"
,
F1AP_ProtocolIE_ID_id_RRCContainer
);
LOG_
D
(
F1AP
,
"can't find RRCContainer in UEContextModificationRequestIEs by id %ld
\n
"
,
F1AP_ProtocolIE_ID_id_RRCContainer
);
}
itti_send_msg_to_task
(
TASK_RRC_GNB
,
instance
,
msg_p
);
ue_context_modification_request
(
f1ap_ue_context_modification_req
);
return
0
;
}
//void DU_send_UE_CONTEXT_MODIFICATION_RESPONSE(F1AP_UEContextModificationResponse_t *UEContextModificationResponse) {
int
DU_send_UE_CONTEXT_MODIFICATION_RESPONSE
(
instance_t
instance
,
f1ap_ue_context_setup_t
*
resp
)
{
int
DU_send_UE_CONTEXT_MODIFICATION_RESPONSE
(
instance_t
instance
,
f1ap_ue_context_modif_resp_t
*
resp
)
{
F1AP_F1AP_PDU_t
pdu
=
{
0
};
F1AP_UEContextModificationResponse_t
*
out
;
uint8_t
*
buffer
=
NULL
;
...
...
@@ -1062,6 +1053,21 @@ int DU_send_UE_CONTEXT_MODIFICATION_RESPONSE(instance_t instance, f1ap_ue_contex
drbs_setupmod_item
->
dRBID
=
resp
->
drbs_to_be_setup
[
i
].
drb_id
;
for
(
int
j
=
0
;
j
<
resp
->
drbs_to_be_setup
[
i
].
up_dl_tnl_length
;
j
++
)
{
f1ap_drb_to_be_setup_t
*
drb
=
&
resp
->
drbs_to_be_setup
[
i
];
transport_layer_addr_t
tl_addr
=
{
0
};
memcpy
(
tl_addr
.
buffer
,
&
drb
->
up_ul_tnl
[
0
].
tl_address
,
sizeof
(
drb
->
up_ul_tnl
[
0
].
tl_address
));
tl_addr
.
length
=
sizeof
(
drb
->
up_ul_tnl
[
0
].
tl_address
)
*
8
;
drb
->
up_dl_tnl
[
j
].
teid
=
newGtpuCreateTunnel
(
getCxt
(
false
,
instance
)
->
gtpInst
,
resp
->
rnti
,
drb
->
drb_id
,
drb
->
drb_id
,
drb
->
up_ul_tnl
[
j
].
teid
,
-
1
,
// no qfi
tl_addr
,
drb
->
up_ul_tnl
[
0
].
port
,
DURecvCb
,
NULL
);
/* ADD */
asn1cSequenceAdd
(
drbs_setupmod_item
->
dLUPTNLInformation_ToBeSetup_List
.
list
,
F1AP_DLUPTNLInformation_ToBeSetup_Item_t
,
dLUPTNLInformation_ToBeSetup_Item
);
...
...
openair2/F1AP/f1ap_du_ue_context_management.h
View file @
2e94b8ed
...
...
@@ -72,7 +72,7 @@ int DU_handle_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance,
uint32_t
assoc_id
,
uint32_t
stream
,
F1AP_F1AP_PDU_t
*
pdu
);
int
DU_send_UE_CONTEXT_MODIFICATION_RESPONSE
(
instance_t
instance
,
f1ap_ue_context_
setu
p_t
*
resp
);
int
DU_send_UE_CONTEXT_MODIFICATION_RESPONSE
(
instance_t
instance
,
f1ap_ue_context_
modif_res
p_t
*
resp
);
int
DU_send_UE_CONTEXT_MODIFICATION_FAILURE
(
instance_t
instance
);
...
...
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
View file @
2e94b8ed
...
...
@@ -44,10 +44,6 @@
#include "openair2/LAYER2/nr_rlc/nr_rlc_oai_api.h"
/* TODO REMOVE_DU_RRC: the RRC in the DU is a hack and should be taken out in the future */
#include "RRC/NR/nr_rrc_extern.h"
#include "RRC/NR/rrc_gNB_UE_context.h"
#include "RRC/L2_INTERFACE/openair_rrc_L2_interface.h"
#include "RRC/NR/MESSAGES/asn1_msg.h"
#include "intertask_interface.h"
...
...
@@ -2944,12 +2940,6 @@ void prepare_initial_ul_rrc_message(gNB_MAC_INST *mac, NR_UE_info_t *UE)
UE
->
CellGroup
=
cellGroupConfig
;
nr_mac_update_cellgroup
(
mac
,
UE
->
rnti
,
cellGroupConfig
);
/* TODO REMOVE_DU_RRC: the RRC in the DU is a hack and should be taken out in the future */
if
(
NODE_IS_DU
(
rrc
->
node_type
))
{
rrc_gNB_ue_context_t
*
ue
=
rrc_gNB_create_ue_context
(
UE
->
rnti
,
rrc
,
UE
->
rnti
);
ue
->
ue_context
.
masterCellGroup
=
cellGroupConfig
;
}
/* activate SRB0 */
nr_rlc_activate_srb0
(
UE
->
rnti
,
mac
,
UE
,
send_initial_ul_rrc_message
);
...
...
openair2/LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.c
View file @
2e94b8ed
...
...
@@ -33,25 +33,27 @@ static NR_RLC_BearerConfig_t *get_bearerconfig_from_srb(const f1ap_srb_to_be_set
return
get_SRB_RLC_BearerConfig
(
srb
->
srb_id
,
priority
,
bucket
);
}
static
void
handle_ue_context_srbs_setup
(
const
f1ap_ue_context_setup_t
*
req
,
f1ap_ue_context_setup_t
*
resp
,
NR_CellGroupConfig_t
*
cellGroupConfig
)
static
int
handle_ue_context_srbs_setup
(
int
rnti
,
int
srbs_len
,
const
f1ap_srb_to_be_setup_t
*
req_srbs
,
f1ap_srb_to_be_setup_t
**
resp_srbs
,
NR_CellGroupConfig_t
*
cellGroupConfig
)
{
DevAssert
(
req
!=
NULL
&&
resp
!=
NULL
&&
cellGroupConfig
!=
NULL
);
DevAssert
(
req
_srbs
!=
NULL
&&
resp_srbs
!=
NULL
&&
cellGroupConfig
!=
NULL
);
resp
->
srbs_to_be_setup_length
=
req
->
srbs_to_be_setup_length
;
resp
->
srbs_to_be_setup
=
calloc
(
req
->
srbs_to_be_setup_length
,
sizeof
(
*
resp
->
srbs_to_be_setup
));
AssertFatal
(
resp
->
srbs_to_be_setup
!=
NULL
,
"out of memory
\n
"
);
for
(
int
i
=
0
;
i
<
req
->
srbs_to_be_setup_length
;
i
++
)
{
f1ap_srb_to_be_setup_t
*
srb
=
&
req
->
srbs_to_be_setup
[
i
];
*
resp_srbs
=
calloc
(
srbs_len
,
sizeof
(
**
resp_srbs
));
AssertFatal
(
*
resp_srbs
!=
NULL
,
"out of memory
\n
"
);
for
(
int
i
=
0
;
i
<
srbs_len
;
i
++
)
{
const
f1ap_srb_to_be_setup_t
*
srb
=
&
req_srbs
[
i
];
NR_RLC_BearerConfig_t
*
rlc_BearerConfig
=
get_bearerconfig_from_srb
(
srb
);
nr_rlc_add_srb
(
r
eq
->
r
nti
,
srb
->
srb_id
,
rlc_BearerConfig
);
nr_rlc_add_srb
(
rnti
,
srb
->
srb_id
,
rlc_BearerConfig
);
resp
->
srbs_to_be_setup
[
i
]
=
*
srb
;
(
*
resp_srbs
)
[
i
]
=
*
srb
;
int
ret
=
ASN_SEQUENCE_ADD
(
&
cellGroupConfig
->
rlc_BearerToAddModList
->
list
,
rlc_BearerConfig
);
DevAssert
(
ret
==
0
);
}
return
srbs_len
;
}
static
NR_RLC_BearerConfig_t
*
get_bearerconfig_from_drb
(
const
f1ap_drb_to_be_setup_t
*
drb
)
...
...
@@ -61,27 +63,31 @@ static NR_RLC_BearerConfig_t *get_bearerconfig_from_drb(const f1ap_drb_to_be_set
return
get_DRB_RLC_BearerConfig
(
3
+
drb
->
drb_id
,
drb
->
drb_id
,
rlc_conf
,
priority
);
}
static
void
handle_ue_context_drbs_setup
(
const
f1ap_ue_context_setup_t
*
req
,
f1ap_ue_context_setup_t
*
resp
,
NR_CellGroupConfig_t
*
cellGroupConfig
)
static
int
handle_ue_context_drbs_setup
(
int
rnti
,
int
drbs_len
,
const
f1ap_drb_to_be_setup_t
*
req_drbs
,
f1ap_drb_to_be_setup_t
**
resp_drbs
,
NR_CellGroupConfig_t
*
cellGroupConfig
)
{
DevAssert
(
req
!=
NULL
&&
resp
!=
NULL
&&
cellGroupConfig
!=
NULL
);
DevAssert
(
req
_drbs
!=
NULL
&&
resp_drbs
!=
NULL
&&
cellGroupConfig
!=
NULL
);
/* Note: the actual GTP tunnels are created in the F1AP breanch of
* ue_context_*_response() */
resp
->
drbs_to_be_setup_length
=
req
->
drbs_to_be_setup_length
;
resp
->
drbs_to_be_setup
=
calloc
(
req
->
drbs_to_be_setup_length
,
sizeof
(
*
resp
->
drbs_to_be_setup
));
AssertFatal
(
resp
->
drbs_to_be_setup
!=
NULL
,
"out of memory
\n
"
);
for
(
int
i
=
0
;
i
<
req
->
drbs_to_be_setup_length
;
i
++
)
{
f1ap_drb_to_be_setup_t
*
drb
=
&
req
->
drbs_to_be_setup
[
i
];
*
resp_drbs
=
calloc
(
drbs_len
,
sizeof
(
**
resp_drbs
));
AssertFatal
(
*
resp_drbs
!=
NULL
,
"out of memory
\n
"
);
for
(
int
i
=
0
;
i
<
drbs_len
;
i
++
)
{
const
f1ap_drb_to_be_setup_t
*
drb
=
&
req_drbs
[
i
];
NR_RLC_BearerConfig_t
*
rlc_BearerConfig
=
get_bearerconfig_from_drb
(
drb
);
nr_rlc_add_drb
(
r
eq
->
r
nti
,
drb
->
drb_id
,
rlc_BearerConfig
);
nr_rlc_add_drb
(
rnti
,
drb
->
drb_id
,
rlc_BearerConfig
);
resp
->
drbs_to_be_setup
[
i
]
=
*
drb
;
(
*
resp_drbs
)[
i
]
=
*
drb
;
// just put same number of tunnels in DL as in UL
(
*
resp_drbs
)[
i
].
up_dl_tnl_length
=
drb
->
up_ul_tnl_length
;
int
ret
=
ASN_SEQUENCE_ADD
(
&
cellGroupConfig
->
rlc_BearerToAddModList
->
list
,
rlc_BearerConfig
);
DevAssert
(
ret
==
0
);
}
return
drbs_len
;
}
void
ue_context_setup_request
(
const
f1ap_ue_context_setup_t
*
req
)
...
...
@@ -105,11 +111,20 @@ void ue_context_setup_request(const f1ap_ue_context_setup_t *req)
NR_UE_info_t
*
UE
=
find_nr_UE
(
&
RC
.
nrmac
[
0
]
->
UE_info
,
req
->
rnti
);
AssertFatal
(
UE
!=
NULL
,
"did not find UE with RNTI %04x, but UE Context Setup Failed not implemented
\n
"
,
req
->
rnti
);
if
(
req
->
srbs_to_be_setup_length
>
0
)
handle_ue_context_srbs_setup
(
req
,
&
resp
,
UE
->
CellGroup
);
if
(
req
->
srbs_to_be_setup_length
>
0
)
{
resp
.
srbs_to_be_setup_length
=
handle_ue_context_srbs_setup
(
req
->
rnti
,
req
->
srbs_to_be_setup_length
,
req
->
srbs_to_be_setup
,
&
resp
.
srbs_to_be_setup
,
UE
->
CellGroup
);
}
if
(
req
->
drbs_to_be_setup_length
>
0
)
{
handle_ue_context_drbs_setup
(
req
,
&
resp
,
NULL
);
resp
.
drbs_to_be_setup_length
=
handle_ue_context_drbs_setup
(
req
->
rnti
,
req
->
drbs_to_be_setup_length
,
req
->
drbs_to_be_setup
,
&
resp
.
drbs_to_be_setup
,
UE
->
CellGroup
);
}
if
(
req
->
rrc_container
!=
NULL
)
...
...
@@ -147,6 +162,85 @@ void ue_context_setup_request(const f1ap_ue_context_setup_t *req)
free
(
resp
.
du_to_cu_rrc_information
);
}
void
ue_context_modification_request
(
const
f1ap_ue_context_modif_req_t
*
req
)
{
gNB_MAC_INST
*
mac
=
RC
.
nrmac
[
0
];
f1ap_ue_context_modif_resp_t
resp
=
{
.
gNB_CU_ue_id
=
req
->
gNB_CU_ue_id
,
.
gNB_DU_ue_id
=
req
->
gNB_DU_ue_id
,
.
rnti
=
req
->
rnti
,
};
if
(
req
->
cu_to_du_rrc_information
!=
NULL
)
{
AssertFatal
(
req
->
cu_to_du_rrc_information
->
cG_ConfigInfo
==
NULL
,
"CG-ConfigInfo not handled
\n
"
);
AssertFatal
(
req
->
cu_to_du_rrc_information
->
uE_CapabilityRAT_ContainerList
==
NULL
,
"UE capabilities not handled yet
\n
"
);
AssertFatal
(
req
->
cu_to_du_rrc_information
->
measConfig
==
NULL
,
"MeasConfig not handled
\n
"
);
}
NR_SCHED_LOCK
(
&
mac
->
sched_lock
);
NR_UE_info_t
*
UE
=
find_nr_UE
(
&
RC
.
nrmac
[
0
]
->
UE_info
,
req
->
rnti
);
if
(
req
->
srbs_to_be_setup_length
>
0
)
{
resp
.
srbs_to_be_setup_length
=
handle_ue_context_srbs_setup
(
req
->
rnti
,
req
->
srbs_to_be_setup_length
,
req
->
srbs_to_be_setup
,
&
resp
.
srbs_to_be_setup
,
UE
->
CellGroup
);
}
if
(
req
->
drbs_to_be_setup_length
>
0
)
{
resp
.
drbs_to_be_setup_length
=
handle_ue_context_drbs_setup
(
req
->
rnti
,
req
->
drbs_to_be_setup_length
,
req
->
drbs_to_be_setup
,
&
resp
.
drbs_to_be_setup
,
UE
->
CellGroup
);
}
if
(
req
->
rrc_container
!=
NULL
)
nr_rlc_srb_recv_sdu
(
req
->
rnti
,
DCCH
,
req
->
rrc_container
,
req
->
rrc_container_length
);
if
(
req
->
ReconfigComplOutcome
!=
RRCreconf_info_not_present
&&
req
->
ReconfigComplOutcome
!=
RRCreconf_success
)
{
LOG_E
(
NR_MAC
,
"RRC reconfiguration outcome unsuccessful, but no rollback mechanism implemented to come back to old configuration
\n
"
);
}
if
(
req
->
srbs_to_be_setup_length
>
0
||
req
->
drbs_to_be_setup_length
>
0
)
{
/* TODO: if we change e.g. BWP or MCS table, need to automatically call
* configure_UE_BWP() (form nr_mac_update_timers()) after some time? */
resp
.
du_to_cu_rrc_information
=
calloc
(
1
,
sizeof
(
du_to_cu_rrc_information_t
));
AssertFatal
(
resp
.
du_to_cu_rrc_information
!=
NULL
,
"out of memory
\n
"
);
resp
.
du_to_cu_rrc_information
->
cellGroupConfig
=
calloc
(
1
,
1024
);
AssertFatal
(
resp
.
du_to_cu_rrc_information
->
cellGroupConfig
!=
NULL
,
"out of memory
\n
"
);
asn_enc_rval_t
enc_rval
=
uper_encode_to_buffer
(
&
asn_DEF_NR_CellGroupConfig
,
NULL
,
UE
->
CellGroup
,
resp
.
du_to_cu_rrc_information
->
cellGroupConfig
,
1024
);
AssertFatal
(
enc_rval
.
encoded
>
0
,
"Could not encode CellGroup, failed element %s
\n
"
,
enc_rval
.
failed_type
->
name
);
resp
.
du_to_cu_rrc_information
->
cellGroupConfig_length
=
(
enc_rval
.
encoded
+
7
)
>>
3
;
/* works? */
nr_mac_update_cellgroup
(
RC
.
nrmac
[
0
],
req
->
rnti
,
UE
->
CellGroup
);
}
NR_SCHED_UNLOCK
(
&
mac
->
sched_lock
);
/* some sanity checks, since we use the same type for request and response */
DevAssert
(
resp
.
cu_to_du_rrc_information
==
NULL
);
// resp.du_to_cu_rrc_information can be either NULL or not
DevAssert
(
resp
.
rrc_container
==
NULL
&&
resp
.
rrc_container_length
==
0
);
mac
->
mac_rrc
.
ue_context_modification_response
(
req
,
&
resp
);
/* free the memory we allocated above */
free
(
resp
.
srbs_to_be_setup
);
free
(
resp
.
drbs_to_be_setup
);
if
(
resp
.
du_to_cu_rrc_information
!=
NULL
)
{
free
(
resp
.
du_to_cu_rrc_information
->
cellGroupConfig
);
free
(
resp
.
du_to_cu_rrc_information
);
}
}
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 @
2e94b8ed
...
...
@@ -26,6 +26,7 @@
#include "f1ap_messages_types.h"
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_release_command
(
const
f1ap_ue_context_release_cmd_t
*
cmd
);
int
dl_rrc_message
(
module_id_t
module_id
,
const
f1ap_dl_rrc_message_t
*
dl_rrc
);
...
...
openair2/LAYER2/NR_MAC_gNB/mac_rrc_ul.h
View file @
2e94b8ed
...
...
@@ -26,6 +26,8 @@
#include "f1ap_messages_types.h"
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_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 @
2e94b8ed
...
...
@@ -55,6 +55,63 @@ static void ue_context_setup_response_direct(const f1ap_ue_context_setup_t *req,
itti_send_msg_to_task
(
TASK_RRC_GNB
,
0
,
msg
);
}
static
void
ue_context_modification_response_direct
(
const
f1ap_ue_context_modif_req_t
*
req
,
const
f1ap_ue_context_modif_resp_t
*
resp
)
{
(
void
)
req
;
/* we don't need the request -- it is to set up GTP in F1 case */
MessageDef
*
msg
=
itti_alloc_new_message
(
TASK_MAC_GNB
,
0
,
F1AP_UE_CONTEXT_MODIFICATION_RESP
);
f1ap_ue_context_modif_resp_t
*
f1ap_msg
=
&
F1AP_UE_CONTEXT_MODIFICATION_RESP
(
msg
);
f1ap_msg
->
gNB_CU_ue_id
=
resp
->
gNB_CU_ue_id
;
f1ap_msg
->
gNB_DU_ue_id
=
resp
->
gNB_DU_ue_id
;
f1ap_msg
->
rnti
=
resp
->
rnti
;
f1ap_msg
->
mcc
=
resp
->
mcc
;
f1ap_msg
->
mnc
=
resp
->
mnc
;
f1ap_msg
->
mnc_digit_length
=
resp
->
mnc_digit_length
;
f1ap_msg
->
nr_cellid
=
resp
->
nr_cellid
;
f1ap_msg
->
servCellIndex
=
resp
->
servCellIndex
;
AssertFatal
(
resp
->
cellULConfigured
==
NULL
,
"not handled
\n
"
);
f1ap_msg
->
servCellId
=
resp
->
servCellId
;
DevAssert
(
resp
->
cu_to_du_rrc_information
==
NULL
&&
resp
->
cu_to_du_rrc_information_length
==
0
);
if
(
resp
->
du_to_cu_rrc_information
)
{
f1ap_msg
->
du_to_cu_rrc_information
=
malloc
(
sizeof
(
*
resp
->
du_to_cu_rrc_information
));
AssertFatal
(
f1ap_msg
->
du_to_cu_rrc_information
!=
NULL
,
"out of memory
\n
"
);
f1ap_msg
->
du_to_cu_rrc_information_length
=
resp
->
du_to_cu_rrc_information_length
;
du_to_cu_rrc_information_t
*
du2cu
=
f1ap_msg
->
du_to_cu_rrc_information
;
du2cu
->
cellGroupConfig_length
=
resp
->
du_to_cu_rrc_information
->
cellGroupConfig_length
;
du2cu
->
cellGroupConfig
=
calloc
(
du2cu
->
cellGroupConfig_length
,
sizeof
(
*
du2cu
->
cellGroupConfig
));
AssertFatal
(
du2cu
->
cellGroupConfig
!=
NULL
,
"out of memory
\n
"
);
memcpy
(
du2cu
->
cellGroupConfig
,
resp
->
du_to_cu_rrc_information
->
cellGroupConfig
,
du2cu
->
cellGroupConfig_length
);
}
if
(
resp
->
drbs_to_be_setup_length
>
0
)
{
DevAssert
(
resp
->
drbs_to_be_setup
!=
NULL
);
f1ap_msg
->
drbs_to_be_setup_length
=
resp
->
drbs_to_be_setup_length
;
f1ap_msg
->
drbs_to_be_setup
=
calloc
(
f1ap_msg
->
drbs_to_be_setup_length
,
sizeof
(
*
f1ap_msg
->
drbs_to_be_setup
));
for
(
int
i
=
0
;
i
<
f1ap_msg
->
drbs_to_be_setup_length
;
++
i
)
f1ap_msg
->
drbs_to_be_setup
[
i
]
=
resp
->
drbs_to_be_setup
[
i
];
}
DevAssert
(
resp
->
drbs_to_be_modified
==
NULL
&&
resp
->
drbs_to_be_modified_length
==
0
);
f1ap_msg
->
QoS_information_type
=
resp
->
QoS_information_type
;
AssertFatal
(
resp
->
drbs_failed_to_be_setup_length
==
0
&&
resp
->
drbs_failed_to_be_setup
==
NULL
,
"not implemented yet
\n
"
);
if
(
resp
->
srbs_to_be_setup_length
>
0
)
{
DevAssert
(
resp
->
srbs_to_be_setup
!=
NULL
);
f1ap_msg
->
srbs_to_be_setup_length
=
resp
->
srbs_to_be_setup_length
;
f1ap_msg
->
srbs_to_be_setup
=
calloc
(
f1ap_msg
->
srbs_to_be_setup_length
,
sizeof
(
*
f1ap_msg
->
srbs_to_be_setup
));
for
(
int
i
=
0
;
i
<
f1ap_msg
->
srbs_to_be_setup_length
;
++
i
)
f1ap_msg
->
srbs_to_be_setup
[
i
]
=
resp
->
srbs_to_be_setup
[
i
];
}
AssertFatal
(
resp
->
srbs_failed_to_be_setup_length
==
0
&&
resp
->
srbs_failed_to_be_setup
==
NULL
,
"not implemented yet
\n
"
);
DevAssert
(
resp
->
rrc_container
==
NULL
&&
resp
->
rrc_container_length
==
0
);
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
);
...
...
@@ -94,6 +151,7 @@ static void initial_ul_rrc_message_transfer_direct(module_id_t module_id, const
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_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 @
2e94b8ed
...
...
@@ -60,6 +60,42 @@ static void ue_context_setup_response_f1ap(const f1ap_ue_context_setup_t *req, c
itti_send_msg_to_task
(
TASK_DU_F1
,
0
,
msg
);
}
static
void
ue_context_modification_response_f1ap
(
const
f1ap_ue_context_modif_req_t
*
req
,
const
f1ap_ue_context_modif_resp_t
*
resp
)
{
MessageDef
*
msg
=
itti_alloc_new_message
(
TASK_MAC_GNB
,
0
,
F1AP_UE_CONTEXT_MODIFICATION_RESP
);
f1ap_ue_context_modif_resp_t
*
f1ap_msg
=
&
F1AP_UE_CONTEXT_MODIFICATION_RESP
(
msg
);
/* copy all fields, but reallocate rrc_containers! */
*
f1ap_msg
=
*
resp
;
if
(
resp
->
srbs_to_be_setup_length
>
0
)
{
DevAssert
(
resp
->
srbs_to_be_setup
!=
NULL
);
f1ap_msg
->
srbs_to_be_setup_length
=
resp
->
srbs_to_be_setup_length
;
f1ap_msg
->
srbs_to_be_setup
=
calloc
(
f1ap_msg
->
srbs_to_be_setup_length
,
sizeof
(
*
f1ap_msg
->
srbs_to_be_setup
));
for
(
int
i
=
0
;
i
<
f1ap_msg
->
srbs_to_be_setup_length
;
++
i
)
f1ap_msg
->
srbs_to_be_setup
[
i
]
=
resp
->
srbs_to_be_setup
[
i
];
}
if
(
resp
->
drbs_to_be_setup_length
>
0
)
{
DevAssert
(
resp
->
drbs_to_be_setup
!=
NULL
);
f1ap_msg
->
drbs_to_be_setup_length
=
resp
->
drbs_to_be_setup_length
;
f1ap_msg
->
drbs_to_be_setup
=
calloc
(
f1ap_msg
->
drbs_to_be_setup_length
,
sizeof
(
*
f1ap_msg
->
drbs_to_be_setup
));
for
(
int
i
=
0
;
i
<
f1ap_msg
->
drbs_to_be_setup_length
;
++
i
)
f1ap_msg
->
drbs_to_be_setup
[
i
]
=
resp
->
drbs_to_be_setup
[
i
];
}
if
(
resp
->
du_to_cu_rrc_information
!=
NULL
)
{
f1ap_msg
->
du_to_cu_rrc_information
=
calloc
(
1
,
sizeof
(
*
resp
->
du_to_cu_rrc_information
));
AssertFatal
(
f1ap_msg
->
du_to_cu_rrc_information
!=
NULL
,
"out of memory
\n
"
);
f1ap_msg
->
du_to_cu_rrc_information_length
=
resp
->
du_to_cu_rrc_information_length
;
du_to_cu_rrc_information_t
*
du2cu
=
f1ap_msg
->
du_to_cu_rrc_information
;
du2cu
->
cellGroupConfig_length
=
resp
->
du_to_cu_rrc_information
->
cellGroupConfig_length
;
du2cu
->
cellGroupConfig
=
calloc
(
du2cu
->
cellGroupConfig_length
,
sizeof
(
*
du2cu
->
cellGroupConfig
));
AssertFatal
(
du2cu
->
cellGroupConfig
!=
NULL
,
"out of memory
\n
"
);
memcpy
(
du2cu
->
cellGroupConfig
,
resp
->
du_to_cu_rrc_information
->
cellGroupConfig
,
du2cu
->
cellGroupConfig_length
);
}
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
);
...
...
@@ -101,6 +137,7 @@ static void initial_ul_rrc_message_transfer_f1ap(module_id_t module_id, const f1
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_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 @
2e94b8ed
...
...
@@ -662,6 +662,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_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/cucp_cuup_direct.c
View file @
2e94b8ed
...
...
@@ -190,6 +190,19 @@ static void cucp_cuup_bearer_context_setup_direct(e1ap_bearer_setup_req_t *const
PROTOCOL_CTXT_SET_BY_MODULE_ID
(
&
ctxt
,
0
,
GNB_FLAG_YES
,
UE
->
rnti
,
0
,
0
,
0
);
fill_DRB_configList
(
&
ctxt
,
ue_context_p
,
xid
);
e1ap_bearer_setup_resp_t
resp
=
{
0
};
resp
.
numPDUSessions
=
req
->
numPDUSessions
;
for
(
int
i
=
0
;
i
<
resp
.
numPDUSessions
;
++
i
)
{
resp
.
pduSession
[
i
].
numDRBSetup
=
req
->
pduSession
[
i
].
numDRB2Setup
;
for
(
int
j
=
0
;
j
<
req
->
pduSession
[
i
].
numDRB2Setup
;
j
++
)
{
DRB_nGRAN_to_setup_t
*
req_drb
=
req
->
pduSession
[
i
].
DRBnGRanList
+
j
;
DRB_nGRAN_setup_t
*
resp_drb
=
resp
.
pduSession
[
i
].
DRBnGRanList
+
j
;
resp_drb
->
id
=
req_drb
->
id
;
resp_drb
->
numQosFlowSetup
=
req_drb
->
numQosFlow2Setup
;
for
(
int
k
=
0
;
k
<
resp_drb
->
numQosFlowSetup
;
k
++
)
resp_drb
->
qosFlows
[
k
].
id
=
req_drb
->
qosFlows
[
k
].
id
;
}
}
gNB_RRC_INST
*
rrc
=
RC
.
nrrrc
[
ctxt
.
module_id
];
// Fixme: xid not random, but almost!
...
...
@@ -198,21 +211,26 @@ static void cucp_cuup_bearer_context_setup_direct(e1ap_bearer_setup_req_t *const
int
ret
=
drb_config_gtpu_create
(
&
ctxt
,
ue_context_p
,
req
,
UE
->
DRB_configList
,
*
SRB_configList2
,
rrc
->
e1_inst
);
if
(
ret
<
0
)
AssertFatal
(
false
,
"Unable to configure DRB or to create GTP Tunnel
\n
"
);
// Used to store teids: if monolithic, will simply be NULL
if
(
!
NODE_IS_CU
(
RC
.
nrrrc
[
ctxt
.
module_id
]
->
node_type
))
{
rrc_gNB_generate_dedicatedRRCReconfiguration
(
&
ctxt
,
ue_context_p
,
NULL
);
// intentionally empty
}
else
{
e1ap_bearer_setup_resp_t
resp
;
// Used to store teids
int
remote_port
=
RC
.
nrrrc
[
ctxt
.
module_id
]
->
eth_params_s
.
remote_portd
;
in_addr_t
my_addr
=
inet_addr
(
RC
.
nrrrc
[
ctxt
.
module_id
]
->
eth_params_s
.
my_addr
);
instance_t
gtpInst
=
getCxt
(
CUtype
,
instance
)
->
gtpInst
;
// GTP tunnel for DL
fill_e1ap_bearer_setup_resp
(
&
resp
,
req
,
gtpInst
,
UE
->
rnti
,
remote_port
,
my_addr
);
prepare_and_send_ue_context_modification_f1
(
ue_context_p
,
&
resp
);
}
// actually, we should receive the corresponding context setup response
// message at the RRC and always react to this one. So in the following, we
// just call the corresponding message handler
prepare_and_send_ue_context_modification_f1
(
ue_context_p
,
&
resp
);
}
static
void
cucp_cuup_bearer_context_mod_direct
(
e1ap_bearer_setup_req_t
*
const
req
,
instance_t
instance
,
uint8_t
xid
)
{
// only update GTP tunnels if it is really a CU
if
(
!
NODE_IS_CU
(
RC
.
nrrrc
[
0
]
->
node_type
))
return
;
instance_t
gtpInst
=
getCxt
(
CUtype
,
instance
)
->
gtpInst
;
CU_update_UP_DL_tunnel
(
req
,
gtpInst
,
req
->
rnti
);
}
...
...
openair2/RRC/NR/mac_rrc_dl.h
View file @
2e94b8ed
...
...
@@ -26,6 +26,7 @@
#include "f1ap_messages_types.h"
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_release_command_func_t
)(
const
f1ap_ue_context_release_cmd_t
*
cmd
);
typedef
void
(
*
dl_rrc_message_transfer_func_t
)(
module_id_t
module_id
,
const
f1ap_dl_rrc_message_t
*
dl_rrc
);
...
...
openair2/RRC/NR/mac_rrc_dl_direct.c
View file @
2e94b8ed
...
...
@@ -34,6 +34,7 @@ static void dl_rrc_message_transfer_direct(module_id_t module_id, const f1ap_dl_
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_release_command
=
ue_context_release_command
;
mac_rrc
->
dl_rrc_message_transfer
=
dl_rrc_message_transfer_direct
;
}
openair2/RRC/NR/mac_rrc_dl_f1ap.c
View file @
2e94b8ed
...
...
@@ -30,6 +30,38 @@ static void ue_context_setup_request_f1ap(const f1ap_ue_context_setup_t *req)
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
"
);
AssertFatal
(
req
->
drbs_to_be_setup
==
NULL
,
"drbs_to_be_setup not supported yet
\n
"
);
AssertFatal
(
req
->
srbs_to_be_setup
==
NULL
,
"drbs_to_be_setup not supported yet
\n
"
);
if
(
req
->
rrc_container_length
>
0
)
{
f1ap_msg
->
rrc_container
=
calloc
(
req
->
rrc_container_length
,
sizeof
(
*
f1ap_msg
->
rrc_container
));
AssertFatal
(
f1ap_msg
->
rrc_container
!=
NULL
,
"out of memory
\n
"
);
f1ap_msg
->
rrc_container_length
=
req
->
rrc_container_length
;
memcpy
(
f1ap_msg
->
rrc_container
,
req
->
rrc_container
,
req
->
rrc_container_length
);
}
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
)
{
MessageDef
*
msg
=
itti_alloc_new_message
(
TASK_RRC_GNB
,
0
,
F1AP_UE_CONTEXT_MODIFICATION_REQ
);
f1ap_ue_context_modif_req_t
*
f1ap_msg
=
&
F1AP_UE_CONTEXT_MODIFICATION_REQ
(
msg
);
*
f1ap_msg
=
*
req
;
AssertFatal
(
req
->
cu_to_du_rrc_information
==
NULL
,
"cu_to_du_rrc_information not supported yet
\n
"
);
AssertFatal
(
req
->
drbs_to_be_modified_length
==
0
,
"drbs_to_be_modified not supported yet
\n
"
);
if
(
req
->
drbs_to_be_setup_length
>
0
)
{
int
n
=
req
->
drbs_to_be_setup_length
;
f1ap_msg
->
drbs_to_be_setup_length
=
n
;
f1ap_msg
->
drbs_to_be_setup
=
calloc
(
n
,
sizeof
(
*
f1ap_msg
->
drbs_to_be_setup
));
AssertFatal
(
f1ap_msg
->
drbs_to_be_setup
!=
NULL
,
"out of memory
\n
"
);
memcpy
(
f1ap_msg
->
drbs_to_be_setup
,
req
->
drbs_to_be_setup
,
n
*
sizeof
(
*
f1ap_msg
->
drbs_to_be_setup
));
}
if
(
req
->
srbs_to_be_setup_length
>
0
)
{
int
n
=
req
->
srbs_to_be_setup_length
;
f1ap_msg
->
srbs_to_be_setup_length
=
n
;
f1ap_msg
->
srbs_to_be_setup
=
calloc
(
n
,
sizeof
(
*
f1ap_msg
->
srbs_to_be_setup
));
AssertFatal
(
f1ap_msg
->
srbs_to_be_setup
!=
NULL
,
"out of memory
\n
"
);
memcpy
(
f1ap_msg
->
srbs_to_be_setup
,
req
->
srbs_to_be_setup
,
n
*
sizeof
(
*
f1ap_msg
->
srbs_to_be_setup
));
}
if
(
req
->
rrc_container_length
>
0
)
{
f1ap_msg
->
rrc_container
=
calloc
(
req
->
rrc_container_length
,
sizeof
(
*
f1ap_msg
->
rrc_container
));
AssertFatal
(
f1ap_msg
->
rrc_container
!=
NULL
,
"out of memory
\n
"
);
...
...
@@ -66,6 +98,7 @@ static void dl_rrc_message_transfer_f1ap(module_id_t module_id, const f1ap_dl_rr
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_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 @
2e94b8ed
...
...
@@ -379,6 +379,7 @@ 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_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/nr_rrc_proto.h
View file @
2e94b8ed
...
...
@@ -142,11 +142,7 @@ rrc_gNB_generate_dedicatedRRCReconfiguration_release(
uint32_t
nas_length
,
uint8_t
*
nas_buffer
);
void
rrc_gNB_generate_dedicatedRRCReconfiguration
(
const
protocol_ctxt_t
*
const
ctxt_pP
,
rrc_gNB_ue_context_t
*
ue_context_pP
,
NR_CellGroupConfig_t
*
cell_groupConfig_from_DU
);
void
rrc_gNB_generate_dedicatedRRCReconfiguration
(
const
protocol_ctxt_t
*
const
ctxt_pP
,
rrc_gNB_ue_context_t
*
ue_context_pP
);
void
bearer_context_setup_direct
(
e1ap_bearer_setup_req_t
*
req
,
instance_t
instance
);
...
...
openair2/RRC/NR/rrc_gNB.c
View file @
2e94b8ed
This diff is collapsed.
Click to expand it.
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