Module wire

Source
Expand description

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 smoltcp::phy::ChecksumCapabilities;
use smoltcp::wire::*;
let repr = Ipv4Repr {
    src_addr:    Ipv4Address::new(10, 0, 0, 1),
    dst_addr:    Ipv4Address::new(10, 0, 0, 2),
    next_header: 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, &ChecksumCapabilities::default());
}
{ // parsing
    let packet = Ipv4Packet::new_checked(&buffer)
                            .expect("truncated packet");
    let parsed = Ipv4Repr::parse(&packet, &ChecksumCapabilities::default())
                          .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.
DhcpFlags
DhcpOption
A representation of a single DHCP option.
DhcpOptionWriter
A buffer for DHCP options.
DhcpPacket
A read/write wrapper around a Dynamic Host Configuration Protocol packet buffer.
DhcpRepr
A high-level representation of a Dynamic Host Configuration Protocol packet.
Error
Parsing a packet failed.
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.
Icmpv4Packet
A read/write wrapper around an Internet Control Message Protocol version 4 packet buffer.
Icmpv6Packet
A read/write wrapper around an Internet Control Message Protocol version 6 packet buffer.
IgmpPacket
A read/write wrapper around an Internet Group Management Protocol v1/v2 packet buffer.
IpEndpoint
An internet endpoint address.
IpListenEndpoint
An internet endpoint address for listening.
Ipv4Address
An IPv4 address.
Ipv4Cidr
A specification of an IPv4 CIDR block, containing an address and a variable-length subnet masking prefix length.
Ipv4FragKey
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.
Ipv6Address
An IPv6 address.
Ipv6Cidr
A specification of an IPv6 CIDR block, containing an address and a variable-length subnet masking prefix length.
Ipv6ExtHeader
A read/write wrapper around an IPv6 Extension Header buffer.
Ipv6ExtHeaderRepr
Ipv6FragmentHeader
A read/write wrapper around an IPv6 Fragment Header.
Ipv6FragmentRepr
A high-level representation of an IPv6 Fragment header.
Ipv6HopByHopHeader
A read/write wrapper around an IPv6 Hop-by-Hop Header buffer.
Ipv6HopByHopRepr
A high-level representation of an IPv6 Hop-by-Hop Header.
Ipv6Option
A read/write wrapper around an IPv6 Extension Header Option.
Ipv6OptionsIterator
A iterator for IPv6 options.
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.
Ipv6RoutingHeader
A read/write wrapper around an IPv6 Routing Header buffer.
MldAddressRecord
A read/write wrapper around an MLDv2 Listener Report Message Address Record.
MldAddressRecordRepr
A high level representation of an MLDv2 Listener Report Message Address Record.
NdiscNeighborFlags
NdiscOption
A read/write wrapper around an NDISC Option.
NdiscPrefixInfoFlags
NdiscPrefixInformation
NdiscRedirectedHeader
NdiscRouterFlags
RawHardwareAddress
Unparsed hardware address.
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.
TcpTimestampRepr
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.
DhcpMessageType
The possible message types of a DHCP packet.
DhcpOpCode
The possible opcodes of a DHCP packet.
EthernetProtocol
Ethernet protocol type.
HardwareAddress
Representation of an hardware address, such as an Ethernet address or an IEEE802.15.4 address.
IcmpRepr
Icmpv4DstUnreachable
Internet protocol control message subtype for type “Destination Unreachable”.
Icmpv4Message
Internet protocol control message type.
Icmpv4ParamProblem
Internet protocol control message subtype for type “Parameter Problem”.
Icmpv4Redirect
Internet protocol control message subtype for type “Redirect Message”.
Icmpv4Repr
A high-level representation of an Internet Control Message Protocol version 4 packet header.
Icmpv4TimeExceeded
Internet protocol control message subtype for type “Time Exceeded”.
Icmpv6DstUnreachable
Internet protocol control message subtype for type “Destination Unreachable”.
Icmpv6Message
Internet protocol control message type.
Icmpv6ParamProblem
Internet protocol control message subtype for the type “Parameter Problem”.
Icmpv6Repr
A high-level representation of an Internet Control Message Protocol version 6 packet header.
Icmpv6TimeExceeded
Internet protocol control message subtype for the type “Time Exceeded”.
IgmpRepr
A high-level representation of an Internet Group Management Protocol v1/v2 header.
IgmpVersion
Type of IGMP membership report version
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.
Ipv6OptionFailureType
Action required when parsing the given IPv6 Extension Header Option Type fails
Ipv6OptionRepr
A high-level representation of an IPv6 Extension Header Option.
Ipv6OptionRouterAlert
A high-level representation of an IPv6 Router Alert Header Option.
Ipv6OptionType
IPv6 Extension Header Option Type
Ipv6RoutingRepr
A high-level representation of an IPv6 Routing Header.
Ipv6RoutingType
IPv6 Extension Routing Header Routing Type
MldRecordType
MLDv2 Multicast Listener Report Record Type. See RFC 3810 § 5.2.12 for more details.
MldRepr
A high-level representation of an MLDv2 packet header.
NdiscOptionRepr
A high-level representation of an NDISC Option.
NdiscOptionType
NDISC Option Type
NdiscRepr
A high-level representation of an Neighbor Discovery packet header.
TcpControl
The possible control flags of a Transmission Control Protocol packet.
TcpOption
A representation of a single TCP option.

Constants§

DHCP_CLIENT_PORT
DHCP_MAX_DNS_SERVER_COUNT
DHCP_SERVER_PORT
ETHERNET_HEADER_LEN
The Ethernet header length
IPV4_HEADER_LEN
IPV4_MIN_MTU
Minimum MTU required of all links supporting IPv4. See RFC 791 § 3.1.
IPV4_MULTICAST_ALL_ROUTERS
All multicast-capable routers
IPV4_MULTICAST_ALL_SYSTEMS
All multicast-capable nodes
IPV6_HEADER_LEN
Length of an IPv6 header.
IPV6_LINK_LOCAL_ALL_MLDV2_ROUTERS
The link-local all MLVDv2-capable routers multicast address.
IPV6_LINK_LOCAL_ALL_NODES
The link-local all nodes multicast address.
IPV6_LINK_LOCAL_ALL_ROUTERS
The link-local all routers multicast address.
IPV6_LINK_LOCAL_ALL_RPL_NODES
The link-local all RPL nodes multicast address.
IPV6_MIN_MTU
Minimum MTU required of all links supporting IPv6. See RFC 8200 § 5.
MAX_HARDWARE_ADDRESS_LEN
TCP_HEADER_LEN
UDP_HEADER_LEN

Type Aliases§

Result
TcpTimestampGenerator