1 1.2 nonaka /* $NetBSD: vmbusicreg.h,v 1.2 2019/03/01 10:02:33 nonaka Exp $ */ 2 1.1 nonaka /* $OpenBSD: hypervicreg.h,v 1.6 2017/11/07 16:49:42 mikeb Exp $ */ 3 1.1 nonaka 4 1.1 nonaka /*- 5 1.1 nonaka * Copyright (c) 2016 Microsoft Corp. 6 1.1 nonaka * All rights reserved. 7 1.1 nonaka * 8 1.1 nonaka * Redistribution and use in source and binary forms, with or without 9 1.1 nonaka * modification, are permitted provided that the following conditions 10 1.1 nonaka * are met: 11 1.1 nonaka * 1. Redistributions of source code must retain the above copyright 12 1.1 nonaka * notice unmodified, this list of conditions, and the following 13 1.1 nonaka * disclaimer. 14 1.1 nonaka * 2. Redistributions in binary form must reproduce the above copyright 15 1.1 nonaka * notice, this list of conditions and the following disclaimer in the 16 1.1 nonaka * documentation and/or other materials provided with the distribution. 17 1.1 nonaka * 18 1.1 nonaka * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 19 1.1 nonaka * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 20 1.1 nonaka * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 21 1.1 nonaka * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 22 1.1 nonaka * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 23 1.1 nonaka * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24 1.1 nonaka * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 1.1 nonaka * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 1.1 nonaka * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 27 1.1 nonaka * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 1.1 nonaka * 29 1.1 nonaka * $FreeBSD: head/sys/dev/hyperv/utilities/vmbus_icreg.h 305281 2016-09-02 06:23:28Z sephe $ 30 1.1 nonaka */ 31 1.1 nonaka 32 1.1 nonaka #ifndef _VMBUSICREG_H_ 33 1.1 nonaka #define _VMBUSICREG_H_ 34 1.1 nonaka 35 1.1 nonaka #define VMBUS_ICMSG_TYPE_NEGOTIATE 0 36 1.1 nonaka #define VMBUS_ICMSG_TYPE_HEARTBEAT 1 37 1.1 nonaka #define VMBUS_ICMSG_TYPE_KVP 2 38 1.1 nonaka #define VMBUS_ICMSG_TYPE_SHUTDOWN 3 39 1.1 nonaka #define VMBUS_ICMSG_TYPE_TIMESYNC 4 40 1.1 nonaka #define VMBUS_ICMSG_TYPE_VSS 5 41 1.1 nonaka 42 1.1 nonaka #define VMBUS_ICMSG_STATUS_OK 0x00000000 43 1.1 nonaka #define VMBUS_ICMSG_STATUS_FAIL 0x80004005 44 1.1 nonaka 45 1.1 nonaka #define VMBUS_IC_VERSION(major, minor) ((major) | (((uint32_t)(minor)) << 16)) 46 1.1 nonaka #define VMBUS_ICVER_MAJOR(ver) ((ver) & 0xffff) 47 1.1 nonaka #define VMBUS_ICVER_MINOR(ver) (((ver) & 0xffff0000) >> 16) 48 1.1 nonaka #define VMBUS_ICVER_SWAP(ver) \ 49 1.1 nonaka ((VMBUS_ICVER_MAJOR((ver)) << 16) | VMBUS_ICVER_MINOR((ver))) 50 1.1 nonaka #define VMBUS_ICVER_LE(v1, v2) \ 51 1.1 nonaka (VMBUS_ICVER_SWAP((v1)) <= VMBUS_ICVER_SWAP((v2))) 52 1.1 nonaka #define VMBUS_ICVER_GT(v1, v2) \ 53 1.1 nonaka (VMBUS_ICVER_SWAP((v1)) > VMBUS_ICVER_SWAP((v2))) 54 1.1 nonaka 55 1.1 nonaka struct vmbus_pipe_hdr { 56 1.1 nonaka uint32_t ph_flags; 57 1.1 nonaka uint32_t ph_msgsz; 58 1.1 nonaka } __packed; 59 1.1 nonaka 60 1.1 nonaka struct vmbus_icmsg_hdr { 61 1.1 nonaka struct vmbus_pipe_hdr ic_pipe; 62 1.1 nonaka uint32_t ic_fwver; /* framework version */ 63 1.1 nonaka uint16_t ic_type; 64 1.1 nonaka uint32_t ic_msgver; /* message version */ 65 1.1 nonaka uint16_t ic_dsize; /* data size */ 66 1.1 nonaka uint32_t ic_status; /* VMBUS_ICMSG_STATUS_ */ 67 1.1 nonaka uint8_t ic_tid; 68 1.1 nonaka uint8_t ic_flags; /* VMBUS_ICMSG_FLAG_ */ 69 1.1 nonaka uint8_t ic_rsvd[2]; 70 1.1 nonaka } __packed; 71 1.1 nonaka 72 1.1 nonaka #define VMBUS_ICMSG_FLAG_TRANSACTION 1 73 1.1 nonaka #define VMBUS_ICMSG_FLAG_REQUEST 2 74 1.1 nonaka #define VMBUS_ICMSG_FLAG_RESPONSE 4 75 1.1 nonaka 76 1.1 nonaka /* VMBUS_ICMSG_TYPE_NEGOTIATE */ 77 1.1 nonaka struct vmbus_icmsg_negotiate { 78 1.1 nonaka struct vmbus_icmsg_hdr ic_hdr; 79 1.1 nonaka uint16_t ic_fwver_cnt; 80 1.1 nonaka uint16_t ic_msgver_cnt; 81 1.1 nonaka uint32_t ic_rsvd; 82 1.1 nonaka /* 83 1.1 nonaka * This version array contains two set of supported 84 1.1 nonaka * versions: 85 1.1 nonaka * - The first set consists of #ic_fwver_cnt supported framework 86 1.1 nonaka * versions. 87 1.1 nonaka * - The second set consists of #ic_msgver_cnt supported message 88 1.1 nonaka * versions. 89 1.1 nonaka */ 90 1.1 nonaka uint32_t ic_ver[0]; 91 1.1 nonaka } __packed; 92 1.1 nonaka 93 1.1 nonaka /* VMBUS_ICMSG_TYPE_HEARTBEAT */ 94 1.1 nonaka struct vmbus_icmsg_heartbeat { 95 1.1 nonaka struct vmbus_icmsg_hdr ic_hdr; 96 1.1 nonaka uint64_t ic_seq; 97 1.1 nonaka uint32_t ic_rsvd[8]; 98 1.1 nonaka } __packed; 99 1.1 nonaka 100 1.1 nonaka #define VMBUS_ICMSG_HEARTBEAT_SIZE_MIN \ 101 1.1 nonaka offsetof(struct vmbus_icmsg_heartbeat, ic_rsvd[0]) 102 1.1 nonaka 103 1.1 nonaka /* VMBUS_ICMSG_TYPE_SHUTDOWN */ 104 1.1 nonaka struct vmbus_icmsg_shutdown { 105 1.1 nonaka struct vmbus_icmsg_hdr ic_hdr; 106 1.1 nonaka uint32_t ic_code; 107 1.1 nonaka uint32_t ic_timeo; 108 1.1 nonaka uint32_t ic_haltflags; 109 1.1 nonaka uint8_t ic_msg[2048]; 110 1.1 nonaka } __packed; 111 1.1 nonaka 112 1.1 nonaka #define VMBUS_ICMSG_SHUTDOWN_SIZE_MIN \ 113 1.1 nonaka offsetof(struct vmbus_icmsg_shutdown, ic_msg[0]) 114 1.1 nonaka 115 1.1 nonaka /* VMBUS_ICMSG_TYPE_TIMESYNC */ 116 1.1 nonaka struct vmbus_icmsg_timesync { 117 1.1 nonaka struct vmbus_icmsg_hdr ic_hdr; 118 1.1 nonaka uint64_t ic_hvtime; 119 1.1 nonaka uint64_t ic_vmtime; 120 1.1 nonaka uint64_t ic_rtt; 121 1.1 nonaka uint8_t ic_tsflags; /* VMBUS_ICMSG_TS_FLAG_ */ 122 1.1 nonaka } __packed; 123 1.1 nonaka 124 1.1 nonaka /* VMBUS_ICMSG_TYPE_TIMESYNC, MSGVER4 */ 125 1.1 nonaka struct vmbus_icmsg_timesync4 { 126 1.1 nonaka struct vmbus_icmsg_hdr ic_hdr; 127 1.1 nonaka uint64_t ic_hvtime; 128 1.1 nonaka uint64_t ic_sent_tc; 129 1.1 nonaka uint8_t ic_tsflags; /* VMBUS_ICMSG_TS_FLAG_ */ 130 1.1 nonaka uint8_t ic_rsvd[5]; 131 1.1 nonaka } __packed; 132 1.1 nonaka 133 1.1 nonaka #define VMBUS_ICMSG_TS_FLAG_SYNC 0x01 134 1.1 nonaka #define VMBUS_ICMSG_TS_FLAG_SAMPLE 0x02 135 1.1 nonaka 136 1.1 nonaka #define VMBUS_ICMSG_TS_BASE 116444736000000000ULL 137 1.1 nonaka 138 1.1 nonaka /* Registry value types */ 139 1.1 nonaka #define VMBUS_KVP_REG_SZ 1 140 1.1 nonaka #define VMBUS_KVP_REG_U32 4 141 1.1 nonaka #define VMBUS_KVP_REG_U64 8 142 1.1 nonaka 143 1.1 nonaka /* Hyper-V status codes */ 144 1.1 nonaka #define VMBUS_KVP_S_OK 0x00000000 145 1.1 nonaka #define VMBUS_KVP_E_FAIL 0x80004005 146 1.1 nonaka #define VMBUS_KVP_S_CONT 0x80070103 147 1.1 nonaka 148 1.1 nonaka #define VMBUS_KVP_MAX_VAL_SIZE 2048 149 1.1 nonaka #define VMBUS_KVP_MAX_KEY_SIZE 512 150 1.1 nonaka 151 1.1 nonaka enum vmbus_kvp_op { 152 1.1 nonaka VMBUS_KVP_OP_GET = 0, 153 1.1 nonaka VMBUS_KVP_OP_SET, 154 1.1 nonaka VMBUS_KVP_OP_DELETE, 155 1.1 nonaka VMBUS_KVP_OP_ENUMERATE, 156 1.1 nonaka VMBUS_KVP_OP_GET_IP_INFO, 157 1.1 nonaka VMBUS_KVP_OP_SET_IP_INFO, 158 1.1 nonaka VMBUS_KVP_OP_COUNT 159 1.1 nonaka }; 160 1.1 nonaka 161 1.1 nonaka enum vmbus_kvp_pool { 162 1.1 nonaka VMBUS_KVP_POOL_EXTERNAL = 0, 163 1.1 nonaka VMBUS_KVP_POOL_GUEST, 164 1.1 nonaka VMBUS_KVP_POOL_AUTO, 165 1.1 nonaka VMBUS_KVP_POOL_AUTO_EXTERNAL, 166 1.1 nonaka VMBUS_KVP_POOL_COUNT 167 1.1 nonaka }; 168 1.1 nonaka 169 1.1 nonaka union vmbus_kvp_hdr { 170 1.1 nonaka struct { 171 1.1 nonaka uint8_t kvu_op; 172 1.1 nonaka uint8_t kvu_pool; 173 1.1 nonaka uint16_t kvu_pad; 174 1.1 nonaka } req; 175 1.1 nonaka struct { 176 1.1 nonaka uint32_t kvu_err; 177 1.1 nonaka } rsp; 178 1.1 nonaka #define kvh_op req.kvu_op 179 1.1 nonaka #define kvh_pool req.kvu_pool 180 1.1 nonaka #define kvh_err rsp.kvu_err 181 1.1 nonaka } __packed; 182 1.1 nonaka 183 1.1 nonaka struct vmbus_kvp_msg_val { 184 1.1 nonaka uint32_t kvm_valtype; 185 1.1 nonaka uint32_t kvm_keylen; 186 1.1 nonaka uint32_t kvm_vallen; 187 1.1 nonaka uint8_t kvm_key[VMBUS_KVP_MAX_KEY_SIZE]; 188 1.1 nonaka uint8_t kvm_val[VMBUS_KVP_MAX_VAL_SIZE]; 189 1.1 nonaka } __packed; 190 1.1 nonaka 191 1.1 nonaka struct vmbus_kvp_msg_enum { 192 1.1 nonaka uint32_t kvm_index; 193 1.1 nonaka uint32_t kvm_valtype; 194 1.1 nonaka uint32_t kvm_keylen; 195 1.1 nonaka uint32_t kvm_vallen; 196 1.1 nonaka uint8_t kvm_key[VMBUS_KVP_MAX_KEY_SIZE]; 197 1.1 nonaka uint8_t kvm_val[VMBUS_KVP_MAX_VAL_SIZE]; 198 1.1 nonaka } __packed; 199 1.1 nonaka 200 1.1 nonaka struct vmbus_kvp_msg_del { 201 1.1 nonaka uint32_t kvm_keylen; 202 1.1 nonaka uint8_t kvm_key[VMBUS_KVP_MAX_KEY_SIZE]; 203 1.1 nonaka } __packed; 204 1.1 nonaka 205 1.1 nonaka #define ADDR_FAMILY_NONE 0x00 206 1.1 nonaka #define ADDR_FAMILY_IPV4 0x01 207 1.1 nonaka #define ADDR_FAMILY_IPV6 0x02 208 1.1 nonaka 209 1.1 nonaka #define MAX_MAC_ADDR_SIZE 256 210 1.1 nonaka #define MAX_IP_ADDR_SIZE 2048 211 1.1 nonaka #define MAX_GATEWAY_SIZE 1024 212 1.1 nonaka 213 1.1 nonaka struct vmbus_kvp_msg_addr { 214 1.1 nonaka uint8_t kvm_mac[MAX_MAC_ADDR_SIZE]; 215 1.1 nonaka uint8_t kvm_family; 216 1.1 nonaka uint8_t kvm_dhcp; 217 1.1 nonaka uint8_t kvm_addr[MAX_IP_ADDR_SIZE]; 218 1.1 nonaka uint8_t kvm_netmask[MAX_IP_ADDR_SIZE]; 219 1.1 nonaka uint8_t kvm_gateway[MAX_GATEWAY_SIZE]; 220 1.1 nonaka uint8_t kvm_dns[MAX_IP_ADDR_SIZE]; 221 1.1 nonaka } __packed; 222 1.1 nonaka 223 1.1 nonaka union vmbus_kvp_msg { 224 1.1 nonaka struct vmbus_kvp_msg_val kvm_val; 225 1.1 nonaka struct vmbus_kvp_msg_enum kvm_enum; 226 1.1 nonaka struct vmbus_kvp_msg_del kvm_del; 227 1.1 nonaka }; 228 1.1 nonaka 229 1.1 nonaka struct vmbus_icmsg_kvp { 230 1.1 nonaka struct vmbus_icmsg_hdr ic_hdr; 231 1.1 nonaka union vmbus_kvp_hdr ic_kvh; 232 1.1 nonaka union vmbus_kvp_msg ic_kvm; 233 1.1 nonaka } __packed; 234 1.1 nonaka 235 1.1 nonaka struct vmbus_icmsg_kvp_addr { 236 1.1 nonaka struct vmbus_icmsg_hdr ic_hdr; 237 1.1 nonaka struct { 238 1.1 nonaka struct { 239 1.1 nonaka uint8_t kvu_op; 240 1.1 nonaka uint8_t kvu_pool; 241 1.1 nonaka } req; 242 1.1 nonaka } ic_kvh; 243 1.1 nonaka struct vmbus_kvp_msg_addr ic_kvm; 244 1.1 nonaka } __packed; 245 1.1 nonaka 246 1.1 nonaka #endif /* _VMBUSICREG_H_ */ 247