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 #ifndef ns_rtp_h
00038 #define ns_rtp_h
00039
00040 #include "config.h"
00041 #include "object.h"
00042 #include "agent.h"
00043 #include "timer-handler.h"
00044
00045 #define RTP_M 0x0080 // marker for significant events
00046
00047
00048 struct hdr_rtp {
00049 u_int32_t srcid_;
00050 int seqno_;
00051
00052 u_int16_t flags_;
00053
00054 static int offset_;
00055 inline static int& offset() { return offset_; }
00056 inline static hdr_rtp* access(const Packet* p) {
00057 return (hdr_rtp*) p->access(offset_);
00058 }
00059
00060
00061 u_int32_t& srcid() { return (srcid_); }
00062 int& seqno() { return (seqno_); }
00063 u_int16_t& flags() { return (flags_); }
00064 };
00065
00066 class RTPSource : public TclObject {
00067 public:
00068 RTPSource* next;
00069
00070 RTPSource(u_int32_t srcid);
00071 inline u_int32_t srcid() { return (srcid_); }
00072 inline int np() { return (np_); }
00073 inline int snp() { return (snp_); }
00074 inline int ehsr() { return (ehsr_); }
00075
00076 inline void np(int n) { np_ += n; }
00077 inline void snp(int n) { snp_ = n; }
00078 inline void ehsr(int n) { ehsr_ = n; }
00079 protected:
00080 u_int32_t srcid_;
00081 int np_;
00082 int snp_;
00083 int ehsr_;
00084 };
00085
00086 class RTPSession : public NsObject {
00087 public:
00088 RTPSession();
00089 ~RTPSession();
00090 virtual void recv(Packet* p, Handler*);
00091 virtual void recv_ctrl(Packet* p);
00092 int command(int argc, const char*const* argv);
00093 inline u_int32_t srcid() { return (localsrc_->srcid()); }
00094 int build_report(int bye);
00095 void localsrc_update(int);
00096 protected:
00097 RTPSource* allsrcs_;
00098 RTPSource* localsrc_;
00099 int build_sdes();
00100 int build_bye();
00101 RTPSource* lookup(u_int32_t);
00102 void enter(RTPSource*);
00103 int last_np_;
00104 };
00105
00106 class RTPAgent;
00107
00108 class RTPTimer : public TimerHandler {
00109 public:
00110 RTPTimer(RTPAgent *a) : TimerHandler() { a_ = a; }
00111 protected:
00112 virtual void expire(Event *e);
00113 RTPAgent *a_;
00114 };
00115
00116 class RTPAgent : public Agent {
00117 public:
00118 RTPAgent();
00119 virtual void timeout(int);
00120 virtual void recv(Packet* p, Handler*);
00121 virtual int command(int argc, const char*const* argv);
00122 void advanceby(int delta);
00123 virtual void sendmsg(int nbytes, const char *flags = 0);
00124 protected:
00125 virtual void sendpkt();
00126 virtual void makepkt(Packet*);
00127 void rate_change();
00128 virtual void start();
00129 virtual void stop();
00130 virtual void finish();
00131 RTPSession* session_;
00132 double lastpkttime_;
00133 int seqno_;
00134 int running_;
00135 int random_;
00136 int maxpkts_;
00137 double interval_;
00138 RTPTimer rtp_timer_;
00139 };
00140
00141
00142 #endif