Skip to content

Commit 070eb31

Browse files
committed
chore: speedup system stack in tun
1 parent f318b80 commit 070eb31

File tree

5 files changed

+50
-17
lines changed

5 files changed

+50
-17
lines changed

component/iface/iface.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ type Interface struct {
1313
Index int
1414
MTU int
1515
Name string
16-
Addresses []netip.Prefix
1716
HardwareAddr net.HardwareAddr
1817
Flags net.Flags
18+
Addresses []netip.Prefix
1919
}
2020

2121
var (
@@ -65,9 +65,9 @@ func Interfaces() (map[string]*Interface, error) {
6565
Index: iface.Index,
6666
MTU: iface.MTU,
6767
Name: iface.Name,
68-
Addresses: ipNets,
6968
HardwareAddr: iface.HardwareAddr,
7069
Flags: iface.Flags,
70+
Addresses: ipNets,
7171
}
7272
}
7373

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ require (
2727
github.com/metacubex/sing-quic v0.0.0-20250119013740-2a19cce83925
2828
github.com/metacubex/sing-shadowsocks v0.2.8
2929
github.com/metacubex/sing-shadowsocks2 v0.2.2
30-
github.com/metacubex/sing-tun v0.4.5
30+
github.com/metacubex/sing-tun v0.4.6-0.20250312042506-6d3b4dc05c04
3131
github.com/metacubex/sing-vmess v0.1.14-0.20250228002636-abc39e113b82
3232
github.com/metacubex/sing-wireguard v0.0.0-20241126021510-0827d417b589
3333
github.com/metacubex/tfo-go v0.0.0-20241231083714-66613d49c422

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,8 +119,8 @@ github.com/metacubex/sing-shadowsocks v0.2.8 h1:wIhlaigswzjPw4hej75sEvWte3QR0+AJ
119119
github.com/metacubex/sing-shadowsocks v0.2.8/go.mod h1:X3x88XtJpBxG0W0/ECOJL6Ib0SJ3xdniAkU/6/RMWU0=
120120
github.com/metacubex/sing-shadowsocks2 v0.2.2 h1:eaf42uVx4Lr21S6MDYs0ZdTvGA0GEhDpb9no4+gdXPo=
121121
github.com/metacubex/sing-shadowsocks2 v0.2.2/go.mod h1:BhOug03a/RbI7y6hp6q+6ITM1dXjnLTmeWBHSTwvv2Q=
122-
github.com/metacubex/sing-tun v0.4.5 h1:kWSyQzuzHI40r50OFBczfWIDvMBMy1RIk+JsXeBPRB0=
123-
github.com/metacubex/sing-tun v0.4.5/go.mod h1:V0N4rr0dWPBEE20ESkTXdbtx2riQYcb6YtwC5w/9wl0=
122+
github.com/metacubex/sing-tun v0.4.6-0.20250312042506-6d3b4dc05c04 h1:B211C+i/I8CWf4I/BaAV0mmkEHrDBJ0XR9EWxjPbFEg=
123+
github.com/metacubex/sing-tun v0.4.6-0.20250312042506-6d3b4dc05c04/go.mod h1:V0N4rr0dWPBEE20ESkTXdbtx2riQYcb6YtwC5w/9wl0=
124124
github.com/metacubex/sing-vmess v0.1.14-0.20250228002636-abc39e113b82 h1:zZp5uct9+/0Hb1jKGyqDjCU4/72t43rs7qOq3Rc9oU8=
125125
github.com/metacubex/sing-vmess v0.1.14-0.20250228002636-abc39e113b82/go.mod h1:nE7Mdzj/QUDwgRi/8BASPtsxtIFZTHA4Yst5GgwbGCQ=
126126
github.com/metacubex/sing-wireguard v0.0.0-20241126021510-0827d417b589 h1:Z6bNy0HLTjx6BKIkV48sV/yia/GP8Bnyb5JQuGgSGzg=

listener/sing_tun/iface.go

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,12 @@ package sing_tun
22

33
import (
44
"errors"
5+
"net"
56
"net/netip"
67

78
"github.com/metacubex/mihomo/component/iface"
89

9-
"github.com/sagernet/sing/common/control"
10+
"github.com/metacubex/sing-tun/control"
1011
)
1112

1213
type defaultInterfaceFinder struct{}
@@ -33,33 +34,49 @@ func (f *defaultInterfaceFinder) Interfaces() []control.Interface {
3334

3435
var errNoSuchInterface = errors.New("no such network interface")
3536

36-
func (f *defaultInterfaceFinder) InterfaceIndexByName(name string) (int, error) {
37+
func (f *defaultInterfaceFinder) ByName(name string) (*control.Interface, error) {
3738
ifaces, err := iface.Interfaces()
3839
if err != nil {
39-
return 0, err
40+
return nil, err
4041
}
4142
for _, netInterface := range ifaces {
4243
if netInterface.Name == name {
43-
return netInterface.Index, nil
44+
return (*control.Interface)(netInterface), nil
45+
}
46+
}
47+
_, err = net.InterfaceByName(name)
48+
if err == nil {
49+
err = f.Update()
50+
if err != nil {
51+
return nil, err
4452
}
53+
return f.ByName(name)
4554
}
46-
return 0, errNoSuchInterface
55+
return nil, errNoSuchInterface
4756
}
4857

49-
func (f *defaultInterfaceFinder) InterfaceNameByIndex(index int) (string, error) {
58+
func (f *defaultInterfaceFinder) ByIndex(index int) (*control.Interface, error) {
5059
ifaces, err := iface.Interfaces()
5160
if err != nil {
52-
return "", err
61+
return nil, err
5362
}
5463
for _, netInterface := range ifaces {
5564
if netInterface.Index == index {
56-
return netInterface.Name, nil
65+
return (*control.Interface)(netInterface), nil
66+
}
67+
}
68+
_, err = net.InterfaceByIndex(index)
69+
if err == nil {
70+
err = f.Update()
71+
if err != nil {
72+
return nil, err
5773
}
74+
return f.ByIndex(index)
5875
}
59-
return "", errNoSuchInterface
76+
return nil, errNoSuchInterface
6077
}
6178

62-
func (f *defaultInterfaceFinder) InterfaceByAddr(addr netip.Addr) (*control.Interface, error) {
79+
func (f *defaultInterfaceFinder) ByAddr(addr netip.Addr) (*control.Interface, error) {
6380
ifaces, err := iface.Interfaces()
6481
if err != nil {
6582
return nil, err

listener/sing_tun/server.go

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
"github.com/metacubex/mihomo/log"
2424

2525
tun "github.com/metacubex/sing-tun"
26+
"github.com/metacubex/sing-tun/control"
2627
"github.com/sagernet/sing/common"
2728
E "github.com/sagernet/sing/common/exceptions"
2829
F "github.com/sagernet/sing/common/format"
@@ -291,7 +292,12 @@ func New(options LC.Tun, tunnel C.Tunnel, additions ...inbound.Addition) (l *Lis
291292
return
292293
}
293294
l.defaultInterfaceMonitor = defaultInterfaceMonitor
294-
defaultInterfaceMonitor.RegisterCallback(func(event int) {
295+
defaultInterfaceMonitor.RegisterCallback(func(defaultInterface *control.Interface, event int) {
296+
if defaultInterface != nil {
297+
log.Warnln("[TUN] default interface changed by monitor, => %s", defaultInterface.Name)
298+
} else {
299+
log.Errorln("[TUN] default interface lost by monitor")
300+
}
295301
iface.FlushCache()
296302
resolver.ResetConnection() // reset resolver's connection after default interface changed
297303
})
@@ -534,9 +540,19 @@ type cDialerInterfaceFinder struct {
534540
defaultInterfaceMonitor tun.DefaultInterfaceMonitor
535541
}
536542

543+
func (d *cDialerInterfaceFinder) DefaultInterfaceName(destination netip.Addr) string {
544+
if netInterface, _ := DefaultInterfaceFinder.ByAddr(destination); netInterface != nil {
545+
return netInterface.Name
546+
}
547+
if netInterface := d.defaultInterfaceMonitor.DefaultInterface(); netInterface != nil {
548+
return netInterface.Name
549+
}
550+
return ""
551+
}
552+
537553
func (d *cDialerInterfaceFinder) FindInterfaceName(destination netip.Addr) string {
538554
for _, dest := range []netip.Addr{destination, netip.IPv4Unspecified(), netip.IPv6Unspecified()} {
539-
autoDetectInterfaceName := d.defaultInterfaceMonitor.DefaultInterfaceName(dest)
555+
autoDetectInterfaceName := d.DefaultInterfaceName(dest)
540556
if autoDetectInterfaceName == d.tunName {
541557
log.Warnln("[TUN] Auto detect interface for %s get same name with tun", destination.String())
542558
} else if autoDetectInterfaceName == "" || autoDetectInterfaceName == "<nil>" {

0 commit comments

Comments
 (0)