#packet-parser #network-protocol #packet #packets #parser #networking #scapy

pkts-common

helper library for shared types/utilities among rscap and pkts

2 unstable releases

0.2.0 Sep 17, 2024
0.1.0 Jul 27, 2024

#2151 in Network programming

Download history 144/week @ 2024-07-26 5/week @ 2024-08-02 184/week @ 2024-09-06 255/week @ 2024-09-13 46/week @ 2024-09-20 15/week @ 2024-09-27 11/week @ 2024-10-04 6/week @ 2024-10-11 20/week @ 2024-10-18

55 downloads per month
Used in 2 crates

MIT/Apache

9KB
208 lines

pkts

Latest Version GHA Status Documentation pkts: rustc 1.65+

pkts - ergonomic, no-std-compatible packet construction and manipulation


pkts is a multi-purpose library for network packet capture/transmission and packet building. Its aims are twofold:

  1. To provide Rust-native platform tools for packet capture and transmission (comparable to libpcap, but written from the ground up in Rust)
  2. To expose a robust and ergonomic API for building packets and accessing/modifying packet data fields in various network protocols (like scapy, but with strong typing and significantly improved performance)

pkts specifically accomplishes (2), while the sibling rscap library handles (1).

Features

  • Platform-independent interface for packet capture/transmission: rscap provides a single unified interface for capturing and transmitting packets across any supported platform. Additionally, the library exposes safe abstractions of platform-specific packet capture tools (such as AF_PACKET/PACKET_MMAP sockets in Linux) to support cases where fine-grained control or platform-specific features are desired.
  • no-std Compatible: every packet type in the pkts crate can be used without the standard library, and a special LayerRef type can be used to access raw packet bytes without requiring alloc.
  • Robust APIs for building/modifying packets: pkts provides simple operations to combine various layers into a single packet, and to index into a different layers of a packet to retrieve or modify fields. Users of scapy may find the API surprisingly familiar, especially for layer composition and indexing operations:
use layers::{ip::Ipv4, tcp::Tcp};

let pkt = Ip::new() / Tcp::new();
pkt[Tcp].set_sport(80);
pkt[Tcp].set_dport(12345);
  • Packet defragmentation/reordering: In some protocols, packets may be fragmented (such as IPv4) or arrive out-of-order (TCP, SCTP, etc.). pkts overcomes both of these issues through Sequence types that transparently handle defragmentation and reordering. Sequence types can even be stacked so that application-layer data can easily be reassembled from captured packets. They even work in no-std environments with or without alloc.
  • Stateful packet support: Many network protocols are stateful, and interpreting packets from such protocols can be difficult (if not impossible) to accomplish unless information about the protocol session is stored. Rscap provides Session types that handle these kinds of packets--Sessions ensure that packets are validated based on the current expected state of the protocol. Just like Sequence, Session types are compatible with no-std environments and do not require alloc.

License

This project is licensed under either of

at your option.

Contributing

rscap is open to contribution--feel free to submit an Issue or Pull Request if there's something you'd like to add to this library.

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in rscap by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

No runtime deps