remove experimental tags from all symbol definitions
[dpdk.git] / lib / librte_meter / rte_meter.c
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2010-2014 Intel Corporation
3  */
4
5 #include <inttypes.h>
6 #include <stdio.h>
7 #include <math.h>
8
9 #include <rte_common.h>
10 #include <rte_log.h>
11 #include <rte_cycles.h>
12
13 #include "rte_meter.h"
14
15 #ifndef RTE_METER_TB_PERIOD_MIN
16 #define RTE_METER_TB_PERIOD_MIN      100
17 #endif
18
19 static void
20 rte_meter_get_tb_params(uint64_t hz, uint64_t rate, uint64_t *tb_period, uint64_t *tb_bytes_per_period)
21 {
22         double period;
23
24         if (rate == 0) {
25                 *tb_bytes_per_period = 0;
26                 *tb_period = RTE_METER_TB_PERIOD_MIN;
27                 return;
28         }
29
30         period = ((double) hz) / ((double) rate);
31
32         if (period >= RTE_METER_TB_PERIOD_MIN) {
33                 *tb_bytes_per_period = 1;
34                 *tb_period = (uint64_t) period;
35         } else {
36                 *tb_bytes_per_period = (uint64_t) ceil(RTE_METER_TB_PERIOD_MIN / period);
37                 *tb_period = (hz * (*tb_bytes_per_period)) / rate;
38         }
39 }
40
41 int
42 rte_meter_srtcm_profile_config(struct rte_meter_srtcm_profile *p,
43         struct rte_meter_srtcm_params *params)
44 {
45         uint64_t hz = rte_get_tsc_hz();
46
47         /* Check input parameters */
48         if ((p == NULL) ||
49                 (params == NULL) ||
50                 (params->cir == 0) ||
51                 ((params->cbs == 0) && (params->ebs == 0)))
52                 return -EINVAL;
53
54         /* Initialize srTCM run-time structure */
55         p->cbs = params->cbs;
56         p->ebs = params->ebs;
57         rte_meter_get_tb_params(hz, params->cir, &p->cir_period,
58                 &p->cir_bytes_per_period);
59
60         return 0;
61 }
62
63 int
64 rte_meter_srtcm_config(struct rte_meter_srtcm *m,
65         struct rte_meter_srtcm_profile *p)
66 {
67         /* Check input parameters */
68         if ((m == NULL) || (p == NULL))
69                 return -EINVAL;
70
71         /* Initialize srTCM run-time structure */
72         m->time = rte_get_tsc_cycles();
73         m->tc = p->cbs;
74         m->te = p->ebs;
75
76         return 0;
77 }
78
79 int
80 rte_meter_trtcm_profile_config(struct rte_meter_trtcm_profile *p,
81         struct rte_meter_trtcm_params *params)
82 {
83         uint64_t hz = rte_get_tsc_hz();
84
85         /* Check input parameters */
86         if ((p == NULL) ||
87                 (params == NULL) ||
88                 (params->cir == 0) ||
89                 (params->pir == 0) ||
90                 (params->pir < params->cir) ||
91                 (params->cbs == 0) ||
92                 (params->pbs == 0))
93                 return -EINVAL;
94
95         /* Initialize trTCM run-time structure */
96         p->cbs = params->cbs;
97         p->pbs = params->pbs;
98         rte_meter_get_tb_params(hz, params->cir, &p->cir_period,
99                 &p->cir_bytes_per_period);
100         rte_meter_get_tb_params(hz, params->pir, &p->pir_period,
101                 &p->pir_bytes_per_period);
102
103         return 0;
104 }
105
106 int
107 rte_meter_trtcm_config(struct rte_meter_trtcm *m,
108         struct rte_meter_trtcm_profile *p)
109 {
110         /* Check input parameters */
111         if ((m == NULL) || (p == NULL))
112                 return -EINVAL;
113
114         /* Initialize trTCM run-time structure */
115         m->time_tc = m->time_tp = rte_get_tsc_cycles();
116         m->tc = p->cbs;
117         m->tp = p->pbs;
118
119         return 0;
120 }
121
122 int
123 rte_meter_trtcm_rfc4115_profile_config(
124         struct rte_meter_trtcm_rfc4115_profile *p,
125         struct rte_meter_trtcm_rfc4115_params *params)
126 {
127         uint64_t hz = rte_get_tsc_hz();
128
129         /* Check input parameters */
130         if ((p == NULL) ||
131                 (params == NULL) ||
132                 (params->cir != 0 && params->cbs == 0) ||
133                 (params->eir != 0 && params->ebs == 0))
134                 return -EINVAL;
135
136         /* Initialize trTCM run-time structure */
137         p->cbs = params->cbs;
138         p->ebs = params->ebs;
139         rte_meter_get_tb_params(hz, params->cir, &p->cir_period,
140                 &p->cir_bytes_per_period);
141         rte_meter_get_tb_params(hz, params->eir, &p->eir_period,
142                 &p->eir_bytes_per_period);
143
144         return 0;
145 }
146
147 int
148 rte_meter_trtcm_rfc4115_config(
149         struct rte_meter_trtcm_rfc4115 *m,
150         struct rte_meter_trtcm_rfc4115_profile *p)
151 {
152         /* Check input parameters */
153         if ((m == NULL) || (p == NULL))
154                 return -EINVAL;
155
156         /* Initialize trTCM run-time structure */
157         m->time_tc = m->time_te = rte_get_tsc_cycles();
158         m->tc = p->cbs;
159         m->te = p->ebs;
160
161         return 0;
162 }