xref: /plan9/sys/src/cmd/ip/snoopy/cec.c (revision 52c84408ad8876243a7e99f59f88cf688e8d5a1e)
1e6dcbf51SDavid du Colombier #include <u.h>
2e6dcbf51SDavid du Colombier #include <libc.h>
3e6dcbf51SDavid du Colombier #include <ip.h>
4e6dcbf51SDavid du Colombier #include "dat.h"
5e6dcbf51SDavid du Colombier #include "protos.h"
6e6dcbf51SDavid du Colombier 
7e6dcbf51SDavid du Colombier typedef struct{
8e6dcbf51SDavid du Colombier 	uchar	type;
9e6dcbf51SDavid du Colombier 	uchar	conn;
10e6dcbf51SDavid du Colombier 	uchar	seq;
11e6dcbf51SDavid du Colombier 	uchar	len;
12e6dcbf51SDavid du Colombier }Hdr;
13e6dcbf51SDavid du Colombier 
14e6dcbf51SDavid du Colombier enum{
15e6dcbf51SDavid du Colombier 	Hsize	= 4,
16e6dcbf51SDavid du Colombier };
17e6dcbf51SDavid du Colombier 
18e6dcbf51SDavid du Colombier enum{
19e6dcbf51SDavid du Colombier 	Otype,
20e6dcbf51SDavid du Colombier 	Oconn,
21e6dcbf51SDavid du Colombier 	Oseq,
22e6dcbf51SDavid du Colombier 	Olen,
23e6dcbf51SDavid du Colombier };
24e6dcbf51SDavid du Colombier 
25e6dcbf51SDavid du Colombier static Field p_fields[] =
26e6dcbf51SDavid du Colombier {
27e6dcbf51SDavid du Colombier 	{"type",	Fnum,	Otype,		"type",	},
28e6dcbf51SDavid du Colombier 	{"conn",	Fnum,	Oconn,		"conn",	},
29e6dcbf51SDavid du Colombier 	{"seq",		Fnum,	Oseq,		"seq",	},
30e6dcbf51SDavid du Colombier 	{"len",		Fnum,	Olen,		"len",	},
31e6dcbf51SDavid du Colombier 	{0}
32e6dcbf51SDavid du Colombier };
33e6dcbf51SDavid du Colombier 
34e6dcbf51SDavid du Colombier static void
p_compile(Filter * f)35e6dcbf51SDavid du Colombier p_compile(Filter *f)
36e6dcbf51SDavid du Colombier {
37e6dcbf51SDavid du Colombier 	if(f->op == '='){
38e6dcbf51SDavid du Colombier 		compile_cmp(aoe.name, f, p_fields);
39e6dcbf51SDavid du Colombier 		return;
40e6dcbf51SDavid du Colombier 	}
41e6dcbf51SDavid du Colombier 	sysfatal("unknown aoe field: %s", f->s);
42e6dcbf51SDavid du Colombier }
43e6dcbf51SDavid du Colombier 
44e6dcbf51SDavid du Colombier static int
p_filter(Filter * f,Msg * m)45e6dcbf51SDavid du Colombier p_filter(Filter *f, Msg *m)
46e6dcbf51SDavid du Colombier {
47e6dcbf51SDavid du Colombier 	Hdr *h;
48e6dcbf51SDavid du Colombier 
49e6dcbf51SDavid du Colombier 	if(m->pe - m->ps < Hsize)
50e6dcbf51SDavid du Colombier 		return 0;
51e6dcbf51SDavid du Colombier 
52e6dcbf51SDavid du Colombier 	h = (Hdr*)m->ps;
53e6dcbf51SDavid du Colombier 	m->ps += Hsize;
54e6dcbf51SDavid du Colombier 
55e6dcbf51SDavid du Colombier 	switch(f->subop){
56e6dcbf51SDavid du Colombier 	case Otype:
57e6dcbf51SDavid du Colombier 		return h->type == f->ulv;
58e6dcbf51SDavid du Colombier 	case Oconn:
59e6dcbf51SDavid du Colombier 		return h->conn = f->ulv;
60e6dcbf51SDavid du Colombier 	case Oseq:
61e6dcbf51SDavid du Colombier 		return h->seq = f->ulv;
62e6dcbf51SDavid du Colombier 	case Olen:
63e6dcbf51SDavid du Colombier 		return h->len = f->ulv;
64e6dcbf51SDavid du Colombier 	}
65e6dcbf51SDavid du Colombier 	return 0;
66e6dcbf51SDavid du Colombier }
67e6dcbf51SDavid du Colombier 
68e6dcbf51SDavid du Colombier static char* ttab[] = {
69e6dcbf51SDavid du Colombier 	"Tinita",
70e6dcbf51SDavid du Colombier 	"Tinitb",
71e6dcbf51SDavid du Colombier 	"Tinitc",
72e6dcbf51SDavid du Colombier 	"Tdata",
73e6dcbf51SDavid du Colombier 	"Tack",
74e6dcbf51SDavid du Colombier 	"Tdiscover",
75e6dcbf51SDavid du Colombier 	"Toffer",
76e6dcbf51SDavid du Colombier 	"Treset",
77e6dcbf51SDavid du Colombier };
78e6dcbf51SDavid du Colombier 
79e6dcbf51SDavid du Colombier static int
p_seprint(Msg * m)80e6dcbf51SDavid du Colombier p_seprint(Msg *m)
81e6dcbf51SDavid du Colombier {
82*52c84408SDavid du Colombier 	char *s, *p, buf[4];
83e6dcbf51SDavid du Colombier 	Hdr *h;
84e6dcbf51SDavid du Colombier 
85e6dcbf51SDavid du Colombier 	if(m->pe - m->ps < Hsize)
86e6dcbf51SDavid du Colombier 		return 0;
87e6dcbf51SDavid du Colombier 
88e6dcbf51SDavid du Colombier 	h = (Hdr*)m->ps;
89e6dcbf51SDavid du Colombier 	m->ps += Hsize;
90e6dcbf51SDavid du Colombier 
91e6dcbf51SDavid du Colombier 	m->pr = nil;
92e6dcbf51SDavid du Colombier 
93e6dcbf51SDavid du Colombier 	if(h->type < nelem(ttab))
94e6dcbf51SDavid du Colombier 		s = ttab[h->type];
95e6dcbf51SDavid du Colombier 	else{
96e6dcbf51SDavid du Colombier 		snprint(buf, sizeof buf, "%d", h->type);
97e6dcbf51SDavid du Colombier 		s = buf;
98e6dcbf51SDavid du Colombier 	}
99e6dcbf51SDavid du Colombier 
100*52c84408SDavid du Colombier 	p = (char*)m->ps;
101e6dcbf51SDavid du Colombier 	m->p = seprint(m->p, m->e, "type=%s conn=%d seq=%d len=%d %.*s",
102*52c84408SDavid du Colombier 		s, h->conn, h->seq, h->len,
103*52c84408SDavid du Colombier 		(int)utfnlen(p, h->len), p);
104e6dcbf51SDavid du Colombier 	return 0;
105e6dcbf51SDavid du Colombier }
106e6dcbf51SDavid du Colombier 
107e6dcbf51SDavid du Colombier Proto cec =
108e6dcbf51SDavid du Colombier {
109e6dcbf51SDavid du Colombier 	"cec",
110e6dcbf51SDavid du Colombier 	p_compile,
111e6dcbf51SDavid du Colombier 	p_filter,
112e6dcbf51SDavid du Colombier 	p_seprint,
113e6dcbf51SDavid du Colombier 	nil,
114e6dcbf51SDavid du Colombier 	nil,
115e6dcbf51SDavid du Colombier 	p_fields,
116e6dcbf51SDavid du Colombier 	defaultframer,
117e6dcbf51SDavid du Colombier };
118