smNetShow.c
上传用户:luoyougen
上传日期:2008-05-12
资源大小:23136k
文件大小:6k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* smNetShow.c - shared memory network driver show routines */
  2. /* Copyright 1984-2002 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01e,24oct01,mas  doc update (SPR 71149)
  7. 01d,02oct01,mas  fixed warnings, added new SM_INT types (SPR 4547 guise)
  8. 01c,16sep92,jmm  cleaned up some warnings
  9. 01b,21nov92,jdi  documentation cleanup.
  10. 01a,25jul92,elh  Created from smNetLib.c
  11. */
  12. /*
  13. DESCRIPTION
  14. This library provides show routines for the shared memory network 
  15. interface driver. 
  16. The smNetShow() routine is provided as a diagnostic aid to show current
  17. shared memory network status.
  18. INCLUDE FILES: smNetLib.h, smPktLib.h
  19. SEE ALSO: if_sm, smNetLib, smPktLib,
  20. tb VxWorks Network Programmer's Guide
  21. */
  22. #include "vxWorks.h"
  23. #include "smPktLib.h"
  24. #include "vxLib.h"
  25. #include "drv/netif/smNetLib.h"
  26. /******************************************************************************
  27. *
  28. * smNetShowInit - dummy routine to drag in smNetShow
  29. *
  30. * This routine serves only as a reference point for the linker when building
  31. * a system.
  32. *
  33. * RETURNS: N/A
  34. *
  35. * NOMANUAL
  36. */
  37. void smNetShowInit (void)
  38.     {
  39.     }
  40. /******************************************************************************
  41. *
  42. * smNetShow - show information about a shared memory network
  43. *
  44. * This routine displays information about the different CPUs configured
  45. * in a shared memory network specified by <ifName>.  It prints error 
  46. * statistics and zeros these fields if <zero> is set to TRUE.
  47. *
  48. * EXAMPLE
  49. * cs
  50. *  -> smNetShow
  51. *  Anchor at 0x800000
  52. *  heartbeat = 705, header at 0x800010, free pkts = 237.
  53. *
  54. *  cpu int type    arg1       arg2       arg3    queued pkts
  55. *  --- -------- ---------- ---------- ---------- -----------
  56. *   0  poll            0x0        0x0        0x0       0
  57. *   1  poll            0x0        0x0        0x0       0
  58. *   2  bus-int         0x3       0xc9        0x0       0
  59. *   3  mbox-2         0x2d     0x8000        0x0       0
  60. *
  61. *  input packets = 192     output packets = 164
  62. *  output errors = 0       collisions = 0
  63. *  value = 1 = 0x1
  64. * ce
  65. *
  66. * RETURNS: OK, or ERROR if there is a hardware setup problem or the routine
  67. * cannot be initialized.
  68. *
  69. * SEE ALSO: smNetLib
  70. */
  71. STATUS smNetShow
  72.     (
  73.     char * ifName, /* backplane interface name (NULL == "sm0") */
  74.     BOOL  zero /* TRUE = zap totals */
  75.     )
  76.     {
  77.     SM_SOFTC *      xs; /* softc pointer */
  78.     SM_ANCHOR *      pAnchor; /* pointer to anchor */
  79.     int       cpuNum; /* cpu number */
  80.     struct in_addr   masterAddr; /* master address */
  81.     SM_PKT_MEM_HDR * pSmPktHdr; /* packet header */
  82.     SM_PKT_INFO      smPktInfo; /* info structure */
  83.     int      bogus; /* bogus space */
  84.     char       addrString [INET_ADDR_LEN];
  85.     /* use "sm0" if no interface name specified */
  86.     if (ifName == NULL)
  87.         {
  88. ifName = "sm0";
  89.         }
  90.     if ((xs = (SM_SOFTC *) ifunit (ifName)) == NULL)
  91. {
  92. printf ("interface %s not attached.n", ifName);
  93. return (ERROR);
  94. }
  95.     /* check validity of anchor */
  96.     pAnchor = xs->smPktDesc.smDesc.anchorLocalAdrs;
  97.     printf ("Anchor Local Addr: 0x%x", (unsigned int) pAnchor);
  98.     if (vxMemProbe ((char *) pAnchor, VX_READ, 4, (char *) &bogus) != OK)
  99. {
  100. printf (", UNREADABLEn");
  101. return (ERROR);
  102. }
  103.     if (ntohl (pAnchor->readyValue) != SM_READY) /* check ready value */
  104. {
  105. printf (", UNINITIALIZEDn");
  106. return (ERROR);
  107. }
  108.     if (smIsAlive (pAnchor, &(pAnchor->smPktHeader), xs->smPktDesc.smDesc.base,
  109.    5, 0) == FALSE)
  110. {
  111. printf (", NO HEARTBEATn");
  112. return (ERROR);
  113. }
  114.     if (smPktInfoGet (&(xs->smPktDesc), &smPktInfo) == ERROR)
  115. {
  116. printf (" CPU NOT ATTACHEDn");
  117. return (ERROR);
  118. }
  119.      if (smPktInfo.smInfo.tasType == SM_TAS_SOFT)
  120.          {
  121.  printf (", SOFT TAS");
  122.          }
  123.      pSmPktHdr = SM_OFFSET_TO_LOCAL (ntohl (pAnchor->smPktHeader),
  124.      xs->smPktDesc.smDesc.base,
  125.      SM_PKT_MEM_HDR *);
  126.     
  127.     if (pSmPktHdr->reserved1 != 0)
  128. {
  129. masterAddr.s_addr = pSmPktHdr->reserved1;
  130.         inet_ntoa_b (masterAddr, addrString);
  131. printf ("nSequential addressing enabled.  Master address: %sn",
  132. addrString);
  133. }
  134.     printf ("nheartbeat = %d, header at 0x%x, free pkts = %d.nn",
  135.     ntohl (pSmPktHdr->heartBeat), (unsigned int) pSmPktHdr,
  136.     smPktInfo.freePkts);
  137.     /* print out info for each CPU */
  138.     printf (
  139. "cpu int type    arg1       arg2       arg3    queued pktsn");
  140.     printf (
  141. "--- -------- ---------- ---------- ---------- -----------n");
  142.     for (cpuNum = 0; cpuNum < smPktInfo.smInfo.maxCpus; ++cpuNum)
  143. {
  144. SM_PKT_CPU_INFO cpuInfo; /* cpu info struct */
  145. if (smPktCpuInfoGet (&(xs->smPktDesc), cpuNum, &cpuInfo) == ERROR)
  146.     {
  147.     return (ERROR);
  148.     }
  149. if (cpuInfo.status == SM_CPU_ATTACHED)
  150.     {
  151.     printf ("%2d  ", cpuNum);
  152.     switch (cpuInfo.smCpuInfo.intType)
  153. {
  154. case SM_INT_NONE: printf ("poll    "); break;
  155. case SM_INT_MAILBOX_1: printf ("mbox-1  "); break;
  156. case SM_INT_MAILBOX_2: printf ("mbox-2  "); break;
  157. case SM_INT_MAILBOX_4: printf ("mbox-4  "); break;
  158. case SM_INT_BUS: printf ("bus-int "); break;
  159. case SM_INT_MAILBOX_R1: printf ("mbox-1r "); break;
  160. case SM_INT_MAILBOX_R2: printf ("mbox-2r "); break;
  161. case SM_INT_MAILBOX_R4: printf ("mbox-4r "); break;
  162. case SM_INT_USER_1: printf ("user-1  "); break;
  163. case SM_INT_USER_2: printf ("user-2  "); break;
  164. default: printf ("%#8x",cpuInfo.smCpuInfo.intType); break;
  165. }
  166.     printf (" %#10x %#10x %#10x", cpuInfo.smCpuInfo.intArg1,
  167.     cpuInfo.smCpuInfo.intArg2, cpuInfo.smCpuInfo.intArg3);
  168.     printf ("     %3dn", cpuInfo.inputPkts);
  169.     }
  170. }
  171.     printf ("ninput packets = %3lu  ", xs->xs_if.if_ipackets);
  172.     printf ("output packets = %3lun",  xs->xs_if.if_opackets);
  173.     printf ("input errors  = %3lu  ",   xs->xs_if.if_ierrors);
  174.     printf ("output errors = %3lu  n", xs->xs_if.if_oerrors);
  175.     printf ("collisions    = %3lun",   xs->xs_if.if_collisions);
  176.     if (zero) /* zero interface statistics */
  177. {
  178. xs->xs_if.if_ipackets   = 0;
  179. xs->xs_if.if_opackets   = 0;
  180. xs->xs_if.if_ierrors    = 0;
  181. xs->xs_if.if_oerrors    = 0;
  182. xs->xs_if.if_collisions = 0;
  183. }
  184.     return (OK);
  185.     }