linux/drivers/staging/hv/hyperv_net.h
<<
>>
Prefs
   1/*
   2 *
   3 * Copyright (c) 2011, Microsoft Corporation.
   4 *
   5 * This program is free software; you can redistribute it and/or modify it
   6 * under the terms and conditions of the GNU General Public License,
   7 * version 2, as published by the Free Software Foundation.
   8 *
   9 * This program is distributed in the hope it will be useful, but WITHOUT
  10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
  12 * more details.
  13 *
  14 * You should have received a copy of the GNU General Public License along with
  15 * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
  16 * Place - Suite 330, Boston, MA 02111-1307 USA.
  17 *
  18 * Authors:
  19 *   Haiyang Zhang <haiyangz@microsoft.com>
  20 *   Hank Janssen  <hjanssen@microsoft.com>
  21 *   K. Y. Srinivasan <kys@microsoft.com>
  22 *
  23 */
  24
  25#ifndef _HYPERV_NET_H
  26#define _HYPERV_NET_H
  27
  28#include <linux/list.h>
  29#include "hyperv.h"
  30
  31/* Fwd declaration */
  32struct hv_netvsc_packet;
  33
  34/* Represent the xfer page packet which contains 1 or more netvsc packet */
  35struct xferpage_packet {
  36        struct list_head list_ent;
  37
  38        /* # of netvsc packets this xfer packet contains */
  39        u32 count;
  40};
  41
  42/* The number of pages which are enough to cover jumbo frame buffer. */
  43#define NETVSC_PACKET_MAXPAGE           4
  44
  45/*
  46 * Represent netvsc packet which contains 1 RNDIS and 1 ethernet frame
  47 * within the RNDIS
  48 */
  49struct hv_netvsc_packet {
  50        /* Bookkeeping stuff */
  51        struct list_head list_ent;
  52
  53        struct hv_device *device;
  54        bool is_data_pkt;
  55
  56        /*
  57         * Valid only for receives when we break a xfer page packet
  58         * into multiple netvsc packets
  59         */
  60        struct xferpage_packet *xfer_page_pkt;
  61
  62        union {
  63                struct {
  64                        u64 recv_completion_tid;
  65                        void *recv_completion_ctx;
  66                        void (*recv_completion)(void *context);
  67                } recv;
  68                struct {
  69                        u64 send_completion_tid;
  70                        void *send_completion_ctx;
  71                        void (*send_completion)(void *context);
  72                } send;
  73        } completion;
  74
  75        /* This points to the memory after page_buf */
  76        void *extension;
  77
  78        u32 total_data_buflen;
  79        /* Points to the send/receive buffer where the ethernet frame is */
  80        u32 page_buf_cnt;
  81        struct hv_page_buffer page_buf[NETVSC_PACKET_MAXPAGE];
  82};
  83
  84struct netvsc_device_info {
  85        unsigned char mac_adr[6];
  86        bool link_state;        /* 0 - link up, 1 - link down */
  87        int  ring_size;
  88};
  89
  90/* Interface */
  91int netvsc_device_add(struct hv_device *device, void *additional_info);
  92int netvsc_device_remove(struct hv_device *device);
  93int netvsc_send(struct hv_device *device,
  94                struct hv_netvsc_packet *packet);
  95void netvsc_linkstatus_callback(struct hv_device *device_obj,
  96                                unsigned int status);
  97int netvsc_recv_callback(struct hv_device *device_obj,
  98                        struct hv_netvsc_packet *packet);
  99int netvsc_initialize(struct hv_driver *drv);
 100int rndis_filter_open(struct hv_device *dev);
 101int rndis_filter_close(struct hv_device *dev);
 102int rndis_filte_device_add(struct hv_device *dev,
 103                        void *additional_info);
 104int rndis_filter_device_remove(struct hv_device *dev);
 105int rndis_filter_receive(struct hv_device *dev,
 106                        struct hv_netvsc_packet *pkt);
 107
 108
 109
 110int rndis_filter_send(struct hv_device *dev,
 111                        struct hv_netvsc_packet *pkt);
 112
 113#define NVSP_INVALID_PROTOCOL_VERSION   ((u32)0xFFFFFFFF)
 114
 115#define NVSP_PROTOCOL_VERSION_1         2
 116#define NVSP_MIN_PROTOCOL_VERSION       NVSP_PROTOCOL_VERSION_1
 117#define NVSP_MAX_PROTOCOL_VERSION       NVSP_PROTOCOL_VERSION_1
 118
 119enum {
 120        NVSP_MSG_TYPE_NONE = 0,
 121
 122        /* Init Messages */
 123        NVSP_MSG_TYPE_INIT                      = 1,
 124        NVSP_MSG_TYPE_INIT_COMPLETE             = 2,
 125
 126        NVSP_VERSION_MSG_START                  = 100,
 127
 128        /* Version 1 Messages */
 129        NVSP_MSG1_TYPE_SEND_NDIS_VER            = NVSP_VERSION_MSG_START,
 130
 131        NVSP_MSG1_TYPE_SEND_RECV_BUF,
 132        NVSP_MSG1_TYPE_SEND_RECV_BUF_COMPLETE,
 133        NVSP_MSG1_TYPE_REVOKE_RECV_BUF,
 134
 135        NVSP_MSG1_TYPE_SEND_SEND_BUF,
 136        NVSP_MSG1_TYPE_SEND_SEND_BUF_COMPLETE,
 137        NVSP_MSG1_TYPE_REVOKE_SEND_BUF,
 138
 139        NVSP_MSG1_TYPE_SEND_RNDIS_PKT,
 140        NVSP_MSG1_TYPE_SEND_RNDIS_PKT_COMPLETE,
 141
 142        /*
 143         * This should be set to the number of messages for the version with
 144         * the maximum number of messages.
 145         */
 146        NVSP_NUM_MSG_PER_VERSION                = 9,
 147};
 148
 149enum {
 150        NVSP_STAT_NONE = 0,
 151        NVSP_STAT_SUCCESS,
 152        NVSP_STAT_FAIL,
 153        NVSP_STAT_PROTOCOL_TOO_NEW,
 154        NVSP_STAT_PROTOCOL_TOO_OLD,
 155        NVSP_STAT_INVALID_RNDIS_PKT,
 156        NVSP_STAT_BUSY,
 157        NVSP_STAT_MAX,
 158};
 159
 160struct nvsp_message_header {
 161        u32 msg_type;
 162};
 163
 164/* Init Messages */
 165
 166/*
 167 * This message is used by the VSC to initialize the channel after the channels
 168 * has been opened. This message should never include anything other then
 169 * versioning (i.e. this message will be the same for ever).
 170 */
 171struct nvsp_message_init {
 172        u32 min_protocol_ver;
 173        u32 max_protocol_ver;
 174} __packed;
 175
 176/*
 177 * This message is used by the VSP to complete the initialization of the
 178 * channel. This message should never include anything other then versioning
 179 * (i.e. this message will be the same for ever).
 180 */
 181struct nvsp_message_init_complete {
 182        u32 negotiated_protocol_ver;
 183        u32 max_mdl_chain_len;
 184        u32 status;
 185} __packed;
 186
 187union nvsp_message_init_uber {
 188        struct nvsp_message_init init;
 189        struct nvsp_message_init_complete init_complete;
 190} __packed;
 191
 192/* Version 1 Messages */
 193
 194/*
 195 * This message is used by the VSC to send the NDIS version to the VSP. The VSP
 196 * can use this information when handling OIDs sent by the VSC.
 197 */
 198struct nvsp_1_message_send_ndis_version {
 199        u32 ndis_major_ver;
 200        u32 ndis_minor_ver;
 201} __packed;
 202
 203/*
 204 * This message is used by the VSC to send a receive buffer to the VSP. The VSP
 205 * can then use the receive buffer to send data to the VSC.
 206 */
 207struct nvsp_1_message_send_receive_buffer {
 208        u32 gpadl_handle;
 209        u16 id;
 210} __packed;
 211
 212struct nvsp_1_receive_buffer_section {
 213        u32 offset;
 214        u32 sub_alloc_size;
 215        u32 num_sub_allocs;
 216        u32 end_offset;
 217} __packed;
 218
 219/*
 220 * This message is used by the VSP to acknowledge a receive buffer send by the
 221 * VSC. This message must be sent by the VSP before the VSP uses the receive
 222 * buffer.
 223 */
 224struct nvsp_1_message_send_receive_buffer_complete {
 225        u32 status;
 226        u32 num_sections;
 227
 228        /*
 229         * The receive buffer is split into two parts, a large suballocation
 230         * section and a small suballocation section. These sections are then
 231         * suballocated by a certain size.
 232         */
 233
 234        /*
 235         * For example, the following break up of the receive buffer has 6
 236         * large suballocations and 10 small suballocations.
 237         */
 238
 239        /*
 240         * |            Large Section          |  |   Small Section   |
 241         * ------------------------------------------------------------
 242         * |     |     |     |     |     |     |  | | | | | | | | | | |
 243         * |                                      |
 244         *  LargeOffset                            SmallOffset
 245         */
 246
 247        struct nvsp_1_receive_buffer_section sections[1];
 248} __packed;
 249
 250/*
 251 * This message is sent by the VSC to revoke the receive buffer.  After the VSP
 252 * completes this transaction, the vsp should never use the receive buffer
 253 * again.
 254 */
 255struct nvsp_1_message_revoke_receive_buffer {
 256        u16 id;
 257};
 258
 259/*
 260 * This message is used by the VSC to send a send buffer to the VSP. The VSC
 261 * can then use the send buffer to send data to the VSP.
 262 */
 263struct nvsp_1_message_send_send_buffer {
 264        u32 gpadl_handle;
 265        u16 id;
 266} __packed;
 267
 268/*
 269 * This message is used by the VSP to acknowledge a send buffer sent by the
 270 * VSC. This message must be sent by the VSP before the VSP uses the sent
 271 * buffer.
 272 */
 273struct nvsp_1_message_send_send_buffer_complete {
 274        u32 status;
 275
 276        /*
 277         * The VSC gets to choose the size of the send buffer and the VSP gets
 278         * to choose the sections size of the buffer.  This was done to enable
 279         * dynamic reconfigurations when the cost of GPA-direct buffers
 280         * decreases.
 281         */
 282        u32 section_size;
 283} __packed;
 284
 285/*
 286 * This message is sent by the VSC to revoke the send buffer.  After the VSP
 287 * completes this transaction, the vsp should never use the send buffer again.
 288 */
 289struct nvsp_1_message_revoke_send_buffer {
 290        u16 id;
 291};
 292
 293/*
 294 * This message is used by both the VSP and the VSC to send a RNDIS message to
 295 * the opposite channel endpoint.
 296 */
 297struct nvsp_1_message_send_rndis_packet {
 298        /*
 299         * This field is specified by RNIDS. They assume there's two different
 300         * channels of communication. However, the Network VSP only has one.
 301         * Therefore, the channel travels with the RNDIS packet.
 302         */
 303        u32 channel_type;
 304
 305        /*
 306         * This field is used to send part or all of the data through a send
 307         * buffer. This values specifies an index into the send buffer. If the
 308         * index is 0xFFFFFFFF, then the send buffer is not being used and all
 309         * of the data was sent through other VMBus mechanisms.
 310         */
 311        u32 send_buf_section_index;
 312        u32 send_buf_section_size;
 313} __packed;
 314
 315/*
 316 * This message is used by both the VSP and the VSC to complete a RNDIS message
 317 * to the opposite channel endpoint. At this point, the initiator of this
 318 * message cannot use any resources associated with the original RNDIS packet.
 319 */
 320struct nvsp_1_message_send_rndis_packet_complete {
 321        u32 status;
 322};
 323
 324union nvsp_1_message_uber {
 325        struct nvsp_1_message_send_ndis_version send_ndis_ver;
 326
 327        struct nvsp_1_message_send_receive_buffer send_recv_buf;
 328        struct nvsp_1_message_send_receive_buffer_complete
 329                                                send_recv_buf_complete;
 330        struct nvsp_1_message_revoke_receive_buffer revoke_recv_buf;
 331
 332        struct nvsp_1_message_send_send_buffer send_send_buf;
 333        struct nvsp_1_message_send_send_buffer_complete send_send_buf_complete;
 334        struct nvsp_1_message_revoke_send_buffer revoke_send_buf;
 335
 336        struct nvsp_1_message_send_rndis_packet send_rndis_pkt;
 337        struct nvsp_1_message_send_rndis_packet_complete
 338                                                send_rndis_pkt_complete;
 339} __packed;
 340
 341union nvsp_all_messages {
 342        union nvsp_message_init_uber init_msg;
 343        union nvsp_1_message_uber v1_msg;
 344} __packed;
 345
 346/* ALL Messages */
 347struct nvsp_message {
 348        struct nvsp_message_header hdr;
 349        union nvsp_all_messages msg;
 350} __packed;
 351
 352
 353
 354
 355/* #define NVSC_MIN_PROTOCOL_VERSION            1 */
 356/* #define NVSC_MAX_PROTOCOL_VERSION            1 */
 357
 358#define NETVSC_SEND_BUFFER_SIZE                 (64*1024)       /* 64K */
 359#define NETVSC_SEND_BUFFER_ID                   0xface
 360
 361
 362#define NETVSC_RECEIVE_BUFFER_SIZE              (1024*1024)     /* 1MB */
 363
 364#define NETVSC_RECEIVE_BUFFER_ID                0xcafe
 365
 366#define NETVSC_RECEIVE_SG_COUNT                 1
 367
 368/* Preallocated receive packets */
 369#define NETVSC_RECEIVE_PACKETLIST_COUNT         256
 370
 371#define NETVSC_PACKET_SIZE                      2048
 372
 373/* Per netvsc channel-specific */
 374struct netvsc_device {
 375        struct hv_device *dev;
 376
 377        atomic_t refcnt;
 378        atomic_t num_outstanding_sends;
 379        /*
 380         * List of free preallocated hv_netvsc_packet to represent receive
 381         * packet
 382         */
 383        struct list_head recv_pkt_list;
 384        spinlock_t recv_pkt_list_lock;
 385
 386        /* Send buffer allocated by us but manages by NetVSP */
 387        void *send_buf;
 388        u32 send_buf_size;
 389        u32 send_buf_gpadl_handle;
 390        u32 send_section_size;
 391
 392        /* Receive buffer allocated by us but manages by NetVSP */
 393        void *recv_buf;
 394        u32 recv_buf_size;
 395        u32 recv_buf_gpadl_handle;
 396        u32 recv_section_cnt;
 397        struct nvsp_1_receive_buffer_section *recv_section;
 398
 399        /* Used for NetVSP initialization protocol */
 400        struct completion channel_init_wait;
 401        struct nvsp_message channel_init_pkt;
 402
 403        struct nvsp_message revoke_packet;
 404        /* unsigned char HwMacAddr[HW_MACADDR_LEN]; */
 405
 406        /* Holds rndis device info */
 407        void *extension;
 408};
 409
 410
 411/*  Status codes */
 412
 413
 414#ifndef STATUS_SUCCESS
 415#define STATUS_SUCCESS                          (0x00000000L)
 416#endif
 417
 418#ifndef STATUS_UNSUCCESSFUL
 419#define STATUS_UNSUCCESSFUL                     (0xC0000001L)
 420#endif
 421
 422#ifndef STATUS_PENDING
 423#define STATUS_PENDING                          (0x00000103L)
 424#endif
 425
 426#ifndef STATUS_INSUFFICIENT_RESOURCES
 427#define STATUS_INSUFFICIENT_RESOURCES           (0xC000009AL)
 428#endif
 429
 430#ifndef STATUS_BUFFER_OVERFLOW
 431#define STATUS_BUFFER_OVERFLOW                  (0x80000005L)
 432#endif
 433
 434#ifndef STATUS_NOT_SUPPORTED
 435#define STATUS_NOT_SUPPORTED                    (0xC00000BBL)
 436#endif
 437
 438#define RNDIS_STATUS_SUCCESS                    (STATUS_SUCCESS)
 439#define RNDIS_STATUS_PENDING                    (STATUS_PENDING)
 440#define RNDIS_STATUS_NOT_RECOGNIZED             (0x00010001L)
 441#define RNDIS_STATUS_NOT_COPIED                 (0x00010002L)
 442#define RNDIS_STATUS_NOT_ACCEPTED               (0x00010003L)
 443#define RNDIS_STATUS_CALL_ACTIVE                (0x00010007L)
 444
 445#define RNDIS_STATUS_ONLINE                     (0x40010003L)
 446#define RNDIS_STATUS_RESET_START                (0x40010004L)
 447#define RNDIS_STATUS_RESET_END                  (0x40010005L)
 448#define RNDIS_STATUS_RING_STATUS                (0x40010006L)
 449#define RNDIS_STATUS_CLOSED                     (0x40010007L)
 450#define RNDIS_STATUS_WAN_LINE_UP                (0x40010008L)
 451#define RNDIS_STATUS_WAN_LINE_DOWN              (0x40010009L)
 452#define RNDIS_STATUS_WAN_FRAGMENT               (0x4001000AL)
 453#define RNDIS_STATUS_MEDIA_CONNECT              (0x4001000BL)
 454#define RNDIS_STATUS_MEDIA_DISCONNECT           (0x4001000CL)
 455#define RNDIS_STATUS_HARDWARE_LINE_UP           (0x4001000DL)
 456#define RNDIS_STATUS_HARDWARE_LINE_DOWN         (0x4001000EL)
 457#define RNDIS_STATUS_INTERFACE_UP               (0x4001000FL)
 458#define RNDIS_STATUS_INTERFACE_DOWN             (0x40010010L)
 459#define RNDIS_STATUS_MEDIA_BUSY                 (0x40010011L)
 460#define RNDIS_STATUS_MEDIA_SPECIFIC_INDICATION  (0x40010012L)
 461#define RNDIS_STATUS_WW_INDICATION              RDIA_SPECIFIC_INDICATION
 462#define RNDIS_STATUS_LINK_SPEED_CHANGE          (0x40010013L)
 463
 464#define RNDIS_STATUS_NOT_RESETTABLE             (0x80010001L)
 465#define RNDIS_STATUS_SOFT_ERRORS                (0x80010003L)
 466#define RNDIS_STATUS_HARD_ERRORS                (0x80010004L)
 467#define RNDIS_STATUS_BUFFER_OVERFLOW            (STATUS_BUFFER_OVERFLOW)
 468
 469#define RNDIS_STATUS_FAILURE                    (STATUS_UNSUCCESSFUL)
 470#define RNDIS_STATUS_RESOURCES                  (STATUS_INSUFFICIENT_RESOURCES)
 471#define RNDIS_STATUS_CLOSING                    (0xC0010002L)
 472#define RNDIS_STATUS_BAD_VERSION                (0xC0010004L)
 473#define RNDIS_STATUS_BAD_CHARACTERISTICS        (0xC0010005L)
 474#define RNDIS_STATUS_ADAPTER_NOT_FOUND          (0xC0010006L)
 475#define RNDIS_STATUS_OPEN_FAILED                (0xC0010007L)
 476#define RNDIS_STATUS_DEVICE_FAILED              (0xC0010008L)
 477#define RNDIS_STATUS_MULTICAST_FULL             (0xC0010009L)
 478#define RNDIS_STATUS_MULTICAST_EXISTS           (0xC001000AL)
 479#define RNDIS_STATUS_MULTICAST_NOT_FOUND        (0xC001000BL)
 480#define RNDIS_STATUS_REQUEST_ABORTED            (0xC001000CL)
 481#define RNDIS_STATUS_RESET_IN_PROGRESS          (0xC001000DL)
 482#define RNDIS_STATUS_CLOSING_INDICATING         (0xC001000EL)
 483#define RNDIS_STATUS_NOT_SUPPORTED              (STATUS_NOT_SUPPORTED)
 484#define RNDIS_STATUS_INVALID_PACKET             (0xC001000FL)
 485#define RNDIS_STATUS_OPEN_LIST_FULL             (0xC0010010L)
 486#define RNDIS_STATUS_ADAPTER_NOT_READY          (0xC0010011L)
 487#define RNDIS_STATUS_ADAPTER_NOT_OPEN           (0xC0010012L)
 488#define RNDIS_STATUS_NOT_INDICATING             (0xC0010013L)
 489#define RNDIS_STATUS_INVALID_LENGTH             (0xC0010014L)
 490#define RNDIS_STATUS_INVALID_DATA               (0xC0010015L)
 491#define RNDIS_STATUS_BUFFER_TOO_SHORT           (0xC0010016L)
 492#define RNDIS_STATUS_INVALID_OID                (0xC0010017L)
 493#define RNDIS_STATUS_ADAPTER_REMOVED            (0xC0010018L)
 494#define RNDIS_STATUS_UNSUPPORTED_MEDIA          (0xC0010019L)
 495#define RNDIS_STATUS_GROUP_ADDRESS_IN_USE       (0xC001001AL)
 496#define RNDIS_STATUS_FILE_NOT_FOUND             (0xC001001BL)
 497#define RNDIS_STATUS_ERROR_READING_FILE         (0xC001001CL)
 498#define RNDIS_STATUS_ALREADY_MAPPED             (0xC001001DL)
 499#define RNDIS_STATUS_RESOURCE_CONFLICT          (0xC001001EL)
 500#define RNDIS_STATUS_NO_CABLE                   (0xC001001FL)
 501
 502#define RNDIS_STATUS_INVALID_SAP                (0xC0010020L)
 503#define RNDIS_STATUS_SAP_IN_USE                 (0xC0010021L)
 504#define RNDIS_STATUS_INVALID_ADDRESS            (0xC0010022L)
 505#define RNDIS_STATUS_VC_NOT_ACTIVATED           (0xC0010023L)
 506#define RNDIS_STATUS_DEST_OUT_OF_ORDER          (0xC0010024L)
 507#define RNDIS_STATUS_VC_NOT_AVAILABLE           (0xC0010025L)
 508#define RNDIS_STATUS_CELLRATE_NOT_AVAILABLE     (0xC0010026L)
 509#define RNDIS_STATUS_INCOMPATABLE_QOS           (0xC0010027L)
 510#define RNDIS_STATUS_AAL_PARAMS_UNSUPPORTED     (0xC0010028L)
 511#define RNDIS_STATUS_NO_ROUTE_TO_DESTINATION    (0xC0010029L)
 512
 513#define RNDIS_STATUS_TOKEN_RING_OPEN_ERROR      (0xC0011000L)
 514
 515/* Object Identifiers used by NdisRequest Query/Set Information */
 516/* General Objects */
 517#define RNDIS_OID_GEN_SUPPORTED_LIST            0x00010101
 518#define RNDIS_OID_GEN_HARDWARE_STATUS           0x00010102
 519#define RNDIS_OID_GEN_MEDIA_SUPPORTED           0x00010103
 520#define RNDIS_OID_GEN_MEDIA_IN_USE              0x00010104
 521#define RNDIS_OID_GEN_MAXIMUM_LOOKAHEAD         0x00010105
 522#define RNDIS_OID_GEN_MAXIMUM_FRAME_SIZE        0x00010106
 523#define RNDIS_OID_GEN_LINK_SPEED                0x00010107
 524#define RNDIS_OID_GEN_TRANSMIT_BUFFER_SPACE     0x00010108
 525#define RNDIS_OID_GEN_RECEIVE_BUFFER_SPACE      0x00010109
 526#define RNDIS_OID_GEN_TRANSMIT_BLOCK_SIZE       0x0001010A
 527#define RNDIS_OID_GEN_RECEIVE_BLOCK_SIZE        0x0001010B
 528#define RNDIS_OID_GEN_VENDOR_ID                 0x0001010C
 529#define RNDIS_OID_GEN_VENDOR_DESCRIPTION        0x0001010D
 530#define RNDIS_OID_GEN_CURRENT_PACKET_FILTER     0x0001010E
 531#define RNDIS_OID_GEN_CURRENT_LOOKAHEAD         0x0001010F
 532#define RNDIS_OID_GEN_DRIVER_VERSION            0x00010110
 533#define RNDIS_OID_GEN_MAXIMUM_TOTAL_SIZE        0x00010111
 534#define RNDIS_OID_GEN_PROTOCOL_OPTIONS          0x00010112
 535#define RNDIS_OID_GEN_MAC_OPTIONS               0x00010113
 536#define RNDIS_OID_GEN_MEDIA_CONNECT_STATUS      0x00010114
 537#define RNDIS_OID_GEN_MAXIMUM_SEND_PACKETS      0x00010115
 538#define RNDIS_OID_GEN_VENDOR_DRIVER_VERSION     0x00010116
 539#define RNDIS_OID_GEN_NETWORK_LAYER_ADDRESSES   0x00010118
 540#define RNDIS_OID_GEN_TRANSPORT_HEADER_OFFSET   0x00010119
 541#define RNDIS_OID_GEN_MACHINE_NAME              0x0001021A
 542#define RNDIS_OID_GEN_RNDIS_CONFIG_PARAMETER    0x0001021B
 543
 544#define RNDIS_OID_GEN_XMIT_OK                   0x00020101
 545#define RNDIS_OID_GEN_RCV_OK                    0x00020102
 546#define RNDIS_OID_GEN_XMIT_ERROR                0x00020103
 547#define RNDIS_OID_GEN_RCV_ERROR                 0x00020104
 548#define RNDIS_OID_GEN_RCV_NO_BUFFER             0x00020105
 549
 550#define RNDIS_OID_GEN_DIRECTED_BYTES_XMIT       0x00020201
 551#define RNDIS_OID_GEN_DIRECTED_FRAMES_XMIT      0x00020202
 552#define RNDIS_OID_GEN_MULTICAST_BYTES_XMIT      0x00020203
 553#define RNDIS_OID_GEN_MULTICAST_FRAMES_XMIT     0x00020204
 554#define RNDIS_OID_GEN_BROADCAST_BYTES_XMIT      0x00020205
 555#define RNDIS_OID_GEN_BROADCAST_FRAMES_XMIT     0x00020206
 556#define RNDIS_OID_GEN_DIRECTED_BYTES_RCV        0x00020207
 557#define RNDIS_OID_GEN_DIRECTED_FRAMES_RCV       0x00020208
 558#define RNDIS_OID_GEN_MULTICAST_BYTES_RCV       0x00020209
 559#define RNDIS_OID_GEN_MULTICAST_FRAMES_RCV      0x0002020A
 560#define RNDIS_OID_GEN_BROADCAST_BYTES_RCV       0x0002020B
 561#define RNDIS_OID_GEN_BROADCAST_FRAMES_RCV      0x0002020C
 562
 563#define RNDIS_OID_GEN_RCV_CRC_ERROR             0x0002020D
 564#define RNDIS_OID_GEN_TRANSMIT_QUEUE_LENGTH     0x0002020E
 565
 566#define RNDIS_OID_GEN_GET_TIME_CAPS             0x0002020F
 567#define RNDIS_OID_GEN_GET_NETCARD_TIME          0x00020210
 568
 569/* These are connection-oriented general OIDs. */
 570/* These replace the above OIDs for connection-oriented media. */
 571#define RNDIS_OID_GEN_CO_SUPPORTED_LIST         0x00010101
 572#define RNDIS_OID_GEN_CO_HARDWARE_STATUS        0x00010102
 573#define RNDIS_OID_GEN_CO_MEDIA_SUPPORTED        0x00010103
 574#define RNDIS_OID_GEN_CO_MEDIA_IN_USE           0x00010104
 575#define RNDIS_OID_GEN_CO_LINK_SPEED             0x00010105
 576#define RNDIS_OID_GEN_CO_VENDOR_ID              0x00010106
 577#define RNDIS_OID_GEN_CO_VENDOR_DESCRIPTION     0x00010107
 578#define RNDIS_OID_GEN_CO_DRIVER_VERSION         0x00010108
 579#define RNDIS_OID_GEN_CO_PROTOCOL_OPTIONS       0x00010109
 580#define RNDIS_OID_GEN_CO_MAC_OPTIONS            0x0001010A
 581#define RNDIS_OID_GEN_CO_MEDIA_CONNECT_STATUS   0x0001010B
 582#define RNDIS_OID_GEN_CO_VENDOR_DRIVER_VERSION  0x0001010C
 583#define RNDIS_OID_GEN_CO_MINIMUM_LINK_SPEED     0x0001010D
 584
 585#define RNDIS_OID_GEN_CO_GET_TIME_CAPS          0x00010201
 586#define RNDIS_OID_GEN_CO_GET_NETCARD_TIME       0x00010202
 587
 588/* These are connection-oriented statistics OIDs. */
 589#define RNDIS_OID_GEN_CO_XMIT_PDUS_OK           0x00020101
 590#define RNDIS_OID_GEN_CO_RCV_PDUS_OK            0x00020102
 591#define RNDIS_OID_GEN_CO_XMIT_PDUS_ERROR        0x00020103
 592#define RNDIS_OID_GEN_CO_RCV_PDUS_ERROR         0x00020104
 593#define RNDIS_OID_GEN_CO_RCV_PDUS_NO_BUFFER     0x00020105
 594
 595
 596#define RNDIS_OID_GEN_CO_RCV_CRC_ERROR          0x00020201
 597#define RNDIS_OID_GEN_CO_TRANSMIT_QUEUE_LENGTH  0x00020202
 598#define RNDIS_OID_GEN_CO_BYTES_XMIT             0x00020203
 599#define RNDIS_OID_GEN_CO_BYTES_RCV              0x00020204
 600#define RNDIS_OID_GEN_CO_BYTES_XMIT_OUTSTANDING 0x00020205
 601#define RNDIS_OID_GEN_CO_NETCARD_LOAD           0x00020206
 602
 603/* These are objects for Connection-oriented media call-managers. */
 604#define RNDIS_OID_CO_ADD_PVC                    0xFF000001
 605#define RNDIS_OID_CO_DELETE_PVC                 0xFF000002
 606#define RNDIS_OID_CO_GET_CALL_INFORMATION       0xFF000003
 607#define RNDIS_OID_CO_ADD_ADDRESS                0xFF000004
 608#define RNDIS_OID_CO_DELETE_ADDRESS             0xFF000005
 609#define RNDIS_OID_CO_GET_ADDRESSES              0xFF000006
 610#define RNDIS_OID_CO_ADDRESS_CHANGE             0xFF000007
 611#define RNDIS_OID_CO_SIGNALING_ENABLED          0xFF000008
 612#define RNDIS_OID_CO_SIGNALING_DISABLED         0xFF000009
 613
 614/* 802.3 Objects (Ethernet) */
 615#define RNDIS_OID_802_3_PERMANENT_ADDRESS       0x01010101
 616#define RNDIS_OID_802_3_CURRENT_ADDRESS         0x01010102
 617#define RNDIS_OID_802_3_MULTICAST_LIST          0x01010103
 618#define RNDIS_OID_802_3_MAXIMUM_LIST_SIZE       0x01010104
 619#define RNDIS_OID_802_3_MAC_OPTIONS             0x01010105
 620
 621#define NDIS_802_3_MAC_OPTION_PRIORITY          0x00000001
 622
 623#define RNDIS_OID_802_3_RCV_ERROR_ALIGNMENT     0x01020101
 624#define RNDIS_OID_802_3_XMIT_ONE_COLLISION      0x01020102
 625#define RNDIS_OID_802_3_XMIT_MORE_COLLISIONS    0x01020103
 626
 627#define RNDIS_OID_802_3_XMIT_DEFERRED           0x01020201
 628#define RNDIS_OID_802_3_XMIT_MAX_COLLISIONS     0x01020202
 629#define RNDIS_OID_802_3_RCV_OVERRUN             0x01020203
 630#define RNDIS_OID_802_3_XMIT_UNDERRUN           0x01020204
 631#define RNDIS_OID_802_3_XMIT_HEARTBEAT_FAILURE  0x01020205
 632#define RNDIS_OID_802_3_XMIT_TIMES_CRS_LOST     0x01020206
 633#define RNDIS_OID_802_3_XMIT_LATE_COLLISIONS    0x01020207
 634
 635/* Remote NDIS message types */
 636#define REMOTE_NDIS_PACKET_MSG                  0x00000001
 637#define REMOTE_NDIS_INITIALIZE_MSG              0x00000002
 638#define REMOTE_NDIS_HALT_MSG                    0x00000003
 639#define REMOTE_NDIS_QUERY_MSG                   0x00000004
 640#define REMOTE_NDIS_SET_MSG                     0x00000005
 641#define REMOTE_NDIS_RESET_MSG                   0x00000006
 642#define REMOTE_NDIS_INDICATE_STATUS_MSG         0x00000007
 643#define REMOTE_NDIS_KEEPALIVE_MSG               0x00000008
 644
 645#define REMOTE_CONDIS_MP_CREATE_VC_MSG          0x00008001
 646#define REMOTE_CONDIS_MP_DELETE_VC_MSG          0x00008002
 647#define REMOTE_CONDIS_MP_ACTIVATE_VC_MSG        0x00008005
 648#define REMOTE_CONDIS_MP_DEACTIVATE_VC_MSG      0x00008006
 649#define REMOTE_CONDIS_INDICATE_STATUS_MSG       0x00008007
 650
 651/* Remote NDIS message completion types */
 652#define REMOTE_NDIS_INITIALIZE_CMPLT            0x80000002
 653#define REMOTE_NDIS_QUERY_CMPLT                 0x80000004
 654#define REMOTE_NDIS_SET_CMPLT                   0x80000005
 655#define REMOTE_NDIS_RESET_CMPLT                 0x80000006
 656#define REMOTE_NDIS_KEEPALIVE_CMPLT             0x80000008
 657
 658#define REMOTE_CONDIS_MP_CREATE_VC_CMPLT        0x80008001
 659#define REMOTE_CONDIS_MP_DELETE_VC_CMPLT        0x80008002
 660#define REMOTE_CONDIS_MP_ACTIVATE_VC_CMPLT      0x80008005
 661#define REMOTE_CONDIS_MP_DEACTIVATE_VC_CMPLT    0x80008006
 662
 663/*
 664 * Reserved message type for private communication between lower-layer host
 665 * driver and remote device, if necessary.
 666 */
 667#define REMOTE_NDIS_BUS_MSG                     0xff000001
 668
 669/*  Defines for DeviceFlags in struct rndis_initialize_complete */
 670#define RNDIS_DF_CONNECTIONLESS                 0x00000001
 671#define RNDIS_DF_CONNECTION_ORIENTED            0x00000002
 672#define RNDIS_DF_RAW_DATA                       0x00000004
 673
 674/*  Remote NDIS medium types. */
 675#define RNDIS_MEDIUM_802_3                      0x00000000
 676#define RNDIS_MEDIUM_802_5                      0x00000001
 677#define RNDIS_MEDIUM_FDDI                               0x00000002
 678#define RNDIS_MEDIUM_WAN                                0x00000003
 679#define RNDIS_MEDIUM_LOCAL_TALK                 0x00000004
 680#define RNDIS_MEDIUM_ARCNET_RAW                 0x00000006
 681#define RNDIS_MEDIUM_ARCNET_878_2                       0x00000007
 682#define RNDIS_MEDIUM_ATM                                0x00000008
 683#define RNDIS_MEDIUM_WIRELESS_WAN                       0x00000009
 684#define RNDIS_MEDIUM_IRDA                               0x0000000a
 685#define RNDIS_MEDIUM_CO_WAN                     0x0000000b
 686/* Not a real medium, defined as an upper-bound */
 687#define RNDIS_MEDIUM_MAX                                0x0000000d
 688
 689
 690/* Remote NDIS medium connection states. */
 691#define RNDIS_MEDIA_STATE_CONNECTED             0x00000000
 692#define RNDIS_MEDIA_STATE_DISCONNECTED          0x00000001
 693
 694/*  Remote NDIS version numbers */
 695#define RNDIS_MAJOR_VERSION                     0x00000001
 696#define RNDIS_MINOR_VERSION                     0x00000000
 697
 698
 699/* NdisInitialize message */
 700struct rndis_initialize_request {
 701        u32 req_id;
 702        u32 major_ver;
 703        u32 minor_ver;
 704        u32 max_xfer_size;
 705};
 706
 707/* Response to NdisInitialize */
 708struct rndis_initialize_complete {
 709        u32 req_id;
 710        u32 status;
 711        u32 major_ver;
 712        u32 minor_ver;
 713        u32 dev_flags;
 714        u32 medium;
 715        u32 max_pkt_per_msg;
 716        u32 max_xfer_size;
 717        u32 pkt_alignment_factor;
 718        u32 af_list_offset;
 719        u32 af_list_size;
 720};
 721
 722/* Call manager devices only: Information about an address family */
 723/* supported by the device is appended to the response to NdisInitialize. */
 724struct rndis_co_address_family {
 725        u32 address_family;
 726        u32 major_ver;
 727        u32 minor_ver;
 728};
 729
 730/* NdisHalt message */
 731struct rndis_halt_request {
 732        u32 req_id;
 733};
 734
 735/* NdisQueryRequest message */
 736struct rndis_query_request {
 737        u32 req_id;
 738        u32 oid;
 739        u32 info_buflen;
 740        u32 info_buf_offset;
 741        u32 dev_vc_handle;
 742};
 743
 744/* Response to NdisQueryRequest */
 745struct rndis_query_complete {
 746        u32 req_id;
 747        u32 status;
 748        u32 info_buflen;
 749        u32 info_buf_offset;
 750};
 751
 752/* NdisSetRequest message */
 753struct rndis_set_request {
 754        u32 req_id;
 755        u32 oid;
 756        u32 info_buflen;
 757        u32 info_buf_offset;
 758        u32 dev_vc_handle;
 759};
 760
 761/* Response to NdisSetRequest */
 762struct rndis_set_complete {
 763        u32 req_id;
 764        u32 status;
 765};
 766
 767/* NdisReset message */
 768struct rndis_reset_request {
 769        u32 reserved;
 770};
 771
 772/* Response to NdisReset */
 773struct rndis_reset_complete {
 774        u32 status;
 775        u32 addressing_reset;
 776};
 777
 778/* NdisMIndicateStatus message */
 779struct rndis_indicate_status {
 780        u32 status;
 781        u32 status_buflen;
 782        u32 status_buf_offset;
 783};
 784
 785/* Diagnostic information passed as the status buffer in */
 786/* struct rndis_indicate_status messages signifying error conditions. */
 787struct rndis_diagnostic_info {
 788        u32 diag_status;
 789        u32 error_offset;
 790};
 791
 792/* NdisKeepAlive message */
 793struct rndis_keepalive_request {
 794        u32 req_id;
 795};
 796
 797/* Response to NdisKeepAlive */
 798struct rndis_keepalive_complete {
 799        u32 req_id;
 800        u32 status;
 801};
 802
 803/*
 804 * Data message. All Offset fields contain byte offsets from the beginning of
 805 * struct rndis_packet. All Length fields are in bytes.  VcHandle is set
 806 * to 0 for connectionless data, otherwise it contains the VC handle.
 807 */
 808struct rndis_packet {
 809        u32 data_offset;
 810        u32 data_len;
 811        u32 oob_data_offset;
 812        u32 oob_data_len;
 813        u32 num_oob_data_elements;
 814        u32 per_pkt_info_offset;
 815        u32 per_pkt_info_len;
 816        u32 vc_handle;
 817        u32 reserved;
 818};
 819
 820/* Optional Out of Band data associated with a Data message. */
 821struct rndis_oobd {
 822        u32 size;
 823        u32 type;
 824        u32 class_info_offset;
 825};
 826
 827/* Packet extension field contents associated with a Data message. */
 828struct rndis_per_packet_info {
 829        u32 size;
 830        u32 type;
 831        u32 per_pkt_info_offset;
 832};
 833
 834/* Format of Information buffer passed in a SetRequest for the OID */
 835/* OID_GEN_RNDIS_CONFIG_PARAMETER. */
 836struct rndis_config_parameter_info {
 837        u32 parameter_name_offset;
 838        u32 parameter_name_length;
 839        u32 parameter_type;
 840        u32 parameter_value_offset;
 841        u32 parameter_value_length;
 842};
 843
 844/* Values for ParameterType in struct rndis_config_parameter_info */
 845#define RNDIS_CONFIG_PARAM_TYPE_INTEGER     0
 846#define RNDIS_CONFIG_PARAM_TYPE_STRING      2
 847
 848/* CONDIS Miniport messages for connection oriented devices */
 849/* that do not implement a call manager. */
 850
 851/* CoNdisMiniportCreateVc message */
 852struct rcondis_mp_create_vc {
 853        u32 req_id;
 854        u32 ndis_vc_handle;
 855};
 856
 857/* Response to CoNdisMiniportCreateVc */
 858struct rcondis_mp_create_vc_complete {
 859        u32 req_id;
 860        u32 dev_vc_handle;
 861        u32 status;
 862};
 863
 864/* CoNdisMiniportDeleteVc message */
 865struct rcondis_mp_delete_vc {
 866        u32 req_id;
 867        u32 dev_vc_handle;
 868};
 869
 870/* Response to CoNdisMiniportDeleteVc */
 871struct rcondis_mp_delete_vc_complete {
 872        u32 req_id;
 873        u32 status;
 874};
 875
 876/* CoNdisMiniportQueryRequest message */
 877struct rcondis_mp_query_request {
 878        u32 req_id;
 879        u32 request_type;
 880        u32 oid;
 881        u32 dev_vc_handle;
 882        u32 info_buflen;
 883        u32 info_buf_offset;
 884};
 885
 886/* CoNdisMiniportSetRequest message */
 887struct rcondis_mp_set_request {
 888        u32 req_id;
 889        u32 request_type;
 890        u32 oid;
 891        u32 dev_vc_handle;
 892        u32 info_buflen;
 893        u32 info_buf_offset;
 894};
 895
 896/* CoNdisIndicateStatus message */
 897struct rcondis_indicate_status {
 898        u32 ndis_vc_handle;
 899        u32 status;
 900        u32 status_buflen;
 901        u32 status_buf_offset;
 902};
 903
 904/* CONDIS Call/VC parameters */
 905struct rcondis_specific_parameters {
 906        u32 parameter_type;
 907        u32 parameter_length;
 908        u32 parameter_lffset;
 909};
 910
 911struct rcondis_media_parameters {
 912        u32 flags;
 913        u32 reserved1;
 914        u32 reserved2;
 915        struct rcondis_specific_parameters media_specific;
 916};
 917
 918struct rndis_flowspec {
 919        u32 token_rate;
 920        u32 token_bucket_size;
 921        u32 peak_bandwidth;
 922        u32 latency;
 923        u32 delay_variation;
 924        u32 service_type;
 925        u32 max_sdu_size;
 926        u32 minimum_policed_size;
 927};
 928
 929struct rcondis_call_manager_parameters {
 930        struct rndis_flowspec transmit;
 931        struct rndis_flowspec receive;
 932        struct rcondis_specific_parameters call_mgr_specific;
 933};
 934
 935/* CoNdisMiniportActivateVc message */
 936struct rcondis_mp_activate_vc_request {
 937        u32 req_id;
 938        u32 flags;
 939        u32 dev_vc_handle;
 940        u32 media_params_offset;
 941        u32 media_params_length;
 942        u32 call_mgr_params_offset;
 943        u32 call_mgr_params_length;
 944};
 945
 946/* Response to CoNdisMiniportActivateVc */
 947struct rcondis_mp_activate_vc_complete {
 948        u32 req_id;
 949        u32 status;
 950};
 951
 952/* CoNdisMiniportDeactivateVc message */
 953struct rcondis_mp_deactivate_vc_request {
 954        u32 req_id;
 955        u32 flags;
 956        u32 dev_vc_handle;
 957};
 958
 959/* Response to CoNdisMiniportDeactivateVc */
 960struct rcondis_mp_deactivate_vc_complete {
 961        u32 req_id;
 962        u32 status;
 963};
 964
 965
 966/* union with all of the RNDIS messages */
 967union rndis_message_container {
 968        struct rndis_packet pkt;
 969        struct rndis_initialize_request init_req;
 970        struct rndis_halt_request halt_req;
 971        struct rndis_query_request query_req;
 972        struct rndis_set_request set_req;
 973        struct rndis_reset_request reset_req;
 974        struct rndis_keepalive_request keep_alive_req;
 975        struct rndis_indicate_status indicate_status;
 976        struct rndis_initialize_complete init_complete;
 977        struct rndis_query_complete query_complete;
 978        struct rndis_set_complete set_complete;
 979        struct rndis_reset_complete reset_complete;
 980        struct rndis_keepalive_complete keep_alive_complete;
 981        struct rcondis_mp_create_vc co_miniport_create_vc;
 982        struct rcondis_mp_delete_vc co_miniport_delete_vc;
 983        struct rcondis_indicate_status co_indicate_status;
 984        struct rcondis_mp_activate_vc_request co_miniport_activate_vc;
 985        struct rcondis_mp_deactivate_vc_request co_miniport_deactivate_vc;
 986        struct rcondis_mp_create_vc_complete co_miniport_create_vc_complete;
 987        struct rcondis_mp_delete_vc_complete co_miniport_delete_vc_complete;
 988        struct rcondis_mp_activate_vc_complete co_miniport_activate_vc_complete;
 989        struct rcondis_mp_deactivate_vc_complete
 990                co_miniport_deactivate_vc_complete;
 991};
 992
 993/* Remote NDIS message format */
 994struct rndis_message {
 995        u32 ndis_msg_type;
 996
 997        /* Total length of this message, from the beginning */
 998        /* of the sruct rndis_message, in bytes. */
 999        u32 msg_len;
1000
1001        /* Actual message */
1002        union rndis_message_container msg;
1003};
1004
1005
1006struct rndis_filter_packet {
1007        void *completion_ctx;
1008        void (*completion)(void *context);
1009        struct rndis_message msg;
1010};
1011
1012/* Handy macros */
1013
1014/* get the size of an RNDIS message. Pass in the message type, */
1015/* struct rndis_set_request, struct rndis_packet for example */
1016#define RNDIS_MESSAGE_SIZE(msg)                         \
1017        (sizeof(msg) + (sizeof(struct rndis_message) -  \
1018         sizeof(union rndis_message_container)))
1019
1020/* get pointer to info buffer with message pointer */
1021#define MESSAGE_TO_INFO_BUFFER(msg)                             \
1022        (((unsigned char *)(msg)) + msg->info_buf_offset)
1023
1024/* get pointer to status buffer with message pointer */
1025#define MESSAGE_TO_STATUS_BUFFER(msg)                   \
1026        (((unsigned char *)(msg)) + msg->status_buf_offset)
1027
1028/* get pointer to OOBD buffer with message pointer */
1029#define MESSAGE_TO_OOBD_BUFFER(msg)                             \
1030        (((unsigned char *)(msg)) + msg->oob_data_offset)
1031
1032/* get pointer to data buffer with message pointer */
1033#define MESSAGE_TO_DATA_BUFFER(msg)                             \
1034        (((unsigned char *)(msg)) + msg->per_pkt_info_offset)
1035
1036/* get pointer to contained message from NDIS_MESSAGE pointer */
1037#define RNDIS_MESSAGE_PTR_TO_MESSAGE_PTR(rndis_msg)             \
1038        ((void *) &rndis_msg->msg)
1039
1040/* get pointer to contained message from NDIS_MESSAGE pointer */
1041#define RNDIS_MESSAGE_RAW_PTR_TO_MESSAGE_PTR(rndis_msg) \
1042        ((void *) rndis_msg)
1043
1044
1045#define __struct_bcount(x)
1046
1047
1048
1049#define RNDIS_HEADER_SIZE       (sizeof(struct rndis_message) - \
1050                                 sizeof(union rndis_message_container))
1051
1052#define NDIS_PACKET_TYPE_DIRECTED       0x00000001
1053#define NDIS_PACKET_TYPE_MULTICAST      0x00000002
1054#define NDIS_PACKET_TYPE_ALL_MULTICAST  0x00000004
1055#define NDIS_PACKET_TYPE_BROADCAST      0x00000008
1056#define NDIS_PACKET_TYPE_SOURCE_ROUTING 0x00000010
1057#define NDIS_PACKET_TYPE_PROMISCUOUS    0x00000020
1058#define NDIS_PACKET_TYPE_SMT            0x00000040
1059#define NDIS_PACKET_TYPE_ALL_LOCAL      0x00000080
1060#define NDIS_PACKET_TYPE_GROUP          0x00000100
1061#define NDIS_PACKET_TYPE_ALL_FUNCTIONAL 0x00000200
1062#define NDIS_PACKET_TYPE_FUNCTIONAL     0x00000400
1063#define NDIS_PACKET_TYPE_MAC_FRAME      0x00000800
1064
1065
1066
1067#endif /* _HYPERV_NET_H */
1068