nbdgramconv.c 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <ip.h>
  4. #include <thread.h>
  5. #include "netbios.h"
  6. int
  7. nbdgramconvM2S(NbDgram *s, uchar *ap, uchar *ep)
  8. {
  9. uchar *p = ap;
  10. int n;
  11. ushort length;
  12. if (ap + 6 + IPv4addrlen > ep)
  13. return 0;
  14. s->type = *p++;
  15. s->flags = *p++;
  16. s->id = nhgets(p); p+= 2;
  17. v4tov6(s->srcip, p); p+= IPv4addrlen;
  18. s->srcport = nhgets(p); p += 2;
  19. switch (s->type) {
  20. case NbDgramDirectUnique:
  21. case NbDgramDirectGroup:
  22. case NbDgramBroadcast:
  23. if (p + 4 > ep)
  24. return 0;
  25. length = nhgets(p); p += 2;
  26. s->datagram.offset = nhgets(p); p += 2;
  27. if (p + length > ep)
  28. return 0;
  29. ep = p + length;
  30. n = nbnamedecode(p, p, ep, s->datagram.srcname);
  31. if (n == 0)
  32. return 0;
  33. p += n;
  34. n = nbnamedecode(p, p, ep, s->datagram.dstname);
  35. if (n == 0)
  36. return 0;
  37. p += n;
  38. s->datagram.data = p;
  39. s->datagram.length = ep - p;
  40. p = ep;
  41. break;
  42. case NbDgramError:
  43. if (p + 1 > ep)
  44. return 0;
  45. s->error.code = *p++;
  46. break;
  47. case NbDgramQueryRequest:
  48. case NbDgramPositiveQueryResponse:
  49. case NbDgramNegativeQueryResponse:
  50. n = nbnamedecode(p, p, ep, s->query.dstname);
  51. if (n == 0)
  52. return 0;
  53. p += n;
  54. break;
  55. default:
  56. return 0;
  57. }
  58. return p - ap;
  59. }
  60. int
  61. nbdgramconvS2M(uchar *ap, uchar *ep, NbDgram *s)
  62. {
  63. uchar *p = ap;
  64. uchar *fixup;
  65. int n;
  66. if (p + 6 + IPv4addrlen > ep)
  67. return 0;
  68. *p++ = s->type;
  69. *p++ = s->flags;
  70. hnputs(p, s->id); p+= 2;
  71. v6tov4(p, s->srcip); p += IPv4addrlen;
  72. hnputs(p, s->srcport); p+= 2;
  73. switch (s->type) {
  74. case NbDgramDirectUnique:
  75. case NbDgramDirectGroup:
  76. case NbDgramBroadcast:
  77. if (p + 4 > ep)
  78. return 0;
  79. fixup = p;
  80. hnputs(p, s->datagram.length); p += 2;
  81. hnputs(p, s->datagram.offset); p += 2;
  82. n = nbnameencode(p, ep, s->datagram.srcname);
  83. if (n == 0)
  84. return 0;
  85. p += n;
  86. n = nbnameencode(p, ep, s->datagram.dstname);
  87. if (n == 0)
  88. return 0;
  89. p += n;
  90. if (p + s->datagram.length > ep)
  91. return 0;
  92. memcpy(p, s->datagram.data, s->datagram.length); p += s->datagram.length;
  93. hnputs(fixup, p - fixup - 4);
  94. break;
  95. case NbDgramError:
  96. if (p + 1 > ep)
  97. return 0;
  98. *p++ = s->error.code;
  99. break;
  100. case NbDgramQueryRequest:
  101. case NbDgramPositiveQueryResponse:
  102. case NbDgramNegativeQueryResponse:
  103. n = nbnameencode(p, ep, s->datagram.dstname);
  104. if (n == 0)
  105. return 0;
  106. p += n;
  107. break;
  108. default:
  109. return 0;
  110. }
  111. return p - ap;
  112. }