Skip to content
This repository was archived by the owner on Sep 2, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
59 commits
Select commit Hold shift + click to select a range
444481f
feat: Android support
larseggert Mar 2, 2025
12333dd
Fix
larseggert Mar 2, 2025
aec78c0
Debug
larseggert Mar 2, 2025
cf94ab2
Again
larseggert Mar 2, 2025
565a913
Again
larseggert Mar 2, 2025
8ed11fc
Again
larseggert Mar 2, 2025
ded33c5
Again
larseggert Mar 2, 2025
9c759e4
Again
larseggert Mar 2, 2025
a1bcef7
Again
larseggert Mar 2, 2025
c466428
Again
larseggert Mar 2, 2025
0a4a52a
Again
larseggert Mar 2, 2025
3a836e9
Again
larseggert Mar 2, 2025
b5d0954
Again
larseggert Mar 2, 2025
738dff5
Again
larseggert Mar 2, 2025
265ac63
Again
larseggert Mar 2, 2025
490a120
Again
larseggert Mar 2, 2025
7fa9d9c
Again
larseggert Mar 3, 2025
130d83d
Again
larseggert Mar 3, 2025
8781184
Again
larseggert Mar 3, 2025
f03af66
Again
larseggert Mar 3, 2025
7cc6444
Again
larseggert Mar 3, 2025
6610302
Again
larseggert Mar 3, 2025
71bb09f
Merge branch 'main' into ci-android
larseggert Mar 3, 2025
f489da7
Bump version
larseggert Mar 3, 2025
4e17975
Merge branch 'ci-android' of github.com:mozilla/mtu into ci-android
larseggert Mar 3, 2025
0bc74e8
Again
larseggert Mar 3, 2025
95b503b
Merge branch 'main' into ci-android
larseggert Mar 3, 2025
56b4bf2
armv7
larseggert Mar 5, 2025
29dee76
armv7-linux-androideabi
larseggert Mar 5, 2025
99b1118
Again
larseggert Mar 5, 2025
c4ef55c
Again
larseggert Mar 5, 2025
5e899b2
More
larseggert Mar 5, 2025
8565ab5
ifconfig
larseggert Mar 5, 2025
29ef61a
Again
larseggert Mar 5, 2025
b2759a0
Debug
larseggert Mar 5, 2025
7729735
Again
larseggert Mar 5, 2025
e527514
Again
larseggert Mar 5, 2025
9d47a94
Again
larseggert Mar 5, 2025
4326be0
printf
larseggert Mar 5, 2025
63b165a
tr
larseggert Mar 5, 2025
44e6753
Again
larseggert Mar 5, 2025
0056370
Again
larseggert Mar 5, 2025
1e58803
Test
larseggert Mar 5, 2025
fe47c1a
Again
larseggert Mar 5, 2025
536820c
Again
larseggert Mar 5, 2025
937c7f3
Again
larseggert Mar 5, 2025
4d398b5
Again
larseggert Mar 5, 2025
e4616b0
Again
larseggert Mar 5, 2025
68e0301
output
larseggert Mar 5, 2025
a86a9a1
Fix test
larseggert Mar 5, 2025
3ef465f
Debug
larseggert Mar 5, 2025
c686cc6
test
larseggert Mar 5, 2025
76d56c2
condition
larseggert Mar 5, 2025
7219add
Again
larseggert Mar 5, 2025
5b86b45
Fix
larseggert Mar 5, 2025
f7fb2b3
Finalize
larseggert Mar 5, 2025
84a65c3
Merge branch 'main' into ci-android
larseggert Mar 10, 2025
0ce0c8b
Merge branch 'main' into ci-android
larseggert Mar 10, 2025
2fffd9b
MSRV
larseggert Mar 10, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
86 changes: 86 additions & 0 deletions .github/workflows/check.yml
Original file line number Diff line number Diff line change
Expand Up @@ -408,3 +408,89 @@ jobs:
with:
token: ${{ secrets.GITHUB_TOKEN }}
- run: cargo update -w --locked

check-android:
runs-on: ubuntu-latest
env:
# https://searchfox.org/mozilla-central/search?q=NDK_VERSION =&path=python/mozboot/mozboot/android.py
NDK_VERSION: 27.2.12479018 # r27c
# https://searchfox.org/mozilla-central/search?q=\bapi_level=&path=taskcluster/scripts/misc/build-llvm-common.sh&regexp=true
API_LEVEL: 21

