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
canghaiwuhen
OpenXG-RAN
Commits
defea03a
Commit
defea03a
authored
May 20, 2020
by
s.rampalli
Committed by
Rigiel
Jun 09, 2020
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Required changes/modifications are done at both eNB and gNB side
parent
2f48b925
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
2356 additions
and
2570 deletions
+2356
-2570
openair2/RRC/LTE/rrc_defs.h
openair2/RRC/LTE/rrc_defs.h
+9
-1
openair2/RRC/LTE/rrc_eNB.c
openair2/RRC/LTE/rrc_eNB.c
+428
-422
openair2/RRC/NR/rrc_gNB.c
openair2/RRC/NR/rrc_gNB.c
+51
-91
openair2/RRC/NR/rrc_gNB_internode.c
openair2/RRC/NR/rrc_gNB_internode.c
+41
-39
openair2/RRC/NR/rrc_gNB_nsa.c
openair2/RRC/NR/rrc_gNB_nsa.c
+116
-130
openair2/RRC/NR/rrc_gNB_reconfig.c
openair2/RRC/NR/rrc_gNB_reconfig.c
+1711
-1887
No files found.
openair2/RRC/LTE/rrc_defs.h
View file @
defea03a
...
...
@@ -40,6 +40,10 @@
#include "rrc_types.h"
//#include "PHY/phy_defs.h"
#include "LAYER2/RLC/rlc.h"
#include "RRC/NR/nr_rrc_types.h"
#include "NR_UE-MRDC-Capability.h"
#include "NR_UE-NR-Capability.h"
#include "COMMON/platform_constants.h"
#include "COMMON/platform_types.h"
...
...
@@ -569,6 +573,10 @@ typedef struct eNB_RRC_UE_s {
LTE_UE_EUTRA_Capability_t
*
UE_Capability
;
int
UE_Capability_size
;
NR_UE_MRDC_Capability_t
*
UE_Capability_MRDC
;
int
UE_MRDC_Capability_size
;
NR_UE_NR_Capability_t
*
UE_Capability_nr
;
int
UE_NR_Capability_size
;
ImsiMobileIdentity_t
imsi
;
/* KeNB as derived from KASME received from EPC */
...
...
@@ -614,7 +622,7 @@ typedef struct eNB_RRC_UE_s {
/* Number of e_rab to be modified in the list */
uint8_t
nb_of_modify_e_rabs
;
uint8_t
nb_of_failed_e_rabs
;
uint8_t
nb_of_modify_endc_e_rabs
;
uint8_t
nb_of_modify_endc_e_rabs
;
e_rab_param_t
modify_e_rab
[
NB_RB_MAX
];
//[S1AP_MAX_E_RAB];
/* list of e_rab to be setup by RRC layers */
e_rab_param_t
e_rab
[
NB_RB_MAX
];
//[S1AP_MAX_E_RAB];
...
...
openair2/RRC/LTE/rrc_eNB.c
View file @
defea03a
...
...
@@ -100,8 +100,6 @@
#define NUMBEROF_DRBS_TOBE_ADDED 1
static
int
encode_CG_ConfigInfo
(
char
*
buffer
,
int
buffer_size
,
rrc_eNB_ue_context_t
*
const
ue_context_pP
,
int
*
enc_size
);
static
int
is_en_dc_supported
(
LTE_UE_EUTRA_Capability_t
*
c
);
static
void
free_rb_config
(
struct
NR_RadioBearerConfig
*
rb_config
);
static
void
free_cg_configinfo
(
struct
NR_CG_ConfigInfo
*
cg_configinfo
);
extern
RAN_CONTEXT_t
RC
;
...
...
@@ -119,8 +117,9 @@ extern uint32_t to_earfcn_DL(int eutra_bandP, uint32_t dl_CarrierFreq, uint32_t
extern
int
rrc_eNB_process_security
(
const
protocol_ctxt_t
*
const
ctxt_pP
,
rrc_eNB_ue_context_t
*
const
ue_context_pP
,
security_capabilities_t
*
security_capabilities_pP
);
extern
void
process_eNB_security_key
(
const
protocol_ctxt_t
*
const
ctxt_pP
,
rrc_eNB_ue_context_t
*
const
ue_context_pP
,
uint8_t
*
security_key_pP
);
extern
int
derive_keNB_star
(
const
uint8_t
*
kenb_32
,
const
uint16_t
pci
,
const
uint32_t
earfcn_dl
,
const
bool
is_rel8_only
,
uint8_t
*
kenb_star
);
extern
int
rrc_eNB_generate_RRCConnectionReconfiguration_endc
(
protocol_ctxt_t
*
ctxt
,
rrc_eNB_ue_context_t
*
ue_context
,
unsigned
char
*
buffer
,
int
buffer_size
,
OCTET_STRING_t
*
scg_group_config
,
OCTET_STRING_t
*
scg_RB_config
);
extern
struct
rrc_eNB_ue_context_s
*
get_first_ue_context
(
eNB_RRC_INST
*
rrc_instance_pP
);
extern
int
rrc_eNB_generate_RRCConnectionReconfiguration_endc
(
protocol_ctxt_t
*
ctxt
,
rrc_eNB_ue_context_t
*
ue_context
,
unsigned
char
*
buffer
,
int
buffer_size
,
OCTET_STRING_t
*
scg_group_config
,
OCTET_STRING_t
*
scg_RB_config
);
extern
struct
rrc_eNB_ue_context_s
*
get_first_ue_context
(
eNB_RRC_INST
*
rrc_instance_pP
);
pthread_mutex_t
rrc_release_freelist
;
RRC_release_list_t
rrc_release_info
;
...
...
@@ -168,7 +167,7 @@ init_SI(
AssertFatal
(
RC
.
rrc
[
ctxt_pP
->
module_id
]
->
carrier
[
CC_id
].
SIB1_MBMS
!=
NULL
,
PROTOCOL_RRC_CTXT_FMT
" init_SI: FATAL, no memory for SIB1_MBMS allocated
\n
"
,
PROTOCOL_RRC_CTXT_ARGS
(
ctxt_pP
));
RC
.
rrc
[
ctxt_pP
->
module_id
]
->
carrier
[
CC_id
].
sizeof_SIB1_MBMS
=
do_SIB1_MBMS
(
&
RC
.
rrc
[
ctxt_pP
->
module_id
]
->
carrier
[
CC_id
],
ctxt_pP
->
module_id
,
CC_id
,
configuration
configuration
);
LOG_I
(
RRC
,
PROTOCOL_RRC_CTXT_FMT
" Contents of SIB1-MBMS
\n
"
,
PROTOCOL_RRC_CTXT_ARGS
(
ctxt_pP
)
...
...
@@ -2128,7 +2127,7 @@ rrc_eNB_generate_RRCConnectionReestablishmentReject(
#ifdef GES_ENDC_SUPPORT
#if 0
void rrc_generate_SgNBReleaseRequest(
const protocol_ctxt_t *const ctxt_pP,
const protocol_ctxt_t *const ctxt_pP,
rrc_eNB_ue_context_t *const ue_context_pP
)
//-----------------------------------------------------------------------------
...
...
@@ -2136,13 +2135,13 @@ void rrc_generate_SgNBReleaseRequest(
MessageDef *msg;
msg = itti_alloc_new_message(TASK_RRC_ENB, X2AP_ENDC_SGNB_RELEASE_REQ);
memset(&(X2AP_ENDC_SGNB_RELEASE_REQ(msg)), 0, sizeof(x2ap_ENDC_sgnb_release_req_t));
// X2AP_ENDC_SGNB_RELEASE_REQ(msg).MeNB_ue_x2_id = ;
// X2AP_ENDC_SGNB_RELEASE_REQ(msg).SgNB_ue_x2_id = ;
// X2AP_ENDC_SGNB_RELEASE_REQ(msg).cause = ;
// X2AP_ENDC_SGNB_RELEASE_REQ(msg).target_physCellId = ;
// X2AP_ENDC_SGNB_RELEASE_REQ(msg).MeNB_ue_x2_id = ;
// X2AP_ENDC_SGNB_RELEASE_REQ(msg).SgNB_ue_x2_id = ;
// X2AP_ENDC_SGNB_RELEASE_REQ(msg).cause = ;
// X2AP_ENDC_SGNB_RELEASE_REQ(msg).target_physCellId = ;
LOG_I(RRC,
"[eNB %d] frame %d UE rnti %x transmitting sgnb release request to sgnb \n",
ctxt_pP->module_id,ctxt_pP->frame,ctxt_pP->rnti);
"[eNB %d] frame %d UE rnti %x transmitting sgnb release request to sgnb \n",
ctxt_pP->module_id,ctxt_pP->frame,ctxt_pP->rnti);
itti_send_msg_to_task(TASK_X2AP, ENB_MODULE_ID_TO_INSTANCE(ctxt_pP->module_id), msg);
return;
}
...
...
@@ -2169,13 +2168,13 @@ rrc_eNB_generate_RRCConnectionRelease(
T_INT
(
ctxt_pP
->
subframe
),
T_INT
(
ctxt_pP
->
rnti
));
#ifdef GES_ENDC_SUPPORT
#if 0
if(ue_context_pP != NULL)
{
if(ue_context_pP->ue_context.Status == RRC_NR_NSA)
{
//rrc_eNB_generate_SgNBReleaseRequest(ctxt_pP,ue_context_pP);
}
if(ue_context_pP != NULL) {
if(ue_context_pP->ue_context.Status == RRC_NR_NSA) {
//rrc_eNB_generate_SgNBReleaseRequest(ctxt_pP,ue_context_pP);
}
}
#endif
#endif
size
=
do_RRCConnectionRelease
(
ctxt_pP
->
module_id
,
buffer
,
rrc_eNB_get_next_transaction_identifier
(
ctxt_pP
->
module_id
));
...
...
@@ -2876,7 +2875,6 @@ void rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt_t
uint16_t
size
;
int
i
;
MessageDef
*
message_p
=
NULL
;
/* Configure SRB1/SRB2, PhysicalConfigDedicated, LTE_MAC_MainConfig for UE */
eNB_RRC_INST
*
rrc_inst
=
RC
.
rrc
[
ctxt_pP
->
module_id
];
struct
LTE_PhysicalConfigDedicated
**
physicalConfigDedicated
=
&
ue_context_pP
->
ue_context
.
physicalConfigDedicated
;
...
...
@@ -3068,7 +3066,7 @@ void rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt_t
module_id_t
module_id
=
ctxt_pP
->
module_id
;
LOG_D
(
RRC
,
"Processing the DRX configuration in RRC Connection Reconfiguration
\n
"
);
/* Process the IE drx_Config */
/* Process the IE drx_Config */
if
(
NODE_IS_MONOLITHIC
(
rrc_inst
->
node_type
))
{
mac_MainConfig
->
drx_Config
=
do_DrxConfig
(
cc_id
,
&
rrc_inst
->
configuration
,
UEcap
);
// drx_Config IE
...
...
@@ -3083,8 +3081,8 @@ void rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt_t
LOG_D
(
RRC
,
"DRX configured in MAC Main Configuration for RRC Connection Reconfiguration
\n
"
);
}
}
/* End of CDRX configuration */
/* End of CDRX configuration */
sr_ProhibitTimer_r9
=
CALLOC
(
1
,
sizeof
(
long
));
*
sr_ProhibitTimer_r9
=
0
;
// SR tx on PUCCH, Value in number of SR period(s). Value 0 = no timer for SR, Value 2 = 2*SR
mac_MainConfig
->
ext1
=
CALLOC
(
1
,
sizeof
(
struct
LTE_MAC_MainConfig__ext1
));
...
...
@@ -3192,7 +3190,9 @@ void rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt_t
if
(
ue_context_pP
->
ue_context
.
does_nr
)
{
MeasId6
=
calloc
(
1
,
sizeof
(
LTE_MeasIdToAddMod_t
));
if
(
MeasId6
==
NULL
)
exit
(
1
);
MeasId6
->
measId
=
7
;
MeasId6
->
measObjectId
=
2
;
MeasId6
->
reportConfigId
=
7
;
...
...
@@ -3250,22 +3250,28 @@ void rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt_t
if
(
ue_context_pP
->
ue_context
.
does_nr
)
{
MeasObj2
=
calloc
(
1
,
sizeof
(
LTE_MeasObjectToAddMod_t
));
if
(
MeasObj2
==
NULL
)
exit
(
1
);
MeasObj2
->
measObjectId
=
2
;
MeasObj2
->
measObject
.
present
=
LTE_MeasObjectToAddMod__measObject_PR_measObjectNR_r15
;
MeasObj2
->
measObject
.
choice
.
measObjectNR_r15
.
carrierFreq_r15
=
642256
;
//634000; //(634000 = 3.51GHz) (640000 = 3.6GHz) (641272 = 3619.08MHz = 3600 + 30/1000*106*12/2) (642256 is for 3.6GHz and absoluteFrequencySSB = 642016)
MeasObj2
->
measObject
.
choice
.
measObjectNR_r15
.
carrierFreq_r15
=
642256
;
//634000; //(634000 = 3.51GHz) (640000 = 3.6GHz) (641272 = 3619.08MHz = 3600 + 30/1000*106*12/2) (642256 is for 3.6GHz and absoluteFrequencySSB = 642016)
MeasObj2
->
measObject
.
choice
.
measObjectNR_r15
.
rs_ConfigSSB_r15
.
measTimingConfig_r15
.
periodicityAndOffset_r15
.
present
=
LTE_MTC_SSB_NR_r15__periodicityAndOffset_r15_PR_sf20_r15
;
MeasObj2
->
measObject
.
choice
.
measObjectNR_r15
.
rs_ConfigSSB_r15
.
measTimingConfig_r15
.
periodicityAndOffset_r15
.
choice
.
sf20_r15
=
0
;
MeasObj2
->
measObject
.
choice
.
measObjectNR_r15
.
rs_ConfigSSB_r15
.
measTimingConfig_r15
.
ssb_Duration_r15
=
LTE_MTC_SSB_NR_r15__ssb_Duration_r15_sf4
;
MeasObj2
->
measObject
.
choice
.
measObjectNR_r15
.
rs_ConfigSSB_r15
.
subcarrierSpacingSSB_r15
=
LTE_RS_ConfigSSB_NR_r15__subcarrierSpacingSSB_r15_kHz30
;
MeasObj2
->
measObject
.
choice
.
measObjectNR_r15
.
quantityConfigSet_r15
=
1
;
MeasObj2
->
measObject
.
choice
.
measObjectNR_r15
.
ext1
=
calloc
(
1
,
sizeof
(
struct
LTE_MeasObjectNR_r15__ext1
));
if
(
MeasObj2
->
measObject
.
choice
.
measObjectNR_r15
.
ext1
==
NULL
)
exit
(
1
);
MeasObj2
->
measObject
.
choice
.
measObjectNR_r15
.
ext1
->
bandNR_r15
=
calloc
(
1
,
sizeof
(
struct
LTE_MeasObjectNR_r15__ext1__bandNR_r15
));
if
(
MeasObj2
->
measObject
.
choice
.
measObjectNR_r15
.
ext1
->
bandNR_r15
==
NULL
)
exit
(
1
);
MeasObj2
->
measObject
.
choice
.
measObjectNR_r15
.
ext1
->
bandNR_r15
->
present
=
LTE_MeasObjectNR_r15__ext1__bandNR_r15_PR_setup
;
MeasObj2
->
measObject
.
choice
.
measObjectNR_r15
.
ext1
->
bandNR_r15
->
choice
.
setup
=
78
;
ASN_SEQUENCE_ADD
(
&
MeasObj_list
->
list
,
MeasObj2
);
}
...
...
@@ -3281,9 +3287,11 @@ void rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt_t
ReportConfig_A3
=
CALLOC
(
1
,
sizeof
(
*
ReportConfig_A3
));
ReportConfig_A4
=
CALLOC
(
1
,
sizeof
(
*
ReportConfig_A4
));
ReportConfig_A5
=
CALLOC
(
1
,
sizeof
(
*
ReportConfig_A5
));
if
(
ue_context_pP
->
ue_context
.
does_nr
)
{
ReportConfig_NR
=
CALLOC
(
1
,
sizeof
(
*
ReportConfig_NR
));
}
ReportConfig_per
->
reportConfigId
=
1
;
ReportConfig_per
->
reportConfig
.
present
=
LTE_ReportConfigToAddMod__reportConfig_PR_reportConfigEUTRA
;
ReportConfig_per
->
reportConfig
.
choice
.
reportConfigEUTRA
.
triggerType
.
present
=
...
...
@@ -3404,9 +3412,13 @@ void rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt_t
ReportConfig_NR
->
reportConfig
.
choice
.
reportConfigInterRAT
.
reportInterval
=
LTE_ReportInterval_ms120
;
ReportConfig_NR
->
reportConfig
.
choice
.
reportConfigInterRAT
.
reportAmount
=
LTE_ReportConfigInterRAT__reportAmount_infinity
;
ReportConfig_NR
->
reportConfig
.
choice
.
reportConfigInterRAT
.
ext7
=
calloc
(
1
,
sizeof
(
struct
LTE_ReportConfigInterRAT__ext7
));
if
(
ReportConfig_NR
->
reportConfig
.
choice
.
reportConfigInterRAT
.
ext7
==
NULL
)
exit
(
1
);
ReportConfig_NR
->
reportConfig
.
choice
.
reportConfigInterRAT
.
ext7
->
reportQuantityCellNR_r15
=
calloc
(
1
,
sizeof
(
struct
LTE_ReportQuantityNR_r15
));
if
(
ReportConfig_NR
->
reportConfig
.
choice
.
reportConfigInterRAT
.
ext7
->
reportQuantityCellNR_r15
==
NULL
)
exit
(
1
);
ReportConfig_NR
->
reportConfig
.
choice
.
reportConfigInterRAT
.
ext7
->
reportQuantityCellNR_r15
->
ss_rsrp
=
TRUE
;
ReportConfig_NR
->
reportConfig
.
choice
.
reportConfigInterRAT
.
ext7
->
reportQuantityCellNR_r15
->
ss_rsrq
=
TRUE
;
ReportConfig_NR
->
reportConfig
.
choice
.
reportConfigInterRAT
.
ext7
->
reportQuantityCellNR_r15
->
ss_sinr
=
TRUE
;
...
...
@@ -3608,7 +3620,6 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt
uint16_t
size
;
int
i
;
MessageDef
*
message_p
=
NULL
;
/* Configure SRB1/SRB2, PhysicalConfigDedicated, LTE_MAC_MainConfig for UE */
eNB_RRC_INST
*
rrc_inst
=
RC
.
rrc
[
ctxt_pP
->
module_id
];
struct
LTE_PhysicalConfigDedicated
**
physicalConfigDedicated
=
&
ue_context_pP
->
ue_context
.
physicalConfigDedicated
;
...
...
@@ -3654,7 +3665,6 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt
LTE_C_RNTI_t
*
cba_RNTI
=
NULL
;
int
measurements_enabled
;
uint8_t
xid
=
rrc_eNB_get_next_transaction_identifier
(
ctxt_pP
->
module_id
);
//Transaction_id,
#ifdef CBA // Contention Based Access
uint8_t
*
cba_RNTI_buf
;
cba_RNTI
=
CALLOC
(
1
,
sizeof
(
LTE_C_RNTI_t
));
...
...
@@ -3680,8 +3690,8 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt
frameP
,
ue_mod_idP
);
}
#endif
#endif
T
(
T_ENB_RRC_CONNECTION_RECONFIGURATION
,
T_INT
(
ctxt_pP
->
module_id
),
T_INT
(
ctxt_pP
->
frame
),
...
...
@@ -3816,7 +3826,6 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt
mac_MainConfig
->
phr_Config
->
choice
.
setup
.
prohibitPHR_Timer
=
LTE_MAC_MainConfig__phr_Config__setup__prohibitPHR_Timer_sf200
;
// sf20 = 20 subframes // LTE_MAC_MainConfig__phr_Config__setup__prohibitPHR_Timer_sf1000
mac_MainConfig
->
phr_Config
->
choice
.
setup
.
dl_PathlossChange
=
LTE_MAC_MainConfig__phr_Config__setup__dl_PathlossChange_dB3
;
// Value dB1 =1 dB, dB3 = 3 dB
/* CDRX Configuration */
mac_MainConfig
->
drx_Config
=
NULL
;
rnti_t
rnti
=
ue_context_pP
->
ue_id_rnti
;
...
...
@@ -3824,11 +3833,11 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt
uint8_t
cc_id
=
ue_context_pP
->
ue_context
.
primaryCC_id
;
LTE_UE_EUTRA_Capability_t
*
UEcap
=
ue_context_pP
->
ue_context
.
UE_Capability
;
LOG_D
(
RRC
,
"Processing the DRX configuration in RRC Connection Reconfiguration
\n
"
);
/* Process the IE drx_Config */
if
(
NODE_IS_MONOLITHIC
(
rrc_inst
->
node_type
))
{
mac_MainConfig
->
drx_Config
=
do_DrxConfig
(
cc_id
,
&
rrc_inst
->
configuration
,
UEcap
);
// drx_Config IE
if
(
mac_MainConfig
->
drx_Config
==
NULL
)
{
LOG_W
(
RRC
,
"drx_Configuration parameter is NULL, cannot configure local UE parameters or CDRX is deactivated
\n
"
);
}
else
{
...
...
@@ -3840,8 +3849,8 @@ flexran_rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt
LOG_D
(
RRC
,
"DRX configured in MAC Main Configuration for RRC Connection Reconfiguration
\n
"
);
}
}
/* End of CDRX configuration */
/* End of CDRX configuration */
sr_ProhibitTimer_r9
=
CALLOC
(
1
,
sizeof
(
long
));
*
sr_ProhibitTimer_r9
=
0
;
// SR tx on PUCCH, Value in number of SR period(s). Value 0 = no timer for SR, Value 2 = 2*SR
mac_MainConfig
->
ext1
=
CALLOC
(
1
,
sizeof
(
struct
LTE_MAC_MainConfig__ext1
));
...
...
@@ -4360,12 +4369,12 @@ rrc_eNB_generate_RRCConnectionReconfiguration_SCell(
//-----------------------------------------------------------------------------
/**
* @fn
:encode_CG_ConfigInfo
* @param
:enc_buf to store the encoded bits
/**
* @fn
:encode_CG_ConfigInfo
* @param
:enc_buf to store the encoded bits
* @param :ue_context_pP ue context used to fill CG-ConfigInfo
* @param :enc_size to store thre size of encoded size
*
this api is to fill and encode CG-ConfigInfo
*
this api is to fill and encode CG-ConfigInfo
*/
static
int
encode_CG_ConfigInfo
(
char
*
buffer
,
...
...
@@ -4379,212 +4388,158 @@ static int encode_CG_ConfigInfo(
int
RRC_OK
=
1
;
int
index
=
0
;
char
temp_buff
[
ASN_MAX_ENCODE_SIZE
];
rb_config
=
calloc
(
1
,
sizeof
(
struct
NR_RadioBearerConfig
));
LTE_UE_CapabilityRAT_ContainerList_t
*
ue_cap_rat_container_list
=
NULL
;
LTE_UE_CapabilityRAT_Container_t
ue_cap_rat_container_MRDC
;
LTE_UE_CapabilityRAT_Container_t
ue_cap_rat_container_nr
;
int
RAT_Container_count
=
0
;
rb_config
=
calloc
(
1
,
sizeof
(
struct
NR_RadioBearerConfig
));
AssertFatal
(
rb_config
!=
NULL
,
"failed to allocate memory for rb_config"
);
if
(
ue_context_pP
->
ue_context
.
DRB_configList
->
list
.
count
!=
0
)
{
rb_config
->
drb_ToAddModList
=
calloc
(
1
,
sizeof
(
struct
NR_DRB_ToAddModList
));
AssertFatal
(
rb_config
->
drb_ToAddModList
!=
NULL
,
"failed to allocated memory for drbtoaddmodlist"
);
rb_config
->
drb_ToAddModList
->
list
.
count
=
ue_context_pP
->
ue_context
.
DRB_configList
->
list
.
count
;
rb_config
->
drb_ToAddModList
->
list
.
array
=
calloc
(
ue_context_pP
->
ue_context
.
DRB_configList
->
list
.
count
,
sizeof
(
struct
NR_DRB_ToAddMod
));
AssertFatal
(
rb_config
->
drb_ToAddModList
->
list
.
array
!=
NULL
,
"falied to allocate memory for list.array"
);
for
(
index
=
0
;
index
<
NUMBEROF_DRBS_TOBE_ADDED
;
index
++
)
{
rb_config
->
drb_ToAddModList
->
list
.
array
[
index
]
=
calloc
(
1
,
sizeof
(
struct
NR_DRB_ToAddMod
));
AssertFatal
(
rb_config
->
drb_ToAddModList
->
list
.
array
[
index
]
!=
NULL
,
"failed to allocate memory for drb_toaddmod"
);
rb_config
->
drb_ToAddModList
->
list
.
array
[
index
]
->
drb_Identity
=
ue_context_pP
->
ue_context
.
DRB_configList
->
list
.
array
[
index
]
->
drb_Identity
;
if
(
ue_context_pP
->
ue_context
.
DRB_configList
->
list
.
array
[
index
]
->
eps_BearerIdentity
)
{
rb_config
->
drb_ToAddModList
->
list
.
array
[
index
]
->
cnAssociation
=
calloc
(
1
,
sizeof
(
struct
NR_DRB_ToAddMod__cnAssociation
));
AssertFatal
(
rb_config
->
drb_ToAddModList
->
list
.
array
[
index
]
->
cnAssociation
!=
NULL
,
"failed to allocate memory cnAssociation"
);
rb_config
->
drb_ToAddModList
->
list
.
array
[
index
]
->
cnAssociation
->
present
=
NR_DRB_ToAddMod__cnAssociation_PR_eps_BearerIdentity
;
rb_config
->
drb_ToAddModList
->
list
.
array
[
index
]
->
cnAssociation
->
choice
.
eps_BearerIdentity
=*
(
ue_context_pP
->
ue_context
.
DRB_configList
->
list
.
array
[
index
]
->
eps_BearerIdentity
);
}
rb_config
->
drb_ToAddModList
->
list
.
array
[
index
]
->
pdcp_Config
=
calloc
(
1
,
sizeof
(
struct
NR_PDCP_Config
));
rb_config
->
drb_ToAddModList
->
list
.
array
[
index
]
->
pdcp_Config
->
drb
=
calloc
(
1
,
sizeof
(
struct
NR_PDCP_Config__drb
));
rb_config
->
drb_ToAddModList
->
list
.
array
[
index
]
->
pdcp_Config
->
drb
->
discardTimer
=
calloc
(
1
,
sizeof
(
long
*
));
*
rb_config
->
drb_ToAddModList
->
list
.
array
[
index
]
->
pdcp_Config
->
drb
->
discardTimer
=
*
(
ue_context_pP
->
ue_context
.
DRB_configList
->
list
.
array
[
index
]
->
pdcp_Config
->
discardTimer
);
rb_config
->
drb_ToAddModList
->
list
.
array
[
index
]
->
pdcp_Config
->
drb
->
pdcp_SN_SizeUL
=
calloc
(
1
,
sizeof
(
long
*
));
*
rb_config
->
drb_ToAddModList
->
list
.
array
[
index
]
->
pdcp_Config
->
drb
->
pdcp_SN_SizeUL
=
NR_PDCP_Config__drb__pdcp_SN_SizeUL_len18bits
;
rb_config
->
drb_ToAddModList
->
list
.
array
[
index
]
->
pdcp_Config
->
drb
->
pdcp_SN_SizeDL
=
calloc
(
1
,
sizeof
(
long
*
));
*
rb_config
->
drb_ToAddModList
->
list
.
array
[
index
]
->
pdcp_Config
->
drb
->
pdcp_SN_SizeDL
=
NR_PDCP_Config__drb__pdcp_SN_SizeDL_len18bits
;
rb_config
->
drb_ToAddModList
->
list
.
array
[
index
]
->
pdcp_Config
->
drb
->
headerCompression
.
present
=
NR_PDCP_Config__drb__headerCompression_PR_notUsed
;
rb_config
->
drb_ToAddModList
->
list
.
array
[
index
]
->
pdcp_Config
->
drb
->
headerCompression
.
choice
.
notUsed
=
0
;
rb_config
->
drb_ToAddModList
->
list
.
array
[
index
]
->
pdcp_Config
->
t_Reordering
=
calloc
(
1
,
sizeof
(
long
*
));
*
rb_config
->
drb_ToAddModList
->
list
.
array
[
index
]
->
pdcp_Config
->
t_Reordering
=
NR_PDCP_Config__t_Reordering_ms0
;
}
rb_config
->
securityConfig
=
calloc
(
1
,
sizeof
(
struct
NR_SecurityConfig
));
rb_config
->
securityConfig
->
securityAlgorithmConfig
=
calloc
(
1
,
sizeof
(
struct
NR_SecurityAlgorithmConfig
));
rb_config
->
securityConfig
->
securityAlgorithmConfig
->
cipheringAlgorithm
=
NR_CipheringAlgorithm_nea0
;
rb_config
->
securityConfig
->
securityAlgorithmConfig
->
integrityProtAlgorithm
=
NULL
;
rb_config
->
securityConfig
->
keyToUse
=
calloc
(
1
,
sizeof
(
long
*
));
*
rb_config
->
securityConfig
->
keyToUse
=
NR_SecurityConfig__keyToUse_master
;
AssertFatal
(
rb_config
->
drb_ToAddModList
!=
NULL
,
"failed to allocated memory for drbtoaddmodlist"
);
rb_config
->
drb_ToAddModList
->
list
.
count
=
NUMBEROF_DRBS_TOBE_ADDED
;
rb_config
->
drb_ToAddModList
->
list
.
array
=
calloc
(
NUMBEROF_DRBS_TOBE_ADDED
,
sizeof
(
struct
NR_DRB_ToAddMod
*
));
AssertFatal
(
rb_config
->
drb_ToAddModList
->
list
.
array
!=
NULL
,
"falied to allocate memory for list.array"
);
for
(
index
=
0
;
index
<
NUMBEROF_DRBS_TOBE_ADDED
;
index
++
)
{
rb_config
->
drb_ToAddModList
->
list
.
array
[
index
]
=
calloc
(
1
,
sizeof
(
struct
NR_DRB_ToAddMod
));
AssertFatal
(
rb_config
->
drb_ToAddModList
->
list
.
array
[
index
]
!=
NULL
,
"failed to allocate memory for drb_toaddmod"
);
rb_config
->
drb_ToAddModList
->
list
.
array
[
index
]
->
drb_Identity
=
ue_context_pP
->
ue_context
.
DRB_configList
->
list
.
array
[
index
]
->
drb_Identity
;
if
(
ue_context_pP
->
ue_context
.
DRB_configList
->
list
.
array
[
index
]
->
eps_BearerIdentity
)
{
rb_config
->
drb_ToAddModList
->
list
.
array
[
index
]
->
cnAssociation
=
calloc
(
1
,
sizeof
(
struct
NR_DRB_ToAddMod__cnAssociation
));
AssertFatal
(
rb_config
->
drb_ToAddModList
->
list
.
array
[
index
]
->
cnAssociation
!=
NULL
,
"failed to allocate memory cnAssociation"
);
rb_config
->
drb_ToAddModList
->
list
.
array
[
index
]
->
cnAssociation
->
present
=
NR_DRB_ToAddMod__cnAssociation_PR_eps_BearerIdentity
;
rb_config
->
drb_ToAddModList
->
list
.
array
[
index
]
->
cnAssociation
->
choice
.
eps_BearerIdentity
=
*
(
ue_context_pP
->
ue_context
.
DRB_configList
->
list
.
array
[
index
]
->
eps_BearerIdentity
);
}
rb_config
->
drb_ToAddModList
->
list
.
array
[
index
]
->
pdcp_Config
=
calloc
(
1
,
sizeof
(
struct
NR_PDCP_Config
));
rb_config
->
drb_ToAddModList
->
list
.
array
[
index
]
->
pdcp_Config
->
drb
=
calloc
(
1
,
sizeof
(
struct
NR_PDCP_Config__drb
));
rb_config
->
drb_ToAddModList
->
list
.
array
[
index
]
->
pdcp_Config
->
drb
->
discardTimer
=
calloc
(
1
,
sizeof
(
long
));
*
rb_config
->
drb_ToAddModList
->
list
.
array
[
index
]
->
pdcp_Config
->
drb
->
discardTimer
=
*
(
ue_context_pP
->
ue_context
.
DRB_configList
->
list
.
array
[
index
]
->
pdcp_Config
->
discardTimer
);
rb_config
->
drb_ToAddModList
->
list
.
array
[
index
]
->
pdcp_Config
->
drb
->
pdcp_SN_SizeUL
=
calloc
(
1
,
sizeof
(
long
));
*
rb_config
->
drb_ToAddModList
->
list
.
array
[
index
]
->
pdcp_Config
->
drb
->
pdcp_SN_SizeUL
=
NR_PDCP_Config__drb__pdcp_SN_SizeUL_len18bits
;
rb_config
->
drb_ToAddModList
->
list
.
array
[
index
]
->
pdcp_Config
->
drb
->
pdcp_SN_SizeDL
=
calloc
(
1
,
sizeof
(
long
));
*
rb_config
->
drb_ToAddModList
->
list
.
array
[
index
]
->
pdcp_Config
->
drb
->
pdcp_SN_SizeDL
=
NR_PDCP_Config__drb__pdcp_SN_SizeDL_len18bits
;
rb_config
->
drb_ToAddModList
->
list
.
array
[
index
]
->
pdcp_Config
->
drb
->
headerCompression
.
present
=
NR_PDCP_Config__drb__headerCompression_PR_notUsed
;
rb_config
->
drb_ToAddModList
->
list
.
array
[
index
]
->
pdcp_Config
->
drb
->
headerCompression
.
choice
.
notUsed
=
0
;
rb_config
->
drb_ToAddModList
->
list
.
array
[
index
]
->
pdcp_Config
->
t_Reordering
=
calloc
(
1
,
sizeof
(
long
));
*
rb_config
->
drb_ToAddModList
->
list
.
array
[
index
]
->
pdcp_Config
->
t_Reordering
=
NR_PDCP_Config__t_Reordering_ms0
;
}
rb_config
->
securityConfig
=
calloc
(
1
,
sizeof
(
struct
NR_SecurityConfig
));
rb_config
->
securityConfig
->
securityAlgorithmConfig
=
calloc
(
1
,
sizeof
(
struct
NR_SecurityAlgorithmConfig
));
rb_config
->
securityConfig
->
securityAlgorithmConfig
->
cipheringAlgorithm
=
NR_CipheringAlgorithm_nea0
;
rb_config
->
securityConfig
->
securityAlgorithmConfig
->
integrityProtAlgorithm
=
NULL
;
rb_config
->
securityConfig
->
keyToUse
=
calloc
(
1
,
sizeof
(
long
));
*
rb_config
->
securityConfig
->
keyToUse
=
NR_SecurityConfig__keyToUse_master
;
}
cg_configinfo
=
calloc
(
1
,
sizeof
(
struct
NR_CG_ConfigInfo
));
AssertFatal
(
cg_configinfo
!=
NULL
,
"failed to allocate memory for cg_configinfo"
);
cg_configinfo
->
criticalExtensions
.
present
=
NR_CG_ConfigInfo__criticalExtensions_PR_c1
;
cg_configinfo
->
criticalExtensions
.
choice
.
c1
=
calloc
(
1
,
sizeof
(
struct
NR_CG_ConfigInfo__criticalExtensions__c1
));
cg_configinfo
->
criticalExtensions
.
choice
.
c1
=
calloc
(
1
,
sizeof
(
struct
NR_CG_ConfigInfo__criticalExtensions__c1
));
AssertFatal
(
cg_configinfo
->
criticalExtensions
.
choice
.
c1
!=
NULL
,
"failed to allocate memory for cg_configinfo->criticalExtensions.choice.c1"
);
cg_configinfo
->
criticalExtensions
.
choice
.
c1
->
present
=
NR_CG_ConfigInfo__criticalExtensions__c1_PR_cg_ConfigInfo
;
cg_configinfo
->
criticalExtensions
.
choice
.
c1
->
choice
.
cg_ConfigInfo
=
calloc
(
1
,
sizeof
(
struct
NR_CG_ConfigInfo_IEs
));
"failed to allocate memory for cg_configinfo->criticalExtensions.choice.c1"
);
cg_configinfo
->
criticalExtensions
.
choice
.
c1
->
present
=
NR_CG_ConfigInfo__criticalExtensions__c1_PR_cg_ConfigInfo
;
cg_configinfo
->
criticalExtensions
.
choice
.
c1
->
choice
.
cg_ConfigInfo
=
calloc
(
1
,
sizeof
(
struct
NR_CG_ConfigInfo_IEs
));
AssertFatal
(
cg_configinfo
->
criticalExtensions
.
choice
.
c1
->
choice
.
cg_ConfigInfo
!=
NULL
,
"failed to allocate memory for cg_configinfo_IEs"
);
cg_configinfo
->
criticalExtensions
.
choice
.
c1
->
choice
.
cg_ConfigInfo
->
ue_CapabilityInfo
=
calloc
(
1
,
sizeof
(
OCTET_STRING_t
));
"failed to allocate memory for cg_configinfo_IEs"
);
cg_configinfo
->
criticalExtensions
.
choice
.
c1
->
choice
.
cg_ConfigInfo
->
ue_CapabilityInfo
=
calloc
(
1
,
sizeof
(
OCTET_STRING_t
));
AssertFatal
(
cg_configinfo
->
criticalExtensions
.
choice
.
c1
->
choice
.
cg_ConfigInfo
->
ue_CapabilityInfo
!=
NULL
,
"failed to allocate memory for ue_capabilityinfo"
);
#if 1
ue_CapabilityInfo
!=
NULL
,
"failed to allocate memory for ue_capabilityinfo"
);
if
(
ue_context_pP
->
ue_context
.
UE_Capability_MRDC
)
{
RAT_Container_count
++
;
enc_rval
=
uper_encode_to_buffer
(
&
asn_DEF_NR_UE_MRDC_Capability
,
NULL
,
(
void
*
)
ue_context_pP
->
ue_context
.
UE_Capability_MRDC
,
temp_buff
,
ASN_MAX_ENCODE_SIZE
);
AssertFatal
(
enc_rval
.
encoded
>
0
,
"ASN1 message encoding failed (%s, %jd)!
\n
"
,
enc_rval
.
failed_type
->
name
,
enc_rval
.
encoded
);
ue_cap_rat_container_MRDC
.
rat_Type
=
LTE_RAT_Type_eutra_nr
;
OCTET_STRING_fromBuf
(
&
ue_cap_rat_container_MRDC
.
ueCapabilityRAT_Container
,
(
const
char
*
)
temp_buff
,(
enc_rval
.
encoded
+
7
)
>>
3
);
memset
((
void
*
)
temp_buff
,
0
,
sizeof
(
temp_buff
));
}
if
(
ue_context_pP
->
ue_context
.
UE_Capability_nr
)
{
RAT_Container_count
++
;
enc_rval
=
uper_encode_to_buffer
(
&
asn_DEF_NR_UE_NR_Capability
,
NULL
,
(
void
*
)
ue_context_pP
->
ue_context
.
UE_Capability_nr
,
temp_buff
,
ASN_MAX_ENCODE_SIZE
);
AssertFatal
(
enc_rval
.
encoded
>
0
,
"ASN1 message encoding failed (%s, %jd)!
\n
"
,
enc_rval
.
failed_type
->
name
,
enc_rval
.
encoded
);
ue_cap_rat_container_nr
.
rat_Type
=
LTE_RAT_Type_nr
;
OCTET_STRING_fromBuf
(
&
ue_cap_rat_container_nr
.
ueCapabilityRAT_Container
,
(
const
char
*
)
temp_buff
,(
enc_rval
.
encoded
+
7
)
>>
3
);
memset
((
void
*
)
temp_buff
,
0
,
sizeof
(
temp_buff
));
}
ue_cap_rat_container_list
=
calloc
(
1
,
sizeof
(
LTE_UE_CapabilityRAT_ContainerList_t
));
ue_cap_rat_container_list
->
list
.
count
=
RAT_Container_count
;
ue_cap_rat_container_list
->
list
.
size
=
sizeof
(
RAT_Container_count
*
sizeof
(
LTE_UE_CapabilityRAT_Container_t
));
ue_cap_rat_container_list
->
list
.
array
=
calloc
(
RAT_Container_count
,
sizeof
(
LTE_UE_CapabilityRAT_Container_t
*
));
if
(
ue_context_pP
->
ue_context
.
UE_Capability_MRDC
)
{
ue_cap_rat_container_list
->
list
.
array
[
0
]
=
calloc
(
1
,
sizeof
(
LTE_UE_CapabilityRAT_Container_t
));
memcpy
(
ue_cap_rat_container_list
->
list
.
array
[
0
],
&
ue_cap_rat_container_MRDC
,
sizeof
(
LTE_UE_CapabilityRAT_Container_t
));
}
if
(
ue_context_pP
->
ue_context
.
UE_Capability_nr
)
{
ue_cap_rat_container_list
->
list
.
array
[
1
]
=
calloc
(
1
,
sizeof
(
LTE_UE_CapabilityRAT_Container_t
));
memcpy
(
ue_cap_rat_container_list
->
list
.
array
[
1
],
&
ue_cap_rat_container_nr
,
sizeof
(
LTE_UE_CapabilityRAT_Container_t
));
}
//this xer_fprint logs can be enabled for additional debugging logs
//xer_fprint(stdout,&asn_DEF_LTE_UE_CapabilityRAT_ContainerList,ue_cap_rat_container_list);
enc_rval
=
uper_encode_to_buffer
(
&
asn_DEF_LTE_UE_CapabilityRAT_ContainerList
,
NULL
,
(
void
*
)
ue_context_pP
->
ue_context
.
UE_Capability
,
temp_buff
,
ASN_MAX_ENCODE_SIZE
);
(
void
*
)
ue_cap_rat_container_list
,
temp_buff
,
ASN_MAX_ENCODE_SIZE
);
AssertFatal
(
enc_rval
.
encoded
>
0
,
"ASN1 message encoding failed (%s, %jd)!
\n
"
,
enc_rval
.
failed_type
->
name
,
enc_rval
.
encoded
);
OCTET_STRING_fromBuf
(
cg_configinfo
->
criticalExtensions
.
choice
.
c1
->
choice
.
cg_ConfigInfo
->
ue_CapabilityInfo
,
(
const
char
*
)
temp_buff
,(
enc_rval
.
encoded
+
7
)
>>
3
);
#endif
#if 0
cg_configinfo->criticalExtensions.choice.c1->choice.cg_ConfigInfo->ue_CapabilityInfo->size
= ue_context_pP->ue_context.UE_Capability_size;
cg_configinfo->criticalExtensions.choice.c1->choice.cg_ConfigInfo->ue_CapabilityInfo->buf
= calloc(1,ue_context_pP->ue_context.UE_Capability_size);
AssertFatal( cg_configinfo->criticalExtensions.choice.c1->choice.cg_ConfigInfo->
ue_CapabilityInfo->buf != NULL, "failed to allocate memory for buf");
memcpy(cg_configinfo->criticalExtensions.choice.c1->choice.cg_ConfigInfo->ue_CapabilityInfo->buf,
ue_context_pP->ue_context.UE_Capability,ue_context_pP->ue_context.UE_Capability_size);
#endif
#if 1
cg_configinfo
->
criticalExtensions
.
choice
.
c1
->
choice
.
cg_ConfigInfo
->
mcg_RB_Config
=
calloc
(
1
,
sizeof
(
OCTET_STRING_t
));
enc_rval
.
failed_type
->
name
,
enc_rval
.
encoded
);
OCTET_STRING_fromBuf
(
cg_configinfo
->
criticalExtensions
.
choice
.
c1
->
choice
.
cg_ConfigInfo
->
ue_CapabilityInfo
,
(
const
char
*
)
temp_buff
,
(
enc_rval
.
encoded
+
7
)
>>
3
);
cg_configinfo
->
criticalExtensions
.
choice
.
c1
->
choice
.
cg_ConfigInfo
->
mcg_RB_Config
=
calloc
(
1
,
sizeof
(
OCTET_STRING_t
));
AssertFatal
(
cg_configinfo
->
criticalExtensions
.
choice
.
c1
->
choice
.
cg_ConfigInfo
->
mcg_RB_Config
!=
NULL
,
"failed to allocate memory for mcg_rb_config"
);
mcg_RB_Config
!=
NULL
,
"failed to allocate memory for mcg_rb_config"
);
enc_rval
=
uper_encode_to_buffer
(
&
asn_DEF_NR_RadioBearerConfig
,
NULL
,(
void
*
)
rb_config
,
temp_buff
,
ASN_MAX_ENCODE_SIZE
);
AssertFatal
(
enc_rval
.
encoded
>
0
,
"ASN1 message encoding failed (%s, %jd)!
\n
"
,
enc_rval
.
failed_type
->
name
,
enc_rval
.
encoded
);
enc_rval
.
failed_type
->
name
,
enc_rval
.
encoded
);
OCTET_STRING_fromBuf
(
cg_configinfo
->
criticalExtensions
.
choice
.
c1
->
choice
.
cg_ConfigInfo
->
mcg_RB_Config
,
(
const
char
*
)
temp_buff
,
(
enc_rval
.
encoded
+
7
)
>>
3
);
#endif
#if 0
AssertFatal(cg_configinfo->criticalExtensions.choice.c1->choice.cg_ConfigInfo->
mcg_RB_Config != NULL, "failed to allocate memory for mcg_rb_config");
cg_configinfo->criticalExtensions.choice.c1->choice.cg_ConfigInfo->mcg_RB_Config->size
= sizeof( struct NR_RadioBearerConfig);
cg_configinfo->criticalExtensions.choice.c1->choice.cg_ConfigInfo->mcg_RB_Config->buf
= calloc(1,sizeof(struct NR_RadioBearerConfig));
AssertFatal(cg_configinfo->criticalExtensions.choice.c1->choice.cg_ConfigInfo->
mcg_RB_Config->buf != NULL,"failed to allocate memory for buf");
memcpy(cg_configinfo->criticalExtensions.choice.c1->choice.cg_ConfigInfo->mcg_RB_Config->buf,
rb_config,sizeof(struct NR_RadioBearerConfig));
#endif
// this xer_fprint can be enabled for additional debugging messages
xer_fprint
(
stdout
,
&
asn_DEF_NR_CG_ConfigInfo
,(
void
*
)
cg_configinfo
);
enc_rval
=
uper_encode_to_buffer
(
&
asn_DEF_NR_CG_ConfigInfo
,
NULL
,(
void
*
)
cg_configinfo
,
buffer
,
buffer_size
);
(
const
char
*
)
temp_buff
,
(
enc_rval
.
encoded
+
7
)
>>
3
);
// this xer_fprint can be enabled for additional debugging messages
// xer_fprint(stdout,&asn_DEF_NR_CG_ConfigInfo,(void *)cg_configinfo);
enc_rval
=
uper_encode_to_buffer
(
&
asn_DEF_NR_CG_ConfigInfo
,
NULL
,(
void
*
)
cg_configinfo
,
buffer
,
buffer_size
);
AssertFatal
(
enc_rval
.
encoded
>
0
,
"ASN1 message encoding failed (%s, %lu)!
\n
"
,
enc_rval
.
failed_type
->
name
,
enc_rval
.
encoded
);
enc_rval
.
failed_type
->
name
,
enc_rval
.
encoded
);
*
enc_size
=
(
enc_rval
.
encoded
+
7
)
/
8
;
free_rb_config
(
rb_config
);
free_cg_configinfo
(
cg_configinfo
);
ASN_STRUCT_FREE
(
asn_DEF_NR_RadioBearerConfig
,
rb_config
);
ASN_STRUCT_FREE
(
asn_DEF_NR_CG_ConfigInfo
,
cg_configinfo
);
ASN_STRUCT_FREE
(
asn_DEF_LTE_UE_CapabilityRAT_ContainerList
,
ue_cap_rat_container_list
);
return
RRC_OK
;
}
//-----------------------------------------------------------------------------
/**
* @fn :api to free the all the dynamically allocated memory
* @param :cg_configinfo contains cellgroup configuration
*/
static
void
free_cg_configinfo
(
struct
NR_CG_ConfigInfo
*
cg_configinfo
)
{
if
(
cg_configinfo
){
if
(
cg_configinfo
->
criticalExtensions
.
choice
.
c1
){
if
(
cg_configinfo
->
criticalExtensions
.
choice
.
c1
->
choice
.
cg_ConfigInfo
){
if
(
cg_configinfo
->
criticalExtensions
.
choice
.
c1
->
choice
.
cg_ConfigInfo
->
ue_CapabilityInfo
){
if
(
cg_configinfo
->
criticalExtensions
.
choice
.
c1
->
choice
.
cg_ConfigInfo
->
ue_CapabilityInfo
->
buf
){
if
(
cg_configinfo
->
criticalExtensions
.
choice
.
c1
->
choice
.
cg_ConfigInfo
->
mcg_RB_Config
){
if
(
cg_configinfo
->
criticalExtensions
.
choice
.
c1
->
choice
.
cg_ConfigInfo
->
mcg_RB_Config
->
buf
){
free
(
cg_configinfo
->
criticalExtensions
.
choice
.
c1
->
choice
.
cg_ConfigInfo
->
mcg_RB_Config
->
buf
);
cg_configinfo
->
criticalExtensions
.
choice
.
c1
->
choice
.
cg_ConfigInfo
->
mcg_RB_Config
->
buf
=
NULL
;
free
(
cg_configinfo
->
criticalExtensions
.
choice
.
c1
->
choice
.
cg_ConfigInfo
->
mcg_RB_Config
);
cg_configinfo
->
criticalExtensions
.
choice
.
c1
->
choice
.
cg_ConfigInfo
->
mcg_RB_Config
=
NULL
;
free
(
cg_configinfo
->
criticalExtensions
.
choice
.
c1
->
choice
.
cg_ConfigInfo
->
ue_CapabilityInfo
->
buf
);
cg_configinfo
->
criticalExtensions
.
choice
.
c1
->
choice
.
cg_ConfigInfo
->
ue_CapabilityInfo
->
buf
=
NULL
;
free
(
cg_configinfo
->
criticalExtensions
.
choice
.
c1
->
choice
.
cg_ConfigInfo
->
ue_CapabilityInfo
);
cg_configinfo
->
criticalExtensions
.
choice
.
c1
->
choice
.
cg_ConfigInfo
->
ue_CapabilityInfo
=
NULL
;
free
(
cg_configinfo
->
criticalExtensions
.
choice
.
c1
->
choice
.
cg_ConfigInfo
);
cg_configinfo
->
criticalExtensions
.
choice
.
c1
->
choice
.
cg_ConfigInfo
=
NULL
;
free
(
cg_configinfo
->
criticalExtensions
.
choice
.
c1
);
cg_configinfo
->
criticalExtensions
.
choice
.
c1
=
NULL
;
free
(
cg_configinfo
);
cg_configinfo
=
NULL
;
}
}
}
}
}
}
}
return
;
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
/**
* @fn :api to free the all the dynamically allocated memory
* @param :rb_config contains radiobearer configuration
*/
static
void
free_rb_config
(
struct
NR_RadioBearerConfig
*
rb_config
)
{
int
index
=
0
;
if
(
rb_config
)
{
if
(
rb_config
->
drb_ToAddModList
)
{
if
(
rb_config
->
drb_ToAddModList
->
list
.
array
)
{
for
(
index
=
0
;
index
<
rb_config
->
drb_ToAddModList
->
list
.
count
;
index
++
)
{
if
(
rb_config
->
drb_ToAddModList
->
list
.
array
[
index
]
->
cnAssociation
)
{
free
(
rb_config
->
drb_ToAddModList
->
list
.
array
[
index
]
->
cnAssociation
);
rb_config
->
drb_ToAddModList
->
list
.
array
[
index
]
->
cnAssociation
=
NULL
;
}
if
(
rb_config
->
drb_ToAddModList
->
list
.
array
[
index
])
{
free
(
rb_config
->
drb_ToAddModList
->
list
.
array
[
index
]);
rb_config
->
drb_ToAddModList
->
list
.
array
[
index
]
=
NULL
;
}
}
free
(
rb_config
->
drb_ToAddModList
->
list
.
array
);
rb_config
->
drb_ToAddModList
->
list
.
array
=
NULL
;
free
(
rb_config
->
drb_ToAddModList
);
rb_config
->
drb_ToAddModList
=
NULL
;
free
(
rb_config
);
rb_config
=
NULL
;
}
}
}
return
;
}
//------------------------------------------------------------------------------
...
...
@@ -4668,36 +4623,39 @@ rrc_eNB_process_MeasurementReport(
ue_context_pP
->
ue_context
.
Status
=
RRC_NR_NSA
;
if
(
is_en_dc_supported
(
ue_context_pP
->
ue_context
.
UE_Capability
))
{
/** to add gNB as Secondary node CG-ConfigInfo to be added as per 36.423 r15 **/
if
(
encode_CG_ConfigInfo
(
enc_buf
,
sizeof
(
enc_buf
),
ue_context_pP
,
&
enc_size
)
==
RRC_OK
)
LOG_I
(
RRC
,
"CG-ConfigInfo encoded successfully
\n
"
);
msg
=
itti_alloc_new_message
(
TASK_RRC_ENB
,
X2AP_ENDC_SGNB_ADDITION_REQ
);
memset
(
&
(
X2AP_ENDC_SGNB_ADDITION_REQ
(
msg
)),
0
,
sizeof
(
x2ap_ENDC_sgnb_addition_req_t
));
X2AP_ENDC_SGNB_ADDITION_REQ
(
msg
).
rnti
=
ctxt_pP
->
rnti
;
memcpy
(
X2AP_ENDC_SGNB_ADDITION_REQ
(
msg
).
rrc_buffer
,
enc_buf
,
enc_size
);
X2AP_ENDC_SGNB_ADDITION_REQ
(
msg
).
rrc_buffer_size
=
enc_size
;
X2AP_ENDC_SGNB_ADDITION_REQ
(
msg
).
target_physCellId
=
measResults2
->
measResultNeighCells
->
choice
.
measResultListEUTRA
.
list
.
array
[
0
]
->
physCellId
;
//For the moment we have a single E-RAB which will be the one to be added to the gNB
//Not sure how to select bearers to be added if there are multiple.
X2AP_ENDC_SGNB_ADDITION_REQ
(
msg
).
nb_e_rabs_tobeadded
=
1
;
for
(
int
e_rab
=
0
;
e_rab
<
X2AP_ENDC_SGNB_ADDITION_REQ
(
msg
).
nb_e_rabs_tobeadded
;
e_rab
++
){
X2AP_ENDC_SGNB_ADDITION_REQ
(
msg
).
e_rabs_tobeadded
[
e_rab
].
e_rab_id
=
ue_context_pP
->
ue_context
.
e_rab
[
e_rab
].
param
.
e_rab_id
;
X2AP_ENDC_SGNB_ADDITION_REQ
(
msg
).
e_rabs_tobeadded
[
e_rab
].
gtp_teid
=
ue_context_pP
->
ue_context
.
e_rab
[
e_rab
].
param
.
gtp_teid
;
X2AP_ENDC_SGNB_ADDITION_REQ
(
msg
).
e_rabs_tobeadded
[
e_rab
].
drb_ID
=
1
;
memcpy
(
&
X2AP_ENDC_SGNB_ADDITION_REQ
(
msg
).
e_rabs_tobeadded
[
e_rab
].
sgw_addr
,
&
ue_context_pP
->
ue_context
.
e_rab
[
e_rab
].
param
.
sgw_addr
,
sizeof
(
transport_layer_addr_t
));
}
LOG_I
(
RRC
,
"[eNB %d] frame %d subframe %d: UE rnti %x switching to NSA mode
\n
"
,
ctxt_pP
->
module_id
,
ctxt_pP
->
frame
,
ctxt_pP
->
subframe
,
ctxt_pP
->
rnti
);
itti_send_msg_to_task
(
TASK_X2AP
,
ENB_MODULE_ID_TO_INSTANCE
(
ctxt_pP
->
module_id
),
msg
);
return
;
/** to add gNB as Secondary node CG-ConfigInfo to be added as per 36.423 r15 **/
if
(
encode_CG_ConfigInfo
(
enc_buf
,
sizeof
(
enc_buf
),
ue_context_pP
,
&
enc_size
)
==
RRC_OK
)
LOG_I
(
RRC
,
"CG-ConfigInfo encoded successfully
\n
"
);
msg
=
itti_alloc_new_message
(
TASK_RRC_ENB
,
X2AP_ENDC_SGNB_ADDITION_REQ
);
memset
(
&
(
X2AP_ENDC_SGNB_ADDITION_REQ
(
msg
)),
0
,
sizeof
(
x2ap_ENDC_sgnb_addition_req_t
));
X2AP_ENDC_SGNB_ADDITION_REQ
(
msg
).
rnti
=
ctxt_pP
->
rnti
;
memcpy
(
X2AP_ENDC_SGNB_ADDITION_REQ
(
msg
).
rrc_buffer
,
enc_buf
,
enc_size
);
X2AP_ENDC_SGNB_ADDITION_REQ
(
msg
).
rrc_buffer_size
=
enc_size
;
X2AP_ENDC_SGNB_ADDITION_REQ
(
msg
).
target_physCellId
=
measResults2
->
measResultNeighCells
->
choice
.
measResultListEUTRA
.
list
.
array
[
0
]
->
physCellId
;
//For the moment we have a single E-RAB which will be the one to be added to the gNB
//Not sure how to select bearers to be added if there are multiple.
X2AP_ENDC_SGNB_ADDITION_REQ
(
msg
).
nb_e_rabs_tobeadded
=
1
;
for
(
int
e_rab
=
0
;
e_rab
<
X2AP_ENDC_SGNB_ADDITION_REQ
(
msg
).
nb_e_rabs_tobeadded
;
e_rab
++
)
{
X2AP_ENDC_SGNB_ADDITION_REQ
(
msg
).
e_rabs_tobeadded
[
e_rab
].
e_rab_id
=
ue_context_pP
->
ue_context
.
e_rab
[
e_rab
].
param
.
e_rab_id
;
X2AP_ENDC_SGNB_ADDITION_REQ
(
msg
).
e_rabs_tobeadded
[
e_rab
].
gtp_teid
=
ue_context_pP
->
ue_context
.
e_rab
[
e_rab
].
param
.
gtp_teid
;
X2AP_ENDC_SGNB_ADDITION_REQ
(
msg
).
e_rabs_tobeadded
[
e_rab
].
drb_ID
=
1
;
memcpy
(
&
X2AP_ENDC_SGNB_ADDITION_REQ
(
msg
).
e_rabs_tobeadded
[
e_rab
].
sgw_addr
,
&
ue_context_pP
->
ue_context
.
e_rab
[
e_rab
].
param
.
sgw_addr
,
sizeof
(
transport_layer_addr_t
));
}
LOG_I
(
RRC
,
"[eNB %d] frame %d subframe %d: UE rnti %x switching to NSA mode
\n
"
,
ctxt_pP
->
module_id
,
ctxt_pP
->
frame
,
ctxt_pP
->
subframe
,
ctxt_pP
->
rnti
);
itti_send_msg_to_task
(
TASK_X2AP
,
ENB_MODULE_ID_TO_INSTANCE
(
ctxt_pP
->
module_id
),
msg
);
return
;
}
}
}
}
if
(
measResults2
->
measResultNeighCells
==
NULL
)
return
;
...
...
@@ -6340,6 +6298,7 @@ rrc_eNB_generate_HO_RRCConnectionReconfiguration(const protocol_ctxt_t *const ct
ue_context_pP
->
ue_context
.
e_rab
[
i
].
param
.
nas_pdu
.
buffer
=
NULL
;
}
}
LOG_I
(
RRC
,
"[eNB %d] Frame %d, Logical Channel DL-DCCH, Generate RRCConnectionReconfiguration handover (bytes %d, UE id %x)
\n
"
,
ctxt_pP
->
module_id
,
ctxt_pP
->
frame
,
size
,
ue_context_pP
->
ue_context
.
rnti
);
...
...
@@ -6510,10 +6469,8 @@ rrc_eNB_process_RRCConnectionReconfigurationComplete(
LTE_SRB_ToAddModList_t
*
SRB_configList
=
ue_context_pP
->
ue_context
.
SRB_configList2
[
xid
];
LTE_DRB_ToReleaseList_t
*
DRB_Release_configList2
=
ue_context_pP
->
ue_context
.
DRB_Release_configList2
[
xid
];
LTE_DRB_Identity_t
*
drb_id_p
=
NULL
;
ue_context_pP
->
ue_context
.
ue_reestablishment_timer
=
0
;
ue_context_pP
->
ue_context
.
ue_rrc_inactivity_timer
=
1
;
// reset rrc inactivity timer
/* CDRX: activated when RRC Connection Reconfiguration Complete is received */
rnti_t
rnti
=
ue_context_pP
->
ue_id_rnti
;
module_id_t
module_id
=
ctxt_pP
->
module_id
;
...
...
@@ -6534,8 +6491,8 @@ rrc_eNB_process_RRCConnectionReconfigurationComplete(
LOG_I
(
RRC
,
"CDRX configuration activated after RRC Connection Reconfiguration Complete reception
\n
"
);
}
}
/* End of CDRX processing */
/* End of CDRX processing */
T
(
T_ENB_RRC_CONNECTION_RECONFIGURATION_COMPLETE
,
T_INT
(
ctxt_pP
->
module_id
),
T_INT
(
ctxt_pP
->
frame
),
...
...
@@ -6796,7 +6753,6 @@ rrc_eNB_process_RRCConnectionReconfigurationComplete(
ue_context_pP
->
ue_context
.
nr_capabilities_requested
=
1
;
rrc_eNB_generate_NR_UECapabilityEnquiry
(
ctxt_pP
,
ue_context_pP
);
}
}
//-----------------------------------------------------------------------------
...
...
@@ -7619,33 +7575,34 @@ is_en_dc_supported(
*/
#define NCE nonCriticalExtension
return
c
!=
NULL
&&
c
->
NCE
!=
NULL
&&
c
->
NCE
->
NCE
!=
NULL
&&
c
->
NCE
->
NCE
->
NCE
!=
NULL
&&
c
->
NCE
->
NCE
->
NCE
->
NCE
!=
NULL
&&
c
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
!=
NULL
&&
c
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
!=
NULL
&&
c
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
!=
NULL
&&
c
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
!=
NULL
&&
c
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
!=
NULL
&&
c
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
!=
NULL
&&
c
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
!=
NULL
&&
c
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
!=
NULL
&&
c
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
!=
NULL
&&
c
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
!=
NULL
&&
c
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
!=
NULL
&&
c
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
!=
NULL
&&
c
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
!=
NULL
&&
c
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
!=
NULL
&&
c
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
!=
NULL
&&
c
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
!=
NULL
&&
c
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
!=
NULL
&&
c
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
!=
NULL
&&
c
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
!=
NULL
&&
c
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
!=
NULL
&&
c
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
irat_ParametersNR_r15
!=
NULL
&&
c
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
irat_ParametersNR_r15
->
en_DC_r15
!=
NULL
&&
*
c
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
irat_ParametersNR_r15
->
en_DC_r15
==
LTE_IRAT_ParametersNR_r15__en_DC_r15_supported
;
&&
c
->
NCE
!=
NULL
&&
c
->
NCE
->
NCE
!=
NULL
&&
c
->
NCE
->
NCE
->
NCE
!=
NULL
&&
c
->
NCE
->
NCE
->
NCE
->
NCE
!=
NULL
&&
c
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
!=
NULL
&&
c
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
!=
NULL
&&
c
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
!=
NULL
&&
c
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
!=
NULL
&&
c
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
!=
NULL
&&
c
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
!=
NULL
&&
c
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
!=
NULL
&&
c
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
!=
NULL
&&
c
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
!=
NULL
&&
c
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
!=
NULL
&&
c
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
!=
NULL
&&
c
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
!=
NULL
&&
c
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
!=
NULL
&&
c
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
!=
NULL
&&
c
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
!=
NULL
&&
c
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
!=
NULL
&&
c
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
!=
NULL
&&
c
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
!=
NULL
&&
c
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
!=
NULL
&&
c
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
!=
NULL
&&
c
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
irat_ParametersNR_r15
!=
NULL
&&
c
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
irat_ParametersNR_r15
->
en_DC_r15
!=
NULL
&&
*
c
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
NCE
->
irat_ParametersNR_r15
->
en_DC_r15
==
LTE_IRAT_ParametersNR_r15__en_DC_r15_supported
;
#undef NCE
}
...
...
@@ -7834,37 +7791,36 @@ rrc_eNB_decode_dcch(
//Looking for a condition to trigger S1AP E-RAB-Modification-indication, based on the reception of RRCConnectionReconfigurationComplete
//including NR specific elements. Not sure if this is the correct one and the correct placement
/*if(ul_dcch_msg->message.choice.c1.choice.rrcConnectionReconfigurationComplete.criticalExtensions.choice.rrcConnectionReconfigurationComplete_r8.
nonCriticalExtension->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension->
scg_ConfigResponseNR_r15->buf!=NULL){
//Trigger E-RAB Modification Indication
rrc_eNB_send_E_RAB_Modification_Indication(ctxt_pP, ue_context_p);
nonCriticalExtension->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension->
scg_ConfigResponseNR_r15->buf!=NULL){
//Trigger E-RAB Modification Indication
rrc_eNB_send_E_RAB_Modification_Indication(ctxt_pP, ue_context_p);
}*/
if
(
ul_dcch_msg
->
message
.
choice
.
c1
.
choice
.
rrcConnectionReconfigurationComplete
.
criticalExtensions
.
choice
.
rrcConnectionReconfigurationComplete_r8
.
nonCriticalExtension
!=
NULL
)
{
if
(
ul_dcch_msg
->
message
.
choice
.
c1
.
choice
.
rrcConnectionReconfigurationComplete
.
criticalExtensions
.
choice
.
rrcConnectionReconfigurationComplete_r8
.
nonCriticalExtension
->
nonCriticalExtension
!=
NULL
)
{
if
(
ul_dcch_msg
->
message
.
choice
.
c1
.
choice
.
rrcConnectionReconfigurationComplete
.
criticalExtensions
.
choice
.
rrcConnectionReconfigurationComplete_r8
.
nonCriticalExtension
->
nonCriticalExtension
->
nonCriticalExtension
!=
NULL
)
{
if
(
ul_dcch_msg
->
message
.
choice
.
c1
.
choice
.
rrcConnectionReconfigurationComplete
.
criticalExtensions
.
choice
.
rrcConnectionReconfigurationComplete_r8
.
nonCriticalExtension
->
nonCriticalExtension
->
nonCriticalExtension
->
nonCriticalExtension
!=
NULL
)
{
if
(
ul_dcch_msg
->
message
.
choice
.
c1
.
choice
.
rrcConnectionReconfigurationComplete
.
criticalExtensions
.
choice
.
rrcConnectionReconfigurationComplete_r8
.
nonCriticalExtension
->
nonCriticalExtension
->
nonCriticalExtension
->
nonCriticalExtension
->
nonCriticalExtension
!=
NULL
)
{
if
(
ul_dcch_msg
->
message
.
choice
.
c1
.
choice
.
rrcConnectionReconfigurationComplete
.
criticalExtensions
.
choice
.
rrcConnectionReconfigurationComplete_r8
.
nonCriticalExtension
->
nonCriticalExtension
->
nonCriticalExtension
->
nonCriticalExtension
->
nonCriticalExtension
->
nonCriticalExtension
!=
NULL
)
{
if
(
ul_dcch_msg
->
message
.
choice
.
c1
.
choice
.
rrcConnectionReconfigurationComplete
.
criticalExtensions
.
choice
.
rrcConnectionReconfigurationComplete_r8
.
nonCriticalExtension
->
nonCriticalExtension
->
nonCriticalExtension
->
nonCriticalExtension
->
nonCriticalExtension
->
nonCriticalExtension
->
scg_ConfigResponseNR_r15
!=
NULL
)
{
/*Trigger E-RAB Modification Indication */
rrc_eNB_send_E_RAB_Modification_Indication
(
ctxt_pP
,
ue_context_p
);
}
}
}
}
}
}
nonCriticalExtension
!=
NULL
)
{
if
(
ul_dcch_msg
->
message
.
choice
.
c1
.
choice
.
rrcConnectionReconfigurationComplete
.
criticalExtensions
.
choice
.
rrcConnectionReconfigurationComplete_r8
.
nonCriticalExtension
->
nonCriticalExtension
!=
NULL
)
{
if
(
ul_dcch_msg
->
message
.
choice
.
c1
.
choice
.
rrcConnectionReconfigurationComplete
.
criticalExtensions
.
choice
.
rrcConnectionReconfigurationComplete_r8
.
nonCriticalExtension
->
nonCriticalExtension
->
nonCriticalExtension
!=
NULL
)
{
if
(
ul_dcch_msg
->
message
.
choice
.
c1
.
choice
.
rrcConnectionReconfigurationComplete
.
criticalExtensions
.
choice
.
rrcConnectionReconfigurationComplete_r8
.
nonCriticalExtension
->
nonCriticalExtension
->
nonCriticalExtension
->
nonCriticalExtension
!=
NULL
)
{
if
(
ul_dcch_msg
->
message
.
choice
.
c1
.
choice
.
rrcConnectionReconfigurationComplete
.
criticalExtensions
.
choice
.
rrcConnectionReconfigurationComplete_r8
.
nonCriticalExtension
->
nonCriticalExtension
->
nonCriticalExtension
->
nonCriticalExtension
->
nonCriticalExtension
!=
NULL
)
{
if
(
ul_dcch_msg
->
message
.
choice
.
c1
.
choice
.
rrcConnectionReconfigurationComplete
.
criticalExtensions
.
choice
.
rrcConnectionReconfigurationComplete_r8
.
nonCriticalExtension
->
nonCriticalExtension
->
nonCriticalExtension
->
nonCriticalExtension
->
nonCriticalExtension
->
nonCriticalExtension
!=
NULL
)
{
if
(
ul_dcch_msg
->
message
.
choice
.
c1
.
choice
.
rrcConnectionReconfigurationComplete
.
criticalExtensions
.
choice
.
rrcConnectionReconfigurationComplete_r8
.
nonCriticalExtension
->
nonCriticalExtension
->
nonCriticalExtension
->
nonCriticalExtension
->
nonCriticalExtension
->
nonCriticalExtension
->
scg_ConfigResponseNR_r15
!=
NULL
)
{
/*Trigger E-RAB Modification Indication */
rrc_eNB_send_E_RAB_Modification_Indication
(
ctxt_pP
,
ue_context_p
);
}
}
}
}
}
}
}
}
else
{
dedicated_DRB
=
1
;
ue_context_p
->
ue_context
.
Status
=
RRC_RECONFIGURED
;
...
...
@@ -8212,15 +8168,74 @@ rrc_eNB_decode_dcch(
}
LOG_I
(
RRC
,
"got UE capabilities for UE %x
\n
"
,
ctxt_pP
->
rnti
);
int
eutra_index
=
-
1
;
for
(
i
=
0
;
i
<
ul_dcch_msg
->
message
.
choice
.
c1
.
choice
.
ueCapabilityInformation
.
criticalExtensions
.
choice
.
c1
.
choice
.
ueCapabilityInformation_r8
.
ue_CapabilityRAT_ContainerList
.
list
.
count
;
i
++
)
{
if
(
ul_dcch_msg
->
message
.
choice
.
c1
.
choice
.
ueCapabilityInformation
.
criticalExtensions
.
choice
.
c1
.
choice
.
ueCapabilityInformation_r8
.
ue_CapabilityRAT_ContainerList
.
list
.
array
[
i
]
->
rat_Type
==
LTE_RAT_Type_eutra
)
{
if
(
ul_dcch_msg
->
message
.
choice
.
c1
.
choice
.
ueCapabilityInformation
.
criticalExtensions
.
choice
.
c1
.
choice
.
ueCapabilityInformation_r8
.
ue_CapabilityRAT_ContainerList
.
list
.
array
[
i
]
->
rat_Type
==
LTE_RAT_Type_nr
)
{
if
(
ue_context_p
->
ue_context
.
UE_Capability_nr
)
{
ASN_STRUCT_FREE
(
asn_DEF_NR_UE_NR_Capability
,
ue_context_p
->
ue_context
.
UE_Capability_nr
);
ue_context_p
->
ue_context
.
UE_Capability_nr
=
0
;
}
dec_rval
=
uper_decode
(
NULL
,
&
asn_DEF_NR_UE_NR_Capability
,
(
void
**
)
&
ue_context_p
->
ue_context
.
UE_Capability_nr
,
ul_dcch_msg
->
message
.
choice
.
c1
.
choice
.
ueCapabilityInformation
.
criticalExtensions
.
choice
.
c1
.
choice
.
ueCapabilityInformation_r8
.
ue_CapabilityRAT_ContainerList
.
list
.
array
[
i
]
->
ueCapabilityRAT_Container
.
buf
,
ul_dcch_msg
->
message
.
choice
.
c1
.
choice
.
ueCapabilityInformation
.
criticalExtensions
.
choice
.
c1
.
choice
.
ueCapabilityInformation_r8
.
ue_CapabilityRAT_ContainerList
.
list
.
array
[
i
]
->
ueCapabilityRAT_Container
.
size
,
0
,
0
);
if
(
LOG_DEBUGFLAG
(
DEBUG_ASN1
))
{
xer_fprint
(
stdout
,
&
asn_DEF_NR_UE_NR_Capability
,
ue_context_p
->
ue_context
.
UE_Capability_nr
);
}
if
((
dec_rval
.
code
!=
RC_OK
)
&&
(
dec_rval
.
consumed
==
0
))
{
LOG_E
(
RRC
,
PROTOCOL_RRC_CTXT_UE_FMT
" Failed to decode nr UE capabilities (%zu bytes)
\n
"
,
PROTOCOL_RRC_CTXT_UE_ARGS
(
ctxt_pP
),
dec_rval
.
consumed
);
ASN_STRUCT_FREE
(
asn_DEF_NR_UE_NR_Capability
,
ue_context_p
->
ue_context
.
UE_Capability_nr
);
ue_context_p
->
ue_context
.
UE_Capability_nr
=
0
;
}
ue_context_p
->
ue_context
.
UE_NR_Capability_size
=
ul_dcch_msg
->
message
.
choice
.
c1
.
choice
.
ueCapabilityInformation
.
criticalExtensions
.
choice
.
c1
.
choice
.
ueCapabilityInformation_r8
.
ue_CapabilityRAT_ContainerList
.
list
.
array
[
i
]
->
ueCapabilityRAT_Container
.
size
;
}
if
(
ul_dcch_msg
->
message
.
choice
.
c1
.
choice
.
ueCapabilityInformation
.
criticalExtensions
.
choice
.
c1
.
choice
.
ueCapabilityInformation_r8
.
ue_CapabilityRAT_ContainerList
.
list
.
array
[
i
]
->
rat_Type
==
LTE_RAT_Type_eutra_nr
)
{
if
(
ue_context_p
->
ue_context
.
UE_Capability_MRDC
)
{
ASN_STRUCT_FREE
(
asn_DEF_NR_UE_MRDC_Capability
,
ue_context_p
->
ue_context
.
UE_Capability_MRDC
);
ue_context_p
->
ue_context
.
UE_Capability_MRDC
=
0
;
}
dec_rval
=
uper_decode
(
NULL
,
&
asn_DEF_NR_UE_MRDC_Capability
,
(
void
**
)
&
ue_context_p
->
ue_context
.
UE_Capability_MRDC
,
ul_dcch_msg
->
message
.
choice
.
c1
.
choice
.
ueCapabilityInformation
.
criticalExtensions
.
choice
.
c1
.
choice
.
ueCapabilityInformation_r8
.
ue_CapabilityRAT_ContainerList
.
list
.
array
[
i
]
->
ueCapabilityRAT_Container
.
buf
,
ul_dcch_msg
->
message
.
choice
.
c1
.
choice
.
ueCapabilityInformation
.
criticalExtensions
.
choice
.
c1
.
choice
.
ueCapabilityInformation_r8
.
ue_CapabilityRAT_ContainerList
.
list
.
array
[
i
]
->
ueCapabilityRAT_Container
.
size
,
0
,
0
);
if
(
LOG_DEBUGFLAG
(
DEBUG_ASN1
))
{
xer_fprint
(
stdout
,
&
asn_DEF_NR_UE_MRDC_Capability
,
ue_context_p
->
ue_context
.
UE_Capability_MRDC
);
}
if
((
dec_rval
.
code
!=
RC_OK
)
&&
(
dec_rval
.
consumed
==
0
))
{
LOG_E
(
RRC
,
PROTOCOL_RRC_CTXT_UE_FMT
" Failed to decode MRDC UE capabilities (%zu bytes)
\n
"
,
PROTOCOL_RRC_CTXT_UE_ARGS
(
ctxt_pP
),
dec_rval
.
consumed
);
ASN_STRUCT_FREE
(
asn_DEF_NR_UE_MRDC_Capability
,
ue_context_p
->
ue_context
.
UE_Capability_MRDC
);
ue_context_p
->
ue_context
.
UE_Capability_MRDC
=
0
;
}
ue_context_p
->
ue_context
.
UE_MRDC_Capability_size
=
ul_dcch_msg
->
message
.
choice
.
c1
.
choice
.
ueCapabilityInformation
.
criticalExtensions
.
choice
.
c1
.
choice
.
ueCapabilityInformation_r8
.
ue_CapabilityRAT_ContainerList
.
list
.
array
[
i
]
->
ueCapabilityRAT_Container
.
size
;
}
if
(
ul_dcch_msg
->
message
.
choice
.
c1
.
choice
.
ueCapabilityInformation
.
criticalExtensions
.
choice
.
c1
.
choice
.
ueCapabilityInformation_r8
.
ue_CapabilityRAT_ContainerList
.
list
.
array
[
i
]
->
rat_Type
==
LTE_RAT_Type_eutra
)
{
if
(
eutra_index
!=
-
1
)
{
LOG_E
(
RRC
,
"fatal: more than 1 eutra capability
\n
"
);
exit
(
1
);
}
eutra_index
=
i
;
}
}
...
...
@@ -8242,7 +8257,8 @@ rrc_eNB_decode_dcch(
ul_dcch_msg
->
message
.
choice
.
c1
.
choice
.
ueCapabilityInformation
.
criticalExtensions
.
choice
.
c1
.
choice
.
ueCapabilityInformation_r8
.
ue_CapabilityRAT_ContainerList
.
list
.
array
[
eutra_index
]
->
ueCapabilityRAT_Container
.
buf
,
ul_dcch_msg
->
message
.
choice
.
c1
.
choice
.
ueCapabilityInformation
.
criticalExtensions
.
choice
.
c1
.
choice
.
ueCapabilityInformation_r8
.
ue_CapabilityRAT_ContainerList
.
list
.
array
[
eutra_index
]
->
ueCapabilityRAT_Container
.
size
,
0
,
0
);
ue_context_p
->
ue_context
.
UE_Capability_size
=
ul_dcch_msg
->
message
.
choice
.
c1
.
choice
.
ueCapabilityInformation
.
criticalExtensions
.
choice
.
c1
.
choice
.
ueCapabilityInformation_r8
.
ue_CapabilityRAT_ContainerList
.
list
.
array
[
eutra_index
]
->
ueCapabilityRAT_Container
.
size
;
ue_context_p
->
ue_context
.
UE_Capability_size
=
ul_dcch_msg
->
message
.
choice
.
c1
.
choice
.
ueCapabilityInformation
.
criticalExtensions
.
choice
.
c1
.
choice
.
ueCapabilityInformation_r8
.
ue_CapabilityRAT_ContainerList
.
list
.
array
[
eutra_index
]
->
ueCapabilityRAT_Container
.
size
;
if
(
LOG_DEBUGFLAG
(
DEBUG_ASN1
)
)
{
xer_fprint
(
stdout
,
&
asn_DEF_LTE_UE_EUTRA_Capability
,
ue_context_p
->
ue_context
.
UE_Capability
);
...
...
@@ -8961,117 +8977,109 @@ void rrc_subframe_process(protocol_ctxt_t *const ctxt_pP, const int CC_id) {
}
void
rrc_eNB_process_AdditionResponseInformation
(
const
module_id_t
enb_mod_idP
,
x2ap_ENDC_sgnb_addition_req_ACK_t
*
m
)
{
NR_CG_Config_t
*
CG_Config
=
NULL
;
{
int
i
;
printf
(
"%d: "
,
m
->
rrc_buffer_size
);
for
(
i
=
0
;
i
<
m
->
rrc_buffer_size
;
i
++
)
printf
(
"%2.2x"
,
(
unsigned
char
)
m
->
rrc_buffer
[
i
]);
NR_CG_Config_t
*
CG_Config
=
NULL
;
printf
(
"
\n
"
);
}
asn_dec_rval_t
dec_rval
=
uper_decode_complete
(
NULL
,
&
asn_DEF_NR_CG_Config
,
(
void
**
)
&
CG_Config
,
(
uint8_t
*
)
m
->
rrc_buffer
,
(
int
)
m
->
rrc_buffer_size
);
//m->rrc_buffer_size);
{
int
i
;
printf
(
"%d: "
,
m
->
rrc_buffer_size
);
for
(
i
=
0
;
i
<
m
->
rrc_buffer_size
;
i
++
)
printf
(
"%2.2x"
,
(
unsigned
char
)
m
->
rrc_buffer
[
i
]);
printf
(
"
\n
"
);
if
((
dec_rval
.
code
!=
RC_OK
)
&&
(
dec_rval
.
consumed
==
0
))
{
AssertFatal
(
1
==
0
,
"NR_UL_DCCH_MESSAGE decode error
\n
"
);
// free the memory
SEQUENCE_free
(
&
asn_DEF_NR_CG_Config
,
CG_Config
,
1
);
return
;
}
}
asn_dec_rval_t
dec_rval
=
uper_decode_complete
(
NULL
,
&
asn_DEF_NR_CG
_Config
,
(
void
**
)
&
CG_Config
,
(
uint8_t
*
)
m
->
rrc_buffer
,
(
int
)
m
->
rrc_buffer_size
);
//m->rrc_buffer_size)
;
xer_fprint
(
stdout
,
&
asn_DEF_NR_CG_Config
,
CG_Config
);
// recreate enough of X2 EN-DC Container
AssertFatal
(
CG_Config
->
criticalExtensions
.
choice
.
c1
->
present
==
NR_CG_Config__criticalExtensions__c1_PR_cg
_Config
,
"CG_Config not present
\n
"
);
OCTET_STRING_t
*
scg_CellGroupConfig
=
NULL
;
OCTET_STRING_t
*
nr1_conf
=
NULL
;
if
((
dec_rval
.
code
!=
RC_OK
)
&&
(
dec_rval
.
consumed
==
0
))
{
AssertFatal
(
1
==
0
,
"NR_UL_DCCH_MESSAGE decode error
\n
"
);
// free the memory
SEQUENCE_free
(
&
asn_DEF_NR_CG_Config
,
CG_Config
,
1
);
return
;
}
xer_fprint
(
stdout
,
&
asn_DEF_NR_CG_Config
,
CG_Config
);
// recreate enough of X2 EN-DC Container
if
(
CG_Config
->
criticalExtensions
.
choice
.
c1
->
choice
.
cg_Config
->
scg_CellGroupConfig
)
{
scg_CellGroupConfig
=
CG_Config
->
criticalExtensions
.
choice
.
c1
->
choice
.
cg_Config
->
scg_CellGroupConfig
;
#ifdef DEBUG_SCG_CONFIG
{
int
size_s
=
CG_Config
->
criticalExtensions
.
choice
.
c1
->
choice
.
cg_Config
->
scg_CellGroupConfig
->
size
;
int
i
;
LOG_I
(
RRC
,
"Dumping scg_CellGroupConfig: %d"
,
size_s
);
AssertFatal
(
CG_Config
->
criticalExtensions
.
choice
.
c1
->
present
==
NR_CG_Config__criticalExtensions__c1_PR_cg_Config
,
"CG_Config not present
\n
"
);
for
(
i
=
0
;
i
<
size_s
;
i
++
)
printf
(
"%2.2x"
,
(
unsigned
char
)
CG_Config
->
criticalExtensions
.
choice
.
c1
->
choice
.
cg_Config
->
scg_CellGroupConfig
->
buf
[
i
]);
OCTET_STRING_t
*
scg_CellGroupConfig
=
NULL
;
OCTET_STRING_t
*
nr1_conf
=
NULL
;
printf
(
"
\n
"
);
}
#endif
}
else
{
LOG_W
(
RRC
,
"SCG Cell group configuration is not present in the Addition Response message
\n
"
);
return
;
}
if
(
CG_Config
->
criticalExtensions
.
choice
.
c1
->
choice
.
cg_Config
->
scg_CellGroupConfig
)
{
scg_CellGroupConfig
=
CG_Config
->
criticalExtensions
.
choice
.
c1
->
choice
.
cg_Config
->
scg_CellGroup
Config
;
if
(
CG_Config
->
criticalExtensions
.
choice
.
c1
->
choice
.
cg_Config
->
scg_RB_Config
)
{
nr1_conf
=
CG_Config
->
criticalExtensions
.
choice
.
c1
->
choice
.
cg_Config
->
scg_RB_
Config
;
#ifdef DEBUG_SCG_CONFIG
{
int
size_s
=
CG_Config
->
criticalExtensions
.
choice
.
c1
->
choice
.
cg_Config
->
scg_CellGroupConfig
->
size
;
int
i
;
LOG_I
(
RRC
,
"Dumping scg_CellGroupConfig: %d"
,
size_s
);
for
(
i
=
0
;
i
<
size_s
;
i
++
)
printf
(
"%2.2x"
,
(
unsigned
char
)
CG_Config
->
criticalExtensions
.
choice
.
c1
->
choice
.
cg_Config
->
scg_CellGroupConfig
->
buf
[
i
]);
printf
(
"
\n
"
);
}
#endif
{
int
size_s
=
CG_Config
->
criticalExtensions
.
choice
.
c1
->
choice
.
cg_Config
->
scg_RB_Config
->
size
;
int
i
;
LOG_I
(
RRC
,
"Dumping scg_RB_Config: %d"
,
size_s
);
for
(
i
=
0
;
i
<
size_s
;
i
++
)
printf
(
"%2.2x"
,
(
unsigned
char
)
CG_Config
->
criticalExtensions
.
choice
.
c1
->
choice
.
cg_Config
->
scg_RB_Config
->
buf
[
i
]);
printf
(
"
\n
"
);
}
else
{
LOG_W
(
RRC
,
"SCG Cell group configuration is not present in the Addition Response message
\n
"
);
return
;
}
if
(
CG_Config
->
criticalExtensions
.
choice
.
c1
->
choice
.
cg_Config
->
scg_RB_Config
){
nr1_conf
=
CG_Config
->
criticalExtensions
.
choice
.
c1
->
choice
.
cg_Config
->
scg_RB_Config
;
#ifdef DEBUG_SCG_CONFIG
{
int
size_s
=
CG_Config
->
criticalExtensions
.
choice
.
c1
->
choice
.
cg_Config
->
scg_RB_Config
->
size
;
int
i
;
LOG_I
(
RRC
,
"Dumping scg_RB_Config: %d"
,
size_s
);
for
(
i
=
0
;
i
<
size_s
;
i
++
)
printf
(
"%2.2x"
,
(
unsigned
char
)
CG_Config
->
criticalExtensions
.
choice
.
c1
->
choice
.
cg_Config
->
scg_RB_Config
->
buf
[
i
]);
printf
(
"
\n
"
);
}
#endif
}
else
{
LOG_W
(
RRC
,
"SCG RB configuration is not present in the Addition Response message
\n
"
);
return
;
}
}
else
{
LOG_W
(
RRC
,
"SCG RB configuration is not present in the Addition Response message
\n
"
);
return
;
}
protocol_ctxt_t
ctxt
;
rrc_eNB_ue_context_t
*
ue_context
;
unsigned
char
buffer
[
8192
];
int
size
;
ue_context
=
rrc_eNB_get_ue_context
(
RC
.
rrc
[
enb_mod_idP
],
m
->
rnti
);
ue_context
->
ue_context
.
nb_of_modify_endc_e_rabs
=
m
->
nb_e_rabs_admitted_tobeadded
;
int
j
=
0
;
while
(
j
<
m
->
nb_e_rabs_admitted_tobeadded
){
for
(
int
e_rab_idx
=
0
;
e_rab_idx
<
ue_context
->
ue_context
.
setup_e_rabs
;
e_rab_idx
++
){
//Update ue_context information with gNB's address and new GTP tunnel ID
if
(
ue_context
->
ue_context
.
e_rab
[
e_rab_idx
].
param
.
e_rab_id
==
m
->
e_rabs_admitted_tobeadded
[
j
].
e_rab_id
){
memcpy
(
ue_context
->
ue_context
.
gnb_gtp_endc_addrs
[
e_rab_idx
].
buffer
,
m
->
e_rabs_admitted_tobeadded
[
j
].
gnb_addr
.
buffer
,
m
->
e_rabs_admitted_tobeadded
[
j
].
gnb_addr
.
length
);
ue_context
->
ue_context
.
gnb_gtp_endc_addrs
[
e_rab_idx
].
length
=
m
->
e_rabs_admitted_tobeadded
[
j
].
gnb_addr
.
length
;
ue_context
->
ue_context
.
gnb_gtp_endc_teid
[
e_rab_idx
]
=
m
->
e_rabs_admitted_tobeadded
[
j
].
gtp_teid
;
ue_context
->
ue_context
.
e_rab
[
e_rab_idx
].
status
=
E_RAB_STATUS_TOMODIFY
;
break
;
}
}
j
++
;
protocol_ctxt_t
ctxt
;
rrc_eNB_ue_context_t
*
ue_context
;
unsigned
char
buffer
[
8192
];
int
size
;
ue_context
=
rrc_eNB_get_ue_context
(
RC
.
rrc
[
enb_mod_idP
],
m
->
rnti
);
ue_context
->
ue_context
.
nb_of_modify_endc_e_rabs
=
m
->
nb_e_rabs_admitted_tobeadded
;
int
j
=
0
;
while
(
j
<
m
->
nb_e_rabs_admitted_tobeadded
)
{
for
(
int
e_rab_idx
=
0
;
e_rab_idx
<
ue_context
->
ue_context
.
setup_e_rabs
;
e_rab_idx
++
)
{
//Update ue_context information with gNB's address and new GTP tunnel ID
if
(
ue_context
->
ue_context
.
e_rab
[
e_rab_idx
].
param
.
e_rab_id
==
m
->
e_rabs_admitted_tobeadded
[
j
].
e_rab_id
)
{
memcpy
(
ue_context
->
ue_context
.
gnb_gtp_endc_addrs
[
e_rab_idx
].
buffer
,
m
->
e_rabs_admitted_tobeadded
[
j
].
gnb_addr
.
buffer
,
m
->
e_rabs_admitted_tobeadded
[
j
].
gnb_addr
.
length
);
ue_context
->
ue_context
.
gnb_gtp_endc_addrs
[
e_rab_idx
].
length
=
m
->
e_rabs_admitted_tobeadded
[
j
].
gnb_addr
.
length
;
ue_context
->
ue_context
.
gnb_gtp_endc_teid
[
e_rab_idx
]
=
m
->
e_rabs_admitted_tobeadded
[
j
].
gtp_teid
;
ue_context
->
ue_context
.
e_rab
[
e_rab_idx
].
status
=
E_RAB_STATUS_TOMODIFY
;
break
;
}
}
j
++
;
}
PROTOCOL_CTXT_SET_BY_INSTANCE
(
&
ctxt
,
0
,
ENB_FLAG_YES
,
m
->
rnti
,
0
,
0
);
size
=
rrc_eNB_generate_RRCConnectionReconfiguration_endc
(
&
ctxt
,
ue_context
,
buffer
,
8192
,
scg_CellGroupConfig
,
nr1_conf
);
rrc_data_req
(
&
ctxt
,
DCCH
,
rrc_eNB_mui
++
,
SDU_CONFIRM_NO
,
size
,
buffer
,
PDCP_TRANSMISSION_MODE_CONTROL
);
PROTOCOL_CTXT_SET_BY_INSTANCE
(
&
ctxt
,
0
,
ENB_FLAG_YES
,
m
->
rnti
,
0
,
0
);
size
=
rrc_eNB_generate_RRCConnectionReconfiguration_endc
(
&
ctxt
,
ue_context
,
buffer
,
8192
,
scg_CellGroupConfig
,
nr1_conf
);
rrc_data_req
(
&
ctxt
,
DCCH
,
rrc_eNB_mui
++
,
SDU_CONFIRM_NO
,
size
,
buffer
,
PDCP_TRANSMISSION_MODE_CONTROL
);
}
...
...
@@ -9354,11 +9362,10 @@ void *rrc_enb_process_itti_msg(void *notUsed) {
}
case
X2AP_ENDC_SGNB_ADDITION_REQ_ACK
:
{
rrc_eNB_process_AdditionResponseInformation
(
ENB_INSTANCE_TO_MODULE_ID
(
instance
),
&
X2AP_ENDC_SGNB_ADDITION_REQ_ACK
(
msg_p
));
break
;
rrc_eNB_process_AdditionResponseInformation
(
ENB_INSTANCE_TO_MODULE_ID
(
instance
),
&
X2AP_ENDC_SGNB_ADDITION_REQ_ACK
(
msg_p
));
break
;
}
/* Messages from eNB app */
case
RRC_CONFIGURATION_REQ
:
LOG_I
(
RRC
,
"[eNB %d] Received %s : %p
\n
"
,
instance
,
msg_name_p
,
&
RRC_CONFIGURATION_REQ
(
msg_p
));
...
...
@@ -9378,36 +9385,36 @@ void *rrc_enb_process_itti_msg(void *notUsed) {
break
;
case
M2AP_SETUP_RESP
:
rrc_eNB_process_M2AP_SETUP_RESP
(
&
ctxt
,
0
/*CC_id*/
,
ENB_INSTANCE_TO_MODULE_ID
(
instance
),
&
M2AP_SETUP_RESP
(
msg_p
));
rrc_eNB_process_M2AP_SETUP_RESP
(
&
ctxt
,
0
/*CC_id*/
,
ENB_INSTANCE_TO_MODULE_ID
(
instance
),
&
M2AP_SETUP_RESP
(
msg_p
));
break
;
case
M2AP_MBMS_SCHEDULING_INFORMATION
:
rrc_eNB_process_M2AP_MBMS_SCHEDULING_INFORMATION
(
&
ctxt
,
0
/*CC_id*/
,
ENB_INSTANCE_TO_MODULE_ID
(
instance
),
&
M2AP_MBMS_SCHEDULING_INFORMATION
(
msg_p
));
break
;
rrc_eNB_process_M2AP_MBMS_SCHEDULING_INFORMATION
(
&
ctxt
,
0
/*CC_id*/
,
ENB_INSTANCE_TO_MODULE_ID
(
instance
),
&
M2AP_MBMS_SCHEDULING_INFORMATION
(
msg_p
));
break
;
case
M2AP_MBMS_SESSION_START_REQ
:
rrc_eNB_process_M2AP_MBMS_SESSION_START_REQ
(
&
ctxt
,
0
/*CC_id*/
,
ENB_INSTANCE_TO_MODULE_ID
(
instance
),
&
M2AP_MBMS_SESSION_START_REQ
(
msg_p
));
break
;
rrc_eNB_process_M2AP_MBMS_SESSION_START_REQ
(
&
ctxt
,
0
/*CC_id*/
,
ENB_INSTANCE_TO_MODULE_ID
(
instance
),
&
M2AP_MBMS_SESSION_START_REQ
(
msg_p
));
break
;
case
M2AP_MBMS_SESSION_STOP_REQ
:
rrc_eNB_process_M2AP_MBMS_SESSION_STOP_REQ
(
&
ctxt
,
&
M2AP_MBMS_SESSION_STOP_REQ
(
msg_p
));
break
;
rrc_eNB_process_M2AP_MBMS_SESSION_STOP_REQ
(
&
ctxt
,
&
M2AP_MBMS_SESSION_STOP_REQ
(
msg_p
));
break
;
case
M2AP_RESET
:
rrc_eNB_process_M2AP_RESET
(
&
ctxt
,
&
M2AP_RESET
(
msg_p
));
break
;
rrc_eNB_process_M2AP_RESET
(
&
ctxt
,
&
M2AP_RESET
(
msg_p
));
break
;
case
M2AP_ENB_CONFIGURATION_UPDATE_ACK
:
rrc_eNB_process_M2AP_ENB_CONFIGURATION_UPDATE_ACK
(
&
ctxt
,
&
M2AP_ENB_CONFIGURATION_UPDATE_ACK
(
msg_p
));
break
;
rrc_eNB_process_M2AP_ENB_CONFIGURATION_UPDATE_ACK
(
&
ctxt
,
&
M2AP_ENB_CONFIGURATION_UPDATE_ACK
(
msg_p
));
break
;
case
M2AP_ERROR_INDICATION
:
rrc_eNB_process_M2AP_ERROR_INDICATION
(
&
ctxt
,
&
M2AP_ERROR_INDICATION
(
msg_p
));
break
;
rrc_eNB_process_M2AP_ERROR_INDICATION
(
&
ctxt
,
&
M2AP_ERROR_INDICATION
(
msg_p
));
break
;
case
M2AP_MBMS_SERVICE_COUNTING_REQ
:
rrc_eNB_process_M2AP_MBMS_SERVICE_COUNTING_REQ
(
&
ctxt
,
&
M2AP_MBMS_SERVICE_COUNTING_REQ
(
msg_p
));
break
;
rrc_eNB_process_M2AP_MBMS_SERVICE_COUNTING_REQ
(
&
ctxt
,
&
M2AP_MBMS_SERVICE_COUNTING_REQ
(
msg_p
));
break
;
case
M2AP_MCE_CONFIGURATION_UPDATE
:
rrc_eNB_process_M2AP_MCE_CONFIGURATION_UPDATE
(
&
ctxt
,
&
M2AP_MCE_CONFIGURATION_UPDATE
(
msg_p
));
...
...
@@ -9444,17 +9451,16 @@ rrc_enb_task(
//-----------------------------------------------------------------------------
{
rrc_enb_init
();
itti_mark_task_ready
(
TASK_RRC_ENB
);
LOG_I
(
RRC
,
"Entering main loop of RRC message task
\n
"
);
while
(
1
)
{
(
void
)
rrc_enb_process_itti_msg
(
NULL
);
{
//extern volatile int go_nr;
void
rrc_go_nr
(
void
);
//if (go_nr) rrc_go_nr();
}
{
//extern volatile int go_nr;
void
rrc_go_nr
(
void
);
//if (go_nr) rrc_go_nr();
}
}
}
...
...
openair2/RRC/NR/rrc_gNB.c
View file @
defea03a
...
...
@@ -95,12 +95,10 @@ mui_t rrc_gNB_mui = 0;
void
openair_nr_rrc_on
(
const
protocol_ctxt_t
*
const
ctxt_pP
)
{
LOG_I
(
NR_RRC
,
PROTOCOL_NR_RRC_CTXT_FMT
" gNB:OPENAIR NR RRC IN....
\n
"
,
PROTOCOL_NR_RRC_CTXT_ARGS
(
ctxt_pP
));
rrc_config_nr_buffer
(
&
RC
.
nrrrc
[
ctxt_pP
->
module_id
]
->
carrier
.
SI
,
BCCH
,
1
);
RC
.
nrrrc
[
ctxt_pP
->
module_id
]
->
carrier
.
SI
.
Active
=
1
;
rrc_config_nr_buffer
(
&
RC
.
nrrrc
[
ctxt_pP
->
module_id
]
->
carrier
.
Srb0
,
CCCH
,
1
);
RC
.
nrrrc
[
ctxt_pP
->
module_id
]
->
carrier
.
Srb0
.
Active
=
1
;
}
///---------------------------------------------------------------------------------------------------------------///
...
...
@@ -173,7 +171,6 @@ void rrc_gNB_generate_SgNBAdditionRequestAcknowledge(
ue_context_pP
->
ue_context
.
primaryCC_id
,
physicalCellGroupConfig
,
physicalcellgroup_config
);
do_SpCellConfig
(
RC
.
nrrrc
[
ctxt_pP
->
module_id
],
spCellConfig
);
}
...
...
@@ -182,57 +179,47 @@ void rrc_gNB_generate_SgNBAdditionRequestAcknowledge(
///---------------------------------------------------------------------------------------------------------------///
static
void
init_NR_SI
(
gNB_RRC_INST
*
rrc
)
{
LOG_D
(
RRC
,
"%s()
\n\n\n\n
"
,
__FUNCTION__
);
rrc
->
carrier
.
MIB
=
(
uint8_t
*
)
malloc16
(
4
);
rrc
->
carrier
.
MIB
=
(
uint8_t
*
)
malloc16
(
4
);
rrc
->
carrier
.
sizeof_MIB
=
do_MIB_NR
(
rrc
,
0
);
LOG_I
(
NR_RRC
,
"Done init_NR_SI
\n
"
);
rrc_mac_config_req_gNB
(
rrc
->
module_id
,
rrc
->
carrier
.
ssb_SubcarrierOffset
,
rrc
->
carrier
.
ssb_SubcarrierOffset
,
rrc
->
carrier
.
pdsch_AntennaPorts
,
(
NR_ServingCellConfigCommon_t
*
)
rrc
->
carrier
.
servingcellconfigcommon
,
0
,
0
,
// WIP hardcoded rnti
(
NR_CellGroupConfig_t
*
)
NULL
);
0
,
0
,
// WIP hardcoded rnti
(
NR_CellGroupConfig_t
*
)
NULL
);
if
(
get_softmodem_params
()
->
phy_test
>
0
||
get_softmodem_params
()
->
do_ra
>
0
)
{
// This is for phytest only, emulate first X2 message if uecap.raw file is present
FILE
*
fd
;
fd
=
fopen
(
"uecap.raw"
,
"r"
);
if
(
fd
!=
NULL
)
{
char
buffer
[
4096
];
int
msg_len
=
fread
(
buffer
,
1
,
4096
,
fd
);
LOG_I
(
RRC
,
"Read in %d bytes for uecap
\n
"
,
msg_len
);
LTE_UL_DCCH_Message_t
*
LTE_UL_DCCH_Message
;
asn_dec_rval_t
dec_rval
=
uper_decode_complete
(
NULL
,
&
asn_DEF_LTE_UL_DCCH_Message
,
(
void
**
)
&
LTE_UL_DCCH_Message
,
(
uint8_t
*
)
buffer
,
msg_len
);
&
asn_DEF_LTE_UL_DCCH_Message
,
(
void
**
)
&
LTE_UL_DCCH_Message
,
(
uint8_t
*
)
buffer
,
msg_len
);
if
((
dec_rval
.
code
!=
RC_OK
)
&&
(
dec_rval
.
consumed
==
0
))
{
AssertFatal
(
1
==
0
,
"NR_UL_DCCH_MESSAGE decode error
\n
"
);
// free the memory
SEQUENCE_free
(
&
asn_DEF_LTE_UL_DCCH_Message
,
LTE_UL_DCCH_Message
,
1
);
return
;
}
// free the memory
SEQUENCE_free
(
&
asn_DEF_LTE_UL_DCCH_Message
,
LTE_UL_DCCH_Message
,
1
);
return
;
}
fclose
(
fd
);
xer_fprint
(
stdout
,
&
asn_DEF_LTE_UL_DCCH_Message
,
LTE_UL_DCCH_Message
);
// recreate enough of X2 EN-DC Container
AssertFatal
(
LTE_UL_DCCH_Message
->
message
.
choice
.
c1
.
present
==
LTE_UL_DCCH_MessageType__c1_PR_ueCapabilityInformation
,
"ueCapabilityInformation not present
\n
"
);
"ueCapabilityInformation not present
\n
"
);
NR_CG_ConfigInfo_t
*
CG_ConfigInfo
=
calloc
(
1
,
sizeof
(
*
CG_ConfigInfo
));
CG_ConfigInfo
->
criticalExtensions
.
present
=
NR_CG_ConfigInfo__criticalExtensions_PR_c1
;
CG_ConfigInfo
->
criticalExtensions
.
choice
.
c1
=
calloc
(
1
,
sizeof
(
*
CG_ConfigInfo
->
criticalExtensions
.
choice
.
c1
));
...
...
@@ -240,42 +227,37 @@ static void init_NR_SI(gNB_RRC_INST *rrc) {
CG_ConfigInfo
->
criticalExtensions
.
choice
.
c1
->
choice
.
cg_ConfigInfo
=
calloc
(
1
,
sizeof
(
*
CG_ConfigInfo
->
criticalExtensions
.
choice
.
c1
->
choice
.
cg_ConfigInfo
));
NR_CG_ConfigInfo_IEs_t
*
cg_ConfigInfo
=
CG_ConfigInfo
->
criticalExtensions
.
choice
.
c1
->
choice
.
cg_ConfigInfo
;
cg_ConfigInfo
->
ue_CapabilityInfo
=
calloc
(
1
,
sizeof
(
*
cg_ConfigInfo
->
ue_CapabilityInfo
));
asn_enc_rval_t
enc_rval
=
uper_encode_to_buffer
(
&
asn_DEF_LTE_UE_CapabilityRAT_ContainerList
,
NULL
,(
void
*
)
&
LTE_UL_DCCH_Message
->
message
.
choice
.
c1
.
choice
.
ueCapabilityInformation
.
criticalExtensions
.
choice
.
c1
.
choice
.
ueCapabilityInformation_r8
.
ue_CapabilityRAT_ContainerList
,
buffer
,
4096
);
asn_enc_rval_t
enc_rval
=
uper_encode_to_buffer
(
&
asn_DEF_LTE_UE_CapabilityRAT_ContainerList
,
NULL
,
(
void
*
)
&
LTE_UL_DCCH_Message
->
message
.
choice
.
c1
.
choice
.
ueCapabilityInformation
.
criticalExtensions
.
choice
.
c1
.
choice
.
ueCapabilityInformation_r8
.
ue_CapabilityRAT_ContainerList
,
buffer
,
4096
);
AssertFatal
(
enc_rval
.
encoded
>
0
,
"ASN1 message encoding failed (%s, %jd)!
\n
"
,
enc_rval
.
failed_type
->
name
,
enc_rval
.
encoded
);
enc_rval
.
failed_type
->
name
,
enc_rval
.
encoded
);
OCTET_STRING_fromBuf
(
cg_ConfigInfo
->
ue_CapabilityInfo
,
(
const
char
*
)
buffer
,
(
enc_rval
.
encoded
+
7
)
>>
3
);
(
const
char
*
)
buffer
,
(
enc_rval
.
encoded
+
7
)
>>
3
);
parse_CG_ConfigInfo
(
rrc
,
CG_ConfigInfo
,
NULL
);
}
else
{
}
else
{
struct
rrc_gNB_ue_context_s
*
ue_context_p
=
rrc_gNB_allocate_new_UE_context
(
rrc
);
LOG_I
(
NR_RRC
,
"Adding new user (%p)
\n
"
,
ue_context_p
);
LOG_I
(
NR_RRC
,
"Adding new user (%p)
\n
"
,
ue_context_p
);
rrc_add_nsa_user
(
rrc
,
ue_context_p
,
NULL
);
}
}
}
}
char
openair_rrc_gNB_configuration
(
const
module_id_t
gnb_mod_idP
,
gNB_RrcConfigurationReq
*
configuration
)
{
protocol_ctxt_t
ctxt
;
gNB_RRC_INST
*
rrc
=
RC
.
nrrrc
[
gnb_mod_idP
];
PROTOCOL_CTXT_SET_BY_MODULE_ID
(
&
ctxt
,
gnb_mod_idP
,
GNB_FLAG_YES
,
NOT_A_RNTI
,
0
,
0
,
gnb_mod_idP
);
LOG_I
(
NR_RRC
,
PROTOCOL_NR_RRC_CTXT_FMT
" Init...
\n
"
,
PROTOCOL_NR_RRC_CTXT_ARGS
(
&
ctxt
));
AssertFatal
(
rrc
!=
NULL
,
"RC.nrrrc not initialized!"
);
AssertFatal
(
NUMBER_OF_UE_MAX
<
(
module_id_t
)
0xFFFFFFFFFFFFFFFF
,
" variable overflow"
);
AssertFatal
(
configuration
!=
NULL
,
"configuration input is null
\n
"
);
rrc
->
module_id
=
gnb_mod_idP
;
rrc
->
Nb_ue
=
0
;
rrc
->
carrier
.
Srb0
.
Active
=
0
;
nr_uid_linear_allocator_init
(
&
rrc
->
uid_allocator
);
RB_INIT
(
&
rrc
->
rrc_ue_head
);
rrc
->
initial_id2_s1ap_ids
=
hashtable_create
(
NUMBER_OF_UE_MAX
*
2
,
NULL
,
NULL
);
...
...
@@ -285,7 +267,6 @@ char openair_rrc_gNB_configuration(const module_id_t gnb_mod_idP, gNB_RrcConfigu
rrc
->
carrier
.
pdsch_AntennaPorts
=
configuration
->
pdsch_AntennaPorts
;
/// System Information INIT
LOG_I
(
NR_RRC
,
PROTOCOL_NR_RRC_CTXT_FMT
" Checking release
\n
"
,
PROTOCOL_NR_RRC_CTXT_ARGS
(
&
ctxt
));
init_NR_SI
(
rrc
);
rrc_init_nr_global_param
();
openair_nr_rrc_on
(
&
ctxt
);
...
...
@@ -294,46 +275,26 @@ char openair_rrc_gNB_configuration(const module_id_t gnb_mod_idP, gNB_RrcConfigu
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
;
asn_dec_rval_t
dec_rval
=
uper_decode_complete
(
NULL
,
&
asn_DEF_NR_CG_ConfigInfo
,
(
void
**
)
&
cg_configinfo
,
(
uint8_t
*
)
m
->
rrc_buffer
,
(
int
)
m
->
rrc_buffer_size
);
//m->rrc_buffer_size);
gNB_RRC_INST
*
rrc
=
RC
.
nrrrc
[
gnb_mod_idP
];
if
((
dec_rval
.
code
!=
RC_OK
)
&&
(
dec_rval
.
consumed
==
0
))
{
AssertFatal
(
1
==
0
,
"NR_UL_DCCH_MESSAGE decode error
\n
"
);
// free the memory
SEQUENCE_free
(
&
asn_DEF_NR_CG_ConfigInfo
,
cg_configinfo
,
1
);
return
;
}
//LTE_UL_DCCH_Message_t *LTE_UL_DCCH_Message = NULL;
struct
NR_CG_ConfigInfo
*
cg_configinfo
=
NULL
;
asn_dec_rval_t
dec_rval
=
uper_decode_complete
(
NULL
,
&
asn_DEF_NR_CG_ConfigInfo
,
(
void
**
)
&
cg_configinfo
,
(
uint8_t
*
)
m
->
rrc_buffer
,
(
int
)
m
->
rrc_buffer_size
);
//m->rrc_buffer_size);
gNB_RRC_INST
*
rrc
=
RC
.
nrrrc
[
gnb_mod_idP
];
if
((
dec_rval
.
code
!=
RC_OK
)
&&
(
dec_rval
.
consumed
==
0
))
{
AssertFatal
(
1
==
0
,
"NR_UL_DCCH_MESSAGE decode error
\n
"
);
// free the memory
SEQUENCE_free
(
&
asn_DEF_NR_CG_ConfigInfo
,
cg_configinfo
,
1
);
return
;
}
xer_fprint
(
stdout
,
&
asn_DEF_NR_CG_ConfigInfo
,
cg_configinfo
);
// recreate enough of X2 EN-DC Container
AssertFatal
(
cg_configinfo
->
criticalExtensions
.
choice
.
c1
->
present
==
NR_CG_ConfigInfo__criticalExtensions__c1_PR_cg_ConfigInfo
,
"ueCapabilityInformation not present
\n
"
);
#if 0
NR_CG_ConfigInfo_t *CG_ConfigInfo = calloc(1,sizeof(*CG_ConfigInfo));
CG_ConfigInfo->criticalExtensions.present = NR_CG_ConfigInfo__criticalExtensions_PR_c1;
CG_ConfigInfo->criticalExtensions.choice.c1 = calloc(1,sizeof(*CG_ConfigInfo->criticalExtensions.choice.c1));
CG_ConfigInfo->criticalExtensions.choice.c1->present = NR_CG_ConfigInfo__criticalExtensions__c1_PR_cg_ConfigInfo;
CG_ConfigInfo->criticalExtensions.choice.c1->choice.cg_ConfigInfo = calloc(1,sizeof(*CG_ConfigInfo->criticalExtensions.choice.c1->choice.cg_ConfigInfo));
NR_CG_ConfigInfo_IEs_t *cg_ConfigInfo = CG_ConfigInfo->criticalExtensions.choice.c1->choice.cg_ConfigInfo;
cg_ConfigInfo->ue_CapabilityInfo = calloc(1,sizeof(*cg_ConfigInfo->ue_CapabilityInfo));
asn_enc_rval_t enc_rval = uper_encode_to_buffer(&asn_DEF_LTE_UE_CapabilityRAT_ContainerList,NULL,(void*)<E_UL_DCCH_Message->message.choice.c1.choice.ueCapabilityInformation.criticalExtensions.choice.c1.choice.ueCapabilityInformation_r8.ue_CapabilityRAT_ContainerList,m->rrc_buffer,m->rrc_buffer_size);
AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %jd)!\n",
enc_rval.failed_type->name, enc_rval.encoded);
OCTET_STRING_fromBuf(cg_ConfigInfo->ue_CapabilityInfo,
(const char *)m->rrc_buffer,
(enc_rval.encoded+7)>>3);
#endif
parse_CG_ConfigInfo
(
rrc
,
cg_configinfo
,
m
);
xer_fprint
(
stdout
,
&
asn_DEF_NR_CG_ConfigInfo
,
cg_configinfo
);
// recreate enough of X2 EN-DC Container
AssertFatal
(
cg_configinfo
->
criticalExtensions
.
choice
.
c1
->
present
==
NR_CG_ConfigInfo__criticalExtensions__c1_PR_cg_ConfigInfo
,
"ueCapabilityInformation not present
\n
"
);
parse_CG_ConfigInfo
(
rrc
,
cg_configinfo
,
m
);
}
///---------------------------------------------------------------------------------------------------------------///
...
...
@@ -431,16 +392,15 @@ void *rrc_gnb_task(void *args_p) {
openair_rrc_gNB_configuration
(
GNB_INSTANCE_TO_MODULE_ID
(
instance
),
&
NRRRC_CONFIGURATION_REQ
(
msg_p
));
break
;
/* Messages from X2AP */
/* Messages from X2AP */
case
X2AP_ENDC_SGNB_ADDITION_REQ
:
LOG_I
(
NR_RRC
,
"Received ENDC sgNB addition request from X2AP
\n
"
);
rrc_gNB_process_AdditionRequestInformation
(
GNB_INSTANCE_TO_MODULE_ID
(
instance
),
&
X2AP_ENDC_SGNB_ADDITION_REQ
(
msg_p
));
break
;
LOG_I
(
NR_RRC
,
"Received ENDC sgNB addition request from X2AP
\n
"
);
rrc_gNB_process_AdditionRequestInformation
(
GNB_INSTANCE_TO_MODULE_ID
(
instance
),
&
X2AP_ENDC_SGNB_ADDITION_REQ
(
msg_p
));
break
;
case
X2AP_ENDC_SGNB_RECONF_COMPLETE
:
LOG_I
(
NR_RRC
,
"Handling of reconfiguration complete message at RRC gNB is pending
\n
"
);
break
;
LOG_I
(
NR_RRC
,
"Handling of reconfiguration complete message at RRC gNB is pending
\n
"
);
break
;
default:
LOG_E
(
NR_RRC
,
"[gNB %d] Received unexpected message %s
\n
"
,
instance
,
msg_name_p
);
...
...
openair2/RRC/NR/rrc_gNB_internode.c
View file @
defea03a
...
...
@@ -39,47 +39,48 @@
#include "NR_CG-Config.h"
int
parse_CG_ConfigInfo
(
gNB_RRC_INST
*
rrc
,
NR_CG_ConfigInfo_t
*
CG_ConfigInfo
,
x2ap_ENDC_sgnb_addition_req_t
*
m
)
{
if
(
CG_ConfigInfo
->
criticalExtensions
.
present
==
NR_CG_ConfigInfo__criticalExtensions_PR_c1
)
{
if
(
CG_ConfigInfo
->
criticalExtensions
.
choice
.
c1
)
{
if
(
CG_ConfigInfo
->
criticalExtensions
.
choice
.
c1
->
present
==
NR_CG_ConfigInfo__criticalExtensions__c1_PR_cg_ConfigInfo
)
{
NR_CG_ConfigInfo_IEs_t
*
cg_ConfigInfo
=
CG_ConfigInfo
->
criticalExtensions
.
choice
.
c1
->
choice
.
cg_ConfigInfo
;
if
(
cg_ConfigInfo
->
ue_CapabilityInfo
)
{
// Decode UE-CapabilityRAT-ContainerList
NR_CG_ConfigInfo_IEs_t
*
cg_ConfigInfo
=
CG_ConfigInfo
->
criticalExtensions
.
choice
.
c1
->
choice
.
cg_ConfigInfo
;
if
(
cg_ConfigInfo
->
ue_CapabilityInfo
)
{
// Decode UE-CapabilityRAT-ContainerList
LTE_UE_CapabilityRAT_ContainerList_t
*
UE_CapabilityRAT_ContainerList
=
NULL
;
asn_dec_rval_t
dec_rval
=
uper_decode
(
NULL
,
&
asn_DEF_LTE_UE_CapabilityRAT_ContainerList
,
(
void
**
)
&
UE_CapabilityRAT_ContainerList
,
cg_ConfigInfo
->
ue_CapabilityInfo
->
buf
,
cg_ConfigInfo
->
ue_CapabilityInfo
->
size
,
0
,
0
);
UE_CapabilityRAT_ContainerList
=
calloc
(
1
,
sizeof
(
LTE_UE_CapabilityRAT_ContainerList_t
));
asn_dec_rval_t
dec_rval
=
uper_decode
(
NULL
,
&
asn_DEF_LTE_UE_CapabilityRAT_ContainerList
,
(
void
**
)
&
UE_CapabilityRAT_ContainerList
,
cg_ConfigInfo
->
ue_CapabilityInfo
->
buf
,
cg_ConfigInfo
->
ue_CapabilityInfo
->
size
,
0
,
0
);
if
((
dec_rval
.
code
!=
RC_OK
)
&&
(
dec_rval
.
consumed
==
0
))
{
AssertFatal
(
1
==
0
,
"[InterNode] Failed to decode NR_UE_CapabilityRAT_ContainerList (%zu bits), size of OCTET_STRING %lu
\n
"
,
dec_rval
.
consumed
,
cg_ConfigInfo
->
ue_CapabilityInfo
->
size
);
}
rrc_parse_ue_capabilities
(
rrc
,
UE_CapabilityRAT_ContainerList
,
m
,
cg_ConfigInfo
);
}
if
(
cg_ConfigInfo
->
candidateCellInfoListMN
)
AssertFatal
(
1
==
0
,
"Can't handle candidateCellInfoListMN yet
\n
"
);
}
else
AssertFatal
(
1
==
0
,
"c1 extension is not cg_ConfigInfo, returning
\n
"
);
}
else
{
AssertFatal
(
1
==
0
,
"[InterNode] Failed to decode NR_UE_CapabilityRAT_ContainerList (%zu bits), size of OCTET_STRING %lu
\n
"
,
dec_rval
.
consumed
,
cg_ConfigInfo
->
ue_CapabilityInfo
->
size
);
}
rrc_parse_ue_capabilities
(
rrc
,
UE_CapabilityRAT_ContainerList
,
m
,
cg_ConfigInfo
);
}
if
(
cg_ConfigInfo
->
candidateCellInfoListMN
)
AssertFatal
(
1
==
0
,
"Can't handle candidateCellInfoListMN yet
\n
"
);
}
else
AssertFatal
(
1
==
0
,
"c1 extension is not cg_ConfigInfo, returning
\n
"
);
}
else
{
LOG_E
(
RRC
,
"c1 extension not found, returning
\n
"
);
return
(
-
1
);
return
(
-
1
);
}
}
else
{
LOG_E
(
RRC
,
"Ignoring unknown CG_ConfigInfo extensions
\n
"
);
return
(
-
1
);
}
return
(
0
);
}
int
generate_CG_Config
(
gNB_RRC_INST
*
rrc
,
NR_CG_Config_t
*
cg_Config
,
NR_RRCReconfiguration_t
*
reconfig
,
NR_RadioBearerConfig_t
*
rbconfig
)
{
return
(
0
);
}
int
generate_CG_Config
(
gNB_RRC_INST
*
rrc
,
NR_CG_Config_t
*
cg_Config
,
NR_RRCReconfiguration_t
*
reconfig
,
NR_RadioBearerConfig_t
*
rbconfig
)
{
cg_Config
->
criticalExtensions
.
present
=
NR_CG_Config__criticalExtensions_PR_c1
;
cg_Config
->
criticalExtensions
.
choice
.
c1
=
calloc
(
1
,
sizeof
(
*
cg_Config
->
criticalExtensions
.
choice
.
c1
));
cg_Config
->
criticalExtensions
.
choice
.
c1
->
present
=
NR_CG_Config__criticalExtensions__c1_PR_cg_Config
;
...
...
@@ -91,36 +92,37 @@ int generate_CG_Config(gNB_RRC_INST *rrc,
enc_rval
.
failed_type
->
name
,
enc_rval
.
encoded
);
cg_Config
->
criticalExtensions
.
choice
.
c1
->
choice
.
cg_Config
->
scg_CellGroupConfig
=
calloc
(
1
,
sizeof
(
OCTET_STRING_t
));
OCTET_STRING_fromBuf
(
cg_Config
->
criticalExtensions
.
choice
.
c1
->
choice
.
cg_Config
->
scg_CellGroupConfig
,
(
const
char
*
)
buffer
,
(
enc_rval
.
encoded
+
7
)
>>
3
);
(
const
char
*
)
buffer
,
(
enc_rval
.
encoded
+
7
)
>>
3
);
total_size
=
(
enc_rval
.
encoded
+
7
)
>>
3
;
LOG_I
(
RRC
,
"Dumping NR_RRCReconfiguration message (%jd bytes)
\n
"
,(
enc_rval
.
encoded
+
7
)
>>
3
);
for
(
int
i
=
0
;
i
<
(
enc_rval
.
encoded
+
7
)
>>
3
;
i
++
)
{
for
(
int
i
=
0
;
i
<
(
enc_rval
.
encoded
+
7
)
>>
3
;
i
++
)
{
printf
(
"%02x"
,((
uint8_t
*
)
buffer
)[
i
]);
}
printf
(
"
\n
"
);
FILE
*
fd
=
fopen
(
"reconfig.raw"
,
"w"
);
fwrite
((
void
*
)
buffer
,
1
,(
size_t
)((
enc_rval
.
encoded
+
7
)
>>
3
),
fd
);
fwrite
((
void
*
)
buffer
,
1
,(
size_t
)((
enc_rval
.
encoded
+
7
)
>>
3
),
fd
);
fclose
(
fd
);
enc_rval
=
uper_encode_to_buffer
(
&
asn_DEF_NR_RadioBearerConfig
,
NULL
,
(
void
*
)
rbconfig
,
buffer
,
1024
);
AssertFatal
(
enc_rval
.
encoded
>
0
,
"ASN1 message encoding failed (%s, %jd)!
\n
"
,
enc_rval
.
failed_type
->
name
,
enc_rval
.
encoded
);
cg_Config
->
criticalExtensions
.
choice
.
c1
->
choice
.
cg_Config
->
scg_RB_Config
=
calloc
(
1
,
sizeof
(
OCTET_STRING_t
));
OCTET_STRING_fromBuf
(
cg_Config
->
criticalExtensions
.
choice
.
c1
->
choice
.
cg_Config
->
scg_RB_Config
,
(
const
char
*
)
buffer
,
(
enc_rval
.
encoded
+
7
)
>>
3
);
(
const
char
*
)
buffer
,
(
enc_rval
.
encoded
+
7
)
>>
3
);
LOG_I
(
RRC
,
"Dumping scg_RB_Config message (%jd bytes)
\n
"
,(
enc_rval
.
encoded
+
7
)
>>
3
);
for
(
int
i
=
0
;
i
<
(
enc_rval
.
encoded
+
7
)
>>
3
;
i
++
)
{
printf
(
"%02x"
,((
uint8_t
*
)
buffer
)[
i
]);
for
(
int
i
=
0
;
i
<
(
enc_rval
.
encoded
+
7
)
>>
3
;
i
++
)
{
printf
(
"%02x"
,((
uint8_t
*
)
buffer
)[
i
]);
}
printf
(
"
\n
"
);
fd
=
fopen
(
"rbconfig.raw"
,
"w"
);
fwrite
((
void
*
)
buffer
,
1
,(
size_t
)((
enc_rval
.
encoded
+
7
)
>>
3
),
fd
);
fwrite
((
void
*
)
buffer
,
1
,(
size_t
)((
enc_rval
.
encoded
+
7
)
>>
3
),
fd
);
fclose
(
fd
);
total_size
=
total_size
+
((
enc_rval
.
encoded
+
7
)
>>
3
);
return
(
total_size
);
}
...
...
openair2/RRC/NR/rrc_gNB_nsa.c
View file @
defea03a
...
...
@@ -40,7 +40,6 @@
#include "openair2/RRC/LTE/rrc_eNB_GTPV1U.h"
void
rrc_parse_ue_capabilities
(
gNB_RRC_INST
*
rrc
,
LTE_UE_CapabilityRAT_ContainerList_t
*
UE_CapabilityRAT_ContainerList
,
x2ap_ENDC_sgnb_addition_req_t
*
m
,
NR_CG_ConfigInfo_IEs_t
*
cg_config_info
)
{
struct
rrc_gNB_ue_context_s
*
ue_context_p
=
NULL
;
OCTET_STRING_t
*
ueCapabilityRAT_Container_nr
=
NULL
;
OCTET_STRING_t
*
ueCapabilityRAT_Container_MRDC
=
NULL
;
...
...
@@ -48,10 +47,11 @@ void rrc_parse_ue_capabilities(gNB_RRC_INST *rrc, LTE_UE_CapabilityRAT_Container
asn_dec_rval_t
dec_rval
;
AssertFatal
(
UE_CapabilityRAT_ContainerList
!=
NULL
,
"UE_CapabilityRAT_ContainerList is null
\n
"
);
AssertFatal
((
list_size
=
UE_CapabilityRAT_ContainerList
->
list
.
count
)
>=
2
,
"UE_CapabilityRAT_ContainerList->list.size %d < 2
\n
"
,
UE_CapabilityRAT_ContainerList
->
list
.
count
);
for
(
int
i
=
0
;
i
<
list_size
;
i
++
)
{
for
(
int
i
=
0
;
i
<
list_size
;
i
++
)
{
if
(
UE_CapabilityRAT_ContainerList
->
list
.
array
[
i
]
->
rat_Type
==
LTE_RAT_Type_nr
)
ueCapabilityRAT_Container_nr
=
&
UE_CapabilityRAT_ContainerList
->
list
.
array
[
i
]
->
ueCapabilityRAT_Container
;
else
if
(
UE_CapabilityRAT_ContainerList
->
list
.
array
[
i
]
->
rat_Type
==
LTE_RAT_Type_eutra_nr
)
ueCapabilityRAT_Container_MRDC
=
&
UE_CapabilityRAT_ContainerList
->
list
.
array
[
i
]
->
ueCapabilityRAT_Container
;
}
}
// decode and store capabilities
ue_context_p
=
rrc_gNB_allocate_new_UE_context
(
rrc
);
...
...
@@ -65,10 +65,10 @@ void rrc_parse_ue_capabilities(gNB_RRC_INST *rrc, LTE_UE_CapabilityRAT_Container
if
((
dec_rval
.
code
!=
RC_OK
)
&&
(
dec_rval
.
consumed
==
0
))
{
LOG_E
(
RRC
,
"Failed to decode UE NR capabilities (%zu bytes) container size %lu
\n
"
,
dec_rval
.
consumed
,
ueCapabilityRAT_Container_nr
->
size
);
ASN_STRUCT_FREE
(
asn_DEF_NR_UE_NR_Capability
,
ue_context_p
->
ue_context
.
UE_Capability_nr
);
ue_context_p
->
ue_context
.
UE_Capability_nr
=
0
;
AssertFatal
(
1
==
0
,
"exiting
\n
"
);
ASN_STRUCT_FREE
(
asn_DEF_NR_UE_NR_Capability
,
ue_context_p
->
ue_context
.
UE_Capability_nr
);
ue_context_p
->
ue_context
.
UE_Capability_nr
=
0
;
AssertFatal
(
1
==
0
,
"exiting
\n
"
);
}
}
...
...
@@ -80,172 +80,158 @@ void rrc_parse_ue_capabilities(gNB_RRC_INST *rrc, LTE_UE_CapabilityRAT_Container
ueCapabilityRAT_Container_MRDC
->
size
,
0
,
0
);
if
((
dec_rval
.
code
!=
RC_OK
)
&&
(
dec_rval
.
consumed
==
0
))
{
LOG_E
(
RRC
,
"Failed to decode UE MRDC capabilities (%zu bytes)
\n
"
,
dec_rval
.
consumed
);
ASN_STRUCT_FREE
(
asn_DEF_NR_UE_MRDC_Capability
,
ue_context_p
->
ue_context
.
UE_Capability_MRDC
);
ue_context_p
->
ue_context
.
UE_Capability_MRDC
=
0
;
AssertFatal
(
1
==
0
,
"exiting
\n
"
);
LOG_E
(
RRC
,
"Failed to decode UE MRDC capabilities (%zu bytes)
\n
"
,
dec_rval
.
consumed
);
ASN_STRUCT_FREE
(
asn_DEF_NR_UE_MRDC_Capability
,
ue_context_p
->
ue_context
.
UE_Capability_MRDC
);
ue_context_p
->
ue_context
.
UE_Capability_MRDC
=
0
;
AssertFatal
(
1
==
0
,
"exiting
\n
"
);
}
}
// dump ue_capabilities
if
(
LOG_DEBUGFLAG
(
DEBUG_ASN1
&&
ueCapabilityRAT_Container_nr
!=
NULL
)
)
{
xer_fprint
(
stdout
,
&
asn_DEF_NR_UE_NR_Capability
,
ue_context_p
->
ue_context
.
UE_Capability_nr
);
}
xer_fprint
(
stdout
,
&
asn_DEF_NR_UE_NR_Capability
,
ue_context_p
->
ue_context
.
UE_Capability_nr
);
}
if
(
LOG_DEBUGFLAG
(
DEBUG_ASN1
&&
ueCapabilityRAT_Container_MRDC
!=
NULL
)
)
{
xer_fprint
(
stdout
,
&
asn_DEF_NR_UE_MRDC_Capability
,
ue_context_p
->
ue_context
.
UE_Capability_MRDC
);
}
if
(
cg_config_info
->
mcg_RB_Config
)
{
asn_dec_rval_t
dec_rval
=
uper_decode
(
NULL
,
&
asn_DEF_NR_RadioBearerConfig
,
(
void
**
)
&
ue_context_p
->
ue_context
.
rb_config
,
cg_config_info
->
mcg_RB_Config
->
buf
,
cg_config_info
->
mcg_RB_Config
->
size
,
0
,
0
);
if
((
dec_rval
.
code
!=
RC_OK
)
&&
(
dec_rval
.
consumed
==
0
))
{
AssertFatal
(
1
==
0
,
"[InterNode] Failed to decode mcg_rb_config (%zu bits), size of OCTET_STRING %lu
\n
"
,
dec_rval
.
consumed
,
cg_config_info
->
mcg_RB_Config
->
size
);
xer_fprint
(
stdout
,
&
asn_DEF_NR_UE_MRDC_Capability
,
ue_context_p
->
ue_context
.
UE_Capability_MRDC
);
}
if
(
cg_config_info
&&
cg_config_info
->
mcg_RB_Config
)
{
asn_dec_rval_t
dec_rval
=
uper_decode
(
NULL
,
&
asn_DEF_NR_RadioBearerConfig
,
(
void
**
)
&
ue_context_p
->
ue_context
.
rb_config
,
cg_config_info
->
mcg_RB_Config
->
buf
,
cg_config_info
->
mcg_RB_Config
->
size
,
0
,
0
);
if
((
dec_rval
.
code
!=
RC_OK
)
&&
(
dec_rval
.
consumed
==
0
))
{
AssertFatal
(
1
==
0
,
"[InterNode] Failed to decode mcg_rb_config (%zu bits), size of OCTET_STRING %lu
\n
"
,
dec_rval
.
consumed
,
cg_config_info
->
mcg_RB_Config
->
size
);
}
}
xer_fprint
(
stdout
,
&
asn_DEF_NR_RadioBearerConfig
,
(
const
void
*
)
ue_context_p
->
ue_context
.
rb_config
);
xer_fprint
(
stdout
,
&
asn_DEF_NR_RadioBearerConfig
,
(
const
void
*
)
ue_context_p
->
ue_context
.
rb_config
);
rrc_add_nsa_user
(
rrc
,
ue_context_p
,
m
);
}
void
rrc_add_nsa_user
(
gNB_RRC_INST
*
rrc
,
struct
rrc_gNB_ue_context_s
*
ue_context_p
,
x2ap_ENDC_sgnb_addition_req_t
*
m
)
{
// generate nr-Config-r15 containers for LTE RRC : inside message for X2 EN-DC (CG-Config Message from 38.331)
// generate nr-Config-r15 containers for LTE RRC : inside message for X2 EN-DC (CG-Config Message from 38.331)
rrc_gNB_carrier_data_t
*
carrier
=&
rrc
->
carrier
;
MessageDef
*
msg
;
msg
=
itti_alloc_new_message
(
TASK_RRC_ENB
,
X2AP_ENDC_SGNB_ADDITION_REQ_ACK
);
gtpv1u_enb_create_tunnel_req_t
create_tunnel_req
;
gtpv1u_enb_create_tunnel_resp_t
create_tunnel_resp
;
protocol_ctxt_t
ctxt
;
// NR RRCReconfiguration
// NR RRCReconfiguration
AssertFatal
(
rrc
->
Nb_ue
<
MAX_NR_RRC_UE_CONTEXTS
,
"cannot add another UE
\n
"
);
ue_context_p
->
ue_context
.
reconfig
=
calloc
(
1
,
sizeof
(
NR_RRCReconfiguration_t
));
ue_context_p
->
ue_context
.
secondaryCellGroup
=
calloc
(
1
,
sizeof
(
NR_CellGroupConfig_t
));
memset
((
void
*
)
ue_context_p
->
ue_context
.
reconfig
,
0
,
sizeof
(
NR_RRCReconfiguration_t
));
memset
((
void
*
)
ue_context_p
->
ue_context
.
reconfig
,
0
,
sizeof
(
NR_RRCReconfiguration_t
));
ue_context_p
->
ue_context
.
reconfig
->
rrc_TransactionIdentifier
=
0
;
ue_context_p
->
ue_context
.
reconfig
->
criticalExtensions
.
present
=
NR_RRCReconfiguration__criticalExtensions_PR_rrcReconfiguration
;
NR_RRCReconfiguration_IEs_t
*
reconfig_ies
=
calloc
(
1
,
sizeof
(
NR_RRCReconfiguration_IEs_t
));
ue_context_p
->
ue_context
.
reconfig
->
criticalExtensions
.
choice
.
rrcReconfiguration
=
reconfig_ies
;
carrier
->
initial_csi_index
[
rrc
->
Nb_ue
]
=
0
;
fill_default_reconfig
(
carrier
->
servingcellconfigcommon
,
reconfig_ies
,
ue_context_p
->
ue_context
.
secondaryCellGroup
,
carrier
->
pdsch_AntennaPorts
,
carrier
->
initial_csi_index
[
rrc
->
Nb_ue
]);
reconfig_ies
,
ue_context_p
->
ue_context
.
secondaryCellGroup
,
carrier
->
pdsch_AntennaPorts
,
carrier
->
initial_csi_index
[
rrc
->
Nb_ue
]);
ue_context_p
->
ue_context
.
rb_config
=
calloc
(
1
,
sizeof
(
NR_RRCReconfiguration_t
));
//fill_default_rbconfig(ue_context_p->ue_context.rb_config,m, cg_config_info);
ue_context_p
->
ue_id_rnti
=
ue_context_p
->
ue_context
.
secondaryCellGroup
->
spCellConfig
->
reconfigurationWithSync
->
newUE_Identity
;
NR_CG_Config_t
*
CG_Config
=
calloc
(
1
,
sizeof
(
*
CG_Config
));
memset
((
void
*
)
CG_Config
,
0
,
sizeof
(
*
CG_Config
));
__attribute__
((
unused
))
int
CG_Config_size
=
generate_CG_Config
(
rrc
,
CG_Config
,
ue_context_p
->
ue_context
.
reconfig
,
ue_context_p
->
ue_context
.
rb_config
);
if
(
m
!=
NULL
){
uint8_t
inde_list
[
m
->
nb_e_rabs_tobeadded
];
memset
(
inde_list
,
0
,
m
->
nb_e_rabs_tobeadded
*
sizeof
(
uint8_t
));
if
(
m
->
nb_e_rabs_tobeadded
>
0
){
for
(
int
i
=
0
;
i
<
m
->
nb_e_rabs_tobeadded
;
i
++
){
// Add the new E-RABs at the corresponding rrc ue context of the gNB
ue_context_p
->
ue_context
.
e_rab
[
i
].
param
.
e_rab_id
=
m
->
e_rabs_tobeadded
[
i
].
e_rab_id
;
ue_context_p
->
ue_context
.
e_rab
[
i
].
param
.
gtp_teid
=
m
->
e_rabs_tobeadded
[
i
].
gtp_teid
;
memcpy
(
&
ue_context_p
->
ue_context
.
e_rab
[
i
].
param
.
sgw_addr
,
&
m
->
e_rabs_tobeadded
[
i
].
sgw_addr
,
sizeof
(
transport_layer_addr_t
));
ue_context_p
->
ue_context
.
nb_of_e_rabs
++
;
//Fill the required E-RAB specific information for the creation of the S1-U tunnel between the gNB and the SGW
create_tunnel_req
.
eps_bearer_id
[
i
]
=
ue_context_p
->
ue_context
.
e_rab
[
i
].
param
.
e_rab_id
;
create_tunnel_req
.
sgw_S1u_teid
[
i
]
=
ue_context_p
->
ue_context
.
e_rab
[
i
].
param
.
gtp_teid
;
memcpy
(
&
create_tunnel_req
.
sgw_addr
[
i
],
&
ue_context_p
->
ue_context
.
e_rab
[
i
].
param
.
sgw_addr
,
sizeof
(
transport_layer_addr_t
));
inde_list
[
i
]
=
i
;
LOG_I
(
RRC
,
"S1-U tunnel: index %d target sgw ip %d.%d.%d.%d length %d gtp teid %u
\n
"
,
i
,
create_tunnel_req
.
sgw_addr
[
i
].
buffer
[
0
],
create_tunnel_req
.
sgw_addr
[
i
].
buffer
[
1
],
create_tunnel_req
.
sgw_addr
[
i
].
buffer
[
2
],
create_tunnel_req
.
sgw_addr
[
i
].
buffer
[
3
],
create_tunnel_req
.
sgw_addr
[
i
].
length
,
create_tunnel_req
.
sgw_S1u_teid
[
i
]);
}
//PM: Is this where we should extract the rnti from?
create_tunnel_req
.
rnti
=
ue_context_p
->
ue_id_rnti
;
create_tunnel_req
.
num_tunnels
=
m
->
nb_e_rabs_tobeadded
;
RB_INSERT
(
rrc_nr_ue_tree_s
,
&
RC
.
nrrrc
[
rrc
->
module_id
]
->
rrc_ue_head
,
ue_context_p
);
PROTOCOL_CTXT_SET_BY_MODULE_ID
(
&
ctxt
,
rrc
->
module_id
,
GNB_FLAG_YES
,
ue_context_p
->
ue_id_rnti
,
0
,
0
,
rrc
->
module_id
);
gtpv1u_create_s1u_tunnel
(
ctxt
.
instance
,
&
create_tunnel_req
,
&
create_tunnel_resp
);
rrc_gNB_process_GTPV1U_CREATE_TUNNEL_RESP
(
&
ctxt
,
&
create_tunnel_resp
,
&
inde_list
[
0
]);
X2AP_ENDC_SGNB_ADDITION_REQ_ACK
(
msg
).
nb_e_rabs_admitted_tobeadded
=
m
->
nb_e_rabs_tobeadded
;
X2AP_ENDC_SGNB_ADDITION_REQ_ACK
(
msg
).
target_assoc_id
=
m
->
target_assoc_id
;
for
(
int
i
=
0
;
i
<
ue_context_p
->
ue_context
.
nb_of_e_rabs
;
i
++
){
X2AP_ENDC_SGNB_ADDITION_REQ_ACK
(
msg
).
e_rabs_admitted_tobeadded
[
i
].
e_rab_id
=
ue_context_p
->
ue_context
.
e_rab
[
i
].
param
.
e_rab_id
;
X2AP_ENDC_SGNB_ADDITION_REQ_ACK
(
msg
).
e_rabs_admitted_tobeadded
[
i
].
gtp_teid
=
create_tunnel_resp
.
enb_S1u_teid
[
i
];
memcpy
(
&
X2AP_ENDC_SGNB_ADDITION_REQ_ACK
(
msg
).
e_rabs_admitted_tobeadded
[
i
].
gnb_addr
,
&
create_tunnel_resp
.
enb_addr
,
sizeof
(
transport_layer_addr_t
));
//The length field in the X2AP targetting structure is expected in bits but the create_tunnel_resp returns the address length in bytes
X2AP_ENDC_SGNB_ADDITION_REQ_ACK
(
msg
).
e_rabs_admitted_tobeadded
[
i
].
gnb_addr
.
length
=
create_tunnel_resp
.
enb_addr
.
length
*
8
;
LOG_I
(
RRC
,
"S1-U create_tunnel_resp tunnel: index %d target gNB ip %d.%d.%d.%d length %d gtp teid %u
\n
"
,
i
,
create_tunnel_resp
.
enb_addr
.
buffer
[
0
],
create_tunnel_resp
.
enb_addr
.
buffer
[
1
],
create_tunnel_resp
.
enb_addr
.
buffer
[
2
],
create_tunnel_resp
.
enb_addr
.
buffer
[
3
],
create_tunnel_resp
.
enb_addr
.
length
,
create_tunnel_resp
.
enb_S1u_teid
[
i
]);
LOG_I
(
RRC
,
"X2AP sGNB Addition Request: index %d target gNB ip %d.%d.%d.%d length %d gtp teid %u
\n
"
,
i
,
X2AP_ENDC_SGNB_ADDITION_REQ_ACK
(
msg
).
e_rabs_admitted_tobeadded
[
i
].
gnb_addr
.
buffer
[
0
],
X2AP_ENDC_SGNB_ADDITION_REQ_ACK
(
msg
).
e_rabs_admitted_tobeadded
[
i
].
gnb_addr
.
buffer
[
1
],
X2AP_ENDC_SGNB_ADDITION_REQ_ACK
(
msg
).
e_rabs_admitted_tobeadded
[
i
].
gnb_addr
.
buffer
[
2
],
X2AP_ENDC_SGNB_ADDITION_REQ_ACK
(
msg
).
e_rabs_admitted_tobeadded
[
i
].
gnb_addr
.
buffer
[
3
],
X2AP_ENDC_SGNB_ADDITION_REQ_ACK
(
msg
).
e_rabs_admitted_tobeadded
[
i
].
gnb_addr
.
length
,
X2AP_ENDC_SGNB_ADDITION_REQ_ACK
(
msg
).
e_rabs_admitted_tobeadded
[
i
].
gtp_teid
);
}
}
else
LOG_W
(
RRC
,
"No E-RAB to be added received from SgNB Addition Request message
\n
"
);
memset
((
void
*
)
CG_Config
,
0
,
sizeof
(
*
CG_Config
));
//int CG_Config_size = generate_CG_Config(rrc,CG_Config,ue_context_p->ue_context.reconfig,ue_context_p->ue_context.rb_config);
generate_CG_Config
(
rrc
,
CG_Config
,
ue_context_p
->
ue_context
.
reconfig
,
ue_context_p
->
ue_context
.
rb_config
);
if
(
m
!=
NULL
)
{
uint8_t
inde_list
[
m
->
nb_e_rabs_tobeadded
];
memset
(
inde_list
,
0
,
m
->
nb_e_rabs_tobeadded
*
sizeof
(
uint8_t
));
if
(
m
->
nb_e_rabs_tobeadded
>
0
)
{
for
(
int
i
=
0
;
i
<
m
->
nb_e_rabs_tobeadded
;
i
++
)
{
// Add the new E-RABs at the corresponding rrc ue context of the gNB
ue_context_p
->
ue_context
.
e_rab
[
i
].
param
.
e_rab_id
=
m
->
e_rabs_tobeadded
[
i
].
e_rab_id
;
ue_context_p
->
ue_context
.
e_rab
[
i
].
param
.
gtp_teid
=
m
->
e_rabs_tobeadded
[
i
].
gtp_teid
;
memcpy
(
&
ue_context_p
->
ue_context
.
e_rab
[
i
].
param
.
sgw_addr
,
&
m
->
e_rabs_tobeadded
[
i
].
sgw_addr
,
sizeof
(
transport_layer_addr_t
));
ue_context_p
->
ue_context
.
nb_of_e_rabs
++
;
//Fill the required E-RAB specific information for the creation of the S1-U tunnel between the gNB and the SGW
create_tunnel_req
.
eps_bearer_id
[
i
]
=
ue_context_p
->
ue_context
.
e_rab
[
i
].
param
.
e_rab_id
;
create_tunnel_req
.
sgw_S1u_teid
[
i
]
=
ue_context_p
->
ue_context
.
e_rab
[
i
].
param
.
gtp_teid
;
memcpy
(
&
create_tunnel_req
.
sgw_addr
[
i
],
&
ue_context_p
->
ue_context
.
e_rab
[
i
].
param
.
sgw_addr
,
sizeof
(
transport_layer_addr_t
));
inde_list
[
i
]
=
i
;
LOG_I
(
RRC
,
"S1-U tunnel: index %d target sgw ip %d.%d.%d.%d length %d gtp teid %u
\n
"
,
i
,
create_tunnel_req
.
sgw_addr
[
i
].
buffer
[
0
],
create_tunnel_req
.
sgw_addr
[
i
].
buffer
[
1
],
create_tunnel_req
.
sgw_addr
[
i
].
buffer
[
2
],
create_tunnel_req
.
sgw_addr
[
i
].
buffer
[
3
],
create_tunnel_req
.
sgw_addr
[
i
].
length
,
create_tunnel_req
.
sgw_S1u_teid
[
i
]);
}
//PM: Is this where we should extract the rnti from?
create_tunnel_req
.
rnti
=
ue_context_p
->
ue_id_rnti
;
create_tunnel_req
.
num_tunnels
=
m
->
nb_e_rabs_tobeadded
;
RB_INSERT
(
rrc_nr_ue_tree_s
,
&
RC
.
nrrrc
[
rrc
->
module_id
]
->
rrc_ue_head
,
ue_context_p
);
PROTOCOL_CTXT_SET_BY_MODULE_ID
(
&
ctxt
,
rrc
->
module_id
,
GNB_FLAG_YES
,
ue_context_p
->
ue_id_rnti
,
0
,
0
,
rrc
->
module_id
);
gtpv1u_create_s1u_tunnel
(
ctxt
.
instance
,
&
create_tunnel_req
,
&
create_tunnel_resp
);
rrc_gNB_process_GTPV1U_CREATE_TUNNEL_RESP
(
&
ctxt
,
&
create_tunnel_resp
,
&
inde_list
[
0
]);
X2AP_ENDC_SGNB_ADDITION_REQ_ACK
(
msg
).
nb_e_rabs_admitted_tobeadded
=
m
->
nb_e_rabs_tobeadded
;
X2AP_ENDC_SGNB_ADDITION_REQ_ACK
(
msg
).
target_assoc_id
=
m
->
target_assoc_id
;
for
(
int
i
=
0
;
i
<
ue_context_p
->
ue_context
.
nb_of_e_rabs
;
i
++
)
{
X2AP_ENDC_SGNB_ADDITION_REQ_ACK
(
msg
).
e_rabs_admitted_tobeadded
[
i
].
e_rab_id
=
ue_context_p
->
ue_context
.
e_rab
[
i
].
param
.
e_rab_id
;
X2AP_ENDC_SGNB_ADDITION_REQ_ACK
(
msg
).
e_rabs_admitted_tobeadded
[
i
].
gtp_teid
=
create_tunnel_resp
.
enb_S1u_teid
[
i
];
memcpy
(
&
X2AP_ENDC_SGNB_ADDITION_REQ_ACK
(
msg
).
e_rabs_admitted_tobeadded
[
i
].
gnb_addr
,
&
create_tunnel_resp
.
enb_addr
,
sizeof
(
transport_layer_addr_t
));
//The length field in the X2AP targetting structure is expected in bits but the create_tunnel_resp returns the address length in bytes
X2AP_ENDC_SGNB_ADDITION_REQ_ACK
(
msg
).
e_rabs_admitted_tobeadded
[
i
].
gnb_addr
.
length
=
create_tunnel_resp
.
enb_addr
.
length
*
8
;
LOG_I
(
RRC
,
"S1-U create_tunnel_resp tunnel: index %d target gNB ip %d.%d.%d.%d length %d gtp teid %u
\n
"
,
i
,
create_tunnel_resp
.
enb_addr
.
buffer
[
0
],
create_tunnel_resp
.
enb_addr
.
buffer
[
1
],
create_tunnel_resp
.
enb_addr
.
buffer
[
2
],
create_tunnel_resp
.
enb_addr
.
buffer
[
3
],
create_tunnel_resp
.
enb_addr
.
length
,
create_tunnel_resp
.
enb_S1u_teid
[
i
]);
LOG_I
(
RRC
,
"X2AP sGNB Addition Request: index %d target gNB ip %d.%d.%d.%d length %d gtp teid %u
\n
"
,
i
,
X2AP_ENDC_SGNB_ADDITION_REQ_ACK
(
msg
).
e_rabs_admitted_tobeadded
[
i
].
gnb_addr
.
buffer
[
0
],
X2AP_ENDC_SGNB_ADDITION_REQ_ACK
(
msg
).
e_rabs_admitted_tobeadded
[
i
].
gnb_addr
.
buffer
[
1
],
X2AP_ENDC_SGNB_ADDITION_REQ_ACK
(
msg
).
e_rabs_admitted_tobeadded
[
i
].
gnb_addr
.
buffer
[
2
],
X2AP_ENDC_SGNB_ADDITION_REQ_ACK
(
msg
).
e_rabs_admitted_tobeadded
[
i
].
gnb_addr
.
buffer
[
3
],
X2AP_ENDC_SGNB_ADDITION_REQ_ACK
(
msg
).
e_rabs_admitted_tobeadded
[
i
].
gnb_addr
.
length
,
X2AP_ENDC_SGNB_ADDITION_REQ_ACK
(
msg
).
e_rabs_admitted_tobeadded
[
i
].
gtp_teid
);
}
}
else
LOG_W
(
RRC
,
"No E-RAB to be added received from SgNB Addition Request message
\n
"
);
}
//X2AP_ENDC_SGNB_ADDITION_REQ_ACK(msg).rrc_buffer_size = CG_Config_size; //Need to verify correct value for the buffer_size
// Send to X2 entity to transport to MeNB
asn_enc_rval_t
enc_rval
=
uper_encode_to_buffer
(
&
asn_DEF_NR_CG_Config
,
NULL
,
(
void
*
)
CG_Config
,
X2AP_ENDC_SGNB_ADDITION_REQ_ACK
(
msg
).
rrc_buffer
,
1024
);
NULL
,
(
void
*
)
CG_Config
,
X2AP_ENDC_SGNB_ADDITION_REQ_ACK
(
msg
).
rrc_buffer
,
1024
);
X2AP_ENDC_SGNB_ADDITION_REQ_ACK
(
msg
).
rrc_buffer_size
=
(
enc_rval
.
encoded
+
7
)
>>
3
;
itti_send_msg_to_task
(
TASK_X2AP
,
ENB_MODULE_ID_TO_INSTANCE
(
0
),
msg
);
//Check right id instead of hardcoding
rrc
->
Nb_ue
++
;
// configure MAC and RLC
rrc_mac_config_req_gNB
(
rrc
->
module_id
,
rrc
->
carrier
.
ssb_SubcarrierOffset
,
rrc
->
carrier
.
ssb_SubcarrierOffset
,
rrc
->
carrier
.
pdsch_AntennaPorts
,
NULL
,
1
,
// add_ue flag
ue_context_p
->
ue_id_rnti
,
ue_context_p
->
ue_context
.
secondaryCellGroup
);
NULL
,
1
,
// add_ue flag
ue_context_p
->
ue_id_rnti
,
ue_context_p
->
ue_context
.
secondaryCellGroup
);
}
...
...
openair2/RRC/NR/rrc_gNB_reconfig.c
View file @
defea03a
This source diff could not be displayed because it is too large. You can
view the blob
instead.
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