📄 ixethacccodeletswbridgewifi.c
字号:
{ printf("SwBridgeWiFi: Failed to add AccessPoint address, exiting\n"); return IX_FAIL; } if (IX_ETH_DB_SUCCESS != ixEthDBWiFiConversionTableDownload(wifiPortId)) { printf("SwBridgeWiFi: Failed to download WiFi frame header conversion table, exiting\n"); return IX_FAIL; } if (IX_ETH_DB_SUCCESS != ixEthDBWiFiFrameControlSet(wifiPortId, ixEthAccCodeletWiFiFrameControl)) { printf("SwBridgeWiFi: Failed to set the FrameControl value, exiting\n"); return IX_FAIL; } if (IX_ETH_DB_SUCCESS != ixEthDBWiFiDurationIDSet(wifiPortId, ixEthAccCodeletWiFiDurationID)) { printf("SwBridgeWiFi: Failed to set the Duration/ID value, exiting\n"); return IX_FAIL; } /* display user instructions */ printf("\n"); printf("-------------------------------------------------------------------------------\n"); printf("| Sending packets to port %d using [%s] as the destination MAC |\n", wifiPortId, mac2string(ixEthAccCodeletWiFiRecStaAddress.macAddress)); printf("| will convert their headers to 802.11 STA->AP frames. Capture the frames on |\n"); printf("| port %d with your test equipment to view the conversion result. |\n", bridgedPortId); printf("| |\n"); printf("| Sending packets to port %d using [%s] as the destination MAC |\n", wifiPortId, mac2string(ixEthAccCodeletWiFiRecApAddress.macAddress)); printf("| will convert their headers to 802.11 AP->AP frames. The conversion uses |\n"); printf("| [%s] as gateway MAC address. Capture the frames on port %d |\n", mac2string(ixEthAccCodeletWiFiGwMacAddress.macAddress), bridgedPortId); printf("| with your test equipment to view the conversion result. |\n"); printf("| |\n"); printf("| Sending 802.11 frames generated as above to port %d, when bridged to port %d, |\n", bridgedPortId, wifiPortId); printf("| will convert them to 802.3 frames. Observe the output on port %d. |\n", wifiPortId); printf("| |\n"); printf("| This test is using : [%s] as BSSID |\n", mac2string(ixEthAccCodeletWiFiBSSIDMacAddress.macAddress)); printf("| 0x%4x as FrameControl |\n", ixEthAccCodeletWiFiFrameControl); printf("| 0x%4x as Duration/ID |\n", ixEthAccCodeletWiFiDurationID); printf("-------------------------------------------------------------------------------\n"); return ixEthAccCodeletSwWiFiBridgeStart(wifiPortId, bridgedPortId);}/* * Function definition: ixEthAccCodeletSwBridgeStart() * * Start bridge datapath */IX_STATUS ixEthAccCodeletSwWiFiBridgeStart(IxEthAccPortId wifiPortId, IxEthAccPortId bridgedPortId){ UINT32 firstPortCbTag = wifiPortId | (bridgedPortId << 16); UINT32 secondPortCbTag = bridgedPortId | (wifiPortId << 16); /* Configure and register the traffic callbacks for both ports */ if ( ixEthAccCodeletPortConfigure(wifiPortId, ixEthAccCodeletBridgeRxCB, (IxEthAccPortMultiBufferRxCallback) NULL, ixEthAccCodeletBridgeTxCB, firstPortCbTag) != IX_SUCCESS) { printf("SwBridge: Failed to configure Port %u\n", wifiPortId); return (IX_FAIL); } if ( ixEthAccCodeletPortConfigure(bridgedPortId, ixEthAccCodeletWiFiBridgeRxCB, (IxEthAccPortMultiBufferRxCallback) NULL, ixEthAccCodeletBridgeTxCB, secondPortCbTag) != IX_SUCCESS) { printf("SwBridge: Failed to configure Port %u\n", bridgedPortId); return (IX_FAIL); } /* Enable the traffic over both ports */ if ( ixEthAccPortEnable(wifiPortId) != IX_SUCCESS) { printf("SwBridge: Failed to enable Port %u\n", wifiPortId); return (IX_FAIL); } if ( ixEthAccPortEnable(bridgedPortId) != IX_SUCCESS) { printf("SwBridge: Failed to enable Port %u\n", bridgedPortId); return (IX_FAIL); } return (IX_SUCCESS);}UINT32 ixEthAccCodeletWiFiAddressCompare(UINT8 *mac1, UINT8 *mac2){ UINT32 local_index; for (local_index = 0 ; local_index < IX_IEEE803_MAC_ADDRESS_SIZE ; local_index++) { if (mac1[local_index] > mac2[local_index]) { return 1; } else if (mac1[local_index] < mac2[local_index]) { return -1; } } return 0;}/** * Function definition: ixEthAccCodeletWiFiBridgeRxCB() * * Receive callback for Bridge Operation. Received frames are retransmitted * on the port loaded with the WiFi header conversion image, and 802.11 * frames are configured (by setting the link_prot flag) to be converted * into 802.3 format. */void ixEthAccCodeletWiFiBridgeRxCB(UINT32 cbTag, IX_OSAL_MBUF* mBufPtr, UINT32 reserved){ /* Transmit the buffer on the other port */ UINT16 frameControl; UINT16 durationID; UINT16 logicalPortID; UINT8 *firstAddr; UINT16 linkProt = 0; IxEthAccPortId wifiPortId = cbTag >> 16; IxEthAccPortId bridgedPortId = cbTag & 0xFFFF; ixEthAccCodeletStats[bridgedPortId].rxCount++; /* 802.11 frames generated by the codelet can be detected by * inspecting the Frame Control, Duration/ID and first 802.11 address */ IX_OSAL_CACHE_INVALIDATE(IX_OSAL_MBUF_MDATA(mBufPtr), IX_OSAL_MBUF_MLEN(mBufPtr)); frameControl = IX_OSAL_SWAP_BE_SHARED_SHORT(* ((UINT16 *) IX_OSAL_MBUF_MDATA(mBufPtr))); durationID = IX_OSAL_SWAP_BE_SHARED_SHORT(*(((UINT16 *) IX_OSAL_MBUF_MDATA(mBufPtr)) + 2)); firstAddr = ((UINT8 *) IX_OSAL_MBUF_MDATA(mBufPtr)) + 4; logicalPortID = (UINT16) IX_ETHACC_NE_DESTPORTID(mBufPtr); if ((frameControl == ixEthAccCodeletWiFiFrameControl) && (durationID == ixEthAccCodeletWiFiDurationID) && (logicalPortID == 0x0E)) { if (ixEthAccCodeletWiFiAddressCompare(firstAddr, ixEthAccCodeletWiFiGwMacAddress.macAddress) == 0) { /* AP to AP frame, set link_prot to 11b << 4*/ linkProt = IX_ETHACC_RX_APTYPE; } else if (ixEthAccCodeletWiFiAddressCompare(firstAddr, ixEthAccCodeletWiFiRecStaAddress.macAddress) == 0) { /* AP to STA frame, set link_prot to 10b << 4 */ linkProt = IX_ETHACC_RX_STATYPE; } IX_ETHACC_NE_FLAGS(mBufPtr) &= ~IX_ETHACC_NE_LINKMASK; IX_ETHACC_NE_FLAGS(mBufPtr) |= linkProt; } if(ixEthAccPortTxFrameSubmit(wifiPortId, mBufPtr, IX_ETH_ACC_TX_DEFAULT_PRIORITY) != IX_ETH_ACC_SUCCESS) { ixOsalLog(IX_OSAL_LOG_LVL_ERROR, IX_OSAL_LOG_DEV_STDOUT, "Tx Buffer submission failed on port 1\n", 0, 0, 0, 0, 0, 0); }}/* * Function definition: ixEthAccCodeletSwBridgeWiFiStop() * * Unconfigure WiFi and Stop bridge datapath */IX_STATUS ixEthAccCodeletSwBridgeWiFiStop(IxEthAccPortId firstPortId, IxEthAccPortId secondPortId){ /* Stop the data bridge */ if (ixEthAccCodeletSwBridgeStop(firstPortId, secondPortId) != IX_SUCCESS) { printf("SwBridgeWiFi: Failed to unconfigure the bridge ports\n"); return (IX_FAIL); } /* Enable the EthDB ports to clear the firewall configuration */ if ((ixEthDBPortEnable(firstPortId)) != IX_ETH_DB_SUCCESS) { printf("Cannot enable port %u\n", firstPortId); return (IX_FAIL); } /* clears the WiFi address table */ if (IX_ETH_DB_SUCCESS != ixEthDBDatabaseClear(firstPortId, IX_ETH_DB_WIFI_RECORD)) { printf("Failed to clear the WiFi database\n"); return IX_FAIL; } if (IX_ETH_DB_SUCCESS != ixEthDBFeatureEnable(firstPortId, IX_ETH_DB_WIFI_HEADER_CONVERSION, FALSE)) { printf("Failed to disable the WiFi header conversion feature\n"); return IX_FAIL; } /* disable the ethDB port */ if ((ixEthDBPortDisable(firstPortId)) != IX_ETH_DB_SUCCESS) { printf("SwBridgeFirewall: Cannot disable port %u\n", firstPortId); return (IX_FAIL); } if ((ixEthDBPortDisable(secondPortId)) != IX_ETH_DB_SUCCESS) { printf("SwBridgeFirewall: Cannot disable port %u\n", secondPortId); return (IX_FAIL); } return IX_SUCCESS;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -