hv_rndis.h revision 253411
1/*- 2 * Copyright (c) 2009-2012 Microsoft Corp. 3 * Copyright (c) 2010-2012 Citrix Inc. 4 * Copyright (c) 2012 NetApp Inc. 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice unmodified, this list of conditions, and the following 12 * disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29#ifndef __HV_RNDIS_H__ 30#define __HV_RNDIS_H__ 31 32 33/* 34 * NDIS protocol version numbers 35 */ 36#define NDIS_VERSION_5_0 0x00050000 37#define NDIS_VERSION_5_1 0x00050001 38#define NDIS_VERSION_6_0 0x00060000 39#define NDIS_VERSION (NDIS_VERSION_5_1) 40 41/* 42 * Status codes 43 */ 44 45#define STATUS_SUCCESS (0x00000000L) 46#define STATUS_UNSUCCESSFUL (0xC0000001L) 47#define STATUS_PENDING (0x00000103L) 48#define STATUS_INSUFFICIENT_RESOURCES (0xC000009AL) 49#define STATUS_BUFFER_OVERFLOW (0x80000005L) 50#define STATUS_NOT_SUPPORTED (0xC00000BBL) 51 52#define RNDIS_STATUS_SUCCESS (STATUS_SUCCESS) 53#define RNDIS_STATUS_PENDING (STATUS_PENDING) 54#define RNDIS_STATUS_NOT_RECOGNIZED (0x00010001L) 55#define RNDIS_STATUS_NOT_COPIED (0x00010002L) 56#define RNDIS_STATUS_NOT_ACCEPTED (0x00010003L) 57#define RNDIS_STATUS_CALL_ACTIVE (0x00010007L) 58 59#define RNDIS_STATUS_ONLINE (0x40010003L) 60#define RNDIS_STATUS_RESET_START (0x40010004L) 61#define RNDIS_STATUS_RESET_END (0x40010005L) 62#define RNDIS_STATUS_RING_STATUS (0x40010006L) 63#define RNDIS_STATUS_CLOSED (0x40010007L) 64#define RNDIS_STATUS_WAN_LINE_UP (0x40010008L) 65#define RNDIS_STATUS_WAN_LINE_DOWN (0x40010009L) 66#define RNDIS_STATUS_WAN_FRAGMENT (0x4001000AL) 67#define RNDIS_STATUS_MEDIA_CONNECT (0x4001000BL) 68#define RNDIS_STATUS_MEDIA_DISCONNECT (0x4001000CL) 69#define RNDIS_STATUS_HARDWARE_LINE_UP (0x4001000DL) 70#define RNDIS_STATUS_HARDWARE_LINE_DOWN (0x4001000EL) 71#define RNDIS_STATUS_INTERFACE_UP (0x4001000FL) 72#define RNDIS_STATUS_INTERFACE_DOWN (0x40010010L) 73#define RNDIS_STATUS_MEDIA_BUSY (0x40010011L) 74#define RNDIS_STATUS_MEDIA_SPECIFIC_INDICATION (0x40010012L) 75#define RNDIS_STATUS_WW_INDICATION RNDIS_STATUS_MEDIA_SPECIFIC_INDICATION 76#define RNDIS_STATUS_LINK_SPEED_CHANGE (0x40010013L) 77 78#define RNDIS_STATUS_NOT_RESETTABLE (0x80010001L) 79#define RNDIS_STATUS_SOFT_ERRORS (0x80010003L) 80#define RNDIS_STATUS_HARD_ERRORS (0x80010004L) 81#define RNDIS_STATUS_BUFFER_OVERFLOW (STATUS_BUFFER_OVERFLOW) 82 83#define RNDIS_STATUS_FAILURE (STATUS_UNSUCCESSFUL) 84#define RNDIS_STATUS_RESOURCES (STATUS_INSUFFICIENT_RESOURCES) 85#define RNDIS_STATUS_CLOSING (0xC0010002L) 86#define RNDIS_STATUS_BAD_VERSION (0xC0010004L) 87#define RNDIS_STATUS_BAD_CHARACTERISTICS (0xC0010005L) 88#define RNDIS_STATUS_ADAPTER_NOT_FOUND (0xC0010006L) 89#define RNDIS_STATUS_OPEN_FAILED (0xC0010007L) 90#define RNDIS_STATUS_DEVICE_FAILED (0xC0010008L) 91#define RNDIS_STATUS_MULTICAST_FULL (0xC0010009L) 92#define RNDIS_STATUS_MULTICAST_EXISTS (0xC001000AL) 93#define RNDIS_STATUS_MULTICAST_NOT_FOUND (0xC001000BL) 94#define RNDIS_STATUS_REQUEST_ABORTED (0xC001000CL) 95#define RNDIS_STATUS_RESET_IN_PROGRESS (0xC001000DL) 96#define RNDIS_STATUS_CLOSING_INDICATING (0xC001000EL) 97#define RNDIS_STATUS_NOT_SUPPORTED (STATUS_NOT_SUPPORTED) 98#define RNDIS_STATUS_INVALID_PACKET (0xC001000FL) 99#define RNDIS_STATUS_OPEN_LIST_FULL (0xC0010010L) 100#define RNDIS_STATUS_ADAPTER_NOT_READY (0xC0010011L) 101#define RNDIS_STATUS_ADAPTER_NOT_OPEN (0xC0010012L) 102#define RNDIS_STATUS_NOT_INDICATING (0xC0010013L) 103#define RNDIS_STATUS_INVALID_LENGTH (0xC0010014L) 104#define RNDIS_STATUS_INVALID_DATA (0xC0010015L) 105#define RNDIS_STATUS_BUFFER_TOO_SHORT (0xC0010016L) 106#define RNDIS_STATUS_INVALID_OID (0xC0010017L) 107#define RNDIS_STATUS_ADAPTER_REMOVED (0xC0010018L) 108#define RNDIS_STATUS_UNSUPPORTED_MEDIA (0xC0010019L) 109#define RNDIS_STATUS_GROUP_ADDRESS_IN_USE (0xC001001AL) 110#define RNDIS_STATUS_FILE_NOT_FOUND (0xC001001BL) 111#define RNDIS_STATUS_ERROR_READING_FILE (0xC001001CL) 112#define RNDIS_STATUS_ALREADY_MAPPED (0xC001001DL) 113#define RNDIS_STATUS_RESOURCE_CONFLICT (0xC001001EL) 114#define RNDIS_STATUS_NO_CABLE (0xC001001FL) 115 116#define RNDIS_STATUS_INVALID_SAP (0xC0010020L) 117#define RNDIS_STATUS_SAP_IN_USE (0xC0010021L) 118#define RNDIS_STATUS_INVALID_ADDRESS (0xC0010022L) 119#define RNDIS_STATUS_VC_NOT_ACTIVATED (0xC0010023L) 120#define RNDIS_STATUS_DEST_OUT_OF_ORDER (0xC0010024L) 121#define RNDIS_STATUS_VC_NOT_AVAILABLE (0xC0010025L) 122#define RNDIS_STATUS_CELLRATE_NOT_AVAILABLE (0xC0010026L) 123#define RNDIS_STATUS_INCOMPATABLE_QOS (0xC0010027L) 124#define RNDIS_STATUS_AAL_PARAMS_UNSUPPORTED (0xC0010028L) 125#define RNDIS_STATUS_NO_ROUTE_TO_DESTINATION (0xC0010029L) 126 127#define RNDIS_STATUS_TOKEN_RING_OPEN_ERROR (0xC0011000L) 128 129 130/* 131 * Object Identifiers used by NdisRequest Query/Set Information 132 */ 133 134/* 135 * General Objects 136 */ 137 138#define RNDIS_OID_GEN_SUPPORTED_LIST 0x00010101 139#define RNDIS_OID_GEN_HARDWARE_STATUS 0x00010102 140#define RNDIS_OID_GEN_MEDIA_SUPPORTED 0x00010103 141#define RNDIS_OID_GEN_MEDIA_IN_USE 0x00010104 142#define RNDIS_OID_GEN_MAXIMUM_LOOKAHEAD 0x00010105 143#define RNDIS_OID_GEN_MAXIMUM_FRAME_SIZE 0x00010106 144#define RNDIS_OID_GEN_LINK_SPEED 0x00010107 145#define RNDIS_OID_GEN_TRANSMIT_BUFFER_SPACE 0x00010108 146#define RNDIS_OID_GEN_RECEIVE_BUFFER_SPACE 0x00010109 147#define RNDIS_OID_GEN_TRANSMIT_BLOCK_SIZE 0x0001010A 148#define RNDIS_OID_GEN_RECEIVE_BLOCK_SIZE 0x0001010B 149#define RNDIS_OID_GEN_VENDOR_ID 0x0001010C 150#define RNDIS_OID_GEN_VENDOR_DESCRIPTION 0x0001010D 151#define RNDIS_OID_GEN_CURRENT_PACKET_FILTER 0x0001010E 152#define RNDIS_OID_GEN_CURRENT_LOOKAHEAD 0x0001010F 153#define RNDIS_OID_GEN_DRIVER_VERSION 0x00010110 154#define RNDIS_OID_GEN_MAXIMUM_TOTAL_SIZE 0x00010111 155#define RNDIS_OID_GEN_PROTOCOL_OPTIONS 0x00010112 156#define RNDIS_OID_GEN_MAC_OPTIONS 0x00010113 157#define RNDIS_OID_GEN_MEDIA_CONNECT_STATUS 0x00010114 158#define RNDIS_OID_GEN_MAXIMUM_SEND_PACKETS 0x00010115 159#define RNDIS_OID_GEN_VENDOR_DRIVER_VERSION 0x00010116 160#define RNDIS_OID_GEN_NETWORK_LAYER_ADDRESSES 0x00010118 161#define RNDIS_OID_GEN_TRANSPORT_HEADER_OFFSET 0x00010119 162#define RNDIS_OID_GEN_MACHINE_NAME 0x0001021A 163#define RNDIS_OID_GEN_RNDIS_CONFIG_PARAMETER 0x0001021B 164 165#define RNDIS_OID_GEN_XMIT_OK 0x00020101 166#define RNDIS_OID_GEN_RCV_OK 0x00020102 167#define RNDIS_OID_GEN_XMIT_ERROR 0x00020103 168#define RNDIS_OID_GEN_RCV_ERROR 0x00020104 169#define RNDIS_OID_GEN_RCV_NO_BUFFER 0x00020105 170 171#define RNDIS_OID_GEN_DIRECTED_BYTES_XMIT 0x00020201 172#define RNDIS_OID_GEN_DIRECTED_FRAMES_XMIT 0x00020202 173#define RNDIS_OID_GEN_MULTICAST_BYTES_XMIT 0x00020203 174#define RNDIS_OID_GEN_MULTICAST_FRAMES_XMIT 0x00020204 175#define RNDIS_OID_GEN_BROADCAST_BYTES_XMIT 0x00020205 176#define RNDIS_OID_GEN_BROADCAST_FRAMES_XMIT 0x00020206 177#define RNDIS_OID_GEN_DIRECTED_BYTES_RCV 0x00020207 178#define RNDIS_OID_GEN_DIRECTED_FRAMES_RCV 0x00020208 179#define RNDIS_OID_GEN_MULTICAST_BYTES_RCV 0x00020209 180#define RNDIS_OID_GEN_MULTICAST_FRAMES_RCV 0x0002020A 181#define RNDIS_OID_GEN_BROADCAST_BYTES_RCV 0x0002020B 182#define RNDIS_OID_GEN_BROADCAST_FRAMES_RCV 0x0002020C 183 184#define RNDIS_OID_GEN_RCV_CRC_ERROR 0x0002020D 185#define RNDIS_OID_GEN_TRANSMIT_QUEUE_LENGTH 0x0002020E 186 187#define RNDIS_OID_GEN_GET_TIME_CAPS 0x0002020F 188#define RNDIS_OID_GEN_GET_NETCARD_TIME 0x00020210 189 190/* 191 * These are connection-oriented general OIDs. 192 * These replace the above OIDs for connection-oriented media. 193 */ 194#define RNDIS_OID_GEN_CO_SUPPORTED_LIST 0x00010101 195#define RNDIS_OID_GEN_CO_HARDWARE_STATUS 0x00010102 196#define RNDIS_OID_GEN_CO_MEDIA_SUPPORTED 0x00010103 197#define RNDIS_OID_GEN_CO_MEDIA_IN_USE 0x00010104 198#define RNDIS_OID_GEN_CO_LINK_SPEED 0x00010105 199#define RNDIS_OID_GEN_CO_VENDOR_ID 0x00010106 200#define RNDIS_OID_GEN_CO_VENDOR_DESCRIPTION 0x00010107 201#define RNDIS_OID_GEN_CO_DRIVER_VERSION 0x00010108 202#define RNDIS_OID_GEN_CO_PROTOCOL_OPTIONS 0x00010109 203#define RNDIS_OID_GEN_CO_MAC_OPTIONS 0x0001010A 204#define RNDIS_OID_GEN_CO_MEDIA_CONNECT_STATUS 0x0001010B 205#define RNDIS_OID_GEN_CO_VENDOR_DRIVER_VERSION 0x0001010C 206#define RNDIS_OID_GEN_CO_MINIMUM_LINK_SPEED 0x0001010D 207 208#define RNDIS_OID_GEN_CO_GET_TIME_CAPS 0x00010201 209#define RNDIS_OID_GEN_CO_GET_NETCARD_TIME 0x00010202 210 211/* 212 * These are connection-oriented statistics OIDs. 213 */ 214#define RNDIS_OID_GEN_CO_XMIT_PDUS_OK 0x00020101 215#define RNDIS_OID_GEN_CO_RCV_PDUS_OK 0x00020102 216#define RNDIS_OID_GEN_CO_XMIT_PDUS_ERROR 0x00020103 217#define RNDIS_OID_GEN_CO_RCV_PDUS_ERROR 0x00020104 218#define RNDIS_OID_GEN_CO_RCV_PDUS_NO_BUFFER 0x00020105 219 220 221#define RNDIS_OID_GEN_CO_RCV_CRC_ERROR 0x00020201 222#define RNDIS_OID_GEN_CO_TRANSMIT_QUEUE_LENGTH 0x00020202 223#define RNDIS_OID_GEN_CO_BYTES_XMIT 0x00020203 224#define RNDIS_OID_GEN_CO_BYTES_RCV 0x00020204 225#define RNDIS_OID_GEN_CO_BYTES_XMIT_OUTSTANDING 0x00020205 226#define RNDIS_OID_GEN_CO_NETCARD_LOAD 0x00020206 227 228/* 229 * These are objects for Connection-oriented media call-managers. 230 */ 231#define RNDIS_OID_CO_ADD_PVC 0xFF000001 232#define RNDIS_OID_CO_DELETE_PVC 0xFF000002 233#define RNDIS_OID_CO_GET_CALL_INFORMATION 0xFF000003 234#define RNDIS_OID_CO_ADD_ADDRESS 0xFF000004 235#define RNDIS_OID_CO_DELETE_ADDRESS 0xFF000005 236#define RNDIS_OID_CO_GET_ADDRESSES 0xFF000006 237#define RNDIS_OID_CO_ADDRESS_CHANGE 0xFF000007 238#define RNDIS_OID_CO_SIGNALING_ENABLED 0xFF000008 239#define RNDIS_OID_CO_SIGNALING_DISABLED 0xFF000009 240 241 242/* 243 * 802.3 Objects (Ethernet) 244 */ 245 246#define RNDIS_OID_802_3_PERMANENT_ADDRESS 0x01010101 247#define RNDIS_OID_802_3_CURRENT_ADDRESS 0x01010102 248#define RNDIS_OID_802_3_MULTICAST_LIST 0x01010103 249#define RNDIS_OID_802_3_MAXIMUM_LIST_SIZE 0x01010104 250#define RNDIS_OID_802_3_MAC_OPTIONS 0x01010105 251 252/* 253 * 254 */ 255#define NDIS_802_3_MAC_OPTION_PRIORITY 0x00000001 256 257#define RNDIS_OID_802_3_RCV_ERROR_ALIGNMENT 0x01020101 258#define RNDIS_OID_802_3_XMIT_ONE_COLLISION 0x01020102 259#define RNDIS_OID_802_3_XMIT_MORE_COLLISIONS 0x01020103 260 261#define RNDIS_OID_802_3_XMIT_DEFERRED 0x01020201 262#define RNDIS_OID_802_3_XMIT_MAX_COLLISIONS 0x01020202 263#define RNDIS_OID_802_3_RCV_OVERRUN 0x01020203 264#define RNDIS_OID_802_3_XMIT_UNDERRUN 0x01020204 265#define RNDIS_OID_802_3_XMIT_HEARTBEAT_FAILURE 0x01020205 266#define RNDIS_OID_802_3_XMIT_TIMES_CRS_LOST 0x01020206 267#define RNDIS_OID_802_3_XMIT_LATE_COLLISIONS 0x01020207 268 269 270/* 271 * RNDIS MP custom OID for test 272 */ 273#define OID_RNDISMP_GET_RECEIVE_BUFFERS 0xFFA0C90D // Query only 274 275 276/* 277 * Remote NDIS message types 278 */ 279#define REMOTE_NDIS_PACKET_MSG 0x00000001 280#define REMOTE_NDIS_INITIALIZE_MSG 0x00000002 281#define REMOTE_NDIS_HALT_MSG 0x00000003 282#define REMOTE_NDIS_QUERY_MSG 0x00000004 283#define REMOTE_NDIS_SET_MSG 0x00000005 284#define REMOTE_NDIS_RESET_MSG 0x00000006 285#define REMOTE_NDIS_INDICATE_STATUS_MSG 0x00000007 286#define REMOTE_NDIS_KEEPALIVE_MSG 0x00000008 287 288#define REMOTE_CONDIS_MP_CREATE_VC_MSG 0x00008001 289#define REMOTE_CONDIS_MP_DELETE_VC_MSG 0x00008002 290#define REMOTE_CONDIS_MP_ACTIVATE_VC_MSG 0x00008005 291#define REMOTE_CONDIS_MP_DEACTIVATE_VC_MSG 0x00008006 292#define REMOTE_CONDIS_INDICATE_STATUS_MSG 0x00008007 293 294/* 295 * Remote NDIS message completion types 296 */ 297#define REMOTE_NDIS_INITIALIZE_CMPLT 0x80000002 298#define REMOTE_NDIS_QUERY_CMPLT 0x80000004 299#define REMOTE_NDIS_SET_CMPLT 0x80000005 300#define REMOTE_NDIS_RESET_CMPLT 0x80000006 301#define REMOTE_NDIS_KEEPALIVE_CMPLT 0x80000008 302 303#define REMOTE_CONDIS_MP_CREATE_VC_CMPLT 0x80008001 304#define REMOTE_CONDIS_MP_DELETE_VC_CMPLT 0x80008002 305#define REMOTE_CONDIS_MP_ACTIVATE_VC_CMPLT 0x80008005 306#define REMOTE_CONDIS_MP_DEACTIVATE_VC_CMPLT 0x80008006 307 308/* 309 * Reserved message type for private communication between lower-layer 310 * host driver and remote device, if necessary. 311 */ 312#define REMOTE_NDIS_BUS_MSG 0xff000001 313 314/* 315 * Defines for DeviceFlags in rndis_initialize_complete 316 */ 317#define RNDIS_DF_CONNECTIONLESS 0x00000001 318#define RNDIS_DF_CONNECTION_ORIENTED 0x00000002 319#define RNDIS_DF_RAW_DATA 0x00000004 320 321/* 322 * Remote NDIS medium types. 323 */ 324#define RNDIS_MEDIUM_802_3 0x00000000 325#define RNDIS_MEDIUM_802_5 0x00000001 326#define RNDIS_MEDIUM_FDDI 0x00000002 327#define RNDIS_MEDIUM_WAN 0x00000003 328#define RNDIS_MEDIUM_LOCAL_TALK 0x00000004 329#define RNDIS_MEDIUM_ARCNET_RAW 0x00000006 330#define RNDIS_MEDIUM_ARCNET_878_2 0x00000007 331#define RNDIS_MEDIUM_ATM 0x00000008 332#define RNDIS_MEDIUM_WIRELESS_WAN 0x00000009 333#define RNDIS_MEDIUM_IRDA 0x0000000a 334#define RNDIS_MEDIUM_CO_WAN 0x0000000b 335/* Not a real medium, defined as an upper bound */ 336#define RNDIS_MEDIUM_MAX 0x0000000d 337 338/* 339 * Remote NDIS medium connection states. 340 */ 341#define RNDIS_MEDIA_STATE_CONNECTED 0x00000000 342#define RNDIS_MEDIA_STATE_DISCONNECTED 0x00000001 343 344/* 345 * Remote NDIS version numbers 346 */ 347#define RNDIS_MAJOR_VERSION 0x00000001 348#define RNDIS_MINOR_VERSION 0x00000000 349 350/* 351 * NdisInitialize message 352 */ 353typedef struct rndis_initialize_request_ { 354 /* RNDIS request ID */ 355 uint32_t request_id; 356 uint32_t major_version; 357 uint32_t minor_version; 358 uint32_t max_xfer_size; 359} rndis_initialize_request; 360 361/* 362 * Response to NdisInitialize 363 */ 364typedef struct rndis_initialize_complete_ { 365 /* RNDIS request ID */ 366 uint32_t request_id; 367 /* RNDIS status */ 368 uint32_t status; 369 uint32_t major_version; 370 uint32_t minor_version; 371 uint32_t device_flags; 372 /* RNDIS medium */ 373 uint32_t medium; 374 uint32_t max_pkts_per_msg; 375 uint32_t max_xfer_size; 376 uint32_t pkt_align_factor; 377 uint32_t af_list_offset; 378 uint32_t af_list_size; 379} rndis_initialize_complete; 380 381/* 382 * Call manager devices only: Information about an address family 383 * supported by the device is appended to the response to NdisInitialize. 384 */ 385typedef struct rndis_co_address_family_ { 386 /* RNDIS AF */ 387 uint32_t address_family; 388 uint32_t major_version; 389 uint32_t minor_version; 390} rndis_co_address_family; 391 392/* 393 * NdisHalt message 394 */ 395typedef struct rndis_halt_request_ { 396 /* RNDIS request ID */ 397 uint32_t request_id; 398} rndis_halt_request; 399 400/* 401 * NdisQueryRequest message 402 */ 403typedef struct rndis_query_request_ { 404 /* RNDIS request ID */ 405 uint32_t request_id; 406 /* RNDIS OID */ 407 uint32_t oid; 408 uint32_t info_buffer_length; 409 uint32_t info_buffer_offset; 410 /* RNDIS handle */ 411 uint32_t device_vc_handle; 412} rndis_query_request; 413 414/* 415 * Response to NdisQueryRequest 416 */ 417typedef struct rndis_query_complete_ { 418 /* RNDIS request ID */ 419 uint32_t request_id; 420 /* RNDIS status */ 421 uint32_t status; 422 uint32_t info_buffer_length; 423 uint32_t info_buffer_offset; 424} rndis_query_complete; 425 426/* 427 * NdisSetRequest message 428 */ 429typedef struct rndis_set_request_ { 430 /* RNDIS request ID */ 431 uint32_t request_id; 432 /* RNDIS OID */ 433 uint32_t oid; 434 uint32_t info_buffer_length; 435 uint32_t info_buffer_offset; 436 /* RNDIS handle */ 437 uint32_t device_vc_handle; 438} rndis_set_request; 439 440/* 441 * Response to NdisSetRequest 442 */ 443typedef struct rndis_set_complete_ { 444 /* RNDIS request ID */ 445 uint32_t request_id; 446 /* RNDIS status */ 447 uint32_t status; 448} rndis_set_complete; 449 450/* 451 * NdisReset message 452 */ 453typedef struct rndis_reset_request_ { 454 uint32_t reserved; 455} rndis_reset_request; 456 457/* 458 * Response to NdisReset 459 */ 460typedef struct rndis_reset_complete_ { 461 /* RNDIS status */ 462 uint32_t status; 463 uint32_t addressing_reset; 464} rndis_reset_complete; 465 466/* 467 * NdisMIndicateStatus message 468 */ 469typedef struct rndis_indicate_status_ { 470 /* RNDIS status */ 471 uint32_t status; 472 uint32_t status_buf_length; 473 uint32_t status_buf_offset; 474} rndis_indicate_status; 475 476/* 477 * Diagnostic information passed as the status buffer in 478 * rndis_indicate_status messages signifying error conditions. 479 */ 480typedef struct rndis_diagnostic_info_ { 481 /* RNDIS status */ 482 uint32_t diag_status; 483 uint32_t error_offset; 484} rndis_diagnostic_info; 485 486/* 487 * NdisKeepAlive message 488 */ 489typedef struct rndis_keepalive_request_ { 490 /* RNDIS request ID */ 491 uint32_t request_id; 492} rndis_keepalive_request; 493 494/* 495 * Response to NdisKeepAlive 496 */ 497typedef struct rndis_keepalive_complete_ { 498 /* RNDIS request ID */ 499 uint32_t request_id; 500 /* RNDIS status */ 501 uint32_t status; 502} rndis_keepalive_complete; 503 504/* 505 * Data message. All offset fields contain byte offsets from the beginning 506 * of the rndis_packet structure. All length fields are in bytes. 507 * VcHandle is set to 0 for connectionless data, otherwise it 508 * contains the VC handle. 509 */ 510typedef struct rndis_packet_ { 511 uint32_t data_offset; 512 uint32_t data_length; 513 uint32_t oob_data_offset; 514 uint32_t oob_data_length; 515 uint32_t num_oob_data_elements; 516 uint32_t per_pkt_info_offset; 517 uint32_t per_pkt_info_length; 518 /* RNDIS handle */ 519 uint32_t vc_handle; 520 uint32_t reserved; 521} rndis_packet; 522 523typedef struct rndis_packet_ex_ { 524 uint32_t data_offset; 525 uint32_t data_length; 526 uint32_t oob_data_offset; 527 uint32_t oob_data_length; 528 uint32_t num_oob_data_elements; 529 uint32_t per_pkt_info_offset; 530 uint32_t per_pkt_info_length; 531 /* RNDIS handle */ 532 uint32_t vc_handle; 533 uint32_t reserved; 534 uint64_t data_buf_id; 535 uint32_t data_buf_offset; 536 uint64_t next_header_buf_id; 537 uint32_t next_header_byte_offset; 538 uint32_t next_header_byte_count; 539} rndis_packet_ex; 540 541/* 542 * Optional Out of Band data associated with a Data message. 543 */ 544typedef struct rndis_oobd_ { 545 uint32_t size; 546 /* RNDIS class ID */ 547 uint32_t type; 548 uint32_t class_info_offset; 549} rndis_oobd; 550 551/* 552 * Packet extension field contents associated with a Data message. 553 */ 554typedef struct rndis_per_packet_info_ { 555 uint32_t size; 556 uint32_t type; 557 uint32_t per_packet_info_offset; 558} rndis_per_packet_info; 559 560typedef enum ndis_per_pkt_infotype_ { 561 tcpip_chksum_info, 562 ipsec_info, 563 tcp_large_send_info, 564 classification_handle_info, 565 ndis_reserved, 566 sgl_info, 567 ieee_8021q_info, 568 original_pkt_info, 569 pkt_cancel_id, 570 original_netbuf_list, 571 cached_netbuf_list, 572 short_pkt_padding_info, 573 max_perpkt_info 574} ndis_per_pkt_infotype; 575 576typedef struct ndis_8021q_info_ { 577 union { 578 struct { 579 uint32_t user_pri : 3; /* User Priority */ 580 uint32_t cfi : 1; /* Canonical Format ID */ 581 uint32_t vlan_id : 12; 582 uint32_t reserved : 16; 583 } s1; 584 uint32_t value; 585 } u1; 586} ndis_8021q_info; 587 588/* 589 * Format of Information buffer passed in a SetRequest for the OID 590 * OID_GEN_RNDIS_CONFIG_PARAMETER. 591 */ 592typedef struct rndis_config_parameter_info_ { 593 uint32_t parameter_name_offset; 594 uint32_t parameter_name_length; 595 uint32_t parameter_type; 596 uint32_t parameter_value_offset; 597 uint32_t parameter_value_length; 598} rndis_config_parameter_info; 599 600/* 601 * Values for ParameterType in rndis_config_parameter_info 602 */ 603#define RNDIS_CONFIG_PARAM_TYPE_INTEGER 0 604#define RNDIS_CONFIG_PARAM_TYPE_STRING 2 605 606 607/* 608 * CONDIS Miniport messages for connection oriented devices 609 * that do not implement a call manager. 610 */ 611 612/* 613 * CoNdisMiniportCreateVc message 614 */ 615typedef struct rcondis_mp_create_vc_ { 616 /* RNDIS request ID */ 617 uint32_t request_id; 618 /* RNDIS handle */ 619 uint32_t ndis_vc_handle; 620} rcondis_mp_create_vc; 621 622/* 623 * Response to CoNdisMiniportCreateVc 624 */ 625typedef struct rcondis_mp_create_vc_complete_ { 626 /* RNDIS request ID */ 627 uint32_t request_id; 628 /* RNDIS handle */ 629 uint32_t device_vc_handle; 630 /* RNDIS status */ 631 uint32_t status; 632} rcondis_mp_create_vc_complete; 633 634/* 635 * CoNdisMiniportDeleteVc message 636 */ 637typedef struct rcondis_mp_delete_vc_ { 638 /* RNDIS request ID */ 639 uint32_t request_id; 640 /* RNDIS handle */ 641 uint32_t device_vc_handle; 642} rcondis_mp_delete_vc; 643 644/* 645 * Response to CoNdisMiniportDeleteVc 646 */ 647typedef struct rcondis_mp_delete_vc_complete_ { 648 /* RNDIS request ID */ 649 uint32_t request_id; 650 /* RNDIS status */ 651 uint32_t status; 652} rcondis_mp_delete_vc_complete; 653 654/* 655 * CoNdisMiniportQueryRequest message 656 */ 657typedef struct rcondis_mp_query_request_ { 658 /* RNDIS request ID */ 659 uint32_t request_id; 660 /* RNDIS request type */ 661 uint32_t request_type; 662 /* RNDIS OID */ 663 uint32_t oid; 664 /* RNDIS handle */ 665 uint32_t device_vc_handle; 666 uint32_t info_buf_length; 667 uint32_t info_buf_offset; 668} rcondis_mp_query_request; 669 670/* 671 * CoNdisMiniportSetRequest message 672 */ 673typedef struct rcondis_mp_set_request_ { 674 /* RNDIS request ID */ 675 uint32_t request_id; 676 /* RNDIS request type */ 677 uint32_t request_type; 678 /* RNDIS OID */ 679 uint32_t oid; 680 /* RNDIS handle */ 681 uint32_t device_vc_handle; 682 uint32_t info_buf_length; 683 uint32_t info_buf_offset; 684} rcondis_mp_set_request; 685 686/* 687 * CoNdisIndicateStatus message 688 */ 689typedef struct rcondis_indicate_status_ { 690 /* RNDIS handle */ 691 uint32_t ndis_vc_handle; 692 /* RNDIS status */ 693 uint32_t status; 694 uint32_t status_buf_length; 695 uint32_t status_buf_offset; 696} rcondis_indicate_status; 697 698/* 699 * CONDIS Call/VC parameters 700 */ 701 702typedef struct rcondis_specific_parameters_ { 703 uint32_t parameter_type; 704 uint32_t parameter_length; 705 uint32_t parameter_offset; 706} rcondis_specific_parameters; 707 708typedef struct rcondis_media_parameters_ { 709 uint32_t flags; 710 uint32_t reserved1; 711 uint32_t reserved2; 712 rcondis_specific_parameters media_specific; 713} rcondis_media_parameters; 714 715typedef struct rndis_flowspec_ { 716 uint32_t token_rate; 717 uint32_t token_bucket_size; 718 uint32_t peak_bandwidth; 719 uint32_t latency; 720 uint32_t delay_variation; 721 uint32_t service_type; 722 uint32_t max_sdu_size; 723 uint32_t minimum_policed_size; 724} rndis_flowspec; 725 726typedef struct rcondis_call_manager_parameters_ { 727 rndis_flowspec transmit; 728 rndis_flowspec receive; 729 rcondis_specific_parameters call_mgr_specific; 730} rcondis_call_manager_parameters; 731 732/* 733 * CoNdisMiniportActivateVc message 734 */ 735typedef struct rcondis_mp_activate_vc_request_ { 736 /* RNDIS request ID */ 737 uint32_t request_id; 738 uint32_t flags; 739 /* RNDIS handle */ 740 uint32_t device_vc_handle; 741 uint32_t media_params_offset; 742 uint32_t media_params_length; 743 uint32_t call_mgr_params_offset; 744 uint32_t call_mgr_params_length; 745} rcondis_mp_activate_vc_request; 746 747/* 748 * Response to CoNdisMiniportActivateVc 749 */ 750typedef struct rcondis_mp_activate_vc_complete_ { 751 /* RNDIS request ID */ 752 uint32_t request_id; 753 /* RNDIS status */ 754 uint32_t status; 755} rcondis_mp_activate_vc_complete; 756 757/* 758 * CoNdisMiniportDeactivateVc message 759 */ 760typedef struct rcondis_mp_deactivate_vc_request_ { 761 /* RNDIS request ID */ 762 uint32_t request_id; 763 uint32_t flags; 764 /* RNDIS handle */ 765 uint32_t device_vc_handle; 766} rcondis_mp_deactivate_vc_request; 767 768/* 769 * Response to CoNdisMiniportDeactivateVc 770 */ 771typedef struct rcondis_mp_deactivate_vc_complete_ { 772 /* RNDIS request ID */ 773 uint32_t request_id; 774 /* RNDIS status */ 775 uint32_t status; 776} rcondis_mp_deactivate_vc_complete; 777 778/* 779 * union with all of the RNDIS messages 780 */ 781typedef union rndis_msg_container_ { 782 rndis_packet packet; 783 rndis_initialize_request init_request; 784 rndis_halt_request halt_request; 785 rndis_query_request query_request; 786 rndis_set_request set_request; 787 rndis_reset_request reset_request; 788 rndis_keepalive_request keepalive_request; 789 rndis_indicate_status indicate_status; 790 rndis_initialize_complete init_complete; 791 rndis_query_complete query_complete; 792 rndis_set_complete set_complete; 793 rndis_reset_complete reset_complete; 794 rndis_keepalive_complete keepalive_complete; 795 rcondis_mp_create_vc co_miniport_create_vc; 796 rcondis_mp_delete_vc co_miniport_delete_vc; 797 rcondis_indicate_status co_miniport_status; 798 rcondis_mp_activate_vc_request co_miniport_activate_vc; 799 rcondis_mp_deactivate_vc_request co_miniport_deactivate_vc; 800 rcondis_mp_create_vc_complete co_miniport_create_vc_complete; 801 rcondis_mp_delete_vc_complete co_miniport_delete_vc_complete; 802 rcondis_mp_activate_vc_complete co_miniport_activate_vc_complete; 803 rcondis_mp_deactivate_vc_complete co_miniport_deactivate_vc_complete; 804 rndis_packet_ex packet_ex; 805} rndis_msg_container; 806 807/* 808 * Remote NDIS message format 809 */ 810typedef struct rndis_msg_ { 811 uint32_t ndis_msg_type; 812 813 /* 814 * Total length of this message, from the beginning 815 * of the rndis_msg struct, in bytes. 816 */ 817 uint32_t msg_len; 818 819 /* Actual message */ 820 rndis_msg_container msg; 821} rndis_msg; 822 823 824/* 825 * Handy macros 826 */ 827 828/* 829 * get the size of an RNDIS message. Pass in the message type, 830 * rndis_set_request, rndis_packet for example 831 */ 832#define RNDIS_MESSAGE_SIZE(message) \ 833 (sizeof(message) + (sizeof(rndis_msg) - sizeof(rndis_msg_container))) 834 835/* 836 * get pointer to info buffer with message pointer 837 */ 838#define MESSAGE_TO_INFO_BUFFER(message) \ 839 (((PUCHAR)(message)) + message->InformationBufferOffset) 840 841/* 842 * get pointer to status buffer with message pointer 843 */ 844#define MESSAGE_TO_STATUS_BUFFER(message) \ 845 (((PUCHAR)(message)) + message->StatusBufferOffset) 846 847/* 848 * get pointer to OOBD buffer with message pointer 849 */ 850#define MESSAGE_TO_OOBD_BUFFER(message) \ 851 (((PUCHAR)(message)) + message->OOBDataOffset) 852 853/* 854 * get pointer to data buffer with message pointer 855 */ 856#define MESSAGE_TO_DATA_BUFFER(message) \ 857 (((PUCHAR)(message)) + message->PerPacketInfoOffset) 858 859/* 860 * get pointer to contained message from NDIS_MESSAGE pointer 861 */ 862#define RNDIS_MESSAGE_PTR_TO_MESSAGE_PTR(rndis_message) \ 863 ((void *) &rndis_message->Message) 864 865/* 866 * get pointer to contained message from NDIS_MESSAGE pointer 867 */ 868#define RNDIS_MESSAGE_RAW_PTR_TO_MESSAGE_PTR(rndis_message) \ 869 ((void *) rndis_message) 870 871 872 873/* 874 * Structures used in OID_RNDISMP_GET_RECEIVE_BUFFERS 875 */ 876 877#define RNDISMP_RECEIVE_BUFFER_ELEM_FLAG_VMQ_RECEIVE_BUFFER 0x00000001 878 879typedef struct rndismp_rx_buf_elem_ { 880 uint32_t flags; 881 uint32_t length; 882 uint64_t rx_buf_id; 883 uint32_t gpadl_handle; 884 void *rx_buf; 885} rndismp_rx_buf_elem; 886 887typedef struct rndismp_rx_bufs_info_ { 888 uint32_t num_rx_bufs; 889 rndismp_rx_buf_elem rx_buf_elems[1]; 890} rndismp_rx_bufs_info; 891 892 893 894#define RNDIS_HEADER_SIZE (sizeof(rndis_msg) - sizeof(rndis_msg_container)) 895 896#define NDIS_PACKET_TYPE_DIRECTED 0x00000001 897#define NDIS_PACKET_TYPE_MULTICAST 0x00000002 898#define NDIS_PACKET_TYPE_ALL_MULTICAST 0x00000004 899#define NDIS_PACKET_TYPE_BROADCAST 0x00000008 900#define NDIS_PACKET_TYPE_SOURCE_ROUTING 0x00000010 901#define NDIS_PACKET_TYPE_PROMISCUOUS 0x00000020 902#define NDIS_PACKET_TYPE_SMT 0x00000040 903#define NDIS_PACKET_TYPE_ALL_LOCAL 0x00000080 904#define NDIS_PACKET_TYPE_GROUP 0x00000100 905#define NDIS_PACKET_TYPE_ALL_FUNCTIONAL 0x00000200 906#define NDIS_PACKET_TYPE_FUNCTIONAL 0x00000400 907#define NDIS_PACKET_TYPE_MAC_FRAME 0x00000800 908 909 910#endif /* __HV_RNDIS_H__ */ 911 912