diff --git a/sock.go b/sock.go index 4e91a9c..b68f240 100644 --- a/sock.go +++ b/sock.go @@ -15,13 +15,9 @@ type mmsghdr struct { func htons(v uint16) uint16 { return v<<8 | v>>8 } -func setBufForce(fd, forceOpt, opt, size int) error { - if err := unix.SetsockoptInt(fd, unix.SOL_SOCKET, forceOpt, size); err == nil { - return nil - } - return unix.SetsockoptInt(fd, unix.SOL_SOCKET, opt, size) -} - +// Set through the FORCE options alone: the plain ones are clamped to wmem_max +// and rmem_max, so falling back to them would quietly leave a fraction of this +// and go on measuring as though it had not. const ( sndbufBytes = 8 << 20 rcvbufBytes = 64 << 20 @@ -40,7 +36,7 @@ func openTxSocket(ifindex int) (int, error) { unix.Close(fd) return -1, fmt.Errorf("qdisc bypass: %w", err) } - if err := setBufForce(fd, unix.SO_SNDBUFFORCE, unix.SO_SNDBUF, sndbufBytes); err != nil { + if err := unix.SetsockoptInt(fd, unix.SOL_SOCKET, unix.SO_SNDBUFFORCE, sndbufBytes); err != nil { unix.Close(fd) return -1, fmt.Errorf("sndbuf: %w", err) } @@ -53,7 +49,7 @@ func openRxSocket(ifindex int, etherType uint16) (int, error) { if err != nil { return -1, fmt.Errorf("socket: %w", err) } - if err := setBufForce(fd, unix.SO_RCVBUFFORCE, unix.SO_RCVBUF, rcvbufBytes); err != nil { + if err := unix.SetsockoptInt(fd, unix.SOL_SOCKET, unix.SO_RCVBUFFORCE, rcvbufBytes); err != nil { unix.Close(fd) return -1, fmt.Errorf("rcvbuf: %w", err) }