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 vihl; /* Version and header length */
11 87a52e04 2005-12-26 devnull uchar tos; /* Type of service */
12 87a52e04 2005-12-26 devnull uchar length[2]; /* packet length */
13 87a52e04 2005-12-26 devnull uchar id[2]; /* ip->identification */
14 87a52e04 2005-12-26 devnull uchar frag[2]; /* Fragment information */
15 87a52e04 2005-12-26 devnull uchar ttl; /* Time to live */
16 87a52e04 2005-12-26 devnull uchar proto; /* Protocol */
17 87a52e04 2005-12-26 devnull uchar cksum[2]; /* Header checksum */
18 87a52e04 2005-12-26 devnull uchar src[4]; /* IP source */
19 87a52e04 2005-12-26 devnull uchar dst[4]; /* IP destination */
20 87a52e04 2005-12-26 devnull };
21 87a52e04 2005-12-26 devnull
22 87a52e04 2005-12-26 devnull enum
23 87a52e04 2005-12-26 devnull {
24 87a52e04 2005-12-26 devnull IPHDR = 20, /* sizeof(Iphdr) */
25 87a52e04 2005-12-26 devnull IP_VER = 0x40, /* Using IP version 4 */
26 87a52e04 2005-12-26 devnull IP_DF = 0x4000, /* Don't fragment */
27 87a52e04 2005-12-26 devnull IP_MF = 0x2000, /* More fragments */
28 87a52e04 2005-12-26 devnull };
29 87a52e04 2005-12-26 devnull
30 87a52e04 2005-12-26 devnull static Mux p_mux[] =
31 87a52e04 2005-12-26 devnull {
32 87a52e04 2005-12-26 devnull { "icmp", 1, },
33 87a52e04 2005-12-26 devnull { "igmp", 2, },
34 87a52e04 2005-12-26 devnull { "ggp", 3, },
35 87a52e04 2005-12-26 devnull { "ip", 4, },
36 87a52e04 2005-12-26 devnull { "st", 5, },
37 87a52e04 2005-12-26 devnull { "tcp", 6, },
38 87a52e04 2005-12-26 devnull { "ucl", 7, },
39 87a52e04 2005-12-26 devnull { "egp", 8, },
40 87a52e04 2005-12-26 devnull { "igp", 9, },
41 87a52e04 2005-12-26 devnull { "bbn-rcc-mon", 10, },
42 87a52e04 2005-12-26 devnull { "nvp-ii", 11, },
43 87a52e04 2005-12-26 devnull { "pup", 12, },
44 87a52e04 2005-12-26 devnull { "argus", 13, },
45 87a52e04 2005-12-26 devnull { "emcon", 14, },
46 87a52e04 2005-12-26 devnull { "xnet", 15, },
47 87a52e04 2005-12-26 devnull { "chaos", 16, },
48 87a52e04 2005-12-26 devnull { "udp", 17, },
49 87a52e04 2005-12-26 devnull { "mux", 18, },
50 87a52e04 2005-12-26 devnull { "dcn-meas", 19, },
51 87a52e04 2005-12-26 devnull { "hmp", 20, },
52 87a52e04 2005-12-26 devnull { "prm", 21, },
53 87a52e04 2005-12-26 devnull { "xns-idp", 22, },
54 87a52e04 2005-12-26 devnull { "trunk-1", 23, },
55 87a52e04 2005-12-26 devnull { "trunk-2", 24, },
56 87a52e04 2005-12-26 devnull { "leaf-1", 25, },
57 87a52e04 2005-12-26 devnull { "leaf-2", 26, },
58 87a52e04 2005-12-26 devnull { "rdp", 27, },
59 87a52e04 2005-12-26 devnull { "irtp", 28, },
60 87a52e04 2005-12-26 devnull { "iso-tp4", 29, },
61 87a52e04 2005-12-26 devnull { "netblt", 30, },
62 87a52e04 2005-12-26 devnull { "mfe-nsp", 31, },
63 87a52e04 2005-12-26 devnull { "merit-inp", 32, },
64 87a52e04 2005-12-26 devnull { "sep", 33, },
65 87a52e04 2005-12-26 devnull { "3pc", 34, },
66 87a52e04 2005-12-26 devnull { "idpr", 35, },
67 87a52e04 2005-12-26 devnull { "xtp", 36, },
68 87a52e04 2005-12-26 devnull { "ddp", 37, },
69 87a52e04 2005-12-26 devnull { "idpr-cmtp", 38, },
70 87a52e04 2005-12-26 devnull { "tp++", 39, },
71 87a52e04 2005-12-26 devnull { "il", 40, },
72 87a52e04 2005-12-26 devnull { "sip", 41, },
73 87a52e04 2005-12-26 devnull { "sdrp", 42, },
74 87a52e04 2005-12-26 devnull { "sip-sr", 43, },
75 87a52e04 2005-12-26 devnull { "sip-frag", 44, },
76 87a52e04 2005-12-26 devnull { "idrp", 45, },
77 87a52e04 2005-12-26 devnull { "rsvp", 46, },
78 87a52e04 2005-12-26 devnull { "gre", 47, },
79 87a52e04 2005-12-26 devnull { "mhrp", 48, },
80 87a52e04 2005-12-26 devnull { "bna", 49, },
81 87a52e04 2005-12-26 devnull { "sipp-esp", 50, },
82 87a52e04 2005-12-26 devnull { "sipp-ah", 51, },
83 87a52e04 2005-12-26 devnull { "i-nlsp", 52, },
84 87a52e04 2005-12-26 devnull { "swipe", 53, },
85 87a52e04 2005-12-26 devnull { "nhrp", 54, },
86 87a52e04 2005-12-26 devnull { "any", 61, },
87 87a52e04 2005-12-26 devnull { "cftp", 62, },
88 87a52e04 2005-12-26 devnull { "any", 63, },
89 87a52e04 2005-12-26 devnull { "sat-expak", 64, },
90 87a52e04 2005-12-26 devnull { "kryptolan", 65, },
91 87a52e04 2005-12-26 devnull { "rvd", 66, },
92 87a52e04 2005-12-26 devnull { "ippc", 67, },
93 87a52e04 2005-12-26 devnull { "any", 68, },
94 87a52e04 2005-12-26 devnull { "sat-mon", 69, },
95 87a52e04 2005-12-26 devnull { "visa", 70, },
96 87a52e04 2005-12-26 devnull { "ipcv", 71, },
97 87a52e04 2005-12-26 devnull { "cpnx", 72, },
98 87a52e04 2005-12-26 devnull { "cphb", 73, },
99 87a52e04 2005-12-26 devnull { "wsn", 74, },
100 87a52e04 2005-12-26 devnull { "pvp", 75, },
101 87a52e04 2005-12-26 devnull { "br-sat-mon", 76, },
102 87a52e04 2005-12-26 devnull { "sun-nd", 77, },
103 87a52e04 2005-12-26 devnull { "wb-mon", 78, },
104 87a52e04 2005-12-26 devnull { "wb-expak", 79, },
105 87a52e04 2005-12-26 devnull { "iso-ip", 80, },
106 87a52e04 2005-12-26 devnull { "vmtp", 81, },
107 87a52e04 2005-12-26 devnull { "secure-vmtp", 82, },
108 87a52e04 2005-12-26 devnull { "vines", 83, },
109 87a52e04 2005-12-26 devnull { "ttp", 84, },
110 87a52e04 2005-12-26 devnull { "nsfnet-igp", 85, },
111 87a52e04 2005-12-26 devnull { "dgp", 86, },
112 87a52e04 2005-12-26 devnull { "tcf", 87, },
113 87a52e04 2005-12-26 devnull { "igrp", 88, },
114 87a52e04 2005-12-26 devnull { "ospf", 89, },
115 87a52e04 2005-12-26 devnull { "sprite-rpc", 90, },
116 87a52e04 2005-12-26 devnull { "larp", 91, },
117 87a52e04 2005-12-26 devnull { "mtp", 92, },
118 87a52e04 2005-12-26 devnull { "ax.25", 93, },
119 87a52e04 2005-12-26 devnull { "ipip", 94, },
120 87a52e04 2005-12-26 devnull { "micp", 95, },
121 87a52e04 2005-12-26 devnull { "scc-sp", 96, },
122 87a52e04 2005-12-26 devnull { "etherip", 97, },
123 87a52e04 2005-12-26 devnull { "encap", 98, },
124 87a52e04 2005-12-26 devnull { "any", 99, },
125 87a52e04 2005-12-26 devnull { "gmtp", 100, },
126 87a52e04 2005-12-26 devnull { "rudp", 254, },
127 87a52e04 2005-12-26 devnull { 0 }
128 87a52e04 2005-12-26 devnull };
129 87a52e04 2005-12-26 devnull
130 87a52e04 2005-12-26 devnull enum
131 87a52e04 2005-12-26 devnull {
132 cbeb0b26 2006-04-01 devnull Os, /* source */
133 cbeb0b26 2006-04-01 devnull Od, /* destination */
134 cbeb0b26 2006-04-01 devnull Osd, /* source or destination */
135 cbeb0b26 2006-04-01 devnull Ot, /* type */
136 87a52e04 2005-12-26 devnull };
137 87a52e04 2005-12-26 devnull
138 fa325e9b 2020-01-10 cross static Field p_fields[] =
139 87a52e04 2005-12-26 devnull {
140 87a52e04 2005-12-26 devnull {"s", Fv4ip, Os, "source address", } ,
141 87a52e04 2005-12-26 devnull {"d", Fv4ip, Od, "destination address", } ,
142 87a52e04 2005-12-26 devnull {"a", Fv4ip, Osd, "source|destination address",} ,
143 87a52e04 2005-12-26 devnull {"sd", Fv4ip, Osd, "source|destination address",} ,
144 87a52e04 2005-12-26 devnull {"t", Fnum, Ot, "sub protocol number", } ,
145 87a52e04 2005-12-26 devnull {0}
146 87a52e04 2005-12-26 devnull };
147 87a52e04 2005-12-26 devnull
148 87a52e04 2005-12-26 devnull static void
149 87a52e04 2005-12-26 devnull p_compile(Filter *f)
150 87a52e04 2005-12-26 devnull {
151 87a52e04 2005-12-26 devnull Mux *m;
152 87a52e04 2005-12-26 devnull
153 87a52e04 2005-12-26 devnull if(f->op == '='){
154 87a52e04 2005-12-26 devnull compile_cmp(ip.name, f, p_fields);
155 87a52e04 2005-12-26 devnull return;
156 87a52e04 2005-12-26 devnull }
157 87a52e04 2005-12-26 devnull for(m = p_mux; m->name != nil; m++)
158 87a52e04 2005-12-26 devnull if(strcmp(f->s, m->name) == 0){
159 87a52e04 2005-12-26 devnull f->pr = m->pr;
160 87a52e04 2005-12-26 devnull f->ulv = m->val;
161 87a52e04 2005-12-26 devnull f->subop = Ot;
162 87a52e04 2005-12-26 devnull return;
163 87a52e04 2005-12-26 devnull }
164 87a52e04 2005-12-26 devnull sysfatal("unknown ip field or protocol: %s", f->s);
165 87a52e04 2005-12-26 devnull }
166 87a52e04 2005-12-26 devnull
167 87a52e04 2005-12-26 devnull static int
168 87a52e04 2005-12-26 devnull p_filter(Filter *f, Msg *m)
169 87a52e04 2005-12-26 devnull {
170 87a52e04 2005-12-26 devnull Hdr *h;
171 87a52e04 2005-12-26 devnull
172 87a52e04 2005-12-26 devnull if(m->pe - m->ps < IPHDR)
173 87a52e04 2005-12-26 devnull return 0;
174 87a52e04 2005-12-26 devnull
175 87a52e04 2005-12-26 devnull h = (Hdr*)m->ps;
176 87a52e04 2005-12-26 devnull m->ps += ((h->vihl&0xf)<<2);
177 87a52e04 2005-12-26 devnull
178 87a52e04 2005-12-26 devnull switch(f->subop){
179 87a52e04 2005-12-26 devnull case Os:
180 87a52e04 2005-12-26 devnull return NetL(h->src) == f->ulv;
181 87a52e04 2005-12-26 devnull case Od:
182 87a52e04 2005-12-26 devnull return NetL(h->dst) == f->ulv;
183 87a52e04 2005-12-26 devnull case Osd:
184 87a52e04 2005-12-26 devnull return NetL(h->src) == f->ulv || NetL(h->dst) == f->ulv;
185 87a52e04 2005-12-26 devnull case Ot:
186 87a52e04 2005-12-26 devnull return h->proto == f->ulv;
187 87a52e04 2005-12-26 devnull }
188 87a52e04 2005-12-26 devnull return 0;
189 87a52e04 2005-12-26 devnull }
190 87a52e04 2005-12-26 devnull
191 87a52e04 2005-12-26 devnull static int
192 87a52e04 2005-12-26 devnull p_seprint(Msg *m)
193 87a52e04 2005-12-26 devnull {
194 87a52e04 2005-12-26 devnull Hdr *h;
195 87a52e04 2005-12-26 devnull int f;
196 87a52e04 2005-12-26 devnull int len;
197 87a52e04 2005-12-26 devnull
198 87a52e04 2005-12-26 devnull if(m->pe - m->ps < IPHDR)
199 87a52e04 2005-12-26 devnull return -1;
200 87a52e04 2005-12-26 devnull h = (Hdr*)m->ps;
201 87a52e04 2005-12-26 devnull
202 87a52e04 2005-12-26 devnull /* next protocol, just dump unless this is the first fragment */
203 87a52e04 2005-12-26 devnull m->pr = &dump;
204 87a52e04 2005-12-26 devnull f = NetS(h->frag);
205 87a52e04 2005-12-26 devnull if((f & ~(IP_DF|IP_MF)) == 0)
206 87a52e04 2005-12-26 devnull demux(p_mux, h->proto, h->proto, m, &dump);
207 87a52e04 2005-12-26 devnull
208 87a52e04 2005-12-26 devnull /* truncate the message if there's extra */
209 87a52e04 2005-12-26 devnull len = NetS(h->length);
210 87a52e04 2005-12-26 devnull if(len < m->pe - m->ps)
211 87a52e04 2005-12-26 devnull m->pe = m->ps + len;
212 87a52e04 2005-12-26 devnull
213 87a52e04 2005-12-26 devnull /* next header */
214 87a52e04 2005-12-26 devnull m->ps += ((h->vihl&0xf)<<2);
215 87a52e04 2005-12-26 devnull
216 87a52e04 2005-12-26 devnull m->p = seprint(m->p, m->e, "s=%V d=%V id=%4.4ux frag=%4.4ux ttl=%3d pr=%d ln=%d",
217 87a52e04 2005-12-26 devnull h->src, h->dst,
218 87a52e04 2005-12-26 devnull NetS(h->id),
219 87a52e04 2005-12-26 devnull NetS(h->frag),
220 87a52e04 2005-12-26 devnull h->ttl,
221 87a52e04 2005-12-26 devnull h->proto,
222 87a52e04 2005-12-26 devnull NetS(h->length)
223 87a52e04 2005-12-26 devnull );
224 87a52e04 2005-12-26 devnull return 0;
225 87a52e04 2005-12-26 devnull }
226 87a52e04 2005-12-26 devnull
227 87a52e04 2005-12-26 devnull Proto ip =
228 87a52e04 2005-12-26 devnull {
229 87a52e04 2005-12-26 devnull "ip",
230 87a52e04 2005-12-26 devnull p_compile,
231 87a52e04 2005-12-26 devnull p_filter,
232 87a52e04 2005-12-26 devnull p_seprint,
233 87a52e04 2005-12-26 devnull p_mux,
234 a38a1836 2006-02-14 devnull "%lud",
235 87a52e04 2005-12-26 devnull p_fields,
236 cbeb0b26 2006-04-01 devnull defaultframer
237 87a52e04 2005-12-26 devnull };