icmp

package
v0.0.0-...-9a57a4e Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: May 29, 2019 License: BSD-3-Clause, BSD-3-Clause Imports: 11 Imported by: 0

Documentation

Overview

Package icmp provides basic functions for the manipulation of messages used in the Internet Control Message Protocols, ICMPv4 and ICMPv6.

ICMPv4 and ICMPv6 are defined in RFC 792 and RFC 4443.

Index

Examples

Constants

This section is empty.

Variables

This section is empty.

Functions

func IPv6PseudoHeader

func IPv6PseudoHeader(src, dst net.IP) []byte

IPv6PseudoHeader returns an IPv6 pseudo header for checkusm calculation.

func ParseIPv4Header

func ParseIPv4Header(b []byte) (*ipv4.Header, error)

ParseIPv4Header parses b as an IPv4 header of ICMP error message invoking packet, which is contained in ICMP error message.

Types

type DefaultMessageBody

type DefaultMessageBody struct {
	Data []byte // data
}

A DefaultMessageBody represents the default message body.

func (*DefaultMessageBody) Len

func (p *DefaultMessageBody) Len() int

Len implements the Len method of MessageBody interface.

func (*DefaultMessageBody) Marshal

func (p *DefaultMessageBody) Marshal() ([]byte, error)

Marshal implements the Marshal method of MessageBody interface.

type DstUnreach

type DstUnreach struct {
	Data []byte // data
}

A DstUnreach represents an ICMP destination unreachable message body.

func (*DstUnreach) Len

func (p *DstUnreach) Len() int

Len implements the Len method of MessageBody interface.

func (*DstUnreach) Marshal

func (p *DstUnreach) Marshal() ([]byte, error)

Marshal implements the Marshal method of MessageBody interface.

type Echo

type Echo struct {
	ID   int    // identifier
	Seq  int    // sequence number
	Data []byte // data
}

An Echo represents an ICMP echo request or reply message body.

func (*Echo) Len

func (p *Echo) Len() int

Len implements the Len method of MessageBody interface.

func (*Echo) Marshal

func (p *Echo) Marshal() ([]byte, error)

Marshal implements the Marshal method of MessageBody interface.

type Message

type Message struct {
	Type     Type        // type, either ipv4.ICMPType or ipv6.ICMPType
	Code     int         // code
	Checksum int         // checksum
	Body     MessageBody // body
}

A Message represents an ICMP message.

func ParseMessage

func ParseMessage(proto int, b []byte) (*Message, error)

ParseMessage parses b as an ICMP message. Proto must be either the ICMPv4 or ICMPv6 protocol number.

func (*Message) Marshal

func (m *Message) Marshal(psh []byte) ([]byte, error)

Marshal returns the binary enconding of the ICMP message m.

For an ICMPv4 message, the returned message always contains the calculated checksum field.

For an ICMPv6 message, the returned message contains the calculated checksum field when psh is not nil, otherwise the kernel will compute the checksum field during the message transmission. When psh is not nil, it must be the pseudo header for IPv6.

type MessageBody

type MessageBody interface {
	// Len returns the length of ICMP message body.
	Len() int

	// Marshal returns the binary enconding of ICMP message body.
	Marshal() ([]byte, error)
}

A MessageBody represents an ICMP message body.

type PacketConn

type PacketConn struct {
	// contains filtered or unexported fields
}

A PacketConn represents a packet network endpoint that uses either ICMPv4 or ICMPv6.

Example (NonPrivilegedPing)
package main

import (
	"log"
	"net"
	"os"

	"golang.org/x/net/icmp"
	"golang.org/x/net/internal/iana"
	"golang.org/x/net/ipv6"
)

func main() {
	c, err := icmp.ListenPacket("udp6", "fe80::1%en0")
	if err != nil {
		log.Fatal(err)
	}
	defer c.Close()

	wm := icmp.Message{
		Type: ipv6.ICMPTypeEchoRequest, Code: 0,
		Body: &icmp.Echo{
			ID: os.Getpid() & 0xffff, Seq: 1,
			Data: []byte("HELLO-R-U-THERE"),
		},
	}
	wb, err := wm.Marshal(nil)
	if err != nil {
		log.Fatal(err)
	}
	if _, err := c.WriteTo(wb, &net.UDPAddr{IP: net.ParseIP("ff02::1"), Zone: "en0"}); err != nil {
		log.Fatal(err)
	}

	rb := make([]byte, 1500)
	n, peer, err := c.ReadFrom(rb)
	if err != nil {
		log.Fatal(err)
	}
	rm, err := icmp.ParseMessage(iana.ProtocolIPv6ICMP, rb[:n])
	if err != nil {
		log.Fatal(err)
	}
	switch rm.Type {
	case ipv6.ICMPTypeEchoReply:
		log.Printf("got reflection from %v", peer)
	default:
		log.Printf("got %+v; want echo reply", rm)
	}
}
Output:

