File Coverage

blib/lib/Net/Frame/Layer/IGMP/v3Query.pm
Criterion Covered Total %
statement 47 56 83.9
branch 4 10 40.0
condition 1 6 16.6
subroutine 10 11 90.9
pod 7 7 100.0
total 69 90 76.6


line stmt bran cond sub pod time code
1             #
2             # $Id: v3Query.pm 49 2009-05-31 13:15:34Z VinsWorldcom $
3             #
4             package Net::Frame::Layer::IGMP::v3Query;
5 6     6   7478 use strict; use warnings;
  6     6   12  
  6         239  
  6         31  
  6         10  
  6         221  
6              
7 6     6   936 use Net::Frame::Layer qw(:consts :subs);
  6         92772  
  6         2087  
8             our @ISA = qw(Net::Frame::Layer);
9              
10             our @AS = qw(
11             resv
12             sFlag
13             qrv
14             qqic
15             numSources
16             );
17             our @AA = qw(
18             sourceAddress
19             );
20             __PACKAGE__->cgBuildIndices;
21             __PACKAGE__->cgBuildAccessorsScalar(\@AS);
22             __PACKAGE__->cgBuildAccessorsArray(\@AA);
23              
24             #no strict 'vars';
25              
26 6     6   5245 use Bit::Vector;
  6         14251  
  6         4897  
27              
28             sub new {
29             shift->SUPER::new(
30 2     2 1 331 resv => 0,
31             sFlag => 0,
32             qrv => 2,
33             qqic => 125,
34             numSources => 0,
35             sourceAddress => [],
36             @_,
37             );
38             }
39              
40             sub getLength {
41 0     0 1 0 my $self = shift;
42 0         0 my $len = 4;
43 0         0 $len += 4 for $self->sourceAddress;
44 0         0 return $len;
45             }
46              
47             sub pack {
48 1     1 1 270 my $self = shift;
49              
50 1         5 my $resv = Bit::Vector->new_Dec(4, $self->resv);
51 1         60 my $sFlag = Bit::Vector->new_Dec(1, $self->sFlag);
52 1         16 my $qqic = Bit::Vector->new_Dec(3, $self->qrv);
53 1         21 my $bvlist = $resv->Concat_List($sFlag, $qqic);
54              
55 1 50       12 my $raw = $self->SUPER::pack('CCn',
56             $bvlist->to_Dec,
57             $self->qqic,
58             $self->numSources
59             ) or return;
60              
61 1         38 for ($self->sourceAddress) {
62 0         0 $raw .= inetAton($_);
63             }
64              
65 1         25 return $self->raw($raw);
66             }
67              
68             sub unpack {
69 1     1 1 22 my $self = shift;
70              
71 1 50       3 my ($bv, $qqic, $numSources, $payload) =
72             $self->SUPER::unpack('CCn a*', $self->raw)
73             or return;
74              
75 1         31 my $bvlist = Bit::Vector->new_Dec(8, $bv);
76 1         22 $self->resv ($bvlist->Chunk_Read(4, 4));
77 1         14 $self->sFlag ($bvlist->Chunk_Read(1, 3));
78 1         13 $self->qrv ($bvlist->Chunk_Read(3, 0));
79              
80 1         10 $self->qqic($qqic);
81 1         9 $self->numSources($numSources);
82              
83 1         8 my @sourceAddress = ();
84 1         4 for my $num (0..$numSources-1) {
85 0 0 0     0 if (defined($payload) && (length($payload) >= 4)) {
86 0         0 my $addr = unpack 'a4', $payload;
87 0         0 push @sourceAddress, inetNtoa($addr);
88 0         0 $payload = substr $payload, 4;
89             }
90             }
91 1         4 $self->sourceAddress(\@sourceAddress);
92              
93 1         15 $self->payload($payload);
94              
95 1         11 return $self;
96             }
97              
98             sub encapsulate {
99 1     1 1 7 my $self = shift;
100              
101 1 50       7 return $self->nextLayer if $self->nextLayer;
102              
103 1         21 NF_LAYER_NONE;
104             }
105              
106             sub computeLengths {
107 1     1 1 225 my $self = shift;
108              
109             # Calculate numSources from sourceAddress array items
110 1 50 33     5 if (scalar($self->sourceAddress) && ($self->numSources == 0)) {
111 1         120 $self->numSources(scalar($self->sourceAddress))
112             }
113              
114 1         22 return 1;
115             }
116              
117             sub print {
118 3     3 1 14 my $self = shift;
119              
120 3         17 my $l = $self->layer;
121 3         34 my $buf = sprintf
122             "$l: resv:%d sFlag:%d qrv:%d qqic:%d numSources:%d",
123             $self->resv, $self->sFlag, $self->qrv, $self->qqic, $self->numSources;
124              
125 3         134 for ($self->sourceAddress) {
126 2         28 $buf .= sprintf
127             "\n$l: sourceAddress:%s",
128             $_
129             }
130              
131 3         560 return $buf;
132             }
133              
134             1;
135              
136             __END__