The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;

use Test::More tests => 8;

use NetPacket::Ethernet;
use NetPacket::IP;
use NetPacket::UDP qw/ udp_strip /;

my $datagram = binarize( <<'END_DATAGRAM' );
00 90 d0 23 ed 2a 00 1c bf ca a3 d5 08 00 45 00 
00 30 00 00 40 00 40 11 30 5a 0a 00 00 a5 84 b1 
7b 0d eb 11 0d 96 00 1c 42 7f 00 01 00 00 21 12 
a4 42 fd 95 e8 83 8a 05 28 45 6a 8e f1 e2
END_DATAGRAM

my $eth = NetPacket::Ethernet->decode( $datagram );
my $ip = NetPacket::IP->decode( $eth->{data} );
my $udp = NetPacket::UDP->decode( $ip->{data}, $ip );

is unpack( "H*", $udp->{data} ) 
    => '000100002112a442fd95e8838a0528456a8ef1e2', 'UDP payload (STUN)';

is $udp->{src_port} => 60177, 'src_port';
is $udp->{dest_port} => 3478, 'dest_port';
is $udp->{len} => 28, 'len';
is $udp->{cksum} => 17023, 'cksum';

is $udp->{src_port} => 60177, 'src_port';
is $udp->{dest_port} => 3478, 'dest_port';

is unpack( "H*", udp_strip($udp->encode($ip)) ) => 
    '000100002112a442fd95e8838a0528456a8ef1e2', 'udp_strip()';


sub binarize {
    my $string = shift;

    $string =~ s/^\s*#.*?$//mg;   # remove comments

    return join '' => map { chr hex } split ' ', $string;
}