Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
OpenXG-RAN
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
lizhongxiao
OpenXG-RAN
Commits
b9b82998
Commit
b9b82998
authored
Dec 16, 2022
by
Stone WU
Committed by
Jerome PERALDI
Jan 17, 2023
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
bug #114120: [NR SIMU]5G NRGC implementation of TTCN radioBearerList API
parent
ee04e470
Changes
9
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
896 additions
and
196 deletions
+896
-196
common/ran_context.h
common/ran_context.h
+10
-0
openair2/COMMON/rrc_messages_def.h
openair2/COMMON/rrc_messages_def.h
+3
-0
openair2/COMMON/rrc_messages_types.h
openair2/COMMON/rrc_messages_types.h
+26
-0
openair2/RRC/NR/L2_nr_interface.c
openair2/RRC/NR/L2_nr_interface.c
+1
-1
openair2/RRC/NR/MESSAGES/asn1_msg.c
openair2/RRC/NR/MESSAGES/asn1_msg.c
+281
-58
openair2/RRC/NR/MESSAGES/asn1_msg.h
openair2/RRC/NR/MESSAGES/asn1_msg.h
+9
-3
openair2/RRC/NR/rrc_gNB.c
openair2/RRC/NR/rrc_gNB.c
+267
-108
openair2/RRC/NR/rrc_gNB_UE_context.c
openair2/RRC/NR/rrc_gNB_UE_context.c
+2
-0
openair3/SS/ss_gNB_sys_task.c
openair3/SS/ss_gNB_sys_task.c
+297
-26
No files found.
common/ran_context.h
View file @
b9b82998
...
@@ -58,6 +58,15 @@ typedef struct RBConfig_s {
...
@@ -58,6 +58,15 @@ typedef struct RBConfig_s {
bool
DiscardULData
;
bool
DiscardULData
;
}
RBConfig
;
}
RBConfig
;
typedef
struct
NRRBConfig_s
{
bool
isRBConfigValid
;
NR_SDAP_Config_t
*
Sdap
;
NR_PDCP_Config_t
*
Pdcp
;
long
*
pdcpTransparentSN_Size
;
NR_RLC_BearerConfig_t
*
RlcBearer
;
bool
*
DiscardULData
;
}
NRRBConfig
;
typedef
struct
{
typedef
struct
{
/// RAN context config file name
/// RAN context config file name
char
*
config_file_name
;
char
*
config_file_name
;
...
@@ -126,6 +135,7 @@ typedef struct {
...
@@ -126,6 +135,7 @@ typedef struct {
// Variable to store Transaction ID for SS in case of RRCReconfiguration
// Variable to store Transaction ID for SS in case of RRCReconfiguration
long
rrc_Transaction_Identifier
;
long
rrc_Transaction_Identifier
;
RBConfig
RB_Config
[
MAX_NUM_CCs
][
MAX_RBS
];
RBConfig
RB_Config
[
MAX_NUM_CCs
][
MAX_RBS
];
NRRBConfig
NR_RB_Config
[
MAX_NUM_CCs
][
MAX_NR_RBS
];
}
RAN_CONTEXT_t
;
}
RAN_CONTEXT_t
;
extern
RAN_CONTEXT_t
RC
;
extern
RAN_CONTEXT_t
RC
;
...
...
openair2/COMMON/rrc_messages_def.h
View file @
b9b82998
...
@@ -58,7 +58,10 @@ MESSAGE_DEF(RRC_RBLIST_CFG_REQ, MESSAGE_PRIORITY_MED, RrcRblistCfg
...
@@ -58,7 +58,10 @@ MESSAGE_DEF(RRC_RBLIST_CFG_REQ, MESSAGE_PRIORITY_MED, RrcRblistCfg
MESSAGE_DEF
(
RRC_UE_CAT_INFO
,
MESSAGE_PRIORITY_MED
,
rrcUECatInfo
,
rrc_ue_cat_info
)
MESSAGE_DEF
(
RRC_UE_CAT_INFO
,
MESSAGE_PRIORITY_MED
,
rrcUECatInfo
,
rrc_ue_cat_info
)
MESSAGE_DEF
(
RRC_AS_SECURITY_CONFIG_REQ
,
MESSAGE_PRIORITY_MED
,
RrcAsSecurityConfigReq
,
rrc_as_security_config_req
)
MESSAGE_DEF
(
RRC_AS_SECURITY_CONFIG_REQ
,
MESSAGE_PRIORITY_MED
,
RrcAsSecurityConfigReq
,
rrc_as_security_config_req
)
MESSAGE_DEF
(
NBIOTRRC_CONFIGURATION_REQ
,
MESSAGE_PRIORITY_MED
,
NbIoTRrcConfigurationReq
,
nbiotrrc_configuration_req
)
MESSAGE_DEF
(
NBIOTRRC_CONFIGURATION_REQ
,
MESSAGE_PRIORITY_MED
,
NbIoTRrcConfigurationReq
,
nbiotrrc_configuration_req
)
// gNB: gNB_APP -> RRC messages
MESSAGE_DEF
(
NRRRC_CONFIGURATION_REQ
,
MESSAGE_PRIORITY_MED
,
gNB_RrcConfigurationReq
,
nrrrc_configuration_req
)
MESSAGE_DEF
(
NRRRC_CONFIGURATION_REQ
,
MESSAGE_PRIORITY_MED
,
gNB_RrcConfigurationReq
,
nrrrc_configuration_req
)
MESSAGE_DEF
(
NRRRC_RBLIST_CFG_REQ
,
MESSAGE_PRIORITY_MED
,
NRRrcRblistCfgReq
,
nrrrc_rblist_cfg_req
)
// UE: NAS -> RRC messages
// UE: NAS -> RRC messages
MESSAGE_DEF
(
NAS_KENB_REFRESH_REQ
,
MESSAGE_PRIORITY_MED
,
NasKenbRefreshReq
,
nas_kenb_refresh_req
)
MESSAGE_DEF
(
NAS_KENB_REFRESH_REQ
,
MESSAGE_PRIORITY_MED
,
NasKenbRefreshReq
,
nas_kenb_refresh_req
)
...
...
openair2/COMMON/rrc_messages_types.h
View file @
b9b82998
...
@@ -53,8 +53,12 @@
...
@@ -53,8 +53,12 @@
#include "LTE_InterFreqNeighCellInfo.h"
#include "LTE_InterFreqNeighCellInfo.h"
#include "LTE_PhysCellIdRange.h"
#include "LTE_PhysCellIdRange.h"
#include "LTE_NeighCellConfig.h"
#include "LTE_NeighCellConfig.h"
#include "NR_SDAP-Config.h"
#include "NR_PDCP-Config.h"
#include "NR_RLC-BearerConfig.h"
#define MAX_RBS (LTE_maxDRB + 3)
#define MAX_RBS (LTE_maxDRB + 3)
#define MAX_NR_RBS (NR_maxDRB+3)
//-------------------------------------------------------------------------------------------//
//-------------------------------------------------------------------------------------------//
// Messages for RRC logging
// Messages for RRC logging
...
@@ -90,6 +94,8 @@
...
@@ -90,6 +94,8 @@
#define NRRRC_CONFIGURATION_REQ(mSGpTR) (mSGpTR)->ittiMsg.nrrrc_configuration_req
#define NRRRC_CONFIGURATION_REQ(mSGpTR) (mSGpTR)->ittiMsg.nrrrc_configuration_req
#define NRRRC_RBLIST_CFG_REQ(mSGpTR) (mSGpTR)->ittiMsg.nrrrc_rblist_cfg_req
#define NAS_KENB_REFRESH_REQ(mSGpTR) (mSGpTR)->ittiMsg.nas_kenb_refresh_req
#define NAS_KENB_REFRESH_REQ(mSGpTR) (mSGpTR)->ittiMsg.nas_kenb_refresh_req
#define NAS_CELL_SELECTION_REQ(mSGpTR) (mSGpTR)->ittiMsg.nas_cell_selection_req
#define NAS_CELL_SELECTION_REQ(mSGpTR) (mSGpTR)->ittiMsg.nas_cell_selection_req
#define NAS_CONN_ESTABLI_REQ(mSGpTR) (mSGpTR)->ittiMsg.nas_conn_establi_req
#define NAS_CONN_ESTABLI_REQ(mSGpTR) (mSGpTR)->ittiMsg.nas_conn_establi_req
...
@@ -647,6 +653,26 @@ typedef struct NRDuDlReq_s {
...
@@ -647,6 +653,26 @@ typedef struct NRDuDlReq_s {
uint64_t
srb_id
;
uint64_t
srb_id
;
}
NRDuDlReq_t
;
}
NRDuDlReq_t
;
typedef
struct
NRRadioBearerConfig_s
{
NR_SDAP_Config_t
*
Sdap
;
NR_PDCP_Config_t
*
Pdcp
;
long
*
pdcpTransparentSN_Size
;
NR_RLC_BearerConfig_t
*
RlcBearer
;
bool
*
DiscardULData
;
}
NRRadioBearerConfig
;
typedef
struct
nr_rb_info_s
{
uint8_t
RbId
;
NRRadioBearerConfig
RbConfig
;
}
nr_rb_info
;
typedef
struct
NRRrcRblistCfgReq_s
{
int
rb_count
;
int
cell_index
;
nr_rb_info
rb_list
[
MAX_NR_RBS
];
}
NRRrcRblistCfgReq
;
// UE: NAS -> RRC messages
// UE: NAS -> RRC messages
typedef
kenb_refresh_req_t
NasKenbRefreshReq
;
typedef
kenb_refresh_req_t
NasKenbRefreshReq
;
typedef
cell_info_req_t
NasCellSelectionReq
;
typedef
cell_info_req_t
NasCellSelectionReq
;
...
...
openair2/RRC/NR/L2_nr_interface.c
View file @
b9b82998
...
@@ -321,7 +321,7 @@ int8_t nr_mac_rrc_data_ind(const module_id_t module_idP,
...
@@ -321,7 +321,7 @@ int8_t nr_mac_rrc_data_ind(const module_id_t module_idP,
ue_context_p
->
ue_context
.
Srb0
.
Active
=
1
;
ue_context_p
->
ue_context
.
Srb0
.
Active
=
1
;
RB_INSERT
(
rrc_nr_ue_tree_s
,
&
RC
.
nrrrc
[
module_idP
]
->
rrc_ue_head
,
ue_context_p
);
RB_INSERT
(
rrc_nr_ue_tree_s
,
&
RC
.
nrrrc
[
module_idP
]
->
rrc_ue_head
,
ue_context_p
);
fill_initial_cellGroupConfig
(
ue_context_p
->
local_uid
,
&
cellGroupConfig
,
scc
,
&
RC
.
nrrrc
[
module_idP
]
->
carrier
);
fill_initial_cellGroupConfig
(
ue_context_p
->
local_uid
,
&
cellGroupConfig
,
scc
,
&
RC
.
nrrrc
[
module_idP
]
->
carrier
,
CC_id
);
MessageDef
*
tmp
=
itti_alloc_new_message_sized
(
TASK_RRC_GNB
,
0
,
F1AP_INITIAL_UL_RRC_MESSAGE
,
sizeof
(
f1ap_initial_ul_rrc_message_t
)
+
sdu_lenP
);
MessageDef
*
tmp
=
itti_alloc_new_message_sized
(
TASK_RRC_GNB
,
0
,
F1AP_INITIAL_UL_RRC_MESSAGE
,
sizeof
(
f1ap_initial_ul_rrc_message_t
)
+
sdu_lenP
);
f1ap_initial_ul_rrc_message_t
*
msg
=
&
F1AP_INITIAL_UL_RRC_MESSAGE
(
tmp
);
f1ap_initial_ul_rrc_message_t
*
msg
=
&
F1AP_INITIAL_UL_RRC_MESSAGE
(
tmp
);
...
...
openair2/RRC/NR/MESSAGES/asn1_msg.c
View file @
b9b82998
...
@@ -1089,6 +1089,136 @@ long rrc_get_max_nr_csrs(uint8_t max_rbs, long b_SRS) {
...
@@ -1089,6 +1089,136 @@ long rrc_get_max_nr_csrs(uint8_t max_rbs, long b_SRS) {
return
c_srs
;
return
c_srs
;
}
}
NR_RLC_Config_t
*
fill_rb_rlc_config
(
NR_RLC_Config_t
*
ss_rlc_config
)
{
NR_RLC_Config_t
*
rlc_Config
=
NULL
;
rlc_Config
=
calloc
(
1
,
sizeof
(
NR_RLC_Config_t
));
if
(
ss_rlc_config
){
rlc_Config
->
present
=
ss_rlc_config
->
present
;
if
(
rlc_Config
->
present
==
NR_RLC_Config_PR_am
){
rlc_Config
->
choice
.
am
=
calloc
(
1
,
sizeof
(
*
rlc_Config
->
choice
.
am
));
rlc_Config
->
choice
.
am
->
dl_AM_RLC
.
sn_FieldLength
=
calloc
(
1
,
sizeof
(
NR_SN_FieldLengthAM_t
));
if
(
ss_rlc_config
->
choice
.
am
->
dl_AM_RLC
.
sn_FieldLength
){
*
(
rlc_Config
->
choice
.
am
->
dl_AM_RLC
.
sn_FieldLength
)
=*
(
ss_rlc_config
->
choice
.
am
->
dl_AM_RLC
.
sn_FieldLength
);
}
else
{
*
(
rlc_Config
->
choice
.
am
->
dl_AM_RLC
.
sn_FieldLength
)
=
NR_SN_FieldLengthAM_size12
;
}
rlc_Config
->
choice
.
am
->
dl_AM_RLC
.
t_Reassembly
=
ss_rlc_config
->
choice
.
am
->
dl_AM_RLC
.
t_Reassembly
;
rlc_Config
->
choice
.
am
->
dl_AM_RLC
.
t_StatusProhibit
=
ss_rlc_config
->
choice
.
am
->
dl_AM_RLC
.
t_StatusProhibit
;
rlc_Config
->
choice
.
am
->
ul_AM_RLC
.
sn_FieldLength
=
calloc
(
1
,
sizeof
(
NR_SN_FieldLengthAM_t
));
if
(
ss_rlc_config
->
choice
.
am
->
ul_AM_RLC
.
sn_FieldLength
){
*
(
rlc_Config
->
choice
.
am
->
ul_AM_RLC
.
sn_FieldLength
)
=*
(
ss_rlc_config
->
choice
.
am
->
ul_AM_RLC
.
sn_FieldLength
);
}
else
{
*
(
rlc_Config
->
choice
.
am
->
ul_AM_RLC
.
sn_FieldLength
)
=
NR_SN_FieldLengthAM_size12
;
}
rlc_Config
->
choice
.
am
->
ul_AM_RLC
.
t_PollRetransmit
=
ss_rlc_config
->
choice
.
am
->
ul_AM_RLC
.
t_PollRetransmit
;
rlc_Config
->
choice
.
am
->
ul_AM_RLC
.
pollPDU
=
ss_rlc_config
->
choice
.
am
->
ul_AM_RLC
.
pollPDU
;
rlc_Config
->
choice
.
am
->
ul_AM_RLC
.
pollByte
=
ss_rlc_config
->
choice
.
am
->
ul_AM_RLC
.
pollByte
;
rlc_Config
->
choice
.
am
->
ul_AM_RLC
.
maxRetxThreshold
=
ss_rlc_config
->
choice
.
am
->
ul_AM_RLC
.
maxRetxThreshold
;
}
else
if
(
rlc_Config
->
present
==
NR_RLC_Config_PR_um_Bi_Directional
){
rlc_Config
->
choice
.
um_Bi_Directional
=
calloc
(
1
,
sizeof
(
*
rlc_Config
->
choice
.
um_Bi_Directional
));
rlc_Config
->
choice
.
um_Bi_Directional
->
dl_UM_RLC
.
sn_FieldLength
=
calloc
(
1
,
sizeof
(
NR_SN_FieldLengthUM_t
));
if
(
ss_rlc_config
->
choice
.
um_Bi_Directional
->
dl_UM_RLC
.
sn_FieldLength
){
*
(
rlc_Config
->
choice
.
um_Bi_Directional
->
dl_UM_RLC
.
sn_FieldLength
)
=
*
(
ss_rlc_config
->
choice
.
um_Bi_Directional
->
dl_UM_RLC
.
sn_FieldLength
);
}
else
{
*
(
rlc_Config
->
choice
.
um_Bi_Directional
->
dl_UM_RLC
.
sn_FieldLength
)
=
NR_SN_FieldLengthUM_size12
;
}
rlc_Config
->
choice
.
um_Bi_Directional
->
dl_UM_RLC
.
t_Reassembly
=
ss_rlc_config
->
choice
.
um_Bi_Directional
->
dl_UM_RLC
.
t_Reassembly
;
rlc_Config
->
choice
.
um_Bi_Directional
->
ul_UM_RLC
.
sn_FieldLength
=
calloc
(
1
,
sizeof
(
NR_SN_FieldLengthUM_t
));
if
(
ss_rlc_config
->
choice
.
um_Bi_Directional
->
ul_UM_RLC
.
sn_FieldLength
){
*
(
rlc_Config
->
choice
.
um_Bi_Directional
->
ul_UM_RLC
.
sn_FieldLength
)
=
*
(
ss_rlc_config
->
choice
.
um_Bi_Directional
->
ul_UM_RLC
.
sn_FieldLength
);
}
else
{
*
(
rlc_Config
->
choice
.
um_Bi_Directional
->
ul_UM_RLC
.
sn_FieldLength
)
=
NR_SN_FieldLengthUM_size12
;
}
}
else
if
(
rlc_Config
->
present
==
NR_RLC_Config_PR_um_Uni_Directional_DL
){
rlc_Config
->
choice
.
um_Uni_Directional_DL
=
calloc
(
1
,
sizeof
(
*
rlc_Config
->
choice
.
um_Uni_Directional_DL
));
if
(
ss_rlc_config
->
choice
.
um_Uni_Directional_DL
->
dl_UM_RLC
.
sn_FieldLength
){
*
(
rlc_Config
->
choice
.
um_Uni_Directional_DL
->
dl_UM_RLC
.
sn_FieldLength
)
=
*
(
ss_rlc_config
->
choice
.
um_Uni_Directional_DL
->
dl_UM_RLC
.
sn_FieldLength
);
}
else
{
*
(
rlc_Config
->
choice
.
um_Uni_Directional_DL
->
dl_UM_RLC
.
sn_FieldLength
)
=
NR_SN_FieldLengthUM_size12
;
}
rlc_Config
->
choice
.
um_Uni_Directional_DL
->
dl_UM_RLC
.
t_Reassembly
=
ss_rlc_config
->
choice
.
um_Uni_Directional_DL
->
dl_UM_RLC
.
t_Reassembly
;
}
else
if
(
rlc_Config
->
present
==
NR_RLC_Config_PR_um_Uni_Directional_UL
){
rlc_Config
->
choice
.
um_Uni_Directional_UL
=
calloc
(
1
,
sizeof
(
*
rlc_Config
->
choice
.
um_Uni_Directional_UL
));
rlc_Config
->
choice
.
um_Uni_Directional_UL
->
ul_UM_RLC
.
sn_FieldLength
=
calloc
(
1
,
sizeof
(
NR_SN_FieldLengthUM_t
));
if
(
ss_rlc_config
->
choice
.
um_Uni_Directional_UL
->
ul_UM_RLC
.
sn_FieldLength
){
*
(
rlc_Config
->
choice
.
um_Uni_Directional_UL
->
ul_UM_RLC
.
sn_FieldLength
)
=
*
(
ss_rlc_config
->
choice
.
um_Uni_Directional_UL
->
ul_UM_RLC
.
sn_FieldLength
);
}
else
{
*
(
rlc_Config
->
choice
.
um_Uni_Directional_UL
->
ul_UM_RLC
.
sn_FieldLength
)
=
NR_SN_FieldLengthUM_size12
;
}
}
}
else
{
rlc_Config
->
present
=
NR_RLC_Config_PR_am
;
rlc_Config
->
choice
.
am
=
calloc
(
1
,
sizeof
(
*
rlc_Config
->
choice
.
am
));
rlc_Config
->
choice
.
am
->
dl_AM_RLC
.
sn_FieldLength
=
calloc
(
1
,
sizeof
(
NR_SN_FieldLengthAM_t
));
*
(
rlc_Config
->
choice
.
am
->
dl_AM_RLC
.
sn_FieldLength
)
=
NR_SN_FieldLengthAM_size12
;
rlc_Config
->
choice
.
am
->
dl_AM_RLC
.
t_Reassembly
=
NR_T_Reassembly_ms35
;
rlc_Config
->
choice
.
am
->
dl_AM_RLC
.
t_StatusProhibit
=
NR_T_StatusProhibit_ms0
;
rlc_Config
->
choice
.
am
->
ul_AM_RLC
.
sn_FieldLength
=
calloc
(
1
,
sizeof
(
NR_SN_FieldLengthAM_t
));
*
(
rlc_Config
->
choice
.
am
->
ul_AM_RLC
.
sn_FieldLength
)
=
NR_SN_FieldLengthAM_size12
;
rlc_Config
->
choice
.
am
->
ul_AM_RLC
.
t_PollRetransmit
=
NR_T_PollRetransmit_ms45
;
rlc_Config
->
choice
.
am
->
ul_AM_RLC
.
pollPDU
=
NR_PollPDU_infinity
;
rlc_Config
->
choice
.
am
->
ul_AM_RLC
.
pollByte
=
NR_PollByte_infinity
;
rlc_Config
->
choice
.
am
->
ul_AM_RLC
.
maxRetxThreshold
=
NR_UL_AM_RLC__maxRetxThreshold_t8
;
}
return
rlc_Config
;
}
void
fill_rb_RLC_BearerConfig
(
int
rbIndex
,
NR_RLC_BearerConfig_t
*
rlc_BearerConfig
,
NR_RLC_BearerConfig_t
*
ss_rlc_BearerConfig
)
{
NR_RLC_Config_t
*
rlc_Config
=
NULL
;
NR_LogicalChannelConfig_t
*
logicalChannelConfig
=
NULL
;
long
*
logicalChannelGroup
=
NULL
;
bool
isSrb
=
rbIndex
<
3
?
true
:
false
;
if
(
!
rlc_BearerConfig
){
return
;
}
if
(
ss_rlc_BearerConfig
&&
ss_rlc_BearerConfig
->
logicalChannelIdentity
){
rlc_BearerConfig
->
logicalChannelIdentity
=
ss_rlc_BearerConfig
->
logicalChannelIdentity
;
}
else
{
rlc_BearerConfig
->
logicalChannelIdentity
=
isSrb
?
rbIndex
:
(
rbIndex
-
2
);
}
rlc_BearerConfig
->
servedRadioBearer
=
calloc
(
1
,
sizeof
(
*
rlc_BearerConfig
->
servedRadioBearer
));
rlc_BearerConfig
->
servedRadioBearer
->
present
=
isSrb
?
(
NR_RLC_BearerConfig__servedRadioBearer_PR_srb_Identity
)
:
(
NR_RLC_BearerConfig__servedRadioBearer_PR_drb_Identity
);
if
(
isSrb
){
rlc_BearerConfig
->
servedRadioBearer
->
choice
.
srb_Identity
=
rbIndex
;
}
else
{
rlc_BearerConfig
->
servedRadioBearer
->
choice
.
drb_Identity
=
rbIndex
-
2
;
}
rlc_BearerConfig
->
reestablishRLC
=
NULL
;
rlc_Config
=
fill_rb_rlc_config
(
ss_rlc_BearerConfig
->
rlc_Config
);
rlc_BearerConfig
->
rlc_Config
=
rlc_Config
;
logicalChannelConfig
=
calloc
(
1
,
sizeof
(
NR_LogicalChannelConfig_t
));
logicalChannelConfig
->
ul_SpecificParameters
=
calloc
(
1
,
sizeof
(
*
logicalChannelConfig
->
ul_SpecificParameters
));
if
(
ss_rlc_BearerConfig
&&
ss_rlc_BearerConfig
->
mac_LogicalChannelConfig
&&
ss_rlc_BearerConfig
->
mac_LogicalChannelConfig
->
ul_SpecificParameters
){
logicalChannelConfig
->
ul_SpecificParameters
->
priority
=
ss_rlc_BearerConfig
->
mac_LogicalChannelConfig
->
ul_SpecificParameters
->
priority
;
logicalChannelConfig
->
ul_SpecificParameters
->
prioritisedBitRate
=
ss_rlc_BearerConfig
->
mac_LogicalChannelConfig
->
ul_SpecificParameters
->
prioritisedBitRate
;
}
else
{
logicalChannelConfig
->
ul_SpecificParameters
->
priority
=
(
rbIndex
==
1
)
?
1
:
3
;
logicalChannelConfig
->
ul_SpecificParameters
->
prioritisedBitRate
=
isSrb
?
(
NR_LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_infinity
)
:
(
NR_LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_kBps8
);
}
logicalChannelConfig
->
ul_SpecificParameters
->
bucketSizeDuration
=
isSrb
?
(
NR_LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration_ms5
)
:
(
NR_LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration_ms100
);
logicalChannelGroup
=
CALLOC
(
1
,
sizeof
(
long
));
*
logicalChannelGroup
=
isSrb
?
0
:
1
;
logicalChannelConfig
->
ul_SpecificParameters
->
logicalChannelGroup
=
logicalChannelGroup
;
logicalChannelConfig
->
ul_SpecificParameters
->
schedulingRequestID
=
CALLOC
(
1
,
sizeof
(
*
logicalChannelConfig
->
ul_SpecificParameters
->
schedulingRequestID
));
*
logicalChannelConfig
->
ul_SpecificParameters
->
schedulingRequestID
=
0
;
logicalChannelConfig
->
ul_SpecificParameters
->
logicalChannelSR_Mask
=
0
;
logicalChannelConfig
->
ul_SpecificParameters
->
logicalChannelSR_DelayTimerApplied
=
0
;
rlc_BearerConfig
->
mac_LogicalChannelConfig
=
logicalChannelConfig
;
}
void
fill_initial_SpCellConfig
(
int
uid
,
void
fill_initial_SpCellConfig
(
int
uid
,
NR_SpCellConfig_t
*
SpCellConfig
,
NR_SpCellConfig_t
*
SpCellConfig
,
NR_ServingCellConfigCommon_t
*
scc
,
NR_ServingCellConfigCommon_t
*
scc
,
...
@@ -1446,7 +1576,29 @@ void fill_initial_SpCellConfig(int uid,
...
@@ -1446,7 +1576,29 @@ void fill_initial_SpCellConfig(int uid,
}
}
void
fill_mastercellGroupConfig
(
NR_CellGroupConfig_t
*
cellGroupConfig
,
NR_CellGroupConfig_t
*
ue_context_mastercellGroup
)
{
void
fill_mastercellGroupConfig
(
NR_CellGroupConfig_t
*
cellGroupConfig
,
NR_CellGroupConfig_t
*
ue_context_mastercellGroup
,
const
int
CC_id
)
{
if
(
RC
.
ss
.
mode
>=
SS_SOFTMODEM
)
{
/* code not used here. Just keep it here for future checking*/
NR_RLC_BearerConfig_t
*
rlc_BearerConfig
=
NULL
;
NR_RLC_BearerConfig_t
*
ss_rlc_BearerConfig
=
NULL
;
cellGroupConfig
->
cellGroupId
=
0
;
cellGroupConfig
->
rlc_BearerToReleaseList
=
NULL
;
cellGroupConfig
->
rlc_BearerToAddModList
=
calloc
(
1
,
sizeof
(
*
cellGroupConfig
->
rlc_BearerToAddModList
));
for
(
int
rbIndex
=
2
;
rbIndex
<
MAX_NR_RBS
;
rbIndex
++
){
/*SRB2 DRB1 ... SS RLC_BearerConfig */
if
(
RC
.
NR_RB_Config
[
CC_id
][
rbIndex
].
isRBConfigValid
){
rlc_BearerConfig
=
calloc
(
1
,
sizeof
(
NR_RLC_BearerConfig_t
));
ss_rlc_BearerConfig
=
RC
.
NR_RB_Config
[
CC_id
][
rbIndex
].
RlcBearer
;
fill_rb_RLC_BearerConfig
(
rbIndex
,
rlc_BearerConfig
,
ss_rlc_BearerConfig
);
ASN_SEQUENCE_ADD
(
&
cellGroupConfig
->
rlc_BearerToAddModList
->
list
,
rlc_BearerConfig
);
ASN_SEQUENCE_ADD
(
&
ue_context_mastercellGroup
->
rlc_BearerToAddModList
->
list
,
rlc_BearerConfig
);
}
}
return
;
}
cellGroupConfig
->
cellGroupId
=
0
;
cellGroupConfig
->
cellGroupId
=
0
;
cellGroupConfig
->
rlc_BearerToReleaseList
=
NULL
;
cellGroupConfig
->
rlc_BearerToReleaseList
=
NULL
;
...
@@ -1563,7 +1715,8 @@ void update_cellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig,
...
@@ -1563,7 +1715,8 @@ void update_cellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig,
void
fill_initial_cellGroupConfig
(
int
uid
,
void
fill_initial_cellGroupConfig
(
int
uid
,
NR_CellGroupConfig_t
*
cellGroupConfig
,
NR_CellGroupConfig_t
*
cellGroupConfig
,
NR_ServingCellConfigCommon_t
*
scc
,
NR_ServingCellConfigCommon_t
*
scc
,
rrc_gNB_carrier_data_t
*
carrier
)
{
rrc_gNB_carrier_data_t
*
carrier
,
const
int
CC_id
)
{
NR_RLC_BearerConfig_t
*
rlc_BearerConfig
=
NULL
;
NR_RLC_BearerConfig_t
*
rlc_BearerConfig
=
NULL
;
NR_RLC_Config_t
*
rlc_Config
=
NULL
;
NR_RLC_Config_t
*
rlc_Config
=
NULL
;
...
@@ -1571,46 +1724,58 @@ void fill_initial_cellGroupConfig(int uid,
...
@@ -1571,46 +1724,58 @@ void fill_initial_cellGroupConfig(int uid,
NR_MAC_CellGroupConfig_t
*
mac_CellGroupConfig
=
NULL
;
NR_MAC_CellGroupConfig_t
*
mac_CellGroupConfig
=
NULL
;
NR_PhysicalCellGroupConfig_t
*
physicalCellGroupConfig
=
NULL
;
NR_PhysicalCellGroupConfig_t
*
physicalCellGroupConfig
=
NULL
;
long
*
logicalChannelGroup
=
NULL
;
long
*
logicalChannelGroup
=
NULL
;
cellGroupConfig
->
cellGroupId
=
0
;
cellGroupConfig
->
cellGroupId
=
0
;
if
(
RC
.
ss
.
mode
>=
SS_SOFTMODEM
)
{
/* Rlc Bearer Config */
NR_RLC_BearerConfig_t
*
ss_rlc_BearerConfig
=
NULL
;
/* TS38.331 9.2.1 Default SRB configurations */
/*SRB1 SS RLC_BearerConfig */
cellGroupConfig
->
rlc_BearerToAddModList
=
calloc
(
1
,
sizeof
(
*
cellGroupConfig
->
rlc_BearerToAddModList
));
int
rbIndex
=
1
;
rlc_BearerConfig
=
calloc
(
1
,
sizeof
(
NR_RLC_BearerConfig_t
));
if
(
RC
.
NR_RB_Config
[
CC_id
][
rbIndex
].
isRBConfigValid
){
rlc_BearerConfig
->
logicalChannelIdentity
=
1
;
cellGroupConfig
->
rlc_BearerToAddModList
=
calloc
(
1
,
sizeof
(
*
cellGroupConfig
->
rlc_BearerToAddModList
));
rlc_BearerConfig
->
servedRadioBearer
=
calloc
(
1
,
sizeof
(
*
rlc_BearerConfig
->
servedRadioBearer
));
rlc_BearerConfig
=
calloc
(
1
,
sizeof
(
NR_RLC_BearerConfig_t
));
rlc_BearerConfig
->
servedRadioBearer
->
present
=
NR_RLC_BearerConfig__servedRadioBearer_PR_srb_Identity
;
ss_rlc_BearerConfig
=
RC
.
NR_RB_Config
[
CC_id
][
rbIndex
].
RlcBearer
;
rlc_BearerConfig
->
servedRadioBearer
->
choice
.
srb_Identity
=
1
;
rlc_BearerConfig
->
reestablishRLC
=
NULL
;
fill_rb_RLC_BearerConfig
(
rbIndex
,
rlc_BearerConfig
,
ss_rlc_BearerConfig
);
rlc_Config
=
calloc
(
1
,
sizeof
(
NR_RLC_Config_t
));
ASN_SEQUENCE_ADD
(
&
cellGroupConfig
->
rlc_BearerToAddModList
->
list
,
rlc_BearerConfig
);
rlc_Config
->
present
=
NR_RLC_Config_PR_am
;
}
rlc_Config
->
choice
.
am
=
calloc
(
1
,
sizeof
(
*
rlc_Config
->
choice
.
am
));
}
else
{
rlc_Config
->
choice
.
am
->
dl_AM_RLC
.
sn_FieldLength
=
calloc
(
1
,
sizeof
(
NR_SN_FieldLengthAM_t
));
/* Rlc Bearer Config */
*
(
rlc_Config
->
choice
.
am
->
dl_AM_RLC
.
sn_FieldLength
)
=
NR_SN_FieldLengthAM_size12
;
/* TS38.331 9.2.1 Default SRB configurations */
rlc_Config
->
choice
.
am
->
dl_AM_RLC
.
t_Reassembly
=
NR_T_Reassembly_ms35
;
cellGroupConfig
->
rlc_BearerToAddModList
=
calloc
(
1
,
sizeof
(
*
cellGroupConfig
->
rlc_BearerToAddModList
));
rlc_Config
->
choice
.
am
->
dl_AM_RLC
.
t_StatusProhibit
=
NR_T_StatusProhibit_ms0
;
rlc_BearerConfig
=
calloc
(
1
,
sizeof
(
NR_RLC_BearerConfig_t
));
rlc_Config
->
choice
.
am
->
ul_AM_RLC
.
sn_FieldLength
=
calloc
(
1
,
sizeof
(
NR_SN_FieldLengthAM_t
));
rlc_BearerConfig
->
logicalChannelIdentity
=
1
;
*
(
rlc_Config
->
choice
.
am
->
ul_AM_RLC
.
sn_FieldLength
)
=
NR_SN_FieldLengthAM_size12
;
rlc_BearerConfig
->
servedRadioBearer
=
calloc
(
1
,
sizeof
(
*
rlc_BearerConfig
->
servedRadioBearer
));
rlc_Config
->
choice
.
am
->
ul_AM_RLC
.
t_PollRetransmit
=
NR_T_PollRetransmit_ms45
;
rlc_BearerConfig
->
servedRadioBearer
->
present
=
NR_RLC_BearerConfig__servedRadioBearer_PR_srb_Identity
;
rlc_Config
->
choice
.
am
->
ul_AM_RLC
.
pollPDU
=
NR_PollPDU_infinity
;
rlc_BearerConfig
->
servedRadioBearer
->
choice
.
srb_Identity
=
1
;
rlc_Config
->
choice
.
am
->
ul_AM_RLC
.
pollByte
=
NR_PollByte_infinity
;
rlc_BearerConfig
->
reestablishRLC
=
NULL
;
rlc_Config
->
choice
.
am
->
ul_AM_RLC
.
maxRetxThreshold
=
NR_UL_AM_RLC__maxRetxThreshold_t8
;
rlc_Config
=
calloc
(
1
,
sizeof
(
NR_RLC_Config_t
));
rlc_BearerConfig
->
rlc_Config
=
rlc_Config
;
rlc_Config
->
present
=
NR_RLC_Config_PR_am
;
logicalChannelConfig
=
calloc
(
1
,
sizeof
(
NR_LogicalChannelConfig_t
));
rlc_Config
->
choice
.
am
=
calloc
(
1
,
sizeof
(
*
rlc_Config
->
choice
.
am
));
logicalChannelConfig
->
ul_SpecificParameters
=
calloc
(
1
,
sizeof
(
*
logicalChannelConfig
->
ul_SpecificParameters
));
rlc_Config
->
choice
.
am
->
dl_AM_RLC
.
sn_FieldLength
=
calloc
(
1
,
sizeof
(
NR_SN_FieldLengthAM_t
));
logicalChannelConfig
->
ul_SpecificParameters
->
priority
=
1
;
*
(
rlc_Config
->
choice
.
am
->
dl_AM_RLC
.
sn_FieldLength
)
=
NR_SN_FieldLengthAM_size12
;
logicalChannelConfig
->
ul_SpecificParameters
->
prioritisedBitRate
=
NR_LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_infinity
;
rlc_Config
->
choice
.
am
->
dl_AM_RLC
.
t_Reassembly
=
NR_T_Reassembly_ms35
;
logicalChannelGroup
=
CALLOC
(
1
,
sizeof
(
long
));
rlc_Config
->
choice
.
am
->
dl_AM_RLC
.
t_StatusProhibit
=
NR_T_StatusProhibit_ms0
;
*
logicalChannelGroup
=
0
;
rlc_Config
->
choice
.
am
->
ul_AM_RLC
.
sn_FieldLength
=
calloc
(
1
,
sizeof
(
NR_SN_FieldLengthAM_t
));
logicalChannelConfig
->
ul_SpecificParameters
->
logicalChannelGroup
=
logicalChannelGroup
;
*
(
rlc_Config
->
choice
.
am
->
ul_AM_RLC
.
sn_FieldLength
)
=
NR_SN_FieldLengthAM_size12
;
logicalChannelConfig
->
ul_SpecificParameters
->
schedulingRequestID
=
CALLOC
(
1
,
sizeof
(
*
logicalChannelConfig
->
ul_SpecificParameters
->
schedulingRequestID
));
rlc_Config
->
choice
.
am
->
ul_AM_RLC
.
t_PollRetransmit
=
NR_T_PollRetransmit_ms45
;
*
logicalChannelConfig
->
ul_SpecificParameters
->
schedulingRequestID
=
0
;
rlc_Config
->
choice
.
am
->
ul_AM_RLC
.
pollPDU
=
NR_PollPDU_infinity
;
logicalChannelConfig
->
ul_SpecificParameters
->
logicalChannelSR_Mask
=
0
;
rlc_Config
->
choice
.
am
->
ul_AM_RLC
.
pollByte
=
NR_PollByte_infinity
;
logicalChannelConfig
->
ul_SpecificParameters
->
logicalChannelSR_DelayTimerApplied
=
0
;
rlc_Config
->
choice
.
am
->
ul_AM_RLC
.
maxRetxThreshold
=
NR_UL_AM_RLC__maxRetxThreshold_t8
;
rlc_BearerConfig
->
mac_LogicalChannelConfig
=
logicalChannelConfig
;
rlc_BearerConfig
->
rlc_Config
=
rlc_Config
;
ASN_SEQUENCE_ADD
(
&
cellGroupConfig
->
rlc_BearerToAddModList
->
list
,
rlc_BearerConfig
);
logicalChannelConfig
=
calloc
(
1
,
sizeof
(
NR_LogicalChannelConfig_t
));
logicalChannelConfig
->
ul_SpecificParameters
=
calloc
(
1
,
sizeof
(
*
logicalChannelConfig
->
ul_SpecificParameters
));
logicalChannelConfig
->
ul_SpecificParameters
->
priority
=
1
;
logicalChannelConfig
->
ul_SpecificParameters
->
prioritisedBitRate
=
NR_LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_infinity
;
logicalChannelGroup
=
CALLOC
(
1
,
sizeof
(
long
));
*
logicalChannelGroup
=
0
;
logicalChannelConfig
->
ul_SpecificParameters
->
logicalChannelGroup
=
logicalChannelGroup
;
logicalChannelConfig
->
ul_SpecificParameters
->
schedulingRequestID
=
CALLOC
(
1
,
sizeof
(
*
logicalChannelConfig
->
ul_SpecificParameters
->
schedulingRequestID
));
*
logicalChannelConfig
->
ul_SpecificParameters
->
schedulingRequestID
=
0
;
logicalChannelConfig
->
ul_SpecificParameters
->
logicalChannelSR_Mask
=
0
;
logicalChannelConfig
->
ul_SpecificParameters
->
logicalChannelSR_DelayTimerApplied
=
0
;
rlc_BearerConfig
->
mac_LogicalChannelConfig
=
logicalChannelConfig
;
ASN_SEQUENCE_ADD
(
&
cellGroupConfig
->
rlc_BearerToAddModList
->
list
,
rlc_BearerConfig
);
}
cellGroupConfig
->
rlc_BearerToReleaseList
=
NULL
;
cellGroupConfig
->
rlc_BearerToReleaseList
=
NULL
;
/* mac CellGroup Config */
/* mac CellGroup Config */
...
@@ -1660,13 +1825,41 @@ void fill_initial_cellGroupConfig(int uid,
...
@@ -1660,13 +1825,41 @@ void fill_initial_cellGroupConfig(int uid,
cellGroupConfig
->
sCellToReleaseList
=
NULL
;
cellGroupConfig
->
sCellToReleaseList
=
NULL
;
}
}
bool
update_rrcReconfig_cellGroupConfig
(
const
protocol_ctxt_t
*
const
ctxt_pP
,
rrc_gNB_ue_context_t
*
ue_context_pP
,
NR_CellGroupConfig_t
*
cellGroupConfig
)
{
int
CC_id
=
ue_context_pP
->
ue_context
.
primaryCC_id
;
bool
update_flag
=
false
;
if
(
RC
.
ss
.
mode
<
SS_SOFTMODEM
){
return
update_flag
;
}
if
(
cellGroupConfig
&&
cellGroupConfig
->
rlc_BearerToAddModList
){
for
(
int
i
=
0
;
i
<
cellGroupConfig
->
rlc_BearerToAddModList
->
list
.
count
;
i
++
){
NR_RLC_BearerConfig_t
*
rlc_BearerConfig
=
cellGroupConfig
->
rlc_BearerToAddModList
->
list
.
array
[
i
];
/* only check rlc_config as it is missing from TTCN */
if
(
!
rlc_BearerConfig
->
rlc_Config
&&
rlc_BearerConfig
->
servedRadioBearer
){
int
rbIndex
=
(
rlc_BearerConfig
->
servedRadioBearer
->
present
==
NR_RLC_BearerConfig__servedRadioBearer_PR_srb_Identity
)
?
rlc_BearerConfig
->
servedRadioBearer
->
choice
.
srb_Identity
:
(
rlc_BearerConfig
->
servedRadioBearer
->
choice
.
drb_Identity
+
2
);
if
(
RC
.
NR_RB_Config
[
CC_id
][
rbIndex
].
isRBConfigValid
&&
RC
.
NR_RB_Config
[
CC_id
][
rbIndex
].
RlcBearer
){
rlc_BearerConfig
->
rlc_Config
=
fill_rb_rlc_config
(
RC
.
NR_RB_Config
[
CC_id
][
rbIndex
].
RlcBearer
->
rlc_Config
);
update_flag
=
true
;
}
}
}
}
return
update_flag
;
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
uint8_t
do_RRCSetup
(
rrc_gNB_ue_context_t
*
const
ue_context_pP
,
uint8_t
do_RRCSetup
(
rrc_gNB_ue_context_t
*
const
ue_context_pP
,
uint8_t
*
const
buffer
,
uint8_t
*
const
buffer
,
const
uint8_t
transaction_id
,
const
uint8_t
transaction_id
,
OCTET_STRING_t
*
masterCellGroup_from_DU
,
OCTET_STRING_t
*
masterCellGroup_from_DU
,
NR_ServingCellConfigCommon_t
*
scc
,
NR_ServingCellConfigCommon_t
*
scc
,
rrc_gNB_carrier_data_t
*
carrier
)
rrc_gNB_carrier_data_t
*
carrier
,
const
int
CC_id
)
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
{
{
asn_enc_rval_t
enc_rval
;
asn_enc_rval_t
enc_rval
;
...
@@ -1682,33 +1875,29 @@ uint8_t do_RRCSetup(rrc_gNB_ue_context_t *const ue_context_pP,
...
@@ -1682,33 +1875,29 @@ uint8_t do_RRCSetup(rrc_gNB_ue_context_t *const ue_context_pP,
gNB_RRC_UE_t
*
ue_p
=
&
ue_context_pP
->
ue_context
;
gNB_RRC_UE_t
*
ue_p
=
&
ue_context_pP
->
ue_context
;
NR_SRB_ToAddModList_t
**
SRB_configList
=
&
ue_p
->
SRB_configList
;
NR_SRB_ToAddModList_t
**
SRB_configList
=
&
ue_p
->
SRB_configList
;
memset
((
void
*
)
&
dl_ccch_msg
,
0
,
sizeof
(
NR_DL_CCCH_Message_t
));
memset
((
void
*
)
&
dl_ccch_msg
,
0
,
sizeof
(
NR_DL_CCCH_Message_t
));
dl_ccch_msg
.
message
.
present
=
NR_DL_CCCH_MessageType_PR_c1
;
dl_ccch_msg
.
message
.
present
=
NR_DL_CCCH_MessageType_PR_c1
;
dl_ccch_msg
.
message
.
choice
.
c1
=
CALLOC
(
1
,
sizeof
(
struct
NR_DL_CCCH_MessageType__c1
));
dl_ccch_msg
.
message
.
choice
.
c1
=
CALLOC
(
1
,
sizeof
(
struct
NR_DL_CCCH_MessageType__c1
));
dl_ccch_msg
.
message
.
choice
.
c1
->
present
=
NR_DL_CCCH_MessageType__c1_PR_rrcSetup
;
dl_ccch_msg
.
message
.
choice
.
c1
->
present
=
NR_DL_CCCH_MessageType__c1_PR_rrcSetup
;
dl_ccch_msg
.
message
.
choice
.
c1
->
choice
.
rrcSetup
=
calloc
(
1
,
sizeof
(
NR_RRCSetup_t
));
dl_ccch_msg
.
message
.
choice
.
c1
->
choice
.
rrcSetup
=
CALLOC
(
1
,
sizeof
(
NR_RRCSetup_t
));
rrcSetup
=
dl_ccch_msg
.
message
.
choice
.
c1
->
choice
.
rrcSetup
;
rrcSetup
=
dl_ccch_msg
.
message
.
choice
.
c1
->
choice
.
rrcSetup
;
rrcSetup
->
criticalExtensions
.
present
=
NR_RRCSetup__criticalExtensions_PR_rrcSetup
;
rrcSetup
->
criticalExtensions
.
present
=
NR_RRCSetup__criticalExtensions_PR_rrcSetup
;
rrcSetup
->
rrc_TransactionIdentifier
=
transaction_id
;
rrcSetup
->
rrc_TransactionIdentifier
=
transaction_id
;
rrcSetup
->
criticalExtensions
.
choice
.
rrcSetup
=
calloc
(
1
,
sizeof
(
NR_RRCSetup_IEs_t
));
rrcSetup
->
criticalExtensions
.
choice
.
rrcSetup
=
CALLOC
(
1
,
sizeof
(
NR_RRCSetup_IEs_t
));
ie
=
rrcSetup
->
criticalExtensions
.
choice
.
rrcSetup
;
ie
=
rrcSetup
->
criticalExtensions
.
choice
.
rrcSetup
;
/****************************** radioBearerConfig ******************************/
/****************************** radioBearerConfig ******************************/
/* Configure SRB1 */
/* Configure SRB1 */
if
(
*
SRB_configList
)
{
if
(
*
SRB_configList
){
free
(
*
SRB_configList
);
ASN_STRUCT_FREE
(
asn_DEF_NR_SRB_ToAddModList
,
*
SRB_configList
);
*
SRB_configList
=
NULL
;
}
}
*
SRB_configList
=
calloc
(
1
,
sizeof
(
NR_SRB_ToAddModList_t
));
*
SRB_configList
=
CALLOC
(
1
,
sizeof
(
NR_SRB_ToAddModList_t
));
// SRB1
SRB1_config
=
CALLOC
(
1
,
sizeof
(
NR_SRB_ToAddMod_t
));
/* TODO */
SRB1_config
=
calloc
(
1
,
sizeof
(
NR_SRB_ToAddMod_t
));
SRB1_config
->
srb_Identity
=
1
;
SRB1_config
->
srb_Identity
=
1
;
// pdcp_Config->t_Reordering
SRB1_config
->
pdcp_Config
=
pdcp_Config
;
SRB1_config
->
pdcp_Config
=
pdcp_Config
;
ie
->
radioBearerConfig
.
srb_ToAddModList
=
*
SRB_configList
;
ie
->
radioBearerConfig
.
srb_ToAddModList
=
*
SRB_configList
;
ASN_SEQUENCE_ADD
(
&
(
*
SRB_configList
)
->
list
,
SRB1_config
);
ASN_SEQUENCE_ADD
(
&
(
*
SRB_configList
)
->
list
,
SRB1_config
);
...
@@ -1732,9 +1921,12 @@ uint8_t do_RRCSetup(rrc_gNB_ue_context_t *const ue_context_pP,
...
@@ -1732,9 +1921,12 @@ uint8_t do_RRCSetup(rrc_gNB_ue_context_t *const ue_context_pP,
xer_fprint
(
stdout
,
&
asn_DEF_NR_CellGroupConfig
,
(
const
void
*
)
cellGroupConfig
);
xer_fprint
(
stdout
,
&
asn_DEF_NR_CellGroupConfig
,
(
const
void
*
)
cellGroupConfig
);
}
}
else
{
else
{
cellGroupConfig
=
calloc
(
1
,
sizeof
(
NR_CellGroupConfig_t
));
cellGroupConfig
=
CALLOC
(
1
,
sizeof
(
NR_CellGroupConfig_t
));
fill_initial_cellGroupConfig
(
ue_context_pP
->
local_uid
,
cellGroupConfig
,
scc
,
carrier
);
fill_initial_cellGroupConfig
(
ue_context_pP
->
local_uid
,
cellGroupConfig
,
scc
,
carrier
,
CC_id
);
if
(
LOG_DEBUGFLAG
(
DEBUG_ASN1
)
)
{
xer_fprint
(
stdout
,
&
asn_DEF_NR_CellGroupConfig
,
(
const
void
*
)
cellGroupConfig
);
}
enc_rval
=
uper_encode_to_buffer
(
&
asn_DEF_NR_CellGroupConfig
,
enc_rval
=
uper_encode_to_buffer
(
&
asn_DEF_NR_CellGroupConfig
,
NULL
,
NULL
,
(
void
*
)
cellGroupConfig
,
(
void
*
)
cellGroupConfig
,
...
@@ -1753,6 +1945,10 @@ uint8_t do_RRCSetup(rrc_gNB_ue_context_t *const ue_context_pP,
...
@@ -1753,6 +1945,10 @@ uint8_t do_RRCSetup(rrc_gNB_ue_context_t *const ue_context_pP,
}
}
}
}
if
(
ue_p
->
masterCellGroup
)
{
ASN_STRUCT_FREE
(
asn_DEF_NR_CellGroupConfig
,
ue_p
->
masterCellGroup
);
ue_p
->
masterCellGroup
=
NULL
;
}
ue_p
->
masterCellGroup
=
cellGroupConfig
;
ue_p
->
masterCellGroup
=
cellGroupConfig
;
if
(
LOG_DEBUGFLAG
(
DEBUG_ASN1
)
)
{
if
(
LOG_DEBUGFLAG
(
DEBUG_ASN1
)
)
{
...
@@ -1764,6 +1960,11 @@ uint8_t do_RRCSetup(rrc_gNB_ue_context_t *const ue_context_pP,
...
@@ -1764,6 +1960,11 @@ uint8_t do_RRCSetup(rrc_gNB_ue_context_t *const ue_context_pP,
buffer
,
buffer
,
1000
);
1000
);
LOG_P
(
OAILOG_DEBUG
,
"DL_CCCH_Message"
,
buffer
,
1000
);
LOG_P
(
OAILOG_DEBUG
,
"DL_CCCH_Message"
,
buffer
,
1000
);
//free content of dl_ccch_msg
ie
->
radioBearerConfig
.
srb_ToAddModList
=
NULL
;
//ue_p->SRB_configList still keep allocated
ASN_STRUCT_FREE_CONTENTS_ONLY
(
asn_DEF_NR_DL_CCCH_Message
,
&
dl_ccch_msg
);
if
(
enc_rval
.
encoded
==
-
1
)
{
if
(
enc_rval
.
encoded
==
-
1
)
{
LOG_E
(
NR_RRC
,
"[gNB AssertFatal]ASN1 message encoding failed (%s, %lu)!
\n
"
,
LOG_E
(
NR_RRC
,
"[gNB AssertFatal]ASN1 message encoding failed (%s, %lu)!
\n
"
,
enc_rval
.
failed_type
->
name
,
enc_rval
.
encoded
);
enc_rval
.
failed_type
->
name
,
enc_rval
.
encoded
);
...
@@ -2045,7 +2246,9 @@ int16_t do_RRCReconfiguration(
...
@@ -2045,7 +2246,9 @@ int16_t do_RRCReconfiguration(
enc_rval
.
failed_type
->
name
,
enc_rval
.
encoded
);
enc_rval
.
failed_type
->
name
,
enc_rval
.
encoded
);
return
-
1
;
return
-
1
;
}
}
xer_fprint
(
stdout
,
&
asn_DEF_NR_CellGroupConfig
,
(
const
void
*
)
cellGroupConfig
);
if
(
LOG_DEBUGFLAG
(
DEBUG_ASN1
)
)
{
xer_fprint
(
stdout
,
&
asn_DEF_NR_CellGroupConfig
,
(
const
void
*
)
cellGroupConfig
);
}
ie
->
nonCriticalExtension
->
masterCellGroup
=
calloc
(
1
,
sizeof
(
OCTET_STRING_t
));
ie
->
nonCriticalExtension
->
masterCellGroup
=
calloc
(
1
,
sizeof
(
OCTET_STRING_t
));
ie
->
nonCriticalExtension
->
masterCellGroup
->
buf
=
masterCellGroup_buf
;
ie
->
nonCriticalExtension
->
masterCellGroup
->
buf
=
masterCellGroup_buf
;
...
@@ -2054,9 +2257,9 @@ int16_t do_RRCReconfiguration(
...
@@ -2054,9 +2257,9 @@ int16_t do_RRCReconfiguration(
dl_dcch_msg
.
message
.
choice
.
c1
->
choice
.
rrcReconfiguration
->
criticalExtensions
.
choice
.
rrcReconfiguration
=
ie
;
dl_dcch_msg
.
message
.
choice
.
c1
->
choice
.
rrcReconfiguration
->
criticalExtensions
.
choice
.
rrcReconfiguration
=
ie
;
//
if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
if
(
LOG_DEBUGFLAG
(
DEBUG_ASN1
)
)
{
xer_fprint
(
stdout
,
&
asn_DEF_NR_DL_DCCH_Message
,
(
void
*
)
&
dl_dcch_msg
);
xer_fprint
(
stdout
,
&
asn_DEF_NR_DL_DCCH_Message
,
(
void
*
)
&
dl_dcch_msg
);
//
}
}
enc_rval
=
uper_encode_to_buffer
(
&
asn_DEF_NR_DL_DCCH_Message
,
enc_rval
=
uper_encode_to_buffer
(
&
asn_DEF_NR_DL_DCCH_Message
,
NULL
,
NULL
,
...
@@ -2064,6 +2267,26 @@ int16_t do_RRCReconfiguration(
...
@@ -2064,6 +2267,26 @@ int16_t do_RRCReconfiguration(
buffer
,
buffer
,
buffer_size
);
buffer_size
);
{
//Free content of dl_dcch_msg
if
(
ie
->
radioBearerConfig
){
ie
->
radioBearerConfig
->
srb_ToAddModList
=
NULL
;
ie
->
radioBearerConfig
->
drb_ToAddModList
=
NULL
;
ie
->
radioBearerConfig
->
securityConfig
=
NULL
;
ie
->
radioBearerConfig
->
srb3_ToRelease
=
NULL
;
ie
->
radioBearerConfig
->
drb_ToReleaseList
=
NULL
;
}
ie
->
measConfig
=
NULL
;
if
(
ie
->
nonCriticalExtension
){
ie
->
nonCriticalExtension
->
dedicatedNAS_MessageList
=
NULL
;
if
(
ie
->
nonCriticalExtension
->
masterCellGroup
){
ie
->
nonCriticalExtension
->
masterCellGroup
->
buf
=
NULL
;
ie
->
nonCriticalExtension
->
masterCellGroup
->
size
=
0
;
}
}
ASN_STRUCT_FREE_CONTENTS_ONLY
(
asn_DEF_NR_DL_DCCH_Message
,
&
dl_dcch_msg
);
}
if
(
enc_rval
.
encoded
==
-
1
)
{
if
(
enc_rval
.
encoded
==
-
1
)
{
LOG_I
(
NR_RRC
,
"[gNB AssertFatal]ASN1 message encoding failed (%s, %lu)!
\n
"
,
LOG_I
(
NR_RRC
,
"[gNB AssertFatal]ASN1 message encoding failed (%s, %lu)!
\n
"
,
enc_rval
.
failed_type
->
name
,
enc_rval
.
encoded
);
enc_rval
.
failed_type
->
name
,
enc_rval
.
encoded
);
...
...
openair2/RRC/NR/MESSAGES/asn1_msg.h
View file @
b9b82998
...
@@ -108,20 +108,26 @@ void fill_initial_SpCellConfig(int uid,
...
@@ -108,20 +108,26 @@ void fill_initial_SpCellConfig(int uid,
void
fill_initial_cellGroupConfig
(
int
uid
,
void
fill_initial_cellGroupConfig
(
int
uid
,
NR_CellGroupConfig_t
*
cellGroupConfig
,
NR_CellGroupConfig_t
*
cellGroupConfig
,
NR_ServingCellConfigCommon_t
*
scc
,
NR_ServingCellConfigCommon_t
*
scc
,
rrc_gNB_carrier_data_t
*
carrier
);
rrc_gNB_carrier_data_t
*
carrier
,
const
int
CC_id
);
void
update_cellGroupConfig
(
NR_CellGroupConfig_t
*
cellGroupConfig
,
void
update_cellGroupConfig
(
NR_CellGroupConfig_t
*
cellGroupConfig
,
rrc_gNB_carrier_data_t
*
carrier
,
rrc_gNB_carrier_data_t
*
carrier
,
NR_UE_NR_Capability_t
*
uecap
);
NR_UE_NR_Capability_t
*
uecap
);
void
fill_mastercellGroupConfig
(
NR_CellGroupConfig_t
*
cellGroupConfig
,
NR_CellGroupConfig_t
*
ue_context_mastercellGroup
);
void
fill_mastercellGroupConfig
(
NR_CellGroupConfig_t
*
cellGroupConfig
,
NR_CellGroupConfig_t
*
ue_context_mastercellGroup
,
const
int
CC_id
);
bool
update_rrcReconfig_cellGroupConfig
(
const
protocol_ctxt_t
*
const
ctxt_pP
,
rrc_gNB_ue_context_t
*
ue_context_pP
,
NR_CellGroupConfig_t
*
cellGroupConfig
);
uint8_t
do_RRCSetup
(
rrc_gNB_ue_context_t
*
const
ue_context_pP
,
uint8_t
do_RRCSetup
(
rrc_gNB_ue_context_t
*
const
ue_context_pP
,
uint8_t
*
const
buffer
,
uint8_t
*
const
buffer
,
const
uint8_t
transaction_id
,
const
uint8_t
transaction_id
,
OCTET_STRING_t
*
masterCellGroup_from_DU
,
OCTET_STRING_t
*
masterCellGroup_from_DU
,
NR_ServingCellConfigCommon_t
*
scc
,
NR_ServingCellConfigCommon_t
*
scc
,
rrc_gNB_carrier_data_t
*
carrier
);
rrc_gNB_carrier_data_t
*
carrier
,
const
int
CC_id
);
uint8_t
do_NR_SecurityModeCommand
(
uint8_t
do_NR_SecurityModeCommand
(
const
protocol_ctxt_t
*
const
ctxt_pP
,
const
protocol_ctxt_t
*
const
ctxt_pP
,
...
...
openair2/RRC/NR/rrc_gNB.c
View file @
b9b82998
...
@@ -236,6 +236,55 @@ char openair_rrc_gNB_configuration(const module_id_t gnb_mod_idP, gNB_RrcConfigu
...
@@ -236,6 +236,55 @@ char openair_rrc_gNB_configuration(const module_id_t gnb_mod_idP, gNB_RrcConfigu
return
0
;
return
0
;
}
//END openair_rrc_gNB_configuration
}
//END openair_rrc_gNB_configuration
char
rrc_gNB_rblist_configuration
(
const
module_id_t
gnb_mod_idP
,
NRRrcRblistCfgReq
*
RblistConfig
)
{
int
CC_id
=
RblistConfig
->
cell_index
;
LOG_A
(
NR_RRC
,
"Inside rrc_gNB_rblist_configuration, CC_id: %d
\n
"
,
CC_id
);
AssertFatal
(
RblistConfig
!=
NULL
,
"RB list configuration input is null
\n
"
);
AssertFatal
(
RblistConfig
->
rb_count
<=
MAX_NR_RBS
,
"RB Count exceed the Max RBs Supported"
);
for
(
int
i
=
0
;
i
<
RblistConfig
->
rb_count
;
i
++
)
{
LOG_A
(
NR_RRC
,
"%s config RB Id:%d
\n
"
,
__FUNCTION__
,
RblistConfig
->
rb_list
[
i
].
RbId
);
int
rbIndex
=
RblistConfig
->
rb_list
[
i
].
RbId
;
/*RB ID is used as a unique index in RB Array inside RC*/
AssertFatal
(
rbIndex
<=
MAX_NR_RBS
,
"RB Index exceed the Max RBs Supported"
);
NRRBConfig
*
rb_config
=&
RC
.
NR_RB_Config
[
CC_id
][
rbIndex
];
if
(
rb_config
->
isRBConfigValid
){
//Free old RBConfig storage
if
(
rb_config
->
Sdap
){
ASN_STRUCT_FREE
(
asn_DEF_NR_SDAP_Config
,
rb_config
->
Sdap
);
rb_config
->
Sdap
=
NULL
;
}
if
(
rb_config
->
Pdcp
){
ASN_STRUCT_FREE
(
asn_DEF_NR_PDCP_Config
,
rb_config
->
Pdcp
);
rb_config
->
Pdcp
=
NULL
;
}
if
(
rb_config
->
pdcpTransparentSN_Size
){
FREEMEM
(
rb_config
->
pdcpTransparentSN_Size
);
rb_config
->
pdcpTransparentSN_Size
=
NULL
;
}
if
(
rb_config
->
RlcBearer
){
ASN_STRUCT_FREE
(
asn_DEF_NR_RLC_BearerConfig
,
rb_config
->
RlcBearer
);
rb_config
->
RlcBearer
=
NULL
;
}
if
(
rb_config
->
DiscardULData
){
FREEMEM
(
rb_config
->
DiscardULData
);
rb_config
->
DiscardULData
=
NULL
;
}
rb_config
->
isRBConfigValid
=
false
;
}
rb_config
->
Sdap
=
RblistConfig
->
rb_list
[
i
].
RbConfig
.
Sdap
;
rb_config
->
Pdcp
=
RblistConfig
->
rb_list
[
i
].
RbConfig
.
Pdcp
;
rb_config
->
pdcpTransparentSN_Size
=
RblistConfig
->
rb_list
[
i
].
RbConfig
.
pdcpTransparentSN_Size
;
rb_config
->
RlcBearer
=
RblistConfig
->
rb_list
[
i
].
RbConfig
.
RlcBearer
;
rb_config
->
DiscardULData
=
RblistConfig
->
rb_list
[
i
].
RbConfig
.
DiscardULData
;
rb_config
->
isRBConfigValid
=
TRUE
;
}
return
0
;
}
void
rrc_gNB_process_AdditionRequestInformation
(
const
module_id_t
gnb_mod_idP
,
x2ap_ENDC_sgnb_addition_req_t
*
m
)
{
void
rrc_gNB_process_AdditionRequestInformation
(
const
module_id_t
gnb_mod_idP
,
x2ap_ENDC_sgnb_addition_req_t
*
m
)
{
struct
NR_CG_ConfigInfo
*
cg_configinfo
=
NULL
;
struct
NR_CG_ConfigInfo
*
cg_configinfo
=
NULL
;
...
@@ -345,7 +394,8 @@ rrc_gNB_generate_RRCSetup(
...
@@ -345,7 +394,8 @@ rrc_gNB_generate_RRCSetup(
(
uint8_t
*
)
ue_p
->
Srb0
.
Tx_buffer
.
Payload
,
(
uint8_t
*
)
ue_p
->
Srb0
.
Tx_buffer
.
Payload
,
0
/*rrc_gNB_get_next_transaction_identifier(ctxt_pP->module_id)*/
,
0
/*rrc_gNB_get_next_transaction_identifier(ctxt_pP->module_id)*/
,
masterCellGroup_from_DU
,
masterCellGroup_from_DU
,
scc
,
&
rrc
->
carrier
);
scc
,
&
rrc
->
carrier
,
CC_id
);
LOG_DUMPMSG
(
NR_RRC
,
DEBUG_RRC
,
LOG_DUMPMSG
(
NR_RRC
,
DEBUG_RRC
,
(
char
*
)(
ue_p
->
Srb0
.
Tx_buffer
.
Payload
),
(
char
*
)(
ue_p
->
Srb0
.
Tx_buffer
.
Payload
),
...
@@ -455,7 +505,8 @@ rrc_gNB_generate_RRCSetup_for_RRCReestablishmentRequest(
...
@@ -455,7 +505,8 @@ rrc_gNB_generate_RRCSetup_for_RRCReestablishmentRequest(
(
uint8_t
*
)
ue_p
->
Srb0
.
Tx_buffer
.
Payload
,
(
uint8_t
*
)
ue_p
->
Srb0
.
Tx_buffer
.
Payload
,
rrc_gNB_get_next_transaction_identifier
(
ctxt_pP
->
module_id
),
rrc_gNB_get_next_transaction_identifier
(
ctxt_pP
->
module_id
),
NULL
,
NULL
,
scc
,
&
rrc_instance_p
->
carrier
);
scc
,
&
rrc_instance_p
->
carrier
,
CC_id
);
LOG_DUMPMSG
(
NR_RRC
,
DEBUG_RRC
,
LOG_DUMPMSG
(
NR_RRC
,
DEBUG_RRC
,
(
char
*
)(
ue_p
->
Srb0
.
Tx_buffer
.
Payload
),
(
char
*
)(
ue_p
->
Srb0
.
Tx_buffer
.
Payload
),
...
@@ -716,7 +767,7 @@ rrc_gNB_generate_defaultRRCReconfiguration(
...
@@ -716,7 +767,7 @@ rrc_gNB_generate_defaultRRCReconfiguration(
gNB_RRC_UE_t
*
ue_p
=
&
ue_context_pP
->
ue_context
;
gNB_RRC_UE_t
*
ue_p
=
&
ue_context_pP
->
ue_context
;
memset
(
buffer
,
0
,
sizeof
(
buffer
));
memset
(
buffer
,
0
,
sizeof
(
buffer
));
cellGroupConfig
=
calloc
(
1
,
sizeof
(
NR_CellGroupConfig_t
));
cellGroupConfig
=
calloc
(
1
,
sizeof
(
NR_CellGroupConfig_t
));
fill_mastercellGroupConfig
(
cellGroupConfig
,
ue_p
->
masterCellGroup
);
fill_mastercellGroupConfig
(
cellGroupConfig
,
ue_p
->
masterCellGroup
,
0
);
size
=
do_RRCReconfiguration
(
ctxt_pP
,
buffer
,
sizeof
(
buffer
),
size
=
do_RRCReconfiguration
(
ctxt_pP
,
buffer
,
sizeof
(
buffer
),
xid
,
xid
,
*
SRB_configList2
,
*
SRB_configList2
,
...
@@ -808,6 +859,116 @@ rrc_gNB_generate_defaultRRCReconfiguration(
...
@@ -808,6 +859,116 @@ rrc_gNB_generate_defaultRRCReconfiguration(
}
}
}
}
//-----------------------------------------------------------------------------
/*
* store rrcReconfiguration config in UE context
*/
void
rrc_gNB_store_RRCReconfiguration
(
const
protocol_ctxt_t
*
const
ctxt_pP
,
rrc_gNB_ue_context_t
*
ue_context_pP
,
NR_RRCReconfiguration_t
*
rrcReconfiguration
)
//-----------------------------------------------------------------------------
{
NR_SRB_ToAddModList_t
**
srb2addList
=
NULL
;
NR_DRB_ToAddModList_t
**
drb2addList
=
NULL
;
NR_DRB_ToAddModList_t
**
drb2releaseList
=
NULL
;
NR_CellGroupConfig_t
*
cellGroupConfig
=
NULL
;
long
xid
;
AssertFatal
(
rrcReconfiguration
!=
NULL
,
"%s rrcReconfiguration is NULL
\n
"
,
__FUNCTION__
);
xid
=
rrcReconfiguration
->
rrc_TransactionIdentifier
;
LOG_D
(
NR_RRC
,
"rrc_gNB_store_RRCReconfiguration for transaction %ld
\n
"
,
xid
);
srb2addList
=
&
ue_context_pP
->
ue_context
.
SRB_configList2
[
xid
];
drb2addList
=
&
ue_context_pP
->
ue_context
.
DRB_configList2
[
xid
];
drb2releaseList
=
&
ue_context_pP
->
ue_context
.
DRB_Release_configList2
[
xid
];
if
(
*
srb2addList
){
LOG_D
(
NR_RRC
,
"%s free old SRB_configList2
\n
"
,
__FUNCTION__
);
ASN_STRUCT_FREE
(
asn_DEF_NR_SRB_ToAddModList
,
*
srb2addList
);
*
srb2addList
=
NULL
;
}
if
(
*
drb2addList
){
LOG_D
(
NR_RRC
,
"%s free old DRB_configList2
\n
"
,
__FUNCTION__
);
ASN_STRUCT_FREE
(
asn_DEF_NR_DRB_ToAddModList
,
*
drb2addList
);
*
drb2addList
=
NULL
;
}
if
(
*
drb2releaseList
){
LOG_D
(
NR_RRC
,
"%s free old DRB_Release_configList2
\n
"
,
__FUNCTION__
);
ASN_STRUCT_FREE
(
asn_DEF_NR_DRB_ToAddModList
,
*
drb2releaseList
);
*
drb2releaseList
=
NULL
;
}
if
(
rrcReconfiguration
->
criticalExtensions
.
present
==
NR_RRCReconfiguration__criticalExtensions_PR_rrcReconfiguration
&&
rrcReconfiguration
->
criticalExtensions
.
choice
.
rrcReconfiguration
){
NR_RRCReconfiguration_IEs_t
*
ie
=
rrcReconfiguration
->
criticalExtensions
.
choice
.
rrcReconfiguration
;
if
(
ie
->
radioBearerConfig
){
if
(
ie
->
radioBearerConfig
->
srb_ToAddModList
){
LOG_D
(
NR_RRC
,
"%s store srb_ToAddModList
\n
"
,
__FUNCTION__
);
*
srb2addList
=
ie
->
radioBearerConfig
->
srb_ToAddModList
;
ie
->
radioBearerConfig
->
srb_ToAddModList
=
NULL
;
/* to avoid the content be released externally */
}
if
(
ie
->
radioBearerConfig
->
drb_ToAddModList
){
LOG_D
(
NR_RRC
,
"%s store drb_ToAddModList
\n
"
,
__FUNCTION__
);
*
drb2addList
=
ie
->
radioBearerConfig
->
drb_ToAddModList
;
ie
->
radioBearerConfig
->
drb_ToAddModList
=
NULL
;
/* to avoid the content be released externally*/
}
if
(
ie
->
radioBearerConfig
->
drb_ToReleaseList
){
LOG_D
(
NR_RRC
,
"%s store drb_ToReleaseList
\n
"
,
__FUNCTION__
);
*
drb2releaseList
=
ie
->
radioBearerConfig
->
drb_ToReleaseList
;
ie
->
radioBearerConfig
->
drb_ToReleaseList
=
NULL
;
/* to avoid the content be released externally*/
}
}
if
(
ie
->
nonCriticalExtension
){
if
(
ie
->
nonCriticalExtension
->
masterCellGroup
){
uper_decode
(
NULL
,
&
asn_DEF_NR_CellGroupConfig
,
(
void
**
)
&
cellGroupConfig
,
(
uint8_t
*
)
ie
->
nonCriticalExtension
->
masterCellGroup
->
buf
,
ie
->
nonCriticalExtension
->
masterCellGroup
->
size
,
0
,
0
);
if
(
LOG_DEBUGFLAG
(
DEBUG_ASN1
)
)
{
xer_fprint
(
stdout
,
&
asn_DEF_NR_CellGroupConfig
,
(
const
void
*
)
cellGroupConfig
);
}
if
(
cellGroupConfig
){
#if 1
NR_CellGroupConfig_t
*
masterCellGroup
=
ue_context_pP
->
ue_context
.
masterCellGroup
;
if
(
masterCellGroup
&&
cellGroupConfig
->
rlc_BearerToAddModList
){
/* we only care the added Bearer configuration here */
int
count
=
cellGroupConfig
->
rlc_BearerToAddModList
->
list
.
count
;
if
(
count
&&
masterCellGroup
->
rlc_BearerToAddModList
==
NULL
){
/* code would not get here */
masterCellGroup
->
rlc_BearerToAddModList
=
CALLOC
(
1
,
sizeof
(
struct
NR_CellGroupConfig__rlc_BearerToAddModList
));
}
LOG_D
(
NR_RRC
,
"%s add rlc_BearerConfig into UE masterCellGroup
\n
"
,
__FUNCTION__
);
for
(
int
i
=
0
;
i
<
count
;
i
++
){
ASN_SEQUENCE_ADD
(
&
masterCellGroup
->
rlc_BearerToAddModList
->
list
,
cellGroupConfig
->
rlc_BearerToAddModList
->
list
.
array
[
i
]);
}
if
(
LOG_DEBUGFLAG
(
DEBUG_ASN1
)
)
{
xer_fprint
(
stdout
,
&
asn_DEF_NR_CellGroupConfig
,
(
const
void
*
)
masterCellGroup
);
}
cellGroupConfig
->
rlc_BearerToAddModList
->
list
.
free
=
NULL
;
/*not free item pointer as it already added to another list */
asn_sequence_empty
(
&
cellGroupConfig
->
rlc_BearerToAddModList
->
list
);
}
ASN_STRUCT_FREE
(
asn_DEF_NR_CellGroupConfig
,
cellGroupConfig
);
#else
if
(
ue_context_pP
->
ue_context
.
masterCellGroup
){
/* There is issue to free masterCellGroup content here. */
ASN_STRUCT_FREE
(
asn_DEF_NR_CellGroupConfig
,
ue_context_pP
->
ue_context
.
masterCellGroup
);
}
LOG_D
(
NR_RRC
,
"%s store cellGroupConfig
\n
"
,
__FUNCTION__
);
ue_context_pP
->
ue_context
.
masterCellGroup
=
cellGroupConfig
;
#endif
}
}
}
}
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
void
void
rrc_gNB_generate_dedicatedRRCReconfiguration
(
rrc_gNB_generate_dedicatedRRCReconfiguration
(
...
@@ -834,6 +995,7 @@ rrc_gNB_generate_dedicatedRRCReconfiguration(
...
@@ -834,6 +995,7 @@ rrc_gNB_generate_dedicatedRRCReconfiguration(
int
pdu_sessions_done
=
0
;
int
pdu_sessions_done
=
0
;
int
i
;
int
i
;
NR_CellGroupConfig_t
*
cellGroupConfig
;
NR_CellGroupConfig_t
*
cellGroupConfig
;
int
CC_id
=
ue_context_pP
->
ue_context
.
primaryCC_id
;
uint8_t
xid
=
rrc_gNB_get_next_transaction_identifier
(
ctxt_pP
->
module_id
);
uint8_t
xid
=
rrc_gNB_get_next_transaction_identifier
(
ctxt_pP
->
module_id
);
...
@@ -982,7 +1144,7 @@ rrc_gNB_generate_dedicatedRRCReconfiguration(
...
@@ -982,7 +1144,7 @@ rrc_gNB_generate_dedicatedRRCReconfiguration(
memset
(
buffer
,
0
,
sizeof
(
buffer
));
memset
(
buffer
,
0
,
sizeof
(
buffer
));
cellGroupConfig
=
calloc
(
1
,
sizeof
(
NR_CellGroupConfig_t
));
cellGroupConfig
=
calloc
(
1
,
sizeof
(
NR_CellGroupConfig_t
));
fill_mastercellGroupConfig
(
cellGroupConfig
,
ue_context_pP
->
ue_context
.
masterCellGroup
);
fill_mastercellGroupConfig
(
cellGroupConfig
,
ue_context_pP
->
ue_context
.
masterCellGroup
,
CC_id
);
size
=
do_RRCReconfiguration
(
ctxt_pP
,
buffer
,
sizeof
(
buffer
),
size
=
do_RRCReconfiguration
(
ctxt_pP
,
buffer
,
sizeof
(
buffer
),
xid
,
xid
,
*
SRB_configList2
,
*
SRB_configList2
,
...
@@ -2518,10 +2680,6 @@ rrc_gNB_decode_dcch(
...
@@ -2518,10 +2680,6 @@ rrc_gNB_decode_dcch(
DCCH
,
DCCH
,
sdu_sizeP
);
sdu_sizeP
);
if
(
LOG_DEBUGFLAG
(
DEBUG_ASN1
)
)
{
xer_fprint
(
stdout
,
&
asn_DEF_NR_UL_DCCH_Message
,
(
void
*
)
ul_dcch_msg
);
}
/* configure ciphering */
/* configure ciphering */
nr_rrc_pdcp_config_security
(
ctxt_pP
,
ue_context_p
,
1
);
nr_rrc_pdcp_config_security
(
ctxt_pP
,
ue_context_p
,
1
);
...
@@ -2540,11 +2698,7 @@ rrc_gNB_decode_dcch(
...
@@ -2540,11 +2698,7 @@ rrc_gNB_decode_dcch(
PROTOCOL_RRC_CTXT_UE_ARGS
(
ctxt_pP
),
PROTOCOL_RRC_CTXT_UE_ARGS
(
ctxt_pP
),
DCCH
,
DCCH
,
sdu_sizeP
);
sdu_sizeP
);
if
(
LOG_DEBUGFLAG
(
DEBUG_ASN1
)
)
{
xer_fprint
(
stdout
,
&
asn_DEF_NR_UL_DCCH_Message
,
(
void
*
)
ul_dcch_msg
);
}
rrc_gNB_generate_UECapabilityEnquiry
(
ctxt_pP
,
ue_context_p
);
rrc_gNB_generate_UECapabilityEnquiry
(
ctxt_pP
,
ue_context_p
);
break
;
break
;
...
@@ -2566,9 +2720,7 @@ rrc_gNB_decode_dcch(
...
@@ -2566,9 +2720,7 @@ rrc_gNB_decode_dcch(
PROTOCOL_NR_RRC_CTXT_UE_ARGS
(
ctxt_pP
),
PROTOCOL_NR_RRC_CTXT_UE_ARGS
(
ctxt_pP
),
DCCH
,
DCCH
,
sdu_sizeP
);
sdu_sizeP
);
if
(
LOG_DEBUGFLAG
(
DEBUG_ASN1
)
)
{
xer_fprint
(
stdout
,
&
asn_DEF_NR_UL_DCCH_Message
,
(
void
*
)
ul_dcch_msg
);
}
LOG_I
(
NR_RRC
,
"got UE capabilities for UE %x
\n
"
,
ctxt_pP
->
rnti
);
LOG_I
(
NR_RRC
,
"got UE capabilities for UE %x
\n
"
,
ctxt_pP
->
rnti
);
int
eutra_index
=
-
1
;
int
eutra_index
=
-
1
;
...
@@ -3116,11 +3268,11 @@ static void rrc_DU_process_ue_context_setup_request(MessageDef *msg_p, const cha
...
@@ -3116,11 +3268,11 @@ static void rrc_DU_process_ue_context_setup_request(MessageDef *msg_p, const cha
message_p
=
itti_alloc_new_message
(
TASK_RRC_GNB
,
0
,
F1AP_UE_CONTEXT_SETUP_RESP
);
message_p
=
itti_alloc_new_message
(
TASK_RRC_GNB
,
0
,
F1AP_UE_CONTEXT_SETUP_RESP
);
f1ap_ue_context_setup_t
*
resp
=&
F1AP_UE_CONTEXT_SETUP_RESP
(
message_p
);
f1ap_ue_context_setup_t
*
resp
=&
F1AP_UE_CONTEXT_SETUP_RESP
(
message_p
);
uint32_t
incoming_teid
=
0
;
uint32_t
incoming_teid
=
0
;
int
CC_id
=
ue_context_p
->
ue_context
.
primaryCC_id
;
NR_CellGroupConfig_t
*
cellGroupConfig
;
NR_CellGroupConfig_t
*
cellGroupConfig
;
cellGroupConfig
=
calloc
(
1
,
sizeof
(
NR_CellGroupConfig_t
));
cellGroupConfig
=
calloc
(
1
,
sizeof
(
NR_CellGroupConfig_t
));
fill_mastercellGroupConfig
(
cellGroupConfig
,
ue_context_p
->
ue_context
.
masterCellGroup
);
fill_mastercellGroupConfig
(
cellGroupConfig
,
ue_context_p
->
ue_context
.
masterCellGroup
,
CC_id
);
/* Configure SRB2 */
/* Configure SRB2 */
NR_SRB_ToAddMod_t
*
SRB2_config
=
NULL
;
NR_SRB_ToAddMod_t
*
SRB2_config
=
NULL
;
...
@@ -3645,6 +3797,10 @@ void *rrc_gnb_task(void *args_p) {
...
@@ -3645,6 +3797,10 @@ void *rrc_gnb_task(void *args_p) {
LOG_I
(
NR_RRC
,
"[gNB %ld] Received %s : %p
\n
"
,
instance
,
msg_name_p
,
&
NRRRC_CONFIGURATION_REQ
(
msg_p
));
LOG_I
(
NR_RRC
,
"[gNB %ld] Received %s : %p
\n
"
,
instance
,
msg_name_p
,
&
NRRRC_CONFIGURATION_REQ
(
msg_p
));
openair_rrc_gNB_configuration
(
GNB_INSTANCE_TO_MODULE_ID
(
instance
),
&
NRRRC_CONFIGURATION_REQ
(
msg_p
));
openair_rrc_gNB_configuration
(
GNB_INSTANCE_TO_MODULE_ID
(
instance
),
&
NRRRC_CONFIGURATION_REQ
(
msg_p
));
break
;
break
;
case
NRRRC_RBLIST_CFG_REQ
:
LOG_I
(
NR_RRC
,
"[eNB %ld] Received %s : %p, RB Count:%d
\n
"
,
instance
,
msg_name_p
,
&
NRRRC_RBLIST_CFG_REQ
(
msg_p
),
NRRRC_RBLIST_CFG_REQ
(
msg_p
).
rb_count
);
rrc_gNB_rblist_configuration
(
GNB_INSTANCE_TO_MODULE_ID
(
instance
),
&
NRRRC_RBLIST_CFG_REQ
(
msg_p
));
break
;
/* Messages from F1AP task */
/* Messages from F1AP task */
case
F1AP_SETUP_REQ
:
case
F1AP_SETUP_REQ
:
...
@@ -3717,46 +3873,96 @@ void *rrc_gnb_task(void *args_p) {
...
@@ -3717,46 +3873,96 @@ void *rrc_gnb_task(void *args_p) {
(
uint8_t
*
)
SS_NRRRC_PDU_REQ
(
msg_p
).
sdu
,
(
uint8_t
*
)
SS_NRRRC_PDU_REQ
(
msg_p
).
sdu
,
SS_NRRRC_PDU_REQ
(
msg_p
).
sdu_size
,
0
,
0
);
SS_NRRRC_PDU_REQ
(
msg_p
).
sdu_size
,
0
,
0
);
LOG_A
(
RRC
,
"DL DCCH size: %d
\n
"
,
SS_NRRRC_PDU_REQ
(
msg_p
).
sdu_size
);
LOG_A
(
NR_
RRC
,
"DL DCCH size: %d
\n
"
,
SS_NRRRC_PDU_REQ
(
msg_p
).
sdu_size
);
if
(
LOG_DEBUGFLAG
(
DEBUG_ASN1
))
if
(
LOG_DEBUGFLAG
(
DEBUG_ASN1
))
{
{
xer_fprint
(
stdout
,
&
asn_DEF_NR_DL_DCCH_Message
,
(
void
*
)
dl_dcch_msg
);
xer_fprint
(
stdout
,
&
asn_DEF_NR_DL_DCCH_Message
,
(
void
*
)
dl_dcch_msg
);
}
}
nr_rrc_data_req
(
&
ctxt
,
if
(
dl_dcch_msg
->
message
.
choice
.
c1
)
{
DCCH
,
if
(
dl_dcch_msg
->
message
.
choice
.
c1
->
present
==
NR_DL_DCCH_MessageType__c1_PR_rrcReconfiguration
)
rrc_gNB_mui
++
,
{
SDU_CONFIRM_NO
,
struct
rrc_gNB_ue_context_s
*
ue_context_p
=
rrc_gNB_get_ue_context
(
RC
.
nrrrc
[
ctxt
.
module_id
],
ctxt
.
rnti
);
SS_NRRRC_PDU_REQ
(
msg_p
).
sdu_size
,
LOG_A
(
NR_RRC
,
"[GNB %ld] SRB %d rnti %d rrcReconfiguration
\n
"
,
instance
,
SS_NRRRC_PDU_REQ
(
msg_p
).
srb_id
,
SS_NRRRC_PDU_REQ
(
msg_p
).
rnti
);
SS_NRRRC_PDU_REQ
(
msg_p
).
sdu
,
if
(
ue_context_p
){
PDCP_TRANSMISSION_MODE_CONTROL
);
NR_RRCReconfiguration_t
*
rrcReconfiguration
=
dl_dcch_msg
->
message
.
choice
.
c1
->
choice
.
rrcReconfiguration
;
/* remove UE Context */
/*---------------------------------------------------------------------------*/
if
(
dl_dcch_msg
->
message
.
present
==
NR_DL_DCCH_MessageType_PR_c1
)
/* The cellGroupConfig inside rrcReconfiguration from TTCN doesn't have rlc_config for some srb, upate it from bearList config */
{
if
(
rrcReconfiguration
->
criticalExtensions
.
present
==
NR_RRCReconfiguration__criticalExtensions_PR_rrcReconfiguration
&&
rrcReconfiguration
->
criticalExtensions
.
choice
.
rrcReconfiguration
){
if
(
dl_dcch_msg
->
message
.
choice
.
c1
->
present
==
NR_DL_DCCH_MessageType__c1_PR_rrcRelease
)
NR_RRCReconfiguration_IEs_t
*
ie
=
rrcReconfiguration
->
criticalExtensions
.
choice
.
rrcReconfiguration
;
if
(
ie
->
nonCriticalExtension
&&
ie
->
nonCriticalExtension
->
masterCellGroup
){
NR_CellGroupConfig_t
*
cellGroupConfig
=
NULL
;
uper_decode
(
NULL
,
&
asn_DEF_NR_CellGroupConfig
,
(
void
**
)
&
cellGroupConfig
,
(
uint8_t
*
)
ie
->
nonCriticalExtension
->
masterCellGroup
->
buf
,
ie
->
nonCriticalExtension
->
masterCellGroup
->
size
,
0
,
0
);
if
(
LOG_DEBUGFLAG
(
DEBUG_ASN1
)
)
{
xer_fprint
(
stdout
,
&
asn_DEF_NR_CellGroupConfig
,
(
const
void
*
)
cellGroupConfig
);
}
if
(
update_rrcReconfig_cellGroupConfig
(
&
ctxt
,
ue_context_p
,
cellGroupConfig
)){
//we need to update the SDU as cellGroupConfig updated
LOG_A
(
NR_RRC
,
"[GNB] update rrcReconfiguration DL_DCCH_Message message
\n
"
);
uint8_t
*
buff
=
calloc
(
128
,
sizeof
(
uint8_t
));
asn_enc_rval_t
enc_rval
=
uper_encode_to_buffer
(
&
asn_DEF_NR_CellGroupConfig
,
NULL
,
(
void
*
)
cellGroupConfig
,
buff
,
128
);
ASN_STRUCT_FREE
(
asn_DEF_NR_CellGroupConfig
,
cellGroupConfig
);
if
(
enc_rval
.
encoded
==
-
1
)
{
LOG_E
(
NR_RRC
,
"ASN1 message CellGroupConfig encoding failed (%s)!
\n
"
,
enc_rval
.
failed_type
->
name
);
}
AssertFatal
(
enc_rval
.
encoded
!=
-
1
,
"[gNB AssertFatal]ASN1 message encoding CellGroupConfig failed (%s)!
\n
"
,
enc_rval
.
failed_type
->
name
);
if
(
OCTET_STRING_fromBuf
(
ie
->
nonCriticalExtension
->
masterCellGroup
,
buff
,
(
enc_rval
.
encoded
+
7
)
/
8
)
==
-
1
)
{
LOG_E
(
NR_RRC
,
"fatal: OCTET_STRING_fromBuf failed
\n
"
);
AssertFatal
(
0
,
"OCTET_STRING_fromBuf failed
\n
"
);
}
free
(
buff
);
if
(
LOG_DEBUGFLAG
(
DEBUG_ASN1
))
{
xer_fprint
(
stdout
,
&
asn_DEF_NR_DL_DCCH_Message
,
(
void
*
)
dl_dcch_msg
);
}
enc_rval
=
uper_encode_to_buffer
(
&
asn_DEF_NR_DL_DCCH_Message
,
NULL
,
(
void
*
)
dl_dcch_msg
,
SS_NRRRC_PDU_REQ
(
msg_p
).
sdu
,
SDU_SIZE
);
if
(
enc_rval
.
encoded
==
-
1
)
{
LOG_E
(
NR_RRC
,
"[gNB AssertFatal]ASN1 message DL_DCCH_Message encoding failed (%s)!
\n
"
,
enc_rval
.
failed_type
->
name
);
}
AssertFatal
(
enc_rval
.
encoded
!=
-
1
,
"[gNB AssertFatal]ASN1 message encoding DL_DCCH_Message failed (%s)!
\n
"
,
enc_rval
.
failed_type
->
name
);
SS_NRRRC_PDU_REQ
(
msg_p
).
sdu_size
=
((
enc_rval
.
encoded
+
7
)
/
8
);
LOG_A
(
NR_RRC
,
"DL DCCH updated size: %d
\n
"
,
SS_NRRRC_PDU_REQ
(
msg_p
).
sdu_size
);
}
}
}
/*---------------------------------------------------------------------------*/
rrc_gNB_store_RRCReconfiguration
(
&
ctxt
,
ue_context_p
,
rrcReconfiguration
);
}
}
else
if
(
dl_dcch_msg
->
message
.
choice
.
c1
->
present
==
NR_DL_DCCH_MessageType__c1_PR_rrcRelease
)
{
{
rrc_gNB_ue_context_t
*
ue_context_p
=
rrc_gNB_get_ue_context
(
RC
.
nrrrc
[
ctxt
.
module_id
],
ctxt
.
rnti
);
rrc_gNB_ue_context_t
*
ue_context_p
=
rrc_gNB_get_ue_context
(
RC
.
nrrrc
[
ctxt
.
module_id
],
ctxt
.
rnti
);
if
(
ue_context_p
)
{
if
(
ue_context_p
)
{
/* uint8_t cc_id = ue_context_p->ue_context.primaryCC_id; */
LOG_I
(
NR_RRC
,
"rrcRelease UE rnti: %x
\n
"
,
ctxt
.
rnti
);
ue_context_p
->
ue_context
.
ue_reestablishment_timer
=
0
;
/* ue_context_p->ue_context.ue_reestablishment_timer = 0; */
ue_context_p
->
ue_context
.
ue_release_timer
=
0
;
/* TODO: ue_release_timer is not checked in nr_rrc_subframe_process */
/* ue_context_p->ue_context.ue_release_timer = 1; */
ue_context_p
->
ue_context
.
ue_release_timer_thres
=
0
;
/* ue_context_p->ue_context.ue_release_timer_thres = 10; */
ue_context_p
->
ue_context
.
ue_rrc_inactivity_timer
=
0
;
/* ue_context_p->ue_context.ue_rrc_inactivity_timer = 0; */
ue_context_p
->
ue_context
.
ue_release_timer_rrc
=
1
;
/* ue_release_timer_rrc is used to check UE context release */
/* ue_context_p->ue_context.ue_release_timer_rrc = 0; */
ue_context_p
->
ue_context
.
ue_release_timer_thres_rrc
=
10
;
/* ue_context_p->ue_context.ue_release_timer_thres_rrc = 0; */
/*
/* ue_context_p->ue_context.ue_release_timer_ng = 1; */
/* security_mode_command_send = TRUE; */
/* as_security_conf_ciphering = FALSE; */
/* if (RC.ss.CBRA_flag) */
/* { */
/* RRCConnSetup_PDU_Present[cc_id] = FALSE; */
/* } */
LOG_W(NR_RRC, "todo, sleep before removing UE %x \n", ctxt.rnti);
LOG_W(NR_RRC, "todo, sleep before removing UE %x \n", ctxt.rnti);
sleep(1);
sleep(1);
mac_remove_nr_ue(ctxt.module_id, ctxt.rnti);
mac_remove_nr_ue(ctxt.module_id, ctxt.rnti);
...
@@ -3764,73 +3970,26 @@ void *rrc_gnb_task(void *args_p) {
...
@@ -3764,73 +3970,26 @@ void *rrc_gnb_task(void *args_p) {
pdcp_remove_UE(&ctxt);
pdcp_remove_UE(&ctxt);
LOG_I(NR_RRC, "removed UE %x \n", ctxt.rnti);
LOG_I(NR_RRC, "removed UE %x \n", ctxt.rnti);
*/
}
}
else
else
{
{
LOG_W
(
NR_RRC
,
"ue_context_p is already NULL
\n
"
);
LOG_W
(
NR_RRC
,
"ue_context_p is already NULL
\n
"
);
}
}
}
}
else
if
(
dl_dcch_msg
->
message
.
choice
.
c1
->
present
==
NR_DL_DCCH_MessageType__c1_PR_rrcReconfiguration
)
}
{
int
i
;
uint8_t
xid
;
rrc_gNB_ue_context_t
*
ue_context_p
=
rrc_gNB_get_ue_context
(
RC
.
nrrrc
[
ctxt
.
module_id
],
ctxt
.
rnti
);
ASN_STRUCT_FREE
(
asn_DEF_NR_DL_DCCH_Message
,
dl_dcch_msg
);
AssertFatal
(
ue_context_p
!=
NULL
,
"ue_context_p is NULL
\n
"
);
LOG_I
(
NR_RRC
,
"reconfigure bearers for UE %x
\n
"
,
ctxt
.
rnti
);
NR_RRCReconfiguration_t
*
rrcReconfiguration
=
dl_dcch_msg
->
message
.
choice
.
c1
->
choice
.
rrcReconfiguration
;
AssertFatal
(
rrcReconfiguration
!=
NULL
,
"rrcReconfiguration is null
\n
"
);
NR_RRCReconfiguration_IEs_t
*
rrcReconfiguration_ies
=
rrcReconfiguration
->
criticalExtensions
.
choice
.
rrcReconfiguration
;
AssertFatal
(
rrcReconfiguration_ies
!=
NULL
,
"rrcReconfiguration_ies is null
\n
"
);
AssertFatal
(
rrcReconfiguration_ies
->
radioBearerConfig
!=
NULL
,
"rrcReconfiguration_ies->radioBearerConfig is null
\n
"
);
xid
=
rrcReconfiguration
->
rrc_TransactionIdentifier
;
if
(
ue_context_p
->
ue_context
.
SRB_configList2
[
xid
]
==
NULL
)
{
ue_context_p
->
ue_context
.
SRB_configList2
[
xid
]
=
CALLOC
(
1
,
sizeof
(
*
ue_context_p
->
ue_context
.
SRB_configList2
[
xid
]));
memset
(
ue_context_p
->
ue_context
.
SRB_configList2
[
xid
],
0
,
sizeof
(
*
ue_context_p
->
ue_context
.
SRB_configList2
[
xid
]));
}
if
(
ue_context_p
->
ue_context
.
DRB_configList2
[
xid
]
==
NULL
)
{
ue_context_p
->
ue_context
.
DRB_configList2
[
xid
]
=
CALLOC
(
1
,
sizeof
(
*
ue_context_p
->
ue_context
.
DRB_configList2
[
xid
]));
memset
(
ue_context_p
->
ue_context
.
DRB_configList2
[
xid
],
0
,
sizeof
(
*
ue_context_p
->
ue_context
.
DRB_configList2
[
xid
]));
}
NR_SRB_ToAddModList_t
*
SRB_configList
=
ue_context_p
->
ue_context
.
SRB_configList2
[
xid
];
NR_DRB_ToAddModList_t
*
DRB_configList
=
ue_context_p
->
ue_context
.
DRB_configList2
[
xid
];
const
NR_SRB_ToAddModList_t
*
srb2add_listP
=
rrcReconfiguration_ies
->
radioBearerConfig
->
srb_ToAddModList
;
if
(
srb2add_listP
!=
NULL
)
{
for
(
i
=
0
;
i
<
srb2add_listP
->
list
.
count
;
i
++
)
{
ASN_SEQUENCE_ADD
(
&
SRB_configList
->
list
,
srb2add_listP
->
list
.
array
[
i
]);
}
}
const
NR_DRB_ToAddModList_t
*
drb2add_listP
=
rrcReconfiguration_ies
->
radioBearerConfig
->
drb_ToAddModList
;
if
(
drb2add_listP
!=
NULL
)
{
for
(
i
=
0
;
i
<
drb2add_listP
->
list
.
count
;
i
++
)
{
ASN_SEQUENCE_ADD
(
&
DRB_configList
->
list
,
drb2add_listP
->
list
.
array
[
i
]);
}
}
AssertFatal
(
rrcReconfiguration_ies
->
nonCriticalExtension
!=
NULL
,
"rrcReconfiguration_ies->nonCriticalExtension is null
\n
"
);
nr_rrc_data_req
(
&
ctxt
,
AssertFatal
(
rrcReconfiguration_ies
->
nonCriticalExtension
->
masterCellGroup
!=
NULL
,
"masterCellGroup is null
\n
"
);
DCCH
,
AssertFatal
(
rrcReconfiguration_ies
->
nonCriticalExtension
->
masterCellGroup
->
buf
!=
NULL
,
"masterCellGroup is null
\n
"
);
rrc_gNB_mui
++
,
asn_dec_rval_t
dec_rval
;
SDU_CONFIRM_NO
,
NR_CellGroupConfig_t
*
cellGroupConfig
=
NULL
;
SS_NRRRC_PDU_REQ
(
msg_p
).
sdu_size
,
dec_rval
=
uper_decode
(
NULL
,
SS_NRRRC_PDU_REQ
(
msg_p
).
sdu
,
&
asn_DEF_NR_CellGroupConfig
,
PDCP_TRANSMISSION_MODE_CONTROL
);
(
void
**
)
&
cellGroupConfig
,
}
rrcReconfiguration_ies
->
nonCriticalExtension
->
masterCellGroup
->
buf
,
break
;
rrcReconfiguration_ies
->
nonCriticalExtension
->
masterCellGroup
->
size
,
0
,
0
);
AssertFatal
(
dec_rval
.
code
==
RC_OK
,
"could not decode masterCellGroup
\n
"
);
if
(
cellGroupConfig
->
rlc_BearerToAddModList
!=
NULL
)
{
for
(
i
=
0
;
i
<
cellGroupConfig
->
rlc_BearerToAddModList
->
list
.
count
;
i
++
)
{
ASN_SEQUENCE_ADD
(
&
ue_context_p
->
ue_context
.
masterCellGroup
->
rlc_BearerToAddModList
->
list
,
cellGroupConfig
->
rlc_BearerToAddModList
->
list
.
array
[
i
]);
}
asn_sequence_empty
(
&
cellGroupConfig
->
rlc_BearerToAddModList
->
list
);
}
SEQUENCE_free
(
&
asn_DEF_NR_CellGroupConfig
,
cellGroupConfig
,
0
);
}
}
}
break
;
case
SS_DRB_PDU_REQ
:
case
SS_DRB_PDU_REQ
:
LOG_A
(
NR_RRC
,
"NR RRC received SS_DRB_PDU_REQ DRB_ID:%d SDU_SIZE:%d
\n
"
,
SS_DRB_PDU_REQ
(
msg_p
).
drb_id
,
SS_DRB_PDU_REQ
(
msg_p
).
sdu_size
);
LOG_A
(
NR_RRC
,
"NR RRC received SS_DRB_PDU_REQ DRB_ID:%d SDU_SIZE:%d
\n
"
,
SS_DRB_PDU_REQ
(
msg_p
).
drb_id
,
SS_DRB_PDU_REQ
(
msg_p
).
sdu_size
);
...
...
openair2/RRC/NR/rrc_gNB_UE_context.c
View file @
b9b82998
...
@@ -209,6 +209,8 @@ void rrc_gNB_remove_ue_context(
...
@@ -209,6 +209,8 @@ void rrc_gNB_remove_ue_context(
RB_REMOVE
(
rrc_nr_ue_tree_s
,
&
rrc_instance_pP
->
rrc_ue_head
,
ue_context_pP
);
RB_REMOVE
(
rrc_nr_ue_tree_s
,
&
rrc_instance_pP
->
rrc_ue_head
,
ue_context_pP
);
rrc_gNB_free_mem_UE_context
(
ctxt_pP
,
ue_context_pP
);
rrc_gNB_free_mem_UE_context
(
ctxt_pP
,
ue_context_pP
);
nr_uid_linear_allocator_free
(
rrc_instance_pP
,
ue_context_pP
->
local_uid
);
nr_uid_linear_allocator_free
(
rrc_instance_pP
,
ue_context_pP
->
local_uid
);
/*TODO: should use ASN_STRUCT_FREE to release each pointer field of ue_context */
/* free fields of ue_context_pP->ue_context */
free
(
ue_context_pP
);
free
(
ue_context_pP
);
rrc_instance_pP
->
Nb_ue
--
;
rrc_instance_pP
->
Nb_ue
--
;
LOG_I
(
RRC
,
LOG_I
(
RRC
,
...
...
openair3/SS/ss_gNB_sys_task.c
View file @
b9b82998
...
@@ -125,6 +125,12 @@ static void send_sys_cnf(enum ConfirmationResult_Type_Sel resType,
...
@@ -125,6 +125,12 @@ static void send_sys_cnf(enum ConfirmationResult_Type_Sel resType,
msgCnf
->
Confirm
.
v
.
Cell
=
true
;
msgCnf
->
Confirm
.
v
.
Cell
=
true
;
break
;
break
;
}
}
case
NR_SystemConfirm_Type_RadioBearerList
:
{
LOG_A
(
GNB_APP
,
"[SYS-GNB] Send confirm for RadioBearerList
\n
"
);
msgCnf
->
Confirm
.
v
.
RadioBearerList
=
true
;
break
;
}
case
NR_SystemConfirm_Type_PdcpCount
:
case
NR_SystemConfirm_Type_PdcpCount
:
{
{
if
(
msg
)
if
(
msg
)
...
@@ -812,33 +818,298 @@ int cell_config_5G_done_indication()
...
@@ -812,33 +818,298 @@ int cell_config_5G_done_indication()
bool
ss_task_sys_nr_handle_cellConfigRadioBearer
(
struct
NR_SYSTEM_CTRL_REQ
*
req
)
bool
ss_task_sys_nr_handle_cellConfigRadioBearer
(
struct
NR_SYSTEM_CTRL_REQ
*
req
)
{
{
LOG_A
(
GNB_APP
,
"[SYS-GNB] Entry in fxn:%s
\n
"
,
__FUNCTION__
);
struct
NR_RadioBearer_Type_NR_RadioBearerList_Type_Dynamic
*
BearerList
=
&
(
req
->
Request
.
v
.
RadioBearerList
);
struct
NR_SYSTEM_CTRL_CNF
*
msgCnf
=
CALLOC
(
1
,
sizeof
(
struct
NR_SYSTEM_CTRL_CNF
));
LOG_A
(
GNB_APP
,
"[SYS-GNB] Entry in fxn:%s
\n
"
,
__FUNCTION__
);
MessageDef
*
message_p
=
itti_alloc_new_message
(
TASK_SYS_GNB
,
INSTANCE_DEFAULT
,
SS_NR_SYS_PORT_MSG_CNF
);
MessageDef
*
msg_p
=
itti_alloc_new_message
(
TASK_SYS_GNB
,
0
,
NRRRC_RBLIST_CFG_REQ
);
if
(
msg_p
)
{
LOG_A
(
GNB_APP
,
"[SYS-GNB] BearerList size:%lu
\n
"
,
BearerList
->
d
);
NRRRC_RBLIST_CFG_REQ
(
msg_p
).
rb_count
=
0
;
NRRRC_RBLIST_CFG_REQ
(
msg_p
).
cell_index
=
0
;
//TODO: change to multicell index later
for
(
int
i
=
0
;
i
<
BearerList
->
d
;
i
++
)
{
LOG_A
(
GNB_APP
,
"[SYS-GNB] RB Index i:%d
\n
"
,
i
);
nr_rb_info
*
rb_info
=
&
(
NRRRC_RBLIST_CFG_REQ
(
msg_p
).
rb_list
[
i
]);
memset
(
rb_info
,
0
,
sizeof
(
nr_rb_info
));
if
(
BearerList
->
v
[
i
].
Id
.
d
==
NR_RadioBearerId_Type_Srb
)
{
rb_info
->
RbId
=
BearerList
->
v
[
i
].
Id
.
v
.
Srb
;
}
else
if
(
BearerList
->
v
[
i
].
Id
.
d
==
NR_RadioBearerId_Type_Drb
)
{
rb_info
->
RbId
=
BearerList
->
v
[
i
].
Id
.
v
.
Drb
+
2
;
// Added 2 for MAXSRB because DRB1 starts from index-3
}
if
(
message_p
)
NRRadioBearerConfig
*
rbConfig
=
&
rb_info
->
RbConfig
;
{
if
(
BearerList
->
v
[
i
].
Config
.
d
==
NR_RadioBearerConfig_Type_AddOrReconfigure
)
LOG_A
(
GNB_APP
,
"[SYS-GNB] Send SS_NR_SYS_PORT_MSG_CNF
\n
"
);
{
msgCnf
->
Common
.
CellId
=
SS_context
.
eutra_cellId
;
NRRRC_RBLIST_CFG_REQ
(
msg_p
).
rb_count
++
;
msgCnf
->
Common
.
Result
.
d
=
ConfirmationResult_Type_Success
;
/* Populate the SDAP Configuration for the radio Bearer */
msgCnf
->
Common
.
Result
.
v
.
Success
=
true
;
if
(
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
Sdap
.
d
)
msgCnf
->
Confirm
.
d
=
NR_SystemConfirm_Type_RadioBearerList
;
{
msgCnf
->
Confirm
.
v
.
RadioBearerList
=
true
;
if
(
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
Sdap
.
v
.
d
==
SDAP_Configuration_Type_Config
)
{
SS_NR_SYS_PORT_MSG_CNF
(
message_p
).
cnf
=
msgCnf
;
if
(
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
Sdap
.
v
.
v
.
Config
.
d
==
SdapConfigInfo_Type_SdapConfig
)
int
send_res
=
itti_send_msg_to_task
(
TASK_SS_PORTMAN_GNB
,
INSTANCE_DEFAULT
,
message_p
);
{
if
(
send_res
<
0
)
NR_SDAP_Config_t
*
sdap
=
CALLOC
(
1
,
sizeof
(
NR_SDAP_Config_t
));
{
sdap
->
pdu_Session
=
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
Sdap
.
v
.
v
.
Config
.
v
.
SdapConfig
.
Pdu_SessionId
;
LOG_A
(
GNB_APP
,
"[SYS-GNB] Error sending to [SS-PORTMAN-GNB]"
);
if
(
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
Sdap
.
v
.
v
.
Config
.
v
.
SdapConfig
.
Sdap_HeaderDL
.
d
)
return
false
;
{
}
sdap
->
sdap_HeaderDL
=
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
Sdap
.
v
.
v
.
Config
.
v
.
SdapConfig
.
Sdap_HeaderDL
.
v
;
else
}
{
if
(
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
Sdap
.
v
.
v
.
Config
.
v
.
SdapConfig
.
MappedQoS_Flows
.
d
)
LOG_A
(
GNB_APP
,
"[SYS-GNB] fxn:%s NR_SYSTEM_CTRL_CNF sent for cnfType:NR_SystemConfirm_Type_RadioBearerList to Port Manager"
,
__FUNCTION__
);
{
}
sdap
->
mappedQoS_FlowsToAdd
=
CALLOC
(
1
,
sizeof
(
*
sdap
->
mappedQoS_FlowsToAdd
));
}
for
(
int
j
=
0
;
j
<
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
Sdap
.
v
.
v
.
Config
.
v
.
SdapConfig
.
MappedQoS_Flows
.
v
.
d
;
j
++
)
LOG_A
(
GNB_APP
,
"[SYS-GNB] Exit from fxn:%s
\n
"
,
__FUNCTION__
);
{
return
true
;
NR_QFI_t
*
qfi
=
CALLOC
(
1
,
sizeof
(
NR_QFI_t
));
*
qfi
=
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
Sdap
.
v
.
v
.
Config
.
v
.
SdapConfig
.
MappedQoS_Flows
.
v
.
v
[
j
];
ASN_SEQUENCE_ADD
(
&
sdap
->
mappedQoS_FlowsToAdd
->
list
,
qfi
);
}
}
rbConfig
->
Sdap
=
sdap
;
}
else
if
(
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
Sdap
.
v
.
v
.
Config
.
d
==
SdapConfigInfo_Type_TransparentMode
){
}
}
}
/* Populate the PDCP Configuration for the radio Bearer */
if
(
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
Pdcp
.
d
)
{
if
(
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
Pdcp
.
v
.
d
==
NR_PDCP_Configuration_Type_RBTerminating
)
{
if
(
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
Pdcp
.
v
.
v
.
RBTerminating
.
RbConfig
.
d
)
{
if
(
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
Pdcp
.
v
.
v
.
RBTerminating
.
RbConfig
.
v
.
d
==
NR_PDCP_RbConfig_Type_Params
)
{
if
(
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
Pdcp
.
v
.
v
.
RBTerminating
.
RbConfig
.
v
.
v
.
Params
.
Rb
.
d
==
NR_PDCP_RB_Config_Parameters_Type_Srb
)
{
LOG_A
(
GNB_APP
,
"[SYS-GNB] PDCP Config for Bearer Id: %d is Null
\n
"
,
rb_info
->
RbId
);
}
else
if
(
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
Pdcp
.
v
.
v
.
RBTerminating
.
RbConfig
.
v
.
v
.
Params
.
Rb
.
d
==
NR_PDCP_RB_Config_Parameters_Type_Drb
)
{
NR_PDCP_Config_t
*
pdcp
=
CALLOC
(
1
,
sizeof
(
NR_PDCP_Config_t
));
pdcp
->
drb
=
CALLOC
(
1
,
sizeof
(
*
pdcp
->
drb
));
pdcp
->
drb
->
pdcp_SN_SizeUL
=
CALLOC
(
1
,
sizeof
(
long
));
*
(
pdcp
->
drb
->
pdcp_SN_SizeUL
)
=
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
Pdcp
.
v
.
v
.
RBTerminating
.
RbConfig
.
v
.
v
.
Params
.
Rb
.
v
.
Drb
.
SN_SizeUL
;
pdcp
->
drb
->
pdcp_SN_SizeDL
=
CALLOC
(
1
,
sizeof
(
long
));
*
(
pdcp
->
drb
->
pdcp_SN_SizeDL
)
=
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
Pdcp
.
v
.
v
.
RBTerminating
.
RbConfig
.
v
.
v
.
Params
.
Rb
.
v
.
Drb
.
SN_SizeDL
;
if
(
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
Pdcp
.
v
.
v
.
RBTerminating
.
RbConfig
.
v
.
v
.
Params
.
Rb
.
v
.
Drb
.
IntegrityProtectionEnabled
)
{
pdcp
->
drb
->
integrityProtection
=
CALLOC
(
1
,
sizeof
(
long
));
*
(
pdcp
->
drb
->
integrityProtection
)
=
1
;
}
//No rohc config for DRB from TTCN
if
(
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
Pdcp
.
v
.
v
.
RBTerminating
.
RbConfig
.
v
.
v
.
Params
.
Rb
.
v
.
Drb
.
HeaderCompression
.
d
==
NR_PDCP_DRB_HeaderCompression_Type_None
)
{
}
rbConfig
->
Pdcp
=
pdcp
;
}
}
else
if
(
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
Pdcp
.
v
.
v
.
RBTerminating
.
RbConfig
.
v
.
d
==
NR_PDCP_RbConfig_Type_TransparentMode
)
{
rbConfig
->
pdcpTransparentSN_Size
=
CALLOC
(
1
,
sizeof
(
long
));
*
(
rbConfig
->
pdcpTransparentSN_Size
)
=
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
Pdcp
.
v
.
v
.
RBTerminating
.
RbConfig
.
v
.
v
.
TransparentMode
.
SN_Size
;
}
}
if
(
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
Pdcp
.
v
.
v
.
RBTerminating
.
LinkToOtherCellGroup
.
d
)
{
if
(
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
Pdcp
.
v
.
v
.
RBTerminating
.
LinkToOtherCellGroup
.
v
.
d
==
RlcBearerRouting_Type_EUTRA
)
{
//BearerList->v[i].Config.v.AddOrReconfigure.Pdcp.v.v.RBTerminating.LinkToOtherCellGroup.v.v.EUTRA
}
else
if
(
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
Pdcp
.
v
.
v
.
RBTerminating
.
LinkToOtherCellGroup
.
v
.
d
==
RlcBearerRouting_Type_NR
)
{
//BearerList->v[i].Config.v.AddOrReconfigure.Pdcp.v.v.RBTerminating.LinkToOtherCellGroup.v.v.NR
}
}
}
else
if
(
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
Pdcp
.
v
.
d
==
NR_PDCP_Configuration_Type_Proxy
)
{
if
(
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
Pdcp
.
v
.
v
.
Proxy
.
LinkToOtherNode
.
d
==
RlcBearerRouting_Type_EUTRA
)
{
//BearerList->v[i].Config.v.AddOrReconfigure.Pdcp.v.v.Proxy.LinkToOtherNode.v.EUTRA
}
else
if
(
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
Pdcp
.
v
.
v
.
Proxy
.
LinkToOtherNode
.
d
==
RlcBearerRouting_Type_NR
)
{
//BearerList->v[i].Config.v.AddOrReconfigure.Pdcp.v.v.Proxy.LinkToOtherNode.v.NR
}
}
}
/* Populate the RlcBearerConfig for the radio Bearer */
if
(
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
RlcBearer
.
d
)
{
NR_RLC_BearerConfig_t
*
rlcBearer
=
CALLOC
(
1
,
sizeof
(
NR_RLC_BearerConfig_t
));
if
(
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
RlcBearer
.
v
.
d
==
NR_RlcBearerConfig_Type_Config
)
{
/* Populate the Rlc Config of RlcBearerConfig for the radio Bearer */
if
(
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
RlcBearer
.
v
.
v
.
Config
.
Rlc
.
d
)
{
if
(
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
RlcBearer
.
v
.
v
.
Config
.
Rlc
.
v
.
Rb
.
d
)
{
NR_RLC_Config_t
*
rlc
=
CALLOC
(
1
,
sizeof
(
NR_RLC_Config_t
));
if
(
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
RlcBearer
.
v
.
v
.
Config
.
Rlc
.
v
.
Rb
.
v
.
d
==
NR_RLC_RbConfig_Type_AM
)
{
rlc
->
present
=
NR_RLC_Config_PR_am
;
rlc
->
choice
.
am
=
CALLOC
(
1
,
sizeof
(
*
rlc
->
choice
.
am
));
if
(
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
RlcBearer
.
v
.
v
.
Config
.
Rlc
.
v
.
Rb
.
v
.
v
.
AM
.
Tx
.
d
)
{
if
(
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
RlcBearer
.
v
.
v
.
Config
.
Rlc
.
v
.
Rb
.
v
.
v
.
AM
.
Tx
.
v
.
d
==
NR_ASN1_UL_AM_RLC_Type_R15
)
{
if
(
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
RlcBearer
.
v
.
v
.
Config
.
Rlc
.
v
.
Rb
.
v
.
v
.
AM
.
Tx
.
v
.
v
.
R15
.
sn_FieldLength
.
d
)
{
rlc
->
choice
.
am
->
ul_AM_RLC
.
sn_FieldLength
=
CALLOC
(
1
,
sizeof
(
long
));
*
(
rlc
->
choice
.
am
->
ul_AM_RLC
.
sn_FieldLength
)
=
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
RlcBearer
.
v
.
v
.
Config
.
Rlc
.
v
.
Rb
.
v
.
v
.
AM
.
Tx
.
v
.
v
.
R15
.
sn_FieldLength
.
v
;
}
rlc
->
choice
.
am
->
ul_AM_RLC
.
t_PollRetransmit
=
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
RlcBearer
.
v
.
v
.
Config
.
Rlc
.
v
.
Rb
.
v
.
v
.
AM
.
Tx
.
v
.
v
.
R15
.
t_PollRetransmit
;
rlc
->
choice
.
am
->
ul_AM_RLC
.
pollPDU
=
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
RlcBearer
.
v
.
v
.
Config
.
Rlc
.
v
.
Rb
.
v
.
v
.
AM
.
Tx
.
v
.
v
.
R15
.
pollPDU
;
rlc
->
choice
.
am
->
ul_AM_RLC
.
pollByte
=
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
RlcBearer
.
v
.
v
.
Config
.
Rlc
.
v
.
Rb
.
v
.
v
.
AM
.
Tx
.
v
.
v
.
R15
.
pollByte
;
rlc
->
choice
.
am
->
ul_AM_RLC
.
maxRetxThreshold
=
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
RlcBearer
.
v
.
v
.
Config
.
Rlc
.
v
.
Rb
.
v
.
v
.
AM
.
Tx
.
v
.
v
.
R15
.
maxRetxThreshold
;
}
}
if
(
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
RlcBearer
.
v
.
v
.
Config
.
Rlc
.
v
.
Rb
.
v
.
v
.
AM
.
Rx
.
d
)
{
if
(
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
RlcBearer
.
v
.
v
.
Config
.
Rlc
.
v
.
Rb
.
v
.
v
.
AM
.
Rx
.
v
.
d
==
NR_ASN1_DL_AM_RLC_Type_R15
)
{
if
(
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
RlcBearer
.
v
.
v
.
Config
.
Rlc
.
v
.
Rb
.
v
.
v
.
AM
.
Rx
.
v
.
v
.
R15
.
sn_FieldLength
.
d
)
{
rlc
->
choice
.
am
->
dl_AM_RLC
.
sn_FieldLength
=
CALLOC
(
1
,
sizeof
(
long
));
*
(
rlc
->
choice
.
am
->
dl_AM_RLC
.
sn_FieldLength
)
=
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
RlcBearer
.
v
.
v
.
Config
.
Rlc
.
v
.
Rb
.
v
.
v
.
AM
.
Rx
.
v
.
v
.
R15
.
sn_FieldLength
.
v
;
}
rlc
->
choice
.
am
->
dl_AM_RLC
.
t_Reassembly
=
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
RlcBearer
.
v
.
v
.
Config
.
Rlc
.
v
.
Rb
.
v
.
v
.
AM
.
Rx
.
v
.
v
.
R15
.
t_Reassembly
;
rlc
->
choice
.
am
->
dl_AM_RLC
.
t_StatusProhibit
=
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
RlcBearer
.
v
.
v
.
Config
.
Rlc
.
v
.
Rb
.
v
.
v
.
AM
.
Rx
.
v
.
v
.
R15
.
t_StatusProhibit
;
}
}
}
else
if
(
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
RlcBearer
.
v
.
v
.
Config
.
Rlc
.
v
.
Rb
.
v
.
d
==
NR_RLC_RbConfig_Type_UM
)
{
NR_UL_UM_RLC_t
*
ul_UM_RLC
=
NULL
;
NR_DL_UM_RLC_t
*
dl_UM_RLC
=
NULL
;
if
(
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
RlcBearer
.
v
.
v
.
Config
.
Rlc
.
v
.
Rb
.
v
.
v
.
UM
.
Tx
.
d
&&
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
RlcBearer
.
v
.
v
.
Config
.
Rlc
.
v
.
Rb
.
v
.
v
.
UM
.
Rx
.
d
)
{
rlc
->
present
=
NR_RLC_Config_PR_um_Bi_Directional
;
rlc
->
choice
.
um_Bi_Directional
=
CALLOC
(
1
,
sizeof
(
*
rlc
->
choice
.
um_Bi_Directional
));
ul_UM_RLC
=
&
rlc
->
choice
.
um_Bi_Directional
->
ul_UM_RLC
;
dl_UM_RLC
=
&
rlc
->
choice
.
um_Bi_Directional
->
dl_UM_RLC
;
}
else
if
(
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
RlcBearer
.
v
.
v
.
Config
.
Rlc
.
v
.
Rb
.
v
.
v
.
UM
.
Tx
.
d
)
{
rlc
->
present
=
NR_RLC_Config_PR_um_Uni_Directional_UL
;
rlc
->
choice
.
um_Uni_Directional_UL
=
CALLOC
(
1
,
sizeof
(
*
rlc
->
choice
.
um_Uni_Directional_UL
));
ul_UM_RLC
=
&
rlc
->
choice
.
um_Uni_Directional_UL
->
ul_UM_RLC
;
}
else
if
(
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
RlcBearer
.
v
.
v
.
Config
.
Rlc
.
v
.
Rb
.
v
.
v
.
UM
.
Rx
.
d
)
{
rlc
->
present
=
NR_RLC_Config_PR_um_Uni_Directional_DL
;
rlc
->
choice
.
um_Uni_Directional_DL
=
CALLOC
(
1
,
sizeof
(
*
rlc
->
choice
.
um_Uni_Directional_DL
));
dl_UM_RLC
=
&
rlc
->
choice
.
um_Uni_Directional_DL
->
dl_UM_RLC
;
}
if
(
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
RlcBearer
.
v
.
v
.
Config
.
Rlc
.
v
.
Rb
.
v
.
v
.
UM
.
Tx
.
d
)
{
if
(
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
RlcBearer
.
v
.
v
.
Config
.
Rlc
.
v
.
Rb
.
v
.
v
.
UM
.
Tx
.
v
.
d
==
NR_ASN1_UL_UM_RLC_Type_R15
)
{
if
(
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
RlcBearer
.
v
.
v
.
Config
.
Rlc
.
v
.
Rb
.
v
.
v
.
UM
.
Tx
.
v
.
v
.
R15
.
sn_FieldLength
.
d
)
{
ul_UM_RLC
->
sn_FieldLength
=
CALLOC
(
1
,
sizeof
(
long
));
*
(
ul_UM_RLC
->
sn_FieldLength
)
=
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
RlcBearer
.
v
.
v
.
Config
.
Rlc
.
v
.
Rb
.
v
.
v
.
UM
.
Tx
.
v
.
v
.
R15
.
sn_FieldLength
.
v
;
}
}
}
if
(
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
RlcBearer
.
v
.
v
.
Config
.
Rlc
.
v
.
Rb
.
v
.
v
.
UM
.
Rx
.
d
)
{
if
(
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
RlcBearer
.
v
.
v
.
Config
.
Rlc
.
v
.
Rb
.
v
.
v
.
UM
.
Rx
.
v
.
d
==
NR_ASN1_DL_UM_RLC_Type_R15
)
{
if
(
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
RlcBearer
.
v
.
v
.
Config
.
Rlc
.
v
.
Rb
.
v
.
v
.
UM
.
Rx
.
v
.
v
.
R15
.
sn_FieldLength
.
d
)
{
dl_UM_RLC
->
sn_FieldLength
=
CALLOC
(
1
,
sizeof
(
long
));
*
(
dl_UM_RLC
->
sn_FieldLength
)
=
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
RlcBearer
.
v
.
v
.
Config
.
Rlc
.
v
.
Rb
.
v
.
v
.
UM
.
Rx
.
v
.
v
.
R15
.
sn_FieldLength
.
v
;
}
dl_UM_RLC
->
t_Reassembly
=
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
RlcBearer
.
v
.
v
.
Config
.
Rlc
.
v
.
Rb
.
v
.
v
.
UM
.
Rx
.
v
.
v
.
R15
.
t_Reassembly
;
}
}
}
else
if
(
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
RlcBearer
.
v
.
v
.
Config
.
Rlc
.
v
.
Rb
.
v
.
d
==
NR_RLC_RbConfig_Type_TM
)
{
//TODO: TransparentMode
}
else
{
rlc
->
present
=
NR_RLC_Config_PR_NOTHING
;
}
rlcBearer
->
rlc_Config
=
rlc
;
}
if
(
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
RlcBearer
.
v
.
v
.
Config
.
Rlc
.
v
.
TestMode
.
d
)
{
//TODO: RLC TestMode
if
(
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
RlcBearer
.
v
.
v
.
Config
.
Rlc
.
v
.
TestMode
.
v
.
d
==
NR_RLC_TestModeConfig_Type_Info
)
{
if
(
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
RlcBearer
.
v
.
v
.
Config
.
Rlc
.
v
.
TestMode
.
v
.
v
.
Info
.
d
==
NR_RLC_TestModeInfo_Type_AckProhibit
)
{
}
else
if
(
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
RlcBearer
.
v
.
v
.
Config
.
Rlc
.
v
.
TestMode
.
v
.
v
.
Info
.
d
==
NR_RLC_TestModeInfo_Type_NotACK_NextRLC_PDU
)
{
}
else
if
(
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
RlcBearer
.
v
.
v
.
Config
.
Rlc
.
v
.
TestMode
.
v
.
v
.
Info
.
d
==
NR_RLC_TestModeInfo_Type_TransparentMode
)
{
}
}
else
if
(
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
RlcBearer
.
v
.
v
.
Config
.
Rlc
.
v
.
TestMode
.
v
.
d
==
NR_RLC_TestModeConfig_Type_None
)
{
}
}
}
/* Populate the LogicalChannelId of RlcBearerConfig for the radio Bearer */
if
(
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
RlcBearer
.
v
.
v
.
Config
.
LogicalChannelId
.
d
)
{
rlcBearer
->
logicalChannelIdentity
=
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
RlcBearer
.
v
.
v
.
Config
.
LogicalChannelId
.
v
;
}
/* Populate the LogicalChannelConfig of RlcBearerConfig for the radio Bearer */
if
(
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
RlcBearer
.
v
.
v
.
Config
.
Mac
.
d
)
{
if
(
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
RlcBearer
.
v
.
v
.
Config
.
Mac
.
v
.
LogicalChannel
.
d
)
{
NR_LogicalChannelConfig_t
*
logicalChannelConfig
=
CALLOC
(
1
,
sizeof
(
NR_LogicalChannelConfig_t
));
logicalChannelConfig
->
ul_SpecificParameters
=
CALLOC
(
1
,
sizeof
(
*
logicalChannelConfig
->
ul_SpecificParameters
));
logicalChannelConfig
->
ul_SpecificParameters
->
priority
=
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
RlcBearer
.
v
.
v
.
Config
.
Mac
.
v
.
LogicalChannel
.
v
.
Priority
;
logicalChannelConfig
->
ul_SpecificParameters
->
prioritisedBitRate
=
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
RlcBearer
.
v
.
v
.
Config
.
Mac
.
v
.
LogicalChannel
.
v
.
PrioritizedBitRate
;
rlcBearer
->
mac_LogicalChannelConfig
=
logicalChannelConfig
;
}
if
(
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
RlcBearer
.
v
.
v
.
Config
.
Mac
.
v
.
TestMode
.
d
)
{
//TODO: MAC test mode
}
}
/* Populate the DiscardULData of RlcBearerConfig for the radio Bearer */
if
(
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
RlcBearer
.
v
.
v
.
Config
.
DiscardULData
.
d
)
{
//typically applicable for UM DRBs only: if true: SS shall discard any data in UL for this radio bearer
rbConfig
->
DiscardULData
=
CALLOC
(
1
,
sizeof
(
bool
));
*
(
rbConfig
->
DiscardULData
)
=
BearerList
->
v
[
i
].
Config
.
v
.
AddOrReconfigure
.
RlcBearer
.
v
.
v
.
Config
.
DiscardULData
.
v
;
}
}
rbConfig
->
RlcBearer
=
rlcBearer
;
}
}
}
LOG_A
(
GNB_APP
,
"[SYS-GNB] Send NRRRC_RBLIST_CFG_REQ to TASK_RRC_GNB, RB Count : %d, Message: %s
\n
"
,
NRRRC_RBLIST_CFG_REQ
(
msg_p
).
rb_count
,
ITTI_MSG_NAME
(
msg_p
));
int
send_res
=
itti_send_msg_to_task
(
TASK_RRC_GNB
,
0
,
msg_p
);
if
(
send_res
<
0
)
{
LOG_A
(
GNB_APP
,
"[SYS-GNB] Error sending NRRRC_RBLIST_CFG_REQ to RRC_GNB
\n
"
);
}
}
send_sys_cnf
(
ConfirmationResult_Type_Success
,
true
,
NR_SystemConfirm_Type_RadioBearerList
,
NULL
);
LOG_A
(
GNB_APP
,
"[SYS-GNB] Exit from fxn:%s
\n
"
,
__FUNCTION__
);
return
true
;
}
}
/*
/*
...
...
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