Skip to main content

virtio_spec/
net.rs

1//! Network Device
2
3use num_enum::{IntoPrimitive, TryFromPrimitive};
4use volatile::access::ReadOnly;
5use volatile_macro::VolatileFieldAccess;
6
7pub use super::features::net::F;
8use crate::{le16, le32};
9
10endian_bitflags! {
11    /// Network Device Status Flags
12    #[doc(alias = "VIRTIO_NET_S")]
13    pub struct S: le16 {
14        #[doc(alias = "VIRTIO_NET_S_LINK_UP")]
15        const LINK_UP = 1;
16
17        #[doc(alias = "VIRTIO_NET_S_ANNOUNCE")]
18        const ANNOUNCE = 2;
19    }
20}
21
22/// Network Device Configuration Layout
23///
24/// Use [`ConfigVolatileFieldAccess`] to work with this struct.
25#[doc(alias = "virtio_net_config")]
26#[derive(VolatileFieldAccess)]
27#[repr(C)]
28pub struct Config {
29    #[access(ReadOnly)]
30    mac: [u8; 6],
31
32    #[access(ReadOnly)]
33    status: S,
34
35    #[access(ReadOnly)]
36    max_virtqueue_pairs: le16,
37
38    #[access(ReadOnly)]
39    mtu: le16,
40
41    #[access(ReadOnly)]
42    speed: le32,
43
44    #[access(ReadOnly)]
45    duplex: u8,
46
47    #[access(ReadOnly)]
48    rss_max_key_size: u8,
49
50    #[access(ReadOnly)]
51    rss_max_indirection_table_length: le16,
52
53    #[access(ReadOnly)]
54    supported_hash_types: le32,
55
56    #[access(ReadOnly)]
57    supported_tunnel_types: le32,
58}
59
60virtio_bitflags! {
61    /// Network Device Header Flags
62    #[doc(alias = "VIRTIO_NET_HDR_F")]
63    pub struct HdrF: u8 {
64        #[doc(alias = "VIRTIO_NET_HDR_F_NEEDS_CSUM")]
65        const NEEDS_CSUM = 1;
66
67        #[doc(alias = "VIRTIO_NET_HDR_F_DATA_VALID")]
68        const DATA_VALID = 2;
69
70        #[doc(alias = "VIRTIO_NET_HDR_F_RSC_INFO")]
71        const RSC_INFO = 4;
72
73        #[doc(alias = "VIRTIO_NET_HDR_F_UDP_TUNNEL_CSUM")]
74        const UDP_TUNNEL_CSUM = 8;
75
76        #[doc(alias = "VIRTIO_NET_HDR_F_SECURITY")]
77        const SECURITY = 16;
78
79        #[doc(alias = "VIRTIO_NET_HDR_F_SECURITY_ERR")]
80        const SECURITY_ERR = 32;
81
82        #[doc(alias = "VIRTIO_NET_HDR_F_SECURITY_SA_SOFT_EXPIRY_WARN")]
83        const SECURITY_SA_SOFT_EXPIRY_WARN = 64;
84    }
85}
86
87/// Network Device Header GSO Type
88#[doc(alias = "VIRTIO_NET_HDR_GSO")]
89#[derive(IntoPrimitive, TryFromPrimitive, PartialEq, Eq, Clone, Copy, Debug)]
90#[non_exhaustive]
91#[repr(u8)]
92pub enum HdrGso {
93    #[doc(alias = "VIRTIO_NET_HDR_GSO_NONE")]
94    None = 0,
95
96    #[doc(alias = "VIRTIO_NET_HDR_GSO_TCPV4")]
97    Tcpv4 = 1,
98
99    #[doc(alias = "VIRTIO_NET_HDR_GSO_UDP")]
100    Udp = 3,
101
102    #[doc(alias = "VIRTIO_NET_HDR_GSO_TCPV6")]
103    Tcpv6 = 4,
104
105    #[doc(alias = "VIRTIO_NET_HDR_GSO_UDP_L4")]
106    UdpL4 = 5,
107
108    #[doc(alias = "VIRTIO_NET_HDR_GSO_UDP_TUNNEL_IPV4")]
109    UdpTunnelIpv4 = 0x20,
110
111    #[doc(alias = "VIRTIO_NET_HDR_GSO_UDP_TUNNEL_IPV6")]
112    UdpTunnelIpv6 = 0x40,
113
114    #[doc(alias = "VIRTIO_NET_HDR_GSO_ECN")]
115    Ecn = 0x80,
116}
117
118/// Network Device Header
119#[doc(alias = "virtio_net_hdr")]
120#[cfg_attr(
121    feature = "zerocopy",
122    derive(
123        zerocopy_derive::KnownLayout,
124        zerocopy_derive::Immutable,
125        zerocopy_derive::FromBytes,
126        zerocopy_derive::IntoBytes,
127    )
128)]
129#[derive(Default, Clone, Copy, Debug)]
130#[repr(C)]
131pub struct Hdr {
132    pub flags: HdrF,
133    pub gso_type: u8,
134    pub hdr_len: le16,
135    pub gso_size: le16,
136    pub csum_start: le16,
137    pub csum_offset: le16,
138    pub num_buffers: le16,
139}
140
141/// Network Device Header with Hash Info
142///
143/// Only if VIRTIO_NET_F_HASH_REPORT negotiated
144#[doc(alias = "virtio_net_hdr_hash")]
145#[cfg_attr(
146    feature = "zerocopy",
147    derive(
148        zerocopy_derive::KnownLayout,
149        zerocopy_derive::Immutable,
150        zerocopy_derive::FromBytes,
151        zerocopy_derive::IntoBytes,
152    )
153)]
154#[derive(Default, Clone, Copy, Debug)]
155#[repr(C)]
156pub struct HdrHash {
157    pub hdr: Hdr,
158    pub hash_value: le32,
159    pub hash_report: le16,
160    pub padding_reserved: le16,
161}
162
163/// Network Device Header with Hash and Tunnel info
164///
165/// Only if VIRTIO_NET_F_HOST_UDP_TUNNEL_GSO or VIRTIO_NET_F_GUEST_UDP_TUNNEL_GSO negotiated
166#[doc(alias = "virtio_net_hdr_hash_tunnel")]
167#[cfg_attr(
168    feature = "zerocopy",
169    derive(
170        zerocopy_derive::KnownLayout,
171        zerocopy_derive::Immutable,
172        zerocopy_derive::FromBytes,
173        zerocopy_derive::IntoBytes,
174    )
175)]
176#[derive(Default, Clone, Copy, Debug)]
177#[repr(C)]
178pub struct HdrHashTunnel {
179    pub hash_hdr: HdrHash,
180    pub outer_th_offset: le16,
181    pub inner_nh_offset: le16,
182}
183
184/// Network Device Header with Hash, Tunnel, and Outer Network info
185///
186/// Only if VIRTIO_NET_F_OUT_NET_HEADER negotiated
187#[doc(alias = "virtio_net_hdr_hash_tunnel_out_net_hdr")]
188#[cfg_attr(
189    feature = "zerocopy",
190    derive(
191        zerocopy_derive::KnownLayout,
192        zerocopy_derive::Immutable,
193        zerocopy_derive::FromBytes,
194        zerocopy_derive::IntoBytes,
195    )
196)]
197#[derive(Default, Clone, Copy, Debug)]
198#[repr(C)]
199pub struct HdrHashTunnelOutNetHdr {
200    pub outer_nh_offset: le16,
201    pub padding_reserved_2: [u8; 6],
202}
203
204endian_bitflags! {
205    /// Hash Type
206    #[doc(alias = "VIRTIO_NET_HASH_TYPE")]
207    pub struct HashType: le32 {
208        #[doc(alias = "VIRTIO_NET_HASH_TYPE_IPv4")]
209        const IPV4 = 1 << 0;
210
211        #[doc(alias = "VIRTIO_NET_HASH_TYPE_TCPv4")]
212        const TCPV4 = 1 << 1;
213
214        #[doc(alias = "VIRTIO_NET_HASH_TYPE_UDPv4")]
215        const UDPV4 = 1 << 2;
216
217        #[doc(alias = "VIRTIO_NET_HASH_TYPE_IPv6")]
218        const IPV6 = 1 << 3;
219
220        #[doc(alias = "VIRTIO_NET_HASH_TYPE_TCPv6")]
221        const TCPV6 = 1 << 4;
222
223        #[doc(alias = "VIRTIO_NET_HASH_TYPE_UDPv6")]
224        const UDPV6 = 1 << 5;
225
226        #[doc(alias = "VIRTIO_NET_HASH_TYPE_IP_EX")]
227        const IP_EX = 1 << 6;
228
229        #[doc(alias = "VIRTIO_NET_HASH_TYPE_TCP_EX")]
230        const TCP_EX = 1 << 7;
231
232        #[doc(alias = "VIRTIO_NET_HASH_TYPE_UDP_EX")]
233        const UDP_EX = 1 << 8;
234    }
235}
236
237/// Hash Report
238#[doc(alias = "VIRTIO_NET_HASH_REPORT")]
239#[derive(IntoPrimitive, TryFromPrimitive, PartialEq, Eq, Clone, Copy, Debug)]
240#[non_exhaustive]
241#[repr(u16)]
242pub enum HashReport {
243    #[doc(alias = "VIRTIO_NET_HASH_REPORT_NONE")]
244    None = 0,
245
246    #[doc(alias = "VIRTIO_NET_HASH_REPORT_IPv4")]
247    Ipv4 = 1,
248
249    #[doc(alias = "VIRTIO_NET_HASH_REPORT_TCPv4")]
250    Tcpv4 = 2,
251
252    #[doc(alias = "VIRTIO_NET_HASH_REPORT_UDPv4")]
253    Udpv4 = 3,
254
255    #[doc(alias = "VIRTIO_NET_HASH_REPORT_IPv6")]
256    IPv6 = 4,
257
258    #[doc(alias = "VIRTIO_NET_HASH_REPORT_TCPv6")]
259    Tcpv6 = 5,
260
261    #[doc(alias = "VIRTIO_NET_HASH_REPORT_UDPv6")]
262    Udpv6 = 6,
263
264    #[doc(alias = "VIRTIO_NET_HASH_REPORT_IPv6_EX")]
265    Ipv6Ex = 7,
266
267    #[doc(alias = "VIRTIO_NET_HASH_REPORT_TCPv6_EX")]
268    Tcpv6Ex = 8,
269
270    #[doc(alias = "VIRTIO_NET_HASH_REPORT_UDPv6_EX")]
271    Udpv6Ex = 9,
272}
273
274/// Command class
275#[doc(alias = "VIRTIO_NET_CTRL")]
276#[derive(IntoPrimitive, TryFromPrimitive, PartialEq, Eq, Clone, Copy, Debug)]
277#[non_exhaustive]
278#[repr(u8)]
279pub enum Ctrl {
280    #[doc(alias = "VIRTIO_NET_CTRL_RX")]
281    Rx = 0,
282
283    #[doc(alias = "VIRTIO_NET_CTRL_MAC")]
284    Mac = 1,
285
286    #[doc(alias = "VIRTIO_NET_CTRL_VLAN")]
287    Vlan = 2,
288
289    #[doc(alias = "VIRTIO_NET_CTRL_ANNOUNCE")]
290    Announce = 3,
291
292    #[doc(alias = "VIRTIO_NET_CTRL_MQ")]
293    Mq = 4,
294
295    #[doc(alias = "VIRTIO_NET_CTRL_GUEST_OFFLOADS")]
296    GuestOffloads = 5,
297}
298
299/// Commands
300pub mod ctrl {
301    use num_enum::{IntoPrimitive, TryFromPrimitive};
302
303    /// Packed Receive Filtering commands
304    #[doc(alias = "VIRTIO_NET_CTRL_RX")]
305    #[derive(IntoPrimitive, TryFromPrimitive, PartialEq, Eq, Clone, Copy, Debug)]
306    #[non_exhaustive]
307    #[repr(u8)]
308    pub enum Rx {
309        #[doc(alias = "VIRTIO_NET_CTRL_RX_PROMISC")]
310        Promisc = 0,
311
312        #[doc(alias = "VIRTIO_NET_CTRL_RX_ALLMULTI")]
313        Allmulti = 1,
314
315        #[doc(alias = "VIRTIO_NET_CTRL_RX_ALLUNI")]
316        Alluni = 2,
317
318        #[doc(alias = "VIRTIO_NET_CTRL_RX_NOMULTI")]
319        Nomulti = 3,
320
321        #[doc(alias = "VIRTIO_NET_CTRL_RX_NOUNI")]
322        Nouni = 4,
323
324        #[doc(alias = "VIRTIO_NET_CTRL_RX_NOBCAST")]
325        Nobcast = 5,
326    }
327
328    /// MAC Address Filtering commands
329    #[doc(alias = "VIRTIO_NET_CTRL_MAC")]
330    #[derive(IntoPrimitive, TryFromPrimitive, PartialEq, Eq, Clone, Copy, Debug)]
331    #[non_exhaustive]
332    #[repr(u8)]
333    pub enum Mac {
334        #[doc(alias = "VIRTIO_NET_CTRL_MAC_TABLE_SET")]
335        TableSet = 0,
336
337        #[doc(alias = "VIRTIO_NET_CTRL_MAC_ADDR_SET")]
338        AddrSet = 1,
339    }
340
341    /// VLAN filtering commands
342    #[doc(alias = "VIRTIO_NET_CTRL_VLAN")]
343    #[derive(IntoPrimitive, TryFromPrimitive, PartialEq, Eq, Clone, Copy, Debug)]
344    #[non_exhaustive]
345    #[repr(u8)]
346    pub enum Vlan {
347        #[doc(alias = "VIRTIO_NET_CTRL_VLAN_ADD")]
348        Add = 0,
349
350        #[doc(alias = "VIRTIO_NET_CTRL_VLAN_DEL")]
351        Del = 1,
352    }
353
354    /// Gratuitous Packet Sending commands
355    #[doc(alias = "VIRTIO_NET_CTRL_ANNOUNCE")]
356    #[derive(IntoPrimitive, TryFromPrimitive, PartialEq, Eq, Clone, Copy, Debug)]
357    #[non_exhaustive]
358    #[repr(u8)]
359    pub enum Announce {
360        #[doc(alias = "VIRTIO_NET_CTRL_ANNOUNCE_ACK")]
361        Ack = 0,
362    }
363
364    /// Multiqueue mode commands
365    #[doc(alias = "VIRTIO_NET_CTRL_MQ")]
366    #[derive(IntoPrimitive, TryFromPrimitive, PartialEq, Eq, Clone, Copy, Debug)]
367    #[non_exhaustive]
368    #[repr(u8)]
369    pub enum Mq {
370        /// For automatic receive steering
371        #[doc(alias = "VIRTIO_NET_CTRL_MQ_VQ_PAIRS_SET")]
372        VqPairsSet = 0,
373
374        /// For configurable receive steering
375        #[doc(alias = "VIRTIO_NET_CTRL_MQ_RSS_CONFIG")]
376        RssConfig = 1,
377
378        /// For configurable hash calculation
379        #[doc(alias = "VIRTIO_NET_CTRL_MQ_HASH_CONFIG")]
380        HashConfig = 2,
381    }
382
383    /// Setting Offloads State commands
384    #[doc(alias = "VIRTIO_NET_CTRL_GUEST_OFFLOADS")]
385    #[derive(IntoPrimitive, TryFromPrimitive, PartialEq, Eq, Clone, Copy, Debug)]
386    #[non_exhaustive]
387    #[repr(u8)]
388    pub enum GuestOffloads {
389        #[doc(alias = "VIRTIO_NET_CTRL_GUEST_OFFLOADS_SET")]
390        Set = 0,
391    }
392}