1// Copyright 2012 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package icmp
6
7// A MessageBody represents an ICMP message body.
8type MessageBody interface {
9	// Len returns the length of ICMP message body.
10	// The provided proto must be either the ICMPv4 or ICMPv6
11	// protocol number.
12	Len(proto int) int
13
14	// Marshal returns the binary encoding of ICMP message body.
15	// The provided proto must be either the ICMPv4 or ICMPv6
16	// protocol number.
17	Marshal(proto int) ([]byte, error)
18}
19
20// A RawBody represents a raw message body.
21//
22// A raw message body is excluded from message processing and can be
23// used to construct applications such as protocol conformance
24// testing.
25type RawBody struct {
26	Data []byte // data
27}
28
29// Len implements the Len method of MessageBody interface.
30func (p *RawBody) Len(proto int) int {
31	if p == nil {
32		return 0
33	}
34	return len(p.Data)
35}
36
37// Marshal implements the Marshal method of MessageBody interface.
38func (p *RawBody) Marshal(proto int) ([]byte, error) {
39	return p.Data, nil
40}
41
42// parseRawBody parses b as an ICMP message body.
43func parseRawBody(proto int, b []byte) (MessageBody, error) {
44	p := &RawBody{Data: make([]byte, len(b))}
45	copy(p.Data, b)
46	return p, nil
47}
48
49// A DefaultMessageBody represents the default message body.
50//
51// Deprecated: Use RawBody instead.
52type DefaultMessageBody = RawBody
53