8e0e2bc94c91f1e966233fdc3e6eb739fa93a475
[dpdk.git] / lib / librte_meter / rte_meter.c
1 /*-
2  *   BSD LICENSE
3  * 
4  *   Copyright(c) 2010-2013 Intel Corporation. All rights reserved.
5  *   All rights reserved.
6  * 
7  *   Redistribution and use in source and binary forms, with or without 
8  *   modification, are permitted provided that the following conditions 
9  *   are met:
10  * 
11  *     * Redistributions of source code must retain the above copyright 
12  *       notice, this list of conditions and the following disclaimer.
13  *     * Redistributions in binary form must reproduce the above copyright 
14  *       notice, this list of conditions and the following disclaimer in 
15  *       the documentation and/or other materials provided with the 
16  *       distribution.
17  *     * Neither the name of Intel Corporation nor the names of its 
18  *       contributors may be used to endorse or promote products derived 
19  *       from this software without specific prior written permission.
20  * 
21  *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
22  *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
23  *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 
24  *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
25  *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
26  *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
27  *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 
28  *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 
29  *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
30  *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
31  *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32  * 
33  */
34
35 #include <inttypes.h>
36 #include <stdio.h>
37 #include <math.h>
38
39 #include <rte_common.h>
40 #include <rte_log.h>
41 #include <rte_cycles.h>
42
43 #include "rte_meter.h"
44
45 #ifndef RTE_METER_TB_PERIOD_MIN
46 #define RTE_METER_TB_PERIOD_MIN      100
47 #endif
48
49 static void
50 rte_meter_get_tb_params(uint64_t hz, uint64_t rate, uint64_t *tb_period, uint64_t *tb_bytes_per_period)
51 {
52         double period = ((double) hz) / ((double) rate);
53         
54         if (period >= RTE_METER_TB_PERIOD_MIN) {
55                 *tb_bytes_per_period = 1;
56                 *tb_period = (uint64_t) period;
57         } else {
58                 *tb_bytes_per_period = (uint64_t) ceil(RTE_METER_TB_PERIOD_MIN / period);
59                 *tb_period = (hz * (*tb_bytes_per_period)) / rate;
60         }
61 }
62
63 int
64 rte_meter_srtcm_config(struct rte_meter_srtcm *m, struct rte_meter_srtcm_params *params)
65 {
66         uint64_t hz;
67         
68         /* Check input parameters */
69         if ((m == NULL) || (params == NULL)) {
70                 return -1;
71         }
72                 
73         if ((params->cir == 0) || ((params->cbs == 0) && (params->ebs == 0))) {
74                 return -2;
75         }
76         
77         /* Initialize srTCM run-time structure */
78         hz = rte_get_tsc_hz();
79         m->time = rte_get_tsc_cycles();
80         m->tc = m->cbs = params->cbs;
81         m->te = m->ebs = params->ebs;
82         rte_meter_get_tb_params(hz, params->cir, &m->cir_period, &m->cir_bytes_per_period);
83         
84         RTE_LOG(INFO, METER, "Low level srTCM config: \n"
85                 "\tCIR period = %" PRIu64 ", CIR bytes per period = %" PRIu64 "\n",
86                 m->cir_period, m->cir_bytes_per_period);
87         
88         return 0;
89 }
90
91 int
92 rte_meter_trtcm_config(struct rte_meter_trtcm *m, struct rte_meter_trtcm_params *params)
93 {
94         uint64_t hz;
95         
96         /* Check input parameters */
97         if ((m == NULL) || (params == NULL)) {
98                 return -1;
99         }
100         
101         if ((params->cir == 0) || (params->pir == 0) || (params->pir < params->cir) ||
102                 (params->cbs == 0) || (params->pbs == 0)) {
103                 return -2;
104         }
105                 
106         /* Initialize trTCM run-time structure */
107         hz = rte_get_tsc_hz();
108         m->time_tc = m->time_tp = rte_get_tsc_cycles();
109         m->tc = m->cbs = params->cbs;
110         m->tp = m->pbs = params->pbs;
111         rte_meter_get_tb_params(hz, params->cir, &m->cir_period, &m->cir_bytes_per_period);
112         rte_meter_get_tb_params(hz, params->pir, &m->pir_period, &m->pir_bytes_per_period);
113         
114         RTE_LOG(INFO, METER, "Low level trTCM config: \n"
115                 "\tCIR period = %" PRIu64 ", CIR bytes per period = %" PRIu64 "\n"
116                 "\tPIR period = %" PRIu64 ", PIR bytes per period = %" PRIu64 "\n",
117                 m->cir_period, m->cir_bytes_per_period,
118                 m->pir_period, m->pir_bytes_per_period);
119         
120         return 0;
121 }