summaryrefslogtreecommitdiffstats
path: root/drivers/net/netvsc/ndis.h
blob: 2e7ca99b151f21dd1590926f6e4ade7338d7c59b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
/* SPDX-License-Identifier: BSD-3-Clause
 * Copyright (c) 2018 Microsoft Corp.
 * All rights reserved.
 */

#ifndef _NET_NDIS_H_
#define _NET_NDIS_H_

#define	NDIS_MEDIA_STATE_CONNECTED	0
#define	NDIS_MEDIA_STATE_DISCONNECTED	1

#define	NDIS_NETCHANGE_TYPE_POSSIBLE	1
#define	NDIS_NETCHANGE_TYPE_DEFINITE	2
#define	NDIS_NETCHANGE_TYPE_FROMMEDIA	3

#define	NDIS_OFFLOAD_SET_NOCHG		0
#define	NDIS_OFFLOAD_SET_ON		1
#define	NDIS_OFFLOAD_SET_OFF		2

/* a.k.a GRE MAC */
#define	NDIS_ENCAP_TYPE_NVGRE		0x00000001

#define	NDIS_HASH_FUNCTION_MASK		0x000000FF	/* see hash function */
#define	NDIS_HASH_TYPE_MASK		0x00FFFF00	/* see hash type */

/* hash function */
#define	NDIS_HASH_FUNCTION_TOEPLITZ	0x00000001

/* hash type */
#define	NDIS_HASH_IPV4			0x00000100
#define	NDIS_HASH_TCP_IPV4		0x00000200
#define	NDIS_HASH_IPV6			0x00000400
#define	NDIS_HASH_IPV6_EX		0x00000800
#define	NDIS_HASH_TCP_IPV6		0x00001000
#define	NDIS_HASH_TCP_IPV6_EX		0x00002000

#define	NDIS_HASH_KEYSIZE_TOEPLITZ	40
#define	NDIS_HASH_INDCNT		128

#define	NDIS_OBJTYPE_DEFAULT		0x80
#define	NDIS_OBJTYPE_RSS_CAPS		0x88
#define	NDIS_OBJTYPE_RSS_PARAMS		0x89
#define	NDIS_OBJTYPE_OFFLOAD		0xa7

struct ndis_object_hdr {
	uint8_t			ndis_type;	/* NDIS_OBJTYPE_ */
	uint8_t			ndis_rev;	/* type specific */
	uint16_t		ndis_size;	/* incl. this hdr */
} __rte_packed;

/*
 * OID_TCP_OFFLOAD_PARAMETERS
 * ndis_type: NDIS_OBJTYPE_DEFAULT
 */
struct ndis_offload_params {
	struct ndis_object_hdr	ndis_hdr;
	uint8_t			ndis_ip4csum;	/* NDIS_OFFLOAD_PARAM_ */
	uint8_t			ndis_tcp4csum;	/* NDIS_OFFLOAD_PARAM_ */
	uint8_t			ndis_udp4csum;	/* NDIS_OFFLOAD_PARAM_ */
	uint8_t			ndis_tcp6csum;	/* NDIS_OFFLOAD_PARAM_ */
	uint8_t			ndis_udp6csum;	/* NDIS_OFFLOAD_PARAM_ */
	uint8_t			ndis_lsov1;	/* NDIS_OFFLOAD_PARAM_ */
	uint8_t			ndis_ipsecv1;	/* NDIS_OFFLOAD_IPSECV1_ */
	uint8_t			ndis_lsov2_ip4;	/* NDIS_OFFLOAD_LSOV2_ */
	uint8_t			ndis_lsov2_ip6;	/* NDIS_OFFLOAD_LSOV2_ */
	uint8_t			ndis_tcp4conn;	/* 0 */
	uint8_t			ndis_tcp6conn;	/* 0 */
	uint32_t		ndis_flags;	/* 0 */
	/* NDIS >= 6.1 */
	uint8_t			ndis_ipsecv2;	/* NDIS_OFFLOAD_IPSECV2_ */
	uint8_t			ndis_ipsecv2_ip4;/* NDIS_OFFLOAD_IPSECV2_ */
	/* NDIS >= 6.30 */
	uint8_t			ndis_rsc_ip4;	/* NDIS_OFFLOAD_RSC_ */
	uint8_t			ndis_rsc_ip6;	/* NDIS_OFFLOAD_RSC_ */
	uint8_t			ndis_encap;	/* NDIS_OFFLOAD_SET_ */
	uint8_t			ndis_encap_types;/* NDIS_ENCAP_TYPE_ */
};

