Net-Frame-Layer-ICMPv6
view release on metacpan or search on metacpan
lib/Net/Frame/Layer/ICMPv6/NeighborSolicitation.pm view on Meta::CPAN
#
# $Id: NeighborSolicitation.pm,v bc01789674fd 2019/05/23 05:51:45 gomor $
#
package Net::Frame::Layer::ICMPv6::NeighborSolicitation;
use strict; use warnings;
use Net::Frame::Layer qw(:consts :subs);
our @ISA = qw(Net::Frame::Layer);
our @AS = qw(
reserved
targetAddress
);
our @AA = qw(
options
);
__PACKAGE__->cgBuildIndices;
__PACKAGE__->cgBuildAccessorsScalar(\@AS);
__PACKAGE__->cgBuildAccessorsArray (\@AA);
use Net::Frame::Layer::ICMPv6::Option;
sub new {
shift->SUPER::new(
reserved => 0,
targetAddress => '::1',
options => [],
@_,
);
}
sub getOptionsLength {
my $self = shift;
my $len = 0;
$len += $_->getLength for $self->options;
return $len;
}
sub getLength {
my $self = shift;
return 20 + $self->getOptionsLength;
}
sub pack {
my $self = shift;
my $raw = $self->SUPER::pack('Na16',
$self->reserved, inet6Aton($self->targetAddress),
) or return;
for ($self->options) {
$raw .= $_->pack;
}
return $self->raw($raw);
}
sub _unpackOptions {
my $self = shift;
my ($payload) = @_;
my @options = ();
while (defined($payload) && length($payload)) {
my $opt = Net::Frame::Layer::ICMPv6::Option->new(raw => $payload)->unpack;
push @options, $opt;
$payload = $opt->payload;
$opt->payload(undef);
}
$self->options(\@options);
return $payload;
}
sub unpack {
my $self = shift;
my ($reserved, $targetAddress, $payload) =
$self->SUPER::unpack('Na16 a*', $self->raw)
or return;
$self->reserved($reserved);
$self->targetAddress(inet6Ntoa($targetAddress));
if (defined($payload) && length($payload)) {
$payload = $self->_unpackOptions($payload);
}
$self->payload($payload);
return $self;
}
sub print {
my $self = shift;
my $l = $self->layer;
my $buf = sprintf "$l: reserved:%d\n".
"$l: targetAddress:%s",
$self->reserved, $self->targetAddress;
for ($self->options) {
$buf .= "\n".$_->print;
}
return $buf;
}
1;
__END__
=head1 NAME
Net::Frame::Layer::ICMPv6::NeighborSolicitation - ICMPv6 Neighbor Solicitation type object
=head1 SYNOPSIS
use Net::Frame::Layer::ICMPv6::NeighborSolicitation;
my $layer = Net::Frame::Layer::ICMPv6::NeighborSolicitation->new(
reserved => 0,
targetAddress => '::1',
);
$layer->pack;
print 'RAW: '.$layer->dump."\n";
# Read a raw layer
my $layer = Net::Frame::Layer::ICMPv6::NeighborSolicitation->new(
raw => $raw,
);
print $layer->print."\n";
print 'PAYLOAD: '.unpack('H*', $layer->payload)."\n"
if $layer->payload;
=head1 DESCRIPTION
This modules implements the encoding and decoding of the ICMPv6 Neighbor Solicitation object.
See also B<Net::Frame::Layer> for other attributes and methods.
( run in 0.401 second using v1.01-cache-2.11-cpan-39bf76dae61 )