Skip to content

Commit 9368878

Browse files
committed
Add `if_xdp.h" structs and constants
Also adds _v1 versions for backwards compatibility
1 parent 3195caf commit 9368878

File tree

5 files changed

+317
-0
lines changed

5 files changed

+317
-0
lines changed

libc-test/build.rs

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3408,6 +3408,7 @@ fn test_linux(target: &str) {
34083408
"linux/if_alg.h",
34093409
"linux/if_ether.h",
34103410
"linux/if_tun.h",
3411+
"linux/if_xdp.h",
34113412
"linux/input.h",
34123413
"linux/ipv6.h",
34133414
"linux/kexec.h",
@@ -3642,6 +3643,30 @@ fn test_linux(target: &str) {
36423643
true
36433644
}
36443645

3646+
// FIXME: Requires >= 5.3 kernel headers.
3647+
// Everything that uses install-musl.sh has 4.19 kernel headers.
3648+
"xdp_options" if musl => true,
3649+
3650+
// FIXME: Requires >= 5.4 kernel headers.
3651+
// Everything that uses install-musl.sh has 4.19 kernel headers.
3652+
"xdp_umem_reg" | "xdp_ring_offset" | "xdp_mmap_offsets" if musl => true,
3653+
3654+
// FIXME: Requires >= 5.9 kernel headers.
3655+
// Everything that uses install-musl.sh has 4.19 kernel headers.
3656+
"xdp_statistics" if musl => true,
3657+
3658+
// A new field was added in kernel 5.4, this is the old version for backwards compatibility.
3659+
// https://github.com/torvalds/linux/commit/77cd0d7b3f257fd0e3096b4fdcff1a7d38e99e10
3660+
"xdp_ring_offset_v1" | "xdp_mmap_offsets_v1" => true,
3661+
3662+
// Multiple new fields were added in kernel 5.9, this is the old version for backwards compatibility.
3663+
// https://github.com/torvalds/linux/commit/77cd0d7b3f257fd0e3096b4fdcff1a7d38e99e10
3664+
"xdp_statistics_v1" => true,
3665+
3666+
// A new field was added in kernel 5.4, this is the old version for backwards compatibility.
3667+
// https://github.com/torvalds/linux/commit/c05cd3645814724bdeb32a2b4d953b12bdea5f8c
3668+
"xdp_umem_reg_v1" => true,
3669+
36453670
_ => false,
36463671
}
36473672
});
@@ -3994,6 +4019,34 @@ fn test_linux(target: &str) {
39944019
true
39954020
}
39964021

4022+
// FIXME: Requires >= 5.3 kernel headers.
4023+
// Everything that uses install-musl.sh has 4.19 kernel headers.
4024+
"XDP_OPTIONS_ZEROCOPY" | "XDP_OPTIONS"
4025+
if musl =>
4026+
{
4027+
true
4028+
}
4029+
4030+
// FIXME: Requires >= 5.4 kernel headers.
4031+
// Everything that uses install-musl.sh has 4.19 kernel headers.
4032+
"XSK_UNALIGNED_BUF_OFFSET_SHIFT"
4033+
| "XSK_UNALIGNED_BUF_ADDR_MASK"
4034+
| "XDP_UMEM_UNALIGNED_CHUNK_FLAG"
4035+
| "XDP_RING_NEED_WAKEUP"
4036+
| "XDP_USE_NEED_WAKEUP"
4037+
if musl =>
4038+
{
4039+
true
4040+
}
4041+
4042+
// FIXME: Requires >= 6.6 kernel headers.
4043+
"XDP_USE_SG"
4044+
| "XDP_PKT_CONTD"
4045+
=>
4046+
{
4047+
true
4048+
}
4049+
39974050
_ => false,
39984051
}
39994052
});

libc-test/semver/linux-gnu.txt

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -486,6 +486,29 @@ UDF_SUPER_MAGIC
486486
UNAME26
487487
USBDEVICE_SUPER_MAGIC
488488
USER_PROCESS
489+
XDP_SHARED_UMEM
490+
XDP_COPY
491+
XDP_ZEROCOPY
492+
XDP_USE_NEED_WAKEUP
493+
XDP_USE_SG
494+
XDP_UMEM_UNALIGNED_CHUNK_FLAG
495+
XDP_RING_NEED_WAKEUP
496+
XDP_MMAP_OFFSETS
497+
XDP_RX_RING
498+
XDP_TX_RING
499+
XDP_UMEM_REG
500+
XDP_UMEM_FILL_RING
501+
XDP_UMEM_COMPLETION_RING
502+
XDP_STATISTICS
503+
XDP_OPTIONS
504+
XDP_OPTIONS_ZEROCOPY
505+
XDP_PGOFF_RX_RING
506+
XDP_PGOFF_TX_RING
507+
XDP_UMEM_PGOFF_FILL_RING
508+
XDP_UMEM_PGOFF_COMPLETION_RING
509+
XSK_UNALIGNED_BUF_OFFSET_SHIFT
510+
XSK_UNALIGNED_BUF_ADDR_MASK
511+
XDP_PKT_CONTD
489512
XENFS_SUPER_MAGIC
490513
XFS_SUPER_MAGIC
491514
_SC_2_C_VERSION

libc-test/semver/linux-musl.txt

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,29 @@ PF_XDP
2323
PIDFD_NONBLOCK
2424
PR_SET_VMA
2525
PR_SET_VMA_ANON_NAME
26+
XDP_SHARED_UMEM
27+
XDP_COPY
28+
XDP_ZEROCOPY
29+
XDP_USE_NEED_WAKEUP
30+
XDP_USE_SG
31+
XDP_UMEM_UNALIGNED_CHUNK_FLAG
32+
XDP_RING_NEED_WAKEUP
33+
XDP_MMAP_OFFSETS
34+
XDP_RX_RING
35+
XDP_TX_RING
36+
XDP_UMEM_REG
37+
XDP_UMEM_FILL_RING
38+
XDP_UMEM_COMPLETION_RING
39+
XDP_STATISTICS
40+
XDP_OPTIONS
41+
XDP_OPTIONS_ZEROCOPY
42+
XDP_PGOFF_RX_RING
43+
XDP_PGOFF_TX_RING
44+
XDP_UMEM_PGOFF_FILL_RING
45+
XDP_UMEM_PGOFF_COMPLETION_RING
46+
XSK_UNALIGNED_BUF_OFFSET_SHIFT
47+
XSK_UNALIGNED_BUF_ADDR_MASK
48+
XDP_PKT_CONTD
2649
adjtimex
2750
aio_cancel
2851
aio_error

src/unix/linux_like/linux/gnu/mod.rs

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -355,6 +355,83 @@ s! {
355355
#[cfg(libc_union)]
356356
pub u: __c_anonymous_ptrace_syscall_info_data,
357357
}
358+
359+
// linux/if_xdp.h
360+
361+
pub struct sockaddr_xdp {
362+
pub sxdp_family: ::__u16,
363+
pub sxdp_flags: ::__u16,
364+
pub sxdp_ifindex: ::__u32,
365+
pub sxdp_queue_id: ::__u32,
366+
pub sxdp_shared_umem_fd: ::__u32,
367+
}
368+
369+
pub struct xdp_ring_offset {
370+
pub producer: ::__u64,
371+
pub consumer: ::__u64,
372+
pub desc: ::__u64,
373+
pub flags: ::__u64,
374+
}
375+
376+
pub struct xdp_mmap_offsets {
377+
pub rx: xdp_ring_offset,
378+
pub tx: xdp_ring_offset,
379+
pub fr: xdp_ring_offset,
380+
pub cr: xdp_ring_offset,
381+
}
382+
383+
pub struct xdp_ring_offset_v1 {
384+
pub producer: ::__u64,
385+
pub consumer: ::__u64,
386+
pub desc: ::__u64,
387+
}
388+
389+
pub struct xdp_mmap_offsets_v1 {
390+
pub rx: xdp_ring_offset_v1,
391+
pub tx: xdp_ring_offset_v1,
392+
pub fr: xdp_ring_offset_v1,
393+
pub cr: xdp_ring_offset_v1,
394+
}
395+
396+
pub struct xdp_umem_reg {
397+
pub addr: ::__u64,
398+
pub len: ::__u64,
399+
pub chunk_size: ::__u32,
400+
pub headroom: ::__u32,
401+
pub flags: ::__u32,
402+
}
403+
404+
pub struct xdp_umem_reg_v1 {
405+
pub addr: ::__u64,
406+
pub len: ::__u64,
407+
pub chunk_size: ::__u32,
408+
pub headroom: ::__u32,
409+
}
410+
411+
pub struct xdp_statistics {
412+
pub rx_dropped: ::__u64,
413+
pub rx_invalid_descs: ::__u64,
414+
pub tx_invalid_descs: ::__u64,
415+
pub rx_ring_full: ::__u64,
416+
pub rx_fill_ring_empty_descs: ::__u64,
417+
pub tx_ring_empty_descs: ::__u64,
418+
}
419+
420+
pub struct xdp_statistics_v1 {
421+
pub rx_dropped: ::__u64,
422+
pub rx_invalid_descs: ::__u64,
423+
pub tx_invalid_descs: ::__u64,
424+
}
425+
426+
pub struct xdp_options {
427+
pub flags: ::__u32,
428+
}
429+
430+
pub struct xdp_desc {
431+
pub addr: ::__u64,
432+
pub len: ::__u32,
433+
pub options: ::__u32,
434+
}
358435
}
359436

360437
impl siginfo_t {
@@ -920,6 +997,38 @@ pub const GENL_UNS_ADMIN_PERM: ::c_int = 0x10;
920997
pub const GENL_ID_VFS_DQUOT: ::c_int = ::NLMSG_MIN_TYPE + 1;
921998
pub const GENL_ID_PMCRAID: ::c_int = ::NLMSG_MIN_TYPE + 2;
922999

1000+
// linux/if_xdp.h
1001+
pub const XDP_SHARED_UMEM: ::__u16 = 1 << 0;
1002+
pub const XDP_COPY: ::__u16 = 1 << 1;
1003+
pub const XDP_ZEROCOPY: ::__u16 = 1 << 2;
1004+
pub const XDP_USE_NEED_WAKEUP: ::__u16 = 1 << 3;
1005+
pub const XDP_USE_SG: ::__u16 = 1 << 4;
1006+
1007+
pub const XDP_UMEM_UNALIGNED_CHUNK_FLAG: ::__u32 = 1 << 0;
1008+
1009+
pub const XDP_RING_NEED_WAKEUP: ::__u32 = 1 << 0;
1010+
1011+
pub const XDP_MMAP_OFFSETS: ::c_int = 1;
1012+
pub const XDP_RX_RING: ::c_int = 2;
1013+
pub const XDP_TX_RING: ::c_int = 3;
1014+
pub const XDP_UMEM_REG: ::c_int = 4;
1015+
pub const XDP_UMEM_FILL_RING: ::c_int = 5;
1016+
pub const XDP_UMEM_COMPLETION_RING: ::c_int = 6;
1017+
pub const XDP_STATISTICS: ::c_int = 7;
1018+
pub const XDP_OPTIONS: ::c_int = 8;
1019+
1020+
pub const XDP_OPTIONS_ZEROCOPY: ::__u32 = 1 << 0;
1021+
1022+
pub const XDP_PGOFF_RX_RING: ::off_t = 0;
1023+
pub const XDP_PGOFF_TX_RING: ::off_t = 0x80000000;
1024+
pub const XDP_UMEM_PGOFF_FILL_RING: ::c_ulonglong = 0x100000000;
1025+
pub const XDP_UMEM_PGOFF_COMPLETION_RING: ::c_ulonglong = 0x180000000;
1026+
1027+
pub const XSK_UNALIGNED_BUF_OFFSET_SHIFT: ::c_int = 48;
1028+
pub const XSK_UNALIGNED_BUF_ADDR_MASK: ::c_ulonglong = (1 << XSK_UNALIGNED_BUF_OFFSET_SHIFT) - 1;
1029+
1030+
pub const XDP_PKT_CONTD: ::__u32 = 1 << 0;
1031+
9231032
// elf.h
9241033
pub const NT_PRSTATUS: ::c_int = 1;
9251034
pub const NT_PRFPREG: ::c_int = 2;

src/unix/linux_like/linux/musl/mod.rs

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,83 @@ s! {
271271
pub maxerror: ::c_long,
272272
pub esterror: ::c_long,
273273
}
274+
275+
// linux/if_xdp.h
276+
277+
pub struct sockaddr_xdp {
278+
pub sxdp_family: ::__u16,
279+
pub sxdp_flags: ::__u16,
280+
pub sxdp_ifindex: ::__u32,
281+
pub sxdp_queue_id: ::__u32,
282+
pub sxdp_shared_umem_fd: ::__u32,
283+
}
284+
285+
pub struct xdp_ring_offset {
286+
pub producer: ::__u64,
287+
pub consumer: ::__u64,
288+
pub desc: ::__u64,
289+
pub flags: ::__u64,
290+
}
291+
292+
pub struct xdp_mmap_offsets {
293+
pub rx: xdp_ring_offset,
294+
pub tx: xdp_ring_offset,
295+
pub fr: xdp_ring_offset,
296+
pub cr: xdp_ring_offset,
297+
}
298+
299+
pub struct xdp_ring_offset_v1 {
300+
pub producer: ::__u64,
301+
pub consumer: ::__u64,
302+
pub desc: ::__u64,
303+
}
304+
305+
pub struct xdp_mmap_offsets_v1 {
306+
pub rx: xdp_ring_offset_v1,
307+
pub tx: xdp_ring_offset_v1,
308+
pub fr: xdp_ring_offset_v1,
309+
pub cr: xdp_ring_offset_v1,
310+
}
311+
312+
pub struct xdp_umem_reg {
313+
pub addr: ::__u64,
314+
pub len: ::__u64,
315+
pub chunk_size: ::__u32,
316+
pub headroom: ::__u32,
317+
pub flags: ::__u32,
318+
}
319+
320+
pub struct xdp_umem_reg_v1 {
321+
pub addr: ::__u64,
322+
pub len: ::__u64,
323+
pub chunk_size: ::__u32,
324+
pub headroom: ::__u32,
325+
}
326+
327+
pub struct xdp_statistics {
328+
pub rx_dropped: ::__u64,
329+
pub rx_invalid_descs: ::__u64,
330+
pub tx_invalid_descs: ::__u64,
331+
pub rx_ring_full: ::__u64,
332+
pub rx_fill_ring_empty_descs: ::__u64,
333+
pub tx_ring_empty_descs: ::__u64,
334+
}
335+
336+
pub struct xdp_statistics_v1 {
337+
pub rx_dropped: ::__u64,
338+
pub rx_invalid_descs: ::__u64,
339+
pub tx_invalid_descs: ::__u64,
340+
}
341+
342+
pub struct xdp_options {
343+
pub flags: ::__u32,
344+
}
345+
346+
pub struct xdp_desc {
347+
pub addr: ::__u64,
348+
pub len: ::__u32,
349+
pub options: ::__u32,
350+
}
274351
}
275352

276353
s_no_extra_traits! {
@@ -703,6 +780,38 @@ pub const TIME_ERROR: ::c_int = 5;
703780
pub const TIME_BAD: ::c_int = TIME_ERROR;
704781
pub const MAXTC: ::c_long = 6;
705782

783+
// linux/if_xdp.h
784+
pub const XDP_SHARED_UMEM: ::__u16 = 1 << 0;
785+
pub const XDP_COPY: ::__u16 = 1 << 1;
786+
pub const XDP_ZEROCOPY: ::__u16 = 1 << 2;
787+
pub const XDP_USE_NEED_WAKEUP: ::__u16 = 1 << 3;
788+
pub const XDP_USE_SG: ::__u16 = 1 << 4;
789+
790+
pub const XDP_UMEM_UNALIGNED_CHUNK_FLAG: ::__u32 = 1 << 0;
791+
792+
pub const XDP_RING_NEED_WAKEUP: ::__u32 = 1 << 0;
793+
794+
pub const XDP_MMAP_OFFSETS: ::c_int = 1;
795+
pub const XDP_RX_RING: ::c_int = 2;
796+
pub const XDP_TX_RING: ::c_int = 3;
797+
pub const XDP_UMEM_REG: ::c_int = 4;
798+
pub const XDP_UMEM_FILL_RING: ::c_int = 5;
799+
pub const XDP_UMEM_COMPLETION_RING: ::c_int = 6;
800+
pub const XDP_STATISTICS: ::c_int = 7;
801+
pub const XDP_OPTIONS: ::c_int = 8;
802+
803+
pub const XDP_OPTIONS_ZEROCOPY: ::__u32 = 1 << 0;
804+
805+
pub const XDP_PGOFF_RX_RING: ::off_t = 0;
806+
pub const XDP_PGOFF_TX_RING: ::off_t = 0x80000000;
807+
pub const XDP_UMEM_PGOFF_FILL_RING: ::c_ulonglong = 0x100000000;
808+
pub const XDP_UMEM_PGOFF_COMPLETION_RING: ::c_ulonglong = 0x180000000;
809+
810+
pub const XSK_UNALIGNED_BUF_OFFSET_SHIFT: ::c_int = 48;
811+
pub const XSK_UNALIGNED_BUF_ADDR_MASK: ::c_ulonglong = (1 << XSK_UNALIGNED_BUF_OFFSET_SHIFT) - 1;
812+
813+
pub const XDP_PKT_CONTD: ::__u32 = 1 << 0;
814+
706815
cfg_if! {
707816
if #[cfg(target_arch = "s390x")] {
708817
pub const POSIX_FADV_DONTNEED: ::c_int = 6;

0 commit comments

Comments
 (0)