Skip to content

Commit 610eb02

Browse files
committed
if_tun.h ioctls for android
Add missing constants from linux/if_tun.h header on android platform. Mainly ioctl operation codes
1 parent 67442f4 commit 610eb02

File tree

4 files changed

+157
-66
lines changed

4 files changed

+157
-66
lines changed

libc-test/semver/android.txt

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2897,13 +2897,42 @@ TIOCSWINSZ
28972897
TMPFS_MAGIC
28982898
TMP_MAX
28992899
TOSTOP
2900+
TUNATTACHFILTER
2901+
TUNDETACHFILTER
2902+
TUNGETFEATURES
2903+
TUNGETFILTER
2904+
TUNGETIFF
2905+
TUNGETSNDBUF
2906+
TUNGETVNETBE
2907+
TUNGETVNETHDRSZ
2908+
TUNGETVNETLE
2909+
TUNSETDEBUG
2910+
TUNSETFILTEREBPF
2911+
TUNSETGROUP
2912+
TUNSETIFF
2913+
TUNSETIFINDEX
2914+
TUNSETLINK
2915+
TUNSETNOCSUM
2916+
TUNSETOFFLOAD
2917+
TUNSETOWNER
2918+
TUNSETPERSIST
2919+
TUNSETQUEUE
2920+
TUNSETSNDBUF
2921+
TUNSETSTEERINGEBPF
2922+
TUNSETTXFILTER
2923+
TUNSETVNETBE
2924+
TUNSETVNETHDRSZ
2925+
TUNSETVNETLE
2926+
TUN_FLT_ALLMULTI
29002927
TUN_F_CSUM
29012928
TUN_F_TSO4
29022929
TUN_F_TSO6
29032930
TUN_F_TSO_ECN
29042931
TUN_F_UFO
29052932
TUN_F_USO4
29062933
TUN_F_USO6
2934+
TUN_PKT_STRIP
2935+
TUN_TX_TIMESTAMP
29072936
UINPUT_MAX_NAME_SIZE
29082937
UINPUT_VERSION
29092938
UIO_MAXIOV

src/unix/linux_like/android/mod.rs

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2638,6 +2638,7 @@ pub const IFF_ATTACH_QUEUE: c_int = 0x0200;
26382638
pub const IFF_DETACH_QUEUE: c_int = 0x0400;
26392639
pub const IFF_PERSIST: c_int = 0x0800;
26402640
pub const IFF_NOFILTER: c_int = 0x1000;
2641+
pub const TUN_TX_TIMESTAMP: c_int = 1;
26412642
// Features for GSO (TUNSETOFFLOAD)
26422643
pub const TUN_F_CSUM: c_uint = 0x01;
26432644
pub const TUN_F_TSO4: c_uint = 0x02;
@@ -2646,6 +2647,40 @@ pub const TUN_F_TSO_ECN: c_uint = 0x08;
26462647
pub const TUN_F_UFO: c_uint = 0x10;
26472648
pub const TUN_F_USO4: c_uint = 0x20;
26482649
pub const TUN_F_USO6: c_uint = 0x40;
2650+
// Protocol info prepended to the packets (when IFF_NO_PI is not set)
2651+
pub const TUN_PKT_STRIP: c_int = 0x0001;
2652+
// Accept all multicast packets
2653+
pub const TUN_FLT_ALLMULTI: c_int = 0x0001;
2654+
// Ioctl operation codes
2655+
const T_TYPE: u32 = b'T' as u32;
2656+
pub const TUNSETNOCSUM: c_int = _IOW::<c_int>(T_TYPE, 200);
2657+
pub const TUNSETDEBUG: c_int = _IOW::<c_int>(T_TYPE, 201);
2658+
pub const TUNSETIFF: c_int = _IOW::<c_int>(T_TYPE, 202);
2659+
pub const TUNSETPERSIST: c_int = _IOW::<c_int>(T_TYPE, 203);
2660+
pub const TUNSETOWNER: c_int = _IOW::<c_int>(T_TYPE, 204);
2661+
pub const TUNSETLINK: c_int = _IOW::<c_int>(T_TYPE, 205);
2662+
pub const TUNSETGROUP: c_int = _IOW::<c_int>(T_TYPE, 206);
2663+
pub const TUNGETFEATURES: c_int = _IOR::<c_int>(T_TYPE, 207);
2664+
pub const TUNSETOFFLOAD: c_int = _IOW::<c_int>(T_TYPE, 208);
2665+
pub const TUNSETTXFILTER: c_int = _IOW::<c_int>(T_TYPE, 209);
2666+
pub const TUNGETIFF: c_int = _IOR::<c_int>(T_TYPE, 210);
2667+
pub const TUNGETSNDBUF: c_int = _IOR::<c_int>(T_TYPE, 211);
2668+
pub const TUNSETSNDBUF: c_int = _IOW::<c_int>(T_TYPE, 212);
2669+
pub const TUNATTACHFILTER: c_int = _IOW::<sock_fprog>(T_TYPE, 213);
2670+
pub const TUNDETACHFILTER: c_int = _IOW::<sock_fprog>(T_TYPE, 214);
2671+
pub const TUNGETVNETHDRSZ: c_int = _IOR::<c_int>(T_TYPE, 215);
2672+
pub const TUNSETVNETHDRSZ: c_int = _IOW::<c_int>(T_TYPE, 216);
2673+
pub const TUNSETQUEUE: c_int = _IOW::<c_int>(T_TYPE, 217);
2674+
pub const TUNSETIFINDEX: c_int = _IOW::<c_int>(T_TYPE, 218);
2675+
pub const TUNGETFILTER: c_int = _IOR::<sock_fprog>(T_TYPE, 219);
2676+
pub const TUNSETVNETLE: c_int = _IOW::<c_int>(T_TYPE, 220);
2677+
pub const TUNGETVNETLE: c_int = _IOR::<c_int>(T_TYPE, 221);
2678+
pub const TUNSETVNETBE: c_int = _IOW::<c_int>(T_TYPE, 222);
2679+
pub const TUNGETVNETBE: c_int = _IOR::<c_int>(T_TYPE, 223);
2680+
pub const TUNSETSTEERINGEBPF: c_int = _IOR::<c_int>(T_TYPE, 224);
2681+
pub const TUNSETFILTEREBPF: c_int = _IOR::<c_int>(T_TYPE, 225);
2682+
pub const TUNSETCARRIER: c_int = _IOW::<c_int>(T_TYPE, 226);
2683+
pub const TUNGETDEVNETNS: c_int = _IO(T_TYPE, 227);
26492684

