3      Copyright (C) Dean Camera, 2010. 
   5   dean [at] fourwalledcubicle [dot] com 
   6       www.fourwalledcubicle.com 
  10   Copyright 2010  Dean Camera (dean [at] fourwalledcubicle [dot] com) 
  12   Permission to use, copy, modify, distribute, and sell this  
  13   software and its documentation for any purpose is hereby granted 
  14   without fee, provided that the above copyright notice appear in  
  15   all copies and that both that the copyright notice and this 
  16   permission notice and warranty disclaimer appear in supporting  
  17   documentation, and that the name of the author not be used in  
  18   advertising or publicity pertaining to distribution of the  
  19   software without specific, written prior permission. 
  21   The author disclaim all warranties with regard to this 
  22   software, including all implied warranties of merchantability 
  23   and fitness.  In no event shall the author be liable for any 
  24   special, indirect or consequential damages or any damages 
  25   whatsoever resulting from loss of use, data or profits, whether 
  26   in an action of contract, negligence or other tortious action, 
  27   arising out of or in connection with the use or performance of 
  31 #define  __INCLUDE_FROM_USB_DRIVER 
  32 #include "../../HighLevel/USBMode.h" 
  33 #if defined(USB_CAN_BE_DEVICE) 
  35 #define  __INCLUDE_FROM_RNDIS_CLASS_DEVICE_C 
  36 #define  __INCLUDE_FROM_RNDIS_DRIVER 
  39 static const uint32_t PROGMEM AdapterSupportedOIDList
[]  = 
  41                 OID_GEN_SUPPORTED_LIST
, 
  42                 OID_GEN_PHYSICAL_MEDIUM
, 
  43                 OID_GEN_HARDWARE_STATUS
, 
  44                 OID_GEN_MEDIA_SUPPORTED
, 
  46                 OID_GEN_MAXIMUM_FRAME_SIZE
, 
  47                 OID_GEN_MAXIMUM_TOTAL_SIZE
, 
  49                 OID_GEN_TRANSMIT_BLOCK_SIZE
, 
  50                 OID_GEN_RECEIVE_BLOCK_SIZE
, 
  52                 OID_GEN_VENDOR_DESCRIPTION
, 
  53                 OID_GEN_CURRENT_PACKET_FILTER
, 
  54                 OID_GEN_MAXIMUM_TOTAL_SIZE
, 
  55                 OID_GEN_MEDIA_CONNECT_STATUS
, 
  60                 OID_GEN_RCV_NO_BUFFER
, 
  61                 OID_802_3_PERMANENT_ADDRESS
, 
  62                 OID_802_3_CURRENT_ADDRESS
, 
  63                 OID_802_3_MULTICAST_LIST
, 
  64                 OID_802_3_MAXIMUM_LIST_SIZE
, 
  65                 OID_802_3_RCV_ERROR_ALIGNMENT
, 
  66                 OID_802_3_XMIT_ONE_COLLISION
, 
  67                 OID_802_3_XMIT_MORE_COLLISIONS
, 
  70 void RNDIS_Device_ProcessControlRequest(USB_ClassInfo_RNDIS_Device_t
* const RNDISInterfaceInfo
) 
  72         if (!(Endpoint_IsSETUPReceived())) 
  75         if (USB_ControlRequest
.wIndex 
!= RNDISInterfaceInfo
->Config
.ControlInterfaceNumber
) 
  78         switch (USB_ControlRequest
.bRequest
) 
  80                 case REQ_SendEncapsulatedCommand
: 
  81                         if (USB_ControlRequest
.bmRequestType 
== (REQDIR_HOSTTODEVICE 
| REQTYPE_CLASS 
| REQREC_INTERFACE
)) 
  83                                 Endpoint_ClearSETUP(); 
  85                                 Endpoint_Read_Control_Stream_LE(RNDISInterfaceInfo
->State
.RNDISMessageBuffer
, USB_ControlRequest
.wLength
); 
  88                                 RNDIS_Device_ProcessRNDISControlMessage(RNDISInterfaceInfo
); 
  92                 case REQ_GetEncapsulatedResponse
: 
  93                         if (USB_ControlRequest
.bmRequestType 
== (REQDIR_DEVICETOHOST 
| REQTYPE_CLASS 
| REQREC_INTERFACE
)) 
  95                                 Endpoint_ClearSETUP(); 
  97                                 RNDIS_Message_Header_t
