Changeset 4524

Show
Ignore:
Timestamp:
10/22/09 00:19:40 (4 years ago)
Author:
soohyunc
Message:

1) bug fix: there was a bug in re-constructing the received AckVec? into a sequence vector

2) bug fix: there was a bug about bzero-ing

  • it had to be bzero'd manually

3) so, added "clear ackvec" and "clear seqvec" stuffs using (2).

Location:
vic/branches/cc/cc
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • vic/branches/cc/cc/tfwc_sndr.cpp

    r4522 r4524  
    6161        jacked_(0), 
    6262        begins_(0), 
    63         ends_(0) 
     63        ends_(0), 
     64        num_elm_(1), 
     65        num_vec_(1) 
    6466{ 
    6567        // allocate tsvec_ in memory 
    6668        tsvec_ = (double *)malloc(sizeof(double) * TSZ); 
    67         bzero(tsvec_, TSZ); 
     69        clear_tsv(TSZ); 
    6870 
    6971        // allocate seqvec in memory 
    7072        seqvec_ = (u_int32_t *)malloc(sizeof(u_int32_t) * SSZ); 
    71         bzero(seqvec_, SSZ); 
     73        clear_sqv(SSZ); 
     74        num_seqvec_ = 0; 
    7275 
    7376        // is TFWC running? 
     
    150153        // get start/end seqno that this XR chunk reports 
    151154        begins_ = begin;        // lowest packet seqno 
    152         ends_ = end;            // highest packet seqno 
     155        ends_ = end;            // highest packet seqno plus one 
    153156 
    154157        // get the number of AckVec chunks 
     
    156159        //   (add one to num unless exactly divisible by BITLEN 
    157160        //   - so it is large enough to accomodate all the bits 
    158         int num_chunks = (ends_-begins_)/BITLEN + ((ends_-begins_)%BITLEN > 0); 
     161        num_elm_ = ends_ - begins_; 
     162        num_vec_ = num_elm_/BITLEN + (num_elm_%BITLEN > 0); 
    159163 
    160164        // retrieve ackvec 
     
    165169 
    166170                // declared AckVec 
    167                 ackv_ = (u_int16_t *) malloc (sizeof(u_int16_t) * num_chunks); 
    168                 bzero(ackv_, num_chunks); 
     171                ackv_ = (u_int16_t *) malloc (sizeof(u_int16_t) * num_vec_); 
     172                clear_ackv(num_vec_); 
    169173 
    170174                // clone AckVec from Vic  
    171                 for (int i = 0; i < num_chunks; i++)  
     175                for (int i = 0; i < num_vec_; i++)  
    172176                        ackv_[i] = ntohs(chunk[i]); 
    173177 
     
    176180 
    177181                // generate seqno vector 
     182                clear_sqv(num_seqvec_); 
    178183                gen_seqvec(ackv_); 
    179184 
     
    202207                        control(); 
    203208                } 
     209                printf("\tnow: %f\tcwnd: %d\n", now_, cwnd_); 
    204210 
    205211                // set ackofack (real number) 
     
    218224                ntep_++;                // number of ts echo packet received 
    219225 
    220                 ts_echo_ = chunk[num_chunks - 1]; 
     226                ts_echo_ = chunk[num_vec_ - 1]; 
    221227                printf("    [%s +%d] ts echo:   %f\n", __FILE__,__LINE__, ts_echo_); 
    222228 
     
    231237 * generate seqno vector  
    232238 * (interpret the received AckVec to real sequence numbers) 
    233  * @num_chunks: number of AckVec chunks 
    234239 * @ackvec: received AckVec 
    235240 */ 
    236241void TfwcSndr::gen_seqvec (u_int16_t *ackvec) { 
    237         // number of seqvec elements  
    238         // (i.e., number of packets that this AckVec is representing) 
    239         int num_elm = ends_ - begins_; 
    240  
    241         // number of AckVec chunks 
    242         int x = num_elm%BITLEN; 
    243         int num_chunks = num_elm/BITLEN + (x > 0); 
    244  
    245242        int i, j, k = 0; 
     243        int x = num_elm_%BITLEN; 
    246244 
    247245        // start of seqvec (lowest seqno) 
    248246        int start = begins_; 
    249247 
    250         for (i = 0; i < num_chunks-1; i++) { 
     248        for (i = 0; i < num_vec_-1; i++) { 
    251249                for (j = BITLEN; j > 0; j--) { 
    252250                        if( CHECK_BIT_AT(ackvec[i], j) ) 
    253                                 seqvec_[k%SSZ] = start; 
     251                                seqvec_[k++%SSZ] = start; 
    254252                        else num_loss_++; 
    255                         k++; start++; 
     253                        start++; 
    256254                } 
    257255        } 
     
    259257        int a = (x == 0) ? BITLEN : x; 
    260258        for (i = a; i > 0; i--) { 
    261                 if( CHECK_BIT_AT(ackvec[num_chunks-1], i) ) 
     259                if( CHECK_BIT_AT(ackvec[num_vec_-1], i) ) 
    262260                        seqvec_[k++%SSZ] = start; 
    263261                else num_loss_++; 
     
    265263        } 
    266264 
    267         // therefore, the number of seqvec is: 
    268         int num_seqvec = num_elm - num_loss_; 
     265        // therefore, the number of seqvec elements is: 
     266        num_seqvec_ = num_elm_ - num_loss_; 
    269267        // printing retrieved sequence numbers from received AckVec 
    270         print_seqvec(num_seqvec); 
     268        print_seqvec(num_seqvec_); 
    271269} 
    272270 
     
    281279 
    282280        // number of tempvec element when no loss 
    283         int num_elm = ((end - begin  + 1) < 0) ? 0 : (end - begin + 1); 
    284         u_int32_t tempvec[num_elm]; 
     281        //int num = ((end - begin  + 1) < 0) ? 0 : (end - begin + 1); 
     282        int num = end - begin + 1; 
     283        printf("\tnum_tempvec: %d\n", num); 
     284        u_int32_t tempvec[num]; 
    285285 
    286286        // generate tempvec elements 
    287287        printf("\tcomparing numbers: ("); 
    288         for (int i = 0; i < num_elm; i++) { 
     288        for (int i = 0; i < num; i++) { 
    289289                tempvec[i] = begin + i; 
    290290                printf(" %d", tempvec[i]); 
    291291        } printf(" )\n"); 
    292292 
    293         // number of seqvec element 
    294         int num_seqvec = num_elm - num_loss_; 
    295  
    296293        // compare tempvec and seqvec 
    297         for (int i = 0; i < num_elm; i++) { 
    298                 for (int j = num_seqvec-1; j >= 0; j--) { 
     294        for (int i = 0; i < num; i++) { 
     295                for (int j = num_seqvec_-1; j >= 0; j--) { 
    299296                        if (tempvec[i] == seqvec_[j]) { 
    300297                                is_there = true; 
     
    316313        // store tempvec elements for updating loss history 
    317314        first_elm_ = tempvec[0]; 
    318         last_elm_ = first_elm_ + num_elm; 
     315        last_elm_ = first_elm_ + num; 
    319316 
    320317        return ret = (count > 0) ? true : false; 
  • vic/branches/cc/cc/tfwc_sndr.h

    r4520 r4524  
    187187        void dupack_action(); 
    188188 
     189        // clear timestamp vector 
     190        inline void clear_tsv (int n) { 
     191                for (int i = 0; i < n; i++) 
     192                        tsvec_[i] = 0; 
     193        } 
     194 
     195        // clear seqvec 
     196        inline void clear_sqv (int n) { 
     197                for (int i = 0; i < n; i++) 
     198                        seqvec_[i] = 0; 
     199        } 
     200 
     201        // clear ackvec 
     202        inline void clear_ackv (int n) { 
     203                for (int i = 0; i < n; i++) 
     204                        ackv_[i] = 0; 
     205        } 
     206 
    189207        int ndtp_;              // number of data packet sent 
    190208        int nakp_;              // number of ackvec packet received 
     
    198216 
    199217        u_int32_t *seqvec_;             // generated seqno vec 
     218        int     num_seqvec_;            // number of seqvec elements 
    200219        double *tsvec_;                 // timestamp vector 
    201220        u_int16_t jacked_;              // just acked seqno (head of ackvec) 
     
    241260        u_int16_t begins_;      // start seqno that this XR chunk reports 
    242261        u_int16_t ends_;        // end seqno + 1 that this XR chunk reports 
     262        int     num_elm_;               // number of ackvec elements 
     263        int num_vec_;           // numver of ackvec chunks 
    243264}; 
    244265