| 123456789101112131415161718192021222324252627282930313233343536 |
- // Copyright (c) Tailscale Inc & AUTHORS
- // SPDX-License-Identifier: BSD-3-Clause
- // Package ktimeout configures kernel TCP stack timeouts via the provided
- // control functions. Platform support varies; on unsupported platforms control
- // functions may be entirely no-ops.
- package ktimeout
- import (
- "fmt"
- "syscall"
- "time"
- )
- // UserTimeout returns a control function that sets the TCP user timeout
- // (TCP_USER_TIMEOUT on linux). A user timeout specifies the maximum age of
- // unacknowledged data on the connection (either in buffer, or sent but not
- // acknowledged) before the connection is terminated. This timer has no effect
- // on limiting the lifetime of idle connections. This may be entirely local to
- // the network stack or may also apply RFC 5482 options to packets.
- func UserTimeout(timeout time.Duration) func(network, address string, c syscall.RawConn) error {
- return func(network, address string, c syscall.RawConn) error {
- switch network {
- case "tcp", "tcp4", "tcp6":
- default:
- return fmt.Errorf("ktimeout.UserTimeout: unsupported network: %s", network)
- }
- var err error
- if e := c.Control(func(fd uintptr) {
- err = SetUserTimeout(fd, timeout)
- }); e != nil {
- return e
- }
- return err
- }
- }
|