ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Net-SNMP-XS/XS.pm
Revision: 1.20
Committed: Mon Apr 22 11:13:16 2019 UTC (5 years, 1 month ago) by root
Branch: MAIN
CVS Tags: rel-1_34, HEAD
Changes since 1.19: +1 -1 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.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 root 1.18 # loading it is enough to speed up Net::SNMP
10    
11 root 1.1 =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 root 1.5 This currently reduces decode time by a factor of ten for typical bulk
19 root 1.3 responses.
20 root 1.1
21     There are currently the following limitations when using this module:
22    
23     =over 4
24    
25 root 1.6 =item overriding internal functions might cause the module to
26     malfunction with future versions of Net::SNMP
27    
28 root 1.3 =item error messages will be simpler/different
29    
30 root 1.1 =item translation will be ignored (all values will be delivered "raw")
31    
32 root 1.2 =item a moderately modern (>= C99) C compiler is required
33    
34 root 1.7 =item only tested with 5.10, no intentions to port to older perls
35 root 1.2
36 root 1.5 =item duplicate OIDs are not supported
37    
38     =item REPORT PDUs are not supported
39    
40 root 1.1 =back
41    
42     =cut
43    
44     package Net::SNMP::XS;
45    
46 root 1.16 use common::sense;
47 root 1.1
48 root 1.18 use Exporter qw(import);
49    
50 root 1.8 use Net::SNMP ();
51 root 1.1 use Net::SNMP::PDU ();
52     use Net::SNMP::Message ();
53     use Net::SNMP::MessageProcessing ();
54    
55     our $VERSION;
56    
57     BEGIN {
58 root 1.20 $VERSION = 1.34;
59 root 1.1
60 root 1.10 # this overrides many methods inside Net::SNMP and it's submodules
61 root 1.1 require XSLoader;
62     XSLoader::load Net::SNMP::XS, $VERSION;
63     }
64    
65 root 1.8 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 root 1.10 # var_bind_list hardcodes oid_lex_sort. *sigh*
94 root 1.8 # we copy it 1:1, except for using oid_lex_sort.
95    
96     sub var_bind_list
97 root 1.1 {
98 root 1.8 my ($this, $vbl, $types) = @_;
99    
100     return if defined($this->{_error});
101    
102     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     if (!defined($vbl) || (ref($vbl) ne 'HASH')) {
114    
115     $this->{_var_bind_list} = undef;
116     $this->{_var_bind_names} = [];
117     $this->{_var_bind_types} = undef;
118    
119     } else {
120    
121     $this->{_var_bind_list} = $vbl;
122    
123     @{$this->{_var_bind_names}} = Net::SNMP::oid_lex_sort keys %$vbl;
124    
125     if (!defined($types) || (ref($types) ne 'HASH')) {
126     $types = {};
127     }
128    
129     map {
130     $this->{_var_bind_types}->{$_} =
131     exists($types->{$_}) ? $types->{$_} : undef;
132     } keys(%{$vbl});
133    
134     }
135    
136     }
137 root 1.1
138 root 1.8 $this->{_var_bind_list};
139 root 1.1 }
140    
141     1;
142    
143     =head1 AUTHOR
144    
145     Marc Lehmann <schmorp@schmorp.de>
146     http://home.schmorp.de/
147    
148     =cut
149