* MessageHeader 
= (RNDIS_Message_Header_t
*)&RNDISInterfaceInfo
->State
.RNDISMessageBuffer
; 
  99                                 if (!(MessageHeader
->MessageLength
)) 
 101                                         RNDISInterfaceInfo
->State
.RNDISMessageBuffer
[0] = 0; 
 102                                         MessageHeader
->MessageLength 
= 1; 
 105                                 Endpoint_Write_Control_Stream_LE(RNDISInterfaceInfo
->State
.RNDISMessageBuffer
, MessageHeader
->MessageLength
);                            
 108                                 MessageHeader
->MessageLength 
= 0; 
 115 bool RNDIS_Device_ConfigureEndpoints(USB_ClassInfo_RNDIS_Device_t
* const RNDISInterfaceInfo
) 
 117         memset(&RNDISInterfaceInfo
->State
, 0x00, sizeof(RNDISInterfaceInfo
->State
)); 
 119         if (!(Endpoint_ConfigureEndpoint(RNDISInterfaceInfo
->Config
.DataINEndpointNumber
, EP_TYPE_BULK
, 
 120                                                                  ENDPOINT_DIR_IN
, RNDISInterfaceInfo
->Config
.DataINEndpointSize
, 
 121                                                                  RNDISInterfaceInfo
->Config
.DataINEndpointDoubleBank ? ENDPOINT_BANK_DOUBLE 
: ENDPOINT_BANK_SINGLE
))) 
 126         if (!(Endpoint_ConfigureEndpoint(RNDISInterfaceInfo
->Config
.DataOUTEndpointNumber
, EP_TYPE_BULK
, 
 127                                          ENDPOINT_DIR_OUT
, RNDISInterfaceInfo
->Config
.DataOUTEndpointSize
, 
 128                                          RNDISInterfaceInfo
->Config
.DataOUTEndpointDoubleBank ? ENDPOINT_BANK_DOUBLE 
: ENDPOINT_BANK_SINGLE
))) 
 133         if (!(Endpoint_ConfigureEndpoint(RNDISInterfaceInfo
->Config
.NotificationEndpointNumber
, EP_TYPE_INTERRUPT
, 
 134                                          ENDPOINT_DIR_IN
, RNDISInterfaceInfo
->Config
.NotificationEndpointSize
, 
 135                                          RNDISInterfaceInfo
->Config
.NotificationEndpointDoubleBank ? ENDPOINT_BANK_DOUBLE 
: ENDPOINT_BANK_SINGLE
))) 
 143 void RNDIS_Device_USBTask(USB_ClassInfo_RNDIS_Device_t
* const RNDISInterfaceInfo
) 
 145         if (USB_DeviceState 
!= DEVICE_STATE_Configured
) 
 148         RNDIS_Message_Header_t
* MessageHeader 
= (RNDIS_Message_Header_t
*)&RNDISInterfaceInfo
->State
.RNDISMessageBuffer
; 
 150         Endpoint_SelectEndpoint(RNDISInterfaceInfo
->Config
.NotificationEndpointNumber
); 
 152         if (Endpoint_IsINReady() && RNDISInterfaceInfo
->State
.ResponseReady
) 
 154                 USB_Request_Header_t Notification 
= (USB_Request_Header_t
) 
 156                                 .bmRequestType 
= (REQDIR_DEVICETOHOST 
| REQTYPE_CLASS 
| REQREC_INTERFACE
), 
 157                                 .bRequest      
= NOTIF_ResponseAvailable
, 
 163                 Endpoint_Write_Stream_LE(&Notification
, sizeof(USB_Request_Header_t
), NO_STREAM_CALLBACK
); 
 167                 RNDISInterfaceInfo
->State
.ResponseReady 
= false; 
 170         if ((RNDISInterfaceInfo
->State
.CurrRNDISState 
== RNDIS_Data_Initialized
) && !(MessageHeader
->MessageLength
)) 
 172                 RNDIS_Packet_Message_t RNDISPacketHeader
