📄 ixethacccodeletswbridgewifi.c
字号:
/** * @file IxEthAccCodeletSwBridgeWiFi.c * * @date 25 August 2004 * * @brief This file contains the implementation of the Ethernet Access Codelet. * * This file implements a simple bridge between two Ethernet ports with a * 802.3 <=> 802.11 frame header conversion set up at NPE level. * * * @par * IXP400 SW Release version 2.1 * * -- Copyright Notice -- * * @par * Copyright (c) 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 --*//* * Put the system defined include files required. *//* * Put the user defined include files required. */#include "IxEthAcc.h"#include "IxEthDB.h"#include "IxOsal.h"#include "IxEthAccCodelet.h"#include "IxEthAccCodelet_p.h"/* prototypes */void ixEthAccCodeletWiFiBridgeRxCB(UINT32 cbTag, IX_OSAL_MBUF* mBufPtr, UINT32 reserved);IX_STATUS ixEthAccCodeletSwWiFiBridgeStart(IxEthAccPortId wifiPortId, IxEthAccPortId bridgedPortId);UINT32 ixEthAccCodeletWiFiAddressCompare(UINT8 *mac1, UINT8 *mac2);PRIVATE IxEthDBMacAddr ixEthAccCodeletWiFiStaMacAddress = { {0x00, 0x00, 0x11, 0x22, 0x33, 0x44} };PRIVATE IxEthDBMacAddr ixEthAccCodeletWiFiApMacAddress = { {0x00, 0x00, 0xA1, 0xA2, 0xA3, 0xA4} };PRIVATE IxEthDBMacAddr ixEthAccCodeletWiFiGwMacAddress = { {0x00, 0x00, 0xF9, 0xF8, 0xF7, 0xF6} };PRIVATE IxEthDBMacAddr ixEthAccCodeletWiFiBSSIDMacAddress = { {0x00, 0xFF, 0xFE, 0xFD, 0xFC, 0xFB} };PRIVATE UINT16 ixEthAccCodeletWiFiDurationID = 0x1234;PRIVATE UINT16 ixEthAccCodeletWiFiFrameControl = 0xABCD;PRIVATE IxEthDBMacAddr ixEthAccCodeletWiFiRecStaAddress = { {0x00, 0x00, 0x55, 0x66, 0x77, 0x88} };PRIVATE IxEthDBMacAddr ixEthAccCodeletWiFiRecApAddress = { {0x00, 0x00, 0xB1, 0xB2, 0xB3, 0xB4} };IxEthDBWiFiRecData ixEthAccCodeletWiFiRecStaData;IxEthDBWiFiRecData ixEthAccCodeletWiFiRecApData;extern const char *mac2string(const unsigned char *mac);/* * Function definition: ixEthAccCodeletSwBridgeWiFiStart() * * Configure WiFi header conversion and Start bridge datapath */IX_STATUS ixEthAccCodeletSwBridgeWiFiStart(IxEthAccPortId wifiPortId, IxEthAccPortId bridgedPortId){ IxEthDBFeature featureSet = 0; ixEthAccCodeletWiFiRecStaData.recType = IX_ETH_DB_WIFI_AP_TO_STA; ixEthAccCodeletWiFiRecStaData.vlanTagFlag = IX_ETH_DB_WIFI_VLAN_NOTAG; ixEthAccCodeletWiFiRecStaData.padLength = IX_ETH_DB_WIFI_MIN_PAD_SIZE; ixEthAccCodeletWiFiRecStaData.logicalPortID = 0x0E; memset(ixEthAccCodeletWiFiRecStaData.gatewayMacAddr, 0, IX_IEEE803_MAC_ADDRESS_SIZE); memcpy(ixEthAccCodeletWiFiRecStaData.bssid, &ixEthAccCodeletWiFiBSSIDMacAddress, IX_IEEE803_MAC_ADDRESS_SIZE); ixEthAccCodeletWiFiRecApData.recType = IX_ETH_DB_WIFI_AP_TO_AP; ixEthAccCodeletWiFiRecApData.vlanTagFlag = IX_ETH_DB_WIFI_VLAN_NOTAG; ixEthAccCodeletWiFiRecApData.padLength = IX_ETH_DB_WIFI_MIN_PAD_SIZE; ixEthAccCodeletWiFiRecApData.logicalPortID = 0x0E; memcpy(ixEthAccCodeletWiFiRecApData.gatewayMacAddr, &ixEthAccCodeletWiFiGwMacAddress, IX_IEEE803_MAC_ADDRESS_SIZE); memcpy(ixEthAccCodeletWiFiRecApData.bssid, &ixEthAccCodeletWiFiBSSIDMacAddress, IX_IEEE803_MAC_ADDRESS_SIZE); if (wifiPortId == bridgedPortId) { printf("SwBridgeWiFi: Cannot configure a Bridge Operation between port %u and port %u (ports must be different)\n", wifiPortId, bridgedPortId); return (IX_FAIL); } /* Perform basic port configuration (actual callbacks will be registered later, * in ixEthAccCodeletSwWiFiBridgeStart) */ if ( ixEthAccCodeletPortConfigure(wifiPortId, ixEthAccCodeletBridgeRxCB, NULL, ixEthAccCodeletBridgeTxCB, 0 /* no callback tag */) != IX_SUCCESS) { printf("SwBridgeWiFi: Failed to configure Port %u\n", wifiPortId); return (IX_FAIL); } if ( ixEthAccCodeletPortConfigure(bridgedPortId, ixEthAccCodeletBridgeRxCB, NULL, ixEthAccCodeletBridgeTxCB, 0 /* no callback tag */) != IX_SUCCESS) { printf("SwBridgeWiFi: Failed to configure Port %u\n", bridgedPortId); return (IX_FAIL); } /* Enable the Port in EthDB in order to configure and download the * WiFi Database */ if (ixEthDBPortEnable(wifiPortId) != IX_ETH_DB_SUCCESS) { printf("SwBridgeWiFi: Cannot enable port %u\n", wifiPortId); return (IX_FAIL); } if (ixEthDBPortEnable(bridgedPortId) != IX_ETH_DB_SUCCESS) { printf("SwBridgeWiFi: Cannot enable port %u\n", bridgedPortId); return (IX_FAIL); } /* check feature */ if (IX_ETH_DB_SUCCESS != ixEthDBFeatureCapabilityGet(wifiPortId, &featureSet)) { printf("SwBridgeWiFi: Could not get the feature capabilities of the selected WiFi port (%d)\n", wifiPortId); return IX_FAIL; } if ((featureSet & IX_ETH_DB_WIFI_HEADER_CONVERSION) == 0) { printf("SwBridgeWiFi: Selected WiFi port (%d) does not have an NPE image capable of 802.11 header conversion\n", wifiPortId); return IX_FAIL; } featureSet = 0; if (IX_ETH_DB_SUCCESS != ixEthDBFeatureCapabilityGet(bridgedPortId, &featureSet)) { printf("SwBridgeWiFi: Could not get the feature capabilities of the selected bridge port (%d)\n", bridgedPortId); return IX_FAIL; } if ((featureSet & IX_ETH_DB_WIFI_HEADER_CONVERSION) != 0) { printf("SwBridgeWiFi: Selected bridge port (%d) should not have an NPE image capable of 802.11 header conversion\n", bridgedPortId); return IX_FAIL; } /* enable feature */ if (IX_ETH_DB_SUCCESS != ixEthDBFeatureEnable(wifiPortId, IX_ETH_DB_WIFI_HEADER_CONVERSION, TRUE)) { printf("SwBridgeWiFi: Failed to enable the WiFi header conversion feature, exiting\n"); return IX_FAIL; } /* set the conversion table */ if (IX_ETH_DB_SUCCESS != ixEthDBWiFiBSSIDSet(wifiPortId, &ixEthAccCodeletWiFiBSSIDMacAddress)) { printf("SwBridgeWiFi: Failed to set the BSSID value, exiting\n"); return IX_FAIL; } if (IX_ETH_DB_SUCCESS != ixEthDBWiFiStationEntryAdd(wifiPortId, &ixEthAccCodeletWiFiStaMacAddress)) { printf("SwBridgeWiFi: Failed to add Station address, exiting\n"); return IX_FAIL; } if (IX_ETH_DB_SUCCESS != ixEthDBWiFiAccessPointEntryAdd(wifiPortId, &ixEthAccCodeletWiFiApMacAddress, &ixEthAccCodeletWiFiGwMacAddress)) { printf("SwBridgeWiFi: Failed to add AccessPoint address, exiting\n"); return IX_FAIL; } if (IX_ETH_DB_SUCCESS != ixEthDBWiFiRecordEntryAdd(wifiPortId, &ixEthAccCodeletWiFiRecStaAddress, &ixEthAccCodeletWiFiRecStaData)) { printf("SwBridgeWiFi: Failed to add Station address, exiting\n"); return IX_FAIL; } if (IX_ETH_DB_SUCCESS != ixEthDBWiFiRecordEntryAdd(wifiPortId, &ixEthAccCodeletWiFiRecApAddress, &ixEthAccCodeletWiFiRecApData))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -