IX_ETH_DB_PUBLIC IxEthDBStatus ixEthDBFilteringPortSearch(IxEthDBPortId portID, IxEthDBMacAddr *macAddr) { HashNode *searchResult; IxEthDBStatus result = IX_ETH_DB_NO_SUCH_ADDR; IX_ETH_DB_CHECK_PORT(portID); IX_ETH_DB_CHECK_SINGLE_NPE(portID); IX_ETH_DB_CHECK_REFERENCE(macAddr); IX_ETH_DB_CHECK_FEATURE(portID, IX_ETH_DB_LEARNING); searchResult = ixEthDBSearch(macAddr, IX_ETH_DB_ALL_FILTERING_RECORDS); if (searchResult == NULL) { return IX_ETH_DB_NO_SUCH_ADDR; /* not found */ } if (((MacDescriptor *) (searchResult->data))->portID == portID) { result = IX_ETH_DB_SUCCESS; /* address and port match */ } ixEthDBReleaseHashNode(searchResult); return result; }
/** * @brief returns the status of a feature * * @param portID port ID * @param present location to store a boolean value indicating * if the feature is present (TRUE) or not (FALSE) * @param enabled location to store a booleam value indicating * if the feature is present (TRUE) or not (FALSE) * * Note that this function is documented in the main component * header file, IxEthDB.h. * * @return IX_ETH_DB_SUCCESS if the operation completed * successfully or an appropriate error message otherwise */ IX_ETH_DB_PUBLIC IxEthDBStatus ixEthDBFeatureStatusGet(IxEthDBPortId portID, IxEthDBFeature feature, BOOL *present, BOOL *enabled) { PortInfo *portInfo; IX_ETH_DB_CHECK_PORT(portID); IX_ETH_DB_CHECK_REFERENCE(present); IX_ETH_DB_CHECK_REFERENCE(enabled); portInfo = &ixEthDBPortInfo[portID]; *present = (portInfo->featureCapability & feature) != 0; *enabled = (portInfo->featureStatus & feature) != 0; return IX_ETH_DB_SUCCESS; }
/** * @brief returns the capability of a port * * @param portID ID of the port * @param featureSet location to store the port capability in * * This function will save the capability set of the given port * into the given location. Capabilities are bit-ORed, each representing * a bit of the feature set. * * Note that this function is documented in the main component * public header file, IxEthDB.h. * * @return IX_ETH_DB_SUCCESS if the operation completed successfully * or IX_ETH_DB_INVALID_PORT if the given port is invalid */ IX_ETH_DB_PUBLIC IxEthDBStatus ixEthDBFeatureCapabilityGet(IxEthDBPortId portID, IxEthDBFeature *featureSet) { IX_ETH_DB_CHECK_PORT_INITIALIZED(portID); IX_ETH_DB_CHECK_REFERENCE(featureSet); *featureSet = ixEthDBPortInfo[portID].featureCapability; return IX_ETH_DB_SUCCESS; }
IX_ETH_DB_PUBLIC IxEthDBStatus ixEthDBFilteringDynamicEntryProvision(IxEthDBPortId portID, IxEthDBMacAddr *macAddr) { IX_ETH_DB_CHECK_PORT(portID); IX_ETH_DB_CHECK_SINGLE_NPE(portID); IX_ETH_DB_CHECK_REFERENCE(macAddr); IX_ETH_DB_CHECK_FEATURE(portID, IX_ETH_DB_LEARNING); return ixEthDBTriggerAddPortUpdate(macAddr, portID, FALSE); }
/** * @brief sets the MAC address of an NPE port * * @param portID port ID to set the MAC address on * @param macAddr pointer to the 6-byte MAC address * * This function is called by the EthAcc * ixEthAccUnicastMacAddressSet() and should not be * manually invoked unless required by special circumstances. * * @return IX_ETH_DB_SUCCESS if the operation succeeded * or an appropriate error message otherwise */ IX_ETH_DB_PUBLIC IxEthDBStatus ixEthDBPortAddressSet(IxEthDBPortId portID, IxEthDBMacAddr *macAddr) { IxNpeMhMessage message; IxOsalMutex *ackPortAddressLock; IX_STATUS result; /* use this macro instead CHECK_PORT as the port doesn't need to be enabled */ IX_ETH_DB_CHECK_PORT_EXISTS(portID); IX_ETH_DB_CHECK_REFERENCE(macAddr); if (!ixEthDBPortInfo[portID].initialized) { return IX_ETH_DB_PORT_UNINITIALIZED; } ackPortAddressLock = &ixEthDBPortInfo[portID].npeAckLock; /* Operation stops here when Ethernet Learning is not enabled */ if(IX_FEATURE_CTRL_SWCONFIG_DISABLED == ixFeatureCtrlSwConfigurationCheck(IX_FEATURECTRL_ETH_LEARNING)) { return IX_ETH_DB_SUCCESS; } IX_ETH_DB_CHECK_SINGLE_NPE(portID); /* exit if the port is not an Ethernet NPE */ if (ixEthDBPortDefinitions[portID].type != IX_ETH_NPE) { return IX_ETH_DB_INVALID_PORT; } /* populate message */ FILL_SETPORTADDRESS_MSG(message, portID, macAddr->macAddress); IX_ETH_DB_SUPPORT_TRACE("DB: (Support) Sending SetPortAddress on port %d...\n", portID); /* send a SetPortAddress message */ IX_ETHDB_SEND_NPE_MSG(IX_ETHNPE_PHYSICAL_ID_TO_NODE(portID), message, result); if (result == IX_SUCCESS) { ixEthDBPortInfo[portID].macAddressUploaded = TRUE; } return result; }
IX_ETH_DB_PUBLIC IxEthDBStatus ixEthDBFilteringDatabaseSearch(IxEthDBPortId *portID, IxEthDBMacAddr *macAddr) { HashNode *searchResult; IX_ETH_DB_CHECK_REFERENCE(portID); IX_ETH_DB_CHECK_REFERENCE(macAddr); searchResult = ixEthDBSearch(macAddr, IX_ETH_DB_ALL_FILTERING_RECORDS); if (searchResult == NULL) { return IX_ETH_DB_NO_SUCH_ADDR; /* not found */ } /* return the port ID */ *portID = ((MacDescriptor *) searchResult->data)->portID; ixEthDBReleaseHashNode(searchResult); return IX_ETH_DB_SUCCESS; }
/** * @brief returns the value of an EthDB property * * @param portID ID of the port * @param feature feature owning the property * @param property ID of the property * @param type location to store the property type into * @param value location to store the property value into * * Note that this function is documented in the main component * header file, IxEthDB.h. * * @return IX_ETH_DB_SUCCESS if the operation completed * successfully or an appropriate error message otherwise */ IX_ETH_DB_PUBLIC IxEthDBStatus ixEthDBFeaturePropertyGet(IxEthDBPortId portID, IxEthDBFeature feature, IxEthDBProperty property, IxEthDBPropertyType *type, void *value) { IX_ETH_DB_CHECK_PORT_EXISTS(portID); IX_ETH_DB_CHECK_REFERENCE(type); IX_ETH_DB_CHECK_REFERENCE(value); if (feature == IX_ETH_DB_VLAN_QOS) { if (property == IX_ETH_DB_QOS_TRAFFIC_CLASS_COUNT_PROPERTY) { * (UINT32 *) value = ixEthDBPortInfo[portID].ixEthDBTrafficClassCount; *type = IX_ETH_DB_INTEGER_PROPERTY; return IX_ETH_DB_SUCCESS; } else if (property >= IX_ETH_DB_QOS_TRAFFIC_CLASS_0_RX_QUEUE_PROPERTY && property <= IX_ETH_DB_QOS_TRAFFIC_CLASS_7_RX_QUEUE_PROPERTY) { UINT32 classDelta = property - IX_ETH_DB_QOS_TRAFFIC_CLASS_0_RX_QUEUE_PROPERTY; if (classDelta >= ixEthDBPortInfo[portID].ixEthDBTrafficClassCount) { return IX_ETH_DB_FAIL; } * (UINT32 *) value = ixEthDBPortInfo[portID].ixEthDBTrafficClassAQMAssignments[classDelta]; *type = IX_ETH_DB_INTEGER_PROPERTY; return IX_ETH_DB_SUCCESS; } } return IX_ETH_DB_INVALID_ARG; }
/** * @brief retrieves the STP blocking state of a port * * @param portID ID of the port * @param blocked address to write the blocked status into * * Note that this function is documented in the main component * header file, IxEthDB.h. * * @return IX_ETH_DB_SUCCESS if the operation completed successfully * or an appropriate error message otherwise */ IX_ETH_DB_PUBLIC IxEthDBStatus ixEthDBSpanningTreeBlockingStateGet(IxEthDBPortId portID, BOOL *blocked) { IX_ETH_DB_CHECK_PORT(portID); IX_ETH_DB_CHECK_SINGLE_NPE(portID); IX_ETH_DB_CHECK_FEATURE(portID, IX_ETH_DB_SPANNING_TREE_PROTOCOL); IX_ETH_DB_CHECK_REFERENCE(blocked); *blocked = ixEthDBPortInfo[portID].stpBlocked; return IX_ETH_DB_SUCCESS; }
IX_ETH_DB_PUBLIC IxEthDBStatus ixEthDBPortDependencyMapGet(IxEthDBPortId portID, IxEthDBPortMap dependencyPortMap) { IX_ETH_DB_CHECK_PORT(portID); IX_ETH_DB_CHECK_SINGLE_NPE(portID); IX_ETH_DB_CHECK_REFERENCE(dependencyPortMap); IX_ETH_DB_CHECK_FEATURE(portID, IX_ETH_DB_FILTERING); COPY_DEPENDENCY_MAP(dependencyPortMap, ixEthDBPortInfo[portID].dependencyPortMap); return IX_ETH_DB_SUCCESS; }
IX_ETH_DB_PUBLIC IxEthDBStatus ixEthDBFilteringPortUpdatingSearch(IxEthDBPortId *portID, IxEthDBMacAddr *macAddr) { HashNode *searchResult; MacDescriptor *descriptor; IX_ETH_DB_CHECK_REFERENCE(portID); IX_ETH_DB_CHECK_REFERENCE(macAddr); searchResult = ixEthDBSearch(macAddr, IX_ETH_DB_ALL_FILTERING_RECORDS); if (searchResult == NULL) { return IX_ETH_DB_NO_SUCH_ADDR; /* not found */ } descriptor = (MacDescriptor *) searchResult->data; /* return the port ID */ *portID = descriptor->portID; /* reset entry age */ if (descriptor->type == IX_ETH_DB_FILTERING_RECORD) { descriptor->recordData.filteringData.age = 0; } else { descriptor->recordData.filteringVlanData.age = 0; } ixEthDBReleaseHashNode(searchResult); return IX_ETH_DB_SUCCESS; }
IX_ETH_DB_PUBLIC IxEthDBStatus ixEthDBPortDependencyMapSet(IxEthDBPortId portID, IxEthDBPortMap dependencyPortMap) { IX_ETH_DB_CHECK_PORT(portID); IX_ETH_DB_CHECK_SINGLE_NPE(portID); IX_ETH_DB_CHECK_REFERENCE(dependencyPortMap); IX_ETH_DB_CHECK_FEATURE(portID, IX_ETH_DB_FILTERING); /* force bit at offset 255 to 0 (reserved) */ dependencyPortMap[31] &= 0xFE; COPY_DEPENDENCY_MAP(ixEthDBPortInfo[portID].dependencyPortMap, dependencyPortMap); return IX_ETH_DB_SUCCESS; }
IX_ETH_DB_PUBLIC IxEthDBStatus ixEthDBFilteringEntryDelete(IxEthDBMacAddr *macAddr) { HashNode *searchResult; IX_ETH_DB_CHECK_REFERENCE(macAddr); searchResult = ixEthDBSearch(macAddr, IX_ETH_DB_ALL_FILTERING_RECORDS); if (searchResult == NULL) { return IX_ETH_DB_NO_SUCH_ADDR; /* not found */ } ixEthDBReleaseHashNode(searchResult); /* build a remove event and place it on the event queue */ return ixEthDBTriggerRemovePortUpdate(macAddr, ((MacDescriptor *) searchResult->data)->portID); }