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
b5206a5e
Commit
b5206a5e
authored
Jul 31, 2016
by
Raymond Knopp
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
modifications for if5
parent
0b3b06c9
Changes
5
Show whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
107 additions
and
93 deletions
+107
-93
targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf
...PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf
+1
-1
targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf
...PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf
+1
-1
targets/RT/USER/lte-enb.c
targets/RT/USER/lte-enb.c
+98
-31
targets/RT/USER/lte-softmodem.c
targets/RT/USER/lte-softmodem.c
+2
-60
targets/RT/USER/lte-ue.c
targets/RT/USER/lte-ue.c
+5
-0
No files found.
targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf
View file @
b5206a5e
...
@@ -23,7 +23,7 @@ eNBs =
...
@@ -23,7 +23,7 @@ eNBs =
component_carriers
= (
component_carriers
= (
{
{
node_function
=
"NGFI_RCC_IF4"
;
node_function
=
"NGFI_RCC_IF4
p5
"
;
node_timing
=
"synch_to_ext_device"
;
node_timing
=
"synch_to_ext_device"
;
node_synch_ref
=
0
;
node_synch_ref
=
0
;
frame_type
=
"FDD"
;
frame_type
=
"FDD"
;
...
...
targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf
View file @
b5206a5e
...
@@ -23,7 +23,7 @@ eNBs =
...
@@ -23,7 +23,7 @@ eNBs =
component_carriers
= (
component_carriers
= (
{
{
node_function
=
"NGFI_RRU_IF4"
;
node_function
=
"NGFI_RRU_IF4
p5
"
;
node_timing
=
"synch_to_ext_device"
;
node_timing
=
"synch_to_ext_device"
;
node_synch_ref
=
0
;
node_synch_ref
=
0
;
frame_type
=
"FDD"
;
frame_type
=
"FDD"
;
...
...
targets/RT/USER/lte-enb.c
View file @
b5206a5e
...
@@ -159,7 +159,7 @@ static struct {
...
@@ -159,7 +159,7 @@ static struct {
void
exit_fun
(
const
char
*
s
);
void
exit_fun
(
const
char
*
s
);
void
init_eNB
(
eNB_func_t
node_function
[],
eNB_timing_t
node_timing
[],
int
nb_inst
);
void
init_eNB
(
eNB_func_t
node_function
[],
eNB_timing_t
node_timing
[],
int
nb_inst
,
eth_params_t
*
);
void
stop_eNB
(
int
nb_inst
);
void
stop_eNB
(
int
nb_inst
);
...
@@ -1218,16 +1218,17 @@ static void* eNB_thread_FH( void* param ) {
...
@@ -1218,16 +1218,17 @@ static void* eNB_thread_FH( void* param ) {
wait_system_ready
(
"Waiting for eNB application to be ready %s
\r
"
,
&
start_eNB
);
wait_system_ready
(
"Waiting for eNB application to be ready %s
\r
"
,
&
start_eNB
);
#endif
#endif
// Start RF device if any
if
(
eNB
->
start_rf
)
if
(
eNB
->
start_rf
(
eNB
)
!=
0
)
LOG_E
(
HW
,
"Could not start the RF device
\n
"
);
// Start IF device if any
// Start IF device if any
if
(
eNB
->
start_if
)
if
(
eNB
->
start_if
)
if
(
eNB
->
start_if
(
eNB
)
!=
0
)
if
(
eNB
->
start_if
(
eNB
)
!=
0
)
LOG_E
(
HW
,
"Could not start the IF device
\n
"
);
LOG_E
(
HW
,
"Could not start the IF device
\n
"
);
// Start RF device if any
if
(
eNB
->
start_rf
)
if
(
eNB
->
start_rf
(
eNB
)
!=
0
)
LOG_E
(
HW
,
"Could not start the RF device
\n
"
);
// This is a forever while loop, it loops over subframes which are scheduled by incoming samples from HW devices
// This is a forever while loop, it loops over subframes which are scheduled by incoming samples from HW devices
while
(
!
oai_exit
)
{
while
(
!
oai_exit
)
{
...
@@ -1743,11 +1744,13 @@ extern void eNB_fep_rru_if5(PHY_VARS_eNB *eNB,eNB_proc_t *proc);
...
@@ -1743,11 +1744,13 @@ extern void eNB_fep_rru_if5(PHY_VARS_eNB *eNB,eNB_proc_t *proc);
extern
void
eNB_fep_full
(
PHY_VARS_eNB
*
eNB
,
eNB_proc_t
*
proc
);
extern
void
eNB_fep_full
(
PHY_VARS_eNB
*
eNB
,
eNB_proc_t
*
proc
);
extern
void
do_prach
(
PHY_VARS_eNB
*
eNB
,
eNB_proc_t
*
proc
);
extern
void
do_prach
(
PHY_VARS_eNB
*
eNB
,
eNB_proc_t
*
proc
);
void
init_eNB
(
eNB_func_t
node_function
[],
eNB_timing_t
node_timing
[],
int
nb_inst
)
{
void
init_eNB
(
eNB_func_t
node_function
[],
eNB_timing_t
node_timing
[],
int
nb_inst
,
eth_params_t
*
eth_params
)
{
int
CC_id
;
int
CC_id
;
int
inst
;
int
inst
;
PHY_VARS_eNB
*
eNB
;
PHY_VARS_eNB
*
eNB
;
int
ret
;
for
(
inst
=
0
;
inst
<
nb_inst
;
inst
++
)
{
for
(
inst
=
0
;
inst
<
nb_inst
;
inst
++
)
{
for
(
CC_id
=
0
;
CC_id
<
MAX_NUM_CCs
;
CC_id
++
)
{
for
(
CC_id
=
0
;
CC_id
<
MAX_NUM_CCs
;
CC_id
++
)
{
eNB
=
PHY_vars_eNB_g
[
inst
][
CC_id
];
eNB
=
PHY_vars_eNB_g
[
inst
][
CC_id
];
...
@@ -1755,16 +1758,30 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst
...
@@ -1755,16 +1758,30 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst
eNB
->
node_timing
=
node_timing
[
CC_id
];
eNB
->
node_timing
=
node_timing
[
CC_id
];
eNB
->
abstraction_flag
=
0
;
eNB
->
abstraction_flag
=
0
;
LOG_I
(
PHY
,
"Initializing eNB %d CC_id %d : (%s,%s)
\n
"
,
inst
,
CC_id
,
eNB_functions
[
node_function
[
CC_id
]],
eNB_timing
[
node_timing
[
CC_id
]]);
LOG_I
(
PHY
,
"Initializing eNB %d CC_id %d : (%s,%s)
\n
"
,
inst
,
CC_id
,
eNB_functions
[
node_function
[
CC_id
]],
eNB_timing
[
node_timing
[
CC_id
]]);
switch
(
node_function
[
CC_id
])
{
switch
(
node_function
[
CC_id
])
{
case
NGFI_RRU_IF5
:
case
NGFI_RRU_IF5
:
eNB
->
do_prach
=
NULL
;
eNB
->
do_prach
=
NULL
;
eNB
->
fep
=
eNB_fep_rru_if5
;
eNB
->
fep
=
eNB_fep_rru_if5
;
eNB
->
proc_uespec_rx
=
NULL
;
eNB
->
proc_uespec_rx
=
NULL
;
eNB
->
proc_tx
=
NULL
;
eNB
->
proc_tx
=
proc_tx_rru_if5
;
;
eNB
->
tx_fh
=
NULL
;
eNB
->
tx_fh
=
NULL
;
eNB
->
rx_fh
=
rx_rf
;
eNB
->
rx_fh
=
rx_rf
;
eNB
->
start_rf
=
start_rf
;
eNB
->
start_rf
=
start_rf
;
eNB
->
start_if
=
start_if
;
eNB
->
start_if
=
start_if
;
ret
=
openair0_device_load
(
&
eNB
->
rfdevice
,
&
openair0_cfg
[
0
]);
if
(
ret
<
0
)
{
printf
(
"Exiting, cannot initialize rf device
\n
"
);
exit
(
-
1
);
}
eNB
->
rfdevice
.
host_type
=
RRH_HOST
;
eNB
->
ifdevice
.
host_type
=
RRH_HOST
;
ret
=
openair0_transport_load
(
&
eNB
->
ifdevice
,
&
openair0_cfg
[
0
],
(
eth_params
+
CC_id
));
printf
(
"openair0_transport_init returns %d for CC_id %d
\n
"
,
ret
,
CC_id
);
if
(
ret
<
0
)
{
printf
(
"Exiting, cannot initialize transport protocol
\n
"
);
exit
(
-
1
);
}
break
;
break
;
case
NGFI_RRU_IF4p5
:
case
NGFI_RRU_IF4p5
:
eNB
->
do_prach
=
do_prach
;
eNB
->
do_prach
=
do_prach
;
...
@@ -1775,7 +1792,22 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst
...
@@ -1775,7 +1792,22 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst
eNB
->
rx_fh
=
rx_rf
;
eNB
->
rx_fh
=
rx_rf
;
eNB
->
start_rf
=
start_rf
;
eNB
->
start_rf
=
start_rf
;
eNB
->
start_if
=
start_if
;
eNB
->
start_if
=
start_if
;
ret
=
openair0_device_load
(
&
eNB
->
rfdevice
,
&
openair0_cfg
[
0
]);
if
(
ret
<
0
)
{
printf
(
"Exiting, cannot initialize rf device
\n
"
);
exit
(
-
1
);
}
eNB
->
rfdevice
.
host_type
=
RRH_HOST
;
eNB
->
ifdevice
.
host_type
=
RRH_HOST
;
ret
=
openair0_transport_load
(
&
eNB
->
ifdevice
,
&
openair0_cfg
[
0
],
(
eth_params
+
CC_id
));
printf
(
"openair0_transport_init returns %d for CC_id %d
\n
"
,
ret
,
CC_id
);
if
(
ret
<
0
)
{
printf
(
"Exiting, cannot initialize transport protocol
\n
"
);
exit
(
-
1
);
}
malloc_IF4p5_buffer
(
eNB
);
malloc_IF4p5_buffer
(
eNB
);
break
;
break
;
case
eNodeB_3GPP
:
case
eNodeB_3GPP
:
eNB
->
do_prach
=
do_prach
;
eNB
->
do_prach
=
do_prach
;
...
@@ -1786,6 +1818,13 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst
...
@@ -1786,6 +1818,13 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst
eNB
->
rx_fh
=
rx_rf
;
eNB
->
rx_fh
=
rx_rf
;
eNB
->
start_rf
=
start_rf
;
eNB
->
start_rf
=
start_rf
;
eNB
->
start_if
=
NULL
;
eNB
->
start_if
=
NULL
;
ret
=
openair0_device_load
(
&
eNB
->
rfdevice
,
&
openair0_cfg
[
0
]);
if
(
ret
<
0
)
{
printf
(
"Exiting, cannot initialize rf device
\n
"
);
exit
(
-
1
);
}
eNB
->
rfdevice
.
host_type
=
BBU_HOST
;
eNB
->
ifdevice
.
host_type
=
BBU_HOST
;
break
;
break
;
case
eNodeB_3GPP_BBU
:
case
eNodeB_3GPP_BBU
:
eNB
->
do_prach
=
do_prach
;
eNB
->
do_prach
=
do_prach
;
...
@@ -1796,6 +1835,15 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst
...
@@ -1796,6 +1835,15 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst
eNB
->
rx_fh
=
rx_fh_if5
;
eNB
->
rx_fh
=
rx_fh_if5
;
eNB
->
start_rf
=
NULL
;
eNB
->
start_rf
=
NULL
;
eNB
->
start_if
=
start_if
;
eNB
->
start_if
=
start_if
;
eNB
->
rfdevice
.
host_type
=
BBU_HOST
;
eNB
->
ifdevice
.
host_type
=
BBU_HOST
;
ret
=
openair0_transport_load
(
&
eNB
->
ifdevice
,
&
openair0_cfg
[
0
],
(
eth_params
+
CC_id
));
printf
(
"openair0_transport_init returns %d for CC_id %d
\n
"
,
ret
,
CC_id
);
if
(
ret
<
0
)
{
printf
(
"Exiting, cannot initialize transport protocol
\n
"
);
exit
(
-
1
);
}
break
;
break
;
case
NGFI_RCC_IF4p5
:
case
NGFI_RCC_IF4p5
:
eNB
->
do_prach
=
do_prach
;
eNB
->
do_prach
=
do_prach
;
...
@@ -1806,7 +1854,16 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst
...
@@ -1806,7 +1854,16 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst
eNB
->
rx_fh
=
rx_fh_if4p5
;
eNB
->
rx_fh
=
rx_fh_if4p5
;
eNB
->
start_rf
=
NULL
;
eNB
->
start_rf
=
NULL
;
eNB
->
start_if
=
start_if
;
eNB
->
start_if
=
start_if
;
eNB
->
rfdevice
.
host_type
=
BBU_HOST
;
eNB
->
ifdevice
.
host_type
=
BBU_HOST
;
ret
=
openair0_transport_load
(
&
eNB
->
ifdevice
,
&
openair0_cfg
[
0
],
(
eth_params
+
CC_id
));
printf
(
"openair0_transport_init returns %d for CC_id %d
\n
"
,
ret
,
CC_id
);
if
(
ret
<
0
)
{
printf
(
"Exiting, cannot initialize transport protocol
\n
"
);
exit
(
-
1
);
}
malloc_IF4p5_buffer
(
eNB
);
malloc_IF4p5_buffer
(
eNB
);
break
;
break
;
case
NGFI_RAU_IF4p5
:
case
NGFI_RAU_IF4p5
:
eNB
->
do_prach
=
do_prach
;
eNB
->
do_prach
=
do_prach
;
...
@@ -1817,8 +1874,18 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst
...
@@ -1817,8 +1874,18 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst
eNB
->
rx_fh
=
rx_fh_if4p5
;
eNB
->
rx_fh
=
rx_fh_if4p5
;
eNB
->
start_rf
=
NULL
;
eNB
->
start_rf
=
NULL
;
eNB
->
start_if
=
start_if
;
eNB
->
start_if
=
start_if
;
malloc_IF4p5_buffer
(
eNB
);
eNB
->
rfdevice
.
host_type
=
BBU_HOST
;
eNB
->
ifdevice
.
host_type
=
BBU_HOST
;
ret
=
openair0_transport_load
(
&
eNB
->
ifdevice
,
&
openair0_cfg
[
0
],
(
eth_params
+
CC_id
));
printf
(
"openair0_transport_init returns %d for CC_id %d
\n
"
,
ret
,
CC_id
);
if
(
ret
<
0
)
{
printf
(
"Exiting, cannot initialize transport protocol
\n
"
);
exit
(
-
1
);
}
break
;
break
;
malloc_IF4p5_buffer
(
eNB
);
}
}
}
}
...
...
targets/RT/USER/lte-softmodem.c
View file @
b5206a5e
...
@@ -119,7 +119,7 @@ unsigned short config_frames[4] = {2,9,11,13};
...
@@ -119,7 +119,7 @@ unsigned short config_frames[4] = {2,9,11,13};
// In lte-enb.c
// In lte-enb.c
extern
int
setup_eNB_buffers
(
PHY_VARS_eNB
**
phy_vars_eNB
,
openair0_config_t
*
openair0_cfg
,
openair0_rf_map
rf_map
[
MAX_NUM_CCs
]);
extern
int
setup_eNB_buffers
(
PHY_VARS_eNB
**
phy_vars_eNB
,
openair0_config_t
*
openair0_cfg
,
openair0_rf_map
rf_map
[
MAX_NUM_CCs
]);
extern
void
init_eNB
(
eNB_func_t
*
,
eNB_timing_t
*
,
int
);
extern
void
init_eNB
(
eNB_func_t
*
,
eNB_timing_t
*
,
int
,
eth_params_t
*
);
extern
void
stop_eNB
(
int
);
extern
void
stop_eNB
(
int
);
extern
void
kill_eNB_proc
(
void
);
extern
void
kill_eNB_proc
(
void
);
...
@@ -1643,64 +1643,6 @@ int main( int argc, char **argv )
...
@@ -1643,64 +1643,6 @@ int main( int argc, char **argv )
openair0_cfg
[
0
].
log_level
=
glog_level
;
openair0_cfg
[
0
].
log_level
=
glog_level
;
if
(
UE_flag
==
0
)
{
for
(
CC_id
=
0
;
CC_id
<
MAX_NUM_CCs
;
CC_id
++
)
{
if
(
node_function
[
CC_id
]
==
NGFI_RRU_IF4p5
||
node_function
[
CC_id
]
==
NGFI_RRU_IF5
)
{
PHY_vars_eNB_g
[
0
][
CC_id
]
->
rfdevice
.
host_type
=
RRH_HOST
;
PHY_vars_eNB_g
[
0
][
CC_id
]
->
ifdevice
.
host_type
=
RRH_HOST
;
}
else
{
PHY_vars_eNB_g
[
0
][
CC_id
]
->
rfdevice
.
host_type
=
BBU_HOST
;
PHY_vars_eNB_g
[
0
][
CC_id
]
->
ifdevice
.
host_type
=
BBU_HOST
;
}
}
}
else
{
/* device host type is set*/
PHY_vars_UE_g
[
0
][
0
]
->
rfdevice
.
host_type
=
BBU_HOST
;
/* device type is initialized NONE_DEV (no RF device) when the RF device will be initiated device type will be set */
PHY_vars_UE_g
[
0
][
0
]
->
rfdevice
.
type
=
NONE_DEV
;
/* transport type is initialized NONE_TP (no transport protocol) when the transport protocol will be initiated transport protocol type will be set */
PHY_vars_UE_g
[
0
][
0
]
->
rfdevice
.
transp_type
=
NONE_TP
;
}
int
returns
=-
1
;
// Load RF device and initialize
for
(
CC_id
=
0
;
CC_id
<
MAX_NUM_CCs
;
CC_id
++
)
{
if
(
node_function
[
CC_id
]
==
NGFI_RRU_IF5
||
node_function
[
CC_id
]
==
NGFI_RRU_IF4p5
||
node_function
[
CC_id
]
==
eNodeB_3GPP
)
{
if
(
mode
!=
loop_through_memory
)
{
returns
=
(
UE_flag
==
0
)
?
openair0_device_load
(
&
(
PHY_vars_eNB_g
[
0
][
CC_id
]
->
rfdevice
),
&
openair0_cfg
[
0
])
:
openair0_device_load
(
&
(
PHY_vars_UE_g
[
0
][
CC_id
]
->
rfdevice
),
&
openair0_cfg
[
0
]);
printf
(
"openair0_device_init returns %d for CC_id %d
\n
"
,
returns
,
CC_id
);
if
(
returns
<
0
)
{
printf
(
"Exiting, cannot initialize device
\n
"
);
exit
(
-
1
);
}
}
else
if
(
mode
==
loop_through_memory
)
{
}
}
}
// Load transport protocol and initialize
for
(
CC_id
=
0
;
CC_id
<
MAX_NUM_CCs
;
CC_id
++
)
{
if
((
UE_flag
==
0
)
&&
(
node_function
[
CC_id
]
!=
eNodeB_3GPP
))
{
if
(
mode
!=
loop_through_memory
)
{
returns
=
openair0_transport_load
(
&
(
PHY_vars_eNB_g
[
0
][
CC_id
]
->
ifdevice
),
&
openair0_cfg
[
0
],
(
eth_params
+
CC_id
));
printf
(
"openair0_transport_init returns %d for CC_id %d
\n
"
,
returns
,
CC_id
);
if
(
returns
<
0
)
{
printf
(
"Exiting, cannot initialize transport protocol
\n
"
);
exit
(
-
1
);
}
}
else
if
(
mode
==
loop_through_memory
)
{
}
}
}
printf
(
"Done initializing RF and IF devices
\n
"
);
mac_xface
=
malloc
(
sizeof
(
MAC_xface
));
mac_xface
=
malloc
(
sizeof
(
MAC_xface
));
...
@@ -1854,7 +1796,7 @@ int main( int argc, char **argv )
...
@@ -1854,7 +1796,7 @@ int main( int argc, char **argv )
// start the main thread
// start the main thread
if
(
UE_flag
==
1
)
init_UE
(
1
);
if
(
UE_flag
==
1
)
init_UE
(
1
);
else
init_eNB
(
node_function
,
node_timing
,
1
);
else
init_eNB
(
node_function
,
node_timing
,
1
,
eth_params
);
// Sleep to allow all threads to setup
// Sleep to allow all threads to setup
sleep
(
3
);
sleep
(
3
);
...
...
targets/RT/USER/lte-ue.c
View file @
b5206a5e
...
@@ -179,12 +179,17 @@ void init_UE(int nb_inst) {
...
@@ -179,12 +179,17 @@ void init_UE(int nb_inst) {
int
error_code
;
int
error_code
;
int
inst
;
int
inst
;
PHY_VARS_UE
*
UE
;
PHY_VARS_UE
*
UE
;
int
ret
;
for
(
inst
=
0
;
inst
<
nb_inst
;
inst
++
)
{
for
(
inst
=
0
;
inst
<
nb_inst
;
inst
++
)
{
printf
(
"Intializing UE Threads for instance %d ...
\n
"
,
inst
);
printf
(
"Intializing UE Threads for instance %d ...
\n
"
,
inst
);
init_UE_threads
(
inst
);
init_UE_threads
(
inst
);
sleep
(
1
);
sleep
(
1
);
UE
=
PHY_vars_UE_g
[
inst
][
0
];
UE
=
PHY_vars_UE_g
[
inst
][
0
];
ret
=
openair0_device_load
(
&
(
UE
->
rfdevice
),
&
openair0_cfg
[
0
]);
UE
->
rfdevice
.
host_type
=
BBU_HOST
;
UE
->
rfdevice
.
type
=
NONE_DEV
;
error_code
=
pthread_create
(
&
UE
->
proc
.
pthread_ue
,
&
UE
->
proc
.
attr_ue
,
UE_thread
,
NULL
);
error_code
=
pthread_create
(
&
UE
->
proc
.
pthread_ue
,
&
UE
->
proc
.
attr_ue
,
UE_thread
,
NULL
);
if
(
error_code
!=
0
)
{
if
(
error_code
!=
0
)
{
...
...
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