Skip to content

Commit a5db80d

Browse files
committed
Fix nfqueue fallback when kernel module unavailable
1 parent a850c4f commit a5db80d

File tree

2 files changed

+14
-20
lines changed

2 files changed

+14
-20
lines changed

nfqueue_linux.go

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ package tun
55
import (
66
"context"
77
"errors"
8-
"sync"
98
"sync/atomic"
109

1110
"github.com/sagernet/sing-tun/internal/gtcpip/header"
@@ -30,7 +29,6 @@ type nfqueueHandler struct {
3029
queue uint16
3130
outputMark uint32
3231
resetMark uint32
33-
wg sync.WaitGroup
3432
closed atomic.Bool
3533
}
3634

@@ -82,28 +80,25 @@ func (h *nfqueueHandler) Start() error {
8280
if err != nil {
8381
return E.Cause(err, "open nfqueue")
8482
}
85-
h.nfq = nfq
8683

8784
if err = nfq.SetOption(netlink.NoENOBUFS, true); err != nil {
88-
h.nfq.Close()
85+
nfq.Close()
8986
return E.Cause(err, "set nfqueue option")
9087
}
9188

92-
h.wg.Add(1)
93-
go func() {
94-
defer h.wg.Done()
95-
err := nfq.RegisterWithErrorFunc(h.ctx, h.handlePacket, func(e error) int {
96-
if h.ctx.Err() != nil {
97-
return 1
98-
}
99-
h.logger.Error("nfqueue error: ", e)
100-
return 0
101-
})
102-
if err != nil && h.ctx.Err() == nil {
103-
h.logger.Error("nfqueue register error: ", err)
89+
err = nfq.RegisterWithErrorFunc(h.ctx, h.handlePacket, func(e error) int {
90+
if h.ctx.Err() != nil {
91+
return 1
10492
}
105-
}()
93+
h.logger.Error("nfqueue error: ", e)
94+
return 0
95+
})
96+
if err != nil {
97+
nfq.Close()
98+
return E.Cause(err, "register nfqueue")
99+
}
106100

101+
h.nfq = nfq
107102
return nil
108103
}
109104

@@ -239,6 +234,5 @@ func (h *nfqueueHandler) Close() error {
239234
if h.nfq != nil {
240235
h.nfq.Close()
241236
}
242-
h.wg.Wait()
243237
return nil
244238
}

redirect_linux.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -143,9 +143,9 @@ func (r *autoRedirect) Start() error {
143143
ResetMark: r.effectiveResetMark(),
144144
})
145145
if err != nil {
146-
r.logger.Warn("nfqueue not available, pre-match disabled: ", err)
146+
r.logger.Warn("nfqueue not available, pre-match disabled (missing nfnetlink_queue and nft_queue kernel module?): ", err)
147147
} else if err = handler.Start(); err != nil {
148-
r.logger.Warn("nfqueue start failed, pre-match disabled: ", err)
148+
r.logger.Warn("nfqueue start failed, pre-match disabled (missing nfnetlink_queue and nft_queue kernel module?): ", err)
149149
} else {
150150
r.nfqueueHandler = handler
151151
r.nfqueueEnabled = true

0 commit comments

Comments
 (0)