2 * Copyright (c) 2016 Microsoft Corp.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice unmodified, this list of conditions, and the following
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.
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.
32 #include <sys/param.h>
33 #include <sys/systm.h>
36 * NDIS protocol version numbers
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)
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
52 #define HN_NVS_RXBUF_SIG 0xcafe
53 #define HN_NVS_CHIM_SIG 0xface
55 #define HN_NVS_CHIM_IDX_INVALID 0xffffffff
57 #define HN_NVS_RNDIS_MTYPE_DATA 0
58 #define HN_NVS_RNDIS_MTYPE_CTRL 1
61 * NVS message transacion status codes.
63 #define HN_NVS_STATUS_OK 1
64 #define HN_NVS_STATUS_FAILED 2
67 * NVS request/response message types.
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 */
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.
92 #define HN_NVS_REQSIZE_MIN 32
94 /* NVS message common header */
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];
105 CTASSERT(sizeof(struct hn_nvs_init) >= HN_NVS_REQSIZE_MIN);
107 struct hn_nvs_init_resp {
108 uint32_t nvs_type; /* HN_NVS_TYPE_INIT_RESP */
109 uint32_t nvs_ver; /* deprecated */
111 uint32_t nvs_status; /* HN_NVS_STATUS_ */
115 struct hn_nvs_ndis_conf {
116 uint32_t nvs_type; /* HN_NVS_TYPE_NDIS_CONF */
119 uint64_t nvs_caps; /* HN_NVS_NDIS_CONF_ */
120 uint8_t nvs_rsvd1[12];
122 CTASSERT(sizeof(struct hn_nvs_ndis_conf) >= HN_NVS_REQSIZE_MIN);
124 #define HN_NVS_NDIS_CONF_SRIOV 0x0004
125 #define HN_NVS_NDIS_CONF_VLAN 0x0008
128 struct 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];
134 CTASSERT(sizeof(struct hn_nvs_ndis_init) >= HN_NVS_REQSIZE_MIN);
136 struct hn_nvs_rxbuf_conn {
137 uint32_t nvs_type; /* HN_NVS_TYPE_RXBUF_CONN */
138 uint32_t nvs_gpadl; /* RXBUF vmbus GPADL */
139 uint16_t nvs_sig; /* HN_NVS_RXBUF_SIG */
140 uint8_t nvs_rsvd[22];
142 CTASSERT(sizeof(struct hn_nvs_rxbuf_conn) >= HN_NVS_REQSIZE_MIN);
144 struct hn_nvs_rxbuf_sect {
147 uint32_t nvs_slotcnt;
151 struct hn_nvs_rxbuf_connresp {
152 uint32_t nvs_type; /* HN_NVS_TYPE_RXBUF_CONNRESP */
153 uint32_t nvs_status; /* HN_NVS_STATUS_ */
154 uint32_t nvs_nsect; /* # of elem in nvs_sect */
155 struct hn_nvs_rxbuf_sect nvs_sect[];
159 struct hn_nvs_rxbuf_disconn {
160 uint32_t nvs_type; /* HN_NVS_TYPE_RXBUF_DISCONN */
161 uint16_t nvs_sig; /* HN_NVS_RXBUF_SIG */
162 uint8_t nvs_rsvd[26];
164 CTASSERT(sizeof(struct hn_nvs_rxbuf_disconn) >= HN_NVS_REQSIZE_MIN);
166 struct hn_nvs_chim_conn {
167 uint32_t nvs_type; /* HN_NVS_TYPE_CHIM_CONN */
168 uint32_t nvs_gpadl; /* chimney buf vmbus GPADL */
169 uint16_t nvs_sig; /* NDIS_NVS_CHIM_SIG */
170 uint8_t nvs_rsvd[22];
172 CTASSERT(sizeof(struct hn_nvs_chim_conn) >= HN_NVS_REQSIZE_MIN);
174 struct hn_nvs_chim_connresp {
175 uint32_t nvs_type; /* HN_NVS_TYPE_CHIM_CONNRESP */
176 uint32_t nvs_status; /* HN_NVS_STATUS_ */
177 uint32_t nvs_sectsz; /* section size */
181 struct hn_nvs_chim_disconn {
182 uint32_t nvs_type; /* HN_NVS_TYPE_CHIM_DISCONN */
183 uint16_t nvs_sig; /* HN_NVS_CHIM_SIG */
184 uint8_t nvs_rsvd[26];
186 CTASSERT(sizeof(struct hn_nvs_chim_disconn) >= HN_NVS_REQSIZE_MIN);
188 #define HN_NVS_SUBCH_OP_ALLOC 1
190 struct hn_nvs_subch_req {
191 uint32_t nvs_type; /* HN_NVS_TYPE_SUBCH_REQ */
192 uint32_t nvs_op; /* HN_NVS_SUBCH_OP_ */
194 uint8_t nvs_rsvd[20];
196 CTASSERT(sizeof(struct hn_nvs_subch_req) >= HN_NVS_REQSIZE_MIN);
198 struct hn_nvs_subch_resp {
199 uint32_t nvs_type; /* HN_NVS_TYPE_SUBCH_RESP */
200 uint32_t nvs_status; /* HN_NVS_STATUS_ */
204 struct hn_nvs_rndis {
205 uint32_t nvs_type; /* HN_NVS_TYPE_RNDIS */
206 uint32_t nvs_rndis_mtype;/* HN_NVS_RNDIS_MTYPE_ */
208 * Chimney sending buffer index and size.
211 * If nvs_chim_idx is set to HN_NVS_CHIM_IDX_INVALID
212 * and nvs_chim_sz is set to 0, then chimney sending
213 * buffer is _not_ used by this RNDIS message.
215 uint32_t nvs_chim_idx;
216 uint32_t nvs_chim_sz;
217 uint8_t nvs_rsvd[16];
219 CTASSERT(sizeof(struct hn_nvs_rndis) >= HN_NVS_REQSIZE_MIN);
221 struct hn_nvs_rndis_ack {
222 uint32_t nvs_type; /* HN_NVS_TYPE_RNDIS_ACK */
223 uint32_t nvs_status; /* HN_NVS_STATUS_ */
224 uint8_t nvs_rsvd[24];
226 CTASSERT(sizeof(struct hn_nvs_rndis_ack) >= HN_NVS_REQSIZE_MIN);
232 /* Per-packet hash info */
233 #define HN_NDIS_HASH_INFO_SIZE sizeof(uint32_t)
234 #define HN_NDIS_PKTINFO_TYPE_HASHINF NDIS_PKTINFO_TYPE_ORIG_NBLIST
237 /* Per-packet hash value */
238 #define HN_NDIS_HASH_VALUE_SIZE sizeof(uint32_t)
239 #define HN_NDIS_PKTINFO_TYPE_HASHVAL NDIS_PKTINFO_TYPE_PKT_CANCELID
241 /* Per-packet-info size */
242 #define HN_RNDIS_PKTINFO_SIZE(dlen) \
243 __offsetof(struct rndis_pktinfo, rm_data[dlen])
245 #endif /* !_IF_HNREG_H_ */