diff --git a/src/pqi/pqipersongrp.cc b/src/pqi/pqipersongrp.cc index 7146be7de..0c12d14f5 100644 --- a/src/pqi/pqipersongrp.cc +++ b/src/pqi/pqipersongrp.cc @@ -395,6 +395,21 @@ bool pqipersongrp::getCryptoParams(const RsPeerId& id,RsPeerCryptoParams& params //return locked_getCryptoParams(id,params) ; } +bool pqipersongrp::getPeerTotalTraffic(const RsPeerId& id, uint64_t& in, uint64_t& out) +{ + RsStackMutex stack(coreMtx); /******* LOCKED MUTEX **********/ + + std::map::iterator it = mods.find(id) ; + + if(it == mods.end()) + return false ; + + in = it->second->pqi->getTraffic(true); + out = it->second->pqi->getTraffic(false); + return true; +} + + int pqipersongrp::addPeer(const RsPeerId& id) { pqioutput(PQL_DEBUG_BASIC, pqipersongrpzone, "pqipersongrp::addPeer() PeerId: " + id.toStdString()); diff --git a/src/pqi/pqipersongrp.h b/src/pqi/pqipersongrp.h index 5b57aebb1..f82a987d8 100644 --- a/src/pqi/pqipersongrp.h +++ b/src/pqi/pqipersongrp.h @@ -91,6 +91,7 @@ virtual int tick(); virtual int status(); virtual bool getCryptoParams(const RsPeerId&,RsPeerCryptoParams&) ; + virtual bool getPeerTotalTraffic(const RsPeerId& id, uint64_t& in, uint64_t& out); protected: virtual bool locked_getCryptoParams(const RsPeerId&, RsPeerCryptoParams&) { return false ;} diff --git a/src/retroshare/rsconfig.h b/src/retroshare/rsconfig.h index de304798e..4ce8a329a 100644 --- a/src/retroshare/rsconfig.h +++ b/src/retroshare/rsconfig.h @@ -149,7 +149,8 @@ struct RsConfigDataRates : RsSerializable mAllocTs(0), mRateOut(0), mRateMaxOut(0), mAllowedOut(0), mAllowedTs(0), - mQueueIn(0), mQueueOut(0) + mQueueIn(0), mQueueOut(0), + mTotalIn(0), mTotalOut(0) {} /* all in kB/s */ @@ -168,6 +169,9 @@ struct RsConfigDataRates : RsSerializable int mQueueIn; int mQueueOut; + uint64_t mTotalIn; + uint64_t mTotalOut; + // RsSerializable interface void serial_process(RsGenericSerializer::SerializeJob j, RsGenericSerializer::SerializeContext &ctx) { RS_SERIAL_PROCESS(mRateIn); @@ -184,6 +188,8 @@ struct RsConfigDataRates : RsSerializable RS_SERIAL_PROCESS(mQueueIn); RS_SERIAL_PROCESS(mQueueOut); + RS_SERIAL_PROCESS(mTotalIn); + RS_SERIAL_PROCESS(mTotalOut); } }; diff --git a/src/services/p3bwctrl.cc b/src/services/p3bwctrl.cc index 65add3935..b2df048fb 100644 --- a/src/services/p3bwctrl.cc +++ b/src/services/p3bwctrl.cc @@ -27,6 +27,7 @@ #include "services/p3bwctrl.h" #include "rsitems/rsbwctrlitems.h" +#include "retroshare/rsturtle.h" #include @@ -243,6 +244,25 @@ int p3BandwidthControl::getTotalBandwidthRates(RsConfigDataRates &rates) rates.mQueueIn = mTotalRates.mQueueIn; rates.mQueueOut = mTotalRates.mQueueOut; + /* Sum up traffic from all connected peers */ + std::map::iterator bit; + for(bit = mBwMap.begin(); bit != mBwMap.end(); ++bit) + { + uint64_t tin = 0; + uint64_t tout = 0; + mPg->getPeerTotalTraffic(bit->first, tin, tout); + rates.mTotalIn += tin; + rates.mTotalOut += tout; + } + + if (rsTurtle) + { + TurtleTrafficStatisticsInfo tinfo; + rsTurtle->getTrafficStatistics(tinfo); + rates.mRateIn += tinfo.total_dn_Bps / 1024.0f; + rates.mRateOut += tinfo.total_up_Bps / 1024.0f; + } + return 1; } @@ -269,6 +289,8 @@ int p3BandwidthControl::getAllBandwidthRates(std::mapsecond.mRates.mQueueIn; rates.mQueueOut = bit->second.mRates.mQueueOut; + mPg->getPeerTotalTraffic(bit->first, rates.mTotalIn, rates.mTotalOut); + ratemap[bit->first] = rates; } return true ;