File Coverage

blib/lib/Net/Frame/Layer/ICMPv6/NeighborSolicitation.pm
Criterion Covered Total %
statement 24 48 50.0
branch 3 6 50.0
condition 1 6 16.6
subroutine 7 11 63.6
pod 6 6 100.0
total 41 77 53.2


line stmt bran cond sub pod time code
1             #
2             # $Id: NeighborSolicitation.pm,v bc01789674fd 2019/05/23 05:51:45 gomor $
3             #
4             package Net::Frame::Layer::ICMPv6::NeighborSolicitation;
5 2     2   885 use strict; use warnings;
  2     2   4  
  2         61  
  2         9  
  2         3  
  2         54  
6              
7 2     2   25 use Net::Frame::Layer qw(:consts :subs);
  2         3  
  2         386  
8             our @ISA = qw(Net::Frame::Layer);
9              
10             our @AS = qw(
11             reserved
12             targetAddress
13             );
14             our @AA = qw(
15             options
16             );
17             __PACKAGE__->cgBuildIndices;
18             __PACKAGE__->cgBuildAccessorsScalar(\@AS);
19             __PACKAGE__->cgBuildAccessorsArray (\@AA);
20              
21 2     2   13 use Net::Frame::Layer::ICMPv6::Option;
  2         19  
  2         989  
22              
23             sub new {
24             shift->SUPER::new(
25 1     1 1 15 reserved => 0,
26             targetAddress => '::1',
27             options => [],
28             @_,
29             );
30             }
31              
32             sub getOptionsLength {
33 0     0 1 0 my $self = shift;
34 0         0 my $len = 0;
35 0         0 $len += $_->getLength for $self->options;
36 0         0 return $len;
37             }
38              
39             sub getLength {
40 0     0 1 0 my $self = shift;
41 0         0 return 20 + $self->getOptionsLength;
42             }
43              
44             sub pack {
45 1     1 1 164 my $self = shift;
46              
47 1 50       4 my $raw = $self->SUPER::pack('Na16',
48             $self->reserved, inet6Aton($self->targetAddress),
49             ) or return;
50              
51 1         48 for ($self->options) {
52 0         0 $raw .= $_->pack;
53             }
54              
55 1         22 return $self->raw($raw);
56             }
57              
58             sub _unpackOptions {
59 0     0   0 my $self = shift;
60 0         0 my ($payload) = @_;
61              
62 0         0 my @options = ();
63 0   0     0 while (defined($payload) && length($payload)) {
64 0         0 my $opt = Net::Frame::Layer::ICMPv6::Option->new(raw => $payload)->unpack;
65 0         0 push @options, $opt;
66 0         0 $payload = $opt->payload;
67 0         0 $opt->payload(undef);
68             }
69 0         0 $self->options(\@options);
70 0         0 return $payload;
71             }
72              
73             sub unpack {
74 1     1 1 12 my $self = shift;
75              
76 1 50       5 my ($reserved, $targetAddress, $payload) =
77             $self->SUPER::unpack('Na16 a*', $self->raw)
78             or return;
79              
80 1         24 $self->reserved($reserved);
81 1         10 $self->targetAddress(inet6Ntoa($targetAddress));
82              
83 1 50 33     18 if (defined($payload) && length($payload)) {
84 0         0 $payload = $self->_unpackOptions($payload);
85             }
86              
87 1         5 $self->payload($payload);
88              
89 1         12 return $self;
90             }
91              
92             sub print {
93 0     0 1   my $self = shift;
94              
95 0           my $l = $self->layer;
96 0           my $buf = sprintf "$l: reserved:%d\n".
97             "$l: targetAddress:%s",
98             $self->reserved, $self->targetAddress;
99              
100 0           for ($self->options) {
101 0           $buf .= "\n".$_->print;
102             }
103              
104 0           return $buf;
105             }
106              
107             1;
108              
109             __END__