A minimal traceroute built on io_uring.
ringroute exists to demonstrate io_uring usage. At this time, it is not
meant to be a replacement for traceroute, mtr, or any other production
network diagnostic tool. Not only is there no guarantee of feature parity, but
the use of modern kernel features limits which environments this can be run in.
At its core, ringroute works like any other traceroute tool. Each router that forwards an IP packet decrements its time-to-live (TTL) by one. If decrementing the TTL would reduce it to zero, the router discards the packet and will typically send an ICMP Time Exceeded message back to the sender. These responses reveal the router's own IP address. To discover the path to a target, ringroute sends probes with increasing TTL values. A probe sent with TTL N expires at the Nth hop, allowing us to identify that device from its ICMP response.
To build from source:
git clone git@github.com:pchaseh/ringroute.git
cd ringroute
cargo build --releaseRun with --help to see usage:
./ringroute --helpringroute uses env_logger for
application logging. The RUST_LOG environment variable can be used to set the
log level:
RUST_LOG=debug ./ringroute . . .When not set, RUST_LOG defaults to error.
- Linux 6.0 or newer compiled with
CONFIG_IO_URING=y - Rust toolchain (including Cargo)
- Limited support for different probing methods.
- All hops are probed at once.
- Options to influence routing (eg. specifying source address, network device) are not implemented.