non-blocking io for linux

This commit is contained in:
Nate Brown
2025-04-02 22:57:37 -05:00
committed by JackDoan
parent 6f022a2fff
commit 685364e10f
4 changed files with 195 additions and 176 deletions

View File

@@ -290,6 +290,7 @@ func (f *Interface) listenOut(i int) {
f.readOutsidePackets(ViaSender{UdpAddr: fromUdpAddr}, plaintext[:0], payload, h, fwPacket, lhh, nb, i, ctCache.Get(f.l))
})
f.l.Errorf("udp reader %v is done", i)
f.wg.Done()
}
@@ -307,6 +308,7 @@ func (f *Interface) listenIn(reader io.ReadWriteCloser, i int) {
n, err := reader.Read(packet)
if err != nil {
if !f.closed.Load() {
//TODO: should we close? yes
f.l.WithError(err).Error("Error while reading outbound packet")
}
break
@@ -315,6 +317,7 @@ func (f *Interface) listenIn(reader io.ReadWriteCloser, i int) {
f.consumeInsidePacket(packet[:n], fwPacket, nb, out, i, conntrackCache.Get(f.l))
}
f.l.Errorf("tun reader %v is done", i)
f.wg.Done()
}
@@ -492,6 +495,7 @@ func (f *Interface) GetCertState() *CertState {
func (f *Interface) Close() error {
f.closed.Store(true)
// Release the udp readers
for _, u := range f.writers {
err := u.Close()
if err != nil {
@@ -507,6 +511,13 @@ func (f *Interface) Close() error {
}
}
// Release the tun device
return f.inside.Close()
// Release the tun readers
for _, u := range f.readers {
err := u.Close()
if err != nil {
f.l.WithError(err).Error("Error while closing tun device")
}
}
return nil
}