linux/drivers/net/hyperv/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, see <http://www.gnu.org/licenses/>.
  16 *
  17 * Authors:
  18 *   Haiyang Zhang <haiyangz@microsoft.com>
  19 *   Hank Janssen  <hjanssen@microsoft.com>
  20 *   K. Y. Srinivasan <kys@microsoft.com>
  21 *
  22 */
  23
  24#ifndef _HYPERV_NET_H
  25#define _HYPERV_NET_H
  26
  27#include <linux/list.h>
  28#include <linux/hyperv.h>
  29#include <linux/rndis.h>
  30
  31/* RSS related */
  32#define OID_GEN_RECEIVE_SCALE_CAPABILITIES 0x00010203  /* query only */
  33#define OID_GEN_RECEIVE_SCALE_PARAMETERS 0x00010204  /* query and set */
  34
  35#define NDIS_OBJECT_TYPE_RSS_CAPABILITIES 0x88
  36#define NDIS_OBJECT_TYPE_RSS_PARAMETERS 0x89
  37
  38#define NDIS_RECEIVE_SCALE_CAPABILITIES_REVISION_2 2
  39#define NDIS_RECEIVE_SCALE_PARAMETERS_REVISION_2 2
  40
  41struct ndis_obj_header {
  42        u8 type;
  43        u8 rev;
  44        u16 size;
  45} __packed;
  46
  47/* ndis_recv_scale_cap/cap_flag */
  48#define NDIS_RSS_CAPS_MESSAGE_SIGNALED_INTERRUPTS 0x01000000
  49#define NDIS_RSS_CAPS_CLASSIFICATION_AT_ISR       0x02000000
  50#define NDIS_RSS_CAPS_CLASSIFICATION_AT_DPC       0x04000000
  51#define NDIS_RSS_CAPS_USING_MSI_X                 0x08000000
  52#define NDIS_RSS_CAPS_RSS_AVAILABLE_ON_PORTS      0x10000000
  53#define NDIS_RSS_CAPS_SUPPORTS_MSI_X              0x20000000
  54#define NDIS_RSS_CAPS_HASH_TYPE_TCP_IPV4          0x00000100
  55#define NDIS_RSS_CAPS_HASH_TYPE_TCP_IPV6          0x00000200
  56#define NDIS_RSS_CAPS_HASH_TYPE_TCP_IPV6_EX       0x00000400
  57
  58struct ndis_recv_scale_cap { /* NDIS_RECEIVE_SCALE_CAPABILITIES */
  59        struct ndis_obj_header hdr;
  60        u32 cap_flag;
  61        u32 num_int_msg;
  62        u32 num_recv_que;
  63        u16 num_indirect_tabent;
  64} __packed;
  65
  66
  67/* ndis_recv_scale_param flags */
  68#define NDIS_RSS_PARAM_FLAG_BASE_CPU_UNCHANGED     0x0001
  69#define NDIS_RSS_PARAM_FLAG_HASH_INFO_UNCHANGED    0x0002
  70#define NDIS_RSS_PARAM_FLAG_ITABLE_UNCHANGED       0x0004
  71#define NDIS_RSS_PARAM_FLAG_HASH_KEY_UNCHANGED     0x0008
  72#define NDIS_RSS_PARAM_FLAG_DISABLE_RSS            0x0010
  73
  74/* Hash info bits */
  75#define NDIS_HASH_FUNC_TOEPLITZ 0x00000001
  76#define NDIS_HASH_IPV4          0x00000100
  77#define NDIS_HASH_TCP_IPV4      0x00000200
  78#define NDIS_HASH_IPV6          0x00000400
  79#define NDIS_HASH_IPV6_EX       0x00000800
  80#define NDIS_HASH_TCP_IPV6      0x00001000
  81#define NDIS_HASH_TCP_IPV6_EX   0x00002000
  82
  83#define NDIS_RSS_INDIRECTION_TABLE_MAX_SIZE_REVISION_2 (128 * 4)
  84#define NDIS_RSS_HASH_SECRET_KEY_MAX_SIZE_REVISION_2   40
  85
  86#define ITAB_NUM 128
  87#define HASH_KEYLEN NDIS_RSS_HASH_SECRET_KEY_MAX_SIZE_REVISION_2
  88extern u8 netvsc_hash_key[];
  89
  90struct ndis_recv_scale_param { /* NDIS_RECEIVE_SCALE_PARAMETERS */
  91        struct ndis_obj_header hdr;
  92
  93        /* Qualifies the rest of the information */
  94        u16 flag;
  95
  96        /* The base CPU number to do receive processing. not used */
  97        u16 base_cpu_number;
  98
  99        /* This describes the hash function and type being enabled */
 100        u32 hashinfo;
 101
 102        /* The size of indirection table array */
 103        u16 indirect_tabsize;
 104
 105        /* The offset of the indirection table from the beginning of this
 106         * structure
 107         */
 108        u32 indirect_taboffset;
 109
 110        /* The size of the hash secret key */
 111        u16 hashkey_size;
 112
 113        /* The offset of the secret key from the beginning of this structure */
 114        u32 kashkey_offset;
 115
 116        u32 processor_masks_offset;
 117        u32 num_processor_masks;
 118        u32 processor_masks_entry_size;
 119};
 120
 121/* Fwd declaration */
 122struct ndis_tcp_ip_checksum_info;
 123
 124/*
 125 * Represent netvsc packet which contains 1 RNDIS and 1 ethernet frame
 126 * within the RNDIS
 127 *
 128 * The size of this structure is less than 48 bytes and we can now
 129 * place this structure in the skb->cb field.
 130 */
 131struct hv_netvsc_packet {
 132        /* Bookkeeping stuff */
 133        u8 cp_partial; /* partial copy into send buffer */
 134
 135        u8 rmsg_size; /* RNDIS header and PPI size */
 136        u8 rmsg_pgcnt; /* page count of RNDIS header and PPI */
 137        u8 page_buf_cnt;
 138
 139        u16 q_idx;
 140        u32 send_buf_index;
 141
 142        u32 total_data_buflen;
 143};
 144
 145struct netvsc_device_info {
 146        unsigned char mac_adr[ETH_ALEN];
 147        bool link_state;        /* 0 - link up, 1 - link down */
 148        int  ring_size;
 149        u32  max_num_vrss_chns;
 150        u32  num_chn;
 151};
 152
 153enum rndis_device_state {
 154        RNDIS_DEV_UNINITIALIZED = 0,
 155        RNDIS_DEV_INITIALIZING,
 156        RNDIS_DEV_INITIALIZED,
 157        RNDIS_DEV_DATAINITIALIZED,
 158};
 159
 160struct rndis_device {
 161        struct netvsc_device *net_dev;
 162
 163        enum rndis_device_state state;
 164        bool link_state;
 165        atomic_t new_req_id;
 166
 167        spinlock_t request_lock;
 168        struct list_head req_list;
 169
 170        unsigned char hw_mac_adr[ETH_ALEN];
 171};
 172
 173
 174/* Interface */
 175struct rndis_message;
 176int netvsc_device_add(struct hv_device *device, void *additional_info);
 177int netvsc_device_remove(struct hv_device *device);
 178int netvsc_send(struct hv_device *device,
 179                struct hv_netvsc_packet *packet,
 180                struct rndis_message *rndis_msg,
 181                struct hv_page_buffer **page_buffer,
 182                struct sk_buff *skb);
 183void netvsc_linkstatus_callback(struct hv_device *device_obj,
 184                                struct rndis_message *resp);
 185int netvsc_recv_callback(struct hv_device *device_obj,
 186                        struct hv_netvsc_packet *packet,
 187                        void **data,
 188                        struct ndis_tcp_ip_checksum_info *csum_info,
 189                        struct vmbus_channel *channel,
 190                        u16 vlan_tci);
 191void netvsc_channel_cb(void *context);
 192int rndis_filter_open(struct hv_device *dev);
 193int rndis_filter_close(struct hv_device *dev);
 194int rndis_filter_device_add(struct hv_device *dev,
 195                        void *additional_info);
 196void rndis_filter_device_remove(struct hv_device *dev);
 197int rndis_filter_receive(struct hv_device *dev,
 198                        struct hv_netvsc_packet *pkt,
 199                        void **data,
 200                        struct vmbus_channel *channel);
 201
 202int rndis_filter_set_packet_filter(struct rndis_device *dev, u32 new_filter);
 203int rndis_filter_set_device_mac(struct hv_device *hdev, char *mac);
 204
 205#define NVSP_INVALID_PROTOCOL_VERSION   ((u32)0xFFFFFFFF)
 206
 207#define NVSP_PROTOCOL_VERSION_1         2
 208#define NVSP_PROTOCOL_VERSION_2         0x30002
 209#define NVSP_PROTOCOL_VERSION_4         0x40000
 210#define NVSP_PROTOCOL_VERSION_5         0x50000
 211
 212enum {
 213        NVSP_MSG_TYPE_NONE = 0,
 214
 215        /* Init Messages */
 216        NVSP_MSG_TYPE_INIT                      = 1,
 217        NVSP_MSG_TYPE_INIT_COMPLETE             = 2,
 218
 219        NVSP_VERSION_MSG_START                  = 100,
 220
 221        /* Version 1 Messages */
 222        NVSP_MSG1_TYPE_SEND_NDIS_VER            = NVSP_VERSION_MSG_START,
 223
 224        NVSP_MSG1_TYPE_SEND_RECV_BUF,
 225        NVSP_MSG1_TYPE_SEND_RECV_BUF_COMPLETE,
 226        NVSP_MSG1_TYPE_REVOKE_RECV_BUF,
 227
 228        NVSP_MSG1_TYPE_SEND_SEND_BUF,
 229        NVSP_MSG1_TYPE_SEND_SEND_BUF_COMPLETE,
 230        NVSP_MSG1_TYPE_REVOKE_SEND_BUF,
 231
 232        NVSP_MSG1_TYPE_SEND_RNDIS_PKT,
 233        NVSP_MSG1_TYPE_SEND_RNDIS_PKT_COMPLETE,
 234
 235        /* Version 2 messages */
 236        NVSP_MSG2_TYPE_SEND_CHIMNEY_DELEGATED_BUF,
 237        NVSP_MSG2_TYPE_SEND_CHIMNEY_DELEGATED_BUF_COMP,
 238        NVSP_MSG2_TYPE_REVOKE_CHIMNEY_DELEGATED_BUF,
 239
 240        NVSP_MSG2_TYPE_RESUME_CHIMNEY_RX_INDICATION,
 241
 242        NVSP_MSG2_TYPE_TERMINATE_CHIMNEY,
 243        NVSP_MSG2_TYPE_TERMINATE_CHIMNEY_COMP,
 244
 245        NVSP_MSG2_TYPE_INDICATE_CHIMNEY_EVENT,
 246
 247        NVSP_MSG2_TYPE_SEND_CHIMNEY_PKT,
 248        NVSP_MSG2_TYPE_SEND_CHIMNEY_PKT_COMP,
 249
 250        NVSP_MSG2_TYPE_POST_CHIMNEY_RECV_REQ,
 251        NVSP_MSG2_TYPE_POST_CHIMNEY_RECV_REQ_COMP,
 252
 253        NVSP_MSG2_TYPE_ALLOC_RXBUF,
 254        NVSP_MSG2_TYPE_ALLOC_RXBUF_COMP,
 255
 256        NVSP_MSG2_TYPE_FREE_RXBUF,
 257
 258        NVSP_MSG2_TYPE_SEND_VMQ_RNDIS_PKT,
 259        NVSP_MSG2_TYPE_SEND_VMQ_RNDIS_PKT_COMP,
 260
 261        NVSP_MSG2_TYPE_SEND_NDIS_CONFIG,
 262
 263        NVSP_MSG2_TYPE_ALLOC_CHIMNEY_HANDLE,
 264        NVSP_MSG2_TYPE_ALLOC_CHIMNEY_HANDLE_COMP,
 265
 266        NVSP_MSG2_MAX = NVSP_MSG2_TYPE_ALLOC_CHIMNEY_HANDLE_COMP,
 267
 268        /* Version 4 messages */
 269        NVSP_MSG4_TYPE_SEND_VF_ASSOCIATION,
 270        NVSP_MSG4_TYPE_SWITCH_DATA_PATH,
 271        NVSP_MSG4_TYPE_UPLINK_CONNECT_STATE_DEPRECATED,
 272
 273        NVSP_MSG4_MAX = NVSP_MSG4_TYPE_UPLINK_CONNECT_STATE_DEPRECATED,
 274
 275        /* Version 5 messages */
 276        NVSP_MSG5_TYPE_OID_QUERY_EX,
 277        NVSP_MSG5_TYPE_OID_QUERY_EX_COMP,
 278        NVSP_MSG5_TYPE_SUBCHANNEL,
 279        NVSP_MSG5_TYPE_SEND_INDIRECTION_TABLE,
 280
 281        NVSP_MSG5_MAX = NVSP_MSG5_TYPE_SEND_INDIRECTION_TABLE,
 282};
 283
 284enum {
 285        NVSP_STAT_NONE = 0,
 286        NVSP_STAT_SUCCESS,
 287        NVSP_STAT_FAIL,
 288        NVSP_STAT_PROTOCOL_TOO_NEW,
 289        NVSP_STAT_PROTOCOL_TOO_OLD,
 290        NVSP_STAT_INVALID_RNDIS_PKT,
 291        NVSP_STAT_BUSY,
 292        NVSP_STAT_PROTOCOL_UNSUPPORTED,
 293        NVSP_STAT_MAX,
 294};
 295
 296struct nvsp_message_header {
 297        u32 msg_type;
 298};
 299
 300/* Init Messages */
 301
 302/*
 303 * This message is used by the VSC to initialize the channel after the channels
 304 * has been opened. This message should never include anything other then
 305 * versioning (i.e. this message will be the same for ever).
 306 */
 307struct nvsp_message_init {
 308        u32 min_protocol_ver;
 309        u32 max_protocol_ver;
 310} __packed;
 311
 312/*
 313 * This message is used by the VSP to complete the initialization of the
 314 * channel. This message should never include anything other then versioning
 315 * (i.e. this message will be the same for ever).
 316 */
 317struct nvsp_message_init_complete {
 318        u32 negotiated_protocol_ver;
 319        u32 max_mdl_chain_len;
 320        u32 status;
 321} __packed;
 322
 323union nvsp_message_init_uber {
 324        struct nvsp_message_init init;
 325        struct nvsp_message_init_complete init_complete;
 326} __packed;
 327
 328/* Version 1 Messages */
 329
 330/*
 331 * This message is used by the VSC to send the NDIS version to the VSP. The VSP
 332 * can use this information when handling OIDs sent by the VSC.
 333 */
 334struct nvsp_1_message_send_ndis_version {
 335        u32 ndis_major_ver;
 336        u32 ndis_minor_ver;
 337} __packed;
 338
 339/*
 340 * This message is used by the VSC to send a receive buffer to the VSP. The VSP
 341 * can then use the receive buffer to send data to the VSC.
 342 */
 343struct nvsp_1_message_send_receive_buffer {
 344        u32 gpadl_handle;
 345        u16 id;
 346} __packed;
 347
 348struct nvsp_1_receive_buffer_section {
 349        u32 offset;
 350        u32 sub_alloc_size;
 351        u32 num_sub_allocs;
 352        u32 end_offset;
 353} __packed;
 354
 355/*
 356 * This message is used by the VSP to acknowledge a receive buffer send by the
 357 * VSC. This message must be sent by the VSP before the VSP uses the receive
 358 * buffer.
 359 */
 360struct nvsp_1_message_send_receive_buffer_complete {
 361        u32 status;
 362        u32 num_sections;
 363
 364        /*
 365         * The receive buffer is split into two parts, a large suballocation
 366         * section and a small suballocation section. These sections are then
 367         * suballocated by a certain size.
 368         */
 369
 370        /*
 371         * For example, the following break up of the receive buffer has 6
 372         * large suballocations and 10 small suballocations.
 373         */
 374
 375        /*
 376         * |            Large Section          |  |   Small Section   |
 377         * ------------------------------------------------------------
 378         * |     |     |     |     |     |     |  | | | | | | | | | | |
 379         * |                                      |
 380         *  LargeOffset                            SmallOffset
 381         */
 382
 383        struct nvsp_1_receive_buffer_section sections[1];
 384} __packed;
 385
 386/*
 387 * This message is sent by the VSC to revoke the receive buffer.  After the VSP
 388 * completes this transaction, the vsp should never use the receive buffer
 389 * again.
 390 */
 391struct nvsp_1_message_revoke_receive_buffer {
 392        u16 id;
 393};
 394
 395/*
 396 * This message is used by the VSC to send a send buffer to the VSP. The VSC
 397 * can then use the send buffer to send data to the VSP.
 398 */
 399struct nvsp_1_message_send_send_buffer {
 400        u32 gpadl_handle;
 401        u16 id;
 402} __packed;
 403
 404/*
 405 * This message is used by the VSP to acknowledge a send buffer sent by the
 406 * VSC. This message must be sent by the VSP before the VSP uses the sent
 407 * buffer.
 408 */
 409struct nvsp_1_message_send_send_buffer_complete {
 410        u32 status;
 411
 412        /*
 413         * The VSC gets to choose the size of the send buffer and the VSP gets
 414         * to choose the sections size of the buffer.  This was done to enable
 415         * dynamic reconfigurations when the cost of GPA-direct buffers
 416         * decreases.
 417         */
 418        u32 section_size;
 419} __packed;
 420
 421/*
 422 * This message is sent by the VSC to revoke the send buffer.  After the VSP
 423 * completes this transaction, the vsp should never use the send buffer again.
 424 */
 425struct nvsp_1_message_revoke_send_buffer {
 426        u16 id;
 427};
 428
 429/*
 430 * This message is used by both the VSP and the VSC to send a RNDIS message to
 431 * the opposite channel endpoint.
 432 */
 433struct nvsp_1_message_send_rndis_packet {
 434        /*
 435         * This field is specified by RNIDS. They assume there's two different
 436         * channels of communication. However, the Network VSP only has one.
 437         * Therefore, the channel travels with the RNDIS packet.
 438         */
 439        u32 channel_type;
 440
 441        /*
 442         * This field is used to send part or all of the data through a send
 443         * buffer. This values specifies an index into the send buffer. If the
 444         * index is 0xFFFFFFFF, then the send buffer is not being used and all
 445         * of the data was sent through other VMBus mechanisms.
 446         */
 447        u32 send_buf_section_index;
 448        u32 send_buf_section_size;
 449} __packed;
 450
 451/*
 452 * This message is used by both the VSP and the VSC to complete a RNDIS message
 453 * to the opposite channel endpoint. At this point, the initiator of this
 454 * message cannot use any resources associated with the original RNDIS packet.
 455 */
 456struct nvsp_1_message_send_rndis_packet_complete {
 457        u32 status;
 458};
 459
 460union nvsp_1_message_uber {
 461        struct nvsp_1_message_send_ndis_version send_ndis_ver;
 462
 463        struct nvsp_1_message_send_receive_buffer send_recv_buf;
 464        struct nvsp_1_message_send_receive_buffer_complete
 465                                                send_recv_buf_complete;
 466        struct nvsp_1_message_revoke_receive_buffer revoke_recv_buf;
 467
 468        struct nvsp_1_message_send_send_buffer send_send_buf;
 469        struct nvsp_1_message_send_send_buffer_complete send_send_buf_complete;
 470        struct nvsp_1_message_revoke_send_buffer revoke_send_buf;
 471
 472        struct nvsp_1_message_send_rndis_packet send_rndis_pkt;
 473        struct nvsp_1_message_send_rndis_packet_complete
 474                                                send_rndis_pkt_complete;
 475} __packed;
 476
 477
 478/*
 479 * Network VSP protocol version 2 messages:
 480 */
 481struct nvsp_2_vsc_capability {
 482        union {
 483                u64 data;
 484                struct {
 485                        u64 vmq:1;
 486                        u64 chimney:1;
 487                        u64 sriov:1;
 488                        u64 ieee8021q:1;
 489                        u64 correlation_id:1;
 490                };
 491        };
 492} __packed;
 493
 494struct nvsp_2_send_ndis_config {
 495        u32 mtu;
 496        u32 reserved;
 497        struct nvsp_2_vsc_capability capability;
 498} __packed;
 499
 500/* Allocate receive buffer */
 501struct nvsp_2_alloc_rxbuf {
 502        /* Allocation ID to match the allocation request and response */
 503        u32 alloc_id;
 504
 505        /* Length of the VM shared memory receive buffer that needs to
 506         * be allocated
 507         */
 508        u32 len;
 509} __packed;
 510
 511/* Allocate receive buffer complete */
 512struct nvsp_2_alloc_rxbuf_comp {
 513        /* The NDIS_STATUS code for buffer allocation */
 514        u32 status;
 515
 516        u32 alloc_id;
 517
 518        /* GPADL handle for the allocated receive buffer */
 519        u32 gpadl_handle;
 520
 521        /* Receive buffer ID */
 522        u64 recv_buf_id;
 523} __packed;
 524
 525struct nvsp_2_free_rxbuf {
 526        u64 recv_buf_id;
 527} __packed;
 528
 529union nvsp_2_message_uber {
 530        struct nvsp_2_send_ndis_config send_ndis_config;
 531        struct nvsp_2_alloc_rxbuf alloc_rxbuf;
 532        struct nvsp_2_alloc_rxbuf_comp alloc_rxbuf_comp;
 533        struct nvsp_2_free_rxbuf free_rxbuf;
 534} __packed;
 535
 536struct nvsp_4_send_vf_association {
 537        /* 1: allocated, serial number is valid. 0: not allocated */
 538        u32 allocated;
 539
 540        /* Serial number of the VF to team with */
 541        u32 serial;
 542} __packed;
 543
 544enum nvsp_vm_datapath {
 545        NVSP_DATAPATH_SYNTHETIC = 0,
 546        NVSP_DATAPATH_VF,
 547        NVSP_DATAPATH_MAX
 548};
 549
 550struct nvsp_4_sw_datapath {
 551        u32 active_datapath; /* active data path in VM */
 552} __packed;
 553
 554union nvsp_4_message_uber {
 555        struct nvsp_4_send_vf_association vf_assoc;
 556        struct nvsp_4_sw_datapath active_dp;
 557} __packed;
 558
 559enum nvsp_subchannel_operation {
 560        NVSP_SUBCHANNEL_NONE = 0,
 561        NVSP_SUBCHANNEL_ALLOCATE,
 562        NVSP_SUBCHANNEL_MAX
 563};
 564
 565struct nvsp_5_subchannel_request {
 566        u32 op;
 567        u32 num_subchannels;
 568} __packed;
 569
 570struct nvsp_5_subchannel_complete {
 571        u32 status;
 572        u32 num_subchannels; /* Actual number of subchannels allocated */
 573} __packed;
 574
 575struct nvsp_5_send_indirect_table {
 576        /* The number of entries in the send indirection table */
 577        u32 count;
 578
 579        /* The offset of the send indireciton table from top of this struct.
 580         * The send indirection table tells which channel to put the send
 581         * traffic on. Each entry is a channel number.
 582         */
 583        u32 offset;
 584} __packed;
 585
 586union nvsp_5_message_uber {
 587        struct nvsp_5_subchannel_request subchn_req;
 588        struct nvsp_5_subchannel_complete subchn_comp;
 589        struct nvsp_5_send_indirect_table send_table;
 590} __packed;
 591
 592union nvsp_all_messages {
 593        union nvsp_message_init_uber init_msg;
 594        union nvsp_1_message_uber v1_msg;
 595        union nvsp_2_message_uber v2_msg;
 596        union nvsp_4_message_uber v4_msg;
 597        union nvsp_5_message_uber v5_msg;
 598} __packed;
 599
 600/* ALL Messages */
 601struct nvsp_message {
 602        struct nvsp_message_header hdr;
 603        union nvsp_all_messages msg;
 604} __packed;
 605
 606
 607#define NETVSC_MTU 65536
 608#define NETVSC_MTU_MIN 68
 609
 610#define NETVSC_RECEIVE_BUFFER_SIZE              (1024*1024*16)  /* 16MB */
 611#define NETVSC_RECEIVE_BUFFER_SIZE_LEGACY       (1024*1024*15)  /* 15MB */
 612#define NETVSC_SEND_BUFFER_SIZE                 (1024 * 1024 * 15)   /* 15MB */
 613#define NETVSC_INVALID_INDEX                    -1
 614
 615
 616#define NETVSC_RECEIVE_BUFFER_ID                0xcafe
 617#define NETVSC_SEND_BUFFER_ID                   0
 618
 619#define NETVSC_PACKET_SIZE                      4096
 620
 621#define VRSS_SEND_TAB_SIZE 16
 622#define VRSS_CHANNEL_MAX 64
 623
 624#define RNDIS_MAX_PKT_DEFAULT 8
 625#define RNDIS_PKT_ALIGN_DEFAULT 8
 626
 627struct multi_send_data {
 628        struct sk_buff *skb; /* skb containing the pkt */
 629        struct hv_netvsc_packet *pkt; /* netvsc pkt pending */
 630        u32 count; /* counter of batched packets */
 631};
 632
 633struct netvsc_stats {
 634        u64 packets;
 635        u64 bytes;
 636        struct u64_stats_sync syncp;
 637};
 638
 639struct netvsc_reconfig {
 640        struct list_head list;
 641        u32 event;
 642};
 643
 644/* The context of the netvsc device  */
 645struct net_device_context {
 646        /* point back to our device context */
 647        struct hv_device *device_ctx;
 648        /* reconfigure work */
 649        struct delayed_work dwork;
 650        /* last reconfig time */
 651        unsigned long last_reconfig;
 652        /* reconfig events */
 653        struct list_head reconfig_events;
 654        /* list protection */
 655        spinlock_t lock;
 656
 657        struct work_struct work;
 658        u32 msg_enable; /* debug level */
 659
 660        struct netvsc_stats __percpu *tx_stats;
 661        struct netvsc_stats __percpu *rx_stats;
 662
 663        /* Ethtool settings */
 664        u8 duplex;
 665        u32 speed;
 666};
 667
 668/* Per netvsc device */
 669struct netvsc_device {
 670        struct hv_device *dev;
 671
 672        u32 nvsp_version;
 673
 674        atomic_t num_outstanding_sends;
 675        wait_queue_head_t wait_drain;
 676        bool start_remove;
 677        bool destroy;
 678
 679        /* Receive buffer allocated by us but manages by NetVSP */
 680        void *recv_buf;
 681        u32 recv_buf_size;
 682        u32 recv_buf_gpadl_handle;
 683        u32 recv_section_cnt;
 684        struct nvsp_1_receive_buffer_section *recv_section;
 685
 686        /* Send buffer allocated by us */
 687        void *send_buf;
 688        u32 send_buf_size;
 689        u32 send_buf_gpadl_handle;
 690        u32 send_section_cnt;
 691        u32 send_section_size;
 692        unsigned long *send_section_map;
 693        int map_words;
 694
 695        /* Used for NetVSP initialization protocol */
 696        struct completion channel_init_wait;
 697        struct nvsp_message channel_init_pkt;
 698
 699        struct nvsp_message revoke_packet;
 700        /* unsigned char HwMacAddr[HW_MACADDR_LEN]; */
 701
 702        struct net_device *ndev;
 703
 704        struct vmbus_channel *chn_table[VRSS_CHANNEL_MAX];
 705        u32 send_table[VRSS_SEND_TAB_SIZE];
 706        u32 max_chn;
 707        u32 num_chn;
 708        spinlock_t sc_lock; /* Protects num_sc_offered variable */
 709        u32 num_sc_offered;
 710        atomic_t queue_sends[VRSS_CHANNEL_MAX];
 711
 712        /* Holds rndis device info */
 713        void *extension;
 714
 715        int ring_size;
 716
 717        /* The primary channel callback buffer */
 718        unsigned char *cb_buffer;
 719        /* The sub channel callback buffer */
 720        unsigned char *sub_cb_buf;
 721
 722        struct multi_send_data msd[VRSS_CHANNEL_MAX];
 723        u32 max_pkt; /* max number of pkt in one send, e.g. 8 */
 724        u32 pkt_align; /* alignment bytes, e.g. 8 */
 725
 726        /* The net device context */
 727        struct net_device_context *nd_ctx;
 728
 729        /* 1: allocated, serial number is valid. 0: not allocated */
 730        u32 vf_alloc;
 731        /* Serial number of the VF to team with */
 732        u32 vf_serial;
 733};
 734
 735/* NdisInitialize message */
 736struct rndis_initialize_request {
 737        u32 req_id;
 738        u32 major_ver;
 739        u32 minor_ver;
 740        u32 max_xfer_size;
 741};
 742
 743/* Response to NdisInitialize */
 744struct rndis_initialize_complete {
 745        u32 req_id;
 746        u32 status;
 747        u32 major_ver;
 748        u32 minor_ver;
 749        u32 dev_flags;
 750        u32 medium;
 751        u32 max_pkt_per_msg;
 752        u32 max_xfer_size;
 753        u32 pkt_alignment_factor;
 754        u32 af_list_offset;
 755        u32 af_list_size;
 756};
 757
 758/* Call manager devices only: Information about an address family */
 759/* supported by the device is appended to the response to NdisInitialize. */
 760struct rndis_co_address_family {
 761        u32 address_family;
 762        u32 major_ver;
 763        u32 minor_ver;
 764};
 765
 766/* NdisHalt message */
 767struct rndis_halt_request {
 768        u32 req_id;
 769};
 770
 771/* NdisQueryRequest message */
 772struct rndis_query_request {
 773        u32 req_id;
 774        u32 oid;
 775        u32 info_buflen;
 776        u32 info_buf_offset;
 777        u32 dev_vc_handle;
 778};
 779
 780/* Response to NdisQueryRequest */
 781struct rndis_query_complete {
 782        u32 req_id;
 783        u32 status;
 784        u32 info_buflen;
 785        u32 info_buf_offset;
 786};
 787
 788/* NdisSetRequest message */
 789struct rndis_set_request {
 790        u32 req_id;
 791        u32 oid;
 792        u32 info_buflen;
 793        u32 info_buf_offset;
 794        u32 dev_vc_handle;
 795};
 796
 797/* Response to NdisSetRequest */
 798struct rndis_set_complete {
 799        u32 req_id;
 800        u32 status;
 801};
 802
 803/* NdisReset message */
 804struct rndis_reset_request {
 805        u32 reserved;
 806};
 807
 808/* Response to NdisReset */
 809struct rndis_reset_complete {
 810        u32 status;
 811        u32 addressing_reset;
 812};
 813
 814/* NdisMIndicateStatus message */
 815struct rndis_indicate_status {
 816        u32 status;
 817        u32 status_buflen;
 818        u32 status_buf_offset;
 819};
 820
 821/* Diagnostic information passed as the status buffer in */
 822/* struct rndis_indicate_status messages signifying error conditions. */
 823struct rndis_diagnostic_info {
 824        u32 diag_status;
 825        u32 error_offset;
 826};
 827
 828/* NdisKeepAlive message */
 829struct rndis_keepalive_request {
 830        u32 req_id;
 831};
 832
 833/* Response to NdisKeepAlive */
 834struct rndis_keepalive_complete {
 835        u32 req_id;
 836        u32 status;
 837};
 838
 839/*
 840 * Data message. All Offset fields contain byte offsets from the beginning of
 841 * struct rndis_packet. All Length fields are in bytes.  VcHandle is set
 842 * to 0 for connectionless data, otherwise it contains the VC handle.
 843 */
 844struct rndis_packet {
 845        u32 data_offset;
 846        u32 data_len;
 847        u32 oob_data_offset;
 848        u32 oob_data_len;
 849        u32 num_oob_data_elements;
 850        u32 per_pkt_info_offset;
 851        u32 per_pkt_info_len;
 852        u32 vc_handle;
 853        u32 reserved;
 854};
 855
 856/* Optional Out of Band data associated with a Data message. */
 857struct rndis_oobd {
 858        u32 size;
 859        u32 type;
 860        u32 class_info_offset;
 861};
 862
 863/* Packet extension field contents associated with a Data message. */
 864struct rndis_per_packet_info {
 865        u32 size;
 866        u32 type;
 867        u32 ppi_offset;
 868};
 869
 870enum ndis_per_pkt_info_type {
 871        TCPIP_CHKSUM_PKTINFO,
 872        IPSEC_PKTINFO,
 873        TCP_LARGESEND_PKTINFO,
 874        CLASSIFICATION_HANDLE_PKTINFO,
 875        NDIS_RESERVED,
 876        SG_LIST_PKTINFO,
 877        IEEE_8021Q_INFO,
 878        ORIGINAL_PKTINFO,
 879        PACKET_CANCEL_ID,
 880        NBL_HASH_VALUE = PACKET_CANCEL_ID,
 881        ORIGINAL_NET_BUFLIST,
 882        CACHED_NET_BUFLIST,
 883        SHORT_PKT_PADINFO,
 884        MAX_PER_PKT_INFO
 885};
 886
 887struct ndis_pkt_8021q_info {
 888        union {
 889                struct {
 890                        u32 pri:3; /* User Priority */
 891                        u32 cfi:1; /* Canonical Format ID */
 892                        u32 vlanid:12; /* VLAN ID */
 893                        u32 reserved:16;
 894                };
 895                u32 value;
 896        };
 897};
 898
 899struct ndis_oject_header {
 900        u8 type;
 901        u8 revision;
 902        u16 size;
 903};
 904
 905#define NDIS_OBJECT_TYPE_DEFAULT        0x80
 906#define NDIS_OFFLOAD_PARAMETERS_REVISION_3 3
 907#define NDIS_OFFLOAD_PARAMETERS_NO_CHANGE 0
 908#define NDIS_OFFLOAD_PARAMETERS_LSOV2_DISABLED 1
 909#define NDIS_OFFLOAD_PARAMETERS_LSOV2_ENABLED  2
 910#define NDIS_OFFLOAD_PARAMETERS_LSOV1_ENABLED  2
 911#define NDIS_OFFLOAD_PARAMETERS_RSC_DISABLED 1
 912#define NDIS_OFFLOAD_PARAMETERS_RSC_ENABLED 2
 913#define NDIS_OFFLOAD_PARAMETERS_TX_RX_DISABLED 1
 914#define NDIS_OFFLOAD_PARAMETERS_TX_ENABLED_RX_DISABLED 2
 915#define NDIS_OFFLOAD_PARAMETERS_RX_ENABLED_TX_DISABLED 3
 916#define NDIS_OFFLOAD_PARAMETERS_TX_RX_ENABLED 4
 917
 918#define NDIS_TCP_LARGE_SEND_OFFLOAD_V2_TYPE     1
 919#define NDIS_TCP_LARGE_SEND_OFFLOAD_IPV4        0
 920#define NDIS_TCP_LARGE_SEND_OFFLOAD_IPV6        1
 921
 922#define VERSION_4_OFFLOAD_SIZE                  22
 923/*
 924 * New offload OIDs for NDIS 6
 925 */
 926#define OID_TCP_OFFLOAD_CURRENT_CONFIG 0xFC01020B /* query only */
 927#define OID_TCP_OFFLOAD_PARAMETERS 0xFC01020C           /* set only */
 928#define OID_TCP_OFFLOAD_HARDWARE_CAPABILITIES 0xFC01020D/* query only */
 929#define OID_TCP_CONNECTION_OFFLOAD_CURRENT_CONFIG 0xFC01020E /* query only */
 930#define OID_TCP_CONNECTION_OFFLOAD_HARDWARE_CAPABILITIES 0xFC01020F /* query */
 931#define OID_OFFLOAD_ENCAPSULATION 0x0101010A /* set/query */
 932
 933struct ndis_offload_params {
 934        struct ndis_oject_header header;
 935        u8 ip_v4_csum;
 936        u8 tcp_ip_v4_csum;
 937        u8 udp_ip_v4_csum;
 938        u8 tcp_ip_v6_csum;
 939        u8 udp_ip_v6_csum;
 940        u8 lso_v1;
 941        u8 ip_sec_v1;
 942        u8 lso_v2_ipv4;
 943        u8 lso_v2_ipv6;
 944        u8 tcp_connection_ip_v4;
 945        u8 tcp_connection_ip_v6;
 946        u32 flags;
 947        u8 ip_sec_v2;
 948        u8 ip_sec_v2_ip_v4;
 949        struct {
 950                u8 rsc_ip_v4;
 951                u8 rsc_ip_v6;
 952        };
 953        struct {
 954                u8 encapsulated_packet_task_offload;
 955                u8 encapsulation_types;
 956        };
 957};
 958
 959struct ndis_tcp_ip_checksum_info {
 960        union {
 961                struct {
 962                        u32 is_ipv4:1;
 963                        u32 is_ipv6:1;
 964                        u32 tcp_checksum:1;
 965                        u32 udp_checksum:1;
 966                        u32 ip_header_checksum:1;
 967                        u32 reserved:11;
 968                        u32 tcp_header_offset:10;
 969                } transmit;
 970                struct {
 971                        u32 tcp_checksum_failed:1;
 972                        u32 udp_checksum_failed:1;
 973                        u32 ip_checksum_failed:1;
 974                        u32 tcp_checksum_succeeded:1;
 975                        u32 udp_checksum_succeeded:1;
 976                        u32 ip_checksum_succeeded:1;
 977                        u32 loopback:1;
 978                        u32 tcp_checksum_value_invalid:1;
 979                        u32 ip_checksum_value_invalid:1;
 980                } receive;
 981                u32  value;
 982        };
 983};
 984
 985struct ndis_tcp_lso_info {
 986        union {
 987                struct {
 988                        u32 unused:30;
 989                        u32 type:1;
 990                        u32 reserved2:1;
 991                } transmit;
 992                struct {
 993                        u32 mss:20;
 994                        u32 tcp_header_offset:10;
 995                        u32 type:1;
 996                        u32 reserved2:1;
 997                } lso_v1_transmit;
 998                struct {
 999                        u32 tcp_payload:30;
1000                        u32 type:1;
1001                        u32 reserved2:1;
1002                } lso_v1_transmit_complete;
1003                struct {
1004                        u32 mss:20;
1005                        u32 tcp_header_offset:10;
1006                        u32 type:1;
1007                        u32 ip_version:1;
1008                } lso_v2_transmit;
1009                struct {
1010                        u32 reserved:30;
1011                        u32 type:1;
1012                        u32 reserved2:1;
1013                } lso_v2_transmit_complete;
1014                u32  value;
1015        };
1016};
1017
1018#define NDIS_VLAN_PPI_SIZE (sizeof(struct rndis_per_packet_info) + \
1019                sizeof(struct ndis_pkt_8021q_info))
1020
1021#define NDIS_CSUM_PPI_SIZE (sizeof(struct rndis_per_packet_info) + \
1022                sizeof(struct ndis_tcp_ip_checksum_info))
1023
1024#define NDIS_LSO_PPI_SIZE (sizeof(struct rndis_per_packet_info) + \
1025                sizeof(struct ndis_tcp_lso_info))
1026
1027#define NDIS_HASH_PPI_SIZE (sizeof(struct rndis_per_packet_info) + \
1028                sizeof(u32))
1029
1030/* Total size of all PPI data */
1031#define NDIS_ALL_PPI_SIZE (NDIS_VLAN_PPI_SIZE + NDIS_CSUM_PPI_SIZE + \
1032                           NDIS_LSO_PPI_SIZE + NDIS_HASH_PPI_SIZE)
1033
1034/* Format of Information buffer passed in a SetRequest for the OID */
1035/* OID_GEN_RNDIS_CONFIG_PARAMETER. */
1036struct rndis_config_parameter_info {
1037        u32 parameter_name_offset;
1038        u32 parameter_name_length;
1039        u32 parameter_type;
1040        u32 parameter_value_offset;
1041        u32 parameter_value_length;
1042};
1043
1044/* Values for ParameterType in struct rndis_config_parameter_info */
1045#define RNDIS_CONFIG_PARAM_TYPE_INTEGER     0
1046#define RNDIS_CONFIG_PARAM_TYPE_STRING      2
1047
1048/* CONDIS Miniport messages for connection oriented devices */
1049/* that do not implement a call manager. */
1050
1051/* CoNdisMiniportCreateVc message */
1052struct rcondis_mp_create_vc {
1053        u32 req_id;
1054        u32 ndis_vc_handle;
1055};
1056
1057/* Response to CoNdisMiniportCreateVc */
1058struct rcondis_mp_create_vc_complete {
1059        u32 req_id;
1060        u32 dev_vc_handle;
1061        u32 status;
1062};
1063
1064/* CoNdisMiniportDeleteVc message */
1065struct rcondis_mp_delete_vc {
1066        u32 req_id;
1067        u32 dev_vc_handle;
1068};
1069
1070/* Response to CoNdisMiniportDeleteVc */
1071struct rcondis_mp_delete_vc_complete {
1072        u32 req_id;
1073        u32 status;
1074};
1075
1076/* CoNdisMiniportQueryRequest message */
1077struct rcondis_mp_query_request {
1078        u32 req_id;
1079        u32 request_type;
1080        u32 oid;
1081        u32 dev_vc_handle;
1082        u32 info_buflen;
1083        u32 info_buf_offset;
1084};
1085
1086/* CoNdisMiniportSetRequest message */
1087struct rcondis_mp_set_request {
1088        u32 req_id;
1089        u32 request_type;
1090        u32 oid;
1091        u32 dev_vc_handle;
1092        u32 info_buflen;
1093        u32 info_buf_offset;
1094};
1095
1096/* CoNdisIndicateStatus message */
1097struct rcondis_indicate_status {
1098        u32 ndis_vc_handle;
1099        u32 status;
1100        u32 status_buflen;
1101        u32 status_buf_offset;
1102};
1103
1104/* CONDIS Call/VC parameters */
1105struct rcondis_specific_parameters {
1106        u32 parameter_type;
1107        u32 parameter_length;
1108        u32 parameter_lffset;
1109};
1110
1111struct rcondis_media_parameters {
1112        u32 flags;
1113        u32 reserved1;
1114        u32 reserved2;
1115        struct rcondis_specific_parameters media_specific;
1116};
1117
1118struct rndis_flowspec {
1119        u32 token_rate;
1120        u32 token_bucket_size;
1121        u32 peak_bandwidth;
1122        u32 latency;
1123        u32 delay_variation;
1124        u32 service_type;
1125        u32 max_sdu_size;
1126        u32 minimum_policed_size;
1127};
1128
1129struct rcondis_call_manager_parameters {
1130        struct rndis_flowspec transmit;
1131        struct rndis_flowspec receive;
1132        struct rcondis_specific_parameters call_mgr_specific;
1133};
1134
1135/* CoNdisMiniportActivateVc message */
1136struct rcondis_mp_activate_vc_request {
1137        u32 req_id;
1138        u32 flags;
1139        u32 dev_vc_handle;
1140        u32 media_params_offset;
1141        u32 media_params_length;
1142        u32 call_mgr_params_offset;
1143        u32 call_mgr_params_length;
1144};
1145
1146/* Response to CoNdisMiniportActivateVc */
1147struct rcondis_mp_activate_vc_complete {
1148        u32 req_id;
1149        u32 status;
1150};
1151
1152/* CoNdisMiniportDeactivateVc message */
1153struct rcondis_mp_deactivate_vc_request {
1154        u32 req_id;
1155        u32 flags;
1156        u32 dev_vc_handle;
1157};
1158
1159/* Response to CoNdisMiniportDeactivateVc */
1160struct rcondis_mp_deactivate_vc_complete {
1161        u32 req_id;
1162        u32 status;
1163};
1164
1165
1166/* union with all of the RNDIS messages */
1167union rndis_message_container {
1168        struct rndis_packet pkt;
1169        struct rndis_initialize_request init_req;
1170        struct rndis_halt_request halt_req;
1171        struct rndis_query_request query_req;
1172        struct rndis_set_request set_req;
1173        struct rndis_reset_request reset_req;
1174        struct rndis_keepalive_request keep_alive_req;
1175        struct rndis_indicate_status indicate_status;
1176        struct rndis_initialize_complete init_complete;
1177        struct rndis_query_complete query_complete;
1178        struct rndis_set_complete set_complete;
1179        struct rndis_reset_complete reset_complete;
1180        struct rndis_keepalive_complete keep_alive_complete;
1181        struct rcondis_mp_create_vc co_miniport_create_vc;
1182        struct rcondis_mp_delete_vc co_miniport_delete_vc;
1183        struct rcondis_indicate_status co_indicate_status;
1184        struct rcondis_mp_activate_vc_request co_miniport_activate_vc;
1185        struct rcondis_mp_deactivate_vc_request co_miniport_deactivate_vc;
1186        struct rcondis_mp_create_vc_complete co_miniport_create_vc_complete;
1187        struct rcondis_mp_delete_vc_complete co_miniport_delete_vc_complete;
1188        struct rcondis_mp_activate_vc_complete co_miniport_activate_vc_complete;
1189        struct rcondis_mp_deactivate_vc_complete
1190                co_miniport_deactivate_vc_complete;
1191};
1192
1193/* Remote NDIS message format */
1194struct rndis_message {
1195        u32 ndis_msg_type;
1196
1197        /* Total length of this message, from the beginning */
1198        /* of the sruct rndis_message, in bytes. */
1199        u32 msg_len;
1200
1201        /* Actual message */
1202        union rndis_message_container msg;
1203};
1204
1205
1206/* Handy macros */
1207
1208/* get the size of an RNDIS message. Pass in the message type, */
1209/* struct rndis_set_request, struct rndis_packet for example */
1210#define RNDIS_MESSAGE_SIZE(msg)                         \
1211        (sizeof(msg) + (sizeof(struct rndis_message) -  \
1212         sizeof(union rndis_message_container)))
1213
1214/* get pointer to info buffer with message pointer */
1215#define MESSAGE_TO_INFO_BUFFER(msg)                             \
1216        (((unsigned char *)(msg)) + msg->info_buf_offset)
1217
1218/* get pointer to status buffer with message pointer */
1219#define MESSAGE_TO_STATUS_BUFFER(msg)                   \
1220        (((unsigned char *)(msg)) + msg->status_buf_offset)
1221
1222/* get pointer to OOBD buffer with message pointer */
1223#define MESSAGE_TO_OOBD_BUFFER(msg)                             \
1224        (((unsigned char *)(msg)) + msg->oob_data_offset)
1225
1226/* get pointer to data buffer with message pointer */
1227#define MESSAGE_TO_DATA_BUFFER(msg)                             \
1228        (((unsigned char *)(msg)) + msg->per_pkt_info_offset)
1229
1230/* get pointer to contained message from NDIS_MESSAGE pointer */
1231#define RNDIS_MESSAGE_PTR_TO_MESSAGE_PTR(rndis_msg)             \
1232        ((void *) &rndis_msg->msg)
1233
1234/* get pointer to contained message from NDIS_MESSAGE pointer */
1235#define RNDIS_MESSAGE_RAW_PTR_TO_MESSAGE_PTR(rndis_msg) \
1236        ((void *) rndis_msg)
1237
1238
1239#define __struct_bcount(x)
1240
1241
1242
1243#define RNDIS_HEADER_SIZE       (sizeof(struct rndis_message) - \
1244                                 sizeof(union rndis_message_container))
1245
1246#define RNDIS_AND_PPI_SIZE (sizeof(struct rndis_message) + NDIS_ALL_PPI_SIZE)
1247
1248#define NDIS_PACKET_TYPE_DIRECTED       0x00000001
1249#define NDIS_PACKET_TYPE_MULTICAST      0x00000002
1250#define NDIS_PACKET_TYPE_ALL_MULTICAST  0x00000004
1251#define NDIS_PACKET_TYPE_BROADCAST      0x00000008
1252#define NDIS_PACKET_TYPE_SOURCE_ROUTING 0x00000010
1253#define NDIS_PACKET_TYPE_PROMISCUOUS    0x00000020
1254#define NDIS_PACKET_TYPE_SMT            0x00000040
1255#define NDIS_PACKET_TYPE_ALL_LOCAL      0x00000080
1256#define NDIS_PACKET_TYPE_GROUP          0x00000100
1257#define NDIS_PACKET_TYPE_ALL_FUNCTIONAL 0x00000200
1258#define NDIS_PACKET_TYPE_FUNCTIONAL     0x00000400
1259#define NDIS_PACKET_TYPE_MAC_FRAME      0x00000800
1260
1261#define INFO_IPV4       2
1262#define INFO_IPV6       4
1263#define INFO_TCP        2
1264#define INFO_UDP        4
1265
1266#define TRANSPORT_INFO_NOT_IP   0
1267#define TRANSPORT_INFO_IPV4_TCP ((INFO_IPV4 << 16) | INFO_TCP)
1268#define TRANSPORT_INFO_IPV4_UDP ((INFO_IPV4 << 16) | INFO_UDP)
1269#define TRANSPORT_INFO_IPV6_TCP ((INFO_IPV6 << 16) | INFO_TCP)
1270#define TRANSPORT_INFO_IPV6_UDP ((INFO_IPV6 << 16) | INFO_UDP)
1271
1272#endif /* _HYPERV_NET_H */
1273