Skip to content

Commit 81a98bf

Browse files
committed
Improve linux bind interface
1 parent e0ec961 commit 81a98bf

File tree

1 file changed

+15
-0
lines changed

1 file changed

+15
-0
lines changed

common/control/bind_linux.go

+15
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,28 @@
11
package control
22

33
import (
4+
"errors"
45
"syscall"
56

7+
"github.com/sagernet/sing/common/atomic"
8+
69
"golang.org/x/sys/unix"
710
)
811

12+
var ifIndexDisabled atomic.Bool
13+
914
func bindToInterface(conn syscall.RawConn, network string, address string, interfaceName string, interfaceIndex int) error {
1015
return Raw(conn, func(fd uintptr) error {
16+
if !ifIndexDisabled.Load() {
17+
err := unix.SetsockoptInt(int(fd), unix.SOL_SOCKET, unix.SO_BINDTOIFINDEX, interfaceIndex)
18+
if err == nil {
19+
return nil
20+
} else if errors.Is(err, unix.ENOPROTOOPT) {
21+
ifIndexDisabled.Store(true)
22+
} else {
23+
return err
24+
}
25+
}
1126
return unix.BindToDevice(int(fd), interfaceName)
1227
})
1328
}

0 commit comments

Comments
 (0)