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