DPDK 25.03.0-rc0
rte_meter.h
Go to the documentation of this file.
1
2/* SPDX-License-Identifier: BSD-3-Clause
3 * Copyright(c) 2010-2014 Intel Corporation
4 */
5
6#ifndef __INCLUDE_RTE_METER_H__
7#define __INCLUDE_RTE_METER_H__
8
19#include <stdint.h>
20
21#ifdef __cplusplus
22extern "C" {
23#endif
24
25/*
26 * Application Programmer's Interface (API)
27 */
28
37};
38
43 uint64_t cir;
44 uint64_t cbs;
45 uint64_t ebs;
46};
47
52 uint64_t cir;
53 uint64_t pir;
54 uint64_t cbs;
55 uint64_t pbs;
56};
57
63 uint64_t cir;
64 uint64_t eir;
65 uint64_t cbs;
66 uint64_t ebs;
67};
68
73struct rte_meter_srtcm_profile;
74
79struct rte_meter_trtcm_profile;
80
85struct rte_meter_trtcm_rfc4115_profile;
86
88struct rte_meter_srtcm;
89
91struct rte_meter_trtcm;
92
98
109int
110rte_meter_srtcm_profile_config(struct rte_meter_srtcm_profile *p,
111 struct rte_meter_srtcm_params *params);
112
123int
124rte_meter_trtcm_profile_config(struct rte_meter_trtcm_profile *p,
125 struct rte_meter_trtcm_params *params);
136int
138 struct rte_meter_trtcm_rfc4115_profile *p,
139 struct rte_meter_trtcm_rfc4115_params *params);
140
151int
152rte_meter_srtcm_config(struct rte_meter_srtcm *m,
153 struct rte_meter_srtcm_profile *p);
154
165int
167 struct rte_meter_trtcm_profile *p);
168
179int
181 struct rte_meter_trtcm_rfc4115_profile *p);
182
197static inline enum rte_color
198rte_meter_srtcm_color_blind_check(struct rte_meter_srtcm *m,
199 struct rte_meter_srtcm_profile *p,
200 uint64_t time,
201 uint32_t pkt_len);
202
219static inline enum rte_color
220rte_meter_srtcm_color_aware_check(struct rte_meter_srtcm *m,
221 struct rte_meter_srtcm_profile *p,
222 uint64_t time,
223 uint32_t pkt_len,
224 enum rte_color pkt_color);
225
240static inline enum rte_color
242 struct rte_meter_trtcm_profile *p,
243 uint64_t time,
244 uint32_t pkt_len);
245
262static inline enum rte_color
264 struct rte_meter_trtcm_profile *p,
265 uint64_t time,
266 uint32_t pkt_len,
267 enum rte_color pkt_color);
268
283static inline enum rte_color
285 struct rte_meter_trtcm_rfc4115 *m,
286 struct rte_meter_trtcm_rfc4115_profile *p,
287 uint64_t time,
288 uint32_t pkt_len);
289
306static inline enum rte_color
308 struct rte_meter_trtcm_rfc4115 *m,
309 struct rte_meter_trtcm_rfc4115_profile *p,
310 uint64_t time,
311 uint32_t pkt_len,
312 enum rte_color pkt_color);
313
314/*
315 * Inline implementation of run-time methods
316 */
317
318struct rte_meter_srtcm_profile {
319 uint64_t cbs;
321 uint64_t ebs;
323 uint64_t cir_period;
325 uint64_t cir_bytes_per_period;
327};
328
329/* Internal data structure storing the srTCM run-time context per metered traffic flow. */
330struct rte_meter_srtcm {
331 uint64_t time; /* Time of latest update of C and E token buckets */
332 uint64_t tc; /* Number of bytes currently available in the committed (C) token bucket */
333 uint64_t te; /* Number of bytes currently available in the excess (E) token bucket */
334};
335
336struct rte_meter_trtcm_profile {
337 uint64_t cbs;
339 uint64_t pbs;
341 uint64_t cir_period;
343 uint64_t cir_bytes_per_period;
345 uint64_t pir_period;
347 uint64_t pir_bytes_per_period;
349};
350
356 uint64_t time_tc;
358 uint64_t time_tp;
360 uint64_t tc;
362 uint64_t tp;
364};
365
366struct rte_meter_trtcm_rfc4115_profile {
367 uint64_t cbs;
369 uint64_t ebs;
371 uint64_t cir_period;
373 uint64_t cir_bytes_per_period;
375 uint64_t eir_period;
377 uint64_t eir_bytes_per_period;
379};
380
386 uint64_t time_tc;
388 uint64_t time_te;
390 uint64_t tc;
392 uint64_t te;
394};
395
396static inline enum rte_color
397rte_meter_srtcm_color_blind_check(struct rte_meter_srtcm *m,
398 struct rte_meter_srtcm_profile *p,
399 uint64_t time,
400 uint32_t pkt_len)
401{
402 uint64_t time_diff, n_periods, tc, te;
403
404 /* Bucket update */
405 time_diff = time - m->time;
406 n_periods = time_diff / p->cir_period;
407 m->time += n_periods * p->cir_period;
408
409 /* Put the tokens overflowing from tc into te bucket */
410 tc = m->tc + n_periods * p->cir_bytes_per_period;
411 te = m->te;
412 if (tc > p->cbs) {
413 te += (tc - p->cbs);
414 if (te > p->ebs)
415 te = p->ebs;
416 tc = p->cbs;
417 }
418
419 /* Color logic */
420 if (tc >= pkt_len) {
421 m->tc = tc - pkt_len;
422 m->te = te;
423 return RTE_COLOR_GREEN;
424 }
425
426 if (te >= pkt_len) {
427 m->tc = tc;
428 m->te = te - pkt_len;
429 return RTE_COLOR_YELLOW;
430 }
431
432 m->tc = tc;
433 m->te = te;
434 return RTE_COLOR_RED;
435}
436
437static inline enum rte_color
438rte_meter_srtcm_color_aware_check(struct rte_meter_srtcm *m,
439 struct rte_meter_srtcm_profile *p,
440 uint64_t time,
441 uint32_t pkt_len,
442 enum rte_color pkt_color)
443{
444 uint64_t time_diff, n_periods, tc, te;
445
446 /* Bucket update */
447 time_diff = time - m->time;
448 n_periods = time_diff / p->cir_period;
449 m->time += n_periods * p->cir_period;
450
451 /* Put the tokens overflowing from tc into te bucket */
452 tc = m->tc + n_periods * p->cir_bytes_per_period;
453 te = m->te;
454 if (tc > p->cbs) {
455 te += (tc - p->cbs);
456 if (te > p->ebs)
457 te = p->ebs;
458 tc = p->cbs;
459 }
460
461 /* Color logic */
462 if ((pkt_color == RTE_COLOR_GREEN) && (tc >= pkt_len)) {
463 m->tc = tc - pkt_len;
464 m->te = te;
465 return RTE_COLOR_GREEN;
466 }
467
468 if ((pkt_color != RTE_COLOR_RED) && (te >= pkt_len)) {
469 m->tc = tc;
470 m->te = te - pkt_len;
471 return RTE_COLOR_YELLOW;
472 }
473
474 m->tc = tc;
475 m->te = te;
476 return RTE_COLOR_RED;
477}
478
479static inline enum rte_color
481 struct rte_meter_trtcm_profile *p,
482 uint64_t time,
483 uint32_t pkt_len)
484{
485 uint64_t time_diff_tc, time_diff_tp, n_periods_tc, n_periods_tp, tc, tp;
486
487 /* Bucket update */
488 time_diff_tc = time - m->time_tc;
489 time_diff_tp = time - m->time_tp;
490 n_periods_tc = time_diff_tc / p->cir_period;
491 n_periods_tp = time_diff_tp / p->pir_period;
492 m->time_tc += n_periods_tc * p->cir_period;
493 m->time_tp += n_periods_tp * p->pir_period;
494
495 tc = m->tc + n_periods_tc * p->cir_bytes_per_period;
496 if (tc > p->cbs)
497 tc = p->cbs;
498
499 tp = m->tp + n_periods_tp * p->pir_bytes_per_period;
500 if (tp > p->pbs)
501 tp = p->pbs;
502
503 /* Color logic */
504 if (tp < pkt_len) {
505 m->tc = tc;
506 m->tp = tp;
507 return RTE_COLOR_RED;
508 }
509
510 if (tc < pkt_len) {
511 m->tc = tc;
512 m->tp = tp - pkt_len;
513 return RTE_COLOR_YELLOW;
514 }
515
516 m->tc = tc - pkt_len;
517 m->tp = tp - pkt_len;
518 return RTE_COLOR_GREEN;
519}
520
521static inline enum rte_color
523 struct rte_meter_trtcm_profile *p,
524 uint64_t time,
525 uint32_t pkt_len,
526 enum rte_color pkt_color)
527{
528 uint64_t time_diff_tc, time_diff_tp, n_periods_tc, n_periods_tp, tc, tp;
529
530 /* Bucket update */
531 time_diff_tc = time - m->time_tc;
532 time_diff_tp = time - m->time_tp;
533 n_periods_tc = time_diff_tc / p->cir_period;
534 n_periods_tp = time_diff_tp / p->pir_period;
535 m->time_tc += n_periods_tc * p->cir_period;
536 m->time_tp += n_periods_tp * p->pir_period;
537
538 tc = m->tc + n_periods_tc * p->cir_bytes_per_period;
539 if (tc > p->cbs)
540 tc = p->cbs;
541
542 tp = m->tp + n_periods_tp * p->pir_bytes_per_period;
543 if (tp > p->pbs)
544 tp = p->pbs;
545
546 /* Color logic */
547 if ((pkt_color == RTE_COLOR_RED) || (tp < pkt_len)) {
548 m->tc = tc;
549 m->tp = tp;
550 return RTE_COLOR_RED;
551 }
552
553 if ((pkt_color == RTE_COLOR_YELLOW) || (tc < pkt_len)) {
554 m->tc = tc;
555 m->tp = tp - pkt_len;
556 return RTE_COLOR_YELLOW;
557 }
558
559 m->tc = tc - pkt_len;
560 m->tp = tp - pkt_len;
561 return RTE_COLOR_GREEN;
562}
563
564static inline enum rte_color
566 struct rte_meter_trtcm_rfc4115 *m,
567 struct rte_meter_trtcm_rfc4115_profile *p,
568 uint64_t time,
569 uint32_t pkt_len)
570{
571 uint64_t time_diff_tc, time_diff_te, n_periods_tc, n_periods_te, tc, te;
572
573 /* Bucket update */
574 time_diff_tc = time - m->time_tc;
575 time_diff_te = time - m->time_te;
576 n_periods_tc = time_diff_tc / p->cir_period;
577 n_periods_te = time_diff_te / p->eir_period;
578 m->time_tc += n_periods_tc * p->cir_period;
579 m->time_te += n_periods_te * p->eir_period;
580
581 tc = m->tc + n_periods_tc * p->cir_bytes_per_period;
582 if (tc > p->cbs)
583 tc = p->cbs;
584
585 te = m->te + n_periods_te * p->eir_bytes_per_period;
586 if (te > p->ebs)
587 te = p->ebs;
588
589 /* Color logic */
590 if (tc >= pkt_len) {
591 m->tc = tc - pkt_len;
592 m->te = te;
593 return RTE_COLOR_GREEN;
594 }
595 if (te >= pkt_len) {
596 m->tc = tc;
597 m->te = te - pkt_len;
598 return RTE_COLOR_YELLOW;
599 }
600
601 /* If we end up here the color is RED */
602 m->tc = tc;
603 m->te = te;
604 return RTE_COLOR_RED;
605}
606
607static inline enum rte_color
609 struct rte_meter_trtcm_rfc4115 *m,
610 struct rte_meter_trtcm_rfc4115_profile *p,
611 uint64_t time,
612 uint32_t pkt_len,
613 enum rte_color pkt_color)
614{
615 uint64_t time_diff_tc, time_diff_te, n_periods_tc, n_periods_te, tc, te;
616
617 /* Bucket update */
618 time_diff_tc = time - m->time_tc;
619 time_diff_te = time - m->time_te;
620 n_periods_tc = time_diff_tc / p->cir_period;
621 n_periods_te = time_diff_te / p->eir_period;
622 m->time_tc += n_periods_tc * p->cir_period;
623 m->time_te += n_periods_te * p->eir_period;
624
625 tc = m->tc + n_periods_tc * p->cir_bytes_per_period;
626 if (tc > p->cbs)
627 tc = p->cbs;
628
629 te = m->te + n_periods_te * p->eir_bytes_per_period;
630 if (te > p->ebs)
631 te = p->ebs;
632
633 /* Color logic */
634 if ((pkt_color == RTE_COLOR_GREEN) && (tc >= pkt_len)) {
635 m->tc = tc - pkt_len;
636 m->te = te;
637 return RTE_COLOR_GREEN;
638 }
639
640 if ((pkt_color != RTE_COLOR_RED) && (te >= pkt_len)) {
641 m->tc = tc;
642 m->te = te - pkt_len;
643 return RTE_COLOR_YELLOW;
644 }
645
646 /* If we end up here the color is RED */
647 m->tc = tc;
648 m->te = te;
649 return RTE_COLOR_RED;
650}
651
652
653#ifdef __cplusplus
654}
655#endif
656
657#endif /* __INCLUDE_RTE_METER_H__ */
static enum rte_color rte_meter_trtcm_rfc4115_color_blind_check(struct rte_meter_trtcm_rfc4115 *m, struct rte_meter_trtcm_rfc4115_profile *p, uint64_t time, uint32_t pkt_len)
Definition: rte_meter.h:565
static enum rte_color rte_meter_trtcm_rfc4115_color_aware_check(struct rte_meter_trtcm_rfc4115 *m, struct rte_meter_trtcm_rfc4115_profile *p, uint64_t time, uint32_t pkt_len, enum rte_color pkt_color)
Definition: rte_meter.h:608
static enum rte_color rte_meter_trtcm_color_blind_check(struct rte_meter_trtcm *m, struct rte_meter_trtcm_profile *p, uint64_t time, uint32_t pkt_len)
Definition: rte_meter.h:480
static enum rte_color rte_meter_trtcm_color_aware_check(struct rte_meter_trtcm *m, struct rte_meter_trtcm_profile *p, uint64_t time, uint32_t pkt_len, enum rte_color pkt_color)
Definition: rte_meter.h:522
rte_color
Definition: rte_meter.h:32
@ RTE_COLOR_GREEN
Definition: rte_meter.h:33
@ RTE_COLOR_YELLOW
Definition: rte_meter.h:34
@ RTE_COLOR_RED
Definition: rte_meter.h:35
@ RTE_COLORS
Definition: rte_meter.h:36
int rte_meter_trtcm_rfc4115_profile_config(struct rte_meter_trtcm_rfc4115_profile *p, struct rte_meter_trtcm_rfc4115_params *params)
int rte_meter_srtcm_profile_config(struct rte_meter_srtcm_profile *p, struct rte_meter_srtcm_params *params)
int rte_meter_srtcm_config(struct rte_meter_srtcm *m, struct rte_meter_srtcm_profile *p)
int rte_meter_trtcm_rfc4115_config(struct rte_meter_trtcm_rfc4115 *m, struct rte_meter_trtcm_rfc4115_profile *p)
static enum rte_color rte_meter_srtcm_color_aware_check(struct rte_meter_srtcm *m, struct rte_meter_srtcm_profile *p, uint64_t time, uint32_t pkt_len, enum rte_color pkt_color)
Definition: rte_meter.h:438
int rte_meter_trtcm_config(struct rte_meter_trtcm *m, struct rte_meter_trtcm_profile *p)
int rte_meter_trtcm_profile_config(struct rte_meter_trtcm_profile *p, struct rte_meter_trtcm_params *params)
static enum rte_color rte_meter_srtcm_color_blind_check(struct rte_meter_srtcm *m, struct rte_meter_srtcm_profile *p, uint64_t time, uint32_t pkt_len)
Definition: rte_meter.h:397
uint64_t time_tp
Definition: rte_meter.h:358
uint64_t tc
Definition: rte_meter.h:360
uint64_t tp
Definition: rte_meter.h:362
uint64_t time_tc
Definition: rte_meter.h:356