virtio_spec/
net.rs

1//! Network Device
2
3use num_enum::{FromPrimitive, 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#[cfg_attr(
27    feature = "zerocopy",
28    derive(
29        zerocopy_derive::KnownLayout,
30        zerocopy_derive::Immutable,
31        zerocopy_derive::FromBytes,
32    )
33)]
34#[derive(VolatileFieldAccess)]
35#[repr(C)]
36pub struct Config {
37    #[access(ReadOnly)]
38    mac: [u8; 6],
39
40    #[access(ReadOnly)]
41    status: S,
42
43    #[access(ReadOnly)]
44    max_virtqueue_pairs: le16,
45
46    #[access(ReadOnly)]
47    mtu: le16,
48
49    #[access(ReadOnly)]
50    speed: le32,
51
52    #[access(ReadOnly)]
53    duplex: u8,
54
55    #[access(ReadOnly)]
56    rss_max_key_size: u8,
57
58    #[access(ReadOnly)]
59    rss_max_indirection_table_length: le16,
60
61    #[access(ReadOnly)]
62    supported_hash_types: le32,
63}
64
65virtio_bitflags! {
66    /// Network Device Header Flags
67    #[doc(alias = "VIRTIO_NET_HDR_F")]
68    pub struct HdrF: u8 {
69        #[doc(alias = "VIRTIO_NET_HDR_F_NEEDS_CSUM")]
70        const NEEDS_CSUM = 1;
71
72        #[doc(alias = "VIRTIO_NET_HDR_F_DATA_VALID")]
73        const DATA_VALID = 2;
74
75        #[doc(alias = "VIRTIO_NET_HDR_F_RSC_INFO")]
76        const RSC_INFO = 4;
77    }
78}
79
80virtio_bitflags! {
81    /// Network Device Header GSO Type
82    #[doc(alias = "VIRTIO_NET_HDR_GSO")]
83    pub struct HdrGso: u8 {
84        #[doc(alias = "VIRTIO_NET_HDR_GSO_NONE")]
85        const NONE = 0;
86
87        #[doc(alias = "VIRTIO_NET_HDR_GSO_TCPV4")]
88        const TCPV4 = 1;
89
90        #[doc(alias = "VIRTIO_NET_HDR_GSO_UDP")]
91        const UDP = 3;
92
93        #[doc(alias = "VIRTIO_NET_HDR_GSO_TCPV6")]
94        const TCPV6 = 4;
95
96        #[doc(alias = "VIRTIO_NET_HDR_GSO_UDP_L4")]
97        const UDP_L4 = 5;
98
99        #[doc(alias = "VIRTIO_NET_HDR_GSO_ECN")]
100        const ECN = 0x80;
101    }
102}
103
104/// Network Device Header
105#[doc(alias = "virtio_net_hdr")]
106#[cfg_attr(
107    feature = "zerocopy",
108    derive(
109        zerocopy_derive::KnownLayout,
110        zerocopy_derive::Immutable,
111        zerocopy_derive::FromBytes,
112        zerocopy_derive::IntoBytes,
113    )
114)]
115#[derive(Default, Clone, Copy, Debug)]
116#[repr(C)]
117pub struct Hdr {
118    pub flags: HdrF,
119    pub gso_type: HdrGso,
120    pub hdr_len: le16,
121    pub gso_size: le16,
122    pub csum_start: le16,
123    pub csum_offset: le16,
124    pub num_buffers: le16,
125}
126
127/// Network Device Header Hash Report
128///
129/// Only if VIRTIO_NET_F_HASH_REPORT negotiated
130#[doc(alias = "virtio_net_hdr")]
131#[cfg_attr(
132    feature = "zerocopy",
133    derive(
134        zerocopy_derive::KnownLayout,
135        zerocopy_derive::Immutable,
136        zerocopy_derive::FromBytes,
137        zerocopy_derive::IntoBytes,
138    )
139)]
140#[derive(Default, Clone, Copy, Debug)]
141#[repr(C)]
142pub struct HdrHashReport {
143    /// Only if VIRTIO_NET_F_HASH_REPORT negotiated
144    pub hash_value: le32,
145    /// Only if VIRTIO_NET_F_HASH_REPORT negotiated
146    pub hash_report: le16,
147    /// Only if VIRTIO_NET_F_HASH_REPORT negotiated
148    pub padding_reserved: le16,
149}
150
151endian_bitflags! {
152    /// Hash Type
153    #[doc(alias = "VIRTIO_NET_HASH_TYPE")]
154    pub struct HashType: le32 {
155        #[doc(alias = "VIRTIO_NET_HASH_TYPE_IPv4")]
156        const IPV4 = 1 << 0;
157
158        #[doc(alias = "VIRTIO_NET_HASH_TYPE_TCPv4")]
159        const TCPV4 = 1 << 1;
160
161        #[doc(alias = "VIRTIO_NET_HASH_TYPE_UDPv4")]
162        const UDPV4 = 1 << 2;
163
164        #[doc(alias = "VIRTIO_NET_HASH_TYPE_IPv6")]
165        const IPV6 = 1 << 3;
166
167        #[doc(alias = "VIRTIO_NET_HASH_TYPE_TCPv6")]
168        const TCPV6 = 1 << 4;
169
170        #[doc(alias = "VIRTIO_NET_HASH_TYPE_UDPv6")]
171        const UDPV6 = 1 << 5;
172
173        #[doc(alias = "VIRTIO_NET_HASH_TYPE_IP_EX")]
174        const IP_EX = 1 << 6;
175
176        #[doc(alias = "VIRTIO_NET_HASH_TYPE_TCP_EX")]
177        const TCP_EX = 1 << 7;
178
179        #[doc(alias = "VIRTIO_NET_HASH_TYPE_UDP_EX")]
180        const UDP_EX = 1 << 8;
181    }
182}
183
184/// Hash Report
185#[doc(alias = "VIRTIO_NET_HASH_REPORT")]
186#[derive(IntoPrimitive, FromPrimitive, PartialEq, Eq, Clone, Copy, Debug)]
187#[non_exhaustive]
188#[repr(u16)]
189pub enum HashReport {
190    #[doc(alias = "VIRTIO_NET_HASH_REPORT_NONE")]
191    None = 0,
192
193    #[doc(alias = "VIRTIO_NET_HASH_REPORT_IPv4")]
194    Ipv4 = 1,
195
196    #[doc(alias = "VIRTIO_NET_HASH_REPORT_TCPv4")]
197    Tcpv4 = 2,
198
199    #[doc(alias = "VIRTIO_NET_HASH_REPORT_UDPv4")]
200    Udpv4 = 3,
201
202    #[doc(alias = "VIRTIO_NET_HASH_REPORT_IPv6")]
203    IPv6 = 4,
204
205    #[doc(alias = "VIRTIO_NET_HASH_REPORT_TCPv6")]
206    Tcpv6 = 5,
207
208    #[doc(alias = "VIRTIO_NET_HASH_REPORT_UDPv6")]
209    Udpv6 = 6,
210
211    #[doc(alias = "VIRTIO_NET_HASH_REPORT_IPv6_EX")]
212    Ipv6Ex = 7,
213
214    #[doc(alias = "VIRTIO_NET_HASH_REPORT_TCPv6_EX")]
215    Tcpv6Ex = 8,
216
217    #[doc(alias = "VIRTIO_NET_HASH_REPORT_UDPv6_EX")]
218    Udpv6Ex = 9,
219
220    #[num_enum(catch_all)]
221    Unknown(u16),
222}
223
224/// Command class
225#[doc(alias = "VIRTIO_NET_CTRL")]
226#[derive(IntoPrimitive, TryFromPrimitive, PartialEq, Eq, Clone, Copy, Debug)]
227#[non_exhaustive]
228#[repr(u8)]
229pub enum Ctrl {
230    #[doc(alias = "VIRTIO_NET_CTRL_RX")]
231    Rx = 0,
232
233    #[doc(alias = "VIRTIO_NET_CTRL_MAC")]
234    Mac = 1,
235
236    #[doc(alias = "VIRTIO_NET_CTRL_VLAN")]
237    Vlan = 2,
238
239    #[doc(alias = "VIRTIO_NET_CTRL_ANNOUNCE")]
240    Announce = 3,
241
242    #[doc(alias = "VIRTIO_NET_CTRL_MQ")]
243    Mq = 4,
244
245    #[doc(alias = "VIRTIO_NET_CTRL_GUEST_OFFLOADS")]
246    GuestOffloads = 5,
247}
248
249/// Commands
250pub mod ctrl {
251    use num_enum::{IntoPrimitive, TryFromPrimitive};
252
253    /// Packed Receive Filtering commands
254    #[doc(alias = "VIRTIO_NET_CTRL_RX")]
255    #[derive(IntoPrimitive, TryFromPrimitive, PartialEq, Eq, Clone, Copy, Debug)]
256    #[non_exhaustive]
257    #[repr(u8)]
258    pub enum Rx {
259        #[doc(alias = "VIRTIO_NET_CTRL_RX_PROMISC")]
260        Promisc = 0,
261
262        #[doc(alias = "VIRTIO_NET_CTRL_RX_ALLMULTI")]
263        Allmulti = 1,
264
265        #[doc(alias = "VIRTIO_NET_CTRL_RX_ALLUNI")]
266        Alluni = 2,
267
268        #[doc(alias = "VIRTIO_NET_CTRL_RX_NOMULTI")]
269        Nomulti = 3,
270
271        #[doc(alias = "VIRTIO_NET_CTRL_RX_NOUNI")]
272        Nouni = 4,
273
274        #[doc(alias = "VIRTIO_NET_CTRL_RX_NOBCAST")]
275        Nobcast = 5,
276    }
277
278    /// MAC Address Filtering commands
279    #[doc(alias = "VIRTIO_NET_CTRL_MAC")]
280    #[derive(IntoPrimitive, TryFromPrimitive, PartialEq, Eq, Clone, Copy, Debug)]
281    #[non_exhaustive]
282    #[repr(u8)]
283    pub enum Mac {
284        #[doc(alias = "VIRTIO_NET_CTRL_MAC_TABLE_SET")]
285        TableSet = 0,
286
287        #[doc(alias = "VIRTIO_NET_CTRL_MAC_ADDR_SET")]
288        AddrSet = 1,
289    }
290
291    /// VLAN filtering commands
292    #[doc(alias = "VIRTIO_NET_CTRL_VLAN")]
293    #[derive(IntoPrimitive, TryFromPrimitive, PartialEq, Eq, Clone, Copy, Debug)]
294    #[non_exhaustive]
295    #[repr(u8)]
296    pub enum Vlan {
297        #[doc(alias = "VIRTIO_NET_CTRL_VLAN_ADD")]
298        Add = 0,
299
300        #[doc(alias = "VIRTIO_NET_CTRL_VLAN_DEL")]
301        Del = 1,
302    }
303
304    /// Gratuitous Packet Sending commands
305    #[doc(alias = "VIRTIO_NET_CTRL_ANNOUNCE")]
306    #[derive(IntoPrimitive, TryFromPrimitive, PartialEq, Eq, Clone, Copy, Debug)]
307    #[non_exhaustive]
308    #[repr(u8)]
309    pub enum Announce {
310        #[doc(alias = "VIRTIO_NET_CTRL_ANNOUNCE_ACK")]
311        Ack = 0,
312    }
313
314    /// Multiqueue mode commands
315    #[doc(alias = "VIRTIO_NET_CTRL_MQ")]
316    #[derive(IntoPrimitive, TryFromPrimitive, PartialEq, Eq, Clone, Copy, Debug)]
317    #[non_exhaustive]
318    #[repr(u8)]
319    pub enum Mq {
320        /// For automatic receive steering
321        #[doc(alias = "VIRTIO_NET_CTRL_MQ_VQ_PAIRS_SET")]
322        VqPairsSet = 0,
323
324        /// For configurable receive steering
325        #[doc(alias = "VIRTIO_NET_CTRL_MQ_RSS_CONFIG")]
326        RssConfig = 1,
327
328        /// For configurable hash calculation
329        #[doc(alias = "VIRTIO_NET_CTRL_MQ_HASH_CONFIG")]
330        HashConfig = 2,
331    }
332
333    /// Setting Offloads State commands
334    #[doc(alias = "VIRTIO_NET_CTRL_GUEST_OFFLOADS")]
335    #[derive(IntoPrimitive, TryFromPrimitive, PartialEq, Eq, Clone, Copy, Debug)]
336    #[non_exhaustive]
337    #[repr(u8)]
338    pub enum GuestOffloads {
339        #[doc(alias = "VIRTIO_NET_CTRL_GUEST_OFFLOADS_SET")]
340        Set = 0,
341    }
342}