00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #ifndef _TCPTUNNEL_H_
00039 #define _TCPTUNNEL_H_
00040
00041 #include <map>
00042 #include <dtn_api.h>
00043
00044 #include <oasys/debug/Log.h>
00045 #include <oasys/io/TCPClient.h>
00046 #include <oasys/io/TCPServer.h>
00047 #include <oasys/thread/MsgQueue.h>
00048 #include <oasys/thread/Thread.h>
00049 #include <oasys/util/ExpandableBuffer.h>
00050
00051 #include "IPTunnel.h"
00052
00053 namespace dtntunnel {
00054
00058 class TCPTunnel : public IPTunnel {
00059 public:
00061 TCPTunnel();
00062
00065 void add_listener(in_addr_t listen_addr, u_int16_t listen_port,
00066 in_addr_t remote_addr, u_int16_t remote_port);
00067
00069 void handle_bundle(dtn::APIBundle* bundle);
00070
00071 protected:
00073 class Listener : public oasys::TCPServerThread {
00074 public:
00075 Listener(TCPTunnel* t,
00076 in_addr_t listen_addr, u_int16_t listen_port,
00077 in_addr_t remote_addr, u_int16_t remote_port);
00078
00079 void accepted(int fd, in_addr_t addr, u_int16_t port);
00080
00081 protected:
00082 TCPTunnel* tcptun_;
00083
00086 in_addr_t listen_addr_;
00087 u_int16_t listen_port_;
00088 in_addr_t remote_addr_;
00089 u_int16_t remote_port_;
00091 };
00092
00094 class Connection : public oasys::Thread, public oasys::Logger {
00095 public:
00098 Connection(TCPTunnel* t, dtn_endpoint_id_t* dest_eid,
00099 in_addr_t client_addr, u_int16_t client_port,
00100 in_addr_t remote_addr, u_int16_t remote_port);
00101
00103 Connection(TCPTunnel* t, dtn_endpoint_id_t* dest_eid, int fd,
00104 in_addr_t client_addr, u_int16_t client_port,
00105 in_addr_t remote_addr, u_int16_t remote_port);
00106
00108 ~Connection();
00109
00111 void handle_bundle(dtn::APIBundle* bundle);
00112
00113 protected:
00114 friend class TCPTunnel;
00115
00117 void run();
00118
00120 TCPTunnel* tcptun_;
00121
00123 oasys::TCPClient sock_;
00124
00126 dtn::APIBundleQueue queue_;
00127
00129 typedef std::map<u_int32_t, dtn::APIBundle*> ReorderTable;
00130 ReorderTable reorder_table_;
00131
00133 u_int32_t next_seqno_;
00134
00136 dtn_endpoint_id_t dest_eid_;
00137 in_addr_t client_addr_;
00138 u_int16_t client_port_;
00139 in_addr_t remote_addr_;
00140 u_int16_t remote_port_;
00141 };
00142
00144 void new_connection(Connection* c);
00145
00147 void kill_connection(Connection* c);
00148
00150 struct ConnKey {
00151 ConnKey()
00152 : client_addr_(INADDR_NONE), client_port_(0),
00153 remote_addr_(INADDR_NONE), remote_port_(0) {}
00154
00155 ConnKey(in_addr_t client_addr, u_int16_t client_port,
00156 in_addr_t remote_addr, u_int16_t remote_port)
00157 : client_addr_(client_addr),
00158 client_port_(client_port),
00159 remote_addr_(remote_addr),
00160 remote_port_(remote_port) {}
00161
00162 bool operator<(const ConnKey& other) const {
00163 return ((client_addr_ < other.client_addr_) ||
00164 (client_port_ < other.client_port_) ||
00165 (remote_addr_ < other.remote_addr_) ||
00166 (remote_port_ < other.remote_port_));
00167 }
00168
00169 in_addr_t client_addr_;
00170 u_int16_t client_port_;
00171 in_addr_t remote_addr_;
00172 u_int16_t remote_port_;
00173 };
00174
00176 typedef std::map<ConnKey, Connection*> ConnTable;
00177 ConnTable connections_;
00178
00180 oasys::SpinLock lock_;
00181 };
00182
00183 }
00184
00185 #endif