apps/dtntunnel/DTNTunnel.h
changeset 0 2b3e5ec03512
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/dtntunnel/DTNTunnel.h	Thu Apr 21 14:57:45 2011 +0100
@@ -0,0 +1,139 @@
+/*
+ *    Copyright 2006 Intel Corporation
+ * 
+ *    Licensed under the Apache License, Version 2.0 (the "License");
+ *    you may not use this file except in compliance with the License.
+ *    You may obtain a copy of the License at
+ * 
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ */
+
+#ifndef _DTNTUNNEL_H_
+#define _DTNTUNNEL_H_
+
+#include <sys/types.h>
+#include <netinet/in.h>
+#include <netdb.h>
+
+#include <dtn_api.h>
+#include <APIBundleQueue.h>
+#include <oasys/debug/Log.h>
+#include <oasys/thread/Mutex.h>
+#include <oasys/util/App.h>
+#include <oasys/util/Singleton.h>
+
+namespace dtntunnel {
+
+class TCPTunnel;
+class UDPTunnel;
+
+/**
+ * Main wrapper class for the DTN Tunnel.
+ */
+class DTNTunnel : public oasys::App,
+                  public oasys::Singleton<DTNTunnel>
+{
+public:
+    /// Constructor
+    DTNTunnel();
+
+    /// Struct to encapsulate the header sent with each tunneled
+    /// bundle. Note that since it is declared as a packed struct, it
+    /// can be sent over the wire as-is.
+    ///
+    /// XXX/demmer if this is used for non-IP tunnels, the address
+    /// fields will need to be union'd or something like that
+    struct BundleHeader {
+        BundleHeader()
+        {
+            memset(this, 0, sizeof(BundleHeader));
+        }
+        
+        BundleHeader(u_int8_t  protocol,
+                     u_int8_t  eof,
+                     u_int32_t connection_id,
+                     u_int32_t seqno,
+                     u_int32_t client_addr,
+                     u_int32_t remote_addr,
+                     u_int16_t client_port,
+                     u_int16_t remote_port)
+            : protocol_(protocol),
+              eof_(eof),
+              connection_id_(connection_id),
+              seqno_(seqno),
+              client_addr_(client_addr),
+              remote_addr_(remote_addr),
+              client_port_(client_port),
+              remote_port_(remote_port)
+        {
+        }
+
+        u_int8_t  protocol_;
+        u_int8_t  eof_;
+        u_int32_t connection_id_;
+        u_int32_t seqno_;
+        u_int32_t client_addr_;
+        u_int32_t remote_addr_;
+        u_int16_t client_port_;
+        u_int16_t remote_port_;
+                             
+    } __attribute__((packed));
+
+    /// Hook for various tunnel classes to send a bundle. Assumes
+    /// ownership of the passed-in bundle
+    ///
+    /// @return DTN_SUCCESS on success, a DTN_ERRNO value on error
+    int send_bundle(dtn::APIBundle* bundle, dtn_endpoint_id_t* dest_eid);
+
+    /// Called for arriving bundles
+    int handle_bundle(dtn_bundle_spec_t* spec,
+                      dtn_bundle_payload_t* payload);
+
+    /// Main application loop
+    int main(int argc, char* argv[]);
+
+    /// Virtual from oasys::App
+    void fill_options();
+    void validate_options(int argc, char* const argv[], int remainder);
+
+    /// Accessors
+    u_int max_size()              { return max_size_; }
+    u_int delay()                 { return delay_; }
+    dtn_endpoint_id_t* dest_eid() { return &dest_eid_; }
+
+protected:
+    UDPTunnel*          udptunnel_;
+    TCPTunnel*          tcptunnel_;
+
+    dtn_handle_t 	recv_handle_;
+    dtn_handle_t 	send_handle_;
+    oasys::Mutex	send_lock_;
+    bool                listen_;
+    dtn_endpoint_id_t 	local_eid_;
+    dtn_endpoint_id_t 	dest_eid_;
+    bool		custody_;
+    u_int		expiration_;
+    bool                tcp_;
+    bool                udp_;
+    in_addr_t		local_addr_;
+    u_int16_t		local_port_;
+    in_addr_t		remote_addr_;
+    u_int16_t		remote_port_;
+    u_int		delay_;
+    u_int		max_size_;
+    std::string	        tunnel_spec_;
+    bool	        tunnel_spec_set_;
+
+    void init_tunnel();
+    void init_registration();
+};
+
+} // namespace dtntunnel
+
+#endif /* _DTNTUNNEL_H_ */