#define	NDIS_OFFLOAD_PARAMS_SIZE	sizeof(struct ndis_offload_params)
#define	NDIS_OFFLOAD_PARAMS_SIZE_6_1	\
	offsetof(struct ndis_offload_params, ndis_rsc_ip4)

#define	NDIS_OFFLOAD_PARAMS_REV_2	2	/* NDIS 6.1 */
#define	NDIS_OFFLOAD_PARAMS_REV_3	3	/* NDIS 6.30 */

#define	NDIS_OFFLOAD_PARAM_NOCHG	0	/* common */
#define	NDIS_OFFLOAD_PARAM_OFF		1
#define	NDIS_OFFLOAD_PARAM_TX		2
#define	NDIS_OFFLOAD_PARAM_RX		3
#define	NDIS_OFFLOAD_PARAM_TXRX		4

/* NDIS_OFFLOAD_PARAM_NOCHG */
#define	NDIS_OFFLOAD_LSOV1_OFF		1
#define	NDIS_OFFLOAD_LSOV1_ON		2

/* NDIS_OFFLOAD_PARAM_NOCHG */
#define	NDIS_OFFLOAD_IPSECV1_OFF	1
#define	NDIS_OFFLOAD_IPSECV1_AH		2
#define	NDIS_OFFLOAD_IPSECV1_ESP	3
#define	NDIS_OFFLOAD_IPSECV1_AH_ESP	4

/* NDIS_OFFLOAD_PARAM_NOCHG */
#define	NDIS_OFFLOAD_LSOV2_OFF		1
#define	NDIS_OFFLOAD_LSOV2_ON		2

/* NDIS_OFFLOAD_PARAM_NOCHG */
#define	NDIS_OFFLOAD_IPSECV2_OFF	1
#define	NDIS_OFFLOAD_IPSECV2_AH		2
#define	NDIS_OFFLOAD_IPSECV2_ESP	3
#define	NDIS_OFFLOAD_IPSECV2_AH_ESP	4

/* NDIS_OFFLOAD_PARAM_NOCHG */
#define	NDIS_OFFLOAD_RSC_OFF		1
#define	NDIS_OFFLOAD_RSC_ON		2

/*
 * OID_GEN_RECEIVE_SCALE_CAPABILITIES
 * ndis_type: NDIS_OBJTYPE_RSS_CAPS
 */
struct ndis_rss_caps {
	struct ndis_object_hdr		ndis_hdr;
	uint32_t			ndis_caps;	/* NDIS_RSS_CAP_ */
	uint32_t			ndis_nmsi;	/* # of MSIs */
	uint32_t			ndis_nrxr;	/* # of RX rings */
	/* NDIS >= 6.30 */
	uint16_t			ndis_nind;	/* # of indtbl ent. */
	uint16_t			ndis_pad;
} __rte_packed;

#define	NDIS_RSS_CAPS_SIZE		\
	offsetof(struct ndis_rss_caps, ndis_pad)
#define	NDIS_RSS_CAPS_SIZE_6_0		\
	offsetof(struct ndis_rss_caps, ndis_nind)

#define	NDIS_RSS_CAPS_REV_1		1	/* NDIS 6.{0,1,20} */
#define	NDIS_RSS_CAPS_REV_2		2	/* NDIS 6.30 */

#define	NDIS_RSS_CAP_MSI		0x01000000
#define	NDIS_RSS_CAP_CLASSIFY_ISR	0x02000000
#define	NDIS_RSS_CAP_CLASSIFY_DPC	0x04000000
#define	NDIS_RSS_CAP_MSIX		0x08000000
#define	NDIS_RSS_CAP_IPV4		0x00000100
#define	NDIS_RSS_CAP_IPV6		0x00000200
#define	NDIS_RSS_CAP_IPV6_EX		0x00000400
#define	NDIS_RSS_CAP_HASH_TOEPLITZ	NDIS_HASH_FUNCTION_TOEPLITZ
#define	NDIS_RSS_CAP_HASHFUNC_MASK	NDIS_HASH_FUNCTION_MASK

