Blame


1 87a52e04 2005-12-26 devnull #include <u.h>
2 87a52e04 2005-12-26 devnull #include <libc.h>
3 87a52e04 2005-12-26 devnull #include <ip.h>
4 87a52e04 2005-12-26 devnull #include "dat.h"
5 87a52e04 2005-12-26 devnull #include "protos.h"
6 87a52e04 2005-12-26 devnull
7 87a52e04 2005-12-26 devnull typedef struct Hdr Hdr;
8 87a52e04 2005-12-26 devnull struct Hdr
9 87a52e04 2005-12-26 devnull {
10 87a52e04 2005-12-26 devnull uchar sport[2]; /* Source port */
11 87a52e04 2005-12-26 devnull uchar dport[2]; /* Destination port */
12 87a52e04 2005-12-26 devnull uchar len[2]; /* data length */
13 87a52e04 2005-12-26 devnull uchar cksum[2]; /* Checksum */
14 87a52e04 2005-12-26 devnull };
15 87a52e04 2005-12-26 devnull
16 87a52e04 2005-12-26 devnull enum
17 87a52e04 2005-12-26 devnull {
18 87a52e04 2005-12-26 devnull UDPLEN= 8,
19 87a52e04 2005-12-26 devnull };
20 87a52e04 2005-12-26 devnull
21 87a52e04 2005-12-26 devnull enum
22 87a52e04 2005-12-26 devnull {
23 87a52e04 2005-12-26 devnull Os,
24 87a52e04 2005-12-26 devnull Od,
25 87a52e04 2005-12-26 devnull Osd,
26 87a52e04 2005-12-26 devnull Osetport,
27 87a52e04 2005-12-26 devnull };
28 87a52e04 2005-12-26 devnull
29 87a52e04 2005-12-26 devnull static Field p_fields[] =
30 87a52e04 2005-12-26 devnull {
31 87a52e04 2005-12-26 devnull {"s", Fnum, Os, "source port", } ,
32 87a52e04 2005-12-26 devnull {"d", Fnum, Od, "dest port", } ,
33 87a52e04 2005-12-26 devnull {"a", Fnum, Osd, "source/dest port", } ,
34 87a52e04 2005-12-26 devnull {"sd", Fnum, Osd, "source/dest port", } ,
35 87a52e04 2005-12-26 devnull {0}
36 87a52e04 2005-12-26 devnull };
37 87a52e04 2005-12-26 devnull
38 87a52e04 2005-12-26 devnull #define ANYPORT ~0UL
39 87a52e04 2005-12-26 devnull
40 87a52e04 2005-12-26 devnull static Mux p_mux[] =
41 87a52e04 2005-12-26 devnull {
42 87a52e04 2005-12-26 devnull {"bootp", 67, },
43 87a52e04 2005-12-26 devnull {"ninep", 6346, }, /* tvs */
44 87a52e04 2005-12-26 devnull {"rtp", ANYPORT, },
45 87a52e04 2005-12-26 devnull {"rtcp", ANYPORT, },
46 87a52e04 2005-12-26 devnull {0},
47 87a52e04 2005-12-26 devnull };
48 87a52e04 2005-12-26 devnull
49 87a52e04 2005-12-26 devnull /* default next protocol, can be changed by p_filter, reset by p_compile */
50 87a52e04 2005-12-26 devnull static Proto *defproto = &dump;
51 87a52e04 2005-12-26 devnull
52 87a52e04 2005-12-26 devnull static void
53 87a52e04 2005-12-26 devnull p_compile(Filter *f)
54 87a52e04 2005-12-26 devnull {
55 87a52e04 2005-12-26 devnull Mux *m;
56 87a52e04 2005-12-26 devnull
57 87a52e04 2005-12-26 devnull if(f->op == '='){
58 87a52e04 2005-12-26 devnull compile_cmp(udp.name, f, p_fields);
59 87a52e04 2005-12-26 devnull return;
60 87a52e04 2005-12-26 devnull }
61 87a52e04 2005-12-26 devnull for(m = p_mux; m->name != nil; m++)
62 87a52e04 2005-12-26 devnull if(strcmp(f->s, m->name) == 0){
63 87a52e04 2005-12-26 devnull f->pr = m->pr;
64 87a52e04 2005-12-26 devnull f->ulv = m->val;
65 87a52e04 2005-12-26 devnull f->subop = Osd;
66 87a52e04 2005-12-26 devnull return;
67 87a52e04 2005-12-26 devnull }
68 87a52e04 2005-12-26 devnull
69 87a52e04 2005-12-26 devnull sysfatal("unknown udp field or protocol: %s", f->s);
70 87a52e04 2005-12-26 devnull }
71 87a52e04 2005-12-26 devnull
72 87a52e04 2005-12-26 devnull static int
73 87a52e04 2005-12-26 devnull p_filter(Filter *f, Msg *m)
74 87a52e04 2005-12-26 devnull {
75 87a52e04 2005-12-26 devnull Hdr *h;
76 87a52e04 2005-12-26 devnull
77 87a52e04 2005-12-26 devnull if(m->pe - m->ps < UDPLEN)
78 87a52e04 2005-12-26 devnull return 0;
79 87a52e04 2005-12-26 devnull
80 87a52e04 2005-12-26 devnull h = (Hdr*)m->ps;
81 87a52e04 2005-12-26 devnull m->ps += UDPLEN;
82 87a52e04 2005-12-26 devnull
83 87a52e04 2005-12-26 devnull switch(f->subop){
84 87a52e04 2005-12-26 devnull case Os:
85 87a52e04 2005-12-26 devnull return NetS(h->sport) == f->ulv;
86 87a52e04 2005-12-26 devnull case Od:
87 87a52e04 2005-12-26 devnull return NetS(h->dport) == f->ulv;
88 87a52e04 2005-12-26 devnull case Osd:
89 87a52e04 2005-12-26 devnull if(f->ulv == ANYPORT){
90 87a52e04 2005-12-26 devnull defproto = f->pr;
91 87a52e04 2005-12-26 devnull return 1;
92 87a52e04 2005-12-26 devnull }
93 87a52e04 2005-12-26 devnull return NetS(h->sport) == f->ulv || NetS(h->dport) == f->ulv;
94 87a52e04 2005-12-26 devnull }
95 87a52e04 2005-12-26 devnull return 0;
96 87a52e04 2005-12-26 devnull }
97 87a52e04 2005-12-26 devnull
98 87a52e04 2005-12-26 devnull static int
99 87a52e04 2005-12-26 devnull p_seprint(Msg *m)
100 87a52e04 2005-12-26 devnull {
101 87a52e04 2005-12-26 devnull Hdr *h;
102 87a52e04 2005-12-26 devnull int dport, sport;
103 87a52e04 2005-12-26 devnull
104 87a52e04 2005-12-26 devnull
105 87a52e04 2005-12-26 devnull if(m->pe - m->ps < UDPLEN)
106 87a52e04 2005-12-26 devnull return -1;
107 87a52e04 2005-12-26 devnull h = (Hdr*)m->ps;
108 87a52e04 2005-12-26 devnull m->ps += UDPLEN;
109 87a52e04 2005-12-26 devnull
110 87a52e04 2005-12-26 devnull /* next protocol */
111 87a52e04 2005-12-26 devnull sport = NetS(h->sport);
112 87a52e04 2005-12-26 devnull dport = NetS(h->dport);
113 87a52e04 2005-12-26 devnull demux(p_mux, sport, dport, m, defproto);
114 87a52e04 2005-12-26 devnull defproto = &dump;
115 87a52e04 2005-12-26 devnull
116 87a52e04 2005-12-26 devnull m->p = seprint(m->p, m->e, "s=%d d=%d ck=%4.4ux ln=%4d",
117 87a52e04 2005-12-26 devnull NetS(h->sport), dport,
118 87a52e04 2005-12-26 devnull NetS(h->cksum), NetS(h->len));
119 87a52e04 2005-12-26 devnull return 0;
120 87a52e04 2005-12-26 devnull }
121 87a52e04 2005-12-26 devnull
122 87a52e04 2005-12-26 devnull Proto udp =
123 87a52e04 2005-12-26 devnull {
124 87a52e04 2005-12-26 devnull "udp",
125 87a52e04 2005-12-26 devnull p_compile,
126 87a52e04 2005-12-26 devnull p_filter,
127 87a52e04 2005-12-26 devnull p_seprint,
128 87a52e04 2005-12-26 devnull p_mux,
129 a38a1836 2006-02-14 devnull "%lud",
130 87a52e04 2005-12-26 devnull p_fields,
131 87a52e04 2005-12-26 devnull defaultframer,
132 87a52e04 2005-12-26 devnull };