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