+/*\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
+#define INCLUDE_FROM_RNDIS_CLASS_C\r
+#include "RNDIS.h"\r
+\r
+static const uint32_t PROGMEM AdapterSupportedOIDList[] =\r
+ {\r
+ OID_GEN_SUPPORTED_LIST,\r
+ OID_GEN_PHYSICAL_MEDIUM,\r
+ OID_GEN_HARDWARE_STATUS,\r
+ OID_GEN_MEDIA_SUPPORTED,\r
+ OID_GEN_MEDIA_IN_USE,\r
+ OID_GEN_MAXIMUM_FRAME_SIZE,\r
+ OID_GEN_MAXIMUM_TOTAL_SIZE,\r
+ OID_GEN_LINK_SPEED,\r
+ OID_GEN_TRANSMIT_BLOCK_SIZE,\r
+ OID_GEN_RECEIVE_BLOCK_SIZE,\r
+ OID_GEN_VENDOR_ID,\r
+ OID_GEN_VENDOR_DESCRIPTION,\r
+ OID_GEN_CURRENT_PACKET_FILTER,\r
+ OID_GEN_MAXIMUM_TOTAL_SIZE,\r
+ OID_GEN_MEDIA_CONNECT_STATUS,\r
+ OID_GEN_XMIT_OK,\r
+ OID_GEN_RCV_OK,\r
+ OID_GEN_XMIT_ERROR,\r
+ OID_GEN_RCV_ERROR,\r
+ OID_GEN_RCV_NO_BUFFER,\r
+ OID_802_3_PERMANENT_ADDRESS,\r
+ OID_802_3_CURRENT_ADDRESS,\r
+ OID_802_3_MULTICAST_LIST,\r
+ OID_802_3_MAXIMUM_LIST_SIZE,\r
+ OID_802_3_RCV_ERROR_ALIGNMENT,\r
+ OID_802_3_XMIT_ONE_COLLISION,\r
+ OID_802_3_XMIT_MORE_COLLISIONS,\r
+ };\r
+\r
+void USB_RNDIS_ProcessControlPacket(USB_ClassInfo_RNDIS_t* RNDISInterfaceInfo)\r
+{\r
+ if (!(Endpoint_IsSETUPReceived()))\r
+ return;\r
+ \r
+ if (USB_ControlRequest.wIndex != RNDISInterfaceInfo->ControlInterfaceNumber)\r
+ return;\r
+\r
+ switch (USB_ControlRequest.bRequest)\r
+ {\r
+ case REQ_SendEncapsulatedCommand:\r
+ if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))\r
+ {\r
+ Endpoint_ClearSETUP();\r
+\r
+ Endpoint_Read_Control_Stream_LE(RNDISInterfaceInfo->RNDISMessageBuffer, USB_ControlRequest.wLength);\r
+ Endpoint_ClearIN();\r
+\r
+ USB_RNDIS_ProcessRNDISControlMessage(RNDISInterfaceInfo);\r
+ }\r
+ \r
+ break;\r
+ case REQ_GetEncapsulatedResponse:\r
+ if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))\r
+ {\r
+ Endpoint_ClearSETUP();\r
+\r
+ RNDIS_Message_Header_t* MessageHeader = (RNDIS_Message_Header_t*)&RNDISInterfaceInfo->RNDISMessageBuffer;\r
+\r
+ if (!(MessageHeader->MessageLength))\r
+ {\r
+ RNDISInterfaceInfo->RNDISMessageBuffer[0] = 0;\r
+ MessageHeader->MessageLength = 1;\r
+ }\r
+\r
+ Endpoint_Write_Control_Stream_LE(RNDISInterfaceInfo->RNDISMessageBuffer, MessageHeader->MessageLength); \r
+ Endpoint_ClearOUT();\r
+\r
+ MessageHeader->MessageLength = 0;\r
+ }\r
+ \r
+ break;\r
+ }\r
+}\r
+\r
+bool USB_RNDIS_ConfigureEndpoints(USB_ClassInfo_RNDIS_t* RNDISInterfaceInfo)\r
+{\r
+ if (!(Endpoint_ConfigureEndpoint(RNDISInterfaceInfo->DataINEndpointNumber, EP_TYPE_BULK,\r
+ ENDPOINT_DIR_IN, RNDISInterfaceInfo->DataINEndpointSize,\r
+ ENDPOINT_BANK_SINGLE)))\r
+ {\r
+ return false;\r
+ }\r
+\r
+ if (!(Endpoint_ConfigureEndpoint(RNDISInterfaceInfo->DataOUTEndpointNumber, EP_TYPE_BULK,\r
+ ENDPOINT_DIR_OUT, RNDISInterfaceInfo->DataOUTEndpointSize,\r
+ ENDPOINT_BANK_SINGLE)))\r
+ {\r
+ return false;\r
+ }\r
+\r
+ if (!(Endpoint_ConfigureEndpoint(RNDISInterfaceInfo->NotificationEndpointNumber, EP_TYPE_INTERRUPT,\r
+ ENDPOINT_DIR_IN, RNDISInterfaceInfo->NotificationEndpointSize,\r
+ ENDPOINT_BANK_SINGLE)))\r
+ {\r
+ return false;\r
+ }\r
+\r
+ return true;\r
+}\r
+\r
+void USB_RNDIS_USBTask(USB_ClassInfo_RNDIS_t* RNDISInterfaceInfo)\r
+{\r
+ if (!(USB_IsConnected))\r
+ return;\r
+\r
+ RNDIS_Message_Header_t* MessageHeader = (RNDIS_Message_Header_t*)&RNDISInterfaceInfo->RNDISMessageBuffer;\r
+\r
+ Endpoint_SelectEndpoint(RNDISInterfaceInfo->NotificationEndpointNumber);\r
+\r
+ if (Endpoint_IsINReady() && RNDISInterfaceInfo->ResponseReady)\r
+ {\r
+ USB_Request_Header_t Notification = (USB_Request_Header_t)\r
+ {\r
+ .bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE),\r
+ .bRequest = NOTIF_ResponseAvailable,\r
+ .wValue = 0,\r
+ .wIndex = 0,\r
+ .wLength = 0,\r
+ };\r
+ \r
+ Endpoint_Write_Stream_LE(&Notification, sizeof(Notification), NO_STREAM_CALLBACK);\r
+\r
+ Endpoint_ClearIN();\r
+\r
+ RNDISInterfaceInfo->ResponseReady = false;\r
+ }\r
+ \r
+ if ((RNDISInterfaceInfo->CurrRNDISState == RNDIS_Data_Initialized) && !(MessageHeader->MessageLength))\r
+ {\r
+ RNDIS_PACKET_MSG_t RNDISPacketHeader;\r
+\r
+ Endpoint_SelectEndpoint(RNDISInterfaceInfo->DataOUTEndpointNumber);\r
+\r
+ if (Endpoint_IsOUTReceived() && !(RNDISInterfaceInfo->FrameIN.FrameInBuffer))\r
+ {\r
+ Endpoint_Read_Stream_LE(&RNDISPacketHeader, sizeof(RNDIS_PACKET_MSG_t), NO_STREAM_CALLBACK);\r
+\r
+ if (RNDISPacketHeader.DataLength > ETHERNET_FRAME_SIZE_MAX)\r
+ {\r
+ Endpoint_StallTransaction();\r
+ return;\r
+ }\r
+ \r
+ Endpoint_Read_Stream_LE(RNDISInterfaceInfo->FrameIN.FrameData, RNDISPacketHeader.DataLength, NO_STREAM_CALLBACK);\r
+\r
+ Endpoint_ClearOUT();\r
+ \r
+ RNDISInterfaceInfo->FrameIN.FrameLength = RNDISPacketHeader.DataLength;\r
+\r
+ RNDISInterfaceInfo->FrameIN.FrameInBuffer = true;\r
+ }\r
+ \r
+ Endpoint_SelectEndpoint(RNDISInterfaceInfo->DataINEndpointNumber);\r
+ \r
+ if (Endpoint_IsINReady() && RNDISInterfaceInfo->FrameOUT.FrameInBuffer)\r
+ {\r
+ memset(&RNDISPacketHeader, 0, sizeof(RNDIS_PACKET_MSG_t));\r
+\r
+ RNDISPacketHeader.MessageType = REMOTE_NDIS_PACKET_MSG;\r
+ RNDISPacketHeader.MessageLength = (sizeof(RNDIS_PACKET_MSG_t) + RNDISInterfaceInfo->FrameOUT.FrameLength);\r
+ RNDISPacketHeader.DataOffset = (sizeof(RNDIS_PACKET_MSG_t) - sizeof(RNDIS_Message_Header_t));\r
+ RNDISPacketHeader.DataLength = RNDISInterfaceInfo->FrameOUT.FrameLength;\r
+\r
+ Endpoint_Write_Stream_LE(&RNDISPacketHeader, sizeof(RNDIS_PACKET_MSG_t), NO_STREAM_CALLBACK);\r
+ Endpoint_Write_Stream_LE(RNDISInterfaceInfo->FrameOUT.FrameData, RNDISPacketHeader.DataLength, NO_STREAM_CALLBACK);\r
+ Endpoint_ClearIN();\r
+ \r
+ RNDISInterfaceInfo->FrameOUT.FrameInBuffer = false;\r
+ }\r
+ }\r
+} \r
+\r
+void USB_RNDIS_ProcessRNDISControlMessage(USB_ClassInfo_RNDIS_t* RNDISInterfaceInfo)\r
+{\r
+ /* Note: Only a single buffer is used for both the received message and its response to save SRAM. Because of\r
+ this, response bytes should be filled in order so that they do not clobber unread data in the buffer. */\r
+\r
+ RNDIS_Message_Header_t* MessageHeader = (RNDIS_Message_Header_t*)&RNDISInterfaceInfo->RNDISMessageBuffer;\r
+\r
+ switch (MessageHeader->MessageType)\r
+ {\r
+ case REMOTE_NDIS_INITIALIZE_MSG:\r
+ RNDISInterfaceInfo->ResponseReady = true;\r
+ \r
+ RNDIS_INITIALIZE_MSG_t* INITIALIZE_Message = (RNDIS_INITIALIZE_MSG_t*)&RNDISInterfaceInfo->RNDISMessageBuffer;\r
+ RNDIS_INITIALIZE_CMPLT_t* INITIALIZE_Response = (RNDIS_INITIALIZE_CMPLT_t*)&RNDISInterfaceInfo->RNDISMessageBuffer;\r
+ \r
+ INITIALIZE_Response->MessageType = REMOTE_NDIS_INITIALIZE_CMPLT;\r
+ INITIALIZE_Response->MessageLength = sizeof(RNDIS_INITIALIZE_CMPLT_t);\r
+ INITIALIZE_Response->RequestId = INITIALIZE_Message->RequestId;\r
+ INITIALIZE_Response->Status = REMOTE_NDIS_STATUS_SUCCESS;\r
+ \r
+ INITIALIZE_Response->MajorVersion = REMOTE_NDIS_VERSION_MAJOR;\r
+ INITIALIZE_Response->MinorVersion = REMOTE_NDIS_VERSION_MINOR; \r
+ INITIALIZE_Response->DeviceFlags = REMOTE_NDIS_DF_CONNECTIONLESS;\r
+ INITIALIZE_Response->Medium = REMOTE_NDIS_MEDIUM_802_3;\r
+ INITIALIZE_Response->MaxPacketsPerTransfer = 1;\r
+ INITIALIZE_Response->MaxTransferSize = (sizeof(RNDIS_PACKET_MSG_t) + ETHERNET_FRAME_SIZE_MAX);\r
+ INITIALIZE_Response->PacketAlignmentFactor = 0;\r
+ INITIALIZE_Response->AFListOffset = 0;\r
+ INITIALIZE_Response->AFListSize = 0;\r
+ \r
+ RNDISInterfaceInfo->CurrRNDISState = RNDIS_Initialized;\r
+ \r
+ break;\r
+ case REMOTE_NDIS_HALT_MSG:\r
+ RNDISInterfaceInfo->ResponseReady = false;\r
+ MessageHeader->MessageLength = 0;\r
+\r
+ RNDISInterfaceInfo->CurrRNDISState = RNDIS_Uninitialized;\r
+\r
+ break;\r
+ case REMOTE_NDIS_QUERY_MSG:\r
+ RNDISInterfaceInfo->ResponseReady = true;\r
+ \r
+ RNDIS_QUERY_MSG_t* QUERY_Message = (RNDIS_QUERY_MSG_t*)&RNDISInterfaceInfo->RNDISMessageBuffer;\r
+ RNDIS_QUERY_CMPLT_t* QUERY_Response = (RNDIS_QUERY_CMPLT_t*)&RNDISInterfaceInfo->RNDISMessageBuffer;\r
+ uint32_t Query_Oid = QUERY_Message->Oid;\r
+ \r
+ void* QueryData = &RNDISInterfaceInfo->RNDISMessageBuffer[sizeof(RNDIS_Message_Header_t) +\r
+ QUERY_Message->InformationBufferOffset];\r
+ void* ResponseData = &RNDISInterfaceInfo->RNDISMessageBuffer[sizeof(RNDIS_QUERY_CMPLT_t)]; \r
+ uint16_t ResponseSize;\r
+\r
+ QUERY_Response->MessageType = REMOTE_NDIS_QUERY_CMPLT;\r
+ QUERY_Response->MessageLength = sizeof(RNDIS_QUERY_CMPLT_t);\r
+ \r
+ if (USB_RNDIS_ProcessNDISQuery(RNDISInterfaceInfo, Query_Oid, QueryData, QUERY_Message->InformationBufferLength,\r
+ ResponseData, &ResponseSize))\r
+ {\r
+ QUERY_Response->Status = REMOTE_NDIS_STATUS_SUCCESS;\r
+ QUERY_Response->MessageLength += ResponseSize;\r
+ \r
+ QUERY_Response->InformationBufferLength = ResponseSize;\r
+ QUERY_Response->InformationBufferOffset = (sizeof(RNDIS_QUERY_CMPLT_t) - sizeof(RNDIS_Message_Header_t));\r
+ }\r
+ else\r
+ { \r
+ QUERY_Response->Status = REMOTE_NDIS_STATUS_NOT_SUPPORTED;\r
+\r
+ QUERY_Response->InformationBufferLength = 0;\r
+ QUERY_Response->InformationBufferOffset = 0;\r
+ }\r
+ \r
+ break;\r
+ case REMOTE_NDIS_SET_MSG:\r
+ RNDISInterfaceInfo->ResponseReady = true;\r
+ \r
+ RNDIS_SET_MSG_t* SET_Message = (RNDIS_SET_MSG_t*)&RNDISInterfaceInfo->RNDISMessageBuffer;\r
+ RNDIS_SET_CMPLT_t* SET_Response = (RNDIS_SET_CMPLT_t*)&RNDISInterfaceInfo->RNDISMessageBuffer;\r
+ uint32_t SET_Oid = SET_Message->Oid;\r
+\r
+ SET_Response->MessageType = REMOTE_NDIS_SET_CMPLT;\r
+ SET_Response->MessageLength = sizeof(RNDIS_SET_CMPLT_t);\r
+ SET_Response->RequestId = SET_Message->RequestId;\r
+\r
+ void* SetData = &RNDISInterfaceInfo->RNDISMessageBuffer[sizeof(RNDIS_Message_Header_t) +\r
+ SET_Message->InformationBufferOffset];\r
+ \r
+ if (USB_RNDIS_ProcessNDISSet(RNDISInterfaceInfo, SET_Oid, SetData, SET_Message->InformationBufferLength))\r
+ SET_Response->Status = REMOTE_NDIS_STATUS_SUCCESS;\r
+ else\r
+ SET_Response->Status = REMOTE_NDIS_STATUS_NOT_SUPPORTED;\r
+\r
+ break;\r
+ case REMOTE_NDIS_RESET_MSG:\r
+ RNDISInterfaceInfo->ResponseReady = true;\r
+ \r
+ RNDIS_RESET_CMPLT_t* RESET_Response = (RNDIS_RESET_CMPLT_t*)&RNDISInterfaceInfo->RNDISMessageBuffer;\r
+\r
+ RESET_Response->MessageType = REMOTE_NDIS_RESET_CMPLT;\r
+ RESET_Response->MessageLength = sizeof(RNDIS_RESET_CMPLT_t);\r
+ RESET_Response->Status = REMOTE_NDIS_STATUS_SUCCESS;\r
+ RESET_Response->AddressingReset = 0;\r
+\r
+ break;\r
+ case REMOTE_NDIS_KEEPALIVE_MSG:\r
+ RNDISInterfaceInfo->ResponseReady = true;\r
+ \r
+ RNDIS_KEEPALIVE_MSG_t* KEEPALIVE_Message = (RNDIS_KEEPALIVE_MSG_t*)&RNDISInterfaceInfo->RNDISMessageBuffer;\r
+ RNDIS_KEEPALIVE_CMPLT_t* KEEPALIVE_Response = (RNDIS_KEEPALIVE_CMPLT_t*)&RNDISInterfaceInfo->RNDISMessageBuffer;\r
+\r
+ KEEPALIVE_Response->MessageType = REMOTE_NDIS_KEEPALIVE_CMPLT;\r
+ KEEPALIVE_Response->MessageLength = sizeof(RNDIS_KEEPALIVE_CMPLT_t);\r
+ KEEPALIVE_Response->RequestId = KEEPALIVE_Message->RequestId;\r
+ KEEPALIVE_Response->Status = REMOTE_NDIS_STATUS_SUCCESS;\r
+ \r
+ break;\r
+ }\r
+}\r
+\r
+static bool USB_RNDIS_ProcessNDISQuery(USB_ClassInfo_RNDIS_t* RNDISInterfaceInfo,\r
+ uint32_t OId, void* QueryData, uint16_t QuerySize,\r
+ void* ResponseData, uint16_t* ResponseSize)\r
+{\r
+ switch (OId)\r
+ {\r
+ case OID_GEN_SUPPORTED_LIST:\r
+ *ResponseSize = sizeof(AdapterSupportedOIDList);\r
+ \r
+ memcpy_P(ResponseData, AdapterSupportedOIDList, sizeof(AdapterSupportedOIDList));\r
+ \r
+ return true;\r
+ case OID_GEN_PHYSICAL_MEDIUM:\r
+ *ResponseSize = sizeof(uint32_t);\r
+ \r
+ /* Indicate that the device is a true ethernet link */\r
+ *((uint32_t*)ResponseData) = 0;\r
+ \r
+ return true;\r
+ case OID_GEN_HARDWARE_STATUS:\r
+ *ResponseSize = sizeof(uint32_t);\r
+ \r
+ *((uint32_t*)ResponseData) = NdisHardwareStatusReady;\r
+ \r
+ return true;\r
+ case OID_GEN_MEDIA_SUPPORTED:\r
+ case OID_GEN_MEDIA_IN_USE:\r
+ *ResponseSize = sizeof(uint32_t);\r
+ \r
+ *((uint32_t*)ResponseData) = REMOTE_NDIS_MEDIUM_802_3;\r
+ \r
+ return true;\r
+ case OID_GEN_VENDOR_ID:\r
+ *ResponseSize = sizeof(uint32_t);\r
+ \r
+ /* Vendor ID 0x0xFFFFFF is reserved for vendors who have not purchased a NDIS VID */\r
+ *((uint32_t*)ResponseData) = 0x00FFFFFF;\r
+ \r
+ return true;\r
+ case OID_GEN_MAXIMUM_FRAME_SIZE:\r
+ case OID_GEN_TRANSMIT_BLOCK_SIZE:\r
+ case OID_GEN_RECEIVE_BLOCK_SIZE:\r
+ *ResponseSize = sizeof(uint32_t);\r
+ \r
+ *((uint32_t*)ResponseData) = ETHERNET_FRAME_SIZE_MAX;\r
+ \r
+ return true;\r
+ case OID_GEN_VENDOR_DESCRIPTION:\r
+ *ResponseSize = (strlen(RNDISInterfaceInfo->AdapterVendorDescription) + 1);\r
+ \r
+ memcpy(ResponseData, RNDISInterfaceInfo->AdapterVendorDescription, *ResponseSize);\r
+ \r
+ return true;\r
+ case OID_GEN_MEDIA_CONNECT_STATUS:\r
+ *ResponseSize = sizeof(uint32_t);\r
+ \r
+ *((uint32_t*)ResponseData) = REMOTE_NDIS_MEDIA_STATE_CONNECTED;\r
+ \r
+ return true;\r
+ case OID_GEN_LINK_SPEED:\r
+ *ResponseSize = sizeof(uint32_t);\r
+ \r
+ /* Indicate 10Mb/s link speed */\r
+ *((uint32_t*)ResponseData) = 100000;\r
+\r
+ return true;\r
+ case OID_802_3_PERMANENT_ADDRESS:\r
+ case OID_802_3_CURRENT_ADDRESS:\r
+ *ResponseSize = sizeof(MAC_Address_t);\r
+ \r
+ memcpy(ResponseData, &RNDISInterfaceInfo->AdapterMACAddress, sizeof(MAC_Address_t));\r
+\r
+ return true;\r
+ case OID_802_3_MAXIMUM_LIST_SIZE:\r
+ *ResponseSize = sizeof(uint32_t);\r
+ \r
+ /* Indicate only one multicast address supported */\r
+ *((uint32_t*)ResponseData) = 1;\r
+ \r
+ return true;\r
+ case OID_GEN_CURRENT_PACKET_FILTER:\r
+ *ResponseSize = sizeof(uint32_t);\r
+ \r
+ *((uint32_t*)ResponseData) = RNDISInterfaceInfo->CurrPacketFilter;\r
+ \r
+ return true; \r
+ case OID_GEN_XMIT_OK:\r
+ case OID_GEN_RCV_OK:\r
+ case OID_GEN_XMIT_ERROR:\r
+ case OID_GEN_RCV_ERROR:\r
+ case OID_GEN_RCV_NO_BUFFER:\r
+ case OID_802_3_RCV_ERROR_ALIGNMENT:\r
+ case OID_802_3_XMIT_ONE_COLLISION:\r
+ case OID_802_3_XMIT_MORE_COLLISIONS:\r
+ *ResponseSize = sizeof(uint32_t);\r
+ \r
+ /* Unused statistic OIDs - always return 0 for each */\r
+ *((uint32_t*)ResponseData) = 0;\r
+ \r
+ return true;\r
+ case OID_GEN_MAXIMUM_TOTAL_SIZE:\r
+ *ResponseSize = sizeof(uint32_t);\r
+ \r
+ /* Indicate maximum overall buffer (Ethernet frame and RNDIS header) the adapter can handle */\r
+ *((uint32_t*)ResponseData) = (RNDIS_MESSAGE_BUFFER_SIZE + ETHERNET_FRAME_SIZE_MAX);\r
+ \r
+ return true;\r
+ default:\r
+ return false;\r
+ }\r
+}\r
+\r
+static bool USB_RNDIS_ProcessNDISSet(USB_ClassInfo_RNDIS_t* RNDISInterfaceInfo, uint32_t OId, void* SetData, uint16_t SetSize)\r
+{\r
+ switch (OId)\r
+ {\r
+ case OID_GEN_CURRENT_PACKET_FILTER:\r
+ RNDISInterfaceInfo->CurrPacketFilter = *((uint32_t*)SetData);\r
+ RNDISInterfaceInfo->CurrRNDISState = ((RNDISInterfaceInfo->CurrPacketFilter) ?\r
+ RNDIS_Data_Initialized : RNDIS_Data_Initialized);\r
+ \r
+ return true;\r
+ case OID_802_3_MULTICAST_LIST:\r
+ /* Do nothing - throw away the value from the host as it is unused */\r
+ \r
+ return true;\r
+ default:\r
+ return false;\r
+ }\r
+}\r