Extend incomplete RNDISHost demo -- can not enumerate a RNDIS device correctly and...
authorDean Camera <dean@fourwalledcubicle.com>
Fri, 13 Nov 2009 07:23:31 +0000 (07:23 +0000)
committerDean Camera <dean@fourwalledcubicle.com>
Fri, 13 Nov 2009 07:23:31 +0000 (07:23 +0000)
Demos/Host/Incomplete/RNDISEthernetHost/Lib/RNDISCommands.c
Demos/Host/Incomplete/RNDISEthernetHost/Lib/RNDISCommands.h
Demos/Host/Incomplete/RNDISEthernetHost/Lib/RNDISConstants.h
Demos/Host/Incomplete/RNDISEthernetHost/RNDISEthernetHost.c
Demos/Host/Incomplete/RNDISEthernetHost/RNDISEthernetHost.h

index 6bacc8f..e248b18 100644 (file)
@@ -48,17 +48,6 @@ uint8_t RNDIS_SendEncapsulatedCommand(void* Buffer, uint16_t Length)
                        .wIndex        = 0,\r
                        .wLength       = Length,\r
                };\r
-       \r
-       printf("==== RNDIS CONTROL REQUEST ====\r\n");\r
-       uint8_t* Data = Buffer;\r
-       for (uint16_t i = 0; i < Length / 8; i++)\r
-       {\r
-               for (uint16_t j = 0; (j < 8) && i*8+j < Length; j++)\r
-                       printf("%02X ", *(Data++));\r
-                       \r
-               printf("\r\n");\r
-       }\r
-       printf("==== ********************* ====\r\n");\r
 \r
        /* Select the control pipe for the request transfer */\r
        Pipe_SelectPipe(PIPE_CONTROLPIPE);\r
@@ -83,6 +72,32 @@ uint8_t RNDIS_GetEncapsulatedResponse(void* Buffer, uint16_t Length)
        return USB_Host_SendControlRequest(Buffer);\r
 }\r
 \r
+uint8_t RNDIS_KeepAlive(void)\r
+{\r
+       uint8_t ErrorCode;\r
+\r
+       RNDIS_KeepAlive_Message_t  KeepAliveMessage;\r
+       RNDIS_KeepAlive_Complete_t KeepAliveMessageResponse;\r
+       \r
+       KeepAliveMessage.MessageType     = REMOTE_NDIS_KEEPALIVE_MSG;\r
+       KeepAliveMessage.MessageLength   = sizeof(RNDIS_KeepAlive_Message_t);\r
+       KeepAliveMessage.RequestId       = RequestID++;\r
+\r
+       if ((ErrorCode = RNDIS_SendEncapsulatedCommand(&KeepAliveMessage,\r
+                                                      sizeof(RNDIS_KeepAlive_Message_t))) != HOST_SENDCONTROL_Successful)\r
+       {\r
+               return ErrorCode;\r
+       }\r
+       \r
+       if ((ErrorCode = RNDIS_GetEncapsulatedResponse(&KeepAliveMessageResponse,\r
+                                                      sizeof(RNDIS_KeepAlive_Complete_t))) != HOST_SENDCONTROL_Successful)\r
+       {\r
+               return ErrorCode;\r
+       }\r
+       \r
+       return HOST_SENDCONTROL_Successful;\r
+}\r
+\r
 uint8_t RNDIS_InitializeDevice(uint16_t MaxPacketSize, RNDIS_Initialize_Complete_t* InitMessageResponse)\r
 {\r
        uint8_t ErrorCode;\r
@@ -131,7 +146,8 @@ uint8_t RNDIS_SetRNDISProperty(uint32_t Oid, void* Buffer, uint16_t Length)
        SetMessageData.SetMessage.InformationBufferLength = Length;\r
        SetMessageData.SetMessage.InformationBufferOffset = 0;\r
        SetMessageData.SetMessage.DeviceVcHandle = 0;\r
-\r
+       \r
+       memcpy(&SetMessageData.ContigiousBuffer, Buffer, Length);\r
 \r
        if ((ErrorCode = RNDIS_SendEncapsulatedCommand(&SetMessageData,\r
                                                       SetMessageData.SetMessage.MessageLength)) != HOST_SENDCONTROL_Successful)\r
@@ -147,3 +163,57 @@ uint8_t RNDIS_SetRNDISProperty(uint32_t Oid, void* Buffer, uint16_t Length)
 \r
        return HOST_SENDCONTROL_Successful;\r
 }\r
