github.com/Andyfoo/golang/x/net@v0.0.0-20190901054642-57c1bf301704/icmp/packettoobig.go (about) 1 // Copyright 2014 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 5 package icmp 6 7 import "encoding/binary" 8 9 // A PacketTooBig represents an ICMP packet too big message body. 10 type PacketTooBig struct { 11 MTU int // maximum transmission unit of the nexthop link 12 Data []byte // data, known as original datagram field 13 } 14 15 // Len implements the Len method of MessageBody interface. 16 func (p *PacketTooBig) Len(proto int) int { 17 if p == nil { 18 return 0 19 } 20 return 4 + len(p.Data) 21 } 22 23 // Marshal implements the Marshal method of MessageBody interface. 24 func (p *PacketTooBig) Marshal(proto int) ([]byte, error) { 25 b := make([]byte, 4+len(p.Data)) 26 binary.BigEndian.PutUint32(b[:4], uint32(p.MTU)) 27 copy(b[4:], p.Data) 28 return b, nil 29 } 30 31 // parsePacketTooBig parses b as an ICMP packet too big message body. 32 func parsePacketTooBig(proto int, _ Type, b []byte) (MessageBody, error) { 33 bodyLen := len(b) 34 if bodyLen < 4 { 35 return nil, errMessageTooShort 36 } 37 p := &PacketTooBig{MTU: int(binary.BigEndian.Uint32(b[:4]))} 38 if bodyLen > 4 { 39 p.Data = make([]byte, bodyLen-4) 40 copy(p.Data, b[4:]) 41 } 42 return p, nil 43 }