1 #include <u.h> 2 #include <libc.h> 3 #include <ip.h> 4 #include "dat.h" 5 #include "protos.h" 6 7 typedef struct{ 8 uchar verflags; 9 uchar error; 10 uchar major[2]; 11 uchar minor; 12 uchar cmd; 13 uchar tag[4]; 14 }Hdr; 15 16 enum{ 17 Hsize = 10, 18 }; 19 20 enum{ 21 Omajor, 22 Ominor, 23 Ocmd, 24 }; 25 26 static Mux p_mux[] = { 27 {"aoeata", 0}, 28 {"aoecmd", 1}, 29 {0}, 30 }; 31 32 static Field p_fields[] = 33 { 34 {"slot", Fnum, Ominor, "shelf", }, 35 {"shelf", Fnum, Omajor, "slot", }, 36 {"cmd", Fnum, Ocmd, "cmd", }, 37 {0} 38 }; 39 40 static void 41 p_compile(Filter *f) 42 { 43 if(f->op == '='){ 44 compile_cmp(aoe.name, f, p_fields); 45 return; 46 } 47 sysfatal("unknown aoe field: %s", f->s); 48 } 49 50 static int 51 p_filter(Filter *f, Msg *m) 52 { 53 Hdr *h; 54 55 if(m->pe - m->ps < Hsize) 56 return 0; 57 58 h = (Hdr*)m->ps; 59 m->ps += Hsize; 60 61 switch(f->subop){ 62 case Omajor: 63 return NetS(h->major) == f->ulv; 64 case Ominor: 65 return h->minor == f->ulv; 66 case Ocmd: 67 return h->cmd == f->ulv; 68 } 69 return 0; 70 } 71 72 static int 73 p_seprint(Msg *m) 74 { 75 Hdr *h; 76 77 if(m->pe - m->ps < Hsize) 78 return 0; 79 80 h = (Hdr*)m->ps; 81 m->ps += Hsize; 82 83 demux(p_mux, h->cmd, h->cmd, m, &dump); 84 85 m->p = seprint(m->p, m->e, "ver=%d flag=%4b err=%d %d.%d cmd=%ux tag=%ux", 86 h->verflags >> 4, h->verflags & 0xf, h->error, NetS(h->major), 87 h->minor, h->cmd, NetL(h->tag)); 88 return 0; 89 } 90 91 Proto aoe = 92 { 93 "aoe", 94 p_compile, 95 p_filter, 96 p_seprint, 97 p_mux, 98 nil, 99 p_fields, 100 defaultframer, 101 }; 102