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
b7762c6a
Commit
b7762c6a
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
9af7f280
9814de05
Changes
9
Show 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 @
b7762c6a
...
@@ -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 @
b7762c6a
...
@@ -493,6 +493,7 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form,
...
@@ -493,6 +493,7 @@ 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
;
int16_t
*
pdsch_mag
;
int8_t
*
pdcch_llr
;
int8_t
*
pdcch_llr
;
int16_t
*
pdcch_comp
;
int16_t
*
pdcch_comp
;
int8_t
*
pbch_llr
;
int8_t
*
pbch_llr
;
...
@@ -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 @
b7762c6a
...
@@ -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 @
b7762c6a
...
@@ -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 @
b7762c6a
...
@@ -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 @
b7762c6a
...
@@ -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 @
b7762c6a
...
@@ -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 @
b7762c6a
...
@@ -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 @
b7762c6a
...
@@ -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