aboutsummaryrefslogtreecommitdiff
AgeCommit message (Collapse)Author
2020-05-01uapi: linux: put sock files in netns-specific subdirjd/netns-specific-uapiJason A. Donenfeld
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
2020-05-02wgcfg: remove for nowDavid Crawshaw
Going to develop this on a branch and bring it in all at once. Signed-off-by: David Crawshaw <crawshaw@tailscale.com>
2020-05-02wgcfg: remove JSON marshal methodsDavid Crawshaw
Followup from earlier code review. Signed-off-by: David Crawshaw <crawshaw@tailscale.com>
2020-05-02device: use atomic access for unlocked keypair.nextJason A. Donenfeld
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
2020-05-02wgcfg: rename Key to PublicKeyDavid Crawshaw
A few minor review cleanups while here (e.g. remove unused LessThan). Signed-off-by: David Crawshaw <crawshaw@tailscale.com>
2020-05-02device: add nil check before convert typed error backWenxuan Zhao
Since errors.As(err, target) returns false when err is nil, which cause status set to 1 when no error occurs for Ipc{Get,Set}Operation. Signed-off-by: Wenxuan Zhao <viz@linux.com>
2020-04-07device: move stats fields back down and add test diagnosticsDavid Crawshaw
This reverts the movement of fields from d49f4e9. That commit was cherry-picked from another branch where a field had changed and misaligned the atomic fields. After cherry-picking, moving the fields was no longer necessary but got dragged along. Signed-off-by: David Crawshaw <crawshaw@tailscale.com>
2020-04-07Revert "device: use wgcfg key types"David Crawshaw
More cleanup work of wgcfg to do before bringing this in. This reverts commit 83ca9b47b63b4d07630c4d579faf1111e42537d3.
2020-04-03device: remove racey read in session key rotation.David Anderson
This code was attempting to use the "compare racily, then lock and compare again" idiom to try and reduce lock contention. However, that idiom is not safe to use unless the comparison uses atomic operations, which this does not. This change simply deletes the racy read. This makes the code correct, but potentially increases lock contention. Signed-off-by: David Anderson <danderson@tailscale.com>
2020-04-02device: add debug logs describing handshake rejectionAvery Pennarun
Useful in testing when bad network stacks repeat or batch large numbers of packets. Signed-off-by: Avery Pennarun <apenwarr@tailscale.com>
2020-04-02device: use wgcfg key typesDavid Crawshaw
Signed-off-by: David Crawshaw <crawshaw@tailscale.com>
2020-04-02tun: return a better error message if /dev/net/tun doesn't existBrad Fitzpatrick
It was just returning "no such file or directory" (the String of the syscall.Errno returned by CreateTUN). Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
2020-04-02device: return generic error from Ipc{Get,Set}Operation.David Anderson
This makes uapi.go's public API conform to Go style in terms of error types. Signed-off-by: David Anderson <danderson@tailscale.com>
2020-04-02tun: NetlinkListener: don't send EventDown before sending EventUpAvery Pennarun
This works around a startup race condition when competing with HackListener, which is trying to do the same job. If HackListener detects that the tundev is running while there is still an event in the netlink queue that says it isn't running, then the device receives a string of events like EventUp (HackListener) EventDown (NetlinkListener) EventUp (NetlinkListener) Unfortunately, after the first EventDown, the device stops itself, thinking incorrectly that the administrator has downed its tundev. The device is ignoring the initial EventDown anyway, so just don't emit it. Signed-off-by: Avery Pennarun <apenwarr@tailscale.com>
2020-04-02device: give handshake state a typeDavid Crawshaw
And unexport handshake constants. Signed-off-by: David Crawshaw <crawshaw@tailscale.com>
2020-04-01tuntest: split out testing packageDavid Crawshaw
This code is useful to other packages writing tests. Signed-off-by: David Crawshaw <crawshaw@tailscale.com>
2020-03-31wgcfg: improve SymmetricKey docsDavid Crawshaw
Signed-off-by: David Crawshaw <crawshaw@tailscale.com>
2020-03-31wgcfg: fix bug preventing IPv6 addresses from workingBrad Fitzpatrick
Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
2020-03-31wgcfg: clean up IP type/method signaturesBrad Fitzpatrick
Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
2020-03-31wgcfg: add fast CIDR.Contains implementationTyler Kropp
Signed-off-by: Tyler Kropp <kropptyler@gmail.com>
2020-03-31wgcfg: new config packageDavid Crawshaw
Based on types and config parser from wireguard-windows. Signed-off-by: David Crawshaw <crawshaw@tailscale.com>
2020-03-30tun: fix data race on name fieldBrad Fitzpatrick
Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
2020-03-30tun: remove unused isUp methodBrad Fitzpatrick
Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
2020-03-30conn: new package that splits out the Bind and Endpoint typesDavid Crawshaw
The sticky socket code stays in the device package for now, as it reaches deeply into the peer list. This is the first step in an effort to split some code out of the very busy device package. Signed-off-by: David Crawshaw <crawshaw@tailscale.com>
2020-03-30wintun: split error message for create vs open namespace.Avery Pennarun
Signed-off-by: Avery Pennarun <apenwarr@tailscale.com>
2020-03-30device: make Peer fields safe for atomic access on 32-bit.David Anderson
All atomic access must be aligned to 64 bits, even on 32-bit platforms. Go promises that the start of allocated structs is aligned to 64 bits. So, place the atomically-accessed things first in the struct so that they benefit from that alignment. As a side bonus, it cleanly separates fields that are accessed by atomic ops, and those that should be accessed under mu. Also 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>
2020-03-30rwcancel: no-op builds for windows and darwinDavid Crawshaw
This lets us include the package on those platforms in a followup commit where we split out a conn package from device. It also lets us run `go test ./...` when developing on macOS. Signed-off-by: David Crawshaw <crawshaw@tailscale.com>
2020-03-30ratelimiter: use a fake clock in tests and style cleanupsDavid Crawshaw
The existing test would occasionally flake out with: --- FAIL: TestRatelimiter (0.12s) ratelimiter_test.go:99: Test failed for 127.0.0.1 , on: 7 ( not having refilled enough ) expected: false got: true FAIL FAIL golang.zx2c4.com/wireguard/ratelimiter 0.171s The fake clock also means the tests run much faster, so testing this package with -count=1000 now takes < 100ms. While here, several style cleanups. The most significant one is unembeding the sync.Mutex fields in the rate limiter objects. Embedded as they were, the lock methods were accessible outside the ratelimiter package. As they aren't needed externally, keep them internal to make them easier to reason about. Passes `go test -race -count=10000 ./ratelimiter` Signed-off-by: David Crawshaw <crawshaw@tailscale.com>
2020-03-20version: bump snapshot0.0.20200320Jason A. Donenfeld
2020-03-17noise: unify zero checking of ecdhJason A. Donenfeld
2020-03-17global: use RTMGRP_* consts from x/sys/unixTobias Klauser
Update the golang.org/x/sys/unix dependency and use the newly introduced RTMGRP_* consts instead of using the corresponding RTNLGRP_* const to create a mask. Signed-off-by: Tobias Klauser <tklauser@distanz.ch>
2020-02-14send: account for zero mtuJason A. Donenfeld
Don't divide by zero.
2020-02-04device: fix private key removal logicJason A. Donenfeld
2020-02-04uapi: allow unsetting device private key with /dev/nullJason A. Donenfeld
2020-01-21version: bump snapshot0.0.20200121Jason A. Donenfeld
2020-01-15tun: darwin: ignore ENOMEM errorsJason A. Donenfeld
Coauthored-by: Andrej Mihajlov <and@mullvad.net>
2020-01-07tun: windows: serialize write callsJason A. Donenfeld
2019-12-30README: update repo urlsJason A. Donenfeld
2019-11-28device: SendmsgN mutates the input sockaddrJason A. Donenfeld
So we take a new granular lock to prevent concurrent writes from racing. WARNING: DATA RACE Write at 0x00c0011f2740 by goroutine 27: golang.org/x/sys/unix.(*SockaddrInet4).sockaddr() /go/pkg/mod/golang.org/x/sys@v0.0.0-20191105231009-c1f44814a5cd/unix/syscall_linux.go:384 +0x114 golang.org/x/sys/unix.SendmsgN() /go/pkg/mod/golang.org/x/sys@v0.0.0-20191105231009-c1f44814a5cd/unix/syscall_linux.go:1304 +0x288 golang.zx2c4.com/wireguard/device.send4() /go/pkg/mod/golang.zx2c4.com/wireguard@v0.0.20191012/device/conn_linux.go:485 +0x11f golang.zx2c4.com/wireguard/device.(*nativeBind).Send() /go/pkg/mod/golang.zx2c4.com/wireguard@v0.0.20191012/device/conn_linux.go:268 +0x1d6 golang.zx2c4.com/wireguard/device.(*Peer).SendBuffer() /go/pkg/mod/golang.zx2c4.com/wireguard@v0.0.20191012/device/peer.go:151 +0x285 golang.zx2c4.com/wireguard/device.(*Peer).SendHandshakeInitiation() /go/pkg/mod/golang.zx2c4.com/wireguard@v0.0.20191012/device/send.go:163 +0x692 golang.zx2c4.com/wireguard/device.(*Device).RoutineReadFromTUN() /go/pkg/mod/golang.zx2c4.com/wireguard@v0.0.20191012/device/send.go:318 +0x4b8 Previous write at 0x00c0011f2740 by goroutine 386: golang.org/x/sys/unix.(*SockaddrInet4).sockaddr() /go/pkg/mod/golang.org/x/sys@v0.0.0-20191105231009-c1f44814a5cd/unix/syscall_linux.go:384 +0x114 golang.org/x/sys/unix.SendmsgN() /go/pkg/mod/golang.org/x/sys@v0.0.0-20191105231009-c1f44814a5cd/unix/syscall_linux.go:1304 +0x288 golang.zx2c4.com/wireguard/device.send4() /go/pkg/mod/golang.zx2c4.com/wireguard@v0.0.20191012/device/conn_linux.go:485 +0x11f golang.zx2c4.com/wireguard/device.(*nativeBind).Send() /go/pkg/mod/golang.zx2c4.com/wireguard@v0.0.20191012/device/conn_linux.go:268 +0x1d6 golang.zx2c4.com/wireguard/device.(*Peer).SendBuffer() /go/pkg/mod/golang.zx2c4.com/wireguard@v0.0.20191012/device/peer.go:151 +0x285 golang.zx2c4.com/wireguard/device.(*Peer).SendHandshakeInitiation() /go/pkg/mod/golang.zx2c4.com/wireguard@v0.0.20191012/device/send.go:163 +0x692 golang.zx2c4.com/wireguard/device.expiredRetransmitHandshake() /go/pkg/mod/golang.zx2c4.com/wireguard@v0.0.20191012/device/timers.go:110 +0x40c golang.zx2c4.com/wireguard/device.(*Peer).NewTimer.func1() /go/pkg/mod/golang.zx2c4.com/wireguard@v0.0.20191012/device/timers.go:42 +0xd8 Goroutine 27 (running) created at: golang.zx2c4.com/wireguard/device.NewDevice() /go/pkg/mod/golang.zx2c4.com/wireguard@v0.0.20191012/device/device.go:322 +0x5e8 main.main() /go/src/x/main.go:102 +0x58e Goroutine 386 (finished) created at: time.goFunc() /usr/local/go/src/time/sleep.go:168 +0x51 Reported-by: Ben Burkert <ben@benburkert.com>
2019-11-22wintun: manage ring memory manuallyJason A. Donenfeld
It's large and Go's garbage collector doesn't deal with it especially well.
2019-10-30constants: recalculate rekey max based on a one minute floodJason A. Donenfeld
Discussed-with: Mathias Hall-Andersen <mathias@hall-andersen.dk>
2019-10-22global: fix a few typos courtesy of codespellJonathan Tooker
Signed-off-by: Jonathan Tooker <jonathan.tooker@netprotect.com>
2019-10-21device: allow blackholing socketsJason A. Donenfeld
2019-10-21device: remove dead error reporting codeJason A. Donenfeld
2019-10-21namespaceapi: remove tasteless commentJason A. Donenfeld
2019-10-17device: recheck counters while holding write lockJason A. Donenfeld
2019-10-17wintun: normalize variable names for their typesJason A. Donenfeld
2019-10-17wintun: quickly ignore non-Wintun devicesAvery Pennarun
Some devices take ~2 seconds to enumerate on Windows if we try to get their instance name. The hardware id property, on the other hand, is available right away. Signed-off-by: Avery Pennarun <apenwarr@gmail.com> [zx2c4: inlined this to where it makes sense, reused setupapi const]
2019-10-17tun: match windows CreateTUN signature to the Linux variantAvery Pennarun
Signed-off-by: Avery Pennarun <apenwarr@gmail.com> [zx2c4: fix default value]
2019-10-17rwcancel: handle EINTR and EAGAIN in unixSelect()Avery Pennarun
On my Chromebook (Linux 4.19.44 in a VM) and on an AWS EC2 machine, select() was sometimes returning EINTR. This is harmless and just means you should try again. So let's try again. This eliminates a problem where the tunnel fails to come up correctly and the program needs to be restarted. Signed-off-by: Avery Pennarun <apenwarr@gmail.com>