]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/ip/snoopy/rtp.c
snoopy: dont rely on atoi() being able to parse hex
[plan9front.git] / sys / src / cmd / ip / snoopy / rtp.c
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
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 };