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

VxWorks

开发平台:

C/C++

  1. /* usrNetBsdBoot.c - start a BSD-compatible boot device */
  2. /* Copyright 1992 - 2002 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01c,02jan02,vvv  added a message to be printed when device attaches successfully
  7. 01b,16nov00,spm  enabled new DHCP lease for runtime device setup (SPR #20438)
  8. 01a,18aug98,ann  created from usrNetwork.c
  9. */
  10. /*
  11. DESCRIPTION
  12. This file is included by the configuration tool to start a network device
  13. according to the parameters in the boot line. It contains the initialization 
  14. routine for the INCLUDE_BSD_BOOT component.
  15. NOMANUAL
  16. */
  17. extern NETIF usrNetIfTbl [];
  18. /*******************************************************************************
  19. *
  20. * usrNetBsdDevStart - start the network device
  21. *
  22. * This routine creates a network device using the BSD interface according
  23. * to the boot parameters. Unlike other device creation routines, the device 
  24. * name is not tested since no preassigned name exists for these devices. It 
  25. * is the initialization routine for the INCLUDE_BSD_BOOT component.
  26. *
  27. * RETURNS: N/A
  28. *
  29. * NOMANUAL
  30. */
  31. void usrNetBsdDevStart 
  32.     (
  33.     char *  pDevName,  /* device name */
  34.     int  unitNum,  /* unit number */
  35.     char *  pAddrString,  /* device address */
  36.     BOOL  errFlag  /* Able to attach? */
  37.     )
  38.     {
  39.     /*
  40.      * Do nothing if another device is already setup or an
  41.      * error was detected in the boot parameters.
  42.      */
  43.     if (errFlag)
  44.         return;
  45.     /* Do nothing if a device with the given name is already attached. */
  46.     if (netAttachFlag)
  47.         return;
  48.     if (pDevName != NULL)
  49.         {
  50.         if (usrNetIfAttach (pDevName, unitNum, pAddrString) != OK)
  51.             return;
  52.         /*
  53.          * Booting via network: protocol attachment is complete and
  54.          * automatic configuration with DHCP or BOOTP is supported
  55.          * for all these network devices.
  56.          */
  57.         netAttachFlag = TRUE;
  58.         }
  59.     printf ("Attached TCP/IP interface to %s unit %dn", pDevName, unitNum);
  60.     return;
  61.     }
  62. /******************************************************************************
  63. *
  64. * usrNetIfAttach - attach a  network interface
  65. *
  66. * This routine attaches the specified network interface.
  67. *
  68. * - interface is attached
  69. * - interface name is constructed as "<devName>0"
  70. *
  71. * RETURNS: OK or ERROR
  72. *
  73. * NOMANUAL
  74. */
  75. STATUS usrNetIfAttach 
  76.     (
  77.     char *  devName,
  78.     int  unitNum,
  79.     char *  inetAdrs
  80.     )
  81.     {
  82.     FAST NETIF * pNif;
  83.     STATUS  status;
  84.     char  buf [BOOT_DEV_LEN + 1]; /* device name + unit number */
  85. #ifdef  INCLUDE_PCMCIA
  86.     int sock;
  87.     if (strncmp (devName, "pcmcia", 6) == 0)
  88. {
  89. if (strlen (devName) == 6)
  90.     return (ERROR);
  91. else
  92.     sscanf (devName, "%*6s%*c%d", &sock);
  93. *(devName + 6) = '';
  94. }
  95. #endif  /* INCLUDE_PCMCIA */
  96.     /* attach interface */
  97.     /* find interface in table */
  98.     sprintf(buf, "%s%d", devName, unitNum);
  99.     for (pNif = usrNetIfTbl; pNif->ifName != 0; pNif++)
  100. {
  101. if (strcmp (devName, pNif->ifName) == 0)
  102.     break;
  103. }
  104.     /*
  105.      * For backward compatibility, the device name only is acceptable for
  106.      * unit numbers of 0.
  107.      */
  108.     if (pNif->ifName == 0 && unitNum == 0)
  109.         {
  110.         for (pNif = usrNetIfTbl; pNif->ifName != 0; pNif++)
  111.             {
  112.             if (strcmp (devName, pNif->ifName) == 0)
  113.                 break;
  114.             }
  115.         }
  116.     if (pNif->ifName == 0)
  117. {
  118. printf ("Network interface %s unknown.n", devName);
  119. return (ERROR);
  120. }
  121.     printf ("Attaching network interface %s... ", buf);
  122. #ifdef  INCLUDE_PCMCIA
  123.     if (strncmp (devName, "pcmcia", 6) == 0)
  124. pNif->arg1 = (char *)sock;
  125. #endif  /* INCLUDE_PCMCIA */
  126. #if defined (TARGET_VIP10)
  127.         /* SGI VIP10 boards are supposed to come with the ethernet address
  128.          * in SGI formated non volatile ram.  We can not be sure where this
  129.          * is so we default the upper 4 bytes of the address to SGI standard
  130.          * and use the bottom two bytes of the internet address for the rest.
  131.          */
  132.         if (strcmp (devName, "lnsgi") == 0)
  133.             {
  134.             IMPORT char lnsgiEnetAddr [];      /* ethernet addr for lance */
  135.             u_long inet = inet_addr (inetAdrs);
  136.             lnsgiEnetAddr [4] = (inet >> 8) & 0xff;
  137.             lnsgiEnetAddr [5] = inet & 0xff;
  138.             }
  139. #endif  /* TARGET_VIP10 */
  140.     status = pNif->attachRtn (unitNum, pNif->arg1, pNif->arg2, pNif->arg3,
  141.       pNif->arg4, pNif->arg5, pNif->arg6,
  142.       pNif->arg7, pNif->arg8);
  143.     if (status != OK)
  144. {
  145.         if (errno == S_iosLib_CONTROLLER_NOT_PRESENT)
  146.             printf ("failed.nError: S_iosLib_CONTROLLER_NOT_PRESENT.n");
  147.         else
  148.     printf ("failed: errno = %#x.n", errno);
  149. return (ERROR);
  150. }
  151.     printf ("done.n");
  152.     return (OK);
  153.     }