aboutsummaryrefslogtreecommitdiff
path: root/src/net/ipsock.go
AgeCommit message (Collapse)Author
2024-05-29all: document legacy //go:linkname for final round of modulesRuss Cox
Add linknames for most modules with ≥50 dependents. Add linknames for a few other modules that we know are important but are below 50. Remove linknames from badlinkname.go that do not merit inclusion (very small number of dependents). We can add them back later if the need arises. Fixes #67401. (For now.) Change-Id: I1e49fec0292265256044d64b1841d366c4106002 Reviewed-on: https://go-review.googlesource.com/c/go/+/587756 Auto-Submit: Russ Cox <rsc@golang.org> TryBot-Bypass: Russ Cox <rsc@golang.org> Reviewed-by: Cherry Mui <cherryyz@google.com>
2023-09-15net: use bytealg.LastIndexByteStringapocelipes
There is no need to handwrite the "last" function, the bytealg package already provides "LastIndexByteString". Change-Id: I6000705bffe8450a10cf8f3fa716a8d4605ada1f GitHub-Last-Rev: 6627c65fb40fad96239edd28bde27a30f9f8f544 GitHub-Pull-Request: golang/go#62647 Reviewed-on: https://go-review.googlesource.com/c/go/+/527976 Reviewed-by: Dmitri Shuralyov <dmitshur@google.com> Reviewed-by: Ian Lance Taylor <iant@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Auto-Submit: Ian Lance Taylor <iant@google.com>
2023-08-23net: use internal/bytealg.CountStringTobias Klauser
On platforms that provide a native implementation this might be slightly faster. On other platforms it is equivalent to the count func. Change-Id: If46cc65598993e64084cc98533cb8c1e9679a6fd Reviewed-on: https://go-review.googlesource.com/c/go/+/522136 TryBot-Result: Gopher Robot <gobot@golang.org> Auto-Submit: Tobias Klauser <tobias.klauser@gmail.com> Reviewed-by: Damien Neil <dneil@google.com> Reviewed-by: Ian Lance Taylor <iant@google.com> Run-TryBot: Tobias Klauser <tobias.klauser@gmail.com>
2021-04-12net: never probe IPv4 map support on DragonFly BSD, OpenBSDJosh Rickmar
DragonFly BSD and OpenBSD do not implement mapping IPv4 addresses to the IPv6 address space, and a runtime check can be avoided. As the IP stack capabilities probe was only being called from supportsIPv4map to check for this support, the OS-specific handling can be added to this function rather than continuing to run the probe. Change-Id: I5800c197b1be502a6efa79e3edd6356bde8637fb GitHub-Last-Rev: 7eb67189cd955fb12382a6f2a05f324d2747dcc3 GitHub-Pull-Request: golang/go#45243 Reviewed-on: https://go-review.googlesource.com/c/go/+/304870 Run-TryBot: Ian Lance Taylor <iant@golang.org> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org> Trust: Tobias Klauser <tobias.klauser@gmail.com>
2018-10-25net: make cgo resolver work more accurately with network parameterEugene Kalinin
Unlike the go resolver, the existing cgo resolver exchanges both DNS A and AAAA RR queries unconditionally and causes unreasonable connection setup latencies to applications using the cgo resolver. This change adds new argument (`network`) in all functions through the series of calls: from Resolver.internetAddrList to cgoLookupIPCNAME. Benefit: no redundant DNS calls if certain IP version is used IPv4/IPv6 (no `AAAA` DNS requests if used tcp4, udp4, ip4 network. And vice versa: no `A` DNS requests if used tcp6, udp6, ip6 network) Fixes #25947 Change-Id: I39edbd726d82d6133fdada4d06cd90d401e7e669 Reviewed-on: https://go-review.googlesource.com/c/120215 Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
2018-08-21net: use internal/bytealg insetad of linkname tricksIlya Tocar
We are currently using go:linkname for some algorithms from strings/bytes packages, to avoid importing strings/bytes. But strings/bytes are just wrappers around internal/bytealg, so we should use internal/bytealg directly. Change-Id: I2836f779b88bf8876d5fa725043a6042bdda0390 Reviewed-on: https://go-review.googlesource.com/130515 Run-TryBot: Ilya Tocar <ilya.tocar@intel.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
2018-06-27net: parse IPv6 address with zone using DefaultResolver.Lookup{Host,IPAddr}Michael Fraenkel
Allow a zone to be included with the ip address that is parsed when using DefaultResolver's LookupHost or LookupIPAddr Fixes #20790 Fixes #20767 Change-Id: I4e0baf9ade6a095af10a1b85ca6216788ba680ae Reviewed-on: https://go-review.googlesource.com/79935 Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
2017-07-06net: don't return IPv4 unspecified addr for Resolve*Addr of [::] or [::]:nBrad Fitzpatrick
ResolveTCPAddr, ResolveUDPAddr, and ResolveIPAddr return at most one address. When given a name like "golang.org" to resolve that might have more than 1 address, the net package has historically preferred IPv4 addresses, with the assumption that many users don't yet have IPv6 connectivity and randomly selecting between an IPv4 address and an IPv6 address at runtime wouldn't be a good experience for IPv4-only users. In CL 45088 (78cf0e56) I modified the resolution of the unspecified/empty address to internally resolve to both IPv6 "::" and 0.0.0.0 to fix issue #18806. That code has 3 other callers I hadn't considered, though: the Resolve*Addr functions. Since they preferred IPv4, any Resolve*Addr of "[::]:port" or "::" (for ResolveIPAddr) would internally resolve both "::" and 0.0.0.0 and then prefer 0.0.0.0, even though the user was looking up an IPv6 literal. Add tests and fix it, not by undoing the fix to #18806 but by selecting the preference function for Resolve*Addr more explicitly: we still prefer IPv4, but if the address being looked up was an IPv6 literal, prefer IPv6. The tests are skipped on machines without IPv6. Fixes #20911 Change-Id: Ib7036cc43182ae4118cd1390c254e17c04a251a3 Reviewed-on: https://go-review.googlesource.com/47554 Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> Reviewed-by: Russ Cox <rsc@golang.org>
2017-06-22net: update documentation on JoinHostPort and SplitHostPortMikio Hara
This change adds a reference to the Dial to clarify the parameters and return values. Change-Id: I611b9a79f4033ef035acd7098aea5965905d9a4c Reviewed-on: https://go-review.googlesource.com/34880 Reviewed-by: Ian Lance Taylor <iant@golang.org>
2017-06-14net, doc: document JoinHostPort change in release notes, clarify its docsBrad Fitzpatrick
Updates #18059 Updates #20587 Change-Id: Icbb4c7cb201ac51d2cc6066620b47ba09ff6fe65 Reviewed-on: https://go-review.googlesource.com/45780 Reviewed-by: Chris Broadfoot <cbro@golang.org>
2017-06-08net: make Dial("tcp", ln.Addr().String()) work even with bad IPv6 configBrad Fitzpatrick
Some machines can be configured (or came/come configured) in such a state that IPv6 only half works: you can bind on [::]:n but not connect back to it. This implements a fallback such that it's guaranteed that this pattern works: ln, err := Listen("tcp", ":0") ... addr := ln.Addr().String() // "[::]:n" c, err := Dial("tcp", addr) ... which is also now tested. It will first try to dial "[::]:n", as before, but if that dial fails, it will also try "0.0.0.0:n". Fixes #18806 (contains more details) Fixes #20611 (I was going to fix nacl later, but it was easy enough) Change-Id: I1107eb197e902ae8185c781ad1bc4e2bc61d1f4c Reviewed-on: https://go-review.googlesource.com/45088 Reviewed-by: Paul Marks <pmarks@google.com>
2017-04-15net: delay IP protocol stack-snooping system callsMikio Hara
This change delays IP protocol stack-snooping system calls until the start of connection setup for the better experience with some system call auditing, such as seccomp on Linux. See #16789 for examples. Also updates the documentation on favoriteAddrFamily, which is the owner of stack-snooping system calls. Fixes #16789. Change-Id: I4af27bc1ed06ffb1f657b6f6381c328c1f41c66c Reviewed-on: https://go-review.googlesource.com/40750 Run-TryBot: Mikio Hara <mikioh.mikioh@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
2017-04-14net: don't enclose non-literal IPv6 addresses in square bracketsMikio Hara
The net package uses various textual representations for network identifiers and locators on the Internet protocol suite as API. In fact, the representations are the composition of subset of multple RFCs: RFC 3986, RFC 4007, RFC 4632, RFC 4291 and RFC 5952. RFC 4007 describes guidelines for the use of textual representation of IPv6 addressing/routing scope zone and doesn't prohibit the format for implementation dependent purposes, as in, specifying a literal IPv6 address and its connected region of routing topology as application user interface. However, a non-literal IPv6 address, for example, a host name, with a zone enclosed in square brackets confuses us because a zone is basically for non-global IPv6 addresses and a pair of square brackets is used as a set of delimiters between a literal IPv6 address and a service name or transport port number. To mitigate such confusion, this change makes JoinHostPort not enclose non-literal IPv6 addresses in square brackets and SplitHostPort accept the form "host%zone:port" to recommend that anything enclosed in square brackets should be a literal IPv6 address. Before this change: JoinHostPort("name%zone", "80") = "[name%zone]:80" JoinHostPort("[::1%zone]", "80") = "[::1%zone]:80" SplitHostPort("name%zone:80") = "", "", "address name%zone:80: missing brackets in address" SplitHostPort("[name%zone]:80") = "name%zone", "80", nil SplitHostPort("[::1%zone]:80") = "::1%zone", "80", nil After this change: JoinHostPort("name%zone", "80") = "name%zone:80" JoinHostPort("[::1%zone]", "80") = "[::1%zone]:80" SplitHostPort("name%zone:80") = "name%zone", "80", nil SplitHostPort("[name%zone]:80") = "name%zone", "80", nil // for backwards compatibility SplitHostPort("[::1%zone]:80") = "::1%zone", "80", nil Also updates docs and test cases on SplitHostPort and JoinHostPort for clarification. Fixes #18059. Fixes #18060. Change-Id: I5c3ccce4fa0fbdd58f698fc280635ea4a14d2a37 Reviewed-on: https://go-review.googlesource.com/40510 Run-TryBot: Mikio Hara <mikioh.mikioh@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
2017-01-06net: display the complete BUGS section on every platformMikio Hara
We cannot assume that the platform running documentation service is the target platform. Change-Id: I241ed6f8778169faac9ef49e11dcd40f7422cccc Reviewed-on: https://go-review.googlesource.com/34750 Run-TryBot: Mikio Hara <mikioh.mikioh@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
2016-11-11net: apply tcp4/tcp6 restrictions to literals in ResolveTCPAddrRuss Cox
The restrictions were already being applied to the IP addresses received from the host resolver. Apply the same restrictions to literal IP addresses not passed to the host resolver. For example, ResolveTCPAddr("tcp4", "[2001:db8::1]:http") used to succeed and now does not (that's not an IPv4 address). Perhaps a bit surprisingly, ResolveTCPAddr("tcp4", "[::ffff:127.0.0.1]:http") succeeds, behaving identically to ResolveTCPAddr("tcp4", "127.0.0.1:http"), and ResolveTCPAddr("tcp6", "[::ffff:127.0.0.1]:http") fails, behaving identically to ResolveTCPAddr("tcp6", "127.0.0.1:http"). Even so, it seems right to match (by reusing) the existing filtering as applied to addresses resolved by the host C library. If anyone can make a strong argument for changing the filtering of IPv4-inside-IPv6 addresses, the fix can be applied to all the code paths in a separate CL. Fixes #14037. Change-Id: I690dfdcbe93d730e11e00ea387fa7484cd524341 Reviewed-on: https://go-review.googlesource.com/32100 Run-TryBot: Russ Cox <rsc@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
2016-11-02net: fix Dial(":80") on WindowsRuss Cox
Windows sockets allow bind to 0.0.0.0:80 but not connect to it. To make Listen(":80") / Dial(":80") work as documented on Windows, connect to 127.0.0.1 or ::1 (depending on network) in place of 0.0.0.0. Fixes #6290. Change-Id: Ia27537067276871648546678fbe0f1b8478329fe Reviewed-on: https://go-review.googlesource.com/32101 Run-TryBot: Russ Cox <rsc@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Mikio Hara <mikioh.mikioh@gmail.com>
2016-09-21net: add Resolver type, Dialer.Resolver, and DefaultResolverBrad Fitzpatrick
The new Resolver type (a struct) has 9 Lookup methods, all taking a context.Context. There's now a new DefaultResolver global, like http's DefaultTransport and DefaultClient. net.Dialer now has an optional Resolver field to set the Resolver. This also does finishes some resolver cleanup internally, deleting lookupIPMerge and renaming lookupIPContext into Resolver.LookupIPAddr. The Resolver currently doesn't let you tweak much, but it's a struct specifically so we can add knobs in the future. Currently I just added a bool to force the pure Go resolver. In the future we could let people provide an interface to implement the methods, or add a Timeout time.Duration, which would wrap all provided contexts in a context.WithTimeout. Fixes #16672 Change-Id: I7ba1f886704f06def7b6b5c4da9809db51bc1495 Reviewed-on: https://go-review.googlesource.com/29440 Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
2016-04-15net: context plumbing, add Dialer.DialContextBrad Fitzpatrick
For #12580 (http.Transport tracing/analytics) Updates #13021 Change-Id: I126e494a7bd872e42c388ecb58499ecbf0f014cc Reviewed-on: https://go-review.googlesource.com/22101 Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org> Reviewed-by: Mikio Hara <mikioh.mikioh@gmail.com>
2016-04-15net: cache IPv6 zone information for applications using IPv6 link-local addressMikio Hara
This change reduces the overhead of calling routing information per IPv6 link-local datagram read by caching IPv6 addressing scope zone information. Fixes #15237. name old time/op new time/op delta UDP6LinkLocalUnicast-8 64.9µs ± 0% 18.6µs ± 0% -71.30% name old alloc/op new alloc/op delta UDP6LinkLocalUnicast-8 11.2kB ± 0% 0.2kB ± 0% -98.42% name old allocs/op new allocs/op delta UDP6LinkLocalUnicast-8 101 ± 0% 3 ± 0% -97.03% Change-Id: I5ae2ef5058df1028bbb7f4ab32b13edfb330c3a7 Reviewed-on: https://go-review.googlesource.com/21952 Reviewed-by: Ian Lance Taylor <iant@golang.org>
2016-03-16net: filter destination addresses when source address is specifiedMikio Hara
This change filters out destination addresses by address family when source address is specified to avoid running Dial operation with wrong addressing scopes. Fixes #11837. Change-Id: I10b7a1fa325add2cd8ed58f105d527700a10d342 Reviewed-on: https://go-review.googlesource.com/20586 Reviewed-by: Paul Marks <pmarks@google.com>
2016-03-15net: make SplitHostPort return an empty host on errorDave Day
This change also refactors SplitHostPort to avoid using gotos and naked returns. Fixes #14827 Change-Id: I4dca528936757fd06da76c23af8a0f6175bbedd1 Reviewed-on: https://go-review.googlesource.com/20726 Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
2016-03-02all: single space after period.Brad Fitzpatrick
The tree's pretty inconsistent about single space vs double space after a period in documentation. Make it consistently a single space, per earlier decisions. This means contributors won't be confused by misleading precedence. This CL doesn't use go/doc to parse. It only addresses // comments. It was generated with: $ perl -i -npe 's,^(\s*// .+[a-z]\.) +([A-Z]),$1 $2,' $(git grep -l -E '^\s*//(.+\.) +([A-Z])') $ go test go/doc -update Change-Id: Iccdb99c37c797ef1f804a94b22ba5ee4b500c4f7 Reviewed-on: https://go-review.googlesource.com/20022 Reviewed-by: Rob Pike <r@golang.org> Reviewed-by: Dave Day <djd@golang.org> Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
2016-03-01all: make copyright headers consistent with one space after periodBrad Fitzpatrick
This is a subset of https://golang.org/cl/20022 with only the copyright header lines, so the next CL will be smaller and more reviewable. Go policy has been single space after periods in comments for some time. The copyright header template at: https://golang.org/doc/contribute.html#copyright also uses a single space. Make them all consistent. Change-Id: Icc26c6b8495c3820da6b171ca96a74701b4a01b0 Reviewed-on: https://go-review.googlesource.com/20111 Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org> Reviewed-by: Matthew Dempsky <mdempsky@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org>
2015-11-01net: make Dial, Listen{,Packet} for TCP/UDP with invalid port failMikio Hara
This change makes Dial, Listen and ListenPacket with invalid port fail whatever GODEBUG=netdns is. Please be informed that cgoLookupPort with an out of range literal number may return either the lower or upper bound value, 0 or 65535, with no error on some platform. Fixes #11715. Change-Id: I43f9c4fb5526d1bf50b97698e0eb39d29fd74c35 Reviewed-on: https://go-review.googlesource.com/12447 Reviewed-by: Ian Lance Taylor <iant@golang.org>
2015-05-05net: fix inconsistent errorsMikio Hara
These a series of changes fix inconsistent errors on the package net APIs. Now almost all the APIs return OpError as a common error type except Lookup, Resolve and Parse APIs. The Lookup, Resolve and Parse APIs return more specific errors such as DNSError, AddrError or ParseError. An OpError may contain nested error information. For example, Dial may return an OpError containing a DNSError, AddrError, unexposed type/value or other package's type/value like the following: OpError{/* dial info */, Err: &DNSError{}} OpError{/* dial info */, Err: &AddrError{}} OpError{/* dial info */, Err: <unexposed type or value>} OpError{/* dial info */, Err: <other package's type or value>} and Read and Write may return an OpError containing other OpError when an application uses io.Copy or similar: OpError{/* for io.Reader */, Err: &OpError{/* for io.Writer */}} When an endpoint is created for connection-oriented byte-stream protocols, Read may return an io.EOF when the connection is closed by remote endpoint. Fixes #4856. A series of changes: - net: fix inconsistent error values on Dial, Listen partially https://go.googlesource.com/go/+/89b7c66d0d14462fd7893be4290bdfe5f9063ae1 - net: fix inconsistent error values on Read https://go.googlesource.com/go/+/ec1144423f45e010c72363fe59291d43214b6e31 - net: fix inconsistent error values on Write https://go.googlesource.com/go/+/11b5f98bf0d5eb8854f735cc332c912725070214 - net: fix inconsistent error values on Close https://go.googlesource.com/go/+/310db63c5bc121e7bfccb494c01a6b91a257e7fc - net: fix inconsistent error values on Accept https://go.googlesource.com/go/+/4540e162b1aefda8157372764ad3d290a414ef1d - net: fix inconsistent error values on File https://go.googlesource.com/go/+/885111365ba0a74421059bfbd18f4c57c1e70332 - net: fix inconsistent error values on setters https://go.googlesource.com/go/+/2173a27903897c481b0a0daf3ca3e0a0685701db - net: fix inconsistent error values on Interface https://go.googlesource.com/go/+/456cf0f22c93e1a6654980f4a48a564555f6c8a2 - net: fix inconsistent error values on Lookup https://go.googlesource.com/go/+/0fc582e87942b2e52bed751b6c56660ba99e9a7d - net: add Source field to OpError https://go.googlesource.com/go/+/afd2d2b6df3ebfe99faf347030f15adfdf422fa0 Change-Id: Id678e369088dc9fbe9073cfe7ff8a8754a57d61f Reviewed-on: https://go-review.googlesource.com/9236 Reviewed-by: Ian Lance Taylor <iant@golang.org>
2015-04-10net: make multi-IP resolution more flexible.Paul Marks
Remove the "netaddr" type, which ambiguously represented either one address, or a list of addresses. Instead, use "addrList" wherever multiple addresses are supported. The "first" method returns the first address matching some condition (e.g. "is it IPv4?"), primarily to support legacy code that can't handle multiple addresses. The "partition" method splits an addrList into two categories, as defined by some strategy function. This is useful for implementing Happy Eyeballs, and similar two-channel algorithms. Finally, internetAddrList (formerly resolveInternetAddr) no longer mangles the ordering defined by getaddrinfo. In the future, this may be used by a sequential Dial implementation. Updates #8453, #8455. Change-Id: I7375f4c34481580ab40e31d33002a4073a0474f3 Reviewed-on: https://go-review.googlesource.com/8360 Reviewed-by: Mikio Hara <mikioh.mikioh@gmail.com> Run-TryBot: Mikio Hara <mikioh.mikioh@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org>
2015-04-03net: move init function into net.goMikio Hara
It's a single, package-wide init function specified for the net package. Change-Id: Id5894d65e1a92297cc16803cc5e4d4eef0b4b099 Reviewed-on: https://go-review.googlesource.com/8391 Reviewed-by: Ian Lance Taylor <iant@golang.org>
2015-03-08net: LookupHost and Resolve{TCP,UDP,IP}Addr should use zone from getaddrinfoAndrew Pilloud
The unix and windows getaddrinfo calls return a zone with IPv6 addresses. IPv6 link-local addresses returned are only valid on the given zone. When the zone is dropped, connections to the address will fail. This patch replaces IP with IPAddr in several internal resolver functions, and plumbs through the zone. Change-Id: Ifea891654f586f15b76988464f82e04a42ccff6d Reviewed-on: https://go-review.googlesource.com/5851 Reviewed-by: Mikio Hara <mikioh.mikioh@gmail.com>
2015-01-22net: simplify itoa conversionsMartin Möhrmann
Rename itod to uitoa to have consistent naming with other itoa functions. Reduce redundant code by calling uitoa from itoa. Reduce buffer to maximally needed size for conversion of 64bit integers. Adjust calls to itoa functions in package net to use new name for itod. Avoid calls to itoa if uitoa suffices. Change-Id: I79deaede4d4b0c076a99a4f4dd6f644ba1daec53 Reviewed-on: https://go-review.googlesource.com/2212 Reviewed-by: Mikio Hara <mikioh.mikioh@gmail.com>
2014-09-08build: move package sources from src/pkg to srcRuss Cox
Preparation was in CL 134570043. This CL contains only the effect of 'hg mv src/pkg/* src'. For more about the move, see golang.org/s/go14nopkg.