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