Releases: bojieli/queqiao
Release list
v0.6.3
v0.6.2
What's Changed
- fix(pep): free wedged lane-admission slots at the rescue ceiling by @bojieli in #101
- release: v0.6.2 by @bojieli in #102
Full Changelog: v0.6.1...v0.6.2
v0.6.1
v0.6.0
What's Changed
- feat(portmux): reactive UDP port hopping, fixed to actually hop by @bojieli in #90
- fix(portmux): CI and review follow-ups for port hopping by @bojieli in #91
- fix(pep): detect flow stalls at 3x minRTT and race parallel rescue dials by @bojieli in #92
- fix(pep): do not fall back on lane-capacity refusals in rescue races by @bojieli in #93
- Locate a deployment's loss to a path segment, measured from both ends by @bojieli in #94
- release: v0.6.0 by @bojieli in #95
- docs: update download links to v0.6.0 by @bojieli in #96
- fix(portmux): skip a hop port the host will not bind by @bojieli in #97
Full Changelog: v0.5.1...v0.6.0
v0.5.1
v0.5.1 - 2026-09-02
Changed
-
When
--local-address if:NAMEor--local-address autois used, the outer
UDP and TCP sockets now callIP_BOUND_IF(IPv4) andIPV6_BOUND_IF(IPv6)
in addition to binding to the resolved IP address. This sets the kernel
INP_BOUND_IFflag, which is whatNEAppProxyFlow.isBoundreflects in the
macOS Network Extension API.The practical effect is that transparent proxy software on macOS that honours
isBound— including Tunless with its default--capture-bound-flows=false
setting — will now automatically bypass queqiaod's outer transport sockets
without any per-process exclusion rule. The outer connection to the upstream
gateway routes directly via the named interface as before; the only change is
that the intent is now declared at the OS socket level rather than implied by
the IP address alone.A literal
--local-address 192.0.2.1is unchanged: the interface is inferred
from routing, not declared, soIP_BOUND_IFis not set.
Fixed
- The bundled China preset keeps Chinese services direct by name, not only by
address, and the registry set is refreshed to APNIC serial 88964. The address
set records where a block was delegated, which is not where it is used, so a
Chinese service answering from a CDN in space delegated elsewhere never
matched GEOIP,CN and took the tunnel while the toggle said direct: ip138.com
answers 138.113.x and bilibili.com 148.153.x, and a Chinese resolver returns
those same addresses, so nothing was being mis-resolved and no fresher list
could have helped. The preset now names the major Chinese services on TLDs
that a .cn rule cannot reach, together with the CDN and asset domains they
load from, and keeps GEOIP,CN last so the names are reached first. It is a
starting point rather than coverage: a geosite-derived list pasted into the
rule editor is still the way to be thorough. Refreshing the registry set moved
three blocks in ten days, which is the measure of how little staleness was
ever the problem.
v0.5.0
What's Changed
- fix(ios): keep the packet tunnel inside the memory ceiling iOS enforces by @bojieli in #82
- feat: ask whether the gateway is on the useful side of the path by @bojieli in #83
- feat: a routing rule matcher, and a reader for the set it asks by @bojieli in #80
- feat: route by rule, including by name by @bojieli in #81
- refactor(ios): make routing one setting, changeable while connected by @bojieli in #85
- docs: assemble v0.5.0 from the pending fragments by @bojieli in #86
Full Changelog: v0.4.0...v0.5.0
v0.4.0
v0.3.1
What's Changed
- fix: the sample shape never left the controller by @bojieli in #75
- release: v0.3.1 by @bojieli in #76
Full Changelog: v0.3.0...v0.3.1
v0.3.0
What's Changed
- fix: make two release checks report what they actually know by @bojieli in #49
- fix: recover stale QUIC paths without restart by @Rhiks in #50
- fix: count QUIC connection telemetry once per connection by @bojieli in #51
- fix: record what a flow's lane replacements actually did by @bojieli in #54
- fix: export the loss the path caused, not only the share charged as congestion by @bojieli in #55
- fix: let the bandwidth estimate come down by @bojieli in #56
- fix: size the code for the erasure the path is measured to be doing by @bojieli in #52
- test: prove the code follows a channel that changes under a live flow by @bojieli in #58
- feat: publish the erasure the code is actually sized from by @bojieli in #59
- feat: publish the erasure an endpoint receives, and what the code left of it by @bojieli in #60
- feat: emulate a burst allowance, and record what it showed about the estimate by @bojieli in #62
- fix: detect same-address uplink reconnects by @Rhiks in #57
- fix: enforce bulk isolation connection budget by @Rhiks in #61
- feat: hold the sender back when the path is carrying a queue by @bojieli in #63
- change: stop reading loss as congestion by @bojieli in #64
- test: record that a policed path is unbraked, and bound one of its two causes by @bojieli in #65
- docs: record two rejected approaches to the sustained-rate estimate by @bojieli in #66
- fix: measure the sampler, then bound the bet that was actually wrong by @bojieli in #67
- fix: spend one lane replacement grace per outage, not per waiter by @bojieli in #68
- fix: a data race on main, and the instrumentation to read a real path by @bojieli in #69
- fix: do not put back a peak the filter has already forgotten by @bojieli in #70
- fix: escape Windows reserved port bands instead of walking into them by @bojieli in #72
- release: v0.3.0 by @bojieli in #74
New Contributors
Full Changelog: v0.2.0...v0.3.0
v0.2.0
What's Changed
- chore: publish without a deployment approval prompt by @bojieli in #18
- fix: stop dead flows freezing the exported RTT estimate by @bojieli in #24
- fix: keep local casualties out of the measured erasure rate by @bojieli in #25
- fix: end the replacement grace when nothing will replace the lane by @bojieli in #27
- docs: define the contract for adding an external benchmark transport by @bojieli in #28
- fix: make refused lane joins visible on the endpoint refusing them by @bojieli in #26
- feat: add kcptun to the benchmark matrix by @bojieli in #29
- docs: complete the external-transport contract by @bojieli in #30
- fix: make one telemetry record answer the question it raises by @bojieli in #31
- fix: keep provider state owned by the account that reads it by @bojieli in #33
- deploy: one-command gateway and client installers, and the capability the unit was missing by @bojieli in #32
- fix: say which enrollment failed, and why, where an operator can see it by @bojieli in #34
- Limit accounts by device, not by connection count by @bojieli in #35
- fix: report how stale the authorization state actually is by @bojieli in #36
- chore: write the changelog once, at release, from one file per change by @bojieli in #38
- fix: restore the analysis job on main by @bojieli in #39
- fix: build the staleness test against the account limits it merged into by @bojieli in #40
- fix: read the changelog label when the job runs, not when the PR opened by @bojieli in #41
- docs: give v0.1.1 the release notes it shipped without by @bojieli in #43
- docs: start from a published binary, not from a build by @bojieli in #44
- test: take the shared test port from the allocator that was refusing it by @bojieli in #47
- One rate limiter behind all three storm-suppressed records by @bojieli in #42
- fix: let the installed client read its own interfaces by @bojieli in #46
- release: v0.2.0 by @bojieli in #45
- release: record the two fixes that landed after v0.2.0 was cut by @bojieli in #48
Full Changelog: v0.1.1...v0.2.0