File Coverage

blib/lib/Net/Frame/Layer/MPLS/PWACH.pm
Criterion Covered Total %
statement 102 112 91.0
branch 4 20 20.0
condition n/a
subroutine 31 32 96.8
pod 6 6 100.0
total 143 170 84.1


line stmt bran cond sub pod time code
1             #
2             # $Id: PWACH.pm 49 2009-05-31 13:15:34Z VinsWorldcom $
3             #
4             package Net::Frame::Layer::MPLS::PWACH;
5 3     3   4277 use strict; use warnings;
  3     3   8  
  3         68  
  3         13  
  3         6  
  3         111  
6              
7             our $VERSION = '1.00';
8              
9 3     3   461 use Net::Frame::Layer qw(:consts :subs);
  3         54889  
  3         498  
10 3     3   22 use Exporter;
  3         5  
  3         306  
11             our @ISA = qw(Net::Frame::Layer Exporter);
12              
13             our %EXPORT_TAGS = (
14             consts => [qw(
15             NF_MPLS_PWNIBBLE_ACH
16             NF_MPLS_PWACHTYPE_RESERVED
17             NF_MPLS_PWACHTYPE_MCC
18             NF_MPLS_PWACHTYPE_SCC
19             NF_MPLS_PWACHTYPE_BFD
20             NF_MPLS_PWACHTYPE_SBFD
21             NF_MPLS_PWACHTYPE_DLM
22             NF_MPLS_PWACHTYPE_ILM
23             NF_MPLS_PWACHTYPE_DM
24             NF_MPLS_PWACHTYPE_DLMDM
25             NF_MPLS_PWACHTYPE_ILMDM
26             NF_MPLS_PWACHTYPE_IPv4
27             NF_MPLS_PWACHTYPE_TPCC
28             NF_MPLS_PWACHTYPE_TPCV
29             NF_MPLS_PWACHTYPE_PSCCT
30             NF_MPLS_PWACHTYPE_ODCV
31             NF_MPLS_PWACHTYPE_LI
32             NF_MPLS_PWACHTYPE_OAM
33             NF_MPLS_PWACHTYPE_MACOAM
34             NF_MPLS_PWACHTYPE_IPv6
35             NF_MPLS_PWACHTYPE_FAULTOAM
36             )],
37             );
38             our @EXPORT_OK = (
39             @{$EXPORT_TAGS{consts}},
40             );
41              
42 3     3   24 use constant NF_MPLS_PWNIBBLE_ACH => 1;
  3         6  
  3         141  
43              
44 3     3   15 use constant NF_MPLS_PWACHTYPE_RESERVED => 0x0000;
  3         6  
  3         117  
45 3     3   15 use constant NF_MPLS_PWACHTYPE_MCC => 0x0001;
  3         6  
  3         119  
46 3     3   14 use constant NF_MPLS_PWACHTYPE_SCC => 0x0002;
  3         11  
  3         103  
47 3     3   15 use constant NF_MPLS_PWACHTYPE_BFD => 0x0007;
  3         5  
  3         106  
48 3     3   21 use constant NF_MPLS_PWACHTYPE_SBFD => 0x0008;
  3         6  
  3         99  
49 3     3   12 use constant NF_MPLS_PWACHTYPE_DLM => 0x000a;
  3         6  
  3         104  
50 3     3   13 use constant NF_MPLS_PWACHTYPE_ILM => 0x000b;
  3         5  
  3         116  
51 3     3   21 use constant NF_MPLS_PWACHTYPE_DM => 0x000c;
  3         9  
  3         132  
52 3     3   15 use constant NF_MPLS_PWACHTYPE_DLMDM => 0x000d;
  3         5  
  3         104  
53 3     3   15 use constant NF_MPLS_PWACHTYPE_ILMDM => 0x000e;
  3         7  
  3         103  
54 3     3   13 use constant NF_MPLS_PWACHTYPE_IPv4 => 0x0021;
  3         6  
  3         103  
55 3     3   15 use constant NF_MPLS_PWACHTYPE_TPCC => 0x0022;
  3         5  
  3         104  
56 3     3   15 use constant NF_MPLS_PWACHTYPE_TPCV => 0x0023;
  3         6  
  3         96  
57 3     3   14 use constant NF_MPLS_PWACHTYPE_PSCCT => 0x0024;
  3         6  
  3         103  
