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 41 struct 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 58 struct 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 88 extern u8 netvsc_hash_key[]; 89 90 struct 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 */ 122 struct 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 struct 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 160 struct 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 166 enum rndis_device_state { 167 RNDIS_DEV_UNINITIALIZED = 0, 168 RNDIS_DEV_INITIALIZING, 169 RNDIS_DEV_INITIALIZED, 170 RNDIS_DEV_DATAINITIALIZED, 171 }; 172 173 struct 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 */ 189 int netvsc_device_add(struct hv_device *device, void *additional_info); 190 int netvsc_device_remove(struct hv_device *device); 191 int netvsc_send(struct hv_device *device, 192 struct hv_netvsc_packet *packet); 193 void netvsc_linkstatus_callback(struct hv_device *device_obj, 194 struct rndis_message *resp); 195 void netvsc_xmit_completion(void *context); 196 int netvsc_recv_callback(struct hv_device *device_obj, 197 struct hv_netvsc_packet *packet, 198 struct ndis_tcp_ip_checksum_info *csum_info); 199 void netvsc_channel_cb(void *context); 200 int rndis_filter_open(struct hv_device *dev); 201 int rndis_filter_close(struct hv_device *dev); 202 int rndis_filter_device_add(struct hv_device *dev, 203 void *additional_info); 204 void rndis_filter_device_remove(struct hv_device *dev); 205 int rndis_filter_receive(struct hv_device *dev, 206 struct hv_netvsc_packet *pkt); 207 208 int rndis_filter_set_packet_filter(struct rndis_device *dev, u32 new_filter); 209 int 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 219 enum { 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 291 enum { 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 303 struct 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 */ 314 struct 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 */ 324 struct nvsp_message_init_complete { 325 u32 negotiated_protocol_ver; 326 u32 max_mdl_chain_len; 327 u32 status; 328 } __packed; 329 330 union 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 */ 341 struct 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 */ 350 struct nvsp_1_message_send_receive_buffer { 351 u32 gpadl_handle; 352 u16 id; 353 } __packed; 354 355 struct 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 */ 367 struct 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 */ 398 struct 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 */ 406 struct 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 */ 416 struct 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 */ 432 struct 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 */ 440 struct 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 */ 463 struct nvsp_1_message_send_rndis_packet_complete { 464 u32 status; 465 }; 466 467 union 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 */ 488 struct 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 501 struct 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 */ 508 struct 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 */ 519 struct 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 532 struct nvsp_2_free_rxbuf { 533 u64 recv_buf_id; 534 } __packed; 535 536 union 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 543 enum nvsp_subchannel_operation { 544 NVSP_SUBCHANNEL_NONE = 0, 545 NVSP_SUBCHANNEL_ALLOCATE, 546 NVSP_SUBCHANNEL_MAX 547 }; 548 549 struct nvsp_5_subchannel_request { 550 u32 op; 551 u32 num_subchannels; 552 } __packed; 553 554 struct nvsp_5_subchannel_complete { 555 u32 status; 556 u32 num_subchannels; /* Actual number of subchannels allocated */ 557 } __packed; 558 559 struct 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 570 union 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 576 union 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 */ 584 struct 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 608 struct 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 */ 615 struct 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 */ 624 struct 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 */ 684 struct 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 */ 692 struct 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. */ 708 struct rndis_co_address_family { 709 u32 address_family; 710 u32 major_ver; 711 u32 minor_ver; 712 }; 713 714 /* NdisHalt message */ 715 struct rndis_halt_request { 716 u32 req_id; 717 }; 718 719 /* NdisQueryRequest message */ 720 struct 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 */ 729 struct rndis_query_complete { 730 u32 req_id; 731 u32 status; 732 u32 info_buflen; 733 u32 info_buf_offset; 734 }; 735 736 /* NdisSetRequest message */ 737 struct 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 */ 746 struct rndis_set_complete { 747 u32 req_id; 748 u32 status; 749 }; 750 751 /* NdisReset message */ 752 struct rndis_reset_request { 753 u32 reserved; 754 }; 755 756 /* Response to NdisReset */ 757 struct rndis_reset_complete { 758 u32 status; 759 u32 addressing_reset; 760 }; 761 762 /* NdisMIndicateStatus message */ 763 struct 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. */ 771 struct rndis_diagnostic_info { 772 u32 diag_status; 773 u32 error_offset; 774 }; 775 776 /* NdisKeepAlive message */ 777 struct rndis_keepalive_request { 778 u32 req_id; 779 }; 780 781 /* Response to NdisKeepAlive */ 782 struct 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 */ 792 struct 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. */ 805 struct 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. */ 812 struct rndis_per_packet_info { 813 u32 size; 814 u32 type; 815 u32 ppi_offset; 816 }; 817 818 enum 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 835 struct 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 847 struct 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 881 struct 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 907 struct 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 933 struct 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. */ 984 struct 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 */ 1000 struct rcondis_mp_create_vc { 1001 u32 req_id; 1002 u32 ndis_vc_handle; 1003 }; 1004 1005 /* Response to CoNdisMiniportCreateVc */ 1006 struct rcondis_mp_create_vc_complete { 1007 u32 req_id; 1008 u32 dev_vc_handle; 1009 u32 status; 1010 }; 1011 1012 /* CoNdisMiniportDeleteVc message */ 1013 struct rcondis_mp_delete_vc { 1014 u32 req_id; 1015 u32 dev_vc_handle; 1016 }; 1017 1018 /* Response to CoNdisMiniportDeleteVc */ 1019 struct rcondis_mp_delete_vc_complete { 1020 u32 req_id; 1021 u32 status; 1022 }; 1023 1024 /* CoNdisMiniportQueryRequest message */ 1025 struct 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 */ 1035 struct 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 */ 1045 struct 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 */ 1053 struct rcondis_specific_parameters { 1054 u32 parameter_type; 1055 u32 parameter_length; 1056 u32 parameter_lffset; 1057 }; 1058 1059 struct rcondis_media_parameters { 1060 u32 flags; 1061 u32 reserved1; 1062 u32 reserved2; 1063 struct rcondis_specific_parameters media_specific; 1064 }; 1065 1066 struct 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 1077 struct 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 */ 1084 struct 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 */ 1095 struct rcondis_mp_activate_vc_complete { 1096 u32 req_id; 1097 u32 status; 1098 }; 1099 1100 /* CoNdisMiniportDeactivateVc message */ 1101 struct rcondis_mp_deactivate_vc_request { 1102 u32 req_id; 1103 u32 flags; 1104 u32 dev_vc_handle; 1105 }; 1106 1107 /* Response to CoNdisMiniportDeactivateVc */ 1108 struct rcondis_mp_deactivate_vc_complete { 1109 u32 req_id; 1110 u32 status; 1111 }; 1112 1113 1114 /* union with all of the RNDIS messages */ 1115 union 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 */ 1142 struct 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