1/*	$NetBSD: if_hvnreg.h,v 1.4 2024/02/09 22:08:34 andvar Exp $	*/
2/*	$OpenBSD: if_hvnreg.h,v 1.3 2016/09/14 17:48:28 mikeb Exp $	*/
3
4/*-
5 * Copyright (c) 2016 Microsoft Corp.
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 *    notice unmodified, this list of conditions, and the following
13 *    disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 *    notice, this list of conditions and the following disclaimer in the
16 *    documentation and/or other materials provided with the distribution.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29
30#ifndef _IF_HVNREG_H_
31#define _IF_HVNREG_H_
32
33#define HVN_NVS_PROTO_VERSION_1		0x00002
34#define HVN_NVS_PROTO_VERSION_2		0x30002
35#define HVN_NVS_PROTO_VERSION_4		0x40000
36#define HVN_NVS_PROTO_VERSION_5		0x50000
37
38#define HVN_NVS_RXBUF_SIG		0x2409
39#define HVN_NVS_CHIM_SIG		0x1984
40
41#define HVN_NVS_CHIM_IDX_INVALID	0xffffffff
42
43#define HVN_NVS_RNDIS_MTYPE_DATA	0
44#define HVN_NVS_RNDIS_MTYPE_CTRL	1
45
46/*
47 * NVS message transaction status codes.
48 */
49#define HVN_NVS_STATUS_OK		1
50#define HVN_NVS_STATUS_FAILED		2
51
52/*
53 * NVS request/response message types.
54 */
55#define HVN_NVS_TYPE_INIT		1
56#define HVN_NVS_TYPE_INIT_RESP		2
57#define HVN_NVS_TYPE_NDIS_INIT		100
58#define HVN_NVS_TYPE_RXBUF_CONN		101
59#define HVN_NVS_TYPE_RXBUF_CONNRESP	102
60#define HVN_NVS_TYPE_RXBUF_DISCONN	103
61#define HVN_NVS_TYPE_CHIM_CONN		104
62#define HVN_NVS_TYPE_CHIM_CONNRESP	105
63#define HVN_NVS_TYPE_CHIM_DISCONN	106
64#define HVN_NVS_TYPE_RNDIS		107
65#define HVN_NVS_TYPE_RNDIS_ACK		108
66#define HVN_NVS_TYPE_NDIS_CONF		125
67#define HVN_NVS_TYPE_VFASSOC_NOTE	128	/* notification */
68#define HVN_NVS_TYPE_SET_DATAPATH	129
69#define HVN_NVS_TYPE_SUBCH_REQ		133
70#define HVN_NVS_TYPE_SUBCH_RESP		133	/* same as SUBCH_REQ */
71#define HVN_NVS_TYPE_TXTBL_NOTE		134	/* notification */
72
73/*
74 * Any size less than this one will _not_ work, e.g. hn_nvs_init
75 * only has 12B valid data, however, if only 12B data were sent,
76 * Hypervisor would never reply.
77 */
78#define HVN_NVS_REQSIZE_MIN		32
79
80/* NVS message common header */
81struct hvn_nvs_hdr {
82	uint32_t	nvs_type;
83} __packed;
84
85struct hvn_nvs_init {
86	uint32_t	nvs_type;	/* HVN_NVS_TYPE_INIT */
87	uint32_t	nvs_ver_min;
88	uint32_t	nvs_ver_max;
89	uint8_t		nvs_rsvd[20];
90} __packed;
91
92struct hvn_nvs_init_resp {
93	uint32_t	nvs_type;	/* HVN_NVS_TYPE_INIT_RESP */
94	uint32_t	nvs_ver;	/* deprecated */
95	uint32_t	nvs_rsvd;
96	uint32_t	nvs_status;	/* HVN_NVS_STATUS_ */
97} __packed;
98
99/* No response */
100struct hvn_nvs_ndis_conf {
101	uint32_t	nvs_type;	/* HVN_NVS_TYPE_NDIS_CONF */
102	uint32_t	nvs_mtu;
103	uint32_t	nvs_rsvd;
104	uint64_t	nvs_caps;	/* HVN_NVS_NDIS_CONF_ */
105	uint8_t		nvs_rsvd1[12];
106} __packed;
107
108#define HVN_NVS_NDIS_CONF_SRIOV		0x0004
109#define HVN_NVS_NDIS_CONF_VLAN		0x0008
110
111/* No response */
112struct hvn_nvs_ndis_init {
113	uint32_t	nvs_type;	/* HVN_NVS_TYPE_NDIS_INIT */
114	uint32_t	nvs_ndis_major;	/* NDIS_VERSION_MAJOR_ */
115	uint32_t	nvs_ndis_minor;	/* NDIS_VERSION_MINOR_ */
116	uint8_t		nvs_rsvd[20];
117} __packed;
118
119struct hvn_nvs_rxbuf_conn {
120	uint32_t	nvs_type;	/* HVN_NVS_TYPE_RXBUF_CONN */
121	uint32_t	nvs_gpadl;	/* RXBUF vmbus GPADL */
122	uint16_t	nvs_sig;	/* HVN_NVS_RXBUF_SIG */
123	uint8_t		nvs_rsvd[22];
124} __packed;
125
126struct hvn_nvs_rxbuf_sect {
127	uint32_t	nvs_start;
128	uint32_t	nvs_slotsz;
129	uint32_t	nvs_slotcnt;
130	uint32_t	nvs_end;
131} __packed;
132
133struct hvn_nvs_rxbuf_conn_resp {
134	uint32_t	nvs_type;	/* HVN_NVS_TYPE_RXBUF_CONNRESP */
135	uint32_t	nvs_status;	/* HVN_NVS_STATUS_ */
136	uint32_t	nvs_nsect;	/* # of elem in nvs_sect */
137	struct hvn_nvs_rxbuf_sect nvs_sect[0];
138} __packed;
139
140/* No response */
141struct hvn_nvs_rxbuf_disconn {
142	uint32_t	nvs_type;	/* HVN_NVS_TYPE_RXBUF_DISCONN */
143	uint16_t	nvs_sig;	/* HVN_NVS_RXBUF_SIG */
144	uint8_t		nvs_rsvd[26];
145} __packed;
146
147struct hvn_nvs_chim_conn {
148	uint32_t	nvs_type;	/* HVN_NVS_TYPE_CHIM_CONN */
149	uint32_t	nvs_gpadl;	/* chimney buf vmbus GPADL */
150	uint16_t	nvs_sig;	/* NDIS_NVS_CHIM_SIG */
151	uint8_t		nvs_rsvd[22];
152} __packed;
153
154struct hvn_nvs_chim_conn_resp {
155	uint32_t	nvs_type;	/* HVN_NVS_TYPE_CHIM_CONNRESP */
156	uint32_t	nvs_status;	/* HVN_NVS_STATUS_ */
157	uint32_t	nvs_sectsz;	/* section size */
158} __packed;
159
160/* No response */
161struct hvn_nvs_chim_disconn {
162	uint32_t	nvs_type;	/* HVN_NVS_TYPE_CHIM_DISCONN */
163	uint16_t	nvs_sig;	/* HVN_NVS_CHIM_SIG */
164	uint8_t		nvs_rsvd[26];
165} __packed;
166
167#define HVN_NVS_SUBCH_OP_ALLOC		1
168
169struct hvn_nvs_subch_req {
170	uint32_t	nvs_type;	/* HVN_NVS_TYPE_SUBCH_REQ */
171	uint32_t	nvs_op;		/* HVN_NVS_SUBCH_OP_ */
172	uint32_t	nvs_nsubch;
173	uint8_t		nvs_rsvd[20];
174} __packed;
175
176struct hvn_nvs_subch_resp {
177	uint32_t	nvs_type;	/* HVN_NVS_TYPE_SUBCH_RESP */
178	uint32_t	nvs_status;	/* HVN_NVS_STATUS_ */
179	uint32_t	nvs_nsubch;
180} __packed;
181
182struct hvn_nvs_rndis {
183	uint32_t	nvs_type;	/* HVN_NVS_TYPE_RNDIS */
184	uint32_t	nvs_rndis_mtype;/* HVN_NVS_RNDIS_MTYPE_ */
185	/*
186	 * Chimney sending buffer index and size.
187	 *
188	 * NOTE:
189	 * If nvs_chim_idx is set to HVN_NVS_CHIM_IDX_INVALID
190	 * and nvs_chim_sz is set to 0, then chimney sending
191	 * buffer is _not_ used by this RNDIS message.
192	 */
193	uint32_t	nvs_chim_idx;
194	uint32_t	nvs_chim_sz;
195	uint8_t		nvs_rsvd[16];
196} __packed;
197
198struct hvn_nvs_rndis_ack {
199	uint32_t	nvs_type;	/* HVN_NVS_TYPE_RNDIS_ACK */
200	uint32_t	nvs_status;	/* HVN_NVS_STATUS_ */
201	uint8_t		nvs_rsvd[24];
202} __packed;
203
204/*
205 * RNDIS extension
206 */
207
208/* Per-packet hash info */
209#define HVN_NDIS_HASH_INFO_SIZE		sizeof(uint32_t)
210#define HVN_NDIS_PKTINFO_TYPE_HASHINF	NDIS_PKTINFO_TYPE_ORIG_NBLIST
211/* NDIS_HASH_ */
212
213/* Per-packet hash value */
214#define HVN_NDIS_HASH_VALUE_SIZE		sizeof(uint32_t)
215#define HVN_NDIS_PKTINFO_TYPE_HASHVAL	NDIS_PKTINFO_TYPE_PKT_CANCELID
216
217/* Per-packet-info size */
218#define HVN_RNDIS_PKTINFO_SIZE(dlen) \
219	offsetof(struct rndis_pktinfo, rm_data[dlen])
220
221#endif	/* _IF_HVNREG_H_ */
222