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

vxlan.c (5835B)


      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:    vxlan.c
      8  * Purpose: Handle trident2plus specific vlan features.
      9  */
     10  
     11 #include <soc/defs.h>
     12 #include <sal/core/libc.h>
     13 #include <shared/bsl.h>
     14 #if defined(BCM_TRIDENT2PLUS_SUPPORT) && defined(INCLUDE_L3)
     15 #include <soc/drv.h>
     16 #include <soc/mem.h>
     17 #include <soc/td2_td2p.h>
     18 
     19 #include <bcm/error.h>
     20 #include <bcm/types.h>
     21 
     22 #include <bcm_int/esw/virtual.h>
     23 #include <bcm_int/esw/trident2.h>
     24 #include <bcm_int/esw/trident2plus.h>
     25 
     26  /*
     27   * Function:
     28   *      bcm_td2p_share_vp_get
     29   * Purpose:
     30   *      Get shared VPs info per VPN
     31   * Parameters:
     32   *      unit       - (IN) Device Number
     33   *      vpn        - (IN) VPN that shared vp belong to
     34   *      vp_bitmap  - (OUT) shared vp bitmap
     35   * Returns:
     36   *      BCM_E_XXX
     37   */
     38  int
     39  bcm_td2p_share_vp_get(int unit, bcm_vpn_t vpn, SHR_BITDCL *vp_bitmap)
     40  {
     41      vlan_xlate_entry_t *vent;
     42      soc_mem_t mem;
     43      int index_min = 0;
     44      int index_max = 0;
     45      uint8 *xlate_buf = NULL;
     46      int buf_size = 0;
     47      int i = 0;
     48      int rv = BCM_E_NONE;
     49      int vfi = -1;
     50      int vp = -1;
     51 
     52      if (vpn != BCM_VXLAN_VPN_INVALID) {
     53          BCM_IF_ERROR_RETURN(_bcm_td2_vxlan_vpn_is_valid(unit, vpn));
     54          _BCM_VXLAN_VPN_GET(vfi, _BCM_VPN_TYPE_VFI, vpn);
     55      }
     56 
     57 #if defined(BCM_TRIDENT3_SUPPORT)
     58     if (SOC_MEM_IS_VALID(unit, VLAN_XLATE_1_DOUBLEm)) {
     59         mem = VLAN_XLATE_1_DOUBLEm;
     60     } else
     61 #endif
     62     {
     63         mem = VLAN_XLATEm;
     64     }
     65 
     66      index_min = soc_mem_index_min(unit, mem);
     67      index_max = soc_mem_index_max(unit, mem);
     68 
     69      buf_size = SOC_MEM_TABLE_BYTES(unit, mem);
     70      xlate_buf = soc_cm_salloc(unit, buf_size, "VLAN_XLATE buffer");
     71      if (NULL == xlate_buf) {
     72          return BCM_E_MEMORY;
     73      }
     74      rv = soc_mem_read_range(unit, mem, MEM_BLOCK_ANY, index_min, index_max, xlate_buf);
     75      if (rv < 0) {
     76          soc_cm_sfree(unit, xlate_buf);
     77          return rv;
     78      }
     79 
     80      for (i = index_min; i <= index_max; i++) {
     81          vent = soc_mem_table_idx_to_pointer(unit, mem, void *, xlate_buf, i);
     82 #if defined(BCM_TRIDENT3_SUPPORT)
     83          if (SOC_MEM_IS_VALID(unit, VLAN_XLATE_1_DOUBLEm)) {
     84              if (soc_mem_field32_get(unit, mem, vent, BASE_VALID_0f) != 3) {
     85                  continue;
     86              }
     87              if (soc_mem_field32_get(unit, mem, vent, BASE_VALID_1f) != 7) {
     88                  continue;
     89              }
     90          } else
     91 #endif
     92          {
     93              if (soc_mem_field32_get(unit, mem, vent, VALIDf) == 0) {
     94                  continue;
     95              }
     96          }
     97 
     98          if (soc_mem_field32_get(unit, mem, vent, XLATE__MPLS_ACTIONf) != 0x1) {
     99              continue;
    100          }
    101 
    102          if (vfi != -1 && soc_mem_field32_get(unit, mem, vent, XLATE__VFIf) != vfi) {
    103              continue;
    104          }
    105 
    106          vp = soc_mem_field32_get(unit, mem, vent, XLATE__SOURCE_VPf);
    107          SHR_BITSET(vp_bitmap, vp);
    108      }
    109 
    110      (void)soc_cm_sfree(unit, xlate_buf);
    111 
    112      return BCM_E_NONE;
    113  }
    114 
    115 /*
    116  * Function:
    117  *      bcm_td2p_share_vp_delete
    118  * Purpose:
    119  *      Delete match criteria of shared VPs
    120  * Parameters:
    121  *      unit    - (IN) Device Number
    122  *      vpn     - (IN) VPN that shared vp belong to
    123  *      vp      - (IN) Source Virtual Port
    124  * Returns:
    125  *      BCM_E_XXX
    126  */
    127 int
    128 bcm_td2p_share_vp_delete(int unit, bcm_vpn_t vpn, int vp)
    129 {
    130     vlan_xlate_entry_t *vent;
    131     soc_mem_t mem;
    132     int index_min = 0;
    133     int index_max = 0;
    134     uint8 *xlate_buf = NULL;
    135     int buf_size = 0;
    136     int i = 0;
    137     int rv = BCM_E_NONE;
    138     int vfi = -1;
    139     int source_vp = -1;
    140 
    141     if (vpn != BCM_VXLAN_VPN_INVALID) {
    142         BCM_IF_ERROR_RETURN(_bcm_td2_vxlan_vpn_is_valid(unit, vpn));
    143         _BCM_VXLAN_VPN_GET(vfi, _BCM_VPN_TYPE_VFI, vpn);
    144     }
    145 
    146 #if defined(BCM_TRIDENT3_SUPPORT)
    147     if (SOC_MEM_IS_VALID(unit, VLAN_XLATE_1_DOUBLEm)) {
    148         mem = VLAN_XLATE_1_DOUBLEm;
    149     } else
    150 #endif
    151     {
    152         mem = VLAN_XLATEm;
    153     }
    154 
    155     index_min = soc_mem_index_min(unit, mem);
    156     index_max = soc_mem_index_max(unit, mem);
    157 
    158     buf_size = SOC_MEM_TABLE_BYTES(unit, mem);
    159     xlate_buf = soc_cm_salloc(unit, buf_size, "VLAN_XLATE buffer");
    160     if (NULL == xlate_buf) {
    161         return BCM_E_MEMORY;
    162     }
    163     rv = soc_mem_read_range(unit, mem, MEM_BLOCK_ANY, index_min, index_max, xlate_buf);
    164     if (rv < 0) {
    165         soc_cm_sfree(unit, xlate_buf);
    166         return rv;
    167     }
    168 
    169     for (i = index_min; i <= index_max; i++) {
    170         vent = soc_mem_table_idx_to_pointer(unit, mem, void *, xlate_buf, i);
    171 #if defined(BCM_TRIDENT3_SUPPORT)
    172         if (SOC_MEM_IS_VALID(unit, VLAN_XLATE_1_DOUBLEm)) {
    173             if (soc_mem_field32_get(unit, mem, vent, BASE_VALID_0f) != 3) {
    174                 continue;
    175             }
    176             if (soc_mem_field32_get(unit, mem, vent, BASE_VALID_1f) != 7) {
    177                 continue;
    178             }
    179         } else
    180 #endif
    181         {
    182             if (soc_mem_field32_get(unit, mem, vent, VALIDf) == 0) {
    183                 continue;
    184             }
    185         }
    186 
    187         if (soc_mem_field32_get(unit, mem, vent, XLATE__MPLS_ACTIONf) != 0x1) {
    188             continue;
    189         }
    190 
    191         if (vfi != -1 && soc_mem_field32_get(unit, mem, vent, XLATE__VFIf) != vfi) {
    192             continue;
    193         }
    194 
    195         source_vp = soc_mem_field32_get(unit, mem, vent, XLATE__SOURCE_VPf);
    196         if (vp != source_vp) {
    197             continue;
    198         }
    199         rv = soc_mem_delete_index(unit, mem, MEM_BLOCK_ALL, i);
    200         if (rv < 0) {
    201             soc_cm_sfree(unit, xlate_buf);
    202             return rv;
    203         }
    204         bcm_td2_vxlan_port_match_count_adjust(unit, source_vp, -1);
    205     }
    206 
    207     (void)soc_cm_sfree(unit, xlate_buf);
    208 
    209     return BCM_E_NONE;
    210 }
    211 #endif /* defined(BCM_TRIDENT2PLUS_SUPPORT) && defined(INCLUDE_L3) */