+\r
+uint8_t RNDIS_QueryRNDISProperty(uint32_t Oid, void* Buffer, uint16_t Length)\r
+{\r
+       uint8_t ErrorCode;\r
+\r
+       RNDIS_Query_Message_t  QueryMessage;\r
+\r
+       struct\r
+       {\r
+               RNDIS_Query_Complete_t QueryMessageResponse;\r
+               uint8_t              ContigiousBuffer[Length];\r
+       } QueryMessageResponseData;\r
+\r
+       QueryMessage.MessageType    = REMOTE_NDIS_QUERY_MSG;\r
+       QueryMessage.MessageLength  = sizeof(RNDIS_Query_Message_t);\r
+       QueryMessage.RequestId      = RequestID++;\r
+                       \r
+       QueryMessage.Oid            = Oid;\r
+       QueryMessage.InformationBufferLength = Length;\r
+       QueryMessage.InformationBufferOffset = 0;\r
+       QueryMessage.DeviceVcHandle = 0;\r
+\r
+       if ((ErrorCode = RNDIS_SendEncapsulatedCommand(&QueryMessage,\r
+                                                      sizeof(RNDIS_Query_Message_t))) != HOST_SENDCONTROL_Successful)\r
+       {\r
+               return ErrorCode;\r
+       }\r
+       \r
+       if ((ErrorCode = RNDIS_GetEncapsulatedResponse(&QueryMessageResponseData,\r
+                                                      sizeof(QueryMessageResponseData))) != HOST_SENDCONTROL_Successful)\r
+       {\r
+               return ErrorCode;\r
+       }\r
+\r
+       memcpy(Buffer, &QueryMessageResponseData.ContigiousBuffer, Length);\r
+\r
+       return HOST_SENDCONTROL_Successful;\r
+}\r
+\r
+uint8_t RNDIS_GetPacketSize(uint16_t* PacketSize)\r
+{\r
+       uint8_t ErrorCode;\r
+\r
+       RNDIS_Packet_Message_t DeviceMessage;\r
+       \r
+       if ((ErrorCode = Pipe_Read_Stream_LE(&DeviceMessage, sizeof(RNDIS_Packet_Message_t))) != PIPE_RWSTREAM_NoError)\r
+       {\r
+               return ErrorCode;\r
+       }\r
+\r
+       *PacketSize = (uint16_t)DeviceMessage.DataLength;\r
+       \r
+       return PIPE_RWSTREAM_NoError;\r
+}\r
index dfb43e2..55f848b 100644 (file)
@@ -39,6 +39,7 @@
        /* Includes: */\r
                #include <avr/io.h>\r
                #include <stdio.h>\r
+               #include <string.h>\r
                \r
                #include <LUFA/Drivers/USB/USB.h>\r
                \r
                uint8_t RNDIS_SendEncapsulatedCommand(void* Buffer, uint16_t Length);\r
                uint8_t RNDIS_GetEncapsulatedResponse(void* Buffer, uint16_t Length);\r
 \r
+               uint8_t RNDIS_KeepAlive(void);\r
                uint8_t RNDIS_InitializeDevice(uint16_t MaxPacketSize, RNDIS_Initialize_Complete_t* InitMessageResponse);\r
                uint8_t RNDIS_SetRNDISProperty(uint32_t Oid, void* Buffer, uint16_t Length);\r
