bootConfig.c
上传用户:yingyi0918
上传日期:2022-06-26
资源大小:214k
文件大小:132k
源码类别:

VxWorks

开发平台:

C/C++

  1. return (ERROR);
  2. }
  3.     return (OK);
  4.     }
  5. #ifdef INCLUDE_END
  6. /*******************************************************************************
  7. *
  8. * findCookie - traverses the cookieTbl to return the right cookie
  9. *
  10. * Given the unit number and the device name this function traverses the cookieTbl
  11. * to return the right cookie. This is a local file.
  12. *
  13. * RETURNS: cookie or NULL
  14. *
  15. */
  16. LOCAL void* findCookie
  17.     (
  18.     int unitNo,
  19.     char* devName
  20.     )
  21.     {
  22.     int count;
  23.     for(count=0;count<32;count++)
  24. {
  25. if((cookieTbl[count].unitNo==unitNo) && 
  26.     (STREQ(cookieTbl[count].devName,devName)))
  27.         return(cookieTbl[count].pCookie);
  28. }
  29.     return (NULL);
  30.     }
  31. #endif    /* INCLUDE_END */
  32. /*******************************************************************************
  33. *
  34. * netLoad - downLoad a file from a remote machine via the network.
  35. *
  36. * The remote shell daemon on the machine 'host' is used to download
  37. * the given file to the specified previously opened network file descriptor.
  38. * The remote userId should have been set previously by a call to iam().
  39. * If the file does not exist, the error message from the Unix 'host'
  40. * is printed to the VxWorks standard error fd and ERROR is returned.
  41. *
  42. * RETURNS: OK or ERROR
  43. */
  44. LOCAL STATUS netLoad 
  45.     (
  46.     char *hostName,
  47.     char *fileName,
  48.     char *usr,
  49.     char *passwd,
  50.     FUNCPTR *pEntry
  51.     )
  52.     {
  53.     int fd;
  54.     int errFd; /* for receiving standard error messages from Unix */
  55.     char command [100];
  56.     BOOL bootFtp = (passwd[0] != EOS);
  57.     BOOL bootRsh = FALSE;
  58.     printf ("Loading... ");
  59. #ifdef INCLUDE_TFTP_CLIENT
  60.     if (sysFlags & SYSFLG_TFTP) /* use tftp to get image */
  61.         {
  62. if (tftpXfer (hostName, 0, fileName, "get", "binary", &fd,
  63.       &errFd) == ERROR)
  64.     return (ERROR);
  65. }
  66.    else
  67. #endif
  68.        {
  69. if (bootFtp)
  70.     {
  71.     if (ftpXfer (hostName, usr, passwd, "", "RETR %s", "", fileName,
  72.          &errFd, &fd) == ERROR)
  73. return (ERROR);
  74.     }
  75. else
  76.     {
  77.     bootRsh = TRUE;
  78.     sprintf (command, "cat %s", fileName);
  79.     fd = rcmd (hostName, RSHD, usr, usr, command, &errFd);
  80.     if (fd == ERROR)
  81. return (ERROR);
  82.     }
  83. }
  84.     if (bootLoadModule (fd, pEntry) != OK)
  85. goto readErr;
  86. #ifdef INCLUDE_TFTP_CLIENT
  87.     /*
  88.      * Successful TFTP transfers don't need any cleanup. The tftpXfer()
  89.      * routine closes all file descriptors once the data has been
  90.      * retrieved from the remote host.
  91.      */
  92.     if (sysFlags & SYSFLG_TFTP) /* used tftp to get image - just exit */
  93.         return (OK);
  94. #endif
  95.     if (bootRsh == FALSE)
  96. {
  97. /* Empty the Data Socket before close. PC FTP server hangs otherwise */
  98. while ((read (fd, command, sizeof (command))) > 0);
  99. if (bootFtp)
  100.     (void) ftpCommand (errFd, "QUIT",0,0,0,0,0,0);
  101. }
  102.     close (fd);
  103.     close (errFd);
  104.     return (OK);
  105. readErr:
  106.     /* check standard error on Unix */
  107.     if (bootRsh == FALSE)
  108. {
  109. /* Empty the Data Socket before close. PC FTP server hangs otherwise */
  110. while ((read (fd, command, sizeof (command))) > 0);
  111. if (bootFtp)
  112.     {
  113.     (void) ftpReplyGet (errFd, FALSE); /* error message on std. err */
  114.     (void) ftpCommand (errFd, "QUIT",0,0,0,0,0,0);
  115.     }
  116. }
  117.     else
  118. {
  119. char buf [100];
  120. int errBytesRecv = fioRead (errFd, buf, sizeof (buf));
  121. if (errBytesRecv > 0)
  122.     {
  123.     /* print error message on standard error fd */
  124.     buf [errBytesRecv] = EOS;
  125.     printf ("n%s:%s: %sn", hostName, fileName, buf);
  126.     }
  127. }
  128.     close (fd);
  129.     close (errFd);
  130.     return (ERROR);
  131.     }
  132. #endif  /* INCLUDE_NETWORK */
  133. #if     (defined (INCLUDE_SCSI_BOOT) || defined (INCLUDE_FD) || 
  134.  defined (INCLUDE_IDE) || defined (INCLUDE_ATA) || 
  135.  defined (INCLUDE_TFFS))
  136. #define SPIN_UP_TIMEOUT 45 /* max # of seconds to wait for spinup */
  137. /******************************************************************************
  138. *
  139. * devSplit - split the device name from a full path name
  140. *
  141. * This routine returns the device name from a valid UNIX-style path name
  142. * by copying until two slashes ("/") are detected.  The device name is
  143. * copied into <devName>.
  144. *
  145. * RETURNS: N/A
  146. *
  147. * NOMANUAL
  148. */
  149. void devSplit 
  150.     (
  151.     FAST char *fullFileName, /* full file name being parsed */
  152.     FAST char *devName /* result device name */
  153.     )
  154.     {
  155.     FAST int nChars = 0;
  156.     if (fullFileName != NULL)
  157. {
  158. char *p0 = fullFileName;
  159. char *p1 = devName;
  160. while ((nChars < 2) && (*p0 != EOS))
  161.     {
  162.     if (*p0 == '/')
  163. nChars++;
  164.     *p1++ = *p0++;
  165.     }
  166. *p1 = EOS;
  167. }
  168.     else
  169. {
  170. (void) strcpy (devName, "");
  171. }
  172.     }
  173. #endif  /* (defined (INCLUDE_SCSI_BOOT) || (INCLUDE_FD) || (INCLUDE_IDE)) */
  174. #ifdef  INCLUDE_SCSI_BOOT
  175. /******************************************************************************
  176. *
  177. * scsiLoad - load a vxWorks image from a local SCSI disk
  178. *
  179. * RETURNS: OK, or ERROR if file can not be loaded.
  180. */
  181. LOCAL STATUS scsiLoad 
  182.     (
  183.     int     bootDevId,
  184.     int     bootDevLUN,
  185.     char    *fileName,
  186.     FUNCPTR *pEntry
  187.     )
  188.     {
  189.     int fd;
  190.     SCSI_PHYS_DEV *pScsiPhysBootDev;
  191.     BLK_DEV       *pScsiBlkBootDev;
  192.     char bootDir  [BOOT_FILE_LEN];
  193.     int           ix;
  194. #ifdef INCLUDE_SCSI2
  195.     SCSI_OPTIONS  options;
  196.     UINT          which;
  197. #endif /* INCLUDE_SCSI2 */
  198.     if (!scsiInitialized) /* skip if this is a retry */
  199. {
  200. if (sysScsiInit () == ERROR)
  201.     {
  202.     printErr ("Could not initialize SCSI.n");
  203.     return (ERROR);
  204.     }
  205. scsiInitialized = TRUE;
  206. }
  207.     taskDelay (sysClkRateGet ()); /* delay 1 second after reset */
  208.     if ((bootDevId  < SCSI_MIN_BUS_ID) ||
  209. (bootDevId  > SCSI_MAX_BUS_ID) ||
  210. (bootDevLUN < SCSI_MIN_LUN)    ||
  211. (bootDevLUN > SCSI_MAX_LUN))
  212. {
  213. printErr ("SCSI device parameters < busId = %d, lun = %d > ",
  214.   bootDevId, bootDevLUN);
  215. printErr ("are out of range (0-7).n");
  216. printErr ("Check boot device format:n");
  217. printErr ("    scsi=<busId>,<lun>  e.g.  scsi=2,0n");
  218. return (ERROR);
  219. }
  220. #ifdef INCLUDE_SCSI2
  221.     /* Set all devices to asynchronous data transfer */
  222.     which = SCSI_SET_OPT_XFER_PARAMS;
  223.     options.maxOffset = 0;
  224.     options.minPeriod = SCSI_SYNC_XFER_MIN_PERIOD;
  225.     scsiTargetOptionsSet (pSysScsiCtrl, bootDevId, &options, which);
  226. #endif /* INCLUDE_SCSI2 */
  227.     /* create device handle for TEST UNIT READY commands */
  228.     if ((pScsiPhysBootDev = scsiPhysDevCreate (pSysScsiCtrl, bootDevId,
  229.        bootDevLUN, 128, 0, 0,
  230.        0xffff, 512))
  231. == NULL)
  232. {
  233. printErr ("scsiPhysDevCreate failed.n");
  234. return (ERROR);
  235. }
  236.     /* issue a couple fo TEST UNIT READY commands to clear reset execption */
  237.     scsiTestUnitRdy (pScsiPhysBootDev);
  238.     scsiTestUnitRdy (pScsiPhysBootDev);
  239.     /* issue a TEST UNIT READY every second for SPIN_UP_TIMEOUT seconds,
  240.      * or until device returns OK status.
  241.      */
  242.     if (scsiTestUnitRdy (pScsiPhysBootDev) != OK)
  243.         {
  244.         printf ("Waiting for disk to spin up...");
  245.         for (ix = 0; ix < SPIN_UP_TIMEOUT; ix++)
  246.             {
  247.             if (scsiTestUnitRdy (pScsiPhysBootDev) == OK)
  248.                 {
  249.                 printf (" done.n");
  250.                 break;
  251. }
  252.             else
  253. {
  254.                 if (ix != (SPIN_UP_TIMEOUT - 1))
  255.                     printf (".");
  256.                 else
  257.                     {
  258.                     printf (" timed out.n");
  259.                     return (ERROR);
  260.     }
  261.                 taskDelay (sysClkRateGet ());
  262. }
  263.     }
  264. }
  265.     /* delete temporary device handle */
  266.     scsiPhysDevDelete (pScsiPhysBootDev);
  267.     printf ("Attaching to scsi device... ");
  268.     /* recreate a device handle, with polling for actual device parameters */
  269.     taskDelay (sysClkRateGet ());
  270.     if ((pScsiPhysBootDev = scsiPhysDevCreate (pSysScsiCtrl, bootDevId,
  271.                                                bootDevLUN, 0, -1, 0, 0, 0))
  272.          == NULL)
  273. {
  274.         printErr ("scsiPhysDevCreate failed.n");
  275.         return (ERROR);
  276.         }
  277.     /*-------------------------------------------------------------------------
  278.      *
  279.      * Configuration of an OMTI3500
  280.      *
  281.      *-----------------------------------------------------------------------*/
  282.     if ((strncmp (pScsiPhysBootDev->devVendorID, "SMS", 3) == 0) &&
  283. (strncmp (pScsiPhysBootDev->devProductID, "OMTI3500", 8) == 0))
  284. {
  285. char modeData [4]; /* array for floppy MODE SELECT data */
  286. /* zero modeData array, then set byte 1 to "medium code" (0x1b).
  287.  * NOTE: MODE SELECT data is highly device-specific.  If your device
  288.  * requires configuration via MODE SELECT, please consult the device's
  289.  * Programmer's Reference for the relevant data format.
  290.  */
  291. bzero (modeData, sizeof (modeData));
  292. modeData [1] = 0x1b;
  293. /* issue a MODE SELECT cmd to correctly configure floppy controller */
  294. scsiModeSelect (pScsiPhysBootDev, 1, 0, modeData, sizeof (modeData));
  295. /* delete and re-create the SCSI_PHYS_DEV so that INQUIRY will return
  296.  * the new device parameters, i.e., correct number of blocks
  297.  */
  298. scsiPhysDevDelete (pScsiPhysBootDev);
  299. /* recreate a device handle, polling for actual device parameters */
  300. if ((pScsiPhysBootDev = scsiPhysDevCreate (pSysScsiCtrl, bootDevId,
  301.    bootDevLUN, 0, -1, 0, 0, 0))
  302.     == NULL)
  303.     {
  304.     printErr ("scsiPhysDevCreate failed.n");
  305.     return (ERROR);
  306.     }
  307. }
  308.     /*-------------------------------------------------------------------------
  309.      *
  310.      * END of OMTI3500 configuration
  311.      *
  312.      *-----------------------------------------------------------------------*/
  313.     /*-------------------------------------------------------------------------
  314.      *
  315.      * START OF CODE WHICH ASSUMES A DOS-FS PARTITION BEGINNING AT BLOCK 0
  316.      *
  317.      *-----------------------------------------------------------------------*/
  318.     /* create a block device spanning entire disk (non-distructive!) */
  319.     if ((pScsiBlkBootDev = scsiBlkDevCreate (pScsiPhysBootDev, 0, 0)) == NULL)
  320. {
  321.         printErr ("scsiBlkDevCreate failed.n");
  322.         return (ERROR);
  323. }
  324.     dosFsInit (NUM_DOSFS_FILES);        /* initialize DOS-FS */
  325.     /* split off boot device from boot file */
  326.     devSplit (fileName, bootDir);
  327.     /* initialize the boot block device as a dosFs device named <bootDir> */
  328.     if (dosFsDevInit (bootDir, pScsiBlkBootDev, NULL) == NULL)
  329. {
  330.         printErr ("dosFsDevInit failed.n");
  331.         return (ERROR);
  332. }
  333.     /*-------------------------------------------------------------------------
  334.      *
  335.      * END OF CODE WHICH ASSUMES A DOS-FS PARTITION BEGINNING AT BLOCK 0
  336.      *
  337.      *------------------------------------------------------------------------*/
  338.     printErr ("done.n");
  339.     /* load the boot file */
  340.     printErr ("Loading %s...", fileName);
  341.     fd = open (fileName, O_RDONLY, 0);
  342.     if (fd == ERROR)
  343. {
  344.         printErr ("nCannot open "%s".n", fileName);
  345.         return (ERROR);
  346. }
  347.     if (bootLoadModule (fd, pEntry) != OK)
  348.         goto readErr;
  349.     close (fd);
  350.     return (OK);
  351. readErr:
  352.     printErr ("nerror loading file: status = 0x%x.n", errnoGet ());
  353.     close (fd);
  354.     return (ERROR);
  355.     }
  356. #endif /* INCLUDE_SCSI_BOOT */
  357. #ifdef INCLUDE_FD
  358. #include "../../src/config/usrFd.c"
  359. /******************************************************************************
  360. *
  361. * fdLoad - load a vxWorks image from a local floppy disk
  362. *
  363. * RETURNS: OK, or ERROR if file can not be loaded.
  364. */
  365. LOCAL STATUS fdLoad 
  366.     (
  367.     int     drive,
  368.     int     type,
  369.     char    *fileName,
  370.     FUNCPTR *pEntry
  371.     )
  372.     {
  373.     int fd;
  374.     if (fdDrv (FD_INT_VEC, FD_INT_LVL) != OK)
  375. {
  376. printErr ("Could not initialize.n");
  377. return (ERROR);
  378. }
  379.     printf ("Attaching to floppy disk device... ");
  380.     dosFsInit (NUM_DOSFS_FILES);        /* initialize DOS-FS */
  381.     if (usrFdConfig (drive, type, fileName) == ERROR)
  382. {
  383.         printErr ("usrFdConfig failed.n");
  384.         return (ERROR);
  385. }
  386.     printErr ("done.n");
  387.     /* load the boot file */
  388.     printErr ("Loading %s...", fileName);
  389.     if ((fd = open (fileName, O_RDONLY, 0)) == ERROR)
  390. {
  391.         printErr ("nCannot open "%s".n", fileName);
  392.         return (ERROR);
  393. }
  394.     if (bootLoadModule (fd, pEntry) != OK)
  395.         goto fdLoadErr;
  396.     close (fd);
  397.     return (OK);
  398. fdLoadErr:
  399.     printErr ("nerror loading file: status = 0x%x.n", errnoGet ());
  400.     close (fd);
  401.     return (ERROR);
  402.     }
  403. #endif /* INCLUDE_FD */
  404. #ifdef INCLUDE_IDE
  405. #define IDE_MEM_DOSFS 0x200000
  406. #include "../../src/config/usrIde.c"
  407. /******************************************************************************
  408. *
  409. * ideLoad - load a vxWorks image from a local IDE disk
  410. *
  411. * RETURNS: OK, or ERROR if file can not be loaded.
  412. */
  413. LOCAL STATUS ideLoad 
  414.     (
  415.     int     drive,
  416.     int     type,
  417.     char    *fileName,
  418.     FUNCPTR *pEntry
  419.     )
  420.     {
  421.     int fd;
  422.     if (ideDrv (IDE_INT_VEC, IDE_INT_LVL, type) == ERROR)
  423. {
  424. printErr ("Could not initialize.n");
  425. return (ERROR);
  426. }
  427.     printf ("Attaching to IDE disk device... ");
  428.     dosFsInit (NUM_DOSFS_FILES);        /* initialize DOS-FS */
  429.     if (usrIdeConfig (drive, fileName) == ERROR)
  430. {
  431.         printErr ("usrIdeConfig failed.n");
  432.         return (ERROR);
  433. }
  434.     printErr ("done.n");
  435.     /* load the boot file */
  436.     printErr ("Loading %s...", fileName);
  437.     if ((fd = open (fileName, O_RDONLY, 0)) == ERROR)
  438. {
  439.         printErr ("nCannot open "%s".n", fileName);
  440.         return (ERROR);
  441. }
  442.     if (bootLoadModule (fd, pEntry) != OK)
  443.         goto ideLoadErr;
  444.     close (fd);
  445.     return (OK);
  446. ideLoadErr:
  447.     printErr ("nerror loading file: status = 0x%x.n", errno);
  448.     close (fd);
  449.     return (ERROR);
  450.     }
  451. #endif /* INCLUDE_IDE */
  452. #ifdef INCLUDE_ATA
  453. #define ATA_MEM_DOSFS 0x200000
  454. #include "../../src/config/usrAta.c"
  455. /******************************************************************************
  456. *
  457. * ataLoad - load a vxWorks image from a local ATA disk
  458. *
  459. * RETURNS: OK, or ERROR if file can not be loaded.
  460. */
  461. LOCAL STATUS ataLoad 
  462.     (
  463.     int     ctrl,
  464.     int     drive,
  465.     char    *fileName,
  466.     FUNCPTR *pEntry
  467.     )
  468.     {
  469.     IMPORT ATA_RESOURCE ataResources[];
  470.     ATA_RESOURCE *pAtaResource = &ataResources[ctrl];
  471.     int fd;
  472.     if (ataDrv (ctrl, pAtaResource->drives, pAtaResource->intVector,
  473. pAtaResource->intLevel, pAtaResource->configType,
  474. pAtaResource->semTimeout, pAtaResource->wdgTimeout) == ERROR)
  475. {
  476. printErr ("Could not initialize.n");
  477. return (ERROR);
  478. }
  479.     printf ("Attaching to ATA disk device... ");
  480.     dosFsInit (NUM_DOSFS_FILES);        /* initialize DOS-FS */
  481.     if (usrAtaConfig (ctrl, drive, fileName) == ERROR)
  482. {
  483.         printErr ("usrAtaConfig failed.n");
  484.         return (ERROR);
  485. }
  486.     printErr ("done.n");
  487.     /* load the boot file */
  488.     printErr ("Loading %s...", fileName);
  489.     if ((fd = open (fileName, O_RDONLY, 0)) == ERROR)
  490. {
  491.         printErr ("nCannot open "%s".n", fileName);
  492.         return (ERROR);
  493. }
  494.     if (bootLoadModule (fd, pEntry) != OK)
  495.         goto ataLoadErr;
  496.     close (fd);
  497.     return (OK);
  498. ataLoadErr:
  499.     printErr ("nerror loading file: status = 0x%x.n", errno);
  500.     close (fd);
  501.     return (ERROR);
  502.     }
  503. #endif /* INCLUDE_ATA */
  504. #ifdef INCLUDE_PCMCIA
  505. #define PCMCIA_MEM_DOSFS 0x200000
  506. #include "../../src/config/usrPcmcia.c"
  507. /******************************************************************************
  508. *
  509. * pcmciaLoad - load a vxWorks image from a PCMCIA disk device
  510. *
  511. * RETURNS: OK, or ERROR if file can not be loaded.
  512. */
  513. LOCAL STATUS pcmciaLoad 
  514.     (
  515.     int     sock,
  516.     char    *fileName,
  517.     FUNCPTR *pEntry
  518.     )
  519.     {
  520.     int fd;
  521.     printf ("Attaching to PCMCIA block device... ");
  522.     dosFsInit (NUM_DOSFS_FILES);        /* initialize DOS-FS */
  523.     if (usrPcmciaConfig (sock, fileName) != OK)
  524.         return (ERROR);
  525.     printErr ("done.n");
  526.     /* load the boot file */
  527.     printErr ("Loading %s...", fileName);
  528.     if ((fd = open (fileName, O_RDONLY, 0)) == ERROR)
  529. {
  530.         printErr ("nCannot open "%s".n", fileName);
  531.         return (ERROR);
  532. }
  533.     if (bootLoadModule (fd, pEntry) != OK)
  534.         goto pcmciaLoadErr;
  535.     close (fd);
  536.     return (OK);
  537. pcmciaLoadErr:
  538.     printErr ("nerror loading file: status = 0x%x.n", errno);
  539.     close (fd);
  540.     return (ERROR);
  541.     }
  542. #endif /* INCLUDE_PCMCIA */
  543. #ifdef INCLUDE_TFFS
  544. #define TFFS_MEM_DOSFS 0x200000
  545. #include "../../src/config/usrTffs.c"
  546. /******************************************************************************
  547. *
  548. * tffsLoad - load a vxWorks image from a TFFS Flash disk
  549. *
  550. * RETURNS: OK, or ERROR if file can not be loaded.
  551. *
  552. * NOMANUAL
  553. */
  554. LOCAL STATUS tffsLoad 
  555.     (
  556.     int     drive, /* TFFS drive number (0 - (noOfDrives-1)) */
  557.     int     removable, /* 0 - nonremovable flash media */
  558.     char    * fileName, /* file name to download */
  559.     FUNCPTR * pEntry
  560.     )
  561.     {
  562.     int fd;
  563.     if (tffsDrv () != OK)
  564. {
  565. printErr ("Could not initialize.n");
  566. return (ERROR);
  567. }
  568.     printf ("Attaching to TFFS... ");
  569.     dosFsInit (NUM_DOSFS_FILES);        /* initialize DOS-FS */
  570.     if (usrTffsConfig (drive, removable, fileName) == ERROR)
  571. {
  572.         printErr ("usrTffsConfig failed.n");
  573.         return (ERROR);
  574. }
  575.     printErr ("done.n");
  576.     /* load the boot file */
  577.     printErr ("Loading %s...", fileName);
  578.     if ((fd = open (fileName, O_RDONLY, 0)) == ERROR)
  579. {
  580.         printErr ("nCannot open "%s".n", fileName);
  581.         return (ERROR);
  582. }
  583.     if (bootLoadModule (fd, pEntry) != OK)
  584.         goto tffsLoadErr;
  585.     close (fd);
  586.     return (OK);
  587. tffsLoadErr:
  588.     printErr ("nerror loading file: status = 0x%x.n", errnoGet ());
  589.     close (fd);
  590.     return (ERROR);
  591.     }
  592. #endif /* INCLUDE_TFFS */
  593. #ifdef INCLUDE_TSFS_BOOT
  594. /******************************************************************************
  595. *
  596. * tsfsLoad - load a vxWorks image from a Target Server File System (TSFS).
  597. *
  598. * RETURNS: OK, or ERROR if file can not be loaded.
  599. *
  600. * NOMANUAL
  601. */
  602. LOCAL STATUS tsfsLoad 
  603.     (
  604.     char    * fileName, /* file name to download */
  605.     FUNCPTR * pEntry
  606.     )
  607.     {
  608.     int fd;
  609.     WDB_EVT_NODE rebootEventNode;
  610.     char corefile [strlen (fileName) + 8];
  611.     /* add a leading slash if the filename is a relatif path */
  612.     if (fileName[0] != '/' && fileName[0] != '\')
  613. sprintf (corefile, "/tgtsvr/%s", fileName);
  614.     else
  615. sprintf (corefile, "/tgtsvr%s", fileName);
  616.     printf ("Booting using TSFS...nMake sure that your");
  617.     printf (" Target Server is started with -R[oot] option.n");
  618. #ifndef INCLUDE_TSFS_BOOT_VIO_CONSOLE
  619.     printf ("Waiting for Target Server connection...");
  620.     /* wait for Target Server connection */
  621.     while (!wdbTargetIsConnected())
  622.      taskDelay (sysClkRateGet());
  623.     printf (" Done.n");
  624. #endif /* INCLUDE_TSFS_BOOT_VIO_CONSOLE */
  625.     /* open the core file via tsfs */
  626.     printErr ("nLoading %s...n", corefile);
  627.     if ((fd = open (corefile, O_RDONLY, 0)) == ERROR)
  628. {
  629.         printErr ("nCannot open "%s".n", corefile);
  630.         return (ERROR);
  631. }
  632.     /* load the the core file */
  633.     if (bootLoadModule (fd, pEntry) != OK)
  634.         goto tsfsLoadErr;
  635.     close (fd);
  636. #if (WDB_COMM_TYPE != WDB_COMM_SERIAL)
  637.     /* Notify the host of the target reboot */
  638.     wdbEventNodeInit (&rebootEventNode, wdbRebootEventGet, NULL, NULL);
  639.     wdbEventPost (&rebootEventNode);
  640.     /* let some time to WDB to post the event */
  641.     taskDelay (sysClkRateGet() / 10);
  642. #endif /* WDB_COMM_TYPE != WDB_COMM_SERIAL */
  643.     return (OK);
  644. tsfsLoadErr:
  645.     printErr ("nerror loading file: status = 0x%x.n", errnoGet ());
  646.     close (fd);
  647.     return (ERROR);
  648.     }
  649. /******************************************************************************
  650. *
  651. * wdbRebootEventGet - dummy eventGet routine to force the Target Server restart
  652. *
  653. * suspend the WDB task, so the Target Server will get a RPC_SYSTEMERROR
  654. * will trying to get an event, so it will restart and try to re-attach to
  655. * the target.
  656. */
  657. LOCAL void wdbRebootEventGet
  658.     (
  659.     void * pNode,
  660.     WDB_EVT_DATA * pEvtData
  661.     )
  662.     {
  663.     taskSuspend (0);
  664.     }
  665. #endif /* INCLUDE_TSFS_BOOT */
  666. #ifdef  INCLUDE_NETWORK
  667. /******************************************************************************
  668. *
  669. * netifAdrsPrint - print MAC address of a network interface
  670. */
  671. LOCAL void netifAdrsPrint 
  672.     (
  673.     char *ifname /* interface name */
  674.     )
  675.     {
  676.     IMPORT struct ifnet *ifunit ();
  677.     struct ifnet *ifp;
  678.     char *buf;
  679.     char  devName [10];
  680.     int i, value;
  681.     if (ifname == NULL || *ifname == EOS)
  682. {
  683. printf ("Interface not specifiedn");
  684. return;
  685. }
  686.     while (*ifname == ' ')
  687. ifname++;       /* skip leading blanks */
  688.     if (*ifname == EOS)
  689. {
  690. printf ("Interface not specifiedn");
  691. return;
  692. }
  693.     /* Search for unit number of network device. */
  694.     i = 0;
  695.     while (!isdigit((int)ifname[i]) && !isspace((int)ifname[i]) && ifname[i] != EOS)
  696.        i++;
  697.     if (ifname[i] == EOS)          /* No unit number given - use 0. */
  698.        value = 0;
  699.  
  700.     buf = &ifname[i];
  701.     if (bootScanNum (&buf, &value, FALSE) != OK)  /* No unit number - use 0. */
  702.        value = 0;
  703.     ifname[i] = EOS;
  704.     sprintf (devName, "%s%d", ifname, value);
  705.     if (strncmp (devName, "bp", 2) == 0)
  706. {
  707. /* address for backplane is just processor number */
  708. printf ("Address for device "%s" == 00:00:00:00:00:%02xn",
  709. devName,  sysProcNumGet ());
  710. return;
  711. }
  712.     /* start the network */
  713.     hostTblInit (); /* initialize host table */
  714.     netLibInit ();
  715.     if ((ifp = ifunit (devName)) == NULL)
  716. {
  717. if ((usrNetIfAttach (ifname, value, "0") != OK) ||
  718.     (usrNetIfConfig (ifname, value, "0", (char *) NULL, 0) != OK))
  719.     {
  720.     printf ("Cannot initialize interface named "%s"n", devName);
  721.     return;
  722.     }
  723. if ((ifp = ifunit (devName)) == NULL)
  724.     {
  725.     printf ("Device named "%s" doesn't exist.n", devName);
  726.     return;
  727.     }
  728. }
  729.     if (!(ifp->if_flags & IFF_POINTOPOINT) &&
  730. !(ifp->if_flags & IFF_LOOPBACK))
  731. {
  732.         printf ("Address for device "%s" == %02x:%02x:%02x:%02x:%02x:%02xn",
  733. devName,
  734. ((struct arpcom *)ifp)->ac_enaddr [0],
  735. ((struct arpcom *)ifp)->ac_enaddr [1],
  736. ((struct arpcom *)ifp)->ac_enaddr [2],
  737. ((struct arpcom *)ifp)->ac_enaddr [3],
  738. ((struct arpcom *)ifp)->ac_enaddr [4],
  739. ((struct arpcom *)ifp)->ac_enaddr [5]);
  740. }
  741.     if_dettach (ifunit (devName)); /* dettach interface for fresh start */
  742.     }
  743. #endif  /* INCLUDE_NETWORK */
  744. /*******************************************************************************
  745. *
  746. * go - start at specified address
  747. */
  748. LOCAL void go 
  749.     (
  750.     FUNCPTR entry
  751.     )
  752.     {
  753.     printf ("Starting at 0x%x...nn", (int) entry);
  754.     taskDelay (sysClkRateGet ()); /* give the network a moment to close */
  755. #ifdef  INCLUDE_NETWORK
  756.     ifreset (); /* reset network to avoid interrupts */
  757. #ifdef INCLUDE_END
  758.    
  759.     /* Stop all ENDs to restore to known state for interrupts and DMA */
  760.     (void) muxDevStopAll (0);      
  761. #endif  /* INCLUDE_END */
  762. #endif  /* INCLUDE_NETWORK */
  763. #if (CPU_FAMILY == PPC)
  764.     cacheTextUpdate ((void *) (LOCAL_MEM_LOCAL_ADRS), /* cache coherency */
  765.      (size_t) (sysMemTop() - LOCAL_MEM_LOCAL_ADRS));
  766. #else
  767. #ifdef INCLUDE_CACHE_SUPPORT
  768.     cacheClear (DATA_CACHE, NULL, ENTIRE_CACHE); /* push cache to mem */
  769. #endif /* INCLUDE_CACHE_SUPPORT */
  770. #endif /* (CPU_FAMILY == PPC) */
  771. #if (CPU_FAMILY == I80X86)
  772.     sysClkDisable (); /* no clock interrupts are necessary */
  773. #endif /* (CPU_FAMILY == I80X86) */
  774.     (entry) (); /* go to entry point - never to return */
  775.     }
  776. /*******************************************************************************
  777. *
  778. * m - modify memory
  779. *
  780. * This routine prompts the user for modifications to memory, starting at the
  781. * specified address.  It prints each address, and the current contents of
  782. * that address, in turn.  The user can respond in one of several ways:
  783. *
  784. * RETURN   - No change to that address, but continue
  785. *    prompting at next address.
  786. * <number> - Set the contents to <number>.
  787. * . (dot)  - No change to that address, and quit.
  788. * <EOF>  - No change to that address, and quit.
  789. *
  790. * All numbers entered and displayed are in hexadecimal.
  791. * Memory is treated as 16-bit words.
  792. */
  793. LOCAL void m 
  794.     (
  795.     char *adrs /* address to change */
  796.     )
  797.     {
  798.     char line [MAX_LINE + 1]; /* leave room for EOS */
  799.     char *pLine; /* ptr to current position in line */
  800.     int value; /* value found in line */
  801.     char excess;
  802.     /* round down to word boundary */
  803.     for (adrs = (char *) ((int) adrs & 0xfffffffe); /* start on even addr */
  804.          ; /* FOREVER */
  805.  adrs = (char *) (((short *) adrs) + 1)) /* bump as short ptr */
  806. {
  807. /* prompt for substitution */
  808. printf ("%06x:  %04x-", (int) adrs, (*(short *)adrs) & 0x0000ffff);
  809. /* get substitution value:
  810.  *   skip empty lines (CR only);
  811.  *   quit on end of file or invalid input;
  812.  *   otherwise put specified value at address */
  813. if (fioRdString (STD_IN, line, MAX_LINE) == EOF)
  814.     break;
  815. line [MAX_LINE] = EOS; /* make sure input line has EOS */
  816. /* skip leading spaces*/
  817. for (pLine = line; isspace ((UINT) * pLine); ++pLine)
  818.     ;
  819. if (*pLine == EOS) /* skip field if just CR */
  820.     continue;
  821. if (sscanf (pLine, "%x%1s", &value, &excess) != 1)
  822.     break; /* quit if not number */
  823. * (short *) adrs = value; /* assign new value */
  824. }
  825.     printf ("n");
  826.     }
  827. /*******************************************************************************
  828. *
  829. * d - display memory
  830. *
  831. * Display contents of memory, starting at adrs.  Memory is displayed in
  832. * words.  The number of words displayed defaults to 64.  If
  833. * nwords is non-zero, that number of words is printed, rounded up to
  834. * the nearest number of full lines.  That number then becomes the default.
  835. */
  836. LOCAL void d 
  837.     (
  838.     FAST char *adrs, /* address to display */
  839.     int        nwords /* number of words to print. */
  840.     ) /* If 0, print 64 or last specified. */
  841.     {
  842.     static char *last_adrs;
  843.     static int dNbytes = 128;
  844.     char ascii [17];
  845.     FAST int nbytes;
  846.     FAST int byte;
  847.     ascii [16] = EOS; /* put an EOS on the string */
  848.     nbytes = 2 * nwords;
  849.     if (nbytes == 0)
  850. nbytes = dNbytes; /* no count specified: use current byte count */
  851.     else
  852. dNbytes = nbytes; /* change current byte count */
  853.     if (adrs == 0)
  854. adrs = last_adrs; /* no address specified: use last address */
  855.     adrs = (char *) ((int) adrs & ~1); /* round adrs down to word boundary */
  856.     /* print leading spaces on first line */
  857.     bfill ((char *) ascii, 16, '.');
  858.     printf ("%06x:  ", (int) adrs & ~0xf);
  859.     for (byte = 0; byte < ((int) adrs & 0xf); byte++)
  860. {
  861. printf ("  ");
  862. if (byte & 1)
  863.     printf (" "); /* space between words */
  864. if (byte == 7)
  865.     printf (" "); /* extra space between words 3 and 4 */
  866. ascii [byte] = ' ';
  867. }
  868.     /* print out all the words */
  869.     while (nbytes-- > 0)
  870. {
  871. if (byte == 16)
  872.     {
  873.     /* end of line:
  874.      *   print out ascii format values and address of next line */
  875.     printf ("  *%16s*n%06x:  ", ascii, (int) adrs);
  876.     bfill ((char *) ascii, 16, '.'); /* clear out ascii buffer */
  877.     byte = 0; /* reset word count */
  878.     }
  879. printf ("%02x", *adrs & 0x000000ff);
  880. if (byte & 1)
  881.     printf (" "); /* space between words */
  882. if (byte == 7)
  883.     printf (" "); /* extra space between words 3 and 4 */
  884. if (* adrs == ' ' ||
  885. (isascii ((UINT) * adrs) && isprint ((UINT) * adrs)))
  886.     ascii [byte] = (UINT) * adrs;
  887. adrs++;
  888. byte++;
  889. }
  890.     /* print remainder of last line */
  891.     for (; byte < 16; byte++)
  892. {
  893. printf ("  ");
  894. if (byte & 1)
  895.     printf (" "); /* space between words */
  896. if (byte == 7)
  897.     printf (" "); /* extra space between words 3 and 4 */
  898. ascii [byte] = ' ';
  899. }
  900.     printf ("  *%16s*n", ascii); /* print out ascii format values */
  901.     last_adrs = adrs;
  902.     }
  903. /*******************************************************************************
  904. *
  905. * bootExcHandler - bootrom exception handling routine
  906. */
  907. LOCAL void bootExcHandler 
  908.     (
  909.     int tid /* task ID */
  910.     )
  911.     {
  912.     REG_SET regSet;       /* task's registers */
  913.     /* get registers of task to be traced */
  914.     if (taskRegsGet (tid, &regSet) != ERROR)
  915.         {
  916.         trcStack (&regSet, (FUNCPTR) NULL, tid);
  917.         taskRegsShow (tid);
  918.         }
  919.     else
  920.         printf ("bootExcHandler: exception caught but no valid task.n");
  921.     taskDelay (sysClkRateGet ());       /* pause a second */
  922.     reboot (BOOT_NO_AUTOBOOT);
  923.     }
  924. /*******************************************************************************
  925. *
  926. * skipSpace - advance pointer past white space
  927. *
  928. * Increments the string pointer passed as a parameter to the next
  929. * non-white-space character in the string.
  930. */
  931. LOCAL void skipSpace 
  932.     (
  933.     FAST char **strptr /* pointer to pointer to string */
  934.     )
  935.     {
  936.     while (isspace ((UINT) ** strptr))
  937. ++ * strptr;
  938.     }
  939. /*******************************************************************************
  940. *
  941. * printExcMsg - print exception message
  942. *
  943. * Avoid printing possible control characters in exception message area.
  944. */
  945. LOCAL void printExcMsg 
  946.     (
  947.     char *string
  948.     )
  949.     {
  950.     printf ("n");
  951.     while (isascii ((UINT) * string) && (isprint ((UINT) * string) ||
  952. isspace ((UINT) * string)))
  953. printf ("%c", * string++);
  954.     printf ("n");
  955.     }
  956. /******************************************************************************
  957. *
  958. * getArg - get argument from command line
  959. *
  960. * This routine gets the next numerical argument from the command line.
  961. * If the argument is not optional, then an error is reported if no argument
  962. * is found.  <ppString> will be updated to point to the new position in the
  963. * command line.
  964. *
  965. * RETURNS: OK or ERROR
  966. */
  967. LOCAL STATUS getArg 
  968.     (
  969.     FAST char **ppString, /* ptr to ptr to current position in line */
  970.     int * pValue, /* ptr where to return value */
  971.     BOOL defaultHex, /* TRUE = arg is hex (even w/o 0x) */
  972.     BOOL optional /* TRUE = ok if end of line */
  973.     )
  974.     {
  975.     skipSpace (ppString);
  976.     /* if nothing left, complain if arg is not optional */
  977.     if (**ppString == EOS)
  978. {
  979. if (!optional)
  980.     {
  981.     printf ("missing parametern");
  982.     return (ERROR);
  983.     }
  984. else
  985.     return (OK);
  986. }
  987.     /* scan arg */
  988.     if (bootScanNum (ppString, pValue, defaultHex) != OK)
  989. {
  990. printf ("invalid parametern");
  991. return (ERROR);
  992. }
  993.     skipSpace (ppString);
  994.     /* if we encountered ',' delimiter, step over it */
  995.     if (**ppString == ',')
  996. {
  997. ++*ppString;
  998. return (OK);
  999. }
  1000.     /* if end of line, scan is ok */
  1001.     if (**ppString == EOS)
  1002. return (OK);
  1003.     /* we got stopped by something else */
  1004.     printf ("invalid parametern");
  1005.     return (ERROR);
  1006.     }
  1007. /* The following routines are common to bootConfig and usrConfig and will
  1008.  * eventually be merged
  1009.  */
  1010. /******************************************************************************
  1011. *
  1012. * usrBootLineInit - initialize system boot line
  1013. *
  1014. * Initializes system boot line as per specified start type.
  1015. * If this is a COLD boot, i.e., with CLEAR option to clear memory,
  1016. * then the boot line is initialized from non-volatile RAM, if any,
  1017. * otherwise from the compiled in default boot line.
  1018. */
  1019. LOCAL void usrBootLineInit 
  1020.     (
  1021.     int startType
  1022.     )
  1023.     {
  1024.     if (startType & BOOT_CLEAR)
  1025. {
  1026. /* this is a cold boot so get the default boot line */
  1027. if ((sysNvRamGet (BOOT_LINE_ADRS, BOOT_LINE_SIZE, 0) == ERROR) ||
  1028.     (*BOOT_LINE_ADRS == EOS))
  1029.     {
  1030.     /* either no non-volatile RAM or empty boot line */
  1031.     strcpy (BOOT_LINE_ADRS, DEFAULT_BOOT_LINE);
  1032.     }
  1033. }
  1034.     }
  1035. /******************************************************************************
  1036. *
  1037. * usrBootLineCrack - interpret and verify boot line
  1038. *
  1039. * This routine interprets the specified boot line and checks the validity
  1040. * of certain parameters.  If there are errors, a diagnostic message is
  1041. * printed.
  1042. *
  1043. * RETURNS: OK or ERROR
  1044. */
  1045. LOCAL STATUS usrBootLineCrack 
  1046.     (
  1047.     char *  bootString,
  1048.     BOOT_PARAMS *pParams
  1049.     )
  1050.     {
  1051.     FAST char * pS;
  1052.     pS = bootStringToStruct (bootString, pParams);
  1053.     if (*pS != EOS)
  1054. {
  1055. bootParamsErrorPrint (bootString, pS);
  1056. return (ERROR);
  1057. }
  1058. #ifdef  INCLUDE_NETWORK
  1059.     /* check inet addresses */
  1060.     if ((checkInetAddrField (pParams->ead, TRUE) != OK) ||
  1061. (checkInetAddrField (pParams->bad, TRUE) != OK) ||
  1062. (checkInetAddrField (pParams->had, FALSE) != OK) ||
  1063. (checkInetAddrField (pParams->gad, FALSE) != OK))
  1064. {
  1065. return (ERROR);
  1066. }
  1067. #endif  /* INCLUDE_NETWORK */
  1068.     return (OK);
  1069.     }
  1070. #ifdef  INCLUDE_NETWORK
  1071. /******************************************************************************
  1072. *
  1073. * checkInetAddrField - check for valid inet address in boot field
  1074. */
  1075. LOCAL STATUS checkInetAddrField 
  1076.     (
  1077.     char *pInetAddr,
  1078.     BOOL subnetMaskOK
  1079.     )
  1080.     {
  1081.     char inetAddr [30];
  1082.     int netmask;
  1083.     /* 
  1084.      * The bzero() call corrects SPR 6326. The calls to bootNetmaskExtract()
  1085.      * and inet_addr() did not delimit the input string with a ''. When
  1086.      * inet_addr attempted to print the invalid address, the system would
  1087.      * crash or hang.
  1088.      */
  1089.     bzero (inetAddr, sizeof(inetAddr));
  1090.     if (*pInetAddr == EOS)
  1091. return (OK);
  1092.     strncpy (inetAddr, pInetAddr, sizeof (inetAddr) - 1);
  1093.     if (subnetMaskOK)
  1094. {
  1095. if (bootNetmaskExtract (inetAddr, &netmask) < 0)
  1096.     {
  1097.     printf ("Error: invalid netmask in boot field "%s".n", inetAddr);
  1098.     return (ERROR);
  1099.     }
  1100. }
  1101.     if (inet_addr (inetAddr) == (ULONG) ERROR)
  1102. {
  1103. printf ("Error: invalid inet address in boot field "%s".n",inetAddr);
  1104. return (ERROR);
  1105. }
  1106.     return (OK);
  1107.     }
  1108. /******************************************************************************
  1109. *
  1110. * usrNetIfAttach - attach a network interface
  1111. *
  1112. * This routine attaches the specified network interface.
  1113. *
  1114. * - interface is attached
  1115. * - interface name is constructed as "<devName><unitNum>"
  1116. *
  1117. * RETURNS: OK or ERROR
  1118. */
  1119. LOCAL STATUS usrNetIfAttach 
  1120.     (
  1121.     char *devName,
  1122.     int  unitNum,
  1123.     char *inetAdrs
  1124.     )
  1125.     {
  1126.     FAST NETIF * pNif;
  1127.     STATUS  status;
  1128.     char                buf [BOOT_DEV_LEN];     /* network device */
  1129. #ifdef  INCLUDE_PCMCIA
  1130.     int sock;
  1131.     if (strncmp (devName, "pcmcia", 6) == 0)
  1132. {
  1133. if (strlen (devName) == 6)
  1134.     return (ERROR);
  1135. else
  1136.     sscanf (devName, "%*6s%*c%d", &sock);
  1137. *(devName + 6) = '';
  1138. }
  1139. #endif  /* INCLUDE_PCMCIA */
  1140.     /* find interface in table */
  1141.     sprintf(buf, "%s%d", devName, unitNum);
  1142.     for (pNif = netIf; pNif->ifName != 0; pNif++)
  1143. {
  1144. if (strcmp (buf, pNif->ifName) == 0)
  1145.     break;
  1146. }
  1147.     /*
  1148.      * For backward compatibility, the device name only is acceptable for
  1149.      * unit numbers of 0.
  1150.      */
  1151.     if (pNif->ifName == 0 && unitNum == 0)
  1152.         {
  1153.         for (pNif = netIf; pNif->ifName != 0; pNif++)
  1154.             {
  1155.             if (strcmp (devName, pNif->ifName) == 0)
  1156.                 break;
  1157.             }
  1158.         }
  1159.     if (pNif->ifName == 0)
  1160. {
  1161. printf ("Network interface %s unknown.n", devName);
  1162. return (ERROR);
  1163. }
  1164.     if (pNif->attachRtn == NULL)
  1165.         {
  1166. printf ("Network interface %s has no attach routine.n", devName);
  1167. return (OK);
  1168. }
  1169.     printf ("Attaching network interface %s... ", buf);
  1170. #ifdef INCLUDE_PCMCIA
  1171.     if (strncmp (devName, "pcmcia", 6) == 0)
  1172. pNif->arg1 = (char *)sock;
  1173. #endif /* INCLUDE_PCMCIA */
  1174. #if defined (TARGET_VIP10)
  1175.         /* SGI VIP10 boards are supposed to come with the ethernet address
  1176.          * in SGI formated non volatile ram.  We can not be sure where this
  1177.          * is so we default the upper 4 bytes of the address to SGI standard
  1178.          * and use the bottom two bytes of the internet address for the rest.
  1179.          */
  1180.         if (strcmp (devName, "lnsgi") == 0)
  1181.             {
  1182.             IMPORT char lnsgiEnetAddr [];      /* ethernet addr for lance */
  1183.             u_long inet = inet_addr (inetAdrs);
  1184.             lnsgiEnetAddr [4] = (inet >> 8) & 0xff;
  1185.             lnsgiEnetAddr [5] = inet & 0xff;
  1186.             }
  1187. #endif  /* TARGET_VIP10 */
  1188.     status = pNif->attachRtn (unitNum, pNif->arg1, pNif->arg2, pNif->arg3,
  1189.       pNif->arg4, pNif->arg5, pNif->arg6, pNif->arg7, 
  1190.                               pNif->arg8);
  1191.     if (status != OK)
  1192. {
  1193.         if (errno == S_iosLib_CONTROLLER_NOT_PRESENT)
  1194.             printf ("failed.nError: S_iosLib_CONTROLLER_NOT_PRESENT.n");
  1195.         else if (errno == S_iosLib_INVALID_ETHERNET_ADDRESS)
  1196.     printf ("failed: S_iosLib_INVALID_ETHERNET_ADDRESS, use N commandn");
  1197. else
  1198.     printf ("failed: errno = %#x.n", errno);
  1199. return (ERROR);
  1200. }
  1201.     printf ("done.n");
  1202.     return (OK);
  1203.     }
  1204. /******************************************************************************
  1205. *
  1206. * usrNetIfConfig - configure a network interface
  1207. * - subnetmask is extracted from inetAdrs and, if present,
  1208. *   set for interface
  1209. * - inet address is set for interface
  1210. * - if present, inet name for interface is added to host table
  1211. */
  1212. LOCAL STATUS usrNetIfConfig 
  1213.     (
  1214.     char * devName, /* device name */
  1215.     int         unitNum,                /* unit number */
  1216.     char * inetAdrs, /* inet address */
  1217.     char * inetName, /* host name */
  1218.     int  netmask /* subnet mask */
  1219.     )
  1220.     {
  1221.     char  ifname [20];
  1222. #ifdef INCLUDE_PCMCIA
  1223.     if (strncmp (devName, "pcmcia", 6) == 0)
  1224. devName = "pcmcia";
  1225. #endif /* INCLUDE_PCMCIA */
  1226.     /* check for empty inet address */
  1227.     if (inetAdrs[0] == EOS)
  1228. {
  1229. printf ("No inet address specified for interface %s.n", devName);
  1230. return (ERROR);
  1231. }
  1232.     /* build interface name */
  1233.     sprintf (ifname, "%s%d", devName, unitNum);
  1234.     /* set subnet mask, if any specified */
  1235.     if (netmask != 0)
  1236. ifMaskSet (ifname, netmask);
  1237.     /* set inet address */
  1238.     if (ifAddrSet (ifname, inetAdrs) != OK)
  1239.         {
  1240.         printf ("Error setting inet address of %s to %s, errno = %#xn",
  1241.                 ifname, inetAdrs, errno);
  1242.         return (ERROR);
  1243.         }
  1244.     /* add host name to host table */
  1245.     if ((inetName != NULL) && (*inetName != EOS))
  1246. hostAdd (inetName, inetAdrs);
  1247.     return (OK);
  1248.     }
  1249. /******************************************************************************
  1250. *
  1251. * usrBpInit - initialize backplane driver
  1252. *
  1253. * usrBpInit initializes the backplane driver shared memory region
  1254. * and sets up the backplane parameters to attach.
  1255. *
  1256. * RETURNS: OK if successful otherwise ERROR
  1257. */
  1258. LOCAL STATUS usrBpInit 
  1259.     (
  1260.     char * devName, /* device name */
  1261.     int         unitNum,        /* unit number */
  1262.     u_long startAddr /* inet address */
  1263.     )
  1264.     {
  1265. #ifdef INCLUDE_SM_NET
  1266.     char * bpAnchor; /* anchor address */
  1267.     FAST NETIF * pNif; /* netif struct */
  1268.     STATUS  status; /* status */
  1269.     int procNum; /* proc num */
  1270.     char                buf [BOOT_DEV_LEN];     /* network device */
  1271.     /*
  1272.      * Pick off optional "=<anchorAdrs>" from backplane
  1273.      * device.  Also truncates devName to just "bp" or "sm"
  1274.      */
  1275.     if ((strncmp (devName, "bp=", 3) == 0) ||
  1276.         (strncmp (devName, "sm=", 3) == 0))
  1277. {
  1278. if (bootBpAnchorExtract (devName, &bpAnchor) < 0)
  1279.     {
  1280.     printf ("Invalid anchor address specified: "%s"n", devName);
  1281.     return (ERROR);
  1282.     }
  1283. }
  1284.     else
  1285. bpAnchor = SM_ANCHOR_ADRS; /* default anchor */
  1286.     procNum = sysProcNumGet ();
  1287.     /* if we are master, initialize backplane net */
  1288.     if (procNum == 0)
  1289. {
  1290. printf ("Initializing backplane net with anchor at %#x... ",
  1291. (int) bpAnchor);
  1292. status = smNetInit ((SM_ANCHOR *) bpAnchor, (char *) SM_MEM_ADRS,
  1293.    (int) SM_MEM_SIZE, SM_TAS_TYPE, 0, 0, startAddr);
  1294. if (status == ERROR)
  1295.        {
  1296.     printf ("Error: backplane device %s not initializedn", devName);
  1297.     return (ERROR);
  1298.     }
  1299. printf ("done.n");
  1300. }
  1301.     /* Locate NETIF structure for backplane */
  1302.     sprintf(buf, "%s%d", devName, unitNum);
  1303.     for (pNif = netIf; pNif->ifName != 0; pNif++)
  1304.     {
  1305. if (strcmp (buf, pNif->ifName) == 0)
  1306.     break;
  1307. }
  1308.     /*
  1309.      * For backward compatibility, the device name only is acceptable for
  1310.      * unit numbers of 0.
  1311.      */
  1312.     if (pNif->ifName == 0 && unitNum == 0)
  1313.         {
  1314.         for (pNif = netIf; pNif->ifName != 0; pNif++)
  1315.             {
  1316.             if (strcmp (devName, pNif->ifName) == 0)
  1317.                 break;
  1318.             }
  1319.         }
  1320.     if (pNif->ifName == 0)
  1321. return (ERROR);
  1322.     printf ("Backplane anchor at %#x... ", (int) bpAnchor);
  1323.     /* configure backplane parameters (most set in NETIF struct) */
  1324.     pNif->arg1 = bpAnchor; /* anchor address */
  1325.     pNif->arg3 = SM_INT_NONE;
  1326.     pNif->arg4 = 0;
  1327.     pNif->arg5 = 0;
  1328.     pNif->arg6 = 0;
  1329.     return (OK);
  1330. #else /* INCLUDE_SM_NET */
  1331.     printf ("nError: backplane driver referenced but not included.n");
  1332.     return (ERROR);
  1333. #endif /* INCLUDE_SM_NET */
  1334.     }
  1335. /*******************************************************************************
  1336. *
  1337. * usrSlipInit - initialize the slip device
  1338. *
  1339. * RETURNS: OK if successful, otherwise ERROR.
  1340. */
  1341. LOCAL STATUS usrSlipInit 
  1342.     (
  1343.     char *pBootDev, /* boot device */
  1344.     int  unitNum,               /* unit number */
  1345.     char *localAddr, /* local address */
  1346.     char *peerAddr /* peer address */
  1347.     )
  1348.     {
  1349. #ifdef INCLUDE_SLIP
  1350.     char  slTyDev [20]; /* slip device */
  1351.     int netmask; /* netmask */
  1352. #ifndef SLIP_BAUDRATE
  1353. #define SLIP_BAUDRATE 0 /* uses previously selected baudrate */
  1354. #endif
  1355. #ifdef CSLIP_ENABLE
  1356. #undef CSLIP_ENABLE
  1357. #define CSLIP_ENABLE TRUE /* force CSLIP header compression */
  1358. #else /* CSLIP_ENABLE */
  1359. #undef CSLIP_ENABLE
  1360. #define CSLIP_ENABLE FALSE
  1361. #endif /* CSLIP_ENABLE */
  1362. #ifdef CSLIP_ALLOW
  1363. #undef CSLIP_ALLOW
  1364. #define CSLIP_ALLOW TRUE /* enable CSLIP compression on Rx */
  1365. #else /* CSLIP_ALLOW */
  1366. #undef CSLIP_ALLOW
  1367. #define CSLIP_ALLOW FALSE
  1368. #endif /* CSLIP_ALLOW */
  1369. #ifndef SLIP_MTU
  1370. #define SLIP_MTU 576
  1371. #endif
  1372.     if (pBootDev [2] == '=')
  1373. {
  1374. /* get the tty device used for SLIP interface e.g. "sl=/tyCo/1" */
  1375. strcpy (slTyDev, &pBootDev [3]);
  1376. pBootDev [2] = '';
  1377. }
  1378.     else
  1379. {
  1380. /* construct the default SLIP tty device */
  1381. sprintf (slTyDev, "%s%d", "/tyCo/", SLIP_TTY);
  1382. }
  1383.     printf ("Attaching network interface sl%d... ", unitNum);
  1384.     bootNetmaskExtract (localAddr, &netmask); /* remove and ignore mask */
  1385.     if (slipInit (unitNum, slTyDev, localAddr, peerAddr, SLIP_BAUDRATE,
  1386.         CSLIP_ENABLE, CSLIP_ALLOW, SLIP_MTU) == ERROR)
  1387. {
  1388. printf ("nslipInit failed 0x%xn", errno);
  1389. return (ERROR);
  1390. }
  1391.     printf ("done.n");
  1392.     return (OK);
  1393. #else /* INCLUDE_SLIP */
  1394.     printf ("nError: slip not included.n");
  1395.     return (ERROR);
  1396. #endif /* INCLUDE_SLIP */
  1397.     }
  1398. /*******************************************************************************
  1399. *
  1400. * usrPPPInit - initialize a ppp channel
  1401. *
  1402. * RETURNS: OK if successful, otherwise ERROR.
  1403. */
  1404. LOCAL STATUS usrPPPInit (pBootDev, unitNum, localAddr, peerAddr)
  1405.     char *      pBootDev;               /* boot device */
  1406.     int         unitNum;                /* unit number */
  1407.     char *      localAddr;              /* local address */
  1408.     char *      peerAddr;               /* peer address */
  1409.     {
  1410. #ifdef INCLUDE_PPP
  1411.     PPP_INFO    pppInfo;
  1412.     PPP_OPTIONS *pOptions = NULL;
  1413.     char        pppTyDev [20];          /* ppp device */
  1414. #ifdef PPP_BAUDRATE
  1415.     int pppBaudRate = PPP_BAUDRATE; /* ppp baud rate */
  1416. #else
  1417.     int pppBaudRate = 0; /* ppp baud rate */
  1418. #endif /* PPP_BAUDRATE */
  1419.     char * pBaudStr; /* ppp boot string */
  1420.     int         netmask;                /* netmask */
  1421.     int sysRate = sysClkRateGet();
  1422.     int ix;
  1423. #ifdef  PPP_OPTIONS_STRUCT  
  1424.     pOptions = &pppOptions;
  1425. #endif  /* PPP_OPTIONS_STRUCT */
  1426.      
  1427.     if ((pBaudStr = strpbrk (pBootDev, ",")) != NULL)
  1428.         {
  1429. *pBaudStr++ = '';
  1430. pppBaudRate = atoi (pBaudStr);
  1431. }
  1432.     if (pBootDev [3] == '=')
  1433.         {
  1434.         /* get the tty device used for PPP interface e.g. "ppp=/tyCo/1" */
  1435.         strcpy (pppTyDev, &pBootDev [4]);
  1436.         pBootDev [3] = '';
  1437.         }
  1438.     else 
  1439.         {
  1440.         /* construct the default PPP tty device */
  1441.         sprintf (pppTyDev, "%s%d", "/tyCo/", PPP_TTY);
  1442.         }
  1443.     printf ("Attaching network interface ppp%d...n", unitNum);
  1444.     bootNetmaskExtract (localAddr, &netmask); /* remove and ignore mask */
  1445.     if (pppInit (unitNum, pppTyDev, localAddr, peerAddr, pppBaudRate,
  1446.  pOptions, PPP_OPTIONS_FILE) == ERROR)
  1447.         {
  1448.         printf ("npppInit failed 0x%xn", errno);
  1449.         return (ERROR);
  1450.         }
  1451.     /* wait for PPP link to be established */
  1452.     for (ix = 0; ix < PPP_CONNECT_DELAY; ix++)
  1453. {
  1454. taskDelay (sysRate);
  1455.         if ((pppInfoGet (unitNum, &pppInfo) == OK) &&
  1456.     (pppInfo.ipcp_fsm.state == OPENED))
  1457.            break;
  1458. }
  1459.     if (ix == PPP_CONNECT_DELAY) 
  1460.         {
  1461.         pppDelete (unitNum);                   /* kill the interface */ 
  1462. printf ("ppp0: timeout: could not establish link with peer.n");
  1463. return (ERROR);
  1464. }
  1465.     printf ("done.n");
  1466.     return (OK);
  1467. #else /* INCLUDE_PPP */
  1468.     printf ("nError: ppp not included.n");
  1469.     return (ERROR);
  1470. #endif  /* INCLUDE_PPP */
  1471.     }
  1472. #if defined(INCLUDE_STREAMS) || defined(INCLUDE_STREAMS_ALL)
  1473. /*******************************************************************************
  1474. *
  1475. * usrStrmInit - Streams subsystem initialization
  1476. *
  1477. * This routine is called at system startup time to create the Streams task
  1478. * and install relevant Streams services.
  1479. *
  1480. * RETURNS: OK, or ERROR if the Streams initialization fails.
  1481. */
  1482.  
  1483. LOCAL STATUS usrStrmInit (void)
  1484.     {
  1485.     int strmMemSize = STREAMS_MEM_PART_SIZE;
  1486.     if ((strmMemSize == NULL) || (strmMemSize > STREAMS_MEM_MAX))
  1487.         strmMemSize = STREAMS_MEM_MAX;
  1488.  
  1489.     if (strmInit (strmMemSize,
  1490.                      STREAMS_MEM_PART_ADDR,
  1491.                      STREAMS_MSGSZ_MAX,
  1492.                      STREAMS_CTLSZ_MAX,
  1493.                      STREAMS_PUSH_MAX) == ERROR)
  1494.         {
  1495.         printf ("Streams initialization failuren");
  1496.         return (ERROR);
  1497.         }
  1498.  
  1499. #if defined(INCLUDE_STREAMS_SOCKET) || defined(INCLUDE_STREAMS_ALL)
  1500.     strmSockInit ();            /* initialize sockmod module */
  1501.     if (sockLibAdd ((FUNCPTR) strmSockLibInit, AF_INET_STREAMS, AF_INET) ==
  1502.         ERROR)
  1503.         return (ERROR);
  1504.  
  1505. #ifdef  DEFAULT_STREAMS_SOCKET
  1506.     if (sockLibAdd ((FUNCPTR) strmSockLibInit, AF_INET, AF_INET) == ERROR)
  1507.         return (ERROR);
  1508. #endif  /* DEFAULT_STREAMS_SOCKET */
  1509. #endif  /* INCLUDE_STREAMS_SOCKET */
  1510.  
  1511. #if defined(INCLUDE_STREAMS_TLI) || defined(INCLUDE_STREAMS_ALL)
  1512.     tliInit ();                 /* initialize timod and tirdwr modules */
  1513. #endif  /* INCLUDE_STREAMS_TLI */
  1514.  
  1515. #if defined(INCLUDE_STREAMS_AUTOPUSH) || defined(INCLUDE_STREAMS_ALL)
  1516.     autopushInit ();                 /* Include Autopush facility */
  1517. #endif  /* INCLUDE_STREAMS_AUTOPUSH */
  1518.  
  1519. #if defined(INCLUDE_STREAMS_DLPI) || defined(INCLUDE_STREAMS_ALL)
  1520.     dlpiInit ();                /* initialize the /dev/dlb devices */
  1521. #endif  /* INCLUDE_STREAMS_DLPI */
  1522.  
  1523. #if defined(INCLUDE_STREAMS_STRACE) || defined(INCLUDE_STREAMS_ALL)
  1524.     strmStraceInit (STREAMS_STRACE_OUTPUT_DIR);  /* init strace utility */
  1525. #endif  /* INCLUDE_STREAMS_STRACE */
  1526.  
  1527. #if defined(INCLUDE_STREAMS_STRERR) || defined(INCLUDE_STREAMS_ALL)
  1528.     strmStrerrInit (STREAMS_STRERR_OUTPUT_DIR);  /* init strerr utility */
  1529. #endif  /* INCLUDE_STREAMS_STRERR */
  1530.                      
  1531. #ifdef INCLUDE_STREAMS_DEBUG
  1532.     strmDebugInit ();           /* initialize the Streams debug facility */
  1533. #endif  /* INCLUDE_STREAMS_DEBUG */
  1534.  
  1535.     /* call user-provided protocol initialization hook routine */
  1536.  
  1537.     if ((strmProtoInitRtn != NULL) && ((*strmProtoInitRtn) () == ERROR))
  1538.         return (ERROR);
  1539.  
  1540.     return (OK);                /* Streams initialization complete */
  1541.     }
  1542. #endif /* INCLUDE_STREAMS */
  1543. /******************************************************************************
  1544. *
  1545. * bootpGet - get boot parameters via BOOTP.
  1546. *
  1547. * This routine retrieves a boot file name, host and target IP addresses, and 
  1548. * subnet mask from a BOOTP server, using the bootstrap protocol defined in
  1549. * RFC 1542. The IP address and subnet mask values will only be stored in the 
  1550. * boot parameters if not already specified. In order to use BOOTP, the boot 
  1551. * device indicated by <pNetDev> must be capable of sending broadcast messages. 
  1552. * Currently, only Ethernet devices and the shared-memory network drivers are 
  1553. * supported. To use the shared-memory drivers, the target IP address must 
  1554. * already be specified.
  1555. * .IP
  1556. * The routine is called when the SYSFLG_AUTOCONFIG boot flag is set and the 
  1557. * BOOTP client is included in the boot program. If the DHCP client is also
  1558. * included, that protocol is used instead.
  1559. *
  1560. * RETURNS: OK if successful, or ERROR otherwise.
  1561. *
  1562. * ERRNO: N/A
  1563. *
  1564. * SEE ALSO: bootpLib, RFC 1542, RFC 951
  1565. */
  1566. LOCAL STATUS bootpGet 
  1567.     (
  1568.     char *pNetDev, /* boot device */
  1569.     char *pBootDevAddr, /* device address */
  1570.     char *pBootFile, /* file name */
  1571.     char *pHostAddr, /* host address */
  1572.     int  *pMask  /* mask */
  1573.     )
  1574.     {
  1575. #ifndef INCLUDE_DHCPC
  1576. #ifdef INCLUDE_BOOTP
  1577.     struct bootpParams  bootParams;     /* parameter descriptor */
  1578.     struct in_addr  clntAddr;  /* client address */
  1579.     struct in_addr  hostAddr;  /* server address */
  1580.     int  subnetMask; /* subnet mask */
  1581.     char bootServer [INET_ADDR_LEN];/* boot server */
  1582.     subnetMask        = 0;
  1583.     bzero ( (char *)&clntAddr, sizeof (struct in_addr));
  1584.     bzero ( (char *)&hostAddr, sizeof (struct in_addr));
  1585.     bzero (bootServer, INET_ADDR_LEN);
  1586.     bzero ((char *)&bootParams, sizeof (struct bootpParams));
  1587.     /* Need inet address to boot over the backplane */
  1588.     if ( (strncmp (pNetDev, "bp", 2) == 0) || 
  1589.             (strncmp (pNetDev, "sm", 2) == 0))
  1590. {
  1591. if (pBootDevAddr [0] == EOS)
  1592.     return (ERROR);
  1593.         clntAddr.s_addr = inet_addr (pBootDevAddr);
  1594.         if (clntAddr.s_addr == (ULONG)ERROR)
  1595.             return (ERROR);
  1596. }
  1597.     /* Set pointers to retrieve needed boot parameters. */
  1598.     bootParams.clientAddr = &clntAddr;    /* pBootDevAddr */
  1599.     bootParams.bootHostAddr = &hostAddr;     /* pHostAddr */
  1600.     bootParams.bootfile = pBootFile;
  1601.     bootParams.netmask = (struct in_addr *)&subnetMask;
  1602.     printf ("Getting boot parameters via network interface %s", pNetDev);
  1603.     if (bootpParamsGet (pNetDev, 0, 0, &bootParams) == ERROR)
  1604.         return (ERROR);
  1605.     inet_ntoa_b (*bootParams.bootHostAddr, bootServer);
  1606.     printf ("nBootp Server:%sn", bootServer);
  1607.     if (pBootFile [0] == EOS)
  1608. return (ERROR); /* no bootfile */
  1609.     printf ("    Boot file: %sn", pBootFile);
  1610.     /* copies to params.had */
  1611.     if (pHostAddr [0] == EOS) /* fill in host address */
  1612. {
  1613. strncpy (pHostAddr, bootServer, INET_ADDR_LEN);
  1614. printf ("    Boot host: %sn", pHostAddr);
  1615. }
  1616.     /*
  1617.      * copies to pBootDevAddr (params.ead or params.bad) if not using bp or sm 
  1618.      * drivers and address is not already present.
  1619.      */
  1620.     if (pBootDevAddr [0] == EOS) /* fill in inet address */
  1621. {
  1622.         inet_ntoa_b (*bootParams.clientAddr, pBootDevAddr);
  1623. printf ("    Boot device Addr (%s): %sn", pNetDev, pBootDevAddr);
  1624. }
  1625.     /* copies to netmask */
  1626.     if ((*pMask == 0) && (subnetMask != 0))
  1627. {
  1628.         *pMask = ntohl (subnetMask);
  1629. printf ("    Subnet mask: 0x%xn", *pMask);
  1630. }
  1631.     return (OK);
  1632. #else
  1633.     printf ("automatic address assignment requested but not included.n");
  1634.     return (ERROR);
  1635. #endif
  1636. #else
  1637.     return (OK);            /* DHCP client used instead. */
  1638. #endif
  1639.     }
  1640. #ifdef INCLUDE_DHCPC
  1641. /******************************************************************************
  1642. *
  1643. * dhcpGet - get boot parameters with DHCP 
  1644. *
  1645. * This routine retrieves a boot file name, host and target IP addresses, and 
  1646. * subnet mask from a DHCP or BOOTP server, using the lease negotation process
  1647. * defined in RFC 1541. The IP address and subnet mask values will only be 
  1648. * stored in the boot parameters if not already specified. The DHCP client will 
  1649. * select the longest offered lease which exceeds the DHCPC_MIN_LEASE value. 
  1650. * Any DHCP lease will be given preference over BOOTP replies. Unless a 
  1651. * specific lease duration is provided in the target IP address entry, the 
  1652. * client requests the lease length defined by DHCPC_DEFAULT_LEASE. The client 
  1653. * will collect additional DHCP offers until the interval specified by 
  1654. * DHCPC_OFFER_TIMEOUT expires.
  1655. * .IP
  1656. * The <pNetDev> argument indicates the network device which will be used to
  1657. * send and receive DHCP messages. The DHCP client only supports devices
  1658. * attached to the IP protocol with the MUX/END interface. The MTU size of the
  1659. * network interface must be large enough to receive an IP datagram of 576
  1660. * bytes and the device also must be capable of sending broadcast messages.
  1661. * Finally, the target IP address must already be specified to use the
  1662. * shared-memory driver.
  1663. * .IP
  1664. * This routine executes when the SYSFLG_AUTOCONFIG boot flag is set and the
  1665. * DHCP client is included in the boot program, whether or not the BOOTP client
  1666. * is also available.
  1667. *
  1668. * NOTE
  1669. * The boot file to be loaded must also contain the DHCP client library in 
  1670. * order to continue using the assigned target IP address. In addition, the 
  1671. * DHCP server included with Windows NT does not supply boot file names. If 
  1672. * that server is used to supply the boot parameters, the boot file name must 
  1673. * be entered manually.
  1674. *
  1675. * RETURNS: OK if successful, or ERROR otherwise.
  1676. *
  1677. * ERRNO: N/A
  1678. *
  1679. * SEE ALSO: dhcpcBootLib, RFC 1541
  1680. */
  1681. LOCAL STATUS dhcpGet
  1682.     (
  1683.     char *  pNetDev,  /* boot device */
  1684.     char *  pBootDevAddr,  /* device IP address */
  1685.     char *  pBootFile,  /* boot file name */
  1686.     char *  pHostAddr,  /* host IP address */
  1687.     int *  pMask,  /* target subnet mask */
  1688.     DHCP_LEASE_DATA *  pDhcpLease  /* lease times and addresses */
  1689.     )
  1690.     {
  1691.     STATUS  result;
  1692.     struct ifnet *  pIf;  /* pointer to network interface data */
  1693.     char  serverAddr [INET_ADDR_LEN];   /* DHCP server address */
  1694.     char  bootFile [BOOT_FILE_LEN];  /* name of boot file */
  1695.     int  subnetMask;  /* subnet mask */
  1696.     void *              pCookie;
  1697.     struct dhcp_param  bootParams;
  1698.     bzero (serverAddr, INET_ADDR_LEN);
  1699.     bzero ( (char *)&bootParams, sizeof (struct dhcp_param));
  1700.  
  1701.     /* 
  1702.      * Using pBootFile directly only works if all the DHCP servers supply a 
  1703.      * bootfile. The Windows NT server does not, so we can't do this.  
  1704.      */
  1705.     /* bootParams.file = pBootFile;  - Desired assignment to save memory. */
  1706.     bootParams.file = bootFile;
  1707.     bootParams.subnet_mask = (struct in_addr *)&subnetMask;
  1708.     /* Need target IP address to boot over the backplane */
  1709.     if ( (strncmp (pNetDev, "bp", 2) == 0) || 
  1710.             (strncmp (pNetDev, "sm", 2) == 0))
  1711.         {
  1712.         if (pBootDevAddr [0] == EOS)
  1713.             return (ERROR);
  1714.         }
  1715.     pIf = ifunit (pNetDev);
  1716.     if (pIf == NULL)
  1717.         return (ERROR);
  1718.     printf ("Getting boot parameters via network interface %s.n", pNetDev);
  1719.     /* Setup client to retrieve address information from a DHCP server. */
  1720.     pCookie = dhcpcBootInit (pIf, DHCPC_SPORT, DHCPC_CPORT, DHCPC_MAX_MSGSIZE,
  1721.    DHCPC_OFFER_TIMEOUT,DHCPC_DEFAULT_LEASE,DHCPC_MIN_LEASE );
  1722.     if (pCookie == NULL)
  1723.         {
  1724.         printf ("Error initializing DHCP client.n");
  1725.         return (ERROR);
  1726.         }
  1727.     /* Set requested lease length to value from bootline. */
  1728.  
  1729.     dhcpcOptionAdd (pCookie, _DHCP_LEASE_TIME_TAG, sizeof (int),
  1730.                     (UCHAR *)&pDhcpLease->lease_duration);
  1731.     if (pBootDevAddr[0] == EOS)
  1732.         {
  1733.         /* Attempt to retrieve address information from a DHCP server. */
  1734.  
  1735.         result = dhcpcBootBind ();
  1736.         if (result != OK)
  1737.             return (ERROR);
  1738.         }
  1739.     else
  1740.         {
  1741.         /*
  1742.          * Externally configured address. Get any additional parameters.
  1743.          * Ignore any failure (since the network device can be configured)
  1744.          * as long as a boot file is available.
  1745.          */
  1746.  
  1747.         result = dhcpcBootInformGet (pBootDevAddr);
  1748.  
  1749.         if (result != OK)
  1750.             {
  1751.             if (pBootFile[0] == EOS)
  1752.                 return (ERROR);
  1753.             else
  1754.                 return (OK);
  1755.             }
  1756.         }
  1757.     result = dhcpcBootParamsGet (&bootParams);
  1758.     if (result == ERROR)
  1759.       return (ERROR);
  1760.     /* Fill in configuration parameters for storage in bootline. */
  1761.     if (pBootDevAddr[0] == EOS)
  1762.         {
  1763.         /*
  1764.          * If the DHCP process established a lease (which includes an IP
  1765.          * address assignment), get the assigned address and timestamp
  1766.          * values. This information is not available if an address is
  1767.          * assigned externally. (A DHCP inform message is sent in that case).
  1768.          */
  1769.  
  1770.         bcopy ( (char *)&bootParams.yiaddr, (char *)&pDhcpLease->yiaddr,
  1771.                sizeof (struct in_addr));
  1772.         pDhcpLease->lease_duration = bootParams.lease_duration;
  1773.         pDhcpLease->lease_origin = bootParams.lease_origin;
  1774.         }
  1775.     inet_ntoa_b (bootParams.server_id, serverAddr);
  1776.     printf ("nDHCP Server:%sn", serverAddr);
  1777.     if (pBootFile [0] == EOS && bootFile[0] == EOS)
  1778.         return (ERROR);                         /* no bootfile */
  1779.     if (bootFile[0] != EOS)                     /* Save new bootfile */
  1780.         {
  1781.         bcopy (bootFile, pBootFile, BOOT_FILE_LEN);
  1782.         printf ("    Boot file: %sn", pBootFile);
  1783.         }
  1784.     if (pHostAddr [0] == EOS)                   /* fill in host address */
  1785.         {
  1786.         inet_ntoa_b (bootParams.siaddr, pHostAddr);
  1787.         printf ("    Boot host: %sn", pHostAddr);
  1788.         }
  1789.     /* 
  1790.      * Fill in the target's IP address, if needed. The status 
  1791.      * variable indicates the source of the IP address as follows:
  1792.      *    DHCP_NATIVE - assigned by a DHCP server
  1793.      *    DHCP_BOOTP - issued by a BOOTP server
  1794.      *    DHCP_MANUAL - entered in boot parameters
  1795.      */
  1796.     if (pBootDevAddr [0] == EOS)                /* fill in inet address */
  1797.         {
  1798.         /*
  1799.          * Use the IP address from the DHCP protocol.
  1800.          * The status variable has already been set.
  1801.          */
  1802.         inet_ntoa_b (bootParams.yiaddr, pBootDevAddr);
  1803.         printf ("    Boot device Addr (%s): %sn", pNetDev, pBootDevAddr);
  1804.         }
  1805.     if ( (*pMask == 0) && (subnetMask != 0))
  1806.         {
  1807.         *pMask = ntohl (subnetMask);
  1808.         printf ("    Subnet mask: 0x%xn", *pMask);
  1809.         }
  1810.     return (OK);
  1811.     }
  1812. #endif             /* INCLUDE_DHCPC */
  1813. #ifdef ETHERNET_ADR_SET
  1814. /*******************************************************************************
  1815. *
  1816. * mEnet - modify the last three bytes of the ethernet address
  1817. *
  1818. * RETURNS: void
  1819. *
  1820. * NOMANUAL
  1821. */
  1822. void mEnet 
  1823.     (
  1824.     char *  pNum   /* Boot line, including unit number. */
  1825.     )
  1826.     {
  1827.     uchar_t byte [MAX_ADR_SIZE]; /* array to hold new Enet addr */
  1828.     uchar_t curArr [MAX_ADR_SIZE]; /* array to hold current Enet addr */
  1829.     char line [MAX_LINE + 1];
  1830.     char *pLine; /* ptr to current position in line */
  1831.     int value; /* value found in line */
  1832.     char excess;
  1833.     char *buf;
  1834.     int unitNum;
  1835.     int ix;
  1836.     /* Search for unit number of network device. */
  1837.     buf = pNum;
  1838.     if (bootScanNum (&buf, &unitNum, FALSE) != OK)  /* Use 0 if no unit #. */
  1839.        unitNum = 0;
  1840.     sysEnetAddrGet (unitNum, curArr);
  1841.     printf ("Current Ethernet Address is: ");
  1842. #if _BYTE_ORDER == _BIG_ENDIAN
  1843.     printf ("%02x:%02x:%02x:%02x:%02x:%02xn", curArr[5], 
  1844.     curArr[4], curArr[3], curArr[2], 
  1845.     curArr[1], curArr[0]);
  1846.     byte[5] = ((ENET_DEFAULT & 0x0000ff00) >> 8);
  1847.     byte[4] = ((ENET_DEFAULT & 0x00ff0000) >> 16);
  1848.     byte[3] = ((ENET_DEFAULT & 0xff000000) >> 24);
  1849.     byte[2] = curArr[2];
  1850.     byte[1] = curArr[1];
  1851.     byte[0] = curArr[0];
  1852. #else  /* _BYTE_ORDER == _LITTLE_ENDIAN  */
  1853.     printf ("%02x:%02x:%02x:%02x:%02x:%02xn", curArr[0], 
  1854.     curArr[1], curArr[2], curArr[3], 
  1855.     curArr[4], curArr[5]);
  1856.     byte[5] = ((ENET_DEFAULT & 0x00ff0000) >> 16);
  1857.     byte[4] = ((ENET_DEFAULT & 0x0000ff00) >> 8);
  1858.     byte[3] = (ENET_DEFAULT & 0x000000ff);
  1859.     byte[2] = curArr[3];
  1860.     byte[1] = curArr[4];
  1861.     byte[0] = curArr[5];
  1862. #endif /* _BYTE_ORDER == _BIG_ENDIAN */
  1863.     printf ("Modify only the last 3 bytes (board unique portion) of Ethernet Address.n");
  1864.     printf ("The first 3 bytes are fixed at manufacturer's default address block.n");
  1865.     for (ix = 5; ix > 2; ix--)
  1866.         printf ("%02x- %02xn", byte[ix], byte[ix]);
  1867.     /* start on fourth byte of enet addr */
  1868.     for (ix = 2; ix >= 0; ix --)
  1869. {
  1870. /* prompt for substitution */
  1871. printf ("%02x- ", byte[ix]);
  1872. /* get substitution value:
  1873.  *   skip empty lines (CR only);
  1874.  *   quit on end of file or invalid input;
  1875.  *   otherwise put specified value at address */
  1876. if (fioRdString (STD_IN, line, MAX_LINE) == EOF)
  1877.     break;
  1878. line [MAX_ADR_SIZE] = EOS; /* make sure input line has EOS */
  1879. for (pLine = line; isspace ((int) *pLine); ++pLine) /* skip leading spaces*/
  1880.     ;
  1881. if (*pLine == EOS) /* skip field if just CR */
  1882.     continue;
  1883. if (sscanf (pLine, "%x%1s", &value, &excess) != 1)
  1884.     break; /* quit if not number */
  1885. byte[ix]  = (uchar_t)value; /* assign new value */
  1886. }
  1887.     printf ("n");
  1888.     sysEnetAddrSet (byte[5], byte[4], byte[3], byte[2], byte[1], byte[0]);
  1889.     printf ("New Ethernet Address is: ");
  1890. #if _BYTE_ORDER == _BIG_ENDIAN
  1891.     for (ix = 5; ix > 0; ix--)
  1892.         printf ("%02x:", byte[ix]);
  1893.     printf ("%02xn", byte[0]);
  1894. #else  /* _BYTE_ORDER == _LITTLE_ENDIAN */
  1895.     for (ix = 5; ix > 0; ix--)
  1896.         printf ("%02x:", byte[ix]);
  1897.     printf ("%02xn", byte[0]);
  1898. #endif /* _BYTE_ODER == _BIG_ENDIAN */
  1899.     }
  1900. #endif  /* ETHERNET_ADR_SET */
  1901. /*******************************************************************************
  1902. *
  1903. * usrNetProtoInit - configure the various protocols
  1904. *
  1905. * This routine configures various protocols of the network system.
  1906. * This function should be called before netLibInit() at the initialization
  1907. * time.
  1908. *
  1909. * RETURNS: OK, or ERROR if the protocol initialization fails
  1910. *
  1911. * NOMANUAL
  1912. */
  1913. LOCAL STATUS usrNetProtoInit (void)
  1914.     {
  1915.     ipLibInit (&ipCfgParams);           /* has to included by default */
  1916.     rawIpLibInit ();                    /* has to included by default */
  1917.     rawLibInit ();
  1918. #ifdef INCLUDE_UDP
  1919.     udpLibInit (&udpCfgParams);         /* udp protocol initialization */
  1920. #endif
  1921. #ifdef INCLUDE_TCP
  1922.     tcpLibInit (&tcpCfgParams);         /* tcp protocol initialization */
  1923. #endif
  1924. #ifdef INCLUDE_ICMP
  1925.     icmpLibInit (&icmpCfgParams);       /* icmp protocol initialization */
  1926. #endif
  1927. #ifdef INCLUDE_IGMP
  1928.     igmpLibInit ();                     /* igmp protocol initialization */
  1929. #endif
  1930. #ifdef INCLUDE_OSPF
  1931.     ospfLibInit ();
  1932. #endif
  1933.     return (OK);
  1934.     }
  1935. #endif  /* INCLUDE_NETWORK */