Crate nlink

Crate nlink 

Source
Expand description

Async netlink library for Linux network configuration.

This crate provides a complete netlink implementation for programmatic network management on Linux. It supports RTNetlink (routing), traffic control, socket diagnostics, and TUN/TAP device management.

§Features

  • sockdiag - Socket diagnostics via NETLINK_SOCK_DIAG
  • tuntap - TUN/TAP device management
  • tuntap-async - Async TUN/TAP support (implies tuntap)
  • tc - Traffic control utilities
  • output - JSON/text output formatting
  • full - All features enabled

§Example

use nlink::netlink::{Connection, Route};

#[tokio::main]
async fn main() -> nlink::netlink::Result<()> {
    let conn = Connection::<Route>::new()?;

    // Query interfaces
    let links = conn.get_links().await?;
    for link in &links {
        // Use name_or() helper for cleaner code
        println!("{}: {}", link.ifindex(), link.name_or("?"));
    }

    // Build ifindex -> name map for resolving routes/addresses
    let names = conn.get_interface_names().await?;

    Ok(())
}
use nlink::netlink::{Connection, Route};

let conn = Connection::<Route>::new()?;

// Bring an interface up
conn.set_link_up("eth0").await?;

// Bring it down
conn.set_link_down("eth0").await?;

// Set MTU
conn.set_link_mtu("eth0", 9000).await?;

§Network Namespace Support

Operations can be performed in specific network namespaces:

use nlink::netlink::{Connection, Route, Generic};
use nlink::netlink::namespace;

// Connect to a named namespace (created via `ip netns add myns`)
// Functions are generic over protocol type
let conn: Connection<Route> = namespace::connection_for("myns")?;
let links = conn.get_links().await?;

// Or connect to a container's namespace
let conn: Connection<Route> = namespace::connection_for_pid(container_pid)?;
let links = conn.get_links().await?;

// Or use a path directly
let conn: Connection<Route> = namespace::connection_for_path("/proc/1234/ns/net")?;

// Generic connections work too (e.g., for WireGuard in a namespace)
let genl: Connection<Generic> = namespace::connection_for("myns")?;

§Event Monitoring

Use Connection::subscribe() to select event types, then events() to get a stream:

use nlink::netlink::{Connection, Route, RtnetlinkGroup, NetworkEvent};
use tokio_stream::StreamExt;

let mut conn = Connection::<Route>::new()?;
conn.subscribe(&[RtnetlinkGroup::Link, RtnetlinkGroup::Ipv4Addr])?;

let mut events = conn.events();
while let Some(event) = events.next().await {
    match event? {
        NetworkEvent::NewLink(link) => println!("New link: {:?}", link.name),
        NetworkEvent::NewAddress(addr) => println!("New address: {:?}", addr.address),
        _ => {}
    }
}

§Multi-Namespace Event Monitoring

Use tokio_stream::StreamMap to monitor multiple namespaces:

use nlink::netlink::{Connection, Route, RtnetlinkGroup};
use tokio_stream::{StreamExt, StreamMap};

let mut streams = StreamMap::new();

let mut conn1 = Connection::<Route>::new()?;
conn1.subscribe_all()?;
streams.insert("default", conn1.into_events());

let mut conn2 = Connection::<Route>::new_in_namespace("ns1")?;
conn2.subscribe_all()?;
streams.insert("ns1", conn2.into_events());

while let Some((ns, event)) = streams.next().await {
    println!("[{}] {:?}", ns, event?);
}

Re-exports§

pub use netlink::Connection;
pub use netlink::Error;
pub use netlink::Protocol;
pub use netlink::Result;
pub use netlink::Generic;
pub use netlink::Route;
pub use netlink::NetworkEvent;
pub use netlink::EventSource;
pub use netlink::EventSubscription;
pub use netlink::OwnedEventStream;
pub use netlink::RtnetlinkGroup;
pub use netlink::NamespaceSpec;
pub use netlink::messages::AddressMessage;
pub use netlink::messages::ClassMessage;
pub use netlink::messages::FilterMessage;
pub use netlink::messages::LinkMessage;
pub use netlink::messages::NeighborMessage;
pub use netlink::messages::QdiscMessage;
pub use netlink::messages::RouteMessage;
pub use netlink::messages::RuleMessage;
pub use netlink::messages::TcMessage;
pub use netlink::fdb::FdbEntry;
pub use netlink::fdb::FdbEntryBuilder;
pub use netlink::bridge_vlan::BridgeVlanBuilder;
pub use netlink::bridge_vlan::BridgeVlanEntry;
pub use netlink::bridge_vlan::BridgeVlanFlags;
pub use netlink::diagnostics::Bottleneck;
pub use netlink::diagnostics::BottleneckType;
pub use netlink::diagnostics::ConnectivityReport;
pub use netlink::diagnostics::DiagnosticReport;
pub use netlink::diagnostics::Diagnostics;
pub use netlink::diagnostics::DiagnosticsConfig;
pub use netlink::diagnostics::InterfaceDiag;
pub use netlink::diagnostics::Issue;
pub use netlink::diagnostics::IssueCategory;
pub use netlink::diagnostics::IssueStream;
pub use netlink::diagnostics::LinkRates;
pub use netlink::diagnostics::RouteDiag;
pub use netlink::diagnostics::RouteInfo;
pub use netlink::diagnostics::Severity;
pub use netlink::diagnostics::TcDiag;

Modules§

netlink
Async netlink protocol implementation for Linux.
output
Output formatting (JSON/text) for nlink.
sockdiag
Socket diagnostics library for Linux.
tc
Traffic control utilities for nlink.
tuntap
TUN/TAP device management library.
util
Shared utilities for nlink.