[Sumover-dev] [svn commit] r4261 - vic/branches/cc/rtp

sumover-dev at cs.ucl.ac.uk sumover-dev at cs.ucl.ac.uk
Tue Aug 12 13:40:55 BST 2008


Author: soohyunc
Date: Tue Aug 12 13:40:54 2008
New Revision: 4261

Modified:
   vic/branches/cc/rtp/session.cpp
   vic/branches/cc/rtp/session.h

Log:
o  send_xreport_back() method created (receiver side's XR packet sending method)
o  To-do list still remains as in the previous commit.


Modified: vic/branches/cc/rtp/session.cpp
==============================================================================
--- vic/branches/cc/rtp/session.cpp	(original)
+++ vic/branches/cc/rtp/session.cpp	Tue Aug 12 13:40:54 2008
@@ -1154,11 +1154,13 @@
 void SessionManager::parse_xr_records(u_int32_t ssrc, rtcp_xr* xr, int cnt,
 				      const u_char* ep, Address & addr)
 {
+	UNUSED(ssrc);
 	UNUSED(cnt);
 	UNUSED(ep);
 	UNUSED(addr);
 
-	int xrlen = ntohs(xr->xr_len) << 2;
+	//int xrlen = ntohs(xr->xr_len) << 2;
+	u_int16_t flags = ntohs(xr->xr_flags >> 8);
 	u_int16_t ackofack = ntohs(xr->begin_seq);
 	u_int16_t seqno = ntohs(xr->end_seq);
 	debug_msg("AoA:	%d, SEQNO:	%d\n", ackofack, seqno);
@@ -1167,11 +1169,11 @@
 	if (seqno != ackofack) {
 		printf("RECEIVER RECEIVER!!\n");
 		// parse seqno, ackofack, and timestamp from XR report block
-		if(xr->xr_flags >> 8 == XR_BT_1) {
+		if(flags == XR_BT_1) {
 			ackofack_ = ackofack;
 			seqno_ = seqno;
 		}
-		else if(xr->xr_flags >> 8 == XR_BT_3) {
+		else if(flags == XR_BT_3) {
 			ts_ = ntohl((u_int32_t) &xr->chunk);
 		}
 
@@ -1179,17 +1181,17 @@
 		tfwc_rcvr_recv(seqno_, ackofack_, ts_);
 
 		// send receiver side XR report
-		ch_[0].send(build_ackv_pkt(xr, ssrc), xrlen);
-		ch_[0].send(build_ts_echo_pkt(xr, ssrc), xrlen);
+		ch_[0].send_ackv();
+		ch_[0].send_ts_echo();
 	}
 	// we received ackvec, so do sender stuffs here
 	else {
 		printf("SENDER SENDER!!\n");
 		// parse seqno, ackvec and timestamp echo from XR report block
-		if(xr->xr_flags >> 8 == XR_BT_1) {
+		if(flags == XR_BT_1) {
 			ackvec_ = ntohl((u_int32_t) &xr->chunk);
 		}
-		else if(xr->xr_flags >> 8 == XR_BT_3) {
+		else if(flags == XR_BT_3) {
 			ts_echo_ = ntohl((u_int32_t) &xr->chunk);
 		}
 
@@ -1198,37 +1200,84 @@
 	}
 }
 
-// build ackvec packet (RTCP XR packet)
-u_char* SessionManager::build_ackv_pkt(rtcp_xr* xr, u_int32_t ssrc)
+void CtrlHandler::send_ackv()
 {
-	xr->ssrc = htons(ssrc);		// UNUSED
+	sm_->build_ackv_pkt(this);
+}
 
-	// set XR block type
-	xr->xr_flags = XR_BT_1 << 8;
+void CtrlHandler::send_ts_echo()
+{
+	sm_->build_ts_echo_pkt(this);
+}
 
-	// make 'begin_seq' equal to 'end_seq'
-	xr->begin_seq = xr->end_seq;
+void SessionManager::build_ackv_pkt(CtrlHandler* ch)
+{
+	// RTCP XR (block type 1)
+	// this block contains ackvec
+	send_xreport_back(ch, XR_BT_1, 0);
+}
 
-	// get ackvec from TfwcRcvr
-	xr->chunk = (u_int32_t *) htonl(tfwc_rcvr_getvec());
-	
-	u_char* p = (u_char*) xr;
-	return (p);
+void SessionManager::build_ts_echo_pkt(CtrlHandler* ch)
+{
+	// RTCP XR (block type 3)
+	// this block contains timestamp echo
+	send_xreport_back(ch, XR_BT_3, 0);
 }
 
-// build timestamp packet (RTCP XR packet)
-u_char* SessionManager::build_ts_echo_pkt(rtcp_xr* xr, u_int32_t ssrc)
+void SessionManager::send_xreport_back(CtrlHandler* ch, int bt, int bye)
 {
-	xr->ssrc = htons(ssrc);		// UNUSED
+	UNUSED(bye);
+
+	SourceManager& sm = SourceManager::instance();
+	Source& s = *sm.localsrc();
+	rtcphdr* rh = (rtcphdr *)pktbuf_;
+	rh->rh_ssrc = s.srcid();
+	int flags = RTP_VERSION << 14;
+
+	// set RTCP flag to  XR packet
+	flags |= RTCP_PT_XR;
+
+	// declare XR packet
+	rtcp_xr* xr;
+	xr = (rtcp_xr*)(rh + 1);
+
+	// UNUSED
+	int xrssrc = 0;
+	xr->ssrc = htons(xrssrc);
+
+	// this block is used for giving ackvec
+	if (bt == XR_BT_1) {
+		// set XR block type
+		xr->xr_flags = htons(XR_BT_1 << 8);
+
+		// make 'begin_seq' equal to 'end_seq'
+		xr->begin_seq = htons(xr->end_seq);
 
-	// set XR block type
-	xr->xr_flags = XR_BT_3 << 8;
+		// get ackvec from TfwcRcvr
+		xr->chunk = (u_int32_t *) htonl(tfwc_rcvr_getvec());
+	}
+	// this block is used for giving timiestamp echo
+	else if (bt == XR_BT_3) {
+		// set XR block type
+		xr->xr_flags = htons(XR_BT_3 << 8);
+	
+		// get timestamp echo from TfwcRcvr
+		xr->chunk = (u_int32_t *) htonl(tfwc_rcvr_ts_echo());
+	}
 
-	// get timestamp echo from TfwcRcvr
-	xr->chunk = (u_int32_t *) htonl(tfwc_rcvr_ts_echo());
+	// XR report block length
+	int xrlen = (u_char *)xr - pktbuf_;
+	xr->xr_len = htons((xrlen >> 2) - 1);
+
+	// RTCP header flags
+	rh->rh_flags = htons(flags);
+
+	// RTCP packet length
+	int len = (u_char *)xr - pktbuf_;
+	rh->rh_len = htons((len >> 2) - 1);
 
-	u_char* p = (u_char*) xr;
-	return (p);
+	// send XR report block (this is ackvec)
+	ch->send(pktbuf_, len);
 }
 
 int SessionManager::sdesbody(u_int32_t* p, u_char* ep, Source* ps,

Modified: vic/branches/cc/rtp/session.h
==============================================================================
--- vic/branches/cc/rtp/session.h	(original)
+++ vic/branches/cc/rtp/session.h	Tue Aug 12 13:40:54 2008
@@ -96,6 +96,8 @@
 	inline double rint() const { return (rint_); }
 	void send_aoa();	// send ackofack (TfwcSndr side)
 	void send_ts();		// send timestamp (TfwcSndr side)
+	void send_ackv();
+	void send_ts_echo();
 
  protected:
 	void schedule_timer();
@@ -112,12 +114,6 @@
 	SessionManager& sm_;
 };
 
-// set AckVec bitmap
-//#define SET_BIT_VEC(ackvec_, bit) (ackvec_ = ((ackvec_ << 1) | bit))
-
-// see AckVec bitmap
-//#define SEE_BIT_VEC(ackvec_, ix, seqno) ((1 << (seqno - ix)) & ackvec_)
-
 class SessionManager : public Transmitter, public MtuAlloc {
 public:
 	SessionManager();
@@ -131,8 +127,11 @@
 //	virtual void send_report();
 	virtual void send_report(CtrlHandler*, int bye, int app = 0);
 	virtual void send_xreport(CtrlHandler*, int bt, int bye);
+	virtual void send_xreport_back(CtrlHandler*, int bt, int bye);
 	void build_aoa_pkt(CtrlHandler* ch);
 	void build_ts_pkt(CtrlHandler* ch);
+	void build_ackv_pkt(CtrlHandler* ch);
+	void build_ts_echo_pkt(CtrlHandler* ch);
 
 protected:
 //	void demux(rtphdr* rh, u_char* bp, int cc, Address & addr, int layer);
@@ -161,8 +160,8 @@
 	void parse_sdes(rtcphdr* rh, int flags, u_char* ep, Source* ps,
 			Address & addr, u_int32_t ssrc, int layer);
 	void parse_bye(rtcphdr* rh, int flags, u_char* ep, Source* ps);
-	u_char* build_ackv_pkt(rtcp_xr* xr, u_int32_t ssrc);
-	u_char* build_ts_echo_pkt(rtcp_xr* xr, u_int32_t ssrc);
+	//u_char* build_ackv_pkt(rtcp_xr* xr, u_int32_t ssrc);
+	//u_char* build_ts_echo_pkt(rtcp_xr* xr, u_int32_t ssrc);
 
 	int parseopts(const u_char* bp, int cc, Address & addr) const;
 	int ckid(const char*, int len);



More information about the Sumover-dev mailing list