2 17b19538 2008-07-24 rsc * LLC. Only enough to dispatch to SNAP and IP.
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"
17 17b19538 2008-07-24 rsc UPoll = 0x10,
18 17b19538 2008-07-24 rsc IsPoll = 0x100,
19 17b19538 2008-07-24 rsc XidFi = 0x81,
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,
38 17b19538 2008-07-24 rsc static Mux p_mux[] =
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 },
48 17b19538 2008-07-24 rsc typedef struct Hdr Hdr;
61 17b19538 2008-07-24 rsc unpackhdr(uchar *p, uchar *ep, Hdr *h)
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)
76 17b19538 2008-07-24 rsc h->hdrlen = 4;
77 17b19538 2008-07-24 rsc h->ctl = LittleS(p+2);
89 17b19538 2008-07-24 rsc static Field p_fields[] =
91 17b19538 2008-07-24 rsc { "ssap", Fnum, Ossap, "ssap" },
92 17b19538 2008-07-24 rsc { "dsap", Fnum, Odsap, "dsap" },
97 17b19538 2008-07-24 rsc p_compile(Filter *f)
101 17b19538 2008-07-24 rsc if(f->op == '='){
102 17b19538 2008-07-24 rsc compile_cmp(llc.name, f, p_fields);
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;
113 17b19538 2008-07-24 rsc sysfatal("unknown llc field or protocol: %s", f->s);
117 17b19538 2008-07-24 rsc p_filter(Filter *f, Msg *m)
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)
124 17b19538 2008-07-24 rsc m->ps += h.hdrlen;
126 17b19538 2008-07-24 rsc switch(f->subop){
128 17b19538 2008-07-24 rsc return f->ulv == h.ssap;
130 17b19538 2008-07-24 rsc return f->ulv == h.dsap;
132 17b19538 2008-07-24 rsc return f->ulv == h.ssap && f->ulv == h.dsap;
138 17b19538 2008-07-24 rsc p_seprint(Msg *m)
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)
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){
153 17b19538 2008-07-24 rsc m->pr = &ip;
155 17b19538 2008-07-24 rsc case SapSnap:
156 17b19538 2008-07-24 rsc m->pr = &snap;
172 17b19538 2008-07-24 rsc defaultframer