xref: /dpdk/lib/meter/rte_meter.c (revision 72b452c5f2599f970f47fd17d3e8e5d60bfebe7a)
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