aboutsummaryrefslogtreecommitdiffstats
path: root/Demos/Host
diff options
context:
space:
mode:
authorDean Camera <dean@fourwalledcubicle.com>2009-11-13 07:23:31 +0000
committerDean Camera <dean@fourwalledcubicle.com>2009-11-13 07:23:31 +0000
commit2626ecb261e3cac22c602a92034b32c4e6d2be87 (patch)
tree4fd5c86dd741e23cacd1f114f5fecae1cd41a467 /Demos/Host
parent652042111c7c058bd56d9847002f166507f492d4 (diff)
downloadlufa-2626ecb261e3cac22c602a92034b32c4e6d2be87.tar.gz
lufa-2626ecb261e3cac22c602a92034b32c4e6d2be87.tar.bz2
lufa-2626ecb261e3cac22c602a92034b32c4e6d2be87.zip
Extend incomplete RNDISHost demo -- can not enumerate a RNDIS device correctly and set the packet filter. No packets are received yet from the test device, need to investigate additional SET commands to see if any critical OIDs have been missed.
Diffstat (limited to 'Demos/Host')
-rw-r--r--Demos/Host/Incomplete/RNDISEthernetHost/Lib/RNDISCommands.c94
-rw-r--r--Demos/Host/Incomplete/RNDISEthernetHost/Lib/RNDISCommands.h4
-rw-r--r--Demos/Host/Incomplete/RNDISEthernetHost/Lib/RNDISConstants.h13
-rw-r--r--Demos/Host/Incomplete/RNDISEthernetHost/RNDISEthernetHost.c72
-rw-r--r--Demos/Host/Incomplete/RNDISEthernetHost/RNDISEthernetHost.h17
5 files changed, 186 insertions, 14 deletions
diff --git a/Demos/Host/Incomplete/RNDISEthernetHost/Lib/RNDISCommands.c b/Demos/Host/Incomplete/RNDISEthernetHost/Lib/RNDISCommands.c
index 6bacc8f6d..e248b18da 100644
--- a/Demos/Host/Incomplete/RNDISEthernetHost/Lib/RNDISCommands.c
+++ b/Demos/Host/Incomplete/RNDISEthernetHost/Lib/RNDISCommands.c
@@ -48,17 +48,6 @@ uint8_t RNDIS_SendEncapsulatedCommand(void* Buffer, uint16_t Length)
.wIndex = 0,
.wLength = Length,
};
-
- printf("==== RNDIS CONTROL REQUEST ====\r\n");
- uint8_t* Data = Buffer;
- for (uint16_t i = 0; i < Length / 8; i++)
- {
- for (uint16_t j = 0; (j < 8) && i*8+j < Length; j++)
- printf("%02X ", *(Data++));
-
- printf("\r\n");
- }
- printf("==== ********************* ====\r\n");
/* Select the control pipe for the request transfer */
Pipe_SelectPipe(PIPE_CONTROLPIPE);
@@ -83,6 +72,32 @@ uint8_t RNDIS_GetEncapsulatedResponse(void* Buffer, uint16_t Length)
return USB_Host_SendControlRequest(Buffer);
}
+uint8_t RNDIS_KeepAlive(void)
+{
+ uint8_t ErrorCode;
+
+ 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 = RequestID++;
+
+ if ((ErrorCode = RNDIS_SendEncapsulatedCommand(&KeepAliveMessage,
+ sizeof(RNDIS_KeepAlive_Message_t))) != HOST_SENDCONTROL_Successful)
+ {
+ return ErrorCode;
+ }
+
+ if ((ErrorCode = RNDIS_GetEncapsulatedResponse(&KeepAliveMessageResponse,
+ sizeof(RNDIS_KeepAlive_Complete_t))) != HOST_SENDCONTROL_Successful)
+ {
+ return ErrorCode;
+ }
+
+ return HOST_SENDCONTROL_Successful;
+}
+
uint8_t RNDIS_InitializeDevice(uint16_t MaxPacketSize, RNDIS_Initialize_Complete_t* InitMessageResponse)
{
uint8_t ErrorCode;
@@ -131,7 +146,8 @@ uint8_t RNDIS_SetRNDISProperty(uint32_t Oid, void* Buffer, uint16_t Length)
SetMessageData.SetMessage.InformationBufferLength = Length;
SetMessageData.SetMessage.InformationBufferOffset = 0;
SetMessageData.SetMessage.DeviceVcHandle = 0;
-
+
+ memcpy(&SetMessageData.ContigiousBuffer, Buffer, Length);
if ((ErrorCode = RNDIS_SendEncapsulatedCommand(&SetMessageData,
SetMessageData.SetMessage.MessageLength)) != HOST_SENDCONTROL_Successful)
@@ -147,3 +163,57 @@ uint8_t RNDIS_SetRNDISProperty(uint32_t Oid, void* Buffer, uint16_t Length)
return HOST_SENDCONTROL_Successful;
}
+
+uint8_t RNDIS_QueryRNDISProperty(uint32_t Oid, void* Buffer, uint16_t Length)
+{
+ uint8_t ErrorCode;
+
+ RNDIS_Query_Message_t QueryMessage;
+
+ struct
+ {
+ RNDIS_Query_Complete_t QueryMessageResponse;
+ uint8_t ContigiousBuffer[Length];
+ } QueryMessageResponseData;
+
+ QueryMessage.MessageType = REMOTE_NDIS_QUERY_MSG;
+ QueryMessage.MessageLength = sizeof(RNDIS_Query_Message_t);
+ QueryMessage.RequestId = RequestID++;
+
+ QueryMessage.Oid = Oid;
+ QueryMessage.InformationBufferLength = Length;
+ QueryMessage.InformationBufferOffset = 0;
+ QueryMessage.DeviceVcHandle = 0;
+
+ if ((ErrorCode = RNDIS_SendEncapsulatedCommand(&QueryMessage,
+ sizeof(RNDIS_Query_Message_t))) != HOST_SENDCONTROL_Successful)
+ {
+ return ErrorCode;
+ }
+
+ if ((ErrorCode = RNDIS_GetEncapsulatedResponse(&QueryMessageResponseData,
+ sizeof(QueryMessageResponseData))) != HOST_SENDCONTROL_Successful)
+ {
+ return ErrorCode;
+ }
+
+ memcpy(Buffer, &QueryMessageResponseData.ContigiousBuffer, Length);
+
+ return HOST_SENDCONTROL_Successful;
+}
+
+uint8_t RNDIS_GetPacketSize(uint16_t* PacketSize)
+{
+ uint8_t ErrorCode;
+
+ RNDIS_Packet_Message_t DeviceMessage;
+
+ if ((ErrorCode = Pipe_Read_Stream_LE(&DeviceMessage, sizeof(RNDIS_Packet_Message_t))) != PIPE_RWSTREAM_NoError)
+ {
+ return ErrorCode;
+ }
+
+ *PacketSize = (uint16_t)DeviceMessage.DataLength;
+
+ return PIPE_RWSTREAM_NoError;
+}
diff --git a/Demos/Host/Incomplete/RNDISEthernetHost/Lib/RNDISCommands.h b/Demos/Host/Incomplete/RNDISEthernetHost/Lib/RNDISCommands.h
index dfb43e2e9..55f848bd0 100644
--- a/Demos/Host/Incomplete/RNDISEthernetHost/Lib/RNDISCommands.h
+++ b/Demos/Host/Incomplete/RNDISEthernetHost/Lib/RNDISCommands.h
@@ -39,6 +39,7 @@
/* Includes: */
#include <avr/io.h>
#include <stdio.h>
+ #include <string.h>
#include <LUFA/Drivers/USB/USB.h>
@@ -199,7 +200,10 @@
uint8_t RNDIS_SendEncapsulatedCommand(void* Buffer, uint16_t Length);
uint8_t RNDIS_GetEncapsulatedResponse(void* Buffer, uint16_t Length);
+ uint8_t RNDIS_KeepAlive(void);
uint8_t RNDIS_InitializeDevice(uint16_t MaxPacketSize, RNDIS_Initialize_Complete_t* InitMessageResponse);
uint8_t RNDIS_SetRNDISProperty(uint32_t Oid, void* Buffer, uint16_t Length);
+ uint8_t RNDIS_QueryRNDISProperty(uint32_t Oid, void* Buffer, uint16_t Length);
+ uint8_t RNDIS_GetPacketSize(uint16_t* PacketSize);
#endif
diff --git a/Demos/Host/Incomplete/RNDISEthernetHost/Lib/RNDISConstants.h b/Demos/Host/Incomplete/RNDISEthernetHost/Lib/RNDISConstants.h
index ad66f62db..f65a66cbf 100644
--- a/Demos/Host/Incomplete/RNDISEthernetHost/Lib/RNDISConstants.h
+++ b/Demos/Host/Incomplete/RNDISEthernetHost/Lib/RNDISConstants.h
@@ -95,5 +95,18 @@
#define OID_802_3_RCV_ERROR_ALIGNMENT 0x01020101UL
#define OID_802_3_XMIT_ONE_COLLISION 0x01020102UL
#define OID_802_3_XMIT_MORE_COLLISIONS 0x01020103UL
+
+ #define RNDIS_PACKET_TYPE_DIRECTED 0x00000001UL
+ #define RNDIS_PACKET_TYPE_MULTICAST 0x00000002UL
+ #define RNDIS_PACKET_TYPE_ALL_MULTICAST 0x00000004UL
+ #define RNDIS_PACKET_TYPE_BROADCAST 0x00000008UL
+ #define RNDIS_PACKET_TYPE_SOURCE_ROUTING 0x00000010UL
+ #define RNDIS_PACKET_TYPE_PROMISCUOUS 0x00000020UL
+ #define RNDIS_PACKET_TYPE_SMT 0x00000040UL
+ #define RNDIS_PACKET_TYPE_ALL_LOCAL 0x00000080UL
+ #define RNDIS_PACKET_TYPE_GROUP 0x00001000UL
+ #define RNDIS_PACKET_TYPE_ALL_FUNCTIONAL 0x00002000UL
+ #define RNDIS_PACKET_TYPE_FUNCTIONAL 0x00004000UL
+ #define RNDIS_PACKET_TYPE_MAC_FRAME 0x00008000UL
#endif
diff --git a/Demos/Host/Incomplete/RNDISEthernetHost/RNDISEthernetHost.c b/Demos/Host/Incomplete/RNDISEthernetHost/RNDISEthernetHost.c
index 5b156ecda..a64dfbdf2 100644
--- a/Demos/Host/Incomplete/RNDISEthernetHost/RNDISEthernetHost.c
+++ b/Demos/Host/Incomplete/RNDISEthernetHost/RNDISEthernetHost.c
@@ -121,6 +121,54 @@ void EVENT_USB_Host_DeviceEnumerationFailed(const uint8_t ErrorCode, const uint8
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
}
+void PrintIncommingPackets(void)
+{
+ uint8_t ErrorCode;
+
+ Pipe_SelectPipe(RNDIS_DATAPIPE_IN);
+ Pipe_Unfreeze();
+
+ if (!(Pipe_IsReadWriteAllowed()))
+ {
+ Pipe_Freeze();
+ return;
+ }
+
+ LEDs_SetAllLEDs(LEDMASK_USB_BUSY);
+
+ puts_P(PSTR("DATA IN\r\n"));
+
+ uint16_t PacketSize;
+ if ((ErrorCode = RNDIS_GetPacketSize(&PacketSize)) != HOST_SENDCONTROL_Successful)
+ {
+ printf_P(PSTR(ESC_FG_RED "Packet Reception Error.\r\n"
+ " -- Error Code: %d\r\n" ESC_FG_WHITE), ErrorCode);
+ }
+ else if (PacketSize > 2048)
+ {
+ printf_P(PSTR(ESC_FG_RED "Packet of Size %d Too Large.\r\n" ESC_FG_WHITE), PacketSize);
+ Pipe_Discard_Stream(PacketSize);
+ }
+ else
+ {
+ uint8_t PacketBuffer[PacketSize];
+
+ Pipe_Read_Stream_LE(&PacketBuffer, PacketSize);
+
+ printf("***PACKET (Size %d)***\r\n", PacketSize);
+ for (uint16_t i = 0; i < PacketSize; i++)
+ {
+ printf("%02x ", PacketBuffer[i]);
+ }
+ printf("\r\n\r\n");
+ }
+
+ LEDs_SetAllLEDs(LEDMASK_USB_READY);
+
+ Pipe_ClearIN();
+ Pipe_Freeze();
+}
+
/** Task to set the configuration of the attached device after it has been enumerated, and to read in
* data received from the attached RNDIS device and print it to the serial port.
*/
@@ -181,7 +229,8 @@ void RNDIS_Host_Task(void)
printf_P(PSTR("Device Max Transfer Size: %lu bytes.\r\n"), InitMessageResponse.MaxTransferSize);
- uint32_t PacketFilter = 0xFFFFFFFF;
+ /* We set the default filter to only receive packets we would be interested in */
+ uint32_t PacketFilter = (RNDIS_PACKET_TYPE_DIRECTED | RNDIS_PACKET_TYPE_BROADCAST | RNDIS_PACKET_TYPE_ALL_MULTICAST);
if ((ErrorCode = RNDIS_SetRNDISProperty(OID_GEN_CURRENT_PACKET_FILTER,
&PacketFilter, sizeof(PacketFilter))) != HOST_SENDCONTROL_Successful)
{
@@ -195,13 +244,32 @@ void RNDIS_Host_Task(void)
USB_HostState = HOST_STATE_WaitForDeviceRemoval;
break;
}
+
+ uint32_t VendorID;
+ if ((ErrorCode = RNDIS_QueryRNDISProperty(OID_GEN_VENDOR_ID,
+ &VendorID, sizeof(VendorID))) != HOST_SENDCONTROL_Successful)
+ {
+ printf_P(PSTR(ESC_FG_RED "Error Getting Vendor ID.\r\n"
+ " -- Error Code: %d\r\n" ESC_FG_WHITE), ErrorCode);
+
+ /* Indicate error via status LEDs */
+ LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
+
+ /* Wait until USB device disconnected */
+ USB_HostState = HOST_STATE_WaitForDeviceRemoval;
+ break;
+ }
+
+ printf_P(PSTR("Device Vendor ID: 0x%08X\r\n"), VendorID);
puts_P(PSTR("RNDIS Device Enumerated.\r\n"));
USB_HostState = HOST_STATE_Configured;
break;
case HOST_STATE_Configured:
-
+ PrintIncommingPackets();
+
break;
}
}
+
diff --git a/Demos/Host/Incomplete/RNDISEthernetHost/RNDISEthernetHost.h b/Demos/Host/Incomplete/RNDISEthernetHost/RNDISEthernetHost.h
index caca9c60d..47e5c24d1 100644
--- a/Demos/Host/Incomplete/RNDISEthernetHost/RNDISEthernetHost.h
+++ b/Demos/Host/Incomplete/RNDISEthernetHost/RNDISEthernetHost.h
@@ -66,8 +66,25 @@
/** LED mask for the library LED driver, to indicate that an error has occurred in the USB interface. */
#define LEDMASK_USB_ERROR (LEDS_LED1 | LEDS_LED3)
+ /** LED mask for the library LED driver, to indicate that the USB interface is busy. */
+ #define LEDMASK_USB_BUSY (LEDS_LED2)
+
+ /* Type Defines: */
+ /** Type define for a RNDIS notification message, for transmission to the RNDIS host via the notification
+ * Endpoint.
+ */
+ typedef struct
+ {
+ uint8_t bmRequestType; /**< Notification type, a mask of values from SrdRequestType.h */
+ uint8_t bNotification; /**< Notification index, indicating what the RNDIS notification relates to */
+ uint16_t wValue; /**< Two byte notification value parameter */
+ uint16_t wIndex; /**< Two byte notification index parameter */
+ uint16_t wLength; /**< Size of data payload following the notification header */
+ } USB_Notification_t;
+
/* Function Prototypes: */
void SetupHardware(void);
+ void PrintIncommingPackets(void);
void RNDIS_Host_Task(void);
void EVENT_USB_Host_HostError(const uint8_t ErrorCode);