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

VxWorks

开发平台:

C/C++

  1. /* netShow.c - network information display routines */
  2. /* Copyright 1984 - 2002 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 03v,25jun02,ann  making a temporary change to the 64 bit counter lookups
  8. 03u,10may02,kbw  making man page edits
  9. 03t,22apr02,rae  inetstatShow warns if TCP or UDP show routine absent
  10.                  (SPR #72838)
  11. 03s,28mar02,vvv  fixed problem with route show routines executed over the
  12.  network (SPR #69286/73759)
  13. 03r,07dec01,rae  merge from synth ver 03z (SPR #67790)
  14. 03q,15oct01,rae  merge from truestack ver 03x, base 03j (SPRs 69550,
  15.                  67790, 67148, 65788 etc.)
  16. 03p,07feb01,spm  added internal documentation for parallel host shell routines
  17. 03o,15jan01,zhu  SPR#63298
  18. 03x,15aug01,vvv  added entries for all interface types in pIfTypes 
  19.  array (SPR #69550)
  20. 03w,13jul01,ann  eliminated the global mibStyle flag by incorporating it in
  21.                  the END object's flags
  22. 03v,27jun01,spm  consolidated and updated route show routines; replaced use
  23.                  of visibility flag for duplicate routes
  24. 03u,19jun01,rae  merged venus changes from tor3_x ver 03t
  25.  SPRs 67790 67148 65788
  26. 03t,01may01,niq  Correcting the mod history
  27. 03s,01may01,niq  Merging Fastpath changes from tor2_0.open_stack branch 
  28.                  version 04i (netShow.c@@/main/tor2_0_x/tor2_0_0.sustaining/
  29.                  tor2_0.open_stack/26)
  30. 03r,29mar01,spm  merged changes from version 04h of tor2_0.open_stack
  31.                  branch (wpwr VOB, base 03q) for unified code base
  32. 03q,13mar01,rae  merged from 03p of tor2_0.barney branch (base: 03h)
  33.  SPR#63298, SPR#27395, RFC2233, etc.
  34. 03p,09mar01,ham  fixed output format in rtEntryPrint() routine (SPR #64321)
  35. 03o,24feb01,ham  fixed S_objLib_OBJ_ID_ERROR return (SPR 64383).
  36. 03n,20feb01,ham  fixed printf's format in rtEntryPrint() (SPR #63298).
  37. 03m,03nov00,ham  doc: added an example in netPoolShow.
  38. 03l,25oct00,ham  doc: cleanup for vxWorks AE 1.0.
  39. 03k,19apr00,ham  merged TOR2_0-NPT-FCS(03j,08nov99,pul).
  40.                  fixed incorrect printf (SPR #26699).
  41. 03j,08nov99,pul  T2 cumulative patch 2
  42. 03i,10may99,spm  fixed arpShow routine to display proxy entries (SPR #24397)
  43. 03h,26aug98,fle  doc : added .CS in EXAMPLE of arpShow header
  44. 03g,14dec97,jdi  doc: cleanup.
  45. 03f,10dec97,kbw  minor man page fixes
  46. 03e,03dec97,vin  added netStackDataPoolShow() netStackSysPoolShow().
  47. 03d,26oct97,kbw  minor man page fixes
  48. 03c,26sep97,rjc  fix for SPR 9326
  49. 03b,26aug97,spm  removed compiler warnings (SPR #7866)
  50. 03a,12aug97,vin  added netpool specific stuff for mbufShow.
  51. 02z,12aug97,rjc  added if type to ifShow SPR7555.
  52. 02y,11aug97,vin  changed clPoolShow.
  53. 02x,01aug97,kbw  fix man page problems found in beta review
  54. 02w,07jul97,rjc  modifications for newer version of rtentry.
  55. 02v,30jun97,rjc  restored old rtentry structure size.
  56. 02u,03jun97,rjc  stopped converting all 0 mask to all 1.
  57. 02t,02jun97,spm  corrected modification history entry
  58. 02s,29may97,rjc  fixed mRouteShow byte order in mask.
  59. 02r,08mar97,vin  added changes to accomodate changes in pcb structure.
  60.  moved out igmp, icmp, udp, tcp code to igmpShow, icmpShow,
  61.                  udpShow, tcpShow.
  62. 02q,07apr97,spm  removed DHCP client dependencies
  63. 02p,13feb97,rjc  added mRouteShow
  64. 02o,31jan97,vin  fixed a bug in clPoolShow().
  65. 02n,31jan97,spm  moved DHCP client show routines to dhcpShowLib.c
  66. 02m,29jan97,spm  made global variables for DHCP client unique.
  67. 02l,29jan97,spm  removed conditional includes from DHCP client code.
  68. 02k,07jan97,vin  added unknown protocol in ipstatShow.
  69. 02j,05dec96,vin  added new mbufTypes MT_IPMADDR,MT_IFMADDR,MT_MRTABLE.
  70. 02i,03dec96,spm  correcting errors in DHCP client show routines.
  71. 02h,27nov96,spm  added show routines for DHCP client.
  72. 02g,17nov96,vin  modified show routines to include new clusters.
  73.  deleted cluster related fields from mbufShow().
  74. 02f,11sep96,vin  modified for BSD4.4.
  75. 02e,13mar95,dzb  changed tcpDebugShow() to call tcpReportRtn (SPR #3928).
  76. 02d,18jan95,rhp  add pointers to literature in library man page (SPR#3591)
  77. 02c,18jan95,jdi  doc cleanup for tcpDebugShow().
  78. 02b,11aug94,dzb  added tcpDebugShow() to get at tcp_debug.c:tcp_report().
  79.                  warning cleanup.
  80. 02a,11aug93,jmm  Changed ioctl.h and socket.h to sys/ioctl.h and sys/socket.h
  81. 01z,02feb93,jdi  documentation cleanup for 5.1.
  82. 01y,13nov92,dnw  added include of semLibP.h
  83. 01x,12oct92,jdi  fixed mangen problem in routestatShow().
  84. 01w,04sep92,jmm  fixed typo in printf in inpcbPrint()
  85.                  changed field width in inetPrint() to 15 from 12 (spr 1470)
  86. 01v,29jul92,smb  changed putchar() to printf().
  87. 01u,27jul92,elh  Moved routeShow and hostShow here.
  88. 01t,04jul92,smb  added include vxWorks.h
  89. 01s,26jun92,wmd  modified inetPrint() to always print port address. 
  90. 01r,11jun92,elh  moved arpShow here from arpLib.
  91. 01q,26may92,rrr  the tree shuffle
  92.   -changed includes to have absolute path from h/
  93. 01p,26may92,kdl  changed ifShow() to more robustly avoid dereferencing
  94.  null ptr (SPR #1389).
  95. 01o,01jan92,elh  changed arptabShow to call arpShow.
  96. 01n,13dec91,gae  ANSI fixes.
  97. 01m,17nov91,elh  added routestatShow().
  98. 01l,07nov91,elh  changed calls to inet_ntoa to inet_ntoa_b, so memory isn't lost.
  99. 01k,04oct91,rrr  passed through the ansification filter
  100.                   -changed functions to ansi style
  101.   -changed includes to have absolute path from h/
  102.   -changed VOID to void
  103.   -changed copyright notice
  104. 01j,14aug91,jrb  (intel) improved instrumentation for udp in udpstatShow command
  105.  with the following fields: udptotal - total packets,
  106.  ipackets - input, opackets - output, fullsock - socket
  107.  overflows, noportbcast - broadcast port messages with no
  108.  listener. Taken from latest BSD reno udp.
  109. 01i,17jun91,del  added include of strLib.h.
  110. 01h,07may91,jdi  documentation tweaks.
  111. 01g,05apr91,jdi  documentation -- removed header parens and x-ref numbers;
  112.  doc review by elh.
  113. 01f,20feb91,jaa  documentation.
  114. 01e,08oct90,hjb  moved include of "ip.h" above "tcp.h" to avoid redefinition of
  115.  IP_MSS.
  116. 01d,02oct90,hjb  deleted "netdb.h".  made ipstatShow() void.
  117. 01c,12aug90,hjb  added arptabShow().
  118. 01b,10aug90,kdl  added forward declarations for functions returning void.
  119. 01a,26jun90,hjb  created by moving Show routines out of various files.
  120. */
  121. /*
  122. DESCRIPTION
  123. This library provides routines to show various network-related
  124. statistics, such as configuration parameters for network interfaces,
  125. protocol statistics, socket statistics, and so on.
  126. Interpreting these statistics requires detailed knowledge of Internet
  127. network protocols.  Information on these protocols can be found in
  128. the following books:
  129. .iP
  130. .I "Internetworking with TCP/IP Volume III,"
  131. by Douglas Comer and David Stevens
  132. .iP
  133. .I "UNIX Network Programming,"
  134. by Richard Stevens
  135. .iP
  136. .I "The Design and Implementation of the 4.3 BSD UNIX Operating System,"
  137. by Leffler, McKusick, Karels and Quarterman
  138. .LP
  139. The netShowInit() routine links the network show facility into the VxWorks
  140. system.  This is performed automatically if INCLUDE_NET_SHOW is defined.
  141. If you want inetstatShow() to display TCP socket status, then INCLUDE_TCP_SHOW
  142. needs to be included.
  143. INTERNAL
  144. Some routines within this module are preempted by parallel versions
  145. built in to the Tornado shell source code in the $WIND_BASE/host/src/windsh
  146. directory. Changes to these routines must be duplicated within the shell to
  147. maintain consistent output. The versions in this module can still be
  148. accessed by prepending an "@" sign to the routine name (e.g. "@ifShow").
  149. Currently, the following routines are preempted:
  150.      ifShow, inetstatShow, ipstatShow, routestatShow, hostShow
  151. SEE ALSO: ifLib, icmpShow, igmpShow, tcpShow, udpShow 
  152. INTERNAL
  153. Some routines within this module are preempted by parallel versions
  154. built in to the Tornado shell source code in the $WIND_BASE/host/src/windsh
  155. directory. Changes to these routines must be duplicated within the shell to
  156. maintain consistent output. The versions in this module can still be
  157. accessed by prepending an "@" sign to the routine name (e.g. "@ifShow").
  158. Currently, the following routines are preempted:
  159.      ifShow, inetstatShow, ipstatShow, routestatShow, hostShow     
  160. */
  161. #include "vxWorks.h"
  162. #include "sys/types.h"
  163. #include "netinet/in.h"
  164. #include "net/socketvar.h"
  165. #include "sys/socket.h"
  166. #include "netinet/in_systm.h"
  167. #include "netinet/ip.h"
  168. #include "netinet/ip_var.h"
  169. #include "net/route.h"
  170. #include "net/radix.h"
  171. #include "netinet/in_pcb.h"
  172. #include "hostLib.h"
  173. #include "net/if.h"
  174. #include "net/if_dl.h"
  175. #include "netinet/if_ether.h"
  176. #include "netinet/in_var.h"
  177. #include "errno.h"
  178. #include "net/mbuf.h"
  179. #include "inetLib.h"
  180. #include "string.h"
  181. #include "stdio.h"
  182. #include "stdlib.h"
  183. #include "arpLib.h"
  184. #include "private/semLibP.h"
  185. #include "routeEnhLib.h"
  186. #include "private/muxLibP.h"
  187. #include "private/memPartLibP.h"
  188. #include "end.h"
  189. #include "ipProto.h"
  190. #include "math.h"
  191. #ifdef VIRTUAL_STACK
  192. #include "netinet/vsLib.h"
  193. #include "netinet/vsIp.h"  /* for _in_ifaddr definition */
  194. #include "netinet/vsShow.h"  /* for _pTcpPcbHead and _pUdpPcbHead */
  195. #include "netinet/vsHost.h"  /* for hostList and hostListSem */
  196. #include "netinet/vsRadix.h"  /* for rt_tables definition */
  197. #endif /* VIRTUAL_STACK */
  198. /* externs */
  199. #ifndef VIRTUAL_STACK
  200. IMPORT struct rtstat rtstat; /* routing statistics */
  201. IMPORT struct ifnet  *ifnet; /* list of all network interfaces */
  202. IMPORT struct in_ifaddr *in_ifaddr;  /* list of addr for net interfaces */
  203. IMPORT struct ipstat ipstat;
  204. IMPORT struct radix_node_head *rt_tables[]; /* table of radix nodes */
  205. IMPORT LIST  hostList;
  206. IMPORT SEM_ID  hostListSem;
  207. IMPORT NET_POOL_ID _pNetDpool;
  208. IMPORT BOOL              bufferedRtShow;         /* buffered route printing */
  209. IMPORT UINT              rtMem;                  /* memory for route display */
  210. /* globals */
  211. struct inpcbhead * _pUdpPcbHead  = NULL; /* initialized in udpShow.c */
  212. struct inpcbhead * _pTcpPcbHead  = NULL; /* initialized in tcpShow.c */
  213. #endif /* VIRTUAL_STACK */
  214. VOIDFUNCPTR _pTcpPcbPrint = NULL; /* initialized in tcpShow.c */
  215. /* locals */
  216. LOCAL char *  pIfTypes [] =      /* interface types from mib-2 */
  217.     {
  218.     "UNDEFINED",
  219.     "OTHER", 
  220.     "REGULAR_1822", 
  221.     "HDH1822", 
  222.     "DDN_X25", 
  223.     "RFC877_X25", 
  224.     "ETHERNET_CSMACD", 
  225.     "ISO88023_CSMACD", 
  226.     "ISO88024_TOKENBUS", 
  227.     "ISO88025_TOKENRING", 
  228.     "ISO88026_MAN", 
  229.     "STARLAN", 
  230.     "PROTEON_10MBIT", 
  231.     "PROTEON_80MBIT", 
  232.     "HYPERCHANNEL", 
  233.     "FDDI", 
  234.     "LAPB", 
  235.     "SDLC", 
  236.     "DS1", 
  237.     "E1", 
  238.     "BASIC_ISDN", 
  239.     "PRIMARY_ISDN", 
  240.     "PROP_POINT_TO_POINT_SERIAL", 
  241.     "PPP", 
  242.     "SOFTWARE_LOOPBACK", 
  243.     "EON", 
  244.     "ETHERNET_3MBIT", 
  245.     "NSIP", 
  246.     "SLIP", 
  247.     "ULTRA", 
  248.     "DS3", 
  249.     "SIP", 
  250.     "FRAME_RELAY", 
  251.     "RS232",
  252.     "PARA",
  253.     "ARCNET",
  254.     "ARCNET_PLUS",
  255.     "ATM",
  256.     "MIOX25",
  257.     "SONET",
  258.     "X25PLE",
  259.     "ISO88022LLC",
  260.     "LOCAL_TALK",
  261.     "SMDS_DXI",
  262.     "FRAME_RELAY_SERVICE",
  263.     "V35",
  264.     "HSSI",
  265.     "HIPPI",
  266.     "MODEM",
  267.     "AAL5",
  268.     "SONET_PATH",
  269.     "SONET_VT",
  270.     "SMDS_ICIP",
  271.     "PROP_VIRTUAL",
  272.     "PROP_MULTIPLEXOR",
  273.     "IEEE80212",
  274.     "FIBRE_CHANNEL",
  275.     "HIPPI_INTERFACE",
  276.     "FRAME_RELAY_INTERCONNECT",
  277.     "AFLANE8023",
  278.     "AFLANE8025",
  279.     "CCT_EMUL",
  280.     "FAST_ETHER",
  281.     "ISDN",
  282.     "V11",
  283.     "V36",
  284.     "G703AT64K",
  285.     "G703AT2MB",
  286.     "QLLC",
  287.     "FAST_ETHER_FX",
  288.     "CHANNEL",
  289.     "IEEE80211",
  290.     "IBM370PAR_CHAN",
  291.     "ESCON",
  292.     "DLSW",
  293.     "ISDNS",
  294.     "ISDNU",
  295.     "LAPD",
  296.     "IP_SWITCH",
  297.     "RSRB",
  298.     "ATM_LOGICAL",
  299.     "DS0",
  300.     "DS0_BUNDLE",
  301.     "BSC",
  302.     "ASYNC",
  303.     "CNR",
  304.     "ISO88025_DTR",
  305.     "EPLRS",
  306.     "ARAP",
  307.     "PROP_CNLS",
  308.     "HOST_PAD",
  309.     "TERM_PAD",
  310.     "FRAME_RELAY_MPI",
  311.     "X213",
  312.     "ADSL",
  313.     "RADSL",
  314.     "SDSL",
  315.     "VDSL",
  316.     "ISO88025_CRFP_INT",
  317.     "MYRINET",
  318.     "VOICE_EM",
  319.     "VOICE_FXO",
  320.     "VOICE_FXS",
  321.     "VOICE_ENCAP",
  322.     "VOICE_OVER_IP",
  323.     "ATM_DXI",
  324.     "ATM_FUNI",
  325.     "ATM_IMA",
  326.     "PPP_MULTILINK_BUNDLE",
  327.     "IP_OVER_CDLC",
  328.     "IP_OVER_CLAW",
  329.     "STACK_TO_STACK",
  330.     "VIRTUAL_IP_ADDRESS",
  331.     "MPC",
  332.     "IP_OVER_ATM",
  333.     "ISO88025_FIBER",
  334.     "TDLC",
  335.     "GIGABIT_ETHERNET",
  336.     "HDLC",
  337.     "LAPF",
  338.     "V37",
  339.     "X25MLP",
  340.     "X25HUNT_GROUP",
  341.     "TRASNP_HDLC",
  342.     "INTERLEAVE",
  343.     "FAST",
  344.     "IP",
  345.     "DOCS_CABLE_MACLAYER",
  346.     "DOCS_CABLE_DOWNSTREAM",
  347.     "DOCS_CABLE_UPSTREAM",
  348.     "A12_MPP_SWITCH",
  349.     "TUNNEL",
  350.     "COFFEE",
  351.     "CES",
  352.     "ATM_SUB_INTERFACE",
  353.     "L2VLAN",
  354.     "L3IPVLAN",
  355.     "L3IPXVLAN",
  356.     "DIGITAL_POWERLINE",
  357.     "MEDIA_MAIL_OVER_IP",
  358.     "DTM",
  359.     "DCN",
  360.     "IP_FORWARD",
  361.     "MSDSL",
  362.     "IEEE1394",
  363.     "IF_GSN",
  364.     "DVB_RCC_MAC_LAYER",
  365.     "DVB_RCC_DOWNSTREAM",
  366.     "DVB_RCC_UPSTREAM",
  367.     "ATM_VIRTUAL",
  368.     "MPLS_TUNNEL",
  369.     "SRP",
  370.     "VOICE_OVER_ATM",
  371.     "VOICE_OVER_FRAME_RELAY",
  372.     "IDSL",
  373.     "COMPOSITE_LINK",
  374.     "SS7_SIG_LINK",
  375.     "PMP",
  376.      };
  377. LOCAL int bufIndex;                 /* index into route buffer */
  378. LOCAL char *routeBuf;               /* buffer to store routing table */
  379. /* forward static functions */
  380. static void ifAddrPrint (char *str, struct sockaddr *addr);
  381. static void ifFlagPrint (u_short flag);
  382. static void ifEtherPrint (u_char enaddr [ 6 ]);
  383. static void inetPrint (struct in_addr *in, u_short port);
  384. LOCAL BOOL routeEntryPrint (struct rtentry *, void *, BOOL);
  385. static void routeTableShow (int rtType);
  386. static void inpcbPrint (char *name, struct inpcb *pInpcb);
  387. static int routeNodeShow (struct radix_node* rn, void* w);
  388. #define RT_ENTRY_LEN    90
  389. #define plural(num) ((num) > 1 ? "s": "")
  390. #define RT_NET 0x001 /* print network route */
  391. #define RT_HST 0x010 /* print host route */
  392. #define RT_ARP 0x100 /* print arp route entry */
  393. /*******************************************************************************
  394. *
  395. * ifShow - display the attached network interfaces
  396. *
  397. * This routine displays the attached network interfaces for debugging and
  398. * diagnostic purposes.  If <ifName> is given, only the interfaces belonging
  399. * to that group are displayed.  If <ifName> is omitted, all attached
  400. * interfaces are displayed.
  401. *
  402. * For each interface selected, the following are shown: Internet
  403. * address, point-to-point peer address (if using SLIP), broadcast address,
  404. * netmask, subnet mask, Ethernet address, route metric, maximum transfer
  405. * unit, number of packets sent and received on this interface, number of
  406. * input and output errors, and flags (such as loopback, point-to-point,
  407. * broadcast, promiscuous, ARP, running, and debug).
  408. *
  409. * EXAMPLE:
  410. * The following call displays all interfaces whose names begin with "ln",
  411. * (such as "ln0", "ln1", and "ln2"):
  412. * .CS
  413. *     -> ifShow "ln"
  414. * .CE
  415. * The following call displays just the interface "ln0":
  416. * .CS
  417. *     -> ifShow "ln0"
  418. * .CE
  419. *
  420. * RETURNS: N/A
  421. *
  422. * SEE ALSO: routeShow(), ifLib
  423. *
  424. * INTERNAL
  425. * When using the Tornado shell, this routine is only available if an
  426. * "@" sign is prepended to the routine name. Otherwise, it is preempted
  427. * by a built-in version.
  428. */
  429. void ifShow
  430.     (
  431.     char *ifName                /* name of the interface to show */
  432.     )
  433.     {
  434.     FAST struct ifnet  *ifp;
  435.     FAST struct ifaddr  *ifa;
  436.     FAST struct in_ifaddr  *ia = 0;
  437.     FAST int  nameLen;
  438.     BOOL   found;
  439.     int  ifUnit;
  440.     IP_DRV_CTRL *                pDrvCtrl = NULL;
  441.     END_OBJ *                    pEnd;
  442. #ifdef VIRTUAL_STACK
  443.     virtualStackIdCheck();
  444. #endif /* VIRTUAL_STACK */
  445.     found = FALSE;
  446. #ifdef VIRTUAL_STACK
  447.     for (ifp = _ifnet;  ifp != NULL;  ifp = ifp->if_next)
  448. #else
  449.     for (ifp = ifnet;  ifp != NULL;  ifp = ifp->if_next)
  450. #endif /* VIRTUAL_STACK */
  451. {
  452. nameLen = strlen (ifp->if_name);
  453. /*
  454.  * If no name is specified, every interface is a match.
  455.  */
  456. if (ifName != NULL) /* if a name was specified */
  457.     {
  458.     if (strncmp (ifName, ifp->if_name, nameLen) != 0)
  459.      continue; /* no match - wrong name */
  460.     /*
  461.      * If the user specified unit ID in ifName compare the unit number
  462.      */
  463.     if (nameLen < strlen (ifName))
  464.      {
  465.      sscanf (&ifName [nameLen], "%d", &ifUnit);
  466.      if (ifp->if_unit != ifUnit)
  467.     continue; /* no match - wrong unit ID */
  468. }
  469.     }
  470. found = TRUE;
  471. #ifdef VIRTUAL_STACK
  472. printf ("%s (unit number %d) (stack number %d):n", ifp->if_name,
  473.                 ifp->if_unit, ifp->vsNum);
  474. #else
  475. printf ("%s (unit number %d):n", ifp->if_name, ifp->if_unit);
  476. #endif /* VIRTUAL_STACK */
  477. ifFlagPrint (ifp->if_flags);
  478. printf ("     Type: %sn", pIfTypes [ifp->if_type]);
  479. for (ifa = ifp->if_addrlist;  ifa != NULL;  ifa = ifa->ifa_next)
  480.     {
  481.     if (ifa->ifa_addr->sa_family == AF_INET)
  482. {
  483.                 /*
  484.                  * Every element in the if_addrlist (type struct ifaddr) with
  485.                  * family AF_INET is actually the first part of a larger
  486.                  * in_ifaddr structure which includes the netmask and subnet
  487.                  * mask. Access that structure to display those values.
  488.                  */
  489.                 ia = (struct in_ifaddr *)ifa;
  490. ifAddrPrint ("Internet address", ifa->ifa_addr);
  491. if (ifp->if_flags & IFF_POINTOPOINT)
  492.     ifAddrPrint ("Destination Internet address",
  493.                                   ifa->ifa_dstaddr);
  494. else if (ifp->if_flags & IFF_BROADCAST)
  495.     ifAddrPrint ("Broadcast address", ifa->ifa_broadaddr);
  496.                 printf ("     Netmask 0x%lx Subnetmask 0x%lxn", 
  497.                         ia->ia_netmask, ia->ia_subnetmask);
  498. }
  499.     }
  500.         /*
  501.  * if the interface is not LOOPBACK or SLIP, print the link
  502.  * level address.
  503.  */
  504. if (!(ifp->if_flags & IFF_POINTOPOINT) &&
  505.     !(ifp->if_flags & IFF_LOOPBACK))
  506.     ifEtherPrint (((struct arpcom *)ifp)->ac_enaddr);
  507. printf("     Metric is %lun", ifp->if_metric);
  508. printf("     Maximum Transfer Unit size is %lun", ifp->if_mtu);
  509.         pDrvCtrl = (IP_DRV_CTRL *)ifp->pCookie;
  510.         /*
  511.          * If the ifnet does not have a cookie then this is
  512.          * a BSD 4.x  interface.
  513.          */
  514.         if (pDrvCtrl == NULL)
  515.             {
  516.             printf("     %lu packets received; %lu packets sentn",
  517.                    ifp->if_ipackets, ifp->if_opackets);
  518.             printf("     %lu multicast packets receivedn", ifp->if_imcasts);
  519.             printf("     %lu multicast packets sentn", ifp->if_omcasts);
  520.             printf("     %lu input errors; %lu output errorsn",
  521.                    ifp->if_ierrors, ifp->if_oerrors);
  522.             }
  523.         else /* END style interface. */
  524.             {
  525.             M2_DATA    *pIfMib;
  526.             pEnd = PCOOKIE_TO_ENDOBJ(pDrvCtrl->pIpCookie);
  527.             if (pEnd == NULL)
  528.                 continue;
  529.             pIfMib = &pEnd->pMib2Tbl->m2Data;
  530.             if (pEnd->flags & END_MIB_2233)
  531.                 {
  532.         printf ("     %lu octets receivedn", pIfMib->mibIfTbl.ifInOctets);
  533.         printf ("     %lu octets sentn", pIfMib->mibIfTbl.ifOutOctets);
  534.         printf ("     %lu unicast packets receivedn", 
  535.             pIfMib->mibIfTbl.ifInUcastPkts);
  536.         printf ("     %lu unicast packets sentn", 
  537.             pIfMib->mibIfTbl.ifOutUcastPkts);
  538.         printf ("     %lu non-unicast packets receivedn", 
  539.             pIfMib->mibIfTbl.ifInNUcastPkts);
  540.         printf ("     %lu non-unicast packets sentn", 
  541.             pIfMib->mibIfTbl.ifOutNUcastPkts);
  542.         printf ("     %lu multicast packets receivedn", 
  543.             pIfMib->mibXIfTbl.ifInMulticastPkts);
  544.         printf ("     %lu multicast packets sentn", 
  545.             pIfMib->mibXIfTbl.ifOutMulticastPkts);
  546.         printf ("     %lu broadcast packets receivedn", 
  547.             pIfMib->mibXIfTbl.ifInBroadcastPkts);
  548.         printf ("     %lu broadcast packets sentn", 
  549.             pIfMib->mibXIfTbl.ifOutBroadcastPkts);
  550.         printf ("     %lu incoming packets discardedn", 
  551.             pIfMib->mibIfTbl.ifInDiscards);
  552.         printf ("     %lu outgoing packets discardedn", 
  553.             pIfMib->mibIfTbl.ifOutDiscards);
  554.         printf ("     %lu incoming errorsn", 
  555.             pIfMib->mibIfTbl.ifInErrors);
  556.         printf ("     %lu outgoing errorsn", 
  557.             pIfMib->mibIfTbl.ifOutErrors);
  558.         printf ("     %lu unknown protosn", 
  559.             pIfMib->mibIfTbl.ifInUnknownProtos);
  560. }
  561.             else /* (RFC1213 style counters supported) XXX */
  562.                 {
  563.                 /*
  564.                  * XXX This change was made in order to fix inconsistant
  565.                  * statistics between MIB2 and ifnet due to END currently
  566.                  * does not increment MIB2 statistics. However this is
  567.                  * temporary fix and should be rolled back when ifnet{} 
  568.                  * gets obsolete eventually.
  569.                  */
  570.                 printf("     %lu octets receivedn",
  571.                        ifp->if_ipackets);
  572.                 printf("     %lu octets sentn",
  573.                        ifp->if_opackets);
  574.                 printf("     %lu packets receivedn",
  575.                        ifp->if_ipackets - ifp->if_ierrors);
  576.                 printf("     %lu packets sentn",
  577.                        ifp->if_opackets - ifp->if_oerrors);
  578.                 printf("     %lu non-unicast packets receivedn",
  579.                        ifp->if_imcasts);
  580.                 printf("     %lu non-unicast packets sentn",
  581.                        ifp->if_omcasts);
  582.                 printf("     %lu unicast packets receivedn",
  583.                        ifp->if_ipackets - ifp->if_imcasts);
  584.                 printf("     %lu unicast packets sentn",
  585.                        ifp->if_opackets - ifp->if_omcasts);
  586.                 printf("     %lu input discardsn",
  587.                        ifp->if_iqdrops);
  588.                 printf("     %lu input unknown protocolsn",
  589.                        ifp->if_noproto);
  590.                 printf("     %lu input errorsn",
  591.                        ifp->if_ierrors);
  592.                 printf("     %lu output errorsn",
  593.                        ifp->if_oerrors);
  594.                 }
  595.             }
  596.     /* print collisions and drops for old BSD or iso88023_csmacd 
  597.      * or ethernet_csmacd
  598.      */
  599.             if (pDrvCtrl == NULL  
  600.     || ifp->if_data.ifi_type==M2_ifType_iso88023_csmacd 
  601.             || ifp->if_data.ifi_type==M2_ifType_ethernet_csmacd )
  602.        {
  603.                 printf("     %ld collisions; %ld droppedn",
  604.                 ifp->if_collisions, ifp->if_iqdrops);
  605.        }
  606.         }
  607.     if (found == FALSE)
  608. {
  609.      if (ifName != NULL)
  610.     printErr(""%s" - No such interfacen", ifName);
  611.      else
  612.     printErr("No network interface active.n");
  613. }
  614.     }
  615. /*******************************************************************************
  616. *
  617. * ifAddrPrint - print Internet address for the interface
  618. *
  619. * Prints the Internet address (for the network interfaces)
  620. * in readable format.
  621. *
  622. * RETURNS: N/A.
  623. */
  624. LOCAL void ifAddrPrint
  625.     (
  626.     char                *str,   /* comment string to be printed */
  627.     struct sockaddr     *addr   /* internet address for the interface */
  628.     )
  629.     {
  630.     char  addrString [INET_ADDR_LEN];
  631.     inet_ntoa_b (((struct sockaddr_in *)addr)->sin_addr, addrString);
  632.     printf("     %s: %sn", str, addrString);
  633.     }
  634. /*******************************************************************************
  635. *
  636. * ifFlagPrint - print flags for the network interface
  637. *
  638. * ifFlagPrint prints each of the flags specified for the network
  639. * interfaces in user-readable format.
  640. *
  641. * RETURNS: N/A.
  642. */
  643. LOCAL void ifFlagPrint
  644.     (
  645.     FAST ushort flag                       /* network interface flags */
  646.     )
  647.     {
  648.     printf("     Flags: (0x%x) ", flag);
  649.     if (flag & IFF_UP)
  650. printf ("UP ");
  651.     else
  652. /* shouldn't happen if the interface is deleted properly */
  653. printf ("DOWN ");
  654.     if (flag & IFF_LOOPBACK)
  655. printf ("LOOPBACK ");
  656.     if (flag & IFF_POINTOPOINT)
  657. printf ("POINT-TO-POINT ");
  658.     if (flag & IFF_BROADCAST)
  659. printf ("BROADCAST ");
  660.     if (flag & IFF_MULTICAST)
  661. printf ("MULTICAST "); 
  662.     if (flag & IFF_PROMISC)
  663. printf ("PROMISCUOUS ");
  664.     if (!(flag & IFF_NOTRAILERS))
  665. printf ("TRAILERS ");
  666.     if (!(flag & IFF_NOARP))
  667. printf ("ARP ");
  668.     if (flag & IFF_RUNNING)
  669. printf ("RUNNING ");
  670.     if (flag & IFF_DEBUG)
  671. printf ("DEBUG ");
  672.     if (flag & IFF_FP_ENABLE)
  673. printf ("FASTPATH ");
  674.     printf ("n");
  675.     }
  676. /*******************************************************************************
  677. *
  678. * ifEtherPrint - print Ethernet address in ":" notation
  679. *
  680. * RETURNS: N/A.
  681. */
  682. LOCAL void ifEtherPrint
  683.     (
  684.     u_char enaddr[6]            /* ethernet address */
  685.     )
  686.     {
  687.     unsigned char *en = (unsigned char *)enaddr;
  688.     printf("     Ethernet address is %02x:%02x:%02x:%02x:%02x:%02xn",
  689.    en [0], en [1], en [2], en [3], en [4], en [5]);
  690.     }
  691. /*******************************************************************************
  692. *
  693. * inetPrint - Pretty print an Internet address (net address + port).
  694. *
  695. * RETURNS: N/A.
  696. */
  697. LOCAL void inetPrint
  698.     (
  699.     FAST struct in_addr *in,
  700.     u_short port
  701.     )
  702.     {
  703.     char line[80];
  704.     char *cp;
  705.     int width;
  706.     char addrString [INET_ADDR_LEN];
  707.     inet_ntoa_b ((*in), addrString);
  708.     (void) sprintf (line, "%.*s.", 15, addrString);
  709.     cp = index (line, '');
  710.     (void) sprintf (cp, "%d", ntohs((u_short)port));
  711.     width = 21;
  712.     printf (" %-*.*s", width, width, line);
  713.     }
  714. /*******************************************************************************
  715. *
  716. * inetstatShow - display all active connections for Internet protocol sockets
  717. *
  718. * This routine displays a list of all active Internet protocol sockets in a
  719. * format similar to the UNIX `netstat' command.
  720. *
  721. * If you want inetstatShow() to display TCP socket status, then
  722. * INCLUDE_TCP_SHOW needs to be included.
  723. *
  724. * RETURNS: N/A
  725. *
  726. * INTERNAL
  727. * When using the Tornado shell, this routine is only available if an
  728. * "@" sign is prepended to the routine name. Otherwise, it is preempted
  729. * by a built-in version.
  730. */
  731. void inetstatShow (void)
  732.     {
  733. #ifdef VIRTUAL_STACK
  734.     virtualStackIdCheck();
  735.     printf("Active Internet connections (including servers) (stack number %d)n", myStackNum);
  736. #else
  737.     printf("Active Internet connections (including servers)n");
  738. #endif /* VIRTUAL_STACK */
  739.     printf("%-8.8s %-5.5s %-6.6s %-6.6s  %-18.18s %-18.18s %sn",
  740.    "PCB", "Proto", "Recv-Q", "Send-Q",
  741.    "Local Address", "Foreign Address", "(state)");
  742.     printf("%-8.8s %-5.5s %-6.6s %-6.6s  %-18.18s %-18.18s %sn",
  743.    "--------", "-----", "------", "------", "------------------",
  744.         "------------------", "-------");
  745.     if (_pTcpPcbHead != NULL)
  746.         inpcbPrint ("TCP", _pTcpPcbHead->lh_first);
  747.     else
  748.         printf("No TCP show routine included.  TCP connections not shown.n");
  749.     
  750.     if (_pUdpPcbHead != NULL)
  751.         inpcbPrint ("UDP", _pUdpPcbHead->lh_first);
  752.     else
  753.         printf("No UDP show routine included.  UDP connections not shown.n");
  754. #ifdef VIRTUAL_STACK
  755.     inpcbPrint ("RAW", ripcb.lh_first);
  756. #endif /* VIRTUAL_STACK */
  757.     }
  758. /*******************************************************************************
  759. *
  760. * inpcbPrint - print a list of protocol control blocks for an Internet protocol
  761. *
  762. * Prints a list of active protocol control blocks for the specified
  763. * Internet protocols in a nice and pretty format.
  764. *
  765. * RETURNS: N/A.
  766. */
  767. LOCAL void inpcbPrint
  768.     (
  769.     char *name,
  770.     struct inpcb *pInpcb
  771.     )
  772.     {
  773.     FAST struct inpcb *inp;
  774.     struct socket *pSock;
  775.     BOOL isTcp = 0;
  776.     if (strcmp (name, "TCP") == 0)
  777.         isTcp = 1;
  778.     for (inp = pInpcb; inp != NULL; inp = inp->inp_list.le_next)
  779. {
  780. pSock = inp->inp_socket;
  781. /*
  782.  * Print "inp" here to allow manual deletion of the stale
  783.  * PCB's by using in_pcbdetach (inp).
  784.  */
  785. printf ("%-8x ", (u_int) inp);
  786. printf("%-5.5s %6ld %6ld ", name, pSock->so_rcv.sb_cc,
  787.        pSock->so_snd.sb_cc);
  788. inetPrint (&(inp->inp_laddr), inp->inp_lport);
  789. inetPrint (&(inp->inp_faddr), inp->inp_fport);
  790.         /* if tcp is included then only print the tcp information */
  791.         
  792.         if (isTcp && (_pTcpPcbPrint != NULL))
  793.             (*_pTcpPcbPrint) (inp); 
  794. (void) printf ("n");
  795. }
  796.     }
  797. /*******************************************************************************
  798. *
  799. * ipstatShow - display IP statistics
  800. *
  801. * This routine displays detailed statistics for the IP protocol.
  802. *
  803. * RETURNS: N/A
  804. *
  805. * INTERNAL
  806. * When using the Tornado shell, this routine is only available if an
  807. * "@" sign is prepended to the routine name. Otherwise, it is preempted
  808. * by a built-in version.
  809. */
  810. void ipstatShow
  811.     (
  812.     BOOL zero           /* TRUE = reset statistics to 0 */
  813.     )
  814.     {
  815.     static char *ipstat_name[] =
  816. {
  817. "total",           "badsum",    "tooshort",     "toosmall",
  818. "badhlen",         "badlen",    "infragments",  "fragdropped", 
  819. "fragtimeout",     "forward",   "cantforward",  "redirectsent", 
  820. "unknownprotocol", "nobuffers",  "reassembled", "outfragments", 
  821. "noroute"
  822. };
  823.     char *fmt = "%20s %4dn";
  824.     int ix = 0;
  825. #ifdef VIRTUAL_STACK
  826.     virtualStackIdCheck();
  827.     printf (fmt, "stack number",
  828. myStackNum);                    /* stack number */
  829.     printf (fmt, ipstat_name [ix++],
  830. _ipstat.ips_total);             /* total packets received */
  831.     printf (fmt, ipstat_name [ix++],
  832. _ipstat.ips_badsum);            /* checksum bad */
  833.     printf (fmt, ipstat_name [ix++],
  834. _ipstat.ips_tooshort);          /* packet too short */
  835.     printf (fmt, ipstat_name [ix++],
  836. _ipstat.ips_toosmall);          /* not enough data */
  837.     printf (fmt, ipstat_name [ix++],
  838. _ipstat.ips_badhlen);           /* ip header length < data size */
  839.     printf (fmt, ipstat_name [ix++],
  840. _ipstat.ips_badlen);            /* ip length < ip header length */
  841.     printf (fmt, ipstat_name [ix++],
  842. _ipstat.ips_fragments);         /* fragments received */
  843.     printf (fmt, ipstat_name [ix++],
  844. _ipstat.ips_fragdropped);       /* frags dropped (dups, out of space) */
  845.     printf (fmt, ipstat_name [ix++],
  846. _ipstat.ips_fragtimeout);       /* fragments timed out */
  847.     printf (fmt, ipstat_name [ix++],
  848. _ipstat.ips_forward);           /* packets forwarded */
  849.     printf (fmt, ipstat_name [ix++],
  850. _ipstat.ips_cantforward);       /* packets rcvd for unreachable dest */
  851.     printf (fmt, ipstat_name [ix++],
  852. _ipstat.ips_redirectsent);      /* packets forwarded on same net */
  853.     printf (fmt, ipstat_name [ix++],
  854. _ipstat.ips_noproto);         /* pkts recieved with unknown protos */
  855.     printf (fmt, ipstat_name [ix++],
  856. _ipstat.ips_odropped);         /* pkts dropped for no buffers */
  857.     printf (fmt, ipstat_name [ix++],
  858. _ipstat.ips_reassembled); /* total packets reassembled ok */
  859.     printf (fmt, ipstat_name [ix++],
  860. _ipstat.ips_ofragments);        /* output fragments created */
  861.     printf (fmt, ipstat_name [ix++],
  862. _ipstat.ips_noroute);         /* packets discarded due to no route */
  863.     printf ("n");
  864.     if (zero)
  865. bzero ((char*)&_ipstat, sizeof (_ipstat));
  866. #else
  867.     printf (fmt, ipstat_name [ix++],
  868. ipstat.ips_total);              /* total packets received */
  869.     printf (fmt, ipstat_name [ix++],
  870. ipstat.ips_badsum);             /* checksum bad */
  871.     printf (fmt, ipstat_name [ix++],
  872. ipstat.ips_tooshort);           /* packet too short */
  873.     printf (fmt, ipstat_name [ix++],
  874. ipstat.ips_toosmall);           /* not enough data */
  875.     printf (fmt, ipstat_name [ix++],
  876. ipstat.ips_badhlen);            /* ip header length < data size */
  877.     printf (fmt, ipstat_name [ix++],
  878. ipstat.ips_badlen);             /* ip length < ip header length */
  879.     printf (fmt, ipstat_name [ix++],
  880. ipstat.ips_fragments);          /* fragments received */
  881.     printf (fmt, ipstat_name [ix++],
  882. ipstat.ips_fragdropped);        /* frags dropped (dups, out of space) */
  883.     printf (fmt, ipstat_name [ix++],
  884. ipstat.ips_fragtimeout);        /* fragments timed out */
  885.     printf (fmt, ipstat_name [ix++],
  886. ipstat.ips_forward);            /* packets forwarded */
  887.     printf (fmt, ipstat_name [ix++],
  888. ipstat.ips_cantforward);        /* packets rcvd for unreachable dest */
  889.     printf (fmt, ipstat_name [ix++],
  890. ipstat.ips_redirectsent);       /* packets forwarded on same net */
  891.     printf (fmt, ipstat_name [ix++],
  892. ipstat.ips_noproto);         /* pkts recieved with unknown protos */
  893.     printf (fmt, ipstat_name [ix++],
  894. ipstat.ips_odropped);         /* pkts dropped for no buffers */
  895.     printf (fmt, ipstat_name [ix++],
  896. ipstat.ips_reassembled); /* total packets reassembled ok */
  897.     printf (fmt, ipstat_name [ix++],
  898. ipstat.ips_ofragments);         /* output fragments created */
  899.     printf (fmt, ipstat_name [ix++],
  900. ipstat.ips_noroute);         /* packets discarded due to no route */
  901.     printf ("n");
  902.     if (zero)
  903. bzero ((char*)&ipstat, sizeof (ipstat));
  904. #endif /* VIRTUAL_STACK */
  905.     }
  906. /*******************************************************************************
  907. *
  908. * clPoolShow - show cluster pool information
  909. *
  910. * This function shows cluster pool information.
  911. *
  912. * NOMANUAL
  913. *
  914. * RETURNS: N/A
  915. */
  916. LOCAL void clPoolShow
  917.     (
  918.     NET_POOL_ID pNetPool /* pointer the netPool */
  919.     )
  920.     {
  921.     UCHAR  clType; 
  922.     CL_POOL_ID pClPool;
  923.     printf ("__________________n"); 
  924.     printf ("CLUSTER POOL TABLEn"); 
  925.     printf ("_______________________________________________________________________________n");
  926.     printf ("size     clusters  free      usagen"); 
  927.     printf ("-------------------------------------------------------------------------------n");
  928.     for (clType = pNetPool->clLg2Min; clType <= pNetPool->clLg2Max; clType++)
  929. {
  930. if ((pClPool = netClPoolIdGet (pNetPool, CL_LOG2_TO_CL_SIZE(clType),
  931.                                         TRUE)) != NULL)
  932.     {
  933.     printf ("%-9d", pClPool->clSize); 
  934.     printf ("%-10d", pClPool->clNum); 
  935.     printf ("%-10d", pClPool->clNumFree);
  936.     printf ("%-14dn", pClPool->clUsage); 
  937.     }
  938. }
  939.     printf ("-------------------------------------------------------------------------------n");
  940.     }
  941. /*******************************************************************************
  942. *
  943. * netPoolShow - show pool statistics
  944. *
  945. * This routine displays the distribution of `mBlk's and clusters in a given
  946. * network pool ID.
  947. *
  948. * EXAMPLE:
  949. *
  950. * .CS
  951. * void endPoolShow
  952. *    (
  953. *    char * devName,    /@ The inteface name: "dc", "ln" ...@/
  954. *    int    unit        /@ the unit number: usually 0       @/
  955. *    )
  956. *    {
  957. *    END_OBJ * pEnd;
  958. *    if ((pEnd = endFindByName (devName, unit)) != NULL)
  959. *        netPoolShow (pEnd->pNetPool);
  960. *    else
  961. *        printf ("Could not find device %sn", devName);
  962. *    return;
  963. *    }
  964. * .CE
  965. *
  966. * RETURNS: N/A
  967. */
  968. void netPoolShow
  969.     (
  970.     NET_POOL_ID pNetPool
  971.     )
  972.     {
  973.     static int mt_types [NUM_MBLK_TYPES] =
  974. { MT_FREE,  MT_DATA,  MT_HEADER,  MT_SOCKET,
  975.   MT_PCB, MT_RTABLE,  MT_HTABLE,  MT_ATABLE, 
  976.   MT_SONAME,  MT_ZOMBIE, MT_SOOPTS,  MT_FTABLE,
  977.   MT_RIGHTS,  MT_IFADDR, MT_CONTROL, MT_OOBDATA,
  978.   MT_IPMOPTS, MT_IPMADDR, MT_IFMADDR, MT_MRTABLE
  979. };
  980.     static char mt_names [NUM_MBLK_TYPES][10] =
  981. { "FREE",  "DATA",  "HEADER",  "SOCKET",
  982.   "PCB", "RTABLE",  "HTABLE",  "ATABLE", 
  983.   "SONAME", "ZOMBIE", "SOOPTS", "FTABLE",
  984.   "RIGHTS", "IFADDR", "CONTROL",  "OOBDATA",
  985.   "IPMOPTS", "IPMADDR", "IFMADDR", "MRTABLE"
  986. };
  987.     int totalMbufs = 0;
  988.     FAST int ix;
  989.     if (pNetPool == NULL || pNetPool->pPoolStat == NULL)
  990.         return ; 
  991.     printf ("type        numbern");
  992.     printf ("---------   ------n");
  993.     for (ix = 0; ix < NUM_MBLK_TYPES; ix++)
  994. {
  995. printf ("%-8s:    %3ldn", mt_names [ix],
  996. pNetPool->pPoolStat->mTypes [mt_types [ix]]);
  997. totalMbufs += pNetPool->pPoolStat->m_mtypes [mt_types [ix]];
  998. }
  999.     printf ("%-8s:    %3dn", "TOTAL", totalMbufs);
  1000.     printf ("number of mbufs: %ldn", pNetPool->pPoolStat->mNum);
  1001.     printf ("number of times failed to find space: %ldn",
  1002.             pNetPool->pPoolStat->mDrops);
  1003.     printf ("number of times waited for space: %ldn",
  1004.             pNetPool->pPoolStat->mWait);
  1005.     printf ("number of times drained protocols for space: %ldn",
  1006.     pNetPool->pPoolStat->mDrain);
  1007.     clPoolShow (pNetPool); 
  1008.     }
  1009.     
  1010. /*******************************************************************************
  1011. *
  1012. * netStackDataPoolShow - show network stack data pool statistics
  1013. *
  1014. * This routine displays the distribution of `mBlk's and clusters in a
  1015. * the network data pool.  The network data pool is used only for data
  1016. * transfer through the network stack.
  1017. *
  1018. * The "clusters" column indicates the total number of clusters of that size
  1019. * that have been allocated.  The "free" column indicates the number of
  1020. * available clusters of that size (the total number of clusters minus those
  1021. * clusters that are in use).  The "usage" column indicates the number of times
  1022. * clusters have been allocated (not, as you might expect, the number of
  1023. * clusters currently in use).
  1024. *
  1025. * RETURNS: N/A
  1026. *
  1027. * SEE ALSO: netStackSysPoolShow(), netBufLib
  1028. */
  1029. void netStackDataPoolShow (void)
  1030.     {
  1031. #ifdef VIRTUAL_STACK
  1032.     virtualStackIdCheck();
  1033.     printf("stack number %dn", myStackNum);
  1034. #endif /* VIRTUAL_STACK */
  1035.     netPoolShow (_pNetDpool);
  1036.     }
  1037. /*******************************************************************************
  1038. *
  1039. * netStackSysPoolShow - show network stack system pool statistics
  1040. *
  1041. * This routine displays the distribution of `mBlk's and clusters in a
  1042. * the network system pool.  The network system pool is used only for system
  1043. * structures such as sockets, routes, interface addresses, protocol control
  1044. * blocks, multicast addresses, and multicast route entries.
  1045. *
  1046. * The "clusters" column indicates the total number of clusters of that size
  1047. * that have been allocated.  The "free" column indicates the number of
  1048. * available clusters of that size (the total number of clusters minus those
  1049. * clusters that are in use).  The "usage" column indicates the number of times
  1050. * clusters have been allocated (not, as you might expect, the number of
  1051. * clusters currently in use).
  1052. *
  1053. * RETURNS: N/A
  1054. *
  1055. * SEE ALSO: netStackDataPoolShow(), netBufLib
  1056. */
  1057. void netStackSysPoolShow (void)
  1058.     {
  1059. #ifdef VIRTUAL_STACK
  1060.     virtualStackIdCheck();
  1061.     printf("stack number %dn", myStackNum);
  1062. #endif /* VIRTUAL_STACK */
  1063.     netPoolShow (_pNetSysPool);
  1064.     }
  1065. /*******************************************************************************
  1066. *
  1067. * mbufShow - report mbuf statistics
  1068. *
  1069. * This routine displays the distribution of mbufs in the network.
  1070. *
  1071. * RETURNS: N/A
  1072. */
  1073. void mbufShow (void)
  1074.     {
  1075. #ifdef VIRTUAL_STACK
  1076.     virtualStackIdCheck();
  1077.     printf("stack number %dn", myStackNum);
  1078. #endif /* VIRTUAL_STACK */
  1079.     netPoolShow (_pNetDpool);
  1080.     }
  1081. /******************************************************************************
  1082. *
  1083. * netShowInit - initialize network show routines
  1084. *
  1085. * This routine links the network show facility into the VxWorks system.
  1086. * These routines are included automatically if INCLUDE_NET_SHOW
  1087. * is defined.
  1088. *
  1089. * RETURNS: N/A
  1090. */
  1091. void netShowInit (void)
  1092.     {
  1093.     if (bufferedRtShow)
  1094.         routeBuf = KHEAP_ALLOC (rtMem);
  1095.     }
  1096. /*******************************************************************************
  1097. *
  1098. * arpShow - display entries in the system ARP table
  1099. *
  1100. * This routine displays the current Internet-to-Ethernet address mappings 
  1101. * in the ARP table.
  1102. *
  1103. * EXAMPLE
  1104. * .CS
  1105. *     -> arpShow
  1106. *
  1107. *     LINK LEVEL ARP TABLE
  1108. *     Destination      LL Address        Flags  Refcnt Use        Interface
  1109. *     ---------------------------------------------------------------------
  1110. *     90.0.0.63        08:00:3e:23:79:e7 0x405  0      82         lo0
  1111. *     ---------------------------------------------------------------------
  1112. * .CE
  1113. *
  1114. * Some configuration is required when this routine is to be used remotely over
  1115. * the network eg. through a telnet session or through the host shell using 
  1116. * WDB_COMM_NETWORK. If more than 5 entries are expected in the table the 
  1117. * parameter RT_BUFFERED_DISPLAY should be set to TRUE to prevent a possible
  1118. * deadlock. This requires a buffer whose size can be set with RT_DISPLAY_MEMORY.
  1119. * It will limit the number of entries that can be displayed (each entry requires
  1120. * approx. 70 bytes).
  1121. *
  1122. * RETURNS: N/A
  1123. */
  1124. void arpShow (void)
  1125.     {
  1126.     char *dashLine = "---------------------------------------------------------------------n";
  1127.     char *topLine =  "Destination      LL Address        Flags  Refcnt Use        Interfacen";
  1128. #ifdef VIRTUAL_STACK
  1129.     printf("stack number %dn", myStackNum);
  1130. #endif /* VIRTUAL_STACK */
  1131.     printf ("nLINK LEVEL ARP TABLEn");
  1132.     printf ("%s", topLine);
  1133.     printf ("%s", dashLine);
  1134.     routeTableShow (RT_ARP);  /* show ARP routes */
  1135.     printf ("%s", dashLine);
  1136.     }
  1137. /*******************************************************************************
  1138. *
  1139. * arptabShow - display the known ARP entries
  1140. *
  1141. * This routine displays current Internet-to-Ethernet address mappings in the
  1142. * ARP table.
  1143. *
  1144. * RETURNS: N/A
  1145. *
  1146. * INTERNAL
  1147. * This just calls arpShow.  It is provided for compatablity.
  1148. * Migrating to arpShow to be more compliant with WRS naming.
  1149. */
  1150. void arptabShow (void)
  1151.     {
  1152.     arpShow ();
  1153.     }
  1154. /*****************************************************************************
  1155. *
  1156. * routestatShow - display routing statistics
  1157. *
  1158. * This routine displays routing statistics.
  1159. *
  1160. * RETURNS: N/A
  1161. *
  1162. * INTERNAL
  1163. * When using the Tornado shell, this routine is only available if an
  1164. * "@" sign is prepended to the routine name. Otherwise, it is preempted
  1165. * by a built-in version.
  1166. */
  1167. void routestatShow (void)
  1168.     {
  1169. #ifdef VIRTUAL_STACK
  1170.     virtualStackIdCheck();
  1171.     printf ("routing: (stack number %d)n", myStackNum);
  1172. #else
  1173.     printf ("routing:n");
  1174. #endif /* VIRTUAL_STACK */
  1175.     printf ("t%u bad routing redirect%sn", rtstat.rts_badredirect,
  1176.     plural (rtstat.rts_badredirect));
  1177.     printf ("t%u dynamically created route%sn", rtstat.rts_dynamic,
  1178.     plural (rtstat.rts_dynamic));
  1179.     printf ("t%u new gateway%s due to redirectsn", rtstat.rts_newgateway,
  1180.     plural (rtstat.rts_newgateway));
  1181.     printf ("t%u destination%s found unreachablen", rtstat.rts_unreach,
  1182.     plural (rtstat.rts_unreach));
  1183.     printf ("t%u use%s of a wildcard routen", rtstat.rts_wildcard,
  1184.     plural (rtstat.rts_wildcard));
  1185.     }
  1186. /*******************************************************************************
  1187. *
  1188. * routeShow - display all IP routes (summary information)
  1189. *
  1190. * This routine displays the list of destinations in the routing table
  1191. * along with the next-hop gateway and associated interface for each entry.
  1192. * It separates the routes into network routes and host-specific entries,
  1193. * but does not display the netmask for a route since it was created for
  1194. * class-based routes which used predetermined values for that field.
  1195. *
  1196. * The IP forwarding process will only use the first route entry to a 
  1197. * destination. When multiple routes exist to the same destination with
  1198. * the same netmask (which is not shown), the first route entry uses the
  1199. * lowest administrative weight. The remaining entries (listed as additional
  1200. * routes) use the same destination address. One of those entries will
  1201. * replace the primary route if it is deleted.
  1202. *
  1203. * EXAMPLE
  1204. * .CS
  1205. *     -> routeShow
  1206. *
  1207. *     ROUTE NET TABLE
  1208. *     Destination      Gateway          Flags  Refcnt Use        Interface
  1209. *     --------------------------------------------------------------------
  1210. *     90.0.0.0         90.0.0.63        0x1    1      142        enp0
  1211. *     10.0.0.0         90.0.0.70        0x1    1      142        enp0
  1212. *       Additional routes to 10.0.0.0:
  1213. *                      80.0.0.70        0x1    0      120        enp1
  1214. *     --------------------------------------------------------------------
  1215. *
  1216. *     ROUTE HOST TABLE
  1217. *     Destination      Gateway          Flags  Refcnt Use        Interface
  1218. *     --------------------------------------------------------------------
  1219. *     127.0.0.1        127.0.0.1        0x101  0      82         lo0
  1220. *     --------------------------------------------------------------------
  1221. * .CE
  1222. *
  1223. * The flags field represents a decimal value of the flags specified
  1224. * for a given route.  The following is a list of currently available
  1225. * flag values:
  1226. *
  1227. * .TS
  1228. * tab(|);
  1229. * l l .
  1230. *     0x1     | - route is usable (that is, "up")
  1231. *     0x2     | - destination is a gateway
  1232. *     0x4     | - host specific routing entry
  1233. *     0x8     | - host or net unreachable
  1234. *     0x10    | - created dynamically (by redirect)
  1235. *     0x20    | - modified dynamically (by redirect)
  1236. *     0x40    | - message confirmed
  1237. *     0x80    | - subnet mask present
  1238. *     0x100   | - generate new routes on use
  1239. *     0x200   | - external daemon resolves name
  1240. *     0x400   | - generated by ARP
  1241. *     0x800   | - manually added (static)
  1242. *     0x1000  | - just discard packets (during updates)
  1243. *     0x2000  | - modified by management protocol
  1244. *     0x4000  | - protocol specific routing flag
  1245. *     0x8000  | - protocol specific routing flag
  1246. * .TE
  1247. *
  1248. * In the above display example, the entry in the ROUTE NET TABLE has a 
  1249. * flag value of 1, which indicates that this route is "up" and usable and 
  1250. * network specific (the 0x4 bit is turned off).  The entry in the ROUTE 
  1251. * HOST TABLE has a flag value of 5 (0x1 OR'ed with 0x4), which indicates 
  1252. * that this route is "up" and usable and host-specific.
  1253. *
  1254. * Some configuration is required when this routine is to be used remotely over
  1255. * the network eg. through a telnet session or through the host shell using 
  1256. * WDB_COMM_NETWORK. If more than 5 routes are expected in the table the 
  1257. * parameter RT_BUFFERED_DISPLAY should be set to TRUE to prevent a possible
  1258. * deadlock. This requires a buffer whose size can be set with RT_DISPLAY_MEMORY.
  1259. * It will limit the number of routes that can be displayed (each route requires
  1260. * approx. 70 bytes).
  1261. *
  1262. * RETURNS: N/A
  1263. */
  1264. void routeShow (void)
  1265.     {
  1266.     char *dashLine = "--------------------------------------------------------------------n";
  1267.     char *topLine =  "Destination      Gateway          Flags  Refcnt Use        Interfacen";
  1268. #ifdef VIRTUAL_STACK
  1269.     virtualStackIdCheck();
  1270.     printf("stack number %dn", myStackNum);
  1271. #endif /* VIRTUAL_STACK */
  1272.     printf ("nROUTE NET TABLEn");
  1273.     printf ("%s", topLine);
  1274.     printf ("%s", dashLine);
  1275.     routeTableShow (RT_NET); /* show network routes */
  1276.     printf ("%s", dashLine);
  1277.     printf ("nROUTE HOST TABLEn");
  1278.     printf ("%s", topLine);
  1279.     printf ("%s", dashLine);
  1280.     routeTableShow (RT_HST); /* show host routes */
  1281.     printf ("%s", dashLine);
  1282.     }
  1283. /****************************************************************************
  1284. *
  1285. * routeNodeShow - print all route entries attached to a node in the tree
  1286. *
  1287. * This routine displays every route entry with a particular destination
  1288. * and netmask. Only the initial entry attached to the tree is visible to
  1289. * the IP forwarding process. The remaining entries are duplicates.
  1290. *
  1291. * The return value of 0 continues the tree traversal to access the next
  1292. * element.
  1293. *
  1294. * RETURNS: OK on success and ERROR on failure
  1295. */
  1296. LOCAL int routeNodeShow
  1297.     (
  1298.     struct radix_node * pRoute,
  1299.     void* w
  1300.     )
  1301.     {
  1302.     ROUTE_ENTRY * pHead;    /* Start of route list for a protocol. */
  1303.     ROUTE_ENTRY * pNext;
  1304.     BOOL printFlag;    /* Available route actually displayed? */
  1305.     struct sockaddr * pAddress;
  1306.     char   addressString [INET_ADDR_LEN];
  1307.     int    len;
  1308.     pHead = (ROUTE_ENTRY *)pRoute;
  1309.     /* Print the route entry which is visible to IP. */
  1310.     printFlag = routeEntryPrint ( (struct rtentry *)pHead, w, TRUE);
  1311.     if (printFlag == FALSE)
  1312.         {
  1313.         /*
  1314.          * The primary route entry did not match the requested type. Ignore
  1315.          * any duplicate routes, which also will not meet the criteria.
  1316.          */
  1317.         return (OK);
  1318.         }
  1319.     /* Get the next entry to display, if any. */
  1320.     pNext = pHead->sameNode.pFrwd;
  1321.     if (pNext == NULL)
  1322.         {
  1323.         pHead = pNext = pHead->diffNode.pFrwd;
  1324.         }
  1325.     if (pNext != NULL)
  1326.         {
  1327.         /* Additional entries exist. Print the appropriate subheading. */
  1328.         pAddress = rt_key ( (struct rtentry *)pRoute);
  1329.         inet_ntoa_b ( ((struct sockaddr_in *)pAddress)->sin_addr,
  1330.                      addressString);
  1331. if (!bufferedRtShow)
  1332.             printf ("  Additional routes to %s:n", addressString);
  1333. else
  1334.     {
  1335.     len = sprintf (routeBuf + bufIndex, "  Additional routes to %s:n", 
  1336.    addressString);
  1337.     bufIndex += len;
  1338.     }
  1339.         }
  1340.     /* Print any duplicate routes for the visible node. */
  1341.     while (pHead)
  1342.         {
  1343.         while (pNext)
  1344.             {
  1345.     /* check for buffer space */
  1346.             if (bufferedRtShow && (rtMem - bufIndex < RT_ENTRY_LEN))
  1347.         return (ERROR);
  1348.             routeEntryPrint ( (struct rtentry *)pNext, w, FALSE);
  1349.             pNext = pNext->sameNode.pFrwd;
  1350.             }
  1351.         pHead = pNext = pHead->diffNode.pFrwd;
  1352.         }
  1353.     /* check for buffer space */
  1354.     if (bufferedRtShow && (rtMem - bufIndex < RT_ENTRY_LEN))
  1355. return (ERROR);
  1356.     return OK;
  1357.     }
  1358. /*******************************************************************************
  1359. *
  1360. * routeEntryPrint - print one route entry
  1361. *
  1362. * This function executes (when walking the route tree) for each route entry,
  1363. * including duplicate routes not visible to the IP forwarding process.
  1364. * The public routines set the <type> argument to RT_NET, RT_HST, or RT_ARP
  1365. * to select categories of route information from the routing table. The
  1366. * RT_NET value only displays IP routes which can reach multiple hosts.
  1367. * The RT_HST value only displays IP routes which can reach a specific host,
  1368. * and the RT_ARP value displays host-specific routes which contain link-level
  1369. * information in the gateway field.
  1370. *
  1371. * Older show routines only select one of the available route types. The
  1372. * newer alternative sets both RT_NET and RT_HST to display all IP routes.
  1373. * That routine supports classless routing, so it includes the netmask value
  1374. * in the output. It also prints the new type-of-service field and the
  1375. * protocol number which indicates the route's creator.
  1376. *
  1377. * RETURNS: TRUE if entry printed, or FALSE for mismatched type
  1378. */
  1379. LOCAL BOOL routeEntryPrint
  1380.     (
  1381.     struct rtentry * pRt, /* pointer to the route entry */
  1382.     void * pRtType,  /* pointer to the route type */
  1383.     BOOL  ipRouteFlag  /* visible to IP forwarding? */
  1384.     )
  1385.     {
  1386.     FAST struct sockaddr * destAddr = NULL;
  1387.     FAST struct sockaddr * gateAddr;
  1388.     FAST UCHAR *  pChr;
  1389.     FAST int rtType; 
  1390.     char  aStr [INET_ADDR_LEN];
  1391.     ULONG  mask;
  1392.     char                        buf [RT_ENTRY_LEN];
  1393.     int                         index = 0;
  1394.     int                         len;
  1395.     rtType = *((int *)pRtType); 
  1396.     
  1397.     /*
  1398.      * Ignore host routes (including ARP entries) if only
  1399.      * network routes should be printed.
  1400.      */
  1401.     if ( (rtType == RT_NET) && (pRt->rt_flags & RTF_HOST))
  1402. return (FALSE); 
  1403.     destAddr = rt_key(pRt); /* get the destination address */
  1404.     gateAddr = pRt->rt_gateway; /* get the gateway address */
  1405.     /* if what we want is a host route and not an arp entry then return */
  1406.     if ((rtType & RT_HST) && (gateAddr->sa_family == AF_LINK) &&
  1407.                               (pRt->rt_flags & RTF_HOST))
  1408. return (FALSE);
  1409.     /* If only host routes are desired, skip any network route. */
  1410.     if ((rtType == RT_HST) && (!(pRt->rt_flags & RTF_HOST)))
  1411. return (FALSE); 
  1412.     /* if what we want is an arp entry and if it is not then return */
  1413.     if ((rtType & RT_ARP) && ((gateAddr->sa_family != AF_LINK) ||
  1414.       (((struct sockaddr_dl *)gateAddr)->sdl_alen == 0)
  1415.       ))
  1416. return (FALSE); 
  1417.     /* if what we want is a network route and the gateway family is AF_LINK */
  1418.     if ((rtType & RT_NET) && (gateAddr->sa_family == AF_LINK))
  1419. gateAddr = pRt->rt_ifa->ifa_addr; 
  1420.     /*
  1421.      * Print destination address for visible entries and whitespace
  1422.      * for duplicate routes.
  1423.      */
  1424.     if (ipRouteFlag)
  1425.         {
  1426.         inet_ntoa_b (((struct sockaddr_in *)destAddr)->sin_addr, aStr);
  1427. if (!bufferedRtShow)
  1428.             printf ("%-16s ", (destAddr->sa_family == AF_INET) ?
  1429.               aStr : "not AF_INET");
  1430. else
  1431.     {
  1432.     len = sprintf (buf, "%-16s ", (destAddr->sa_family == AF_INET) ? 
  1433.    aStr : "not AF_INET");
  1434.     index += len;
  1435.     }
  1436.         }
  1437.     else
  1438.         {
  1439. if (!bufferedRtShow)
  1440.             printf ("                 ");
  1441. else
  1442.     {
  1443.     len = sprintf (buf, "                 ");
  1444.     index += len;
  1445.     }
  1446.         }
  1447.     /*
  1448.      * When displaying all IP routes, print the netmask for the visible
  1449.      * route entry. Show the new TOS values and the value of the routing
  1450.      * protocol which created the entry for the primary routes and any
  1451.      * duplicates. Only one of these type flags is set when using the
  1452.      * older class-based show routines.
  1453.      */
  1454.     if ( (rtType & RT_NET) && (rtType & RT_HST))
  1455.         {
  1456.         /* Print the (common) netmask value with the primary route entry. */
  1457.         if (ipRouteFlag)
  1458.             {
  1459.             if (rt_mask (pRt) == NULL)
  1460.                 {
  1461.                 mask = 0;
  1462.                 }
  1463.             else
  1464.                 {
  1465.                 mask = ((struct sockaddr_in *) rt_mask (pRt))->sin_addr.s_addr;
  1466.                 mask = ntohl (mask);
  1467.                 }
  1468.         
  1469.     if (!bufferedRtShow)
  1470.                 printf ("%#-10lx ", mask);
  1471.     else
  1472. {
  1473. len = sprintf (buf + index, "%#-10lx ", mask);
  1474. index += len;
  1475. }
  1476.             }
  1477.         else
  1478.             {
  1479.             /* Print whitespace when displaying duplicate routes. */
  1480.     if (!bufferedRtShow)
  1481.                 printf ("           ");    /* 11 spaces: empty netmask field */
  1482.     else
  1483. {
  1484. len = sprintf (buf + index, "           ");
  1485. index += len;
  1486. }
  1487.             }
  1488. if (!bufferedRtShow)
  1489.     {
  1490.             /* print routing protocol value */
  1491.             printf ("%-4d  ", RT_PROTO_GET (destAddr));
  1492.             /* print type of service */
  1493.             printf ("%#-4x ", TOS_GET (destAddr));
  1494.             }
  1495.         else
  1496.     {
  1497.     len = sprintf (buf + index, "%-4d  %#-4x ", RT_PROTO_GET (destAddr),
  1498.                    TOS_GET (destAddr));
  1499.     index += len;
  1500.     }
  1501.         }
  1502.     /* print the gateway address which internet or linklevel */
  1503.     if (gateAddr->sa_family == AF_LINK)
  1504. {
  1505. pChr = (UCHAR *)(LLADDR((struct sockaddr_dl *)gateAddr));
  1506. if (!bufferedRtShow)
  1507.     printf ("%02x:%02x:%02x:%02x:%02x:%02x ",
  1508.     pChr[0], pChr[1], pChr[2], pChr[3], pChr[4], pChr[5]); 
  1509. else
  1510.     {
  1511.     len = sprintf (buf + index, "%02x:%02x:%02x:%02x:%02x:%02x ",
  1512.    pChr[0], pChr[1], pChr[2], pChr[3], pChr[4], pChr[5]);
  1513.             index += len;
  1514.     }
  1515. }
  1516.     else
  1517. {
  1518. inet_ntoa_b (((struct sockaddr_in *)gateAddr)->sin_addr, aStr);
  1519. if (!bufferedRtShow)
  1520.     printf ("%-16s ", (gateAddr->sa_family == AF_INET) ?
  1521.     aStr :"not AF_INET"); 
  1522. else
  1523.     {
  1524.     len = sprintf (buf + index, "%-16s ", 
  1525.    (gateAddr->sa_family == AF_INET) ? aStr :
  1526.    "not AF_INET");
  1527.     index += len;
  1528.     }
  1529. }
  1530.     if (!bufferedRtShow)
  1531. {
  1532.         printf ("%#-6hx ", pRt->rt_flags);
  1533.         printf ("%-5d  ", pRt->rt_refcnt);
  1534.         printf ("%-10ld ", pRt->rt_use);
  1535.         printf ("%s%dn",  pRt->rt_ifp->if_name, pRt->rt_ifp->if_unit);
  1536. }
  1537.     else
  1538. {
  1539. len = sprintf (buf + index, "%#-6hx %-5d  %-10ld %s%dn", pRt->rt_flags,
  1540.        pRt->rt_refcnt, pRt->rt_use, pRt->rt_ifp->if_name,
  1541.        pRt->rt_ifp->if_unit);
  1542.         index += len;
  1543. bcopy (buf, (char *) (routeBuf + bufIndex), index);
  1544. bufIndex += index;
  1545. }
  1546.     return (TRUE); 
  1547.     }
  1548. /*******************************************************************************
  1549. *
  1550. * routeTableShow - print a subset of entries in the routing table
  1551. *
  1552. * This routine uses internal interfaces to walk the internal tree which
  1553. * contains all route information and display particular types of route
  1554. * entries. It provides a common entry point for three individual routines
  1555. * which print the ARP information, route entries assuming class-based
  1556. * netmasks (further separated into network and host categories), and routes
  1557. * which can use arbitrary netmasks.
  1558. *
  1559. * RETURNS: N/A
  1560. */
  1561. LOCAL void routeTableShow
  1562.     (
  1563.     int  rtType /* route type network, host or arp */
  1564.     )
  1565.     {
  1566.     int                         s;
  1567.     struct radix_node_head * rnh;
  1568.     int type;
  1569.     type = rtType;
  1570.     rnh = rt_tables[AF_INET];
  1571.     if (rnh)
  1572.         {
  1573. if (bufferedRtShow)
  1574.     {
  1575.     if (routeBuf == NULL)
  1576. return;
  1577.     bufIndex = 0;
  1578.             }
  1579. s = splnet ();
  1580. rn_walktree(rnh, routeNodeShow, &type);
  1581.         splx (s);
  1582. if (bufferedRtShow)
  1583.     {
  1584.     routeBuf [bufIndex] = '';
  1585.     printf ("%s", routeBuf);
  1586.     }
  1587.         }
  1588.     return;
  1589.     }
  1590. /*******************************************************************************
  1591. *
  1592. * hostShow - display the host table
  1593. *
  1594. * This routine prints a list of remote hosts, along with their Internet
  1595. * addresses and aliases.
  1596. *
  1597. * RETURNS: N/A
  1598. *
  1599. * SEE ALSO: hostAdd()
  1600. *
  1601. * INTERNAL
  1602. * When using the Tornado shell, this routine is only available if an
  1603. * "@" sign is prepended to the routine name. Otherwise, it is preempted
  1604. * by a built-in version.
  1605. *
  1606. * This just calls arpShow.  It is provided for compatablity.
  1607. * Migrating to arpShow to be more compliant with WRS naming.
  1608. */
  1609. void hostShow (void)
  1610.     {
  1611.     char inetBuf [INET_ADDR_LEN];
  1612.     FAST HOSTNAME *pHostName;
  1613.     FAST HOSTENTRY *pHostEntry;
  1614. #ifdef VIRTUAL_STACK
  1615.     virtualStackIdCheck();
  1616.     printf("stack number %dn", myStackNum);
  1617. #endif /* VIRTUAL_STACK */
  1618.     printf ("hostname         inet address       aliasesn");
  1619.     printf ("--------         ------------       -------n");
  1620.     semTake (hostListSem, WAIT_FOREVER);
  1621.     for (pHostEntry = (HOSTENTRY *)lstFirst (&hostList);
  1622.  pHostEntry != NULL;
  1623.  pHostEntry = (HOSTENTRY *)lstNext (&pHostEntry->node))
  1624. {
  1625. inet_ntoa_b (pHostEntry->netAddr, inetBuf);
  1626. printf ("%-16s %-18s", pHostEntry->hostName.name, inetBuf);
  1627. for (pHostName = pHostEntry->hostName.link;
  1628.      pHostName != NULL;
  1629.      pHostName = pHostName->link)
  1630.     {
  1631.     printf ("%s ", pHostName->name);
  1632.     }
  1633. printf ("n");
  1634. }
  1635.     semGive (hostListSem);
  1636.     }
  1637. /*******************************************************************************
  1638. *
  1639. * mRouteShow - display all IP routes (verbose information)
  1640. *
  1641. * This routine displays the list of destinations in the routing table
  1642. * along with the next-hop gateway and associated interface. It also
  1643. * displays the netmask for a route (to handle classless routes which
  1644. * use arbitrary values for that field) and the value which indicates
  1645. * the route's creator, as well as any type-of-service information.
  1646. *
  1647. * When multiple routes exist to the same destination with the same netmask,
  1648. * the IP forwarding process only uses the first route entry with the lowest
  1649. * administrative weight. The remaining entries (listed as additional routes)
  1650. * use the same address and netmask. One of those entries will replace the
  1651. * primary route if it is deleted.
  1652. *
  1653. * Some configuration is required when this routine is to be used remotely over
  1654. * the network eg. through a telnet session or through the host shell using 
  1655. * WDB_COMM_NETWORK. If more than 5 routes are expected in the table the 
  1656. * parameter RT_BUFFERED_DISPLAY should be set to TRUE to prevent a possible
  1657. * deadlock. This requires a buffer whose size can be set with RT_DISPLAY_MEMORY.
  1658. * It will limit the number of routes that can be displayed (each route requires
  1659. * approx. 90 bytes).
  1660. *
  1661. * RETURNS: N/A
  1662. */
  1663. void mRouteShow (void)
  1664.     {
  1665.     int type = RT_HST | RT_NET;    /* print all IP route entries */
  1666. #ifdef VIRTUAL_STACK
  1667.     virtualStackIdCheck();
  1668.     printf("stack number %dn", myStackNum);
  1669. #endif /* VIRTUAL_STACK */
  1670.     printf ("%-16s %-10s %-6s%-4s", "Destination", "Mask", "Proto", "TOS");
  1671.     printf ("%-16s %-6s %-7s%-11s", "Gateway", "Flags", "RefCnt", "Use");
  1672.     printf ("%sn", "Interface");
  1673.     printf ("-------------------------------------------------------------");
  1674.     printf ("----------------------------n");
  1675.     routeTableShow (type);
  1676.     }