1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright(c) 2017 Intel Corporation 3 */ 4 5 #ifndef __INCLUDE_RTE_MTR_DRIVER_H__ 6 #define __INCLUDE_RTE_MTR_DRIVER_H__ 7 8 /** 9 * @file 10 * RTE Generic Traffic Metering and Policing API (Driver Side) 11 * 12 * This file provides implementation helpers for internal use by PMDs, they 13 * are not intended to be exposed to applications and are not subject to ABI 14 * versioning. 15 */ 16 17 #include <stdint.h> 18 19 #include <rte_errno.h> 20 #include "rte_ethdev.h" 21 #include "ethdev_driver.h" 22 #include "rte_mtr.h" 23 24 #ifdef __cplusplus 25 extern "C" { 26 #endif 27 28 /** @internal MTR capabilities get. */ 29 typedef int (*rte_mtr_capabilities_get_t)(struct rte_eth_dev *dev, 30 struct rte_mtr_capabilities *cap, 31 struct rte_mtr_error *error); 32 33 /** @internal MTR meter profile add. */ 34 typedef int (*rte_mtr_meter_profile_add_t)(struct rte_eth_dev *dev, 35 uint32_t meter_profile_id, 36 struct rte_mtr_meter_profile *profile, 37 struct rte_mtr_error *error); 38 39 /** @internal MTR meter profile delete. */ 40 typedef int (*rte_mtr_meter_profile_delete_t)(struct rte_eth_dev *dev, 41 uint32_t meter_profile_id, 42 struct rte_mtr_error *error); 43 44 /** @internal MTR meter profile get. */ 45 typedef struct rte_flow_meter_profile * 46 (*rte_mtr_meter_profile_get_t)(struct rte_eth_dev *dev, 47 uint32_t meter_profile_id, 48 struct rte_mtr_error *error); 49 50 /** @internal MTR meter policy validate. */ 51 typedef int (*rte_mtr_meter_policy_validate_t)(struct rte_eth_dev *dev, 52 struct rte_mtr_meter_policy_params *policy, 53 struct rte_mtr_error *error); 54 55 /** @internal MTR meter policy add. */ 56 typedef int (*rte_mtr_meter_policy_add_t)(struct rte_eth_dev *dev, 57 uint32_t policy_id, 58 struct rte_mtr_meter_policy_params *policy, 59 struct rte_mtr_error *error); 60 61 /** @internal MTR meter policy delete. */ 62 typedef int (*rte_mtr_meter_policy_delete_t)(struct rte_eth_dev *dev, 63 uint32_t policy_id, 64 struct rte_mtr_error *error); 65 66 /** @internal MTR meter policy get. */ 67 typedef struct rte_flow_meter_policy * 68 (*rte_mtr_meter_policy_get_t)(struct rte_eth_dev *dev, 69 uint32_t policy_id, 70 struct rte_mtr_error *error); 71 72 73 /** @internal MTR object create. */ 74 typedef int (*rte_mtr_create_t)(struct rte_eth_dev *dev, 75 uint32_t mtr_id, 76 struct rte_mtr_params *params, 77 int shared, 78 struct rte_mtr_error *error); 79 80 /** @internal MTR object destroy. */ 81 typedef int (*rte_mtr_destroy_t)(struct rte_eth_dev *dev, 82 uint32_t mtr_id, 83 struct rte_mtr_error *error); 84 85 /** @internal MTR object meter enable. */ 86 typedef int (*rte_mtr_meter_enable_t)(struct rte_eth_dev *dev, 87 uint32_t mtr_id, 88 struct rte_mtr_error *error); 89 90 /** @internal MTR object meter disable. */ 91 typedef int (*rte_mtr_meter_disable_t)(struct rte_eth_dev *dev, 92 uint32_t mtr_id, 93 struct rte_mtr_error *error); 94 95 /** @internal MTR object meter profile update. */ 96 typedef int (*rte_mtr_meter_profile_update_t)(struct rte_eth_dev *dev, 97 uint32_t mtr_id, 98 uint32_t meter_profile_id, 99 struct rte_mtr_error *error); 100 101 /** @internal MTR object meter policy update. */ 102 typedef int (*rte_mtr_meter_policy_update_t)(struct rte_eth_dev *dev, 103 uint32_t mtr_id, 104 uint32_t meter_policy_id, 105 struct rte_mtr_error *error); 106 107 /** @internal MTR object meter DSCP table update. */ 108 typedef int (*rte_mtr_meter_dscp_table_update_t)(struct rte_eth_dev *dev, 109 uint32_t mtr_id, enum rte_mtr_color_in_protocol proto, 110 enum rte_color *dscp_table, 111 struct rte_mtr_error *error); 112 113 /** @internal mtr object meter vlan table update. */ 114 typedef int (*rte_mtr_meter_vlan_table_update_t)(struct rte_eth_dev *dev, 115 uint32_t mtr_id, enum rte_mtr_color_in_protocol proto, 116 enum rte_color *vlan_table, 117 struct rte_mtr_error *error); 118 119 /** @internal Set the input color protocol on MTR object. */ 120 typedef int (*rte_mtr_meter_color_in_proto_set_t)(struct rte_eth_dev *dev, 121 uint32_t mtr_id, 122 enum rte_mtr_color_in_protocol proto, 123 uint32_t priority, 124 struct rte_mtr_error *error); 125 126 /** @internal Get the input color protocols of MTR object. */ 127 typedef int (*rte_mtr_meter_color_in_proto_get_t)(struct rte_eth_dev *dev, 128 uint32_t mtr_id, 129 uint64_t *proto_mask, 130 struct rte_mtr_error *error); 131 132 /** @internal Get the input color protocol priority of MTR object. */ 133 typedef int (*rte_mtr_meter_color_in_proto_prio_get_t)(struct rte_eth_dev *dev, 134 uint32_t mtr_id, 135 enum rte_mtr_color_in_protocol proto, 136 uint32_t *priority, 137 struct rte_mtr_error *error); 138 139 /** @internal MTR object enabled stats update. */ 140 typedef int (*rte_mtr_stats_update_t)(struct rte_eth_dev *dev, 141 uint32_t mtr_id, 142 uint64_t stats_mask, 143 struct rte_mtr_error *error); 144 145 /** @internal MTR object stats read. */ 146 typedef int (*rte_mtr_stats_read_t)(struct rte_eth_dev *dev, 147 uint32_t mtr_id, 148 struct rte_mtr_stats *stats, 149 uint64_t *stats_mask, 150 int clear, 151 struct rte_mtr_error *error); 152 153 struct rte_mtr_ops { 154 /** MTR capabilities get */ 155 rte_mtr_capabilities_get_t capabilities_get; 156 157 /** MTR meter profile add */ 158 rte_mtr_meter_profile_add_t meter_profile_add; 159 160 /** MTR meter profile delete */ 161 rte_mtr_meter_profile_delete_t meter_profile_delete; 162 163 /** MTR object create */ 164 rte_mtr_create_t create; 165 166 /** MTR object destroy */ 167 rte_mtr_destroy_t destroy; 168 169 /** MTR object meter enable */ 170 rte_mtr_meter_enable_t meter_enable; 171 172 /** MTR object meter disable */ 173 rte_mtr_meter_disable_t meter_disable; 174 175 /** MTR object meter profile update */ 176 rte_mtr_meter_profile_update_t meter_profile_update; 177 178 /** MTR object meter DSCP table update */ 179 rte_mtr_meter_dscp_table_update_t meter_dscp_table_update; 180 181 /** MTR object meter VLAN table update */ 182 rte_mtr_meter_vlan_table_update_t meter_vlan_table_update; 183 184 /** Set the input color protocol on MTR object. */ 185 rte_mtr_meter_color_in_proto_set_t in_proto_set; 186 187 /** Get the input color protocol of MTR object. */ 188 rte_mtr_meter_color_in_proto_get_t in_proto_get; 189 190 /** Get the input color protocol priority of MTR object. */ 191 rte_mtr_meter_color_in_proto_prio_get_t in_proto_prio_get; 192 193 /** MTR object enabled stats update */ 194 rte_mtr_stats_update_t stats_update; 195 196 /** MTR object stats read */ 197 rte_mtr_stats_read_t stats_read; 198 199 /** MTR meter policy validate */ 200 rte_mtr_meter_policy_validate_t meter_policy_validate; 201 202 /** MTR meter policy add */ 203 rte_mtr_meter_policy_add_t meter_policy_add; 204 205 /** MTR meter policy delete */ 206 rte_mtr_meter_policy_delete_t meter_policy_delete; 207 208 /** MTR object meter policy update */ 209 rte_mtr_meter_policy_update_t meter_policy_update; 210 211 /** MTR meter profile get */ 212 rte_mtr_meter_profile_get_t meter_profile_get; 213 214 /** MTR meter policy get */ 215 rte_mtr_meter_policy_get_t meter_policy_get; 216 }; 217 218 /** 219 * Initialize generic error structure. 220 * 221 * This function also sets rte_errno to a given value. 222 * 223 * @param[out] error 224 * Pointer to error structure (may be NULL). 225 * @param[in] code 226 * Related error code (rte_errno). 227 * @param[in] type 228 * Cause field and error type. 229 * @param[in] cause 230 * Object responsible for the error. 231 * @param[in] message 232 * Human-readable error message. 233 * 234 * @return 235 * Error code. 236 */ 237 static inline int 238 rte_mtr_error_set(struct rte_mtr_error *error, 239 int code, 240 enum rte_mtr_error_type type, 241 const void *cause, 242 const char *message) 243 { 244 if (error) { 245 *error = (struct rte_mtr_error){ 246 .type = type, 247 .cause = cause, 248 .message = message, 249 }; 250 } 251 rte_errno = code; 252 return code; 253 } 254 255 /** 256 * Get generic traffic metering and policing operations structure from a port 257 * 258 * @param[in] port_id 259 * The port identifier of the Ethernet device. 260 * @param[out] error 261 * Error details 262 * 263 * @return 264 * The traffic metering and policing operations structure associated with 265 * port_id on success, NULL otherwise. 266 */ 267 const struct rte_mtr_ops * 268 rte_mtr_ops_get(uint16_t port_id, struct rte_mtr_error *error); 269 270 #ifdef __cplusplus 271 } 272 #endif 273 274 #endif /* __INCLUDE_RTE_MTR_DRIVER_H__ */ 275