xref: /minix3/minix/drivers/net/virtio_net/virtio_net.h (revision 433d6423c39e34ec4b79c950597bb2d236f886be)
1*433d6423SLionel Sambuc #ifndef _LINUX_VIRTIO_NET_H
2*433d6423SLionel Sambuc #define _LINUX_VIRTIO_NET_H
3*433d6423SLionel Sambuc /* This header is BSD licensed so anyone can use the definitions to implement
4*433d6423SLionel Sambuc  * compatible drivers/servers.
5*433d6423SLionel Sambuc  *
6*433d6423SLionel Sambuc  * Redistribution and use in source and binary forms, with or without
7*433d6423SLionel Sambuc  * modification, are permitted provided that the following conditions
8*433d6423SLionel Sambuc  * are met:
9*433d6423SLionel Sambuc  * 1. Redistributions of source code must retain the above copyright
10*433d6423SLionel Sambuc  *    notice, this list of conditions and the following disclaimer.
11*433d6423SLionel Sambuc  * 2. Redistributions in binary form must reproduce the above copyright
12*433d6423SLionel Sambuc  *    notice, this list of conditions and the following disclaimer in the
13*433d6423SLionel Sambuc  *    documentation and/or other materials provided with the distribution.
14*433d6423SLionel Sambuc  * 3. Neither the name of IBM nor the names of its contributors
15*433d6423SLionel Sambuc  *    may be used to endorse or promote products derived from this software
16*433d6423SLionel Sambuc  *    without specific prior written permission.
17*433d6423SLionel Sambuc  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND
18*433d6423SLionel Sambuc  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19*433d6423SLionel Sambuc  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20*433d6423SLionel Sambuc  * ARE DISCLAIMED.  IN NO EVENT SHALL IBM OR CONTRIBUTORS BE LIABLE
21*433d6423SLionel Sambuc  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22*433d6423SLionel Sambuc  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23*433d6423SLionel Sambuc  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24*433d6423SLionel Sambuc  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25*433d6423SLionel Sambuc  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26*433d6423SLionel Sambuc  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27*433d6423SLionel Sambuc  * SUCH DAMAGE. */
28*433d6423SLionel Sambuc #if 0
29*433d6423SLionel Sambuc #include <linux/types.h>
30*433d6423SLionel Sambuc #include <linux/virtio_ids.h>
31*433d6423SLionel Sambuc #include <linux/virtio_config.h>
32*433d6423SLionel Sambuc #include <linux/if_ether.h>
33*433d6423SLionel Sambuc #endif
34*433d6423SLionel Sambuc 
35*433d6423SLionel Sambuc /* The feature bitmap for virtio net */
36*433d6423SLionel Sambuc #define VIRTIO_NET_F_CSUM	0	/* Host handles pkts w/ partial csum */
37*433d6423SLionel Sambuc #define VIRTIO_NET_F_GUEST_CSUM	1	/* Guest handles pkts w/ partial csum */
38*433d6423SLionel Sambuc #define VIRTIO_NET_F_MAC	5	/* Host has given MAC address. */
39*433d6423SLionel Sambuc #define VIRTIO_NET_F_GSO	6	/* Host handles pkts w/ any GSO type */
40*433d6423SLionel Sambuc #define VIRTIO_NET_F_GUEST_TSO4	7	/* Guest can handle TSOv4 in. */
41*433d6423SLionel Sambuc #define VIRTIO_NET_F_GUEST_TSO6	8	/* Guest can handle TSOv6 in. */
42*433d6423SLionel Sambuc #define VIRTIO_NET_F_GUEST_ECN	9	/* Guest can handle TSO[6] w/ ECN in. */
43*433d6423SLionel Sambuc #define VIRTIO_NET_F_GUEST_UFO	10	/* Guest can handle UFO in. */
44*433d6423SLionel Sambuc #define VIRTIO_NET_F_HOST_TSO4	11	/* Host can handle TSOv4 in. */
45*433d6423SLionel Sambuc #define VIRTIO_NET_F_HOST_TSO6	12	/* Host can handle TSOv6 in. */
46*433d6423SLionel Sambuc #define VIRTIO_NET_F_HOST_ECN	13	/* Host can handle TSO[6] w/ ECN in. */
47*433d6423SLionel Sambuc #define VIRTIO_NET_F_HOST_UFO	14	/* Host can handle UFO in. */
48*433d6423SLionel Sambuc #define VIRTIO_NET_F_MRG_RXBUF	15	/* Host can merge receive buffers. */
49*433d6423SLionel Sambuc #define VIRTIO_NET_F_STATUS	16	/* virtio_net_config.status available */
50*433d6423SLionel Sambuc #define VIRTIO_NET_F_CTRL_VQ	17	/* Control channel available */
51*433d6423SLionel Sambuc #define VIRTIO_NET_F_CTRL_RX	18	/* Control channel RX mode support */
52*433d6423SLionel Sambuc #define VIRTIO_NET_F_CTRL_VLAN	19	/* Control channel VLAN filtering */
53*433d6423SLionel Sambuc #define VIRTIO_NET_F_CTRL_RX_EXTRA 20	/* Extra RX mode control support */
54*433d6423SLionel Sambuc #define VIRTIO_NET_F_GUEST_ANNOUNCE 21	/* Guest can announce device on the
55*433d6423SLionel Sambuc 					 * network */
56*433d6423SLionel Sambuc 
57*433d6423SLionel Sambuc #define VIRTIO_NET_S_LINK_UP	1	/* Link is up */
58*433d6423SLionel Sambuc #define VIRTIO_NET_S_ANNOUNCE	2	/* Announcement is needed */
59*433d6423SLionel Sambuc 
60*433d6423SLionel Sambuc struct virtio_net_config {
61*433d6423SLionel Sambuc 	/* The config defining mac address (if VIRTIO_NET_F_MAC) */
62*433d6423SLionel Sambuc 	u8_t mac[6];
63*433d6423SLionel Sambuc 	/* See VIRTIO_NET_F_STATUS and VIRTIO_NET_S_* above */
64*433d6423SLionel Sambuc 	u16_t status;
65*433d6423SLionel Sambuc } __attribute__((packed));
66*433d6423SLionel Sambuc 
67*433d6423SLionel Sambuc /* This is the first element of the scatter-gather list.  If you don't
68*433d6423SLionel Sambuc  * specify GSO or CSUM features, you can simply ignore the header. */
69*433d6423SLionel Sambuc struct virtio_net_hdr {
70*433d6423SLionel Sambuc #define VIRTIO_NET_HDR_F_NEEDS_CSUM	1	// Use csum_start, csum_offset
71*433d6423SLionel Sambuc #define VIRTIO_NET_HDR_F_DATA_VALID	2	// Csum is valid
72*433d6423SLionel Sambuc 	u8_t flags;
73*433d6423SLionel Sambuc #define VIRTIO_NET_HDR_GSO_NONE		0	// Not a GSO frame
74*433d6423SLionel Sambuc #define VIRTIO_NET_HDR_GSO_TCPV4	1	// GSO frame, IPv4 TCP (TSO)
75*433d6423SLionel Sambuc #define VIRTIO_NET_HDR_GSO_UDP		3	// GSO frame, IPv4 UDP (UFO)
76*433d6423SLionel Sambuc #define VIRTIO_NET_HDR_GSO_TCPV6	4	// GSO frame, IPv6 TCP
77*433d6423SLionel Sambuc #define VIRTIO_NET_HDR_GSO_ECN		0x80	// TCP has ECN set
78*433d6423SLionel Sambuc 	u8_t gso_type;
79*433d6423SLionel Sambuc 	u16_t hdr_len;		/* Ethernet + IP + tcp/udp hdrs */
80*433d6423SLionel Sambuc 	u16_t gso_size;		/* Bytes to append to hdr_len per frame */
81*433d6423SLionel Sambuc 	u16_t csum_start;	/* Position to start checksumming from */
82*433d6423SLionel Sambuc 	u16_t csum_offset;	/* Offset after that to place checksum */
83*433d6423SLionel Sambuc };
84*433d6423SLionel Sambuc 
85*433d6423SLionel Sambuc /* This is the version of the header to use when the MRG_RXBUF
86*433d6423SLionel Sambuc  * feature has been negotiated. */
87*433d6423SLionel Sambuc struct virtio_net_hdr_mrg_rxbuf {
88*433d6423SLionel Sambuc 	struct virtio_net_hdr hdr;
89*433d6423SLionel Sambuc 	u16_t num_buffers;	/* Number of merged rx buffers */
90*433d6423SLionel Sambuc };
91*433d6423SLionel Sambuc 
92*433d6423SLionel Sambuc /*
93*433d6423SLionel Sambuc  * Control virtqueue data structures
94*433d6423SLionel Sambuc  *
95*433d6423SLionel Sambuc  * The control virtqueue expects a header in the first sg entry
96*433d6423SLionel Sambuc  * and an ack/status response in the last entry.  Data for the
97*433d6423SLionel Sambuc  * command goes in between.
98*433d6423SLionel Sambuc  */
99*433d6423SLionel Sambuc struct virtio_net_ctrl_hdr {
100*433d6423SLionel Sambuc 	u8_t class;
101*433d6423SLionel Sambuc 	u8_t cmd;
102*433d6423SLionel Sambuc } __attribute__((packed));
103*433d6423SLionel Sambuc 
104*433d6423SLionel Sambuc typedef u8_t virtio_net_ctrl_ack;
105*433d6423SLionel Sambuc 
106*433d6423SLionel Sambuc #define VIRTIO_NET_OK     0
107*433d6423SLionel Sambuc #define VIRTIO_NET_ERR    1
108*433d6423SLionel Sambuc 
109*433d6423SLionel Sambuc /*
110*433d6423SLionel Sambuc  * Control the RX mode, ie. promisucous, allmulti, etc...
111*433d6423SLionel Sambuc  * All commands require an "out" sg entry containing a 1 byte
112*433d6423SLionel Sambuc  * state value, zero = disable, non-zero = enable.  Commands
113*433d6423SLionel Sambuc  * 0 and 1 are supported with the VIRTIO_NET_F_CTRL_RX feature.
114*433d6423SLionel Sambuc  * Commands 2-5 are added with VIRTIO_NET_F_CTRL_RX_EXTRA.
115*433d6423SLionel Sambuc  */
116*433d6423SLionel Sambuc #define VIRTIO_NET_CTRL_RX    0
117*433d6423SLionel Sambuc  #define VIRTIO_NET_CTRL_RX_PROMISC      0
118*433d6423SLionel Sambuc  #define VIRTIO_NET_CTRL_RX_ALLMULTI     1
119*433d6423SLionel Sambuc  #define VIRTIO_NET_CTRL_RX_ALLUNI       2
120*433d6423SLionel Sambuc  #define VIRTIO_NET_CTRL_RX_NOMULTI      3
121*433d6423SLionel Sambuc  #define VIRTIO_NET_CTRL_RX_NOUNI        4
122*433d6423SLionel Sambuc  #define VIRTIO_NET_CTRL_RX_NOBCAST      5
123*433d6423SLionel Sambuc 
124*433d6423SLionel Sambuc /*
125*433d6423SLionel Sambuc  * Control the MAC filter table.
126*433d6423SLionel Sambuc  *
127*433d6423SLionel Sambuc  * The MAC filter table is managed by the hypervisor, the guest should
128*433d6423SLionel Sambuc  * assume the size is infinite.  Filtering should be considered
129*433d6423SLionel Sambuc  * non-perfect, ie. based on hypervisor resources, the guest may
130*433d6423SLionel Sambuc  * received packets from sources not specified in the filter list.
131*433d6423SLionel Sambuc  *
132*433d6423SLionel Sambuc  * In addition to the class/cmd header, the TABLE_SET command requires
133*433d6423SLionel Sambuc  * two out scatterlists.  Each contains a 4 byte count of entries followed
134*433d6423SLionel Sambuc  * by a concatenated byte stream of the ETH_ALEN MAC addresses.  The
135*433d6423SLionel Sambuc  * first sg list contains unicast addresses, the second is for multicast.
136*433d6423SLionel Sambuc  * This functionality is present if the VIRTIO_NET_F_CTRL_RX feature
137*433d6423SLionel Sambuc  * is available.
138*433d6423SLionel Sambuc  */
139*433d6423SLionel Sambuc struct virtio_net_ctrl_mac {
140*433d6423SLionel Sambuc 	u32_t entries;
141*433d6423SLionel Sambuc #define ETH_ALEN 6
142*433d6423SLionel Sambuc 	u8_t macs[][ETH_ALEN];
143*433d6423SLionel Sambuc } __attribute__((packed));
144*433d6423SLionel Sambuc 
145*433d6423SLionel Sambuc #define VIRTIO_NET_CTRL_MAC    1
146*433d6423SLionel Sambuc  #define VIRTIO_NET_CTRL_MAC_TABLE_SET        0
147*433d6423SLionel Sambuc 
148*433d6423SLionel Sambuc /*
149*433d6423SLionel Sambuc  * Control VLAN filtering
150*433d6423SLionel Sambuc  *
151*433d6423SLionel Sambuc  * The VLAN filter table is controlled via a simple ADD/DEL interface.
152*433d6423SLionel Sambuc  * VLAN IDs not added may be filterd by the hypervisor.  Del is the
153*433d6423SLionel Sambuc  * opposite of add.  Both commands expect an out entry containing a 2
154*433d6423SLionel Sambuc  * byte VLAN ID.  VLAN filterting is available with the
155*433d6423SLionel Sambuc  * VIRTIO_NET_F_CTRL_VLAN feature bit.
156*433d6423SLionel Sambuc  */
157*433d6423SLionel Sambuc #define VIRTIO_NET_CTRL_VLAN       2
158*433d6423SLionel Sambuc  #define VIRTIO_NET_CTRL_VLAN_ADD             0
159*433d6423SLionel Sambuc  #define VIRTIO_NET_CTRL_VLAN_DEL             1
160*433d6423SLionel Sambuc 
161*433d6423SLionel Sambuc /*
162*433d6423SLionel Sambuc  * Control link announce acknowledgement
163*433d6423SLionel Sambuc  *
164*433d6423SLionel Sambuc  * The command VIRTIO_NET_CTRL_ANNOUNCE_ACK is used to indicate that
165*433d6423SLionel Sambuc  * driver has recevied the notification; device would clear the
166*433d6423SLionel Sambuc  * VIRTIO_NET_S_ANNOUNCE bit in the status field after it receives
167*433d6423SLionel Sambuc  * this command.
168*433d6423SLionel Sambuc  */
169*433d6423SLionel Sambuc #define VIRTIO_NET_CTRL_ANNOUNCE       3
170*433d6423SLionel Sambuc  #define VIRTIO_NET_CTRL_ANNOUNCE_ACK         0
171*433d6423SLionel Sambuc 
172*433d6423SLionel Sambuc #endif /* _LINUX_VIRTIO_NET_H */
173