DPDK
25.11.2
Toggle main menu visibility
Loading...
Searching...
No Matches
rte_red.h
Go to the documentation of this file.
1
/* SPDX-License-Identifier: BSD-3-Clause
2
* Copyright(c) 2010-2014 Intel Corporation
3
*/
4
5
#ifndef __RTE_RED_H_INCLUDED__
6
#define __RTE_RED_H_INCLUDED__
7
12
13
#include <stdint.h>
14
#include <limits.h>
15
#include <
rte_debug.h
>
16
#include <
rte_cycles.h
>
17
#include <
rte_branch_prediction.h
>
18
19
#ifdef __cplusplus
20
extern
"C"
{
21
#endif
22
23
#define RTE_RED_SCALING 10
24
#define RTE_RED_S (1 << 22)
25
#define RTE_RED_MAX_TH_MAX 1023
26
#define RTE_RED_WQ_LOG2_MIN 1
27
#define RTE_RED_WQ_LOG2_MAX 12
28
#define RTE_RED_MAXP_INV_MIN 1
29
#define RTE_RED_MAXP_INV_MAX 255
30
#define RTE_RED_2POW16 (1<<16)
31
#define RTE_RED_INT16_NBITS (sizeof(uint16_t) * CHAR_BIT)
32
#define RTE_RED_WQ_LOG2_NUM (RTE_RED_WQ_LOG2_MAX - RTE_RED_WQ_LOG2_MIN + 1)
33
37
extern
uint32_t
rte_red_rand_val
;
38
extern
uint32_t rte_red_rand_seed;
39
extern
uint16_t rte_red_log2_1_minus_Wq[RTE_RED_WQ_LOG2_NUM];
40
extern
uint16_t rte_red_pow2_frac_inv[16];
41
45
struct
rte_red_params
{
46
uint16_t
min_th
;
47
uint16_t
max_th
;
48
uint16_t
maxp_inv
;
49
uint16_t
wq_log2
;
50
};
51
55
struct
rte_red_config
{
56
uint32_t
min_th
;
57
uint32_t
max_th
;
58
uint32_t
pa_const
;
59
uint8_t
maxp_inv
;
60
uint8_t
wq_log2
;
61
};
62
66
struct
rte_red
{
67
uint32_t
avg
;
68
uint32_t
count
;
69
uint64_t
q_time
;
70
};
71
81
int
82
rte_red_rt_data_init
(
struct
rte_red
*red);
83
98
int
99
rte_red_config_init
(
struct
rte_red_config
*red_cfg,
100
const
uint16_t wq_log2,
101
const
uint16_t min_th,
102
const
uint16_t max_th,
103
const
uint16_t maxp_inv);
104
115
static
inline
uint32_t
116
rte_fast_rand
(
void
)
117
{
118
rte_red_rand_seed = (214013 * rte_red_rand_seed) + 2531011;
119
return
rte_red_rand_seed >> 10;
120
}
121
132
static
inline
uint16_t
133
__rte_red_calc_qempty_factor
(uint8_t wq_log2, uint16_t m)
134
{
135
uint32_t n = 0;
136
uint32_t f = 0;
137
157
158
n = m * rte_red_log2_1_minus_Wq[wq_log2 -
RTE_RED_WQ_LOG2_MIN
];
159
171
172
f = (n >> 6) & 0xf;
173
n >>= 10;
174
175
if
(n <
RTE_RED_SCALING
) {
176
/* When n == 0, no rounding or shifting needed.
177
* For n > 0, add 2^(n-1) for rounding before right shift.
178
* This avoids UB from (1 << -1) when n == 0.
179
*/
180
if
(n == 0)
181
return
(uint16_t) rte_red_pow2_frac_inv[f];
182
return
(uint16_t) ((rte_red_pow2_frac_inv[f] + (1 << (n - 1))) >> n);
183
}
184
185
return
0;
186
}
187
202
static
inline
int
203
rte_red_enqueue_empty
(
const
struct
rte_red_config
*red_cfg,
204
struct
rte_red
*red,
205
const
uint64_t time)
206
{
207
uint64_t time_diff = 0, m = 0;
208
209
RTE_ASSERT(red_cfg != NULL);
210
RTE_ASSERT(red != NULL);
211
212
red->
count
++;
213
218
time_diff = time - red->
q_time
;
219
226
m = time_diff /
RTE_RED_S
;
227
231
if
(m >=
RTE_RED_2POW16
) {
232
red->
avg
= 0;
233
}
else
{
234
red->
avg
= (red->
avg
>>
RTE_RED_SCALING
) *
__rte_red_calc_qempty_factor
(red_cfg->
wq_log2
, (uint16_t) m);
235
}
236
237
return
0;
238
}
239
268
280
static
inline
int
281
__rte_red_drop
(
const
struct
rte_red_config
*red_cfg,
struct
rte_red
*red)
282
{
283
uint32_t pa_num = 0;
/* numerator of drop-probability */
284
uint32_t pa_den = 0;
/* denominator of drop-probability */
285
uint32_t pa_num_count = 0;
286
287
pa_num = (red->
avg
- red_cfg->
min_th
) >> (red_cfg->
wq_log2
);
288
289
pa_num_count = red->
count
* pa_num;
290
291
if
(red_cfg->
pa_const
<= pa_num_count)
292
return
1;
293
294
pa_den = red_cfg->
pa_const
- pa_num_count;
295
296
/* If drop, generate and save random number to be used next time */
297
if
(
unlikely
((
rte_red_rand_val
% pa_den) < pa_num)) {
298
rte_red_rand_val
=
rte_fast_rand
();
299
300
return
1;
301
}
302
303
/* No drop */
304
return
0;
305
}
306
319
static
inline
int
320
rte_red_enqueue_nonempty
(
const
struct
rte_red_config
*red_cfg,
321
struct
rte_red
*red,
322
const
unsigned
q)
323
{
324
RTE_ASSERT(red_cfg != NULL);
325
RTE_ASSERT(red != NULL);
326
339
340
/* avg update */
341
red->
avg
+= (q <<
RTE_RED_SCALING
) - (red->
avg
>> red_cfg->
wq_log2
);
342
343
/* avg < min_th: do not mark the packet */
344
if
(red->
avg
< red_cfg->
min_th
) {
345
red->
count
++;
346
return
0;
347
}
348
349
/* min_th <= avg < max_th: mark the packet with pa probability */
350
if
(red->
avg
< red_cfg->
max_th
) {
351
if
(!
__rte_red_drop
(red_cfg, red)) {
352
red->
count
++;
353
return
0;
354
}
355
356
red->
count
= 0;
357
return
2;
358
}
359
360
/* max_th <= avg: always mark the packet */
361
red->
count
= 0;
362
return
1;
363
}
364
381
static
inline
int
382
rte_red_enqueue
(
const
struct
rte_red_config
*red_cfg,
383
struct
rte_red
*red,
384
const
unsigned
q,
385
const
uint64_t time)
386
{
387
RTE_ASSERT(red_cfg != NULL);
388
RTE_ASSERT(red != NULL);
389
390
if
(q != 0) {
391
return
rte_red_enqueue_nonempty
(red_cfg, red, q);
392
}
else
{
393
return
rte_red_enqueue_empty
(red_cfg, red, time);
394
}
395
}
396
403
static
inline
void
404
rte_red_mark_queue_empty
(
struct
rte_red
*red,
const
uint64_t time)
405
{
406
red->
q_time
= time;
407
}
408
409
#ifdef __cplusplus
410
}
411
#endif
412
413
#endif
/* __RTE_RED_H_INCLUDED__ */
rte_branch_prediction.h
unlikely
#define unlikely(x)
Definition
rte_branch_prediction.h:43
rte_cycles.h
rte_debug.h
__rte_red_calc_qempty_factor
static uint16_t __rte_red_calc_qempty_factor(uint8_t wq_log2, uint16_t m)
calculate factor to scale average queue size when queue becomes empty
Definition
rte_red.h:133
RTE_RED_WQ_LOG2_MIN
#define RTE_RED_WQ_LOG2_MIN
Definition
rte_red.h:26
rte_red_config_init
int rte_red_config_init(struct rte_red_config *red_cfg, const uint16_t wq_log2, const uint16_t min_th, const uint16_t max_th, const uint16_t maxp_inv)
Configures a single RED configuration parameter structure.
rte_red_enqueue_nonempty
static int rte_red_enqueue_nonempty(const struct rte_red_config *red_cfg, struct rte_red *red, const unsigned q)
Decides if new packet should be enqueued or dropped in queue non-empty case.
Definition
rte_red.h:320
rte_red_enqueue_empty
static int rte_red_enqueue_empty(const struct rte_red_config *red_cfg, struct rte_red *red, const uint64_t time)
Updates queue average in condition when queue is empty.
Definition
rte_red.h:203
rte_fast_rand
static uint32_t rte_fast_rand(void)
Generate random number for RED.
Definition
rte_red.h:116
RTE_RED_2POW16
#define RTE_RED_2POW16
Definition
rte_red.h:30
RTE_RED_S
#define RTE_RED_S
Definition
rte_red.h:24
rte_red_enqueue
static int rte_red_enqueue(const struct rte_red_config *red_cfg, struct rte_red *red, const unsigned q, const uint64_t time)
Decides if new packet should be enqueued or dropped Updates run time data based on new queue size val...
Definition
rte_red.h:382
RTE_RED_SCALING
#define RTE_RED_SCALING
Definition
rte_red.h:23
rte_red_rand_val
uint32_t rte_red_rand_val
__rte_red_drop
static int __rte_red_drop(const struct rte_red_config *red_cfg, struct rte_red *red)
make a decision to drop or enqueue a packet based on mark probability criteria
Definition
rte_red.h:281
rte_red_mark_queue_empty
static void rte_red_mark_queue_empty(struct rte_red *red, const uint64_t time)
Callback to records time that queue became empty.
Definition
rte_red.h:404
rte_red_rt_data_init
int rte_red_rt_data_init(struct rte_red *red)
Initialises run-time data.
rte_red_config
Definition
rte_red.h:55
rte_red_config::pa_const
uint32_t pa_const
Definition
rte_red.h:58
rte_red_config::wq_log2
uint8_t wq_log2
Definition
rte_red.h:60
rte_red_config::maxp_inv
uint8_t maxp_inv
Definition
rte_red.h:59
rte_red_config::min_th
uint32_t min_th
Definition
rte_red.h:56
rte_red_config::max_th
uint32_t max_th
Definition
rte_red.h:57
rte_red_params
Definition
rte_red.h:45
rte_red_params::min_th
uint16_t min_th
Definition
rte_red.h:46
rte_red_params::wq_log2
uint16_t wq_log2
Definition
rte_red.h:49
rte_red_params::maxp_inv
uint16_t maxp_inv
Definition
rte_red.h:48
rte_red_params::max_th
uint16_t max_th
Definition
rte_red.h:47
rte_red
Definition
rte_red.h:66
rte_red::q_time
uint64_t q_time
Definition
rte_red.h:69
rte_red::count
uint32_t count
Definition
rte_red.h:68
rte_red::avg
uint32_t avg
Definition
rte_red.h:67
lib
sched
rte_red.h
Generated by
1.17.0