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 uchar d[6];
10 87a52e04 2005-12-26 devnull uchar s[6];
11 87a52e04 2005-12-26 devnull uchar type[2];
12 87a52e04 2005-12-26 devnull char data[1500];
13 87a52e04 2005-12-26 devnull };
14 87a52e04 2005-12-26 devnull #define ETHERMINTU 60 /* minimum transmit size */
15 87a52e04 2005-12-26 devnull #define ETHERMAXTU 1514 /* maximum transmit size */
16 87a52e04 2005-12-26 devnull #define ETHERHDRSIZE 14 /* size of an ethernet header */
17 87a52e04 2005-12-26 devnull
18 87a52e04 2005-12-26 devnull static Mux p_mux[] =
19 87a52e04 2005-12-26 devnull {
20 87a52e04 2005-12-26 devnull {"ip", 0x0800, } ,
21 87a52e04 2005-12-26 devnull {"arp", 0x0806, } ,
22 87a52e04 2005-12-26 devnull {"rarp", 0x0806, } ,
23 87a52e04 2005-12-26 devnull {"ip6", 0x86dd, } ,
24 87a52e04 2005-12-26 devnull {"pppoe_disc", 0x8863, },
25 87a52e04 2005-12-26 devnull {"pppoe_sess", 0x8864, },
26 a38a1836 2006-02-14 devnull {"eapol", 0x888e, },
27 87a52e04 2005-12-26 devnull {0}
28 87a52e04 2005-12-26 devnull };
29 87a52e04 2005-12-26 devnull
30 87a52e04 2005-12-26 devnull enum
31 87a52e04 2005-12-26 devnull {
32 cbeb0b26 2006-04-01 devnull Os, /* source */
33 cbeb0b26 2006-04-01 devnull Od, /* destination */
34 cbeb0b26 2006-04-01 devnull Oa, /* source or destination */
35 cbeb0b26 2006-04-01 devnull Ot, /* type */
36 87a52e04 2005-12-26 devnull };
37 87a52e04 2005-12-26 devnull
38 fa325e9b 2020-01-10 cross static Field p_fields[] =
39 87a52e04 2005-12-26 devnull {
40 87a52e04 2005-12-26 devnull {"s", Fether, Os, "source address", } ,
41 87a52e04 2005-12-26 devnull {"d", Fether, Od, "destination address", } ,
42 87a52e04 2005-12-26 devnull {"a", Fether, Oa, "source|destination address" } ,
43 87a52e04 2005-12-26 devnull {"sd", Fether, Oa, "source|destination address" } ,
44 87a52e04 2005-12-26 devnull {"t", Fnum, Ot, "type" } ,
45 87a52e04 2005-12-26 devnull {0}
46 87a52e04 2005-12-26 devnull };
47 87a52e04 2005-12-26 devnull
48 87a52e04 2005-12-26 devnull static void
49 87a52e04 2005-12-26 devnull p_compile(Filter *f)
50 87a52e04 2005-12-26 devnull {
51 87a52e04 2005-12-26 devnull Mux *m;
52 87a52e04 2005-12-26 devnull
53 87a52e04 2005-12-26 devnull if(f->op == '='){
54 87a52e04 2005-12-26 devnull compile_cmp(ether.name, f, p_fields);
55 87a52e04 2005-12-26 devnull return;
56 87a52e04 2005-12-26 devnull }
57 87a52e04 2005-12-26 devnull for(m = p_mux; m->name != nil; m++)
58 87a52e04 2005-12-26 devnull if(strcmp(f->s, m->name) == 0){
59 87a52e04 2005-12-26 devnull f->pr = m->pr;
60 87a52e04 2005-12-26 devnull f->ulv = m->val;
61 87a52e04 2005-12-26 devnull f->subop = Ot;
62 87a52e04 2005-12-26 devnull return;
63 87a52e04 2005-12-26 devnull }
64 87a52e04 2005-12-26 devnull sysfatal("unknown ethernet field or protocol: %s", f->s);
65 87a52e04 2005-12-26 devnull }
66 87a52e04 2005-12-26 devnull
67 87a52e04 2005-12-26 devnull static int
68 87a52e04 2005-12-26 devnull p_filter(Filter *f, Msg *m)
69 87a52e04 2005-12-26 devnull {
70 87a52e04 2005-12-26 devnull Hdr *h;
71 87a52e04 2005-12-26 devnull
72 87a52e04 2005-12-26 devnull if(m->pe - m->ps < ETHERHDRSIZE)
73 87a52e04 2005-12-26 devnull return 0;
74 87a52e04 2005-12-26 devnull
75 87a52e04 2005-12-26 devnull h = (Hdr*)m->ps;
76 87a52e04 2005-12-26 devnull m->ps += ETHERHDRSIZE;
77 87a52e04 2005-12-26 devnull
78 87a52e04 2005-12-26 devnull switch(f->subop){
79 87a52e04 2005-12-26 devnull case Os:
80 87a52e04 2005-12-26 devnull return !memcmp(h->s, f->a, 6);
81 87a52e04 2005-12-26 devnull case Od:
82 87a52e04 2005-12-26 devnull return !memcmp(h->d, f->a, 6);
83 87a52e04 2005-12-26 devnull case Oa:
84 87a52e04 2005-12-26 devnull return memcmp(h->s, f->a, 6) == 0 || memcmp(h->d, f->a, 6) == 0;
85 87a52e04 2005-12-26 devnull case Ot:
86 87a52e04 2005-12-26 devnull return NetS(h->type) == f->ulv;
87 87a52e04 2005-12-26 devnull }
88 87a52e04 2005-12-26 devnull return 0;
89 87a52e04 2005-12-26 devnull }
90 87a52e04 2005-12-26 devnull
91 87a52e04 2005-12-26 devnull static int
92 87a52e04 2005-12-26 devnull p_seprint(Msg *m)
93 87a52e04 2005-12-26 devnull {
94 87a52e04 2005-12-26 devnull Hdr *h;
95 87a52e04 2005-12-26 devnull uint t;
96 87a52e04 2005-12-26 devnull int len;
97 87a52e04 2005-12-26 devnull
98 87a52e04 2005-12-26 devnull len = m->pe - m->ps;
99 87a52e04 2005-12-26 devnull if(len < ETHERHDRSIZE)
100 87a52e04 2005-12-26 devnull return -1;
101 87a52e04 2005-12-26 devnull
102 87a52e04 2005-12-26 devnull h = (Hdr*)m->ps;
103 87a52e04 2005-12-26 devnull m->ps += ETHERHDRSIZE;
104 87a52e04 2005-12-26 devnull
105 87a52e04 2005-12-26 devnull t = NetS(h->type);
106 87a52e04 2005-12-26 devnull demux(p_mux, t, t, m, &dump);
107 87a52e04 2005-12-26 devnull
108 87a52e04 2005-12-26 devnull m->p = seprint(m->p, m->e, "s=%E d=%E pr=%4.4ux ln=%d", h->s, h->d,
109 87a52e04 2005-12-26 devnull t, len);
110 87a52e04 2005-12-26 devnull return 0;
111 87a52e04 2005-12-26 devnull }
112 87a52e04 2005-12-26 devnull
113 87a52e04 2005-12-26 devnull Proto ether =
114 87a52e04 2005-12-26 devnull {
115 87a52e04 2005-12-26 devnull "ether",
116 87a52e04 2005-12-26 devnull p_compile,
117 87a52e04 2005-12-26 devnull p_filter,
118 87a52e04 2005-12-26 devnull p_seprint,
119 87a52e04 2005-12-26 devnull p_mux,
120 a38a1836 2006-02-14 devnull "%#.4lux",
121 87a52e04 2005-12-26 devnull p_fields,
122 87a52e04 2005-12-26 devnull defaultframer
123 87a52e04 2005-12-26 devnull };