Imported Upstream version 0.3.3
[anytun.git] / src / packetSource.h
index 626a259..d5ee736 100644 (file)
 #define ANYTUN_packetSource_h_INCLUDED
 
 #include <boost/asio.hpp>
+#include <boost/thread.hpp>
+#include <list>
+#include <queue>
 
 #include "datatypes.h"
 #include "threadUtils.hpp"
 
 // TODO: fix this when other packetSource types are introduced
 typedef boost::asio::ip::udp::endpoint PacketSourceEndpoint;
+typedef boost::asio::ip::udp::resolver::iterator PacketSourceResolverIt;
 
 class PacketSource
 {
@@ -61,17 +65,34 @@ public:
   typedef boost::asio::ip::udp proto;
 
   UDPPacketSource(std::string localaddr, std::string port);
+  ~UDPPacketSource();
 
   u_int32_t recv(u_int8_t* buf, u_int32_t len, PacketSourceEndpoint& remote);
   void send(u_int8_t* buf, u_int32_t len, PacketSourceEndpoint remote);
 
-  void onResolve(const boost::asio::ip::udp::endpoint& e);
+  void onResolve(PacketSourceResolverIt& it);
   void onError(const std::runtime_error& e);
 
 private:
-
   boost::asio::io_service io_service_;
-  proto::socket sock_;
+  
+  typedef struct {
+    u_int8_t* buf_;
+    u_int32_t len_;
+    proto::socket* sock_;
+    Semaphore* sem_;
+  } SocketsElement;
+  std::list<SocketsElement> sockets_;
+
+  void recv_thread(std::list<SocketsElement>::iterator it);
+  typedef struct {
+    u_int32_t len_;
+    PacketSourceEndpoint remote_;
+    std::list<SocketsElement>::iterator it_;
+  } ThreadResult;
+  std::queue<ThreadResult> thread_result_queue_;
+  Mutex thread_result_mutex_;
+  Semaphore thread_result_sem_;
 };
 
 #endif