VPN: update to Tailscale v1.12.1
diff --git a/core/vpn/engine/wireguard.go b/core/vpn/engine/wireguard.go
index 35e4747..cbe5ab9 100644
--- a/core/vpn/engine/wireguard.go
+++ b/core/vpn/engine/wireguard.go
@@ -5,15 +5,17 @@
 	"log"
 
 	"github.com/giolekva/pcloud/core/vpn/types"
+	"golang.zx2c4.com/wireguard/tun"
 
-	"github.com/tailscale/wireguard-go/wgcfg"
 	"inet.af/netaddr"
-	"tailscale.com/control/controlclient"
 	"tailscale.com/ipn/ipnstate"
+	"tailscale.com/net/dns"
 	"tailscale.com/tailcfg"
+	"tailscale.com/types/netmap"
 	"tailscale.com/types/wgkey"
 	"tailscale.com/wgengine"
 	"tailscale.com/wgengine/router"
+	"tailscale.com/wgengine/wgcfg"
 )
 
 // Wireguard specific implementation of the Engine interface.
@@ -25,7 +27,14 @@
 
 // Creates Wireguard engine.
 func NewWireguardEngine(tunName string, port uint16, privKey types.PrivateKey) (Engine, error) {
-	e, err := wgengine.NewUserspaceEngine(log.Printf, tunName, port)
+	tun, err := tun.CreateTUN(tunName, 1500)
+	if err != nil {
+		return nil, err
+	}
+	e, err := wgengine.NewUserspaceEngine(log.Printf, wgengine.Config{
+		Tun:        tun,
+		ListenPort: port,
+	})
 	if err != nil {
 		return nil, err
 	}
@@ -38,7 +47,7 @@
 
 // Used for unit testing.
 func NewFakeWireguardEngine(port uint16, privKey types.PrivateKey) (Engine, error) {
-	e, err := wgengine.NewFakeUserspaceEngine(log.Printf, port, nil)
+	e, err := wgengine.NewFakeUserspaceEngine(log.Printf, port)
 	if err != nil {
 		return nil, err
 	}
@@ -55,22 +64,24 @@
 		// TODO(giolekva): we shoudld probably use hostname and share
 		// it with the controller
 		Name:       "local-node",
-		PrivateKey: wgcfg.PrivateKey(privKey),
-		Addresses: []netaddr.IPPrefix{netaddr.IPPrefix{
-			IP:   netMap.Self.VPNIP,
-			Bits: 32, // TODO(giolekva): adapt for IPv6
-		}},
-		ListenPort: port,
-		Peers:      make([]wgcfg.Peer, 0, len(netMap.Peers)),
+		PrivateKey: wgkey.Private(privKey),
+		Addresses: []netaddr.IPPrefix{netaddr.IPPrefixFrom(
+			netMap.Self.VPNIP,
+			32, // TODO(giolekva): adapt for IPv6
+		)},
+		// ListenPort: port,
+		Peers: make([]wgcfg.Peer, 0, len(netMap.Peers)),
 	}
 	for _, peer := range netMap.Peers {
 		c.Peers = append(c.Peers, wgcfg.Peer{
-			PublicKey: wgcfg.Key(peer.PublicKey),
-			AllowedIPs: []netaddr.IPPrefix{netaddr.IPPrefix{
-				IP:   peer.VPNIP,
-				Bits: 32,
-			}},
-			Endpoints:           peer.DiscoEndpoint,
+			PublicKey: wgkey.Key(peer.PublicKey),
+			AllowedIPs: []netaddr.IPPrefix{netaddr.IPPrefixFrom(
+				peer.VPNIP,
+				32,
+			)},
+			Endpoints: wgcfg.Endpoints{
+				DiscoKey: tailcfg.DiscoKey(peer.DiscoKey),
+			},
 			PersistentKeepalive: 15, // TODO(giolekva): make it configurable
 		})
 	}
@@ -79,33 +90,33 @@
 
 func genRouterConf(netMap *types.NetworkMap) *router.Config {
 	c := &router.Config{
-		LocalAddrs: []netaddr.IPPrefix{netaddr.IPPrefix{
-			IP:   netMap.Self.VPNIP,
-			Bits: 32,
-		}},
+		LocalAddrs: []netaddr.IPPrefix{netaddr.IPPrefixFrom(
+			netMap.Self.VPNIP,
+			32,
+		)},
 		Routes: make([]netaddr.IPPrefix, 0, len(netMap.Peers)),
 	}
 	for _, peer := range netMap.Peers {
-		c.Routes = append(c.Routes, netaddr.IPPrefix{
-			IP:   peer.VPNIP,
-			Bits: 32,
-		})
+		c.Routes = append(c.Routes, netaddr.IPPrefixFrom(
+			peer.VPNIP,
+			32,
+		))
 	}
 	return c
 }
 
-func genTailNetMap(privKey types.PrivateKey, port uint16, netMap *types.NetworkMap) *controlclient.NetworkMap {
-	c := &controlclient.NetworkMap{
+func genTailNetMap(privKey types.PrivateKey, port uint16, netMap *types.NetworkMap) *netmap.NetworkMap {
+	c := &netmap.NetworkMap{
 		SelfNode: &tailcfg.Node{
 			ID:       0, // TODO(giolekva): maybe IDs should be stored server side.
 			StableID: "0",
 			Name:     "0",
 			Key:      tailcfg.NodeKey(netMap.Self.PublicKey),
 			DiscoKey: tailcfg.DiscoKey(netMap.Self.DiscoKey),
-			Addresses: []netaddr.IPPrefix{netaddr.IPPrefix{
-				IP:   netMap.Self.VPNIP,
-				Bits: 32,
-			}},
+			Addresses: []netaddr.IPPrefix{netaddr.IPPrefixFrom(
+				netMap.Self.VPNIP,
+				32,
+			)},
 			AllowedIPs: make([]netaddr.IPPrefix, 0, len(netMap.Peers)),
 			Endpoints:  []string{netMap.Self.IPPort.String()},
 			KeepAlive:  true, // TODO(giolekva): make it configurable
@@ -113,10 +124,10 @@
 		NodeKey:    tailcfg.NodeKey(netMap.Self.PublicKey),
 		PrivateKey: wgkey.Private(privKey),
 		Name:       "0",
-		Addresses: []netaddr.IPPrefix{netaddr.IPPrefix{
-			IP:   netMap.Self.VPNIP,
-			Bits: 32,
-		}},
+		Addresses: []netaddr.IPPrefix{netaddr.IPPrefixFrom(
+			netMap.Self.VPNIP,
+			32,
+		)},
 		LocalPort: port,
 		Peers:     make([]*tailcfg.Node, 0, len(netMap.Peers)),
 	}
@@ -127,14 +138,14 @@
 			Name:     fmt.Sprintf("%d", i+1),
 			Key:      tailcfg.NodeKey(peer.PublicKey),
 			DiscoKey: tailcfg.DiscoKey(peer.DiscoKey),
-			Addresses: []netaddr.IPPrefix{netaddr.IPPrefix{
-				IP:   peer.VPNIP,
-				Bits: 32,
-			}},
-			AllowedIPs: []netaddr.IPPrefix{netaddr.IPPrefix{
-				IP:   netMap.Self.VPNIP,
-				Bits: 32,
-			}},
+			Addresses: []netaddr.IPPrefix{netaddr.IPPrefixFrom(
+				peer.VPNIP,
+				32,
+			)},
+			AllowedIPs: []netaddr.IPPrefix{netaddr.IPPrefixFrom(
+				netMap.Self.VPNIP,
+				32,
+			)},
 			Endpoints: []string{peer.IPPort.String()},
 			KeepAlive: true,
 		})
@@ -145,7 +156,9 @@
 func (e *WireguardEngine) Configure(netMap *types.NetworkMap) error {
 	err := e.wg.Reconfig(
 		genWireguardConf(e.privKey, e.port, netMap),
-		genRouterConf(netMap))
+		genRouterConf(netMap),
+		&dns.Config{},
+		nil)
 	if err != nil {
 		return err
 	}
@@ -158,10 +171,6 @@
 	return types.DiscoKey(e.wg.DiscoPublicKey())
 }
 
-func (e *WireguardEngine) DiscoEndpoint() string {
-	return e.DiscoKey().Endpoint()
-}
-
 func (e *WireguardEngine) Ping(ip netaddr.IP, cb func(*ipnstate.PingResult)) {
-	e.wg.Ping(ip, cb)
+	e.wg.Ping(ip, false, cb)
 }