hv_rndis.h revision 299888
1/*- 2 * Copyright (c) 2009-2012,2016 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 * $FreeBSD: head/sys/dev/hyperv/netvsc/hv_rndis.h 299888 2016-05-16 03:26:16Z sephe $ 29 */ 30 31#ifndef __HV_RNDIS_H__ 32#define __HV_RNDIS_H__ 33 34 35/* 36 * NDIS protocol version numbers 37 */ 38#define NDIS_VERSION_5_0 0x00050000 39#define NDIS_VERSION_5_1 0x00050001 40#define NDIS_VERSION_6_0 0x00060000 41#define NDIS_VERSION_6_1 0x00060001 42#define NDIS_VERSION_6_30 0x0006001e 43 44#define NDIS_VERSION (NDIS_VERSION_5_1) 45 46/* 47 * Status codes 48 */ 49 50#define STATUS_SUCCESS (0x00000000L) 51#define STATUS_UNSUCCESSFUL (0xC0000001L) 52#define STATUS_PENDING (0x00000103L) 53#define STATUS_INSUFFICIENT_RESOURCES (0xC000009AL) 54#define STATUS_BUFFER_OVERFLOW (0x80000005L) 55#define STATUS_NOT_SUPPORTED (0xC00000BBL) 56 57#define RNDIS_STATUS_SUCCESS (STATUS_SUCCESS) 58#define RNDIS_STATUS_PENDING (STATUS_PENDING) 59#define RNDIS_STATUS_NOT_RECOGNIZED (0x00010001L) 60#define RNDIS_STATUS_NOT_COPIED (0x00010002L) 61#define RNDIS_STATUS_NOT_ACCEPTED (0x00010003L) 62#define RNDIS_STATUS_CALL_ACTIVE (0x00010007L) 63 64#define RNDIS_STATUS_ONLINE (0x40010003L) 65#define RNDIS_STATUS_RESET_START (0x40010004L) 66#define RNDIS_STATUS_RESET_END (0x40010005L) 67#define RNDIS_STATUS_RING_STATUS (0x40010006L) 68#define RNDIS_STATUS_CLOSED (0x40010007L) 69#define RNDIS_STATUS_WAN_LINE_UP (0x40010008L) 70#define RNDIS_STATUS_WAN_LINE_DOWN (0x40010009L) 71#define RNDIS_STATUS_WAN_FRAGMENT (0x4001000AL) 72#define RNDIS_STATUS_MEDIA_CONNECT (0x4001000BL) 73#define RNDIS_STATUS_MEDIA_DISCONNECT (0x4001000CL) 74#define RNDIS_STATUS_HARDWARE_LINE_UP (0x4001000DL) 75#define RNDIS_STATUS_HARDWARE_LINE_DOWN (0x4001000EL) 76#define RNDIS_STATUS_INTERFACE_UP (0x4001000FL) 77#define RNDIS_STATUS_INTERFACE_DOWN (0x40010010L) 78#define RNDIS_STATUS_MEDIA_BUSY (0x40010011L) 79#define RNDIS_STATUS_MEDIA_SPECIFIC_INDICATION (0x40010012L) 80#define RNDIS_STATUS_WW_INDICATION RNDIS_STATUS_MEDIA_SPECIFIC_INDICATION 81#define RNDIS_STATUS_LINK_SPEED_CHANGE (0x40010013L) 82 83#define RNDIS_STATUS_NOT_RESETTABLE (0x80010001L) 84#define RNDIS_STATUS_SOFT_ERRORS (0x80010003L) 85#define RNDIS_STATUS_HARD_ERRORS (0x80010004L) 86#define RNDIS_STATUS_BUFFER_OVERFLOW (STATUS_BUFFER_OVERFLOW) 87 88#define RNDIS_STATUS_FAILURE (STATUS_UNSUCCESSFUL) 89#define RNDIS_STATUS_RESOURCES (STATUS_INSUFFICIENT_RESOURCES) 90#define RNDIS_STATUS_CLOSING (0xC0010002L) 91#define RNDIS_STATUS_BAD_VERSION (0xC0010004L) 92#define RNDIS_STATUS_BAD_CHARACTERISTICS (0xC0010005L) 93#define RNDIS_STATUS_ADAPTER_NOT_FOUND (0xC0010006L) 94#define RNDIS_STATUS_OPEN_FAILED (0xC0010007L) 95#define RNDIS_STATUS_DEVICE_FAILED (0xC0010008L) 96#define RNDIS_STATUS_MULTICAST_FULL (0xC0010009L) 97#define RNDIS_STATUS_MULTICAST_EXISTS (0xC001000AL) 98#define RNDIS_STATUS_MULTICAST_NOT_FOUND (0xC001000BL) 99#define RNDIS_STATUS_REQUEST_ABORTED (0xC001000CL) 100#define RNDIS_STATUS_RESET_IN_PROGRESS (0xC001000DL) 101#define RNDIS_STATUS_CLOSING_INDICATING (0xC001000EL) 102#define RNDIS_STATUS_NOT_SUPPORTED (STATUS_NOT_SUPPORTED) 103#define RNDIS_STATUS_INVALID_PACKET (0xC001000FL) 104#define RNDIS_STATUS_OPEN_LIST_FULL (0xC0010010L) 105#define RNDIS_STATUS_ADAPTER_NOT_READY (0xC0010011L) 106#define RNDIS_STATUS_ADAPTER_NOT_OPEN (0xC0010012L) 107#define RNDIS_STATUS_NOT_INDICATING (0xC0010013L) 108#define RNDIS_STATUS_INVALID_LENGTH (0xC0010014L) 109#define RNDIS_STATUS_INVALID_DATA (0xC0010015L) 110#define RNDIS_STATUS_BUFFER_TOO_SHORT (0xC0010016L) 111#define RNDIS_STATUS_INVALID_OID (0xC0010017L) 112#define RNDIS_STATUS_ADAPTER_REMOVED (0xC0010018L) 113#define RNDIS_STATUS_UNSUPPORTED_MEDIA (0xC0010019L) 114#define RNDIS_STATUS_GROUP_ADDRESS_IN_USE (0xC001001AL) 115#define RNDIS_STATUS_FILE_NOT_FOUND (0xC001001BL) 116#define RNDIS_STATUS_ERROR_READING_FILE (0xC001001CL) 117#define RNDIS_STATUS_ALREADY_MAPPED (0xC001001DL) 118#define RNDIS_STATUS_RESOURCE_CONFLICT (0xC001001EL) 119#define RNDIS_STATUS_NO_CABLE (0xC001001FL) 120 121#define RNDIS_STATUS_INVALID_SAP (0xC0010020L) 122#define RNDIS_STATUS_SAP_IN_USE (0xC0010021L) 123#define RNDIS_STATUS_INVALID_ADDRESS (0xC0010022L) 124#define RNDIS_STATUS_VC_NOT_ACTIVATED (0xC0010023L) 125#define RNDIS_STATUS_DEST_OUT_OF_ORDER (0xC0010024L) 126#define RNDIS_STATUS_VC_NOT_AVAILABLE (0xC0010025L) 127#define RNDIS_STATUS_CELLRATE_NOT_AVAILABLE (0xC0010026L) 128#define RNDIS_STATUS_INCOMPATABLE_QOS (0xC0010027L) 129#define RNDIS_STATUS_AAL_PARAMS_UNSUPPORTED (0xC0010028L) 130#define RNDIS_STATUS_NO_ROUTE_TO_DESTINATION (0xC0010029L) 131 132#define RNDIS_STATUS_TOKEN_RING_OPEN_ERROR (0xC0011000L) 133 134 135/* 136 * Object Identifiers used by NdisRequest Query/Set Information 137 */ 138 139/* 140 * General Objects 141 */ 142 143#define RNDIS_OID_GEN_SUPPORTED_LIST 0x00010101 144#define RNDIS_OID_GEN_HARDWARE_STATUS 0x00010102 145#define RNDIS_OID_GEN_MEDIA_SUPPORTED 0x00010103 146#define RNDIS_OID_GEN_MEDIA_IN_USE 0x00010104 147#define RNDIS_OID_GEN_MAXIMUM_LOOKAHEAD 0x00010105 148#define RNDIS_OID_GEN_MAXIMUM_FRAME_SIZE 0x00010106 149#define RNDIS_OID_GEN_LINK_SPEED 0x00010107 150#define RNDIS_OID_GEN_TRANSMIT_BUFFER_SPACE 0x00010108 151#define RNDIS_OID_GEN_RECEIVE_BUFFER_SPACE 0x00010109 152#define RNDIS_OID_GEN_TRANSMIT_BLOCK_SIZE 0x0001010A 153#define RNDIS_OID_GEN_RECEIVE_BLOCK_SIZE 0x0001010B 154#define RNDIS_OID_GEN_VENDOR_ID 0x0001010C 155#define RNDIS_OID_GEN_VENDOR_DESCRIPTION 0x0001010D 156#define RNDIS_OID_GEN_CURRENT_PACKET_FILTER 0x0001010E 157#define RNDIS_OID_GEN_CURRENT_LOOKAHEAD 0x0001010F 158#define RNDIS_OID_GEN_DRIVER_VERSION 0x00010110 159#define RNDIS_OID_GEN_MAXIMUM_TOTAL_SIZE 0x00010111 160#define RNDIS_OID_GEN_PROTOCOL_OPTIONS 0x00010112 161#define RNDIS_OID_GEN_MAC_OPTIONS 0x00010113 162#define RNDIS_OID_GEN_MEDIA_CONNECT_STATUS 0x00010114 163#define RNDIS_OID_GEN_MAXIMUM_SEND_PACKETS 0x00010115 164#define RNDIS_OID_GEN_VENDOR_DRIVER_VERSION 0x00010116 165#define RNDIS_OID_GEN_NETWORK_LAYER_ADDRESSES 0x00010118 166#define RNDIS_OID_GEN_TRANSPORT_HEADER_OFFSET 0x00010119 167#define RNDIS_OID_GEN_MACHINE_NAME 0x0001021A 168#define RNDIS_OID_GEN_RNDIS_CONFIG_PARAMETER 0x0001021B 169 170/* 171 * For receive side scale 172 */ 173/* Query only */ 174#define RNDIS_OID_GEN_RSS_CAPABILITIES 0x00010203 175/* Query and set */ 176#define RNDIS_OID_GEN_RSS_PARAMETERS 0x00010204 177 178#define RNDIS_OID_GEN_XMIT_OK 0x00020101 179#define RNDIS_OID_GEN_RCV_OK 0x00020102 180#define RNDIS_OID_GEN_XMIT_ERROR 0x00020103 181#define RNDIS_OID_GEN_RCV_ERROR 0x00020104 182#define RNDIS_OID_GEN_RCV_NO_BUFFER 0x00020105 183 184#define RNDIS_OID_GEN_DIRECTED_BYTES_XMIT 0x00020201 185#define RNDIS_OID_GEN_DIRECTED_FRAMES_XMIT 0x00020202 186#define RNDIS_OID_GEN_MULTICAST_BYTES_XMIT 0x00020203 187#define RNDIS_OID_GEN_MULTICAST_FRAMES_XMIT 0x00020204 188#define RNDIS_OID_GEN_BROADCAST_BYTES_XMIT 0x00020205 189#define RNDIS_OID_GEN_BROADCAST_FRAMES_XMIT 0x00020206 190#define RNDIS_OID_GEN_DIRECTED_BYTES_RCV 0x00020207 191#define RNDIS_OID_GEN_DIRECTED_FRAMES_RCV 0x00020208 192#define RNDIS_OID_GEN_MULTICAST_BYTES_RCV 0x00020209 193#define RNDIS_OID_GEN_MULTICAST_FRAMES_RCV 0x0002020A 194#define RNDIS_OID_GEN_BROADCAST_BYTES_RCV 0x0002020B 195#define RNDIS_OID_GEN_BROADCAST_FRAMES_RCV 0x0002020C 196 197#define RNDIS_OID_GEN_RCV_CRC_ERROR 0x0002020D 198#define RNDIS_OID_GEN_TRANSMIT_QUEUE_LENGTH 0x0002020E 199 200#define RNDIS_OID_GEN_GET_TIME_CAPS 0x0002020F 201#define RNDIS_OID_GEN_GET_NETCARD_TIME 0x00020210 202 203/* 204 * These are connection-oriented general OIDs. 205 * These replace the above OIDs for connection-oriented media. 206 */ 207#define RNDIS_OID_GEN_CO_SUPPORTED_LIST 0x00010101 208#define RNDIS_OID_GEN_CO_HARDWARE_STATUS 0x00010102 209#define RNDIS_OID_GEN_CO_MEDIA_SUPPORTED 0x00010103 210#define RNDIS_OID_GEN_CO_MEDIA_IN_USE 0x00010104 211#define RNDIS_OID_GEN_CO_LINK_SPEED 0x00010105 212#define RNDIS_OID_GEN_CO_VENDOR_ID 0x00010106 213#define RNDIS_OID_GEN_CO_VENDOR_DESCRIPTION 0x00010107 214#define RNDIS_OID_GEN_CO_DRIVER_VERSION 0x00010108 215#define RNDIS_OID_GEN_CO_PROTOCOL_OPTIONS 0x00010109 216#define RNDIS_OID_GEN_CO_MAC_OPTIONS 0x0001010A 217#define RNDIS_OID_GEN_CO_MEDIA_CONNECT_STATUS 0x0001010B 218#define RNDIS_OID_GEN_CO_VENDOR_DRIVER_VERSION 0x0001010C 219#define RNDIS_OID_GEN_CO_MINIMUM_LINK_SPEED 0x0001010D 220 221#define RNDIS_OID_GEN_CO_GET_TIME_CAPS 0x00010201 222#define RNDIS_OID_GEN_CO_GET_NETCARD_TIME 0x00010202 223 224/* 225 * These are connection-oriented statistics OIDs. 226 */ 227#define RNDIS_OID_GEN_CO_XMIT_PDUS_OK 0x00020101 228#define RNDIS_OID_GEN_CO_RCV_PDUS_OK 0x00020102 229#define RNDIS_OID_GEN_CO_XMIT_PDUS_ERROR 0x00020103 230#define RNDIS_OID_GEN_CO_RCV_PDUS_ERROR 0x00020104 231#define RNDIS_OID_GEN_CO_RCV_PDUS_NO_BUFFER 0x00020105 232 233 234#define RNDIS_OID_GEN_CO_RCV_CRC_ERROR 0x00020201 235#define RNDIS_OID_GEN_CO_TRANSMIT_QUEUE_LENGTH 0x00020202 236#define RNDIS_OID_GEN_CO_BYTES_XMIT 0x00020203 237#define RNDIS_OID_GEN_CO_BYTES_RCV 0x00020204 238#define RNDIS_OID_GEN_CO_BYTES_XMIT_OUTSTANDING 0x00020205 239#define RNDIS_OID_GEN_CO_NETCARD_LOAD 0x00020206 240 241/* 242 * These are objects for Connection-oriented media call-managers. 243 */ 244#define RNDIS_OID_CO_ADD_PVC 0xFF000001 245#define RNDIS_OID_CO_DELETE_PVC 0xFF000002 246#define RNDIS_OID_CO_GET_CALL_INFORMATION 0xFF000003 247#define RNDIS_OID_CO_ADD_ADDRESS 0xFF000004 248#define RNDIS_OID_CO_DELETE_ADDRESS 0xFF000005 249#define RNDIS_OID_CO_GET_ADDRESSES 0xFF000006 250#define RNDIS_OID_CO_ADDRESS_CHANGE 0xFF000007 251#define RNDIS_OID_CO_SIGNALING_ENABLED 0xFF000008 252#define RNDIS_OID_CO_SIGNALING_DISABLED 0xFF000009 253 254 255/* 256 * 802.3 Objects (Ethernet) 257 */ 258 259#define RNDIS_OID_802_3_PERMANENT_ADDRESS 0x01010101 260#define RNDIS_OID_802_3_CURRENT_ADDRESS 0x01010102 261#define RNDIS_OID_802_3_MULTICAST_LIST 0x01010103 262#define RNDIS_OID_802_3_MAXIMUM_LIST_SIZE 0x01010104 263#define RNDIS_OID_802_3_MAC_OPTIONS 0x01010105 264 265/* 266 * 267 */ 268#define NDIS_802_3_MAC_OPTION_PRIORITY 0x00000001 269 270#define RNDIS_OID_802_3_RCV_ERROR_ALIGNMENT 0x01020101 271#define RNDIS_OID_802_3_XMIT_ONE_COLLISION 0x01020102 272#define RNDIS_OID_802_3_XMIT_MORE_COLLISIONS 0x01020103 273 274#define RNDIS_OID_802_3_XMIT_DEFERRED 0x01020201 275#define RNDIS_OID_802_3_XMIT_MAX_COLLISIONS 0x01020202 276#define RNDIS_OID_802_3_RCV_OVERRUN 0x01020203 277#define RNDIS_OID_802_3_XMIT_UNDERRUN 0x01020204 278#define RNDIS_OID_802_3_XMIT_HEARTBEAT_FAILURE 0x01020205 279#define RNDIS_OID_802_3_XMIT_TIMES_CRS_LOST 0x01020206 280#define RNDIS_OID_802_3_XMIT_LATE_COLLISIONS 0x01020207 281 282 283/* 284 * RNDIS MP custom OID for test 285 */ 286#define OID_RNDISMP_GET_RECEIVE_BUFFERS 0xFFA0C90D // Query only 287 288 289/* 290 * Remote NDIS message types 291 */ 292#define REMOTE_NDIS_PACKET_MSG 0x00000001 293#define REMOTE_NDIS_INITIALIZE_MSG 0x00000002 294#define REMOTE_NDIS_HALT_MSG 0x00000003 295#define REMOTE_NDIS_QUERY_MSG 0x00000004 296#define REMOTE_NDIS_SET_MSG 0x00000005 297#define REMOTE_NDIS_RESET_MSG 0x00000006 298#define REMOTE_NDIS_INDICATE_STATUS_MSG 0x00000007 299#define REMOTE_NDIS_KEEPALIVE_MSG 0x00000008 300 301#define REMOTE_CONDIS_MP_CREATE_VC_MSG 0x00008001 302#define REMOTE_CONDIS_MP_DELETE_VC_MSG 0x00008002 303#define REMOTE_CONDIS_MP_ACTIVATE_VC_MSG 0x00008005 304#define REMOTE_CONDIS_MP_DEACTIVATE_VC_MSG 0x00008006 305#define REMOTE_CONDIS_INDICATE_STATUS_MSG 0x00008007 306 307/* 308 * Remote NDIS message completion types 309 */ 310#define REMOTE_NDIS_INITIALIZE_CMPLT 0x80000002 311#define REMOTE_NDIS_QUERY_CMPLT 0x80000004 312#define REMOTE_NDIS_SET_CMPLT 0x80000005 313#define REMOTE_NDIS_RESET_CMPLT 0x80000006 314#define REMOTE_NDIS_KEEPALIVE_CMPLT 0x80000008 315 316#define REMOTE_CONDIS_MP_CREATE_VC_CMPLT 0x80008001 317#define REMOTE_CONDIS_MP_DELETE_VC_CMPLT 0x80008002 318#define REMOTE_CONDIS_MP_ACTIVATE_VC_CMPLT 0x80008005 319#define REMOTE_CONDIS_MP_DEACTIVATE_VC_CMPLT 0x80008006 320 321/* 322 * Reserved message type for private communication between lower-layer 323 * host driver and remote device, if necessary. 324 */ 325#define REMOTE_NDIS_BUS_MSG 0xff000001 326 327/* 328 * Defines for DeviceFlags in rndis_initialize_complete 329 */ 330#define RNDIS_DF_CONNECTIONLESS 0x00000001 331#define RNDIS_DF_CONNECTION_ORIENTED 0x00000002 332#define RNDIS_DF_RAW_DATA 0x00000004 333 334/* 335 * Remote NDIS medium types. 336 */ 337#define RNDIS_MEDIUM_802_3 0x00000000 338#define RNDIS_MEDIUM_802_5 0x00000001 339#define RNDIS_MEDIUM_FDDI 0x00000002 340#define RNDIS_MEDIUM_WAN 0x00000003 341#define RNDIS_MEDIUM_LOCAL_TALK 0x00000004 342#define RNDIS_MEDIUM_ARCNET_RAW 0x00000006 343#define RNDIS_MEDIUM_ARCNET_878_2 0x00000007 344#define RNDIS_MEDIUM_ATM 0x00000008 345#define RNDIS_MEDIUM_WIRELESS_WAN 0x00000009 346#define RNDIS_MEDIUM_IRDA 0x0000000a 347#define RNDIS_MEDIUM_CO_WAN 0x0000000b 348/* Not a real medium, defined as an upper bound */ 349#define RNDIS_MEDIUM_MAX 0x0000000d 350 351/* 352 * Remote NDIS medium connection states. 353 */ 354#define RNDIS_MEDIA_STATE_CONNECTED 0x00000000 355#define RNDIS_MEDIA_STATE_DISCONNECTED 0x00000001 356 357/* 358 * Remote NDIS version numbers 359 */ 360#define RNDIS_MAJOR_VERSION 0x00000001 361#define RNDIS_MINOR_VERSION 0x00000000 362 363 364/* 365 * Remote NDIS offload parameters 366 */ 367#define RNDIS_OBJECT_TYPE_DEFAULT 0x80 368 369#define RNDIS_OFFLOAD_PARAMETERS_REVISION_3 3 370#define RNDIS_OFFLOAD_PARAMETERS_NO_CHANGE 0 371#define RNDIS_OFFLOAD_PARAMETERS_LSOV2_DISABLED 1 372#define RNDIS_OFFLOAD_PARAMETERS_LSOV2_ENABLED 2 373#define RNDIS_OFFLOAD_PARAMETERS_LSOV1_ENABLED 2 374#define RNDIS_OFFLOAD_PARAMETERS_RSC_DISABLED 1 375#define RNDIS_OFFLOAD_PARAMETERS_RSC_ENABLED 2 376#define RNDIS_OFFLOAD_PARAMETERS_TX_RX_DISABLED 1 377#define RNDIS_OFFLOAD_PARAMETERS_TX_ENABLED_RX_DISABLED 2 378#define RNDIS_OFFLOAD_PARAMETERS_RX_ENABLED_TX_DISABLED 3 379#define RNDIS_OFFLOAD_PARAMETERS_TX_RX_ENABLED 4 380 381#define RNDIS_TCP_LARGE_SEND_OFFLOAD_V2_TYPE 1 382#define RNDIS_TCP_LARGE_SEND_OFFLOAD_IPV4 0 383#define RNDIS_TCP_LARGE_SEND_OFFLOAD_IPV6 1 384 385 386#define RNDIS_OID_TCP_OFFLOAD_CURRENT_CONFIG 0xFC01020B /* query only */ 387#define RNDIS_OID_TCP_OFFLOAD_PARAMETERS 0xFC01020C /* set only */ 388#define RNDIS_OID_TCP_OFFLOAD_HARDWARE_CAPABILITIES 0xFC01020D/* query only */ 389#define RNDIS_OID_TCP_CONNECTION_OFFLOAD_CURRENT_CONFIG 0xFC01020E /* query only */ 390#define RNDIS_OID_TCP_CONNECTION_OFFLOAD_HARDWARE_CAPABILITIES 0xFC01020F /* query */ 391#define RNDIS_OID_OFFLOAD_ENCAPSULATION 0x0101010A /* set/query */ 392 393/* 394 * NdisInitialize message 395 */ 396typedef struct rndis_initialize_request_ { 397 /* RNDIS request ID */ 398 uint32_t request_id; 399 uint32_t major_version; 400 uint32_t minor_version; 401 uint32_t max_xfer_size; 402} rndis_initialize_request; 403 404/* 405 * Response to NdisInitialize 406 */ 407typedef struct rndis_initialize_complete_ { 408 /* RNDIS request ID */ 409 uint32_t request_id; 410 /* RNDIS status */ 411 uint32_t status; 412 uint32_t major_version; 413 uint32_t minor_version; 414 uint32_t device_flags; 415 /* RNDIS medium */ 416 uint32_t medium; 417 uint32_t max_pkts_per_msg; 418 uint32_t max_xfer_size; 419 uint32_t pkt_align_factor; 420 uint32_t af_list_offset; 421 uint32_t af_list_size; 422} rndis_initialize_complete; 423 424/* 425 * Call manager devices only: Information about an address family 426 * supported by the device is appended to the response to NdisInitialize. 427 */ 428typedef struct rndis_co_address_family_ { 429 /* RNDIS AF */ 430 uint32_t address_family; 431 uint32_t major_version; 432 uint32_t minor_version; 433} rndis_co_address_family; 434 435/* 436 * NdisHalt message 437 */ 438typedef struct rndis_halt_request_ { 439 /* RNDIS request ID */ 440 uint32_t request_id; 441} rndis_halt_request; 442 443/* 444 * NdisQueryRequest message 445 */ 446typedef struct rndis_query_request_ { 447 /* RNDIS request ID */ 448 uint32_t request_id; 449 /* RNDIS OID */ 450 uint32_t oid; 451 uint32_t info_buffer_length; 452 uint32_t info_buffer_offset; 453 /* RNDIS handle */ 454 uint32_t device_vc_handle; 455} rndis_query_request; 456 457/* 458 * Response to NdisQueryRequest 459 */ 460typedef struct rndis_query_complete_ { 461 /* RNDIS request ID */ 462 uint32_t request_id; 463 /* RNDIS status */ 464 uint32_t status; 465 uint32_t info_buffer_length; 466 uint32_t info_buffer_offset; 467} rndis_query_complete; 468 469/* 470 * NdisSetRequest message 471 */ 472typedef struct rndis_set_request_ { 473 /* RNDIS request ID */ 474 uint32_t request_id; 475 /* RNDIS OID */ 476 uint32_t oid; 477 uint32_t info_buffer_length; 478 uint32_t info_buffer_offset; 479 /* RNDIS handle */ 480 uint32_t device_vc_handle; 481} rndis_set_request; 482 483/* 484 * Response to NdisSetRequest 485 */ 486typedef struct rndis_set_complete_ { 487 /* RNDIS request ID */ 488 uint32_t request_id; 489 /* RNDIS status */ 490 uint32_t status; 491} rndis_set_complete; 492 493/* 494 * NdisReset message 495 */ 496typedef struct rndis_reset_request_ { 497 uint32_t reserved; 498} rndis_reset_request; 499 500/* 501 * Response to NdisReset 502 */ 503typedef struct rndis_reset_complete_ { 504 /* RNDIS status */ 505 uint32_t status; 506 uint32_t addressing_reset; 507} rndis_reset_complete; 508 509/* 510 * NdisMIndicateStatus message 511 */ 512typedef struct rndis_indicate_status_ { 513 /* RNDIS status */ 514 uint32_t status; 515 uint32_t status_buf_length; 516 uint32_t status_buf_offset; 517} rndis_indicate_status; 518 519/* 520 * Diagnostic information passed as the status buffer in 521 * rndis_indicate_status messages signifying error conditions. 522 */ 523typedef struct rndis_diagnostic_info_ { 524 /* RNDIS status */ 525 uint32_t diag_status; 526 uint32_t error_offset; 527} rndis_diagnostic_info; 528 529/* 530 * NdisKeepAlive message 531 */ 532typedef struct rndis_keepalive_request_ { 533 /* RNDIS request ID */ 534 uint32_t request_id; 535} rndis_keepalive_request; 536 537/* 538 * Response to NdisKeepAlive 539 */ 540typedef struct rndis_keepalive_complete_ { 541 /* RNDIS request ID */ 542 uint32_t request_id; 543 /* RNDIS status */ 544 uint32_t status; 545} rndis_keepalive_complete; 546 547/* 548 * Data message. All offset fields contain byte offsets from the beginning 549 * of the rndis_packet structure. All length fields are in bytes. 550 * VcHandle is set to 0 for connectionless data, otherwise it 551 * contains the VC handle. 552 */ 553typedef struct rndis_packet_ { 554 uint32_t data_offset; 555 uint32_t data_length; 556 uint32_t oob_data_offset; 557 uint32_t oob_data_length; 558 uint32_t num_oob_data_elements; 559 uint32_t per_pkt_info_offset; 560 uint32_t per_pkt_info_length; 561 /* RNDIS handle */ 562 uint32_t vc_handle; 563 uint32_t reserved; 564} rndis_packet; 565 566typedef struct rndis_packet_ex_ { 567 uint32_t data_offset; 568 uint32_t data_length; 569 uint32_t oob_data_offset; 570 uint32_t oob_data_length; 571 uint32_t num_oob_data_elements; 572 uint32_t per_pkt_info_offset; 573 uint32_t per_pkt_info_length; 574 /* RNDIS handle */ 575 uint32_t vc_handle; 576 uint32_t reserved; 577 uint64_t data_buf_id; 578 uint32_t data_buf_offset; 579 uint64_t next_header_buf_id; 580 uint32_t next_header_byte_offset; 581 uint32_t next_header_byte_count; 582} rndis_packet_ex; 583 584/* 585 * Optional Out of Band data associated with a Data message. 586 */ 587typedef struct rndis_oobd_ { 588 uint32_t size; 589 /* RNDIS class ID */ 590 uint32_t type; 591 uint32_t class_info_offset; 592} rndis_oobd; 593 594/* 595 * Packet extension field contents associated with a Data message. 596 */ 597typedef struct rndis_per_packet_info_ { 598 uint32_t size; 599 uint32_t type; 600 uint32_t per_packet_info_offset; 601} rndis_per_packet_info; 602 603typedef enum ndis_per_pkt_infotype_ { 604 tcpip_chksum_info, 605 ipsec_info, 606 tcp_large_send_info, 607 classification_handle_info, 608 ndis_reserved, 609 sgl_info, 610 ieee_8021q_info, 611 original_pkt_info, 612 pkt_cancel_id, 613 original_netbuf_list, 614 cached_netbuf_list, 615 short_pkt_padding_info, 616 max_perpkt_info 617} ndis_per_pkt_infotype; 618 619#define nbl_hash_value pkt_cancel_id 620#define nbl_hash_info original_netbuf_list 621 622typedef struct ndis_8021q_info_ { 623 union { 624 struct { 625 uint32_t user_pri : 3; /* User Priority */ 626 uint32_t cfi : 1; /* Canonical Format ID */ 627 uint32_t vlan_id : 12; 628 uint32_t reserved : 16; 629 } s1; 630 uint32_t value; 631 } u1; 632} ndis_8021q_info; 633 634struct rndis_object_header { 635 uint8_t type; 636 uint8_t revision; 637 uint16_t size; 638}; 639 640typedef struct rndis_offload_params_ { 641 struct rndis_object_header header; 642 uint8_t ipv4_csum; 643 uint8_t tcp_ipv4_csum; 644 uint8_t udp_ipv4_csum; 645 uint8_t tcp_ipv6_csum; 646 uint8_t udp_ipv6_csum; 647 uint8_t lso_v1; 648 uint8_t ip_sec_v1; 649 uint8_t lso_v2_ipv4; 650 uint8_t lso_v2_ipv6; 651 uint8_t tcp_connection_ipv4; 652 uint8_t tcp_connection_ipv6; 653 uint32_t flags; 654 uint8_t ip_sec_v2; 655 uint8_t ip_sec_v2_ipv4; 656 struct { 657 uint8_t rsc_ipv4; 658 uint8_t rsc_ipv6; 659 }; 660 struct { 661 uint8_t encapsulated_packet_task_offload; 662 uint8_t encapsulation_types; 663 }; 664 665} rndis_offload_params; 666 667 668typedef struct rndis_tcp_ip_csum_info_ { 669 union { 670 struct { 671 uint32_t is_ipv4:1; 672 uint32_t is_ipv6:1; 673 uint32_t tcp_csum:1; 674 uint32_t udp_csum:1; 675 uint32_t ip_header_csum:1; 676 uint32_t reserved:11; 677 uint32_t tcp_header_offset:10; 678 } xmit; 679 struct { 680 uint32_t tcp_csum_failed:1; 681 uint32_t udp_csum_failed:1; 682 uint32_t ip_csum_failed:1; 683 uint32_t tcp_csum_succeeded:1; 684 uint32_t udp_csum_succeeded:1; 685 uint32_t ip_csum_succeeded:1; 686 uint32_t loopback:1; 687 uint32_t tcp_csum_value_invalid:1; 688 uint32_t ip_csum_value_invalid:1; 689 } receive; 690 uint32_t value; 691 }; 692} rndis_tcp_ip_csum_info; 693 694struct rndis_hash_value { 695 uint32_t hash_value; 696} __packed; 697 698struct rndis_hash_info { 699 uint32_t hash_info; 700} __packed; 701 702#define NDIS_HASH_FUNCTION_MASK 0x000000FF /* see hash function */ 703#define NDIS_HASH_TYPE_MASK 0x00FFFF00 /* see hash type */ 704 705/* hash function */ 706#define NDIS_HASH_FUNCTION_TOEPLITZ 0x00000001 707 708/* hash type */ 709#define NDIS_HASH_IPV4 0x00000100 710#define NDIS_HASH_TCP_IPV4 0x00000200 711#define NDIS_HASH_IPV6 0x00000400 712#define NDIS_HASH_IPV6_EX 0x00000800 713#define NDIS_HASH_TCP_IPV6 0x00001000 714#define NDIS_HASH_TCP_IPV6_EX 0x00002000 715 716typedef struct rndis_tcp_tso_info_ { 717 union { 718 struct { 719 uint32_t unused:30; 720 uint32_t type:1; 721 uint32_t reserved2:1; 722 } xmit; 723 struct { 724 uint32_t mss:20; 725 uint32_t tcp_header_offset:10; 726 uint32_t type:1; 727 uint32_t reserved2:1; 728 } lso_v1_xmit; 729 struct { 730 uint32_t tcp_payload:30; 731 uint32_t type:1; 732 uint32_t reserved2:1; 733 } lso_v1_xmit_complete; 734 struct { 735 uint32_t mss:20; 736 uint32_t tcp_header_offset:10; 737 uint32_t type:1; 738 uint32_t ip_version:1; 739 } lso_v2_xmit; 740 struct { 741 uint32_t reserved:30; 742 uint32_t type:1; 743 uint32_t reserved2:1; 744 } lso_v2_xmit_complete; 745 uint32_t value; 746 }; 747} rndis_tcp_tso_info; 748 749#define RNDIS_HASHVAL_PPI_SIZE (sizeof(rndis_per_packet_info) + \ 750 sizeof(struct rndis_hash_value)) 751 752#define RNDIS_VLAN_PPI_SIZE (sizeof(rndis_per_packet_info) + \ 753 sizeof(ndis_8021q_info)) 754 755#define RNDIS_CSUM_PPI_SIZE (sizeof(rndis_per_packet_info) + \ 756 sizeof(rndis_tcp_ip_csum_info)) 757 758#define RNDIS_TSO_PPI_SIZE (sizeof(rndis_per_packet_info) + \ 759 sizeof(rndis_tcp_tso_info)) 760 761/* 762 * Format of Information buffer passed in a SetRequest for the OID 763 * OID_GEN_RNDIS_CONFIG_PARAMETER. 764 */ 765typedef struct rndis_config_parameter_info_ { 766 uint32_t parameter_name_offset; 767 uint32_t parameter_name_length; 768 uint32_t parameter_type; 769 uint32_t parameter_value_offset; 770 uint32_t parameter_value_length; 771} rndis_config_parameter_info; 772 773/* 774 * Values for ParameterType in rndis_config_parameter_info 775 */ 776#define RNDIS_CONFIG_PARAM_TYPE_INTEGER 0 777#define RNDIS_CONFIG_PARAM_TYPE_STRING 2 778 779 780/* 781 * CONDIS Miniport messages for connection oriented devices 782 * that do not implement a call manager. 783 */ 784 785/* 786 * CoNdisMiniportCreateVc message 787 */ 788typedef struct rcondis_mp_create_vc_ { 789 /* RNDIS request ID */ 790 uint32_t request_id; 791 /* RNDIS handle */ 792 uint32_t ndis_vc_handle; 793} rcondis_mp_create_vc; 794 795/* 796 * Response to CoNdisMiniportCreateVc 797 */ 798typedef struct rcondis_mp_create_vc_complete_ { 799 /* RNDIS request ID */ 800 uint32_t request_id; 801 /* RNDIS handle */ 802 uint32_t device_vc_handle; 803 /* RNDIS status */ 804 uint32_t status; 805} rcondis_mp_create_vc_complete; 806 807/* 808 * CoNdisMiniportDeleteVc message 809 */ 810typedef struct rcondis_mp_delete_vc_ { 811 /* RNDIS request ID */ 812 uint32_t request_id; 813 /* RNDIS handle */ 814 uint32_t device_vc_handle; 815} rcondis_mp_delete_vc; 816 817/* 818 * Response to CoNdisMiniportDeleteVc 819 */ 820typedef struct rcondis_mp_delete_vc_complete_ { 821 /* RNDIS request ID */ 822 uint32_t request_id; 823 /* RNDIS status */ 824 uint32_t status; 825} rcondis_mp_delete_vc_complete; 826 827/* 828 * CoNdisMiniportQueryRequest message 829 */ 830typedef struct rcondis_mp_query_request_ { 831 /* RNDIS request ID */ 832 uint32_t request_id; 833 /* RNDIS request type */ 834 uint32_t request_type; 835 /* RNDIS OID */ 836 uint32_t oid; 837 /* RNDIS handle */ 838 uint32_t device_vc_handle; 839 uint32_t info_buf_length; 840 uint32_t info_buf_offset; 841} rcondis_mp_query_request; 842 843/* 844 * CoNdisMiniportSetRequest message 845 */ 846typedef struct rcondis_mp_set_request_ { 847 /* RNDIS request ID */ 848 uint32_t request_id; 849 /* RNDIS request type */ 850 uint32_t request_type; 851 /* RNDIS OID */ 852 uint32_t oid; 853 /* RNDIS handle */ 854 uint32_t device_vc_handle; 855 uint32_t info_buf_length; 856 uint32_t info_buf_offset; 857} rcondis_mp_set_request; 858 859/* 860 * CoNdisIndicateStatus message 861 */ 862typedef struct rcondis_indicate_status_ { 863 /* RNDIS handle */ 864 uint32_t ndis_vc_handle; 865 /* RNDIS status */ 866 uint32_t status; 867 uint32_t status_buf_length; 868 uint32_t status_buf_offset; 869} rcondis_indicate_status; 870 871/* 872 * CONDIS Call/VC parameters 873 */ 874 875typedef struct rcondis_specific_parameters_ { 876 uint32_t parameter_type; 877 uint32_t parameter_length; 878 uint32_t parameter_offset; 879} rcondis_specific_parameters; 880 881typedef struct rcondis_media_parameters_ { 882 uint32_t flags; 883 uint32_t reserved1; 884 uint32_t reserved2; 885 rcondis_specific_parameters media_specific; 886} rcondis_media_parameters; 887 888typedef struct rndis_flowspec_ { 889 uint32_t token_rate; 890 uint32_t token_bucket_size; 891 uint32_t peak_bandwidth; 892 uint32_t latency; 893 uint32_t delay_variation; 894 uint32_t service_type; 895 uint32_t max_sdu_size; 896 uint32_t minimum_policed_size; 897} rndis_flowspec; 898 899typedef struct rcondis_call_manager_parameters_ { 900 rndis_flowspec transmit; 901 rndis_flowspec receive; 902 rcondis_specific_parameters call_mgr_specific; 903} rcondis_call_manager_parameters; 904 905/* 906 * CoNdisMiniportActivateVc message 907 */ 908typedef struct rcondis_mp_activate_vc_request_ { 909 /* RNDIS request ID */ 910 uint32_t request_id; 911 uint32_t flags; 912 /* RNDIS handle */ 913 uint32_t device_vc_handle; 914 uint32_t media_params_offset; 915 uint32_t media_params_length; 916 uint32_t call_mgr_params_offset; 917 uint32_t call_mgr_params_length; 918} rcondis_mp_activate_vc_request; 919 920/* 921 * Response to CoNdisMiniportActivateVc 922 */ 923typedef struct rcondis_mp_activate_vc_complete_ { 924 /* RNDIS request ID */ 925 uint32_t request_id; 926 /* RNDIS status */ 927 uint32_t status; 928} rcondis_mp_activate_vc_complete; 929 930/* 931 * CoNdisMiniportDeactivateVc message 932 */ 933typedef struct rcondis_mp_deactivate_vc_request_ { 934 /* RNDIS request ID */ 935 uint32_t request_id; 936 uint32_t flags; 937 /* RNDIS handle */ 938 uint32_t device_vc_handle; 939} rcondis_mp_deactivate_vc_request; 940 941/* 942 * Response to CoNdisMiniportDeactivateVc 943 */ 944typedef struct rcondis_mp_deactivate_vc_complete_ { 945 /* RNDIS request ID */ 946 uint32_t request_id; 947 /* RNDIS status */ 948 uint32_t status; 949} rcondis_mp_deactivate_vc_complete; 950 951/* 952 * union with all of the RNDIS messages 953 */ 954typedef union rndis_msg_container_ { 955 rndis_packet packet; 956 rndis_initialize_request init_request; 957 rndis_halt_request halt_request; 958 rndis_query_request query_request; 959 rndis_set_request set_request; 960 rndis_reset_request reset_request; 961 rndis_keepalive_request keepalive_request; 962 rndis_indicate_status indicate_status; 963 rndis_initialize_complete init_complete; 964 rndis_query_complete query_complete; 965 rndis_set_complete set_complete; 966 rndis_reset_complete reset_complete; 967 rndis_keepalive_complete keepalive_complete; 968 rcondis_mp_create_vc co_miniport_create_vc; 969 rcondis_mp_delete_vc co_miniport_delete_vc; 970 rcondis_indicate_status co_miniport_status; 971 rcondis_mp_activate_vc_request co_miniport_activate_vc; 972 rcondis_mp_deactivate_vc_request co_miniport_deactivate_vc; 973 rcondis_mp_create_vc_complete co_miniport_create_vc_complete; 974 rcondis_mp_delete_vc_complete co_miniport_delete_vc_complete; 975 rcondis_mp_activate_vc_complete co_miniport_activate_vc_complete; 976 rcondis_mp_deactivate_vc_complete co_miniport_deactivate_vc_complete; 977 rndis_packet_ex packet_ex; 978} rndis_msg_container; 979 980/* 981 * Remote NDIS message format 982 */ 983typedef struct rndis_msg_ { 984 uint32_t ndis_msg_type; 985 986 /* 987 * Total length of this message, from the beginning 988 * of the rndis_msg struct, in bytes. 989 */ 990 uint32_t msg_len; 991 992 /* Actual message */ 993 rndis_msg_container msg; 994} rndis_msg; 995 996 997/* 998 * Handy macros 999 */ 1000 1001/* 1002 * get the size of an RNDIS message. Pass in the message type, 1003 * rndis_set_request, rndis_packet for example 1004 */ 1005#define RNDIS_MESSAGE_SIZE(message) \ 1006 (sizeof(message) + (sizeof(rndis_msg) - sizeof(rndis_msg_container))) 1007 1008/* 1009 * get pointer to info buffer with message pointer 1010 */ 1011#define MESSAGE_TO_INFO_BUFFER(message) \ 1012 (((PUCHAR)(message)) + message->InformationBufferOffset) 1013 1014/* 1015 * get pointer to status buffer with message pointer 1016 */ 1017#define MESSAGE_TO_STATUS_BUFFER(message) \ 1018 (((PUCHAR)(message)) + message->StatusBufferOffset) 1019 1020/* 1021 * get pointer to OOBD buffer with message pointer 1022 */ 1023#define MESSAGE_TO_OOBD_BUFFER(message) \ 1024 (((PUCHAR)(message)) + message->OOBDataOffset) 1025 1026/* 1027 * get pointer to data buffer with message pointer 1028 */ 1029#define MESSAGE_TO_DATA_BUFFER(message) \ 1030 (((PUCHAR)(message)) + message->PerPacketInfoOffset) 1031 1032/* 1033 * get pointer to contained message from NDIS_MESSAGE pointer 1034 */ 1035#define RNDIS_MESSAGE_PTR_TO_MESSAGE_PTR(rndis_message) \ 1036 ((void *) &rndis_message->Message) 1037 1038/* 1039 * get pointer to contained message from NDIS_MESSAGE pointer 1040 */ 1041#define RNDIS_MESSAGE_RAW_PTR_TO_MESSAGE_PTR(rndis_message) \ 1042 ((void *) rndis_message) 1043 1044 1045 1046/* 1047 * Structures used in OID_RNDISMP_GET_RECEIVE_BUFFERS 1048 */ 1049 1050#define RNDISMP_RECEIVE_BUFFER_ELEM_FLAG_VMQ_RECEIVE_BUFFER 0x00000001 1051 1052typedef struct rndismp_rx_buf_elem_ { 1053 uint32_t flags; 1054 uint32_t length; 1055 uint64_t rx_buf_id; 1056 uint32_t gpadl_handle; 1057 void *rx_buf; 1058} rndismp_rx_buf_elem; 1059 1060typedef struct rndismp_rx_bufs_info_ { 1061 uint32_t num_rx_bufs; 1062 rndismp_rx_buf_elem rx_buf_elems[1]; 1063} rndismp_rx_bufs_info; 1064 1065 1066 1067#define RNDIS_HEADER_SIZE (sizeof(rndis_msg) - sizeof(rndis_msg_container)) 1068 1069#define NDIS_PACKET_TYPE_DIRECTED 0x00000001 1070#define NDIS_PACKET_TYPE_MULTICAST 0x00000002 1071#define NDIS_PACKET_TYPE_ALL_MULTICAST 0x00000004 1072#define NDIS_PACKET_TYPE_BROADCAST 0x00000008 1073#define NDIS_PACKET_TYPE_SOURCE_ROUTING 0x00000010 1074#define NDIS_PACKET_TYPE_PROMISCUOUS 0x00000020 1075#define NDIS_PACKET_TYPE_SMT 0x00000040 1076#define NDIS_PACKET_TYPE_ALL_LOCAL 0x00000080 1077#define NDIS_PACKET_TYPE_GROUP 0x00000100 1078#define NDIS_PACKET_TYPE_ALL_FUNCTIONAL 0x00000200 1079#define NDIS_PACKET_TYPE_FUNCTIONAL 0x00000400 1080#define NDIS_PACKET_TYPE_MAC_FRAME 0x00000800 1081 1082/* 1083 * Externs 1084 */ 1085struct hv_vmbus_channel; 1086 1087int netvsc_recv(struct hv_vmbus_channel *chan, 1088 netvsc_packet *packet, const rndis_tcp_ip_csum_info *csum_info, 1089 const struct rndis_hash_info *hash_info, 1090 const struct rndis_hash_value *hash_value); 1091void netvsc_channel_rollup(struct hv_vmbus_channel *chan); 1092 1093void* hv_set_rppi_data(rndis_msg *rndis_mesg, 1094 uint32_t rppi_size, 1095 int pkt_type); 1096 1097void* hv_get_ppi_data(rndis_packet *rpkt, uint32_t type); 1098 1099#endif /* __HV_RNDIS_H__ */ 1100 1101