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 _UDP_CONVERGENCE_LAYER_H_
00039 #define _UDP_CONVERGENCE_LAYER_H_
00040
00041 #include <oasys/io/UDPClient.h>
00042 #include <oasys/thread/Thread.h>
00043 #include <oasys/io/RateLimitedSocket.h>
00044
00045 #include "IPConvergenceLayer.h"
00046
00047 namespace dtn {
00048
00049 class UDPConvergenceLayer : public IPConvergenceLayer {
00050 public:
00054 static const u_int MAX_BUNDLE_LEN = 65507;
00055
00059 UDPConvergenceLayer();
00060
00064 bool interface_up(Interface* iface, int argc, const char* argv[]);
00065
00069 bool interface_down(Interface* iface);
00070
00074 void dump_interface(Interface* iface, oasys::StringBuffer* buf);
00075
00079 bool init_link(Link* link, int argc, const char* argv[]);
00080
00084 void dump_link(Link* link, oasys::StringBuffer* buf);
00085
00090 bool open_contact(const ContactRef& contact);
00091
00095 bool close_contact(const ContactRef& contact);
00096
00100 void send_bundle(const ContactRef& contact, Bundle* bundle);
00101
00111 class Params : public CLInfo {
00112 public:
00113 in_addr_t local_addr_;
00114 u_int16_t local_port_;
00115 in_addr_t remote_addr_;
00116 u_int16_t remote_port_;
00117
00118 u_int32_t rate_;
00119 u_int32_t bucket_depth_;
00120 };
00121
00125 static Params defaults_;
00126
00127 protected:
00128 bool parse_params(Params* params, int argc, const char** argv,
00129 const char** invalidp);
00134 class Receiver : public CLInfo,
00135 public oasys::UDPClient,
00136 public oasys::Thread
00137 {
00138 public:
00142 Receiver(UDPConvergenceLayer::Params* params);
00143
00147 virtual ~Receiver() {}
00148
00158 void run();
00159
00160 UDPConvergenceLayer::Params params_;
00161
00162 protected:
00166 void process_data(u_char* bp, size_t len);
00167 };
00168
00169
00170
00171
00172 class Sender : public CLInfo, public Logger {
00173 public:
00177 virtual ~Sender() {}
00178
00182 bool init(Params* params, in_addr_t addr, u_int16_t port);
00183
00184 private:
00185 friend class UDPConvergenceLayer;
00186
00190 Sender(const ContactRef& contact);
00191
00195 bool send_bundle(Bundle* bundle);
00196
00200 Params* params_;
00201
00205 oasys::UDPClient socket_;
00206
00210 oasys::RateLimitedSocket rate_socket_;
00211
00215 ContactRef contact_;
00216
00222 u_char buf_[UDPConvergenceLayer::MAX_BUNDLE_LEN];
00223 };
00224 };
00225
00226 }
00227
00228 #endif