multicast.h (13952B)
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 * This file contains multicast definitions. 8 */ 9 10 #ifndef _SHR_MULTICAST_H 11 #define _SHR_MULTICAST_H 12 #include <shared/types.h> 13 #include <shared/gport.h> 14 15 #define _SHR_MULTICAST_TYPE_L2 1 16 #define _SHR_MULTICAST_TYPE_L3 2 17 #define _SHR_MULTICAST_TYPE_VPLS 3 18 #define _SHR_MULTICAST_TYPE_SUBPORT 4 19 #define _SHR_MULTICAST_TYPE_MIM 5 20 #define _SHR_MULTICAST_TYPE_WLAN 6 21 #define _SHR_MULTICAST_TYPE_VLAN 7 22 #define _SHR_MULTICAST_TYPE_TRILL 8 23 #define _SHR_MULTICAST_TYPE_NIV 9 24 #define _SHR_MULTICAST_TYPE_EGRESS_OBJECT 10 25 #define _SHR_MULTICAST_TYPE_L2GRE 11 26 #define _SHR_MULTICAST_TYPE_VXLAN 12 27 #define _SHR_MULTICAST_TYPE_PORTS_GROUP 13 28 #define _SHR_MULTICAST_TYPE_EXTENDER 14 29 #define _SHR_MULTICAST_TYPE_FLOW 15 30 #define _SHR_MULTICAST_TYPE_ING_BMP 16 31 #define _SHR_MULTICAST_TYPE_EGR_BMP 17 32 33 #define _SHR_MULTICAST_TYPE_SHIFT 24 34 #define _SHR_MULTICAST_TYPE_MASK 0xff 35 36 #define _SHR_MULTICAST_ID_SHIFT 0 37 #define _SHR_MULTICAST_ID_MASK 0xffffff 38 39 /* BCM_MULTICAST_IS_SET */ 40 #define _SHR_MULTICAST_IS_SET(_group_) \ 41 (((_group_) >> _SHR_MULTICAST_TYPE_SHIFT) != 0) 42 43 #define _SHR_MULTICAST_GROUP_SET(_group_, _type_, _id_) \ 44 ((_group_) = ((_type_) << _SHR_MULTICAST_TYPE_SHIFT) | \ 45 (((_id_) & _SHR_MULTICAST_ID_MASK) << _SHR_MULTICAST_ID_SHIFT)) 46 47 #define _SHR_MULTICAST_ID_GET(_group_) \ 48 (((_group_) >> _SHR_MULTICAST_ID_SHIFT) & _SHR_MULTICAST_ID_MASK) 49 50 #define _SHR_MULTICAST_TYPE_GET(_group_) \ 51 (((_group_) >> _SHR_MULTICAST_TYPE_SHIFT) & _SHR_MULTICAST_TYPE_MASK) 52 53 /* BCM_MULTICAST_IS_XXXX */ 54 #define _SHR_MULTICAST_IS_L2(_group_) \ 55 (((_group_) >> _SHR_MULTICAST_TYPE_SHIFT) == _SHR_MULTICAST_TYPE_L2) 56 57 #define _SHR_MULTICAST_IS_L3(_group_) \ 58 (((_group_) >> _SHR_MULTICAST_TYPE_SHIFT) == _SHR_MULTICAST_TYPE_L3) 59 60 #define _SHR_MULTICAST_IS_VPLS(_group_) \ 61 (((_group_) >> _SHR_MULTICAST_TYPE_SHIFT) == _SHR_MULTICAST_TYPE_VPLS) 62 63 #define _SHR_MULTICAST_IS_SUBPORT(_group_) \ 64 (((_group_) >> _SHR_MULTICAST_TYPE_SHIFT) == _SHR_MULTICAST_TYPE_SUBPORT) 65 66 #define _SHR_MULTICAST_IS_MIM(_group_) \ 67 (((_group_) >> _SHR_MULTICAST_TYPE_SHIFT) == _SHR_MULTICAST_TYPE_MIM) 68 69 #define _SHR_MULTICAST_IS_WLAN(_group_) \ 70 (((_group_) >> _SHR_MULTICAST_TYPE_SHIFT) == _SHR_MULTICAST_TYPE_WLAN) 71 72 #define _SHR_MULTICAST_IS_VLAN(_group_) \ 73 (((_group_) >> _SHR_MULTICAST_TYPE_SHIFT) == _SHR_MULTICAST_TYPE_VLAN) 74 75 #define _SHR_MULTICAST_IS_TRILL(_group_) \ 76 (((_group_) >> _SHR_MULTICAST_TYPE_SHIFT) == _SHR_MULTICAST_TYPE_TRILL) 77 78 #define _SHR_MULTICAST_IS_NIV(_group_) \ 79 (((_group_) >> _SHR_MULTICAST_TYPE_SHIFT) == _SHR_MULTICAST_TYPE_NIV) 80 81 #define _SHR_MULTICAST_IS_EGRESS_OBJECT(_group_) \ 82 (((_group_) >> _SHR_MULTICAST_TYPE_SHIFT) == _SHR_MULTICAST_TYPE_EGRESS_OBJECT) 83 84 #define _SHR_MULTICAST_IS_L2GRE(_group_) \ 85 (((_group_) >> _SHR_MULTICAST_TYPE_SHIFT) == _SHR_MULTICAST_TYPE_L2GRE) 86 87 #define _SHR_MULTICAST_IS_VXLAN(_group_) \ 88 (((_group_) >> _SHR_MULTICAST_TYPE_SHIFT) == _SHR_MULTICAST_TYPE_VXLAN) 89 90 #define _SHR_MULTICAST_IS_FLOW(_group_) \ 91 (((_group_) >> _SHR_MULTICAST_TYPE_SHIFT) == _SHR_MULTICAST_TYPE_FLOW) 92 93 #define _SHR_MULTICAST_IS_PORTS_GROUP(_group_) \ 94 (((_group_) >> _SHR_MULTICAST_TYPE_SHIFT) == _SHR_MULTICAST_TYPE_PORTS_GROUP) 95 96 #define _SHR_MULTICAST_IS_EXTENDER(_group_) \ 97 (((_group_) >> _SHR_MULTICAST_TYPE_SHIFT) == _SHR_MULTICAST_TYPE_EXTENDER) 98 99 /* BCM_MULTICAST_XXXX_SET */ 100 #define _SHR_MULTICAST_L2_SET(_group_, _mc_index_) \ 101 ((_group_) = ((_SHR_MULTICAST_TYPE_L2) << _SHR_MULTICAST_TYPE_SHIFT) | \ 102 (((_mc_index_) & _SHR_MULTICAST_ID_MASK) << _SHR_MULTICAST_ID_SHIFT)) 103 104 #define _SHR_MULTICAST_L3_SET(_group_, _mc_index_) \ 105 ((_group_) = ((_SHR_MULTICAST_TYPE_L3) << _SHR_MULTICAST_TYPE_SHIFT) | \ 106 (((_mc_index_) & _SHR_MULTICAST_ID_MASK) << _SHR_MULTICAST_ID_SHIFT)) 107 108 #define _SHR_MULTICAST_VPLS_SET(_group_, _mc_index_) \ 109 ((_group_) = ((_SHR_MULTICAST_TYPE_VPLS) << _SHR_MULTICAST_TYPE_SHIFT) | \ 110 (((_mc_index_) & _SHR_MULTICAST_ID_MASK) << _SHR_MULTICAST_ID_SHIFT)) 111 112 #define _SHR_MULTICAST_SUBPORT_SET(_group_, _mc_index_) \ 113 ((_group_) = ((_SHR_MULTICAST_TYPE_SUBPORT) << _SHR_MULTICAST_TYPE_SHIFT) | \ 114 (((_mc_index_) & _SHR_MULTICAST_ID_MASK) << _SHR_MULTICAST_ID_SHIFT)) 115 116 #define _SHR_MULTICAST_MIM_SET(_group_, _mc_index_) \ 117 ((_group_) = ((_SHR_MULTICAST_TYPE_MIM) << _SHR_MULTICAST_TYPE_SHIFT) | \ 118 (((_mc_index_) & _SHR_MULTICAST_ID_MASK) << _SHR_MULTICAST_ID_SHIFT)) 119 120 #define _SHR_MULTICAST_WLAN_SET(_group_, _mc_index_) \ 121 ((_group_) = ((_SHR_MULTICAST_TYPE_WLAN) << _SHR_MULTICAST_TYPE_SHIFT) | \ 122 (((_mc_index_) & _SHR_MULTICAST_ID_MASK) << _SHR_MULTICAST_ID_SHIFT)) 123 124 #define _SHR_MULTICAST_VLAN_SET(_group_, _mc_index_) \ 125 ((_group_) = ((_SHR_MULTICAST_TYPE_VLAN) << _SHR_MULTICAST_TYPE_SHIFT) | \ 126 (((_mc_index_) & _SHR_MULTICAST_ID_MASK) << _SHR_MULTICAST_ID_SHIFT)) 127 128 #define _SHR_MULTICAST_TRILL_SET(_group_, _mc_index_) \ 129 ((_group_) = ((_SHR_MULTICAST_TYPE_TRILL) << _SHR_MULTICAST_TYPE_SHIFT) | \ 130 (((_mc_index_) & _SHR_MULTICAST_ID_MASK) << _SHR_MULTICAST_ID_SHIFT)) 131 132 #define _SHR_MULTICAST_NIV_SET(_group_, _mc_index_) \ 133 ((_group_) = ((_SHR_MULTICAST_TYPE_NIV) << _SHR_MULTICAST_TYPE_SHIFT) | \ 134 (((_mc_index_) & _SHR_MULTICAST_ID_MASK) << _SHR_MULTICAST_ID_SHIFT)) 135 136 #define _SHR_MULTICAST_EGRESS_OBJECT_SET(_group_, _mc_index_) \ 137 ((_group_) = ((_SHR_MULTICAST_TYPE_EGRESS_OBJECT) << _SHR_MULTICAST_TYPE_SHIFT) | \ 138 (((_mc_index_) & _SHR_MULTICAST_ID_MASK) << _SHR_MULTICAST_ID_SHIFT)) 139 140 #define _SHR_MULTICAST_L2GRE_SET(_group_, _mc_index_) \ 141 ((_group_) = ((_SHR_MULTICAST_TYPE_L2GRE) << _SHR_MULTICAST_TYPE_SHIFT) | \ 142 (((_mc_index_) & _SHR_MULTICAST_ID_MASK) << _SHR_MULTICAST_ID_SHIFT)) 143 144 #define _SHR_MULTICAST_VXLAN_SET(_group_, _mc_index_) \ 145 ((_group_) = ((_SHR_MULTICAST_TYPE_VXLAN) << _SHR_MULTICAST_TYPE_SHIFT) | \ 146 (((_mc_index_) & _SHR_MULTICAST_ID_MASK) << _SHR_MULTICAST_ID_SHIFT)) 147 148 #define _SHR_MULTICAST_FLOW_SET(_group_, _mc_index_) \ 149 ((_group_) = ((_SHR_MULTICAST_TYPE_FLOW) << _SHR_MULTICAST_TYPE_SHIFT) | \ 150 (((_mc_index_) & _SHR_MULTICAST_ID_MASK) << _SHR_MULTICAST_ID_SHIFT)) 151 152 #define _SHR_MULTICAST_PORTS_GROUP_SET(_group_, _mc_index_) \ 153 ((_group_) = ((_SHR_MULTICAST_TYPE_PORTS_GROUP) << _SHR_MULTICAST_TYPE_SHIFT) | \ 154 (((_mc_index_) & _SHR_MULTICAST_ID_MASK) << _SHR_MULTICAST_ID_SHIFT)) 155 156 #define _SHR_MULTICAST_EXTENDER_SET(_group_, _mc_index_) \ 157 ((_group_) = ((_SHR_MULTICAST_TYPE_EXTENDER) << _SHR_MULTICAST_TYPE_SHIFT) | \ 158 (((_mc_index_) & _SHR_MULTICAST_ID_MASK) << _SHR_MULTICAST_ID_SHIFT)) 159 160 /* BCM_MULTICAST_XXXX_GET */ 161 #define _SHR_MULTICAST_L2_GET(_group_) \ 162 ((_SHR_MULTICAST_TYPE(_group_) == _SHR_MULTICAST_TYPE_L2) ? \ 163 (((_group_) >> _SHR_MULTICAST_ID_SHIFT) & _SHR_MULTICAST_ID_MASK) : -1) 164 165 #define _SHR_MULTICAST_L3_GET(_group_) \ 166 ((_SHR_MULTICAST_TYPE(_group_) == _SHR_MULTICAST_TYPE_L3) ? \ 167 (((_group_) >> _SHR_MULTICAST_ID_SHIFT) & _SHR_MULTICAST_ID_MASK) : -1) 168 169 #define _SHR_MULTICAST_VPLS_GET(_group_) \ 170 ((_SHR_MULTICAST_TYPE(_group_) == _SHR_MULTICAST_TYPE_VPLS) ? \ 171 (((_group_) >> _SHR_MULTICAST_ID_SHIFT) & _SHR_MULTICAST_ID_MASK) : -1) 172 173 #define _SHR_MULTICAST_SUBPORT_GET(_group_) \ 174 ((_SHR_MULTICAST_TYPE(_group_) == _SHR_MULTICAST_TYPE_SUBPORT) ? \ 175 (((_group_) >> _SHR_MULTICAST_ID_SHIFT) & _SHR_MULTICAST_ID_MASK) : -1) 176 177 #define _SHR_MULTICAST_MIM_GET(_group_) \ 178 ((_SHR_MULTICAST_TYPE(_group_) == _SHR_MULTICAST_TYPE_MIM) ? \ 179 (((_group_) >> _SHR_MULTICAST_ID_SHIFT) & _SHR_MULTICAST_ID_MASK) : -1) 180 181 #define _SHR_MULTICAST_WLAN_GET(_group_) \ 182 ((_SHR_MULTICAST_TYPE(_group_) == _SHR_MULTICAST_TYPE_WLAN) ? \ 183 (((_group_) >> _SHR_MULTICAST_ID_SHIFT) & _SHR_MULTICAST_ID_MASK) : -1) 184 185 #define _SHR_MULTICAST_VLAN_GET(_group_) \ 186 ((_SHR_MULTICAST_TYPE(_group_) == _SHR_MULTICAST_TYPE_VLAN) ? \ 187 (((_group_) >> _SHR_MULTICAST_ID_SHIFT) & _SHR_MULTICAST_ID_MASK) : -1) 188 189 #define _SHR_MULTICAST_TRILL_GET(_group_) \ 190 ((_SHR_MULTICAST_TYPE(_group_) == _SHR_MULTICAST_TYPE_TRILL) ? \ 191 (((_group_) >> _SHR_MULTICAST_ID_SHIFT) & _SHR_MULTICAST_ID_MASK) : -1) 192 193 #define _SHR_MULTICAST_NIV_GET(_group_) \ 194 ((_SHR_MULTICAST_TYPE(_group_) == _SHR_MULTICAST_TYPE_NIV) ? \ 195 (((_group_) >> _SHR_MULTICAST_ID_SHIFT) & _SHR_MULTICAST_ID_MASK) : -1) 196 197 #define _SHR_MULTICAST_EGRESS_OBJECT_GET(_group_) \ 198 ((_SHR_MULTICAST_TYPE(_group_) == _SHR_MULTICAST_TYPE_EGRESS_OBJECT) ? \ 199 (((_group_) >> _SHR_MULTICAST_ID_SHIFT) & _SHR_MULTICAST_ID_MASK) : -1) 200 201 #define _SHR_MULTICAST_L2GRE_GET(_group_) \ 202 ((_SHR_MULTICAST_TYPE(_group_) == _SHR_MULTICAST_TYPE_L2GRE) ? \ 203 (((_group_) >> _SHR_MULTICAST_ID_SHIFT) & _SHR_MULTICAST_ID_MASK) : -1) 204 205 #define _SHR_MULTICAST_VXLAN_GET(_group_) \ 206 ((_SHR_MULTICAST_TYPE(_group_) == _SHR_MULTICAST_TYPE_VXLAN) ? \ 207 (((_group_) >> _SHR_MULTICAST_ID_SHIFT) & _SHR_MULTICAST_ID_MASK) : -1) 208 209 #define _SHR_MULTICAST_FLOW_GET(_group_) \ 210 ((_SHR_MULTICAST_TYPE(_group_) == _SHR_MULTICAST_TYPE_FLOW) ? \ 211 (((_group_) >> _SHR_MULTICAST_ID_SHIFT) & _SHR_MULTICAST_ID_MASK) : -1) 212 213 #define _SHR_MULTICAST_PORTS_GROUP_GET(_group_) \ 214 ((_SHR_MULTICAST_TYPE(_group_) == _SHR_MULTICAST_TYPE_PORTS_GROUP) ? \ 215 (((_group_) >> _SHR_MULTICAST_ID_SHIFT) & _SHR_MULTICAST_ID_MASK) : -1) 216 217 #define _SHR_MULTICAST_EXTENDER_GET(_group_) \ 218 ((_SHR_MULTICAST_TYPE(_group_) == _SHR_MULTICAST_TYPE_EXTENDER) ? \ 219 (((_group_) >> _SHR_MULTICAST_ID_SHIFT) & _SHR_MULTICAST_ID_MASK) : -1) 220 221 /* BCM_MULTICAST_XXXX_GET */ 222 #define _SHR_MULTICAST_L2(_mc_index_) \ 223 (((_SHR_MULTICAST_TYPE_L2) << _SHR_MULTICAST_TYPE_SHIFT) | \ 224 (((_mc_index_) & _SHR_MULTICAST_ID_MASK) << _SHR_MULTICAST_ID_SHIFT)) 225 226 #define _SHR_MULTICAST_L3(_mc_index_) \ 227 (((_SHR_MULTICAST_TYPE_L3) << _SHR_MULTICAST_TYPE_SHIFT) | \ 228 (((_mc_index_) & _SHR_MULTICAST_ID_MASK) << _SHR_MULTICAST_ID_SHIFT)) 229 230 #define _SHR_MULTICAST_VPLS(_mc_index_) \ 231 (((_SHR_MULTICAST_TYPE_VPLS) << _SHR_MULTICAST_TYPE_SHIFT) | \ 232 (((_mc_index_) & _SHR_MULTICAST_ID_MASK) << _SHR_MULTICAST_ID_SHIFT)) 233 234 #define _SHR_MULTICAST_SUBPORT(_mc_index_) \ 235 (((_SHR_MULTICAST_TYPE_SUBPORT) << _SHR_MULTICAST_TYPE_SHIFT) | \ 236 (((_mc_index_) & _SHR_MULTICAST_ID_MASK) << _SHR_MULTICAST_ID_SHIFT)) 237 238 #define _SHR_MULTICAST_MIM(_mc_index_) \ 239 (((_SHR_MULTICAST_TYPE_MIM) << _SHR_MULTICAST_TYPE_SHIFT) | \ 240 (((_mc_index_) & _SHR_MULTICAST_ID_MASK) << _SHR_MULTICAST_ID_SHIFT)) 241 242 #define _SHR_MULTICAST_WLAN(_mc_index_) \ 243 (((_SHR_MULTICAST_TYPE_WLAN) << _SHR_MULTICAST_TYPE_SHIFT) | \ 244 (((_mc_index_) & _SHR_MULTICAST_ID_MASK) << _SHR_MULTICAST_ID_SHIFT)) 245 246 #define _SHR_MULTICAST_VLAN(_mc_index_) \ 247 (((_SHR_MULTICAST_TYPE_VLAN) << _SHR_MULTICAST_TYPE_SHIFT) | \ 248 (((_mc_index_) & _SHR_MULTICAST_ID_MASK) << _SHR_MULTICAST_ID_SHIFT)) 249 250 #define _SHR_MULTICAST_TRILL(_mc_index_) \ 251 (((_SHR_MULTICAST_TYPE_TRILL) << _SHR_MULTICAST_TYPE_SHIFT) | \ 252 (((_mc_index_) & _SHR_MULTICAST_ID_MASK) << _SHR_MULTICAST_ID_SHIFT)) 253 254 #define _SHR_MULTICAST_NIV(_mc_index_) \ 255 (((_SHR_MULTICAST_TYPE_NIV) << _SHR_MULTICAST_TYPE_SHIFT) | \ 256 (((_mc_index_) & _SHR_MULTICAST_ID_MASK) << _SHR_MULTICAST_ID_SHIFT)) 257 258 #define _SHR_MULTICAST_EGRESS_OBJECT(_mc_index_) \ 259 (((_SHR_MULTICAST_TYPE_EGRESS_OBJECT) << _SHR_MULTICAST_TYPE_SHIFT) | \ 260 (((_mc_index_) & _SHR_MULTICAST_ID_MASK) << _SHR_MULTICAST_ID_SHIFT)) 261 262 #define _SHR_MULTICAST_L2GRE(_mc_index_) \ 263 (((_SHR_MULTICAST_TYPE_L2GRE) << _SHR_MULTICAST_TYPE_SHIFT) | \ 264 (((_mc_index_) & _SHR_MULTICAST_ID_MASK) << _SHR_MULTICAST_ID_SHIFT)) 265 266 #define _SHR_MULTICAST_VXLAN(_mc_index_) \ 267 (((_SHR_MULTICAST_TYPE_VXLAN) << _SHR_MULTICAST_TYPE_SHIFT) | \ 268 (((_mc_index_) & _SHR_MULTICAST_ID_MASK) << _SHR_MULTICAST_ID_SHIFT)) 269 270 #define _SHR_MULTICAST_FLOW(_mc_index_) \ 271 (((_SHR_MULTICAST_TYPE_FLOW) << _SHR_MULTICAST_TYPE_SHIFT) | \ 272 (((_mc_index_) & _SHR_MULTICAST_ID_MASK) << _SHR_MULTICAST_ID_SHIFT)) 273 274 #define _SHR_MULTICAST_PORTS_GROUP(_mc_index_) \ 275 (((_SHR_MULTICAST_TYPE_PORTS_GROUP) << _SHR_MULTICAST_TYPE_SHIFT) | \ 276 (((_mc_index_) & _SHR_MULTICAST_ID_MASK) << _SHR_MULTICAST_ID_SHIFT)) 277 278 #define _SHR_MULTICAST_EXTENDER(_mc_index_) \ 279 (((_SHR_MULTICAST_TYPE_EXTENDER) << _SHR_MULTICAST_TYPE_SHIFT) | \ 280 (((_mc_index_) & _SHR_MULTICAST_ID_MASK) << _SHR_MULTICAST_ID_SHIFT)) 281 282 /* BCM_MULTICAST_TYPE */ 283 #define _SHR_MULTICAST_TYPE(_group_) \ 284 (((_group_) >> _SHR_MULTICAST_TYPE_SHIFT) & _SHR_MULTICAST_TYPE_MASK) 285 286 /* 287 * Multicast replication structure and flags 288 */ 289 typedef struct { /* the structure represents a multicast replication */ 290 uint32 flags; /* information on the replication */ 291 _shr_gport_t port; /* destination */ 292 _shr_if_t encap1; /* first encapsulation. */ 293 _shr_if_t encap2; /* second encapsulation. */ 294 } _shr_multicast_replication_t; 295 296 /* values for the flags field of _shr_multicast_replication_t */ 297 #define _SHR_MUTICAST_REPLICATION_ENCAP2_VALID 1 /* determines if encap2 is used. */ 298 #define _SHR_MUTICAST_REPLICATION_ENCAP1_L3_INTF 2 /* when encap2 is used, determines if encap1 is a routing interface or not. */ 299 300 #endif /* _SHR_MULTICAST_H */