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