/** * @brief remove a record from the Ethernet database * * @param templateRecord template record used to determine * what record is to be removed * @param updateTrigger port map containing the update triggers * resulting from this update operation * * This function will examine the template record it receives * and attempts to delete a record of the same type and containing * the same keys as the template record. If deletion is successful * and the record type is registered for automatic port updates the * port will also be set in the updateTrigger port map, so that the * client can perform an update of the port. * * @retval IX_ETH_DB_SUCCESS removal was successful * @retval IX_ETH_DB_NO_SUCH_ADDR the record with the given MAC address was not found * @retval IX_ETH_DB_BUSY database busy, cannot remove due to locking * * @internal */ IX_ETH_DB_PUBLIC IxEthDBStatus ixEthDBRemove(MacDescriptor *templateRecord, IxEthDBPortMap updateTrigger) { IxEthDBStatus result; PortInfo *portInfo; TEST_FIXTURE_INCREMENT_DB_CORE_ACCESS_COUNTER; BUSY_RETRY_WITH_RESULT(ixEthDBRemoveHashEntry(&dbHashtable, ixEthDBKeyType[templateRecord->type], templateRecord), result); if (result != IX_ETH_DB_SUCCESS) { return IX_ETH_DB_NO_SUCH_ADDR; /* not found */ } portInfo = &ixEthDBPortInfo[templateRecord->portID]; if (templateRecord->type == IX_ETH_DB_WIFI_RECORD) { /* decrement the wifi records counter when entry is deleted from the database for the port */ portInfo->wifiRecordsCount = portInfo->wifiRecordsCount - 1; } if (templateRecord->type == IX_ETH_DB_FIREWALL_RECORD || templateRecord->type == IX_ETH_DB_MASKED_FIREWALL_RECORD) { /* decrement the firewall records counter when entry is deleted from the database for the port */ portInfo->fwRecordsCount = portInfo->fwRecordsCount - 1; } /* trigger add/remove update if required by type */ if (updateTrigger != NULL &&ixEthDBPortUpdateRequired[templateRecord->type]) { /* add new port to update list */ JOIN_PORT_TO_MAP(updateTrigger, templateRecord->portID); } return IX_ETH_DB_SUCCESS; }
/** * @brief remove a record from the Ethernet database * * @param templateRecord template record used to determine * what record is to be removed * @param updateTrigger port map containing the update triggers * resulting from this update operation * * This function will examine the template record it receives * and attempts to delete a record of the same type and containing * the same keys as the template record. If deletion is successful * and the record type is registered for automatic port updates the * port will also be set in the updateTrigger port map, so that the * client can perform an update of the port. * * @retval IX_ETH_DB_SUCCESS removal was successful * @retval IX_ETH_DB_NO_SUCH_ADDR the record with the given MAC address was not found * @retval IX_ETH_DB_BUSY database busy, cannot remove due to locking * * @internal */ IX_ETH_DB_PUBLIC IxEthDBStatus ixEthDBRemove(MacDescriptor *templateRecord, IxEthDBPortMap updateTrigger) { IxEthDBStatus result; TEST_FIXTURE_INCREMENT_DB_CORE_ACCESS_COUNTER; BUSY_RETRY_WITH_RESULT(ixEthDBRemoveHashEntry(&dbHashtable, ixEthDBKeyType[templateRecord->type], templateRecord), result); if (result != IX_ETH_DB_SUCCESS) { return IX_ETH_DB_NO_SUCH_ADDR; /* not found */ } /* trigger add/remove update if required by type */ if (updateTrigger != NULL &&ixEthDBPortUpdateRequired[templateRecord->type]) { /* add new port to update list */ JOIN_PORT_TO_MAP(updateTrigger, templateRecord->portID); } return IX_ETH_DB_SUCCESS; }
/** * @brief adds a new entry to the Ethernet database * * @param newRecordTemplate address of the record template to use * @param updateTrigger port map containing the update triggers * resulting from this update operation * * Creates a new database entry, populates it with the data * copied from the given template and adds the record to the * database hash table. * It also checks whether the new record type is registered to trigger * automatic updates; if it is, the update trigger will contain the * port on which the record insertion was performed, as well as the * old port in case the addition was a record migration (from one port * to the other). The caller can use the updateTrigger to trigger * automatic updates on the ports changed as a result of this addition. * * @retval IX_ETH_DB_SUCCESS addition successful * @retval IX_ETH_DB_NOMEM insertion failed, no memory left in the mac descriptor memory pool * @retval IX_ETH_DB_BUSY database busy, cannot insert due to locking * * @internal */ IX_ETH_DB_PUBLIC IxEthDBStatus ixEthDBAdd(MacDescriptor *newRecordTemplate, IxEthDBPortMap updateTrigger) { IxEthDBStatus result; MacDescriptor *newDescriptor; IxEthDBPortId originalPortID; HashNode *node = NULL; BUSY_RETRY(ixEthDBSearchHashEntry(&dbHashtable, ixEthDBKeyType[newRecordTemplate->type], newRecordTemplate, &node)); TEST_FIXTURE_INCREMENT_DB_CORE_ACCESS_COUNTER; if (node == NULL) { /* not found, create a new one */ newDescriptor = ixEthDBAllocMacDescriptor(); if (newDescriptor == NULL) { return IX_ETH_DB_NOMEM; /* no memory */ } /* old port does not exist, avoid unnecessary updates */ originalPortID = newRecordTemplate->portID; } else { /* a node with the same key exists, will update node */ newDescriptor = (MacDescriptor *) node->data; /* save original port id */ originalPortID = newDescriptor->portID; } /* copy/update fields into new record */ memcpy(newDescriptor->macAddress, newRecordTemplate->macAddress, sizeof (IxEthDBMacAddr)); memcpy(&newDescriptor->recordData, &newRecordTemplate->recordData, sizeof (IxEthDBRecordData)); newDescriptor->type = newRecordTemplate->type; newDescriptor->portID = newRecordTemplate->portID; newDescriptor->user = newRecordTemplate->user; if (node == NULL) { /* new record, insert into hashtable */ BUSY_RETRY_WITH_RESULT(ixEthDBAddHashEntry(&dbHashtable, newDescriptor), result); if (result != IX_ETH_DB_SUCCESS) { ixEthDBFreeMacDescriptor(newDescriptor); return result; /* insertion failed */ } } if (node != NULL) { /* release access */ ixEthDBReleaseHashNode(node); } /* trigger add/remove update if required by type */ if (updateTrigger != NULL && ixEthDBPortUpdateRequired[newRecordTemplate->type]) { /* add new port to update list */ JOIN_PORT_TO_MAP(updateTrigger, newRecordTemplate->portID); /* check if record has moved, we'll need to update the old port as well */ if (originalPortID != newDescriptor->portID) { JOIN_PORT_TO_MAP(updateTrigger, originalPortID); } } return IX_ETH_DB_SUCCESS; }
/** * @brief displays all the filtering records belonging to a port * * @param portID ID of the port to display * * Note that this function is documented in the main component * header file, IxEthDB.h. * * @warning deprecated, use @ref ixEthDBFilteringDatabaseShowRecords() * instead. Calling this function is equivalent to calling * ixEthDBFilteringDatabaseShowRecords(portID, IX_ETH_DB_FILTERING_RECORD) */ IX_ETH_DB_PUBLIC IxEthDBStatus ixEthDBFilteringDatabaseShow(IxEthDBPortId portID) { IxEthDBStatus local_result; HashIterator iterator; PortInfo *portInfo; UINT32 recordCount = 0; IX_ETH_DB_CHECK_PORT(portID); IX_ETH_DB_CHECK_SINGLE_NPE(portID); portInfo = &ixEthDBPortInfo[portID]; /* display table header */ printf("Ethernet database records for port ID [%d]\n", portID); ixEthDBDependencyPortMapShow(portID, portInfo->dependencyPortMap); if (ixEthDBPortDefinitions[portID].type == IX_ETH_NPE) { printf("NPE updates are %s\n\n", portInfo->updateMethod.updateEnabled ? "enabled" : "disabled"); } else { printf("updates disabled (not an NPE)\n\n"); } printf(" MAC address | Age | Type \n"); printf("___________________________________\n"); /* browse database */ BUSY_RETRY(ixEthDBInitHashIterator(&dbHashtable, &iterator)); while (IS_ITERATOR_VALID(&iterator)) { MacDescriptor *descriptor = (MacDescriptor *) iterator.node->data; if (descriptor->portID == portID && descriptor->type == IX_ETH_DB_FILTERING_RECORD) { recordCount++; /* display entry */ printf(" %02X:%02X:%02X:%02X:%02X:%02X | %5d | %s\n", descriptor->macAddress[0], descriptor->macAddress[1], descriptor->macAddress[2], descriptor->macAddress[3], descriptor->macAddress[4], descriptor->macAddress[5], descriptor->recordData.filteringData.age, descriptor->recordData.filteringData.staticEntry ? "static" : "dynamic"); } /* move to the next record */ BUSY_RETRY_WITH_RESULT(ixEthDBIncrementHashIterator(&dbHashtable, &iterator), local_result); /* debug */ if (local_result == IX_ETH_DB_BUSY) { return IX_ETH_DB_FAIL; } } /* display number of records */ printf("\nFound %d records\n", recordCount); return IX_ETH_DB_SUCCESS; }