1 /** 2 * @file IxEthDB_p.h 3 * 4 * @brief Private MAC learning API 5 * 6 * @par 7 * IXP400 SW Release version 2.0 8 * 9 * -- Copyright Notice -- 10 * 11 * @par 12 * Copyright 2001-2005, Intel Corporation. 13 * All rights reserved. 14 * 15 * @par 16 * Redistribution and use in source and binary forms, with or without 17 * modification, are permitted provided that the following conditions 18 * are met: 19 * 1. Redistributions of source code must retain the above copyright 20 * notice, this list of conditions and the following disclaimer. 21 * 2. Redistributions in binary form must reproduce the above copyright 22 * notice, this list of conditions and the following disclaimer in the 23 * documentation and/or other materials provided with the distribution. 24 * 3. Neither the name of the Intel Corporation nor the names of its contributors 25 * may be used to endorse or promote products derived from this software 26 * without specific prior written permission. 27 * 28 * @par 29 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' 30 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 31 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 32 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE 33 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 34 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 35 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 36 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 37 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 38 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 39 * SUCH DAMAGE. 40 * 41 * @par 42 * -- End of Copyright Notice -- 43 */ 44 45 #ifndef IxEthDB_p_H 46 #define IxEthDB_p_H 47 48 #include <IxTypes.h> 49 #include <IxOsal.h> 50 #include <IxEthDB.h> 51 #include <IxNpeMh.h> 52 #include <IxEthDBPortDefs.h> 53 54 #include "IxEthDBMessages_p.h" 55 #include "IxEthDBLog_p.h" 56 57 #if (CPU==SIMSPARCSOLARIS) 58 59 /* when running unit tests intLock() won't protect the event queue so we lock it manually */ 60 #define TEST_FIXTURE_LOCK_EVENT_QUEUE { ixOsalMutexLock(&eventQueueLock, IX_OSAL_WAIT_FOREVER); } 61 #define TEST_FIXTURE_UNLOCK_EVENT_QUEUE { ixOsalMutexUnlock(&eventQueueLock); } 62 63 #else 64 65 #define TEST_FIXTURE_LOCK_EVENT_QUEUE /* nothing */ 66 #define TEST_FIXTURE_UNLOCK_EVENT_QUEUE /* nothing */ 67 68 #endif /* #if(CPU==SIMSPARCSOLARIS) */ 69 70 #ifndef IX_UNIT_TEST 71 72 #define TEST_FIXTURE_INCREMENT_DB_CORE_ACCESS_COUNTER /* nothing */ 73 #define TEST_FIXTURE_MARK_OVERFLOW_EVENT /* nothing */ 74 75 #else 76 77 extern int dbAccessCounter; 78 extern int overflowEvent; 79 80 #define TEST_FIXTURE_INCREMENT_DB_CORE_ACCESS_COUNTER { dbAccessCounter++; } 81 #define TEST_FIXTURE_MARK_OVERFLOW_EVENT { overflowEvent = 1; } 82 83 #endif 84 85 /* code readability markers */ 86 #define __mempool__ /* memory pool marker */ 87 #define __lock__ /* hash write locking marker */ 88 #define __smartpointer__ /* smart pointer marker - warning: use only clone() when duplicating! */ 89 #define __alignment__ /* marker for data used only as alignment zones */ 90 91 /* constants */ 92 #define IX_ETH_DB_NPE_TIMEOUT (100) /* NPE response timeout, in ms */ 93 94 /** 95 * number of hash table buckets 96 * it should be at least 8x the predicted number of entries for performance 97 * each bucket needs 8 bytes 98 */ 99 #define NUM_BUCKETS (8192) 100 101 /** 102 * number of hash table buckets to preload when incrementing bucket iterator 103 * = two cache lines 104 */ 105 #define IX_ETHDB_CACHE_LINE_AHEAD (2) 106 107 #define IX_ETHDB_BUCKETPTR_AHEAD ((IX_ETHDB_CACHE_LINE_AHEAD * IX_OSAL_CACHE_LINE_SIZE)/sizeof(void *)) 108 109 #define IX_ETHDB_BUCKET_INDEX_MASK (((IX_OSAL_CACHE_LINE_SIZE)/sizeof(void *)) - 1) 110 111 /* locks */ 112 #define MAX_LOCKS (20) /**< maximum number of locks used simultaneously, do not tamper with */ 113 114 /* learning tree constants */ 115 #define INITIAL_ELT_SIZE (8) /**< initial byte size of tree (empty unused root size) */ 116 #define MAX_ELT_SIZE (512) /**< maximum number of entries (includes unused root) */ 117 #define MAX_GW_SIZE (32) /**< maximum number of gateway entries (including unused root) */ 118 #define MAX_FW_SIZE (32) /**< maximum number of firewall entries (including unused root) */ 119 #define ELT_ENTRY_SIZE (8) /**< entry size, in bytes */ 120 #define ELT_ROOT_OFFSET (ELT_ENTRY_SIZE) /**< tree root offset, in bytes - node preceeding root is unused */ 121 #define FULL_ELT_BYTE_SIZE (MAX_ELT_SIZE * ELT_ENTRY_SIZE) /**< full size of tree, in bytes, including unused root */ 122 #define FULL_GW_BYTE_SIZE (MAX_GW_SIZE * ELT_ENTRY_SIZE) /**< full size of gateway list, in bytes, including unused root */ 123 #define FULL_FW_BYTE_SIZE (MAX_FW_SIZE * ELT_ENTRY_SIZE) /**< full size of firewall table, in bytes, including unused root */ 124 125 /* maximum size of the VLAN table: 126 * 4096 bits (one per VLAN) 127 * 8 bits in one byte 128 * interleaved VLAN membership and VLAN TTI (*2) */ 129 #define FULL_VLAN_BYTE_SIZE (4096 / 8 * 2) 130 131 /* upper 9 bits used as set index, lower 3 bits as byte index */ 132 #define VLAN_SET_OFFSET(vlanID) ((vlanID) >> 3) 133 #define VLAN_SET_MASK(vlanID) (0x7 - ((vlanID) & 0x7)) 134 135 /* Update zone definitions */ 136 #define NPE_TREE_MEM_SIZE (4096) /* ((511 entries + 1 unused root) * 8 bytes/entry) */ 137 138 /* check the above value, we rely on 4k */ 139 #if NPE_TREE_MEM_SIZE != 4096 140 #error NPE_TREE_MEM_SIZE is not defined to 4096 bytes! 141 #endif 142 143 /* Size Filtering limits (Jumbo frame filtering) */ 144 #define IX_ETHDB_MAX_FRAME_SIZE 65535 /* other ports than NPE ports */ 145 #define IX_ETHDB_MIN_FRAME_SIZE 1 /* other ports than NPE ports */ 146 #define IX_ETHDB_MAX_NPE_FRAME_SIZE 16320 /* NPE ports firmware limit */ 147 #define IX_ETHDB_MIN_NPE_FRAME_SIZE 1 /* NPE ports firmware limit */ 148 #define IX_ETHDB_DEFAULT_FRAME_SIZE 1522 149 150 /* memory management pool sizes */ 151 152 /* 153 * Note: 154 * 155 * NODE_POOL_SIZE controls the maximum number of elements in the database at any one time. 156 * It should be large enough to cover all the search trees of all the ports simultaneously. 157 * 158 * MAC_POOL_SIZE should be higher than NODE_POOL_SIZE by at least the total number of MAC addresses 159 * possible to be held at any time in all the ports. 160 * 161 * TREE_POOL_SIZE should follow the same guideline as for MAC_POOL_SIZE. 162 * 163 * The database structure described here (2000/4000/4000) is enough for two NPEs holding at most 511 164 * entries each plus one PCI NIC holding at most 900 entries. 165 */ 166 167 #define NODE_POOL_SIZE (2000) /**< number of HashNode objects - also master number of elements in the database; each entry has 16 bytes */ 168 #define MAC_POOL_SIZE (4000) /**< number of MacDescriptor objects; each entry has 28 bytes */ 169 #define TREE_POOL_SIZE (4000) /**< number of MacTreeNode objects; each entry has 16 bytes */ 170 171 /* retry policies */ 172 #define BUSY_RETRY_ENABLED (TRUE) /**< if set to TRUE the API will retry automatically calls returning BUSY */ 173 #define FOREVER_RETRY (TRUE) /**< if set to TRUE the API will retry forever BUSY calls */ 174 #define MAX_RETRIES (400) /**< upper retry limit - used only when FOREVER_RETRY is FALSE */ 175 #define BUSY_RETRY_YIELD (5) /**< ticks to yield for every failed retry */ 176 177 /* event management */ 178 #define EVENT_QUEUE_SIZE (500) /**< size of the sink collecting events from the Message Handler FIFO */ 179 #define EVENT_PROCESSING_LIMIT (100) /**< batch processing control size (how many events are extracted from the queue at once) */ 180 181 /* MAC descriptors */ 182 #define STATIC_ENTRY (TRUE) 183 #define DYNAMIC_ENTRY (FALSE) 184 185 /* age reset on next maintenance - incrementing by 1 will reset to 0 */ 186 #define AGE_RESET (0xFFFFFFFF) 187 188 /* dependency maps */ 189 #define EMPTY_DEPENDENCY_MAP (0) 190 191 /* trees */ 192 #define RIGHT (1) 193 #define LEFT (-1) 194 195 /* macros */ 196 #define IX_ETH_DB_CHECK_PORT_EXISTS(portID) \ 197 { \ 198 if ((portID) >= IX_ETH_DB_NUMBER_OF_PORTS) \ 199 { \ 200 return IX_ETH_DB_INVALID_PORT; \ 201 } \ 202 } 203 204 #define IX_ETH_DB_CHECK_PORT_INITIALIZED(portID) \ 205 { \ 206 if ((portID) >= IX_ETH_DB_NUMBER_OF_PORTS) \ 207 { \ 208 return IX_ETH_DB_INVALID_PORT; \ 209 } \ 210 else \ 211 { \ 212 if (!ixEthDBPortInfo[portID].initialized) \ 213 { \ 214 return IX_ETH_DB_PORT_UNINITIALIZED; \ 215 } \ 216 } \ 217 } 218 219 /* single NPE check */ 220 #define IX_ETH_DB_CHECK_SINGLE_NPE(portID) \ 221 if (ixEthDBSingleEthNpeCheck(portID) != IX_ETH_DB_SUCCESS) \ 222 { \ 223 WARNING_LOG("EthDB: port ID %d is unavailable\n",(UINT32) portID); \ 224 \ 225 return IX_ETH_DB_INVALID_PORT; \ 226 } 227 228 /* feature check */ 229 #define IX_ETH_DB_CHECK_FEATURE(portID, feature) \ 230 if ((ixEthDBPortInfo[portID].featureStatus & feature) == 0) \ 231 { \ 232 return IX_ETH_DB_FEATURE_UNAVAILABLE; \ 233 } 234 235 /* busy retrying */ 236 #define BUSY_RETRY(functionCall) \ 237 { \ 238 UINT32 retries = 0; \ 239 IxEthDBStatus br_result; \ 240 \ 241 while ((br_result = functionCall) == IX_ETH_DB_BUSY \ 242 && BUSY_RETRY_ENABLED && (FOREVER_RETRY || ++retries < MAX_RETRIES)) { ixOsalSleep(BUSY_RETRY_YIELD); }; \ 243 \ 244 if ((!FOREVER_RETRY && retries == MAX_RETRIES) || (br_result == IX_ETH_DB_FAIL)) \ 245 {\ 246 ERROR_LOG("Ethernet Learning Database Error: BUSY_RETRY failed at %s:%d\n", __FILE__, __LINE__); \ 247 }\ 248 } 249 250 #define BUSY_RETRY_WITH_RESULT(functionCall, brwr_result) \ 251 { \ 252 UINT32 retries = 0; \ 253 \ 254 while ((brwr_result = functionCall) == IX_ETH_DB_BUSY \ 255 && BUSY_RETRY_ENABLED && (FOREVER_RETRY || ++retries < MAX_RETRIES)) { ixOsalSleep(BUSY_RETRY_YIELD); }; \ 256 \ 257 if ((!FOREVER_RETRY && retries == MAX_RETRIES) || (brwr_result == IX_ETH_DB_FAIL)) \ 258 {\ 259 ERROR_LOG("Ethernet Learning Database Error: BUSY_RETRY_WITH_RESULT failed at %s:%d\n", __FILE__, __LINE__); \ 260 }\ 261 } 262 263 /* iterators */ 264 #define IS_ITERATOR_VALID(iteratorPtr) ((iteratorPtr)->node != NULL) 265 266 /* dependency port maps */ 267 268 /* Warning: if port indexing starts from 1 replace (portID) with (portID - 1) in DEPENDENCY_MAP (and make sure IX_ETH_DB_NUMBER_OF_PORTS is big enough) */ 269 270 /* gives an empty dependency map */ 271 #define SET_EMPTY_DEPENDENCY_MAP(map) { int i = 0; for (; i < 32 ; i++) map[i] = 0; } 272 273 #define IS_EMPTY_DEPENDENCY_MAP(result, map) { int i = 0 ; result = TRUE; for (; i < 32 ; i++) if (map[i] != 0) { result = FALSE; break; }} 274 275 /** 276 * gives a map consisting only of 'portID' 277 */ 278 #define SET_DEPENDENCY_MAP(map, portID) {SET_EMPTY_DEPENDENCY_MAP(map); map[portID >> 3] = 1 << (portID & 0x7);} 279 280 /** 281 * gives a map resulting from joining map1 and map2 282 */ 283 #define JOIN_MAPS(map, map1, map2) { int i = 0; for (; i < 32 ; i++) map[i] = map1[i] | map2[i]; } 284 285 /** 286 * gives the map resulting from joining portID and map 287 */ 288 #define JOIN_PORT_TO_MAP(map, portID) { map[portID >> 3] |= 1 << (portID & 0x7); } 289 290 /** 291 * gives the map resulting from excluding portID from map 292 */ 293 #define EXCLUDE_PORT_FROM_MAP(map, portID) { map[portID >> 3] &= ~(1 << (portID & 0x7); } 294 295 /** 296 * returns TRUE if map1 is a subset of map2 and FALSE otherwise 297 */ 298 #define IS_MAP_SUBSET(result, map1, map2) { int i = 0; result = TRUE; for (; i < 32 ; i++) if ((map1[i] | map2[i]) != map2[i]) result = FALSE; } 299 300 /** 301 * returns TRUE is portID is part of map and FALSE otherwise 302 */ 303 #define IS_PORT_INCLUDED(portID, map) ((map[portID >> 3] & (1 << (portID & 0x7))) != 0) 304 305 /** 306 * returns the difference between map1 and map2 (ports included in map1 and not included in map2) 307 */ 308 #define DIFF_MAPS(map, map1, map2) { int i = 0; for (; i < 32 ; i++) map[i] = map1[i] ^ (map1[i] & map2[i]); } 309 310 /** 311 * returns TRUE if the maps collide (have at least one port in common) and FALSE otherwise 312 */ 313 #define MAPS_COLLIDE(result, map1, map2) { int i = 0; result = FALSE; for (; i < 32 ; i++) if ((map1[i] & map2[i]) != 0) result = TRUE; } 314 315 /* size (number of ports) of a dependency map */ 316 #define GET_MAP_SIZE(map, size) { int i = 0, b = 0; size = 0; for (; i < 32 ; i++) { char y = map[i]; for (; b < 8 && (y >>= 1); b++) size += (y & 1); }} 317 318 /* copy map2 into map1 */ 319 #define COPY_DEPENDENCY_MAP(map1, map2) { memcpy (map1, map2, sizeof (map1)); } 320 321 /* definition of a port map size/port number which cannot be reached (we support at most 32 ports) */ 322 #define MAX_PORT_SIZE (0xFF) 323 #define MAX_PORT_NUMBER (0xFF) 324 325 #define IX_ETH_DB_CHECK_REFERENCE(ptr) { if ((ptr) == NULL) { return IX_ETH_DB_INVALID_ARG; } } 326 #define IX_ETH_DB_CHECK_MAP(portID, map) { if (!IS_PORT_INCLUDED(portID, map)) { return IX_ETH_DB_INVALID_ARG; } } 327 328 /* event queue macros */ 329 #define EVENT_QUEUE_WRAP(offset) ((offset) >= EVENT_QUEUE_SIZE ? (offset) - EVENT_QUEUE_SIZE : (offset)) 330 331 #define CAN_ENQUEUE(eventQueuePtr) ((eventQueuePtr)->length < EVENT_QUEUE_SIZE) 332 333 #define QUEUE_HEAD(eventQueuePtr) (&(eventQueuePtr)->queue[EVENT_QUEUE_WRAP((eventQueuePtr)->base + (eventQueuePtr)->length)]) 334 335 #define QUEUE_TAIL(eventQueuePtr) (&(eventQueuePtr)->queue[(eventQueuePtr)->base]) 336 337 #define PUSH_UPDATE_QUEUE(eventQueuePtr) { (eventQueuePtr)->length++; } 338 339 #define SHIFT_UPDATE_QUEUE(eventQueuePtr) \ 340 { \ 341 (eventQueuePtr)->base = EVENT_QUEUE_WRAP((eventQueuePtr)->base + 1); \ 342 (eventQueuePtr)->length--; \ 343 } 344 345 #define RESET_QUEUE(eventQueuePtr) \ 346 { \ 347 (eventQueuePtr)->base = 0; \ 348 (eventQueuePtr)->length = 0; \ 349 } 350 351 /* node stack macros - used to browse a tree without using a recursive function */ 352 #define NODE_STACK_INIT(stack) { (stack)->nodeCount = 0; } 353 #define NODE_STACK_PUSH(stack, node, offset) { (stack)->nodes[(stack)->nodeCount] = (node); (stack)->offsets[(stack)->nodeCount++] = (offset); } 354 #define NODE_STACK_POP(stack, node, offset) { (node) = (stack)->nodes[--(stack)->nodeCount]; offset = (stack)->offsets[(stack)->nodeCount]; } 355 #define NODE_STACK_NONEMPTY(stack) ((stack)->nodeCount != 0) 356 357 #ifndef IX_NDEBUG 358 #define IX_ETH_DB_NPE_MSG_HISTORY_DEPTH (100) 359 #define LOG_NPE_MSG(msg) \ 360 do { \ 361 UINT32 npeMsgHistoryIndex = (npeMsgHistoryLen++) % IX_ETH_DB_NPE_MSG_HISTORY_DEPTH; \ 362 npeMsgHistory[npeMsgHistoryIndex][0] = msg.data[0]; \ 363 npeMsgHistory[npeMsgHistoryIndex][1] = msg.data[1]; \ 364 } while (0); 365 #else 366 #define LOG_NPE_MSG() /* nothing */ 367 #endif 368 369 /* ----------- Data -------------- */ 370 371 /* typedefs */ 372 373 typedef UINT32 (*HashFunction)(void *entity); 374 typedef BOOL (*MatchFunction)(void *reference, void *entry); 375 typedef void (*FreeFunction)(void *entry); 376 377 /** 378 * basic component of a hash table 379 */ 380 typedef struct HashNode_t 381 { 382 void *data; /**< specific data */ 383 struct HashNode_t *next; /**< used for bucket chaining */ 384 385 __mempool__ struct HashNode_t *nextFree; /**< memory pool management */ 386 387 __lock__ IxOsalFastMutex lock; /**< node lock */ 388 } HashNode; 389 390 /** 391 * @brief hash table iterator definition 392 * 393 * an iterator is an object which can be used 394 * to browse a hash table 395 */ 396 typedef struct 397 { 398 UINT32 bucketIndex; /**< index of the currently iterated bucket */ 399 HashNode *previousNode; /**< reference to the previously iterated node within the current bucket */ 400 HashNode *node; /**< reference to the currently iterated node */ 401 } HashIterator; 402 403 /** 404 * definition of a MAC descriptor (a database record) 405 */ 406 407 typedef enum 408 { 409 IX_ETH_DB_WIFI_AP_TO_STA = 0x0, 410 IX_ETH_DB_WIFI_AP_TO_AP = 0x1 411 } IxEthDBWiFiRecordType; 412 413 typedef union 414 { 415 struct 416 { 417 UINT32 age; 418 BOOL staticEntry; /**< TRUE if this address is static (doesn't age) */ 419 } filteringData; 420 421 struct 422 { 423 UINT32 age; 424 BOOL staticEntry; 425 UINT32 ieee802_1qTag; 426 } filteringVlanData; 427 428 struct 429 { 430 IxEthDBWiFiRecordType type; /**< AP_TO_AP (0x1) or AP_TO_STA (0x0) */ 431 UINT32 gwAddressIndex; /**< used only when linearizing the entries for NPE usage */ 432 UINT8 gwMacAddress[IX_IEEE803_MAC_ADDRESS_SIZE]; 433 434 __alignment__ UINT8 reserved2[2]; 435 } wifiData; 436 } IxEthDBRecordData; 437 438 typedef struct MacDescriptor_t 439 { 440 UINT8 macAddress[IX_IEEE803_MAC_ADDRESS_SIZE]; 441 442 __alignment__ UINT8 reserved1[2]; 443 444 UINT32 portID; 445 IxEthDBRecordType type; 446 IxEthDBRecordData recordData; 447 448 /* used for internal operations, such as NPE linearization */ 449 void *internal; 450 451 /* custom user data */ 452 void *user; 453 454 __mempool__ struct MacDescriptor_t *nextFree; /**< memory pool management */ 455 __smartpointer__ UINT32 refCount; /**< smart pointer reference counter */ 456 } MacDescriptor; 457 458 /** 459 * hash table definition 460 */ 461 typedef struct 462 { 463 HashNode *hashBuckets[NUM_BUCKETS]; 464 UINT32 numBuckets; 465 466 __lock__ IxOsalFastMutex bucketLocks[NUM_BUCKETS]; 467 468 HashFunction entryHashFunction; 469 MatchFunction *matchFunctions; 470 FreeFunction freeFunction; 471 } HashTable; 472 473 typedef enum 474 { 475 IX_ETH_DB_MAC_KEY = 1, 476 IX_ETH_DB_MAC_PORT_KEY = 2, 477 IX_ETH_DB_MAC_VLAN_KEY = 3, 478 IX_ETH_DB_MAX_KEY_INDEX = 3 479 } IxEthDBSearchKeyType; 480 481 typedef struct MacTreeNode_t 482 { 483 __smartpointer__ MacDescriptor *descriptor; 484 struct MacTreeNode_t *left, *right; 485 486 __mempool__ struct MacTreeNode_t *nextFree; 487 } MacTreeNode; 488 489 typedef IxEthDBStatus (*IxEthDBPortUpdateHandler)(IxEthDBPortId portID, IxEthDBRecordType type); 490 491 typedef void (*IxEthDBNoteWriteFn)(void *address, MacTreeNode *node); 492 493 typedef struct 494 { 495 BOOL updateEnabled; /**< TRUE if updates are enabled for port */ 496 BOOL userControlled; /**< TRUE if the user has manually used ixEthDBPortUpdateEnableSet */ 497 BOOL treeInitialized; /**< TRUE if the NPE has received an initial tree */ 498 IxEthDBPortUpdateHandler updateHandler; /**< port update handler routine */ 499 void *npeUpdateZone; /**< port update memory zone */ 500 void *npeGwUpdateZone; /**< port update memory zone for gateways */ 501 void *vlanUpdateZone; /**< port update memory zone for VLAN tables */ 502 MacTreeNode *searchTree; /**< internal search tree, in MacTreeNode representation */ 503 BOOL searchTreePendingWrite; /**< TRUE if searchTree holds a tree pending write to the port */ 504 } PortUpdateMethod; 505 506 typedef struct 507 { 508 IxEthDBPortId portID; /**< port ID */ 509 BOOL enabled; /**< TRUE if the port is enabled */ 510 BOOL agingEnabled; /**< TRUE if aging on this port is enabled */ 511 BOOL initialized; 512 IxEthDBPortMap dependencyPortMap; /**< dependency port map for this port */ 513 PortUpdateMethod updateMethod; /**< update method structure */ 514 BOOL macAddressUploaded; /**< TRUE if the MAC address was uploaded into the port */ 515 UINT32 maxRxFrameSize; /**< maximum Rx frame size for this port */ 516 UINT32 maxTxFrameSize; /**< maximum Rx frame size for this port */ 517 518 UINT8 bbsid[6]; 519 __alignment__ UINT8 reserved[2]; 520 UINT32 frameControlDurationID; /**< Frame Control - Duration/ID WiFi control */ 521 522 IxEthDBVlanTag vlanTag; /**< default VLAN tag for port */ 523 IxEthDBPriorityTable priorityTable; /**< QoS <=> internal priority mapping */ 524 IxEthDBVlanSet vlanMembership; 525 IxEthDBVlanSet transmitTaggingInfo; 526 IxEthDBFrameFilter frameFilter; 527 IxEthDBTaggingAction taggingAction; 528 529 UINT32 npeFrameFilter; 530 UINT32 npeTaggingAction; 531 532 IxEthDBFirewallMode firewallMode; 533 BOOL srcAddressFilterEnabled; 534 535 BOOL stpBlocked; 536 537 IxEthDBFeature featureCapability; 538 IxEthDBFeature featureStatus; 539 540 UINT32 ixEthDBTrafficClassAQMAssignments[IX_IEEE802_1Q_QOS_PRIORITY_COUNT]; 541 542 UINT32 ixEthDBTrafficClassCount; 543 544 UINT32 ixEthDBTrafficClassAvailable; 545 546 547 548 __lock__ IxOsalMutex npeAckLock; 549 } PortInfo; 550 551 /* list of port information structures indexed on port Ids */ 552 extern IX_ETH_DB_PUBLIC PortInfo ixEthDBPortInfo[IX_ETH_DB_NUMBER_OF_PORTS]; 553 554 typedef enum 555 { 556 IX_ETH_DB_ADD_FILTERING_RECORD = 0xFF0001, 557 IX_ETH_DB_REMOVE_FILTERING_RECORD = 0xFF0002 558 } PortEventType; 559 560 typedef struct 561 { 562 UINT32 eventType; 563 IxEthDBPortId portID; 564 IxEthDBMacAddr macAddr; 565 BOOL staticEntry; 566 } PortEvent; 567 568 typedef struct 569 { 570 PortEvent queue[EVENT_QUEUE_SIZE]; 571 UINT32 base; 572 UINT32 length; 573 } PortEventQueue; 574 575 typedef struct 576 { 577 IxEthDBPortId portID; /**< originating port */ 578 MacDescriptor *macDescriptors[MAX_ELT_SIZE]; /**< addresses to be synced into db */ 579 UINT32 addressCount; /**< number of addresses */ 580 } TreeSyncInfo; 581 582 typedef struct 583 { 584 MacTreeNode *nodes[MAX_ELT_SIZE]; 585 UINT32 offsets[MAX_ELT_SIZE]; 586 UINT32 nodeCount; 587 } MacTreeNodeStack; 588 589 /* Prototypes */ 590 591 /* ----------- Memory management -------------- */ 592 593 IX_ETH_DB_PUBLIC void ixEthDBInitMemoryPools(void); 594 595 IX_ETH_DB_PUBLIC HashNode* ixEthDBAllocHashNode(void); 596 IX_ETH_DB_PUBLIC void ixEthDBFreeHashNode(HashNode *); 597 598 IX_ETH_DB_PUBLIC __smartpointer__ MacDescriptor* ixEthDBAllocMacDescriptor(void); 599 IX_ETH_DB_PUBLIC __smartpointer__ MacDescriptor* ixEthDBCloneMacDescriptor(MacDescriptor *macDescriptor); 600 IX_ETH_DB_PUBLIC __smartpointer__ void ixEthDBFreeMacDescriptor(MacDescriptor *); 601 602 IX_ETH_DB_PUBLIC __smartpointer__ MacTreeNode* ixEthDBAllocMacTreeNode(void); 603 IX_ETH_DB_PUBLIC __smartpointer__ MacTreeNode* ixEthDBCloneMacTreeNode(MacTreeNode *); 604 IX_ETH_DB_PUBLIC __smartpointer__ void ixEthDBFreeMacTreeNode(MacTreeNode *); 605 606 IX_ETH_DB_PUBLIC void ixEthDBPoolFreeMacTreeNode(MacTreeNode *); 607 IX_ETH_DB_PUBLIC UINT32 ixEthDBSearchTreeUsageGet(MacTreeNode *tree); 608 IX_ETH_DB_PUBLIC int ixEthDBShowMemoryStatus(void); 609 610 /* Hash Table */ 611 IX_ETH_DB_PUBLIC void ixEthDBInitHash(HashTable *hashTable, UINT32 numBuckets, HashFunction entryHashFunction, MatchFunction *matchFunctions, FreeFunction freeFunction); 612 613 IX_ETH_DB_PUBLIC IxEthDBStatus ixEthDBAddHashEntry(HashTable *hashTable, void *entry); 614 IX_ETH_DB_PUBLIC IxEthDBStatus ixEthDBRemoveHashEntry(HashTable *hashTable, int keyType, void *reference); 615 IX_ETH_DB_PUBLIC IxEthDBStatus ixEthDBSearchHashEntry(HashTable *hashTable, int keyType, void *reference, HashNode **searchResult); 616 IX_ETH_DB_PUBLIC IxEthDBStatus ixEthDBPeekHashEntry(HashTable *hashTable, int keyType, void *reference); 617 IX_ETH_DB_PUBLIC void ixEthDBReleaseHashNode(HashNode *node); 618 619 IX_ETH_DB_PUBLIC IxEthDBStatus ixEthDBInitHashIterator(HashTable *hashTable, HashIterator *iterator); 620 IX_ETH_DB_PUBLIC IxEthDBStatus ixEthDBIncrementHashIterator(HashTable *hashTable, HashIterator *iterator); 621 IX_ETH_DB_PUBLIC IxEthDBStatus ixEthDBRemoveEntryAtHashIterator(HashTable *hashTable, HashIterator *iterator); 622 IX_ETH_DB_PUBLIC void ixEthDBReleaseHashIterator(HashIterator *iterator); 623 624 /* API Support */ 625 IX_ETH_DB_PUBLIC IxEthDBStatus ixEthDBPortAddressSet(IxEthDBPortId portID, IxEthDBMacAddr *macAddr); 626 IX_ETH_DB_PUBLIC void ixEthDBMaximumFrameSizeAckCallback(IxNpeMhNpeId npeID, IxNpeMhMessage msg); 627 628 /* DB Core functions */ 629 IX_ETH_DB_PUBLIC IxEthDBStatus ixEthDBInit(void); 630 IX_ETH_DB_PUBLIC IxEthDBStatus ixEthDBAdd(MacDescriptor *newRecordTemplate, IxEthDBPortMap updateTrigger); 631 IX_ETH_DB_PUBLIC IxEthDBStatus ixEthDBRemove(MacDescriptor *templateRecord, IxEthDBPortMap updateTrigger); 632 IX_ETH_DB_PUBLIC HashNode* ixEthDBSearch(IxEthDBMacAddr *macAddress, IxEthDBRecordType typeFilter); 633 IX_ETH_DB_PUBLIC IxEthDBStatus ixEthDBPeek(IxEthDBMacAddr *macAddress, IxEthDBRecordType typeFilter); 634 635 /* Learning support */ 636 IX_ETH_DB_PUBLIC UINT32 ixEthDBAddressCompare(UINT8 *mac1, UINT8 *mac2); 637 IX_ETH_DB_PUBLIC BOOL ixEthDBAddressMatch(void *reference, void *entry); 638 IX_ETH_DB_PUBLIC UINT32 ixEthDBEntryXORHash(void *macDescriptor); 639 IX_ETH_DB_PUBLIC UINT32 ixEthDBKeyXORHash(void *macAddress); 640 641 /* Port updates */ 642 IX_ETH_DB_PUBLIC IxEthDBStatus ixEthDBNPEUpdateHandler(IxEthDBPortId portID, IxEthDBRecordType type); 643 IX_ETH_DB_PUBLIC void ixEthDBUpdatePortLearningTrees(IxEthDBPortMap triggerPorts); 644 IX_ETH_DB_PUBLIC void ixEthDBNPEAccessRequest(IxEthDBPortId portID); 645 IX_ETH_DB_PUBLIC void ixEthDBUpdateLock(void); 646 IX_ETH_DB_PUBLIC void ixEthDBUpdateUnlock(void); 647 IX_ETH_DB_PUBLIC MacTreeNode* ixEthDBQuery(MacTreeNode *searchTree, IxEthDBPortMap query, IxEthDBRecordType recordFilter, UINT32 maximumEntries); 648 IX_ETH_DB_PUBLIC IxEthDBStatus ixEthDBFirewallUpdate(IxEthDBPortId portID, void *address, UINT32 epDelta); 649 650 /* Init/unload */ 651 IX_ETH_DB_PUBLIC void ixEthDBPortSetAckCallback(IxNpeMhNpeId npeID, IxNpeMhMessage msg); 652 IX_ETH_DB_PUBLIC IxEthDBStatus ixEthDBEventProcessorInit(void); 653 IX_ETH_DB_PUBLIC void ixEthDBPortInit(IxEthDBPortId portID); 654 IX_ETH_DB_PUBLIC IxEthDBStatus ixEthDBPortEnable(IxEthDBPortId portID); 655 IX_ETH_DB_PUBLIC IxEthDBStatus ixEthDBPortDisable(IxEthDBPortId portID); 656 IX_ETH_DB_PUBLIC void ixEthDBNPEUpdateAreasInit(void); 657 IX_ETH_DB_PUBLIC UINT32 ixEthDBMatchMethodsRegister(MatchFunction *matchFunctions); 658 IX_ETH_DB_PUBLIC UINT32 ixEthDBRecordSerializeMethodsRegister(void); 659 IX_ETH_DB_PUBLIC UINT32 ixEthDBUpdateTypeRegister(BOOL *typeArray); 660 IX_ETH_DB_PUBLIC void ixEthDBNPEUpdateAreasUnload(void); 661 IX_ETH_DB_PUBLIC void ixEthDBFeatureCapabilityScan(void); 662 IX_ETH_DB_PUBLIC UINT32 ixEthDBKeyTypeRegister(UINT32 *keyType); 663 664 /* Event processing */ 665 IX_ETH_DB_PUBLIC IxEthDBStatus ixEthDBDefaultEventCallbackEnable(IxEthDBPortId portID, BOOL enable); 666 IX_ETH_DB_PUBLIC IxEthDBStatus ixEthDBTriggerAddPortUpdate(IxEthDBMacAddr *macAddr, IxEthDBPortId portID, BOOL staticEntry); 667 IX_ETH_DB_PUBLIC IxEthDBStatus ixEthDBTriggerRemovePortUpdate(IxEthDBMacAddr *macAddr, IxEthDBPortId portID); 668 IX_ETH_DB_PUBLIC void ixEthDBNPEEventCallback(IxNpeMhNpeId npeID, IxNpeMhMessage msg); 669 670 /* NPE adaptor */ 671 IX_ETH_DB_PUBLIC void ixEthDBGetMacDatabaseCbk(IxNpeMhNpeId npeID, IxNpeMhMessage msg); 672 IX_ETH_DB_PUBLIC void ixEthDBNpeMsgAck(IxNpeMhNpeId npeID, IxNpeMhMessage msg); 673 IX_ETH_DB_PUBLIC void ixEthDBNPESyncScan(IxEthDBPortId portID, void *eltBaseAddress, UINT32 eltSize); 674 IX_ETH_DB_PUBLIC void ixEthDBNPETreeWrite(IxEthDBRecordType type, UINT32 totalSize, void *baseAddress, MacTreeNode *tree, UINT32 *blocks, UINT32 *startIndex); 675 IX_ETH_DB_PUBLIC void ixEthDBNPEGatewayNodeWrite(void *address, MacTreeNode *node); 676 677 /* Other public API functions */ 678 IX_ETH_DB_PUBLIC IxEthDBStatus ixEthDBStartLearningFunction(void); 679 IX_ETH_DB_PUBLIC IxEthDBStatus ixEthDBStopLearningFunction(void); 680 IX_ETH_DB_PUBLIC IxEthDBStatus ixEthDBPortUpdateEnableSet(IxEthDBPortId portID, BOOL enableUpdate); 681 682 /* Maximum Tx/Rx public functions */ 683 IX_ETH_DB_PUBLIC IxEthDBStatus ixEthDBFilteringPortMaximumRxFrameSizeSet(IxEthDBPortId portID, UINT32 maximumRxFrameSize); 684 IX_ETH_DB_PUBLIC IxEthDBStatus ixEthDBFilteringPortMaximumTxFrameSizeSet(IxEthDBPortId portID, UINT32 maximumTxFrameSize); 685 686 /* VLAN-related */ 687 IX_ETH_DB_PUBLIC IxEthDBStatus ixEthDBPortVlanTableSet(IxEthDBPortId portID, IxEthDBVlanSet portVlanTable, IxEthDBVlanSet vlanSet); 688 689 /* Record search */ 690 IX_ETH_DB_PUBLIC BOOL ixEthDBAddressRecordMatch(void *untypedReference, void *untypedEntry); 691 IX_ETH_DB_PUBLIC BOOL ixEthDBVlanRecordMatch(void *untypedReference, void *untypedEntry); 692 IX_ETH_DB_PUBLIC BOOL ixEthDBPortRecordMatch(void *untypedReference, void *untypedEntry); 693 IX_ETH_DB_PUBLIC BOOL ixEthDBNullMatch(void *reference, void *entry); 694 IX_ETH_DB_PUBLIC HashNode* ixEthDBPortSearch(IxEthDBMacAddr *macAddress, IxEthDBPortId portID, IxEthDBRecordType typeFilter); 695 IX_ETH_DB_PUBLIC HashNode* ixEthDBVlanSearch(IxEthDBMacAddr *macAddress, IxEthDBVlanId vlanID, IxEthDBRecordType typeFilter); 696 697 /* Utilities */ 698 IX_ETH_DB_PUBLIC const char* mac2string(const unsigned char *mac); 699 IX_ETH_DB_PUBLIC void showHashInfo(void); 700 IX_ETH_DB_PUBLIC int ixEthDBAnalyzeHash(void); 701 IX_ETH_DB_PUBLIC const char* errorString(IxEthDBStatus error); 702 IX_ETH_DB_PUBLIC int numHashElements(void); 703 IX_ETH_DB_PUBLIC void zapHashtable(void); 704 IX_ETH_DB_PUBLIC BOOL ixEthDBCheckSingleBitValue(UINT32 value); 705 706 /* Single Eth NPE Check */ 707 IX_ETH_DB_PUBLIC IxEthDBStatus ixEthDBSingleEthNpeCheck(IxEthDBPortId portId); 708 709 #endif /* IxEthDB_p_H */ 710 711