|
@@ -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
|