#include #include #include #include "dat.h" #include "protos.h" typedef struct{ uchar verflags; uchar error; uchar major[2]; uchar minor; uchar cmd; uchar tag[4]; }Hdr; enum{ Hsize = 10, }; enum{ Omajor, Ominor, Ocmd, }; static Mux p_mux[] = { {"aoeata", 0}, {"aoecmd", 1}, {0}, }; static Field p_fields[] = { {"slot", Fnum, Ominor, "shelf", }, {"shelf", Fnum, Omajor, "slot", }, {"cmd", Fnum, Ocmd, "cmd", }, {0} }; static void p_compile(Filter *f) { if(f->op == '='){ compile_cmp(aoe.name, f, p_fields); return; } sysfatal("unknown aoe 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 Omajor: return NetS(h->major) == f->ulv; case Ominor: return h->minor == f->ulv; case Ocmd: return h->cmd == f->ulv; } return 0; } static int p_seprint(Msg *m) { 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); m->p = seprint(m->p, m->e, "ver=%d flag=%4b err=%d %d.%d cmd=%ux tag=%ux", h->verflags>>4, h->verflags&0xf, h->error, NetS(h->major), h->minor, h->cmd, NetL(h->tag)); return 0; } Proto aoe = { "aoe", p_compile, p_filter, p_seprint, p_mux, nil, p_fields, defaultframer, };