Snmp::Inquirer::sendResponse()
{
debugs(49, 5, HERE);
+ aggrPdu.fixAggregate();
aggrPdu.command = SNMP_PDU_RESPONSE;
u_char buffer[SNMP_REQUEST_SIZE];
int len = sizeof(buffer);
xmemset(this, 0, sizeof(*this));
errstat = SNMP_DEFAULT_ERRSTAT;
errindex = SNMP_DEFAULT_ERRINDEX;
+ aggrCount = 0;
}
void
Snmp::Pdu::aggregate(const Pdu& pdu)
{
Must(varCount() == pdu.varCount());
+ aggrCount++;
for (variable_list* p_aggr = variables, *p_var = pdu.variables; p_var != NULL;
p_aggr = p_aggr->next_variable, p_var = p_var->next_variable)
{
trap_type = pdu.trap_type;
specific_type = pdu.specific_type;
time = pdu.time;
+ aggrCount = pdu.aggrCount;
setSystemOid(pdu.getSystemOid());
setVars(pdu.variables);
}
++count;
return count;
}
+
+void
+Snmp::Pdu::fixAggregate()
+{
+ if (!aggrCount)
+ return;
+ for (variable_list* p_aggr = variables; p_aggr != NULL; p_aggr = p_aggr->next_variable) {
+ Var& aggr = static_cast<Var&>(*p_aggr);
+ if(snmpAggrType(aggr.name, aggr.name_length) == atAverage) {
+ aggr /= aggrCount;
+ }
+ }
+ aggrCount = 0;
+}
~Pdu();
void aggregate(const Pdu& pdu);
+ void fixAggregate();
void pack(Ipc::TypedMsgHdr& msg) const; ///< prepare for sendmsg()
void unpack(const Ipc::TypedMsgHdr& msg); ///< restore struct from the message
int varCount() const; ///< size of variables list
private:
void init(); ///< initialize members
void assign(const Pdu& pdu); ///< perform full assignment
+ int aggrCount; ///< The number of other Pdus merged into
};
} // namespace Snmp