Expand description
GetIfs
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.
§Introduction
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.
§Installation
[dependencies]
getifs = "0.4"§Features
- Zero libc dependency on Linux (uses netlink directly)
- MTU information - Get interface MTU values
- Multicast addresses - Fetch multicast group memberships
- Gateway discovery - Find IPv4 and IPv6 gateway addresses
- RFC-based filtering - Filter addresses by RFC classification
- High performance - Up to 73x faster than alternatives on macOS (see benchmarks)
- Cross-platform - Linux, macOS, BSD, Windows support
§Quick Start
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);
}§Examples
- Fetching all interfaces: examples/interfaces.rs
- Fetching all interface addresses (excluding multicast addrs): examples/addrs.rs
- Fetching all interface multicast addresses: examples/multicast_addrs.rs
- Fetching gateway addresses: examples/gateway.rs
- Fetching local ip addresses: examples/local_ip_addrs.rs
- Fetching ip addresses by RFC: examples/filter_by_rfc.rs
§Details
| OS | Approach |
|---|---|
Linux (no libc) | socket(AF_NETLINK, SOCK_RAW | SOCK_CLOEXEC, NETLINK_ROUTE) |
| BSD-like | sysctl |
| Windows | GetAdaptersAddresses |
§Why getifs?
Existing network interface crates have limitations:
- Missing features: Most don’t support MTU or multicast addresses
- Performance overhead: Nearly all use
libc::getifaddrs, which is slower - Unnecessary allocations: Heavy use of heap allocations for simple queries
getifs addresses these by:
- Using platform-native APIs directly (netlink, sysctl, GetAdaptersAddresses)
- Minimizing allocations with
SmallVecandSmolStr - Providing comprehensive interface information including MTU and multicast support
- Achieving significantly better performance than alternatives:
- Up to 73x faster on macOS (interface_by_index)
- Up to 21x faster on macOS (list interfaces)
- 2-3x faster on Linux
- Comparable performance on Windows (Windows API overhead dominates)
§Roadmap
- Support fetching routing tables
§Benchmarks
All 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.
§Performance Summary
| 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 |
§Detailed Results
§Interface Operations
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.
§Local IP Address Operations
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) |
§Gateway Operations
| 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?
- Direct system calls: Uses platform-native APIs (netlink on Linux, sysctl on BSD/macOS, GetAdaptersAddresses on Windows)
- Zero-copy parsing: Minimal allocations and efficient buffer reuse
- No libc dependency on Linux: Direct netlink socket communication
- Optimized data structures: Uses
SmallVecandSmolStrto avoid heap allocations for common cases
Platform Performance Notes:
- macOS: Shows the largest speedups (16-73x) due to efficient sysctl implementation
- Linux: Moderate speedups (2-3x) from direct netlink communication vs libc
- Windows: Similar performance to alternatives due to
GetAdaptersAddressesAPI overhead (~1ms baseline for all implementations)
§Sister crates
iprobe: Probe if the host system supports IPv4, IPv6 and IPv4-mapped-IPv6.iprfc: Known RFCs for IP addresses.
§Pedigree
- The code in this crate is inspired by Golang’s
interface.goand HashiCorp’s go-sockaddr.
§License
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.
Re-exports§
pub use ipnet;
Modules§
Structs§
- Flags
- Flags represents the interface flags.
- Ifv4
Addr - An interface IPv4 address.
- Ifv4Net
- An interface IPv4 network.
- Ifv6
Addr - An interface IPv6 address.
- Ifv6Net
- An interface IPv6 network.
- Interface
- The inferface struct
- MacAddr
- Represents a physical hardware address (MAC address).
- SmolStr
- A
SmolStris a string type that has the following properties:
Enums§
Functions§
- best_
local_ addrs - Returns both IPv4 and IPv6 addresses from the interfaces with the best default routes. The “best” interfaces are determined by the routing metrics of default routes.
- best_
local_ ipv4_ addrs - Returns the IPv4 addresses from the interface with the best default route.
The “best” interface is determined by the routing metrics of default routes (
0.0.0.0). - best_
local_ ipv6_ addrs - Returns the IPv6 addresses from the interface with the best default route.
The “best” interface is determined by the routing metrics of default routes (
::). - gateway_
addrs - Returns all gateway IP addresses (both IPv4 and IPv6) configured on the system. Only returns addresses from interfaces that have valid routes and excludes any addresses that are not configured as gateways.
- gateway_
addrs_ by_ filter - Returns all gateway IP addresses (both IPv4 and IPv6) configured on the system that match the given filter. Only returns addresses from interfaces that have valid routes and excludes any addresses that are not configured as gateways.
- gateway_
ipv4_ addrs - Returns all IPv4 gateway addresses configured on the system. Only returns addresses from interfaces that have valid routes and excludes any addresses that are not configured as gateways.
- gateway_
ipv4_ addrs_ by_ filter - Returns all IPv4 gateway addresses configured on the system that match the given filter. Only returns addresses from interfaces that have valid routes and excludes any addresses that are not configured as gateways.
- gateway_
ipv6_ addrs - Returns all IPv6 gateway addresses configured on the system. Only returns addresses from interfaces that have valid routes and excludes any addresses that are not configured as gateways.
- gateway_
ipv6_ addrs_ by_ filter - Returns all IPv6 gateway addresses configured on the system that match the given filter. Only returns addresses from interfaces that have valid routes and excludes any addresses that are not configured as gateways.
- get_
ip_ mtu - Get the MTU of the given
IpAddr. - get_
ipv4_ mtu - Get the MTU of the given
Ipv4Addr. - get_
ipv6_ mtu - Get the MTU of the given
Ipv6Addr. - ifindex_
to_ name - Returns the name of the interface by the given index.
- ifname_
to_ iface - Returns the IPv6 interface of by the given name.
- ifname_
to_ index - Returns the index of the interface by the given name.
- ifname_
to_ v4_ iface - Returns the IPv4 interface of by the given name.
- ifname_
to_ v6_ iface - Returns the IPv6 interface of by the given name.
- interface_
addrs - Returns a list of the system’s unicast interface addrs.
- interface_
addrs_ by_ filter - Returns a list of the system’s unicast interface addrs.
- interface_
by_ index - Returns the interface specified by index.
- interface_
by_ name - Returns the interface specified by name.
- interface_
ipv4_ addrs - Returns a list of the system’s unicast, IPv4 interface addrs.
- interface_
ipv4_ addrs_ by_ filter - Returns a list of the system’s unicast, IPv4 interface addrs.
- interface_
ipv6_ addrs - Returns a list of the system’s unicast, IPv6 interface addrs.
- interface_
ipv6_ addrs_ by_ filter - Returns a list of the system’s unicast, IPv6 interface addrs.
- interface_
multicast_ addrs Apple or FreeBSD or Linux or Windows - Returns a list of the system’s multicast interface addrs.
- interface_
multicast_ addrs_ by_ filter Apple or FreeBSD or Linux or Windows - Returns a list of the system’s multicast interface addrs. The filter is used to determine which multicast addresses to include.
- interface_
multicast_ ipv4_ addrs Apple or FreeBSD or Linux or Windows - Returns a list of the system’s multicast, IPv4 interface addrs.
- interface_
multicast_ ipv4_ addrs_ by_ filter Apple or FreeBSD or Linux or Windows - Returns a list of the system’s multicast, IPv4 interface addrs. The filter is used to determine which multicast addresses to include.
- interface_
multicast_ ipv6_ addrs Apple or FreeBSD or Linux or Windows - Returns a list of the system’s multicast, IPv6 interface addrs.
- interface_
multicast_ ipv6_ addrs_ by_ filter Apple or FreeBSD or Linux or Windows - Returns a list of the system’s multicast, IPv6 interface addrs. The filter is used to determine which multicast addresses to include.
- interfaces
- Returns a list of the system’s network interfaces.
- local_
addrs - Returns all IP addresses (both IPv4 and IPv6) from interfaces that have valid routes (excluding loopback). This ensures we only return addresses that can be used for communication.
- local_
addrs_ by_ filter - Returns all IP addresses (both IPv4 and IPv6) from interfaces that have valid routes.
- local_
ipv4_ addrs - Returns all IPv4 addresses from interfaces that have valid routes (excluding loopback). This ensures we only return addresses that can be used for communication.
- local_
ipv4_ addrs_ by_ filter - Returns all IPv4 addresses from interfaces that have valid routes.
- local_
ipv6_ addrs - Returns all IPv6 addresses from interfaces that have valid routes (excluding loopback). This ensures we only return addresses that can be used for communication.
- local_
ipv6_ addrs_ by_ filter - Returns all IPv6 addresses from interfaces that have valid routes.
- private_
addrs - Returns all IP addresses that are part of RFC
6890 (regardless of whether or not there is a default route, unlike
public_addrs). - private_
addrs_ by_ filter - Returns all IP addresses that are part of RFC
6890 (regardless of whether or not there is a default route, unlike
public_addrs_by_filter). - private_
ipv4_ addrs - Returns all IPv4 addresses that are part of RFC
6890 (regardless of whether or not there is a default route, unlike
public_ipv4_addrs). - private_
ipv4_ addrs_ by_ filter - Returns all IPv4 addresses that are part of RFC
6890 (regardless of whether or not there is a default route, unlike
public_ipv4_addrs_by_filter). - private_
ipv6_ addrs - Returns all IPv6 addresses that are part of RFC
6890 (regardless of whether or not there is a default route, unlike
public_ipv6_addrs). - private_
ipv6_ addrs_ by_ filter - Returns all IPv6 addresses that are part of RFC
6890 (regardless of whether or not there is a default route, unlike
public_ipv6_addrs_by_filter). - public_
addrs - Returns all IP addresses that are NOT part of RFC
6890 (regardless of whether or not there is a default route, unlike
private_addrs). - public_
addrs_ by_ filter - Returns all IP addresses that are NOT part of RFC
6890 (regardless of whether or not there is a default route, unlike
private_addrs_by_filter). - public_
ipv4_ addrs - Returns all IPv4 addresses that are NOT part of RFC
6890 (regardless of whether or not there is a default route, unlike
private_ipv4_addrs). - public_
ipv4_ addrs_ by_ filter - Returns all IP addresses that are NOT part of RFC
6890 (regardless of whether or not there is a default route, unlike
private_ipv4_addrs_by_filter). - public_
ipv6_ addrs - Returns all IPv6 addresses that are NOT part of RFC
6890 (regardless of whether or not there is a default route, unlike
private_ipv6_addrs). - public_
ipv6_ addrs_ by_ filter - Returns all IPv6 addresses that are NOT part of RFC
6890 (regardless of whether or not there is a default route, unlike
private_ipv6_addrs_by_filter).
Type Aliases§
- Parse
MacAddr Error - Represents an error that occurred while parsing
MacAddr.