+               uint8_t RNDIS_QueryRNDISProperty(uint32_t Oid, void* Buffer, uint16_t Length);\r
+               uint8_t RNDIS_GetPacketSize(uint16_t* PacketSize);\r
 \r
 #endif\r
index ad66f62..f65a66c 100644 (file)
                #define OID_802_3_RCV_ERROR_ALIGNMENT         0x01020101UL\r
                #define OID_802_3_XMIT_ONE_COLLISION          0x01020102UL\r
                #define OID_802_3_XMIT_MORE_COLLISIONS        0x01020103UL\r
+               \r
+               #define RNDIS_PACKET_TYPE_DIRECTED            0x00000001UL\r
+               #define RNDIS_PACKET_TYPE_MULTICAST           0x00000002UL\r
+               #define RNDIS_PACKET_TYPE_ALL_MULTICAST       0x00000004UL\r
+               #define RNDIS_PACKET_TYPE_BROADCAST           0x00000008UL\r
+               #define RNDIS_PACKET_TYPE_SOURCE_ROUTING      0x00000010UL\r
+               #define RNDIS_PACKET_TYPE_PROMISCUOUS         0x00000020UL\r
+               #define RNDIS_PACKET_TYPE_SMT                 0x00000040UL\r
+               #define RNDIS_PACKET_TYPE_ALL_LOCAL           0x00000080UL\r
+               #define RNDIS_PACKET_TYPE_GROUP               0x00001000UL\r
+               #define RNDIS_PACKET_TYPE_ALL_FUNCTIONAL      0x00002000UL\r
+               #define RNDIS_PACKET_TYPE_FUNCTIONAL          0x00004000UL\r
+               #define RNDIS_PACKET_TYPE_MAC_FRAME           0x00008000UL      \r
 \r
 #endif\r
index 5b156ec..a64dfbd 100644 (file)
@@ -121,6 +121,54 @@ void EVENT_USB_Host_DeviceEnumerationFailed(const uint8_t ErrorCode, const uint8
        LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
 }\r
 \r
+void PrintIncommingPackets(void)\r
+{\r
+       uint8_t ErrorCode;\r
+\r
+       Pipe_SelectPipe(RNDIS_DATAPIPE_IN);\r
+       Pipe_Unfreeze();\r
+       \r
+       if (!(Pipe_IsReadWriteAllowed()))\r
+       {\r
+               Pipe_Freeze();\r
+               return;\r
+       }\r
+\r
+       LEDs_SetAllLEDs(LEDMASK_USB_BUSY);\r
+       \r
+       puts_P(PSTR("DATA IN\r\n"));\r
+\r
+       uint16_t PacketSize;\r
+       if ((ErrorCode = RNDIS_GetPacketSize(&PacketSize)) != HOST_SENDCONTROL_Successful)\r
+       {\r
+               printf_P(PSTR(ESC_FG_RED "Packet Reception Error.\r\n"\r
+                                                                " -- Error Code: %d\r\n" ESC_FG_WHITE), ErrorCode);\r
+       }\r
+       else if (PacketSize > 2048)\r
+       {\r
+               printf_P(PSTR(ESC_FG_RED "Packet of Size %d Too Large.\r\n" ESC_FG_WHITE), PacketSize);\r
+               Pipe_Discard_Stream(PacketSize);\r
+       }\r
+       else\r
+       {\r
+               uint8_t PacketBuffer[PacketSize];\r
+               \r
+               Pipe_Read_Stream_LE(&PacketBuffer, PacketSize);\r
+               \r
+               printf("***PACKET (Size %d)***\r\n", PacketSize);\r
+               for (uint16_t i = 0; i < PacketSize; i++)\r
+               {\r
+                       printf("%02x ", PacketBuffer[i]);\r
+               }\r
+               printf("\r\n\r\n");\r
+       }\r
+       \r
+       LEDs_SetAllLEDs(LEDMASK_USB_READY);\r
+\r
+       Pipe_ClearIN();\r
+       Pipe_Freeze();\r
+}\r
+\r
 /** Task to set the configuration of the attached device after it has been enumerated, and to read in\r
  *  data received from the attached RNDIS device and print it to the serial port.\r
  */\r
