@@ -2,10 +2,12 @@ package tun
22
33import (
44 "context"
5+ "errors"
56 "fmt"
67 "io"
78 "net"
89 "net/netip"
10+ "sync"
911
1012 tun "github.com/apernet/sing-tun"
1113 "github.com/sagernet/sing/common/buf"
@@ -48,7 +50,7 @@ type EventLogger interface {
4850 UDPError (addr string , err error )
4951}
5052
51- func (s * Server ) Serve () error {
53+ func (s * Server ) Serve (ctx context. Context ) error {
5254 if ! isIPv6Supported () {
5355 s .Logger .Warn ("tun-pre-check" , zap .String ("msg" , "IPv6 is not supported or enabled on this system, TUN device is created without IPv6 support." ))
5456 s .Inet6Address = nil
@@ -74,14 +76,23 @@ func (s *Server) Serve() error {
7476 if err != nil {
7577 return fmt .Errorf ("failed to create tun interface: %w" , err )
7678 }
77- defer tunIf . Close ()
79+ var closeTunOnce sync. Once
7880
81+ closeTun := func () {
82+ closeTunOnce .Do (func () {
83+ _ = tunIf .Close ()
84+ })
85+ }
86+ defer closeTun ()
7987 tunStack , err := tun .NewSystem (tun.StackOptions {
80- Context : context . Background () ,
88+ Context : ctx ,
8189 Tun : tunIf ,
8290 TunOptions : tunOpts ,
8391 UDPTimeout : s .Timeout ,
84- Handler : & tunHandler {s },
92+ Handler : & tunHandler {
93+ Server : s ,
94+ shutdownCtx : ctx ,
95+ },
8596 Logger : & singLogger {
8697 tag : "tun-stack" ,
8798 zapLogger : s .Logger ,
@@ -93,11 +104,25 @@ func (s *Server) Serve() error {
93104 return fmt .Errorf ("failed to create tun stack: %w" , err )
94105 }
95106 defer tunStack .Close ()
96- return tunStack .(tun.StackRunner ).Run ()
107+
108+ stopClose := context .AfterFunc (ctx , closeTun )
109+ defer stopClose ()
110+ err = tunStack .(tun.StackRunner ).Run ()
111+ if ctx .Err () != nil {
112+ return nil
113+ }
114+
115+ return err
97116}
98117
99118type tunHandler struct {
100119 * Server
120+ shutdownCtx context.Context
121+ }
122+
123+ func (t * tunHandler ) isShutdownCancellation (err error ) bool {
124+ return errors .Is (err , context .Canceled ) &&
125+ errors .Is (t .shutdownCtx .Err (), context .Canceled )
101126}
102127
103128var _ tun.Handler = (* tunHandler )(nil )
@@ -110,10 +135,11 @@ func (t *tunHandler) NewConnection(ctx context.Context, conn net.Conn, m metadat
110135 }
111136 var closeErr error
112137 defer func () {
113- if t .EventLogger != nil {
138+ if t .EventLogger != nil && ! t . isShutdownCancellation ( closeErr ) {
114139 t .EventLogger .TCPError (addr , reqAddr , closeErr )
115140 }
116141 }()
142+
117143 rc , err := t .HyClient .TCP (reqAddr )
118144 if err != nil {
119145 closeErr = err
@@ -147,10 +173,11 @@ func (t *tunHandler) NewPacketConnection(ctx context.Context, conn network.Packe
147173 }
148174 var closeErr error
149175 defer func () {
150- if t .EventLogger != nil {
176+ if t .EventLogger != nil && ! t . isShutdownCancellation ( closeErr ) {
151177 t .EventLogger .UDPError (addr , closeErr )
152178 }
153179 }()
180+
154181 rc , err := t .HyClient .UDP ()
155182 if err != nil {
156183 closeErr = err
0 commit comments