| Crates.io | getifs |
| lib.rs | getifs |
| version | 0.4.0 |
| created_at | 2025-01-12 16:08:50.538878+00 |
| updated_at | 2025-11-03 22:42:47.922049+00 |
| description | A high-performance, cross-platform Rust library providing comprehensive network interface information without relying on libc's `getifaddrs`. Get interfaces, multicast addresses, local/private/public IP addresses, MTU, and gateway information with minimal overhead. |
| homepage | https://github.com/al8n/getifs |
| repository | https://github.com/al8n/getifs |
| max_upload_size | |
| id | 1513377 |
| size | 270,570 |
A high-performance, cross-platform Rust library providing comprehensive network interface information without relying on libc's getifaddrs. Get interfaces, multicast addresses, local/private/public IP addresses, MTU, and gateway information with minimal overhead.
A high-performance, cross-platform Rust library providing comprehensive network interface information without relying on libc's getifaddrs. Get interfaces, multicast addresses, local/private/public IP addresses, MTU, and gateway information with minimal overhead.
[dependencies]
getifs = "0.4"
use getifs::{interfaces, local_addrs, gateway_addrs};
// Get all network interfaces
let interfaces = interfaces().unwrap();
for interface in interfaces {
println!("Interface: {} (index: {})", interface.name(), interface.index());
println!(" MTU: {}", interface.mtu());
println!(" Flags: {:?}", interface.flags());
}
// Get local IP addresses
let local_ips = local_addrs().unwrap();
for ip in local_ips {
println!("Local IP: {}", ip);
}
// Get gateway addresses
let gateways = gateway_addrs().unwrap();
for gateway in gateways {
println!("Gateway: {}", gateway);
}
| OS | Approach |
|---|---|
Linux (no libc) |
socket(AF_NETLINK, SOCK_RAW | SOCK_CLOEXEC, NETLINK_ROUTE) |
| BSD-like | sysctl |
| Windows | GetAdaptersAddresses |
getifs?Existing network interface crates have limitations:
libc::getifaddrs, which is slowergetifs addresses these by:
SmallVec and SmolStrAll benchmarks are run with Criterion.rs on GitHub Actions. Lower is better.
Note: Automated benchmarks run on Linux, macOS, and Windows via GitHub Actions. View the latest results in the Actions tab or see benchmark documentation for more details.
| Platform | Best Operation | getifs |
Alternative | Speedup |
|---|---|---|---|---|
| macOS (ARM64) | Get interface by index | 2.6 μs | 188.4 μs | 73x faster |
| macOS (ARM64) | List all interfaces | 8.5 μs | 180.4 μs | 21x faster |
| Linux (x64) | List all interfaces | 35.2 μs | 98.1 μs | 2.8x faster |
| Windows (x64) | Gateway IPv4 | 29.9 μs | N/A | Unique feature |
macOS (GitHub Actions ARM64)
| Operation | getifs |
Alternative | Speedup |
|---|---|---|---|
| List all interfaces | 8.5 μs | 180.4 μs (network-interface) |
21x faster |
| Get interface by index | 2.6 μs | 188.4 μs (network-interface) |
73x faster |
| Get interface by name | 11.6 μs | 188.3 μs (network-interface) |
16x faster |
| Get interface addresses | 8.5 μs | - | - |
| Get multicast addresses | 4.6 μs | - | - |
Linux (GitHub Actions x64)
| Operation | getifs |
Alternative | Speedup |
|---|---|---|---|
| List all interfaces | 35.2 μs | 98.1 μs (network-interface) |
2.8x faster |
| Get interface by index | 35.0 μs | 98.5 μs (network-interface) |
2.8x faster |
| Get interface by name | 40.8 μs | 98.4 μs (network-interface) |
2.4x faster |
| Get interface addresses | 16.4 μs | - | - |
| Get multicast addresses | 31.5 μs | - | - |
Windows (GitHub Actions x64)
| Operation | getifs |
Alternative | Notes |
|---|---|---|---|
| List all interfaces | 986 μs | 979 μs (network-interface) |
Similar performance |
| Get interface by index | 977 μs | 984 μs (network-interface) |
Similar performance |
| Get interface by name | 1025 μs | 979 μs (network-interface) |
Similar performance |
Note: Windows API (GetAdaptersAddresses) has inherent overhead causing all operations to be ~1ms regardless of implementation.
macOS (GitHub Actions ARM64)
| Operation | getifs |
Alternative | Speedup |
|---|---|---|---|
| Get local IPv4 address | 6.1 μs | 10.0 μs (local-ip-address) |
1.6x faster |
| Get local IPv6 address | 7.6 μs | 9.9 μs (local-ip-address) |
1.3x faster |
Linux (GitHub Actions x64)
| Operation | getifs |
Alternative | Notes |
|---|---|---|---|
| Get local IPv4 address | 13.7 μs | 12.2 μs (local-ip-address) |
Comparable |
| Get local IPv6 address | 11.4 μs | - | No IPv6 result from alternative |
Windows (GitHub Actions x64)
| Operation | getifs |
Alternative | Notes |
|---|---|---|---|
| Get local IPv4 address | 980 μs | 926 μs (local-ip-address) |
Similar (~1ms) |
| Get local IPv6 address | 983 μs | 983 μs (local-ip-address) |
Similar (~1ms) |
| Platform | IPv4 Gateways | IPv6 Gateways | All Gateways |
|---|---|---|---|
| macOS (ARM64) | 19.6 μs | 3.0 μs | 22.8 μs |
| Linux (x64) | 18.1 μs | 14.5 μs | 22.4 μs |
| Windows (x64) | 29.9 μs | 18.0 μs | 48.2 μs |
Note: No direct alternatives available for gateway discovery.
Why is getifs faster?
SmallVec and SmolStr to avoid heap allocations for common casesPlatform Performance Notes:
GetAdaptersAddresses API overhead (~1ms baseline for all implementations)iprobe: Probe if the host system supports IPv4, IPv6 and IPv4-mapped-IPv6.iprfc: Known RFCs for IP addresses.interface.go and HashiCorp's go-sockaddr.getifs is under the terms of both the MIT license and the
Apache License (Version 2.0).
See LICENSE-APACHE, LICENSE-MIT for details.
Copyright (c) 2025 Al Liu.