github.com/v2fly/v2ray-core/v5@v5.16.2-0.20240507031116-8191faa6e095/transport/internet/sockopt_windows.go (about)

     1  package internet
     2  
     3  import (
     4  	"net"
     5  	"syscall"
     6  
     7  	"golang.org/x/sys/windows"
     8  )
     9  
    10  const (
    11  	TCP_FASTOPEN    = 15 // nolint: revive,stylecheck
    12  	IP_UNICAST_IF   = 31 // nolint: revive,stylecheck
    13  	IPV6_UNICAST_IF = 31 // nolint: revive,stylecheck
    14  )
    15  
    16  func setTFO(fd syscall.Handle, settings SocketConfig_TCPFastOpenState) error {
    17  	switch settings {
    18  	case SocketConfig_Enable:
    19  		if err := syscall.SetsockoptInt(fd, syscall.IPPROTO_TCP, TCP_FASTOPEN, 1); err != nil {
    20  			return err
    21  		}
    22  	case SocketConfig_Disable:
    23  		if err := syscall.SetsockoptInt(fd, syscall.IPPROTO_TCP, TCP_FASTOPEN, 0); err != nil {
    24  			return err
    25  		}
    26  	}
    27  	return nil
    28  }
    29  
    30  func applyOutboundSocketOptions(network string, address string, fd uintptr, config *SocketConfig) error {
    31  	if isTCPSocket(network) {
    32  		if err := setTFO(syscall.Handle(fd), config.Tfo); err != nil {
    33  			return err
    34  		}
    35  		if config.TcpKeepAliveIdle > 0 {
    36  			if err := syscall.SetsockoptInt(syscall.Handle(fd), syscall.SOL_SOCKET, syscall.SO_KEEPALIVE, 1); err != nil {
    37  				return newError("failed to set SO_KEEPALIVE", err)
    38  			}
    39  		}
    40  	}
    41  
    42  	if config.BindToDevice != "" {
    43  		iface, err := net.InterfaceByName(config.BindToDevice)
    44  		if err != nil {
    45  			return newError("failed to get interface ", config.BindToDevice).Base(err)
    46  		}
    47  		if err := windows.SetsockoptInt(windows.Handle(fd), windows.IPPROTO_IP, IP_UNICAST_IF, iface.Index); err != nil {
    48  			return newError("failed to set IP_UNICAST_IF", err)
    49  		}
    50  		if err := windows.SetsockoptInt(windows.Handle(fd), windows.IPPROTO_IPV6, IPV6_UNICAST_IF, iface.Index); err != nil {
    51  			return newError("failed to set IPV6_UNICAST_IF", err)
    52  		}
    53  	}
    54  
    55  	if config.TxBufSize != 0 {
    56  		if err := windows.SetsockoptInt(windows.Handle(fd), windows.SOL_SOCKET, windows.SO_SNDBUF, int(config.TxBufSize)); err != nil {
    57  			return newError("failed to set SO_SNDBUF").Base(err)
    58  		}
    59  	}
    60  
    61  	if config.RxBufSize != 0 {
    62  		if err := windows.SetsockoptInt(windows.Handle(fd), windows.SOL_SOCKET, windows.SO_RCVBUF, int(config.TxBufSize)); err != nil {
    63  			return newError("failed to set SO_RCVBUF").Base(err)
    64  		}
    65  	}
    66  
    67  	return nil
    68  }
    69  
    70  func applyInboundSocketOptions(network string, fd uintptr, config *SocketConfig) error {
    71  	if isTCPSocket(network) {
    72  		if err := setTFO(syscall.Handle(fd), config.Tfo); err != nil {
    73  			return err
    74  		}
    75  		if config.TcpKeepAliveIdle > 0 {
    76  			if err := syscall.SetsockoptInt(syscall.Handle(fd), syscall.SOL_SOCKET, syscall.SO_KEEPALIVE, 1); err != nil {
    77  				return newError("failed to set SO_KEEPALIVE", err)
    78  			}
    79  		}
    80  	}
    81  
    82  	if config.TxBufSize != 0 {
    83  		if err := windows.SetsockoptInt(windows.Handle(fd), windows.SOL_SOCKET, windows.SO_SNDBUF, int(config.TxBufSize)); err != nil {
    84  			return newError("failed to set SO_SNDBUF").Base(err)
    85  		}
    86  	}
    87  
    88  	if config.RxBufSize != 0 {
    89  		if err := windows.SetsockoptInt(windows.Handle(fd), windows.SOL_SOCKET, windows.SO_RCVBUF, int(config.TxBufSize)); err != nil {
    90  			return newError("failed to set SO_RCVBUF").Base(err)
    91  		}
    92  	}
    93  
    94  	return nil
    95  }
    96  
    97  func bindAddr(fd uintptr, ip []byte, port uint32) error {
    98  	return nil
    99  }
   100  
   101  func setReuseAddr(fd uintptr) error {
   102  	return nil
   103  }
   104  
   105  func setReusePort(fd uintptr) error {
   106  	return nil
   107  }