/*
 * OID_GEN_RECEIVE_SCALE_PARAMETERS
 * ndis_type: NDIS_OBJTYPE_RSS_PARAMS
 */
struct ndis_rss_params {
	struct ndis_object_hdr		ndis_hdr;
	uint16_t			ndis_flags;	/* NDIS_RSS_FLAG_ */
	uint16_t			ndis_bcpu;	/* base cpu 0 */
	uint32_t			ndis_hash;	/* NDIS_HASH_ */
	uint16_t			ndis_indsize;	/* indirect table */
	uint32_t			ndis_indoffset;
	uint16_t			ndis_keysize;	/* hash key */
	uint32_t			ndis_keyoffset;
	/* NDIS >= 6.20 */
	uint32_t			ndis_cpumaskoffset;
	uint32_t			ndis_cpumaskcnt;
	uint32_t			ndis_cpumaskentsz;
};

#define	NDIS_RSS_PARAMS_SIZE		sizeof(struct ndis_rss_params)
#define	NDIS_RSS_PARAMS_SIZE_6_0	\
	offsetof(struct ndis_rss_params, ndis_cpumaskoffset)

#define	NDIS_RSS_PARAMS_REV_1		1	/* NDIS 6.0 */
#define	NDIS_RSS_PARAMS_REV_2		2	/* NDIS 6.20 */

#define	NDIS_RSS_FLAG_NONE		0x0000
#define	NDIS_RSS_FLAG_BCPU_UNCHG	0x0001
#define	NDIS_RSS_FLAG_HASH_UNCHG	0x0002
#define	NDIS_RSS_FLAG_IND_UNCHG		0x0004
#define	NDIS_RSS_FLAG_KEY_UNCHG		0x0008
#define	NDIS_RSS_FLAG_DISABLE		0x0010

/* non-standard convenient struct */
struct ndis_rssprm_toeplitz {
	struct ndis_rss_params		rss_params;
	/* Indirect table */
	uint32_t			rss_ind[NDIS_HASH_INDCNT];
	/* Toeplitz hash key */
	uint8_t				rss_key[NDIS_HASH_KEYSIZE_TOEPLITZ];
};

#define	NDIS_RSSPRM_TOEPLITZ_SIZE(nind)	\
	offsetof(struct ndis_rssprm_toeplitz, rss_ind[nind])

/*
 * OID_TCP_OFFLOAD_HARDWARE_CAPABILITIES
 * ndis_type: NDIS_OBJTYPE_OFFLOAD
 */

#define	NDIS_OFFLOAD_ENCAP_NONE		0x0000
#define	NDIS_OFFLOAD_ENCAP_NULL		0x0001
#define	NDIS_OFFLOAD_ENCAP_8023		0x0002
#define	NDIS_OFFLOAD_ENCAP_8023PQ	0x0004
#define	NDIS_OFFLOAD_ENCAP_8023PQ_OOB	0x0008
#define	NDIS_OFFLOAD_ENCAP_RFC1483	0x0010

struct ndis_csum_offload {
	uint32_t			ndis_ip4_txenc;	/*NDIS_OFFLOAD_ENCAP_*/
	uint32_t			ndis_ip4_txcsum;
#define	NDIS_TXCSUM_CAP_IP4OPT		0x001
#define	NDIS_TXCSUM_CAP_TCP4OPT		0x004
#define	NDIS_TXCSUM_CAP_TCP4		0x010
#define	NDIS_TXCSUM_CAP_UDP4		0x040
#define	NDIS_TXCSUM_CAP_IP4		0x100
	uint32_t			ndis_ip4_rxenc;	/*NDIS_OFFLOAD_ENCAP_*/
	uint32_t			ndis_ip4_rxcsum;
#define	NDIS_RXCSUM_CAP_IP4OPT		0x001
#define	NDIS_RXCSUM_CAP_TCP4OPT		0x004
#define	NDIS_RXCSUM_CAP_TCP4		0x010
#define	NDIS_RXCSUM_CAP_UDP4		0x040
#define	NDIS_RXCSUM_CAP_IP4		0x100
	uint32_t			ndis_ip6_txenc;	/*NDIS_OFFLOAD_ENCAP_*/
	uint32_t			ndis_ip6_txcsum;
#define	NDIS_TXCSUM_CAP_IP6EXT		0x001
#define	NDIS_TXCSUM_CAP_TCP6OPT		0x004
#define	NDIS_TXCSUM_CAP_TCP6		0x010
#define	NDIS_TXCSUM_CAP_UDP6		0x040
	uint32_t			ndis_ip6_rxenc;	/*NDIS_OFFLOAD_ENCAP_*/
	uint32_t			ndis_ip6_rxcsum;
#define	NDIS_RXCSUM_CAP_IP6EXT		0x001
#define	NDIS_RXCSUM_CAP_TCP6OPT		0x004
#define	NDIS_RXCSUM_CAP_TCP6		0x010
#define	NDIS_RXCSUM_CAP_UDP6		0x040
};

