device: prevent spurious errors while closing a device

When closing a device, packets that are in flight
can make it to SendBuffer, which then returns an error.
Those errors add noise but no light;
they do not reflect an actual problem.

Adding the synchronization required to prevent
this from occurring is currently expensive and error-prone.
Instead, quietly drop such packets instead of
returning an error.

Signed-off-by: Josh Bleecher Snyder <josh@tailscale.com>
This commit is contained in:
Josh Bleecher Snyder 2020-12-14 13:34:03 -08:00 committed by Jason A. Donenfeld
parent c9e4a859ae
commit fc0aabbae9

View file

@ -140,6 +140,11 @@ func (peer *Peer) SendBuffer(buffer []byte) error {
defer peer.device.net.RUnlock() defer peer.device.net.RUnlock()
if peer.device.net.bind == nil { if peer.device.net.bind == nil {
// Packets can leak through to SendBuffer while the device is closing.
// When that happens, drop them silently to avoid spurious errors.
if peer.device.isClosed.Get() {
return nil
}
return errors.New("no bind") return errors.New("no bind")
} }