xref: /plan9/sys/src/cmd/ip/snoopy/rtp.c (revision e6dcbf51e935975016093545b6eab69976b6e257)
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