22 #ifndef DATAGRAMCONNECTION_H_
23 #define DATAGRAMCONNECTION_H_
27 #include <ibrcommon/thread/Thread.h>
28 #include <ibrcommon/thread/Queue.h>
29 #include <ibrcommon/thread/Conditional.h>
30 #include <ibrcommon/TimeMeasurement.h>
40 class DatagramConnection;
61 static const std::string TAG;
68 void setup()
throw ();
69 void finally()
throw ();
94 void ack(
const unsigned int &seqno);
99 void nack(
const unsigned int &seqno,
const bool temporary);
127 class Stream :
public std::basic_streambuf<char, std::char_traits<char> >,
public std::iostream
158 virtual std::char_traits<char>::int_type overflow(std::char_traits<char>::int_type = std::char_traits<char>::eof());
159 virtual std::char_traits<char>::int_type underflow();
175 std::vector<char> _queue_buf;
181 bool _queue_buf_head;
185 ibrcommon::Conditional _queue_buf_cond;
189 std::vector<char> _out_buf;
193 std::vector<char> _in_buf;
211 class Sender :
public ibrcommon::JoinableThread
220 void skip()
throw ();
223 void finally()
throw ();
226 ibrcommon::Queue<dtn::net::BundleTransfer>
queue;
229 DatagramConnection::Stream &_stream;
245 void adjust_rtt(
double value);
250 bool sw_frames_full();
255 void sw_timeout(
bool last);
258 const std::string _identifier;
259 DatagramConnection::Stream _stream;
260 DatagramConnection::Sender _sender;
262 ibrcommon::Conditional _ack_cond;
263 unsigned int _last_ack;
264 unsigned int _next_seqno;
269 std::vector<char> _head_buf;
283 : flags(0), seqno(0), retry(0) { }
286 virtual ~window_frame() { }
290 std::vector<char> buf;
292 ibrcommon::TimeMeasurement tm;
294 std::list<window_frame> _sw_frames;
void nack(const unsigned int &seqno, const bool temporary)
virtual dtn::core::Node::Protocol getDiscoveryProtocol() const =0
virtual void callback_ack(DatagramConnection &connection, const unsigned int &seqno, const std::string &destination)=0
void queue(const dtn::net::BundleTransfer &job)
virtual void callback_send(DatagramConnection &connection, const char &flags, const unsigned int &seqno, const std::string &destination, const char *buf, const dtn::data::Length &len)=0
virtual void reportSuccess(size_t retries, double rtt)
virtual void connectionUp(const DatagramConnection *conn)=0
virtual void callback_nack(DatagramConnection &connection, const unsigned int &seqno, const std::string &destination)=0
virtual void __cancellation()
virtual ~DatagramConnection()
virtual void connectionDown(const DatagramConnection *conn)=0
DatagramConnection(const std::string &identifier, const DatagramService::Parameter ¶ms, DatagramConnectionCallback &callback)
const dtn::data::EID & getPeerEID()
const std::string & getIdentifier() const
virtual void reportFailure()
void setPeerEID(const dtn::data::EID &peer)
virtual ~DatagramConnectionCallback()
void ack(const unsigned int &seqno)