Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
OpenXG UE
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Michael Black
OpenXG UE
Commits
67562c7e
Commit
67562c7e
authored
Mar 28, 2017
by
Cedric Roux
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'origin/bugfix-220' into develop_integration_w13
parents
213f25e4
b8b34aa2
Changes
9
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
41 additions
and
16 deletions
+41
-16
cmake_targets/build_oai
cmake_targets/build_oai
+9
-6
openair1/PHY/TOOLS/lte_phy_scope.c
openair1/PHY/TOOLS/lte_phy_scope.c
+6
-3
openair1/SCHED/phy_procedures_lte_eNb.c
openair1/SCHED/phy_procedures_lte_eNb.c
+1
-1
openair1/SIMULATION/LTE_PHY/pdcchsim.c
openair1/SIMULATION/LTE_PHY/pdcchsim.c
+1
-0
openair2/LAYER2/MAC/ue_procedures.c
openair2/LAYER2/MAC/ue_procedures.c
+3
-3
openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.c
openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.c
+1
-1
openair2/UTIL/LOG/log.c
openair2/UTIL/LOG/log.c
+17
-0
targets/RT/USER/lte-softmodem.c
targets/RT/USER/lte-softmodem.c
+2
-1
targets/SIMU/USER/oaisim.c
targets/SIMU/USER/oaisim.c
+1
-1
No files found.
cmake_targets/build_oai
View file @
67562c7e
...
@@ -33,6 +33,13 @@ ORIGIN_PATH=$PWD
...
@@ -33,6 +33,13 @@ ORIGIN_PATH=$PWD
THIS_SCRIPT_PATH
=
$(
dirname
$(
readlink
-f
$0
))
THIS_SCRIPT_PATH
=
$(
dirname
$(
readlink
-f
$0
))
source
$THIS_SCRIPT_PATH
/tools/build_helper
source
$THIS_SCRIPT_PATH
/tools/build_helper
# set environment variables (OPENAIR_HOME, ...)
set_openair_env
#variables for UE data generation
gen_nvram_path
=
$OPENAIR_DIR
/targets/bin
conf_nvram_path
=
$OPENAIR_DIR
/openair3/NAS/TOOLS/ue_eurecom_test_sfr.conf
MSC_GEN
=
"False"
MSC_GEN
=
"False"
XFORMS
=
"True"
XFORMS
=
"True"
FLEXRAN_AGENT_SB_IF
=
"True"
FLEXRAN_AGENT_SB_IF
=
"True"
...
@@ -59,9 +66,6 @@ BUILD_ECLIPSE=0
...
@@ -59,9 +66,6 @@ BUILD_ECLIPSE=0
CMAKE_CMD
=
'cmake'
CMAKE_CMD
=
'cmake'
trap
handle_ctrl_c INT
trap
handle_ctrl_c INT
gen_nvram_path
=
$OPENAIR_DIR
/targets/bin
conf_nvram_path
=
$OPENAIR_DIR
/openair3/NAS/TOOLS/ue_eurecom_test_sfr.conf
function
print_help
()
{
function
print_help
()
{
echo_info
"
echo_info
"
This program installs OpenAirInterface Software
This program installs OpenAirInterface Software
...
@@ -404,7 +408,6 @@ function main() {
...
@@ -404,7 +408,6 @@ function main() {
echo_info
"2. Setting the OAI PATHS ..."
echo_info
"2. Setting the OAI PATHS ..."
set_openair_env
cecho
"OPENAIR_DIR =
$OPENAIR_DIR
"
$green
cecho
"OPENAIR_DIR =
$OPENAIR_DIR
"
$green
# for conf files copy in this bash script
# for conf files copy in this bash script
...
@@ -774,9 +777,9 @@ function main() {
...
@@ -774,9 +777,9 @@ function main() {
# build RF device and transport protocol libraries
# build RF device and transport protocol libraries
#####################################
#####################################
if
[
"
$eNB
"
=
"1"
-o
"
$RRH
"
=
"1"
]
;
then
if
[
"
$eNB
"
=
"1"
-o
"
$UE
"
=
"1"
-o
"
$RRH
"
=
"1"
]
;
then
if
[
"
$eNB
"
=
"1"
]
;
then
if
[
"
$eNB
"
=
"1"
-o
"
$UE
"
=
"1"
]
;
then
build_dir
=
$lte_build_dir
build_dir
=
$lte_build_dir
else
else
build_dir
=
$rrh_build_dir
build_dir
=
$rrh_build_dir
...
...
openair1/PHY/TOOLS/lte_phy_scope.c
View file @
67562c7e
...
@@ -493,7 +493,8 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form,
...
@@ -493,7 +493,8 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form,
int16_t
**
chest_f
;
int16_t
**
chest_f
;
int16_t
*
pdsch_llr
;
int16_t
*
pdsch_llr
;
int16_t
*
pdsch_comp
;
int16_t
*
pdsch_comp
;
int8_t
*
pdcch_llr
;
int16_t
*
pdsch_mag
;
int8_t
*
pdcch_llr
;
int16_t
*
pdcch_comp
;
int16_t
*
pdcch_comp
;
int8_t
*
pbch_llr
;
int8_t
*
pbch_llr
;
int16_t
*
pbch_comp
;
int16_t
*
pbch_comp
;
...
@@ -571,6 +572,7 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form,
...
@@ -571,6 +572,7 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form,
pdsch_llr
=
(
int16_t
*
)
phy_vars_ue
->
pdsch_vars
[
subframe
&
0x1
][
eNB_id
]
->
llr
[
0
];
// stream 0
pdsch_llr
=
(
int16_t
*
)
phy_vars_ue
->
pdsch_vars
[
subframe
&
0x1
][
eNB_id
]
->
llr
[
0
];
// stream 0
// pdsch_llr = (int16_t*) phy_vars_ue->lte_ue_pdsch_vars_SI[eNB_id]->llr[0]; // stream 0
// pdsch_llr = (int16_t*) phy_vars_ue->lte_ue_pdsch_vars_SI[eNB_id]->llr[0]; // stream 0
pdsch_comp
=
(
int16_t
*
)
phy_vars_ue
->
pdsch_vars
[
subframe
&
0x1
][
eNB_id
]
->
rxdataF_comp0
[
0
];
pdsch_comp
=
(
int16_t
*
)
phy_vars_ue
->
pdsch_vars
[
subframe
&
0x1
][
eNB_id
]
->
rxdataF_comp0
[
0
];
pdsch_mag
=
(
int16_t
*
)
phy_vars_ue
->
pdsch_vars
[
subframe
&
0x1
][
eNB_id
]
->
dl_ch_mag0
[
0
];
// Received signal in time domain of receive antenna 0
// Received signal in time domain of receive antenna 0
if
(
rxsig_t
!=
NULL
)
{
if
(
rxsig_t
!=
NULL
)
{
...
@@ -752,8 +754,9 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form,
...
@@ -752,8 +754,9 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form,
for
(
k
=
0
;
k
<
frame_parms
->
symbols_per_tti
;
k
++
)
{
for
(
k
=
0
;
k
<
frame_parms
->
symbols_per_tti
;
k
++
)
{
for
(
i
=
0
;
i
<
12
*
frame_parms
->
N_RB_DL
/
2
;
i
++
)
{
for
(
i
=
0
;
i
<
12
*
frame_parms
->
N_RB_DL
/
2
;
i
++
)
{
I
[
ind
]
=
pdsch_comp
[(
2
*
frame_parms
->
N_RB_DL
*
12
*
k
)
+
4
*
i
];
int
j
=
(
2
*
frame_parms
->
N_RB_DL
*
12
*
k
)
+
4
*
i
;
Q
[
ind
]
=
pdsch_comp
[(
2
*
frame_parms
->
N_RB_DL
*
12
*
k
)
+
4
*
i
+
1
];
I
[
ind
]
=
(
pdsch_mag
[
j
]
!=
0
?
1
.
0
/
pdsch_mag
[
j
]
:
0
.
0
)
*
pdsch_comp
[
j
]
*
1
.
0
;
Q
[
ind
]
=
(
pdsch_mag
[
j
+
1
]
!=
0
?
1
.
0
/
pdsch_mag
[
j
+
1
]
:
0
.
0
)
*
pdsch_comp
[
j
+
1
]
*
1
.
0
;
ind
++
;
ind
++
;
}
}
}
}
...
...
openair1/SCHED/phy_procedures_lte_eNb.c
View file @
67562c7e
...
@@ -190,7 +190,7 @@ int mac_phy_remove_ue(module_id_t Mod_idP,rnti_t rntiP) {
...
@@ -190,7 +190,7 @@ int mac_phy_remove_ue(module_id_t Mod_idP,rnti_t rntiP) {
eNB
=
PHY_vars_eNB_g
[
Mod_idP
][
CC_id
];
eNB
=
PHY_vars_eNB_g
[
Mod_idP
][
CC_id
];
for
(
i
=
0
;
i
<
NUMBER_OF_UE_MAX
;
i
++
)
{
for
(
i
=
0
;
i
<
NUMBER_OF_UE_MAX
;
i
++
)
{
if
((
eNB
->
dlsch
[
i
]
==
NULL
)
||
(
eNB
->
ulsch
[
i
]
==
NULL
))
{
if
((
eNB
->
dlsch
[
i
]
==
NULL
)
||
(
eNB
->
ulsch
[
i
]
==
NULL
))
{
MSC_LOG_EVENT
(
MSC_PHY_ENB
,
"0 Failed remove ue %"
PRIx16
" (ENOMEM)"
,
rnti
);
MSC_LOG_EVENT
(
MSC_PHY_ENB
,
"0 Failed remove ue %"
PRIx16
" (ENOMEM)"
,
rnti
P
);
LOG_E
(
PHY
,
"Can't remove UE, not enough memory allocated
\n
"
);
LOG_E
(
PHY
,
"Can't remove UE, not enough memory allocated
\n
"
);
return
(
-
1
);
return
(
-
1
);
}
else
{
}
else
{
...
...
openair1/SIMULATION/LTE_PHY/pdcchsim.c
View file @
67562c7e
...
@@ -653,6 +653,7 @@ int main(int argc, char **argv)
...
@@ -653,6 +653,7 @@ int main(int argc, char **argv)
printf
(
"-h This message
\n
"
);
printf
(
"-h This message
\n
"
);
printf
(
"-a Use AWGN channel and not multipath
\n
"
);
printf
(
"-a Use AWGN channel and not multipath
\n
"
);
printf
(
"-c TDD config
\n
"
);
printf
(
"-c TDD config
\n
"
);
printf
(
"-S Subframe number (0..9)
\n
"
);
printf
(
"-R N_RB_DL
\n
"
);
printf
(
"-R N_RB_DL
\n
"
);
printf
(
"-F use FDD frame
\n
"
);
printf
(
"-F use FDD frame
\n
"
);
printf
(
"-p Use extended prefix mode
\n
"
);
printf
(
"-p Use extended prefix mode
\n
"
);
...
...
openair2/LAYER2/MAC/ue_procedures.c
View file @
67562c7e
...
@@ -353,7 +353,7 @@ ue_send_sdu(
...
@@ -353,7 +353,7 @@ ue_send_sdu(
if
(
opt_enabled
)
{
if
(
opt_enabled
)
{
trace_pdu
(
1
,
sdu
,
sdu_len
,
module_idP
,
3
,
UE_mac_inst
[
module_idP
].
crnti
,
trace_pdu
(
1
,
sdu
,
sdu_len
,
module_idP
,
3
,
UE_mac_inst
[
module_idP
].
crnti
,
UE_mac_inst
[
module_idP
].
rxFrame
,
UE_mac_inst
[
module_idP
].
rxSubframe
,
0
,
0
);
frameP
,
subframeP
,
0
,
0
);
LOG_D
(
OPT
,
"[UE %d][DLSCH] Frame %d trace pdu for rnti %x with size %d
\n
"
,
LOG_D
(
OPT
,
"[UE %d][DLSCH] Frame %d trace pdu for rnti %x with size %d
\n
"
,
module_idP
,
frameP
,
UE_mac_inst
[
module_idP
].
crnti
,
sdu_len
);
module_idP
,
frameP
,
UE_mac_inst
[
module_idP
].
crnti
,
sdu_len
);
}
}
...
@@ -1923,7 +1923,7 @@ if (UE_mac_inst[module_idP].scheduling_info.LCID_status[lcid] == LCID_NOT_EMPTY)
...
@@ -1923,7 +1923,7 @@ if (UE_mac_inst[module_idP].scheduling_info.LCID_status[lcid] == LCID_NOT_EMPTY)
if
(
opt_enabled
)
{
if
(
opt_enabled
)
{
trace_pdu
(
0
,
ulsch_buffer
,
buflen
,
module_idP
,
3
,
UE_mac_inst
[
module_idP
].
crnti
,
UE_mac_inst
[
module_idP
].
txFrame
,
UE_mac_inst
[
module_idP
].
txSubframe
,
0
,
0
);
trace_pdu
(
0
,
ulsch_buffer
,
buflen
,
module_idP
,
3
,
UE_mac_inst
[
module_idP
].
crnti
,
UE_mac_inst
[
module_idP
].
txFrame
,
UE_mac_inst
[
module_idP
].
txSubframe
,
0
,
0
);
LOG_D
(
OPT
,
"[UE %d][ULSCH] Frame %d subframe %d trace pdu for rnti %x with size %d
\n
"
,
LOG_D
(
OPT
,
"[UE %d][ULSCH] Frame %d subframe %d trace pdu for rnti %x with size %d
\n
"
,
module_idP
,
UE_mac_inst
[
module_idP
].
txFrame
,
UE_mac_inst
[
module_idP
].
txS
ubframe
,
UE_mac_inst
[
module_idP
].
crnti
,
buflen
);
module_idP
,
frameP
,
s
ubframe
,
UE_mac_inst
[
module_idP
].
crnti
,
buflen
);
}
}
}
}
...
@@ -2104,7 +2104,7 @@ ue_scheduler(
...
@@ -2104,7 +2104,7 @@ ue_scheduler(
/*
/*
if (lcid == DCCH) {
if (lcid == DCCH) {
LOG_D(MAC,"[UE %d][SR] Frame %d subframe %d Pending data for SRB1=%d for LCGID %d \n",
LOG_D(MAC,"[UE %d][SR] Frame %d subframe %d Pending data for SRB1=%d for LCGID %d \n",
module_idP,
frameP,s
ubframeP,UE_mac_inst[module_idP].scheduling_info.BSR[UE_mac_inst[module_idP].scheduling_info.LCGID[lcid]],
module_idP,
txFrameP,txS
ubframeP,UE_mac_inst[module_idP].scheduling_info.BSR[UE_mac_inst[module_idP].scheduling_info.LCGID[lcid]],
// UE_mac_inst[module_idP].scheduling_info.LCGID[lcid]);
// UE_mac_inst[module_idP].scheduling_info.LCGID[lcid]);
}
}
*/
*/
...
...
openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.c
View file @
67562c7e
...
@@ -91,7 +91,7 @@ rlc_am_send_sdu (
...
@@ -91,7 +91,7 @@ rlc_am_send_sdu (
const
protocol_ctxt_t
*
const
ctxt_pP
,
const
protocol_ctxt_t
*
const
ctxt_pP
,
rlc_am_entity_t
*
const
rlc_pP
)
rlc_am_entity_t
*
const
rlc_pP
)
{
{
# if TRACE_RLC_
U
M_PDU
# if TRACE_RLC_
A
M_PDU
char
message_string
[
7000
];
char
message_string
[
7000
];
size_t
message_string_size
=
0
;
size_t
message_string_size
=
0
;
#if ENABLE_ITTI
#if ENABLE_ITTI
...
...
openair2/UTIL/LOG/log.c
View file @
67562c7e
...
@@ -1032,6 +1032,19 @@ void logRecord_mt(const char *file, const char *func, int line, int comp,
...
@@ -1032,6 +1032,19 @@ void logRecord_mt(const char *file, const char *func, int line, int comp,
if
(
len
>
MAX_LOG_TOTAL
)
len
=
MAX_LOG_TOTAL
;
if
(
len
>
MAX_LOG_TOTAL
)
len
=
MAX_LOG_TOTAL
;
}
}
if
(
(
g_log
->
flag
&
FLAG_THREAD
)
||
(
c
->
flag
&
FLAG_THREAD
)
)
{
#define THREAD_NAME_LEN 16
static
char
threadname
[
THREAD_NAME_LEN
];
if
(
pthread_getname_np
(
pthread_self
(),
threadname
,
THREAD_NAME_LEN
)
!=
0
)
{
perror
(
"pthread_getname_np : "
);
}
else
{
len
+=
snprintf
(
&
log_buffer
[
len
],
MAX_LOG_TOTAL
-
len
,
"[%s]"
,
threadname
);
if
(
len
>
MAX_LOG_TOTAL
)
len
=
MAX_LOG_TOTAL
;
}
#undef THREAD_NAME_LEN
}
if
(
(
g_log
->
flag
&
FLAG_FUNCT
)
||
(
c
->
flag
&
FLAG_FUNCT
)
)
{
if
(
(
g_log
->
flag
&
FLAG_FUNCT
)
||
(
c
->
flag
&
FLAG_FUNCT
)
)
{
len
+=
snprintf
(
&
log_buffer
[
len
],
MAX_LOG_TOTAL
-
len
,
"[%s] "
,
len
+=
snprintf
(
&
log_buffer
[
len
],
MAX_LOG_TOTAL
-
len
,
"[%s] "
,
func
);
func
);
...
@@ -1287,11 +1300,15 @@ int set_comp_log(int component, int level, int verbosity, int interval)
...
@@ -1287,11 +1300,15 @@ int set_comp_log(int component, int level, int verbosity, int interval)
LOG_EMERG
);
LOG_EMERG
);
DevCheck
((
interval
>
0
)
&&
(
interval
<=
0xFF
),
interval
,
0
,
0xFF
);
DevCheck
((
interval
>
0
)
&&
(
interval
<=
0xFF
),
interval
,
0
,
0xFF
);
#if 0
if ((verbosity == LOG_NONE) || (verbosity == LOG_LOW) ||
if ((verbosity == LOG_NONE) || (verbosity == LOG_LOW) ||
(verbosity == LOG_MED) || (verbosity == LOG_FULL) ||
(verbosity == LOG_MED) || (verbosity == LOG_FULL) ||
(verbosity == LOG_HIGH)) {
(verbosity == LOG_HIGH)) {
g_log->log_component[component].flag = verbosity;
g_log->log_component[component].flag = verbosity;
}
}
#else
g_log
->
log_component
[
component
].
flag
=
verbosity
;
#endif
g_log
->
log_component
[
component
].
level
=
level
;
g_log
->
log_component
[
component
].
level
=
level
;
g_log
->
log_component
[
component
].
interval
=
interval
;
g_log
->
log_component
[
component
].
interval
=
interval
;
...
...
targets/RT/USER/lte-softmodem.c
View file @
67562c7e
...
@@ -329,6 +329,7 @@ void help (void) {
...
@@ -329,6 +329,7 @@ void help (void) {
printf
(
" --external-clock tells hardware to use an external clock reference
\n
"
);
printf
(
" --external-clock tells hardware to use an external clock reference
\n
"
);
printf
(
" --usim-test use XOR autentication algo in case of test usim mode
\n
"
);
printf
(
" --usim-test use XOR autentication algo in case of test usim mode
\n
"
);
printf
(
" --single-thread-disable. Disables single-thread mode in lte-softmodem
\n
"
);
printf
(
" --single-thread-disable. Disables single-thread mode in lte-softmodem
\n
"
);
printf
(
" -A Set timing_advance
\n
"
);
printf
(
" -C Set the downlink frequency for all component carriers
\n
"
);
printf
(
" -C Set the downlink frequency for all component carriers
\n
"
);
printf
(
" -d Enable soft scope and L1 and L2 stats (Xforms)
\n
"
);
printf
(
" -d Enable soft scope and L1 and L2 stats (Xforms)
\n
"
);
printf
(
" -F Calibrate the EXMIMO borad, available files: exmimo2_2arxg.lime exmimo2_2brxg.lime
\n
"
);
printf
(
" -F Calibrate the EXMIMO borad, available files: exmimo2_2arxg.lime exmimo2_2brxg.lime
\n
"
);
...
@@ -1417,7 +1418,7 @@ int main( int argc, char **argv ) {
...
@@ -1417,7 +1418,7 @@ int main( int argc, char **argv ) {
set_comp_log
(
HW
,
LOG_DEBUG
,
LOG_HIGH
,
1
);
set_comp_log
(
HW
,
LOG_DEBUG
,
LOG_HIGH
,
1
);
set_comp_log
(
PHY
,
LOG_DEBUG
,
LOG_HIGH
,
1
);
set_comp_log
(
PHY
,
LOG_DEBUG
,
LOG_HIGH
,
1
);
set_comp_log
(
MAC
,
LOG_INFO
,
LOG_HIGH
,
1
);
set_comp_log
(
MAC
,
LOG_INFO
,
LOG_HIGH
,
1
);
set_comp_log
(
RLC
,
LOG_INFO
,
LOG_HIGH
,
1
);
set_comp_log
(
RLC
,
LOG_INFO
,
LOG_HIGH
|
FLAG_THREAD
,
1
);
set_comp_log
(
PDCP
,
LOG_INFO
,
LOG_HIGH
,
1
);
set_comp_log
(
PDCP
,
LOG_INFO
,
LOG_HIGH
,
1
);
set_comp_log
(
OTG
,
LOG_INFO
,
LOG_HIGH
,
1
);
set_comp_log
(
OTG
,
LOG_INFO
,
LOG_HIGH
,
1
);
set_comp_log
(
RRC
,
LOG_INFO
,
LOG_HIGH
,
1
);
set_comp_log
(
RRC
,
LOG_INFO
,
LOG_HIGH
,
1
);
...
...
targets/SIMU/USER/oaisim.c
View file @
67562c7e
...
@@ -243,7 +243,7 @@ help (void)
...
@@ -243,7 +243,7 @@ help (void)
printf
(
"-L [0-1] 0 to disable new link adaptation, 1 to enable new link adapatation
\n
"
);
printf
(
"-L [0-1] 0 to disable new link adaptation, 1 to enable new link adapatation
\n
"
);
printf
(
"-m Gives a fixed DL mcs for eNB scheduler
\n
"
);
printf
(
"-m Gives a fixed DL mcs for eNB scheduler
\n
"
);
printf
(
"-M Set the machine ID for Ethernet-based emulation
\n
"
);
printf
(
"-M Set the machine ID for Ethernet-based emulation
\n
"
);
printf
(
"-n Set the number of frames for the simulation
\n
"
);
printf
(
"-n Set the number of frames for the simulation
. 0 for no limit
\n
"
);
printf
(
"-O [enb_conf_file] eNB configuration file name
\n
"
);
printf
(
"-O [enb_conf_file] eNB configuration file name
\n
"
);
printf
(
"-p Set the total number of machine in emulation - valid if M is set
\n
"
);
printf
(
"-p Set the total number of machine in emulation - valid if M is set
\n
"
);
printf
(
"-P [trace type] Enable protocol analyzer. Possible values for OPT:
\n
"
);
printf
(
"-P [trace type] Enable protocol analyzer. Possible values for OPT:
\n
"
);
...
...
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