From: Christos Tsantilas Date: Fri, 21 Jan 2011 14:48:10 +0000 (+0200) Subject: atAverage snmp values return sum not average X-Git-Tag: take03^2~37^2~10 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=e26257b290a05d074816f9bb6e9cd92849d8e5a3;p=thirdparty%2Fsquid.git atAverage snmp values return sum not average --- diff --git a/src/snmpx/Inquirer.cc b/src/snmpx/Inquirer.cc index 0510781f14..2c9fb4b51c 100644 --- a/src/snmpx/Inquirer.cc +++ b/src/snmpx/Inquirer.cc @@ -92,6 +92,7 @@ void Snmp::Inquirer::sendResponse() { debugs(49, 5, HERE); + aggrPdu.fixAggregate(); aggrPdu.command = SNMP_PDU_RESPONSE; u_char buffer[SNMP_REQUEST_SIZE]; int len = sizeof(buffer); diff --git a/src/snmpx/Pdu.cc b/src/snmpx/Pdu.cc index d27c92ba8b..ceea062dc0 100644 --- a/src/snmpx/Pdu.cc +++ b/src/snmpx/Pdu.cc @@ -44,12 +44,14 @@ Snmp::Pdu::init() 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) { @@ -103,6 +105,7 @@ Snmp::Pdu::assign(const Pdu& pdu) trap_type = pdu.trap_type; specific_type = pdu.specific_type; time = pdu.time; + aggrCount = pdu.aggrCount; setSystemOid(pdu.getSystemOid()); setVars(pdu.variables); } @@ -219,3 +222,17 @@ Snmp::Pdu::varCount() const ++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(*p_aggr); + if(snmpAggrType(aggr.name, aggr.name_length) == atAverage) { + aggr /= aggrCount; + } + } + aggrCount = 0; +} diff --git a/src/snmpx/Pdu.h b/src/snmpx/Pdu.h index 2084894b57..f1a4cd46c1 100644 --- a/src/snmpx/Pdu.h +++ b/src/snmpx/Pdu.h @@ -28,6 +28,7 @@ public: ~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 @@ -41,6 +42,7 @@ public: private: void init(); ///< initialize members void assign(const Pdu& pdu); ///< perform full assignment + int aggrCount; ///< The number of other Pdus merged into }; } // namespace Snmp