// SPDX-License-Identifier: 0BSD // Copyright (c) 2024-2026 Sudo-Ivan / Quad4.io //go:build darwin // +build darwin package interfaces import ( "fmt" "net" "syscall" "git.quad4.io/Networks/Reticulum-Go/pkg/debug" ) func (tc *TCPClientInterface) setTimeoutsLinux() error { return tc.setTimeoutsOSX() } func (tc *TCPClientInterface) setTimeoutsOSX() error { tcpConn, ok := tc.conn.(*net.TCPConn) if !ok { return fmt.Errorf("not a TCP connection") } rawConn, err := tcpConn.SyscallConn() if err != nil { return fmt.Errorf("failed to get raw connection: %v", err) } var sockoptErr error err = rawConn.Control(func(fd uintptr) { const TCP_KEEPALIVE = 0x10 var probeAfter int if tc.i2pTunneled { probeAfter = I2P_PROBE_AFTER_SEC } else { probeAfter = TCP_PROBE_AFTER_SEC } if err := syscall.SetsockoptInt(int(fd), syscall.SOL_SOCKET, syscall.SO_KEEPALIVE, SO_KEEPALIVE_ENABLE); err != nil { sockoptErr = fmt.Errorf("failed to enable SO_KEEPALIVE: %v", err) return } if err := syscall.SetsockoptInt(int(fd), syscall.IPPROTO_TCP, TCP_KEEPALIVE, probeAfter); err != nil { debug.Log(debug.DEBUG_VERBOSE, "Failed to set TCP_KEEPALIVE", "error", err) } }) if err != nil { return fmt.Errorf("control failed: %v", err) } if sockoptErr != nil { return sockoptErr } debug.Log(debug.DEBUG_VERBOSE, "TCP keepalive configured (OSX)", "i2p", tc.i2pTunneled) return nil }