2222#include < retroshare/rsturtle.h>
2323#include " rsserver/p3serverconfig.h"
2424#include " services/p3bwctrl.h"
25+ #include " rsitems/rstrafficstatsitems.h"
2526
2627#include " pqi/authgpg.h"
2728#include " pqi/authssl.h"
@@ -37,7 +38,7 @@ static constexpr float DEFAULT_UPLOAD_KB_RATE = 10000.0;
3738static constexpr float MIN_MINIMAL_RATE = 5.0 ;
3839
3940
40- p3ServerConfig::p3ServerConfig (p3PeerMgr *peerMgr, p3LinkMgr *linkMgr, p3NetMgr *netMgr, pqihandler *pqih, p3GeneralConfig *genCfg)
41+ p3ServerConfig::p3ServerConfig (p3PeerMgr *peerMgr, p3LinkMgr *linkMgr, p3NetMgr *netMgr, pqihandler *pqih, p3GeneralConfig *genCfg, p3ConfigMgr *cfgMgr )
4142 : mPeerMgr(peerMgr), mLinkMgr(linkMgr), mNetMgr(netMgr), mPqiHandler(pqih)
4243 , mGeneralConfig(genCfg)
4344 , configMtx(" p3ServerConfig" )
@@ -46,6 +47,9 @@ p3ServerConfig::p3ServerConfig(p3PeerMgr *peerMgr, p3LinkMgr *linkMgr, p3NetMgr
4647 , mRateDownloadWhenIdle(DEFAULT_DOWNLOAD_KB_RATE), mRateUploadWhenIdle(DEFAULT_UPLOAD_KB_RATE)
4748 , mIsIdle(false ), mOpMode(RsOpMode::FULL)
4849{
50+ // Register with config manager for persistence
51+ if (cfgMgr)
52+ cfgMgr->addConfiguration (" traffic_stats.cfg" , this );
4953}
5054
5155void p3ServerConfig::load_config ()
@@ -184,6 +188,108 @@ int p3ServerConfig::getTrafficInfo(std::list<RSTrafficClue>& out_lst,std::list<R
184188 return 0 ;
185189}
186190
191+ bool p3ServerConfig::getCumulativeTrafficByPeer (std::map<RsPeerId, RsCumulativeTrafficStats>& stats)
192+ {
193+ RsStackMutex stack (configMtx);
194+
195+ // First, update cumulative stats from current traffic clues
196+ std::list<RSTrafficClue> out_lst, in_lst;
197+ if (rsBandwidthControl)
198+ {
199+ rsBandwidthControl->ExtractTrafficInfo (out_lst, in_lst);
200+
201+ rstime_t now = time (nullptr );
202+
203+ // Accumulate outgoing traffic
204+ for (const auto & clue : out_lst)
205+ {
206+ auto & peerStats = mCumulativeTrafficByPeer [clue.peer_id ];
207+ peerStats.bytesOut += clue.size ;
208+ peerStats.countOut += clue.count ;
209+ if (peerStats.firstSeen == 0 ) peerStats.firstSeen = now;
210+ peerStats.lastSeen = now;
211+ }
212+
213+ // Accumulate incoming traffic
214+ for (const auto & clue : in_lst)
215+ {
216+ auto & peerStats = mCumulativeTrafficByPeer [clue.peer_id ];
217+ peerStats.bytesIn += clue.size ;
218+ peerStats.countIn += clue.count ;
219+ if (peerStats.firstSeen == 0 ) peerStats.firstSeen = now;
220+ peerStats.lastSeen = now;
221+ }
222+ }
223+
224+ stats = mCumulativeTrafficByPeer ;
225+ return true ;
226+ }
227+
228+ bool p3ServerConfig::getCumulativeTrafficByService (std::map<uint16_t , RsCumulativeTrafficStats>& stats)
229+ {
230+ RsStackMutex stack (configMtx);
231+
232+ // First, update cumulative stats from current traffic clues
233+ std::list<RSTrafficClue> out_lst, in_lst;
234+ if (rsBandwidthControl)
235+ {
236+ rsBandwidthControl->ExtractTrafficInfo (out_lst, in_lst);
237+
238+ rstime_t now = time (nullptr );
239+
240+ // Accumulate outgoing traffic by service
241+ for (const auto & clue : out_lst)
242+ {
243+ auto & serviceStats = mCumulativeTrafficByService [clue.service_id ];
244+ serviceStats.bytesOut += clue.size ;
245+ serviceStats.countOut += clue.count ;
246+ if (serviceStats.firstSeen == 0 ) serviceStats.firstSeen = now;
247+ serviceStats.lastSeen = now;
248+ }
249+
250+ // Accumulate incoming traffic by service
251+ for (const auto & clue : in_lst)
252+ {
253+ auto & serviceStats = mCumulativeTrafficByService [clue.service_id ];
254+ serviceStats.bytesIn += clue.size ;
255+ serviceStats.countIn += clue.count ;
256+ if (serviceStats.firstSeen == 0 ) serviceStats.firstSeen = now;
257+ serviceStats.lastSeen = now;
258+ }
259+ }
260+
261+ stats = mCumulativeTrafficByService ;
262+ return true ;
263+ }
264+
265+ bool p3ServerConfig::clearCumulativeTraffic (bool clearPeerStats, bool clearServiceStats)
266+ {
267+ RsStackMutex stack (configMtx);
268+
269+ if (clearPeerStats)
270+ mCumulativeTrafficByPeer .clear ();
271+
272+ if (clearServiceStats)
273+ mCumulativeTrafficByService .clear ();
274+
275+ return true ;
276+ }
277+
278+ bool p3ServerConfig::getTotalCumulativeTraffic (RsCumulativeTrafficStats& stats)
279+ {
280+ RsStackMutex stack (configMtx);
281+
282+ stats.clear ();
283+
284+ // Sum up all peer stats
285+ for (const auto & pair : mCumulativeTrafficByPeer )
286+ {
287+ stats += pair.second ;
288+ }
289+
290+ return true ;
291+ }
292+
187293int p3ServerConfig::getTotalBandwidthRates (RsConfigDataRates &rates)
188294{
189295 if (rsBandwidthControl)
@@ -562,3 +668,45 @@ void p3ServerConfig::setIsIdle(bool isIdle)
562668 mIsIdle = isIdle;
563669}
564670
671+ /* ******************** p3Config persistence methods *******/
672+
673+ RsSerialiser *p3ServerConfig::setupSerialiser ()
674+ {
675+ RsSerialiser *rss = new RsSerialiser ();
676+ rss->addSerialType (new RsTrafficStatsSerialiser ());
677+ return rss;
678+ }
679+
680+ bool p3ServerConfig::saveList (bool &cleanup, std::list<RsItem *>& items)
681+ {
682+ cleanup = true ;
683+
684+ RsTrafficStatsConfigItem *item = new RsTrafficStatsConfigItem ();
685+ {
686+ RsStackMutex stack (configMtx);
687+ item->peerStats = mCumulativeTrafficByPeer ;
688+ item->serviceStats = mCumulativeTrafficByService ;
689+ }
690+ items.push_back (item);
691+
692+ return true ;
693+ }
694+
695+ bool p3ServerConfig::loadList (std::list<RsItem *>& load)
696+ {
697+ RsStackMutex stack (configMtx);
698+
699+ for (auto it = load.begin (); it != load.end (); ++it)
700+ {
701+ RsTrafficStatsConfigItem *item = dynamic_cast <RsTrafficStatsConfigItem*>(*it);
702+ if (item)
703+ {
704+ mCumulativeTrafficByPeer = item->peerStats ;
705+ mCumulativeTrafficByService = item->serviceStats ;
706+ }
707+ delete *it;
708+ }
709+ load.clear ();
710+
711+ return true ;
712+ }
0 commit comments