Net::Frame::Layer::ICMPv6::NeighborAdvertisement - ICMPv6 Neighbor Advertisement type object


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

Index


Code Index:

NAME

Top

Net::Frame::Layer::ICMPv6::NeighborAdvertisement - ICMPv6 Neighbor Advertisement type object

SYNOPSIS

Top

   use Net::Frame::Layer::ICMPv6::NeighborAdvertisement;

   my $layer = Net::Frame::Layer::ICMPv6::NeighborAdvertisement->new(
      flags         => NF_ICMPv6_FLAG_SOLICITED,
      reserved      => 0,
      targetAddress => '::1',
   );
   $layer->pack;

   print 'RAW: '.$layer->dump."\n";

   # Read a raw layer
   my $layer = Net::Frame::Layer::ICMPv6::NeighborAdvertisement->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 Advertisement object.

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

ATTRIBUTES

Top

flags

ICMPv6 Neighbor Advertisement flags. See CONSTANTS.

reserved

Should be zeroed.

targetAddress

The IPv6 address you want to lookup (for example).

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: NeighborAdvertisement.pm 14 2009-05-31 15:12:43Z gomor $
#
package Net::Frame::Layer::ICMPv6::NeighborAdvertisement;
use strict; use warnings;

use Net::Frame::Layer qw(:consts :subs);
our @ISA = qw(Net::Frame::Layer);

our @AS = qw(
   flags
   reserved
   targetAddress
);
our @AA = qw(
   options
);
__PACKAGE__->cgBuildIndices;
__PACKAGE__->cgBuildAccessorsScalar(\@AS);
__PACKAGE__->cgBuildAccessorsArray (\@AA);

use Net::Frame::Layer::ICMPv6 qw(:consts);
use Bit::Vector;
use Net::Frame::Layer::ICMPv6::Option;

sub new {
   shift->SUPER::new(
      flags         => NF_ICMPv6_FLAG_SOLICITED,
      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 $flags    = Bit::Vector->new_Dec( 3, $self->flags);
   my $reserved = Bit::Vector->new_Dec(29, $self->reserved);
   my $v32      = $flags->Concat_List($reserved);

   my $raw = $self->SUPER::pack('Na16',
      $v32->to_Dec, 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 ($flagsReserved, $targetAddress, $payload) =
      $self->SUPER::unpack('Na16 a*', $self->raw)
         or return undef;

   my $v32 = Bit::Vector->new_Dec(32, $flagsReserved);

   $self->reserved($v32->Chunk_Read(29,  0));
   $self->flags   ($v32->Chunk_Read( 3, 29));
   $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: flags:%02x  reserved:%d\n".
                     "$l: targetAddress:%s",
                        $self->flags, $self->reserved, $self->targetAddress;

   for ($self->options) {
      $buf .= "\n".$_->print;
   }

   return $buf;
}

1;

__END__