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