Skip to content

Commit 5d24527

Browse files
committed
Add 'preferInterfaceName' parameter to BindToInterface0
1 parent c981ac8 commit 5d24527

5 files changed

Lines changed: 19 additions & 27 deletions

File tree

common/control/bind.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import (
1010

1111
func BindToInterface(finder InterfaceFinder, interfaceName string, interfaceIndex int) Func {
1212
return func(network, address string, conn syscall.RawConn) error {
13-
return BindToInterface0(finder, conn, network, address, interfaceName, interfaceIndex)
13+
return BindToInterface0(finder, conn, network, address, interfaceName, interfaceIndex, false)
1414
}
1515
}
1616

@@ -20,16 +20,16 @@ func BindToInterfaceFunc(finder InterfaceFinder, block func(network string, addr
2020
if err != nil {
2121
return err
2222
}
23-
return BindToInterface0(finder, conn, network, address, interfaceName, interfaceIndex)
23+
return BindToInterface0(finder, conn, network, address, interfaceName, interfaceIndex, false)
2424
}
2525
}
2626

27-
func BindToInterface0(finder InterfaceFinder, conn syscall.RawConn, network string, address string, interfaceName string, interfaceIndex int) error {
27+
func BindToInterface0(finder InterfaceFinder, conn syscall.RawConn, network string, address string, interfaceName string, interfaceIndex int, preferInterfaceName bool) error {
2828
if interfaceName == "" && interfaceIndex == -1 {
2929
return E.New("interface not found: ", interfaceName)
3030
}
3131
if addr := M.ParseSocksaddr(address).Addr; addr.IsValid() && N.IsVirtual(addr) {
3232
return nil
3333
}
34-
return bindToInterface(conn, network, address, finder, interfaceName, interfaceIndex)
34+
return bindToInterface(conn, network, address, finder, interfaceName, interfaceIndex, preferInterfaceName)
3535
}

common/control/bind_darwin.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import (
77
"golang.org/x/sys/unix"
88
)
99

10-
func bindToInterface(conn syscall.RawConn, network string, address string, finder InterfaceFinder, interfaceName string, interfaceIndex int) error {
10+
func bindToInterface(conn syscall.RawConn, network string, address string, finder InterfaceFinder, interfaceName string, interfaceIndex int, preferInterfaceName bool) error {
1111
return Raw(conn, func(fd uintptr) error {
1212
var err error
1313
if interfaceIndex == -1 {

common/control/bind_linux.go

Lines changed: 12 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,19 @@ import (
1212

1313
var ifIndexDisabled atomic.Bool
1414

15-
func bindToInterface(conn syscall.RawConn, network string, address string, finder InterfaceFinder, interfaceName string, interfaceIndex int) error {
15+
func bindToInterface(conn syscall.RawConn, network string, address string, finder InterfaceFinder, interfaceName string, interfaceIndex int, preferInterfaceName bool) error {
1616
return Raw(conn, func(fd uintptr) error {
17-
var err error
18-
if !ifIndexDisabled.Load() {
19-
if interfaceIndex == -1 {
20-
if finder == nil {
21-
return os.ErrInvalid
22-
}
23-
interfaceIndex, err = finder.InterfaceIndexByName(interfaceName)
24-
if err != nil {
25-
return err
26-
}
17+
if interfaceIndex != -1 {
18+
return unix.SetsockoptInt(int(fd), unix.SOL_SOCKET, unix.SO_BINDTOIFINDEX, interfaceIndex)
19+
}
20+
if interfaceName == "" {
21+
return os.ErrInvalid
22+
}
23+
if !preferInterfaceName && finder != nil && !ifIndexDisabled.Load() {
24+
var err error
25+
interfaceIndex, err = finder.InterfaceIndexByName(interfaceName)
26+
if err != nil {
27+
return err
2728
}
2829
err = unix.SetsockoptInt(int(fd), unix.SOL_SOCKET, unix.SO_BINDTOIFINDEX, interfaceIndex)
2930
if err == nil {
@@ -34,15 +35,6 @@ func bindToInterface(conn syscall.RawConn, network string, address string, finde
3435
return err
3536
}
3637
}
37-
if interfaceName == "" {
38-
if finder == nil {
39-
return os.ErrInvalid
40-
}
41-
interfaceName, err = finder.InterfaceNameByIndex(interfaceIndex)
42-
if err != nil {
43-
return err
44-
}
45-
}
4638
return unix.BindToDevice(int(fd), interfaceName)
4739
})
4840
}

common/control/bind_other.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,6 @@ package control
44

55
import "syscall"
66

7-
func bindToInterface(conn syscall.RawConn, network string, address string, finder InterfaceFinder, interfaceName string, interfaceIndex int) error {
7+
func bindToInterface(conn syscall.RawConn, network string, address string, finder InterfaceFinder, interfaceName string, interfaceIndex int, preferInterfaceName bool) error {
88
return nil
99
}

common/control/bind_windows.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import (
99
M "github.com/sagernet/sing/common/metadata"
1010
)
1111

12-
func bindToInterface(conn syscall.RawConn, network string, address string, finder InterfaceFinder, interfaceName string, interfaceIndex int) error {
12+
func bindToInterface(conn syscall.RawConn, network string, address string, finder InterfaceFinder, interfaceName string, interfaceIndex int, preferInterfaceName bool) error {
1313
return Raw(conn, func(fd uintptr) error {
1414
var err error
1515
if interfaceIndex == -1 {

0 commit comments

Comments
 (0)