The test sends data between this browser and the nearest Cloudflare server. It uses approximately 0.5–2 GB on a fast line. Browsers cannot set DSCP marks, so this test measures unmarked traffic only. Results show the speed of the device and network that you use now.
The ISP slows all upstream packets that have the DSCP mark CS1. The limit is approximately 1–2 Mbps. The ISP also slows the mark AF12 to approximately 25 Mbps. Other marks are not affected. Downloads are not affected.
OpenSSH on Linux uses the mark CS1 for bulk transfers. Thus, scp, rsync and other SSH uploads from the LAN were almost stopped.
The gateway now clears all DSCP marks on the WAN port. A timer on the gateway applies this setting again after each reboot. The Linux hosts also do not set DSCP marks on SSH traffic now. CS1 uploads operate at the full line rate.
We sent the same upload with different DSCP marks. We sent each test in the same minute. Only the mark changed.
The limit applies to exact DSCP values. DSCP 9 is adjacent to CS1, but it operates at full speed. Thus, the cause is a classifier that looks for specific values.
CS1 pings to 1.1.1.1 had 0% loss. But large CS1 pings had more delay:
| Ping | Mark | Avg RTT |
|---|---|---|
| 1400 bytes | none | 2.4 ms |
| 1400 bytes | CS1 | 11.8 ms |
The added delay is approximately 10 ms for one 1428-byte packet. This agrees with a queue that drains at approximately 1 Mbps.
We captured packets on the gateway with tcpdump. We recorded the time of each CS1 packet at each interface.
We cannot see the ISP configuration. The data agrees with this explanation:
| Item | Result |
|---|---|
| Smart Queues (SQM) | OFF on all WANs |
| Traffic rules / QoS rules | None |
| Custom firewall policies | None |
| DSCP rules in iptables / nftables | None |
| Gateway queue disciplines | Default only (mq + pfifo_fast) |
| Intrusion Prevention (IPS) | OFF/ON test: no change |
| Path MTU | Clean (1472-byte DF ping passes) |
| Line capacity (unmarked) | ~2 Gbps up and down |
The gateway kernel does not have a DSCP rewrite module. The iptables DSCP target, act_pedit and dsmark are all not available. The cake queue discipline is available. Its wash option clears the DSCP field on egress.
One cake instance on the WAN root limited the line to approximately 1.25 Gbps. One CPU core did all the work. Thus, we put one cake instance on each of the four transmit queues:
# one cake instance per TX queue, DSCP wash, no rate limit # modprobe sch_cake # tc qdisc replace dev <wan> root handle 1: mq # for q in 1 2 3 4; do tc qdisc replace dev <wan> parent 1:$q cake unlimited besteffort wash done # revert to the default # tc qdisc del dev <wan> root
A packet capture shows the result. A CS1 packet enters the gateway with tos 0x20. It leaves the WAN port with tos 0x00.
A reboot, a firmware update or a change to the WAN settings removes the queue setting. Thus, we installed a systemd timer on the gateway:
/data, which keeps its contents after a reboot.Each Linux host on the LAN now has this OpenSSH client setting:
IPQoS none
SSH then sends unmarked packets. This setting gives protection if the gateway setting is not there. The base build script for new hosts also includes it.
We removed the workaround and then installed it again, in the same minute.
| Workaround | none | CS1 | AF12 |
|---|---|---|---|
| Removed | 520 | 2 | 26 |
| Installed | 401 | 335 | 653 |
| Installed (second LAN host) | 452 | 279 | 464 |
| Test | Avg | 10 s min–max | Data |
|---|---|---|---|
| CS1, 1 stream, 60 s | 398 | 363–428 | 3.0 GB |
| CS1, 4 streams, 120 s | 1,302 | 1,190–1,452 | 19.5 GB |
| none, 4 streams, 60 s | 1,343 | 1,226–1,430 | 10.1 GB |
We used 18 parallel uploads (6 processes × 3 streams) for 45–60 s per test. The LAN host has a 2.5 GbE link.
-o IPQoS=cs1. Status: pending.Decision: The owner will not send a fault report to the ISP. The workaround stays in place.
IP_TOS set per connection. HTTPS POST to speed.cloudflare.com/__up.ssh -o IPQoS=cs1 against ssh -o IPQoS=none, 200 MB upload.ping -Q.tcpdump -i any on the gateway. Per-interface timestamps.tc -s qdisc, iptables-save, /proc/stat, kernel config.