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 vcf[4]; /* Version and header length */
11 87a52e04 2005-12-26 devnull uchar length[2]; /* packet length */
12 87a52e04 2005-12-26 devnull uchar proto; /* Protocol */
13 87a52e04 2005-12-26 devnull uchar ttl; /* Time to live */
14 87a52e04 2005-12-26 devnull uchar src[IPaddrlen]; /* IP source */
15 87a52e04 2005-12-26 devnull uchar dst[IPaddrlen]; /* IP destination */
16 87a52e04 2005-12-26 devnull };
17 87a52e04 2005-12-26 devnull
18 87a52e04 2005-12-26 devnull enum
19 87a52e04 2005-12-26 devnull {
20 87a52e04 2005-12-26 devnull IP6HDR = 40, /* sizeof(Iphdr) */
21 87a52e04 2005-12-26 devnull IP_VER = 0x60, /* Using IP version 4 */
22 87a52e04 2005-12-26 devnull HBH_HDR = 0,
23 87a52e04 2005-12-26 devnull ROUT_HDR = 43,
24 87a52e04 2005-12-26 devnull FRAG_HDR = 44,
25 87a52e04 2005-12-26 devnull FRAG_HSZ = 8, /* in bytes */
26 87a52e04 2005-12-26 devnull DEST_HDR = 60,
27 87a52e04 2005-12-26 devnull };
28 87a52e04 2005-12-26 devnull
29 87a52e04 2005-12-26 devnull static Mux p_mux[] =
30 87a52e04 2005-12-26 devnull {
31 87a52e04 2005-12-26 devnull { "igmp", 2, },
32 87a52e04 2005-12-26 devnull { "ggp", 3, },
33 87a52e04 2005-12-26 devnull { "ip", 4, },
34 87a52e04 2005-12-26 devnull { "st", 5, },
35 87a52e04 2005-12-26 devnull { "tcp", 6, },
36 87a52e04 2005-12-26 devnull { "ucl", 7, },
37 87a52e04 2005-12-26 devnull { "egp", 8, },
38 87a52e04 2005-12-26 devnull { "igp", 9, },
39 87a52e04 2005-12-26 devnull { "bbn-rcc-mon", 10, },
40 87a52e04 2005-12-26 devnull { "nvp-ii", 11, },
41 87a52e04 2005-12-26 devnull { "pup", 12, },
42 87a52e04 2005-12-26 devnull { "argus", 13, },
43 87a52e04 2005-12-26 devnull { "emcon", 14, },
44 87a52e04 2005-12-26 devnull { "xnet", 15, },
45 87a52e04 2005-12-26 devnull { "chaos", 16, },
46 87a52e04 2005-12-26 devnull { "udp", 17, },
47 87a52e04 2005-12-26 devnull { "mux", 18, },
48 87a52e04 2005-12-26 devnull { "dcn-meas", 19, },
49 87a52e04 2005-12-26 devnull { "hmp", 20, },
50 87a52e04 2005-12-26 devnull { "prm", 21, },
51 87a52e04 2005-12-26 devnull { "xns-idp", 22, },
52 87a52e04 2005-12-26 devnull { "trunk-1", 23, },
53 87a52e04 2005-12-26 devnull { "trunk-2", 24, },
54 87a52e04 2005-12-26 devnull { "leaf-1", 25, },
55 87a52e04 2005-12-26 devnull { "leaf-2", 26, },
56 87a52e04 2005-12-26 devnull { "rdp", 27, },
57 87a52e04 2005-12-26 devnull { "irtp", 28, },
58 87a52e04 2005-12-26 devnull { "iso-tp4", 29, },
59 87a52e04 2005-12-26 devnull { "netblt", 30, },
60 87a52e04 2005-12-26 devnull { "mfe-nsp", 31, },
61 87a52e04 2005-12-26 devnull { "merit-inp", 32, },
62 87a52e04 2005-12-26 devnull { "sep", 33, },
63 87a52e04 2005-12-26 devnull { "3pc", 34, },
64 87a52e04 2005-12-26 devnull { "idpr", 35, },
65 87a52e04 2005-12-26 devnull { "xtp", 36, },
66 87a52e04 2005-12-26 devnull { "ddp", 37, },
67 87a52e04 2005-12-26 devnull { "idpr-cmtp", 38, },
68 87a52e04 2005-12-26 devnull { "tp++", 39, },
69 87a52e04 2005-12-26 devnull { "il", 40, },
70 87a52e04 2005-12-26 devnull { "sip", 41, },
71 87a52e04 2005-12-26 devnull { "sdrp", 42, },
72 87a52e04 2005-12-26 devnull { "idrp", 45, },
73 87a52e04 2005-12-26 devnull { "rsvp", 46, },
74 87a52e04 2005-12-26 devnull { "gre", 47, },
75 87a52e04 2005-12-26 devnull { "mhrp", 48, },
76 87a52e04 2005-12-26 devnull { "bna", 49, },
77 87a52e04 2005-12-26 devnull { "sipp-esp", 50, },
78 87a52e04 2005-12-26 devnull { "sipp-ah", 51, },
79 87a52e04 2005-12-26 devnull { "i-nlsp", 52, },
80 87a52e04 2005-12-26 devnull { "swipe", 53, },
81 87a52e04 2005-12-26 devnull { "nhrp", 54, },
82 87a52e04 2005-12-26 devnull { "icmp6", 58, },
83 87a52e04 2005-12-26 devnull { "any", 61, },
84 87a52e04 2005-12-26 devnull { "cftp", 62, },
85 87a52e04 2005-12-26 devnull { "any", 63, },
86 87a52e04 2005-12-26 devnull { "sat-expak", 64, },
87 87a52e04 2005-12-26 devnull { "kryptolan", 65, },
88 87a52e04 2005-12-26 devnull { "rvd", 66, },
89 87a52e04 2005-12-26 devnull { "ippc", 67, },
90 87a52e04 2005-12-26 devnull { "any", 68, },
91 87a52e04 2005-12-26 devnull { "sat-mon", 69, },
92 87a52e04 2005-12-26 devnull { "visa", 70, },
93 87a52e04 2005-12-26 devnull { "ipcv", 71, },
94 87a52e04 2005-12-26 devnull { "cpnx", 72, },
95 87a52e04 2005-12-26 devnull { "cphb", 73, },
96 87a52e04 2005-12-26 devnull { "wsn", 74, },
97 87a52e04 2005-12-26 devnull { "pvp", 75, },
98 87a52e04 2005-12-26 devnull { "br-sat-mon", 76, },
99 87a52e04 2005-12-26 devnull { "sun-nd", 77, },
100 87a52e04 2005-12-26 devnull { "wb-mon", 78, },
101 87a52e04 2005-12-26 devnull { "wb-expak", 79, },
102 87a52e04 2005-12-26 devnull { "iso-ip", 80, },
103 87a52e04 2005-12-26 devnull { "vmtp", 81, },
104 87a52e04 2005-12-26 devnull { "secure-vmtp", 82, },
105 87a52e04 2005-12-26 devnull { "vines", 83, },
106 87a52e04 2005-12-26 devnull { "ttp", 84, },
107 87a52e04 2005-12-26 devnull { "nsfnet-igp", 85, },
108 87a52e04 2005-12-26 devnull { "dgp", 86, },
109 87a52e04 2005-12-26 devnull { "tcf", 87, },
110 87a52e04 2005-12-26 devnull { "igrp", 88, },
111 87a52e04 2005-12-26 devnull { "ospf", 89, },
112 87a52e04 2005-12-26 devnull { "sprite-rpc", 90, },
113 87a52e04 2005-12-26 devnull { "larp", 91, },
114 87a52e04 2005-12-26 devnull { "mtp", 92, },
115 87a52e04 2005-12-26 devnull { "ax.25", 93, },
116 87a52e04 2005-12-26 devnull { "ipip", 94, },
117 87a52e04 2005-12-26 devnull { "micp", 95, },
118 87a52e04 2005-12-26 devnull { "scc-sp", 96, },
119 87a52e04 2005-12-26 devnull { "etherip", 97, },
120 87a52e04 2005-12-26 devnull { "encap", 98, },
121 87a52e04 2005-12-26 devnull { "any", 99, },
122 87a52e04 2005-12-26 devnull { "gmtp", 100, },
123 87a52e04 2005-12-26 devnull { "rudp", 254, },
124 87a52e04 2005-12-26 devnull { 0 }
125 87a52e04 2005-12-26 devnull };
126 87a52e04 2005-12-26 devnull
127 87a52e04 2005-12-26 devnull enum
128 87a52e04 2005-12-26 devnull {
129 87a52e04 2005-12-26 devnull Os, // source
130 87a52e04 2005-12-26 devnull Od, // destination
131 87a52e04 2005-12-26 devnull Osd, // source or destination
132 87a52e04 2005-12-26 devnull Ot, // type
133 87a52e04 2005-12-26 devnull };
134 87a52e04 2005-12-26 devnull
135 87a52e04 2005-12-26 devnull static Field p_fields[] =
136 87a52e04 2005-12-26 devnull {
137 87a52e04 2005-12-26 devnull {"s", Fv6ip, Os, "source address", } ,
138 87a52e04 2005-12-26 devnull {"d", Fv6ip, Od, "destination address", } ,
139 87a52e04 2005-12-26 devnull {"a", Fv6ip, Osd, "source|destination address",} ,
140 87a52e04 2005-12-26 devnull {"t", Fnum, Ot, "sub protocol number", } ,
141 87a52e04 2005-12-26 devnull {0}
142 87a52e04 2005-12-26 devnull };
143 87a52e04 2005-12-26 devnull
144 87a52e04 2005-12-26 devnull static void
145 87a52e04 2005-12-26 devnull p_compile(Filter *f)
146 87a52e04 2005-12-26 devnull {
147 87a52e04 2005-12-26 devnull Mux *m;
148 87a52e04 2005-12-26 devnull
149 87a52e04 2005-12-26 devnull if(f->op == '='){
150 87a52e04 2005-12-26 devnull compile_cmp(ip6.name, f, p_fields);
151 87a52e04 2005-12-26 devnull return;
152 87a52e04 2005-12-26 devnull }
153 87a52e04 2005-12-26 devnull for(m = p_mux; m->name != nil; m++)
154 87a52e04 2005-12-26 devnull if(strcmp(f->s, m->name) == 0){
155 87a52e04 2005-12-26 devnull f->pr = m->pr;
156 87a52e04 2005-12-26 devnull f->ulv = m->val;
157 87a52e04 2005-12-26 devnull f->subop = Ot;
158 87a52e04 2005-12-26 devnull return;
159 87a52e04 2005-12-26 devnull }
160 87a52e04 2005-12-26 devnull sysfatal("unknown ip6 field or protocol: %s", f->s);
161 87a52e04 2005-12-26 devnull }
162 87a52e04 2005-12-26 devnull
163 87a52e04 2005-12-26 devnull static int
164 87a52e04 2005-12-26 devnull v6hdrlen(Hdr *h)
165 87a52e04 2005-12-26 devnull {
166 87a52e04 2005-12-26 devnull int plen, len = IP6HDR;
167 87a52e04 2005-12-26 devnull int pktlen = IP6HDR + NetS(h->length);
168 87a52e04 2005-12-26 devnull uchar nexthdr = h->proto;
169 87a52e04 2005-12-26 devnull uchar *pkt = (uchar*) h;
170 87a52e04 2005-12-26 devnull
171 87a52e04 2005-12-26 devnull pkt += len;
172 87a52e04 2005-12-26 devnull plen = len;
173 87a52e04 2005-12-26 devnull
174 87a52e04 2005-12-26 devnull while ( (nexthdr == HBH_HDR) || (nexthdr == ROUT_HDR) ||
175 87a52e04 2005-12-26 devnull (nexthdr == FRAG_HDR) || (nexthdr == DEST_HDR) ) {
176 87a52e04 2005-12-26 devnull
177 87a52e04 2005-12-26 devnull if (nexthdr == FRAG_HDR)
178 87a52e04 2005-12-26 devnull len = FRAG_HSZ;
179 87a52e04 2005-12-26 devnull else
180 87a52e04 2005-12-26 devnull len = ( ((int) *(pkt+1)) + 1) * 8;
181 87a52e04 2005-12-26 devnull
182 87a52e04 2005-12-26 devnull if (plen + len > pktlen)
183 87a52e04 2005-12-26 devnull return -1;
184 87a52e04 2005-12-26 devnull
185 87a52e04 2005-12-26 devnull pkt += len;
186 87a52e04 2005-12-26 devnull nexthdr = *pkt;
187 87a52e04 2005-12-26 devnull plen += len;
188 87a52e04 2005-12-26 devnull }
189 87a52e04 2005-12-26 devnull return plen;
190 87a52e04 2005-12-26 devnull }
191 87a52e04 2005-12-26 devnull
192 87a52e04 2005-12-26 devnull static int
193 87a52e04 2005-12-26 devnull p_filter(Filter *f, Msg *m)
194 87a52e04 2005-12-26 devnull {
195 87a52e04 2005-12-26 devnull Hdr *h;
196 87a52e04 2005-12-26 devnull int hlen;
197 87a52e04 2005-12-26 devnull
198 87a52e04 2005-12-26 devnull if(m->pe - m->ps < IP6HDR)
199 87a52e04 2005-12-26 devnull return 0;
200 87a52e04 2005-12-26 devnull
201 87a52e04 2005-12-26 devnull h = (Hdr*)m->ps;
202 87a52e04 2005-12-26 devnull
203 87a52e04 2005-12-26 devnull if ((hlen = v6hdrlen(h)) < 0)
204 87a52e04 2005-12-26 devnull return 0;
205 87a52e04 2005-12-26 devnull else
206 87a52e04 2005-12-26 devnull m->ps += hlen;
207 87a52e04 2005-12-26 devnull switch(f->subop){
208 87a52e04 2005-12-26 devnull case Os:
209 87a52e04 2005-12-26 devnull return !memcmp(h->src, f->a, IPaddrlen);
210 87a52e04 2005-12-26 devnull case Od:
211 87a52e04 2005-12-26 devnull return !memcmp(h->dst, f->a, IPaddrlen);
212 87a52e04 2005-12-26 devnull case Osd:
213 87a52e04 2005-12-26 devnull return !memcmp(h->src, f->a, IPaddrlen) || !memcmp(h->dst, f->a, IPaddrlen);
214 87a52e04 2005-12-26 devnull case Ot:
215 87a52e04 2005-12-26 devnull return h->proto == f->ulv;
216 87a52e04 2005-12-26 devnull }
217 87a52e04 2005-12-26 devnull return 0;
218 87a52e04 2005-12-26 devnull }
219 87a52e04 2005-12-26 devnull
220 87a52e04 2005-12-26 devnull static int
221 87a52e04 2005-12-26 devnull v6hdr_seprint(Msg *m)
222 87a52e04 2005-12-26 devnull {
223 87a52e04 2005-12-26 devnull int len = IP6HDR;
224 87a52e04 2005-12-26 devnull uchar *pkt = m->ps;
225 87a52e04 2005-12-26 devnull Hdr *h = (Hdr *) pkt;
226 87a52e04 2005-12-26 devnull int pktlen = IP6HDR + NetS(h->length);
227 87a52e04 2005-12-26 devnull uchar nexthdr = h->proto;
228 87a52e04 2005-12-26 devnull int plen;
229 87a52e04 2005-12-26 devnull
230 87a52e04 2005-12-26 devnull pkt += len;
231 87a52e04 2005-12-26 devnull plen = len;
232 87a52e04 2005-12-26 devnull
233 87a52e04 2005-12-26 devnull while ( (nexthdr == HBH_HDR) || (nexthdr == ROUT_HDR) ||
234 87a52e04 2005-12-26 devnull (nexthdr == FRAG_HDR) || (nexthdr == DEST_HDR) ) {
235 87a52e04 2005-12-26 devnull
236 87a52e04 2005-12-26 devnull switch (nexthdr) {
237 87a52e04 2005-12-26 devnull case FRAG_HDR:
238 87a52e04 2005-12-26 devnull m->p = seprint(m->p, m->e, "\n xthdr=frag id=%d offset=%d pr=%d more=%d res1=%d res2=%d",
239 87a52e04 2005-12-26 devnull NetL(pkt+4),
240 87a52e04 2005-12-26 devnull NetS(pkt+2) & ~7,
241 87a52e04 2005-12-26 devnull (int) (*pkt),
242 87a52e04 2005-12-26 devnull (int) (*(pkt+3) & 0x1),
243 87a52e04 2005-12-26 devnull (int) *(pkt+1),
244 87a52e04 2005-12-26 devnull (int) (*(pkt+3) & 0x6)
245 87a52e04 2005-12-26 devnull );
246 87a52e04 2005-12-26 devnull len = FRAG_HSZ;
247 87a52e04 2005-12-26 devnull break;
248 87a52e04 2005-12-26 devnull
249 87a52e04 2005-12-26 devnull case HBH_HDR:
250 87a52e04 2005-12-26 devnull case ROUT_HDR:
251 87a52e04 2005-12-26 devnull case DEST_HDR:
252 87a52e04 2005-12-26 devnull len = ( ((int) *(pkt+1)) + 1) * 8;
253 87a52e04 2005-12-26 devnull break;
254 87a52e04 2005-12-26 devnull }
255 87a52e04 2005-12-26 devnull
256 87a52e04 2005-12-26 devnull if (plen + len > pktlen) {
257 87a52e04 2005-12-26 devnull m->p = seprint(m->p, m->e, "bad pkt");
258 87a52e04 2005-12-26 devnull m->pr = &dump;
259 87a52e04 2005-12-26 devnull return -1;
260 87a52e04 2005-12-26 devnull }
261 87a52e04 2005-12-26 devnull plen += len;
262 87a52e04 2005-12-26 devnull pkt += len;
263 87a52e04 2005-12-26 devnull nexthdr = *pkt;
264 87a52e04 2005-12-26 devnull }
265 87a52e04 2005-12-26 devnull
266 87a52e04 2005-12-26 devnull m->ps = pkt;
267 87a52e04 2005-12-26 devnull return 1;
268 87a52e04 2005-12-26 devnull
269 87a52e04 2005-12-26 devnull }
270 87a52e04 2005-12-26 devnull
271 87a52e04 2005-12-26 devnull static int
272 87a52e04 2005-12-26 devnull p_seprint(Msg *m)
273 87a52e04 2005-12-26 devnull {
274 87a52e04 2005-12-26 devnull Hdr *h;
275 87a52e04 2005-12-26 devnull int len;
276 87a52e04 2005-12-26 devnull
277 87a52e04 2005-12-26 devnull if(m->pe - m->ps < IP6HDR)
278 87a52e04 2005-12-26 devnull return -1;
279 87a52e04 2005-12-26 devnull h = (Hdr*)m->ps;
280 87a52e04 2005-12-26 devnull
281 87a52e04 2005-12-26 devnull demux(p_mux, h->proto, h->proto, m, &dump);
282 87a52e04 2005-12-26 devnull
283 87a52e04 2005-12-26 devnull /* truncate the message if there's extra */
284 87a52e04 2005-12-26 devnull len = NetS(h->length) + IP6HDR;
285 87a52e04 2005-12-26 devnull if(len < m->pe - m->ps)
286 87a52e04 2005-12-26 devnull m->pe = m->ps + len;
287 87a52e04 2005-12-26 devnull
288 87a52e04 2005-12-26 devnull m->p = seprint(m->p, m->e, "s=%I d=%I ttl=%3d pr=%d ln=%d",
289 87a52e04 2005-12-26 devnull h->src, h->dst,
290 87a52e04 2005-12-26 devnull h->ttl,
291 87a52e04 2005-12-26 devnull h->proto,
292 87a52e04 2005-12-26 devnull NetS(h->length)
293 87a52e04 2005-12-26 devnull );
294 87a52e04 2005-12-26 devnull
295 87a52e04 2005-12-26 devnull v6hdr_seprint(m);
296 87a52e04 2005-12-26 devnull
297 87a52e04 2005-12-26 devnull return 0;
298 87a52e04 2005-12-26 devnull }
299 87a52e04 2005-12-26 devnull
300 87a52e04 2005-12-26 devnull Proto ip6 =
301 87a52e04 2005-12-26 devnull {
302 87a52e04 2005-12-26 devnull "ip6",
303 87a52e04 2005-12-26 devnull p_compile,
304 87a52e04 2005-12-26 devnull p_filter,
305 87a52e04 2005-12-26 devnull p_seprint,
306 87a52e04 2005-12-26 devnull p_mux,
307 a38a1836 2006-02-14 devnull "%lud",
308 87a52e04 2005-12-26 devnull p_fields,
309 87a52e04 2005-12-26 devnull defaultframer,
310 87a52e04 2005-12-26 devnull };