]>
git.ipfire.org Git - thirdparty/squid.git/blob - src/snmp/Pdu.cc
2 * DEBUG: section 49 SNMP Interface
7 #include "base/TextException.h"
8 #include "ipc/TypedMsgHdr.h"
22 Snmp::Pdu::Pdu(const Pdu
& pdu
)
34 Snmp::Pdu::operator = (const Pdu
& pdu
)
44 xmemset(this, 0, sizeof(*this));
45 errstat
= SNMP_DEFAULT_ERRSTAT
;
46 errindex
= SNMP_DEFAULT_ERRINDEX
;
50 Snmp::Pdu::aggregate(const Pdu
& pdu
)
52 Must(varCount() == pdu
.varCount());
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
) {
57 Var
& aggr
= static_cast<Var
&>(*p_aggr
);
58 Var
& var
= static_cast<Var
&>(*p_var
);
60 aggr
.setName(var
.getName());
63 switch (snmpAggrType(aggr
.name
, aggr
.name_length
)) {
66 // The mean-average division is done later
67 // when the Snmp::Pdu::fixAggregate() called
94 Snmp::Pdu::assign(const Pdu
& pdu
)
96 command
= pdu
.command
;
97 address
.sin_addr
.s_addr
= pdu
.address
.sin_addr
.s_addr
;
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
;
107 aggrCount
= pdu
.aggrCount
;
108 setSystemOid(pdu
.getSystemOid());
109 setVars(pdu
.variables
);
113 Snmp::Pdu::clearVars()
115 variable_list
* var
= variables
;
116 while (var
!= NULL
) {
117 variable_list
* tmp
= var
;
118 var
= var
->next_variable
;
125 Snmp::Pdu::setVars(variable_list
* vars
)
128 for (variable_list
** p_var
= &variables
; vars
!= NULL
;
129 vars
= vars
->next_variable
, p_var
= &(*p_var
)->next_variable
) {
130 *p_var
= new Var(static_cast<Var
&>(*vars
));
135 Snmp::Pdu::clearSystemOid()
137 if (enterprise
!= NULL
) {
141 enterprise_length
= 0;
145 Snmp::Pdu::getSystemOid() const
147 return Range
<const oid
*>(enterprise
, enterprise
+ enterprise_length
);
151 Snmp::Pdu::setSystemOid(const Range
<const oid
*>& systemOid
)
154 if (systemOid
.start
!= NULL
&& systemOid
.size() != 0) {
155 enterprise_length
= systemOid
.size();
156 enterprise
= static_cast<oid
*>(xmalloc(enterprise_length
* sizeof(oid
)));
157 std::copy(systemOid
.start
, systemOid
.end
, enterprise
);
162 Snmp::Pdu::pack(Ipc::TypedMsgHdr
& msg
) const
168 msg
.putPod(errindex
);
169 msg
.putPod(non_repeaters
);
170 msg
.putPod(max_repetitions
);
171 msg
.putInt(enterprise_length
);
172 if (enterprise_length
> 0) {
173 Must(enterprise
!= NULL
);
174 msg
.putFixed(enterprise
, enterprise_length
* sizeof(oid
));
176 msg
.putPod(agent_addr
);
177 msg
.putPod(trap_type
);
178 msg
.putPod(specific_type
);
180 msg
.putInt(varCount());
181 for (variable_list
* var
= variables
; var
!= NULL
; var
= var
->next_variable
)
182 static_cast<Var
*>(var
)->pack(msg
);
186 Snmp::Pdu::unpack(const Ipc::TypedMsgHdr
& msg
)
193 msg
.getPod(errindex
);
194 msg
.getPod(non_repeaters
);
195 msg
.getPod(max_repetitions
);
196 enterprise_length
= msg
.getInt();
197 if (enterprise_length
> 0) {
198 enterprise
= static_cast<oid
*>(xmalloc(enterprise_length
* sizeof(oid
)));
199 msg
.getFixed(enterprise
, enterprise_length
* sizeof(oid
));
201 msg
.getPod(agent_addr
);
202 msg
.getPod(trap_type
);
203 msg
.getPod(specific_type
);
205 int count
= msg
.getInt();
206 for (variable_list
** p_var
= &variables
; count
> 0;
207 p_var
= &(*p_var
)->next_variable
, --count
) {
208 Var
* var
= new Var();
215 Snmp::Pdu::varCount() const
218 for (variable_list
* var
= variables
; var
!= NULL
; var
= var
->next_variable
)
224 Snmp::Pdu::fixAggregate()
228 for (variable_list
* p_aggr
= variables
; p_aggr
!= NULL
; p_aggr
= p_aggr
->next_variable
) {
229 Var
& aggr
= static_cast<Var
&>(*p_aggr
);
230 if (snmpAggrType(aggr
.name
, aggr
.name_length
) == atAverage
) {