1 /* 2 * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved. 3 * Copyright (c) 2002-2009 Mellanox Technologies LTD. All rights reserved. 4 * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. 5 * Copyright (c) 2009 HNR Consulting. All rights reserved. 6 * 7 * This software is available to you under a choice of one of two 8 * licenses. You may choose to be licensed under the terms of the GNU 9 * General Public License (GPL) Version 2, available from the file 10 * COPYING in the main directory of this source tree, or the 11 * OpenIB.org BSD license below: 12 * 13 * Redistribution and use in source and binary forms, with or 14 * without modification, are permitted provided that the following 15 * conditions are met: 16 * 17 * - Redistributions of source code must retain the above 18 * copyright notice, this list of conditions and the following 19 * disclaimer. 20 * 21 * - Redistributions in binary form must reproduce the above 22 * copyright notice, this list of conditions and the following 23 * disclaimer in the documentation and/or other materials 24 * provided with the distribution. 25 * 26 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 27 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 28 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 29 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 30 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 31 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 32 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 33 * SOFTWARE. 34 * 35 */ 36 37 /* 38 * Abstract: 39 * Declaration of osm_mcast_tbl_t. 40 * This object represents a multicast forwarding table. 41 * This object is part of the OpenSM family of objects. 42 */ 43 44 #ifndef _OSM_MCAST_TBL_H_ 45 #define _OSM_MCAST_TBL_H_ 46 47 #include <iba/ib_types.h> 48 #include <complib/cl_qmap.h> 49 #include <opensm/osm_base.h> 50 51 #ifdef __cplusplus 52 # define BEGIN_C_DECLS extern "C" { 53 # define END_C_DECLS } 54 #else /* !__cplusplus */ 55 # define BEGIN_C_DECLS 56 # define END_C_DECLS 57 #endif /* __cplusplus */ 58 59 BEGIN_C_DECLS 60 /****s* OpenSM: Forwarding Table/osm_mcast_tbl_t 61 * NAME 62 * osm_mcast_tbl_t 63 * 64 * DESCRIPTION 65 * Multicast Forwarding Table structure. 66 * 67 * Callers may directly access this object. 68 * 69 * SYNOPSIS 70 */ 71 typedef struct osm_mcast_fwdbl { 72 uint8_t num_ports; 73 uint8_t max_position; 74 uint16_t max_block; 75 int16_t max_block_in_use; 76 uint16_t num_entries; 77 uint16_t max_mlid_ho; 78 uint16_t mft_depth; 79 uint16_t(*p_mask_tbl)[][IB_MCAST_POSITION_MAX + 1]; 80 } osm_mcast_tbl_t; 81 /* 82 * FIELDS 83 * num_ports 84 * The number of ports in the port mask. This value 85 * is the same as the number of ports on the switch 86 * 87 * max_position 88 * Maximum bit mask position for this table. This value 89 * is computed from the number of ports on the switch. 90 * 91 * max_block 92 * Maximum block number supported in the table. This value 93 * is approximately the number of MLID entries divided by the 94 * number of MLIDs per block 95 * 96 * num_entries 97 * Number of entries in the table (aka number of MLIDs supported). 98 * 99 * max_mlid_ho 100 * Maximum MLID (host order) for the currently allocated multicast 101 * port mask table. 102 * 103 * mft_depth 104 * Number of MLIDs in the currently allocated multicast port mask 105 * table. 106 * 107 * p_mask_tbl 108 * Pointer to a two dimensional array of port_masks for this switch. 109 * The first dimension is MLID offset, second dimension is mask position. 110 * This pointer is null for switches that do not support multicast. 111 * 112 * SEE ALSO 113 *********/ 114 115 /****f* OpenSM: Forwarding Table/osm_mcast_tbl_init 116 * NAME 117 * osm_mcast_tbl_init 118 * 119 * DESCRIPTION 120 * This function initializes a Multicast Forwarding Table object. 121 * 122 * SYNOPSIS 123 */ 124 void osm_mcast_tbl_init(IN osm_mcast_tbl_t * p_tbl, IN uint8_t num_ports, 125 IN uint16_t capacity); 126 /* 127 * PARAMETERS 128 * num_ports 129 * [in] Number of ports in the switch owning this table. 130 * 131 * capacity 132 * [in] The number of MLID entries (starting at 0xC000) supported 133 * by this switch. 134 * 135 * RETURN VALUE 136 * None. 137 * 138 * NOTES 139 * 140 * SEE ALSO 141 *********/ 142 143 /****f* OpenSM: Forwarding Table/osm_mcast_tbl_delete 144 * NAME 145 * osm_mcast_tbl_delete 146 * 147 * DESCRIPTION 148 * This destroys and deallocates a Multicast Forwarding Table object. 149 * 150 * SYNOPSIS 151 */ 152 void osm_mcast_tbl_delete(IN osm_mcast_tbl_t ** pp_tbl); 153 /* 154 * PARAMETERS 155 * pp_tbl 156 * [in] Pointer a Pointer to the Multicast Forwarding Table object. 157 * 158 * RETURN VALUE 159 * On success, returns a pointer to a new Multicast Forwarding Table object 160 * of the specified size. 161 * NULL otherwise. 162 * 163 * NOTES 164 * 165 * SEE ALSO 166 *********/ 167 168 /****f* OpenSM: Forwarding Table/osm_mcast_tbl_realloc 169 * NAME 170 * osm_mcast_tbl_realloc 171 * 172 * DESCRIPTION 173 * This function reallocates the multicast port mask table if necessary. 174 * 175 * SYNOPSIS 176 */ 177 int osm_mcast_tbl_realloc(IN osm_mcast_tbl_t * p_tbl, IN unsigned mlid_offset); 178 /* 179 * PARAMETERS 180 * 181 * p_tbl 182 * [in] Pointer to the Multicast Forwarding Table object. 183 * 184 * mlid_offset 185 * [in] Offset of MLID being accessed. 186 * 187 * RETURN VALUE 188 * Returns 0 on success and non-zero value otherwise. 189 * 190 * NOTES 191 * 192 * SEE ALSO 193 */ 194 195 /****f* OpenSM: Forwarding Table/osm_mcast_tbl_destroy 196 * NAME 197 * osm_mcast_tbl_destroy 198 * 199 * DESCRIPTION 200 * This destroys and deallocates a Multicast Forwarding Table object. 201 * 202 * SYNOPSIS 203 */ 204 void osm_mcast_tbl_destroy(IN osm_mcast_tbl_t * p_tbl); 205 /* 206 * PARAMETERS 207 * p_tbl 208 * [in] Pointer to the Multicast Forwarding Table object. 209 * 210 * RETURN VALUE 211 * None 212 * 213 * NOTES 214 * 215 * SEE ALSO 216 *********/ 217 218 /****f* OpenSM: Forwarding Table/osm_mcast_tbl_set 219 * NAME 220 * osm_mcast_tbl_set 221 * 222 * DESCRIPTION 223 * Adds the port to the multicast group. 224 * 225 * SYNOPSIS 226 */ 227 void osm_mcast_tbl_set(IN osm_mcast_tbl_t * p_tbl, IN uint16_t mlid_ho, 228 IN uint8_t port_num); 229 /* 230 * PARAMETERS 231 * p_tbl 232 * [in] Pointer to the Multicast Forwarding Table object. 233 * 234 * mlid_ho 235 * [in] MLID value (host order) for which to set the route. 236 * 237 * port_num 238 * [in] Port to add to the multicast group. 239 * 240 * RETURN VALUE 241 * None. 242 * 243 * NOTES 244 * 245 * SEE ALSO 246 *********/ 247 248 /****f* OpenSM: Forwarding Table/osm_mcast_tbl_clear_mlid 249 * NAME 250 * osm_mcast_tbl_clear_mlid 251 * 252 * DESCRIPTION 253 * Removes all multicast paths for the specified MLID. 254 * 255 * SYNOPSIS 256 */ 257 void osm_mcast_tbl_clear_mlid(IN osm_mcast_tbl_t * p_tbl, IN uint16_t mlid_ho); 258 /* 259 * PARAMETERS 260 * p_tbl 261 * [in] Pointer to the Multicast Forwarding Table object. 262 * 263 * mlid_ho 264 * [in] MLID value (host order) for which to clear. 265 * 266 * RETURN VALUE 267 * None. 268 * 269 * NOTES 270 * 271 * SEE ALSO 272 *********/ 273 274 /****f* OpenSM: Forwarding Table/osm_mcast_tbl_is_port 275 * NAME 276 * osm_mcast_tbl_is_port 277 * 278 * DESCRIPTION 279 * Returns TRUE if the port is in the multicast group. 280 * 281 * SYNOPSIS 282 */ 283 boolean_t osm_mcast_tbl_is_port(IN const osm_mcast_tbl_t * p_tbl, 284 IN uint16_t mlid_ho, IN uint8_t port_num); 285 /* 286 * PARAMETERS 287 * p_tbl 288 * [in] Pointer to the Multicast Forwarding Table object. 289 * 290 * mlid_ho 291 * [in] MLID value (host order). 292 * 293 * port_num 294 * [in] Port number on the switch 295 * 296 * RETURN VALUE 297 * Returns the port that routes the specified LID. 298 * 299 * NOTES 300 * 301 * SEE ALSO 302 *********/ 303 304 /****f* OpenSM: Forwarding Table/osm_mcast_tbl_is_any_port 305 * NAME 306 * osm_mcast_tbl_is_any_port 307 * 308 * DESCRIPTION 309 * Returns TRUE if any port is in the multicast group. 310 * 311 * SYNOPSIS 312 */ 313 boolean_t osm_mcast_tbl_is_any_port(IN const osm_mcast_tbl_t * p_tbl, 314 IN uint16_t mlid_ho); 315 /* 316 * PARAMETERS 317 * p_tbl 318 * [in] Pointer to the Multicast Forwarding Table object. 319 * 320 * mlid_ho 321 * [in] MLID value (host order). 322 * 323 * RETURN VALUE 324 * Returns TRUE if any port is in the multicast group. 325 * 326 * NOTES 327 * 328 * SEE ALSO 329 *********/ 330 331 /****f* OpenSM: Forwarding Table/osm_mcast_tbl_set_block 332 * NAME 333 * osm_mcast_tbl_set_block 334 * 335 * DESCRIPTION 336 * Copies the specified block into the Multicast Forwarding Table. 337 * 338 * SYNOPSIS 339 */ 340 ib_api_status_t osm_mcast_tbl_set_block(IN osm_mcast_tbl_t * p_tbl, 341 IN const ib_net16_t * p_block, 342 IN int16_t block_num, 343 IN uint8_t position); 344 /* 345 * PARAMETERS 346 * p_tbl 347 * [in] Pointer to the Multicast Forwarding Table object. 348 * 349 * p_block 350 * [in] Pointer to the Forwarding Table block. 351 * 352 * block_num 353 * [in] Block number of this block. 354 * 355 * RETURN VALUE 356 * None. 357 * 358 * NOTES 359 * 360 * SEE ALSO 361 *********/ 362 363 /****f* OpenSM: Forwarding Table/osm_mcast_get_tbl_block 364 * NAME 365 * osm_mcast_get_tbl_block 366 * 367 * DESCRIPTION 368 * Retrieve a multicast forwarding table block. 369 * 370 * SYNOPSIS 371 */ 372 boolean_t osm_mcast_tbl_get_block(IN osm_mcast_tbl_t * p_tbl, 373 IN int16_t block_num, IN uint8_t position, 374 OUT ib_net16_t * p_block); 375 /* 376 * PARAMETERS 377 * p_tbl 378 * [in] Pointer to an osm_mcast_tbl_t object. 379 * 380 * p_block 381 * [in] Pointer to the Forwarding Table block. 382 * 383 * block_num 384 * [in] Block number of this block. 385 * 386 * p_block 387 * [out] Pointer to the 32 entry array to store the 388 * forwarding table clock specified by block_id. 389 * 390 * RETURN VALUES 391 * Returns true if there are more blocks necessary to 392 * configure all the MLIDs reachable from this switch. 393 * FALSE otherwise. 394 * 395 * NOTES 396 * 397 * SEE ALSO 398 *********/ 399 400 /****f* OpenSM: Forwarding Table/osm_mcast_tbl_get_max_block 401 * NAME 402 * osm_mcast_tbl_get_max_block 403 * 404 * DESCRIPTION 405 * Returns the maximum block ID in this table. 406 * 407 * SYNOPSIS 408 */ 409 static inline uint16_t osm_mcast_tbl_get_max_block(IN osm_mcast_tbl_t * p_tbl) 410 { 411 return p_tbl->max_block; 412 } 413 414 /* 415 * PARAMETERS 416 * p_tbl 417 * [in] Pointer to an osm_mcast_tbl_t object. 418 * 419 * RETURN VALUES 420 * Returns the maximum block ID in this table. 421 * 422 * NOTES 423 * 424 * SEE ALSO 425 *********/ 426 427 /****f* OpenSM: Forwarding Table/osm_mcast_tbl_get_max_block_in_use 428 * NAME 429 * osm_mcast_tbl_get_max_block_in_use 430 * 431 * DESCRIPTION 432 * Returns the maximum block ID in use in this table. 433 * A value of -1 indicates no blocks are in use. 434 * 435 * SYNOPSIS 436 */ 437 static inline int16_t 438 osm_mcast_tbl_get_max_block_in_use(IN osm_mcast_tbl_t * p_tbl) 439 { 440 return (p_tbl->max_block_in_use); 441 } 442 443 /* 444 * PARAMETERS 445 * p_tbl 446 * [in] Pointer to an osm_mcast_tbl_t object. 447 * 448 * RETURN VALUES 449 * Returns the maximum block ID in use in this table. 450 * A value of -1 indicates no blocks are in use. 451 * 452 * NOTES 453 * 454 * SEE ALSO 455 *********/ 456 457 /****f* OpenSM: Forwarding Table/osm_mcast_tbl_get_max_position 458 * NAME 459 * osm_mcast_tbl_get_max_position 460 * 461 * DESCRIPTION 462 * Returns the maximum position in this table. 463 * 464 * SYNOPSIS 465 */ 466 static inline uint8_t 467 osm_mcast_tbl_get_max_position(IN osm_mcast_tbl_t * p_tbl) 468 { 469 return (p_tbl->max_position); 470 } 471 472 /* 473 * PARAMETERS 474 * p_tbl 475 * [in] Pointer to an osm_mcast_tbl_t object. 476 * 477 * RETURN VALUES 478 * Returns the maximum position in this table. 479 * 480 * NOTES 481 * 482 * SEE ALSO 483 *********/ 484 485 END_C_DECLS 486 #endif /* _OSM_MCAST_TBL_H_ */ 487