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 #ifndef lint
00036 static const char rcsid[] =
00037 "@(#) $Header: /nfs/jade/vint/CVSROOT/ns-2/tools/loss-monitor.cc,v 1.18 2000/09/01 03:04:06 haoboy Exp $ (LBL)";
00038 #endif
00039
00040 #include <tclcl.h>
00041
00042 #include "agent.h"
00043 #include "config.h"
00044 #include "packet.h"
00045 #include "ip.h"
00046 #include "rtp.h"
00047 #include "loss-monitor.h"
00048
00049 static class LossMonitorClass : public TclClass {
00050 public:
00051 LossMonitorClass() : TclClass("Agent/LossMonitor") {}
00052 TclObject* create(int, const char*const*) {
00053 return (new LossMonitor());
00054 }
00055 } class_loss_mon;
00056
00057 LossMonitor::LossMonitor() : Agent(PT_NTYPE)
00058 {
00059 bytes_ = 0;
00060 nlost_ = 0;
00061 npkts_ = 0;
00062 expected_ = -1;
00063 last_packet_time_ = 0.;
00064 seqno_ = 0;
00065 bind("nlost_", &nlost_);
00066 bind("npkts_", &npkts_);
00067 bind("bytes_", &bytes_);
00068 bind("lastPktTime_", &last_packet_time_);
00069 bind("expected_", &expected_);
00070 }
00071
00072 void LossMonitor::recv(Packet* pkt, Handler*)
00073 {
00074 hdr_rtp* p = hdr_rtp::access(pkt);
00075 seqno_ = p->seqno();
00076 bytes_ += hdr_cmn::access(pkt)->size();
00077 ++npkts_;
00078
00079
00080
00081 if (expected_ >= 0) {
00082 int loss = seqno_ - expected_;
00083 if (loss > 0) {
00084 nlost_ += loss;
00085 Tcl::instance().evalf("%s log-loss", name());
00086 }
00087 }
00088 last_packet_time_ = Scheduler::instance().clock();
00089 expected_ = seqno_ + 1;
00090 Packet::free(pkt);
00091 }
00092
00093
00094
00095
00096
00097 int LossMonitor::command(int argc, const char*const* argv)
00098 {
00099 if (argc == 2) {
00100 if (strcmp(argv[1], "clear") == 0) {
00101 expected_ = -1;
00102 return (TCL_OK);
00103 }
00104 }
00105 return (Agent::command(argc, argv));
00106 }