ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Net-SNMP-XS/XS.pm
(Generate patch)

Comparing Net-SNMP-XS/XS.pm (file contents):
Revision 1.4 by root, Thu Apr 9 04:37:05 2009 UTC vs.
Revision 1.9 by root, Sun Apr 12 00:48:39 2009 UTC

13This module tries to speed up Net::SNMP response packet decoding. 13This module tries to speed up Net::SNMP response packet decoding.
14 14
15It does this by overriding a few selected internal method by (almost) 15It does this by overriding a few selected internal method by (almost)
16equivalent XS methods. 16equivalent XS methods.
17 17
18This currently reduces decode time by a factor of four for typical bulk 18This currently reduces decode time by a factor of ten for typical bulk
19responses. 19responses.
20 20
21There are currently the following limitations when using this module: 21There are currently the following limitations when using this module:
22 22
23=over 4 23=over 4
24 24
25=item only leading dots for oids are supported 25=item overriding internal functions might cause the module to
26 26malfunction with future versions of Net::SNMP
27=item error handling is currently broken (but parse errors will be detected)
28 27
29=item error messages will be simpler/different 28=item error messages will be simpler/different
30 29
31=item oid components are limited to unsigned 32 bit integers
32
33=item translation will be ignored (all values will be delivered "raw") 30=item translation will be ignored (all values will be delivered "raw")
34
35=item a 64 bit perl is required
36 31
37=item a moderately modern (>= C99) C compiler is required 32=item a moderately modern (>= C99) C compiler is required
38 33
39=item only tested with 5.10 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
40 39
41=back 40=back
42 41
43=cut 42=cut
44 43
47use strict qw(vars subs); 46use strict qw(vars subs);
48no warnings; 47no warnings;
49 48
50use Guard; 49use Guard;
51 50
51use Net::SNMP ();
52use Net::SNMP::PDU (); 52use Net::SNMP::PDU ();
53use Net::SNMP::Message (); 53use Net::SNMP::Message ();
54use Net::SNMP::MessageProcessing (); 54use Net::SNMP::MessageProcessing ();
55 55
56our $VERSION; 56our $VERSION;
57our $old_prepare; 57our $old_prepare;
58 58
59BEGIN { 59BEGIN {
60 $VERSION = '0.01'; 60 $VERSION = '0.03';
61 61
62 $old_prepare = \&Net::SNMP::MessageProcessing::prepare_data_elements; 62 $old_prepare = \&Net::SNMP::MessageProcessing::prepare_data_elements;
63 63
64 # this overrides many methods inside 64 # this overrides many methods inside
65 require XSLoader; 65 require XSLoader;
72 set_msg $msg, $msg->{_buffer}; 72 set_msg $msg, $msg->{_buffer};
73 scope_guard \&clr_msg; 73 scope_guard \&clr_msg;
74 &$old_prepare 74 &$old_prepare
75} 75}
76 76
77package Net::SNMP::Message;
78
79Net::SNMP::XS::set_type INTEGER , \&_process_integer32;
80Net::SNMP::XS::set_type OCTET_STRING , \&_process_octet_string;
81Net::SNMP::XS::set_type NULL , \&_process_null;
82Net::SNMP::XS::set_type OBJECT_IDENTIFIER, \&_process_object_identifier;
83Net::SNMP::XS::set_type SEQUENCE , \&_process_sequence;
84Net::SNMP::XS::set_type IPADDRESS , \&_process_ipaddress;
85Net::SNMP::XS::set_type COUNTER , \&_process_counter;
86Net::SNMP::XS::set_type GAUGE , \&_process_gauge;
87Net::SNMP::XS::set_type TIMETICKS , \&_process_timeticks;
88Net::SNMP::XS::set_type OPAQUE , \&_process_opaque;
89Net::SNMP::XS::set_type COUNTER64 , \&_process_counter64;
90Net::SNMP::XS::set_type NOSUCHOBJECT , \&_process_nosuchobject;
91Net::SNMP::XS::set_type NOSUCHINSTANCE , \&_process_nosuchinstance;
92Net::SNMP::XS::set_type ENDOFMIBVIEW , \&_process_endofmibview;
93Net::SNMP::XS::set_type GET_REQUEST , \&_process_get_request;
94Net::SNMP::XS::set_type GET_NEXT_REQUEST , \&_process_get_next_request;
95Net::SNMP::XS::set_type GET_RESPONSE , \&_process_get_response;
96Net::SNMP::XS::set_type SET_REQUEST , \&_process_set_request;
97Net::SNMP::XS::set_type TRAP , \&_process_trap;
98Net::SNMP::XS::set_type GET_BULK_REQUEST , \&_process_get_bulk_request;
99Net::SNMP::XS::set_type INFORM_REQUEST , \&_process_inform_request;
100Net::SNMP::XS::set_type SNMPV2_TRAP , \&_process_v2_trap;
101Net::SNMP::XS::set_type REPORT , \&_process_report;
102
103package Net::SNMP::PDU;
104
105# var_bind_list hardcodes oid_lext_sort. *sigh*
106# we copy it 1:1, except for using oid_lex_sort.
107
108sub var_bind_list
77{ 109{
78 package Net::SNMP::Message; 110 my ($this, $vbl, $types) = @_;
79 111
80 Net::SNMP::XS::set_type INTEGER , \&_process_integer32; 112 return if defined($this->{_error});
81 Net::SNMP::XS::set_type OCTET_STRING , \&_process_octet_string; 113
82 Net::SNMP::XS::set_type NULL , \&_process_null; 114 if (@_ > 1) {
83 Net::SNMP::XS::set_type OBJECT_IDENTIFIER, \&_process_object_identifier; 115 # The VarBindList HASH is being updated from an external
84 Net::SNMP::XS::set_type SEQUENCE , \&_process_sequence; 116 # source. We need to update the VarBind names ARRAY to
85 Net::SNMP::XS::set_type IPADDRESS , \&_process_ipaddress; 117 # correspond to the new keys of the HASH. If the updated
86 Net::SNMP::XS::set_type COUNTER , \&_process_counter; 118 # information is valid, we will use lexicographical ordering
87 Net::SNMP::XS::set_type GAUGE , \&_process_gauge; 119 # for the ARRAY entries since we do not have a PDU to use
88 Net::SNMP::XS::set_type TIMETICKS , \&_process_timeticks; 120 # to determine the ordering. The ASN.1 types HASH is also
89 Net::SNMP::XS::set_type OPAQUE , \&_process_opaque; 121 # updated here if a cooresponding HASH is passed. We double
90 Net::SNMP::XS::set_type COUNTER64 , \&_process_counter64; 122 # check the mapping by populating the hash with the keys of
91 Net::SNMP::XS::set_type NOSUCHOBJECT , \&_process_nosuchobject; 123 # the VarBindList HASH.
92 Net::SNMP::XS::set_type NOSUCHINSTANCE , \&_process_nosuchinstance; 124
93 Net::SNMP::XS::set_type ENDOFMIBVIEW , \&_process_endofmibview; 125 if (!defined($vbl) || (ref($vbl) ne 'HASH')) {
94 Net::SNMP::XS::set_type GET_REQUEST , \&_process_get_request; 126
95 Net::SNMP::XS::set_type GET_NEXT_REQUEST , \&_process_get_next_request; 127 $this->{_var_bind_list} = undef;
96 Net::SNMP::XS::set_type GET_RESPONSE , \&_process_get_response; 128 $this->{_var_bind_names} = [];
97 Net::SNMP::XS::set_type SET_REQUEST , \&_process_set_request; 129 $this->{_var_bind_types} = undef;
98 Net::SNMP::XS::set_type TRAP , \&_process_trap; 130
99 Net::SNMP::XS::set_type GET_BULK_REQUEST , \&_process_get_bulk_request; 131 } else {
100 Net::SNMP::XS::set_type INFORM_REQUEST , \&_process_inform_request; 132
101 Net::SNMP::XS::set_type SNMPV2_TRAP , \&_process_v2_trap; 133 $this->{_var_bind_list} = $vbl;
102 Net::SNMP::XS::set_type REPORT , \&_process_report; 134
135 @{$this->{_var_bind_names}} = Net::SNMP::oid_lex_sort keys %$vbl;
136
137 if (!defined($types) || (ref($types) ne 'HASH')) {
138 $types = {};
139 }
140
141 map {
142 $this->{_var_bind_types}->{$_} =
143 exists($types->{$_}) ? $types->{$_} : undef;
144 } keys(%{$vbl});
145
146 }
147
148 }
149
150 $this->{_var_bind_list};
103} 151}
104 152
1051; 1531;
106 154
107=head1 AUTHOR 155=head1 AUTHOR

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines