Skip to content

Commit ae44b25

Browse files
authored
Merge pull request #4392 from jjanowsk/android_ioctls_0.2
[0.2] if_tun.h ioctls for android
2 parents 1c88e89 + 8b54b5c commit ae44b25

File tree

4 files changed

+155
-64
lines changed

4 files changed

+155
-64
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
@@ -2680,6 +2680,7 @@ pub const IFF_ATTACH_QUEUE: c_int = 0x0200;
26802680
pub const IFF_DETACH_QUEUE: c_int = 0x0400;
26812681
pub const IFF_PERSIST: c_int = 0x0800;
26822682
pub const IFF_NOFILTER: c_int = 0x1000;
2683+
pub const TUN_TX_TIMESTAMP: c_int = 1;
26832684
// Features for GSO (TUNSETOFFLOAD)
26842685
pub const TUN_F_CSUM: c_uint = 0x01;
26852686
pub const TUN_F_TSO4: c_uint = 0x02;
@@ -2688,6 +2689,40 @@ pub const TUN_F_TSO_ECN: c_uint = 0x08;
26882689
pub const TUN_F_UFO: c_uint = 0x10;
26892690
pub const TUN_F_USO4: c_uint = 0x20;
26902691
pub const TUN_F_USO6: c_uint = 0x40;
2692+
// Protocol info prepended to the packets (when IFF_NO_PI is not set)
2693+
pub const TUN_PKT_STRIP: c_int = 0x0001;
2694+
// Accept all multicast packets
2695+
pub const TUN_FLT_ALLMULTI: c_int = 0x0001;
2696+
// Ioctl operation codes
2697+
const T_TYPE: u32 = b'T' as u32;
2698+
pub const TUNSETNOCSUM: c_int = _IOW::<c_int>(T_TYPE, 200);
2699+
pub const TUNSETDEBUG: c_int = _IOW::<c_int>(T_TYPE, 201);
2700+
pub const TUNSETIFF: c_int = _IOW::<c_int>(T_TYPE, 202);
2701+
pub const TUNSETPERSIST: c_int = _IOW::<c_int>(T_TYPE, 203);
2702+
pub const TUNSETOWNER: c_int = _IOW::<c_int>(T_TYPE, 204);
2703+
pub const TUNSETLINK: c_int = _IOW::<c_int>(T_TYPE, 205);
2704+
pub const TUNSETGROUP: c_int = _IOW::<c_int>(T_TYPE, 206);
2705+
pub const TUNGETFEATURES: c_int = _IOR::<c_int>(T_TYPE, 207);
2706+
pub const TUNSETOFFLOAD: c_int = _IOW::<c_int>(T_TYPE, 208);
2707+
pub const TUNSETTXFILTER: c_int = _IOW::<c_int>(T_TYPE, 209);
2708+
pub const TUNGETIFF: c_int = _IOR::<c_int>(T_TYPE, 210);
2709+
pub const TUNGETSNDBUF: c_int = _IOR::<c_int>(T_TYPE, 211);
2710+
pub const TUNSETSNDBUF: c_int = _IOW::<c_int>(T_TYPE, 212);
2711+
pub const TUNATTACHFILTER: c_int = _IOW::<sock_fprog>(T_TYPE, 213);
2712+
pub const TUNDETACHFILTER: c_int = _IOW::<sock_fprog>(T_TYPE, 214);
2713+
pub const TUNGETVNETHDRSZ: c_int = _IOR::<c_int>(T_TYPE, 215);
2714+
pub const TUNSETVNETHDRSZ: c_int = _IOW::<c_int>(T_TYPE, 216);
2715+
pub const TUNSETQUEUE: c_int = _IOW::<c_int>(T_TYPE, 217);
2716+
pub const TUNSETIFINDEX: c_int = _IOW::<c_int>(T_TYPE, 218);
2717+
pub const TUNGETFILTER: c_int = _IOR::<sock_fprog>(T_TYPE, 219);
2718+
pub const TUNSETVNETLE: c_int = _IOW::<c_int>(T_TYPE, 220);
2719+
pub const TUNGETVNETLE: c_int = _IOR::<c_int>(T_TYPE, 221);
2720+
pub const TUNSETVNETBE: c_int = _IOW::<c_int>(T_TYPE, 222);
2721+
pub const TUNGETVNETBE: c_int = _IOR::<c_int>(T_TYPE, 223);
2722+
pub const TUNSETSTEERINGEBPF: c_int = _IOR::<c_int>(T_TYPE, 224);
2723+
pub const TUNSETFILTEREBPF: c_int = _IOR::<c_int>(T_TYPE, 225);
2724+
pub const TUNSETCARRIER: c_int = _IOW::<c_int>(T_TYPE, 226);
2725+
pub const TUNGETDEVNETNS: c_int = _IO(T_TYPE, 227);
26912726

