view release on metacpan or search on metacpan
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
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
--- #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,
},
);
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
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;
});