@@ -24,26 +24,32 @@ const (
2424)
2525
2626type Tunnel struct {
27- p2p P2p
28- conf * config.Config
29- device * vpn.Device
30- logger * log.ZapEventLogger
31- peersLock sync.RWMutex
32- peerIDToPeer map [peer.ID ]* VpnPeer
33- netIPToPeer map [string ]* VpnPeer
27+ p2p P2p
28+ conf * config.Config
29+ device * vpn.Device
30+ logger * log.ZapEventLogger
31+
32+ isClosed atomic.Bool
33+ peersLock sync.RWMutex
34+ peerIDToPeer map [peer.ID ]* VpnPeer
35+ netIPToPeer map [string ]* VpnPeer
36+ udpBroadcastAddr net.IP
3437}
3538
3639func NewTunnel (p2pService P2p , device * vpn.Device , conf * config.Config ) * Tunnel {
40+ localIP , netMask := conf .VPNLocalIPMask ()
41+ udpBroadcastAddr := vpn .GetIPv4BroadcastAddress (& net.IPNet {IP : localIP , Mask : netMask })
42+
3743 tunnel := & Tunnel {
38- p2p : p2pService ,
39- conf : conf ,
40- device : device ,
41- logger : log .Logger ("awl/service/tunnel" ),
42- peerIDToPeer : make (map [peer.ID ]* VpnPeer ),
43- netIPToPeer : make (map [string ]* VpnPeer ),
44+ p2p : p2pService ,
45+ conf : conf ,
46+ device : device ,
47+ logger : log .Logger ("awl/service/tunnel" ),
48+ peerIDToPeer : make (map [peer.ID ]* VpnPeer ),
49+ netIPToPeer : make (map [string ]* VpnPeer ),
50+ udpBroadcastAddr : udpBroadcastAddr ,
4451 }
4552 tunnel .RefreshPeersList ()
46- go tunnel .backgroundReadPackets ()
4753
4854 return tunnel
4955}
@@ -160,6 +166,8 @@ func (t *Tunnel) Close() {
160166 t .peersLock .Lock ()
161167 defer t .peersLock .Unlock ()
162168
169+ t .isClosed .Store (true )
170+
163171 for _ , vpnPeer := range t .peerIDToPeer {
164172 localIP := * vpnPeer .localIP .Load ()
165173 vpnPeer .Close (t )
@@ -168,17 +176,24 @@ func (t *Tunnel) Close() {
168176 }
169177}
170178
171- func (t * Tunnel ) backgroundReadPackets () {
172- localIP , netMask := t .conf .VPNLocalIPMask ()
173- broadcastAddr := vpn .GetIPv4BroadcastAddress (& net.IPNet {IP : localIP , Mask : netMask })
179+ // HandleReadPackets for successfully handled packets it sets packet in slice as nil
180+ func (t * Tunnel ) HandleReadPackets (packets []* vpn.Packet ) {
181+ t .peersLock .RLock ()
182+ defer t .peersLock .RUnlock ()
183+
184+ if t .isClosed .Load () {
185+ return
186+ }
187+
188+ for i , packet := range packets {
189+ if packet == nil {
190+ continue
191+ }
174192
175- // TODO: batch read
176- for packet := range t .device .OutboundChan () {
177193 // TODO: ipv6 support
178- if packet .Dst .Equal (broadcastAddr ) || packet .Dst .Equal (net .IPv4bcast ) {
194+ if packet .Dst .Equal (t . udpBroadcastAddr ) || packet .Dst .Equal (net .IPv4bcast ) {
179195 // udp broadcast
180196
181- t .peersLock .RLock ()
182197 for _ , vpnPeer := range t .netIPToPeer {
183198 // TODO: replace with event-based check OnConnected/OnDisconnected to improve performance
184199 if ! t .p2p .IsConnected (vpnPeer .peerID ) {
@@ -195,26 +210,19 @@ func (t *Tunnel) backgroundReadPackets() {
195210 }
196211 }
197212
198- t .device .PutTempPacket (packet )
199- t .peersLock .RUnlock ()
200-
201213 continue
202214 }
203215
204- t .peersLock .RLock ()
205216 vpnPeer , ok := t .netIPToPeer [string (packet .Dst )]
206217 if ! ok {
207- t .device .PutTempPacket (packet )
208- t .peersLock .RUnlock ()
209218 continue
210219 }
211220
212221 select {
213222 case vpnPeer .outboundCh <- packet :
223+ packets [i ] = nil
214224 default :
215- t .device .PutTempPacket (packet )
216225 }
217- t .peersLock .RUnlock ()
218226 }
219227}
220228
0 commit comments