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