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

TCP/IP协议栈

开发平台:

Visual C++

  1. /* TCP header tracing routines
  2.  * Copyright 1991 Phil Karn, KA9Q
  3.  */
  4. #include <stdio.h>
  5. #include "global.h"
  6. #include "mbuf.h"
  7. #include "netuser.h"
  8. #include "internet.h"
  9. #include "tcp.h"
  10. #include "ip.h"
  11. #include "trace.h"
  12. /* TCP segment header flags */
  13. static char *Tcpflags[] = {
  14. "FIN", /* 0x01 */
  15. "SYN", /* 0x02 */
  16. "RST", /* 0x04 */
  17. "PSH", /* 0x08 */
  18. "ACK", /* 0x10 */
  19. "URG", /* 0x20 */
  20. "CE" /* 0x40 */
  21. };
  22. /* Dump a TCP segment header. Assumed to be in network byte order */
  23. void
  24. tcp_dump(fp,bpp,source,dest,check)
  25. FILE *fp;
  26. struct mbuf **bpp;
  27. int32 source,dest; /* IP source and dest addresses */
  28. int check; /* 0 if checksum test is to be bypassed */
  29. {
  30. struct tcp seg;
  31. struct pseudo_header ph;
  32. uint16 csum;
  33. uint16 dlen;
  34. if(bpp == NULL || *bpp == NULL)
  35. return;
  36. /* Verify checksum */
  37. ph.source = source;
  38. ph.dest = dest;
  39. ph.protocol = TCP_PTCL;
  40. ph.length = len_p(*bpp);
  41. csum = cksum(&ph,*bpp,ph.length);
  42. ntohtcp(&seg,bpp);
  43. fprintf(fp,"TCP: %u->%u Seq x%lx",seg.source,seg.dest,seg.seq,seg.ack);
  44. if(seg.flags.ack)
  45. fprintf(fp," Ack x%lx",seg.ack);
  46. if(seg.flags.congest)
  47. fprintf(fp," %s",Tcpflags[6]);
  48. if(seg.flags.urg)
  49. fprintf(fp," %s",Tcpflags[5]);
  50. if(seg.flags.ack)
  51. fprintf(fp," %s",Tcpflags[4]);
  52. if(seg.flags.psh)
  53. fprintf(fp," %s",Tcpflags[3]);
  54. if(seg.flags.rst)
  55. fprintf(fp," %s",Tcpflags[2]);
  56. if(seg.flags.syn)
  57. fprintf(fp," %s",Tcpflags[1]);
  58. if(seg.flags.fin)
  59. fprintf(fp," %s",Tcpflags[0]);
  60. fprintf(fp," Wnd %u",seg.wnd);
  61. if(seg.flags.urg)
  62. fprintf(fp," UP x%x",seg.up);
  63. /* Print options, if any */
  64. if(seg.flags.mss)
  65. fprintf(fp," MSS %u",seg.mss);
  66. if(seg.flags.wscale)
  67. fprintf(fp," WSCALE %u",seg.wsopt);
  68. if(seg.flags.tstamp)
  69. fprintf(fp," TSTAMP %lu TSECHO %lu",seg.tsval,seg.tsecr);
  70. if((dlen = len_p(*bpp)) != 0)
  71. fprintf(fp," Data %u",dlen);
  72. if(check && csum != 0)
  73. fprintf(fp," CHECKSUM ERROR (%u)",csum);
  74. putc('n',fp);
  75. }