26922727
// start android/platform/bionic/libc/kernel/uapi/linux/if_ether.h
26932728
// from https://android.googlesource.com/platform/bionic/+/HEAD/libc/kernel/uapi/linux/if_ether.h
@@ -4263,3 +4298,23 @@ impl siginfo_t {
42634298
self.sifields().sigchld.si_stime
42644299
}
42654300
}
4301+
4302+
/// Build an ioctl number for an argumentless ioctl.
4303+
pub const fn _IO(ty: u32, nr: u32) -> c_int {
4304+
super::_IOC(super::_IOC_NONE, ty, nr, 0) as c_int
4305+
}
4306+
4307+
/// Build an ioctl number for an read-only ioctl.
4308+
pub const fn _IOR<T>(ty: u32, nr: u32) -> c_int {
4309+
super::_IOC(super::_IOC_READ, ty, nr, mem::size_of::<T>()) as c_int
4310+
}
4311+
4312+
/// Build an ioctl number for an write-only ioctl.
4313+
pub const fn _IOW<T>(ty: u32, nr: u32) -> c_int {
4314+
super::_IOC(super::_IOC_WRITE, ty, nr, mem::size_of::<T>()) as c_int
4315+
}
4316+
4317+
/// Build an ioctl number for a read-write ioctl.
4318+
pub const fn _IOWR<T>(ty: u32, nr: u32) -> c_int {
4319+
super::_IOC(super::_IOC_READ | super::_IOC_WRITE, ty, nr, mem::size_of::<T>()) as c_int
4320+
}

src/unix/linux_like/linux/mod.rs

Lines changed: 4 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -5985,88 +5985,28 @@ pub const SCHED_FLAG_ALL: c_int = SCHED_FLAG_RESET_ON_FORK
59855985
pub const EPIOCSPARAMS: Ioctl = 0x40088a01;
59865986
pub const EPIOCGPARAMS: Ioctl = 0x80088a02;
59875987

5988-
const _IOC_NRBITS: u32 = 8;
5989-
const _IOC_TYPEBITS: u32 = 8;
5990-
59915988
// siginfo.h
59925989
pub const SI_DETHREAD: c_int = -7;
59935990
pub const TRAP_PERF: c_int = 6;
59945991

