Fixed incorrect buffer size check in the USBtoSerial project (thanks to Yuri A Nikifo...
[pub/USBasp.git] / LUFA / Drivers / USB / Class / Host / RNDIS.c
index aae445a..b942c53 100644 (file)
@@ -1,13 +1,13 @@
 /*
              LUFA Library
-     Copyright (C) Dean Camera, 2010.
+     Copyright (C) Dean Camera, 2011.
 
   dean [at] fourwalledcubicle [dot] com
            www.lufa-lib.org
 */
 
 /*
-  Copyright 2010  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+  Copyright 2011  Dean Camera (dean [at] fourwalledcubicle [dot] com)
 
   Permission to use, copy, modify, distribute, and sell this
   software and its documentation for any purpose is hereby granted
@@ -29,7 +29,8 @@
 */
 
 #define  __INCLUDE_FROM_USB_DRIVER
-#include "../../HighLevel/USBMode.h"
+#include "../../Core/USBMode.h"
+
 #if defined(USB_CAN_BE_HOST)
 
 #define  __INCLUDE_FROM_RNDIS_DRIVER
@@ -87,7 +88,7 @@ uint8_t RNDIS_Host_ConfigurePipes(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfa
 
                USB_Descriptor_Endpoint_t* EndpointData = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Endpoint_t);
 
-               if (EndpointData->EndpointAddress & ENDPOINT_DESCRIPTOR_DIR_IN)
+               if ((EndpointData->EndpointAddress & ENDPOINT_DIR_MASK) == ENDPOINT_DIR_IN)
                {
                        if ((EndpointData->Attributes & EP_TYPE_MASK) == EP_TYPE_INTERRUPT)
                          NotificationEndpoint = EndpointData;
@@ -111,7 +112,7 @@ uint8_t RNDIS_Host_ConfigurePipes(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfa
 
                if (PipeNum == RNDISInterfaceInfo->Config.DataINPipeNumber)
                {
-                       Size            = DataINEndpoint->EndpointSize;
+                       Size            = le16_to_cpu(DataINEndpoint->EndpointSize);
                        EndpointAddress = DataINEndpoint->EndpointAddress;
                        Token           = PIPE_TOKEN_IN;
                        Type            = EP_TYPE_BULK;
@@ -122,7 +123,7 @@ uint8_t RNDIS_Host_ConfigurePipes(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfa
                }
                else if (PipeNum == RNDISInterfaceInfo->Config.DataOUTPipeNumber)
                {
-                       Size            = DataOUTEndpoint->EndpointSize;
+                       Size            = le16_to_cpu(DataOUTEndpoint->EndpointSize);
                        EndpointAddress = DataOUTEndpoint->EndpointAddress;
                        Token           = PIPE_TOKEN_OUT;
                        Type            = EP_TYPE_BULK;
@@ -133,7 +134,7 @@ uint8_t RNDIS_Host_ConfigurePipes(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfa
                }
                else if (PipeNum == RNDISInterfaceInfo->Config.NotificationPipeNumber)
                {
-                       Size            = NotificationEndpoint->EndpointSize;
+                       Size            = le16_to_cpu(NotificationEndpoint->EndpointSize);
                        EndpointAddress = NotificationEndpoint->EndpointAddress;
                        Token           = PIPE_TOKEN_IN;
                        Type            = EP_TYPE_INTERRUPT;
@@ -240,6 +241,7 @@ static uint8_t RNDIS_SendEncapsulatedCommand(USB_ClassInfo_RNDIS_Host_t* const R
                };
 
        Pipe_SelectPipe(PIPE_CONTROLPIPE);
+       
        return USB_Host_SendControlRequest(Buffer);
 }
 
@@ -257,6 +259,7 @@ static uint8_t RNDIS_GetEncapsulatedResponse(USB_ClassInfo_RNDIS_Host_t* const R
                };
 
        Pipe_SelectPipe(PIPE_CONTROLPIPE);
+       
        return USB_Host_SendControlRequest(Buffer);
 }
 
@@ -267,9 +270,9 @@ uint8_t RNDIS_Host_SendKeepAlive(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfac
        RNDIS_KeepAlive_Message_t  KeepAliveMessage;
        RNDIS_KeepAlive_Complete_t KeepAliveMessageResponse;
 
-       KeepAliveMessage.MessageType     = REMOTE_NDIS_KEEPALIVE_MSG;
-       KeepAliveMessage.MessageLength   = sizeof(RNDIS_KeepAlive_Message_t);
-       KeepAliveMessage.RequestId       = RNDISInterfaceInfo->State.RequestID++;
+       KeepAliveMessage.MessageType     = CPU_TO_LE32(REMOTE_NDIS_KEEPALIVE_MSG);
+       KeepAliveMessage.MessageLength   = CPU_TO_LE32(sizeof(RNDIS_KeepAlive_Message_t));
+       KeepAliveMessage.RequestId       = cpu_to_le32(RNDISInterfaceInfo->State.RequestID++);
 
        if ((ErrorCode = RNDIS_SendEncapsulatedCommand(RNDISInterfaceInfo, &KeepAliveMessage,
                                                       sizeof(RNDIS_KeepAlive_Message_t))) != HOST_SENDCONTROL_Successful)
@@ -293,13 +296,13 @@ uint8_t RNDIS_Host_InitializeDevice(USB_ClassInfo_RNDIS_Host_t* const RNDISInter
        RNDIS_Initialize_Message_t  InitMessage;
        RNDIS_Initialize_Complete_t InitMessageResponse;
 
-       InitMessage.MessageType     = REMOTE_NDIS_INITIALIZE_MSG;
-       InitMessage.MessageLength   = sizeof(RNDIS_Initialize_Message_t);
-       InitMessage.RequestId       = RNDISInterfaceInfo->State.RequestID++;
+       InitMessage.MessageType     = CPU_TO_LE32(REMOTE_NDIS_INITIALIZE_MSG);
+       InitMessage.MessageLength   = CPU_TO_LE32(sizeof(RNDIS_Initialize_Message_t));
+       InitMessage.RequestId       = cpu_to_le32(RNDISInterfaceInfo->State.RequestID++);
 
-       InitMessage.MajorVersion    = REMOTE_NDIS_VERSION_MAJOR;
-       InitMessage.MinorVersion    = REMOTE_NDIS_VERSION_MINOR;
-       InitMessage.MaxTransferSize = RNDISInterfaceInfo->Config.HostMaxPacketSize;
+       InitMessage.MajorVersion    = CPU_TO_LE32(REMOTE_NDIS_VERSION_MAJOR);
+       InitMessage.MinorVersion    = CPU_TO_LE32(REMOTE_NDIS_VERSION_MINOR);
+       InitMessage.MaxTransferSize = cpu_to_le32(RNDISInterfaceInfo->Config.HostMaxPacketSize);
 
        if ((ErrorCode = RNDIS_SendEncapsulatedCommand(RNDISInterfaceInfo, &InitMessage,
                                                       sizeof(RNDIS_Initialize_Message_t))) != HOST_SENDCONTROL_Successful)
@@ -313,10 +316,10 @@ uint8_t RNDIS_Host_InitializeDevice(USB_ClassInfo_RNDIS_Host_t* const RNDISInter
                return ErrorCode;
        }
 
-       if (InitMessageResponse.Status != REMOTE_NDIS_STATUS_SUCCESS)
-         return RNDIS_COMMAND_FAILED;
+       if (InitMessageResponse.Status != CPU_TO_LE32(REMOTE_NDIS_STATUS_SUCCESS))
+         return RNDIS_ERROR_LOGICAL_CMD_FAILED;
 
-       RNDISInterfaceInfo->State.DeviceMaxPacketSize = InitMessageResponse.MaxTransferSize;
+       RNDISInterfaceInfo->State.DeviceMaxPacketSize = le32_to_cpu(InitMessageResponse.MaxTransferSize);
 
        return HOST_SENDCONTROL_Successful;
 }
@@ -336,14 +339,14 @@ uint8_t RNDIS_Host_SetRNDISProperty(USB_ClassInfo_RNDIS_Host_t* const RNDISInter
 
        RNDIS_Set_Complete_t SetMessageResponse;
 
-       SetMessageData.SetMessage.MessageType    = REMOTE_NDIS_SET_MSG;
-       SetMessageData.SetMessage.MessageLength  = sizeof(RNDIS_Set_Message_t) + Length;
-       SetMessageData.SetMessage.RequestId      = RNDISInterfaceInfo->State.RequestID++;
+       SetMessageData.SetMessage.MessageType    = CPU_TO_LE32(REMOTE_NDIS_SET_MSG);
+       SetMessageData.SetMessage.MessageLength  = cpu_to_le32(sizeof(RNDIS_Set_Message_t) + Length);
+       SetMessageData.SetMessage.RequestId      = cpu_to_le32(RNDISInterfaceInfo->State.RequestID++);
 
-       SetMessageData.SetMessage.Oid            = Oid;
-       SetMessageData.SetMessage.InformationBufferLength = Length;
-       SetMessageData.SetMessage.InformationBufferOffset = (sizeof(RNDIS_Set_Message_t) - sizeof(RNDIS_Message_Header_t));
-       SetMessageData.SetMessage.DeviceVcHandle = 0;
+       SetMessageData.SetMessage.Oid            = cpu_to_le32(Oid);
+       SetMessageData.SetMessage.InformationBufferLength = cpu_to_le32(Length);
+       SetMessageData.SetMessage.InformationBufferOffset = CPU_TO_LE32(sizeof(RNDIS_Set_Message_t) - sizeof(RNDIS_Message_Header_t));
+       SetMessageData.SetMessage.DeviceVcHandle = CPU_TO_LE32(0);
 
        memcpy(&SetMessageData.ContiguousBuffer, Buffer, Length);
 
@@ -359,8 +362,8 @@ uint8_t RNDIS_Host_SetRNDISProperty(USB_ClassInfo_RNDIS_Host_t* const RNDISInter
                return ErrorCode;
        }
 
-       if (SetMessageResponse.Status != REMOTE_NDIS_STATUS_SUCCESS)
-         return RNDIS_COMMAND_FAILED;
+       if (SetMessageResponse.Status != CPU_TO_LE32(REMOTE_NDIS_STATUS_SUCCESS))
+         return RNDIS_ERROR_LOGICAL_CMD_FAILED;
 
        return HOST_SENDCONTROL_Successful;
 }
@@ -380,14 +383,14 @@ uint8_t RNDIS_Host_QueryRNDISProperty(USB_ClassInfo_RNDIS_Host_t* const RNDISInt
                uint8_t                ContiguousBuffer[MaxLength];
        } QueryMessageResponseData;
 
-       QueryMessage.MessageType    = REMOTE_NDIS_QUERY_MSG;
-       QueryMessage.MessageLength  = sizeof(RNDIS_Query_Message_t);
-       QueryMessage.RequestId      = RNDISInterfaceInfo->State.RequestID++;
+       QueryMessage.MessageType    = CPU_TO_LE32(REMOTE_NDIS_QUERY_MSG);
+       QueryMessage.MessageLength  = CPU_TO_LE32(sizeof(RNDIS_Query_Message_t));
+       QueryMessage.RequestId      = cpu_to_le32(RNDISInterfaceInfo->State.RequestID++);
 
-       QueryMessage.Oid            = Oid;
-       QueryMessage.InformationBufferLength = 0;
-       QueryMessage.InformationBufferOffset = 0;
-       QueryMessage.DeviceVcHandle = 0;
+       QueryMessage.Oid            = cpu_to_le32(Oid);
+       QueryMessage.InformationBufferLength = CPU_TO_LE32(0);
+       QueryMessage.InformationBufferOffset = CPU_TO_LE32(0);
+       QueryMessage.DeviceVcHandle = CPU_TO_LE32(0);
 
        if ((ErrorCode = RNDIS_SendEncapsulatedCommand(RNDISInterfaceInfo, &QueryMessage,
                                                       sizeof(RNDIS_Query_Message_t))) != HOST_SENDCONTROL_Successful)
@@ -401,8 +404,8 @@ uint8_t RNDIS_Host_QueryRNDISProperty(USB_ClassInfo_RNDIS_Host_t* const RNDISInt
                return ErrorCode;
        }
 
-       if (QueryMessageResponseData.QueryMessageResponse.Status != REMOTE_NDIS_STATUS_SUCCESS)
-         return RNDIS_COMMAND_FAILED;
+       if (QueryMessageResponseData.QueryMessageResponse.Status != CPU_TO_LE32(REMOTE_NDIS_STATUS_SUCCESS))
+         return RNDIS_ERROR_LOGICAL_CMD_FAILED;
 
        memcpy(Buffer, &QueryMessageResponseData.ContiguousBuffer, MaxLength);
 
@@ -450,17 +453,18 @@ uint8_t RNDIS_Host_ReadPacket(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceIn
        RNDIS_Packet_Message_t DeviceMessage;
 
        if ((ErrorCode = Pipe_Read_Stream_LE(&DeviceMessage, sizeof(RNDIS_Packet_Message_t),
-                                            NO_STREAM_CALLBACK)) != PIPE_RWSTREAM_NoError)
+                                            NULL)) != PIPE_RWSTREAM_NoError)
        {
                return ErrorCode;
        }
 
-       *PacketLength = (uint16_t)DeviceMessage.DataLength;
+       *PacketLength = (uint16_t)le32_to_cpu(DeviceMessage.DataLength);
 
-       Pipe_Discard_Stream(DeviceMessage.DataOffset - (sizeof(RNDIS_Packet_Message_t) - sizeof(RNDIS_Message_Header_t)),
-                           NO_STREAM_CALLBACK);
+       Pipe_Discard_Stream(DeviceMessage.DataOffset -
+                           (sizeof(RNDIS_Packet_Message_t) - sizeof(RNDIS_Message_Header_t)),
+                           NULL);
 
-       Pipe_Read_Stream_LE(Buffer, *PacketLength, NO_STREAM_CALLBACK);
+       Pipe_Read_Stream_LE(Buffer, *PacketLength, NULL);
 
        if (!(Pipe_BytesInPipe()))
          Pipe_ClearIN();
@@ -482,21 +486,21 @@ uint8_t RNDIS_Host_SendPacket(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceIn
        RNDIS_Packet_Message_t DeviceMessage;
 
        memset(&DeviceMessage, 0, sizeof(RNDIS_Packet_Message_t));
-       DeviceMessage.MessageType   = REMOTE_NDIS_PACKET_MSG;
-       DeviceMessage.MessageLength = (sizeof(RNDIS_Packet_Message_t) + PacketLength);
-       DeviceMessage.DataOffset    = (sizeof(RNDIS_Packet_Message_t) - sizeof(RNDIS_Message_Header_t));
-       DeviceMessage.DataLength    = PacketLength;
+       DeviceMessage.MessageType   = CPU_TO_LE32(REMOTE_NDIS_PACKET_MSG);
+       DeviceMessage.MessageLength = CPU_TO_LE32(sizeof(RNDIS_Packet_Message_t) + PacketLength);
+       DeviceMessage.DataOffset    = CPU_TO_LE32(sizeof(RNDIS_Packet_Message_t) - sizeof(RNDIS_Message_Header_t));
+       DeviceMessage.DataLength    = cpu_to_le32(PacketLength);
 
        Pipe_SelectPipe(RNDISInterfaceInfo->Config.DataOUTPipeNumber);
        Pipe_Unfreeze();
 
        if ((ErrorCode = Pipe_Write_Stream_LE(&DeviceMessage, sizeof(RNDIS_Packet_Message_t),
-                                             NO_STREAM_CALLBACK)) != PIPE_RWSTREAM_NoError)
+                                             NULL)) != PIPE_RWSTREAM_NoError)
        {
                return ErrorCode;
        }
 
-       Pipe_Write_Stream_LE(Buffer, PacketLength, NO_STREAM_CALLBACK);
+       Pipe_Write_Stream_LE(Buffer, PacketLength, NULL);
        Pipe_ClearOUT();
 
        Pipe_Freeze();