@@ -192,19 +192,20 @@ func NewConn(options *Options) (conn *Conn, err error) {
192
192
wireguardEngine .SetFilter (filter .New (netMap .PacketFilter , localIPs , logIPs , nil , Logger (options .Logger .Named ("packet-filter" ))))
193
193
dialContext , dialCancel := context .WithCancel (context .Background ())
194
194
server := & Conn {
195
- blockEndpoints : options .BlockEndpoints ,
196
- dialContext : dialContext ,
197
- dialCancel : dialCancel ,
198
- closed : make (chan struct {}),
199
- logger : options .Logger ,
200
- magicConn : magicConn ,
201
- dialer : dialer ,
202
- listeners : map [listenKey ]* listener {},
203
- peerMap : map [tailcfg.NodeID ]* tailcfg.Node {},
204
- tunDevice : tunDevice ,
205
- netMap : netMap ,
206
- netStack : netStack ,
207
- wireguardMonitor : wireguardMonitor ,
195
+ blockEndpoints : options .BlockEndpoints ,
196
+ dialContext : dialContext ,
197
+ dialCancel : dialCancel ,
198
+ closed : make (chan struct {}),
199
+ logger : options .Logger ,
200
+ magicConn : magicConn ,
201
+ dialer : dialer ,
202
+ listeners : map [listenKey ]* listener {},
203
+ peerMap : map [tailcfg.NodeID ]* tailcfg.Node {},
204
+ lastDERPForcedWebsockets : map [int ]string {},
205
+ tunDevice : tunDevice ,
206
+ netMap : netMap ,
207
+ netStack : netStack ,
208
+ wireguardMonitor : wireguardMonitor ,
208
209
wireguardRouter : & router.Config {
209
210
LocalAddrs : netMap .Addresses ,
210
211
},
@@ -247,6 +248,17 @@ func NewConn(options *Options) (conn *Conn, err error) {
247
248
server .lastMutex .Unlock ()
248
249
server .sendNode ()
249
250
})
251
+ magicConn .SetDERPForcedWebsocketCallback (func (region int , reason string ) {
252
+ server .logger .Debug (context .Background (), "derp forced websocket" , slog .F ("region" , region ), slog .F ("reason" , reason ))
253
+ server .lastMutex .Lock ()
254
+ if server .lastDERPForcedWebsockets [region ] == reason {
255
+ server .lastMutex .Unlock ()
256
+ return
257
+ }
258
+ server .lastDERPForcedWebsockets [region ] = reason
259
+ server .lastMutex .Unlock ()
260
+ server .sendNode ()
261
+ })
250
262
netStack .ForwardTCPIn = server .forwardTCP
251
263
252
264
err = netStack .Start (nil )
@@ -299,10 +311,11 @@ type Conn struct {
299
311
nodeChanged bool
300
312
// It's only possible to store these values via status functions,
301
313
// so the values must be stored for retrieval later on.
302
- lastStatus time.Time
303
- lastEndpoints []tailcfg.Endpoint
304
- lastNetInfo * tailcfg.NetInfo
305
- nodeCallback func (node * Node )
314
+ lastStatus time.Time
315
+ lastEndpoints []tailcfg.Endpoint
316
+ lastDERPForcedWebsockets map [int ]string
317
+ lastNetInfo * tailcfg.NetInfo
318
+ nodeCallback func (node * Node )
306
319
307
320
trafficStats * connstats.Statistics
308
321
}
@@ -632,21 +645,24 @@ func (c *Conn) selfNode() *Node {
632
645
}
633
646
var preferredDERP int
634
647
var derpLatency map [string ]float64
648
+ var derpForcedWebsocket map [int ]string
635
649
if c .lastNetInfo != nil {
636
650
preferredDERP = c .lastNetInfo .PreferredDERP
637
651
derpLatency = c .lastNetInfo .DERPLatency
652
+ derpForcedWebsocket = c .lastDERPForcedWebsockets
638
653
}
639
654
640
655
node := & Node {
641
- ID : c .netMap .SelfNode .ID ,
642
- AsOf : database .Now (),
643
- Key : c .netMap .SelfNode .Key ,
644
- Addresses : c .netMap .SelfNode .Addresses ,
645
- AllowedIPs : c .netMap .SelfNode .AllowedIPs ,
646
- DiscoKey : c .magicConn .DiscoPublicKey (),
647
- Endpoints : endpoints ,
648
- PreferredDERP : preferredDERP ,
649
- DERPLatency : derpLatency ,
656
+ ID : c .netMap .SelfNode .ID ,
657
+ AsOf : database .Now (),
658
+ Key : c .netMap .SelfNode .Key ,
659
+ Addresses : c .netMap .SelfNode .Addresses ,
660
+ AllowedIPs : c .netMap .SelfNode .AllowedIPs ,
661
+ DiscoKey : c .magicConn .DiscoPublicKey (),
662
+ Endpoints : endpoints ,
663
+ PreferredDERP : preferredDERP ,
664
+ DERPLatency : derpLatency ,
665
+ DERPForcedWebsocket : derpForcedWebsocket ,
650
666
}
651
667
if c .blockEndpoints {
652
668
node .Endpoints = nil
0 commit comments