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   4631 use strict; use warnings;
  6     6   14  
  6         155  
  6         31  
  6         12  
  6         208  
6              
7 6     6   408 use Net::Frame::Layer qw(:consts :subs);
  6         51624  
  6         1197  
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   2249 use Bit::Vector;
  6         4559  
  6         2833  
27              
28             sub new {
29             shift->SUPER::new(
30 2     2 1 346 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 288 my $self = shift;
49              
50 1         4 my $resv = Bit::Vector->new_Dec(4, $self->resv);
51 1         38 my $sFlag = Bit::Vector->new_Dec(1, $self->sFlag);
52 1         14 my $qrv = Bit::Vector->new_Dec(3, $self->qrv);
53 1         20 my $bvlist = $resv->Concat_List($sFlag, $qrv);
54              
55 1 50       10 my $raw = $self->SUPER::pack('CCn',
56             $bvlist->to_Dec,
57             $self->qqic,
58             $self->numSources
59             ) or return;
60              
61 1         39 for ($self->sourceAddress) {
62 0         0 $raw .= inetAton($_);
63             }
64              
65 1         21 return $self->raw($raw);
66             }
67              
68             sub unpack {
69 1     1 1 21 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         34 my $bvlist = Bit::Vector->new_Dec(8, $bv);
76 1         10 $self->resv ($bvlist->Chunk_Read(4, 4));
77 1         14 $self->sFlag ($bvlist->Chunk_Read(1, 3));
78 1         12 $self->qrv ($bvlist->Chunk_Read(3, 0));
79              
80 1         10 $self->qqic($qqic);
81 1         10 $self->numSources($numSources);
82              
83 1         8 my @sourceAddress = ();
84 1         5 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         3 $self->sourceAddress(\@sourceAddress);
92              
93 1         14 $self->payload($payload);
94              
95 1         12 return $self;
96             }
97              
98             sub encapsulate {
99 1     1 1 9 my $self = shift;
100              
101 1 50       6 return $self->nextLayer if $self->nextLayer;
102              
103 1         17 NF_LAYER_NONE;
104             }
105              
106             sub computeLengths {
107 1     1 1 275 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         49 $self->numSources(scalar($self->sourceAddress))
112             }
113              
114 1         20 return 1;
115             }
116              
117             sub print {
118 3     3 1 16 my $self = shift;
119              
120 3         14 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         124 for ($self->sourceAddress) {
126 2         27 $buf .= sprintf
127             "\n$l: sourceAddress:%s",
128             $_
129             }
130              
131 3         361 return $buf;
132             }
133              
134             1;
135              
136             __END__