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

VxWorks

开发平台:

C/C++

  1. /* icmpShow.c - ICMP Information display routines */
  2. /* Copyright 1984 - 2001 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01f,10may02,kbw  making man page edits
  8. 01e,15oct01,rae  merge from truestack ver 01g, base o1c (VIRTUAL_STACK)
  9. 01d,07feb01,spm  added internal documentation for parallel host shell routines
  10. 01c,31jul97,kbw  fixed man page problems found in beta review
  11. 01b,20apr97,kbw  fixed man page format, spell check.
  12. 01a,08mar97,vin  written.
  13. */
  14. /*
  15. DESCRIPTION
  16. This library provides routines to show ICMP related
  17. statistics.
  18. Interpreting these statistics requires detailed knowledge of Internet
  19. network protocols.  Information on these protocols can be found in
  20. the following books:
  21. .iP  
  22. .I "TCP/IP Illustrated Volume II, The Implementation,"
  23. by Richard Stevens
  24. .iP 
  25. .I "The Design and Implementation of the 4.4 BSD UNIX Operating System,"
  26. by Leffler, McKusick, Karels and Quarterman
  27. .LP
  28. The icmpShowInit() routine links the ICMP show facility into the VxWorks
  29. system.  This is performed automatically if INCLUDE_NET_SHOW is defined.
  30. INTERNAL
  31. The icmpstatShow routine in this module is actually preempted by a
  32. parallel version built in to the Tornado shell source code in the
  33. $WIND_BASE/host/src/windsh directory. Changes to this routine must
  34. be duplicated within that shell to maintain consistent output. The
  35. version in this module can still be accessed by prepending an "@" sign
  36. to the routine name (i.e. @icmpstatShow).
  37. SEE ALSO: netLib, netShow
  38. */
  39. #include "vxWorks.h"
  40. #include "sys/types.h"
  41. #include "netinet/in.h"
  42. #include "netinet/in_systm.h"
  43. #include "netinet/ip.h"
  44. #include "netinet/ip_var.h"
  45. #include "netinet/ip_icmp.h"
  46. #include "netinet/icmp_var.h"
  47. #include "errno.h"
  48. #include "string.h"
  49. #include "stdio.h"
  50. #ifdef VIRTUAL_STACK
  51. #include "netinet/vsLib.h"
  52. #endif /* VIRTUAL_STACK */
  53. #define plural(num) ((num) > 1 ? "s": "")
  54. /******************************************************************************
  55. *
  56. * icmpShowInit - initialize ICMP show routines
  57. *
  58. * This routine links the ICMP show facility into the VxWorks system.
  59. * These routines are included automatically if INCLUDE_NET_SHOW
  60. * and INCLUDE_ICMP are defined.
  61. *
  62. * RETURNS: N/A
  63. */
  64. void icmpShowInit (void)
  65.     {
  66.     
  67.     }
  68. /*******************************************************************************
  69. *
  70. * icmpstatShow - display statistics for ICMP
  71. *
  72. * This routine displays statistics for the ICMP 
  73. * (Internet Control Message Protocol) protocol.
  74. *
  75. * RETURNS: N/A
  76. *
  77. * INTERNAL
  78. * When using the Tornado shell, this routine is only available if an
  79. * "@" sign is prepended to the routine name. Otherwise, it is preempted
  80. * by a built-in version.
  81. */
  82. void icmpstatShow (void)
  83.     {
  84.     static char *icmpNames[] =
  85.     {
  86. "echo reply",
  87. "#1",
  88. "#2",
  89. "destination unreachable",
  90. "source quench",
  91. "routing redirect",
  92. "#6",
  93. "#7",
  94. "echo",
  95. "#9",
  96. "#10",
  97. "time exceeded",
  98. "parameter problem",
  99. "time stamp",
  100. "time stamp reply",
  101. "information request",
  102. "information request reply",
  103. "address mask request",
  104. "address mask reply",
  105.     };
  106.     FAST int ix;
  107.     FAST int first;
  108. #ifdef VIRTUAL_STACK
  109.     printf("ICMP: (stack number %d)nt%u call%s to icmp_errorn", myStackNum,
  110.    (int)_icmpstat.icps_error, plural(_icmpstat.icps_error));
  111. #else
  112.     printf("ICMP:nt%u call%s to icmp_errorn",
  113.    (int)icmpstat.icps_error, plural(icmpstat.icps_error));
  114. #endif /* VIRTUAL_STACK */
  115.     printf("t%u error%s not generated because old message was icmpn",
  116. #ifdef VIRTUAL_STACK
  117.    (int)_icmpstat.icps_oldicmp, plural(_icmpstat.icps_oldicmp));
  118. #else
  119.    (int)icmpstat.icps_oldicmp, plural(icmpstat.icps_oldicmp));
  120. #endif /* VIRTUAL_STACK */
  121.     for (first = 1, ix = 0; ix < ICMP_MAXTYPE + 1; ix++)
  122. {
  123. #ifdef VIRTUAL_STACK
  124. if (_icmpstat.icps_outhist [ix] != 0)
  125. #else
  126. if (icmpstat.icps_outhist [ix] != 0)
  127. #endif /* VIRTUAL_STACK */
  128.     {
  129.     if (first)
  130. {
  131. printf("tOutput histogram:n");
  132. first = 0;
  133. }
  134.     printf("tt%s: %un", icmpNames [ix],
  135. #ifdef VIRTUAL_STACK
  136.    (int)_icmpstat.icps_outhist [ix]);
  137. #else
  138.    (int)icmpstat.icps_outhist [ix]);
  139. #endif /* VIRTUAL_STACK */
  140.     }
  141. }
  142.     printf("t%u message%s with bad code fieldsn",
  143. #ifdef VIRTUAL_STACK
  144.    (int)_icmpstat.icps_badcode, plural(_icmpstat.icps_badcode));
  145. #else
  146.    (int)icmpstat.icps_badcode, plural(icmpstat.icps_badcode));
  147. #endif /* VIRTUAL_STACK */
  148.     printf("t%u message%s < minimum lengthn",
  149. #ifdef VIRTUAL_STACK
  150.    (int)_icmpstat.icps_tooshort, plural(_icmpstat.icps_tooshort));
  151. #else
  152.    (int)icmpstat.icps_tooshort, plural(icmpstat.icps_tooshort));
  153. #endif /* VIRTUAL_STACK */
  154.     printf("t%u bad checksum%sn",
  155. #ifdef VIRTUAL_STACK
  156.    (int)_icmpstat.icps_checksum, plural(_icmpstat.icps_checksum));
  157. #else
  158.    (int)icmpstat.icps_checksum, plural(icmpstat.icps_checksum));
  159. #endif /* VIRTUAL_STACK */
  160.     printf("t%u message%s with bad lengthn",
  161. #ifdef VIRTUAL_STACK
  162.    (int)_icmpstat.icps_badlen, plural(_icmpstat.icps_badlen));
  163. #else
  164.    (int)icmpstat.icps_badlen, plural(icmpstat.icps_badlen));
  165. #endif /* VIRTUAL_STACK */
  166.     for (first = 1, ix = 0; ix < ICMP_MAXTYPE + 1; ix++)
  167. {
  168. #ifdef VIRTUAL_STACK
  169. if (_icmpstat.icps_inhist [ix] != 0)
  170. #else
  171. if (icmpstat.icps_inhist [ix] != 0)
  172. #endif /* VIRTUAL_STACK */
  173.     {
  174.     if (first)
  175. {
  176. printf("tInput histogram:n");
  177. first = 0;
  178. }
  179.     printf("tt%s: %un", icmpNames [ix],
  180. #ifdef VIRTUAL_STACK
  181.    (int)_icmpstat.icps_inhist [ix]);
  182. #else
  183.    (int)icmpstat.icps_inhist [ix]);
  184. #endif /* VIRTUAL_STACK */
  185.     }
  186. }
  187.     printf("t%u message response%s generatedn",
  188. #ifdef VIRTUAL_STACK
  189.    (int)_icmpstat.icps_reflect, plural(_icmpstat.icps_reflect));
  190. #else
  191.    (int)icmpstat.icps_reflect, plural(icmpstat.icps_reflect));
  192. #endif /* VIRTUAL_STACK */
  193.     }