summaryrefslogtreecommitdiffhomepage
path: root/net/packet/icmp.go
blob: 8f9cd0e2bb4a1aa1114c6ddce58dbbe10df06be2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// Copyright (c) Tailscale Inc & contributors
// SPDX-License-Identifier: BSD-3-Clause

package packet

import (
	crand "crypto/rand"

	"encoding/binary"
)

// ICMPEchoPayload generates a new random ID/Sequence pair, and returns a uint32
// derived from them, along with the id, sequence and given payload in a buffer.
// It returns an error if the random source could not be read.
func ICMPEchoPayload(payload []byte) (idSeq uint32, buf []byte) {
	buf = make([]byte, len(payload)+4)

	// make a completely random id/sequence combo, which is very unlikely to
	// collide with a running ping sequence on the host system. Errors are
	// ignored, that would result in collisions, but errors reading from the
	// random device are rare, and will cause this process universe to soon end.
	crand.Read(buf[:4])

	idSeq = binary.LittleEndian.Uint32(buf)
	copy(buf[4:], payload)

	return
}