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