Blame


1 17b19538 2008-07-24 rsc /*
2 17b19538 2008-07-24 rsc * SNAP.
3 17b19538 2008-07-24 rsc */
4 17b19538 2008-07-24 rsc
5 17b19538 2008-07-24 rsc #include <u.h>
6 17b19538 2008-07-24 rsc #include <libc.h>
7 17b19538 2008-07-24 rsc #include <ip.h>
8 17b19538 2008-07-24 rsc #include "dat.h"
9 17b19538 2008-07-24 rsc #include "protos.h"
10 17b19538 2008-07-24 rsc
11 17b19538 2008-07-24 rsc enum
12 17b19538 2008-07-24 rsc {
13 17b19538 2008-07-24 rsc Oorg,
14 17b19538 2008-07-24 rsc Oet,
15 17b19538 2008-07-24 rsc
16 17b19538 2008-07-24 rsc OuiEther = 0,
17 17b19538 2008-07-24 rsc OuiCisco = 0xc,
18 17b19538 2008-07-24 rsc OuiCisco90 = 0xf8,
19 17b19538 2008-07-24 rsc OuiRfc2684 = 0x80c2,
20 17b19538 2008-07-24 rsc OuiAppletalk = 0x80007,
21 17b19538 2008-07-24 rsc };
22 17b19538 2008-07-24 rsc
23 17b19538 2008-07-24 rsc static Mux p_mux[] =
24 17b19538 2008-07-24 rsc {
25 17b19538 2008-07-24 rsc {"ip", 0x0800, } ,
26 17b19538 2008-07-24 rsc {"arp", 0x0806, } ,
27 17b19538 2008-07-24 rsc {"rarp", 0x0806, } ,
28 17b19538 2008-07-24 rsc {"ip6", 0x86dd, } ,
29 17b19538 2008-07-24 rsc {"pppoe_disc", 0x8863, },
30 17b19538 2008-07-24 rsc {"pppoe_sess", 0x8864, },
31 17b19538 2008-07-24 rsc {"eapol", 0x888e, },
32 17b19538 2008-07-24 rsc { 0 }
33 17b19538 2008-07-24 rsc };
34 17b19538 2008-07-24 rsc
35 17b19538 2008-07-24 rsc typedef struct Hdr Hdr;
36 17b19538 2008-07-24 rsc struct Hdr
37 17b19538 2008-07-24 rsc {
38 17b19538 2008-07-24 rsc uchar org[3];
39 17b19538 2008-07-24 rsc uchar et[2];
40 17b19538 2008-07-24 rsc };
41 17b19538 2008-07-24 rsc
42 17b19538 2008-07-24 rsc static Field p_fields[] =
43 17b19538 2008-07-24 rsc {
44 17b19538 2008-07-24 rsc { "org", Fnum, Oorg, "org" },
45 17b19538 2008-07-24 rsc { "et", Fnum, Oet, "et" },
46 17b19538 2008-07-24 rsc { 0 }
47 17b19538 2008-07-24 rsc };
48 17b19538 2008-07-24 rsc
49 17b19538 2008-07-24 rsc static void
50 17b19538 2008-07-24 rsc p_compile(Filter *f)
51 17b19538 2008-07-24 rsc {
52 17b19538 2008-07-24 rsc Mux *m;
53 17b19538 2008-07-24 rsc
54 17b19538 2008-07-24 rsc if(f->op == '='){
55 17b19538 2008-07-24 rsc compile_cmp(snap.name, f, p_fields);
56 17b19538 2008-07-24 rsc return;
57 17b19538 2008-07-24 rsc }
58 17b19538 2008-07-24 rsc for(m = p_mux; m->name != nil; m++){
59 17b19538 2008-07-24 rsc if(strcmp(f->s, m->name) == 0){
60 17b19538 2008-07-24 rsc f->pr = m->pr;
61 17b19538 2008-07-24 rsc f->ulv = m->val;
62 17b19538 2008-07-24 rsc f->subop = Oet;
63 17b19538 2008-07-24 rsc return;
64 17b19538 2008-07-24 rsc }
65 17b19538 2008-07-24 rsc }
66 17b19538 2008-07-24 rsc sysfatal("unknown snap field or protocol: %s", f->s);
67 17b19538 2008-07-24 rsc }
68 17b19538 2008-07-24 rsc
69 17b19538 2008-07-24 rsc static int
70 17b19538 2008-07-24 rsc p_filter(Filter *f, Msg *m)
71 17b19538 2008-07-24 rsc {
72 17b19538 2008-07-24 rsc Hdr *h;
73 17b19538 2008-07-24 rsc
74 17b19538 2008-07-24 rsc if(m->pe - m->ps < sizeof(Hdr))
75 17b19538 2008-07-24 rsc return 0;
76 17b19538 2008-07-24 rsc h = (Hdr*)m->ps;
77 17b19538 2008-07-24 rsc m->ps += 5;
78 17b19538 2008-07-24 rsc switch(f->subop){
79 17b19538 2008-07-24 rsc case Oorg:
80 17b19538 2008-07-24 rsc return f->ulv == Net3(h->org);
81 17b19538 2008-07-24 rsc case Oet:
82 17b19538 2008-07-24 rsc return f->ulv == NetS(h->et);
83 17b19538 2008-07-24 rsc }
84 17b19538 2008-07-24 rsc return 0;
85 17b19538 2008-07-24 rsc }
86 17b19538 2008-07-24 rsc
87 17b19538 2008-07-24 rsc static int
88 17b19538 2008-07-24 rsc p_seprint(Msg *m)
89 17b19538 2008-07-24 rsc {
90 17b19538 2008-07-24 rsc Hdr *h;
91 17b19538 2008-07-24 rsc
92 17b19538 2008-07-24 rsc if(m->pe - m->ps < sizeof(Hdr))
93 17b19538 2008-07-24 rsc return 0;
94 17b19538 2008-07-24 rsc h = (Hdr*)m->ps;
95 17b19538 2008-07-24 rsc m->ps += 5;
96 17b19538 2008-07-24 rsc demux(p_mux, NetS(h->et), NetS(h->et), m, &dump);
97 17b19538 2008-07-24 rsc
98 17b19538 2008-07-24 rsc m->p = seprint(m->p, m->e, "org=%06x et=%04x", Net3(h->org), NetS(h->et));
99 17b19538 2008-07-24 rsc return 0;
100 17b19538 2008-07-24 rsc }
101 17b19538 2008-07-24 rsc
102 17b19538 2008-07-24 rsc Proto snap =
103 17b19538 2008-07-24 rsc {
104 17b19538 2008-07-24 rsc "snap",
105 17b19538 2008-07-24 rsc p_compile,
106 17b19538 2008-07-24 rsc p_filter,
107 17b19538 2008-07-24 rsc p_seprint,
108 17b19538 2008-07-24 rsc p_mux,
109 17b19538 2008-07-24 rsc nil,
110 17b19538 2008-07-24 rsc nil,
111 17b19538 2008-07-24 rsc defaultframer
112 17b19538 2008-07-24 rsc };