00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00030 #ifndef QOLYESTER_DAEMON_MSG_MESSAGE_HH
00031 # define QOLYESTER_DAEMON_MSG_MESSAGE_HH 1
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043 # include <list>
00044
00045 # include "net/ipaddress.hh"
00046 # include "utl/data.hh"
00047 # include "utl/seqnum.hh"
00048 # include "utl/timeval.hh"
00049
00050 namespace olsr {
00051
00052 namespace msg {
00053
00054
00055
00060
00061 class Message {
00062 public:
00063 struct header;
00067 virtual ~Message() {}
00068
00069
00070
00071
00072
00077 virtual bool dump(utl::Data&, const address_t&) const = 0;
00078
00087 virtual void inc_seqnum() { ++seqnum; }
00088
00089
00100 static inline void parse(utl::Data d, const address_t& sender,
00101 const address_t& receiver,
00102 const seqnum_t& pseqnum);
00103
00104
00113 static inline void forward(utl::Data& d, const header& mh);
00114
00115
00122 struct raw {
00123 u_int8_t type;
00124 u_int8_t vtime;
00125 u_int16_t size;
00126 u_int8_t addr[ADDRESS_SIZE];
00127 u_int8_t ttl;
00128 u_int8_t hopcount;
00129 u_int16_t seqnum;
00130 u_int8_t data[0];
00131 };
00132
00133 struct header {
00134 header(const address_t& s, const address_t& r, const address_t& o,
00135 const timeval_t& v, const seqnum_t& ps, const seqnum_t& ms,
00136 const unsigned& hopcount)
00137 : sender(s),
00138 receiver(r),
00139 originator(o),
00140 validity(v),
00141 pseqnum(ps),
00142 mseqnum(ms),
00143 hopcount(hopcount)
00144 {}
00145 const address_t& sender;
00146 const address_t& receiver;
00147 const address_t& originator;
00148 const timeval_t& validity;
00149 const seqnum_t& pseqnum;
00150 const seqnum_t& mseqnum;
00151 const unsigned& hopcount;
00152 };
00153
00154 static const ::size_t min_length = sizeof (raw);
00155
00156 protected:
00157 static utl::Seqnum<u_int16_t> seqnum;
00158 };
00159
00160
00161
00162
00171 class UnknownMessage : public Message {
00172 public:
00177 inline UnknownMessage(utl::Data& d);
00178
00182 virtual ~UnknownMessage() {}
00183
00189 virtual inline bool dump(utl::Data& d, const address_t&) const;
00190
00194 virtual void inc_seqnum() {}
00195
00196 private:
00197 utl::Data _data;
00198 };
00199
00200 }
00201
00202 typedef std::list<const msg::Message*> pending_t;
00203
00208 pending_t pending_messages;
00209
00210 }
00211
00212 # include "message.hxx"
00213
00214 #endif // ! QOLYESTER_DAEMON_MSG_MESSAGE_HH