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

VxWorks

开发平台:

C/C++

  1. /* dhcpc.c - DHCP client runtime finite state machine definition */
  2. /* Copyright 1984 - 2001 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01i,12oct01,rae  fixed modhist line
  8. 01h,24oct00,spm  fixed modification history after tor3_x merge
  9. 01g,23oct00,niq  merged from version 01g of tor3_x branch (base version 01f)
  10. 01f,26aug97,spm  major overhaul: reorganized code and changed user interface
  11.                  to support multiple leases at runtime
  12. 01e,06aug97,spm  removed parameters linked list to reduce memory required
  13. 01d,18apr97,spm  added conditional include DHCPC_DEBUG for displayed output
  14. 01c,07apr97,spm  modified control function to return ERROR, changed docs 
  15. 01b,29jan97,spm  removed all functions except state machine definition 
  16. 01a,03oct96,spm  created by modifying WIDE project DHCP Implementation 
  17. */
  18. /*
  19. DESCRIPTION
  20. This library contains the control function for the DHCP client finite
  21. state machine when executing during runtime.
  22. INCLUDE_FILES: dhcpcLib.h
  23. */
  24. /*
  25.  * WIDE Project DHCP Implementation
  26.  * Copyright (c) 1995 Akihiro Tominaga
  27.  * Copyright (c) 1995 WIDE Project
  28.  * All rights reserved.
  29.  *
  30.  * Permission to use, copy, modify and distribute this software and its
  31.  * documentation is hereby granted, provided only with the following
  32.  * conditions are satisfied:
  33.  *
  34.  * 1. Both the copyright notice and this permission notice appear in
  35.  *    all copies of the software, derivative works or modified versions,
  36.  *    and any portions thereof, and that both notices appear in
  37.  *    supporting documentation.
  38.  * 2. All advertising materials mentioning features or use of this software
  39.  *    must display the following acknowledgement:
  40.  *      This product includes software developed by WIDE Project and
  41.  *      its contributors.
  42.  * 3. Neither the name of WIDE Project nor the names of its contributors
  43.  *    may be used to endorse or promote products derived from this software
  44.  *    without specific prior written permission.
  45.  *
  46.  * THIS SOFTWARE IS PROVIDED BY THE DEVELOPER ``AS IS'' AND WIDE
  47.  * PROJECT DISCLAIMS ANY LIABILITY OF ANY KIND FOR ANY DAMAGES
  48.  * WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. ALSO, THERE
  49.  * IS NO WARRANTY IMPLIED OR OTHERWISE, NOR IS SUPPORT PROVIDED.
  50.  *
  51.  * Feedback of the results generated from any improvements or
  52.  * extensions made to this software would be much appreciated.
  53.  * Any such feedback should be sent to:
  54.  * 
  55.  *  Akihiro Tominaga
  56.  *  WIDE Project
  57.  *  Keio University, Endo 5322, Kanagawa, Japan
  58.  *  (E-mail: dhcp-dist@wide.ad.jp)
  59.  *
  60.  * WIDE project has the rights to redistribute these changes.
  61.  */
  62. /* includes */
  63. #include "vxWorks.h"
  64. #include "logLib.h"
  65. #include "stdio.h"
  66. #include "stdlib.h"
  67. #include "netinet/in.h"
  68. #include "netinet/udp.h"
  69. #include "netinet/ip.h"
  70. #include "netinet/if_ether.h"
  71. #include "dhcp/dhcpcCommonLib.h"
  72. #include "dhcp/dhcpcInternal.h"
  73. #include "dhcp/dhcpcStateLib.h"
  74. /*******************************************************************************
  75. *
  76. * dhcp_client_setup - initialize WIDE project data structures for client
  77. *
  78. * This routine initializes the WIDE project data structures used by all leases.
  79. * It assigns functions to handle each of the states in the DHCP client's finite
  80. * state machine, and invokes the initialize() routine to set up the structures
  81. * used for network data transfer. It is called by the dhcpcLibInit() routine
  82. * during the overall initialization of the DHCP client library.
  83. *
  84. * RETURNS: OK if setup completed, or ERROR otherwise.
  85. *
  86. * ERRNO: N/A
  87. *
  88. * NOMANUAL
  89. */
  90. STATUS dhcp_client_setup 
  91.     (
  92.     int  serverPort,  /* port used by DHCP servers */
  93.     int  clientPort,  /* port used by DHCP clients */
  94.     int  bufSize  /* maximum size of any DHCP message */
  95.     )
  96.     {
  97.     int retval = 0;
  98.     /* Assign routines for processing client's finite state machine. */
  99.     fsm [INIT] = init;
  100.     fsm [WAIT_OFFER] = wait_offer;
  101.     fsm [SELECTING] = selecting;
  102.     fsm [REQUESTING] = requesting;
  103.     fsm [BOUND] = bound;
  104.     fsm [RENEWING] = renewing;
  105.     fsm [REBINDING] = rebinding;
  106.     fsm [INIT_REBOOT] = init_reboot;
  107.     fsm [VERIFY] = verify;
  108.     fsm [REBOOTING] = reboot_verify;
  109.     fsm [VERIFYING] = reboot_verify;
  110.     fsm [INFORMING] = inform;
  111.     /* Create data used for message transfer by all leases. */
  112.     if ( (retval = initialize (serverPort, clientPort, bufSize)) < 0)
  113.         return (ERROR);
  114.     return (OK);
  115.     }
  116. /*******************************************************************************
  117. *
  118. * dhcp_client - Exercise client finite state machine
  119. *
  120. * This routine triggers the finite state machine to obtain a set of
  121. * configration parameters. It should only be called internally.
  122. *
  123. * The <pCookie> argument indicates the handle which accesses any
  124. * parameters from the API. The <bindFlag> argument indicates whether
  125. * the dhcpcBind() or dhcpcInformGet() routine starts the process. The
  126. * first routine negotiates a lease with a server. The second only
  127. * attempts to obtain additional parameters when an address is already
  128. * available and does not create a lease.
  129. * .IP
  130. * The message exchanges will be performed synchronously or asynchronously,
  131. * depending on the setting of the waitFlag parameter. If that flag is set,
  132. * the routine executes synchronously by waiting until the process completes,
  133. * then returning the results to the caller. This situation always occurs when
  134. * renewing a lease obtained during system boot. The client library always
  135. * applies any configuration parameters associated with that lease to the
  136. * network interface used for transmission.
  137. * .IP 
  138. * When starting a lease negotiation, this routine adds a bind request to
  139. * the event ring which is monitored by the client monitor task. A similar
  140. * request starts the shorter message exchange to retrieve additional
  141. * parameters. Once either process completes, any event hook registered for
  142. * the corresponding handle will be invoked by the state machine to allow
  143. * application-specific processing of any parameters obtained.
  144. * .IP
  145. * If automatic configuration was requested during the lease initialization, 
  146. * the address settings of the transmission network interface will change 
  147. * without warning throughout the lifetime of the lease. In particular, the 
  148. * initial state of the client's finite state machine will reset that interface 
  149. * to use a reserved IP address, preventing access from any other source.
  150. * Notification after the settings are changed will only be available if an
  151. * event hook is installed for the lease. 
  152. *
  153. * RETURNS: 0 if processing completed, or value of failed state on error.
  154. *
  155. * ERRNO: N/A
  156. *
  157. * NOMANUAL
  158. */
  159. int dhcp_client
  160.     (
  161.     void *  pCookie,  /* parameter handle from dhcpcInit() routine */
  162.     BOOL  bindFlag  /* Perform lease negotiation or inform only? */
  163.     )
  164.     {
  165.     LEASE_DATA *  pLeaseData;
  166.     BOOL  syncFlag;
  167.     STATUS  result;
  168.     int  eventType;
  169.     /*
  170.      * Use the cookie to access the lease-specific data structures. For now,
  171.      * just typecast the cookie. This translation could be replaced with a more
  172.      * sophisticated lookup at some point.
  173.      */
  174.     pLeaseData = (LEASE_DATA *)pCookie;
  175.     /* Set up variables used on a lease-specific basis. */
  176.          /* Reseed random number generator used for retransmission backoffs. */
  177.     srand (generate_xid (&pLeaseData->ifData));  
  178.     syncFlag = pLeaseData->waitFlag; /* Assign lease synchronization status. */
  179.     if (bindFlag)
  180.         {
  181.         /* Full lease negotiation process. */
  182.         if (pLeaseData->autoConfig || pLeaseData->leaseType == DHCP_AUTOMATIC)
  183.             {
  184.             /* 
  185.              * Disable network interface until negotiation completes
  186.              * if it used the address information provided by the lease. 
  187.              */
  188.             reset_if (&pLeaseData->ifData);
  189.             }
  190.         /*
  191.          * The INIT_REBOOT state attempts to verify a current lease, if any.
  192.          * Otherwise, it proceeds to the INIT state.
  193.          */
  194.         pLeaseData->prevState = pLeaseData->currState = INIT_REBOOT;
  195.         eventType = DHCP_USER_BIND;
  196.         }
  197.     else
  198.         {
  199.         /*
  200.          * Partial message exchange for known (externally assigned) address.
  201.          * Send an INFORM message and wait for an acknowledgement containing
  202.          * additional parameters.
  203.          */
  204.         pLeaseData->prevState = pLeaseData->currState = INFORMING;
  205.         eventType = DHCP_USER_INFORM;
  206.         }
  207.     /* Add an event to the message queue to start the requested process. */
  208.     result = dhcpcEventAdd (DHCP_USER_EVENT, eventType, pCookie, FALSE);
  209.     if (result == ERROR)
  210.         return (-1);
  211.     /* For synchronous message exchanges, wait for the completion signal. */
  212.     if (syncFlag)
  213.         semTake (pLeaseData->leaseSem, WAIT_FOREVER);
  214.     return (0);   /* Request successful. */
  215.     }