trill.c (33035B)
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 * ESW Trill API 8 */ 9 10 #ifdef INCLUDE_L3 11 12 #include <soc/drv.h> 13 #include <soc/mem.h> 14 #include <soc/util.h> 15 #include <soc/debug.h> 16 #include <bcm/types.h> 17 #include <bcm/error.h> 18 #include <bcm_int/esw/mbcm.h> 19 #include <bcm_int/esw_dispatch.h> 20 #include <bcm_int/esw/trident.h> 21 #include <bcm/trill.h> 22 #include <bcm_int/esw/trill.h> 23 24 /* 25 * Function: 26 * bcm_esw_trill_init 27 * Purpose: 28 * Init TRILL module 29 * Parameters: 30 * IN : unit 31 * Returns: 32 * BCM_E_XXX 33 */ 34 35 int 36 bcm_esw_trill_init(int unit) 37 { 38 #ifdef BCM_TRIDENT_SUPPORT 39 if (soc_feature(unit, soc_feature_trill)) { 40 return bcm_td_trill_init(unit); 41 } 42 #endif 43 return BCM_E_UNAVAIL; 44 } 45 46 47 /* Function: 48 * bcm_trill_cleanup 49 * Purpose: 50 * Detach the TRILL module, clear all HW states 51 * Parameters: 52 * unit - Device Number 53 * Returns: 54 * BCM_E_XXXX 55 */ 56 57 int 58 bcm_esw_trill_cleanup(int unit) 59 { 60 #ifdef BCM_TRIDENT_SUPPORT 61 if (soc_feature(unit, soc_feature_trill)) { 62 return bcm_td_trill_cleanup(unit); 63 } 64 #endif 65 return BCM_E_UNAVAIL; 66 } 67 68 /* 69 * Purpose: 70 * Add Trill port to TRILL Cloud 71 * Parameters: 72 * unit - (IN) Device Number 73 * trill_port - (IN/OUT) trill port information (OUT : trill_port_id) 74 */ 75 int 76 bcm_esw_trill_port_add(int unit, bcm_trill_port_t *trill_port) 77 { 78 int rv = BCM_E_UNAVAIL; 79 #ifdef BCM_TRIDENT_SUPPORT 80 if (soc_feature(unit, soc_feature_trill)) { 81 rv = bcm_td_trill_lock(unit); 82 if ( rv == BCM_E_NONE ) { 83 rv = bcm_td_trill_port_add(unit, trill_port); 84 bcm_td_trill_unlock (unit); 85 } 86 } 87 #endif 88 return rv; 89 } 90 91 /* 92 * Purpose: 93 * Delete TRILL port from TRILL Cloud 94 * Parameters: 95 * unit - (IN) Device Number 96 * trill_port_id - (IN) Trill port ID 97 */ 98 99 int 100 bcm_esw_trill_port_delete(int unit, bcm_gport_t trill_port_id) 101 { 102 int rv = BCM_E_UNAVAIL; 103 #ifdef BCM_TRIDENT_SUPPORT 104 if (soc_feature(unit, soc_feature_trill)) { 105 rv = bcm_td_trill_lock(unit); 106 if ( rv == BCM_E_NONE ) { 107 rv = bcm_td_trill_port_delete(unit, trill_port_id); 108 bcm_td_trill_unlock (unit); 109 } 110 } 111 #endif 112 return rv; 113 } 114 115 /* 116 * Purpose: 117 * Delete all TRILL ports from TRILL Cloud 118 * Parameters: 119 * unit - Device Number 120 */ 121 122 int 123 bcm_esw_trill_port_delete_all(int unit) 124 { 125 int rv = BCM_E_UNAVAIL; 126 #ifdef BCM_TRIDENT_SUPPORT 127 if (soc_feature(unit, soc_feature_trill)) { 128 rv = bcm_td_trill_lock(unit); 129 if ( rv == BCM_E_NONE ) { 130 rv = bcm_td_trill_port_delete_all(unit); 131 bcm_td_trill_unlock (unit); 132 } 133 } 134 #endif 135 return rv; 136 } 137 138 /* 139 * Purpose: 140 * Get a TRILL port 141 * Parameters: 142 * unit - (IN) Device Number 143 * trill_port - (IN/OUT) Trill port information (IN : trill_port_id) 144 */ 145 146 int 147 bcm_esw_trill_port_get(int unit, bcm_trill_port_t *trill_port) 148 { 149 int rv = BCM_E_UNAVAIL; 150 #ifdef BCM_TRIDENT_SUPPORT 151 if (soc_feature(unit, soc_feature_trill)) { 152 rv = bcm_td_trill_lock(unit); 153 if ( rv == BCM_E_NONE ) { 154 rv = bcm_td_trill_port_get(unit, trill_port); 155 bcm_td_trill_unlock (unit); 156 } 157 } 158 #endif 159 return rv; 160 } 161 162 /* 163 * Purpose: 164 * Get all TRILL ports from TRILL Cloud 165 * Parameters: 166 * unit - (IN) Device Number 167 * port_max - (IN) Maximum number of TRILL ports in array 168 * port_array - (OUT) Array of TRILL ports 169 * port_count - (OUT) Number of TRILL ports returned in array 170 */ 171 172 int 173 bcm_esw_trill_port_get_all(int unit, 174 int port_max, 175 bcm_trill_port_t *trill_port, 176 int *port_count ) 177 { 178 int rv = BCM_E_UNAVAIL; 179 #ifdef BCM_TRIDENT_SUPPORT 180 if (soc_feature(unit, soc_feature_trill)) { 181 rv = bcm_td_trill_lock(unit); 182 if ( rv == BCM_E_NONE ) { 183 rv = bcm_td_trill_port_get_all(unit, port_max, trill_port, port_count); 184 bcm_td_trill_unlock (unit); 185 } 186 } 187 #endif 188 return rv; 189 } 190 191 /* 192 * Purpose: 193 * Add TRILL multicast entry 194 * Parameters: 195 * unit - Device Number 196 * trill_mc_entry - (INOUT) Trill Multicast Entry 197 */ 198 199 int 200 bcm_esw_trill_multicast_entry_add (int unit, 201 bcm_trill_multicast_entry_t *trill_mc_entry) 202 { 203 int rv = BCM_E_UNAVAIL; 204 #ifdef BCM_TRIDENT_SUPPORT 205 if (soc_feature(unit, soc_feature_trill)) { 206 rv = bcm_td_trill_lock(unit); 207 if ( rv == BCM_E_NONE ) { 208 rv = bcm_td_trill_multicast_add(unit, 209 trill_mc_entry->flags, 210 trill_mc_entry->root_name, 211 trill_mc_entry->c_vlan, 212 trill_mc_entry->c_dmac, 213 trill_mc_entry->group); 214 bcm_td_trill_unlock (unit); 215 } 216 } 217 #endif 218 return rv; 219 } 220 221 /* 222 * Purpose: 223 * Delete TRILL multicast entry 224 * Parameters: 225 * unit - Device Number 226 * trill_mc_entry - (INOUT) Trill Multicast Entry 227 */ 228 229 int 230 bcm_esw_trill_multicast_entry_delete (int unit, 231 bcm_trill_multicast_entry_t *trill_mc_entry) 232 233 { 234 int rv = BCM_E_UNAVAIL; 235 #ifdef BCM_TRIDENT_SUPPORT 236 if (soc_feature(unit, soc_feature_trill)) { 237 rv = bcm_td_trill_lock(unit); 238 if ( rv == BCM_E_NONE ) { 239 rv = bcm_td_trill_multicast_delete(unit, 240 trill_mc_entry->flags, 241 trill_mc_entry->root_name, 242 trill_mc_entry->c_vlan, 243 trill_mc_entry->c_dmac); 244 bcm_td_trill_unlock (unit); 245 } 246 } 247 #endif 248 return rv; 249 } 250 251 /* 252 * Purpose: 253 * Get TRILL multicast entry 254 * Parameters: 255 * unit - Device Number 256 * trill_mc_entry - (INOUT) Trill Multicast Entry 257 */ 258 259 int 260 bcm_esw_trill_multicast_entry_get( int unit, 261 bcm_trill_multicast_entry_t *trill_mc_entry) 262 { 263 int rv = BCM_E_UNAVAIL; 264 #ifdef BCM_TRIDENT_SUPPORT 265 if (soc_feature(unit, soc_feature_trill)) { 266 rv = bcm_td_trill_lock(unit); 267 if ( rv == BCM_E_NONE ) { 268 rv = bcm_td_trill_multicast_entry_get(unit, trill_mc_entry); 269 bcm_td_trill_unlock (unit); 270 } 271 } 272 #endif 273 return rv; 274 } 275 276 /* 277 * Purpose: 278 * Delete all TRILL multicast entries 279 * Parameters: 280 * unit - Device Number 281 * root_name - (IN) Trill Root_RBridge 282 */ 283 284 int 285 bcm_esw_trill_multicast_delete_all (int unit, bcm_trill_name_t root_name) 286 { 287 int rv = BCM_E_UNAVAIL; 288 #ifdef BCM_TRIDENT_SUPPORT 289 if (soc_feature(unit, soc_feature_trill)) { 290 rv = bcm_td_trill_lock(unit); 291 if ( rv == BCM_E_NONE ) { 292 rv = bcm_td_trill_multicast_delete_all(unit, root_name); 293 bcm_td_trill_unlock (unit); 294 } 295 } 296 #endif 297 return rv; 298 } 299 300 /* 301 * Purpose: 302 * Traverse all valid TRILL Multicast entries and call the 303 * supplied callback routine. 304 * Parameters: 305 * unit - Device Number 306 * cb - User callback function, called once per Trill Multicast entry. 307 * user_data - cookie 308 */ 309 310 int 311 bcm_esw_trill_multicast_entry_traverse( int unit, 312 bcm_trill_multicast_entry_traverse_cb cb, 313 void *user_data) 314 { 315 int rv = BCM_E_UNAVAIL; 316 #ifdef BCM_TRIDENT_SUPPORT 317 if (soc_feature(unit, soc_feature_trill)) { 318 rv = bcm_td_trill_lock(unit); 319 if ( rv == BCM_E_NONE ) { 320 rv = bcm_td_trill_multicast_traverse(unit, cb, user_data); 321 bcm_td_trill_unlock (unit); 322 } 323 } 324 #endif 325 return rv; 326 } 327 328 /* 329 * Purpose: 330 * Add TRILL multicast RPF entry 331 * Parameters: 332 * unit - Device Number 333 * root_name - (IN) Trill Root_RBridge 334 * source_name - (IN) Source Rbridge 335 * port - (IN) Ingress port 336 */ 337 338 int bcm_esw_trill_multicast_source_add(int unit, 339 bcm_trill_name_t root_name, 340 bcm_trill_name_t source_name, 341 bcm_gport_t port, 342 bcm_if_t encap_intf) 343 { 344 int rv = BCM_E_UNAVAIL; 345 #ifdef BCM_TRIDENT_SUPPORT 346 if (soc_feature(unit, soc_feature_trill)) { 347 rv = bcm_td_trill_lock(unit); 348 if ( rv == BCM_E_NONE ) { 349 rv = bcm_td_trill_multicast_source_add(unit, root_name, 350 source_name, port, encap_intf); 351 bcm_td_trill_unlock (unit); 352 } 353 } 354 #endif 355 return rv; 356 } 357 358 #ifdef BCM_WARM_BOOT_SUPPORT 359 360 /* 361 * Function: 362 * _bcm_esw_trill_sync 363 * Purpose: 364 * Store Trill state to persistent memory. 365 * Parameters: 366 * IN : unit 367 * Returns: 368 * BCM_E_XXX 369 */ 370 371 int 372 _bcm_esw_trill_sync(int unit) 373 { 374 #ifdef BCM_TRIDENT_SUPPORT 375 if (soc_feature(unit, soc_feature_trill)) { 376 return bcm_td_trill_sync(unit); 377 } 378 #endif 379 return BCM_E_UNAVAIL; 380 } 381 #endif /* BCM_WARM_BOOT_SUPPORT */ 382 383 /* 384 * Purpose: 385 * Delete TRILL multicast RPF entry 386 * Parameters: 387 * unit - Device Number 388 * root_name - (IN) Trill Root_RBridge 389 * source_name - (IN) Source Rbridge 390 * port - (IN) Ingress port 391 */ 392 393 int bcm_esw_trill_multicast_source_delete(int unit, 394 bcm_trill_name_t root_name, 395 bcm_trill_name_t source_name, 396 bcm_gport_t port, 397 bcm_if_t encap_intf) 398 { 399 int rv = BCM_E_UNAVAIL; 400 #ifdef BCM_TRIDENT_SUPPORT 401 if (soc_feature(unit, soc_feature_trill)) { 402 rv = bcm_td_trill_lock(unit); 403 if ( rv == BCM_E_NONE ) { 404 rv = bcm_td_trill_multicast_source_delete(unit, root_name, 405 source_name, port, encap_intf); 406 bcm_td_trill_unlock (unit); 407 } 408 } 409 #endif 410 return rv; 411 } 412 413 /* 414 * Purpose: 415 * Get TRILL multicast RPF entry 416 * Parameters: 417 * unit - Device Number 418 * root_name (IN) Trill Root_RBridge 419 * source_name - (IN) Source Rbridge 420 * port - (OUT) Ingress port 421 */ 422 423 int bcm_esw_trill_multicast_source_get(int unit, 424 bcm_trill_name_t root_name, 425 bcm_trill_name_t source_name, 426 bcm_gport_t *port) 427 { 428 int rv = BCM_E_UNAVAIL; 429 #ifdef BCM_TRIDENT_SUPPORT 430 if (soc_feature(unit, soc_feature_trill)) { 431 rv = bcm_td_trill_lock(unit); 432 if ( rv == BCM_E_NONE ) { 433 rv = bcm_td_trill_multicast_source_get(unit, root_name, 434 source_name, port); 435 bcm_td_trill_unlock (unit); 436 } 437 } 438 #endif 439 return rv; 440 } 441 442 /* 443 * Purpose: 444 * Traverse all valid TRILL Multicast RPF entries and call the 445 * supplied callback routine. 446 * Parameters: 447 * unit - Device Number 448 * cb - User callback function, called once per Trill Multicast RPF entry. 449 * user_data - cookie 450 */ 451 452 int bcm_esw_trill_multicast_source_traverse(int unit, 453 bcm_trill_multicast_source_traverse_cb cb, 454 void *user_data) 455 { 456 int rv = BCM_E_UNAVAIL; 457 #ifdef BCM_TRIDENT_SUPPORT 458 if (soc_feature(unit, soc_feature_trill)) { 459 rv = bcm_td_trill_lock(unit); 460 if ( rv == BCM_E_NONE ) { 461 rv = bcm_td_trill_multicast_source_traverse(unit, cb, user_data); 462 bcm_td_trill_unlock (unit); 463 } 464 } 465 #endif 466 return rv; 467 } 468 469 /* 470 * Function: 471 * bcm_esw_trill_stat_get 472 * Purpose: 473 * Get TRILL Stats 474 * Parameters: 475 * unit - (IN) SOC unit # 476 * port - (IN) port 477 * stat - (IN) specify the Stat type 478 * val - (OUT) 64-bit Stats value 479 * Returns: 480 * BCM_E_XXX 481 */ 482 483 int 484 bcm_esw_trill_stat_get(int unit, bcm_port_t port, 485 bcm_trill_stat_t stat, uint64 *val) 486 { 487 int rv = BCM_E_UNAVAIL; 488 #ifdef BCM_TRIDENT_SUPPORT 489 if (soc_feature(unit, soc_feature_trill)) { 490 rv = bcm_td_trill_lock(unit); 491 if ( rv == BCM_E_NONE ) { 492 rv = bcm_td_trill_stat_get(unit, port, stat, val); 493 bcm_td_trill_unlock (unit); 494 } 495 return rv; 496 } 497 #endif 498 return rv; 499 } 500 501 int 502 bcm_esw_trill_stat_get32(int unit, bcm_port_t port, 503 bcm_trill_stat_t stat, uint32 *val) 504 { 505 int rv = BCM_E_UNAVAIL; 506 #ifdef BCM_TRIDENT_SUPPORT 507 if (soc_feature(unit, soc_feature_trill)) { 508 rv = bcm_td_trill_lock(unit); 509 if ( rv == BCM_E_NONE ) { 510 rv = bcm_td_trill_stat_get32(unit, port, stat, val); 511 bcm_td_trill_unlock (unit); 512 } 513 return rv; 514 } 515 #endif 516 return rv; 517 } 518 519 /* 520 * Function: 521 * bcm_esw_trill_stat_clear 522 * Purpose: 523 * Clear TRILL Stats 524 * Parameters: 525 * unit - (IN) SOC unit # 526 * port - (IN) port 527 * stat - (IN) specify the Stat type 528 * Returns: 529 * BCM_E_XXX 530 */ 531 532 int 533 bcm_esw_trill_stat_clear(int unit, bcm_port_t port, 534 bcm_trill_stat_t stat) 535 { 536 int rv = BCM_E_UNAVAIL; 537 #ifdef BCM_TRIDENT_SUPPORT 538 if (soc_feature(unit, soc_feature_trill)) { 539 rv = bcm_td_trill_lock(unit); 540 if ( rv == BCM_E_NONE ) { 541 rv = bcm_td_trill_stat_clear(unit, port, stat); 542 bcm_td_trill_unlock (unit); 543 } 544 return rv; 545 } 546 #endif 547 return rv; 548 } 549 550 /* 551 * Function: 552 * _bcm_esw_trill_trunk_member_add 553 * Purpose: 554 * Set Trill state for trunk members leaving a trunk group. 555 * Parameters: 556 * unit - (IN) Device Number 557 * trunk_id - (IN) Trunk Group ID 558 * trunk_member_count - (IN) Count of Trunk members to be added 559 * trunk_member_array - (IN) Trunk member ports to be added 560 * Returns: 561 * BCM_E_XXX 562 */ 563 int 564 _bcm_esw_trill_trunk_member_add(int unit, bcm_trunk_t trunk_id, 565 int trunk_member_count, bcm_port_t *trunk_member_array) 566 { 567 int rv = BCM_E_UNAVAIL; 568 569 #ifdef BCM_TRIDENT_SUPPORT 570 if (soc_feature(unit, soc_feature_trill)) { 571 rv = bcm_td_trill_trunk_member_add(unit, trunk_id, 572 trunk_member_count, trunk_member_array); 573 return rv; 574 } 575 #endif 576 return rv; 577 } 578 579 /* 580 * Function: 581 * _bcm_esw_trill_trunk_member_delete 582 * Purpose: 583 * Clear Trill state for trunk members leaving a trunk group. 584 * Parameters: 585 * unit - (IN) Device Number 586 * trunk_id - (IN) Trunk Group ID 587 * trunk_member_count - (IN) Count of Trunk members to be deleted 588 * trunk_member_array - (IN) Trunk member ports to be deleted 589 * Returns: 590 * BCM_E_XXX 591 */ 592 int 593 _bcm_esw_trill_trunk_member_delete(int unit, bcm_trunk_t trunk_id, 594 int trunk_member_count, bcm_port_t *trunk_member_array) 595 { 596 int rv = BCM_E_UNAVAIL; 597 598 #ifdef BCM_TRIDENT_SUPPORT 599 if (soc_feature(unit, soc_feature_trill)) { 600 rv = bcm_td_trill_trunk_member_delete(unit, trunk_id, 601 trunk_member_count, trunk_member_array); 602 return rv; 603 } 604 #endif 605 return rv; 606 } 607 608 /* 609 * Purpose: 610 * Add TRILL Multicast entry 611 * Parameters: 612 * unit - Device unit number 613 * key - defines entry type 614 * vid - Customer Vlan ID 615 * mac - Customer MAC 616 * trill_tree_id - specify Multicast Tree ID 617 * group - Multicast group 618 * Returns: 619 * BCM_E_NONE - Success. 620 * BCM_E_XXX 621 */ 622 623 int 624 _bcm_esw_trill_multicast_entry_add(int unit, uint32 flags, int key, 625 bcm_vlan_t vid, bcm_mac_t c_dmac, 626 uint8 trill_tree_id, bcm_multicast_t group) 627 { 628 int rv = BCM_E_UNAVAIL; 629 630 #ifdef BCM_TOMAHAWK_SUPPORT 631 if (SOC_IS_TOMAHAWKX(unit)) { 632 rv = bcm_td2_trill_l2_multicast_entry_add(unit, flags, 633 key, vid, c_dmac, trill_tree_id, group); 634 } 635 #endif 636 637 #ifdef BCM_TRIDENT2_SUPPORT 638 if (SOC_IS_TRIDENT2X(unit)) { 639 rv = bcm_td2_trill_l2_multicast_entry_add(unit, flags, 640 key, vid, c_dmac, trill_tree_id, group); 641 } 642 #endif 643 644 #ifdef BCM_TRIUMPH3_SUPPORT 645 if (SOC_IS_TRIUMPH3(unit)) { 646 rv = bcm_tr3_trill_l2_multicast_entry_add(unit, flags, 647 key, vid, c_dmac, trill_tree_id, group); 648 } 649 #endif 650 651 #ifdef BCM_TRIDENT_SUPPORT 652 if (SOC_IS_TRIDENT(unit)) { 653 rv = bcm_td_l2_trill_multicast_entry_add(unit, flags, 654 key, vid, c_dmac, trill_tree_id, group); 655 } 656 #endif 657 658 return rv; 659 } 660 661 /* 662 * Purpose: 663 * Delete TRILL Multicast entry 664 * Parameters: 665 * unit - Device unit number 666 * key - defines entry type 667 * vid - Customer Vlan ID 668 * mac - Customer MAC 669 * trill_tree_id - specify Multicast Tree ID 670 * Returns: 671 * BCM_E_NONE - Success. 672 * BCM_E_XXX 673 */ 674 675 int 676 _bcm_esw_trill_multicast_entry_delete(int unit, int key, bcm_vlan_t vid, 677 bcm_mac_t c_dmac, uint8 trill_tree_id) 678 { 679 int rv = BCM_E_UNAVAIL; 680 681 #ifdef BCM_TOMAHAWK_SUPPORT 682 if (SOC_IS_TOMAHAWKX(unit)) { 683 rv = bcm_td2_trill_l2_multicast_entry_delete(unit, key, 684 vid, c_dmac, trill_tree_id); 685 } 686 #endif 687 688 #ifdef BCM_TRIDENT2_SUPPORT 689 if (SOC_IS_TRIDENT2X(unit)) { 690 rv = bcm_td2_trill_l2_multicast_entry_delete(unit, key, 691 vid, c_dmac, trill_tree_id); 692 } 693 #endif 694 695 #ifdef BCM_TRIUMPH3_SUPPORT 696 if (SOC_IS_TRIUMPH3(unit)) { 697 rv = bcm_tr3_trill_l2_multicast_entry_delete(unit, key, 698 vid, c_dmac, trill_tree_id); 699 } 700 #endif 701 702 #ifdef BCM_TRIDENT_SUPPORT 703 if (SOC_IS_TRIDENT(unit)) { 704 rv = bcm_td_l2_trill_multicast_entry_delete(unit, key, 705 vid, c_dmac, trill_tree_id); 706 } 707 #endif 708 709 return rv; 710 711 } 712 713 /* 714 * Purpose: 715 * Update TRILL Multicast entry 716 * Parameters: 717 * unit - Device unit number 718 * key - defines entry type 719 * vid - Customer Vlan ID 720 * mac - Customer MAC 721 * trill_tree_id - specify Multicast Tree ID 722 * group - Trill Multicast group 723 * Returns: 724 * BCM_E_NONE - Success. 725 * BCM_E_XXX 726 */ 727 728 int 729 _bcm_esw_trill_multicast_entry_update(int unit, int key, 730 bcm_vlan_t vid, bcm_mac_t c_dmac, 731 uint8 trill_tree_id, bcm_multicast_t group) 732 { 733 int rv = BCM_E_UNAVAIL; 734 735 #ifdef BCM_TOMAHAWK_SUPPORT 736 if (SOC_IS_TOMAHAWKX(unit)) { 737 rv = bcm_td2_trill_l2_multicast_entry_update(unit, key, 738 vid, c_dmac, trill_tree_id, group); 739 } 740 #endif 741 742 #ifdef BCM_TRIDENT2_SUPPORT 743 if (SOC_IS_TRIDENT2X(unit)) { 744 rv = bcm_td2_trill_l2_multicast_entry_update(unit, key, 745 vid, c_dmac, trill_tree_id, group); 746 } 747 #endif 748 749 #ifdef BCM_TRIUMPH3_SUPPORT 750 if (SOC_IS_TRIUMPH3(unit)) { 751 rv = bcm_tr3_trill_l2_multicast_entry_update(unit, key, 752 vid, c_dmac, trill_tree_id, group); 753 } 754 #endif 755 756 #ifdef BCM_TRIDENT_SUPPORT 757 if (SOC_IS_TRIDENT(unit)) { 758 rv = bcm_td_l2_trill_multicast_entry_update(unit, key, 759 vid, c_dmac, trill_tree_id, group); 760 } 761 #endif 762 763 return rv; 764 765 } 766 767 /* 768 * Purpose: 769 * Modify TRILL Multicast entry 770 * Parameters: 771 * unit - Device unit number 772 * vid - Customer Vlan ID 773 * set_bit - Enable / Disable 774 * Returns: 775 * BCM_E_NONE - Success. 776 * BCM_E_XXX 777 */ 778 779 int 780 _bcm_esw_trill_vlan_multicast_entry_modify(int unit, bcm_vlan_t vid, int set_bit) 781 { 782 int rv = BCM_E_UNAVAIL; 783 784 #ifdef BCM_TOMAHAWK_SUPPORT 785 if (SOC_IS_TOMAHAWKX(unit)) { 786 rv = bcm_td2_trill_vlan_multicast_entry_modify(unit, vid, set_bit); 787 } 788 #endif 789 790 #ifdef BCM_TRIDENT2_SUPPORT 791 if (SOC_IS_TRIDENT2X(unit)) { 792 rv = bcm_td2_trill_vlan_multicast_entry_modify(unit, vid, set_bit); 793 } 794 #endif 795 796 #ifdef BCM_TRIUMPH3_SUPPORT 797 if (SOC_IS_TRIUMPH3(unit)) { 798 rv = bcm_tr3_trill_vlan_multicast_entry_modify(unit, vid, set_bit); 799 } 800 #endif 801 802 #ifdef BCM_TRIDENT_SUPPORT 803 if (SOC_IS_TRIDENT(unit)) { 804 rv = bcm_td_l2_trill_vlan_multicast_entry_modify(unit, vid, set_bit); 805 } 806 #endif 807 808 return rv; 809 810 } 811 812 /* 813 * Purpose: 814 * Reset TRILL Multicast entry for Transit operation 815 * Parameters: 816 * unit - (IN) Device Number 817 * root_name - (IN) trill Root_RBridge 818 * mc_index - (IN) Multicast index 819 */ 820 821 int 822 _bcm_esw_trill_multicast_transit_entry_set(int unit, int flags, 823 bcm_trill_name_t root_name, int l3mc_index, uint8 trill_tree_id) 824 { 825 int rv = BCM_E_UNAVAIL; 826 827 #ifdef BCM_TOMAHAWK_SUPPORT 828 if (SOC_IS_TOMAHAWKX(unit)) { 829 rv = bcm_td_trill_multicast_transit_entry_set(unit, flags, 830 root_name, l3mc_index, trill_tree_id); 831 } 832 #endif 833 834 #ifdef BCM_TRIDENT2_SUPPORT 835 if (SOC_IS_TRIDENT2X(unit)) { 836 rv = bcm_td_trill_multicast_transit_entry_set(unit, flags, 837 root_name, l3mc_index, trill_tree_id); 838 } 839 #endif 840 841 #ifdef BCM_TRIUMPH3_SUPPORT 842 if (SOC_IS_TRIUMPH3(unit)) { 843 rv = bcm_tr3_trill_multicast_transit_entry_set(unit, flags, 844 root_name, l3mc_index, trill_tree_id); 845 } 846 #endif /* BCM_TRIUMPH3_SUPPORT */ 847 848 #ifdef BCM_TRIDENT_SUPPORT 849 if (SOC_IS_TRIDENT(unit)) { 850 rv = bcm_td_trill_multicast_transit_entry_set(unit, flags, 851 root_name, l3mc_index, trill_tree_id); 852 } 853 #endif 854 855 return rv; 856 } 857 858 859 /* 860 * Purpose: 861 * Reset TRILL Multicast entry for Transit operation 862 * Parameters: 863 * unit - (IN) Device Number 864 * root_name - (IN) trill Root_RBridge 865 * mc_index - (IN) Multicast index 866 */ 867 868 int 869 _bcm_esw_trill_multicast_transit_entry_reset(int unit, bcm_trill_name_t root_name) 870 { 871 int rv = BCM_E_UNAVAIL; 872 873 #ifdef BCM_TOMAHAWK_SUPPORT 874 if (SOC_IS_TOMAHAWKX(unit)) { 875 rv = bcm_td_trill_multicast_transit_entry_reset(unit, root_name); 876 } 877 #endif 878 879 #ifdef BCM_TRIDENT2_SUPPORT 880 if (SOC_IS_TRIDENT2X(unit)) { 881 rv = bcm_td_trill_multicast_transit_entry_reset(unit, root_name); 882 } 883 #endif 884 885 #ifdef BCM_TRIUMPH3_SUPPORT 886 if (SOC_IS_TRIUMPH3(unit)) { 887 rv = bcm_tr3_trill_multicast_transit_entry_reset(unit, root_name); 888 } 889 #endif /* BCM_TRIUMPH3_SUPPORT */ 890 891 #ifdef BCM_TRIDENT_SUPPORT 892 if (SOC_IS_TRIDENT(unit)) { 893 rv = bcm_td_trill_multicast_transit_entry_reset(unit, root_name); 894 } 895 #endif 896 897 return rv; 898 } 899 900 /* 901 * Purpose: 902 * Reset all TRILL Multicast entries for Transit operation 903 * Parameters: 904 * unit - (IN) Device Number 905 * tree_id - (IN) trill Tree ID 906 * mc_index - (IN) Multicast index 907 */ 908 909 int 910 _bcm_esw_trill_multicast_transit_entry_reset_all (int unit, uint8 trill_tree_id) 911 { 912 int rv = BCM_E_UNAVAIL; 913 914 #ifdef BCM_TOMAHAWK_SUPPORT 915 if (SOC_IS_TOMAHAWKX(unit)) { 916 rv = bcm_td_trill_multicast_transit_entry_reset_all (unit, trill_tree_id); 917 } 918 #endif 919 920 #ifdef BCM_TRIDENT2_SUPPORT 921 if (SOC_IS_TRIDENT2X(unit)) { 922 rv = bcm_td_trill_multicast_transit_entry_reset_all (unit, trill_tree_id); 923 } 924 #endif 925 926 #ifdef BCM_TRIUMPH3_SUPPORT 927 if (SOC_IS_TRIUMPH3(unit)) { 928 rv = bcm_tr3_trill_multicast_transit_entry_reset_all(unit, trill_tree_id); 929 } 930 #endif /* BCM_TRIUMPH3_SUPPORT */ 931 932 #ifdef BCM_TRIDENT_SUPPORT 933 if (SOC_IS_TRIDENT(unit)) { 934 rv = bcm_td_trill_multicast_transit_entry_reset_all (unit, trill_tree_id); 935 } 936 #endif 937 938 return rv; 939 } 940 941 /* 942 * Purpose: 943 * Get TRILL Multicast entry for Transit operation 944 * Parameters: 945 * unit - (IN) Device Number 946 * root_name - (IN) trill Root_RBridge 947 * group - (OUT) Multicast Group 948 */ 949 950 int 951 _bcm_esw_trill_multicast_transit_entry_get(int unit, bcm_trill_name_t root_name, bcm_multicast_t *group) 952 { 953 int rv = BCM_E_UNAVAIL; 954 955 #ifdef BCM_TOMAHAWK_SUPPORT 956 if (SOC_IS_TOMAHAWKX(unit)) { 957 rv = bcm_td_trill_multicast_transit_entry_get(unit, 958 root_name, group); 959 } 960 #endif 961 962 #ifdef BCM_TRIDENT2_SUPPORT 963 if (SOC_IS_TRIDENT2X(unit)) { 964 rv = bcm_td_trill_multicast_transit_entry_get(unit, 965 root_name, group); 966 } 967 #endif 968 969 #ifdef BCM_TRIUMPH3_SUPPORT 970 if (SOC_IS_TRIUMPH3(unit)) { 971 rv = bcm_tr3_trill_multicast_transit_entry_get(unit, 972 root_name, group); 973 } 974 #endif /* BCM_TRIUMPH3_SUPPORT */ 975 976 #ifdef BCM_TRIDENT_SUPPORT 977 if (SOC_IS_TRIDENT(unit)) { 978 rv = bcm_td_trill_multicast_transit_entry_get(unit, 979 root_name, group); 980 } 981 #endif 982 983 return rv; 984 } 985 986 /* 987 * Description: 988 * Delete all TRILL tree-sepecific Multicast entries 989 * Parameters: 990 * unit - device number 991 * tree_id - Trill Tree ID 992 * Return: 993 * BCM_E_XXX 994 */ 995 int 996 _bcm_esw_trill_multicast_entry_delete_all (int unit, uint8 trill_tree_id) 997 { 998 int rv = BCM_E_UNAVAIL; 999 1000 #ifdef BCM_TOMAHAWK_SUPPORT 1001 if (SOC_IS_TOMAHAWKX(unit)) { 1002 rv = bcm_td2_trill_l2_multicast_entry_delete_all (unit, trill_tree_id); 1003 } 1004 #endif 1005 1006 #ifdef BCM_TRIDENT2_SUPPORT 1007 if (SOC_IS_TRIDENT2X(unit)) { 1008 rv = bcm_td2_trill_l2_multicast_entry_delete_all (unit, trill_tree_id); 1009 } 1010 #endif 1011 1012 #ifdef BCM_TRIUMPH3_SUPPORT 1013 if (SOC_IS_TRIUMPH3(unit)) { 1014 rv = bcm_tr3_trill_l2_multicast_entry_delete_all(unit, trill_tree_id); 1015 } 1016 #endif /* BCM_TRIUMPH3_SUPPORT */ 1017 1018 #ifdef BCM_TRIDENT_SUPPORT 1019 if (SOC_IS_TRIDENT(unit)) { 1020 rv = bcm_td_l2_trill_multicast_entry_delete_all (unit, trill_tree_id); 1021 } 1022 #endif 1023 1024 return rv; 1025 } 1026 1027 /* 1028 * Purpose: 1029 * Get TRILL Multicast entry for Transit operation 1030 * Parameters: 1031 * unit - (IN) Device Number 1032 * root_name - (IN) trill Root_RBridge 1033 * group - (OUT) Multicast Group 1034 */ 1035 1036 int 1037 _bcm_esw_trill_multicast_entry_get(int unit, int key, bcm_vlan_t vid, 1038 bcm_mac_t mac, uint8 trill_tree_id, bcm_multicast_t *group) 1039 { 1040 int rv = BCM_E_UNAVAIL; 1041 1042 #ifdef BCM_TOMAHAWK_SUPPORT 1043 if (SOC_IS_TOMAHAWKX(unit)) { 1044 rv = bcm_td2_trill_l2_multicast_entry_get(unit, key, 1045 vid, mac, trill_tree_id, group); 1046 } 1047 #endif 1048 1049 #ifdef BCM_TRIDENT2_SUPPORT 1050 if (SOC_IS_TRIDENT2X(unit)) { 1051 rv = bcm_td2_trill_l2_multicast_entry_get(unit, key, 1052 vid, mac, trill_tree_id, group); 1053 } 1054 #endif 1055 1056 #ifdef BCM_TRIUMPH3_SUPPORT 1057 if (SOC_IS_TRIUMPH3(unit)) { 1058 rv = bcm_tr3_trill_l2_multicast_entry_get(unit, key, 1059 vid, mac, trill_tree_id, group); 1060 } 1061 #endif /* BCM_TRIUMPH3_SUPPORT */ 1062 1063 #ifdef BCM_TRIDENT_SUPPORT 1064 if (SOC_IS_TRIDENT(unit)) { 1065 rv = bcm_td_l2_trill_multicast_entry_get(unit, key, 1066 vid, mac, trill_tree_id, group); 1067 } 1068 #endif 1069 1070 return rv; 1071 } 1072 1073 /* 1074 * Purpose: 1075 * Enable TRILL Multicast traffic 1076 * Parameters: 1077 * unit - (IN) Device Number 1078 * root_name - (IN) trill Root_RBridge 1079 */ 1080 1081 int 1082 _bcm_esw_trill_multicast_enable(int unit, int flags, bcm_trill_name_t root_name) 1083 { 1084 int rv = BCM_E_UNAVAIL; 1085 1086 #ifdef BCM_TOMAHAWK_SUPPORT 1087 if (SOC_IS_TOMAHAWKX(unit)) { 1088 rv = bcm_td_trill_multicast_enable(unit, flags, root_name); 1089 } 1090 #endif 1091 1092 #ifdef BCM_TRIDENT2_SUPPORT 1093 if (SOC_IS_TRIDENT2X(unit)) { 1094 rv = bcm_td_trill_multicast_enable(unit, flags, root_name); 1095 } 1096 #endif 1097 1098 #ifdef BCM_TRIUMPH3_SUPPORT 1099 if (SOC_IS_TRIUMPH3(unit)) { 1100 rv = bcm_tr3_trill_multicast_enable(unit, flags, root_name); 1101 } 1102 #endif /* BCM_TRIUMPH3_SUPPORT */ 1103 1104 #ifdef BCM_TRIDENT_SUPPORT 1105 if (SOC_IS_TRIDENT(unit)) { 1106 rv = bcm_td_trill_multicast_enable(unit, flags, root_name); 1107 } 1108 #endif 1109 1110 return rv; 1111 } 1112 1113 1114 /* 1115 * Purpose: 1116 * Disable TRILL Multicast traffic 1117 * Parameters: 1118 * unit - (IN) Device Number 1119 * root_name - (IN) trill Root_RBridge 1120 */ 1121 1122 int 1123 _bcm_esw_trill_multicast_disable(int unit, int flags, bcm_trill_name_t root_name) 1124 { 1125 int rv = BCM_E_UNAVAIL; 1126 1127 #ifdef BCM_TOMAHAWK_SUPPORT 1128 if (SOC_IS_TOMAHAWKX(unit)) { 1129 rv = bcm_td_trill_multicast_disable(unit, flags, root_name); 1130 } 1131 #endif 1132 1133 #ifdef BCM_TRIDENT2_SUPPORT 1134 if (SOC_IS_TRIDENT2X(unit)) { 1135 rv = bcm_td_trill_multicast_disable(unit, flags, root_name); 1136 } 1137 #endif 1138 1139 #ifdef BCM_TRIUMPH3_SUPPORT 1140 if (SOC_IS_TRIUMPH3(unit)) { 1141 rv = bcm_tr3_trill_multicast_disable(unit, flags, root_name); 1142 } 1143 #endif /* BCM_TRIUMPH3_SUPPORT */ 1144 1145 #ifdef BCM_TRIDENT_SUPPORT 1146 if (SOC_IS_TRIDENT(unit)) { 1147 rv = bcm_td_trill_multicast_disable(unit, flags, root_name); 1148 } 1149 #endif 1150 1151 return rv; 1152 } 1153 1154 /* 1155 * Description: 1156 * Traverse TRILL Access to Network Multicast entries 1157 * Parameters: 1158 * unit - device number 1159 * trav_st - Traverse structure with all the data. 1160 * Return: 1161 * BCM_E_XXX 1162 */ 1163 1164 int 1165 _bcm_esw_trill_access_multicast_entry_traverse (int unit, _bcm_td_trill_multicast_entry_traverse_t *trav_st) 1166 { 1167 int rv = BCM_E_UNAVAIL; 1168 1169 #ifdef BCM_TOMAHAWK_SUPPORT 1170 if (SOC_IS_TOMAHAWKX(unit)) { 1171 rv = bcm_td2_trill_l2_access_multicast_entry_traverse(unit, trav_st); 1172 } 1173 #endif 1174 1175 #ifdef BCM_TRIDENT2_SUPPORT 1176 if (SOC_IS_TRIDENT2X(unit)) { 1177 rv = bcm_td2_trill_l2_access_multicast_entry_traverse(unit, trav_st); 1178 } 1179 #endif 1180 1181 #ifdef BCM_TRIUMPH3_SUPPORT 1182 if (SOC_IS_TRIUMPH3(unit)) { 1183 rv = bcm_tr3_trill_l2_access_multicast_entry_traverse(unit, trav_st); 1184 } 1185 #endif /* BCM_TRIUMPH3_SUPPORT */ 1186 1187 #ifdef BCM_TRIDENT_SUPPORT 1188 if (SOC_IS_TRIDENT(unit)) { 1189 rv = bcm_td_l2_trill_access_multicast_entry_traverse(unit, trav_st); 1190 } 1191 #endif 1192 1193 return rv; 1194 } 1195 1196 /* 1197 * Description: 1198 * Traverse TRILL Long and Short Multicast entries 1199 * Parameters: 1200 * unit - device number 1201 * trav_st - Traverse structure with all the data. 1202 * Return: 1203 * BCM_E_XXX 1204 */ 1205 1206 int 1207 _bcm_esw_trill_network_multicast_entry_traverse (int unit, _bcm_td_trill_multicast_entry_traverse_t *trav_st) 1208 { 1209 int rv = BCM_E_UNAVAIL; 1210 1211 #ifdef BCM_TOMAHAWK_SUPPORT 1212 if (SOC_IS_TOMAHAWKX(unit)) { 1213 rv = bcm_td2_trill_l2_network_multicast_entry_traverse(unit, trav_st); 1214 } 1215 #endif 1216 1217 #ifdef BCM_TRIDENT2_SUPPORT 1218 if (SOC_IS_TRIDENT2X(unit)) { 1219 rv = bcm_td2_trill_l2_network_multicast_entry_traverse(unit, trav_st); 1220 } 1221 #endif 1222 1223 #ifdef BCM_TRIUMPH3_SUPPORT 1224 if (SOC_IS_TRIUMPH3(unit)) { 1225 rv = bcm_tr3_trill_l2_network_multicast_entry_traverse(unit, trav_st); 1226 } 1227 #endif /* BCM_TRIUMPH3_SUPPORT */ 1228 1229 #ifdef BCM_TRIDENT_SUPPORT 1230 if (SOC_IS_TRIDENT(unit)) { 1231 rv = bcm_td_l2_trill_network_multicast_entry_traverse(unit, trav_st); 1232 } 1233 #endif 1234 1235 return rv; 1236 } 1237 1238 /* 1239 * Description: 1240 * Traverse TRILL Unpruned Multicast entries 1241 * Parameters: 1242 * unit - device number 1243 * trav_st - Traverse structure with all the data. 1244 * Return: 1245 * BCM_E_XXX 1246 */ 1247 int 1248 _bcm_esw_trill_unpruned_entry_traverse (int unit, _bcm_td_trill_multicast_entry_traverse_t *trav_st) 1249 { 1250 int rv = BCM_E_UNAVAIL; 1251 1252 #ifdef BCM_TOMAHAWK_SUPPORT 1253 if (SOC_IS_TOMAHAWKX(unit)) { 1254 rv = bcm_td_trill_unpruned_entry_traverse(unit, trav_st); 1255 } 1256 #endif 1257 1258 #ifdef BCM_TRIDENT2_SUPPORT 1259 if (SOC_IS_TRIDENT2X(unit)) { 1260 rv = bcm_td_trill_unpruned_entry_traverse(unit, trav_st); 1261 } 1262 #endif 1263 1264 #ifdef BCM_TRIUMPH3_SUPPORT 1265 if (SOC_IS_TRIUMPH3(unit)) { 1266 rv = bcm_tr3_trill_unpruned_entry_traverse(unit, trav_st); 1267 } 1268 #endif /* BCM_TRIUMPH3_SUPPORT */ 1269 1270 #ifdef BCM_TRIDENT_SUPPORT 1271 if (SOC_IS_TRIDENT(unit)) { 1272 rv = bcm_td_trill_unpruned_entry_traverse(unit, trav_st); 1273 } 1274 #endif 1275 1276 return rv; 1277 } 1278 1279 #else /* INCLUDE_L3 */ 1280 int bcm_esw_trill_not_empty; 1281 #endif /* INCLUDE_L3 */