1*43751f27SDavid du Colombier #include <u.h>
2*43751f27SDavid du Colombier #include <libc.h>
3*43751f27SDavid du Colombier #include <ip.h>
4*43751f27SDavid du Colombier #include "dat.h"
5*43751f27SDavid du Colombier #include "protos.h"
6*43751f27SDavid du Colombier
7*43751f27SDavid du Colombier typedef struct {
8*43751f27SDavid du Colombier uchar res;
9*43751f27SDavid du Colombier uchar cmd;
10*43751f27SDavid du Colombier uchar ea[6];
11*43751f27SDavid du Colombier } Hdr;
12*43751f27SDavid du Colombier
13*43751f27SDavid du Colombier enum {
14*43751f27SDavid du Colombier Ocmd,
15*43751f27SDavid du Colombier Oea,
16*43751f27SDavid du Colombier
17*43751f27SDavid du Colombier Hsize = 8,
18*43751f27SDavid du Colombier };
19*43751f27SDavid du Colombier
20*43751f27SDavid du Colombier static Field p_fields[] = {
21*43751f27SDavid du Colombier {"cmd", Fnum, Ocmd, "command", },
22*43751f27SDavid du Colombier {"ea", Fnum, Oea, "ethernet addr", },
23*43751f27SDavid du Colombier nil
24*43751f27SDavid du Colombier };
25*43751f27SDavid du Colombier
26*43751f27SDavid du Colombier static void
p_compile(Filter * f)27*43751f27SDavid du Colombier p_compile(Filter *f)
28*43751f27SDavid du Colombier {
29*43751f27SDavid du Colombier if(f->op == '='){
30*43751f27SDavid du Colombier compile_cmp(aoemd.name, f, p_fields);
31*43751f27SDavid du Colombier return;
32*43751f27SDavid du Colombier }
33*43751f27SDavid du Colombier sysfatal("unknown aoemd field: %s", f->s);
34*43751f27SDavid du Colombier }
35*43751f27SDavid du Colombier
36*43751f27SDavid du Colombier static int
p_filter(Filter * f,Msg * m)37*43751f27SDavid du Colombier p_filter(Filter *f, Msg *m)
38*43751f27SDavid du Colombier {
39*43751f27SDavid du Colombier uchar buf[6];
40*43751f27SDavid du Colombier int i;
41*43751f27SDavid du Colombier Hdr *h;
42*43751f27SDavid du Colombier
43*43751f27SDavid du Colombier if(m->pe - m->ps < Hsize)
44*43751f27SDavid du Colombier return 0;
45*43751f27SDavid du Colombier
46*43751f27SDavid du Colombier h = (Hdr*)m->ps;
47*43751f27SDavid du Colombier m->ps += Hsize;
48*43751f27SDavid du Colombier
49*43751f27SDavid du Colombier switch(f->subop){
50*43751f27SDavid du Colombier case Ocmd:
51*43751f27SDavid du Colombier return h->cmd == f->ulv;
52*43751f27SDavid du Colombier case Oea:
53*43751f27SDavid du Colombier for(i = 0; i < 6; i++)
54*43751f27SDavid du Colombier buf[i] = f->ulv >> ((5 - i)*8);
55*43751f27SDavid du Colombier return memcmp(buf, h->ea, 6) == 0;
56*43751f27SDavid du Colombier }
57*43751f27SDavid du Colombier return 0;
58*43751f27SDavid du Colombier }
59*43751f27SDavid du Colombier
60*43751f27SDavid du Colombier static char *ctab[] = {
61*43751f27SDavid du Colombier " ",
62*43751f27SDavid du Colombier " +",
63*43751f27SDavid du Colombier " -",
64*43751f27SDavid du Colombier };
65*43751f27SDavid du Colombier
66*43751f27SDavid du Colombier static int
p_seprint(Msg * m)67*43751f27SDavid du Colombier p_seprint(Msg *m)
68*43751f27SDavid du Colombier {
69*43751f27SDavid du Colombier char *s;
70*43751f27SDavid du Colombier Hdr *h;
71*43751f27SDavid du Colombier
72*43751f27SDavid du Colombier if(m->pe - m->ps < Hsize)
73*43751f27SDavid du Colombier return 0;
74*43751f27SDavid du Colombier
75*43751f27SDavid du Colombier h = (Hdr*)m->ps;
76*43751f27SDavid du Colombier m->ps += Hsize;
77*43751f27SDavid du Colombier
78*43751f27SDavid du Colombier /* no next protocol */
79*43751f27SDavid du Colombier m->pr = nil;
80*43751f27SDavid du Colombier
81*43751f27SDavid du Colombier s = "unk";
82*43751f27SDavid du Colombier if(h->cmd < nelem(ctab))
83*43751f27SDavid du Colombier s = ctab[h->cmd];
84*43751f27SDavid du Colombier m->p = seprint(m->p, m->e, "cmd=%d%s ea=%E\n", h->cmd, s, h->ea);
85*43751f27SDavid du Colombier return 0;
86*43751f27SDavid du Colombier }
87*43751f27SDavid du Colombier
88*43751f27SDavid du Colombier Proto aoemd = {
89*43751f27SDavid du Colombier "aoemd",
90*43751f27SDavid du Colombier p_compile,
91*43751f27SDavid du Colombier p_filter,
92*43751f27SDavid du Colombier p_seprint,
93*43751f27SDavid du Colombier nil,
94*43751f27SDavid du Colombier nil,
95*43751f27SDavid du Colombier p_fields,
96*43751f27SDavid du Colombier defaultframer,
97*43751f27SDavid du Colombier };
98