1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
|
// SPDX-License-Identifier: MIT
#![cfg(feature = "tokio_socket")]
//! This example opens a netlink socket, registers for IPv4 and IPv6 routing
//! changes, listens for said changes and prints the received messages.
use futures::stream::StreamExt;
use netlink_sys::{AsyncSocket, SocketAddr};
use rtnetlink::{
constants::{RTMGRP_IPV4_ROUTE, RTMGRP_IPV6_ROUTE},
new_connection,
};
#[tokio::main]
async fn main() -> Result<(), String> {
// Open the netlink socket
let (mut connection, _, mut messages) =
new_connection().map_err(|e| format!("{e}"))?;
// These flags specify what kinds of broadcast messages we want to listen
// for.
let mgroup_flags = RTMGRP_IPV4_ROUTE | RTMGRP_IPV6_ROUTE;
// A netlink socket address is created with said flags.
let addr = SocketAddr::new(0, mgroup_flags);
// Said address is bound so new conenctions and thus new message broadcasts
// can be received.
connection
.socket_mut()
.socket_mut()
.bind(&addr)
.expect("failed to bind");
tokio::spawn(connection);
while let Some((message, _)) = messages.next().await {
let payload = message.payload;
println!("Route change message - {payload:?}");
}
Ok(())
}
|