; 
 174                 Endpoint_SelectEndpoint(RNDISInterfaceInfo
->Config
.DataOUTEndpointNumber
); 
 176                 if (Endpoint_IsOUTReceived() && !(RNDISInterfaceInfo
->State
.FrameIN
.FrameInBuffer
)) 
 178                         Endpoint_Read_Stream_LE(&RNDISPacketHeader
, sizeof(RNDIS_Packet_Message_t
), NO_STREAM_CALLBACK
); 
 180                         if (RNDISPacketHeader
.DataLength 
> ETHERNET_FRAME_SIZE_MAX
) 
 182                                 Endpoint_StallTransaction(); 
 186                         Endpoint_Read_Stream_LE(RNDISInterfaceInfo
->State
.FrameIN
.FrameData
, RNDISPacketHeader
.DataLength
, NO_STREAM_CALLBACK
); 
 190                         RNDISInterfaceInfo
->State
.FrameIN
.FrameLength 
= RNDISPacketHeader
.DataLength
; 
 192                         RNDISInterfaceInfo
->State
.FrameIN
.FrameInBuffer 
= true; 
 195                 Endpoint_SelectEndpoint(RNDISInterfaceInfo
->Config
.DataINEndpointNumber
); 
 197                 if (Endpoint_IsINReady() && RNDISInterfaceInfo
->State
.FrameOUT
.FrameInBuffer
) 
 199                         memset(&RNDISPacketHeader
, 0, sizeof(RNDIS_Packet_Message_t
)); 
 201                         RNDISPacketHeader
.MessageType   
= REMOTE_NDIS_PACKET_MSG
; 
 202                         RNDISPacketHeader
.MessageLength 
= (sizeof(RNDIS_Packet_Message_t
) + RNDISInterfaceInfo
->State
.FrameOUT
.FrameLength
); 
 203                         RNDISPacketHeader
.DataOffset    
= (sizeof(RNDIS_Packet_Message_t
) - sizeof(RNDIS_Message_Header_t
)); 
 204                         RNDISPacketHeader
.DataLength    
= RNDISInterfaceInfo
->State
.FrameOUT
.FrameLength
; 
 206                         Endpoint_Write_Stream_LE(&RNDISPacketHeader
, sizeof(RNDIS_Packet_Message_t
), NO_STREAM_CALLBACK
); 
 207                         Endpoint_Write_Stream_LE(RNDISInterfaceInfo
->State
.FrameOUT
.FrameData
, RNDISPacketHeader
.DataLength
, NO_STREAM_CALLBACK
); 
 210                         RNDISInterfaceInfo
->State
.FrameOUT
.FrameInBuffer 
= false; 
 215 void RNDIS_Device_ProcessRNDISControlMessage(USB_ClassInfo_RNDIS_Device_t
* const RNDISInterfaceInfo
) 
 217         /* Note: Only a single buffer is used for both the received message and its response to save SRAM. Because of 
 218                  this, response bytes should be filled in order so that they do not clobber unread data in the buffer. */ 
 220         RNDIS_Message_Header_t
* MessageHeader 
= (RNDIS_Message_Header_t
*)&RNDISInterfaceInfo
->State
.RNDISMessageBuffer
; 
 222         switch (MessageHeader
->MessageType
) 
 224                 case REMOTE_NDIS_INITIALIZE_MSG
: 
 225                         RNDISInterfaceInfo
->State
.ResponseReady 
= true; 
 227                         RNDIS_Initialize_Message_t
*  INITIALIZE_Message  
= 
 228                                        (RNDIS_Initialize_Message_t
*)&RNDISInterfaceInfo
->State
.RNDISMessageBuffer
; 
 229                         RNDIS_Initialize_Complete_t
* INITIALIZE_Response 
= 
 230                                        (RNDIS_Initialize_Complete_t
*)&RNDISInterfaceInfo
->State
.RNDISMessageBuffer
; 
 232                         INITIALIZE_Response
->MessageType           
= REMOTE_NDIS_INITIALIZE_CMPLT
; 
 233                         INITIALIZE_Response
->MessageLength         
= sizeof(RNDIS_Initialize_Complete_t
); 
 234                         INITIALIZE_Response
->RequestId             
= INITIALIZE_Message
->RequestId
; 
 235                         INITIALIZE_Response
->Status                
= REMOTE_NDIS_STATUS_SUCCESS
; 
 237                         INITIALIZE_Response
->MajorVersion          
= REMOTE_NDIS_VERSION_MAJOR
; 
 238                         INITIALIZE_Response
->MinorVersion          
= REMOTE_NDIS_VERSION_MINOR
;                  
 239                         INITIALIZE_Response