58 3     3   14 use constant NF_MPLS_PWACHTYPE_ODCV => 0x0025;
  3         4  
  3         101  
59 3     3   19 use constant NF_MPLS_PWACHTYPE_LI => 0x0026;
  3         7  
  3         102  
60 3     3   17 use constant NF_MPLS_PWACHTYPE_OAM => 0x0027;
  3         17  
  3         111  
61 3     3   15 use constant NF_MPLS_PWACHTYPE_MACOAM => 0x0028;
  3         6  
  3         107  
62 3     3   17 use constant NF_MPLS_PWACHTYPE_IPv6 => 0x0057;
  3         6  
  3         100  
63 3     3   14 use constant NF_MPLS_PWACHTYPE_FAULTOAM => 0x0058;
  3         6  
  3         195  
64              
65             our @AS = qw(
66             pwNibble
67             version
68             reserved
69             channelType
70             );
71             __PACKAGE__->cgBuildIndices;
72             __PACKAGE__->cgBuildAccessorsScalar(\@AS);
73              
74             #no strict 'vars';
75 3     3   507 use Bit::Vector;
  3         832  
  3         1158  
76              
77             sub new {
78             shift->SUPER::new(
79 1     1 1 21 pwNibble => NF_MPLS_PWNIBBLE_ACH,
80             version => 0,
81             reserved => 0,
82             channelType => NF_MPLS_PWACHTYPE_IPv4,
83             @_,
84             );
85             }
86              
87 0     0 1 0 sub getLength { 4 }
88              
89             sub pack {
90 1     1 1 300 my $self = shift;
91              
92 1         4 my $pwNibble = Bit::Vector->new_Dec(4, $self->pwNibble);
93 1         42 my $version = Bit::Vector->new_Dec(4, $self->version);
94 1         19 my $bvlist = $pwNibble->Concat_List($version);
95              
96 1 50       9 my $raw = $self->SUPER::pack('CCn',
97             $bvlist->to_Dec,
98             $self->reserved,
99             $self->channelType
100             ) or return;
101              
102 1         42 return $self->raw($raw);
103             }
104              
105             sub unpack {
106 1     1 1 21 my $self = shift;
107              
108 1 50       3 my ($bv, $reserved, $channelType, $payload) =
109             $self->SUPER::unpack('CCn a*', $self->raw)
110             or return;
111              
112 1         34 my $bvlist = Bit::Vector->new_Dec(8, $bv);
113 1         9 $self->pwNibble($bvlist->Chunk_Read(4,4));
114 1         14 $self->version ($bvlist->Chunk_Read(4,0));
115              
116 1         11 $self->reserved($reserved);
117 1         10 $self->channelType($channelType);
118              
119 1         14 $self->payload($payload);
120              
121 1         11 return $self;
122             }
123              
124             sub encapsulate {
125 1     1 1 6 my $self = shift;
126              
127 1 50       5 return $self->nextLayer if $self->nextLayer;
128              
129 1 50       17 if ($self->channelType == NF_MPLS_PWACHTYPE_IPv4) {
    0          
130 1         13 return 'IPv4';
131             } elsif ($self->channelType == NF_MPLS_PWACHTYPE_IPv6) {
132 0         0 return 'IPv6';
133             }
134              
135 0 0       0 if ($self->payload) {
136 0         0 my $payload = CORE::unpack('H', $self->payload);
137 0 0       0 if ($payload == 0) {
    0          
    0          
    0          
138 0         0 return 'PWACH::PWMCW';
139             } elsif ($payload == NF_MPLS_PWNIBBLE_ACH) {
140 0         0 return 'PWACH::PWACH';
141             } elsif ($payload == 4) {
142 0         0 return 'IPv4';
143             } elsif ($payload == 6) {
144 0         0 return 'IPv6';
145             }
146             }
147              
148 0         0 NF_LAYER_NONE;
149             }
150              
151             sub print {
152 1     1 1 5 my $self = shift;
153              
154 1         6 my $l = $self->layer;
155 1         14 my $buf = sprintf
156             "$l: pwNibble:%d version:%d reserved:%d channelType:0x%04x",
157             $self->pwNibble, $self->version, $self->reserved, $self->channelType;
158              
159 1         66 return $buf;
160             }
161              
162             1;
163              
164             __END__