Rand Stats

Net::Packet

github:jpve

Net::Packet (Perl6)

Perl6 module for decoding network packets. Encoding/Generating packets is on the TODO list.

The modules are written in pure Perl6. Both the Buf and the C_Buf class can be used as frames to decode. (C_Buf from the perl6-net-pcap module).

The following protocols are implemented: Ethernet, IPv4, UDP and ARP. Each protocol has its own module Net::Packet::*.

Documentation

All modules are documented using in-file Pod. The in-file Pods are rendered to Markdown formatted files in the docs/ directory.

Installation

Using panda:

$ panda update
$ panda install Net::Packet

Using ufo:

$ ufo          # Generates Makefile
$ make
$ make test
$ make install

Usage:

use Net::Packet::Ethernet :short; # use :short for short notation:
use Net::Packet::IPv4 :short;     #   Ethernet.decode
use Net::Packet::UDP :short;      # instead of
                                  #   Net::Packet::Ethernet.decode

my $pkt = Buf.new([...]);

my $eth = Ethernet.decode($pkt);
printf "%s -> %s: ", $eth.src.Str, $eth.dst.Str;
# use .Str or .Int to convert .src/.dst to something usable.

my $ip  = IPv4.decode($eth.data, $eth);
printf "%s -> %s: ", $ip.src.Str, $ip.src.Str;

my $udp = UDP.decode($ip.data, $ip);
printf "%d -> %d\n", $udp.src_port, $udp.dst_port;
use Net::Ethernet :short;

my $pkt = Buf.new([...]);

my $eth = Ethernet.decode($pkt);
printf "%s -> %s: ", $eth.src.Str, $eth.dst.Str;

if $eth.pl ~~ IPv4 { # .pl (for PayLoad) decodes the payload
   printf "%s -> %s: ", $eth.pl.src.Str, $eth.pl.dst.Str;
      
   if $eth.pl.pl ~~ UDP {
      printf "%d -> %d: ", $eth.pl.pl.src_port, $eth.pl.pl.dst_port;
   }
}