diff --git a/libc-test/build.rs b/libc-test/build.rs index dc7afd0eae0a3..1953f16557a00 100644 --- a/libc-test/build.rs +++ b/libc-test/build.rs @@ -2610,6 +2610,7 @@ fn test_freebsd(target: &str) { "netinet/sctp.h", "netinet/tcp.h", "netinet/udp.h", + "netinet6/in6_var.h", "poll.h", "pthread.h", "pthread_np.h", @@ -3173,6 +3174,7 @@ fn test_freebsd(target: &str) { ("if_data", "__ifi_epoch") => true, ("if_data", "__ifi_lastchange") => true, ("ifreq", "ifr_ifru") => true, + ("in6_ifreq", "ifr_ifru") => true, ("ifconf", "ifc_ifcu") => true, // anonymous struct diff --git a/libc-test/semver/apple.txt b/libc-test/semver/apple.txt index a4a8916d53ded..a86287d1cb471 100644 --- a/libc-test/semver/apple.txt +++ b/libc-test/semver/apple.txt @@ -527,6 +527,19 @@ IFF_RUNNING IFF_SIMPLEX IFF_UP IMAXBEL +IN6_IFF_ANYCAST +IN6_IFF_AUTOCONF +IN6_IFF_CLAT46 +IN6_IFF_DEPRECATED +IN6_IFF_DETACHED +IN6_IFF_DUPLICATED +IN6_IFF_DYNAMIC +IN6_IFF_NODAD +IN6_IFF_NOPFX +IN6_IFF_OPTIMISTIC +IN6_IFF_SECURED +IN6_IFF_TEMPORARY +IN6_IFF_TENTATIVE INIT_PROCESS IOV_MAX IPC_CREAT @@ -1362,6 +1375,7 @@ SIOCGETVLAN SIOCGHIWAT SIOCGIF6LOWPAN SIOCGIFADDR +SIOCGIFAFLAG_IN6 SIOCGIFALTMTU SIOCGIFASYNCMAP SIOCGIFBOND diff --git a/libc-test/semver/freebsd.txt b/libc-test/semver/freebsd.txt index 8fcb523292eba..a26355468d608 100644 --- a/libc-test/semver/freebsd.txt +++ b/libc-test/semver/freebsd.txt @@ -530,6 +530,15 @@ IFF_SIMPLEX IFF_STATICARP IFF_UP IMAXBEL +IN6_IFF_ANYCAST +IN6_IFF_AUTOCONF +IN6_IFF_DEPRECATED +IN6_IFF_DETACHED +IN6_IFF_DUPLICATED +IN6_IFF_NODAD +IN6_IFF_PREFER_SOURCE +IN6_IFF_TEMPORARY +IN6_IFF_TENTATIVE INIT_PROCESS IOV_MAX IPC_CREAT @@ -1458,6 +1467,7 @@ SIGLWP SIGSTKSZ SIGTHR SIOCGIFADDR +SIOCGIFAFLAG_IN6 SLIPDISC SOCKCREDSIZE SOCK_CLOEXEC @@ -1741,9 +1751,14 @@ XU_NGROUPS YESEXPR YESSTR _CS_PATH +_IO _IOFBF _IOLBF _IONBF +_IOR +_IOW +_IOWINT +_IOWR _PC_ACL_EXTENDED _PC_ACL_NFS4 _PC_ACL_PATH_MAX @@ -1870,6 +1885,7 @@ _SC_XOPEN_VERSION _SC_XOPEN_XCU_VERSION _UUID_NODE_LEN __c_anonymous_cr_pid +__c_anonymous_ifr_ifru6 __cap_rights_clear __cap_rights_get __cap_rights_init @@ -2051,6 +2067,7 @@ glob_t globfree hexdump humanize_number +icmp6_ifstat iconv iconv_close iconv_open @@ -2062,6 +2079,9 @@ if_nameindex ifaddrs ifconf ifreq +in6_addrlifetime +in6_ifreq +in6_ifstat in6_pktinfo initgroups input_absinfo diff --git a/src/new/apple/xnu/mod.rs b/src/new/apple/xnu/mod.rs index 2cc3ffbd56cfb..a81d38db55d55 100644 --- a/src/new/apple/xnu/mod.rs +++ b/src/new/apple/xnu/mod.rs @@ -29,4 +29,6 @@ pub(crate) mod machine { pub(crate) mod net; +pub(crate) mod netinet6; + pub(crate) mod sys; diff --git a/src/new/apple/xnu/netinet6/in6_var.rs b/src/new/apple/xnu/netinet6/in6_var.rs new file mode 100644 index 0000000000000..f7fcc04b1d4a7 --- /dev/null +++ b/src/new/apple/xnu/netinet6/in6_var.rs @@ -0,0 +1,22 @@ +//! Header: `netinet6/in6_var.h` +//! +//! + +use crate::prelude::*; +use crate::sys::ioccom::*; + +pub const IN6_IFF_ANYCAST: c_int = 0x0001; +pub const IN6_IFF_TENTATIVE: c_int = 0x0002; +pub const IN6_IFF_DUPLICATED: c_int = 0x0004; +pub const IN6_IFF_DETACHED: c_int = 0x0008; +pub const IN6_IFF_DEPRECATED: c_int = 0x0010; +pub const IN6_IFF_NODAD: c_int = 0x0020; +pub const IN6_IFF_AUTOCONF: c_int = 0x0040; +pub const IN6_IFF_TEMPORARY: c_int = 0x0080; +pub const IN6_IFF_DYNAMIC: c_int = 0x0100; +pub const IN6_IFF_OPTIMISTIC: c_int = 0x0200; +pub const IN6_IFF_SECURED: c_int = 0x0400; +pub const IN6_IFF_CLAT46: c_int = 0x1000; +pub const IN6_IFF_NOPFX: c_int = 0x8000; + +pub const SIOCGIFAFLAG_IN6: c_ulong = _IOWR::('i' as c_ulong, 73); diff --git a/src/new/apple/xnu/netinet6/mod.rs b/src/new/apple/xnu/netinet6/mod.rs new file mode 100644 index 0000000000000..1592863f7314e --- /dev/null +++ b/src/new/apple/xnu/netinet6/mod.rs @@ -0,0 +1,5 @@ +//! Directory: `netinet6/` +//! +//! + +pub(crate) mod in6_var; diff --git a/src/new/freebsd/mod.rs b/src/new/freebsd/mod.rs index 20af53183c410..c0036c2a4e362 100644 --- a/src/new/freebsd/mod.rs +++ b/src/new/freebsd/mod.rs @@ -4,5 +4,6 @@ //! * Symbol map: pub(crate) mod net; +pub(crate) mod netinet6; pub(crate) mod sys; pub(crate) mod unistd; diff --git a/src/new/freebsd/netinet6/in6_var.rs b/src/new/freebsd/netinet6/in6_var.rs new file mode 100644 index 0000000000000..f9e45306bffb5 --- /dev/null +++ b/src/new/freebsd/netinet6/in6_var.rs @@ -0,0 +1,107 @@ +//! Header: `netinet6/in6_var.h` +//! +//! https://github.com/freebsd/freebsd-src/blob/main/sys/netinet6/in6_var.h + +use crate::prelude::*; +use crate::sys::ioccom::*; + +s! { + pub struct in6_addrlifetime { + pub ia6t_expire: crate::time_t, + pub ia6t_preferred: crate::time_t, + pub ia6t_vltime: u32, + pub ia6t_pltime: u32, + } + + pub struct in6_ifstat { + pub ifs6_in_receive: u64, + pub ifs6_in_hdrerr: u64, + pub ifs6_in_toobig: u64, + pub ifs6_in_noroute: u64, + pub ifs6_in_addrerr: u64, + pub ifs6_in_protounknown: u64, + pub ifs6_in_truncated: u64, + pub ifs6_in_discard: u64, + pub ifs6_in_deliver: u64, + pub ifs6_out_forward: u64, + pub ifs6_out_request: u64, + pub ifs6_out_discard: u64, + pub ifs6_out_fragok: u64, + pub ifs6_out_fragfail: u64, + pub ifs6_out_fragcreat: u64, + pub ifs6_reass_reqd: u64, + pub ifs6_reass_ok: u64, + pub ifs6_reass_fail: u64, + pub ifs6_in_mcast: u64, + pub ifs6_out_mcast: u64, + } + + pub struct icmp6_ifstat { + pub ifs6_in_msg: u64, + pub ifs6_in_error: u64, + pub ifs6_in_dstunreach: u64, + pub ifs6_in_adminprohib: u64, + pub ifs6_in_timeexceed: u64, + pub ifs6_in_paramprob: u64, + pub ifs6_in_pkttoobig: u64, + pub ifs6_in_echo: u64, + pub ifs6_in_echoreply: u64, + pub ifs6_in_routersolicit: u64, + pub ifs6_in_routeradvert: u64, + pub ifs6_in_neighborsolicit: u64, + pub ifs6_in_neighboradvert: u64, + pub ifs6_in_redirect: u64, + pub ifs6_in_mldquery: u64, + pub ifs6_in_mldreport: u64, + pub ifs6_in_mlddone: u64, + pub ifs6_out_msg: u64, + pub ifs6_out_error: u64, + pub ifs6_out_dstunreach: u64, + pub ifs6_out_adminprohib: u64, + pub ifs6_out_timeexceed: u64, + pub ifs6_out_paramprob: u64, + pub ifs6_out_pkttoobig: u64, + pub ifs6_out_echo: u64, + pub ifs6_out_echoreply: u64, + pub ifs6_out_routersolicit: u64, + pub ifs6_out_routeradvert: u64, + pub ifs6_out_neighborsolicit: u64, + pub ifs6_out_neighboradvert: u64, + pub ifs6_out_redirect: u64, + pub ifs6_out_mldquery: u64, + pub ifs6_out_mldreport: u64, + pub ifs6_out_mlddone: u64, + } +} + +s_no_extra_traits! { + pub struct in6_ifreq { + pub ifr_name: [c_char; crate::IFNAMSIZ], + pub ifr_ifru: __c_anonymous_ifr_ifru6, + } + + pub union __c_anonymous_ifr_ifru6 { + pub ifru_addr: crate::sockaddr_in6, + pub ifru_dstaddr: crate::sockaddr_in6, + pub ifru_flags: c_int, + pub ifru_flags6: c_int, + pub ifru_metric: c_int, + pub ifru_data: crate::caddr_t, + pub ifru_lifetime: in6_addrlifetime, + pub ifru_stat: in6_ifstat, + pub ifru_icmp6stat: icmp6_ifstat, + pub ifru_scope_id: [u32; 16], + } +} + +pub const IN6_IFF_ANYCAST: c_int = 0x01; +pub const IN6_IFF_TENTATIVE: c_int = 0x02; +pub const IN6_IFF_DUPLICATED: c_int = 0x04; +pub const IN6_IFF_DETACHED: c_int = 0x08; +pub const IN6_IFF_DEPRECATED: c_int = 0x10; +pub const IN6_IFF_NODAD: c_int = 0x20; +pub const IN6_IFF_AUTOCONF: c_int = 0x40; +pub const IN6_IFF_TEMPORARY: c_int = 0x80; +pub const IN6_IFF_PREFER_SOURCE: c_int = 0x0100; + +pub const SIOCGIFAFLAG_IN6: c_ulong = _IOWR::('i' as c_ulong, 73); diff --git a/src/new/freebsd/netinet6/mod.rs b/src/new/freebsd/netinet6/mod.rs new file mode 100644 index 0000000000000..848e809aaa8c3 --- /dev/null +++ b/src/new/freebsd/netinet6/mod.rs @@ -0,0 +1,5 @@ +//! Directory: `netinet6/` +//! +//! https://github.com/freebsd/freebsd-src/tree/main/sys/netinet6 + +pub(crate) mod in6_var; diff --git a/src/new/freebsd/sys/ioccom.rs b/src/new/freebsd/sys/ioccom.rs new file mode 100644 index 0000000000000..64261b90671b6 --- /dev/null +++ b/src/new/freebsd/sys/ioccom.rs @@ -0,0 +1,49 @@ +//! Header: `sys/ioccom.h` +//! +//! https://github.com/freebsd/freebsd-src/blob/main/sys/sys/ioccom.h + +use crate::prelude::*; + +const IOCPARM_SHIFT: c_ulong = 13; +const IOCPARM_MASK: c_ulong = (1 << IOCPARM_SHIFT) - 1; + +const IOCPARM_MAX: c_ulong = 1 << IOCPARM_SHIFT; + +pub(crate) const IOC_VOID: c_ulong = 0x20000000; +pub(crate) const IOC_OUT: c_ulong = 0x40000000; +pub(crate) const IOC_IN: c_ulong = 0x80000000; +pub(crate) const IOC_INOUT: c_ulong = IOC_IN | IOC_OUT; +pub(crate) const IOC_DIRMASK: c_ulong = IOC_VOID | IOC_OUT | IOC_IN; + +pub(crate) const fn _IOC(inout: c_ulong, group: c_ulong, num: c_ulong, len: c_ulong) -> c_ulong { + debug_assert!(inout <= IOC_DIRMASK); + debug_assert!(group <= 0xff); + debug_assert!(num <= 0xff); + debug_assert!(len <= IOCPARM_MAX); + + inout | ((len & IOCPARM_MASK) << 16) | (group << 8) | num +} + +pub const fn _IO(g: c_ulong, n: c_ulong) -> c_ulong { + _IOC(IOC_VOID, g, n, 0) +} + +/// Build an ioctl number for an ioctl that passes an `int` by value. +pub const fn _IOWINT(g: c_ulong, n: c_ulong) -> c_ulong { + _IOC(IOC_VOID, g, n, mem::size_of::() as c_ulong) +} + +/// Build an ioctl number for an read-only ioctl. +pub const fn _IOR(g: c_ulong, n: c_ulong) -> c_ulong { + _IOC(IOC_OUT, g, n, mem::size_of::() as c_ulong) +} + +/// Build an ioctl number for an write-only ioctl. +pub const fn _IOW(g: c_ulong, n: c_ulong) -> c_ulong { + _IOC(IOC_IN, g, n, mem::size_of::() as c_ulong) +} + +/// Build an ioctl number for a read-write ioctl. +pub const fn _IOWR(g: c_ulong, n: c_ulong) -> c_ulong { + _IOC(IOC_INOUT, g, n, mem::size_of::() as c_ulong) +} diff --git a/src/new/freebsd/sys/mod.rs b/src/new/freebsd/sys/mod.rs index 84134c69e4ff8..4afb1d48b8645 100644 --- a/src/new/freebsd/sys/mod.rs +++ b/src/new/freebsd/sys/mod.rs @@ -3,4 +3,5 @@ //! https://github.com/freebsd/freebsd-src/tree/main/sys/sys' pub(crate) mod file; +pub(crate) mod ioccom; pub(crate) mod socket; diff --git a/src/new/mod.rs b/src/new/mod.rs index 7952840016466..f4387e7aa9dac 100644 --- a/src/new/mod.rs +++ b/src/new/mod.rs @@ -198,6 +198,7 @@ cfg_if! { pub use net::route::*; } else if #[cfg(target_vendor = "apple")] { pub use net::bpf::*; + pub use netinet6::in6_var::*; pub use pthread_::introspection::*; pub use pthread_::pthread_spis::*; pub use pthread_::spawn::*; @@ -226,7 +227,9 @@ cfg_if! { pub use net::if_::*; } else if #[cfg(target_os = "freebsd")] { pub use net::dlt::*; + pub use netinet6::in6_var::*; pub use sys::file::*; + pub use sys::ioccom::*; pub use sys::socket::*; } }