]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/ip/snoopy/aoecmd.c
Import sources from 2011-03-30 iso image - lib
[plan9front.git] / sys / src / cmd / ip / snoopy / aoecmd.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   bc[2];
9         uchar   fw[2];
10         uchar   sc;
11         uchar   ccmd;
12         uchar   len[2];
13 }Hdr;
14
15 enum{
16         Hsize   = 8,
17 };
18
19 enum{
20         Ocmd,
21 };
22
23 static Field p_fields[] =
24 {
25         {"cmd",         Fnum,   Ocmd,           "cmd",  },
26         {0}
27 };
28
29 static void
30 p_compile(Filter *f)
31 {
32         if(f->op == '='){
33                 compile_cmp(aoecmd.name, f, p_fields);
34                 return;
35         }
36         sysfatal("unknown aoecmd field: %s", f->s);
37 }
38
39 static int
40 p_filter(Filter *f, Msg *m)
41 {
42         Hdr *h;
43
44         if(m->pe - m->ps < Hsize)
45                 return 0;
46
47         h = (Hdr*)m->ps;
48         m->ps += Hsize;
49
50         switch(f->subop){
51         case Ocmd:
52                 return (h->ccmd & 0xf) == f->ulv;
53         }
54         return 0;
55 }
56
57 static int
58 p_seprint(Msg *m)
59 {
60         Hdr *h;
61
62         if(m->pe - m->ps < Hsize)
63                 return 0;
64
65         h = (Hdr*)m->ps;
66         m->ps += Hsize;
67
68         /* no next protocol */
69         m->pr = nil;
70
71         m->p = seprint(m->p, m->e, "bc=%d fw=%.4x sc=%d ver=%d ccmd=%d len=%d cfg=",
72                 NetS(h->bc), NetS(h->fw), h->sc, h->ccmd >> 4, h->ccmd & 0xf,
73                 NetS(h->len));
74         m->p = seprint(m->p, m->e, "%.*s", NetS(h->len), (char*)m->ps);
75         return 0;
76 }
77
78 Proto aoecmd =
79 {
80         "aoecmd",
81         p_compile,
82         p_filter,
83         p_seprint,
84         nil,
85         nil,
86         p_fields,
87         defaultframer,
88 };