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 }