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

use Net::Frame::Simple;
use Net::Frame::Layer::ICMPv4 qw(:consts);

my $icmp = Net::Frame::Layer::ICMPv4->new(
   type     => NF_ICMPv4_TYPE_ECHO_REQUEST,
   code     => NF_ICMPv4_CODE_ZERO,
   checksum => 0,
);

# Build an ICMPv4 echo-request
use Net::Frame::Layer::ICMPv4::Echo;
my $echo = Net::Frame::Layer::ICMPv4::Echo->new(payload => 'echo');

my $echoReq = Net::Frame::Simple->new(layers => [ $icmp, $echo ]);
print $echoReq->print."\n";

# Build an information-request
use Net::Frame::Layer::ICMPv4::Information;
my $info = Net::Frame::Layer::ICMPv4::Information->new(payload => 'info');
$icmp->type(NF_ICMPv4_TYPE_INFORMATION_REQUEST);

my $infoReq = Net::Frame::Simple->new(layers => [ $icmp, $info ]);
print $infoReq->print."\n";

# Build an address-mask request
use Net::Frame::Layer::ICMPv4::AddressMask;
my $mask = Net::Frame::Layer::ICMPv4::AddressMask->new(payload => 'mask');
$icmp->type(NF_ICMPv4_TYPE_ADDRESS_MASK_REQUEST);

my $maskReq = Net::Frame::Simple->new(layers => [ $icmp, $mask ]);
print $maskReq->print."\n";

# Build a timestamp request
use Net::Frame::Layer::ICMPv4::Timestamp;
my $timestamp = Net::Frame::Layer::ICMPv4::Timestamp->new(payload => 'time');
$icmp->type(NF_ICMPv4_TYPE_TIMESTAMP_REQUEST);

my $timestampReq = Net::Frame::Simple->new(layers => [ $icmp, $timestamp ]);
print $timestampReq->print."\n";