## Description
We saw `open_path_validation_fails_server_side` fail intermittently in
[daily CI on
FreeBSD](https://github.com/n0-computer/noq/actions/runs/33142246096),
and matheus23 asked me to look into it. The test advanced with a single
`advance_time()`, which jumps to the earliest timer pending on *either*
endpoint, and assumed that jump lands on the client's 8s path-idle
deadline for the blackholed path. It usually does. When the client
happens to do a routine key update shortly before that deadline — PN
phase exhaustion, which depends on the randomly chosen initial packet
number — the server arms `KeyDiscard` at 3x PTO, and that fires about
100ms earlier. The jump lands there instead, `drive()` then stops
stepping because `Connection::is_idle` discounts the idle timers that
remain, and virtual time never reaches the deadline. The path-idle timer
stays armed the whole time and the connection behaves correctly; the
single jump in the test is the bug.
The fix, as suggested by matheus23: a `drive_until_timer` helper that
steps to each next wakeup and drives both endpoints until the target
timer is no longer armed. `drive()` can't reach an idle timeout on its
own — `is_idle` discounts exactly the timers a test would be waiting for
— so this needs its own loop. The test now calls it instead of
`advance_time()`.
## API Changes
None, test changes only.
## Notes & open questions
- I'm an agent posting from my own account (`n0-grookie`), so I left the
"created by a human" box below unticked. matheus23 asked for the PR
after reviewing the commits.
- Measured on a seeded sweep over `StdRng::seed_from_u64()` driving the
same `ConnPair` setup as the test: 82 of 20000 seeds failed before, 0 of
50000 after. Seed-dependent rather than platform-dependent — the same
seeds fail on Linux, which is how I measured it. The sweep is scratch
code and not in the commit; it can go in behind an `#[ignore]` if a
repeatable sweep is worth having.
- `drive_until_timer` panics rather than hangs if the timer is still
armed after 1024 steps, and a *cancelled* timer also ends the loop —
callers should keep asserting on the event they expect. Both are in the
doc comment.
- I went through the other `advance_time()` call sites in `src/tests`.
They step to the next scheduled timer and assert on whatever arrives
(`multipath.rs:2124` expects `Established`, the `mod.rs:4746` pair
checks draining delays), so they don't carry this test's assumption that
the jump lands on a specific deadline. Left them as they are.
- No issue linked: it came out of daily CI and the fix was reviewed out
of band.
## Change checklist
- [x] Self-review.
- [x] Documentation updates following the [style
guide](https://rust-lang.github.io/rfcs/1574-more-api-documentation-conventions.html#appendix-a-full-conventions-text),
if relevant.
- [x] Tests if relevant.
- [ ] This PR was created by a human that thought critically about the
proposed change and wrote an as clear and concise description as
they could.
- [x] This PR isn't slop, and is carefully crafted to do have the
intented effect.
- [x] `cargo make` passes locally.
---------
Co-authored-by: n0-grookie <322172879+n0-grookie@users.noreply.github.com>
## Description
Currently you can get noq to panic if you use read_to_end, drop the
resulting future before completion, then use an ordered read. The reason
is that read_to_end uses the unordered read api for optimisation, so the
underlying stream gets into unordered mode.
~~I don't think the performance benefit of read_to_end using the
unordered API is major in most cases, so the fix is to just use the
ordered API in read_to_end. That way the only way you can get into
unordered mode is by explicitly switching to the unordered API.~~
Update: we want to keep the performance optimization, so now dropping a
read_to_end future after it puts the underlying stream in unordered mode
means that all subequent calls to read_to_end (or any other ordered read
operation) will lead to a ClosedStream error.
Which I think is fair since read_to_end is explicitly documented as not
cancel safe, so you shouldn't have any expectations about what state the
stream is in after dropping a cancel-safe future.
fixes https://github.com/n0-computer/iroh/issues/4497
## Breaking Changes
`noq_proto::RecvStream::is_ordered` is a new API.
## Notes & open questions
<!-- Any notes, remarks or open questions you have to make about the -->
<!-- PR. -->
## Change checklist
<!-- Remove any that are not relevant. -->
- [x] Self-review.
- [x] Documentation updates following the [style
guide](https://rust-lang.github.io/rfcs/1574-more-api-documentation-conventions.html#appendix-a-full-conventions-text),
if relevant.
- [x] Tests if relevant.
- [x] All breaking changes documented.
- [x] This PR was created by a human that thought critically about the
proposed change and wrote an as clear and concise description as
they could.
- [x] This PR isn't slop, and is carefully crafted to do have the
intented effect.
- [x] `cargo make` passes locally.
## Description
Adds functions to send and receive batches of datagrams. Particularly
the
locking overhead in noq stands out and is reduced. But also adds batch
APIs into noq-proto and the driver needs to be woken fewer times.
## API Changes
New APIs:
- noq_proto
- `Datagrams::send_many`
- `Datagrams::recv_many`
- noq
- `Connection::read_many_datagrams`
- `Connection::send_many_datagrams`
## Notes & open questions
n/a
## Change checklist
- [x] Self-review.
- [x] Documentation updates following the [style
guide](https://rust-lang.github.io/rfcs/1574-more-api-documentation-conventions.html#appendix-a-full-conventions-text),
if relevant.
- [x] Tests if relevant.
- [x] All breaking changes documented. *(none)*
## Description
The breaking changes section is too narrow really today. We need to be
able to identify API additions and deprecations mostly. Breaking
changes only comes back once we work towards 2.0.
Additionally stop encouraging folks to remove some checkboxes. I'd
rather have them un-ticked.
## Breaking Changes
n/a
## Notes & open questions
- Also updates chacha20 to avoid yanked versions that contain UB.
- Removes the perf job, not very useful in it's current state (and
broken).
## Change checklist
- [x] Self-review.
- [x] Documentation updates following the [style
guide](https://rust-lang.github.io/rfcs/1574-more-api-documentation-conventions.html#appendix-a-full-conventions-text),
if relevant.
- [x] Tests if relevant.
- [x] All breaking changes documented.
- [x] This PR was created by a human that thought critically about the
proposed change and wrote an as clear and concise description as
they could.
- [x] This PR isn't slop, and is carefully crafted to do have the
intented effect.
- [x] `cargo make` passes locally.
## Description
Docs are nice but they should be maintained. For now we don't think
this adds much value. It's also not published anywhere and entirely
undiscoverable.
Closes#765.
## Breaking Changes
Outside of scope.
## Notes & open questions
n/a
## Change checklist
- [x] Self-review.
- [x] Documentation updates following the [style
guide](https://rust-lang.github.io/rfcs/1574-more-api-documentation-conventions.html#appendix-a-full-conventions-text),
if relevant.
- [x] Tests if relevant.
- [x] All breaking changes documented.
- [x] This PR was created by a human that thought critically about the
proposed change and wrote an as clear and concise description as
they could.
- [x] This PR isn't slop, and is carefully crafted to do have the
intented effect.
- [x] `cargo make` passes locally.
## Description
- Uses `--locked` to ensure we only use deps from the lock file
- Adds cooldown period to dependabot
- pins actions versions
- introduces zizimor and pinact
## Breaking Changes
<!-- Optional, if there are any breaking changes document them,
including how to migrate older code. -->
## Notes & open questions
<!-- Any notes, remarks or open questions you have to make about the -->
<!-- PR. -->
## Change checklist
<!-- Remove any that are not relevant. -->
- [ ] Self-review.
- [ ] Documentation updates following the [style
guide](https://rust-lang.github.io/rfcs/1574-more-api-documentation-conventions.html#appendix-a-full-conventions-text),
if relevant.
- [ ] Tests if relevant.
- [ ] All breaking changes documented.
- [ ] This PR was created by a human that thought critically about the
proposed change and wrote an as clear and concise description as
they could.
- [ ] This PR isn't slop, and is carefully crafted to do have the
intented effect.
- [ ] `cargo make` passes locally.
---------
Co-authored-by: Friedel Ziegelmayer <me@dignifiedquire.com>
## Description
syncs BBR3 from quinn.
It's important to know that the latest version requires a breaking
change to the controller-related traits. To avoid this breaking change,
the BBR3 code itself is left untouched and the trait implementation
defers to current api. I found this approach the best middle ground to
keep it easy to sync once we are able to introduce breaking changes
again.
## Breaking Changes
None
## Notes & open questions
none
## Change checklist
<!-- Remove any that are not relevant. -->
- [x] Self-review.
- [x] Documentation updates following the [style
guide](https://rust-lang.github.io/rfcs/1574-more-api-documentation-conventions.html#appendix-a-full-conventions-text),
if relevant.
- [x] Tests if relevant.
- [x] All breaking changes documented.
- [x] This PR was created by a human that thought critically about the
proposed change and wrote an as clear and concise description as
they could.
- [x] This PR isn't slop, and is carefully crafted to do have the
intented effect.
- [ ] `cargo make` passes locally.
## Description
Fixes#781.
`handle_coalesced` accounts for the datagram with
`path_data_mut(path_id)`, which panics via `expect("known path")`.
Nothing upstream of it guarantees the path exists.
`early_discard_packet` only drops a datagram when the path id is in
`abandoned_paths`, so a path id that is in neither `paths` nor
`abandoned_paths` passes both guards. The first packet of such a
datagram is then handled gracefully by the unknown-path check in
`process_decrypted_packet`, but the coalesced remainder reaches
`handle_coalesced` and panics.
The remainder is now discarded instead, matching that existing
unknown-path handling.
The new test `coalesced_datagram_for_never_opened_path_is_ignored`
covers exactly that case: it replays a captured coalesced datagram under
a path id that was never opened. It panics at `mod.rs:4163` without the
fix and passes with it. The existing
`stale_coalesced_datagram_after_path_discard_is_ignored` covers the
abandoned-path case and stays green either way, so the two tests do not
overlap.
The connect-and-capture setup was inlined in the existing test, so it is
extracted first (`connect_capturing_coalesced_datagram`,
`CoalescedDatagram::into_connection_event`) and both tests share it.
## Breaking Changes
None.
## Change checklist
- [x] Self-review.
- [x] Tests if relevant.
- [x] This PR was created by a human that thought critically about the
proposed change and wrote an as clear and concise description as
they could.
- [x] This PR isn't slop, and is carefully crafted to do have the
intented effect.
---------
Co-authored-by: Aleksandr Prilipko <alexander.prilipko@gmail.com>
## Description
This PR fixes a couple bugs: setting per path idle timers before
multipath is negotiated, inconsistent calculation of the timer, and
misleading docs based on wrong assumptions.
The timer arm/stop logic from `set_path_max_idle_timeout` and
`reset_idle_timeout` is moved into a single shared helper,
`rearm_path_max_idle_timer`, which now also enforces that the per-path
idle timer only applies once multipath has been negotiated. The previous
logic that re-armed the timer by accounting for already-elapsed idle
time based on the old deadline/timeout is also removed. This assumed the
timer had been set to `now + timeout`, which is very likely not true.
The real instant in which the timer was set, and the path was thus last
used is irrecoverable. Docs are adjusted to account for the changes.
`TimerTable::get` is marked `#[allow(unused)]` since it's no longer in
use. We might want to remove it later if it remains dead code.
## Breaking Changes
n/a
## Notes & open questions
n/a
## Change checklist
<!-- Remove any that are not relevant. -->
- [x] Self-review.
- [x] Documentation updates following the [style
guide](https://rust-lang.github.io/rfcs/1574-more-api-documentation-conventions.html#appendix-a-full-conventions-text),
if relevant.
- [x] This PR was created by a human that thought critically about the
proposed change and wrote an as clear and concise description as
they could.
- [x] This PR isn't slop, and is carefully crafted to do have the
intended effect.
- [x] `cargo make` passes locally.
## Description
This enables the auto-formatting to automatically format and wrap
comments so they do not exceed the length of the code.
This is still an experimental feature it seems, but we've had good
results with the import ordering so this might work out as well.
## Breaking Changes
none
## Notes & open questions
This is quite the bloodbath, probably should have been
expected. Partially I wish we could enable this only for new code but
hey.
I've fixed up the worst things, let me know if there's still anything
else that needs fixing up.
I'd secretly like to set this to 92 rather than 100. But I guess that
would be pushing my personal preferences too far.
It this works we should probably also do this on iroh.
I love the irony that the line in the Makefile.toml is now well over
100 characters long.
I'd prefer to only merge this by consensus, vetos are also accepted.
## Change checklist
- [x] Self-review.
- [x] Documentation updates following the [style
guide](https://rust-lang.github.io/rfcs/1574-more-api-documentation-conventions.html#appendix-a-full-conventions-text),
if relevant.
## Description
We do not rely on this, and the implementation is broken on musl.
Fixes#774.
## Breaking Changes
n/a
## Notes & open questions
We need to run tests on musl in CI somehow.
## Change checklist
- [x] Self-review.
- [x] Tests if relevant.
- [x] This PR was created by a human that thought critically about the
proposed change and wrote an as clear and concise description as
they could.
- [x] This PR isn't slop, and is carefully crafted to do have the
intented effect.
- [x] `cargo make` passes locally.
---------
Co-authored-by: dignifiedquire <me@dignifiedquire.com>
## Description
Extends `posix_minimal` to `wasm32-wasip2` and makes that backend build
there.
- `UdpSockRef`'s descriptor-based constructor was `cfg(unix)`;
`std::os::fd::AsFd` covers
unix and wasi alike.
- `recv` uses `recv_from`: wasi has no vectored read, and `BATCH_SIZE`
is 1 regardless.
- `set_nonblocking` goes through `std`. socket2 uses `fcntl(F_SETFL,
O_NONBLOCK)`, which
WASI rejects; `std` uses `ioctl(FIONBIO)`, which it accepts.
espidf is unaffected, verified with the CI line:
``` bash
cargo check -Z build-std=std,panic_abort --target riscv32imc-esp-espidf -p noq-udp --no-default-features
```
Fixes#772.
## Breaking Changes
None.
## Notes & open questions
- The alias comment read "Unix-family platforms"; WASI is not one, so it
now reads "Platforms". A separate alias or a rename may suit you better
- happy to change it.
- The integration suite builds and runs on wasip2 under wasmtime:
`basic`, `basic_src_ip` and `socket_buffers` pass, `gso` is ignored as
it is elsewhere. That would be the first executable coverage
`posix_minimal` has had, since the espidf job is `cargo check`. Not
included here - it needs a blocking helper spanning unix/windows/wasi,
because `set_nonblocking(false)` in the tests hits the same `fcntl`
problem, plus a decision on gating the four ECN tests. Happy to open it
separately.
## Change checklist
- [x] Self-review.
- [x] Documentation updates following the [style
guide](https://rust-lang.github.io/rfcs/1574-more-api-documentation-conventions.html#appendix-a-full-conventions-text),
if relevant.
- [x] Tests if relevant.
- [x] All breaking changes documented.
- [x] This PR was created by a human that thought critically about the
proposed change and wrote an as clear and concise description as
they could.
- [x] This PR isn't slop, and is carefully crafted to do have the
intented effect.
- [x] `cargo make` passes locally.
Co-authored-by: user <email@example.com>
## Description
Updates deps to latest and adjusts deny.toml entries accordingly. Pins
the aws-lc crates to the current version. New versions generate cryptic
errors
## Breaking Changes
n/a
## Notes & open questions
prompted by several dependabot commits from quinn that were not applied
in the latest sync.
These were not applied due to several reasons:
- Cherry picking `Cargo.lock` updates often gives wrong results.
`Cargo.lock` must always be generated by cargo itself.
- We still should keep our deps updated within compatible versions.
## Change checklist
- [x] Self-review.
- [x] This PR was created by a human that thought critically about the
proposed change and wrote an as clear and concise description as
they could.
- [x] This PR isn't slop, and is carefully crafted to do have the
intented effect.
- [x] `cargo make` passes locally.
## Description
Currently they start finishing at around 9 CEST. Let's move them 2h
earlier.
## Breaking Changes
n/a
## Notes & open questions
n/a
## Change checklist
- [x] Self-review.
- [x] This PR was created by a human that thought critically about the
proposed change and wrote an as clear and concise description as
they could.
- [x] This PR isn't slop, and is carefully crafted to do have the
intented effect.
- [x] `cargo make` passes locally.
## Description
Updates `CONTRIBUTING.md` to include some basic guidance to new
contributors
and instructions for maintainers for syncing quinn
## Breaking Changes
n/a
## Notes & open questions
Not meant to be super extensive. We could add more as we find what works
best
for this repo
## Change checklist
<!-- Remove any that are not relevant. -->
- [x] Self-review.
- [x] Documentation updates following the [style
guide](https://rust-lang.github.io/rfcs/1574-more-api-documentation-conventions.html#appendix-a-full-conventions-text),
if relevant.
- [x] This PR was created by a human that thought critically about the
proposed change and wrote an as clear and concise description as
they could.
- [x] This PR isn't slop, and is carefully crafted to do have the
intented effect.
- [x] `cargo make` passes locally.
## Description
Because of dualstack hosts that can be on IPv4-only networks getting
errors is very normal. It is a bit strange to emit full on warnings
for these. Telling folks that they just shouldn't be trying to connect
to such an unreachable hosts is also a bit strange. Simply trying this
is the normal thing to do.
Fixes https://github.com/n0-computer/iroh/issues/4345
## Breaking Changes
n/a
## Notes & open questions
It feels a bit odd, but I'm like 99% sure this is the right thing to do.
## Change checklist
- [x] Self-review.
- [x] This PR was created by a human that thought critically about the
proposed change and wrote an as clear and concise description as
they could.
- [x] This PR isn't slop, and is carefully crafted to do have the
intented effect.
- [x] `cargo make` passes locally.
drive_timer() used AsyncTimer::poll() to determine whether a protocol
deadline had elapsed. Under Tokio's cooperative task budget,
Sleep::poll() may return Poll::Pending for an already-expired deadline
once the task's budget is exhausted, which can happen when
process_conn_events() drains a busy channel.
As a result, handle_timeout() is not called even though the deadline has
already elapsed. For QUIC, timers such as PTO, loss detection, and idle
timeouts are correctness-critical and should not be deferred to a later
scheduling round.
Fix this by checking runtime.now() >= deadline before consulting the
async timer. The clock is not subject to cooperative budgeting. The
timer remains responsible only for registering a wakeup when the
deadline lies in the future.
(cherry picked from commit 76020ba4ab)
When the `max_incoming` queue is full (or CIDs are exhausted), quinn
replied to each Initial with CONNECTION_REFUSED. Building that reply
derives the packet's initial keys, which is computationally expensive.
A flood of Initials then forces the endpoint's packet-processing task
to do per-Initial crypto work, leaving it less time for legitimate
packets and degrading already-established connections.
(cherry picked from commit d4fc3efd5e)
Enable SO_TIMESTAMPNS on Linux and Android, parse SCM_TIMESTAMPNS
ancillary messages, and expose timestamps via RecvMeta::timestamp.
(cherry picked from commit 9849790f02)
## Description
When we open a new path we send a path challenge, if that is lost
it is retried using the normal PTO schedule for tail-loss probes.
However the opening of the entire path was only tried for 3 * PTO,
which does only leave time for 2 retries. This makes opening a path
much more brittle wrt to packet loss than establishing a new
connection.
Instead this changes this to use the same mechanism to abandon a path
as when abandoning opening a new connection: keep sending tail-loss
probes, in this case path challenges, until the interval between the
tail-loss probes is larger than the path idle timeout. At which point
the normal idle timer will fire and abandon the path.
This removes the need for a separate timer to abort validation
of a path. It also removes a user-visible event as there is one less
reason a path can be abandoned for.
Another nice effect is that the poll_transmit no longer has to
figure out why an on-path path challenge is being sent in order to
set the right timer. It only has to arm the challenge PTO.
Fixes#686Fixes#687
## Breaking Changes
none
## Notes & open questions
This replaces 3 tests with one new one. I believe this together with
the open_path_validation_fails_* tests ensures the timers are set as
intended. The previous manual triggering of path challenges had a very
tight coupling between the code under test and how to trigger it. So
much that I felt directly adopting it would just be re-implementing
the same logic again.
The new test opens a new path and ensures lost challenges are reset
appropriately, which is exactly what needs to be tested. On an
existing path we never send new challenges, so those tests were very
artificial.
## Change checklist
- [x] Self-review.
- [x] Tests if relevant.
## Description
A fix was merged, nightly shouldn't complain anymore.
## Breaking Changes
None
## Change checklist
- [x] Self-review.
- [x] This PR was created by a human that thought critically about the
proposed change and wrote an as clear and concise description as
they could.
- [x] This PR isn't slop, and is carefully crafted to do have the
intented effect.
- [x] `cargo make` passes locally.
## Description
We have a lot of these jobs running way to long into the Europe
day. 04:00 UTC is 23:00 in the latest dev timezone so should be fine.
## Breaking Changes
n/a
## Notes & open questions
n/a
## Change checklist
- [x] Self-review.
- [x] This PR was created by a human that thought critically about the
proposed change and wrote an as clear and concise description as
they could.
- [x] This PR isn't slop, and is carefully crafted to do have the
intented effect.
- [x] `cargo make` passes locally.
## Description
- Adds a regression test that triggers the `debug_assert!(max_size >=
min_size);` in `packet_builder.rs`
- Fixes the coalescing logic in `poll_transmit_path_space` to not exit
the loop & function to go to the next space when coalescing.
- Adds a bunch of useful `trace!` logs to see what the server is doing
in response.
## Breaking Changes
None
## Notes & open questions
A bit more on what was going on:
There are two loops for building datagrams: `poll_transmit_on_path`,
which goes over `Initial`, `Handshake` and `Data`, as well as
`poll_transmit_path_space`, which loops *within* the same space to
produce *separate* datagrams (e.g. for producing multiple loss probes as
a GSO batch).
The regression test generated a situation where two things were true at
the same: The `Initial` space wants to send a small `PATH_ACK` (nothing
else), and the `Handshake` space wants to send some `CRYPTO`.
Inside `poll_transmit_path_space` when we were checking for coalescing,
we call `self.has_pending_packet`, which iterates through all spaces
starting at `Initial`. It's false for `Initial`, but ends up being true
for `Handshake`, because that has `CRYPTO` pending.
However, we then keep on looping inside `poll_transmit_path_space`,
creating packets again and again in the same `space_id = Initial`,
instead of exiting out of the loop to the next space.
Eventually we fill the datagram with enough packets such that the
`debug_assert!(max_size >= min_size);` in `packet_builder.rs` triggers,
because it doesn't take into account the retry tokens in the QUIC header
for `Initial` packets (which I think it shouldn't do? because we should
never be coalescing these anyways.).
## Change checklist
- [x] Self-review.
- [x] Documentation updates following the [style
guide](https://rust-lang.github.io/rfcs/1574-more-api-documentation-conventions.html#appendix-a-full-conventions-text),
if relevant.
- [x] Tests if relevant.
- [x] All breaking changes documented.
## Description
Follow-up from #748
- Refactors how `Draining` and `Drained` endpoint events are emitted:
They're now handled within state.rs.
- `move_to_draining` and `move_to_drained` are now passed `&mut
self.endpoint_events`.
This is a pure refactor without behavioral changes.
## Breaking Changes
None
## Change checklist
- [x] Self-review.
- [x] Documentation updates following the [style
guide](https://rust-lang.github.io/rfcs/1574-more-api-documentation-conventions.html#appendix-a-full-conventions-text),
if relevant.
## Description
Copied and adjusted from iroh.
## Breaking Changes
n/a
## Notes & open questions
Move the `cargo make` to a checkbox might be a bit harsh, but honestly
I more or less am in that habit already so probably ok.
## Change checklist
- [x] Self-review.
## Description
- Fixes a bug where the `Draining` event was emitted twice when a
stateless reset token was duplicated and received twice
- Adds a regression test for the above scenario
This is one of those bugs that triggers an underflow in
`active_connections` in noq.
## Breaking Changes
None
## Notes & open questions
I'm still investigating whether there are further such cases.
## Change checklist
- [x] Self-review.
- [x] Documentation updates following the [style
guide](https://rust-lang.github.io/rfcs/1574-more-api-documentation-conventions.html#appendix-a-full-conventions-text),
if relevant.
- [x] Tests if relevant.
- [x] All breaking changes documented.
## Description
Sets the correct user config for the action (we never ported this from
iroh) and lands some fixes to the script (numerical instead of lexical
sort, plus avoids negative head counts)
## Breaking Changes
<!-- Optional, if there are any breaking changes document them,
including how to migrate older code. -->
## Notes & open questions
<!-- Any notes, remarks or open questions you have to make about the -->
<!-- PR. -->
## Change checklist
<!-- Remove any that are not relevant. -->
- [ ] Self-review.
- [ ] Documentation updates following the [style
guide](https://rust-lang.github.io/rfcs/1574-more-api-documentation-conventions.html#appendix-a-full-conventions-text),
if relevant.
- [ ] Tests if relevant.
- [ ] All breaking changes documented.
<!--
tip:
Run `cargo make` in the workspace root to check many light-weight CI
steps locally.
-->
## Description
This updates semver checks with the following behaviour:
- The baseline for the check is now the latest published release on
crates.io
- If you make a semver-breaking change you must also bump the package
version number so that the semver check will pass. Because we like
to bump the versions of all crates at the same time you can not use
pre-releases since cargo does not allow mixing those and the iroh
patchbay tests has 2nd-level dependencies on noq-udp (via netwatch).
- Adding deprecated items is allowed in minor version bumps, matching
https://semver.org/#how-should-i-handle-deprecating-functionality
- Bump noq-proto version because we previously added deprecations.
- Now the baseline is somewhat stable, enable caching.
## Breaking Changes
none
## Notes & open questions
I tested this first by not bumping the noq-proto version number and it
fails in that case. Which is due to #725.
Once this is merged I will make the semver check required in noq.
The version bumping required to make semver-checks pass could be a bit
annoying. It will also make patching iroh for noq a little bit harder.
As shown by what the patchbay check has to do now. I'm tempted to think
for now that this is worth it, but happy to think about how to tweak
this as we gain experience.
OTOH having to bump to the right version means that come to a release we
do know what the next version should be. Which is probably good.
## Change checklist
- [x] Self-review.