From 0a195e7bc0e23a5a7978a75befe8843d6e69aecd Mon Sep 17 00:00:00 2001 From: Adam Ierymenko Date: Wed, 22 Oct 2014 09:52:29 -0700 Subject: Some work on simulated net... --- testnet/SimNetSocketManager.hpp | 87 +++++++++++++++++++++++++++++++++-------- 1 file changed, 71 insertions(+), 16 deletions(-) (limited to 'testnet/SimNetSocketManager.hpp') diff --git a/testnet/SimNetSocketManager.hpp b/testnet/SimNetSocketManager.hpp index 22fb4753..031cbd0c 100644 --- a/testnet/SimNetSocketManager.hpp +++ b/testnet/SimNetSocketManager.hpp @@ -28,43 +28,98 @@ #ifndef ZT_SIMNETSOCKETMANAGER_HPP #define ZT_SIMNETSOCKETMANAGER_HPP -#include -#include - #include -#include +#include +#include #include "Constants.hpp" #include "../node/SocketManager.hpp" +#include "../node/Mutex.hpp" +#include "../node/Condition.hpp" namespace ZeroTier { +class SimNet; + /** - * Socket I/O implementation + * Socket manager for an IP endpoint in a simulated network */ class SimNetSocketManager : public SocketManager { + friend class SimNet; + public: + struct TransferStats + { + TransferStats() : received(0),sent(0) {} + unsigned long long received; + unsigned long long sent; + }; + SimNetSocketManager(); virtual ~SimNetSocketManager(); - virtual bool send( - const InetAddress &to, - bool tcp, - bool autoConnectTcp, - const void *msg, - unsigned int msglen); + /** + * @return IP address of this simulated endpoint + */ + inline const InetAddress &address() const { return _address; } - virtual void poll( - unsigned long timeout, - void (*handler)(const SharedPtr &,void *,const InetAddress &,Buffer &), - void *arg); + /** + * @return Local endpoint stats + */ + inline const TransferStats &totals() const { return _totals; } - virtual void whack(); + /** + * @param peer Peer IP address + * @return Transfer stats for this peer + */ + inline TransferStats stats(const InetAddress &peer) const + { + Mutex::Lock _l(_stats_m); + return _stats[peer]; + } + + /** + * @return Network to which this endpoint belongs + */ + inline SimNet *net() const { return _sn; } + /** + * Enqueue data from another endpoint to be picked up on next poll() + * + * @param from Originating endpoint address + * @param data Data + * @param len Length of data in bytes + */ + inline void enqueue(const InetAddress &from,const void *data,unsigned int len) + { + { + Mutex::Lock _l(_inbox_m); + _inbox.push(std::pair< InetAddress,Buffer >(from,Buffer(data,len))); + } + _waitCond.signal(); + } + + virtual bool send(const InetAddress &to,bool tcp,bool autoConnectTcp,const void *msg,unsigned int msglen); + virtual void poll(unsigned long timeout,void (*handler)(const SharedPtr &,void *,const InetAddress &,Buffer &),void *arg); + virtual void whack(); virtual void closeTcpSockets(); private: + // These are set by SimNet after object creation + SimNet *_sn; + InetAddress _address; + + SharedPtr _mySocket; + TransferStats _totals; + + std::queue< std::pair< InetAddress,Buffer > > _inbox; + Mutex _inbox_m; + + std::map< InetAddress,TransferStats > _stats; + Mutex _stats_m; + + Condition _waitCond; }; } // namespace ZeroTier -- cgit v1.2.3