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