[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