diff options
author | David Anderson <danderson@tailscale.com> | 2020-03-01 00:39:24 -0800 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2020-05-02 01:44:58 -0600 |
commit | 3dce460c88a84922fdeab246a1b3ebddf796093d (patch) | |
tree | 5dce6888bf00812cc501afae45cbdac707fc352e /device/peer.go | |
parent | 224bc9e60c7e2e1f04573bc377121c8f844d57c6 (diff) |
device: add test to ensure Peer fields are safe for atomic access on 32-bit
Adds a test that will fail consistently on 32-bit platforms if the
struct ever changes again to violate the rules. This is likely not
needed because unaligned access crashes reliably, but this will reliably
fail even if tests accidentally pass due to lucky alignment.
Signed-Off-By: David Anderson <danderson@tailscale.com>
Diffstat (limited to 'device/peer.go')
-rw-r--r-- | device/peer.go | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/device/peer.go b/device/peer.go index 8a8224c..19434cd 100644 --- a/device/peer.go +++ b/device/peer.go @@ -27,7 +27,11 @@ type Peer struct { endpoint Endpoint persistentKeepaliveInterval uint16 - // This must be 64-bit aligned, so make sure the above members come out to even alignment and pad accordingly + // These fields are accessed with atomic operations, which must be + // 64-bit aligned even on 32-bit platforms. Go guarantees that an + // allocated struct will be 64-bit aligned. So we place + // atomically-accessed fields up front, so that they can share in + // this alignment before smaller fields throw it off. stats struct { txBytes uint64 // bytes send to peer (endpoint) rxBytes uint64 // bytes received from peer |