diff --git a/cmd/tailscale/depaware.txt b/cmd/tailscale/depaware.txt index 036e6e0ad..d116cf1fd 100644 --- a/cmd/tailscale/depaware.txt +++ b/cmd/tailscale/depaware.txt @@ -16,7 +16,6 @@ tailscale.com/cmd/tailscale dependencies: (generated by github.com/tailscale/dep L 💣 github.com/mdlayher/netlink/nlenc from github.com/jsimonetti/rtnetlink+ github.com/peterbourgon/ff/v2 from github.com/peterbourgon/ff/v2/ffcli github.com/peterbourgon/ff/v2/ffcli from tailscale.com/cmd/tailscale/cli - W 💣 github.com/tailscale/winipcfg-go from tailscale.com/net/interfaces+ 💣 github.com/tailscale/wireguard-go/conn from github.com/tailscale/wireguard-go/device+ 💣 github.com/tailscale/wireguard-go/device from tailscale.com/wgengine+ github.com/tailscale/wireguard-go/device/tokenbucket from github.com/tailscale/wireguard-go/device @@ -37,6 +36,7 @@ tailscale.com/cmd/tailscale dependencies: (generated by github.com/tailscale/dep github.com/tcnksm/go-httpstat from tailscale.com/net/netcheck github.com/toqueteos/webbrowser from tailscale.com/cmd/tailscale/cli 💣 go4.org/mem from tailscale.com/control/controlclient+ + W 💣 golang.zx2c4.com/wireguard/windows/tunnel/winipcfg from tailscale.com/net/interfaces+ inet.af/netaddr from tailscale.com/cmd/tailscale/cli+ rsc.io/goversion/version from tailscale.com/version tailscale.com/atomicfile from tailscale.com/ipn+ diff --git a/cmd/tailscaled/depaware.txt b/cmd/tailscaled/depaware.txt index 228c5874d..ee054bfdc 100644 --- a/cmd/tailscaled/depaware.txt +++ b/cmd/tailscaled/depaware.txt @@ -19,7 +19,6 @@ tailscale.com/cmd/tailscaled dependencies: (generated by github.com/tailscale/de github.com/klauspost/compress/zstd/internal/xxhash from github.com/klauspost/compress/zstd L 💣 github.com/mdlayher/netlink from github.com/jsimonetti/rtnetlink+ L 💣 github.com/mdlayher/netlink/nlenc from github.com/jsimonetti/rtnetlink+ - W 💣 github.com/tailscale/winipcfg-go from tailscale.com/net/interfaces+ 💣 github.com/tailscale/wireguard-go/conn from github.com/tailscale/wireguard-go/device+ 💣 github.com/tailscale/wireguard-go/device from tailscale.com/wgengine+ github.com/tailscale/wireguard-go/device/tokenbucket from github.com/tailscale/wireguard-go/device @@ -39,6 +38,7 @@ tailscale.com/cmd/tailscaled dependencies: (generated by github.com/tailscale/de github.com/tailscale/wireguard-go/wgcfg from github.com/tailscale/wireguard-go/conn+ github.com/tcnksm/go-httpstat from tailscale.com/net/netcheck 💣 go4.org/mem from tailscale.com/control/controlclient+ + W 💣 golang.zx2c4.com/wireguard/windows/tunnel/winipcfg from tailscale.com/net/interfaces+ inet.af/netaddr from tailscale.com/control/controlclient+ rsc.io/goversion/version from tailscale.com/version tailscale.com/atomicfile from tailscale.com/ipn+ diff --git a/go.mod b/go.mod index 52a739395..f83ce8364 100644 --- a/go.mod +++ b/go.mod @@ -23,18 +23,18 @@ require ( github.com/pborman/getopt v0.0.0-20190409184431-ee0cd42419d3 github.com/peterbourgon/ff/v2 v2.0.0 github.com/tailscale/depaware v0.0.0-20201003033024-5d95aab075be - github.com/tailscale/winipcfg-go v0.0.0-20200916205758-decb9ee8e170 github.com/tailscale/wireguard-go v0.0.0-20201008164108-2c83f43a9859 github.com/tcnksm/go-httpstat v0.2.0 github.com/toqueteos/webbrowser v1.2.0 go4.org/mem v0.0.0-20200706164138-185c595c3ecc - golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 + golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899 golang.org/x/net v0.0.0-20200822124328-c89045814202 golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208 golang.org/x/sys v0.0.0-20200812155832-6a926be9bd1d golang.org/x/time v0.0.0-20191024005414-555d28b269f0 golang.org/x/tools v0.0.0-20201002184944-ecd9fd270d5d + golang.zx2c4.com/wireguard/windows v0.1.2-0.20201004085714-dd60d0447f81 honnef.co/go/tools v0.0.1-2020.1.4 inet.af/netaddr v0.0.0-20200810144936-56928fe48a98 rsc.io/goversion v1.2.0 diff --git a/go.sum b/go.sum index 5cab41069..2846c610f 100644 --- a/go.sum +++ b/go.sum @@ -3,11 +3,8 @@ github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/Masterminds/semver/v3 v3.0.3 h1:znjIyLfpXEDQjOIEWh+ehwpTU14UzUPub3c3sm36u14= github.com/Masterminds/semver/v3 v3.0.3/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= -github.com/alecthomas/kingpin v2.2.6+incompatible h1:5svnBTFgJjZvGKyYBtMB0+m5wvrbUHiqye8wRJMlnYI= github.com/alecthomas/kingpin v2.2.6+incompatible/go.mod h1:59OFYbFVLKQKq+mqrL6Rw5bR0c3ACQaawgXx0QYndlE= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d h1:UQZhZ2O0vMHr2cI+DC1Mbh0TJxzA3RcLoMsFw+aXw7E= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/alexbrainman/sspi v0.0.0-20180613141037-e580b900e9f5 h1:P5U+E4x5OkVEKQDklVPmzs71WM56RTTRqV4OrDC//Y4= github.com/alexbrainman/sspi v0.0.0-20180613141037-e580b900e9f5/go.mod h1:976q2ETgjT2snVCf2ZaBnyBbVoPERGjUz+0sofzEfro= @@ -63,6 +60,8 @@ github.com/kr/pty v1.1.1 h1:VkoXIwSboBpnk99O/KFauAEILuNHv5DVFKZMBN/gUgw= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/lxn/walk v0.0.0-20191128110447-55ccb3a9f5c1/go.mod h1:E23UucZGqpuUANJooIbHWCufXvOcT6E7Stq81gU+CSQ= +github.com/lxn/win v0.0.0-20191128105842-2da648fda5b4/go.mod h1:ouWl4wViUNh8tPSIwxTVMuS014WakR1hqvBc2I0bMoA= github.com/mattn/go-zglob v0.0.1 h1:xsEx/XUoVlI6yXjqBK062zYhRTZltCNmYPx6v+8DNaY= github.com/mattn/go-zglob v0.0.1/go.mod h1:9fxibJccNxU2cnpIKLRRFA7zX7qhkJIQWBb449FYHOo= github.com/mdlayher/netlink v0.0.0-20190409211403-11939a169225/go.mod h1:eQB3mZE4aiYnlUsyGGCOpPETfdQq4Jhsgf1fk3cwQaA= @@ -92,14 +91,8 @@ github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAm github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/tailscale/depaware v0.0.0-20200914232109-e09ee10c1824 h1:MD/YQ8xI070ZqFC3SnLAlhPPUNfeRKErQaAaXc/r4dQ= -github.com/tailscale/depaware v0.0.0-20200914232109-e09ee10c1824/go.mod h1:nyzwKFaLuckPu3dAJHH7B6lMi4xDBWzD0r3pEpGZm2Y= -github.com/tailscale/depaware v0.0.0-20201002180857-4fbc64c5c030 h1:KvsY/hGDJ7euXQtoyNgNnXxVyjhWUmxzYWdxUHGMnyM= -github.com/tailscale/depaware v0.0.0-20201002180857-4fbc64c5c030/go.mod h1:jissDaJNHiyV2tFdr3QyNEfsZrax/i2yQiSO+CljThI= github.com/tailscale/depaware v0.0.0-20201003033024-5d95aab075be h1:ZKe3kVGbu/goUVxXcaCPbQ4b0STQ5NsCpG90CG6mw/c= github.com/tailscale/depaware v0.0.0-20201003033024-5d95aab075be/go.mod h1:jissDaJNHiyV2tFdr3QyNEfsZrax/i2yQiSO+CljThI= -github.com/tailscale/winipcfg-go v0.0.0-20200916205758-decb9ee8e170 h1:vJ0twi0120W/LKiDxzXROSVx1F4pIKZBQqvtPahnH60= -github.com/tailscale/winipcfg-go v0.0.0-20200916205758-decb9ee8e170/go.mod h1:x880GWw5fvrl2DVTQ04ttXQD4DuppTt1Yz6wLibbjNE= github.com/tailscale/wireguard-go v0.0.0-20200921221757-11a958a67bdd h1:yEWpro9EdxGgkt24NInVnONIJxRLURH5c37Ki5+06EE= github.com/tailscale/wireguard-go v0.0.0-20200921221757-11a958a67bdd/go.mod h1:WXq+IkSOJGIgfF1XW+4z4oW+LX/TXzU9DcKlT5EZLi4= github.com/tcnksm/go-httpstat v0.2.0 h1:rP7T5e5U2HfmOBmZzGgGZjBQ5/GluWUylujl0tJ04I0= @@ -117,10 +110,11 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200429183012-4b2356b1ed79 h1:IaQbIIB2X/Mp/DKctl6ROxz1KyMlKp4uyvL6+kQ7C88= golang.org/x/crypto v0.0.0-20200429183012-4b2356b1ed79/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899 h1:DZhuSZLsGlFL4CmhA8BcRA0mnthyA/nZ00AqCUo7vHg= +golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4= @@ -134,59 +128,55 @@ golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191003171128-d98b1b443823/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191007182048-72f939374954/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2 h1:CCH4IOTTfewWjGOlSp+zGcjutRKlBEZQ6wTn8ozI/nI= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5 h1:WQ8q63x+f/zpC8Ac1s9wLElVoHhm32p6tudrU72n1QA= golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202 h1:VvcQYSHwXgi7W+TpUR6A9g6Up98WAHf3f/ulnJ62IyA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4 h1:YUO/7uOKsKeq9UokNS62b8FYywz3ker1l1vDZRCRefw= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208 h1:qwRHBd0NqMbJxfbotnDhm2ByMI1Shq4Y6oRJo21SGJA= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190310054646-10058d7d4faa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190405154228-4b34438f7a67/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190411185658-b44545bcd369/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191003212358-c178f38b412c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5 h1:LfCXLvNmTYH9kEmVgqbnsWfruoXZIrh4YBgqVHtDvw0= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501145240-bc7a7d42d5c3 h1:5B6i6EAiSYyejWfvc5Rc9BbI3rzIsrrXfAQBWnYfn+w= golang.org/x/sys v0.0.0-20200501145240-bc7a7d42d5c3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200812155832-6a926be9bd1d h1:QQrM/CCYEzTs91GZylDCQjGHudbPTxF/1fvXdVh5lMo= golang.org/x/sys v0.0.0-20200812155832-6a926be9bd1d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0 h1:/5xXl8Y5W96D+TtHSlonuFqGHIWVuyCkGJLwGh9JJFs= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d h1:/iIZNFGxc/a7C3yWjGcnboV+Tkc7mxr+p6fDztwoxuM= golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216052735-49a3e744a425 h1:VvQyQJN0tSuecqgcIxMWnnfG5kSmgy9KZR9sW3W5QeA= golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20201001230009-b5b87423c93b h1:07IVqnnzaip3TGyl/cy32V5YP3FguWG4BybYDTBNpm0= golang.org/x/tools v0.0.0-20201001230009-b5b87423c93b/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= golang.org/x/tools v0.0.0-20201002184944-ecd9fd270d5d h1:vWQvJ/Z0Lu+9/8oQ/pAYXNzbc7CMnBl+tULGVHOy3oE= golang.org/x/tools v0.0.0-20201002184944-ecd9fd270d5d/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.zx2c4.com/wireguard v0.0.20200321-0.20200715051853-507f148e1c42 h1:SrR1hmxGKKarHEEDvaHxatwnqE3uT+7jvMcin6SHOkw= +golang.zx2c4.com/wireguard v0.0.20200321-0.20200715051853-507f148e1c42/go.mod h1:GJvYs5O24/ASlwPiRklVnjMx2xQzrOic0DuU6GvYJL4= +golang.zx2c4.com/wireguard/windows v0.1.2-0.20201004085714-dd60d0447f81 h1:cT2oWlz8v9g7bjFZclT362akxJJfGv9d7ccKu6GQUbA= +golang.zx2c4.com/wireguard/windows v0.1.2-0.20201004085714-dd60d0447f81/go.mod h1:GaK5zcgr5XE98WaRzIDilumDBp5/yP8j2kG/LCDnvAM= google.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/net/interfaces/interfaces_windows.go b/net/interfaces/interfaces_windows.go index c7d0f88c6..bf6fff8a9 100644 --- a/net/interfaces/interfaces_windows.go +++ b/net/interfaces/interfaces_windows.go @@ -11,9 +11,9 @@ "syscall" "unsafe" - "github.com/tailscale/winipcfg-go" "go4.org/mem" "golang.org/x/sys/windows" + "golang.zx2c4.com/wireguard/windows/tunnel/winipcfg" "inet.af/netaddr" "tailscale.com/tsconst" "tailscale.com/util/lineread" @@ -81,31 +81,29 @@ func likelyHomeRouterIPWindows() (ret netaddr.IP, ok bool) { // NonTailscaleMTUs returns a map of interface LUID to interface MTU, // for all interfaces except Tailscale tunnels. -func NonTailscaleMTUs() (map[uint64]uint32, error) { - mtus := map[uint64]uint32{} +func NonTailscaleMTUs() (map[winipcfg.LUID]uint32, error) { + mtus := map[winipcfg.LUID]uint32{} ifs, err := NonTailscaleInterfaces() for luid, iface := range ifs { - mtus[luid] = iface.Mtu + mtus[luid] = iface.MTU } return mtus, err } // NonTailscaleInterfaces returns a map of interface LUID to interface // for all interfaces except Tailscale tunnels. -func NonTailscaleInterfaces() (map[uint64]*winipcfg.Interface, error) { - ifs, err := winipcfg.GetInterfacesEx(&winipcfg.GetAdapterAddressesFlags{ - GAA_FLAG_INCLUDE_ALL_INTERFACES: true, - }) +func NonTailscaleInterfaces() (map[winipcfg.LUID]*winipcfg.IPAdapterAddresses, error) { + ifs, err := winipcfg.GetAdaptersAddresses(windows.AF_UNSPEC, winipcfg.GAAFlagIncludeAllInterfaces) if err != nil { return nil, err } - ret := map[uint64]*winipcfg.Interface{} + ret := map[winipcfg.LUID]*winipcfg.IPAdapterAddresses{} for _, iface := range ifs { - if iface.Description == tsconst.WintunInterfaceDesc { + if iface.Description() == tsconst.WintunInterfaceDesc { continue } - ret[iface.Luid] = iface + ret[iface.LUID] = iface } return ret, nil @@ -115,21 +113,21 @@ func NonTailscaleInterfaces() (map[uint64]*winipcfg.Interface, error) { // default route for the given address family. // // It returns (nil, nil) if no interface is found. -func GetWindowsDefault(family winipcfg.AddressFamily) (*winipcfg.Interface, error) { +func GetWindowsDefault(family winipcfg.AddressFamily) (*winipcfg.IPAdapterAddresses, error) { ifs, err := NonTailscaleInterfaces() if err != nil { return nil, err } - routes, err := winipcfg.GetRoutes(family) + routes, err := winipcfg.GetIPForwardTable2(family) if err != nil { return nil, err } bestMetric := ^uint32(0) - var bestIface *winipcfg.Interface + var bestIface *winipcfg.IPAdapterAddresses for _, route := range routes { - iface := ifs[route.InterfaceLuid] + iface := ifs[route.InterfaceLUID] if route.DestinationPrefix.PrefixLength != 0 || iface == nil { continue } @@ -143,14 +141,14 @@ func GetWindowsDefault(family winipcfg.AddressFamily) (*winipcfg.Interface, erro } func DefaultRouteInterface() (string, error) { - iface, err := GetWindowsDefault(winipcfg.AF_INET) + iface, err := GetWindowsDefault(windows.AF_INET) if err != nil { return "", err } if iface == nil { return "(none)", nil } - return fmt.Sprintf("%s (%s)", iface.FriendlyName, iface.Description), nil + return fmt.Sprintf("%s (%s)", iface.FriendlyName(), iface.Description()), nil } var ( diff --git a/net/netns/netns_windows.go b/net/netns/netns_windows.go index a47688ec2..d2441e7cd 100644 --- a/net/netns/netns_windows.go +++ b/net/netns/netns_windows.go @@ -9,12 +9,12 @@ "syscall" "unsafe" - "github.com/tailscale/winipcfg-go" "golang.org/x/sys/windows" + "golang.zx2c4.com/wireguard/windows/tunnel/winipcfg" "tailscale.com/net/interfaces" ) -func interfaceIndex(iface *winipcfg.Interface) uint32 { +func interfaceIndex(iface *winipcfg.IPAdapterAddresses) uint32 { if iface == nil { // The zero ifidx means "unspecified". If we end up passing zero // to bindSocket*(), it unsets the binding and lets the socket @@ -22,7 +22,7 @@ func interfaceIndex(iface *winipcfg.Interface) uint32 { // default route we can use. return 0 } - return iface.Index + return iface.IfIndex } // control binds c to the Windows interface that holds a default @@ -39,7 +39,7 @@ func control(network, address string, c syscall.RawConn) error { } if canV4 { - iface, err := interfaces.GetWindowsDefault(winipcfg.AF_INET) + iface, err := interfaces.GetWindowsDefault(windows.AF_INET) if err != nil { return err } @@ -49,7 +49,7 @@ func control(network, address string, c syscall.RawConn) error { } if canV6 { - iface, err := interfaces.GetWindowsDefault(winipcfg.AF_INET6) + iface, err := interfaces.GetWindowsDefault(windows.AF_INET6) if err != nil { return err } diff --git a/wgengine/router/ifconfig_windows.go b/wgengine/router/ifconfig_windows.go index 66386059c..e1169e9b6 100644 --- a/wgengine/router/ifconfig_windows.go +++ b/wgengine/router/ifconfig_windows.go @@ -11,15 +11,14 @@ "fmt" "log" "net" - "os" "sort" "time" "github.com/go-multierror/multierror" ole "github.com/go-ole/go-ole" - winipcfg "github.com/tailscale/winipcfg-go" "github.com/tailscale/wireguard-go/tun" "golang.org/x/sys/windows" + "golang.zx2c4.com/wireguard/windows/tunnel/winipcfg" "tailscale.com/net/interfaces" "tailscale.com/wgengine/winnet" ) @@ -40,51 +39,51 @@ // help with MTU issues compared to a static 1280B implementation. func monitorDefaultRoutes(tun *tun.NativeTun) (*winipcfg.RouteChangeCallback, error) { guid := tun.GUID() - ourLuid, err := winipcfg.InterfaceGuidToLuid(&guid) + ourLuid, err := winipcfg.LUIDFromGUID(&guid) lastMtu := uint32(0) if err != nil { - return nil, err + return nil, fmt.Errorf("error mapping GUID %v to LUID: %w", guid, err) } doIt := func() error { mtu, err := getDefaultRouteMTU() if err != nil { - return err + return fmt.Errorf("error getting default route MTU: %w", err) } if mtu > 0 && (lastMtu == 0 || lastMtu != mtu) { - iface, err := winipcfg.GetIpInterface(ourLuid, winipcfg.AF_INET) + iface, err := ourLuid.IPInterface(windows.AF_INET) if err != nil { - return err + return fmt.Errorf("error getting v4 interface: %w", err) } - iface.NlMtu = mtu - 80 + iface.NLMTU = mtu - 80 // If the TUN device was created with a smaller MTU, // though, such as 1280, we don't want to go bigger than // configured. (See the comment on minimalMTU in the // wgengine package.) - if min, err := tun.MTU(); err == nil && min < int(iface.NlMtu) { - iface.NlMtu = uint32(min) + if min, err := tun.MTU(); err == nil && min < int(iface.NLMTU) { + iface.NLMTU = uint32(min) } - if iface.NlMtu < 576 { - iface.NlMtu = 576 + if iface.NLMTU < 576 { + iface.NLMTU = 576 } err = iface.Set() if err != nil { - return err + return fmt.Errorf("error setting v4 MTU: %w", err) } - tun.ForceMTU(int(iface.NlMtu)) - iface, err = winipcfg.GetIpInterface(ourLuid, winipcfg.AF_INET6) + tun.ForceMTU(int(iface.NLMTU)) + iface, err = ourLuid.IPInterface(windows.AF_INET6) if err != nil { - if !isMissingIPv6Err(err) { - return err + if !errors.Is(err, windows.ERROR_NOT_FOUND) { + return fmt.Errorf("error getting v6 interface: %w", err) } } else { - iface.NlMtu = mtu - 80 - if iface.NlMtu < 1280 { - iface.NlMtu = 1280 + iface.NLMTU = mtu - 80 + if iface.NLMTU < 1280 { + iface.NLMTU = 1280 } err = iface.Set() if err != nil { - return err + return fmt.Errorf("error setting v6 MTU: %w", err) } } lastMtu = mtu @@ -95,7 +94,7 @@ func monitorDefaultRoutes(tun *tun.NativeTun) (*winipcfg.RouteChangeCallback, er if err != nil { return nil, err } - cb, err := winipcfg.RegisterRouteChangeCallback(func(notificationType winipcfg.MibNotificationType, route *winipcfg.Route) { + cb, err := winipcfg.RegisterRouteChangeCallback(func(notificationType winipcfg.MibNotificationType, route *winipcfg.MibIPforwardRow2) { //fmt.Printf("MonitorDefaultRoutes: changed: %v\n", route.DestinationPrefix) if route.DestinationPrefix.PrefixLength == 0 { _ = doIt() @@ -113,7 +112,7 @@ func getDefaultRouteMTU() (uint32, error) { return 0, err } - routes, err := winipcfg.GetRoutes(winipcfg.AF_INET) + routes, err := winipcfg.GetIPForwardTable2(windows.AF_INET) if err != nil { return 0, err } @@ -123,7 +122,7 @@ func getDefaultRouteMTU() (uint32, error) { if route.DestinationPrefix.PrefixLength != 0 { continue } - routeMTU := mtus[route.InterfaceLuid] + routeMTU := mtus[route.InterfaceLUID] if routeMTU == 0 { continue } @@ -133,7 +132,7 @@ func getDefaultRouteMTU() (uint32, error) { } } - routes, err = winipcfg.GetRoutes(winipcfg.AF_INET6) + routes, err = winipcfg.GetIPForwardTable2(windows.AF_INET6) if err != nil { return 0, err } @@ -142,7 +141,7 @@ func getDefaultRouteMTU() (uint32, error) { if route.DestinationPrefix.PrefixLength != 0 { continue } - routeMTU := mtus[route.InterfaceLuid] + routeMTU := mtus[route.InterfaceLUID] if routeMTU == 0 { continue } @@ -215,16 +214,34 @@ func setPrivateNetwork(ifcGUID *windows.GUID) (bool, error) { return false, nil } +// interfaceFromGUID returns IPAdapterAddresses with specified GUID. +func interfaceFromGUID(guid *windows.GUID, flags winipcfg.GAAFlags) (*winipcfg.IPAdapterAddresses, error) { + luid, err := winipcfg.LUIDFromGUID(guid) + if err != nil { + return nil, err + } + addresses, err := winipcfg.GetAdaptersAddresses(windows.AF_UNSPEC, flags) + if err != nil { + return nil, err + } + for _, addr := range addresses { + if addr.LUID == luid { + return addr, nil + } + } + return nil, fmt.Errorf("interfaceFromGUID: interface with LUID %v (from GUID %v) not found", luid, guid) +} + func configureInterface(cfg *Config, tun *tun.NativeTun) error { const mtu = 0 guid := tun.GUID() - iface, err := winipcfg.InterfaceFromGUIDEx(&guid, &winipcfg.GetAdapterAddressesFlags{ + iface, err := interfaceFromGUID(&guid, // Issue 474: on early boot, when the network is still // coming up, if the Tailscale service comes up first, // the Tailscale adapter it finds might not have the // IPv4 service available yet? Try this flag: - GAA_FLAG_INCLUDE_ALL_INTERFACES: true, - }) + winipcfg.GAAFlagIncludeAllInterfaces, + ) if err != nil { return err } @@ -327,6 +344,18 @@ func configureInterface(cfg *Config, tun *tun.NativeTun) error { deduplicatedRoutes = append(deduplicatedRoutes, &routes[i]) } + // Re-read interface after syncAddresses. + iface, err = interfaceFromGUID(&guid, + // Issue 474: on early boot, when the network is still + // coming up, if the Tailscale service comes up first, + // the Tailscale adapter it finds might not have the + // IPv4 service available yet? Try this flag: + winipcfg.GAAFlagIncludeAllInterfaces, + ) + if err != nil { + return err + } + var errAcc error err = syncRoutes(iface, deduplicatedRoutes) if err != nil && errAcc == nil { @@ -334,7 +363,7 @@ func configureInterface(cfg *Config, tun *tun.NativeTun) error { errAcc = err } - ipif, err := iface.GetIpInterface(winipcfg.AF_INET) + ipif, err := iface.LUID.IPInterface(windows.AF_INET) if err != nil { log.Printf("getipif: %v", err) return err @@ -344,17 +373,17 @@ func configureInterface(cfg *Config, tun *tun.NativeTun) error { ipif.Metric = 0 } if mtu > 0 { - ipif.NlMtu = uint32(mtu) - tun.ForceMTU(int(ipif.NlMtu)) + ipif.NLMTU = uint32(mtu) + tun.ForceMTU(int(ipif.NLMTU)) } err = ipif.Set() if err != nil && errAcc == nil { errAcc = err } - ipif, err = iface.GetIpInterface(winipcfg.AF_INET6) + ipif, err = iface.LUID.IPInterface(windows.AF_INET6) if err != nil { - if !isMissingIPv6Err(err) { + if !errors.Is(err, windows.ERROR_NOT_FOUND) { return err } } else { @@ -363,7 +392,7 @@ func configureInterface(cfg *Config, tun *tun.NativeTun) error { ipif.Metric = 0 } if mtu > 0 { - ipif.NlMtu = uint32(mtu) + ipif.NLMTU = uint32(mtu) } ipif.DadTransmits = 0 ipif.RouterDiscoveryBehavior = winipcfg.RouterDiscoveryDisabled @@ -376,22 +405,6 @@ func configureInterface(cfg *Config, tun *tun.NativeTun) error { return errAcc } -// isMissingIPv6Err reports whether err is due to IPv6 not being enabled on the machine. -// -// It only currently supports the errors returned by winipcfg.Interface.GetIpInterface. -func isMissingIPv6Err(err error) bool { - if se, ok := err.(*os.SyscallError); ok { - switch se.Syscall { - case "iphlpapi.GetIpInterfaceEntry": - // ERROR_NOT_FOUND from means the address family (IPv6) is not found. - // (ERROR_FILE_NOT_FOUND means that the interface doesn't exist.) - // https://docs.microsoft.com/en-us/windows/win32/api/netioapi/nf-netioapi-getipinterfaceentry - return se.Err == windows.ERROR_NOT_FOUND - } - } - return false -} - // routeLess reports whether ri should sort before rj. // The actual sort order doesn't appear to matter. The caller just // wants them sorted to be able to de-dup. @@ -495,31 +508,53 @@ func excludeIPv6LinkLocal(in []*net.IPNet) (out []*net.IPNet) { return out } +// ipAdapterUnicastAddressToIPNet converts windows.IpAdapterUnicastAddress to net.IPNet. +func ipAdapterUnicastAddressToIPNet(u *windows.IpAdapterUnicastAddress) *net.IPNet { + ip := u.Address.IP() + w := 32 + if ip.To4() == nil { + w = 128 + } + return &net.IPNet{ + IP: ip, + Mask: net.CIDRMask(int(u.OnLinkPrefixLength), w), + } +} + +// unicastIPNets returns all unicast net.IPNet for ifc interface. +func unicastIPNets(ifc *winipcfg.IPAdapterAddresses) []*net.IPNet { + nets := make([]*net.IPNet, 0) + for addr := ifc.FirstUnicastAddress; addr != nil; addr = addr.Next { + nets = append(nets, ipAdapterUnicastAddressToIPNet(addr)) + } + return nets +} + // syncAddresses incrementally sets the interface's unicast IP addresses, // doing the minimum number of AddAddresses & DeleteAddress calls. // This avoids the full FlushAddresses. // // Any IPv6 link-local addresses are not deleted. -func syncAddresses(ifc *winipcfg.Interface, want []*net.IPNet) error { +func syncAddresses(ifc *winipcfg.IPAdapterAddresses, want []*net.IPNet) error { var erracc error - got := ifc.UnicastIPNets + got := unicastIPNets(ifc) add, del := deltaNets(got, want) del = excludeIPv6LinkLocal(del) for _, a := range del { - err := ifc.DeleteAddress(&a.IP) + err := ifc.LUID.DeleteIPAddress(*a) if err != nil { erracc = err } } - err := ifc.AddAddresses(add) - if err != nil { - erracc = err + for _, a := range add { + err := ifc.LUID.AddIPAddress(*a) + if err != nil { + erracc = err + } } - ifc.UnicastIPNets = make([]*net.IPNet, len(want)) - copy(ifc.UnicastIPNets, want) return erracc } @@ -588,28 +623,46 @@ func deltaRouteData(a, b []*winipcfg.RouteData) (add, del []*winipcfg.RouteData) return } +// getInterfaceRoutes returns all the interface's routes. +// Corresponds to GetIpForwardTable2 function, but filtered by interface. +func getInterfaceRoutes(ifc *winipcfg.IPAdapterAddresses, family winipcfg.AddressFamily) ([]*winipcfg.MibIPforwardRow2, error) { + routes, err := winipcfg.GetIPForwardTable2(family) + if err != nil { + return nil, err + } + matches := make([]*winipcfg.MibIPforwardRow2, len(routes)) + i := 0 + for i := range routes { + if routes[i].InterfaceLUID == ifc.LUID { + matches[i] = &routes[i] + i++ + } + } + return matches[:i], nil +} + // syncRoutes incrementally sets multiples routes on an interface. // This avoids a full ifc.FlushRoutes call. -func syncRoutes(ifc *winipcfg.Interface, want []*winipcfg.RouteData) error { - routes, err := ifc.GetRoutes(windows.AF_INET) +func syncRoutes(ifc *winipcfg.IPAdapterAddresses, want []*winipcfg.RouteData) error { + routes, err := getInterfaceRoutes(ifc, windows.AF_INET) if err != nil { return err } got := make([]*winipcfg.RouteData, 0, len(routes)) for _, r := range routes { - v, err := r.ToRouteData() - if err != nil { - return err - } - got = append(got, v) + got = append(got, &winipcfg.RouteData{ + Destination: r.DestinationPrefix.IPNet(), + NextHop: r.NextHop.IP(), + Metric: r.Metric, + }) } add, del := deltaRouteData(got, want) var errs []error for _, a := range del { - err := ifc.DeleteRoute(&a.Destination, &a.NextHop) + err := ifc.LUID.DeleteRoute(a.Destination, a.NextHop) if err != nil { dstStr := a.Destination.String() if dstStr == "169.254.255.255/32" { @@ -622,7 +675,7 @@ func syncRoutes(ifc *winipcfg.Interface, want []*winipcfg.RouteData) error { } for _, a := range add { - err := ifc.AddRoute(a) + err := ifc.LUID.AddRoute(a.Destination, a.NextHop, a.Metric) if err != nil { errs = append(errs, fmt.Errorf("adding route %v: %w", &a.Destination, err)) } diff --git a/wgengine/router/ifconfig_windows_test.go b/wgengine/router/ifconfig_windows_test.go index b43c5d91c..7819e9e8d 100644 --- a/wgengine/router/ifconfig_windows_test.go +++ b/wgengine/router/ifconfig_windows_test.go @@ -11,7 +11,7 @@ "strings" "testing" - winipcfg "github.com/tailscale/winipcfg-go" + "golang.zx2c4.com/wireguard/windows/tunnel/winipcfg" "inet.af/netaddr" ) diff --git a/wgengine/router/router_windows.go b/wgengine/router/router_windows.go index e716e5e8c..d571ee472 100644 --- a/wgengine/router/router_windows.go +++ b/wgengine/router/router_windows.go @@ -11,9 +11,9 @@ "syscall" "time" - winipcfg "github.com/tailscale/winipcfg-go" "github.com/tailscale/wireguard-go/device" "github.com/tailscale/wireguard-go/tun" + "golang.zx2c4.com/wireguard/windows/tunnel/winipcfg" "tailscale.com/types/logger" "tailscale.com/wgengine/router/dns" )