Crate getifs

Crate getifs 

Source
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.

github LoC Build codecov

docs.rs crates.io crates.io license

§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

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

PlatformBest OperationgetifsAlternativeSpeedup
macOS (ARM64)Get interface by index2.6 μs188.4 μs73x faster
macOS (ARM64)List all interfaces8.5 μs180.4 μs21x faster
Linux (x64)List all interfaces35.2 μs98.1 μs2.8x faster
Windows (x64)Gateway IPv429.9 μsN/AUnique feature

§Detailed Results

§Interface Operations

macOS (GitHub Actions ARM64)

OperationgetifsAlternativeSpeedup
List all interfaces8.5 μs180.4 μs (network-interface)21x faster
Get interface by index2.6 μs188.4 μs (network-interface)73x faster
Get interface by name11.6 μs188.3 μs (network-interface)16x faster
Get interface addresses8.5 μs--
Get multicast addresses4.6 μs--

Linux (GitHub Actions x64)

OperationgetifsAlternativeSpeedup
List all interfaces35.2 μs98.1 μs (network-interface)2.8x faster
Get interface by index35.0 μs98.5 μs (network-interface)2.8x faster
Get interface by name40.8 μs98.4 μs (network-interface)2.4x faster
Get interface addresses16.4 μs--
Get multicast addresses31.5 μs--

Windows (GitHub Actions x64)

OperationgetifsAlternativeNotes
List all interfaces986 μs979 μs (network-interface)Similar performance
Get interface by index977 μs984 μs (network-interface)Similar performance
Get interface by name1025 μs979 μ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)

OperationgetifsAlternativeSpeedup
Get local IPv4 address6.1 μs10.0 μs (local-ip-address)1.6x faster
Get local IPv6 address7.6 μs9.9 μs (local-ip-address)1.3x faster

Linux (GitHub Actions x64)

OperationgetifsAlternativeNotes
Get local IPv4 address13.7 μs12.2 μs (local-ip-address)Comparable
Get local IPv6 address11.4 μs-No IPv6 result from alternative

Windows (GitHub Actions x64)

OperationgetifsAlternativeNotes
Get local IPv4 address980 μs926 μs (local-ip-address)Similar (~1ms)
Get local IPv6 address983 μs983 μs (local-ip-address)Similar (~1ms)
§Gateway Operations
PlatformIPv4 GatewaysIPv6 GatewaysAll Gateways
macOS (ARM64)19.6 μs3.0 μs22.8 μs
Linux (x64)18.1 μs14.5 μs22.4 μs
Windows (x64)29.9 μs18.0 μs48.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 SmallVec and SmolStr to 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 GetAdaptersAddresses API 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

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

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 inferface 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.