|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+package network
|
|
|
2
|
+
|
|
|
3
|
+import "net"
|
|
|
4
|
+
|
|
|
5
|
+// applyKeepAlive enables (or disables) TCP keepalive on conn.
|
|
|
6
|
+//
|
|
|
7
|
+// OpenBSD has no user-settable per-socket TCP keepalive options: TCP_KEEPIDLE,
|
|
|
8
|
+// TCP_KEEPINTVL and TCP_KEEPCNT do not exist on OpenBSD, and Go's
|
|
|
9
|
+// (*TCPConn).SetKeepAliveConfig therefore returns ENOPROTOOPT ("protocol not
|
|
|
10
|
+// available") for any non-negative Idle/Interval/Count value (see
|
|
|
11
|
+// src/net/tcpsockopt_openbsd.go in the Go source tree). Calling
|
|
|
12
|
+// SetKeepAliveConfig with mtg's defaults (zero values) breaks every accepted
|
|
|
13
|
+// listener connection and every outbound dial on OpenBSD.
|
|
|
14
|
+//
|
|
|
15
|
+// On OpenBSD we only flip SO_KEEPALIVE on or off; the keepalive timing is
|
|
|
16
|
+// controlled system-wide via the sysctl knobs net.inet.tcp.keepidle and
|
|
|
17
|
+// net.inet.tcp.keepintvl.
|
|
|
18
|
+func applyKeepAlive(conn *net.TCPConn, cfg net.KeepAliveConfig) error {
|
|
|
19
|
+ return conn.SetKeepAlive(cfg.Enable) //nolint: wrapcheck
|
|
|
20
|
+}
|