->DeviceFlags           
= REMOTE_NDIS_DF_CONNECTIONLESS
; 
 240                         INITIALIZE_Response
->Medium                
= REMOTE_NDIS_MEDIUM_802_3
; 
 241                         INITIALIZE_Response
->MaxPacketsPerTransfer 
= 1; 
 242                         INITIALIZE_Response
->MaxTransferSize       
= (sizeof(RNDIS_Packet_Message_t
) + ETHERNET_FRAME_SIZE_MAX
); 
 243                         INITIALIZE_Response
->PacketAlignmentFactor 
= 0; 
 244                         INITIALIZE_Response
->AFListOffset          
= 0; 
 245                         INITIALIZE_Response
->AFListSize            
= 0; 
 247                         RNDISInterfaceInfo
->State
.CurrRNDISState 
= RNDIS_Initialized
; 
 250                 case REMOTE_NDIS_HALT_MSG
: 
 251                         RNDISInterfaceInfo
->State
.ResponseReady 
= false; 
 252                         MessageHeader
->MessageLength 
= 0; 
 254                         RNDISInterfaceInfo
->State
.CurrRNDISState 
= RNDIS_Uninitialized
; 
 257                 case REMOTE_NDIS_QUERY_MSG
: 
 258                         RNDISInterfaceInfo
->State
.ResponseReady 
= true; 
 260                         RNDIS_Query_Message_t
*  QUERY_Message  
= (RNDIS_Query_Message_t
*)&RNDISInterfaceInfo
->State
.RNDISMessageBuffer
; 
 261                         RNDIS_Query_Complete_t
* QUERY_Response 
= (RNDIS_Query_Complete_t
*)&RNDISInterfaceInfo
->State
.RNDISMessageBuffer
; 
 262                         uint32_t                Query_Oid      
= QUERY_Message
->Oid
; 
 264                         void*     QueryData 
= &RNDISInterfaceInfo
->State
.RNDISMessageBuffer
[sizeof(RNDIS_Message_Header_t
) + 
 265                                                                                             QUERY_Message
->InformationBufferOffset
]; 
 266                         void*     ResponseData 
= &RNDISInterfaceInfo
->State
.RNDISMessageBuffer
[sizeof(RNDIS_Query_Complete_t
)];          
 267                         uint16_t  ResponseSize
; 
 269                         QUERY_Response
->MessageType   
= REMOTE_NDIS_QUERY_CMPLT
; 
 270                         QUERY_Response
->MessageLength 
= sizeof(RNDIS_Query_Complete_t
); 
 272                         if (RNDIS_Device_ProcessNDISQuery(RNDISInterfaceInfo
, Query_Oid
, QueryData
, QUERY_Message
->InformationBufferLength
, 
 273                                                           ResponseData
, &ResponseSize
)) 
 275                                 QUERY_Response
->Status                  
= REMOTE_NDIS_STATUS_SUCCESS
; 
 276                                 QUERY_Response
->MessageLength          
+= ResponseSize
; 
 278                                 QUERY_Response
->InformationBufferLength 
= ResponseSize
; 
 279                                 QUERY_Response
->InformationBufferOffset 
= (sizeof(RNDIS_Query_Complete_t
) - sizeof(RNDIS_Message_Header_t
)); 
 283                                 QUERY_Response
->Status                  
= REMOTE_NDIS_STATUS_NOT_SUPPORTED
; 
 285                                 QUERY_Response
->InformationBufferLength 
= 0; 
 286                                 QUERY_Response
->InformationBufferOffset 
= 0; 
 290                 case REMOTE_NDIS_SET_MSG
: 
 291                         RNDISInterfaceInfo
->State
.ResponseReady 
= true; 
 293                         RNDIS_Set_Message_t
*  SET_Message  
= (RNDIS_Set_Message_t
*)&RNDISInterfaceInfo
->State
.RNDISMessageBuffer
; 
 294                         RNDIS_Set_Complete_t
* SET_Response 
= (RNDIS_Set_Complete_t
*)&RNDISInterfaceInfo
->State
.RNDISMessageBuffer
; 
 295                         uint32_t              SET_Oid      
= SET_Message
->Oid
; 
 297                         SET_Response
->MessageType   
= REMOTE_NDIS_SET_CMPLT
; 
 298                         SET_Response
->MessageLength 
= sizeof(RNDIS_Set_Complete_t
); 
 299                         SET_Response
