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