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 )