|
5 | 5 | **mtr is the de facto standard** for interactive traceroute but hasn't seen major feature development in years. **trippy** (Rust) is the main modern alternative but focuses on a different feature set. |
6 | 6 |
|
7 | 7 | **Key advantages ttl already has:** |
8 | | -- ECMP path enumeration (Paris/Dublin traceroute with `--flows`) |
| 8 | +- ECMP path enumeration with per-flow/per-packet classification (`--flows`) |
9 | 9 | - NAT detection (source port rewrite analysis) |
10 | 10 | - ICMP rate limit detection (distinguish rate limiting from real loss) |
11 | 11 | - Route flap and asymmetric routing detection |
|
60 | 60 | - [x] Update notifications (checks GitHub releases, install-method-aware) |
61 | 61 | - [x] FreeBSD support (experimental, raw sockets) |
62 | 62 |
|
63 | | -## Completed (v0.15.x - v0.17.x) |
| 63 | +## Completed (v0.15.x - v0.18.x) |
64 | 64 |
|
65 | 65 | - [x] Animated replay (`--replay file --animate`) with speed control |
66 | 66 | - [x] Probe event recording for replay accuracy |
|
72 | 72 | - [x] Last RTT column in main table (mtr parity — `Loss% Snt Last Avg Min Max StdDev`) |
73 | 73 | - [x] JAvg and JMax columns in Wide display mode |
74 | 74 | - [x] Wider ASN column for full AS name visibility |
| 75 | +- [x] ECMP classification: per-flow vs per-packet detection with primary_ratio heuristic (#46) |
| 76 | +- [x] Paths column reflects actual responder count for per-packet ECMP (#46) |
| 77 | +- [x] `E` indicator for ECMP detected vs `!` for route flap (#46) |
| 78 | +- [x] Effective flow capability: `--flows` + ICMP warns and collapses to single-flow (#46) |
| 79 | +- [x] Receiver flow attribution hardening: unknown flows only match when unambiguous (#46) |
75 | 80 |
|
76 | 81 | --- |
77 | 82 |
|
|
81 | 86 |
|
82 | 87 | **Why this matters:** Per-packet load balancing (common on Arista, Juniper, Cisco) is undercounted by the current flow-primary model. Users see 8 responders in the detail view but "Paths: 1" in the main table. Related: #46 |
83 | 88 |
|
84 | | -- [ ] Detect per-packet vs per-flow ECMP (primary_ratio heuristic per flow) |
85 | | -- [ ] Paths column reflects actual responder count for per-packet ECMP |
86 | | -- [ ] Separate indicators: `E` for ECMP detected vs `!` for route flap |
87 | | -- [ ] Warn when `--flows > 1` with effective ICMP probing (`-p icmp`, or `-p auto` when auto-select resolves to ICMP) |
88 | | -- [ ] Define `-p auto` warning semantics for multi-target/mixed-family runs (warn if any target resolves to effective ICMP, avoid duplicate spam) |
89 | | -- [ ] Track effective flow capability at runtime (requested `--flows` vs effective protocol) and use it for flap detection + NAT/Paths column visibility |
90 | | -- [ ] Add CLI/TUI hint that flow-based ECMP detection is meaningful with UDP/TCP probes |
91 | | -- [ ] Keep Paths value + highlight + host indicator driven by one shared ECMP classification (avoid count/style drift) |
92 | | -- [ ] Handle out-of-range returned src ports as unknown flow (not forced flow 0) to avoid false per-flow attribution behind NAT/CGNAT |
93 | | -- [ ] Update indicator/UI budget for new `E` marker (host width autosize currently assumes `" !~^"`) |
94 | | -- [ ] Update user-facing indicator docs/help (`E` vs `!`) in CLI help + docs pages |
95 | | -- [ ] Add tests for per-packet ECMP classification, `-p auto` ICMP warning behavior, and out-of-range src-port flow attribution |
96 | | -- [ ] #46 acceptance: per-packet ECMP no longer presents as misleading `Paths: 1` when many responders are observed |
97 | | -- [ ] #46 acceptance: `E` (ECMP) and `!` (route flap) are no longer conflated in the same scenario |
| 89 | +- [x] Detect per-packet vs per-flow ECMP (primary_ratio heuristic per flow) |
| 90 | +- [x] Paths column reflects actual responder count for per-packet ECMP |
| 91 | +- [x] Separate indicators: `E` for ECMP detected vs `!` for route flap |
| 92 | +- [x] Warn when `--flows > 1` with effective ICMP probing (`-p icmp`, or `-p auto` when auto-select resolves to ICMP) |
| 93 | +- [x] Define `-p auto` warning semantics for multi-target/mixed-family runs (warn if any target resolves to effective ICMP, avoid duplicate spam) |
| 94 | +- [x] Track effective flow capability at runtime (requested `--flows` vs effective protocol) and use it for flap detection + NAT/Paths column visibility |
| 95 | +- [x] Add CLI/TUI hint that flow-based ECMP detection is meaningful with UDP/TCP probes |
| 96 | +- [x] Keep Paths value + highlight + host indicator driven by one shared ECMP classification (avoid count/style drift) |
| 97 | +- [x] Handle out-of-range returned src ports as unknown flow (not forced flow 0) to avoid false per-flow attribution behind NAT/CGNAT |
| 98 | +- [x] Update indicator/UI budget for new `E` marker (host width autosize currently assumes `" !~^"`) |
| 99 | +- [x] Update user-facing indicator docs/help (`E` vs `!`) in CLI help + docs pages |
| 100 | +- [x] Add tests for per-packet ECMP classification, `-p auto` ICMP warning behavior, and out-of-range src-port flow attribution |
| 101 | +- [x] #46 acceptance: per-packet ECMP no longer presents as misleading `Paths: 1` when many responders are observed |
| 102 | +- [x] #46 acceptance: `E` (ECMP) and `!` (route flap) are no longer conflated in the same scenario |
98 | 103 | - [ ] Paris strategy for UDP (`--strategy paris` — fixed 5-tuple, checksum encodes sequence) *(follow-on after #46 core fix)* |
99 | 104 | - [ ] Dublin strategy for UDP (`--strategy dublin` — IP ID field encodes sequence) *(follow-on after #46 core fix)* |
100 | 105 |
|
|
137 | 142 | ### Quick Wins (low effort, high impact) |
138 | 143 | - [ ] **Progress indicator in replay** — show position in timeline during animated replay |
139 | 144 | - [ ] **Interactive replay** — step through events, jump to time |
140 | | -- [ ] **Last metric semantics** — decide and document whether `Last` is hop-most-recent (any responder) or primary-responder-most-recent; align TUI/CSV behavior and labels |
141 | | -- [ ] **IPv6 RAW payload fallback tests** — unit tests for IPv6 Echo Reply and Time Exceeded parsing |
142 | | -- [ ] **Main table layout tests** — verify header/cell/width count parity across Auto/Compact/Wide × single-flow/multi-flow modes |
| 145 | +- [x] **Last metric semantics** — documented as primary-responder-most-recent; TUI/CSV aligned |
| 146 | +- [x] **IPv6 RAW payload fallback tests** — unit tests for IPv6 Echo Reply and Time Exceeded parsing |
| 147 | +- [x] **Main table layout tests** — verify header/cell/width count parity across Auto/Compact/Wide × single-flow/multi-flow modes |
143 | 148 |
|
144 | 149 | ### Medium Effort (moderate effort, high impact) |
145 | 150 | - [ ] **PCAP export** — write probe/response packets to .pcap for Wireshark analysis |
|
210 | 215 | | trippy | Rust | Yes (UDP) | No | No | Yes | Active | |
211 | 216 | | traceroute | C | No | Yes | No | No | Maintenance | |
212 | 217 | | tracepath | C | No | Yes | No | No | Maintenance | |
213 | | -| **ttl** | Rust | Yes | Yes | Yes | Yes | Active | |
| 218 | +| **ttl** | Rust | Yes (per-flow + per-packet) | Yes | Yes | Yes | Active | |
214 | 219 |
|
215 | 220 | --- |
216 | 221 |
|
|
0 commit comments