// 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
}
