diff --git a/.github/actions/check-vm/action.yml b/.github/actions/check-vm/action.yml index 6656654419..d4f1b2ea1e 100644 --- a/.github/actions/check-vm/action.yml +++ b/.github/actions/check-vm/action.yml @@ -11,6 +11,9 @@ inputs: codecov-token: description: 'Codecov token, if Codecov upload is desired.' default: '' + generate-bindings: + description: 'Generate and output bindgen bindings for BSD platforms.' + default: 'false' runs: using: composite @@ -21,18 +24,19 @@ runs: WD: ${{ inputs.working-directory }} PLATFORM: ${{ inputs.platform }} WORKSPACE: ${{ inputs.working-directory == '.' && '--workspace' || '' }} + GENERATE_BINDINGS: ${{ inputs.generate-bindings }} run: | cat < prepare.sh # This executes as root set -ex pwd case "$PLATFORM" in - freebsd) pkg install -y curl llvm nss pkgconf + freebsd) pkg install -y curl llvm nss pkgconf rust-bindgen-cli ;; openbsd) # TODO: Is there a way to not pin the version of llvm? -z to pkg_add does not work. - pkg_add rust rust-clippy rust-rustfmt llvm-21.1.2p0 nss # rustup does not support OpenBSD at all + pkg_add rust rust-clippy rust-rustfmt rust-bindgen llvm-21.1.2p0 nss # rustup does not support OpenBSD at all ;; - netbsd) /usr/sbin/pkg_add pkgin && pkgin -y install curl clang nss pkgconf + netbsd) /usr/sbin/pkg_add pkgin && pkgin -y install curl clang nss pkgconf rust-bindgen ;; solaris) pkg install clang-libs nss pkg-config ;; @@ -59,6 +63,7 @@ runs: openbsd) export LIBCLANG_PATH=/usr/local/llvm21/lib export LLVM_COV=/usr/local/llvm21/bin/llvm-cov export LLVM_PROFDATA=/usr/local/llvm21/bin/llvm-profdata + export PATH="\$HOME/.cargo/bin:\$PATH" [ "$WORKSPACE" ] && EXCLUDE="--exclude fuzz" # Fuzzing not supported on OpenBSD ;; netbsd) sh rustup.sh --default-toolchain stable --profile minimal --component clippy,llvm-tools,rustfmt -y @@ -75,6 +80,23 @@ runs: [ "$WORKSPACE" ] && EXCLUDE="--exclude fuzz" # Fuzzing not supported on Solaris ;; esac + # Generate bindings first if requested (before build, so we can bootstrap) + if [ "$GENERATE_BINDINGS" = "true" ]; then + # Solaris doesn't have a system package for bindgen + [ "$PLATFORM" = "solaris" ] && cargo install bindgen-cli --locked + bindgen --allowlist-type 'rt_msghdr|rt_metrics|if_data' \ + --allowlist-item 'RTAX_MAX|RTM_GET|RTM_VERSION|RTA_DST|RTA_IFP' \ + --generate-cstr --explicit-padding --with-derive-default \ + src/bindings/bsd.h > "$PLATFORM.rs" + # Compare generated bindings with committed bindings + # If different, exit early with success to trigger copyback + if ! diff -q "src/bindings/$PLATFORM.rs" "$PLATFORM.rs" > /dev/null 2>&1; then + echo "::warning::Bindings for $PLATFORM differ from committed version" + touch bindings-changed + exit 0 + fi + fi + cargo version cargo check --locked --all-targets $WORKSPACE \$EXCLUDE case "$PLATFORM" in @@ -93,6 +115,7 @@ runs: ;; esac cargo test --locked --no-fail-fast --release + rm -rf target # Do not sync this back to host EOF { @@ -102,12 +125,13 @@ runs: } >> "$GITHUB_OUTPUT" curl -o "$WD/rustup.sh" --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs - echo "envs=CARGO_TERM_COLOR RUST_BACKTRACE RUST_LOG RUST_TEST_TIME_UNIT RUST_TEST_TIME_INTEGRATION RUST_TEST_TIME_DOCTEST WD" >> "$GITHUB_OUTPUT" + echo "envs=CARGO_TERM_COLOR RUST_BACKTRACE RUST_LOG RUST_TEST_TIME_UNIT RUST_TEST_TIME_INTEGRATION RUST_TEST_TIME_DOCTEST WD GENERATE_BINDINGS" >> "$GITHUB_OUTPUT" - if: ${{ inputs.platform == 'freebsd' }} uses: vmactions/freebsd-vm@a9c0dcaf5ed572d89ea1a59fe2217d3b3da4fd23 # v1.3.7 with: usesh: true + copyback: true envs: ${{ steps.prep.outputs.envs }} prepare: ${{ steps.prep.outputs.prepare }} run: ${{ steps.prep.outputs.run }} @@ -116,6 +140,7 @@ runs: uses: vmactions/openbsd-vm@00753f2835e62704570734312de6f212069dfef7 # v1.3.1 with: usesh: true + copyback: true envs: ${{ steps.prep.outputs.envs }} prepare: ${{ steps.prep.outputs.prepare }} run: ${{ steps.prep.outputs.run }} @@ -124,6 +149,7 @@ runs: uses: vmactions/netbsd-vm@2ba9902c77c2ebdb7501e5e9308dea03f0f251c4 # v1.3.1 with: usesh: true + copyback: true envs: ${{ steps.prep.outputs.envs }} prepare: ${{ steps.prep.outputs.prepare }} run: ${{ steps.prep.outputs.run }} @@ -133,11 +159,13 @@ runs: with: release: "11.4-gcc" usesh: true + copyback: true envs: ${{ steps.prep.outputs.envs }} prepare: ${{ steps.prep.outputs.prepare }} run: ${{ steps.prep.outputs.run }} - id: check-coverage + if: ${{ always() && inputs.generate-bindings == 'true' }} shell: bash env: WORKING_DIR: ${{ inputs.working-directory }} diff --git a/.github/workflows/check-mtu.yml b/.github/workflows/check-mtu.yml index c0622aa3ec..fb062c6b1a 100644 --- a/.github/workflows/check-mtu.yml +++ b/.github/workflows/check-mtu.yml @@ -1,6 +1,12 @@ name: CI MTU on: workflow_dispatch: + push: + branches: ["main"] + paths: + - "mtu/**" + - ".github/workflows/check-mtu.yml" + - ".github/actions/check-vm/**" pull_request: branches: ["main"] @@ -12,6 +18,41 @@ permissions: contents: read jobs: + generate-bindings: + name: Generate ${{ matrix.os }} bindings + strategy: + fail-fast: false + matrix: + include: + - os: linux + runner: ubuntu-24.04 + header: linux.h + args: --allowlist-type rtattr|rtmsg|ifinfomsg|nlmsghdr + - os: macos + runner: macos-15 + header: bsd.h + args: --allowlist-type rt_msghdr|rt_metrics|if_data --allowlist-item RTAX_MAX|RTM_GET|RTM_VERSION|RTA_DST|RTA_IFP + runs-on: ${{ matrix.runner }} + steps: + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + with: + persist-credentials: false + - name: Install bindgen-cli + run: cargo install bindgen-cli --locked + - name: Generate bindings + env: + OS: ${{ matrix.os }} + ARGS: ${{ matrix.args }} + HEADER: ${{ matrix.header }} + run: | + # shellcheck disable=SC2086 + bindgen $ARGS --generate-cstr --explicit-padding --with-derive-default "mtu/src/bindings/$HEADER" > "$OS.rs" + - name: Upload bindings + uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 + with: + name: bindings-${{ matrix.os }} + path: ${{ matrix.os }}.rs + check-android: name: Check Android runs-on: ubuntu-24.04 @@ -44,4 +85,78 @@ jobs: working-directory: mtu platform: ${{ matrix.os }} codecov-token: ${{ secrets.CODECOV_TOKEN }} + generate-bindings: true + + check-bindings: + name: Check bindings + needs: [generate-bindings, check-vm] + if: always() && !cancelled() + runs-on: ubuntu-24.04 + permissions: + pull-requests: write # to create PRs for binding updates + contents: write # to push branches for binding updates + steps: + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + with: + persist-credentials: true # zizmor: ignore[artipacked] We need to push branches. + + - name: Download all binding artifacts + uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 + with: + path: artifacts + pattern: bindings-* + + - name: Check for binding changes + id: check + run: | + CHANGED="" + for dir in artifacts/bindings-*; do + [ -d "$dir" ] || continue + PLATFORM=$(basename "$dir" | sed 's/bindings-//') + FILE="$dir/$PLATFORM.rs" + [ -f "$FILE" ] || continue + + if ! diff -q "mtu/src/bindings/$PLATFORM.rs" "$FILE" > /dev/null 2>&1; then + echo "Bindings for $PLATFORM differ:" + diff "mtu/src/bindings/$PLATFORM.rs" "$FILE" || true + cp "$FILE" "mtu/src/bindings/$PLATFORM.rs" + CHANGED="$CHANGED $PLATFORM" + fi + done + + if [ -z "$CHANGED" ]; then + echo "No binding changes detected." + echo "changed=false" >> "$GITHUB_OUTPUT" + else + echo "changed=true" >> "$GITHUB_OUTPUT" + echo "platforms=$CHANGED" >> "$GITHUB_OUTPUT" + fi + + - name: Create PR for binding updates + if: steps.check.outputs.changed == 'true' && github.event_name == 'push' + env: + TOKEN: ${{ secrets.GITHUB_TOKEN }} + SHA: ${{ github.sha }} + PLATFORMS: ${{ steps.check.outputs.platforms }} + run: | + git config --global user.name "github-actions[bot]" + git config --global user.email "github-actions[bot]@users.noreply.github.com" + echo "$TOKEN" | gh auth login --with-token + SHA_SHORT=$(echo "$SHA" | cut -c1-7) + BRANCH="chore-update-mtu-bindings-$SHA_SHORT" + MESSAGE="chore: Update MTU bindings + + Automated update of platform-specific bindings generated by bindgen. + + Updated platforms:$PLATFORMS" + git checkout -b "$BRANCH" + git add mtu/src/bindings + git commit -m "$MESSAGE" + git push --set-upstream origin "$BRANCH" + gh pr create --fill-verbose + - name: Fail if bindings changed on PR + if: steps.check.outputs.changed == 'true' && github.event_name == 'pull_request' + run: | + echo "::error::Generated bindings differ from committed versions. See job output for details." + exit 1 diff --git a/Cargo.lock b/Cargo.lock index cfbdf7dd30..1dc45e4001 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -726,7 +726,6 @@ checksum = "903970ae2f248d7275214cf8f387f8ba0c4ea7e3d87a320e85493db60ce28616" name = "mtu" version = "0.3.0" dependencies = [ - "bindgen", "cfg_aliases", "libc", "mozbuild", diff --git a/mtu/Cargo.toml b/mtu/Cargo.toml index d6df8f192d..0e1d2027e1 100644 --- a/mtu/Cargo.toml +++ b/mtu/Cargo.toml @@ -33,10 +33,9 @@ windows = { workspace = true, features = [ [build-dependencies] cfg_aliases = { version = "0.2", default-features = false } mozbuild = { version = "0.1", default-features = false, optional = true } -bindgen = { version = "0.72", default-features = false, features = ["runtime"] } [package.metadata.cargo-machete] -ignored = ["bindgen", "cfg_aliases"] +ignored = ["cfg_aliases"] [features] gecko = ["dep:mozbuild"] diff --git a/mtu/build.rs b/mtu/build.rs index 543f381202..82aec5045f 100644 --- a/mtu/build.rs +++ b/mtu/build.rs @@ -4,92 +4,7 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -#![expect(clippy::unwrap_used, reason = "OK in build scripts.")] - -use std::env; - -const BINDINGS: &str = "bindings.rs"; - -#[cfg(feature = "gecko")] -fn clang_args() -> Vec { - use mozbuild::{TOPOBJDIR, config::BINDGEN_SYSTEM_FLAGS}; - - let mut flags: Vec = BINDGEN_SYSTEM_FLAGS.iter().map(|s| s.to_string()).collect(); - - flags.push(String::from("-include")); - flags.push( - TOPOBJDIR - .join("dist") - .join("include") - .join("mozilla-config.h") - .to_str() - .unwrap() - .to_string(), - ); - flags -} - -#[cfg(not(feature = "gecko"))] -const fn clang_args() -> Vec { - Vec::new() -} - -fn bindgen() { - let target_os = env::var("CARGO_CFG_TARGET_OS").expect("CARGO_CFG_TARGET_OS was not set"); - - // Platforms currently not supported. - // - // See . - if matches!(target_os.as_str(), "ios" | "tvos" | "visionos") { - return; - } - - if target_os == "windows" { - return; - } - - let bindings = if matches!(target_os.as_str(), "linux" | "android") { - bindgen::Builder::default() - .header_contents("rtnetlink.h", "#include ") - // Only generate bindings for the following types - .allowlist_type("rtattr|rtmsg|ifinfomsg|nlmsghdr") - } else { - bindgen::Builder::default() - .header_contents( - "route.h", - "#include \n#include \n#include \n#include ", - ) - // Only generate bindings for the following types and items - .allowlist_type("rt_msghdr|rt_metrics|if_data") - .allowlist_item("RTAX_MAX|RTM_GET|RTM_VERSION|RTA_DST|RTA_IFP") - }; - - let bindings = bindings - .clang_args(clang_args()) - // Tell cargo to invalidate the built crate whenever any of the - // included header files changed. - .parse_callbacks(Box::new(bindgen::CargoCallbacks::new())) - // Constants should be generated as &CStr instead of &[u8]. - .generate_cstr(true) - // Always emit explicit padding fields. - .explicit_padding(true) - // Default trait should be derived when possible - .derive_default(true) - // Finish the builder and generate the bindings. - .generate() - // Unwrap the Result and panic on failure. - .expect("Unable to generate bindings"); - - // Write the bindings to the $OUT_DIR/$BINDINGS file. - let out_path = std::path::PathBuf::from(env::var("OUT_DIR").unwrap()).join(BINDINGS); - bindings - .write_to_file(out_path.clone()) - .expect("Couldn't write bindings!"); - println!("cargo:rustc-env=BINDINGS={}", out_path.display()); -} - fn main() { - // Setup cfg aliases cfg_aliases::cfg_aliases! { bsd: { any( @@ -100,6 +15,4 @@ fn main() { ) } } - - bindgen(); } diff --git a/mtu/src/bindings/bsd.h b/mtu/src/bindings/bsd.h new file mode 100644 index 0000000000..8451f4aa1c --- /dev/null +++ b/mtu/src/bindings/bsd.h @@ -0,0 +1,9 @@ +#include +#include +#include +#include + +/* Force bindgen to generate these types */ +struct rt_msghdr __rt_msghdr; +struct rt_metrics __rt_metrics; +struct if_data __if_data; diff --git a/mtu/src/bindings/freebsd.rs b/mtu/src/bindings/freebsd.rs new file mode 100644 index 0000000000..f56424373e --- /dev/null +++ b/mtu/src/bindings/freebsd.rs @@ -0,0 +1,274 @@ +/* automatically generated by rust-bindgen 0.72.1 */ + +pub const RTM_VERSION: u32 = 5; +pub const RTM_GET: u32 = 4; +pub const RTA_DST: u32 = 1; +pub const RTA_IFP: u32 = 16; +pub const RTAX_MAX: u32 = 8; +pub type __int32_t = ::std::os::raw::c_int; +pub type __int64_t = ::std::os::raw::c_long; +pub type __time_t = __int64_t; +pub type __pid_t = __int32_t; +pub type __suseconds_t = ::std::os::raw::c_long; +pub type u_char = ::std::os::raw::c_uchar; +pub type u_short = ::std::os::raw::c_ushort; +pub type u_long = ::std::os::raw::c_ulong; +pub type pid_t = __pid_t; +pub type suseconds_t = __suseconds_t; +pub type time_t = __time_t; +#[repr(C)] +#[derive(Debug, Default, Copy, Clone)] +pub struct timeval { + pub tv_sec: time_t, + pub tv_usec: suseconds_t, +} +#[allow(clippy::unnecessary_operation, clippy::identity_op)] +const _: () = { + ["Size of timeval"][::std::mem::size_of::() - 16usize]; + ["Alignment of timeval"][::std::mem::align_of::() - 8usize]; + ["Offset of field: timeval::tv_sec"][::std::mem::offset_of!(timeval, tv_sec) - 0usize]; + ["Offset of field: timeval::tv_usec"][::std::mem::offset_of!(timeval, tv_usec) - 8usize]; +}; +#[repr(C)] +#[derive(Debug, Default, Copy, Clone)] +pub struct rt_metrics { + pub rmx_locks: u_long, + pub rmx_mtu: u_long, + pub rmx_hopcount: u_long, + pub rmx_expire: u_long, + pub rmx_recvpipe: u_long, + pub rmx_sendpipe: u_long, + pub rmx_ssthresh: u_long, + pub rmx_rtt: u_long, + pub rmx_rttvar: u_long, + pub rmx_pksent: u_long, + pub rmx_weight: u_long, + pub rmx_nhidx: u_long, + pub rmx_filler: [u_long; 2usize], +} +#[allow(clippy::unnecessary_operation, clippy::identity_op)] +const _: () = { + ["Size of rt_metrics"][::std::mem::size_of::() - 112usize]; + ["Alignment of rt_metrics"][::std::mem::align_of::() - 8usize]; + ["Offset of field: rt_metrics::rmx_locks"] + [::std::mem::offset_of!(rt_metrics, rmx_locks) - 0usize]; + ["Offset of field: rt_metrics::rmx_mtu"][::std::mem::offset_of!(rt_metrics, rmx_mtu) - 8usize]; + ["Offset of field: rt_metrics::rmx_hopcount"] + [::std::mem::offset_of!(rt_metrics, rmx_hopcount) - 16usize]; + ["Offset of field: rt_metrics::rmx_expire"] + [::std::mem::offset_of!(rt_metrics, rmx_expire) - 24usize]; + ["Offset of field: rt_metrics::rmx_recvpipe"] + [::std::mem::offset_of!(rt_metrics, rmx_recvpipe) - 32usize]; + ["Offset of field: rt_metrics::rmx_sendpipe"] + [::std::mem::offset_of!(rt_metrics, rmx_sendpipe) - 40usize]; + ["Offset of field: rt_metrics::rmx_ssthresh"] + [::std::mem::offset_of!(rt_metrics, rmx_ssthresh) - 48usize]; + ["Offset of field: rt_metrics::rmx_rtt"][::std::mem::offset_of!(rt_metrics, rmx_rtt) - 56usize]; + ["Offset of field: rt_metrics::rmx_rttvar"] + [::std::mem::offset_of!(rt_metrics, rmx_rttvar) - 64usize]; + ["Offset of field: rt_metrics::rmx_pksent"] + [::std::mem::offset_of!(rt_metrics, rmx_pksent) - 72usize]; + ["Offset of field: rt_metrics::rmx_weight"] + [::std::mem::offset_of!(rt_metrics, rmx_weight) - 80usize]; + ["Offset of field: rt_metrics::rmx_nhidx"] + [::std::mem::offset_of!(rt_metrics, rmx_nhidx) - 88usize]; + ["Offset of field: rt_metrics::rmx_filler"] + [::std::mem::offset_of!(rt_metrics, rmx_filler) - 96usize]; +}; +#[repr(C)] +#[derive(Debug, Default, Copy, Clone)] +pub struct rt_msghdr { + pub rtm_msglen: u_short, + pub rtm_version: u_char, + pub rtm_type: u_char, + pub rtm_index: u_short, + pub _rtm_spare1: u_short, + pub rtm_flags: ::std::os::raw::c_int, + pub rtm_addrs: ::std::os::raw::c_int, + pub rtm_pid: pid_t, + pub rtm_seq: ::std::os::raw::c_int, + pub rtm_errno: ::std::os::raw::c_int, + pub rtm_fmask: ::std::os::raw::c_int, + pub rtm_inits: u_long, + pub rtm_rmx: rt_metrics, +} +#[allow(clippy::unnecessary_operation, clippy::identity_op)] +const _: () = { + ["Size of rt_msghdr"][::std::mem::size_of::() - 152usize]; + ["Alignment of rt_msghdr"][::std::mem::align_of::() - 8usize]; + ["Offset of field: rt_msghdr::rtm_msglen"] + [::std::mem::offset_of!(rt_msghdr, rtm_msglen) - 0usize]; + ["Offset of field: rt_msghdr::rtm_version"] + [::std::mem::offset_of!(rt_msghdr, rtm_version) - 2usize]; + ["Offset of field: rt_msghdr::rtm_type"][::std::mem::offset_of!(rt_msghdr, rtm_type) - 3usize]; + ["Offset of field: rt_msghdr::rtm_index"] + [::std::mem::offset_of!(rt_msghdr, rtm_index) - 4usize]; + ["Offset of field: rt_msghdr::_rtm_spare1"] + [::std::mem::offset_of!(rt_msghdr, _rtm_spare1) - 6usize]; + ["Offset of field: rt_msghdr::rtm_flags"] + [::std::mem::offset_of!(rt_msghdr, rtm_flags) - 8usize]; + ["Offset of field: rt_msghdr::rtm_addrs"] + [::std::mem::offset_of!(rt_msghdr, rtm_addrs) - 12usize]; + ["Offset of field: rt_msghdr::rtm_pid"][::std::mem::offset_of!(rt_msghdr, rtm_pid) - 16usize]; + ["Offset of field: rt_msghdr::rtm_seq"][::std::mem::offset_of!(rt_msghdr, rtm_seq) - 20usize]; + ["Offset of field: rt_msghdr::rtm_errno"] + [::std::mem::offset_of!(rt_msghdr, rtm_errno) - 24usize]; + ["Offset of field: rt_msghdr::rtm_fmask"] + [::std::mem::offset_of!(rt_msghdr, rtm_fmask) - 28usize]; + ["Offset of field: rt_msghdr::rtm_inits"] + [::std::mem::offset_of!(rt_msghdr, rtm_inits) - 32usize]; + ["Offset of field: rt_msghdr::rtm_rmx"][::std::mem::offset_of!(rt_msghdr, rtm_rmx) - 40usize]; +}; +#[repr(C)] +#[derive(Copy, Clone)] +pub struct if_data { + pub ifi_type: u8, + pub ifi_physical: u8, + pub ifi_addrlen: u8, + pub ifi_hdrlen: u8, + pub ifi_link_state: u8, + pub ifi_vhid: u8, + pub ifi_datalen: u16, + pub ifi_mtu: u32, + pub ifi_metric: u32, + pub ifi_baudrate: u64, + pub ifi_ipackets: u64, + pub ifi_ierrors: u64, + pub ifi_opackets: u64, + pub ifi_oerrors: u64, + pub ifi_collisions: u64, + pub ifi_ibytes: u64, + pub ifi_obytes: u64, + pub ifi_imcasts: u64, + pub ifi_omcasts: u64, + pub ifi_iqdrops: u64, + pub ifi_oqdrops: u64, + pub ifi_noproto: u64, + pub ifi_hwassist: u64, + pub __ifi_epoch: if_data__bindgen_ty_1, + pub __ifi_lastchange: if_data__bindgen_ty_2, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union if_data__bindgen_ty_1 { + pub tt: time_t, + pub ph: u64, +} +#[allow(clippy::unnecessary_operation, clippy::identity_op)] +const _: () = { + ["Size of if_data__bindgen_ty_1"][::std::mem::size_of::() - 8usize]; + ["Alignment of if_data__bindgen_ty_1"] + [::std::mem::align_of::() - 8usize]; + ["Offset of field: if_data__bindgen_ty_1::tt"] + [::std::mem::offset_of!(if_data__bindgen_ty_1, tt) - 0usize]; + ["Offset of field: if_data__bindgen_ty_1::ph"] + [::std::mem::offset_of!(if_data__bindgen_ty_1, ph) - 0usize]; +}; +impl Default for if_data__bindgen_ty_1 { + fn default() -> Self { + let mut s = ::std::mem::MaybeUninit::::uninit(); + unsafe { + ::std::ptr::write_bytes(s.as_mut_ptr(), 0, 1); + s.assume_init() + } + } +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union if_data__bindgen_ty_2 { + pub tv: timeval, + pub ph: if_data__bindgen_ty_2__bindgen_ty_1, +} +#[repr(C)] +#[derive(Debug, Default, Copy, Clone)] +pub struct if_data__bindgen_ty_2__bindgen_ty_1 { + pub ph1: u64, + pub ph2: u64, +} +#[allow(clippy::unnecessary_operation, clippy::identity_op)] +const _: () = { + ["Size of if_data__bindgen_ty_2__bindgen_ty_1"] + [::std::mem::size_of::() - 16usize]; + ["Alignment of if_data__bindgen_ty_2__bindgen_ty_1"] + [::std::mem::align_of::() - 8usize]; + ["Offset of field: if_data__bindgen_ty_2__bindgen_ty_1::ph1"] + [::std::mem::offset_of!(if_data__bindgen_ty_2__bindgen_ty_1, ph1) - 0usize]; + ["Offset of field: if_data__bindgen_ty_2__bindgen_ty_1::ph2"] + [::std::mem::offset_of!(if_data__bindgen_ty_2__bindgen_ty_1, ph2) - 8usize]; +}; +#[allow(clippy::unnecessary_operation, clippy::identity_op)] +const _: () = { + ["Size of if_data__bindgen_ty_2"][::std::mem::size_of::() - 16usize]; + ["Alignment of if_data__bindgen_ty_2"] + [::std::mem::align_of::() - 8usize]; + ["Offset of field: if_data__bindgen_ty_2::tv"] + [::std::mem::offset_of!(if_data__bindgen_ty_2, tv) - 0usize]; + ["Offset of field: if_data__bindgen_ty_2::ph"] + [::std::mem::offset_of!(if_data__bindgen_ty_2, ph) - 0usize]; +}; +impl Default for if_data__bindgen_ty_2 { + fn default() -> Self { + let mut s = ::std::mem::MaybeUninit::::uninit(); + unsafe { + ::std::ptr::write_bytes(s.as_mut_ptr(), 0, 1); + s.assume_init() + } + } +} +#[allow(clippy::unnecessary_operation, clippy::identity_op)] +const _: () = { + ["Size of if_data"][::std::mem::size_of::() - 152usize]; + ["Alignment of if_data"][::std::mem::align_of::() - 8usize]; + ["Offset of field: if_data::ifi_type"][::std::mem::offset_of!(if_data, ifi_type) - 0usize]; + ["Offset of field: if_data::ifi_physical"] + [::std::mem::offset_of!(if_data, ifi_physical) - 1usize]; + ["Offset of field: if_data::ifi_addrlen"] + [::std::mem::offset_of!(if_data, ifi_addrlen) - 2usize]; + ["Offset of field: if_data::ifi_hdrlen"][::std::mem::offset_of!(if_data, ifi_hdrlen) - 3usize]; + ["Offset of field: if_data::ifi_link_state"] + [::std::mem::offset_of!(if_data, ifi_link_state) - 4usize]; + ["Offset of field: if_data::ifi_vhid"][::std::mem::offset_of!(if_data, ifi_vhid) - 5usize]; + ["Offset of field: if_data::ifi_datalen"] + [::std::mem::offset_of!(if_data, ifi_datalen) - 6usize]; + ["Offset of field: if_data::ifi_mtu"][::std::mem::offset_of!(if_data, ifi_mtu) - 8usize]; + ["Offset of field: if_data::ifi_metric"][::std::mem::offset_of!(if_data, ifi_metric) - 12usize]; + ["Offset of field: if_data::ifi_baudrate"] + [::std::mem::offset_of!(if_data, ifi_baudrate) - 16usize]; + ["Offset of field: if_data::ifi_ipackets"] + [::std::mem::offset_of!(if_data, ifi_ipackets) - 24usize]; + ["Offset of field: if_data::ifi_ierrors"] + [::std::mem::offset_of!(if_data, ifi_ierrors) - 32usize]; + ["Offset of field: if_data::ifi_opackets"] + [::std::mem::offset_of!(if_data, ifi_opackets) - 40usize]; + ["Offset of field: if_data::ifi_oerrors"] + [::std::mem::offset_of!(if_data, ifi_oerrors) - 48usize]; + ["Offset of field: if_data::ifi_collisions"] + [::std::mem::offset_of!(if_data, ifi_collisions) - 56usize]; + ["Offset of field: if_data::ifi_ibytes"][::std::mem::offset_of!(if_data, ifi_ibytes) - 64usize]; + ["Offset of field: if_data::ifi_obytes"][::std::mem::offset_of!(if_data, ifi_obytes) - 72usize]; + ["Offset of field: if_data::ifi_imcasts"] + [::std::mem::offset_of!(if_data, ifi_imcasts) - 80usize]; + ["Offset of field: if_data::ifi_omcasts"] + [::std::mem::offset_of!(if_data, ifi_omcasts) - 88usize]; + ["Offset of field: if_data::ifi_iqdrops"] + [::std::mem::offset_of!(if_data, ifi_iqdrops) - 96usize]; + ["Offset of field: if_data::ifi_oqdrops"] + [::std::mem::offset_of!(if_data, ifi_oqdrops) - 104usize]; + ["Offset of field: if_data::ifi_noproto"] + [::std::mem::offset_of!(if_data, ifi_noproto) - 112usize]; + ["Offset of field: if_data::ifi_hwassist"] + [::std::mem::offset_of!(if_data, ifi_hwassist) - 120usize]; + ["Offset of field: if_data::__ifi_epoch"] + [::std::mem::offset_of!(if_data, __ifi_epoch) - 128usize]; + ["Offset of field: if_data::__ifi_lastchange"] + [::std::mem::offset_of!(if_data, __ifi_lastchange) - 136usize]; +}; +impl Default for if_data { + fn default() -> Self { + let mut s = ::std::mem::MaybeUninit::::uninit(); + unsafe { + ::std::ptr::write_bytes(s.as_mut_ptr(), 0, 1); + s.assume_init() + } + } +} diff --git a/mtu/src/bindings/linux.h b/mtu/src/bindings/linux.h new file mode 100644 index 0000000000..db32ccbbfd --- /dev/null +++ b/mtu/src/bindings/linux.h @@ -0,0 +1,7 @@ +#include + +/* Force bindgen to generate these types */ +struct nlmsghdr __nlmsghdr; +struct rtattr __rtattr; +struct rtmsg __rtmsg; +struct ifinfomsg __ifinfomsg; diff --git a/mtu/src/bindings/linux.rs b/mtu/src/bindings/linux.rs new file mode 100644 index 0000000000..33046e0db2 --- /dev/null +++ b/mtu/src/bindings/linux.rs @@ -0,0 +1,91 @@ +/* automatically generated by rust-bindgen 0.72.1 */ + +pub type __u16 = ::std::os::raw::c_ushort; +pub type __u32 = ::std::os::raw::c_uint; +#[repr(C)] +#[derive(Debug, Default, Copy, Clone)] +pub struct nlmsghdr { + pub nlmsg_len: __u32, + pub nlmsg_type: __u16, + pub nlmsg_flags: __u16, + pub nlmsg_seq: __u32, + pub nlmsg_pid: __u32, +} +#[allow(clippy::unnecessary_operation, clippy::identity_op)] +const _: () = { + ["Size of nlmsghdr"][::std::mem::size_of::() - 16usize]; + ["Alignment of nlmsghdr"][::std::mem::align_of::() - 4usize]; + ["Offset of field: nlmsghdr::nlmsg_len"][::std::mem::offset_of!(nlmsghdr, nlmsg_len) - 0usize]; + ["Offset of field: nlmsghdr::nlmsg_type"] + [::std::mem::offset_of!(nlmsghdr, nlmsg_type) - 4usize]; + ["Offset of field: nlmsghdr::nlmsg_flags"] + [::std::mem::offset_of!(nlmsghdr, nlmsg_flags) - 6usize]; + ["Offset of field: nlmsghdr::nlmsg_seq"][::std::mem::offset_of!(nlmsghdr, nlmsg_seq) - 8usize]; + ["Offset of field: nlmsghdr::nlmsg_pid"][::std::mem::offset_of!(nlmsghdr, nlmsg_pid) - 12usize]; +}; +#[repr(C)] +#[derive(Debug, Default, Copy, Clone)] +pub struct rtattr { + pub rta_len: ::std::os::raw::c_ushort, + pub rta_type: ::std::os::raw::c_ushort, +} +#[allow(clippy::unnecessary_operation, clippy::identity_op)] +const _: () = { + ["Size of rtattr"][::std::mem::size_of::() - 4usize]; + ["Alignment of rtattr"][::std::mem::align_of::() - 2usize]; + ["Offset of field: rtattr::rta_len"][::std::mem::offset_of!(rtattr, rta_len) - 0usize]; + ["Offset of field: rtattr::rta_type"][::std::mem::offset_of!(rtattr, rta_type) - 2usize]; +}; +#[repr(C)] +#[derive(Debug, Default, Copy, Clone)] +pub struct rtmsg { + pub rtm_family: ::std::os::raw::c_uchar, + pub rtm_dst_len: ::std::os::raw::c_uchar, + pub rtm_src_len: ::std::os::raw::c_uchar, + pub rtm_tos: ::std::os::raw::c_uchar, + pub rtm_table: ::std::os::raw::c_uchar, + pub rtm_protocol: ::std::os::raw::c_uchar, + pub rtm_scope: ::std::os::raw::c_uchar, + pub rtm_type: ::std::os::raw::c_uchar, + pub rtm_flags: ::std::os::raw::c_uint, +} +#[allow(clippy::unnecessary_operation, clippy::identity_op)] +const _: () = { + ["Size of rtmsg"][::std::mem::size_of::() - 12usize]; + ["Alignment of rtmsg"][::std::mem::align_of::() - 4usize]; + ["Offset of field: rtmsg::rtm_family"][::std::mem::offset_of!(rtmsg, rtm_family) - 0usize]; + ["Offset of field: rtmsg::rtm_dst_len"][::std::mem::offset_of!(rtmsg, rtm_dst_len) - 1usize]; + ["Offset of field: rtmsg::rtm_src_len"][::std::mem::offset_of!(rtmsg, rtm_src_len) - 2usize]; + ["Offset of field: rtmsg::rtm_tos"][::std::mem::offset_of!(rtmsg, rtm_tos) - 3usize]; + ["Offset of field: rtmsg::rtm_table"][::std::mem::offset_of!(rtmsg, rtm_table) - 4usize]; + ["Offset of field: rtmsg::rtm_protocol"][::std::mem::offset_of!(rtmsg, rtm_protocol) - 5usize]; + ["Offset of field: rtmsg::rtm_scope"][::std::mem::offset_of!(rtmsg, rtm_scope) - 6usize]; + ["Offset of field: rtmsg::rtm_type"][::std::mem::offset_of!(rtmsg, rtm_type) - 7usize]; + ["Offset of field: rtmsg::rtm_flags"][::std::mem::offset_of!(rtmsg, rtm_flags) - 8usize]; +}; +#[repr(C)] +#[derive(Debug, Default, Copy, Clone)] +pub struct ifinfomsg { + pub ifi_family: ::std::os::raw::c_uchar, + pub __ifi_pad: ::std::os::raw::c_uchar, + pub ifi_type: ::std::os::raw::c_ushort, + pub ifi_index: ::std::os::raw::c_int, + pub ifi_flags: ::std::os::raw::c_uint, + pub ifi_change: ::std::os::raw::c_uint, +} +#[allow(clippy::unnecessary_operation, clippy::identity_op)] +const _: () = { + ["Size of ifinfomsg"][::std::mem::size_of::() - 16usize]; + ["Alignment of ifinfomsg"][::std::mem::align_of::() - 4usize]; + ["Offset of field: ifinfomsg::ifi_family"] + [::std::mem::offset_of!(ifinfomsg, ifi_family) - 0usize]; + ["Offset of field: ifinfomsg::__ifi_pad"] + [::std::mem::offset_of!(ifinfomsg, __ifi_pad) - 1usize]; + ["Offset of field: ifinfomsg::ifi_type"][::std::mem::offset_of!(ifinfomsg, ifi_type) - 2usize]; + ["Offset of field: ifinfomsg::ifi_index"] + [::std::mem::offset_of!(ifinfomsg, ifi_index) - 4usize]; + ["Offset of field: ifinfomsg::ifi_flags"] + [::std::mem::offset_of!(ifinfomsg, ifi_flags) - 8usize]; + ["Offset of field: ifinfomsg::ifi_change"] + [::std::mem::offset_of!(ifinfomsg, ifi_change) - 12usize]; +}; diff --git a/mtu/src/bindings/macos.rs b/mtu/src/bindings/macos.rs new file mode 100644 index 0000000000..ee6ddd1b0f --- /dev/null +++ b/mtu/src/bindings/macos.rs @@ -0,0 +1,197 @@ +/* automatically generated by rust-bindgen 0.72.1 */ + +pub const RTM_VERSION: u32 = 5; +pub const RTM_GET: u32 = 4; +pub const RTA_DST: u32 = 1; +pub const RTA_IFP: u32 = 16; +pub const RTAX_MAX: u32 = 8; +pub type __int32_t = ::std::os::raw::c_int; +pub type u_int32_t = ::std::os::raw::c_uint; +pub type __darwin_pid_t = __int32_t; +pub type u_char = ::std::os::raw::c_uchar; +pub type u_short = ::std::os::raw::c_ushort; +pub type pid_t = __darwin_pid_t; +#[repr(C)] +#[derive(Debug, Default, Copy, Clone)] +pub struct rt_metrics { + pub rmx_locks: u_int32_t, + pub rmx_mtu: u_int32_t, + pub rmx_hopcount: u_int32_t, + pub rmx_expire: i32, + pub rmx_recvpipe: u_int32_t, + pub rmx_sendpipe: u_int32_t, + pub rmx_ssthresh: u_int32_t, + pub rmx_rtt: u_int32_t, + pub rmx_rttvar: u_int32_t, + pub rmx_pksent: u_int32_t, + pub rmx_filler: [u_int32_t; 4usize], +} +#[allow(clippy::unnecessary_operation, clippy::identity_op)] +const _: () = { + ["Size of rt_metrics"][::std::mem::size_of::() - 56usize]; + ["Alignment of rt_metrics"][::std::mem::align_of::() - 4usize]; + ["Offset of field: rt_metrics::rmx_locks"] + [::std::mem::offset_of!(rt_metrics, rmx_locks) - 0usize]; + ["Offset of field: rt_metrics::rmx_mtu"][::std::mem::offset_of!(rt_metrics, rmx_mtu) - 4usize]; + ["Offset of field: rt_metrics::rmx_hopcount"] + [::std::mem::offset_of!(rt_metrics, rmx_hopcount) - 8usize]; + ["Offset of field: rt_metrics::rmx_expire"] + [::std::mem::offset_of!(rt_metrics, rmx_expire) - 12usize]; + ["Offset of field: rt_metrics::rmx_recvpipe"] + [::std::mem::offset_of!(rt_metrics, rmx_recvpipe) - 16usize]; + ["Offset of field: rt_metrics::rmx_sendpipe"] + [::std::mem::offset_of!(rt_metrics, rmx_sendpipe) - 20usize]; + ["Offset of field: rt_metrics::rmx_ssthresh"] + [::std::mem::offset_of!(rt_metrics, rmx_ssthresh) - 24usize]; + ["Offset of field: rt_metrics::rmx_rtt"][::std::mem::offset_of!(rt_metrics, rmx_rtt) - 28usize]; + ["Offset of field: rt_metrics::rmx_rttvar"] + [::std::mem::offset_of!(rt_metrics, rmx_rttvar) - 32usize]; + ["Offset of field: rt_metrics::rmx_pksent"] + [::std::mem::offset_of!(rt_metrics, rmx_pksent) - 36usize]; + ["Offset of field: rt_metrics::rmx_filler"] + [::std::mem::offset_of!(rt_metrics, rmx_filler) - 40usize]; +}; +#[repr(C)] +#[derive(Debug, Default, Copy, Clone)] +pub struct rt_msghdr { + pub rtm_msglen: u_short, + pub rtm_version: u_char, + pub rtm_type: u_char, + pub rtm_index: u_short, + pub __bindgen_padding_0: [u8; 2usize], + pub rtm_flags: ::std::os::raw::c_int, + pub rtm_addrs: ::std::os::raw::c_int, + pub rtm_pid: pid_t, + pub rtm_seq: ::std::os::raw::c_int, + pub rtm_errno: ::std::os::raw::c_int, + pub rtm_use: ::std::os::raw::c_int, + pub rtm_inits: u_int32_t, + pub rtm_rmx: rt_metrics, +} +#[allow(clippy::unnecessary_operation, clippy::identity_op)] +const _: () = { + ["Size of rt_msghdr"][::std::mem::size_of::() - 92usize]; + ["Alignment of rt_msghdr"][::std::mem::align_of::() - 4usize]; + ["Offset of field: rt_msghdr::rtm_msglen"] + [::std::mem::offset_of!(rt_msghdr, rtm_msglen) - 0usize]; + ["Offset of field: rt_msghdr::rtm_version"] + [::std::mem::offset_of!(rt_msghdr, rtm_version) - 2usize]; + ["Offset of field: rt_msghdr::rtm_type"][::std::mem::offset_of!(rt_msghdr, rtm_type) - 3usize]; + ["Offset of field: rt_msghdr::rtm_index"] + [::std::mem::offset_of!(rt_msghdr, rtm_index) - 4usize]; + ["Offset of field: rt_msghdr::rtm_flags"] + [::std::mem::offset_of!(rt_msghdr, rtm_flags) - 8usize]; + ["Offset of field: rt_msghdr::rtm_addrs"] + [::std::mem::offset_of!(rt_msghdr, rtm_addrs) - 12usize]; + ["Offset of field: rt_msghdr::rtm_pid"][::std::mem::offset_of!(rt_msghdr, rtm_pid) - 16usize]; + ["Offset of field: rt_msghdr::rtm_seq"][::std::mem::offset_of!(rt_msghdr, rtm_seq) - 20usize]; + ["Offset of field: rt_msghdr::rtm_errno"] + [::std::mem::offset_of!(rt_msghdr, rtm_errno) - 24usize]; + ["Offset of field: rt_msghdr::rtm_use"][::std::mem::offset_of!(rt_msghdr, rtm_use) - 28usize]; + ["Offset of field: rt_msghdr::rtm_inits"] + [::std::mem::offset_of!(rt_msghdr, rtm_inits) - 32usize]; + ["Offset of field: rt_msghdr::rtm_rmx"][::std::mem::offset_of!(rt_msghdr, rtm_rmx) - 36usize]; +}; +#[repr(C)] +#[derive(Debug, Default, Copy, Clone)] +pub struct timeval32 { + pub tv_sec: __int32_t, + pub tv_usec: __int32_t, +} +#[allow(clippy::unnecessary_operation, clippy::identity_op)] +const _: () = { + ["Size of timeval32"][::std::mem::size_of::() - 8usize]; + ["Alignment of timeval32"][::std::mem::align_of::() - 4usize]; + ["Offset of field: timeval32::tv_sec"][::std::mem::offset_of!(timeval32, tv_sec) - 0usize]; + ["Offset of field: timeval32::tv_usec"][::std::mem::offset_of!(timeval32, tv_usec) - 4usize]; +}; +#[repr(C)] +#[derive(Debug, Default, Copy, Clone)] +pub struct if_data { + pub ifi_type: u_char, + pub ifi_typelen: u_char, + pub ifi_physical: u_char, + pub ifi_addrlen: u_char, + pub ifi_hdrlen: u_char, + pub ifi_recvquota: u_char, + pub ifi_xmitquota: u_char, + pub ifi_unused1: u_char, + pub ifi_mtu: u_int32_t, + pub ifi_metric: u_int32_t, + pub ifi_baudrate: u_int32_t, + pub ifi_ipackets: u_int32_t, + pub ifi_ierrors: u_int32_t, + pub ifi_opackets: u_int32_t, + pub ifi_oerrors: u_int32_t, + pub ifi_collisions: u_int32_t, + pub ifi_ibytes: u_int32_t, + pub ifi_obytes: u_int32_t, + pub ifi_imcasts: u_int32_t, + pub ifi_omcasts: u_int32_t, + pub ifi_iqdrops: u_int32_t, + pub ifi_noproto: u_int32_t, + pub ifi_recvtiming: u_int32_t, + pub ifi_xmittiming: u_int32_t, + pub ifi_lastchange: timeval32, + pub ifi_unused2: u_int32_t, + pub ifi_hwassist: u_int32_t, + pub ifi_reserved1: u_int32_t, + pub ifi_reserved2: u_int32_t, +} +#[allow(clippy::unnecessary_operation, clippy::identity_op)] +const _: () = { + ["Size of if_data"][::std::mem::size_of::() - 96usize]; + ["Alignment of if_data"][::std::mem::align_of::() - 4usize]; + ["Offset of field: if_data::ifi_type"][::std::mem::offset_of!(if_data, ifi_type) - 0usize]; + ["Offset of field: if_data::ifi_typelen"] + [::std::mem::offset_of!(if_data, ifi_typelen) - 1usize]; + ["Offset of field: if_data::ifi_physical"] + [::std::mem::offset_of!(if_data, ifi_physical) - 2usize]; + ["Offset of field: if_data::ifi_addrlen"] + [::std::mem::offset_of!(if_data, ifi_addrlen) - 3usize]; + ["Offset of field: if_data::ifi_hdrlen"][::std::mem::offset_of!(if_data, ifi_hdrlen) - 4usize]; + ["Offset of field: if_data::ifi_recvquota"] + [::std::mem::offset_of!(if_data, ifi_recvquota) - 5usize]; + ["Offset of field: if_data::ifi_xmitquota"] + [::std::mem::offset_of!(if_data, ifi_xmitquota) - 6usize]; + ["Offset of field: if_data::ifi_unused1"] + [::std::mem::offset_of!(if_data, ifi_unused1) - 7usize]; + ["Offset of field: if_data::ifi_mtu"][::std::mem::offset_of!(if_data, ifi_mtu) - 8usize]; + ["Offset of field: if_data::ifi_metric"][::std::mem::offset_of!(if_data, ifi_metric) - 12usize]; + ["Offset of field: if_data::ifi_baudrate"] + [::std::mem::offset_of!(if_data, ifi_baudrate) - 16usize]; + ["Offset of field: if_data::ifi_ipackets"] + [::std::mem::offset_of!(if_data, ifi_ipackets) - 20usize]; + ["Offset of field: if_data::ifi_ierrors"] + [::std::mem::offset_of!(if_data, ifi_ierrors) - 24usize]; + ["Offset of field: if_data::ifi_opackets"] + [::std::mem::offset_of!(if_data, ifi_opackets) - 28usize]; + ["Offset of field: if_data::ifi_oerrors"] + [::std::mem::offset_of!(if_data, ifi_oerrors) - 32usize]; + ["Offset of field: if_data::ifi_collisions"] + [::std::mem::offset_of!(if_data, ifi_collisions) - 36usize]; + ["Offset of field: if_data::ifi_ibytes"][::std::mem::offset_of!(if_data, ifi_ibytes) - 40usize]; + ["Offset of field: if_data::ifi_obytes"][::std::mem::offset_of!(if_data, ifi_obytes) - 44usize]; + ["Offset of field: if_data::ifi_imcasts"] + [::std::mem::offset_of!(if_data, ifi_imcasts) - 48usize]; + ["Offset of field: if_data::ifi_omcasts"] + [::std::mem::offset_of!(if_data, ifi_omcasts) - 52usize]; + ["Offset of field: if_data::ifi_iqdrops"] + [::std::mem::offset_of!(if_data, ifi_iqdrops) - 56usize]; + ["Offset of field: if_data::ifi_noproto"] + [::std::mem::offset_of!(if_data, ifi_noproto) - 60usize]; + ["Offset of field: if_data::ifi_recvtiming"] + [::std::mem::offset_of!(if_data, ifi_recvtiming) - 64usize]; + ["Offset of field: if_data::ifi_xmittiming"] + [::std::mem::offset_of!(if_data, ifi_xmittiming) - 68usize]; + ["Offset of field: if_data::ifi_lastchange"] + [::std::mem::offset_of!(if_data, ifi_lastchange) - 72usize]; + ["Offset of field: if_data::ifi_unused2"] + [::std::mem::offset_of!(if_data, ifi_unused2) - 80usize]; + ["Offset of field: if_data::ifi_hwassist"] + [::std::mem::offset_of!(if_data, ifi_hwassist) - 84usize]; + ["Offset of field: if_data::ifi_reserved1"] + [::std::mem::offset_of!(if_data, ifi_reserved1) - 88usize]; + ["Offset of field: if_data::ifi_reserved2"] + [::std::mem::offset_of!(if_data, ifi_reserved2) - 92usize]; +}; diff --git a/mtu/src/bindings/netbsd.rs b/mtu/src/bindings/netbsd.rs new file mode 100644 index 0000000000..97125c726d --- /dev/null +++ b/mtu/src/bindings/netbsd.rs @@ -0,0 +1,166 @@ +/* automatically generated by rust-bindgen 0.72.1 */ + +pub const RTM_VERSION: u32 = 4; +pub const RTM_GET: u32 = 4; +pub const RTA_DST: u32 = 1; +pub const RTA_IFP: u32 = 16; +pub const RTAX_MAX: u32 = 9; +pub type __int32_t = ::std::os::raw::c_int; +pub type __int64_t = ::std::os::raw::c_long; +pub type __pid_t = __int32_t; +pub type u_char = ::std::os::raw::c_uchar; +pub type u_short = ::std::os::raw::c_ushort; +pub type time_t = __int64_t; +#[repr(C)] +#[derive(Debug, Default, Copy, Clone)] +pub struct timespec { + pub tv_sec: time_t, + pub tv_nsec: ::std::os::raw::c_long, +} +#[allow(clippy::unnecessary_operation, clippy::identity_op)] +const _: () = { + ["Size of timespec"][::std::mem::size_of::() - 16usize]; + ["Alignment of timespec"][::std::mem::align_of::() - 8usize]; + ["Offset of field: timespec::tv_sec"][::std::mem::offset_of!(timespec, tv_sec) - 0usize]; + ["Offset of field: timespec::tv_nsec"][::std::mem::offset_of!(timespec, tv_nsec) - 8usize]; +}; +#[repr(C)] +#[derive(Debug, Default, Copy, Clone)] +pub struct if_data { + pub ifi_type: u_char, + pub ifi_addrlen: u_char, + pub ifi_hdrlen: u_char, + pub __bindgen_padding_0: u8, + pub ifi_link_state: ::std::os::raw::c_int, + pub ifi_mtu: u64, + pub ifi_metric: u64, + pub ifi_baudrate: u64, + pub ifi_ipackets: u64, + pub ifi_ierrors: u64, + pub ifi_opackets: u64, + pub ifi_oerrors: u64, + pub ifi_collisions: u64, + pub ifi_ibytes: u64, + pub ifi_obytes: u64, + pub ifi_imcasts: u64, + pub ifi_omcasts: u64, + pub ifi_iqdrops: u64, + pub ifi_noproto: u64, + pub ifi_lastchange: timespec, +} +#[allow(clippy::unnecessary_operation, clippy::identity_op)] +const _: () = { + ["Size of if_data"][::std::mem::size_of::() - 136usize]; + ["Alignment of if_data"][::std::mem::align_of::() - 8usize]; + ["Offset of field: if_data::ifi_type"][::std::mem::offset_of!(if_data, ifi_type) - 0usize]; + ["Offset of field: if_data::ifi_addrlen"] + [::std::mem::offset_of!(if_data, ifi_addrlen) - 1usize]; + ["Offset of field: if_data::ifi_hdrlen"][::std::mem::offset_of!(if_data, ifi_hdrlen) - 2usize]; + ["Offset of field: if_data::ifi_link_state"] + [::std::mem::offset_of!(if_data, ifi_link_state) - 4usize]; + ["Offset of field: if_data::ifi_mtu"][::std::mem::offset_of!(if_data, ifi_mtu) - 8usize]; + ["Offset of field: if_data::ifi_metric"][::std::mem::offset_of!(if_data, ifi_metric) - 16usize]; + ["Offset of field: if_data::ifi_baudrate"] + [::std::mem::offset_of!(if_data, ifi_baudrate) - 24usize]; + ["Offset of field: if_data::ifi_ipackets"] + [::std::mem::offset_of!(if_data, ifi_ipackets) - 32usize]; + ["Offset of field: if_data::ifi_ierrors"] + [::std::mem::offset_of!(if_data, ifi_ierrors) - 40usize]; + ["Offset of field: if_data::ifi_opackets"] + [::std::mem::offset_of!(if_data, ifi_opackets) - 48usize]; + ["Offset of field: if_data::ifi_oerrors"] + [::std::mem::offset_of!(if_data, ifi_oerrors) - 56usize]; + ["Offset of field: if_data::ifi_collisions"] + [::std::mem::offset_of!(if_data, ifi_collisions) - 64usize]; + ["Offset of field: if_data::ifi_ibytes"][::std::mem::offset_of!(if_data, ifi_ibytes) - 72usize]; + ["Offset of field: if_data::ifi_obytes"][::std::mem::offset_of!(if_data, ifi_obytes) - 80usize]; + ["Offset of field: if_data::ifi_imcasts"] + [::std::mem::offset_of!(if_data, ifi_imcasts) - 88usize]; + ["Offset of field: if_data::ifi_omcasts"] + [::std::mem::offset_of!(if_data, ifi_omcasts) - 96usize]; + ["Offset of field: if_data::ifi_iqdrops"] + [::std::mem::offset_of!(if_data, ifi_iqdrops) - 104usize]; + ["Offset of field: if_data::ifi_noproto"] + [::std::mem::offset_of!(if_data, ifi_noproto) - 112usize]; + ["Offset of field: if_data::ifi_lastchange"] + [::std::mem::offset_of!(if_data, ifi_lastchange) - 120usize]; +}; +#[repr(C)] +#[derive(Debug, Default, Copy, Clone)] +pub struct rt_metrics { + pub rmx_locks: u64, + pub rmx_mtu: u64, + pub rmx_hopcount: u64, + pub rmx_recvpipe: u64, + pub rmx_sendpipe: u64, + pub rmx_ssthresh: u64, + pub rmx_rtt: u64, + pub rmx_rttvar: u64, + pub rmx_expire: time_t, + pub rmx_pksent: time_t, +} +#[allow(clippy::unnecessary_operation, clippy::identity_op)] +const _: () = { + ["Size of rt_metrics"][::std::mem::size_of::() - 80usize]; + ["Alignment of rt_metrics"][::std::mem::align_of::() - 8usize]; + ["Offset of field: rt_metrics::rmx_locks"] + [::std::mem::offset_of!(rt_metrics, rmx_locks) - 0usize]; + ["Offset of field: rt_metrics::rmx_mtu"][::std::mem::offset_of!(rt_metrics, rmx_mtu) - 8usize]; + ["Offset of field: rt_metrics::rmx_hopcount"] + [::std::mem::offset_of!(rt_metrics, rmx_hopcount) - 16usize]; + ["Offset of field: rt_metrics::rmx_recvpipe"] + [::std::mem::offset_of!(rt_metrics, rmx_recvpipe) - 24usize]; + ["Offset of field: rt_metrics::rmx_sendpipe"] + [::std::mem::offset_of!(rt_metrics, rmx_sendpipe) - 32usize]; + ["Offset of field: rt_metrics::rmx_ssthresh"] + [::std::mem::offset_of!(rt_metrics, rmx_ssthresh) - 40usize]; + ["Offset of field: rt_metrics::rmx_rtt"][::std::mem::offset_of!(rt_metrics, rmx_rtt) - 48usize]; + ["Offset of field: rt_metrics::rmx_rttvar"] + [::std::mem::offset_of!(rt_metrics, rmx_rttvar) - 56usize]; + ["Offset of field: rt_metrics::rmx_expire"] + [::std::mem::offset_of!(rt_metrics, rmx_expire) - 64usize]; + ["Offset of field: rt_metrics::rmx_pksent"] + [::std::mem::offset_of!(rt_metrics, rmx_pksent) - 72usize]; +}; +#[repr(C)] +#[derive(Debug, Default, Copy, Clone)] +pub struct rt_msghdr { + pub rtm_msglen: u_short, + pub rtm_version: u_char, + pub rtm_type: u_char, + pub rtm_index: u_short, + pub __bindgen_padding_0: [u8; 2usize], + pub rtm_flags: ::std::os::raw::c_int, + pub rtm_addrs: ::std::os::raw::c_int, + pub rtm_pid: __pid_t, + pub rtm_seq: ::std::os::raw::c_int, + pub rtm_errno: ::std::os::raw::c_int, + pub rtm_use: ::std::os::raw::c_int, + pub rtm_inits: ::std::os::raw::c_int, + pub __bindgen_padding_1: [u8; 4usize], + pub rtm_rmx: rt_metrics, +} +#[allow(clippy::unnecessary_operation, clippy::identity_op)] +const _: () = { + ["Size of rt_msghdr"][::std::mem::size_of::() - 120usize]; + ["Alignment of rt_msghdr"][::std::mem::align_of::() - 8usize]; + ["Offset of field: rt_msghdr::rtm_msglen"] + [::std::mem::offset_of!(rt_msghdr, rtm_msglen) - 0usize]; + ["Offset of field: rt_msghdr::rtm_version"] + [::std::mem::offset_of!(rt_msghdr, rtm_version) - 2usize]; + ["Offset of field: rt_msghdr::rtm_type"][::std::mem::offset_of!(rt_msghdr, rtm_type) - 3usize]; + ["Offset of field: rt_msghdr::rtm_index"] + [::std::mem::offset_of!(rt_msghdr, rtm_index) - 4usize]; + ["Offset of field: rt_msghdr::rtm_flags"] + [::std::mem::offset_of!(rt_msghdr, rtm_flags) - 8usize]; + ["Offset of field: rt_msghdr::rtm_addrs"] + [::std::mem::offset_of!(rt_msghdr, rtm_addrs) - 12usize]; + ["Offset of field: rt_msghdr::rtm_pid"][::std::mem::offset_of!(rt_msghdr, rtm_pid) - 16usize]; + ["Offset of field: rt_msghdr::rtm_seq"][::std::mem::offset_of!(rt_msghdr, rtm_seq) - 20usize]; + ["Offset of field: rt_msghdr::rtm_errno"] + [::std::mem::offset_of!(rt_msghdr, rtm_errno) - 24usize]; + ["Offset of field: rt_msghdr::rtm_use"][::std::mem::offset_of!(rt_msghdr, rtm_use) - 28usize]; + ["Offset of field: rt_msghdr::rtm_inits"] + [::std::mem::offset_of!(rt_msghdr, rtm_inits) - 32usize]; + ["Offset of field: rt_msghdr::rtm_rmx"][::std::mem::offset_of!(rt_msghdr, rtm_rmx) - 40usize]; +}; diff --git a/mtu/src/bindings/openbsd.rs b/mtu/src/bindings/openbsd.rs new file mode 100644 index 0000000000..b7b0df8eb8 --- /dev/null +++ b/mtu/src/bindings/openbsd.rs @@ -0,0 +1,199 @@ +/* automatically generated by rust-bindgen 0.72.0 */ + +pub const RTM_VERSION: u32 = 5; +pub const RTM_GET: u32 = 4; +pub const RTA_DST: u32 = 1; +pub const RTA_IFP: u32 = 16; +pub const RTAX_MAX: u32 = 15; +pub type __int32_t = ::std::os::raw::c_int; +pub type __uint32_t = ::std::os::raw::c_uint; +pub type __int64_t = ::std::os::raw::c_longlong; +pub type __uint64_t = ::std::os::raw::c_ulonglong; +pub type __pid_t = __int32_t; +pub type __suseconds_t = ::std::os::raw::c_long; +pub type __time_t = __int64_t; +pub type u_char = ::std::os::raw::c_uchar; +pub type u_short = ::std::os::raw::c_ushort; +pub type u_int = ::std::os::raw::c_uint; +pub type u_int32_t = __uint32_t; +pub type u_int64_t = __uint64_t; +pub type suseconds_t = __suseconds_t; +pub type pid_t = __pid_t; +pub type time_t = __time_t; +#[repr(C)] +#[derive(Debug, Default, Copy, Clone)] +pub struct timeval { + pub tv_sec: time_t, + pub tv_usec: suseconds_t, +} +#[allow(clippy::unnecessary_operation, clippy::identity_op)] +const _: () = { + ["Size of timeval"][::std::mem::size_of::() - 16usize]; + ["Alignment of timeval"][::std::mem::align_of::() - 8usize]; + ["Offset of field: timeval::tv_sec"][::std::mem::offset_of!(timeval, tv_sec) - 0usize]; + ["Offset of field: timeval::tv_usec"][::std::mem::offset_of!(timeval, tv_usec) - 8usize]; +}; +#[repr(C)] +#[derive(Debug, Default, Copy, Clone)] +pub struct rt_metrics { + pub rmx_pksent: u_int64_t, + pub rmx_expire: i64, + pub rmx_locks: u_int, + pub rmx_mtu: u_int, + pub rmx_refcnt: u_int, + pub rmx_hopcount: u_int, + pub rmx_recvpipe: u_int, + pub rmx_sendpipe: u_int, + pub rmx_ssthresh: u_int, + pub rmx_rtt: u_int, + pub rmx_rttvar: u_int, + pub rmx_pad: u_int, +} +#[allow(clippy::unnecessary_operation, clippy::identity_op)] +const _: () = { + ["Size of rt_metrics"][::std::mem::size_of::() - 56usize]; + ["Alignment of rt_metrics"][::std::mem::align_of::() - 8usize]; + ["Offset of field: rt_metrics::rmx_pksent"] + [::std::mem::offset_of!(rt_metrics, rmx_pksent) - 0usize]; + ["Offset of field: rt_metrics::rmx_expire"] + [::std::mem::offset_of!(rt_metrics, rmx_expire) - 8usize]; + ["Offset of field: rt_metrics::rmx_locks"] + [::std::mem::offset_of!(rt_metrics, rmx_locks) - 16usize]; + ["Offset of field: rt_metrics::rmx_mtu"][::std::mem::offset_of!(rt_metrics, rmx_mtu) - 20usize]; + ["Offset of field: rt_metrics::rmx_refcnt"] + [::std::mem::offset_of!(rt_metrics, rmx_refcnt) - 24usize]; + ["Offset of field: rt_metrics::rmx_hopcount"] + [::std::mem::offset_of!(rt_metrics, rmx_hopcount) - 28usize]; + ["Offset of field: rt_metrics::rmx_recvpipe"] + [::std::mem::offset_of!(rt_metrics, rmx_recvpipe) - 32usize]; + ["Offset of field: rt_metrics::rmx_sendpipe"] + [::std::mem::offset_of!(rt_metrics, rmx_sendpipe) - 36usize]; + ["Offset of field: rt_metrics::rmx_ssthresh"] + [::std::mem::offset_of!(rt_metrics, rmx_ssthresh) - 40usize]; + ["Offset of field: rt_metrics::rmx_rtt"][::std::mem::offset_of!(rt_metrics, rmx_rtt) - 44usize]; + ["Offset of field: rt_metrics::rmx_rttvar"] + [::std::mem::offset_of!(rt_metrics, rmx_rttvar) - 48usize]; + ["Offset of field: rt_metrics::rmx_pad"][::std::mem::offset_of!(rt_metrics, rmx_pad) - 52usize]; +}; +#[repr(C)] +#[derive(Debug, Default, Copy, Clone)] +pub struct rt_msghdr { + pub rtm_msglen: u_short, + pub rtm_version: u_char, + pub rtm_type: u_char, + pub rtm_hdrlen: u_short, + pub rtm_index: u_short, + pub rtm_tableid: u_short, + pub rtm_priority: u_char, + pub rtm_mpls: u_char, + pub rtm_addrs: ::std::os::raw::c_int, + pub rtm_flags: ::std::os::raw::c_int, + pub rtm_fmask: ::std::os::raw::c_int, + pub rtm_pid: pid_t, + pub rtm_seq: ::std::os::raw::c_int, + pub rtm_errno: ::std::os::raw::c_int, + pub rtm_inits: u_int, + pub rtm_rmx: rt_metrics, +} +#[allow(clippy::unnecessary_operation, clippy::identity_op)] +const _: () = { + ["Size of rt_msghdr"][::std::mem::size_of::() - 96usize]; + ["Alignment of rt_msghdr"][::std::mem::align_of::() - 8usize]; + ["Offset of field: rt_msghdr::rtm_msglen"] + [::std::mem::offset_of!(rt_msghdr, rtm_msglen) - 0usize]; + ["Offset of field: rt_msghdr::rtm_version"] + [::std::mem::offset_of!(rt_msghdr, rtm_version) - 2usize]; + ["Offset of field: rt_msghdr::rtm_type"][::std::mem::offset_of!(rt_msghdr, rtm_type) - 3usize]; + ["Offset of field: rt_msghdr::rtm_hdrlen"] + [::std::mem::offset_of!(rt_msghdr, rtm_hdrlen) - 4usize]; + ["Offset of field: rt_msghdr::rtm_index"] + [::std::mem::offset_of!(rt_msghdr, rtm_index) - 6usize]; + ["Offset of field: rt_msghdr::rtm_tableid"] + [::std::mem::offset_of!(rt_msghdr, rtm_tableid) - 8usize]; + ["Offset of field: rt_msghdr::rtm_priority"] + [::std::mem::offset_of!(rt_msghdr, rtm_priority) - 10usize]; + ["Offset of field: rt_msghdr::rtm_mpls"][::std::mem::offset_of!(rt_msghdr, rtm_mpls) - 11usize]; + ["Offset of field: rt_msghdr::rtm_addrs"] + [::std::mem::offset_of!(rt_msghdr, rtm_addrs) - 12usize]; + ["Offset of field: rt_msghdr::rtm_flags"] + [::std::mem::offset_of!(rt_msghdr, rtm_flags) - 16usize]; + ["Offset of field: rt_msghdr::rtm_fmask"] + [::std::mem::offset_of!(rt_msghdr, rtm_fmask) - 20usize]; + ["Offset of field: rt_msghdr::rtm_pid"][::std::mem::offset_of!(rt_msghdr, rtm_pid) - 24usize]; + ["Offset of field: rt_msghdr::rtm_seq"][::std::mem::offset_of!(rt_msghdr, rtm_seq) - 28usize]; + ["Offset of field: rt_msghdr::rtm_errno"] + [::std::mem::offset_of!(rt_msghdr, rtm_errno) - 32usize]; + ["Offset of field: rt_msghdr::rtm_inits"] + [::std::mem::offset_of!(rt_msghdr, rtm_inits) - 36usize]; + ["Offset of field: rt_msghdr::rtm_rmx"][::std::mem::offset_of!(rt_msghdr, rtm_rmx) - 40usize]; +}; +#[repr(C)] +#[derive(Debug, Default, Copy, Clone)] +pub struct if_data { + pub ifi_type: u_char, + pub ifi_addrlen: u_char, + pub ifi_hdrlen: u_char, + pub ifi_link_state: u_char, + pub ifi_mtu: u_int32_t, + pub ifi_metric: u_int32_t, + pub ifi_rdomain: u_int32_t, + pub ifi_baudrate: u_int64_t, + pub ifi_ipackets: u_int64_t, + pub ifi_ierrors: u_int64_t, + pub ifi_opackets: u_int64_t, + pub ifi_oerrors: u_int64_t, + pub ifi_collisions: u_int64_t, + pub ifi_ibytes: u_int64_t, + pub ifi_obytes: u_int64_t, + pub ifi_imcasts: u_int64_t, + pub ifi_omcasts: u_int64_t, + pub ifi_iqdrops: u_int64_t, + pub ifi_oqdrops: u_int64_t, + pub ifi_noproto: u_int64_t, + pub ifi_capabilities: u_int32_t, + pub __bindgen_padding_0: [u8; 4usize], + pub ifi_lastchange: timeval, +} +#[allow(clippy::unnecessary_operation, clippy::identity_op)] +const _: () = { + ["Size of if_data"][::std::mem::size_of::() - 144usize]; + ["Alignment of if_data"][::std::mem::align_of::() - 8usize]; + ["Offset of field: if_data::ifi_type"][::std::mem::offset_of!(if_data, ifi_type) - 0usize]; + ["Offset of field: if_data::ifi_addrlen"] + [::std::mem::offset_of!(if_data, ifi_addrlen) - 1usize]; + ["Offset of field: if_data::ifi_hdrlen"][::std::mem::offset_of!(if_data, ifi_hdrlen) - 2usize]; + ["Offset of field: if_data::ifi_link_state"] + [::std::mem::offset_of!(if_data, ifi_link_state) - 3usize]; + ["Offset of field: if_data::ifi_mtu"][::std::mem::offset_of!(if_data, ifi_mtu) - 4usize]; + ["Offset of field: if_data::ifi_metric"][::std::mem::offset_of!(if_data, ifi_metric) - 8usize]; + ["Offset of field: if_data::ifi_rdomain"] + [::std::mem::offset_of!(if_data, ifi_rdomain) - 12usize]; + ["Offset of field: if_data::ifi_baudrate"] + [::std::mem::offset_of!(if_data, ifi_baudrate) - 16usize]; + ["Offset of field: if_data::ifi_ipackets"] + [::std::mem::offset_of!(if_data, ifi_ipackets) - 24usize]; + ["Offset of field: if_data::ifi_ierrors"] + [::std::mem::offset_of!(if_data, ifi_ierrors) - 32usize]; + ["Offset of field: if_data::ifi_opackets"] + [::std::mem::offset_of!(if_data, ifi_opackets) - 40usize]; + ["Offset of field: if_data::ifi_oerrors"] + [::std::mem::offset_of!(if_data, ifi_oerrors) - 48usize]; + ["Offset of field: if_data::ifi_collisions"] + [::std::mem::offset_of!(if_data, ifi_collisions) - 56usize]; + ["Offset of field: if_data::ifi_ibytes"][::std::mem::offset_of!(if_data, ifi_ibytes) - 64usize]; + ["Offset of field: if_data::ifi_obytes"][::std::mem::offset_of!(if_data, ifi_obytes) - 72usize]; + ["Offset of field: if_data::ifi_imcasts"] + [::std::mem::offset_of!(if_data, ifi_imcasts) - 80usize]; + ["Offset of field: if_data::ifi_omcasts"] + [::std::mem::offset_of!(if_data, ifi_omcasts) - 88usize]; + ["Offset of field: if_data::ifi_iqdrops"] + [::std::mem::offset_of!(if_data, ifi_iqdrops) - 96usize]; + ["Offset of field: if_data::ifi_oqdrops"] + [::std::mem::offset_of!(if_data, ifi_oqdrops) - 104usize]; + ["Offset of field: if_data::ifi_noproto"] + [::std::mem::offset_of!(if_data, ifi_noproto) - 112usize]; + ["Offset of field: if_data::ifi_capabilities"] + [::std::mem::offset_of!(if_data, ifi_capabilities) - 120usize]; + ["Offset of field: if_data::ifi_lastchange"] + [::std::mem::offset_of!(if_data, ifi_lastchange) - 128usize]; +}; diff --git a/mtu/src/bindings/solaris.rs b/mtu/src/bindings/solaris.rs new file mode 100644 index 0000000000..ac8083f4f3 --- /dev/null +++ b/mtu/src/bindings/solaris.rs @@ -0,0 +1,161 @@ +/* automatically generated by rust-bindgen 0.72.1 */ + +pub const RTM_VERSION: u32 = 3; +pub const RTM_GET: u32 = 4; +pub const RTA_DST: u32 = 1; +pub const RTA_IFP: u32 = 16; +pub const RTAX_MAX: u32 = 9; +pub type uchar_t = ::std::os::raw::c_uchar; +pub type ushort_t = ::std::os::raw::c_ushort; +pub type uint_t = ::std::os::raw::c_uint; +pub type pid_t = ::std::os::raw::c_int; +pub type time32_t = i32; +#[repr(C)] +#[derive(Debug, Default, Copy, Clone)] +pub struct timeval32 { + pub tv_sec: time32_t, + pub tv_usec: i32, +} +#[allow(clippy::unnecessary_operation, clippy::identity_op)] +const _: () = { + ["Size of timeval32"][::std::mem::size_of::() - 8usize]; + ["Alignment of timeval32"][::std::mem::align_of::() - 4usize]; + ["Offset of field: timeval32::tv_sec"][::std::mem::offset_of!(timeval32, tv_sec) - 0usize]; + ["Offset of field: timeval32::tv_usec"][::std::mem::offset_of!(timeval32, tv_usec) - 4usize]; +}; +#[repr(C)] +#[derive(Debug, Default, Copy, Clone)] +pub struct rt_metrics { + pub rmx_locks: u32, + pub rmx_mtu: u32, + pub rmx_hopcount: u32, + pub rmx_expire: u32, + pub rmx_recvpipe: u32, + pub rmx_sendpipe: u32, + pub rmx_ssthresh: u32, + pub rmx_rtt: u32, + pub rmx_rttvar: u32, + pub rmx_pksent: u32, +} +#[allow(clippy::unnecessary_operation, clippy::identity_op)] +const _: () = { + ["Size of rt_metrics"][::std::mem::size_of::() - 40usize]; + ["Alignment of rt_metrics"][::std::mem::align_of::() - 4usize]; + ["Offset of field: rt_metrics::rmx_locks"] + [::std::mem::offset_of!(rt_metrics, rmx_locks) - 0usize]; + ["Offset of field: rt_metrics::rmx_mtu"][::std::mem::offset_of!(rt_metrics, rmx_mtu) - 4usize]; + ["Offset of field: rt_metrics::rmx_hopcount"] + [::std::mem::offset_of!(rt_metrics, rmx_hopcount) - 8usize]; + ["Offset of field: rt_metrics::rmx_expire"] + [::std::mem::offset_of!(rt_metrics, rmx_expire) - 12usize]; + ["Offset of field: rt_metrics::rmx_recvpipe"] + [::std::mem::offset_of!(rt_metrics, rmx_recvpipe) - 16usize]; + ["Offset of field: rt_metrics::rmx_sendpipe"] + [::std::mem::offset_of!(rt_metrics, rmx_sendpipe) - 20usize]; + ["Offset of field: rt_metrics::rmx_ssthresh"] + [::std::mem::offset_of!(rt_metrics, rmx_ssthresh) - 24usize]; + ["Offset of field: rt_metrics::rmx_rtt"][::std::mem::offset_of!(rt_metrics, rmx_rtt) - 28usize]; + ["Offset of field: rt_metrics::rmx_rttvar"] + [::std::mem::offset_of!(rt_metrics, rmx_rttvar) - 32usize]; + ["Offset of field: rt_metrics::rmx_pksent"] + [::std::mem::offset_of!(rt_metrics, rmx_pksent) - 36usize]; +}; +#[repr(C)] +#[derive(Debug, Default, Copy, Clone)] +pub struct rt_msghdr { + pub rtm_msglen: ushort_t, + pub rtm_version: uchar_t, + pub rtm_type: uchar_t, + pub rtm_index: ushort_t, + pub __bindgen_padding_0: [u8; 2usize], + pub rtm_flags: ::std::os::raw::c_int, + pub rtm_addrs: ::std::os::raw::c_int, + pub rtm_pid: pid_t, + pub rtm_seq: ::std::os::raw::c_int, + pub rtm_errno: ::std::os::raw::c_int, + pub rtm_use: ::std::os::raw::c_int, + pub rtm_inits: uint_t, + pub rtm_rmx: rt_metrics, +} +#[allow(clippy::unnecessary_operation, clippy::identity_op)] +const _: () = { + ["Size of rt_msghdr"][::std::mem::size_of::() - 76usize]; + ["Alignment of rt_msghdr"][::std::mem::align_of::() - 4usize]; + ["Offset of field: rt_msghdr::rtm_msglen"] + [::std::mem::offset_of!(rt_msghdr, rtm_msglen) - 0usize]; + ["Offset of field: rt_msghdr::rtm_version"] + [::std::mem::offset_of!(rt_msghdr, rtm_version) - 2usize]; + ["Offset of field: rt_msghdr::rtm_type"][::std::mem::offset_of!(rt_msghdr, rtm_type) - 3usize]; + ["Offset of field: rt_msghdr::rtm_index"] + [::std::mem::offset_of!(rt_msghdr, rtm_index) - 4usize]; + ["Offset of field: rt_msghdr::rtm_flags"] + [::std::mem::offset_of!(rt_msghdr, rtm_flags) - 8usize]; + ["Offset of field: rt_msghdr::rtm_addrs"] + [::std::mem::offset_of!(rt_msghdr, rtm_addrs) - 12usize]; + ["Offset of field: rt_msghdr::rtm_pid"][::std::mem::offset_of!(rt_msghdr, rtm_pid) - 16usize]; + ["Offset of field: rt_msghdr::rtm_seq"][::std::mem::offset_of!(rt_msghdr, rtm_seq) - 20usize]; + ["Offset of field: rt_msghdr::rtm_errno"] + [::std::mem::offset_of!(rt_msghdr, rtm_errno) - 24usize]; + ["Offset of field: rt_msghdr::rtm_use"][::std::mem::offset_of!(rt_msghdr, rtm_use) - 28usize]; + ["Offset of field: rt_msghdr::rtm_inits"] + [::std::mem::offset_of!(rt_msghdr, rtm_inits) - 32usize]; + ["Offset of field: rt_msghdr::rtm_rmx"][::std::mem::offset_of!(rt_msghdr, rtm_rmx) - 36usize]; +}; +#[repr(C)] +#[derive(Debug, Default, Copy, Clone)] +pub struct if_data { + pub ifi_type: uchar_t, + pub ifi_addrlen: uchar_t, + pub ifi_hdrlen: uchar_t, + pub __bindgen_padding_0: u8, + pub ifi_mtu: uint_t, + pub ifi_metric: uint_t, + pub ifi_baudrate: uint_t, + pub ifi_ipackets: uint_t, + pub ifi_ierrors: uint_t, + pub ifi_opackets: uint_t, + pub ifi_oerrors: uint_t, + pub ifi_collisions: uint_t, + pub ifi_ibytes: uint_t, + pub ifi_obytes: uint_t, + pub ifi_imcasts: uint_t, + pub ifi_omcasts: uint_t, + pub ifi_iqdrops: uint_t, + pub ifi_noproto: uint_t, + pub ifi_lastchange: timeval32, +} +#[allow(clippy::unnecessary_operation, clippy::identity_op)] +const _: () = { + ["Size of if_data"][::std::mem::size_of::() - 68usize]; + ["Alignment of if_data"][::std::mem::align_of::() - 4usize]; + ["Offset of field: if_data::ifi_type"][::std::mem::offset_of!(if_data, ifi_type) - 0usize]; + ["Offset of field: if_data::ifi_addrlen"] + [::std::mem::offset_of!(if_data, ifi_addrlen) - 1usize]; + ["Offset of field: if_data::ifi_hdrlen"][::std::mem::offset_of!(if_data, ifi_hdrlen) - 2usize]; + ["Offset of field: if_data::ifi_mtu"][::std::mem::offset_of!(if_data, ifi_mtu) - 4usize]; + ["Offset of field: if_data::ifi_metric"][::std::mem::offset_of!(if_data, ifi_metric) - 8usize]; + ["Offset of field: if_data::ifi_baudrate"] + [::std::mem::offset_of!(if_data, ifi_baudrate) - 12usize]; + ["Offset of field: if_data::ifi_ipackets"] + [::std::mem::offset_of!(if_data, ifi_ipackets) - 16usize]; + ["Offset of field: if_data::ifi_ierrors"] + [::std::mem::offset_of!(if_data, ifi_ierrors) - 20usize]; + ["Offset of field: if_data::ifi_opackets"] + [::std::mem::offset_of!(if_data, ifi_opackets) - 24usize]; + ["Offset of field: if_data::ifi_oerrors"] + [::std::mem::offset_of!(if_data, ifi_oerrors) - 28usize]; + ["Offset of field: if_data::ifi_collisions"] + [::std::mem::offset_of!(if_data, ifi_collisions) - 32usize]; + ["Offset of field: if_data::ifi_ibytes"][::std::mem::offset_of!(if_data, ifi_ibytes) - 36usize]; + ["Offset of field: if_data::ifi_obytes"][::std::mem::offset_of!(if_data, ifi_obytes) - 40usize]; + ["Offset of field: if_data::ifi_imcasts"] + [::std::mem::offset_of!(if_data, ifi_imcasts) - 44usize]; + ["Offset of field: if_data::ifi_omcasts"] + [::std::mem::offset_of!(if_data, ifi_omcasts) - 48usize]; + ["Offset of field: if_data::ifi_iqdrops"] + [::std::mem::offset_of!(if_data, ifi_iqdrops) - 52usize]; + ["Offset of field: if_data::ifi_noproto"] + [::std::mem::offset_of!(if_data, ifi_noproto) - 56usize]; + ["Offset of field: if_data::ifi_lastchange"] + [::std::mem::offset_of!(if_data, ifi_lastchange) - 60usize]; +}; diff --git a/mtu/src/bsd.rs b/mtu/src/bsd.rs index 0ba2c7c67a..be153991fc 100644 --- a/mtu/src/bsd.rs +++ b/mtu/src/bsd.rs @@ -20,20 +20,23 @@ use libc::{ }; use static_assertions::{const_assert, const_assert_eq}; -#[allow( +#[cfg_attr( + not(target_os = "netbsd"), + expect(dead_code, reason = "auto-generated by bindgen") +)] +#[expect( + non_camel_case_types, clippy::allow_attributes, clippy::allow_attributes_without_reason, - non_camel_case_types, - non_snake_case, clippy::struct_field_names, - clippy::too_many_lines, - clippy::cognitive_complexity, - dead_code, // RTA_IFP is only used on NetBSD and Solaris - reason = "Bindgen-generated code" + reason = "auto-generated by bindgen" )] -mod bindings { - include!(env!("BINDINGS")); -} +#[cfg_attr(target_os = "macos", path = "bindings/macos.rs")] +#[cfg_attr(target_os = "freebsd", path = "bindings/freebsd.rs")] +#[cfg_attr(target_os = "netbsd", path = "bindings/netbsd.rs")] +#[cfg_attr(target_os = "openbsd", path = "bindings/openbsd.rs")] +#[cfg_attr(target_os = "solaris", path = "bindings/solaris.rs")] +mod bindings; #[cfg(any(target_os = "netbsd", target_os = "solaris"))] use crate::bsd::bindings::RTA_IFP; diff --git a/mtu/src/linux.rs b/mtu/src/linux.rs index 0cc2095fa1..c691a9fb39 100644 --- a/mtu/src/linux.rs +++ b/mtu/src/linux.rs @@ -21,17 +21,19 @@ use static_assertions::{const_assert, const_assert_eq}; use crate::{aligned_by, default_err, routesocket::RouteSocket, unlikely_err}; -#[allow( +#[allow(dead_code, reason = "auto-generated by bindgen")] +#[expect( + non_camel_case_types, clippy::allow_attributes, clippy::allow_attributes_without_reason, clippy::struct_field_names, - non_camel_case_types, - clippy::too_many_lines, - reason = "Bindgen-generated code" + reason = "auto-generated by bindgen" )] -mod bindings { - include!(env!("BINDINGS")); -} +#[cfg_attr( + any(target_os = "linux", target_os = "android"), + path = "bindings/linux.rs" +)] +mod bindings; use bindings::{ifinfomsg, nlmsghdr, rtattr, rtmsg};