12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 |
- // Copyright 2019 Google LLC.
- // Use of this source code is governed by a BSD-style
- // license that can be found in the LICENSE file.
- //go:build go1.11 && linux
- // +build go1.11,linux
- package grpc
- import (
- "context"
- "net"
- "syscall"
- "google.golang.org/grpc"
- )
- const (
- // defaultTCPUserTimeout is the default TCP_USER_TIMEOUT socket option. By
- // default is 20 seconds.
- tcpUserTimeoutMilliseconds = 20000
- // Copied from golang.org/x/sys/unix.TCP_USER_TIMEOUT.
- tcpUserTimeoutOp = 0x12
- )
- func init() {
- // timeoutDialerOption is a grpc.DialOption that contains dialer with
- // socket option TCP_USER_TIMEOUT. This dialer requires go versions 1.11+.
- timeoutDialerOption = grpc.WithContextDialer(dialTCPUserTimeout)
- }
- func dialTCPUserTimeout(ctx context.Context, addr string) (net.Conn, error) {
- control := func(network, address string, c syscall.RawConn) error {
- var syscallErr error
- controlErr := c.Control(func(fd uintptr) {
- syscallErr = syscall.SetsockoptInt(
- int(fd), syscall.IPPROTO_TCP, tcpUserTimeoutOp, tcpUserTimeoutMilliseconds)
- })
- if syscallErr != nil {
- return syscallErr
- }
- if controlErr != nil {
- return controlErr
- }
- return nil
- }
- d := &net.Dialer{
- Control: control,
- }
- return d.DialContext(ctx, "tcp", addr)
- }
|