File Coverage

blib/lib/Net/Frame/Layer/IPv6.pm
Criterion Covered Total %
statement 181 224 80.8
branch 0 14 0.0
condition n/a
subroutine 61 68 89.7
pod 7 7 100.0
total 249 313 79.5


line stmt bran cond sub pod time code
1             #
2             # $Id: IPv6.pm,v ee9a7f696b4d 2017/05/07 12:55:21 gomor $
3             #
4             package Net::Frame::Layer::IPv6;
5 2     2   8048 use strict;
  2         4  
  2         47  
6 2     2   10 use warnings;
  2         4  
  2         70  
7              
8             our $VERSION = '1.08';
9              
10 2     2   764 use Net::Frame::Layer qw(:consts :subs);
  2         100792  
  2         620  
11             require Exporter;
12             our @ISA = qw(Net::Frame::Layer Exporter);
13              
14             our %EXPORT_TAGS = (
15             consts => [qw(
16             NF_IPv6_HDR_LEN
17             NF_IPv6_PROTOCOL_ICMPv4
18             NF_IPv6_PROTOCOL_IGMP
19             NF_IPv6_PROTOCOL_IPIP
20             NF_IPv6_PROTOCOL_TCP
21             NF_IPv6_PROTOCOL_EGP
22             NF_IPv6_PROTOCOL_IGRP
23             NF_IPv6_PROTOCOL_CHAOS
24             NF_IPv6_PROTOCOL_UDP
25             NF_IPv6_PROTOCOL_IDP
26             NF_IPv6_PROTOCOL_DCCP
27             NF_IPv6_PROTOCOL_IPv6
28             NF_IPv6_PROTOCOL_IPv6ROUTING
29             NF_IPv6_PROTOCOL_IPv6FRAGMENT
30             NF_IPv6_PROTOCOL_IDRP
31             NF_IPv6_PROTOCOL_RSVP
32             NF_IPv6_PROTOCOL_GRE
33             NF_IPv6_PROTOCOL_ESP
34             NF_IPv6_PROTOCOL_AH
35             NF_IPv6_PROTOCOL_ICMPv6
36             NF_IPv6_PROTOCOL_EIGRP
37             NF_IPv6_PROTOCOL_OSPF
38             NF_IPv6_PROTOCOL_ETHERIP
39             NF_IPv6_PROTOCOL_PIM
40             NF_IPv6_PROTOCOL_VRRP
41             NF_IPv6_PROTOCOL_STP
42             NF_IPv6_PROTOCOL_SCTP
43             NF_IPv6_PROTOCOL_UDPLITE
44             NF_IPv6_PROTOCOL_IPv6HOPBYHOP
45             NF_IPv6_PROTOCOL_GGP
46             NF_IPv6_PROTOCOL_ST
47             NF_IPv6_PROTOCOL_CBT
48             NF_IPv6_PROTOCOL_PUP
49             NF_IPv6_PROTOCOL_ARGUS
50             NF_IPv6_PROTOCOL_EMCON
51             NF_IPv6_PROTOCOL_XNET
52             NF_IPv6_PROTOCOL_MUX
53             NF_IPv6_PROTOCOL_DCNMEAS
54             NF_IPv6_PROTOCOL_HMP
55             NF_IPv6_PROTOCOL_PRM
56             NF_IPv6_PROTOCOL_TRUNK1
57             NF_IPv6_PROTOCOL_TRUNK2
58             NF_IPv6_PROTOCOL_LEAF1
59             NF_IPv6_PROTOCOL_LEAF2
60             NF_IPv6_PROTOCOL_3PC
61             NF_IPv6_PROTOCOL_IDPR
62             NF_IPv6_PROTOCOL_XTP
63             NF_IPv6_PROTOCOL_DDP
64             NF_IPv6_PROTOCOL_IDPRCMTP
65             NF_IPv6_PROTOCOL_TPPLUSPLUS
66             NF_IPv6_PROTOCOL_IL
67             NF_IPv6_PROTOCOL_SDRP
68             NF_IPv6_PROTOCOL_IPv6NONEXT
69             NF_IPv6_PROTOCOL_IPv6DESTINATION
70             NF_IPv6_PROTOCOL_IPv6MOBILITY
71             )],
72             );
73             our @EXPORT_OK = (
74             @{$EXPORT_TAGS{consts}},
75             );
76              
77             #
78             # http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xml
79             #
80 2     2   21 use constant NF_IPv6_HDR_LEN => 40;
  2         6  
  2         114  
