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 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 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 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 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 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 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 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