xref: /plan9-contrib/sys/src/cmd/ip/snoopy/aoe.c (revision 43751f27fa93b002d5e921851faf5da5cbdcb417)
1e6dcbf51SDavid du Colombier #include <u.h>
2e6dcbf51SDavid du Colombier #include <libc.h>
3e6dcbf51SDavid du Colombier #include <ip.h>
4e6dcbf51SDavid du Colombier #include "dat.h"
5e6dcbf51SDavid du Colombier #include "protos.h"
6e6dcbf51SDavid du Colombier 
7e6dcbf51SDavid du Colombier typedef struct{
8e6dcbf51SDavid du Colombier 	uchar	verflags;
9e6dcbf51SDavid du Colombier 	uchar	error;
10e6dcbf51SDavid du Colombier 	uchar	major[2];
11e6dcbf51SDavid du Colombier 	uchar	minor;
12e6dcbf51SDavid du Colombier 	uchar	cmd;
13e6dcbf51SDavid du Colombier 	uchar	tag[4];
14e6dcbf51SDavid du Colombier }Hdr;
15e6dcbf51SDavid du Colombier 
16e6dcbf51SDavid du Colombier enum{
17e6dcbf51SDavid du Colombier 	Hsize	= 10,
18e6dcbf51SDavid du Colombier };
19e6dcbf51SDavid du Colombier 
20e6dcbf51SDavid du Colombier enum{
21e6dcbf51SDavid du Colombier 	Omajor,
22e6dcbf51SDavid du Colombier 	Ominor,
23e6dcbf51SDavid du Colombier 	Ocmd,
24e6dcbf51SDavid du Colombier };
25e6dcbf51SDavid du Colombier 
26e6dcbf51SDavid du Colombier static Mux p_mux[] = {
27e6dcbf51SDavid du Colombier 	{"aoeata",	0},
28e6dcbf51SDavid du Colombier 	{"aoecmd",	1},
29*43751f27SDavid du Colombier 	{"aoemask",	2},
30*43751f27SDavid du Colombier 	{"aoerr",	3},
31e6dcbf51SDavid du Colombier 	{0},
32e6dcbf51SDavid du Colombier };
33e6dcbf51SDavid du Colombier 
34e6dcbf51SDavid du Colombier static Field p_fields[] =
35e6dcbf51SDavid du Colombier {
36*43751f27SDavid du Colombier 	{"shelf",	Fnum,	Ominor,		"shelf", },
37*43751f27SDavid du Colombier 	{"slot",	Fnum,	Omajor,		"slot",	},
38e6dcbf51SDavid du Colombier 	{"cmd",		Fnum,	Ocmd,		"cmd",	},
39e6dcbf51SDavid du Colombier 	{0}
40e6dcbf51SDavid du Colombier };
41e6dcbf51SDavid du Colombier 
42e6dcbf51SDavid du Colombier static void
p_compile(Filter * f)43e6dcbf51SDavid du Colombier p_compile(Filter *f)
44e6dcbf51SDavid du Colombier {
4507c70eb6SDavid du Colombier 	Mux *m;
4607c70eb6SDavid du Colombier 
47e6dcbf51SDavid du Colombier 	if(f->op == '='){
48e6dcbf51SDavid du Colombier 		compile_cmp(aoe.name, f, p_fields);
49e6dcbf51SDavid du Colombier 		return;
50e6dcbf51SDavid du Colombier 	}
5107c70eb6SDavid du Colombier 	for(m = p_mux; m->name; m++)
5207c70eb6SDavid du Colombier 		if(strcmp(f->s, m->name) == 0){
5307c70eb6SDavid du Colombier 			f->pr = m->pr;
5407c70eb6SDavid du Colombier 			f->ulv = m->val;
5507c70eb6SDavid du Colombier 			f->subop = Ocmd;
5607c70eb6SDavid du Colombier 			return;
5707c70eb6SDavid du Colombier 		}
58e6dcbf51SDavid du Colombier 	sysfatal("unknown aoe field: %s", f->s);
59e6dcbf51SDavid du Colombier }
60e6dcbf51SDavid du Colombier 
61e6dcbf51SDavid du Colombier static int
p_filter(Filter * f,Msg * m)62e6dcbf51SDavid du Colombier p_filter(Filter *f, Msg *m)
63e6dcbf51SDavid du Colombier {
64e6dcbf51SDavid du Colombier 	Hdr *h;
65e6dcbf51SDavid du Colombier 
66e6dcbf51SDavid du Colombier 	if(m->pe - m->ps < Hsize)
67e6dcbf51SDavid du Colombier 		return 0;
68e6dcbf51SDavid du Colombier 
69e6dcbf51SDavid du Colombier 	h = (Hdr*)m->ps;
70e6dcbf51SDavid du Colombier 	m->ps += Hsize;
71e6dcbf51SDavid du Colombier 
72e6dcbf51SDavid du Colombier 	switch(f->subop){
73e6dcbf51SDavid du Colombier 	case Omajor:
74e6dcbf51SDavid du Colombier 		return NetS(h->major) == f->ulv;
75e6dcbf51SDavid du Colombier 	case Ominor:
76e6dcbf51SDavid du Colombier 		return h->minor == f->ulv;
77e6dcbf51SDavid du Colombier 	case Ocmd:
78e6dcbf51SDavid du Colombier 		return h->cmd == f->ulv;
79e6dcbf51SDavid du Colombier 	}
80e6dcbf51SDavid du Colombier 	return 0;
81e6dcbf51SDavid du Colombier }
82e6dcbf51SDavid du Colombier 
83e6dcbf51SDavid du Colombier static int
p_seprint(Msg * m)84e6dcbf51SDavid du Colombier p_seprint(Msg *m)
85e6dcbf51SDavid du Colombier {
86e6dcbf51SDavid du Colombier 	Hdr *h;
87e6dcbf51SDavid du Colombier 
88e6dcbf51SDavid du Colombier 	if(m->pe - m->ps < Hsize)
89e6dcbf51SDavid du Colombier 		return 0;
90e6dcbf51SDavid du Colombier 
91e6dcbf51SDavid du Colombier 	h = (Hdr*)m->ps;
92e6dcbf51SDavid du Colombier 	m->ps += Hsize;
93e6dcbf51SDavid du Colombier 
94e6dcbf51SDavid du Colombier 	demux(p_mux, h->cmd, h->cmd, m, &dump);
95e6dcbf51SDavid du Colombier 
96e6dcbf51SDavid du Colombier 	m->p = seprint(m->p, m->e, "ver=%d flag=%4b err=%d %d.%d cmd=%ux tag=%ux",
97e6dcbf51SDavid du Colombier 		h->verflags >> 4, h->verflags & 0xf, h->error, NetS(h->major),
98e6dcbf51SDavid du Colombier 		h->minor, h->cmd, NetL(h->tag));
99e6dcbf51SDavid du Colombier 	return 0;
100e6dcbf51SDavid du Colombier }
101e6dcbf51SDavid du Colombier 
102e6dcbf51SDavid du Colombier Proto aoe =
103e6dcbf51SDavid du Colombier {
104e6dcbf51SDavid du Colombier 	"aoe",
105e6dcbf51SDavid du Colombier 	p_compile,
106e6dcbf51SDavid du Colombier 	p_filter,
107e6dcbf51SDavid du Colombier 	p_seprint,
108e6dcbf51SDavid du Colombier 	p_mux,
10907c70eb6SDavid du Colombier 	"%lud",
110e6dcbf51SDavid du Colombier 	p_fields,
111e6dcbf51SDavid du Colombier 	defaultframer,
112e6dcbf51SDavid du Colombier };
113