aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJosh Bleecher Snyder <josharian@gmail.com>2020-08-13 15:39:09 -0700
committerJosh Bleecher Snyder <josh@tailscale.com>2020-12-08 14:27:36 -0800
commitf64d2a2bbc915338d8c77700883466be0e2dee87 (patch)
treefe9a1b97b87d150f9330523c246d49791c09397a
parentdevice: avoid copying lock in tests (diff)
downloadwireguard-go-f64d2a2bbc915338d8c77700883466be0e2dee87.tar.xz
wireguard-go-f64d2a2bbc915338d8c77700883466be0e2dee87.zip
tun/tuntest: make genICMPv4 allocate less
It doesn't really matter, because it is only used in tests, but it does remove some noise from pprof profiles. Signed-off-by: Josh Bleecher Snyder <josh@tailscale.com>
-rw-r--r--tun/tuntest/tuntest.go15
1 files changed, 7 insertions, 8 deletions
diff --git a/tun/tuntest/tuntest.go b/tun/tuntest/tuntest.go
index e94c6d8..efafebe 100644
--- a/tun/tuntest/tuntest.go
+++ b/tun/tuntest/tuntest.go
@@ -50,12 +50,13 @@ func genICMPv4(payload []byte, dst, src net.IP) []byte {
ipv4TotalLenOffset = 2
ipv4ChecksumOffset = 10
ttl = 65
+ headerSize = ipv4Size + icmpv4Size
)
- hdr := make([]byte, ipv4Size+icmpv4Size)
+ pkt := make([]byte, headerSize+len(payload))
- ip := hdr[0:ipv4Size]
- icmpv4 := hdr[ipv4Size : ipv4Size+icmpv4Size]
+ ip := pkt[0:ipv4Size]
+ icmpv4 := pkt[ipv4Size : ipv4Size+icmpv4Size]
// https://tools.ietf.org/html/rfc792
icmpv4[0] = icmpv4Echo // type
@@ -64,7 +65,7 @@ func genICMPv4(payload []byte, dst, src net.IP) []byte {
binary.BigEndian.PutUint16(icmpv4[icmpv4ChecksumOffset:], chksum)
// https://tools.ietf.org/html/rfc760 section 3.1
- length := uint16(len(hdr) + len(payload))
+ length := uint16(len(pkt))
ip[0] = (4 << 4) | (ipv4Size / 4)
binary.BigEndian.PutUint16(ip[ipv4TotalLenOffset:], length)
ip[8] = ttl
@@ -74,10 +75,8 @@ func genICMPv4(payload []byte, dst, src net.IP) []byte {
chksum = ^checksum(ip[:], 0)
binary.BigEndian.PutUint16(ip[ipv4ChecksumOffset:], chksum)
- var v []byte
- v = append(v, hdr...)
- v = append(v, payload...)
- return []byte(v)
+ copy(pkt[headerSize:], payload)
+ return pkt
}
// TODO(crawshaw): find a reusable home for this. package devicetest?