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_DIAGtuntap- TUN/TAP device managementtuntap-async- Async TUN/TAP support (impliestuntap)tc- Traffic control utilitiesoutput- JSON/text output formattingfull- 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(())
}§Link State Management
ⓘ
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;