81 2     2   12 use constant NF_IPv6_PROTOCOL_IPv6HOPBYHOP => 0x00;
  2         4  
  2         127  
82 2     2   12 use constant NF_IPv6_PROTOCOL_ICMPv4 => 0x01;
  2         3  
  2         75  
83 2     2   9 use constant NF_IPv6_PROTOCOL_IGMP => 0x02;
  2         4  
  2         63  
84 2     2   10 use constant NF_IPv6_PROTOCOL_GGP => 0x03;
  2         8  
  2         85  
85 2     2   10 use constant NF_IPv6_PROTOCOL_IPIP => 0x04;
  2         8  
  2         69  
86 2     2   15 use constant NF_IPv6_PROTOCOL_ST => 0x05;
  2         5  
  2         64  
87 2     2   10 use constant NF_IPv6_PROTOCOL_TCP => 0x06;
  2         2  
  2         79  
88 2     2   11 use constant NF_IPv6_PROTOCOL_CBT => 0x07;
  2         6  
  2         87  
89 2     2   9 use constant NF_IPv6_PROTOCOL_EGP => 0x08;
  2         5  
  2         74  
90 2     2   11 use constant NF_IPv6_PROTOCOL_IGRP => 0x09;
  2         4  
  2         67  
91 2     2   10 use constant NF_IPv6_PROTOCOL_PUP => 0x0c;
  2         3  
  2         68  
92 2     2   10 use constant NF_IPv6_PROTOCOL_ARGUS => 0x0d;
  2         3  
  2         68  
93 2     2   9 use constant NF_IPv6_PROTOCOL_EMCON => 0x0e;
  2         4  
  2         59  
94 2     2   9 use constant NF_IPv6_PROTOCOL_XNET => 0x0f;
  2         3  
  2         66  
95 2     2   9 use constant NF_IPv6_PROTOCOL_CHAOS => 0x10;
  2         3  
  2         67  
96 2     2   9 use constant NF_IPv6_PROTOCOL_UDP => 0x11;
  2         5  
  2         67  
97 2     2   9 use constant NF_IPv6_PROTOCOL_MUX => 0x12;
  2         4  
  2         68  
98 2     2   8 use constant NF_IPv6_PROTOCOL_DCNMEAS => 0x13;
  2         4  
  2         64  
99 2     2   9 use constant NF_IPv6_PROTOCOL_HMP => 0x14;
  2         4  
  2         64  
100 2     2   8 use constant NF_IPv6_PROTOCOL_PRM => 0x15;
  2         4  
  2         69  
101 2     2   9 use constant NF_IPv6_PROTOCOL_IDP => 0x16;
  2         3  
  2         59  
102 2     2   9 use constant NF_IPv6_PROTOCOL_TRUNK1 => 0x17;
  2         4  
  2         68  
103 2     2   9 use constant NF_IPv6_PROTOCOL_TRUNK2 => 0x18;
  2         4  
  2         69  
104 2     2   12 use constant NF_IPv6_PROTOCOL_LEAF1 => 0x19;
  2         5  
  2         71  
105 2     2   9 use constant NF_IPv6_PROTOCOL_LEAF2 => 0x20;
  2         4  
  2         78  
106 2     2   13 use constant NF_IPv6_PROTOCOL_DCCP => 0x21;
  2         4  
  2         72  
107 2     2   8 use constant NF_IPv6_PROTOCOL_3PC => 0x22;
  2         8  
  2         66  
108 2     2   10 use constant NF_IPv6_PROTOCOL_IDPR => 0x23;
  2         2  
  2         64  
109 2     2   9 use constant NF_IPv6_PROTOCOL_XTP => 0x24;
  2         4  
  2         73  
110 2     2   9 use constant NF_IPv6_PROTOCOL_DDP => 0x25;
  2         4  
  2         59  
111 2     2   9 use constant NF_IPv6_PROTOCOL_IDPRCMTP => 0x26;
  2         11  
  2         64  
