1
0
mirror of https://github.com/v2fly/v2ray-core.git synced 2024-12-22 10:08:15 -05:00

Feat: add bind to device to Windows and Darwin (#1972)

This commit is contained in:
秋のかえで 2022-10-08 09:03:51 +08:00 committed by GitHub
parent a4a3f4deec
commit 5593fdee09
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 45 additions and 1 deletions

View File

@ -1,6 +1,8 @@
package internet
import (
"net"
"golang.org/x/sys/unix"
)
@ -42,6 +44,19 @@ func applyOutboundSocketOptions(network string, address string, fd uintptr, conf
}
}
if config.BindToDevice != "" {
iface, err := net.InterfaceByName(config.BindToDevice)
if err != nil {
return newError("failed to get interface ", config.BindToDevice).Base(err)
}
if err := unix.SetsockoptInt(int(fd), unix.IPPROTO_IP, unix.IP_BOUND_IF, iface.Index); err != nil {
return newError("failed to set IP_BOUND_IF", err)
}
if err := unix.SetsockoptInt(int(fd), unix.IPPROTO_IPV6, unix.IPV6_BOUND_IF, iface.Index); err != nil {
return newError("failed to set IPV6_BOUND_IF", err)
}
}
if config.TxBufSize != 0 {
if err := unix.SetsockoptInt(int(fd), unix.SOL_SOCKET, unix.SO_SNDBUF, int(config.TxBufSize)); err != nil {
return newError("failed to set SO_SNDBUF").Base(err)
@ -86,6 +101,19 @@ func applyInboundSocketOptions(network string, fd uintptr, config *SocketConfig)
}
}
if config.BindToDevice != "" {
iface, err := net.InterfaceByName(config.BindToDevice)
if err != nil {
return newError("failed to get interface ", config.BindToDevice).Base(err)
}
if err := unix.SetsockoptInt(int(fd), unix.IPPROTO_IP, unix.IP_BOUND_IF, iface.Index); err != nil {
return newError("failed to set IP_BOUND_IF", err)
}
if err := unix.SetsockoptInt(int(fd), unix.IPPROTO_IPV6, unix.IPV6_BOUND_IF, iface.Index); err != nil {
return newError("failed to set IPV6_BOUND_IF", err)
}
}
if config.TxBufSize != 0 {
if err := unix.SetsockoptInt(int(fd), unix.SOL_SOCKET, unix.SO_SNDBUF, int(config.TxBufSize)); err != nil {
return newError("failed to set SO_SNDBUF/SO_SNDBUFFORCE").Base(err)

View File

@ -1,6 +1,7 @@
package internet
import (
"net"
"syscall"
"golang.org/x/sys/windows"
@ -8,6 +9,8 @@ import (
const (
TCP_FASTOPEN = 15 // nolint: revive,stylecheck
IP_UNICAST_IF = 31 // nolint: revive,stylecheck
IPV6_UNICAST_IF = 31 // nolint: revive,stylecheck
)
func setTFO(fd syscall.Handle, settings SocketConfig_TCPFastOpenState) error {
@ -36,6 +39,19 @@ func applyOutboundSocketOptions(network string, address string, fd uintptr, conf
}
}
if config.BindToDevice != "" {
iface, err := net.InterfaceByName(config.BindToDevice)
if err != nil {
return newError("failed to get interface ", config.BindToDevice).Base(err)
}
if err := windows.SetsockoptInt(windows.Handle(fd), windows.IPPROTO_IP, IP_UNICAST_IF, iface.Index); err != nil {
return newError("failed to set IP_UNICAST_IF", err)
}
if err := windows.SetsockoptInt(windows.Handle(fd), windows.IPPROTO_IPV6, IPV6_UNICAST_IF, iface.Index); err != nil {
return newError("failed to set IPV6_UNICAST_IF", err)
}
}
if config.TxBufSize != 0 {
if err := windows.SetsockoptInt(windows.Handle(fd), windows.SOL_SOCKET, windows.SO_SNDBUF, int(config.TxBufSize)); err != nil {
return newError("failed to set SO_SNDBUF").Base(err)