1use 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 #[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#[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 #[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 #[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#[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#[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 pub hash_value: le32,
145 pub hash_report: le16,
147 pub padding_reserved: le16,
149}
150
151endian_bitflags! {
152 #[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#[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#[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
249pub mod ctrl {
251 use num_enum::{IntoPrimitive, TryFromPrimitive};
252
253 #[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 #[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 #[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 #[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 #[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 #[doc(alias = "VIRTIO_NET_CTRL_MQ_VQ_PAIRS_SET")]
322 VqPairsSet = 0,
323
324 #[doc(alias = "VIRTIO_NET_CTRL_MQ_RSS_CONFIG")]
326 RssConfig = 1,
327
328 #[doc(alias = "VIRTIO_NET_CTRL_MQ_HASH_CONFIG")]
330 HashConfig = 2,
331 }
332
333 #[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}