| #include <u.h> |
| #include <libc.h> |
| #include <ip.h> |
| #include "dat.h" |
| #include "protos.h" |
| |
| typedef struct Hdr Hdr; |
| struct Hdr { |
| uchar hdr; /* RTCP header */ |
| uchar pt; /* Packet type */ |
| uchar len[2]; /* Report length */ |
| uchar ssrc[4]; /* Synchronization source identifier */ |
| uchar ntp[8]; /* NTP time stamp */ |
| uchar rtp[4]; /* RTP time stamp */ |
| uchar pktc[4]; /* Sender's packet count */ |
| uchar octc[4]; /* Sender's octect count */ |
| }; |
| |
| typedef struct Report Report; |
| struct Report { |
| uchar ssrc[4]; /* SSRC identifier */ |
| uchar lost[4]; /* Fraction + cumu lost */ |
| uchar seqhi[4]; /* Highest seq number received */ |
| uchar jitter[4]; /* Interarrival jitter */ |
| uchar lsr[4]; /* Last SR */ |
| uchar dlsr[4]; /* Delay since last SR */ |
| }; |
| |
| enum{ |
| RTCPLEN = 28, /* Minimum size of an RTCP header */ |
| REPORTLEN = 24 |
| }; |
| |
| static int |
| p_seprint(Msg *m) |
| { |
| Hdr*h; |
| Report*r; |
| int rc, i, frac; |
| float dlsr; |
| |
| if(m->pe - m->ps < RTCPLEN) |
| return -1; |
| |
| h = (Hdr*)m->ps; |
| if(m->pe - m->ps < (NetS(h->len) + 1) * 4) |
| return -1; |
| |
| rc = h->hdr & 0x1f; |
| m->ps += RTCPLEN; |
| m->p = seprint(m->p, m->e, "version=%d rc=%d tp=%d ssrc=%8ux ntp=%d.%.10ud rtp=%d pktc=%d octc=%d hlen=%d", |
| (h->hdr >> 6) & 3, rc, h->pt, NetL(h->ssrc), |
| NetL(h->ntp), (uint)NetL(&h->ntp[4]), NetL(h->rtp), |
| NetL(h->pktc), NetL(h->octc), |
| (NetS(h->len) + 1) * 4); |
| |
| for(i = 0; i < rc; i++){ |
| r = (Report*)m->ps; |
| m->ps += REPORTLEN; |
| |
| frac = (int)(((float)r->lost[0] * 100.) / 256.); |
| r->lost[0] = 0; |
| dlsr = (float)NetL(r->dlsr) / 65536.; |
| |
| m->p = seprint(m->p, m->e, "\n\trr(csrc=%8ux frac=%3d%% cumu=%10d seqhi=%10ud jitter=%10d lsr=%8ux dlsr=%f)", |
| NetL(r->ssrc), frac, NetL(r->lost), NetL(r->seqhi), |
| NetL(r->jitter), NetL(r->lsr), |
| dlsr); |
| } |
| m->pr = nil; |
| return 0; |
| } |
| |
| Proto rtcp = { |
| "rtcp", |
| nil, |
| nil, |
| p_seprint, |
| nil, |
| nil, |
| nil, |
| defaultframer |
| }; |