static void process_rr(session_t *sp, rtp_event *rtp_e) { pdb_entry_t *e; uint32_t fract_lost, my_ssrc; uint32_t ssrc = rtp_e->ssrc; rtcp_rr *r = (rtcp_rr *) rtp_e->data; /* Calculate rtt estimate */ my_ssrc = rtp_my_ssrc(sp->rtp_session[0]); if (pdb_item_get(sp->pdb, r->ssrc, &e) == FALSE) { /* Maybe deleted or not heard from yet */ debug_msg("Receiver report on unknown participant (0x%lx)\n", r->ssrc); return; } if (pdb_item_get(sp->pdb, ssrc, &e) && r->ssrc == my_ssrc && r->ssrc != ssrc && /* filter self reports */ r->lsr != 0) { uint32_t ntp_sec, ntp_frac, ntp32; double rtt; ntp64_time(&ntp_sec, &ntp_frac); ntp32 = ntp64_to_ntp32(ntp_sec, ntp_frac); rtt = rtp_rtt_calc(ntp32, r->lsr, r->dlsr); /* * Filter out blatantly wrong rtt values. Some tools might not * implement dlsr and lsr (broken) or forget to do byte-swapping */ if (rtt < 100.0) { e->last_rtt = rtt; debug_msg("rtt %f\n", rtt); } else { debug_msg("Junk rtt (%f secs) ntp32 0x%08x lsr 0x%08x dlsr 0x%08x ?\n", rtt, ntp32, r->lsr, r->dlsr); } if (e->avg_rtt == 0.0) { e->avg_rtt = e->last_rtt; } else { e->avg_rtt += (e->last_rtt - e->avg_rtt) / 2.0; } if (sp->mbus_engine != NULL) { ui_send_rtp_rtt(sp, sp->mbus_ui_addr, ssrc, e->avg_rtt); } } fract_lost = (r->fract_lost * 100) >> 8; /* Update loss stats */ if (sp->mbus_engine != NULL) { ui_send_rtp_packet_loss(sp, sp->mbus_ui_addr, ssrc, r->ssrc, fract_lost); } /* Do we have to log anything? */ if ((r->ssrc == my_ssrc) && (sp->logger != NULL)) { rtpdump_header(sp->logger, "rtt ", rtp_e); fprintf(sp->logger, "%f\n", e->avg_rtt); } }
static void process_rr(struct rtp *session, rtp_event * e) { float fract_lost, tmp; uint32_t ntp_sec, ntp_frac, now; rtcp_rr *r = (rtcp_rr *) e->data; if (e->ssrc == rtp_my_ssrc(session)) { /* Filter out loopback reports */ return; } if (r->ssrc == rtp_my_ssrc(session)) { /* Received a reception quality report for data we are sending. */ /* */ /* Check for excessive congestion: exit if it occurs, to protect */ /* other users of the network. */ fract_lost = (r->fract_lost * 100.0) / 256.0; /* percentage lost packets */ if (fract_lost > 20) { printf("Receiver 0x%08x reports excessive congestion\n", e->ssrc); } /* Compute network round-trip time: */ if (r->lsr != 0) { ntp64_time(&ntp_sec, &ntp_frac); now = ntp64_to_ntp32(ntp_sec, ntp_frac); if ((now < r->lsr) || (now - r->lsr < r->dlsr)) { /* Packet arrived before it was sent, ignore. This represents */ /* a bug in the remote: either our timestamp was incorrectly */ /* echoed back to us, or the remote miscalculated in time for */ /* which it held the packet. */ debug_msg("Bogus RTT from 0x%08x ignored\n", e->ssrc); } else { tmp = ((float)(now - r->lsr - r->dlsr)) / 65536.0; /* RTT in seconds */ RTT = tmp * 1000000; /* RTT in usec */ } debug_msg(" RTT=%d usec\n", RTT); } } }