mirror of
https://github.com/tailscale/tailscale.git
synced 2024-11-29 13:05:46 +00:00
22bf48f37c
name old time/op new time/op delta Decode/tcp4-8 28.8ns ± 2% 13.1ns ± 4% -54.44% (p=0.008 n=5+5) Decode/tcp6-8 20.6ns ± 1% 12.6ns ± 2% -38.72% (p=0.008 n=5+5) Decode/udp4-8 28.2ns ± 1% 12.1ns ± 4% -57.01% (p=0.008 n=5+5) Decode/udp6-8 20.0ns ± 6% 12.1ns ± 2% -39.38% (p=0.008 n=5+5) Decode/icmp4-8 21.7ns ± 2% 11.5ns ± 1% -47.01% (p=0.008 n=5+5) Decode/icmp6-8 14.1ns ± 2% 11.8ns ± 4% -16.60% (p=0.008 n=5+5) Decode/unknown-8 9.43ns ± 2% 9.30ns ± 3% ~ (p=0.222 n=5+5) Signed-off-by: David Anderson <danderson@tailscale.com>
83 lines
1.6 KiB
Go
83 lines
1.6 KiB
Go
// Copyright (c) 2020 Tailscale Inc & AUTHORS All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package packet
|
|
|
|
import "encoding/binary"
|
|
|
|
type ICMP4Type uint8
|
|
|
|
const (
|
|
ICMP4EchoReply ICMP4Type = 0x00
|
|
ICMP4EchoRequest ICMP4Type = 0x08
|
|
ICMP4Unreachable ICMP4Type = 0x03
|
|
ICMP4TimeExceeded ICMP4Type = 0x0b
|
|
)
|
|
|
|
func (t ICMP4Type) String() string {
|
|
switch t {
|
|
case ICMP4EchoReply:
|
|
return "EchoReply"
|
|
case ICMP4EchoRequest:
|
|
return "EchoRequest"
|
|
case ICMP4Unreachable:
|
|
return "Unreachable"
|
|
case ICMP4TimeExceeded:
|
|
return "TimeExceeded"
|
|
default:
|
|
return "Unknown"
|
|
}
|
|
}
|
|
|
|
type ICMP4Code uint8
|
|
|
|
const (
|
|
ICMP4NoCode ICMP4Code = 0
|
|
)
|
|
|
|
// ICMP4Header represents an ICMPv4 packet header.
|
|
type ICMP4Header struct {
|
|
IP4Header
|
|
Type ICMP4Type
|
|
Code ICMP4Code
|
|
}
|
|
|
|
const (
|
|
icmp4HeaderLength = 4
|
|
// icmp4AllHeadersLength is the length of all headers in a ICMPv4 packet.
|
|
icmp4AllHeadersLength = ip4HeaderLength + icmp4HeaderLength
|
|
)
|
|
|
|
func (ICMP4Header) Len() int {
|
|
return icmp4AllHeadersLength
|
|
}
|
|
|
|
func (h ICMP4Header) Marshal(buf []byte) error {
|
|
if len(buf) < icmp4AllHeadersLength {
|
|
return errSmallBuffer
|
|
}
|
|
if len(buf) > maxPacketLength {
|
|
return errLargePacket
|
|
}
|
|
// The caller does not need to set this.
|
|
h.IPProto = ICMPv4
|
|
|
|
buf[20] = uint8(h.Type)
|
|
buf[21] = uint8(h.Code)
|
|
|
|
h.IP4Header.Marshal(buf)
|
|
|
|
binary.BigEndian.PutUint16(buf[22:24], ipChecksum(buf))
|
|
|
|
return nil
|
|
}
|
|
|
|
func (h *ICMP4Header) ToResponse() {
|
|
// TODO: this doesn't implement ToResponse correctly, as it
|
|
// assumes the ICMP request type.
|
|
h.Type = ICMP4EchoReply
|
|
h.Code = ICMP4NoCode
|
|
h.IP4Header.ToResponse()
|
|
}
|