->RequestId     
= SET_Message
->RequestId
; 
 301                         void* SetData 
= &RNDISInterfaceInfo
->State
.RNDISMessageBuffer
[sizeof(RNDIS_Message_Header_t
) + 
 302                                                                                       SET_Message
->InformationBufferOffset
]; 
 304                         SET_Response
->Status 
= RNDIS_Device_ProcessNDISSet(RNDISInterfaceInfo
, SET_Oid
, SetData
, 
 305                                                                            SET_Message
->InformationBufferLength
) ?
 
 306                                                                            REMOTE_NDIS_STATUS_SUCCESS 
: REMOTE_NDIS_STATUS_NOT_SUPPORTED
; 
 308                 case REMOTE_NDIS_RESET_MSG
: 
 309                         RNDISInterfaceInfo
->State
.ResponseReady 
= true; 
 311                         RNDIS_Reset_Complete_t
* RESET_Response 
= (RNDIS_Reset_Complete_t
*)&RNDISInterfaceInfo
->State
.RNDISMessageBuffer
; 
 313                         RESET_Response
->MessageType     
= REMOTE_NDIS_RESET_CMPLT
; 
 314                         RESET_Response
->MessageLength   
= sizeof(RNDIS_Reset_Complete_t
); 
 315                         RESET_Response
->Status          
= REMOTE_NDIS_STATUS_SUCCESS
; 
 316                         RESET_Response
->AddressingReset 
= 0; 
 319                 case REMOTE_NDIS_KEEPALIVE_MSG
: 
 320                         RNDISInterfaceInfo
->State
.ResponseReady 
= true; 
 322                         RNDIS_KeepAlive_Message_t
*  KEEPALIVE_Message  
= 
 323                                         (RNDIS_KeepAlive_Message_t
*)&RNDISInterfaceInfo
->State
.RNDISMessageBuffer
; 
 324                         RNDIS_KeepAlive_Complete_t
* KEEPALIVE_Response 
= 
 325                                         (RNDIS_KeepAlive_Complete_t
*)&RNDISInterfaceInfo
->State
.RNDISMessageBuffer
; 
 327                         KEEPALIVE_Response
->MessageType   
= REMOTE_NDIS_KEEPALIVE_CMPLT
; 
 328                         KEEPALIVE_Response
->MessageLength 
= sizeof(RNDIS_KeepAlive_Complete_t
); 
 329                         KEEPALIVE_Response
->RequestId     
= KEEPALIVE_Message
->RequestId
; 
 330                         KEEPALIVE_Response
->Status        
= REMOTE_NDIS_STATUS_SUCCESS
; 
 336 static bool RNDIS_Device_ProcessNDISQuery(USB_ClassInfo_RNDIS_Device_t
* const RNDISInterfaceInfo
, 
 337                                           const uint32_t OId
, void* const QueryData
, const uint16_t QuerySize
, 
 338                                           void* ResponseData
, uint16_t* const ResponseSize
) 
 345                 case OID_GEN_SUPPORTED_LIST
: 
 346                         *ResponseSize 
= sizeof(AdapterSupportedOIDList
); 
 348                         memcpy_P(ResponseData
, AdapterSupportedOIDList
, sizeof(AdapterSupportedOIDList
)); 
 351                 case OID_GEN_PHYSICAL_MEDIUM
: 
 352                         *ResponseSize 
= sizeof(uint32_t); 
 354                         /* Indicate that the device is a true ethernet link */ 
 355                         *((uint32_t*)ResponseData
) = 0; 
 358                 case OID_GEN_HARDWARE_STATUS
: 
 359                         *ResponseSize 
= sizeof(uint32_t); 
 361                         *((uint32_t*)ResponseData
) = NDIS_HardwareStatus_Ready
; 
 364                 case OID_GEN_MEDIA_SUPPORTED
: 
 365                 case OID_GEN_MEDIA_IN_USE
: 
 366                         *ResponseSize 
= sizeof(uint32_t); 
 368                         *((uint32_t*)ResponseData
) = REMOTE_NDIS_MEDIUM_802_3
; 
 371                 case OID_GEN_VENDOR_ID
: 
 372                         *ResponseSize 
