]> git.ipfire.org Git - thirdparty/squid.git/blame - src/snmpx/Pdu.cc
fix debug sections
[thirdparty/squid.git] / src / snmpx / Pdu.cc
CommitLineData
51ea0904
CT
1/*
2 * $Id$
3 *
4 * DEBUG: section 49 SNMP Interface
5 *
6 */
7
8#include "config.h"
9#include "base/TextException.h"
10#include "ipc/TypedMsgHdr.h"
11#include "protos.h"
12#include "snmp_core.h"
13#include "snmpx/Pdu.h"
14#include "snmpx/Var.h"
15
16
17Snmp::Pdu::Pdu()
18{
19 init();
20}
21
22Snmp::Pdu::Pdu(const Pdu& pdu)
23{
24 init();
25 assign(pdu);
26}
27
28Snmp::Pdu::~Pdu()
29{
30 clear();
31}
32
33Snmp::Pdu&
34Snmp::Pdu::operator = (const Pdu& pdu)
35{
36 clear();
37 assign(pdu);
38 return *this;
39}
40
41void
42Snmp::Pdu::init()
43{
44 xmemset(this, 0, sizeof(*this));
45 errstat = SNMP_DEFAULT_ERRSTAT;
46 errindex = SNMP_DEFAULT_ERRINDEX;
47}
48
49void
50Snmp::Pdu::aggregate(const Pdu& pdu)
51{
52 Must(varCount() == pdu.varCount());
e26257b2 53 aggrCount++;
51ea0904
CT
54 for (variable_list* p_aggr = variables, *p_var = pdu.variables; p_var != NULL;
55 p_aggr = p_aggr->next_variable, p_var = p_var->next_variable)
56 {
57 Must(p_aggr != NULL);
58 Var& aggr = static_cast<Var&>(*p_aggr);
59 Var& var = static_cast<Var&>(*p_var);
60 if (aggr.isNull()) {
61 aggr.setName(var.getName());
62 aggr.copyValue(var);
63 } else {
64 switch(snmpAggrType(aggr.name, aggr.name_length))
65 {
66 case atSum:
67 case atAverage:
68 aggr += var;
69 break;
70 case atMax:
71 if (var > aggr)
72 aggr.copyValue(var);
73 break;
74 case atMin:
75 if (var < aggr)
76 aggr.copyValue(var);
77 break;
78 default:
79 break;
80 }
81 }
82 }
83}
84
85void
86Snmp::Pdu::clear()
87{
88 clearSystemOid();
89 clearVars();
90 init();
91}
92
93void
94Snmp::Pdu::assign(const Pdu& pdu)
95{
96 command = pdu.command;
97 address.sin_addr.s_addr = pdu.address.sin_addr.s_addr;
98 reqid = pdu.reqid;
99 errstat = pdu.errstat;
100 errindex = pdu.errindex;
101 non_repeaters = pdu.non_repeaters;
102 max_repetitions = pdu.max_repetitions;
103 agent_addr.sin_addr.s_addr = pdu.agent_addr.sin_addr.s_addr;
104 trap_type = pdu.trap_type;
105 specific_type = pdu.specific_type;
106 time = pdu.time;
e26257b2 107 aggrCount = pdu.aggrCount;
51ea0904
CT
108 setSystemOid(pdu.getSystemOid());
109 setVars(pdu.variables);
110}
111
112void
113Snmp::Pdu::clearVars()
114{
115 variable_list* var = variables;
116 while (var != NULL) {
117 variable_list* tmp = var;
118 var = var->next_variable;
119 snmp_var_free(tmp);
120 }
121 variables = NULL;
122}
123
124void
125Snmp::Pdu::setVars(variable_list* vars)
126{
127 clearVars();
128 for (variable_list** p_var = &variables; vars != NULL;
129 vars = vars->next_variable, p_var = &(*p_var)->next_variable)
130 {
131 *p_var = new Var(static_cast<Var&>(*vars));
132 }
133}
134
135void
136Snmp::Pdu::clearSystemOid()
137{
138 if (enterprise != NULL) {
139 xfree(enterprise);
140 enterprise = NULL;
141 }
142 enterprise_length = 0;
143}
144
145Range<const oid*>
146Snmp::Pdu::getSystemOid() const
147{
148 return Range<const oid*>(enterprise, enterprise + enterprise_length);
149}
150
151void
152Snmp::Pdu::setSystemOid(const Range<const oid*>& systemOid)
153{
154 clearSystemOid();
155 if (systemOid.start != NULL && systemOid.size() != 0) {
156 enterprise_length = systemOid.size();
157 enterprise = static_cast<oid*>(xmalloc(enterprise_length * sizeof(oid)));
158 std::copy(systemOid.start, systemOid.end, enterprise);
159 }
160}
161
162void
163Snmp::Pdu::pack(Ipc::TypedMsgHdr& msg) const
164{
165 msg.putPod(command);
166 msg.putPod(address);
167 msg.putPod(reqid);
168 msg.putPod(errstat);
169 msg.putPod(errindex);
170 msg.putPod(non_repeaters);
171 msg.putPod(max_repetitions);
172 msg.putInt(enterprise_length);
173 if (enterprise_length > 0) {
174 Must(enterprise != NULL);
175 msg.putFixed(enterprise, enterprise_length * sizeof(oid));
176 }
177 msg.putPod(agent_addr);
178 msg.putPod(trap_type);
179 msg.putPod(specific_type);
180 msg.putPod(time);
181 msg.putInt(varCount());
182 for (variable_list* var = variables; var != NULL; var = var->next_variable)
183 static_cast<Var*>(var)->pack(msg);
184}
185
186void
187Snmp::Pdu::unpack(const Ipc::TypedMsgHdr& msg)
188{
189 clear();
190 msg.getPod(command);
191 msg.getPod(address);
192 msg.getPod(reqid);
193 msg.getPod(errstat);
194 msg.getPod(errindex);
195 msg.getPod(non_repeaters);
196 msg.getPod(max_repetitions);
197 enterprise_length = msg.getInt();
198 if (enterprise_length > 0) {
199 enterprise = static_cast<oid*>(xmalloc(enterprise_length * sizeof(oid)));
200 msg.getFixed(enterprise, enterprise_length * sizeof(oid));
201 }
202 msg.getPod(agent_addr);
203 msg.getPod(trap_type);
204 msg.getPod(specific_type);
205 msg.getPod(time);
206 int count = msg.getInt();
207 for (variable_list** p_var = &variables; count > 0;
208 p_var = &(*p_var)->next_variable, --count)
209 {
210 Var* var = new Var();
211 var->unpack(msg);
212 *p_var = var;
213 }
214}
215
216int
217Snmp::Pdu::varCount() const
218{
219 int count = 0;
220 for (variable_list* var = variables; var != NULL; var = var->next_variable)
221 ++count;
222 return count;
223}
e26257b2
CT
224
225void
226Snmp::Pdu::fixAggregate()
227{
228 if (!aggrCount)
229 return;
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) {
233 aggr /= aggrCount;
234 }
235 }
236 aggrCount = 0;
237}