usrNetwork.c
上传用户:yuanda199
上传日期:2022-06-26
资源大小:412k
文件大小:83k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* usrNetwork.c - network initialization */
  2. /* Copyright 1992 - 2001 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 06a,20dec01,ros  fix for spr 72294
  7. 05z,04jun01,rae  move init for MIB2_IF, to make boot interface visible
  8. 05y,07feb01,spm  added merge record, corrected changes, and fixed modification
  9.                  history for 30jan01 update from version 05j of tor2_0_x branch
  10.                  (base 04z); general overhaul of telnet server (SPR #28675)
  11. 05x,30jan01,ijm  merged SPR# 28602 fixes for proxy ARP (versions 05b and 05i
  12.                  of tor2_0_x branch - SPR #7576, #8993, #28601, and #28632)
  13. 05w,16nov00,spm  enabled new DHCP lease for runtime device setup (SPR #20438)
  14. 05v,14nov00,rae  removed unused argument from sockLibAdd()
  15. 05u,27oct00,spm  fixed DHCP startup update and mod history entry
  16. 05t,27oct00,spm  code cleanup; removed incorrect proxy server requirement
  17. 05s,23oct00,niq  updated DHCP startup for latest version (from tor3_x branch)
  18. 05r,06oct00,spm  fixed device search with non-zero unit numbers (SPR #26154)
  19. 05q,03may99,pul  max_linkhdr to be set in usrNetInit 
  20. 05p,29apr99,pul  Upgraded NPT phase3 code to tor2.0.0
  21. 05o,02apr99,pul  "To make max_linkhdr user configurable"
  22. 05n,26mar99,pul  remove muxMCastMapAdd
  23. 05m,19mar99,dat  SPR 25877 removed old driver support
  24. 05l,18mar99,sj   removed INCLUDE_NPT check
  25. 05k,16mar99,dat  SPR 25790, boot from END or netif device
  26. 05j,09mar99,ham  rejected the 05e modification.
  27. 05i,08mar99,ham  added boot device "pcmcia" entry, SPR#24714.
  28. 05h,05mar99,sj   eliminated call to muxTkLibInit. Must set muxMaxBinds
  29. 05g,26feb99,dat  changed netIf to usrNetIfTbl and made it global. Added FEI
  30.  support (23818)
  31. 05f,02feb99,sgv  added bitflag parameter to sockLibAdd
  32. 05e,20jan99,scb  usrBpInit() modified to use "sm=" before SM_ANCHOR_ADRS (23035)
  33. 05d,03Nov98,pul  moved muxBindBase to muxTkLib.c 
  34. 05c,30nov98,c_s  20x -> 200 merge
  35. 05b,30nov98,gnn  corrected mod history and merged TFFS support
  36. 05a,07oct98,sj   added Network Protocol Toolkit(NPT) support 
  37. 04z,11sep98,spm  corrected default value of RIP_GARBAGE_TIME (SPR #21908)
  38. 04y,25aug98,n_s  fixed interface config when using bootline other field and END.
  39.                  spr #22217.
  40. 04x,04may98,cym  added Windows ULIP code.
  41. 04w,29apr98,dbt  removed RDB references (no longer supported).
  42. 04v,25sep97,jmb  Add a default route for HPSIM SLIP connection.
  43. 04u,10jul97,jmb  Make NFS client work on HPSIM by setting nfsMaxMsgLen
  44.  to a number less than the MTU - 127.
  45. 04t,27jan97,jmb  Add SLIP patches for HPSIM (from Mark Mason).
  46. 04s,18jul98,spm  merged support for TFFS boot device into release view
  47. 04r,05dec97,spm  added DHCP code review modifications
  48. 04q,30nov97,vin  added network stack system pool
  49. 04p,29oct97,spm  delayed DHCP client startup to prevent failure for fast 
  50.                  processors (SPR #9641)
  51. 04o,06oct97,spm  moved DHCP server default parameters to dhcpsLib.h; added
  52.                  stub routine to support delayed startup of DHCP relay agent
  53. 04n,06oct97,spm  removed unused constant INCLUDE_BSD; added optional binary 
  54.                  compatibility for BSD 4.3 applications
  55. 04m,03oct97,gnn  removed references to endDriver global
  56. 04l,25sep97,gnn  SENS beta feedback fixes
  57. 04k,19sep97,vin  added cluster blk configuration to network configuration.
  58.  changed MBLK_CONFIG to M_CL_CONFIG.
  59. 04j,26aug97,spm  major overhaul of DHCP: reorganized code and changed user 
  60.                  interface to support multple leases at runtime; improved
  61.                  handling of address information by client; altered all DHCP 
  62.                  components to allow selection of UDP ports
  63. 04i,14aug97,vin  changed MBUF_CONFIG to MBLK_CONFIG
  64. 04h,12aug97,gnn  changes necessitated by MUX/END update.
  65. 04g,11aug97,vin  changed mbufConfig and clDescTbl.
  66. 04d,06aug97,cdp  fixed signed/unsigned comparison in checkInetAddrField.
  67. 04f,15jul97,spm  added support for SNTP client and server
  68. 04e,03jul97,vin  made routing sockets scalable.
  69. 04d,03jul97,sgv  fix for spr #8602 changed ftpdInit to check for 
  70.  authentication when INCLUDE_FTPD_SECURITY is defined
  71. 04c,02jun97,spm  allowed DHCP server to start without lease storage hook
  72. 04b,20may97,gnn  fixed SPR 8627 so that multiple gn devices are supported.
  73. 04a,09may97,spm  increased stack size for DHCP server task
  74. 03z,30apr97,spm  made hop limit for relay agent configurable; fixed DHCP bugs
  75. 03y,25apr97,gnn  changed INCLUDE_GN to INCLUDE_END
  76. 03x,18apr97,spm  eliminated DHCP-related compiler warnings when building BSP
  77. 03w,17apr97,gnn  changed network booting to work with END configNet files.
  78.                  fixed two bugs that ANVL found in RIP timers.
  79. 03v,17apr97,vin  added ipFilterLibInit() in usrNetProtoInit().
  80. 03u,14apr97,vin  added mCastRouteLibInit(), igmpShowInit, icmpShowInit,
  81.  tcpShowInit, udpShowInit for scalability.
  82. 03t,10apr97,jag  added DNS resolver support
  83. 03s,07apr97,gnn  fixed a merge bug with Stephen's changes.
  84. 03r,07apr97,gnn  added new booting system for END network device.
  85. 03q,07apr97,spm  added DHCP server and relay agent support, fixed unit number 
  86.                  support, removed redundant code for DHCP client
  87. 03p,12mar97,gnn  added new timer variables for ripLibInit
  88. 03o,24feb97,gnn  added RIP_MULTICAST for use by RIP
  89.                  changed routedLibInit to ripLibInit
  90. 03n,14feb97,rjc  OSPF_INCLUDE changed to INCLUDE_OSPF
  91. 03m,14feb97,rjc  added ospf init calls
  92. 03l,07feb97,rjc  deleted routePref, now in routeLib.c
  93. 03k,31jan97,vin  added macros for config parameters.
  94. 03j,31jan97,spm  added dhcpShowInit() to link DHCP client show routines.
  95. 03i,29jan97,gnn  moved the muxDevLoad call to later in the sequence.
  96. 03h,21jan97,vin  added scalability of network stack, 
  97.  moved _func_remCurId[SG]et from netLib.c for scalability.
  98. 03g,21jan97,gnn  Added another argument to muxDevLoad().
  99. 03d,13jan97,jpd  Added if_lnEbsa driver entry.
  100. 03c,07jan97,jpd  Added if_oli driver entry.
  101. 03f,20dec96,vin  removed warnings muxDevLoad().
  102. 03e,18dec96,spm  fixed small bug in DHCP client code
  103. 03d,03dec96,spm  removed bootLeaseExtract test when DHCP client not included
  104.                  to reduce code size
  105. 03c,27nov96,spm  added support for DHCP client.
  106. 03b,26nov96,gnn  added INCLUDE_RIP directive for routed/rip.
  107. 03a,25nov96,vin  added new cluster configuration.
  108. 02z,15nov96,vin  fixed problems with passive and silent options for PPP.
  109. 02y,23oct96,gnn  added END_DEV_NAME define for gnattach routine.
  110. 02x,22oct96,gnn  added END_BUFF_LOAN define so upper layer can request buffer
  111.                  loaning.
  112. 03d,10dec97,spm  added configurable password authentication for FTP server
  113.                  from SENS branch (SPR #8602)
  114. 03c,11apr97,dvs  added routes for SIMSPARCSOLARIS when using ppp instead of ULIP
  115. 03b,11dec96,vin  SPR7604 for PPP silent mode and passive mode.
  116. 03a,10dec96,yp   added route for ULIP driver so we send packets for our selves
  117.  to localhost since not all hosts return whats ours
  118. 02z,18nov96,dbt  ANSIfied function headers (SPR #7427.)
  119. 02y,11nov96,spm  added bzero() call to checkInetAddrField(). (SPR #6326).
  120. 02x,01nov96,hdn  added support for PCMCIA.  moved NETIF to sysLib.h.
  121. 02w,13aug96,dat  added NETIF_USR_DECL and NETIF_USR_ENTRIES, SPR 6970
  122. 02v,23jul96,hdn  added support for ATA driver.
  123. 02u,21jun96,jmb  long modhist -- deleted entries prior to 1994. (SPR #6528)
  124. 02t,13jun96,hdn  added INCLUDE_ESMC for SMC91c9x Ethernet driver.
  125. 02v,12aug96,rjc  snmp init funcs modified to reflect removal of memory partition                 options. 
  126. 02u,07aug96,rjc  added resolver changes.
  127. 02t,29may96,dat  fixed SPR 4392 re: network services after scsi (disk) boot
  128. 02s,04apr96,rjc  Merged in changes for snmp agent for vxWorks53
  129. 02r,07mar96,gnn  added SLIP_MTU so that we could configure the MTU. 
  130.  (SPR #4652)
  131. 02q,06mar96,sgv  Added error checks in usrStrmInit for tliInit(), dlpiInit()
  132.  autopushInit() and strmDebugInit.
  133. 02p,11nov95,vin  baudrate in bootstring, added pppHookLib.
  134. 02n,06sep95,jag  deleted call to fattachInit (), and changed iosStrmInit to
  135.  strmInit ().
  136. 02n,01aug95,dzb  changed STREAMS options to go through iosStrmInit ().
  137.                  added protocol initialization hook routine.
  138.    PPP initialization failure message (SPR #4505).
  139. 02m,28jul95,jag  changed INCLUDE_STREAMS_LOG to INCLUDE_STREAMS_STRACE and
  140.  INCLUDE_STREAMS_STRERR. Added the routines to support these
  141.  options.
  142. 02l,25jul95,dzb  tweaked socket library initialization.
  143. 02k,25jul95,dzb  added socket library init for BSD vs. STREAMS.
  144. 02j,25jul95,jag  Added check for the return value of iosStrmInit.
  145. 02i,18jul95,dzb  wait for PPP interface to come up in usrPPPInit().
  146. 02h,17jul95,dzb  fixed ordering of boot params search.
  147. 02g,26jun95,dzb  removed PPP_S_USEHOSTNAME option.
  148. 02f,22jun95,sgv  Added streamsInit() to Initialise STREAMS
  149. 02e,21jun95,dzb  Added INCLUDE_PPP_CRYPT for unbundled crypt() support.
  150. 02d,20jun95,dzb  changed PPP options structure to set values from macros.
  151. 02c,09jan95,dzb  Added PPP support.
  152. 02c,29jun95,caf  added nicEvb driver entry.
  153. 02b,28mar95,kkk  changed smNetInit() parameters to use macros from 
  154.  configAll.h (SPR #4130)
  155. 02z,27mar95,jag  removed dependency of INCLUDE_NFS_SERVER from INCLUDE_NFS
  156. 01z,19mar95,dvs  removed tron references - no longer supported.
  157. 01y,30jan95,hdn  included nfsdLib.h if INCLUDE_NFS_SERVER is defined.
  158.  added 6th argument to nfsdInit ().
  159. 02b,31mar95,caf  added dc driver entry.
  160. 02a,02jan95,kat  added ilac driver entry.
  161. 01x,09dec94,jag  Added INCLUDE_MIB2_AT
  162. 01w,13nov94,dzb  fixed placement of INCLUDE_PING.
  163. 01v,17aug94,dzb  fixed setting the gateway for a slip connection (SPR #2353).
  164.  added qu netif device.  added zbuf socket interface init.
  165.  added ping init.  added CSLIP support.  added tcpTrace init.
  166. 01u,11nov94,jag  divided SNMP and MIB-II support.
  167. 01t,09feb94,hdn  added support for if_elt 3COM Etherlink III driver.
  168.  added support for if_ene Eagle NE2000 driver.
  169. */
  170. /*
  171. DESCRIPTION
  172. This file is used to configure and initialize the VxWorks networking support.
  173. This file is included by usrConfig.c.
  174. SEE ALSO: usrExtra.c
  175. NOMANUAL
  176. */
  177. #ifndef  __INCusrNetworkc
  178. #define  __INCusrNetworkc
  179. #include "zbufSockLib.h"
  180. #include "pingLib.h"
  181. #include "ipProto.h"
  182. #ifdef INCLUDE_SNTPS
  183. #include "sntpsLib.h"
  184. /* Include this declaration if hook is defined. */
  185. /* IMPORT STATUS SNTPS_TIME_HOOK (int, void *); */
  186. #endif
  187. #define DEF_MAX_LINK_HDR 16 
  188. #ifndef USR_MAX_LINK_HDR
  189. #define USR_MAX_LINK_HDR DEF_MAX_LINK_HDR
  190. #endif
  191. IMPORT int max_linkhdr;
  192. #ifdef INCLUDE_SNTPC
  193. #include "sntpcLib.h"
  194. #endif
  195. #ifdef INCLUDE_SNMPD
  196. #include "snmp/snmpdInit.h"
  197. #endif
  198. #include "m2Lib.h"
  199. #include "private/funcBindP.h"
  200. #ifdef INCLUDE_OSPF
  201. #include "ospf/ospfLib.h"
  202. #endif /* INCLUDE_OSPF */
  203. #ifdef INCLUDE_NFS_SERVER
  204. #include "nfsdLib.h"
  205. #endif
  206. #ifdef INCLUDE_DNS_RESOLVER
  207. #include "resolvLib.h"
  208. #endif
  209. #ifdef INCLUDE_PROXY_CLIENT
  210. #include "proxyLib.h"
  211. #endif  /* INCLUDE_PROXY_CLIENT */
  212. #if (CPU==SIMHPPA)
  213. extern int nfsMaxMsgLen;
  214. #endif
  215. #ifdef INCLUDE_FTPD_SECURITY
  216. #include "loginLib.h"
  217. #endif
  218. #ifdef INCLUDE_DHCPS
  219. #include "dhcp/dhcp.h"
  220. #include "dhcp/common.h"
  221. #include "dhcpsLib.h"
  222. IMPORT long dhcps_dflt_lease;
  223. IMPORT long dhcps_max_lease;
  224. IMPORT STATUS dhcpsLeaseHookAdd (FUNCPTR);
  225. IMPORT STATUS dhcpsAddressHookAdd (FUNCPTR);
  226. /* Include these declarations if hooks are defined. */
  227. /* IMPORT STATUS DHCPS_LEASE_HOOK (int, char *, int); */
  228. /* IMPORT STATUS DHCPS_ADDRESS_HOOK (int, char *, int); */
  229. #endif
  230. #ifdef INCLUDE_DHCPC
  231. #include "dhcp/dhcpcInit.h"
  232. #include "dhcp/dhcpcCommonLib.h"
  233. #else
  234. LOCAL STATUS dhcpcBootLineClean (char *);
  235. #endif /* INCLUDE_DHCPC */
  236. #ifdef INCLUDE_DHCPR
  237. #ifndef INCLUDE_DHCPS        /* Server is superset of relay agent. */
  238. #include "dhcprLib.h"
  239. #endif
  240. #endif
  241. #ifdef INCLUDE_END
  242. #include "end.h"
  243. #include "muxLib.h"
  244. #include "muxTkLib.h"
  245. #include "configNet.h"
  246. #include "m2Lib.h"
  247. #endif /* INCLUDE_END */
  248. #if (defined (INCLUDE_DHCPC) || defined (INCLUDE_DHCPS) || 
  249.      defined (INCLUDE_RIP) || defined (INCLUDE_OSPF)) 
  250.      && !defined (INCLUDE_ROUTE_SOCK)
  251. #define INCLUDE_ROUTE_SOCK
  252. #endif /* INCLUDE_DHCPC || INCLUDE_DHCPS */
  253. #ifdef INCLUDE_SLIP
  254. #if (CPU==SIMHPPA)
  255. extern void sysSlipSetup ();
  256. #endif /* (CPU=SIMHPPA) */
  257. #endif /* INCLUDE_SLIP */
  258. #ifdef INCLUDE_END
  259. #ifdef INCLUDE_NT_ULIP
  260. extern int ntResolv ();
  261. #endif /* INCLUDE_NT_ULIP */
  262. #endif /* INCLUDE_END */
  263. /* global variables */
  264. /* network protocol configuration parameters */
  265. #ifdef INCLUDE_TCP
  266. TCP_CFG_PARAMS tcpCfgParams = /* tcp configuration parameters */
  267.     {
  268.     TCP_FLAGS_DFLT, /* include rfc1323 support */
  269.     TCP_SND_SIZE_DFLT, /* default send buffer size */
  270.     TCP_RCV_SIZE_DFLT, /* default recv buffer size */
  271.     TCP_CON_TIMEO_DFLT, /* initial connection time out */
  272.     TCP_REXMT_THLD_DFLT, /* retransmit threshold */
  273.     TCP_MSS_DFLT, /* default maximum segment size */
  274.     TCP_RND_TRIP_DFLT, /* default round trip time */
  275.     TCP_IDLE_TIMEO_DFLT, /* idle timeouts before first probe */
  276.     TCP_MAX_PROBE_DFLT /* max no. probes before dropping */
  277.     }; 
  278. #endif /* INCLUDE_TCP */
  279. #ifdef INCLUDE_UDP
  280. UDP_CFG_PARAMS udpCfgParams = /* udp configuration parameters */
  281.     {
  282.     UDP_FLAGS_DFLT,
  283.     UDP_SND_SIZE_DFLT, /* send buffer size */
  284.     UDP_RCV_SIZE_DFLT /* recv buffer size */
  285.     }; 
  286. #endif /* INCLUDE_UDP */
  287. #ifdef INCLUDE_ICMP
  288. ICMP_CFG_PARAMS icmpCfgParams = /* icmp configuration parameters */
  289.     {
  290.     ICMP_FLAGS_DFLT /* no icmp mask replies by default */
  291.     }; 
  292. #endif /* INCLUDE_ICMP */
  293. IP_CFG_PARAMS ipCfgParams = /* ip configuration parameters */
  294.     {
  295.     IP_FLAGS_DFLT, /* default ip flags */
  296.     IP_TTL_DFLT, /* ip default time to live */
  297.     IP_QLEN_DFLT, /* default ip intr queue len */
  298.     IP_FRAG_TTL_DFLT /* default ip fragment time to live */
  299.     }; 
  300. /* network buffers configuration */
  301. /*
  302.  * mBlk, clBlk configuration table for network stack data pool.
  303.  * Only used for data transfer in the network stack.
  304.  */
  305. M_CL_CONFIG mClBlkConfig = 
  306.     {
  307.     /* 
  308.     no. mBlks no. clBlks memArea memSize
  309.     ----------- ---------- ------- -------
  310.     */
  311.     NUM_NET_MBLKS,  NUM_CL_BLKS, NULL,  0
  312.     };
  313. /*
  314.  * network stack data cluster pool configuration table
  315.  * Only used for data transfer in the network stack.
  316.  */
  317. CL_DESC clDescTbl [] = 
  318.     {
  319.     /* 
  320.     clusterSize num memArea memSize
  321.     ----------- ---- ------- -------
  322.     */
  323.     {64, NUM_64, NULL, 0},
  324.     {128, NUM_128, NULL, 0},
  325.     {256, NUM_256, NULL, 0},
  326.     {512, NUM_512, NULL, 0},
  327.     {1024, NUM_1024, NULL, 0},
  328.     {2048, NUM_2048, NULL, 0}
  329.     }; 
  330. int clDescTblNumEnt = (NELEMENTS(clDescTbl));
  331. /*
  332.  * mBlk, clBlk configuration table for network stack system pool.
  333.  * Used for network stack system structures such as routes, sockets,
  334.  * protocol control blocks, interface addresses, mulitcast addresses,
  335.  * and multicast routing entries.
  336.  */
  337. M_CL_CONFIG sysMclBlkConfig = 
  338.     {
  339.     /* 
  340.     no. mBlks no. clBlks memArea memSize
  341.     ----------- ---------- ------- -------
  342.     */
  343.     NUM_SYS_MBLKS,  NUM_SYS_CL_BLKS, NULL,  0
  344.     };
  345. /*
  346.  * network stack system cluster pool configuration table
  347.  * Used for network stack system structures such as routes, sockets,
  348.  * protocol control blocks, interface addresses, mulitcast addresses,
  349.  * and multicast routing entries.
  350.  */
  351. CL_DESC sysClDescTbl [] = 
  352.     {
  353.     /* 
  354.     clusterSize num memArea memSize
  355.     ----------- ---- ------- -------
  356.     */
  357.     {64, NUM_SYS_64, NULL, 0},
  358.     {128, NUM_SYS_128, NULL, 0},
  359.     {256, NUM_SYS_256, NULL, 0},
  360.     {512, NUM_SYS_512, NULL, 0},
  361.     }; 
  362. int sysClDescTblNumEnt = (NELEMENTS(sysClDescTbl));
  363. #if defined(INCLUDE_STREAMS) || defined(INCLUDE_STREAMS_ALL)
  364. #ifdef STREAMS_PROTO_INIT_RTN
  365. FUNCPTR strmProtoInitRtn = (FUNCPTR) STREAMS_PROTO_INIT_RTN;
  366. #endif /* STREAMS_PROTO_INIT_RTN */
  367. #endif /* INCLUDE_STREAMS || INCLUDE_STREAMS_ALL */
  368. #ifdef INCLUDE_END
  369. #ifndef IP_MAX_UNITS 
  370. #define IP_MAX_UNITS 1
  371. #endif
  372. #ifndef MUX_MAX_BINDS
  373. #define MUX_MAX_BINDS 16
  374. #endif /* MUX_MAX_BINDS */
  375. IP_DRV_CTRL ipDrvCtrl [IP_MAX_UNITS]; 
  376. int ipMaxUnits = IP_MAX_UNITS;
  377. #else /* INCLUDE_END not defined */
  378. IP_DRV_CTRL   ipDrvCtrl[1]; 
  379. #endif  /* INCLUDE_END */
  380. #ifdef INCLUDE_PPP
  381. #ifndef PPP_OPTIONS_FLAGS
  382. #define PPP_OPTIONS_FLAGS ((PPP_OPT_NO_ALL << PPP_S_NO_ALL)  | 
  383.     (PPP_OPT_PASSIVE_MODE << PPP_S_PASSIVE_MODE)             | 
  384.     (PPP_OPT_SILENT_MODE << PPP_S_SILENT_MODE)               | 
  385.     (PPP_OPT_DEFAULTROUTE << PPP_S_DEFAULTROUTE)             | 
  386.     (PPP_OPT_PROXYARP << PPP_S_PROXYARP)                     | 
  387.     (PPP_OPT_IPCP_ACCEPT_LOCAL << PPP_S_IPCP_ACCEPT_LOCAL)   | 
  388.     (PPP_OPT_IPCP_ACCEPT_REMOTE << PPP_S_IPCP_ACCEPT_REMOTE) | 
  389.     (PPP_OPT_NO_IP << PPP_S_NO_IP)                           | 
  390.     (PPP_OPT_NO_ACC << PPP_S_NO_ACC)                         | 
  391.     (PPP_OPT_NO_PC << PPP_S_NO_PC)                           | 
  392.     (PPP_OPT_NO_VJ << PPP_S_NO_VJ)                           | 
  393.     (PPP_OPT_NO_VJCCOMP << PPP_S_NO_VJCCOMP)                 | 
  394.     (PPP_OPT_NO_ASYNCMAP << PPP_S_NO_ASYNCMAP)               | 
  395.     (PPP_OPT_NO_MN << PPP_S_NO_MN)                           | 
  396.     (PPP_OPT_NO_MRU << PPP_S_NO_MRU)                         | 
  397.     (PPP_OPT_NO_PAP << PPP_S_NO_PAP)                         | 
  398.     (PPP_OPT_NO_CHAP << PPP_S_NO_CHAP)                       | 
  399.     (PPP_OPT_REQUIRE_PAP << PPP_S_REQUIRE_PAP)               | 
  400.     (PPP_OPT_REQUIRE_CHAP << PPP_S_REQUIRE_CHAP)             | 
  401.     (PPP_OPT_LOGIN << PPP_S_LOGIN)                           | 
  402.     (PPP_OPT_DEBUG << PPP_S_DEBUG)                           | 
  403.     (PPP_OPT_DRIVER_DEBUG << PPP_S_DRIVER_DEBUG))
  404. #endif  /* PPP_OPTIONS_FLAGS */
  405.  
  406. PPP_OPTIONS pppOptions = 
  407.     {
  408.     PPP_OPTIONS_FLAGS,              /* flags field */
  409.     PPP_STR_ASYNCMAP,               /* Set the desired async map */
  410.     PPP_STR_ESCAPE_CHARS,           /* Set chars to escape on transmission */
  411.     PPP_STR_VJ_MAX_SLOTS,           /* Set max VJ compression header slots */
  412.     PPP_STR_NETMASK,                /* Set netmask value for negotiation */
  413.     PPP_STR_MRU,                    /* Set MRU value for negotiation */
  414.     PPP_STR_MTU,                    /* Set MTU value for negotiation */
  415.     PPP_STR_LCP_ECHO_FAILURE,       /* Set max consecutive LCP echo failures */
  416.     PPP_STR_LCP_ECHO_INTERVAL,      /* Set time for LCP echo requests */
  417.     PPP_STR_LCP_RESTART,            /* Set timeout for LCP */
  418.     PPP_STR_LCP_MAX_TERMINATE,      /* Set max # xmits for LCP term-reqs */
  419.     PPP_STR_LCP_MAX_CONFIGURE,      /* Set max # xmits for LCP conf-reqs */
  420.     PPP_STR_LCP_MAX_FAILURE,        /* Set max # conf-naks for LCP */
  421.     PPP_STR_IPCP_RESTART,           /* Set timeout for IPCP */
  422.     PPP_STR_IPCP_MAX_TERMINATE,     /* Set max # xmits for IPCP term-reqs */
  423.     PPP_STR_IPCP_MAX_CONFIGURE,     /* Set max # xmits for IPCP conf-reqs */
  424.     PPP_STR_IPCP_MAX_FAILURE,       /* Set max # conf-naks for IPCP */
  425.     PPP_STR_LOCAL_AUTH_NAME,        /* Set local name for authentication */
  426.     PPP_STR_REMOTE_AUTH_NAME,       /* Set remote name for authentication */
  427.     PPP_STR_PAP_FILE,               /* Set the PAP secrets file */
  428.     PPP_STR_PAP_USER_NAME,          /* Set username for PAP auth with peer */
  429.     PPP_STR_PAP_PASSWD,             /* Set password for PAP auth with peer */
  430.     PPP_STR_PAP_RESTART,            /* Set timeout for PAP */
  431.     PPP_STR_PAP_MAX_AUTHREQ,        /* Set max # xmits for PAP auth-reqs */
  432.     PPP_STR_CHAP_FILE,              /* Set the CHAP secrets file */
  433.     PPP_STR_CHAP_RESTART,           /* Set timeout for CHAP */
  434.     PPP_STR_CHAP_INTERVAL,          /* Set interval for CHAP rechallenge */
  435.     PPP_STR_CHAP_MAX_CHALLENGE      /* Set max # xmits for CHAP challenge */
  436.     };
  437. #endif  /* INCLUDE_PPP */
  438. /* extern declarations, IMPORTS */
  439. #ifdef INCLUDE_MIB2_IF
  440. IMPORT FUNCPTR  _m2SetIfLastChange;     /* def'd in if.c for scalability */
  441. IMPORT FUNCPTR  _m2IfTableUpdate;
  442. #endif /* INCLUDE_MIB2_IF */
  443. /* Network interface table. */
  444. IMPORT int lnEbsaattach ();
  445. IMPORT int oliattach();
  446. IMPORT int dcattach ();
  447. IMPORT int eglattach ();
  448. IMPORT int eiattach ();
  449. IMPORT int feiattach ();
  450. IMPORT int exattach ();
  451. IMPORT int enpattach ();
  452. IMPORT int ieattach ();
  453. IMPORT int ilacattach ();
  454. IMPORT int lnattach ();
  455. IMPORT int lnsgiattach ();
  456. IMPORT int nicattach ();
  457. IMPORT int nicEvbattach ();
  458. IMPORT int medattach ();
  459. IMPORT int loattach ();
  460. IMPORT int snattach ();
  461. IMPORT int fnattach ();
  462. IMPORT int elcattach ();
  463. IMPORT int ultraattach ();
  464. IMPORT int eexattach ();
  465. IMPORT int eltattach ();
  466. IMPORT int eneattach ();
  467. IMPORT int esmcattach ();
  468. IMPORT int quattach ();
  469. IMPORT int slattach ();
  470. IMPORT int pppattach ();
  471. #ifdef NETIF_USR_DECL /* Additional declarations, from BSP */
  472.     NETIF_USR_DECL
  473. #endif
  474. /* generic driver */
  475. #ifdef INCLUDE_END
  476. IMPORT int  ipAttach ();
  477. IMPORT END_TBL_ENTRY endDevTbl[];
  478. #endif /* INCLUDE_END */
  479. #ifdef  INCLUDE_TCP_DEBUG
  480. IMPORT void tcpTraceInit ();
  481. #endif  /* INCLUDE_TCP_DEBUG */
  482. #ifdef INCLUDE_IF_USR
  483. IMPORT int IF_USR_ATTACH ();
  484. #endif /* INCLUDE_IF_USR */
  485. /* local typedefs */
  486. /* variables */
  487. NETIF usrNetIfTbl [] = /* network interfaces */
  488.     {
  489. #ifdef NETIF_USR_ENTRIES /* Additional entries, from BSP */
  490.     NETIF_USR_ENTRIES
  491. #endif
  492. #ifdef INCLUDE_LNEBSA
  493.         { "lnEbsa", lnEbsaattach, (char*)IO_ADRS_LNEBSA, INT_VEC_LNEBSA,
  494.           INT_LVL_LNEBSA, LNEBSA_POOL_ADRS, LNEBSA_POOL_SIZE, LNEBSA_DATA_WIDTH,
  495.           LNEBSA_MODE, LNEBSA_DMA_CHAN },
  496. #endif /* INCLUDE_LNEBSA */
  497. #ifdef INCLUDE_OLI
  498. { "oli", oliattach, (char*)IO_ADRS_NISA_BASE,
  499.   IO_ADRS_NISA_PCMCIA, IO_ADRS_NISA_PCMEM,
  500.   INT_VEC_PCMCIA_A, INT_LVL_PCMCIA_A,
  501.   INT_VEC_PCMCIA_B, INT_LVL_PCMCIA_B },
  502. #endif /* INCLUDE_OLI */
  503. #ifdef INCLUDE_DC
  504. { "dc", dcattach, (char*)IO_ADRS_DC, INT_VEC_DC, INT_LVL_DC,
  505.   DC_POOL_ADRS, DC_POOL_SIZE, DC_DATA_WIDTH, DC_RAM_PCI_ADRS,
  506.   DC_MODE },
  507. #endif /* INCLUDE_DC */
  508. #ifdef  INCLUDE_EGL
  509.         { "egl", eglattach, (char*)IO_ADRS_EGL, INT_VEC_EGL, INT_LVL_EGL },
  510. #endif /* INCLUDE_EGL */
  511. #ifdef INCLUDE_EI
  512. { "ei", eiattach, (char*)INT_VEC_EI, EI_SYSBUS, EI_POOL_ADRS, 0, 0},
  513. #endif /* INCLUDE_EI */
  514. #ifdef INCLUDE_FEI
  515.         { "fei", feiattach, (char*)FEI_POOL_ADRS, 0, 0, 0, 0},
  516. #endif /* INCLUDE_FEI */
  517. #ifdef INCLUDE_EX
  518. { "ex", exattach, (char*)IO_ADRS_EX, INT_VEC_EX, INT_LVL_EX,
  519.   IO_AM_EX_MASTER, IO_AM_EX },
  520. #endif /* INCLUDE_EX */
  521. #ifdef INCLUDE_ENP
  522. { "enp", enpattach, (char*)IO_ADRS_ENP, INT_VEC_ENP, INT_LVL_ENP,
  523.   IO_AM_ENP },
  524. #endif /* INCLUDE_ENP */
  525. #ifdef INCLUDE_IE
  526. { "ie", ieattach, (char*)IO_ADRS_IE, INT_VEC_IE, INT_LVL_IE },
  527. #endif /* INCLUDE_IE */
  528. #ifdef INCLUDE_ILAC
  529. { "ilac", ilacattach, (char*)IO_ADRS_ILAC, INT_VEC_ILAC},
  530. #endif /* INCLUDE_ILAC */
  531. #ifdef INCLUDE_IF_USR
  532. { IF_USR_NAME, IF_USR_ATTACH, IF_USR_ARG1, IF_USR_ARG2, IF_USR_ARG3,
  533.   IF_USR_ARG4, IF_USR_ARG5, IF_USR_ARG6, IF_USR_ARG7, IF_USR_ARG8 },
  534. #endif /* INCLUDE_IF_USR */
  535. #ifdef INCLUDE_LN
  536. { "ln", lnattach, (char*)IO_ADRS_LN, INT_VEC_LN, INT_LVL_LN,
  537.   LN_POOL_ADRS, LN_POOL_SIZE, LN_DATA_WIDTH, LN_PADDING,
  538.   LN_RING_BUF_SIZE },
  539. #endif /* INCLUDE_LN */
  540. #ifdef  INCLUDE_LNSGI
  541.         { "lnsgi", lnsgiattach, (char*)IO_ADRS_LNSGI, INT_VEC_LNSGI,
  542.           INT_LVL_LNSGI, LNSGI_POOL_ADRS, LNSGI_POOL_SIZE, LNSGI_DATA_WIDTH,
  543.           LNSGI_PADDING, LNSGI_RING_BUF_SIZE },
  544. #endif  /* INCLUDE_LNSGI */
  545. #ifdef  INCLUDE_NIC
  546.         { "nic", nicattach, (char*)IO_ADRS_NIC, INT_VEC_NIC, INT_LVL_NIC },
  547. #endif /* INCLUDE_NIC */
  548. #ifdef  INCLUDE_NIC_EVB
  549.         { "nicEvb", nicEvbattach, (char*)IO_ADRS_NIC,INT_VEC_NIC,INT_LVL_NIC },
  550. #endif  /* INCLUDE_NIC_EVB */
  551. #ifdef  INCLUDE_MED
  552.         { "med", medattach, (char*)IO_ADRS_DBETH, INT_VEC_DBETH, INT_LVL_DBETH},
  553. #endif /* INCLUDE_MED */
  554. #ifdef  INCLUDE_ELC
  555. { "elc", elcattach, (char*)IO_ADRS_ELC, INT_VEC_ELC, INT_LVL_ELC,
  556.   MEM_ADRS_ELC, MEM_SIZE_ELC, CONFIG_ELC},
  557. #endif  /* INCLUDE_ELC */
  558. #ifdef  INCLUDE_ULTRA
  559. { "ultra", ultraattach, (char*)IO_ADRS_ULTRA, INT_VEC_ULTRA,
  560.   INT_LVL_ULTRA, MEM_ADRS_ULTRA, MEM_SIZE_ULTRA, CONFIG_ULTRA},
  561. #endif  /* INCLUDE_ULTRA */
  562. #ifdef  INCLUDE_EEX
  563. { "eex", eexattach, (char*)IO_ADRS_EEX, INT_VEC_EEX, INT_LVL_EEX,
  564.   NTFDS_EEX, CONFIG_EEX},
  565. #endif  /* INCLUDE_EEX */
  566. #ifdef  INCLUDE_ELT
  567. { "elt", eltattach, (char*)IO_ADRS_ELT, INT_VEC_ELT, INT_LVL_ELT,
  568.   NRF_ELT, CONFIG_ELT},
  569. #endif  /* INCLUDE_ELT */
  570. #ifdef  INCLUDE_QU
  571. { "qu", quattach, (char*)IO_ADRS_QU_EN, INT_VEC_QU_EN, QU_EN_SCC,
  572.   QU_EN_TX_BD, QU_EN_RX_BD, QU_EN_TX_OFF, QU_EN_RX_OFF, QU_EN_MEM},
  573. #endif  /* INCLUDE_QU */
  574. #ifdef  INCLUDE_ENE
  575. { "ene", eneattach, (char*)IO_ADRS_ENE, INT_VEC_ENE, INT_LVL_ENE},
  576. #endif  /* INCLUDE_ENE */
  577. #ifdef  INCLUDE_ESMC
  578. { "esmc", esmcattach, (char*)IO_ADRS_ESMC, INT_VEC_ESMC, INT_LVL_ESMC,
  579.   CONFIG_ESMC, RX_MODE_ESMC},
  580. #endif  /* INCLUDE_ESMC */
  581. #ifdef  INCLUDE_SN
  582.         { "sn", snattach, (char*)IO_ADRS_SN, INT_VEC_SN },
  583. #endif /* INCLUDE_SN */
  584. #ifdef  INCLUDE_FN
  585.         { "fn", fnattach },
  586. #endif /* INCLUDE_FN */
  587. #ifdef  INCLUDE_SM_NET
  588.         { "sm", smNetAttach, 0, 0, 0, 0, 0, 0 },
  589. #endif  /* INCLUDE_SM_NET */
  590. #ifdef INCLUDE_PCMCIA
  591. { "pcmcia", pcmciaattach, 0, 0, 0, 0, 0, 0 },
  592. #endif /* INCLUDE_PCMCIA */
  593. #ifdef INCLUDE_PPP
  594. {"ppp", 0, 0, 0, 0, 0},
  595. #endif /* INCLUDE_PPP */
  596. #ifdef INCLUDE_SLIP
  597. {"sl", 0, 0, 0, 0, 0},
  598. #endif /* INCLUDE_SLIP */
  599. { "lo", loattach  },
  600. { 0, 0, 0, 0, 0, 0 },
  601.     };
  602. /* forward declarations */
  603. STATUS usrNetProtoInit (void); 
  604. #ifdef INCLUDE_DNS_RESOLVER
  605. LOCAL STATUS usrResolvInit (void);
  606. #endif /* INCLUDE_DNS_RESOLVER */
  607. #if defined (INCLUDE_DHCPS) || defined (INCLUDE_DHCPR)
  608. /*
  609.  * The following table lists the IP addresses which will receive DHCP
  610.  * messages forwarded across network boundaries by a DHCP server or
  611.  * relay agent.
  612.  */
  613. DHCP_TARGET_DESC dhcpTargetTbl [] =
  614.     {
  615.     /*
  616.      IP address of DHCP target servers
  617.      ---------------------------------
  618.      */
  619.      /* {"90.11.42.2"}, */
  620.      };
  621. LOCAL int dhcpTargetTblSize = (NELEMENTS(dhcpTargetTbl));
  622. struct ifnet *devlist[1];
  623. int dhcpMaxHops = DHCP_MAX_HOPS;
  624. int dhcpSPort = DHCPS_SPORT;
  625. int dhcpCPort = DHCPS_CPORT;
  626. #endif
  627. /* 
  628.  * Example cache routine - should store records of active leases 
  629.  *                         across reboots. 
  630.  */
  631. /*
  632. #ifdef INCLUDE_DHCPS
  633. STATUS dhcpsDummyCache (int, char *, int);
  634. STATUS dhcpsDummyCache (int op, char *name, int length)
  635.     {
  636.     printf("Cache called with op %d on %d bytes.n", op, length);
  637.     if (op == DHCPS_STORAGE_READ)
  638.         return (ERROR);          /@ Simulated end-of-file. @/
  639.     return (OK);
  640.     }
  641. #endif
  642. */
  643. #ifdef INCLUDE_DHCPS
  644. DHCPS_LEASE_DESC dhcpsLeaseTbl [] =
  645.     {
  646.     /*
  647.     Name        Start IP      End IP          Parameters
  648.     ----        ----------    ------          -----------
  649.                                      see man pages
  650.                                 (timers, bootfile, etc.)
  651.     */
  652.     /*
  653.      * Host requirements defaults needed for RFC compliance - DO NOT REMOVE!!
  654.      */
  655.    {"dflt",    NULL, NULL, DHCPS_DEFAULT_ENTRY},
  656.     /* Sample database entries. */
  657. /* {"ent1", "90.11.42.24", "90.11.42.24", "clid="1:0x08003D21FE90":maxl=90:dfll=60"},   */
  658. /* {"ent2", "90.11.42.25", "90.11.42.26", "snmk=255.255.255.0:maxl=90:dfll=70:file=/vxWorks"}, */
  659. /* {"ent3", "90.11.42.27", "90.11.42.27", "maxl=0xffffffff:file=/vxWorks"}, */
  660. /* {"entry4", "90.11.42.28", "90.11.42.29", "albp=true:file=/vxWorks"}      */
  661.     };
  662. LOCAL int dhcpsLeaseTblSize = (NELEMENTS(dhcpsLeaseTbl));
  663. /*
  664.  * If the DHCP server will receive messages from relay agents,
  665.  * the following table must be filled in by the user.
  666.  */
  667. DHCPS_RELAY_DESC dhcpsRelayTbl [] =
  668.     {
  669.     /*
  670.      IP address of agent              Subnet Number
  671.      --------------------             -------------
  672.      */
  673.     /* {"90.11.42.254",               "90.11.42.0"}, */
  674.     };
  675. LOCAL int dhcpsRelayTblSize = (NELEMENTS(dhcpsRelayTbl));
  676. LOCAL int dhcpsTaskPriority  = 56;      /* Priority level of DHCP server */
  677. LOCAL int dhcpsTaskOptions   = 0;       /* Option settings for DHCP server */
  678. LOCAL int dhcpsTaskStackSize = 5000;    /* Stack size for DHCP server task */
  679. IMPORT void dhcpsStart (void);
  680. #endif
  681. #ifdef INCLUDE_DHCPR                   /* Relay agent settings. */
  682. #ifndef INCLUDE_DHCPS                  /* Server is superset of relay agent. */
  683. LOCAL int dhcprTaskPriority  = 56;    /* Priority level of DHCP relay agent */
  684. LOCAL int dhcprTaskOptions   = 0;     /* Option settings for DHCP relay agent */
  685. LOCAL int dhcprTaskStackSize = 2500;  /* Stack size for DHCP relay agent */
  686. IMPORT void dhcprLibInit (void);
  687. IMPORT STATUS dhcprInit (struct ifnet **, int, DHCP_TARGET_DESC *, int);
  688. IMPORT void dhcprStart (void);
  689. #endif
  690. #endif
  691. /*******************************************************************************
  692. *
  693. * usrNetInit - system-dependent network initialization
  694. *
  695. * This routine initializes the network.  The ethernet and backplane drivers
  696. * and the TCP/IP software are configured.  It also adds hosts (analogous to
  697. * the /etc/hosts file in UNIX), gateways (analogous to /etc/gateways), sets
  698. * up our access rights on the host system (with iam()), optionally
  699. * initializes telnet, rlogin, RPC, and NFS support.
  700. *
  701. * The boot string parameter is normally left behind by the boot ROMs,
  702. * at address BOOT_LINE_ADRS.
  703. *
  704. * Unless the STANDALONE option is selected in usrConfig.c, this routine
  705. * will automatically be called by the root task usrRoot().
  706. *
  707. * RETURNS:
  708. * OK, or
  709. * ERROR if there is a problem in the boot string, or initializing network.
  710. *
  711. * SEE ALSO:  "Network" chapter of the VxWorks Programmer's Guide
  712. *
  713. * NOMANUAL
  714. */
  715. STATUS usrNetInit 
  716.     (
  717.     char *bootString /* boot parameter string */
  718.     )
  719.     {
  720.     BOOT_PARAMS params;
  721.     char numString [30];  /* buffer for numeric strings */
  722.     char *  pNetDev = NULL;  /* Name of network device to setup */
  723.     char * pBootString;       /* IP address settings from boot string */
  724.     int netmask;
  725. #if  defined (INCLUDE_SM_NET) || defined (INCLUDE_PROXY_SERVER)
  726.     int  proxymask;  /* mask for backplane and/or proxy net */
  727. #endif
  728.     char devName [MAX_FILENAME_LENGTH]; /* device name */
  729. #ifdef INCLUDE_NET_REM_IO
  730.     int protocol;
  731. #endif /* INCLUDE_NET_REM_IO */
  732. #ifdef INCLUDE_DHCPC
  733.     BOOL  dhcpBoot = FALSE;       /* Lease obtained during startup? */
  734. #endif  /* INCLUDE_DHCPC */
  735. #ifdef INCLUDE_DHCPS
  736.     STATUS dhcpsResult;
  737. #endif
  738. #ifdef INCLUDE_DHCPR
  739. #ifndef INCLUDE_DHCPS              /* Server is superset of relay agent. */
  740.     STATUS dhcprResult;
  741. #endif
  742. #endif
  743. #ifdef INCLUDE_END
  744.     int         count;
  745.     END_TBL_ENTRY* pDevTbl;
  746.     END_OBJ*      pCookie = NULL;
  747.     END_OBJ*   pEnd;
  748. #endif /* INCLUDE_END */
  749.     BOOL backplaneBoot = FALSE;
  750.     BOOL  attachFlag = FALSE;   /* Device configuration required? */
  751.     /* interpret boot command */
  752.     if (bootString == NULL)
  753. bootString = BOOT_LINE_ADRS;
  754.     if (usrBootLineCrack (bootString, &params) != OK)
  755. return (ERROR);
  756.     /* fill in any default values specified in configAll */
  757.     if ((params.hostName [0] == EOS) && /* host name */
  758.         (strcmp (HOST_NAME_DEFAULT, "") != 0))
  759. {
  760. strncpy (params.hostName, HOST_NAME_DEFAULT, BOOT_HOST_LEN);
  761. printf ("Host Name: %s n", params.hostName);
  762. }
  763.     if ((params.targetName [0] == EOS) && /* targetname */
  764.         (strcmp (TARGET_NAME_DEFAULT, "") != 0))
  765. {
  766. strncpy (params.targetName, TARGET_NAME_DEFAULT, BOOT_HOST_LEN);
  767. printf ("Target Name: %s n", params.targetName);
  768. }
  769.     if ((params.usr [0] == EOS) && /* user name (u) */
  770.         (strcmp (HOST_USER_DEFAULT, "") != 0))
  771. {
  772. strncpy (params.usr, HOST_USER_DEFAULT, BOOT_USR_LEN);
  773. printf ("User: %s n", params.usr);
  774. }
  775.     if ((params.startupScript [0] == EOS) && /* startup script (s) */
  776.         (strcmp (SCRIPT_DEFAULT, "") != 0))
  777. {
  778. strncpy (params.startupScript, SCRIPT_DEFAULT, BOOT_FILE_LEN);
  779. printf ("StartUp Script: %s n", params.startupScript);
  780. }
  781.     if ((params.other [0] == EOS) && /* other (o) */
  782.         (strcmp (OTHER_DEFAULT, "") != 0))
  783. {
  784. strncpy (params.other, OTHER_DEFAULT, BOOT_OTHER_LEN);
  785. printf ("Other: %s n", params.other);
  786. }
  787.     if (params.passwd [0] == EOS) /* password */
  788. strncpy (params.passwd, HOST_PASSWORD_DEFAULT, BOOT_PASSWORD_LEN);
  789.     /* fill in system-wide variables */
  790.     bcopy ((char *) &params, (char *) &sysBootParams, sizeof (sysBootParams));
  791.     sysFlags = params.flags;
  792.     strcpy (sysBootHost, params.hostName); /* backwards compatibility */
  793.     strcpy (sysBootFile, params.bootFile); /* backwards compatibility */
  794.     /* set processor number: may establish vme bus access, etc. */
  795.     if (_procNumWasSet != TRUE)
  796. {
  797.      sysProcNumSet (params.procNum);
  798. _procNumWasSet = TRUE;
  799. }
  800.     /* start the network */
  801.     /* initialize the generic socket library */
  802.     if (sockLibInit (NUM_FILES) == ERROR)
  803. return (ERROR);
  804. #if defined(INCLUDE_STREAMS) || defined(INCLUDE_STREAMS_ALL)
  805.     if (usrStrmInit() == ERROR) /* init Streams subsystem */
  806.         return (ERROR);
  807. #endif
  808.  
  809. #ifdef INCLUDE_BSD_SOCKET
  810. #ifdef BSD43_COMPATIBLE
  811.     bsdSock43ApiFlag = TRUE;
  812. #endif  /* BSD43_COMPATIBLE */
  813.     /* add the BSD socket library interface */
  814.  
  815.     if (sockLibAdd ((FUNCPTR) bsdSockLibInit, AF_INET_BSD, AF_INET) == ERROR)
  816.         return (ERROR);
  817. #if defined (INCLUDE_ROUTE_SOCK) 
  818.     if (sockLibAdd ((FUNCPTR) bsdSockLibInit, AF_ROUTE, AF_ROUTE) == ERROR)
  819.         return (ERROR);
  820.     routeSockLibInit () ;
  821. #endif  /* INCLUDE_ROUTE_SOCK */    
  822. #endif  /* INCLUDE_BSD_SOCKET */
  823.  
  824.     /* install default socket library interface */
  825.  
  826. #ifndef DEFAULT_STREAMS_SOCKET
  827.     if (sockLibAdd ((FUNCPTR) bsdSockLibInit, AF_INET, AF_INET) == ERROR)
  828.         return (ERROR);
  829. #endif  /* DEFAULT_STREAMS_SOCKET */
  830. /* set max link header reserved by BSD socket layer */
  831.     max_linkhdr = USR_MAX_LINK_HDR;
  832.     hostTblInit (); /* initialize host table */
  833.     usrNetProtoInit ();  /* initialize various protocols */
  834.     netLibInit ();
  835. #if defined(INCLUDE_END)
  836.     muxMaxBinds = MUX_MAX_BINDS;
  837.     if (muxLibInit() == ERROR)
  838. return (ERROR);
  839.     /* Add our default address resolution functions. */
  840. #ifdef INCLUDE_NT_ULIP
  841.     muxAddrResFuncAdd (M2_ifType_ethernet_csmacd, 0x800, ntResolv);
  842. #else
  843.     muxAddrResFuncAdd (M2_ifType_ethernet_csmacd, 0x800, ipEtherResolvRtn);
  844. #endif
  845.     /* Add in mux ENDs. */
  846.     for (count = 0, pDevTbl = endDevTbl; pDevTbl->endLoadFunc != END_TBL_END;
  847.          pDevTbl++, count++)
  848.         {
  849.         /* Make sure that WDB has not already installed the device. */
  850.         if (!pDevTbl->processed)
  851.             {
  852.             pCookie = muxDevLoad(pDevTbl->unit,
  853.                                  pDevTbl->endLoadFunc,
  854.                                  pDevTbl->endLoadString,
  855.                                  pDevTbl->endLoan, pDevTbl->pBSP);
  856.             if (pCookie == NULL)
  857.                 {
  858.                 printf("muxDevLoad failed for device entry %d!n", count);
  859.                 }
  860.             else
  861.                 {
  862.                 pDevTbl->processed = TRUE;
  863.                 if (muxDevStart(pCookie) == ERROR)
  864.                     {
  865.                     printf("muxDevStart failed for device entry %d!n", count);
  866.                     }
  867.                 }
  868.             }
  869.         }
  870. #endif /* INCLUDE_END */
  871. #ifdef INCLUDE_PPP
  872. #ifdef INCLUDE_PPP_CRYPT
  873.     cryptRtnInit (&pppCryptRtn); /* install crypt() routine */
  874. #endif /* INCLUDE_PPP_CRYPT */
  875.     loginInit(); /* for possible login option */
  876.     pppSecretLibInit(); /* initialize secrets library */
  877.     pppHookLibInit (); /* initialize pppHooks library */
  878.     pppShowInit();
  879. #endif /* INCLUDE_PPP */
  880. #ifdef INCLUDE_NET_REM_IO
  881.     remLastResvPort = 1010; /* pick an unused port number so we don't *
  882.  * have to wait for the one used by the *
  883.  * by the bootroms to time out */
  884.     _func_ftpLs = ftpLs;        /* init ptr to ftp dir listing routine */
  885.     _func_netLsByName = netLsByName;   /* init ptr to netDrv listing routine */
  886.     _func_remCurIdGet = (FUNCPTR) remCurIdGet;
  887.     _func_remCurIdSet = (FUNCPTR) remCurIdSet;
  888. #endif /* INCLUDE_NET_REM_IO */
  889. #ifdef INCLUDE_MIB2_IF
  890.     /* add hooks for if.c */
  891.     _m2SetIfLastChange = (FUNCPTR) m2SetIfLastChange;
  892.     _m2IfTableUpdate   = (FUNCPTR) m2IfTableUpdate;
  893. #endif /* INCLUDE_MIB2_IF */
  894. #ifdef INCLUDE_DHCPR
  895. #ifndef INCLUDE_DHCPS
  896.     dhcprLibInit ();
  897. #endif
  898. #endif
  899.     if ((strncmp (params.bootDev, "bp", 2) == 0) ||
  900.             (strncmp (params.bootDev, "sm", 2) == 0))
  901. {
  902. /* booting via backplane */
  903.         pBootString = params.bad;
  904.         }
  905.     else
  906.         pBootString = params.ead;
  907. #ifdef INCLUDE_DHCPC
  908.     /* 
  909.      * Remove any values for DHCP lease origin and lease duration from
  910.      * address string and store in dhcpcBootLease global. Set dhcpBoot
  911.      * flag to indicate if DHCP lease values were found.
  912.      */
  913.     if (sysFlags & SYSFLG_AUTOCONFIG)
  914.         if (dhcpcLeaseGet (pBootString, &dhcpBoot) == ERROR)
  915.             {
  916.             printf ("Unable to verify assigned DHCP address.n");
  917.             return (ERROR);
  918.             }
  919. #else
  920.     /*
  921.      * If network configuration protocols are used, check address 
  922.      * for DHCP lease information. If found (and removed), exit
  923.      * with an error, since the active DHCP lease cannot be maintained.
  924.      */ 
  925.     if (sysFlags & SYSFLG_AUTOCONFIG)
  926.         if (dhcpcBootLineClean (pBootString) == OK)
  927.             {
  928.             printf ("Can't use dynamic address %s without DHCP.n",
  929.                         pBootString);
  930.             return (ERROR);
  931.             }
  932. #endif    /* INCLUDE_DHCPC */
  933.     /* attach and configure interfaces */
  934. #ifdef INCLUDE_ULIP
  935.     if (strncmp (params.bootDev, "ul", 2) == 0)
  936. {
  937.         /*
  938.          * Booting with the simulator's interface completely configures the
  939.          * device. No DHCP/BOOTP address assignment is available.
  940.          */
  941. extern int ulipInit ();
  942.         pNetDev = params.bootDev;
  943.         printf ("Attaching network interface %s%d... ",
  944.                  params.bootDev, params.unitNum);
  945. bootNetmaskExtract (params.ead, &netmask); /* remove and ignore mask */
  946. /* XXX last octet of 'ead' == procNum */
  947. if (ulipInit (params.unitNum, params.ead, params.had, params.procNum) 
  948.                  == ERROR)
  949.     {
  950.     if (errno == S_if_ul_NO_UNIX_DEVICE)
  951. printf ("nulipInit failed, errno = S_if_ul_NO_UNIX_DEVn");
  952.     else
  953. printf ("nulipInit failed, errno = 0x%xn", errno);
  954.     return (ERROR);
  955.     }
  956. printf ("done.n");
  957. }
  958.     else
  959. #endif  /* INCLUDE_ULIP */
  960.     if (strncmp (params.bootDev, "ppp", 3) == 0)
  961.         {
  962.         /*
  963.          * Booting via ppp completely configures the device.
  964.          * No automatic DHCP/BOOTP address assignment (not broadcast capable).
  965.          */
  966.         pNetDev = params.bootDev;
  967.         if (usrPPPInit (params.bootDev, params.unitNum, params.ead, 
  968.                         ((params.gad[0] == EOS)? params.had : params.gad))
  969.                 == ERROR)
  970.             return (ERROR);
  971.         }
  972.     else if (strncmp (params.bootDev, "sl", 2) == 0)
  973. {
  974.         /*
  975.          * Booting via slip completely configures the device.
  976.          * No automatic DHCP/BOOTP address assignment (not broadcast capable).
  977.          */
  978.         pNetDev = params.bootDev;
  979. if (usrSlipInit (params.bootDev, params.unitNum, params.ead, 
  980.                          ((params.gad[0] == EOS)? params.had : params.gad)) 
  981.                 == ERROR)
  982.     return (ERROR);
  983. }
  984.     else if ((strncmp (params.bootDev, "bp", 2) == 0) ||
  985.             (strncmp (params.bootDev, "sm", 2) == 0))
  986. {
  987.         pNetDev = params.bootDev;
  988. backplaneBoot = TRUE;
  989. if (usrBpInit (params.bootDev, params.unitNum, 0) == ERROR)
  990.     return (ERROR);
  991.         /*
  992.          * Booting via backplane: protocol attachment is still required
  993.          * and automatic configuration with DHCP or BOOTP is supported.
  994.          */
  995.         attachFlag = TRUE;
  996. }
  997.     else
  998. {
  999.         if ((strncmp (params.bootDev, "scsi", 4) == 0) || 
  1000.             (strncmp (params.bootDev, "ide", 3) == 0) ||
  1001.     (strncmp (params.bootDev, "ata", 3) == 0) ||
  1002.     (strncmp (params.bootDev, "fd", 2) == 0)  ||
  1003. #if defined(BROADCOM_BSP)
  1004.             (strncmp (params.bootDev, "fl", 2) == 0) ||
  1005. #endif
  1006.     (strncmp (params.bootDev, "tffs", 4) == 0))
  1007.     {
  1008.     /* booting from disk, configure network if requested */
  1009.     if (params.other [0] != EOS)
  1010. {
  1011.                 /*
  1012.                  * Protocol attachment is required and automatic
  1013.                  * configuration with DHCP or BOOTP is supported
  1014.                  * for all these network devices.
  1015.                  */
  1016.                 attachFlag = TRUE;
  1017.                 pNetDev = params.other;
  1018. #if defined(BROADCOM_BSP)
  1019.                 switch(params.other[2]) {
  1020.                     case '0' : params.unitNum = 0; params.other[2] = EOS; break;
  1021.                     case '1' : params.unitNum = 1; params.other[2] = EOS; break;
  1022.                     default: break;
  1023.                 }
  1024. #endif
  1025.                 }
  1026.     }
  1027. else
  1028.     {
  1029.             pNetDev = params.bootDev;
  1030.             /*
  1031.              * Booting via network: protocol attachment is required and
  1032.              * automatic configuration with DHCP or BOOTP is supported
  1033.              * for all these network devices.
  1034.              */
  1035.             attachFlag = TRUE;
  1036.             }
  1037.         }
  1038.     if (attachFlag)
  1039.         {
  1040.         /*
  1041.          * Attempt to attach and setup the network boot device
  1042.          * (which is capable of automatic configuration).
  1043.          */
  1044.         BOOL attached = FALSE;
  1045.         netmask = 0;
  1046.         bootNetmaskExtract (pBootString, &netmask);
  1047. #ifdef INCLUDE_END
  1048.         /* Check for the END driver, if any. */
  1049.         pEnd = endFindByName (pNetDev, params.unitNum);
  1050.         if (pEnd != NULL)
  1051.             {
  1052.             if (ipAttach(params.unitNum, pNetDev) != OK)
  1053.                 {
  1054.                 logMsg ("Failed to attach to device %s",
  1055.                         (int)pNetDev, 0, 0, 0, 0, 0);
  1056.                 return (ERROR);
  1057.                 }
  1058.             attached = TRUE;
  1059.             }
  1060. #if defined(BROADCOM_BSP)
  1061.         if (sysIsLM()) {
  1062.         /* Check for the END driver, for the other unit */
  1063.         pEnd = endFindByName (pNetDev, (params.unitNum) ? 0 : 1);
  1064.         if (pEnd != NULL)
  1065.             {
  1066.             if (ipAttach((params.unitNum) ? 0 :  1, pNetDev) != OK)
  1067.                 {
  1068.                 logMsg ("Failed to attach to device %s",
  1069.                         (int)pNetDev, 0, 0, 0, 0, 0);
  1070.                 return (ERROR);
  1071.                 }
  1072.             attached = TRUE;
  1073.             }
  1074.         }
  1075. #endif
  1076. #endif /*INCLUDE_END*/
  1077. #ifdef INCLUDE_BSD
  1078.         if (!attached)
  1079.             {
  1080.             if ( (usrNetIfAttach (pNetDev, params.unitNum, pBootString) !=OK))
  1081.                 return (ERROR);
  1082.             attached = TRUE;
  1083.             }
  1084. #endif /*INCLUDE_BSD*/
  1085.         if (!attached)
  1086.             return (ERROR);
  1087.         printf ("Attached TCP/IP interface to %s unit %dn", pNetDev,
  1088.                 params.unitNum);
  1089.         }
  1090.     /* add loop-back interface */
  1091.     usrNetIfAttach ("lo", 0, "127.0.0.1");
  1092.     usrNetIfConfig ("lo", 0, "127.0.0.1", "localhost", 0);
  1093.     /* Attempt to retrieve a target IP address if it is not available. */
  1094. #ifdef INCLUDE_DHCPC
  1095.     if (dhcpcLibInit (DHCPC_SPORT, DHCPC_CPORT, DHCPC_MAX_LEASES, 
  1096.                       DHCPC_MAX_MSGSIZE, DHCPC_OFFER_TIMEOUT, 
  1097.       DHCPC_DEFAULT_LEASE, DHCPC_MIN_LEASE) == ERROR)
  1098.         return (ERROR);
  1099. #ifdef INCLUDE_NET_SHOW
  1100.     dhcpcShowInit ();
  1101. #endif
  1102.     /*
  1103.      * Renew or obtain a lease as needed and store values in boot line.
  1104.      * If successful, the pDhcpcBootCookie global is set to allow user
  1105.      * access to the lease and the timing information is stored in the
  1106.      * dhcpcBootLease global for later use.
  1107.      */
  1108.     if (dhcpcConfigSet (&params, &netmask, &dhcpBoot, attachFlag) == ERROR)
  1109.         return (ERROR);
  1110. #endif   /* INCLUDE_DHCPC */
  1111. #if defined(BROADCOM_BSP)
  1112.     /* Configure the network device using the address/mask information. */
  1113. if ((sysIsLM()) && (strcmp(params.bootDev, "flash") == 0)) {
  1114.     char ipaddr[] = {'1', '9', '2', '.', '1', '6', '8', '.','0', '.', '0', ' '};
  1115.         ipaddr[10] += sysSlotIdGet() / ((sysSlotIdGet() > 9) ? 10: 1);
  1116.         ipaddr[11] = (sysSlotIdGet() > 9) ? '0' + (sysSlotIdGet()) % 10 : ' ';
  1117.         if (attachFlag && (usrNetIfConfig (pNetDev, 0, ipaddr,
  1118.                         params.targetName, 0xffffff00) != OK))
  1119.             return (ERROR);
  1120.         ipaddr[8] = '1';
  1121.         if (attachFlag && (usrNetIfConfig (pNetDev, 1, ipaddr,
  1122.                         params.targetName, 0xffffff00) != OK))
  1123.             return (ERROR);
  1124.     } else {
  1125.         if (attachFlag && (usrNetIfConfig (pNetDev, params.unitNum, pBootString,
  1126.                             params.targetName, netmask) != OK))
  1127.             return (ERROR);
  1128.     }
  1129. #else
  1130.     if (attachFlag && (usrNetIfConfig (pNetDev, params.unitNum, pBootString,
  1131.                         params.targetName, netmask) != OK))
  1132.         return (ERROR);
  1133. #endif
  1134.     /* attach backplane interface (as second interface) */
  1135. #ifdef INCLUDE_SM_NET 
  1136. #define BP_ADDR_GIVEN         (params.bad [0] != EOS)
  1137. #define BP_ADDR_NOT_GIVEN (params.bad [0] == EOS)
  1138.     if ( !backplaneBoot )
  1139. {
  1140.      char  *bpDev;
  1141.      BOOL         proxyOn = FALSE;       /* Initialize Defaults */
  1142. u_long          startAddr = 0;         /* Default sequential Addr off */
  1143. char            netDev [BOOT_DEV_LEN + 1];
  1144. BOOL            seqAddrOn = FALSE;
  1145. BOOL            configureBp = TRUE;
  1146. BOOL            useEtherAddr = FALSE;
  1147.                                              /* Turn switches ON as needed */
  1148. #ifdef INCLUDE_SM_SEQ_ADDR
  1149. seqAddrOn = TRUE;
  1150. #endif
  1151. #ifdef INCLUDE_PROXY_DEFAULT_ADDR
  1152. useEtherAddr = TRUE;
  1153. #endif
  1154. #ifdef INCLUDE_PROXY_SERVER
  1155. proxyOn = TRUE;
  1156. #endif
  1157.         bpDev = "sm";
  1158.         sprintf(netDev, "%s%d", "sm", params.unitNum);
  1159. bootNetmaskExtract (params.bad, &proxymask);
  1160. if (proxyOn == TRUE)
  1161.     {
  1162.     if (seqAddrOn == TRUE)   /* PROXY WITH SEQ ADDR */
  1163.         {
  1164.         /* Pick address from backplane or ethernet */
  1165. if (BP_ADDR_GIVEN)
  1166.         {
  1167.           startAddr = ntohl (inet_addr (params.bad));
  1168.           netmask = proxymask;
  1169.         }
  1170. else if (sysProcNumGet () == 0)
  1171.     {
  1172.                     /*
  1173.                      * The shared memory master calculates the next available
  1174.                      * address, if possible. Slaves will read it directly.
  1175.                      */
  1176.     if ( useEtherAddr )
  1177. {
  1178.           startAddr = ntohl (inet_addr (params.ead)) + 1;
  1179.                         netmask = 0xffffffff;
  1180. }
  1181.     else /* Configuration error */
  1182.        {
  1183.        printf ("Error: No address for proxy service.n");
  1184.        printf ("Backplane IP Address must be specified.n");
  1185.                        configureBp = FALSE;
  1186.        }
  1187.     }
  1188. }
  1189.     else                     /* PROXY WITHOUT SEQ ADDR */
  1190.                 {
  1191. if (BP_ADDR_NOT_GIVEN)
  1192.     {
  1193.                     if (sysProcNumGet () == 0)
  1194.                         configureBp = FALSE;    /* Can't start master. */
  1195.     }
  1196. else
  1197.     {   /* startAddr is left as zero */
  1198.          netmask = proxymask;
  1199.     }
  1200.         }
  1201.     }
  1202. else
  1203.     { /* Using Subnet without PROXY Arp */
  1204.     if (BP_ADDR_GIVEN)
  1205.         {
  1206.         if (seqAddrOn == TRUE)
  1207.             {    /* Assign sequential address to backplane */
  1208.          startAddr = ntohl (inet_addr (params.bad));
  1209.     }
  1210.      netmask = proxymask;
  1211. }
  1212.             else if (sysProcNumGet () == 0)
  1213.                 {
  1214.                 /* Don't start the master if the backplane address is empty. */
  1215.                 configureBp = FALSE;
  1216.                 }
  1217.     }
  1218. if (configureBp == TRUE)
  1219.     {
  1220.     if (usrBpInit (bpDev, params.unitNum, startAddr) == ERROR)
  1221.      return (ERROR);
  1222.     (void) usrNetIfAttach (bpDev, params.unitNum, params.bad);
  1223.     /* Assigned Back Plane Address if needed */
  1224.     if ((BP_ADDR_NOT_GIVEN) &&
  1225.  (smNetInetGet (netDev, params.bad, NONE) == OK))
  1226.  printf ("Backplane address: %sn", params.bad);
  1227.     (void) usrNetIfConfig (bpDev, params.unitNum, params.bad, 
  1228.                                    (char *) NULL, netmask);
  1229.     }
  1230. }
  1231. #ifdef INCLUDE_DHCPC
  1232.     if (backplaneBoot)
  1233.         {
  1234.         if ((sysFlags & SYSFLG_AUTOCONFIG) && !(sysFlags & SYSFLG_PROXY))
  1235.             {
  1236.             printf ("Warning! DHCP over backplane may need proxy arp.n");
  1237.             }
  1238.         }
  1239. #endif /* INCLUDE_DHCPC */
  1240. #ifdef INCLUDE_SHOW_ROUTINES
  1241.     smNetShowInit ();
  1242. #endif /* INCLUDE_SHOW_ROUTINES */
  1243. #endif /* INCLUDE_SM_NET */
  1244.     if (sysFlags & SYSFLG_PROXY)
  1245.         {
  1246. #ifdef INCLUDE_PROXY_CLIENT
  1247.         printf ("registering proxy client %s...", pBootString);
  1248.         devName [0] = EOS;
  1249.         sprintf(devName, "%s%d", params.bootDev, params.unitNum);
  1250.         if (proxyReg (devName, pBootString) == ERROR)
  1251.             {
  1252.             printf ("failed: error %xn", errno);
  1253.             return (ERROR);
  1254.             }
  1255.         printf ("done.n");
  1256. #else /* INCLUDE_PROXY_CLIENT */
  1257.         printf ("proxy client requested but not included.n");
  1258.         return (ERROR);
  1259. #endif /* INCLUDE_PROXY_CLIENT */
  1260.         }
  1261. #ifdef INCLUDE_PROXY_SERVER
  1262. #ifndef INCLUDE_SM_NET
  1263.     /* Remove netmask from address if not already done. */
  1264.     bootNetmaskExtract (params.bad, &proxymask);
  1265. #endif
  1266.     if ((sysProcNumGet () == 0) && (params.bad [0] != EOS) &&
  1267.         (params.ead [0] != EOS))
  1268.         {
  1269.         hashLibInit ();                 /* make sure hash functions init'd */
  1270.         proxyArpLibInit (8, 8);
  1271.         printf ("Creating proxy network: %sn", params.bad);
  1272.         if (proxyNetCreate (params.bad, params.ead) == ERROR)
  1273.             {
  1274.             printf ("proxyNetCreate failed:%xn", errno);
  1275.             return (ERROR);
  1276.             }
  1277.         }
  1278. #endif /* INCLUDE_PROXY_SERVER */
  1279.     if (params.targetName[0] != EOS)
  1280.         sethostname (params.targetName, strlen (params.targetName));
  1281. #ifdef INCLUDE_DHCPC
  1282.     /*
  1283.      * If the target address is not manually assigned, add timing 
  1284.      * information so later reboots will detect the DHCP lease.
  1285.      */
  1286.     if (dhcpBoot == TRUE)
  1287.         {
  1288.         if (netmask == 0)
  1289.             sprintf (numString, "::%lx:%lx", dhcpcBootLease.lease_duration,
  1290.                                              dhcpcBootLease.lease_origin);
  1291.         else
  1292.             sprintf (numString, ":%x:%lx:%lx", ntohl (netmask),
  1293.                                                dhcpcBootLease.lease_duration,
  1294.                                                dhcpcBootLease.lease_origin);
  1295.         if (backplaneBoot)
  1296.             strcat (params.bad, numString);
  1297.         else
  1298.             strcat (params.ead, numString);
  1299.         bootStructToString (BOOT_LINE_ADRS, &params);
  1300.         }
  1301. #endif   /* INCLUDE_DHCPC */
  1302.     /* if a gateway was specified, extract the network part of the host's
  1303.      * address and add a route to this network
  1304.      */
  1305.     if (params.gad[0] != EOS)
  1306.         {
  1307. inet_netof_string (params.had, numString);
  1308. #ifdef BROADCOM_BSP
  1309.         /* Make the gateway the default route */
  1310.         routeAdd ("0.0.0.0", params.gad);
  1311. #else
  1312. routeAdd (numString, params.gad);
  1313. #endif
  1314.         }
  1315.     /* associate host name with the specified host address */
  1316.     hostAdd (params.hostName, params.had);
  1317. #ifdef INCLUDE_ULIP
  1318.     /* Set up host names and routes for talking to other vxworks's */
  1319.     {
  1320.     extern char *vxsim_ip_addr;
  1321.     extern char *vxsim_ip_name;
  1322.     int vxsim_num_ulips = 16;
  1323.     int ix;
  1324.     char host [50];
  1325.     char hostip [50];
  1326.     /* declare other simulated vxWorks' */
  1327.     for (ix = 0; ix < vxsim_num_ulips; ix++)
  1328. {
  1329. sprintf (host, vxsim_ip_name, ix);
  1330. sprintf (hostip, vxsim_ip_addr, ix);
  1331. hostAdd (host, hostip);
  1332. }
  1333.     /* Add default route thru host */
  1334.     routeAdd ("0.0.0.0", params.had);
  1335.     routeAdd (params.ead, "localhost"); /* loopback for local addresses */
  1336.     }
  1337. #endif /* INCLUDE_ULIP */
  1338. #ifdef INCLUDE_PASSFS
  1339.     /* The device names for passFs and netDrv are the same, e.g. "host:",
  1340.      * therefore, we have and either/or for the two devices.
  1341.      * Bulk of work done in usrConfig.c:usrRoot() for passFs installation.
  1342.      */
  1343.     iam (params.usr, params.passwd);
  1344.     devName[0] = EOS;
  1345.     protocol = (params.passwd[0] == EOS) ? 0 : 1; /* pick protocol */
  1346. #else
  1347.     /* create transparent remote file access device;
  1348.      * device name is host name with ':' appended.
  1349.      * protocol is rcmd if no password, or ftp if password specified
  1350.      */
  1351. #ifdef INCLUDE_NET_REM_IO
  1352.     netDrv (); /* init remote file driver */
  1353.     sprintf (devName, "%s:", params.hostName); /* make dev name */
  1354.     protocol = (params.passwd[0] == EOS) ? 0 : 1; /* pick protocol */
  1355.     netDevCreate (devName, params.hostName, protocol); /* create device */
  1356.     /* set the user id, and current directory */
  1357.     iam (params.usr, params.passwd);
  1358.     ioDefPathSet (devName);
  1359.     taskDelay (sysClkRateGet () / 4); /* 1/4 of a second */
  1360. #endif /* INCLUDE_NET_REM_IO */
  1361. #endif /* INCLUDE_PASSFS */
  1362. #ifdef  INCLUDE_ZBUF_SOCK
  1363.     zbufSockLibInit ();                 /* initialize zbuf socket interface */
  1364. #endif  /* INCLUDE_ZBUF_SOCK */
  1365. #ifdef  INCLUDE_TCP_DEBUG
  1366.     tcpTraceInit ();                    /* initialize TCP debug facility */
  1367. #endif  /* INCLUDE_TCP_DEBUG */
  1368.     /* start the rlogin and telnet daemon */
  1369. #ifdef INCLUDE_RLOGIN
  1370.     rlogInit ();
  1371. #endif /* INCLUDE_RLOGIN */
  1372. #ifdef INCLUDE_TELNET
  1373. #ifndef TELNETD_PORT
  1374. #define TELNETD_PORT 23
  1375. #endif
  1376. #ifndef TELNETD_MAX_CLIENTS
  1377. #define TELNETD_MAX_CLIENTS 1
  1378. #endif
  1379. #ifndef TELNETD_TASKFLAG
  1380. #define TELNETD_TASKFLAG FALSE
  1381. #endif
  1382.     if (telnetdInit (TELNETD_MAX_CLIENTS, TELNETD_TASKFLAG) == ERROR)
  1383.         printf ("Error %x: unable to initialize telnet server.n", errno);
  1384. #ifdef INCLUDE_SHELL
  1385.      /* Configure telnet server to use VxWorks shell as command interpreter. */
  1386.      else if (telnetdParserSet (shellParserControl) == ERROR)
  1387.         printf ("Error %x: unable to attach shell to telnet server.n", errno);
  1388.      else if (telnetdStart (TELNETD_PORT) == ERROR)
  1389.         printf ("Error %x: unable to start telnet server.n", errno);
  1390.         
  1391. #endif /* INCLUDE_SHELL */        
  1392.  
  1393. #endif /* INCLUDE_TELNET */
  1394.     /* initialize rpc daemon if specified */
  1395. #ifdef INCLUDE_RPC
  1396.     rpcInit ();
  1397. #endif /* INCLUDE_RPC */
  1398. #if defined(INCLUDE_FTP_SERVER)
  1399. #if defined(INCLUDE_FTPD_SECURITY)
  1400.     loginInit();
  1401.     ftpdInit((FUNCPTR) loginUserVerify, 0);
  1402. #else
  1403.     ftpdInit ((FUNCPTR) NULL,0);
  1404. #endif
  1405. #endif
  1406. #ifdef INCLUDE_TFTP_SERVER
  1407.     tftpdInit (0, 0, 0, FALSE, 0);
  1408. #endif
  1409.     /* initialize NFS server and client if specified */
  1410. #ifdef INCLUDE_NFS_SERVER
  1411. if (nfsdInit (0, 0, 0, 0, 0, 0) == ERROR)
  1412.     return (ERROR);
  1413. #endif  /* INCLUDE_NFS_SERVER */
  1414. #ifdef INCLUDE_NFS
  1415.     /*
  1416.      * The following values are the default values used in NFS.
  1417.      * They can be reset here if necessary.
  1418.      *
  1419.      *     nfsMaxMsgLen   = 8192 message size (decrease only)
  1420.      *     nfsTimeoutSec  = 5 timeout seconds
  1421.      *     nfsTimeoutUSec = 0 timeout microseconds
  1422.      */
  1423. #if (CPU==SIMHPPA)
  1424.     nfsMaxMsgLen   = 512;
  1425. #endif
  1426.     nfsAuthUnixSet (params.hostName, NFS_USER_ID, NFS_GROUP_ID, 0, (int *) 0);
  1427.     if (nfsDrv () == ERROR) /* initialize nfs driver */
  1428. printf ("Error initializing NFS, errno = %#xn", errno);
  1429.     else
  1430. {
  1431. #ifdef INCLUDE_NFS_MOUNT_ALL
  1432. printf ("Mounting NFS file systems from host %s", params.hostName);
  1433. if (params.targetName[0] != EOS)
  1434.     printf (" for target %s:n", params.targetName);
  1435. else
  1436.     printf (":n");
  1437. nfsMountAll (params.hostName, params.targetName, FALSE);
  1438. printf ("...donen");
  1439. #endif /* INCLUDE_NFS_MOUNT_ALL */
  1440. /* if the boot pathname starts with a device name, e.g. an nfs mount,
  1441.  * then set the current directory to that device
  1442.  */
  1443. (void) iosDevFind (sysBootFile, &pBootString);
  1444. if (pBootString != sysBootFile)
  1445.     {
  1446.     devName[0] = EOS;
  1447.     strncat (devName, sysBootFile, pBootString - sysBootFile);
  1448.     ioDefPathSet (devName);
  1449.     }
  1450. }
  1451. #else /* INCLUDE_NFS */
  1452.     printf ("NFS client support not included.n");
  1453.     pBootString = NULL;  /* dummy use to quiet compiler warning*/
  1454. #endif /* INCLUDE_NFS */
  1455. #if defined (INCLUDE_DHCPS) || defined (INCLUDE_DHCPR)
  1456.     /*
  1457.      * For now, set server or relay agent to listen on boot device.
  1458.      * Eventually, need to allow for multiple network devices.
  1459.      */
  1460.     devName [0] = EOS;
  1461.     sprintf(devName, "%s%d", params.bootDev, params.unitNum);
  1462.     devlist[0] = ifunit (devName);
  1463. #ifdef INCLUDE_DHCPS
  1464. #ifdef INCLUDE_DHCPR
  1465.     printf ("DHCP Server present. Relay agent not permitted.n");
  1466. #endif
  1467.     if (devlist[0] == NULL)
  1468.         printf("Network interface %s not found. DHCP server not started.n",
  1469.                 devName);
  1470.     else
  1471.         {
  1472.         dhcpsResult = dhcpsLeaseHookAdd (DHCPS_LEASE_HOOK);
  1473.         if (dhcpsResult == ERROR)
  1474.             {
  1475.             printf ("Warning: Required storage hook not installed.n");
  1476.             printf ("Lease records will not be saved.n");
  1477.             }
  1478.         dhcpsResult = dhcpsAddressHookAdd (DHCPS_ADDRESS_HOOK);
  1479.         if (dhcpsResult == ERROR)
  1480.             {
  1481.             printf ("Warning: No DHCP server address cache!");
  1482.             printf (" Later entries will not be saved.n");
  1483.             }
  1484.         dhcps_dflt_lease = DHCPS_DEFAULT_LEASE;
  1485.         dhcps_max_lease = DHCPS_MAX_LEASE;
  1486.         dhcpsResult = dhcpsInit (devlist, 1, DHCPS_MAX_MSGSIZE,
  1487.                                  dhcpsLeaseTbl, dhcpsLeaseTblSize,
  1488.                                  dhcpsRelayTbl, dhcpsRelayTblSize,
  1489.                                  dhcpTargetTbl, dhcpTargetTblSize);
  1490.         if (dhcpsResult == ERROR)
  1491.             printf ("Error initializing DHCP server. Not started.n");
  1492.         else
  1493.             {
  1494.             dhcpsResult = taskSpawn ("tDhcpsTask", dhcpsTaskPriority,
  1495.                                      dhcpsTaskOptions, dhcpsTaskStackSize,
  1496.                                      (FUNCPTR) dhcpsStart,
  1497.                                      0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
  1498.             if (dhcpsResult == ERROR)
  1499.                 printf ("Unable to start DHCP server task.n");
  1500.             printf ("DHCP server started.n");
  1501.             }
  1502.         }
  1503. #else
  1504.     if (devlist[0] == NULL)
  1505.       printf("Network interface %s not found. DHCP relay agent not started.n",
  1506.                 devName);
  1507.     else
  1508.         {
  1509.         dhcprResult = dhcprInit (devlist, 1, dhcpTargetTbl, dhcpTargetTblSize);
  1510.         if (dhcprResult == ERROR)
  1511.             printf ("Error initializing DHCP relay agent. Not started.n");
  1512.         else
  1513.             {
  1514.             dhcprResult = taskSpawn ("tDhcprTask", dhcprTaskPriority,
  1515.                                       dhcprTaskOptions, dhcprTaskStackSize,
  1516.                                       (FUNCPTR) dhcprStart,
  1517.                                       0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
  1518.             if (dhcprResult == ERROR)
  1519.                 printf ("Unable to start DHCP relay agent task.n");
  1520.             printf ("DHCP relay agent started.n");
  1521.             }
  1522.         }
  1523. #endif
  1524. #endif    /* INCLUDE_DHCPS or INCLUDE_DHCPR */
  1525. #ifdef INCLUDE_SNTPC
  1526.    sntpcInit (SNTP_PORT);
  1527. #endif
  1528. #ifdef INCLUDE_SNTPS
  1529.     /*
  1530.      * For now, set server to listen on boot device.
  1531.      * Eventually, need to allow for multiple network devices.
  1532.      */
  1533.     devName [0] = EOS;
  1534.     sprintf(devName, "%s%d", params.bootDev, params.unitNum);
  1535.     sntpsInit (devName, SNTPS_MODE, 
  1536.                SNTPS_DSTADDR, SNTPS_INTERVAL, SNTP_PORT, SNTPS_TIME_HOOK);
  1537. #endif
  1538. #ifdef  INCLUDE_PING
  1539.     (void) pingLibInit ();              /* initialize the ping utility */
  1540. #endif  /* INCLUDE_PING */
  1541. #ifdef INCLUDE_SNMPD
  1542.     usrSnmpdInit (); 
  1543. #endif
  1544. #ifdef INCLUDE_RIP
  1545. #ifndef RIP_SUPPLIER
  1546. #define RIP_SUPPLIER 0
  1547. #endif /* RIP_SUPPLIER */
  1548. #ifndef RIP_GATEWAY
  1549. #define RIP_GATEWAY 0
  1550. #endif /* RIP_GATEWAY */
  1551. #ifndef RIP_VERSION
  1552. #define RIP_VERSION 1
  1553. #endif /* RIP_VERSION */
  1554. #ifndef RIP_MULTICAST
  1555. #define RIP_MULTICAST 0
  1556. #endif /* RIP_MULTICAST */
  1557. #ifndef RIP_TIMER_RATE
  1558. #define RIP_TIMER_RATE 1
  1559. #endif /* RIP_TIMER_RATE */
  1560. #ifndef RIP_SUPPLY_INTERVAL
  1561. #define RIP_SUPPLY_INTERVAL 30
  1562. #endif /* RIP_SUPPLY_INTERVAL */
  1563. #ifndef RIP_EXPIRE_TIME
  1564. #define RIP_EXPIRE_TIME 180
  1565. #endif /* RIP_EXPIRE_TIME */
  1566. #ifndef RIP_GARBAGE_TIME
  1567. #define RIP_GARBAGE_TIME 300
  1568. #endif /* RIP_GARBAGE TIME */    
  1569.     ripLibInit(RIP_SUPPLIER, RIP_GATEWAY, RIP_MULTICAST, RIP_VERSION,
  1570.                RIP_TIMER_RATE, RIP_SUPPLY_INTERVAL, RIP_EXPIRE_TIME,
  1571.                RIP_GARBAGE_TIME);
  1572. #endif /* INCLUDE_RIP2 */
  1573. #ifdef INCLUDE_DNS_RESOLVER
  1574.     if (usrResolvInit () == ERROR)
  1575. {
  1576. printf ("Error initializing resolvLibn");
  1577. return(ERROR);
  1578. }
  1579. #endif /* INCLUDE_DNS_RESOLVER */
  1580. #ifdef INCLUDE_ARP
  1581.     arpLibInit ();
  1582. #endif
  1583.     return (OK);
  1584.     }
  1585. /* the next routines are in common with bootConfig.c and will be merged */
  1586. /******************************************************************************
  1587. *
  1588. * usrBootLineInit - initialize system boot line
  1589. *
  1590. * Initializes system boot line as per specified start type.  If the boot
  1591. * line is empty or this is a COLD boot, i.e. with CLEAR option to clear
  1592. * memory, then the boot line is initialized from non-volatile ram, if any,
  1593. * otherwise from the compiled in default boot line.
  1594. *
  1595. * NOMANUAL
  1596. */
  1597. void usrBootLineInit 
  1598.     (
  1599.     int startType
  1600.     )
  1601.     {
  1602.     if ((startType & BOOT_CLEAR) || (* BOOT_LINE_ADRS == EOS))
  1603. {
  1604. /* either cold boot or empty boot line -- initialize boot line */
  1605. if ((sysNvRamGet (BOOT_LINE_ADRS, BOOT_LINE_SIZE, 0) == ERROR))
  1606.     {
  1607.     /* no non-volatile RAM -- use default boot line */
  1608.     strcpy (BOOT_LINE_ADRS, DEFAULT_BOOT_LINE);
  1609.     }
  1610. }
  1611.     }
  1612. /******************************************************************************
  1613. *
  1614. * usrBootLineCrack - interpret and verify boot line
  1615. *
  1616. * This routine interprets the specified boot line and checks the validity
  1617. * of certain parameters.  If there are errors, a diagnostic message is
  1618. * printed.
  1619. *
  1620. * NOMANUAL
  1621. */
  1622. STATUS usrBootLineCrack 
  1623.     (
  1624.     char * bootString,
  1625.     BOOT_PARAMS *pParams
  1626.     )
  1627.     {
  1628.     FAST char * pS;
  1629.     pS = bootStringToStruct (bootString, pParams);
  1630.     if (*pS != EOS)
  1631. {
  1632. bootParamsErrorPrint (bootString, pS);
  1633. return (ERROR);
  1634. }
  1635.     /* check inet addresses */
  1636.     if ((checkInetAddrField (pParams->ead, TRUE) != OK) ||
  1637. (checkInetAddrField (pParams->bad, TRUE) != OK) ||
  1638. (checkInetAddrField (pParams->had, FALSE) != OK) ||
  1639. (checkInetAddrField (pParams->gad, FALSE) != OK))
  1640. {
  1641. return (ERROR);
  1642. }
  1643.     return (OK);
  1644.     }
  1645. /******************************************************************************
  1646. *
  1647. * checkInetAddrField - check for valid inet address in boot field
  1648. *
  1649. * RETURNS: OK, or ERROR if invalid inet address
  1650. *
  1651. * NOMANUAL
  1652. */
  1653. STATUS checkInetAddrField 
  1654.     (
  1655.     char *pInetAddr,
  1656.     BOOL subnetMaskOK
  1657.     )
  1658.     {
  1659.     char inetAddr [30];
  1660.     int netmask;
  1661.     bzero (inetAddr, 30);   /* SPR 6326 - prevents error if address invalid. */
  1662.     if (*pInetAddr == EOS)
  1663. return (OK);
  1664.     strncpy (inetAddr, pInetAddr, sizeof (inetAddr));
  1665.     if (subnetMaskOK)
  1666. {
  1667. if (bootNetmaskExtract (inetAddr, &netmask) < 0)
  1668.     {
  1669.     printf ("Error: invalid netmask in boot field "%s".n", inetAddr);
  1670.     return (ERROR);
  1671.     }
  1672. }
  1673.     if (inet_addr (inetAddr) == (u_long) ERROR)
  1674. {
  1675. printf ("Error: invalid inet address in boot field "%s".n",inetAddr);
  1676. return (ERROR);
  1677. }
  1678.     return (OK);
  1679.     }
  1680. /******************************************************************************
  1681. *
  1682. * usrNetIfAttach - attach a  network interface
  1683. *
  1684. * This routine attaches the specified network interface.
  1685. *
  1686. * - interface is attached
  1687. * - interface name is constructed as "<devName>0"
  1688. *
  1689. * RETURNS: OK or ERROR
  1690. *
  1691. * NOMANUAL
  1692. */
  1693. STATUS usrNetIfAttach 
  1694.     (
  1695.     char *  devName,
  1696.     int  unitNum,
  1697.     char *  inetAdrs
  1698.     )
  1699.     {
  1700.     FAST NETIF * pNif;
  1701.     STATUS  status;
  1702.     char  buf [BOOT_DEV_LEN + 1]; /* device name + unit number */
  1703. #ifdef  INCLUDE_PCMCIA
  1704.     int sock;
  1705.     if (strncmp (devName, "pcmcia", 6) == 0)
  1706. {
  1707. if (strlen (devName) == 6)
  1708.     return (ERROR);
  1709. else
  1710.     sscanf (devName, "%*6s%*c%d", &sock);
  1711. *(devName + 6) = '';
  1712. }
  1713. #endif  /* INCLUDE_PCMCIA */
  1714.     /* attach interface */
  1715.     /* find interface in table */
  1716.     sprintf(buf, "%s%d", devName, unitNum);
  1717.     for (pNif = usrNetIfTbl; pNif->ifName != 0; pNif++)
  1718. {
  1719. if (strcmp (buf, pNif->ifName) == 0)
  1720.     break;
  1721. }
  1722.     /*
  1723.      * For backward compatibility, the device name only is acceptable for
  1724.      * unit numbers of 0.
  1725.      */
  1726.     if (pNif->ifName == 0 && unitNum == 0)
  1727.         {
  1728.         for (pNif = usrNetIfTbl; pNif->ifName != 0; pNif++)
  1729.             {
  1730.             if (strcmp (devName, pNif->ifName) == 0)
  1731.                 break;
  1732.             }
  1733.         }
  1734.     if (pNif->ifName == 0)
  1735. {
  1736. printf ("Network interface %s unknown.n", devName);
  1737. return (ERROR);
  1738. }
  1739.     printf ("Attaching network interface %s... ", buf);
  1740. #ifdef  INCLUDE_PCMCIA
  1741.     if (strncmp (devName, "pcmcia", 6) == 0)
  1742. pNif->arg1 = (char *)sock;
  1743. #endif  /* INCLUDE_PCMCIA */
  1744. #if defined (TARGET_VIP10)
  1745.         /* SGI VIP10 boards are supposed to come with the ethernet address
  1746.          * in SGI formated non volatile ram.  We can not be sure where this
  1747.          * is so we default the upper 4 bytes of the address to SGI standard
  1748.          * and use the bottom two bytes of the internet address for the rest.
  1749.          */
  1750.         if (strcmp (devName, "lnsgi") == 0)
  1751.             {
  1752.             IMPORT char lnsgiEnetAddr [];      /* ethernet addr for lance */
  1753.             u_long inet = inet_addr (inetAdrs);
  1754.             lnsgiEnetAddr [4] = (inet >> 8) & 0xff;
  1755.             lnsgiEnetAddr [5] = inet & 0xff;
  1756.             }
  1757. #endif  /* TARGET_VIP10 */
  1758.     status = pNif->attachRtn (unitNum, pNif->arg1, pNif->arg2, pNif->arg3,
  1759.       pNif->arg4, pNif->arg5, pNif->arg6,
  1760.       pNif->arg7, pNif->arg8);
  1761.     if (status != OK)
  1762. {
  1763.         if (errno == S_iosLib_CONTROLLER_NOT_PRESENT)
  1764.             printf ("failed.nError: S_iosLib_CONTROLLER_NOT_PRESENT.n");
  1765.         else
  1766.     printf ("failed: errno = %#x.n", errno);
  1767. return (ERROR);
  1768. }
  1769.     printf ("done.n");
  1770.     return (OK);
  1771.     }
  1772. /******************************************************************************
  1773. *
  1774. * usrNetIfConfig - configure network interface
  1775. *
  1776. * This routine configures the specified network interface with the specified
  1777. * boot parameters:
  1778. *
  1779. * - subnetmask is extracted from inetAdrs and, if present,
  1780. *   set for interface
  1781. * - inet address is set for interface
  1782. * - if present, inet name for interface is added to host table.
  1783. *
  1784. * RETURNS: OK or ERROR
  1785. *
  1786. * NOMANUAL
  1787. */
  1788. STATUS usrNetIfConfig 
  1789.     (
  1790.     char *      devName,  /* device name */
  1791.     int         unitNum,  /* unit number */
  1792.     char *      inetAdrs,  /* inet address */
  1793.     char *      inetName,  /* host name */
  1794.     int         netmask  /* subnet mask */
  1795.     )
  1796.     {
  1797.     char ifname [20];
  1798. #ifdef  INCLUDE_PCMCIA
  1799.     if (strncmp (devName, "pcmcia", 6) == 0)
  1800. devName = "pcmcia";
  1801. #endif  /* INCLUDE_PCMCIA */
  1802.     /* check for empty inet address */
  1803.     if (inetAdrs[0] == EOS)
  1804. {
  1805. printf ("No inet address specified for interface %s.n", devName);
  1806. return (ERROR);
  1807. }
  1808.     /* build interface name */
  1809.     sprintf (ifname, "%s%d", devName, unitNum);
  1810.     /* set subnet mask, if any specified */
  1811.     if (netmask != 0)
  1812. ifMaskSet (ifname, netmask);
  1813.     /* set inet address */
  1814.     if (ifAddrSet (ifname, inetAdrs) != OK)
  1815. {
  1816. printf ("Error setting inet address of %s to %s, errno = %#xn",
  1817. ifname, inetAdrs, errno);
  1818. return (ERROR);
  1819. }
  1820.     /* add host name to host table */
  1821.     if ((inetName != NULL) && (*inetName != EOS))
  1822. hostAdd (inetName, inetAdrs);
  1823.     return (OK);
  1824.     }
  1825. /******************************************************************************
  1826. *
  1827. * usrBpInit - initailize backplane driver
  1828. *
  1829. * usrBpInit initializes the backplane driver shared memory region
  1830. * and sets up the backplane parameters to attach.
  1831. *
  1832. * RETURNS: OK if successful otherwise ERROR
  1833. *
  1834. * NOMANUAL
  1835. */
  1836. STATUS usrBpInit 
  1837.     (
  1838.     char *  devName,  /* device name */
  1839.     int  unitNum,  /* unit number */
  1840.     u_long  startAddr  /* inet address */
  1841.     )
  1842.     {
  1843. #ifdef INCLUDE_SM_NET
  1844.     char * bpAnchor; /* anchor address */
  1845.     FAST NETIF * pNif; /* netif struct */
  1846.     STATUS  status; /* status */
  1847.     int procNum; /* proc num */
  1848.     char  buf [BOOT_DEV_LEN];  /* network device + unit number */
  1849.     /*
  1850.      * Pick off optional "=<anchorAdrs>" from backplane
  1851.      * device.  Also truncates devName to just "bp" or "sm"
  1852.      */
  1853.     if ((strncmp (devName, "bp=", 3) == 0) ||
  1854.         (strncmp (devName, "sm=", 3) == 0))
  1855. {
  1856. if (bootBpAnchorExtract (devName, &bpAnchor) < 0)
  1857.     {
  1858.     printf ("Invalid anchor address specified: "%s"n", devName);
  1859.     return (ERROR);
  1860.     }
  1861. }
  1862.     else
  1863. bpAnchor = SM_ANCHOR_ADRS; /* default anchor */
  1864.      procNum = sysProcNumGet ();
  1865.     /* if we are master, initialize backplane net */
  1866.     if (procNum == 0)
  1867. {
  1868. printf ("Initializing backplane net with anchor at %#x... ",
  1869. (int) bpAnchor);
  1870. status = smNetInit ((SM_ANCHOR *) bpAnchor, (char *) SM_MEM_ADRS,
  1871.     (int) SM_MEM_SIZE, SM_TAS_TYPE, SM_CPUS_MAX, 
  1872.     SM_PKTS_SIZE, startAddr);
  1873. if (status == ERROR)
  1874.        {
  1875.     printf ("Error: backplane device %s not initializedn", devName);
  1876.     return (ERROR);
  1877.     }
  1878. printf ("done.n");
  1879. }
  1880.     /* Locate NETIF structure for backplane */
  1881.     sprintf (buf, "%s%d", devName, unitNum);
  1882.     for (pNif = usrNetIfTbl; pNif->ifName != 0; pNif++)
  1883.     {
  1884. if (strcmp (devName, pNif->ifName) == 0)
  1885.     break;
  1886. }
  1887.     /*
  1888.      * For backward compatibility, the device name only is acceptable for
  1889.      * unit numbers of 0.
  1890.      */
  1891.     if (pNif->ifName == 0 && unitNum == 0)
  1892.         {
  1893.         for (pNif = usrNetIfTbl; pNif->ifName != 0; pNif++)
  1894.             {
  1895.             if (strcmp (devName, pNif->ifName) == 0)
  1896.                 break;
  1897.             }
  1898.         }
  1899.     if (pNif->ifName == 0)
  1900. {
  1901.         if (strncmp (devName, "bp", 2) == 0)
  1902.     printf ("INCLUDE_BP_5_0 not supported - use 'sm' interfacen");
  1903. return (ERROR);
  1904. }
  1905.     printf ("Backplane anchor at %#x... ", (int) bpAnchor);
  1906.     /* configure backplane parameters (most set in NETIF struct) */
  1907.     pNif->arg1 = bpAnchor; /* anchor address */
  1908.     pNif->arg3 = SM_INT_TYPE;
  1909.     pNif->arg4 = SM_INT_ARG1;
  1910.     pNif->arg5 = SM_INT_ARG2;
  1911.     pNif->arg6 = SM_INT_ARG3;
  1912.     return (OK);
  1913. #else /* INCLUDE_SM_NET */
  1914.     printf ("nError: backplane driver referenced but not included.n");
  1915.     return (ERROR);
  1916. #endif /* INCLUDE_SM_NET */
  1917.     }
  1918. #ifndef INCLUDE_DHCPC
  1919. /*******************************************************************************
  1920. *
  1921. * dhcpcBootLineClean - remove DHCP information from system bootline
  1922. *
  1923. * This routine removes the DHCP information (lease duration and origin) from 
  1924. * the client address string in the bootline. Those values are present
  1925. * if the target IP address obtained during system boot was provided by a
  1926. * DHCP server. The routine is called if DHCP is not included in a VxWorks 
  1927. * image and an automatic configuration protocol was used by the bootstrap
  1928. * loader. Under those circumstances, indications of a DHCP lease result are
  1929. * treated as an error by the startup code, since the lease cannot be renewed.
  1930. *
  1931. * RETURNS: OK if DHCP lease data found in bootline, or ERROR otherwise.
  1932. *
  1933. * NOMANUAL
  1934. */
  1935. LOCAL STATUS dhcpcBootLineClean
  1936.     (
  1937.     char *  pAddrString    /* client address string from bootline */
  1938.     )
  1939.     {
  1940.     FAST char *pDelim;
  1941.     FAST char *offset;
  1942.     STATUS result = ERROR;
  1943.     /* Check if lease duration field is present. */
  1944.     offset = index (pAddrString, ':');     /* Find netmask field. */
  1945.     if (offset != NULL)
  1946.         {
  1947.         pDelim = offset + 1;
  1948.         offset = index (pDelim, ':');
  1949.         if (offset != NULL)
  1950.             {
  1951.             /* 
  1952.              * Lease duration found - for active DHCP leases,
  1953.              * the lease origin field is also present.
  1954.              */
  1955.             pDelim = offset + 1;
  1956.             pDelim = index (pDelim, ':');
  1957.             if (pDelim != NULL)
  1958.                  result = OK;     /* Active DHCP lease found. */
  1959.             *offset = EOS;    /* Remove DHCP lease information. */
  1960.             }
  1961.         }
  1962.     return (result);
  1963.     }
  1964. #endif
  1965. /*******************************************************************************
  1966. *
  1967. * usrSlipInit - initialize the slip device
  1968. *
  1969. * RETURNS: OK if successful, otherwise ERROR.
  1970. *
  1971. * NOMANUAL
  1972. */
  1973. STATUS usrSlipInit 
  1974.     (
  1975.     char *  pBootDev, /* boot device */
  1976.     int  unitNum,  /* unit number */
  1977.     char *  localAddr, /* local address */
  1978.     char *  peerAddr /* peer address */
  1979.     )
  1980.     {
  1981. #ifdef INCLUDE_SLIP
  1982.     char  slTyDev [20]; /* slip device */
  1983.     int netmask; /* netmask */
  1984. #ifndef SLIP_BAUDRATE
  1985. #define SLIP_BAUDRATE 0 /* uses previously selected baudrate */
  1986. #endif
  1987. #ifdef CSLIP_ENABLE
  1988. #undef CSLIP_ENABLE
  1989. #define CSLIP_ENABLE TRUE /* force CSLIP header compression */
  1990. #else /* CSLIP_ENABLE */
  1991. #undef CSLIP_ENABLE
  1992. #define CSLIP_ENABLE FALSE
  1993. #endif /* CSLIP_ENABLE */
  1994. #ifdef CSLIP_ALLOW
  1995. #undef CSLIP_ALLOW
  1996. #define CSLIP_ALLOW TRUE /* enable CSLIP compression on Rx */
  1997. #else /* CSLIP_ALLOW */
  1998. #undef CSLIP_ALLOW
  1999. #define CSLIP_ALLOW FALSE
  2000. #endif /* CSLIP_ALLOW */
  2001. #ifndef SLIP_MTU 
  2002. #define SLIP_MTU 576
  2003. #endif
  2004.     if (pBootDev [2] == '=')
  2005. {
  2006. /* get the tty device used for SLIP interface e.g. "sl=/tyCo/1" */
  2007. strcpy (slTyDev, &pBootDev [3]);
  2008. pBootDev [2] = '';
  2009. }
  2010.     else
  2011. {
  2012. /* construct the default SLIP tty device */
  2013. sprintf (slTyDev, "%s%d", "/tyCo/", SLIP_TTY);
  2014. }
  2015.     printf ("Attaching network interface sl%d... ", unitNum);
  2016.     bootNetmaskExtract (localAddr, &netmask); /* remove and ignore mask */
  2017.     if (slipInit (unitNum, slTyDev, localAddr, peerAddr, SLIP_BAUDRATE,
  2018.         CSLIP_ENABLE, CSLIP_ALLOW, SLIP_MTU) == ERROR)
  2019. {
  2020. printf ("nslipInit failed 0x%xn", errno);
  2021. return (ERROR);
  2022. }
  2023. #if (CPU==SIMHPPA)
  2024.     sysSlipSetup ();
  2025.     /* Add a default route through the host end of the SLIP connection */
  2026.     routeAdd ("0.0.0.0", peerAddr);
  2027. #endif  /* (CPU==SIMHPPA) */
  2028.     printf ("done.n");
  2029.     return (OK);
  2030. #else /* INCLUDE_SLIP */
  2031.     printf ("nError: slip not included.n");
  2032.     return (ERROR);
  2033. #endif /* INCLUDE_SLIP */
  2034.     }
  2035. /********************************************************************************
  2036. * usrPPPInit - initialize a ppp channel
  2037. *
  2038. * RETURNS: OK if successful, otherwise ERROR.
  2039. *
  2040. * NOMANUAL
  2041. */
  2042.  
  2043. STATUS usrPPPInit 
  2044.     (
  2045.     char *      pBootDev, /* boot device */
  2046.     int  unitNum,  /* unit number */
  2047.     char *      localAddr, /* local address */
  2048.     char *      peerAddr /* peer address */
  2049.     )
  2050.     {
  2051. #ifdef INCLUDE_PPP
  2052.     PPP_INFO    pppInfo;
  2053.     PPP_OPTIONS *pOptions = NULL;
  2054.     char        pppTyDev [20];           /* ppp device */
  2055. #ifdef PPP_BAUDRATE
  2056.     int pppBaudRate = PPP_BAUDRATE; /* ppp baud rate */
  2057. #else
  2058.     int pppBaudRate = 0; /* ppp baud rate */
  2059. #endif /* PPP_BAUDRATE */
  2060.     char * pBaudStr; /* ppp boot string */
  2061.     int         netmask;                 /* netmask */
  2062.     int         sysRate = sysClkRateGet(); /* system clock rate */
  2063.     int         ix;
  2064. #ifdef PPP_OPTIONS_STRUCT
  2065.     pOptions = &pppOptions;
  2066. #endif /* PPP_OPTIONS_STRUCT */
  2067.     if ((pBaudStr = strpbrk (pBootDev, ",")) != NULL)
  2068.         {
  2069. *pBaudStr++ = '';
  2070. pppBaudRate = atoi (pBaudStr);
  2071. }
  2072.     if (pBootDev [3] == '=')
  2073.         {
  2074.         /* get the tty device used for PPP interface e.g. "ppp=/tyCo/1" */
  2075.         strcpy (pppTyDev, &pBootDev [4]);
  2076.         pBootDev [3] = '';
  2077.         }
  2078.     else 
  2079.         {
  2080.         /* construct the default PPP tty device */
  2081.         sprintf (pppTyDev, "%s%d", "/tyCo/", PPP_TTY);
  2082.         }
  2083.  
  2084.     printf ("Attaching network interface ppp%d...n", unitNum);
  2085.  
  2086.     bootNetmaskExtract (localAddr, &netmask); /* remove and ignore mask */
  2087.  
  2088.     if (pppInit (unitNum, pppTyDev, localAddr, peerAddr, pppBaudRate,
  2089.  pOptions, PPP_OPTIONS_FILE) == ERROR)
  2090.         {
  2091.         printf ("npppInit failed 0x%xn", errno);
  2092.         return (ERROR);
  2093.         }
  2094.  
  2095.     /* wait for PPP link to be established */
  2096.     for (ix = 0; ix < PPP_CONNECT_DELAY; ix++)
  2097.         {
  2098.         taskDelay (sysRate);
  2099.         if ((pppInfoGet (unitNum, &pppInfo) == OK) &&
  2100.             ((pppInfo.ipcp_fsm.state == OPENED) ||
  2101.      (pppInfo.lcp_wantoptions.silent) ||
  2102.      (pppInfo.lcp_wantoptions.passive)))
  2103.            break;
  2104.         }
  2105.     if (ix == PPP_CONNECT_DELAY)
  2106.         {
  2107.   pppDelete (unitNum); /* kill the interface */
  2108.         printf ("ppp0: timeout: could not establish link with peer.n");
  2109.         return (ERROR);
  2110.   }
  2111.  
  2112. #if CPU==SIMSPARCSOLARIS
  2113.      /* Add default route thru ppp gateway */
  2114.     routeAdd ("0.0.0.0", peerAddr);
  2115.     routeAdd (localAddr, "127.0.0.1"); /* loopback for local addresses */
  2116. #endif
  2117.     printf ("done.n");
  2118.     return (OK);
  2119.      
  2120. #else /* INCLUDE_PPP */
  2121.     printf ("nError: ppp not included.n");
  2122.     return (ERROR);
  2123. #endif  /* INCLUDE_PPP */
  2124.     }
  2125. #ifdef INCLUDE_SNMPD
  2126. /* 
  2127.  * The following structure defines which MIB modules are initialized
  2128.  * by the SNMP agent.  The initialization routines are called 
  2129.  * during agent start up.  The termination routines are called 
  2130.  * after the agent is deleted.  
  2131.  */
  2132.    MIB_MODULE snmpMibModules []  =
  2133.        {   
  2134.            /* initializtion, terminate */
  2135.            { NULL, usrMib2CleanUp },
  2136.            { NULL, NULL },                 /* Last entry both must be NULL */
  2137.        };
  2138. /*****************************************************************************
  2139. *
  2140. * usrSnmpdInit - initialize the SNMP agent
  2141. * This routine initializes the SNMP agent as well as the MIB-2 libraries.
  2142. *
  2143. * RETURNS: OK if successful, otherwise ERROR.
  2144. */
  2145. STATUS usrSnmpdInit (void)
  2146.     {
  2147.     int       traceLevel = 0;
  2148. #ifdef SNMP_TRACE_LEVEL
  2149.     traceLevel = SNMP_TRACE_LEVEL;
  2150. #endif
  2151.     snmpdInit (snmpMibModules, traceLevel, 0, 0);
  2152.     return (OK);
  2153.     }
  2154. /*******************************************************************************
  2155. *
  2156. * usrMib2Init - initialize the MIB-II library 
  2157. *
  2158. * This routine initializes the MIB-II library interface. 
  2159. *
  2160. * RETURNS: OK (always)
  2161. */
  2162. STATUS usrMib2Init (void)
  2163.     {
  2164. #ifdef INCLUDE_MIB2_SYSTEM
  2165.     static M2_OBJECTID sysObjectId = { MIB2_SYS_OBJID_LEN,
  2166.         MIB2_SYS_OBJID };
  2167.     /* this includes and initializes the MIB-2 interface */
  2168.      m2SysInit (MIB2_SYS_DESCR, MIB2_SYS_CONTACT, MIB2_SYS_LOCATION,
  2169.        &sysObjectId);
  2170. #endif /* INCLUDE_MIB2_SYSTEM */
  2171. #ifdef INCLUDE_MIB2_IF
  2172.     m2IfInit ((FUNCPTR) generateTrap, 0);
  2173. #endif /* INCLUDE_MIB2_IF */
  2174. #ifdef INCLUDE_MIB2_TCP
  2175.      m2TcpInit (); /* the TCP group */
  2176. #endif /* INCLUDE_MIB2_TCP */ 
  2177. #ifdef INCLUDE_MIB2_UDP
  2178.      m2UdpInit (); /* the UDP group */
  2179. #endif /* INCLUDE_MIB2_UDP */
  2180. #ifdef INCLUDE_MIB2_ICMP
  2181.       m2IcmpInit (); /* the ICMP group */
  2182. #endif /* INCLUDE_MIB2_ICMP */
  2183. #if defined(INCLUDE_MIB2_IP) || defined(INCLUDE_MIB2_AT)
  2184.       m2IpInit (0); /* the IP group */
  2185. #endif /* MIB_IP */
  2186.     return (OK);
  2187.     }
  2188. /*******************************************************************************
  2189. *
  2190. * usrMib2CleanUp - clean up MIB-II state
  2191. *
  2192. * RETURNS: OK (always)
  2193. */
  2194. /*******************************************************************************
  2195. *
  2196. * usrMib2CleanUp - clean up MIB-II state
  2197. *
  2198. * RETURNS: OK (always)
  2199. */
  2200. STATUS usrMib2CleanUp (void)
  2201.     {
  2202. #ifdef INCLUDE_MIB2_SYSTEM
  2203.     m2SysDelete (); /* system clean up */
  2204. #endif /* INCLUDE_MIB2_SYSTEM */
  2205. #ifdef INCLUDE_MIB2_IF
  2206.     m2IfDelete (); /* interface clean up */
  2207. #endif /* INCLUDE_MIB2_IF */
  2208. #if defined(INCLUDE_MIB2_IP) || defined(INCLUDE_MIB2_AT)
  2209.     m2IpDelete (); /* IP clean up */
  2210. #endif /* MIB_IP */
  2211. #ifdef INCLUDE_MIB2_TCP
  2212.     m2TcpDelete (); /* the TCP group */
  2213. #endif /* INCLUDE_MIB2_TCP */ 
  2214. #ifdef INCLUDE_MIB2_UDP
  2215.     m2UdpDelete (); /* the UDP group */
  2216. #endif /* INCLUDE_MIB2_UDP */
  2217. #ifdef INCLUDE_MIB2_ICMP
  2218.     m2IcmpDelete (); /* the ICMP group */
  2219. #endif /* INCLUDE_MIB2_ICMP */
  2220.     return (OK);
  2221.     }
  2222. #else /* Case for MIB-II support only */
  2223. #if defined (INCLUDE_MIB2_ALL)
  2224. VOIDFUNCPTR _m2files[] =
  2225.     {
  2226.     (VOIDFUNCPTR) m2Init
  2227.     };
  2228. #else
  2229. #if defined(INCLUDE_MIB2_SYSTEM) || defined(INCLUDE_MIB2_IF)
  2230. #define INCLUDE_M2_FUNCS
  2231. #endif
  2232. #if defined(INCLUDE_MIB2_TCP) || defined(INCLUDE_MIB2_UDP)
  2233. #define INCLUDE_M2_FUNCS
  2234. #endif
  2235. #if defined(INCLUDE_MIB2_ICMP) || defined(INCLUDE_MIB2_IP)
  2236. #define INCLUDE_M2_FUNCS
  2237. #endif
  2238. #if defined(INCLUDE_MIB2_AT)
  2239. #define INCLUDE_M2_FUNCS
  2240. #endif
  2241. #if defined(INCLUDE_M2_FUNCS)
  2242. VOIDFUNCPTR _m2files[] =
  2243.     {
  2244. #if defined(INCLUDE_MIB2_SYSTEM)
  2245.     (VOIDFUNCPTR) m2SysInit,
  2246. #endif
  2247. #if defined(INCLUDE_MIB2_IF)
  2248.     (VOIDFUNCPTR) m2IfInit,
  2249. #endif
  2250. #if defined(INCLUDE_MIB2_TCP)
  2251.     (VOIDFUNCPTR) m2TcpInit,
  2252. #endif
  2253. #if defined(INCLUDE_MIB2_UDP)
  2254.     (VOIDFUNCPTR) m2UdpInit,
  2255. #endif
  2256. #if defined(INCLUDE_MIB2_ICMP)
  2257.     (VOIDFUNCPTR) m2IcmpInit,
  2258. #endif
  2259. #if defined(INCLUDE_MIB2_IP) || defined(INCLUDE_MIB2_AT)
  2260.     (VOIDFUNCPTR) m2IpInit,
  2261. #endif
  2262.     (VOIDFUNCPTR) 0L
  2263.     };
  2264. #endif /* INCLUDE_M2_FUNCS */
  2265. #endif /* INCLUDE_M2_ALL */
  2266. #endif /* INCLUDE_SNMPD */
  2267. #if defined(INCLUDE_STREAMS) || defined(INCLUDE_STREAMS_ALL)
  2268. /*******************************************************************************
  2269. *
  2270. * usrStrmInit - Streams subsystem initialization
  2271. *
  2272. * This routine is called at system startup time to create the Streams task
  2273. * and install relevant Streams services.
  2274. *
  2275. * RETURNS: OK, or ERROR if the Streams initialization fails.
  2276. */
  2277. STATUS usrStrmInit (void)
  2278.     {
  2279.     int strmMemSize = STREAMS_MEM_PART_SIZE;
  2280.     if ((strmMemSize == NULL) || (strmMemSize > STREAMS_MEM_MAX))
  2281.         strmMemSize = STREAMS_MEM_MAX;
  2282.  
  2283.     if (strmInit (strmMemSize,
  2284.                   STREAMS_MEM_PART_ADDR,
  2285.                   STREAMS_MSGSZ_MAX,
  2286.                   STREAMS_CTLSZ_MAX,
  2287.                   STREAMS_PUSH_MAX) == ERROR)
  2288.         {
  2289.         printf ("Streams initialization failuren");
  2290.         return (ERROR);
  2291.         }
  2292. #if defined(INCLUDE_STREAMS_SOCKET) || defined(INCLUDE_STREAMS_ALL)
  2293.     strmSockInit (); /* initialize sockmod module */
  2294.  
  2295.     if (sockLibAdd ((FUNCPTR) strmSockLibInit, AF_INET_STREAMS, AF_INET) ==
  2296.         ERROR)
  2297.         return (ERROR);
  2298.  
  2299. #ifdef  DEFAULT_STREAMS_SOCKET
  2300.     if (sockLibAdd ((FUNCPTR) strmSockLibInit, AF_INET, AF_INET) == ERROR)
  2301.         return (ERROR);
  2302. #endif /* DEFAULT_STREAMS_SOCKET */
  2303. #endif /* INCLUDE_STREAMS_SOCKET */
  2304. #if defined(INCLUDE_STREAMS_TLI) || defined(INCLUDE_STREAMS_ALL)
  2305.     /* initialize timod and tirdwr modules */
  2306.     if (tliInit () == ERROR)
  2307.         return (ERROR);
  2308. #endif /* INCLUDE_STREAMS_TLI */
  2309. #if defined(INCLUDE_STREAMS_AUTOPUSH) || defined(INCLUDE_STREAMS_ALL)
  2310.     if (autopushInit () == ERROR)
  2311. return (ERROR);         
  2312. #endif /* INCLUDE_STREAMS_AUTOPUSH */
  2313.  
  2314. #if defined(INCLUDE_STREAMS_DLPI) || defined(INCLUDE_STREAMS_ALL)
  2315.     /* initialize the /dev/dlb devices */
  2316.     if (dlpiInit () == ERROR)
  2317. return (ERROR);
  2318. #endif /* INCLUDE_STREAMS_DLPI */
  2319.  
  2320. #if defined(INCLUDE_STREAMS_STRACE) || defined(INCLUDE_STREAMS_ALL) 
  2321.     strmStraceInit (STREAMS_STRACE_OUTPUT_DIR);  /* init strace utility */ 
  2322. #endif /* INCLUDE_STREAMS_STRACE */ 
  2323.  
  2324. #if defined(INCLUDE_STREAMS_STRERR) || defined(INCLUDE_STREAMS_ALL) 
  2325.     strmStrerrInit (STREAMS_STRERR_OUTPUT_DIR);  /* init strerr utility */ 
  2326. #endif /* INCLUDE_STREAMS_STRERR */ 
  2327.                                     
  2328. #ifdef INCLUDE_STREAMS_DEBUG
  2329.     /* initialize the Streams debug facility */
  2330.     if (strmDebugInit () == ERROR)
  2331. return (ERROR);
  2332. #endif /* INCLUDE_STREAMS_DEBUG */
  2333.  
  2334.     /* call user-provided protocol initialization hook routine */
  2335.     if ((strmProtoInitRtn != NULL) && ((*strmProtoInitRtn) () == ERROR))
  2336.         return (ERROR);
  2337.     return (OK); /* Streams initialization complete */
  2338.     }
  2339. #endif /* INCLUDE_STREAMS */
  2340. /*******************************************************************************
  2341. *
  2342. * usrNetProtoInit - configure the various protocols 
  2343. *
  2344. * This routine configures various protocols of the network system.
  2345. * This function should be called before netLibInit() at the initialization
  2346. * time. 
  2347. *
  2348. * RETURNS: OK, or ERROR if the protocol initialization fails
  2349. *
  2350. * NOMANUAL
  2351. */
  2352. STATUS usrNetProtoInit (void)
  2353.     {
  2354.     ipLibInit (&ipCfgParams);   /* has to included by default */
  2355.     rawIpLibInit (); /* has to included by default */
  2356.     rawLibInit ();
  2357. #ifdef INCLUDE_IP_FILTER
  2358.     ipFilterLibInit (); /* include ip filter library */
  2359. #endif /* INCLUDE_IP_FILTER */
  2360. #ifdef INCLUDE_UDP
  2361.     udpLibInit (&udpCfgParams);  /* udp protocol initialization */
  2362. #ifdef INCLUDE_NET_SHOW
  2363.     udpShowInit ();
  2364. #endif /* INCLUDE_NET_SHOW */     
  2365. #endif /* INCLUDE_UDP */
  2366. #ifdef INCLUDE_TCP
  2367.     tcpLibInit (&tcpCfgParams);  /* tcp protocol initialization */
  2368. #ifdef INCLUDE_NET_SHOW
  2369.     tcpShowInit ();
  2370. #endif /* INCLUDE_NET_SHOW */     
  2371. #endif /* INCLUDE_TCP */
  2372. #ifdef INCLUDE_ICMP
  2373.     icmpLibInit (&icmpCfgParams); /* icmp protocol initialization */
  2374. #ifdef INCLUDE_NET_SHOW
  2375.     icmpShowInit ();
  2376. #endif /* INCLUDE_NET_SHOW */     
  2377. #endif /* INCLUDE_ICMP */
  2378. #ifdef INCLUDE_IGMP
  2379.     igmpLibInit (); /* igmp protocol initialization */
  2380. #ifdef INCLUDE_NET_SHOW
  2381.     igmpShowInit ();
  2382. #endif /* INCLUDE_NET_SHOW */     
  2383. #ifdef INCLUDE_MCAST_ROUTING
  2384.     mCastRouteLibInit (); /* initialize multicast routing */
  2385. #endif /* INCLUDE_MCAST_ROUTING */
  2386. #endif /* INCLUDE_IGMP */    
  2387. #ifdef INCLUDE_OSPF
  2388.     ospfLibInit ();
  2389. #endif
  2390.     return (OK); 
  2391.     }
  2392. #ifdef INCLUDE_DNS_RESOLVER
  2393. LOCAL STATUS usrResolvInit ()
  2394.     {
  2395. #ifdef INCLUDE_DNS_DEBUG
  2396.     extern int dnsDebug (void);
  2397.     
  2398.     return (resolvInit (RESOLVER_DOMAIN_SERVER, RESOLVER_DOMAIN, dnsDebug));
  2399. #else
  2400.     return (resolvInit (RESOLVER_DOMAIN_SERVER, RESOLVER_DOMAIN, NULL));
  2401. #endif /* INCLUDE_DNS_DEBUG*/
  2402.     }
  2403. #endif /* INCLUDE_DNS_RESOLVER */
  2404. #endif /* __INCusrNetworkc */