1f7254e6cSDavid du Colombier #include <u.h>
2f7254e6cSDavid du Colombier #include <libc.h>
3f7254e6cSDavid du Colombier #include <ip.h>
4f7254e6cSDavid du Colombier #include "dat.h"
5f7254e6cSDavid du Colombier #include "protos.h"
6f7254e6cSDavid du Colombier
7f7254e6cSDavid du Colombier typedef struct Hdr Hdr;
8f7254e6cSDavid du Colombier struct Hdr {
9*e6dcbf51SDavid du Colombier uchar hdr; /* RTP header */
10*e6dcbf51SDavid du Colombier uchar marker; /* Payload and marker */
11*e6dcbf51SDavid du Colombier uchar seq[2]; /* Sequence number */
12*e6dcbf51SDavid du Colombier uchar ts[4]; /* Time stamp */
13*e6dcbf51SDavid du Colombier uchar ssrc[4]; /* Synchronization source identifier */
14f7254e6cSDavid du Colombier };
15f7254e6cSDavid du Colombier
16f7254e6cSDavid du Colombier enum{
17*e6dcbf51SDavid du Colombier RTPLEN = 12, /* Minimum size of an RTP header */
18f7254e6cSDavid du Colombier };
19f7254e6cSDavid du Colombier
20f7254e6cSDavid du Colombier static int
p_seprint(Msg * m)21f7254e6cSDavid du Colombier p_seprint(Msg *m)
22f7254e6cSDavid du Colombier {
23*e6dcbf51SDavid du Colombier int cc, i;
24f7254e6cSDavid du Colombier ushort seq;
25f7254e6cSDavid du Colombier ulong ssrc, ts;
26*e6dcbf51SDavid du Colombier Hdr*h;
27f7254e6cSDavid du Colombier
28f7254e6cSDavid du Colombier if(m->pe - m->ps < RTPLEN)
29f7254e6cSDavid du Colombier return -1;
30f7254e6cSDavid du Colombier
31f7254e6cSDavid du Colombier h = (Hdr*)m->ps;
32f7254e6cSDavid du Colombier cc = h->hdr & 0xf;
33f7254e6cSDavid du Colombier if(m->pe - m->ps < RTPLEN + cc * 4)
34f7254e6cSDavid du Colombier return -1;
35f7254e6cSDavid du Colombier
36f7254e6cSDavid du Colombier m->ps += RTPLEN;
37f7254e6cSDavid du Colombier
38f7254e6cSDavid du Colombier seq = NetS(h->seq);
39f7254e6cSDavid du Colombier ts = NetL(h->ts);
40f7254e6cSDavid du Colombier ssrc = NetL(h->ssrc);
41f7254e6cSDavid du Colombier
42f7254e6cSDavid du Colombier m->p = seprint(m->p, m->e, "version=%d x=%d cc=%d seq=%d ts=%ld ssrc=%ulx",
43f7254e6cSDavid du Colombier (h->hdr >> 6) & 3, (h->hdr >> 4) & 1, cc, seq, ts, ssrc);
44f7254e6cSDavid du Colombier for(i = 0; i < cc; i++){
45*e6dcbf51SDavid du Colombier m->p = seprint(m->p, m->e, " csrc[%d]=%d", i, NetL(m->ps));
46f7254e6cSDavid du Colombier m->ps += 4;
47f7254e6cSDavid du Colombier }
48f7254e6cSDavid du Colombier m->pr = nil;
49f7254e6cSDavid du Colombier return 0;
50f7254e6cSDavid du Colombier }
51f7254e6cSDavid du Colombier
52f7254e6cSDavid du Colombier Proto rtp = {
53f7254e6cSDavid du Colombier "rtp",
542cca75a1SDavid du Colombier nil,
552cca75a1SDavid du Colombier nil,
56f7254e6cSDavid du Colombier p_seprint,
57f7254e6cSDavid du Colombier nil,
58f7254e6cSDavid du Colombier nil,
59ed397113SDavid du Colombier nil,
60f7254e6cSDavid du Colombier defaultframer,
61f7254e6cSDavid du Colombier };
62