]> CyberLeo.Net >> Repos - FreeBSD/stable/10.git/blob - sys/dev/hyperv/netvsc/if_hnreg.h
MFC 308664,308742,308743
[FreeBSD/stable/10.git] / sys / dev / hyperv / netvsc / if_hnreg.h
1 /*-
2  * Copyright (c) 2016 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$
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 */
95 struct hn_nvs_hdr {
96         uint32_t        nvs_type;
97 } __packed;
98
99 struct 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;
105 CTASSERT(sizeof(struct hn_nvs_init) >= HN_NVS_REQSIZE_MIN);
106
107 struct 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 */
115 struct 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;
122 CTASSERT(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 */
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];
133 } __packed;
134 CTASSERT(sizeof(struct hn_nvs_ndis_init) >= HN_NVS_REQSIZE_MIN);
135
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];
141 } __packed;
142 CTASSERT(sizeof(struct hn_nvs_rxbuf_conn) >= HN_NVS_REQSIZE_MIN);
143
144 struct hn_nvs_rxbuf_sect {
145         uint32_t        nvs_start;
146         uint32_t        nvs_slotsz;
147         uint32_t        nvs_slotcnt;
148         uint32_t        nvs_end;
149 } __packed;
150
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[];
156 } __packed;
157
158 /* No response */
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];
163 } __packed;
164 CTASSERT(sizeof(struct hn_nvs_rxbuf_disconn) >= HN_NVS_REQSIZE_MIN);
165
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];
171 } __packed;
172 CTASSERT(sizeof(struct hn_nvs_chim_conn) >= HN_NVS_REQSIZE_MIN);
173
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 */
178 } __packed;
179
180 /* No response */
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];
185 } __packed;
186 CTASSERT(sizeof(struct hn_nvs_chim_disconn) >= HN_NVS_REQSIZE_MIN);
187
188 #define HN_NVS_SUBCH_OP_ALLOC           1
189
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_ */
193         uint32_t        nvs_nsubch;
194         uint8_t         nvs_rsvd[20];
195 } __packed;
196 CTASSERT(sizeof(struct hn_nvs_subch_req) >= HN_NVS_REQSIZE_MIN);
197
198 struct hn_nvs_subch_resp {
199         uint32_t        nvs_type;       /* HN_NVS_TYPE_SUBCH_RESP */
200         uint32_t        nvs_status;     /* HN_NVS_STATUS_ */
201         uint32_t        nvs_nsubch;
202 } __packed;
203
204 struct hn_nvs_rndis {
205         uint32_t        nvs_type;       /* HN_NVS_TYPE_RNDIS */
206         uint32_t        nvs_rndis_mtype;/* HN_NVS_RNDIS_MTYPE_ */
207         /*
208          * Chimney sending buffer index and size.
209          *
210          * NOTE:
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.
214          */
215         uint32_t        nvs_chim_idx;
216         uint32_t        nvs_chim_sz;
217         uint8_t         nvs_rsvd[16];
218 } __packed;
219 CTASSERT(sizeof(struct hn_nvs_rndis) >= HN_NVS_REQSIZE_MIN);
220
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];
225 } __packed;
226 CTASSERT(sizeof(struct hn_nvs_rndis_ack) >= HN_NVS_REQSIZE_MIN);
227
228 /*
229  * RNDIS extension
230  */
231
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
235 /* NDIS_HASH_ */
236
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
240
241 /* Per-packet-info size */
242 #define HN_RNDIS_PKTINFO_SIZE(dlen)     \
243         __offsetof(struct rndis_pktinfo, rm_data[dlen])
244
245 #endif  /* !_IF_HNREG_H_ */