slhcdump.c
上传用户:hepax88
上传日期:2007-01-03
资源大小:1101k
文件大小:3k
源码类别:

TCP/IP协议栈

开发平台:

Visual C++

  1. #include <stdio.h>
  2. #include "global.h"
  3. #include "mbuf.h"
  4. #include "internet.h"
  5. #include "ip.h"
  6. #include "slhc.h"
  7. #include "trace.h"
  8. static uint16 decodeint(struct mbuf **bpp);
  9. static uint16
  10. decodeint(bpp)
  11. struct mbuf **bpp;
  12. {
  13. uint8 tmpbuf[2];
  14. pullup(bpp,tmpbuf,1);
  15. if (tmpbuf[0] == 0)
  16. pullup(bpp,tmpbuf,2);
  17. else {
  18.   tmpbuf[1] = tmpbuf[0];
  19. tmpbuf[0] = 0;
  20. }
  21. return(get16(tmpbuf));
  22. }
  23. void
  24. vjcomp_dump(fp,bpp,unused)
  25. FILE *fp;
  26. struct mbuf **bpp;
  27. int unused;
  28. {
  29. uint8 changes;
  30. uint8 tmpbuf[2];
  31. if(bpp == NULL || *bpp == NULL)
  32. return;
  33. /* Dump compressed TCP/IP header */
  34. changes = pullchar(bpp);
  35. fprintf(fp,"tchanges: 0x%02x",changes);
  36. if (changes & NEW_C) {
  37. pullup(bpp,tmpbuf,1);
  38. fprintf(fp,"   connection: 0x%02x",tmpbuf[0]);
  39. }
  40. pullup(bpp,tmpbuf,2);
  41. fprintf(fp,"   TCP checksum: 0x%04x",get16(tmpbuf));
  42. if (changes & TCP_PUSH_BIT)
  43. fprintf(fp,"   PUSH");
  44. fprintf(fp,"n");
  45. switch (changes & SPECIALS_MASK) {
  46. case SPECIAL_I:
  47. fprintf(fp,"tdelta ACK and delta SEQ implied by length of datan");
  48. break;
  49. case SPECIAL_D:
  50. fprintf(fp,"tdelta SEQ implied by length of datan");
  51. break;
  52. default:
  53. if (changes & NEW_U) {
  54. fprintf(fp,"tUrgent pointer: 0x%02x",decodeint(bpp));
  55. }
  56. if (changes & NEW_W)
  57. fprintf(fp,"tdelta WINDOW: 0x%02x",decodeint(bpp));
  58. if (changes & NEW_A)
  59. fprintf(fp,"tdelta ACK: 0x%02x",decodeint(bpp));
  60. if (changes & NEW_S)
  61. fprintf(fp,"tdelta SEQ: 0x%02x",decodeint(bpp));
  62. break;
  63. };
  64. if (changes & NEW_I) {
  65. fprintf(fp,"tdelta ID: 0x%02xn",decodeint(bpp));
  66. } else {
  67. fprintf(fp,"tincrement IDn");
  68. }
  69. }
  70. /* dump serial line IP packet; may have Van Jacobson TCP header compression */
  71. void
  72. sl_dump(fp,bpp,unused)
  73. FILE *fp;
  74. struct mbuf **bpp;
  75. int unused;
  76. {
  77. struct mbuf *bp, *tbp;
  78. unsigned char c;
  79. int len;
  80. bp = *bpp;
  81. c = bp->data[0];
  82. if (c & SL_TYPE_COMPRESSED_TCP) {
  83. fprintf(fp,"serial line VJ Compressed TCP: len %3un",
  84. len_p(*bpp));
  85. vjcomp_dump(fp,bpp,0);
  86. } else if ( c >= SL_TYPE_UNCOMPRESSED_TCP ) {
  87. fprintf(fp,"serial line VJ Uncompressed TCP: len %3un",
  88. len = len_p(bp));
  89. /* Get our own copy so we can mess with the data */
  90. if ( (tbp = copy_p(bp, len)) == NULL )
  91. return;
  92. fprintf(fp,"tconnection ID = %dn",
  93. tbp->data[9]); /* FIX THIS! */
  94. /* Restore the bytes used with Uncompressed TCP */
  95. tbp->data[0] &= 0x4f; /* FIX THIS! */
  96. tbp->data[9] = TCP_PTCL; /* FIX THIS! */
  97. /* Dump contents as a regular IP packet */
  98. ip_dump(fp,&tbp,1);
  99. free_p(&tbp);
  100. } else {
  101. fprintf(fp,"serial line IP: len: %3un",len_p(*bpp));
  102. ip_dump(fp,bpp,1);
  103. }
  104. }