aoe.c 1.5 KB

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