strategy:
matrix:
include:
- target: x86_64-linux-android
emulator-arch: x86_64
# Note that x86_64 image is only available for API 21+. See
# https://github.com/ReactiveCircus/android-emulator-runner?tab=readme-ov-file#configurations.
- target: i686-linux-android
emulator-arch: x86
# FIXME: https://github.com/ReactiveCircus/android-emulator-runner/issues/404
# - target: armv7-linux-androideabi
# emulator-arch: arm64-v8

steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
persist-credentials: false

- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
repository: mozilla/neqo
sparse-checkout: |
.github/actions/rust
path: neqo
persist-credentials: false

- uses: actions/setup-java@3a4f6e1af504cf6a31855fa899c6aa5355ba6c12 # v4.7.0
with:
distribution: zulu
java-version: 23

- uses: android-actions/setup-android@9fc6c4e9069bf8d3d10b2204b1fb8f6ef7065407 # v3.2.2
- run: sdkmanager --install "ndk;${{ env.NDK_VERSION }}"

- uses: ./neqo/.github/actions/rust
with:
version: stable
targets: ${{ matrix.target }}
tools: cargo-ndk
token: ${{ secrets.GITHUB_TOKEN }}

- run: cargo ndk -t ${{ matrix.target }} test --no-run

- env:
TARGET: ${{ matrix.target }}
run: |
echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules
sudo udevadm control --reload-rules
sudo udevadm trigger --name-match=kvm
cat <<'EOF' > /tmp/rust-android-run-tests-on-emulator.sh
#!/bin/bash
set -e
adb shell ip addr show
export GITHUB_ACTIONS=1
adb wait-for-device
while [ -z "$(adb shell getprop sys.boot_completed | tr -d '\r')" ]; do sleep 1; done
any_failures=0
for test in $(find target/$TARGET/debug/deps/ -type f -executable ! -name "*.so" -name "*-*"); do
adb push "$test" /data/local/tmp/
adb shell chmod +x /data/local/tmp/$(basename "$test")
# See https://unix.stackexchange.com/a/451140/409256
adb shell "API_LEVEL=$API_LEVEL /data/local/tmp/$(basename "$test") || echo _FAIL_" 2>&1 | tee output
grep _FAIL_ output && any_failures=1
done
exit $any_failures
EOF
chmod a+x /tmp/rust-android-run-tests-on-emulator.sh

- uses: reactivecircus/android-emulator-runner@62dbb605bba737720e10b196cb4220d374026a6d # v2.33.0
with:
api-level: ${{ env.API_LEVEL }}
arch: ${{ matrix.emulator-arch == 'arm64-v8' && 'arm64-v8a' || matrix.emulator-arch }}
ndk: ${{ env.NDK_VERSION }}
emulator-boot-timeout: 120
script: /tmp/rust-android-run-tests-on-emulator.sh
env:
TARGET: ${{ matrix.target }}
2 changes: 1 addition & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ homepage = "https://github.com/mozilla/mtu/"
repository = "https://github.com/mozilla/mtu/"
authors = ["The Mozilla Necko Team <necko@mozilla.com>"]
readme = "README.md"
version = "0.2.6"
version = "0.2.7"
edition = "2021"
license = "MIT OR Apache-2.0"
# Don't increase beyond what Firefox is currently using:
Expand Down Expand Up @@ -77,7 +77,7 @@ infinite_loop = "warn"
large_include_file = "warn"
let_underscore_must_use = "warn"
let_underscore_untyped = "warn"
literal_string_with_formatting_args = "allow" # FIXME: Re-enable "warn" when MRSV is > 1.87. See https://github.com/rust-lang/rust-clippy/pull/13953#issuecomment-2676336899
literal_string_with_formatting_args = "allow" # FIXME: Re-enable "warn" when MSRV is > 1.87. See https://github.com/rust-lang/rust-clippy/pull/13953#issuecomment-2676336899
lossy_float_literal = "warn"
mem_forget = "warn"
mixed_read_write_in_expression = "warn"
Expand Down
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ This crate exports a single function `interface_and_mtu` that returns the name a
of the outgoing network interface towards a remote destination identified by an `IpAddr`.

## Example

