root/vic/branches/cc/cc/tfwc_sndr.h @ 4628

Revision 4628, 8.0 KB (checked in by soohyunc, 4 years ago)

(1) average loss interval should be an integer variable
(2) tsvec_ calculation fixed (seqno was off by one)
(3) printing HISTORY items
(4) printing ALI value

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Rev URL
Line 
1/*
2 * Copyright (c) 2008-2010 University College London
3 * All rights reserved.
4 *
5 * AUTHOR: Soo-Hyun Choi <s.choi@cs.ucl.ac.uk>
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 *    notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 *    notice, this list of conditions and the following disclaimer in the
14 *    documentation and/or other materials provided with the distribution.
15 * 3. Neither the name of the University nor of the Laboratory may be used
16 *    to endorse or promote products derived from this software without
17 *    specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 * SUCH DAMAGE.
30 *
31 * $Id$
32 */
33
34#ifndef vic_tfwc_sndr_h
35#define vic_tfwc_sndr_h
36
37#include "bitmap.h"     // bitmap operations
38
39#define DUPACKS 3   // simulating TCP's 3 dupacks
40#define TSZ     1000    // tsvec_ size
41#define SSZ 1000        // seqvec_ size
42
43#define SHORT_HISTORY           // history size = 8
44#ifdef  SHORT_HISTORY
45#define HSZ 8   // history size for avg loss history
46#else
47#define HSZ 16  // history size for avg loss history
48#endif
49
50#define T_RTTVAR_BITS   2       // XXX not used
51#define T_SRTT_BITS             3       // XXX not used
52
53#define BITLEN  16
54
55class TfwcSndr {
56public:
57        TfwcSndr();
58        // parse seqno and timestamp
59        void tfwc_sndr_send(int, double, double);
60
61        // main reception path (XR packet)
62        void tfwc_sndr_recv(u_int16_t type, u_int16_t begin, u_int16_t end,
63                        u_int16_t *chunk);
64
65        // return ackofack
66        inline u_int16_t tfwc_sndr_get_aoa() { return aoa_; }
67
68        // return just acked seqno
69        inline u_int16_t tfwc_sndr_jacked() { return jacked_; }
70
71        // return tfwc controlled cwnd value
72        inline u_int32_t tfwc_magic() { return cwnd_; };
73
74        // set timestamp in u_int32_t type (TfwcSndr)
75        inline u_int32_t tfwc_sndr_t_now() {
76                timeval tv;
77                ::gettimeofday(&tv, 0);
78                return (tv.tv_sec + tv.tv_usec);
79        }
80
81        // set timestamp in double type (TfwcSndr)
82        inline double tfwc_sndr_now() {
83                timeval tv;
84                ::gettimeofday(&tv, NULL);
85                return ((double) tv.tv_sec + 1e-6 * (double) tv.tv_usec);
86        }
87
88        // return the current time
89        inline double now() { return (tfwc_sndr_now()-ts_off_); }
90
91        // return timestamp in u_int32_t type
92        inline u_int32_t tfwc_sndr_get_ts() { return t_now_; }
93
94        // variables
95        u_int16_t seqno_;       // packet sequence number
96        u_int32_t cwnd_;        // congestion window
97
98protected:
99        // generate sequence numbers
100        void gen_seqvec(u_int16_t *v, int n);
101
102        // init loss related variables
103        inline void init_loss_var() {
104                is_loss_ = false;
105                num_loss_ = 0;
106        }
107
108        // get the first position in ackvec where 1 is marked
109        inline u_int16_t get_head_pos(u_int16_t ackvec) {
110                int l;
111                for (l = 0; l < BITLEN; l++) {
112                        if(GET_HEAD_VEC(ackvec, l))
113                                break;
114                }
115                return (BITLEN - l);
116        }
117        // get the last position in ackvec where 1 is marked
118        inline u_int16_t get_tail_pos(u_int16_t ackvec) {
119                int l;
120                for (l = 0; l < BITLEN; l++) {
121                        if(GET_TAIL_VEC(ackvec, l))
122                                break;
123                }
124                return (l + 1);
125        }
126        // generate margin vector
127        inline void marginvec(u_int16_t hseq) {
128                for (int i = 0; i < DUPACKS; i++)
129                        // round up if it is less than zero
130                        mvec_[i] = ((hseq - i) < 0) ? 0 : (hseq - i);
131        }
132        // ackofack
133        inline u_int16_t ackofack () {
134                return ((mvec_[DUPACKS - 1] - 1) <= 0) ?
135                        0 : (u_int16_t) (mvec_[DUPACKS - 1] - 1);
136        }
137        // print mvec
138        inline void print_mvec() {
139                fprintf(stderr, "\tmargin numbers: ( %d %d %d )\n",
140                                mvec_[0], mvec_[1], mvec_[2]);
141        }
142        // printf seqvec
143        inline void print_seqvec(int numelm) {
144                fprintf(stderr, "\tsequence numbers: (");
145                for (int i = 0; i < numelm; i++)
146                        fprintf(stderr, " %d", seqvec_[i]);
147                fprintf(stderr, " )\n");
148        }
149
150        int mvec_[DUPACKS]; // margin vec (simulatinmg TCP 3 dupacks)
151        u_int16_t *ackv_;       // received AckVec (from TfwcRcvr)
152        u_int32_t pvec_;        // sent packet list
153        u_int16_t aoa_;         // ack of ack
154        u_int32_t t_now_;       // the time when the data packet sent
155        u_int32_t t_ts_;                // time stamp (u_int32_t type)
156        u_int32_t t_ts_echo_;   // echo time stamp from the receiver
157        double ts_;                     // time stamp (double type)
158        double ts_echo_;        // time stamp echo (double type)
159        double now_;            // real-time now
160        double tao_;            // sampled RTT
161private:
162        // update RTT
163        void update_rtt(double tao);
164
165        // detect packet loss
166        bool detect_loss(int, int);
167
168        // control congestion window
169        void control();
170
171        // calcuate average loss interval
172        void avg_loss_interval();
173        void print_history_item (int);
174
175        // calculate loss history
176        void loss_history();
177
178        // estimate loss history and loss probability
179        void pseudo_p();
180        void pseudo_history();
181
182        // generate weight factors
183        void gen_weight();
184
185        // dupack action
186        void dupack_action();
187
188        // AckVec clone from Vic
189        inline void clone_ackv(u_int16_t *c, int n) {
190                for (int i = 0; i < n; i++)
191                        ackv_[i] = ntohs(c[i]);
192        }
193
194        // clear timestamp vector
195        inline void clear_tsv (int n) {
196                for (int i = 0; i < n; i++)
197                        tsvec_[i] = 0;
198        }
199
200        // clear seqvec
201        inline void clear_sqv (int n) {
202                for (int i = 0; i < n; i++)
203                        seqvec_[i] = 0;
204        }
205
206        // clear ackvec
207        inline void clear_ackv (int n) {
208                for (int i = 0; i < n; i++)
209                        ackv_[i] = 0;
210        }
211
212        int ndtp_;              // number of data packet sent
213        int nakp_;              // number of ackvec packet received
214        int ntep_;              // number of ts echo packet received
215        int nsve_;              // number of seqvec element
216        int epoch_;             // communication epoch
217
218        bool is_running_;       // is TFWC running?
219        double ts_off_;         // timestamp offset for gettimeofday
220        u_int32_t ref_t_time_;  // reference time (uint32 format)
221
222        u_int32_t *seqvec_;             // generated seqno vec
223        int     num_seqvec_;            // number of seqvec elements
224        double *tsvec_;                 // timestamp vector
225        u_int16_t jacked_;              // just acked seqno (head of ackvec)
226        bool is_loss_;
227        bool is_first_loss_seen_;
228        bool is_tfwc_on_;
229        int num_loss_;  // number of detected packet loss
230        double f_p_;    // f(p) = sqrt(2/3)*p + 12*p*(1+32*p^2)*sqrt(3/8)*p
231        double p_;              // packet loss probability
232        double t_win_;      // temporal cwin size to get p_ value
233        int tmp_cwnd_;      // temporary cwnd value
234        double pseudo_p_;       // faked packet loss probability
235        double pseudo_interval_;// faked loss interval
236        double avg_interval_;   // average loss interval
237        int history_[HSZ+1];    // loss interval history
238        double weight_[HSZ+1];  // weight for calculating avg loss interval
239        double I_tot_;          // total sum
240        double I_tot0_;         // from 0 to n-1
241        double I_tot1_;         // form 1 to n
242        double tot_weight_;     // total weight
243        int hsz_;               // current history size
244        u_int32_t first_elm_;
245        u_int32_t last_elm_;
246
247        // RTT related variables
248        double srtt_;   // smoothed RTT
249        double rttvar_; // RTT variation
250        double rto_;    // retransmission timeout
251        double minrto_; // min RTO allowed
252        double maxrto_; // max RTO
253        double alpha_;  // smoothing factor for RTT/RTO calculation
254        double beta_;   // smoothing factor for RTT/RTO calculation
255        double g_;              // timer granularity
256        int k_;                 // k value
257        double t0_;             // t0 value at TCP throughput equation
258        double df_;             // decay factor
259        double sqrtrtt_;        // the mean of the sqrt of RTT
260
261        // first lost packet (used only at the very first packet loss)
262        int first_lost_pkt_;
263
264        // XR chunk begin/end
265        u_int16_t begins_;      // start seqno that this XR chunk reports
266        u_int16_t ends_;        // end seqno + 1 that this XR chunk reports
267        int     num_elm_;               // number of ackvec elements
268        int num_vec_;           // numver of ackvec chunks
269};
270
271#endif
Note: See TracBrowser for help on using the browser.