struct ndis_lsov1_offload {
	uint32_t			ndis_encap;	/*NDIS_OFFLOAD_ENCAP_*/
	uint32_t			ndis_maxsize;
	uint32_t			ndis_minsegs;
	uint32_t			ndis_opts;
};

struct ndis_ipsecv1_offload {
	uint32_t			ndis_encap;	/*NDIS_OFFLOAD_ENCAP_*/
	uint32_t			ndis_ah_esp;
	uint32_t			ndis_xport_tun;
	uint32_t			ndis_ip4_opts;
	uint32_t			ndis_flags;
	uint32_t			ndis_ip4_ah;
	uint32_t			ndis_ip4_esp;
};

struct ndis_lsov2_offload {
	uint32_t			ndis_ip4_encap;	/*NDIS_OFFLOAD_ENCAP_*/
	uint32_t			ndis_ip4_maxsz;
	uint32_t			ndis_ip4_minsg;
	uint32_t			ndis_ip6_encap;	/*NDIS_OFFLOAD_ENCAP_*/
	uint32_t			ndis_ip6_maxsz;
	uint32_t			ndis_ip6_minsg;
	uint32_t			ndis_ip6_opts;
#define	NDIS_LSOV2_CAP_IP6EXT		0x001
#define	NDIS_LSOV2_CAP_TCP6OPT		0x004
};

struct ndis_ipsecv2_offload {
	uint32_t			ndis_encap;	/*NDIS_OFFLOAD_ENCAP_*/
	uint16_t			ndis_ip6;
	uint16_t			ndis_ip4opt;
	uint16_t			ndis_ip6ext;
	uint16_t			ndis_ah;
	uint16_t			ndis_esp;
	uint16_t			ndis_ah_esp;
	uint16_t			ndis_xport;
	uint16_t			ndis_tun;
	uint16_t			ndis_xport_tun;
	uint16_t			ndis_lso;
	uint16_t			ndis_extseq;
	uint32_t			ndis_udp_esp;
	uint32_t			ndis_auth;
	uint32_t			ndis_crypto;
	uint32_t			ndis_sa_caps;
};

struct ndis_rsc_offload {
	uint16_t			ndis_ip4;
	uint16_t			ndis_ip6;
};

struct ndis_encap_offload {
	uint32_t			ndis_flags;
	uint32_t			ndis_maxhdr;
};

struct ndis_offload {
	struct ndis_object_hdr		ndis_hdr;
	struct ndis_csum_offload	ndis_csum;
	struct ndis_lsov1_offload	ndis_lsov1;
	struct ndis_ipsecv1_offload	ndis_ipsecv1;
	struct ndis_lsov2_offload	ndis_lsov2;
	uint32_t			ndis_flags;
	/* NDIS >= 6.1 */
	struct ndis_ipsecv2_offload	ndis_ipsecv2;
	/* NDIS >= 6.30 */
	struct ndis_rsc_offload		ndis_rsc;
	struct ndis_encap_offload	ndis_encap_gre;
};

#define	NDIS_OFFLOAD_SIZE		sizeof(struct ndis_offload)
#define	NDIS_OFFLOAD_SIZE_6_0		offsetof(struct ndis_offload, ndis_ipsecv2)
#define	NDIS_OFFLOAD_SIZE_6_1		offsetof(struct ndis_offload, ndis_rsc)

#define	NDIS_OFFLOAD_REV_1		1	/* NDIS 6.0 */
#define	NDIS_OFFLOAD_REV_2		2	/* NDIS 6.1 */
#define	NDIS_OFFLOAD_REV_3		3	/* NDIS 6.30 */

