1// Copyright 2015 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 5package net 6 7import ( 8 "runtime" 9 "syscall" 10 "time" 11) 12 13func setKeepAlivePeriod(fd *netFD, d time.Duration) error { 14 // The kernel expects milliseconds so round to next highest 15 // millisecond. 16 msecs := int(roundDurationUp(d, time.Millisecond)) 17 18 // Normally we'd do 19 // syscall.SetsockoptInt(fd.sysfd, syscall.IPPROTO_TCP, syscall.TCP_KEEPINTVL, secs) 20 // here, but we can't because Solaris does not have TCP_KEEPINTVL. 21 // Solaris has TCP_KEEPALIVE_ABORT_THRESHOLD, but it's not the same 22 // thing, it refers to the total time until aborting (not between 23 // probes), and it uses an exponential backoff algorithm instead of 24 // waiting the same time between probes. We can't hope for the best 25 // and do it anyway, like on Darwin, because Solaris might eventually 26 // allocate a constant with a different meaning for the value of 27 // TCP_KEEPINTVL on illumos. 28 29 err := fd.pfd.SetsockoptInt(syscall.IPPROTO_TCP, syscall.TCP_KEEPALIVE_THRESHOLD, msecs) 30 runtime.KeepAlive(fd) 31 return wrapSyscallError("setsockopt", err) 32} 33