```rust
let destination = IpAddr::V4(Ipv4Addr::LOCALHOST);
let (name, mtu): (String, usize) = mtu::interface_and_mtu(destination).unwrap();
Expand All @@ -24,6 +25,7 @@ println!("MTU towards {destination} is {mtu} on {name}");
## Supported Platforms

* Linux
* Android
* macOS
* Windows
* FreeBSD
Expand Down
15 changes: 11 additions & 4 deletions build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ use std::env;
const BINDINGS: &str = "bindings.rs";

#[cfg(feature = "gecko")]
fn clang_args() -> Vec<String> {
fn clang_args(_target_os: &str) -> Vec<String> {
use mozbuild::{config::BINDGEN_SYSTEM_FLAGS, TOPOBJDIR};

let mut flags: Vec<String> = BINDGEN_SYSTEM_FLAGS.iter().map(|s| s.to_string()).collect();
Expand All @@ -30,8 +30,15 @@ fn clang_args() -> Vec<String> {
}

#[cfg(not(feature = "gecko"))]
const fn clang_args() -> Vec<String> {
Vec::new()
fn clang_args(target_os: &str) -> Vec<String> {
match target_os {
"android" => {
let sysroot =
env::var("CARGO_NDK_SYSROOT_PATH").expect("CARGO_NDK_SYSROOT_PATH was not set");
vec![format!("--sysroot={sysroot}")]
}
_ => Vec::new(),
}
}

fn bindgen() {
Expand Down Expand Up @@ -65,7 +72,7 @@ fn bindgen() {
};

let bindings = bindings
.clang_args(clang_args())
.clang_args(clang_args(&target_os))
// Tell cargo to invalidate the built crate whenever any of the
// included header files changed.
.parse_callbacks(Box::new(bindgen::CargoCallbacks::new()))
Expand Down
47 changes: 30 additions & 17 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
//! of the outgoing network interface towards a remote destination identified by an `IpAddr`.
//!
//! # Example
//!
//! ```
//! # use std::net::{IpAddr, Ipv4Addr};
//! let destination = IpAddr::V4(Ipv4Addr::LOCALHOST);
Expand All @@ -24,6 +25,7 @@
//! # Supported Platforms
//!
//! * Linux
//! * Android
//! * macOS
//! * Windows
//! * FreeBSD
Expand Down Expand Up @@ -144,25 +146,36 @@ mod test {
}
}

#[cfg(any(target_os = "macos", target_os = "freebsd",))]
const LOOPBACK: &[NameMtu] = &[NameMtu(Some("lo0"), 16_384), NameMtu(Some("lo0"), 16_384)];
#[cfg(any(target_os = "linux", target_os = "android"))]
const LOOPBACK: &[NameMtu] = &[NameMtu(Some("lo"), 65_536), NameMtu(Some("lo"), 65_536)];
#[cfg(target_os = "windows")]
const LOOPBACK: &[NameMtu] = &[
NameMtu(Some("loopback_0"), 4_294_967_295),
NameMtu(Some("loopback_0"), 4_294_967_295),
];
#[cfg(target_os = "openbsd")]
const LOOPBACK: &[NameMtu] = &[NameMtu(Some("lo0"), 32_768), NameMtu(Some("lo0"), 32_768)];
#[cfg(target_os = "netbsd")]
const LOOPBACK: &[NameMtu] = &[NameMtu(Some("lo0"), 33_624), NameMtu(Some("lo0"), 33_624)];
#[cfg(target_os = "solaris")]
// Note: Different loopback MTUs for IPv4 and IPv6?!
const LOOPBACK: &[NameMtu] = &[NameMtu(Some("lo0"), 8_232), NameMtu(Some("lo0"), 8_252)];
const LOOPBACK: [NameMtu; 2] = // [IPv4, IPv6]
if cfg!(any(target_os = "macos", target_os = "freebsd")) {
[NameMtu(Some("lo0"), 16_384), NameMtu(Some("lo0"), 16_384)]
} else if cfg!(any(target_os = "linux", target_os = "android")) {
[NameMtu(Some("lo"), 65_536), NameMtu(Some("lo"), 65_536)]
} else if cfg!(target_os = "windows") {
[
NameMtu(Some("loopback_0"), 4_294_967_295),
NameMtu(Some("loopback_0"), 4_294_967_295),
]
} else if cfg!(target_os = "openbsd") {
[NameMtu(Some("lo0"), 32_768), NameMtu(Some("lo0"), 32_768)]
} else if cfg!(target_os = "netbsd") {
[NameMtu(Some("lo0"), 33_624), NameMtu(Some("lo0"), 33_624)]
} else if cfg!(target_os = "solaris") {
// Note: Different loopback MTUs for IPv4 and IPv6?!
[NameMtu(Some("lo0"), 8_232), NameMtu(Some("lo0"), 8_252)]
} else {
unreachable!();
};

// Non-loopback interface names are unpredictable, so we only check the MTU.
const INET: NameMtu = NameMtu(None, 1_500);
const INET: NameMtu = NameMtu(
None,
if cfg!(target_os = "android") {
1_440 // At least inside the Android emulator we use in CI.
} else {
1_500
},
);

#[test]
fn loopback_v4() {
Expand Down