github.com/cristalhq/netx@v0.0.0-20221116164110-442313ef3309/listener_bsd.go (about)

     1  //go:build darwin || dragonfly || freebsd || netbsd || openbsd
     2  
     3  package netx
     4  
     5  import (
     6  	"runtime"
     7  	"syscall"
     8  )
     9  
    10  const soReusePort = syscall.SO_REUSEPORT
    11  
    12  func disableNoDelay(fd int) error {
    13  	return newError("setsockopt", syscall.SetsockoptInt(fd, syscall.IPPROTO_TCP, syscall.TCP_NODELAY, 1))
    14  }
    15  
    16  func enableReusePort(fd int) error {
    17  	return newError("setsockopt", syscall.SetsockoptInt(fd, syscall.SOL_SOCKET, syscall.SO_REUSEPORT, 1))
    18  }
    19  
    20  func enableDeferAccept(fd int) error {
    21  	return nil
    22  }
    23  
    24  func enableFastOpen(fd, queueLen int) error {
    25  	return nil
    26  }
    27  
    28  func setBacklog(fd, backlog int) error {
    29  	return newError("listen", syscall.Listen(fd, backlog))
    30  }
    31  
    32  func setLinger(fd, sec int) error {
    33  	var l syscall.Linger
    34  	if sec >= 0 {
    35  		l.Onoff, l.Linger = 1, int32(sec)
    36  	}
    37  	return newError("setsockopt", syscall.SetsockoptLinger(fd, syscall.SOL_SOCKET, syscall.SO_LINGER, &l))
    38  }
    39  
    40  func soMaxConn() (int, error) {
    41  	return syscall.SOMAXCONN, nil
    42  }
    43  
    44  func setDefaultSockopts(fd, family, sotype int, ipv6only bool) error {
    45  	if runtime.GOOS == "dragonfly" && sotype != syscall.SOCK_RAW {
    46  		// On DragonFly BSD, we adjust the ephemeral port range because unlike other BSD systems its default
    47  		// port range doesn't conform to IANA recommendation as described in RFC 6056 and is pretty narrow.
    48  		var err error
    49  		switch family {
    50  		case syscall.AF_INET:
    51  			err = newError("setsockopt", syscall.SetsockoptInt(fd, syscall.IPPROTO_IP, syscall.IP_PORTRANGE, syscall.IP_PORTRANGE_HIGH))
    52  		case syscall.AF_INET6:
    53  			err = newError("setsockopt", syscall.SetsockoptInt(fd, syscall.IPPROTO_IPV6, syscall.IPV6_PORTRANGE, syscall.IPV6_PORTRANGE_HIGH))
    54  		}
    55  		if err != nil {
    56  			return err
    57  		}
    58  	}
    59  	return newError("setsockopt", syscall.SetsockoptInt(fd, syscall.SOL_SOCKET, syscall.SO_BROADCAST, 1))
    60  }