Net::Frame::Layer::ICMPv6::NeighborSolicitation - ICMPv6 Neighbor Solicitation type object


Net-Frame-Layer-ICMPv6 documentation Contained in the Net-Frame-Layer-ICMPv6 distribution.

Index


Code Index:

NAME

Top

Net::Frame::Layer::ICMPv6::NeighborSolicitation - ICMPv6 Neighbor Solicitation type object

SYNOPSIS

Top

   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;

DESCRIPTION

Top

This modules implements the encoding and decoding of the ICMPv6 Neighbor Solicitation object.

See also Net::Frame::Layer for other attributes and methods.

ATTRIBUTES

Top

reserved

Should be zeroed.

targetAddress

An IPv6 address.

options

An arrayref of Net::Frame::Layer::Option objects.

The following are inherited attributes. See Net::Frame::Layer for more information.

raw
payload
nextLayer

METHODS

Top

new
new (hash)

Object constructor. You can pass attributes that will overwrite default ones. See SYNOPSIS for default values.

getOptionsLength

Returns the length in bytes of options, 0 if none.

The following are inherited methods. Some of them may be overriden in this layer, and some others may not be meaningful in this layer. See Net::Frame::Layer for more information.

layer
computeLengths
computeChecksums
pack
unpack
encapsulate
getLength
getPayloadLength
print
dump

CONSTANTS

Top

No constants here.

SEE ALSO

Top

Net::Frame::Layer::ICMPv6, Net::Frame::Layer

AUTHOR

Top

Patrice <GomoR> Auffret

COPYRIGHT AND LICENSE

Top


Net-Frame-Layer-ICMPv6 documentation Contained in the Net-Frame-Layer-ICMPv6 distribution.

#
# $Id: NeighborSolicitation.pm 14 2009-05-31 15:12:43Z 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__