@@ -187,6 +187,7 @@ func NewConn(options *Options) (*Conn, error) {
187
187
logIPs ,_ := logIPSet .IPSet ()
188
188
wireguardEngine .SetFilter (filter .New (netMap .PacketFilter ,localIPs ,logIPs ,nil ,Logger (options .Logger .Named ("packet-filter" ))))
189
189
server := & Conn {
190
+ closed :make (chan struct {}),
190
191
logger :options .Logger ,
191
192
magicConn :magicConn ,
192
193
dialer :dialer ,
@@ -341,16 +342,16 @@ func (c *Conn) Closed() chan<- struct{} {
341
342
342
343
// Close shuts down the Wireguard connection.
343
344
func (c * Conn )Close ()error {
344
- for _ ,l := range c .listeners {
345
- _ = l .Close ()
346
- }
347
345
c .mutex .Lock ()
348
346
defer c .mutex .Unlock ()
349
347
select {
350
348
case <- c .closed :
351
349
return nil
352
350
default :
353
351
}
352
+ for _ ,l := range c .listeners {
353
+ _ = l .closeNoLock ()
354
+ }
354
355
close (c .closed )
355
356
_ = c .dialer .Close ()
356
357
_ = c .magicConn .Close ()
@@ -454,6 +455,10 @@ func (ln *listener) Addr() net.Addr { return addr{ln} }
454
455
func (ln * listener )Close ()error {
455
456
ln .s .mutex .Lock ()
456
457
defer ln .s .mutex .Unlock ()
458
+ return ln .closeNoLock ()
459
+ }
460
+
461
+ func (ln * listener )closeNoLock ()error {
457
462
if v ,ok := ln .s .listeners [ln .key ];ok && v == ln {
458
463
delete (ln .s .listeners ,ln .key )
459
464
close (ln .conn )