File Coverage

blib/lib/Net/SNMP/XS.pm
Criterion Covered Total %
statement 24 40 60.0
branch 0 10 0.0
condition 0 6 0.0
subroutine 8 9 88.8
pod 0 1 0.0
total 32 66 48.4


line stmt bran cond sub pod time code
1             =head1 NAME
2              
3             Net::SNMP::XS - speed up Net::SNMP by decoding in XS, with limitations
4              
5             =head1 SYNOPSIS
6              
7             use Net::SNMP::XS;
8              
9             # loading it is enough, there are no public symbols
10              
11             =head1 DESCRIPTION
12              
13             This module tries to speed up Net::SNMP response packet decoding.
14              
15             It does this by overriding a few selected internal method by (almost)
16             equivalent XS methods.
17              
18             This currently reduces decode time by a factor of ten for typical bulk
19             responses.
20              
21             There are currently the following limitations when using this module:
22              
23             =over 4
24              
25             =item overriding internal functions might cause the module to
26             malfunction with future versions of Net::SNMP
27              
28             =item error messages will be simpler/different
29              
30             =item translation will be ignored (all values will be delivered "raw")
31              
32             =item a moderately modern (>= C99) C compiler is required
33              
34             =item only tested with 5.10, no intentions to port to older perls
35              
36             =item duplicate OIDs are not supported
37              
38             =item REPORT PDUs are not supported
39              
40             =back
41              
42             =cut
43              
44             package Net::SNMP::XS;
45              
46 1     1   678 use strict qw(vars subs);
  1         2  
  1         51  
47 1     1   7 no warnings;
  1         1  
  1         59  
48              
49 1     1   637 use Guard;
  1         646  
  1         88  
50              
51 1     1   1156 use Net::SNMP ();
  1         97503  
  1         38  
52 1     1   11 use Net::SNMP::PDU ();
  1         2  
  1         23  
53 1     1   7 use Net::SNMP::Message ();
  1         2  
  1         21  
54 1     1   6 use Net::SNMP::MessageProcessing ();
  1         2  
  1         75  
55              
56             our $VERSION;
57              
58             BEGIN {
59 1     1   3 $VERSION = 1.31;
60              
61             # this overrides many methods inside Net::SNMP and it's submodules
62 1         6 require XSLoader;
63 1         1796 XSLoader::load Net::SNMP::XS, $VERSION;
64             }
65              
66             package Net::SNMP::Message;
67              
68             Net::SNMP::XS::set_type INTEGER , \&_process_integer32;
69             Net::SNMP::XS::set_type OCTET_STRING , \&_process_octet_string;
70             Net::SNMP::XS::set_type NULL , \&_process_null;
71             Net::SNMP::XS::set_type OBJECT_IDENTIFIER, \&_process_object_identifier;
72             Net::SNMP::XS::set_type SEQUENCE , \&_process_sequence;
73             Net::SNMP::XS::set_type IPADDRESS , \&_process_ipaddress;
74             Net::SNMP::XS::set_type COUNTER , \&_process_counter;
75             Net::SNMP::XS::set_type GAUGE , \&_process_gauge;
76             Net::SNMP::XS::set_type TIMETICKS , \&_process_timeticks;
77             Net::SNMP::XS::set_type OPAQUE , \&_process_opaque;
78             Net::SNMP::XS::set_type COUNTER64 , \&_process_counter64;
79             Net::SNMP::XS::set_type NOSUCHOBJECT , \&_process_nosuchobject;
80             Net::SNMP::XS::set_type NOSUCHINSTANCE , \&_process_nosuchinstance;
81             Net::SNMP::XS::set_type ENDOFMIBVIEW , \&_process_endofmibview;
82             Net::SNMP::XS::set_type GET_REQUEST , \&_process_get_request;
83             Net::SNMP::XS::set_type GET_NEXT_REQUEST , \&_process_get_next_request;
84             Net::SNMP::XS::set_type GET_RESPONSE , \&_process_get_response;
85             Net::SNMP::XS::set_type SET_REQUEST , \&_process_set_request;
86             Net::SNMP::XS::set_type TRAP , \&_process_trap;
87             Net::SNMP::XS::set_type GET_BULK_REQUEST , \&_process_get_bulk_request;
88             Net::SNMP::XS::set_type INFORM_REQUEST , \&_process_inform_request;
89             Net::SNMP::XS::set_type SNMPV2_TRAP , \&_process_v2_trap;
90             Net::SNMP::XS::set_type REPORT , \&_process_report;
91              
92             package Net::SNMP::PDU;
93              
94             # var_bind_list hardcodes oid_lex_sort. *sigh*
95             # we copy it 1:1, except for using oid_lex_sort.
96              
97             sub var_bind_list
98             {
99 0     0 0   my ($this, $vbl, $types) = @_;
100              
101 0 0         return if defined($this->{_error});
102              
103 0 0         if (@_ > 1) {
104             # The VarBindList HASH is being updated from an external
105             # source. We need to update the VarBind names ARRAY to
106             # correspond to the new keys of the HASH. If the updated
107             # information is valid, we will use lexicographical ordering
108             # for the ARRAY entries since we do not have a PDU to use
109             # to determine the ordering. The ASN.1 types HASH is also
110             # updated here if a cooresponding HASH is passed. We double
111             # check the mapping by populating the hash with the keys of
112             # the VarBindList HASH.
113              
114 0 0 0       if (!defined($vbl) || (ref($vbl) ne 'HASH')) {
115              
116 0           $this->{_var_bind_list} = undef;
117 0           $this->{_var_bind_names} = [];
118 0           $this->{_var_bind_types} = undef;
119              
120             } else {
121              
122 0           $this->{_var_bind_list} = $vbl;
123              
124 0           @{$this->{_var_bind_names}} = Net::SNMP::oid_lex_sort keys %$vbl;
  0            
125              
126 0 0 0       if (!defined($types) || (ref($types) ne 'HASH')) {
127 0           $types = {};
128             }
129              
130             map {
131 0 0         $this->{_var_bind_types}->{$_} =
  0            
132             exists($types->{$_}) ? $types->{$_} : undef;
133 0           } keys(%{$vbl});
134              
135             }
136              
137             }
138              
139 0           $this->{_var_bind_list};
140             }
141              
142             1;
143              
144             =head1 AUTHOR
145              
146             Marc Lehmann
147             http://home.schmorp.de/
148              
149             =cut
150