/** * @brief matches two database records based on their MAC addresses * * @param untypedReference record to match against * @param untypedEntry record to match * * @return TRUE if the match is successful or FALSE otherwise * * @internal */ IX_ETH_DB_PUBLIC BOOL ixEthDBAddressRecordMatch(void *untypedReference, void *untypedEntry) { MacDescriptor *entry = (MacDescriptor *) untypedEntry; MacDescriptor *reference = (MacDescriptor *) untypedReference; /* check accepted record types */ if ((entry->type & reference->type) == 0) return FALSE; return (ixEthDBAddressCompare((UINT8 *) entry->macAddress, (UINT8 *) reference->macAddress) == 0); }
/** * @brief matches two database records based on their MAC addresses * and VLAN IDs * * @param untypedReference record to match against * @param untypedEntry record to match * * @return TRUE if the match is successful or FALSE otherwise * * @internal */ IX_ETH_DB_PUBLIC BOOL ixEthDBVlanRecordMatch(void *untypedReference, void *untypedEntry) { MacDescriptor *entry = (MacDescriptor *) untypedEntry; MacDescriptor *reference = (MacDescriptor *) untypedReference; /* check accepted record types */ if ((entry->type & reference->type) == 0) return FALSE; return (IX_ETH_DB_GET_VLAN_ID(entry->recordData.filteringVlanData.ieee802_1qTag) == IX_ETH_DB_GET_VLAN_ID(reference->recordData.filteringVlanData.ieee802_1qTag)) && (ixEthDBAddressCompare(entry->macAddress, reference->macAddress) == 0); }
/** * @brief mac descriptor match function * * @param reference mac address (typically an IxEthDBMacAddr pointer) structure * @param entry pointer to a mac descriptor whose key (mac address) is to be * matched against the reference key * * Used by the hash table to retrieve entries. Hashing entries can produce * collisions, i.e. descriptors with different mac addresses and the same * hash value, where this function is used to differentiate entries. * * @retval TRUE if the entry matches the reference key (equal addresses) * @retval FALSE if the entry does not match the reference key * * @internal */ BOOL ixEthDBAddressMatch(void *reference, void *entry) { return (ixEthDBAddressCompare(reference, ((MacDescriptor *) entry)->macAddress) == 0); }
/** * @brief inserts a mac descriptor into an tree * * @param searchTree tree where the insertion is to be performed (may be NULL) * @param descriptor descriptor to insert into tree * * @return the tree root * * @internal */ IX_ETH_DB_PRIVATE MacTreeNode* ixEthDBTreeInsert(MacTreeNode *searchTree, MacDescriptor *descriptor) { MacTreeNode *currentNode = searchTree; MacTreeNode *insertLocation = NULL; MacTreeNode *newNode; INT32 insertPosition = RIGHT; if (descriptor == NULL) { return searchTree; } /* create a new node */ newNode = ixEthDBAllocMacTreeNode(); if (newNode == NULL) { /* out of memory */ ERROR_LOG("Warning: ixEthDBAllocMacTreeNode returned NULL in file %s:%d (out of memory?)\n", __FILE__, __LINE__); ixEthDBFreeMacDescriptor(descriptor); return NULL; } /* populate node */ newNode->descriptor = descriptor; /* an empty initial tree is a special case */ if (searchTree == NULL) { return newNode; } /* get insertion location */ while (insertLocation == NULL) { MacTreeNode *nextNode; /* compare given key with current node key */ insertPosition = ixEthDBAddressCompare(descriptor->macAddress, currentNode->descriptor->macAddress); /* navigate down */ if (insertPosition == RIGHT) { nextNode = currentNode->right; } else if (insertPosition == LEFT) { nextNode = currentNode->left; } else { /* error, duplicate key */ ERROR_LOG("Warning: trapped insertion of a duplicate MAC address in an NPE search tree\n"); /* this will free the MAC descriptor as well */ ixEthDBFreeMacTreeNode(newNode); return searchTree; } /* when we can no longer dive through the tree we found the insertion place */ if (nextNode != NULL) { currentNode = nextNode; } else { insertLocation = currentNode; } } /* insert node */ if (insertPosition == RIGHT) { insertLocation->right = newNode; } else { insertLocation->left = newNode; } return searchTree; }