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
常顺宇
OpenXG-RAN
Commits
b7a16618
Commit
b7a16618
authored
Dec 12, 2017
by
Navid Nikaein
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Better management of frame counter and stats in PDCP
parent
38627c85
Changes
6
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
76 additions
and
72 deletions
+76
-72
openair2/ENB_APP/CONTROL_MODULES/PDCP/flexran_agent_pdcp.c
openair2/ENB_APP/CONTROL_MODULES/PDCP/flexran_agent_pdcp.c
+4
-1
openair2/ENB_APP/MESSAGES/V2/stats_common.proto
openair2/ENB_APP/MESSAGES/V2/stats_common.proto
+2
-0
openair2/ENB_APP/flexran_agent_ran_api.c
openair2/ENB_APP/flexran_agent_ran_api.c
+4
-0
openair2/ENB_APP/flexran_agent_ran_api.h
openair2/ENB_APP/flexran_agent_ran_api.h
+3
-0
openair2/LAYER2/PDCP_v10.1.0/pdcp.c
openair2/LAYER2/PDCP_v10.1.0/pdcp.c
+59
-68
openair2/LAYER2/PDCP_v10.1.0/pdcp.h
openair2/LAYER2/PDCP_v10.1.0/pdcp.h
+4
-3
No files found.
openair2/ENB_APP/CONTROL_MODULES/PDCP/flexran_agent_pdcp.c
View file @
b7a16618
...
...
@@ -21,7 +21,7 @@
/*! \file flexran_agent_pdcp.c
* \brief FlexRAN agent Control Module PDCP
* \author shahab SHARIAT BAGHERI
* \author
Navid Nikaein and
shahab SHARIAT BAGHERI
* \date 2017
* \version 0.1
*/
...
...
@@ -118,6 +118,9 @@ int flexran_agent_pdcp_stats_reply(mid_t mod_id,
pdcp_aggr_stats
->
pkt_rx_sn
=
flexran_get_pdcp_rx_sn
(
mod_id
,
i
,
DEFAULT_DRB
);
pdcp_aggr_stats
->
has_pkt_rx_sn
=
1
;
pdcp_aggr_stats
->
sfn
=
flexran_get_pdcp_sfn
(
mod_id
);
pdcp_aggr_stats
->
has_sfn
=
1
;
ue_report
[
i
]
->
pdcp_stats
=
pdcp_aggr_stats
;
}
...
...
openair2/ENB_APP/MESSAGES/V2/stats_common.proto
View file @
b7a16618
...
...
@@ -266,4 +266,6 @@ message flex_pdcp_stats {
optional
uint32
pkt_rx_aiat
=
14
;
optional
uint32
pkt_rx_aiat_s
=
15
;
optional
uint32
pkt_rx_oo
=
16
;
optional
uint64
sfn
=
17
;
}
openair2/ENB_APP/flexran_agent_ran_api.c
View file @
b7a16618
...
...
@@ -1083,6 +1083,10 @@ void flexran_agent_set_operating_frame_type (mid_t mod_id, int cc_id, int frame_
}
/*********** PDCP *************/
/*PDCP num tx pdu status flexRAN*/
uint32_t
flexran_get_pdcp_sfn
(
const
mid_t
mod_id
){
return
Pdcp_sfn
[
mod_id
];
}
/*PDCP num tx pdu status flexRAN*/
uint32_t
flexran_get_pdcp_tx
(
const
mid_t
mod_id
,
const
mid_t
ue_id
,
const
lcid_t
lcid
){
...
...
openair2/ENB_APP/flexran_agent_ran_api.h
View file @
b7a16618
...
...
@@ -342,6 +342,9 @@ int flexran_get_rrc_status(const mid_t mod_id, const rnti_t rntiP);
/***************************** PDCP ***********************/
/*PDCP superframe numberflexRAN*/
uint32_t
flexran_get_pdcp_sfn
(
const
mid_t
mod_id
);
/*PDCP num tx pdu status flexRAN*/
uint32_t
flexran_get_pdcp_tx
(
const
mid_t
mod_id
,
const
mid_t
ue_id
,
const
lcid_t
lcid
);
...
...
openair2/LAYER2/PDCP_v10.1.0/pdcp.c
View file @
b7a16618
...
...
@@ -414,19 +414,9 @@ boolean_t pdcp_data_req(
Pdcp_stats_tx_bytes_s
[
ctxt_pP
->
module_id
][
pdcp_uid
][
rb_idP
+
rb_offset
]
+=
sdu_buffer_sizeP
;
Pdcp_stats_tx_sn
[
ctxt_pP
->
module_id
][
pdcp_uid
][
rb_idP
+
rb_offset
]
=
current_sn
;
if
(
Pdcp_stats_tx_iat
[
ctxt_pP
->
module_id
][
pdcp_uid
][
rb_idP
+
rb_offset
]
<
pdcp_frame
*
10
+
pdcp_subframe
)
{
Pdcp_stats_tx_aiat
[
ctxt_pP
->
module_id
][
pdcp_uid
][
rb_idP
+
rb_offset
]
+=
(
pdcp_frame
*
10
+
pdcp_subframe
-
Pdcp_stats_tx_iat
[
ctxt_pP
->
module_id
][
pdcp_uid
][
rb_idP
+
rb_offset
]);
Pdcp_stats_tx_aiat_tmp_s
[
ctxt_pP
->
module_id
][
pdcp_uid
][
rb_idP
+
rb_offset
]
+=
(
pdcp_frame
*
10
+
pdcp_subframe
-
Pdcp_stats_tx_iat
[
ctxt_pP
->
module_id
][
pdcp_uid
][
rb_idP
+
rb_offset
]);
}
else
{
Pdcp_stats_tx_aiat
[
ctxt_pP
->
module_id
][
pdcp_uid
][
rb_idP
+
rb_offset
]
+=
(
1024
+
pdcp_frame
*
10
+
pdcp_subframe
-
Pdcp_stats_tx_iat
[
ctxt_pP
->
module_id
][
pdcp_uid
][
rb_idP
+
rb_offset
]);
Pdcp_stats_tx_aiat_tmp_s
[
ctxt_pP
->
module_id
][
pdcp_uid
][
rb_idP
+
rb_offset
]
+=
(
1024
+
pdcp_frame
*
10
+
pdcp_subframe
-
Pdcp_stats_tx_iat
[
ctxt_pP
->
module_id
][
pdcp_uid
][
rb_idP
+
rb_offset
]);
}
Pdcp_stats_tx_iat
[
ctxt_pP
->
module_id
][
pdcp_uid
][
rb_idP
+
rb_offset
]
=
ctxt_pP
->
frame
*
10
+
ctxt_pP
->
subframe
;
Pdcp_stats_tx_aiat
[
ctxt_pP
->
module_id
][
pdcp_uid
][
rb_idP
+
rb_offset
]
+=
(
Pdcp_sfn
[
ctxt_pP
->
module_id
]
-
Pdcp_stats_tx_iat
[
ctxt_pP
->
module_id
][
pdcp_uid
][
rb_idP
+
rb_offset
]);
Pdcp_stats_tx_aiat_tmp_s
[
ctxt_pP
->
module_id
][
pdcp_uid
][
rb_idP
+
rb_offset
]
+=
(
Pdcp_sfn
[
ctxt_pP
->
module_id
]
-
Pdcp_stats_tx_iat
[
ctxt_pP
->
module_id
][
pdcp_uid
][
rb_idP
+
rb_offset
]);
Pdcp_stats_tx_iat
[
ctxt_pP
->
module_id
][
pdcp_uid
][
rb_idP
+
rb_offset
]
=
Pdcp_sfn
[
ctxt_pP
->
module_id
];
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_PDCP_DATA_REQ
,
VCD_FUNCTION_OUT
);
return
ret
;
...
...
@@ -814,43 +804,6 @@ pdcp_data_ind(
GTPV1U_ENB_TUNNEL_DATA_REQ
(
message_p
).
rab_id
=
rb_id
+
4
;
itti_send_msg_to_task
(
TASK_GTPV1_U
,
INSTANCE_DEFAULT
,
message_p
);
packet_forwarded
=
TRUE
;
/* Print octets of incoming data in hexadecimal form */
LOG_D
(
PDCP
,
"Following content has been received from RLC (%d,%d)(PDCP header has already been removed):
\n
"
,
sdu_buffer_sizeP
-
payload_offset
+
(
int
)
sizeof
(
pdcp_data_ind_header_t
),
sdu_buffer_sizeP
-
payload_offset
);
//util_print_hex_octets(PDCP, &new_sdu_p->data[sizeof (pdcp_data_ind_header_t)], sdu_buffer_sizeP - payload_offset);
//util_flush_hex_octets(PDCP, &new_sdu_p->data[sizeof (pdcp_data_ind_header_t)], sdu_buffer_sizeP - payload_offset);
/*
* Update PDCP statistics
* XXX Following two actions are identical, is there a merge error?
*/
for
(
pdcp_uid
=
0
;
pdcp_uid
<
NUMBER_OF_UE_MAX
;
pdcp_uid
++
){
if
(
pdcp_p
->
rnti
[
pdcp_uid
]
==
ctxt_pP
->
rnti
)
break
;
}
Pdcp_stats_rx
[
ctxt_pP
->
module_id
][
pdcp_uid
][
rb_idP
+
rb_offset
]
++
;
Pdcp_stats_rx_s
[
ctxt_pP
->
module_id
][
pdcp_uid
][
rb_idP
+
rb_offset
]
++
;
Pdcp_stats_rx_bytes
[
ctxt_pP
->
module_id
][
pdcp_uid
][
rb_idP
+
rb_offset
]
+=
(
sdu_buffer_sizeP
-
payload_offset
);
Pdcp_stats_rx_bytes_s
[
ctxt_pP
->
module_id
][
pdcp_uid
][
rb_idP
+
rb_offset
]
+=
(
sdu_buffer_sizeP
-
payload_offset
);
Pdcp_stats_rx_sn
[
ctxt_pP
->
module_id
][
pdcp_uid
][
rb_idP
+
rb_offset
]
=
sequence_number
;
if
(
oo_flag
==
1
)
Pdcp_stats_rx_outoforder
[
ctxt_pP
->
module_id
][
pdcp_uid
][
rb_idP
+
rb_offset
]
++
;
if
(
Pdcp_stats_rx_iat
[
ctxt_pP
->
module_id
][
pdcp_uid
][
rb_idP
+
rb_offset
]
<
pdcp_frame
*
10
+
pdcp_subframe
)
{
Pdcp_stats_rx_aiat
[
ctxt_pP
->
module_id
][
pdcp_uid
][
rb_idP
+
rb_offset
]
+=
(
pdcp_frame
*
10
+
pdcp_subframe
-
Pdcp_stats_rx_iat
[
ctxt_pP
->
module_id
][
pdcp_uid
][
rb_idP
+
rb_offset
]);
Pdcp_stats_rx_aiat_tmp_s
[
ctxt_pP
->
module_id
][
pdcp_uid
][
rb_idP
+
rb_offset
]
+=
(
pdcp_frame
*
10
+
pdcp_subframe
-
Pdcp_stats_rx_iat
[
ctxt_pP
->
module_id
][
pdcp_uid
][
rb_idP
+
rb_offset
]);
}
else
{
Pdcp_stats_rx_aiat
[
ctxt_pP
->
module_id
][
pdcp_uid
][
rb_idP
+
rb_offset
]
+=
(
1024
+
pdcp_frame
*
10
+
pdcp_subframe
-
Pdcp_stats_rx_iat
[
ctxt_pP
->
module_id
][
pdcp_uid
][
rb_idP
+
rb_offset
]);
Pdcp_stats_rx_aiat_tmp_s
[
ctxt_pP
->
module_id
][
pdcp_uid
][
rb_idP
+
rb_offset
]
+=
(
1024
+
pdcp_frame
*
10
+
pdcp_subframe
-
Pdcp_stats_rx_iat
[
ctxt_pP
->
module_id
][
pdcp_uid
][
rb_idP
+
rb_offset
]);
}
Pdcp_stats_rx_iat
[
ctxt_pP
->
module_id
][
pdcp_uid
][
rb_idP
+
rb_offset
]
=
pdcp_frame
*
10
+
pdcp_subframe
;
}
#else
...
...
@@ -909,6 +862,38 @@ pdcp_data_ind(
}
}
/* Print octets of incoming data in hexadecimal form */
LOG_D
(
PDCP
,
"Following content has been received from RLC (%d,%d)(PDCP header has already been removed):
\n
"
,
sdu_buffer_sizeP
-
payload_offset
+
(
int
)
sizeof
(
pdcp_data_ind_header_t
),
sdu_buffer_sizeP
-
payload_offset
);
//util_print_hex_octets(PDCP, &new_sdu_p->data[sizeof (pdcp_data_ind_header_t)], sdu_buffer_sizeP - payload_offset);
//util_flush_hex_octets(PDCP, &new_sdu_p->data[sizeof (pdcp_data_ind_header_t)], sdu_buffer_sizeP - payload_offset);
/*
* Update PDCP statistics
* XXX Following two actions are identical, is there a merge error?
*/
for
(
pdcp_uid
=
0
;
pdcp_uid
<
NUMBER_OF_UE_MAX
;
pdcp_uid
++
){
if
(
pdcp_p
->
rnti
[
pdcp_uid
]
==
ctxt_pP
->
rnti
)
break
;
}
Pdcp_stats_rx
[
ctxt_pP
->
module_id
][
pdcp_uid
][
rb_idP
+
rb_offset
]
++
;
Pdcp_stats_rx_s
[
ctxt_pP
->
module_id
][
pdcp_uid
][
rb_idP
+
rb_offset
]
++
;
Pdcp_stats_rx_bytes
[
ctxt_pP
->
module_id
][
pdcp_uid
][
rb_idP
+
rb_offset
]
+=
(
sdu_buffer_sizeP
-
payload_offset
);
Pdcp_stats_rx_bytes_s
[
ctxt_pP
->
module_id
][
pdcp_uid
][
rb_idP
+
rb_offset
]
+=
(
sdu_buffer_sizeP
-
payload_offset
);
Pdcp_stats_rx_sn
[
ctxt_pP
->
module_id
][
pdcp_uid
][
rb_idP
+
rb_offset
]
=
sequence_number
;
if
(
oo_flag
==
1
)
Pdcp_stats_rx_outoforder
[
ctxt_pP
->
module_id
][
pdcp_uid
][
rb_idP
+
rb_offset
]
++
;
Pdcp_stats_rx_aiat
[
ctxt_pP
->
module_id
][
pdcp_uid
][
rb_idP
+
rb_offset
]
+=
(
Pdcp_sfn
[
ctxt_pP
->
module_id
]
-
Pdcp_stats_rx_iat
[
ctxt_pP
->
module_id
][
pdcp_uid
][
rb_idP
+
rb_offset
]);
Pdcp_stats_rx_aiat_tmp_s
[
ctxt_pP
->
module_id
][
pdcp_uid
][
rb_idP
+
rb_offset
]
+=
(
Pdcp_sfn
[
ctxt_pP
->
module_id
]
-
Pdcp_stats_rx_iat
[
ctxt_pP
->
module_id
][
pdcp_uid
][
rb_idP
+
rb_offset
]);
Pdcp_stats_rx_iat
[
ctxt_pP
->
module_id
][
pdcp_uid
][
rb_idP
+
rb_offset
]
=
Pdcp_sfn
[
ctxt_pP
->
module_id
];
#if defined(STOP_ON_IP_TRAFFIC_OVERLOAD)
else
{
AssertFatal
(
0
,
PROTOCOL_PDCP_CTXT_FMT
" PDCP_DATA_IND SDU DROPPED, OUT OF MEMORY
\n
"
,
...
...
@@ -934,16 +919,16 @@ void pdcp_update_stats(const protocol_ctxt_t* const ctxt_pP){
uint8_t
pdcp_uid
=
0
;
uint8_t
rb_id
=
0
;
// these stats
can be measured for both eNB and UE
if
(
(
pdcp_frame
%
102
==
0
)
&&
(
pdcp_subframe
==
0
))
{
// these stats
are measured for both eNB and UE on per seond basis
if
(
Pdcp_sfn
[
ctxt_pP
->
module_id
]
%
1000
==
0
)
{
for
(
rb_id
=
0
;
rb_id
<
NB_RB_MAX
;
rb_id
++
){
for
(
pdcp_uid
=
0
;
pdcp_uid
<
NUMBER_OF_UE_MAX
;
pdcp_uid
++
){
//printf("frame %d and subframe %d \n",
pdcp_frame, pdcp_subframe
);
//printf("frame %d and subframe %d \n",
Pdcp_frame[ctxt_pP->module_id], Pdcp_subframe[ctxt_pP->module_id]
);
// tx stats
Pdcp_stats_tx_rate_s
[
ctxt_pP
->
module_id
][
pdcp_uid
][
rb_id
]
=
Pdcp_stats_tx_s
[
ctxt_pP
->
module_id
][
pdcp_uid
][
rb_id
];
// unit: bit/s
Pdcp_stats_tx_throughput_s
[
ctxt_pP
->
module_id
][
pdcp_uid
][
rb_id
]
=
Pdcp_stats_tx_bytes_s
[
ctxt_pP
->
module_id
][
pdcp_uid
][
rb_id
]
*
8
;
Pdcp_stats_tx_aiat_s
[
ctxt_pP
->
module_id
][
pdcp_uid
][
rb_id
]
=
Pdcp_stats_tx_aiat_tmp_s
[
ctxt_pP
->
module_id
][
pdcp_uid
][
rb_id
]
;
Pdcp_stats_tx_aiat_s
[
ctxt_pP
->
module_id
][
pdcp_uid
][
rb_id
]
=
(
uint32_t
)(
Pdcp_stats_tx_aiat_tmp_s
[
ctxt_pP
->
module_id
][
pdcp_uid
][
rb_id
]
/
Pdcp_stats_tx_s
[
ctxt_pP
->
module_id
][
pdcp_uid
][
rb_id
])
;
Pdcp_stats_tx_s
[
ctxt_pP
->
module_id
][
pdcp_uid
][
rb_id
]
=
0
;
Pdcp_stats_tx_bytes_s
[
ctxt_pP
->
module_id
][
pdcp_uid
][
rb_id
]
=
0
;
...
...
@@ -952,7 +937,7 @@ void pdcp_update_stats(const protocol_ctxt_t* const ctxt_pP){
// rx stats
Pdcp_stats_rx_rate_s
[
ctxt_pP
->
module_id
][
pdcp_uid
][
rb_id
]
=
Pdcp_stats_rx_s
[
ctxt_pP
->
module_id
][
pdcp_uid
][
rb_id
];
Pdcp_stats_rx_goodput_s
[
ctxt_pP
->
module_id
][
pdcp_uid
][
rb_id
]
=
Pdcp_stats_rx_bytes_s
[
ctxt_pP
->
module_id
][
pdcp_uid
][
rb_id
]
*
8
;
Pdcp_stats_rx_aiat_s
[
ctxt_pP
->
module_id
][
pdcp_uid
][
rb_id
]
=
Pdcp_stats_rx_aiat_tmp_s
[
ctxt_pP
->
module_id
][
pdcp_uid
][
rb_id
]
;
Pdcp_stats_rx_aiat_s
[
ctxt_pP
->
module_id
][
pdcp_uid
][
rb_id
]
=
(
uint32_t
)(
Pdcp_stats_rx_aiat_tmp_s
[
ctxt_pP
->
module_id
][
pdcp_uid
][
rb_id
]
/
Pdcp_stats_rx_s
[
ctxt_pP
->
module_id
][
pdcp_uid
][
rb_id
])
;
Pdcp_stats_rx_s
[
ctxt_pP
->
module_id
][
pdcp_uid
][
rb_id
]
=
0
;
Pdcp_stats_rx_bytes_s
[
ctxt_pP
->
module_id
][
pdcp_uid
][
rb_id
]
=
0
;
...
...
@@ -985,8 +970,9 @@ pdcp_run (
start_meas
(
&
UE_pdcp_stats
[
ctxt_pP
->
module_id
].
pdcp_run
);
}
pdcp_frame
=
ctxt_pP
->
frame
;
// 1023
pdcp_subframe
=
ctxt_pP
->
subframe
;
Pdcp_sfn
[
ctxt_pP
->
module_id
]
++
;
// range: 0 to 18,446,744,073,709,551,615
Pdcp_frame
[
ctxt_pP
->
module_id
]
=
ctxt_pP
->
frame
;
// 1023
Pdcp_subframe
[
ctxt_pP
->
module_id
]
=
ctxt_pP
->
subframe
;
pdcp_update_stats
(
ctxt_pP
);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_PDCP_RUN
,
VCD_FUNCTION_IN
);
...
...
@@ -1564,7 +1550,7 @@ pdcp_config_req_asn1 (
if
(
pdcp_pP
->
rnti
[
i
]
!=
0
)
continue
;
// skip active ues
pdcp_pP
->
rnti
[
i
]
=
ctxt_pP
->
rnti
;
pdcp_pP
->
uid
[
i
]
=
i
;
pdcp_num_ues
++
;
Pdcp_num_ues
[
ctxt_pP
->
module_id
]
++
;
break
;
}
//pdcp_eNB_UE_instance_to_rnti[ctxtP->module_id] = ctxt_pP->rnti;
...
...
@@ -1672,7 +1658,7 @@ pdcp_config_req_asn1 (
if
(
pdcp_pP
->
rnti
[
i
]
==
ctxt_pP
->
rnti
)
{
pdcp_pP
->
rnti
[
i
]
=
0
;
pdcp_pP
->
uid
[
i
]
=
0
;
pdcp_num_ues
--
;
Pdcp_num_ues
[
ctxt_pP
->
module_id
]
--
;
break
;
}
}
...
...
@@ -2055,6 +2041,11 @@ void pdcp_layer_init(void)
pdcp_output_header_bytes_to_write
=
0
;
pdcp_input_sdu_remaining_size_to_read
=
0
;
memset
(
Pdcp_sfn
,
0
,
sizeof
(
Pdcp_sfn
));
memset
(
Pdcp_frame
,
0
,
sizeof
(
Pdcp_frame
));
memset
(
Pdcp_subframe
,
0
,
sizeof
(
Pdcp_subframe
));
memset
(
Pdcp_num_ues
,
0
,
sizeof
(
Pdcp_num_ues
));
memset
(
Pdcp_stats_tx
,
0
,
sizeof
(
Pdcp_stats_tx
));
memset
(
Pdcp_stats_tx_s
,
0
,
sizeof
(
Pdcp_stats_tx_s
));
memset
(
Pdcp_stats_tx_bytes
,
0
,
sizeof
(
Pdcp_stats_tx_bytes
));
...
...
openair2/LAYER2/PDCP_v10.1.0/pdcp.h
View file @
b7a16618
...
...
@@ -94,9 +94,10 @@ extern int pdcp_instance_cnt;
int
init_pdcp_thread
(
void
);
void
cleanup_pdcp_thread
(
void
);
public_pdcp
(
frame_t
pdcp_frame
);
public_pdcp
(
sub_frame_t
pdcp_subframe
);
public_pdcp
(
uint16_t
pdcp_num_ues
);
public_pdcp
(
uint64_t
Pdcp_sfn
[
MAX_NUM_CCs
]);
public_pdcp
(
frame_t
Pdcp_frame
[
MAX_NUM_CCs
]);
public_pdcp
(
sub_frame_t
Pdcp_subframe
[
MAX_NUM_CCs
]);
public_pdcp
(
uint16_t
Pdcp_num_ues
[
MAX_NUM_CCs
]);
public_pdcp
(
uint32_t
Pdcp_stats_tx_bytes
[
MAX_NUM_CCs
][
NUMBER_OF_UE_MAX
][
NB_RB_MAX
]);
...
...
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