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

DSDVTriggerHandler Class Reference

Inheritance diagram for DSDVTriggerHandler:

Inheritance graph
[legend]
Collaboration diagram for DSDVTriggerHandler:

Collaboration graph
[legend]
List of all members.

Public Member Functions

 DSDVTriggerHandler (DSDV_Agent *a_)
virtual void handle (Event *e)

Private Attributes

DSDV_Agenta

Constructor & Destructor Documentation

DSDVTriggerHandler::DSDVTriggerHandler DSDV_Agent a_  )  [inline]
 

Definition at line 143 of file dsdv.cc.

References a.

00143 { a = a_; }


Member Function Documentation

void DSDVTriggerHandler::handle Event e  )  [virtual]
 

Implements Handler.

Definition at line 151 of file dsdv.cc.

References a, DSDV_Agent::be_random_, Scheduler::cancel(), DSDV_Agent::cancelTriggersBefore(), Scheduler::clock(), DSDV_BROADCAST_JITTER, DSDV_MIN_TUP_PERIOD, HDR_CMN, DSDV_Agent::helper_, Scheduler::instance(), jitter(), DSDV_Agent::lasttup_, DSDV_Agent::makeUpdate(), DSDV_Agent::myaddr_, DSDV_Agent::periodic_callback_, DSDV_Agent::perup_, Scheduler::schedule(), DSDV_Agent::table_, Connector::target_, Time, DSDV_Agent::tracepkt(), rtable_ent::trigger_event, DSDV_Agent::trigger_handler, and DSDV_Agent::verbose_.

00153 {
00154         //DEBUG
00155         //printf("(%d)-->triggered update with e=%x\n", a->myaddr_,e); 
00156 
00157   Scheduler & s = Scheduler::instance ();
00158   Time now = s.clock ();
00159   rtable_ent *prte;
00160   int update_type;       // we want periodic (=1) or triggered (=0) update?
00161   Time next_possible = a->lasttup_ + DSDV_MIN_TUP_PERIOD;
00162 
00163   for (a->table_->InitLoop(); (prte = a->table_->NextLoop());)
00164           if (prte->trigger_event == e) break;
00165 
00166   assert(prte && prte->trigger_event == e);
00167 
00168   if (now < next_possible)
00169     {
00170             //DEBUG
00171             //printf("(%d)..Re-scheduling triggered update\n",a->myaddr_);
00172       s.schedule(a->trigger_handler, e, next_possible - now);
00173       a->cancelTriggersBefore(next_possible);
00174       return;
00175     }
00176 
00177   update_type = 0;
00178   Packet * p = a->makeUpdate(/*in-out*/update_type);
00179       
00180   if (p != NULL) 
00181     {     
00182       if (update_type == 1)
00183         { // we got a periodic update, though we only asked for triggered
00184           // cancel and reschedule periodic update
00185           s.cancel(a->periodic_callback_);
00186           //DEBUG
00187           //printf("we got a periodic update, though asked for trigg\n");
00188           s.schedule (a->helper_, a->periodic_callback_, 
00189                       a->perup_ * (0.75 + jitter (0.25, a->be_random_)));
00190           if (a->verbose_) a->tracepkt (p, now, a->myaddr_, "PU");        
00191         }
00192       else
00193         {
00194           if (a->verbose_) a->tracepkt (p, now, a->myaddr_, "TU");        
00195         }
00196       assert (!HDR_CMN (p)->xmit_failure_);     // DEBUG 0x2      
00197       s.schedule (a->target_, p, jitter(DSDV_BROADCAST_JITTER, a->be_random_));
00198       
00199       a->lasttup_ = now; // even if we got a full update, it still counts
00200       // for our last triggered update time
00201     }
00202   
00203   // free this event
00204   for (a->table_->InitLoop (); (prte = a->table_->NextLoop ());)
00205     if (prte->trigger_event && prte->trigger_event == e)
00206       {
00207         prte->trigger_event = 0;
00208         delete e;
00209       }
00210 }

Here is the call graph for this function:


Member Data Documentation

DSDV_Agent* DSDVTriggerHandler::a [private]
 

Definition at line 146 of file dsdv.cc.

Referenced by DSDVTriggerHandler(), and handle().


The documentation for this class was generated from the following file:
Generated on Tue Apr 20 12:39:52 2004 for NS2.26SourcesOriginal by doxygen 1.3.3