5995-
// https://github.com/search?q=repo%3Atorvalds%2Flinux+%22%23define+_IOC_NONE%22&type=code
5996-
cfg_if! {
5997-
if #[cfg(any(
5998-
any(target_arch = "powerpc", target_arch = "powerpc64"),
5999-
any(target_arch = "sparc", target_arch = "sparc64"),
6000-
any(target_arch = "mips", target_arch = "mips64"),
6001-
))] {
6002-
// https://github.com/torvalds/linux/blob/b311c1b497e51a628aa89e7cb954481e5f9dced2/arch/powerpc/include/uapi/asm/ioctl.h
6003-
// https://github.com/torvalds/linux/blob/b311c1b497e51a628aa89e7cb954481e5f9dced2/arch/sparc/include/uapi/asm/ioctl.h
6004-
// https://github.com/torvalds/linux/blob/b311c1b497e51a628aa89e7cb954481e5f9dced2/arch/mips/include/uapi/asm/ioctl.h
6005-
6006-
const _IOC_SIZEBITS: u32 = 13;
6007-
const _IOC_DIRBITS: u32 = 3;
6008-
6009-
const _IOC_NONE: u32 = 1;
6010-
const _IOC_READ: u32 = 2;
6011-
const _IOC_WRITE: u32 = 4;
6012-
} else {
6013-
// https://github.com/torvalds/linux/blob/b311c1b497e51a628aa89e7cb954481e5f9dced2/include/uapi/asm-generic/ioctl.h
6014-
6015-
const _IOC_SIZEBITS: u32 = 14;
6016-
const _IOC_DIRBITS: u32 = 2;
6017-
6018-
const _IOC_NONE: u32 = 0;
6019-
const _IOC_WRITE: u32 = 1;
6020-
const _IOC_READ: u32 = 2;
6021-
}
6022-
}
6023-
6024-
const _IOC_NRMASK: u32 = (1 << _IOC_NRBITS) - 1;
6025-
const _IOC_TYPEMASK: u32 = (1 << _IOC_TYPEBITS) - 1;
6026-
const _IOC_SIZEMASK: u32 = (1 << _IOC_SIZEBITS) - 1;
6027-
const _IOC_DIRMASK: u32 = (1 << _IOC_DIRBITS) - 1;
6028-
6029-
const _IOC_NRSHIFT: u32 = 0;
6030-
const _IOC_TYPESHIFT: u32 = _IOC_NRSHIFT + _IOC_NRBITS;
6031-
const _IOC_SIZESHIFT: u32 = _IOC_TYPESHIFT + _IOC_TYPEBITS;
6032-
const _IOC_DIRSHIFT: u32 = _IOC_SIZESHIFT + _IOC_SIZEBITS;
6033-
6034-
// adapted from https://github.com/torvalds/linux/blob/8a696a29c6905594e4abf78eaafcb62165ac61f1/rust/kernel/ioctl.rs
6035-
6036-
/// Build an ioctl number, analogous to the C macro of the same name.
6037-
const fn _IOC(dir: u32, ty: u32, nr: u32, size: usize) -> u32 {
6038-
// FIXME(ctest) the `garando_syntax` crate (used by ctest2 in the CI test suite)
6039-
// cannot currently parse these `debug_assert!`s
6040-
//
6041-
// debug_assert!(dir <= _IOC_DIRMASK);
6042-
// debug_assert!(ty <= _IOC_TYPEMASK);
6043-
// debug_assert!(nr <= _IOC_NRMASK);
6044-
// debug_assert!(size <= (_IOC_SIZEMASK as usize));
6045-
6046-
(dir << _IOC_DIRSHIFT)
6047-
| (ty << _IOC_TYPESHIFT)
6048-
| (nr << _IOC_NRSHIFT)
6049-
| ((size as u32) << _IOC_SIZESHIFT)
6050-
}
6051-
60525992
/// Build an ioctl number for an argumentless ioctl.
60535993
pub const fn _IO(ty: u32, nr: u32) -> u32 {
6054-
_IOC(_IOC_NONE, ty, nr, 0)
5994+
super::_IOC(super::_IOC_NONE, ty, nr, 0)
60555995
}
60565996

60575997
/// Build an ioctl number for an read-only ioctl.
60585998
pub const fn _IOR<T>(ty: u32, nr: u32) -> u32 {
6059-
_IOC(_IOC_READ, ty, nr, size_of::<T>())
5999+
super::_IOC(super::_IOC_READ, ty, nr, size_of::<T>())
60606000
}
60616001

60626002
/// Build an ioctl number for an write-only ioctl.
60636003
pub const fn _IOW<T>(ty: u32, nr: u32) -> u32 {
6064-
_IOC(_IOC_WRITE, ty, nr, size_of::<T>())
6004+
super::_IOC(super::_IOC_WRITE, ty, nr, size_of::<T>())
60656005
}
60666006

60676007
/// Build an ioctl number for a read-write ioctl.
60686008
pub const fn _IOWR<T>(ty: u32, nr: u32) -> u32 {
6069-
_IOC(_IOC_READ | _IOC_WRITE, ty, nr, size_of::<T>())
6009+
super::_IOC(super::_IOC_READ | super::_IOC_WRITE, ty, nr, size_of::<T>())
60706010
}
60716011

60726012
f! {

src/unix/linux_like/mod.rs

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

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

0 commit comments

Comments
 (0)