xref: /plan9/sys/src/cmd/ip/snoopy/aoeata.c (revision e6dcbf51e935975016093545b6eab69976b6e257)
1*e6dcbf51SDavid du Colombier #include <u.h>
2*e6dcbf51SDavid du Colombier #include <libc.h>
3*e6dcbf51SDavid du Colombier #include <ip.h>
4*e6dcbf51SDavid du Colombier #include "dat.h"
5*e6dcbf51SDavid du Colombier #include "protos.h"
6*e6dcbf51SDavid du Colombier 
7*e6dcbf51SDavid du Colombier typedef struct{
8*e6dcbf51SDavid du Colombier 	uchar	aflag;
9*e6dcbf51SDavid du Colombier 	uchar	feat;
10*e6dcbf51SDavid du Colombier 	uchar	sectors;
11*e6dcbf51SDavid du Colombier 	uchar	cmd;
12*e6dcbf51SDavid du Colombier 	uchar	lba[6];
13*e6dcbf51SDavid du Colombier }Hdr;
14*e6dcbf51SDavid du Colombier 
15*e6dcbf51SDavid du Colombier enum{
16*e6dcbf51SDavid du Colombier 	Hsize	= 10,
17*e6dcbf51SDavid du Colombier };
18*e6dcbf51SDavid du Colombier 
19*e6dcbf51SDavid du Colombier enum{
20*e6dcbf51SDavid du Colombier 	Oaflag,
21*e6dcbf51SDavid du Colombier 	Ocmd,
22*e6dcbf51SDavid du Colombier 	Ofeat,
23*e6dcbf51SDavid du Colombier 	Osectors,
24*e6dcbf51SDavid du Colombier 	Olba,
25*e6dcbf51SDavid du Colombier 
26*e6dcbf51SDavid du Colombier 	Ostat,
27*e6dcbf51SDavid du Colombier 	Oerr,
28*e6dcbf51SDavid du Colombier };
29*e6dcbf51SDavid du Colombier 
30*e6dcbf51SDavid du Colombier static Field p_fields[] =
31*e6dcbf51SDavid du Colombier {
32*e6dcbf51SDavid du Colombier 	{"aflag",	Fnum,	Oaflag,		"aflag",		},
33*e6dcbf51SDavid du Colombier 	{"cmd",		Fnum,	Ocmd,		"command register",	},
34*e6dcbf51SDavid du Colombier 	{"feat",	Fnum,	Ofeat,		"features",		},
35*e6dcbf51SDavid du Colombier 	{"sectors",	Fnum,	Osectors,	"number of sectors",	},
36*e6dcbf51SDavid du Colombier 	{"lba",		Fnum,	Olba,		"lba",			},
37*e6dcbf51SDavid du Colombier 	{"stat",	Fnum,	Ostat,		"status",		},
38*e6dcbf51SDavid du Colombier 	{"err",		Fnum,	Oerr,		"error",		},
39*e6dcbf51SDavid du Colombier 	{0}
40*e6dcbf51SDavid du Colombier };
41*e6dcbf51SDavid du Colombier 
42*e6dcbf51SDavid du Colombier static void
p_compile(Filter * f)43*e6dcbf51SDavid du Colombier p_compile(Filter *f)
44*e6dcbf51SDavid du Colombier {
45*e6dcbf51SDavid du Colombier 	if(f->op == '='){
46*e6dcbf51SDavid du Colombier 		compile_cmp(aoeata.name, f, p_fields);
47*e6dcbf51SDavid du Colombier 		return;
48*e6dcbf51SDavid du Colombier 	}
49*e6dcbf51SDavid du Colombier 	sysfatal("unknown aoeata field: %s", f->s);
50*e6dcbf51SDavid du Colombier }
51*e6dcbf51SDavid du Colombier 
52*e6dcbf51SDavid du Colombier uvlong
llba(uchar * c)53*e6dcbf51SDavid du Colombier llba(uchar *c)
54*e6dcbf51SDavid du Colombier {
55*e6dcbf51SDavid du Colombier 	uvlong l;
56*e6dcbf51SDavid du Colombier 
57*e6dcbf51SDavid du Colombier 	l = c[0];
58*e6dcbf51SDavid du Colombier 	l |= c[1]<<8;
59*e6dcbf51SDavid du Colombier 	l |= c[2]<<16;
60*e6dcbf51SDavid du Colombier 	l |= c[3]<<24;
61*e6dcbf51SDavid du Colombier 	l |= (uvlong)c[4]<<32;
62*e6dcbf51SDavid du Colombier 	l |= (uvlong)c[5]<<40;
63*e6dcbf51SDavid du Colombier 	return l;
64*e6dcbf51SDavid du Colombier }
65*e6dcbf51SDavid du Colombier 
66*e6dcbf51SDavid du Colombier static int
p_filter(Filter * f,Msg * m)67*e6dcbf51SDavid du Colombier p_filter(Filter *f, Msg *m)
68*e6dcbf51SDavid du Colombier {
69*e6dcbf51SDavid du Colombier 	Hdr *h;
70*e6dcbf51SDavid du Colombier 
71*e6dcbf51SDavid du Colombier 	if(m->pe - m->ps < Hsize)
72*e6dcbf51SDavid du Colombier 		return 0;
73*e6dcbf51SDavid du Colombier 
74*e6dcbf51SDavid du Colombier 	h = (Hdr*)m->ps;
75*e6dcbf51SDavid du Colombier 	m->ps += Hsize;
76*e6dcbf51SDavid du Colombier 
77*e6dcbf51SDavid du Colombier 	switch(f->subop){
78*e6dcbf51SDavid du Colombier 	case Oaflag:
79*e6dcbf51SDavid du Colombier 		return h->aflag == f->ulv;
80*e6dcbf51SDavid du Colombier 	case Ocmd:
81*e6dcbf51SDavid du Colombier 		return h->cmd == f->ulv;
82*e6dcbf51SDavid du Colombier 	case Ofeat:
83*e6dcbf51SDavid du Colombier 		return h->feat == f->ulv;
84*e6dcbf51SDavid du Colombier 	case Osectors:
85*e6dcbf51SDavid du Colombier 		return h->sectors == f->ulv;
86*e6dcbf51SDavid du Colombier 	case Olba:
87*e6dcbf51SDavid du Colombier 		return llba(h->lba) == f->vlv;
88*e6dcbf51SDavid du Colombier 
89*e6dcbf51SDavid du Colombier 	/* this is wrong, but we don't have access to the direction here */
90*e6dcbf51SDavid du Colombier 	case Ostat:
91*e6dcbf51SDavid du Colombier 		return h->cmd == f->ulv;
92*e6dcbf51SDavid du Colombier 	case Oerr:
93*e6dcbf51SDavid du Colombier 		return h->feat == f->ulv;
94*e6dcbf51SDavid du Colombier 	}
95*e6dcbf51SDavid du Colombier 	return 0;
96*e6dcbf51SDavid du Colombier }
97*e6dcbf51SDavid du Colombier 
98*e6dcbf51SDavid du Colombier static int
p_seprint(Msg * m)99*e6dcbf51SDavid du Colombier p_seprint(Msg *m)
100*e6dcbf51SDavid du Colombier {
101*e6dcbf51SDavid du Colombier 	Hdr *h;
102*e6dcbf51SDavid du Colombier 
103*e6dcbf51SDavid du Colombier 	if(m->pe - m->ps < Hsize)
104*e6dcbf51SDavid du Colombier 		return 0;
105*e6dcbf51SDavid du Colombier 
106*e6dcbf51SDavid du Colombier 	h = (Hdr*)m->ps;
107*e6dcbf51SDavid du Colombier 	m->ps += Hsize;
108*e6dcbf51SDavid du Colombier 
109*e6dcbf51SDavid du Colombier 	/* no next protocol */
110*e6dcbf51SDavid du Colombier 	m->pr = nil;
111*e6dcbf51SDavid du Colombier 
112*e6dcbf51SDavid du Colombier 	m->p = seprint(m->p, m->e, "aflag=%ux errfeat=%ux sectors=%ux cmdstat=%ux lba=%lld",
113*e6dcbf51SDavid du Colombier 		h->aflag, h->feat, h->sectors, h->cmd, llba(h->lba));
114*e6dcbf51SDavid du Colombier 	return 0;
115*e6dcbf51SDavid du Colombier }
116*e6dcbf51SDavid du Colombier 
117*e6dcbf51SDavid du Colombier Proto aoeata =
118*e6dcbf51SDavid du Colombier {
119*e6dcbf51SDavid du Colombier 	"aoeata",
120*e6dcbf51SDavid du Colombier 	p_compile,
121*e6dcbf51SDavid du Colombier 	p_filter,
122*e6dcbf51SDavid du Colombier 	p_seprint,
123*e6dcbf51SDavid du Colombier 	nil,
124*e6dcbf51SDavid du Colombier 	nil,
125*e6dcbf51SDavid du Colombier 	p_fields,
126*e6dcbf51SDavid du Colombier 	defaultframer,
127*e6dcbf51SDavid du Colombier };
128