1// Copyright 2009 The Go Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style 3// license that can be found in the LICENSE file. 4 5package net 6 7import ( 8 "internal/syscall/unix" 9 "syscall" 10) 11 12// Linux stores the backlog as: 13// 14// - uint16 in kernel version < 4.1, 15// - uint32 in kernel version >= 4.1 16// 17// Truncate number to avoid wrapping. 18// 19// See issue 5030 and 41470. 20func maxAckBacklog(n int) int { 21 major, minor := unix.KernelVersion() 22 size := 16 23 if major > 4 || (major == 4 && minor >= 1) { 24 size = 32 25 } 26 27 var max uint = 1<<size - 1 28 if uint(n) > max { 29 n = int(max) 30 } 31 return n 32} 33 34func maxListenerBacklog() int { 35 fd, err := open("/proc/sys/net/core/somaxconn") 36 if err != nil { 37 return syscall.SOMAXCONN 38 } 39 defer fd.close() 40 l, ok := fd.readLine() 41 if !ok { 42 return syscall.SOMAXCONN 43 } 44 f := getFields(l) 45 n, _, ok := dtoi(f[0]) 46 if n == 0 || !ok { 47 return syscall.SOMAXCONN 48 } 49 50 if n > 1<<16-1 { 51 return maxAckBacklog(n) 52 } 53 return n 54} 55