xref: /openbmc/u-boot/drivers/virtio/virtio_net.h (revision 1d6edcbfed2af33c748f2beb399810a0441888da)
1*f371ad30STuomas Tynkkynen /* SPDX-License-Identifier: BSD-3-Clause */
2*f371ad30STuomas Tynkkynen /*
3*f371ad30STuomas Tynkkynen  * Copyright (C) 2018, Tuomas Tynkkynen <tuomas.tynkkynen@iki.fi>
4*f371ad30STuomas Tynkkynen  * Copyright (C) 2018, Bin Meng <bmeng.cn@gmail.com>
5*f371ad30STuomas Tynkkynen  *
6*f371ad30STuomas Tynkkynen  * From Linux kernel include/uapi/linux/virtio_net.h
7*f371ad30STuomas Tynkkynen  */
8*f371ad30STuomas Tynkkynen 
9*f371ad30STuomas Tynkkynen #ifndef _LINUX_VIRTIO_NET_H
10*f371ad30STuomas Tynkkynen #define _LINUX_VIRTIO_NET_H
11*f371ad30STuomas Tynkkynen 
12*f371ad30STuomas Tynkkynen /* TODO: needs to be removed! */
13*f371ad30STuomas Tynkkynen #define ETH_ALEN				6
14*f371ad30STuomas Tynkkynen 
15*f371ad30STuomas Tynkkynen /* The feature bitmap for virtio net */
16*f371ad30STuomas Tynkkynen 
17*f371ad30STuomas Tynkkynen /* Host handles pkts w/ partial csum */
18*f371ad30STuomas Tynkkynen #define VIRTIO_NET_F_CSUM			0
19*f371ad30STuomas Tynkkynen /* Guest handles pkts w/ partial csum */
20*f371ad30STuomas Tynkkynen #define VIRTIO_NET_F_GUEST_CSUM			1
21*f371ad30STuomas Tynkkynen /* Dynamic offload configuration */
22*f371ad30STuomas Tynkkynen #define VIRTIO_NET_F_CTRL_GUEST_OFFLOADS	2
23*f371ad30STuomas Tynkkynen /* Initial MTU advice */
24*f371ad30STuomas Tynkkynen #define VIRTIO_NET_F_MTU			3
25*f371ad30STuomas Tynkkynen /* Host has given MAC address */
26*f371ad30STuomas Tynkkynen #define VIRTIO_NET_F_MAC			5
27*f371ad30STuomas Tynkkynen /* Guest can handle TSOv4 in */
28*f371ad30STuomas Tynkkynen #define VIRTIO_NET_F_GUEST_TSO4			7
29*f371ad30STuomas Tynkkynen /* Guest can handle TSOv6 in */
30*f371ad30STuomas Tynkkynen #define VIRTIO_NET_F_GUEST_TSO6			8
31*f371ad30STuomas Tynkkynen /* Guest can handle TSO[6] w/ ECN in */
32*f371ad30STuomas Tynkkynen #define VIRTIO_NET_F_GUEST_ECN			9
33*f371ad30STuomas Tynkkynen /* Guest can handle UFO in */
34*f371ad30STuomas Tynkkynen #define VIRTIO_NET_F_GUEST_UFO			10
35*f371ad30STuomas Tynkkynen /* Host can handle TSOv4 in */
36*f371ad30STuomas Tynkkynen #define VIRTIO_NET_F_HOST_TSO4			11
37*f371ad30STuomas Tynkkynen /* Host can handle TSOv6 in */
38*f371ad30STuomas Tynkkynen #define VIRTIO_NET_F_HOST_TSO6			12
39*f371ad30STuomas Tynkkynen /* Host can handle TSO[6] w/ ECN in */
40*f371ad30STuomas Tynkkynen #define VIRTIO_NET_F_HOST_ECN			13
41*f371ad30STuomas Tynkkynen /* Host can handle UFO in */
42*f371ad30STuomas Tynkkynen #define VIRTIO_NET_F_HOST_UFO			14
43*f371ad30STuomas Tynkkynen /* Host can merge receive buffers */
44*f371ad30STuomas Tynkkynen #define VIRTIO_NET_F_MRG_RXBUF			15
45*f371ad30STuomas Tynkkynen /* virtio_net_config.status available */
46*f371ad30STuomas Tynkkynen #define VIRTIO_NET_F_STATUS			16
47*f371ad30STuomas Tynkkynen /* Control channel available */
48*f371ad30STuomas Tynkkynen #define VIRTIO_NET_F_CTRL_VQ			17
49*f371ad30STuomas Tynkkynen /* Control channel RX mode support */
50*f371ad30STuomas Tynkkynen #define VIRTIO_NET_F_CTRL_RX			18
51*f371ad30STuomas Tynkkynen /* Control channel VLAN filtering */
52*f371ad30STuomas Tynkkynen #define VIRTIO_NET_F_CTRL_VLAN			19
53*f371ad30STuomas Tynkkynen /* Extra RX mode control support */
54*f371ad30STuomas Tynkkynen #define VIRTIO_NET_F_CTRL_RX_EXTRA		20
55*f371ad30STuomas Tynkkynen /* Guest can announce device on the network */
56*f371ad30STuomas Tynkkynen #define VIRTIO_NET_F_GUEST_ANNOUNCE		21
57*f371ad30STuomas Tynkkynen /* Device supports receive flow steering */
58*f371ad30STuomas Tynkkynen #define VIRTIO_NET_F_MQ				22
59*f371ad30STuomas Tynkkynen /* Set MAC address */
60*f371ad30STuomas Tynkkynen #define VIRTIO_NET_F_CTRL_MAC_ADDR		23
61*f371ad30STuomas Tynkkynen /* Device set linkspeed and duplex */
62*f371ad30STuomas Tynkkynen #define VIRTIO_NET_F_SPEED_DUPLEX		63
63*f371ad30STuomas Tynkkynen 
64*f371ad30STuomas Tynkkynen #ifndef VIRTIO_NET_NO_LEGACY
65*f371ad30STuomas Tynkkynen /* Host handles pkts w/ any GSO type */
66*f371ad30STuomas Tynkkynen #define VIRTIO_NET_F_GSO			6
67*f371ad30STuomas Tynkkynen #endif /* VIRTIO_NET_NO_LEGACY */
68*f371ad30STuomas Tynkkynen 
69*f371ad30STuomas Tynkkynen #define VIRTIO_NET_S_LINK_UP			1 /* Link is up */
70*f371ad30STuomas Tynkkynen #define VIRTIO_NET_S_ANNOUNCE			2 /* Announcement is needed */
71*f371ad30STuomas Tynkkynen 
72*f371ad30STuomas Tynkkynen struct __packed virtio_net_config {
73*f371ad30STuomas Tynkkynen 	/* The config defining mac address (if VIRTIO_NET_F_MAC) */
74*f371ad30STuomas Tynkkynen 	__u8 mac[ETH_ALEN];
75*f371ad30STuomas Tynkkynen 	/* See VIRTIO_NET_F_STATUS and VIRTIO_NET_S_* above */
76*f371ad30STuomas Tynkkynen 	__u16 status;
77*f371ad30STuomas Tynkkynen 	/*
78*f371ad30STuomas Tynkkynen 	 * Maximum number of each of transmit and receive queues;
79*f371ad30STuomas Tynkkynen 	 * see VIRTIO_NET_F_MQ and VIRTIO_NET_CTRL_MQ.
80*f371ad30STuomas Tynkkynen 	 * Legal values are between 1 and 0x8000
81*f371ad30STuomas Tynkkynen 	 */
82*f371ad30STuomas Tynkkynen 	__u16 max_virtqueue_pairs;
83*f371ad30STuomas Tynkkynen 	/* Default maximum transmit unit advice */
84*f371ad30STuomas Tynkkynen 	__u16 mtu;
85*f371ad30STuomas Tynkkynen 	/*
86*f371ad30STuomas Tynkkynen 	 * speed, in units of 1Mb. All values 0 to INT_MAX are legal.
87*f371ad30STuomas Tynkkynen 	 * Any other value stands for unknown.
88*f371ad30STuomas Tynkkynen 	 */
89*f371ad30STuomas Tynkkynen 	__u32 speed;
90*f371ad30STuomas Tynkkynen 	/*
91*f371ad30STuomas Tynkkynen 	 * 0x00 - half duplex
92*f371ad30STuomas Tynkkynen 	 * 0x01 - full duplex
93*f371ad30STuomas Tynkkynen 	 * Any other value stands for unknown.
94*f371ad30STuomas Tynkkynen 	 */
95*f371ad30STuomas Tynkkynen 	__u8 duplex;
96*f371ad30STuomas Tynkkynen };
97*f371ad30STuomas Tynkkynen 
98*f371ad30STuomas Tynkkynen /*
99*f371ad30STuomas Tynkkynen  * This header comes first in the scatter-gather list. If you don't
100*f371ad30STuomas Tynkkynen  * specify GSO or CSUM features, you can simply ignore the header.
101*f371ad30STuomas Tynkkynen  *
102*f371ad30STuomas Tynkkynen  * This is bitwise-equivalent to the legacy struct virtio_net_hdr_mrg_rxbuf,
103*f371ad30STuomas Tynkkynen  * only flattened.
104*f371ad30STuomas Tynkkynen  */
105*f371ad30STuomas Tynkkynen struct virtio_net_hdr_v1 {
106*f371ad30STuomas Tynkkynen #define VIRTIO_NET_HDR_F_NEEDS_CSUM	0x01 /* Use csum_start, csum_offset */
107*f371ad30STuomas Tynkkynen #define VIRTIO_NET_HDR_F_DATA_VALID	0x02 /* Csum is valid */
108*f371ad30STuomas Tynkkynen 	__u8 flags;
109*f371ad30STuomas Tynkkynen #define VIRTIO_NET_HDR_GSO_NONE		0x00 /* Not a GSO frame */
110*f371ad30STuomas Tynkkynen #define VIRTIO_NET_HDR_GSO_TCPV4	0x01 /* GSO frame, IPv4 TCP (TSO) */
111*f371ad30STuomas Tynkkynen #define VIRTIO_NET_HDR_GSO_UDP		0x03 /* GSO frame, IPv4 UDP (UFO) */
112*f371ad30STuomas Tynkkynen #define VIRTIO_NET_HDR_GSO_TCPV6	0x04 /* GSO frame, IPv6 TCP */
113*f371ad30STuomas Tynkkynen #define VIRTIO_NET_HDR_GSO_ECN		0x80 /* TCP has ECN set */
114*f371ad30STuomas Tynkkynen 	__u8 gso_type;
115*f371ad30STuomas Tynkkynen 	__virtio16 hdr_len;	/* Ethernet + IP + tcp/udp hdrs */
116*f371ad30STuomas Tynkkynen 	__virtio16 gso_size;	/* Bytes to append to hdr_len per frame */
117*f371ad30STuomas Tynkkynen 	__virtio16 csum_start;	/* Position to start checksumming from */
118*f371ad30STuomas Tynkkynen 	__virtio16 csum_offset;	/* Offset after that to place checksum */
119*f371ad30STuomas Tynkkynen 	__virtio16 num_buffers;	/* Number of merged rx buffers */
120*f371ad30STuomas Tynkkynen };
121*f371ad30STuomas Tynkkynen 
122*f371ad30STuomas Tynkkynen #ifndef VIRTIO_NET_NO_LEGACY
123*f371ad30STuomas Tynkkynen /*
124*f371ad30STuomas Tynkkynen  * This header comes first in the scatter-gather list.
125*f371ad30STuomas Tynkkynen  *
126*f371ad30STuomas Tynkkynen  * For legacy virtio, if VIRTIO_F_ANY_LAYOUT is not negotiated, it must
127*f371ad30STuomas Tynkkynen  * be the first element of the scatter-gather list. If you don't
128*f371ad30STuomas Tynkkynen  * specify GSO or CSUM features, you can simply ignore the header.
129*f371ad30STuomas Tynkkynen  */
130*f371ad30STuomas Tynkkynen struct virtio_net_hdr {
131*f371ad30STuomas Tynkkynen 	/* See VIRTIO_NET_HDR_F_* */
132*f371ad30STuomas Tynkkynen 	__u8 flags;
133*f371ad30STuomas Tynkkynen 	/* See VIRTIO_NET_HDR_GSO_* */
134*f371ad30STuomas Tynkkynen 	__u8 gso_type;
135*f371ad30STuomas Tynkkynen 	__virtio16 hdr_len;	/* Ethernet + IP + tcp/udp hdrs */
136*f371ad30STuomas Tynkkynen 	__virtio16 gso_size;	/* Bytes to append to hdr_len per frame */
137*f371ad30STuomas Tynkkynen 	__virtio16 csum_start;	/* Position to start checksumming from */
138*f371ad30STuomas Tynkkynen 	__virtio16 csum_offset;	/* Offset after that to place checksum */
139*f371ad30STuomas Tynkkynen };
140*f371ad30STuomas Tynkkynen 
141*f371ad30STuomas Tynkkynen /*
142*f371ad30STuomas Tynkkynen  * This is the version of the header to use when the MRG_RXBUF
143*f371ad30STuomas Tynkkynen  * feature has been negotiated.
144*f371ad30STuomas Tynkkynen  */
145*f371ad30STuomas Tynkkynen struct virtio_net_hdr_mrg_rxbuf {
146*f371ad30STuomas Tynkkynen 	struct virtio_net_hdr hdr;
147*f371ad30STuomas Tynkkynen 	__virtio16 num_buffers;	/* Number of merged rx buffers */
148*f371ad30STuomas Tynkkynen };
149*f371ad30STuomas Tynkkynen #endif /* ...VIRTIO_NET_NO_LEGACY */
150*f371ad30STuomas Tynkkynen 
151*f371ad30STuomas Tynkkynen /*
152*f371ad30STuomas Tynkkynen  * Control virtqueue data structures
153*f371ad30STuomas Tynkkynen  *
154*f371ad30STuomas Tynkkynen  * The control virtqueue expects a header in the first sg entry
155*f371ad30STuomas Tynkkynen  * and an ack/status response in the last entry.  Data for the
156*f371ad30STuomas Tynkkynen  * command goes in between.
157*f371ad30STuomas Tynkkynen  */
158*f371ad30STuomas Tynkkynen struct __packed virtio_net_ctrl_hdr {
159*f371ad30STuomas Tynkkynen 	__u8 class;
160*f371ad30STuomas Tynkkynen 	__u8 cmd;
161*f371ad30STuomas Tynkkynen };
162*f371ad30STuomas Tynkkynen 
163*f371ad30STuomas Tynkkynen typedef __u8 virtio_net_ctrl_ack;
164*f371ad30STuomas Tynkkynen 
165*f371ad30STuomas Tynkkynen #define VIRTIO_NET_OK				0
166*f371ad30STuomas Tynkkynen #define VIRTIO_NET_ERR				1
167*f371ad30STuomas Tynkkynen 
168*f371ad30STuomas Tynkkynen /*
169*f371ad30STuomas Tynkkynen  * Control the RX mode, ie. promisucous, allmulti, etc...
170*f371ad30STuomas Tynkkynen  *
171*f371ad30STuomas Tynkkynen  * All commands require an "out" sg entry containing a 1 byte state value,
172*f371ad30STuomas Tynkkynen  * zero = disable, non-zero = enable.
173*f371ad30STuomas Tynkkynen  *
174*f371ad30STuomas Tynkkynen  * Commands 0 and 1 are supported with the VIRTIO_NET_F_CTRL_RX feature.
175*f371ad30STuomas Tynkkynen  * Commands 2-5 are added with VIRTIO_NET_F_CTRL_RX_EXTRA.
176*f371ad30STuomas Tynkkynen  */
177*f371ad30STuomas Tynkkynen #define VIRTIO_NET_CTRL_RX			0
178*f371ad30STuomas Tynkkynen #define VIRTIO_NET_CTRL_RX_PROMISC		0
179*f371ad30STuomas Tynkkynen #define VIRTIO_NET_CTRL_RX_ALLMULTI		1
180*f371ad30STuomas Tynkkynen #define VIRTIO_NET_CTRL_RX_ALLUNI		2
181*f371ad30STuomas Tynkkynen #define VIRTIO_NET_CTRL_RX_NOMULTI		3
182*f371ad30STuomas Tynkkynen #define VIRTIO_NET_CTRL_RX_NOUNI		4
183*f371ad30STuomas Tynkkynen #define VIRTIO_NET_CTRL_RX_NOBCAST		5
184*f371ad30STuomas Tynkkynen 
185*f371ad30STuomas Tynkkynen /*
186*f371ad30STuomas Tynkkynen  * Control the MAC
187*f371ad30STuomas Tynkkynen  *
188*f371ad30STuomas Tynkkynen  * The MAC filter table is managed by the hypervisor, the guest should assume
189*f371ad30STuomas Tynkkynen  * the size is infinite. Filtering should be considered non-perfect, ie. based
190*f371ad30STuomas Tynkkynen  * on hypervisor resources, the guest may received packets from sources not
191*f371ad30STuomas Tynkkynen  * specified in the filter list.
192*f371ad30STuomas Tynkkynen  *
193*f371ad30STuomas Tynkkynen  * In addition to the class/cmd header, the TABLE_SET command requires two
194*f371ad30STuomas Tynkkynen  * out scatterlists. Each contains a 4 byte count of entries followed by a
195*f371ad30STuomas Tynkkynen  * concatenated byte stream of the ETH_ALEN MAC addresses.  The first sg list
196*f371ad30STuomas Tynkkynen  * contains unicast addresses, the second is for multicast. This functionality
197*f371ad30STuomas Tynkkynen  * is present if the VIRTIO_NET_F_CTRL_RX feature is available.
198*f371ad30STuomas Tynkkynen  *
199*f371ad30STuomas Tynkkynen  * The ADDR_SET command requests one out scatterlist, it contains a 6 bytes MAC
200*f371ad30STuomas Tynkkynen  * address. This functionality is present if the VIRTIO_NET_F_CTRL_MAC_ADDR
201*f371ad30STuomas Tynkkynen  * feature is available.
202*f371ad30STuomas Tynkkynen  */
203*f371ad30STuomas Tynkkynen struct __packed virtio_net_ctrl_mac {
204*f371ad30STuomas Tynkkynen 	__virtio32 entries;
205*f371ad30STuomas Tynkkynen 	__u8 macs[][ETH_ALEN];
206*f371ad30STuomas Tynkkynen };
207*f371ad30STuomas Tynkkynen 
208*f371ad30STuomas Tynkkynen #define VIRTIO_NET_CTRL_MAC			1
209*f371ad30STuomas Tynkkynen #define VIRTIO_NET_CTRL_MAC_TABLE_SET		0
210*f371ad30STuomas Tynkkynen #define VIRTIO_NET_CTRL_MAC_ADDR_SET		1
211*f371ad30STuomas Tynkkynen 
212*f371ad30STuomas Tynkkynen /*
213*f371ad30STuomas Tynkkynen  * Control VLAN filtering
214*f371ad30STuomas Tynkkynen  *
215*f371ad30STuomas Tynkkynen  * The VLAN filter table is controlled via a simple ADD/DEL interface. VLAN IDs
216*f371ad30STuomas Tynkkynen  * not added may be filterd by the hypervisor. Del is the opposite of add. Both
217*f371ad30STuomas Tynkkynen  * commands expect an out entry containing a 2 byte VLAN ID. VLAN filterting is
218*f371ad30STuomas Tynkkynen  * available with the VIRTIO_NET_F_CTRL_VLAN feature bit.
219*f371ad30STuomas Tynkkynen  */
220*f371ad30STuomas Tynkkynen #define VIRTIO_NET_CTRL_VLAN			2
221*f371ad30STuomas Tynkkynen #define VIRTIO_NET_CTRL_VLAN_ADD		0
222*f371ad30STuomas Tynkkynen #define VIRTIO_NET_CTRL_VLAN_DEL		1
223*f371ad30STuomas Tynkkynen 
224*f371ad30STuomas Tynkkynen /*
225*f371ad30STuomas Tynkkynen  * Control link announce acknowledgment
226*f371ad30STuomas Tynkkynen  *
227*f371ad30STuomas Tynkkynen  * The command VIRTIO_NET_CTRL_ANNOUNCE_ACK is used to indicate that driver has
228*f371ad30STuomas Tynkkynen  * recevied the notification; device would clear the VIRTIO_NET_S_ANNOUNCE bit
229*f371ad30STuomas Tynkkynen  * in the status field after it receives this command.
230*f371ad30STuomas Tynkkynen  */
231*f371ad30STuomas Tynkkynen #define VIRTIO_NET_CTRL_ANNOUNCE		3
232*f371ad30STuomas Tynkkynen #define VIRTIO_NET_CTRL_ANNOUNCE_ACK		0
233*f371ad30STuomas Tynkkynen 
234*f371ad30STuomas Tynkkynen /*
235*f371ad30STuomas Tynkkynen  * Control receive flow steering
236*f371ad30STuomas Tynkkynen  *
237*f371ad30STuomas Tynkkynen  * The command VIRTIO_NET_CTRL_MQ_VQ_PAIRS_SET enables receive flow steering,
238*f371ad30STuomas Tynkkynen  * specifying the number of the transmit and receive queues that will be used.
239*f371ad30STuomas Tynkkynen  * After the command is consumed and acked by the device, the device will not
240*f371ad30STuomas Tynkkynen  * steer new packets on receive virtqueues other than specified nor read from
241*f371ad30STuomas Tynkkynen  * transmit virtqueues other than specified. Accordingly, driver should not
242*f371ad30STuomas Tynkkynen  * transmit new packets  on virtqueues other than specified.
243*f371ad30STuomas Tynkkynen  */
244*f371ad30STuomas Tynkkynen struct virtio_net_ctrl_mq {
245*f371ad30STuomas Tynkkynen 	__virtio16 virtqueue_pairs;
246*f371ad30STuomas Tynkkynen };
247*f371ad30STuomas Tynkkynen 
248*f371ad30STuomas Tynkkynen #define VIRTIO_NET_CTRL_MQ			4
249*f371ad30STuomas Tynkkynen #define VIRTIO_NET_CTRL_MQ_VQ_PAIRS_SET		0
250*f371ad30STuomas Tynkkynen #define VIRTIO_NET_CTRL_MQ_VQ_PAIRS_MIN		1
251*f371ad30STuomas Tynkkynen #define VIRTIO_NET_CTRL_MQ_VQ_PAIRS_MAX		0x8000
252*f371ad30STuomas Tynkkynen 
253*f371ad30STuomas Tynkkynen /*
254*f371ad30STuomas Tynkkynen  * Control network offloads
255*f371ad30STuomas Tynkkynen  *
256*f371ad30STuomas Tynkkynen  * Reconfigures the network offloads that guest can handle.
257*f371ad30STuomas Tynkkynen  *
258*f371ad30STuomas Tynkkynen  * Available with the VIRTIO_NET_F_CTRL_GUEST_OFFLOADS feature bit.
259*f371ad30STuomas Tynkkynen  *
260*f371ad30STuomas Tynkkynen  * Command data format matches the feature bit mask exactly.
261*f371ad30STuomas Tynkkynen  *
262*f371ad30STuomas Tynkkynen  * See VIRTIO_NET_F_GUEST_* for the list of offloads
263*f371ad30STuomas Tynkkynen  * that can be enabled/disabled.
264*f371ad30STuomas Tynkkynen  */
265*f371ad30STuomas Tynkkynen #define VIRTIO_NET_CTRL_GUEST_OFFLOADS		5
266*f371ad30STuomas Tynkkynen #define VIRTIO_NET_CTRL_GUEST_OFFLOADS_SET	0
267*f371ad30STuomas Tynkkynen 
268*f371ad30STuomas Tynkkynen #endif /* _LINUX_VIRTIO_NET_H */
269