[Sumover-dev] [svn commit] r4798 - vic/branches/cc/cc
sumover-dev at cs.ucl.ac.uk
sumover-dev at cs.ucl.ac.uk
Fri May 7 19:02:18 BST 2010
Author: soohyunc
Date: Fri May 7 19:02:18 2010
New Revision: 4798
Modified:
vic/branches/cc/cc/tfrc_sndr.cpp
vic/branches/cc/cc/tfrc_sndr.h
vic/branches/cc/cc/tfwc_sndr.h
Log:
added TFRC sender functions - mainly recv() method oriented.
Modified: vic/branches/cc/cc/tfrc_sndr.cpp
==============================================================================
--- vic/branches/cc/cc/tfrc_sndr.cpp (original)
+++ vic/branches/cc/cc/tfrc_sndr.cpp Fri May 7 19:02:18 2010
@@ -37,6 +37,7 @@
#include <sys/types.h>
#include "assert.h"
#include "rtp.h"
+#include "inet.h"
#include "pktbuf-rtp.h"
#include "vic_tcl.h"
#include "module.h"
@@ -47,5 +48,216 @@
// TfrcSndr instance
TfrcSndr TfrcSndr::instance_;
-TfrcSndr::TfrcSndr() {
+TfrcSndr::TfrcSndr() :
+ seqno_(0),
+ x_rate_(0),
+ aoa_(0),
+ now_(0),
+ so_recv_(0),
+ ndtp_(0),
+ nakp_(0),
+ ntep_(0),
+ nsve_(0),
+ jacked_(0),
+ begins_(0),
+ ends_(0),
+ num_elm_(1),
+ num_vec_(1)
+{
+ // allocate tsvec_ in memory
+ tsvec_ = (double *) malloc(sizeof(double) * TSZ);
+ clear_tsv(TSZ);
+ // allocate seqvec in memory
+ seqvec_ = (u_int32_t *) malloc(sizeof(u_int32_t) * SSZ);
+ clear_sqv(SSZ);
+ num_seqvec_ = 0;
+ // allocate refvec in memory
+ refvec_ = (u_int32_t *) malloc(sizeof(u_int32_t) + RSZ);
+ clear_refv(RSZ);
+ num_refvec_ = 0;
+
+ // initialize variables
+ ts_ = 0.0;
+ num_missing_ = 0;
+
+ // EWMA packet size
+ asize_ = 0;
+ pcnt_ = 0;
+ psize_ = 1000;
+ lambda1_ = .75;
+ lambda2_ = .15;
+}
+
+/*
+ * TFRC send
+ */
+void TfrcSndr::send(pktbuf* pb, double now) {
+ // the very first data packet
+ if(seqno_ == 0)
+ ts_off_ = tx_ts_offset();
+
+ // parse seqno and mark timestamp for this data packet
+ rtphdr* rh = (rtphdr *) pb->data;
+ seqno_ = ntohs(rh->rh_seqno);
+ now_ = now;
+
+ // alrithmetic average packet size (per frame)
+ asize_ += pb->len;
+ pcnt_++;
+
+ // tag finished (end of frame)
+ if (!(pb->tag)) {
+ asize_ /= pcnt_;
+ // EWMA'd packet size
+ if (pcnt_ != 1)
+ psize_ = lambda1_ * asize_ + (1 - lambda1_) * psize_;
+ else
+ psize_ = lambda2_ * asize_ + (1 - lambda2_) * psize_;
+
+ asize_ = 0; pcnt_ = 0;
+ }
+
+ // timestamp vector for loss history update
+ tsvec_[seqno_%TSZ] = now_-SKEW;
+
+ // sequence number must be greater than zero
+ assert (seqno_ > 0);
+ // number of total data packet sent
+ ndtp_++;
+}
+
+/*
+ * main TFRC reception path
+ */
+void TfrcSndr::recv(u_int16_t type, u_int16_t begin, u_int16_t end,
+ u_int16_t *chunk, double so_rtime, bool recv_by_ch, pktbuf* pb)
+{
+ UNUSED(recv_by_ch);
+ UNUSED(pb);
+
+ switch(type) {
+ // XR block type 1
+ case XR_BT_1:
+ {
+ // number of ack received
+ nakp_++;
+ // so_timestamp
+ so_recv_ = so_rtime;
+
+ // get start/end seqno that this XR chunk reports
+ begins_ = begin; // lowest packet seqno
+ ends_ = end; // highest packet seqno plus one
+
+ // just acked seqno
+ // i.e.,) head seqno(= highest seqno) of this ackvec
+ jacked_ = ends_ - 1;
+
+ // get the number of AckVec chunks
+ // use seqno space to work out the num chunks
+ // (add one to num unless exactly divisible by BITLEN
+ // - so it is large enough to accomodate all the bits)
+ num_elm_ = get_numelm(begins_, jacked_);
+ num_vec_ = get_numvec(num_elm_);
+
+ // declared AckVec
+ ackv_ = (u_int16_t *) malloc (sizeof(u_int16_t) * num_vec_);
+ // clear the existing AckVec
+ clear_ackv(num_vec_);
+ // clone AckVec from Vic
+ clone_ackv(chunk, num_vec_);
+
+ // generate seqno vector
+ gen_seqvec(ackv_, num_vec_);
+ // generate reference vector
+ // (it represents seqvec when no losses)
+ // @begin: aoa_+1 (lowest seqno)
+ // @end: jacked_
+ gen_refvec(jacked_, aoa_+1);
+
+ // TFRC congestioin control
+ calc_rate();
+
+ // set ackofack (real number)
+ aoa_ = jacked_;
+
+ // sampled RTT
+ tao_ = so_recv_ - tsvec_[jacked_%TSZ];
+ // update RTT with the sampled RTT
+ update_rtt(tao_);
+ }
+ break;
+
+ // XR block type 3
+ case XR_BT_3:
+ {}
+ break;
+ }
+}
+
+/*
+ * generate seqno vector
+ * (interpret the received AckVec to real sequence numbers)
+ * @ackvec: receivec AckVec
+ */
+void TfrcSndr::gen_seqvec(u_int16_t *v, int n) {
+ // clear seqvec before starts
+ clear_sqv(num_seqvec_);
+
+ int i, j, k = 0;
+ int x = num_elm_%BITLEN;
+
+ // start of seqvec (lowest seqno)
+ int start = begins_;
+
+ for (i = 0; i < n-1; i++) {
+ for (j = BITLEN; j > 0; j--) {
+ if( CHECK_BIT_AT(v[i], j) )
+ seqvec_[k++%SSZ] = start;
+ else num_missing_++;
+ start++;
+ }
+ }
+
+ int a = (x == 0) ? BITLEN : x;
+ for (i = a; i > 0; i--) {
+ if( CHECK_BIT_AT(v[n-1], i) )
+ seqvec_[k++%SSZ] = start;
+ else num_missing_++;
+ start++;
+ }
+
+ // therefore, the number of seqvec elements is:
+ num_seqvec_ = num_elm_ - num_missing_;
+}
+
+/*
+ * generate reference vector
+ * (it represents seqno vector when no losses)
+ * @end: end seqno (highest)
+ * @begin: begin seqno (lowest)
+ */
+void TfrcSndr::gen_refvec(int end, int begin) {
+ // clear previous reference vector
+ clear_refv(num_refvec_);
+ // number of reference element - when no loss
+ num_refvec_ = end - begin + 1;
+
+ // generate refvec elements
+ fprintf(stderr, "\tcomparing numbers: (");
+ for (int i = 0; i < num_refvec_; i++) {
+ refvec_[i] = begin + i;
+ fprintf(stderr, " %d", refvec_[i]);
+ } fprintf(stderr, " )\n");
+}
+
+/*
+ * calculate sending rate
+ */
+void TfrcSndr::calc_rate() {
+}
+
+/*
+ * update RTT using sampled RTT value
+ */
+void TfrcSndr::update_rtt(double tao) {
}
Modified: vic/branches/cc/cc/tfrc_sndr.h
==============================================================================
--- vic/branches/cc/cc/tfrc_sndr.h (original)
+++ vic/branches/cc/cc/tfrc_sndr.h Fri May 7 19:02:18 2010
@@ -49,6 +49,22 @@
TfrcSndr();
virtual ~TfrcSndr() {};
+ // virtual functions
+ virtual void tfrc_output(bool recv_by_ch=0) {UNUSED(recv_by_ch);};
+ virtual void tfrc_output(pktbuf*) {};
+ virtual double tx_ts_offset() {};
+ virtual int tx_buf_size() {};
+
+ // parse seqno and timestamp
+ void send(pktbuf*, double);
+
+ // main reception path
+ void recv(u_int16_t, u_int16_t, u_int16_t,
+ u_int16_t*, double, bool, pktbuf*);
+
+ u_int16_t seqno_; // packet sequence number
+ double x_rate_; // send rate
+
// TfrcSndr instance
static inline TfrcSndr& instance() { return instance_; }
@@ -56,8 +72,90 @@
static TfrcSndr instance_;
+ // generate sequence numbers
+ void gen_seqvec(u_int16_t *v, int n);
+ // generate reference seqno
+ void gen_refvec(int end, int begin);
+
+ u_int16_t *ackv_; // received AckVec
+ u_int16_t aoa_; // ack of ack
+ double ts_; // timestamp
+ double now_; // real-time now
+ double so_recv_; // SO_TIMESTAMP
+ double tao_; // sampled RTT
+
+ // packet size
+ int asize_; // average packet size per frame
+ int pcnt_; // packet counter per frame
+ int psize_; // EWMA packet size
+ double lambda1_; // EWMA coeff
+ double lambda2_; // EWMA coeff
+
private:
+ // update RTT
+ void update_rtt(double tao);
+ // TFRC congestion control
+ void calc_rate();
+ // average loss interval
+ void avg_loss_interval();
+ // loss history
+ void loss_history();
+
+ // AckVec clone from Vic
+ inline void clone_ackv(u_int16_t *c, int n) {
+ for (int i = 0; i < n; i++)
+ ackv_[i] = ntohs(c[i]);
+ }
+ // number of ackvec elements
+ inline int get_numvec(int n) {
+ return (n/BITLEN + (n%BITLEN > 0));
+ }
+ // number of ackvec elements
+ inline int get_numelm (int begin, int end) {
+ return (end - begin + 1);
+ }
+ // clear timestamp vector
+ inline void clear_tsv (int n) {
+ for (int i = 0; i < n; i++)
+ tsvec_[i] = 0;
+ }
+ // clear seqvec
+ inline void clear_sqv (int n) {
+ for (int i = 0; i < n; i++)
+ seqvec_[i] = 0;
+ }
+ // clear ackvec
+ inline void clear_ackv (int n) {
+ for (int i = 0; i < n; i++)
+ ackv_[i] = 0;
+ }
+ // clear refvec
+ inline void clear_refv(int n) {
+ for (int i = 0; i < n; i++)
+ refvec_[i] = 0;
+ }
+
+ int ndtp_; // number of data packet sent
+ int nakp_; // number of ackvec packet received
+ int ntep_; // number of ts_echo packet received
+ int nsve_; // number of seqvec element
+
+ double ts_off_; // timestamp offset for gettimeofday
+
+ u_int32_t *seqvec_; // generated seqno vec
+ int num_seqvec_; // number of seqvec elements
+ u_int32_t *refvec_; // reference seqno vec
+ int num_refvec_; // number of refvec elements
+ double *tsvec_; // timestamp vector
+ u_int16_t jacked_; // just acked seqno (head of ackvec)
+ int num_missing_; // number of missing seqno
+
+ // XR chunk begin/end
+ u_int16_t begins_; // start seqno that this XR chunk reports
+ u_int16_t ends_; // end seqno + 1 that this XR chunk reports
+ int num_elm_; // number of ackvec elements
+ int num_vec_; // number of ackvec chunks
};
#endif
Modified: vic/branches/cc/cc/tfwc_sndr.h
==============================================================================
--- vic/branches/cc/cc/tfwc_sndr.h (original)
+++ vic/branches/cc/cc/tfwc_sndr.h Fri May 7 19:02:18 2010
@@ -420,7 +420,7 @@
u_int16_t begins_; // start seqno that this XR chunk reports
u_int16_t ends_; // end seqno + 1 that this XR chunk reports
int num_elm_; // number of ackvec elements
- int num_vec_; // numver of ackvec chunks
+ int num_vec_; // number of ackvec chunks
// TCP's RTO calculation
double alpha_; // smoothing factor for RTT/RTO calculation
More information about the Sumover-dev
mailing list