ttls.c 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <ip.h>
  4. #include "dat.h"
  5. #include "protos.h"
  6. typedef struct Hdr Hdr;
  7. struct Hdr
  8. {
  9. uchar flags;
  10. uchar ln[4]; /* optional, present if L flag set*/
  11. };
  12. enum
  13. {
  14. FLHDR= 1, /* sizeof(flags) */
  15. LNHDR= 4, /* sizeof(ln) */
  16. };
  17. enum
  18. {
  19. FlagL = 1<<7,
  20. FlagM = 1<<6,
  21. FlagS = 1<<5,
  22. Version = (1<<2)|(1<<1)|(1<<0),
  23. };
  24. static Mux p_mux[] =
  25. {
  26. { "dump", 0, },
  27. { 0 }
  28. };
  29. static char*
  30. flags(int f)
  31. {
  32. static char fl[20];
  33. char *p;
  34. p = fl;
  35. if(f & FlagS)
  36. *p++ = 'S';
  37. if(f & FlagM)
  38. *p++ = 'M';
  39. if(f & FlagL)
  40. *p++ = 'L';
  41. *p = 0;
  42. return fl;
  43. }
  44. static int
  45. p_seprint(Msg *m)
  46. {
  47. Hdr *h;
  48. if(m->pe - m->ps < FLHDR)
  49. return -1;
  50. h = (Hdr*)m->ps;
  51. m->ps += FLHDR;
  52. if (h->flags & FlagL) {
  53. if(m->pe - m->ps < LNHDR)
  54. return -1;
  55. else
  56. m->ps += LNHDR;
  57. }
  58. /* next protocol depending on type*/
  59. demux(p_mux, 0, 0, m, &dump);
  60. m->p = seprint(m->p, m->e, "ver=%1d", h->flags & Version);
  61. m->p = seprint(m->p, m->e, " fl=%s", flags(h->flags));
  62. if (h->flags & FlagL)
  63. m->p = seprint(m->p, m->e, " totallen=%1d", NetL(h->ln));
  64. /* these are not in the header, just print them for our convenience */
  65. m->p = seprint(m->p, m->e, " dataln=%1ld", m->pe - m->ps);
  66. if ((h->flags & (FlagL|FlagS|FlagM)) == 0 && m->ps == m->pe)
  67. m->p = seprint(m->p, m->e, " ack");
  68. return 0;
  69. }
  70. Proto ttls =
  71. {
  72. "ttls",
  73. nil,
  74. nil,
  75. p_seprint,
  76. p_mux, /* we need this to get the dump printed */
  77. "%lud",
  78. nil,
  79. defaultframer,
  80. };