Skip to content

Commit cbc512f

Browse files
committed
Add inactivity ping
1 parent 8afca6c commit cbc512f

File tree

3 files changed

+25
-25
lines changed

3 files changed

+25
-25
lines changed

tailnet/conn.go

+13-21
Original file line numberDiff line numberDiff line change
@@ -161,21 +161,6 @@ func NewConn(options *Options) (*Conn, error) {
161161
return nil, xerrors.Errorf("start netstack: %w", err)
162162
}
163163
wireguardEngine = wgengine.NewWatchdog(wireguardEngine)
164-
165-
// Update the wireguard configuration to allow traffic to flow.
166-
wireguardConfig, err := nmcfg.WGCfg(netMap, Logger(options.Logger.Named("wgconfig")), netmap.AllowSingleHosts, "")
167-
if err != nil {
168-
return nil, xerrors.Errorf("create wgcfg: %w", err)
169-
}
170-
171-
wireguardRouter := &router.Config{
172-
LocalAddrs: wireguardConfig.Addresses,
173-
}
174-
err = wireguardEngine.Reconfig(wireguardConfig, wireguardRouter, &dns.Config{}, &tailcfg.Debug{})
175-
if err != nil {
176-
return nil, xerrors.Errorf("reconfig: %w", err)
177-
}
178-
179164
wireguardEngine.SetDERPMap(options.DERPMap)
180165
netMapCopy := *netMap
181166
wireguardEngine.SetNetworkMap(&netMapCopy)
@@ -198,8 +183,10 @@ func NewConn(options *Options) (*Conn, error) {
198183
netMap: netMap,
199184
netStack: netStack,
200185
wireguardMonitor: wireguardMonitor,
201-
wireguardRouter: wireguardRouter,
202-
wireguardEngine: wireguardEngine,
186+
wireguardRouter: &router.Config{
187+
LocalAddrs: netMap.Addresses,
188+
},
189+
wireguardEngine: wireguardEngine,
203190
}
204191
netStack.ForwardTCPIn = server.forwardTCP
205192
return server, nil
@@ -261,7 +248,7 @@ func (c *Conn) SetNodeCallback(callback func(node *Node)) {
261248
DERPLatency: c.lastDERPLatency,
262249
}
263250
}
264-
c.magicConn.SetNetInfoCallback(func(ni *tailcfg.NetInfo) {
251+
c.wireguardEngine.SetNetInfoCallback(func(ni *tailcfg.NetInfo) {
265252
c.lastMutex.Lock()
266253
c.lastPreferredDERP = ni.PreferredDERP
267254
c.lastDERPLatency = ni.DERPLatency
@@ -309,6 +296,7 @@ func (c *Conn) UpdateNodes(nodes []*Node) error {
309296
peerMap[peer.ID] = peer
310297
}
311298
for _, node := range nodes {
299+
peerStatus, ok := status.Peer[node.Key]
312300
peerMap[node.ID] = &tailcfg.Node{
313301
ID: node.ID,
314302
Key: node.Key,
@@ -318,12 +306,18 @@ func (c *Conn) UpdateNodes(nodes []*Node) error {
318306
Endpoints: node.Endpoints,
319307
DERP: fmt.Sprintf("%s:%d", tailcfg.DerpMagicIP, node.PreferredDERP),
320308
Hostinfo: hostinfo.New().View(),
309+
// Starting KeepAlive messages at the initialization
310+
// of a connection cause it to hang for an unknown
311+
// reason. TODO: @kylecarbs debug this!
312+
KeepAlive: ok && peerStatus.Active,
321313
}
322314
}
323315
c.netMap.Peers = make([]*tailcfg.Node, 0, len(peerMap))
324316
for _, peer := range peerMap {
325317
c.netMap.Peers = append(c.netMap.Peers, peer)
326318
}
319+
netMapCopy := *c.netMap
320+
c.wireguardEngine.SetNetworkMap(&netMapCopy)
327321
cfg, err := nmcfg.WGCfg(c.netMap, Logger(c.logger.Named("wgconfig")), netmap.AllowSingleHosts, "")
328322
if err != nil {
329323
return xerrors.Errorf("update wireguard config: %w", err)
@@ -332,15 +326,13 @@ func (c *Conn) UpdateNodes(nodes []*Node) error {
332326
if err != nil {
333327
return xerrors.Errorf("reconfig: %w", err)
334328
}
335-
netMapCopy := *c.netMap
336-
c.wireguardEngine.SetNetworkMap(&netMapCopy)
337329
return nil
338330
}
339331

340332
// Status returns the current ipnstate of a connection.
341333
func (c *Conn) Status() *ipnstate.Status {
342334
sb := &ipnstate.StatusBuilder{}
343-
c.magicConn.UpdateStatus(sb)
335+
c.wireguardEngine.UpdateStatus(sb)
344336
return sb.Status()
345337
}
346338

tailnet/conn_test.go

+4-2
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,12 @@ func TestTailnet(t *testing.T) {
5555
_ = w2.Close()
5656
})
5757
w1.SetNodeCallback(func(node *tailnet.Node) {
58-
w2.UpdateNodes([]*tailnet.Node{node})
58+
err := w2.UpdateNodes([]*tailnet.Node{node})
59+
require.NoError(t, err)
5960
})
6061
w2.SetNodeCallback(func(node *tailnet.Node) {
61-
w1.UpdateNodes([]*tailnet.Node{node})
62+
err := w1.UpdateNodes([]*tailnet.Node{node})
63+
require.NoError(t, err)
6264
})
6365

6466
conn := make(chan struct{})

tailnet/coordinator.go

+8-2
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,10 @@ func ServeCoordinator(conn net.Conn, updateNodes func(node []*Node) error) (func
4040
}
4141
err = updateNodes(nodes)
4242
if err != nil {
43-
errChan <- xerrors.Errorf("update nodes: %w", err)
43+
select {
44+
case errChan <- xerrors.Errorf("update nodes: %w", err):
45+
default:
46+
}
4447
}
4548
}
4649
}()
@@ -53,7 +56,10 @@ func ServeCoordinator(conn net.Conn, updateNodes func(node []*Node) error) (func
5356
}
5457
_, err = conn.Write(data)
5558
if err != nil {
56-
errChan <- xerrors.Errorf("write: %w", err)
59+
select {
60+
case errChan <- xerrors.Errorf("write: %w", err):
61+
default:
62+
}
5763
}
5864
}, errChan
5965
}

0 commit comments

Comments
 (0)