xref: /plan9/sys/src/cmd/ip/snoopy/eapol.c (revision ed397113cdcf7aafea372b730bbcd17b05ee3f60)
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