Thanks to visit codestin.com
Credit goes to github.com

Skip to content
/ getifs Public
generated from al8n/template-rs

A bunch of cross platform network tools for fetching interfaces, multicast addresses, local ip addresses, private ip addresses, public ip addresses and etc.

License

Apache-2.0, MIT licenses found

Licenses found

Apache-2.0
LICENSE-APACHE
MIT
LICENSE-MIT
Notifications You must be signed in to change notification settings

al8n/getifs

Repository files navigation

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

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

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

About

A bunch of cross platform network tools for fetching interfaces, multicast addresses, local ip addresses, private ip addresses, public ip addresses and etc.

Topics

Resources

License

Apache-2.0, MIT licenses found

Licenses found

Apache-2.0
LICENSE-APACHE
MIT
LICENSE-MIT

Stars

Watchers

Forks

Sponsor this project

  •  

Packages

No packages published

Contributors 2

  •  
  •  

Languages