func ListenPacket

func ListenPacket(network, address string) (*PacketConn, error)

ListenPacket listens for incoming ICMP packets addressed to address. See net.Dial for the syntax of address.

For non-privileged datagram-oriented ICMP endpoints, network must be "udp4" or "udp6". The endpoint allows to read, write a few limited ICMP messages such as echo request and echo reply. Currently only Darwin and Linux support this.

Examples:

ListenPacket("udp4", "192.168.0.1")
ListenPacket("udp4", "0.0.0.0")
ListenPacket("udp6", "fe80::1%en0")
ListenPacket("udp6", "::")

For privileged raw ICMP endpoints, network must be "ip4" or "ip6" followed by a colon and an ICMP protocol number or name.

Examples:

ListenPacket("ip4:icmp", "192.168.0.1")
ListenPacket("ip4:1", "0.0.0.0")
ListenPacket("ip6:ipv6-icmp", "fe80::1%en0")
ListenPacket("ip6:58", "::")

func (*PacketConn) Close

func (c *PacketConn) Close() error

Close closes the endpoint.

func (*PacketConn) IPv4PacketConn

func (c *PacketConn) IPv4PacketConn() *ipv4.PacketConn

IPv4PacketConn returns the ipv4.PacketConn of c. It returns nil when c is not created as the endpoint for ICMPv4.

func (*PacketConn) IPv6PacketConn

func (c *PacketConn) IPv6PacketConn() *ipv6.PacketConn

IPv6PacketConn returns the ipv6.PacketConn of c. It returns nil when c is not created as the endpoint for ICMPv6.

func (*PacketConn) LocalAddr

func (c *PacketConn) LocalAddr() net.Addr

LocalAddr returns the local network address.

func (*PacketConn) ReadFrom

func (c *PacketConn) ReadFrom(b []byte) (int, net.Addr, error)

ReadFrom reads an ICMP message from the connection.

func (*PacketConn) SetDeadline

func (c *PacketConn) SetDeadline(t time.Time) error

SetDeadline sets the read and write deadlines associated with the endpoint.

func (*PacketConn) SetReadDeadline

func (c *PacketConn) SetReadDeadline(t time.Time) error

SetReadDeadline sets the read deadline associated with the endpoint.

func (*PacketConn) SetWriteDeadline

func (c *PacketConn) SetWriteDeadline(t time.Time) error

SetWriteDeadline sets the write deadline associated with the endpoint.

func (*PacketConn) WriteTo

func (c *PacketConn) WriteTo(b []byte, dst net.Addr) (int, error)

WriteTo writes the ICMP message b to dst. Dst must be net.UDPAddr when c is a non-privileged datagram-oriented ICMP endpoint. Otherwise it must be net.IPAddr.

type PacketTooBig

type PacketTooBig struct {
	MTU  int    // maximum transmission unit of the nexthop link
	Data []byte // data
}

A PacketTooBig represents an ICMP packet too big message body.

func (*PacketTooBig) Len

func (p *PacketTooBig) Len() int

Len implements the Len method of MessageBody interface.

func (*PacketTooBig) Marshal

func (p *PacketTooBig) Marshal() ([]byte, error)

Marshal implements the Marshal method of MessageBody interface.

type ParamProb

type ParamProb struct {
	Pointer uintptr // offset within the data where the error was detected
	Data    []byte  // data
}

A ParamProb represents an ICMP parameter problem message body.

func (*ParamProb) Len

func (p *ParamProb) Len() int

Len implements the Len method of MessageBody interface.

func (*ParamProb) Marshal

func (p *ParamProb) Marshal() ([]byte, error)

Marshal implements the Marshal method of MessageBody interface.

type TimeExceeded

type TimeExceeded struct {
	Data []byte // data
}

A TimeExceeded represents an ICMP time exceeded message body.

func (*TimeExceeded) Len

func (p *TimeExceeded) Len() int

Len implements the Len method of MessageBody interface.

func (*TimeExceeded) Marshal

func (p *TimeExceeded) Marshal() ([]byte, error)

Marshal implements the Marshal method of MessageBody interface.

type Type

type Type interface {
	Protocol() int
}

A Type represents an ICMP message type.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL