sync to udhcp 0.9.8
diff --git a/networking/udhcp/ChangeLog b/networking/udhcp/ChangeLog
index 9c269d8..34cfe16 100644
--- a/networking/udhcp/ChangeLog
+++ b/networking/udhcp/ChangeLog
@@ -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
(Glenn McGrath <bug1@optushome.com.au> as well as myself)
+ updated client manpage (me)
diff --git a/networking/udhcp/README b/networking/udhcp/README
index d3e5e3f..5f4bb78 100644
--- a/networking/udhcp/README
+++ b/networking/udhcp/README
@@ -5,155 +5,6 @@
systems. It does however, strive to be fully functional, and RFC
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
-------------------
@@ -185,6 +36,7 @@
code: The DHCP code for this option
+
busybox drop-in
--------------
udhcp is now a drop-in component for busybox (http://busybox.net).
@@ -195,3 +47,4 @@
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.
+
diff --git a/networking/udhcp/README.dumpleases b/networking/udhcp/README.dumpleases
new file mode 100644
index 0000000..6367710
--- /dev/null
+++ b/networking/udhcp/README.dumpleases
@@ -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.
+
diff --git a/networking/udhcp/README.udhcpc b/networking/udhcp/README.udhcpc
new file mode 100644
index 0000000..3591605
--- /dev/null
+++ b/networking/udhcp/README.udhcpc
@@ -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
+
diff --git a/networking/udhcp/README.udhcpd b/networking/udhcp/README.udhcpd
new file mode 100644
index 0000000..bc6137d
--- /dev/null
+++ b/networking/udhcp/README.udhcpd
@@ -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.
diff --git a/networking/udhcp/TODO b/networking/udhcp/TODO
index 47e4512..f88694a 100644
--- a/networking/udhcp/TODO
+++ b/networking/udhcp/TODO
@@ -1,17 +1,14 @@
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
+ sanity code for option[OPT_LEN]
+ fix aliasing (ie: eth0:0)
-+ DONE: Make sure get_raw_packet only accepts packets on the specified interface
+ 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
+ Interoperability testing
+ Hooks within the DHCP server
+ Additional bootp support in client/server
+ Make serverid option in server configurable
-+ DONE: cause client to generate DHCP_VENDOR option
+ Possibly add failure message to DHCP NAK
-+ Possibly log DHCP NAK failure message in client
\ No newline at end of file
diff --git a/networking/udhcp/clientpacket.c b/networking/udhcp/clientpacket.c
index ecbd795..86faec9 100644
--- a/networking/udhcp/clientpacket.c
+++ b/networking/udhcp/clientpacket.c
@@ -35,6 +35,10 @@
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
#include "dhcpd.h"
@@ -49,7 +53,17 @@
{
static int 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++;
}
return rand();
diff --git a/networking/udhcp/dhcpc.c b/networking/udhcp/dhcpc.c
index ae40ec9..295486c 100644
--- a/networking/udhcp/dhcpc.c
+++ b/networking/udhcp/dhcpc.c
@@ -118,14 +118,14 @@
{
LOG(LOG_INFO, "Performing a DHCP renew");
switch (state) {
- case RENEWING:
- run_script(NULL, "deconfig");
case BOUND:
- case REBINDING:
change_mode(LISTEN_KERNEL);
+ case RENEWING:
+ case REBINDING:
state = RENEW_REQUESTED;
break;
- case RENEW_REQUESTED:
+ case RENEW_REQUESTED: /* impatient are we? fine, square 1 */
+ run_script(NULL, "deconfig");
case REQUESTING:
case RELEASED:
change_mode(LISTEN_RAW);
@@ -387,6 +387,7 @@
packet_num++;
} else {
/* timed out, go back to init state */
+ if (state == RENEW_REQUESTED) run_script(NULL, "deconfig");
state = INIT_SELECTING;
timeout = now;
packet_num = 0;