Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,14 @@ The format follows [Keep a Changelog](https://keepachangelog.com/); versions fol

### Added

- **Different values for uploads and downloads.** A new "Asymmetry" card. Leave it off and
one set of numbers applies both ways, as before. Tick it and the fields above it describe
downloads only, while seven new ones describe uploads: latency, jitter, spike chance and
size, loss, corruption and duplication. They start as copies of what you already typed, so
nothing changes until you edit them. Reach for it when an app browses fine but struggles to
send: a video call, a file upload. On the command line: `--asym`, then `--loss-up`,
`--latency-up` and the rest. Profiles remember it.

- **A blocked connection can be refused instead of ignored.** A new "Refuse blocked
connections" checkbox in the Block card, and `--block-reject`. Without it a blocked
connection gets no answer and the program you are testing waits until it gives up on its
Expand All @@ -19,6 +27,22 @@ The format follows [Keep a Changelog](https://keepachangelog.com/); versions fol
An existing stats CSV is rotated to a dated backup the first time the new column is
written.

### Changed

- **A warning when a one-way traffic filter would ignore half your asymmetry settings.**
The "Outgoing only" and "Incoming only" traffic filters work inside the driver, so the other
direction never reaches the tool at all. With asymmetry on, that means half the values you
typed describe traffic this session cannot see - and until now nothing said so: the session
description still listed them and the counters looked like the tool ignoring its own form.
The run now says it once, and still runs, because impairing one direction on purpose is a
perfectly good thing to ask for.

- **Some command-line shortcuts stopped working, and the full flags did not.** Adding the
upload flags means `--latency` is no longer the only option starting with "latency", so
short forms like `--lat`, `--jit`, `--j`, `--cor` and `--spike-p` are now ambiguous and are
refused. Every full flag still works, so saved reproduction commands and every example in
this documentation are unaffected - only hand-typed abbreviations need writing out in full.

## [0.6.0] - 2026-09-04

### Added
Expand Down
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -760,6 +760,10 @@ BeanNetworkTester.exe --simulate --duration 30 --format json > run.ndjson
| `--rst-prob` `--rst-cooldown` | % / s | percentage of connections torn with RST and how long the tear-down is held |
| `--flap-period` `--flap-down` | s / % | cyclic link outage: how often and for what fraction of the period |
| `--rate-schedule` | - | changing throughput: `"time:download:upload,..."` in KB/s, looped |
| `--asym` | - | give uploads their own values. Without it one set of numbers applies both ways, which is the default |
| `--loss-up` `--corrupt-up` `--dup-up` | % | the same three impairments, for packets this machine SENDS. Used only with `--asym` |
| `--latency-up` `--jitter-up` | ms | delay and its variation, for packets this machine SENDS. Used only with `--asym` |
| `--spike-prob-up` `--spike-ms-up` | % / ms | the occasional longer delay, for packets this machine SENDS. Used only with `--asym` |
| `--ipv4-only` `--ipv6-only` | - | impair one address family only. The other keeps flowing untouched - this aims the tool, it does not block a protocol. Works with `--dst-ip` empty too, which means all addresses. Both flags at once exclude each other, nothing is impaired, and the log says so |
| `--lan-mode` | - | LAN mode: cut off the internet (public addresses), keep the local network |
| `--internet-only` | - | the mirror: cut off the local network (10.x, 172.16-31.x, 192.168.x, link-local, CGNAT), keep the internet. Loopback keeps working. Careful: DNS asked of your router is local traffic, so the internet can stop working with it |
Expand Down
20 changes: 20 additions & 0 deletions beantester/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,26 @@ def build_arg_parser():
"bounds the queueing delay a rate-limited link builds up "
"before it drops (bufferbloat)")
_add_scope_arguments(p)
# Asymmetry. The flags read `<what>-up`, which is how every other modifier in
# this parser reads (--loss-burst, --spike-prob, --rst-cooldown, --flap-down).
# 馃敶 The abbreviation cost was MEASURED before the names were chosen, exactly
# as it was for --loss-burst: `allow_abbrev` is on (ADR 2026-08-02), so a
# second option starting with `latency` makes `--lat` ambiguous. 18 prefixes
# that work today stop working (--lat, --jit, --j, --cor, --spike-p and the
# longer forms of each). Every FULL flag survives, because an exact match
# beats a prefix one, so no repro command and no documented example moves.
# Guarded by test_cli_runtime.py::test_the_flags_that_gained_an_up_neighbour_still_work.
p.add_argument("--asym", action="store_true",
help="apply the --*-up values to the upload direction. Without "
"it the link is symmetric and those values are unused")
p.add_argument("--loss-up", type=float, help="packet loss, upload [%%]")
p.add_argument("--corrupt-up", type=float, help="corruption, upload [%%]")
p.add_argument("--dup-up", type=float, help="duplication, upload [%%]")
p.add_argument("--latency-up", type=float, help="latency, upload [ms]")
p.add_argument("--jitter-up", type=float, help="jitter, upload [ms]")
p.add_argument("--spike-prob-up", type=float,
help="latency spike probability, upload [%%]")
p.add_argument("--spike-ms-up", type=float, help="latency spike size, upload [ms]")
p.add_argument("--syn-drop", type=float, help="dropped TCP SYN rate [%%]")
p.add_argument("--max-size", type=int, help="MTU black hole: drop packets > N B")
p.add_argument("--spike-prob", type=float, help="latency spike probability [%%]")
Expand Down
Loading
Loading