Skip to content

Commit 35a99ed

Browse files
cathay4tToorero
authored andcommitted
Add example code of dumping routes
Signed-off-by: Gris Ge <[email protected]>
1 parent 5f7c00d commit 35a99ed

File tree

1 file changed

+65
-0
lines changed

1 file changed

+65
-0
lines changed

examples/dump_routes.rs

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
// SPDX-License-Identifier: MIT
2+
3+
use netlink_packet_core::{
4+
NetlinkHeader, NetlinkMessage, NetlinkPayload, NLM_F_DUMP, NLM_F_REQUEST,
5+
};
6+
use netlink_packet_route::{route::RouteMessage, RouteNetlinkMessage};
7+
use netlink_sys::{protocols::NETLINK_ROUTE, Socket, SocketAddr};
8+
9+
fn main() {
10+
let mut socket = Socket::new(NETLINK_ROUTE).unwrap();
11+
let _port_number = socket.bind_auto().unwrap().port_number();
12+
socket.connect(&SocketAddr::new(0, 0)).unwrap();
13+
14+
let mut nl_hdr = NetlinkHeader::default();
15+
nl_hdr.flags = NLM_F_REQUEST | NLM_F_DUMP;
16+
let mut packet = NetlinkMessage::new(
17+
nl_hdr,
18+
NetlinkPayload::from(RouteNetlinkMessage::GetRoute(
19+
RouteMessage::default(),
20+
)),
21+
);
22+
23+
packet.finalize();
24+
25+
let mut buf = vec![0; packet.header.length as usize];
26+
27+
// Before calling serialize, it is important to check that the buffer in
28+
// which we're emitting is big enough for the packet, other
29+
// `serialize()` panics.
30+
31+
assert!(buf.len() == packet.buffer_len());
32+
33+
packet.serialize(&mut buf[..]);
34+
35+
println!(">>> {packet:?}");
36+
if let Err(e) = socket.send(&buf[..], 0) {
37+
println!("SEND ERROR {e}");
38+
}
39+
40+
let mut receive_buffer = vec![0; 4096];
41+
let mut offset = 0;
42+
43+
// we set the NLM_F_DUMP flag so we expect a multipart rx_packet in
44+
// response.
45+
while let Ok(size) = socket.recv(&mut &mut receive_buffer[..], 0) {
46+
loop {
47+
let bytes = &receive_buffer[offset..];
48+
let rx_packet =
49+
<NetlinkMessage<RouteNetlinkMessage>>::deserialize(bytes)
50+
.unwrap();
51+
println!("<<< {rx_packet:?}");
52+
53+
if matches!(rx_packet.payload, NetlinkPayload::Done(_)) {
54+
println!("Done!");
55+
return;
56+
}
57+
58+
offset += rx_packet.header.length as usize;
59+
if offset == size || rx_packet.header.length == 0 {
60+
offset = 0;
61+
break;
62+
}
63+
}
64+
}
65+
}

0 commit comments

Comments
 (0)