Net-Frame-Layer-IPv6
view release on metacpan or search on metacpan
lib/Net/Frame/Layer/IPv6.pm view on Meta::CPAN
*protocol = \&nextHeader;
}
no strict 'vars';
use Bit::Vector;
sub new {
shift->SUPER::new(
version => 6,
trafficClass => 0,
flowLabel => 0,
nextHeader => NF_IPv6_PROTOCOL_TCP,
hopLimit => 0xff,
src => '::1',
dst => '::1',
payloadLength => 0,
@_,
);
}
sub getLength { NF_IPv6_HDR_LEN }
sub computeLengths {
my $self = shift;
my ($layers) = @_;
my $len = 0;
my $last;
my $start;
for my $l (@$layers) {
if (! $start) {
$start++ if $l->layer eq 'IPv6';
next;
}
$len += $l->getLength;
$last = $l;
}
if (defined($last->payload)) {
$len += length($last->payload);
}
$self->payloadLength($len);
return 1;
}
sub pack {
my $self = shift;
my $version = Bit::Vector->new_Dec(4, $self->[$__version]);
my $trafficClass = Bit::Vector->new_Dec(8, $self->[$__trafficClass]);
my $flowLabel = Bit::Vector->new_Dec(20, $self->[$__flowLabel]);
my $v32 = $version->Concat_List($trafficClass, $flowLabel);
$self->[$__raw] = $self->SUPER::pack('NnCCa*a*',
$v32->to_Dec,
$self->[$__payloadLength],
$self->[$__nextHeader],
$self->[$__hopLimit],
inet6Aton($self->[$__src]),
inet6Aton($self->[$__dst]),
) or return undef;
$self->raw;
}
sub unpack {
my $self = shift;
my ($vTcFl, $pl, $nh, $hl, $sa, $da, $payload) =
$self->SUPER::unpack('NnCCa16a16 a*', $self->[$__raw])
or return undef;
my $v32 = Bit::Vector->new_Dec(32, $vTcFl);
$self->[$__flowLabel] = $v32->Chunk_Read(20, 0);
$self->[$__trafficClass] = $v32->Chunk_Read( 8, 20);
$self->[$__version] = $v32->Chunk_Read( 4, 28);
$self->[$__payloadLength] = $pl;
$self->[$__nextHeader] = $nh;
$self->[$__hopLimit] = $hl;
$self->[$__src] = inet6Ntoa($sa);
$self->[$__dst] = inet6Ntoa($da);
$self->[$__payload] = $payload;
$self;
}
sub encapsulate {
my $self = shift;
return $self->[$__nextLayer] if $self->[$__nextLayer];
my $types = {
NF_IPv6_PROTOCOL_ICMPv4() => 'ICMPv4',
NF_IPv6_PROTOCOL_IGMP() => 'IGMP',
NF_IPv6_PROTOCOL_IPIP() => 'IPv4',
NF_IPv6_PROTOCOL_TCP() => 'TCP',
NF_IPv6_PROTOCOL_EGP() => 'EGP',
NF_IPv6_PROTOCOL_IGRP() => 'IGRP',
NF_IPv6_PROTOCOL_CHAOS() => 'CHAOS',
NF_IPv6_PROTOCOL_UDP() => 'UDP',
NF_IPv6_PROTOCOL_IDP() => 'IDP',
NF_IPv6_PROTOCOL_DCCP() => 'DCCP',
NF_IPv6_PROTOCOL_IPv6() => 'IPv6',
NF_IPv6_PROTOCOL_IPv6ROUTING() => 'IPv6::Routing',
NF_IPv6_PROTOCOL_IPv6FRAGMENT() => 'IPv6::Fragment',
NF_IPv6_PROTOCOL_IDRP() => 'IDRP',
NF_IPv6_PROTOCOL_RSVP() => 'RSVP',
NF_IPv6_PROTOCOL_GRE() => 'GRE',
NF_IPv6_PROTOCOL_ESP() => 'ESP',
NF_IPv6_PROTOCOL_AH() => 'AH',
NF_IPv6_PROTOCOL_ICMPv6() => 'ICMPv6',
NF_IPv6_PROTOCOL_EIGRP() => 'EIGRP',
NF_IPv6_PROTOCOL_OSPF() => 'OSPF',
NF_IPv6_PROTOCOL_ETHERIP() => 'ETHERIP',
NF_IPv6_PROTOCOL_PIM() => 'PIM',
NF_IPv6_PROTOCOL_VRRP() => 'VRRP',
NF_IPv6_PROTOCOL_STP() => 'STP',
NF_IPv6_PROTOCOL_SCTP() => 'SCTP',
NF_IPv6_PROTOCOL_UDPLITE() => 'UDPLite',
NF_IPv6_PROTOCOL_IPv6DESTINATION() => 'IPv6::Destination',
NF_IPv6_PROTOCOL_IPv6MOBILITY() => 'IPv6::Mobility',
NF_IPv6_PROTOCOL_IPv6HOPBYHOP() => 'IPv6::HopByHop',
NF_IPv6_PROTOCOL_GGP() => 'GGP',
NF_IPv6_PROTOCOL_ST() => 'ST',
NF_IPv6_PROTOCOL_CBT() => 'CBT',
NF_IPv6_PROTOCOL_PUP() => 'PUP',
NF_IPv6_PROTOCOL_ARGUS() => 'ARGUS',
NF_IPv6_PROTOCOL_EMCON() => 'EMCON',
NF_IPv6_PROTOCOL_XNET() => 'XNET',
NF_IPv6_PROTOCOL_MUX() => 'MUX',
NF_IPv6_PROTOCOL_DCNMEAS() => 'DCNMEAS',
NF_IPv6_PROTOCOL_HMP() => 'HMP',
NF_IPv6_PROTOCOL_PRM() => 'PRM',
NF_IPv6_PROTOCOL_TRUNK1() => 'TRUNK1',
NF_IPv6_PROTOCOL_TRUNK2() => 'TRUNK2',
NF_IPv6_PROTOCOL_LEAF1() => 'LEAF1',
NF_IPv6_PROTOCOL_LEAF2() => 'LEAF2',
NF_IPv6_PROTOCOL_3PC() => '3PC',
NF_IPv6_PROTOCOL_IDPR() => 'IDPR',
NF_IPv6_PROTOCOL_XTP() => 'XTP',
( run in 0.603 second using v1.01-cache-2.11-cpan-df04353d9ac )