rate.c (6702B)
1 /* 2 * 3 * This license is set out in https://raw.githubusercontent.com/Broadcom-Network-Switching-Software/OpenBCM/master/Legal/LICENSE file. 4 * 5 * Copyright 2007-2019 Broadcom Inc. All rights reserved. 6 * 7 * File: bcmx/rate.c 8 * Purpose: BCMX Packet Rate Control APIs 9 */ 10 11 #include <bcm/types.h> 12 13 #include <bcmx/rate.h> 14 #include <bcmx/lport.h> 15 #include <bcmx/bcmx.h> 16 17 #include "bcmx_int.h" 18 19 #define BCMX_RATE_INIT_CHECK BCMX_READY_CHECK 20 21 #define BCMX_RATE_SET_ERROR_CHECK(_unit, _check, _rv) \ 22 BCMX_SET_ERROR_CHECK(_unit, _check, _rv) 23 24 #define BCMX_RATE_GET_IS_VALID(_unit, _rv) \ 25 BCMX_ERROR_IS_VALID(_unit, _rv) 26 27 28 /* 29 * Function: 30 * bcmx_rate_set 31 */ 32 33 int 34 bcmx_rate_set(int val, int flags) 35 { 36 int rv = BCM_E_UNAVAIL, tmp_rv; 37 int i, bcm_unit; 38 39 BCMX_RATE_INIT_CHECK; 40 41 BCMX_UNIT_ITER(bcm_unit, i) { 42 tmp_rv = bcm_rate_set(bcm_unit, val, flags); 43 BCM_IF_ERROR_RETURN(BCMX_RATE_SET_ERROR_CHECK(bcm_unit, tmp_rv, &rv)); 44 } 45 46 return rv; 47 } 48 49 50 /* 51 * Function: 52 * bcmx_rate_get 53 */ 54 55 int 56 bcmx_rate_get(int *val, int *flags) 57 { 58 int rv; 59 int i, bcm_unit; 60 61 BCMX_RATE_INIT_CHECK; 62 63 BCMX_PARAM_NULL_CHECK(val); 64 BCMX_PARAM_NULL_CHECK(flags); 65 66 BCMX_UNIT_ITER(bcm_unit, i) { 67 rv = bcm_rate_get(bcm_unit, val, flags); 68 if (BCMX_RATE_GET_IS_VALID(bcm_unit, rv)) { 69 return rv; 70 } 71 } 72 73 return BCM_E_UNAVAIL; 74 } 75 76 77 /* 78 * Function: 79 * bcmx_rate_mcast_set 80 */ 81 82 int 83 bcmx_rate_mcast_set(int limit, int flags, bcmx_lport_t port) 84 { 85 int bcm_unit; 86 bcm_port_t bcm_port; 87 88 BCMX_RATE_INIT_CHECK; 89 90 BCM_IF_ERROR_RETURN 91 (_bcmx_dest_to_unit_port(port, &bcm_unit, &bcm_port, 92 BCMX_DEST_CONVERT_DEFAULT)); 93 94 return bcm_rate_mcast_set(bcm_unit, 95 limit, 96 flags, 97 bcm_port); 98 } 99 100 101 /* 102 * Function: 103 * bcmx_rate_bcast_set 104 */ 105 106 int 107 bcmx_rate_bcast_set(int limit, int flags, bcmx_lport_t port) 108 { 109 int bcm_unit; 110 bcm_port_t bcm_port; 111 112 BCMX_RATE_INIT_CHECK; 113 114 BCM_IF_ERROR_RETURN 115 (_bcmx_dest_to_unit_port(port, &bcm_unit, &bcm_port, 116 BCMX_DEST_CONVERT_DEFAULT)); 117 118 return bcm_rate_bcast_set(bcm_unit, 119 limit, 120 flags, 121 bcm_port); 122 } 123 124 125 /* 126 * Function: 127 * bcmx_rate_dlfbc_set 128 */ 129 130 int 131 bcmx_rate_dlfbc_set(int limit, int flags, bcmx_lport_t port) 132 { 133 int bcm_unit; 134 bcm_port_t bcm_port; 135 136 BCMX_RATE_INIT_CHECK; 137 138 BCM_IF_ERROR_RETURN 139 (_bcmx_dest_to_unit_port(port, &bcm_unit, &bcm_port, 140 BCMX_DEST_CONVERT_DEFAULT)); 141 142 return bcm_rate_dlfbc_set(bcm_unit, 143 limit, 144 flags, 145 bcm_port); 146 } 147 148 149 /* 150 * Function: 151 * bcmx_rate_mcast_get 152 */ 153 154 int 155 bcmx_rate_mcast_get(int *limit, int *flags, bcmx_lport_t port) 156 { 157 int bcm_unit; 158 bcm_port_t bcm_port; 159 160 BCMX_RATE_INIT_CHECK; 161 162 BCMX_PARAM_NULL_CHECK(limit); 163 BCMX_PARAM_NULL_CHECK(flags); 164 165 BCM_IF_ERROR_RETURN 166 (_bcmx_dest_to_unit_port(port, &bcm_unit, &bcm_port, 167 BCMX_DEST_CONVERT_DEFAULT)); 168 169 return bcm_rate_mcast_get(bcm_unit, 170 limit, 171 flags, 172 bcm_port); 173 } 174 175 176 /* 177 * Function: 178 * bcmx_rate_dlfbc_get 179 */ 180 181 int 182 bcmx_rate_dlfbc_get(int *limit, int *flags, bcmx_lport_t port) 183 { 184 int bcm_unit; 185 bcm_port_t bcm_port; 186 187 BCMX_RATE_INIT_CHECK; 188 189 BCMX_PARAM_NULL_CHECK(limit); 190 BCMX_PARAM_NULL_CHECK(flags); 191 192 BCM_IF_ERROR_RETURN 193 (_bcmx_dest_to_unit_port(port, &bcm_unit, &bcm_port, 194 BCMX_DEST_CONVERT_DEFAULT)); 195 196 return bcm_rate_dlfbc_get(bcm_unit, 197 limit, 198 flags, 199 bcm_port); 200 } 201 202 203 /* 204 * Function: 205 * bcmx_rate_bcast_get 206 */ 207 208 int 209 bcmx_rate_bcast_get(int *limit, int *flags, bcmx_lport_t port) 210 { 211 int bcm_unit; 212 bcm_port_t bcm_port; 213 214 BCMX_RATE_INIT_CHECK; 215 216 BCMX_PARAM_NULL_CHECK(limit); 217 BCMX_PARAM_NULL_CHECK(flags); 218 219 BCM_IF_ERROR_RETURN 220 (_bcmx_dest_to_unit_port(port, &bcm_unit, &bcm_port, 221 BCMX_DEST_CONVERT_DEFAULT)); 222 223 return bcm_rate_bcast_get(bcm_unit, 224 limit, 225 flags, 226 bcm_port); 227 } 228 229 230 /* 231 * Function: 232 * bcmx_rate_type_get 233 */ 234 235 int 236 bcmx_rate_type_get(bcm_rate_limit_t *rl) 237 { 238 int rv; 239 int i, bcm_unit; 240 241 BCMX_RATE_INIT_CHECK; 242 243 BCMX_PARAM_NULL_CHECK(rl); 244 245 BCMX_UNIT_ITER(bcm_unit, i) { 246 rv = bcm_rate_type_get(bcm_unit, rl); 247 if (BCMX_RATE_GET_IS_VALID(bcm_unit, rv)) { 248 return rv; 249 } 250 } 251 252 return BCM_E_UNAVAIL; 253 } 254 255 256 /* 257 * Function: 258 * bcmx_rate_type_set 259 */ 260 261 int 262 bcmx_rate_type_set(bcm_rate_limit_t *rl) 263 { 264 int rv = BCM_E_UNAVAIL, tmp_rv; 265 int i, bcm_unit; 266 267 BCMX_RATE_INIT_CHECK; 268 269 BCMX_PARAM_NULL_CHECK(rl); 270 271 BCMX_UNIT_ITER(bcm_unit, i) { 272 tmp_rv = bcm_rate_type_set(bcm_unit, rl); 273 BCM_IF_ERROR_RETURN(BCMX_RATE_SET_ERROR_CHECK(bcm_unit, tmp_rv, &rv)); 274 } 275 276 return rv; 277 } 278 279 /* 280 * Function: 281 * bcmx_rate_bandwidth_get 282 */ 283 int 284 bcmx_rate_bandwidth_get(bcmx_lport_t port, int flags, 285 uint32 *kbits_sec, uint32 *kbits_burst) 286 { 287 int bcm_unit; 288 bcm_port_t bcm_port; 289 290 BCMX_RATE_INIT_CHECK; 291 292 BCMX_PARAM_NULL_CHECK(kbits_sec); 293 BCMX_PARAM_NULL_CHECK(kbits_burst); 294 295 BCM_IF_ERROR_RETURN 296 (_bcmx_dest_to_unit_port(port, &bcm_unit, &bcm_port, 297 BCMX_DEST_CONVERT_DEFAULT)); 298 299 return bcm_rate_bandwidth_get(bcm_unit, bcm_port, 300 flags, 301 kbits_sec, 302 kbits_burst); 303 } 304 305 /* 306 * Function: 307 * bcmx_rate_bandwidth_set 308 */ 309 int 310 bcmx_rate_bandwidth_set(bcmx_lport_t port, int flags, 311 uint32 kbits_sec, uint32 kbits_burst) 312 { 313 int bcm_unit; 314 bcm_port_t bcm_port; 315 316 BCMX_RATE_INIT_CHECK; 317 318 BCM_IF_ERROR_RETURN 319 (_bcmx_dest_to_unit_port(port, &bcm_unit, &bcm_port, 320 BCMX_DEST_CONVERT_DEFAULT)); 321 322 return bcm_rate_bandwidth_set(bcm_unit, bcm_port, 323 flags, 324 kbits_sec, 325 kbits_burst); 326 }