Imported Upstream version 0.3.4
[anytun.git] / src / packetSource.h
index 626a259..bd75be2 100644 (file)
@@ -11,7 +11,7 @@
  *  tunneling and relaying of packets of any protocol.
  *
  *
- *  Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, 
+ *  Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl,
  *                          Christian Pointner <satp@wirdorange.org>
  *
  *  This file is part of Anytun.
 #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
 {
 public:
   virtual ~PacketSource() {}
 
-  virtual u_int32_t recv(u_int8_t* buf, u_int32_t len, PacketSourceEndpoint& remote) = 0;
-  virtual void send(u_int8_t* buf, u_int32_t len, PacketSourceEndpoint remote) = 0;
+  virtual uint32_t recv(uint8_t* buf, uint32_t len, PacketSourceEndpoint& remote) = 0;
+  virtual void send(uint8_t* buf, uint32_t len, PacketSourceEndpoint remote) = 0;
 
   void waitUntilReady();
 
@@ -56,22 +60,39 @@ protected:
 };
 
 class UDPPacketSource : public PacketSource
-{  
+{
 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);
+  uint32_t recv(uint8_t* buf, uint32_t len, PacketSourceEndpoint& remote);
+  void send(uint8_t* buf, uint32_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 {
+    uint8_t* buf_;
+    uint32_t len_;
+    proto::socket* sock_;
+    Semaphore* sem_;
+  } SocketsElement;
+  std::list<SocketsElement> sockets_;
+
+  void recv_thread(std::list<SocketsElement>::iterator it);
+  typedef struct {
+    uint32_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