+/*\r
+ LUFA Library\r
+ Copyright (C) Dean Camera, 2009.\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
+ software without specific, written prior permission.\r
+\r
+ The author disclaim all warranties with regard to this\r
+ software, including all implied warranties of merchantability\r
+ and fitness. In no event shall the author be liable for any\r
+ special, indirect or consequential damages or any damages\r
+ whatsoever resulting from loss of use, data or profits, whether\r
+ in an action of contract, negligence or other tortious action,\r
+ arising out of or in connection with the use or performance of\r
+ this software.\r
+*/\r
+\r
+/** \file\r
+ *\r
+ * Header file for RNDIS.c.\r
+ */\r
+\r
+#ifndef _RNDIS_H_\r
+#define _RNDIS_H_\r
+\r
+ /* Includes: */\r
+ #include <avr/io.h>\r
+ #include <stdbool.h>\r
+ \r
+ #include "RNDISEthernet.h"\r
+ #include "RNDISConstants.h"\r
+ #include "Ethernet.h"\r
+\r
+ /* Macros: */\r
+ /** Physical MAC Address of the USB netowork adapter */\r
+ #define ADAPTER_MAC_ADDRESS {0x02, 0x00, 0x02, 0x00, 0x02, 0x00}\r
+ \r
+ /** Implemented RNDIS Version Major */\r
+ #define REMOTE_NDIS_VERSION_MAJOR 0x01\r
+\r
+ /** Implemented RNDIS Version Minor */\r
+ #define REMOTE_NDIS_VERSION_MINOR 0x00\r
+ \r
+ /** RNDIS request to issue a host-to-device NDIS command */\r
+ #define SEND_ENCAPSULATED_COMMAND 0x00\r
+\r
+ /** RNDIS request to issue a device-to-host NDIS response */\r
+ #define GET_ENCAPSULATED_RESPONSE 0x01\r
+ \r
+ /* Enums: */\r
+ /** Enum for the possible NDIS adapter states. */\r
+ enum RNDIS_States_t\r
+ {\r
+ RNDIS_Uninitialized = 0, /**< Adapter currently uninitialized */\r
+ RNDIS_Initialized = 1, /**< Adapter currently initialized but not ready for data transfers */\r
+ RNDIS_Data_Initialized = 2, /**< Adapter currently initialized and ready for data transfers */\r
+ };\r
+\r
+ /** Enum for the NDIS hardware states */\r
+ enum NDIS_Hardware_Status_t\r
+ {\r
+ NdisHardwareStatusReady, /**< Hardware Ready to accept commands from the host */\r
+ NdisHardwareStatusInitializing, /**< Hardware busy initializing */\r
+ NdisHardwareStatusReset, /**< Hardware reset */\r
+ NdisHardwareStatusClosing, /**< Hardware currently closing */\r
+ NdisHardwareStatusNotReady /**< Hardware not ready to accept commands from the host */\r
+ };\r
+\r
+ /* Type Defines: */\r
+ /** Type define for a RNDIS message header, sent before RNDIS messages */\r
+ typedef struct\r
+ {\r
+ uint32_t MessageType; /**< RNDIS message type, a REMOTE_NDIS_*_MSG constant */\r
+ uint32_t MessageLength; /**< Total length of the RNDIS message, in bytes */\r
+ } RNDIS_Message_Header_t;\r
+\r
+ /** Type define for a RNDIS packet message, used to encapsulate Ethernet packets sent to and from the adapter */\r
+ typedef struct\r
+ {\r
+ uint32_t MessageType;\r
+ uint32_t MessageLength;\r
+ uint32_t DataOffset;\r
+ uint32_t DataLength;\r
+ uint32_t OOBDataOffset;\r
+ uint32_t OOBDataLength;\r
+ uint32_t NumOOBDataElements;\r
+ uint32_t PerPacketInfoOffset;\r
+ uint32_t PerPacketInfoLength;\r
+ uint32_t VcHandle;\r
+ uint32_t Reserved;\r
+ } RNDIS_PACKET_MSG_t;\r
+ \r
+ /** Type define for a RNDIS Initialize command message */\r
+ typedef struct\r
+ {\r
+ uint32_t MessageType;\r
+ uint32_t MessageLength;\r
+ uint32_t RequestId;\r
+ \r
+ uint32_t MajorVersion;\r
+ uint32_t MinorVersion;\r
+ uint32_t MaxTransferSize;\r
+ } RNDIS_INITIALIZE_MSG_t;\r
+ \r
+ /** Type define for a RNDIS Initialize complete response message */\r
+ typedef struct\r
+ {\r
+ uint32_t MessageType;\r
+ uint32_t MessageLength;\r
+ uint32_t RequestId;\r
+ uint32_t Status;\r
+ \r
+ uint32_t MajorVersion;\r
+ uint32_t MinorVersion;\r
+ uint32_t DeviceFlags;\r
+ uint32_t Medium;\r
+ uint32_t MaxPacketsPerTransfer;\r
+ uint32_t MaxTransferSize;\r
+ uint32_t PacketAlignmentFactor;\r
+ uint32_t AFListOffset;\r
+ uint32_t AFListSize;\r
+ } RNDIS_INITIALIZE_CMPLT_t;\r
+ \r
+ /** Type define for a RNDIS Keepalive command message */\r
+ typedef struct\r
+ {\r
+ uint32_t MessageType;\r
+ uint32_t MessageLength;\r
+ uint32_t RequestId;\r
+ } RNDIS_KEEPALIVE_MSG_t;\r
+\r
+ /** Type define for a RNDIS Keepalive complete message */\r
+ typedef struct\r
+ {\r
+ uint32_t MessageType;\r
+ uint32_t MessageLength;\r
+ uint32_t RequestId;\r
+ uint32_t Status;\r
+ } RNDIS_KEEPALIVE_CMPLT_t;\r
+\r
+ /** Type define for a RNDIS Reset complete message */\r
+ typedef struct\r
+ {\r
+ uint32_t MessageType;\r
+ uint32_t MessageLength;\r
+ uint32_t Status;\r
+\r
+ uint32_t AddressingReset;\r
+ } RNDIS_RESET_CMPLT_t;\r
+ \r
+ /** Type define for a RNDIS Set command message */\r
+ typedef struct\r
+ {\r
+ uint32_t MessageType;\r
+ uint32_t MessageLength;\r
+ uint32_t RequestId;\r
+ \r
+ uint32_t Oid;\r
+ uint32_t InformationBufferLength;\r
+ uint32_t InformationBufferOffset;\r
+ uint32_t DeviceVcHandle;\r
+ } RNDIS_SET_MSG_t;\r
+\r
+ /** Type define for a RNDIS Set complete response message */\r
+ typedef struct\r
+ {\r
+ uint32_t MessageType;\r
+ uint32_t MessageLength;\r
+ uint32_t RequestId;\r
+ uint32_t Status;\r
+ } RNDIS_SET_CMPLT_t;\r
+ \r
+ /** Type define for a RNDIS Query command message */\r
+ typedef struct\r
+ {\r
+ uint32_t MessageType;\r
+ uint32_t MessageLength;\r
+ uint32_t RequestId;\r
+ \r
+ uint32_t Oid;\r
+ uint32_t InformationBufferLength;\r
+ uint32_t InformationBufferOffset;\r
+ uint32_t DeviceVcHandle;\r
+ } RNDIS_QUERY_MSG_t;\r
+ \r
+ /** Type define for a RNDIS Query complete response message */\r
+ typedef struct\r
+ {\r
+ uint32_t MessageType;\r
+ uint32_t MessageLength;\r
+ uint32_t RequestId;\r
+ uint32_t Status;\r
+ \r
+ uint32_t InformationBufferLength;\r
+ uint32_t InformationBufferOffset;\r
+ } RNDIS_QUERY_CMPLT_t;\r
+ \r
+ /* External Variables: */\r
+ extern uint8_t RNDISMessageBuffer[];\r
+ extern RNDIS_Message_Header_t* MessageHeader;\r
+ extern bool ResponseReady;\r
+ extern uint8_t CurrRNDISState;\r
+\r
+ /* Function Prototypes: */\r
+ void ProcessRNDISControlMessage(void);\r
+\r
+ #if defined(INCLUDE_FROM_RNDIS_C)\r
+ static bool ProcessNDISQuery(uint32_t OId, void* QueryData, uint16_t QuerySize,\r
+ void* ResponseData, uint16_t* ResponseSize);\r
+ static bool ProcessNDISSet(uint32_t OId, void* SetData, uint16_t SetSize); \r
+ #endif\r
+ \r
+#endif\r