]>
git.ipfire.org Git - thirdparty/squid.git/blob - src/snmp/Pdu.cc
2 * Copyright (C) 1996-2017 The Squid Software Foundation and contributors
4 * Squid software is distributed under GPLv2+ license and includes
5 * contributions from numerous individuals and organizations.
6 * Please see the COPYING and CONTRIBUTORS files for details.
9 /* DEBUG: section 49 SNMP Interface */
12 #include "base/TextException.h"
13 #include "ipc/TypedMsgHdr.h"
16 #include "snmp_core.h"
26 Snmp::Pdu::Pdu(const Pdu
& pdu
)
38 Snmp::Pdu::operator = (const Pdu
& pdu
)
48 memset(this, 0, sizeof(*this));
49 errstat
= SNMP_DEFAULT_ERRSTAT
;
50 errindex
= SNMP_DEFAULT_ERRINDEX
;
54 Snmp::Pdu::aggregate(const Pdu
& pdu
)
56 Must(varCount() == pdu
.varCount());
58 for (variable_list
* p_aggr
= variables
, *p_var
= pdu
.variables
; p_var
!= NULL
;
59 p_aggr
= p_aggr
->next_variable
, p_var
= p_var
->next_variable
) {
61 Var
& aggr
= static_cast<Var
&>(*p_aggr
);
62 Var
& var
= static_cast<Var
&>(*p_var
);
64 aggr
.setName(var
.getName());
67 switch (snmpAggrType(aggr
.name
, aggr
.name_length
)) {
70 // The mean-average division is done later
71 // when the Snmp::Pdu::fixAggregate() called
98 Snmp::Pdu::assign(const Pdu
& pdu
)
100 command
= pdu
.command
;
101 address
.sin_addr
.s_addr
= pdu
.address
.sin_addr
.s_addr
;
103 errstat
= pdu
.errstat
;
104 errindex
= pdu
.errindex
;
105 non_repeaters
= pdu
.non_repeaters
;
106 max_repetitions
= pdu
.max_repetitions
;
107 agent_addr
.sin_addr
.s_addr
= pdu
.agent_addr
.sin_addr
.s_addr
;
108 trap_type
= pdu
.trap_type
;
109 specific_type
= pdu
.specific_type
;
111 aggrCount
= pdu
.aggrCount
;
112 setSystemOid(pdu
.getSystemOid());
113 setVars(pdu
.variables
);
117 Snmp::Pdu::clearVars()
119 variable_list
* var
= variables
;
120 while (var
!= NULL
) {
121 variable_list
* tmp
= var
;
122 var
= var
->next_variable
;
129 Snmp::Pdu::setVars(variable_list
* vars
)
132 for (variable_list
** p_var
= &variables
; vars
!= NULL
;
133 vars
= vars
->next_variable
, p_var
= &(*p_var
)->next_variable
) {
134 *p_var
= new Var(static_cast<Var
&>(*vars
));
139 Snmp::Pdu::clearSystemOid()
141 if (enterprise
!= NULL
) {
145 enterprise_length
= 0;
149 Snmp::Pdu::getSystemOid() const
151 return Range
<const oid
*>(enterprise
, enterprise
+ enterprise_length
);
155 Snmp::Pdu::setSystemOid(const Range
<const oid
*>& systemOid
)
158 if (systemOid
.start
!= NULL
&& systemOid
.size() != 0) {
159 enterprise_length
= systemOid
.size();
160 enterprise
= static_cast<oid
*>(xmalloc(enterprise_length
* sizeof(oid
)));
161 std::copy(systemOid
.start
, systemOid
.end
, enterprise
);
166 Snmp::Pdu::pack(Ipc::TypedMsgHdr
& msg
) const
172 msg
.putPod(errindex
);
173 msg
.putPod(non_repeaters
);
174 msg
.putPod(max_repetitions
);
175 msg
.putInt(enterprise_length
);
176 if (enterprise_length
> 0) {
177 Must(enterprise
!= NULL
);
178 msg
.putFixed(enterprise
, enterprise_length
* sizeof(oid
));
180 msg
.putPod(agent_addr
);
181 msg
.putPod(trap_type
);
182 msg
.putPod(specific_type
);
184 msg
.putInt(varCount());
185 for (variable_list
* var
= variables
; var
!= NULL
; var
= var
->next_variable
)
186 static_cast<Var
*>(var
)->pack(msg
);
190 Snmp::Pdu::unpack(const Ipc::TypedMsgHdr
& msg
)
197 msg
.getPod(errindex
);
198 msg
.getPod(non_repeaters
);
199 msg
.getPod(max_repetitions
);
200 enterprise_length
= msg
.getInt();
201 if (enterprise_length
> 0) {
202 enterprise
= static_cast<oid
*>(xmalloc(enterprise_length
* sizeof(oid
)));
203 msg
.getFixed(enterprise
, enterprise_length
* sizeof(oid
));
205 msg
.getPod(agent_addr
);
206 msg
.getPod(trap_type
);
207 msg
.getPod(specific_type
);
209 int count
= msg
.getInt();
210 for (variable_list
** p_var
= &variables
; count
> 0;
211 p_var
= &(*p_var
)->next_variable
, --count
) {
212 Var
* var
= new Var();
219 Snmp::Pdu::varCount() const
222 for (variable_list
* var
= variables
; var
!= NULL
; var
= var
->next_variable
)
228 Snmp::Pdu::fixAggregate()
232 for (variable_list
* p_aggr
= variables
; p_aggr
!= NULL
; p_aggr
= p_aggr
->next_variable
) {
233 Var
& aggr
= static_cast<Var
&>(*p_aggr
);
234 if (snmpAggrType(aggr
.name
, aggr
.name_length
) == atAverage
) {