539c5e44c5
The logic of deephash is both simpler and easier to reason about if values are always addressable. In Go, the composite kinds are slices, arrays, maps, structs, interfaces, pointers, channels, and functions, where we define "composite" as a Go value that encapsulates some other Go value (e.g., a map is a collection of key-value entries). In the cases of pointers and slices, the sub-values are always addressable. In the cases of arrays and structs, the sub-values are always addressable if and only if the parent value is addressable. In the case of maps and interfaces, the sub-values are never addressable. To make them addressable, we need to copy them onto the heap. For the purposes of deephash, we do not care about channels and functions. For all non-composite kinds (e.g., strings and ints), they are only addressable if obtained from one of the composite kinds that produce addressable values (i.e., pointers, slices, addressable arrays, and addressable structs). A non-addressible, non-composite kind can be made addressable by allocating it on the heap, obtaining a pointer to it, and dereferencing it. Thus, if we can ensure that values are addressable at the entry points, and shallow copy sub-values whenever we encounter an interface or map, then we can ensure that all values are always addressable and assume such property throughout all the logic. Performance: name old time/op new time/op delta Hash-24 21.5µs ± 1% 19.7µs ± 1% -8.29% (p=0.000 n=9+9) HashPacketFilter-24 2.61µs ± 1% 2.62µs ± 0% +0.29% (p=0.037 n=10+9) HashMapAcyclic-24 30.8µs ± 1% 30.9µs ± 1% ~ (p=0.400 n=9+10) TailcfgNode-24 1.84µs ± 1% 1.84µs ± 2% ~ (p=0.928 n=10+10) HashArray-24 324ns ± 2% 332ns ± 2% +2.45% (p=0.000 n=10+10) Signed-off-by: Joe Tsai <joetsai@digital-static.net> |
||
---|---|---|
.bencher | ||
.github | ||
atomicfile | ||
chirp | ||
client/tailscale | ||
cmd | ||
control | ||
derp | ||
disco | ||
docs | ||
envknob | ||
health | ||
hostinfo | ||
internal/tooldeps | ||
ipn | ||
jsondb | ||
kube | ||
log | ||
logpolicy | ||
logtail | ||
metrics | ||
net | ||
packages/deb | ||
paths | ||
portlist | ||
prober | ||
safesocket | ||
scripts | ||
smallzstd | ||
ssh/tailssh | ||
syncs | ||
tailcfg | ||
tempfork | ||
tka | ||
tool | ||
tsconst | ||
tsnet | ||
tstest | ||
tstime | ||
tsweb | ||
types | ||
util | ||
version | ||
wf | ||
wgengine | ||
words | ||
.gitattributes | ||
.gitignore | ||
ALPINE.txt | ||
api.md | ||
AUTHORS | ||
build_dist.sh | ||
build_docker.sh | ||
CODE_OF_CONDUCT.md | ||
Dockerfile | ||
Dockerfile.base | ||
go.mod | ||
go.sum | ||
go.toolchain.branch | ||
go.toolchain.rev | ||
LICENSE | ||
Makefile | ||
PATENTS | ||
pull-toolchain.sh | ||
README.md | ||
SECURITY.md | ||
shell.nix | ||
staticcheck.conf | ||
version-embed.go | ||
VERSION.txt |
Tailscale
Private WireGuard® networks made easy
Overview
This repository contains all the open source Tailscale client code and
the tailscaled
daemon and tailscale
CLI tool. The tailscaled
daemon runs on Linux, Windows and macOS, and to varying degrees on FreeBSD, OpenBSD, and Darwin. (The Tailscale iOS and Android apps use this repo's code, but this repo doesn't contain the mobile GUI code.)
The Android app is at https://github.com/tailscale/tailscale-android
The Synology package is at https://github.com/tailscale/tailscale-synology
Using
We serve packages for a variety of distros at https://pkgs.tailscale.com .
Other clients
The macOS, iOS, and Windows clients use the code in this repository but additionally include small GUI wrappers that are not open source.
Building
go install tailscale.com/cmd/tailscale{,d}
If you're packaging Tailscale for distribution, use build_dist.sh
instead, to burn commit IDs and version info into the binaries:
./build_dist.sh tailscale.com/cmd/tailscale
./build_dist.sh tailscale.com/cmd/tailscaled
If your distro has conventions that preclude the use of
build_dist.sh
, please do the equivalent of what it does in your
distro's way, so that bug reports contain useful version information.
We require the latest Go release, currently Go 1.19.
Bugs
Please file any issues about this code or the hosted service on the issue tracker.
Contributing
PRs welcome! But please file bugs. Commit messages should reference bugs.
We require Developer Certificate of
Origin
Signed-off-by
lines in commits.
About Us
Tailscale is primarily developed by the people at https://github.com/orgs/tailscale/people. For other contributors, see:
- https://github.com/tailscale/tailscale/graphs/contributors
- https://github.com/tailscale/tailscale-android/graphs/contributors
Legal
WireGuard is a registered trademark of Jason A. Donenfeld.