Skip to main content

Crate getifs

Crate getifs 

Source
Expand description

GetIfs

Cross-platform enumeration of network interfaces and their MTU, gateway, multicast, and local/private/public IP addresses — with a libc-free netlink backend on Linux and no getifaddrs dependency.

github LoC Build codecov

docs.rs crates.io crates.io license

§Installation

[dependencies]
getifs = "0.5"

§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 189x 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

§Details

OSApproach
Linux (no libc)socket(AF_NETLINK, SOCK_RAW | SOCK_CLOEXEC, NETLINK_ROUTE)
BSD-likesysctl
WindowsGetAdaptersAddresses

§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 SmallVec and SmolStr
  • Providing comprehensive interface information including MTU and multicast support
  • Achieving significantly better performance than alternatives:
    • Up to 189x faster on macOS (interface_by_index)
    • Up to 37x faster on macOS (list interfaces)
    • 2.4–2.8x faster on Linux (interface enumeration)
    • ~7x faster local-IP lookup on Linux
    • Comparable performance on Windows (GetAdaptersAddresses 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

Numbers below compare getifs against network-interface 2 and local-ip-address 0.6. Each row reports median cargo bench time (Criterion, 100 samples).

  • macOS (Apple M4 Pro) — measured on a bare-metal laptop, not CI. The GitHub Actions macOS runners are shared virtual machines with highly variable latency (run-to-run wobble of ±30% on these ops), which obscures the real cost difference.
  • Linux (x64) / Windows (x64) — measured on GitHub Actions ubuntu-latest / windows-latest runners on 2026-04-15 03:34 UTC.
PlatformBest OperationgetifsAlternativeSpeedup
macOS (Apple M4 Pro)Get interface by index1.7 μs314.2 μs189x faster
macOS (Apple M4 Pro)List all interfaces8.4 μs313.0 μs37x faster
Linux (x64)Local IPv4 lookup13.7 μs94.3 μs6.9x faster
Linux (x64)List all interfaces41.5 μs111.7 μs2.7x faster
Windows (x64)Gateway IPv430.2 μsN/AUnique feature

§Detailed Results

§Interface Operations

macOS (Apple M4 Pro, 24 GB, local bare-metal)

OperationgetifsAlternativeSpeedup
List all interfaces8.4 μs313.0 μs (network-interface)37x faster
Get interface by index1.7 μs314.2 μs (network-interface)189x faster
Get interface by name10.4 μs314.1 μs (network-interface)30x faster
Get interface addresses8.4 μs--
Get multicast addresses2.9 μs--

Linux (GitHub Actions x64)

OperationgetifsAlternativeSpeedup
List all interfaces41.5 μs111.7 μs (network-interface)2.7x faster
Get interface by index40.3 μs111.9 μs (network-interface)2.8x faster
Get interface by name46.1 μs111.9 μs (network-interface)2.4x faster
Get interface addresses17.3 μs--
Get multicast addresses31.4 μs--

Windows (GitHub Actions x64)

OperationgetifsAlternativeNotes
List all interfaces974 μs967 μs (network-interface)Within noise
Get interface by index954 μs976 μs (network-interface)Within noise
Get interface by name1011 μs969 μs (network-interface)Within noise
Get interface addresses958 μs--
Get multicast addresses966 μs--

Note: the Win32 GetAdaptersAddresses API has an inherent ~1 ms floor that dominates every implementation — getifs and network-interface end up within measurement noise of each other on Windows.

§Local IP Address Operations

macOS (Apple M4 Pro, 24 GB, local bare-metal)

OperationgetifsAlternativeSpeedup
Get local IPv4 address6.5 μs9.8 μs (local-ip-address)1.5x faster
Get local IPv6 address7.9 μs9.8 μs (local-ip-address)1.2x faster

Linux (GitHub Actions x64)

OperationgetifsAlternativeSpeedup
Get local IPv4 address13.7 μs94.3 μs (local-ip-address)6.9x faster
Get local IPv6 address11.2 μs-No IPv6 result from alternative

Windows (GitHub Actions x64)

OperationgetifsAlternativeNotes
Get local IPv4 address963 μs919 μs (local-ip-address)Win32 ~1 ms floor
Get local IPv6 address992 μs972 μs (local-ip-address)Win32 ~1 ms floor
§Gateway Operations
PlatformIPv4 GatewaysIPv6 GatewaysAll Gateways
macOS (M4 Pro, local)17.5 μs2.4 μs19.8 μs
Linux (x64, CI)18.4 μs14.3 μs22.4 μs
Windows (x64, CI)30.2 μs18.0 μs48.5 μs

Note: No direct alternatives available for gateway discovery, so these are reported as absolute times rather than as speedups.

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 SmallVec and SmolStr to avoid heap allocations for common cases

Platform Performance Notes:

  • macOS: Shows the largest speedups (30–189x on bare metal) due to the efficient sysctl-based implementation avoiding getifaddrs’s per-call overhead. On shared CI runners the absolute numbers are noisier but the ordering holds.
  • Linux: 2.4–2.8x faster interface enumeration via direct netlink, and ~7x faster local-IP lookup from avoiding the test-socket round trip that local-ip-address performs.
  • Windows: Similar performance to alternatives — GetAdaptersAddresses has an inherent ~1 ms floor that dominates every implementation.

§Sister crates

  • iprobe: Probe if the host system supports IPv4, IPv6 and IPv4-mapped-IPv6.
  • iprfc: Known RFCs for IP addresses.

§Pedigree

§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) 2026 Al Liu.

Re-exports§

pub use ipnet;

Modules§

probe
IP protocol probing
rfc
Known RFCs for IP addresses

Structs§

Flags
Flags represents the interface flags.
Ifv4Addr
An interface IPv4 address.
Ifv4Net
An interface IPv4 network.
Ifv6Addr
An interface IPv6 address.
Ifv6Net
An interface IPv6 network.
Interface
The interface struct
MacAddr
Represents a physical hardware address (MAC address).
SmolStr
A SmolStr is a string type that has the following properties:

Enums§

IfAddr
An interface address.
IfNet
An interface network.

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_addrsApple or FreeBSD or Linux or Windows
Returns a list of the system’s multicast interface addrs.
interface_multicast_addrs_by_filterApple 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_addrsApple or FreeBSD or Linux or Windows
Returns a list of the system’s multicast, IPv4 interface addrs.
interface_multicast_ipv4_addrs_by_filterApple 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_addrsApple or FreeBSD or Linux or Windows
Returns a list of the system’s multicast, IPv6 interface addrs.
interface_multicast_ipv6_addrs_by_filterApple 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§

ParseMacAddrError
Represents an error that occurred while parsing MacAddr.