openbcm

Git mirror of https://github.com/Broadcom-Network-Switching-Software/OpenBCM
git clone git://git.finwo.net/mirror/broadcom/openbcm
Log | Files | Refs | README

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 */