]>
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"
24 Snmp::Pdu::Pdu(const Pdu
& pdu
)
36 Snmp::Pdu::operator = (const Pdu
& pdu
)
46 xmemset(this, 0, sizeof(*this));
47 errstat
= SNMP_DEFAULT_ERRSTAT
;
48 errindex
= SNMP_DEFAULT_ERRINDEX
;
52 Snmp::Pdu::aggregate(const Pdu
& pdu
)
54 Must(varCount() == pdu
.varCount());
56 for (variable_list
* p_aggr
= variables
, *p_var
= pdu
.variables
; p_var
!= NULL
;
57 p_aggr
= p_aggr
->next_variable
, p_var
= p_var
->next_variable
) {
59 Var
& aggr
= static_cast<Var
&>(*p_aggr
);
60 Var
& var
= static_cast<Var
&>(*p_var
);
62 aggr
.setName(var
.getName());
65 switch (snmpAggrType(aggr
.name
, aggr
.name_length
)) {
68 // The mean-average division is done later
69 // when the Snmp::Pdu::fixAggregate() called
96 Snmp::Pdu::assign(const Pdu
& pdu
)
98 command
= pdu
.command
;
99 address
.sin_addr
.s_addr
= pdu
.address
.sin_addr
.s_addr
;
101 errstat
= pdu
.errstat
;
102 errindex
= pdu
.errindex
;
103 non_repeaters
= pdu
.non_repeaters
;
104 max_repetitions
= pdu
.max_repetitions
;
105 agent_addr
.sin_addr
.s_addr
= pdu
.agent_addr
.sin_addr
.s_addr
;
106 trap_type
= pdu
.trap_type
;
107 specific_type
= pdu
.specific_type
;
109 aggrCount
= pdu
.aggrCount
;
110 setSystemOid(pdu
.getSystemOid());
111 setVars(pdu
.variables
);
115 Snmp::Pdu::clearVars()
117 variable_list
* var
= variables
;
118 while (var
!= NULL
) {
119 variable_list
* tmp
= var
;
120 var
= var
->next_variable
;
127 Snmp::Pdu::setVars(variable_list
* vars
)
130 for (variable_list
** p_var
= &variables
; vars
!= NULL
;
131 vars
= vars
->next_variable
, p_var
= &(*p_var
)->next_variable
) {
132 *p_var
= new Var(static_cast<Var
&>(*vars
));
137 Snmp::Pdu::clearSystemOid()
139 if (enterprise
!= NULL
) {
143 enterprise_length
= 0;
147 Snmp::Pdu::getSystemOid() const
149 return Range
<const oid
*>(enterprise
, enterprise
+ enterprise_length
);
153 Snmp::Pdu::setSystemOid(const Range
<const oid
*>& systemOid
)
156 if (systemOid
.start
!= NULL
&& systemOid
.size() != 0) {
157 enterprise_length
= systemOid
.size();
158 enterprise
= static_cast<oid
*>(xmalloc(enterprise_length
* sizeof(oid
)));
159 std::copy(systemOid
.start
, systemOid
.end
, enterprise
);
164 Snmp::Pdu::pack(Ipc::TypedMsgHdr
& msg
) const
170 msg
.putPod(errindex
);
171 msg
.putPod(non_repeaters
);
172 msg
.putPod(max_repetitions
);
173 msg
.putInt(enterprise_length
);
174 if (enterprise_length
> 0) {
175 Must(enterprise
!= NULL
);
176 msg
.putFixed(enterprise
, enterprise_length
* sizeof(oid
));
178 msg
.putPod(agent_addr
);
179 msg
.putPod(trap_type
);
180 msg
.putPod(specific_type
);
182 msg
.putInt(varCount());
183 for (variable_list
* var
= variables
; var
!= NULL
; var
= var
->next_variable
)
184 static_cast<Var
*>(var
)->pack(msg
);
188 Snmp::Pdu::unpack(const Ipc::TypedMsgHdr
& msg
)
195 msg
.getPod(errindex
);
196 msg
.getPod(non_repeaters
);
197 msg
.getPod(max_repetitions
);
198 enterprise_length
= msg
.getInt();
199 if (enterprise_length
> 0) {
200 enterprise
= static_cast<oid
*>(xmalloc(enterprise_length
* sizeof(oid
)));
201 msg
.getFixed(enterprise
, enterprise_length
* sizeof(oid
));
203 msg
.getPod(agent_addr
);
204 msg
.getPod(trap_type
);
205 msg
.getPod(specific_type
);
207 int count
= msg
.getInt();
208 for (variable_list
** p_var
= &variables
; count
> 0;
209 p_var
= &(*p_var
)->next_variable
, --count
) {
210 Var
* var
= new Var();
217 Snmp::Pdu::varCount() const
220 for (variable_list
* var
= variables
; var
!= NULL
; var
= var
->next_variable
)
226 Snmp::Pdu::fixAggregate()
230 for (variable_list
* p_aggr
= variables
; p_aggr
!= NULL
; p_aggr
= p_aggr
->next_variable
) {
231 Var
& aggr
= static_cast<Var
&>(*p_aggr
);
232 if (snmpAggrType(aggr
.name
, aggr
.name_length
) == atAverage
) {