[][src]Module ethox::wire

Low-level packet access and construction.

The wire module deals with the packet representation. It provides two levels of functionality.

  • First, it provides functions to extract fields from sequences of octets, and to insert fields into sequences of octets. This happens Packet family of structures, e.g. EthernetFrame or Ipv4Packet.
  • Second, in cases where the space of valid field values is much smaller than the space of possible field values, it provides a compact, high-level representation of packet data that can be parsed from and emitted into a sequence of octets. This happens through the Repr family of structs and enums, e.g. ArpRepr or Ipv4Repr.

The functions in the wire module are designed for use together with -Cpanic=abort.

The Packet family of data structures guarantees that, if the Packet::check_len() method returned Ok(()), then no accessor or setter method will panic; however, the guarantee provided by Packet::check_len() may no longer hold after changing certain fields, which are listed in the documentation for the specific packet.

The Packet::new_checked method is a shorthand for a combination of Packet::new_unchecked and Packet::check_len. When parsing untrusted input, it is necessary to use Packet::new_checked(); so long as the buffer is not modified, no accessor will fail. When emitting output, though, it is incorrect to use Packet::new_checked(); the length check is likely to succeed on a zeroed buffer, but fail on a buffer filled with data from a previous packet, such as when reusing buffers, resulting in nondeterministic panics with some network devices but not others. The buffer length for emission is not calculated by the Packet layer.

In the Repr family of data structures, the Repr::parse() method never panics as long as Packet::new_checked() (or Packet::check_len()) has succeeded, and the Repr::emit() method never panics as long as the underlying buffer is exactly Repr::buffer_len() octets long.

Examples

To emit an IP packet header into an octet buffer, and then parse it back:

use ethox::wire::*;
let repr = Ipv4Repr {
    src_addr:    Ipv4Address::new(10, 0, 0, 1),
    dst_addr:    Ipv4Address::new(10, 0, 0, 2),
    protocol:    IpProtocol::Tcp,
    payload_len: 10,
    hop_limit:   64
};
let mut buffer = vec![0; repr.buffer_len() + repr.payload_len];
{ // emission
    let mut packet = Ipv4Packet::new_unchecked(&mut buffer);
    repr.emit(&mut packet, Checksum::Manual);
}
{ // parsing
    let packet = Ipv4Packet::new_checked(&buffer)
        .expect("truncated packet");
    let parsed = Ipv4Repr::parse(&packet, Checksum::Manual)
        .expect("malformed packet");
    assert_eq!(repr, parsed);
}

Re-exports

pub use self::pretty_print::PrettyPrinter;

Modules

pretty_print

Pretty-printing of packet representation.

Structs

ArpPacket

A read/write wrapper around an Address Resolution Protocol packet buffer.

EthernetAddress

A six-octet Ethernet II address.

EthernetFrame

A read/write wrapper around an Ethernet II frame buffer.

EthernetRepr

A high-level representation of an Internet Protocol version 4 packet header.

IpEndpoint

An internet endpoint address.

Ipv4Address

A four-octet IPv4 address.

Ipv4Packet

A read/write wrapper around an Internet Protocol version 4 packet buffer.

Ipv4Repr

A high-level representation of an Internet Protocol version 4 packet header.

Ipv4Cidr

A specification of an IPv4 CIDR block, containing an address and a variable-length subnet masking prefix length.

Ipv6Address

A sixteen-octet IPv6 address.

Ipv6Packet

A read/write wrapper around an Internet Protocol version 6 packet buffer.

Ipv6Repr

A high-level representation of an Internet Protocol version 6 packet header.

Ipv6Cidr

A specification of an IPv6 CIDR block, containing an address and a variable-length subnet masking prefix length.

Ipv6Option

A read/write wrapper around an IPv6 Extension Header Option.

Ipv6HopByHopHeader

A read/write wrapper around an IPv6 Hop-by-Hop Options Header.

Ipv6HopByHopRepr

A high-level representation of an IPv6 Hop-by-Hop Options header.

Ipv6FragmentHeader

A read/write wrapper around an IPv6 Fragment Header.

Ipv6FragmentRepr

A high-level representation of an IPv6 Fragment header.

Ipv6RoutingHeader

A read/write wrapper around an IPv6 Routing Header buffer.

TcpPacket

A read/write wrapper around a Transmission Control Protocol packet buffer.

TcpRepr

A high-level representation of a Transmission Control Protocol packet.

TcpSeqNumber

A TCP sequence number.

UdpPacket

A read/write wrapper around an User Datagram Protocol packet buffer.

UdpRepr

A high-level representation of an User Datagram Protocol packet.

Enums

ArpHardware

ARP hardware type.

ArpOperation

ARP operation type.

ArpRepr

A high-level representation of an Address Resolution Protocol packet.

Checksum

Describes how to handle checksums.

Error

The error type for parsing of the network stack.

EthernetProtocol

Ethernet protocol type.

IpAddress

An internetworking address.

IpCidr

A specification of a CIDR block, containing an address and a variable-length subnet masking prefix length.

IpProtocol

IP datagram encapsulated protocol.

IpRepr

An IP packet representation.

IpVersion

Internet protocol version.

Ipv6OptionRepr

A high-level representation of an IPv6 Extension Header Option.

Ipv6OptionType

IPv6 Extension Header Option Type

Ipv6OptionFailureType

Action required when parsing the given IPv6 Extension Header Option Type fails

Ipv6RoutingRepr

A high-level representation of an IPv6 Routing Header.

TcpControl

The possible control flags of a Transmission Control Protocol packet.

TcpOption

A representation of a single TCP option.

Constants

IPV4_MIN_MTU

Minimum MTU required of all links supporting IPv4. See RFC 791 § 3.1.

IPV6_MIN_MTU

Minimum MTU required of all links supporting IPv6. See RFC 8200 § 5.

Type Definitions

Result

The result type for the networking stack.