[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Patch to bug in TBF



The following bug has been fixed the following way:

BUG: static variable 'init' is defined in the function TBF::recv.
In C++ there is only one copy of a member function for a given
class (common to all objects), hence the variable is initialised
once when the first TBF object calls the function for the first time.
Subsequent calls to the function by any other TBF object will always
get 'init' with a value of 0. So, any other TBF object won't get
a full bucket the first time it receives a packet.

CONSEQUENCE: TBF objects excluding the first one will get an
undefined value for the variable 'lastupdatetime_' causing a strange
behaviour of the bucket. More precisely 'tokens_' will often have
a big negative value causing the bucket to reject all the traffic.

PATCH: I don't know if the following patch is aesthetically good C++
but it allowed to resolve our previous problems with TBF.

### 'diff -c' for tbf.cc ###

*** tbf.cc      Tue Mar 16 05:20:17 1999
--- ../../ns-2.1b5/tbf.cc       Thu Apr 29 10:02:16 1999
***************
*** 29,35 ****
  #include "queue.h"
  #include "tbf.h"
  
! TBF::TBF() :tokens_(0),tbf_timer_(this)
  {
        q_=new PacketQueue();
        bind_bw("rate_",&rate_);
--- 29,35 ----
  #include "queue.h"
  #include "tbf.h"
  
! TBF::TBF() :tokens_(0),tbf_timer_(this),init(1)
  {
        q_=new PacketQueue();
        bind_bw("rate_",&rate_);
***************
*** 51,58 ****
  
  void TBF::recv(Packet *p, Handler *)
  {
-       static int init=1;
- 
        //start with a full bucket
        if (init) {
                tokens_=bucket_;
--- 51,56 ----

### 'diff -c' for tbf.h ###

*** tbf.h       Tue Mar 16 05:20:17 1999
--- ../../ns-2.1b5/tbf.h        Thu Apr 29 09:31:12 1999
***************
*** 51,56 ****
--- 51,57 ----
        double lastupdatetime_;
        PacketQueue *q_;
        TBF_Timer tbf_timer_;
+       int init;
  };
  
  #endif


Ludovic Kuty
Lidia Yamamoto