blob: 5df0ceb46ddab9b3dda4bf0033b2dd33ebce493e [file] [log] [blame]
// SPDX-License-Identifier: MIT
use futures::StreamExt;
use netlink_packet_core::{
NetlinkHeader, NetlinkMessage, NLM_F_DUMP, NLM_F_REQUEST,
};
use netlink_packet_route::{link::LinkMessage, RouteNetlinkMessage};
use netlink_proto::{
new_connection,
sys::{protocols::NETLINK_ROUTE, SocketAddr},
};
#[tokio::main]
async fn main() -> Result<(), String> {
// Create the netlink socket. Here, we won't use the channel that
// receives unsolicited messages.
let (conn, handle, _) = new_connection(NETLINK_ROUTE).map_err(|e| {
format!("Failed to create a new netlink connection: {}", e)
})?;
// Spawn the `Connection` so that it starts polling the netlink
// socket in the background.
async_std::task::spawn(conn);
// Create the netlink message that requests the links to be dumped
let mut nl_hdr = NetlinkHeader::default();
nl_hdr.flags = NLM_F_DUMP | NLM_F_REQUEST;
let request = NetlinkMessage::new(
nl_hdr,
RouteNetlinkMessage::GetLink(LinkMessage::default()).into(),
);
// Send the request
let mut response = handle
.request(request, SocketAddr::new(0, 0))
.map_err(|e| format!("Failed to send request: {}", e))?;
// Print all the messages received in response
while let Some(packet) = response.next().await {
println!("<<< {:?}", packet);
}
Ok(())
}