⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dhcpclib.c

📁 the vxworks system kernel souce packeg.there may be something you need .
💻 C
📖 第 1 页 / 共 5 页
字号:
     */    if (bsdFlag)        pLeaseData->ifData.haddr.htype = ETHER;    else        pLeaseData->ifData.haddr.htype = dhcpConvert (pIf->if_type);    pLeaseData->ifData.haddr.hlen = pIf->if_addrlen;    if (pLeaseData->ifData.haddr.hlen > MAX_HLEN)        pLeaseData->ifData.haddr.hlen = MAX_HLEN;    bcopy ( (char *) ( (struct arpcom *)pIf)->ac_enaddr,           (char *)&pLeaseData->ifData.haddr.haddr,            pLeaseData->ifData.haddr.hlen);     /*     * Set the maximum message length based on the MTU size and the     * maximum message/buffer size specified during initialization.     */    pReqSpec->maxlen = maxSize;    /* set duration of client's wait for multiple offers */    pReqSpec->waitsecs = dhcpcOfferTimeout;     pReqSpec->reqlist.len = 0;    /* No options requested yet.  */    /*     * If executing with startup lease, or if automatic configuration is     * requested, initialize request list with tags for options required      * by all network interfaces, using RFC 1533 tag values.     */    if (pLeaseData->autoConfig || pLeaseData->leaseType == DHCP_AUTOMATIC)        {        pReqSpec->reqlist.list [pReqSpec->reqlist.len++] =                                                        _DHCP_SUBNET_MASK_TAG;        pReqSpec->reqlist.list [pReqSpec->reqlist.len++] =                                                        _DHCP_BRDCAST_ADDR_TAG;        }    /*     * For now, create a separate watchdog timer for each lease.  Eventually,     * a single watchdog timer will suffice for all leases, when combined     * with a sorted queue containing relative firing times.  This enhancement     * can wait.     */    /* Create event timer for state machine.  */    pLeaseData->timer = wdCreate ();    if (pLeaseData->timer == NULL)        {        free (pLeaseData);        close (bpfDev);        errno = S_dhcpcLib_MEM_ERROR;        return (NULL);        }    /* Create signalling semaphore for completion of negotiation process.  */    pLeaseData->leaseSem = semBCreate (SEM_Q_FIFO, SEM_EMPTY);    if (pLeaseData->leaseSem == NULL)        {        wdDelete (pLeaseData->timer);        free (pLeaseData);        close (bpfDev);        errno = S_dhcpcLib_MEM_ERROR;        return (NULL);        }    /*      * Manual leases will not reset the network interface unless specifically     * requested to do so.  This lease type is replaced with DHCP_AUTOMATIC for      * the lease established during system startup.  The parameters for     * an automatic lease are always applied to the underlying interface.     */    pLeaseData->leaseType = DHCP_MANUAL;    pLeaseData->initFlag = TRUE;    /* Store the lease-specific data in the global list.  */    dhcpcLeaseList [offset] = pLeaseData;    /* Notify the DHCP read task that a new session is available. */    send (dhcpcSignalSock, dhcpcSignalData, dhcpcSignalSize, 0);    return (pCookie);    }/********************************************************************************* dhcpcEventHookAdd - add a routine to handle configuration parameters** This routine installs a hook routine to handle changes in the configuration* parameters provided for the lease indicated by <pCookie>.  The hook provides * an alternate configuration method for DHCP leases and uses the following * interface:* .CS* void dhcpcEventHookRtn*     (*     int 	leaseEvent,	/@ new or expired parameters @/*     void * 	pCookie 	/@ lease identifier from dhcpcInit() @/*     )* .CE** The routine is called with the <leaseEvent> parameter set to DHCPC_LEASE_NEW* whenever a lease is successfully established.  The DHCPC_LEASE_NEW event* does not occur when a lease is renewed by the same DHCP server, since the* parameters do not change in that case.  However, it does occur if the * client rebinds to a different DHCP server.  The DHCPC_LEASE_INVALID event* indicates that the configuration parameters for the corresponding lease may* no longer be used.  That event occurs when a lease expires or a renewal* or verification attempt fails, and coincides with re-entry into the initial * state of the negotiation process.** If the lease initialization specified automatic configuration of the* corresponding network interface, any installed hook routine will be invoked* after the new address information is applied.** RETURNS: OK if notification hook added, or ERROR otherwise.** ERRNO: S_dhcpcLib_BAD_COOKIE, S_dhcpcLib_NOT_INITIALIZED*/STATUS dhcpcEventHookAdd    (    void * 	pCookie, 	/* identifier returned by dhcpcInit() */    FUNCPTR 	pEventHook	/* routine to handle lease parameters */    )    {    LEASE_DATA * 	pLeaseData;    int offset;    /*     * Use the cookie to access the lease-specific data structures.  For now,     * just typecast the cookie.  This translation could be replaced with a more     * sophisticated lookup at some point.     */    pLeaseData = (LEASE_DATA *)pCookie;    for (offset = 0; offset < dhcpcMaxLeases; offset++)        if (dhcpcLeaseList [offset] != NULL &&                dhcpcLeaseList [offset] == pLeaseData)            break;    if (offset == dhcpcMaxLeases)        {        errno = S_dhcpcLib_BAD_COOKIE;        return (ERROR);        }    if (!dhcpcInitialized || !pLeaseData->initFlag)        {        errno = S_dhcpcLib_NOT_INITIALIZED;        return (ERROR);        }    /* Assign the event notification hook.  */    pLeaseData->eventHookRtn = pEventHook;    return (OK);    }/********************************************************************************* dhcpcEventHookDelete - remove the configuration parameters handler** This routine removes the hook routine that handled changes in the * configuration parameters for the lease indicated by <pCookie>.* If the lease initialization specified automatic configuration of the* corresponding network interface, the assigned address could change* without warning after this routine is executed.** RETURNS: OK if notification hook removed, or ERROR otherwise.** ERRNO: S_dhcpcLib_BAD_COOKIE, S_dhcpcLib_NOT_INITIALIZED* */STATUS dhcpcEventHookDelete    (    void * 	pCookie 	/* identifier returned by dhcpcInit() */    )    {    LEASE_DATA * 	pLeaseData;    int offset;    /*     * Use the cookie to access the lease-specific data structures. For now,     * just typecast the cookie. This translation could be replaced with a more     * sophisticated lookup at some point.     */    pLeaseData = (LEASE_DATA *)pCookie;    for (offset = 0; offset < dhcpcMaxLeases; offset++)        if (dhcpcLeaseList [offset] != NULL &&                dhcpcLeaseList [offset] == pLeaseData)            break;    if (offset == dhcpcMaxLeases)        {        errno = S_dhcpcLib_BAD_COOKIE;        return (ERROR);        }    if (!dhcpcInitialized || !pLeaseData->initFlag)        {        errno = S_dhcpcLib_NOT_INITIALIZED;        return (ERROR);        }    /* Remove the event notification hook. */    pLeaseData->eventHookRtn = NULL;    return (OK);    }/********************************************************************************* dhcpcCacheHookAdd - add a routine to store and retrieve lease data** This routine adds a hook routine that is called at the bound state* (to store the lease data) and during the INIT_REBOOT state (to re-use the* parameters if the lease is still active).  The calling sequence of the * input hook routine is:* .CS* STATUS dhcpcCacheHookRtn*     (*     int command,			/@ requested cache operation @/*     unsigned long *pTimeStamp,	/@ lease timestamp data @/*     int *pDataLen,			/@ length of data to access @/*     char *pBuffer			/@ pointer to data buffer @/*     )** .CE* The hook routine should return OK if the requested operation is completed* successfully, or ERROR otherwise.  All the supplied pointers reference memory * locations that are reused upon return from the hook.  The hook routine * must copy the data elsewhere.** NOTE* The setting of the cache hook routine during a dhcpcInit() call is* recorded and used by the resulting lease throughout its lifetime.* Since the hook routine is intended to store a single lease record,* a separate hook routine should be specified before the dhcpcInit()* call for each lease which will re-use its parameters across reboots.** IMPLEMENTATION* The <command> parameter specifies one of the following operations:* .IP DHCP_CACHE_WRITE 25* Save the indicated data.  The write operation must preserve the value* referenced by <pTimeStamp> and the contents of <pBuffer>.  The <pDataLen> * parameter indicates the number of bytes in that buffer.* .IP DHCP_CACHE_READ * Restore the saved data.  The read operation must copy the data from the* most recent write operation into the location indicated by <pBuffer>,* set the contents of <pDataLen> to the amount of data provided, and store * the corresponding timestamp value in <pTimeStamp>.* .IP* The read operation has very specific requirements.  On entry, the value * referenced by <pDataLen> indicates the maximum buffer size available at* <pBuffer>.  If the amount of data stored by the previous write exceeds this * value, the operation must return ERROR.  A read must also return ERROR if the * saved timestamp value is 0.  Finally, the read operation must return ERROR if * it is unable to retrieve all the data stored by the write operation or if the* previous write was unsuccessful.* .IP DHCP_CACHE_ERASE * Ignore all stored data.  Following this operation, subsequent read operations* must return ERROR until new data is written.  All parameters except * <command> are NULL.* .LP** RETURNS: OK, always.** ERRNO: N/A*/STATUS dhcpcCacheHookAdd    (    FUNCPTR 	pCacheHookRtn 	/* routine to store/retrieve lease data */    )    {    dhcpcCacheHookRtn = pCacheHookRtn;    return (OK);    }/********************************************************************************* dhcpcCacheHookDelete - delete a lease data storage routine** This routine deletes the hook used to store lease data, preventing* re-use of the configuration parameters across system reboots for* all subsequent lease attempts.  Currently active leases will continue* to use the routine specified before the lease initialization.** RETURNS: OK, always.** ERRNO: N/A*/STATUS dhcpcCacheHookDelete (void)    {    dhcpcCacheHookRtn = NULL;    return (OK);    }/********************************************************************************* dhcpcBind - obtain a set of network configuration parameters with DHCP** This routine initiates a DHCP negotiation according to the process described * in RFC 1541.  The <pCookie> argument contains the return value of an earlier * dhcpcInit() call and is used to identify a particular lease.** The <syncFlag> parameter specifies whether the DHCP negotiation started by * this routine will execute synchronously or asynchronously.  An asynchronous * execution will return after starting the DHCP negotiation, but a synchronous * execution will only return once the negotiation process completes.** When a new lease is established, any event hook provided for the lease* will be called to process the configuration parameters.  The hook is also * called when the lease expires or the negotiation process fails.  The results * of an asynchronous DHCP negotiation are not available unless an event hook * is installed.** If automatic configuration of the underlying network interface was specified* during the lease initialization, this routine will prevent all higher-level * protocols from accessing the underlying network interface used during the * initial lease negotiation until that process is complete.  In addition, any * addressing information obtained will be applied to that network interface, * which will remain disabled if the initial negotiation fails.  Finally, the* interface will be disabled if the lease expires.** NOTE* If the DHCP client is used to obtain the VxWorks boot parameters, this * routine is called automatically during system startup using the automatic * reconfiguration.  Therefore, any calls to this routine which use the network * boot device for message transfer when the DHCP client was used at boot time * must not request automatic reconfiguration during initialization.  Otherwise, * the resulting lease settings will conflict with the configuration maintained * by the lease established during system startup. ** RETURNS: OK if routine completes, or ERROR otherwise.** ERRNO: S_dhcpcLib_BAD_COOKIE, S_dhcpcLib_NOT_INITIALIZED, *        S_dhcpcLib_BAD_OPTION, S_dhcpcLib_BAD_DEVICE* */STATUS dhcpcBind     (    void * 	pCookie, 	/* identifier returned by dhcpcInit() */    BOOL 	syncFlag 	/* synchronous or asynchronous execution */    )    {    int 		offset;    STATUS		result = OK;    LEASE_DATA * 	pLeaseData = NULL;    struct dhcpcOpts * 	pOptList;    char * 		pOptions;    struct ifreq 	ifr;    /*     * Use the cookie to access the lease-specific data structures.  For now,     * just typecast the cookie.  This translation could be replaced with a more     * sophisticated lookup at some point.     */    pLeaseData = (LEASE_DATA *)pCookie;    for (offset = 0; offset < dhcpcMaxLeases; offset++)        if (dhcpcLeaseList [offset] != NULL &&                dhcpcLeaseList [offset] == pLeaseData)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -