Net-Frame-Layer-RIPng

 view release on metacpan or  search on metacpan

Changes  view on Meta::CPAN

Revision history for Perl extension Net::Frame::Layer::RIPng.

1.02 Thu Jan 26 17:48:36 EST 2012
   - Windows + CPAN = withoutworldwriteables

1.01 Thu Jan 26 17:48:36 EST 2012
   - t\02 ... dubious test number corrected

1.00 Wed Jan 17 17:48:36 EST 2012
   - first public release

MANIFEST  view on Meta::CPAN

Changes
lib/Net/Frame/Layer/RIPng.pm
lib/Net/Frame/Layer/RIPng/v1.pm
LICENSE
LICENSE.Artistic
Makefile.PL
MANIFEST			This list of files
README
t/01-use.t
t/02-pod-coverage.t
t/03-test-pod.t
t/04-ripng.t
t/05-ripngv1.t

META.yml  view on Meta::CPAN

--- #YAML:1.0
name:               Net-Frame-Layer-RIPng
version:            1.02
abstract:           Routing Information Protocol ng layer object
author:
    - Michael Vincent <vin at vinsworld dot com>
license:            artistic
distribution_type:  module
configure_requires:
    ExtUtils::MakeMaker:  0
build_requires:
    ExtUtils::MakeMaker:  0

Makefile.PL  view on Meta::CPAN

#
# $Id: Makefile.PL 49 2009-05-31 13:15:34Z gomor $
#
use ExtUtils::MakeMaker;

require v5.6.1;

WriteMakefile(
   NAME          => 'Net::Frame::Layer::RIPng',
   VERSION_FROM  => 'lib/Net/Frame/Layer/RIPng.pm',
   LICENSE       => 'artistic',
   ABSTRACT_FROM => 'lib/Net/Frame/Layer/RIPng.pm',
   AUTHOR        => 'Michael Vincent <vin at vinsworld dot com>',
   PREREQ_PM     => {
      Net::Frame => 1.09,
      Net::Frame::Layer::IPv6 => 1.03,
   },
);

README  view on Meta::CPAN

Net::Frame::Layer::RIPng
========================

INSTALLATION

To install this module type the following:

   perl Makefile.PL
   make
   make test
   make install

lib/Net/Frame/Layer/RIPng.pm  view on Meta::CPAN

#
# $Id: RIPng.pm 49 2009-05-31 13:15:34Z VinsWorldcom $
#
package Net::Frame::Layer::RIPng;
use strict; use warnings;

our $VERSION = '1.02';

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

use Net::Frame::Layer::RIPng::v1 qw(:consts);
my @consts;
for my $c (sort(keys(%constant::declared))) {
    if ($c =~ /^Net::Frame::Layer::RIPng::v1::/) {
        $c =~ s/^Net::Frame::Layer::RIPng::v1:://;
        push @consts, $c
    }
}

our %EXPORT_TAGS = (
   consts => [@consts, qw(
      NF_RIPNG_DEST_HWADDR
      NF_RIPNG_DEST_ADDR
      NF_RIPNG_DEST_PORT
      NF_RIPNG_COMMAND_REQUEST

lib/Net/Frame/Layer/RIPng.pm  view on Meta::CPAN

our @AS = qw(
   command
   version
   reserved
);
__PACKAGE__->cgBuildIndices;
__PACKAGE__->cgBuildAccessorsScalar(\@AS);

#no strict 'vars';

$Net::Frame::Layer::UDP::Next->{521} = "RIPng";

sub new {
   shift->SUPER::new(
      command  => NF_RIPNG_COMMAND_REQUEST,
      version  => 1,
      reserved => 0,
      @_,
   );
}

lib/Net/Frame/Layer/RIPng.pm  view on Meta::CPAN

   return $self;
}

sub encapsulate {
   my $self = shift;

   return $self->nextLayer if $self->nextLayer;

   if ($self->payload) {
      if ($self->version == 1) {
         return 'RIPng::v1';
      }
   }

   NF_LAYER_NONE;
}

sub print {
   my $self = shift;

   my $l = $self->layer;

lib/Net/Frame/Layer/RIPng.pm  view on Meta::CPAN


   return $buf;
}

1;

__END__

=head1 NAME

Net::Frame::Layer::RIPng - Routing Information Protocol ng layer object

=head1 SYNOPSIS

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

   my $layer = Net::Frame::Layer::RIPng->new(
      command  => NF_RIPNG_COMMAND_REQUEST,
      version  => 1,
      reserved => 0,
   );

   #
   # Read a raw layer
   #

   my $layer = Net::Frame::Layer::RIPng->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 RIPng layer.

RFC: ftp://ftp.rfc-editor.org/in-notes/rfc2080.txt

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

=head1 ATTRIBUTES

=over 4

=item B<command>

RIP command.  See B<CONSTANTS> for more information.

=item B<version>

RIPng protocol version: 1 valid.

=item B<reserved>

Default set to 0.

=back

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

=over 4

lib/Net/Frame/Layer/RIPng.pm  view on Meta::CPAN

=item B<new> (hash)

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

=item B<getKey>

=item B<getKeyReverse>

These two methods are basically used to increase the speed when using B<recv> method from B<Net::Frame::Simple>. Usually, you write them when you need to write B<match> method.

=item B<match> (Net::Frame::Layer::RIPng object)

This method is mostly used internally. You pass a B<Net::Frame::Layer::RIPng> layer as a parameter, and it returns true if this is a response corresponding for the request, or returns false if not.

=back

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 B<Net::Frame::Layer> for more information.

=over 4

=item B<layer>

=item B<computeLengths>

lib/Net/Frame/Layer/RIPng.pm  view on Meta::CPAN

=item B<getPayloadLength>

=item B<print>

=item B<dump>

=back

=head1 CONSTANTS

Load them: use Net::Frame::Layer::RIPng qw(:consts);

=over 4

=item B<NF_RIPNG_DEST_HWADDR>

=item B<NF_RIPNG_DEST_ADDR>

=item B<NF_RIPNG_DEST_PORT>

Default destination Ethernet address, IPv6 address and UDP port.

lib/Net/Frame/Layer/RIPng/v1.pm  view on Meta::CPAN

#
# $Id: v1.pm 49 2009-05-31 13:15:34Z VinsWorldcom $
#
package Net::Frame::Layer::RIPng::v1;
use strict; use warnings;

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

our %EXPORT_TAGS = (
   consts => [qw(
      NF_RIPNG_METRIC_INFINITY
   )],
);

lib/Net/Frame/Layer/RIPng/v1.pm  view on Meta::CPAN


   return $self;
}

sub encapsulate {
   my $self = shift;

   return $self->nextLayer if $self->nextLayer;

   if ($self->payload) {
      return "RIPng::v1";
   }

   NF_LAYER_NONE;
}

sub print {
   my $self = shift;

   my $l = $self->layer;
   my $buf = sprintf

lib/Net/Frame/Layer/RIPng/v1.pm  view on Meta::CPAN


   return $buf;
}

1;

__END__

=head1 NAME

Net::Frame::Layer::RIPng::v1 - Routing Information Protocol ng v1 layer object

=head1 SYNOPSIS

   use Net::Frame::Layer::RIP::v1 qw(:consts);

   my $ripngv1 = Net::Frame::Layer::RIPng::v1->new(
      prefix       => '::',
      routeTag     => 0,
      prefixLength => 64,
      metric       => 1,
   );
   $ripngv1->pack;

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

   # Read a raw layer
   my $layer = Net::Frame::Layer::RIPng::v1->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 RIPng v1 layer.

RFC: ftp://ftp.rfc-editor.org/in-notes/rfc2080.txt

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

=head1 ATTRIBUTES

=over 4

=item B<prefix>

lib/Net/Frame/Layer/RIPng/v1.pm  view on Meta::CPAN

=item B<new>

=item B<new> (hash)

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

=item B<full>

=item B<full> (hash)

Object constructor. Same as B<new> but with RIPng Request header, requests full routing table.  You can pass attributes that will overwrite default ones.  Default values:  all fields 0 with B<NF_RIPNG_METRIC_INFINITY> set.

=back

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 B<Net::Frame::Layer> for more information.

=over 4

=item B<layer>

=item B<computeLengths>

lib/Net/Frame/Layer/RIPng/v1.pm  view on Meta::CPAN

=item B<getPayloadLength>

=item B<print>

=item B<dump>

=back

=head1 CONSTANTS

Load them: use Net::Frame::Layer::RIPng::v1 qw(:consts);

=over 4

=item B<NF_RIPNG_METRIC_INFINITY>

Infinity metric (16).

=back

=head1 SEE ALSO

t/01-use.t  view on Meta::CPAN

use Test;
BEGIN { plan(tests => 1) }

use Net::Frame::Layer::RIPng qw(:consts);
use Net::Frame::Layer::RIPng::v1 qw(:consts);

ok(1);

t/02-pod-coverage.t  view on Meta::CPAN

eval "use Test::Pod::Coverage tests => 2";
if ($@) {
   use Test;
   plan(tests => 1);
   skip("Test::Pod::Coverage required for testing");
}
else {
   pod_coverage_ok("Net::Frame::Layer::RIPng");
   pod_coverage_ok("Net::Frame::Layer::RIPng::v1");
}

t/04-ripng.t  view on Meta::CPAN

use Test;
BEGIN { plan(tests => 1) }

use Net::Frame::Layer::RIPng qw(:consts);

my $l = Net::Frame::Layer::RIPng->new;
$l->pack;
$l->unpack;

print $l->print."\n";

my $encap = $l->encapsulate;
$encap ? print "[$encap]\n" : print "[none]\n";

ok(1);

t/05-ripngv1.t  view on Meta::CPAN

use Test;
BEGIN { plan(tests => 1) }

use Net::Frame::Layer::RIPng::v1 qw(:consts);

my $l = Net::Frame::Layer::RIPng::v1->new;
$l->pack;
$l->unpack;

print $l->print."\n";

my $encap = $l->encapsulate;
$encap ? print "[$encap]\n" : print "[none]\n";

ok(1);

t/07-ripngvx.t  view on Meta::CPAN

use Test;
BEGIN { plan(tests => 4) }

use strict;
use warnings;

use Net::Frame::Layer::RIPng qw(:consts);

my ($ripng, $expectedOutput);

# RIPng new
$ripng = Net::Frame::Layer::RIPng::v1->new;
$expectedOutput = 'RIPng::v1: prefix:::
RIPng::v1: routeTag:0  prefixLength:64  metric:1';
print $ripng->print . "\n";
ok($ripng->print, $expectedOutput);

$expectedOutput = '0000000000000000000000000000000000004001';
print unpack "H*", $ripng->pack;
print "\n";
ok((unpack "H*", $ripng->pack), $expectedOutput);

# RIPng full
$ripng = Net::Frame::Layer::RIPng::v1->full;
$expectedOutput = 'RIPng::v1: prefix:::
RIPng::v1: routeTag:0  prefixLength:0  metric:16';
print $ripng->print . "\n";
ok($ripng->print, $expectedOutput);

$expectedOutput = '0000000000000000000000000000000000000010';
print unpack "H*", $ripng->pack;
print "\n";
ok((unpack "H*", $ripng->pack), $expectedOutput);

t/08-ripngv1compare.t  view on Meta::CPAN


my $HAVE_NP = 0;
eval "use Net::Pcap qw(:functions)";
if(!$@) {
    $HAVE_NP = 1;
}

use Net::Frame::Layer::ETH qw(:consts);
use Net::Frame::Layer::IPv6 qw(:consts);
use Net::Frame::Layer::UDP qw(:consts);
use Net::Frame::Layer::RIPng qw(:consts);

my ($eth, $ipv6, $udp, $udpPay, $ripPay, $rip, $rte);
my %packet;

skip ($NO_HAVE_NetFrameSimple,
sub {
$eth    = Net::Frame::Layer::ETH->new(src=>'ca:00:07:a0:00:1c',dst=>NF_RIPNG_DEST_HWADDR,type=>NF_ETH_TYPE_IPv6);
$ipv6   = Net::Frame::Layer::IPv6->new(src=>'fe80::f800:da27:1691:7d0d',dst=>NF_RIPNG_DEST_ADDR,nextHeader=>0x11);
$udp    = Net::Frame::Layer::UDP->new(dst=>NF_RIPNG_DEST_PORT,src=>52001);
$udpPay = Net::Frame::Layer::UDP->new(dst=>NF_RIPNG_DEST_PORT,src=>52001,payload=>pack "H*", '010100000000000000000000000000000000000000000010');
$ripPay = Net::Frame::Layer::RIPng->new(payload=>pack "H*", '0000000000000000000000000000000000000010');
$rip    = Net::Frame::Layer::RIPng->new;
$rte    = Net::Frame::Layer::RIPng::v1->full;

$packet{'01-UDP'} = Net::Frame::Simple->new(
    layers => [ $eth, $ipv6, $udpPay ]
);

$packet{'02-Pay'} = Net::Frame::Simple->new(
    layers => [ $eth, $ipv6, $udp, $ripPay ]
);

$packet{'03-Rte'}  = Net::Frame::Simple->new(

t/08-ripngv1compare.t  view on Meta::CPAN

sub {
(unpack "H*", $packet{'01-UDP'}->pack) eq (unpack "H*", $packet{'03-Rte'}->pack);
});

skip ($NO_HAVE_NetFrameSimple,
sub {
$eth    = Net::Frame::Layer::ETH->new(src=>'ca:00:07:a0:00:1c',dst=>NF_RIPNG_DEST_HWADDR,type=>NF_ETH_TYPE_IPv6);
$ipv6   = Net::Frame::Layer::IPv6->new(src=>'fe80::f800:da27:1691:7d0d',dst=>NF_RIPNG_DEST_ADDR,nextHeader=>0x11);
$udp    = Net::Frame::Layer::UDP->new(dst=>NF_RIPNG_DEST_PORT,src=>52001);
$udpPay = Net::Frame::Layer::UDP->new(dst=>NF_RIPNG_DEST_PORT,src=>52001,payload=>pack "H*", '0201000020010db8deadbeef000000000000000000004001');
$ripPay = Net::Frame::Layer::RIPng->new(command=>NF_RIPNG_COMMAND_RESPONSE,payload=>pack "H*", '20010db8deadbeef000000000000000000004001');
$rip    = Net::Frame::Layer::RIPng->new(command=>NF_RIPNG_COMMAND_RESPONSE);
$rte    = Net::Frame::Layer::RIPng::v1->new(prefix=>'2001:db8:dead:beef::');

$packet{'04-UDP'} = Net::Frame::Simple->new(
    layers => [ $eth, $ipv6, $udpPay ]
);

$packet{'05-Pay'} = Net::Frame::Simple->new(
    layers => [ $eth, $ipv6, $udp, $ripPay ]
);

$packet{'06-Rte'}  = Net::Frame::Simple->new(

t/10-ripngv1decode.t  view on Meta::CPAN


my $NO_HAVE_NetFrameSimple = 0;
eval "use Net::Frame::Simple 1.05";
if($@) {
    $NO_HAVE_NetFrameSimple = "Net::Frame::Simple 1.05 required";
}

use Net::Frame::Layer::ETH qw(:consts);
use Net::Frame::Layer::IPv6 qw(:consts);
use Net::Frame::Layer::UDP qw(:consts);
use Net::Frame::Layer::RIPng qw(:consts);

my ($packet, $decode, $expectedOutput);

skip ($NO_HAVE_NetFrameSimple,
sub {
$packet = pack "H*", "33330000000902004c4f4f5086dd60000000002011fffe80000000000000f800da2716917d0dff02000000000000000000000000000904cf020900209471010100000000000000000000000000000000000000000010";

$decode = Net::Frame::Simple->new(
    raw => $packet,
    firstLayer => 'ETH'
);

$expectedOutput = 'ETH: dst:33:33:00:00:00:09  src:02:00:4c:4f:4f:50  type:0x86dd
IPv6: version:6  trafficClass:0x00  flowLabel:0x00000  nextHeader:0x11
IPv6: payloadLength:32  hopLimit:255
IPv6: src:fe80::f800:da27:1691:7d0d  dst:ff02::9
UDP: src:1231  dst:521  length:32  checksum:0x9471
RIPng: command:1  version:1  reserved:0
RIPng::v1: prefix:::
RIPng::v1: routeTag:0  prefixLength:0  metric:16';

print $decode->print;
print "\n";

$decode->print eq $expectedOutput;
});

skip ($NO_HAVE_NetFrameSimple,
sub {
$packet = pack "H*", "33330000000902004c4f4f5086dd60000000002011fffe80000000000000f800da2716917d0dff0200000000000000000000000000090209020900208aef0201000020010db8deadbeef000000000000000000004001";

t/10-ripngv1decode.t  view on Meta::CPAN

$decode = Net::Frame::Simple->new(
    raw => $packet,
    firstLayer => 'ETH'
);

$expectedOutput = 'ETH: dst:33:33:00:00:00:09  src:02:00:4c:4f:4f:50  type:0x86dd
IPv6: version:6  trafficClass:0x00  flowLabel:0x00000  nextHeader:0x11
IPv6: payloadLength:32  hopLimit:255
IPv6: src:fe80::f800:da27:1691:7d0d  dst:ff02::9
UDP: src:521  dst:521  length:32  checksum:0x8aef
RIPng: command:2  version:1  reserved:0
RIPng::v1: prefix:2001:db8:dead:beef::
RIPng::v1: routeTag:0  prefixLength:64  metric:1';

print $decode->print;
print "\n";

$decode->print eq $expectedOutput;
});



( run in 0.447 second using v1.01-cache-2.11-cpan-0a6323c29d9 )