2016-08-11 06:14:54 +00:00
|
|
|
/*-
|
|
|
|
* Copyright (c) 2016 Microsoft Corp.
|
|
|
|
* All rights reserved.
|
|
|
|
*
|
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
|
|
* modification, are permitted provided that the following conditions
|
|
|
|
* are met:
|
|
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
|
|
* notice unmodified, this list of conditions, and the following
|
|
|
|
* disclaimer.
|
|
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
|
|
* documentation and/or other materials provided with the distribution.
|
|
|
|
*
|
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
|
|
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
|
|
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
|
|
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
|
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
|
|
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
|
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
|
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
|
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
|
|
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
*
|
|
|
|
* $FreeBSD$
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef _IF_HNREG_H_
|
|
|
|
#define _IF_HNREG_H_
|
|
|
|
|
|
|
|
#include <sys/param.h>
|
|
|
|
#include <sys/systm.h>
|
|
|
|
|
2016-09-07 09:20:58 +00:00
|
|
|
/*
|
|
|
|
* NDIS protocol version numbers
|
|
|
|
*/
|
|
|
|
#define HN_NDIS_VERSION_6_1 0x00060001
|
2016-10-21 07:37:29 +00:00
|
|
|
#define HN_NDIS_VERSION_6_20 0x00060014
|
2016-09-07 09:20:58 +00:00
|
|
|
#define HN_NDIS_VERSION_6_30 0x0006001e
|
|
|
|
#define HN_NDIS_VERSION_MAJOR(ver) (((ver) & 0xffff0000) >> 16)
|
|
|
|
#define HN_NDIS_VERSION_MINOR(ver) ((ver) & 0xffff)
|
|
|
|
|
2016-09-08 06:23:08 +00:00
|
|
|
/*
|
|
|
|
* NVS versions.
|
|
|
|
*/
|
|
|
|
#define HN_NVS_VERSION_1 0x00002
|
|
|
|
#define HN_NVS_VERSION_2 0x30002
|
|
|
|
#define HN_NVS_VERSION_4 0x40000
|
|
|
|
#define HN_NVS_VERSION_5 0x50000
|
|
|
|
|
2016-08-12 08:07:56 +00:00
|
|
|
#define HN_NVS_RXBUF_SIG 0xcafe
|
2016-08-12 08:21:02 +00:00
|
|
|
#define HN_NVS_CHIM_SIG 0xface
|
2016-08-12 08:07:56 +00:00
|
|
|
|
2016-08-16 07:37:02 +00:00
|
|
|
#define HN_NVS_CHIM_IDX_INVALID 0xffffffff
|
|
|
|
|
|
|
|
#define HN_NVS_RNDIS_MTYPE_DATA 0
|
|
|
|
#define HN_NVS_RNDIS_MTYPE_CTRL 1
|
|
|
|
|
|
|
|
/*
|
|
|
|
* NVS message transacion status codes.
|
|
|
|
*/
|
2016-08-11 06:14:54 +00:00
|
|
|
#define HN_NVS_STATUS_OK 1
|
2016-08-17 05:25:47 +00:00
|
|
|
#define HN_NVS_STATUS_FAILED 2
|
2016-08-11 06:14:54 +00:00
|
|
|
|
2016-08-16 07:37:02 +00:00
|
|
|
/*
|
|
|
|
* NVS request/response message types.
|
|
|
|
*/
|
2016-08-11 06:14:54 +00:00
|
|
|
#define HN_NVS_TYPE_INIT 1
|
|
|
|
#define HN_NVS_TYPE_INIT_RESP 2
|
2016-08-12 07:57:03 +00:00
|
|
|
#define HN_NVS_TYPE_NDIS_INIT 100
|
2016-08-12 08:07:56 +00:00
|
|
|
#define HN_NVS_TYPE_RXBUF_CONN 101
|
|
|
|
#define HN_NVS_TYPE_RXBUF_CONNRESP 102
|
2016-08-12 08:29:26 +00:00
|
|
|
#define HN_NVS_TYPE_RXBUF_DISCONN 103
|
2016-08-12 08:21:02 +00:00
|
|
|
#define HN_NVS_TYPE_CHIM_CONN 104
|
|
|
|
#define HN_NVS_TYPE_CHIM_CONNRESP 105
|
2016-08-15 05:00:37 +00:00
|
|
|
#define HN_NVS_TYPE_CHIM_DISCONN 106
|
2016-08-16 07:37:02 +00:00
|
|
|
#define HN_NVS_TYPE_RNDIS 107
|
2016-08-17 05:25:47 +00:00
|
|
|
#define HN_NVS_TYPE_RNDIS_ACK 108
|
2016-08-12 07:14:40 +00:00
|
|
|
#define HN_NVS_TYPE_NDIS_CONF 125
|
2016-08-17 05:14:26 +00:00
|
|
|
#define HN_NVS_TYPE_VFASSOC_NOTE 128 /* notification */
|
|
|
|
#define HN_NVS_TYPE_SET_DATAPATH 129
|
2016-08-15 05:08:41 +00:00
|
|
|
#define HN_NVS_TYPE_SUBCH_REQ 133
|
|
|
|
#define HN_NVS_TYPE_SUBCH_RESP 133 /* same as SUBCH_REQ */
|
2016-08-17 05:14:26 +00:00
|
|
|
#define HN_NVS_TYPE_TXTBL_NOTE 134 /* notification */
|
2016-08-11 06:14:54 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Any size less than this one will _not_ work, e.g. hn_nvs_init
|
|
|
|
* only has 12B valid data, however, if only 12B data were sent,
|
|
|
|
* Hypervisor would never reply.
|
|
|
|
*/
|
|
|
|
#define HN_NVS_REQSIZE_MIN 32
|
|
|
|
|
2016-08-16 07:45:35 +00:00
|
|
|
/* NVS message common header */
|
|
|
|
struct hn_nvs_hdr {
|
|
|
|
uint32_t nvs_type;
|
|
|
|
} __packed;
|
|
|
|
|
2016-08-11 06:14:54 +00:00
|
|
|
struct hn_nvs_init {
|
|
|
|
uint32_t nvs_type; /* HN_NVS_TYPE_INIT */
|
|
|
|
uint32_t nvs_ver_min;
|
|
|
|
uint32_t nvs_ver_max;
|
|
|
|
uint8_t nvs_rsvd[20];
|
|
|
|
} __packed;
|
|
|
|
CTASSERT(sizeof(struct hn_nvs_init) >= HN_NVS_REQSIZE_MIN);
|
|
|
|
|
|
|
|
struct hn_nvs_init_resp {
|
|
|
|
uint32_t nvs_type; /* HN_NVS_TYPE_INIT_RESP */
|
|
|
|
uint32_t nvs_ver; /* deprecated */
|
|
|
|
uint32_t nvs_rsvd;
|
|
|
|
uint32_t nvs_status; /* HN_NVS_STATUS_ */
|
|
|
|
} __packed;
|
|
|
|
|
2016-08-12 07:14:40 +00:00
|
|
|
/* No reponse */
|
|
|
|
struct hn_nvs_ndis_conf {
|
|
|
|
uint32_t nvs_type; /* HN_NVS_TYPE_NDIS_CONF */
|
|
|
|
uint32_t nvs_mtu;
|
|
|
|
uint32_t nvs_rsvd;
|
|
|
|
uint64_t nvs_caps; /* HN_NVS_NDIS_CONF_ */
|
|
|
|
uint8_t nvs_rsvd1[12];
|
|
|
|
} __packed;
|
|
|
|
CTASSERT(sizeof(struct hn_nvs_ndis_conf) >= HN_NVS_REQSIZE_MIN);
|
|
|
|
|
|
|
|
#define HN_NVS_NDIS_CONF_SRIOV 0x0004
|
|
|
|
#define HN_NVS_NDIS_CONF_VLAN 0x0008
|
|
|
|
|
2016-08-12 07:57:03 +00:00
|
|
|
/* No response */
|
|
|
|
struct hn_nvs_ndis_init {
|
|
|
|
uint32_t nvs_type; /* HN_NVS_TYPE_NDIS_INIT */
|
|
|
|
uint32_t nvs_ndis_major; /* NDIS_VERSION_MAJOR_ */
|
|
|
|
uint32_t nvs_ndis_minor; /* NDIS_VERSION_MINOR_ */
|
|
|
|
uint8_t nvs_rsvd[20];
|
|
|
|
} __packed;
|
|
|
|
CTASSERT(sizeof(struct hn_nvs_ndis_init) >= HN_NVS_REQSIZE_MIN);
|
|
|
|
|
hyperv/hn: Implement transparent mode network VF.
How network VF works with hn(4) on Hyper-V in transparent mode:
- Each network VF has a cooresponding hn(4).
- The network VF and the it's cooresponding hn(4) have the same hardware
address.
- Once the network VF is attached, the cooresponding hn(4) waits several
seconds to make sure that the network VF attach routing completes, then:
o Set the intersection of the network VF's if_capabilities and the
cooresponding hn(4)'s if_capabilities to the cooresponding hn(4)'s
if_capabilities. And adjust the cooresponding hn(4) if_capable and
if_hwassist accordingly. (*)
o Make sure that the cooresponding hn(4)'s TSO parameters meet the
constraints posed by both the network VF and the cooresponding hn(4).
(*)
o The network VF's if_input is overridden. The overriding if_input
changes the input packet's rcvif to the cooreponding hn(4). The
network layers are tricked into thinking that all packets are
neceived by the cooresponding hn(4).
o If the cooresponding hn(4) was brought up, bring up the network VF.
The transmission dispatched to the cooresponding hn(4) are
redispatched to the network VF.
o Bringing down the cooresponding hn(4) also brings down the network
VF.
o All IOCTLs issued to the cooresponding hn(4) are pass-through'ed to
the network VF; the cooresponding hn(4) changes its internal state
if necessary.
o The media status of the cooresponding hn(4) solely relies on the
network VF.
o If there are multicast filters on the cooresponding hn(4), allmulti
will be enabled on the network VF. (**)
- Once the network VF is detached. Undo all damages did to the
cooresponding hn(4) in the above item.
NOTE:
No operation should be issued directly to the network VF, if the
network VF transparent mode is enabled. The network VF transparent mode
can be enabled by setting tunable hw.hn.vf_transparent to 1. The network
VF transparent mode is _not_ enabled by default, as of this commit.
The benefit of the network VF transparent mode is that the network VF
attachment and detachment are transparent to all network layers; e.g. live
migration detaches and reattaches the network VF.
The major drawbacks of the network VF transparent mode:
- The netmap(4) support is lost, even if the VF supports it.
- ALTQ does not work, since if_start method cannot be properly supported.
(*)
These decisions were made so that things will not be messed up too much
during the transition period.
(**)
This does _not_ need to go through the fancy multicast filter management
stuffs like what vlan(4) has, at least currently:
- As of this write, multicast does not work in Azure.
- As of this write, multicast packets go through the cooresponding hn(4).
MFC after: 3 days
Sponsored by: Microsoft
Differential Revision: https://reviews.freebsd.org/D11803
2017-08-09 05:59:45 +00:00
|
|
|
#define HN_NVS_DATAPATH_SYNTH 0
|
2017-01-24 09:24:14 +00:00
|
|
|
#define HN_NVS_DATAPATH_VF 1
|
|
|
|
|
|
|
|
/* No response */
|
|
|
|
struct hn_nvs_datapath {
|
|
|
|
uint32_t nvs_type; /* HN_NVS_TYPE_SET_DATAPATH */
|
|
|
|
uint32_t nvs_active_path;/* HN_NVS_DATAPATH_* */
|
|
|
|
uint32_t nvs_rsvd[6];
|
|
|
|
} __packed;
|
|
|
|
CTASSERT(sizeof(struct hn_nvs_datapath) >= HN_NVS_REQSIZE_MIN);
|
|
|
|
|
2016-08-12 08:07:56 +00:00
|
|
|
struct hn_nvs_rxbuf_conn {
|
|
|
|
uint32_t nvs_type; /* HN_NVS_TYPE_RXBUF_CONN */
|
|
|
|
uint32_t nvs_gpadl; /* RXBUF vmbus GPADL */
|
|
|
|
uint16_t nvs_sig; /* HN_NVS_RXBUF_SIG */
|
|
|
|
uint8_t nvs_rsvd[22];
|
|
|
|
} __packed;
|
|
|
|
CTASSERT(sizeof(struct hn_nvs_rxbuf_conn) >= HN_NVS_REQSIZE_MIN);
|
|
|
|
|
|
|
|
struct hn_nvs_rxbuf_sect {
|
|
|
|
uint32_t nvs_start;
|
|
|
|
uint32_t nvs_slotsz;
|
|
|
|
uint32_t nvs_slotcnt;
|
|
|
|
uint32_t nvs_end;
|
|
|
|
} __packed;
|
|
|
|
|
|
|
|
struct hn_nvs_rxbuf_connresp {
|
|
|
|
uint32_t nvs_type; /* HN_NVS_TYPE_RXBUF_CONNRESP */
|
|
|
|
uint32_t nvs_status; /* HN_NVS_STATUS_ */
|
|
|
|
uint32_t nvs_nsect; /* # of elem in nvs_sect */
|
|
|
|
struct hn_nvs_rxbuf_sect nvs_sect[];
|
|
|
|
} __packed;
|
|
|
|
|
2016-08-12 08:29:26 +00:00
|
|
|
/* No response */
|
|
|
|
struct hn_nvs_rxbuf_disconn {
|
|
|
|
uint32_t nvs_type; /* HN_NVS_TYPE_RXBUF_DISCONN */
|
|
|
|
uint16_t nvs_sig; /* HN_NVS_RXBUF_SIG */
|
|
|
|
uint8_t nvs_rsvd[26];
|
|
|
|
} __packed;
|
|
|
|
CTASSERT(sizeof(struct hn_nvs_rxbuf_disconn) >= HN_NVS_REQSIZE_MIN);
|
|
|
|
|
2016-08-12 08:21:02 +00:00
|
|
|
struct hn_nvs_chim_conn {
|
|
|
|
uint32_t nvs_type; /* HN_NVS_TYPE_CHIM_CONN */
|
|
|
|
uint32_t nvs_gpadl; /* chimney buf vmbus GPADL */
|
|
|
|
uint16_t nvs_sig; /* NDIS_NVS_CHIM_SIG */
|
|
|
|
uint8_t nvs_rsvd[22];
|
|
|
|
} __packed;
|
|
|
|
CTASSERT(sizeof(struct hn_nvs_chim_conn) >= HN_NVS_REQSIZE_MIN);
|
|
|
|
|
|
|
|
struct hn_nvs_chim_connresp {
|
|
|
|
uint32_t nvs_type; /* HN_NVS_TYPE_CHIM_CONNRESP */
|
|
|
|
uint32_t nvs_status; /* HN_NVS_STATUS_ */
|
|
|
|
uint32_t nvs_sectsz; /* section size */
|
|
|
|
} __packed;
|
|
|
|
|
2016-08-15 05:00:37 +00:00
|
|
|
/* No response */
|
|
|
|
struct hn_nvs_chim_disconn {
|
|
|
|
uint32_t nvs_type; /* HN_NVS_TYPE_CHIM_DISCONN */
|
|
|
|
uint16_t nvs_sig; /* HN_NVS_CHIM_SIG */
|
|
|
|
uint8_t nvs_rsvd[26];
|
|
|
|
} __packed;
|
|
|
|
CTASSERT(sizeof(struct hn_nvs_chim_disconn) >= HN_NVS_REQSIZE_MIN);
|
|
|
|
|
2016-08-15 05:08:41 +00:00
|
|
|
#define HN_NVS_SUBCH_OP_ALLOC 1
|
|
|
|
|
|
|
|
struct hn_nvs_subch_req {
|
|
|
|
uint32_t nvs_type; /* HN_NVS_TYPE_SUBCH_REQ */
|
|
|
|
uint32_t nvs_op; /* HN_NVS_SUBCH_OP_ */
|
|
|
|
uint32_t nvs_nsubch;
|
|
|
|
uint8_t nvs_rsvd[20];
|
|
|
|
} __packed;
|
|
|
|
CTASSERT(sizeof(struct hn_nvs_subch_req) >= HN_NVS_REQSIZE_MIN);
|
|
|
|
|
|
|
|
struct hn_nvs_subch_resp {
|
|
|
|
uint32_t nvs_type; /* HN_NVS_TYPE_SUBCH_RESP */
|
|
|
|
uint32_t nvs_status; /* HN_NVS_STATUS_ */
|
|
|
|
uint32_t nvs_nsubch;
|
|
|
|
} __packed;
|
|
|
|
|
2016-08-16 07:37:02 +00:00
|
|
|
struct hn_nvs_rndis {
|
|
|
|
uint32_t nvs_type; /* HN_NVS_TYPE_RNDIS */
|
|
|
|
uint32_t nvs_rndis_mtype;/* HN_NVS_RNDIS_MTYPE_ */
|
|
|
|
/*
|
|
|
|
* Chimney sending buffer index and size.
|
|
|
|
*
|
|
|
|
* NOTE:
|
|
|
|
* If nvs_chim_idx is set to HN_NVS_CHIM_IDX_INVALID
|
|
|
|
* and nvs_chim_sz is set to 0, then chimney sending
|
|
|
|
* buffer is _not_ used by this RNDIS message.
|
|
|
|
*/
|
|
|
|
uint32_t nvs_chim_idx;
|
|
|
|
uint32_t nvs_chim_sz;
|
|
|
|
uint8_t nvs_rsvd[16];
|
|
|
|
} __packed;
|
|
|
|
CTASSERT(sizeof(struct hn_nvs_rndis) >= HN_NVS_REQSIZE_MIN);
|
|
|
|
|
2016-08-17 05:25:47 +00:00
|
|
|
struct hn_nvs_rndis_ack {
|
|
|
|
uint32_t nvs_type; /* HN_NVS_TYPE_RNDIS_ACK */
|
|
|
|
uint32_t nvs_status; /* HN_NVS_STATUS_ */
|
|
|
|
uint8_t nvs_rsvd[24];
|
|
|
|
} __packed;
|
|
|
|
CTASSERT(sizeof(struct hn_nvs_rndis_ack) >= HN_NVS_REQSIZE_MIN);
|
|
|
|
|
2016-09-02 03:19:55 +00:00
|
|
|
/*
|
|
|
|
* RNDIS extension
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* Per-packet hash info */
|
|
|
|
#define HN_NDIS_HASH_INFO_SIZE sizeof(uint32_t)
|
|
|
|
#define HN_NDIS_PKTINFO_TYPE_HASHINF NDIS_PKTINFO_TYPE_ORIG_NBLIST
|
|
|
|
/* NDIS_HASH_ */
|
|
|
|
|
|
|
|
/* Per-packet hash value */
|
|
|
|
#define HN_NDIS_HASH_VALUE_SIZE sizeof(uint32_t)
|
|
|
|
#define HN_NDIS_PKTINFO_TYPE_HASHVAL NDIS_PKTINFO_TYPE_PKT_CANCELID
|
|
|
|
|
2016-09-07 06:02:29 +00:00
|
|
|
/* Per-packet-info size */
|
|
|
|
#define HN_RNDIS_PKTINFO_SIZE(dlen) \
|
|
|
|
__offsetof(struct rndis_pktinfo, rm_data[dlen])
|
|
|
|
|
2016-08-11 06:14:54 +00:00
|
|
|
#endif /* !_IF_HNREG_H_ */
|