]> git.sur5r.net Git - freertos/blobdiff - FreeRTOS-Plus/Source/FreeRTOS-Plus-TCP/portable/NetworkInterface/mw300_rd/NetworkInterface.c
git-svn-id: https://svn.code.sf.net/p/freertos/code/trunk@2822 1d2547de-c912-0410...
[freertos] / FreeRTOS-Plus / Source / FreeRTOS-Plus-TCP / portable / NetworkInterface / mw300_rd / NetworkInterface.c
index df5bd7cfe50fe6b96e7eb797d937716c1e433cbb..87161fd3925dab4dbfc1e3a053100e645a336010 100644 (file)
-/*
-FreeRTOS+TCP V2.0.11
-Copyright (C) 2018 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software is furnished to do so,
-subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
-FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
- http://aws.amazon.com/freertos
- http://www.FreeRTOS.org
-*/
-
-/* FreeRTOS includes. */
-#include "FreeRTOS.h"
-#include "list.h"
-
-/* FreeRTOS+TCP includes. */
-#include "FreeRTOS_IP.h"
-/* FreeRTOS+TCP includes. */
-#include "FreeRTOS_IP.h"
-#include "FreeRTOS_Sockets.h"
-#include "FreeRTOS_IP_Private.h"
-#include "FreeRTOS_DNS.h"
-#include "NetworkBufferManagement.h"
-#include "NetworkInterface.h"
-
-#include "wifi-decl.h"
-#include "wmerrno.h"
-#include "wifi.h"
-
-#include <wmlog.h>
-
-#define net_e(...)                             \
-    wmlog_e("freertos_tcp", ##__VA_ARGS__)
-#define net_w(...)                             \
-    wmlog_w("freertos_tcp", ##__VA_ARGS__)
-#define net_d(...)                             \
-    wmlog("freertos_tcp", ##__VA_ARGS__)
-
-#if 0 //this is lwip structure.
-#define MAX_INTERFACES_SUPPORTED 3
-static struct netif *netif_arr[MAX_INTERFACES_SUPPORTED];
-#endif
-
-/* If ipconfigETHERNET_DRIVER_FILTERS_FRAME_TYPES is set to 1, then the Ethernet
-driver will filter incoming packets and only pass the stack those packets it
-considers need processing. */
-#if( ipconfigETHERNET_DRIVER_FILTERS_FRAME_TYPES == 0 )
-#define ipCONSIDER_FRAME_FOR_PROCESSING( pucEthernetBuffer ) eProcessBuffer
-#else
-#define ipCONSIDER_FRAME_FOR_PROCESSING( pucEthernetBuffer ) eConsiderFrameForProcessing( ( pucEthernetBuffer ) )
-#endif
-
-#define IP_ADDR_ANY         ((ip_addr_t *)&ip_addr_any)
-#define IP_ADDR_BROADCAST   ((ip_addr_t *)&ip_addr_broadcast)
-
-/** 255.255.255.255 */
-#define IPADDR_NONE         ((u32_t)0xffffffffUL)
-/** 127.0.0.1 */
-#define IPADDR_LOOPBACK     ((u32_t)0x7f000001UL)
-/** 0.0.0.0 */
-#define IPADDR_ANY          ((u32_t)0x00000000UL)
-/** 255.255.255.255 */
-#define IPADDR_BROADCAST    ((u32_t)0xffffffffUL)
-
-/** 255.255.255.255 */
-#define INADDR_NONE         IPADDR_NONE
-/** 127.0.0.1 */
-#define INADDR_LOOPBACK     IPADDR_LOOPBACK
-/** 0.0.0.0 */
-#define INADDR_ANY          IPADDR_ANY
-/** 255.255.255.255 */
-#define INADDR_BROADCAST    IPADDR_BROADCAST
-
-enum if_state_t {
-    INTERFACE_DOWN = 0,
-    INTERFACE_UP,
-};
-struct ip_addr {
-  u32_t addr;
-};
-
-#define MLAN_BSS_TYPE_STA 0
-
-extern uint8_t outbuf[2048];
-extern bool mlan_is_amsdu(const t_u8 *rcvdata);
-extern t_u8 *mlan_get_payload(const t_u8 *rcvdata, t_u16 *payload_len, int *interface);
-extern int wrapper_wlan_handle_amsdu_rx_packet(const t_u8 *rcvdata, const t_u16 datalen);
-extern int wrapper_wlan_handle_rx_packet(const t_u16 datalen, const t_u8 *rcvdata,  NetworkBufferDescriptor_t *pxNetworkBuffer);
-static volatile  uint32_t xInterfaceState = INTERFACE_DOWN;
-
-static int process_data_packet(const t_u8 *databuf, const t_u16 datalen)
-{
-    int interface = BSS_TYPE_STA;
-    t_u8 *payload = NULL;
-    t_u16 payload_len = 0;
-    const TickType_t xDescriptorWaitTime = pdMS_TO_TICKS( 250 );
-
-    NetworkBufferDescriptor_t *pxNetworkBuffer;
-    IPStackEvent_t xRxEvent = { eNetworkRxEvent, NULL };
-
-    payload = (t_u8 *)mlan_get_payload(databuf, &payload_len, &interface);
-
-    if( eConsiderFrameForProcessing( payload ) != eProcessBuffer ) {
-       net_d("Dropping packet\r\n");
-       return WM_SUCCESS;
-    }
-
-    pxNetworkBuffer = pxGetNetworkBufferWithDescriptor(/*payload_len*/datalen, xDescriptorWaitTime);
-
-    if (pxNetworkBuffer != NULL) {
-       /* Set the packet size, in case a larger buffer was returned. */
-       pxNetworkBuffer->xDataLength = payload_len;
-
-       /* Copy the packet data. */
-       memcpy(pxNetworkBuffer->pucEthernetBuffer, payload, payload_len);
-
-       xRxEvent.pvData = (void *) pxNetworkBuffer;
-       if ( xSendEventStructToIPTask( &xRxEvent, xDescriptorWaitTime) == pdFAIL ) {
-               wmprintf("Failed to enqueue packet to network stack %p, len %d", payload, payload_len);
-               vReleaseNetworkBufferAndDescriptor(pxNetworkBuffer);
-               return WM_FAIL;
-       }
-    }
-    return WM_SUCCESS;
-}
-
-/* Callback function called from the wifi module */
-void handle_data_packet(const t_u8 interface, const t_u8 *rcvdata,
-                        const t_u16 datalen)
-{
-    if (interface == BSS_TYPE_STA)
-       process_data_packet(rcvdata, datalen);
-}
-
-BaseType_t xNetworkInterfaceInitialise( void )
-{
-    uint8_t ret;
-    mac_addr_t mac_addr;
-
-       ret = wifi_get_device_mac_addr(&mac_addr);
-       if (ret != WM_SUCCESS) {
-               net_d("Failed to get mac address");
-       }
-
-       FreeRTOS_UpdateMACAddress(mac_addr.mac);
-
-    return ( xInterfaceState == INTERFACE_UP && ret == WM_SUCCESS ) ? pdTRUE : pdFALSE;
-}
-
-void vNetworkInterfaceAllocateRAMToBuffers( NetworkBufferDescriptor_t pxNetworkBuffers[ ipconfigNUM_NETWORK_BUFFER_DESCRIPTORS ] )
-{
-    /* FIX ME. */
-}
-
-BaseType_t xGetPhyLinkStatus( void )
-{
-    /* FIX ME. */
-    return pdFALSE;
-}
-void vNetworkNotifyIFDown()
-{
-    IPStackEvent_t xRxEvent = { eNetworkDownEvent, NULL };
-    xInterfaceState = INTERFACE_DOWN;
-    if( xSendEventStructToIPTask( &xRxEvent, 0 ) != pdPASS ) {
-       /* Could not send the message, so it is still pending. */
-        net_e("Could not send network down event");
-    }
-    else {
-       /* Message was sent so it is not pending. */
-        net_d("Sent network down event");
-    }
-}
-
-void vNetworkNotifyIFUp()
-{
-    xInterfaceState = INTERFACE_UP;
-}
-
-BaseType_t xNetworkInterfaceOutput( NetworkBufferDescriptor_t *const pxNetworkBuffer, BaseType_t xReleaseAfterSend )
-{
-    uint8_t pkt_len;
-
-    if (pxNetworkBuffer == NULL ||
-       pxNetworkBuffer->pucEthernetBuffer == NULL ||
-       pxNetworkBuffer->xDataLength == 0) {
-           net_d("Incorrect params");
-            return pdFALSE;
-    }
-    memset(outbuf, 0x00, sizeof(outbuf));
-    pkt_len = 22 + 4; /* sizeof(TxPD) + INTF_HEADER_LEN */
-    memcpy((u8_t *) outbuf + pkt_len, (u8_t *) pxNetworkBuffer->pucEthernetBuffer,
-               pxNetworkBuffer->xDataLength);
-    int ret = wifi_low_level_output(BSS_TYPE_STA, outbuf + pkt_len, pxNetworkBuffer->xDataLength);
-    if (ret != WM_SUCCESS) {
-       net_e("Failed output %p, length %d, error %d \r\n", pxNetworkBuffer->pucEthernetBuffer, pxNetworkBuffer->xDataLength, ret);
-    }
-
-    if (xReleaseAfterSend != pdFALSE) {
-        vReleaseNetworkBufferAndDescriptor(pxNetworkBuffer);
-    }
-
-    return ret == WM_SUCCESS ? pdTRUE : pdFALSE;
-}
+/*\r
+FreeRTOS+TCP V2.0.11\r
+Copyright (C) 2018 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r
+\r
+Permission is hereby granted, free of charge, to any person obtaining a copy of\r
+this software and associated documentation files (the "Software"), to deal in\r
+the Software without restriction, including without limitation the rights to\r
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r
+the Software, and to permit persons to whom the Software is furnished to do so,\r
+subject to the following conditions:\r
+\r
+The above copyright notice and this permission notice shall be included in all\r
+copies or substantial portions of the Software.\r
+\r
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+\r
+ http://aws.amazon.com/freertos\r
+ http://www.FreeRTOS.org\r
+*/\r
+\r
+/* FreeRTOS includes. */\r
+#include "FreeRTOS.h"\r
+#include "list.h"\r
+\r
+/* FreeRTOS+TCP includes. */\r
+#include "FreeRTOS_IP.h"\r
+/* FreeRTOS+TCP includes. */\r
+#include "FreeRTOS_IP.h"\r
+#include "FreeRTOS_Sockets.h"\r
+#include "FreeRTOS_IP_Private.h"\r
+#include "FreeRTOS_DNS.h"\r
+#include "NetworkBufferManagement.h"\r
+#include "NetworkInterface.h"\r
+\r
+#include "wifi-decl.h"\r
+#include "wmerrno.h"\r
+#include "wifi.h"\r
+\r
+#include <wmlog.h>\r
+\r
+#define net_e(...)                             \\r
+    wmlog_e("freertos_tcp", ##__VA_ARGS__)\r
+#define net_w(...)                             \\r
+    wmlog_w("freertos_tcp", ##__VA_ARGS__)\r
+#define net_d(...)                             \\r
+    wmlog("freertos_tcp", ##__VA_ARGS__)\r
+\r
+#if 0 //this is lwip structure.\r
+#define MAX_INTERFACES_SUPPORTED 3\r
+static struct netif *netif_arr[MAX_INTERFACES_SUPPORTED];\r
+#endif\r
+\r
+/* If ipconfigETHERNET_DRIVER_FILTERS_FRAME_TYPES is set to 1, then the Ethernet\r
+driver will filter incoming packets and only pass the stack those packets it\r
+considers need processing. */\r
+#if( ipconfigETHERNET_DRIVER_FILTERS_FRAME_TYPES == 0 )\r
+#define ipCONSIDER_FRAME_FOR_PROCESSING( pucEthernetBuffer ) eProcessBuffer\r
+#else\r
+#define ipCONSIDER_FRAME_FOR_PROCESSING( pucEthernetBuffer ) eConsiderFrameForProcessing( ( pucEthernetBuffer ) )\r
+#endif\r
+\r
+#define IP_ADDR_ANY         ((ip_addr_t *)&ip_addr_any)\r
+#define IP_ADDR_BROADCAST   ((ip_addr_t *)&ip_addr_broadcast)\r
+\r
+/** 255.255.255.255 */\r
+#define IPADDR_NONE         ((u32_t)0xffffffffUL)\r
+/** 127.0.0.1 */\r
+#define IPADDR_LOOPBACK     ((u32_t)0x7f000001UL)\r
+/** 0.0.0.0 */\r
+#define IPADDR_ANY          ((u32_t)0x00000000UL)\r
+/** 255.255.255.255 */\r
+#define IPADDR_BROADCAST    ((u32_t)0xffffffffUL)\r
+\r
+/** 255.255.255.255 */\r
+#define INADDR_NONE         IPADDR_NONE\r
+/** 127.0.0.1 */\r
+#define INADDR_LOOPBACK     IPADDR_LOOPBACK\r
+/** 0.0.0.0 */\r
+#define INADDR_ANY          IPADDR_ANY\r
+/** 255.255.255.255 */\r
+#define INADDR_BROADCAST    IPADDR_BROADCAST\r
+\r
+enum if_state_t {\r
+    INTERFACE_DOWN = 0,\r
+    INTERFACE_UP,\r
+};\r
+struct ip_addr {\r
+  u32_t addr;\r
+};\r
+\r
+#define MLAN_BSS_TYPE_STA 0\r
+\r
+extern uint8_t outbuf[2048];\r
+extern bool mlan_is_amsdu(const t_u8 *rcvdata);\r
+extern t_u8 *mlan_get_payload(const t_u8 *rcvdata, t_u16 *payload_len, int *interface);\r
+extern int wrapper_wlan_handle_amsdu_rx_packet(const t_u8 *rcvdata, const t_u16 datalen);\r
+extern int wrapper_wlan_handle_rx_packet(const t_u16 datalen, const t_u8 *rcvdata,  NetworkBufferDescriptor_t *pxNetworkBuffer);\r
+static volatile  uint32_t xInterfaceState = INTERFACE_DOWN;\r
+\r
+static int process_data_packet(const t_u8 *databuf, const t_u16 datalen)\r
+{\r
+    int interface = BSS_TYPE_STA;\r
+    t_u8 *payload = NULL;\r
+    t_u16 payload_len = 0;\r
+    const TickType_t xDescriptorWaitTime = pdMS_TO_TICKS( 250 );\r
+\r
+    NetworkBufferDescriptor_t *pxNetworkBuffer;\r
+    IPStackEvent_t xRxEvent = { eNetworkRxEvent, NULL };\r
+\r
+    payload = (t_u8 *)mlan_get_payload(databuf, &payload_len, &interface);\r
+\r
+    if( eConsiderFrameForProcessing( payload ) != eProcessBuffer ) {\r
+       net_d("Dropping packet\r\n");\r
+       return WM_SUCCESS;\r
+    }\r
+\r
+    pxNetworkBuffer = pxGetNetworkBufferWithDescriptor(/*payload_len*/datalen, xDescriptorWaitTime);\r
+\r
+    if (pxNetworkBuffer != NULL) {\r
+       /* Set the packet size, in case a larger buffer was returned. */\r
+       pxNetworkBuffer->xDataLength = payload_len;\r
+\r
+       /* Copy the packet data. */\r
+       memcpy(pxNetworkBuffer->pucEthernetBuffer, payload, payload_len);\r
+\r
+       xRxEvent.pvData = (void *) pxNetworkBuffer;\r
+       if ( xSendEventStructToIPTask( &xRxEvent, xDescriptorWaitTime) == pdFAIL ) {\r
+               wmprintf("Failed to enqueue packet to network stack %p, len %d", payload, payload_len);\r
+               vReleaseNetworkBufferAndDescriptor(pxNetworkBuffer);\r
+               return WM_FAIL;\r
+       }\r
+    }\r
+    return WM_SUCCESS;\r
+}\r
+\r
+/* Callback function called from the wifi module */\r
+void handle_data_packet(const t_u8 interface, const t_u8 *rcvdata,\r
+                        const t_u16 datalen)\r
+{\r
+    if (interface == BSS_TYPE_STA)\r
+       process_data_packet(rcvdata, datalen);\r
+}\r
+\r
+BaseType_t xNetworkInterfaceInitialise( void )\r
+{\r
+    uint8_t ret;\r
+    mac_addr_t mac_addr;\r
+\r
+       ret = wifi_get_device_mac_addr(&mac_addr);\r
+       if (ret != WM_SUCCESS) {\r
+               net_d("Failed to get mac address");\r
+       }\r
+\r
+       FreeRTOS_UpdateMACAddress(mac_addr.mac);\r
+\r
+    return ( xInterfaceState == INTERFACE_UP && ret == WM_SUCCESS ) ? pdTRUE : pdFALSE;\r
+}\r
+\r
+void vNetworkInterfaceAllocateRAMToBuffers( NetworkBufferDescriptor_t pxNetworkBuffers[ ipconfigNUM_NETWORK_BUFFER_DESCRIPTORS ] )\r
+{\r
+    /* FIX ME. */\r
+}\r
+\r
+BaseType_t xGetPhyLinkStatus( void )\r
+{\r
+    /* FIX ME. */\r
+    return pdFALSE;\r
+}\r
+void vNetworkNotifyIFDown()\r
+{\r
+    IPStackEvent_t xRxEvent = { eNetworkDownEvent, NULL };\r
+    xInterfaceState = INTERFACE_DOWN;\r
+    if( xSendEventStructToIPTask( &xRxEvent, 0 ) != pdPASS ) {\r
+       /* Could not send the message, so it is still pending. */\r
+        net_e("Could not send network down event");\r
+    }\r
+    else {\r
+       /* Message was sent so it is not pending. */\r
+        net_d("Sent network down event");\r
+    }\r
+}\r
+\r
+void vNetworkNotifyIFUp()\r
+{\r
+    xInterfaceState = INTERFACE_UP;\r
+}\r
+\r
+BaseType_t xNetworkInterfaceOutput( NetworkBufferDescriptor_t *const pxNetworkBuffer, BaseType_t xReleaseAfterSend )\r
+{\r
+    uint8_t pkt_len;\r
+\r
+    if (pxNetworkBuffer == NULL ||\r
+       pxNetworkBuffer->pucEthernetBuffer == NULL ||\r
+       pxNetworkBuffer->xDataLength == 0) {\r
+           net_d("Incorrect params");\r
+            return pdFALSE;\r
+    }\r
+    memset(outbuf, 0x00, sizeof(outbuf));\r
+    pkt_len = 22 + 4; /* sizeof(TxPD) + INTF_HEADER_LEN */\r
+    memcpy((u8_t *) outbuf + pkt_len, (u8_t *) pxNetworkBuffer->pucEthernetBuffer,\r
+               pxNetworkBuffer->xDataLength);\r
+    int ret = wifi_low_level_output(BSS_TYPE_STA, outbuf + pkt_len, pxNetworkBuffer->xDataLength);\r
+    if (ret != WM_SUCCESS) {\r
+       net_e("Failed output %p, length %d, error %d \r\n", pxNetworkBuffer->pucEthernetBuffer, pxNetworkBuffer->xDataLength, ret);\r
+    }\r
+\r
+    if (xReleaseAfterSend != pdFALSE) {\r
+        vReleaseNetworkBufferAndDescriptor(pxNetworkBuffer);\r
+    }\r
+\r
+    return ret == WM_SUCCESS ? pdTRUE : pdFALSE;\r
+}\r