diff options
| author | Adam Ierymenko <adam.ierymenko@gmail.com> | 2014-10-22 09:52:29 -0700 |
|---|---|---|
| committer | Adam Ierymenko <adam.ierymenko@gmail.com> | 2014-10-22 09:52:29 -0700 |
| commit | 0a195e7bc0e23a5a7978a75befe8843d6e69aecd (patch) | |
| tree | 2becb276888e1631ff4b2eb556cc8ac5cacaabfe /testnet/SimNetSocketManager.hpp | |
| parent | ae228ade8cc24108958403e8473f8c2bb0e9646d (diff) | |
| download | infinitytier-0a195e7bc0e23a5a7978a75befe8843d6e69aecd.tar.gz infinitytier-0a195e7bc0e23a5a7978a75befe8843d6e69aecd.zip | |
Some work on simulated net...
Diffstat (limited to 'testnet/SimNetSocketManager.hpp')
| -rw-r--r-- | testnet/SimNetSocketManager.hpp | 87 |
1 files changed, 71 insertions, 16 deletions
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 <stdio.h> -#include <stdlib.h> - #include <map> -#include <stdexcept> +#include <utility> +#include <queue> #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<Socket> &,void *,const InetAddress &,Buffer<ZT_SOCKET_MAX_MESSAGE_LEN> &), - 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<ZT_SOCKET_MAX_MESSAGE_LEN> >(from,Buffer<ZT_SOCKET_MAX_MESSAGE_LEN>(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<Socket> &,void *,const InetAddress &,Buffer<ZT_SOCKET_MAX_MESSAGE_LEN> &),void *arg); + virtual void whack(); virtual void closeTcpSockets(); private: + // These are set by SimNet after object creation + SimNet *_sn; + InetAddress _address; + + SharedPtr<Socket> _mySocket; + TransferStats _totals; + + std::queue< std::pair< InetAddress,Buffer<ZT_SOCKET_MAX_MESSAGE_LEN> > > _inbox; + Mutex _inbox_m; + + std::map< InetAddress,TransferStats > _stats; + Mutex _stats_m; + + Condition _waitCond; }; } // namespace ZeroTier |
