⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ixethdbfeatures.c

📁 AMCC POWERPC 44X系列的U-BOOT文件
💻 C
📖 第 1 页 / 共 2 页
字号:
/** * @file IxEthDBFeatures.c * * @brief Implementation of the EthDB feature control API * * @par * IXP400 SW Release version 2.0 * * -- Copyright Notice -- * * @par * Copyright 2001-2005, Intel Corporation. * All rights reserved. * * @par * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in the *    documentation and/or other materials provided with the distribution. * 3. Neither the name of the Intel Corporation nor the names of its contributors *    may be used to endorse or promote products derived from this software *    without specific prior written permission. * * @par * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @par * -- End of Copyright Notice -- */#include "IxNpeDl.h"#include "IxEthDBQoS.h"#include "IxEthDB_p.h"/** * @brief scans the capabilities of the loaded NPE images * * This function MUST be called by the ixEthDBInit() function. * No EthDB features (including learning and filtering) are enabled * before this function is called. * * @return none * * @internal */IX_ETH_DB_PUBLICvoid ixEthDBFeatureCapabilityScan(void){    IxNpeDlImageId imageId, npeAImageId;    IxEthDBPortId portIndex;    PortInfo *portInfo;    IxEthDBPriorityTable defaultPriorityTable;    IX_STATUS result;    UINT32 queueIndex;    UINT32 queueStructureIndex;    UINT32 trafficClassDefinitionIndex;    /* read version of NPE A - required to set the AQM queues for B and C */    npeAImageId.functionalityId = 0;    ixNpeDlLoadedImageGet(IX_NPEDL_NPEID_NPEA, &npeAImageId);    for (portIndex = 0 ; portIndex < IX_ETH_DB_NUMBER_OF_PORTS ; portIndex++)    {        IxNpeMhMessage msg;        portInfo = &ixEthDBPortInfo[portIndex];        /* check and bypass if NPE B or C is fused out */        if (ixEthDBSingleEthNpeCheck(portIndex) != IX_ETH_DB_SUCCESS) continue;        /* all ports are capable of LEARNING by default */        portInfo->featureCapability |= IX_ETH_DB_LEARNING;        portInfo->featureStatus     |= IX_ETH_DB_LEARNING;        if (ixEthDBPortDefinitions[portIndex].type == IX_ETH_NPE)        {            if (ixNpeDlLoadedImageGet(IX_ETH_DB_PORT_ID_TO_NPE(portIndex), &imageId) != IX_SUCCESS)            {                WARNING_LOG("DB: (FeatureScan) NpeDl did not provide the image ID for NPE port %d\n", portIndex);            }            else            {                /* initialize and empty NPE response mutex */                ixOsalMutexInit(&portInfo->npeAckLock);                ixOsalMutexLock(&portInfo->npeAckLock, IX_OSAL_WAIT_FOREVER);                /* check NPE response to GetStatus */                msg.data[0] = IX_ETHNPE_NPE_GETSTATUS << 24;                msg.data[1] = 0;                IX_ETHDB_SEND_NPE_MSG(IX_ETH_DB_PORT_ID_TO_NPE(portIndex), msg, result);                if (result != IX_SUCCESS)                {                    WARNING_LOG("DB: (FeatureScan) warning, could not send message to the NPE\n");                    continue;                }                if (imageId.functionalityId == 0x00                    || imageId.functionalityId == 0x03                    || imageId.functionalityId == 0x04                    || imageId.functionalityId == 0x80)                {                    portInfo->featureCapability |= IX_ETH_DB_FILTERING;                    portInfo->featureCapability |= IX_ETH_DB_FIREWALL;                    portInfo->featureCapability |= IX_ETH_DB_SPANNING_TREE_PROTOCOL;                }                else if (imageId.functionalityId == 0x01                         || imageId.functionalityId == 0x81)                {                    portInfo->featureCapability |= IX_ETH_DB_FILTERING;                    portInfo->featureCapability |= IX_ETH_DB_FIREWALL;                    portInfo->featureCapability |= IX_ETH_DB_SPANNING_TREE_PROTOCOL;                    portInfo->featureCapability |= IX_ETH_DB_VLAN_QOS;                }                else if (imageId.functionalityId == 0x02                         || imageId.functionalityId == 0x82)                {                    portInfo->featureCapability |= IX_ETH_DB_WIFI_HEADER_CONVERSION;                    portInfo->featureCapability |= IX_ETH_DB_FIREWALL;                    portInfo->featureCapability |= IX_ETH_DB_SPANNING_TREE_PROTOCOL;                    portInfo->featureCapability |= IX_ETH_DB_VLAN_QOS;                }                /* reset AQM queues */                memset(portInfo->ixEthDBTrafficClassAQMAssignments, 0, sizeof (portInfo->ixEthDBTrafficClassAQMAssignments));                /* ensure there's at least one traffic class record in the definition table, otherwise we have no default case, hence no queues */                IX_ENSURE(sizeof (ixEthDBTrafficClassDefinitions) != 0, "DB: no traffic class definitions found, check IxEthDBQoS.h");                /* find the traffic class definition index compatible with the current NPE A functionality ID */                for (trafficClassDefinitionIndex = 0 ;                    trafficClassDefinitionIndex < sizeof (ixEthDBTrafficClassDefinitions) / sizeof (ixEthDBTrafficClassDefinitions[0]);                    trafficClassDefinitionIndex++)                {                    if (ixEthDBTrafficClassDefinitions[trafficClassDefinitionIndex][IX_ETH_DB_NPE_A_FUNCTIONALITY_ID_INDEX] == npeAImageId.functionalityId)                    {                        /* found it */                        break;                    }                }                /* select the default case if we went over the array boundary */                if (trafficClassDefinitionIndex == sizeof (ixEthDBTrafficClassDefinitions) / sizeof (ixEthDBTrafficClassDefinitions[0]))                {                    trafficClassDefinitionIndex = 0; /* the first record is the default case */                }                /* select queue assignment structure based on the traffic class configuration index */                queueStructureIndex = ixEthDBTrafficClassDefinitions[trafficClassDefinitionIndex][IX_ETH_DB_QUEUE_ASSIGNMENT_INDEX];                /* only traffic class 0 is active at initialization time */                portInfo->ixEthDBTrafficClassCount = 1;                /* enable port, VLAN and Firewall feature bits to initialize QoS/VLAN/Firewall configuration */                portInfo->featureStatus |= IX_ETH_DB_VLAN_QOS;                portInfo->featureStatus |= IX_ETH_DB_FIREWALL;                portInfo->enabled        = TRUE;#define CONFIG_WITH_VLAN  /* test-only: VLAN support not included to save space!!! */#ifdef CONFIG_WITH_VLAN /* test-only: VLAN support not included to save space!!! */                /* set VLAN initial configuration (permissive) */                if ((portInfo->featureCapability & IX_ETH_DB_VLAN_QOS) != 0) /* QoS-enabled image */                {                    /* QoS capable */                    portInfo->ixEthDBTrafficClassAvailable = ixEthDBTrafficClassDefinitions[trafficClassDefinitionIndex][IX_ETH_DB_TRAFFIC_CLASS_COUNT_INDEX];                    /* set AQM queues */                    for (queueIndex = 0 ; queueIndex < IX_IEEE802_1Q_QOS_PRIORITY_COUNT ; queueIndex++)                    {                        portInfo->ixEthDBTrafficClassAQMAssignments[queueIndex] = ixEthDBQueueAssignments[queueStructureIndex][queueIndex];                    }                    /* set default PVID (0) and default traffic class 0 */                    ixEthDBPortVlanTagSet(portIndex, 0);                    /* enable reception of all frames */                    ixEthDBAcceptableFrameTypeSet(portIndex, IX_ETH_DB_ACCEPT_ALL_FRAMES);                    /* clear full VLAN membership */                    ixEthDBPortVlanMembershipRangeRemove(portIndex, 0, IX_ETH_DB_802_1Q_MAX_VLAN_ID);                    /* clear TTI table - no VLAN tagged frames will be transmitted */                    ixEthDBEgressVlanRangeTaggingEnabledSet(portIndex, 0, 4094, FALSE);                    /* set membership on 0, otherwise no Tx or Rx is working */                    ixEthDBPortVlanMembershipAdd(portIndex, 0);                }                else /* QoS not available in this image */#endif /* test-only */                {                    /* initialize traffic class availability (only class 0 is available) */                    portInfo->ixEthDBTrafficClassAvailable = 1;                    /* point all AQM queues to traffic class 0 */                    for (queueIndex = 0 ; queueIndex < IX_IEEE802_1Q_QOS_PRIORITY_COUNT ; queueIndex++)                    {                        portInfo->ixEthDBTrafficClassAQMAssignments[queueIndex] =                            ixEthDBQueueAssignments[queueStructureIndex][0];                    }                }#ifdef CONFIG_WITH_VLAN /* test-only: VLAN support not included to save space!!! */                /* download priority mapping table and Rx queue configuration */                memset (defaultPriorityTable, 0, sizeof (defaultPriorityTable));                ixEthDBPriorityMappingTableSet(portIndex, defaultPriorityTable);#endif                /* by default we turn off invalid source MAC address filtering */                ixEthDBFirewallInvalidAddressFilterEnable(portIndex, FALSE);                /* disable port, VLAN, Firewall feature bits */                portInfo->featureStatus &= ~IX_ETH_DB_VLAN_QOS;                portInfo->featureStatus &= ~IX_ETH_DB_FIREWALL;                portInfo->enabled        = FALSE;                /* enable filtering by default if present */                if ((portInfo->featureCapability & IX_ETH_DB_FILTERING) != 0)                {                    portInfo->featureStatus |= IX_ETH_DB_FILTERING;                }            }        }    }}/** * @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_PUBLICIxEthDBStatus 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;}/** * @brief enables or disables a port capability * * @param portID ID of the port * @param feature feature to enable or disable * @param enabled TRUE to enable the selected feature or FALSE to disable it * * 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_PUBLICIxEthDBStatus ixEthDBFeatureEnable(IxEthDBPortId portID, IxEthDBFeature feature, BOOL enable){    PortInfo *portInfo;    IxEthDBPriorityTable defaultPriorityTable;    IxEthDBVlanSet vlanSet;    IxEthDBStatus status = IX_ETH_DB_SUCCESS;    BOOL portEnabled;    IX_ETH_DB_CHECK_PORT_INITIALIZED(portID);    portInfo    = &ixEthDBPortInfo[portID];    portEnabled = portInfo->enabled;    /* check that only one feature is selected */    if (!ixEthDBCheckSingleBitValue(feature))    {        return IX_ETH_DB_FEATURE_UNAVAILABLE;    }    /* port capable of this feature? */    if ((portInfo->featureCapability & feature) == 0)    {        return IX_ETH_DB_FEATURE_UNAVAILABLE;    }    /* mutual exclusion between learning and WiFi header conversion */    if (enable && ((feature | portInfo->featureStatus) & (IX_ETH_DB_FILTERING | IX_ETH_DB_WIFI_HEADER_CONVERSION))            == (IX_ETH_DB_FILTERING | IX_ETH_DB_WIFI_HEADER_CONVERSION))    {        return IX_ETH_DB_NO_PERMISSION;    }    /* learning must be enabled before filtering */    if (enable && (feature == IX_ETH_DB_FILTERING) && ((portInfo->featureStatus & IX_ETH_DB_LEARNING) == 0))    {        return IX_ETH_DB_NO_PERMISSION;    }    /* filtering must be disabled before learning */    if (!enable && (feature == IX_ETH_DB_LEARNING) && ((portInfo->featureStatus & IX_ETH_DB_FILTERING) != 0))    {        return IX_ETH_DB_NO_PERMISSION;    }    /* redundant enabling or disabling */    if ((!enable && ((portInfo->featureStatus & feature) == 0))        || (enable && ((portInfo->featureStatus & feature) != 0)))    {        /* do nothing */        return IX_ETH_DB_SUCCESS;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -