]>
git.ipfire.org Git - thirdparty/squid.git/blob - src/snmp/Pdu.cc
2 * Copyright (C) 1996-2022 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(static_cast<snmp_pdu
*>(this), 0, sizeof(snmp_pdu
));
50 errstat
= SNMP_DEFAULT_ERRSTAT
;
51 errindex
= SNMP_DEFAULT_ERRINDEX
;
55 Snmp::Pdu::aggregate(const Pdu
& pdu
)
57 Must(varCount() == pdu
.varCount());
59 for (variable_list
* p_aggr
= variables
, *p_var
= pdu
.variables
; p_var
!= nullptr;
60 p_aggr
= p_aggr
->next_variable
, p_var
= p_var
->next_variable
) {
61 Must(p_aggr
!= nullptr);
62 Var
& aggr
= static_cast<Var
&>(*p_aggr
);
63 Var
& var
= static_cast<Var
&>(*p_var
);
65 aggr
.setName(var
.getName());
68 switch (snmpAggrType(aggr
.name
, aggr
.name_length
)) {
71 // The mean-average division is done later
72 // when the Snmp::Pdu::fixAggregate() called
99 Snmp::Pdu::assign(const Pdu
& pdu
)
101 command
= pdu
.command
;
102 address
.sin_addr
.s_addr
= pdu
.address
.sin_addr
.s_addr
;
104 errstat
= pdu
.errstat
;
105 errindex
= pdu
.errindex
;
106 non_repeaters
= pdu
.non_repeaters
;
107 max_repetitions
= pdu
.max_repetitions
;
108 agent_addr
.sin_addr
.s_addr
= pdu
.agent_addr
.sin_addr
.s_addr
;
109 trap_type
= pdu
.trap_type
;
110 specific_type
= pdu
.specific_type
;
112 aggrCount
= pdu
.aggrCount
;
113 setSystemOid(pdu
.getSystemOid());
114 setVars(pdu
.variables
);
118 Snmp::Pdu::clearVars()
120 variable_list
* var
= variables
;
121 while (var
!= nullptr) {
122 variable_list
* tmp
= var
;
123 var
= var
->next_variable
;
130 Snmp::Pdu::setVars(variable_list
* vars
)
133 for (variable_list
** p_var
= &variables
; vars
!= nullptr;
134 vars
= vars
->next_variable
, p_var
= &(*p_var
)->next_variable
) {
135 *p_var
= new Var(static_cast<Var
&>(*vars
));
140 Snmp::Pdu::clearSystemOid()
142 if (enterprise
!= nullptr) {
144 enterprise
= nullptr;
146 enterprise_length
= 0;
150 Snmp::Pdu::getSystemOid() const
152 return Range
<const oid
*>(enterprise
, enterprise
+ enterprise_length
);
156 Snmp::Pdu::setSystemOid(const Range
<const oid
*>& systemOid
)
159 if (systemOid
.start
!= NULL
&& systemOid
.size() != 0) {
160 enterprise_length
= systemOid
.size();
161 enterprise
= static_cast<oid
*>(xmalloc(enterprise_length
* sizeof(oid
)));
162 std::copy(systemOid
.start
, systemOid
.end
, enterprise
);
167 Snmp::Pdu::pack(Ipc::TypedMsgHdr
& msg
) const
173 msg
.putPod(errindex
);
174 msg
.putPod(non_repeaters
);
175 msg
.putPod(max_repetitions
);
176 msg
.putInt(enterprise_length
);
177 if (enterprise_length
> 0) {
178 Must(enterprise
!= nullptr);
179 msg
.putFixed(enterprise
, enterprise_length
* sizeof(oid
));
181 msg
.putPod(agent_addr
);
182 msg
.putPod(trap_type
);
183 msg
.putPod(specific_type
);
185 msg
.putInt(varCount());
186 for (variable_list
* var
= variables
; var
!= nullptr; var
= var
->next_variable
)
187 static_cast<Var
*>(var
)->pack(msg
);
191 Snmp::Pdu::unpack(const Ipc::TypedMsgHdr
& msg
)
198 msg
.getPod(errindex
);
199 msg
.getPod(non_repeaters
);
200 msg
.getPod(max_repetitions
);
201 enterprise_length
= msg
.getInt();
202 if (enterprise_length
> 0) {
203 enterprise
= static_cast<oid
*>(xmalloc(enterprise_length
* sizeof(oid
)));
204 msg
.getFixed(enterprise
, enterprise_length
* sizeof(oid
));
206 msg
.getPod(agent_addr
);
207 msg
.getPod(trap_type
);
208 msg
.getPod(specific_type
);
210 int count
= msg
.getInt();
211 for (variable_list
** p_var
= &variables
; count
> 0;
212 p_var
= &(*p_var
)->next_variable
, --count
) {
213 Var
* var
= new Var();
220 Snmp::Pdu::varCount() const
223 for (variable_list
* var
= variables
; var
!= nullptr; var
= var
->next_variable
)
229 Snmp::Pdu::fixAggregate()
233 for (variable_list
* p_aggr
= variables
; p_aggr
!= nullptr; p_aggr
= p_aggr
->next_variable
) {
234 Var
& aggr
= static_cast<Var
&>(*p_aggr
);
235 if (snmpAggrType(aggr
.name
, aggr
.name_length
) == atAverage
) {