...

Source file src/net/tcpsockopt_solaris.go

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

View as plain text