= sizeof(uint32_t); 
 374                         /* Vendor ID 0x0xFFFFFF is reserved for vendors who have not purchased a NDIS VID */ 
 375                         *((uint32_t*)ResponseData
) = 0x00FFFFFF; 
 378                 case OID_GEN_MAXIMUM_FRAME_SIZE
: 
 379                 case OID_GEN_TRANSMIT_BLOCK_SIZE
: 
 380                 case OID_GEN_RECEIVE_BLOCK_SIZE
: 
 381                         *ResponseSize 
= sizeof(uint32_t); 
 383                         *((uint32_t*)ResponseData
) = ETHERNET_FRAME_SIZE_MAX
; 
 386                 case OID_GEN_VENDOR_DESCRIPTION
: 
 387                         *ResponseSize 
= (strlen(RNDISInterfaceInfo
->Config
.AdapterVendorDescription
) + 1); 
 389                         memcpy(ResponseData
, RNDISInterfaceInfo
->Config
.AdapterVendorDescription
, *ResponseSize
); 
 392                 case OID_GEN_MEDIA_CONNECT_STATUS
: 
 393                         *ResponseSize 
= sizeof(uint32_t); 
 395                         *((uint32_t*)ResponseData
) = REMOTE_NDIS_MEDIA_STATE_CONNECTED
; 
 398                 case OID_GEN_LINK_SPEED
: 
 399                         *ResponseSize 
= sizeof(uint32_t); 
 401                         /* Indicate 10Mb/s link speed */ 
 402                         *((uint32_t*)ResponseData
) = 100000; 
 405                 case OID_802_3_PERMANENT_ADDRESS
: 
 406                 case OID_802_3_CURRENT_ADDRESS
: 
 407                         *ResponseSize 
= sizeof(MAC_Address_t
); 
 409                         memcpy(ResponseData
, &RNDISInterfaceInfo
->Config
.AdapterMACAddress
, sizeof(MAC_Address_t
)); 
 412                 case OID_802_3_MAXIMUM_LIST_SIZE
: 
 413                         *ResponseSize 
= sizeof(uint32_t); 
 415                         /* Indicate only one multicast address supported */ 
 416                         *((uint32_t*)ResponseData
) = 1; 
 419                 case OID_GEN_CURRENT_PACKET_FILTER
: 
 420                         *ResponseSize 
= sizeof(uint32_t); 
 422                         *((uint32_t*)ResponseData
) = RNDISInterfaceInfo
->State
.CurrPacketFilter
; 
 425                 case OID_GEN_XMIT_OK
: 
 427                 case OID_GEN_XMIT_ERROR
: 
 428                 case OID_GEN_RCV_ERROR
: 
 429                 case OID_GEN_RCV_NO_BUFFER
: 
 430                 case OID_802_3_RCV_ERROR_ALIGNMENT
: 
 431                 case OID_802_3_XMIT_ONE_COLLISION
: 
 432                 case OID_802_3_XMIT_MORE_COLLISIONS
: 
 433                         *ResponseSize 
= sizeof(uint32_t); 
 435                         /* Unused statistic OIDs - always return 0 for each */ 
 436                         *((uint32_t*)ResponseData
) = 0; 
 439                 case OID_GEN_MAXIMUM_TOTAL_SIZE
: 
 440                         *ResponseSize 
= sizeof(uint32_t); 
 442                         /* Indicate maximum overall buffer (Ethernet frame and RNDIS header) the adapter can handle */ 
 443                         *((uint32_t*)ResponseData
) = (RNDIS_MESSAGE_BUFFER_SIZE 
+ ETHERNET_FRAME_SIZE_MAX
); 
 451 static bool RNDIS_Device_ProcessNDISSet(USB_ClassInfo_RNDIS_Device_t
* const RNDISInterfaceInfo
, const uint32_t OId
, 
 452                                         void* SetData
, const uint16_t SetSize
) 
 458                 case OID_GEN_CURRENT_PACKET_FILTER
: 
 459                         RNDISInterfaceInfo
->State
.CurrPacketFilter 
= *((uint32_t*)SetData
); 
 460                         RNDISInterfaceInfo
->State
.CurrRNDISState 
= ((RNDISInterfaceInfo
->State
.CurrPacketFilter
) ?
 
 461                                                               RNDIS_Data_Initialized 
: RNDIS_Data_Initialized
); 
 464                 case OID_802_3_MULTICAST_LIST
: 
 465                         /* Do nothing - throw away the value from the host as it is unused */