26502685
// start android/platform/bionic/libc/kernel/uapi/linux/if_ether.h
26512686
// from https://android.googlesource.com/platform/bionic/+/HEAD/libc/kernel/uapi/linux/if_ether.h
@@ -4221,3 +4256,23 @@ impl siginfo_t {
42214256
self.sifields().sigchld.si_stime
42224257
}
42234258
}
4259+
4260+
/// Build an ioctl number for an argumentless ioctl.
4261+
pub const fn _IO(ty: u32, nr: u32) -> c_int {
4262+
super::_IOC(super::_IOC_NONE, ty, nr, 0) as c_int
4263+
}
4264+
4265+
/// Build an ioctl number for an read-only ioctl.
4266+
pub const fn _IOR<T>(ty: u32, nr: u32) -> c_int {
4267+
super::_IOC(super::_IOC_READ, ty, nr, mem::size_of::<T>()) as c_int
4268+
}
4269+
4270+
/// Build an ioctl number for an write-only ioctl.
4271+
pub const fn _IOW<T>(ty: u32, nr: u32) -> c_int {
4272+
super::_IOC(super::_IOC_WRITE, ty, nr, mem::size_of::<T>()) as c_int
4273+
}
4274+
4275+
/// Build an ioctl number for a read-write ioctl.
4276+
pub const fn _IOWR<T>(ty: u32, nr: u32) -> c_int {
4277+
super::_IOC(super::_IOC_READ | super::_IOC_WRITE, ty, nr, mem::size_of::<T>()) as c_int
4278+
}

src/unix/linux_like/linux/mod.rs

Lines changed: 6 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -5940,88 +5940,28 @@ pub const SCHED_FLAG_ALL: c_int = SCHED_FLAG_RESET_ON_FORK
59405940
pub const EPIOCSPARAMS: Ioctl = 0x40088a01;
59415941
pub const EPIOCGPARAMS: Ioctl = 0x80088a02;
59425942

5943-
const _IOC_NRBITS: u32 = 8;
5944-
const _IOC_TYPEBITS: u32 = 8;
5945-
59465943
// siginfo.h
59475944
pub const SI_DETHREAD: c_int = -7;
59485945
pub const TRAP_PERF: c_int = 6;
59495946

