.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
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
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
\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
/* 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
#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
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
\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
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
/** 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