fsm.cc

Go to the documentation of this file.
00001 /* -*-  Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- */
00002 
00003 /*
00004  * Copyright (C) 1999 by the University of Southern California
00005  * $Id: fsm.cc,v 1.12 2005/08/25 18:58:02 johnh Exp $
00006  *
00007  * This program is free software; you can redistribute it and/or
00008  * modify it under the terms of the GNU General Public License,
00009  * version 2, as published by the Free Software Foundation.
00010  *
00011  * This program is distributed in the hope that it will be useful,
00012  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00013  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014  * GNU General Public License for more details.
00015  *
00016  * You should have received a copy of the GNU General Public License along
00017  * with this program; if not, write to the Free Software Foundation, Inc.,
00018  * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
00019  *
00020  *
00021  * The copyright of this module includes the following
00022  * linking-with-specific-other-licenses addition:
00023  *
00024  * In addition, as a special exception, the copyright holders of
00025  * this module give you permission to combine (via static or
00026  * dynamic linking) this module with free software programs or
00027  * libraries that are released under the GNU LGPL and with code
00028  * included in the standard release of ns-2 under the Apache 2.0
00029  * license or under otherwise-compatible licenses with advertising
00030  * requirements (or modified versions of such code, with unchanged
00031  * license).  You may copy and distribute such a system following the
00032  * terms of the GNU GPL for this module and the licenses of the
00033  * other code concerned, provided that you include the source code of
00034  * that other code when and as the GNU GPL requires distribution of
00035  * source code.
00036  *
00037  * Note that people who make modified versions of this module
00038  * are not obligated to grant this special exception for their
00039  * modified versions; it is their choice whether to do so.  The GNU
00040  * General Public License gives permission to release a modified
00041  * version without this exception; this exception also makes it
00042  * possible to release a modified version which carries forward this
00043  * exception.
00044  *
00045  */
00046 
00047 /* 
00048  * Contributed by Polly Huang (USC/ISI), http://www-scf.usc.edu/~bhuang
00049  * 
00050  * @(#) $Header: /nfs/jade/vint/CVSROOT/ns-2/common/fsm.cc,v 1.12 2005/08/25 18:58:02 johnh Exp $ (LBL)
00051  */
00052 
00053 /*
00054  * The contents of this file are described in the paper:
00055  *   Polly Huang and John Heidemann.
00056  *     Capturing TCP Burstiness in Light-weight Simulations.
00057  *     In Proceedings of the SCS Conference on Communication Networks and Distributed Systems Modeling and Simulation, pp. 90-96.
00058  *     Phoenix, Arizona, USA, USC/Information Sciences Institute, Society for Computer Simulation.
00059  *     January, 2001.
00060  *     <http://www.isi.edu/~johnh/PAPERS/Huang01a.html>.
00061  *
00062  * (Although this code talks about FSMs or Finite-State Machines,
00063  * the paper uses the term FSA or Finite-State Automoton.)
00064  */
00065 
00066 #include "fsm.h"
00067 #include <assert.h>
00068 
00069 
00070 #ifndef MAX
00071 #define MAX(a, b)  (((a) > (b)) ? (a) : (b))
00072 #endif
00073 #ifndef MIN
00074 #define MIN(a, b)  (((a) < (b)) ? (a) : (b))
00075 #endif
00076 
00077 
00078 FSM* FSM::instance_;
00079 TahoeAckFSM* TahoeAckFSM::instance_;
00080 RenoAckFSM* RenoAckFSM::instance_;
00081 TahoeDelAckFSM* TahoeDelAckFSM::instance_;
00082 RenoDelAckFSM* RenoDelAckFSM::instance_;
00083 
00084 
00085 
00086 void
00087 FSMState::number_all()
00088 {
00089     if (processed())
00090         return;
00091     static int next_i = 0;
00092     print_i_ = ++next_i;
00093     //
00094     int i;
00095     for (i = 0; i < 17; i++)
00096         if (drop_[i])
00097             drop_[i]->number_all();
00098 }
00099 
00100 void
00101 FSMState::reset_all_processed()
00102 {
00103     if (print_i_ == 0)
00104         number_all();
00105     // requires a full traversal always to work
00106     if (!processed())
00107         return;
00108     print_i_ = -print_i_;
00109     int i;
00110     for (i = 0; i < 17; i++)
00111         if (drop_[i])
00112             drop_[i]->reset_all_processed();
00113 }
00114 
00115 void
00116 FSMState::print_all(int level)
00117 {
00118     if (processed())
00119         return;
00120 
00121     const int SPACES_PER_LEVEL = 2;
00122     printf("#%-2d %*s %d:\n", print_i_, level * SPACES_PER_LEVEL + 1, " ", batch_size_);
00123     int i;
00124     for (i = 0; i <= batch_size_; i++) {
00125         static char *delay_names[] = {"done", "error", "RTT", "timeout" };
00126         assert(transition_[i] >= -1 && transition_[i] <= TIMEOUT);
00127         printf("   %*s %d %s -> #%d\n", level * SPACES_PER_LEVEL + 3, " ",
00128                i,
00129                delay_names[transition_[i]+1],
00130                drop_[i] ? drop_[i]->print_i_ : 0);
00131         if (drop_[i])
00132             drop_[i]->print_all(level + 1);
00133     };
00134 }
00135 
00136 static void
00137 report_stat_terminus(int desired_pkts,  // # needed
00138               int pkts,         // # got so far
00139               int rtts,     // # of rtt events
00140               int timeouts,     // # of to events
00141               int ps,       // # of times taken a prob. p event (pkt received OK)
00142               int qs,       // # of times taken a prob. q event (pkt dropped OK)
00143               int num_states,   // size of the stack
00144               int num_state_names,
00145              FSMState **states,
00146              char *state_names)
00147 {
00148     // print states and probability
00149     printf("%s: p^%d*q^%d, %d rtt, %d timeouts, %d states:",
00150            (pkts > desired_pkts ? "exceeded-pkts" :
00151             (pkts == desired_pkts ? "desired_pkts" : "unimplemented-qs")),
00152            ps, qs,
00153            rtts, timeouts,
00154            num_states);
00155     char ch = ' ';
00156     int i;
00157     for (i = 0; i < num_states; i++) {
00158         printf ("%c#%d", ch, states[i]->print_i_);
00159         ch = ',';
00160     };
00161     printf(" [%.*s]\n", num_state_names, state_names);
00162 }
00163 
00164 /*
00165  * FSMState::print_all_stats:
00166  * Walk through the tcp state table exhaustively.
00167  * Recurse to handle errors.
00168  * Very hairy.
00169  * johnh.
00170  */
00171 void
00172 FSMState::print_all_stats(int desired_pkts_total,   // # needed
00173               int pkts,         // # got so far
00174               int rtts,     // # of rtt events
00175               int timeouts,     // # of to events
00176               int ps,       // # of times taken a prob. p event (pkt received OK)
00177               int qs,       // # of times taken a prob. q event (pkt dropped OK)
00178               int num_states,   // size of the stack
00179               int num_state_names)
00180 {
00181     int i;
00182 #define LARGER_NUMBER_OF_STATES 31   // was 17
00183     static FSMState *states[LARGER_NUMBER_OF_STATES];
00184     static char state_names[LARGER_NUMBER_OF_STATES*4]; // xxx: this is just some random big size :-(
00185 
00186     if (pkts >= desired_pkts_total || qs > 5) {
00187         // done; print states and probability
00188         // (give up when we're where we want to be [good],
00189         // or we've taken too many losses [to prevent recursion])
00190         report_stat_terminus(desired_pkts_total, pkts, rtts, timeouts, ps, qs, num_states, num_state_names, states, state_names);
00191         return;
00192     };
00193 
00194     // remember us!
00195     states[num_states] = this;
00196     num_states++;
00197 
00198 
00199     // xxx: doesn't handle TCP tail behavior
00200 
00201     //
00202     // first, consider the no-loss case
00203     //
00204     int desired_pkts_remaining = desired_pkts_total - pkts;
00205     int desired_pkts_this_round = MIN(desired_pkts_remaining, batch_size_);
00206     for (i = 0; i< desired_pkts_this_round; i++)
00207         state_names[num_state_names + i] = 's';
00208     if (desired_pkts_remaining > desired_pkts_this_round) {
00209         // more to do?  take a rtt hit and keep going
00210         state_names[num_state_names + desired_pkts_this_round] = '.';
00211         drop_[0]->print_all_stats(desired_pkts_total,
00212                       pkts + desired_pkts_this_round,
00213                       rtts + 1, timeouts,
00214                       ps + desired_pkts_this_round, qs,
00215                       num_states,
00216                       num_state_names + desired_pkts_this_round + 1);
00217     } else {
00218         // no more to do... report out
00219         report_stat_terminus(desired_pkts_total,
00220                      pkts + desired_pkts_this_round,
00221                      rtts, timeouts,
00222                      ps + desired_pkts_this_round, qs,
00223                      num_states,
00224                      num_state_names + desired_pkts_this_round,
00225                      states,
00226                      state_names);
00227     };
00228 
00229     //
00230     // now consider losses
00231     //
00232     int desired_pkts_with_loss = MAX(desired_pkts_this_round - 1, 0);
00233     // loop through losing the i'th packet for all possible i's.
00234     // Can't loop through more than we could have sent.
00235     for (i = 1; i <= desired_pkts_this_round; i++) {
00236         // keep track of sending patterns
00237         if (i > 1)
00238             state_names[num_state_names + i - 2] = 's';
00239         state_names[num_state_names + i - 1] = 'd';
00240         state_names[num_state_names + desired_pkts_this_round] = (transition_[i] == RTT ? '.' : '-');
00241         // can we even have any?
00242         if (qs) {
00243             // not if we already had one!
00244             report_stat_terminus(desired_pkts_total,
00245                          pkts + i - 1,
00246                          rtts, timeouts,
00247                          ps + i - 1, qs + 1,
00248                          num_states,
00249                          num_state_names + i,
00250                          states,
00251                          state_names);
00252         } else {
00253             // recurse... assume the rest made it
00254             drop_[i]->print_all_stats(desired_pkts_total, pkts + desired_pkts_with_loss,
00255                       rtts + (transition_[i] == RTT ? 1 : 0),
00256                       timeouts + (transition_[i] == TIMEOUT ? 1 : 0),
00257                       ps + desired_pkts_with_loss, qs + 1,
00258                       num_states,
00259                       num_state_names + desired_pkts_this_round + 1);
00260             // 2nd drop somewhere in this round?
00261             int remaining_pkts_this_round = desired_pkts_this_round - i;
00262             if (qs == 0 && remaining_pkts_this_round > 0) {
00263                 // yes, generate the probs
00264                 int j;
00265                 for (j = i+1; j <= desired_pkts_this_round; j++) {
00266                     if (j > i+1)
00267                         state_names[num_state_names + j - 1] = 's';
00268                     state_names[num_state_names + j] = 'd';
00269                     report_stat_terminus(desired_pkts_total,
00270                                  pkts + j - 2,
00271                                  rtts, timeouts,
00272                                  ps + j - 2, qs + 2,
00273                                  num_states,
00274                                  num_state_names + j,
00275                                  states,
00276                                  state_names);
00277                 };
00278             };
00279         };
00280     };
00281 }
00282 
00283 
00284 void
00285 FSM::print_FSM(FSMState* state)
00286 {
00287 #if 0
00288     int i;
00289 
00290     if (state != NULL) {
00291         for (i=0; i<17; i++) {
00292             if (state->drop_[i] != NULL) {
00293                 if (i==0) 
00294                     printf("%d->(%d) ", state->transition_[i], state->drop_[i]->batch_size_);
00295                 else
00296                     printf("\n%d->(%d) ", state->transition_[i], state->drop_[i]->batch_size_);
00297                 print_FSM(state->drop_[i]);
00298             }
00299         }
00300     }
00301 #else /* ! 0 */
00302     state->reset_all_processed();
00303     state->print_all(0);
00304 #endif /* 0 */
00305 }
00306 
00307 void
00308 FSM::print_FSM_stats(FSMState* state, int n)
00309 {
00310     state->reset_all_processed();
00311     state->print_all_stats(n);
00312     fflush(stdout);
00313 }
00314 
00315 static class TahoeAckFSMClass : public TclClass {
00316 public:
00317         TahoeAckFSMClass() : TclClass("FSM/TahoeAck") {}
00318         TclObject* create(int , const char*const*) {
00319                 return (new TahoeAckFSM);
00320         }
00321 } class_tahoeackfsm;
00322 
00323 static class RenoAckFSMClass : public TclClass {
00324 public:
00325         RenoAckFSMClass() : TclClass("FSM/RenoAck") {}
00326         TclObject* create(int , const char*const*) {
00327                 return (new RenoAckFSM);
00328         }
00329 } class_renoackfsm;
00330 
00331 static class TahoeDelAckFSMClass : public TclClass {
00332 public:
00333         TahoeDelAckFSMClass() : TclClass("FSM/TahoeDelAck") {}
00334         TclObject* create(int , const char*const*) {
00335                 return (new TahoeDelAckFSM);
00336         }
00337 } class_tahoedelackfsm;
00338 
00339 static class RenoDelAckFSMClass : public TclClass {
00340 public:
00341         RenoDelAckFSMClass() : TclClass("FSM/RenoDelAck") {}
00342         TclObject* create(int , const char*const*) {
00343                 return (new RenoDelAckFSM);
00344         }
00345 } class_renodelackfsm;
00346 
00347 
00348 // ***********************************************
00349 // Tahoe-Ack TCP Connection Finite State Machine *
00350 // ***********************************************
00351 TahoeAckFSM::TahoeAckFSM() : FSM(), start_state_(NULL) 
00352 {
00353     int i;
00354     FSMState* tmp;
00355 
00356 
00357     instance_ = this;
00358     // (wnd, ssh) == (1, 20)
00359     start_state_ = new FSMState;
00360     //printf("creating Tahoe Ack FSM\n"); 
00361     for (i=0; i<17; i++) {
00362         start_state_->drop_[i] = NULL;
00363         start_state_->transition_[i] = -1;
00364     }
00365     start_state_->batch_size_ = 1;
00366 
00367     // (wnd, ssh) == (2, 20)
00368     tmp = new FSMState;
00369     for (i=0; i<17; i++) {
00370         tmp->drop_[i] = NULL;
00371         tmp->transition_[i] = -1;
00372     }
00373     tmp->batch_size_ = 2;
00374     start_state_->drop_[0] = tmp;
00375     start_state_->transition_[0] = RTT;
00376 
00377     tmp = new FSMState;
00378     for (i=0; i<17; i++) {
00379         tmp->drop_[i] = NULL;
00380         tmp->transition_[i] = -1;
00381     }
00382     tmp->batch_size_ = 2;
00383     start_state_->drop_[0]->drop_[2] = tmp;
00384     start_state_->drop_[0]->transition_[2] = RTT;
00385 
00386     // (wnd, ssh) == (4, 20)
00387     tmp = new FSMState;
00388     for (i=0; i<17; i++) {
00389         tmp->drop_[i] = NULL;
00390         tmp->transition_[i] = -1;
00391     }
00392     tmp->batch_size_ = 4;
00393     start_state_->drop_[0]->drop_[0] = tmp;
00394     start_state_->drop_[0]->transition_[0] = RTT;
00395 
00396     tmp = new FSMState;
00397     for (i=0; i<17; i++) {
00398         tmp->drop_[i] = NULL;
00399         tmp->transition_[i] = -1;
00400     }
00401     tmp->batch_size_ = 2;
00402     start_state_->drop_[0]->drop_[0]->drop_[2] = tmp;
00403     start_state_->drop_[0]->drop_[0]->transition_[2] = RTT;
00404 
00405     tmp = new FSMState;
00406     for (i=0; i<17; i++) {
00407         tmp->drop_[i] = NULL;
00408         tmp->transition_[i] = -1;
00409     }
00410     tmp->batch_size_ = 4;
00411     start_state_->drop_[0]->drop_[0]->drop_[3] = tmp;
00412     start_state_->drop_[0]->drop_[0]->transition_[3] = RTT;
00413 
00414     tmp = new FSMState;
00415     for (i=0; i<17; i++) {
00416         tmp->drop_[i] = NULL;
00417         tmp->transition_[i] = -1;
00418     }
00419     tmp->batch_size_ = 6;
00420     start_state_->drop_[0]->drop_[0]->drop_[4] = tmp;
00421     start_state_->drop_[0]->drop_[0]->transition_[4] = RTT;
00422 
00423     //(wnd, ssh) == (8, 20)
00424     tmp = new FSMState;
00425     for (i=0; i<17; i++) {
00426         tmp->drop_[i] = NULL;
00427         tmp->transition_[i] = -1;
00428     }
00429     tmp->batch_size_ = 8;
00430     start_state_->drop_[0]->drop_[0]->drop_[0] = tmp;
00431     start_state_->drop_[0]->drop_[0]->transition_[0] = RTT;
00432 
00433     tmp = new FSMState;
00434     for (i=0; i<17; i++) {
00435         tmp->drop_[i] = NULL;
00436         tmp->transition_[i] = -1;
00437     }
00438     tmp->batch_size_ = 2;
00439     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[2] = tmp;
00440     start_state_->drop_[0]->drop_[0]->drop_[0]->transition_[2] = RTT;
00441 
00442     tmp = new FSMState;
00443     for (i=0; i<17; i++) {
00444         tmp->drop_[i] = NULL;
00445         tmp->transition_[i] = -1;
00446     }
00447     tmp->batch_size_ = 4;
00448     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[3] = tmp;
00449     start_state_->drop_[0]->drop_[0]->drop_[0]->transition_[3] = RTT;
00450 
00451     tmp = new FSMState;
00452     for (i=0; i<17; i++) {
00453         tmp->drop_[i] = NULL;
00454         tmp->transition_[i] = -1;
00455     }
00456     tmp->batch_size_ = 6;
00457     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[4] = tmp;
00458     start_state_->drop_[0]->drop_[0]->drop_[0]->transition_[4] = RTT;
00459 
00460     tmp = new FSMState;
00461     for (i=0; i<17; i++) {
00462         tmp->drop_[i] = NULL;
00463         tmp->transition_[i] = -1;
00464     }
00465     tmp->batch_size_ = 8;
00466     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[5] = tmp;
00467     start_state_->drop_[0]->drop_[0]->drop_[0]->transition_[5] = RTT;
00468 
00469     tmp = new FSMState;
00470     for (i=0; i<17; i++) {
00471         tmp->drop_[i] = NULL;
00472         tmp->transition_[i] = -1;
00473     }
00474     tmp->batch_size_ = 10;
00475     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[6] = tmp;
00476     start_state_->drop_[0]->drop_[0]->drop_[0]->transition_[6] = RTT;
00477 
00478     tmp = new FSMState;
00479     for (i=0; i<17; i++) {
00480         tmp->drop_[i] = NULL;
00481         tmp->transition_[i] = -1;
00482     }
00483     tmp->batch_size_ = 12;
00484     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[7] = tmp;
00485     start_state_->drop_[0]->drop_[0]->drop_[0]->transition_[7] = RTT;
00486 
00487     tmp = new FSMState;
00488     for (i=0; i<17; i++) {
00489         tmp->drop_[i] = NULL;
00490         tmp->transition_[i] = -1;
00491     }
00492     tmp->batch_size_ = 14;
00493     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[8] = tmp;
00494     start_state_->drop_[0]->drop_[0]->drop_[0]->transition_[8] = RTT;
00495 
00496     //(wnd, ssh) == (16, 20)
00497     tmp = new FSMState;
00498     for (i=0; i<17; i++) {
00499         tmp->drop_[i] = NULL;
00500         tmp->transition_[i] = -1;
00501     }
00502     tmp->batch_size_ = 16;
00503     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0] = tmp;
00504     start_state_->drop_[0]->drop_[0]->drop_[0]->transition_[0] = RTT;
00505 
00506     tmp = new FSMState;
00507     for (i=0; i<17; i++) {
00508         tmp->drop_[i] = NULL;
00509         tmp->transition_[i] = -1;
00510     }
00511     tmp->batch_size_ = 1;
00512     for (i=1; i<17; i++) start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[i] = tmp;
00513     for (i=1; i<14; i++)
00514         start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->transition_[i] = RTT;
00515     for (i=14; i<17; i++)
00516         start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->transition_[i] = TIMEOUT;
00517 
00518 
00519     //(wnd, ssh) == (1, 2), timeout
00520     tmp = new FSMState;
00521     for (i=0; i<17; i++) {
00522         tmp->drop_[i] = NULL;
00523         tmp->transition_[i] = -1;
00524     }
00525     tmp->batch_size_ = 1;
00526     start_state_->drop_[1] = tmp;
00527     start_state_->transition_[1] = TIMEOUT;
00528     start_state_->drop_[0]->drop_[1] = tmp;
00529     start_state_->drop_[0]->transition_[1] = TIMEOUT;
00530     start_state_->drop_[0]->drop_[2]->drop_[0] = tmp;
00531     start_state_->drop_[0]->drop_[2]->transition_[0] = TIMEOUT;
00532     start_state_->drop_[0]->drop_[0]->drop_[1] = tmp;
00533     start_state_->drop_[0]->drop_[0]->transition_[1] = RTT;
00534     start_state_->drop_[0]->drop_[0]->drop_[2]->drop_[0] = tmp;
00535     start_state_->drop_[0]->drop_[0]->drop_[2]->transition_[0] = RTT;
00536 
00537     //(wnd, ssh) == (2, 2)
00538     tmp = new FSMState;
00539     for (i=0; i<17; i++) {
00540         tmp->drop_[i] = NULL;
00541         tmp->transition_[i] = -1;
00542     }
00543     tmp->batch_size_ = 2;
00544     start_state_->drop_[1]->drop_[0] = tmp;
00545     start_state_->drop_[1]->transition_[0] = RTT;
00546 
00547     //(wnd, ssh) == (2.5, 2)
00548     tmp = new FSMState;
00549     for (i=0; i<17; i++) {
00550         tmp->drop_[i] = NULL;
00551         tmp->transition_[i] = -1;
00552     }
00553     tmp->batch_size_ = 2;
00554     start_state_->drop_[1]->drop_[0]->drop_[0] = tmp;
00555     start_state_->drop_[1]->drop_[0]->transition_[0] = RTT;
00556 
00557     //(wnd, ssh) == (3, 2)
00558     tmp = new FSMState;
00559     for (i=0; i<17; i++) {
00560         tmp->drop_[i] = NULL;
00561         tmp->transition_[i] = -1;
00562     }
00563     tmp->batch_size_ = 3;
00564     start_state_->drop_[1]->drop_[0]->drop_[0]->drop_[0] = tmp;
00565     start_state_->drop_[1]->drop_[0]->drop_[0]->transition_[0] = RTT;
00566 
00567     //(wnd, ssh) == (4, 2)
00568     tmp = new FSMState;
00569     for (i=0; i<17; i++) {
00570         tmp->drop_[i] = NULL;
00571         tmp->transition_[i] = -1;
00572     }
00573     tmp->batch_size_ = 4;
00574     start_state_->drop_[1]->drop_[0]->drop_[0]->drop_[0]->drop_[0] = tmp;
00575     start_state_->drop_[1]->drop_[0]->drop_[0]->drop_[0]->transition_[0] = RTT;
00576 
00577     //(wnd, ssh) == (5, 2)
00578     tmp = new FSMState;
00579     for (i=0; i<17; i++) {
00580         tmp->drop_[i] = NULL;
00581         tmp->transition_[i] = -1;
00582     }
00583     tmp->batch_size_ = 5;
00584     start_state_->drop_[1]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0] = tmp;
00585     start_state_->drop_[1]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->transition_[0] = RTT;
00586 
00587     //(wnd, ssh) == (6, 2)
00588     tmp = new FSMState;
00589     for (i=0; i<17; i++) {
00590         tmp->drop_[i] = NULL;
00591         tmp->transition_[i] = -1;
00592     }
00593     tmp->batch_size_ = 6;
00594     start_state_->drop_[1]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0] = tmp;
00595     start_state_->drop_[1]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->transition_[0] = RTT;
00596 
00597     //(wnd, ssh) == (7, 2)
00598     tmp = new FSMState;
00599     for (i=0; i<17; i++) {
00600         tmp->drop_[i] = NULL;
00601         tmp->transition_[i] = -1;
00602     }
00603     tmp->batch_size_ = 7;
00604     start_state_->drop_[1]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0] = tmp;
00605     start_state_->drop_[1]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->transition_[0] = RTT;
00606 
00607     //(wnd, ssh) == (7, 2)
00608     tmp = new FSMState;
00609     for (i=0; i<17; i++) {
00610         tmp->drop_[i] = NULL;
00611         tmp->transition_[i] = -1;
00612     }
00613     tmp->batch_size_ = 7;
00614     start_state_->drop_[1]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0] = tmp;
00615     start_state_->drop_[1]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->transition_[0] = RTT;
00616 
00617 
00618     //(wnd, ssh) == (1, 3)
00619     tmp = new FSMState;
00620     for (i=0; i<17; i++) {
00621         tmp->drop_[i] = NULL;
00622         tmp->transition_[i] = -1;
00623     }
00624     tmp->batch_size_ = 1;
00625     start_state_->drop_[0]->drop_[0]->drop_[3]->drop_[0] = tmp;
00626     start_state_->drop_[0]->drop_[0]->drop_[3]->transition_[0] = RTT;
00627     start_state_->drop_[0]->drop_[0]->drop_[4]->drop_[0] = tmp;
00628     start_state_->drop_[0]->drop_[0]->drop_[4]->transition_[0] = RTT;
00629 
00630     tmp = new FSMState;
00631     for (i=0; i<17; i++) {
00632         tmp->drop_[i] = NULL;
00633         tmp->transition_[i] = -1;
00634     }
00635     tmp->batch_size_ = 2;
00636     start_state_->drop_[0]->drop_[0]->drop_[3]->drop_[0]->drop_[0] = tmp;
00637     start_state_->drop_[0]->drop_[0]->drop_[3]->drop_[0]->transition_[0] = RTT;
00638 
00639     tmp = new FSMState;
00640     for (i=0; i<17; i++) {
00641         tmp->drop_[i] = NULL;
00642         tmp->transition_[i] = -1;
00643     }
00644     tmp->batch_size_ = 3;
00645     start_state_->drop_[0]->drop_[0]->drop_[3]->drop_[0]->drop_[0]->drop_[0] = tmp;
00646     start_state_->drop_[0]->drop_[0]->drop_[3]->drop_[0]->drop_[0]->transition_[0] = RTT;
00647 
00648     tmp = new FSMState;
00649     for (i=0; i<17; i++) {
00650         tmp->drop_[i] = NULL;
00651         tmp->transition_[i] = -1;
00652     }
00653     tmp->batch_size_ = 4;
00654     start_state_->drop_[0]->drop_[0]->drop_[3]->drop_[0]->drop_[0]->drop_[0]->drop_[0] = tmp;
00655     start_state_->drop_[0]->drop_[0]->drop_[3]->drop_[0]->drop_[0]->drop_[0]->transition_[0] = RTT;
00656 
00657     tmp = new FSMState;
00658     for (i=0; i<17; i++) {
00659         tmp->drop_[i] = NULL;
00660         tmp->transition_[i] = -1;
00661     }
00662     tmp->batch_size_ = 5;
00663     start_state_->drop_[0]->drop_[0]->drop_[3]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0] = tmp;
00664     start_state_->drop_[0]->drop_[0]->drop_[3]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->transition_[0] = RTT;
00665 
00666     tmp = new FSMState;
00667     for (i=0; i<17; i++) {
00668         tmp->drop_[i] = NULL;
00669         tmp->transition_[i] = -1;
00670     }
00671     tmp->batch_size_ = 5;
00672     start_state_->drop_[0]->drop_[0]->drop_[3]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0] = tmp;
00673     start_state_->drop_[0]->drop_[0]->drop_[3]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->transition_[0] = RTT;
00674 
00675     tmp = new FSMState;
00676     for (i=0; i<17; i++) {
00677         tmp->drop_[i] = NULL;
00678         tmp->transition_[i] = -1;
00679     }
00680     tmp->batch_size_ = 6;
00681     start_state_->drop_[0]->drop_[0]->drop_[3]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0] = tmp;
00682     start_state_->drop_[0]->drop_[0]->drop_[3]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->transition_[0] = RTT;
00683 
00684     //(wnd, ssh) == (1, 4)
00685     tmp = new FSMState;
00686     for (i=0; i<17; i++) {
00687         tmp->drop_[i] = NULL;
00688         tmp->transition_[i] = -1;
00689     }
00690     tmp->batch_size_ = 1;
00691     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[1] = tmp;
00692     start_state_->drop_[0]->drop_[0]->drop_[0]->transition_[1] = RTT;
00693     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[2]->drop_[0] = tmp;
00694     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[2]->transition_[0] = 0;
00695 
00696     tmp = new FSMState;
00697     for (i=0; i<17; i++) {
00698         tmp->drop_[i] = NULL;
00699         tmp->transition_[i] = -1;
00700     }
00701     tmp->batch_size_ = 2;
00702     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[1]->drop_[0] = tmp;
00703     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[1]->transition_[0] = RTT;
00704 
00705 
00706     tmp = new FSMState;
00707     for (i=0; i<17; i++) {
00708         tmp->drop_[i] = NULL;
00709         tmp->transition_[i] = -1;
00710     }
00711     tmp->batch_size_ = 4;
00712     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[1]->drop_[0]->drop_[0] = tmp;
00713     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[1]->drop_[0]->transition_[0] = RTT;
00714 
00715     tmp = new FSMState;
00716     for (i=0; i<17; i++) {
00717         tmp->drop_[i] = NULL;
00718         tmp->transition_[i] = -1;
00719     }
00720     tmp->batch_size_ = 4;
00721     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[1]->drop_[0]->drop_[0]->drop_[0] = tmp;
00722     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[1]->drop_[0]->drop_[0]->transition_[0] = RTT;
00723 
00724     tmp = new FSMState;
00725     for (i=0; i<17; i++) {
00726         tmp->drop_[i] = NULL;
00727         tmp->transition_[i] = -1;
00728     }
00729     tmp->batch_size_ = 5;
00730     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[1]->drop_[0]->drop_[0]->drop_[0]->drop_[0] = tmp;
00731     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[1]->drop_[0]->drop_[0]->drop_[0]->transition_[0] = RTT;
00732 
00733     tmp = new FSMState;
00734     for (i=0; i<17; i++) {
00735         tmp->drop_[i] = NULL;
00736         tmp->transition_[i] = -1;
00737     }
00738     tmp->batch_size_ = 6;
00739     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[1]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0] = tmp;
00740     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[1]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->transition_[0] = RTT;
00741 
00742     //(wnd, ssh) == (1, 5)  
00743     tmp = new FSMState;
00744     for (i=0; i<17; i++) {
00745         tmp->drop_[i] = NULL;
00746         tmp->transition_[i] = -1;
00747     }
00748     tmp->batch_size_ = 1;
00749     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[3]->drop_[0] = tmp;
00750     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[3]->transition_[0] = 0;
00751     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[4]->drop_[0] = tmp;
00752     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[4]->transition_[0] = 0;
00753 
00754     tmp = new FSMState;
00755     for (i=0; i<17; i++) {
00756         tmp->drop_[i] = NULL;
00757         tmp->transition_[i] = -1;
00758     }
00759     tmp->batch_size_ = 2;
00760     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[3]->drop_[0]->drop_[0] = tmp;
00761     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[3]->drop_[0]->transition_[0] = RTT;
00762 
00763     tmp = new FSMState;
00764     for (i=0; i<17; i++) {
00765         tmp->drop_[i] = NULL;
00766         tmp->transition_[i] = -1;
00767     }
00768     tmp->batch_size_ = 4;
00769     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[3]->drop_[0]->drop_[0]->drop_[0] = tmp;
00770     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[3]->drop_[0]->drop_[0]->transition_[0] = RTT;
00771 
00772     tmp = new FSMState;
00773     for (i=0; i<17; i++) {
00774         tmp->drop_[i] = NULL;
00775         tmp->transition_[i] = -1;
00776     }
00777     tmp->batch_size_ = 5;
00778     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[3]->drop_[0]->drop_[0]->drop_[0]->drop_[0] = tmp;
00779     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[3]->drop_[0]->drop_[0]->drop_[0]->transition_[0] = RTT;
00780 
00781     tmp = new FSMState;
00782     for (i=0; i<17; i++) {
00783         tmp->drop_[i] = NULL;
00784         tmp->transition_[i] = -1;
00785     }
00786     tmp->batch_size_ = 6;
00787     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[3]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0] = tmp;
00788     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[3]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->transition_[0] = RTT;
00789 
00790     //(wnd, ssh) == (1, 6)
00791     tmp = new FSMState;
00792     for (i=0; i<17; i++) {
00793         tmp->drop_[i] = NULL;
00794         tmp->transition_[i] = -1;
00795     }
00796     tmp->batch_size_ = 1;
00797     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[5]->drop_[0] = tmp;
00798     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[5]->transition_[0] = 0;
00799     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[6]->drop_[0] = tmp;
00800     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[6]->transition_[0] = RTT;
00801 
00802     tmp = new FSMState;
00803     for (i=0; i<17; i++) {
00804         tmp->drop_[i] = NULL;
00805         tmp->transition_[i] = -1;
00806     }
00807     tmp->batch_size_ = 2;
00808     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[5]->drop_[0]->drop_[0] = tmp;
00809     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[5]->drop_[0]->transition_[0] = RTT;
00810 
00811     tmp = new FSMState;
00812     for (i=0; i<17; i++) {
00813         tmp->drop_[i] = NULL;
00814         tmp->transition_[i] = -1;
00815     }
00816     tmp->batch_size_ = 4;
00817     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[5]->drop_[0]->drop_[0]->drop_[0] = tmp;
00818     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[5]->drop_[0]->drop_[0]->transition_[0] = RTT;
00819 
00820     tmp = new FSMState;
00821     for (i=0; i<17; i++) {
00822         tmp->drop_[i] = NULL;
00823         tmp->transition_[i] = -1;
00824     }
00825     tmp->batch_size_ = 6;
00826     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[5]->drop_[0]->drop_[0]->drop_[0]->drop_[0] = tmp;
00827     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[5]->drop_[0]->drop_[0]->drop_[0]->transition_[0] = RTT;
00828 
00829     //(wnd, ssh) == (1, 7)
00830     tmp = new FSMState;
00831     for (i=0; i<17; i++) {
00832         tmp->drop_[i] = NULL;
00833         tmp->transition_[i] = -1;
00834     }
00835     tmp->batch_size_ = 1;
00836     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[7]->drop_[0] = tmp;
00837     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[7]->transition_[0] = RTT;
00838     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[8]->drop_[0] = tmp;
00839     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[8]->transition_[0] = RTT;
00840 
00841     tmp = new FSMState;
00842     for (i=0; i<17; i++) {
00843         tmp->drop_[i] = NULL;
00844         tmp->transition_[i] = -1;
00845     }
00846     tmp->batch_size_ = 2;
00847     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[7]->drop_[0]->drop_[0] = tmp;
00848     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[7]->drop_[0]->transition_[0] = RTT;
00849 
00850     tmp = new FSMState;
00851     for (i=0; i<17; i++) {
00852         tmp->drop_[i] = NULL;
00853         tmp->transition_[i] = -1;
00854     }
00855     tmp->batch_size_ = 4;
00856     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[7]->drop_[0]->drop_[0]->drop_[0] = tmp;
00857     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[7]->drop_[0]->drop_[0]->transition_[0] = RTT;
00858 
00859     //print_FSM(start_state_);
00860     //printf("\n");
00861 }
00862 
00863 // **********************************************
00864 // Reno-ACK TCP Connection Finite State Machine *
00865 // **********************************************
00866 RenoAckFSM::RenoAckFSM() : FSM(), start_state_(NULL) 
00867 {
00868     int i;
00869     FSMState* tmp;
00870     //printf("creating Reno Ack FSM\n");
00871 
00872     instance_ = this;
00873     // (wnd, ssh) == (1, 20)
00874     start_state_ = new FSMState;
00875     for (i=0; i<17; i++) {
00876         start_state_->drop_[i] = NULL;
00877         start_state_->transition_[i] = -1;
00878     }
00879     start_state_->batch_size_ = 1;
00880 
00881     // (wnd, ssh) == (2, 20)
00882     tmp = new FSMState;
00883     for (i=0; i<17; i++) {
00884         tmp->drop_[i] = NULL;
00885         tmp->transition_[i] = -1;
00886     }
00887     tmp->batch_size_ = 2;
00888     start_state_->drop_[0] = tmp;
00889     start_state_->transition_[0] = RTT;
00890 
00891     tmp = new FSMState;
00892     for (i=0; i<17; i++) {
00893         tmp->drop_[i] = NULL;
00894         tmp->transition_[i] = -1;
00895     }
00896     tmp->batch_size_ = 2;
00897     start_state_->drop_[0]->drop_[2] = tmp;
00898     start_state_->drop_[0]->transition_[2] = RTT;
00899 
00900     // (wnd, ssh) == (4, 20)
00901     tmp = new FSMState;
00902     for (i=0; i<17; i++) {
00903         tmp->drop_[i] = NULL;
00904         tmp->transition_[i] = -1;
00905     }
00906     tmp->batch_size_ = 4;
00907     start_state_->drop_[0]->drop_[0] = tmp;
00908     start_state_->drop_[0]->transition_[0] = RTT;
00909 
00910     tmp = new FSMState;
00911     for (i=0; i<17; i++) {
00912         tmp->drop_[i] = NULL;
00913         tmp->transition_[i] = -1;
00914     }
00915     tmp->batch_size_ = 2;
00916     start_state_->drop_[0]->drop_[0]->drop_[2] = tmp;
00917     start_state_->drop_[0]->drop_[0]->transition_[2] = RTT;
00918 
00919     tmp = new FSMState;
00920     for (i=0; i<17; i++) {
00921         tmp->drop_[i] = NULL;
00922         tmp->transition_[i] = -1;
00923     }
00924     tmp->batch_size_ = 4;
00925     start_state_->drop_[0]->drop_[0]->drop_[3] = tmp;
00926     start_state_->drop_[0]->drop_[0]->transition_[3] = RTT;
00927 
00928     tmp = new FSMState;
00929     for (i=0; i<17; i++) {
00930         tmp->drop_[i] = NULL;
00931         tmp->transition_[i] = -1;
00932     }
00933     tmp->batch_size_ = 6;
00934     start_state_->drop_[0]->drop_[0]->drop_[4] = tmp;
00935     start_state_->drop_[0]->drop_[0]->transition_[4] = RTT;
00936 
00937     //(wnd, ssh) == (8, 20)
00938     tmp = new FSMState;
00939     for (i=0; i<17; i++) {
00940         tmp->drop_[i] = NULL;
00941         tmp->transition_[i] = -1;
00942     }
00943     tmp->batch_size_ = 8;
00944     start_state_->drop_[0]->drop_[0]->drop_[0] = tmp;
00945     start_state_->drop_[0]->drop_[0]->transition_[0] = RTT;
00946 
00947     tmp = new FSMState;
00948     for (i=0; i<17; i++) {
00949         tmp->drop_[i] = NULL;
00950         tmp->transition_[i] = -1;
00951     }
00952     tmp->batch_size_ = 4;
00953     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[3] = tmp;
00954     start_state_->drop_[0]->drop_[0]->drop_[0]->transition_[3] = RTT;
00955 
00956     tmp = new FSMState;
00957     for (i=0; i<17; i++) {
00958         tmp->drop_[i] = NULL;
00959         tmp->transition_[i] = -1;
00960     }
00961     tmp->batch_size_ = 6;
00962     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[4] = tmp;
00963     start_state_->drop_[0]->drop_[0]->drop_[0]->transition_[4] = RTT;
00964 
00965     tmp = new FSMState;
00966     for (i=0; i<17; i++) {
00967         tmp->drop_[i] = NULL;
00968         tmp->transition_[i] = -1;
00969     }
00970     tmp->batch_size_ = 8;
00971     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[5] = tmp;
00972     start_state_->drop_[0]->drop_[0]->drop_[0]->transition_[5] = RTT;
00973 
00974     tmp = new FSMState;
00975     for (i=0; i<17; i++) {
00976         tmp->drop_[i] = NULL;
00977         tmp->transition_[i] = -1;
00978     }
00979     tmp->batch_size_ = 10;
00980     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[6] = tmp;
00981     start_state_->drop_[0]->drop_[0]->drop_[0]->transition_[6] = RTT;
00982 
00983 
00984     tmp = new FSMState;
00985     for (i=0; i<17; i++) {
00986         tmp->drop_[i] = NULL;
00987         tmp->transition_[i] = -1;
00988     }
00989     tmp->batch_size_ = 6;
00990     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[6]->drop_[0] = tmp;
00991     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[6]->transition_[0] = RTT;
00992 
00993     tmp = new FSMState;
00994     for (i=0; i<17; i++) {
00995         tmp->drop_[i] = NULL;
00996         tmp->transition_[i] = -1;
00997     }
00998     tmp->batch_size_ = 12;
00999     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[7] = tmp;
01000     start_state_->drop_[0]->drop_[0]->drop_[0]->transition_[7] = RTT;
01001 
01002     tmp = new FSMState;
01003     for (i=0; i<17; i++) {
01004         tmp->drop_[i] = NULL;
01005         tmp->transition_[i] = -1;
01006     }
01007     tmp->batch_size_ = 14;
01008     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[8] = tmp;
01009     start_state_->drop_[0]->drop_[0]->drop_[0]->transition_[8] = RTT;
01010 
01011     //(wnd, ssh) == (16, 20)
01012     tmp = new FSMState;
01013     for (i=0; i<17; i++) {
01014         tmp->drop_[i] = NULL;
01015         tmp->transition_[i] = -1;
01016     }
01017     tmp->batch_size_ = 16;
01018     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0] = tmp;
01019     start_state_->drop_[0]->drop_[0]->drop_[0]->transition_[0] = RTT;
01020 
01021     tmp = new FSMState;
01022     for (i=0; i<17; i++) {
01023         tmp->drop_[i] = NULL;
01024         tmp->transition_[i] = -1;
01025     }
01026     tmp->batch_size_ = 1;
01027     for (i=1; i<17; i++) start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[i] = tmp;
01028     for (i=1; i<14; i++)
01029         start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->transition_[i] = RTT;
01030     for (i=14; i<17; i++)
01031         start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->transition_[i] = TIMEOUT;
01032 
01033     //(wnd, ssh) == (1, 2), timeout
01034     tmp = new FSMState;
01035     for (i=0; i<17; i++) {
01036         tmp->drop_[i] = NULL;
01037         tmp->transition_[i] = -1;
01038     }
01039     tmp->batch_size_ = 1;
01040     start_state_->drop_[1] = tmp;
01041     start_state_->transition_[1] = TIMEOUT;
01042     start_state_->drop_[0]->drop_[1] = tmp;
01043     start_state_->drop_[0]->transition_[1] = TIMEOUT;
01044     start_state_->drop_[0]->drop_[2]->drop_[0] = tmp;
01045     start_state_->drop_[0]->drop_[2]->transition_[0] = TIMEOUT;
01046 
01047     //(wnd, ssh) == (2, 2)
01048     tmp = new FSMState;
01049     for (i=0; i<17; i++) {
01050         tmp->drop_[i] = NULL;
01051         tmp->transition_[i] = -1;
01052     }
01053     tmp->batch_size_ = 2;
01054     start_state_->drop_[1]->drop_[0] = tmp;
01055     start_state_->drop_[1]->transition_[0] = RTT;
01056     start_state_->drop_[0]->drop_[0]->drop_[1] = tmp;
01057     start_state_->drop_[0]->drop_[0]->transition_[1] = RTT;
01058     start_state_->drop_[0]->drop_[0]->drop_[2]->drop_[0] = tmp;
01059     start_state_->drop_[0]->drop_[0]->drop_[2]->transition_[0] = RTT;
01060 
01061     //(wnd, ssh) == (2.5, 2)
01062     tmp = new FSMState;
01063     for (i=0; i<17; i++) {
01064         tmp->drop_[i] = NULL;
01065         tmp->transition_[i] = -1;
01066     }
01067     tmp->batch_size_ = 2;
01068     start_state_->drop_[1]->drop_[0]->drop_[0] = tmp;
01069     start_state_->drop_[1]->drop_[0]->transition_[0] = RTT;
01070 
01071     //(wnd, ssh) == (3, 2)
01072     tmp = new FSMState;
01073     for (i=0; i<17; i++) {
01074         tmp->drop_[i] = NULL;
01075         tmp->transition_[i] = -1;
01076     }
01077     tmp->batch_size_ = 3;
01078     start_state_->drop_[1]->drop_[0]->drop_[0]->drop_[0] = tmp;
01079     start_state_->drop_[1]->drop_[0]->drop_[0]->transition_[0] = RTT;
01080 
01081     //(wnd, ssh) == (4, 2)
01082     tmp = new FSMState;
01083     for (i=0; i<17; i++) {
01084         tmp->drop_[i] = NULL;
01085         tmp->transition_[i] = -1;
01086     }
01087     tmp->batch_size_ = 4;
01088     start_state_->drop_[1]->drop_[0]->drop_[0]->drop_[0]->drop_[0] = tmp;
01089     start_state_->drop_[1]->drop_[0]->drop_[0]->drop_[0]->transition_[0] = RTT;
01090 
01091     //(wnd, ssh) == (5, 2)
01092     tmp = new FSMState;
01093     for (i=0; i<17; i++) {
01094         tmp->drop_[i] = NULL;
01095         tmp->transition_[i] = -1;
01096     }
01097     tmp->batch_size_ = 5;
01098     start_state_->drop_[1]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0] = tmp;
01099     start_state_->drop_[1]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->transition_[0] = RTT;
01100 
01101     //(wnd, ssh) == (6, 2)
01102     tmp = new FSMState;
01103     for (i=0; i<17; i++) {
01104         tmp->drop_[i] = NULL;
01105         tmp->transition_[i] = -1;
01106     }
01107     tmp->batch_size_ = 6;
01108     start_state_->drop_[1]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0] = tmp;
01109     start_state_->drop_[1]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->transition_[0] = RTT;
01110 
01111     //(wnd, ssh) == (7, 2)
01112     tmp = new FSMState;
01113     for (i=0; i<17; i++) {
01114         tmp->drop_[i] = NULL;
01115         tmp->transition_[i] = -1;
01116     }
01117     tmp->batch_size_ = 7;
01118     start_state_->drop_[1]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0] = tmp;
01119     start_state_->drop_[1]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->transition_[0] = RTT;
01120 
01121     //(wnd, ssh) == (7.5, 2)
01122     tmp = new FSMState;
01123     for (i=0; i<17; i++) {
01124         tmp->drop_[i] = NULL;
01125         tmp->transition_[i] = -1;
01126     }
01127     tmp->batch_size_ = 7;
01128     start_state_->drop_[1]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0] = tmp;
01129     start_state_->drop_[1]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->transition_[0] = RTT;
01130 
01131 
01132     //(wnd, ssh) == (3, 3)
01133     tmp = new FSMState;
01134     for (i=0; i<17; i++) {
01135         tmp->drop_[i] = NULL;
01136         tmp->transition_[i] = -1;
01137     }
01138     tmp->batch_size_ = 3;
01139     start_state_->drop_[0]->drop_[0]->drop_[3]->drop_[0] = tmp;
01140     start_state_->drop_[0]->drop_[0]->drop_[3]->transition_[0] = RTT;
01141     start_state_->drop_[0]->drop_[0]->drop_[4]->drop_[0] = tmp;
01142     start_state_->drop_[0]->drop_[0]->drop_[4]->transition_[0] = RTT;
01143 
01144     tmp = new FSMState;
01145     for (i=0; i<17; i++) {
01146         tmp->drop_[i] = NULL;
01147         tmp->transition_[i] = -1;
01148     }
01149     tmp->batch_size_ = 3;
01150     start_state_->drop_[0]->drop_[0]->drop_[3]->drop_[0]->drop_[0] = tmp;
01151     start_state_->drop_[0]->drop_[0]->drop_[3]->drop_[0]->transition_[0] = RTT;
01152 
01153     tmp = new FSMState;
01154     for (i=0; i<17; i++) {
01155         tmp->drop_[i] = NULL;
01156         tmp->transition_[i] = -1;
01157     }
01158     tmp->batch_size_ = 4;
01159     start_state_->drop_[0]->drop_[0]->drop_[3]->drop_[0]->drop_[0]->drop_[0] = tmp;
01160     start_state_->drop_[0]->drop_[0]->drop_[3]->drop_[0]->drop_[0]->transition_[0] = RTT;
01161 
01162     tmp = new FSMState;
01163     for (i=0; i<17; i++) {
01164         tmp->drop_[i] = NULL;
01165         tmp->transition_[i] = -1;
01166     }
01167     tmp->batch_size_ = 5;
01168     start_state_->drop_[0]->drop_[0]->drop_[3]->drop_[0]->drop_[0]->drop_[0]->drop_[0] = tmp;
01169     start_state_->drop_[0]->drop_[0]->drop_[3]->drop_[0]->drop_[0]->drop_[0]->transition_[0] = RTT;
01170 
01171     tmp = new FSMState;
01172     for (i=0; i<17; i++) {
01173         tmp->drop_[i] = NULL;
01174         tmp->transition_[i] = -1;
01175     }
01176     tmp->batch_size_ = 6;
01177     start_state_->drop_[0]->drop_[0]->drop_[3]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0] = tmp;
01178     start_state_->drop_[0]->drop_[0]->drop_[3]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->transition_[0] = RTT;
01179 
01180 
01181 
01182     //(wnd, ssh) == (4, 4)
01183     tmp = new FSMState;
01184     for (i=0; i<17; i++) {
01185         tmp->drop_[i] = NULL;
01186         tmp->transition_[i] = -1;
01187     }
01188     tmp->batch_size_ = 4;
01189     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[1] = tmp;
01190     start_state_->drop_[0]->drop_[0]->drop_[0]->transition_[1] = RTT;
01191     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[2] = tmp;
01192     start_state_->drop_[0]->drop_[0]->drop_[0]->transition_[2] = RTT;
01193 
01194     tmp = new FSMState;
01195     for (i=0; i<17; i++) {
01196         tmp->drop_[i] = NULL;
01197         tmp->transition_[i] = -1;
01198     }
01199     tmp->batch_size_ = 4;
01200     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[1]->drop_[0] = tmp;
01201     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[1]->transition_[0] = RTT;
01202 
01203 
01204     tmp = new FSMState;
01205     for (i=0; i<17; i++) {
01206         tmp->drop_[i] = NULL;
01207         tmp->transition_[i] = -1;
01208     }
01209     tmp->batch_size_ = 5;
01210     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[1]->drop_[0]->drop_[0] = tmp;
01211     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[1]->drop_[0]->transition_[0] = RTT;
01212 
01213     tmp = new FSMState;
01214     for (i=0; i<17; i++) {
01215         tmp->drop_[i] = NULL;
01216         tmp->transition_[i] = -1;
01217     }
01218     tmp->batch_size_ = 6;
01219     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[1]->drop_[0]->drop_[0]->drop_[0] = tmp;
01220     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[1]->drop_[0]->drop_[0]->transition_[0] = RTT;
01221 
01222 
01223     //(wnd, ssh) == (5, 5)  
01224     tmp = new FSMState;
01225     for (i=0; i<17; i++) {
01226         tmp->drop_[i] = NULL;
01227         tmp->transition_[i] = -1;
01228     }
01229     tmp->batch_size_ = 1;
01230     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[3]->drop_[0] = tmp;
01231     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[3]->transition_[0] = 0;
01232     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[4]->drop_[0] = tmp;
01233     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[4]->transition_[0] = 0;
01234 
01235     tmp = new FSMState;
01236     for (i=0; i<17; i++) {
01237         tmp->drop_[i] = NULL;
01238         tmp->transition_[i] = -1;
01239     }
01240     tmp->batch_size_ = 5;
01241     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[3]->drop_[0]->drop_[0] = tmp;
01242     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[3]->drop_[0]->transition_[0] = RTT;
01243 
01244     tmp = new FSMState;
01245     for (i=0; i<17; i++) {
01246         tmp->drop_[i] = NULL;
01247         tmp->transition_[i] = -1;
01248     }
01249     tmp->batch_size_ = 6;
01250     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[3]->drop_[0]->drop_[0]->drop_[0] = tmp;
01251     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[3]->drop_[0]->drop_[0]->transition_[0] = RTT;
01252 
01253     tmp = new FSMState;
01254     for (i=0; i<17; i++) {
01255         tmp->drop_[i] = NULL;
01256         tmp->transition_[i] = -1;
01257     }
01258     tmp->batch_size_ = 7;
01259     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[3]->drop_[0]->drop_[0]->drop_[0]->drop_[0] = tmp;
01260     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[3]->drop_[0]->drop_[0]->drop_[0]->transition_[0] = RTT;
01261 
01262     //(wnd, ssh) == (6, 6)
01263     tmp = new FSMState;
01264     for (i=0; i<17; i++) {
01265         tmp->drop_[i] = NULL;
01266         tmp->transition_[i] = -1;
01267     }
01268     tmp->batch_size_ = 1;
01269     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[5]->drop_[0] = tmp;
01270     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[5]->transition_[0] = 0;
01271 
01272     tmp = new FSMState;
01273     for (i=0; i<17; i++) {
01274         tmp->drop_[i] = NULL;
01275         tmp->transition_[i] = -1;
01276     }
01277     tmp->batch_size_ = 6;
01278     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[5]->drop_[0]->drop_[0] = tmp;
01279     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[5]->drop_[0]->transition_[0] = RTT;
01280     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[6]->drop_[0]->drop_[0] = tmp;
01281     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[6]->drop_[0]->transition_[0] = RTT;
01282 
01283     tmp = new FSMState;
01284     for (i=0; i<17; i++) {
01285         tmp->drop_[i] = NULL;
01286         tmp->transition_[i] = -1;
01287     }
01288     tmp->batch_size_ = 7;
01289     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[5]->drop_[0]->drop_[0]->drop_[0] = tmp;
01290     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[5]->drop_[0]->drop_[0]->transition_[0] = RTT;
01291 
01292     //(wnd, ssh) == (7, 7)
01293     tmp = new FSMState;
01294     for (i=0; i<17; i++) {
01295         tmp->drop_[i] = NULL;
01296         tmp->transition_[i] = -1;
01297     }
01298     tmp->batch_size_ = 7;
01299     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[7]->drop_[0] = tmp;
01300     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[7]->transition_[0] = RTT;
01301     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[8]->drop_[0] = tmp;
01302     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[8]->transition_[0] = RTT;
01303 
01304     //print_FSM(start_state_);
01305     //printf("\n");
01306 
01307 }
01308 
01309 // *****************************************************
01310 // Tahoe-Delay Ack TCP Connection Finite State Machine *
01311 // *****************************************************
01312 TahoeDelAckFSM::TahoeDelAckFSM() : FSM(), start_state_(NULL) 
01313 {
01314     int i;
01315     FSMState* tmp;
01316     //printf("creating Tahoe DelAck FSM\n");
01317 
01318     instance_ = this;
01319     // (wnd, ssh) == (1, 20)
01320     start_state_ = new FSMState;
01321     for (i=0; i<17; i++) {
01322         start_state_->drop_[i] = NULL;
01323         start_state_->transition_[i] = -1;
01324     }
01325     start_state_->batch_size_ = 1;
01326 
01327     // (wnd, ssh) == (2, 20)
01328     tmp = new FSMState;
01329     for (i=0; i<17; i++) {
01330         tmp->drop_[i] = NULL;
01331         tmp->transition_[i] = -1;
01332     }
01333     tmp->batch_size_ = 2;
01334     start_state_->drop_[0] = tmp;
01335     start_state_->transition_[0] = RTT;
01336 
01337     tmp = new FSMState;
01338     for (i=0; i<17; i++) {
01339         tmp->drop_[i] = NULL;
01340         tmp->transition_[i] = -1;
01341     }
01342     tmp->batch_size_ = 2;
01343     start_state_->drop_[0]->drop_[2] = tmp;
01344     start_state_->drop_[0]->transition_[2] = RTT;
01345 
01346     // (wnd, ssh) == (3, 20)
01347     tmp = new FSMState;
01348     for (i=0; i<17; i++) {
01349         tmp->drop_[i] = NULL;
01350         tmp->transition_[i] = -1;
01351     }
01352     tmp->batch_size_ = 3;
01353     start_state_->drop_[0]->drop_[0] = tmp;
01354     start_state_->drop_[0]->transition_[0] = RTT;
01355 
01356     tmp = new FSMState;
01357     for (i=0; i<17; i++) {
01358         tmp->drop_[i] = NULL;
01359         tmp->transition_[i] = -1;
01360     }
01361     tmp->batch_size_ = 2;
01362     start_state_->drop_[0]->drop_[0]->drop_[2] = tmp;
01363     start_state_->drop_[0]->drop_[0]->transition_[2] = RTT;
01364 
01365     tmp = new FSMState;
01366     for (i=0; i<17; i++) {
01367         tmp->drop_[i] = NULL;
01368         tmp->transition_[i] = -1;
01369     }
01370     tmp->batch_size_ = 3;
01371     start_state_->drop_[0]->drop_[0]->drop_[3] = tmp;
01372     start_state_->drop_[0]->drop_[0]->transition_[3] = RTT;
01373 
01374     //(wnd, ssh) == (5, 20)
01375     tmp = new FSMState;
01376     for (i=0; i<17; i++) {
01377         tmp->drop_[i] = NULL;
01378         tmp->transition_[i] = -1;
01379     }
01380     tmp->batch_size_ = 5;
01381     start_state_->drop_[0]->drop_[0]->drop_[0] = tmp;
01382     start_state_->drop_[0]->drop_[0]->transition_[0] = RTT;
01383 
01384     tmp = new FSMState;
01385     for (i=0; i<17; i++) {
01386         tmp->drop_[i] = NULL;
01387         tmp->transition_[i] = -1;
01388     }
01389     tmp->batch_size_ = 2;
01390     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[2] = tmp;
01391     start_state_->drop_[0]->drop_[0]->drop_[0]->transition_[2] = RTT;
01392 
01393     tmp = new FSMState;
01394     for (i=0; i<17; i++) {
01395         tmp->drop_[i] = NULL;
01396         tmp->transition_[i] = -1;
01397     }
01398     tmp->batch_size_ = 3;
01399     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[3] = tmp;
01400     start_state_->drop_[0]->drop_[0]->drop_[0]->transition_[3] = RTT;
01401 
01402     tmp = new FSMState;
01403     for (i=0; i<17; i++) {
01404         tmp->drop_[i] = NULL;
01405         tmp->transition_[i] = -1;
01406     }
01407     tmp->batch_size_ = 5;
01408     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[4] = tmp;
01409     start_state_->drop_[0]->drop_[0]->drop_[0]->transition_[4] = RTT;
01410 
01411     tmp = new FSMState;
01412     for (i=0; i<17; i++) {
01413         tmp->drop_[i] = NULL;
01414         tmp->transition_[i] = -1;
01415     }
01416     tmp->batch_size_ = 6;
01417     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[5] = tmp;
01418     start_state_->drop_[0]->drop_[0]->drop_[0]->transition_[5] = RTT;
01419 
01420     //(wnd, ssh) == (8, 20)
01421     tmp = new FSMState;
01422     for (i=0; i<17; i++) {
01423         tmp->drop_[i] = NULL;
01424         tmp->transition_[i] = -1;
01425     }
01426     tmp->batch_size_ = 8;
01427     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0] = tmp;
01428     start_state_->drop_[0]->drop_[0]->drop_[0]->transition_[0] = RTT;
01429 
01430     tmp = new FSMState;
01431     for (i=0; i<17; i++) {
01432         tmp->drop_[i] = NULL;
01433         tmp->transition_[i] = -1;
01434     }
01435     tmp->batch_size_ = 2;
01436     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[2] = tmp;
01437     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->transition_[2] = RTT;
01438 
01439     tmp = new FSMState;
01440     for (i=0; i<17; i++) {
01441         tmp->drop_[i] = NULL;
01442         tmp->transition_[i] = -1;
01443     }
01444     tmp->batch_size_ = 3;
01445     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[3] = tmp;
01446     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->transition_[3] = RTT;
01447 
01448     tmp = new FSMState;
01449     for (i=0; i<17; i++) {
01450         tmp->drop_[i] = NULL;
01451         tmp->transition_[i] = -1;
01452     }
01453     tmp->batch_size_ = 5;
01454     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[4] = tmp;
01455     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->transition_[4] = RTT;
01456 
01457     tmp = new FSMState;
01458     for (i=0; i<17; i++) {
01459         tmp->drop_[i] = NULL;
01460         tmp->transition_[i] = -1;
01461     }
01462     tmp->batch_size_ = 6;
01463     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[5] = tmp;
01464     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->transition_[5] = RTT;
01465 
01466     tmp = new FSMState;
01467     for (i=0; i<17; i++) {
01468         tmp->drop_[i] = NULL;
01469         tmp->transition_[i] = -1;
01470     }
01471     tmp->batch_size_ = 8;
01472     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[6] = tmp;
01473     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->transition_[6] = RTT;
01474 
01475     tmp = new FSMState;
01476     for (i=0; i<17; i++) {
01477         tmp->drop_[i] = NULL;
01478         tmp->transition_[i] = -1;
01479     }
01480     tmp->batch_size_ = 9;
01481     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[7] = tmp;
01482     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->transition_[7] = RTT;
01483 
01484     tmp = new FSMState;
01485     for (i=0; i<17; i++) {
01486         tmp->drop_[i] = NULL;
01487         tmp->transition_[i] = -1;
01488     }
01489     tmp->batch_size_ = 11;
01490     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[8] = tmp;
01491     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->transition_[8] = RTT;
01492 
01493     //(wnd, ssh) == (12, 20)
01494     tmp = new FSMState;
01495     for (i=0; i<17; i++) {
01496         tmp->drop_[i] = NULL;
01497         tmp->transition_[i] = -1;
01498     }
01499     tmp->batch_size_ = 12;
01500     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0] = tmp;
01501     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->transition_[0] = RTT;
01502 
01503     tmp = new FSMState;
01504     for (i=0; i<17; i++) {
01505         tmp->drop_[i] = NULL;
01506         tmp->transition_[i] = -1;
01507     }
01508     tmp->batch_size_ = 1;
01509     for (i=1; i<13; i++) start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[i] = tmp;
01510     for (i=1; i<10; i++)
01511         start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->transition_[i] = RTT;
01512     for (i=10; i<13; i++)
01513         start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->transition_[i] = TIMEOUT;
01514 
01515 
01516     //(wnd, ssh) == (1, 2), timeout
01517     tmp = new FSMState;
01518     for (i=0; i<17; i++) {
01519         tmp->drop_[i] = NULL;
01520         tmp->transition_[i] = -1;
01521     }
01522     tmp->batch_size_ = 1;
01523     start_state_->drop_[1] = tmp;
01524     start_state_->transition_[1] = TIMEOUT;
01525     start_state_->drop_[0]->drop_[1] = tmp;
01526     start_state_->drop_[0]->transition_[1] = TIMEOUT;
01527     start_state_->drop_[0]->drop_[2]->drop_[0] = tmp;
01528     start_state_->drop_[0]->drop_[2]->transition_[0] = TIMEOUT;
01529 
01530     start_state_->drop_[0]->drop_[0]->drop_[1] = tmp;
01531     start_state_->drop_[0]->drop_[0]->transition_[1] = TIMEOUT;
01532     start_state_->drop_[0]->drop_[0]->drop_[2]->drop_[0] = tmp;
01533     start_state_->drop_[0]->drop_[0]->drop_[2]->transition_[0] = RTT;
01534     start_state_->drop_[0]->drop_[0]->drop_[3]->drop_[0] = tmp;
01535     start_state_->drop_[0]->drop_[0]->drop_[3]->transition_[0] = RTT;
01536 
01537     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[1] = tmp;
01538     start_state_->drop_[0]->drop_[0]->drop_[0]->transition_[1] = RTT;
01539 
01540     //(wnd, ssh) == (2, 2)
01541     tmp = new FSMState;
01542     for (i=0; i<17; i++) {
01543         tmp->drop_[i] = NULL;
01544         tmp->transition_[i] = -1;
01545     }
01546     tmp->batch_size_ = 2;
01547     start_state_->drop_[1]->drop_[0] = tmp;
01548     start_state_->drop_[1]->transition_[0] = RTT;
01549 
01550     //(wnd, ssh) == (2.5, 2)
01551     tmp = new FSMState;
01552     for (i=0; i<17; i++) {
01553         tmp->drop_[i] = NULL;
01554         tmp->transition_[i] = -1;
01555     }
01556     tmp->batch_size_ = 2;
01557     start_state_->drop_[1]->drop_[0]->drop_[0] = tmp;
01558     start_state_->drop_[1]->drop_[0]->transition_[0] = RTT;
01559 
01560     //(wnd, ssh) == (2.9, 2)
01561     tmp = new FSMState;
01562     for (i=0; i<17; i++) {
01563         tmp->drop_[i] = NULL;
01564         tmp->transition_[i] = -1;
01565     }
01566     tmp->batch_size_ = 2;
01567     start_state_->drop_[1]->drop_[0]->drop_[0]->drop_[0] = tmp;
01568     start_state_->drop_[1]->drop_[0]->drop_[0]->transition_[0] = RTT;
01569 
01570     //(wnd, ssh) == (3, 2)
01571     tmp = new FSMState;
01572     for (i=0; i<17; i++) {
01573         tmp->drop_[i] = NULL;
01574         tmp->transition_[i] = -1;
01575     }
01576     tmp->batch_size_ = 3;
01577     start_state_->drop_[1]->drop_[0]->drop_[0]->drop_[0]->drop_[0] = tmp;
01578     start_state_->drop_[1]->drop_[0]->drop_[0]->drop_[0]->transition_[0] = RTT;
01579 
01580     //(wnd, ssh) == (3.3, 2)
01581     tmp = new FSMState;
01582     for (i=0; i<17; i++) {
01583         tmp->drop_[i] = NULL;
01584         tmp->transition_[i] = -1;
01585     }
01586     tmp->batch_size_ = 3;
01587     start_state_->drop_[1]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0] = tmp;
01588     start_state_->drop_[1]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->transition_[0] = RTT;
01589 
01590     //(wnd, ssh) == (4, 2)
01591     tmp = new FSMState;
01592     for (i=0; i<17; i++) {
01593         tmp->drop_[i] = NULL;
01594         tmp->transition_[i] = -1;
01595     }
01596     tmp->batch_size_ = 4;
01597     start_state_->drop_[1]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0] = tmp;
01598     start_state_->drop_[1]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->transition_[0] = RTT;
01599 
01600     //(wnd, ssh) == (4.7, 2)
01601     tmp = new FSMState;
01602     for (i=0; i<17; i++) {
01603         tmp->drop_[i] = NULL;
01604         tmp->transition_[i] = -1;
01605     }
01606     tmp->batch_size_ = 4;
01607     start_state_->drop_[1]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0] = tmp;
01608     start_state_->drop_[1]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->transition_[0] = RTT;
01609 
01610     //(wnd, ssh) == (5, 2)
01611     tmp = new FSMState;
01612     for (i=0; i<17; i++) {
01613         tmp->drop_[i] = NULL;
01614         tmp->transition_[i] = -1;
01615     }
01616     tmp->batch_size_ = 5;
01617     start_state_->drop_[1]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0] = tmp;
01618     start_state_->drop_[1]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->transition_[0] = RTT;
01619 
01620     //(wnd, ssh) == (6, 2)
01621     tmp = new FSMState;
01622     for (i=0; i<17; i++) {
01623         tmp->drop_[i] = NULL;
01624         tmp->transition_[i] = -1;
01625     }
01626     tmp->batch_size_ = 6;
01627     start_state_->drop_[1]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0] = tmp;
01628     start_state_->drop_[1]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->transition_[0] = RTT;
01629 
01630 
01631     //(wnd, ssh) == (1, 3)
01632     tmp = new FSMState;
01633     for (i=0; i<17; i++) {
01634         tmp->drop_[i] = NULL;
01635         tmp->transition_[i] = -1;
01636     }
01637     tmp->batch_size_ = 1;
01638     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[2]->drop_[0] = tmp;
01639     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[2]->transition_[0] = RTT;
01640     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[3]->drop_[0] = tmp;
01641     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[3]->transition_[0] = RTT;
01642     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[4]->drop_[0] = tmp;
01643     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[4]->transition_[0] = RTT;
01644     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[5]->drop_[0] = tmp;
01645     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[5]->transition_[0] = RTT;
01646 
01647     tmp = new FSMState;
01648     for (i=0; i<17; i++) {
01649         tmp->drop_[i] = NULL;
01650         tmp->transition_[i] = -1;
01651     }
01652     tmp->batch_size_ = 2;
01653     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[3]->drop_[0]->drop_[0] = tmp;
01654     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[3]->drop_[0]->transition_[0] = RTT;
01655 
01656     tmp = new FSMState;
01657     for (i=0; i<17; i++) {
01658         tmp->drop_[i] = NULL;
01659         tmp->transition_[i] = -1;
01660     }
01661     tmp->batch_size_ = 3;
01662     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[3]->drop_[0]->drop_[0]->drop_[0] = tmp;
01663     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[3]->drop_[0]->drop_[0]->transition_[0] = RTT;
01664 
01665     tmp = new FSMState;
01666     for (i=0; i<17; i++) {
01667         tmp->drop_[i] = NULL;
01668         tmp->transition_[i] = -1;
01669     }
01670     tmp->batch_size_ = 3;
01671     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[3]->drop_[0]->drop_[0]->drop_[0]->drop_[0] = tmp;
01672     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[3]->drop_[0]->drop_[0]->drop_[0]->transition_[0] = RTT;
01673 
01674     tmp = new FSMState;
01675     for (i=0; i<17; i++) {
01676         tmp->drop_[i] = NULL;
01677         tmp->transition_[i] = -1;
01678     }
01679     tmp->batch_size_ = 4;
01680     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[3]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0] = tmp;
01681     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[3]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->transition_[0] = RTT;
01682 
01683     tmp = new FSMState;
01684     for (i=0; i<17; i++) {
01685         tmp->drop_[i] = NULL;
01686         tmp->transition_[i] = -1;
01687     }
01688     tmp->batch_size_ = 4;
01689     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[3]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0] = tmp;
01690     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[3]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->transition_[0] = RTT;
01691 
01692     tmp = new FSMState;
01693     for (i=0; i<17; i++) {
01694         tmp->drop_[i] = NULL;
01695         tmp->transition_[i] = -1;
01696     }
01697     tmp->batch_size_ = 5;
01698     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[3]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0] = tmp;
01699     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[3]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->transition_[0] = RTT;
01700 
01701     //(wnd, ssh) == (1, 4)
01702     tmp = new FSMState;
01703     for (i=0; i<17; i++) {
01704         tmp->drop_[i] = NULL;
01705         tmp->transition_[i] = -1;
01706     }
01707     tmp->batch_size_ = 1;
01708     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[1] = tmp;
01709     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->transition_[1] = RTT;
01710     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[2]->drop_[0] = tmp;
01711     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[2]->transition_[0] = 0;
01712     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[3]->drop_[0] = tmp;
01713     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[3]->transition_[0] = 0;
01714 
01715     tmp = new FSMState;
01716     for (i=0; i<17; i++) {
01717         tmp->drop_[i] = NULL;
01718         tmp->transition_[i] = -1;
01719     }
01720     tmp->batch_size_ = 2;
01721     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[1]->drop_[0] = tmp;
01722     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[1]->transition_[0] = RTT;
01723 
01724 
01725     tmp = new FSMState;
01726     for (i=0; i<17; i++) {
01727         tmp->drop_[i] = NULL;
01728         tmp->transition_[i] = -1;
01729     }
01730     tmp->batch_size_ = 3;
01731     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[1]->drop_[0]->drop_[0] = tmp;
01732     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[1]->drop_[0]->transition_[0] = RTT;
01733 
01734     tmp = new FSMState;
01735     for (i=0; i<17; i++) {
01736         tmp->drop_[i] = NULL;
01737         tmp->transition_[i] = -1;
01738     }
01739     tmp->batch_size_ = 4;
01740     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[1]->drop_[0]->drop_[0]->drop_[0] = tmp;
01741     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[1]->drop_[0]->drop_[0]->transition_[0] = RTT;
01742 
01743     tmp = new FSMState;
01744     for (i=0; i<17; i++) {
01745         tmp->drop_[i] = NULL;
01746         tmp->transition_[i] = -1;
01747     }
01748     tmp->batch_size_ = 4;
01749     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[1]->drop_[0]->drop_[0]->drop_[0]->drop_[0] = tmp;
01750     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[1]->drop_[0]->drop_[0]->drop_[0]->transition_[0] = RTT;
01751 
01752 
01753     //(wnd, ssh) == (1, 5)  
01754     tmp = new FSMState;
01755     for (i=0; i<17; i++) {
01756         tmp->drop_[i] = NULL;
01757         tmp->transition_[i] = -1;
01758     }
01759     tmp->batch_size_ = 1;
01760     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[4]->drop_[0] = tmp;
01761     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[4]->transition_[0] = 0;
01762     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[5]->drop_[0] = tmp;
01763     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[5]->transition_[0] = 0;
01764     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[6]->drop_[0] = tmp;
01765     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[6]->transition_[0] = RTT;
01766     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[7]->drop_[0] = tmp;
01767     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[7]->transition_[0] = RTT;
01768 
01769 
01770     tmp = new FSMState;
01771     for (i=0; i<17; i++) {
01772         tmp->drop_[i] = NULL;
01773         tmp->transition_[i] = -1;
01774     }
01775     tmp->batch_size_ = 2;
01776     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[4]->drop_[0]->drop_[0] = tmp;
01777     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[4]->drop_[0]->transition_[0] = RTT;
01778 
01779     tmp = new FSMState;
01780     for (i=0; i<17; i++) {
01781         tmp->drop_[i] = NULL;
01782         tmp->transition_[i] = -1;
01783     }
01784     tmp->batch_size_ = 3;
01785     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[4]->drop_[0]->drop_[0]->drop_[0] = tmp;
01786     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[4]->drop_[0]->drop_[0]->transition_[0] = RTT;
01787 
01788     tmp = new FSMState;
01789     for (i=0; i<17; i++) {
01790         tmp->drop_[i] = NULL;
01791         tmp->transition_[i] = -1;
01792     }
01793     tmp->batch_size_ = 5;
01794     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[4]->drop_[0]->drop_[0]->drop_[0]->drop_[0] = tmp;
01795     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[4]->drop_[0]->drop_[0]->drop_[0]->transition_[0] = RTT;
01796 
01797 
01798     //(wnd, ssh) == (1, 6)
01799     tmp = new FSMState;
01800     for (i=0; i<17; i++) {
01801         tmp->drop_[i] = NULL;
01802         tmp->transition_[i] = -1;
01803     }
01804     tmp->batch_size_ = 1;
01805     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[8]->drop_[0] = tmp;
01806     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[8]->transition_[0] = RTT;
01807 
01808     tmp = new FSMState;
01809     for (i=0; i<17; i++) {
01810         tmp->drop_[i] = NULL;
01811         tmp->transition_[i] = -1;
01812     }
01813     tmp->batch_size_ = 2;
01814     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[8]->drop_[0]->drop_[0] = tmp;
01815     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[8]->drop_[0]->transition_[0] = RTT;
01816 
01817 
01818     //print_FSM(start_state_);
01819     //printf("\n");
01820 }
01821 
01822 // ****************************************************
01823 // Reno-Delay Ack TCP Connection Finite State Machine *
01824 // ****************************************************
01825 RenoDelAckFSM::RenoDelAckFSM() : FSM(), start_state_(NULL) 
01826 {
01827     int i;
01828     FSMState* tmp;
01829     //printf("creating Reno DelAck FSM\n");
01830 
01831     instance_ = this;
01832     // (wnd, ssh) == (1, 20)
01833     start_state_ = new FSMState;
01834     for (i=0; i<17; i++) {
01835         start_state_->drop_[i] = NULL;
01836         start_state_->transition_[i] = -1;
01837     }
01838     start_state_->batch_size_ = 1;
01839 
01840     // (wnd, ssh) == (2, 20)
01841     tmp = new FSMState;
01842     for (i=0; i<17; i++) {
01843         tmp->drop_[i] = NULL;
01844         tmp->transition_[i] = -1;
01845     }
01846     tmp->batch_size_ = 2;
01847     start_state_->drop_[0] = tmp;
01848     start_state_->transition_[0] = RTT;
01849 
01850     tmp = new FSMState;
01851     for (i=0; i<17; i++) {
01852         tmp->drop_[i] = NULL;
01853         tmp->transition_[i] = -1;
01854     }
01855     tmp->batch_size_ = 2;
01856     start_state_->drop_[0]->drop_[2] = tmp;
01857     start_state_->drop_[0]->transition_[2] = RTT;
01858 
01859     // (wnd, ssh) == (3, 20)
01860     tmp = new FSMState;
01861     for (i=0; i<17; i++) {
01862         tmp->drop_[i] = NULL;
01863         tmp->transition_[i] = -1;
01864     }
01865     tmp->batch_size_ = 3;
01866     start_state_->drop_[0]->drop_[0] = tmp;
01867     start_state_->drop_[0]->transition_[0] = RTT;
01868 
01869     tmp = new FSMState;
01870     for (i=0; i<17; i++) {
01871         tmp->drop_[i] = NULL;
01872         tmp->transition_[i] = -1;
01873     }
01874     tmp->batch_size_ = 2;
01875     start_state_->drop_[0]->drop_[0]->drop_[2] = tmp;
01876     start_state_->drop_[0]->drop_[0]->transition_[2] = RTT;
01877 
01878     tmp = new FSMState;
01879     for (i=0; i<17; i++) {
01880         tmp->drop_[i] = NULL;
01881         tmp->transition_[i] = -1;
01882     }
01883     tmp->batch_size_ = 3;
01884     start_state_->drop_[0]->drop_[0]->drop_[3] = tmp;
01885     start_state_->drop_[0]->drop_[0]->transition_[3] = RTT;
01886 
01887     //(wnd, ssh) == (5, 20)
01888     tmp = new FSMState;
01889     for (i=0; i<17; i++) {
01890         tmp->drop_[i] = NULL;
01891         tmp->transition_[i] = -1;
01892     }
01893     tmp->batch_size_ = 5;
01894     start_state_->drop_[0]->drop_[0]->drop_[0] = tmp;
01895     start_state_->drop_[0]->drop_[0]->transition_[0] = RTT;
01896 
01897     tmp = new FSMState;
01898     for (i=0; i<17; i++) {
01899         tmp->drop_[i] = NULL;
01900         tmp->transition_[i] = -1;
01901     }
01902     tmp->batch_size_ = 2;
01903     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[2] = tmp;
01904     start_state_->drop_[0]->drop_[0]->drop_[0]->transition_[2] = RTT;
01905 
01906     tmp = new FSMState;
01907     for (i=0; i<17; i++) {
01908         tmp->drop_[i] = NULL;
01909         tmp->transition_[i] = -1;
01910     }
01911     tmp->batch_size_ = 3;
01912     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[3] = tmp;
01913     start_state_->drop_[0]->drop_[0]->drop_[0]->transition_[3] = RTT;
01914 
01915     tmp = new FSMState;
01916     for (i=0; i<17; i++) {
01917         tmp->drop_[i] = NULL;
01918         tmp->transition_[i] = -1;
01919     }
01920     tmp->batch_size_ = 5;
01921     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[4] = tmp;
01922     start_state_->drop_[0]->drop_[0]->drop_[0]->transition_[4] = RTT;
01923 
01924     tmp = new FSMState;
01925     for (i=0; i<17; i++) {
01926         tmp->drop_[i] = NULL;
01927         tmp->transition_[i] = -1;
01928     }
01929     tmp->batch_size_ = 6;
01930     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[5] = tmp;
01931     start_state_->drop_[0]->drop_[0]->drop_[0]->transition_[5] = RTT;
01932 
01933     tmp = new FSMState;
01934     for (i=0; i<17; i++) {
01935         tmp->drop_[i] = NULL;
01936         tmp->transition_[i] = -1;
01937     }
01938     tmp->batch_size_ = 2;
01939     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[2]->drop_[0] = tmp;
01940     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[2]->transition_[0] = RTT;
01941     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[4]->drop_[0] = tmp;
01942     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[4]->transition_[0] = RTT;
01943 
01944     tmp = new FSMState;
01945     for (i=0; i<17; i++) {
01946         tmp->drop_[i] = NULL;
01947         tmp->transition_[i] = -1;
01948     }
01949     tmp->batch_size_ = 3;
01950     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[3]->drop_[0] = tmp;
01951     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[3]->transition_[0] = RTT;
01952     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[5]->drop_[0] = tmp;
01953     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[5]->transition_[0] = RTT;
01954 
01955     //(wnd, ssh) == (8, 20)
01956     tmp = new FSMState;
01957     for (i=0; i<17; i++) {
01958         tmp->drop_[i] = NULL;
01959         tmp->transition_[i] = -1;
01960     }
01961     tmp->batch_size_ = 8;
01962     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0] = tmp;
01963     start_state_->drop_[0]->drop_[0]->drop_[0]->transition_[0] = RTT;
01964 
01965     tmp = new FSMState;
01966     for (i=0; i<17; i++) {
01967         tmp->drop_[i] = NULL;
01968         tmp->transition_[i] = -1;
01969     }
01970     tmp->batch_size_ = 3;
01971     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[2] = tmp;
01972     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->transition_[2] = RTT;
01973 
01974     tmp = new FSMState;
01975     for (i=0; i<17; i++) {
01976         tmp->drop_[i] = NULL;
01977         tmp->transition_[i] = -1;
01978     }
01979     tmp->batch_size_ = 4;
01980     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[3] = tmp;
01981     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->transition_[3] = RTT;
01982 
01983     tmp = new FSMState;
01984     for (i=0; i<17; i++) {
01985         tmp->drop_[i] = NULL;
01986         tmp->transition_[i] = -1;
01987     }
01988     tmp->batch_size_ = 4;
01989     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[2]->drop_[0] = tmp;
01990     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[2]->transition_[0] = RTT;
01991     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[3]->drop_[0] = tmp;
01992     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[3]->transition_[0] = RTT;
01993 
01994 
01995     tmp = new FSMState;
01996     for (i=0; i<17; i++) {
01997         tmp->drop_[i] = NULL;
01998         tmp->transition_[i] = -1;
01999     }
02000     tmp->batch_size_ = 1;
02001     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[4] = tmp;
02002     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->transition_[4] = RTT;
02003 
02004     tmp = new FSMState;
02005     for (i=0; i<17; i++) {
02006         tmp->drop_[i] = NULL;
02007         tmp->transition_[i] = -1;
02008     }
02009     tmp->batch_size_ = 2;
02010     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[5] = tmp;
02011     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->transition_[5] = RTT;
02012 
02013     tmp = new FSMState;
02014     for (i=0; i<17; i++) {
02015         tmp->drop_[i] = NULL;
02016         tmp->transition_[i] = -1;
02017     }
02018     tmp->batch_size_ = 8;
02019     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[6] = tmp;
02020     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->transition_[6] = RTT;
02021 
02022     tmp = new FSMState;
02023     for (i=0; i<17; i++) {
02024         tmp->drop_[i] = NULL;
02025         tmp->transition_[i] = -1;
02026     }
02027     tmp->batch_size_ = 9;
02028     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[7] = tmp;
02029     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->transition_[7] = RTT;
02030 
02031     tmp = new FSMState;
02032     for (i=0; i<17; i++) {
02033         tmp->drop_[i] = NULL;
02034         tmp->transition_[i] = -1;
02035     }
02036     tmp->batch_size_ = 11;
02037     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[8] = tmp;
02038     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->transition_[8] = RTT;
02039 
02040     //(wnd, ssh) == (12, 20)
02041     tmp = new FSMState;
02042     for (i=0; i<17; i++) {
02043         tmp->drop_[i] = NULL;
02044         tmp->transition_[i] = -1;
02045     }
02046     tmp->batch_size_ = 12;
02047     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0] = tmp;
02048     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->transition_[0] = RTT;
02049 
02050     tmp = new FSMState;
02051     for (i=0; i<17; i++) {
02052         tmp->drop_[i] = NULL;
02053         tmp->transition_[i] = -1;
02054     }
02055     tmp->batch_size_ = 1;
02056     for (i=1; i<13; i++) start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[i] = tmp;
02057     for (i=1; i<10; i++)
02058         start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->transition_[i] = RTT;
02059     for (i=10; i<13; i++)
02060         start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->transition_[i] = TIMEOUT;
02061 
02062 
02063     //(wnd, ssh) == (1, 2), timeout
02064     tmp = new FSMState;
02065     for (i=0; i<17; i++) {
02066         tmp->drop_[i] = NULL;
02067         tmp->transition_[i] = -1;
02068     }
02069     tmp->batch_size_ = 1;
02070     start_state_->drop_[1] = tmp;
02071     start_state_->transition_[1] = TIMEOUT;
02072     start_state_->drop_[0]->drop_[1] = tmp;
02073     start_state_->drop_[0]->transition_[1] = TIMEOUT;
02074     start_state_->drop_[0]->drop_[2]->drop_[0] = tmp;
02075     start_state_->drop_[0]->drop_[2]->transition_[0] = TIMEOUT;
02076 
02077     start_state_->drop_[0]->drop_[0]->drop_[1] = tmp;
02078     start_state_->drop_[0]->drop_[0]->transition_[1] = TIMEOUT;
02079     start_state_->drop_[0]->drop_[0]->drop_[2]->drop_[0] = tmp;
02080     start_state_->drop_[0]->drop_[0]->drop_[2]->transition_[0] = TIMEOUT;
02081 
02082     //(wnd, ssh) == (2, 2)
02083     tmp = new FSMState;
02084     for (i=0; i<17; i++) {
02085         tmp->drop_[i] = NULL;
02086         tmp->transition_[i] = -1;
02087     }
02088     tmp->batch_size_ = 2;
02089     start_state_->drop_[1]->drop_[0] = tmp;
02090     start_state_->drop_[1]->transition_[0] = RTT;
02091 
02092     //(wnd, ssh) == (2.5, 2)
02093     tmp = new FSMState;
02094     for (i=0; i<17; i++) {
02095         tmp->drop_[i] = NULL;
02096         tmp->transition_[i] = -1;
02097     }
02098     tmp->batch_size_ = 2;
02099     start_state_->drop_[1]->drop_[0]->drop_[0] = tmp;
02100     start_state_->drop_[1]->drop_[0]->transition_[0] = RTT;
02101 
02102     //(wnd, ssh) == (2.9, 2)
02103     tmp = new FSMState;
02104     for (i=0; i<17; i++) {
02105         tmp->drop_[i] = NULL;
02106         tmp->transition_[i] = -1;
02107     }
02108     tmp->batch_size_ = 2;
02109     start_state_->drop_[1]->drop_[0]->drop_[0]->drop_[0] = tmp;
02110     start_state_->drop_[1]->drop_[0]->drop_[0]->transition_[0] = RTT;
02111 
02112     //(wnd, ssh) == (3, 2)
02113     tmp = new FSMState;
02114     for (i=0; i<17; i++) {
02115         tmp->drop_[i] = NULL;
02116         tmp->transition_[i] = -1;
02117     }
02118     tmp->batch_size_ = 3;
02119     start_state_->drop_[1]->drop_[0]->drop_[0]->drop_[0]->drop_[0] = tmp;
02120     start_state_->drop_[1]->drop_[0]->drop_[0]->drop_[0]->transition_[0] = RTT;
02121 
02122     //(wnd, ssh) == (3.3, 2)
02123     tmp = new FSMState;
02124     for (i=0; i<17; i++) {
02125         tmp->drop_[i] = NULL;
02126         tmp->transition_[i] = -1;
02127     }
02128     tmp->batch_size_ = 3;
02129     start_state_->drop_[1]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0] = tmp;
02130     start_state_->drop_[1]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->transition_[0] = RTT;
02131 
02132     //(wnd, ssh) == (4, 2)
02133     tmp = new FSMState;
02134     for (i=0; i<17; i++) {
02135         tmp->drop_[i] = NULL;
02136         tmp->transition_[i] = -1;
02137     }
02138     tmp->batch_size_ = 4;
02139     start_state_->drop_[1]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0] = tmp;
02140     start_state_->drop_[1]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->transition_[0] = RTT;
02141 
02142     //(wnd, ssh) == (4.7, 2)
02143     tmp = new FSMState;
02144     for (i=0; i<17; i++) {
02145         tmp->drop_[i] = NULL;
02146         tmp->transition_[i] = -1;
02147     }
02148     tmp->batch_size_ = 4;
02149     start_state_->drop_[1]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0] = tmp;
02150     start_state_->drop_[1]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->transition_[0] = RTT;
02151 
02152     //(wnd, ssh) == (5, 2)
02153     tmp = new FSMState;
02154     for (i=0; i<17; i++) {
02155         tmp->drop_[i] = NULL;
02156         tmp->transition_[i] = -1;
02157     }
02158     tmp->batch_size_ = 5;
02159     start_state_->drop_[1]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0] = tmp;
02160     start_state_->drop_[1]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->transition_[0] = RTT;
02161 
02162     //(wnd, ssh) == (6, 2)
02163     tmp = new FSMState;
02164     for (i=0; i<17; i++) {
02165         tmp->drop_[i] = NULL;
02166         tmp->transition_[i] = -1;
02167     }
02168     tmp->batch_size_ = 6;
02169     start_state_->drop_[1]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0] = tmp;
02170     start_state_->drop_[1]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->transition_[0] = RTT;
02171 
02172 
02173     //(wnd, ssh) == (2, 2), rtt
02174     tmp = new FSMState;
02175     for (i=0; i<17; i++) {
02176         tmp->drop_[i] = NULL;
02177         tmp->transition_[i] = -1;
02178     }
02179     tmp->batch_size_ = 2;
02180     start_state_->drop_[0]->drop_[0]->drop_[3]->drop_[0] = tmp;
02181     start_state_->drop_[0]->drop_[0]->drop_[3]->transition_[0] = RTT;
02182     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[1] = tmp;
02183     start_state_->drop_[0]->drop_[0]->drop_[0]->transition_[1] = RTT;
02184 
02185     //(wnd, ssh) == (2.5, 2)
02186     tmp = new FSMState;
02187     for (i=0; i<17; i++) {
02188         tmp->drop_[i] = NULL;
02189         tmp->transition_[i] = -1;
02190     }
02191     tmp->batch_size_ = 2;
02192     start_state_->drop_[0]->drop_[0]->drop_[3]->drop_[0]->drop_[0] = tmp;
02193     start_state_->drop_[0]->drop_[0]->drop_[3]->drop_[0]->transition_[0] = RTT;
02194 
02195     //(wnd, ssh) == (3, 2)
02196     tmp = new FSMState;
02197     for (i=0; i<17; i++) {
02198         tmp->drop_[i] = NULL;
02199         tmp->transition_[i] = -1;
02200     }
02201     tmp->batch_size_ = 3;
02202     start_state_->drop_[0]->drop_[0]->drop_[3]->drop_[0]->drop_[0]->drop_[0] = tmp;
02203     start_state_->drop_[0]->drop_[0]->drop_[3]->drop_[0]->drop_[0]->transition_[0] = RTT;
02204 
02205     //(wnd, ssh) == (4, 2)
02206     tmp = new FSMState;
02207     for (i=0; i<17; i++) {
02208         tmp->drop_[i] = NULL;
02209         tmp->transition_[i] = -1;
02210     }
02211     tmp->batch_size_ = 4;
02212     start_state_->drop_[0]->drop_[0]->drop_[3]->drop_[0]->drop_[0]->drop_[0]->drop_[0] = tmp;
02213     start_state_->drop_[0]->drop_[0]->drop_[3]->drop_[0]->drop_[0]->drop_[0]->transition_[0] = RTT;
02214 
02215     //(wnd, ssh) == (4.3, 2)
02216     tmp = new FSMState;
02217     for (i=0; i<17; i++) {
02218         tmp->drop_[i] = NULL;
02219         tmp->transition_[i] = -1;
02220     }
02221     tmp->batch_size_ = 4;
02222     start_state_->drop_[0]->drop_[0]->drop_[3]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0] = tmp;
02223     start_state_->drop_[0]->drop_[0]->drop_[3]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->transition_[0] = RTT;
02224 
02225     //(wnd, ssh) == (4.7, 2)
02226     tmp = new FSMState;
02227     for (i=0; i<17; i++) {
02228         tmp->drop_[i] = NULL;
02229         tmp->transition_[i] = -1;
02230     }
02231     tmp->batch_size_ = 4;
02232     start_state_->drop_[0]->drop_[0]->drop_[3]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0] = tmp;
02233     start_state_->drop_[0]->drop_[0]->drop_[3]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->transition_[0] = RTT;
02234 
02235     //(wnd, ssh) == (5, 2)
02236     tmp = new FSMState;
02237     for (i=0; i<17; i++) {
02238         tmp->drop_[i] = NULL;
02239         tmp->transition_[i] = -1;
02240     }
02241     tmp->batch_size_ = 5;
02242     start_state_->drop_[0]->drop_[0]->drop_[3]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0] = tmp;
02243     start_state_->drop_[0]->drop_[0]->drop_[3]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->transition_[0] = RTT;
02244 
02245 
02246     //(wnd, ssh) == (3.3, 3)
02247     tmp = new FSMState;
02248     for (i=0; i<17; i++) {
02249         tmp->drop_[i] = NULL;
02250         tmp->transition_[i] = -1;
02251     }
02252     tmp->batch_size_ = 3;
02253     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[2]->drop_[0]->drop_[0] = tmp;
02254     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[2]->drop_[0]->transition_[0] = RTT;
02255     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[3]->drop_[0]->drop_[0] = tmp;
02256     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[3]->drop_[0]->transition_[0] = RTT;
02257 
02258     tmp = new FSMState;
02259     for (i=0; i<17; i++) {
02260         tmp->drop_[i] = NULL;
02261         tmp->transition_[i] = -1;
02262     }
02263     tmp->batch_size_ = 4;
02264     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[2]->drop_[0]->drop_[0]->drop_[0] = tmp;
02265     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[2]->drop_[0]->drop_[0]->transition_[0] = RTT;
02266 
02267     tmp = new FSMState;
02268     for (i=0; i<17; i++) {
02269         tmp->drop_[i] = NULL;
02270         tmp->transition_[i] = -1;
02271     }
02272     tmp->batch_size_ = 4;
02273     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[2]->drop_[0]->drop_[0]->drop_[0]->drop_[0] = tmp;
02274     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[2]->drop_[0]->drop_[0]->drop_[0]->transition_[0] = RTT;
02275 
02276     tmp = new FSMState;
02277     for (i=0; i<17; i++) {
02278         tmp->drop_[i] = NULL;
02279         tmp->transition_[i] = -1;
02280     }
02281     tmp->batch_size_ = 5;
02282     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[2]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0] = tmp;
02283     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[2]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->transition_[0] = RTT;
02284 
02285     tmp = new FSMState;
02286     for (i=0; i<17; i++) {
02287         tmp->drop_[i] = NULL;
02288         tmp->transition_[i] = -1;
02289     }
02290     tmp->batch_size_ = 5;
02291     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[2]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0] = tmp;
02292     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[2]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[0]->transition_[0] = RTT;
02293 
02294     //(wnd, ssh) == (4, 4)
02295     tmp = new FSMState;
02296     for (i=0; i<17; i++) {
02297         tmp->drop_[i] = NULL;
02298         tmp->transition_[i] = -1;
02299     }
02300     tmp->batch_size_ = 4;
02301     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[1] = tmp;
02302     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->transition_[1] = RTT;
02303 
02304     tmp = new FSMState;
02305     for (i=0; i<17; i++) {
02306         tmp->drop_[i] = NULL;
02307         tmp->transition_[i] = -1;
02308     }
02309     tmp->batch_size_ = 4;
02310     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[1]->drop_[0] = tmp;
02311     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[1]->transition_[0] = RTT;
02312     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[2]->drop_[0]->drop_[0] = tmp;
02313     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[2]->drop_[0]->transition_[0] = RTT;
02314 
02315 
02316     tmp = new FSMState;
02317     for (i=0; i<17; i++) {
02318         tmp->drop_[i] = NULL;
02319         tmp->transition_[i] = -1;
02320     }
02321     tmp->batch_size_ = 5;
02322     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[1]->drop_[0]->drop_[0] = tmp;
02323     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[1]->drop_[0]->transition_[0] = RTT;
02324 
02325 
02326     //(wnd, ssh) == (5, 5)  
02327     tmp = new FSMState;
02328     for (i=0; i<17; i++) {
02329         tmp->drop_[i] = NULL;
02330         tmp->transition_[i] = -1;
02331     }
02332     tmp->batch_size_ = 5;
02333     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[4]->drop_[0] = tmp;
02334     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[4]->transition_[0] = 0;
02335     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[5]->drop_[0] = tmp;
02336     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[5]->transition_[0] = 0;
02337     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[6]->drop_[0] = tmp;
02338     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[6]->transition_[0] = RTT;
02339     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[7]->drop_[0] = tmp;
02340     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[7]->transition_[0] = RTT;
02341 
02342 
02343     tmp = new FSMState;
02344     for (i=0; i<17; i++) {
02345         tmp->drop_[i] = NULL;
02346         tmp->transition_[i] = -1;
02347     }
02348     tmp->batch_size_ = 5;
02349     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[4]->drop_[0]->drop_[0] = tmp;
02350     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[4]->drop_[0]->transition_[0] = RTT;
02351 
02352     tmp = new FSMState;
02353     for (i=0; i<17; i++) {
02354         tmp->drop_[i] = NULL;
02355         tmp->transition_[i] = -1;
02356     }
02357     tmp->batch_size_ = 5;
02358     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[4]->drop_[0]->drop_[0]->drop_[0] = tmp;
02359     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[4]->drop_[0]->drop_[0]->transition_[0] = RTT;
02360 
02361     //(wnd, ssh) == (6, 6)
02362     tmp = new FSMState;
02363     for (i=0; i<17; i++) {
02364         tmp->drop_[i] = NULL;
02365         tmp->transition_[i] = -1;
02366     }
02367     tmp->batch_size_ = 6;
02368     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[8]->drop_[0] = tmp;
02369     start_state_->drop_[0]->drop_[0]->drop_[0]->drop_[0]->drop_[8]->transition_[0] = RTT;
02370 
02371     //print_FSM(start_state_);
02372     //printf("\n");
02373 }
02374 

Generated on Tue Mar 6 16:47:45 2007 for ns2 Network Simulator 2.29 by  doxygen 1.4.6