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
524be876
Commit
524be876
authored
Feb 22, 2018
by
Robert Schmidt
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
RAN API: unify style, declare missing function in header
parent
462a8777
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
62 additions
and
74 deletions
+62
-74
openair2/ENB_APP/flexran_agent_ran_api.c
openair2/ENB_APP/flexran_agent_ran_api.c
+53
-68
openair2/ENB_APP/flexran_agent_ran_api.h
openair2/ENB_APP/flexran_agent_ran_api.h
+9
-6
No files found.
openair2/ENB_APP/flexran_agent_ran_api.c
View file @
524be876
...
@@ -188,157 +188,142 @@ int32_t flexran_get_TA(mid_t mod_id, mid_t ue_id, uint8_t cc_id)
...
@@ -188,157 +188,142 @@ int32_t flexran_get_TA(mid_t mod_id, mid_t ue_id, uint8_t cc_id)
}
}
}
}
uint32_t
flexran_get_total_size_dl_mac_sdus
(
mid_t
mod_id
,
mid_t
ue_id
,
int
cc_id
)
{
uint32_t
flexran_get_total_size_dl_mac_sdus
(
mid_t
mod_id
,
mid_t
ue_id
,
int
cc_id
)
{
if
(
!
mac_is_present
(
mod_id
))
return
0
;
if
(
!
mac_is_present
(
mod_id
))
return
0
;
return
RC
.
mac
[
mod_id
]
->
UE_list
.
eNB_UE_stats
[
cc_id
][
ue_id
].
total_sdu_bytes
;
return
RC
.
mac
[
mod_id
]
->
UE_list
.
eNB_UE_stats
[
cc_id
][
ue_id
].
total_sdu_bytes
;
}
}
uint32_t
flexran_get_total_size_ul_mac_sdus
(
mid_t
mod_id
,
mid_t
ue_id
,
int
cc_id
)
{
uint32_t
flexran_get_total_size_ul_mac_sdus
(
mid_t
mod_id
,
mid_t
ue_id
,
int
cc_id
)
{
if
(
!
mac_is_present
(
mod_id
))
return
0
;
if
(
!
mac_is_present
(
mod_id
))
return
0
;
return
RC
.
mac
[
mod_id
]
->
eNB_stats
[
cc_id
].
total_ulsch_bytes_rx
;
return
RC
.
mac
[
mod_id
]
->
eNB_stats
[
cc_id
].
total_ulsch_bytes_rx
;
}
}
uint32_t
flexran_get_TBS_dl
(
mid_t
mod_id
,
mid_t
ue_id
,
int
cc_id
)
uint32_t
flexran_get_TBS_dl
(
mid_t
mod_id
,
mid_t
ue_id
,
int
cc_id
){
{
if
(
!
mac_is_present
(
mod_id
))
return
0
;
if
(
!
mac_is_present
(
mod_id
))
return
0
;
return
RC
.
mac
[
mod_id
]
->
UE_list
.
eNB_UE_stats
[
cc_id
][
ue_id
].
TBS
;
return
RC
.
mac
[
mod_id
]
->
UE_list
.
eNB_UE_stats
[
cc_id
][
ue_id
].
TBS
;
}
}
uint32_t
flexran_get_TBS_ul
(
mid_t
mod_id
,
mid_t
ue_id
,
int
cc_id
)
{
uint32_t
flexran_get_TBS_ul
(
mid_t
mod_id
,
mid_t
ue_id
,
int
cc_id
)
{
if
(
!
mac_is_present
(
mod_id
))
return
0
;
if
(
!
mac_is_present
(
mod_id
))
return
0
;
return
RC
.
mac
[
mod_id
]
->
UE_list
.
eNB_UE_stats
[
cc_id
][
ue_id
].
ulsch_TBS
;
return
RC
.
mac
[
mod_id
]
->
UE_list
.
eNB_UE_stats
[
cc_id
][
ue_id
].
ulsch_TBS
;
}
}
uint16_t
flexran_get_num_prb_retx_dl_per_ue
(
mid_t
mod_id
,
mid_t
ue_id
,
uint32_t
cc_id
)
{
uint16_t
flexran_get_num_prb_retx_dl_per_ue
(
mid_t
mod_id
,
mid_t
ue_id
,
int
cc_id
)
{
if
(
!
mac_is_present
(
mod_id
))
return
0
;
if
(
!
mac_is_present
(
mod_id
))
return
0
;
return
RC
.
mac
[
mod_id
]
->
UE_list
.
eNB_UE_stats
[
cc_id
][
ue_id
].
rbs_used_retx
;
return
RC
.
mac
[
mod_id
]
->
UE_list
.
eNB_UE_stats
[
cc_id
][
ue_id
].
rbs_used_retx
;
}
}
uint32_t
flexran_get_num_prb_retx_ul_per_ue
(
mid_t
mod_id
,
mid_t
ue_id
,
uint32_t
cc_id
){
uint32_t
flexran_get_num_prb_retx_ul_per_ue
(
mid_t
mod_id
,
mid_t
ue_id
,
int
cc_id
)
{
if
(
!
mac_is_present
(
mod_id
))
return
0
;
if
(
!
mac_is_present
(
mod_id
))
return
0
;
return
RC
.
mac
[
mod_id
]
->
UE_list
.
eNB_UE_stats
[
cc_id
][
ue_id
].
rbs_used_retx_rx
;
return
RC
.
mac
[
mod_id
]
->
UE_list
.
eNB_UE_stats
[
cc_id
][
ue_id
].
rbs_used_retx_rx
;
}
}
uint16_t
flexran_get_num_prb_dl_tx_per_ue
(
mid_t
mod_id
,
mid_t
ue_id
,
uint32_t
cc_id
){
uint16_t
flexran_get_num_prb_dl_tx_per_ue
(
mid_t
mod_id
,
mid_t
ue_id
,
int
cc_id
)
{
if
(
!
mac_is_present
(
mod_id
))
return
0
;
if
(
!
mac_is_present
(
mod_id
))
return
0
;
return
RC
.
mac
[
mod_id
]
->
UE_list
.
eNB_UE_stats
[
cc_id
][
ue_id
].
rbs_used
;
return
RC
.
mac
[
mod_id
]
->
UE_list
.
eNB_UE_stats
[
cc_id
][
ue_id
].
rbs_used
;
}
}
uint16_t
flexran_get_num_prb_ul_rx_per_ue
(
mid_t
mod_id
,
mid_t
ue_id
,
uint32_t
cc_id
){
uint16_t
flexran_get_num_prb_ul_rx_per_ue
(
mid_t
mod_id
,
mid_t
ue_id
,
int
cc_id
)
{
if
(
!
mac_is_present
(
mod_id
))
return
0
;
if
(
!
mac_is_present
(
mod_id
))
return
0
;
return
RC
.
mac
[
mod_id
]
->
UE_list
.
eNB_UE_stats
[
cc_id
][
ue_id
].
rbs_used_rx
;
return
RC
.
mac
[
mod_id
]
->
UE_list
.
eNB_UE_stats
[
cc_id
][
ue_id
].
rbs_used_rx
;
}
}
uint8_t
flexran_get_ue_wpmi
(
mid_t
mod_id
,
mid_t
ue_id
,
uint8_t
cc_id
)
uint8_t
flexran_get_ue_wpmi
(
mid_t
mod_id
,
mid_t
ue_id
,
uint8_t
cc_id
)
{
{
if
(
!
mac_is_present
(
mod_id
))
return
0
;
if
(
!
mac_is_present
(
mod_id
))
return
0
;
return
RC
.
mac
[
mod_id
]
->
UE_list
.
UE_sched_ctrl
[
ue_id
].
periodic_wideband_pmi
[
cc_id
];
return
RC
.
mac
[
mod_id
]
->
UE_list
.
UE_sched_ctrl
[
ue_id
].
periodic_wideband_pmi
[
cc_id
];
}
}
uint8_t
flexran_get_mcs1_dl
(
mid_t
mod_id
,
mid_t
ue_id
,
int
cc_id
)
{
uint8_t
flexran_get_mcs1_dl
(
mid_t
mod_id
,
mid_t
ue_id
,
int
cc_id
)
{
if
(
!
mac_is_present
(
mod_id
))
return
0
;
if
(
!
mac_is_present
(
mod_id
))
return
0
;
return
RC
.
mac
[
mod_id
]
->
UE_list
.
eNB_UE_stats
[
cc_id
][
ue_id
].
dlsch_mcs1
;
return
RC
.
mac
[
mod_id
]
->
UE_list
.
eNB_UE_stats
[
cc_id
][
ue_id
].
dlsch_mcs1
;
}
}
uint8_t
flexran_get_mcs2_dl
(
mid_t
mod_id
,
mid_t
ue_id
,
int
cc_id
)
{
uint8_t
flexran_get_mcs2_dl
(
mid_t
mod_id
,
mid_t
ue_id
,
int
cc_id
)
{
if
(
!
mac_is_present
(
mod_id
))
return
0
;
if
(
!
mac_is_present
(
mod_id
))
return
0
;
return
RC
.
mac
[
mod_id
]
->
UE_list
.
eNB_UE_stats
[
cc_id
][
ue_id
].
dlsch_mcs2
;
return
RC
.
mac
[
mod_id
]
->
UE_list
.
eNB_UE_stats
[
cc_id
][
ue_id
].
dlsch_mcs2
;
}
}
uint8_t
flexran_get_mcs1_ul
(
mid_t
mod_id
,
mid_t
ue_id
,
int
cc_id
)
{
uint8_t
flexran_get_mcs1_ul
(
mid_t
mod_id
,
mid_t
ue_id
,
int
cc_id
)
{
if
(
!
mac_is_present
(
mod_id
))
return
0
;
if
(
!
mac_is_present
(
mod_id
))
return
0
;
return
RC
.
mac
[
mod_id
]
->
UE_list
.
eNB_UE_stats
[
cc_id
][
ue_id
].
ulsch_mcs1
;
return
RC
.
mac
[
mod_id
]
->
UE_list
.
eNB_UE_stats
[
cc_id
][
ue_id
].
ulsch_mcs1
;
}
}
uint8_t
flexran_get_mcs2_ul
(
mid_t
mod_id
,
mid_t
ue_id
,
int
cc_id
)
{
uint8_t
flexran_get_mcs2_ul
(
mid_t
mod_id
,
mid_t
ue_id
,
int
cc_id
)
{
if
(
!
mac_is_present
(
mod_id
))
return
0
;
if
(
!
mac_is_present
(
mod_id
))
return
0
;
return
RC
.
mac
[
mod_id
]
->
UE_list
.
eNB_UE_stats
[
cc_id
][
ue_id
].
ulsch_mcs2
;
return
RC
.
mac
[
mod_id
]
->
UE_list
.
eNB_UE_stats
[
cc_id
][
ue_id
].
ulsch_mcs2
;
}
}
uint32_t
flexran_get_total_prb_dl_tx_per_ue
(
mid_t
mod_id
,
mid_t
ue_id
,
int
cc_id
)
{
uint32_t
flexran_get_total_prb_dl_tx_per_ue
(
mid_t
mod_id
,
mid_t
ue_id
,
int
cc_id
)
{
if
(
!
mac_is_present
(
mod_id
))
return
0
;
if
(
!
mac_is_present
(
mod_id
))
return
0
;
return
RC
.
mac
[
mod_id
]
->
UE_list
.
eNB_UE_stats
[
cc_id
][
ue_id
].
total_rbs_used
;
return
RC
.
mac
[
mod_id
]
->
UE_list
.
eNB_UE_stats
[
cc_id
][
ue_id
].
total_rbs_used
;
}
}
uint32_t
flexran_get_total_prb_ul_rx_per_ue
(
mid_t
mod_id
,
mid_t
ue_id
,
int
cc_id
)
{
uint32_t
flexran_get_total_prb_ul_rx_per_ue
(
mid_t
mod_id
,
mid_t
ue_id
,
int
cc_id
)
{
if
(
!
mac_is_present
(
mod_id
))
return
0
;
if
(
!
mac_is_present
(
mod_id
))
return
0
;
return
RC
.
mac
[
mod_id
]
->
UE_list
.
eNB_UE_stats
[
cc_id
][
ue_id
].
total_rbs_used_rx
;
return
RC
.
mac
[
mod_id
]
->
UE_list
.
eNB_UE_stats
[
cc_id
][
ue_id
].
total_rbs_used_rx
;
}
}
uint32_t
flexran_get_total_num_pdu_dl
(
mid_t
mod_id
,
mid_t
ue_id
,
int
cc_id
)
{
uint32_t
flexran_get_total_num_pdu_dl
(
mid_t
mod_id
,
mid_t
ue_id
,
int
cc_id
)
{
if
(
!
mac_is_present
(
mod_id
))
return
0
;
if
(
!
mac_is_present
(
mod_id
))
return
0
;
return
RC
.
mac
[
mod_id
]
->
UE_list
.
eNB_UE_stats
[
cc_id
][
ue_id
].
total_num_pdus
;
return
RC
.
mac
[
mod_id
]
->
UE_list
.
eNB_UE_stats
[
cc_id
][
ue_id
].
total_num_pdus
;
}
}
uint32_t
flexran_get_total_num_pdu_ul
(
mid_t
mod_id
,
mid_t
ue_id
,
int
cc_id
)
{
uint32_t
flexran_get_total_num_pdu_ul
(
mid_t
mod_id
,
mid_t
ue_id
,
int
cc_id
)
{
if
(
!
mac_is_present
(
mod_id
))
return
0
;
if
(
!
mac_is_present
(
mod_id
))
return
0
;
return
RC
.
mac
[
mod_id
]
->
UE_list
.
eNB_UE_stats
[
cc_id
][
ue_id
].
total_num_pdus_rx
;
return
RC
.
mac
[
mod_id
]
->
UE_list
.
eNB_UE_stats
[
cc_id
][
ue_id
].
total_num_pdus_rx
;
}
}
uint64_t
flexran_get_total_TBS_dl
(
mid_t
mod_id
,
mid_t
ue_id
,
int
cc_id
)
{
uint64_t
flexran_get_total_TBS_dl
(
mid_t
mod_id
,
mid_t
ue_id
,
int
cc_id
)
{
if
(
!
mac_is_present
(
mod_id
))
return
0
;
if
(
!
mac_is_present
(
mod_id
))
return
0
;
return
RC
.
mac
[
mod_id
]
->
UE_list
.
eNB_UE_stats
[
cc_id
][
ue_id
].
total_pdu_bytes
;
return
RC
.
mac
[
mod_id
]
->
UE_list
.
eNB_UE_stats
[
cc_id
][
ue_id
].
total_pdu_bytes
;
}
}
uint64_t
flexran_get_total_TBS_ul
(
mid_t
mod_id
,
mid_t
ue_id
,
int
cc_id
)
{
uint64_t
flexran_get_total_TBS_ul
(
mid_t
mod_id
,
mid_t
ue_id
,
int
cc_id
)
{
if
(
!
mac_is_present
(
mod_id
))
return
0
;
if
(
!
mac_is_present
(
mod_id
))
return
0
;
return
RC
.
mac
[
mod_id
]
->
UE_list
.
eNB_UE_stats
[
cc_id
][
ue_id
].
total_ulsch_TBS
;
return
RC
.
mac
[
mod_id
]
->
UE_list
.
eNB_UE_stats
[
cc_id
][
ue_id
].
total_ulsch_TBS
;
}
}
int
flexran_get_harq_round
(
mid_t
mod_id
,
uint8_t
cc_id
,
mid_t
ue_id
)
{
int
flexran_get_harq_round
(
mid_t
mod_id
,
uint8_t
cc_id
,
mid_t
ue_id
)
{
if
(
!
mac_is_present
(
mod_id
))
return
0
;
if
(
!
mac_is_present
(
mod_id
))
return
0
;
return
RC
.
mac
[
mod_id
]
->
UE_list
.
eNB_UE_stats
[
cc_id
][
ue_id
].
harq_round
;
return
RC
.
mac
[
mod_id
]
->
UE_list
.
eNB_UE_stats
[
cc_id
][
ue_id
].
harq_round
;
}
}
uint32_t
flexran_get_num_mac_sdu_tx
(
mid_t
mod_id
,
mid_t
ue_id
,
int
cc_id
){
uint32_t
flexran_get_num_mac_sdu_tx
(
mid_t
mod_id
,
mid_t
ue_id
,
int
cc_id
)
{
if
(
!
mac_is_present
(
mod_id
))
return
0
;
if
(
!
mac_is_present
(
mod_id
))
return
0
;
return
RC
.
mac
[
mod_id
]
->
UE_list
.
eNB_UE_stats
[
cc_id
][
ue_id
].
num_mac_sdu_tx
;
return
RC
.
mac
[
mod_id
]
->
UE_list
.
eNB_UE_stats
[
cc_id
][
ue_id
].
num_mac_sdu_tx
;
}
}
unsigned
char
flexran_get_mac_sdu_lcid_index
(
mid_t
mod_id
,
mid_t
ue_id
,
int
cc_id
,
int
index
)
{
unsigned
char
flexran_get_mac_sdu_lcid_index
(
mid_t
mod_id
,
mid_t
ue_id
,
int
cc_id
,
int
index
)
{
if
(
!
mac_is_present
(
mod_id
))
return
0
;
if
(
!
mac_is_present
(
mod_id
))
return
0
;
return
RC
.
mac
[
mod_id
]
->
UE_list
.
eNB_UE_stats
[
cc_id
][
ue_id
].
lcid_sdu
[
index
];
return
RC
.
mac
[
mod_id
]
->
UE_list
.
eNB_UE_stats
[
cc_id
][
ue_id
].
lcid_sdu
[
index
];
}
}
uint32_t
flexran_get_mac_sdu_size
(
mid_t
mod_id
,
mid_t
ue_id
,
int
cc_id
,
int
lcid
)
{
uint32_t
flexran_get_mac_sdu_size
(
mid_t
mod_id
,
mid_t
ue_id
,
int
cc_id
,
int
lcid
)
{
if
(
!
mac_is_present
(
mod_id
))
return
0
;
if
(
!
mac_is_present
(
mod_id
))
return
0
;
return
RC
.
mac
[
mod_id
]
->
UE_list
.
eNB_UE_stats
[
cc_id
][
ue_id
].
sdu_length_tx
[
lcid
];
return
RC
.
mac
[
mod_id
]
->
UE_list
.
eNB_UE_stats
[
cc_id
][
ue_id
].
sdu_length_tx
[
lcid
];
}
}
...
...
openair2/ENB_APP/flexran_agent_ran_api.h
View file @
524be876
...
@@ -120,10 +120,10 @@ uint32_t flexran_get_num_mac_sdu_tx(mid_t mod_id, mid_t ue_id, int cc_id);
...
@@ -120,10 +120,10 @@ uint32_t flexran_get_num_mac_sdu_tx(mid_t mod_id, mid_t ue_id, int cc_id);
unsigned
char
flexran_get_mac_sdu_lcid_index
(
mid_t
mod_id
,
mid_t
ue_id
,
int
cc_id
,
int
index
);
unsigned
char
flexran_get_mac_sdu_lcid_index
(
mid_t
mod_id
,
mid_t
ue_id
,
int
cc_id
,
int
index
);
/*Get MAC size sdus length dl*/
/*Get MAC size sdus length dl*/
uint32_t
flexran_get_size_dl_mac_sdus
(
mid_t
mod_id
,
uint32_
t
cc_id
);
uint32_t
flexran_get_size_dl_mac_sdus
(
mid_t
mod_id
,
in
t
cc_id
);
/*Get MAC size sdus length ul */
/*Get MAC size sdus length ul */
uint32_t
flexran_get_size_ul_mac_sdus
(
mid_t
mod_id
,
uint32_
t
cc_id
);
uint32_t
flexran_get_size_ul_mac_sdus
(
mid_t
mod_id
,
in
t
cc_id
);
/*Get total size DL MAC SDUS*/
/*Get total size DL MAC SDUS*/
uint32_t
flexran_get_total_size_dl_mac_sdus
(
mid_t
mod_id
,
mid_t
ue_id
,
int
cc_id
);
uint32_t
flexran_get_total_size_dl_mac_sdus
(
mid_t
mod_id
,
mid_t
ue_id
,
int
cc_id
);
...
@@ -144,16 +144,16 @@ uint32_t flexran_get_total_prb_dl_tx_per_ue(mid_t mod_id, mid_t ue_id, int cc_id
...
@@ -144,16 +144,16 @@ uint32_t flexran_get_total_prb_dl_tx_per_ue(mid_t mod_id, mid_t ue_id, int cc_id
uint32_t
flexran_get_total_prb_ul_rx_per_ue
(
mid_t
mod_id
,
mid_t
ue_id
,
int
cc_id
);
uint32_t
flexran_get_total_prb_ul_rx_per_ue
(
mid_t
mod_id
,
mid_t
ue_id
,
int
cc_id
);
/*Get number of prb for tx per UE DL*/
/*Get number of prb for tx per UE DL*/
uint16_t
flexran_get_num_prb_dl_tx_per_ue
(
mid_t
mod_id
,
mid_t
ue_id
,
uint32_
t
cc_id
);
uint16_t
flexran_get_num_prb_dl_tx_per_ue
(
mid_t
mod_id
,
mid_t
ue_id
,
in
t
cc_id
);
/*Get number of prb for rx per UE UL*/
/*Get number of prb for rx per UE UL*/
uint16_t
flexran_get_num_prb_ul_rx_per_ue
(
mid_t
mod_id
,
mid_t
ue_id
,
uint32_
t
cc_id
);
uint16_t
flexran_get_num_prb_ul_rx_per_ue
(
mid_t
mod_id
,
mid_t
ue_id
,
in
t
cc_id
);
/*Get number of prb for retx per UE UL*/
/*Get number of prb for retx per UE UL*/
uint32_t
flexran_get_num_prb_retx_ul_per_ue
(
mid_t
mod_id
,
mid_t
ue_id
,
uint32_
t
cc_id
);
uint32_t
flexran_get_num_prb_retx_ul_per_ue
(
mid_t
mod_id
,
mid_t
ue_id
,
in
t
cc_id
);
/*Get number of prb for retx per UE*/
/*Get number of prb for retx per UE*/
uint16_t
flexran_get_num_prb_retx_dl_per_ue
(
mid_t
mod_id
,
mid_t
ue_id
,
uint32_
t
cc_id
);
uint16_t
flexran_get_num_prb_retx_dl_per_ue
(
mid_t
mod_id
,
mid_t
ue_id
,
in
t
cc_id
);
/*MCS before rate adaptation DL*/
/*MCS before rate adaptation DL*/
uint8_t
flexran_get_mcs1_dl
(
mid_t
mod_id
,
mid_t
ue_id
,
int
cc_id
);
uint8_t
flexran_get_mcs1_dl
(
mid_t
mod_id
,
mid_t
ue_id
,
int
cc_id
);
...
@@ -179,6 +179,9 @@ uint64_t flexran_get_total_TBS_dl(mid_t mod_id, mid_t ue_id, int cc_id);
...
@@ -179,6 +179,9 @@ uint64_t flexran_get_total_TBS_dl(mid_t mod_id, mid_t ue_id, int cc_id);
/*Get total TBS DL*/
/*Get total TBS DL*/
uint64_t
flexran_get_total_TBS_ul
(
mid_t
mod_id
,
mid_t
ue_id
,
int
cc_id
);
uint64_t
flexran_get_total_TBS_ul
(
mid_t
mod_id
,
mid_t
ue_id
,
int
cc_id
);
/* Get the current HARQ round for UE ue_id */
int
flexran_get_harq_round
(
mid_t
mod_id
,
uint8_t
cc_id
,
mid_t
ue_id
);
/* Get the number of active component carriers for a specific UE */
/* Get the number of active component carriers for a specific UE */
int
flexran_get_active_CC
(
mid_t
mod_id
,
mid_t
ue_id
);
int
flexran_get_active_CC
(
mid_t
mod_id
,
mid_t
ue_id
);
...
...
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