1use 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 #[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#[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 #[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#[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#[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#[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#[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#[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 #[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#[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#[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
299pub mod ctrl {
301 use num_enum::{IntoPrimitive, TryFromPrimitive};
302
303 #[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 #[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 #[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 #[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 #[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 #[doc(alias = "VIRTIO_NET_CTRL_MQ_VQ_PAIRS_SET")]
372 VqPairsSet = 0,
373
374 #[doc(alias = "VIRTIO_NET_CTRL_MQ_RSS_CONFIG")]
376 RssConfig = 1,
377
378 #[doc(alias = "VIRTIO_NET_CTRL_MQ_HASH_CONFIG")]
380 HashConfig = 2,
381 }
382
383 #[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}