// Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package net import ( "internal/syscall/unix" "syscall" ) // Linux stores the backlog as: // // - uint16 in kernel version < 4.1, // - uint32 in kernel version >= 4.1 // // Truncate number to avoid wrapping. // // See issue 5030 and 41470. func maxAckBacklog(n int) int { major, minor := unix.KernelVersion() size := 16 if major > 4 || (major == 4 && minor >= 1) { size = 32 } var max uint = 1< max { n = int(max) } return n } func maxListenerBacklog() int { fd, err := open("/proc/sys/net/core/somaxconn") if err != nil { return syscall.SOMAXCONN } defer fd.close() l, ok := fd.readLine() if !ok { return syscall.SOMAXCONN } f := getFields(l) n, _, ok := dtoi(f[0]) if n == 0 || !ok { return syscall.SOMAXCONN } if n > 1<<16-1 { return maxAckBacklog(n) } return n }