Fix up the incomplete Webserver project so that it integrates with the uIP stack...
[pub/USBasp.git] / LUFA / Drivers / USB / Class / Device / RNDIS.c
index 0d35ee6..0dc3859 100644 (file)
@@ -1,21 +1,21 @@
 /*\r
              LUFA Library\r
-     Copyright (C) Dean Camera, 2009.\r
+     Copyright (C) Dean Camera, 2010.\r
               \r
   dean [at] fourwalledcubicle [dot] com\r
       www.fourwalledcubicle.com\r
 */\r
 \r
 /*\r
-  Copyright 2009  Dean Camera (dean [at] fourwalledcubicle [dot] com)\r
-\r
-  Permission to use, copy, modify, and distribute this software\r
-  and its documentation for any purpose and without fee is hereby\r
-  granted, provided that the above copyright notice appear in all\r
-  copies and that both that the copyright notice and this\r
-  permission notice and warranty disclaimer appear in supporting\r
-  documentation, and that the name of the author not be used in\r
-  advertising or publicity pertaining to distribution of the\r
+  Copyright 2010  Dean Camera (dean [at] fourwalledcubicle [dot] com)\r
+\r
+  Permission to use, copy, modify, distribute, and sell this \r
+  software and its documentation for any purpose is hereby granted\r
+  without fee, provided that the above copyright notice appear in \r
+  all copies and that both that the copyright notice and this\r
+  permission notice and warranty disclaimer appear in supporting \r
+  documentation, and that the name of the author not be used in \r
+  advertising or publicity pertaining to distribution of the \r
   software without specific, written prior permission.\r
 \r
   The author disclaim all warranties with regard to this\r
@@ -65,7 +65,7 @@ static const uint32_t PROGMEM AdapterSupportedOIDList[]  =
                OID_802_3_XMIT_MORE_COLLISIONS,\r
        };\r
 \r
-void RNDIS_Device_ProcessControlPacket(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo)\r
+void RNDIS_Device_ProcessControlRequest(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo)\r
 {\r
        if (!(Endpoint_IsSETUPReceived()))\r
          return;\r
@@ -112,23 +112,25 @@ void RNDIS_Device_ProcessControlPacket(USB_ClassInfo_RNDIS_Device_t* const RNDIS
 \r
 bool RNDIS_Device_ConfigureEndpoints(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo)\r
 {\r
+       memset(&RNDISInterfaceInfo->State, 0x00, sizeof(RNDISInterfaceInfo->State));\r
+\r
        if (!(Endpoint_ConfigureEndpoint(RNDISInterfaceInfo->Config.DataINEndpointNumber, EP_TYPE_BULK,\r
                                                                 ENDPOINT_DIR_IN, RNDISInterfaceInfo->Config.DataINEndpointSize,\r
-                                                                ENDPOINT_BANK_SINGLE)))\r
+                                                                RNDISInterfaceInfo->Config.DataINEndpointDoubleBank ? ENDPOINT_BANK_DOUBLE : ENDPOINT_BANK_SINGLE)))\r
        {\r
                return false;\r
        }\r
 \r
        if (!(Endpoint_ConfigureEndpoint(RNDISInterfaceInfo->Config.DataOUTEndpointNumber, EP_TYPE_BULK,\r
                                         ENDPOINT_DIR_OUT, RNDISInterfaceInfo->Config.DataOUTEndpointSize,\r
-                                        ENDPOINT_BANK_SINGLE)))\r
+                                        RNDISInterfaceInfo->Config.DataOUTEndpointDoubleBank ? ENDPOINT_BANK_DOUBLE : ENDPOINT_BANK_SINGLE)))\r
        {\r
                return false;\r
        }\r
 \r
        if (!(Endpoint_ConfigureEndpoint(RNDISInterfaceInfo->Config.NotificationEndpointNumber, EP_TYPE_INTERRUPT,\r
                                         ENDPOINT_DIR_IN, RNDISInterfaceInfo->Config.NotificationEndpointSize,\r
-                                        ENDPOINT_BANK_SINGLE)))\r
+                                        RNDISInterfaceInfo->Config.NotificationEndpointDoubleBank ? ENDPOINT_BANK_DOUBLE : ENDPOINT_BANK_SINGLE)))\r
        {\r
                return false;\r
        }\r
@@ -138,7 +140,7 @@ bool RNDIS_Device_ConfigureEndpoints(USB_ClassInfo_RNDIS_Device_t* const RNDISIn
 \r
 void RNDIS_Device_USBTask(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo)\r
 {\r
-       if (!(USB_IsConnected) || !(USB_ConfigurationNumber))\r
+       if (USB_DeviceState != DEVICE_STATE_Configured)\r
          return;\r
 \r
        RNDIS_Message_Header_t* MessageHeader = (RNDIS_Message_Header_t*)&RNDISInterfaceInfo->State.RNDISMessageBuffer;\r
@@ -156,7 +158,7 @@ void RNDIS_Device_USBTask(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo
                                .wLength       = 0,\r
                        };\r
                \r
-               Endpoint_Write_Stream_LE(&Notification, sizeof(Notification), NO_STREAM_CALLBACK);\r
+               Endpoint_Write_Stream_LE(&Notification, sizeof(USB_Request_Header_t), NO_STREAM_CALLBACK);\r
 \r
                Endpoint_ClearIN();\r
 \r
@@ -257,13 +259,13 @@ void RNDIS_Device_ProcessRNDISControlMessage(USB_ClassInfo_RNDIS_Device_t* const
                        RNDIS_Query_Complete_t* QUERY_Response = (RNDIS_Query_Complete_t*)&RNDISInterfaceInfo->State.RNDISMessageBuffer;\r
                        uint32_t                Query_Oid      = QUERY_Message->Oid;\r
                                                \r
-                       void*     QueryData                 = &RNDISInterfaceInfo->State.RNDISMessageBuffer[sizeof(RNDIS_Message_Header_t) +\r
-                                                                                                     QUERY_Message->InformationBufferOffset];\r
-                       void*     ResponseData              = &RNDISInterfaceInfo->State.RNDISMessageBuffer[sizeof(RNDIS_Query_Complete_t)];            \r
+                       void*     QueryData = &RNDISInterfaceInfo->State.RNDISMessageBuffer[sizeof(RNDIS_Message_Header_t) +\r
+                                                                                           QUERY_Message->InformationBufferOffset];\r
+                       void*     ResponseData = &RNDISInterfaceInfo->State.RNDISMessageBuffer[sizeof(RNDIS_Query_Complete_t)];         \r
                        uint16_t  ResponseSize;\r
 \r
-                       QUERY_Response->MessageType         = REMOTE_NDIS_QUERY_CMPLT;\r
-                       QUERY_Response->MessageLength       = sizeof(RNDIS_Query_Complete_t);\r
+                       QUERY_Response->MessageType   = REMOTE_NDIS_QUERY_CMPLT;\r
+                       QUERY_Response->MessageLength = sizeof(RNDIS_Query_Complete_t);\r
                                                \r
                        if (RNDIS_Device_ProcessNDISQuery(RNDISInterfaceInfo, Query_Oid, QueryData, QUERY_Message->InformationBufferLength,\r
                                                          ResponseData, &ResponseSize))\r
@@ -290,28 +292,26 @@ void RNDIS_Device_ProcessRNDISControlMessage(USB_ClassInfo_RNDIS_Device_t* const
                        RNDIS_Set_Complete_t* SET_Response = (RNDIS_Set_Complete_t*)&RNDISInterfaceInfo->State.RNDISMessageBuffer;\r
                        uint32_t              SET_Oid      = SET_Message->Oid;\r
 \r
-                       SET_Response->MessageType       = REMOTE_NDIS_SET_CMPLT;\r
-                       SET_Response->MessageLength     = sizeof(RNDIS_Set_Complete_t);\r
-                       SET_Response->RequestId         = SET_Message->RequestId;\r
+                       SET_Response->MessageType   = REMOTE_NDIS_SET_CMPLT;\r
+                       SET_Response->MessageLength = sizeof(RNDIS_Set_Complete_t);\r
+                       SET_Response->RequestId     = SET_Message->RequestId;\r
 \r
-                       void* SetData                   = &RNDISInterfaceInfo->State.RNDISMessageBuffer[sizeof(RNDIS_Message_Header_t) +\r
-                                                                                                 SET_Message->InformationBufferOffset];\r
+                       void* SetData = &RNDISInterfaceInfo->State.RNDISMessageBuffer[sizeof(RNDIS_Message_Header_t) +\r
+                                                                                     SET_Message->InformationBufferOffset];\r
                                                \r
-                       if (RNDIS_Device_ProcessNDISSet(RNDISInterfaceInfo, SET_Oid, SetData, SET_Message->InformationBufferLength))\r
-                         SET_Response->Status        = REMOTE_NDIS_STATUS_SUCCESS;\r
-                       else\r
-                         SET_Response->Status        = REMOTE_NDIS_STATUS_NOT_SUPPORTED;\r
-\r
+                       SET_Response->Status = RNDIS_Device_ProcessNDISSet(RNDISInterfaceInfo, SET_Oid, SetData,\r
+                                                                          SET_Message->InformationBufferLength) ?\r
+                                                                          REMOTE_NDIS_STATUS_SUCCESS : REMOTE_NDIS_STATUS_NOT_SUPPORTED;\r
                        break;\r
                case REMOTE_NDIS_RESET_MSG:\r
                        RNDISInterfaceInfo->State.ResponseReady = true;\r
                        \r
                        RNDIS_Reset_Complete_t* RESET_Response = (RNDIS_Reset_Complete_t*)&RNDISInterfaceInfo->State.RNDISMessageBuffer;\r
 \r
-                       RESET_Response->MessageType         = REMOTE_NDIS_RESET_CMPLT;\r
-                       RESET_Response->MessageLength       = sizeof(RNDIS_Reset_Complete_t);\r
-                       RESET_Response->Status              = REMOTE_NDIS_STATUS_SUCCESS;\r
-                       RESET_Response->AddressingReset     = 0;\r
+                       RESET_Response->MessageType     = REMOTE_NDIS_RESET_CMPLT;\r
+                       RESET_Response->MessageLength   = sizeof(RNDIS_Reset_Complete_t);\r
+                       RESET_Response->Status          = REMOTE_NDIS_STATUS_SUCCESS;\r
+                       RESET_Response->AddressingReset = 0;\r
 \r
                        break;\r
                case REMOTE_NDIS_KEEPALIVE_MSG:\r
@@ -322,10 +322,10 @@ void RNDIS_Device_ProcessRNDISControlMessage(USB_ClassInfo_RNDIS_Device_t* const
                        RNDIS_KeepAlive_Complete_t* KEEPALIVE_Response =\r
                                        (RNDIS_KeepAlive_Complete_t*)&RNDISInterfaceInfo->State.RNDISMessageBuffer;\r
 \r
-                       KEEPALIVE_Response->MessageType     = REMOTE_NDIS_KEEPALIVE_CMPLT;\r
-                       KEEPALIVE_Response->MessageLength   = sizeof(RNDIS_KeepAlive_Complete_t);\r
-                       KEEPALIVE_Response->RequestId       = KEEPALIVE_Message->RequestId;\r
-                       KEEPALIVE_Response->Status          = REMOTE_NDIS_STATUS_SUCCESS;\r
+                       KEEPALIVE_Response->MessageType   = REMOTE_NDIS_KEEPALIVE_CMPLT;\r
+                       KEEPALIVE_Response->MessageLength = sizeof(RNDIS_KeepAlive_Complete_t);\r
+                       KEEPALIVE_Response->RequestId     = KEEPALIVE_Message->RequestId;\r
+                       KEEPALIVE_Response->Status        = REMOTE_NDIS_STATUS_SUCCESS;\r
                        \r
                        break;\r
        }\r
@@ -335,6 +335,9 @@ static bool RNDIS_Device_ProcessNDISQuery(USB_ClassInfo_RNDIS_Device_t* const RN
                                           const uint32_t OId, void* const QueryData, const uint16_t QuerySize,\r
                                           void* ResponseData, uint16_t* const ResponseSize)\r
 {\r
+       (void)QueryData;\r
+       (void)QuerySize;\r
+\r
        switch (OId)\r
        {\r
                case OID_GEN_SUPPORTED_LIST:\r
@@ -443,9 +446,11 @@ static bool RNDIS_Device_ProcessNDISQuery(USB_ClassInfo_RNDIS_Device_t* const RN
        }\r
 }\r
 \r
-static bool RNDIS_Device_ProcessNDISSet(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo, const uint32_t OId, void* SetData,\r
-                                        const uint16_t SetSize)\r
+static bool RNDIS_Device_ProcessNDISSet(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo, const uint32_t OId,\r
+                                        void* SetData, const uint16_t SetSize)\r
 {\r
+       (void)SetSize;\r
+\r
        switch (OId)\r
        {\r
                case OID_GEN_CURRENT_PACKET_FILTER:\r