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