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