[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