File Coverage

blib/lib/Net/SNMP/XS.pm
Criterion Covered Total %
statement 21 37 56.7
branch 0 10 0.0
condition 0 6 0.0
subroutine 7 8 87.5
pod 0 1 0.0
total 28 62 45.1


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 to speed up Net::SNMP
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   1030 use common::sense;
  1         13  
  1         6  
47              
48 1     1   63 use Exporter qw(import);
  1         2  
  1         42  
49              
50 1     1   943 use Net::SNMP ();
  1         79618  
  1         30  
51 1     1   9 use Net::SNMP::PDU ();
  1         2  
  1         15  
52 1     1   5 use Net::SNMP::Message ();
  1         2  
  1         14  
53 1     1   4 use Net::SNMP::MessageProcessing ();
  1         2  
  1         69  
54              
55             our $VERSION;
56              
57             BEGIN {
58 1     1   3 $VERSION = 1.34;
59              
60             # this overrides many methods inside Net::SNMP and it's submodules
61 1         4 require XSLoader;
62 1         1266 XSLoader::load Net::SNMP::XS, $VERSION;
63             }
64              
65             package Net::SNMP::Message;
66              
67             Net::SNMP::XS::set_type INTEGER , \&_process_integer32;
68             Net::SNMP::XS::set_type OCTET_STRING , \&_process_octet_string;
69             Net::SNMP::XS::set_type NULL , \&_process_null;
70             Net::SNMP::XS::set_type OBJECT_IDENTIFIER, \&_process_object_identifier;
71             Net::SNMP::XS::set_type SEQUENCE , \&_process_sequence;
72             Net::SNMP::XS::set_type IPADDRESS , \&_process_ipaddress;
73             Net::SNMP::XS::set_type COUNTER , \&_process_counter;
74             Net::SNMP::XS::set_type GAUGE , \&_process_gauge;
75             Net::SNMP::XS::set_type TIMETICKS , \&_process_timeticks;
76             Net::SNMP::XS::set_type OPAQUE , \&_process_opaque;
77             Net::SNMP::XS::set_type COUNTER64 , \&_process_counter64;
78             Net::SNMP::XS::set_type NOSUCHOBJECT , \&_process_nosuchobject;
79             Net::SNMP::XS::set_type NOSUCHINSTANCE , \&_process_nosuchinstance;
80             Net::SNMP::XS::set_type ENDOFMIBVIEW , \&_process_endofmibview;
81             Net::SNMP::XS::set_type GET_REQUEST , \&_process_get_request;
82             Net::SNMP::XS::set_type GET_NEXT_REQUEST , \&_process_get_next_request;
83             Net::SNMP::XS::set_type GET_RESPONSE , \&_process_get_response;
84             Net::SNMP::XS::set_type SET_REQUEST , \&_process_set_request;
85             Net::SNMP::XS::set_type TRAP , \&_process_trap;
86             Net::SNMP::XS::set_type GET_BULK_REQUEST , \&_process_get_bulk_request;
87             Net::SNMP::XS::set_type INFORM_REQUEST , \&_process_inform_request;
88             Net::SNMP::XS::set_type SNMPV2_TRAP , \&_process_v2_trap;
89             Net::SNMP::XS::set_type REPORT , \&_process_report;
90              
91             package Net::SNMP::PDU;
92              
93             # var_bind_list hardcodes oid_lex_sort. *sigh*
94             # we copy it 1:1, except for using oid_lex_sort.
95              
96             sub var_bind_list
97             {
98 0     0 0   my ($this, $vbl, $types) = @_;
99              
100 0 0         return if defined($this->{_error});
101              
102 0 0         if (@_ > 1) {
103             # The VarBindList HASH is being updated from an external
104             # source. We need to update the VarBind names ARRAY to
105             # correspond to the new keys of the HASH. If the updated
106             # information is valid, we will use lexicographical ordering
107             # for the ARRAY entries since we do not have a PDU to use
108             # to determine the ordering. The ASN.1 types HASH is also
109             # updated here if a cooresponding HASH is passed. We double
110             # check the mapping by populating the hash with the keys of
111             # the VarBindList HASH.
112              
113 0 0 0       if (!defined($vbl) || (ref($vbl) ne 'HASH')) {
114              
115 0           $this->{_var_bind_list} = undef;
116 0           $this->{_var_bind_names} = [];
117 0           $this->{_var_bind_types} = undef;
118              
119             } else {
120              
121 0           $this->{_var_bind_list} = $vbl;
122              
123 0           @{$this->{_var_bind_names}} = Net::SNMP::oid_lex_sort keys %$vbl;
  0            
124              
125 0 0 0       if (!defined($types) || (ref($types) ne 'HASH')) {
126 0           $types = {};
127             }
128              
129             map {
130             $this->{_var_bind_types}->{$_} =
131 0 0         exists($types->{$_}) ? $types->{$_} : undef;
132 0           } keys(%{$vbl});
  0            
133              
134             }
135              
136             }
137              
138 0           $this->{_var_bind_list};
139             }
140              
141             1;
142              
143             =head1 AUTHOR
144              
145             Marc Lehmann
146             http://home.schmorp.de/
147              
148             =cut
149