5 releases

0.1.4 Nov 27, 2020
0.1.3 May 24, 2020
0.1.2 Jul 29, 2017
0.1.1 Jun 9, 2017
0.1.0 Jun 9, 2017

#1092 in Network programming

Download history 963/week @ 2024-07-21 757/week @ 2024-07-28 591/week @ 2024-08-04 553/week @ 2024-08-11 877/week @ 2024-08-18 1685/week @ 2024-08-25 1029/week @ 2024-09-01 1261/week @ 2024-09-08 478/week @ 2024-09-15 673/week @ 2024-09-22 616/week @ 2024-09-29 605/week @ 2024-10-06 475/week @ 2024-10-13 632/week @ 2024-10-20 790/week @ 2024-10-27 681/week @ 2024-11-03

2,651 downloads per month
Used in 10 crates

WTFPL license

185KB
5K SLoC

packet Crates.io packet WTFPL Build Status

This crate allows the parsing and creation of various network packets with an ergonomic API.

Usage

First, add the following to your Cargo.toml:

[dependencies]
packet = "0.1"

Next, add this to your crate root:

extern crate packet;

Packet

Packets take any type implementing AsRef<[u8]>, this means they can borrow an &[u8] or own a Vec<u8> or your own buffer type without needing different types or annoying lifetime parameters.

If the type also implements AsMut<[u8]> some fields are modifiable in place instead of going through a builder, not all fields are settable this way, for instance any fields that have a dynamic size.

Fields in any packet are parsed lazily directly from the buffer, the only exception are fields that are required to verify the packet is correct.

The correctness check doesn't do any checksum validation, this is because some protocols require additional information to calculate the checksum, for instance TCP and UDP require the IP packet to validate.

Buffer

Buffers are abstractions over growable or static slices, they implement a layered setup where each builder creates its own layer and any accesses to the buffer start from where the layer starts.

The buffer can be grown, but the operation may fail if the underlying buffer is not growable, static buffers will only fail if they can't accomodate the requested size.

Builder

Builders are structures that take a Buffer (or create one internally) and incrementally define a new packet.

Builders of upper layer protocols usually provide a way to create a specific sub-protocol, for example ip::v4::Builder allows creating an udp::Builder or tcp::Builder and deal with checksuming and length delimiting as needed.

Examples

Creating an ICMP packet echo request packet.

extern crate packet;
use packet::builder::Builder;
use packet::icmp;

fn main() {
	let packet = icmp::Builder::default()
	  .echo().unwrap().request().unwrap()
	  .identifier(42).unwrap()
			.sequence(2).unwrap()
			.payload(b"test").unwrap()
			.build().unwrap();
}

Dependencies

~1.5–2.1MB
~24K SLoC