1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * Copyright (c) 2011, Microsoft Corporation. 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * Authors: 7*4882a593Smuzhiyun * Haiyang Zhang <haiyangz@microsoft.com> 8*4882a593Smuzhiyun * Hank Janssen <hjanssen@microsoft.com> 9*4882a593Smuzhiyun * K. Y. Srinivasan <kys@microsoft.com> 10*4882a593Smuzhiyun */ 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #ifndef _HYPERV_NET_H 13*4882a593Smuzhiyun #define _HYPERV_NET_H 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun #include <linux/list.h> 16*4882a593Smuzhiyun #include <linux/hyperv.h> 17*4882a593Smuzhiyun #include <linux/rndis.h> 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun /* RSS related */ 20*4882a593Smuzhiyun #define OID_GEN_RECEIVE_SCALE_CAPABILITIES 0x00010203 /* query only */ 21*4882a593Smuzhiyun #define OID_GEN_RECEIVE_SCALE_PARAMETERS 0x00010204 /* query and set */ 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun #define NDIS_OBJECT_TYPE_RSS_CAPABILITIES 0x88 24*4882a593Smuzhiyun #define NDIS_OBJECT_TYPE_RSS_PARAMETERS 0x89 25*4882a593Smuzhiyun #define NDIS_OBJECT_TYPE_OFFLOAD 0xa7 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun #define NDIS_RECEIVE_SCALE_CAPABILITIES_REVISION_2 2 28*4882a593Smuzhiyun #define NDIS_RECEIVE_SCALE_PARAMETERS_REVISION_2 2 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun struct ndis_obj_header { 31*4882a593Smuzhiyun u8 type; 32*4882a593Smuzhiyun u8 rev; 33*4882a593Smuzhiyun u16 size; 34*4882a593Smuzhiyun } __packed; 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun /* ndis_recv_scale_cap/cap_flag */ 37*4882a593Smuzhiyun #define NDIS_RSS_CAPS_MESSAGE_SIGNALED_INTERRUPTS 0x01000000 38*4882a593Smuzhiyun #define NDIS_RSS_CAPS_CLASSIFICATION_AT_ISR 0x02000000 39*4882a593Smuzhiyun #define NDIS_RSS_CAPS_CLASSIFICATION_AT_DPC 0x04000000 40*4882a593Smuzhiyun #define NDIS_RSS_CAPS_USING_MSI_X 0x08000000 41*4882a593Smuzhiyun #define NDIS_RSS_CAPS_RSS_AVAILABLE_ON_PORTS 0x10000000 42*4882a593Smuzhiyun #define NDIS_RSS_CAPS_SUPPORTS_MSI_X 0x20000000 43*4882a593Smuzhiyun #define NDIS_RSS_CAPS_HASH_TYPE_TCP_IPV4 0x00000100 44*4882a593Smuzhiyun #define NDIS_RSS_CAPS_HASH_TYPE_TCP_IPV6 0x00000200 45*4882a593Smuzhiyun #define NDIS_RSS_CAPS_HASH_TYPE_TCP_IPV6_EX 0x00000400 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun struct ndis_recv_scale_cap { /* NDIS_RECEIVE_SCALE_CAPABILITIES */ 48*4882a593Smuzhiyun struct ndis_obj_header hdr; 49*4882a593Smuzhiyun u32 cap_flag; 50*4882a593Smuzhiyun u32 num_int_msg; 51*4882a593Smuzhiyun u32 num_recv_que; 52*4882a593Smuzhiyun u16 num_indirect_tabent; 53*4882a593Smuzhiyun } __packed; 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun /* ndis_recv_scale_param flags */ 57*4882a593Smuzhiyun #define NDIS_RSS_PARAM_FLAG_BASE_CPU_UNCHANGED 0x0001 58*4882a593Smuzhiyun #define NDIS_RSS_PARAM_FLAG_HASH_INFO_UNCHANGED 0x0002 59*4882a593Smuzhiyun #define NDIS_RSS_PARAM_FLAG_ITABLE_UNCHANGED 0x0004 60*4882a593Smuzhiyun #define NDIS_RSS_PARAM_FLAG_HASH_KEY_UNCHANGED 0x0008 61*4882a593Smuzhiyun #define NDIS_RSS_PARAM_FLAG_DISABLE_RSS 0x0010 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun /* Hash info bits */ 64*4882a593Smuzhiyun #define NDIS_HASH_FUNC_TOEPLITZ 0x00000001 65*4882a593Smuzhiyun #define NDIS_HASH_IPV4 0x00000100 66*4882a593Smuzhiyun #define NDIS_HASH_TCP_IPV4 0x00000200 67*4882a593Smuzhiyun #define NDIS_HASH_IPV6 0x00000400 68*4882a593Smuzhiyun #define NDIS_HASH_IPV6_EX 0x00000800 69*4882a593Smuzhiyun #define NDIS_HASH_TCP_IPV6 0x00001000 70*4882a593Smuzhiyun #define NDIS_HASH_TCP_IPV6_EX 0x00002000 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun #define NDIS_RSS_INDIRECTION_TABLE_MAX_SIZE_REVISION_2 (128 * 4) 73*4882a593Smuzhiyun #define NDIS_RSS_HASH_SECRET_KEY_MAX_SIZE_REVISION_2 40 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun #define ITAB_NUM 128 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun struct ndis_recv_scale_param { /* NDIS_RECEIVE_SCALE_PARAMETERS */ 78*4882a593Smuzhiyun struct ndis_obj_header hdr; 79*4882a593Smuzhiyun 80*4882a593Smuzhiyun /* Qualifies the rest of the information */ 81*4882a593Smuzhiyun u16 flag; 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun /* The base CPU number to do receive processing. not used */ 84*4882a593Smuzhiyun u16 base_cpu_number; 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun /* This describes the hash function and type being enabled */ 87*4882a593Smuzhiyun u32 hashinfo; 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun /* The size of indirection table array */ 90*4882a593Smuzhiyun u16 indirect_tabsize; 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun /* The offset of the indirection table from the beginning of this 93*4882a593Smuzhiyun * structure 94*4882a593Smuzhiyun */ 95*4882a593Smuzhiyun u32 indirect_taboffset; 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun /* The size of the hash secret key */ 98*4882a593Smuzhiyun u16 hashkey_size; 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun /* The offset of the secret key from the beginning of this structure */ 101*4882a593Smuzhiyun u32 hashkey_offset; 102*4882a593Smuzhiyun 103*4882a593Smuzhiyun u32 processor_masks_offset; 104*4882a593Smuzhiyun u32 num_processor_masks; 105*4882a593Smuzhiyun u32 processor_masks_entry_size; 106*4882a593Smuzhiyun }; 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun /* Fwd declaration */ 109*4882a593Smuzhiyun struct ndis_tcp_ip_checksum_info; 110*4882a593Smuzhiyun struct ndis_pkt_8021q_info; 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun /* 113*4882a593Smuzhiyun * Represent netvsc packet which contains 1 RNDIS and 1 ethernet frame 114*4882a593Smuzhiyun * within the RNDIS 115*4882a593Smuzhiyun * 116*4882a593Smuzhiyun * The size of this structure is less than 48 bytes and we can now 117*4882a593Smuzhiyun * place this structure in the skb->cb field. 118*4882a593Smuzhiyun */ 119*4882a593Smuzhiyun struct hv_netvsc_packet { 120*4882a593Smuzhiyun /* Bookkeeping stuff */ 121*4882a593Smuzhiyun u8 cp_partial; /* partial copy into send buffer */ 122*4882a593Smuzhiyun 123*4882a593Smuzhiyun u8 rmsg_size; /* RNDIS header and PPI size */ 124*4882a593Smuzhiyun u8 rmsg_pgcnt; /* page count of RNDIS header and PPI */ 125*4882a593Smuzhiyun u8 page_buf_cnt; 126*4882a593Smuzhiyun 127*4882a593Smuzhiyun u16 q_idx; 128*4882a593Smuzhiyun u16 total_packets; 129*4882a593Smuzhiyun 130*4882a593Smuzhiyun u32 total_bytes; 131*4882a593Smuzhiyun u32 send_buf_index; 132*4882a593Smuzhiyun u32 total_data_buflen; 133*4882a593Smuzhiyun }; 134*4882a593Smuzhiyun 135*4882a593Smuzhiyun #define NETVSC_HASH_KEYLEN 40 136*4882a593Smuzhiyun 137*4882a593Smuzhiyun struct netvsc_device_info { 138*4882a593Smuzhiyun unsigned char mac_adr[ETH_ALEN]; 139*4882a593Smuzhiyun u32 num_chn; 140*4882a593Smuzhiyun u32 send_sections; 141*4882a593Smuzhiyun u32 recv_sections; 142*4882a593Smuzhiyun u32 send_section_size; 143*4882a593Smuzhiyun u32 recv_section_size; 144*4882a593Smuzhiyun 145*4882a593Smuzhiyun struct bpf_prog *bprog; 146*4882a593Smuzhiyun 147*4882a593Smuzhiyun u8 rss_key[NETVSC_HASH_KEYLEN]; 148*4882a593Smuzhiyun }; 149*4882a593Smuzhiyun 150*4882a593Smuzhiyun enum rndis_device_state { 151*4882a593Smuzhiyun RNDIS_DEV_UNINITIALIZED = 0, 152*4882a593Smuzhiyun RNDIS_DEV_INITIALIZING, 153*4882a593Smuzhiyun RNDIS_DEV_INITIALIZED, 154*4882a593Smuzhiyun RNDIS_DEV_DATAINITIALIZED, 155*4882a593Smuzhiyun }; 156*4882a593Smuzhiyun 157*4882a593Smuzhiyun struct rndis_device { 158*4882a593Smuzhiyun struct net_device *ndev; 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun enum rndis_device_state state; 161*4882a593Smuzhiyun 162*4882a593Smuzhiyun atomic_t new_req_id; 163*4882a593Smuzhiyun 164*4882a593Smuzhiyun spinlock_t request_lock; 165*4882a593Smuzhiyun struct list_head req_list; 166*4882a593Smuzhiyun 167*4882a593Smuzhiyun struct work_struct mcast_work; 168*4882a593Smuzhiyun u32 filter; 169*4882a593Smuzhiyun 170*4882a593Smuzhiyun bool link_state; /* 0 - link up, 1 - link down */ 171*4882a593Smuzhiyun 172*4882a593Smuzhiyun u8 hw_mac_adr[ETH_ALEN]; 173*4882a593Smuzhiyun u8 rss_key[NETVSC_HASH_KEYLEN]; 174*4882a593Smuzhiyun }; 175*4882a593Smuzhiyun 176*4882a593Smuzhiyun 177*4882a593Smuzhiyun /* Interface */ 178*4882a593Smuzhiyun struct rndis_message; 179*4882a593Smuzhiyun struct ndis_offload_params; 180*4882a593Smuzhiyun struct netvsc_device; 181*4882a593Smuzhiyun struct netvsc_channel; 182*4882a593Smuzhiyun struct net_device_context; 183*4882a593Smuzhiyun 184*4882a593Smuzhiyun extern u32 netvsc_ring_bytes; 185*4882a593Smuzhiyun 186*4882a593Smuzhiyun struct netvsc_device *netvsc_device_add(struct hv_device *device, 187*4882a593Smuzhiyun const struct netvsc_device_info *info); 188*4882a593Smuzhiyun int netvsc_alloc_recv_comp_ring(struct netvsc_device *net_device, u32 q_idx); 189*4882a593Smuzhiyun void netvsc_device_remove(struct hv_device *device); 190*4882a593Smuzhiyun int netvsc_send(struct net_device *net, 191*4882a593Smuzhiyun struct hv_netvsc_packet *packet, 192*4882a593Smuzhiyun struct rndis_message *rndis_msg, 193*4882a593Smuzhiyun struct hv_page_buffer *page_buffer, 194*4882a593Smuzhiyun struct sk_buff *skb, 195*4882a593Smuzhiyun bool xdp_tx); 196*4882a593Smuzhiyun void netvsc_linkstatus_callback(struct net_device *net, 197*4882a593Smuzhiyun struct rndis_message *resp); 198*4882a593Smuzhiyun int netvsc_recv_callback(struct net_device *net, 199*4882a593Smuzhiyun struct netvsc_device *nvdev, 200*4882a593Smuzhiyun struct netvsc_channel *nvchan); 201*4882a593Smuzhiyun void netvsc_channel_cb(void *context); 202*4882a593Smuzhiyun int netvsc_poll(struct napi_struct *napi, int budget); 203*4882a593Smuzhiyun 204*4882a593Smuzhiyun u32 netvsc_run_xdp(struct net_device *ndev, struct netvsc_channel *nvchan, 205*4882a593Smuzhiyun struct xdp_buff *xdp); 206*4882a593Smuzhiyun unsigned int netvsc_xdp_fraglen(unsigned int len); 207*4882a593Smuzhiyun struct bpf_prog *netvsc_xdp_get(struct netvsc_device *nvdev); 208*4882a593Smuzhiyun int netvsc_xdp_set(struct net_device *dev, struct bpf_prog *prog, 209*4882a593Smuzhiyun struct netlink_ext_ack *extack, 210*4882a593Smuzhiyun struct netvsc_device *nvdev); 211*4882a593Smuzhiyun int netvsc_vf_setxdp(struct net_device *vf_netdev, struct bpf_prog *prog); 212*4882a593Smuzhiyun int netvsc_bpf(struct net_device *dev, struct netdev_bpf *bpf); 213*4882a593Smuzhiyun 214*4882a593Smuzhiyun int rndis_set_subchannel(struct net_device *ndev, 215*4882a593Smuzhiyun struct netvsc_device *nvdev, 216*4882a593Smuzhiyun struct netvsc_device_info *dev_info); 217*4882a593Smuzhiyun int rndis_filter_open(struct netvsc_device *nvdev); 218*4882a593Smuzhiyun int rndis_filter_close(struct netvsc_device *nvdev); 219*4882a593Smuzhiyun struct netvsc_device *rndis_filter_device_add(struct hv_device *dev, 220*4882a593Smuzhiyun struct netvsc_device_info *info); 221*4882a593Smuzhiyun void rndis_filter_update(struct netvsc_device *nvdev); 222*4882a593Smuzhiyun void rndis_filter_device_remove(struct hv_device *dev, 223*4882a593Smuzhiyun struct netvsc_device *nvdev); 224*4882a593Smuzhiyun int rndis_filter_set_rss_param(struct rndis_device *rdev, 225*4882a593Smuzhiyun const u8 *key); 226*4882a593Smuzhiyun int rndis_filter_set_offload_params(struct net_device *ndev, 227*4882a593Smuzhiyun struct netvsc_device *nvdev, 228*4882a593Smuzhiyun struct ndis_offload_params *req_offloads); 229*4882a593Smuzhiyun int rndis_filter_receive(struct net_device *ndev, 230*4882a593Smuzhiyun struct netvsc_device *net_dev, 231*4882a593Smuzhiyun struct netvsc_channel *nvchan, 232*4882a593Smuzhiyun void *data, u32 buflen); 233*4882a593Smuzhiyun 234*4882a593Smuzhiyun int rndis_filter_set_device_mac(struct netvsc_device *ndev, 235*4882a593Smuzhiyun const char *mac); 236*4882a593Smuzhiyun 237*4882a593Smuzhiyun void netvsc_switch_datapath(struct net_device *nv_dev, bool vf); 238*4882a593Smuzhiyun 239*4882a593Smuzhiyun #define NVSP_INVALID_PROTOCOL_VERSION ((u32)0xFFFFFFFF) 240*4882a593Smuzhiyun 241*4882a593Smuzhiyun #define NVSP_PROTOCOL_VERSION_1 2 242*4882a593Smuzhiyun #define NVSP_PROTOCOL_VERSION_2 0x30002 243*4882a593Smuzhiyun #define NVSP_PROTOCOL_VERSION_4 0x40000 244*4882a593Smuzhiyun #define NVSP_PROTOCOL_VERSION_5 0x50000 245*4882a593Smuzhiyun #define NVSP_PROTOCOL_VERSION_6 0x60000 246*4882a593Smuzhiyun #define NVSP_PROTOCOL_VERSION_61 0x60001 247*4882a593Smuzhiyun 248*4882a593Smuzhiyun enum { 249*4882a593Smuzhiyun NVSP_MSG_TYPE_NONE = 0, 250*4882a593Smuzhiyun 251*4882a593Smuzhiyun /* Init Messages */ 252*4882a593Smuzhiyun NVSP_MSG_TYPE_INIT = 1, 253*4882a593Smuzhiyun NVSP_MSG_TYPE_INIT_COMPLETE = 2, 254*4882a593Smuzhiyun 255*4882a593Smuzhiyun NVSP_VERSION_MSG_START = 100, 256*4882a593Smuzhiyun 257*4882a593Smuzhiyun /* Version 1 Messages */ 258*4882a593Smuzhiyun NVSP_MSG1_TYPE_SEND_NDIS_VER = NVSP_VERSION_MSG_START, 259*4882a593Smuzhiyun 260*4882a593Smuzhiyun NVSP_MSG1_TYPE_SEND_RECV_BUF, 261*4882a593Smuzhiyun NVSP_MSG1_TYPE_SEND_RECV_BUF_COMPLETE, 262*4882a593Smuzhiyun NVSP_MSG1_TYPE_REVOKE_RECV_BUF, 263*4882a593Smuzhiyun 264*4882a593Smuzhiyun NVSP_MSG1_TYPE_SEND_SEND_BUF, 265*4882a593Smuzhiyun NVSP_MSG1_TYPE_SEND_SEND_BUF_COMPLETE, 266*4882a593Smuzhiyun NVSP_MSG1_TYPE_REVOKE_SEND_BUF, 267*4882a593Smuzhiyun 268*4882a593Smuzhiyun NVSP_MSG1_TYPE_SEND_RNDIS_PKT, 269*4882a593Smuzhiyun NVSP_MSG1_TYPE_SEND_RNDIS_PKT_COMPLETE, 270*4882a593Smuzhiyun 271*4882a593Smuzhiyun /* Version 2 messages */ 272*4882a593Smuzhiyun NVSP_MSG2_TYPE_SEND_CHIMNEY_DELEGATED_BUF, 273*4882a593Smuzhiyun NVSP_MSG2_TYPE_SEND_CHIMNEY_DELEGATED_BUF_COMP, 274*4882a593Smuzhiyun NVSP_MSG2_TYPE_REVOKE_CHIMNEY_DELEGATED_BUF, 275*4882a593Smuzhiyun 276*4882a593Smuzhiyun NVSP_MSG2_TYPE_RESUME_CHIMNEY_RX_INDICATION, 277*4882a593Smuzhiyun 278*4882a593Smuzhiyun NVSP_MSG2_TYPE_TERMINATE_CHIMNEY, 279*4882a593Smuzhiyun NVSP_MSG2_TYPE_TERMINATE_CHIMNEY_COMP, 280*4882a593Smuzhiyun 281*4882a593Smuzhiyun NVSP_MSG2_TYPE_INDICATE_CHIMNEY_EVENT, 282*4882a593Smuzhiyun 283*4882a593Smuzhiyun NVSP_MSG2_TYPE_SEND_CHIMNEY_PKT, 284*4882a593Smuzhiyun NVSP_MSG2_TYPE_SEND_CHIMNEY_PKT_COMP, 285*4882a593Smuzhiyun 286*4882a593Smuzhiyun NVSP_MSG2_TYPE_POST_CHIMNEY_RECV_REQ, 287*4882a593Smuzhiyun NVSP_MSG2_TYPE_POST_CHIMNEY_RECV_REQ_COMP, 288*4882a593Smuzhiyun 289*4882a593Smuzhiyun NVSP_MSG2_TYPE_ALLOC_RXBUF, 290*4882a593Smuzhiyun NVSP_MSG2_TYPE_ALLOC_RXBUF_COMP, 291*4882a593Smuzhiyun 292*4882a593Smuzhiyun NVSP_MSG2_TYPE_FREE_RXBUF, 293*4882a593Smuzhiyun 294*4882a593Smuzhiyun NVSP_MSG2_TYPE_SEND_VMQ_RNDIS_PKT, 295*4882a593Smuzhiyun NVSP_MSG2_TYPE_SEND_VMQ_RNDIS_PKT_COMP, 296*4882a593Smuzhiyun 297*4882a593Smuzhiyun NVSP_MSG2_TYPE_SEND_NDIS_CONFIG, 298*4882a593Smuzhiyun 299*4882a593Smuzhiyun NVSP_MSG2_TYPE_ALLOC_CHIMNEY_HANDLE, 300*4882a593Smuzhiyun NVSP_MSG2_TYPE_ALLOC_CHIMNEY_HANDLE_COMP, 301*4882a593Smuzhiyun 302*4882a593Smuzhiyun NVSP_MSG2_MAX = NVSP_MSG2_TYPE_ALLOC_CHIMNEY_HANDLE_COMP, 303*4882a593Smuzhiyun 304*4882a593Smuzhiyun /* Version 4 messages */ 305*4882a593Smuzhiyun NVSP_MSG4_TYPE_SEND_VF_ASSOCIATION, 306*4882a593Smuzhiyun NVSP_MSG4_TYPE_SWITCH_DATA_PATH, 307*4882a593Smuzhiyun NVSP_MSG4_TYPE_UPLINK_CONNECT_STATE_DEPRECATED, 308*4882a593Smuzhiyun 309*4882a593Smuzhiyun NVSP_MSG4_MAX = NVSP_MSG4_TYPE_UPLINK_CONNECT_STATE_DEPRECATED, 310*4882a593Smuzhiyun 311*4882a593Smuzhiyun /* Version 5 messages */ 312*4882a593Smuzhiyun NVSP_MSG5_TYPE_OID_QUERY_EX, 313*4882a593Smuzhiyun NVSP_MSG5_TYPE_OID_QUERY_EX_COMP, 314*4882a593Smuzhiyun NVSP_MSG5_TYPE_SUBCHANNEL, 315*4882a593Smuzhiyun NVSP_MSG5_TYPE_SEND_INDIRECTION_TABLE, 316*4882a593Smuzhiyun 317*4882a593Smuzhiyun NVSP_MSG5_MAX = NVSP_MSG5_TYPE_SEND_INDIRECTION_TABLE, 318*4882a593Smuzhiyun 319*4882a593Smuzhiyun /* Version 6 messages */ 320*4882a593Smuzhiyun NVSP_MSG6_TYPE_PD_API, 321*4882a593Smuzhiyun NVSP_MSG6_TYPE_PD_POST_BATCH, 322*4882a593Smuzhiyun 323*4882a593Smuzhiyun NVSP_MSG6_MAX = NVSP_MSG6_TYPE_PD_POST_BATCH 324*4882a593Smuzhiyun }; 325*4882a593Smuzhiyun 326*4882a593Smuzhiyun enum { 327*4882a593Smuzhiyun NVSP_STAT_NONE = 0, 328*4882a593Smuzhiyun NVSP_STAT_SUCCESS, 329*4882a593Smuzhiyun NVSP_STAT_FAIL, 330*4882a593Smuzhiyun NVSP_STAT_PROTOCOL_TOO_NEW, 331*4882a593Smuzhiyun NVSP_STAT_PROTOCOL_TOO_OLD, 332*4882a593Smuzhiyun NVSP_STAT_INVALID_RNDIS_PKT, 333*4882a593Smuzhiyun NVSP_STAT_BUSY, 334*4882a593Smuzhiyun NVSP_STAT_PROTOCOL_UNSUPPORTED, 335*4882a593Smuzhiyun NVSP_STAT_MAX, 336*4882a593Smuzhiyun }; 337*4882a593Smuzhiyun 338*4882a593Smuzhiyun struct nvsp_message_header { 339*4882a593Smuzhiyun u32 msg_type; 340*4882a593Smuzhiyun }; 341*4882a593Smuzhiyun 342*4882a593Smuzhiyun /* Init Messages */ 343*4882a593Smuzhiyun 344*4882a593Smuzhiyun /* 345*4882a593Smuzhiyun * This message is used by the VSC to initialize the channel after the channels 346*4882a593Smuzhiyun * has been opened. This message should never include anything other then 347*4882a593Smuzhiyun * versioning (i.e. this message will be the same for ever). 348*4882a593Smuzhiyun */ 349*4882a593Smuzhiyun struct nvsp_message_init { 350*4882a593Smuzhiyun u32 min_protocol_ver; 351*4882a593Smuzhiyun u32 max_protocol_ver; 352*4882a593Smuzhiyun } __packed; 353*4882a593Smuzhiyun 354*4882a593Smuzhiyun /* 355*4882a593Smuzhiyun * This message is used by the VSP to complete the initialization of the 356*4882a593Smuzhiyun * channel. This message should never include anything other then versioning 357*4882a593Smuzhiyun * (i.e. this message will be the same for ever). 358*4882a593Smuzhiyun */ 359*4882a593Smuzhiyun struct nvsp_message_init_complete { 360*4882a593Smuzhiyun u32 negotiated_protocol_ver; 361*4882a593Smuzhiyun u32 max_mdl_chain_len; 362*4882a593Smuzhiyun u32 status; 363*4882a593Smuzhiyun } __packed; 364*4882a593Smuzhiyun 365*4882a593Smuzhiyun union nvsp_message_init_uber { 366*4882a593Smuzhiyun struct nvsp_message_init init; 367*4882a593Smuzhiyun struct nvsp_message_init_complete init_complete; 368*4882a593Smuzhiyun } __packed; 369*4882a593Smuzhiyun 370*4882a593Smuzhiyun /* Version 1 Messages */ 371*4882a593Smuzhiyun 372*4882a593Smuzhiyun /* 373*4882a593Smuzhiyun * This message is used by the VSC to send the NDIS version to the VSP. The VSP 374*4882a593Smuzhiyun * can use this information when handling OIDs sent by the VSC. 375*4882a593Smuzhiyun */ 376*4882a593Smuzhiyun struct nvsp_1_message_send_ndis_version { 377*4882a593Smuzhiyun u32 ndis_major_ver; 378*4882a593Smuzhiyun u32 ndis_minor_ver; 379*4882a593Smuzhiyun } __packed; 380*4882a593Smuzhiyun 381*4882a593Smuzhiyun /* 382*4882a593Smuzhiyun * This message is used by the VSC to send a receive buffer to the VSP. The VSP 383*4882a593Smuzhiyun * can then use the receive buffer to send data to the VSC. 384*4882a593Smuzhiyun */ 385*4882a593Smuzhiyun struct nvsp_1_message_send_receive_buffer { 386*4882a593Smuzhiyun u32 gpadl_handle; 387*4882a593Smuzhiyun u16 id; 388*4882a593Smuzhiyun } __packed; 389*4882a593Smuzhiyun 390*4882a593Smuzhiyun struct nvsp_1_receive_buffer_section { 391*4882a593Smuzhiyun u32 offset; 392*4882a593Smuzhiyun u32 sub_alloc_size; 393*4882a593Smuzhiyun u32 num_sub_allocs; 394*4882a593Smuzhiyun u32 end_offset; 395*4882a593Smuzhiyun } __packed; 396*4882a593Smuzhiyun 397*4882a593Smuzhiyun /* 398*4882a593Smuzhiyun * This message is used by the VSP to acknowledge a receive buffer send by the 399*4882a593Smuzhiyun * VSC. This message must be sent by the VSP before the VSP uses the receive 400*4882a593Smuzhiyun * buffer. 401*4882a593Smuzhiyun */ 402*4882a593Smuzhiyun struct nvsp_1_message_send_receive_buffer_complete { 403*4882a593Smuzhiyun u32 status; 404*4882a593Smuzhiyun u32 num_sections; 405*4882a593Smuzhiyun 406*4882a593Smuzhiyun /* 407*4882a593Smuzhiyun * The receive buffer is split into two parts, a large suballocation 408*4882a593Smuzhiyun * section and a small suballocation section. These sections are then 409*4882a593Smuzhiyun * suballocated by a certain size. 410*4882a593Smuzhiyun */ 411*4882a593Smuzhiyun 412*4882a593Smuzhiyun /* 413*4882a593Smuzhiyun * For example, the following break up of the receive buffer has 6 414*4882a593Smuzhiyun * large suballocations and 10 small suballocations. 415*4882a593Smuzhiyun */ 416*4882a593Smuzhiyun 417*4882a593Smuzhiyun /* 418*4882a593Smuzhiyun * | Large Section | | Small Section | 419*4882a593Smuzhiyun * ------------------------------------------------------------ 420*4882a593Smuzhiyun * | | | | | | | | | | | | | | | | | | 421*4882a593Smuzhiyun * | | 422*4882a593Smuzhiyun * LargeOffset SmallOffset 423*4882a593Smuzhiyun */ 424*4882a593Smuzhiyun 425*4882a593Smuzhiyun struct nvsp_1_receive_buffer_section sections[1]; 426*4882a593Smuzhiyun } __packed; 427*4882a593Smuzhiyun 428*4882a593Smuzhiyun /* 429*4882a593Smuzhiyun * This message is sent by the VSC to revoke the receive buffer. After the VSP 430*4882a593Smuzhiyun * completes this transaction, the vsp should never use the receive buffer 431*4882a593Smuzhiyun * again. 432*4882a593Smuzhiyun */ 433*4882a593Smuzhiyun struct nvsp_1_message_revoke_receive_buffer { 434*4882a593Smuzhiyun u16 id; 435*4882a593Smuzhiyun }; 436*4882a593Smuzhiyun 437*4882a593Smuzhiyun /* 438*4882a593Smuzhiyun * This message is used by the VSC to send a send buffer to the VSP. The VSC 439*4882a593Smuzhiyun * can then use the send buffer to send data to the VSP. 440*4882a593Smuzhiyun */ 441*4882a593Smuzhiyun struct nvsp_1_message_send_send_buffer { 442*4882a593Smuzhiyun u32 gpadl_handle; 443*4882a593Smuzhiyun u16 id; 444*4882a593Smuzhiyun } __packed; 445*4882a593Smuzhiyun 446*4882a593Smuzhiyun /* 447*4882a593Smuzhiyun * This message is used by the VSP to acknowledge a send buffer sent by the 448*4882a593Smuzhiyun * VSC. This message must be sent by the VSP before the VSP uses the sent 449*4882a593Smuzhiyun * buffer. 450*4882a593Smuzhiyun */ 451*4882a593Smuzhiyun struct nvsp_1_message_send_send_buffer_complete { 452*4882a593Smuzhiyun u32 status; 453*4882a593Smuzhiyun 454*4882a593Smuzhiyun /* 455*4882a593Smuzhiyun * The VSC gets to choose the size of the send buffer and the VSP gets 456*4882a593Smuzhiyun * to choose the sections size of the buffer. This was done to enable 457*4882a593Smuzhiyun * dynamic reconfigurations when the cost of GPA-direct buffers 458*4882a593Smuzhiyun * decreases. 459*4882a593Smuzhiyun */ 460*4882a593Smuzhiyun u32 section_size; 461*4882a593Smuzhiyun } __packed; 462*4882a593Smuzhiyun 463*4882a593Smuzhiyun /* 464*4882a593Smuzhiyun * This message is sent by the VSC to revoke the send buffer. After the VSP 465*4882a593Smuzhiyun * completes this transaction, the vsp should never use the send buffer again. 466*4882a593Smuzhiyun */ 467*4882a593Smuzhiyun struct nvsp_1_message_revoke_send_buffer { 468*4882a593Smuzhiyun u16 id; 469*4882a593Smuzhiyun }; 470*4882a593Smuzhiyun 471*4882a593Smuzhiyun /* 472*4882a593Smuzhiyun * This message is used by both the VSP and the VSC to send a RNDIS message to 473*4882a593Smuzhiyun * the opposite channel endpoint. 474*4882a593Smuzhiyun */ 475*4882a593Smuzhiyun struct nvsp_1_message_send_rndis_packet { 476*4882a593Smuzhiyun /* 477*4882a593Smuzhiyun * This field is specified by RNDIS. They assume there's two different 478*4882a593Smuzhiyun * channels of communication. However, the Network VSP only has one. 479*4882a593Smuzhiyun * Therefore, the channel travels with the RNDIS packet. 480*4882a593Smuzhiyun */ 481*4882a593Smuzhiyun u32 channel_type; 482*4882a593Smuzhiyun 483*4882a593Smuzhiyun /* 484*4882a593Smuzhiyun * This field is used to send part or all of the data through a send 485*4882a593Smuzhiyun * buffer. This values specifies an index into the send buffer. If the 486*4882a593Smuzhiyun * index is 0xFFFFFFFF, then the send buffer is not being used and all 487*4882a593Smuzhiyun * of the data was sent through other VMBus mechanisms. 488*4882a593Smuzhiyun */ 489*4882a593Smuzhiyun u32 send_buf_section_index; 490*4882a593Smuzhiyun u32 send_buf_section_size; 491*4882a593Smuzhiyun } __packed; 492*4882a593Smuzhiyun 493*4882a593Smuzhiyun /* 494*4882a593Smuzhiyun * This message is used by both the VSP and the VSC to complete a RNDIS message 495*4882a593Smuzhiyun * to the opposite channel endpoint. At this point, the initiator of this 496*4882a593Smuzhiyun * message cannot use any resources associated with the original RNDIS packet. 497*4882a593Smuzhiyun */ 498*4882a593Smuzhiyun struct nvsp_1_message_send_rndis_packet_complete { 499*4882a593Smuzhiyun u32 status; 500*4882a593Smuzhiyun }; 501*4882a593Smuzhiyun 502*4882a593Smuzhiyun union nvsp_1_message_uber { 503*4882a593Smuzhiyun struct nvsp_1_message_send_ndis_version send_ndis_ver; 504*4882a593Smuzhiyun 505*4882a593Smuzhiyun struct nvsp_1_message_send_receive_buffer send_recv_buf; 506*4882a593Smuzhiyun struct nvsp_1_message_send_receive_buffer_complete 507*4882a593Smuzhiyun send_recv_buf_complete; 508*4882a593Smuzhiyun struct nvsp_1_message_revoke_receive_buffer revoke_recv_buf; 509*4882a593Smuzhiyun 510*4882a593Smuzhiyun struct nvsp_1_message_send_send_buffer send_send_buf; 511*4882a593Smuzhiyun struct nvsp_1_message_send_send_buffer_complete send_send_buf_complete; 512*4882a593Smuzhiyun struct nvsp_1_message_revoke_send_buffer revoke_send_buf; 513*4882a593Smuzhiyun 514*4882a593Smuzhiyun struct nvsp_1_message_send_rndis_packet send_rndis_pkt; 515*4882a593Smuzhiyun struct nvsp_1_message_send_rndis_packet_complete 516*4882a593Smuzhiyun send_rndis_pkt_complete; 517*4882a593Smuzhiyun } __packed; 518*4882a593Smuzhiyun 519*4882a593Smuzhiyun 520*4882a593Smuzhiyun /* 521*4882a593Smuzhiyun * Network VSP protocol version 2 messages: 522*4882a593Smuzhiyun */ 523*4882a593Smuzhiyun struct nvsp_2_vsc_capability { 524*4882a593Smuzhiyun union { 525*4882a593Smuzhiyun u64 data; 526*4882a593Smuzhiyun struct { 527*4882a593Smuzhiyun u64 vmq:1; 528*4882a593Smuzhiyun u64 chimney:1; 529*4882a593Smuzhiyun u64 sriov:1; 530*4882a593Smuzhiyun u64 ieee8021q:1; 531*4882a593Smuzhiyun u64 correlation_id:1; 532*4882a593Smuzhiyun u64 teaming:1; 533*4882a593Smuzhiyun u64 vsubnetid:1; 534*4882a593Smuzhiyun u64 rsc:1; 535*4882a593Smuzhiyun }; 536*4882a593Smuzhiyun }; 537*4882a593Smuzhiyun } __packed; 538*4882a593Smuzhiyun 539*4882a593Smuzhiyun struct nvsp_2_send_ndis_config { 540*4882a593Smuzhiyun u32 mtu; 541*4882a593Smuzhiyun u32 reserved; 542*4882a593Smuzhiyun struct nvsp_2_vsc_capability capability; 543*4882a593Smuzhiyun } __packed; 544*4882a593Smuzhiyun 545*4882a593Smuzhiyun /* Allocate receive buffer */ 546*4882a593Smuzhiyun struct nvsp_2_alloc_rxbuf { 547*4882a593Smuzhiyun /* Allocation ID to match the allocation request and response */ 548*4882a593Smuzhiyun u32 alloc_id; 549*4882a593Smuzhiyun 550*4882a593Smuzhiyun /* Length of the VM shared memory receive buffer that needs to 551*4882a593Smuzhiyun * be allocated 552*4882a593Smuzhiyun */ 553*4882a593Smuzhiyun u32 len; 554*4882a593Smuzhiyun } __packed; 555*4882a593Smuzhiyun 556*4882a593Smuzhiyun /* Allocate receive buffer complete */ 557*4882a593Smuzhiyun struct nvsp_2_alloc_rxbuf_comp { 558*4882a593Smuzhiyun /* The NDIS_STATUS code for buffer allocation */ 559*4882a593Smuzhiyun u32 status; 560*4882a593Smuzhiyun 561*4882a593Smuzhiyun u32 alloc_id; 562*4882a593Smuzhiyun 563*4882a593Smuzhiyun /* GPADL handle for the allocated receive buffer */ 564*4882a593Smuzhiyun u32 gpadl_handle; 565*4882a593Smuzhiyun 566*4882a593Smuzhiyun /* Receive buffer ID */ 567*4882a593Smuzhiyun u64 recv_buf_id; 568*4882a593Smuzhiyun } __packed; 569*4882a593Smuzhiyun 570*4882a593Smuzhiyun struct nvsp_2_free_rxbuf { 571*4882a593Smuzhiyun u64 recv_buf_id; 572*4882a593Smuzhiyun } __packed; 573*4882a593Smuzhiyun 574*4882a593Smuzhiyun union nvsp_2_message_uber { 575*4882a593Smuzhiyun struct nvsp_2_send_ndis_config send_ndis_config; 576*4882a593Smuzhiyun struct nvsp_2_alloc_rxbuf alloc_rxbuf; 577*4882a593Smuzhiyun struct nvsp_2_alloc_rxbuf_comp alloc_rxbuf_comp; 578*4882a593Smuzhiyun struct nvsp_2_free_rxbuf free_rxbuf; 579*4882a593Smuzhiyun } __packed; 580*4882a593Smuzhiyun 581*4882a593Smuzhiyun struct nvsp_4_send_vf_association { 582*4882a593Smuzhiyun /* 1: allocated, serial number is valid. 0: not allocated */ 583*4882a593Smuzhiyun u32 allocated; 584*4882a593Smuzhiyun 585*4882a593Smuzhiyun /* Serial number of the VF to team with */ 586*4882a593Smuzhiyun u32 serial; 587*4882a593Smuzhiyun } __packed; 588*4882a593Smuzhiyun 589*4882a593Smuzhiyun enum nvsp_vm_datapath { 590*4882a593Smuzhiyun NVSP_DATAPATH_SYNTHETIC = 0, 591*4882a593Smuzhiyun NVSP_DATAPATH_VF, 592*4882a593Smuzhiyun NVSP_DATAPATH_MAX 593*4882a593Smuzhiyun }; 594*4882a593Smuzhiyun 595*4882a593Smuzhiyun struct nvsp_4_sw_datapath { 596*4882a593Smuzhiyun u32 active_datapath; /* active data path in VM */ 597*4882a593Smuzhiyun } __packed; 598*4882a593Smuzhiyun 599*4882a593Smuzhiyun union nvsp_4_message_uber { 600*4882a593Smuzhiyun struct nvsp_4_send_vf_association vf_assoc; 601*4882a593Smuzhiyun struct nvsp_4_sw_datapath active_dp; 602*4882a593Smuzhiyun } __packed; 603*4882a593Smuzhiyun 604*4882a593Smuzhiyun enum nvsp_subchannel_operation { 605*4882a593Smuzhiyun NVSP_SUBCHANNEL_NONE = 0, 606*4882a593Smuzhiyun NVSP_SUBCHANNEL_ALLOCATE, 607*4882a593Smuzhiyun NVSP_SUBCHANNEL_MAX 608*4882a593Smuzhiyun }; 609*4882a593Smuzhiyun 610*4882a593Smuzhiyun struct nvsp_5_subchannel_request { 611*4882a593Smuzhiyun u32 op; 612*4882a593Smuzhiyun u32 num_subchannels; 613*4882a593Smuzhiyun } __packed; 614*4882a593Smuzhiyun 615*4882a593Smuzhiyun struct nvsp_5_subchannel_complete { 616*4882a593Smuzhiyun u32 status; 617*4882a593Smuzhiyun u32 num_subchannels; /* Actual number of subchannels allocated */ 618*4882a593Smuzhiyun } __packed; 619*4882a593Smuzhiyun 620*4882a593Smuzhiyun struct nvsp_5_send_indirect_table { 621*4882a593Smuzhiyun /* The number of entries in the send indirection table */ 622*4882a593Smuzhiyun u32 count; 623*4882a593Smuzhiyun 624*4882a593Smuzhiyun /* The offset of the send indirection table from the beginning of 625*4882a593Smuzhiyun * struct nvsp_message. 626*4882a593Smuzhiyun * The send indirection table tells which channel to put the send 627*4882a593Smuzhiyun * traffic on. Each entry is a channel number. 628*4882a593Smuzhiyun */ 629*4882a593Smuzhiyun u32 offset; 630*4882a593Smuzhiyun } __packed; 631*4882a593Smuzhiyun 632*4882a593Smuzhiyun union nvsp_5_message_uber { 633*4882a593Smuzhiyun struct nvsp_5_subchannel_request subchn_req; 634*4882a593Smuzhiyun struct nvsp_5_subchannel_complete subchn_comp; 635*4882a593Smuzhiyun struct nvsp_5_send_indirect_table send_table; 636*4882a593Smuzhiyun } __packed; 637*4882a593Smuzhiyun 638*4882a593Smuzhiyun enum nvsp_6_pd_api_op { 639*4882a593Smuzhiyun PD_API_OP_CONFIG = 1, 640*4882a593Smuzhiyun PD_API_OP_SW_DATAPATH, /* Switch Datapath */ 641*4882a593Smuzhiyun PD_API_OP_OPEN_PROVIDER, 642*4882a593Smuzhiyun PD_API_OP_CLOSE_PROVIDER, 643*4882a593Smuzhiyun PD_API_OP_CREATE_QUEUE, 644*4882a593Smuzhiyun PD_API_OP_FLUSH_QUEUE, 645*4882a593Smuzhiyun PD_API_OP_FREE_QUEUE, 646*4882a593Smuzhiyun PD_API_OP_ALLOC_COM_BUF, /* Allocate Common Buffer */ 647*4882a593Smuzhiyun PD_API_OP_FREE_COM_BUF, /* Free Common Buffer */ 648*4882a593Smuzhiyun PD_API_OP_MAX 649*4882a593Smuzhiyun }; 650*4882a593Smuzhiyun 651*4882a593Smuzhiyun struct grp_affinity { 652*4882a593Smuzhiyun u64 mask; 653*4882a593Smuzhiyun u16 grp; 654*4882a593Smuzhiyun u16 reserved[3]; 655*4882a593Smuzhiyun } __packed; 656*4882a593Smuzhiyun 657*4882a593Smuzhiyun struct nvsp_6_pd_api_req { 658*4882a593Smuzhiyun u32 op; 659*4882a593Smuzhiyun 660*4882a593Smuzhiyun union { 661*4882a593Smuzhiyun /* MMIO information is sent from the VM to VSP */ 662*4882a593Smuzhiyun struct __packed { 663*4882a593Smuzhiyun u64 mmio_pa; /* MMIO Physical Address */ 664*4882a593Smuzhiyun u32 mmio_len; 665*4882a593Smuzhiyun 666*4882a593Smuzhiyun /* Number of PD queues a VM can support */ 667*4882a593Smuzhiyun u16 num_subchn; 668*4882a593Smuzhiyun } config; 669*4882a593Smuzhiyun 670*4882a593Smuzhiyun /* Switch Datapath */ 671*4882a593Smuzhiyun struct __packed { 672*4882a593Smuzhiyun /* Host Datapath Is PacketDirect */ 673*4882a593Smuzhiyun u8 host_dpath_is_pd; 674*4882a593Smuzhiyun 675*4882a593Smuzhiyun /* Guest PacketDirect Is Enabled */ 676*4882a593Smuzhiyun u8 guest_pd_enabled; 677*4882a593Smuzhiyun } sw_dpath; 678*4882a593Smuzhiyun 679*4882a593Smuzhiyun /* Open Provider*/ 680*4882a593Smuzhiyun struct __packed { 681*4882a593Smuzhiyun u32 prov_id; /* Provider id */ 682*4882a593Smuzhiyun u32 flag; 683*4882a593Smuzhiyun } open_prov; 684*4882a593Smuzhiyun 685*4882a593Smuzhiyun /* Close Provider */ 686*4882a593Smuzhiyun struct __packed { 687*4882a593Smuzhiyun u32 prov_id; 688*4882a593Smuzhiyun } cls_prov; 689*4882a593Smuzhiyun 690*4882a593Smuzhiyun /* Create Queue*/ 691*4882a593Smuzhiyun struct __packed { 692*4882a593Smuzhiyun u32 prov_id; 693*4882a593Smuzhiyun u16 q_id; 694*4882a593Smuzhiyun u16 q_size; 695*4882a593Smuzhiyun u8 is_recv_q; 696*4882a593Smuzhiyun u8 is_rss_q; 697*4882a593Smuzhiyun u32 recv_data_len; 698*4882a593Smuzhiyun struct grp_affinity affy; 699*4882a593Smuzhiyun } cr_q; 700*4882a593Smuzhiyun 701*4882a593Smuzhiyun /* Delete Queue*/ 702*4882a593Smuzhiyun struct __packed { 703*4882a593Smuzhiyun u32 prov_id; 704*4882a593Smuzhiyun u16 q_id; 705*4882a593Smuzhiyun } del_q; 706*4882a593Smuzhiyun 707*4882a593Smuzhiyun /* Flush Queue */ 708*4882a593Smuzhiyun struct __packed { 709*4882a593Smuzhiyun u32 prov_id; 710*4882a593Smuzhiyun u16 q_id; 711*4882a593Smuzhiyun } flush_q; 712*4882a593Smuzhiyun 713*4882a593Smuzhiyun /* Allocate Common Buffer */ 714*4882a593Smuzhiyun struct __packed { 715*4882a593Smuzhiyun u32 len; 716*4882a593Smuzhiyun u32 pf_node; /* Preferred Node */ 717*4882a593Smuzhiyun u16 region_id; 718*4882a593Smuzhiyun } alloc_com_buf; 719*4882a593Smuzhiyun 720*4882a593Smuzhiyun /* Free Common Buffer */ 721*4882a593Smuzhiyun struct __packed { 722*4882a593Smuzhiyun u32 len; 723*4882a593Smuzhiyun u64 pa; /* Physical Address */ 724*4882a593Smuzhiyun u32 pf_node; /* Preferred Node */ 725*4882a593Smuzhiyun u16 region_id; 726*4882a593Smuzhiyun u8 cache_type; 727*4882a593Smuzhiyun } free_com_buf; 728*4882a593Smuzhiyun } __packed; 729*4882a593Smuzhiyun } __packed; 730*4882a593Smuzhiyun 731*4882a593Smuzhiyun struct nvsp_6_pd_api_comp { 732*4882a593Smuzhiyun u32 op; 733*4882a593Smuzhiyun u32 status; 734*4882a593Smuzhiyun 735*4882a593Smuzhiyun union { 736*4882a593Smuzhiyun struct __packed { 737*4882a593Smuzhiyun /* actual number of PD queues allocated to the VM */ 738*4882a593Smuzhiyun u16 num_pd_q; 739*4882a593Smuzhiyun 740*4882a593Smuzhiyun /* Num Receive Rss PD Queues */ 741*4882a593Smuzhiyun u8 num_rss_q; 742*4882a593Smuzhiyun 743*4882a593Smuzhiyun u8 is_supported; /* Is supported by VSP */ 744*4882a593Smuzhiyun u8 is_enabled; /* Is enabled by VSP */ 745*4882a593Smuzhiyun } config; 746*4882a593Smuzhiyun 747*4882a593Smuzhiyun /* Open Provider */ 748*4882a593Smuzhiyun struct __packed { 749*4882a593Smuzhiyun u32 prov_id; 750*4882a593Smuzhiyun } open_prov; 751*4882a593Smuzhiyun 752*4882a593Smuzhiyun /* Create Queue */ 753*4882a593Smuzhiyun struct __packed { 754*4882a593Smuzhiyun u32 prov_id; 755*4882a593Smuzhiyun u16 q_id; 756*4882a593Smuzhiyun u16 q_size; 757*4882a593Smuzhiyun u32 recv_data_len; 758*4882a593Smuzhiyun struct grp_affinity affy; 759*4882a593Smuzhiyun } cr_q; 760*4882a593Smuzhiyun 761*4882a593Smuzhiyun /* Allocate Common Buffer */ 762*4882a593Smuzhiyun struct __packed { 763*4882a593Smuzhiyun u64 pa; /* Physical Address */ 764*4882a593Smuzhiyun u32 len; 765*4882a593Smuzhiyun u32 pf_node; /* Preferred Node */ 766*4882a593Smuzhiyun u16 region_id; 767*4882a593Smuzhiyun u8 cache_type; 768*4882a593Smuzhiyun } alloc_com_buf; 769*4882a593Smuzhiyun } __packed; 770*4882a593Smuzhiyun } __packed; 771*4882a593Smuzhiyun 772*4882a593Smuzhiyun struct nvsp_6_pd_buf { 773*4882a593Smuzhiyun u32 region_offset; 774*4882a593Smuzhiyun u16 region_id; 775*4882a593Smuzhiyun u16 is_partial:1; 776*4882a593Smuzhiyun u16 reserved:15; 777*4882a593Smuzhiyun } __packed; 778*4882a593Smuzhiyun 779*4882a593Smuzhiyun struct nvsp_6_pd_batch_msg { 780*4882a593Smuzhiyun struct nvsp_message_header hdr; 781*4882a593Smuzhiyun u16 count; 782*4882a593Smuzhiyun u16 guest2host:1; 783*4882a593Smuzhiyun u16 is_recv:1; 784*4882a593Smuzhiyun u16 reserved:14; 785*4882a593Smuzhiyun struct nvsp_6_pd_buf pd_buf[0]; 786*4882a593Smuzhiyun } __packed; 787*4882a593Smuzhiyun 788*4882a593Smuzhiyun union nvsp_6_message_uber { 789*4882a593Smuzhiyun struct nvsp_6_pd_api_req pd_req; 790*4882a593Smuzhiyun struct nvsp_6_pd_api_comp pd_comp; 791*4882a593Smuzhiyun } __packed; 792*4882a593Smuzhiyun 793*4882a593Smuzhiyun union nvsp_all_messages { 794*4882a593Smuzhiyun union nvsp_message_init_uber init_msg; 795*4882a593Smuzhiyun union nvsp_1_message_uber v1_msg; 796*4882a593Smuzhiyun union nvsp_2_message_uber v2_msg; 797*4882a593Smuzhiyun union nvsp_4_message_uber v4_msg; 798*4882a593Smuzhiyun union nvsp_5_message_uber v5_msg; 799*4882a593Smuzhiyun union nvsp_6_message_uber v6_msg; 800*4882a593Smuzhiyun } __packed; 801*4882a593Smuzhiyun 802*4882a593Smuzhiyun /* ALL Messages */ 803*4882a593Smuzhiyun struct nvsp_message { 804*4882a593Smuzhiyun struct nvsp_message_header hdr; 805*4882a593Smuzhiyun union nvsp_all_messages msg; 806*4882a593Smuzhiyun } __packed; 807*4882a593Smuzhiyun 808*4882a593Smuzhiyun 809*4882a593Smuzhiyun #define NETVSC_MTU 65535 810*4882a593Smuzhiyun #define NETVSC_MTU_MIN ETH_MIN_MTU 811*4882a593Smuzhiyun 812*4882a593Smuzhiyun /* Max buffer sizes allowed by a host */ 813*4882a593Smuzhiyun #define NETVSC_RECEIVE_BUFFER_SIZE (1024 * 1024 * 31) /* 31MB */ 814*4882a593Smuzhiyun #define NETVSC_RECEIVE_BUFFER_SIZE_LEGACY (1024 * 1024 * 15) /* 15MB */ 815*4882a593Smuzhiyun #define NETVSC_RECEIVE_BUFFER_DEFAULT (1024 * 1024 * 16) 816*4882a593Smuzhiyun 817*4882a593Smuzhiyun #define NETVSC_SEND_BUFFER_SIZE (1024 * 1024 * 15) /* 15MB */ 818*4882a593Smuzhiyun #define NETVSC_SEND_BUFFER_DEFAULT (1024 * 1024) 819*4882a593Smuzhiyun 820*4882a593Smuzhiyun #define NETVSC_INVALID_INDEX -1 821*4882a593Smuzhiyun 822*4882a593Smuzhiyun #define NETVSC_SEND_SECTION_SIZE 6144 823*4882a593Smuzhiyun #define NETVSC_RECV_SECTION_SIZE 1728 824*4882a593Smuzhiyun 825*4882a593Smuzhiyun /* Default size of TX buf: 1MB, RX buf: 16MB */ 826*4882a593Smuzhiyun #define NETVSC_MIN_TX_SECTIONS 10 827*4882a593Smuzhiyun #define NETVSC_DEFAULT_TX (NETVSC_SEND_BUFFER_DEFAULT \ 828*4882a593Smuzhiyun / NETVSC_SEND_SECTION_SIZE) 829*4882a593Smuzhiyun #define NETVSC_MIN_RX_SECTIONS 10 830*4882a593Smuzhiyun #define NETVSC_DEFAULT_RX (NETVSC_RECEIVE_BUFFER_DEFAULT \ 831*4882a593Smuzhiyun / NETVSC_RECV_SECTION_SIZE) 832*4882a593Smuzhiyun 833*4882a593Smuzhiyun #define NETVSC_RECEIVE_BUFFER_ID 0xcafe 834*4882a593Smuzhiyun #define NETVSC_SEND_BUFFER_ID 0 835*4882a593Smuzhiyun 836*4882a593Smuzhiyun #define NETVSC_SUPPORTED_HW_FEATURES (NETIF_F_RXCSUM | NETIF_F_IP_CSUM | \ 837*4882a593Smuzhiyun NETIF_F_TSO | NETIF_F_IPV6_CSUM | \ 838*4882a593Smuzhiyun NETIF_F_TSO6 | NETIF_F_LRO | \ 839*4882a593Smuzhiyun NETIF_F_SG | NETIF_F_RXHASH) 840*4882a593Smuzhiyun 841*4882a593Smuzhiyun #define VRSS_SEND_TAB_SIZE 16 /* must be power of 2 */ 842*4882a593Smuzhiyun #define VRSS_CHANNEL_MAX 64 843*4882a593Smuzhiyun #define VRSS_CHANNEL_DEFAULT 8 844*4882a593Smuzhiyun 845*4882a593Smuzhiyun #define RNDIS_MAX_PKT_DEFAULT 8 846*4882a593Smuzhiyun #define RNDIS_PKT_ALIGN_DEFAULT 8 847*4882a593Smuzhiyun 848*4882a593Smuzhiyun #define NETVSC_XDP_HDRM 256 849*4882a593Smuzhiyun 850*4882a593Smuzhiyun #define NETVSC_XFER_HEADER_SIZE(rng_cnt) \ 851*4882a593Smuzhiyun (offsetof(struct vmtransfer_page_packet_header, ranges) + \ 852*4882a593Smuzhiyun (rng_cnt) * sizeof(struct vmtransfer_page_range)) 853*4882a593Smuzhiyun 854*4882a593Smuzhiyun struct multi_send_data { 855*4882a593Smuzhiyun struct sk_buff *skb; /* skb containing the pkt */ 856*4882a593Smuzhiyun struct hv_netvsc_packet *pkt; /* netvsc pkt pending */ 857*4882a593Smuzhiyun u32 count; /* counter of batched packets */ 858*4882a593Smuzhiyun }; 859*4882a593Smuzhiyun 860*4882a593Smuzhiyun struct recv_comp_data { 861*4882a593Smuzhiyun u64 tid; /* transaction id */ 862*4882a593Smuzhiyun u32 status; 863*4882a593Smuzhiyun }; 864*4882a593Smuzhiyun 865*4882a593Smuzhiyun struct multi_recv_comp { 866*4882a593Smuzhiyun struct recv_comp_data *slots; 867*4882a593Smuzhiyun u32 first; /* first data entry */ 868*4882a593Smuzhiyun u32 next; /* next entry for writing */ 869*4882a593Smuzhiyun }; 870*4882a593Smuzhiyun 871*4882a593Smuzhiyun #define NVSP_RSC_MAX 562 /* Max #RSC frags in a vmbus xfer page pkt */ 872*4882a593Smuzhiyun 873*4882a593Smuzhiyun struct nvsc_rsc { 874*4882a593Smuzhiyun const struct ndis_pkt_8021q_info *vlan; 875*4882a593Smuzhiyun const struct ndis_tcp_ip_checksum_info *csum_info; 876*4882a593Smuzhiyun const u32 *hash_info; 877*4882a593Smuzhiyun u8 is_last; /* last RNDIS msg in a vmtransfer_page */ 878*4882a593Smuzhiyun u32 cnt; /* #fragments in an RSC packet */ 879*4882a593Smuzhiyun u32 pktlen; /* Full packet length */ 880*4882a593Smuzhiyun void *data[NVSP_RSC_MAX]; 881*4882a593Smuzhiyun u32 len[NVSP_RSC_MAX]; 882*4882a593Smuzhiyun }; 883*4882a593Smuzhiyun 884*4882a593Smuzhiyun struct netvsc_stats { 885*4882a593Smuzhiyun u64 packets; 886*4882a593Smuzhiyun u64 bytes; 887*4882a593Smuzhiyun u64 broadcast; 888*4882a593Smuzhiyun u64 multicast; 889*4882a593Smuzhiyun u64 xdp_drop; 890*4882a593Smuzhiyun struct u64_stats_sync syncp; 891*4882a593Smuzhiyun }; 892*4882a593Smuzhiyun 893*4882a593Smuzhiyun struct netvsc_ethtool_stats { 894*4882a593Smuzhiyun unsigned long tx_scattered; 895*4882a593Smuzhiyun unsigned long tx_no_memory; 896*4882a593Smuzhiyun unsigned long tx_no_space; 897*4882a593Smuzhiyun unsigned long tx_too_big; 898*4882a593Smuzhiyun unsigned long tx_busy; 899*4882a593Smuzhiyun unsigned long tx_send_full; 900*4882a593Smuzhiyun unsigned long rx_comp_busy; 901*4882a593Smuzhiyun unsigned long rx_no_memory; 902*4882a593Smuzhiyun unsigned long stop_queue; 903*4882a593Smuzhiyun unsigned long wake_queue; 904*4882a593Smuzhiyun unsigned long vlan_error; 905*4882a593Smuzhiyun }; 906*4882a593Smuzhiyun 907*4882a593Smuzhiyun struct netvsc_ethtool_pcpu_stats { 908*4882a593Smuzhiyun u64 rx_packets; 909*4882a593Smuzhiyun u64 rx_bytes; 910*4882a593Smuzhiyun u64 tx_packets; 911*4882a593Smuzhiyun u64 tx_bytes; 912*4882a593Smuzhiyun u64 vf_rx_packets; 913*4882a593Smuzhiyun u64 vf_rx_bytes; 914*4882a593Smuzhiyun u64 vf_tx_packets; 915*4882a593Smuzhiyun u64 vf_tx_bytes; 916*4882a593Smuzhiyun }; 917*4882a593Smuzhiyun 918*4882a593Smuzhiyun struct netvsc_vf_pcpu_stats { 919*4882a593Smuzhiyun u64 rx_packets; 920*4882a593Smuzhiyun u64 rx_bytes; 921*4882a593Smuzhiyun u64 tx_packets; 922*4882a593Smuzhiyun u64 tx_bytes; 923*4882a593Smuzhiyun struct u64_stats_sync syncp; 924*4882a593Smuzhiyun u32 tx_dropped; 925*4882a593Smuzhiyun }; 926*4882a593Smuzhiyun 927*4882a593Smuzhiyun struct netvsc_reconfig { 928*4882a593Smuzhiyun struct list_head list; 929*4882a593Smuzhiyun u32 event; 930*4882a593Smuzhiyun }; 931*4882a593Smuzhiyun 932*4882a593Smuzhiyun /* L4 hash bits for different protocols */ 933*4882a593Smuzhiyun #define HV_TCP4_L4HASH 1 934*4882a593Smuzhiyun #define HV_TCP6_L4HASH 2 935*4882a593Smuzhiyun #define HV_UDP4_L4HASH 4 936*4882a593Smuzhiyun #define HV_UDP6_L4HASH 8 937*4882a593Smuzhiyun #define HV_DEFAULT_L4HASH (HV_TCP4_L4HASH | HV_TCP6_L4HASH | HV_UDP4_L4HASH | \ 938*4882a593Smuzhiyun HV_UDP6_L4HASH) 939*4882a593Smuzhiyun 940*4882a593Smuzhiyun /* The context of the netvsc device */ 941*4882a593Smuzhiyun struct net_device_context { 942*4882a593Smuzhiyun /* point back to our device context */ 943*4882a593Smuzhiyun struct hv_device *device_ctx; 944*4882a593Smuzhiyun /* netvsc_device */ 945*4882a593Smuzhiyun struct netvsc_device __rcu *nvdev; 946*4882a593Smuzhiyun /* list of netvsc net_devices */ 947*4882a593Smuzhiyun struct list_head list; 948*4882a593Smuzhiyun /* reconfigure work */ 949*4882a593Smuzhiyun struct delayed_work dwork; 950*4882a593Smuzhiyun /* last reconfig time */ 951*4882a593Smuzhiyun unsigned long last_reconfig; 952*4882a593Smuzhiyun /* reconfig events */ 953*4882a593Smuzhiyun struct list_head reconfig_events; 954*4882a593Smuzhiyun /* list protection */ 955*4882a593Smuzhiyun spinlock_t lock; 956*4882a593Smuzhiyun 957*4882a593Smuzhiyun u32 msg_enable; /* debug level */ 958*4882a593Smuzhiyun 959*4882a593Smuzhiyun u32 tx_checksum_mask; 960*4882a593Smuzhiyun 961*4882a593Smuzhiyun u32 tx_table[VRSS_SEND_TAB_SIZE]; 962*4882a593Smuzhiyun 963*4882a593Smuzhiyun u16 rx_table[ITAB_NUM]; 964*4882a593Smuzhiyun 965*4882a593Smuzhiyun /* Ethtool settings */ 966*4882a593Smuzhiyun u8 duplex; 967*4882a593Smuzhiyun u32 speed; 968*4882a593Smuzhiyun u32 l4_hash; /* L4 hash settings */ 969*4882a593Smuzhiyun struct netvsc_ethtool_stats eth_stats; 970*4882a593Smuzhiyun 971*4882a593Smuzhiyun /* State to manage the associated VF interface. */ 972*4882a593Smuzhiyun struct net_device __rcu *vf_netdev; 973*4882a593Smuzhiyun struct netvsc_vf_pcpu_stats __percpu *vf_stats; 974*4882a593Smuzhiyun struct delayed_work vf_takeover; 975*4882a593Smuzhiyun 976*4882a593Smuzhiyun /* 1: allocated, serial number is valid. 0: not allocated */ 977*4882a593Smuzhiyun u32 vf_alloc; 978*4882a593Smuzhiyun /* Serial number of the VF to team with */ 979*4882a593Smuzhiyun u32 vf_serial; 980*4882a593Smuzhiyun /* completion variable to confirm vf association */ 981*4882a593Smuzhiyun struct completion vf_add; 982*4882a593Smuzhiyun /* Is the current data path through the VF NIC? */ 983*4882a593Smuzhiyun bool data_path_is_vf; 984*4882a593Smuzhiyun 985*4882a593Smuzhiyun /* Used to temporarily save the config info across hibernation */ 986*4882a593Smuzhiyun struct netvsc_device_info *saved_netvsc_dev_info; 987*4882a593Smuzhiyun }; 988*4882a593Smuzhiyun 989*4882a593Smuzhiyun /* Per channel data */ 990*4882a593Smuzhiyun struct netvsc_channel { 991*4882a593Smuzhiyun struct vmbus_channel *channel; 992*4882a593Smuzhiyun struct netvsc_device *net_device; 993*4882a593Smuzhiyun const struct vmpacket_descriptor *desc; 994*4882a593Smuzhiyun struct napi_struct napi; 995*4882a593Smuzhiyun struct multi_send_data msd; 996*4882a593Smuzhiyun struct multi_recv_comp mrc; 997*4882a593Smuzhiyun atomic_t queue_sends; 998*4882a593Smuzhiyun struct nvsc_rsc rsc; 999*4882a593Smuzhiyun 1000*4882a593Smuzhiyun struct bpf_prog __rcu *bpf_prog; 1001*4882a593Smuzhiyun struct xdp_rxq_info xdp_rxq; 1002*4882a593Smuzhiyun 1003*4882a593Smuzhiyun struct netvsc_stats tx_stats; 1004*4882a593Smuzhiyun struct netvsc_stats rx_stats; 1005*4882a593Smuzhiyun }; 1006*4882a593Smuzhiyun 1007*4882a593Smuzhiyun /* Per netvsc device */ 1008*4882a593Smuzhiyun struct netvsc_device { 1009*4882a593Smuzhiyun u32 nvsp_version; 1010*4882a593Smuzhiyun 1011*4882a593Smuzhiyun wait_queue_head_t wait_drain; 1012*4882a593Smuzhiyun bool destroy; 1013*4882a593Smuzhiyun bool tx_disable; /* if true, do not wake up queue again */ 1014*4882a593Smuzhiyun 1015*4882a593Smuzhiyun /* Receive buffer allocated by us but manages by NetVSP */ 1016*4882a593Smuzhiyun void *recv_buf; 1017*4882a593Smuzhiyun u32 recv_buf_size; /* allocated bytes */ 1018*4882a593Smuzhiyun u32 recv_buf_gpadl_handle; 1019*4882a593Smuzhiyun u32 recv_section_cnt; 1020*4882a593Smuzhiyun u32 recv_section_size; 1021*4882a593Smuzhiyun u32 recv_completion_cnt; 1022*4882a593Smuzhiyun 1023*4882a593Smuzhiyun /* Send buffer allocated by us */ 1024*4882a593Smuzhiyun void *send_buf; 1025*4882a593Smuzhiyun u32 send_buf_gpadl_handle; 1026*4882a593Smuzhiyun u32 send_section_cnt; 1027*4882a593Smuzhiyun u32 send_section_size; 1028*4882a593Smuzhiyun unsigned long *send_section_map; 1029*4882a593Smuzhiyun 1030*4882a593Smuzhiyun /* Used for NetVSP initialization protocol */ 1031*4882a593Smuzhiyun struct completion channel_init_wait; 1032*4882a593Smuzhiyun struct nvsp_message channel_init_pkt; 1033*4882a593Smuzhiyun 1034*4882a593Smuzhiyun struct nvsp_message revoke_packet; 1035*4882a593Smuzhiyun 1036*4882a593Smuzhiyun u32 max_chn; 1037*4882a593Smuzhiyun u32 num_chn; 1038*4882a593Smuzhiyun 1039*4882a593Smuzhiyun atomic_t open_chn; 1040*4882a593Smuzhiyun struct work_struct subchan_work; 1041*4882a593Smuzhiyun wait_queue_head_t subchan_open; 1042*4882a593Smuzhiyun 1043*4882a593Smuzhiyun struct rndis_device *extension; 1044*4882a593Smuzhiyun 1045*4882a593Smuzhiyun u32 max_pkt; /* max number of pkt in one send, e.g. 8 */ 1046*4882a593Smuzhiyun u32 pkt_align; /* alignment bytes, e.g. 8 */ 1047*4882a593Smuzhiyun 1048*4882a593Smuzhiyun struct netvsc_channel chan_table[VRSS_CHANNEL_MAX]; 1049*4882a593Smuzhiyun 1050*4882a593Smuzhiyun struct rcu_head rcu; 1051*4882a593Smuzhiyun }; 1052*4882a593Smuzhiyun 1053*4882a593Smuzhiyun /* NdisInitialize message */ 1054*4882a593Smuzhiyun struct rndis_initialize_request { 1055*4882a593Smuzhiyun u32 req_id; 1056*4882a593Smuzhiyun u32 major_ver; 1057*4882a593Smuzhiyun u32 minor_ver; 1058*4882a593Smuzhiyun u32 max_xfer_size; 1059*4882a593Smuzhiyun }; 1060*4882a593Smuzhiyun 1061*4882a593Smuzhiyun /* Response to NdisInitialize */ 1062*4882a593Smuzhiyun struct rndis_initialize_complete { 1063*4882a593Smuzhiyun u32 req_id; 1064*4882a593Smuzhiyun u32 status; 1065*4882a593Smuzhiyun u32 major_ver; 1066*4882a593Smuzhiyun u32 minor_ver; 1067*4882a593Smuzhiyun u32 dev_flags; 1068*4882a593Smuzhiyun u32 medium; 1069*4882a593Smuzhiyun u32 max_pkt_per_msg; 1070*4882a593Smuzhiyun u32 max_xfer_size; 1071*4882a593Smuzhiyun u32 pkt_alignment_factor; 1072*4882a593Smuzhiyun u32 af_list_offset; 1073*4882a593Smuzhiyun u32 af_list_size; 1074*4882a593Smuzhiyun }; 1075*4882a593Smuzhiyun 1076*4882a593Smuzhiyun /* Call manager devices only: Information about an address family */ 1077*4882a593Smuzhiyun /* supported by the device is appended to the response to NdisInitialize. */ 1078*4882a593Smuzhiyun struct rndis_co_address_family { 1079*4882a593Smuzhiyun u32 address_family; 1080*4882a593Smuzhiyun u32 major_ver; 1081*4882a593Smuzhiyun u32 minor_ver; 1082*4882a593Smuzhiyun }; 1083*4882a593Smuzhiyun 1084*4882a593Smuzhiyun /* NdisHalt message */ 1085*4882a593Smuzhiyun struct rndis_halt_request { 1086*4882a593Smuzhiyun u32 req_id; 1087*4882a593Smuzhiyun }; 1088*4882a593Smuzhiyun 1089*4882a593Smuzhiyun /* NdisQueryRequest message */ 1090*4882a593Smuzhiyun struct rndis_query_request { 1091*4882a593Smuzhiyun u32 req_id; 1092*4882a593Smuzhiyun u32 oid; 1093*4882a593Smuzhiyun u32 info_buflen; 1094*4882a593Smuzhiyun u32 info_buf_offset; 1095*4882a593Smuzhiyun u32 dev_vc_handle; 1096*4882a593Smuzhiyun }; 1097*4882a593Smuzhiyun 1098*4882a593Smuzhiyun /* Response to NdisQueryRequest */ 1099*4882a593Smuzhiyun struct rndis_query_complete { 1100*4882a593Smuzhiyun u32 req_id; 1101*4882a593Smuzhiyun u32 status; 1102*4882a593Smuzhiyun u32 info_buflen; 1103*4882a593Smuzhiyun u32 info_buf_offset; 1104*4882a593Smuzhiyun }; 1105*4882a593Smuzhiyun 1106*4882a593Smuzhiyun /* NdisSetRequest message */ 1107*4882a593Smuzhiyun struct rndis_set_request { 1108*4882a593Smuzhiyun u32 req_id; 1109*4882a593Smuzhiyun u32 oid; 1110*4882a593Smuzhiyun u32 info_buflen; 1111*4882a593Smuzhiyun u32 info_buf_offset; 1112*4882a593Smuzhiyun u32 dev_vc_handle; 1113*4882a593Smuzhiyun }; 1114*4882a593Smuzhiyun 1115*4882a593Smuzhiyun /* Response to NdisSetRequest */ 1116*4882a593Smuzhiyun struct rndis_set_complete { 1117*4882a593Smuzhiyun u32 req_id; 1118*4882a593Smuzhiyun u32 status; 1119*4882a593Smuzhiyun }; 1120*4882a593Smuzhiyun 1121*4882a593Smuzhiyun /* NdisReset message */ 1122*4882a593Smuzhiyun struct rndis_reset_request { 1123*4882a593Smuzhiyun u32 reserved; 1124*4882a593Smuzhiyun }; 1125*4882a593Smuzhiyun 1126*4882a593Smuzhiyun /* Response to NdisReset */ 1127*4882a593Smuzhiyun struct rndis_reset_complete { 1128*4882a593Smuzhiyun u32 status; 1129*4882a593Smuzhiyun u32 addressing_reset; 1130*4882a593Smuzhiyun }; 1131*4882a593Smuzhiyun 1132*4882a593Smuzhiyun /* NdisMIndicateStatus message */ 1133*4882a593Smuzhiyun struct rndis_indicate_status { 1134*4882a593Smuzhiyun u32 status; 1135*4882a593Smuzhiyun u32 status_buflen; 1136*4882a593Smuzhiyun u32 status_buf_offset; 1137*4882a593Smuzhiyun }; 1138*4882a593Smuzhiyun 1139*4882a593Smuzhiyun /* Diagnostic information passed as the status buffer in */ 1140*4882a593Smuzhiyun /* struct rndis_indicate_status messages signifying error conditions. */ 1141*4882a593Smuzhiyun struct rndis_diagnostic_info { 1142*4882a593Smuzhiyun u32 diag_status; 1143*4882a593Smuzhiyun u32 error_offset; 1144*4882a593Smuzhiyun }; 1145*4882a593Smuzhiyun 1146*4882a593Smuzhiyun /* NdisKeepAlive message */ 1147*4882a593Smuzhiyun struct rndis_keepalive_request { 1148*4882a593Smuzhiyun u32 req_id; 1149*4882a593Smuzhiyun }; 1150*4882a593Smuzhiyun 1151*4882a593Smuzhiyun /* Response to NdisKeepAlive */ 1152*4882a593Smuzhiyun struct rndis_keepalive_complete { 1153*4882a593Smuzhiyun u32 req_id; 1154*4882a593Smuzhiyun u32 status; 1155*4882a593Smuzhiyun }; 1156*4882a593Smuzhiyun 1157*4882a593Smuzhiyun /* 1158*4882a593Smuzhiyun * Data message. All Offset fields contain byte offsets from the beginning of 1159*4882a593Smuzhiyun * struct rndis_packet. All Length fields are in bytes. VcHandle is set 1160*4882a593Smuzhiyun * to 0 for connectionless data, otherwise it contains the VC handle. 1161*4882a593Smuzhiyun */ 1162*4882a593Smuzhiyun struct rndis_packet { 1163*4882a593Smuzhiyun u32 data_offset; 1164*4882a593Smuzhiyun u32 data_len; 1165*4882a593Smuzhiyun u32 oob_data_offset; 1166*4882a593Smuzhiyun u32 oob_data_len; 1167*4882a593Smuzhiyun u32 num_oob_data_elements; 1168*4882a593Smuzhiyun u32 per_pkt_info_offset; 1169*4882a593Smuzhiyun u32 per_pkt_info_len; 1170*4882a593Smuzhiyun u32 vc_handle; 1171*4882a593Smuzhiyun u32 reserved; 1172*4882a593Smuzhiyun }; 1173*4882a593Smuzhiyun 1174*4882a593Smuzhiyun /* Optional Out of Band data associated with a Data message. */ 1175*4882a593Smuzhiyun struct rndis_oobd { 1176*4882a593Smuzhiyun u32 size; 1177*4882a593Smuzhiyun u32 type; 1178*4882a593Smuzhiyun u32 class_info_offset; 1179*4882a593Smuzhiyun }; 1180*4882a593Smuzhiyun 1181*4882a593Smuzhiyun /* Packet extension field contents associated with a Data message. */ 1182*4882a593Smuzhiyun struct rndis_per_packet_info { 1183*4882a593Smuzhiyun u32 size; 1184*4882a593Smuzhiyun u32 type:31; 1185*4882a593Smuzhiyun u32 internal:1; 1186*4882a593Smuzhiyun u32 ppi_offset; 1187*4882a593Smuzhiyun }; 1188*4882a593Smuzhiyun 1189*4882a593Smuzhiyun enum ndis_per_pkt_info_type { 1190*4882a593Smuzhiyun TCPIP_CHKSUM_PKTINFO, 1191*4882a593Smuzhiyun IPSEC_PKTINFO, 1192*4882a593Smuzhiyun TCP_LARGESEND_PKTINFO, 1193*4882a593Smuzhiyun CLASSIFICATION_HANDLE_PKTINFO, 1194*4882a593Smuzhiyun NDIS_RESERVED, 1195*4882a593Smuzhiyun SG_LIST_PKTINFO, 1196*4882a593Smuzhiyun IEEE_8021Q_INFO, 1197*4882a593Smuzhiyun ORIGINAL_PKTINFO, 1198*4882a593Smuzhiyun PACKET_CANCEL_ID, 1199*4882a593Smuzhiyun NBL_HASH_VALUE = PACKET_CANCEL_ID, 1200*4882a593Smuzhiyun ORIGINAL_NET_BUFLIST, 1201*4882a593Smuzhiyun CACHED_NET_BUFLIST, 1202*4882a593Smuzhiyun SHORT_PKT_PADINFO, 1203*4882a593Smuzhiyun MAX_PER_PKT_INFO 1204*4882a593Smuzhiyun }; 1205*4882a593Smuzhiyun 1206*4882a593Smuzhiyun enum rndis_per_pkt_info_interal_type { 1207*4882a593Smuzhiyun RNDIS_PKTINFO_ID = 1, 1208*4882a593Smuzhiyun /* Add more members here */ 1209*4882a593Smuzhiyun 1210*4882a593Smuzhiyun RNDIS_PKTINFO_MAX 1211*4882a593Smuzhiyun }; 1212*4882a593Smuzhiyun 1213*4882a593Smuzhiyun #define RNDIS_PKTINFO_SUBALLOC BIT(0) 1214*4882a593Smuzhiyun #define RNDIS_PKTINFO_1ST_FRAG BIT(1) 1215*4882a593Smuzhiyun #define RNDIS_PKTINFO_LAST_FRAG BIT(2) 1216*4882a593Smuzhiyun 1217*4882a593Smuzhiyun #define RNDIS_PKTINFO_ID_V1 1 1218*4882a593Smuzhiyun 1219*4882a593Smuzhiyun struct rndis_pktinfo_id { 1220*4882a593Smuzhiyun u8 ver; 1221*4882a593Smuzhiyun u8 flag; 1222*4882a593Smuzhiyun u16 pkt_id; 1223*4882a593Smuzhiyun }; 1224*4882a593Smuzhiyun 1225*4882a593Smuzhiyun struct ndis_pkt_8021q_info { 1226*4882a593Smuzhiyun union { 1227*4882a593Smuzhiyun struct { 1228*4882a593Smuzhiyun u32 pri:3; /* User Priority */ 1229*4882a593Smuzhiyun u32 cfi:1; /* Canonical Format ID */ 1230*4882a593Smuzhiyun u32 vlanid:12; /* VLAN ID */ 1231*4882a593Smuzhiyun u32 reserved:16; 1232*4882a593Smuzhiyun }; 1233*4882a593Smuzhiyun u32 value; 1234*4882a593Smuzhiyun }; 1235*4882a593Smuzhiyun }; 1236*4882a593Smuzhiyun 1237*4882a593Smuzhiyun struct ndis_object_header { 1238*4882a593Smuzhiyun u8 type; 1239*4882a593Smuzhiyun u8 revision; 1240*4882a593Smuzhiyun u16 size; 1241*4882a593Smuzhiyun }; 1242*4882a593Smuzhiyun 1243*4882a593Smuzhiyun #define NDIS_OBJECT_TYPE_DEFAULT 0x80 1244*4882a593Smuzhiyun #define NDIS_OFFLOAD_PARAMETERS_REVISION_3 3 1245*4882a593Smuzhiyun #define NDIS_OFFLOAD_PARAMETERS_REVISION_2 2 1246*4882a593Smuzhiyun #define NDIS_OFFLOAD_PARAMETERS_REVISION_1 1 1247*4882a593Smuzhiyun 1248*4882a593Smuzhiyun #define NDIS_OFFLOAD_PARAMETERS_NO_CHANGE 0 1249*4882a593Smuzhiyun #define NDIS_OFFLOAD_PARAMETERS_LSOV2_DISABLED 1 1250*4882a593Smuzhiyun #define NDIS_OFFLOAD_PARAMETERS_LSOV2_ENABLED 2 1251*4882a593Smuzhiyun #define NDIS_OFFLOAD_PARAMETERS_LSOV1_ENABLED 2 1252*4882a593Smuzhiyun #define NDIS_OFFLOAD_PARAMETERS_RSC_DISABLED 1 1253*4882a593Smuzhiyun #define NDIS_OFFLOAD_PARAMETERS_RSC_ENABLED 2 1254*4882a593Smuzhiyun #define NDIS_OFFLOAD_PARAMETERS_TX_RX_DISABLED 1 1255*4882a593Smuzhiyun #define NDIS_OFFLOAD_PARAMETERS_TX_ENABLED_RX_DISABLED 2 1256*4882a593Smuzhiyun #define NDIS_OFFLOAD_PARAMETERS_RX_ENABLED_TX_DISABLED 3 1257*4882a593Smuzhiyun #define NDIS_OFFLOAD_PARAMETERS_TX_RX_ENABLED 4 1258*4882a593Smuzhiyun 1259*4882a593Smuzhiyun #define NDIS_TCP_LARGE_SEND_OFFLOAD_V2_TYPE 1 1260*4882a593Smuzhiyun #define NDIS_TCP_LARGE_SEND_OFFLOAD_IPV4 0 1261*4882a593Smuzhiyun #define NDIS_TCP_LARGE_SEND_OFFLOAD_IPV6 1 1262*4882a593Smuzhiyun 1263*4882a593Smuzhiyun #define VERSION_4_OFFLOAD_SIZE 22 1264*4882a593Smuzhiyun /* 1265*4882a593Smuzhiyun * New offload OIDs for NDIS 6 1266*4882a593Smuzhiyun */ 1267*4882a593Smuzhiyun #define OID_TCP_OFFLOAD_CURRENT_CONFIG 0xFC01020B /* query only */ 1268*4882a593Smuzhiyun #define OID_TCP_OFFLOAD_PARAMETERS 0xFC01020C /* set only */ 1269*4882a593Smuzhiyun #define OID_TCP_OFFLOAD_HARDWARE_CAPABILITIES 0xFC01020D/* query only */ 1270*4882a593Smuzhiyun #define OID_TCP_CONNECTION_OFFLOAD_CURRENT_CONFIG 0xFC01020E /* query only */ 1271*4882a593Smuzhiyun #define OID_TCP_CONNECTION_OFFLOAD_HARDWARE_CAPABILITIES 0xFC01020F /* query */ 1272*4882a593Smuzhiyun #define OID_OFFLOAD_ENCAPSULATION 0x0101010A /* set/query */ 1273*4882a593Smuzhiyun 1274*4882a593Smuzhiyun /* 1275*4882a593Smuzhiyun * OID_TCP_OFFLOAD_HARDWARE_CAPABILITIES 1276*4882a593Smuzhiyun * ndis_type: NDIS_OBJTYPE_OFFLOAD 1277*4882a593Smuzhiyun */ 1278*4882a593Smuzhiyun 1279*4882a593Smuzhiyun #define NDIS_OFFLOAD_ENCAP_NONE 0x0000 1280*4882a593Smuzhiyun #define NDIS_OFFLOAD_ENCAP_NULL 0x0001 1281*4882a593Smuzhiyun #define NDIS_OFFLOAD_ENCAP_8023 0x0002 1282*4882a593Smuzhiyun #define NDIS_OFFLOAD_ENCAP_8023PQ 0x0004 1283*4882a593Smuzhiyun #define NDIS_OFFLOAD_ENCAP_8023PQ_OOB 0x0008 1284*4882a593Smuzhiyun #define NDIS_OFFLOAD_ENCAP_RFC1483 0x0010 1285*4882a593Smuzhiyun 1286*4882a593Smuzhiyun struct ndis_csum_offload { 1287*4882a593Smuzhiyun u32 ip4_txenc; 1288*4882a593Smuzhiyun u32 ip4_txcsum; 1289*4882a593Smuzhiyun #define NDIS_TXCSUM_CAP_IP4OPT 0x001 1290*4882a593Smuzhiyun #define NDIS_TXCSUM_CAP_TCP4OPT 0x004 1291*4882a593Smuzhiyun #define NDIS_TXCSUM_CAP_TCP4 0x010 1292*4882a593Smuzhiyun #define NDIS_TXCSUM_CAP_UDP4 0x040 1293*4882a593Smuzhiyun #define NDIS_TXCSUM_CAP_IP4 0x100 1294*4882a593Smuzhiyun 1295*4882a593Smuzhiyun #define NDIS_TXCSUM_ALL_TCP4 (NDIS_TXCSUM_CAP_TCP4 | NDIS_TXCSUM_CAP_TCP4OPT) 1296*4882a593Smuzhiyun 1297*4882a593Smuzhiyun u32 ip4_rxenc; 1298*4882a593Smuzhiyun u32 ip4_rxcsum; 1299*4882a593Smuzhiyun #define NDIS_RXCSUM_CAP_IP4OPT 0x001 1300*4882a593Smuzhiyun #define NDIS_RXCSUM_CAP_TCP4OPT 0x004 1301*4882a593Smuzhiyun #define NDIS_RXCSUM_CAP_TCP4 0x010 1302*4882a593Smuzhiyun #define NDIS_RXCSUM_CAP_UDP4 0x040 1303*4882a593Smuzhiyun #define NDIS_RXCSUM_CAP_IP4 0x100 1304*4882a593Smuzhiyun u32 ip6_txenc; 1305*4882a593Smuzhiyun u32 ip6_txcsum; 1306*4882a593Smuzhiyun #define NDIS_TXCSUM_CAP_IP6EXT 0x001 1307*4882a593Smuzhiyun #define NDIS_TXCSUM_CAP_TCP6OPT 0x004 1308*4882a593Smuzhiyun #define NDIS_TXCSUM_CAP_TCP6 0x010 1309*4882a593Smuzhiyun #define NDIS_TXCSUM_CAP_UDP6 0x040 1310*4882a593Smuzhiyun u32 ip6_rxenc; 1311*4882a593Smuzhiyun u32 ip6_rxcsum; 1312*4882a593Smuzhiyun #define NDIS_RXCSUM_CAP_IP6EXT 0x001 1313*4882a593Smuzhiyun #define NDIS_RXCSUM_CAP_TCP6OPT 0x004 1314*4882a593Smuzhiyun #define NDIS_RXCSUM_CAP_TCP6 0x010 1315*4882a593Smuzhiyun #define NDIS_RXCSUM_CAP_UDP6 0x040 1316*4882a593Smuzhiyun 1317*4882a593Smuzhiyun #define NDIS_TXCSUM_ALL_TCP6 (NDIS_TXCSUM_CAP_TCP6 | \ 1318*4882a593Smuzhiyun NDIS_TXCSUM_CAP_TCP6OPT | \ 1319*4882a593Smuzhiyun NDIS_TXCSUM_CAP_IP6EXT) 1320*4882a593Smuzhiyun }; 1321*4882a593Smuzhiyun 1322*4882a593Smuzhiyun struct ndis_lsov1_offload { 1323*4882a593Smuzhiyun u32 encap; 1324*4882a593Smuzhiyun u32 maxsize; 1325*4882a593Smuzhiyun u32 minsegs; 1326*4882a593Smuzhiyun u32 opts; 1327*4882a593Smuzhiyun }; 1328*4882a593Smuzhiyun 1329*4882a593Smuzhiyun struct ndis_ipsecv1_offload { 1330*4882a593Smuzhiyun u32 encap; 1331*4882a593Smuzhiyun u32 ah_esp; 1332*4882a593Smuzhiyun u32 xport_tun; 1333*4882a593Smuzhiyun u32 ip4_opts; 1334*4882a593Smuzhiyun u32 flags; 1335*4882a593Smuzhiyun u32 ip4_ah; 1336*4882a593Smuzhiyun u32 ip4_esp; 1337*4882a593Smuzhiyun }; 1338*4882a593Smuzhiyun 1339*4882a593Smuzhiyun struct ndis_lsov2_offload { 1340*4882a593Smuzhiyun u32 ip4_encap; 1341*4882a593Smuzhiyun u32 ip4_maxsz; 1342*4882a593Smuzhiyun u32 ip4_minsg; 1343*4882a593Smuzhiyun u32 ip6_encap; 1344*4882a593Smuzhiyun u32 ip6_maxsz; 1345*4882a593Smuzhiyun u32 ip6_minsg; 1346*4882a593Smuzhiyun u32 ip6_opts; 1347*4882a593Smuzhiyun #define NDIS_LSOV2_CAP_IP6EXT 0x001 1348*4882a593Smuzhiyun #define NDIS_LSOV2_CAP_TCP6OPT 0x004 1349*4882a593Smuzhiyun 1350*4882a593Smuzhiyun #define NDIS_LSOV2_CAP_IP6 (NDIS_LSOV2_CAP_IP6EXT | \ 1351*4882a593Smuzhiyun NDIS_LSOV2_CAP_TCP6OPT) 1352*4882a593Smuzhiyun }; 1353*4882a593Smuzhiyun 1354*4882a593Smuzhiyun struct ndis_ipsecv2_offload { 1355*4882a593Smuzhiyun u32 encap; 1356*4882a593Smuzhiyun u8 ip6; 1357*4882a593Smuzhiyun u8 ip4opt; 1358*4882a593Smuzhiyun u8 ip6ext; 1359*4882a593Smuzhiyun u8 ah; 1360*4882a593Smuzhiyun u8 esp; 1361*4882a593Smuzhiyun u8 ah_esp; 1362*4882a593Smuzhiyun u8 xport; 1363*4882a593Smuzhiyun u8 tun; 1364*4882a593Smuzhiyun u8 xport_tun; 1365*4882a593Smuzhiyun u8 lso; 1366*4882a593Smuzhiyun u8 extseq; 1367*4882a593Smuzhiyun u32 udp_esp; 1368*4882a593Smuzhiyun u32 auth; 1369*4882a593Smuzhiyun u32 crypto; 1370*4882a593Smuzhiyun u32 sa_caps; 1371*4882a593Smuzhiyun }; 1372*4882a593Smuzhiyun 1373*4882a593Smuzhiyun struct ndis_rsc_offload { 1374*4882a593Smuzhiyun u8 ip4; 1375*4882a593Smuzhiyun u8 ip6; 1376*4882a593Smuzhiyun }; 1377*4882a593Smuzhiyun 1378*4882a593Smuzhiyun struct ndis_encap_offload { 1379*4882a593Smuzhiyun u32 flags; 1380*4882a593Smuzhiyun u32 maxhdr; 1381*4882a593Smuzhiyun }; 1382*4882a593Smuzhiyun 1383*4882a593Smuzhiyun struct ndis_offload { 1384*4882a593Smuzhiyun struct ndis_object_header header; 1385*4882a593Smuzhiyun struct ndis_csum_offload csum; 1386*4882a593Smuzhiyun struct ndis_lsov1_offload lsov1; 1387*4882a593Smuzhiyun struct ndis_ipsecv1_offload ipsecv1; 1388*4882a593Smuzhiyun struct ndis_lsov2_offload lsov2; 1389*4882a593Smuzhiyun u32 flags; 1390*4882a593Smuzhiyun /* NDIS >= 6.1 */ 1391*4882a593Smuzhiyun struct ndis_ipsecv2_offload ipsecv2; 1392*4882a593Smuzhiyun /* NDIS >= 6.30 */ 1393*4882a593Smuzhiyun struct ndis_rsc_offload rsc; 1394*4882a593Smuzhiyun struct ndis_encap_offload encap_gre; 1395*4882a593Smuzhiyun }; 1396*4882a593Smuzhiyun 1397*4882a593Smuzhiyun #define NDIS_OFFLOAD_SIZE sizeof(struct ndis_offload) 1398*4882a593Smuzhiyun #define NDIS_OFFLOAD_SIZE_6_0 offsetof(struct ndis_offload, ipsecv2) 1399*4882a593Smuzhiyun #define NDIS_OFFLOAD_SIZE_6_1 offsetof(struct ndis_offload, rsc) 1400*4882a593Smuzhiyun 1401*4882a593Smuzhiyun struct ndis_offload_params { 1402*4882a593Smuzhiyun struct ndis_object_header header; 1403*4882a593Smuzhiyun u8 ip_v4_csum; 1404*4882a593Smuzhiyun u8 tcp_ip_v4_csum; 1405*4882a593Smuzhiyun u8 udp_ip_v4_csum; 1406*4882a593Smuzhiyun u8 tcp_ip_v6_csum; 1407*4882a593Smuzhiyun u8 udp_ip_v6_csum; 1408*4882a593Smuzhiyun u8 lso_v1; 1409*4882a593Smuzhiyun u8 ip_sec_v1; 1410*4882a593Smuzhiyun u8 lso_v2_ipv4; 1411*4882a593Smuzhiyun u8 lso_v2_ipv6; 1412*4882a593Smuzhiyun u8 tcp_connection_ip_v4; 1413*4882a593Smuzhiyun u8 tcp_connection_ip_v6; 1414*4882a593Smuzhiyun u32 flags; 1415*4882a593Smuzhiyun u8 ip_sec_v2; 1416*4882a593Smuzhiyun u8 ip_sec_v2_ip_v4; 1417*4882a593Smuzhiyun struct { 1418*4882a593Smuzhiyun u8 rsc_ip_v4; 1419*4882a593Smuzhiyun u8 rsc_ip_v6; 1420*4882a593Smuzhiyun }; 1421*4882a593Smuzhiyun struct { 1422*4882a593Smuzhiyun u8 encapsulated_packet_task_offload; 1423*4882a593Smuzhiyun u8 encapsulation_types; 1424*4882a593Smuzhiyun }; 1425*4882a593Smuzhiyun }; 1426*4882a593Smuzhiyun 1427*4882a593Smuzhiyun struct ndis_tcp_ip_checksum_info { 1428*4882a593Smuzhiyun union { 1429*4882a593Smuzhiyun struct { 1430*4882a593Smuzhiyun u32 is_ipv4:1; 1431*4882a593Smuzhiyun u32 is_ipv6:1; 1432*4882a593Smuzhiyun u32 tcp_checksum:1; 1433*4882a593Smuzhiyun u32 udp_checksum:1; 1434*4882a593Smuzhiyun u32 ip_header_checksum:1; 1435*4882a593Smuzhiyun u32 reserved:11; 1436*4882a593Smuzhiyun u32 tcp_header_offset:10; 1437*4882a593Smuzhiyun } transmit; 1438*4882a593Smuzhiyun struct { 1439*4882a593Smuzhiyun u32 tcp_checksum_failed:1; 1440*4882a593Smuzhiyun u32 udp_checksum_failed:1; 1441*4882a593Smuzhiyun u32 ip_checksum_failed:1; 1442*4882a593Smuzhiyun u32 tcp_checksum_succeeded:1; 1443*4882a593Smuzhiyun u32 udp_checksum_succeeded:1; 1444*4882a593Smuzhiyun u32 ip_checksum_succeeded:1; 1445*4882a593Smuzhiyun u32 loopback:1; 1446*4882a593Smuzhiyun u32 tcp_checksum_value_invalid:1; 1447*4882a593Smuzhiyun u32 ip_checksum_value_invalid:1; 1448*4882a593Smuzhiyun } receive; 1449*4882a593Smuzhiyun u32 value; 1450*4882a593Smuzhiyun }; 1451*4882a593Smuzhiyun }; 1452*4882a593Smuzhiyun 1453*4882a593Smuzhiyun struct ndis_tcp_lso_info { 1454*4882a593Smuzhiyun union { 1455*4882a593Smuzhiyun struct { 1456*4882a593Smuzhiyun u32 unused:30; 1457*4882a593Smuzhiyun u32 type:1; 1458*4882a593Smuzhiyun u32 reserved2:1; 1459*4882a593Smuzhiyun } transmit; 1460*4882a593Smuzhiyun struct { 1461*4882a593Smuzhiyun u32 mss:20; 1462*4882a593Smuzhiyun u32 tcp_header_offset:10; 1463*4882a593Smuzhiyun u32 type:1; 1464*4882a593Smuzhiyun u32 reserved2:1; 1465*4882a593Smuzhiyun } lso_v1_transmit; 1466*4882a593Smuzhiyun struct { 1467*4882a593Smuzhiyun u32 tcp_payload:30; 1468*4882a593Smuzhiyun u32 type:1; 1469*4882a593Smuzhiyun u32 reserved2:1; 1470*4882a593Smuzhiyun } lso_v1_transmit_complete; 1471*4882a593Smuzhiyun struct { 1472*4882a593Smuzhiyun u32 mss:20; 1473*4882a593Smuzhiyun u32 tcp_header_offset:10; 1474*4882a593Smuzhiyun u32 type:1; 1475*4882a593Smuzhiyun u32 ip_version:1; 1476*4882a593Smuzhiyun } lso_v2_transmit; 1477*4882a593Smuzhiyun struct { 1478*4882a593Smuzhiyun u32 reserved:30; 1479*4882a593Smuzhiyun u32 type:1; 1480*4882a593Smuzhiyun u32 reserved2:1; 1481*4882a593Smuzhiyun } lso_v2_transmit_complete; 1482*4882a593Smuzhiyun u32 value; 1483*4882a593Smuzhiyun }; 1484*4882a593Smuzhiyun }; 1485*4882a593Smuzhiyun 1486*4882a593Smuzhiyun #define NDIS_VLAN_PPI_SIZE (sizeof(struct rndis_per_packet_info) + \ 1487*4882a593Smuzhiyun sizeof(struct ndis_pkt_8021q_info)) 1488*4882a593Smuzhiyun 1489*4882a593Smuzhiyun #define NDIS_CSUM_PPI_SIZE (sizeof(struct rndis_per_packet_info) + \ 1490*4882a593Smuzhiyun sizeof(struct ndis_tcp_ip_checksum_info)) 1491*4882a593Smuzhiyun 1492*4882a593Smuzhiyun #define NDIS_LSO_PPI_SIZE (sizeof(struct rndis_per_packet_info) + \ 1493*4882a593Smuzhiyun sizeof(struct ndis_tcp_lso_info)) 1494*4882a593Smuzhiyun 1495*4882a593Smuzhiyun #define NDIS_HASH_PPI_SIZE (sizeof(struct rndis_per_packet_info) + \ 1496*4882a593Smuzhiyun sizeof(u32)) 1497*4882a593Smuzhiyun 1498*4882a593Smuzhiyun /* Total size of all PPI data */ 1499*4882a593Smuzhiyun #define NDIS_ALL_PPI_SIZE (NDIS_VLAN_PPI_SIZE + NDIS_CSUM_PPI_SIZE + \ 1500*4882a593Smuzhiyun NDIS_LSO_PPI_SIZE + NDIS_HASH_PPI_SIZE) 1501*4882a593Smuzhiyun 1502*4882a593Smuzhiyun /* Format of Information buffer passed in a SetRequest for the OID */ 1503*4882a593Smuzhiyun /* OID_GEN_RNDIS_CONFIG_PARAMETER. */ 1504*4882a593Smuzhiyun struct rndis_config_parameter_info { 1505*4882a593Smuzhiyun u32 parameter_name_offset; 1506*4882a593Smuzhiyun u32 parameter_name_length; 1507*4882a593Smuzhiyun u32 parameter_type; 1508*4882a593Smuzhiyun u32 parameter_value_offset; 1509*4882a593Smuzhiyun u32 parameter_value_length; 1510*4882a593Smuzhiyun }; 1511*4882a593Smuzhiyun 1512*4882a593Smuzhiyun /* Values for ParameterType in struct rndis_config_parameter_info */ 1513*4882a593Smuzhiyun #define RNDIS_CONFIG_PARAM_TYPE_INTEGER 0 1514*4882a593Smuzhiyun #define RNDIS_CONFIG_PARAM_TYPE_STRING 2 1515*4882a593Smuzhiyun 1516*4882a593Smuzhiyun /* CONDIS Miniport messages for connection oriented devices */ 1517*4882a593Smuzhiyun /* that do not implement a call manager. */ 1518*4882a593Smuzhiyun 1519*4882a593Smuzhiyun /* CoNdisMiniportCreateVc message */ 1520*4882a593Smuzhiyun struct rcondis_mp_create_vc { 1521*4882a593Smuzhiyun u32 req_id; 1522*4882a593Smuzhiyun u32 ndis_vc_handle; 1523*4882a593Smuzhiyun }; 1524*4882a593Smuzhiyun 1525*4882a593Smuzhiyun /* Response to CoNdisMiniportCreateVc */ 1526*4882a593Smuzhiyun struct rcondis_mp_create_vc_complete { 1527*4882a593Smuzhiyun u32 req_id; 1528*4882a593Smuzhiyun u32 dev_vc_handle; 1529*4882a593Smuzhiyun u32 status; 1530*4882a593Smuzhiyun }; 1531*4882a593Smuzhiyun 1532*4882a593Smuzhiyun /* CoNdisMiniportDeleteVc message */ 1533*4882a593Smuzhiyun struct rcondis_mp_delete_vc { 1534*4882a593Smuzhiyun u32 req_id; 1535*4882a593Smuzhiyun u32 dev_vc_handle; 1536*4882a593Smuzhiyun }; 1537*4882a593Smuzhiyun 1538*4882a593Smuzhiyun /* Response to CoNdisMiniportDeleteVc */ 1539*4882a593Smuzhiyun struct rcondis_mp_delete_vc_complete { 1540*4882a593Smuzhiyun u32 req_id; 1541*4882a593Smuzhiyun u32 status; 1542*4882a593Smuzhiyun }; 1543*4882a593Smuzhiyun 1544*4882a593Smuzhiyun /* CoNdisMiniportQueryRequest message */ 1545*4882a593Smuzhiyun struct rcondis_mp_query_request { 1546*4882a593Smuzhiyun u32 req_id; 1547*4882a593Smuzhiyun u32 request_type; 1548*4882a593Smuzhiyun u32 oid; 1549*4882a593Smuzhiyun u32 dev_vc_handle; 1550*4882a593Smuzhiyun u32 info_buflen; 1551*4882a593Smuzhiyun u32 info_buf_offset; 1552*4882a593Smuzhiyun }; 1553*4882a593Smuzhiyun 1554*4882a593Smuzhiyun /* CoNdisMiniportSetRequest message */ 1555*4882a593Smuzhiyun struct rcondis_mp_set_request { 1556*4882a593Smuzhiyun u32 req_id; 1557*4882a593Smuzhiyun u32 request_type; 1558*4882a593Smuzhiyun u32 oid; 1559*4882a593Smuzhiyun u32 dev_vc_handle; 1560*4882a593Smuzhiyun u32 info_buflen; 1561*4882a593Smuzhiyun u32 info_buf_offset; 1562*4882a593Smuzhiyun }; 1563*4882a593Smuzhiyun 1564*4882a593Smuzhiyun /* CoNdisIndicateStatus message */ 1565*4882a593Smuzhiyun struct rcondis_indicate_status { 1566*4882a593Smuzhiyun u32 ndis_vc_handle; 1567*4882a593Smuzhiyun u32 status; 1568*4882a593Smuzhiyun u32 status_buflen; 1569*4882a593Smuzhiyun u32 status_buf_offset; 1570*4882a593Smuzhiyun }; 1571*4882a593Smuzhiyun 1572*4882a593Smuzhiyun /* CONDIS Call/VC parameters */ 1573*4882a593Smuzhiyun struct rcondis_specific_parameters { 1574*4882a593Smuzhiyun u32 parameter_type; 1575*4882a593Smuzhiyun u32 parameter_length; 1576*4882a593Smuzhiyun u32 parameter_lffset; 1577*4882a593Smuzhiyun }; 1578*4882a593Smuzhiyun 1579*4882a593Smuzhiyun struct rcondis_media_parameters { 1580*4882a593Smuzhiyun u32 flags; 1581*4882a593Smuzhiyun u32 reserved1; 1582*4882a593Smuzhiyun u32 reserved2; 1583*4882a593Smuzhiyun struct rcondis_specific_parameters media_specific; 1584*4882a593Smuzhiyun }; 1585*4882a593Smuzhiyun 1586*4882a593Smuzhiyun struct rndis_flowspec { 1587*4882a593Smuzhiyun u32 token_rate; 1588*4882a593Smuzhiyun u32 token_bucket_size; 1589*4882a593Smuzhiyun u32 peak_bandwidth; 1590*4882a593Smuzhiyun u32 latency; 1591*4882a593Smuzhiyun u32 delay_variation; 1592*4882a593Smuzhiyun u32 service_type; 1593*4882a593Smuzhiyun u32 max_sdu_size; 1594*4882a593Smuzhiyun u32 minimum_policed_size; 1595*4882a593Smuzhiyun }; 1596*4882a593Smuzhiyun 1597*4882a593Smuzhiyun struct rcondis_call_manager_parameters { 1598*4882a593Smuzhiyun struct rndis_flowspec transmit; 1599*4882a593Smuzhiyun struct rndis_flowspec receive; 1600*4882a593Smuzhiyun struct rcondis_specific_parameters call_mgr_specific; 1601*4882a593Smuzhiyun }; 1602*4882a593Smuzhiyun 1603*4882a593Smuzhiyun /* CoNdisMiniportActivateVc message */ 1604*4882a593Smuzhiyun struct rcondis_mp_activate_vc_request { 1605*4882a593Smuzhiyun u32 req_id; 1606*4882a593Smuzhiyun u32 flags; 1607*4882a593Smuzhiyun u32 dev_vc_handle; 1608*4882a593Smuzhiyun u32 media_params_offset; 1609*4882a593Smuzhiyun u32 media_params_length; 1610*4882a593Smuzhiyun u32 call_mgr_params_offset; 1611*4882a593Smuzhiyun u32 call_mgr_params_length; 1612*4882a593Smuzhiyun }; 1613*4882a593Smuzhiyun 1614*4882a593Smuzhiyun /* Response to CoNdisMiniportActivateVc */ 1615*4882a593Smuzhiyun struct rcondis_mp_activate_vc_complete { 1616*4882a593Smuzhiyun u32 req_id; 1617*4882a593Smuzhiyun u32 status; 1618*4882a593Smuzhiyun }; 1619*4882a593Smuzhiyun 1620*4882a593Smuzhiyun /* CoNdisMiniportDeactivateVc message */ 1621*4882a593Smuzhiyun struct rcondis_mp_deactivate_vc_request { 1622*4882a593Smuzhiyun u32 req_id; 1623*4882a593Smuzhiyun u32 flags; 1624*4882a593Smuzhiyun u32 dev_vc_handle; 1625*4882a593Smuzhiyun }; 1626*4882a593Smuzhiyun 1627*4882a593Smuzhiyun /* Response to CoNdisMiniportDeactivateVc */ 1628*4882a593Smuzhiyun struct rcondis_mp_deactivate_vc_complete { 1629*4882a593Smuzhiyun u32 req_id; 1630*4882a593Smuzhiyun u32 status; 1631*4882a593Smuzhiyun }; 1632*4882a593Smuzhiyun 1633*4882a593Smuzhiyun 1634*4882a593Smuzhiyun /* union with all of the RNDIS messages */ 1635*4882a593Smuzhiyun union rndis_message_container { 1636*4882a593Smuzhiyun struct rndis_packet pkt; 1637*4882a593Smuzhiyun struct rndis_initialize_request init_req; 1638*4882a593Smuzhiyun struct rndis_halt_request halt_req; 1639*4882a593Smuzhiyun struct rndis_query_request query_req; 1640*4882a593Smuzhiyun struct rndis_set_request set_req; 1641*4882a593Smuzhiyun struct rndis_reset_request reset_req; 1642*4882a593Smuzhiyun struct rndis_keepalive_request keep_alive_req; 1643*4882a593Smuzhiyun struct rndis_indicate_status indicate_status; 1644*4882a593Smuzhiyun struct rndis_initialize_complete init_complete; 1645*4882a593Smuzhiyun struct rndis_query_complete query_complete; 1646*4882a593Smuzhiyun struct rndis_set_complete set_complete; 1647*4882a593Smuzhiyun struct rndis_reset_complete reset_complete; 1648*4882a593Smuzhiyun struct rndis_keepalive_complete keep_alive_complete; 1649*4882a593Smuzhiyun struct rcondis_mp_create_vc co_miniport_create_vc; 1650*4882a593Smuzhiyun struct rcondis_mp_delete_vc co_miniport_delete_vc; 1651*4882a593Smuzhiyun struct rcondis_indicate_status co_indicate_status; 1652*4882a593Smuzhiyun struct rcondis_mp_activate_vc_request co_miniport_activate_vc; 1653*4882a593Smuzhiyun struct rcondis_mp_deactivate_vc_request co_miniport_deactivate_vc; 1654*4882a593Smuzhiyun struct rcondis_mp_create_vc_complete co_miniport_create_vc_complete; 1655*4882a593Smuzhiyun struct rcondis_mp_delete_vc_complete co_miniport_delete_vc_complete; 1656*4882a593Smuzhiyun struct rcondis_mp_activate_vc_complete co_miniport_activate_vc_complete; 1657*4882a593Smuzhiyun struct rcondis_mp_deactivate_vc_complete 1658*4882a593Smuzhiyun co_miniport_deactivate_vc_complete; 1659*4882a593Smuzhiyun }; 1660*4882a593Smuzhiyun 1661*4882a593Smuzhiyun /* Remote NDIS message format */ 1662*4882a593Smuzhiyun struct rndis_message { 1663*4882a593Smuzhiyun u32 ndis_msg_type; 1664*4882a593Smuzhiyun 1665*4882a593Smuzhiyun /* Total length of this message, from the beginning */ 1666*4882a593Smuzhiyun /* of the struct rndis_message, in bytes. */ 1667*4882a593Smuzhiyun u32 msg_len; 1668*4882a593Smuzhiyun 1669*4882a593Smuzhiyun /* Actual message */ 1670*4882a593Smuzhiyun union rndis_message_container msg; 1671*4882a593Smuzhiyun }; 1672*4882a593Smuzhiyun 1673*4882a593Smuzhiyun 1674*4882a593Smuzhiyun /* Handy macros */ 1675*4882a593Smuzhiyun 1676*4882a593Smuzhiyun /* get the size of an RNDIS message. Pass in the message type, */ 1677*4882a593Smuzhiyun /* struct rndis_set_request, struct rndis_packet for example */ 1678*4882a593Smuzhiyun #define RNDIS_MESSAGE_SIZE(msg) \ 1679*4882a593Smuzhiyun (sizeof(msg) + (sizeof(struct rndis_message) - \ 1680*4882a593Smuzhiyun sizeof(union rndis_message_container))) 1681*4882a593Smuzhiyun 1682*4882a593Smuzhiyun #define RNDIS_HEADER_SIZE (sizeof(struct rndis_message) - \ 1683*4882a593Smuzhiyun sizeof(union rndis_message_container)) 1684*4882a593Smuzhiyun 1685*4882a593Smuzhiyun #define RNDIS_AND_PPI_SIZE (sizeof(struct rndis_message) + NDIS_ALL_PPI_SIZE) 1686*4882a593Smuzhiyun 1687*4882a593Smuzhiyun #define NDIS_PACKET_TYPE_DIRECTED 0x00000001 1688*4882a593Smuzhiyun #define NDIS_PACKET_TYPE_MULTICAST 0x00000002 1689*4882a593Smuzhiyun #define NDIS_PACKET_TYPE_ALL_MULTICAST 0x00000004 1690*4882a593Smuzhiyun #define NDIS_PACKET_TYPE_BROADCAST 0x00000008 1691*4882a593Smuzhiyun #define NDIS_PACKET_TYPE_SOURCE_ROUTING 0x00000010 1692*4882a593Smuzhiyun #define NDIS_PACKET_TYPE_PROMISCUOUS 0x00000020 1693*4882a593Smuzhiyun #define NDIS_PACKET_TYPE_SMT 0x00000040 1694*4882a593Smuzhiyun #define NDIS_PACKET_TYPE_ALL_LOCAL 0x00000080 1695*4882a593Smuzhiyun #define NDIS_PACKET_TYPE_GROUP 0x00000100 1696*4882a593Smuzhiyun #define NDIS_PACKET_TYPE_ALL_FUNCTIONAL 0x00000200 1697*4882a593Smuzhiyun #define NDIS_PACKET_TYPE_FUNCTIONAL 0x00000400 1698*4882a593Smuzhiyun #define NDIS_PACKET_TYPE_MAC_FRAME 0x00000800 1699*4882a593Smuzhiyun 1700*4882a593Smuzhiyun #define TRANSPORT_INFO_NOT_IP 0 1701*4882a593Smuzhiyun #define TRANSPORT_INFO_IPV4_TCP 0x01 1702*4882a593Smuzhiyun #define TRANSPORT_INFO_IPV4_UDP 0x02 1703*4882a593Smuzhiyun #define TRANSPORT_INFO_IPV6_TCP 0x10 1704*4882a593Smuzhiyun #define TRANSPORT_INFO_IPV6_UDP 0x20 1705*4882a593Smuzhiyun 1706*4882a593Smuzhiyun #endif /* _HYPERV_NET_H */ 1707