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
wangjie
OpenXG-RAN
Commits
01868ade
Commit
01868ade
authored
Aug 10, 2017
by
Raymond Knopp
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
repairs after merge from upstream
parent
08f7b212
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
336 additions
and
415 deletions
+336
-415
openair2/ENB_APP/enb_config.c
openair2/ENB_APP/enb_config.c
+336
-415
No files found.
openair2/ENB_APP/enb_config.c
View file @
01868ade
...
@@ -1197,12 +1197,12 @@ int RCconfig_RRC(MessageDef *msg_p, uint32_t i, eNB_RRC_INST *rrc) {
...
@@ -1197,12 +1197,12 @@ int RCconfig_RRC(MessageDef *msg_p, uint32_t i, eNB_RRC_INST *rrc) {
asn1_xer_print
=
0
;
asn1_xer_print
=
0
;
}
}
}
}
#endif
#endif
// Get list of active eNBs, (only these will be configured)
// Get list of active eNBs, (only these will be configured)
setting
=
config_lookup
(
&
cfg
,
ENB_CONFIG_STRING_ACTIVE_ENBS
);
setting
=
config_lookup
(
&
cfg
,
ENB_CONFIG_STRING_ACTIVE_ENBS
);
if
(
setting
!=
NULL
)
{
if
(
setting
!=
NULL
)
{
num_enbs
=
config_setting_length
(
setting
);
num_enbs
=
config_setting_length
(
setting
);
setting_enb
=
config_setting_get_elem
(
setting
,
i
);
setting_enb
=
config_setting_get_elem
(
setting
,
i
);
...
@@ -1278,7 +1278,7 @@ int RCconfig_RRC(MessageDef *msg_p, uint32_t i, eNB_RRC_INST *rrc) {
...
@@ -1278,7 +1278,7 @@ int RCconfig_RRC(MessageDef *msg_p, uint32_t i, eNB_RRC_INST *rrc) {
rrc
->
eth_params_s
.
remote_portd
=
remote_s_portd
;
rrc
->
eth_params_s
.
remote_portd
=
remote_s_portd
;
rrc
->
eth_params_s
.
transp_preference
=
ETH_UDP_MODE
;
rrc
->
eth_params_s
.
transp_preference
=
ETH_UDP_MODE
;
}
}
else
{
// other midhaul
else
{
// other midhaul
}
}
...
@@ -2235,7 +2235,7 @@ int RCconfig_RRC(MessageDef *msg_p, uint32_t i, eNB_RRC_INST *rrc) {
...
@@ -2235,7 +2235,7 @@ int RCconfig_RRC(MessageDef *msg_p, uint32_t i, eNB_RRC_INST *rrc) {
RC
.
config_file_name
,
i
,
pcch_defaultPagingCycle
);
RC
.
config_file_name
,
i
,
pcch_defaultPagingCycle
);
switch
(
bcch_modificationPeriodCoeff
)
{
switch
(
bcch_modificationPeriodCoeff
)
{
case
2
:
case
2
:
RRC_CONFIGURATION_REQ
(
msg_p
).
radioresourceconfig
[
j
].
bcch_modificationPeriodCoeff
=
BCCH_Config__modificationPeriodCoeff_n2
;
RRC_CONFIGURATION_REQ
(
msg_p
).
radioresourceconfig
[
j
].
bcch_modificationPeriodCoeff
=
BCCH_Config__modificationPeriodCoeff_n2
;
...
@@ -2528,6 +2528,7 @@ int RCconfig_RRC(MessageDef *msg_p, uint32_t i, eNB_RRC_INST *rrc) {
...
@@ -2528,6 +2528,7 @@ int RCconfig_RRC(MessageDef *msg_p, uint32_t i, eNB_RRC_INST *rrc) {
RC
.
config_file_name
,
i
,
ue_TransmissionMode
);
RC
.
config_file_name
,
i
,
ue_TransmissionMode
);
break
;
break
;
}
}
#ifdef Rel14
#ifdef Rel14
setting_br13
=
config_setting_get_member
(
component_carrier
,
ENB_CONFIG_STRING_BR
);
setting_br13
=
config_setting_get_member
(
component_carrier
,
ENB_CONFIG_STRING_BR
);
if
(
setting_br13
==
NULL
)
{
if
(
setting_br13
==
NULL
)
{
...
@@ -2541,7 +2542,7 @@ int RCconfig_RRC(MessageDef *msg_p, uint32_t i, eNB_RRC_INST *rrc) {
...
@@ -2541,7 +2542,7 @@ int RCconfig_RRC(MessageDef *msg_p, uint32_t i, eNB_RRC_INST *rrc) {
scheduling_info_br_list
=
config_setting_get_member
(
setting_br13
,
ENB_CONFIG_STRING_SCHEDULING_INFO_LIST
);
scheduling_info_br_list
=
config_setting_get_member
(
setting_br13
,
ENB_CONFIG_STRING_SCHEDULING_INFO_LIST
);
int
num_scheduling_info
=
config_setting_length
(
scheduling_info_br_list
);
int
num_scheduling_info
=
config_setting_length
(
scheduling_info_br_list
);
RRC_CONFIGURATION_REQ
(
msg_p
).
scheduling_info_br_size
[
j
]
=
num_scheduling_info
;
RRC_CONFIGURATION_REQ
(
msg_p
).
scheduling_info_br_size
[
j
]
=
num_scheduling_info
;
for
(
sched_info_idx
=
0
;
sched_info_idx
<
num_scheduling_info
;
++
sched_info_idx
)
for
(
sched_info_idx
=
0
;
sched_info_idx
<
num_scheduling_info
;
++
sched_info_idx
)
{
{
scheduling_info_br
=
config_setting_get_elem
(
scheduling_info_br_list
,
sched_info_idx
);
scheduling_info_br
=
config_setting_get_elem
(
scheduling_info_br_list
,
sched_info_idx
);
...
@@ -2612,7 +2613,7 @@ int RCconfig_RRC(MessageDef *msg_p, uint32_t i, eNB_RRC_INST *rrc) {
...
@@ -2612,7 +2613,7 @@ int RCconfig_RRC(MessageDef *msg_p, uint32_t i, eNB_RRC_INST *rrc) {
}
}
RRC_CONFIGURATION_REQ
(
msg_p
).
rsrp_range
[
j
][
rsrp_range_idx
]
=
rsrp_range_br
;
RRC_CONFIGURATION_REQ
(
msg_p
).
rsrp_range
[
j
][
rsrp_range_idx
]
=
rsrp_range_br
;
}
}
prach_parameters_ce_r13_list
=
config_setting_get_member
(
setting_br13
,
ENB_CONFIG_STRING_PRACH_PARAMETERS_CE_R13
);
prach_parameters_ce_r13_list
=
config_setting_get_member
(
setting_br13
,
ENB_CONFIG_STRING_PRACH_PARAMETERS_CE_R13
);
int
num_prach_parameters_ce_r13
=
config_setting_length
(
prach_parameters_ce_r13_list
);
int
num_prach_parameters_ce_r13
=
config_setting_length
(
prach_parameters_ce_r13_list
);
RRC_CONFIGURATION_REQ
(
msg_p
).
prach_parameters_list_size
[
j
]
=
num_prach_parameters_ce_r13
;
RRC_CONFIGURATION_REQ
(
msg_p
).
prach_parameters_list_size
[
j
]
=
num_prach_parameters_ce_r13
;
...
@@ -2696,9 +2697,6 @@ int RCconfig_RRC(MessageDef *msg_p, uint32_t i, eNB_RRC_INST *rrc) {
...
@@ -2696,9 +2697,6 @@ int RCconfig_RRC(MessageDef *msg_p, uint32_t i, eNB_RRC_INST *rrc) {
&&
config_setting_lookup_int
(
setting_br13
,
ENB_CONFIG_STRING_PUCCH_DELTA_SHIFT
,
&
pucch_delta_shift
)
&&
config_setting_lookup_int
(
setting_br13
,
ENB_CONFIG_STRING_PUCCH_DELTA_SHIFT
,
&
pucch_delta_shift
)
&&
config_setting_lookup_int
(
setting_br13
,
ENB_CONFIG_STRING_PUCCH_NRB_CQI
,
&
pucch_nRB_CQI
)
&&
config_setting_lookup_int
(
setting_br13
,
ENB_CONFIG_STRING_PUCCH_NRB_CQI
,
&
pucch_nRB_CQI
)
&&
config_setting_lookup_int
(
setting_br13
,
ENB_CONFIG_STRING_PUCCH_NCS_AN
,
&
pucch_nCS_AN
)
&&
config_setting_lookup_int
(
setting_br13
,
ENB_CONFIG_STRING_PUCCH_NCS_AN
,
&
pucch_nCS_AN
)
#if !defined(Rel10) && !defined(Rel14)
&&
config_setting_lookup_int
(
setting_br13
,
ENB_CONFIG_STRING_PUCCH_N1_AN
,
&
pucch_n1_AN
)
#endif
&&
config_setting_lookup_int
(
setting_br13
,
ENB_CONFIG_STRING_PDSCH_RS_EPRE
,
&
pdsch_referenceSignalPower
)
&&
config_setting_lookup_int
(
setting_br13
,
ENB_CONFIG_STRING_PDSCH_RS_EPRE
,
&
pdsch_referenceSignalPower
)
&&
config_setting_lookup_int
(
setting_br13
,
ENB_CONFIG_STRING_PDSCH_PB
,
&
pdsch_p_b
)
&&
config_setting_lookup_int
(
setting_br13
,
ENB_CONFIG_STRING_PDSCH_PB
,
&
pdsch_p_b
)
&&
config_setting_lookup_int
(
setting_br13
,
ENB_CONFIG_STRING_PUSCH_N_SB
,
&
pusch_n_SB
)
&&
config_setting_lookup_int
(
setting_br13
,
ENB_CONFIG_STRING_PUSCH_N_SB
,
&
pusch_n_SB
)
...
@@ -2811,15 +2809,6 @@ int RCconfig_RRC(MessageDef *msg_p, uint32_t i, eNB_RRC_INST *rrc) {
...
@@ -2811,15 +2809,6 @@ int RCconfig_RRC(MessageDef *msg_p, uint32_t i, eNB_RRC_INST *rrc) {
"Failed to parse eNB configuration file %s, enb %d unknown value
\"
%d
\"
for pucch_nCS_AN choice: 0..7!
\n
"
,
"Failed to parse eNB configuration file %s, enb %d unknown value
\"
%d
\"
for pucch_nCS_AN choice: 0..7!
\n
"
,
RC
.
config_file_name
,
i
,
pucch_nCS_AN
);
RC
.
config_file_name
,
i
,
pucch_nCS_AN
);
#if !defined(Rel10) && !defined(Rel14)
RRC_CONFIGURATION_REQ
(
msg_p
).
radioresourceconfig_BR
[
j
].
pucch_n1_AN
=
pucch_n1_AN
;
if
((
pucch_n1_AN
<
0
)
||
(
pucch_n1_AN
>
2047
))
AssertFatal
(
0
,
"Failed to parse eNB configuration file %s, enb %d unknown value
\"
%d
\"
for pucch_n1_AN choice: 0..2047!
\n
"
,
RC
.
config_file_name
,
i
,
pucch_n1_AN
);
#endif
RRC_CONFIGURATION_REQ
(
msg_p
).
radioresourceconfig_BR
[
j
].
pdsch_referenceSignalPower
=
pdsch_referenceSignalPower
;
RRC_CONFIGURATION_REQ
(
msg_p
).
radioresourceconfig_BR
[
j
].
pdsch_referenceSignalPower
=
pdsch_referenceSignalPower
;
if
((
pdsch_referenceSignalPower
<-
60
)
||
(
pdsch_referenceSignalPower
>
50
))
if
((
pdsch_referenceSignalPower
<-
60
)
||
(
pdsch_referenceSignalPower
>
50
))
...
@@ -3019,32 +3008,6 @@ int RCconfig_RRC(MessageDef *msg_p, uint32_t i, eNB_RRC_INST *rrc) {
...
@@ -3019,32 +3008,6 @@ int RCconfig_RRC(MessageDef *msg_p, uint32_t i, eNB_RRC_INST *rrc) {
"Failed to parse eNB configuration file %s, enb %d unknown value
\"
%d
\"
for pusch_p0_Nominal choice: -126..24 !
\n
"
,
"Failed to parse eNB configuration file %s, enb %d unknown value
\"
%d
\"
for pusch_p0_Nominal choice: -126..24 !
\n
"
,
RC
.
config_file_name
,
i
,
pusch_p0_Nominal
);
RC
.
config_file_name
,
i
,
pusch_p0_Nominal
);
#ifndef Rel14
if
(
strcmp
(
pusch_alpha
,
"AL0"
)
==
0
)
{
RRC_CONFIGURATION_REQ
(
msg_p
).
radioresourceconfig_BR
[
j
].
pusch_alpha
=
UplinkPowerControlCommon__alpha_al0
;
}
else
if
(
strcmp
(
pusch_alpha
,
"AL04"
)
==
0
)
{
RRC_CONFIGURATION_REQ
(
msg_p
).
radioresourceconfig_BR
[
j
].
pusch_alpha
=
UplinkPowerControlCommon__alpha_al04
;
}
else
if
(
strcmp
(
pusch_alpha
,
"AL05"
)
==
0
)
{
RRC_CONFIGURATION_REQ
(
msg_p
).
radioresourceconfig_BR
[
j
].
pusch_alpha
=
UplinkPowerControlCommon__alpha_al05
;
}
else
if
(
strcmp
(
pusch_alpha
,
"AL06"
)
==
0
)
{
RRC_CONFIGURATION_REQ
(
msg_p
).
radioresourceconfig_BR
[
j
].
pusch_alpha
=
UplinkPowerControlCommon__alpha_al06
;
}
else
if
(
strcmp
(
pusch_alpha
,
"AL07"
)
==
0
)
{
RRC_CONFIGURATION_REQ
(
msg_p
).
radioresourceconfig_BR
[
j
].
pusch_alpha
=
UplinkPowerControlCommon__alpha_al07
;
}
else
if
(
strcmp
(
pusch_alpha
,
"AL08"
)
==
0
)
{
RRC_CONFIGURATION_REQ
(
msg_p
).
radioresourceconfig_BR
[
j
].
pusch_alpha
=
UplinkPowerControlCommon__alpha_al08
;
}
else
if
(
strcmp
(
pusch_alpha
,
"AL09"
)
==
0
)
{
RRC_CONFIGURATION_REQ
(
msg_p
).
radioresourceconfig_BR
[
j
].
pusch_alpha
=
UplinkPowerControlCommon__alpha_al09
;
}
else
if
(
strcmp
(
pusch_alpha
,
"AL1"
)
==
0
)
{
RRC_CONFIGURATION_REQ
(
msg_p
).
radioresourceconfig_BR
[
j
].
pusch_alpha
=
UplinkPowerControlCommon__alpha_al1
;
}
#else
if
(
strcmp
(
pusch_alpha
,
"AL0"
)
==
0
)
{
if
(
strcmp
(
pusch_alpha
,
"AL0"
)
==
0
)
{
RRC_CONFIGURATION_REQ
(
msg_p
).
radioresourceconfig_BR
[
j
].
pusch_alpha
=
Alpha_r12_al0
;
RRC_CONFIGURATION_REQ
(
msg_p
).
radioresourceconfig_BR
[
j
].
pusch_alpha
=
Alpha_r12_al0
;
}
}
...
@@ -3069,7 +3032,6 @@ int RCconfig_RRC(MessageDef *msg_p, uint32_t i, eNB_RRC_INST *rrc) {
...
@@ -3069,7 +3032,6 @@ int RCconfig_RRC(MessageDef *msg_p, uint32_t i, eNB_RRC_INST *rrc) {
else
if
(
strcmp
(
pusch_alpha
,
"AL1"
)
==
0
)
{
else
if
(
strcmp
(
pusch_alpha
,
"AL1"
)
==
0
)
{
RRC_CONFIGURATION_REQ
(
msg_p
).
radioresourceconfig_BR
[
j
].
pusch_alpha
=
Alpha_r12_al1
;
RRC_CONFIGURATION_REQ
(
msg_p
).
radioresourceconfig_BR
[
j
].
pusch_alpha
=
Alpha_r12_al1
;
}
}
#endif
else
else
AssertFatal
(
0
,
AssertFatal
(
0
,
"Failed to parse eNB configuration file %s, enb %d unknown value
\"
%s
\"
for pucch_Alpha choice: AL0,AL04,AL05,AL06,AL07,AL08,AL09,AL1!
\n
"
,
"Failed to parse eNB configuration file %s, enb %d unknown value
\"
%s
\"
for pucch_Alpha choice: AL0,AL04,AL05,AL06,AL07,AL08,AL09,AL1!
\n
"
,
...
@@ -3280,52 +3242,6 @@ int RCconfig_RRC(MessageDef *msg_p, uint32_t i, eNB_RRC_INST *rrc) {
...
@@ -3280,52 +3242,6 @@ int RCconfig_RRC(MessageDef *msg_p, uint32_t i, eNB_RRC_INST *rrc) {
switch
(
rach_preambleTransMax
)
{
switch
(
rach_preambleTransMax
)
{
#ifndef Rel14
case
3
:
RRC_CONFIGURATION_REQ
(
msg_p
).
radioresourceconfig_BR
[
j
].
rach_preambleTransMax
=
RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n3
;
break
;
case
4
:
RRC_CONFIGURATION_REQ
(
msg_p
).
radioresourceconfig_BR
[
j
].
rach_preambleTransMax
=
RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n4
;
break
;
case
5
:
RRC_CONFIGURATION_REQ
(
msg_p
).
radioresourceconfig_BR
[
j
].
rach_preambleTransMax
=
RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n5
;
break
;
case
6
:
RRC_CONFIGURATION_REQ
(
msg_p
).
radioresourceconfig_BR
[
j
].
rach_preambleTransMax
=
RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n6
;
break
;
case
7
:
RRC_CONFIGURATION_REQ
(
msg_p
).
radioresourceconfig_BR
[
j
].
rach_preambleTransMax
=
RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n7
;
break
;
case
8
:
RRC_CONFIGURATION_REQ
(
msg_p
).
radioresourceconfig_BR
[
j
].
rach_preambleTransMax
=
RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n8
;
break
;
case
10
:
RRC_CONFIGURATION_REQ
(
msg_p
).
radioresourceconfig_BR
[
j
].
rach_preambleTransMax
=
RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n10
;
break
;
case
20
:
RRC_CONFIGURATION_REQ
(
msg_p
).
radioresourceconfig_BR
[
j
].
rach_preambleTransMax
=
RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n20
;
break
;
case
50
:
RRC_CONFIGURATION_REQ
(
msg_p
).
radioresourceconfig_BR
[
j
].
rach_preambleTransMax
=
RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n50
;
break
;
case
100
:
RRC_CONFIGURATION_REQ
(
msg_p
).
radioresourceconfig_BR
[
j
].
rach_preambleTransMax
=
RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n100
;
break
;
case
200
:
RRC_CONFIGURATION_REQ
(
msg_p
).
radioresourceconfig_BR
[
j
].
rach_preambleTransMax
=
RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n200
;
break
;
#else
case
3
:
case
3
:
RRC_CONFIGURATION_REQ
(
msg_p
).
radioresourceconfig_BR
[
j
].
rach_preambleTransMax
=
PreambleTransMax_n3
;
RRC_CONFIGURATION_REQ
(
msg_p
).
radioresourceconfig_BR
[
j
].
rach_preambleTransMax
=
PreambleTransMax_n3
;
...
@@ -3370,7 +3286,7 @@ int RCconfig_RRC(MessageDef *msg_p, uint32_t i, eNB_RRC_INST *rrc) {
...
@@ -3370,7 +3286,7 @@ int RCconfig_RRC(MessageDef *msg_p, uint32_t i, eNB_RRC_INST *rrc) {
case
200
:
case
200
:
RRC_CONFIGURATION_REQ
(
msg_p
).
radioresourceconfig_BR
[
j
].
rach_preambleTransMax
=
PreambleTransMax_n200
;
RRC_CONFIGURATION_REQ
(
msg_p
).
radioresourceconfig_BR
[
j
].
rach_preambleTransMax
=
PreambleTransMax_n200
;
break
;
break
;
#endif
default:
default:
AssertFatal
(
0
,
AssertFatal
(
0
,
...
@@ -3749,7 +3665,7 @@ int RCconfig_RRC(MessageDef *msg_p, uint32_t i, eNB_RRC_INST *rrc) {
...
@@ -3749,7 +3665,7 @@ int RCconfig_RRC(MessageDef *msg_p, uint32_t i, eNB_RRC_INST *rrc) {
RC
.
config_file_name
,
i
,
ue_TransmissionMode
);
RC
.
config_file_name
,
i
,
ue_TransmissionMode
);
break
;
break
;
}
}
int
hyperSFN_r13
;
int
hyperSFN_r13
;
int
eDRX_Allowed_r13
;
int
eDRX_Allowed_r13
;
int
q_RxLevMinCE_r13
;
int
q_RxLevMinCE_r13
;
...
@@ -3862,11 +3778,12 @@ int RCconfig_RRC(MessageDef *msg_p, uint32_t i, eNB_RRC_INST *rrc) {
...
@@ -3862,11 +3778,12 @@ int RCconfig_RRC(MessageDef *msg_p, uint32_t i, eNB_RRC_INST *rrc) {
}
}
else
else
RRC_CONFIGURATION_REQ
(
msg_p
).
si_ValidityTime_r13
[
j
]
=
NULL
;
RRC_CONFIGURATION_REQ
(
msg_p
).
si_ValidityTime_r13
[
j
]
=
NULL
;
}
}
else
else
RRC_CONFIGURATION_REQ
(
msg_p
).
bandwidthReducedAccessRelatedInfo_r13
[
j
]
=
FALSE
;
RRC_CONFIGURATION_REQ
(
msg_p
).
bandwidthReducedAccessRelatedInfo_r13
[
j
]
=
FALSE
;
if
(
config_setting_lookup_string
(
setting_br13
,
ENB_CONFIG_STRING_FREQHOPPINGPARAMETERSDL
,
&
freqHoppingParametersDL_r13
)
&&
!
strcmp
(
freqHoppingParametersDL_r13
,
"ENABLE"
))
if
(
config_setting_lookup_string
(
setting_br13
,
ENB_CONFIG_STRING_FREQHOPPINGPARAMETERSDL
,
&
freqHoppingParametersDL_r13
)
&&
!
strcmp
(
freqHoppingParametersDL_r13
,
"ENABLE"
))
{
{
RRC_CONFIGURATION_REQ
(
msg_p
).
freqHoppingParametersDL_r13
[
j
]
=
TRUE
;
RRC_CONFIGURATION_REQ
(
msg_p
).
freqHoppingParametersDL_r13
[
j
]
=
TRUE
;
...
@@ -3915,7 +3832,7 @@ int RCconfig_RRC(MessageDef *msg_p, uint32_t i, eNB_RRC_INST *rrc) {
...
@@ -3915,7 +3832,7 @@ int RCconfig_RRC(MessageDef *msg_p, uint32_t i, eNB_RRC_INST *rrc) {
}
}
else
else
RRC_CONFIGURATION_REQ
(
msg_p
).
freqHoppingParametersDL_r13
[
j
]
=
FALSE
;
RRC_CONFIGURATION_REQ
(
msg_p
).
freqHoppingParametersDL_r13
[
j
]
=
FALSE
;
/////SIB2 Parameters
/////SIB2 Parameters
if
(
config_setting_lookup_int
(
setting_br13
,
ENB_CONFIG_STRING_PREAMBLETRANSMAX_CE_R13
,
&
preambleTransMax_CE_r13
))
if
(
config_setting_lookup_int
(
setting_br13
,
ENB_CONFIG_STRING_PREAMBLETRANSMAX_CE_R13
,
&
preambleTransMax_CE_r13
))
...
@@ -3925,7 +3842,7 @@ int RCconfig_RRC(MessageDef *msg_p, uint32_t i, eNB_RRC_INST *rrc) {
...
@@ -3925,7 +3842,7 @@ int RCconfig_RRC(MessageDef *msg_p, uint32_t i, eNB_RRC_INST *rrc) {
}
}
else
else
RRC_CONFIGURATION_REQ
(
msg_p
).
radioresourceconfig_BR
[
j
].
preambleTransMax_CE_r13
=
NULL
;
RRC_CONFIGURATION_REQ
(
msg_p
).
radioresourceconfig_BR
[
j
].
preambleTransMax_CE_r13
=
NULL
;
if
(
config_setting_lookup_string
(
setting_br13
,
ENB_CONFIG_STRING_PRACH_CONFIGCOMMON_V1310
,
&
prach_ConfigCommon_v1310
)
&&
!
strcmp
(
prach_ConfigCommon_v1310
,
"ENABLE"
))
if
(
config_setting_lookup_string
(
setting_br13
,
ENB_CONFIG_STRING_PRACH_CONFIGCOMMON_V1310
,
&
prach_ConfigCommon_v1310
)
&&
!
strcmp
(
prach_ConfigCommon_v1310
,
"ENABLE"
))
{
{
RRC_CONFIGURATION_REQ
(
msg_p
).
radioresourceconfig_BR
[
j
].
prach_ConfigCommon_v1310
=
TRUE
;
RRC_CONFIGURATION_REQ
(
msg_p
).
radioresourceconfig_BR
[
j
].
prach_ConfigCommon_v1310
=
TRUE
;
...
@@ -3962,337 +3879,341 @@ int RCconfig_RRC(MessageDef *msg_p, uint32_t i, eNB_RRC_INST *rrc) {
...
@@ -3962,337 +3879,341 @@ int RCconfig_RRC(MessageDef *msg_p, uint32_t i, eNB_RRC_INST *rrc) {
}
}
else
else
RRC_CONFIGURATION_REQ
(
msg_p
).
radioresourceconfig_BR
[
j
].
prach_ConfigCommon_v1310
=
TRU
E
;
RRC_CONFIGURATION_REQ
(
msg_p
).
radioresourceconfig_BR
[
j
].
prach_ConfigCommon_v1310
=
FALS
E
;
}
}
else
else
RRC_CONFIGURATION_REQ
(
msg_p
).
schedulingInfoSIB1_BR_r13
[
j
]
=
0
;
RRC_CONFIGURATION_REQ
(
msg_p
).
schedulingInfoSIB1_BR_r13
[
j
]
=
0
;
}
#endif
#endif
}
setting_srb1
=
config_setting_get_member
(
setting_enb
,
ENB_CONFIG_STRING_SRB1
);
if
(
setting_srb1
!=
NULL
)
{
if
(
!
(
config_setting_lookup_int
(
setting_srb1
,
ENB_CONFIG_STRING_SRB1_TIMER_POLL_RETRANSMIT
,
&
srb1_timer_poll_retransmit
)
&&
config_setting_lookup_int
(
setting_srb1
,
ENB_CONFIG_STRING_SRB1_TIMER_REORDERING
,
&
srb1_timer_reordering
)
&&
config_setting_lookup_int
(
setting_srb1
,
ENB_CONFIG_STRING_SRB1_TIMER_STATUS_PROHIBIT
,
&
srb1_timer_status_prohibit
)
&&
config_setting_lookup_int
(
setting_srb1
,
ENB_CONFIG_STRING_SRB1_MAX_RETX_THRESHOLD
,
&
srb1_max_retx_threshold
)
&&
config_setting_lookup_int
(
setting_srb1
,
ENB_CONFIG_STRING_SRB1_POLL_PDU
,
&
srb1_poll_pdu
)
&&
config_setting_lookup_int
(
setting_srb1
,
ENB_CONFIG_STRING_SRB1_POLL_BYTE
,
&
srb1_poll_byte
)))
AssertFatal
(
0
,
"Failed to parse eNB configuration file %s, enb %d timer_poll_retransmit, timer_reordering, "
"timer_status_prohibit, poll_pdu, poll_byte, max_retx_threshold !
\n
"
,
RC
.
config_file_name
,
i
);
switch
(
srb1_max_retx_threshold
)
{
case
1
:
rrc
->
srb1_max_retx_threshold
=
UL_AM_RLC__maxRetxThreshold_t1
;
break
;
case
2
:
rrc
->
srb1_max_retx_threshold
=
UL_AM_RLC__maxRetxThreshold_t2
;
break
;
case
3
:
rrc
->
srb1_max_retx_threshold
=
UL_AM_RLC__maxRetxThreshold_t3
;
break
;
case
4
:
rrc
->
srb1_max_retx_threshold
=
UL_AM_RLC__maxRetxThreshold_t4
;
break
;
case
6
:
rrc
->
srb1_max_retx_threshold
=
UL_AM_RLC__maxRetxThreshold_t6
;
break
;
case
8
:
rrc
->
srb1_max_retx_threshold
=
UL_AM_RLC__maxRetxThreshold_t8
;
break
;
case
16
:
rrc
->
srb1_max_retx_threshold
=
UL_AM_RLC__maxRetxThreshold_t16
;
break
;
case
32
:
rrc
->
srb1_max_retx_threshold
=
UL_AM_RLC__maxRetxThreshold_t32
;
break
;
default:
AssertFatal
(
0
,
"Bad config value when parsing eNB configuration file %s, enb %d srb1_max_retx_threshold %u!
\n
"
,
RC
.
config_file_name
,
i
,
srb1_max_retx_threshold
);
}
switch
(
srb1_poll_pdu
)
{
case
4
:
rrc
->
srb1_poll_pdu
=
PollPDU_p4
;
break
;
case
8
:
rrc
->
srb1_poll_pdu
=
PollPDU_p8
;
break
;
case
16
:
rrc
->
srb1_poll_pdu
=
PollPDU_p16
;
break
;
case
32
:
rrc
->
srb1_poll_pdu
=
PollPDU_p32
;
break
;
case
64
:
rrc
->
srb1_poll_pdu
=
PollPDU_p64
;
break
;
case
128
:
rrc
->
srb1_poll_pdu
=
PollPDU_p128
;
break
;
case
256
:
rrc
->
srb1_poll_pdu
=
PollPDU_p256
;
break
;
default:
if
(
srb1_poll_pdu
>=
10000
)
rrc
->
srb1_poll_pdu
=
PollPDU_pInfinity
;
else
AssertFatal
(
0
,
"Bad config value when parsing eNB configuration file %s, enb %d srb1_poll_pdu %u!
\n
"
,
RC
.
config_file_name
,
i
,
srb1_poll_pdu
);
}
rrc
->
srb1_poll_byte
=
srb1_poll_byte
;
switch
(
srb1_poll_byte
)
{
case
25
:
rrc
->
srb1_poll_byte
=
PollByte_kB25
;
break
;
case
50
:
rrc
->
srb1_poll_byte
=
PollByte_kB50
;
break
;
case
75
:
rrc
->
srb1_poll_byte
=
PollByte_kB75
;
break
;
case
100
:
rrc
->
srb1_poll_byte
=
PollByte_kB100
;
break
;
case
125
:
rrc
->
srb1_poll_byte
=
PollByte_kB125
;
break
;
case
250
:
rrc
->
srb1_poll_byte
=
PollByte_kB250
;
break
;
case
375
:
rrc
->
srb1_poll_byte
=
PollByte_kB375
;
break
;
case
500
:
rrc
->
srb1_poll_byte
=
PollByte_kB500
;
break
;
case
750
:
rrc
->
srb1_poll_byte
=
PollByte_kB750
;
break
;
case
1000
:
rrc
->
srb1_poll_byte
=
PollByte_kB1000
;
break
;
case
1250
:
rrc
->
srb1_poll_byte
=
PollByte_kB1250
;
break
;
case
1500
:
rrc
->
srb1_poll_byte
=
PollByte_kB1500
;
break
;
case
2000
:
rrc
->
srb1_poll_byte
=
PollByte_kB2000
;
break
;
case
3000
:
rrc
->
srb1_poll_byte
=
PollByte_kB3000
;
break
;
default:
if
(
srb1_poll_byte
>=
10000
)
rrc
->
srb1_poll_byte
=
PollByte_kBinfinity
;
else
AssertFatal
(
0
,
"Bad config value when parsing eNB configuration file %s, enb %d srb1_poll_byte %u!
\n
"
,
RC
.
config_file_name
,
i
,
srb1_poll_byte
);
}
if
(
srb1_timer_poll_retransmit
<=
250
)
{
rrc
->
srb1_timer_poll_retransmit
=
(
srb1_timer_poll_retransmit
-
5
)
/
5
;
}
else
if
(
srb1_timer_poll_retransmit
<=
500
)
{
rrc
->
srb1_timer_poll_retransmit
=
(
srb1_timer_poll_retransmit
-
300
)
/
50
+
50
;
}
else
{
AssertFatal
(
0
,
"Bad config value when parsing eNB configuration file %s, enb %d srb1_timer_poll_retransmit %u!
\n
"
,
RC
.
config_file_name
,
i
,
srb1_timer_poll_retransmit
);
}
if
(
srb1_timer_status_prohibit
<=
250
)
{
rrc
->
srb1_timer_status_prohibit
=
srb1_timer_status_prohibit
/
5
;
}
else
if
((
srb1_timer_poll_retransmit
>=
300
)
&&
(
srb1_timer_poll_retransmit
<=
500
))
{
rrc
->
srb1_timer_status_prohibit
=
(
srb1_timer_status_prohibit
-
300
)
/
50
+
51
;
}
else
{
AssertFatal
(
0
,
"Bad config value when parsing eNB configuration file %s, enb %d srb1_timer_status_prohibit %u!
\n
"
,
RC
.
config_file_name
,
i
,
srb1_timer_status_prohibit
);
}
switch
(
srb1_timer_reordering
)
{
case
0
:
rrc
->
srb1_timer_reordering
=
T_Reordering_ms0
;
break
;
case
5
:
rrc
->
srb1_timer_reordering
=
T_Reordering_ms5
;
break
;
case
10
:
rrc
->
srb1_timer_reordering
=
T_Reordering_ms10
;
break
;
case
15
:
rrc
->
srb1_timer_reordering
=
T_Reordering_ms15
;
break
;
case
20
:
rrc
->
srb1_timer_reordering
=
T_Reordering_ms20
;
break
;
case
25
:
rrc
->
srb1_timer_reordering
=
T_Reordering_ms25
;
break
;
case
30
:
rrc
->
srb1_timer_reordering
=
T_Reordering_ms30
;
break
;
case
35
:
rrc
->
srb1_timer_reordering
=
T_Reordering_ms35
;
break
;
case
40
:
rrc
->
srb1_timer_reordering
=
T_Reordering_ms40
;
break
;
case
45
:
setting_srb1
=
config_setting_get_member
(
setting_enb
,
ENB_CONFIG_STRING_SRB1
);
rrc
->
srb1_timer_reordering
=
T_Reordering_ms45
;
break
;
case
50
:
if
(
setting_srb1
!=
NULL
)
{
rrc
->
srb1_timer_reordering
=
T_Reordering_ms50
;
if
(
!
(
config_setting_lookup_int
(
setting_srb1
,
ENB_CONFIG_STRING_SRB1_TIMER_POLL_RETRANSMIT
,
&
srb1_timer_poll_retransmit
)
break
;
&&
config_setting_lookup_int
(
setting_srb1
,
ENB_CONFIG_STRING_SRB1_TIMER_REORDERING
,
&
srb1_timer_reordering
)
&&
config_setting_lookup_int
(
setting_srb1
,
ENB_CONFIG_STRING_SRB1_TIMER_STATUS_PROHIBIT
,
&
srb1_timer_status_prohibit
)
case
55
:
&&
config_setting_lookup_int
(
setting_srb1
,
ENB_CONFIG_STRING_SRB1_MAX_RETX_THRESHOLD
,
&
srb1_max_retx_threshold
)
rrc
->
srb1_timer_reordering
=
T_Reordering_ms55
;
&&
config_setting_lookup_int
(
setting_srb1
,
ENB_CONFIG_STRING_SRB1_POLL_PDU
,
&
srb1_poll_pdu
)
break
;
&&
config_setting_lookup_int
(
setting_srb1
,
ENB_CONFIG_STRING_SRB1_POLL_BYTE
,
&
srb1_poll_byte
)))
AssertFatal
(
0
,
case
60
:
"Failed to parse eNB configuration file %s, enb %d timer_poll_retransmit, timer_reordering, "
rrc
->
srb1_timer_reordering
=
T_Reordering_ms60
;
"timer_status_prohibit, poll_pdu, poll_byte, max_retx_threshold !
\n
"
,
break
;
RC
.
config_file_name
,
i
);
case
65
:
switch
(
srb1_max_retx_threshold
)
{
rrc
->
srb1_timer_reordering
=
T_Reordering_ms65
;
case
1
:
break
;
rrc
->
srb1_max_retx_threshold
=
UL_AM_RLC__maxRetxThreshold_t1
;
break
;
case
70
:
rrc
->
srb1_timer_reordering
=
T_Reordering_ms70
;
case
2
:
break
;
rrc
->
srb1_max_retx_threshold
=
UL_AM_RLC__maxRetxThreshold_t2
;
break
;
case
75
:
rrc
->
srb1_timer_reordering
=
T_Reordering_ms75
;
case
3
:
break
;
rrc
->
srb1_max_retx_threshold
=
UL_AM_RLC__maxRetxThreshold_t3
;
break
;
case
80
:
rrc
->
srb1_timer_reordering
=
T_Reordering_ms80
;
case
4
:
break
;
rrc
->
srb1_max_retx_threshold
=
UL_AM_RLC__maxRetxThreshold_t4
;
break
;
case
85
:
rrc
->
srb1_timer_reordering
=
T_Reordering_ms85
;
case
6
:
break
;
rrc
->
srb1_max_retx_threshold
=
UL_AM_RLC__maxRetxThreshold_t6
;
break
;
case
90
:
rrc
->
srb1_timer_reordering
=
T_Reordering_ms90
;
case
8
:
break
;
rrc
->
srb1_max_retx_threshold
=
UL_AM_RLC__maxRetxThreshold_t8
;
break
;
case
95
:
rrc
->
srb1_timer_reordering
=
T_Reordering_ms95
;
case
16
:
break
;
rrc
->
srb1_max_retx_threshold
=
UL_AM_RLC__maxRetxThreshold_t16
;
break
;
case
100
:
rrc
->
srb1_timer_reordering
=
T_Reordering_ms100
;
case
32
:
break
;
rrc
->
srb1_max_retx_threshold
=
UL_AM_RLC__maxRetxThreshold_t32
;
break
;
case
110
:
rrc
->
srb1_timer_reordering
=
T_Reordering_ms110
;
default:
break
;
AssertFatal
(
0
,
"Bad config value when parsing eNB configuration file %s, enb %d srb1_max_retx_threshold %u!
\n
"
,
case
120
:
RC
.
config_file_name
,
i
,
srb1_max_retx_threshold
);
rrc
->
srb1_timer_reordering
=
T_Reordering_ms120
;
}
break
;
case
130
:
switch
(
srb1_poll_pdu
)
{
rrc
->
srb1_timer_reordering
=
T_Reordering_ms130
;
case
4
:
break
;
rrc
->
srb1_poll_pdu
=
PollPDU_p4
;
break
;
case
140
:
rrc
->
srb1_timer_reordering
=
T_Reordering_ms140
;
case
8
:
break
;
rrc
->
srb1_poll_pdu
=
PollPDU_p8
;
break
;
case
150
:
rrc
->
srb1_timer_reordering
=
T_Reordering_ms150
;
case
16
:
break
;
rrc
->
srb1_poll_pdu
=
PollPDU_p16
;
break
;
case
160
:
rrc
->
srb1_timer_reordering
=
T_Reordering_ms160
;
case
32
:
break
;
rrc
->
srb1_poll_pdu
=
PollPDU_p32
;
break
;
case
170
:
rrc
->
srb1_timer_reordering
=
T_Reordering_ms170
;
case
64
:
break
;
rrc
->
srb1_poll_pdu
=
PollPDU_p64
;
break
;
case
180
:
rrc
->
srb1_timer_reordering
=
T_Reordering_ms180
;
case
128
:
break
;
rrc
->
srb1_poll_pdu
=
PollPDU_p128
;
break
;
case
190
:
rrc
->
srb1_timer_reordering
=
T_Reordering_ms190
;
case
256
:
break
;
rrc
->
srb1_poll_pdu
=
PollPDU_p256
;
break
;
case
200
:
rrc
->
srb1_timer_reordering
=
T_Reordering_ms200
;
default:
break
;
if
(
srb1_poll_pdu
>=
10000
)
rrc
->
srb1_poll_pdu
=
PollPDU_pInfinity
;
else
AssertFatal
(
0
,
"Bad config value when parsing eNB configuration file %s, enb %d srb1_poll_pdu %u!
\n
"
,
RC
.
config_file_name
,
i
,
srb1_poll_pdu
);
}
rrc
->
srb1_poll_byte
=
srb1_poll_byte
;
switch
(
srb1_poll_byte
)
{
case
25
:
rrc
->
srb1_poll_byte
=
PollByte_kB25
;
break
;
case
50
:
rrc
->
srb1_poll_byte
=
PollByte_kB50
;
break
;
case
75
:
rrc
->
srb1_poll_byte
=
PollByte_kB75
;
break
;
case
100
:
rrc
->
srb1_poll_byte
=
PollByte_kB100
;
break
;
case
125
:
rrc
->
srb1_poll_byte
=
PollByte_kB125
;
break
;
case
250
:
rrc
->
srb1_poll_byte
=
PollByte_kB250
;
break
;
case
375
:
rrc
->
srb1_poll_byte
=
PollByte_kB375
;
break
;
case
500
:
rrc
->
srb1_poll_byte
=
PollByte_kB500
;
break
;
case
750
:
rrc
->
srb1_poll_byte
=
PollByte_kB750
;
break
;
case
1000
:
rrc
->
srb1_poll_byte
=
PollByte_kB1000
;
break
;
case
1250
:
rrc
->
srb1_poll_byte
=
PollByte_kB1250
;
break
;
case
1500
:
rrc
->
srb1_poll_byte
=
PollByte_kB1500
;
break
;
case
2000
:
rrc
->
srb1_poll_byte
=
PollByte_kB2000
;
break
;
case
3000
:
rrc
->
srb1_poll_byte
=
PollByte_kB3000
;
break
;
default:
if
(
srb1_poll_byte
>=
10000
)
rrc
->
srb1_poll_byte
=
PollByte_kBinfinity
;
else
AssertFatal
(
0
,
"Bad config value when parsing eNB configuration file %s, enb %d srb1_poll_byte %u!
\n
"
,
RC
.
config_file_name
,
i
,
srb1_poll_byte
);
}
if
(
srb1_timer_poll_retransmit
<=
250
)
{
rrc
->
srb1_timer_poll_retransmit
=
(
srb1_timer_poll_retransmit
-
5
)
/
5
;
}
else
if
(
srb1_timer_poll_retransmit
<=
500
)
{
rrc
->
srb1_timer_poll_retransmit
=
(
srb1_timer_poll_retransmit
-
300
)
/
50
+
50
;
}
else
{
AssertFatal
(
0
,
"Bad config value when parsing eNB configuration file %s, enb %d srb1_timer_poll_retransmit %u!
\n
"
,
RC
.
config_file_name
,
i
,
srb1_timer_poll_retransmit
);
}
if
(
srb1_timer_status_prohibit
<=
250
)
{
rrc
->
srb1_timer_status_prohibit
=
srb1_timer_status_prohibit
/
5
;
}
else
if
((
srb1_timer_poll_retransmit
>=
300
)
&&
(
srb1_timer_poll_retransmit
<=
500
))
{
rrc
->
srb1_timer_status_prohibit
=
(
srb1_timer_status_prohibit
-
300
)
/
50
+
51
;
}
else
{
AssertFatal
(
0
,
"Bad config value when parsing eNB configuration file %s, enb %d srb1_timer_status_prohibit %u!
\n
"
,
RC
.
config_file_name
,
i
,
srb1_timer_status_prohibit
);
}
switch
(
srb1_timer_reordering
)
{
case
0
:
rrc
->
srb1_timer_reordering
=
T_Reordering_ms0
;
break
;
case
5
:
rrc
->
srb1_timer_reordering
=
T_Reordering_ms5
;
break
;
case
10
:
rrc
->
srb1_timer_reordering
=
T_Reordering_ms10
;
break
;
case
15
:
rrc
->
srb1_timer_reordering
=
T_Reordering_ms15
;
break
;
case
20
:
rrc
->
srb1_timer_reordering
=
T_Reordering_ms20
;
break
;
case
25
:
rrc
->
srb1_timer_reordering
=
T_Reordering_ms25
;
break
;
case
30
:
rrc
->
srb1_timer_reordering
=
T_Reordering_ms30
;
break
;
case
35
:
rrc
->
srb1_timer_reordering
=
T_Reordering_ms35
;
break
;
case
40
:
rrc
->
srb1_timer_reordering
=
T_Reordering_ms40
;
break
;
case
45
:
rrc
->
srb1_timer_reordering
=
T_Reordering_ms45
;
break
;
case
50
:
rrc
->
srb1_timer_reordering
=
T_Reordering_ms50
;
break
;
case
55
:
rrc
->
srb1_timer_reordering
=
T_Reordering_ms55
;
break
;
case
60
:
rrc
->
srb1_timer_reordering
=
T_Reordering_ms60
;
break
;
case
65
:
rrc
->
srb1_timer_reordering
=
T_Reordering_ms65
;
break
;
case
70
:
rrc
->
srb1_timer_reordering
=
T_Reordering_ms70
;
break
;
case
75
:
rrc
->
srb1_timer_reordering
=
T_Reordering_ms75
;
break
;
case
80
:
rrc
->
srb1_timer_reordering
=
T_Reordering_ms80
;
break
;
case
85
:
rrc
->
srb1_timer_reordering
=
T_Reordering_ms85
;
break
;
case
90
:
rrc
->
srb1_timer_reordering
=
T_Reordering_ms90
;
break
;
case
95
:
rrc
->
srb1_timer_reordering
=
T_Reordering_ms95
;
break
;
case
100
:
rrc
->
srb1_timer_reordering
=
T_Reordering_ms100
;
break
;
case
110
:
rrc
->
srb1_timer_reordering
=
T_Reordering_ms110
;
break
;
case
120
:
rrc
->
srb1_timer_reordering
=
T_Reordering_ms120
;
break
;
case
130
:
rrc
->
srb1_timer_reordering
=
T_Reordering_ms130
;
break
;
case
140
:
rrc
->
srb1_timer_reordering
=
T_Reordering_ms140
;
break
;
case
150
:
rrc
->
srb1_timer_reordering
=
T_Reordering_ms150
;
break
;
case
160
:
rrc
->
srb1_timer_reordering
=
T_Reordering_ms160
;
break
;
case
170
:
rrc
->
srb1_timer_reordering
=
T_Reordering_ms170
;
break
;
case
180
:
rrc
->
srb1_timer_reordering
=
T_Reordering_ms180
;
break
;
case
190
:
rrc
->
srb1_timer_reordering
=
T_Reordering_ms190
;
break
;
case
200
:
rrc
->
srb1_timer_reordering
=
T_Reordering_ms200
;
break
;
default:
AssertFatal
(
0
,
"Bad config value when parsing eNB configuration file %s, enb %d srb1_timer_reordering %u!
\n
"
,
RC
.
config_file_name
,
i
,
srb1_timer_reordering
);
}
break
;
}
default:
AssertFatal
(
0
,
"Bad config value when parsing eNB configuration file %s, enb %d srb1_timer_reordering %u!
\n
"
,
RC
.
config_file_name
,
i
,
srb1_timer_reordering
);
}
}
}
break
;
}
}
}
}
}
}
}
}
}
}
int
RCconfig_gtpu
()
{
int
RCconfig_gtpu
()
{
config_t
cfg
;
config_t
cfg
;
config_setting_t
*
setting
=
NULL
;
config_setting_t
*
setting
=
NULL
;
...
...
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