* @brief Decides if new packet should be enqueued or dropped in queue non-empty case * * @param red_cfg [in] config pointer to a RED configuration parameter structure * @param red [in,out] data pointer to RED runtime data * @param q [in] current queue size (measured in packets) * * @return Operation status * @retval 0 enqueue the packet * @retval 1 drop the packet based on max threshold cr
| 310 | * @retval 2 drop the packet based on mark probability criterion |
| 311 | */ |
| 312 | static inline int |
| 313 | rte_red_enqueue_nonempty(const struct rte_red_config *red_cfg, |
| 314 | struct rte_red *red, |
| 315 | const unsigned q) |
| 316 | { |
| 317 | RTE_ASSERT(red_cfg != NULL); |
| 318 | RTE_ASSERT(red != NULL); |
| 319 | |
| 320 | /** |
| 321 | * EWMA filter (Sally Floyd and Van Jacobson): |
| 322 | * avg = (1 - wq) * avg + wq * q |
| 323 | * avg = avg + q * wq - avg * wq |
| 324 | * |
| 325 | * We select: wq = 2^(-n). Let scaled version of avg be: avg_s = avg * 2^(N+n). We get: |
| 326 | * avg_s = avg_s + q * 2^N - avg_s * 2^(-n) |
| 327 | * |
| 328 | * By using shift left/right operations, we get: |
| 329 | * avg_s = avg_s + (q << N) - (avg_s >> n) |
| 330 | * avg_s += (q << N) - (avg_s >> n) |
| 331 | */ |
| 332 | |
| 333 | /* avg update */ |
| 334 | red->avg += (q << RTE_RED_SCALING) - (red->avg >> red_cfg->wq_log2); |
| 335 | |
| 336 | /* avg < min_th: do not mark the packet */ |
| 337 | if (red->avg < red_cfg->min_th) { |
| 338 | red->count ++; |
| 339 | return 0; |
| 340 | } |
| 341 | |
| 342 | /* min_th <= avg < max_th: mark the packet with pa probability */ |
| 343 | if (red->avg < red_cfg->max_th) { |
| 344 | if (!__rte_red_drop(red_cfg, red)) { |
| 345 | red->count ++; |
| 346 | return 0; |
| 347 | } |
| 348 | |
| 349 | red->count = 0; |
| 350 | return 2; |
| 351 | } |
| 352 | |
| 353 | /* max_th <= avg: always mark the packet */ |
| 354 | red->count = 0; |
| 355 | return 1; |
| 356 | } |
| 357 | |
| 358 | /** |
| 359 | * @brief Decides if new packet should be enqueued or dropped |
no test coverage detected