The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use Test;
BEGIN { plan(tests => 1) }

use strict;
use warnings;

my $NO_HAVE_NetFrameSimple = 0;
eval "use Net::Frame::Simple 1.05";
if($@) {
    $NO_HAVE_NetFrameSimple = "Net::Frame::Simple 1.05 required";
}

my $HAVE_NP = 0;
eval "use Net::Pcap qw(:functions)";
if(!$@) {
    $HAVE_NP = 1;
}

use Net::Frame::Layer::ETH qw(:consts);
use Net::Frame::Layer::IPv4 qw(:consts);
use Net::Frame::Layer::UDP qw(:consts);
use Net::Frame::Layer::Syslog qw(:consts);

my ($eth, $ipv4, $udp, $udpPay, $syslog);
my %packet;

$eth    = Net::Frame::Layer::ETH->new(src=>'C4:17:FE:12:7D:75',dst=>'58:6d:8f:78:ad:40');
$ipv4   = Net::Frame::Layer::IPv4->new(id=>16383,src=>'192.168.10.100',dst=>'8.8.8.8',protocol=>NF_IPv4_PROTOCOL_UDP);
$udp    = Net::Frame::Layer::UDP->new(dst=>514,src=>52001);
$udpPay = Net::Frame::Layer::UDP->new(dst=>514,src=>52001,payload=>pack "H*", '3c3139303e4a616e2032332031343a33323a3534206c6f63616c686f73742030382d7379736c6f67636f6d706172652e745b323538385d207379736c6f67206d657373616765');
$syslog = Net::Frame::Layer::Syslog->new(timestamp=>'Jan 23 14:32:54',host=>'localhost',tag=>'08-syslogcompare.t[2588]');

skip ($NO_HAVE_NetFrameSimple,
sub {
$packet{'01-UDP'} = Net::Frame::Simple->new(
    layers => [ $eth, $ipv4, $udpPay ]
);

$packet{'02-Syslog'} = Net::Frame::Simple->new(
    layers => [ $eth, $ipv4, $udp, $syslog ]
);

print "\nUDP\n";
print $packet{'01-UDP'}->print;
print "\nSyslog\n";
print $packet{'02-Syslog'}->print;
print "\nUDP\n";
print unpack "H*", $packet{'01-UDP'}->pack;
print "\nSyslog\n";
print unpack "H*", $packet{'02-Syslog'}->pack;
print "\n";

(unpack "H*", $packet{'01-UDP'}->pack) eq (unpack "H*", $packet{'02-Syslog'}->pack);
});

if ($HAVE_NP && (!$NO_HAVE_NetFrameSimple)) {

my %devinfo;
my $err;

if (!@ARGV) { exit 0 }

my $fp= pcap_open($ARGV[0], 100, 0, 1000, \%devinfo, \$err);
if (!defined($fp)) {
    printf "\nUnable to open the adapter. %s is not supported by WinPcap\n", $ARGV[0];
    exit 1;
}
for (sort(keys(%packet))) {
    if (pcap_sendpacket($fp, $packet{$_}->pack) != 0) {
        printf "\nError sending the packet: %s\n", pcap_geterr($fp);
        exit 1;
    }
}

}