Main Page | Namespace List | Class Hierarchy | Alphabetical List | Compound List | File List | Compound Members | File Members

RcvBuffer Class Reference

#include <rcvbuf.h>

Collaboration diagram for RcvBuffer:

Collaboration graph
[legend]
List of all members.

Public Member Functions

 RcvBuffer ()
void add_pkt (int, double)
int exists_pkt (int)
void print ()

Public Attributes

int nextpkt_
int maxpkt_
int pkts_recovered_
int duplicates_
double delay_sum_
double max_delay_
double min_delay_

Protected Attributes

Gapgap_
Gaptail_

Constructor & Destructor Documentation

RcvBuffer::RcvBuffer  ) 
 

Definition at line 35 of file rcvbuf.cc.

References delay_sum_, duplicates_, gap_, max_delay_, maxpkt_, min_delay_, nextpkt_, pkts_recovered_, and tail_.

00036 {
00037         nextpkt_ = 0;
00038         maxpkt_ = -1;
00039         duplicates_ = 0;
00040         delay_sum_ = 0.0;
00041         max_delay_ = 0.0;
00042         min_delay_ = 1e6;
00043         pkts_recovered_ = 0;
00044         tail_ = gap_ = 0;
00045 }


Member Function Documentation

void RcvBuffer::add_pkt int  ,
double 
 

Definition at line 50 of file rcvbuf.cc.

References delay_sum_, duplicates_, Gap::end_, exists_pkt(), gap_, max_delay_, maxpkt_, min_delay_, Gap::next_, nextpkt_, pkts_recovered_, Gap::start_, tail_, and Gap::time_.

Referenced by LmsReceiver::recv().

00051 {
00052         Gap     *g, *pg;
00053 
00054         if (exists_pkt (i))
00055                 {
00056                 duplicates_++;
00057                 return;
00058                 }
00059         // common case first: got what we expected
00060         if (i == nextpkt_)
00061                 {
00062                 nextpkt_++;
00063                 if (i == maxpkt_ + 1)
00064                         maxpkt_++;
00065                 return;
00066                 }
00067         // new gap
00068         if (i > nextpkt_)
00069                 {
00070                 g = new Gap;
00071                 g->start_ = nextpkt_;
00072                 g->end_ = i-1;
00073                 g->time_ = tnow;
00074                 g->next_ = 0;
00075 
00076                 if (!gap_)
00077                         gap_ = tail_ = g;
00078                 else    {
00079                         tail_->next_ = g;
00080                         tail_ = g;
00081                         }
00082                 nextpkt_ = i+1;
00083                 return;
00084                 }
00085 
00086         // i < nextpkt_ (a retransmission)
00087 
00088         pkts_recovered_++;
00089 
00090         // is packet part of the first gap?
00091         if (gap_->start_ <= i && i <= gap_->end_)
00092                 {
00093                 double  d = tnow - gap_->time_;
00094 
00095                 if (d > max_delay_)
00096                         max_delay_ = d;
00097                 if (d < min_delay_)
00098                         min_delay_ = d;
00099                 delay_sum_ += d;
00100                 if (i == maxpkt_ + 1)
00101                         {
00102                         maxpkt_++;
00103                         if (++gap_->start_ > gap_->end_)
00104                                 {
00105                                 g = gap_;
00106                                 gap_ = gap_->next_;
00107                                 if (gap_)
00108                                         maxpkt_ = gap_->start_ - 1;
00109                                 else    {
00110                                         maxpkt_ = nextpkt_ - 1;
00111                                         tail_ = 0;
00112                                         }
00113                                 delete g;
00114                                 }
00115                         return;
00116                         }
00117                 g = gap_;
00118                 }
00119         else    {
00120                 double  d;
00121 
00122                 // locate gap this packet belongs to
00123                 pg = gap_;
00124                 g = gap_->next_;
00125                 while (!(i >= g->start_ && i <= g->end_))
00126                         {
00127                         pg = g;
00128                         g = g->next_;
00129                         }
00130                 d = tnow - g->time_;
00131                 delay_sum_ += d;
00132                 if (d > max_delay_) max_delay_ = d;
00133                 if (d < min_delay_) min_delay_ = d;
00134 
00135                 // first packet in gap
00136                 if (g->start_ == i)
00137                         {
00138                         if (++g->start_ > g->end_)
00139                                 {
00140                                 pg->next_ = g->next_;
00141                                 if (tail_ == g)
00142                                         tail_ = pg;
00143                                 delete g;
00144                                 }
00145                         return;
00146                         }
00147                 }
00148         // last packet in gap
00149         if (g->end_ == i)
00150                 {
00151                 g->end_--;
00152                 return;
00153                 }
00154         // a packet in the middle of gap
00155         pg = new Gap;
00156         pg->start_ = i+1;
00157         pg->end_   = g->end_;
00158         pg->time_  = g->time_;
00159         pg->next_  = g->next_;
00160 
00161         g->next_ = pg;
00162         g->end_  = i-1;
00163         if (tail_ == g)
00164                 tail_ = pg;
00165 }

