tcpShow.c
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:8k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* tcpShow.c - TCP information display routines */
  2. /* Copyright 1984 - 2001 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01g,10may02,kbw  making man page edits
  8. 01f,15oct01,rae  merge from truestack ver 01h, base 01d (VIRTUAL_STACK)
  9. 01e,14nov00,ham  fixed unnecessary dependency against tcp_debug(SPR 62272).
  10. 01d,14dec97,jdi  doc: cleanup.
  11. 01c,04aug97,kwb  fixed man page problems found in beta review
  12. 01b,20arp97,kwb  fixed man page format, spell check.
  13. 01a,08mar97,vin  written.
  14. */
  15. /*
  16. DESCRIPTION
  17. This library provides routines to show TCP related
  18. statistics.
  19. Interpreting these statistics requires detailed knowledge of Internet
  20. network protocols.  Information on these protocols can be found in
  21. the following books:
  22. .iP
  23. .I "TCP/IP Illustrated Volume II, The Implementation,"
  24. by Richard Stevens
  25. .iP
  26. .I "The Design and Implementation of the 4.4 BSD UNIX Operating System,"
  27. by Leffler, McKusick, Karels and Quarterman
  28. .LP
  29. The tcpShowInit() routine links the TCP show facility into the VxWorks
  30. system.  This is performed automatically if INCLUDE_TCP_SHOW is defined.
  31. SEE ALSO: netLib, netShow
  32. */
  33. #include "vxWorks.h"
  34. #include "sys/types.h"
  35. #include "netinet/in.h"
  36. #include "netinet/in_systm.h"
  37. #include "netinet/ip.h"
  38. #include "netinet/ip_var.h"
  39. #include "netinet/in_pcb.h"
  40. #include "netinet/tcp.h"
  41. #include "netinet/tcp_debug.h"
  42. #include "netinet/tcp_fsm.h"
  43. #include "netinet/tcp_timer.h"
  44. #include "netinet/tcp_var.h"
  45. #include "errno.h"
  46. #include "string.h"
  47. #include "stdio.h"
  48. #define plural(num) ((num) > 1 ? "s": "")
  49. #ifdef VIRTUAL_STACK
  50. #include "netinet/vsLib.h"
  51. #else
  52. /* externs */
  53. IMPORT struct inpcbhead tcpcb; /* defined in tcp_input.c */
  54. IMPORT struct inpcbhead *  _pTcpPcbHead; /* defined in netShow.c */
  55. #endif /* VIRTUAL_STACK */
  56. /*
  57.  * The available TCP states and the function pointer to the protocol-specific
  58.  * print routine are common across all virtual stacks.
  59.  */
  60. IMPORT VOIDFUNCPTR _pTcpPcbPrint; /* defined in netShow.c */
  61. /* forward declarations */
  62. LOCAL void _tcpPcbPrint (struct inpcb * pInPcb);
  63. /******************************************************************************
  64. *
  65. * tcpShowInit - initialize TCP show routines
  66. *
  67. * This routine links the TCP show facility into the VxWorks system.
  68. * These routines are included automatically if INCLUDE_TCP_SHOW is defined.
  69. *
  70. * RETURNS: N/A
  71. */
  72. void tcpShowInit (void)
  73.     {
  74. #ifdef VIRTUAL_STACK
  75.     /* 
  76.      * To avoid introducing a conflict with the "tcpcb" structure tag,
  77.      * virtual stacks do not alias the head of the pcb list.
  78.      */
  79.     _pTcpPcbHead = &tcb;
  80. #else
  81.     _pTcpPcbHead = &tcpcb;  /* initialize the pcb for generic show rtns */
  82. #endif
  83.     /*
  84.      * Assigning the (shared) print routine for each virtual stack is
  85.      * redundant, but unavoidable since it must be setup the first time.
  86.      */
  87.     _pTcpPcbPrint = _tcpPcbPrint; /* initialize tcp specific print rtn */
  88.     }
  89. /*******************************************************************************
  90. *
  91. * _tcpPcbPrint - print TCP protocol control block info
  92. *
  93. * Prints TCP protocol control block information.
  94. *
  95. * RETURNS: N/A.
  96. *
  97. * NOMANUAL
  98. */
  99. LOCAL void _tcpPcbPrint
  100.     (
  101.     struct inpcb * pInPcb /* pointer to the protocol control block */
  102.     )
  103.     {
  104.     struct tcpcb * pTcpCb; /* pointer to tcp Control block */
  105.     pTcpCb = (struct tcpcb *) pInPcb->inp_ppcb;
  106.     if (pTcpCb->t_state < 0 || pTcpCb->t_state >= TCP_NSTATES)
  107.         printf(" %d", pTcpCb->t_state);
  108.     else if (pTcpstates != NULL && pTcpstates[pTcpCb->t_state] != NULL)
  109.         printf(" %s", pTcpstates[pTcpCb->t_state]);
  110.     }
  111. /*****************************************************************************
  112. *
  113. * tcpDebugShow - display debugging information for the TCP protocol
  114. *
  115. * This routine displays debugging information for the TCP protocol.
  116. * To include TCP debugging facilities, define INCLUDE_TCP_DEBUG when
  117. * building the system image.  To enable information gathering, turn on
  118. * the SO_DEBUG option for the relevant socket(s).
  119. *
  120. * RETURNS: N/A
  121. */
  122. void tcpDebugShow
  123.     (
  124.     int numPrint, /* no. of entries to print, default (0) = 20 */
  125.     int verbose /* 1 = verbose */
  126.     )
  127.     {
  128.     if (numPrint <=0)
  129. numPrint = TCP_DEBUG_NUM_DEFAULT;
  130.     (*tcpReportRtn) (numPrint, verbose);
  131.     }
  132. /*****************************************************************************
  133. *
  134. * tcpstatShow - display all statistics for the TCP protocol
  135. *
  136. * This routine displays detailed statistics for the TCP protocol.
  137. *
  138. * RETURNS: N/A
  139. */
  140. void tcpstatShow (void)
  141.     {
  142.     /*
  143.      * I know it's ugly to use these macros in the following way but this is
  144.      * the way Unix 'netstat' is written and I'd like to keep this part
  145.      * look similar to that of Unix 'netstat'.
  146.      */
  147. #define p(f, m) printf(m, (int)tcpstat.f, plural(tcpstat.f))
  148. #define p2(f1, f2, m) printf(m, (int)tcpstat.f1, plural(tcpstat.f1), 
  149. (int)tcpstat.f2, plural(tcpstat.f2))
  150. #ifdef VIRTUAL_STACK
  151.     printf ("TCP: (stack number %d)n", myStackNum);
  152. #else
  153.     printf ("TCP:n");
  154. #endif /* VIRTUAL_STACK */
  155.     p (tcps_sndtotal, "t%d packet%s sentn");
  156.     p2 (tcps_sndpack,tcps_sndbyte,
  157.        "tt%d data packet%s (%d byte%s)n");
  158.     p2 (tcps_sndrexmitpack, tcps_sndrexmitbyte,
  159.        "tt%d data packet%s (%d byte%s) retransmittedn");
  160.     printf ("tt%d ack-only packet%s (%d delayed)n",
  161.             (int)tcpstat.tcps_sndacks,
  162.             plural ((int)tcpstat.tcps_sndacks), (int)tcpstat.tcps_delack);
  163.     p (tcps_sndurg, "tt%d URG only packet%sn");
  164.     p (tcps_sndprobe, "tt%d window probe packet%sn");
  165.     p (tcps_sndwinup, "tt%d window update packet%sn");
  166.     p (tcps_sndctrl, "tt%d control packet%sn");
  167.     p (tcps_rcvtotal, "t%d packet%s receivedn");
  168.     p2 (tcps_rcvackpack, tcps_rcvackbyte, "tt%d ack%s (for %d byte%s)n");
  169.     p (tcps_rcvdupack, "tt%d duplicate ack%sn");
  170.     p (tcps_rcvacktoomuch, "tt%d ack%s for unsent datan");
  171.     p2 (tcps_rcvpack, tcps_rcvbyte,
  172.        "tt%d packet%s (%d byte%s) received in-sequencen");
  173.     p2 (tcps_rcvduppack, tcps_rcvdupbyte,
  174.        "tt%d completely duplicate packet%s (%d byte%s)n");
  175.     p2 (tcps_rcvpartduppack, tcps_rcvpartdupbyte,
  176.        "tt%d packet%s with some dup. data (%d byte%s duped)n");
  177.     p2 (tcps_rcvoopack, tcps_rcvoobyte,
  178.        "tt%d out-of-order packet%s (%d byte%s)n");
  179.     p2 (tcps_rcvpackafterwin, tcps_rcvbyteafterwin,
  180.        "tt%d packet%s (%d byte%s) of data after windown");
  181.     p (tcps_rcvwinprobe, "tt%d window probe%sn");
  182.     p (tcps_rcvwinupd, "tt%d window update packet%sn");
  183.     p (tcps_rcvafterclose, "tt%d packet%s received after closen");
  184.     p (tcps_rcvbadsum, "tt%d discarded for bad checksum%sn");
  185.     p (tcps_rcvbadoff, "tt%d discarded for bad header offset field%sn");
  186.     printf ("tt%d discarded because packet too shortn",
  187.         (int)tcpstat.tcps_rcvshort);
  188.     p (tcps_connattempt, "t%d connection request%sn");
  189.     p (tcps_accepts, "t%d connection accept%sn");
  190.     p (tcps_connects, "t%d connection%s established (including accepts)n");
  191.     p2 (tcps_closed, tcps_drops,
  192.        "t%d connection%s closed (including %d drop%s)n");
  193.     p (tcps_conndrops, "t%d embryonic connection%s droppedn");
  194.     p2 (tcps_rttupdated, tcps_segstimed,
  195.        "t%d segment%s updated rtt (of %d attempt%s)n");
  196.     p (tcps_rexmttimeo, "t%d retransmit timeout%sn");
  197.     p (tcps_timeoutdrop, "tt%d connection%s dropped by rexmit timeoutn");
  198.     p (tcps_persisttimeo, "t%d persist timeout%sn");
  199.     p (tcps_keeptimeo, "t%d keepalive timeout%sn");
  200.     p (tcps_keepprobe, "tt%d keepalive probe%s sentn");
  201.     p (tcps_keepdrops, "tt%d connection%s dropped by keepaliven");
  202.     p (tcps_pcbcachemiss, "t%d pcb cache lookup%s failedn");
  203. #undef p
  204. #undef p2
  205.     }