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