Here is the call graph for this function:

int RcvBuffer::exists_pkt int   ) 
 

Definition at line 171 of file rcvbuf.cc.

References Gap::end_, gap_, maxpkt_, Gap::next_, nextpkt_, and Gap::start_.

Referenced by add_pkt(), LmsReceiver::handle_lms_pkt(), and LmsReceiver::recv().

00172 {
00173         if (i <= maxpkt_)  return 1;
00174         if (i >= nextpkt_) return 0;
00175 
00176         Gap *g;
00177         for (g = gap_; g; g = g->next_)
00178                 if (g->start_ <= i && i <= g->end_)
00179                         return 0;
00180         return 1;
00181 }

void RcvBuffer::print  ) 
 

Definition at line 183 of file rcvbuf.cc.

References Gap::end_, gap_, maxpkt_, Gap::next_, nextpkt_, and Gap::start_.

00184 {
00185         Gap     *g;
00186 
00187         printf ("maxpkt: %d ", maxpkt_);
00188 
00189         for (g = gap_; g; g = g->next_)
00190                 printf ("(%d, %d) ", g->start_, g->end_);
00191 
00192         printf ("nextpkt: %d\n", nextpkt_);
00193 }


Member Data Documentation

double RcvBuffer::delay_sum_
 

Definition at line 44 of file rcvbuf.h.

Referenced by add_pkt(), LmsReceiver::print_all_stats(), LmsReceiver::print_stats(), and RcvBuffer().

int RcvBuffer::duplicates_
 

Definition at line 43 of file rcvbuf.h.

Referenced by add_pkt(), LmsReceiver::print_all_stats(), LmsReceiver::print_stats(), and RcvBuffer().

Gap* RcvBuffer::gap_ [protected]
 

Definition at line 49 of file rcvbuf.h.

Referenced by add_pkt(), exists_pkt(), print(), and RcvBuffer().

double RcvBuffer::max_delay_
 

Definition at line 45 of file rcvbuf.h.

Referenced by add_pkt(), LmsReceiver::print_all_stats(), LmsReceiver::print_stats(), and RcvBuffer().

int RcvBuffer::maxpkt_
 

Definition at line 41 of file rcvbuf.h.

Referenced by add_pkt(), exists_pkt(), print(), LmsReceiver::print_stats(), and RcvBuffer().

double RcvBuffer::min_delay_
 

Definition at line 46 of file rcvbuf.h.

Referenced by add_pkt(), LmsReceiver::print_all_stats(), LmsReceiver::print_stats(), and RcvBuffer().

int RcvBuffer::nextpkt_
 

Definition at line 40 of file rcvbuf.h.

Referenced by add_pkt(), exists_pkt(), print(), LmsReceiver::print_stats(), RcvBuffer(), and LmsReceiver::recv().

int RcvBuffer::pkts_recovered_
 

Definition at line 42 of file rcvbuf.h.

Referenced by add_pkt(), LmsReceiver::print_all_stats(), LmsReceiver::print_stats(), and RcvBuffer().

Gap* RcvBuffer::tail_ [protected]
 

Definition at line 50 of file rcvbuf.h.

Referenced by add_pkt(), and RcvBuffer().


The documentation for this class was generated from the following files:
Generated on Tue Apr 20 13:13:08 2004 for NS2.26SourcesOriginal by doxygen 1.3.3