valyala/fasthttp · error

cannot enable tcp_fastopen(qlen=%d): %s

Error message

cannot enable tcp_fastopen(qlen=%d): %s

What it means

tcplisten supports TCP_FASTOPEN via Config{FastOpen: true}; enableFastOpen sets the option with a queue length (fastOpenQlen = 16*1024) on the listening socket. If the kernel rejects setsockopt, the error "cannot enable tcp_fastopen(qlen=16384)" is returned to NewListener.

Source

Thrown at tcplisten/tcplisten_linux.go:28

	"golang.org/x/sys/unix"
)

const (
	soReusePort = 0x0F
	tcpFastOpen = 0x17
)

func enableDeferAccept(fd int) error {
	if err := unix.SetsockoptInt(fd, unix.IPPROTO_TCP, unix.TCP_DEFER_ACCEPT, 1); err != nil {
		return fmt.Errorf("cannot enable tcp_defer_accept: %s", err)
	}
	return nil
}

func enableFastOpen(fd int) error {
	if err := unix.SetsockoptInt(fd, unix.SOL_TCP, tcpFastOpen, fastOpenQlen); err != nil {
		return fmt.Errorf("cannot enable tcp_fastopen(qlen=%d): %s", fastOpenQlen, err)
	}
	return nil
}

const fastOpenQlen = 16 * 1024

func soMaxConn() (int, error) {
	data, err := os.ReadFile(soMaxConnFilePath)
	if err != nil {
		// This error may trigger on travis build. Just use SOMAXCONN
		if os.IsNotExist(err) {
			return unix.SOMAXCONN, nil
		}
		return -1, err
	}
	s := strings.TrimSpace(string(data))
	n, err := strconv.Atoi(s)
	if err != nil || n <= 0 {

View on GitHub (pinned to c96f600972)

Solutions

  1. Enable the server-side TFO flag: sysctl -w net.ipv4.tcp_fastopen=3
  2. Set Config.FastOpen to false where TFO is unavailable
  3. Verify kernel version >= 3.7 supports TCP_FASTOPEN
  4. Check seccomp/AppArmor policies allow the setsockopt

Example fix

// before
cfg := tcplisten.Config{FastOpen: true} // TFO disabled by sysctl
// after
// host: sysctl -w net.ipv4.tcp_fastopen=3
cfg := tcplisten.Config{FastOpen: true}
ln, err := tcplisten.NewListener(cfg, "tcp", ":8080")
Defensive patterns

Strategy: fallback

Validate before calling

func tcpFastOpenEnabled() bool {
    data, err := os.ReadFile("/proc/sys/net/ipv4/tcp_fastopen")
    if err != nil { return false }
    n, _ := strconv.Atoi(strings.TrimSpace(string(data)))
    return n&2 != 0 // server-side bit must be set
}

Try / catch

cfg := tcplisten.Config{FastOpen: wantFastOpen}
ln, err := tcplisten.NewListener(cfg, "tcp", addr)
if err != nil && strings.Contains(err.Error(), "tcp_fastopen") {
    log.Warn("TCP_FASTOPEN unavailable; retrying without it")
    cfg.FastOpen = false
    ln, err = tcplisten.NewListener(cfg, "tcp", addr)
}

Prevention

When it happens

Trigger: NewListener with Config{FastOpen: true} on Linux where setsockopt(fd, SOL_TCP, TCP_FASTOPEN, 16384) fails — kernel compiled without TCP_FASTOPEN, net.ipv4.tcp_fastopen sysctl disabled (bit 2 for listening sockets), or seccomp blocking the call.

Common situations: Cloud images/containers with tcp_fastopen sysctl set to 0 or 1 (client flag only); older kernels (<3.7); sandboxed runtimes without TFO support.

Related errors


AI-assisted analysis of valyala/fasthttp@c96f600972 (2026-08-31). Data as JSON: /api/errors/f973591d0ca503e6. Report an issue: GitHub.