]>
git.ipfire.org Git - thirdparty/squid.git/blob - src/snmp/Pdu.cc
4 * DEBUG: section 49 SNMP Interface
9 #include "base/TextException.h"
10 #include "ipc/TypedMsgHdr.h"
12 #include "snmp_core.h"
25 Snmp::Pdu::Pdu(const Pdu
& pdu
)
37 Snmp::Pdu::operator = (const Pdu
& pdu
)
47 xmemset(this, 0, sizeof(*this));
48 errstat
= SNMP_DEFAULT_ERRSTAT
;
49 errindex
= SNMP_DEFAULT_ERRINDEX
;
53 Snmp::Pdu::aggregate(const Pdu
& pdu
)
55 Must(varCount() == pdu
.varCount());
57 for (variable_list
* p_aggr
= variables
, *p_var
= pdu
.variables
; p_var
!= NULL
;
58 p_aggr
= p_aggr
->next_variable
, p_var
= p_var
->next_variable
) {
60 Var
& aggr
= static_cast<Var
&>(*p_aggr
);
61 Var
& var
= static_cast<Var
&>(*p_var
);
63 aggr
.setName(var
.getName());
66 switch (snmpAggrType(aggr
.name
, aggr
.name_length
)) {
69 // The mean-average division is done later
70 // when the Snmp::Pdu::fixAggregate() called
97 Snmp::Pdu::assign(const Pdu
& pdu
)
99 command
= pdu
.command
;
100 address
.sin_addr
.s_addr
= pdu
.address
.sin_addr
.s_addr
;
102 errstat
= pdu
.errstat
;
103 errindex
= pdu
.errindex
;
104 non_repeaters
= pdu
.non_repeaters
;
105 max_repetitions
= pdu
.max_repetitions
;
106 agent_addr
.sin_addr
.s_addr
= pdu
.agent_addr
.sin_addr
.s_addr
;
107 trap_type
= pdu
.trap_type
;
108 specific_type
= pdu
.specific_type
;
110 aggrCount
= pdu
.aggrCount
;
111 setSystemOid(pdu
.getSystemOid());
112 setVars(pdu
.variables
);
116 Snmp::Pdu::clearVars()
118 variable_list
* var
= variables
;
119 while (var
!= NULL
) {
120 variable_list
* tmp
= var
;
121 var
= var
->next_variable
;
128 Snmp::Pdu::setVars(variable_list
* vars
)
131 for (variable_list
** p_var
= &variables
; vars
!= NULL
;
132 vars
= vars
->next_variable
, p_var
= &(*p_var
)->next_variable
) {
133 *p_var
= new Var(static_cast<Var
&>(*vars
));
138 Snmp::Pdu::clearSystemOid()
140 if (enterprise
!= NULL
) {
144 enterprise_length
= 0;
148 Snmp::Pdu::getSystemOid() const
150 return Range
<const oid
*>(enterprise
, enterprise
+ enterprise_length
);
154 Snmp::Pdu::setSystemOid(const Range
<const oid
*>& systemOid
)
157 if (systemOid
.start
!= NULL
&& systemOid
.size() != 0) {
158 enterprise_length
= systemOid
.size();
159 enterprise
= static_cast<oid
*>(xmalloc(enterprise_length
* sizeof(oid
)));
160 std::copy(systemOid
.start
, systemOid
.end
, enterprise
);
165 Snmp::Pdu::pack(Ipc::TypedMsgHdr
& msg
) const
171 msg
.putPod(errindex
);
172 msg
.putPod(non_repeaters
);
173 msg
.putPod(max_repetitions
);
174 msg
.putInt(enterprise_length
);
175 if (enterprise_length
> 0) {
176 Must(enterprise
!= NULL
);
177 msg
.putFixed(enterprise
, enterprise_length
* sizeof(oid
));
179 msg
.putPod(agent_addr
);
180 msg
.putPod(trap_type
);
181 msg
.putPod(specific_type
);
183 msg
.putInt(varCount());
184 for (variable_list
* var
= variables
; var
!= NULL
; var
= var
->next_variable
)
185 static_cast<Var
*>(var
)->pack(msg
);
189 Snmp::Pdu::unpack(const Ipc::TypedMsgHdr
& msg
)
196 msg
.getPod(errindex
);
197 msg
.getPod(non_repeaters
);
198 msg
.getPod(max_repetitions
);
199 enterprise_length
= msg
.getInt();
200 if (enterprise_length
> 0) {
201 enterprise
= static_cast<oid
*>(xmalloc(enterprise_length
* sizeof(oid
)));
202 msg
.getFixed(enterprise
, enterprise_length
* sizeof(oid
));
204 msg
.getPod(agent_addr
);
205 msg
.getPod(trap_type
);
206 msg
.getPod(specific_type
);
208 int count
= msg
.getInt();
209 for (variable_list
** p_var
= &variables
; count
> 0;
210 p_var
= &(*p_var
)->next_variable
, --count
) {
211 Var
* var
= new Var();
218 Snmp::Pdu::varCount() const
221 for (variable_list
* var
= variables
; var
!= NULL
; var
= var
->next_variable
)
227 Snmp::Pdu::fixAggregate()
231 for (variable_list
* p_aggr
= variables
; p_aggr
!= NULL
; p_aggr
= p_aggr
->next_variable
) {
232 Var
& aggr
= static_cast<Var
&>(*p_aggr
);
233 if (snmpAggrType(aggr
.name
, aggr
.name_length
) == atAverage
) {