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
19 changes: 19 additions & 0 deletions .cargo/mutants.toml
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,21 @@
# Replacing the feature query with whichever boolean matches the host CPU's actual
# capability produces 100% identical runtime behaviour to unmutated code, making either
# direction an equivalent mutant depending on the CI host machine.
# 14. `replace .* in pq_encapsulate` (yip-crypto/src/lib.rs ~lines 90-92)
# `pq_encapsulate` manually validates FIPS 203 Section 7.2 ByteDecode_12 (all 12-bit
# coefficients < 3329) prior to calling `ml_kem_512::EncapsulationKey::new(&ek_arr)`.
# However, `EncapsulationKey::new` in the `ml-kem` crate (v0.3.3) itself decodes the
# polynomial vectors and validates ByteDecode_12, returning an error which maps to
# `CryptoError::Handshake`. Any mutant that alters or disables the manual pre-check
# causes `EncapsulationKey::new` to reject the invalid key and return the identical
# `CryptoError::Handshake`, making all mutations within the manual ByteDecode_12 loop
# equivalent mutants.
# 15. `replace < with <= in FecReassembler::push` (yip-transport/src/fec.rs ~line 376)
# `if shard_data.len() < state.shard_len { shard_data.resize(state.shard_len, 0); }`.
# Incoming shard wire lengths are strictly bounded by `<= state.shard_len` via the
# preceding `expected_wire_len` guard. When `shard_data.len() == state.shard_len`,
# resizing to `state.shard_len` is an exact no-op on a `Vec` whose length already equals
# the target length. Both `<` and `<=` produce byte-for-byte identical shard states.
exclude_re = [
"replace \\| with \\^ in ReplayWindow::commit",
"replace > with >= in ReplayWindow::commit",
Expand All @@ -138,6 +153,7 @@ exclude_re = [
"replace > with >= in FecEncoder::build",
"replace < with <= in split_source",
"replace < with > in FecReassembler::push",
"replace < with <= in FecReassembler::push",
"replace > with >= in LossDetector::on_seen",
"replace \\+ with \\* in LossDetector::on_seen",
"replace neon_supported -> bool with (true|false)",
Expand All @@ -147,4 +163,7 @@ exclude_re = [
"replace avx2_supported -> bool with (true|false)",
"replace avx512bw_supported -> bool with (true|false)",
"replace gfni_supported -> bool with (true|false)",
"replace .* in pq_encapsulate",
]

skip_calls = ["reserve"]
8 changes: 4 additions & 4 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -117,13 +117,13 @@ All benchmark charts are generated deterministically from verified testbed data.
<!-- BENCHMARK-TABLE-START -->

<!-- generated by crates/yip-bench/wan/collect.sh -->
*Two 1-vCPU Debian 13 VPSes, ~54.734 ms apart, 2026-10-24. yip trades raw clean-path throughput for loss resilience — see the FEC row.*
*Two 1-vCPU Debian 13 VPSes, ~58.649 ms apart, 2026-10-26. yip trades raw clean-path throughput for loss resilience — see the FEC row.*

| | TCP 1-stream | UDP loss (200M) | effective loss @10% injected |
|---|--:|--:|--:|
| **yip** | 254.0 Mbit/s | 0.00% | 0% |
| **WireGuard** | 423.3 Mbit/s | 0.00% | 14% |
| **OpenVPN** | 25.0 Mbit/s | 11.81% | 10% |
| **yip** | 255.4 Mbit/s | 1.76% | 2% |
| **WireGuard** | 375.9 Mbit/s | 0.01% | 12% |
| **OpenVPN** | 21.2 Mbit/s | 0.09% | 17% |

<!-- BENCHMARK-TABLE-END -->

Expand Down
40 changes: 20 additions & 20 deletions assets/bench-fec-recovery.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading