tcpsockopt_darwin.mx raw
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
5 package net
6
7 import (
8 "runtime"
9 "syscall"
10 "time"
11 )
12
13 // syscall.TCP_KEEPINTVL and syscall.TCP_KEEPCNT might be missing on some darwin architectures.
14 const (
15 sysTCP_KEEPINTVL = 0x101
16 sysTCP_KEEPCNT = 0x102
17 )
18
19 func setKeepAliveIdle(fd *netFD, d time.Duration) error {
20 if d == 0 {
21 d = defaultTCPKeepAliveIdle
22 } else if d < 0 {
23 return nil
24 }
25
26 // The kernel expects seconds so round to next highest second.
27 secs := int(roundDurationUp(d, time.Second))
28 err := fd.pfd.SetsockoptInt(syscall.IPPROTO_TCP, syscall.TCP_KEEPALIVE, secs)
29 runtime.KeepAlive(fd)
30 return wrapSyscallError("setsockopt", err)
31 }
32
33 func setKeepAliveInterval(fd *netFD, d time.Duration) error {
34 if d == 0 {
35 d = defaultTCPKeepAliveInterval
36 } else if d < 0 {
37 return nil
38 }
39
40 // The kernel expects seconds so round to next highest second.
41 secs := int(roundDurationUp(d, time.Second))
42 err := fd.pfd.SetsockoptInt(syscall.IPPROTO_TCP, sysTCP_KEEPINTVL, secs)
43 runtime.KeepAlive(fd)
44 return wrapSyscallError("setsockopt", err)
45 }
46
47 func setKeepAliveCount(fd *netFD, n int) error {
48 if n == 0 {
49 n = defaultTCPKeepAliveCount
50 } else if n < 0 {
51 return nil
52 }
53
54 err := fd.pfd.SetsockoptInt(syscall.IPPROTO_TCP, sysTCP_KEEPCNT, n)
55 runtime.KeepAlive(fd)
56 return wrapSyscallError("setsockopt", err)
57 }
58