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
常顺宇
OpenXG-RAN
Commits
729890a1
Commit
729890a1
authored
4 years ago
by
s.rampalli
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Required changes/modifications are done at both eNB and gNB side
parent
2792f8ce
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
2356 additions
and
2572 deletions
+2356
-2572
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
+430
-425
openair2/RRC/NR/rrc_gNB.c
openair2/RRC/NR/rrc_gNB.c
+52
-92
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
+113
-128
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 @
729890a1
...
...
@@ -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];
...
...
This diff is collapsed.
Click to expand it.
openair2/RRC/LTE/rrc_eNB.c
View file @
729890a1
...
...
@@ -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;
}
...
...
@@ -2167,13 +2166,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
));
...
...
@@ -2871,7 +2870,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
;
...
...
@@ -3063,7 +3061,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
...
...
@@ -3078,8 +3076,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
));
...
...
@@ -3187,7 +3185,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
;
...
...
@@ -3245,22 +3245,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
);
}
...
...
@@ -3276,9 +3282,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
=
...
...
@@ -3399,9 +3407,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
;
...
...
@@ -3574,7 +3586,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
;
...
...
@@ -3620,7 +3631,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
));
...
...
@@ -3646,8 +3656,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
),
...
...
@@ -3782,7 +3792,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
;
...
...
@@ -3790,11 +3799,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
{
...
...
@@ -3806,8 +3815,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
));
...
...
@@ -4326,12 +4335,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
,
...
...
@@ -4345,212 +4354,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
;
}
//------------------------------------------------------------------------------
...
...
@@ -4634,36 +4589,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
;
...
...
@@ -6306,6 +6264,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
);
...
...
@@ -6445,10 +6404,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
;
...
...
@@ -6469,8 +6426,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
),
...
...
@@ -6729,7 +6686,6 @@ rrc_eNB_process_RRCConnectionReconfigurationComplete(
ue_context_pP
->
ue_context
.
nr_capabilities_requested
=
1
;
rrc_eNB_generate_NR_UECapabilityEnquiry
(
ctxt_pP
,
ue_context_pP
);
}
}
//-----------------------------------------------------------------------------
...
...
@@ -7560,33 +7516,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
}
...
...
@@ -7775,37 +7732,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
;
...
...
@@ -8153,15 +8109,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
;
}
}
...
...
@@ -8183,7 +8198,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
);
...
...
@@ -8765,117 +8781,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
);
}
...
...
@@ -9158,11 +9166,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
));
...
...
@@ -9182,41 +9189,40 @@ 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
));
break
;
rrc_eNB_process_M2AP_MCE_CONFIGURATION_UPDATE
(
&
ctxt
,
&
M2AP_MCE_CONFIGURATION_UPDATE
(
msg_p
));
break
;
default:
LOG_E
(
RRC
,
"[eNB %d] Received unexpected message %s
\n
"
,
instance
,
msg_name_p
);
...
...
@@ -9241,17 +9247,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();
}
}
}
...
...
This diff is collapsed.
Click to expand it.
openair2/RRC/NR/rrc_gNB.c
View file @
729890a1
...
...
@@ -94,12 +94,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
;
}
///---------------------------------------------------------------------------------------------------------------///
...
...
@@ -172,7 +170,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
);
}
...
...
@@ -181,57 +178,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
));
...
...
@@ -239,31 +226,27 @@ 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
));
...
...
@@ -273,15 +256,14 @@ char openair_rrc_gNB_configuration(const module_id_t gnb_mod_idP, gNB_RrcConfigu
LOG_E
(
NR_RRC
,
"RC.nrrrc not yet initialized, waiting 1 second
\n
"
);
sleep
(
1
);
}
#endif
#endif
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
);
...
...
@@ -291,7 +273,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
);
...
...
@@ -300,46 +281,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
);
}
///---------------------------------------------------------------------------------------------------------------///
...
...
@@ -437,16 +398,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
);
...
...
This diff is collapsed.
Click to expand it.
openair2/RRC/NR/rrc_gNB_internode.c
View file @
729890a1
...
...
@@ -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
);
}
...
...
This diff is collapsed.
Click to expand it.
openair2/RRC/NR/rrc_gNB_nsa.c
View file @
729890a1
...
...
@@ -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,173 +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
));
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
"
);
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
);
}
...
...
This diff is collapsed.
Click to expand it.
openair2/RRC/NR/rrc_gNB_reconfig.c
View file @
729890a1
This source diff could not be displayed because it is too large. You can
view the blob
instead.
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment