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