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