aboutsummaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAgeFilesLines
* device: accept any io.Reader in device.IpcSetOperationJosh Bleecher Snyder2020-12-151-2/+2
| | | | | | | | | | Any io.Reader will do, and there are no performance concerns here. This is technically backwards incompatible, but it is very unlikely to break any existing code. It is compatible with the existing uses in wireguard-{windows,android,apple} and also will allow us to slightly simplify it if desired. Signed-off-by: Josh Bleecher Snyder <josh@tailscale.com>
* device: increase timeout in testsJosh Bleecher Snyder2020-12-151-2/+2
| | | | | | | | | When running many concurrent test processing using https://godoc.org/golang.org/x/tools/cmd/stress the processing sometimes cannot complete a ping in under 300ms. Increase the timeout to 5s to reduce the rate of false positives. Signed-off-by: Josh Bleecher Snyder <josh@tailscale.com>
* device: prevent spurious errors while closing a deviceJosh Bleecher Snyder2020-12-151-0/+5
| | | | | | | | | | | | | | 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>
* device: remove starting waitgroupsJosh Bleecher Snyder2020-12-105-29/+1
| | | | | | | | | | | | | | | In each case, the starting waitgroup did nothing but ensure that the goroutine has launched. Nothing downstream depends on the order in which goroutines launch, and if the Go runtime scheduler is so broken that goroutines don't get launched reasonably promptly, we have much deeper problems. Given all that, simplify the code. Passed a race-enabled stress test 25,000 times without failure. Signed-off-by: Josh Bleecher Snyder <josh@tailscale.com>
* device: make test setup more robustJosh Bleecher Snyder2020-12-102-29/+65
| | | | | | | | | | | | | | | | | | | | | | | | | Picking two free ports to use for a test is difficult. The free port we selected might no longer be free when we reach for it a second time. On my machine, this failure mode led to failures approximately once per thousand test runs. Since failures are rare, and threading through and checking for all possible errors is complicated, fix this with a big hammer: Retry if either device fails to come up. Also, if you accidentally pick the same port twice, delightful confusion ensues. The handshake failures manifest as crypto errors, which look scary. Again, fix with retries. To make these retries easier to implement, use testing.T.Cleanup instead of defer to close devices. This requires Go 1.14. Update go.mod accordingly. Go 1.13 is no longer supported anyway. With these fixes, 'go test -race' ran 100,000 times without failure. Signed-off-by: Josh Bleecher Snyder <josh@tailscale.com>
* wintun: do not load dll in init()Jason A. Donenfeld2020-12-095-14/+21
| | | | | | | This prevents linking to wintun.dll until it's actually needed, which should improve startup time. Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
* tun/tuntest: make genICMPv4 allocate lessJosh Bleecher Snyder2020-12-081-8/+7
| | | | | | It doesn't really matter, because it is only used in tests, but it does remove some noise from pprof profiles. Signed-off-by: Josh Bleecher Snyder <josh@tailscale.com>
* device: avoid copying lock in testsJosh Bleecher Snyder2020-12-081-1/+1
| | | | | | | | This doesn't cause any practical problems as it is, but vet (rightly) flags this code as copying a mutex. It is easy to fix, so do so. Signed-off-by: Josh Bleecher Snyder <josh@tailscale.com>
* device: clear pointers when returning elems to poolsJosh Bleecher Snyder2020-12-083-1/+24
| | | | Signed-off-by: Josh Bleecher Snyder <josh@tailscale.com>
* device: use labeled for loop instead of gotoJosh Bleecher Snyder2020-12-081-4/+4
| | | | | | Minor code cleanup; no functional changes. Signed-off-by: Josh Bleecher Snyder <josh@tailscale.com>
* memmod: fix import loading function usageJason A. Donenfeld2020-11-275-32/+10
| | | | Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
* wintun: log when reboot is suggested by WindowsSimon Rozman2020-11-251-1/+5
| | | | | | | Which really shouldn't happen. But it is a useful information for troubleshooting. Signed-off-by: Simon Rozman <simon@rozman.si>
* wintun: keep original error when Wintun session start failsSimon Rozman2020-11-251-1/+1
| | | | Signed-off-by: Simon Rozman <simon@rozman.si>
* version: bump snapshot0.0.20201118Jason A. Donenfeld2020-11-181-1/+1
|
* mod: bumpJason A. Donenfeld2020-11-182-9/+11
| | | | Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
* device: add write queue mutex for peerHaichao Liu2020-11-183-1/+11
| | | | | | | fix panic: send on closed channel when remove peer Signed-off-by: Haichao Liu <liuhaichao@bytedance.com> Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
* wintun: load from filesystem by defaultJason A. Donenfeld2020-11-113-39/+109
| | | | | | | | We let people loading this from resources opt in via: go build -tags load_wintun_from_rsrc Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
* global: switch to using %w instead of %v for ErrorfJason A. Donenfeld2020-11-076-34/+34
| | | | Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
* mod: update depsJason A. Donenfeld2020-11-072-12/+9
| | | | Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
* wintun: ring management moved to wintun.dllSimon Rozman2020-11-074-214/+147
| | | | | Signed-off-by: Simon Rozman <simon@rozman.si> Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
* wintun: load wintun.dll from RCDATA resourceSimon Rozman2020-11-0719-2/+1578
| | | | | Signed-off-by: Simon Rozman <simon@rozman.si> Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
* wintun: migrate to wintun.dll APISimon Rozman2020-11-0725-3711/+169
| | | | | | | | Rather than having every application using Wintun driver reinvent the wheel, the Wintun device/adapter/interface management has been moved from wireguard-go to wintun.dll deployed with Wintun itself. Signed-off-by: Simon Rozman <simon@rozman.si>
* device: format a few thingsJason A. Donenfeld2020-11-062-2/+1
| | | | Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
* tun: use SockaddrCtl from golang.org/x/sys/unix on macOSTobias Klauser2020-10-271-29/+6
| | | | | | | | | Direct syscalls using unix.Syscall(unix.SYS_*, ...) are discouraged on macOS and might not be supported in future versions. Switch to use unix.Connect with unix.SockaddrCtl instead. Signed-off-by: Tobias Klauser <tklauser@distanz.ch> Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
* tun: use Ioctl{Get,Set}IfreqMTU from golang.org/x/sys/unix on macOSTobias Klauser2020-10-271-35/+10
| | | | | | | | | Direct syscalls using unix.Syscall(unix.SYS_*, ...) are discouraged on macOS and might not be supported in future versions. Switch to use unix.Ioctl{Get,Set}IfreqMTU to get and set an interface's MTU. Signed-off-by: Tobias Klauser <tklauser@distanz.ch> Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
* tun: use IoctlCtlInfo from golang.org/x/sys/unix on macOSTobias Klauser2020-10-271-20/+6
| | | | | | | | | Direct syscalls using unix.Syscall(unix.SYS_*, ...) are discouraged on macOS and might not be supported in future versions. Switch to use unix.IoctlCtlInfo to get the kernel control info. Signed-off-by: Tobias Klauser <tklauser@distanz.ch> Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
* tun: use GetsockoptString in (*NativeTun).Name on macOSTobias Klauser2020-10-271-14/+6
| | | | | | | | | Direct syscalls using unix.Syscall(unix.SYS_*, ...) are discouraged on macOS and might not be supported in future versions. Instead, use the existing unix.GetsockoptString wrapper to get the interface name. Signed-off-by: Tobias Klauser <tklauser@distanz.ch> Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
* go.mod: bump golang.org/x/sys to latest versionTobias Klauser2020-10-272-3/+3
| | | | | | | | This adds the fixes for golang/go#41868 which are needed to build wireguard without direct syscalls on macOS. Signed-off-by: Tobias Klauser <tklauser@distanz.ch> Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
* tun/wintun/registry: fix Go 1.15 race/checkptr failureBrad Fitzpatrick2020-10-213-4/+4
| | | | | | Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com> [Jason: ran go mod tidy.] Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
* Makefile: Add test targetFrank Werner2020-10-201-1/+4
| | | | | Signed-off-by: Frank Werner <mail@hb9fxq.ch> Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
* replay: minor API changes to more idiomatic GoRiobard Zhan2020-10-144-17/+17
| | | | | Signed-off-by: Riobard Zhan <me@riobard.com> Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
* replay: clean up internals and better documentationRiobard Zhan2020-10-142-71/+50
| | | | | Signed-off-by: Riobard Zhan <me@riobard.com> Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
* device: remove global for roaming escape hatchJason A. Donenfeld2020-10-142-2/+18
| | | | Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
* replay: divide by bits-per-byteJason A. Donenfeld2020-09-071-1/+1
| | | | | | | | Bits / Bytes-per-Word misses the step of also dividing by Bits-per-Byte, which we need in order for this to make sense. Reported-by: Riobard Zhan <me@riobard.com> Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
* device: get free port when testingSina Siadat2020-07-311-5/+23
| | | | | Signed-off-by: Sina Siadat <siadat@gmail.com> Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
* device: remove bindsocketshim.goDavid Crawshaw2020-07-141-36/+0
| | | | | | | | Both wireguard-windows and wireguard-android access Bind directly for these methods now. Signed-off-by: David Crawshaw <crawshaw@tailscale.com> Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
* device: remove some unnecessary unsafeBrad Fitzpatrick2020-07-151-2/+3
| | | | Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
* device: use RTMGRP_IPV4_ROUTE to specify multicast groups maskTobias Klauser2020-07-131-1/+1
| | | | | | | | | Use the RTMGRP_IPV4_ROUTE const from x/sys/unix instead of using the corresponding RTNLGRP_IPV4_ROUTE const to create the multicast groups mask. Signed-off-by: Tobias Klauser <tklauser@distanz.ch> Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
* device: wait for routines to stop before removing peersDmytro Shynkevych2020-07-041-1/+1
| | | | | | | | | | | | | | | Peers are currently removed after Device's goroutines are signaled to stop, but without waiting for them to actually do so, which is racy. For example, RoutineHandshake may be in Peer.SendKeepalive when the corresponding peer is removed, which closes its nonce channel. This causes a send on a closed channel, as observed in tailscale/tailscale#487. This patch seems to be the correct synchronizing action: Peer's goroutines are receivers and handle channel closure gracefully, so Device's goroutines are the ones that should be fully stopped first. Signed-Off-By: Dmytro Shynkevych <dmytro@tailscale.com>
* device: export Bind and remove socketfd shims for androidDavid Crawshaw2020-06-222-24/+6
| | | | Signed-off-by: David Crawshaw <crawshaw@tailscale.com>
* ipc: add comment about socketDirectory linker override on androidDavid Crawshaw2020-06-221-0/+2
| | | | Signed-off-by: David Crawshaw <crawshaw@tailscale.com>
* conn: add comments saying what uses these interfacesDavid Crawshaw2020-06-221-2/+5
| | | | Signed-off-by: David Crawshaw <crawshaw@tailscale.com>
* device: do not include sticky sockets on androidJason A. Donenfeld2020-06-072-1/+3
| | | | Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
* conn: unbreak boundif on androidJason A. Donenfeld2020-06-074-44/+65
| | | | | | Another thing never tested ever. Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
* conn: remove useless commentJason A. Donenfeld2020-06-071-1/+0
| | | | Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
* conn: fix windows situation with boundifJason A. Donenfeld2020-06-072-8/+8
| | | | | | This was evidently never tested before committing. Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
* replay: account for fqcodel reorderingJason A. Donenfeld2020-05-192-2/+2
| | | | Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
* device: rework padding calculation and don't shadow paddedSizeJason A. Donenfeld2020-05-181-15/+17
| | | | | Reported-by: Jayakumar S <jayakumar82.s@gmail.com> Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
* tai64n: make the test deterministicDmytro Shynkevych2020-05-062-19/+32
| | | | | | | In the presence of preemption, the current test may fail transiently. This uses static test data instead to ensure consistent behavior. Signed-off-by: Dmytro Shynkevych <dmytro@tailscale.com>
* main: now that we're upstreamed, relax Linux warningJason A. Donenfeld2020-05-022-13/+11
| | | | Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>