1/*- 2 * Copyright (c) 2016-2017 Microsoft Corp. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice unmodified, this list of conditions, and the following 10 * disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 16 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 19 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 * 26 * $FreeBSD: stable/11/sys/dev/hyperv/netvsc/if_hnreg.h 322612 2017-08-17 05:09:22Z sephe $ 27 */ 28 29#ifndef _IF_HNREG_H_ 30#define _IF_HNREG_H_ 31 32#include <sys/param.h> 33#include <sys/systm.h> 34 35/* 36 * NDIS protocol version numbers 37 */ 38#define HN_NDIS_VERSION_6_1 0x00060001 39#define HN_NDIS_VERSION_6_20 0x00060014 40#define HN_NDIS_VERSION_6_30 0x0006001e 41#define HN_NDIS_VERSION_MAJOR(ver) (((ver) & 0xffff0000) >> 16) 42#define HN_NDIS_VERSION_MINOR(ver) ((ver) & 0xffff) 43 44/* 45 * NVS versions. 46 */ 47#define HN_NVS_VERSION_1 0x00002 48#define HN_NVS_VERSION_2 0x30002 49#define HN_NVS_VERSION_4 0x40000 50#define HN_NVS_VERSION_5 0x50000 51 52#define HN_NVS_RXBUF_SIG 0xcafe 53#define HN_NVS_CHIM_SIG 0xface 54 55#define HN_NVS_CHIM_IDX_INVALID 0xffffffff 56 57#define HN_NVS_RNDIS_MTYPE_DATA 0 58#define HN_NVS_RNDIS_MTYPE_CTRL 1 59 60/* 61 * NVS message transacion status codes. 62 */ 63#define HN_NVS_STATUS_OK 1 64#define HN_NVS_STATUS_FAILED 2 65 66/* 67 * NVS request/response message types. 68 */ 69#define HN_NVS_TYPE_INIT 1 70#define HN_NVS_TYPE_INIT_RESP 2 71#define HN_NVS_TYPE_NDIS_INIT 100 72#define HN_NVS_TYPE_RXBUF_CONN 101 73#define HN_NVS_TYPE_RXBUF_CONNRESP 102 74#define HN_NVS_TYPE_RXBUF_DISCONN 103 75#define HN_NVS_TYPE_CHIM_CONN 104 76#define HN_NVS_TYPE_CHIM_CONNRESP 105 77#define HN_NVS_TYPE_CHIM_DISCONN 106 78#define HN_NVS_TYPE_RNDIS 107 79#define HN_NVS_TYPE_RNDIS_ACK 108 80#define HN_NVS_TYPE_NDIS_CONF 125 81#define HN_NVS_TYPE_VFASSOC_NOTE 128 /* notification */ 82#define HN_NVS_TYPE_SET_DATAPATH 129 83#define HN_NVS_TYPE_SUBCH_REQ 133 84#define HN_NVS_TYPE_SUBCH_RESP 133 /* same as SUBCH_REQ */ 85#define HN_NVS_TYPE_TXTBL_NOTE 134 /* notification */ 86 87/* 88 * Any size less than this one will _not_ work, e.g. hn_nvs_init 89 * only has 12B valid data, however, if only 12B data were sent, 90 * Hypervisor would never reply. 91 */ 92#define HN_NVS_REQSIZE_MIN 32 93 94/* NVS message common header */ 95struct hn_nvs_hdr { 96 uint32_t nvs_type; 97} __packed; 98 99struct hn_nvs_init { 100 uint32_t nvs_type; /* HN_NVS_TYPE_INIT */ 101 uint32_t nvs_ver_min; 102 uint32_t nvs_ver_max; 103 uint8_t nvs_rsvd[20]; 104} __packed; 105CTASSERT(sizeof(struct hn_nvs_init) >= HN_NVS_REQSIZE_MIN); 106 107struct hn_nvs_init_resp { 108 uint32_t nvs_type; /* HN_NVS_TYPE_INIT_RESP */ 109 uint32_t nvs_ver; /* deprecated */ 110 uint32_t nvs_rsvd; 111 uint32_t nvs_status; /* HN_NVS_STATUS_ */ 112} __packed; 113 114/* No reponse */ 115struct hn_nvs_ndis_conf { 116 uint32_t nvs_type; /* HN_NVS_TYPE_NDIS_CONF */ 117 uint32_t nvs_mtu; 118 uint32_t nvs_rsvd; 119 uint64_t nvs_caps; /* HN_NVS_NDIS_CONF_ */ 120 uint8_t nvs_rsvd1[12]; 121} __packed; 122CTASSERT(sizeof(struct hn_nvs_ndis_conf) >= HN_NVS_REQSIZE_MIN); 123 124#define HN_NVS_NDIS_CONF_SRIOV 0x0004 125#define HN_NVS_NDIS_CONF_VLAN 0x0008 126 127/* No response */ 128struct hn_nvs_ndis_init { 129 uint32_t nvs_type; /* HN_NVS_TYPE_NDIS_INIT */ 130 uint32_t nvs_ndis_major; /* NDIS_VERSION_MAJOR_ */ 131 uint32_t nvs_ndis_minor; /* NDIS_VERSION_MINOR_ */ 132 uint8_t nvs_rsvd[20]; 133} __packed; 134CTASSERT(sizeof(struct hn_nvs_ndis_init) >= HN_NVS_REQSIZE_MIN); 135 136#define HN_NVS_DATAPATH_SYNTH 0 137#define HN_NVS_DATAPATH_VF 1 138 139/* No response */ 140struct hn_nvs_datapath { 141 uint32_t nvs_type; /* HN_NVS_TYPE_SET_DATAPATH */ 142 uint32_t nvs_active_path;/* HN_NVS_DATAPATH_* */ 143 uint32_t nvs_rsvd[6]; 144} __packed; 145CTASSERT(sizeof(struct hn_nvs_datapath) >= HN_NVS_REQSIZE_MIN); 146 147struct hn_nvs_rxbuf_conn { 148 uint32_t nvs_type; /* HN_NVS_TYPE_RXBUF_CONN */ 149 uint32_t nvs_gpadl; /* RXBUF vmbus GPADL */ 150 uint16_t nvs_sig; /* HN_NVS_RXBUF_SIG */ 151 uint8_t nvs_rsvd[22]; 152} __packed; 153CTASSERT(sizeof(struct hn_nvs_rxbuf_conn) >= HN_NVS_REQSIZE_MIN); 154 155struct hn_nvs_rxbuf_sect { 156 uint32_t nvs_start; 157 uint32_t nvs_slotsz; 158 uint32_t nvs_slotcnt; 159 uint32_t nvs_end; 160} __packed; 161 162struct hn_nvs_rxbuf_connresp { 163 uint32_t nvs_type; /* HN_NVS_TYPE_RXBUF_CONNRESP */ 164 uint32_t nvs_status; /* HN_NVS_STATUS_ */ 165 uint32_t nvs_nsect; /* # of elem in nvs_sect */ 166 struct hn_nvs_rxbuf_sect nvs_sect[]; 167} __packed; 168 169/* No response */ 170struct hn_nvs_rxbuf_disconn { 171 uint32_t nvs_type; /* HN_NVS_TYPE_RXBUF_DISCONN */ 172 uint16_t nvs_sig; /* HN_NVS_RXBUF_SIG */ 173 uint8_t nvs_rsvd[26]; 174} __packed; 175CTASSERT(sizeof(struct hn_nvs_rxbuf_disconn) >= HN_NVS_REQSIZE_MIN); 176 177struct hn_nvs_chim_conn { 178 uint32_t nvs_type; /* HN_NVS_TYPE_CHIM_CONN */ 179 uint32_t nvs_gpadl; /* chimney buf vmbus GPADL */ 180 uint16_t nvs_sig; /* NDIS_NVS_CHIM_SIG */ 181 uint8_t nvs_rsvd[22]; 182} __packed; 183CTASSERT(sizeof(struct hn_nvs_chim_conn) >= HN_NVS_REQSIZE_MIN); 184 185struct hn_nvs_chim_connresp { 186 uint32_t nvs_type; /* HN_NVS_TYPE_CHIM_CONNRESP */ 187 uint32_t nvs_status; /* HN_NVS_STATUS_ */ 188 uint32_t nvs_sectsz; /* section size */ 189} __packed; 190 191/* No response */ 192struct hn_nvs_chim_disconn { 193 uint32_t nvs_type; /* HN_NVS_TYPE_CHIM_DISCONN */ 194 uint16_t nvs_sig; /* HN_NVS_CHIM_SIG */ 195 uint8_t nvs_rsvd[26]; 196} __packed; 197CTASSERT(sizeof(struct hn_nvs_chim_disconn) >= HN_NVS_REQSIZE_MIN); 198 199#define HN_NVS_SUBCH_OP_ALLOC 1 200 201struct hn_nvs_subch_req { 202 uint32_t nvs_type; /* HN_NVS_TYPE_SUBCH_REQ */ 203 uint32_t nvs_op; /* HN_NVS_SUBCH_OP_ */ 204 uint32_t nvs_nsubch; 205 uint8_t nvs_rsvd[20]; 206} __packed; 207CTASSERT(sizeof(struct hn_nvs_subch_req) >= HN_NVS_REQSIZE_MIN); 208 209struct hn_nvs_subch_resp { 210 uint32_t nvs_type; /* HN_NVS_TYPE_SUBCH_RESP */ 211 uint32_t nvs_status; /* HN_NVS_STATUS_ */ 212 uint32_t nvs_nsubch; 213} __packed; 214 215struct hn_nvs_rndis { 216 uint32_t nvs_type; /* HN_NVS_TYPE_RNDIS */ 217 uint32_t nvs_rndis_mtype;/* HN_NVS_RNDIS_MTYPE_ */ 218 /* 219 * Chimney sending buffer index and size. 220 * 221 * NOTE: 222 * If nvs_chim_idx is set to HN_NVS_CHIM_IDX_INVALID 223 * and nvs_chim_sz is set to 0, then chimney sending 224 * buffer is _not_ used by this RNDIS message. 225 */ 226 uint32_t nvs_chim_idx; 227 uint32_t nvs_chim_sz; 228 uint8_t nvs_rsvd[16]; 229} __packed; 230CTASSERT(sizeof(struct hn_nvs_rndis) >= HN_NVS_REQSIZE_MIN); 231 232struct hn_nvs_rndis_ack { 233 uint32_t nvs_type; /* HN_NVS_TYPE_RNDIS_ACK */ 234 uint32_t nvs_status; /* HN_NVS_STATUS_ */ 235 uint8_t nvs_rsvd[24]; 236} __packed; 237CTASSERT(sizeof(struct hn_nvs_rndis_ack) >= HN_NVS_REQSIZE_MIN); 238 239/* 240 * RNDIS extension 241 */ 242 243/* Per-packet hash info */ 244#define HN_NDIS_HASH_INFO_SIZE sizeof(uint32_t) 245#define HN_NDIS_PKTINFO_TYPE_HASHINF NDIS_PKTINFO_TYPE_ORIG_NBLIST 246/* NDIS_HASH_ */ 247 248/* Per-packet hash value */ 249#define HN_NDIS_HASH_VALUE_SIZE sizeof(uint32_t) 250#define HN_NDIS_PKTINFO_TYPE_HASHVAL NDIS_PKTINFO_TYPE_PKT_CANCELID 251 252/* Per-packet-info size */ 253#define HN_RNDIS_PKTINFO_SIZE(dlen) \ 254 __offsetof(struct rndis_pktinfo, rm_data[dlen]) 255 256#endif /* !_IF_HNREG_H_ */ 257