Blame


1 17b19538 2008-07-24 rsc /*
2 17b19538 2008-07-24 rsc * LLC. Only enough to dispatch to SNAP and IP.
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 UFmt = 3,
14 17b19538 2008-07-24 rsc Gsap = 1,
15 17b19538 2008-07-24 rsc IG = 1,
16 17b19538 2008-07-24 rsc SFmt = 1,
17 17b19538 2008-07-24 rsc UPoll = 0x10,
18 17b19538 2008-07-24 rsc IsPoll = 0x100,
19 17b19538 2008-07-24 rsc XidFi = 0x81,
20 17b19538 2008-07-24 rsc
21 17b19538 2008-07-24 rsc SapNull = 0,
22 17b19538 2008-07-24 rsc SapGlobal = 0xff,
23 17b19538 2008-07-24 rsc Sap8021BI = 0x02,
24 17b19538 2008-07-24 rsc Sap8021BG = 0x03,
25 17b19538 2008-07-24 rsc SapSNA = 0x04,
26 17b19538 2008-07-24 rsc SapIP = 0x06,
27 17b19538 2008-07-24 rsc SapProwayNM = 0x0e,
28 17b19538 2008-07-24 rsc Sap8021D = 0x42,
29 17b19538 2008-07-24 rsc SapRS511 = 0x4e,
30 17b19538 2008-07-24 rsc SapISO8208 = 0x7e,
31 17b19538 2008-07-24 rsc SapProway = 0x8e,
32 17b19538 2008-07-24 rsc SapSnap = 0xaa,
33 17b19538 2008-07-24 rsc SapIpx = 0xe0,
34 17b19538 2008-07-24 rsc SapNetbeui = 0xf0,
35 17b19538 2008-07-24 rsc SapIsons = 0xfe,
36 17b19538 2008-07-24 rsc };
37 17b19538 2008-07-24 rsc
38 17b19538 2008-07-24 rsc static Mux p_mux[] =
39 17b19538 2008-07-24 rsc {
40 17b19538 2008-07-24 rsc // Linux gives llc -> snap not llc -> ip.
41 17b19538 2008-07-24 rsc // If we don't tell snoopy about llc -> ip, then the default patterns
42 17b19538 2008-07-24 rsc // like snoopy -h radiotap -f dns work better.
43 17b19538 2008-07-24 rsc // { "ip", SapIP },
44 17b19538 2008-07-24 rsc { "snap", SapSnap },
45 17b19538 2008-07-24 rsc { 0 }
46 17b19538 2008-07-24 rsc };
47 17b19538 2008-07-24 rsc
48 17b19538 2008-07-24 rsc typedef struct Hdr Hdr;
49 17b19538 2008-07-24 rsc struct Hdr
50 17b19538 2008-07-24 rsc {
51 17b19538 2008-07-24 rsc uchar dsap;
52 17b19538 2008-07-24 rsc uchar ssap;
53 17b19538 2008-07-24 rsc uchar dsapf;
54 17b19538 2008-07-24 rsc uchar ssapf;
55 17b19538 2008-07-24 rsc ushort ctl;
56 17b19538 2008-07-24 rsc uchar isu;
57 17b19538 2008-07-24 rsc int hdrlen;
58 17b19538 2008-07-24 rsc };
59 17b19538 2008-07-24 rsc
60 17b19538 2008-07-24 rsc static int
61 17b19538 2008-07-24 rsc unpackhdr(uchar *p, uchar *ep, Hdr *h)
62 17b19538 2008-07-24 rsc {
63 17b19538 2008-07-24 rsc if(p+3 > ep)
64 17b19538 2008-07-24 rsc return -1;
65 17b19538 2008-07-24 rsc h->dsapf = p[0];
66 17b19538 2008-07-24 rsc h->dsap = h->dsapf & ~IG;
67 17b19538 2008-07-24 rsc h->ssapf = p[1];
68 17b19538 2008-07-24 rsc h->ssap = h->ssapf & ~Gsap;
69 17b19538 2008-07-24 rsc h->ctl = p[2];
70 17b19538 2008-07-24 rsc h->hdrlen = 3;
71 17b19538 2008-07-24 rsc if((h->ctl&UFmt) == UFmt)
72 17b19538 2008-07-24 rsc h->isu = 1;
73 17b19538 2008-07-24 rsc else{
74 17b19538 2008-07-24 rsc if(p+4 > ep)
75 17b19538 2008-07-24 rsc return -1;
76 17b19538 2008-07-24 rsc h->hdrlen = 4;
77 17b19538 2008-07-24 rsc h->ctl = LittleS(p+2);
78 17b19538 2008-07-24 rsc }
79 17b19538 2008-07-24 rsc return 0;
80 17b19538 2008-07-24 rsc }
81 17b19538 2008-07-24 rsc
82 17b19538 2008-07-24 rsc enum
83 17b19538 2008-07-24 rsc {
84 17b19538 2008-07-24 rsc Ossap,
85 17b19538 2008-07-24 rsc Odsap,
86 17b19538 2008-07-24 rsc Ot,
87 17b19538 2008-07-24 rsc };
88 17b19538 2008-07-24 rsc
89 17b19538 2008-07-24 rsc static Field p_fields[] =
90 17b19538 2008-07-24 rsc {
91 17b19538 2008-07-24 rsc { "ssap", Fnum, Ossap, "ssap" },
92 17b19538 2008-07-24 rsc { "dsap", Fnum, Odsap, "dsap" },
93 17b19538 2008-07-24 rsc { 0 }
94 17b19538 2008-07-24 rsc };
95 17b19538 2008-07-24 rsc
96 17b19538 2008-07-24 rsc static void
97 17b19538 2008-07-24 rsc p_compile(Filter *f)
98 17b19538 2008-07-24 rsc {
99 17b19538 2008-07-24 rsc Mux *m;
100 17b19538 2008-07-24 rsc
101 17b19538 2008-07-24 rsc if(f->op == '='){
102 17b19538 2008-07-24 rsc compile_cmp(llc.name, f, p_fields);
103 17b19538 2008-07-24 rsc return;
104 17b19538 2008-07-24 rsc }
105 17b19538 2008-07-24 rsc for(m = p_mux; m->name != nil; m++){
106 17b19538 2008-07-24 rsc if(strcmp(f->s, m->name) == 0){
107 17b19538 2008-07-24 rsc f->pr = m->pr;
108 17b19538 2008-07-24 rsc f->ulv = m->val;
109 17b19538 2008-07-24 rsc f->subop = Ot;
110 17b19538 2008-07-24 rsc return;
111 17b19538 2008-07-24 rsc }
112 17b19538 2008-07-24 rsc }
113 17b19538 2008-07-24 rsc sysfatal("unknown llc field or protocol: %s", f->s);
114 17b19538 2008-07-24 rsc }
115 17b19538 2008-07-24 rsc
116 17b19538 2008-07-24 rsc static int
117 17b19538 2008-07-24 rsc p_filter(Filter *f, Msg *m)
118 17b19538 2008-07-24 rsc {
119 17b19538 2008-07-24 rsc Hdr h;
120 17b19538 2008-07-24 rsc
121 17b19538 2008-07-24 rsc memset(&h, 0, sizeof h);
122 17b19538 2008-07-24 rsc if(unpackhdr(m->ps, m->pe, &h) < 0)
123 17b19538 2008-07-24 rsc return 0;
124 17b19538 2008-07-24 rsc m->ps += h.hdrlen;
125 17b19538 2008-07-24 rsc
126 17b19538 2008-07-24 rsc switch(f->subop){
127 17b19538 2008-07-24 rsc case Ossap:
128 17b19538 2008-07-24 rsc return f->ulv == h.ssap;
129 17b19538 2008-07-24 rsc case Odsap:
130 17b19538 2008-07-24 rsc return f->ulv == h.dsap;
131 17b19538 2008-07-24 rsc case Ot:
132 17b19538 2008-07-24 rsc return f->ulv == h.ssap && f->ulv == h.dsap;
133 17b19538 2008-07-24 rsc }
134 17b19538 2008-07-24 rsc return 0;
135 17b19538 2008-07-24 rsc }
136 17b19538 2008-07-24 rsc
137 17b19538 2008-07-24 rsc static int
138 17b19538 2008-07-24 rsc p_seprint(Msg *m)
139 17b19538 2008-07-24 rsc {
140 17b19538 2008-07-24 rsc Hdr h;
141 17b19538 2008-07-24 rsc
142 17b19538 2008-07-24 rsc memset(&h, 0, sizeof h);
143 17b19538 2008-07-24 rsc if(unpackhdr(m->ps, m->pe, &h) < 0)
144 17b19538 2008-07-24 rsc return -1;
145 17b19538 2008-07-24 rsc
146 17b19538 2008-07-24 rsc m->pr = &dump;
147 17b19538 2008-07-24 rsc m->p = seprint(m->p, m->e, "ssap=%02x dsap=%02x ctl=%04x", h.ssap, h.dsap, h.ctl);
148 17b19538 2008-07-24 rsc m->ps += h.hdrlen;
149 17b19538 2008-07-24 rsc m->pr = &dump;
150 17b19538 2008-07-24 rsc if(h.ssap == h.dsap){
151 17b19538 2008-07-24 rsc switch(h.ssap){
152 17b19538 2008-07-24 rsc case SapIP:
153 17b19538 2008-07-24 rsc m->pr = &ip;
154 17b19538 2008-07-24 rsc break;
155 17b19538 2008-07-24 rsc case SapSnap:
156 17b19538 2008-07-24 rsc m->pr = &snap;
157 17b19538 2008-07-24 rsc break;
158 17b19538 2008-07-24 rsc }
159 17b19538 2008-07-24 rsc }
160 17b19538 2008-07-24 rsc return 0;
161 17b19538 2008-07-24 rsc }
162 17b19538 2008-07-24 rsc
163 17b19538 2008-07-24 rsc Proto llc =
164 17b19538 2008-07-24 rsc {
165 17b19538 2008-07-24 rsc "llc",
166 17b19538 2008-07-24 rsc p_compile,
167 17b19538 2008-07-24 rsc p_filter,
168 17b19538 2008-07-24 rsc p_seprint,
169 17b19538 2008-07-24 rsc p_mux,
170 17b19538 2008-07-24 rsc nil,
171 17b19538 2008-07-24 rsc nil,
172 17b19538 2008-07-24 rsc defaultframer
173 17b19538 2008-07-24 rsc };