[package]
edition = "2021"
rust-version = "1.85.0"
name = "ftr"
version = "0.7.0"
authors = ["David Weekly <david@weekly.org>"]
build = "build.rs"
autolib = false
autobins = false
autoexamples = false
autotests = false
autobenches = false
description = "A fast, parallel ICMP traceroute with ASN lookup, reverse DNS, and ISP detection"
homepage = "https://github.com/dweekly/ftr"
readme = "README.md"
keywords = [
"traceroute",
"icmp",
"networking",
"asn",
"diagnostics",
]
categories = [
"command-line-utilities",
"network-programming",
]
license = "MIT"
repository = "https://github.com/dweekly/ftr"
[package.metadata.deb]
section = "net"
priority = "optional"
depends = "$auto"
maintainer = "David Weekly <david@weekly.org>"
copyright = "2025, David Weekly <david@weekly.org>"
license-file = [
"LICENSE",
"4",
]
extended-description = "ftr (Fast TraceRoute) is a high-performance, parallel ICMP traceroute implementation written in Rust. It features concurrent probing for faster route discovery, automatic ASN (Autonomous System Number) lookups to identify network operators, and intelligent hop classification (e.g., local networks, IXPs, CDNs)."
assets = [
[
"target/release/ftr",
"usr/bin/",
"755",
],
[
"README.md",
"usr/share/doc/ftr/README",
"644",
],
[
"CHANGELOG.md",
"usr/share/doc/ftr/CHANGELOG",
"644",
],
]
[package.metadata.cargo-machete]
ignored = []
[features]
async = ["tokio/full"]
default = ["async"]
[lib]
name = "ftr"
path = "src/lib.rs"
[[bin]]
name = "ftr"
path = "src/main.rs"
[[example]]
name = "cached_traces"
path = "examples/cached_traces.rs"
[[example]]
name = "custom_socket"
path = "examples/custom_socket.rs"
[[example]]
name = "error_handling"
path = "examples/error_handling.rs"
[[example]]
name = "parallel_traces"
path = "examples/parallel_traces.rs"
[[example]]
name = "rigorous_test"
path = "examples/rigorous_test.rs"
[[example]]
name = "service_api"
path = "examples/service_api.rs"
[[example]]
name = "simple_trace"
path = "examples/simple_trace.rs"
[[example]]
name = "test_v0_6_library"
path = "examples/test_v0_6_library.rs"
[[test]]
name = "async_multi_hop"
path = "tests/async_multi_hop.rs"
[[test]]
name = "cache_performance_test"
path = "tests/cache_performance_test.rs"
[[test]]
name = "caching_verification_test"
path = "tests/caching_verification_test.rs"
[[test]]
name = "ci_filter_test"
path = "tests/ci_filter_test.rs"
[[test]]
name = "cli_integration"
path = "tests/cli_integration.rs"
[[test]]
name = "edge_cases"
path = "tests/edge_cases.rs"
[[test]]
name = "error_handling_test"
path = "tests/error_handling_test.rs"
[[test]]
name = "event_overhead_test"
path = "tests/event_overhead_test.rs"
[[test]]
name = "freebsd_integration"
path = "tests/freebsd_integration.rs"
[[test]]
name = "freebsd_smoke"
path = "tests/freebsd_smoke.rs"
[[test]]
name = "handle_pattern_api_test"
path = "tests/handle_pattern_api_test.rs"
[[test]]
name = "handle_pattern_test"
path = "tests/handle_pattern_test.rs"
[[test]]
name = "integration_test"
path = "tests/integration_test.rs"
[[test]]
name = "linux_async_udp_debug"
path = "tests/linux_async_udp_debug.rs"
[[test]]
name = "parallel_isolation_test"
path = "tests/parallel_isolation_test.rs"
[[test]]
name = "performance_test"
path = "tests/performance_test.rs"
[[test]]
name = "quick_perf_test"
path = "tests/quick_perf_test.rs"
[[test]]
name = "service_api_integration_test"
path = "tests/service_api_integration_test.rs"
[[test]]
name = "test_ci_network"
path = "tests/test_ci_network.rs"
[[test]]
name = "traceroute_integration"
path = "tests/traceroute_integration.rs"
[[test]]
name = "v6_features_test"
path = "tests/v6_features_test.rs"
[[test]]
name = "windows_integration"
path = "tests/windows_integration.rs"
[[bench]]
name = "traceroute_bench"
path = "benches/traceroute_bench.rs"
harness = false
[dependencies.clap]
version = "4.5"
features = ["derive"]
[dependencies.getrandom]
version = "0.3"
[dependencies.ip_network]
version = "0.4.1"
[dependencies.ip_network_table]
version = "0.2.0"
[dependencies.serde]
version = "1.0"
features = ["derive"]
[dependencies.serde_json]
version = "1.0"
[dependencies.socket2]
version = "0.6"
features = ["all"]
[dependencies.thiserror]
version = "2.0"
[dependencies.tokio]
version = "1.47"
features = [
"rt-multi-thread",
"time",
"net",
"macros",
"sync",
"io-util",
]
[dependencies.ureq]
version = "3"
features = ["native-tls"]
default-features = false
[dev-dependencies.assert_cmd]
version = "2.0"
[dev-dependencies.criterion]
version = "0.7"
features = ["html_reports"]
[dev-dependencies.predicates]
version = "3.1"
[dev-dependencies.serde_json]
version = "1.0"
[target.'cfg(target_os = "freebsd")'.dependencies.libc]
version = "0.2"
[target.'cfg(target_os = "freebsd")'.dev-dependencies.libc]
version = "0.2"
[target.'cfg(target_os = "linux")'.dependencies.libc]
version = "0.2"
[target.'cfg(target_os = "linux")'.dependencies.ureq]
version = "3"
features = [
"native-tls",
"vendored",
]
default-features = false
[target.'cfg(target_os = "openbsd")'.dependencies.libc]
version = "0.2"
[target."cfg(windows)".dependencies.windows-sys]
version = "0.60"
features = [
"Win32_NetworkManagement_IpHelper",
"Win32_Networking_WinSock",
"Win32_Foundation",
"Win32_System_IO",
"Win32_System_Threading",
"Win32_Security",
]
[lints.clippy]
expect_used = "allow"
inefficient_to_string = "warn"
module_name_repetitions = "allow"
needless_pass_by_value = "warn"
panic = "warn"
redundant_closure_for_method_calls = "warn"
unwrap_used = "warn"
[lints.clippy.correctness]
level = "deny"
priority = -1
[lints.clippy.perf]
level = "warn"
priority = -1
[lints.clippy.style]
level = "warn"
priority = -1
[lints.clippy.suspicious]
level = "deny"
priority = -1
[lints.rust]
missing_docs = "warn"
[profile.release]
opt-level = "z"
lto = "fat"
codegen-units = 1
panic = "abort"
strip = "symbols"