Skip to content

Commit

Permalink
net: enable RFC 6555 Fast Fallback by default
Browse files Browse the repository at this point in the history
The Dialer.DualStack field is now meaningless and documented as
deprecated.

To disable fallback, set FallbackDelay to a negative value.

Fixes #22225

Change-Id: Icc212fe07bb69d7651ab81e539b8b3e3d3372fa9
Reviewed-on: https://go-review.googlesource.com/c/146659
Reviewed-by: Ian Lance Taylor <[email protected]>
  • Loading branch information
bradfitz committed Nov 1, 2018
1 parent 0ff6e5f commit efc1850
Showing 1 changed file with 16 additions and 7 deletions.
23 changes: 16 additions & 7 deletions src/net/dial.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,16 +44,23 @@ type Dialer struct {
// If nil, a local address is automatically chosen.
LocalAddr Addr

// DualStack enables RFC 6555-compliant "Happy Eyeballs"
// dialing when the network is "tcp" and the host in the
// address parameter resolves to both IPv4 and IPv6 addresses.
// This allows a client to tolerate networks where one address
// family is silently broken.
// DualStack previously enabled RFC 6555 Fast Fallback
// support, also known as "Happy Eyeballs", in which IPv4 is
// tried soon if IPv6 appears to be misconfigured and
// hanging.
//
// Deprecated: Fast Fallback is enabled by default. To
// disable, set FallbackDelay to a negative value.
DualStack bool

// FallbackDelay specifies the length of time to wait before
// spawning a fallback connection, when DualStack is enabled.
// spawning a RFC 6555 Fast Fallback connection. That is, this
// is the amount of time to wait for IPv6 to succeed before
// assuming that IPv6 is misconfigured and falling back to
// IPv4.
//
// If zero, a default delay of 300ms is used.
// A negative value disables Fast Fallback support.
FallbackDelay time.Duration

// KeepAlive specifies the keep-alive period for an active
Expand Down Expand Up @@ -81,6 +88,8 @@ type Dialer struct {
Control func(network, address string, c syscall.RawConn) error
}

func (d *Dialer) dualStack() bool { return d.FallbackDelay >= 0 }

func minNonzeroTime(a, b time.Time) time.Time {
if a.IsZero() {
return b
Expand Down Expand Up @@ -393,7 +402,7 @@ func (d *Dialer) DialContext(ctx context.Context, network, address string) (Conn
}

var primaries, fallbacks addrList
if d.DualStack && network == "tcp" {
if d.dualStack() && network == "tcp" {
primaries, fallbacks = addrs.partition(isIPv4)
} else {
primaries = addrs
Expand Down

0 comments on commit efc1850

Please sign in to comment.