mirror of
https://github.com/outbackdingo/firezone.git
synced 2026-01-27 18:18:55 +00:00
Previously, we used `SocketState::send` without wrapping it in `UdpSocket::try_io`. This meant that tokio had no chance of clearing the readiness flag on the socket when we actually failed to send a packet, resulting in many log messages like this: ``` Tunnel error: Resource temporarily unavailable (os error 11) ``` This PR refactors how we send UDP packets and when we read IP packet from the device. Instead of just polling for send-readiness, we flush all buffered packets and _then_ check for send-readiness. That will only succeed if we managed to send all buffered packets and the socket still has space for more packets. Typically, this buffer only has 1-2 packets. That is because we currently only ever read a single packet from the device. See #4139 for how this might change. It may have more packets when our `Allocation`s emit some (like multiple channel bindings in a row). Because we enforce further send-readiness before continuing, this buffer cannot grow unbounded. Resolves: #3931.
Rust development guide
Firezone uses Rust for all data plane components. This directory contains the Linux and Windows clients, and low-level networking implementations related to STUN/TURN.
We target the last stable release of Rust using rust-toolchain.toml.
If you are using rustup, that is automatically handled for you.
Otherwise, ensure you have the latest stable version of Rust installed.