112 2     2   9 use constant NF_IPv6_PROTOCOL_TPPLUSPLUS => 0x27;
  2         4  
  2         69  
113 2     2   9 use constant NF_IPv6_PROTOCOL_IL => 0x28;
  2         4  
  2         59  
114 2     2   13 use constant NF_IPv6_PROTOCOL_IPv6 => 0x29;
  2         4  
  2         70  
115 2     2   10 use constant NF_IPv6_PROTOCOL_SDRP => 0x2a;
  2         3  
  2         77  
116 2     2   10 use constant NF_IPv6_PROTOCOL_IPv6ROUTING => 0x2b;
  2         4  
  2         64  
117 2     2   9 use constant NF_IPv6_PROTOCOL_IPv6FRAGMENT => 0x2c;
  2         4  
  2         70  
118 2     2   8 use constant NF_IPv6_PROTOCOL_IDRP => 0x2d;
  2         4  
  2         60  
119 2     2   8 use constant NF_IPv6_PROTOCOL_RSVP => 0x2e;
  2         4  
  2         64  
120 2     2   10 use constant NF_IPv6_PROTOCOL_GRE => 0x2f;
  2         3  
  2         69  
121 2     2   9 use constant NF_IPv6_PROTOCOL_ESP => 0x32;
  2         4  
  2         59  
122 2     2   12 use constant NF_IPv6_PROTOCOL_AH => 0x33;
  2         5  
  2         67  
123 2     2   9 use constant NF_IPv6_PROTOCOL_ICMPv6 => 0x3a;
  2         3  
  2         90  
124 2     2   11 use constant NF_IPv6_PROTOCOL_IPv6NONEXT => 0x3b;
  2         4  
  2         67  
125 2     2   9 use constant NF_IPv6_PROTOCOL_IPv6DESTINATION => 0x3c;
  2         3  
  2         71  
126 2     2   8 use constant NF_IPv6_PROTOCOL_EIGRP => 0x58;
  2         4  
  2         62  
127 2     2   9 use constant NF_IPv6_PROTOCOL_OSPF => 0x59;
  2         4  
  2         62  
128 2     2   9 use constant NF_IPv6_PROTOCOL_ETHERIP => 0x61;
  2         4  
  2         64  
129 2     2   12 use constant NF_IPv6_PROTOCOL_PIM => 0x67;
  2         4  
  2         63  
130 2     2   8 use constant NF_IPv6_PROTOCOL_VRRP => 0x70;
  2         8  
  2         62  
131 2     2   10 use constant NF_IPv6_PROTOCOL_STP => 0x76;
  2         2  
  2         64  
132 2     2   10 use constant NF_IPv6_PROTOCOL_SCTP => 0x84;
  2         3  
  2         64  
133 2     2   8 use constant NF_IPv6_PROTOCOL_IPv6MOBILITY => 0x87;
  2         4  
  2         64  
134 2     2   9 use constant NF_IPv6_PROTOCOL_UDPLITE => 0x88;
  2         4  
  2         146  
135              
136             our @AS = qw(
137             version
138             trafficClass
139             flowLabel
140             nextHeader
141             payloadLength
142             hopLimit
143             src
144             dst
145             );
146             __PACKAGE__->cgBuildIndices;
147             __PACKAGE__->cgBuildAccessorsScalar(\@AS);
148              
149             BEGIN {
150 2     2   33 *protocol = \&nextHeader;
151             }
152              
153 2     2   9 no strict 'vars';
  2         3  
  2         60  
154              
155 2     2   912 use Bit::Vector;
  2         1511  
  2         1459  
