Mercurial > ecos
diff packages/net/tcpip/current/include/dhcp.h @ 110:84e4bde58b26 ecos-sw-2000-07-14
Merge from eCos master repository on 2000-07-14-22:00:02-BST
| author | jlarmour |
|---|---|
| date | Mon, 17 Jul 2000 14:42:27 +0000 |
| parents | |
| children | d397fc472bcf |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/packages/net/tcpip/current/include/dhcp.h @@ -0,0 +1,254 @@ +#ifndef CYGONCE_NET_TCPIP_DHCP_H +#define CYGONCE_NET_TCPIP_DHCP_H + +//========================================================================== +// +// include/dhcp.h +// +// DHCP protocol support +// +//========================================================================== +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Red Hat eCos Public License +// Version 1.1 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://www.redhat.com/ +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Configurable Operating System, +// released September 30, 1998. +// +// The Initial Developer of the Original Code is Red Hat. +// Portions created by Red Hat are +// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//####BSDCOPYRIGHTBEGIN#### +// +// ------------------------------------------- +// +// Portions of this software may have been derived from OpenBSD or other sources, +// and are covered by the appropriate copyright disclaimers included herein. +// +// ------------------------------------------- +// +//####BSDCOPYRIGHTEND#### +//========================================================================== +//#####DESCRIPTIONBEGIN#### +// +// Author(s): hmt +// Contributors: gthomas +// Date: 2000-07-01 +// Purpose: Support DHCP initialization in eCos TCPIP stack +// Description: +// +// +//####DESCRIPTIONEND#### +// +//========================================================================== + +// +// DHCP. RFC2131, RFC1533, RFC1534 +// See also bootp.h +// + +#include <pkgconf/system.h> +#include <pkgconf/net.h> + +#ifdef CYGPKG_NET_DHCP + +#include <machine/types.h> + +#include <cyg/kernel/kapi.h> + +#include <bootp.h> + +// DHCP messages; these are sent in the tag TAG_DHCP_MESS_TYPE already +// defined in bootp.h + +#define DHCPDISCOVER 1 +#define DHCPOFFER 2 +#define DHCPREQUEST 3 +#define DHCPDECLINE 4 +#define DHCPACK 5 +#define DHCPNAK 6 +#define DHCPRELEASE 7 + +// DHCP interface state machine states; these are published so that app +// code can know what to do... (see page 35 of RFC2131) + +// These we will use in the normal course of events +#define DHCPSTATE_INIT 1 +#define DHCPSTATE_SELECTING 2 // wait for replies to b/c DISCOVER +#define DHCPSTATE_REQUESTING 3 +#define DHCPSTATE_REQUEST_RECV 4 // wait for replies to b/c REQUEST +#define DHCPSTATE_BOUND 5 +#define DHCPSTATE_RENEWING 6 // wait for replies to u/c REQUEST +#define DHCPSTATE_RENEW_RECV 7 +#define DHCPSTATE_REBINDING 8 // wait for replies to b/c REQUEST +#define DHCPSTATE_REBIND_RECV 9 +#define DHCPSTATE_BOOTP_FALLBACK 10 // fall back to plain bootp +#define DHCPSTATE_NOTBOUND 11 // To let app tidy up +#define DHCPSTATE_FAILED 12 // Net is down +#define DHCPSTATE_DO_RELEASE 13 // Force release of the current lease +// These we don't use +//#define DHCPSTATE_INITREBOOT +//#define DHCPSTATE_REBOOTING + +// These are to let the app inspect the state of the interfaces when +// managing them itself, by analogy with eth0_up &c; eth0_bootp_data and so +// on will still be used with DHCP. +#ifdef CYGHWR_NET_DRIVER_ETH0 +extern cyg_uint8 eth0_dhcpstate; +#endif +#ifdef CYGHWR_NET_DRIVER_ETH1 +extern cyg_uint8 eth1_dhcpstate; +#endif + +// This is public so the app wait on it or poll it when managing DHCP +// itself. It will be zero while the app should wait, and posted when a +// call to do_dhcp() is needed. +extern cyg_sem_t dhcp_needs_attention; + +// This routine is used at startup time, and after relinquishing leases or +// after a lease timeout: it does DHCP or bootp or static setup according +// to configuration. +extern void init_all_network_interfaces(void); + +// This routine does the work of renewing leases &c. +// return value: 1 => everything OK, no change. +// 0 => close your connections, then call do_dhcp_halt() to halt the +// interface(s) in question (it knows because the state will be NOTBOUND). +// After that you can return to the start and use +// init_all_network_interfaces() as usual. +extern int dhcp_bind( void ); + +// Shutdown any interface which is not already shut down - whether +// initialized by DHCP or not. Reason: because of the broadcast-while-not- +// -fully-initialized nature of the DHCP conversation, all other interfaces +// must be shut down during that. So one down, all down, is required. +extern int dhcp_halt( void ); + +// Release (and set state to DHCPSTATE_NOTBOUND) all interfaces - we are +// closing down. (unlikely but useful for testing) +// Interfaces are left up; use dhcp_halt() to bring them right down, then +// call init_all_network_interfaces() as usual to restart all. +extern int dhcp_release( void ); + +// The intent with this API is that a simple DHCP client thread, which +// maintains the state of the interfaces, can go as follows: +// (after init_all_networks is called from elsewhere) +// +// while ( 1 ) { +// while ( 1 ) { +// cyg_semaphore_wait( &dhcp_needs_attention ); +// if ( ! dhcp_bind() ) // a lease expired +// break; // If we need to re-bind +// } +// dhcp_halt(); // tear everything down +// init_all_network_interfaces(); // re-initialize +// } +// +// and if the application does not want to suffer the overhead of a +// separate thread and its stack for this, this functionality can be placed +// in the app's server loop in an obvious fashion. That is the goal of +// breaking out these internal elements. For example, some server might +// be arranged to poll DHCP from time to time like this: +// +// while ( 1 ) { +// init_all_network_interfaces(); +// open-my-listen-sockets(); +// while ( 1 ) { +// serve-one-request(); +// // sleeps if no connections, but not forever; so this loop is +// // polled a few times a minute... +// if ( cyg_semaphore_trywait( &dhcp_needs_attention )) { +// if ( ! dhcp_bind() ) { +// close-my-listen-sockets(); +// dhcp_halt(); +// break; +// } +// } +// } +// } +// +// ------------------------------------------------------------------------ + +#ifdef CYGOPT_NET_DHCP_DHCP_THREAD +// Then we provide such a thread... + +// Provide a separate thread to renew DHCP leases; otherwise the +// application MUST periodically examine the semaphore dhcp_needs_attention +// and call dhcp_bind() if it is signalled. If enabled, this thread does +// all that for you. Independent of this option, initialization of the +// interfaces still occurs in init_all_network_interfaces() and your +// startup code must call that. It will start the DHCP management thread +// if necessary. If a lease fails to be renewed, the management thread +// will shut down all interfaces and attempt to initialize all the +// interfaces again from scratch. This may cause chaos in the app, which +// is why managing the DHCP state in an application aware thread is +// actually better, just far less convenient for testing. + +extern cyg_handle_t dhcp_mgt_thread_h; // To allow its external manipulation. +extern cyg_thread dhcp_mgt_thread; // The object itself + +extern void dhcp_start_dhcp_mgt_thread( void ); + +#endif + +// The function is provided unconditionally so that the app can put it in a +// thread of its own. If the parameter is true, it loops forever; if +// false, the call returns if a lease expires, and the caller must tidy up +// or reboot the whole machine. +extern cyg_thread_entry_t dhcp_mgt_entry; +extern void dhcp_mgt_entry( cyg_addrword_t loop_on_failure ); // the function + +// --------------------------------------------------------------------------- +// These are rather more internal routines, internal to the protocol engine +// in dhcp_prot.c - those above are in dhcp_support.c + +#define DHCP_LEASE_T1 1 +#define DHCP_LEASE_T2 2 +#define DHCP_LEASE_EX 4 + +struct dhcp_lease { + cyg_tick_count_t t1, t2, expiry; + volatile cyg_uint8 next; + volatile cyg_uint8 which; + cyg_handle_t alarm; + cyg_alarm alarm_obj; +}; + +#ifdef CYGHWR_NET_DRIVER_ETH0 +extern struct dhcp_lease eth0_lease; +#endif +#ifdef CYGHWR_NET_DRIVER_ETH1 +extern struct dhcp_lease eth1_lease; +#endif + +extern int +do_dhcp(const char *interface, struct bootp *res, + cyg_uint8 *pstate, struct dhcp_lease *lease); +// NB *res and *pstate and *lease are all INOUT; *res must point to a valid +// record from "last time". + +extern int +do_dhcp_down_net(const char *intf, struct bootp *res, + cyg_uint8 *pstate, struct dhcp_lease *lease); + +extern int +do_dhcp_release(const char *intf, struct bootp *res, + cyg_uint8 *pstate, struct dhcp_lease *lease); + +#endif // CYGPKG_NET_DHCP + +#endif // CYGONCE_NET_TCPIP_DHCP_H +// EOF dhcp.h
