Files
app-flutter/docs/impl/reports/LINK-TEST-2026-10-11.md
T

64 lines
2.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
type: report
date: 2026-10-11
---
# USB link test: plain cable vs PD hub
Does the PD hub degrade the tablet ⇄ Orin USB (NCM) link? Measured from the app
(the only place on the tablet whose sockets use the link) with the link test,
`lib/linktest.dart` + `tool/linktest_server.py`.
## Short version
- **No measurable effect of the PD hub**, with or without the charger connected.
All three setups: 0% loss at every size and rate up to 500 packets/s, the same
latencies, 0 TCP retransmits.
- **The loss seen earlier the same day did not come back.** Before these runs,
ICMP ping from the Orin lost 2.5–32% at 20 packets/s through the hub. After a
replug, the same ping sweep is 0% through the hub too. That connection was in
a bad state; the hub is not shown to be the cause. Cause unknown; worth
watching for (the soak below is the app-shaped check).
- **The link is asymmetric:** tablet → Orin ~22 MB/s, Orin → tablet 1.9–5.6 MB/s
and variable, with ~30 ms RTT under load and no loss (the Orin's gadget TX side
queues rather than drops).
- **App-shaped traffic is fine:** 30 s at 10 packets/s, longest silence ≤ 144 ms,
against a 5 s heartbeat timeout.
- **adb push through the SSH tunnel stays slow (0.14 MB/s, 223 Orin retransmits
per 20 MB) on a healthy link**, while the app's TCP over the same link runs at
5.6 MB/s with none. Specific to the adbd connection; not the hub, not routing
(`tcp_fwmark_accept=1`). Unexplained.
## Results
Link USB 2.0 high-speed in all runs. TCP: 5 s each way; UDP: 3 s per cell, RTT
p50 / p99 / max in ms.
| | Plain C-to-C | Hub + charger | Hub, no charger |
|---|---|---|---|
| UDP loss, 64 B and 1400 B, 10–500 /s | 0% | 0% | 0% |
| UDP 64 B 10/s RTT | 4.1 / 24.2 / 24.2 | 4.0 / 10.5 / 10.5 | 4.1 / 5.6 / 5.6 |
| UDP 1400 B 500/s RTT | 2.8 / 7.3 / 39.7 | 2.7 / 9.4 / 42.5 | 2.7 / 16.6 / 60.2 |
| Soak 64 B 10/s 30 s: loss, max gap | 0%, 144 ms | 0%, 135 ms | 0%, 104 ms |
| TCP Orin → tablet | 1.85 MB/s | 4.06 MB/s | 5.57 MB/s |
| TCP tablet → Orin | 21.8 MB/s | 22.4 MB/s | 22.6 MB/s |
| Orin TCP retransmits | 0 | 0 | 0 |
| ICMP ping from the Orin, 20/s, 56–1472 B | 0% | 0% | 0% |
For reference, the same test over WiFi to the Orin's LAN address: 0% loss, about
25 MB/s each way.
Raw records: `~/linktest/results.jsonl` on the car Orin; tabulate with
`python3 tool/linktest_summary.py ~/linktest/results.jsonl [label…]`.
## Running it
On the Orin: `python3 linktest_server.py` (from `tool/`, copied to `~/linktest/`).
On the tablet: **Link test** in the link bar, or remotely:
```bash
adb -s localhost:15555 shell am start -n dev.yukart.display/.MainActivity --es linktest <label>[@<host>]
```
The host defaults to the gateway's. A run takes about 75 s and reports each
result to the Orin as it goes.