@@ -44,6 +44,7 @@ type netTun struct {
44
44
stack * stack.Stack
45
45
events chan tun.Event
46
46
incomingPacket chan * buffer.View
47
+ closed chan struct {}
47
48
mtu int
48
49
dnsServers []netip.Addr
49
50
hasV4 , hasV6 bool
@@ -62,6 +63,7 @@ func CreateNetTUN(localAddresses, dnsServers []netip.Addr, mtu int) (tun.Device,
62
63
stack : stack .New (opts ),
63
64
events : make (chan tun.Event , 10 ),
64
65
incomingPacket : make (chan * buffer.View ),
66
+ closed : make (chan struct {}),
65
67
dnsServers : dnsServers ,
66
68
mtu : mtu ,
67
69
}
@@ -120,17 +122,17 @@ func (tun *netTun) Events() <-chan tun.Event {
120
122
}
121
123
122
124
func (tun * netTun ) Read (buf [][]byte , sizes []int , offset int ) (int , error ) {
123
- view , ok := <- tun .incomingPacket
124
- if ! ok {
125
+ select {
126
+ case view := <- tun .incomingPacket :
127
+ n , err := view .Read (buf [0 ][offset :])
128
+ if err != nil {
129
+ return 0 , err
130
+ }
131
+ sizes [0 ] = n
132
+ return 1 , nil
133
+ case <- tun .closed :
125
134
return 0 , os .ErrClosed
126
135
}
127
-
128
- n , err := view .Read (buf [0 ][offset :])
129
- if err != nil {
130
- return 0 , err
131
- }
132
- sizes [0 ] = n
133
- return 1 , nil
134
136
}
135
137
136
138
func (tun * netTun ) Write (buf [][]byte , offset int ) (int , error ) {
@@ -162,7 +164,10 @@ func (tun *netTun) WriteNotify() {
162
164
view := pkt .ToView ()
163
165
pkt .DecRef ()
164
166
165
- tun .incomingPacket <- view
167
+ select {
168
+ case tun .incomingPacket <- view :
169
+ case <- tun .closed :
170
+ }
166
171
}
167
172
168
173
func (tun * netTun ) Close () error {
@@ -174,8 +179,8 @@ func (tun *netTun) Close() error {
174
179
175
180
tun .ep .Close ()
176
181
177
- if tun .incomingPacket != nil {
178
- close (tun .incomingPacket )
182
+ if tun .closed != nil {
183
+ close (tun .closed )
179
184
}
180
185
181
186
return nil
0 commit comments