156              
157             sub new {
158             shift->SUPER::new(
159 0     0 1   version => 6,
160             trafficClass => 0,
161             flowLabel => 0,
162             nextHeader => NF_IPv6_PROTOCOL_TCP,
163             hopLimit => 0xff,
164             src => '::1',
165             dst => '::1',
166             payloadLength => 0,
167             @_,
168             );
169             }
170              
171 0     0 1   sub getLength { NF_IPv6_HDR_LEN }
172              
173             sub computeLengths {
174 0     0 1   my $self = shift;
175 0           my ($layers) = @_;
176              
177 0           my $len = 0;
178 0           my $last;
179             my $start;
180 0           for my $l (@$layers) {
181 0 0         if (! $start) {
182 0 0         $start++ if $l->layer eq 'IPv6';
183 0           next;
184             }
185 0           $len += $l->getLength;
186 0           $last = $l;
187             }
188 0 0         if (defined($last->payload)) {
189 0           $len += length($last->payload);
190             }
191              
192 0           $self->payloadLength($len);
193              
194 0           return 1;
195             }
196              
197             sub pack {
198 0     0 1   my $self = shift;
199              
200 0           my $version = Bit::Vector->new_Dec(4, $self->[$__version]);
201 0           my $trafficClass = Bit::Vector->new_Dec(8, $self->[$__trafficClass]);
202 0           my $flowLabel = Bit::Vector->new_Dec(20, $self->[$__flowLabel]);
203 0           my $v32 = $version->Concat_List($trafficClass, $flowLabel);
204              
205 0 0         $self->[$__raw] = $self->SUPER::pack('NnCCa*a*',
206             $v32->to_Dec,
207             $self->[$__payloadLength],
208             $self->[$__nextHeader],
209             $self->[$__hopLimit],
210             inet6Aton($self->[$__src]),
211             inet6Aton($self->[$__dst]),
212             ) or return undef;
213              
214 0           $self->raw;
215             }
216              
217             sub unpack {
218 0     0 1   my $self = shift;
219              
220 0 0         my ($vTcFl, $pl, $nh, $hl, $sa, $da, $payload) =
221             $self->SUPER::unpack('NnCCa16a16 a*', $self->[$__raw])
222             or return undef;
223              
224 0           my $v32 = Bit::Vector->new_Dec(32, $vTcFl);
225              
226 0           $self->[$__flowLabel] = $v32->Chunk_Read(20, 0);
227 0           $self->[$__trafficClass] = $v32->Chunk_Read( 8, 20);
228 0           $self->[$__version] = $v32->Chunk_Read( 4, 28);
229 0           $self->[$__payloadLength] = $pl;
230 0           $self->[$__nextHeader] = $nh;
231 0           $self->[$__hopLimit] = $hl;
232 0           $self->[$__src] = inet6Ntoa($sa);
233 0           $self->[$__dst] = inet6Ntoa($da);
234              
235 0           $self->[$__payload] = $payload;
236              
237 0           $self;
238             }
239              
240             sub encapsulate {
241 0     0 1   my $self = shift;
242              
243 0 0         return $self->[$__nextLayer] if $self->[$__nextLayer];
244              
245 0           my $types = {
246             NF_IPv6_PROTOCOL_ICMPv4() => 'ICMPv4',
247             NF_IPv6_PROTOCOL_IGMP() => 'IGMP',
248             NF_IPv6_PROTOCOL_IPIP() => 'IPv4',
249             NF_IPv6_PROTOCOL_TCP() => 'TCP',
250             NF_IPv6_PROTOCOL_EGP() => 'EGP',
251             NF_IPv6_PROTOCOL_IGRP() => 'IGRP',
252             NF_IPv6_PROTOCOL_CHAOS() => 'CHAOS',
253             NF_IPv6_PROTOCOL_UDP() => 'UDP',
254             NF_IPv6_PROTOCOL_IDP() => 'IDP',
255             NF_IPv6_PROTOCOL_DCCP() => 'DCCP',
256             NF_IPv6_PROTOCOL_IPv6() => 'IPv6',
257             NF_IPv6_PROTOCOL_IPv6ROUTING() => 'IPv6::Routing',
258             NF_IPv6_PROTOCOL_IPv6FRAGMENT() => 'IPv6::Fragment',
259             NF_IPv6_PROTOCOL_IDRP() => 'IDRP',
260             NF_IPv6_PROTOCOL_RSVP() => 'RSVP',
261             NF_IPv6_PROTOCOL_GRE() => 'GRE',
262             NF_IPv6_PROTOCOL_ESP() => 'ESP',
263             NF_IPv6_PROTOCOL_AH() => 'AH',
264             NF_IPv6_PROTOCOL_ICMPv6() => 'ICMPv6',
265             NF_IPv6_PROTOCOL_EIGRP() => 'EIGRP',
266             NF_IPv6_PROTOCOL_OSPF() => 'OSPF',
267             NF_IPv6_PROTOCOL_ETHERIP() => 'ETHERIP',
268             NF_IPv6_PROTOCOL_PIM() => 'PIM',
269             NF_IPv6_PROTOCOL_VRRP() => 'VRRP',
270             NF_IPv6_PROTOCOL_STP() => 'STP',
271             NF_IPv6_PROTOCOL_SCTP() => 'SCTP',
272             NF_IPv6_PROTOCOL_UDPLITE() => 'UDPLite',
273             NF_IPv6_PROTOCOL_IPv6DESTINATION() => 'IPv6::Destination',
274             NF_IPv6_PROTOCOL_IPv6MOBILITY() => 'IPv6::Mobility',
275             NF_IPv6_PROTOCOL_IPv6HOPBYHOP() => 'IPv6::HopByHop',
276             NF_IPv6_PROTOCOL_GGP() => 'GGP',
277             NF_IPv6_PROTOCOL_ST() => 'ST',
278             NF_IPv6_PROTOCOL_CBT() => 'CBT',
279             NF_IPv6_PROTOCOL_PUP() => 'PUP',
280             NF_IPv6_PROTOCOL_ARGUS() => 'ARGUS',
281             NF_IPv6_PROTOCOL_EMCON() => 'EMCON',
282             NF_IPv6_PROTOCOL_XNET() => 'XNET',
283             NF_IPv6_PROTOCOL_MUX() => 'MUX',
284             NF_IPv6_PROTOCOL_DCNMEAS() => 'DCNMEAS',
285             NF_IPv6_PROTOCOL_HMP() => 'HMP',
286             NF_IPv6_PROTOCOL_PRM() => 'PRM',
287             NF_IPv6_PROTOCOL_TRUNK1() => 'TRUNK1',
288             NF_IPv6_PROTOCOL_TRUNK2() => 'TRUNK2',
289             NF_IPv6_PROTOCOL_LEAF1() => 'LEAF1',
290             NF_IPv6_PROTOCOL_LEAF2() => 'LEAF2',
291             NF_IPv6_PROTOCOL_3PC() => '3PC',
292             NF_IPv6_PROTOCOL_IDPR() => 'IDPR',
293             NF_IPv6_PROTOCOL_XTP() => 'XTP',
294             NF_IPv6_PROTOCOL_DDP() => 'DDP',
295             NF_IPv6_PROTOCOL_IDPRCMTP() => 'IDPRCMTP',
296             NF_IPv6_PROTOCOL_TPPLUSPLUS() => 'TPPlusPlus',
297             NF_IPv6_PROTOCOL_IL() => 'IL',
298             NF_IPv6_PROTOCOL_SDRP() => 'SDRP',
299             NF_IPv6_PROTOCOL_IPv6NONEXT() => 'IPv6::NoNext',
300             };
301              
302 0 0         $types->{$self->[$__nextHeader]} || NF_LAYER_UNKNOWN;
303             }
304              
305             sub print {
306 0     0 1   my $self = shift;
307              
308 0           my $l = $self->layer;
309 0           sprintf
310             "$l: version:%d trafficClass:0x%02x flowLabel:0x%05x ".
311             "nextHeader:0x%02x\n".
312             "$l: payloadLength:%d hopLimit:%d\n".
313             "$l: src:%s dst:%s",
314             $self->[$__version], $self->[$__trafficClass], $self->[$__flowLabel],
315             $self->[$__nextHeader], $self->[$__payloadLength],
316             $self->[$__hopLimit], $self->[$__src], $self->[$__dst];
317             }
318              
319             1;
320              
321             =head1 NAME
322              
323             Net::Frame::Layer::IPv6 - Internet Protocol v6 layer object
324              
325             =head1 SYNOPSIS
326              
327             use Net::Frame::Layer::IPv6 qw(:consts);
328              
329             # Build a layer
330             my $layer = Net::Frame::Layer::IPv6->new(
331             version => 6,
332             trafficClass => 0,
333             flowLabel => 0,
334             nextHeader => NF_IPv6_PROTOCOL_TCP,
335             hopLimit => 0xff,
336             src => '::1',
337             dst => '::1',
338             payloadLength => 0,
339             );
340             $layer->pack;
341              
342             print 'RAW: '.$layer->dump."\n";
343              
344             # Read a raw layer
345             my $layer = Net::Frame::Layer::IPv6->new(raw = $raw);
346              
347             print $layer->print."\n";
348             print 'PAYLOAD: '.unpack('H*', $layer->payload)."\n"
349             if $layer->payload;
350              
351             =head1 DESCRIPTION
352              
353             This modules implements the encoding and decoding of the IPv6 layer.
354              
355             RFC: ftp://ftp.rfc-editor.org/in-notes/rfc2460.txt
356              
357             See also B for other attributes and methods.
358              
359             =head1 ATTRIBUTES
360              
361             =over 4
362              
363             =item B - 4 bits
364              
365             Version of Internet Protocol header.
366              
367             =item B - 8 bits
368              
369             Traffic class field. Was Type of Service in IPv4.
370              
371             =item B - 20 bits
372              
373             Flow label class field. Was IP ID in IPv4.
374              
375             =item B - 8 bits
376              
377             The type of next header. Was protocol in IPv4.
378              
379             =item B
380              
381             Is an alias for B.
382              
383             =item B - 16 bits
384              
385             Length in bytes of encapsulated layers (usually, that is layer 4 + layer 7).
386              
387             =item B - 8 bits
388              
389             Was TTL field in IPv4.
390              
391             =item B - 32 bits
392              
393             =item B - 32 bits
394              
395             Source and destination addresses.
396              
397             =back
398              
399             The following are inherited attributes. See B for more information.
400              
401             =over 4
402              
403             =item B
404              
405             =item B
406              
407             =item B
408              
409             =back
410              
411             =head1 METHODS
412              
413             =over 4
414              
415             =item B
416              
417             =item B (hash)
418              
419             Object constructor. You can pass attributes that will overwrite default ones. See B for default values.
420              
421             =item B ({ payloadLength => VALUE })
422              
423             In order to compute lengths attributes within IPv6 header, you need to pass via a hashref the number of bytes contained in IPv6 payload (that is, the sum of all layers after the IPv6 one).
424              
425             =back
426              
427             The following are inherited methods. Some of them may be overridden in this layer, and some others may not be meaningful in this layer. See B for more information.
428              
429             =over 4
430              
431             =item B
432              
433             =item B
434              
435             =item B
436              
437             =item B
438              
439             =item B
440              
441             =item B
442              
443             =item B
444              
445             =item B
446              
447             =back
448              
449             =head1 CONSTANTS
450              
451             Load them: use Net::Frame::Layer::IPv6 qw(:consts);
452              
453             =over 4
454              
455             =item B
456              
457             =item B
458              
459             =item B
460              
461             =item B
462              
463             =item B
464              
465             =item B
466              
467             =item B
468              
469             =item B
470              
471             =item B
472              
473             =item B
474              
475             =item B
476              
477             =item B
478              
479             =item B
480              
481             =item B
482              
483             =item B
484              
485             =item B
486              
487             =item B
488              
489             =item B
490              
491             =item B
492              
493             =item B
494              
495             =item B
496              
497             =item B
498              
499             =item B
500              
501             =item B
502              
503             =item B
504              
505             =item B
506              
507             =item B
508              
509             =item B
510              
511             =item B
512              
513             =item B
514              
515             =item B
516              
517             =item B
518              
519             =item B
520              
521             =item B
522              
523             =item B
524              
525             =item B
526              
527             =item B
528              
529             =item B
530              
531             =item B
532              
533             =item B
534              
535             =item B
536              
537             =item B
538              
539             =item B
540              
541             =item B
542              
543             =item B
544              
545             =item B
546              
547             =item B
548              
549             =item B
550              
551             =item B
552              
553             =item B
554              
555             =item B
556              
557             =item B
558              
559             =item B
560              
561             =item B
562              
563             Constants for B attribute.
564              
565             =back
566              
567             =head1 SEE ALSO
568              
569             L
570              
571             =head1 AUTHOR
572              
573             Patrice EGomoRE Auffret
574              
575             =head1 COPYRIGHT AND LICENSE
576              
577             Copyright (c) 2006-2017, Patrice EGomoRE Auffret
578              
579             You may distribute this module under the terms of the Artistic license.
580             See LICENSE.Artistic file in the source distribution archive.
581              
582             =cut