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

VxWorks

开发平台:

C/C++

  1. /* usrDhcpcCfg.c - DHCP client initialization */
  2. /* Copyright 1992 - 2003 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01b,14may02,wap  Initialize structures to eliminate diab error (SPR #76331,
  7.                  SPR #76377)
  8. 01a,31jul98,spm  written.
  9. */
  10. /*
  11. DESCRIPTION
  12. This file is used to configure and initialize the DHCP client and control
  13. the automatic configuration process when booting over the network.
  14. NOMANUAL
  15. */
  16. #ifdef INCLUDE_DHCPS
  17. #include "dhcp/dhcp.h"
  18. #include "dhcp/common.h"
  19. #include "dhcpsLib.h"
  20. IMPORT long dhcps_dflt_lease;
  21. IMPORT long dhcps_max_lease;
  22. IMPORT STATUS dhcpsLeaseHookAdd (FUNCPTR);
  23. IMPORT STATUS dhcpsAddressHookAdd (FUNCPTR);
  24. /* Include these declarations if hooks are defined. */
  25. /* IMPORT STATUS DHCPS_LEASE_HOOK (int, char *, int); */
  26. /* IMPORT STATUS DHCPS_ADDRESS_HOOK (int, char *, int); */
  27. #endif
  28. #ifdef INCLUDE_DHCPC
  29. #include "dhcp/dhcpcInit.h"
  30. #else
  31. LOCAL STATUS dhcpcBootLineClean (char *);
  32. #endif /* INCLUDE_DHCPC */
  33. #ifdef INCLUDE_DHCPR
  34. #ifndef INCLUDE_DHCPS        /* Server is superset of relay agent. */
  35. #include "dhcprLib.h"
  36. #endif
  37. #endif
  38. #if defined (INCLUDE_DHCPS) || defined (INCLUDE_DHCPR)
  39. /*
  40.  * The following table lists the IP addresses which will receive DHCP
  41.  * messages forwarded across network boundaries by a DHCP server or
  42.  * relay agent.
  43.  */
  44. DHCP_TARGET_DESC dhcpTargetTbl [] =
  45.     {
  46.     /*
  47.      IP address of DHCP target servers
  48.      ---------------------------------
  49.      */
  50.      /* {"90.11.42.2"}, */
  51.      { NULL } /* List terminator, must be last */
  52.      };
  53. LOCAL int dhcpTargetTblSize = (NELEMENTS(dhcpTargetTbl));
  54. struct ifnet *devlist[1];
  55. int dhcpMaxHops = DHCP_MAX_HOPS;
  56. int dhcpSPort = DHCPS_SPORT;
  57. int dhcpCPort = DHCPS_CPORT;
  58. #endif
  59. /* 
  60.  * Example cache routine - should store records of active leases 
  61.  *                         across reboots. 
  62.  */
  63. /*
  64. #ifdef INCLUDE_DHCPS
  65. STATUS dhcpsDummyCache (int, char *, int);
  66. STATUS dhcpsDummyCache (int op, char *name, int length)
  67.     {
  68.     printf("Cache called with op %d on %d bytes.n", op, length);
  69.     if (op == DHCPS_STORAGE_READ)
  70.         return (ERROR);          /@ Simulated end-of-file. @/
  71.     return (OK);
  72.     }
  73. #endif
  74. */
  75. #ifdef INCLUDE_DHCPS
  76. DHCPS_LEASE_DESC dhcpsLeaseTbl [] =
  77.     {
  78.     /*
  79.     Name        Start IP      End IP          Parameters
  80.     ----        ----------    ------          -----------
  81.                                      see man pages
  82.                                 (timers, bootfile, etc.)
  83.     */
  84.     /*
  85.      * Host requirements defaults needed for RFC compliance - DO NOT REMOVE!!
  86.      */
  87.    {"dflt",    NULL, NULL, DHCPS_DEFAULT_ENTRY},
  88.     /* Sample database entries. */
  89. /* {"ent1", "90.11.42.24", "90.11.42.24", "clid="1:0x08003D21FE90":maxl=90:dfll=60"},   */
  90. /* {"ent2", "90.11.42.25", "90.11.42.26", "snmk=255.255.255.0:maxl=90:dfll=70:file=/vxWorks"}, */
  91. /* {"ent3", "90.11.42.27", "90.11.42.27", "maxl=0xffffffff:file=/vxWorks"}, */
  92. /* {"entry4", "90.11.42.28", "90.11.42.29", "albp=true:file=/vxWorks"}      */
  93.     };
  94. LOCAL int dhcpsLeaseTblSize = (NELEMENTS(dhcpsLeaseTbl));
  95. /*
  96.  * If the DHCP server will receive messages from relay agents,
  97.  * the following table must be filled in by the user.
  98.  */
  99. DHCPS_RELAY_DESC dhcpsRelayTbl [] =
  100.     {
  101.     /*
  102.      IP address of agent              Subnet Number
  103.      --------------------             -------------
  104.      */
  105.     /* {"90.11.42.254",               "90.11.42.0"}, */
  106.     { NULL,                           NULL } /* List terminator, must be last */
  107.     };
  108. LOCAL int dhcpsRelayTblSize = (NELEMENTS(dhcpsRelayTbl));
  109. LOCAL int dhcpsTaskPriority  = 56;      /* Priority level of DHCP server */
  110. LOCAL int dhcpsTaskOptions   = 0;       /* Option settings for DHCP server */
  111. LOCAL int dhcpsTaskStackSize = 5000;    /* Stack size for DHCP server task */
  112. IMPORT void dhcpsStart (void);
  113. #endif
  114. #ifdef INCLUDE_DHCPR                   /* Relay agent settings. */
  115. #ifndef INCLUDE_DHCPS                  /* Server is superset of relay agent. */
  116. LOCAL int dhcprTaskPriority  = 56;    /* Priority level of DHCP relay agent */
  117. LOCAL int dhcprTaskOptions   = 0;     /* Option settings for DHCP relay agent */
  118. LOCAL int dhcprTaskStackSize = 2500;  /* Stack size for DHCP relay agent */
  119. IMPORT void dhcprLibInit (void);
  120. IMPORT STATUS dhcprInit (struct ifnet **, int, DHCP_TARGET_DESC *, int);
  121. IMPORT void dhcprStart (void);
  122. #endif
  123. #endif
  124. /*******************************************************************************
  125. *
  126. * usrNetInit - system-dependent network initialization
  127. *
  128. * This routine initializes the network.  The ethernet and backplane drivers
  129. * and the TCP/IP software are configured.  It also adds hosts (analogous to
  130. * the /etc/hosts file in UNIX), gateways (analogous to /etc/gateways), sets
  131. * up our access rights on the host system (with iam()), optionally
  132. * initializes telnet, rlogin, RPC, and NFS support.
  133. *
  134. * The boot string parameter is normally left behind by the boot ROMs,
  135. * at address BOOT_LINE_ADRS.
  136. *
  137. * Unless the STANDALONE option is selected in usrConfig.c, this routine
  138. * will automatically be called by the root task usrRoot().
  139. *
  140. * RETURNS:
  141. * OK, or
  142. * ERROR if there is a problem in the boot string, or initializing network.
  143. *
  144. * SEE ALSO:  "Network" chapter of the VxWorks Programmer's Guide
  145. *
  146. * NOMANUAL
  147. */
  148. STATUS usrNetInit 
  149.     (
  150.     char *bootString /* boot parameter string */
  151.     )
  152.     {
  153.     char nad [20]; /* host's network inet addr */
  154.     char * pBootString;
  155.     int netmask;
  156.     char devName [MAX_FILENAME_LENGTH]; /* device name */
  157. #ifdef INCLUDE_DHCPC
  158.     BOOL  dhcpBoot = FALSE;       /* Lease obtained during startup? */
  159. #endif  /* INCLUDE_DHCPC */
  160. #ifdef INCLUDE_DHCPS
  161.     STATUS dhcpsResult;
  162. #endif
  163. #ifdef INCLUDE_DHCPR
  164. #ifndef INCLUDE_DHCPS              /* Server is superset of relay agent. */
  165.     STATUS dhcprResult;
  166. #endif
  167. #endif
  168. #ifdef INCLUDE_DHCPR
  169. #ifndef INCLUDE_DHCPS
  170.     dhcprLibInit ();
  171. #endif
  172. #endif
  173.     if ((strncmp (sysBootParams.bootDev, "bp", 2) == 0) ||
  174.             (strncmp (sysBootParams.bootDev, "sm", 2) == 0))
  175. {
  176. /* booting via backplane */
  177.         pBootString = sysBootParams.bad;
  178.         }
  179.     else
  180.         pBootString = sysBootParams.ead;
  181. #ifdef INCLUDE_DHCPC
  182.         /* 
  183.          * Remove any values for DHCP lease origin and lease duration from
  184.          * address string and store in dhcpcBootLease global. Set dhcpBoot
  185.          * flag to indicate if DHCP lease values were found.
  186.          */
  187.         if (sysFlags & SYSFLG_AUTOCONFIG)
  188.             if (dhcpcLeaseGet (pBootString, &dhcpBoot) == ERROR)
  189.                 {
  190.                 printf ("Unable to verify assigned DHCP address.n");
  191.                 return (ERROR);
  192.                 }
  193. #else
  194.         /*
  195.          * If network configuration protocols are used, check address 
  196.          * for DHCP lease information. If found (and removed), exit
  197.          * with an error, since the active DHCP lease cannot be maintained.
  198.          */ 
  199.         if (sysFlags & SYSFLG_AUTOCONFIG)
  200.             if (dhcpcBootLineClean (pBootString) == OK)
  201.                 {
  202.                 printf ("Can't use dynamic address %s without DHCP.n",
  203.                             pBootString);
  204.                 return (ERROR);
  205.                 }
  206. #endif    /* INCLUDE_DHCPC */
  207.     /* attach and configure interfaces */
  208.     /*   
  209.      * Boot Device             Routines
  210.      * -----------             --------
  211.      * "ppp"                   usrPPPInit
  212.      * "sl"                    usrSlipInit
  213.      *   
  214.      *      For the following devices, first remove the netmask value with
  215.      *      bootNetmaskExtract and store it in the "netmask" variable.
  216.      *      The target address field is selected based on the device type.
  217.      *
  218.      * Boot Device   Address Field           Routines
  219.      * -----------   -------------           --------
  220.      * "bp" or "sm"  sysBootParams.bad       usrBpInit, usrNetIfAttach, 
  221.      *                                       usrNetIfConfig
  222.      *           (Side effect: set backplaneBoot to TRUE)
  223.      *
  224.      * All others    sysBootParams.ead       None if "other" field is empty
  225.      *                                       else usrNetIfAttach/usrNetIfConfig
  226.      *                                       for the named device
  227.      *
  228.     /* attach backplane interface (as second interface) */
  229.      /* 
  230.       * Further backplane configuration occurred here if INCLUDE_SM_NET was
  231.       * defined. It handled the case where an address was specified in the 
  232.       * params.bad field and some other boot device besides bp or sm was used. 
  233.       * The shared memory interface was created with usrNetIfAttach and 
  234.       * usrNetIfConfig using the given address at this point.
  235.       */
  236.    /* 
  237.     * This segment of DHCP client processing is only required when
  238.     * INCLUDE_SM_NET is defined.
  239.     */
  240. #ifdef INCLUDE_DHCPC
  241.     if (backplaneBoot)
  242.         {
  243.          if ((sysFlags & SYSFLG_AUTOCONFIG) && !(sysFlags & SYSFLG_PROXY))
  244.              {
  245.               printf("DHCP over backplane only with proxy arp.n");
  246.               return (ERROR);
  247.              }
  248.         }
  249. #endif /* INCLUDE_DHCPC */
  250.     if (sysBootParams.targetName[0] != EOS)
  251.         sethostname (sysBootParams.targetName, strlen (sysBootParams.targetName));
  252. #ifdef INCLUDE_DHCPC
  253.     if (dhcpcLibInit (DHCPC_SPORT, DHCPC_CPORT, DHCPC_MAX_LEASES, 
  254.                       DHCPC_OFFER_TIMEOUT, DHCPC_DEFAULT_LEASE, 
  255.                       DHCPC_MIN_LEASE) == ERROR)
  256.         return (ERROR);
  257. #ifdef INCLUDE_NET_SHOW
  258.     dhcpcShowInit ();
  259. #endif
  260.     /* 
  261.      * Renew lease and store values in boot line. If successful, the
  262.      * pDhcpcBootCookie global is set to allow user access to the lease.
  263.      */
  264.     if (dhcpcConfigSet (&sysBootParams, &netmask, dhcpBoot) == ERROR)
  265.         return (ERROR);
  266.     if (dhcpBoot == TRUE)
  267.         bootStructToString (BOOT_LINE_ADRS, &sysBootParams);
  268. #endif   /* INCLUDE_DHCPC */
  269.     /* if a gateway was specified, extract the network part of the host's
  270.      * address and add a route to this network
  271.      */
  272.     if (sysBootParams.gad[0] != EOS)
  273.         {
  274. inet_netof_string (sysBootParams.had, nad);
  275. routeAdd (nad, sysBootParams.gad);
  276.         }
  277.     /* associate host name with the specified host address */
  278.     hostAdd (sysBootParams.hostName, sysBootParams.had);
  279. /* 
  280.  * INCLUDE_PASSFS/INCLUDE_NET_REM_IO would create a remote access device 
  281.  * at this point to get at the host file system. 
  282.  */
  283. #if defined (INCLUDE_DHCPS) || defined (INCLUDE_DHCPR)
  284.     /*
  285.      * For now, set server or relay agent to listen on boot device.
  286.      * Eventually, need to allow for multiple network devices.
  287.      */
  288.     devName [0] = EOS;
  289.     sprintf(devName, "%s%d", sysBootParams.bootDev, sysBootParams.unitNum);
  290.     devlist[0] = ifunit (devName);
  291. #ifdef INCLUDE_DHCPS
  292. #ifdef INCLUDE_DHCPR
  293.     printf ("DHCP Server present. Relay agent not permitted.n");
  294. #endif
  295.     if (devlist[0] == NULL)
  296.         printf("Network interface %s not found. DHCP server not started.n",
  297.                 devName);
  298.     else
  299.         {
  300.         dhcpsResult = dhcpsLeaseHookAdd (DHCPS_LEASE_HOOK);
  301.         if (dhcpsResult == ERROR)
  302.             {
  303.             printf ("Warning: Required storage hook not installed.n");
  304.             printf ("Lease records will not be saved.n");
  305.             }
  306.         dhcpsResult = dhcpsAddressHookAdd (DHCPS_ADDRESS_HOOK);
  307.         if (dhcpsResult == ERROR)
  308.             {
  309.             printf ("Warning: No DHCP server address cache!");
  310.             printf (" Later entries will not be saved.n");
  311.             }
  312.         dhcps_dflt_lease = DHCPS_DEFAULT_LEASE;
  313.         dhcps_max_lease = DHCPS_MAX_LEASE;
  314.         dhcpsResult = dhcpsInit (devlist, 1,
  315.                                  dhcpsLeaseTbl, dhcpsLeaseTblSize,
  316.                                  dhcpsRelayTbl, dhcpsRelayTblSize,
  317.                                  dhcpTargetTbl, dhcpTargetTblSize);
  318.         if (dhcpsResult == ERROR)
  319.             printf ("Error initializing DHCP server. Not started.n");
  320.         else
  321.             {
  322.             dhcpsResult = taskSpawn ("tDhcpsTask", dhcpsTaskPriority,
  323.                                      dhcpsTaskOptions, dhcpsTaskStackSize,
  324.                                      (FUNCPTR) dhcpsStart,
  325.                                      0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
  326.             if (dhcpsResult == ERROR)
  327.                 printf ("Unable to start DHCP server task.n");
  328.             printf ("DHCP server started.n");
  329.             }
  330.         }
  331. #else
  332.     if (devlist[0] == NULL)
  333.       printf("Network interface %s not found. DHCP relay agent not started.n",
  334.                 devName);
  335.     else
  336.         {
  337.         dhcprResult = dhcprInit (devlist, 1, dhcpTargetTbl, dhcpTargetTblSize);
  338.         if (dhcprResult == ERROR)
  339.             printf ("Error initializing DHCP relay agent. Not started.n");
  340.         else
  341.             {
  342.             dhcprResult = taskSpawn ("tDhcprTask", dhcprTaskPriority,
  343.                                       dhcprTaskOptions, dhcprTaskStackSize,
  344.                                       (FUNCPTR) dhcprStart,
  345.                                       0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
  346.             if (dhcprResult == ERROR)
  347.                 printf ("Unable to start DHCP relay agent task.n");
  348.             printf ("DHCP relay agent started.n");
  349.             }
  350.         }
  351. #endif
  352. #endif    /* INCLUDE_DHCPS or INCLUDE_DHCPR */
  353.     return (OK);
  354.     }
  355. #ifndef INCLUDE_DHCPC
  356. /*******************************************************************************
  357. *
  358. * dhcpcBootLineClean - remove DHCP information from system bootline
  359. *
  360. * This routine removes the DHCP information (lease duration and origin) from 
  361. * the client address string in the bootline. Those values are present
  362. * if the target IP address obtained during system boot was provided by a
  363. * DHCP server. The routine is called if DHCP is not included in a VxWorks 
  364. * image and an automatic configuration protocol was used by the bootstrap
  365. * loader. Under those circumstances, indications of a DHCP lease result are
  366. * treated as an error by the startup code, since the lease cannot be renewed.
  367. *
  368. * RETURNS: OK if DHCP lease data found in bootline, or ERROR otherwise.
  369. *
  370. * NOMANUAL
  371. */
  372. LOCAL STATUS dhcpcBootLineClean
  373.     (
  374.     char *  pAddrString    /* client address string from bootline */
  375.     )
  376.     {
  377.     FAST char *pDelim;
  378.     FAST char *offset;
  379.     STATUS result = ERROR;
  380.     /* Check if lease duration field is present. */
  381.     offset = index (pAddrString, ':');     /* Find netmask field. */
  382.     if (offset != NULL)
  383.         {
  384.         pDelim = offset + 1;
  385.         offset = index (pDelim, ':');
  386.         if (offset != NULL)
  387.             {
  388.             /* 
  389.              * Lease duration found - for active DHCP leases,
  390.              * the lease origin field is also present.
  391.              */
  392.             pDelim = offset + 1;
  393.             pDelim = index (pDelim, ':');
  394.             if (pDelim != NULL)
  395.                  result = OK;     /* Active DHCP lease found. */
  396.             *offset = EOS;    /* Remove DHCP lease information. */
  397.             }
  398.         }
  399.     return (result);
  400.     }
  401. #endif