sync to udhcp 0.9.8

This commit is contained in:
Russ Dill 2002-10-31 19:21:27 +00:00
parent 1b6eb9b6eb
commit f5ecd43473
8 changed files with 243 additions and 160 deletions

View File

@ -1,4 +1,7 @@
0.9.8 (pending) 0.9.8 (021031)
+ split up README files (me)
+ use /dev/urandom to seed xid's (instead of time(0)) (me)
+ fixed renew behavior (me)
+ udhcp now fits nicely into busybox + udhcp now fits nicely into busybox
(Glenn McGrath <bug1@optushome.com.au> as well as myself) (Glenn McGrath <bug1@optushome.com.au> as well as myself)
+ updated client manpage (me) + updated client manpage (me)

View File

@ -5,155 +5,6 @@ The udhcp server/client package is primarily geared towards embedded
systems. It does however, strive to be fully functional, and RFC systems. It does however, strive to be fully functional, and RFC
compliant. compliant.
udhcp server (udhcpd)
--------------------
The only command line argument to udhcpd is an optional specifed
config file. If no config file is specified, udhcpd uses the default
config file, /etc/udhcpd.conf. Ex:
udhcpd /etc/udhcpd.eth1.conf
The udhcp server employs a number of simple config files:
udhcpd.leases
------------
The udhcpd.leases behavior is designed for an embedded system. The
file is written either every auto_time seconds, or when a SIGUSR1
is received (the auto_time timer restarts if a SIGUSR1 is received).
If you send a SIGTERM to udhcpd directly after a SIGUSR1, udhcpd will
finish writing the leases file and wait for the aftermentioned script
to be executed and finish before quiting, so you do not need to sleep
between sending signals. When the file is written, a script can be
optionally called to commit the file to flash. Lease times are stored
in the file by time remaining in lease (for systems without clock
that works when there is no power), or by the absolute time that it
expires in seconds from epoch. In the remainig format, expired leases
are stored as zero. The file is of the format:
16 byte MAC
4 byte ip address
u32 expire time
16 byte MAC
4 byte ip address
u32 expire time
.
etc.
example: hexdump udhcpd.leases
0000000 1000 c95a 27d9 0000 0000 0000 0000 0000
0000010 a8c0 150a 0d00 2d29 5000 23fc 8566 0000
0000020 0000 0000 0000 0000 a8c0 140a 0d00 4e29
0000030
udhcpd.conf
----------
The format is fairly simple, there is a sample file with all the
available options and comments describing them in samples/udhcpd.conf
udhcp client (udhcpc)
--------------------
The udhcp client negotiates a lease with the DHCP server and notifies
a set of scripts when a leases is obtained or lost. The command line
options for the udhcp client are:
-c, --clientid=CLIENTID Client identifier
-H, --hostname=HOSTNAME Client hostname
-h, Alias for -H
-f, --foreground Do not fork after getting lease
-b, --background Fork to background if lease cannot be
immediately negotiated.
-i, --interface=INTERFACE Interface to use (default: eth0)
-n, --now Exit with failure if lease cannot be
immediately negotiated.
-p, --pidfile=file Store process ID of daemon in file
-q, --quit Quit after obtaining lease
-r, --request=IP IP address to request (default: none)
-s, --script=file Run file at dhcp events (default:
/usr/share/udhcpc/default.script)
-v, --version Display version
If the requested IP address cannot be obtained, the client accepts the
address that the server offers.
When an event occurs, udhcpc calls the action script. The script by
default is /usr/share/udhcpc/default.script but this can be changed via
the command line arguments. The three possible arguments to the script
are:
deconfig: This argument is used when udhcpc starts, and
when a leases is lost. The script should put the interface in an
up, but deconfigured state, ie: ifconfig $interface 0.0.0.0.
bound: This argument is used when udhcpc moves from an
unbound, to a bound state. All of the paramaters are set in
enviromental variables, The script should configure the interface,
and set any other relavent parameters (default gateway, dns server,
etc).
renew: This argument is used when a DHCP lease is renewed. All of
the paramaters are set in enviromental variables. This argument is
used when the interface is already configured, so the IP address,
will not change, however, the other DHCP paramaters, such as the
default gateway, subnet mask, and dns server may change.
nak: This argument is used with udhcpc receives a NAK message.
The script with the deconfig argument will be called directly
afterwards, so no changes to the network interface are neccessary.
This hook is provided for purely informational purposes (the
message option may contain a reason for the NAK).
The paramaters for enviromental variables are as follows:
$HOME - The set $HOME env or "/"
$PATH - the set $PATH env or "/bin:/usr/bin:/sbin:/usr/sbin"
$1 - What action the script should perform
interface - The interface this was obtained on
ip - The obtained IP
siaddr - The bootp next server option
sname - The bootp server name option
boot_file - The bootp boot file option
subnet - The assigend subnet mask
timezone - Offset in seconds from UTC
router - A list of routers
timesvr - A list of time servers
namesvr - A list of IEN 116 name servers
dns - A list of DNS server
logsvr - A list of MIT-LCS UDP log servers
cookiesvr - A list of RFC 865 cookie servers
lprsvr - A list of LPR servers
hostname - The assigned hostname
bootsize - The length in 512 octect blocks of the bootfile
domain - The domain name of the network
swapsvr - The IP address of the client's swap server
rootpath - The path name of the client's root disk
ipttl - The TTL to use for this network
mtu - The MTU to use for this network
broadcast - The broadcast address for this network
ntpsrv - A list of NTP servers
wins - A list of WINS servers
lease - The lease time, in seconds
dhcptype - DHCP message type (safely ignored)
serverid - The IP of the server
message - Reason for a DHCPNAK
tftp - The TFTP server name
bootfile - The bootfile name
additional options are easily added in options.c.
udhcpc also responds to SIGUSR1 and SIGUSR2. SIGUSR1 will force a renew state,
and SIGUSR2 will force a release of the current lease, and cause udhcpc to
go into an inactive state (until it is killed, or receives a SIGUSR1). You do
not need to sleep between sending signals, as signals received are processed
sequencially in the order they are received.
compile time options compile time options
------------------- -------------------
@ -185,6 +36,7 @@ options.c contains a set of dhcp options for the client:
code: The DHCP code for this option code: The DHCP code for this option
busybox drop-in busybox drop-in
-------------- --------------
udhcp is now a drop-in component for busybox (http://busybox.net). udhcp is now a drop-in component for busybox (http://busybox.net).
@ -195,3 +47,4 @@ cp *.[ch] README AUTHORS COPYING ChangeLog TODO \
The only two files udhcp does not provide are config.in and The only two files udhcp does not provide are config.in and
Makefile.in, so these may need to be updated from time to time. Makefile.in, so these may need to be updated from time to time.

View File

@ -0,0 +1,17 @@
udhcp lease dump (dumpleases)
----------------------------
dumpleases displays the leases written out by the udhcpd server. Lease
times are stored in the file by time remaining in lease (for systems
without clock that works when there is no power), or by the absolute
time that it expires in seconds from epoch. dumpleases accepts the
following command line options:
-a, --absolute Interpret lease times as expiration time.
-r, --remaining Interpret lease times as remaining time.
-f, --file=FILE Read lease information from FILE.
-h, --help Display help.
Note that if udhcpd has not written a leases file recently, the output
of may not be up to date.

View File

@ -0,0 +1,139 @@
udhcp client (udhcpc)
--------------------
The udhcp client negotiates a lease with the DHCP server and notifies
a set of scripts when a leases is obtained or lost.
command line options
-------------------
The command line options for the udhcp client are:
-c, --clientid=CLIENTID Client identifier
-H, --hostname=HOSTNAME Client hostname
-h, Alias for -H
-f, --foreground Do not fork after getting lease
-b, --background Fork to background if lease cannot be
immediately negotiated.
-i, --interface=INTERFACE Interface to use (default: eth0)
-n, --now Exit with failure if lease cannot be
immediately negotiated.
-p, --pidfile=file Store process ID of daemon in file
-q, --quit Quit after obtaining lease
-r, --request=IP IP address to request (default: none)
-s, --script=file Run file at dhcp events (default:
/usr/share/udhcpc/default.script)
-v, --version Display version
If the requested IP address cannot be obtained, the client accepts the
address that the server offers.
udhcp client scripts
-------------------
When an event occurs, udhcpc calls the action script. The script by
default is /usr/share/udhcpc/default.script but this can be changed via
the command line arguments. The three possible arguments to the script
are:
deconfig: This argument is used when udhcpc starts, and
when a leases is lost. The script should put the interface in an
up, but deconfigured state, ie: ifconfig $interface 0.0.0.0.
bound: This argument is used when udhcpc moves from an
unbound, to a bound state. All of the paramaters are set in
enviromental variables, The script should configure the interface,
and set any other relavent parameters (default gateway, dns server,
etc).
renew: This argument is used when a DHCP lease is renewed. All of
the paramaters are set in enviromental variables. This argument is
used when the interface is already configured, so the IP address,
will not change, however, the other DHCP paramaters, such as the
default gateway, subnet mask, and dns server may change.
nak: This argument is used with udhcpc receives a NAK message.
The script with the deconfig argument will be called directly
afterwards, so no changes to the network interface are neccessary.
This hook is provided for purely informational purposes (the
message option may contain a reason for the NAK).
The paramaters for enviromental variables are as follows:
$HOME - The set $HOME env or "/"
$PATH - the set $PATH env or "/bin:/usr/bin:/sbin:/usr/sbin"
$1 - What action the script should perform
interface - The interface this was obtained on
ip - The obtained IP
siaddr - The bootp next server option
sname - The bootp server name option
boot_file - The bootp boot file option
subnet - The assigend subnet mask
timezone - Offset in seconds from UTC
router - A list of routers
timesvr - A list of time servers
namesvr - A list of IEN 116 name servers
dns - A list of DNS server
logsvr - A list of MIT-LCS UDP log servers
cookiesvr - A list of RFC 865 cookie servers
lprsvr - A list of LPR servers
hostname - The assigned hostname
bootsize - The length in 512 octect blocks of the bootfile
domain - The domain name of the network
swapsvr - The IP address of the client's swap server
rootpath - The path name of the client's root disk
ipttl - The TTL to use for this network
mtu - The MTU to use for this network
broadcast - The broadcast address for this network
ntpsrv - A list of NTP servers
wins - A list of WINS servers
lease - The lease time, in seconds
dhcptype - DHCP message type (safely ignored)
serverid - The IP of the server
message - Reason for a DHCPNAK
tftp - The TFTP server name
bootfile - The bootfile name
additional options are easily added in options.c.
note on udhcpc's random seed
---------------------------
udhcpc will seed its random number generator (used for generating xid's)
by reading /dev/urandom. If you have a lot of embedded systems on the same
network, with no entropy, you can either seed /dev/urandom by a method of
your own, or doing the following on startup:
ifconfig eth0 > /dev/urandom
in order to seed /dev/urandom with some data (mac address) unique to your
system. If reading /dev/urandom fails, udhcpc will fall back to its old
behavior of seeding with time(0).
signals accepted by udhcpc
-------------------------
udhcpc also responds to SIGUSR1 and SIGUSR2. SIGUSR1 will force a renew state,
and SIGUSR2 will force a release of the current lease, and cause udhcpc to
go into an inactive state (until it is killed, or receives a SIGUSR1). You do
not need to sleep between sending signals, as signals received are processed
sequencially in the order they are received.
compile time options
-------------------
options.c contains a set of dhcp options for the client:
name[10]: The name of the option as it will appear in scripts
flags: The type of option, as well as if it will be requested
by the client (OPTION_REQ)
code: The DHCP code for this option

View File

@ -0,0 +1,59 @@
udhcp server (udhcpd)
--------------------
The only command line argument to udhcpd is an optional specifed
config file. If no config file is specified, udhcpd uses the default
config file, /etc/udhcpd.conf. Ex:
udhcpd /etc/udhcpd.eth1.conf
The udhcp server employs a number of simple config files:
udhcpd.leases
------------
The udhcpd.leases behavior is designed for an embedded system. The
file is written either every auto_time seconds, or when a SIGUSR1
is received (the auto_time timer restarts if a SIGUSR1 is received).
If you send a SIGTERM to udhcpd directly after a SIGUSR1, udhcpd will
finish writing the leases file and wait for the aftermentioned script
to be executed and finish before quiting, so you do not need to sleep
between sending signals. When the file is written, a script can be
optionally called to commit the file to flash. Lease times are stored
in the file by time remaining in lease (for systems without clock
that works when there is no power), or by the absolute time that it
expires in seconds from epoch. In the remaining format, expired leases
are stored as zero. The file is of the format:
16 byte MAC
4 byte ip address
u32 expire time
16 byte MAC
4 byte ip address
u32 expire time
.
etc.
example: hexdump udhcpd.leases
0000000 1000 c95a 27d9 0000 0000 0000 0000 0000
0000010 a8c0 150a 0d00 2d29 5000 23fc 8566 0000
0000020 0000 0000 0000 0000 a8c0 140a 0d00 4e29
0000030
udhcpd.conf
----------
The format is fairly simple, there is a sample file with all the
available options and comments describing them in samples/udhcpd.conf
compile time options
-------------------
dhcpd.h contains the other two compile time options:
LEASE_TIME: The default lease time if not specified in the config
file.
DHCPD_CONFIG_FILE: The defualt config file to use.

View File

@ -1,17 +1,14 @@
TODO TODO
---- ----
+ Integrade README.*'s with manpages
+ using time(0) breaks if the system clock changes, find a portable solution
+ make failure of reading functions revert to previous value, not the default + make failure of reading functions revert to previous value, not the default
+ sanity code for option[OPT_LEN] + sanity code for option[OPT_LEN]
+ fix aliasing (ie: eth0:0) + fix aliasing (ie: eth0:0)
+ DONE: Make sure get_raw_packet only accepts packets on the specified interface
+ better standard linux distro support + better standard linux distro support
+ DONE: make config file a command line option for server
+ IMPLEMENTED: make forking a command line option
+ make sure packet generation works on a wide varitey of arches + make sure packet generation works on a wide varitey of arches
+ Interoperability testing + Interoperability testing
+ Hooks within the DHCP server + Hooks within the DHCP server
+ Additional bootp support in client/server + Additional bootp support in client/server
+ Make serverid option in server configurable + Make serverid option in server configurable
+ DONE: cause client to generate DHCP_VENDOR option
+ Possibly add failure message to DHCP NAK + Possibly add failure message to DHCP NAK
+ Possibly log DHCP NAK failure message in client

View File

@ -35,6 +35,10 @@
#include <unistd.h> #include <unistd.h>
#include <netinet/in.h> #include <netinet/in.h>
#include <arpa/inet.h> #include <arpa/inet.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "dhcpd.h" #include "dhcpd.h"
@ -49,7 +53,17 @@ unsigned long random_xid(void)
{ {
static int initialized; static int initialized;
if (!initialized) { if (!initialized) {
srand(time(0)); int fd;
unsigned long seed;
fd = open("/dev/urandom", 0);
if (fd < 0 || read(fd, &seed, sizeof(seed)) < 0) {
LOG(LOG_WARNING, "Could not load seed from /dev/urandom: %s",
strerror(errno));
seed = time(0);
}
if (fd >= 0) close(fd);
srand(seed);
initialized++; initialized++;
} }
return rand(); return rand();

View File

@ -118,14 +118,14 @@ static void perform_renew(void)
{ {
LOG(LOG_INFO, "Performing a DHCP renew"); LOG(LOG_INFO, "Performing a DHCP renew");
switch (state) { switch (state) {
case RENEWING:
run_script(NULL, "deconfig");
case BOUND: case BOUND:
case REBINDING:
change_mode(LISTEN_KERNEL); change_mode(LISTEN_KERNEL);
case RENEWING:
case REBINDING:
state = RENEW_REQUESTED; state = RENEW_REQUESTED;
break; break;
case RENEW_REQUESTED: case RENEW_REQUESTED: /* impatient are we? fine, square 1 */
run_script(NULL, "deconfig");
case REQUESTING: case REQUESTING:
case RELEASED: case RELEASED:
change_mode(LISTEN_RAW); change_mode(LISTEN_RAW);
@ -387,6 +387,7 @@ int main(int argc, char *argv[])
packet_num++; packet_num++;
} else { } else {
/* timed out, go back to init state */ /* timed out, go back to init state */
if (state == RENEW_REQUESTED) run_script(NULL, "deconfig");
state = INIT_SELECTING; state = INIT_SELECTING;
timeout = now; timeout = now;
packet_num = 0; packet_num = 0;