add new aoe11 commands to snoopy - reserve/release - mask fix bug exchanging "shelf" and "slot" filters. http://www.coraid.com/RESOURCES/AoE-Protocol-Definition Reference: /n/sources/patch/applied/aoe11 Date: Tue Mar 23 17:28:44 CET 2010 Signed-off-by: quanstro@quanstro.net --- /sys/src/cmd/ip/snoopy/mkfile Tue Mar 23 17:25:24 2010 +++ /sys/src/cmd/ip/snoopy/mkfile Tue Mar 23 17:25:23 2010 @@ -5,6 +5,9 @@ aoe\ aoeata\ aoecmd\ + aoemask\ + aoemd\ + aoerr\ arp\ bootp\ cec\ --- /sys/src/cmd/ip/snoopy/aoe.c Tue Mar 23 17:25:30 2010 +++ /sys/src/cmd/ip/snoopy/aoe.c Tue Mar 23 17:25:29 2010 @@ -26,13 +26,15 @@ static Mux p_mux[] = { {"aoeata", 0}, {"aoecmd", 1}, + {"aoemask", 2}, + {"aoerr", 3}, {0}, }; static Field p_fields[] = { - {"slot", Fnum, Ominor, "shelf", }, - {"shelf", Fnum, Omajor, "slot", }, + {"shelf", Fnum, Ominor, "shelf", }, + {"slot", Fnum, Omajor, "slot", }, {"cmd", Fnum, Ocmd, "cmd", }, {0} }; --- /sys/src/cmd/ip/snoopy/aoemd.c Thu Jan 1 00:00:00 1970 +++ /sys/src/cmd/ip/snoopy/aoemd.c Wed Jul 14 21:48:04 2010 @@ -0,0 +1,97 @@ +#include +#include +#include +#include "dat.h" +#include "protos.h" + +typedef struct { + uchar res; + uchar cmd; + uchar ea[6]; +} Hdr; + +enum { + Ocmd, + Oea, + + Hsize = 8, +}; + +static Field p_fields[] = { + {"cmd", Fnum, Ocmd, "command", }, + {"ea", Fnum, Oea, "ethernet addr", }, + nil +}; + +static void +p_compile(Filter *f) +{ + if(f->op == '='){ + compile_cmp(aoemd.name, f, p_fields); + return; + } + sysfatal("unknown aoemd field: %s", f->s); +} + +static int +p_filter(Filter *f, Msg *m) +{ + uchar buf[6]; + int i; + Hdr *h; + + if(m->pe - m->ps < Hsize) + return 0; + + h = (Hdr*)m->ps; + m->ps += Hsize; + + switch(f->subop){ + case Ocmd: + return h->cmd == f->ulv; + case Oea: + for(i = 0; i < 6; i++) + buf[i] = f->ulv >> ((5 - i)*8); + return memcmp(buf, h->ea, 6) == 0; + } + return 0; +} + +static char *ctab[] = { + " ", + " +", + " -", +}; + +static int +p_seprint(Msg *m) +{ + char *s; + Hdr *h; + + if(m->pe - m->ps < Hsize) + return 0; + + h = (Hdr*)m->ps; + m->ps += Hsize; + + /* no next protocol */ + m->pr = nil; + + s = "unk"; + if(h->cmd < nelem(ctab)) + s = ctab[h->cmd]; + m->p = seprint(m->p, m->e, "cmd=%d%s ea=%E\n", h->cmd, s, h->ea); + return 0; +} + +Proto aoemd = { + "aoemd", + p_compile, + p_filter, + p_seprint, + nil, + nil, + p_fields, + defaultframer, +}; --- /sys/src/cmd/ip/snoopy/aoemask.c Thu Jan 1 00:00:00 1970 +++ /sys/src/cmd/ip/snoopy/aoemask.c Wed Jul 14 21:49:27 2010 @@ -0,0 +1,122 @@ +#include +#include +#include +#include "dat.h" +#include "protos.h" + +typedef struct { + uchar res; + uchar cmd; + uchar err; + uchar cnt; +} Hdr; + +enum { + Ocmd, + Oerr, + Ocnt, + + Hsize = 4, +}; + +static Field p_fields[] = +{ + { "cmd", Fnum, Ocmd, "command", }, + { "err", Fnum, Oerr, "error", }, + { "cnt", Fnum, Ocnt, "count", }, + nil +}; + +static Mux p_mux[] = { + { "aoemd", 0 }, + { "aoemd", 1 }, + nil +}; + +static void +p_compile(Filter *f) +{ + Mux *m; + + if(f->op == '='){ + compile_cmp(aoerr.name, f, p_fields); + return; + } + for(m = p_mux; m->name; m++) + if(strcmp(f->s, m->name) == 0){ + f->pr = m->pr; + f->ulv = m->val; + f->subop = Ocmd; + return; + } + sysfatal("unknown aoemask field: %s", f->s); +} + +static int +p_filter(Filter *f, Msg *m) +{ + Hdr *h; + + if(m->pe - m->ps < Hsize) + return 0; + + h = (Hdr*)m->ps; + m->ps += Hsize; + + switch(f->subop){ + case Ocmd: + return h->cmd == f->ulv; + case Oerr: + return h->err == f->ulv; + case Ocnt: + return h->cnt == f->ulv; + } + return 0; +} + +static char *ctab[] = { + "read", + "edit", +}; + +static char *etab[] = { + "", + "bad", + "full", +}; + +static int +p_seprint(Msg *m) +{ + char *s, *t; + Hdr *h; + + if(m->pe - m->ps < Hsize) + return 0; + + h = (Hdr*)m->ps; + m->ps += Hsize; + + demux(p_mux, h->cmd, h->cmd, m, &dump); + + s = "unk"; + if(h->cmd < nelem(ctab)) + s = ctab[h->cmd]; + t = "unk"; + if(h->err < nelem(etab)) + s = etab[h->err]; + m->p = seprint(m->p, m->e, "cmd=%d %s err=%d %s cnt=%d\n", + h->cmd, s, h->err, t, h->cnt); + return 0; +} + +Proto aoemask = { + "aoemask", + p_compile, + p_filter, + p_seprint, + p_mux, + "%lud", + p_fields, + defaultframer, +}; --- /sys/src/cmd/ip/snoopy/aoerr.c Thu Jan 1 00:00:00 1970 +++ /sys/src/cmd/ip/snoopy/aoerr.c Wed Jul 14 21:46:44 2010 @@ -0,0 +1,120 @@ +#include +#include +#include +#include "dat.h" +#include "protos.h" + +typedef struct { + uchar cmd; + uchar nea; +} Hdr; + +enum { + Ocmd, + Onea, + Oea, + + Hsize = 2, +}; + +static Field p_fields[] = { + {"cmd", Fnum, Ocmd, "command", }, + {"nea", Fnum, Onea, "ea count", }, + {"ea", Fnum, Onea, "ethernet addr", }, + nil +}; + +static void +p_compile(Filter *f) +{ + if(f->op == '='){ + compile_cmp(aoerr.name, f, p_fields); + return; + } + sysfatal("unknown aoerr field: %s", f->s); +} + +static int +p_filter(Filter *f, Msg *m) +{ + uchar buf[6]; + int i; + Hdr *h; + + if(m->pe - m->ps < Hsize) + return 0; + + h = (Hdr*)m->ps; + m->ps += Hsize; + + switch(f->subop){ + case Ocmd: + return h->cmd == f->ulv; + case Onea: + return h->nea == f->ulv; + case Oea: + if(m->pe - m->ps < 6*h->nea) + return 0; + for(i = 0; i < 6; i++) + buf[i] = f->ulv >> ((5 - i)*8); + for(i = 0; i < h->nea; i++) + if(memcmp(m->ps + 6*i, buf, 6) == 0) + return 1; + return 0; + } + return 0; +} + +static char *ctab[] = { + "read", + "write", + "force", +}; + +static int +p_seprint(Msg *m) +{ + char *s; + int i; + Hdr *h; + + if(m->pe - m->ps < Hsize) + return 0; + + h = (Hdr*)m->ps; + m->ps += Hsize; + + /* no next protocol */ + m->pr = nil; + + s = "unk"; + if(h->cmd < nelem(ctab)) + s = ctab[h->cmd]; + m->p = seprint(m->p, m->e, "cmd=%d %s nea=%d", h->cmd, s, h->nea); + for(i = 0;; i++){ + if(h->nea < i) + break; + if(i == 3){ + m->p = seprint(m->p, m->e, " ..."); + break; + } + if(m->pe - m->ps < 6*i){ + m->p = seprint(m->p, m->e, " *short*"); + break; + } + m->p = seprint(m->p, m->e, " %E", m->pe + 6*i); + } + m->p = seprint(m->p, m->e, "\n"); + return 0; +} + +Proto aoerr = { + "aoerr", + p_compile, + p_filter, + p_seprint, + nil, + nil, + p_fields, + defaultframer, +};