

Public Member Functions | |
| DSDVTriggerHandler (DSDV_Agent *a_) | |
| virtual void | handle (Event *e) |
Private Attributes | |
| DSDV_Agent * | a |
|
|
Definition at line 143 of file dsdv.cc. References a.
00143 { a = a_; }
|
|
|
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:

|
|
Definition at line 146 of file dsdv.cc. Referenced by DSDVTriggerHandler(), and handle(). |
1.3.3