]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/ip/snoopy/aoe.c
Import sources from 2011-03-30 iso image
[plan9front.git] / sys / src / cmd / ip / snoopy / aoe.c
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
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
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
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 };