github.com/sagernet/sing@v0.2.6/common/control/bind_darwin.go (about)

     1  package control
     2  
     3  import (
     4  	"syscall"
     5  
     6  	"golang.org/x/sys/unix"
     7  )
     8  
     9  func bindToInterface(conn syscall.RawConn, network string, address string, interfaceName string, interfaceIndex int) error {
    10  	if interfaceIndex == -1 {
    11  		return nil
    12  	}
    13  	return Raw(conn, func(fd uintptr) error {
    14  		switch network {
    15  		case "tcp6", "udp6":
    16  			return unix.SetsockoptInt(int(fd), unix.IPPROTO_IPV6, unix.IPV6_BOUND_IF, interfaceIndex)
    17  		default:
    18  			return unix.SetsockoptInt(int(fd), unix.IPPROTO_IP, unix.IP_BOUND_IF, interfaceIndex)
    19  		}
    20  	})
    21  }