5950-
// https://github.com/search?q=repo%3Atorvalds%2Flinux+%22%23define+_IOC_NONE%22&type=code
5951-
cfg_if! {
5952-
if #[cfg(any(
5953-
any(target_arch = "powerpc", target_arch = "powerpc64"),
5954-
any(target_arch = "sparc", target_arch = "sparc64"),
5955-
any(target_arch = "mips", target_arch = "mips64"),
5956-
))] {
5957-
// https://github.com/torvalds/linux/blob/b311c1b497e51a628aa89e7cb954481e5f9dced2/arch/powerpc/include/uapi/asm/ioctl.h
5958-
// https://github.com/torvalds/linux/blob/b311c1b497e51a628aa89e7cb954481e5f9dced2/arch/sparc/include/uapi/asm/ioctl.h
5959-
// https://github.com/torvalds/linux/blob/b311c1b497e51a628aa89e7cb954481e5f9dced2/arch/mips/include/uapi/asm/ioctl.h
5960-
5961-
const _IOC_SIZEBITS: u32 = 13;
5962-
const _IOC_DIRBITS: u32 = 3;
5963-
5964-
const _IOC_NONE: u32 = 1;
5965-
const _IOC_READ: u32 = 2;
5966-
const _IOC_WRITE: u32 = 4;
5967-
} else {
5968-
// https://github.com/torvalds/linux/blob/b311c1b497e51a628aa89e7cb954481e5f9dced2/include/uapi/asm-generic/ioctl.h
5969-
5970-
const _IOC_SIZEBITS: u32 = 14;
5971-
const _IOC_DIRBITS: u32 = 2;
5972-
5973-
const _IOC_NONE: u32 = 0;
5974-
const _IOC_WRITE: u32 = 1;
5975-
const _IOC_READ: u32 = 2;
5976-
}
5977-
}
5978-
5979-
const _IOC_NRMASK: u32 = (1 << _IOC_NRBITS) - 1;
5980-
const _IOC_TYPEMASK: u32 = (1 << _IOC_TYPEBITS) - 1;
5981-
const _IOC_SIZEMASK: u32 = (1 << _IOC_SIZEBITS) - 1;
5982-
const _IOC_DIRMASK: u32 = (1 << _IOC_DIRBITS) - 1;
5983-
5984-
const _IOC_NRSHIFT: u32 = 0;
5985-
const _IOC_TYPESHIFT: u32 = _IOC_NRSHIFT + _IOC_NRBITS;
5986-
const _IOC_SIZESHIFT: u32 = _IOC_TYPESHIFT + _IOC_TYPEBITS;
5987-
const _IOC_DIRSHIFT: u32 = _IOC_SIZESHIFT + _IOC_SIZEBITS;
5988-
5989-
// adapted from https://github.com/torvalds/linux/blob/8a696a29c6905594e4abf78eaafcb62165ac61f1/rust/kernel/ioctl.rs
5990-
5991-
/// Build an ioctl number, analogous to the C macro of the same name.
5992-
const fn _IOC(dir: u32, ty: u32, nr: u32, size: usize) -> u32 {
5993-
// FIXME(ctest) the `garando_syntax` crate (used by ctest in the CI test suite)
5994-
// cannot currently parse these `debug_assert!`s
5995-
//
5996-
// debug_assert!(dir <= _IOC_DIRMASK);
5997-
// debug_assert!(ty <= _IOC_TYPEMASK);
5998-
// debug_assert!(nr <= _IOC_NRMASK);
5999-
// debug_assert!(size <= (_IOC_SIZEMASK as usize));
6000-
6001-
(dir << _IOC_DIRSHIFT)
6002-
| (ty << _IOC_TYPESHIFT)
6003-
| (nr << _IOC_NRSHIFT)
6004-
| ((size as u32) << _IOC_SIZESHIFT)
6005-
}
6006-
6007-
/// Build an ioctl number for an argumentless ioctl.
6008-
pub const fn _IO(ty: u32, nr: u32) -> u32 {
6009-
_IOC(_IOC_NONE, ty, nr, 0)
5947+
/// Build an ioctl number for an argumentless ioctl.
5948+
pub const fn _IO(ty: u32, nr: u32) -> u32 {
5949+
super::_IOC(super::_IOC_NONE, ty, nr, 0)
60105950
}
60115951

60125952
/// Build an ioctl number for an read-only ioctl.
60135953
pub const fn _IOR<T>(ty: u32, nr: u32) -> u32 {
6014-
_IOC(_IOC_READ, ty, nr, size_of::<T>())
5954+
super::_IOC(super::_IOC_READ, ty, nr, size_of::<T>())
60155955
}
60165956

60175957
/// Build an ioctl number for an write-only ioctl.
60185958
pub const fn _IOW<T>(ty: u32, nr: u32) -> u32 {
6019-
_IOC(_IOC_WRITE, ty, nr, size_of::<T>())
5959+
super::_IOC(super::_IOC_WRITE, ty, nr, size_of::<T>())
60205960
}
60215961

60225962
/// Build an ioctl number for a read-write ioctl.
60235963
pub const fn _IOWR<T>(ty: u32, nr: u32) -> u32 {
6024-
_IOC(_IOC_READ | _IOC_WRITE, ty, nr, size_of::<T>())
5964+
super::_IOC(super::_IOC_READ | super::_IOC_WRITE, ty, nr, size_of::<T>())
60255965
}
60265966

60275967
f! {

src/unix/linux_like/mod.rs

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1630,6 +1630,73 @@ cfg_if! {
16301630
}
16311631
}
16321632

1633+
// https://github.com/search?q=repo%3Atorvalds%2Flinux+%22%23define+_IOC_NONE%22&type=code
1634+
cfg_if! {
1635+
if #[cfg(any(
1636+
target_os = "linux",
1637+
target_os = "android",
1638+
target_os = "l4re"
1639+
))] {
1640+
const _IOC_NRBITS: u32 = 8;
1641+
const _IOC_TYPEBITS: u32 = 8;
1642+
1643+
cfg_if! {
1644+
if #[cfg(any(
1645+
any(target_arch = "powerpc", target_arch = "powerpc64"),
1646+
any(target_arch = "sparc", target_arch = "sparc64"),
1647+
any(target_arch = "mips", target_arch = "mips64"),
1648+
))] {
1649+
// https://github.com/torvalds/linux/blob/b311c1b497e51a628aa89e7cb954481e5f9dced2/arch/powerpc/include/uapi/asm/ioctl.h
1650+
// https://github.com/torvalds/linux/blob/b311c1b497e51a628aa89e7cb954481e5f9dced2/arch/sparc/include/uapi/asm/ioctl.h
1651+
// https://github.com/torvalds/linux/blob/b311c1b497e51a628aa89e7cb954481e5f9dced2/arch/mips/include/uapi/asm/ioctl.h
1652+
1653+
const _IOC_SIZEBITS: u32 = 13;
1654+
const _IOC_DIRBITS: u32 = 3;
1655+
1656+
const _IOC_NONE: u32 = 1;
1657+
const _IOC_READ: u32 = 2;
1658+
const _IOC_WRITE: u32 = 4;
1659+
} else {
1660+
// https://github.com/torvalds/linux/blob/b311c1b497e51a628aa89e7cb954481e5f9dced2/include/uapi/asm-generic/ioctl.h
1661+
1662+
const _IOC_SIZEBITS: u32 = 14;
1663+
const _IOC_DIRBITS: u32 = 2;
1664+
1665+
const _IOC_NONE: u32 = 0;
1666+
const _IOC_WRITE: u32 = 1;
1667+
const _IOC_READ: u32 = 2;
1668+
}
1669+
}
1670+
const _IOC_NRMASK: u32 = (1 << _IOC_NRBITS) - 1;
1671+
const _IOC_TYPEMASK: u32 = (1 << _IOC_TYPEBITS) - 1;
1672+
const _IOC_SIZEMASK: u32 = (1 << _IOC_SIZEBITS) - 1;
1673+
const _IOC_DIRMASK: u32 = (1 << _IOC_DIRBITS) - 1;
1674+
1675+
const _IOC_NRSHIFT: u32 = 0;
1676+
const _IOC_TYPESHIFT: u32 = _IOC_NRSHIFT + _IOC_NRBITS;
1677+
const _IOC_SIZESHIFT: u32 = _IOC_TYPESHIFT + _IOC_TYPEBITS;
1678+
const _IOC_DIRSHIFT: u32 = _IOC_SIZESHIFT + _IOC_SIZEBITS;
1679+
1680+
// adapted from https://github.com/torvalds/linux/blob/8a696a29c6905594e4abf78eaafcb62165ac61f1/rust/kernel/ioctl.rs
1681+
1682+
/// Build an ioctl number, analogous to the C macro of the same name.
1683+
const fn _IOC(dir: u32, ty: u32, nr: u32, size: usize) -> u32 {
1684+
// FIXME(ctest) the `garando_syntax` crate (used by ctest in the CI test suite)
1685+
// cannot currently parse these `debug_assert!`s
1686+
//
1687+
// debug_assert!(dir <= _IOC_DIRMASK);
1688+
// debug_assert!(ty <= _IOC_TYPEMASK);
1689+
// debug_assert!(nr <= _IOC_NRMASK);
1690+
// debug_assert!(size <= (_IOC_SIZEMASK as usize));
1691+
1692+
(dir << _IOC_DIRSHIFT)
1693+
| (ty << _IOC_TYPESHIFT)
1694+
| (nr << _IOC_NRSHIFT)
1695+
| ((size as u32) << _IOC_SIZESHIFT)
1696+
}
1697+
}
1698+
}
1699+
16331700
const_fn! {
16341701
{const} fn CMSG_ALIGN(len: usize) -> usize {
16351702
len + mem::size_of::<usize>() - 1 & !(mem::size_of::<usize>() - 1)

0 commit comments

Comments
 (0)