1*ed397113SDavid du Colombier #include <u.h>
2*ed397113SDavid du Colombier #include <libc.h>
3*ed397113SDavid du Colombier #include <ip.h>
4*ed397113SDavid du Colombier #include "dat.h"
5*ed397113SDavid du Colombier #include "protos.h"
6*ed397113SDavid du Colombier
7*ed397113SDavid du Colombier typedef struct Hdr Hdr;
8*ed397113SDavid du Colombier struct Hdr
9*ed397113SDavid du Colombier {
10*ed397113SDavid du Colombier uchar vi; /* version */
11*ed397113SDavid du Colombier uchar type;
12*ed397113SDavid du Colombier uchar len[2]; /* length of data following this header */
13*ed397113SDavid du Colombier };
14*ed397113SDavid du Colombier
15*ed397113SDavid du Colombier enum
16*ed397113SDavid du Colombier {
17*ed397113SDavid du Colombier EAPOLHDR= 4, /* sizeof(Hdr) */
18*ed397113SDavid du Colombier
19*ed397113SDavid du Colombier /* eapol types */
20*ed397113SDavid du Colombier Eap = 0,
21*ed397113SDavid du Colombier Start,
22*ed397113SDavid du Colombier Logoff,
23*ed397113SDavid du Colombier Key,
24*ed397113SDavid du Colombier AsfAlert,
25*ed397113SDavid du Colombier };
26*ed397113SDavid du Colombier
27*ed397113SDavid du Colombier enum
28*ed397113SDavid du Colombier {
29*ed397113SDavid du Colombier Ot, /* type */
30*ed397113SDavid du Colombier };
31*ed397113SDavid du Colombier
32*ed397113SDavid du Colombier static Mux p_mux[] =
33*ed397113SDavid du Colombier {
34*ed397113SDavid du Colombier { "eap", Eap, },
35*ed397113SDavid du Colombier { "eapol_start", Start, },
36*ed397113SDavid du Colombier { "eapol_logoff", Logoff, },
37*ed397113SDavid du Colombier { "eapol_key", Key, },
38*ed397113SDavid du Colombier { "asf_alert", AsfAlert, },
39*ed397113SDavid du Colombier { 0 }
40*ed397113SDavid du Colombier };
41*ed397113SDavid du Colombier
42*ed397113SDavid du Colombier static void
p_compile(Filter * f)43*ed397113SDavid du Colombier p_compile(Filter *f)
44*ed397113SDavid du Colombier {
45*ed397113SDavid du Colombier Mux *m;
46*ed397113SDavid du Colombier
47*ed397113SDavid du Colombier for(m = p_mux; m->name != nil; m++)
48*ed397113SDavid du Colombier if(strcmp(f->s, m->name) == 0){
49*ed397113SDavid du Colombier f->pr = m->pr;
50*ed397113SDavid du Colombier f->ulv = m->val;
51*ed397113SDavid du Colombier f->subop = Ot;
52*ed397113SDavid du Colombier return;
53*ed397113SDavid du Colombier }
54*ed397113SDavid du Colombier sysfatal("unknown eapol field or type: %s", f->s);
55*ed397113SDavid du Colombier }
56*ed397113SDavid du Colombier
57*ed397113SDavid du Colombier static int
p_filter(Filter * f,Msg * m)58*ed397113SDavid du Colombier p_filter(Filter *f, Msg *m)
59*ed397113SDavid du Colombier {
60*ed397113SDavid du Colombier Hdr *h;
61*ed397113SDavid du Colombier
62*ed397113SDavid du Colombier if(m->pe - m->ps < EAPOLHDR)
63*ed397113SDavid du Colombier return 0;
64*ed397113SDavid du Colombier
65*ed397113SDavid du Colombier h = (Hdr*)m->ps;
66*ed397113SDavid du Colombier
67*ed397113SDavid du Colombier /* len does not include header */
68*ed397113SDavid du Colombier m->ps += EAPOLHDR;
69*ed397113SDavid du Colombier
70*ed397113SDavid du Colombier switch(f->subop){
71*ed397113SDavid du Colombier case Ot:
72*ed397113SDavid du Colombier return h->type == f->ulv;
73*ed397113SDavid du Colombier }
74*ed397113SDavid du Colombier return 0;
75*ed397113SDavid du Colombier }
76*ed397113SDavid du Colombier
77*ed397113SDavid du Colombier static char*
op(int i)78*ed397113SDavid du Colombier op(int i)
79*ed397113SDavid du Colombier {
80*ed397113SDavid du Colombier static char x[20];
81*ed397113SDavid du Colombier
82*ed397113SDavid du Colombier switch(i){
83*ed397113SDavid du Colombier case Eap:
84*ed397113SDavid du Colombier return "Eap";
85*ed397113SDavid du Colombier case Start:
86*ed397113SDavid du Colombier return "Start";
87*ed397113SDavid du Colombier case Logoff:
88*ed397113SDavid du Colombier return "Logoff";
89*ed397113SDavid du Colombier case Key:
90*ed397113SDavid du Colombier return "Key";
91*ed397113SDavid du Colombier case AsfAlert:
92*ed397113SDavid du Colombier return "AsfAlert";
93*ed397113SDavid du Colombier default:
94*ed397113SDavid du Colombier sprint(x, "%1d", i);
95*ed397113SDavid du Colombier return x;
96*ed397113SDavid du Colombier }
97*ed397113SDavid du Colombier }
98*ed397113SDavid du Colombier
99*ed397113SDavid du Colombier static int
p_seprint(Msg * m)100*ed397113SDavid du Colombier p_seprint(Msg *m)
101*ed397113SDavid du Colombier {
102*ed397113SDavid du Colombier Hdr *h;
103*ed397113SDavid du Colombier int len;
104*ed397113SDavid du Colombier
105*ed397113SDavid du Colombier if(m->pe - m->ps < EAPOLHDR)
106*ed397113SDavid du Colombier return -1;
107*ed397113SDavid du Colombier
108*ed397113SDavid du Colombier h = (Hdr*)m->ps;
109*ed397113SDavid du Colombier
110*ed397113SDavid du Colombier /* len does not include header */
111*ed397113SDavid du Colombier m->ps += EAPOLHDR;
112*ed397113SDavid du Colombier
113*ed397113SDavid du Colombier /* truncate the message if there's extra */
114*ed397113SDavid du Colombier len = NetS(h->len);
115*ed397113SDavid du Colombier if(m->ps + len < m->pe)
116*ed397113SDavid du Colombier m->pe = m->ps + len;
117*ed397113SDavid du Colombier else if(m->ps+len > m->pe)
118*ed397113SDavid du Colombier return -1;
119*ed397113SDavid du Colombier
120*ed397113SDavid du Colombier /* next protocol depending on type*/
121*ed397113SDavid du Colombier demux(p_mux, h->type, h->type, m, &dump);
122*ed397113SDavid du Colombier
123*ed397113SDavid du Colombier m->p = seprint(m->p, m->e, "type=%s version=%1d datalen=%1d",
124*ed397113SDavid du Colombier op(h->type), h->vi, len);
125*ed397113SDavid du Colombier return 0;
126*ed397113SDavid du Colombier }
127*ed397113SDavid du Colombier
128*ed397113SDavid du Colombier Proto eapol =
129*ed397113SDavid du Colombier {
130*ed397113SDavid du Colombier "eapol",
131*ed397113SDavid du Colombier p_compile,
132*ed397113SDavid du Colombier p_filter,
133*ed397113SDavid du Colombier p_seprint,
134*ed397113SDavid du Colombier p_mux,
135*ed397113SDavid du Colombier "%lud",
136*ed397113SDavid du Colombier nil,
137*ed397113SDavid du Colombier defaultframer,
138*ed397113SDavid du Colombier };
139