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