/*
 * Per-packet-info
 */

/* VLAN */
#define	NDIS_VLAN_INFO_SIZE		sizeof(uint32_t)
#define	NDIS_VLAN_INFO_PRI_MASK		0x0007
#define	NDIS_VLAN_INFO_CFI_MASK		0x0008
#define	NDIS_VLAN_INFO_ID_MASK		0xfff0
#define	NDIS_VLAN_INFO_MAKE(id, pri, cfi)	\
	(((pri) & NDIS_VLAN_INFO_PRI_MASK) |	\
	 (((cfi) & 0x1) << 3) | (((id) & 0xfff) << 4))
#define	NDIS_VLAN_INFO_ID(inf)		(((inf) & NDIS_VLAN_INFO_ID_MASK) >> 4)
#define	NDIS_VLAN_INFO_CFI(inf)		(((inf) & NDIS_VLAN_INFO_CFI_MASK) >> 3)
#define	NDIS_VLAN_INFO_PRI(inf)		((inf) & NDIS_VLAN_INFO_PRI_MASK)

/* Reception checksum */
#define	NDIS_RXCSUM_INFO_SIZE		sizeof(uint32_t)
#define	NDIS_RXCSUM_INFO_TCPCS_FAILED	0x0001
#define	NDIS_RXCSUM_INFO_UDPCS_FAILED	0x0002
#define	NDIS_RXCSUM_INFO_IPCS_FAILED	0x0004
#define	NDIS_RXCSUM_INFO_TCPCS_OK	0x0008
#define	NDIS_RXCSUM_INFO_UDPCS_OK	0x0010
#define	NDIS_RXCSUM_INFO_IPCS_OK	0x0020
#define	NDIS_RXCSUM_INFO_LOOPBACK	0x0040
#define	NDIS_RXCSUM_INFO_TCPCS_INVAL	0x0080
#define	NDIS_RXCSUM_INFO_IPCS_INVAL	0x0100

/* LSOv2 */
#define	NDIS_LSO2_INFO_SIZE		sizeof(uint32_t)
#define	NDIS_LSO2_INFO_MSS_MASK		0x000fffff
#define	NDIS_LSO2_INFO_THOFF_MASK	0x3ff00000
#define	NDIS_LSO2_INFO_ISLSO2		0x40000000
#define	NDIS_LSO2_INFO_ISIPV6		0x80000000

#define	NDIS_LSO2_INFO_MAKE(thoff, mss)				\
	((((uint32_t)(mss)) & NDIS_LSO2_INFO_MSS_MASK) |	\
	 ((((uint32_t)(thoff)) & 0x3ff) << 20) |		\
	 NDIS_LSO2_INFO_ISLSO2)

#define	NDIS_LSO2_INFO_MAKEIPV4(thoff, mss)			\
	NDIS_LSO2_INFO_MAKE((thoff), (mss))

#define	NDIS_LSO2_INFO_MAKEIPV6(thoff, mss)			\
	(NDIS_LSO2_INFO_MAKE((thoff), (mss)) | NDIS_LSO2_INFO_ISIPV6)

/* Transmission checksum */
#define	NDIS_TXCSUM_INFO_SIZE		sizeof(uint32_t)
#define	NDIS_TXCSUM_INFO_IPV4		0x00000001
#define	NDIS_TXCSUM_INFO_IPV6		0x00000002
#define	NDIS_TXCSUM_INFO_TCPCS		0x00000004
#define	NDIS_TXCSUM_INFO_UDPCS		0x00000008
#define	NDIS_TXCSUM_INFO_IPCS		0x00000010
#define	NDIS_TXCSUM_INFO_THOFF		0x03ff0000

#define	NDIS_TXCSUM_INFO_MKL4CS(thoff, flag)			\
	((((uint32_t)(thoff)) << 16) | (flag))

#define	NDIS_TXCSUM_INFO_MKTCPCS(thoff)				\
	NDIS_TXCSUM_INFO_MKL4CS((thoff), NDIS_TXCSUM_INFO_TCPCS)

#define	NDIS_TXCSUM_INFO_MKUDPCS(thoff)				\
	NDIS_TXCSUM_INFO_MKL4CS((thoff), NDIS_TXCSUM_INFO_UDPCS)

#endif	/* !_NET_NDIS_H_ */