@@ -181,7 +229,8 @@ void RNDIS_Host_Task(void)
                        \r
                        printf_P(PSTR("Device Max Transfer Size: %lu bytes.\r\n"), InitMessageResponse.MaxTransferSize);\r
                        \r
-                       uint32_t PacketFilter = 0xFFFFFFFF;\r
+                       /* We set the default filter to only receive packets we would be interested in */\r
+                       uint32_t PacketFilter = (RNDIS_PACKET_TYPE_DIRECTED | RNDIS_PACKET_TYPE_BROADCAST | RNDIS_PACKET_TYPE_ALL_MULTICAST);\r
                        if ((ErrorCode = RNDIS_SetRNDISProperty(OID_GEN_CURRENT_PACKET_FILTER,\r
                                                                &PacketFilter, sizeof(PacketFilter))) != HOST_SENDCONTROL_Successful)\r
                        {\r
@@ -195,13 +244,32 @@ void RNDIS_Host_Task(void)
                                USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
                                break;\r
                        }\r
+\r
+                       uint32_t VendorID;\r
+                       if ((ErrorCode = RNDIS_QueryRNDISProperty(OID_GEN_VENDOR_ID,\r
+                                                                 &VendorID, sizeof(VendorID))) != HOST_SENDCONTROL_Successful)\r
+                       {\r
+                               printf_P(PSTR(ESC_FG_RED "Error Getting Vendor ID.\r\n"\r
+                                                        " -- Error Code: %d\r\n" ESC_FG_WHITE), ErrorCode);\r
+\r
+                               /* Indicate error via status LEDs */\r
+                               LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
+\r
+                               /* Wait until USB device disconnected */\r
+                               USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
+                               break;\r
+                       }\r
+                       \r
+                       printf_P(PSTR("Device Vendor ID: 0x%08X\r\n"), VendorID);\r
                        \r
                        puts_P(PSTR("RNDIS Device Enumerated.\r\n"));\r
 \r
                        USB_HostState = HOST_STATE_Configured;\r
                        break;\r
                case HOST_STATE_Configured:\r
-                                               \r
+                       PrintIncommingPackets();\r
+               \r
                        break;\r
        }\r
 }\r
+\r
index caca9c6..47e5c24 100644 (file)
                /** LED mask for the library LED driver, to indicate that an error has occurred in the USB interface. */\r
                #define LEDMASK_USB_ERROR        (LEDS_LED1 | LEDS_LED3)\r
                                \r
+               /** LED mask for the library LED driver, to indicate that the USB interface is busy. */\r
+               #define LEDMASK_USB_BUSY         (LEDS_LED2)\r
+\r
+       /* Type Defines: */\r
+               /** Type define for a RNDIS notification message, for transmission to the RNDIS host via the notification\r
+                *  Endpoint.\r
+                */\r
+               typedef struct\r
+               {\r
+                       uint8_t  bmRequestType; /**< Notification type, a mask of values from SrdRequestType.h */\r
+                       uint8_t  bNotification; /**< Notification index, indicating what the RNDIS notification relates to */\r
+                       uint16_t wValue; /**< Two byte notification value parameter */\r
+                       uint16_t wIndex; /**< Two byte notification index parameter */\r
+                       uint16_t wLength; /**< Size of data payload following the notification header */\r
+               } USB_Notification_t;\r
+\r
        /* Function Prototypes: */\r
                void SetupHardware(void);\r
+               void PrintIncommingPackets(void);\r
                void RNDIS_Host_Task(void);\r
        \r
                void EVENT_USB_Host_HostError(const uint8_t ErrorCode);\r