1/*	$NetBSD: vmbusicreg.h,v 1.2 2019/03/01 10:02:33 nonaka Exp $	*/
2/*	$OpenBSD: hypervicreg.h,v 1.6 2017/11/07 16:49:42 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 * $FreeBSD: head/sys/dev/hyperv/utilities/vmbus_icreg.h 305281 2016-09-02 06:23:28Z sephe $
30 */
31
32#ifndef _VMBUSICREG_H_
33#define _VMBUSICREG_H_
34
35#define VMBUS_ICMSG_TYPE_NEGOTIATE	0
36#define VMBUS_ICMSG_TYPE_HEARTBEAT	1
37#define VMBUS_ICMSG_TYPE_KVP		2
38#define VMBUS_ICMSG_TYPE_SHUTDOWN	3
39#define VMBUS_ICMSG_TYPE_TIMESYNC	4
40#define VMBUS_ICMSG_TYPE_VSS		5
41
42#define VMBUS_ICMSG_STATUS_OK		0x00000000
43#define VMBUS_ICMSG_STATUS_FAIL		0x80004005
44
45#define VMBUS_IC_VERSION(major, minor)	((major) | (((uint32_t)(minor)) << 16))
46#define VMBUS_ICVER_MAJOR(ver)		((ver) & 0xffff)
47#define VMBUS_ICVER_MINOR(ver)		(((ver) & 0xffff0000) >> 16)
48#define VMBUS_ICVER_SWAP(ver)		\
49            ((VMBUS_ICVER_MAJOR((ver)) << 16) | VMBUS_ICVER_MINOR((ver)))
50#define VMBUS_ICVER_LE(v1, v2)		\
51            (VMBUS_ICVER_SWAP((v1)) <= VMBUS_ICVER_SWAP((v2)))
52#define VMBUS_ICVER_GT(v1, v2)		\
53            (VMBUS_ICVER_SWAP((v1)) > VMBUS_ICVER_SWAP((v2)))
54
55struct vmbus_pipe_hdr {
56	uint32_t		ph_flags;
57	uint32_t		ph_msgsz;
58} __packed;
59
60struct vmbus_icmsg_hdr {
61	struct vmbus_pipe_hdr	ic_pipe;
62	uint32_t		ic_fwver;	/* framework version */
63	uint16_t		ic_type;
64	uint32_t		ic_msgver;	/* message version */
65	uint16_t		ic_dsize;	/* data size */
66	uint32_t		ic_status;	/* VMBUS_ICMSG_STATUS_ */
67	uint8_t			ic_tid;
68	uint8_t			ic_flags;	/* VMBUS_ICMSG_FLAG_ */
69	uint8_t			ic_rsvd[2];
70} __packed;
71
72#define VMBUS_ICMSG_FLAG_TRANSACTION	1
73#define VMBUS_ICMSG_FLAG_REQUEST	2
74#define VMBUS_ICMSG_FLAG_RESPONSE	4
75
76/* VMBUS_ICMSG_TYPE_NEGOTIATE */
77struct vmbus_icmsg_negotiate {
78	struct vmbus_icmsg_hdr	ic_hdr;
79	uint16_t		ic_fwver_cnt;
80	uint16_t		ic_msgver_cnt;
81	uint32_t		ic_rsvd;
82	/*
83	 * This version array contains two set of supported
84	 * versions:
85	 * - The first set consists of #ic_fwver_cnt supported framework
86	 *   versions.
87	 * - The second set consists of #ic_msgver_cnt supported message
88	 *   versions.
89	 */
90	uint32_t		ic_ver[0];
91} __packed;
92
93/* VMBUS_ICMSG_TYPE_HEARTBEAT */
94struct vmbus_icmsg_heartbeat {
95	struct vmbus_icmsg_hdr	ic_hdr;
96	uint64_t		ic_seq;
97	uint32_t		ic_rsvd[8];
98} __packed;
99
100#define VMBUS_ICMSG_HEARTBEAT_SIZE_MIN	\
101	    offsetof(struct vmbus_icmsg_heartbeat, ic_rsvd[0])
102
103/* VMBUS_ICMSG_TYPE_SHUTDOWN */
104struct vmbus_icmsg_shutdown {
105	struct vmbus_icmsg_hdr	ic_hdr;
106	uint32_t		ic_code;
107	uint32_t		ic_timeo;
108	uint32_t 		ic_haltflags;
109	uint8_t			ic_msg[2048];
110} __packed;
111
112#define VMBUS_ICMSG_SHUTDOWN_SIZE_MIN	\
113	    offsetof(struct vmbus_icmsg_shutdown, ic_msg[0])
114
115/* VMBUS_ICMSG_TYPE_TIMESYNC */
116struct vmbus_icmsg_timesync {
117	struct vmbus_icmsg_hdr	ic_hdr;
118	uint64_t		ic_hvtime;
119	uint64_t		ic_vmtime;
120	uint64_t		ic_rtt;
121	uint8_t			ic_tsflags;	/* VMBUS_ICMSG_TS_FLAG_ */
122} __packed;
123
124/* VMBUS_ICMSG_TYPE_TIMESYNC, MSGVER4 */
125struct vmbus_icmsg_timesync4 {
126	struct vmbus_icmsg_hdr	ic_hdr;
127	uint64_t		ic_hvtime;
128	uint64_t		ic_sent_tc;
129	uint8_t			ic_tsflags;	/* VMBUS_ICMSG_TS_FLAG_ */
130	uint8_t			ic_rsvd[5];
131} __packed;
132
133#define VMBUS_ICMSG_TS_FLAG_SYNC	0x01
134#define VMBUS_ICMSG_TS_FLAG_SAMPLE	0x02
135
136#define VMBUS_ICMSG_TS_BASE		116444736000000000ULL
137
138/* Registry value types */
139#define VMBUS_KVP_REG_SZ		1
140#define VMBUS_KVP_REG_U32		4
141#define VMBUS_KVP_REG_U64		8
142
143/* Hyper-V status codes */
144#define VMBUS_KVP_S_OK			0x00000000
145#define VMBUS_KVP_E_FAIL		0x80004005
146#define VMBUS_KVP_S_CONT		0x80070103
147
148#define VMBUS_KVP_MAX_VAL_SIZE		2048
149#define VMBUS_KVP_MAX_KEY_SIZE		512
150
151enum vmbus_kvp_op {
152	VMBUS_KVP_OP_GET = 0,
153	VMBUS_KVP_OP_SET,
154	VMBUS_KVP_OP_DELETE,
155	VMBUS_KVP_OP_ENUMERATE,
156	VMBUS_KVP_OP_GET_IP_INFO,
157	VMBUS_KVP_OP_SET_IP_INFO,
158	VMBUS_KVP_OP_COUNT
159};
160
161enum vmbus_kvp_pool {
162	VMBUS_KVP_POOL_EXTERNAL = 0,
163	VMBUS_KVP_POOL_GUEST,
164	VMBUS_KVP_POOL_AUTO,
165	VMBUS_KVP_POOL_AUTO_EXTERNAL,
166	VMBUS_KVP_POOL_COUNT
167};
168
169union vmbus_kvp_hdr {
170	struct {
171		uint8_t		kvu_op;
172		uint8_t		kvu_pool;
173		uint16_t	kvu_pad;
174	} req;
175	struct {
176		uint32_t	kvu_err;
177	} rsp;
178#define kvh_op			req.kvu_op
179#define kvh_pool		req.kvu_pool
180#define kvh_err			rsp.kvu_err
181} __packed;
182
183struct vmbus_kvp_msg_val {
184	uint32_t		kvm_valtype;
185	uint32_t		kvm_keylen;
186	uint32_t		kvm_vallen;
187	uint8_t			kvm_key[VMBUS_KVP_MAX_KEY_SIZE];
188	uint8_t			kvm_val[VMBUS_KVP_MAX_VAL_SIZE];
189} __packed;
190
191struct vmbus_kvp_msg_enum {
192	uint32_t		kvm_index;
193	uint32_t		kvm_valtype;
194	uint32_t		kvm_keylen;
195	uint32_t		kvm_vallen;
196	uint8_t			kvm_key[VMBUS_KVP_MAX_KEY_SIZE];
197	uint8_t			kvm_val[VMBUS_KVP_MAX_VAL_SIZE];
198} __packed;
199
200struct vmbus_kvp_msg_del {
201	uint32_t		kvm_keylen;
202	uint8_t			kvm_key[VMBUS_KVP_MAX_KEY_SIZE];
203} __packed;
204
205#define ADDR_FAMILY_NONE	0x00
206#define ADDR_FAMILY_IPV4	0x01
207#define ADDR_FAMILY_IPV6	0x02
208
209#define MAX_MAC_ADDR_SIZE	256
210#define MAX_IP_ADDR_SIZE	2048
211#define MAX_GATEWAY_SIZE	1024
212
213struct vmbus_kvp_msg_addr {
214	uint8_t			kvm_mac[MAX_MAC_ADDR_SIZE];
215	uint8_t			kvm_family;
216	uint8_t			kvm_dhcp;
217	uint8_t			kvm_addr[MAX_IP_ADDR_SIZE];
218	uint8_t			kvm_netmask[MAX_IP_ADDR_SIZE];
219	uint8_t			kvm_gateway[MAX_GATEWAY_SIZE];
220	uint8_t			kvm_dns[MAX_IP_ADDR_SIZE];
221} __packed;
222
223union vmbus_kvp_msg {
224	struct vmbus_kvp_msg_val	kvm_val;
225	struct vmbus_kvp_msg_enum	kvm_enum;
226	struct vmbus_kvp_msg_del	kvm_del;
227};
228
229struct vmbus_icmsg_kvp {
230	struct vmbus_icmsg_hdr	ic_hdr;
231	union vmbus_kvp_hdr	ic_kvh;
232	union vmbus_kvp_msg	ic_kvm;
233} __packed;
234
235struct vmbus_icmsg_kvp_addr {
236	struct vmbus_icmsg_hdr	ic_hdr;
237	struct {
238		struct {
239			uint8_t	kvu_op;
240			uint8_t	kvu_pool;
241		} req;
242	}			ic_kvh;
243	struct vmbus_kvp_msg_addr ic_kvm;
244} __packed;
245
246#endif	/* _VMBUSICREG_H_ */
247