Net::Frame::Layer::ICMPv6::RouterAdvertisement - ICMPv6 Router 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::RouterAdvertisement - ICMPv6 Router Advertisement type object

SYNOPSIS

Top

   use Net::Frame::Layer::ICMPv6::RouterAdvertisement;

   my $layer = Net::Frame::Layer::ICMPv6::RouterAdvertisement->new(
      curHopLimit   => 64,
      flags         => NF_ICMPv6_FLAG_MANAGEDADDRESSCONFIGURATION,
   );
   $layer->pack;

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

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

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

ATTRIBUTES

Top

Refer to RFC 5175 for information on these attributes

curHopLimit
flags
reserved
routerLifetime
reachableTime
retransTimer
options

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 Paolo Vanni Venegas

COPYRIGHT AND LICENSE

Top


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

#
# Router Advertisement message wrapper
# pvenegas@infoweapons.com
#
#
# $Id: RouterAdvertisement.pm 24 2009-11-16 19:45:19Z gomor $
#
package Net::Frame::Layer::ICMPv6::RouterAdvertisement;
use strict; use warnings;

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

our @AS = qw(
   curHopLimit
   flags
   reserved
   routerLifetime
   reachableTime
   retransTimer
);
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;

# TODO: Double-check if defaults are sane
sub new {
   shift->SUPER::new(
      curHopLimit    => 0,
      flags          => 0,
      reserved       => 0,
      routerLifetime => 0,
      reachableTime  => 0,
      retransTimer   => 0,
      options        => [],
      @_,
   );
}

sub getOptionsLength {
   my $self = shift;
   my $len = 0;
   $len += $_->getLength for $self->options;
   return $len;
}

sub getLength {
   my $self = shift;
   return 12 + $self->getOptionsLength;
}

sub pack {
   my $self = shift;

   my $flags    = Bit::Vector->new_Dec(6, $self->flags);
   my $reserved = Bit::Vector->new_Dec(2, $self->reserved);
   my $v8       = $flags->Concat_List($reserved);

   my $raw = $self->SUPER::pack("CcnLL",
      $self->curHopLimit, $v8->to_Dec, $self->routerLifetime,
      $self->reachableTime, $self->retransTimer
   ) or return;

   for ($self->options) {
      $raw .= $_->pack;
   }

   $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 ($curHopLimit, $flagsReserved, $routerLifetime,
       $reachableTime, $retransTimer, $payload) =
          $self->SUPER::unpack("CcnLL a*", $self->raw);

   my $v8 = Bit::Vector->new_Dec(8, $flagsReserved);

   $self->curHopLimit($curHopLimit);
   $self->reserved($v8->Chunk_Read(2, 0));
   $self->flags   ($v8->Chunk_Read(6, 2));
   $self->routerLifetime($routerLifetime);
   $self->reachableTime($reachableTime);
   $self->retransTimer($retransTimer);
 
   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: curHopLimit: %d  flags: 0x%02x  reserved: 0x%02x\n" .
      "$l: routerLifetime: %d  reachableTime: %d  retransTimer: %d",
      $self->curHopLimit,
      $self->flags,
      $self->reserved,
      $self->routerLifetime,
      $self->reachableTime,
      $self->retransTimer;

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

   return $buf;
}

1;

__END__