xref: /plan9/sys/src/cmd/ip/snoopy/aoecmd.c (revision e6dcbf51e935975016093545b6eab69976b6e257)
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