Commit Message
For details see:
https://kb.isc.org/article/AA-01571/82/DHCP-4.4.1-Release-Notes.html
This closes https://bugzilla.ipfire.org/show_bug.cgi?id=11697 and
https://bugzilla.ipfire.org/show_bug.cgi?id=11293, hopefully.
This update required some changes as described in:
https://bugzilla.ipfire.org/show_bug.cgi?id=11697#c6
Best,
Matthias
Signed-off-by: Matthias Fischer <matthias.fischer@ipfire.org>
---
config/rootfiles/common/dhcp | 4 +-
lfs/dhcp | 39 +-
.../dhcp/dhcp-64_bit_lease_parse.patch | 75 ---
src/patches/dhcp/dhcp-CLOEXEC.patch | 342 ----------
src/patches/dhcp/dhcp-PPP.patch | 150 -----
src/patches/dhcp/dhcp-UseMulticast.patch | 241 --------
.../dhcp/dhcp-add_timeout_when_NULL.patch | 14 -
src/patches/dhcp/dhcp-capability.patch | 250 --------
.../dhcp/dhcp-default-requested-options.patch | 44 --
.../dhcp/dhcp-dhclient-decline-backoff.patch | 63 --
src/patches/dhcp/dhcp-dhclient-options.patch | 509 ---------------
src/patches/dhcp/dhcp-errwarn-message.patch | 22 -
src/patches/dhcp/dhcp-garbage-chars.patch | 12 -
src/patches/dhcp/dhcp-gpxe-cid.patch | 73 ---
src/patches/dhcp/dhcp-honor-expired.patch | 49 --
src/patches/dhcp/dhcp-improved-xid.patch | 138 -----
src/patches/dhcp/dhcp-logpid.patch | 11 -
src/patches/dhcp/dhcp-lpf-ib.patch | 585 ------------------
src/patches/dhcp/dhcp-manpages.patch | 157 -----
src/patches/dhcp/dhcp-paranoia.patch | 156 -----
src/patches/dhcp/dhcp-paths.patch | 44 --
src/patches/dhcp/dhcp-release-by-ifup.patch | 85 ---
src/patches/dhcp/dhcp-remove-bind.patch | 192 ------
...dhcp-rfc3442-classless-static-routes.patch | 405 ------------
src/patches/dhcp/dhcp-sendDecline.patch | 231 -------
src/patches/dhcp/dhcp-sharedlib.patch | 107 ----
.../dhcp/dhcp-stateless-DUID-LLT.patch | 48 --
src/patches/dhcp/dhcp-unicast-bootp.patch | 101 ---
src/patches/dhcp/dhcp-xen-checksum.patch | 251 --------
29 files changed, 7 insertions(+), 4391 deletions(-)
delete mode 100644 src/patches/dhcp/dhcp-64_bit_lease_parse.patch
delete mode 100644 src/patches/dhcp/dhcp-CLOEXEC.patch
delete mode 100644 src/patches/dhcp/dhcp-PPP.patch
delete mode 100644 src/patches/dhcp/dhcp-UseMulticast.patch
delete mode 100644 src/patches/dhcp/dhcp-add_timeout_when_NULL.patch
delete mode 100644 src/patches/dhcp/dhcp-capability.patch
delete mode 100644 src/patches/dhcp/dhcp-default-requested-options.patch
delete mode 100644 src/patches/dhcp/dhcp-dhclient-decline-backoff.patch
delete mode 100644 src/patches/dhcp/dhcp-dhclient-options.patch
delete mode 100644 src/patches/dhcp/dhcp-errwarn-message.patch
delete mode 100644 src/patches/dhcp/dhcp-garbage-chars.patch
delete mode 100644 src/patches/dhcp/dhcp-gpxe-cid.patch
delete mode 100644 src/patches/dhcp/dhcp-honor-expired.patch
delete mode 100644 src/patches/dhcp/dhcp-improved-xid.patch
delete mode 100644 src/patches/dhcp/dhcp-logpid.patch
delete mode 100644 src/patches/dhcp/dhcp-lpf-ib.patch
delete mode 100644 src/patches/dhcp/dhcp-manpages.patch
delete mode 100644 src/patches/dhcp/dhcp-paranoia.patch
delete mode 100644 src/patches/dhcp/dhcp-paths.patch
delete mode 100644 src/patches/dhcp/dhcp-release-by-ifup.patch
delete mode 100644 src/patches/dhcp/dhcp-remove-bind.patch
delete mode 100644 src/patches/dhcp/dhcp-rfc3442-classless-static-routes.patch
delete mode 100644 src/patches/dhcp/dhcp-sendDecline.patch
delete mode 100644 src/patches/dhcp/dhcp-sharedlib.patch
delete mode 100644 src/patches/dhcp/dhcp-stateless-DUID-LLT.patch
delete mode 100644 src/patches/dhcp/dhcp-unicast-bootp.patch
delete mode 100644 src/patches/dhcp/dhcp-xen-checksum.patch
Comments
Hi,
okay. Let's wait until we hear back from the testers.
Are you sure that dropping the big patchset doesn't cause us any problems?
Best,
-Michael
On Mon, 2018-04-30 at 15:07 +0200, Matthias Fischer wrote:
> For details see:
> https://kb.isc.org/article/AA-01571/82/DHCP-4.4.1-Release-Notes.html
>
> This closes https://bugzilla.ipfire.org/show_bug.cgi?id=11697 and
> https://bugzilla.ipfire.org/show_bug.cgi?id=11293, hopefully.
>
> This update required some changes as described in:
> https://bugzilla.ipfire.org/show_bug.cgi?id=11697#c6
>
> Best,
> Matthias
>
> Signed-off-by: Matthias Fischer <matthias.fischer@ipfire.org>
> ---
> config/rootfiles/common/dhcp | 4 +-
> lfs/dhcp | 39 +-
> .../dhcp/dhcp-64_bit_lease_parse.patch | 75 ---
> src/patches/dhcp/dhcp-CLOEXEC.patch | 342 ----------
> src/patches/dhcp/dhcp-PPP.patch | 150 -----
> src/patches/dhcp/dhcp-UseMulticast.patch | 241 --------
> .../dhcp/dhcp-add_timeout_when_NULL.patch | 14 -
> src/patches/dhcp/dhcp-capability.patch | 250 --------
> .../dhcp/dhcp-default-requested-options.patch | 44 --
> .../dhcp/dhcp-dhclient-decline-backoff.patch | 63 --
> src/patches/dhcp/dhcp-dhclient-options.patch | 509 ---------------
> src/patches/dhcp/dhcp-errwarn-message.patch | 22 -
> src/patches/dhcp/dhcp-garbage-chars.patch | 12 -
> src/patches/dhcp/dhcp-gpxe-cid.patch | 73 ---
> src/patches/dhcp/dhcp-honor-expired.patch | 49 --
> src/patches/dhcp/dhcp-improved-xid.patch | 138 -----
> src/patches/dhcp/dhcp-logpid.patch | 11 -
> src/patches/dhcp/dhcp-lpf-ib.patch | 585 ------------------
> src/patches/dhcp/dhcp-manpages.patch | 157 -----
> src/patches/dhcp/dhcp-paranoia.patch | 156 -----
> src/patches/dhcp/dhcp-paths.patch | 44 --
> src/patches/dhcp/dhcp-release-by-ifup.patch | 85 ---
> src/patches/dhcp/dhcp-remove-bind.patch | 192 ------
> ...dhcp-rfc3442-classless-static-routes.patch | 405 ------------
> src/patches/dhcp/dhcp-sendDecline.patch | 231 -------
> src/patches/dhcp/dhcp-sharedlib.patch | 107 ----
> .../dhcp/dhcp-stateless-DUID-LLT.patch | 48 --
> src/patches/dhcp/dhcp-unicast-bootp.patch | 101 ---
> src/patches/dhcp/dhcp-xen-checksum.patch | 251 --------
> 29 files changed, 7 insertions(+), 4391 deletions(-)
> delete mode 100644 src/patches/dhcp/dhcp-64_bit_lease_parse.patch
> delete mode 100644 src/patches/dhcp/dhcp-CLOEXEC.patch
> delete mode 100644 src/patches/dhcp/dhcp-PPP.patch
> delete mode 100644 src/patches/dhcp/dhcp-UseMulticast.patch
> delete mode 100644 src/patches/dhcp/dhcp-add_timeout_when_NULL.patch
> delete mode 100644 src/patches/dhcp/dhcp-capability.patch
> delete mode 100644 src/patches/dhcp/dhcp-default-requested-options.patch
> delete mode 100644 src/patches/dhcp/dhcp-dhclient-decline-backoff.patch
> delete mode 100644 src/patches/dhcp/dhcp-dhclient-options.patch
> delete mode 100644 src/patches/dhcp/dhcp-errwarn-message.patch
> delete mode 100644 src/patches/dhcp/dhcp-garbage-chars.patch
> delete mode 100644 src/patches/dhcp/dhcp-gpxe-cid.patch
> delete mode 100644 src/patches/dhcp/dhcp-honor-expired.patch
> delete mode 100644 src/patches/dhcp/dhcp-improved-xid.patch
> delete mode 100644 src/patches/dhcp/dhcp-logpid.patch
> delete mode 100644 src/patches/dhcp/dhcp-lpf-ib.patch
> delete mode 100644 src/patches/dhcp/dhcp-manpages.patch
> delete mode 100644 src/patches/dhcp/dhcp-paranoia.patch
> delete mode 100644 src/patches/dhcp/dhcp-paths.patch
> delete mode 100644 src/patches/dhcp/dhcp-release-by-ifup.patch
> delete mode 100644 src/patches/dhcp/dhcp-remove-bind.patch
> delete mode 100644 src/patches/dhcp/dhcp-rfc3442-classless-static-
> routes.patch
> delete mode 100644 src/patches/dhcp/dhcp-sendDecline.patch
> delete mode 100644 src/patches/dhcp/dhcp-sharedlib.patch
> delete mode 100644 src/patches/dhcp/dhcp-stateless-DUID-LLT.patch
> delete mode 100644 src/patches/dhcp/dhcp-unicast-bootp.patch
> delete mode 100644 src/patches/dhcp/dhcp-xen-checksum.patch
>
> diff --git a/config/rootfiles/common/dhcp b/config/rootfiles/common/dhcp
> index ff225a571..9e6d52e4e 100644
> --- a/config/rootfiles/common/dhcp
> +++ b/config/rootfiles/common/dhcp
> @@ -5,8 +5,6 @@ etc/dhcp/dhcpd.conf
> #usr/bin/omshell
> #usr/include/dhcpctl
> #usr/include/dhcpctl/dhcpctl.h
> -#usr/include/isc-dhcp
> -#usr/include/isc-dhcp/dst.h
> #usr/include/omapip
> #usr/include/omapip/alloc.h
> #usr/include/omapip/buffer.h
> @@ -17,8 +15,8 @@ etc/dhcp/dhcpd.conf
> #usr/include/omapip/omapip_p.h
> #usr/include/omapip/result.h
> #usr/include/omapip/trace.h
> +#usr/lib/libdhcp.a
> #usr/lib/libdhcpctl.a
> -#usr/lib/libdst.a
> #usr/lib/libomapi.a
> #usr/sbin/dhclient
> usr/sbin/dhcpd
> diff --git a/lfs/dhcp b/lfs/dhcp
> index 262a25129..a055d6081 100644
> --- a/lfs/dhcp
> +++ b/lfs/dhcp
> @@ -1,7 +1,7 @@
> #############################################################################
> ##
> #
> #
> # IPFire.org - A linux based
> firewall #
> -# Copyright (C) 2007-2015 IPFire Team <info@ipfire.org>
> #
> +# Copyright (C) 2007-2018 IPFire Team <info@ipfire.org>
> #
> #
> #
> # This program is free software: you can redistribute it and/or
> modify #
> # it under the terms of the GNU General Public License as published
> by #
> @@ -24,7 +24,7 @@
>
> include Config
>
> -VER = 4.3.1
> +VER = 4.4.1
>
> THISAPP = dhcp-$(VER)
> DL_FILE = $(THISAPP).tar.gz
> @@ -40,7 +40,7 @@ objects = $(DL_FILE)
>
> $(DL_FILE) = $(DL_FROM)/$(DL_FILE)
>
> -$(DL_FILE)_MD5 = b3a42ece3c7f2cd2e74a3e12ca881d20
> +$(DL_FILE)_MD5 = 18c7f4dcbb0a63df25098216d47b1ede
>
> install : $(TARGET)
>
> @@ -71,47 +71,20 @@ $(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
> @$(PREBUILD)
> @rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar zxf $(DIR_DL)/$(DL_FILE)
>
> - cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-
> remove-bind.patch
> - cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-
> errwarn-message.patch
> - cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-
> dhclient-options.patch
> - cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-
> release-by-ifup.patch
> - cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-
> dhclient-decline-backoff.patch
> - cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-
> unicast-bootp.patch
> - cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-
> default-requested-options.patch
> - cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-xen-
> checksum.patch
> - cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-
> manpages.patch
> - cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-
> paths.patch
> - cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-
> CLOEXEC.patch
> - cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-
> garbage-chars.patch
> - cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-
> add_timeout_when_NULL.patch
> - cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-
> 64_bit_lease_parse.patch
> - cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-
> capability.patch
> - cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-
> logpid.patch
> - cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-
> UseMulticast.patch
> - cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-
> sendDecline.patch
> - cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-
> rfc3442-classless-static-routes.patch
> - cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-honor-
> expired.patch
> - cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-
> sharedlib.patch
> - cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-
> PPP.patch
> - cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-
> paranoia.patch
> - cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-lpf-
> ib.patch
> - cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-
> improved-xid.patch
> - cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-gpxe-
> cid.patch
> - cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-
> stateless-DUID-LLT.patch
> -
> # Help unpacking bundled BIND
> - cd $(DIR_APP) && sed -e "s/gunzip -c/&d/" -i bind/Makefile
> + cd $(DIR_APP) && sed -e "s/gunzip -c/&d/" -i bind/Makefile.in
>
> cd $(DIR_APP) && \
> ./configure \
> --prefix=/usr \
> --sysconfdir=/etc/dhcp \
> + --with-srv-conf-file=/etc/dhcp/dhcpd.conf \
> --with-srv-lease-file=/var/state/dhcp/dhcpd.leases \
> --enable-paranoia \
> --enable-early-chroot \
> --disable-dhcpv6
>
> - cd $(DIR_APP) && make $(MAKETUNING)
> + cd $(DIR_APP) && make
> cd $(DIR_APP) && make install
>
> mkdir -pv /var/state/dhcp
> diff --git a/src/patches/dhcp/dhcp-64_bit_lease_parse.patch
> b/src/patches/dhcp/dhcp-64_bit_lease_parse.patch
> deleted file mode 100644
> index a07b5b032..000000000
> --- a/src/patches/dhcp/dhcp-64_bit_lease_parse.patch
> +++ /dev/null
> @@ -1,75 +0,0 @@
> -diff -up dhcp-4.3.0a1/common/parse.c.64-bit_lease_parse dhcp-
> 4.3.0a1/common/parse.c
> ---- dhcp-4.3.0a1/common/parse.c.64-bit_lease_parse 2013-12-11
> 01:25:12.000000000 +0100
> -+++ dhcp-4.3.0a1/common/parse.c 2013-12-19 15:45:25.990771814 +0100
> -@@ -938,8 +938,8 @@ TIME
> - parse_date_core(cfile)
> - struct parse *cfile;
> - {
> -- int guess;
> -- int tzoff, year, mon, mday, hour, min, sec;
> -+ TIME guess;
> -+ long int tzoff, year, mon, mday, hour, min, sec;
> - const char *val;
> - enum dhcp_token token;
> - static int months[11] = { 31, 59, 90, 120, 151, 181,
> -@@ -965,7 +965,7 @@ parse_date_core(cfile)
> - }
> -
> - skip_token(&val, NULL, cfile); /* consume number */
> -- guess = atoi(val);
> -+ guess = atol(val);
> -
> - return((TIME)guess);
> - }
> -@@ -993,7 +993,7 @@ parse_date_core(cfile)
> - somebody invents a time machine, I think we can safely disregard
> - it. This actually works around a stupid Y2K bug that was
> present
> - in a very early beta release of dhcpd. */
> -- year = atoi(val);
> -+ year = atol(val);
> - if (year > 1900)
> - year -= 1900;
> -
> -@@ -1039,7 +1039,7 @@ parse_date_core(cfile)
> - return((TIME)0);
> - }
> - skip_token(&val, NULL, cfile); /* consume day of month */
> -- mday = atoi(val);
> -+ mday = atol(val);
> -
> - /* Hour... */
> - token = peek_token(&val, NULL, cfile);
> -@@ -1050,7 +1050,7 @@ parse_date_core(cfile)
> - return((TIME)0);
> - }
> - skip_token(&val, NULL, cfile); /* consume hour */
> -- hour = atoi(val);
> -+ hour = atol(val);
> -
> - /* Colon separating hour from minute... */
> - token = peek_token(&val, NULL, cfile);
> -@@ -1072,7 +1072,7 @@ parse_date_core(cfile)
> - return((TIME)0);
> - }
> - skip_token(&val, NULL, cfile); /* consume minute */
> -- min = atoi(val);
> -+ min = atol(val);
> -
> - /* Colon separating minute from second... */
> - token = peek_token(&val, NULL, cfile);
> -@@ -1094,13 +1094,13 @@ parse_date_core(cfile)
> - return((TIME)0);
> - }
> - skip_token(&val, NULL, cfile); /* consume second */
> -- sec = atoi(val);
> -+ sec = atol(val);
> -
> - tzoff = 0;
> - token = peek_token(&val, NULL, cfile);
> - if (token == NUMBER) {
> - skip_token(&val, NULL, cfile); /* consume tzoff */
> -- tzoff = atoi(val);
> -+ tzoff = atol(val);
> - } else if (token != SEMI) {
> - skip_token(&val, NULL, cfile);
> - parse_warn(cfile,
> diff --git a/src/patches/dhcp/dhcp-CLOEXEC.patch b/src/patches/dhcp/dhcp-
> CLOEXEC.patch
> deleted file mode 100644
> index 722865e4f..000000000
> --- a/src/patches/dhcp/dhcp-CLOEXEC.patch
> +++ /dev/null
> @@ -1,342 +0,0 @@
> -diff -up dhcp-4.3.0a1/client/clparse.c.cloexec dhcp-4.3.0a1/client/clparse.c
> ---- dhcp-4.3.0a1/client/clparse.c.cloexec 2013-12-19
> 15:34:41.638886256 +0100
> -+++ dhcp-4.3.0a1/client/clparse.c 2013-12-19 15:34:41.657885985 +0100
> -@@ -253,7 +253,7 @@ int read_client_conf_file (const char *n
> - int token;
> - isc_result_t status;
> -
> -- if ((file = open (name, O_RDONLY)) < 0)
> -+ if ((file = open (name, O_RDONLY | O_CLOEXEC)) < 0)
> - return uerr2isc (errno);
> -
> - cfile = NULL;
> -@@ -290,7 +290,7 @@ void read_client_leases ()
> -
> - /* Open the lease file. If we can't open it, just return -
> - we can safely trust the server to remember our state. */
> -- if ((file = open (path_dhclient_db, O_RDONLY)) < 0)
> -+ if ((file = open (path_dhclient_db, O_RDONLY | O_CLOEXEC)) < 0)
> - return;
> -
> - cfile = NULL;
> -diff -up dhcp-4.3.0a1/client/dhclient.c.cloexec dhcp-
> 4.3.0a1/client/dhclient.c
> ---- dhcp-4.3.0a1/client/dhclient.c.cloexec 2013-12-19
> 15:34:41.629886384 +0100
> -+++ dhcp-4.3.0a1/client/dhclient.c 2013-12-19 15:36:41.608180467 +0100
> -@@ -148,11 +148,11 @@ main(int argc, char **argv) {
> - /* Make sure that file descriptors 0 (stdin), 1, (stdout), and
> - 2 (stderr) are open. To do this, we assume that when we
> - open a file the lowest available file descriptor is used. */
> -- fd = open("/dev/null", O_RDWR);
> -+ fd = open("/dev/null", O_RDWR | O_CLOEXEC);
> - if (fd == 0)
> -- fd = open("/dev/null", O_RDWR);
> -+ fd = open("/dev/null", O_RDWR | O_CLOEXEC);
> - if (fd == 1)
> -- fd = open("/dev/null", O_RDWR);
> -+ fd = open("/dev/null", O_RDWR | O_CLOEXEC);
> - if (fd == 2)
> - log_perror = 0; /* No sense logging to /dev/null. */
> - else if (fd != -1)
> -@@ -504,7 +504,7 @@ main(int argc, char **argv) {
> - long temp;
> - int e;
> -
> -- if ((pidfd = fopen(path_dhclient_pid, "r")) != NULL) {
> -+ if ((pidfd = fopen(path_dhclient_pid, "re")) != NULL) {
> - e = fscanf(pidfd, "%ld\n", &temp);
> - oldpid = (pid_t)temp;
> -
> -@@ -554,7 +554,7 @@ main(int argc, char **argv) {
> - strncpy(new_path_dhclient_pid,
> path_dhclient_pid, pfx);
> - sprintf(new_path_dhclient_pid + pfx,
> "-%s.pid", ip->name);
> -
> -- if ((pidfd =
> fopen(new_path_dhclient_pid, "r")) != NULL) {
> -+ if ((pidfd =
> fopen(new_path_dhclient_pid, "re")) != NULL) {
> - e = fscanf(pidfd, "%ld\n",
> &temp);
> - oldpid = (pid_t)temp;
> -
> -@@ -579,7 +579,7 @@ main(int argc, char **argv) {
> - int dhc_running = 0;
> - char procfn[256] = "";
> -
> -- if ((pidfp = fopen(path_dhclient_pid, "r")) != NULL) {
> -+ if ((pidfp = fopen(path_dhclient_pid, "re")) != NULL) {
> - if ((fscanf(pidfp, "%ld", &temp)==1) &&
> ((dhcpid=(pid_t)temp) > 0)) {
> - snprintf(procfn,256,"/proc/%u",dhcpid);
> - dhc_running = (access(procfn, F_OK) == 0);
> -@@ -3077,7 +3077,7 @@ void rewrite_client_leases ()
> -
> - if (leaseFile != NULL)
> - fclose (leaseFile);
> -- leaseFile = fopen (path_dhclient_db, "w");
> -+ leaseFile = fopen (path_dhclient_db, "we");
> - if (leaseFile == NULL) {
> - log_error ("can't create %s: %m", path_dhclient_db);
> - return;
> -@@ -3261,7 +3261,7 @@ write_duid(struct data_string *duid)
> - return DHCP_R_INVALIDARG;
> -
> - if (leaseFile == NULL) { /* XXX? */
> -- leaseFile = fopen(path_dhclient_db, "w");
> -+ leaseFile = fopen(path_dhclient_db, "we");
> - if (leaseFile == NULL) {
> - log_error("can't create %s: %m", path_dhclient_db);
> - return ISC_R_IOERROR;
> -@@ -3441,7 +3441,7 @@ int write_client_lease (client, lease, r
> - return 1;
> -
> - if (leaseFile == NULL) { /* XXX */
> -- leaseFile = fopen (path_dhclient_db, "w");
> -+ leaseFile = fopen (path_dhclient_db, "we");
> - if (leaseFile == NULL) {
> - log_error ("can't create %s: %m", path_dhclient_db);
> - return 0;
> -@@ -3952,9 +3952,9 @@ void go_daemon ()
> - (void) close(2);
> -
> - /* Reopen them on /dev/null. */
> -- (void) open("/dev/null", O_RDWR);
> -- (void) open("/dev/null", O_RDWR);
> -- (void) open("/dev/null", O_RDWR);
> -+ (void) open("/dev/null", O_RDWR | O_CLOEXEC);
> -+ (void) open("/dev/null", O_RDWR | O_CLOEXEC);
> -+ (void) open("/dev/null", O_RDWR | O_CLOEXEC);
> -
> - write_client_pid_file ();
> -
> -@@ -3971,14 +3971,14 @@ void write_client_pid_file ()
> - return;
> - }
> -
> -- pfdesc = open (path_dhclient_pid, O_CREAT | O_TRUNC | O_WRONLY,
> 0644);
> -+ pfdesc = open (path_dhclient_pid, O_CREAT | O_TRUNC | O_WRONLY |
> O_CLOEXEC, 0644);
> -
> - if (pfdesc < 0) {
> - log_error ("Can't create %s: %m", path_dhclient_pid);
> - return;
> - }
> -
> -- pf = fdopen (pfdesc, "w");
> -+ pf = fdopen (pfdesc, "we");
> - if (!pf) {
> - close(pfdesc);
> - log_error ("Can't fdopen %s: %m", path_dhclient_pid);
> -diff -up dhcp-4.3.0a1/common/bpf.c.cloexec dhcp-4.3.0a1/common/bpf.c
> ---- dhcp-4.3.0a1/common/bpf.c.cloexec 2013-12-19 15:34:41.640886227
> +0100
> -+++ dhcp-4.3.0a1/common/bpf.c 2013-12-19 15:34:41.661885928 +0100
> -@@ -95,7 +95,7 @@ int if_register_bpf (info)
> - for (b = 0; 1; b++) {
> - /* %Audit% 31 bytes max. %2004.06.17,Safe% */
> - sprintf(filename, BPF_FORMAT, b);
> -- sock = open (filename, O_RDWR, 0);
> -+ sock = open (filename, O_RDWR | O_CLOEXEC, 0);
> - if (sock < 0) {
> - if (errno == EBUSY) {
> - continue;
> -diff -up dhcp-4.3.0a1/common/dlpi.c.cloexec dhcp-4.3.0a1/common/dlpi.c
> ---- dhcp-4.3.0a1/common/dlpi.c.cloexec 2013-12-19 15:34:41.641886213
> +0100
> -+++ dhcp-4.3.0a1/common/dlpi.c 2013-12-19 15:34:41.662885914 +0100
> -@@ -804,7 +804,7 @@ dlpiopen(const char *ifname) {
> - }
> - *dp = '\0';
> -
> -- return open (devname, O_RDWR, 0);
> -+ return open (devname, O_RDWR | O_CLOEXEC, 0);
> - }
> -
> - /*
> -diff -up dhcp-4.3.0a1/common/nit.c.cloexec dhcp-4.3.0a1/common/nit.c
> ---- dhcp-4.3.0a1/common/nit.c.cloexec 2013-12-19 15:34:41.642886199
> +0100
> -+++ dhcp-4.3.0a1/common/nit.c 2013-12-19 15:34:41.662885914 +0100
> -@@ -81,7 +81,7 @@ int if_register_nit (info)
> - struct strioctl sio;
> -
> - /* Open a NIT device */
> -- sock = open ("/dev/nit", O_RDWR);
> -+ sock = open ("/dev/nit", O_RDWR | O_CLOEXEC);
> - if (sock < 0)
> - log_fatal ("Can't open NIT device for %s: %m", info ->
> name);
> -
> -diff -up dhcp-4.3.0a1/common/resolv.c.cloexec dhcp-4.3.0a1/common/resolv.c
> ---- dhcp-4.3.0a1/common/resolv.c.cloexec 2013-12-11 01:25:12.000000000
> +0100
> -+++ dhcp-4.3.0a1/common/resolv.c 2013-12-19 15:34:41.663885900 +0100
> -@@ -50,7 +50,7 @@ void read_resolv_conf (parse_time)
> - struct domain_search_list *dp, *dl, *nd;
> - isc_result_t status;
> -
> -- if ((file = open (path_resolv_conf, O_RDONLY)) < 0) {
> -+ if ((file = open (path_resolv_conf, O_RDONLY | O_CLOEXEC)) < 0) {
> - log_error ("Can't open %s: %m", path_resolv_conf);
> - return;
> - }
> -diff -up dhcp-4.3.0a1/common/upf.c.cloexec dhcp-4.3.0a1/common/upf.c
> ---- dhcp-4.3.0a1/common/upf.c.cloexec 2013-12-19 15:34:41.642886199
> +0100
> -+++ dhcp-4.3.0a1/common/upf.c 2013-12-19 15:34:41.663885900 +0100
> -@@ -77,7 +77,7 @@ int if_register_upf (info)
> - /* %Audit% Cannot exceed 36 bytes. %2004.06.17,Safe% */
> - sprintf(filename, "/dev/pf/pfilt%d", b);
> -
> -- sock = open (filename, O_RDWR, 0);
> -+ sock = open (filename, O_RDWR | O_CLOEXEC, 0);
> - if (sock < 0) {
> - if (errno == EBUSY) {
> - continue;
> -diff -up dhcp-4.3.0a1/omapip/trace.c.cloexec dhcp-4.3.0a1/omapip/trace.c
> ---- dhcp-4.3.0a1/omapip/trace.c.cloexec 2013-12-11 01:01:03.000000000
> +0100
> -+++ dhcp-4.3.0a1/omapip/trace.c 2013-12-19 15:34:41.663885900 +0100
> -@@ -142,10 +142,10 @@ isc_result_t trace_begin (const char *fi
> - return DHCP_R_INVALIDARG;
> - }
> -
> -- traceoutfile = open (filename, O_CREAT | O_WRONLY | O_EXCL, 0600);
> -+ traceoutfile = open (filename, O_CREAT | O_WRONLY | O_EXCL |
> O_CLOEXEC, 0600);
> - if (traceoutfile < 0 && errno == EEXIST) {
> - log_error ("WARNING: Overwriting trace file \"%s\"",
> filename);
> -- traceoutfile = open (filename, O_WRONLY | O_EXCL | O_TRUNC,
> -+ traceoutfile = open (filename, O_WRONLY | O_EXCL | O_TRUNC |
> O_CLOEXEC,
> - 0600);
> - }
> -
> -@@ -433,7 +433,7 @@ void trace_file_replay (const char *file
> - isc_result_t result;
> - int len;
> -
> -- traceinfile = fopen (filename, "r");
> -+ traceinfile = fopen (filename, "re");
> - if (!traceinfile) {
> - log_error("Can't open tracefile %s: %m", filename);
> - return;
> -diff -up dhcp-4.3.0a1/relay/dhcrelay.c.cloexec dhcp-4.3.0a1/relay/dhcrelay.c
> ---- dhcp-4.3.0a1/relay/dhcrelay.c.cloexec 2013-12-13
> 22:26:21.000000000 +0100
> -+++ dhcp-4.3.0a1/relay/dhcrelay.c 2013-12-19 15:34:41.664885886 +0100
> -@@ -193,11 +193,11 @@ main(int argc, char **argv) {
> - /* Make sure that file descriptors 0(stdin), 1,(stdout), and
> - 2(stderr) are open. To do this, we assume that when we
> - open a file the lowest available file descriptor is used. */
> -- fd = open("/dev/null", O_RDWR);
> -+ fd = open("/dev/null", O_RDWR | O_CLOEXEC);
> - if (fd == 0)
> -- fd = open("/dev/null", O_RDWR);
> -+ fd = open("/dev/null", O_RDWR | O_CLOEXEC);
> - if (fd == 1)
> -- fd = open("/dev/null", O_RDWR);
> -+ fd = open("/dev/null", O_RDWR | O_CLOEXEC);
> - if (fd == 2)
> - log_perror = 0; /* No sense logging to /dev/null. */
> - else if (fd != -1)
> -@@ -564,13 +564,13 @@ main(int argc, char **argv) {
> -
> - if (no_pid_file == ISC_FALSE) {
> - pfdesc = open(path_dhcrelay_pid,
> -- O_CREAT | O_TRUNC | O_WRONLY, 0644);
> -+ O_CREAT | O_TRUNC | O_WRONLY |
> O_CLOEXEC, 0644);
> -
> - if (pfdesc < 0) {
> - log_error("Can't create %s: %m",
> - path_dhcrelay_pid);
> - } else {
> -- pf = fdopen(pfdesc, "w");
> -+ pf = fdopen(pfdesc, "we");
> - if (!pf)
> - log_error("Can't fdopen %s: %m",
> - path_dhcrelay_pid);
> -diff -up dhcp-4.3.0a1/server/confpars.c.cloexec dhcp-
> 4.3.0a1/server/confpars.c
> ---- dhcp-4.3.0a1/server/confpars.c.cloexec 2013-12-11
> 01:25:12.000000000 +0100
> -+++ dhcp-4.3.0a1/server/confpars.c 2013-12-19 15:34:41.665885871 +0100
> -@@ -117,7 +117,7 @@ isc_result_t read_conf_file (const char
> - }
> - #endif
> -
> -- if ((file = open (filename, O_RDONLY)) < 0) {
> -+ if ((file = open (filename, O_RDONLY | O_CLOEXEC)) < 0) {
> - if (leasep) {
> - log_error ("Can't open lease database %s: %m --",
> - path_dhcpd_db);
> -diff -up dhcp-4.3.0a1/server/db.c.cloexec dhcp-4.3.0a1/server/db.c
> ---- dhcp-4.3.0a1/server/db.c.cloexec 2013-12-11 01:25:12.000000000
> +0100
> -+++ dhcp-4.3.0a1/server/db.c 2013-12-19 15:34:41.666885857 +0100
> -@@ -1081,7 +1081,7 @@ void db_startup (testp)
> - }
> - #endif
> - if (!testp) {
> -- db_file = fopen (path_dhcpd_db, "a");
> -+ db_file = fopen (path_dhcpd_db, "ae");
> - if (!db_file)
> - log_fatal ("Can't open %s for append.",
> path_dhcpd_db);
> - expire_all_pools ();
> -@@ -1129,12 +1129,12 @@ int new_lease_file ()
> - path_dhcpd_db, (int)t) >= sizeof newfname)
> - log_fatal("new_lease_file: lease file path too long");
> -
> -- db_fd = open (newfname, O_WRONLY | O_TRUNC | O_CREAT, 0664);
> -+ db_fd = open (newfname, O_WRONLY | O_TRUNC | O_CREAT | O_CLOEXEC,
> 0664);
> - if (db_fd < 0) {
> - log_error ("Can't create new lease file: %m");
> - return 0;
> - }
> -- if ((new_db_file = fdopen(db_fd, "w")) == NULL) {
> -+ if ((new_db_file = fdopen(db_fd, "we")) == NULL) {
> - log_error("Can't fdopen new lease file: %m");
> - close(db_fd);
> - goto fdfail;
> -diff -up dhcp-4.3.0a1/server/dhcpd.c.cloexec dhcp-4.3.0a1/server/dhcpd.c
> ---- dhcp-4.3.0a1/server/dhcpd.c.cloexec 2013-12-13 22:26:01.000000000
> +0100
> -+++ dhcp-4.3.0a1/server/dhcpd.c 2013-12-19 15:37:17.258674472 +0100
> -@@ -193,11 +193,11 @@ main(int argc, char **argv) {
> - /* Make sure that file descriptors 0 (stdin), 1, (stdout), and
> - 2 (stderr) are open. To do this, we assume that when we
> - open a file the lowest available file descriptor is used. */
> -- fd = open("/dev/null", O_RDWR);
> -+ fd = open("/dev/null", O_RDWR | O_CLOEXEC);
> - if (fd == 0)
> -- fd = open("/dev/null", O_RDWR);
> -+ fd = open("/dev/null", O_RDWR | O_CLOEXEC);
> - if (fd == 1)
> -- fd = open("/dev/null", O_RDWR);
> -+ fd = open("/dev/null", O_RDWR | O_CLOEXEC);
> - if (fd == 2)
> - log_perror = 0; /* No sense logging to /dev/null. */
> - else if (fd != -1)
> -@@ -716,7 +716,7 @@ main(int argc, char **argv) {
> - */
> - if (no_pid_file == ISC_FALSE) {
> - /*Read previous pid file. */
> -- if ((i = open (path_dhcpd_pid, O_RDONLY)) >= 0) {
> -+ if ((i = open (path_dhcpd_pid, O_RDONLY | O_CLOEXEC)) >= 0)
> {
> - status = read(i, pbuf, (sizeof pbuf) - 1);
> - close (i);
> - if (status > 0) {
> -@@ -735,7 +735,7 @@ main(int argc, char **argv) {
> - }
> -
> - /* Write new pid file. */
> -- i = open(path_dhcpd_pid, O_WRONLY|O_CREAT|O_TRUNC, 0644);
> -+ i = open(path_dhcpd_pid, O_WRONLY|O_CREAT|O_TRUNC|O_CLOEXEC,
> 0644);
> - if (i >= 0) {
> - sprintf(pbuf, "%d\n", (int) getpid());
> - IGNORE_RET (write(i, pbuf, strlen(pbuf)));
> -@@ -763,9 +763,9 @@ main(int argc, char **argv) {
> - (void) close(2);
> -
> - /* Reopen them on /dev/null. */
> -- (void) open("/dev/null", O_RDWR);
> -- (void) open("/dev/null", O_RDWR);
> -- (void) open("/dev/null", O_RDWR);
> -+ (void) open("/dev/null", O_RDWR | O_CLOEXEC);
> -+ (void) open("/dev/null", O_RDWR | O_CLOEXEC);
> -+ (void) open("/dev/null", O_RDWR | O_CLOEXEC);
> - log_perror = 0; /* No sense logging to /dev/null. */
> -
> - IGNORE_RET (chdir("/"));
> -diff -up dhcp-4.3.0a1/server/ldap.c.cloexec dhcp-4.3.0a1/server/ldap.c
> ---- dhcp-4.3.0a1/server/ldap.c.cloexec 2013-12-11 01:25:12.000000000
> +0100
> -+++ dhcp-4.3.0a1/server/ldap.c 2013-12-19 15:34:41.667885843 +0100
> -@@ -684,7 +684,7 @@ ldap_start (void)
> -
> - if (ldap_debug_file != NULL && ldap_debug_fd == -1)
> - {
> -- if ((ldap_debug_fd = open (ldap_debug_file, O_CREAT | O_TRUNC |
> O_WRONLY,
> -+ if ((ldap_debug_fd = open (ldap_debug_file, O_CREAT | O_TRUNC |
> O_WRONLY | O_CLOEXEC,
> - S_IRUSR | S_IWUSR)) < 0)
> - log_error ("Error opening debug LDAP log file %s: %s",
> ldap_debug_file,
> - strerror (errno));
> diff --git a/src/patches/dhcp/dhcp-PPP.patch b/src/patches/dhcp/dhcp-PPP.patch
> deleted file mode 100644
> index 5d022e432..000000000
> --- a/src/patches/dhcp/dhcp-PPP.patch
> +++ /dev/null
> @@ -1,150 +0,0 @@
> -diff -up dhcp-4.3.1b1/client/dhc6.c.mRfpsB dhcp-4.3.1b1/client/dhc6.c
> ---- dhcp-4.3.1b1/client/dhc6.c.mRfpsB 2014-07-10 17:48:03.779424870
> +0200
> -+++ dhcp-4.3.1b1/client/dhc6.c 2014-07-10 17:48:03.795424644 +0200
> -@@ -5088,7 +5088,8 @@ make_client6_options(struct client_state
> - */
> - if ((oc = lookup_option(&dhcpv6_universe, *op,
> - D6O_CLIENTID)) == NULL) {
> -- if (!option_cache(&oc, &default_duid, NULL, clientid_option,
> -+ if (default_duid.len == 0 ||
> -+ !option_cache(&oc, &default_duid, NULL, clientid_option,
> - MDL))
> - log_fatal("Failure assembling a DUID.");
> -
> -diff -up dhcp-4.3.1b1/client/dhclient.c.mRfpsB dhcp-4.3.1b1/client/dhclient.c
> ---- dhcp-4.3.1b1/client/dhclient.c.mRfpsB 2014-07-10
> 17:39:25.853763858 +0200
> -+++ dhcp-4.3.1b1/client/dhclient.c 2014-07-10 17:49:49.882925843 +0200
> -@@ -948,8 +948,8 @@ main(int argc, char **argv) {
> - if (default_duid.buffer != NULL)
> - data_string_forget(&default_duid, MDL);
> -
> -- form_duid(&default_duid, MDL);
> -- write_duid(&default_duid);
> -+ if (form_duid(&default_duid, MDL) == ISC_R_SUCCESS)
> -+ write_duid(&default_duid);
> - }
> - }
> -
> -@@ -3267,7 +3267,7 @@ write_options(struct client_state *clien
> - * is not how it is intended. Upcoming rearchitecting the client should
> - * address this "one daemon model."
> - */
> --void
> -+isc_result_t
> - form_duid(struct data_string *duid, const char *file, int line)
> - {
> - struct interface_info *ip;
> -@@ -3280,6 +3280,15 @@ form_duid(struct data_string *duid, cons
> - if (ip == NULL)
> - log_fatal("Impossible condition at %s:%d.", MDL);
> -
> -+ while (ip && ip->hw_address.hbuf[0] == HTYPE_RESERVED) {
> -+ /* Try the other interfaces */
> -+ log_debug("Cannot form default DUID from interface %s.", ip-
> >name);
> -+ ip = ip->next;
> -+ }
> -+ if (ip == NULL) {
> -+ return ISC_R_UNEXPECTED;
> -+ }
> -+
> - if ((ip->hw_address.hlen == 0) ||
> - (ip->hw_address.hlen > sizeof(ip->hw_address.hbuf)))
> - log_fatal("Impossible hardware address length at %s:%d.",
> MDL);
> -@@ -3323,6 +3332,8 @@ form_duid(struct data_string *duid, cons
> - log_info("Created duid %s.", str);
> - dfree(str, MDL);
> - }
> -+
> -+ return ISC_R_SUCCESS;
> - }
> -
> - /* Write the default DUID to the lease store. */
> -diff -up dhcp-4.3.1b1/common/bpf.c.mRfpsB dhcp-4.3.1b1/common/bpf.c
> ---- dhcp-4.3.1b1/common/bpf.c.mRfpsB 2014-07-10 17:39:25.797764653
> +0200
> -+++ dhcp-4.3.1b1/common/bpf.c 2014-07-10 17:48:03.797424616 +0200
> -@@ -600,6 +600,22 @@ get_hw_addr(const char *name, struct har
> - memcpy(&hw->hbuf[1], LLADDR(sa), sa->sdl_alen);
> - break;
> - #endif /* IFT_FDDI */
> -+#if defined(IFT_PPP)
> -+ case IFT_PPP:
> -+ if (local_family != AF_INET6)
> -+ log_fatal("Unsupported device type %d for
> \"%s\"",
> -+ sa->sdl_type, name);
> -+ hw->hlen = 0;
> -+ hw->hbuf[0] = HTYPE_RESERVED;
> -+ /* 0xdeadbeef should never occur on the wire,
> -+ * and is a signature that something went wrong.
> -+ */
> -+ hw->hbuf[1] = 0xde;
> -+ hw->hbuf[2] = 0xad;
> -+ hw->hbuf[3] = 0xbe;
> -+ hw->hbuf[4] = 0xef;
> -+ break;
> -+#endif
> - default:
> - log_fatal("Unsupported device type %d for \"%s\"",
> - sa->sdl_type, name);
> -diff -up dhcp-4.3.1b1/common/lpf.c.mRfpsB dhcp-4.3.1b1/common/lpf.c
> ---- dhcp-4.3.1b1/common/lpf.c.mRfpsB 2014-07-10 17:39:25.744765404
> +0200
> -+++ dhcp-4.3.1b1/common/lpf.c 2014-07-10 17:48:03.797424616 +0200
> -@@ -511,6 +511,22 @@ get_hw_addr(const char *name, struct har
> - hw->hbuf[0] = HTYPE_FDDI;
> - memcpy(&hw->hbuf[1], sa->sa_data, 6);
> - break;
> -+#if defined(ARPHRD_PPP)
> -+ case ARPHRD_PPP:
> -+ if (local_family != AF_INET6)
> -+ log_fatal("Unsupported device type %d for
> \"%s\"",
> -+ sa->sa_family, name);
> -+ hw->hlen = 0;
> -+ hw->hbuf[0] = HTYPE_RESERVED;
> -+ /* 0xdeadbeef should never occur on the wire,
> -+ * and is a signature that something went wrong.
> -+ */
> -+ hw->hbuf[1] = 0xde;
> -+ hw->hbuf[2] = 0xad;
> -+ hw->hbuf[3] = 0xbe;
> -+ hw->hbuf[4] = 0xef;
> -+ break;
> -+#endif
> - default:
> - log_fatal("Unsupported device type %ld for \"%s\"",
> - (long int)sa->sa_family, name);
> -diff -up dhcp-4.3.1b1/includes/dhcpd.h.mRfpsB dhcp-4.3.1b1/includes/dhcpd.h
> ---- dhcp-4.3.1b1/includes/dhcpd.h.mRfpsB 2014-07-10 17:48:03.761425124
> +0200
> -+++ dhcp-4.3.1b1/includes/dhcpd.h 2014-07-10 17:48:03.798424601 +0200
> -@@ -2839,7 +2839,7 @@ void client_dns_remove(struct client_sta
> -
> - void dhcpv4_client_assignments(void);
> - void dhcpv6_client_assignments(void);
> --void form_duid(struct data_string *duid, const char *file, int line);
> -+isc_result_t form_duid(struct data_string *duid, const char *file, int
> line);
> -
> - /* dhc6.c */
> - void dhc6_lease_destroy(struct dhc6_lease **src, const char *file, int
> line);
> -diff -up dhcp-4.3.1b1/includes/dhcp.h.mRfpsB dhcp-4.3.1b1/includes/dhcp.h
> ---- dhcp-4.3.1b1/includes/dhcp.h.mRfpsB 2014-07-10 17:48:03.761425124
> +0200
> -+++ dhcp-4.3.1b1/includes/dhcp.h 2014-07-10 17:48:03.798424601 +0200
> -@@ -81,6 +81,8 @@ struct dhcp_packet {
> - * is no standard for this so we
> - * just steal a type */
> -
> -+#define HTYPE_RESERVED 0 /* RFC 5494 */
> -+
> - /* Magic cookie validating dhcp options field (and bootp vendor
> - extensions field). */
> - #define DHCP_OPTIONS_COOKIE "\143\202\123\143"
> -diff -up dhcp-4.3.1b1/server/dhcpv6.c.mRfpsB dhcp-4.3.1b1/server/dhcpv6.c
> ---- dhcp-4.3.1b1/server/dhcpv6.c.mRfpsB 2014-07-10 17:47:31.464881409
> +0200
> -+++ dhcp-4.3.1b1/server/dhcpv6.c 2014-07-10 17:48:03.800424573 +0200
> -@@ -330,6 +330,9 @@ generate_new_server_duid(void) {
> - if (p->hw_address.hlen > 0) {
> - break;
> - }
> -+ if (p->next == NULL && p->hw_address.hbuf[0] ==
> HTYPE_RESERVED) {
> -+ log_error("Can not generate DUID from interfaces
> which do not have hardware addresses, please configure server-duid!");
> -+ }
> - }
> - if (p == NULL) {
> - return ISC_R_UNEXPECTED;
> diff --git a/src/patches/dhcp/dhcp-UseMulticast.patch b/src/patches/dhcp/dhcp-
> UseMulticast.patch
> deleted file mode 100644
> index ee0ea6b9a..000000000
> --- a/src/patches/dhcp/dhcp-UseMulticast.patch
> +++ /dev/null
> @@ -1,241 +0,0 @@
> -diff -up dhcp-4.3.1b1/server/dhcpv6.c.UseMulticast dhcp-
> 4.3.1b1/server/dhcpv6.c
> ---- dhcp-4.3.1b1/server/dhcpv6.c.UseMulticast 2014-07-02
> 19:58:40.000000000 +0200
> -+++ dhcp-4.3.1b1/server/dhcpv6.c 2014-07-10 18:20:03.066256219 +0200
> -@@ -376,6 +376,48 @@ generate_new_server_duid(void) {
> - }
> -
> - /*
> -+ * Is the D6O_UNICAST option defined in dhcpd.conf ?
> -+ */
> -+static isc_boolean_t unicast_option_defined;
> -+
> -+/*
> -+ * Did we already search dhcpd.conf for D6O_UNICAST option ?
> -+ * We need to store it here to not parse dhcpd.conf repeatedly.
> -+ */
> -+static isc_boolean_t unicast_option_parsed = ISC_FALSE;
> -+
> -+
> -+/*
> -+ * Is the D6O_UNICAST option defined in dhcpd.conf ?
> -+ */
> -+isc_boolean_t
> -+is_unicast_option_defined(void) {
> -+ struct option_state *opt_state;
> -+ struct option_cache *oc;
> -+
> -+ /*
> -+ * If we are looking for the unicast option for the first time
> -+ */
> -+ if (unicast_option_parsed == ISC_FALSE) {
> -+ unicast_option_parsed = ISC_TRUE;
> -+ opt_state = NULL;
> -+ if (!option_state_allocate(&opt_state, MDL)) {
> -+ log_fatal("No memory for option state.");
> -+ }
> -+
> -+ execute_statements_in_scope(NULL, NULL, NULL, NULL, NULL,
> -+ opt_state, &global_scope, root_group, NULL,
> NULL);
> -+
> -+ oc = lookup_option(&dhcpv6_universe, opt_state,
> D6O_UNICAST);
> -+ unicast_option_defined = (oc != NULL);
> -+
> -+ option_state_dereference(&opt_state, MDL);
> -+ }
> -+
> -+ return (unicast_option_defined);
> -+}
> -+
> -+/*
> - * Get the client identifier from the packet.
> - */
> - isc_result_t
> -@@ -706,6 +748,12 @@ static const int required_opts[] = {
> - D6O_PREFERENCE,
> - 0
> - };
> -+static const int required_opts_NAA[] = {
> -+ D6O_CLIENTID,
> -+ D6O_SERVERID,
> -+ D6O_STATUS_CODE,
> -+ 0
> -+};
> - static const int required_opts_solicit[] = {
> - D6O_CLIENTID,
> - D6O_SERVERID,
> -@@ -1587,6 +1635,56 @@ lease_to_client(struct data_string *repl
> - reply.shared->group,
> NULL);
> - }
> -
> -+ /* reject unicast message, unless we set unicast option */
> -+ if ((packet->unicast == ISC_TRUE) && !is_unicast_option_defined())
> -+ /*
> -+ * RFC3315 section 18.2.1 (Request):
> -+ *
> -+ * When the server receives a Request message via unicast from a
> client
> -+ * to which the server has not sent a unicast option, the server
> -+ * discards the Request message and responds with a Reply message
> -+ * containing a Status Code option with the value UseMulticast, a
> Server
> -+ * Identifier option containing the server's DUID, the Client
> Identifier
> -+ * option from the client message, and no other options.
> -+ *
> -+ * Section 18.2.3 (Renew):
> -+ *
> -+ * When the server receives a Renew message via unicast from a
> client to
> -+ * which the server has not sent a unicast option, the server
> discards
> -+ * the Renew message and responds with a Reply message containing a
> -+ * Status Code option with the value UseMulticast, a Server
> Identifier
> -+ * option containing the server's DUID, the Client Identifier option
> -+ * from the client message, and no other options.
> -+ */
> -+ {
> -+ /* Set the UseMulticast status code. */
> -+ if (!set_status_code(STATUS_UseMulticast,
> -+ "Unicast not allowed by server.",
> -+ reply.opt_state)) {
> -+ log_error("lease_to_client: Unable to set "
> -+ "UseMulticast status code.");
> -+ goto exit;
> -+ }
> -+
> -+ /* Rewind the cursor to the start. */
> -+ reply.cursor = REPLY_OPTIONS_INDEX;
> -+
> -+ /*
> -+ * Produce an reply that includes only:
> -+ *
> -+ * Status code.
> -+ * Server DUID.
> -+ * Client DUID.
> -+ */
> -+ reply.cursor += store_options6((char *)reply.buf.data +
> -+ reply.cursor,
> -+ sizeof(reply.buf) -
> -+ reply.cursor,
> -+ reply.opt_state, reply.packet,
> -+ required_opts_NAA,
> -+ NULL);
> -+ }
> -+
> - /*
> - * RFC3315 section 17.2.2 (Solicit):
> - *
> -@@ -1619,6 +1717,7 @@ lease_to_client(struct data_string *repl
> - * Having stored the client's IA's, store any options that
> - * will fit in the remaining space.
> - */
> -+ else
> - reply.cursor += store_options6((char *)reply.buf.data +
> reply.cursor,
> - sizeof(reply.buf) - reply.cursor,
> - reply.opt_state, reply.packet,
> -@@ -4748,7 +4847,6 @@ dhcpv6_solicit(struct data_string *reply
> - * Very similar to Solicit handling, except the server DUID is required.
> - */
> -
> --/* TODO: reject unicast messages, unless we set unicast option */
> - static void
> - dhcpv6_request(struct data_string *reply_ret, struct packet *packet) {
> - struct data_string client_id;
> -@@ -5078,7 +5176,6 @@ exit:
> - * except for the error code of when addresses don't match.
> - */
> -
> --/* TODO: reject unicast messages, unless we set unicast option */
> - static void
> - dhcpv6_renew(struct data_string *reply, struct packet *packet) {
> - struct data_string client_id;
> -@@ -5322,18 +5419,60 @@ iterate_over_ia_na(struct data_string *r
> - goto exit;
> - }
> -
> -- snprintf(status_msg, sizeof(status_msg), "%s received.",
> packet_type);
> -- if (!set_status_code(STATUS_Success, status_msg, opt_state)) {
> -- goto exit;
> -- }
> -+ /* reject unicast message, unless we set unicast option */
> -+ if ((packet->unicast == ISC_TRUE) && !is_unicast_option_defined()) {
> -+ /*
> -+ * RFC3315 section 18.2.6 (Release):
> -+ *
> -+ * When the server receives a Release message via unicast
> from a client
> -+ * to which the server has not sent a unicast option, the
> server
> -+ * discards the Release message and responds with a Reply
> message
> -+ * containing a Status Code option with value UseMulticast,
> a Server
> -+ * Identifier option containing the server's DUID, the
> Client Identifier
> -+ * option from the client message, and no other options.
> -+ *
> -+ * Section 18.2.7 (Decline):
> -+ *
> -+ * When the server receives a Decline message via unicast
> from a client
> -+ * to which the server has not sent a unicast option, the
> server
> -+ * discards the Decline message and responds with a Reply
> message
> -+ * containing a Status Code option with the value
> UseMulticast, a Server
> -+ * Identifier option containing the server's DUID, the
> Client Identifier
> -+ * option from the client message, and no other options.
> -+ */
> -+ snprintf(status_msg, sizeof(status_msg),
> -+ "%s received unicast.", packet_type);
> -+ if (!set_status_code(STATUS_UseMulticast, status_msg,
> opt_state)) {
> -+ goto exit;
> -+ }
> -
> -- /*
> -- * Add our options that are not associated with any IA_NA or IA_TA.
> -- */
> -- reply_ofs += store_options6(reply_data+reply_ofs,
> -- sizeof(reply_data)-reply_ofs,
> -+ /*
> -+ * Produce an reply that includes only:
> -+ *
> -+ * Status code.
> -+ * Server DUID.
> -+ * Client DUID.
> -+ */
> -+ reply_ofs += store_options6(reply_data+reply_ofs,
> -+ sizeof(reply_data)-reply_ofs,
> - opt_state, packet,
> -- required_opts, NULL);
> -+ required_opts_NAA, NULL);
> -+
> -+ goto return_reply;
> -+ } else {
> -+ snprintf(status_msg, sizeof(status_msg), "%s received.",
> packet_type);
> -+ if (!set_status_code(STATUS_Success, status_msg, opt_state))
> {
> -+ goto exit;
> -+ }
> -+
> -+ /*
> -+ * Add our options that are not associated with any IA_NA or
> IA_TA.
> -+ */
> -+ reply_ofs += store_options6(reply_data+reply_ofs,
> -+ sizeof(reply_data)-reply_ofs,
> -+ opt_state, packet,
> -+ required_opts, NULL);
> -+ }
> -
> - /*
> - * Loop through the IA_NA reported by the client, and deal with
> -@@ -5471,6 +5610,7 @@ iterate_over_ia_na(struct data_string *r
> - /*
> - * Return our reply to the caller.
> - */
> -+return_reply:
> - reply_ret->len = reply_ofs;
> - reply_ret->buffer = NULL;
> - if (!buffer_allocate(&reply_ret->buffer, reply_ofs, MDL)) {
> -@@ -5516,7 +5656,6 @@ exit:
> - * we still need to be aware of this possibility.
> - */
> -
> --/* TODO: reject unicast messages, unless we set unicast option */
> - /* TODO: IA_TA */
> - static void
> - dhcpv6_decline(struct data_string *reply, struct packet *packet) {
> -@@ -5986,7 +6125,6 @@ exit:
> - * Release means a client is done with the leases.
> - */
> -
> --/* TODO: reject unicast messages, unless we set unicast option */
> - static void
> - dhcpv6_release(struct data_string *reply, struct packet *packet) {
> - struct data_string client_id;
> diff --git a/src/patches/dhcp/dhcp-add_timeout_when_NULL.patch
> b/src/patches/dhcp/dhcp-add_timeout_when_NULL.patch
> deleted file mode 100644
> index 103824c38..000000000
> --- a/src/patches/dhcp/dhcp-add_timeout_when_NULL.patch
> +++ /dev/null
> @@ -1,14 +0,0 @@
> -diff -up dhcp-4.3.0a1/common/dispatch.c.dracut dhcp-4.3.0a1/common/dispatch.c
> ---- dhcp-4.3.0a1/common/dispatch.c.dracut 2013-12-11
> 01:25:12.000000000 +0100
> -+++ dhcp-4.3.0a1/common/dispatch.c 2013-12-19 15:39:50.350505860 +0100
> -@@ -210,6 +210,10 @@ void add_timeout (when, where, what, ref
> - isc_interval_t interval;
> - isc_time_t expires;
> -
> -+ if (when == NULL) {
> -+ return;
> -+ }
> -+
> - /* See if this timeout supersedes an existing timeout. */
> - t = (struct timeout *)0;
> - for (q = timeouts; q; q = q->next) {
> diff --git a/src/patches/dhcp/dhcp-capability.patch b/src/patches/dhcp/dhcp-
> capability.patch
> deleted file mode 100644
> index 91a1baef5..000000000
> --- a/src/patches/dhcp/dhcp-capability.patch
> +++ /dev/null
> @@ -1,250 +0,0 @@
> -diff -up dhcp-4.3.1b1/client/dhclient.8.zzftXp dhcp-4.3.1b1/client/dhclient.8
> ---- dhcp-4.3.1b1/client/dhclient.8.zzftXp 2014-07-10
> 17:38:26.938599402 +0200
> -+++ dhcp-4.3.1b1/client/dhclient.8 2014-07-10 17:39:25.852763873 +0200
> -@@ -128,6 +128,9 @@ dhclient - Dynamic Host Configuration Pr
> - .B -w
> - ]
> - [
> -+.B -nc
> -+]
> -+[
> - .B -B
> - ]
> - [
> -@@ -304,6 +307,32 @@ has been added or removed, so that the c
> - address on that interface.
> -
> - .TP
> -+.BI \-nc
> -+Do not drop capabilities.
> -+
> -+Normally, if
> -+.B dhclient
> -+was compiled with libcap-ng support,
> -+.B dhclient
> -+drops most capabilities immediately upon startup. While more secure,
> -+this greatly restricts the additional actions that hooks in
> -+.B dhclient-script (8)
> -+can take. (For example, any daemons that
> -+.B dhclient-script (8)
> -+starts or restarts will inherit the restricted capabilities as well,
> -+which may interfere with their correct operation.) Thus, the
> -+.BI \-nc
> -+option can be used to prevent
> -+.B dhclient
> -+from dropping capabilities.
> -+
> -+The
> -+.BI \-nc
> -+option is ignored if
> -+.B dhclient
> -+was not compiled with libcap-ng support.
> -+
> -+.TP
> - .BI \-B
> - Set the BOOTP broadcast flag in request packets so servers will always
> - broadcast replies.
> -diff -up dhcp-4.3.1b1/client/dhclient.c.zzftXp dhcp-4.3.1b1/client/dhclient.c
> ---- dhcp-4.3.1b1/client/dhclient.c.zzftXp 2014-07-10
> 17:39:25.797764653 +0200
> -+++ dhcp-4.3.1b1/client/dhclient.c 2014-07-10 17:39:25.853763858 +0200
> -@@ -39,6 +39,10 @@
> - #include <limits.h>
> - #include <dns/result.h>
> -
> -+#ifdef HAVE_LIBCAP_NG
> -+#include <cap-ng.h>
> -+#endif
> -+
> - /*
> - * Defined in stdio.h when _GNU_SOURCE is set, but we don't want to define
> - * that when building ISC code.
> -@@ -143,6 +147,9 @@ main(int argc, char **argv) {
> - int timeout_arg = 0;
> - char *arg_conf = NULL;
> - int arg_conf_len = 0;
> -+#ifdef HAVE_LIBCAP_NG
> -+ int keep_capabilities = 0;
> -+#endif
> -
> - /* Initialize client globals. */
> - memset(&default_duid, 0, sizeof(default_duid));
> -@@ -425,6 +432,10 @@ main(int argc, char **argv) {
> - }
> -
> - dhclient_request_options = argv[i];
> -+ } else if (!strcmp(argv[i], "-nc")) {
> -+#ifdef HAVE_LIBCAP_NG
> -+ keep_capabilities = 1;
> -+#endif
> - } else if (argv[i][0] == '-') {
> - usage();
> - } else if (interfaces_requested < 0) {
> -@@ -473,6 +484,19 @@ main(int argc, char **argv) {
> - path_dhclient_script = s;
> - }
> -
> -+#ifdef HAVE_LIBCAP_NG
> -+ /* Drop capabilities */
> -+ if (!keep_capabilities) {
> -+ capng_clear(CAPNG_SELECT_CAPS);
> -+ capng_update(CAPNG_ADD, CAPNG_EFFECTIVE|CAPNG_PERMITTED,
> -+ CAP_DAC_OVERRIDE); // Drop this someday
> -+ capng_updatev(CAPNG_ADD, CAPNG_EFFECTIVE|CAPNG_PERMITTED,
> -+ CAP_NET_ADMIN, CAP_NET_RAW,
> -+ CAP_NET_BIND_SERVICE, CAP_SYS_ADMIN, -1);
> -+ capng_apply(CAPNG_SELECT_CAPS);
> -+ }
> -+#endif
> -+
> - /* Set up the initial dhcp option universe. */
> - initialize_common_option_spaces();
> -
> -diff -up dhcp-4.3.1b1/client/dhclient-script.8.zzftXp dhcp-
> 4.3.1b1/client/dhclient-script.8
> ---- dhcp-4.3.1b1/client/dhclient-script.8.zzftXp 2014-07-10
> 17:39:25.761765163 +0200
> -+++ dhcp-4.3.1b1/client/dhclient-script.8 2014-07-10
> 17:39:25.851763887 +0200
> -@@ -243,6 +243,16 @@ repeatedly initialized to the values pro
> - the other. Assuming the information provided by both servers is
> - valid, this shouldn't cause any real problems, but it could be
> - confusing.
> -+.PP
> -+Normally, if dhclient was compiled with libcap-ng support,
> -+dhclient drops most capabilities immediately upon startup.
> -+While more secure, this greatly restricts the additional actions that
> -+hooks in dhclient-script can take. For example, any daemons that
> -+dhclient-script starts or restarts will inherit the restricted
> -+capabilities as well, which may interfere with their correct operation.
> -+Thus, the
> -+.BI \-nc
> -+option can be used to prevent dhclient from dropping capabilities.
> - .SH SEE ALSO
> - dhclient(8), dhcpd(8), dhcrelay(8), dhclient.conf(5) and
> - dhclient.leases(5).
> -diff -up dhcp-4.3.1b1/client/Makefile.am.zzftXp dhcp-
> 4.3.1b1/client/Makefile.am
> ---- dhcp-4.3.1b1/client/Makefile.am.zzftXp 2014-07-10
> 17:38:10.778828583 +0200
> -+++ dhcp-4.3.1b1/client/Makefile.am 2014-07-10 17:39:25.851763887
> +0200
> -@@ -10,7 +10,7 @@ dhclient_SOURCES = clparse.c dhclient.c
> - scripts/bsdos scripts/freebsd scripts/linux scripts/macos
> \
> - scripts/netbsd scripts/nextstep scripts/openbsd \
> - scripts/solaris scripts/openwrt
> --dhclient_LDADD = ../common/libdhcp.a ../omapip/libomapi.a \
> -+dhclient_LDADD = ../common/libdhcp.a ../omapip/libomapi.la $(CAPNG_LDADD) \
> - $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
> - man_MANS = dhclient.8 dhclient-script.8 dhclient.conf.5 dhclient.leases.5
> - EXTRA_DIST = $(man_MANS)
> -diff -up dhcp-4.3.1b1/configure.ac.zzftXp dhcp-4.3.1b1/configure.ac
> ---- dhcp-4.3.1b1/configure.ac.zzftXp 2014-07-10 17:38:10.779828569
> +0200
> -+++ dhcp-4.3.1b1/configure.ac 2014-07-10 17:39:25.854763844 +0200
> -@@ -499,6 +499,41 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]],
> - # Look for optional headers.
> - AC_CHECK_HEADERS(sys/socket.h net/if_dl.h net/if6.h regex.h)
> -
> -+# look for capabilities library
> -+AC_ARG_WITH(libcap-ng,
> -+ [ --with-libcap-ng=[auto/yes/no] Add Libcap-ng support
> [default=auto]],,
> -+ with_libcap_ng=auto)
> -+
> -+# Check for Libcap-ng API
> -+#
> -+# libcap-ng detection
> -+if test x$with_libcap_ng = xno ; then
> -+ have_libcap_ng=no;
> -+else
> -+ # Start by checking for header file
> -+ AC_CHECK_HEADER(cap-ng.h, capng_headers=yes, capng_headers=no)
> -+
> -+ # See if we have libcap-ng library
> -+ AC_CHECK_LIB(cap-ng, capng_clear,
> -+ CAPNG_LDADD=-lcap-ng,)
> -+
> -+ # Check results are usable
> -+ if test x$with_libcap_ng = xyes -a x$CAPNG_LDADD = x ; then
> -+ AC_MSG_ERROR(libcap-ng support was requested and the library was not
> found)
> -+ fi
> -+ if test x$CAPNG_LDADD != x -a $capng_headers = no ; then
> -+ AC_MSG_ERROR(libcap-ng libraries found but headers are missing)
> -+ fi
> -+fi
> -+AC_SUBST(CAPNG_LDADD)
> -+AC_MSG_CHECKING(whether to use libcap-ng)
> -+if test x$CAPNG_LDADD != x ; then
> -+ AC_DEFINE(HAVE_LIBCAP_NG,1,[libcap-ng support])
> -+ AC_MSG_RESULT(yes)
> -+else
> -+ AC_MSG_RESULT(no)
> -+fi
> -+
> - # Solaris needs some libraries for functions
> - AC_SEARCH_LIBS(socket, [socket])
> - AC_SEARCH_LIBS(inet_ntoa, [nsl])
> -diff -up dhcp-4.3.1b1/relay/dhcrelay.c.zzftXp dhcp-4.3.1b1/relay/dhcrelay.c
> ---- dhcp-4.3.1b1/relay/dhcrelay.c.zzftXp 2014-07-10 17:39:25.799764624
> +0200
> -+++ dhcp-4.3.1b1/relay/dhcrelay.c 2014-07-10 17:40:19.191007421 +0200
> -@@ -31,6 +31,11 @@
> - #include <signal.h>
> - #include <sys/time.h>
> -
> -+#ifdef HAVE_LIBCAP_NG
> -+# include <cap-ng.h>
> -+ int keep_capabilities = 0;
> -+#endif
> -+
> - TIME default_lease_time = 43200; /* 12 hours... */
> - TIME max_lease_time = 86400; /* 24 hours... */
> - struct tree_cache *global_options[256];
> -@@ -376,6 +381,10 @@ main(int argc, char **argv) {
> - usage();
> - dhcrelay_sub_id = argv[i];
> - #endif
> -+ } else if (!strcmp(argv[i], "-nc")) {
> -+#ifdef HAVE_LIBCAP_NG
> -+ keep_capabilities = 1;
> -+#endif
> - } else if (!strcmp(argv[i], "-pf")) {
> - if (++i == argc)
> - usage();
> -@@ -446,6 +455,17 @@ main(int argc, char **argv) {
> - #endif
> - }
> -
> -+#ifdef HAVE_LIBCAP_NG
> -+ /* Drop capabilities */
> -+ if (!keep_capabilities) {
> -+ capng_clear(CAPNG_SELECT_BOTH);
> -+ capng_updatev(CAPNG_ADD, CAPNG_EFFECTIVE|CAPNG_PERMITTED,
> -+ CAP_NET_RAW, CAP_NET_BIND_SERVICE, -1);
> -+ capng_apply(CAPNG_SELECT_BOTH);
> -+ log_info ("Dropped all unnecessary capabilities.");
> -+ }
> -+#endif
> -+
> - if (!quiet) {
> - log_info("%s %s", message, PACKAGE_VERSION);
> - log_info(copyright);
> -@@ -598,6 +618,15 @@ main(int argc, char **argv) {
> - signal(SIGTERM, dhcp_signal_handler); /* kill */
> - #endif
> -
> -+#ifdef HAVE_LIBCAP_NG
> -+ /* Drop all capabilities */
> -+ if (!keep_capabilities) {
> -+ capng_clear(CAPNG_SELECT_BOTH);
> -+ capng_apply(CAPNG_SELECT_BOTH);
> -+ log_info ("Dropped all capabilities.");
> -+ }
> -+#endif
> -+
> - /* Start dispatching packets and timeouts... */
> - dispatch();
> -
> -diff -up dhcp-4.3.1b1/relay/Makefile.am.zzftXp dhcp-4.3.1b1/relay/Makefile.am
> ---- dhcp-4.3.1b1/relay/Makefile.am.zzftXp 2014-07-10
> 17:38:10.780828554 +0200
> -+++ dhcp-4.3.1b1/relay/Makefile.am 2014-07-10 17:39:25.854763844 +0200
> -@@ -2,7 +2,7 @@ AM_CPPFLAGS = -DLOCALSTATEDIR='"@localst
> -
> - sbin_PROGRAMS = dhcrelay
> - dhcrelay_SOURCES = dhcrelay.c
> --dhcrelay_LDADD = ../common/libdhcp.a ../omapip/libomapi.a \
> -+dhcrelay_LDADD = ../common/libdhcp.a ../omapip/libomapi.la $(CAPNG_LDADD) \
> - $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
> - man_MANS = dhcrelay.8
> - EXTRA_DIST = $(man_MANS)
> diff --git a/src/patches/dhcp/dhcp-default-requested-options.patch
> b/src/patches/dhcp/dhcp-default-requested-options.patch
> deleted file mode 100644
> index afda222e6..000000000
> --- a/src/patches/dhcp/dhcp-default-requested-options.patch
> +++ /dev/null
> @@ -1,44 +0,0 @@
> -diff -up dhcp-4.3.0a1/client/clparse.c.requested dhcp-
> 4.3.0a1/client/clparse.c
> ---- dhcp-4.3.0a1/client/clparse.c.requested 2013-12-19
> 15:13:27.276631307 +0100
> -+++ dhcp-4.3.0a1/client/clparse.c 2013-12-19 15:13:27.313630789 +0100
> -@@ -37,7 +37,7 @@
> -
> - struct client_config top_level_config;
> -
> --#define NUM_DEFAULT_REQUESTED_OPTS 9
> -+#define NUM_DEFAULT_REQUESTED_OPTS 14
> - struct option *default_requested_options[NUM_DEFAULT_REQUESTED_OPTS + 1];
> -
> - static void parse_client_default_duid(struct parse *cfile);
> -@@ -119,6 +119,31 @@ isc_result_t read_client_conf ()
> - option_code_hash_lookup(&default_requested_options[8],
> - dhcpv6_universe.code_hash, &code, 0, MDL);
> -
> -+ /* 10 */
> -+ code = DHO_NIS_DOMAIN;
> -+ option_code_hash_lookup(&default_requested_options[9],
> -+ dhcp_universe.code_hash, &code, 0, MDL);
> -+
> -+ /* 11 */
> -+ code = DHO_NIS_SERVERS;
> -+ option_code_hash_lookup(&default_requested_options[10],
> -+ dhcp_universe.code_hash, &code, 0, MDL);
> -+
> -+ /* 12 */
> -+ code = DHO_NTP_SERVERS;
> -+ option_code_hash_lookup(&default_requested_options[11],
> -+ dhcp_universe.code_hash, &code, 0, MDL);
> -+
> -+ /* 13 */
> -+ code = DHO_INTERFACE_MTU;
> -+ option_code_hash_lookup(&default_requested_options[12],
> -+ dhcp_universe.code_hash, &code, 0, MDL);
> -+
> -+ /* 14 */
> -+ code = DHO_DOMAIN_SEARCH;
> -+ option_code_hash_lookup(&default_requested_options[13],
> -+ dhcp_universe.code_hash, &code, 0, MDL);
> -+
> - for (code = 0 ; code < NUM_DEFAULT_REQUESTED_OPTS ; code++) {
> - if (default_requested_options[code] == NULL)
> - log_fatal("Unable to find option definition for "
> diff --git a/src/patches/dhcp/dhcp-dhclient-decline-backoff.patch
> b/src/patches/dhcp/dhcp-dhclient-decline-backoff.patch
> deleted file mode 100644
> index 3e52e6400..000000000
> --- a/src/patches/dhcp/dhcp-dhclient-decline-backoff.patch
> +++ /dev/null
> @@ -1,63 +0,0 @@
> -diff -up dhcp-4.3.1b1/client/dhclient.c.JwFUZj dhcp-4.3.1b1/client/dhclient.c
> ---- dhcp-4.3.1b1/client/dhclient.c.JwFUZj 2014-07-10
> 17:38:50.511265091 +0200
> -+++ dhcp-4.3.1b1/client/dhclient.c 2014-07-10 17:39:16.164901267 +0200
> -@@ -1281,6 +1281,8 @@ void state_init (cpp)
> - void *cpp;
> - {
> - struct client_state *client = cpp;
> -+ enum dhcp_state init_state = client->state;
> -+ struct timeval tv;
> -
> - ASSERT_STATE(state, S_INIT);
> -
> -@@ -1293,9 +1295,18 @@ void state_init (cpp)
> - client -> first_sending = cur_time;
> - client -> interval = client -> config -> initial_interval;
> -
> -- /* Add an immediate timeout to cause the first DHCPDISCOVER packet
> -- to go out. */
> -- send_discover (client);
> -+ if (init_state != S_DECLINED) {
> -+ /* Add an immediate timeout to cause the first DHCPDISCOVER
> packet
> -+ to go out. */
> -+ send_discover(client);
> -+ } else {
> -+ /* We've received an OFFER and it has been DECLINEd by
> dhclient-script.
> -+ * wait for a random time between 1 and backoff_cutoff
> seconds before
> -+ * trying again. */
> -+ tv . tv_sec = cur_time + ((1 + (random() >> 2)) % client-
> >config->backoff_cutoff);
> -+ tv . tv_usec = 0;
> -+ add_timeout(&tv, send_discover, client, 0, 0);
> -+ }
> - }
> -
> - /*
> -@@ -1592,6 +1603,7 @@ void bind_lease (client)
> - "try (declined). Exiting.");
> - exit(2);
> - } else {
> -+ client -> state = S_DECLINED;
> - state_init(client);
> - return;
> - }
> -@@ -4059,6 +4071,7 @@ void client_location_changed ()
> - case S_INIT:
> - case S_REBINDING:
> - case S_STOPPED:
> -+ case S_DECLINED:
> - break;
> - }
> - client -> state = S_INIT;
> -diff -up dhcp-4.3.1b1/includes/dhcpd.h.JwFUZj dhcp-4.3.1b1/includes/dhcpd.h
> ---- dhcp-4.3.1b1/includes/dhcpd.h.JwFUZj 2014-07-10 17:38:26.941599360
> +0200
> -+++ dhcp-4.3.1b1/includes/dhcpd.h 2014-07-10 17:38:50.526264878 +0200
> -@@ -1087,7 +1087,8 @@ enum dhcp_state {
> - S_BOUND = 5,
> - S_RENEWING = 6,
> - S_REBINDING = 7,
> -- S_STOPPED = 8
> -+ S_STOPPED = 8,
> -+ S_DECLINED = 9
> - };
> -
> - /* Authentication and BOOTP policy possibilities (not all values work
> diff --git a/src/patches/dhcp/dhcp-dhclient-options.patch
> b/src/patches/dhcp/dhcp-dhclient-options.patch
> deleted file mode 100644
> index 67f144ecb..000000000
> --- a/src/patches/dhcp/dhcp-dhclient-options.patch
> +++ /dev/null
> @@ -1,509 +0,0 @@
> -diff -up dhcp-4.3.1b1/client/clparse.c.fLPqYB dhcp-4.3.1b1/client/clparse.c
> ---- dhcp-4.3.1b1/client/clparse.c.fLPqYB 2014-07-02 19:58:38.000000000
> +0200
> -+++ dhcp-4.3.1b1/client/clparse.c 2014-07-10 17:38:26.938599402 +0200
> -@@ -148,6 +148,7 @@ isc_result_t read_client_conf ()
> - /* Requested lease time, used by DHCPv6 (DHCPv4 uses the option
> cache)
> - */
> - top_level_config.requested_lease = 7200;
> -+ top_level_config.bootp_broadcast_always = 0;
> -
> - group_allocate (&top_level_config.on_receipt, MDL);
> - if (!top_level_config.on_receipt)
> -@@ -353,7 +354,8 @@ void read_client_leases ()
> - interface-declaration |
> - LEASE client-lease-statement |
> - ALIAS client-lease-statement |
> -- KEY key-definition */
> -+ KEY key-definition |
> -+ BOOTP_BROADCAST_ALWAYS */
> -
> - void parse_client_statement (cfile, ip, config)
> - struct parse *cfile;
> -@@ -771,6 +773,12 @@ void parse_client_statement (cfile, ip,
> - parse_reject_statement (cfile, config);
> - return;
> -
> -+ case BOOTP_BROADCAST_ALWAYS:
> -+ token = next_token(&val, (unsigned*)0, cfile);
> -+ config -> bootp_broadcast_always = 1;
> -+ parse_semi (cfile);
> -+ return;
> -+
> - default:
> - lose = 0;
> - stmt = (struct executable_statement *)0;
> -diff -up dhcp-4.3.1b1/client/dhclient.8.fLPqYB dhcp-4.3.1b1/client/dhclient.8
> ---- dhcp-4.3.1b1/client/dhclient.8.fLPqYB 2014-07-02
> 19:58:38.000000000 +0200
> -+++ dhcp-4.3.1b1/client/dhclient.8 2014-07-10 17:38:26.938599402 +0200
> -@@ -128,6 +128,33 @@ dhclient - Dynamic Host Configuration Pr
> - .B -w
> - ]
> - [
> -+.B -B
> -+]
> -+[
> -+.B -C
> -+.I dhcp-client-identifier
> -+]
> -+[
> -+.B -H
> -+.I host-name
> -+]
> -+[
> -+.B -F
> -+.I fqdn.fqdn
> -+]
> -+[
> -+.B -V
> -+.I vendor-class-identifier
> -+]
> -+[
> -+.B -R
> -+.I request-option-list
> -+]
> -+[
> -+.B -timeout
> -+.I timeout
> -+]
> -+[
> - .B -v
> - ]
> - [
> -@@ -275,6 +302,69 @@ not to exit when it doesn't find any suc
> - program can then be used to notify the client when a network interface
> - has been added or removed, so that the client can attempt to configure an IP
> - address on that interface.
> -+
> -+.TP
> -+.BI \-B
> -+Set the BOOTP broadcast flag in request packets so servers will always
> -+broadcast replies.
> -+
> -+.TP
> -+.BI \-C\ <dhcp-client-identifier>
> -+Specify the dhcp-client-identifier option to send to the DHCP server.
> -+
> -+.TP
> -+.BI \-H\ <host-name>
> -+Specify the host-name option to send to the DHCP server. The host-name
> -+string only contains the client's hostname prefix, to which the server will
> -+append the ddns-domainname or domain-name options, if any, to derive the
> -+fully qualified domain name of the client. The
> -+.B -H
> -+option cannot be used with the
> -+.B -F
> -+option.
> -+
> -+.TP
> -+.BI \-F\ <fqdn.fqdn>
> -+Specify the fqdn.fqdn option to send to the DHCP server. This option cannot
> -+be used with the
> -+.B -H
> -+option. The fqdn.fqdn option must specify the complete domain name of the
> -+client host, which the server may use for dynamic DNS updates.
> -+
> -+.TP
> -+.BI \-V\ <vendor-class-identifier>
> -+Specify the vendor-class-identifier option to send to the DHCP server.
> -+
> -+.TP
> -+.BI \-R\ <option>[,<option>...]
> -+Specify the list of options the client is to request from the server. The
> -+option list must be a single string consisting of option names separated
> -+by at least one command and optional space characters. The default option
> -+list is:
> -+
> -+.BR
> -+ subnet-mask, broadcast-address, time-offset, routers,
> -+.BR
> -+ domain-search, domain-name, domain-name-servers, host-name,
> -+.BR
> -+ nis-domain, nis-servers, ntp-servers, interface-mtu
> -+
> -+.TP
> -+.B -R
> -+option does not append options to the default request, it overrides the
> -+default request list. Keep this in mind if you want to request an
> -+additional option besides the default request list. You will have to
> -+specify all option names for the
> -+.B -R
> -+parameter.
> -+
> -+.TP
> -+.BI \-timeout\ <timeout>
> -+Specify the time after which
> -+.B dhclient
> -+will decide that no DHCP servers can be contacted when no responses have
> been
> -+received.
> -+
> - .TP
> - .BI \-n
> - Do not configure any interfaces. This is most likely to be useful in
> -diff -up dhcp-4.3.1b1/client/dhclient.c.fLPqYB dhcp-4.3.1b1/client/dhclient.c
> ---- dhcp-4.3.1b1/client/dhclient.c.fLPqYB 2014-07-02
> 19:58:38.000000000 +0200
> -+++ dhcp-4.3.1b1/client/dhclient.c 2014-07-10 17:38:44.520350055 +0200
> -@@ -39,6 +39,12 @@
> - #include <limits.h>
> - #include <dns/result.h>
> -
> -+/*
> -+ * Defined in stdio.h when _GNU_SOURCE is set, but we don't want to define
> -+ * that when building ISC code.
> -+ */
> -+extern int asprintf(char **strp, const char *fmt, ...);
> -+
> - TIME default_lease_time = 43200; /* 12 hours... */
> - TIME max_lease_time = 86400; /* 24 hours... */
> -
> -@@ -88,6 +94,9 @@ int wanted_ia_na = -1; /* the absolute
> - int wanted_ia_ta = 0;
> - int wanted_ia_pd = 0;
> - char *mockup_relay = NULL;
> -+int bootp_broadcast_always = 0;
> -+
> -+extern struct option *default_requested_options[];
> -
> - void run_stateless(int exit_mode);
> -
> -@@ -125,6 +134,15 @@ main(int argc, char **argv) {
> - int local_family_set = 0;
> - #endif /* DHCPv6 */
> - char *s;
> -+ char *dhcp_client_identifier_arg = NULL;
> -+ char *dhcp_host_name_arg = NULL;
> -+ char *dhcp_fqdn_arg = NULL;
> -+ char *dhcp_vendor_class_identifier_arg = NULL;
> -+ char *dhclient_request_options = NULL;
> -+
> -+ int timeout_arg = 0;
> -+ char *arg_conf = NULL;
> -+ int arg_conf_len = 0;
> -
> - /* Initialize client globals. */
> - memset(&default_duid, 0, sizeof(default_duid));
> -@@ -325,6 +343,88 @@ main(int argc, char **argv) {
> - strlen(PACKAGE_VERSION)));
> - IGNORE_RET(write(STDERR_FILENO, "\n", 1));
> - exit(0);
> -+ } else if (!strcmp(argv[i], "-C")) {
> -+ if ((++i == argc) || (argv[i] == NULL) ||
> (*(argv[i])=='\0')) {
> -+ usage();
> -+ exit(1);
> -+ }
> -+
> -+ if (strlen(argv[i]) >= DHCP_MAX_OPTION_LEN) {
> -+ log_error("-C option dhcp-client-identifier
> string \"%s\" is too long - maximum length is: %d", argv[i],
> DHCP_MAX_OPTION_LEN-1);
> -+ exit(1);
> -+ }
> -+
> -+ dhcp_client_identifier_arg = argv[i];
> -+ } else if (!strcmp(argv[i], "-B")) {
> -+ bootp_broadcast_always = 1;
> -+ } else if (!strcmp(argv[i], "-H")) {
> -+ if ((++i == argc) || (argv[i] == NULL) ||
> (*(argv[i])=='\0')) {
> -+ usage();
> -+ exit(1);
> -+ }
> -+
> -+ if (strlen(argv[i]) >= DHCP_MAX_OPTION_LEN) {
> -+ log_error("-H option host-name string \"%s\"
> is too long - maximum length is: %d", argv[i], DHCP_MAX_OPTION_LEN-1);
> -+ exit(1);
> -+ }
> -+
> -+ if (dhcp_host_name_arg != NULL) {
> -+ log_error("The -H <host-name> and -F <fqdn>
> arguments are mutually exclusive");
> -+ exit(1);
> -+ }
> -+
> -+ dhcp_host_name_arg = argv[i];
> -+ } else if (!strcmp(argv[i], "-F")) {
> -+ if ((++i == argc) || (argv[i] == NULL) ||
> (*(argv[i])=='\0')) {
> -+ usage();
> -+ exit(1);
> -+ }
> -+
> -+ if (strlen(argv[i]) >= DHCP_MAX_OPTION_LEN) {
> -+ log_error("-F option fqdn.fqdn string \"%s\"
> is too long - maximum length is: %d", argv[i], DHCP_MAX_OPTION_LEN-1);
> -+ exit(1);
> -+ }
> -+
> -+ if (dhcp_fqdn_arg != NULL) {
> -+ log_error("Only one -F <fqdn> argument can
> be specified");
> -+ exit(1);
> -+ }
> -+
> -+ if (dhcp_host_name_arg != NULL) {
> -+ log_error("The -F <fqdn> and -H <host-name>
> arguments are mutually exclusive");
> -+ exit(1);
> -+ }
> -+
> -+ dhcp_fqdn_arg = argv[i];
> -+ } else if (!strcmp(argv[i], "-timeout")) {
> -+ if ((++i == argc) || (argv[i] == NULL) ||
> (*(argv[i])=='\0')) {
> -+ usage();
> -+ exit(1);
> -+ }
> -+
> -+ if ((timeout_arg = atoi(argv[i])) <= 0) {
> -+ log_error("timeout option must be > 0 - bad
> value: %s",argv[i]);
> -+ exit(1);
> -+ }
> -+ } else if (!strcmp(argv[i], "-V")) {
> -+ if ((++i == argc) || (argv[i] == NULL) ||
> (*(argv[i])=='\0')) {
> -+ usage();
> -+ exit(1);
> -+ }
> -+
> -+ if (strlen(argv[i]) >= DHCP_MAX_OPTION_LEN) {
> -+ log_error("-V option vendor-class-identifier
> string \"%s\" is too long - maximum length is: %d", argv[i],
> DHCP_MAX_OPTION_LEN-1);
> -+ exit(1);
> -+ }
> -+
> -+ dhcp_vendor_class_identifier_arg = argv[i];
> -+ } else if (!strcmp(argv[i], "-R")) {
> -+ if ((++i == argc) || (argv[i] == NULL) ||
> (*(argv[i])=='\0')) {
> -+ usage();
> -+ exit(1);
> -+ }
> -+
> -+ dhclient_request_options = argv[i];
> - } else if (argv[i][0] == '-') {
> - usage();
> - } else if (interfaces_requested < 0) {
> -@@ -507,6 +607,156 @@ main(int argc, char **argv) {
> - /* Parse the dhclient.conf file. */
> - read_client_conf();
> -
> -+ /* Parse any extra command line configuration arguments: */
> -+ if ((dhcp_client_identifier_arg != NULL) &&
> (*dhcp_client_identifier_arg != '\0')) {
> -+ arg_conf_len = asprintf(&arg_conf, "send dhcp-client-
> identifier \"%s\";", dhcp_client_identifier_arg);
> -+
> -+ if ((arg_conf == 0) || (arg_conf_len <= 0))
> -+ log_fatal("Unable to send -C option dhcp-client-
> identifier");
> -+ }
> -+
> -+ if ((dhcp_host_name_arg != NULL) && (*dhcp_host_name_arg != '\0')) {
> -+ if (arg_conf == 0) {
> -+ arg_conf_len = asprintf(&arg_conf, "send host-name
> \"%s\";", dhcp_host_name_arg);
> -+
> -+ if ((arg_conf == 0) || (arg_conf_len <= 0))
> -+ log_fatal("Unable to send -H option host-
> name");
> -+ } else {
> -+ char *last_arg_conf = arg_conf;
> -+ arg_conf = NULL;
> -+ arg_conf_len = asprintf(&arg_conf, "%s\nsend host-
> name \"%s\";", last_arg_conf, dhcp_host_name_arg);
> -+
> -+ if ((arg_conf == 0) || (arg_conf_len <= 0))
> -+ log_fatal("Unable to send -H option host-
> name");
> -+
> -+ free(last_arg_conf);
> -+ }
> -+ }
> -+
> -+ if ((dhcp_fqdn_arg != NULL) && (*dhcp_fqdn_arg != '\0')) {
> -+ if (arg_conf == 0) {
> -+ arg_conf_len = asprintf(&arg_conf, "send fqdn.fqdn
> \"%s\";", dhcp_fqdn_arg);
> -+
> -+ if ((arg_conf == 0) || (arg_conf_len <= 0))
> -+ log_fatal("Unable to send -F option
> fqdn.fqdn");
> -+ } else {
> -+ char *last_arg_conf = arg_conf;
> -+ arg_conf = NULL;
> -+ arg_conf_len = asprintf(&arg_conf, "%s\nsend
> fqdn.fqdn \"%s\";", last_arg_conf, dhcp_fqdn_arg);
> -+
> -+ if ((arg_conf == 0) || (arg_conf_len <= 0))
> -+ log_fatal("Unable to send -F option
> fqdn.fqdn");
> -+
> -+ free(last_arg_conf);
> -+ }
> -+ }
> -+
> -+ if (timeout_arg) {
> -+ if (arg_conf == 0) {
> -+ arg_conf_len = asprintf(&arg_conf, "timeout %d;",
> timeout_arg);
> -+
> -+ if ((arg_conf == 0) || (arg_conf_len <= 0))
> -+ log_fatal("Unable to process -timeout
> timeout argument");
> -+ } else {
> -+ char *last_arg_conf = arg_conf;
> -+ arg_conf = NULL;
> -+ arg_conf_len = asprintf(&arg_conf, "%s\ntimeout
> %d;", last_arg_conf, timeout_arg);
> -+
> -+ if ((arg_conf == 0) || (arg_conf_len == 0))
> -+ log_fatal("Unable to process -timeout
> timeout argument");
> -+
> -+ free(last_arg_conf);
> -+ }
> -+ }
> -+
> -+ if ((dhcp_vendor_class_identifier_arg != NULL) &&
> (*dhcp_vendor_class_identifier_arg != '\0')) {
> -+ if (arg_conf == 0) {
> -+ arg_conf_len = asprintf(&arg_conf, "send vendor-
> class-identifier \"%s\";", dhcp_vendor_class_identifier_arg);
> -+
> -+ if ((arg_conf == 0) || (arg_conf_len <= 0))
> -+ log_fatal("Unable to send -V option vendor-
> class-identifier");
> -+ } else {
> -+ char *last_arg_conf = arg_conf;
> -+ arg_conf = NULL;
> -+ arg_conf_len = asprintf(&arg_conf, "%s\nsend vendor-
> class-identifier \"%s\";", last_arg_conf, dhcp_vendor_class_identifier_arg);
> -+
> -+ if ((arg_conf == 0) || (arg_conf_len <= 0))
> -+ log_fatal("Unable to send -V option vendor-
> class-identifier");
> -+
> -+ free(last_arg_conf);
> -+ }
> -+ }
> -+
> -+ if (dhclient_request_options != NULL) {
> -+ if (arg_conf == 0) {
> -+ arg_conf_len = asprintf(&arg_conf, "request %s;",
> dhclient_request_options);
> -+
> -+ if ((arg_conf == 0) || (arg_conf_len <= 0))
> -+ log_fatal("Unable to parse -R <request
> options list> argument");
> -+ } else {
> -+ char *last_arg_conf = arg_conf;
> -+ arg_conf = NULL;
> -+ arg_conf_len = asprintf(&arg_conf, "%s\nrequest
> %s;", last_arg_conf, dhclient_request_options);
> -+
> -+ if ((arg_conf == 0) || (arg_conf_len <= 0))
> -+ log_fatal("Unable to parse -R <request
> options list> argument");
> -+
> -+ free(last_arg_conf);
> -+ }
> -+ }
> -+
> -+ if (arg_conf) {
> -+ if (arg_conf_len == 0)
> -+ if ((arg_conf_len = strlen(arg_conf)) == 0)
> -+ /* huh ? cannot happen ! */
> -+ log_fatal("Unable to process -C/-H/-F/-
> timeout/-V/-R configuration arguments");
> -+
> -+ /* parse the extra dhclient.conf configuration arguments
> -+ * into top level config: */
> -+ struct parse *cfile = (struct parse *)0;
> -+ const char *val = NULL;
> -+ int token;
> -+
> -+ status = new_parse(&cfile, -1, arg_conf, arg_conf_len,
> "extra dhclient -C/-H/-F/-timeout/-V/-R configuration arguments", 0);
> -+
> -+ if ((status != ISC_R_SUCCESS) || (cfile ->
> warnings_occurred))
> -+ log_fatal("Cannot parse -C/-H/-F/-timeout/-V/-R
> configuration arguments !");
> -+ /* more detailed parse failures will be logged */
> -+
> -+ do {
> -+ token = peek_token(&val, (unsigned *)0, cfile);
> -+ if (token == END_OF_FILE)
> -+ break;
> -+
> -+ parse_client_statement(cfile, (struct interface_info
> *)0, &top_level_config);
> -+ } while (1);
> -+
> -+ if (cfile -> warnings_occurred)
> -+ log_fatal("Cannot parse -C/-H/-F/-timeout/-V/-R
> configuration arguments !");
> -+ end_parse(&cfile);
> -+
> -+ if (timeout_arg) {
> -+ /* we just set the toplevel timeout, but per-client
> -+ * timeouts may still be at defaults.
> -+ */
> -+ for (ip=interfaces; ip; ip = ip->next) {
> -+ if (ip->client->config->timeout == 60)
> -+ ip->client->config->timeout =
> timeout_arg;
> -+ }
> -+ }
> -+
> -+ if ((dhclient_request_options != 0) &&
> (top_level_config.requested_options != default_requested_options)) {
> -+ for (ip=interfaces; ip; ip = ip->next) {
> -+ if (ip->client->config->requested_options ==
> default_requested_options)
> -+ ip->client->config-
> >requested_options = top_level_config.requested_options;
> -+ }
> -+ }
> -+
> -+ free(arg_conf);
> -+ arg_conf = NULL;
> -+ arg_conf_len = 0;
> -+ }
> -+
> - /* Parse the lease database. */
> - read_client_leases();
> -
> -@@ -756,6 +1006,10 @@ static void usage()
> - " [-s server-addr] [-cf config-file]\n"
> - " [-df duid-file] [-lf lease-file]\n"
> - " [-pf pid-file] [--no-pid] [-e VAR=val]\n"
> -+ " [-C <dhcp-client-identifier>] [-B]\n"
> -+ " [-H <host-name> | -F <fqdn.fqdn>] [-
> timeout <timeout>]\n"
> -+ " [-V <vendor-class-identifier>]\n"
> -+ " [-R <request option list>]\n"
> - " [-sf script-file] [interface]");
> - }
> -
> -@@ -2531,7 +2785,8 @@ void make_discover (client, lease)
> - client -> packet.xid = random ();
> - client -> packet.secs = 0; /* filled in by send_discover. */
> -
> -- if (can_receive_unicast_unconfigured (client -> interface))
> -+ if ((!(bootp_broadcast_always || client->config-
> >bootp_broadcast_always))
> -+ && can_receive_unicast_unconfigured(client->interface))
> - client -> packet.flags = 0;
> - else
> - client -> packet.flags = htons (BOOTP_BROADCAST);
> -@@ -2615,7 +2870,9 @@ void make_request (client, lease)
> - } else {
> - memset (&client -> packet.ciaddr, 0,
> - sizeof client -> packet.ciaddr);
> -- if (can_receive_unicast_unconfigured (client -> interface))
> -+ if ((!(bootp_broadcast_always ||
> -+ client ->config->bootp_broadcast_always)) &&
> -+ can_receive_unicast_unconfigured (client -> interface))
> - client -> packet.flags = 0;
> - else
> - client -> packet.flags = htons (BOOTP_BROADCAST);
> -@@ -2677,7 +2934,8 @@ void make_decline (client, lease)
> - client -> packet.hops = 0;
> - client -> packet.xid = client -> xid;
> - client -> packet.secs = 0; /* Filled in by send_request. */
> -- if (can_receive_unicast_unconfigured (client -> interface))
> -+ if ((!(bootp_broadcast_always || client->config->
> bootp_broadcast_always))
> -+ && can_receive_unicast_unconfigured (client->interface))
> - client -> packet.flags = 0;
> - else
> - client -> packet.flags = htons (BOOTP_BROADCAST);
> -diff -up dhcp-4.3.1b1/common/conflex.c.fLPqYB dhcp-4.3.1b1/common/conflex.c
> ---- dhcp-4.3.1b1/common/conflex.c.fLPqYB 2014-07-02 19:58:38.000000000
> +0200
> -+++ dhcp-4.3.1b1/common/conflex.c 2014-07-10 17:38:26.940599374 +0200
> -@@ -811,6 +811,8 @@ intern(char *atom, enum dhcp_token dfv)
> - return BALANCE;
> - if (!strcasecmp (atom + 1, "ound"))
> - return BOUND;
> -+ if (!strcasecmp (atom + 1, "ootp-broadcast-always"))
> -+ return BOOTP_BROADCAST_ALWAYS;
> - break;
> - case 'c':
> - if (!strcasecmp(atom + 1, "ase"))
> -diff -up dhcp-4.3.1b1/includes/dhcpd.h.fLPqYB dhcp-4.3.1b1/includes/dhcpd.h
> ---- dhcp-4.3.1b1/includes/dhcpd.h.fLPqYB 2014-07-02 19:58:39.000000000
> +0200
> -+++ dhcp-4.3.1b1/includes/dhcpd.h 2014-07-10 17:38:26.941599360 +0200
> -@@ -1152,6 +1152,9 @@ struct client_config {
> - int do_forward_update; /* If nonzero, and if we have
> the
> - information we need, update the
> - A record for the address we get.
> */
> -+
> -+ int bootp_broadcast_always; /* If nonzero, always set the
> BOOTP_BROADCAST
> -+ flag in requests */
> - };
> -
> - /* Per-interface state used in the dhcp client... */
> -diff -up dhcp-4.3.1b1/includes/dhctoken.h.fLPqYB dhcp-
> 4.3.1b1/includes/dhctoken.h
> ---- dhcp-4.3.1b1/includes/dhctoken.h.fLPqYB 2014-07-02
> 19:58:39.000000000 +0200
> -+++ dhcp-4.3.1b1/includes/dhctoken.h 2014-07-10 17:38:26.942599346
> +0200
> -@@ -367,7 +367,8 @@ enum dhcp_token {
> - TOKEN_INFINIBAND = 668,
> - POOL6 = 669,
> - V6RELAY = 670,
> -- V6RELOPT = 671
> -+ V6RELOPT = 671,
> -+ BOOTP_BROADCAST_ALWAYS = 672
> - };
> -
> - #define is_identifier(x) ((x) >= FIRST_TOKEN && \
> diff --git a/src/patches/dhcp/dhcp-errwarn-message.patch
> b/src/patches/dhcp/dhcp-errwarn-message.patch
> deleted file mode 100644
> index a65c2c2ed..000000000
> --- a/src/patches/dhcp/dhcp-errwarn-message.patch
> +++ /dev/null
> @@ -1,22 +0,0 @@
> -diff -up dhcp-4.3.0b1/omapip/errwarn.c.errwarn dhcp-4.3.0b1/omapip/errwarn.c
> ---- dhcp-4.3.0b1/omapip/errwarn.c.errwarn 2014-01-21
> 09:31:47.301334249 +0100
> -+++ dhcp-4.3.0b1/omapip/errwarn.c 2014-01-21 09:33:20.569039072 +0100
> -@@ -76,11 +76,13 @@ void log_fatal (const char * fmt, ... )
> - }
> -
> - log_error ("%s", "");
> -- log_error ("If you think you have received this message due to a bug
> rather");
> -- log_error ("than a configuration issue please read the section on
> submitting");
> -- log_error ("bugs on either our web page at www.isc.org or in the README
> file");
> -- log_error ("before submitting a bug. These pages explain the proper");
> -- log_error ("process and the information we find helpful for debugging..");
> -+ log_error ("This version of ISC DHCP is based on the release available");
> -+ log_error ("on ftp.isc.org. Features have been added and other changes");
> -+ log_error ("have been made to the base software release in order to
> make");
> -+ log_error ("it work better with this distribution.");
> -+ log_error ("%s", "");
> -+ log_error ("Please report for this software via the Red Hat Bugzilla
> site:");
> -+ log_error (" http://bugzilla.redhat.com");
> - log_error ("%s", "");
> - log_error ("exiting.");
> -
> diff --git a/src/patches/dhcp/dhcp-garbage-chars.patch
> b/src/patches/dhcp/dhcp-garbage-chars.patch
> deleted file mode 100644
> index 131360be6..000000000
> --- a/src/patches/dhcp/dhcp-garbage-chars.patch
> +++ /dev/null
> @@ -1,12 +0,0 @@
> -diff -up dhcp-4.3.0rc1/common/tables.c.garbage dhcp-4.3.0rc1/common/tables.c
> ---- dhcp-4.3.0rc1/common/tables.c.garbage 2014-01-29
> 10:03:52.132624677 +0100
> -+++ dhcp-4.3.0rc1/common/tables.c 2014-01-29 10:04:51.413875343 +0100
> -@@ -213,7 +213,7 @@ static struct option dhcp_options[] = {
> - { "name-service-search", "Sa", &dhcp_universe, 117, 1
> },
> - #endif
> - { "subnet-selection", "I", &dhcp_universe, 118, 1 },
> -- { "domain-search", "Dc", &dhcp_universe, 119, 1 },
> -+ { "domain-search", "D", &dhcp_universe, 119,
> 1 },
> - { "vivco", "Evendor-class.", &dhcp_universe, 124, 1
> },
> - { "vivso", "Evendor.", &dhcp_universe, 125, 1
> },
> - #if 0
> diff --git a/src/patches/dhcp/dhcp-gpxe-cid.patch b/src/patches/dhcp/dhcp-
> gpxe-cid.patch
> deleted file mode 100644
> index c8c2b84f9..000000000
> --- a/src/patches/dhcp/dhcp-gpxe-cid.patch
> +++ /dev/null
> @@ -1,73 +0,0 @@
> -diff -up dhcp-4.3.0a1/client/dhclient.c.gpxe-cid dhcp-
> 4.3.0a1/client/dhclient.c
> ---- dhcp-4.3.0a1/client/dhclient.c.gpxe-cid 2013-12-20
> 13:28:45.105048317 +0100
> -+++ dhcp-4.3.0a1/client/dhclient.c 2013-12-20 13:28:45.109048261 +0100
> -@@ -47,6 +47,14 @@
> - const char *path_dhclient_pid = NULL;
> - static char path_dhclient_script_array[] = _PATH_DHCLIENT_SCRIPT;
> - char *path_dhclient_script = path_dhclient_script_array;
> -+
> -+/* Default Prefix */
> -+static unsigned char default_prefix[12] = {
> -+ 0xff, 0x00, 0x00, 0x00,
> -+ 0x00, 0x00, 0x02, 0x00,
> -+ 0x00, 0x02, 0xc9, 0x00
> -+};
> -+
> - const char *path_dhclient_duid = NULL;
> -
> - /* False (default) => we write and use a pid file */
> -@@ -1253,6 +1260,12 @@ int find_subnet (struct subnet **sp,
> - static void setup_ib_interface(struct interface_info *ip)
> - {
> - struct group *g;
> -+ struct hardware *hw = &ip->hw_address;
> -+ char client_id[64];
> -+ char *arg_conf = NULL;
> -+ int arg_conf_len = 0;
> -+ isc_result_t status;
> -+ struct parse *cfile = (struct parse *)0;
> -
> - /* Set the broadcast flag */
> - ip->client->config->bootp_broadcast_always = 1;
> -@@ -1269,8 +1282,39 @@ static void setup_ib_interface(struct in
> - }
> - }
> -
> -- /* No client ID specified */
> -- log_fatal("dhcp-client-identifier must be specified for
> InfiniBand");
> -+ /*
> -+ * No client ID specified, make up one based on a default
> -+ * "prefix" and the port GUID.
> -+ *
> -+ * NOTE: This is compatible with what gpxe does.
> -+ */
> -+ sprintf(client_id,
> "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.
> 2x:%.2x:%.2x:%.2x:%.2x",
> -+ default_prefix[0], default_prefix[1], default_prefix[2],
> -+ default_prefix[3], default_prefix[4], default_prefix[5],
> -+ default_prefix[6], default_prefix[7], default_prefix[8],
> -+ default_prefix[9], default_prefix[10], default_prefix[11],
> -+ hw->hbuf[1], hw->hbuf[2], hw->hbuf[3], hw->hbuf[4],
> -+ hw->hbuf[5], hw->hbuf[6], hw->hbuf[7], hw->hbuf[8]);
> -+
> -+ arg_conf_len = asprintf(&arg_conf,
> -+ "send dhcp-client-identifier %s;",
> -+ client_id);
> -+
> -+ if ((arg_conf == 0) || (arg_conf_len <= 0))
> -+ log_fatal("Unable to send option dhcp-client-identifier");
> -+
> -+ status = new_parse(&cfile, -1, arg_conf, arg_conf_len,
> -+ "Automatic Infiniband client identifier", 0);
> -+
> -+ if ((status != ISC_R_SUCCESS) || (cfile->warnings_occurred))
> -+ log_fatal("Failed to parse Infiniband client identifier");
> -+
> -+ parse_client_statement(cfile, NULL, ip->client->config);
> -+
> -+ if (cfile->warnings_occurred)
> -+ log_fatal("Failed to parse Infiniband client identifier");
> -+
> -+ end_parse(&cfile);
> - }
> -
> - /* Individual States:
> diff --git a/src/patches/dhcp/dhcp-honor-expired.patch
> b/src/patches/dhcp/dhcp-honor-expired.patch
> deleted file mode 100644
> index bd892975b..000000000
> --- a/src/patches/dhcp/dhcp-honor-expired.patch
> +++ /dev/null
> @@ -1,49 +0,0 @@
> -diff -up dhcp-4.3.0a1/client/dhc6.c.honor-expired dhcp-4.3.0a1/client/dhc6.c
> ---- dhcp-4.3.0a1/client/dhc6.c.honor-expired 2013-12-19
> 16:00:28.062183037 +0100
> -+++ dhcp-4.3.0a1/client/dhc6.c 2013-12-19 16:00:28.076182842 +0100
> -@@ -1351,6 +1351,32 @@ start_info_request6(struct client_state
> - go_daemon();
> - }
> -
> -+/* Run through the addresses in lease and return true if there's any
> unexpired.
> -+ * Return false otherwise.
> -+ */
> -+isc_boolean_t
> -+unexpired_address_in_lease(struct dhc6_lease *lease)
> -+{
> -+ struct dhc6_ia *ia;
> -+ struct dhc6_addr *addr;
> -+
> -+ for (ia = lease->bindings ; ia != NULL ; ia = ia->next) {
> -+ for (addr = ia->addrs ; addr != NULL ; addr = addr->next) {
> -+ if (addr->flags & DHC6_ADDR_EXPIRED)
> -+ continue;
> -+
> -+ if (addr->starts + addr->max_life > cur_time) {
> -+ return ISC_TRUE;
> -+ }
> -+ }
> -+ }
> -+
> -+ log_info("PRC: Previous lease is devoid of active addresses."
> -+ " Re-initializing.");
> -+
> -+ return ISC_FALSE;
> -+}
> -+
> - /*
> - * start_confirm6() kicks off an "init-reboot" version of the process, at
> - * startup to find out if old bindings are 'fair' and at runtime whenever
> -@@ -1363,8 +1389,10 @@ start_confirm6(struct client_state *clie
> -
> - /* If there is no active lease, there is nothing to check. */
> - if ((client->active_lease == NULL) ||
> -- !active_prefix(client) ||
> -- client->active_lease->released) {
> -+ !active_prefix(client) ||
> -+ client->active_lease->released ||
> -+ !unexpired_address_in_lease(client->active_lease)) {
> -+ dhc6_lease_destroy(&client->active_lease, MDL);
> - start_init6(client);
> - return;
> - }
> diff --git a/src/patches/dhcp/dhcp-improved-xid.patch b/src/patches/dhcp/dhcp-
> improved-xid.patch
> deleted file mode 100644
> index eccff4987..000000000
> --- a/src/patches/dhcp/dhcp-improved-xid.patch
> +++ /dev/null
> @@ -1,138 +0,0 @@
> -diff -up dhcp-4.3.0a1/client/dhclient.c.improved-xid dhcp-
> 4.3.0a1/client/dhclient.c
> ---- dhcp-4.3.0a1/client/dhclient.c.improved-xid 2013-12-20
> 13:29:41.836260810 +0100
> -+++ dhcp-4.3.0a1/client/dhclient.c 2013-12-20 13:29:41.843260713 +0100
> -@@ -894,6 +894,26 @@ main(int argc, char **argv) {
> - }
> - }
> -
> -+ /* We create a backup seed before rediscovering interfaces in order
> to
> -+ have a seed built using all of the available interfaces
> -+ It's interesting if required interfaces doesn't let us defined
> -+ a really unique seed due to a lack of valid HW addr later
> -+ (this is the case with DHCP over IB)
> -+ We only use the last device as using a sum could broke the
> -+ uniqueness of the seed among multiple nodes
> -+ */
> -+ unsigned backup_seed = 0;
> -+ for (ip = interfaces; ip; ip = ip -> next) {
> -+ int junk;
> -+ if ( ip -> hw_address.hlen <= sizeof seed )
> -+ continue;
> -+ memcpy (&junk,
> -+ &ip -> hw_address.hbuf [ip -> hw_address.hlen -
> -+ sizeof seed], sizeof seed);
> -+ backup_seed = junk;
> -+ }
> -+
> -+
> - /* At this point, all the interfaces that the script thinks
> - are relevant should be running, so now we once again call
> - discover_interfaces(), and this time ask it to actually set
> -@@ -908,14 +928,36 @@ main(int argc, char **argv) {
> - Not much entropy, but we're booting, so we're not likely to
> - find anything better. */
> - seed = 0;
> -+ int seed_flag = 0;
> - for (ip = interfaces; ip; ip = ip->next) {
> - int junk;
> -+ if ( ip -> hw_address.hlen <= sizeof seed )
> -+ continue;
> - memcpy(&junk,
> - &ip->hw_address.hbuf[ip->hw_address.hlen -
> - sizeof seed], sizeof seed);
> - seed += junk;
> -+ seed_flag = 1;
> - }
> -- srandom(seed + cur_time + (unsigned)getpid());
> -+ if ( seed_flag == 0 ) {
> -+ if ( backup_seed != 0 ) {
> -+ seed = backup_seed;
> -+ log_info ("xid: rand init seed (0x%x) built using all"
> -+ " available interfaces",seed);
> -+ }
> -+ else {
> -+ seed = cur_time^((unsigned) gethostid()) ;
> -+ log_info ("xid: warning: no netdev with useable HWADDR
> found"
> -+ " for seed's uniqueness enforcement");
> -+ log_info ("xid: rand init seed (0x%x) built using
> gethostid",
> -+ seed);
> -+ }
> -+ /* we only use seed and no current time as a broadcast reply
> */
> -+ /* will certainly be used by the hwaddrless interface */
> -+ srandom(seed);
> -+ }
> -+ else
> -+ srandom(seed + cur_time + (unsigned)getpid());
> -
> - /* Setup specific Infiniband options */
> - for (ip = interfaces; ip; ip = ip->next) {
> -@@ -1460,7 +1502,7 @@ void dhcpack (packet)
> - return;
> - }
> -
> -- log_info ("DHCPACK from %s", piaddr (packet -> client_addr));
> -+ log_info ("DHCPACK from %s (xid=0x%x)", piaddr (packet ->
> client_addr), client -> xid);
> -
> - lease = packet_to_lease (packet, client);
> - if (!lease) {
> -@@ -2171,7 +2213,7 @@ void dhcpnak (packet)
> - return;
> - }
> -
> -- log_info ("DHCPNAK from %s", piaddr (packet -> client_addr));
> -+ log_info ("DHCPNAK from %s (xid=0x%x)", piaddr (packet ->
> client_addr), client -> xid);
> -
> - if (!client -> active) {
> - #if defined (DEBUG)
> -@@ -2298,10 +2340,10 @@ void send_discover (cpp)
> - client -> packet.secs = htons (65535);
> - client -> secs = client -> packet.secs;
> -
> -- log_info ("DHCPDISCOVER on %s to %s port %d interval %ld",
> -+ log_info ("DHCPDISCOVER on %s to %s port %d interval %ld
> (xid=0x%x)",
> - client -> name ? client -> name : client -> interface -> name,
> - inet_ntoa (sockaddr_broadcast.sin_addr),
> -- ntohs (sockaddr_broadcast.sin_port), (long)(client ->
> interval));
> -+ ntohs (sockaddr_broadcast.sin_port), (long)(client ->
> interval), client -> xid);
> -
> - /* Send out a packet. */
> - result = send_packet(client->interface, NULL, &client->packet,
> -@@ -2570,10 +2612,10 @@ void send_request (cpp)
> - client -> packet.secs = htons (65535);
> - }
> -
> -- log_info ("DHCPREQUEST on %s to %s port %d",
> -+ log_info ("DHCPREQUEST on %s to %s port %d (xid=0x%x)",
> - client -> name ? client -> name : client -> interface -> name,
> - inet_ntoa (destination.sin_addr),
> -- ntohs (destination.sin_port));
> -+ ntohs (destination.sin_port), client -> xid);
> -
> - if (destination.sin_addr.s_addr != INADDR_BROADCAST &&
> - fallback_interface) {
> -@@ -2613,10 +2655,10 @@ void send_decline (cpp)
> -
> - int result;
> -
> -- log_info ("DHCPDECLINE on %s to %s port %d",
> -+ log_info ("DHCPDECLINE on %s to %s port %d (xid=0x%x)",
> - client->name ? client->name : client->interface->name,
> - inet_ntoa(sockaddr_broadcast.sin_addr),
> -- ntohs(sockaddr_broadcast.sin_port));
> -+ ntohs(sockaddr_broadcast.sin_port), client -> xid);
> -
> - /* Send out a packet. */
> - result = send_packet(client->interface, NULL, &client->packet,
> -@@ -2659,10 +2701,10 @@ void send_release (cpp)
> - return;
> - }
> -
> -- log_info ("DHCPRELEASE on %s to %s port %d",
> -+ log_info ("DHCPRELEASE on %s to %s port %d (xid=0x%x)",
> - client -> name ? client -> name : client -> interface -> name,
> - inet_ntoa (destination.sin_addr),
> -- ntohs (destination.sin_port));
> -+ ntohs (destination.sin_port), client -> xid);
> -
> - if (fallback_interface) {
> - result = send_packet(fallback_interface, NULL, &client-
> >packet,
> diff --git a/src/patches/dhcp/dhcp-logpid.patch b/src/patches/dhcp/dhcp-
> logpid.patch
> deleted file mode 100644
> index e1a6ebdb5..000000000
> --- a/src/patches/dhcp/dhcp-logpid.patch
> +++ /dev/null
> @@ -1,11 +0,0 @@
> ---- expanded_org/client/dhclient.c Wed Aug 06 23:35:00 2014
> -+++ expanded_logpid/client/dhclient.c Mon Feb 16 13:35:31 2015
> -@@ -142,7 +142,7 @@
> - else if (fd != -1)
> - close(fd);
> -
> -- openlog("dhclient", DHCP_LOG_OPTIONS, LOG_DAEMON);
> -+ openlog("dhclient", LOG_NDELAY | LOG_PID, LOG_DAEMON);
> -
> - #if !(defined(DEBUG) || defined(__CYGWIN32__))
> - setlogmask(LOG_UPTO(LOG_INFO));
> diff --git a/src/patches/dhcp/dhcp-lpf-ib.patch b/src/patches/dhcp/dhcp-lpf-
> ib.patch
> deleted file mode 100644
> index 8e094d649..000000000
> --- a/src/patches/dhcp/dhcp-lpf-ib.patch
> +++ /dev/null
> @@ -1,585 +0,0 @@
> -diff -up dhcp-4.3.1b1/client/dhclient.c.bmgpWV dhcp-4.3.1b1/client/dhclient.c
> ---- dhcp-4.3.1b1/client/dhclient.c.bmgpWV 2014-07-10
> 17:50:26.922402550 +0200
> -+++ dhcp-4.3.1b1/client/dhclient.c 2014-07-10 17:53:43.629623477 +0200
> -@@ -114,6 +114,8 @@ static int check_domain_name_list(const
> - static int check_option_values(struct universe *universe, unsigned int opt,
> - const char *ptr, size_t len);
> -
> -+static void setup_ib_interface(struct interface_info *ip);
> -+
> - #ifndef UNIT_TEST
> - int
> - main(int argc, char **argv) {
> -@@ -937,6 +939,13 @@ main(int argc, char **argv) {
> - }
> - srandom(seed + cur_time + (unsigned)getpid());
> -
> -+ /* Setup specific Infiniband options */
> -+ for (ip = interfaces; ip; ip = ip->next) {
> -+ if (ip->client &&
> -+ (ip->hw_address.hbuf[0] == HTYPE_INFINIBAND)) {
> -+ setup_ib_interface(ip);
> -+ }
> -+ }
> -
> - /*
> - * Establish a default DUID. We always do so for v6 and
> -@@ -1230,6 +1239,29 @@ int find_subnet (struct subnet **sp,
> - return 0;
> - }
> -
> -+static void setup_ib_interface(struct interface_info *ip)
> -+{
> -+ struct group *g;
> -+
> -+ /* Set the broadcast flag */
> -+ ip->client->config->bootp_broadcast_always = 1;
> -+
> -+ /*
> -+ * Find out if a dhcp-client-identifier option was specified either
> -+ * in the config file or on the command line
> -+ */
> -+ for (g = ip->client->config->on_transmission; g != NULL; g = g-
> >next) {
> -+ if ((g->statements != NULL) &&
> -+ (strcmp(g->statements->data.option->option->name,
> -+ "dhcp-client-identifier") == 0)) {
> -+ return;
> -+ }
> -+ }
> -+
> -+ /* No client ID specified */
> -+ log_fatal("dhcp-client-identifier must be specified for
> InfiniBand");
> -+}
> -+
> - /* Individual States:
> - *
> - * Each routine is called from the dhclient_state_machine() in one of
> -diff -up dhcp-4.3.1b1/common/bpf.c.bmgpWV dhcp-4.3.1b1/common/bpf.c
> ---- dhcp-4.3.1b1/common/bpf.c.bmgpWV 2014-07-10 17:48:03.797424616
> +0200
> -+++ dhcp-4.3.1b1/common/bpf.c 2014-07-10 17:52:57.705272295 +0200
> -@@ -199,11 +199,44 @@ struct bpf_insn dhcp_bpf_filter [] = {
> - BPF_STMT(BPF_RET+BPF_K, 0),
> - };
> -
> -+/* Packet filter program for DHCP over Infiniband.
> -+ *
> -+ * XXX
> -+ * Changes to the filter program may require changes to the constant offsets
> -+ * used in lpf_gen_filter_setup to patch the port in the BPF program!
> -+ * XXX
> -+ */
> -+struct bpf_insn dhcp_ib_bpf_filter [] = {
> -+ /* Packet filter for Infiniband */
> -+ /* Make sure it's a UDP packet... */
> -+ BPF_STMT(BPF_LD + BPF_B + BPF_ABS, 9),
> -+ BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, IPPROTO_UDP, 0, 6),
> -+
> -+ /* Make sure this isn't a fragment... */
> -+ BPF_STMT(BPF_LD + BPF_H + BPF_ABS, 6),
> -+ BPF_JUMP(BPF_JMP + BPF_JSET + BPF_K, 0x1fff, 4, 0),
> -+
> -+ /* Get the IP header length... */
> -+ BPF_STMT(BPF_LDX + BPF_B + BPF_MSH, 0),
> -+
> -+ /* Make sure it's to the right port... */
> -+ BPF_STMT(BPF_LD + BPF_H + BPF_IND, 2),
> -+ BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, 67, 0, 1),
> -+
> -+ /* If we passed all the tests, ask for the whole packet. */
> -+ BPF_STMT(BPF_RET + BPF_K, (u_int)-1),
> -+
> -+ /* Otherwise, drop it. */
> -+ BPF_STMT(BPF_RET + BPF_K, 0),
> -+};
> -+
> - #if defined (DEC_FDDI)
> - struct bpf_insn *bpf_fddi_filter;
> - #endif
> -
> - int dhcp_bpf_filter_len = sizeof dhcp_bpf_filter / sizeof (struct bpf_insn);
> -+int dhcp_ib_bpf_filter_len = sizeof dhcp_ib_bpf_filter / sizeof (struct
> bpf_insn);
> -+
> - #if defined (HAVE_TR_SUPPORT)
> - struct bpf_insn dhcp_bpf_tr_filter [] = {
> - /* accept all token ring packets due to variable length header */
> -diff -up dhcp-4.3.1b1/common/lpf.c.bmgpWV dhcp-4.3.1b1/common/lpf.c
> ---- dhcp-4.3.1b1/common/lpf.c.bmgpWV 2014-07-10 17:48:03.797424616
> +0200
> -+++ dhcp-4.3.1b1/common/lpf.c 2014-07-10 17:52:57.706272281 +0200
> -@@ -46,6 +46,17 @@
> - #if defined (USE_LPF_RECEIVE) || defined (USE_LPF_HWADDR)
> - #include <sys/ioctl.h>
> - #include <net/if.h>
> -+#include <ifaddrs.h>
> -+
> -+/* Default broadcast address for IPoIB */
> -+static unsigned char default_ib_bcast_addr[20] = {
> -+ 0x00, 0xff, 0xff, 0xff,
> -+ 0xff, 0x12, 0x40, 0x1b,
> -+ 0x00, 0x00, 0x00, 0x00,
> -+ 0x00, 0x00, 0x00, 0x00,
> -+ 0xff, 0xff, 0xff, 0xff
> -+};
> -+
> - #endif
> -
> - #if defined (USE_LPF_SEND) || defined (USE_LPF_RECEIVE)
> -@@ -92,10 +103,21 @@ int if_register_lpf (info)
> - struct sockaddr common;
> - } sa;
> - struct ifreq ifr;
> -+ int type;
> -+ int protocol;
> -
> - /* Make an LPF socket. */
> -- if ((sock = socket(PF_PACKET, SOCK_RAW,
> -- htons((short)ETH_P_ALL))) < 0) {
> -+ get_hw_addr(info);
> -+
> -+ if (info->hw_address.hbuf[0] == HTYPE_INFINIBAND) {
> -+ type = SOCK_DGRAM;
> -+ protocol = ETHERTYPE_IP;
> -+ } else {
> -+ type = SOCK_RAW;
> -+ protocol = ETH_P_ALL;
> -+ }
> -+
> -+ if ((sock = socket(PF_PACKET, type, htons((short)protocol))) < 0) {
> - if (errno == ENOPROTOOPT || errno == EPROTONOSUPPORT ||
> - errno == ESOCKTNOSUPPORT || errno == EPFNOSUPPORT ||
> - errno == EAFNOSUPPORT || errno == EINVAL) {
> -@@ -118,6 +140,7 @@ int if_register_lpf (info)
> - /* Bind to the interface name */
> - memset (&sa, 0, sizeof sa);
> - sa.ll.sll_family = AF_PACKET;
> -+ sa.ll.sll_protocol = htons(protocol);
> - sa.ll.sll_ifindex = ifr.ifr_ifindex;
> - if (bind (sock, &sa.common, sizeof sa)) {
> - if (errno == ENOPROTOOPT || errno == EPROTONOSUPPORT ||
> -@@ -133,8 +156,6 @@ int if_register_lpf (info)
> - log_fatal ("Bind socket to interface: %m");
> - }
> -
> -- get_hw_addr(info->name, &info->hw_address);
> --
> - return sock;
> - }
> - #endif /* USE_LPF_SEND || USE_LPF_RECEIVE */
> -@@ -189,6 +210,8 @@ void if_deregister_send (info)
> - in bpf includes... */
> - extern struct sock_filter dhcp_bpf_filter [];
> - extern int dhcp_bpf_filter_len;
> -+extern struct sock_filter dhcp_ib_bpf_filter [];
> -+extern int dhcp_ib_bpf_filter_len;
> -
> - #if defined (HAVE_TR_SUPPORT)
> - extern struct sock_filter dhcp_bpf_tr_filter [];
> -@@ -206,11 +229,13 @@ void if_register_receive (info)
> - /* Open a LPF device and hang it on this interface... */
> - info -> rfdesc = if_register_lpf (info);
> -
> -- val = 1;
> -- if (setsockopt (info -> rfdesc, SOL_PACKET, PACKET_AUXDATA, &val,
> -- sizeof val) < 0) {
> -- if (errno != ENOPROTOOPT)
> -- log_fatal ("Failed to set auxiliary packet data:
> %m");
> -+ if (info->hw_address.hbuf[0] != HTYPE_INFINIBAND) {
> -+ val = 1;
> -+ if (setsockopt (info -> rfdesc, SOL_PACKET, PACKET_AUXDATA,
> -+ &val, sizeof val) < 0) {
> -+ if (errno != ENOPROTOOPT)
> -+ log_fatal ("Failed to set auxiliary packet
> data: %m");
> -+ }
> - }
> -
> - #if defined (HAVE_TR_SUPPORT)
> -@@ -256,15 +281,28 @@ static void lpf_gen_filter_setup (info)
> -
> - memset(&p, 0, sizeof(p));
> -
> -- /* Set up the bpf filter program structure. This is defined in
> -- bpf.c */
> -- p.len = dhcp_bpf_filter_len;
> -- p.filter = dhcp_bpf_filter;
> --
> -- /* Patch the server port into the LPF program...
> -- XXX changes to filter program may require changes
> -- to the insn number(s) used below! XXX */
> -- dhcp_bpf_filter [8].k = ntohs ((short)local_port);
> -+ if (info->hw_address.hbuf[0] == HTYPE_INFINIBAND) {
> -+ /* Set up the bpf filter program structure. */
> -+ p.len = dhcp_ib_bpf_filter_len;
> -+ p.filter = dhcp_ib_bpf_filter;
> -+
> -+ /* Patch the server port into the LPF program...
> -+ XXX
> -+ changes to filter program may require changes
> -+ to the insn number(s) used below!
> -+ XXX */
> -+ dhcp_ib_bpf_filter[6].k = ntohs ((short)local_port);
> -+ } else {
> -+ /* Set up the bpf filter program structure.
> -+ This is defined in bpf.c */
> -+ p.len = dhcp_bpf_filter_len;
> -+ p.filter = dhcp_bpf_filter;
> -+
> -+ /* Patch the server port into the LPF program...
> -+ XXX changes to filter program may require changes
> -+ to the insn number(s) used below! XXX */
> -+ dhcp_bpf_filter [8].k = ntohs ((short)local_port);
> -+ }
> -
> - if (setsockopt (info -> rfdesc, SOL_SOCKET, SO_ATTACH_FILTER, &p,
> - sizeof p) < 0) {
> -@@ -321,6 +359,54 @@ static void lpf_tr_filter_setup (info)
> - #endif /* USE_LPF_RECEIVE */
> -
> - #ifdef USE_LPF_SEND
> -+ssize_t send_packet_ib(interface, packet, raw, len, from, to, hto)
> -+ struct interface_info *interface;
> -+ struct packet *packet;
> -+ struct dhcp_packet *raw;
> -+ size_t len;
> -+ struct in_addr from;
> -+ struct sockaddr_in *to;
> -+ struct hardware *hto;
> -+{
> -+ unsigned ibufp = 0;
> -+ double ih [1536 / sizeof (double)];
> -+ unsigned char *buf = (unsigned char *)ih;
> -+ ssize_t result;
> -+
> -+ union sockunion {
> -+ struct sockaddr sa;
> -+ struct sockaddr_ll sll;
> -+ struct sockaddr_storage ss;
> -+ } su;
> -+
> -+ assemble_udp_ip_header (interface, buf, &ibufp, from.s_addr,
> -+ to->sin_addr.s_addr, to->sin_port,
> -+ (unsigned char *)raw, len);
> -+ memcpy (buf + ibufp, raw, len);
> -+
> -+ memset(&su, 0, sizeof(su));
> -+ su.sll.sll_family = AF_PACKET;
> -+ su.sll.sll_protocol = htons(ETHERTYPE_IP);
> -+
> -+ if (!(su.sll.sll_ifindex = if_nametoindex(interface->name))) {
> -+ errno = ENOENT;
> -+ log_error ("send_packet_ib: %m - failed to get if index");
> -+ return -1;
> -+ }
> -+
> -+ su.sll.sll_hatype = htons(HTYPE_INFINIBAND);
> -+ su.sll.sll_halen = sizeof(interface->bcast_addr);
> -+ memcpy(&su.sll.sll_addr, interface->bcast_addr, 20);
> -+
> -+ result = sendto(interface->wfdesc, buf, ibufp + len, 0,
> -+ &su.sa, sizeof(su));
> -+
> -+ if (result < 0)
> -+ log_error ("send_packet_ib: %m");
> -+
> -+ return result;
> -+}
> -+
> - ssize_t send_packet (interface, packet, raw, len, from, to, hto)
> - struct interface_info *interface;
> - struct packet *packet;
> -@@ -341,6 +427,11 @@ ssize_t send_packet (interface, packet,
> - return send_fallback (interface, packet, raw,
> - len, from, to, hto);
> -
> -+ if (interface->hw_address.hbuf[0] == HTYPE_INFINIBAND) {
> -+ return send_packet_ib(interface, packet, raw, len, from,
> -+ to, hto);
> -+ }
> -+
> - if (hto == NULL && interface->anycast_mac_addr.hlen)
> - hto = &interface->anycast_mac_addr;
> -
> -@@ -362,6 +453,42 @@ ssize_t send_packet (interface, packet,
> - #endif /* USE_LPF_SEND */
> -
> - #ifdef USE_LPF_RECEIVE
> -+ssize_t receive_packet_ib (interface, buf, len, from, hfrom)
> -+ struct interface_info *interface;
> -+ unsigned char *buf;
> -+ size_t len;
> -+ struct sockaddr_in *from;
> -+ struct hardware *hfrom;
> -+{
> -+ int length = 0;
> -+ int offset = 0;
> -+ unsigned char ibuf [1536];
> -+ unsigned bufix = 0;
> -+ unsigned paylen;
> -+
> -+ length = read(interface->rfdesc, ibuf, sizeof(ibuf));
> -+
> -+ if (length <= 0)
> -+ return length;
> -+
> -+ offset = decode_udp_ip_header(interface, ibuf, bufix, from,
> -+ (unsigned)length, &paylen, 0);
> -+
> -+ if (offset < 0)
> -+ return 0;
> -+
> -+ bufix += offset;
> -+ length -= offset;
> -+
> -+ if (length < paylen)
> -+ log_fatal("Internal inconsistency at %s:%d.", MDL);
> -+
> -+ /* Copy out the data in the packet... */
> -+ memcpy(buf, &ibuf[bufix], paylen);
> -+
> -+ return (ssize_t)paylen;
> -+}
> -+
> - ssize_t receive_packet (interface, buf, len, from, hfrom)
> - struct interface_info *interface;
> - unsigned char *buf;
> -@@ -388,6 +515,10 @@ ssize_t receive_packet (interface, buf,
> - };
> - struct cmsghdr *cmsg;
> -
> -+ if (interface->hw_address.hbuf[0] == HTYPE_INFINIBAND) {
> -+ return receive_packet_ib(interface, buf, len, from, hfrom);
> -+ }
> -+
> - length = recvmsg (interface -> rfdesc, &msg, 0);
> - if (length <= 0)
> - return length;
> -@@ -469,11 +600,33 @@ void maybe_setup_fallback ()
> - #endif
> -
> - #if defined (USE_LPF_RECEIVE) || defined (USE_LPF_HWADDR)
> --void
> --get_hw_addr(const char *name, struct hardware *hw) {
> -+struct sockaddr_ll *
> -+get_ll (struct ifaddrs *ifaddrs, struct ifaddrs **ifa, char *name)
> -+{
> -+ for (*ifa = ifaddrs; *ifa != NULL; *ifa = (*ifa)->ifa_next) {
> -+ if ((*ifa)->ifa_addr == NULL)
> -+ continue;
> -+
> -+ if ((*ifa)->ifa_addr->sa_family != AF_PACKET)
> -+ continue;
> -+
> -+ if ((*ifa)->ifa_flags & IFF_LOOPBACK)
> -+ continue;
> -+
> -+ if (strcmp((*ifa)->ifa_name, name) == 0)
> -+ return (struct sockaddr_ll *)(void *)(*ifa)-
> >ifa_addr;
> -+ }
> -+ *ifa = NULL;
> -+ return NULL;
> -+}
> -+
> -+struct sockaddr_ll *
> -+ioctl_get_ll(char *name)
> -+{
> - int sock;
> - struct ifreq tmp;
> -- struct sockaddr *sa;
> -+ struct sockaddr *sa = NULL;
> -+ struct sockaddr_ll *sll = NULL;
> -
> - if (strlen(name) >= sizeof(tmp.ifr_name)) {
> - log_fatal("Device name too long: \"%s\"", name);
> -@@ -487,16 +640,62 @@ get_hw_addr(const char *name, struct har
> - memset(&tmp, 0, sizeof(tmp));
> - strcpy(tmp.ifr_name, name);
> - if (ioctl(sock, SIOCGIFHWADDR, &tmp) < 0) {
> -- log_fatal("Error getting hardware address for \"%s\": %m",
> -+ log_fatal("Error getting hardware address for \"%s\": %m",
> - name);
> - }
> -+ close(sock);
> -
> - sa = &tmp.ifr_hwaddr;
> -- switch (sa->sa_family) {
> -+ // needs to be freed outside this function
> -+ sll = dmalloc (sizeof (struct sockaddr_ll), MDL);
> -+ if (!sll)
> -+ log_fatal("Unable to allocate memory for link layer
> address");
> -+ memcpy(&sll->sll_hatype, &sa->sa_family, sizeof (sll->sll_hatype));
> -+ memcpy(sll->sll_addr, sa->sa_data, sizeof (sll->sll_addr));
> -+ switch (sll->sll_hatype) {
> -+ case ARPHRD_INFINIBAND:
> -+ /* ioctl limits hardware addresses to 8 bytes */
> -+ sll->sll_halen = 8;
> -+ break;
> -+ default:
> -+ break;
> -+ }
> -+ return sll;
> -+}
> -+
> -+void
> -+get_hw_addr(struct interface_info *info)
> -+{
> -+ struct hardware *hw = &info->hw_address;
> -+ char *name = info->name;
> -+ struct ifaddrs *ifaddrs = NULL;
> -+ struct ifaddrs *ifa = NULL;
> -+ struct sockaddr_ll *sll = NULL;
> -+ int sll_allocated = 0;
> -+ char *dup = NULL;
> -+ char *colon = NULL;
> -+
> -+ if (getifaddrs(&ifaddrs) == -1)
> -+ log_fatal("Failed to get interfaces");
> -+
> -+ if ((sll = get_ll(ifaddrs, &ifa, name)) == NULL) {
> -+ /*
> -+ * We were unable to get link-layer address for name.
> -+ * Fall back to ioctl(SIOCGIFHWADDR).
> -+ */
> -+ sll = ioctl_get_ll(name);
> -+ if (sll != NULL)
> -+ sll_allocated = 1;
> -+ else
> -+ // shouldn't happen
> -+ log_fatal("Unexpected internal error");
> -+ }
> -+
> -+ switch (sll->sll_hatype) {
> - case ARPHRD_ETHER:
> - hw->hlen = 7;
> - hw->hbuf[0] = HTYPE_ETHER;
> -- memcpy(&hw->hbuf[1], sa->sa_data, 6);
> -+ memcpy(&hw->hbuf[1], sll->sll_addr, 6);
> - break;
> - case ARPHRD_IEEE802:
> - #ifdef ARPHRD_IEEE802_TR
> -@@ -504,18 +703,48 @@ get_hw_addr(const char *name, struct har
> - #endif /* ARPHRD_IEEE802_TR */
> - hw->hlen = 7;
> - hw->hbuf[0] = HTYPE_IEEE802;
> -- memcpy(&hw->hbuf[1], sa->sa_data, 6);
> -+ memcpy(&hw->hbuf[1], sll->sll_addr, 6);
> - break;
> - case ARPHRD_FDDI:
> - hw->hlen = 7;
> - hw->hbuf[0] = HTYPE_FDDI;
> -- memcpy(&hw->hbuf[1], sa->sa_data, 6);
> -+ memcpy(&hw->hbuf[1], sll->sll_addr, 6);
> -+ break;
> -+ case ARPHRD_INFINIBAND:
> -+ dup = strdup(name);
> -+ /* Aliased infiniband interface is special case
> where
> -+ * neither get_ll() nor ioctl_get_ll() get's correct
> hw
> -+ * address, so we have to truncate the :0 and run
> -+ * get_ll() again for the rest.
> -+ */
> -+ if ((colon = strchr(dup, ':')) != NULL) {
> -+ *colon = '\0';
> -+ if ((sll = get_ll(ifaddrs, &ifa, dup)) ==
> NULL)
> -+ log_fatal("Error getting hardware
> address for \"%s\": %m", name);
> -+ }
> -+ free (dup);
> -+ /* For Infiniband, save the broadcast address and
> store
> -+ * the port GUID into the hardware address.
> -+ */
> -+ if (ifa && (ifa->ifa_flags & IFF_BROADCAST)) {
> -+ struct sockaddr_ll *bll;
> -+
> -+ bll = (struct sockaddr_ll *)ifa-
> >ifa_broadaddr;
> -+ memcpy(&info->bcast_addr, bll->sll_addr,
> 20);
> -+ } else {
> -+ memcpy(&info->bcast_addr,
> default_ib_bcast_addr,
> -+ 20);
> -+ }
> -+
> -+ hw->hlen = 1;
> -+ hw->hbuf[0] = HTYPE_INFINIBAND;
> -+ memcpy(&hw->hbuf[1], &sll->sll_addr[sll->sll_halen -
> 8], 8);
> - break;
> - #if defined(ARPHRD_PPP)
> - case ARPHRD_PPP:
> - if (local_family != AF_INET6)
> -- log_fatal("Unsupported device type %d for
> \"%s\"",
> -- sa->sa_family, name);
> -+ log_fatal("local_family != AF_INET6 for
> \"%s\"",
> -+ name);
> - hw->hlen = 0;
> - hw->hbuf[0] = HTYPE_RESERVED;
> - /* 0xdeadbeef should never occur on the wire,
> -@@ -528,10 +757,13 @@ get_hw_addr(const char *name, struct har
> - break;
> - #endif
> - default:
> -- log_fatal("Unsupported device type %ld for \"%s\"",
> -- (long int)sa->sa_family, name);
> -+ freeifaddrs(ifaddrs);
> -+ log_fatal("Unsupported device type %hu for \"%s\"",
> -+ sll->sll_hatype, name);
> - }
> -
> -- close(sock);
> -+ if (sll_allocated)
> -+ dfree(sll, MDL);
> -+ freeifaddrs(ifaddrs);
> - }
> - #endif
> -diff -up dhcp-4.3.1b1/common/socket.c.bmgpWV dhcp-4.3.1b1/common/socket.c
> ---- dhcp-4.3.1b1/common/socket.c.bmgpWV 2014-07-02 19:58:38.000000000
> +0200
> -+++ dhcp-4.3.1b1/common/socket.c 2014-07-10 17:52:57.706272281 +0200
> -@@ -322,7 +322,7 @@ void if_register_send (info)
> - info->wfdesc = if_register_socket(info, AF_INET, 0, NULL);
> - /* If this is a normal IPv4 address, get the hardware address. */
> - if (strcmp(info->name, "fallback") != 0)
> -- get_hw_addr(info->name, &info->hw_address);
> -+ get_hw_addr(info);
> - #if defined (USE_SOCKET_FALLBACK)
> - /* Fallback only registers for send, but may need to receive as
> - well. */
> -@@ -385,7 +385,7 @@ void if_register_receive (info)
> - #endif /* IP_PKTINFO... */
> - /* If this is a normal IPv4 address, get the hardware address. */
> - if (strcmp(info->name, "fallback") != 0)
> -- get_hw_addr(info->name, &info->hw_address);
> -+ get_hw_addr(info);
> -
> - if (!quiet_interface_discovery)
> - log_info ("Listening on Socket/%s%s%s",
> -@@ -499,7 +499,7 @@ if_register6(struct interface_info *info
> - if (req_multi)
> - if_register_multicast(info);
> -
> -- get_hw_addr(info->name, &info->hw_address);
> -+ get_hw_addr(info);
> -
> - if (!quiet_interface_discovery) {
> - if (info->shared_network != NULL) {
> -@@ -555,7 +555,7 @@ if_register_linklocal6(struct interface_
> - info->rfdesc = sock;
> - info->wfdesc = sock;
> -
> -- get_hw_addr(info->name, &info->hw_address);
> -+ get_hw_addr(info);
> -
> - if (!quiet_interface_discovery) {
> - if (info->shared_network != NULL) {
> -diff -up dhcp-4.3.1b1/includes/dhcpd.h.bmgpWV dhcp-4.3.1b1/includes/dhcpd.h
> ---- dhcp-4.3.1b1/includes/dhcpd.h.bmgpWV 2014-07-10 17:50:26.923402536
> +0200
> -+++ dhcp-4.3.1b1/includes/dhcpd.h 2014-07-10 17:52:57.707272266 +0200
> -@@ -1248,6 +1248,7 @@ struct interface_info {
> - struct shared_network *shared_network;
> - /* Networks connected to this interface. */
> - struct hardware hw_address; /* Its physical address. */
> -+ u_int8_t bcast_addr[20]; /* Infiniband broadcast address */
> - struct in_addr *addresses; /* Addresses associated with this
> - * interface.
> - */
> -@@ -2439,7 +2440,7 @@ void print_dns_status (int, struct dhcp_
> - #endif
> - const char *print_time(TIME);
> -
> --void get_hw_addr(const char *name, struct hardware *hw);
> -+void get_hw_addr(struct interface_info *info);
> -
> - /* socket.c */
> - #if defined (USE_SOCKET_SEND) || defined (USE_SOCKET_RECEIVE) \
> diff --git a/src/patches/dhcp/dhcp-manpages.patch b/src/patches/dhcp/dhcp-
> manpages.patch
> deleted file mode 100644
> index dde16c735..000000000
> --- a/src/patches/dhcp/dhcp-manpages.patch
> +++ /dev/null
> @@ -1,157 +0,0 @@
> -diff -up dhcp-4.3.0a1/client/dhclient-script.8.man dhcp-
> 4.3.0a1/client/dhclient-script.8
> ---- dhcp-4.3.0a1/client/dhclient-script.8.man 2013-12-11
> 01:01:02.000000000 +0100
> -+++ dhcp-4.3.0a1/client/dhclient-script.8 2013-12-19
> 15:27:17.617118805 +0100
> -@@ -48,7 +48,7 @@ customizations are needed, they should b
> - exit hooks provided (see HOOKS for details). These hooks will allow the
> - user to override the default behaviour of the client in creating a
> - .B /etc/resolv.conf
> --file.
> -+file, and to handle DHCP options not handled by default.
> - .PP
> - No standard client script exists for some operating systems, even though
> - the actual client may work, so a pioneering user may well need to create
> -@@ -92,6 +92,26 @@ present. The
> - .B ETCDIR/dhclient-exit-hooks
> - script can modify the valid of exit_status to change the exit status
> - of dhclient-script.
> -+.PP
> -+Immediately after dhclient brings an interface UP with a new IP address,
> -+subnet mask, and routes, in the REBOOT/BOUND states, it will check for the
> -+existence of an executable
> -+.B ETCDIR/dhclient-up-hooks
> -+script, and source it if found. This script can handle DHCP options in
> -+the environment that are not handled by default. A per-interface.
> -+.B ETCDIR/dhclient-${IF}-up-hooks
> -+script will override the generic script and be sourced when interface
> -+$IF has been brought up.
> -+.PP
> -+Immediately before dhclient brings an interface DOWN, removing its IP
> -+address, subnet mask, and routes, in the STOP/RELEASE states, it will
> -+check for the existence of an executable
> -+.B ETCDIR/dhclient-down-hooks
> -+script, and source it if found. This script can handle DHCP options in
> -+the environment that are not handled by default. A per-interface
> -+.B ETCDIR/dhclient-${IF}-down-hooks
> -+script will override the generic script and be sourced when interface
> -+$IF is about to be brought down.
> - .SH OPERATION
> - When dhclient needs to invoke the client configuration script, it
> - defines a set of variables in the environment, and then invokes
> -diff -up dhcp-4.3.0a1/client/dhclient.conf.5.man dhcp-
> 4.3.0a1/client/dhclient.conf.5
> ---- dhcp-4.3.0a1/client/dhclient.conf.5.man 2013-12-11
> 01:01:02.000000000 +0100
> -+++ dhcp-4.3.0a1/client/dhclient.conf.5 2013-12-19 15:27:17.617118805
> +0100
> -@@ -202,7 +202,8 @@ responding to the client send the client
> - options. Only the option names should be specified in the request
> - statement - not option parameters. By default, the DHCPv4 client
> - requests the subnet-mask, broadcast-address, time-offset, routers,
> --domain-name, domain-name-servers and host-name options while the DHCPv6
> -+domain-search, domain-name, domain-name-servers, host-name, nis-domain,
> -+nis-servers, ntp-servers and interface-mtu options while the DHCPv6
> - client requests the dhcp6 name-servers and domain-search options. Note
> - that if you enter a \'request\' statement, you over-ride these defaults
> - and these options will not be requested.
> -@@ -688,6 +689,17 @@ know the DHCP service(s) anycast MAC add
> - client. The \fIlink-type\fR and \fImac-address\fR parameters are configured
> - in a similar manner to the \fBhardware\fR statement.
> - .PP
> -+ \fBbootp-broadcast-always;\fR
> -+.PP
> -+The
> -+.B bootp-broadcast-always
> -+statement instructs dhclient to always set the bootp broadcast flag in
> -+request packets, so that servers will always broadcast replies.
> -+This is equivalent to supplying the dhclient -B argument, and has
> -+the same effect as specifying 'always-broadcast' in the server's dhcpd.conf.
> -+This option is provided as an extension to enable dhclient to work
> -+on IBM s390 Linux guests.
> -+.PP
> - .SH SAMPLE
> - The following configuration file is used on a laptop running NetBSD
> - 1.3. The laptop has an IP alias of 192.5.5.213, and has one
> -@@ -713,7 +725,7 @@ interface "ep0" {
> - supersede domain-search "fugue.com", "rc.vix.com", "home.vix.com";
> - prepend domain-name-servers 127.0.0.1;
> - request subnet-mask, broadcast-address, time-offset, routers,
> -- domain-name, domain-name-servers, host-name;
> -+ domain-search, domain-name, domain-name-servers, host-name;
> - require subnet-mask, domain-name-servers;
> - script "CLIENTBINDIR/dhclient-script";
> - media "media 10baseT/UTP", "media 10base2/BNC";
> -diff -up dhcp-4.3.0a1/common/dhcp-options.5.man dhcp-4.3.0a1/common/dhcp-
> options.5
> ---- dhcp-4.3.0a1/common/dhcp-options.5.man 2013-12-11
> 01:25:12.000000000 +0100
> -+++ dhcp-4.3.0a1/common/dhcp-options.5 2013-12-19 15:27:17.618118791
> +0100
> -@@ -914,6 +914,21 @@ classless IP routing - it does not inclu
> - classless IP routing is now the most widely deployed routing standard,
> - this option is virtually useless, and is not implemented by any of the
> - popular DHCP clients, for example the Microsoft DHCP client.
> -+.PP
> -+NOTE to Fedora dhclient users:
> -+.br
> -+dhclient-script interprets trailing 0 octets of the target as indicating
> -+the subnet class of the route, so for the following static-routes value:
> -+.br
> -+ option static-routes 172.0.0.0 172.16.2.254,
> -+.br
> -+ 192.168.0.0 192.168.2.254;
> -+.br
> -+dhclient-script will create routes:
> -+.br
> -+ 172/8 via 172.16.2.254 dev $interface
> -+.br
> -+ 192.168/16 via 192.168.2.254 dev $interface
> - .RE
> - .PP
> - .nf
> -diff -up dhcp-4.3.0a1/server/dhcpd.conf.5.man dhcp-
> 4.3.0a1/server/dhcpd.conf.5
> ---- dhcp-4.3.0a1/server/dhcpd.conf.5.man 2013-12-13 21:49:44.000000000
> +0100
> -+++ dhcp-4.3.0a1/server/dhcpd.conf.5 2013-12-19 15:30:14.266670962
> +0100
> -@@ -527,6 +527,9 @@ pool {
> - };
> - .fi
> - .PP
> -+Dynamic BOOTP leases are not compatible with failover, and, as such,
> -+you need to disallow BOOTP in pools that you are using failover for.
> -+.PP
> - The server currently does very little sanity checking, so if you
> - configure it wrong, it will just fail in odd ways. I would recommend
> - therefore that you either do failover or don't do failover, but don't
> -@@ -541,9 +544,9 @@ primary server might look like this:
> - failover peer "foo" {
> - primary;
> - address anthrax.rc.vix.com;
> -- port 519;
> -+ port 647;
> - peer address trantor.rc.vix.com;
> -- peer port 520;
> -+ peer port 847;
> - max-response-delay 60;
> - max-unacked-updates 10;
> - mclt 3600;
> -@@ -1241,7 +1244,7 @@ the zone containing PTR records - for IS
> - .PP
> - .nf
> - key DHCP_UPDATER {
> -- algorithm HMAC-MD5.SIG-ALG.REG.INT;
> -+ algorithm hmac-md5;
> - secret pRP5FapFoJ95JEL06sv4PQ==;
> - };
> -
> -@@ -1264,7 +1267,7 @@ dhcpd.conf file:
> - .PP
> - .nf
> - key DHCP_UPDATER {
> -- algorithm HMAC-MD5.SIG-ALG.REG.INT;
> -+ algorithm hmac-md5;
> - secret pRP5FapFoJ95JEL06sv4PQ==;
> - };
> -
> -@@ -2539,7 +2542,8 @@ statement
> - The \fInext-server\fR statement is used to specify the host address of
> - the server from which the initial boot file (specified in the
> - \fIfilename\fR statement) is to be loaded. \fIServer-name\fR should
> --be a numeric IP address or a domain name.
> -+be a numeric IP address or a domain name. If no \fInext-server\fR statement
> -+applies to a given client, the address 0.0.0.0 is used.
> - .RE
> - .PP
> - The
> diff --git a/src/patches/dhcp/dhcp-paranoia.patch b/src/patches/dhcp/dhcp-
> paranoia.patch
> deleted file mode 100644
> index 0f2db8c18..000000000
> --- a/src/patches/dhcp/dhcp-paranoia.patch
> +++ /dev/null
> @@ -1,156 +0,0 @@
> -diff -up dhcp-4.3.1b1/client/dhclient.c.dlTsyN dhcp-4.3.1b1/client/dhclient.c
> ---- dhcp-4.3.1b1/client/dhclient.c.dlTsyN 2014-07-10
> 17:49:49.882925843 +0200
> -+++ dhcp-4.3.1b1/client/dhclient.c 2014-07-10 17:50:26.922402550 +0200
> -@@ -1748,11 +1748,6 @@ int write_host (host)
> - return 0;
> - }
> -
> --void db_startup (testp)
> -- int testp;
> --{
> --}
> --
> - void bootp (packet)
> - struct packet *packet;
> - {
> -diff -up dhcp-4.3.1b1/includes/dhcpd.h.dlTsyN dhcp-4.3.1b1/includes/dhcpd.h
> ---- dhcp-4.3.1b1/includes/dhcpd.h.dlTsyN 2014-07-10 17:48:03.798424601
> +0200
> -+++ dhcp-4.3.1b1/includes/dhcpd.h 2014-07-10 17:50:26.923402536 +0200
> -@@ -2866,7 +2866,11 @@ void commit_leases_timeout (void *);
> - void commit_leases_readerdry(void *);
> - int commit_leases (void);
> - int commit_leases_timed (void);
> -+#if defined (PARANOIA)
> -+void db_startup (int, uid_t, gid_t);
> -+#else
> - void db_startup (int);
> -+#endif /* PARANOIA */
> - int new_lease_file (void);
> - int group_writer (struct group_object *);
> - int write_ia(const struct ia_xx *);
> -diff -up dhcp-4.3.1b1/server/confpars.c.dlTsyN dhcp-4.3.1b1/server/confpars.c
> ---- dhcp-4.3.1b1/server/confpars.c.dlTsyN 2014-07-10
> 17:39:25.801764596 +0200
> -+++ dhcp-4.3.1b1/server/confpars.c 2014-07-10 17:50:26.924402522 +0200
> -@@ -219,7 +219,11 @@ void trace_conf_input (trace_type_t *tty
> - }
> -
> - if (!leaseconf_initialized && ttype == trace_readleases_type) {
> -+#if defined (PARANOIA)
> -+ db_startup (0, 0, 0);
> -+#else
> - db_startup (0);
> -+#endif /* PARANOIA */
> - leaseconf_initialized = 1;
> - postdb_startup ();
> - }
> -diff -up dhcp-4.3.1b1/server/db.c.dlTsyN dhcp-4.3.1b1/server/db.c
> ---- dhcp-4.3.1b1/server/db.c.dlTsyN 2014-07-10 17:39:25.801764596
> +0200
> -+++ dhcp-4.3.1b1/server/db.c 2014-07-10 17:50:26.925402508 +0200
> -@@ -42,6 +42,10 @@ static int counting = 0;
> - static int count = 0;
> - TIME write_time;
> - int lease_file_is_corrupt = 0;
> -+#if defined (PARANOIA)
> -+uid_t global_set_uid = 0;
> -+gid_t global_set_gid = 0;
> -+#endif /* PARANOIA */
> -
> - /* Write a single binding scope value in parsable format.
> - */
> -@@ -1046,8 +1050,11 @@ int commit_leases_timed()
> - return (1);
> - }
> -
> --void db_startup (testp)
> -- int testp;
> -+#if defined (PARANOIA)
> -+void db_startup (int testp, uid_t set_uid, gid_t set_gid)
> -+#else
> -+void db_startup (int testp)
> -+#endif /* PARANOIA */
> - {
> - isc_result_t status;
> -
> -@@ -1066,6 +1073,11 @@ void db_startup (testp)
> - }
> - #endif
> -
> -+#if defined (PARANOIA)
> -+ global_set_uid = set_uid;
> -+ global_set_gid = set_gid;
> -+#endif /* PARANOIA */
> -+
> - #if defined (TRACING)
> - /* If we're playing back, there is no lease file, so we can't
> - append it, so we create one immediately (maybe this isn't
> -@@ -1128,6 +1140,17 @@ int new_lease_file ()
> - log_error ("Can't create new lease file: %m");
> - return 0;
> - }
> -+
> -+#if defined (PARANOIA)
> -+ if (global_set_uid && !geteuid() &&
> -+ global_set_gid && !getegid())
> -+ if (fchown(db_fd, global_set_uid, global_set_gid)) {
> -+ log_fatal ("Can't chown new lease file: %m");
> -+ close(db_fd);
> -+ goto fdfail;
> -+ }
> -+#endif /* PARANOIA */
> -+
> - if ((new_db_file = fdopen(db_fd, "we")) == NULL) {
> - log_error("Can't fdopen new lease file: %m");
> - close(db_fd);
> -diff -up dhcp-4.3.1b1/server/dhcpd.8.dlTsyN dhcp-4.3.1b1/server/dhcpd.8
> ---- dhcp-4.3.1b1/server/dhcpd.8.dlTsyN 2014-07-02 19:58:39.000000000
> +0200
> -+++ dhcp-4.3.1b1/server/dhcpd.8 2014-07-10 17:50:26.925402508 +0200
> -@@ -82,6 +82,18 @@ dhcpd - Dynamic Host Configuration Proto
> - .I trace-output-file
> - ]
> - [
> -+.B -user
> -+.I user
> -+]
> -+[
> -+.B -group
> -+.I group
> -+]
> -+[
> -+.B -chroot
> -+.I dir
> -+]
> -+[
> - .B -play
> - .I trace-playback-file
> - ]
> -@@ -269,6 +281,15 @@ lease file.
> - .TP
> - .BI --version
> - Print version number and exit.
> -+.TP
> -+.BI \-user \ user
> -+Setuid to user after completing privileged operations, such as creating
> sockets that listen on privileged ports.
> -+.TP
> -+.BI \-group \ group
> -+Setgid to group after completing privileged operations, such as creating
> sockets that listen on privileged ports.
> -+.TP
> -+.BI \-chroot \ dir
> -+Chroot to directory after processing the command line arguments, but before
> reading the configuration file.
> - .PP
> - .I Modifying default file locations:
> - The following options can be used to modify the locations
> -diff -up dhcp-4.3.1b1/server/dhcpd.c.dlTsyN dhcp-4.3.1b1/server/dhcpd.c
> ---- dhcp-4.3.1b1/server/dhcpd.c.dlTsyN 2014-07-10 17:39:25.802764582
> +0200
> -+++ dhcp-4.3.1b1/server/dhcpd.c 2014-07-10 17:52:35.341588248 +0200
> -@@ -628,7 +628,11 @@ main(int argc, char **argv) {
> - group_write_hook = group_writer;
> -
> - /* Start up the database... */
> -+#if defined (PARANOIA)
> -+ db_startup (lftest, set_uid, set_gid);
> -+#else
> - db_startup (lftest);
> -+#endif /* PARANOIA */
> -
> - if (lftest)
> - exit (0);
> diff --git a/src/patches/dhcp/dhcp-paths.patch b/src/patches/dhcp/dhcp-
> paths.patch
> deleted file mode 100644
> index 2f43e51fe..000000000
> --- a/src/patches/dhcp/dhcp-paths.patch
> +++ /dev/null
> @@ -1,44 +0,0 @@
> ---- expanded_org/includes/dhcpd.h Wed Aug 06 23:35:02 2014
> -+++ expanded_patched_51_4_2_0_paths_patch/includes/dhcpd.h Mon Feb 16
> 13:22:11 2015
> -@@ -1424,15 +1424,15 @@
> - #else /* !DEBUG */
> -
> - #ifndef _PATH_DHCPD_CONF
> --#define _PATH_DHCPD_CONF "/etc/dhcpd.conf"
> -+#define _PATH_DHCPD_CONF "/etc/dhcp/dhcpd.conf"
> - #endif /* DEBUG */
> -
> - #ifndef _PATH_DHCPD_DB
> --#define _PATH_DHCPD_DB LOCALSTATEDIR"/db/dhcpd.leases"
> -+#define _PATH_DHCPD_DB LOCALSTATEDIR"/dhcpd/dhcpd.leases"
> - #endif
> -
> - #ifndef _PATH_DHCPD6_DB
> --#define _PATH_DHCPD6_DB LOCALSTATEDIR"/db/dhcpd6.leases"
> -+#define _PATH_DHCPD6_DB LOCALSTATEDIR"/dhcpd/dhcpd6.leases"
> - #endif
> -
> - #ifndef _PATH_DHCPD_PID
> -@@ -1446,7 +1446,7 @@
> - #endif /* DEBUG */
> -
> - #ifndef _PATH_DHCLIENT_CONF
> --#define _PATH_DHCLIENT_CONF "/etc/dhclient.conf"
> -+#define _PATH_DHCLIENT_CONF "/etc/dhcp/dhclient.conf"
> - #endif
> -
> - #ifndef _PATH_DHCLIENT_SCRIPT
> -@@ -1462,11 +1462,11 @@
> - #endif
> -
> - #ifndef _PATH_DHCLIENT_DB
> --#define _PATH_DHCLIENT_DB LOCALSTATEDIR"/db/dhclient.leases"
> -+#define _PATH_DHCLIENT_DB LOCALSTATEDIR"/dhclient/dhclient.leases"
> - #endif
> -
> - #ifndef _PATH_DHCLIENT6_DB
> --#define _PATH_DHCLIENT6_DB LOCALSTATEDIR"/db/dhclient6.leases"
> -+#define _PATH_DHCLIENT6_DB LOCALSTATEDIR"/dhclient/dhclient6.leases"
> - #endif
> -
> - #ifndef _PATH_RESOLV_CONF
> diff --git a/src/patches/dhcp/dhcp-release-by-ifup.patch
> b/src/patches/dhcp/dhcp-release-by-ifup.patch
> deleted file mode 100644
> index 677eb5c75..000000000
> --- a/src/patches/dhcp/dhcp-release-by-ifup.patch
> +++ /dev/null
> @@ -1,85 +0,0 @@
> -diff -up dhcp-4.3.0a1/client/dhclient.c.ifup dhcp-4.3.0a1/client/dhclient.c
> ---- dhcp-4.3.0a1/client/dhclient.c.ifup 2013-12-19 14:53:08.817760677
> +0100
> -+++ dhcp-4.3.0a1/client/dhclient.c 2013-12-19 15:05:16.290518574 +0100
> -@@ -521,9 +521,81 @@ main(int argc, char **argv) {
> - }
> - }
> - fclose(pidfd);
> -+ } else {
> -+ /* handle release for interfaces requested with Red
> Hat
> -+ * /sbin/ifup - pidfile will be /var/run/dhclient-
> $interface.pid
> -+ */
> -+
> -+ if ((path_dhclient_pid == NULL) ||
> (*path_dhclient_pid == '\0'))
> -+ path_dhclient_pid = "/var/run/dhclient.pid";
> -+
> -+ char *new_path_dhclient_pid;
> -+ struct interface_info *ip;
> -+ int pdp_len = strlen(path_dhclient_pid), pfx, dpfx;
> -+
> -+ /* find append point: beginning of any trailing
> '.pid'
> -+ * or '-$IF.pid' */
> -+ for (pfx=pdp_len; (pfx >= 0) &&
> (path_dhclient_pid[pfx] != '.') && (path_dhclient_pid[pfx] != '/'); pfx--);
> -+ if (pfx == -1)
> -+ pfx = pdp_len;
> -+
> -+ if (path_dhclient_pid[pfx] == '/')
> -+ pfx += 1;
> -+
> -+ for (dpfx=pfx; (dpfx >= 0) &&
> (path_dhclient_pid[dpfx] != '-') && (path_dhclient_pid[dpfx] != '/'); dpfx--);
> -+ if ((dpfx > -1) && (path_dhclient_pid[dpfx]
> != '/'))
> -+ pfx = dpfx;
> -+
> -+ for (ip = interfaces; ip; ip = ip->next) {
> -+ if (interfaces_requested && (ip->flags &
> (INTERFACE_REQUESTED))) {
> -+ int n_len = strlen(ip->name);
> -+
> -+ new_path_dhclient_pid = (char*)
> malloc(pfx + n_len + 6);
> -+ strncpy(new_path_dhclient_pid,
> path_dhclient_pid, pfx);
> -+ sprintf(new_path_dhclient_pid + pfx,
> "-%s.pid", ip->name);
> -+
> -+ if ((pidfd =
> fopen(new_path_dhclient_pid, "r")) != NULL) {
> -+ e = fscanf(pidfd, "%ld\n",
> &temp);
> -+ oldpid = (pid_t)temp;
> -+
> -+ if (e != 0 && e != EOF) {
> -+ if (oldpid) {
> -+ if
> (kill(oldpid, SIGTERM) == 0)
> -+ unli
> nk(path_dhclient_pid);
> -+ }
> -+ }
> -+
> -+ fclose(pidfd);
> -+ }
> -+
> -+ free(new_path_dhclient_pid);
> -+ }
> -+ }
> -+ }
> -+ } else {
> -+ FILE *pidfp = NULL;
> -+ long temp = 0;
> -+ pid_t dhcpid = 0;
> -+ int dhc_running = 0;
> -+ char procfn[256] = "";
> -+
> -+ if ((pidfp = fopen(path_dhclient_pid, "r")) != NULL) {
> -+ if ((fscanf(pidfp, "%ld", &temp)==1) &&
> ((dhcpid=(pid_t)temp) > 0)) {
> -+ snprintf(procfn,256,"/proc/%u",dhcpid);
> -+ dhc_running = (access(procfn, F_OK) == 0);
> -+ }
> -+
> -+ fclose(pidfp);
> -+ }
> -+
> -+ if (dhc_running) {
> -+ log_fatal("dhclient(%u) is already running -
> exiting. ", dhcpid);
> -+ return(1);
> - }
> - }
> -
> -+ write_client_pid_file();
> -+
> - if (!quiet) {
> - log_info("%s %s", message, PACKAGE_VERSION);
> - log_info(copyright);
> diff --git a/src/patches/dhcp/dhcp-remove-bind.patch b/src/patches/dhcp/dhcp-
> remove-bind.patch
> deleted file mode 100644
> index 5ab0338b3..000000000
> --- a/src/patches/dhcp/dhcp-remove-bind.patch
> +++ /dev/null
> @@ -1,192 +0,0 @@
> -diff -up dhcp-4.3.1b1/client/Makefile.am.brGmwh dhcp-
> 4.3.1b1/client/Makefile.am
> ---- dhcp-4.3.1b1/client/Makefile.am.brGmwh 2014-07-02
> 19:58:38.000000000 +0200
> -+++ dhcp-4.3.1b1/client/Makefile.am 2014-07-10 17:36:30.484250976
> +0200
> -@@ -10,8 +10,8 @@ dhclient_SOURCES = clparse.c dhclient.c
> - scripts/bsdos scripts/freebsd scripts/linux scripts/macos
> \
> - scripts/netbsd scripts/nextstep scripts/openbsd \
> - scripts/solaris scripts/openwrt
> --dhclient_LDADD = ../common/libdhcp.a ../omapip/libomapi.a
> ../bind/lib/libirs.a \
> -- ../bind/lib/libdns.a ../bind/lib/libisccfg.a
> ../bind/lib/libisc.a
> -+dhclient_LDADD = ../common/libdhcp.a ../omapip/libomapi.a \
> -+ $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
> - man_MANS = dhclient.8 dhclient-script.8 dhclient.conf.5 dhclient.leases.5
> - EXTRA_DIST = $(man_MANS)
> -
> -diff -up dhcp-4.3.1b1/common/tests/Makefile.am.brGmwh dhcp-
> 4.3.1b1/common/tests/Makefile.am
> ---- dhcp-4.3.1b1/common/tests/Makefile.am.brGmwh 2014-07-10
> 17:36:30.485250962 +0200
> -+++ dhcp-4.3.1b1/common/tests/Makefile.am 2014-07-10
> 17:38:04.010924566 +0200
> -@@ -13,21 +13,20 @@ ATF_TESTS += alloc_unittest dns_unittest
> - alloc_unittest_SOURCES = test_alloc.c $(top_srcdir)/tests/t_api_dhcp.c
> - alloc_unittest_LDADD = $(ATF_LDFLAGS)
> - alloc_unittest_LDADD += ../libdhcp.a \
> -- ../../omapip/libomapi.a ../../bind/lib/libirs.a \
> -- ../../bind/lib/libdns.a
> ../../bind/lib/libisccfg.a ../../bind/lib/libisc.a
> -+ ../../omapip/libomapi.a \
> -+ $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
> -
> - dns_unittest_SOURCES = dns_unittest.c $(top_srcdir)/tests/t_api_dhcp.c
> - dns_unittest_LDADD = $(ATF_LDFLAGS)
> - dns_unittest_LDADD += ../libdhcp.a \
> -- ../../omapip/libomapi.a ../../bind/lib/libirs.a \
> -- ../../bind/lib/libdns.a
> ../../bind/lib/libisccfg.a ../../bind/lib/libisc.a
> -+ ../../omapip/libomapi.a \
> -+ $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
> -
> - misc_unittest_SOURCES = misc_unittest.c $(top_srcdir)/tests/t_api_dhcp.c
> - misc_unittest_LDADD = $(ATF_LDFLAGS)
> - misc_unittest_LDADD += ../libdhcp.a \
> -- ../../omapip/libomapi.a ../../bind/lib/libirs.a \
> -- ../../bind/lib/libdns.a
> ../../bind/lib/libisccfg.a ../../bind/lib/libisc.a
> --
> -+ ../../omapip/libomapi.a \
> -+ $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
> - check: $(ATF_TESTS)
> - atf-run | atf-report
> -
> -diff -up dhcp-4.3.1b1/configure.ac.brGmwh dhcp-4.3.1b1/configure.ac
> ---- dhcp-4.3.1b1/configure.ac.brGmwh 2014-07-02 20:01:26.000000000
> +0200
> -+++ dhcp-4.3.1b1/configure.ac 2014-07-10 17:36:30.485250962 +0200
> -@@ -562,20 +562,37 @@ AC_CHECK_MEMBER(struct msghdr.msg_contro
> -
> - libbind=
> - AC_ARG_WITH(libbind,
> -- AS_HELP_STRING([--with-libbind=PATH],[bind includes and libraries
> are in PATH
> -- (default is ./bind)]),
> -+ AS_HELP_STRING([--with-libbind=PATH],[bind includes are in PATH
> -+ (default is ./bind/includes)]),
> - use_libbind="$withval", use_libbind="no")
> - case "$use_libbind" in
> -+yes|no)
> -+ libbind="\${top_srcdir}/bind/include"
> -+ ;;
> -+*)
> -+ libbind="$use_libbind"
> -+ ;;
> -+esac
> -+
> -+BIND9_LIBDIR='-L$(top_builddir)/bind/lib'
> -+AC_ARG_WITH(libbind-libs,
> -+ AC_HELP_STRING([--with-libbind-libs=PATH],
> -+ [bind9 export libraries are in PATH]),
> -+ [libbind_libs="$withval"], [libbind_libs='no'])
> -+case "$libbind_libs" in
> - yes)
> -- libbind="\${top_srcdir}/bind"
> -+ AC_MSG_ERROR([Specify path to bind9 libraries])
> - ;;
> - no)
> -- libbind="\${top_srcdir}/bind"
> -+ BUNDLED_BIND=yes
> - ;;
> - *)
> -- libbind="$use_libbind"
> -+ BIND9_LIBDIR="-L$libbind_libs"
> -+ BUNDLED_BIND=no
> - ;;
> - esac
> -+AM_CONDITIONAL([BUNDLED_BIND], [test "$BUNDLED_BIND" = yes])
> -+AC_SUBST([BIND9_LIBDIR])
> -
> - # OpenLDAP support.
> - AC_ARG_WITH(ldap,
> -@@ -610,7 +627,7 @@ fi
> - CFLAGS="$CFLAGS $STD_CWARNINGS"
> -
> - # Try to add the bind include directory
> --CFLAGS="$CFLAGS -I$libbind/include"
> -+CFLAGS="$CFLAGS -I$libbind"
> -
> - case "$host" in
> - *-darwin*)
> -diff -up dhcp-4.3.1b1/dhcpctl/Makefile.am.brGmwh dhcp-
> 4.3.1b1/dhcpctl/Makefile.am
> ---- dhcp-4.3.1b1/dhcpctl/Makefile.am.brGmwh 2014-07-02
> 19:58:38.000000000 +0200
> -+++ dhcp-4.3.1b1/dhcpctl/Makefile.am 2014-07-10 17:36:30.485250962
> +0200
> -@@ -6,12 +6,9 @@ EXTRA_DIST = $(man_MANS)
> -
> - omshell_SOURCES = omshell.c
> - omshell_LDADD = libdhcpctl.a ../common/libdhcp.a ../omapip/libomapi.a \
> -- ../bind/lib/libirs.a ../bind/lib/libdns.a \
> -- ../bind/lib/libisccfg.a ../bind/lib/libisc.a
> --
> -+ $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
> - libdhcpctl_a_SOURCES = dhcpctl.c callback.c remote.c
> -
> - cltest_SOURCES = cltest.c
> - cltest_LDADD = libdhcpctl.a ../common/libdhcp.a ../omapip/libomapi.a \
> -- ../bind/lib/libirs.a ../bind/lib/libdns.a \
> -- ../bind/lib/libisccfg.a ../bind/lib/libisc.a
> -+ $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
> -diff -up dhcp-4.3.1b1/Makefile.am.brGmwh dhcp-4.3.1b1/Makefile.am
> ---- dhcp-4.3.1b1/Makefile.am.brGmwh 2014-07-02 19:58:38.000000000
> +0200
> -+++ dhcp-4.3.1b1/Makefile.am 2014-07-10 17:36:30.484250976 +0200
> -@@ -25,7 +25,13 @@ EXTRA_DIST = RELNOTES LICENSE \
> - bind/Makefile bind/bind.tar.gz bind/version.tmp \
> - common/tests/Atffile server/tests/Atffile
> -
> --SUBDIRS = bind includes tests common dst omapip client dhcpctl relay server
> -+if BUNDLED_BIND
> -+SUBDIRS = bind
> -+else
> -+SUBDIRS =
> -+endif
> -+
> -+SUBDIRS += includes tests common dst omapip client dhcpctl relay server
> -
> - nobase_include_HEADERS = dhcpctl/dhcpctl.h
> -
> -diff -up dhcp-4.3.1b1/omapip/Makefile.am.brGmwh dhcp-
> 4.3.1b1/omapip/Makefile.am
> ---- dhcp-4.3.1b1/omapip/Makefile.am.brGmwh 2014-07-02
> 19:58:39.000000000 +0200
> -+++ dhcp-4.3.1b1/omapip/Makefile.am 2014-07-10 17:36:30.486250948
> +0200
> -@@ -10,6 +10,5 @@ man_MANS = omapi.3
> - EXTRA_DIST = $(man_MANS)
> -
> - svtest_SOURCES = test.c
> --svtest_LDADD = libomapi.a ../bind/lib/libirs.a ../bind/lib/libdns.a \
> -- ../bind/lib/libisccfg.a ../bind/lib/libisc.a
> --
> -+svtest_LDADD = libomapi.a \
> -+ $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
> -diff -up dhcp-4.3.1b1/relay/Makefile.am.brGmwh dhcp-4.3.1b1/relay/Makefile.am
> ---- dhcp-4.3.1b1/relay/Makefile.am.brGmwh 2014-07-02
> 19:58:39.000000000 +0200
> -+++ dhcp-4.3.1b1/relay/Makefile.am 2014-07-10 17:36:30.486250948 +0200
> -@@ -3,8 +3,7 @@ AM_CPPFLAGS = -DLOCALSTATEDIR='"@localst
> - sbin_PROGRAMS = dhcrelay
> - dhcrelay_SOURCES = dhcrelay.c
> - dhcrelay_LDADD = ../common/libdhcp.a ../omapip/libomapi.a \
> -- ../bind/lib/libirs.a ../bind/lib/libdns.a \
> -- ../bind/lib/libisccfg.a ../bind/lib/libisc.a
> -+ $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
> - man_MANS = dhcrelay.8
> - EXTRA_DIST = $(man_MANS)
> -
> -diff -up dhcp-4.3.1b1/server/Makefile.am.brGmwh dhcp-
> 4.3.1b1/server/Makefile.am
> ---- dhcp-4.3.1b1/server/Makefile.am.brGmwh 2014-07-02
> 19:58:39.000000000 +0200
> -+++ dhcp-4.3.1b1/server/Makefile.am 2014-07-10 17:36:30.486250948
> +0200
> -@@ -13,10 +13,8 @@ dhcpd_SOURCES = dhcpd.c dhcp.c bootp.c c
> - dhcpv6.c mdb6.c ldap.c ldap_casa.c
> -
> - dhcpd_CFLAGS = $(LDAP_CFLAGS)
> --dhcpd_LDADD = ../common/libdhcp.a ../omapip/libomapi.a \
> -- ../dhcpctl/libdhcpctl.a ../bind/lib/libirs.a \
> -- ../bind/lib/libdns.a ../bind/lib/libisccfg.a
> ../bind/lib/libisc.a
> --
> -+dhcpd_LDADD = ../common/libdhcp.a ../omapip/libomapi.a
> ../dhcpctl/libdhcpctl.a \
> -+ $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
> - man_MANS = dhcpd.8 dhcpd.conf.5 dhcpd.leases.5
> - EXTRA_DIST = $(man_MANS)
> -
> -diff -up dhcp-4.3.1b1/server/tests/Makefile.am.brGmwh dhcp-
> 4.3.1b1/server/tests/Makefile.am
> ---- dhcp-4.3.1b1/server/tests/Makefile.am.brGmwh 2014-07-02
> 19:58:40.000000000 +0200
> -+++ dhcp-4.3.1b1/server/tests/Makefile.am 2014-07-10
> 17:36:30.486250948 +0200
> -@@ -18,9 +18,8 @@ DHCPSRC = ../dhcp.c ../bootp.c ../confpa
> - ../ldap.c ../ldap_casa.c ../dhcpd.c
> -
> - DHCPLIBS = $(top_builddir)/common/libdhcp.a
> $(top_builddir)/omapip/libomapi.a \
> -- $(top_builddir)/dhcpctl/libdhcpctl.a
> $(top_builddir)/bind/lib/libirs.a \
> -- $(top_builddir)/bind/lib/libdns.a
> $(top_builddir)/bind/lib/libisccfg.a \
> -- $(top_builddir)/bind/lib/libisc.a
> -+ $(top_builddir)/dhcpctl/libdhcpctl.a \
> -+ $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
> -
> - ATF_TESTS =
> - TESTS =
> diff --git a/src/patches/dhcp/dhcp-rfc3442-classless-static-routes.patch
> b/src/patches/dhcp/dhcp-rfc3442-classless-static-routes.patch
> deleted file mode 100644
> index 94ed5ba24..000000000
> --- a/src/patches/dhcp/dhcp-rfc3442-classless-static-routes.patch
> +++ /dev/null
> @@ -1,405 +0,0 @@
> -diff -up dhcp-4.3.0rc1/client/clparse.c.rfc3442 dhcp-
> 4.3.0rc1/client/clparse.c
> ---- dhcp-4.3.0rc1/client/clparse.c.rfc3442 2014-01-29
> 10:05:48.474400352 +0100
> -+++ dhcp-4.3.0rc1/client/clparse.c 2014-01-29 10:05:48.517399955 +0100
> -@@ -31,7 +31,7 @@
> -
> - struct client_config top_level_config;
> -
> --#define NUM_DEFAULT_REQUESTED_OPTS 14
> -+#define NUM_DEFAULT_REQUESTED_OPTS 15
> - struct option *default_requested_options[NUM_DEFAULT_REQUESTED_OPTS + 1];
> -
> - static void parse_client_default_duid(struct parse *cfile);
> -@@ -84,7 +84,11 @@ isc_result_t read_client_conf ()
> - dhcp_universe.code_hash, &code, 0, MDL);
> -
> - /* 4 */
> -- code = DHO_ROUTERS;
> -+ /* The Classless Static Routes option code MUST appear in the
> parameter
> -+ * request list prior to both the Router option code and the Static
> -+ * Routes option code, if present. (RFC3442)
> -+ */
> -+ code = DHO_CLASSLESS_STATIC_ROUTES;
> - option_code_hash_lookup(&default_requested_options[3],
> - dhcp_universe.code_hash, &code, 0, MDL);
> -
> -@@ -138,6 +142,11 @@ isc_result_t read_client_conf ()
> - option_code_hash_lookup(&default_requested_options[13],
> - dhcp_universe.code_hash, &code, 0, MDL);
> -
> -+ /* 15 */
> -+ code = DHO_ROUTERS;
> -+ option_code_hash_lookup(&default_requested_options[14],
> -+ dhcp_universe.code_hash, &code, 0, MDL);
> -+
> - for (code = 0 ; code < NUM_DEFAULT_REQUESTED_OPTS ; code++) {
> - if (default_requested_options[code] == NULL)
> - log_fatal("Unable to find option definition for "
> -diff -up dhcp-4.3.0rc1/common/dhcp-options.5.rfc3442 dhcp-
> 4.3.0rc1/common/dhcp-options.5
> ---- dhcp-4.3.0rc1/common/dhcp-options.5.rfc3442 2014-01-29
> 10:05:48.466400426 +0100
> -+++ dhcp-4.3.0rc1/common/dhcp-options.5 2014-01-29 10:05:48.518399945
> +0100
> -@@ -111,6 +111,26 @@ hexadecimal, separated by colons. For e
> - or
> - option dhcp-client-identifier 43:4c:49:45:54:2d:46:4f:4f;
> - .fi
> -+.PP
> -+The
> -+.B destination-descriptor
> -+describe the IP subnet number and subnet mask
> -+of a particular destination using a compact encoding. This encoding
> -+consists of one octet describing the width of the subnet mask,
> -+followed by all the significant octets of the subnet number.
> -+The following table contains some examples of how various subnet
> -+number/mask combinations can be encoded:
> -+.nf
> -+.sp 1
> -+Subnet number Subnet mask Destination descriptor
> -+0 0 0
> -+10.0.0.0 255.0.0.0 8.10
> -+10.0.0.0 255.255.255.0 24.10.0.0
> -+10.17.0.0 255.255.0.0 16.10.17
> -+10.27.129.0 255.255.255.0 24.10.27.129
> -+10.229.0.128 255.255.255.128 25.10.229.0.128
> -+10.198.122.47 255.255.255.255 32.10.198.122.47
> -+.fi
> - .SH SETTING OPTION VALUES USING EXPRESSIONS
> - Sometimes it's helpful to be able to set the value of a DHCP option
> - based on some value that the client has sent. To do this, you can
> -@@ -972,6 +992,29 @@ dhclient-script will create routes:
> - .RE
> - .PP
> - .nf
> -+.B option \fBclassless-static-routes\fR \fIdestination-descriptor ip-
> address\fR
> -+ [\fB,\fR \fIdestination-descriptor ip-
> address\fR...]\fB;\fR
> -+.fi
> -+.RS 0.25i
> -+.PP
> -+This option (see RFC3442) specifies a list of classless static routes
> -+that the client should install in its routing cache.
> -+.PP
> -+This option can contain one or more static routes, each of which
> -+consists of a destination descriptor and the IP address of the router
> -+that should be used to reach that destination.
> -+.PP
> -+Many clients may not implement the Classless Static Routes option.
> -+DHCP server administrators should therefore configure their DHCP
> -+servers to send both a Router option and a Classless Static Routes
> -+option, and should specify the default router(s) both in the Router
> -+option and in the Classless Static Routes option.
> -+.PP
> -+If the DHCP server returns both a Classless Static Routes option and
> -+a Router option, the DHCP client ignores the Router option.
> -+.RE
> -+.PP
> -+.nf
> - .B option \fBstreettalk-directory-assistance-server\fR \fIip-address\fR
> - [\fB,\fR \fIip-
> address\fR...]\fB;\fR
> - .fi
> -diff -up dhcp-4.3.0rc1/common/inet.c.rfc3442 dhcp-4.3.0rc1/common/inet.c
> ---- dhcp-4.3.0rc1/common/inet.c.rfc3442 2014-01-26 19:40:44.000000000
> +0100
> -+++ dhcp-4.3.0rc1/common/inet.c 2014-01-29 10:05:48.519399936 +0100
> -@@ -521,6 +521,60 @@ free_iaddrcidrnetlist(struct iaddrcidrne
> - return ISC_R_SUCCESS;
> - }
> -
> -+static const char *
> -+inet_ntopdd(const unsigned char *src, unsigned srclen, char *dst, size_t
> size)
> -+{
> -+ char tmp[sizeof("32.255.255.255.255")];
> -+ int len;
> -+
> -+ switch (srclen) {
> -+ case 2:
> -+ len = sprintf (tmp, "%u.%u", src[0], src[1]);
> -+ break;
> -+ case 3:
> -+ len = sprintf (tmp, "%u.%u.%u", src[0], src[1],
> src[2]);
> -+ break;
> -+ case 4:
> -+ len = sprintf (tmp, "%u.%u.%u.%u", src[0], src[1],
> src[2], src[3]);
> -+ break;
> -+ case 5:
> -+ len = sprintf (tmp, "%u.%u.%u.%u.%u", src[0],
> src[1], src[2], src[3], src[4]);
> -+ break;
> -+ default:
> -+ return NULL;
> -+ }
> -+ if (len < 0)
> -+ return NULL;
> -+
> -+ if (len > size) {
> -+ errno = ENOSPC;
> -+ return NULL;
> -+ }
> -+
> -+ return strcpy (dst, tmp);
> -+}
> -+
> -+/* pdestdesc() turns an iaddr structure into a printable dest. descriptor */
> -+const char *
> -+pdestdesc(const struct iaddr addr) {
> -+ static char pbuf[sizeof("255.255.255.255.255")];
> -+
> -+ if (addr.len == 0) {
> -+ return "<null destination descriptor>";
> -+ }
> -+ if (addr.len == 1) {
> -+ return "0";
> -+ }
> -+ if ((addr.len >= 2) && (addr.len <= 5)) {
> -+ return inet_ntopdd(addr.iabuf, addr.len, pbuf,
> sizeof(pbuf));
> -+ }
> -+
> -+ log_fatal("pdestdesc():%s:%d: Invalid destination descriptor length
> %d.",
> -+ MDL, addr.len);
> -+ /* quell compiler warnings */
> -+ return NULL;
> -+}
> -+
> - /* piaddr() turns an iaddr structure into a printable address. */
> - /* XXX: should use a const pointer rather than passing the structure */
> - const char *
> -diff -up dhcp-4.3.0rc1/common/options.c.rfc3442 dhcp-
> 4.3.0rc1/common/options.c
> ---- dhcp-4.3.0rc1/common/options.c.rfc3442 2014-01-26
> 19:40:44.000000000 +0100
> -+++ dhcp-4.3.0rc1/common/options.c 2014-01-29 10:05:48.520399927 +0100
> -@@ -707,7 +707,11 @@ cons_options(struct packet *inpacket, st
> - * packet.
> - */
> - priority_list[priority_len++] = DHO_SUBNET_MASK;
> -- priority_list[priority_len++] = DHO_ROUTERS;
> -+ if (lookup_option(&dhcp_universe, cfg_options,
> -+ DHO_CLASSLESS_STATIC
> _ROUTES))
> -+ priority_list[priority_len++] =
> DHO_CLASSLESS_STATIC_ROUTES;
> -+ else
> -+ priority_list[priority_len++] = DHO_ROUTERS;
> - priority_list[priority_len++] = DHO_DOMAIN_NAME_SERVERS;
> - priority_list[priority_len++] = DHO_HOST_NAME;
> - priority_list[priority_len++] = DHO_FQDN;
> -@@ -1688,6 +1692,7 @@ const char *pretty_print_option (option,
> - unsigned long tval;
> - isc_boolean_t a_array = ISC_FALSE;
> - int len_used;
> -+ unsigned int octets = 0;
> -
> - if (emit_commas)
> - comma = ',';
> -@@ -1696,6 +1701,7 @@ const char *pretty_print_option (option,
> -
> - memset (enumbuf, 0, sizeof enumbuf);
> -
> -+ if (option->format[0] != 'R') { /* see explanation lower */
> - /* Figure out the size of the data. */
> - for (l = i = 0; option -> format [i]; i++, l++) {
> - if (l >= sizeof(fmtbuf) - 1)
> -@@ -1870,6 +1876,33 @@ const char *pretty_print_option (option,
> - if (numhunk < 0)
> - numhunk = 1;
> -
> -+ } else { /* option->format[i] == 'R') */
> -+ /* R (destination descriptor) has variable length.
> -+ * We can find it only in classless static route option,
> -+ * so we are for sure parsing classless static route option
> now.
> -+ * We go through whole the option to check whether there are
> no
> -+ * missing/extra bytes.
> -+ * I didn't find out how to improve the existing code and
> that's the
> -+ * reason for this separate 'else' where I do my own
> checkings.
> -+ * I know it's little bit unsystematic, but it works.
> -+ */
> -+ numhunk = 0;
> -+ numelem = 2; /* RI */
> -+ fmtbuf[0]='R'; fmtbuf[1]='I'; fmtbuf[2]=0;
> -+ for (i =0; i < len; i = i + octets + 5) {
> -+ if (data[i] > 32) { /* subnet mask width */
> -+ log_error ("wrong subnet mask width in
> destination descriptor");
> -+ break;
> -+ }
> -+ numhunk++;
> -+ octets = ((data[i]+7) / 8);
> -+ }
> -+ if (i != len) {
> -+ log_error ("classless static routes option has wrong
> size or "
> -+ "there's some garbage in
> format");
> -+ }
> -+ }
> -+
> - /* Cycle through the array (or hunk) printing the data. */
> - for (i = 0; i < numhunk; i++) {
> - if ((a_array == ISC_TRUE) && (i != 0) && (numelem > 0)) {
> -@@ -2025,6 +2058,20 @@ const char *pretty_print_option (option,
> - strcpy(op, piaddr(iaddr));
> - dp += 4;
> - break;
> -+
> -+ case 'R':
> -+ if (dp[0] <= 32)
> -+ iaddr.len = (((dp[0]+7)/8)+1);
> -+ else {
> -+ log_error ("wrong subnet mask width
> in destination descriptor");
> -+ return "<error>";
> -+ }
> -+
> -+ memcpy(iaddr.iabuf, dp, iaddr.len);
> -+ strcpy(op, pdestdesc(iaddr));
> -+ dp += iaddr.len;
> -+ break;
> -+
> - case '6':
> - iaddr.len = 16;
> - memcpy(iaddr.iabuf, dp, 16);
> -diff -up dhcp-4.3.0rc1/common/parse.c.rfc3442 dhcp-4.3.0rc1/common/parse.c
> ---- dhcp-4.3.0rc1/common/parse.c.rfc3442 2014-01-29 10:05:48.491400195
> +0100
> -+++ dhcp-4.3.0rc1/common/parse.c 2014-01-29 10:05:48.522399908 +0100
> -@@ -335,6 +335,39 @@ int parse_ip_addr (cfile, addr)
> - }
> -
> - /*
> -+ * destination-descriptor :== NUMBER DOT NUMBER |
> -+ * NUMBER DOT NUMBER DOT NUMBER |
> -+ * NUMBER DOT NUMBER DOT NUMBER DOT NUMBER |
> -+ * NUMBER DOT NUMBER DOT NUMBER DOT NUMBER DOT
> NUMBER
> -+ */
> -+
> -+int parse_destination_descriptor (cfile, addr)
> -+ struct parse *cfile;
> -+ struct iaddr *addr;
> -+{
> -+ unsigned int mask_width, dest_dest_len;
> -+ addr -> len = 0;
> -+ if (parse_numeric_aggregate (cfile, addr -> iabuf,
> -+ &ad
> dr -> len, DOT, 10, 8)) {
> -+ mask_width = (unsigned int)addr->iabuf[0];
> -+ dest_dest_len = (((mask_width+7)/8)+1);
> -+ if (mask_width > 32) {
> -+ parse_warn (cfile,
> -+ "subnet mask width (%u) greater than 32.",
> mask_width);
> -+ }
> -+ else if (dest_dest_len != addr->len) {
> -+ parse_warn (cfile,
> -+ "destination descriptor with subnet mask
> width %u "
> -+ "should have %u octets, but has %u octets.",
> -+ mask_width, dest_dest_len, addr->len);
> -+ }
> -+
> -+ return 1;
> -+ }
> -+ return 0;
> -+}
> -+
> -+/*
> - * Return true if every character in the string is hexadecimal.
> - */
> - static int
> -@@ -713,8 +746,10 @@ unsigned char *parse_numeric_aggregate (
> - if (count) {
> - token = peek_token (&val, (unsigned *)0, cfile);
> - if (token != separator) {
> -- if (!*max)
> -+ if (!*max) {
> -+ *max = count;
> - break;
> -+ }
> - if (token != RBRACE && token != LBRACE)
> - token = next_token (&val,
> - (unsigned *)0,
> -@@ -1654,6 +1689,9 @@ int parse_option_code_definition (cfile,
> - case IP_ADDRESS:
> - type = 'I';
> - break;
> -+ case DESTINATION_DESCRIPTOR:
> -+ type = 'R';
> -+ break;
> - case IP6_ADDRESS:
> - type = '6';
> - break;
> -@@ -5071,6 +5109,15 @@ int parse_option_token (rv, cfile, fmt,
> - }
> - break;
> -
> -+ case 'R': /* destination descriptor */
> -+ if (!parse_destination_descriptor (cfile, &addr)) {
> -+ return 0;
> -+ }
> -+ if (!make_const_data (&t, addr.iabuf, addr.len, 0, 1, MDL))
> {
> -+ return 0;
> -+ }
> -+ break;
> -+
> - case '6': /* IPv6 address. */
> - if (!parse_ip6_addr(cfile, &addr)) {
> - return 0;
> -@@ -5348,6 +5395,13 @@ int parse_option_decl (oc, cfile)
> - goto exit;
> - len = ip_addr.len;
> - dp = ip_addr.iabuf;
> -+ goto alloc;
> -+
> -+ case 'R': /* destination descriptor */
> -+ if (!parse_destination_descriptor (cfile,
> &ip_addr))
> -+ goto exit;
> -+ len = ip_addr.len;
> -+ dp = ip_addr.iabuf;
> -
> - alloc:
> - if (hunkix + len > sizeof hunkbuf) {
> -diff -up dhcp-4.3.0rc1/common/tables.c.rfc3442 dhcp-4.3.0rc1/common/tables.c
> ---- dhcp-4.3.0rc1/common/tables.c.rfc3442 2014-01-29
> 10:05:48.485400250 +0100
> -+++ dhcp-4.3.0rc1/common/tables.c 2014-01-29 10:06:25.724038563 +0100
> -@@ -46,6 +46,7 @@ HASH_FUNCTIONS (option_code, const unsig
> - Format codes:
> -
> - I - IPv4 address
> -+ R - destination descriptor (RFC3442)
> - 6 - IPv6 address
> - l - 32-bit signed integer
> - L - 32-bit unsigned integer
> -@@ -214,6 +215,7 @@ static struct option dhcp_options[] = {
> - #endif
> - { "subnet-selection", "I", &dhcp_universe, 118, 1 },
> - { "domain-search", "D", &dhcp_universe, 119,
> 1 },
> -+ { "classless-static-routes", "RIA", &dhcp_universe, 121, 1 },
> - { "vivco", "Evendor-class.", &dhcp_universe, 124, 1
> },
> - { "vivso", "Evendor.", &dhcp_universe, 125, 1
> },
> - #if 0
> -diff -up dhcp-4.3.0rc1/includes/dhcpd.h.rfc3442 dhcp-
> 4.3.0rc1/includes/dhcpd.h
> ---- dhcp-4.3.0rc1/includes/dhcpd.h.rfc3442 2014-01-29
> 10:05:48.470400389 +0100
> -+++ dhcp-4.3.0rc1/includes/dhcpd.h 2014-01-29 10:05:48.525399881 +0100
> -@@ -2725,6 +2725,7 @@ isc_result_t range2cidr(struct iaddrcidr
> - const struct iaddr *lo, const struct iaddr *hi);
> - isc_result_t free_iaddrcidrnetlist(struct iaddrcidrnetlist **result);
> - const char *piaddr (struct iaddr);
> -+const char *pdestdesc (struct iaddr);
> - char *piaddrmask(struct iaddr *, struct iaddr *);
> - char *piaddrcidr(const struct iaddr *, unsigned int);
> - u_int16_t validate_port(char *);
> -@@ -2934,6 +2935,7 @@ void parse_client_lease_declaration (str
> - int parse_option_decl (struct option_cache **, struct parse *);
> - void parse_string_list (struct parse *, struct string_list **, int);
> - int parse_ip_addr (struct parse *, struct iaddr *);
> -+int parse_destination_descriptor (struct parse *, struct iaddr *);
> - int parse_ip_addr_with_subnet(struct parse *, struct iaddrmatch *);
> - void parse_reject_statement (struct parse *, struct client_config *);
> -
> -diff -up dhcp-4.3.0rc1/includes/dhcp.h.rfc3442 dhcp-4.3.0rc1/includes/dhcp.h
> ---- dhcp-4.3.0rc1/includes/dhcp.h.rfc3442 2014-01-26
> 19:40:44.000000000 +0100
> -+++ dhcp-4.3.0rc1/includes/dhcp.h 2014-01-29 10:05:48.524399890 +0100
> -@@ -159,6 +159,7 @@ struct dhcp_packet {
> - #define DHO_ASSOCIATED_IP 92
> - #define DHO_SUBNET_SELECTION 118 /* RFC3011! */
> - #define DHO_DOMAIN_SEARCH 119 /* RFC3397 */
> -+#define DHO_CLASSLESS_STATIC_ROUTES 121 /* RFC3442 */
> - #define DHO_VIVCO_SUBOPTIONS 124
> - #define DHO_VIVSO_SUBOPTIONS 125
> -
> -diff -up dhcp-4.3.0rc1/includes/dhctoken.h.rfc3442 dhcp-
> 4.3.0rc1/includes/dhctoken.h
> ---- dhcp-4.3.0rc1/includes/dhctoken.h.rfc3442 2014-01-29
> 10:05:48.435400713 +0100
> -+++ dhcp-4.3.0rc1/includes/dhctoken.h 2014-01-29 10:05:48.526399871
> +0100
> -@@ -368,7 +368,8 @@ enum dhcp_token {
> - POOL6 = 669,
> - V6RELAY = 670,
> - V6RELOPT = 671,
> -- BOOTP_BROADCAST_ALWAYS = 672
> -+ BOOTP_BROADCAST_ALWAYS = 672,
> -+ DESTINATION_DESCRIPTOR = 673
> - };
> -
> - #define is_identifier(x) ((x) >= FIRST_TOKEN && \
> diff --git a/src/patches/dhcp/dhcp-sendDecline.patch b/src/patches/dhcp/dhcp-
> sendDecline.patch
> deleted file mode 100644
> index e68336634..000000000
> --- a/src/patches/dhcp/dhcp-sendDecline.patch
> +++ /dev/null
> @@ -1,231 +0,0 @@
> -diff -up dhcp-4.3.0a1/client/dhc6.c.sendDecline dhcp-4.3.0a1/client/dhc6.c
> ---- dhcp-4.3.0a1/client/dhc6.c.sendDecline 2013-12-11
> 01:25:12.000000000 +0100
> -+++ dhcp-4.3.0a1/client/dhc6.c 2013-12-19 15:56:18.297660118 +0100
> -@@ -96,6 +96,8 @@ void do_select6(void *input);
> - void do_refresh6(void *input);
> - static void do_release6(void *input);
> - static void start_bound(struct client_state *client);
> -+static void start_decline6(struct client_state *client);
> -+static void do_decline6(void *input);
> - static void start_informed(struct client_state *client);
> - void informed_handler(struct packet *packet, struct client_state *client);
> - void bound_handler(struct packet *packet, struct client_state *client);
> -@@ -2017,6 +2019,7 @@ start_release6(struct client_state *clie
> - cancel_timeout(do_select6, client);
> - cancel_timeout(do_refresh6, client);
> - cancel_timeout(do_release6, client);
> -+ cancel_timeout(do_decline6, client);
> - client->state = S_STOPPED;
> -
> - /*
> -@@ -2650,6 +2653,7 @@ dhc6_check_reply(struct client_state *cl
> - break;
> -
> - case S_STOPPED:
> -+ case S_DECLINED:
> - action = dhc6_stop_action;
> - break;
> -
> -@@ -2751,6 +2755,7 @@ dhc6_check_reply(struct client_state *cl
> - break;
> -
> - case S_STOPPED:
> -+ case S_DECLINED:
> - /* Nothing critical to do at this stage. */
> - break;
> -
> -@@ -3741,17 +3746,23 @@ reply_handler(struct packet *packet, str
> - cancel_timeout(do_select6, client);
> - cancel_timeout(do_refresh6, client);
> - cancel_timeout(do_release6, client);
> -+ cancel_timeout(do_decline6, client);
> -
> - /* If this is in response to a Release/Decline, clean up and return.
> */
> -- if (client->state == S_STOPPED) {
> -- if (client->active_lease == NULL)
> -- return;
> -+ if ((client->state == S_STOPPED) ||
> -+ (client->state == S_DECLINED)) {
> -+
> -+ if (client->active_lease != NULL) {
> -+ dhc6_lease_destroy(&client->active_lease, MDL);
> -+ client->active_lease = NULL;
> -+ /* We should never wait for nothing!? */
> -+ if (stopping_finished())
> -+ exit(0);
> -+ }
> -+
> -+ if (client->state == S_DECLINED)
> -+ start_init6(client);
> -
> -- dhc6_lease_destroy(&client->active_lease, MDL);
> -- client->active_lease = NULL;
> -- /* We should never wait for nothing!? */
> -- if (stopping_finished())
> -- exit(0);
> - return;
> - }
> -
> -@@ -4279,7 +4290,11 @@ start_bound(struct client_state *client)
> - dhc6_marshall_values("new_", client, lease, ia,
> addr);
> - script_write_requested6(client);
> -
> -- script_go(client);
> -+ // when script returns 3, DAD failed
> -+ if (script_go(client) == 3) {
> -+ start_decline6(client);
> -+ return;
> -+ }
> - }
> -
> - /* XXX: maybe we should loop on the old values instead? */
> -@@ -4327,6 +4342,149 @@ start_bound(struct client_state *client)
> - dhc6_check_times(client);
> - }
> -
> -+/*
> -+ * Decline addresses.
> -+ */
> -+void
> -+start_decline6(struct client_state *client)
> -+{
> -+ /* Cancel any pending transmissions */
> -+ cancel_timeout(do_confirm6, client);
> -+ cancel_timeout(do_select6, client);
> -+ cancel_timeout(do_refresh6, client);
> -+ cancel_timeout(do_release6, client);
> -+ cancel_timeout(do_decline6, client);
> -+ client->state = S_DECLINED;
> -+
> -+ if (client->active_lease == NULL)
> -+ return;
> -+
> -+ /* Set timers per RFC3315 section 18.1.7. */
> -+ client->IRT = DEC_TIMEOUT * 100;
> -+ client->MRT = 0;
> -+ client->MRC = DEC_MAX_RC;
> -+ client->MRD = 0;
> -+
> -+ dhc6_retrans_init(client);
> -+ client->v6_handler = reply_handler;
> -+
> -+ client->refresh_type = DHCPV6_DECLINE;
> -+ do_decline6(client);
> -+}
> -+
> -+/*
> -+ * do_decline6() creates a Decline packet and transmits it.
> -+ */
> -+static void
> -+do_decline6(void *input)
> -+{
> -+ struct client_state *client;
> -+ struct data_string ds;
> -+ int send_ret;
> -+ struct timeval elapsed, tv;
> -+
> -+ client = input;
> -+
> -+ if ((client->active_lease == NULL) || !active_prefix(client))
> -+ return;
> -+
> -+ if ((client->MRC != 0) && (client->txcount > client->MRC)) {
> -+ log_info("Max retransmission count exceeded.");
> -+ goto decline_done;
> -+ }
> -+
> -+ /*
> -+ * Start_time starts at the first transmission.
> -+ */
> -+ if (client->txcount == 0) {
> -+ client->start_time.tv_sec = cur_tv.tv_sec;
> -+ client->start_time.tv_usec = cur_tv.tv_usec;
> -+ }
> -+
> -+ /* elapsed = cur - start */
> -+ elapsed.tv_sec = cur_tv.tv_sec - client->start_time.tv_sec;
> -+ elapsed.tv_usec = cur_tv.tv_usec - client->start_time.tv_usec;
> -+ if (elapsed.tv_usec < 0) {
> -+ elapsed.tv_sec -= 1;
> -+ elapsed.tv_usec += 1000000;
> -+ }
> -+
> -+ memset(&ds, 0, sizeof(ds));
> -+ if (!buffer_allocate(&ds.buffer, 4, MDL)) {
> -+ log_error("Unable to allocate memory for Decline.");
> -+ goto decline_done;
> -+ }
> -+
> -+ ds.data = ds.buffer->data;
> -+ ds.len = 4;
> -+ ds.buffer->data[0] = DHCPV6_DECLINE;
> -+ memcpy(ds.buffer->data + 1, client->dhcpv6_transaction_id, 3);
> -+
> -+ /* Form an elapsed option. */
> -+ /* Maximum value is 65535 1/100s coded as 0xffff. */
> -+ if ((elapsed.tv_sec < 0) || (elapsed.tv_sec > 655) ||
> -+ ((elapsed.tv_sec == 655) && (elapsed.tv_usec > 350000))) {
> -+ client->elapsed = 0xffff;
> -+ } else {
> -+ client->elapsed = elapsed.tv_sec * 100;
> -+ client->elapsed += elapsed.tv_usec / 10000;
> -+ }
> -+
> -+ client->elapsed = htons(client->elapsed);
> -+
> -+ log_debug("XMT: Forming Decline.");
> -+ make_client6_options(client, &client->sent_options,
> -+ client->active_lease, DHCPV6_DECLINE);
> -+ dhcpv6_universe.encapsulate(&ds, NULL, NULL, client, NULL,
> -+ client->sent_options, &global_scope,
> -+ &dhcpv6_universe);
> -+
> -+ /* Append IA's (but don't release temporary addresses). */
> -+ if (wanted_ia_na &&
> -+ dhc6_add_ia_na(client, &ds, client->active_lease,
> -+ DHCPV6_DECLINE) != ISC_R_SUCCESS) {
> -+ data_string_forget(&ds, MDL);
> -+ goto decline_done;
> -+ }
> -+ if (wanted_ia_pd &&
> -+ dhc6_add_ia_pd(client, &ds, client->active_lease,
> -+ DHCPV6_DECLINE) != ISC_R_SUCCESS) {
> -+ data_string_forget(&ds, MDL);
> -+ goto decline_done;
> -+ }
> -+
> -+ /* Transmit and wait. */
> -+ log_info("XMT: Decline on %s, interval %ld0ms.",
> -+ client->name ? client->name : client->interface->name,
> -+ (long int)client->RT);
> -+
> -+ send_ret = send_packet6(client->interface, ds.data, ds.len,
> -+ &DHCPv6DestAddr);
> -+ if (send_ret != ds.len) {
> -+ log_error("dhc6: sendpacket6() sent %d of %d bytes",
> -+ send_ret, ds.len);
> -+ }
> -+
> -+ data_string_forget(&ds, MDL);
> -+
> -+ /* Wait RT */
> -+ tv.tv_sec = cur_tv.tv_sec + client->RT / 100;
> -+ tv.tv_usec = cur_tv.tv_usec + (client->RT % 100) * 10000;
> -+ if (tv.tv_usec >= 1000000) {
> -+ tv.tv_sec += 1;
> -+ tv.tv_usec -= 1000000;
> -+ }
> -+ add_timeout(&tv, do_decline6, client, NULL, NULL);
> -+ dhc6_retrans_advance(client);
> -+ return;
> -+
> -+decline_done:
> -+ dhc6_lease_destroy(&client->active_lease, MDL);
> -+ client->active_lease = NULL;
> -+ start_init6(client);
> -+ return;
> -+}
> -+
> - /* While bound, ignore packets. In the future we'll want to answer
> - * Reconfigure-Request messages and the like.
> - */
> diff --git a/src/patches/dhcp/dhcp-sharedlib.patch b/src/patches/dhcp/dhcp-
> sharedlib.patch
> deleted file mode 100644
> index abb2acc19..000000000
> --- a/src/patches/dhcp/dhcp-sharedlib.patch
> +++ /dev/null
> @@ -1,107 +0,0 @@
> -diff -up dhcp-4.3.1b1/common/tests/Makefile.am.uCWMBl dhcp-
> 4.3.1b1/common/tests/Makefile.am
> ---- dhcp-4.3.1b1/common/tests/Makefile.am.uCWMBl 2014-07-10
> 17:38:10.779828569 +0200
> -+++ dhcp-4.3.1b1/common/tests/Makefile.am 2014-07-10
> 17:38:21.355678580 +0200
> -@@ -13,19 +13,19 @@ ATF_TESTS += alloc_unittest dns_unittest
> - alloc_unittest_SOURCES = test_alloc.c $(top_srcdir)/tests/t_api_dhcp.c
> - alloc_unittest_LDADD = $(ATF_LDFLAGS)
> - alloc_unittest_LDADD += ../libdhcp.a \
> -- ../../omapip/libomapi.a \
> -+ ../../omapip/libomapi.la \
> - $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
> -
> - dns_unittest_SOURCES = dns_unittest.c $(top_srcdir)/tests/t_api_dhcp.c
> - dns_unittest_LDADD = $(ATF_LDFLAGS)
> --dns_unittest_LDADD += ../libdhcp.a \
> -+dns_unittest_LDADD += ../libdhcp.la \
> - ../../omapip/libomapi.a \
> - $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
> -
> - misc_unittest_SOURCES = misc_unittest.c $(top_srcdir)/tests/t_api_dhcp.c
> - misc_unittest_LDADD = $(ATF_LDFLAGS)
> - misc_unittest_LDADD += ../libdhcp.a \
> -- ../../omapip/libomapi.a \
> -+ ../../omapip/libomapi.la \
> - $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
> - check: $(ATF_TESTS)
> - atf-run | atf-report
> -diff -up dhcp-4.3.1b1/configure.ac.uCWMBl dhcp-4.3.1b1/configure.ac
> ---- dhcp-4.3.1b1/configure.ac.uCWMBl 2014-07-10 17:38:10.766828753
> +0200
> -+++ dhcp-4.3.1b1/configure.ac 2014-07-10 17:38:10.779828569 +0200
> -@@ -39,7 +39,8 @@ fi
> - # Use this to define _GNU_SOURCE to pull in the IPv6 Advanced Socket API.
> - AC_USE_SYSTEM_EXTENSIONS
> -
> --AC_PROG_RANLIB
> -+# Use libtool to simplify building of shared libraries
> -+AC_PROG_LIBTOOL
> - AC_CONFIG_HEADERS([includes/config.h])
> -
> - # we sometimes need to know byte order for building packets
> -diff -up dhcp-4.3.1b1/dhcpctl/Makefile.am.uCWMBl dhcp-
> 4.3.1b1/dhcpctl/Makefile.am
> ---- dhcp-4.3.1b1/dhcpctl/Makefile.am.uCWMBl 2014-07-10
> 17:36:30.485250962 +0200
> -+++ dhcp-4.3.1b1/dhcpctl/Makefile.am 2014-07-10 17:38:10.780828554
> +0200
> -@@ -1,14 +1,14 @@
> - bin_PROGRAMS = omshell
> --lib_LIBRARIES = libdhcpctl.a
> -+lib_LTLIBRARIES = libdhcpctl.la
> - noinst_PROGRAMS = cltest
> - man_MANS = omshell.1 dhcpctl.3
> - EXTRA_DIST = $(man_MANS)
> -
> - omshell_SOURCES = omshell.c
> --omshell_LDADD = libdhcpctl.a ../common/libdhcp.a ../omapip/libomapi.a \
> -+omshell_LDADD = libdhcpctl.la ../common/libdhcp.a ../omapip/libomapi.la \
> - $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
> --libdhcpctl_a_SOURCES = dhcpctl.c callback.c remote.c
> -+libdhcpctl_la_SOURCES = dhcpctl.c callback.c remote.c
> -
> - cltest_SOURCES = cltest.c
> --cltest_LDADD = libdhcpctl.a ../common/libdhcp.a ../omapip/libomapi.a \
> -+cltest_LDADD = libdhcpctl.la ../common/libdhcp.a ../omapip/libomapi.la \
> - $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
> -diff -up dhcp-4.3.1b1/omapip/Makefile.am.uCWMBl dhcp-
> 4.3.1b1/omapip/Makefile.am
> ---- dhcp-4.3.1b1/omapip/Makefile.am.uCWMBl 2014-07-10
> 17:36:30.486250948 +0200
> -+++ dhcp-4.3.1b1/omapip/Makefile.am 2014-07-10 17:38:10.780828554
> +0200
> -@@ -1,7 +1,7 @@
> --lib_LIBRARIES = libomapi.a
> -+lib_LTLIBRARIES = libomapi.la
> - noinst_PROGRAMS = svtest
> -
> --libomapi_a_SOURCES = protocol.c buffer.c alloc.c result.c connection.c \
> -+libomapi_la_SOURCES = protocol.c buffer.c alloc.c result.c connection.c \
> - errwarn.c listener.c dispatch.c generic.c support.c \
> - handle.c message.c convert.c hash.c auth.c inet_addr.c
> \
> - array.c trace.c toisc.c iscprint.c isclib.c
> -@@ -10,5 +10,5 @@ man_MANS = omapi.3
> - EXTRA_DIST = $(man_MANS)
> -
> - svtest_SOURCES = test.c
> --svtest_LDADD = libomapi.a \
> -+svtest_LDADD = libomapi.la \
> - $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
> -diff -up dhcp-4.3.1b1/server/Makefile.am.uCWMBl dhcp-
> 4.3.1b1/server/Makefile.am
> ---- dhcp-4.3.1b1/server/Makefile.am.uCWMBl 2014-07-10
> 17:36:30.486250948 +0200
> -+++ dhcp-4.3.1b1/server/Makefile.am 2014-07-10 17:38:10.780828554
> +0200
> -@@ -13,7 +13,7 @@ dhcpd_SOURCES = dhcpd.c dhcp.c bootp.c c
> - dhcpv6.c mdb6.c ldap.c ldap_casa.c
> -
> - dhcpd_CFLAGS = $(LDAP_CFLAGS)
> --dhcpd_LDADD = ../common/libdhcp.a ../omapip/libomapi.a
> ../dhcpctl/libdhcpctl.a \
> -+dhcpd_LDADD = ../common/libdhcp.a ../omapip/libomapi.la
> ../dhcpctl/libdhcpctl.la \
> - $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
> - man_MANS = dhcpd.8 dhcpd.conf.5 dhcpd.leases.5
> - EXTRA_DIST = $(man_MANS)
> -diff -up dhcp-4.3.1b1/server/tests/Makefile.am.uCWMBl dhcp-
> 4.3.1b1/server/tests/Makefile.am
> ---- dhcp-4.3.1b1/server/tests/Makefile.am.uCWMBl 2014-07-10
> 17:36:30.486250948 +0200
> -+++ dhcp-4.3.1b1/server/tests/Makefile.am 2014-07-10
> 17:38:10.780828554 +0200
> -@@ -17,8 +17,8 @@ DHCPSRC = ../dhcp.c ../bootp.c ../confpa
> - ../ddns.c ../dhcpleasequery.c ../dhcpv6.c ../mdb6.c \
> - ../ldap.c ../ldap_casa.c ../dhcpd.c
> -
> --DHCPLIBS = $(top_builddir)/common/libdhcp.a
> $(top_builddir)/omapip/libomapi.a \
> -- $(top_builddir)/dhcpctl/libdhcpctl.a \
> -+DHCPLIBS = $(top_builddir)/common/libdhcp.a
> $(top_builddir)/omapip/libomapi.la \
> -+ $(top_builddir)/dhcpctl/libdhcpctl.la \
> - $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
> -
> - ATF_TESTS =
> diff --git a/src/patches/dhcp/dhcp-stateless-DUID-LLT.patch
> b/src/patches/dhcp/dhcp-stateless-DUID-LLT.patch
> deleted file mode 100644
> index a7f22b539..000000000
> --- a/src/patches/dhcp/dhcp-stateless-DUID-LLT.patch
> +++ /dev/null
> @@ -1,48 +0,0 @@
> -From 61fa3dd9e789997f66e848c7e3fb2f554ee374e2 Mon Sep 17 00:00:00 2001
> -From: Jiri Popelka <jpopelka@redhat.com>
> -Date: Thu, 18 Dec 2014 11:53:26 +0100
> -Subject: [PATCH] Write DUID_LLT even in stateless mode.
> -
> -By default, DHCPv6 dhclient creates DUID-LL
> -if it is running in stateless mode (-6 -S) and
> -doesn't write it into leases file, most likely
> -because the DUID-LL is always generated the same.
> -
> -It's however possible to specify DUID to be of type LLT instead of LL
> -with '-D LLT'. Rfc 3315 says that:
> -'Clients and servers using this type of DUID MUST
> -store the DUID-LLT in stable storage.'
> -That's not fulfiled in this case (-6 -S -D LLT),
> -because it's generated each time again.
> -
> -It's not a big deal because the server doesn't store any
> -info about 'stateless' clients, so it doesn't matter
> -that the DUID-LLT is different each time.
> -But there's a TAHI test which tests this, i.e. that
> -DUID-LLT is still the same even in stateless mode.
> -It's a test DHCP_CONF.7.1.9, part B.
> -https://www.ipv6ready.org/docs/Phase2_DHCPv6_Conformance_Latest.pdf
> -
> -Signed-off-by: Jiri Popelka <jpopelka@redhat.com>
> ----
> - client/dhclient.c | 4 +++-
> - 1 file changed, 3 insertions(+), 1 deletion(-)
> -
> -diff --git a/client/dhclient.c b/client/dhclient.c
> -index 5ef59cd..026e3fe 100644
> ---- a/client/dhclient.c
> -+++ b/client/dhclient.c
> -@@ -788,7 +788,9 @@ void run_stateless(int exit_mode)
> - if (default_duid.buffer != NULL)
> - data_string_forget(&default_duid, MDL);
> -
> -- form_duid(&default_duid, MDL);
> -+ if (form_duid(&default_duid, MDL) == ISC_R_SUCCESS &&
> -+ duid_type == DUID_LLT)
> -+ write_duid(&default_duid);
> - }
> -
> - /* Start a configuration state machine. */
> ---
> -2.1.0
> -
> diff --git a/src/patches/dhcp/dhcp-unicast-bootp.patch
> b/src/patches/dhcp/dhcp-unicast-bootp.patch
> deleted file mode 100644
> index a0db9de69..000000000
> --- a/src/patches/dhcp/dhcp-unicast-bootp.patch
> +++ /dev/null
> @@ -1,101 +0,0 @@
> -diff -up dhcp-4.3.0a1/server/bootp.c.unicast dhcp-4.3.0a1/server/bootp.c
> ---- dhcp-4.3.0a1/server/bootp.c.unicast 2013-12-11 01:25:12.000000000
> +0100
> -+++ dhcp-4.3.0a1/server/bootp.c 2013-12-19 15:12:12.974671154 +0100
> -@@ -59,6 +59,7 @@ void bootp (packet)
> - char msgbuf [1024];
> - int ignorep;
> - int peer_has_leases = 0;
> -+ int norelay = 0;
> -
> - if (packet -> raw -> op != BOOTREQUEST)
> - return;
> -@@ -74,7 +75,7 @@ void bootp (packet)
> - ? inet_ntoa (packet -> raw -> giaddr)
> - : packet -> interface -> name);
> -
> -- if (!locate_network (packet)) {
> -+ if ((norelay = locate_network (packet)) == 0) {
> - log_info ("%s: network unknown", msgbuf);
> - return;
> - }
> -@@ -396,6 +397,15 @@ void bootp (packet)
> -
> - goto out;
> - }
> -+ } else if (norelay == 2) {
> -+ to.sin_addr = raw.ciaddr;
> -+ to.sin_port = remote_port;
> -+ if (fallback_interface) {
> -+ result = send_packet (fallback_interface, NULL,
> &raw,
> -+ outgoing.packet_length, from,
> -+ &to, &hto);
> -+ goto out;
> -+ }
> -
> - /* If it comes from a client that already knows its address
> - and is not requesting a broadcast response, and we can
> -diff -up dhcp-4.3.0a1/server/dhcp.c.unicast dhcp-4.3.0a1/server/dhcp.c
> ---- dhcp-4.3.0a1/server/dhcp.c.unicast 2013-12-13 21:50:38.000000000
> +0100
> -+++ dhcp-4.3.0a1/server/dhcp.c 2013-12-19 15:12:12.975671140 +0100
> -@@ -4627,6 +4627,7 @@ int locate_network (packet)
> - struct data_string data;
> - struct subnet *subnet = (struct subnet *)0;
> - struct option_cache *oc;
> -+ int norelay = 0;
> -
> - /* See if there's a Relay Agent Link Selection Option, or a
> - * Subnet Selection Option. The Link-Select and Subnet-Select
> -@@ -4642,12 +4643,24 @@ int locate_network (packet)
> - from the interface, if there is one. If not, fail. */
> - if (!oc && !packet -> raw -> giaddr.s_addr) {
> - if (packet -> interface -> shared_network) {
> -- shared_network_reference
> -- (&packet -> shared_network,
> -- packet -> interface -> shared_network,
> MDL);
> -- return 1;
> -+ struct in_addr any_addr;
> -+ any_addr.s_addr = INADDR_ANY;
> -+
> -+ if (!packet -> packet_type && memcmp(&packet -> raw
> -> ciaddr, &any_addr, 4)) {
> -+ struct iaddr cip;
> -+ memcpy(cip.iabuf, &packet -> raw -> ciaddr,
> 4);
> -+ cip.len = 4;
> -+ if (!find_grouped_subnet(&subnet, packet-
> >interface->shared_network, cip, MDL))
> -+ norelay = 2;
> -+ }
> -+
> -+ if (!norelay) {
> -+ shared_network_reference(&packet ->
> shared_network, packet -> interface -> shared_network, MDL);
> -+ return 1;
> -+ }
> -+ } else {
> -+ return 0;
> - }
> -- return 0;
> - }
> -
> - /* If there's an option indicating link connection, and it's valid,
> -@@ -4670,7 +4683,10 @@ int locate_network (packet)
> - data_string_forget (&data, MDL);
> - } else {
> - ia.len = 4;
> -- memcpy (ia.iabuf, &packet -> raw -> giaddr, 4);
> -+ if (norelay)
> -+ memcpy (ia.iabuf, &packet->raw->ciaddr, 4);
> -+ else
> -+ memcpy (ia.iabuf, &packet->raw->giaddr, 4);
> - }
> -
> - /* If we know the subnet on which the IP address lives, use it. */
> -@@ -4678,7 +4694,10 @@ int locate_network (packet)
> - shared_network_reference (&packet -> shared_network,
> - subnet -> shared_network, MDL);
> - subnet_dereference (&subnet, MDL);
> -- return 1;
> -+ if (norelay)
> -+ return norelay;
> -+ else
> -+ return 1;
> - }
> -
> - /* Otherwise, fail. */
> diff --git a/src/patches/dhcp/dhcp-xen-checksum.patch b/src/patches/dhcp/dhcp-
> xen-checksum.patch
> deleted file mode 100644
> index eabc3c127..000000000
> --- a/src/patches/dhcp/dhcp-xen-checksum.patch
> +++ /dev/null
> @@ -1,251 +0,0 @@
> -diff -up dhcp-4.3.0rc1/common/bpf.c.xen dhcp-4.3.0rc1/common/bpf.c
> ---- dhcp-4.3.0rc1/common/bpf.c.xen 2014-01-29 10:03:27.503941664 +0100
> -+++ dhcp-4.3.0rc1/common/bpf.c 2014-01-29 10:03:37.564812175 +0100
> -@@ -481,7 +481,7 @@ ssize_t receive_packet (interface, buf,
> - /* Decode the IP and UDP headers... */
> - offset = decode_udp_ip_header(interface, interface->rbuf,
> - interface->rbuf_offset,
> -- from, hdr.bh_caplen,
> &paylen);
> -+ from, hdr.bh_caplen,
> &paylen, 0);
> -
> - /* If the IP or UDP checksum was bad, skip the packet... */
> - if (offset < 0) {
> -diff -up dhcp-4.3.0rc1/common/dlpi.c.xen dhcp-4.3.0rc1/common/dlpi.c
> ---- dhcp-4.3.0rc1/common/dlpi.c.xen 2014-01-25 05:18:03.000000000
> +0100
> -+++ dhcp-4.3.0rc1/common/dlpi.c 2014-01-29 10:03:27.503941664 +0100
> -@@ -691,7 +691,7 @@ ssize_t receive_packet (interface, buf,
> - length -= offset;
> - #endif
> - offset = decode_udp_ip_header (interface, dbuf, bufix,
> -- from, length, &paylen);
> -+ from, length, &paylen, 0);
> -
> - /*
> - * If the IP or UDP checksum was bad, skip the packet...
> -diff -up dhcp-4.3.0rc1/common/lpf.c.xen dhcp-4.3.0rc1/common/lpf.c
> ---- dhcp-4.3.0rc1/common/lpf.c.xen 2014-01-25 05:18:03.000000000 +0100
> -+++ dhcp-4.3.0rc1/common/lpf.c 2014-01-29 10:03:27.504941651 +0100
> -@@ -29,14 +29,15 @@
> -
> - #include "dhcpd.h"
> - #if defined (USE_LPF_SEND) || defined (USE_LPF_RECEIVE)
> -+#include <sys/socket.h>
> - #include <sys/uio.h>
> - #include <errno.h>
> -
> - #include <asm/types.h>
> - #include <linux/filter.h>
> - #include <linux/if_ether.h>
> -+#include <linux/if_packet.h>
> - #include <netinet/in_systm.h>
> --#include <net/if_packet.h>
> - #include "includes/netinet/ip.h"
> - #include "includes/netinet/udp.h"
> - #include "includes/netinet/if_ether.h"
> -@@ -51,6 +52,19 @@
> - /* Reinitializes the specified interface after an address change. This
> - is not required for packet-filter APIs. */
> -
> -+#ifndef PACKET_AUXDATA
> -+#define PACKET_AUXDATA 8
> -+
> -+struct tpacket_auxdata
> -+{
> -+ __u32 tp_status;
> -+ __u32 tp_len;
> -+ __u32 tp_snaplen;
> -+ __u16 tp_mac;
> -+ __u16 tp_net;
> -+};
> -+#endif
> -+
> - #ifdef USE_LPF_SEND
> - void if_reinitialize_send (info)
> - struct interface_info *info;
> -@@ -73,10 +87,14 @@ int if_register_lpf (info)
> - struct interface_info *info;
> - {
> - int sock;
> -- struct sockaddr sa;
> -+ union {
> -+ struct sockaddr_ll ll;
> -+ struct sockaddr common;
> -+ } sa;
> -+ struct ifreq ifr;
> -
> - /* Make an LPF socket. */
> -- if ((sock = socket(PF_PACKET, SOCK_PACKET,
> -+ if ((sock = socket(PF_PACKET, SOCK_RAW,
> - htons((short)ETH_P_ALL))) < 0) {
> - if (errno == ENOPROTOOPT || errno == EPROTONOSUPPORT ||
> - errno == ESOCKTNOSUPPORT || errno == EPFNOSUPPORT ||
> -@@ -91,11 +109,17 @@ int if_register_lpf (info)
> - log_fatal ("Open a socket for LPF: %m");
> - }
> -
> -+ memset (&ifr, 0, sizeof ifr);
> -+ strncpy (ifr.ifr_name, (const char *)info -> ifp, sizeof
> ifr.ifr_name);
> -+ ifr.ifr_name[IFNAMSIZ-1] = '\0';
> -+ if (ioctl (sock, SIOCGIFINDEX, &ifr))
> -+ log_fatal ("Failed to get interface index: %m");
> -+
> - /* Bind to the interface name */
> - memset (&sa, 0, sizeof sa);
> -- sa.sa_family = AF_PACKET;
> -- strncpy (sa.sa_data, (const char *)info -> ifp, sizeof sa.sa_data);
> -- if (bind (sock, &sa, sizeof sa)) {
> -+ sa.ll.sll_family = AF_PACKET;
> -+ sa.ll.sll_ifindex = ifr.ifr_ifindex;
> -+ if (bind (sock, &sa.common, sizeof sa)) {
> - if (errno == ENOPROTOOPT || errno == EPROTONOSUPPORT ||
> - errno == ESOCKTNOSUPPORT || errno == EPFNOSUPPORT ||
> - errno == EAFNOSUPPORT || errno == EINVAL) {
> -@@ -177,9 +201,18 @@ static void lpf_gen_filter_setup (struct
> - void if_register_receive (info)
> - struct interface_info *info;
> - {
> -+ int val;
> -+
> - /* Open a LPF device and hang it on this interface... */
> - info -> rfdesc = if_register_lpf (info);
> -
> -+ val = 1;
> -+ if (setsockopt (info -> rfdesc, SOL_PACKET, PACKET_AUXDATA, &val,
> -+ sizeof val) < 0) {
> -+ if (errno != ENOPROTOOPT)
> -+ log_fatal ("Failed to set auxiliary packet data:
> %m");
> -+ }
> -+
> - #if defined (HAVE_TR_SUPPORT)
> - if (info -> hw_address.hbuf [0] == HTYPE_IEEE802)
> - lpf_tr_filter_setup (info);
> -@@ -301,7 +334,6 @@ ssize_t send_packet (interface, packet,
> - double hh [16];
> - double ih [1536 / sizeof (double)];
> - unsigned char *buf = (unsigned char *)ih;
> -- struct sockaddr_pkt sa;
> - int result;
> - int fudge;
> -
> -@@ -322,17 +354,7 @@ ssize_t send_packet (interface, packet,
> - (unsigned char *)raw, len);
> - memcpy (buf + ibufp, raw, len);
> -
> -- /* For some reason, SOCK_PACKET sockets can't be connected,
> -- so we have to do a sentdo every time. */
> -- memset (&sa, 0, sizeof sa);
> -- sa.spkt_family = AF_PACKET;
> -- strncpy ((char *)sa.spkt_device,
> -- (const char *)interface -> ifp, sizeof sa.spkt_device);
> -- sa.spkt_protocol = htons(ETH_P_IP);
> --
> -- result = sendto (interface -> wfdesc,
> -- buf + fudge, ibufp + len - fudge, 0,
> -- (const struct sockaddr *)&sa, sizeof sa);
> -+ result = write (interface -> wfdesc, buf + fudge, ibufp + len -
> fudge);
> - if (result < 0)
> - log_error ("send_packet: %m");
> - return result;
> -@@ -349,14 +371,35 @@ ssize_t receive_packet (interface, buf,
> - {
> - int length = 0;
> - int offset = 0;
> -+ int nocsum = 0;
> - unsigned char ibuf [1536];
> - unsigned bufix = 0;
> - unsigned paylen;
> -+ unsigned char cmsgbuf[CMSG_LEN(sizeof(struct tpacket_auxdata))];
> -+ struct iovec iov = {
> -+ .iov_base = ibuf,
> -+ .iov_len = sizeof ibuf,
> -+ };
> -+ struct msghdr msg = {
> -+ .msg_iov = &iov,
> -+ .msg_iovlen = 1,
> -+ .msg_control = cmsgbuf,
> -+ .msg_controllen = sizeof(cmsgbuf),
> -+ };
> -+ struct cmsghdr *cmsg;
> -
> -- length = read (interface -> rfdesc, ibuf, sizeof ibuf);
> -+ length = recvmsg (interface -> rfdesc, &msg, 0);
> - if (length <= 0)
> - return length;
> -
> -+ for (cmsg = CMSG_FIRSTHDR(&msg); cmsg; cmsg = CMSG_NXTHDR(&msg,
> cmsg)) {
> -+ if (cmsg->cmsg_level == SOL_PACKET &&
> -+ cmsg->cmsg_type == PACKET_AUXDATA) {
> -+ struct tpacket_auxdata *aux = (void
> *)CMSG_DATA(cmsg);
> -+ nocsum = aux->tp_status & TP_STATUS_CSUMNOTREADY;
> -+ }
> -+ }
> -+
> - bufix = 0;
> - /* Decode the physical header... */
> - offset = decode_hw_header (interface, ibuf, bufix, hfrom);
> -@@ -373,7 +416,7 @@ ssize_t receive_packet (interface, buf,
> -
> - /* Decode the IP and UDP headers... */
> - offset = decode_udp_ip_header (interface, ibuf, bufix, from,
> -- (unsigned)length, &paylen);
> -+ (unsigned)length, &paylen, nocsum);
> -
> - /* If the IP or UDP checksum was bad, skip the packet... */
> - if (offset < 0)
> -diff -up dhcp-4.3.0rc1/common/nit.c.xen dhcp-4.3.0rc1/common/nit.c
> ---- dhcp-4.3.0rc1/common/nit.c.xen 2014-01-26 19:40:44.000000000 +0100
> -+++ dhcp-4.3.0rc1/common/nit.c 2014-01-29 10:03:27.504941651 +0100
> -@@ -363,7 +363,7 @@ ssize_t receive_packet (interface, buf,
> -
> - /* Decode the IP and UDP headers... */
> - offset = decode_udp_ip_header (interface, ibuf, bufix,
> -- from, length, &paylen);
> -+ from, length, &paylen, 0);
> -
> - /* If the IP or UDP checksum was bad, skip the packet... */
> - if (offset < 0)
> -diff -up dhcp-4.3.0rc1/common/packet.c.xen dhcp-4.3.0rc1/common/packet.c
> ---- dhcp-4.3.0rc1/common/packet.c.xen 2013-12-11 01:01:02.000000000
> +0100
> -+++ dhcp-4.3.0rc1/common/packet.c 2014-01-29 10:03:27.504941651 +0100
> -@@ -226,7 +226,7 @@ ssize_t
> - decode_udp_ip_header(struct interface_info *interface,
> - unsigned char *buf, unsigned bufix,
> - struct sockaddr_in *from, unsigned buflen,
> -- unsigned *rbuflen)
> -+ unsigned *rbuflen, int nocsum)
> - {
> - unsigned char *data;
> - struct ip ip;
> -@@ -337,7 +337,7 @@ decode_udp_ip_header(struct interface_in
> - 8, IPPROTO_UDP + ulen))));
> -
> - udp_packets_seen++;
> -- if (usum && usum != sum) {
> -+ if (!nocsum && usum && usum != sum) {
> - udp_packets_bad_checksum++;
> - if (udp_packets_seen > 4 &&
> - (udp_packets_seen / udp_packets_bad_checksum) < 2) {
> -diff -up dhcp-4.3.0rc1/common/upf.c.xen dhcp-4.3.0rc1/common/upf.c
> ---- dhcp-4.3.0rc1/common/upf.c.xen 2014-01-26 19:40:44.000000000 +0100
> -+++ dhcp-4.3.0rc1/common/upf.c 2014-01-29 10:03:27.505941638 +0100
> -@@ -314,7 +314,7 @@ ssize_t receive_packet (interface, buf,
> -
> - /* Decode the IP and UDP headers... */
> - offset = decode_udp_ip_header (interface, ibuf, bufix,
> -- from, length, &paylen);
> -+ from, length, &paylen, 0);
> -
> - /* If the IP or UDP checksum was bad, skip the packet... */
> - if (offset < 0)
> -diff -up dhcp-4.3.0rc1/includes/dhcpd.h.xen dhcp-4.3.0rc1/includes/dhcpd.h
> ---- dhcp-4.3.0rc1/includes/dhcpd.h.xen 2014-01-29 10:03:27.489941844
> +0100
> -+++ dhcp-4.3.0rc1/includes/dhcpd.h 2014-01-29 10:03:27.506941626 +0100
> -@@ -2861,7 +2861,7 @@ ssize_t decode_hw_header (struct interfa
> - unsigned, struct hardware *);
> - ssize_t decode_udp_ip_header (struct interface_info *, unsigned char *,
> - unsigned, struct sockaddr_in *,
> -- unsigned, unsigned *);
> -+ unsigned, unsigned *, int);
> -
> - /* ethernet.c */
> - void assemble_ethernet_header (struct interface_info *, unsigned char *,
Hi,
On 01.05.2018 13:18, Michael Tremer wrote:
> Hi,
>
> okay. Let's wait until we hear back from the testers.
No problem.
> Are you sure that dropping the big patchset doesn't cause us any problems?
No. But it was the only chance I saw to build this version. The code
changed in a way that I should have rewritten the patches from scratch
and that is far beyond my skills.
Besides, I'm *never* really sure or trust any kind of software. Software
is basically evil. ;-)
By now, I'm testing in my (home) environment and the new version is
doing its job since the update. No complaints, crashes or seen problems.
Best,
Matthias
> Best,
> -Michael
>
> On Mon, 2018-04-30 at 15:07 +0200, Matthias Fischer wrote:
>> For details see:
>> https://kb.isc.org/article/AA-01571/82/DHCP-4.4.1-Release-Notes.html
>>
>> This closes https://bugzilla.ipfire.org/show_bug.cgi?id=11697 and
>> https://bugzilla.ipfire.org/show_bug.cgi?id=11293, hopefully.
>>
>> This update required some changes as described in:
>> https://bugzilla.ipfire.org/show_bug.cgi?id=11697#c6
>>
>> Best,
>> Matthias
>>
>> Signed-off-by: Matthias Fischer <matthias.fischer@ipfire.org>
>> ---
>> config/rootfiles/common/dhcp | 4 +-
>> lfs/dhcp | 39 +-
>> .../dhcp/dhcp-64_bit_lease_parse.patch | 75 ---
>> src/patches/dhcp/dhcp-CLOEXEC.patch | 342 ----------
>> src/patches/dhcp/dhcp-PPP.patch | 150 -----
>> src/patches/dhcp/dhcp-UseMulticast.patch | 241 --------
>> .../dhcp/dhcp-add_timeout_when_NULL.patch | 14 -
>> src/patches/dhcp/dhcp-capability.patch | 250 --------
>> .../dhcp/dhcp-default-requested-options.patch | 44 --
>> .../dhcp/dhcp-dhclient-decline-backoff.patch | 63 --
>> src/patches/dhcp/dhcp-dhclient-options.patch | 509 ---------------
>> src/patches/dhcp/dhcp-errwarn-message.patch | 22 -
>> src/patches/dhcp/dhcp-garbage-chars.patch | 12 -
>> src/patches/dhcp/dhcp-gpxe-cid.patch | 73 ---
>> src/patches/dhcp/dhcp-honor-expired.patch | 49 --
>> src/patches/dhcp/dhcp-improved-xid.patch | 138 -----
>> src/patches/dhcp/dhcp-logpid.patch | 11 -
>> src/patches/dhcp/dhcp-lpf-ib.patch | 585 ------------------
>> src/patches/dhcp/dhcp-manpages.patch | 157 -----
>> src/patches/dhcp/dhcp-paranoia.patch | 156 -----
>> src/patches/dhcp/dhcp-paths.patch | 44 --
>> src/patches/dhcp/dhcp-release-by-ifup.patch | 85 ---
>> src/patches/dhcp/dhcp-remove-bind.patch | 192 ------
>> ...dhcp-rfc3442-classless-static-routes.patch | 405 ------------
>> src/patches/dhcp/dhcp-sendDecline.patch | 231 -------
>> src/patches/dhcp/dhcp-sharedlib.patch | 107 ----
>> .../dhcp/dhcp-stateless-DUID-LLT.patch | 48 --
>> src/patches/dhcp/dhcp-unicast-bootp.patch | 101 ---
>> src/patches/dhcp/dhcp-xen-checksum.patch | 251 --------
>> 29 files changed, 7 insertions(+), 4391 deletions(-)
>> delete mode 100644 src/patches/dhcp/dhcp-64_bit_lease_parse.patch
>> delete mode 100644 src/patches/dhcp/dhcp-CLOEXEC.patch
>> delete mode 100644 src/patches/dhcp/dhcp-PPP.patch
>> delete mode 100644 src/patches/dhcp/dhcp-UseMulticast.patch
>> delete mode 100644 src/patches/dhcp/dhcp-add_timeout_when_NULL.patch
>> delete mode 100644 src/patches/dhcp/dhcp-capability.patch
>> delete mode 100644 src/patches/dhcp/dhcp-default-requested-options.patch
>> delete mode 100644 src/patches/dhcp/dhcp-dhclient-decline-backoff.patch
>> delete mode 100644 src/patches/dhcp/dhcp-dhclient-options.patch
>> delete mode 100644 src/patches/dhcp/dhcp-errwarn-message.patch
>> delete mode 100644 src/patches/dhcp/dhcp-garbage-chars.patch
>> delete mode 100644 src/patches/dhcp/dhcp-gpxe-cid.patch
>> delete mode 100644 src/patches/dhcp/dhcp-honor-expired.patch
>> delete mode 100644 src/patches/dhcp/dhcp-improved-xid.patch
>> delete mode 100644 src/patches/dhcp/dhcp-logpid.patch
>> delete mode 100644 src/patches/dhcp/dhcp-lpf-ib.patch
>> delete mode 100644 src/patches/dhcp/dhcp-manpages.patch
>> delete mode 100644 src/patches/dhcp/dhcp-paranoia.patch
>> delete mode 100644 src/patches/dhcp/dhcp-paths.patch
>> delete mode 100644 src/patches/dhcp/dhcp-release-by-ifup.patch
>> delete mode 100644 src/patches/dhcp/dhcp-remove-bind.patch
>> delete mode 100644 src/patches/dhcp/dhcp-rfc3442-classless-static-
>> routes.patch
>> delete mode 100644 src/patches/dhcp/dhcp-sendDecline.patch
>> delete mode 100644 src/patches/dhcp/dhcp-sharedlib.patch
>> delete mode 100644 src/patches/dhcp/dhcp-stateless-DUID-LLT.patch
>> delete mode 100644 src/patches/dhcp/dhcp-unicast-bootp.patch
>> delete mode 100644 src/patches/dhcp/dhcp-xen-checksum.patch
>>
>> diff --git a/config/rootfiles/common/dhcp b/config/rootfiles/common/dhcp
>> index ff225a571..9e6d52e4e 100644
>> --- a/config/rootfiles/common/dhcp
>> +++ b/config/rootfiles/common/dhcp
>> @@ -5,8 +5,6 @@ etc/dhcp/dhcpd.conf
>> #usr/bin/omshell
>> #usr/include/dhcpctl
>> #usr/include/dhcpctl/dhcpctl.h
>> -#usr/include/isc-dhcp
>> -#usr/include/isc-dhcp/dst.h
>> #usr/include/omapip
>> #usr/include/omapip/alloc.h
>> #usr/include/omapip/buffer.h
>> @@ -17,8 +15,8 @@ etc/dhcp/dhcpd.conf
>> #usr/include/omapip/omapip_p.h
>> #usr/include/omapip/result.h
>> #usr/include/omapip/trace.h
>> +#usr/lib/libdhcp.a
>> #usr/lib/libdhcpctl.a
>> -#usr/lib/libdst.a
>> #usr/lib/libomapi.a
>> #usr/sbin/dhclient
>> usr/sbin/dhcpd
>> diff --git a/lfs/dhcp b/lfs/dhcp
>> index 262a25129..a055d6081 100644
>> --- a/lfs/dhcp
>> +++ b/lfs/dhcp
>> @@ -1,7 +1,7 @@
>> #############################################################################
>> ##
>> #
>> #
>> # IPFire.org - A linux based
>> firewall #
>> -# Copyright (C) 2007-2015 IPFire Team <info@ipfire.org>
>> #
>> +# Copyright (C) 2007-2018 IPFire Team <info@ipfire.org>
>> #
>> #
>> #
>> # This program is free software: you can redistribute it and/or
>> modify #
>> # it under the terms of the GNU General Public License as published
>> by #
>> @@ -24,7 +24,7 @@
>>
>> include Config
>>
>> -VER = 4.3.1
>> +VER = 4.4.1
>>
>> THISAPP = dhcp-$(VER)
>> DL_FILE = $(THISAPP).tar.gz
>> @@ -40,7 +40,7 @@ objects = $(DL_FILE)
>>
>> $(DL_FILE) = $(DL_FROM)/$(DL_FILE)
>>
>> -$(DL_FILE)_MD5 = b3a42ece3c7f2cd2e74a3e12ca881d20
>> +$(DL_FILE)_MD5 = 18c7f4dcbb0a63df25098216d47b1ede
>>
>> install : $(TARGET)
>>
>> @@ -71,47 +71,20 @@ $(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
>> @$(PREBUILD)
>> @rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar zxf $(DIR_DL)/$(DL_FILE)
>>
>> - cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-
>> remove-bind.patch
>> - cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-
>> errwarn-message.patch
>> - cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-
>> dhclient-options.patch
>> - cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-
>> release-by-ifup.patch
>> - cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-
>> dhclient-decline-backoff.patch
>> - cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-
>> unicast-bootp.patch
>> - cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-
>> default-requested-options.patch
>> - cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-xen-
>> checksum.patch
>> - cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-
>> manpages.patch
>> - cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-
>> paths.patch
>> - cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-
>> CLOEXEC.patch
>> - cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-
>> garbage-chars.patch
>> - cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-
>> add_timeout_when_NULL.patch
>> - cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-
>> 64_bit_lease_parse.patch
>> - cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-
>> capability.patch
>> - cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-
>> logpid.patch
>> - cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-
>> UseMulticast.patch
>> - cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-
>> sendDecline.patch
>> - cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-
>> rfc3442-classless-static-routes.patch
>> - cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-honor-
>> expired.patch
>> - cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-
>> sharedlib.patch
>> - cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-
>> PPP.patch
>> - cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-
>> paranoia.patch
>> - cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-lpf-
>> ib.patch
>> - cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-
>> improved-xid.patch
>> - cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-gpxe-
>> cid.patch
>> - cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-
>> stateless-DUID-LLT.patch
>> -
>> # Help unpacking bundled BIND
>> - cd $(DIR_APP) && sed -e "s/gunzip -c/&d/" -i bind/Makefile
>> + cd $(DIR_APP) && sed -e "s/gunzip -c/&d/" -i bind/Makefile.in
>>
>> cd $(DIR_APP) && \
>> ./configure \
>> --prefix=/usr \
>> --sysconfdir=/etc/dhcp \
>> + --with-srv-conf-file=/etc/dhcp/dhcpd.conf \
>> --with-srv-lease-file=/var/state/dhcp/dhcpd.leases \
>> --enable-paranoia \
>> --enable-early-chroot \
>> --disable-dhcpv6
>>
>> - cd $(DIR_APP) && make $(MAKETUNING)
>> + cd $(DIR_APP) && make
>> cd $(DIR_APP) && make install
>>
>> mkdir -pv /var/state/dhcp
>> diff --git a/src/patches/dhcp/dhcp-64_bit_lease_parse.patch
>> b/src/patches/dhcp/dhcp-64_bit_lease_parse.patch
>> deleted file mode 100644
>> index a07b5b032..000000000
>> --- a/src/patches/dhcp/dhcp-64_bit_lease_parse.patch
>> +++ /dev/null
>> @@ -1,75 +0,0 @@
>> -diff -up dhcp-4.3.0a1/common/parse.c.64-bit_lease_parse dhcp-
>> 4.3.0a1/common/parse.c
>> ---- dhcp-4.3.0a1/common/parse.c.64-bit_lease_parse 2013-12-11
>> 01:25:12.000000000 +0100
>> -+++ dhcp-4.3.0a1/common/parse.c 2013-12-19 15:45:25.990771814 +0100
>> -@@ -938,8 +938,8 @@ TIME
>> - parse_date_core(cfile)
>> - struct parse *cfile;
>> - {
>> -- int guess;
>> -- int tzoff, year, mon, mday, hour, min, sec;
>> -+ TIME guess;
>> -+ long int tzoff, year, mon, mday, hour, min, sec;
>> - const char *val;
>> - enum dhcp_token token;
>> - static int months[11] = { 31, 59, 90, 120, 151, 181,
>> -@@ -965,7 +965,7 @@ parse_date_core(cfile)
>> - }
>> -
>> - skip_token(&val, NULL, cfile); /* consume number */
>> -- guess = atoi(val);
>> -+ guess = atol(val);
>> -
>> - return((TIME)guess);
>> - }
>> -@@ -993,7 +993,7 @@ parse_date_core(cfile)
>> - somebody invents a time machine, I think we can safely disregard
>> - it. This actually works around a stupid Y2K bug that was
>> present
>> - in a very early beta release of dhcpd. */
>> -- year = atoi(val);
>> -+ year = atol(val);
>> - if (year > 1900)
>> - year -= 1900;
>> -
>> -@@ -1039,7 +1039,7 @@ parse_date_core(cfile)
>> - return((TIME)0);
>> - }
>> - skip_token(&val, NULL, cfile); /* consume day of month */
>> -- mday = atoi(val);
>> -+ mday = atol(val);
>> -
>> - /* Hour... */
>> - token = peek_token(&val, NULL, cfile);
>> -@@ -1050,7 +1050,7 @@ parse_date_core(cfile)
>> - return((TIME)0);
>> - }
>> - skip_token(&val, NULL, cfile); /* consume hour */
>> -- hour = atoi(val);
>> -+ hour = atol(val);
>> -
>> - /* Colon separating hour from minute... */
>> - token = peek_token(&val, NULL, cfile);
>> -@@ -1072,7 +1072,7 @@ parse_date_core(cfile)
>> - return((TIME)0);
>> - }
>> - skip_token(&val, NULL, cfile); /* consume minute */
>> -- min = atoi(val);
>> -+ min = atol(val);
>> -
>> - /* Colon separating minute from second... */
>> - token = peek_token(&val, NULL, cfile);
>> -@@ -1094,13 +1094,13 @@ parse_date_core(cfile)
>> - return((TIME)0);
>> - }
>> - skip_token(&val, NULL, cfile); /* consume second */
>> -- sec = atoi(val);
>> -+ sec = atol(val);
>> -
>> - tzoff = 0;
>> - token = peek_token(&val, NULL, cfile);
>> - if (token == NUMBER) {
>> - skip_token(&val, NULL, cfile); /* consume tzoff */
>> -- tzoff = atoi(val);
>> -+ tzoff = atol(val);
>> - } else if (token != SEMI) {
>> - skip_token(&val, NULL, cfile);
>> - parse_warn(cfile,
>> diff --git a/src/patches/dhcp/dhcp-CLOEXEC.patch b/src/patches/dhcp/dhcp-
>> CLOEXEC.patch
>> deleted file mode 100644
>> index 722865e4f..000000000
>> --- a/src/patches/dhcp/dhcp-CLOEXEC.patch
>> +++ /dev/null
>> @@ -1,342 +0,0 @@
>> -diff -up dhcp-4.3.0a1/client/clparse.c.cloexec dhcp-4.3.0a1/client/clparse.c
>> ---- dhcp-4.3.0a1/client/clparse.c.cloexec 2013-12-19
>> 15:34:41.638886256 +0100
>> -+++ dhcp-4.3.0a1/client/clparse.c 2013-12-19 15:34:41.657885985 +0100
>> -@@ -253,7 +253,7 @@ int read_client_conf_file (const char *n
>> - int token;
>> - isc_result_t status;
>> -
>> -- if ((file = open (name, O_RDONLY)) < 0)
>> -+ if ((file = open (name, O_RDONLY | O_CLOEXEC)) < 0)
>> - return uerr2isc (errno);
>> -
>> - cfile = NULL;
>> -@@ -290,7 +290,7 @@ void read_client_leases ()
>> -
>> - /* Open the lease file. If we can't open it, just return -
>> - we can safely trust the server to remember our state. */
>> -- if ((file = open (path_dhclient_db, O_RDONLY)) < 0)
>> -+ if ((file = open (path_dhclient_db, O_RDONLY | O_CLOEXEC)) < 0)
>> - return;
>> -
>> - cfile = NULL;
>> -diff -up dhcp-4.3.0a1/client/dhclient.c.cloexec dhcp-
>> 4.3.0a1/client/dhclient.c
>> ---- dhcp-4.3.0a1/client/dhclient.c.cloexec 2013-12-19
>> 15:34:41.629886384 +0100
>> -+++ dhcp-4.3.0a1/client/dhclient.c 2013-12-19 15:36:41.608180467 +0100
>> -@@ -148,11 +148,11 @@ main(int argc, char **argv) {
>> - /* Make sure that file descriptors 0 (stdin), 1, (stdout), and
>> - 2 (stderr) are open. To do this, we assume that when we
>> - open a file the lowest available file descriptor is used. */
>> -- fd = open("/dev/null", O_RDWR);
>> -+ fd = open("/dev/null", O_RDWR | O_CLOEXEC);
>> - if (fd == 0)
>> -- fd = open("/dev/null", O_RDWR);
>> -+ fd = open("/dev/null", O_RDWR | O_CLOEXEC);
>> - if (fd == 1)
>> -- fd = open("/dev/null", O_RDWR);
>> -+ fd = open("/dev/null", O_RDWR | O_CLOEXEC);
>> - if (fd == 2)
>> - log_perror = 0; /* No sense logging to /dev/null. */
>> - else if (fd != -1)
>> -@@ -504,7 +504,7 @@ main(int argc, char **argv) {
>> - long temp;
>> - int e;
>> -
>> -- if ((pidfd = fopen(path_dhclient_pid, "r")) != NULL) {
>> -+ if ((pidfd = fopen(path_dhclient_pid, "re")) != NULL) {
>> - e = fscanf(pidfd, "%ld\n", &temp);
>> - oldpid = (pid_t)temp;
>> -
>> -@@ -554,7 +554,7 @@ main(int argc, char **argv) {
>> - strncpy(new_path_dhclient_pid,
>> path_dhclient_pid, pfx);
>> - sprintf(new_path_dhclient_pid + pfx,
>> "-%s.pid", ip->name);
>> -
>> -- if ((pidfd =
>> fopen(new_path_dhclient_pid, "r")) != NULL) {
>> -+ if ((pidfd =
>> fopen(new_path_dhclient_pid, "re")) != NULL) {
>> - e = fscanf(pidfd, "%ld\n",
>> &temp);
>> - oldpid = (pid_t)temp;
>> -
>> -@@ -579,7 +579,7 @@ main(int argc, char **argv) {
>> - int dhc_running = 0;
>> - char procfn[256] = "";
>> -
>> -- if ((pidfp = fopen(path_dhclient_pid, "r")) != NULL) {
>> -+ if ((pidfp = fopen(path_dhclient_pid, "re")) != NULL) {
>> - if ((fscanf(pidfp, "%ld", &temp)==1) &&
>> ((dhcpid=(pid_t)temp) > 0)) {
>> - snprintf(procfn,256,"/proc/%u",dhcpid);
>> - dhc_running = (access(procfn, F_OK) == 0);
>> -@@ -3077,7 +3077,7 @@ void rewrite_client_leases ()
>> -
>> - if (leaseFile != NULL)
>> - fclose (leaseFile);
>> -- leaseFile = fopen (path_dhclient_db, "w");
>> -+ leaseFile = fopen (path_dhclient_db, "we");
>> - if (leaseFile == NULL) {
>> - log_error ("can't create %s: %m", path_dhclient_db);
>> - return;
>> -@@ -3261,7 +3261,7 @@ write_duid(struct data_string *duid)
>> - return DHCP_R_INVALIDARG;
>> -
>> - if (leaseFile == NULL) { /* XXX? */
>> -- leaseFile = fopen(path_dhclient_db, "w");
>> -+ leaseFile = fopen(path_dhclient_db, "we");
>> - if (leaseFile == NULL) {
>> - log_error("can't create %s: %m", path_dhclient_db);
>> - return ISC_R_IOERROR;
>> -@@ -3441,7 +3441,7 @@ int write_client_lease (client, lease, r
>> - return 1;
>> -
>> - if (leaseFile == NULL) { /* XXX */
>> -- leaseFile = fopen (path_dhclient_db, "w");
>> -+ leaseFile = fopen (path_dhclient_db, "we");
>> - if (leaseFile == NULL) {
>> - log_error ("can't create %s: %m", path_dhclient_db);
>> - return 0;
>> -@@ -3952,9 +3952,9 @@ void go_daemon ()
>> - (void) close(2);
>> -
>> - /* Reopen them on /dev/null. */
>> -- (void) open("/dev/null", O_RDWR);
>> -- (void) open("/dev/null", O_RDWR);
>> -- (void) open("/dev/null", O_RDWR);
>> -+ (void) open("/dev/null", O_RDWR | O_CLOEXEC);
>> -+ (void) open("/dev/null", O_RDWR | O_CLOEXEC);
>> -+ (void) open("/dev/null", O_RDWR | O_CLOEXEC);
>> -
>> - write_client_pid_file ();
>> -
>> -@@ -3971,14 +3971,14 @@ void write_client_pid_file ()
>> - return;
>> - }
>> -
>> -- pfdesc = open (path_dhclient_pid, O_CREAT | O_TRUNC | O_WRONLY,
>> 0644);
>> -+ pfdesc = open (path_dhclient_pid, O_CREAT | O_TRUNC | O_WRONLY |
>> O_CLOEXEC, 0644);
>> -
>> - if (pfdesc < 0) {
>> - log_error ("Can't create %s: %m", path_dhclient_pid);
>> - return;
>> - }
>> -
>> -- pf = fdopen (pfdesc, "w");
>> -+ pf = fdopen (pfdesc, "we");
>> - if (!pf) {
>> - close(pfdesc);
>> - log_error ("Can't fdopen %s: %m", path_dhclient_pid);
>> -diff -up dhcp-4.3.0a1/common/bpf.c.cloexec dhcp-4.3.0a1/common/bpf.c
>> ---- dhcp-4.3.0a1/common/bpf.c.cloexec 2013-12-19 15:34:41.640886227
>> +0100
>> -+++ dhcp-4.3.0a1/common/bpf.c 2013-12-19 15:34:41.661885928 +0100
>> -@@ -95,7 +95,7 @@ int if_register_bpf (info)
>> - for (b = 0; 1; b++) {
>> - /* %Audit% 31 bytes max. %2004.06.17,Safe% */
>> - sprintf(filename, BPF_FORMAT, b);
>> -- sock = open (filename, O_RDWR, 0);
>> -+ sock = open (filename, O_RDWR | O_CLOEXEC, 0);
>> - if (sock < 0) {
>> - if (errno == EBUSY) {
>> - continue;
>> -diff -up dhcp-4.3.0a1/common/dlpi.c.cloexec dhcp-4.3.0a1/common/dlpi.c
>> ---- dhcp-4.3.0a1/common/dlpi.c.cloexec 2013-12-19 15:34:41.641886213
>> +0100
>> -+++ dhcp-4.3.0a1/common/dlpi.c 2013-12-19 15:34:41.662885914 +0100
>> -@@ -804,7 +804,7 @@ dlpiopen(const char *ifname) {
>> - }
>> - *dp = '\0';
>> -
>> -- return open (devname, O_RDWR, 0);
>> -+ return open (devname, O_RDWR | O_CLOEXEC, 0);
>> - }
>> -
>> - /*
>> -diff -up dhcp-4.3.0a1/common/nit.c.cloexec dhcp-4.3.0a1/common/nit.c
>> ---- dhcp-4.3.0a1/common/nit.c.cloexec 2013-12-19 15:34:41.642886199
>> +0100
>> -+++ dhcp-4.3.0a1/common/nit.c 2013-12-19 15:34:41.662885914 +0100
>> -@@ -81,7 +81,7 @@ int if_register_nit (info)
>> - struct strioctl sio;
>> -
>> - /* Open a NIT device */
>> -- sock = open ("/dev/nit", O_RDWR);
>> -+ sock = open ("/dev/nit", O_RDWR | O_CLOEXEC);
>> - if (sock < 0)
>> - log_fatal ("Can't open NIT device for %s: %m", info ->
>> name);
>> -
>> -diff -up dhcp-4.3.0a1/common/resolv.c.cloexec dhcp-4.3.0a1/common/resolv.c
>> ---- dhcp-4.3.0a1/common/resolv.c.cloexec 2013-12-11 01:25:12.000000000
>> +0100
>> -+++ dhcp-4.3.0a1/common/resolv.c 2013-12-19 15:34:41.663885900 +0100
>> -@@ -50,7 +50,7 @@ void read_resolv_conf (parse_time)
>> - struct domain_search_list *dp, *dl, *nd;
>> - isc_result_t status;
>> -
>> -- if ((file = open (path_resolv_conf, O_RDONLY)) < 0) {
>> -+ if ((file = open (path_resolv_conf, O_RDONLY | O_CLOEXEC)) < 0) {
>> - log_error ("Can't open %s: %m", path_resolv_conf);
>> - return;
>> - }
>> -diff -up dhcp-4.3.0a1/common/upf.c.cloexec dhcp-4.3.0a1/common/upf.c
>> ---- dhcp-4.3.0a1/common/upf.c.cloexec 2013-12-19 15:34:41.642886199
>> +0100
>> -+++ dhcp-4.3.0a1/common/upf.c 2013-12-19 15:34:41.663885900 +0100
>> -@@ -77,7 +77,7 @@ int if_register_upf (info)
>> - /* %Audit% Cannot exceed 36 bytes. %2004.06.17,Safe% */
>> - sprintf(filename, "/dev/pf/pfilt%d", b);
>> -
>> -- sock = open (filename, O_RDWR, 0);
>> -+ sock = open (filename, O_RDWR | O_CLOEXEC, 0);
>> - if (sock < 0) {
>> - if (errno == EBUSY) {
>> - continue;
>> -diff -up dhcp-4.3.0a1/omapip/trace.c.cloexec dhcp-4.3.0a1/omapip/trace.c
>> ---- dhcp-4.3.0a1/omapip/trace.c.cloexec 2013-12-11 01:01:03.000000000
>> +0100
>> -+++ dhcp-4.3.0a1/omapip/trace.c 2013-12-19 15:34:41.663885900 +0100
>> -@@ -142,10 +142,10 @@ isc_result_t trace_begin (const char *fi
>> - return DHCP_R_INVALIDARG;
>> - }
>> -
>> -- traceoutfile = open (filename, O_CREAT | O_WRONLY | O_EXCL, 0600);
>> -+ traceoutfile = open (filename, O_CREAT | O_WRONLY | O_EXCL |
>> O_CLOEXEC, 0600);
>> - if (traceoutfile < 0 && errno == EEXIST) {
>> - log_error ("WARNING: Overwriting trace file \"%s\"",
>> filename);
>> -- traceoutfile = open (filename, O_WRONLY | O_EXCL | O_TRUNC,
>> -+ traceoutfile = open (filename, O_WRONLY | O_EXCL | O_TRUNC |
>> O_CLOEXEC,
>> - 0600);
>> - }
>> -
>> -@@ -433,7 +433,7 @@ void trace_file_replay (const char *file
>> - isc_result_t result;
>> - int len;
>> -
>> -- traceinfile = fopen (filename, "r");
>> -+ traceinfile = fopen (filename, "re");
>> - if (!traceinfile) {
>> - log_error("Can't open tracefile %s: %m", filename);
>> - return;
>> -diff -up dhcp-4.3.0a1/relay/dhcrelay.c.cloexec dhcp-4.3.0a1/relay/dhcrelay.c
>> ---- dhcp-4.3.0a1/relay/dhcrelay.c.cloexec 2013-12-13
>> 22:26:21.000000000 +0100
>> -+++ dhcp-4.3.0a1/relay/dhcrelay.c 2013-12-19 15:34:41.664885886 +0100
>> -@@ -193,11 +193,11 @@ main(int argc, char **argv) {
>> - /* Make sure that file descriptors 0(stdin), 1,(stdout), and
>> - 2(stderr) are open. To do this, we assume that when we
>> - open a file the lowest available file descriptor is used. */
>> -- fd = open("/dev/null", O_RDWR);
>> -+ fd = open("/dev/null", O_RDWR | O_CLOEXEC);
>> - if (fd == 0)
>> -- fd = open("/dev/null", O_RDWR);
>> -+ fd = open("/dev/null", O_RDWR | O_CLOEXEC);
>> - if (fd == 1)
>> -- fd = open("/dev/null", O_RDWR);
>> -+ fd = open("/dev/null", O_RDWR | O_CLOEXEC);
>> - if (fd == 2)
>> - log_perror = 0; /* No sense logging to /dev/null. */
>> - else if (fd != -1)
>> -@@ -564,13 +564,13 @@ main(int argc, char **argv) {
>> -
>> - if (no_pid_file == ISC_FALSE) {
>> - pfdesc = open(path_dhcrelay_pid,
>> -- O_CREAT | O_TRUNC | O_WRONLY, 0644);
>> -+ O_CREAT | O_TRUNC | O_WRONLY |
>> O_CLOEXEC, 0644);
>> -
>> - if (pfdesc < 0) {
>> - log_error("Can't create %s: %m",
>> - path_dhcrelay_pid);
>> - } else {
>> -- pf = fdopen(pfdesc, "w");
>> -+ pf = fdopen(pfdesc, "we");
>> - if (!pf)
>> - log_error("Can't fdopen %s: %m",
>> - path_dhcrelay_pid);
>> -diff -up dhcp-4.3.0a1/server/confpars.c.cloexec dhcp-
>> 4.3.0a1/server/confpars.c
>> ---- dhcp-4.3.0a1/server/confpars.c.cloexec 2013-12-11
>> 01:25:12.000000000 +0100
>> -+++ dhcp-4.3.0a1/server/confpars.c 2013-12-19 15:34:41.665885871 +0100
>> -@@ -117,7 +117,7 @@ isc_result_t read_conf_file (const char
>> - }
>> - #endif
>> -
>> -- if ((file = open (filename, O_RDONLY)) < 0) {
>> -+ if ((file = open (filename, O_RDONLY | O_CLOEXEC)) < 0) {
>> - if (leasep) {
>> - log_error ("Can't open lease database %s: %m --",
>> - path_dhcpd_db);
>> -diff -up dhcp-4.3.0a1/server/db.c.cloexec dhcp-4.3.0a1/server/db.c
>> ---- dhcp-4.3.0a1/server/db.c.cloexec 2013-12-11 01:25:12.000000000
>> +0100
>> -+++ dhcp-4.3.0a1/server/db.c 2013-12-19 15:34:41.666885857 +0100
>> -@@ -1081,7 +1081,7 @@ void db_startup (testp)
>> - }
>> - #endif
>> - if (!testp) {
>> -- db_file = fopen (path_dhcpd_db, "a");
>> -+ db_file = fopen (path_dhcpd_db, "ae");
>> - if (!db_file)
>> - log_fatal ("Can't open %s for append.",
>> path_dhcpd_db);
>> - expire_all_pools ();
>> -@@ -1129,12 +1129,12 @@ int new_lease_file ()
>> - path_dhcpd_db, (int)t) >= sizeof newfname)
>> - log_fatal("new_lease_file: lease file path too long");
>> -
>> -- db_fd = open (newfname, O_WRONLY | O_TRUNC | O_CREAT, 0664);
>> -+ db_fd = open (newfname, O_WRONLY | O_TRUNC | O_CREAT | O_CLOEXEC,
>> 0664);
>> - if (db_fd < 0) {
>> - log_error ("Can't create new lease file: %m");
>> - return 0;
>> - }
>> -- if ((new_db_file = fdopen(db_fd, "w")) == NULL) {
>> -+ if ((new_db_file = fdopen(db_fd, "we")) == NULL) {
>> - log_error("Can't fdopen new lease file: %m");
>> - close(db_fd);
>> - goto fdfail;
>> -diff -up dhcp-4.3.0a1/server/dhcpd.c.cloexec dhcp-4.3.0a1/server/dhcpd.c
>> ---- dhcp-4.3.0a1/server/dhcpd.c.cloexec 2013-12-13 22:26:01.000000000
>> +0100
>> -+++ dhcp-4.3.0a1/server/dhcpd.c 2013-12-19 15:37:17.258674472 +0100
>> -@@ -193,11 +193,11 @@ main(int argc, char **argv) {
>> - /* Make sure that file descriptors 0 (stdin), 1, (stdout), and
>> - 2 (stderr) are open. To do this, we assume that when we
>> - open a file the lowest available file descriptor is used. */
>> -- fd = open("/dev/null", O_RDWR);
>> -+ fd = open("/dev/null", O_RDWR | O_CLOEXEC);
>> - if (fd == 0)
>> -- fd = open("/dev/null", O_RDWR);
>> -+ fd = open("/dev/null", O_RDWR | O_CLOEXEC);
>> - if (fd == 1)
>> -- fd = open("/dev/null", O_RDWR);
>> -+ fd = open("/dev/null", O_RDWR | O_CLOEXEC);
>> - if (fd == 2)
>> - log_perror = 0; /* No sense logging to /dev/null. */
>> - else if (fd != -1)
>> -@@ -716,7 +716,7 @@ main(int argc, char **argv) {
>> - */
>> - if (no_pid_file == ISC_FALSE) {
>> - /*Read previous pid file. */
>> -- if ((i = open (path_dhcpd_pid, O_RDONLY)) >= 0) {
>> -+ if ((i = open (path_dhcpd_pid, O_RDONLY | O_CLOEXEC)) >= 0)
>> {
>> - status = read(i, pbuf, (sizeof pbuf) - 1);
>> - close (i);
>> - if (status > 0) {
>> -@@ -735,7 +735,7 @@ main(int argc, char **argv) {
>> - }
>> -
>> - /* Write new pid file. */
>> -- i = open(path_dhcpd_pid, O_WRONLY|O_CREAT|O_TRUNC, 0644);
>> -+ i = open(path_dhcpd_pid, O_WRONLY|O_CREAT|O_TRUNC|O_CLOEXEC,
>> 0644);
>> - if (i >= 0) {
>> - sprintf(pbuf, "%d\n", (int) getpid());
>> - IGNORE_RET (write(i, pbuf, strlen(pbuf)));
>> -@@ -763,9 +763,9 @@ main(int argc, char **argv) {
>> - (void) close(2);
>> -
>> - /* Reopen them on /dev/null. */
>> -- (void) open("/dev/null", O_RDWR);
>> -- (void) open("/dev/null", O_RDWR);
>> -- (void) open("/dev/null", O_RDWR);
>> -+ (void) open("/dev/null", O_RDWR | O_CLOEXEC);
>> -+ (void) open("/dev/null", O_RDWR | O_CLOEXEC);
>> -+ (void) open("/dev/null", O_RDWR | O_CLOEXEC);
>> - log_perror = 0; /* No sense logging to /dev/null. */
>> -
>> - IGNORE_RET (chdir("/"));
>> -diff -up dhcp-4.3.0a1/server/ldap.c.cloexec dhcp-4.3.0a1/server/ldap.c
>> ---- dhcp-4.3.0a1/server/ldap.c.cloexec 2013-12-11 01:25:12.000000000
>> +0100
>> -+++ dhcp-4.3.0a1/server/ldap.c 2013-12-19 15:34:41.667885843 +0100
>> -@@ -684,7 +684,7 @@ ldap_start (void)
>> -
>> - if (ldap_debug_file != NULL && ldap_debug_fd == -1)
>> - {
>> -- if ((ldap_debug_fd = open (ldap_debug_file, O_CREAT | O_TRUNC |
>> O_WRONLY,
>> -+ if ((ldap_debug_fd = open (ldap_debug_file, O_CREAT | O_TRUNC |
>> O_WRONLY | O_CLOEXEC,
>> - S_IRUSR | S_IWUSR)) < 0)
>> - log_error ("Error opening debug LDAP log file %s: %s",
>> ldap_debug_file,
>> - strerror (errno));
>> diff --git a/src/patches/dhcp/dhcp-PPP.patch b/src/patches/dhcp/dhcp-PPP.patch
>> deleted file mode 100644
>> index 5d022e432..000000000
>> --- a/src/patches/dhcp/dhcp-PPP.patch
>> +++ /dev/null
>> @@ -1,150 +0,0 @@
>> -diff -up dhcp-4.3.1b1/client/dhc6.c.mRfpsB dhcp-4.3.1b1/client/dhc6.c
>> ---- dhcp-4.3.1b1/client/dhc6.c.mRfpsB 2014-07-10 17:48:03.779424870
>> +0200
>> -+++ dhcp-4.3.1b1/client/dhc6.c 2014-07-10 17:48:03.795424644 +0200
>> -@@ -5088,7 +5088,8 @@ make_client6_options(struct client_state
>> - */
>> - if ((oc = lookup_option(&dhcpv6_universe, *op,
>> - D6O_CLIENTID)) == NULL) {
>> -- if (!option_cache(&oc, &default_duid, NULL, clientid_option,
>> -+ if (default_duid.len == 0 ||
>> -+ !option_cache(&oc, &default_duid, NULL, clientid_option,
>> - MDL))
>> - log_fatal("Failure assembling a DUID.");
>> -
>> -diff -up dhcp-4.3.1b1/client/dhclient.c.mRfpsB dhcp-4.3.1b1/client/dhclient.c
>> ---- dhcp-4.3.1b1/client/dhclient.c.mRfpsB 2014-07-10
>> 17:39:25.853763858 +0200
>> -+++ dhcp-4.3.1b1/client/dhclient.c 2014-07-10 17:49:49.882925843 +0200
>> -@@ -948,8 +948,8 @@ main(int argc, char **argv) {
>> - if (default_duid.buffer != NULL)
>> - data_string_forget(&default_duid, MDL);
>> -
>> -- form_duid(&default_duid, MDL);
>> -- write_duid(&default_duid);
>> -+ if (form_duid(&default_duid, MDL) == ISC_R_SUCCESS)
>> -+ write_duid(&default_duid);
>> - }
>> - }
>> -
>> -@@ -3267,7 +3267,7 @@ write_options(struct client_state *clien
>> - * is not how it is intended. Upcoming rearchitecting the client should
>> - * address this "one daemon model."
>> - */
>> --void
>> -+isc_result_t
>> - form_duid(struct data_string *duid, const char *file, int line)
>> - {
>> - struct interface_info *ip;
>> -@@ -3280,6 +3280,15 @@ form_duid(struct data_string *duid, cons
>> - if (ip == NULL)
>> - log_fatal("Impossible condition at %s:%d.", MDL);
>> -
>> -+ while (ip && ip->hw_address.hbuf[0] == HTYPE_RESERVED) {
>> -+ /* Try the other interfaces */
>> -+ log_debug("Cannot form default DUID from interface %s.", ip-
>> >name);
>> -+ ip = ip->next;
>> -+ }
>> -+ if (ip == NULL) {
>> -+ return ISC_R_UNEXPECTED;
>> -+ }
>> -+
>> - if ((ip->hw_address.hlen == 0) ||
>> - (ip->hw_address.hlen > sizeof(ip->hw_address.hbuf)))
>> - log_fatal("Impossible hardware address length at %s:%d.",
>> MDL);
>> -@@ -3323,6 +3332,8 @@ form_duid(struct data_string *duid, cons
>> - log_info("Created duid %s.", str);
>> - dfree(str, MDL);
>> - }
>> -+
>> -+ return ISC_R_SUCCESS;
>> - }
>> -
>> - /* Write the default DUID to the lease store. */
>> -diff -up dhcp-4.3.1b1/common/bpf.c.mRfpsB dhcp-4.3.1b1/common/bpf.c
>> ---- dhcp-4.3.1b1/common/bpf.c.mRfpsB 2014-07-10 17:39:25.797764653
>> +0200
>> -+++ dhcp-4.3.1b1/common/bpf.c 2014-07-10 17:48:03.797424616 +0200
>> -@@ -600,6 +600,22 @@ get_hw_addr(const char *name, struct har
>> - memcpy(&hw->hbuf[1], LLADDR(sa), sa->sdl_alen);
>> - break;
>> - #endif /* IFT_FDDI */
>> -+#if defined(IFT_PPP)
>> -+ case IFT_PPP:
>> -+ if (local_family != AF_INET6)
>> -+ log_fatal("Unsupported device type %d for
>> \"%s\"",
>> -+ sa->sdl_type, name);
>> -+ hw->hlen = 0;
>> -+ hw->hbuf[0] = HTYPE_RESERVED;
>> -+ /* 0xdeadbeef should never occur on the wire,
>> -+ * and is a signature that something went wrong.
>> -+ */
>> -+ hw->hbuf[1] = 0xde;
>> -+ hw->hbuf[2] = 0xad;
>> -+ hw->hbuf[3] = 0xbe;
>> -+ hw->hbuf[4] = 0xef;
>> -+ break;
>> -+#endif
>> - default:
>> - log_fatal("Unsupported device type %d for \"%s\"",
>> - sa->sdl_type, name);
>> -diff -up dhcp-4.3.1b1/common/lpf.c.mRfpsB dhcp-4.3.1b1/common/lpf.c
>> ---- dhcp-4.3.1b1/common/lpf.c.mRfpsB 2014-07-10 17:39:25.744765404
>> +0200
>> -+++ dhcp-4.3.1b1/common/lpf.c 2014-07-10 17:48:03.797424616 +0200
>> -@@ -511,6 +511,22 @@ get_hw_addr(const char *name, struct har
>> - hw->hbuf[0] = HTYPE_FDDI;
>> - memcpy(&hw->hbuf[1], sa->sa_data, 6);
>> - break;
>> -+#if defined(ARPHRD_PPP)
>> -+ case ARPHRD_PPP:
>> -+ if (local_family != AF_INET6)
>> -+ log_fatal("Unsupported device type %d for
>> \"%s\"",
>> -+ sa->sa_family, name);
>> -+ hw->hlen = 0;
>> -+ hw->hbuf[0] = HTYPE_RESERVED;
>> -+ /* 0xdeadbeef should never occur on the wire,
>> -+ * and is a signature that something went wrong.
>> -+ */
>> -+ hw->hbuf[1] = 0xde;
>> -+ hw->hbuf[2] = 0xad;
>> -+ hw->hbuf[3] = 0xbe;
>> -+ hw->hbuf[4] = 0xef;
>> -+ break;
>> -+#endif
>> - default:
>> - log_fatal("Unsupported device type %ld for \"%s\"",
>> - (long int)sa->sa_family, name);
>> -diff -up dhcp-4.3.1b1/includes/dhcpd.h.mRfpsB dhcp-4.3.1b1/includes/dhcpd.h
>> ---- dhcp-4.3.1b1/includes/dhcpd.h.mRfpsB 2014-07-10 17:48:03.761425124
>> +0200
>> -+++ dhcp-4.3.1b1/includes/dhcpd.h 2014-07-10 17:48:03.798424601 +0200
>> -@@ -2839,7 +2839,7 @@ void client_dns_remove(struct client_sta
>> -
>> - void dhcpv4_client_assignments(void);
>> - void dhcpv6_client_assignments(void);
>> --void form_duid(struct data_string *duid, const char *file, int line);
>> -+isc_result_t form_duid(struct data_string *duid, const char *file, int
>> line);
>> -
>> - /* dhc6.c */
>> - void dhc6_lease_destroy(struct dhc6_lease **src, const char *file, int
>> line);
>> -diff -up dhcp-4.3.1b1/includes/dhcp.h.mRfpsB dhcp-4.3.1b1/includes/dhcp.h
>> ---- dhcp-4.3.1b1/includes/dhcp.h.mRfpsB 2014-07-10 17:48:03.761425124
>> +0200
>> -+++ dhcp-4.3.1b1/includes/dhcp.h 2014-07-10 17:48:03.798424601 +0200
>> -@@ -81,6 +81,8 @@ struct dhcp_packet {
>> - * is no standard for this so we
>> - * just steal a type */
>> -
>> -+#define HTYPE_RESERVED 0 /* RFC 5494 */
>> -+
>> - /* Magic cookie validating dhcp options field (and bootp vendor
>> - extensions field). */
>> - #define DHCP_OPTIONS_COOKIE "\143\202\123\143"
>> -diff -up dhcp-4.3.1b1/server/dhcpv6.c.mRfpsB dhcp-4.3.1b1/server/dhcpv6.c
>> ---- dhcp-4.3.1b1/server/dhcpv6.c.mRfpsB 2014-07-10 17:47:31.464881409
>> +0200
>> -+++ dhcp-4.3.1b1/server/dhcpv6.c 2014-07-10 17:48:03.800424573 +0200
>> -@@ -330,6 +330,9 @@ generate_new_server_duid(void) {
>> - if (p->hw_address.hlen > 0) {
>> - break;
>> - }
>> -+ if (p->next == NULL && p->hw_address.hbuf[0] ==
>> HTYPE_RESERVED) {
>> -+ log_error("Can not generate DUID from interfaces
>> which do not have hardware addresses, please configure server-duid!");
>> -+ }
>> - }
>> - if (p == NULL) {
>> - return ISC_R_UNEXPECTED;
>> diff --git a/src/patches/dhcp/dhcp-UseMulticast.patch b/src/patches/dhcp/dhcp-
>> UseMulticast.patch
>> deleted file mode 100644
>> index ee0ea6b9a..000000000
>> --- a/src/patches/dhcp/dhcp-UseMulticast.patch
>> +++ /dev/null
>> @@ -1,241 +0,0 @@
>> -diff -up dhcp-4.3.1b1/server/dhcpv6.c.UseMulticast dhcp-
>> 4.3.1b1/server/dhcpv6.c
>> ---- dhcp-4.3.1b1/server/dhcpv6.c.UseMulticast 2014-07-02
>> 19:58:40.000000000 +0200
>> -+++ dhcp-4.3.1b1/server/dhcpv6.c 2014-07-10 18:20:03.066256219 +0200
>> -@@ -376,6 +376,48 @@ generate_new_server_duid(void) {
>> - }
>> -
>> - /*
>> -+ * Is the D6O_UNICAST option defined in dhcpd.conf ?
>> -+ */
>> -+static isc_boolean_t unicast_option_defined;
>> -+
>> -+/*
>> -+ * Did we already search dhcpd.conf for D6O_UNICAST option ?
>> -+ * We need to store it here to not parse dhcpd.conf repeatedly.
>> -+ */
>> -+static isc_boolean_t unicast_option_parsed = ISC_FALSE;
>> -+
>> -+
>> -+/*
>> -+ * Is the D6O_UNICAST option defined in dhcpd.conf ?
>> -+ */
>> -+isc_boolean_t
>> -+is_unicast_option_defined(void) {
>> -+ struct option_state *opt_state;
>> -+ struct option_cache *oc;
>> -+
>> -+ /*
>> -+ * If we are looking for the unicast option for the first time
>> -+ */
>> -+ if (unicast_option_parsed == ISC_FALSE) {
>> -+ unicast_option_parsed = ISC_TRUE;
>> -+ opt_state = NULL;
>> -+ if (!option_state_allocate(&opt_state, MDL)) {
>> -+ log_fatal("No memory for option state.");
>> -+ }
>> -+
>> -+ execute_statements_in_scope(NULL, NULL, NULL, NULL, NULL,
>> -+ opt_state, &global_scope, root_group, NULL,
>> NULL);
>> -+
>> -+ oc = lookup_option(&dhcpv6_universe, opt_state,
>> D6O_UNICAST);
>> -+ unicast_option_defined = (oc != NULL);
>> -+
>> -+ option_state_dereference(&opt_state, MDL);
>> -+ }
>> -+
>> -+ return (unicast_option_defined);
>> -+}
>> -+
>> -+/*
>> - * Get the client identifier from the packet.
>> - */
>> - isc_result_t
>> -@@ -706,6 +748,12 @@ static const int required_opts[] = {
>> - D6O_PREFERENCE,
>> - 0
>> - };
>> -+static const int required_opts_NAA[] = {
>> -+ D6O_CLIENTID,
>> -+ D6O_SERVERID,
>> -+ D6O_STATUS_CODE,
>> -+ 0
>> -+};
>> - static const int required_opts_solicit[] = {
>> - D6O_CLIENTID,
>> - D6O_SERVERID,
>> -@@ -1587,6 +1635,56 @@ lease_to_client(struct data_string *repl
>> - reply.shared->group,
>> NULL);
>> - }
>> -
>> -+ /* reject unicast message, unless we set unicast option */
>> -+ if ((packet->unicast == ISC_TRUE) && !is_unicast_option_defined())
>> -+ /*
>> -+ * RFC3315 section 18.2.1 (Request):
>> -+ *
>> -+ * When the server receives a Request message via unicast from a
>> client
>> -+ * to which the server has not sent a unicast option, the server
>> -+ * discards the Request message and responds with a Reply message
>> -+ * containing a Status Code option with the value UseMulticast, a
>> Server
>> -+ * Identifier option containing the server's DUID, the Client
>> Identifier
>> -+ * option from the client message, and no other options.
>> -+ *
>> -+ * Section 18.2.3 (Renew):
>> -+ *
>> -+ * When the server receives a Renew message via unicast from a
>> client to
>> -+ * which the server has not sent a unicast option, the server
>> discards
>> -+ * the Renew message and responds with a Reply message containing a
>> -+ * Status Code option with the value UseMulticast, a Server
>> Identifier
>> -+ * option containing the server's DUID, the Client Identifier option
>> -+ * from the client message, and no other options.
>> -+ */
>> -+ {
>> -+ /* Set the UseMulticast status code. */
>> -+ if (!set_status_code(STATUS_UseMulticast,
>> -+ "Unicast not allowed by server.",
>> -+ reply.opt_state)) {
>> -+ log_error("lease_to_client: Unable to set "
>> -+ "UseMulticast status code.");
>> -+ goto exit;
>> -+ }
>> -+
>> -+ /* Rewind the cursor to the start. */
>> -+ reply.cursor = REPLY_OPTIONS_INDEX;
>> -+
>> -+ /*
>> -+ * Produce an reply that includes only:
>> -+ *
>> -+ * Status code.
>> -+ * Server DUID.
>> -+ * Client DUID.
>> -+ */
>> -+ reply.cursor += store_options6((char *)reply.buf.data +
>> -+ reply.cursor,
>> -+ sizeof(reply.buf) -
>> -+ reply.cursor,
>> -+ reply.opt_state, reply.packet,
>> -+ required_opts_NAA,
>> -+ NULL);
>> -+ }
>> -+
>> - /*
>> - * RFC3315 section 17.2.2 (Solicit):
>> - *
>> -@@ -1619,6 +1717,7 @@ lease_to_client(struct data_string *repl
>> - * Having stored the client's IA's, store any options that
>> - * will fit in the remaining space.
>> - */
>> -+ else
>> - reply.cursor += store_options6((char *)reply.buf.data +
>> reply.cursor,
>> - sizeof(reply.buf) - reply.cursor,
>> - reply.opt_state, reply.packet,
>> -@@ -4748,7 +4847,6 @@ dhcpv6_solicit(struct data_string *reply
>> - * Very similar to Solicit handling, except the server DUID is required.
>> - */
>> -
>> --/* TODO: reject unicast messages, unless we set unicast option */
>> - static void
>> - dhcpv6_request(struct data_string *reply_ret, struct packet *packet) {
>> - struct data_string client_id;
>> -@@ -5078,7 +5176,6 @@ exit:
>> - * except for the error code of when addresses don't match.
>> - */
>> -
>> --/* TODO: reject unicast messages, unless we set unicast option */
>> - static void
>> - dhcpv6_renew(struct data_string *reply, struct packet *packet) {
>> - struct data_string client_id;
>> -@@ -5322,18 +5419,60 @@ iterate_over_ia_na(struct data_string *r
>> - goto exit;
>> - }
>> -
>> -- snprintf(status_msg, sizeof(status_msg), "%s received.",
>> packet_type);
>> -- if (!set_status_code(STATUS_Success, status_msg, opt_state)) {
>> -- goto exit;
>> -- }
>> -+ /* reject unicast message, unless we set unicast option */
>> -+ if ((packet->unicast == ISC_TRUE) && !is_unicast_option_defined()) {
>> -+ /*
>> -+ * RFC3315 section 18.2.6 (Release):
>> -+ *
>> -+ * When the server receives a Release message via unicast
>> from a client
>> -+ * to which the server has not sent a unicast option, the
>> server
>> -+ * discards the Release message and responds with a Reply
>> message
>> -+ * containing a Status Code option with value UseMulticast,
>> a Server
>> -+ * Identifier option containing the server's DUID, the
>> Client Identifier
>> -+ * option from the client message, and no other options.
>> -+ *
>> -+ * Section 18.2.7 (Decline):
>> -+ *
>> -+ * When the server receives a Decline message via unicast
>> from a client
>> -+ * to which the server has not sent a unicast option, the
>> server
>> -+ * discards the Decline message and responds with a Reply
>> message
>> -+ * containing a Status Code option with the value
>> UseMulticast, a Server
>> -+ * Identifier option containing the server's DUID, the
>> Client Identifier
>> -+ * option from the client message, and no other options.
>> -+ */
>> -+ snprintf(status_msg, sizeof(status_msg),
>> -+ "%s received unicast.", packet_type);
>> -+ if (!set_status_code(STATUS_UseMulticast, status_msg,
>> opt_state)) {
>> -+ goto exit;
>> -+ }
>> -
>> -- /*
>> -- * Add our options that are not associated with any IA_NA or IA_TA.
>> -- */
>> -- reply_ofs += store_options6(reply_data+reply_ofs,
>> -- sizeof(reply_data)-reply_ofs,
>> -+ /*
>> -+ * Produce an reply that includes only:
>> -+ *
>> -+ * Status code.
>> -+ * Server DUID.
>> -+ * Client DUID.
>> -+ */
>> -+ reply_ofs += store_options6(reply_data+reply_ofs,
>> -+ sizeof(reply_data)-reply_ofs,
>> - opt_state, packet,
>> -- required_opts, NULL);
>> -+ required_opts_NAA, NULL);
>> -+
>> -+ goto return_reply;
>> -+ } else {
>> -+ snprintf(status_msg, sizeof(status_msg), "%s received.",
>> packet_type);
>> -+ if (!set_status_code(STATUS_Success, status_msg, opt_state))
>> {
>> -+ goto exit;
>> -+ }
>> -+
>> -+ /*
>> -+ * Add our options that are not associated with any IA_NA or
>> IA_TA.
>> -+ */
>> -+ reply_ofs += store_options6(reply_data+reply_ofs,
>> -+ sizeof(reply_data)-reply_ofs,
>> -+ opt_state, packet,
>> -+ required_opts, NULL);
>> -+ }
>> -
>> - /*
>> - * Loop through the IA_NA reported by the client, and deal with
>> -@@ -5471,6 +5610,7 @@ iterate_over_ia_na(struct data_string *r
>> - /*
>> - * Return our reply to the caller.
>> - */
>> -+return_reply:
>> - reply_ret->len = reply_ofs;
>> - reply_ret->buffer = NULL;
>> - if (!buffer_allocate(&reply_ret->buffer, reply_ofs, MDL)) {
>> -@@ -5516,7 +5656,6 @@ exit:
>> - * we still need to be aware of this possibility.
>> - */
>> -
>> --/* TODO: reject unicast messages, unless we set unicast option */
>> - /* TODO: IA_TA */
>> - static void
>> - dhcpv6_decline(struct data_string *reply, struct packet *packet) {
>> -@@ -5986,7 +6125,6 @@ exit:
>> - * Release means a client is done with the leases.
>> - */
>> -
>> --/* TODO: reject unicast messages, unless we set unicast option */
>> - static void
>> - dhcpv6_release(struct data_string *reply, struct packet *packet) {
>> - struct data_string client_id;
>> diff --git a/src/patches/dhcp/dhcp-add_timeout_when_NULL.patch
>> b/src/patches/dhcp/dhcp-add_timeout_when_NULL.patch
>> deleted file mode 100644
>> index 103824c38..000000000
>> --- a/src/patches/dhcp/dhcp-add_timeout_when_NULL.patch
>> +++ /dev/null
>> @@ -1,14 +0,0 @@
>> -diff -up dhcp-4.3.0a1/common/dispatch.c.dracut dhcp-4.3.0a1/common/dispatch.c
>> ---- dhcp-4.3.0a1/common/dispatch.c.dracut 2013-12-11
>> 01:25:12.000000000 +0100
>> -+++ dhcp-4.3.0a1/common/dispatch.c 2013-12-19 15:39:50.350505860 +0100
>> -@@ -210,6 +210,10 @@ void add_timeout (when, where, what, ref
>> - isc_interval_t interval;
>> - isc_time_t expires;
>> -
>> -+ if (when == NULL) {
>> -+ return;
>> -+ }
>> -+
>> - /* See if this timeout supersedes an existing timeout. */
>> - t = (struct timeout *)0;
>> - for (q = timeouts; q; q = q->next) {
>> diff --git a/src/patches/dhcp/dhcp-capability.patch b/src/patches/dhcp/dhcp-
>> capability.patch
>> deleted file mode 100644
>> index 91a1baef5..000000000
>> --- a/src/patches/dhcp/dhcp-capability.patch
>> +++ /dev/null
>> @@ -1,250 +0,0 @@
>> -diff -up dhcp-4.3.1b1/client/dhclient.8.zzftXp dhcp-4.3.1b1/client/dhclient.8
>> ---- dhcp-4.3.1b1/client/dhclient.8.zzftXp 2014-07-10
>> 17:38:26.938599402 +0200
>> -+++ dhcp-4.3.1b1/client/dhclient.8 2014-07-10 17:39:25.852763873 +0200
>> -@@ -128,6 +128,9 @@ dhclient - Dynamic Host Configuration Pr
>> - .B -w
>> - ]
>> - [
>> -+.B -nc
>> -+]
>> -+[
>> - .B -B
>> - ]
>> - [
>> -@@ -304,6 +307,32 @@ has been added or removed, so that the c
>> - address on that interface.
>> -
>> - .TP
>> -+.BI \-nc
>> -+Do not drop capabilities.
>> -+
>> -+Normally, if
>> -+.B dhclient
>> -+was compiled with libcap-ng support,
>> -+.B dhclient
>> -+drops most capabilities immediately upon startup. While more secure,
>> -+this greatly restricts the additional actions that hooks in
>> -+.B dhclient-script (8)
>> -+can take. (For example, any daemons that
>> -+.B dhclient-script (8)
>> -+starts or restarts will inherit the restricted capabilities as well,
>> -+which may interfere with their correct operation.) Thus, the
>> -+.BI \-nc
>> -+option can be used to prevent
>> -+.B dhclient
>> -+from dropping capabilities.
>> -+
>> -+The
>> -+.BI \-nc
>> -+option is ignored if
>> -+.B dhclient
>> -+was not compiled with libcap-ng support.
>> -+
>> -+.TP
>> - .BI \-B
>> - Set the BOOTP broadcast flag in request packets so servers will always
>> - broadcast replies.
>> -diff -up dhcp-4.3.1b1/client/dhclient.c.zzftXp dhcp-4.3.1b1/client/dhclient.c
>> ---- dhcp-4.3.1b1/client/dhclient.c.zzftXp 2014-07-10
>> 17:39:25.797764653 +0200
>> -+++ dhcp-4.3.1b1/client/dhclient.c 2014-07-10 17:39:25.853763858 +0200
>> -@@ -39,6 +39,10 @@
>> - #include <limits.h>
>> - #include <dns/result.h>
>> -
>> -+#ifdef HAVE_LIBCAP_NG
>> -+#include <cap-ng.h>
>> -+#endif
>> -+
>> - /*
>> - * Defined in stdio.h when _GNU_SOURCE is set, but we don't want to define
>> - * that when building ISC code.
>> -@@ -143,6 +147,9 @@ main(int argc, char **argv) {
>> - int timeout_arg = 0;
>> - char *arg_conf = NULL;
>> - int arg_conf_len = 0;
>> -+#ifdef HAVE_LIBCAP_NG
>> -+ int keep_capabilities = 0;
>> -+#endif
>> -
>> - /* Initialize client globals. */
>> - memset(&default_duid, 0, sizeof(default_duid));
>> -@@ -425,6 +432,10 @@ main(int argc, char **argv) {
>> - }
>> -
>> - dhclient_request_options = argv[i];
>> -+ } else if (!strcmp(argv[i], "-nc")) {
>> -+#ifdef HAVE_LIBCAP_NG
>> -+ keep_capabilities = 1;
>> -+#endif
>> - } else if (argv[i][0] == '-') {
>> - usage();
>> - } else if (interfaces_requested < 0) {
>> -@@ -473,6 +484,19 @@ main(int argc, char **argv) {
>> - path_dhclient_script = s;
>> - }
>> -
>> -+#ifdef HAVE_LIBCAP_NG
>> -+ /* Drop capabilities */
>> -+ if (!keep_capabilities) {
>> -+ capng_clear(CAPNG_SELECT_CAPS);
>> -+ capng_update(CAPNG_ADD, CAPNG_EFFECTIVE|CAPNG_PERMITTED,
>> -+ CAP_DAC_OVERRIDE); // Drop this someday
>> -+ capng_updatev(CAPNG_ADD, CAPNG_EFFECTIVE|CAPNG_PERMITTED,
>> -+ CAP_NET_ADMIN, CAP_NET_RAW,
>> -+ CAP_NET_BIND_SERVICE, CAP_SYS_ADMIN, -1);
>> -+ capng_apply(CAPNG_SELECT_CAPS);
>> -+ }
>> -+#endif
>> -+
>> - /* Set up the initial dhcp option universe. */
>> - initialize_common_option_spaces();
>> -
>> -diff -up dhcp-4.3.1b1/client/dhclient-script.8.zzftXp dhcp-
>> 4.3.1b1/client/dhclient-script.8
>> ---- dhcp-4.3.1b1/client/dhclient-script.8.zzftXp 2014-07-10
>> 17:39:25.761765163 +0200
>> -+++ dhcp-4.3.1b1/client/dhclient-script.8 2014-07-10
>> 17:39:25.851763887 +0200
>> -@@ -243,6 +243,16 @@ repeatedly initialized to the values pro
>> - the other. Assuming the information provided by both servers is
>> - valid, this shouldn't cause any real problems, but it could be
>> - confusing.
>> -+.PP
>> -+Normally, if dhclient was compiled with libcap-ng support,
>> -+dhclient drops most capabilities immediately upon startup.
>> -+While more secure, this greatly restricts the additional actions that
>> -+hooks in dhclient-script can take. For example, any daemons that
>> -+dhclient-script starts or restarts will inherit the restricted
>> -+capabilities as well, which may interfere with their correct operation.
>> -+Thus, the
>> -+.BI \-nc
>> -+option can be used to prevent dhclient from dropping capabilities.
>> - .SH SEE ALSO
>> - dhclient(8), dhcpd(8), dhcrelay(8), dhclient.conf(5) and
>> - dhclient.leases(5).
>> -diff -up dhcp-4.3.1b1/client/Makefile.am.zzftXp dhcp-
>> 4.3.1b1/client/Makefile.am
>> ---- dhcp-4.3.1b1/client/Makefile.am.zzftXp 2014-07-10
>> 17:38:10.778828583 +0200
>> -+++ dhcp-4.3.1b1/client/Makefile.am 2014-07-10 17:39:25.851763887
>> +0200
>> -@@ -10,7 +10,7 @@ dhclient_SOURCES = clparse.c dhclient.c
>> - scripts/bsdos scripts/freebsd scripts/linux scripts/macos
>> \
>> - scripts/netbsd scripts/nextstep scripts/openbsd \
>> - scripts/solaris scripts/openwrt
>> --dhclient_LDADD = ../common/libdhcp.a ../omapip/libomapi.a \
>> -+dhclient_LDADD = ../common/libdhcp.a ../omapip/libomapi.la $(CAPNG_LDADD) \
>> - $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
>> - man_MANS = dhclient.8 dhclient-script.8 dhclient.conf.5 dhclient.leases.5
>> - EXTRA_DIST = $(man_MANS)
>> -diff -up dhcp-4.3.1b1/configure.ac.zzftXp dhcp-4.3.1b1/configure.ac
>> ---- dhcp-4.3.1b1/configure.ac.zzftXp 2014-07-10 17:38:10.779828569
>> +0200
>> -+++ dhcp-4.3.1b1/configure.ac 2014-07-10 17:39:25.854763844 +0200
>> -@@ -499,6 +499,41 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]],
>> - # Look for optional headers.
>> - AC_CHECK_HEADERS(sys/socket.h net/if_dl.h net/if6.h regex.h)
>> -
>> -+# look for capabilities library
>> -+AC_ARG_WITH(libcap-ng,
>> -+ [ --with-libcap-ng=[auto/yes/no] Add Libcap-ng support
>> [default=auto]],,
>> -+ with_libcap_ng=auto)
>> -+
>> -+# Check for Libcap-ng API
>> -+#
>> -+# libcap-ng detection
>> -+if test x$with_libcap_ng = xno ; then
>> -+ have_libcap_ng=no;
>> -+else
>> -+ # Start by checking for header file
>> -+ AC_CHECK_HEADER(cap-ng.h, capng_headers=yes, capng_headers=no)
>> -+
>> -+ # See if we have libcap-ng library
>> -+ AC_CHECK_LIB(cap-ng, capng_clear,
>> -+ CAPNG_LDADD=-lcap-ng,)
>> -+
>> -+ # Check results are usable
>> -+ if test x$with_libcap_ng = xyes -a x$CAPNG_LDADD = x ; then
>> -+ AC_MSG_ERROR(libcap-ng support was requested and the library was not
>> found)
>> -+ fi
>> -+ if test x$CAPNG_LDADD != x -a $capng_headers = no ; then
>> -+ AC_MSG_ERROR(libcap-ng libraries found but headers are missing)
>> -+ fi
>> -+fi
>> -+AC_SUBST(CAPNG_LDADD)
>> -+AC_MSG_CHECKING(whether to use libcap-ng)
>> -+if test x$CAPNG_LDADD != x ; then
>> -+ AC_DEFINE(HAVE_LIBCAP_NG,1,[libcap-ng support])
>> -+ AC_MSG_RESULT(yes)
>> -+else
>> -+ AC_MSG_RESULT(no)
>> -+fi
>> -+
>> - # Solaris needs some libraries for functions
>> - AC_SEARCH_LIBS(socket, [socket])
>> - AC_SEARCH_LIBS(inet_ntoa, [nsl])
>> -diff -up dhcp-4.3.1b1/relay/dhcrelay.c.zzftXp dhcp-4.3.1b1/relay/dhcrelay.c
>> ---- dhcp-4.3.1b1/relay/dhcrelay.c.zzftXp 2014-07-10 17:39:25.799764624
>> +0200
>> -+++ dhcp-4.3.1b1/relay/dhcrelay.c 2014-07-10 17:40:19.191007421 +0200
>> -@@ -31,6 +31,11 @@
>> - #include <signal.h>
>> - #include <sys/time.h>
>> -
>> -+#ifdef HAVE_LIBCAP_NG
>> -+# include <cap-ng.h>
>> -+ int keep_capabilities = 0;
>> -+#endif
>> -+
>> - TIME default_lease_time = 43200; /* 12 hours... */
>> - TIME max_lease_time = 86400; /* 24 hours... */
>> - struct tree_cache *global_options[256];
>> -@@ -376,6 +381,10 @@ main(int argc, char **argv) {
>> - usage();
>> - dhcrelay_sub_id = argv[i];
>> - #endif
>> -+ } else if (!strcmp(argv[i], "-nc")) {
>> -+#ifdef HAVE_LIBCAP_NG
>> -+ keep_capabilities = 1;
>> -+#endif
>> - } else if (!strcmp(argv[i], "-pf")) {
>> - if (++i == argc)
>> - usage();
>> -@@ -446,6 +455,17 @@ main(int argc, char **argv) {
>> - #endif
>> - }
>> -
>> -+#ifdef HAVE_LIBCAP_NG
>> -+ /* Drop capabilities */
>> -+ if (!keep_capabilities) {
>> -+ capng_clear(CAPNG_SELECT_BOTH);
>> -+ capng_updatev(CAPNG_ADD, CAPNG_EFFECTIVE|CAPNG_PERMITTED,
>> -+ CAP_NET_RAW, CAP_NET_BIND_SERVICE, -1);
>> -+ capng_apply(CAPNG_SELECT_BOTH);
>> -+ log_info ("Dropped all unnecessary capabilities.");
>> -+ }
>> -+#endif
>> -+
>> - if (!quiet) {
>> - log_info("%s %s", message, PACKAGE_VERSION);
>> - log_info(copyright);
>> -@@ -598,6 +618,15 @@ main(int argc, char **argv) {
>> - signal(SIGTERM, dhcp_signal_handler); /* kill */
>> - #endif
>> -
>> -+#ifdef HAVE_LIBCAP_NG
>> -+ /* Drop all capabilities */
>> -+ if (!keep_capabilities) {
>> -+ capng_clear(CAPNG_SELECT_BOTH);
>> -+ capng_apply(CAPNG_SELECT_BOTH);
>> -+ log_info ("Dropped all capabilities.");
>> -+ }
>> -+#endif
>> -+
>> - /* Start dispatching packets and timeouts... */
>> - dispatch();
>> -
>> -diff -up dhcp-4.3.1b1/relay/Makefile.am.zzftXp dhcp-4.3.1b1/relay/Makefile.am
>> ---- dhcp-4.3.1b1/relay/Makefile.am.zzftXp 2014-07-10
>> 17:38:10.780828554 +0200
>> -+++ dhcp-4.3.1b1/relay/Makefile.am 2014-07-10 17:39:25.854763844 +0200
>> -@@ -2,7 +2,7 @@ AM_CPPFLAGS = -DLOCALSTATEDIR='"@localst
>> -
>> - sbin_PROGRAMS = dhcrelay
>> - dhcrelay_SOURCES = dhcrelay.c
>> --dhcrelay_LDADD = ../common/libdhcp.a ../omapip/libomapi.a \
>> -+dhcrelay_LDADD = ../common/libdhcp.a ../omapip/libomapi.la $(CAPNG_LDADD) \
>> - $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
>> - man_MANS = dhcrelay.8
>> - EXTRA_DIST = $(man_MANS)
>> diff --git a/src/patches/dhcp/dhcp-default-requested-options.patch
>> b/src/patches/dhcp/dhcp-default-requested-options.patch
>> deleted file mode 100644
>> index afda222e6..000000000
>> --- a/src/patches/dhcp/dhcp-default-requested-options.patch
>> +++ /dev/null
>> @@ -1,44 +0,0 @@
>> -diff -up dhcp-4.3.0a1/client/clparse.c.requested dhcp-
>> 4.3.0a1/client/clparse.c
>> ---- dhcp-4.3.0a1/client/clparse.c.requested 2013-12-19
>> 15:13:27.276631307 +0100
>> -+++ dhcp-4.3.0a1/client/clparse.c 2013-12-19 15:13:27.313630789 +0100
>> -@@ -37,7 +37,7 @@
>> -
>> - struct client_config top_level_config;
>> -
>> --#define NUM_DEFAULT_REQUESTED_OPTS 9
>> -+#define NUM_DEFAULT_REQUESTED_OPTS 14
>> - struct option *default_requested_options[NUM_DEFAULT_REQUESTED_OPTS + 1];
>> -
>> - static void parse_client_default_duid(struct parse *cfile);
>> -@@ -119,6 +119,31 @@ isc_result_t read_client_conf ()
>> - option_code_hash_lookup(&default_requested_options[8],
>> - dhcpv6_universe.code_hash, &code, 0, MDL);
>> -
>> -+ /* 10 */
>> -+ code = DHO_NIS_DOMAIN;
>> -+ option_code_hash_lookup(&default_requested_options[9],
>> -+ dhcp_universe.code_hash, &code, 0, MDL);
>> -+
>> -+ /* 11 */
>> -+ code = DHO_NIS_SERVERS;
>> -+ option_code_hash_lookup(&default_requested_options[10],
>> -+ dhcp_universe.code_hash, &code, 0, MDL);
>> -+
>> -+ /* 12 */
>> -+ code = DHO_NTP_SERVERS;
>> -+ option_code_hash_lookup(&default_requested_options[11],
>> -+ dhcp_universe.code_hash, &code, 0, MDL);
>> -+
>> -+ /* 13 */
>> -+ code = DHO_INTERFACE_MTU;
>> -+ option_code_hash_lookup(&default_requested_options[12],
>> -+ dhcp_universe.code_hash, &code, 0, MDL);
>> -+
>> -+ /* 14 */
>> -+ code = DHO_DOMAIN_SEARCH;
>> -+ option_code_hash_lookup(&default_requested_options[13],
>> -+ dhcp_universe.code_hash, &code, 0, MDL);
>> -+
>> - for (code = 0 ; code < NUM_DEFAULT_REQUESTED_OPTS ; code++) {
>> - if (default_requested_options[code] == NULL)
>> - log_fatal("Unable to find option definition for "
>> diff --git a/src/patches/dhcp/dhcp-dhclient-decline-backoff.patch
>> b/src/patches/dhcp/dhcp-dhclient-decline-backoff.patch
>> deleted file mode 100644
>> index 3e52e6400..000000000
>> --- a/src/patches/dhcp/dhcp-dhclient-decline-backoff.patch
>> +++ /dev/null
>> @@ -1,63 +0,0 @@
>> -diff -up dhcp-4.3.1b1/client/dhclient.c.JwFUZj dhcp-4.3.1b1/client/dhclient.c
>> ---- dhcp-4.3.1b1/client/dhclient.c.JwFUZj 2014-07-10
>> 17:38:50.511265091 +0200
>> -+++ dhcp-4.3.1b1/client/dhclient.c 2014-07-10 17:39:16.164901267 +0200
>> -@@ -1281,6 +1281,8 @@ void state_init (cpp)
>> - void *cpp;
>> - {
>> - struct client_state *client = cpp;
>> -+ enum dhcp_state init_state = client->state;
>> -+ struct timeval tv;
>> -
>> - ASSERT_STATE(state, S_INIT);
>> -
>> -@@ -1293,9 +1295,18 @@ void state_init (cpp)
>> - client -> first_sending = cur_time;
>> - client -> interval = client -> config -> initial_interval;
>> -
>> -- /* Add an immediate timeout to cause the first DHCPDISCOVER packet
>> -- to go out. */
>> -- send_discover (client);
>> -+ if (init_state != S_DECLINED) {
>> -+ /* Add an immediate timeout to cause the first DHCPDISCOVER
>> packet
>> -+ to go out. */
>> -+ send_discover(client);
>> -+ } else {
>> -+ /* We've received an OFFER and it has been DECLINEd by
>> dhclient-script.
>> -+ * wait for a random time between 1 and backoff_cutoff
>> seconds before
>> -+ * trying again. */
>> -+ tv . tv_sec = cur_time + ((1 + (random() >> 2)) % client-
>> >config->backoff_cutoff);
>> -+ tv . tv_usec = 0;
>> -+ add_timeout(&tv, send_discover, client, 0, 0);
>> -+ }
>> - }
>> -
>> - /*
>> -@@ -1592,6 +1603,7 @@ void bind_lease (client)
>> - "try (declined). Exiting.");
>> - exit(2);
>> - } else {
>> -+ client -> state = S_DECLINED;
>> - state_init(client);
>> - return;
>> - }
>> -@@ -4059,6 +4071,7 @@ void client_location_changed ()
>> - case S_INIT:
>> - case S_REBINDING:
>> - case S_STOPPED:
>> -+ case S_DECLINED:
>> - break;
>> - }
>> - client -> state = S_INIT;
>> -diff -up dhcp-4.3.1b1/includes/dhcpd.h.JwFUZj dhcp-4.3.1b1/includes/dhcpd.h
>> ---- dhcp-4.3.1b1/includes/dhcpd.h.JwFUZj 2014-07-10 17:38:26.941599360
>> +0200
>> -+++ dhcp-4.3.1b1/includes/dhcpd.h 2014-07-10 17:38:50.526264878 +0200
>> -@@ -1087,7 +1087,8 @@ enum dhcp_state {
>> - S_BOUND = 5,
>> - S_RENEWING = 6,
>> - S_REBINDING = 7,
>> -- S_STOPPED = 8
>> -+ S_STOPPED = 8,
>> -+ S_DECLINED = 9
>> - };
>> -
>> - /* Authentication and BOOTP policy possibilities (not all values work
>> diff --git a/src/patches/dhcp/dhcp-dhclient-options.patch
>> b/src/patches/dhcp/dhcp-dhclient-options.patch
>> deleted file mode 100644
>> index 67f144ecb..000000000
>> --- a/src/patches/dhcp/dhcp-dhclient-options.patch
>> +++ /dev/null
>> @@ -1,509 +0,0 @@
>> -diff -up dhcp-4.3.1b1/client/clparse.c.fLPqYB dhcp-4.3.1b1/client/clparse.c
>> ---- dhcp-4.3.1b1/client/clparse.c.fLPqYB 2014-07-02 19:58:38.000000000
>> +0200
>> -+++ dhcp-4.3.1b1/client/clparse.c 2014-07-10 17:38:26.938599402 +0200
>> -@@ -148,6 +148,7 @@ isc_result_t read_client_conf ()
>> - /* Requested lease time, used by DHCPv6 (DHCPv4 uses the option
>> cache)
>> - */
>> - top_level_config.requested_lease = 7200;
>> -+ top_level_config.bootp_broadcast_always = 0;
>> -
>> - group_allocate (&top_level_config.on_receipt, MDL);
>> - if (!top_level_config.on_receipt)
>> -@@ -353,7 +354,8 @@ void read_client_leases ()
>> - interface-declaration |
>> - LEASE client-lease-statement |
>> - ALIAS client-lease-statement |
>> -- KEY key-definition */
>> -+ KEY key-definition |
>> -+ BOOTP_BROADCAST_ALWAYS */
>> -
>> - void parse_client_statement (cfile, ip, config)
>> - struct parse *cfile;
>> -@@ -771,6 +773,12 @@ void parse_client_statement (cfile, ip,
>> - parse_reject_statement (cfile, config);
>> - return;
>> -
>> -+ case BOOTP_BROADCAST_ALWAYS:
>> -+ token = next_token(&val, (unsigned*)0, cfile);
>> -+ config -> bootp_broadcast_always = 1;
>> -+ parse_semi (cfile);
>> -+ return;
>> -+
>> - default:
>> - lose = 0;
>> - stmt = (struct executable_statement *)0;
>> -diff -up dhcp-4.3.1b1/client/dhclient.8.fLPqYB dhcp-4.3.1b1/client/dhclient.8
>> ---- dhcp-4.3.1b1/client/dhclient.8.fLPqYB 2014-07-02
>> 19:58:38.000000000 +0200
>> -+++ dhcp-4.3.1b1/client/dhclient.8 2014-07-10 17:38:26.938599402 +0200
>> -@@ -128,6 +128,33 @@ dhclient - Dynamic Host Configuration Pr
>> - .B -w
>> - ]
>> - [
>> -+.B -B
>> -+]
>> -+[
>> -+.B -C
>> -+.I dhcp-client-identifier
>> -+]
>> -+[
>> -+.B -H
>> -+.I host-name
>> -+]
>> -+[
>> -+.B -F
>> -+.I fqdn.fqdn
>> -+]
>> -+[
>> -+.B -V
>> -+.I vendor-class-identifier
>> -+]
>> -+[
>> -+.B -R
>> -+.I request-option-list
>> -+]
>> -+[
>> -+.B -timeout
>> -+.I timeout
>> -+]
>> -+[
>> - .B -v
>> - ]
>> - [
>> -@@ -275,6 +302,69 @@ not to exit when it doesn't find any suc
>> - program can then be used to notify the client when a network interface
>> - has been added or removed, so that the client can attempt to configure an IP
>> - address on that interface.
>> -+
>> -+.TP
>> -+.BI \-B
>> -+Set the BOOTP broadcast flag in request packets so servers will always
>> -+broadcast replies.
>> -+
>> -+.TP
>> -+.BI \-C\ <dhcp-client-identifier>
>> -+Specify the dhcp-client-identifier option to send to the DHCP server.
>> -+
>> -+.TP
>> -+.BI \-H\ <host-name>
>> -+Specify the host-name option to send to the DHCP server. The host-name
>> -+string only contains the client's hostname prefix, to which the server will
>> -+append the ddns-domainname or domain-name options, if any, to derive the
>> -+fully qualified domain name of the client. The
>> -+.B -H
>> -+option cannot be used with the
>> -+.B -F
>> -+option.
>> -+
>> -+.TP
>> -+.BI \-F\ <fqdn.fqdn>
>> -+Specify the fqdn.fqdn option to send to the DHCP server. This option cannot
>> -+be used with the
>> -+.B -H
>> -+option. The fqdn.fqdn option must specify the complete domain name of the
>> -+client host, which the server may use for dynamic DNS updates.
>> -+
>> -+.TP
>> -+.BI \-V\ <vendor-class-identifier>
>> -+Specify the vendor-class-identifier option to send to the DHCP server.
>> -+
>> -+.TP
>> -+.BI \-R\ <option>[,<option>...]
>> -+Specify the list of options the client is to request from the server. The
>> -+option list must be a single string consisting of option names separated
>> -+by at least one command and optional space characters. The default option
>> -+list is:
>> -+
>> -+.BR
>> -+ subnet-mask, broadcast-address, time-offset, routers,
>> -+.BR
>> -+ domain-search, domain-name, domain-name-servers, host-name,
>> -+.BR
>> -+ nis-domain, nis-servers, ntp-servers, interface-mtu
>> -+
>> -+.TP
>> -+.B -R
>> -+option does not append options to the default request, it overrides the
>> -+default request list. Keep this in mind if you want to request an
>> -+additional option besides the default request list. You will have to
>> -+specify all option names for the
>> -+.B -R
>> -+parameter.
>> -+
>> -+.TP
>> -+.BI \-timeout\ <timeout>
>> -+Specify the time after which
>> -+.B dhclient
>> -+will decide that no DHCP servers can be contacted when no responses have
>> been
>> -+received.
>> -+
>> - .TP
>> - .BI \-n
>> - Do not configure any interfaces. This is most likely to be useful in
>> -diff -up dhcp-4.3.1b1/client/dhclient.c.fLPqYB dhcp-4.3.1b1/client/dhclient.c
>> ---- dhcp-4.3.1b1/client/dhclient.c.fLPqYB 2014-07-02
>> 19:58:38.000000000 +0200
>> -+++ dhcp-4.3.1b1/client/dhclient.c 2014-07-10 17:38:44.520350055 +0200
>> -@@ -39,6 +39,12 @@
>> - #include <limits.h>
>> - #include <dns/result.h>
>> -
>> -+/*
>> -+ * Defined in stdio.h when _GNU_SOURCE is set, but we don't want to define
>> -+ * that when building ISC code.
>> -+ */
>> -+extern int asprintf(char **strp, const char *fmt, ...);
>> -+
>> - TIME default_lease_time = 43200; /* 12 hours... */
>> - TIME max_lease_time = 86400; /* 24 hours... */
>> -
>> -@@ -88,6 +94,9 @@ int wanted_ia_na = -1; /* the absolute
>> - int wanted_ia_ta = 0;
>> - int wanted_ia_pd = 0;
>> - char *mockup_relay = NULL;
>> -+int bootp_broadcast_always = 0;
>> -+
>> -+extern struct option *default_requested_options[];
>> -
>> - void run_stateless(int exit_mode);
>> -
>> -@@ -125,6 +134,15 @@ main(int argc, char **argv) {
>> - int local_family_set = 0;
>> - #endif /* DHCPv6 */
>> - char *s;
>> -+ char *dhcp_client_identifier_arg = NULL;
>> -+ char *dhcp_host_name_arg = NULL;
>> -+ char *dhcp_fqdn_arg = NULL;
>> -+ char *dhcp_vendor_class_identifier_arg = NULL;
>> -+ char *dhclient_request_options = NULL;
>> -+
>> -+ int timeout_arg = 0;
>> -+ char *arg_conf = NULL;
>> -+ int arg_conf_len = 0;
>> -
>> - /* Initialize client globals. */
>> - memset(&default_duid, 0, sizeof(default_duid));
>> -@@ -325,6 +343,88 @@ main(int argc, char **argv) {
>> - strlen(PACKAGE_VERSION)));
>> - IGNORE_RET(write(STDERR_FILENO, "\n", 1));
>> - exit(0);
>> -+ } else if (!strcmp(argv[i], "-C")) {
>> -+ if ((++i == argc) || (argv[i] == NULL) ||
>> (*(argv[i])=='\0')) {
>> -+ usage();
>> -+ exit(1);
>> -+ }
>> -+
>> -+ if (strlen(argv[i]) >= DHCP_MAX_OPTION_LEN) {
>> -+ log_error("-C option dhcp-client-identifier
>> string \"%s\" is too long - maximum length is: %d", argv[i],
>> DHCP_MAX_OPTION_LEN-1);
>> -+ exit(1);
>> -+ }
>> -+
>> -+ dhcp_client_identifier_arg = argv[i];
>> -+ } else if (!strcmp(argv[i], "-B")) {
>> -+ bootp_broadcast_always = 1;
>> -+ } else if (!strcmp(argv[i], "-H")) {
>> -+ if ((++i == argc) || (argv[i] == NULL) ||
>> (*(argv[i])=='\0')) {
>> -+ usage();
>> -+ exit(1);
>> -+ }
>> -+
>> -+ if (strlen(argv[i]) >= DHCP_MAX_OPTION_LEN) {
>> -+ log_error("-H option host-name string \"%s\"
>> is too long - maximum length is: %d", argv[i], DHCP_MAX_OPTION_LEN-1);
>> -+ exit(1);
>> -+ }
>> -+
>> -+ if (dhcp_host_name_arg != NULL) {
>> -+ log_error("The -H <host-name> and -F <fqdn>
>> arguments are mutually exclusive");
>> -+ exit(1);
>> -+ }
>> -+
>> -+ dhcp_host_name_arg = argv[i];
>> -+ } else if (!strcmp(argv[i], "-F")) {
>> -+ if ((++i == argc) || (argv[i] == NULL) ||
>> (*(argv[i])=='\0')) {
>> -+ usage();
>> -+ exit(1);
>> -+ }
>> -+
>> -+ if (strlen(argv[i]) >= DHCP_MAX_OPTION_LEN) {
>> -+ log_error("-F option fqdn.fqdn string \"%s\"
>> is too long - maximum length is: %d", argv[i], DHCP_MAX_OPTION_LEN-1);
>> -+ exit(1);
>> -+ }
>> -+
>> -+ if (dhcp_fqdn_arg != NULL) {
>> -+ log_error("Only one -F <fqdn> argument can
>> be specified");
>> -+ exit(1);
>> -+ }
>> -+
>> -+ if (dhcp_host_name_arg != NULL) {
>> -+ log_error("The -F <fqdn> and -H <host-name>
>> arguments are mutually exclusive");
>> -+ exit(1);
>> -+ }
>> -+
>> -+ dhcp_fqdn_arg = argv[i];
>> -+ } else if (!strcmp(argv[i], "-timeout")) {
>> -+ if ((++i == argc) || (argv[i] == NULL) ||
>> (*(argv[i])=='\0')) {
>> -+ usage();
>> -+ exit(1);
>> -+ }
>> -+
>> -+ if ((timeout_arg = atoi(argv[i])) <= 0) {
>> -+ log_error("timeout option must be > 0 - bad
>> value: %s",argv[i]);
>> -+ exit(1);
>> -+ }
>> -+ } else if (!strcmp(argv[i], "-V")) {
>> -+ if ((++i == argc) || (argv[i] == NULL) ||
>> (*(argv[i])=='\0')) {
>> -+ usage();
>> -+ exit(1);
>> -+ }
>> -+
>> -+ if (strlen(argv[i]) >= DHCP_MAX_OPTION_LEN) {
>> -+ log_error("-V option vendor-class-identifier
>> string \"%s\" is too long - maximum length is: %d", argv[i],
>> DHCP_MAX_OPTION_LEN-1);
>> -+ exit(1);
>> -+ }
>> -+
>> -+ dhcp_vendor_class_identifier_arg = argv[i];
>> -+ } else if (!strcmp(argv[i], "-R")) {
>> -+ if ((++i == argc) || (argv[i] == NULL) ||
>> (*(argv[i])=='\0')) {
>> -+ usage();
>> -+ exit(1);
>> -+ }
>> -+
>> -+ dhclient_request_options = argv[i];
>> - } else if (argv[i][0] == '-') {
>> - usage();
>> - } else if (interfaces_requested < 0) {
>> -@@ -507,6 +607,156 @@ main(int argc, char **argv) {
>> - /* Parse the dhclient.conf file. */
>> - read_client_conf();
>> -
>> -+ /* Parse any extra command line configuration arguments: */
>> -+ if ((dhcp_client_identifier_arg != NULL) &&
>> (*dhcp_client_identifier_arg != '\0')) {
>> -+ arg_conf_len = asprintf(&arg_conf, "send dhcp-client-
>> identifier \"%s\";", dhcp_client_identifier_arg);
>> -+
>> -+ if ((arg_conf == 0) || (arg_conf_len <= 0))
>> -+ log_fatal("Unable to send -C option dhcp-client-
>> identifier");
>> -+ }
>> -+
>> -+ if ((dhcp_host_name_arg != NULL) && (*dhcp_host_name_arg != '\0')) {
>> -+ if (arg_conf == 0) {
>> -+ arg_conf_len = asprintf(&arg_conf, "send host-name
>> \"%s\";", dhcp_host_name_arg);
>> -+
>> -+ if ((arg_conf == 0) || (arg_conf_len <= 0))
>> -+ log_fatal("Unable to send -H option host-
>> name");
>> -+ } else {
>> -+ char *last_arg_conf = arg_conf;
>> -+ arg_conf = NULL;
>> -+ arg_conf_len = asprintf(&arg_conf, "%s\nsend host-
>> name \"%s\";", last_arg_conf, dhcp_host_name_arg);
>> -+
>> -+ if ((arg_conf == 0) || (arg_conf_len <= 0))
>> -+ log_fatal("Unable to send -H option host-
>> name");
>> -+
>> -+ free(last_arg_conf);
>> -+ }
>> -+ }
>> -+
>> -+ if ((dhcp_fqdn_arg != NULL) && (*dhcp_fqdn_arg != '\0')) {
>> -+ if (arg_conf == 0) {
>> -+ arg_conf_len = asprintf(&arg_conf, "send fqdn.fqdn
>> \"%s\";", dhcp_fqdn_arg);
>> -+
>> -+ if ((arg_conf == 0) || (arg_conf_len <= 0))
>> -+ log_fatal("Unable to send -F option
>> fqdn.fqdn");
>> -+ } else {
>> -+ char *last_arg_conf = arg_conf;
>> -+ arg_conf = NULL;
>> -+ arg_conf_len = asprintf(&arg_conf, "%s\nsend
>> fqdn.fqdn \"%s\";", last_arg_conf, dhcp_fqdn_arg);
>> -+
>> -+ if ((arg_conf == 0) || (arg_conf_len <= 0))
>> -+ log_fatal("Unable to send -F option
>> fqdn.fqdn");
>> -+
>> -+ free(last_arg_conf);
>> -+ }
>> -+ }
>> -+
>> -+ if (timeout_arg) {
>> -+ if (arg_conf == 0) {
>> -+ arg_conf_len = asprintf(&arg_conf, "timeout %d;",
>> timeout_arg);
>> -+
>> -+ if ((arg_conf == 0) || (arg_conf_len <= 0))
>> -+ log_fatal("Unable to process -timeout
>> timeout argument");
>> -+ } else {
>> -+ char *last_arg_conf = arg_conf;
>> -+ arg_conf = NULL;
>> -+ arg_conf_len = asprintf(&arg_conf, "%s\ntimeout
>> %d;", last_arg_conf, timeout_arg);
>> -+
>> -+ if ((arg_conf == 0) || (arg_conf_len == 0))
>> -+ log_fatal("Unable to process -timeout
>> timeout argument");
>> -+
>> -+ free(last_arg_conf);
>> -+ }
>> -+ }
>> -+
>> -+ if ((dhcp_vendor_class_identifier_arg != NULL) &&
>> (*dhcp_vendor_class_identifier_arg != '\0')) {
>> -+ if (arg_conf == 0) {
>> -+ arg_conf_len = asprintf(&arg_conf, "send vendor-
>> class-identifier \"%s\";", dhcp_vendor_class_identifier_arg);
>> -+
>> -+ if ((arg_conf == 0) || (arg_conf_len <= 0))
>> -+ log_fatal("Unable to send -V option vendor-
>> class-identifier");
>> -+ } else {
>> -+ char *last_arg_conf = arg_conf;
>> -+ arg_conf = NULL;
>> -+ arg_conf_len = asprintf(&arg_conf, "%s\nsend vendor-
>> class-identifier \"%s\";", last_arg_conf, dhcp_vendor_class_identifier_arg);
>> -+
>> -+ if ((arg_conf == 0) || (arg_conf_len <= 0))
>> -+ log_fatal("Unable to send -V option vendor-
>> class-identifier");
>> -+
>> -+ free(last_arg_conf);
>> -+ }
>> -+ }
>> -+
>> -+ if (dhclient_request_options != NULL) {
>> -+ if (arg_conf == 0) {
>> -+ arg_conf_len = asprintf(&arg_conf, "request %s;",
>> dhclient_request_options);
>> -+
>> -+ if ((arg_conf == 0) || (arg_conf_len <= 0))
>> -+ log_fatal("Unable to parse -R <request
>> options list> argument");
>> -+ } else {
>> -+ char *last_arg_conf = arg_conf;
>> -+ arg_conf = NULL;
>> -+ arg_conf_len = asprintf(&arg_conf, "%s\nrequest
>> %s;", last_arg_conf, dhclient_request_options);
>> -+
>> -+ if ((arg_conf == 0) || (arg_conf_len <= 0))
>> -+ log_fatal("Unable to parse -R <request
>> options list> argument");
>> -+
>> -+ free(last_arg_conf);
>> -+ }
>> -+ }
>> -+
>> -+ if (arg_conf) {
>> -+ if (arg_conf_len == 0)
>> -+ if ((arg_conf_len = strlen(arg_conf)) == 0)
>> -+ /* huh ? cannot happen ! */
>> -+ log_fatal("Unable to process -C/-H/-F/-
>> timeout/-V/-R configuration arguments");
>> -+
>> -+ /* parse the extra dhclient.conf configuration arguments
>> -+ * into top level config: */
>> -+ struct parse *cfile = (struct parse *)0;
>> -+ const char *val = NULL;
>> -+ int token;
>> -+
>> -+ status = new_parse(&cfile, -1, arg_conf, arg_conf_len,
>> "extra dhclient -C/-H/-F/-timeout/-V/-R configuration arguments", 0);
>> -+
>> -+ if ((status != ISC_R_SUCCESS) || (cfile ->
>> warnings_occurred))
>> -+ log_fatal("Cannot parse -C/-H/-F/-timeout/-V/-R
>> configuration arguments !");
>> -+ /* more detailed parse failures will be logged */
>> -+
>> -+ do {
>> -+ token = peek_token(&val, (unsigned *)0, cfile);
>> -+ if (token == END_OF_FILE)
>> -+ break;
>> -+
>> -+ parse_client_statement(cfile, (struct interface_info
>> *)0, &top_level_config);
>> -+ } while (1);
>> -+
>> -+ if (cfile -> warnings_occurred)
>> -+ log_fatal("Cannot parse -C/-H/-F/-timeout/-V/-R
>> configuration arguments !");
>> -+ end_parse(&cfile);
>> -+
>> -+ if (timeout_arg) {
>> -+ /* we just set the toplevel timeout, but per-client
>> -+ * timeouts may still be at defaults.
>> -+ */
>> -+ for (ip=interfaces; ip; ip = ip->next) {
>> -+ if (ip->client->config->timeout == 60)
>> -+ ip->client->config->timeout =
>> timeout_arg;
>> -+ }
>> -+ }
>> -+
>> -+ if ((dhclient_request_options != 0) &&
>> (top_level_config.requested_options != default_requested_options)) {
>> -+ for (ip=interfaces; ip; ip = ip->next) {
>> -+ if (ip->client->config->requested_options ==
>> default_requested_options)
>> -+ ip->client->config-
>> >requested_options = top_level_config.requested_options;
>> -+ }
>> -+ }
>> -+
>> -+ free(arg_conf);
>> -+ arg_conf = NULL;
>> -+ arg_conf_len = 0;
>> -+ }
>> -+
>> - /* Parse the lease database. */
>> - read_client_leases();
>> -
>> -@@ -756,6 +1006,10 @@ static void usage()
>> - " [-s server-addr] [-cf config-file]\n"
>> - " [-df duid-file] [-lf lease-file]\n"
>> - " [-pf pid-file] [--no-pid] [-e VAR=val]\n"
>> -+ " [-C <dhcp-client-identifier>] [-B]\n"
>> -+ " [-H <host-name> | -F <fqdn.fqdn>] [-
>> timeout <timeout>]\n"
>> -+ " [-V <vendor-class-identifier>]\n"
>> -+ " [-R <request option list>]\n"
>> - " [-sf script-file] [interface]");
>> - }
>> -
>> -@@ -2531,7 +2785,8 @@ void make_discover (client, lease)
>> - client -> packet.xid = random ();
>> - client -> packet.secs = 0; /* filled in by send_discover. */
>> -
>> -- if (can_receive_unicast_unconfigured (client -> interface))
>> -+ if ((!(bootp_broadcast_always || client->config-
>> >bootp_broadcast_always))
>> -+ && can_receive_unicast_unconfigured(client->interface))
>> - client -> packet.flags = 0;
>> - else
>> - client -> packet.flags = htons (BOOTP_BROADCAST);
>> -@@ -2615,7 +2870,9 @@ void make_request (client, lease)
>> - } else {
>> - memset (&client -> packet.ciaddr, 0,
>> - sizeof client -> packet.ciaddr);
>> -- if (can_receive_unicast_unconfigured (client -> interface))
>> -+ if ((!(bootp_broadcast_always ||
>> -+ client ->config->bootp_broadcast_always)) &&
>> -+ can_receive_unicast_unconfigured (client -> interface))
>> - client -> packet.flags = 0;
>> - else
>> - client -> packet.flags = htons (BOOTP_BROADCAST);
>> -@@ -2677,7 +2934,8 @@ void make_decline (client, lease)
>> - client -> packet.hops = 0;
>> - client -> packet.xid = client -> xid;
>> - client -> packet.secs = 0; /* Filled in by send_request. */
>> -- if (can_receive_unicast_unconfigured (client -> interface))
>> -+ if ((!(bootp_broadcast_always || client->config->
>> bootp_broadcast_always))
>> -+ && can_receive_unicast_unconfigured (client->interface))
>> - client -> packet.flags = 0;
>> - else
>> - client -> packet.flags = htons (BOOTP_BROADCAST);
>> -diff -up dhcp-4.3.1b1/common/conflex.c.fLPqYB dhcp-4.3.1b1/common/conflex.c
>> ---- dhcp-4.3.1b1/common/conflex.c.fLPqYB 2014-07-02 19:58:38.000000000
>> +0200
>> -+++ dhcp-4.3.1b1/common/conflex.c 2014-07-10 17:38:26.940599374 +0200
>> -@@ -811,6 +811,8 @@ intern(char *atom, enum dhcp_token dfv)
>> - return BALANCE;
>> - if (!strcasecmp (atom + 1, "ound"))
>> - return BOUND;
>> -+ if (!strcasecmp (atom + 1, "ootp-broadcast-always"))
>> -+ return BOOTP_BROADCAST_ALWAYS;
>> - break;
>> - case 'c':
>> - if (!strcasecmp(atom + 1, "ase"))
>> -diff -up dhcp-4.3.1b1/includes/dhcpd.h.fLPqYB dhcp-4.3.1b1/includes/dhcpd.h
>> ---- dhcp-4.3.1b1/includes/dhcpd.h.fLPqYB 2014-07-02 19:58:39.000000000
>> +0200
>> -+++ dhcp-4.3.1b1/includes/dhcpd.h 2014-07-10 17:38:26.941599360 +0200
>> -@@ -1152,6 +1152,9 @@ struct client_config {
>> - int do_forward_update; /* If nonzero, and if we have
>> the
>> - information we need, update the
>> - A record for the address we get.
>> */
>> -+
>> -+ int bootp_broadcast_always; /* If nonzero, always set the
>> BOOTP_BROADCAST
>> -+ flag in requests */
>> - };
>> -
>> - /* Per-interface state used in the dhcp client... */
>> -diff -up dhcp-4.3.1b1/includes/dhctoken.h.fLPqYB dhcp-
>> 4.3.1b1/includes/dhctoken.h
>> ---- dhcp-4.3.1b1/includes/dhctoken.h.fLPqYB 2014-07-02
>> 19:58:39.000000000 +0200
>> -+++ dhcp-4.3.1b1/includes/dhctoken.h 2014-07-10 17:38:26.942599346
>> +0200
>> -@@ -367,7 +367,8 @@ enum dhcp_token {
>> - TOKEN_INFINIBAND = 668,
>> - POOL6 = 669,
>> - V6RELAY = 670,
>> -- V6RELOPT = 671
>> -+ V6RELOPT = 671,
>> -+ BOOTP_BROADCAST_ALWAYS = 672
>> - };
>> -
>> - #define is_identifier(x) ((x) >= FIRST_TOKEN && \
>> diff --git a/src/patches/dhcp/dhcp-errwarn-message.patch
>> b/src/patches/dhcp/dhcp-errwarn-message.patch
>> deleted file mode 100644
>> index a65c2c2ed..000000000
>> --- a/src/patches/dhcp/dhcp-errwarn-message.patch
>> +++ /dev/null
>> @@ -1,22 +0,0 @@
>> -diff -up dhcp-4.3.0b1/omapip/errwarn.c.errwarn dhcp-4.3.0b1/omapip/errwarn.c
>> ---- dhcp-4.3.0b1/omapip/errwarn.c.errwarn 2014-01-21
>> 09:31:47.301334249 +0100
>> -+++ dhcp-4.3.0b1/omapip/errwarn.c 2014-01-21 09:33:20.569039072 +0100
>> -@@ -76,11 +76,13 @@ void log_fatal (const char * fmt, ... )
>> - }
>> -
>> - log_error ("%s", "");
>> -- log_error ("If you think you have received this message due to a bug
>> rather");
>> -- log_error ("than a configuration issue please read the section on
>> submitting");
>> -- log_error ("bugs on either our web page at www.isc.org or in the README
>> file");
>> -- log_error ("before submitting a bug. These pages explain the proper");
>> -- log_error ("process and the information we find helpful for debugging..");
>> -+ log_error ("This version of ISC DHCP is based on the release available");
>> -+ log_error ("on ftp.isc.org. Features have been added and other changes");
>> -+ log_error ("have been made to the base software release in order to
>> make");
>> -+ log_error ("it work better with this distribution.");
>> -+ log_error ("%s", "");
>> -+ log_error ("Please report for this software via the Red Hat Bugzilla
>> site:");
>> -+ log_error (" http://bugzilla.redhat.com");
>> - log_error ("%s", "");
>> - log_error ("exiting.");
>> -
>> diff --git a/src/patches/dhcp/dhcp-garbage-chars.patch
>> b/src/patches/dhcp/dhcp-garbage-chars.patch
>> deleted file mode 100644
>> index 131360be6..000000000
>> --- a/src/patches/dhcp/dhcp-garbage-chars.patch
>> +++ /dev/null
>> @@ -1,12 +0,0 @@
>> -diff -up dhcp-4.3.0rc1/common/tables.c.garbage dhcp-4.3.0rc1/common/tables.c
>> ---- dhcp-4.3.0rc1/common/tables.c.garbage 2014-01-29
>> 10:03:52.132624677 +0100
>> -+++ dhcp-4.3.0rc1/common/tables.c 2014-01-29 10:04:51.413875343 +0100
>> -@@ -213,7 +213,7 @@ static struct option dhcp_options[] = {
>> - { "name-service-search", "Sa", &dhcp_universe, 117, 1
>> },
>> - #endif
>> - { "subnet-selection", "I", &dhcp_universe, 118, 1 },
>> -- { "domain-search", "Dc", &dhcp_universe, 119, 1 },
>> -+ { "domain-search", "D", &dhcp_universe, 119,
>> 1 },
>> - { "vivco", "Evendor-class.", &dhcp_universe, 124, 1
>> },
>> - { "vivso", "Evendor.", &dhcp_universe, 125, 1
>> },
>> - #if 0
>> diff --git a/src/patches/dhcp/dhcp-gpxe-cid.patch b/src/patches/dhcp/dhcp-
>> gpxe-cid.patch
>> deleted file mode 100644
>> index c8c2b84f9..000000000
>> --- a/src/patches/dhcp/dhcp-gpxe-cid.patch
>> +++ /dev/null
>> @@ -1,73 +0,0 @@
>> -diff -up dhcp-4.3.0a1/client/dhclient.c.gpxe-cid dhcp-
>> 4.3.0a1/client/dhclient.c
>> ---- dhcp-4.3.0a1/client/dhclient.c.gpxe-cid 2013-12-20
>> 13:28:45.105048317 +0100
>> -+++ dhcp-4.3.0a1/client/dhclient.c 2013-12-20 13:28:45.109048261 +0100
>> -@@ -47,6 +47,14 @@
>> - const char *path_dhclient_pid = NULL;
>> - static char path_dhclient_script_array[] = _PATH_DHCLIENT_SCRIPT;
>> - char *path_dhclient_script = path_dhclient_script_array;
>> -+
>> -+/* Default Prefix */
>> -+static unsigned char default_prefix[12] = {
>> -+ 0xff, 0x00, 0x00, 0x00,
>> -+ 0x00, 0x00, 0x02, 0x00,
>> -+ 0x00, 0x02, 0xc9, 0x00
>> -+};
>> -+
>> - const char *path_dhclient_duid = NULL;
>> -
>> - /* False (default) => we write and use a pid file */
>> -@@ -1253,6 +1260,12 @@ int find_subnet (struct subnet **sp,
>> - static void setup_ib_interface(struct interface_info *ip)
>> - {
>> - struct group *g;
>> -+ struct hardware *hw = &ip->hw_address;
>> -+ char client_id[64];
>> -+ char *arg_conf = NULL;
>> -+ int arg_conf_len = 0;
>> -+ isc_result_t status;
>> -+ struct parse *cfile = (struct parse *)0;
>> -
>> - /* Set the broadcast flag */
>> - ip->client->config->bootp_broadcast_always = 1;
>> -@@ -1269,8 +1282,39 @@ static void setup_ib_interface(struct in
>> - }
>> - }
>> -
>> -- /* No client ID specified */
>> -- log_fatal("dhcp-client-identifier must be specified for
>> InfiniBand");
>> -+ /*
>> -+ * No client ID specified, make up one based on a default
>> -+ * "prefix" and the port GUID.
>> -+ *
>> -+ * NOTE: This is compatible with what gpxe does.
>> -+ */
>> -+ sprintf(client_id,
>> "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.
>> 2x:%.2x:%.2x:%.2x:%.2x",
>> -+ default_prefix[0], default_prefix[1], default_prefix[2],
>> -+ default_prefix[3], default_prefix[4], default_prefix[5],
>> -+ default_prefix[6], default_prefix[7], default_prefix[8],
>> -+ default_prefix[9], default_prefix[10], default_prefix[11],
>> -+ hw->hbuf[1], hw->hbuf[2], hw->hbuf[3], hw->hbuf[4],
>> -+ hw->hbuf[5], hw->hbuf[6], hw->hbuf[7], hw->hbuf[8]);
>> -+
>> -+ arg_conf_len = asprintf(&arg_conf,
>> -+ "send dhcp-client-identifier %s;",
>> -+ client_id);
>> -+
>> -+ if ((arg_conf == 0) || (arg_conf_len <= 0))
>> -+ log_fatal("Unable to send option dhcp-client-identifier");
>> -+
>> -+ status = new_parse(&cfile, -1, arg_conf, arg_conf_len,
>> -+ "Automatic Infiniband client identifier", 0);
>> -+
>> -+ if ((status != ISC_R_SUCCESS) || (cfile->warnings_occurred))
>> -+ log_fatal("Failed to parse Infiniband client identifier");
>> -+
>> -+ parse_client_statement(cfile, NULL, ip->client->config);
>> -+
>> -+ if (cfile->warnings_occurred)
>> -+ log_fatal("Failed to parse Infiniband client identifier");
>> -+
>> -+ end_parse(&cfile);
>> - }
>> -
>> - /* Individual States:
>> diff --git a/src/patches/dhcp/dhcp-honor-expired.patch
>> b/src/patches/dhcp/dhcp-honor-expired.patch
>> deleted file mode 100644
>> index bd892975b..000000000
>> --- a/src/patches/dhcp/dhcp-honor-expired.patch
>> +++ /dev/null
>> @@ -1,49 +0,0 @@
>> -diff -up dhcp-4.3.0a1/client/dhc6.c.honor-expired dhcp-4.3.0a1/client/dhc6.c
>> ---- dhcp-4.3.0a1/client/dhc6.c.honor-expired 2013-12-19
>> 16:00:28.062183037 +0100
>> -+++ dhcp-4.3.0a1/client/dhc6.c 2013-12-19 16:00:28.076182842 +0100
>> -@@ -1351,6 +1351,32 @@ start_info_request6(struct client_state
>> - go_daemon();
>> - }
>> -
>> -+/* Run through the addresses in lease and return true if there's any
>> unexpired.
>> -+ * Return false otherwise.
>> -+ */
>> -+isc_boolean_t
>> -+unexpired_address_in_lease(struct dhc6_lease *lease)
>> -+{
>> -+ struct dhc6_ia *ia;
>> -+ struct dhc6_addr *addr;
>> -+
>> -+ for (ia = lease->bindings ; ia != NULL ; ia = ia->next) {
>> -+ for (addr = ia->addrs ; addr != NULL ; addr = addr->next) {
>> -+ if (addr->flags & DHC6_ADDR_EXPIRED)
>> -+ continue;
>> -+
>> -+ if (addr->starts + addr->max_life > cur_time) {
>> -+ return ISC_TRUE;
>> -+ }
>> -+ }
>> -+ }
>> -+
>> -+ log_info("PRC: Previous lease is devoid of active addresses."
>> -+ " Re-initializing.");
>> -+
>> -+ return ISC_FALSE;
>> -+}
>> -+
>> - /*
>> - * start_confirm6() kicks off an "init-reboot" version of the process, at
>> - * startup to find out if old bindings are 'fair' and at runtime whenever
>> -@@ -1363,8 +1389,10 @@ start_confirm6(struct client_state *clie
>> -
>> - /* If there is no active lease, there is nothing to check. */
>> - if ((client->active_lease == NULL) ||
>> -- !active_prefix(client) ||
>> -- client->active_lease->released) {
>> -+ !active_prefix(client) ||
>> -+ client->active_lease->released ||
>> -+ !unexpired_address_in_lease(client->active_lease)) {
>> -+ dhc6_lease_destroy(&client->active_lease, MDL);
>> - start_init6(client);
>> - return;
>> - }
>> diff --git a/src/patches/dhcp/dhcp-improved-xid.patch b/src/patches/dhcp/dhcp-
>> improved-xid.patch
>> deleted file mode 100644
>> index eccff4987..000000000
>> --- a/src/patches/dhcp/dhcp-improved-xid.patch
>> +++ /dev/null
>> @@ -1,138 +0,0 @@
>> -diff -up dhcp-4.3.0a1/client/dhclient.c.improved-xid dhcp-
>> 4.3.0a1/client/dhclient.c
>> ---- dhcp-4.3.0a1/client/dhclient.c.improved-xid 2013-12-20
>> 13:29:41.836260810 +0100
>> -+++ dhcp-4.3.0a1/client/dhclient.c 2013-12-20 13:29:41.843260713 +0100
>> -@@ -894,6 +894,26 @@ main(int argc, char **argv) {
>> - }
>> - }
>> -
>> -+ /* We create a backup seed before rediscovering interfaces in order
>> to
>> -+ have a seed built using all of the available interfaces
>> -+ It's interesting if required interfaces doesn't let us defined
>> -+ a really unique seed due to a lack of valid HW addr later
>> -+ (this is the case with DHCP over IB)
>> -+ We only use the last device as using a sum could broke the
>> -+ uniqueness of the seed among multiple nodes
>> -+ */
>> -+ unsigned backup_seed = 0;
>> -+ for (ip = interfaces; ip; ip = ip -> next) {
>> -+ int junk;
>> -+ if ( ip -> hw_address.hlen <= sizeof seed )
>> -+ continue;
>> -+ memcpy (&junk,
>> -+ &ip -> hw_address.hbuf [ip -> hw_address.hlen -
>> -+ sizeof seed], sizeof seed);
>> -+ backup_seed = junk;
>> -+ }
>> -+
>> -+
>> - /* At this point, all the interfaces that the script thinks
>> - are relevant should be running, so now we once again call
>> - discover_interfaces(), and this time ask it to actually set
>> -@@ -908,14 +928,36 @@ main(int argc, char **argv) {
>> - Not much entropy, but we're booting, so we're not likely to
>> - find anything better. */
>> - seed = 0;
>> -+ int seed_flag = 0;
>> - for (ip = interfaces; ip; ip = ip->next) {
>> - int junk;
>> -+ if ( ip -> hw_address.hlen <= sizeof seed )
>> -+ continue;
>> - memcpy(&junk,
>> - &ip->hw_address.hbuf[ip->hw_address.hlen -
>> - sizeof seed], sizeof seed);
>> - seed += junk;
>> -+ seed_flag = 1;
>> - }
>> -- srandom(seed + cur_time + (unsigned)getpid());
>> -+ if ( seed_flag == 0 ) {
>> -+ if ( backup_seed != 0 ) {
>> -+ seed = backup_seed;
>> -+ log_info ("xid: rand init seed (0x%x) built using all"
>> -+ " available interfaces",seed);
>> -+ }
>> -+ else {
>> -+ seed = cur_time^((unsigned) gethostid()) ;
>> -+ log_info ("xid: warning: no netdev with useable HWADDR
>> found"
>> -+ " for seed's uniqueness enforcement");
>> -+ log_info ("xid: rand init seed (0x%x) built using
>> gethostid",
>> -+ seed);
>> -+ }
>> -+ /* we only use seed and no current time as a broadcast reply
>> */
>> -+ /* will certainly be used by the hwaddrless interface */
>> -+ srandom(seed);
>> -+ }
>> -+ else
>> -+ srandom(seed + cur_time + (unsigned)getpid());
>> -
>> - /* Setup specific Infiniband options */
>> - for (ip = interfaces; ip; ip = ip->next) {
>> -@@ -1460,7 +1502,7 @@ void dhcpack (packet)
>> - return;
>> - }
>> -
>> -- log_info ("DHCPACK from %s", piaddr (packet -> client_addr));
>> -+ log_info ("DHCPACK from %s (xid=0x%x)", piaddr (packet ->
>> client_addr), client -> xid);
>> -
>> - lease = packet_to_lease (packet, client);
>> - if (!lease) {
>> -@@ -2171,7 +2213,7 @@ void dhcpnak (packet)
>> - return;
>> - }
>> -
>> -- log_info ("DHCPNAK from %s", piaddr (packet -> client_addr));
>> -+ log_info ("DHCPNAK from %s (xid=0x%x)", piaddr (packet ->
>> client_addr), client -> xid);
>> -
>> - if (!client -> active) {
>> - #if defined (DEBUG)
>> -@@ -2298,10 +2340,10 @@ void send_discover (cpp)
>> - client -> packet.secs = htons (65535);
>> - client -> secs = client -> packet.secs;
>> -
>> -- log_info ("DHCPDISCOVER on %s to %s port %d interval %ld",
>> -+ log_info ("DHCPDISCOVER on %s to %s port %d interval %ld
>> (xid=0x%x)",
>> - client -> name ? client -> name : client -> interface -> name,
>> - inet_ntoa (sockaddr_broadcast.sin_addr),
>> -- ntohs (sockaddr_broadcast.sin_port), (long)(client ->
>> interval));
>> -+ ntohs (sockaddr_broadcast.sin_port), (long)(client ->
>> interval), client -> xid);
>> -
>> - /* Send out a packet. */
>> - result = send_packet(client->interface, NULL, &client->packet,
>> -@@ -2570,10 +2612,10 @@ void send_request (cpp)
>> - client -> packet.secs = htons (65535);
>> - }
>> -
>> -- log_info ("DHCPREQUEST on %s to %s port %d",
>> -+ log_info ("DHCPREQUEST on %s to %s port %d (xid=0x%x)",
>> - client -> name ? client -> name : client -> interface -> name,
>> - inet_ntoa (destination.sin_addr),
>> -- ntohs (destination.sin_port));
>> -+ ntohs (destination.sin_port), client -> xid);
>> -
>> - if (destination.sin_addr.s_addr != INADDR_BROADCAST &&
>> - fallback_interface) {
>> -@@ -2613,10 +2655,10 @@ void send_decline (cpp)
>> -
>> - int result;
>> -
>> -- log_info ("DHCPDECLINE on %s to %s port %d",
>> -+ log_info ("DHCPDECLINE on %s to %s port %d (xid=0x%x)",
>> - client->name ? client->name : client->interface->name,
>> - inet_ntoa(sockaddr_broadcast.sin_addr),
>> -- ntohs(sockaddr_broadcast.sin_port));
>> -+ ntohs(sockaddr_broadcast.sin_port), client -> xid);
>> -
>> - /* Send out a packet. */
>> - result = send_packet(client->interface, NULL, &client->packet,
>> -@@ -2659,10 +2701,10 @@ void send_release (cpp)
>> - return;
>> - }
>> -
>> -- log_info ("DHCPRELEASE on %s to %s port %d",
>> -+ log_info ("DHCPRELEASE on %s to %s port %d (xid=0x%x)",
>> - client -> name ? client -> name : client -> interface -> name,
>> - inet_ntoa (destination.sin_addr),
>> -- ntohs (destination.sin_port));
>> -+ ntohs (destination.sin_port), client -> xid);
>> -
>> - if (fallback_interface) {
>> - result = send_packet(fallback_interface, NULL, &client-
>> >packet,
>> diff --git a/src/patches/dhcp/dhcp-logpid.patch b/src/patches/dhcp/dhcp-
>> logpid.patch
>> deleted file mode 100644
>> index e1a6ebdb5..000000000
>> --- a/src/patches/dhcp/dhcp-logpid.patch
>> +++ /dev/null
>> @@ -1,11 +0,0 @@
>> ---- expanded_org/client/dhclient.c Wed Aug 06 23:35:00 2014
>> -+++ expanded_logpid/client/dhclient.c Mon Feb 16 13:35:31 2015
>> -@@ -142,7 +142,7 @@
>> - else if (fd != -1)
>> - close(fd);
>> -
>> -- openlog("dhclient", DHCP_LOG_OPTIONS, LOG_DAEMON);
>> -+ openlog("dhclient", LOG_NDELAY | LOG_PID, LOG_DAEMON);
>> -
>> - #if !(defined(DEBUG) || defined(__CYGWIN32__))
>> - setlogmask(LOG_UPTO(LOG_INFO));
>> diff --git a/src/patches/dhcp/dhcp-lpf-ib.patch b/src/patches/dhcp/dhcp-lpf-
>> ib.patch
>> deleted file mode 100644
>> index 8e094d649..000000000
>> --- a/src/patches/dhcp/dhcp-lpf-ib.patch
>> +++ /dev/null
>> @@ -1,585 +0,0 @@
>> -diff -up dhcp-4.3.1b1/client/dhclient.c.bmgpWV dhcp-4.3.1b1/client/dhclient.c
>> ---- dhcp-4.3.1b1/client/dhclient.c.bmgpWV 2014-07-10
>> 17:50:26.922402550 +0200
>> -+++ dhcp-4.3.1b1/client/dhclient.c 2014-07-10 17:53:43.629623477 +0200
>> -@@ -114,6 +114,8 @@ static int check_domain_name_list(const
>> - static int check_option_values(struct universe *universe, unsigned int opt,
>> - const char *ptr, size_t len);
>> -
>> -+static void setup_ib_interface(struct interface_info *ip);
>> -+
>> - #ifndef UNIT_TEST
>> - int
>> - main(int argc, char **argv) {
>> -@@ -937,6 +939,13 @@ main(int argc, char **argv) {
>> - }
>> - srandom(seed + cur_time + (unsigned)getpid());
>> -
>> -+ /* Setup specific Infiniband options */
>> -+ for (ip = interfaces; ip; ip = ip->next) {
>> -+ if (ip->client &&
>> -+ (ip->hw_address.hbuf[0] == HTYPE_INFINIBAND)) {
>> -+ setup_ib_interface(ip);
>> -+ }
>> -+ }
>> -
>> - /*
>> - * Establish a default DUID. We always do so for v6 and
>> -@@ -1230,6 +1239,29 @@ int find_subnet (struct subnet **sp,
>> - return 0;
>> - }
>> -
>> -+static void setup_ib_interface(struct interface_info *ip)
>> -+{
>> -+ struct group *g;
>> -+
>> -+ /* Set the broadcast flag */
>> -+ ip->client->config->bootp_broadcast_always = 1;
>> -+
>> -+ /*
>> -+ * Find out if a dhcp-client-identifier option was specified either
>> -+ * in the config file or on the command line
>> -+ */
>> -+ for (g = ip->client->config->on_transmission; g != NULL; g = g-
>> >next) {
>> -+ if ((g->statements != NULL) &&
>> -+ (strcmp(g->statements->data.option->option->name,
>> -+ "dhcp-client-identifier") == 0)) {
>> -+ return;
>> -+ }
>> -+ }
>> -+
>> -+ /* No client ID specified */
>> -+ log_fatal("dhcp-client-identifier must be specified for
>> InfiniBand");
>> -+}
>> -+
>> - /* Individual States:
>> - *
>> - * Each routine is called from the dhclient_state_machine() in one of
>> -diff -up dhcp-4.3.1b1/common/bpf.c.bmgpWV dhcp-4.3.1b1/common/bpf.c
>> ---- dhcp-4.3.1b1/common/bpf.c.bmgpWV 2014-07-10 17:48:03.797424616
>> +0200
>> -+++ dhcp-4.3.1b1/common/bpf.c 2014-07-10 17:52:57.705272295 +0200
>> -@@ -199,11 +199,44 @@ struct bpf_insn dhcp_bpf_filter [] = {
>> - BPF_STMT(BPF_RET+BPF_K, 0),
>> - };
>> -
>> -+/* Packet filter program for DHCP over Infiniband.
>> -+ *
>> -+ * XXX
>> -+ * Changes to the filter program may require changes to the constant offsets
>> -+ * used in lpf_gen_filter_setup to patch the port in the BPF program!
>> -+ * XXX
>> -+ */
>> -+struct bpf_insn dhcp_ib_bpf_filter [] = {
>> -+ /* Packet filter for Infiniband */
>> -+ /* Make sure it's a UDP packet... */
>> -+ BPF_STMT(BPF_LD + BPF_B + BPF_ABS, 9),
>> -+ BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, IPPROTO_UDP, 0, 6),
>> -+
>> -+ /* Make sure this isn't a fragment... */
>> -+ BPF_STMT(BPF_LD + BPF_H + BPF_ABS, 6),
>> -+ BPF_JUMP(BPF_JMP + BPF_JSET + BPF_K, 0x1fff, 4, 0),
>> -+
>> -+ /* Get the IP header length... */
>> -+ BPF_STMT(BPF_LDX + BPF_B + BPF_MSH, 0),
>> -+
>> -+ /* Make sure it's to the right port... */
>> -+ BPF_STMT(BPF_LD + BPF_H + BPF_IND, 2),
>> -+ BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, 67, 0, 1),
>> -+
>> -+ /* If we passed all the tests, ask for the whole packet. */
>> -+ BPF_STMT(BPF_RET + BPF_K, (u_int)-1),
>> -+
>> -+ /* Otherwise, drop it. */
>> -+ BPF_STMT(BPF_RET + BPF_K, 0),
>> -+};
>> -+
>> - #if defined (DEC_FDDI)
>> - struct bpf_insn *bpf_fddi_filter;
>> - #endif
>> -
>> - int dhcp_bpf_filter_len = sizeof dhcp_bpf_filter / sizeof (struct bpf_insn);
>> -+int dhcp_ib_bpf_filter_len = sizeof dhcp_ib_bpf_filter / sizeof (struct
>> bpf_insn);
>> -+
>> - #if defined (HAVE_TR_SUPPORT)
>> - struct bpf_insn dhcp_bpf_tr_filter [] = {
>> - /* accept all token ring packets due to variable length header */
>> -diff -up dhcp-4.3.1b1/common/lpf.c.bmgpWV dhcp-4.3.1b1/common/lpf.c
>> ---- dhcp-4.3.1b1/common/lpf.c.bmgpWV 2014-07-10 17:48:03.797424616
>> +0200
>> -+++ dhcp-4.3.1b1/common/lpf.c 2014-07-10 17:52:57.706272281 +0200
>> -@@ -46,6 +46,17 @@
>> - #if defined (USE_LPF_RECEIVE) || defined (USE_LPF_HWADDR)
>> - #include <sys/ioctl.h>
>> - #include <net/if.h>
>> -+#include <ifaddrs.h>
>> -+
>> -+/* Default broadcast address for IPoIB */
>> -+static unsigned char default_ib_bcast_addr[20] = {
>> -+ 0x00, 0xff, 0xff, 0xff,
>> -+ 0xff, 0x12, 0x40, 0x1b,
>> -+ 0x00, 0x00, 0x00, 0x00,
>> -+ 0x00, 0x00, 0x00, 0x00,
>> -+ 0xff, 0xff, 0xff, 0xff
>> -+};
>> -+
>> - #endif
>> -
>> - #if defined (USE_LPF_SEND) || defined (USE_LPF_RECEIVE)
>> -@@ -92,10 +103,21 @@ int if_register_lpf (info)
>> - struct sockaddr common;
>> - } sa;
>> - struct ifreq ifr;
>> -+ int type;
>> -+ int protocol;
>> -
>> - /* Make an LPF socket. */
>> -- if ((sock = socket(PF_PACKET, SOCK_RAW,
>> -- htons((short)ETH_P_ALL))) < 0) {
>> -+ get_hw_addr(info);
>> -+
>> -+ if (info->hw_address.hbuf[0] == HTYPE_INFINIBAND) {
>> -+ type = SOCK_DGRAM;
>> -+ protocol = ETHERTYPE_IP;
>> -+ } else {
>> -+ type = SOCK_RAW;
>> -+ protocol = ETH_P_ALL;
>> -+ }
>> -+
>> -+ if ((sock = socket(PF_PACKET, type, htons((short)protocol))) < 0) {
>> - if (errno == ENOPROTOOPT || errno == EPROTONOSUPPORT ||
>> - errno == ESOCKTNOSUPPORT || errno == EPFNOSUPPORT ||
>> - errno == EAFNOSUPPORT || errno == EINVAL) {
>> -@@ -118,6 +140,7 @@ int if_register_lpf (info)
>> - /* Bind to the interface name */
>> - memset (&sa, 0, sizeof sa);
>> - sa.ll.sll_family = AF_PACKET;
>> -+ sa.ll.sll_protocol = htons(protocol);
>> - sa.ll.sll_ifindex = ifr.ifr_ifindex;
>> - if (bind (sock, &sa.common, sizeof sa)) {
>> - if (errno == ENOPROTOOPT || errno == EPROTONOSUPPORT ||
>> -@@ -133,8 +156,6 @@ int if_register_lpf (info)
>> - log_fatal ("Bind socket to interface: %m");
>> - }
>> -
>> -- get_hw_addr(info->name, &info->hw_address);
>> --
>> - return sock;
>> - }
>> - #endif /* USE_LPF_SEND || USE_LPF_RECEIVE */
>> -@@ -189,6 +210,8 @@ void if_deregister_send (info)
>> - in bpf includes... */
>> - extern struct sock_filter dhcp_bpf_filter [];
>> - extern int dhcp_bpf_filter_len;
>> -+extern struct sock_filter dhcp_ib_bpf_filter [];
>> -+extern int dhcp_ib_bpf_filter_len;
>> -
>> - #if defined (HAVE_TR_SUPPORT)
>> - extern struct sock_filter dhcp_bpf_tr_filter [];
>> -@@ -206,11 +229,13 @@ void if_register_receive (info)
>> - /* Open a LPF device and hang it on this interface... */
>> - info -> rfdesc = if_register_lpf (info);
>> -
>> -- val = 1;
>> -- if (setsockopt (info -> rfdesc, SOL_PACKET, PACKET_AUXDATA, &val,
>> -- sizeof val) < 0) {
>> -- if (errno != ENOPROTOOPT)
>> -- log_fatal ("Failed to set auxiliary packet data:
>> %m");
>> -+ if (info->hw_address.hbuf[0] != HTYPE_INFINIBAND) {
>> -+ val = 1;
>> -+ if (setsockopt (info -> rfdesc, SOL_PACKET, PACKET_AUXDATA,
>> -+ &val, sizeof val) < 0) {
>> -+ if (errno != ENOPROTOOPT)
>> -+ log_fatal ("Failed to set auxiliary packet
>> data: %m");
>> -+ }
>> - }
>> -
>> - #if defined (HAVE_TR_SUPPORT)
>> -@@ -256,15 +281,28 @@ static void lpf_gen_filter_setup (info)
>> -
>> - memset(&p, 0, sizeof(p));
>> -
>> -- /* Set up the bpf filter program structure. This is defined in
>> -- bpf.c */
>> -- p.len = dhcp_bpf_filter_len;
>> -- p.filter = dhcp_bpf_filter;
>> --
>> -- /* Patch the server port into the LPF program...
>> -- XXX changes to filter program may require changes
>> -- to the insn number(s) used below! XXX */
>> -- dhcp_bpf_filter [8].k = ntohs ((short)local_port);
>> -+ if (info->hw_address.hbuf[0] == HTYPE_INFINIBAND) {
>> -+ /* Set up the bpf filter program structure. */
>> -+ p.len = dhcp_ib_bpf_filter_len;
>> -+ p.filter = dhcp_ib_bpf_filter;
>> -+
>> -+ /* Patch the server port into the LPF program...
>> -+ XXX
>> -+ changes to filter program may require changes
>> -+ to the insn number(s) used below!
>> -+ XXX */
>> -+ dhcp_ib_bpf_filter[6].k = ntohs ((short)local_port);
>> -+ } else {
>> -+ /* Set up the bpf filter program structure.
>> -+ This is defined in bpf.c */
>> -+ p.len = dhcp_bpf_filter_len;
>> -+ p.filter = dhcp_bpf_filter;
>> -+
>> -+ /* Patch the server port into the LPF program...
>> -+ XXX changes to filter program may require changes
>> -+ to the insn number(s) used below! XXX */
>> -+ dhcp_bpf_filter [8].k = ntohs ((short)local_port);
>> -+ }
>> -
>> - if (setsockopt (info -> rfdesc, SOL_SOCKET, SO_ATTACH_FILTER, &p,
>> - sizeof p) < 0) {
>> -@@ -321,6 +359,54 @@ static void lpf_tr_filter_setup (info)
>> - #endif /* USE_LPF_RECEIVE */
>> -
>> - #ifdef USE_LPF_SEND
>> -+ssize_t send_packet_ib(interface, packet, raw, len, from, to, hto)
>> -+ struct interface_info *interface;
>> -+ struct packet *packet;
>> -+ struct dhcp_packet *raw;
>> -+ size_t len;
>> -+ struct in_addr from;
>> -+ struct sockaddr_in *to;
>> -+ struct hardware *hto;
>> -+{
>> -+ unsigned ibufp = 0;
>> -+ double ih [1536 / sizeof (double)];
>> -+ unsigned char *buf = (unsigned char *)ih;
>> -+ ssize_t result;
>> -+
>> -+ union sockunion {
>> -+ struct sockaddr sa;
>> -+ struct sockaddr_ll sll;
>> -+ struct sockaddr_storage ss;
>> -+ } su;
>> -+
>> -+ assemble_udp_ip_header (interface, buf, &ibufp, from.s_addr,
>> -+ to->sin_addr.s_addr, to->sin_port,
>> -+ (unsigned char *)raw, len);
>> -+ memcpy (buf + ibufp, raw, len);
>> -+
>> -+ memset(&su, 0, sizeof(su));
>> -+ su.sll.sll_family = AF_PACKET;
>> -+ su.sll.sll_protocol = htons(ETHERTYPE_IP);
>> -+
>> -+ if (!(su.sll.sll_ifindex = if_nametoindex(interface->name))) {
>> -+ errno = ENOENT;
>> -+ log_error ("send_packet_ib: %m - failed to get if index");
>> -+ return -1;
>> -+ }
>> -+
>> -+ su.sll.sll_hatype = htons(HTYPE_INFINIBAND);
>> -+ su.sll.sll_halen = sizeof(interface->bcast_addr);
>> -+ memcpy(&su.sll.sll_addr, interface->bcast_addr, 20);
>> -+
>> -+ result = sendto(interface->wfdesc, buf, ibufp + len, 0,
>> -+ &su.sa, sizeof(su));
>> -+
>> -+ if (result < 0)
>> -+ log_error ("send_packet_ib: %m");
>> -+
>> -+ return result;
>> -+}
>> -+
>> - ssize_t send_packet (interface, packet, raw, len, from, to, hto)
>> - struct interface_info *interface;
>> - struct packet *packet;
>> -@@ -341,6 +427,11 @@ ssize_t send_packet (interface, packet,
>> - return send_fallback (interface, packet, raw,
>> - len, from, to, hto);
>> -
>> -+ if (interface->hw_address.hbuf[0] == HTYPE_INFINIBAND) {
>> -+ return send_packet_ib(interface, packet, raw, len, from,
>> -+ to, hto);
>> -+ }
>> -+
>> - if (hto == NULL && interface->anycast_mac_addr.hlen)
>> - hto = &interface->anycast_mac_addr;
>> -
>> -@@ -362,6 +453,42 @@ ssize_t send_packet (interface, packet,
>> - #endif /* USE_LPF_SEND */
>> -
>> - #ifdef USE_LPF_RECEIVE
>> -+ssize_t receive_packet_ib (interface, buf, len, from, hfrom)
>> -+ struct interface_info *interface;
>> -+ unsigned char *buf;
>> -+ size_t len;
>> -+ struct sockaddr_in *from;
>> -+ struct hardware *hfrom;
>> -+{
>> -+ int length = 0;
>> -+ int offset = 0;
>> -+ unsigned char ibuf [1536];
>> -+ unsigned bufix = 0;
>> -+ unsigned paylen;
>> -+
>> -+ length = read(interface->rfdesc, ibuf, sizeof(ibuf));
>> -+
>> -+ if (length <= 0)
>> -+ return length;
>> -+
>> -+ offset = decode_udp_ip_header(interface, ibuf, bufix, from,
>> -+ (unsigned)length, &paylen, 0);
>> -+
>> -+ if (offset < 0)
>> -+ return 0;
>> -+
>> -+ bufix += offset;
>> -+ length -= offset;
>> -+
>> -+ if (length < paylen)
>> -+ log_fatal("Internal inconsistency at %s:%d.", MDL);
>> -+
>> -+ /* Copy out the data in the packet... */
>> -+ memcpy(buf, &ibuf[bufix], paylen);
>> -+
>> -+ return (ssize_t)paylen;
>> -+}
>> -+
>> - ssize_t receive_packet (interface, buf, len, from, hfrom)
>> - struct interface_info *interface;
>> - unsigned char *buf;
>> -@@ -388,6 +515,10 @@ ssize_t receive_packet (interface, buf,
>> - };
>> - struct cmsghdr *cmsg;
>> -
>> -+ if (interface->hw_address.hbuf[0] == HTYPE_INFINIBAND) {
>> -+ return receive_packet_ib(interface, buf, len, from, hfrom);
>> -+ }
>> -+
>> - length = recvmsg (interface -> rfdesc, &msg, 0);
>> - if (length <= 0)
>> - return length;
>> -@@ -469,11 +600,33 @@ void maybe_setup_fallback ()
>> - #endif
>> -
>> - #if defined (USE_LPF_RECEIVE) || defined (USE_LPF_HWADDR)
>> --void
>> --get_hw_addr(const char *name, struct hardware *hw) {
>> -+struct sockaddr_ll *
>> -+get_ll (struct ifaddrs *ifaddrs, struct ifaddrs **ifa, char *name)
>> -+{
>> -+ for (*ifa = ifaddrs; *ifa != NULL; *ifa = (*ifa)->ifa_next) {
>> -+ if ((*ifa)->ifa_addr == NULL)
>> -+ continue;
>> -+
>> -+ if ((*ifa)->ifa_addr->sa_family != AF_PACKET)
>> -+ continue;
>> -+
>> -+ if ((*ifa)->ifa_flags & IFF_LOOPBACK)
>> -+ continue;
>> -+
>> -+ if (strcmp((*ifa)->ifa_name, name) == 0)
>> -+ return (struct sockaddr_ll *)(void *)(*ifa)-
>> >ifa_addr;
>> -+ }
>> -+ *ifa = NULL;
>> -+ return NULL;
>> -+}
>> -+
>> -+struct sockaddr_ll *
>> -+ioctl_get_ll(char *name)
>> -+{
>> - int sock;
>> - struct ifreq tmp;
>> -- struct sockaddr *sa;
>> -+ struct sockaddr *sa = NULL;
>> -+ struct sockaddr_ll *sll = NULL;
>> -
>> - if (strlen(name) >= sizeof(tmp.ifr_name)) {
>> - log_fatal("Device name too long: \"%s\"", name);
>> -@@ -487,16 +640,62 @@ get_hw_addr(const char *name, struct har
>> - memset(&tmp, 0, sizeof(tmp));
>> - strcpy(tmp.ifr_name, name);
>> - if (ioctl(sock, SIOCGIFHWADDR, &tmp) < 0) {
>> -- log_fatal("Error getting hardware address for \"%s\": %m",
>> -+ log_fatal("Error getting hardware address for \"%s\": %m",
>> - name);
>> - }
>> -+ close(sock);
>> -
>> - sa = &tmp.ifr_hwaddr;
>> -- switch (sa->sa_family) {
>> -+ // needs to be freed outside this function
>> -+ sll = dmalloc (sizeof (struct sockaddr_ll), MDL);
>> -+ if (!sll)
>> -+ log_fatal("Unable to allocate memory for link layer
>> address");
>> -+ memcpy(&sll->sll_hatype, &sa->sa_family, sizeof (sll->sll_hatype));
>> -+ memcpy(sll->sll_addr, sa->sa_data, sizeof (sll->sll_addr));
>> -+ switch (sll->sll_hatype) {
>> -+ case ARPHRD_INFINIBAND:
>> -+ /* ioctl limits hardware addresses to 8 bytes */
>> -+ sll->sll_halen = 8;
>> -+ break;
>> -+ default:
>> -+ break;
>> -+ }
>> -+ return sll;
>> -+}
>> -+
>> -+void
>> -+get_hw_addr(struct interface_info *info)
>> -+{
>> -+ struct hardware *hw = &info->hw_address;
>> -+ char *name = info->name;
>> -+ struct ifaddrs *ifaddrs = NULL;
>> -+ struct ifaddrs *ifa = NULL;
>> -+ struct sockaddr_ll *sll = NULL;
>> -+ int sll_allocated = 0;
>> -+ char *dup = NULL;
>> -+ char *colon = NULL;
>> -+
>> -+ if (getifaddrs(&ifaddrs) == -1)
>> -+ log_fatal("Failed to get interfaces");
>> -+
>> -+ if ((sll = get_ll(ifaddrs, &ifa, name)) == NULL) {
>> -+ /*
>> -+ * We were unable to get link-layer address for name.
>> -+ * Fall back to ioctl(SIOCGIFHWADDR).
>> -+ */
>> -+ sll = ioctl_get_ll(name);
>> -+ if (sll != NULL)
>> -+ sll_allocated = 1;
>> -+ else
>> -+ // shouldn't happen
>> -+ log_fatal("Unexpected internal error");
>> -+ }
>> -+
>> -+ switch (sll->sll_hatype) {
>> - case ARPHRD_ETHER:
>> - hw->hlen = 7;
>> - hw->hbuf[0] = HTYPE_ETHER;
>> -- memcpy(&hw->hbuf[1], sa->sa_data, 6);
>> -+ memcpy(&hw->hbuf[1], sll->sll_addr, 6);
>> - break;
>> - case ARPHRD_IEEE802:
>> - #ifdef ARPHRD_IEEE802_TR
>> -@@ -504,18 +703,48 @@ get_hw_addr(const char *name, struct har
>> - #endif /* ARPHRD_IEEE802_TR */
>> - hw->hlen = 7;
>> - hw->hbuf[0] = HTYPE_IEEE802;
>> -- memcpy(&hw->hbuf[1], sa->sa_data, 6);
>> -+ memcpy(&hw->hbuf[1], sll->sll_addr, 6);
>> - break;
>> - case ARPHRD_FDDI:
>> - hw->hlen = 7;
>> - hw->hbuf[0] = HTYPE_FDDI;
>> -- memcpy(&hw->hbuf[1], sa->sa_data, 6);
>> -+ memcpy(&hw->hbuf[1], sll->sll_addr, 6);
>> -+ break;
>> -+ case ARPHRD_INFINIBAND:
>> -+ dup = strdup(name);
>> -+ /* Aliased infiniband interface is special case
>> where
>> -+ * neither get_ll() nor ioctl_get_ll() get's correct
>> hw
>> -+ * address, so we have to truncate the :0 and run
>> -+ * get_ll() again for the rest.
>> -+ */
>> -+ if ((colon = strchr(dup, ':')) != NULL) {
>> -+ *colon = '\0';
>> -+ if ((sll = get_ll(ifaddrs, &ifa, dup)) ==
>> NULL)
>> -+ log_fatal("Error getting hardware
>> address for \"%s\": %m", name);
>> -+ }
>> -+ free (dup);
>> -+ /* For Infiniband, save the broadcast address and
>> store
>> -+ * the port GUID into the hardware address.
>> -+ */
>> -+ if (ifa && (ifa->ifa_flags & IFF_BROADCAST)) {
>> -+ struct sockaddr_ll *bll;
>> -+
>> -+ bll = (struct sockaddr_ll *)ifa-
>> >ifa_broadaddr;
>> -+ memcpy(&info->bcast_addr, bll->sll_addr,
>> 20);
>> -+ } else {
>> -+ memcpy(&info->bcast_addr,
>> default_ib_bcast_addr,
>> -+ 20);
>> -+ }
>> -+
>> -+ hw->hlen = 1;
>> -+ hw->hbuf[0] = HTYPE_INFINIBAND;
>> -+ memcpy(&hw->hbuf[1], &sll->sll_addr[sll->sll_halen -
>> 8], 8);
>> - break;
>> - #if defined(ARPHRD_PPP)
>> - case ARPHRD_PPP:
>> - if (local_family != AF_INET6)
>> -- log_fatal("Unsupported device type %d for
>> \"%s\"",
>> -- sa->sa_family, name);
>> -+ log_fatal("local_family != AF_INET6 for
>> \"%s\"",
>> -+ name);
>> - hw->hlen = 0;
>> - hw->hbuf[0] = HTYPE_RESERVED;
>> - /* 0xdeadbeef should never occur on the wire,
>> -@@ -528,10 +757,13 @@ get_hw_addr(const char *name, struct har
>> - break;
>> - #endif
>> - default:
>> -- log_fatal("Unsupported device type %ld for \"%s\"",
>> -- (long int)sa->sa_family, name);
>> -+ freeifaddrs(ifaddrs);
>> -+ log_fatal("Unsupported device type %hu for \"%s\"",
>> -+ sll->sll_hatype, name);
>> - }
>> -
>> -- close(sock);
>> -+ if (sll_allocated)
>> -+ dfree(sll, MDL);
>> -+ freeifaddrs(ifaddrs);
>> - }
>> - #endif
>> -diff -up dhcp-4.3.1b1/common/socket.c.bmgpWV dhcp-4.3.1b1/common/socket.c
>> ---- dhcp-4.3.1b1/common/socket.c.bmgpWV 2014-07-02 19:58:38.000000000
>> +0200
>> -+++ dhcp-4.3.1b1/common/socket.c 2014-07-10 17:52:57.706272281 +0200
>> -@@ -322,7 +322,7 @@ void if_register_send (info)
>> - info->wfdesc = if_register_socket(info, AF_INET, 0, NULL);
>> - /* If this is a normal IPv4 address, get the hardware address. */
>> - if (strcmp(info->name, "fallback") != 0)
>> -- get_hw_addr(info->name, &info->hw_address);
>> -+ get_hw_addr(info);
>> - #if defined (USE_SOCKET_FALLBACK)
>> - /* Fallback only registers for send, but may need to receive as
>> - well. */
>> -@@ -385,7 +385,7 @@ void if_register_receive (info)
>> - #endif /* IP_PKTINFO... */
>> - /* If this is a normal IPv4 address, get the hardware address. */
>> - if (strcmp(info->name, "fallback") != 0)
>> -- get_hw_addr(info->name, &info->hw_address);
>> -+ get_hw_addr(info);
>> -
>> - if (!quiet_interface_discovery)
>> - log_info ("Listening on Socket/%s%s%s",
>> -@@ -499,7 +499,7 @@ if_register6(struct interface_info *info
>> - if (req_multi)
>> - if_register_multicast(info);
>> -
>> -- get_hw_addr(info->name, &info->hw_address);
>> -+ get_hw_addr(info);
>> -
>> - if (!quiet_interface_discovery) {
>> - if (info->shared_network != NULL) {
>> -@@ -555,7 +555,7 @@ if_register_linklocal6(struct interface_
>> - info->rfdesc = sock;
>> - info->wfdesc = sock;
>> -
>> -- get_hw_addr(info->name, &info->hw_address);
>> -+ get_hw_addr(info);
>> -
>> - if (!quiet_interface_discovery) {
>> - if (info->shared_network != NULL) {
>> -diff -up dhcp-4.3.1b1/includes/dhcpd.h.bmgpWV dhcp-4.3.1b1/includes/dhcpd.h
>> ---- dhcp-4.3.1b1/includes/dhcpd.h.bmgpWV 2014-07-10 17:50:26.923402536
>> +0200
>> -+++ dhcp-4.3.1b1/includes/dhcpd.h 2014-07-10 17:52:57.707272266 +0200
>> -@@ -1248,6 +1248,7 @@ struct interface_info {
>> - struct shared_network *shared_network;
>> - /* Networks connected to this interface. */
>> - struct hardware hw_address; /* Its physical address. */
>> -+ u_int8_t bcast_addr[20]; /* Infiniband broadcast address */
>> - struct in_addr *addresses; /* Addresses associated with this
>> - * interface.
>> - */
>> -@@ -2439,7 +2440,7 @@ void print_dns_status (int, struct dhcp_
>> - #endif
>> - const char *print_time(TIME);
>> -
>> --void get_hw_addr(const char *name, struct hardware *hw);
>> -+void get_hw_addr(struct interface_info *info);
>> -
>> - /* socket.c */
>> - #if defined (USE_SOCKET_SEND) || defined (USE_SOCKET_RECEIVE) \
>> diff --git a/src/patches/dhcp/dhcp-manpages.patch b/src/patches/dhcp/dhcp-
>> manpages.patch
>> deleted file mode 100644
>> index dde16c735..000000000
>> --- a/src/patches/dhcp/dhcp-manpages.patch
>> +++ /dev/null
>> @@ -1,157 +0,0 @@
>> -diff -up dhcp-4.3.0a1/client/dhclient-script.8.man dhcp-
>> 4.3.0a1/client/dhclient-script.8
>> ---- dhcp-4.3.0a1/client/dhclient-script.8.man 2013-12-11
>> 01:01:02.000000000 +0100
>> -+++ dhcp-4.3.0a1/client/dhclient-script.8 2013-12-19
>> 15:27:17.617118805 +0100
>> -@@ -48,7 +48,7 @@ customizations are needed, they should b
>> - exit hooks provided (see HOOKS for details). These hooks will allow the
>> - user to override the default behaviour of the client in creating a
>> - .B /etc/resolv.conf
>> --file.
>> -+file, and to handle DHCP options not handled by default.
>> - .PP
>> - No standard client script exists for some operating systems, even though
>> - the actual client may work, so a pioneering user may well need to create
>> -@@ -92,6 +92,26 @@ present. The
>> - .B ETCDIR/dhclient-exit-hooks
>> - script can modify the valid of exit_status to change the exit status
>> - of dhclient-script.
>> -+.PP
>> -+Immediately after dhclient brings an interface UP with a new IP address,
>> -+subnet mask, and routes, in the REBOOT/BOUND states, it will check for the
>> -+existence of an executable
>> -+.B ETCDIR/dhclient-up-hooks
>> -+script, and source it if found. This script can handle DHCP options in
>> -+the environment that are not handled by default. A per-interface.
>> -+.B ETCDIR/dhclient-${IF}-up-hooks
>> -+script will override the generic script and be sourced when interface
>> -+$IF has been brought up.
>> -+.PP
>> -+Immediately before dhclient brings an interface DOWN, removing its IP
>> -+address, subnet mask, and routes, in the STOP/RELEASE states, it will
>> -+check for the existence of an executable
>> -+.B ETCDIR/dhclient-down-hooks
>> -+script, and source it if found. This script can handle DHCP options in
>> -+the environment that are not handled by default. A per-interface
>> -+.B ETCDIR/dhclient-${IF}-down-hooks
>> -+script will override the generic script and be sourced when interface
>> -+$IF is about to be brought down.
>> - .SH OPERATION
>> - When dhclient needs to invoke the client configuration script, it
>> - defines a set of variables in the environment, and then invokes
>> -diff -up dhcp-4.3.0a1/client/dhclient.conf.5.man dhcp-
>> 4.3.0a1/client/dhclient.conf.5
>> ---- dhcp-4.3.0a1/client/dhclient.conf.5.man 2013-12-11
>> 01:01:02.000000000 +0100
>> -+++ dhcp-4.3.0a1/client/dhclient.conf.5 2013-12-19 15:27:17.617118805
>> +0100
>> -@@ -202,7 +202,8 @@ responding to the client send the client
>> - options. Only the option names should be specified in the request
>> - statement - not option parameters. By default, the DHCPv4 client
>> - requests the subnet-mask, broadcast-address, time-offset, routers,
>> --domain-name, domain-name-servers and host-name options while the DHCPv6
>> -+domain-search, domain-name, domain-name-servers, host-name, nis-domain,
>> -+nis-servers, ntp-servers and interface-mtu options while the DHCPv6
>> - client requests the dhcp6 name-servers and domain-search options. Note
>> - that if you enter a \'request\' statement, you over-ride these defaults
>> - and these options will not be requested.
>> -@@ -688,6 +689,17 @@ know the DHCP service(s) anycast MAC add
>> - client. The \fIlink-type\fR and \fImac-address\fR parameters are configured
>> - in a similar manner to the \fBhardware\fR statement.
>> - .PP
>> -+ \fBbootp-broadcast-always;\fR
>> -+.PP
>> -+The
>> -+.B bootp-broadcast-always
>> -+statement instructs dhclient to always set the bootp broadcast flag in
>> -+request packets, so that servers will always broadcast replies.
>> -+This is equivalent to supplying the dhclient -B argument, and has
>> -+the same effect as specifying 'always-broadcast' in the server's dhcpd.conf.
>> -+This option is provided as an extension to enable dhclient to work
>> -+on IBM s390 Linux guests.
>> -+.PP
>> - .SH SAMPLE
>> - The following configuration file is used on a laptop running NetBSD
>> - 1.3. The laptop has an IP alias of 192.5.5.213, and has one
>> -@@ -713,7 +725,7 @@ interface "ep0" {
>> - supersede domain-search "fugue.com", "rc.vix.com", "home.vix.com";
>> - prepend domain-name-servers 127.0.0.1;
>> - request subnet-mask, broadcast-address, time-offset, routers,
>> -- domain-name, domain-name-servers, host-name;
>> -+ domain-search, domain-name, domain-name-servers, host-name;
>> - require subnet-mask, domain-name-servers;
>> - script "CLIENTBINDIR/dhclient-script";
>> - media "media 10baseT/UTP", "media 10base2/BNC";
>> -diff -up dhcp-4.3.0a1/common/dhcp-options.5.man dhcp-4.3.0a1/common/dhcp-
>> options.5
>> ---- dhcp-4.3.0a1/common/dhcp-options.5.man 2013-12-11
>> 01:25:12.000000000 +0100
>> -+++ dhcp-4.3.0a1/common/dhcp-options.5 2013-12-19 15:27:17.618118791
>> +0100
>> -@@ -914,6 +914,21 @@ classless IP routing - it does not inclu
>> - classless IP routing is now the most widely deployed routing standard,
>> - this option is virtually useless, and is not implemented by any of the
>> - popular DHCP clients, for example the Microsoft DHCP client.
>> -+.PP
>> -+NOTE to Fedora dhclient users:
>> -+.br
>> -+dhclient-script interprets trailing 0 octets of the target as indicating
>> -+the subnet class of the route, so for the following static-routes value:
>> -+.br
>> -+ option static-routes 172.0.0.0 172.16.2.254,
>> -+.br
>> -+ 192.168.0.0 192.168.2.254;
>> -+.br
>> -+dhclient-script will create routes:
>> -+.br
>> -+ 172/8 via 172.16.2.254 dev $interface
>> -+.br
>> -+ 192.168/16 via 192.168.2.254 dev $interface
>> - .RE
>> - .PP
>> - .nf
>> -diff -up dhcp-4.3.0a1/server/dhcpd.conf.5.man dhcp-
>> 4.3.0a1/server/dhcpd.conf.5
>> ---- dhcp-4.3.0a1/server/dhcpd.conf.5.man 2013-12-13 21:49:44.000000000
>> +0100
>> -+++ dhcp-4.3.0a1/server/dhcpd.conf.5 2013-12-19 15:30:14.266670962
>> +0100
>> -@@ -527,6 +527,9 @@ pool {
>> - };
>> - .fi
>> - .PP
>> -+Dynamic BOOTP leases are not compatible with failover, and, as such,
>> -+you need to disallow BOOTP in pools that you are using failover for.
>> -+.PP
>> - The server currently does very little sanity checking, so if you
>> - configure it wrong, it will just fail in odd ways. I would recommend
>> - therefore that you either do failover or don't do failover, but don't
>> -@@ -541,9 +544,9 @@ primary server might look like this:
>> - failover peer "foo" {
>> - primary;
>> - address anthrax.rc.vix.com;
>> -- port 519;
>> -+ port 647;
>> - peer address trantor.rc.vix.com;
>> -- peer port 520;
>> -+ peer port 847;
>> - max-response-delay 60;
>> - max-unacked-updates 10;
>> - mclt 3600;
>> -@@ -1241,7 +1244,7 @@ the zone containing PTR records - for IS
>> - .PP
>> - .nf
>> - key DHCP_UPDATER {
>> -- algorithm HMAC-MD5.SIG-ALG.REG.INT;
>> -+ algorithm hmac-md5;
>> - secret pRP5FapFoJ95JEL06sv4PQ==;
>> - };
>> -
>> -@@ -1264,7 +1267,7 @@ dhcpd.conf file:
>> - .PP
>> - .nf
>> - key DHCP_UPDATER {
>> -- algorithm HMAC-MD5.SIG-ALG.REG.INT;
>> -+ algorithm hmac-md5;
>> - secret pRP5FapFoJ95JEL06sv4PQ==;
>> - };
>> -
>> -@@ -2539,7 +2542,8 @@ statement
>> - The \fInext-server\fR statement is used to specify the host address of
>> - the server from which the initial boot file (specified in the
>> - \fIfilename\fR statement) is to be loaded. \fIServer-name\fR should
>> --be a numeric IP address or a domain name.
>> -+be a numeric IP address or a domain name. If no \fInext-server\fR statement
>> -+applies to a given client, the address 0.0.0.0 is used.
>> - .RE
>> - .PP
>> - The
>> diff --git a/src/patches/dhcp/dhcp-paranoia.patch b/src/patches/dhcp/dhcp-
>> paranoia.patch
>> deleted file mode 100644
>> index 0f2db8c18..000000000
>> --- a/src/patches/dhcp/dhcp-paranoia.patch
>> +++ /dev/null
>> @@ -1,156 +0,0 @@
>> -diff -up dhcp-4.3.1b1/client/dhclient.c.dlTsyN dhcp-4.3.1b1/client/dhclient.c
>> ---- dhcp-4.3.1b1/client/dhclient.c.dlTsyN 2014-07-10
>> 17:49:49.882925843 +0200
>> -+++ dhcp-4.3.1b1/client/dhclient.c 2014-07-10 17:50:26.922402550 +0200
>> -@@ -1748,11 +1748,6 @@ int write_host (host)
>> - return 0;
>> - }
>> -
>> --void db_startup (testp)
>> -- int testp;
>> --{
>> --}
>> --
>> - void bootp (packet)
>> - struct packet *packet;
>> - {
>> -diff -up dhcp-4.3.1b1/includes/dhcpd.h.dlTsyN dhcp-4.3.1b1/includes/dhcpd.h
>> ---- dhcp-4.3.1b1/includes/dhcpd.h.dlTsyN 2014-07-10 17:48:03.798424601
>> +0200
>> -+++ dhcp-4.3.1b1/includes/dhcpd.h 2014-07-10 17:50:26.923402536 +0200
>> -@@ -2866,7 +2866,11 @@ void commit_leases_timeout (void *);
>> - void commit_leases_readerdry(void *);
>> - int commit_leases (void);
>> - int commit_leases_timed (void);
>> -+#if defined (PARANOIA)
>> -+void db_startup (int, uid_t, gid_t);
>> -+#else
>> - void db_startup (int);
>> -+#endif /* PARANOIA */
>> - int new_lease_file (void);
>> - int group_writer (struct group_object *);
>> - int write_ia(const struct ia_xx *);
>> -diff -up dhcp-4.3.1b1/server/confpars.c.dlTsyN dhcp-4.3.1b1/server/confpars.c
>> ---- dhcp-4.3.1b1/server/confpars.c.dlTsyN 2014-07-10
>> 17:39:25.801764596 +0200
>> -+++ dhcp-4.3.1b1/server/confpars.c 2014-07-10 17:50:26.924402522 +0200
>> -@@ -219,7 +219,11 @@ void trace_conf_input (trace_type_t *tty
>> - }
>> -
>> - if (!leaseconf_initialized && ttype == trace_readleases_type) {
>> -+#if defined (PARANOIA)
>> -+ db_startup (0, 0, 0);
>> -+#else
>> - db_startup (0);
>> -+#endif /* PARANOIA */
>> - leaseconf_initialized = 1;
>> - postdb_startup ();
>> - }
>> -diff -up dhcp-4.3.1b1/server/db.c.dlTsyN dhcp-4.3.1b1/server/db.c
>> ---- dhcp-4.3.1b1/server/db.c.dlTsyN 2014-07-10 17:39:25.801764596
>> +0200
>> -+++ dhcp-4.3.1b1/server/db.c 2014-07-10 17:50:26.925402508 +0200
>> -@@ -42,6 +42,10 @@ static int counting = 0;
>> - static int count = 0;
>> - TIME write_time;
>> - int lease_file_is_corrupt = 0;
>> -+#if defined (PARANOIA)
>> -+uid_t global_set_uid = 0;
>> -+gid_t global_set_gid = 0;
>> -+#endif /* PARANOIA */
>> -
>> - /* Write a single binding scope value in parsable format.
>> - */
>> -@@ -1046,8 +1050,11 @@ int commit_leases_timed()
>> - return (1);
>> - }
>> -
>> --void db_startup (testp)
>> -- int testp;
>> -+#if defined (PARANOIA)
>> -+void db_startup (int testp, uid_t set_uid, gid_t set_gid)
>> -+#else
>> -+void db_startup (int testp)
>> -+#endif /* PARANOIA */
>> - {
>> - isc_result_t status;
>> -
>> -@@ -1066,6 +1073,11 @@ void db_startup (testp)
>> - }
>> - #endif
>> -
>> -+#if defined (PARANOIA)
>> -+ global_set_uid = set_uid;
>> -+ global_set_gid = set_gid;
>> -+#endif /* PARANOIA */
>> -+
>> - #if defined (TRACING)
>> - /* If we're playing back, there is no lease file, so we can't
>> - append it, so we create one immediately (maybe this isn't
>> -@@ -1128,6 +1140,17 @@ int new_lease_file ()
>> - log_error ("Can't create new lease file: %m");
>> - return 0;
>> - }
>> -+
>> -+#if defined (PARANOIA)
>> -+ if (global_set_uid && !geteuid() &&
>> -+ global_set_gid && !getegid())
>> -+ if (fchown(db_fd, global_set_uid, global_set_gid)) {
>> -+ log_fatal ("Can't chown new lease file: %m");
>> -+ close(db_fd);
>> -+ goto fdfail;
>> -+ }
>> -+#endif /* PARANOIA */
>> -+
>> - if ((new_db_file = fdopen(db_fd, "we")) == NULL) {
>> - log_error("Can't fdopen new lease file: %m");
>> - close(db_fd);
>> -diff -up dhcp-4.3.1b1/server/dhcpd.8.dlTsyN dhcp-4.3.1b1/server/dhcpd.8
>> ---- dhcp-4.3.1b1/server/dhcpd.8.dlTsyN 2014-07-02 19:58:39.000000000
>> +0200
>> -+++ dhcp-4.3.1b1/server/dhcpd.8 2014-07-10 17:50:26.925402508 +0200
>> -@@ -82,6 +82,18 @@ dhcpd - Dynamic Host Configuration Proto
>> - .I trace-output-file
>> - ]
>> - [
>> -+.B -user
>> -+.I user
>> -+]
>> -+[
>> -+.B -group
>> -+.I group
>> -+]
>> -+[
>> -+.B -chroot
>> -+.I dir
>> -+]
>> -+[
>> - .B -play
>> - .I trace-playback-file
>> - ]
>> -@@ -269,6 +281,15 @@ lease file.
>> - .TP
>> - .BI --version
>> - Print version number and exit.
>> -+.TP
>> -+.BI \-user \ user
>> -+Setuid to user after completing privileged operations, such as creating
>> sockets that listen on privileged ports.
>> -+.TP
>> -+.BI \-group \ group
>> -+Setgid to group after completing privileged operations, such as creating
>> sockets that listen on privileged ports.
>> -+.TP
>> -+.BI \-chroot \ dir
>> -+Chroot to directory after processing the command line arguments, but before
>> reading the configuration file.
>> - .PP
>> - .I Modifying default file locations:
>> - The following options can be used to modify the locations
>> -diff -up dhcp-4.3.1b1/server/dhcpd.c.dlTsyN dhcp-4.3.1b1/server/dhcpd.c
>> ---- dhcp-4.3.1b1/server/dhcpd.c.dlTsyN 2014-07-10 17:39:25.802764582
>> +0200
>> -+++ dhcp-4.3.1b1/server/dhcpd.c 2014-07-10 17:52:35.341588248 +0200
>> -@@ -628,7 +628,11 @@ main(int argc, char **argv) {
>> - group_write_hook = group_writer;
>> -
>> - /* Start up the database... */
>> -+#if defined (PARANOIA)
>> -+ db_startup (lftest, set_uid, set_gid);
>> -+#else
>> - db_startup (lftest);
>> -+#endif /* PARANOIA */
>> -
>> - if (lftest)
>> - exit (0);
>> diff --git a/src/patches/dhcp/dhcp-paths.patch b/src/patches/dhcp/dhcp-
>> paths.patch
>> deleted file mode 100644
>> index 2f43e51fe..000000000
>> --- a/src/patches/dhcp/dhcp-paths.patch
>> +++ /dev/null
>> @@ -1,44 +0,0 @@
>> ---- expanded_org/includes/dhcpd.h Wed Aug 06 23:35:02 2014
>> -+++ expanded_patched_51_4_2_0_paths_patch/includes/dhcpd.h Mon Feb 16
>> 13:22:11 2015
>> -@@ -1424,15 +1424,15 @@
>> - #else /* !DEBUG */
>> -
>> - #ifndef _PATH_DHCPD_CONF
>> --#define _PATH_DHCPD_CONF "/etc/dhcpd.conf"
>> -+#define _PATH_DHCPD_CONF "/etc/dhcp/dhcpd.conf"
>> - #endif /* DEBUG */
>> -
>> - #ifndef _PATH_DHCPD_DB
>> --#define _PATH_DHCPD_DB LOCALSTATEDIR"/db/dhcpd.leases"
>> -+#define _PATH_DHCPD_DB LOCALSTATEDIR"/dhcpd/dhcpd.leases"
>> - #endif
>> -
>> - #ifndef _PATH_DHCPD6_DB
>> --#define _PATH_DHCPD6_DB LOCALSTATEDIR"/db/dhcpd6.leases"
>> -+#define _PATH_DHCPD6_DB LOCALSTATEDIR"/dhcpd/dhcpd6.leases"
>> - #endif
>> -
>> - #ifndef _PATH_DHCPD_PID
>> -@@ -1446,7 +1446,7 @@
>> - #endif /* DEBUG */
>> -
>> - #ifndef _PATH_DHCLIENT_CONF
>> --#define _PATH_DHCLIENT_CONF "/etc/dhclient.conf"
>> -+#define _PATH_DHCLIENT_CONF "/etc/dhcp/dhclient.conf"
>> - #endif
>> -
>> - #ifndef _PATH_DHCLIENT_SCRIPT
>> -@@ -1462,11 +1462,11 @@
>> - #endif
>> -
>> - #ifndef _PATH_DHCLIENT_DB
>> --#define _PATH_DHCLIENT_DB LOCALSTATEDIR"/db/dhclient.leases"
>> -+#define _PATH_DHCLIENT_DB LOCALSTATEDIR"/dhclient/dhclient.leases"
>> - #endif
>> -
>> - #ifndef _PATH_DHCLIENT6_DB
>> --#define _PATH_DHCLIENT6_DB LOCALSTATEDIR"/db/dhclient6.leases"
>> -+#define _PATH_DHCLIENT6_DB LOCALSTATEDIR"/dhclient/dhclient6.leases"
>> - #endif
>> -
>> - #ifndef _PATH_RESOLV_CONF
>> diff --git a/src/patches/dhcp/dhcp-release-by-ifup.patch
>> b/src/patches/dhcp/dhcp-release-by-ifup.patch
>> deleted file mode 100644
>> index 677eb5c75..000000000
>> --- a/src/patches/dhcp/dhcp-release-by-ifup.patch
>> +++ /dev/null
>> @@ -1,85 +0,0 @@
>> -diff -up dhcp-4.3.0a1/client/dhclient.c.ifup dhcp-4.3.0a1/client/dhclient.c
>> ---- dhcp-4.3.0a1/client/dhclient.c.ifup 2013-12-19 14:53:08.817760677
>> +0100
>> -+++ dhcp-4.3.0a1/client/dhclient.c 2013-12-19 15:05:16.290518574 +0100
>> -@@ -521,9 +521,81 @@ main(int argc, char **argv) {
>> - }
>> - }
>> - fclose(pidfd);
>> -+ } else {
>> -+ /* handle release for interfaces requested with Red
>> Hat
>> -+ * /sbin/ifup - pidfile will be /var/run/dhclient-
>> $interface.pid
>> -+ */
>> -+
>> -+ if ((path_dhclient_pid == NULL) ||
>> (*path_dhclient_pid == '\0'))
>> -+ path_dhclient_pid = "/var/run/dhclient.pid";
>> -+
>> -+ char *new_path_dhclient_pid;
>> -+ struct interface_info *ip;
>> -+ int pdp_len = strlen(path_dhclient_pid), pfx, dpfx;
>> -+
>> -+ /* find append point: beginning of any trailing
>> '.pid'
>> -+ * or '-$IF.pid' */
>> -+ for (pfx=pdp_len; (pfx >= 0) &&
>> (path_dhclient_pid[pfx] != '.') && (path_dhclient_pid[pfx] != '/'); pfx--);
>> -+ if (pfx == -1)
>> -+ pfx = pdp_len;
>> -+
>> -+ if (path_dhclient_pid[pfx] == '/')
>> -+ pfx += 1;
>> -+
>> -+ for (dpfx=pfx; (dpfx >= 0) &&
>> (path_dhclient_pid[dpfx] != '-') && (path_dhclient_pid[dpfx] != '/'); dpfx--);
>> -+ if ((dpfx > -1) && (path_dhclient_pid[dpfx]
>> != '/'))
>> -+ pfx = dpfx;
>> -+
>> -+ for (ip = interfaces; ip; ip = ip->next) {
>> -+ if (interfaces_requested && (ip->flags &
>> (INTERFACE_REQUESTED))) {
>> -+ int n_len = strlen(ip->name);
>> -+
>> -+ new_path_dhclient_pid = (char*)
>> malloc(pfx + n_len + 6);
>> -+ strncpy(new_path_dhclient_pid,
>> path_dhclient_pid, pfx);
>> -+ sprintf(new_path_dhclient_pid + pfx,
>> "-%s.pid", ip->name);
>> -+
>> -+ if ((pidfd =
>> fopen(new_path_dhclient_pid, "r")) != NULL) {
>> -+ e = fscanf(pidfd, "%ld\n",
>> &temp);
>> -+ oldpid = (pid_t)temp;
>> -+
>> -+ if (e != 0 && e != EOF) {
>> -+ if (oldpid) {
>> -+ if
>> (kill(oldpid, SIGTERM) == 0)
>> -+ unli
>> nk(path_dhclient_pid);
>> -+ }
>> -+ }
>> -+
>> -+ fclose(pidfd);
>> -+ }
>> -+
>> -+ free(new_path_dhclient_pid);
>> -+ }
>> -+ }
>> -+ }
>> -+ } else {
>> -+ FILE *pidfp = NULL;
>> -+ long temp = 0;
>> -+ pid_t dhcpid = 0;
>> -+ int dhc_running = 0;
>> -+ char procfn[256] = "";
>> -+
>> -+ if ((pidfp = fopen(path_dhclient_pid, "r")) != NULL) {
>> -+ if ((fscanf(pidfp, "%ld", &temp)==1) &&
>> ((dhcpid=(pid_t)temp) > 0)) {
>> -+ snprintf(procfn,256,"/proc/%u",dhcpid);
>> -+ dhc_running = (access(procfn, F_OK) == 0);
>> -+ }
>> -+
>> -+ fclose(pidfp);
>> -+ }
>> -+
>> -+ if (dhc_running) {
>> -+ log_fatal("dhclient(%u) is already running -
>> exiting. ", dhcpid);
>> -+ return(1);
>> - }
>> - }
>> -
>> -+ write_client_pid_file();
>> -+
>> - if (!quiet) {
>> - log_info("%s %s", message, PACKAGE_VERSION);
>> - log_info(copyright);
>> diff --git a/src/patches/dhcp/dhcp-remove-bind.patch b/src/patches/dhcp/dhcp-
>> remove-bind.patch
>> deleted file mode 100644
>> index 5ab0338b3..000000000
>> --- a/src/patches/dhcp/dhcp-remove-bind.patch
>> +++ /dev/null
>> @@ -1,192 +0,0 @@
>> -diff -up dhcp-4.3.1b1/client/Makefile.am.brGmwh dhcp-
>> 4.3.1b1/client/Makefile.am
>> ---- dhcp-4.3.1b1/client/Makefile.am.brGmwh 2014-07-02
>> 19:58:38.000000000 +0200
>> -+++ dhcp-4.3.1b1/client/Makefile.am 2014-07-10 17:36:30.484250976
>> +0200
>> -@@ -10,8 +10,8 @@ dhclient_SOURCES = clparse.c dhclient.c
>> - scripts/bsdos scripts/freebsd scripts/linux scripts/macos
>> \
>> - scripts/netbsd scripts/nextstep scripts/openbsd \
>> - scripts/solaris scripts/openwrt
>> --dhclient_LDADD = ../common/libdhcp.a ../omapip/libomapi.a
>> ../bind/lib/libirs.a \
>> -- ../bind/lib/libdns.a ../bind/lib/libisccfg.a
>> ../bind/lib/libisc.a
>> -+dhclient_LDADD = ../common/libdhcp.a ../omapip/libomapi.a \
>> -+ $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
>> - man_MANS = dhclient.8 dhclient-script.8 dhclient.conf.5 dhclient.leases.5
>> - EXTRA_DIST = $(man_MANS)
>> -
>> -diff -up dhcp-4.3.1b1/common/tests/Makefile.am.brGmwh dhcp-
>> 4.3.1b1/common/tests/Makefile.am
>> ---- dhcp-4.3.1b1/common/tests/Makefile.am.brGmwh 2014-07-10
>> 17:36:30.485250962 +0200
>> -+++ dhcp-4.3.1b1/common/tests/Makefile.am 2014-07-10
>> 17:38:04.010924566 +0200
>> -@@ -13,21 +13,20 @@ ATF_TESTS += alloc_unittest dns_unittest
>> - alloc_unittest_SOURCES = test_alloc.c $(top_srcdir)/tests/t_api_dhcp.c
>> - alloc_unittest_LDADD = $(ATF_LDFLAGS)
>> - alloc_unittest_LDADD += ../libdhcp.a \
>> -- ../../omapip/libomapi.a ../../bind/lib/libirs.a \
>> -- ../../bind/lib/libdns.a
>> ../../bind/lib/libisccfg.a ../../bind/lib/libisc.a
>> -+ ../../omapip/libomapi.a \
>> -+ $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
>> -
>> - dns_unittest_SOURCES = dns_unittest.c $(top_srcdir)/tests/t_api_dhcp.c
>> - dns_unittest_LDADD = $(ATF_LDFLAGS)
>> - dns_unittest_LDADD += ../libdhcp.a \
>> -- ../../omapip/libomapi.a ../../bind/lib/libirs.a \
>> -- ../../bind/lib/libdns.a
>> ../../bind/lib/libisccfg.a ../../bind/lib/libisc.a
>> -+ ../../omapip/libomapi.a \
>> -+ $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
>> -
>> - misc_unittest_SOURCES = misc_unittest.c $(top_srcdir)/tests/t_api_dhcp.c
>> - misc_unittest_LDADD = $(ATF_LDFLAGS)
>> - misc_unittest_LDADD += ../libdhcp.a \
>> -- ../../omapip/libomapi.a ../../bind/lib/libirs.a \
>> -- ../../bind/lib/libdns.a
>> ../../bind/lib/libisccfg.a ../../bind/lib/libisc.a
>> --
>> -+ ../../omapip/libomapi.a \
>> -+ $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
>> - check: $(ATF_TESTS)
>> - atf-run | atf-report
>> -
>> -diff -up dhcp-4.3.1b1/configure.ac.brGmwh dhcp-4.3.1b1/configure.ac
>> ---- dhcp-4.3.1b1/configure.ac.brGmwh 2014-07-02 20:01:26.000000000
>> +0200
>> -+++ dhcp-4.3.1b1/configure.ac 2014-07-10 17:36:30.485250962 +0200
>> -@@ -562,20 +562,37 @@ AC_CHECK_MEMBER(struct msghdr.msg_contro
>> -
>> - libbind=
>> - AC_ARG_WITH(libbind,
>> -- AS_HELP_STRING([--with-libbind=PATH],[bind includes and libraries
>> are in PATH
>> -- (default is ./bind)]),
>> -+ AS_HELP_STRING([--with-libbind=PATH],[bind includes are in PATH
>> -+ (default is ./bind/includes)]),
>> - use_libbind="$withval", use_libbind="no")
>> - case "$use_libbind" in
>> -+yes|no)
>> -+ libbind="\${top_srcdir}/bind/include"
>> -+ ;;
>> -+*)
>> -+ libbind="$use_libbind"
>> -+ ;;
>> -+esac
>> -+
>> -+BIND9_LIBDIR='-L$(top_builddir)/bind/lib'
>> -+AC_ARG_WITH(libbind-libs,
>> -+ AC_HELP_STRING([--with-libbind-libs=PATH],
>> -+ [bind9 export libraries are in PATH]),
>> -+ [libbind_libs="$withval"], [libbind_libs='no'])
>> -+case "$libbind_libs" in
>> - yes)
>> -- libbind="\${top_srcdir}/bind"
>> -+ AC_MSG_ERROR([Specify path to bind9 libraries])
>> - ;;
>> - no)
>> -- libbind="\${top_srcdir}/bind"
>> -+ BUNDLED_BIND=yes
>> - ;;
>> - *)
>> -- libbind="$use_libbind"
>> -+ BIND9_LIBDIR="-L$libbind_libs"
>> -+ BUNDLED_BIND=no
>> - ;;
>> - esac
>> -+AM_CONDITIONAL([BUNDLED_BIND], [test "$BUNDLED_BIND" = yes])
>> -+AC_SUBST([BIND9_LIBDIR])
>> -
>> - # OpenLDAP support.
>> - AC_ARG_WITH(ldap,
>> -@@ -610,7 +627,7 @@ fi
>> - CFLAGS="$CFLAGS $STD_CWARNINGS"
>> -
>> - # Try to add the bind include directory
>> --CFLAGS="$CFLAGS -I$libbind/include"
>> -+CFLAGS="$CFLAGS -I$libbind"
>> -
>> - case "$host" in
>> - *-darwin*)
>> -diff -up dhcp-4.3.1b1/dhcpctl/Makefile.am.brGmwh dhcp-
>> 4.3.1b1/dhcpctl/Makefile.am
>> ---- dhcp-4.3.1b1/dhcpctl/Makefile.am.brGmwh 2014-07-02
>> 19:58:38.000000000 +0200
>> -+++ dhcp-4.3.1b1/dhcpctl/Makefile.am 2014-07-10 17:36:30.485250962
>> +0200
>> -@@ -6,12 +6,9 @@ EXTRA_DIST = $(man_MANS)
>> -
>> - omshell_SOURCES = omshell.c
>> - omshell_LDADD = libdhcpctl.a ../common/libdhcp.a ../omapip/libomapi.a \
>> -- ../bind/lib/libirs.a ../bind/lib/libdns.a \
>> -- ../bind/lib/libisccfg.a ../bind/lib/libisc.a
>> --
>> -+ $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
>> - libdhcpctl_a_SOURCES = dhcpctl.c callback.c remote.c
>> -
>> - cltest_SOURCES = cltest.c
>> - cltest_LDADD = libdhcpctl.a ../common/libdhcp.a ../omapip/libomapi.a \
>> -- ../bind/lib/libirs.a ../bind/lib/libdns.a \
>> -- ../bind/lib/libisccfg.a ../bind/lib/libisc.a
>> -+ $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
>> -diff -up dhcp-4.3.1b1/Makefile.am.brGmwh dhcp-4.3.1b1/Makefile.am
>> ---- dhcp-4.3.1b1/Makefile.am.brGmwh 2014-07-02 19:58:38.000000000
>> +0200
>> -+++ dhcp-4.3.1b1/Makefile.am 2014-07-10 17:36:30.484250976 +0200
>> -@@ -25,7 +25,13 @@ EXTRA_DIST = RELNOTES LICENSE \
>> - bind/Makefile bind/bind.tar.gz bind/version.tmp \
>> - common/tests/Atffile server/tests/Atffile
>> -
>> --SUBDIRS = bind includes tests common dst omapip client dhcpctl relay server
>> -+if BUNDLED_BIND
>> -+SUBDIRS = bind
>> -+else
>> -+SUBDIRS =
>> -+endif
>> -+
>> -+SUBDIRS += includes tests common dst omapip client dhcpctl relay server
>> -
>> - nobase_include_HEADERS = dhcpctl/dhcpctl.h
>> -
>> -diff -up dhcp-4.3.1b1/omapip/Makefile.am.brGmwh dhcp-
>> 4.3.1b1/omapip/Makefile.am
>> ---- dhcp-4.3.1b1/omapip/Makefile.am.brGmwh 2014-07-02
>> 19:58:39.000000000 +0200
>> -+++ dhcp-4.3.1b1/omapip/Makefile.am 2014-07-10 17:36:30.486250948
>> +0200
>> -@@ -10,6 +10,5 @@ man_MANS = omapi.3
>> - EXTRA_DIST = $(man_MANS)
>> -
>> - svtest_SOURCES = test.c
>> --svtest_LDADD = libomapi.a ../bind/lib/libirs.a ../bind/lib/libdns.a \
>> -- ../bind/lib/libisccfg.a ../bind/lib/libisc.a
>> --
>> -+svtest_LDADD = libomapi.a \
>> -+ $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
>> -diff -up dhcp-4.3.1b1/relay/Makefile.am.brGmwh dhcp-4.3.1b1/relay/Makefile.am
>> ---- dhcp-4.3.1b1/relay/Makefile.am.brGmwh 2014-07-02
>> 19:58:39.000000000 +0200
>> -+++ dhcp-4.3.1b1/relay/Makefile.am 2014-07-10 17:36:30.486250948 +0200
>> -@@ -3,8 +3,7 @@ AM_CPPFLAGS = -DLOCALSTATEDIR='"@localst
>> - sbin_PROGRAMS = dhcrelay
>> - dhcrelay_SOURCES = dhcrelay.c
>> - dhcrelay_LDADD = ../common/libdhcp.a ../omapip/libomapi.a \
>> -- ../bind/lib/libirs.a ../bind/lib/libdns.a \
>> -- ../bind/lib/libisccfg.a ../bind/lib/libisc.a
>> -+ $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
>> - man_MANS = dhcrelay.8
>> - EXTRA_DIST = $(man_MANS)
>> -
>> -diff -up dhcp-4.3.1b1/server/Makefile.am.brGmwh dhcp-
>> 4.3.1b1/server/Makefile.am
>> ---- dhcp-4.3.1b1/server/Makefile.am.brGmwh 2014-07-02
>> 19:58:39.000000000 +0200
>> -+++ dhcp-4.3.1b1/server/Makefile.am 2014-07-10 17:36:30.486250948
>> +0200
>> -@@ -13,10 +13,8 @@ dhcpd_SOURCES = dhcpd.c dhcp.c bootp.c c
>> - dhcpv6.c mdb6.c ldap.c ldap_casa.c
>> -
>> - dhcpd_CFLAGS = $(LDAP_CFLAGS)
>> --dhcpd_LDADD = ../common/libdhcp.a ../omapip/libomapi.a \
>> -- ../dhcpctl/libdhcpctl.a ../bind/lib/libirs.a \
>> -- ../bind/lib/libdns.a ../bind/lib/libisccfg.a
>> ../bind/lib/libisc.a
>> --
>> -+dhcpd_LDADD = ../common/libdhcp.a ../omapip/libomapi.a
>> ../dhcpctl/libdhcpctl.a \
>> -+ $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
>> - man_MANS = dhcpd.8 dhcpd.conf.5 dhcpd.leases.5
>> - EXTRA_DIST = $(man_MANS)
>> -
>> -diff -up dhcp-4.3.1b1/server/tests/Makefile.am.brGmwh dhcp-
>> 4.3.1b1/server/tests/Makefile.am
>> ---- dhcp-4.3.1b1/server/tests/Makefile.am.brGmwh 2014-07-02
>> 19:58:40.000000000 +0200
>> -+++ dhcp-4.3.1b1/server/tests/Makefile.am 2014-07-10
>> 17:36:30.486250948 +0200
>> -@@ -18,9 +18,8 @@ DHCPSRC = ../dhcp.c ../bootp.c ../confpa
>> - ../ldap.c ../ldap_casa.c ../dhcpd.c
>> -
>> - DHCPLIBS = $(top_builddir)/common/libdhcp.a
>> $(top_builddir)/omapip/libomapi.a \
>> -- $(top_builddir)/dhcpctl/libdhcpctl.a
>> $(top_builddir)/bind/lib/libirs.a \
>> -- $(top_builddir)/bind/lib/libdns.a
>> $(top_builddir)/bind/lib/libisccfg.a \
>> -- $(top_builddir)/bind/lib/libisc.a
>> -+ $(top_builddir)/dhcpctl/libdhcpctl.a \
>> -+ $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
>> -
>> - ATF_TESTS =
>> - TESTS =
>> diff --git a/src/patches/dhcp/dhcp-rfc3442-classless-static-routes.patch
>> b/src/patches/dhcp/dhcp-rfc3442-classless-static-routes.patch
>> deleted file mode 100644
>> index 94ed5ba24..000000000
>> --- a/src/patches/dhcp/dhcp-rfc3442-classless-static-routes.patch
>> +++ /dev/null
>> @@ -1,405 +0,0 @@
>> -diff -up dhcp-4.3.0rc1/client/clparse.c.rfc3442 dhcp-
>> 4.3.0rc1/client/clparse.c
>> ---- dhcp-4.3.0rc1/client/clparse.c.rfc3442 2014-01-29
>> 10:05:48.474400352 +0100
>> -+++ dhcp-4.3.0rc1/client/clparse.c 2014-01-29 10:05:48.517399955 +0100
>> -@@ -31,7 +31,7 @@
>> -
>> - struct client_config top_level_config;
>> -
>> --#define NUM_DEFAULT_REQUESTED_OPTS 14
>> -+#define NUM_DEFAULT_REQUESTED_OPTS 15
>> - struct option *default_requested_options[NUM_DEFAULT_REQUESTED_OPTS + 1];
>> -
>> - static void parse_client_default_duid(struct parse *cfile);
>> -@@ -84,7 +84,11 @@ isc_result_t read_client_conf ()
>> - dhcp_universe.code_hash, &code, 0, MDL);
>> -
>> - /* 4 */
>> -- code = DHO_ROUTERS;
>> -+ /* The Classless Static Routes option code MUST appear in the
>> parameter
>> -+ * request list prior to both the Router option code and the Static
>> -+ * Routes option code, if present. (RFC3442)
>> -+ */
>> -+ code = DHO_CLASSLESS_STATIC_ROUTES;
>> - option_code_hash_lookup(&default_requested_options[3],
>> - dhcp_universe.code_hash, &code, 0, MDL);
>> -
>> -@@ -138,6 +142,11 @@ isc_result_t read_client_conf ()
>> - option_code_hash_lookup(&default_requested_options[13],
>> - dhcp_universe.code_hash, &code, 0, MDL);
>> -
>> -+ /* 15 */
>> -+ code = DHO_ROUTERS;
>> -+ option_code_hash_lookup(&default_requested_options[14],
>> -+ dhcp_universe.code_hash, &code, 0, MDL);
>> -+
>> - for (code = 0 ; code < NUM_DEFAULT_REQUESTED_OPTS ; code++) {
>> - if (default_requested_options[code] == NULL)
>> - log_fatal("Unable to find option definition for "
>> -diff -up dhcp-4.3.0rc1/common/dhcp-options.5.rfc3442 dhcp-
>> 4.3.0rc1/common/dhcp-options.5
>> ---- dhcp-4.3.0rc1/common/dhcp-options.5.rfc3442 2014-01-29
>> 10:05:48.466400426 +0100
>> -+++ dhcp-4.3.0rc1/common/dhcp-options.5 2014-01-29 10:05:48.518399945
>> +0100
>> -@@ -111,6 +111,26 @@ hexadecimal, separated by colons. For e
>> - or
>> - option dhcp-client-identifier 43:4c:49:45:54:2d:46:4f:4f;
>> - .fi
>> -+.PP
>> -+The
>> -+.B destination-descriptor
>> -+describe the IP subnet number and subnet mask
>> -+of a particular destination using a compact encoding. This encoding
>> -+consists of one octet describing the width of the subnet mask,
>> -+followed by all the significant octets of the subnet number.
>> -+The following table contains some examples of how various subnet
>> -+number/mask combinations can be encoded:
>> -+.nf
>> -+.sp 1
>> -+Subnet number Subnet mask Destination descriptor
>> -+0 0 0
>> -+10.0.0.0 255.0.0.0 8.10
>> -+10.0.0.0 255.255.255.0 24.10.0.0
>> -+10.17.0.0 255.255.0.0 16.10.17
>> -+10.27.129.0 255.255.255.0 24.10.27.129
>> -+10.229.0.128 255.255.255.128 25.10.229.0.128
>> -+10.198.122.47 255.255.255.255 32.10.198.122.47
>> -+.fi
>> - .SH SETTING OPTION VALUES USING EXPRESSIONS
>> - Sometimes it's helpful to be able to set the value of a DHCP option
>> - based on some value that the client has sent. To do this, you can
>> -@@ -972,6 +992,29 @@ dhclient-script will create routes:
>> - .RE
>> - .PP
>> - .nf
>> -+.B option \fBclassless-static-routes\fR \fIdestination-descriptor ip-
>> address\fR
>> -+ [\fB,\fR \fIdestination-descriptor ip-
>> address\fR...]\fB;\fR
>> -+.fi
>> -+.RS 0.25i
>> -+.PP
>> -+This option (see RFC3442) specifies a list of classless static routes
>> -+that the client should install in its routing cache.
>> -+.PP
>> -+This option can contain one or more static routes, each of which
>> -+consists of a destination descriptor and the IP address of the router
>> -+that should be used to reach that destination.
>> -+.PP
>> -+Many clients may not implement the Classless Static Routes option.
>> -+DHCP server administrators should therefore configure their DHCP
>> -+servers to send both a Router option and a Classless Static Routes
>> -+option, and should specify the default router(s) both in the Router
>> -+option and in the Classless Static Routes option.
>> -+.PP
>> -+If the DHCP server returns both a Classless Static Routes option and
>> -+a Router option, the DHCP client ignores the Router option.
>> -+.RE
>> -+.PP
>> -+.nf
>> - .B option \fBstreettalk-directory-assistance-server\fR \fIip-address\fR
>> - [\fB,\fR \fIip-
>> address\fR...]\fB;\fR
>> - .fi
>> -diff -up dhcp-4.3.0rc1/common/inet.c.rfc3442 dhcp-4.3.0rc1/common/inet.c
>> ---- dhcp-4.3.0rc1/common/inet.c.rfc3442 2014-01-26 19:40:44.000000000
>> +0100
>> -+++ dhcp-4.3.0rc1/common/inet.c 2014-01-29 10:05:48.519399936 +0100
>> -@@ -521,6 +521,60 @@ free_iaddrcidrnetlist(struct iaddrcidrne
>> - return ISC_R_SUCCESS;
>> - }
>> -
>> -+static const char *
>> -+inet_ntopdd(const unsigned char *src, unsigned srclen, char *dst, size_t
>> size)
>> -+{
>> -+ char tmp[sizeof("32.255.255.255.255")];
>> -+ int len;
>> -+
>> -+ switch (srclen) {
>> -+ case 2:
>> -+ len = sprintf (tmp, "%u.%u", src[0], src[1]);
>> -+ break;
>> -+ case 3:
>> -+ len = sprintf (tmp, "%u.%u.%u", src[0], src[1],
>> src[2]);
>> -+ break;
>> -+ case 4:
>> -+ len = sprintf (tmp, "%u.%u.%u.%u", src[0], src[1],
>> src[2], src[3]);
>> -+ break;
>> -+ case 5:
>> -+ len = sprintf (tmp, "%u.%u.%u.%u.%u", src[0],
>> src[1], src[2], src[3], src[4]);
>> -+ break;
>> -+ default:
>> -+ return NULL;
>> -+ }
>> -+ if (len < 0)
>> -+ return NULL;
>> -+
>> -+ if (len > size) {
>> -+ errno = ENOSPC;
>> -+ return NULL;
>> -+ }
>> -+
>> -+ return strcpy (dst, tmp);
>> -+}
>> -+
>> -+/* pdestdesc() turns an iaddr structure into a printable dest. descriptor */
>> -+const char *
>> -+pdestdesc(const struct iaddr addr) {
>> -+ static char pbuf[sizeof("255.255.255.255.255")];
>> -+
>> -+ if (addr.len == 0) {
>> -+ return "<null destination descriptor>";
>> -+ }
>> -+ if (addr.len == 1) {
>> -+ return "0";
>> -+ }
>> -+ if ((addr.len >= 2) && (addr.len <= 5)) {
>> -+ return inet_ntopdd(addr.iabuf, addr.len, pbuf,
>> sizeof(pbuf));
>> -+ }
>> -+
>> -+ log_fatal("pdestdesc():%s:%d: Invalid destination descriptor length
>> %d.",
>> -+ MDL, addr.len);
>> -+ /* quell compiler warnings */
>> -+ return NULL;
>> -+}
>> -+
>> - /* piaddr() turns an iaddr structure into a printable address. */
>> - /* XXX: should use a const pointer rather than passing the structure */
>> - const char *
>> -diff -up dhcp-4.3.0rc1/common/options.c.rfc3442 dhcp-
>> 4.3.0rc1/common/options.c
>> ---- dhcp-4.3.0rc1/common/options.c.rfc3442 2014-01-26
>> 19:40:44.000000000 +0100
>> -+++ dhcp-4.3.0rc1/common/options.c 2014-01-29 10:05:48.520399927 +0100
>> -@@ -707,7 +707,11 @@ cons_options(struct packet *inpacket, st
>> - * packet.
>> - */
>> - priority_list[priority_len++] = DHO_SUBNET_MASK;
>> -- priority_list[priority_len++] = DHO_ROUTERS;
>> -+ if (lookup_option(&dhcp_universe, cfg_options,
>> -+ DHO_CLASSLESS_STATIC
>> _ROUTES))
>> -+ priority_list[priority_len++] =
>> DHO_CLASSLESS_STATIC_ROUTES;
>> -+ else
>> -+ priority_list[priority_len++] = DHO_ROUTERS;
>> - priority_list[priority_len++] = DHO_DOMAIN_NAME_SERVERS;
>> - priority_list[priority_len++] = DHO_HOST_NAME;
>> - priority_list[priority_len++] = DHO_FQDN;
>> -@@ -1688,6 +1692,7 @@ const char *pretty_print_option (option,
>> - unsigned long tval;
>> - isc_boolean_t a_array = ISC_FALSE;
>> - int len_used;
>> -+ unsigned int octets = 0;
>> -
>> - if (emit_commas)
>> - comma = ',';
>> -@@ -1696,6 +1701,7 @@ const char *pretty_print_option (option,
>> -
>> - memset (enumbuf, 0, sizeof enumbuf);
>> -
>> -+ if (option->format[0] != 'R') { /* see explanation lower */
>> - /* Figure out the size of the data. */
>> - for (l = i = 0; option -> format [i]; i++, l++) {
>> - if (l >= sizeof(fmtbuf) - 1)
>> -@@ -1870,6 +1876,33 @@ const char *pretty_print_option (option,
>> - if (numhunk < 0)
>> - numhunk = 1;
>> -
>> -+ } else { /* option->format[i] == 'R') */
>> -+ /* R (destination descriptor) has variable length.
>> -+ * We can find it only in classless static route option,
>> -+ * so we are for sure parsing classless static route option
>> now.
>> -+ * We go through whole the option to check whether there are
>> no
>> -+ * missing/extra bytes.
>> -+ * I didn't find out how to improve the existing code and
>> that's the
>> -+ * reason for this separate 'else' where I do my own
>> checkings.
>> -+ * I know it's little bit unsystematic, but it works.
>> -+ */
>> -+ numhunk = 0;
>> -+ numelem = 2; /* RI */
>> -+ fmtbuf[0]='R'; fmtbuf[1]='I'; fmtbuf[2]=0;
>> -+ for (i =0; i < len; i = i + octets + 5) {
>> -+ if (data[i] > 32) { /* subnet mask width */
>> -+ log_error ("wrong subnet mask width in
>> destination descriptor");
>> -+ break;
>> -+ }
>> -+ numhunk++;
>> -+ octets = ((data[i]+7) / 8);
>> -+ }
>> -+ if (i != len) {
>> -+ log_error ("classless static routes option has wrong
>> size or "
>> -+ "there's some garbage in
>> format");
>> -+ }
>> -+ }
>> -+
>> - /* Cycle through the array (or hunk) printing the data. */
>> - for (i = 0; i < numhunk; i++) {
>> - if ((a_array == ISC_TRUE) && (i != 0) && (numelem > 0)) {
>> -@@ -2025,6 +2058,20 @@ const char *pretty_print_option (option,
>> - strcpy(op, piaddr(iaddr));
>> - dp += 4;
>> - break;
>> -+
>> -+ case 'R':
>> -+ if (dp[0] <= 32)
>> -+ iaddr.len = (((dp[0]+7)/8)+1);
>> -+ else {
>> -+ log_error ("wrong subnet mask width
>> in destination descriptor");
>> -+ return "<error>";
>> -+ }
>> -+
>> -+ memcpy(iaddr.iabuf, dp, iaddr.len);
>> -+ strcpy(op, pdestdesc(iaddr));
>> -+ dp += iaddr.len;
>> -+ break;
>> -+
>> - case '6':
>> - iaddr.len = 16;
>> - memcpy(iaddr.iabuf, dp, 16);
>> -diff -up dhcp-4.3.0rc1/common/parse.c.rfc3442 dhcp-4.3.0rc1/common/parse.c
>> ---- dhcp-4.3.0rc1/common/parse.c.rfc3442 2014-01-29 10:05:48.491400195
>> +0100
>> -+++ dhcp-4.3.0rc1/common/parse.c 2014-01-29 10:05:48.522399908 +0100
>> -@@ -335,6 +335,39 @@ int parse_ip_addr (cfile, addr)
>> - }
>> -
>> - /*
>> -+ * destination-descriptor :== NUMBER DOT NUMBER |
>> -+ * NUMBER DOT NUMBER DOT NUMBER |
>> -+ * NUMBER DOT NUMBER DOT NUMBER DOT NUMBER |
>> -+ * NUMBER DOT NUMBER DOT NUMBER DOT NUMBER DOT
>> NUMBER
>> -+ */
>> -+
>> -+int parse_destination_descriptor (cfile, addr)
>> -+ struct parse *cfile;
>> -+ struct iaddr *addr;
>> -+{
>> -+ unsigned int mask_width, dest_dest_len;
>> -+ addr -> len = 0;
>> -+ if (parse_numeric_aggregate (cfile, addr -> iabuf,
>> -+ &ad
>> dr -> len, DOT, 10, 8)) {
>> -+ mask_width = (unsigned int)addr->iabuf[0];
>> -+ dest_dest_len = (((mask_width+7)/8)+1);
>> -+ if (mask_width > 32) {
>> -+ parse_warn (cfile,
>> -+ "subnet mask width (%u) greater than 32.",
>> mask_width);
>> -+ }
>> -+ else if (dest_dest_len != addr->len) {
>> -+ parse_warn (cfile,
>> -+ "destination descriptor with subnet mask
>> width %u "
>> -+ "should have %u octets, but has %u octets.",
>> -+ mask_width, dest_dest_len, addr->len);
>> -+ }
>> -+
>> -+ return 1;
>> -+ }
>> -+ return 0;
>> -+}
>> -+
>> -+/*
>> - * Return true if every character in the string is hexadecimal.
>> - */
>> - static int
>> -@@ -713,8 +746,10 @@ unsigned char *parse_numeric_aggregate (
>> - if (count) {
>> - token = peek_token (&val, (unsigned *)0, cfile);
>> - if (token != separator) {
>> -- if (!*max)
>> -+ if (!*max) {
>> -+ *max = count;
>> - break;
>> -+ }
>> - if (token != RBRACE && token != LBRACE)
>> - token = next_token (&val,
>> - (unsigned *)0,
>> -@@ -1654,6 +1689,9 @@ int parse_option_code_definition (cfile,
>> - case IP_ADDRESS:
>> - type = 'I';
>> - break;
>> -+ case DESTINATION_DESCRIPTOR:
>> -+ type = 'R';
>> -+ break;
>> - case IP6_ADDRESS:
>> - type = '6';
>> - break;
>> -@@ -5071,6 +5109,15 @@ int parse_option_token (rv, cfile, fmt,
>> - }
>> - break;
>> -
>> -+ case 'R': /* destination descriptor */
>> -+ if (!parse_destination_descriptor (cfile, &addr)) {
>> -+ return 0;
>> -+ }
>> -+ if (!make_const_data (&t, addr.iabuf, addr.len, 0, 1, MDL))
>> {
>> -+ return 0;
>> -+ }
>> -+ break;
>> -+
>> - case '6': /* IPv6 address. */
>> - if (!parse_ip6_addr(cfile, &addr)) {
>> - return 0;
>> -@@ -5348,6 +5395,13 @@ int parse_option_decl (oc, cfile)
>> - goto exit;
>> - len = ip_addr.len;
>> - dp = ip_addr.iabuf;
>> -+ goto alloc;
>> -+
>> -+ case 'R': /* destination descriptor */
>> -+ if (!parse_destination_descriptor (cfile,
>> &ip_addr))
>> -+ goto exit;
>> -+ len = ip_addr.len;
>> -+ dp = ip_addr.iabuf;
>> -
>> - alloc:
>> - if (hunkix + len > sizeof hunkbuf) {
>> -diff -up dhcp-4.3.0rc1/common/tables.c.rfc3442 dhcp-4.3.0rc1/common/tables.c
>> ---- dhcp-4.3.0rc1/common/tables.c.rfc3442 2014-01-29
>> 10:05:48.485400250 +0100
>> -+++ dhcp-4.3.0rc1/common/tables.c 2014-01-29 10:06:25.724038563 +0100
>> -@@ -46,6 +46,7 @@ HASH_FUNCTIONS (option_code, const unsig
>> - Format codes:
>> -
>> - I - IPv4 address
>> -+ R - destination descriptor (RFC3442)
>> - 6 - IPv6 address
>> - l - 32-bit signed integer
>> - L - 32-bit unsigned integer
>> -@@ -214,6 +215,7 @@ static struct option dhcp_options[] = {
>> - #endif
>> - { "subnet-selection", "I", &dhcp_universe, 118, 1 },
>> - { "domain-search", "D", &dhcp_universe, 119,
>> 1 },
>> -+ { "classless-static-routes", "RIA", &dhcp_universe, 121, 1 },
>> - { "vivco", "Evendor-class.", &dhcp_universe, 124, 1
>> },
>> - { "vivso", "Evendor.", &dhcp_universe, 125, 1
>> },
>> - #if 0
>> -diff -up dhcp-4.3.0rc1/includes/dhcpd.h.rfc3442 dhcp-
>> 4.3.0rc1/includes/dhcpd.h
>> ---- dhcp-4.3.0rc1/includes/dhcpd.h.rfc3442 2014-01-29
>> 10:05:48.470400389 +0100
>> -+++ dhcp-4.3.0rc1/includes/dhcpd.h 2014-01-29 10:05:48.525399881 +0100
>> -@@ -2725,6 +2725,7 @@ isc_result_t range2cidr(struct iaddrcidr
>> - const struct iaddr *lo, const struct iaddr *hi);
>> - isc_result_t free_iaddrcidrnetlist(struct iaddrcidrnetlist **result);
>> - const char *piaddr (struct iaddr);
>> -+const char *pdestdesc (struct iaddr);
>> - char *piaddrmask(struct iaddr *, struct iaddr *);
>> - char *piaddrcidr(const struct iaddr *, unsigned int);
>> - u_int16_t validate_port(char *);
>> -@@ -2934,6 +2935,7 @@ void parse_client_lease_declaration (str
>> - int parse_option_decl (struct option_cache **, struct parse *);
>> - void parse_string_list (struct parse *, struct string_list **, int);
>> - int parse_ip_addr (struct parse *, struct iaddr *);
>> -+int parse_destination_descriptor (struct parse *, struct iaddr *);
>> - int parse_ip_addr_with_subnet(struct parse *, struct iaddrmatch *);
>> - void parse_reject_statement (struct parse *, struct client_config *);
>> -
>> -diff -up dhcp-4.3.0rc1/includes/dhcp.h.rfc3442 dhcp-4.3.0rc1/includes/dhcp.h
>> ---- dhcp-4.3.0rc1/includes/dhcp.h.rfc3442 2014-01-26
>> 19:40:44.000000000 +0100
>> -+++ dhcp-4.3.0rc1/includes/dhcp.h 2014-01-29 10:05:48.524399890 +0100
>> -@@ -159,6 +159,7 @@ struct dhcp_packet {
>> - #define DHO_ASSOCIATED_IP 92
>> - #define DHO_SUBNET_SELECTION 118 /* RFC3011! */
>> - #define DHO_DOMAIN_SEARCH 119 /* RFC3397 */
>> -+#define DHO_CLASSLESS_STATIC_ROUTES 121 /* RFC3442 */
>> - #define DHO_VIVCO_SUBOPTIONS 124
>> - #define DHO_VIVSO_SUBOPTIONS 125
>> -
>> -diff -up dhcp-4.3.0rc1/includes/dhctoken.h.rfc3442 dhcp-
>> 4.3.0rc1/includes/dhctoken.h
>> ---- dhcp-4.3.0rc1/includes/dhctoken.h.rfc3442 2014-01-29
>> 10:05:48.435400713 +0100
>> -+++ dhcp-4.3.0rc1/includes/dhctoken.h 2014-01-29 10:05:48.526399871
>> +0100
>> -@@ -368,7 +368,8 @@ enum dhcp_token {
>> - POOL6 = 669,
>> - V6RELAY = 670,
>> - V6RELOPT = 671,
>> -- BOOTP_BROADCAST_ALWAYS = 672
>> -+ BOOTP_BROADCAST_ALWAYS = 672,
>> -+ DESTINATION_DESCRIPTOR = 673
>> - };
>> -
>> - #define is_identifier(x) ((x) >= FIRST_TOKEN && \
>> diff --git a/src/patches/dhcp/dhcp-sendDecline.patch b/src/patches/dhcp/dhcp-
>> sendDecline.patch
>> deleted file mode 100644
>> index e68336634..000000000
>> --- a/src/patches/dhcp/dhcp-sendDecline.patch
>> +++ /dev/null
>> @@ -1,231 +0,0 @@
>> -diff -up dhcp-4.3.0a1/client/dhc6.c.sendDecline dhcp-4.3.0a1/client/dhc6.c
>> ---- dhcp-4.3.0a1/client/dhc6.c.sendDecline 2013-12-11
>> 01:25:12.000000000 +0100
>> -+++ dhcp-4.3.0a1/client/dhc6.c 2013-12-19 15:56:18.297660118 +0100
>> -@@ -96,6 +96,8 @@ void do_select6(void *input);
>> - void do_refresh6(void *input);
>> - static void do_release6(void *input);
>> - static void start_bound(struct client_state *client);
>> -+static void start_decline6(struct client_state *client);
>> -+static void do_decline6(void *input);
>> - static void start_informed(struct client_state *client);
>> - void informed_handler(struct packet *packet, struct client_state *client);
>> - void bound_handler(struct packet *packet, struct client_state *client);
>> -@@ -2017,6 +2019,7 @@ start_release6(struct client_state *clie
>> - cancel_timeout(do_select6, client);
>> - cancel_timeout(do_refresh6, client);
>> - cancel_timeout(do_release6, client);
>> -+ cancel_timeout(do_decline6, client);
>> - client->state = S_STOPPED;
>> -
>> - /*
>> -@@ -2650,6 +2653,7 @@ dhc6_check_reply(struct client_state *cl
>> - break;
>> -
>> - case S_STOPPED:
>> -+ case S_DECLINED:
>> - action = dhc6_stop_action;
>> - break;
>> -
>> -@@ -2751,6 +2755,7 @@ dhc6_check_reply(struct client_state *cl
>> - break;
>> -
>> - case S_STOPPED:
>> -+ case S_DECLINED:
>> - /* Nothing critical to do at this stage. */
>> - break;
>> -
>> -@@ -3741,17 +3746,23 @@ reply_handler(struct packet *packet, str
>> - cancel_timeout(do_select6, client);
>> - cancel_timeout(do_refresh6, client);
>> - cancel_timeout(do_release6, client);
>> -+ cancel_timeout(do_decline6, client);
>> -
>> - /* If this is in response to a Release/Decline, clean up and return.
>> */
>> -- if (client->state == S_STOPPED) {
>> -- if (client->active_lease == NULL)
>> -- return;
>> -+ if ((client->state == S_STOPPED) ||
>> -+ (client->state == S_DECLINED)) {
>> -+
>> -+ if (client->active_lease != NULL) {
>> -+ dhc6_lease_destroy(&client->active_lease, MDL);
>> -+ client->active_lease = NULL;
>> -+ /* We should never wait for nothing!? */
>> -+ if (stopping_finished())
>> -+ exit(0);
>> -+ }
>> -+
>> -+ if (client->state == S_DECLINED)
>> -+ start_init6(client);
>> -
>> -- dhc6_lease_destroy(&client->active_lease, MDL);
>> -- client->active_lease = NULL;
>> -- /* We should never wait for nothing!? */
>> -- if (stopping_finished())
>> -- exit(0);
>> - return;
>> - }
>> -
>> -@@ -4279,7 +4290,11 @@ start_bound(struct client_state *client)
>> - dhc6_marshall_values("new_", client, lease, ia,
>> addr);
>> - script_write_requested6(client);
>> -
>> -- script_go(client);
>> -+ // when script returns 3, DAD failed
>> -+ if (script_go(client) == 3) {
>> -+ start_decline6(client);
>> -+ return;
>> -+ }
>> - }
>> -
>> - /* XXX: maybe we should loop on the old values instead? */
>> -@@ -4327,6 +4342,149 @@ start_bound(struct client_state *client)
>> - dhc6_check_times(client);
>> - }
>> -
>> -+/*
>> -+ * Decline addresses.
>> -+ */
>> -+void
>> -+start_decline6(struct client_state *client)
>> -+{
>> -+ /* Cancel any pending transmissions */
>> -+ cancel_timeout(do_confirm6, client);
>> -+ cancel_timeout(do_select6, client);
>> -+ cancel_timeout(do_refresh6, client);
>> -+ cancel_timeout(do_release6, client);
>> -+ cancel_timeout(do_decline6, client);
>> -+ client->state = S_DECLINED;
>> -+
>> -+ if (client->active_lease == NULL)
>> -+ return;
>> -+
>> -+ /* Set timers per RFC3315 section 18.1.7. */
>> -+ client->IRT = DEC_TIMEOUT * 100;
>> -+ client->MRT = 0;
>> -+ client->MRC = DEC_MAX_RC;
>> -+ client->MRD = 0;
>> -+
>> -+ dhc6_retrans_init(client);
>> -+ client->v6_handler = reply_handler;
>> -+
>> -+ client->refresh_type = DHCPV6_DECLINE;
>> -+ do_decline6(client);
>> -+}
>> -+
>> -+/*
>> -+ * do_decline6() creates a Decline packet and transmits it.
>> -+ */
>> -+static void
>> -+do_decline6(void *input)
>> -+{
>> -+ struct client_state *client;
>> -+ struct data_string ds;
>> -+ int send_ret;
>> -+ struct timeval elapsed, tv;
>> -+
>> -+ client = input;
>> -+
>> -+ if ((client->active_lease == NULL) || !active_prefix(client))
>> -+ return;
>> -+
>> -+ if ((client->MRC != 0) && (client->txcount > client->MRC)) {
>> -+ log_info("Max retransmission count exceeded.");
>> -+ goto decline_done;
>> -+ }
>> -+
>> -+ /*
>> -+ * Start_time starts at the first transmission.
>> -+ */
>> -+ if (client->txcount == 0) {
>> -+ client->start_time.tv_sec = cur_tv.tv_sec;
>> -+ client->start_time.tv_usec = cur_tv.tv_usec;
>> -+ }
>> -+
>> -+ /* elapsed = cur - start */
>> -+ elapsed.tv_sec = cur_tv.tv_sec - client->start_time.tv_sec;
>> -+ elapsed.tv_usec = cur_tv.tv_usec - client->start_time.tv_usec;
>> -+ if (elapsed.tv_usec < 0) {
>> -+ elapsed.tv_sec -= 1;
>> -+ elapsed.tv_usec += 1000000;
>> -+ }
>> -+
>> -+ memset(&ds, 0, sizeof(ds));
>> -+ if (!buffer_allocate(&ds.buffer, 4, MDL)) {
>> -+ log_error("Unable to allocate memory for Decline.");
>> -+ goto decline_done;
>> -+ }
>> -+
>> -+ ds.data = ds.buffer->data;
>> -+ ds.len = 4;
>> -+ ds.buffer->data[0] = DHCPV6_DECLINE;
>> -+ memcpy(ds.buffer->data + 1, client->dhcpv6_transaction_id, 3);
>> -+
>> -+ /* Form an elapsed option. */
>> -+ /* Maximum value is 65535 1/100s coded as 0xffff. */
>> -+ if ((elapsed.tv_sec < 0) || (elapsed.tv_sec > 655) ||
>> -+ ((elapsed.tv_sec == 655) && (elapsed.tv_usec > 350000))) {
>> -+ client->elapsed = 0xffff;
>> -+ } else {
>> -+ client->elapsed = elapsed.tv_sec * 100;
>> -+ client->elapsed += elapsed.tv_usec / 10000;
>> -+ }
>> -+
>> -+ client->elapsed = htons(client->elapsed);
>> -+
>> -+ log_debug("XMT: Forming Decline.");
>> -+ make_client6_options(client, &client->sent_options,
>> -+ client->active_lease, DHCPV6_DECLINE);
>> -+ dhcpv6_universe.encapsulate(&ds, NULL, NULL, client, NULL,
>> -+ client->sent_options, &global_scope,
>> -+ &dhcpv6_universe);
>> -+
>> -+ /* Append IA's (but don't release temporary addresses). */
>> -+ if (wanted_ia_na &&
>> -+ dhc6_add_ia_na(client, &ds, client->active_lease,
>> -+ DHCPV6_DECLINE) != ISC_R_SUCCESS) {
>> -+ data_string_forget(&ds, MDL);
>> -+ goto decline_done;
>> -+ }
>> -+ if (wanted_ia_pd &&
>> -+ dhc6_add_ia_pd(client, &ds, client->active_lease,
>> -+ DHCPV6_DECLINE) != ISC_R_SUCCESS) {
>> -+ data_string_forget(&ds, MDL);
>> -+ goto decline_done;
>> -+ }
>> -+
>> -+ /* Transmit and wait. */
>> -+ log_info("XMT: Decline on %s, interval %ld0ms.",
>> -+ client->name ? client->name : client->interface->name,
>> -+ (long int)client->RT);
>> -+
>> -+ send_ret = send_packet6(client->interface, ds.data, ds.len,
>> -+ &DHCPv6DestAddr);
>> -+ if (send_ret != ds.len) {
>> -+ log_error("dhc6: sendpacket6() sent %d of %d bytes",
>> -+ send_ret, ds.len);
>> -+ }
>> -+
>> -+ data_string_forget(&ds, MDL);
>> -+
>> -+ /* Wait RT */
>> -+ tv.tv_sec = cur_tv.tv_sec + client->RT / 100;
>> -+ tv.tv_usec = cur_tv.tv_usec + (client->RT % 100) * 10000;
>> -+ if (tv.tv_usec >= 1000000) {
>> -+ tv.tv_sec += 1;
>> -+ tv.tv_usec -= 1000000;
>> -+ }
>> -+ add_timeout(&tv, do_decline6, client, NULL, NULL);
>> -+ dhc6_retrans_advance(client);
>> -+ return;
>> -+
>> -+decline_done:
>> -+ dhc6_lease_destroy(&client->active_lease, MDL);
>> -+ client->active_lease = NULL;
>> -+ start_init6(client);
>> -+ return;
>> -+}
>> -+
>> - /* While bound, ignore packets. In the future we'll want to answer
>> - * Reconfigure-Request messages and the like.
>> - */
>> diff --git a/src/patches/dhcp/dhcp-sharedlib.patch b/src/patches/dhcp/dhcp-
>> sharedlib.patch
>> deleted file mode 100644
>> index abb2acc19..000000000
>> --- a/src/patches/dhcp/dhcp-sharedlib.patch
>> +++ /dev/null
>> @@ -1,107 +0,0 @@
>> -diff -up dhcp-4.3.1b1/common/tests/Makefile.am.uCWMBl dhcp-
>> 4.3.1b1/common/tests/Makefile.am
>> ---- dhcp-4.3.1b1/common/tests/Makefile.am.uCWMBl 2014-07-10
>> 17:38:10.779828569 +0200
>> -+++ dhcp-4.3.1b1/common/tests/Makefile.am 2014-07-10
>> 17:38:21.355678580 +0200
>> -@@ -13,19 +13,19 @@ ATF_TESTS += alloc_unittest dns_unittest
>> - alloc_unittest_SOURCES = test_alloc.c $(top_srcdir)/tests/t_api_dhcp.c
>> - alloc_unittest_LDADD = $(ATF_LDFLAGS)
>> - alloc_unittest_LDADD += ../libdhcp.a \
>> -- ../../omapip/libomapi.a \
>> -+ ../../omapip/libomapi.la \
>> - $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
>> -
>> - dns_unittest_SOURCES = dns_unittest.c $(top_srcdir)/tests/t_api_dhcp.c
>> - dns_unittest_LDADD = $(ATF_LDFLAGS)
>> --dns_unittest_LDADD += ../libdhcp.a \
>> -+dns_unittest_LDADD += ../libdhcp.la \
>> - ../../omapip/libomapi.a \
>> - $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
>> -
>> - misc_unittest_SOURCES = misc_unittest.c $(top_srcdir)/tests/t_api_dhcp.c
>> - misc_unittest_LDADD = $(ATF_LDFLAGS)
>> - misc_unittest_LDADD += ../libdhcp.a \
>> -- ../../omapip/libomapi.a \
>> -+ ../../omapip/libomapi.la \
>> - $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
>> - check: $(ATF_TESTS)
>> - atf-run | atf-report
>> -diff -up dhcp-4.3.1b1/configure.ac.uCWMBl dhcp-4.3.1b1/configure.ac
>> ---- dhcp-4.3.1b1/configure.ac.uCWMBl 2014-07-10 17:38:10.766828753
>> +0200
>> -+++ dhcp-4.3.1b1/configure.ac 2014-07-10 17:38:10.779828569 +0200
>> -@@ -39,7 +39,8 @@ fi
>> - # Use this to define _GNU_SOURCE to pull in the IPv6 Advanced Socket API.
>> - AC_USE_SYSTEM_EXTENSIONS
>> -
>> --AC_PROG_RANLIB
>> -+# Use libtool to simplify building of shared libraries
>> -+AC_PROG_LIBTOOL
>> - AC_CONFIG_HEADERS([includes/config.h])
>> -
>> - # we sometimes need to know byte order for building packets
>> -diff -up dhcp-4.3.1b1/dhcpctl/Makefile.am.uCWMBl dhcp-
>> 4.3.1b1/dhcpctl/Makefile.am
>> ---- dhcp-4.3.1b1/dhcpctl/Makefile.am.uCWMBl 2014-07-10
>> 17:36:30.485250962 +0200
>> -+++ dhcp-4.3.1b1/dhcpctl/Makefile.am 2014-07-10 17:38:10.780828554
>> +0200
>> -@@ -1,14 +1,14 @@
>> - bin_PROGRAMS = omshell
>> --lib_LIBRARIES = libdhcpctl.a
>> -+lib_LTLIBRARIES = libdhcpctl.la
>> - noinst_PROGRAMS = cltest
>> - man_MANS = omshell.1 dhcpctl.3
>> - EXTRA_DIST = $(man_MANS)
>> -
>> - omshell_SOURCES = omshell.c
>> --omshell_LDADD = libdhcpctl.a ../common/libdhcp.a ../omapip/libomapi.a \
>> -+omshell_LDADD = libdhcpctl.la ../common/libdhcp.a ../omapip/libomapi.la \
>> - $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
>> --libdhcpctl_a_SOURCES = dhcpctl.c callback.c remote.c
>> -+libdhcpctl_la_SOURCES = dhcpctl.c callback.c remote.c
>> -
>> - cltest_SOURCES = cltest.c
>> --cltest_LDADD = libdhcpctl.a ../common/libdhcp.a ../omapip/libomapi.a \
>> -+cltest_LDADD = libdhcpctl.la ../common/libdhcp.a ../omapip/libomapi.la \
>> - $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
>> -diff -up dhcp-4.3.1b1/omapip/Makefile.am.uCWMBl dhcp-
>> 4.3.1b1/omapip/Makefile.am
>> ---- dhcp-4.3.1b1/omapip/Makefile.am.uCWMBl 2014-07-10
>> 17:36:30.486250948 +0200
>> -+++ dhcp-4.3.1b1/omapip/Makefile.am 2014-07-10 17:38:10.780828554
>> +0200
>> -@@ -1,7 +1,7 @@
>> --lib_LIBRARIES = libomapi.a
>> -+lib_LTLIBRARIES = libomapi.la
>> - noinst_PROGRAMS = svtest
>> -
>> --libomapi_a_SOURCES = protocol.c buffer.c alloc.c result.c connection.c \
>> -+libomapi_la_SOURCES = protocol.c buffer.c alloc.c result.c connection.c \
>> - errwarn.c listener.c dispatch.c generic.c support.c \
>> - handle.c message.c convert.c hash.c auth.c inet_addr.c
>> \
>> - array.c trace.c toisc.c iscprint.c isclib.c
>> -@@ -10,5 +10,5 @@ man_MANS = omapi.3
>> - EXTRA_DIST = $(man_MANS)
>> -
>> - svtest_SOURCES = test.c
>> --svtest_LDADD = libomapi.a \
>> -+svtest_LDADD = libomapi.la \
>> - $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
>> -diff -up dhcp-4.3.1b1/server/Makefile.am.uCWMBl dhcp-
>> 4.3.1b1/server/Makefile.am
>> ---- dhcp-4.3.1b1/server/Makefile.am.uCWMBl 2014-07-10
>> 17:36:30.486250948 +0200
>> -+++ dhcp-4.3.1b1/server/Makefile.am 2014-07-10 17:38:10.780828554
>> +0200
>> -@@ -13,7 +13,7 @@ dhcpd_SOURCES = dhcpd.c dhcp.c bootp.c c
>> - dhcpv6.c mdb6.c ldap.c ldap_casa.c
>> -
>> - dhcpd_CFLAGS = $(LDAP_CFLAGS)
>> --dhcpd_LDADD = ../common/libdhcp.a ../omapip/libomapi.a
>> ../dhcpctl/libdhcpctl.a \
>> -+dhcpd_LDADD = ../common/libdhcp.a ../omapip/libomapi.la
>> ../dhcpctl/libdhcpctl.la \
>> - $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
>> - man_MANS = dhcpd.8 dhcpd.conf.5 dhcpd.leases.5
>> - EXTRA_DIST = $(man_MANS)
>> -diff -up dhcp-4.3.1b1/server/tests/Makefile.am.uCWMBl dhcp-
>> 4.3.1b1/server/tests/Makefile.am
>> ---- dhcp-4.3.1b1/server/tests/Makefile.am.uCWMBl 2014-07-10
>> 17:36:30.486250948 +0200
>> -+++ dhcp-4.3.1b1/server/tests/Makefile.am 2014-07-10
>> 17:38:10.780828554 +0200
>> -@@ -17,8 +17,8 @@ DHCPSRC = ../dhcp.c ../bootp.c ../confpa
>> - ../ddns.c ../dhcpleasequery.c ../dhcpv6.c ../mdb6.c \
>> - ../ldap.c ../ldap_casa.c ../dhcpd.c
>> -
>> --DHCPLIBS = $(top_builddir)/common/libdhcp.a
>> $(top_builddir)/omapip/libomapi.a \
>> -- $(top_builddir)/dhcpctl/libdhcpctl.a \
>> -+DHCPLIBS = $(top_builddir)/common/libdhcp.a
>> $(top_builddir)/omapip/libomapi.la \
>> -+ $(top_builddir)/dhcpctl/libdhcpctl.la \
>> - $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
>> -
>> - ATF_TESTS =
>> diff --git a/src/patches/dhcp/dhcp-stateless-DUID-LLT.patch
>> b/src/patches/dhcp/dhcp-stateless-DUID-LLT.patch
>> deleted file mode 100644
>> index a7f22b539..000000000
>> --- a/src/patches/dhcp/dhcp-stateless-DUID-LLT.patch
>> +++ /dev/null
>> @@ -1,48 +0,0 @@
>> -From 61fa3dd9e789997f66e848c7e3fb2f554ee374e2 Mon Sep 17 00:00:00 2001
>> -From: Jiri Popelka <jpopelka@redhat.com>
>> -Date: Thu, 18 Dec 2014 11:53:26 +0100
>> -Subject: [PATCH] Write DUID_LLT even in stateless mode.
>> -
>> -By default, DHCPv6 dhclient creates DUID-LL
>> -if it is running in stateless mode (-6 -S) and
>> -doesn't write it into leases file, most likely
>> -because the DUID-LL is always generated the same.
>> -
>> -It's however possible to specify DUID to be of type LLT instead of LL
>> -with '-D LLT'. Rfc 3315 says that:
>> -'Clients and servers using this type of DUID MUST
>> -store the DUID-LLT in stable storage.'
>> -That's not fulfiled in this case (-6 -S -D LLT),
>> -because it's generated each time again.
>> -
>> -It's not a big deal because the server doesn't store any
>> -info about 'stateless' clients, so it doesn't matter
>> -that the DUID-LLT is different each time.
>> -But there's a TAHI test which tests this, i.e. that
>> -DUID-LLT is still the same even in stateless mode.
>> -It's a test DHCP_CONF.7.1.9, part B.
>> -https://www.ipv6ready.org/docs/Phase2_DHCPv6_Conformance_Latest.pdf
>> -
>> -Signed-off-by: Jiri Popelka <jpopelka@redhat.com>
>> ----
>> - client/dhclient.c | 4 +++-
>> - 1 file changed, 3 insertions(+), 1 deletion(-)
>> -
>> -diff --git a/client/dhclient.c b/client/dhclient.c
>> -index 5ef59cd..026e3fe 100644
>> ---- a/client/dhclient.c
>> -+++ b/client/dhclient.c
>> -@@ -788,7 +788,9 @@ void run_stateless(int exit_mode)
>> - if (default_duid.buffer != NULL)
>> - data_string_forget(&default_duid, MDL);
>> -
>> -- form_duid(&default_duid, MDL);
>> -+ if (form_duid(&default_duid, MDL) == ISC_R_SUCCESS &&
>> -+ duid_type == DUID_LLT)
>> -+ write_duid(&default_duid);
>> - }
>> -
>> - /* Start a configuration state machine. */
>> ---
>> -2.1.0
>> -
>> diff --git a/src/patches/dhcp/dhcp-unicast-bootp.patch
>> b/src/patches/dhcp/dhcp-unicast-bootp.patch
>> deleted file mode 100644
>> index a0db9de69..000000000
>> --- a/src/patches/dhcp/dhcp-unicast-bootp.patch
>> +++ /dev/null
>> @@ -1,101 +0,0 @@
>> -diff -up dhcp-4.3.0a1/server/bootp.c.unicast dhcp-4.3.0a1/server/bootp.c
>> ---- dhcp-4.3.0a1/server/bootp.c.unicast 2013-12-11 01:25:12.000000000
>> +0100
>> -+++ dhcp-4.3.0a1/server/bootp.c 2013-12-19 15:12:12.974671154 +0100
>> -@@ -59,6 +59,7 @@ void bootp (packet)
>> - char msgbuf [1024];
>> - int ignorep;
>> - int peer_has_leases = 0;
>> -+ int norelay = 0;
>> -
>> - if (packet -> raw -> op != BOOTREQUEST)
>> - return;
>> -@@ -74,7 +75,7 @@ void bootp (packet)
>> - ? inet_ntoa (packet -> raw -> giaddr)
>> - : packet -> interface -> name);
>> -
>> -- if (!locate_network (packet)) {
>> -+ if ((norelay = locate_network (packet)) == 0) {
>> - log_info ("%s: network unknown", msgbuf);
>> - return;
>> - }
>> -@@ -396,6 +397,15 @@ void bootp (packet)
>> -
>> - goto out;
>> - }
>> -+ } else if (norelay == 2) {
>> -+ to.sin_addr = raw.ciaddr;
>> -+ to.sin_port = remote_port;
>> -+ if (fallback_interface) {
>> -+ result = send_packet (fallback_interface, NULL,
>> &raw,
>> -+ outgoing.packet_length, from,
>> -+ &to, &hto);
>> -+ goto out;
>> -+ }
>> -
>> - /* If it comes from a client that already knows its address
>> - and is not requesting a broadcast response, and we can
>> -diff -up dhcp-4.3.0a1/server/dhcp.c.unicast dhcp-4.3.0a1/server/dhcp.c
>> ---- dhcp-4.3.0a1/server/dhcp.c.unicast 2013-12-13 21:50:38.000000000
>> +0100
>> -+++ dhcp-4.3.0a1/server/dhcp.c 2013-12-19 15:12:12.975671140 +0100
>> -@@ -4627,6 +4627,7 @@ int locate_network (packet)
>> - struct data_string data;
>> - struct subnet *subnet = (struct subnet *)0;
>> - struct option_cache *oc;
>> -+ int norelay = 0;
>> -
>> - /* See if there's a Relay Agent Link Selection Option, or a
>> - * Subnet Selection Option. The Link-Select and Subnet-Select
>> -@@ -4642,12 +4643,24 @@ int locate_network (packet)
>> - from the interface, if there is one. If not, fail. */
>> - if (!oc && !packet -> raw -> giaddr.s_addr) {
>> - if (packet -> interface -> shared_network) {
>> -- shared_network_reference
>> -- (&packet -> shared_network,
>> -- packet -> interface -> shared_network,
>> MDL);
>> -- return 1;
>> -+ struct in_addr any_addr;
>> -+ any_addr.s_addr = INADDR_ANY;
>> -+
>> -+ if (!packet -> packet_type && memcmp(&packet -> raw
>> -> ciaddr, &any_addr, 4)) {
>> -+ struct iaddr cip;
>> -+ memcpy(cip.iabuf, &packet -> raw -> ciaddr,
>> 4);
>> -+ cip.len = 4;
>> -+ if (!find_grouped_subnet(&subnet, packet-
>> >interface->shared_network, cip, MDL))
>> -+ norelay = 2;
>> -+ }
>> -+
>> -+ if (!norelay) {
>> -+ shared_network_reference(&packet ->
>> shared_network, packet -> interface -> shared_network, MDL);
>> -+ return 1;
>> -+ }
>> -+ } else {
>> -+ return 0;
>> - }
>> -- return 0;
>> - }
>> -
>> - /* If there's an option indicating link connection, and it's valid,
>> -@@ -4670,7 +4683,10 @@ int locate_network (packet)
>> - data_string_forget (&data, MDL);
>> - } else {
>> - ia.len = 4;
>> -- memcpy (ia.iabuf, &packet -> raw -> giaddr, 4);
>> -+ if (norelay)
>> -+ memcpy (ia.iabuf, &packet->raw->ciaddr, 4);
>> -+ else
>> -+ memcpy (ia.iabuf, &packet->raw->giaddr, 4);
>> - }
>> -
>> - /* If we know the subnet on which the IP address lives, use it. */
>> -@@ -4678,7 +4694,10 @@ int locate_network (packet)
>> - shared_network_reference (&packet -> shared_network,
>> - subnet -> shared_network, MDL);
>> - subnet_dereference (&subnet, MDL);
>> -- return 1;
>> -+ if (norelay)
>> -+ return norelay;
>> -+ else
>> -+ return 1;
>> - }
>> -
>> - /* Otherwise, fail. */
>> diff --git a/src/patches/dhcp/dhcp-xen-checksum.patch b/src/patches/dhcp/dhcp-
>> xen-checksum.patch
>> deleted file mode 100644
>> index eabc3c127..000000000
>> --- a/src/patches/dhcp/dhcp-xen-checksum.patch
>> +++ /dev/null
>> @@ -1,251 +0,0 @@
>> -diff -up dhcp-4.3.0rc1/common/bpf.c.xen dhcp-4.3.0rc1/common/bpf.c
>> ---- dhcp-4.3.0rc1/common/bpf.c.xen 2014-01-29 10:03:27.503941664 +0100
>> -+++ dhcp-4.3.0rc1/common/bpf.c 2014-01-29 10:03:37.564812175 +0100
>> -@@ -481,7 +481,7 @@ ssize_t receive_packet (interface, buf,
>> - /* Decode the IP and UDP headers... */
>> - offset = decode_udp_ip_header(interface, interface->rbuf,
>> - interface->rbuf_offset,
>> -- from, hdr.bh_caplen,
>> &paylen);
>> -+ from, hdr.bh_caplen,
>> &paylen, 0);
>> -
>> - /* If the IP or UDP checksum was bad, skip the packet... */
>> - if (offset < 0) {
>> -diff -up dhcp-4.3.0rc1/common/dlpi.c.xen dhcp-4.3.0rc1/common/dlpi.c
>> ---- dhcp-4.3.0rc1/common/dlpi.c.xen 2014-01-25 05:18:03.000000000
>> +0100
>> -+++ dhcp-4.3.0rc1/common/dlpi.c 2014-01-29 10:03:27.503941664 +0100
>> -@@ -691,7 +691,7 @@ ssize_t receive_packet (interface, buf,
>> - length -= offset;
>> - #endif
>> - offset = decode_udp_ip_header (interface, dbuf, bufix,
>> -- from, length, &paylen);
>> -+ from, length, &paylen, 0);
>> -
>> - /*
>> - * If the IP or UDP checksum was bad, skip the packet...
>> -diff -up dhcp-4.3.0rc1/common/lpf.c.xen dhcp-4.3.0rc1/common/lpf.c
>> ---- dhcp-4.3.0rc1/common/lpf.c.xen 2014-01-25 05:18:03.000000000 +0100
>> -+++ dhcp-4.3.0rc1/common/lpf.c 2014-01-29 10:03:27.504941651 +0100
>> -@@ -29,14 +29,15 @@
>> -
>> - #include "dhcpd.h"
>> - #if defined (USE_LPF_SEND) || defined (USE_LPF_RECEIVE)
>> -+#include <sys/socket.h>
>> - #include <sys/uio.h>
>> - #include <errno.h>
>> -
>> - #include <asm/types.h>
>> - #include <linux/filter.h>
>> - #include <linux/if_ether.h>
>> -+#include <linux/if_packet.h>
>> - #include <netinet/in_systm.h>
>> --#include <net/if_packet.h>
>> - #include "includes/netinet/ip.h"
>> - #include "includes/netinet/udp.h"
>> - #include "includes/netinet/if_ether.h"
>> -@@ -51,6 +52,19 @@
>> - /* Reinitializes the specified interface after an address change. This
>> - is not required for packet-filter APIs. */
>> -
>> -+#ifndef PACKET_AUXDATA
>> -+#define PACKET_AUXDATA 8
>> -+
>> -+struct tpacket_auxdata
>> -+{
>> -+ __u32 tp_status;
>> -+ __u32 tp_len;
>> -+ __u32 tp_snaplen;
>> -+ __u16 tp_mac;
>> -+ __u16 tp_net;
>> -+};
>> -+#endif
>> -+
>> - #ifdef USE_LPF_SEND
>> - void if_reinitialize_send (info)
>> - struct interface_info *info;
>> -@@ -73,10 +87,14 @@ int if_register_lpf (info)
>> - struct interface_info *info;
>> - {
>> - int sock;
>> -- struct sockaddr sa;
>> -+ union {
>> -+ struct sockaddr_ll ll;
>> -+ struct sockaddr common;
>> -+ } sa;
>> -+ struct ifreq ifr;
>> -
>> - /* Make an LPF socket. */
>> -- if ((sock = socket(PF_PACKET, SOCK_PACKET,
>> -+ if ((sock = socket(PF_PACKET, SOCK_RAW,
>> - htons((short)ETH_P_ALL))) < 0) {
>> - if (errno == ENOPROTOOPT || errno == EPROTONOSUPPORT ||
>> - errno == ESOCKTNOSUPPORT || errno == EPFNOSUPPORT ||
>> -@@ -91,11 +109,17 @@ int if_register_lpf (info)
>> - log_fatal ("Open a socket for LPF: %m");
>> - }
>> -
>> -+ memset (&ifr, 0, sizeof ifr);
>> -+ strncpy (ifr.ifr_name, (const char *)info -> ifp, sizeof
>> ifr.ifr_name);
>> -+ ifr.ifr_name[IFNAMSIZ-1] = '\0';
>> -+ if (ioctl (sock, SIOCGIFINDEX, &ifr))
>> -+ log_fatal ("Failed to get interface index: %m");
>> -+
>> - /* Bind to the interface name */
>> - memset (&sa, 0, sizeof sa);
>> -- sa.sa_family = AF_PACKET;
>> -- strncpy (sa.sa_data, (const char *)info -> ifp, sizeof sa.sa_data);
>> -- if (bind (sock, &sa, sizeof sa)) {
>> -+ sa.ll.sll_family = AF_PACKET;
>> -+ sa.ll.sll_ifindex = ifr.ifr_ifindex;
>> -+ if (bind (sock, &sa.common, sizeof sa)) {
>> - if (errno == ENOPROTOOPT || errno == EPROTONOSUPPORT ||
>> - errno == ESOCKTNOSUPPORT || errno == EPFNOSUPPORT ||
>> - errno == EAFNOSUPPORT || errno == EINVAL) {
>> -@@ -177,9 +201,18 @@ static void lpf_gen_filter_setup (struct
>> - void if_register_receive (info)
>> - struct interface_info *info;
>> - {
>> -+ int val;
>> -+
>> - /* Open a LPF device and hang it on this interface... */
>> - info -> rfdesc = if_register_lpf (info);
>> -
>> -+ val = 1;
>> -+ if (setsockopt (info -> rfdesc, SOL_PACKET, PACKET_AUXDATA, &val,
>> -+ sizeof val) < 0) {
>> -+ if (errno != ENOPROTOOPT)
>> -+ log_fatal ("Failed to set auxiliary packet data:
>> %m");
>> -+ }
>> -+
>> - #if defined (HAVE_TR_SUPPORT)
>> - if (info -> hw_address.hbuf [0] == HTYPE_IEEE802)
>> - lpf_tr_filter_setup (info);
>> -@@ -301,7 +334,6 @@ ssize_t send_packet (interface, packet,
>> - double hh [16];
>> - double ih [1536 / sizeof (double)];
>> - unsigned char *buf = (unsigned char *)ih;
>> -- struct sockaddr_pkt sa;
>> - int result;
>> - int fudge;
>> -
>> -@@ -322,17 +354,7 @@ ssize_t send_packet (interface, packet,
>> - (unsigned char *)raw, len);
>> - memcpy (buf + ibufp, raw, len);
>> -
>> -- /* For some reason, SOCK_PACKET sockets can't be connected,
>> -- so we have to do a sentdo every time. */
>> -- memset (&sa, 0, sizeof sa);
>> -- sa.spkt_family = AF_PACKET;
>> -- strncpy ((char *)sa.spkt_device,
>> -- (const char *)interface -> ifp, sizeof sa.spkt_device);
>> -- sa.spkt_protocol = htons(ETH_P_IP);
>> --
>> -- result = sendto (interface -> wfdesc,
>> -- buf + fudge, ibufp + len - fudge, 0,
>> -- (const struct sockaddr *)&sa, sizeof sa);
>> -+ result = write (interface -> wfdesc, buf + fudge, ibufp + len -
>> fudge);
>> - if (result < 0)
>> - log_error ("send_packet: %m");
>> - return result;
>> -@@ -349,14 +371,35 @@ ssize_t receive_packet (interface, buf,
>> - {
>> - int length = 0;
>> - int offset = 0;
>> -+ int nocsum = 0;
>> - unsigned char ibuf [1536];
>> - unsigned bufix = 0;
>> - unsigned paylen;
>> -+ unsigned char cmsgbuf[CMSG_LEN(sizeof(struct tpacket_auxdata))];
>> -+ struct iovec iov = {
>> -+ .iov_base = ibuf,
>> -+ .iov_len = sizeof ibuf,
>> -+ };
>> -+ struct msghdr msg = {
>> -+ .msg_iov = &iov,
>> -+ .msg_iovlen = 1,
>> -+ .msg_control = cmsgbuf,
>> -+ .msg_controllen = sizeof(cmsgbuf),
>> -+ };
>> -+ struct cmsghdr *cmsg;
>> -
>> -- length = read (interface -> rfdesc, ibuf, sizeof ibuf);
>> -+ length = recvmsg (interface -> rfdesc, &msg, 0);
>> - if (length <= 0)
>> - return length;
>> -
>> -+ for (cmsg = CMSG_FIRSTHDR(&msg); cmsg; cmsg = CMSG_NXTHDR(&msg,
>> cmsg)) {
>> -+ if (cmsg->cmsg_level == SOL_PACKET &&
>> -+ cmsg->cmsg_type == PACKET_AUXDATA) {
>> -+ struct tpacket_auxdata *aux = (void
>> *)CMSG_DATA(cmsg);
>> -+ nocsum = aux->tp_status & TP_STATUS_CSUMNOTREADY;
>> -+ }
>> -+ }
>> -+
>> - bufix = 0;
>> - /* Decode the physical header... */
>> - offset = decode_hw_header (interface, ibuf, bufix, hfrom);
>> -@@ -373,7 +416,7 @@ ssize_t receive_packet (interface, buf,
>> -
>> - /* Decode the IP and UDP headers... */
>> - offset = decode_udp_ip_header (interface, ibuf, bufix, from,
>> -- (unsigned)length, &paylen);
>> -+ (unsigned)length, &paylen, nocsum);
>> -
>> - /* If the IP or UDP checksum was bad, skip the packet... */
>> - if (offset < 0)
>> -diff -up dhcp-4.3.0rc1/common/nit.c.xen dhcp-4.3.0rc1/common/nit.c
>> ---- dhcp-4.3.0rc1/common/nit.c.xen 2014-01-26 19:40:44.000000000 +0100
>> -+++ dhcp-4.3.0rc1/common/nit.c 2014-01-29 10:03:27.504941651 +0100
>> -@@ -363,7 +363,7 @@ ssize_t receive_packet (interface, buf,
>> -
>> - /* Decode the IP and UDP headers... */
>> - offset = decode_udp_ip_header (interface, ibuf, bufix,
>> -- from, length, &paylen);
>> -+ from, length, &paylen, 0);
>> -
>> - /* If the IP or UDP checksum was bad, skip the packet... */
>> - if (offset < 0)
>> -diff -up dhcp-4.3.0rc1/common/packet.c.xen dhcp-4.3.0rc1/common/packet.c
>> ---- dhcp-4.3.0rc1/common/packet.c.xen 2013-12-11 01:01:02.000000000
>> +0100
>> -+++ dhcp-4.3.0rc1/common/packet.c 2014-01-29 10:03:27.504941651 +0100
>> -@@ -226,7 +226,7 @@ ssize_t
>> - decode_udp_ip_header(struct interface_info *interface,
>> - unsigned char *buf, unsigned bufix,
>> - struct sockaddr_in *from, unsigned buflen,
>> -- unsigned *rbuflen)
>> -+ unsigned *rbuflen, int nocsum)
>> - {
>> - unsigned char *data;
>> - struct ip ip;
>> -@@ -337,7 +337,7 @@ decode_udp_ip_header(struct interface_in
>> - 8, IPPROTO_UDP + ulen))));
>> -
>> - udp_packets_seen++;
>> -- if (usum && usum != sum) {
>> -+ if (!nocsum && usum && usum != sum) {
>> - udp_packets_bad_checksum++;
>> - if (udp_packets_seen > 4 &&
>> - (udp_packets_seen / udp_packets_bad_checksum) < 2) {
>> -diff -up dhcp-4.3.0rc1/common/upf.c.xen dhcp-4.3.0rc1/common/upf.c
>> ---- dhcp-4.3.0rc1/common/upf.c.xen 2014-01-26 19:40:44.000000000 +0100
>> -+++ dhcp-4.3.0rc1/common/upf.c 2014-01-29 10:03:27.505941638 +0100
>> -@@ -314,7 +314,7 @@ ssize_t receive_packet (interface, buf,
>> -
>> - /* Decode the IP and UDP headers... */
>> - offset = decode_udp_ip_header (interface, ibuf, bufix,
>> -- from, length, &paylen);
>> -+ from, length, &paylen, 0);
>> -
>> - /* If the IP or UDP checksum was bad, skip the packet... */
>> - if (offset < 0)
>> -diff -up dhcp-4.3.0rc1/includes/dhcpd.h.xen dhcp-4.3.0rc1/includes/dhcpd.h
>> ---- dhcp-4.3.0rc1/includes/dhcpd.h.xen 2014-01-29 10:03:27.489941844
>> +0100
>> -+++ dhcp-4.3.0rc1/includes/dhcpd.h 2014-01-29 10:03:27.506941626 +0100
>> -@@ -2861,7 +2861,7 @@ ssize_t decode_hw_header (struct interfa
>> - unsigned, struct hardware *);
>> - ssize_t decode_udp_ip_header (struct interface_info *, unsigned char *,
>> - unsigned, struct sockaddr_in *,
>> -- unsigned, unsigned *);
>> -+ unsigned, unsigned *, int);
>> -
>> - /* ethernet.c */
>> - void assemble_ethernet_header (struct interface_info *, unsigned char *,
>
@@ -5,8 +5,6 @@ etc/dhcp/dhcpd.conf
#usr/bin/omshell
#usr/include/dhcpctl
#usr/include/dhcpctl/dhcpctl.h
-#usr/include/isc-dhcp
-#usr/include/isc-dhcp/dst.h
#usr/include/omapip
#usr/include/omapip/alloc.h
#usr/include/omapip/buffer.h
@@ -17,8 +15,8 @@ etc/dhcp/dhcpd.conf
#usr/include/omapip/omapip_p.h
#usr/include/omapip/result.h
#usr/include/omapip/trace.h
+#usr/lib/libdhcp.a
#usr/lib/libdhcpctl.a
-#usr/lib/libdst.a
#usr/lib/libomapi.a
#usr/sbin/dhclient
usr/sbin/dhcpd
@@ -1,7 +1,7 @@
###############################################################################
# #
# IPFire.org - A linux based firewall #
-# Copyright (C) 2007-2015 IPFire Team <info@ipfire.org> #
+# Copyright (C) 2007-2018 IPFire Team <info@ipfire.org> #
# #
# This program is free software: you can redistribute it and/or modify #
# it under the terms of the GNU General Public License as published by #
@@ -24,7 +24,7 @@
include Config
-VER = 4.3.1
+VER = 4.4.1
THISAPP = dhcp-$(VER)
DL_FILE = $(THISAPP).tar.gz
@@ -40,7 +40,7 @@ objects = $(DL_FILE)
$(DL_FILE) = $(DL_FROM)/$(DL_FILE)
-$(DL_FILE)_MD5 = b3a42ece3c7f2cd2e74a3e12ca881d20
+$(DL_FILE)_MD5 = 18c7f4dcbb0a63df25098216d47b1ede
install : $(TARGET)
@@ -71,47 +71,20 @@ $(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
@$(PREBUILD)
@rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar zxf $(DIR_DL)/$(DL_FILE)
- cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-remove-bind.patch
- cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-errwarn-message.patch
- cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-dhclient-options.patch
- cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-release-by-ifup.patch
- cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-dhclient-decline-backoff.patch
- cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-unicast-bootp.patch
- cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-default-requested-options.patch
- cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-xen-checksum.patch
- cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-manpages.patch
- cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-paths.patch
- cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-CLOEXEC.patch
- cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-garbage-chars.patch
- cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-add_timeout_when_NULL.patch
- cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-64_bit_lease_parse.patch
- cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-capability.patch
- cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-logpid.patch
- cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-UseMulticast.patch
- cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-sendDecline.patch
- cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-rfc3442-classless-static-routes.patch
- cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-honor-expired.patch
- cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-sharedlib.patch
- cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-PPP.patch
- cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-paranoia.patch
- cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-lpf-ib.patch
- cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-improved-xid.patch
- cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-gpxe-cid.patch
- cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/dhcp/dhcp-stateless-DUID-LLT.patch
-
# Help unpacking bundled BIND
- cd $(DIR_APP) && sed -e "s/gunzip -c/&d/" -i bind/Makefile
+ cd $(DIR_APP) && sed -e "s/gunzip -c/&d/" -i bind/Makefile.in
cd $(DIR_APP) && \
./configure \
--prefix=/usr \
--sysconfdir=/etc/dhcp \
+ --with-srv-conf-file=/etc/dhcp/dhcpd.conf \
--with-srv-lease-file=/var/state/dhcp/dhcpd.leases \
--enable-paranoia \
--enable-early-chroot \
--disable-dhcpv6
- cd $(DIR_APP) && make $(MAKETUNING)
+ cd $(DIR_APP) && make
cd $(DIR_APP) && make install
mkdir -pv /var/state/dhcp
deleted file mode 100644
@@ -1,75 +0,0 @@
-diff -up dhcp-4.3.0a1/common/parse.c.64-bit_lease_parse dhcp-4.3.0a1/common/parse.c
---- dhcp-4.3.0a1/common/parse.c.64-bit_lease_parse 2013-12-11 01:25:12.000000000 +0100
-+++ dhcp-4.3.0a1/common/parse.c 2013-12-19 15:45:25.990771814 +0100
-@@ -938,8 +938,8 @@ TIME
- parse_date_core(cfile)
- struct parse *cfile;
- {
-- int guess;
-- int tzoff, year, mon, mday, hour, min, sec;
-+ TIME guess;
-+ long int tzoff, year, mon, mday, hour, min, sec;
- const char *val;
- enum dhcp_token token;
- static int months[11] = { 31, 59, 90, 120, 151, 181,
-@@ -965,7 +965,7 @@ parse_date_core(cfile)
- }
-
- skip_token(&val, NULL, cfile); /* consume number */
-- guess = atoi(val);
-+ guess = atol(val);
-
- return((TIME)guess);
- }
-@@ -993,7 +993,7 @@ parse_date_core(cfile)
- somebody invents a time machine, I think we can safely disregard
- it. This actually works around a stupid Y2K bug that was present
- in a very early beta release of dhcpd. */
-- year = atoi(val);
-+ year = atol(val);
- if (year > 1900)
- year -= 1900;
-
-@@ -1039,7 +1039,7 @@ parse_date_core(cfile)
- return((TIME)0);
- }
- skip_token(&val, NULL, cfile); /* consume day of month */
-- mday = atoi(val);
-+ mday = atol(val);
-
- /* Hour... */
- token = peek_token(&val, NULL, cfile);
-@@ -1050,7 +1050,7 @@ parse_date_core(cfile)
- return((TIME)0);
- }
- skip_token(&val, NULL, cfile); /* consume hour */
-- hour = atoi(val);
-+ hour = atol(val);
-
- /* Colon separating hour from minute... */
- token = peek_token(&val, NULL, cfile);
-@@ -1072,7 +1072,7 @@ parse_date_core(cfile)
- return((TIME)0);
- }
- skip_token(&val, NULL, cfile); /* consume minute */
-- min = atoi(val);
-+ min = atol(val);
-
- /* Colon separating minute from second... */
- token = peek_token(&val, NULL, cfile);
-@@ -1094,13 +1094,13 @@ parse_date_core(cfile)
- return((TIME)0);
- }
- skip_token(&val, NULL, cfile); /* consume second */
-- sec = atoi(val);
-+ sec = atol(val);
-
- tzoff = 0;
- token = peek_token(&val, NULL, cfile);
- if (token == NUMBER) {
- skip_token(&val, NULL, cfile); /* consume tzoff */
-- tzoff = atoi(val);
-+ tzoff = atol(val);
- } else if (token != SEMI) {
- skip_token(&val, NULL, cfile);
- parse_warn(cfile,
deleted file mode 100644
@@ -1,342 +0,0 @@
-diff -up dhcp-4.3.0a1/client/clparse.c.cloexec dhcp-4.3.0a1/client/clparse.c
---- dhcp-4.3.0a1/client/clparse.c.cloexec 2013-12-19 15:34:41.638886256 +0100
-+++ dhcp-4.3.0a1/client/clparse.c 2013-12-19 15:34:41.657885985 +0100
-@@ -253,7 +253,7 @@ int read_client_conf_file (const char *n
- int token;
- isc_result_t status;
-
-- if ((file = open (name, O_RDONLY)) < 0)
-+ if ((file = open (name, O_RDONLY | O_CLOEXEC)) < 0)
- return uerr2isc (errno);
-
- cfile = NULL;
-@@ -290,7 +290,7 @@ void read_client_leases ()
-
- /* Open the lease file. If we can't open it, just return -
- we can safely trust the server to remember our state. */
-- if ((file = open (path_dhclient_db, O_RDONLY)) < 0)
-+ if ((file = open (path_dhclient_db, O_RDONLY | O_CLOEXEC)) < 0)
- return;
-
- cfile = NULL;
-diff -up dhcp-4.3.0a1/client/dhclient.c.cloexec dhcp-4.3.0a1/client/dhclient.c
---- dhcp-4.3.0a1/client/dhclient.c.cloexec 2013-12-19 15:34:41.629886384 +0100
-+++ dhcp-4.3.0a1/client/dhclient.c 2013-12-19 15:36:41.608180467 +0100
-@@ -148,11 +148,11 @@ main(int argc, char **argv) {
- /* Make sure that file descriptors 0 (stdin), 1, (stdout), and
- 2 (stderr) are open. To do this, we assume that when we
- open a file the lowest available file descriptor is used. */
-- fd = open("/dev/null", O_RDWR);
-+ fd = open("/dev/null", O_RDWR | O_CLOEXEC);
- if (fd == 0)
-- fd = open("/dev/null", O_RDWR);
-+ fd = open("/dev/null", O_RDWR | O_CLOEXEC);
- if (fd == 1)
-- fd = open("/dev/null", O_RDWR);
-+ fd = open("/dev/null", O_RDWR | O_CLOEXEC);
- if (fd == 2)
- log_perror = 0; /* No sense logging to /dev/null. */
- else if (fd != -1)
-@@ -504,7 +504,7 @@ main(int argc, char **argv) {
- long temp;
- int e;
-
-- if ((pidfd = fopen(path_dhclient_pid, "r")) != NULL) {
-+ if ((pidfd = fopen(path_dhclient_pid, "re")) != NULL) {
- e = fscanf(pidfd, "%ld\n", &temp);
- oldpid = (pid_t)temp;
-
-@@ -554,7 +554,7 @@ main(int argc, char **argv) {
- strncpy(new_path_dhclient_pid, path_dhclient_pid, pfx);
- sprintf(new_path_dhclient_pid + pfx, "-%s.pid", ip->name);
-
-- if ((pidfd = fopen(new_path_dhclient_pid, "r")) != NULL) {
-+ if ((pidfd = fopen(new_path_dhclient_pid, "re")) != NULL) {
- e = fscanf(pidfd, "%ld\n", &temp);
- oldpid = (pid_t)temp;
-
-@@ -579,7 +579,7 @@ main(int argc, char **argv) {
- int dhc_running = 0;
- char procfn[256] = "";
-
-- if ((pidfp = fopen(path_dhclient_pid, "r")) != NULL) {
-+ if ((pidfp = fopen(path_dhclient_pid, "re")) != NULL) {
- if ((fscanf(pidfp, "%ld", &temp)==1) && ((dhcpid=(pid_t)temp) > 0)) {
- snprintf(procfn,256,"/proc/%u",dhcpid);
- dhc_running = (access(procfn, F_OK) == 0);
-@@ -3077,7 +3077,7 @@ void rewrite_client_leases ()
-
- if (leaseFile != NULL)
- fclose (leaseFile);
-- leaseFile = fopen (path_dhclient_db, "w");
-+ leaseFile = fopen (path_dhclient_db, "we");
- if (leaseFile == NULL) {
- log_error ("can't create %s: %m", path_dhclient_db);
- return;
-@@ -3261,7 +3261,7 @@ write_duid(struct data_string *duid)
- return DHCP_R_INVALIDARG;
-
- if (leaseFile == NULL) { /* XXX? */
-- leaseFile = fopen(path_dhclient_db, "w");
-+ leaseFile = fopen(path_dhclient_db, "we");
- if (leaseFile == NULL) {
- log_error("can't create %s: %m", path_dhclient_db);
- return ISC_R_IOERROR;
-@@ -3441,7 +3441,7 @@ int write_client_lease (client, lease, r
- return 1;
-
- if (leaseFile == NULL) { /* XXX */
-- leaseFile = fopen (path_dhclient_db, "w");
-+ leaseFile = fopen (path_dhclient_db, "we");
- if (leaseFile == NULL) {
- log_error ("can't create %s: %m", path_dhclient_db);
- return 0;
-@@ -3952,9 +3952,9 @@ void go_daemon ()
- (void) close(2);
-
- /* Reopen them on /dev/null. */
-- (void) open("/dev/null", O_RDWR);
-- (void) open("/dev/null", O_RDWR);
-- (void) open("/dev/null", O_RDWR);
-+ (void) open("/dev/null", O_RDWR | O_CLOEXEC);
-+ (void) open("/dev/null", O_RDWR | O_CLOEXEC);
-+ (void) open("/dev/null", O_RDWR | O_CLOEXEC);
-
- write_client_pid_file ();
-
-@@ -3971,14 +3971,14 @@ void write_client_pid_file ()
- return;
- }
-
-- pfdesc = open (path_dhclient_pid, O_CREAT | O_TRUNC | O_WRONLY, 0644);
-+ pfdesc = open (path_dhclient_pid, O_CREAT | O_TRUNC | O_WRONLY | O_CLOEXEC, 0644);
-
- if (pfdesc < 0) {
- log_error ("Can't create %s: %m", path_dhclient_pid);
- return;
- }
-
-- pf = fdopen (pfdesc, "w");
-+ pf = fdopen (pfdesc, "we");
- if (!pf) {
- close(pfdesc);
- log_error ("Can't fdopen %s: %m", path_dhclient_pid);
-diff -up dhcp-4.3.0a1/common/bpf.c.cloexec dhcp-4.3.0a1/common/bpf.c
---- dhcp-4.3.0a1/common/bpf.c.cloexec 2013-12-19 15:34:41.640886227 +0100
-+++ dhcp-4.3.0a1/common/bpf.c 2013-12-19 15:34:41.661885928 +0100
-@@ -95,7 +95,7 @@ int if_register_bpf (info)
- for (b = 0; 1; b++) {
- /* %Audit% 31 bytes max. %2004.06.17,Safe% */
- sprintf(filename, BPF_FORMAT, b);
-- sock = open (filename, O_RDWR, 0);
-+ sock = open (filename, O_RDWR | O_CLOEXEC, 0);
- if (sock < 0) {
- if (errno == EBUSY) {
- continue;
-diff -up dhcp-4.3.0a1/common/dlpi.c.cloexec dhcp-4.3.0a1/common/dlpi.c
---- dhcp-4.3.0a1/common/dlpi.c.cloexec 2013-12-19 15:34:41.641886213 +0100
-+++ dhcp-4.3.0a1/common/dlpi.c 2013-12-19 15:34:41.662885914 +0100
-@@ -804,7 +804,7 @@ dlpiopen(const char *ifname) {
- }
- *dp = '\0';
-
-- return open (devname, O_RDWR, 0);
-+ return open (devname, O_RDWR | O_CLOEXEC, 0);
- }
-
- /*
-diff -up dhcp-4.3.0a1/common/nit.c.cloexec dhcp-4.3.0a1/common/nit.c
---- dhcp-4.3.0a1/common/nit.c.cloexec 2013-12-19 15:34:41.642886199 +0100
-+++ dhcp-4.3.0a1/common/nit.c 2013-12-19 15:34:41.662885914 +0100
-@@ -81,7 +81,7 @@ int if_register_nit (info)
- struct strioctl sio;
-
- /* Open a NIT device */
-- sock = open ("/dev/nit", O_RDWR);
-+ sock = open ("/dev/nit", O_RDWR | O_CLOEXEC);
- if (sock < 0)
- log_fatal ("Can't open NIT device for %s: %m", info -> name);
-
-diff -up dhcp-4.3.0a1/common/resolv.c.cloexec dhcp-4.3.0a1/common/resolv.c
---- dhcp-4.3.0a1/common/resolv.c.cloexec 2013-12-11 01:25:12.000000000 +0100
-+++ dhcp-4.3.0a1/common/resolv.c 2013-12-19 15:34:41.663885900 +0100
-@@ -50,7 +50,7 @@ void read_resolv_conf (parse_time)
- struct domain_search_list *dp, *dl, *nd;
- isc_result_t status;
-
-- if ((file = open (path_resolv_conf, O_RDONLY)) < 0) {
-+ if ((file = open (path_resolv_conf, O_RDONLY | O_CLOEXEC)) < 0) {
- log_error ("Can't open %s: %m", path_resolv_conf);
- return;
- }
-diff -up dhcp-4.3.0a1/common/upf.c.cloexec dhcp-4.3.0a1/common/upf.c
---- dhcp-4.3.0a1/common/upf.c.cloexec 2013-12-19 15:34:41.642886199 +0100
-+++ dhcp-4.3.0a1/common/upf.c 2013-12-19 15:34:41.663885900 +0100
-@@ -77,7 +77,7 @@ int if_register_upf (info)
- /* %Audit% Cannot exceed 36 bytes. %2004.06.17,Safe% */
- sprintf(filename, "/dev/pf/pfilt%d", b);
-
-- sock = open (filename, O_RDWR, 0);
-+ sock = open (filename, O_RDWR | O_CLOEXEC, 0);
- if (sock < 0) {
- if (errno == EBUSY) {
- continue;
-diff -up dhcp-4.3.0a1/omapip/trace.c.cloexec dhcp-4.3.0a1/omapip/trace.c
---- dhcp-4.3.0a1/omapip/trace.c.cloexec 2013-12-11 01:01:03.000000000 +0100
-+++ dhcp-4.3.0a1/omapip/trace.c 2013-12-19 15:34:41.663885900 +0100
-@@ -142,10 +142,10 @@ isc_result_t trace_begin (const char *fi
- return DHCP_R_INVALIDARG;
- }
-
-- traceoutfile = open (filename, O_CREAT | O_WRONLY | O_EXCL, 0600);
-+ traceoutfile = open (filename, O_CREAT | O_WRONLY | O_EXCL | O_CLOEXEC, 0600);
- if (traceoutfile < 0 && errno == EEXIST) {
- log_error ("WARNING: Overwriting trace file \"%s\"", filename);
-- traceoutfile = open (filename, O_WRONLY | O_EXCL | O_TRUNC,
-+ traceoutfile = open (filename, O_WRONLY | O_EXCL | O_TRUNC | O_CLOEXEC,
- 0600);
- }
-
-@@ -433,7 +433,7 @@ void trace_file_replay (const char *file
- isc_result_t result;
- int len;
-
-- traceinfile = fopen (filename, "r");
-+ traceinfile = fopen (filename, "re");
- if (!traceinfile) {
- log_error("Can't open tracefile %s: %m", filename);
- return;
-diff -up dhcp-4.3.0a1/relay/dhcrelay.c.cloexec dhcp-4.3.0a1/relay/dhcrelay.c
---- dhcp-4.3.0a1/relay/dhcrelay.c.cloexec 2013-12-13 22:26:21.000000000 +0100
-+++ dhcp-4.3.0a1/relay/dhcrelay.c 2013-12-19 15:34:41.664885886 +0100
-@@ -193,11 +193,11 @@ main(int argc, char **argv) {
- /* Make sure that file descriptors 0(stdin), 1,(stdout), and
- 2(stderr) are open. To do this, we assume that when we
- open a file the lowest available file descriptor is used. */
-- fd = open("/dev/null", O_RDWR);
-+ fd = open("/dev/null", O_RDWR | O_CLOEXEC);
- if (fd == 0)
-- fd = open("/dev/null", O_RDWR);
-+ fd = open("/dev/null", O_RDWR | O_CLOEXEC);
- if (fd == 1)
-- fd = open("/dev/null", O_RDWR);
-+ fd = open("/dev/null", O_RDWR | O_CLOEXEC);
- if (fd == 2)
- log_perror = 0; /* No sense logging to /dev/null. */
- else if (fd != -1)
-@@ -564,13 +564,13 @@ main(int argc, char **argv) {
-
- if (no_pid_file == ISC_FALSE) {
- pfdesc = open(path_dhcrelay_pid,
-- O_CREAT | O_TRUNC | O_WRONLY, 0644);
-+ O_CREAT | O_TRUNC | O_WRONLY | O_CLOEXEC, 0644);
-
- if (pfdesc < 0) {
- log_error("Can't create %s: %m",
- path_dhcrelay_pid);
- } else {
-- pf = fdopen(pfdesc, "w");
-+ pf = fdopen(pfdesc, "we");
- if (!pf)
- log_error("Can't fdopen %s: %m",
- path_dhcrelay_pid);
-diff -up dhcp-4.3.0a1/server/confpars.c.cloexec dhcp-4.3.0a1/server/confpars.c
---- dhcp-4.3.0a1/server/confpars.c.cloexec 2013-12-11 01:25:12.000000000 +0100
-+++ dhcp-4.3.0a1/server/confpars.c 2013-12-19 15:34:41.665885871 +0100
-@@ -117,7 +117,7 @@ isc_result_t read_conf_file (const char
- }
- #endif
-
-- if ((file = open (filename, O_RDONLY)) < 0) {
-+ if ((file = open (filename, O_RDONLY | O_CLOEXEC)) < 0) {
- if (leasep) {
- log_error ("Can't open lease database %s: %m --",
- path_dhcpd_db);
-diff -up dhcp-4.3.0a1/server/db.c.cloexec dhcp-4.3.0a1/server/db.c
---- dhcp-4.3.0a1/server/db.c.cloexec 2013-12-11 01:25:12.000000000 +0100
-+++ dhcp-4.3.0a1/server/db.c 2013-12-19 15:34:41.666885857 +0100
-@@ -1081,7 +1081,7 @@ void db_startup (testp)
- }
- #endif
- if (!testp) {
-- db_file = fopen (path_dhcpd_db, "a");
-+ db_file = fopen (path_dhcpd_db, "ae");
- if (!db_file)
- log_fatal ("Can't open %s for append.", path_dhcpd_db);
- expire_all_pools ();
-@@ -1129,12 +1129,12 @@ int new_lease_file ()
- path_dhcpd_db, (int)t) >= sizeof newfname)
- log_fatal("new_lease_file: lease file path too long");
-
-- db_fd = open (newfname, O_WRONLY | O_TRUNC | O_CREAT, 0664);
-+ db_fd = open (newfname, O_WRONLY | O_TRUNC | O_CREAT | O_CLOEXEC, 0664);
- if (db_fd < 0) {
- log_error ("Can't create new lease file: %m");
- return 0;
- }
-- if ((new_db_file = fdopen(db_fd, "w")) == NULL) {
-+ if ((new_db_file = fdopen(db_fd, "we")) == NULL) {
- log_error("Can't fdopen new lease file: %m");
- close(db_fd);
- goto fdfail;
-diff -up dhcp-4.3.0a1/server/dhcpd.c.cloexec dhcp-4.3.0a1/server/dhcpd.c
---- dhcp-4.3.0a1/server/dhcpd.c.cloexec 2013-12-13 22:26:01.000000000 +0100
-+++ dhcp-4.3.0a1/server/dhcpd.c 2013-12-19 15:37:17.258674472 +0100
-@@ -193,11 +193,11 @@ main(int argc, char **argv) {
- /* Make sure that file descriptors 0 (stdin), 1, (stdout), and
- 2 (stderr) are open. To do this, we assume that when we
- open a file the lowest available file descriptor is used. */
-- fd = open("/dev/null", O_RDWR);
-+ fd = open("/dev/null", O_RDWR | O_CLOEXEC);
- if (fd == 0)
-- fd = open("/dev/null", O_RDWR);
-+ fd = open("/dev/null", O_RDWR | O_CLOEXEC);
- if (fd == 1)
-- fd = open("/dev/null", O_RDWR);
-+ fd = open("/dev/null", O_RDWR | O_CLOEXEC);
- if (fd == 2)
- log_perror = 0; /* No sense logging to /dev/null. */
- else if (fd != -1)
-@@ -716,7 +716,7 @@ main(int argc, char **argv) {
- */
- if (no_pid_file == ISC_FALSE) {
- /*Read previous pid file. */
-- if ((i = open (path_dhcpd_pid, O_RDONLY)) >= 0) {
-+ if ((i = open (path_dhcpd_pid, O_RDONLY | O_CLOEXEC)) >= 0) {
- status = read(i, pbuf, (sizeof pbuf) - 1);
- close (i);
- if (status > 0) {
-@@ -735,7 +735,7 @@ main(int argc, char **argv) {
- }
-
- /* Write new pid file. */
-- i = open(path_dhcpd_pid, O_WRONLY|O_CREAT|O_TRUNC, 0644);
-+ i = open(path_dhcpd_pid, O_WRONLY|O_CREAT|O_TRUNC|O_CLOEXEC, 0644);
- if (i >= 0) {
- sprintf(pbuf, "%d\n", (int) getpid());
- IGNORE_RET (write(i, pbuf, strlen(pbuf)));
-@@ -763,9 +763,9 @@ main(int argc, char **argv) {
- (void) close(2);
-
- /* Reopen them on /dev/null. */
-- (void) open("/dev/null", O_RDWR);
-- (void) open("/dev/null", O_RDWR);
-- (void) open("/dev/null", O_RDWR);
-+ (void) open("/dev/null", O_RDWR | O_CLOEXEC);
-+ (void) open("/dev/null", O_RDWR | O_CLOEXEC);
-+ (void) open("/dev/null", O_RDWR | O_CLOEXEC);
- log_perror = 0; /* No sense logging to /dev/null. */
-
- IGNORE_RET (chdir("/"));
-diff -up dhcp-4.3.0a1/server/ldap.c.cloexec dhcp-4.3.0a1/server/ldap.c
---- dhcp-4.3.0a1/server/ldap.c.cloexec 2013-12-11 01:25:12.000000000 +0100
-+++ dhcp-4.3.0a1/server/ldap.c 2013-12-19 15:34:41.667885843 +0100
-@@ -684,7 +684,7 @@ ldap_start (void)
-
- if (ldap_debug_file != NULL && ldap_debug_fd == -1)
- {
-- if ((ldap_debug_fd = open (ldap_debug_file, O_CREAT | O_TRUNC | O_WRONLY,
-+ if ((ldap_debug_fd = open (ldap_debug_file, O_CREAT | O_TRUNC | O_WRONLY | O_CLOEXEC,
- S_IRUSR | S_IWUSR)) < 0)
- log_error ("Error opening debug LDAP log file %s: %s", ldap_debug_file,
- strerror (errno));
deleted file mode 100644
@@ -1,150 +0,0 @@
-diff -up dhcp-4.3.1b1/client/dhc6.c.mRfpsB dhcp-4.3.1b1/client/dhc6.c
---- dhcp-4.3.1b1/client/dhc6.c.mRfpsB 2014-07-10 17:48:03.779424870 +0200
-+++ dhcp-4.3.1b1/client/dhc6.c 2014-07-10 17:48:03.795424644 +0200
-@@ -5088,7 +5088,8 @@ make_client6_options(struct client_state
- */
- if ((oc = lookup_option(&dhcpv6_universe, *op,
- D6O_CLIENTID)) == NULL) {
-- if (!option_cache(&oc, &default_duid, NULL, clientid_option,
-+ if (default_duid.len == 0 ||
-+ !option_cache(&oc, &default_duid, NULL, clientid_option,
- MDL))
- log_fatal("Failure assembling a DUID.");
-
-diff -up dhcp-4.3.1b1/client/dhclient.c.mRfpsB dhcp-4.3.1b1/client/dhclient.c
---- dhcp-4.3.1b1/client/dhclient.c.mRfpsB 2014-07-10 17:39:25.853763858 +0200
-+++ dhcp-4.3.1b1/client/dhclient.c 2014-07-10 17:49:49.882925843 +0200
-@@ -948,8 +948,8 @@ main(int argc, char **argv) {
- if (default_duid.buffer != NULL)
- data_string_forget(&default_duid, MDL);
-
-- form_duid(&default_duid, MDL);
-- write_duid(&default_duid);
-+ if (form_duid(&default_duid, MDL) == ISC_R_SUCCESS)
-+ write_duid(&default_duid);
- }
- }
-
-@@ -3267,7 +3267,7 @@ write_options(struct client_state *clien
- * is not how it is intended. Upcoming rearchitecting the client should
- * address this "one daemon model."
- */
--void
-+isc_result_t
- form_duid(struct data_string *duid, const char *file, int line)
- {
- struct interface_info *ip;
-@@ -3280,6 +3280,15 @@ form_duid(struct data_string *duid, cons
- if (ip == NULL)
- log_fatal("Impossible condition at %s:%d.", MDL);
-
-+ while (ip && ip->hw_address.hbuf[0] == HTYPE_RESERVED) {
-+ /* Try the other interfaces */
-+ log_debug("Cannot form default DUID from interface %s.", ip->name);
-+ ip = ip->next;
-+ }
-+ if (ip == NULL) {
-+ return ISC_R_UNEXPECTED;
-+ }
-+
- if ((ip->hw_address.hlen == 0) ||
- (ip->hw_address.hlen > sizeof(ip->hw_address.hbuf)))
- log_fatal("Impossible hardware address length at %s:%d.", MDL);
-@@ -3323,6 +3332,8 @@ form_duid(struct data_string *duid, cons
- log_info("Created duid %s.", str);
- dfree(str, MDL);
- }
-+
-+ return ISC_R_SUCCESS;
- }
-
- /* Write the default DUID to the lease store. */
-diff -up dhcp-4.3.1b1/common/bpf.c.mRfpsB dhcp-4.3.1b1/common/bpf.c
---- dhcp-4.3.1b1/common/bpf.c.mRfpsB 2014-07-10 17:39:25.797764653 +0200
-+++ dhcp-4.3.1b1/common/bpf.c 2014-07-10 17:48:03.797424616 +0200
-@@ -600,6 +600,22 @@ get_hw_addr(const char *name, struct har
- memcpy(&hw->hbuf[1], LLADDR(sa), sa->sdl_alen);
- break;
- #endif /* IFT_FDDI */
-+#if defined(IFT_PPP)
-+ case IFT_PPP:
-+ if (local_family != AF_INET6)
-+ log_fatal("Unsupported device type %d for \"%s\"",
-+ sa->sdl_type, name);
-+ hw->hlen = 0;
-+ hw->hbuf[0] = HTYPE_RESERVED;
-+ /* 0xdeadbeef should never occur on the wire,
-+ * and is a signature that something went wrong.
-+ */
-+ hw->hbuf[1] = 0xde;
-+ hw->hbuf[2] = 0xad;
-+ hw->hbuf[3] = 0xbe;
-+ hw->hbuf[4] = 0xef;
-+ break;
-+#endif
- default:
- log_fatal("Unsupported device type %d for \"%s\"",
- sa->sdl_type, name);
-diff -up dhcp-4.3.1b1/common/lpf.c.mRfpsB dhcp-4.3.1b1/common/lpf.c
---- dhcp-4.3.1b1/common/lpf.c.mRfpsB 2014-07-10 17:39:25.744765404 +0200
-+++ dhcp-4.3.1b1/common/lpf.c 2014-07-10 17:48:03.797424616 +0200
-@@ -511,6 +511,22 @@ get_hw_addr(const char *name, struct har
- hw->hbuf[0] = HTYPE_FDDI;
- memcpy(&hw->hbuf[1], sa->sa_data, 6);
- break;
-+#if defined(ARPHRD_PPP)
-+ case ARPHRD_PPP:
-+ if (local_family != AF_INET6)
-+ log_fatal("Unsupported device type %d for \"%s\"",
-+ sa->sa_family, name);
-+ hw->hlen = 0;
-+ hw->hbuf[0] = HTYPE_RESERVED;
-+ /* 0xdeadbeef should never occur on the wire,
-+ * and is a signature that something went wrong.
-+ */
-+ hw->hbuf[1] = 0xde;
-+ hw->hbuf[2] = 0xad;
-+ hw->hbuf[3] = 0xbe;
-+ hw->hbuf[4] = 0xef;
-+ break;
-+#endif
- default:
- log_fatal("Unsupported device type %ld for \"%s\"",
- (long int)sa->sa_family, name);
-diff -up dhcp-4.3.1b1/includes/dhcpd.h.mRfpsB dhcp-4.3.1b1/includes/dhcpd.h
---- dhcp-4.3.1b1/includes/dhcpd.h.mRfpsB 2014-07-10 17:48:03.761425124 +0200
-+++ dhcp-4.3.1b1/includes/dhcpd.h 2014-07-10 17:48:03.798424601 +0200
-@@ -2839,7 +2839,7 @@ void client_dns_remove(struct client_sta
-
- void dhcpv4_client_assignments(void);
- void dhcpv6_client_assignments(void);
--void form_duid(struct data_string *duid, const char *file, int line);
-+isc_result_t form_duid(struct data_string *duid, const char *file, int line);
-
- /* dhc6.c */
- void dhc6_lease_destroy(struct dhc6_lease **src, const char *file, int line);
-diff -up dhcp-4.3.1b1/includes/dhcp.h.mRfpsB dhcp-4.3.1b1/includes/dhcp.h
---- dhcp-4.3.1b1/includes/dhcp.h.mRfpsB 2014-07-10 17:48:03.761425124 +0200
-+++ dhcp-4.3.1b1/includes/dhcp.h 2014-07-10 17:48:03.798424601 +0200
-@@ -81,6 +81,8 @@ struct dhcp_packet {
- * is no standard for this so we
- * just steal a type */
-
-+#define HTYPE_RESERVED 0 /* RFC 5494 */
-+
- /* Magic cookie validating dhcp options field (and bootp vendor
- extensions field). */
- #define DHCP_OPTIONS_COOKIE "\143\202\123\143"
-diff -up dhcp-4.3.1b1/server/dhcpv6.c.mRfpsB dhcp-4.3.1b1/server/dhcpv6.c
---- dhcp-4.3.1b1/server/dhcpv6.c.mRfpsB 2014-07-10 17:47:31.464881409 +0200
-+++ dhcp-4.3.1b1/server/dhcpv6.c 2014-07-10 17:48:03.800424573 +0200
-@@ -330,6 +330,9 @@ generate_new_server_duid(void) {
- if (p->hw_address.hlen > 0) {
- break;
- }
-+ if (p->next == NULL && p->hw_address.hbuf[0] == HTYPE_RESERVED) {
-+ log_error("Can not generate DUID from interfaces which do not have hardware addresses, please configure server-duid!");
-+ }
- }
- if (p == NULL) {
- return ISC_R_UNEXPECTED;
deleted file mode 100644
@@ -1,241 +0,0 @@
-diff -up dhcp-4.3.1b1/server/dhcpv6.c.UseMulticast dhcp-4.3.1b1/server/dhcpv6.c
---- dhcp-4.3.1b1/server/dhcpv6.c.UseMulticast 2014-07-02 19:58:40.000000000 +0200
-+++ dhcp-4.3.1b1/server/dhcpv6.c 2014-07-10 18:20:03.066256219 +0200
-@@ -376,6 +376,48 @@ generate_new_server_duid(void) {
- }
-
- /*
-+ * Is the D6O_UNICAST option defined in dhcpd.conf ?
-+ */
-+static isc_boolean_t unicast_option_defined;
-+
-+/*
-+ * Did we already search dhcpd.conf for D6O_UNICAST option ?
-+ * We need to store it here to not parse dhcpd.conf repeatedly.
-+ */
-+static isc_boolean_t unicast_option_parsed = ISC_FALSE;
-+
-+
-+/*
-+ * Is the D6O_UNICAST option defined in dhcpd.conf ?
-+ */
-+isc_boolean_t
-+is_unicast_option_defined(void) {
-+ struct option_state *opt_state;
-+ struct option_cache *oc;
-+
-+ /*
-+ * If we are looking for the unicast option for the first time
-+ */
-+ if (unicast_option_parsed == ISC_FALSE) {
-+ unicast_option_parsed = ISC_TRUE;
-+ opt_state = NULL;
-+ if (!option_state_allocate(&opt_state, MDL)) {
-+ log_fatal("No memory for option state.");
-+ }
-+
-+ execute_statements_in_scope(NULL, NULL, NULL, NULL, NULL,
-+ opt_state, &global_scope, root_group, NULL, NULL);
-+
-+ oc = lookup_option(&dhcpv6_universe, opt_state, D6O_UNICAST);
-+ unicast_option_defined = (oc != NULL);
-+
-+ option_state_dereference(&opt_state, MDL);
-+ }
-+
-+ return (unicast_option_defined);
-+}
-+
-+/*
- * Get the client identifier from the packet.
- */
- isc_result_t
-@@ -706,6 +748,12 @@ static const int required_opts[] = {
- D6O_PREFERENCE,
- 0
- };
-+static const int required_opts_NAA[] = {
-+ D6O_CLIENTID,
-+ D6O_SERVERID,
-+ D6O_STATUS_CODE,
-+ 0
-+};
- static const int required_opts_solicit[] = {
- D6O_CLIENTID,
- D6O_SERVERID,
-@@ -1587,6 +1635,56 @@ lease_to_client(struct data_string *repl
- reply.shared->group, NULL);
- }
-
-+ /* reject unicast message, unless we set unicast option */
-+ if ((packet->unicast == ISC_TRUE) && !is_unicast_option_defined())
-+ /*
-+ * RFC3315 section 18.2.1 (Request):
-+ *
-+ * When the server receives a Request message via unicast from a client
-+ * to which the server has not sent a unicast option, the server
-+ * discards the Request message and responds with a Reply message
-+ * containing a Status Code option with the value UseMulticast, a Server
-+ * Identifier option containing the server's DUID, the Client Identifier
-+ * option from the client message, and no other options.
-+ *
-+ * Section 18.2.3 (Renew):
-+ *
-+ * When the server receives a Renew message via unicast from a client to
-+ * which the server has not sent a unicast option, the server discards
-+ * the Renew message and responds with a Reply message containing a
-+ * Status Code option with the value UseMulticast, a Server Identifier
-+ * option containing the server's DUID, the Client Identifier option
-+ * from the client message, and no other options.
-+ */
-+ {
-+ /* Set the UseMulticast status code. */
-+ if (!set_status_code(STATUS_UseMulticast,
-+ "Unicast not allowed by server.",
-+ reply.opt_state)) {
-+ log_error("lease_to_client: Unable to set "
-+ "UseMulticast status code.");
-+ goto exit;
-+ }
-+
-+ /* Rewind the cursor to the start. */
-+ reply.cursor = REPLY_OPTIONS_INDEX;
-+
-+ /*
-+ * Produce an reply that includes only:
-+ *
-+ * Status code.
-+ * Server DUID.
-+ * Client DUID.
-+ */
-+ reply.cursor += store_options6((char *)reply.buf.data +
-+ reply.cursor,
-+ sizeof(reply.buf) -
-+ reply.cursor,
-+ reply.opt_state, reply.packet,
-+ required_opts_NAA,
-+ NULL);
-+ }
-+
- /*
- * RFC3315 section 17.2.2 (Solicit):
- *
-@@ -1619,6 +1717,7 @@ lease_to_client(struct data_string *repl
- * Having stored the client's IA's, store any options that
- * will fit in the remaining space.
- */
-+ else
- reply.cursor += store_options6((char *)reply.buf.data + reply.cursor,
- sizeof(reply.buf) - reply.cursor,
- reply.opt_state, reply.packet,
-@@ -4748,7 +4847,6 @@ dhcpv6_solicit(struct data_string *reply
- * Very similar to Solicit handling, except the server DUID is required.
- */
-
--/* TODO: reject unicast messages, unless we set unicast option */
- static void
- dhcpv6_request(struct data_string *reply_ret, struct packet *packet) {
- struct data_string client_id;
-@@ -5078,7 +5176,6 @@ exit:
- * except for the error code of when addresses don't match.
- */
-
--/* TODO: reject unicast messages, unless we set unicast option */
- static void
- dhcpv6_renew(struct data_string *reply, struct packet *packet) {
- struct data_string client_id;
-@@ -5322,18 +5419,60 @@ iterate_over_ia_na(struct data_string *r
- goto exit;
- }
-
-- snprintf(status_msg, sizeof(status_msg), "%s received.", packet_type);
-- if (!set_status_code(STATUS_Success, status_msg, opt_state)) {
-- goto exit;
-- }
-+ /* reject unicast message, unless we set unicast option */
-+ if ((packet->unicast == ISC_TRUE) && !is_unicast_option_defined()) {
-+ /*
-+ * RFC3315 section 18.2.6 (Release):
-+ *
-+ * When the server receives a Release message via unicast from a client
-+ * to which the server has not sent a unicast option, the server
-+ * discards the Release message and responds with a Reply message
-+ * containing a Status Code option with value UseMulticast, a Server
-+ * Identifier option containing the server's DUID, the Client Identifier
-+ * option from the client message, and no other options.
-+ *
-+ * Section 18.2.7 (Decline):
-+ *
-+ * When the server receives a Decline message via unicast from a client
-+ * to which the server has not sent a unicast option, the server
-+ * discards the Decline message and responds with a Reply message
-+ * containing a Status Code option with the value UseMulticast, a Server
-+ * Identifier option containing the server's DUID, the Client Identifier
-+ * option from the client message, and no other options.
-+ */
-+ snprintf(status_msg, sizeof(status_msg),
-+ "%s received unicast.", packet_type);
-+ if (!set_status_code(STATUS_UseMulticast, status_msg, opt_state)) {
-+ goto exit;
-+ }
-
-- /*
-- * Add our options that are not associated with any IA_NA or IA_TA.
-- */
-- reply_ofs += store_options6(reply_data+reply_ofs,
-- sizeof(reply_data)-reply_ofs,
-+ /*
-+ * Produce an reply that includes only:
-+ *
-+ * Status code.
-+ * Server DUID.
-+ * Client DUID.
-+ */
-+ reply_ofs += store_options6(reply_data+reply_ofs,
-+ sizeof(reply_data)-reply_ofs,
- opt_state, packet,
-- required_opts, NULL);
-+ required_opts_NAA, NULL);
-+
-+ goto return_reply;
-+ } else {
-+ snprintf(status_msg, sizeof(status_msg), "%s received.", packet_type);
-+ if (!set_status_code(STATUS_Success, status_msg, opt_state)) {
-+ goto exit;
-+ }
-+
-+ /*
-+ * Add our options that are not associated with any IA_NA or IA_TA.
-+ */
-+ reply_ofs += store_options6(reply_data+reply_ofs,
-+ sizeof(reply_data)-reply_ofs,
-+ opt_state, packet,
-+ required_opts, NULL);
-+ }
-
- /*
- * Loop through the IA_NA reported by the client, and deal with
-@@ -5471,6 +5610,7 @@ iterate_over_ia_na(struct data_string *r
- /*
- * Return our reply to the caller.
- */
-+return_reply:
- reply_ret->len = reply_ofs;
- reply_ret->buffer = NULL;
- if (!buffer_allocate(&reply_ret->buffer, reply_ofs, MDL)) {
-@@ -5516,7 +5656,6 @@ exit:
- * we still need to be aware of this possibility.
- */
-
--/* TODO: reject unicast messages, unless we set unicast option */
- /* TODO: IA_TA */
- static void
- dhcpv6_decline(struct data_string *reply, struct packet *packet) {
-@@ -5986,7 +6125,6 @@ exit:
- * Release means a client is done with the leases.
- */
-
--/* TODO: reject unicast messages, unless we set unicast option */
- static void
- dhcpv6_release(struct data_string *reply, struct packet *packet) {
- struct data_string client_id;
deleted file mode 100644
@@ -1,14 +0,0 @@
-diff -up dhcp-4.3.0a1/common/dispatch.c.dracut dhcp-4.3.0a1/common/dispatch.c
---- dhcp-4.3.0a1/common/dispatch.c.dracut 2013-12-11 01:25:12.000000000 +0100
-+++ dhcp-4.3.0a1/common/dispatch.c 2013-12-19 15:39:50.350505860 +0100
-@@ -210,6 +210,10 @@ void add_timeout (when, where, what, ref
- isc_interval_t interval;
- isc_time_t expires;
-
-+ if (when == NULL) {
-+ return;
-+ }
-+
- /* See if this timeout supersedes an existing timeout. */
- t = (struct timeout *)0;
- for (q = timeouts; q; q = q->next) {
deleted file mode 100644
@@ -1,250 +0,0 @@
-diff -up dhcp-4.3.1b1/client/dhclient.8.zzftXp dhcp-4.3.1b1/client/dhclient.8
---- dhcp-4.3.1b1/client/dhclient.8.zzftXp 2014-07-10 17:38:26.938599402 +0200
-+++ dhcp-4.3.1b1/client/dhclient.8 2014-07-10 17:39:25.852763873 +0200
-@@ -128,6 +128,9 @@ dhclient - Dynamic Host Configuration Pr
- .B -w
- ]
- [
-+.B -nc
-+]
-+[
- .B -B
- ]
- [
-@@ -304,6 +307,32 @@ has been added or removed, so that the c
- address on that interface.
-
- .TP
-+.BI \-nc
-+Do not drop capabilities.
-+
-+Normally, if
-+.B dhclient
-+was compiled with libcap-ng support,
-+.B dhclient
-+drops most capabilities immediately upon startup. While more secure,
-+this greatly restricts the additional actions that hooks in
-+.B dhclient-script (8)
-+can take. (For example, any daemons that
-+.B dhclient-script (8)
-+starts or restarts will inherit the restricted capabilities as well,
-+which may interfere with their correct operation.) Thus, the
-+.BI \-nc
-+option can be used to prevent
-+.B dhclient
-+from dropping capabilities.
-+
-+The
-+.BI \-nc
-+option is ignored if
-+.B dhclient
-+was not compiled with libcap-ng support.
-+
-+.TP
- .BI \-B
- Set the BOOTP broadcast flag in request packets so servers will always
- broadcast replies.
-diff -up dhcp-4.3.1b1/client/dhclient.c.zzftXp dhcp-4.3.1b1/client/dhclient.c
---- dhcp-4.3.1b1/client/dhclient.c.zzftXp 2014-07-10 17:39:25.797764653 +0200
-+++ dhcp-4.3.1b1/client/dhclient.c 2014-07-10 17:39:25.853763858 +0200
-@@ -39,6 +39,10 @@
- #include <limits.h>
- #include <dns/result.h>
-
-+#ifdef HAVE_LIBCAP_NG
-+#include <cap-ng.h>
-+#endif
-+
- /*
- * Defined in stdio.h when _GNU_SOURCE is set, but we don't want to define
- * that when building ISC code.
-@@ -143,6 +147,9 @@ main(int argc, char **argv) {
- int timeout_arg = 0;
- char *arg_conf = NULL;
- int arg_conf_len = 0;
-+#ifdef HAVE_LIBCAP_NG
-+ int keep_capabilities = 0;
-+#endif
-
- /* Initialize client globals. */
- memset(&default_duid, 0, sizeof(default_duid));
-@@ -425,6 +432,10 @@ main(int argc, char **argv) {
- }
-
- dhclient_request_options = argv[i];
-+ } else if (!strcmp(argv[i], "-nc")) {
-+#ifdef HAVE_LIBCAP_NG
-+ keep_capabilities = 1;
-+#endif
- } else if (argv[i][0] == '-') {
- usage();
- } else if (interfaces_requested < 0) {
-@@ -473,6 +484,19 @@ main(int argc, char **argv) {
- path_dhclient_script = s;
- }
-
-+#ifdef HAVE_LIBCAP_NG
-+ /* Drop capabilities */
-+ if (!keep_capabilities) {
-+ capng_clear(CAPNG_SELECT_CAPS);
-+ capng_update(CAPNG_ADD, CAPNG_EFFECTIVE|CAPNG_PERMITTED,
-+ CAP_DAC_OVERRIDE); // Drop this someday
-+ capng_updatev(CAPNG_ADD, CAPNG_EFFECTIVE|CAPNG_PERMITTED,
-+ CAP_NET_ADMIN, CAP_NET_RAW,
-+ CAP_NET_BIND_SERVICE, CAP_SYS_ADMIN, -1);
-+ capng_apply(CAPNG_SELECT_CAPS);
-+ }
-+#endif
-+
- /* Set up the initial dhcp option universe. */
- initialize_common_option_spaces();
-
-diff -up dhcp-4.3.1b1/client/dhclient-script.8.zzftXp dhcp-4.3.1b1/client/dhclient-script.8
---- dhcp-4.3.1b1/client/dhclient-script.8.zzftXp 2014-07-10 17:39:25.761765163 +0200
-+++ dhcp-4.3.1b1/client/dhclient-script.8 2014-07-10 17:39:25.851763887 +0200
-@@ -243,6 +243,16 @@ repeatedly initialized to the values pro
- the other. Assuming the information provided by both servers is
- valid, this shouldn't cause any real problems, but it could be
- confusing.
-+.PP
-+Normally, if dhclient was compiled with libcap-ng support,
-+dhclient drops most capabilities immediately upon startup.
-+While more secure, this greatly restricts the additional actions that
-+hooks in dhclient-script can take. For example, any daemons that
-+dhclient-script starts or restarts will inherit the restricted
-+capabilities as well, which may interfere with their correct operation.
-+Thus, the
-+.BI \-nc
-+option can be used to prevent dhclient from dropping capabilities.
- .SH SEE ALSO
- dhclient(8), dhcpd(8), dhcrelay(8), dhclient.conf(5) and
- dhclient.leases(5).
-diff -up dhcp-4.3.1b1/client/Makefile.am.zzftXp dhcp-4.3.1b1/client/Makefile.am
---- dhcp-4.3.1b1/client/Makefile.am.zzftXp 2014-07-10 17:38:10.778828583 +0200
-+++ dhcp-4.3.1b1/client/Makefile.am 2014-07-10 17:39:25.851763887 +0200
-@@ -10,7 +10,7 @@ dhclient_SOURCES = clparse.c dhclient.c
- scripts/bsdos scripts/freebsd scripts/linux scripts/macos \
- scripts/netbsd scripts/nextstep scripts/openbsd \
- scripts/solaris scripts/openwrt
--dhclient_LDADD = ../common/libdhcp.a ../omapip/libomapi.a \
-+dhclient_LDADD = ../common/libdhcp.a ../omapip/libomapi.la $(CAPNG_LDADD) \
- $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
- man_MANS = dhclient.8 dhclient-script.8 dhclient.conf.5 dhclient.leases.5
- EXTRA_DIST = $(man_MANS)
-diff -up dhcp-4.3.1b1/configure.ac.zzftXp dhcp-4.3.1b1/configure.ac
---- dhcp-4.3.1b1/configure.ac.zzftXp 2014-07-10 17:38:10.779828569 +0200
-+++ dhcp-4.3.1b1/configure.ac 2014-07-10 17:39:25.854763844 +0200
-@@ -499,6 +499,41 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]],
- # Look for optional headers.
- AC_CHECK_HEADERS(sys/socket.h net/if_dl.h net/if6.h regex.h)
-
-+# look for capabilities library
-+AC_ARG_WITH(libcap-ng,
-+ [ --with-libcap-ng=[auto/yes/no] Add Libcap-ng support [default=auto]],,
-+ with_libcap_ng=auto)
-+
-+# Check for Libcap-ng API
-+#
-+# libcap-ng detection
-+if test x$with_libcap_ng = xno ; then
-+ have_libcap_ng=no;
-+else
-+ # Start by checking for header file
-+ AC_CHECK_HEADER(cap-ng.h, capng_headers=yes, capng_headers=no)
-+
-+ # See if we have libcap-ng library
-+ AC_CHECK_LIB(cap-ng, capng_clear,
-+ CAPNG_LDADD=-lcap-ng,)
-+
-+ # Check results are usable
-+ if test x$with_libcap_ng = xyes -a x$CAPNG_LDADD = x ; then
-+ AC_MSG_ERROR(libcap-ng support was requested and the library was not found)
-+ fi
-+ if test x$CAPNG_LDADD != x -a $capng_headers = no ; then
-+ AC_MSG_ERROR(libcap-ng libraries found but headers are missing)
-+ fi
-+fi
-+AC_SUBST(CAPNG_LDADD)
-+AC_MSG_CHECKING(whether to use libcap-ng)
-+if test x$CAPNG_LDADD != x ; then
-+ AC_DEFINE(HAVE_LIBCAP_NG,1,[libcap-ng support])
-+ AC_MSG_RESULT(yes)
-+else
-+ AC_MSG_RESULT(no)
-+fi
-+
- # Solaris needs some libraries for functions
- AC_SEARCH_LIBS(socket, [socket])
- AC_SEARCH_LIBS(inet_ntoa, [nsl])
-diff -up dhcp-4.3.1b1/relay/dhcrelay.c.zzftXp dhcp-4.3.1b1/relay/dhcrelay.c
---- dhcp-4.3.1b1/relay/dhcrelay.c.zzftXp 2014-07-10 17:39:25.799764624 +0200
-+++ dhcp-4.3.1b1/relay/dhcrelay.c 2014-07-10 17:40:19.191007421 +0200
-@@ -31,6 +31,11 @@
- #include <signal.h>
- #include <sys/time.h>
-
-+#ifdef HAVE_LIBCAP_NG
-+# include <cap-ng.h>
-+ int keep_capabilities = 0;
-+#endif
-+
- TIME default_lease_time = 43200; /* 12 hours... */
- TIME max_lease_time = 86400; /* 24 hours... */
- struct tree_cache *global_options[256];
-@@ -376,6 +381,10 @@ main(int argc, char **argv) {
- usage();
- dhcrelay_sub_id = argv[i];
- #endif
-+ } else if (!strcmp(argv[i], "-nc")) {
-+#ifdef HAVE_LIBCAP_NG
-+ keep_capabilities = 1;
-+#endif
- } else if (!strcmp(argv[i], "-pf")) {
- if (++i == argc)
- usage();
-@@ -446,6 +455,17 @@ main(int argc, char **argv) {
- #endif
- }
-
-+#ifdef HAVE_LIBCAP_NG
-+ /* Drop capabilities */
-+ if (!keep_capabilities) {
-+ capng_clear(CAPNG_SELECT_BOTH);
-+ capng_updatev(CAPNG_ADD, CAPNG_EFFECTIVE|CAPNG_PERMITTED,
-+ CAP_NET_RAW, CAP_NET_BIND_SERVICE, -1);
-+ capng_apply(CAPNG_SELECT_BOTH);
-+ log_info ("Dropped all unnecessary capabilities.");
-+ }
-+#endif
-+
- if (!quiet) {
- log_info("%s %s", message, PACKAGE_VERSION);
- log_info(copyright);
-@@ -598,6 +618,15 @@ main(int argc, char **argv) {
- signal(SIGTERM, dhcp_signal_handler); /* kill */
- #endif
-
-+#ifdef HAVE_LIBCAP_NG
-+ /* Drop all capabilities */
-+ if (!keep_capabilities) {
-+ capng_clear(CAPNG_SELECT_BOTH);
-+ capng_apply(CAPNG_SELECT_BOTH);
-+ log_info ("Dropped all capabilities.");
-+ }
-+#endif
-+
- /* Start dispatching packets and timeouts... */
- dispatch();
-
-diff -up dhcp-4.3.1b1/relay/Makefile.am.zzftXp dhcp-4.3.1b1/relay/Makefile.am
---- dhcp-4.3.1b1/relay/Makefile.am.zzftXp 2014-07-10 17:38:10.780828554 +0200
-+++ dhcp-4.3.1b1/relay/Makefile.am 2014-07-10 17:39:25.854763844 +0200
-@@ -2,7 +2,7 @@ AM_CPPFLAGS = -DLOCALSTATEDIR='"@localst
-
- sbin_PROGRAMS = dhcrelay
- dhcrelay_SOURCES = dhcrelay.c
--dhcrelay_LDADD = ../common/libdhcp.a ../omapip/libomapi.a \
-+dhcrelay_LDADD = ../common/libdhcp.a ../omapip/libomapi.la $(CAPNG_LDADD) \
- $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
- man_MANS = dhcrelay.8
- EXTRA_DIST = $(man_MANS)
deleted file mode 100644
@@ -1,44 +0,0 @@
-diff -up dhcp-4.3.0a1/client/clparse.c.requested dhcp-4.3.0a1/client/clparse.c
---- dhcp-4.3.0a1/client/clparse.c.requested 2013-12-19 15:13:27.276631307 +0100
-+++ dhcp-4.3.0a1/client/clparse.c 2013-12-19 15:13:27.313630789 +0100
-@@ -37,7 +37,7 @@
-
- struct client_config top_level_config;
-
--#define NUM_DEFAULT_REQUESTED_OPTS 9
-+#define NUM_DEFAULT_REQUESTED_OPTS 14
- struct option *default_requested_options[NUM_DEFAULT_REQUESTED_OPTS + 1];
-
- static void parse_client_default_duid(struct parse *cfile);
-@@ -119,6 +119,31 @@ isc_result_t read_client_conf ()
- option_code_hash_lookup(&default_requested_options[8],
- dhcpv6_universe.code_hash, &code, 0, MDL);
-
-+ /* 10 */
-+ code = DHO_NIS_DOMAIN;
-+ option_code_hash_lookup(&default_requested_options[9],
-+ dhcp_universe.code_hash, &code, 0, MDL);
-+
-+ /* 11 */
-+ code = DHO_NIS_SERVERS;
-+ option_code_hash_lookup(&default_requested_options[10],
-+ dhcp_universe.code_hash, &code, 0, MDL);
-+
-+ /* 12 */
-+ code = DHO_NTP_SERVERS;
-+ option_code_hash_lookup(&default_requested_options[11],
-+ dhcp_universe.code_hash, &code, 0, MDL);
-+
-+ /* 13 */
-+ code = DHO_INTERFACE_MTU;
-+ option_code_hash_lookup(&default_requested_options[12],
-+ dhcp_universe.code_hash, &code, 0, MDL);
-+
-+ /* 14 */
-+ code = DHO_DOMAIN_SEARCH;
-+ option_code_hash_lookup(&default_requested_options[13],
-+ dhcp_universe.code_hash, &code, 0, MDL);
-+
- for (code = 0 ; code < NUM_DEFAULT_REQUESTED_OPTS ; code++) {
- if (default_requested_options[code] == NULL)
- log_fatal("Unable to find option definition for "
deleted file mode 100644
@@ -1,63 +0,0 @@
-diff -up dhcp-4.3.1b1/client/dhclient.c.JwFUZj dhcp-4.3.1b1/client/dhclient.c
---- dhcp-4.3.1b1/client/dhclient.c.JwFUZj 2014-07-10 17:38:50.511265091 +0200
-+++ dhcp-4.3.1b1/client/dhclient.c 2014-07-10 17:39:16.164901267 +0200
-@@ -1281,6 +1281,8 @@ void state_init (cpp)
- void *cpp;
- {
- struct client_state *client = cpp;
-+ enum dhcp_state init_state = client->state;
-+ struct timeval tv;
-
- ASSERT_STATE(state, S_INIT);
-
-@@ -1293,9 +1295,18 @@ void state_init (cpp)
- client -> first_sending = cur_time;
- client -> interval = client -> config -> initial_interval;
-
-- /* Add an immediate timeout to cause the first DHCPDISCOVER packet
-- to go out. */
-- send_discover (client);
-+ if (init_state != S_DECLINED) {
-+ /* Add an immediate timeout to cause the first DHCPDISCOVER packet
-+ to go out. */
-+ send_discover(client);
-+ } else {
-+ /* We've received an OFFER and it has been DECLINEd by dhclient-script.
-+ * wait for a random time between 1 and backoff_cutoff seconds before
-+ * trying again. */
-+ tv . tv_sec = cur_time + ((1 + (random() >> 2)) % client->config->backoff_cutoff);
-+ tv . tv_usec = 0;
-+ add_timeout(&tv, send_discover, client, 0, 0);
-+ }
- }
-
- /*
-@@ -1592,6 +1603,7 @@ void bind_lease (client)
- "try (declined). Exiting.");
- exit(2);
- } else {
-+ client -> state = S_DECLINED;
- state_init(client);
- return;
- }
-@@ -4059,6 +4071,7 @@ void client_location_changed ()
- case S_INIT:
- case S_REBINDING:
- case S_STOPPED:
-+ case S_DECLINED:
- break;
- }
- client -> state = S_INIT;
-diff -up dhcp-4.3.1b1/includes/dhcpd.h.JwFUZj dhcp-4.3.1b1/includes/dhcpd.h
---- dhcp-4.3.1b1/includes/dhcpd.h.JwFUZj 2014-07-10 17:38:26.941599360 +0200
-+++ dhcp-4.3.1b1/includes/dhcpd.h 2014-07-10 17:38:50.526264878 +0200
-@@ -1087,7 +1087,8 @@ enum dhcp_state {
- S_BOUND = 5,
- S_RENEWING = 6,
- S_REBINDING = 7,
-- S_STOPPED = 8
-+ S_STOPPED = 8,
-+ S_DECLINED = 9
- };
-
- /* Authentication and BOOTP policy possibilities (not all values work
deleted file mode 100644
@@ -1,509 +0,0 @@
-diff -up dhcp-4.3.1b1/client/clparse.c.fLPqYB dhcp-4.3.1b1/client/clparse.c
---- dhcp-4.3.1b1/client/clparse.c.fLPqYB 2014-07-02 19:58:38.000000000 +0200
-+++ dhcp-4.3.1b1/client/clparse.c 2014-07-10 17:38:26.938599402 +0200
-@@ -148,6 +148,7 @@ isc_result_t read_client_conf ()
- /* Requested lease time, used by DHCPv6 (DHCPv4 uses the option cache)
- */
- top_level_config.requested_lease = 7200;
-+ top_level_config.bootp_broadcast_always = 0;
-
- group_allocate (&top_level_config.on_receipt, MDL);
- if (!top_level_config.on_receipt)
-@@ -353,7 +354,8 @@ void read_client_leases ()
- interface-declaration |
- LEASE client-lease-statement |
- ALIAS client-lease-statement |
-- KEY key-definition */
-+ KEY key-definition |
-+ BOOTP_BROADCAST_ALWAYS */
-
- void parse_client_statement (cfile, ip, config)
- struct parse *cfile;
-@@ -771,6 +773,12 @@ void parse_client_statement (cfile, ip,
- parse_reject_statement (cfile, config);
- return;
-
-+ case BOOTP_BROADCAST_ALWAYS:
-+ token = next_token(&val, (unsigned*)0, cfile);
-+ config -> bootp_broadcast_always = 1;
-+ parse_semi (cfile);
-+ return;
-+
- default:
- lose = 0;
- stmt = (struct executable_statement *)0;
-diff -up dhcp-4.3.1b1/client/dhclient.8.fLPqYB dhcp-4.3.1b1/client/dhclient.8
---- dhcp-4.3.1b1/client/dhclient.8.fLPqYB 2014-07-02 19:58:38.000000000 +0200
-+++ dhcp-4.3.1b1/client/dhclient.8 2014-07-10 17:38:26.938599402 +0200
-@@ -128,6 +128,33 @@ dhclient - Dynamic Host Configuration Pr
- .B -w
- ]
- [
-+.B -B
-+]
-+[
-+.B -C
-+.I dhcp-client-identifier
-+]
-+[
-+.B -H
-+.I host-name
-+]
-+[
-+.B -F
-+.I fqdn.fqdn
-+]
-+[
-+.B -V
-+.I vendor-class-identifier
-+]
-+[
-+.B -R
-+.I request-option-list
-+]
-+[
-+.B -timeout
-+.I timeout
-+]
-+[
- .B -v
- ]
- [
-@@ -275,6 +302,69 @@ not to exit when it doesn't find any suc
- program can then be used to notify the client when a network interface
- has been added or removed, so that the client can attempt to configure an IP
- address on that interface.
-+
-+.TP
-+.BI \-B
-+Set the BOOTP broadcast flag in request packets so servers will always
-+broadcast replies.
-+
-+.TP
-+.BI \-C\ <dhcp-client-identifier>
-+Specify the dhcp-client-identifier option to send to the DHCP server.
-+
-+.TP
-+.BI \-H\ <host-name>
-+Specify the host-name option to send to the DHCP server. The host-name
-+string only contains the client's hostname prefix, to which the server will
-+append the ddns-domainname or domain-name options, if any, to derive the
-+fully qualified domain name of the client. The
-+.B -H
-+option cannot be used with the
-+.B -F
-+option.
-+
-+.TP
-+.BI \-F\ <fqdn.fqdn>
-+Specify the fqdn.fqdn option to send to the DHCP server. This option cannot
-+be used with the
-+.B -H
-+option. The fqdn.fqdn option must specify the complete domain name of the
-+client host, which the server may use for dynamic DNS updates.
-+
-+.TP
-+.BI \-V\ <vendor-class-identifier>
-+Specify the vendor-class-identifier option to send to the DHCP server.
-+
-+.TP
-+.BI \-R\ <option>[,<option>...]
-+Specify the list of options the client is to request from the server. The
-+option list must be a single string consisting of option names separated
-+by at least one command and optional space characters. The default option
-+list is:
-+
-+.BR
-+ subnet-mask, broadcast-address, time-offset, routers,
-+.BR
-+ domain-search, domain-name, domain-name-servers, host-name,
-+.BR
-+ nis-domain, nis-servers, ntp-servers, interface-mtu
-+
-+.TP
-+.B -R
-+option does not append options to the default request, it overrides the
-+default request list. Keep this in mind if you want to request an
-+additional option besides the default request list. You will have to
-+specify all option names for the
-+.B -R
-+parameter.
-+
-+.TP
-+.BI \-timeout\ <timeout>
-+Specify the time after which
-+.B dhclient
-+will decide that no DHCP servers can be contacted when no responses have been
-+received.
-+
- .TP
- .BI \-n
- Do not configure any interfaces. This is most likely to be useful in
-diff -up dhcp-4.3.1b1/client/dhclient.c.fLPqYB dhcp-4.3.1b1/client/dhclient.c
---- dhcp-4.3.1b1/client/dhclient.c.fLPqYB 2014-07-02 19:58:38.000000000 +0200
-+++ dhcp-4.3.1b1/client/dhclient.c 2014-07-10 17:38:44.520350055 +0200
-@@ -39,6 +39,12 @@
- #include <limits.h>
- #include <dns/result.h>
-
-+/*
-+ * Defined in stdio.h when _GNU_SOURCE is set, but we don't want to define
-+ * that when building ISC code.
-+ */
-+extern int asprintf(char **strp, const char *fmt, ...);
-+
- TIME default_lease_time = 43200; /* 12 hours... */
- TIME max_lease_time = 86400; /* 24 hours... */
-
-@@ -88,6 +94,9 @@ int wanted_ia_na = -1; /* the absolute
- int wanted_ia_ta = 0;
- int wanted_ia_pd = 0;
- char *mockup_relay = NULL;
-+int bootp_broadcast_always = 0;
-+
-+extern struct option *default_requested_options[];
-
- void run_stateless(int exit_mode);
-
-@@ -125,6 +134,15 @@ main(int argc, char **argv) {
- int local_family_set = 0;
- #endif /* DHCPv6 */
- char *s;
-+ char *dhcp_client_identifier_arg = NULL;
-+ char *dhcp_host_name_arg = NULL;
-+ char *dhcp_fqdn_arg = NULL;
-+ char *dhcp_vendor_class_identifier_arg = NULL;
-+ char *dhclient_request_options = NULL;
-+
-+ int timeout_arg = 0;
-+ char *arg_conf = NULL;
-+ int arg_conf_len = 0;
-
- /* Initialize client globals. */
- memset(&default_duid, 0, sizeof(default_duid));
-@@ -325,6 +343,88 @@ main(int argc, char **argv) {
- strlen(PACKAGE_VERSION)));
- IGNORE_RET(write(STDERR_FILENO, "\n", 1));
- exit(0);
-+ } else if (!strcmp(argv[i], "-C")) {
-+ if ((++i == argc) || (argv[i] == NULL) || (*(argv[i])=='\0')) {
-+ usage();
-+ exit(1);
-+ }
-+
-+ if (strlen(argv[i]) >= DHCP_MAX_OPTION_LEN) {
-+ log_error("-C option dhcp-client-identifier string \"%s\" is too long - maximum length is: %d", argv[i], DHCP_MAX_OPTION_LEN-1);
-+ exit(1);
-+ }
-+
-+ dhcp_client_identifier_arg = argv[i];
-+ } else if (!strcmp(argv[i], "-B")) {
-+ bootp_broadcast_always = 1;
-+ } else if (!strcmp(argv[i], "-H")) {
-+ if ((++i == argc) || (argv[i] == NULL) || (*(argv[i])=='\0')) {
-+ usage();
-+ exit(1);
-+ }
-+
-+ if (strlen(argv[i]) >= DHCP_MAX_OPTION_LEN) {
-+ log_error("-H option host-name string \"%s\" is too long - maximum length is: %d", argv[i], DHCP_MAX_OPTION_LEN-1);
-+ exit(1);
-+ }
-+
-+ if (dhcp_host_name_arg != NULL) {
-+ log_error("The -H <host-name> and -F <fqdn> arguments are mutually exclusive");
-+ exit(1);
-+ }
-+
-+ dhcp_host_name_arg = argv[i];
-+ } else if (!strcmp(argv[i], "-F")) {
-+ if ((++i == argc) || (argv[i] == NULL) || (*(argv[i])=='\0')) {
-+ usage();
-+ exit(1);
-+ }
-+
-+ if (strlen(argv[i]) >= DHCP_MAX_OPTION_LEN) {
-+ log_error("-F option fqdn.fqdn string \"%s\" is too long - maximum length is: %d", argv[i], DHCP_MAX_OPTION_LEN-1);
-+ exit(1);
-+ }
-+
-+ if (dhcp_fqdn_arg != NULL) {
-+ log_error("Only one -F <fqdn> argument can be specified");
-+ exit(1);
-+ }
-+
-+ if (dhcp_host_name_arg != NULL) {
-+ log_error("The -F <fqdn> and -H <host-name> arguments are mutually exclusive");
-+ exit(1);
-+ }
-+
-+ dhcp_fqdn_arg = argv[i];
-+ } else if (!strcmp(argv[i], "-timeout")) {
-+ if ((++i == argc) || (argv[i] == NULL) || (*(argv[i])=='\0')) {
-+ usage();
-+ exit(1);
-+ }
-+
-+ if ((timeout_arg = atoi(argv[i])) <= 0) {
-+ log_error("timeout option must be > 0 - bad value: %s",argv[i]);
-+ exit(1);
-+ }
-+ } else if (!strcmp(argv[i], "-V")) {
-+ if ((++i == argc) || (argv[i] == NULL) || (*(argv[i])=='\0')) {
-+ usage();
-+ exit(1);
-+ }
-+
-+ if (strlen(argv[i]) >= DHCP_MAX_OPTION_LEN) {
-+ log_error("-V option vendor-class-identifier string \"%s\" is too long - maximum length is: %d", argv[i], DHCP_MAX_OPTION_LEN-1);
-+ exit(1);
-+ }
-+
-+ dhcp_vendor_class_identifier_arg = argv[i];
-+ } else if (!strcmp(argv[i], "-R")) {
-+ if ((++i == argc) || (argv[i] == NULL) || (*(argv[i])=='\0')) {
-+ usage();
-+ exit(1);
-+ }
-+
-+ dhclient_request_options = argv[i];
- } else if (argv[i][0] == '-') {
- usage();
- } else if (interfaces_requested < 0) {
-@@ -507,6 +607,156 @@ main(int argc, char **argv) {
- /* Parse the dhclient.conf file. */
- read_client_conf();
-
-+ /* Parse any extra command line configuration arguments: */
-+ if ((dhcp_client_identifier_arg != NULL) && (*dhcp_client_identifier_arg != '\0')) {
-+ arg_conf_len = asprintf(&arg_conf, "send dhcp-client-identifier \"%s\";", dhcp_client_identifier_arg);
-+
-+ if ((arg_conf == 0) || (arg_conf_len <= 0))
-+ log_fatal("Unable to send -C option dhcp-client-identifier");
-+ }
-+
-+ if ((dhcp_host_name_arg != NULL) && (*dhcp_host_name_arg != '\0')) {
-+ if (arg_conf == 0) {
-+ arg_conf_len = asprintf(&arg_conf, "send host-name \"%s\";", dhcp_host_name_arg);
-+
-+ if ((arg_conf == 0) || (arg_conf_len <= 0))
-+ log_fatal("Unable to send -H option host-name");
-+ } else {
-+ char *last_arg_conf = arg_conf;
-+ arg_conf = NULL;
-+ arg_conf_len = asprintf(&arg_conf, "%s\nsend host-name \"%s\";", last_arg_conf, dhcp_host_name_arg);
-+
-+ if ((arg_conf == 0) || (arg_conf_len <= 0))
-+ log_fatal("Unable to send -H option host-name");
-+
-+ free(last_arg_conf);
-+ }
-+ }
-+
-+ if ((dhcp_fqdn_arg != NULL) && (*dhcp_fqdn_arg != '\0')) {
-+ if (arg_conf == 0) {
-+ arg_conf_len = asprintf(&arg_conf, "send fqdn.fqdn \"%s\";", dhcp_fqdn_arg);
-+
-+ if ((arg_conf == 0) || (arg_conf_len <= 0))
-+ log_fatal("Unable to send -F option fqdn.fqdn");
-+ } else {
-+ char *last_arg_conf = arg_conf;
-+ arg_conf = NULL;
-+ arg_conf_len = asprintf(&arg_conf, "%s\nsend fqdn.fqdn \"%s\";", last_arg_conf, dhcp_fqdn_arg);
-+
-+ if ((arg_conf == 0) || (arg_conf_len <= 0))
-+ log_fatal("Unable to send -F option fqdn.fqdn");
-+
-+ free(last_arg_conf);
-+ }
-+ }
-+
-+ if (timeout_arg) {
-+ if (arg_conf == 0) {
-+ arg_conf_len = asprintf(&arg_conf, "timeout %d;", timeout_arg);
-+
-+ if ((arg_conf == 0) || (arg_conf_len <= 0))
-+ log_fatal("Unable to process -timeout timeout argument");
-+ } else {
-+ char *last_arg_conf = arg_conf;
-+ arg_conf = NULL;
-+ arg_conf_len = asprintf(&arg_conf, "%s\ntimeout %d;", last_arg_conf, timeout_arg);
-+
-+ if ((arg_conf == 0) || (arg_conf_len == 0))
-+ log_fatal("Unable to process -timeout timeout argument");
-+
-+ free(last_arg_conf);
-+ }
-+ }
-+
-+ if ((dhcp_vendor_class_identifier_arg != NULL) && (*dhcp_vendor_class_identifier_arg != '\0')) {
-+ if (arg_conf == 0) {
-+ arg_conf_len = asprintf(&arg_conf, "send vendor-class-identifier \"%s\";", dhcp_vendor_class_identifier_arg);
-+
-+ if ((arg_conf == 0) || (arg_conf_len <= 0))
-+ log_fatal("Unable to send -V option vendor-class-identifier");
-+ } else {
-+ char *last_arg_conf = arg_conf;
-+ arg_conf = NULL;
-+ arg_conf_len = asprintf(&arg_conf, "%s\nsend vendor-class-identifier \"%s\";", last_arg_conf, dhcp_vendor_class_identifier_arg);
-+
-+ if ((arg_conf == 0) || (arg_conf_len <= 0))
-+ log_fatal("Unable to send -V option vendor-class-identifier");
-+
-+ free(last_arg_conf);
-+ }
-+ }
-+
-+ if (dhclient_request_options != NULL) {
-+ if (arg_conf == 0) {
-+ arg_conf_len = asprintf(&arg_conf, "request %s;", dhclient_request_options);
-+
-+ if ((arg_conf == 0) || (arg_conf_len <= 0))
-+ log_fatal("Unable to parse -R <request options list> argument");
-+ } else {
-+ char *last_arg_conf = arg_conf;
-+ arg_conf = NULL;
-+ arg_conf_len = asprintf(&arg_conf, "%s\nrequest %s;", last_arg_conf, dhclient_request_options);
-+
-+ if ((arg_conf == 0) || (arg_conf_len <= 0))
-+ log_fatal("Unable to parse -R <request options list> argument");
-+
-+ free(last_arg_conf);
-+ }
-+ }
-+
-+ if (arg_conf) {
-+ if (arg_conf_len == 0)
-+ if ((arg_conf_len = strlen(arg_conf)) == 0)
-+ /* huh ? cannot happen ! */
-+ log_fatal("Unable to process -C/-H/-F/-timeout/-V/-R configuration arguments");
-+
-+ /* parse the extra dhclient.conf configuration arguments
-+ * into top level config: */
-+ struct parse *cfile = (struct parse *)0;
-+ const char *val = NULL;
-+ int token;
-+
-+ status = new_parse(&cfile, -1, arg_conf, arg_conf_len, "extra dhclient -C/-H/-F/-timeout/-V/-R configuration arguments", 0);
-+
-+ if ((status != ISC_R_SUCCESS) || (cfile -> warnings_occurred))
-+ log_fatal("Cannot parse -C/-H/-F/-timeout/-V/-R configuration arguments !");
-+ /* more detailed parse failures will be logged */
-+
-+ do {
-+ token = peek_token(&val, (unsigned *)0, cfile);
-+ if (token == END_OF_FILE)
-+ break;
-+
-+ parse_client_statement(cfile, (struct interface_info *)0, &top_level_config);
-+ } while (1);
-+
-+ if (cfile -> warnings_occurred)
-+ log_fatal("Cannot parse -C/-H/-F/-timeout/-V/-R configuration arguments !");
-+ end_parse(&cfile);
-+
-+ if (timeout_arg) {
-+ /* we just set the toplevel timeout, but per-client
-+ * timeouts may still be at defaults.
-+ */
-+ for (ip=interfaces; ip; ip = ip->next) {
-+ if (ip->client->config->timeout == 60)
-+ ip->client->config->timeout = timeout_arg;
-+ }
-+ }
-+
-+ if ((dhclient_request_options != 0) && (top_level_config.requested_options != default_requested_options)) {
-+ for (ip=interfaces; ip; ip = ip->next) {
-+ if (ip->client->config->requested_options == default_requested_options)
-+ ip->client->config->requested_options = top_level_config.requested_options;
-+ }
-+ }
-+
-+ free(arg_conf);
-+ arg_conf = NULL;
-+ arg_conf_len = 0;
-+ }
-+
- /* Parse the lease database. */
- read_client_leases();
-
-@@ -756,6 +1006,10 @@ static void usage()
- " [-s server-addr] [-cf config-file]\n"
- " [-df duid-file] [-lf lease-file]\n"
- " [-pf pid-file] [--no-pid] [-e VAR=val]\n"
-+ " [-C <dhcp-client-identifier>] [-B]\n"
-+ " [-H <host-name> | -F <fqdn.fqdn>] [-timeout <timeout>]\n"
-+ " [-V <vendor-class-identifier>]\n"
-+ " [-R <request option list>]\n"
- " [-sf script-file] [interface]");
- }
-
-@@ -2531,7 +2785,8 @@ void make_discover (client, lease)
- client -> packet.xid = random ();
- client -> packet.secs = 0; /* filled in by send_discover. */
-
-- if (can_receive_unicast_unconfigured (client -> interface))
-+ if ((!(bootp_broadcast_always || client->config->bootp_broadcast_always))
-+ && can_receive_unicast_unconfigured(client->interface))
- client -> packet.flags = 0;
- else
- client -> packet.flags = htons (BOOTP_BROADCAST);
-@@ -2615,7 +2870,9 @@ void make_request (client, lease)
- } else {
- memset (&client -> packet.ciaddr, 0,
- sizeof client -> packet.ciaddr);
-- if (can_receive_unicast_unconfigured (client -> interface))
-+ if ((!(bootp_broadcast_always ||
-+ client ->config->bootp_broadcast_always)) &&
-+ can_receive_unicast_unconfigured (client -> interface))
- client -> packet.flags = 0;
- else
- client -> packet.flags = htons (BOOTP_BROADCAST);
-@@ -2677,7 +2934,8 @@ void make_decline (client, lease)
- client -> packet.hops = 0;
- client -> packet.xid = client -> xid;
- client -> packet.secs = 0; /* Filled in by send_request. */
-- if (can_receive_unicast_unconfigured (client -> interface))
-+ if ((!(bootp_broadcast_always || client->config-> bootp_broadcast_always))
-+ && can_receive_unicast_unconfigured (client->interface))
- client -> packet.flags = 0;
- else
- client -> packet.flags = htons (BOOTP_BROADCAST);
-diff -up dhcp-4.3.1b1/common/conflex.c.fLPqYB dhcp-4.3.1b1/common/conflex.c
---- dhcp-4.3.1b1/common/conflex.c.fLPqYB 2014-07-02 19:58:38.000000000 +0200
-+++ dhcp-4.3.1b1/common/conflex.c 2014-07-10 17:38:26.940599374 +0200
-@@ -811,6 +811,8 @@ intern(char *atom, enum dhcp_token dfv)
- return BALANCE;
- if (!strcasecmp (atom + 1, "ound"))
- return BOUND;
-+ if (!strcasecmp (atom + 1, "ootp-broadcast-always"))
-+ return BOOTP_BROADCAST_ALWAYS;
- break;
- case 'c':
- if (!strcasecmp(atom + 1, "ase"))
-diff -up dhcp-4.3.1b1/includes/dhcpd.h.fLPqYB dhcp-4.3.1b1/includes/dhcpd.h
---- dhcp-4.3.1b1/includes/dhcpd.h.fLPqYB 2014-07-02 19:58:39.000000000 +0200
-+++ dhcp-4.3.1b1/includes/dhcpd.h 2014-07-10 17:38:26.941599360 +0200
-@@ -1152,6 +1152,9 @@ struct client_config {
- int do_forward_update; /* If nonzero, and if we have the
- information we need, update the
- A record for the address we get. */
-+
-+ int bootp_broadcast_always; /* If nonzero, always set the BOOTP_BROADCAST
-+ flag in requests */
- };
-
- /* Per-interface state used in the dhcp client... */
-diff -up dhcp-4.3.1b1/includes/dhctoken.h.fLPqYB dhcp-4.3.1b1/includes/dhctoken.h
---- dhcp-4.3.1b1/includes/dhctoken.h.fLPqYB 2014-07-02 19:58:39.000000000 +0200
-+++ dhcp-4.3.1b1/includes/dhctoken.h 2014-07-10 17:38:26.942599346 +0200
-@@ -367,7 +367,8 @@ enum dhcp_token {
- TOKEN_INFINIBAND = 668,
- POOL6 = 669,
- V6RELAY = 670,
-- V6RELOPT = 671
-+ V6RELOPT = 671,
-+ BOOTP_BROADCAST_ALWAYS = 672
- };
-
- #define is_identifier(x) ((x) >= FIRST_TOKEN && \
deleted file mode 100644
@@ -1,22 +0,0 @@
-diff -up dhcp-4.3.0b1/omapip/errwarn.c.errwarn dhcp-4.3.0b1/omapip/errwarn.c
---- dhcp-4.3.0b1/omapip/errwarn.c.errwarn 2014-01-21 09:31:47.301334249 +0100
-+++ dhcp-4.3.0b1/omapip/errwarn.c 2014-01-21 09:33:20.569039072 +0100
-@@ -76,11 +76,13 @@ void log_fatal (const char * fmt, ... )
- }
-
- log_error ("%s", "");
-- log_error ("If you think you have received this message due to a bug rather");
-- log_error ("than a configuration issue please read the section on submitting");
-- log_error ("bugs on either our web page at www.isc.org or in the README file");
-- log_error ("before submitting a bug. These pages explain the proper");
-- log_error ("process and the information we find helpful for debugging..");
-+ log_error ("This version of ISC DHCP is based on the release available");
-+ log_error ("on ftp.isc.org. Features have been added and other changes");
-+ log_error ("have been made to the base software release in order to make");
-+ log_error ("it work better with this distribution.");
-+ log_error ("%s", "");
-+ log_error ("Please report for this software via the Red Hat Bugzilla site:");
-+ log_error (" http://bugzilla.redhat.com");
- log_error ("%s", "");
- log_error ("exiting.");
-
deleted file mode 100644
@@ -1,12 +0,0 @@
-diff -up dhcp-4.3.0rc1/common/tables.c.garbage dhcp-4.3.0rc1/common/tables.c
---- dhcp-4.3.0rc1/common/tables.c.garbage 2014-01-29 10:03:52.132624677 +0100
-+++ dhcp-4.3.0rc1/common/tables.c 2014-01-29 10:04:51.413875343 +0100
-@@ -213,7 +213,7 @@ static struct option dhcp_options[] = {
- { "name-service-search", "Sa", &dhcp_universe, 117, 1 },
- #endif
- { "subnet-selection", "I", &dhcp_universe, 118, 1 },
-- { "domain-search", "Dc", &dhcp_universe, 119, 1 },
-+ { "domain-search", "D", &dhcp_universe, 119, 1 },
- { "vivco", "Evendor-class.", &dhcp_universe, 124, 1 },
- { "vivso", "Evendor.", &dhcp_universe, 125, 1 },
- #if 0
deleted file mode 100644
@@ -1,73 +0,0 @@
-diff -up dhcp-4.3.0a1/client/dhclient.c.gpxe-cid dhcp-4.3.0a1/client/dhclient.c
---- dhcp-4.3.0a1/client/dhclient.c.gpxe-cid 2013-12-20 13:28:45.105048317 +0100
-+++ dhcp-4.3.0a1/client/dhclient.c 2013-12-20 13:28:45.109048261 +0100
-@@ -47,6 +47,14 @@
- const char *path_dhclient_pid = NULL;
- static char path_dhclient_script_array[] = _PATH_DHCLIENT_SCRIPT;
- char *path_dhclient_script = path_dhclient_script_array;
-+
-+/* Default Prefix */
-+static unsigned char default_prefix[12] = {
-+ 0xff, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x02, 0x00,
-+ 0x00, 0x02, 0xc9, 0x00
-+};
-+
- const char *path_dhclient_duid = NULL;
-
- /* False (default) => we write and use a pid file */
-@@ -1253,6 +1260,12 @@ int find_subnet (struct subnet **sp,
- static void setup_ib_interface(struct interface_info *ip)
- {
- struct group *g;
-+ struct hardware *hw = &ip->hw_address;
-+ char client_id[64];
-+ char *arg_conf = NULL;
-+ int arg_conf_len = 0;
-+ isc_result_t status;
-+ struct parse *cfile = (struct parse *)0;
-
- /* Set the broadcast flag */
- ip->client->config->bootp_broadcast_always = 1;
-@@ -1269,8 +1282,39 @@ static void setup_ib_interface(struct in
- }
- }
-
-- /* No client ID specified */
-- log_fatal("dhcp-client-identifier must be specified for InfiniBand");
-+ /*
-+ * No client ID specified, make up one based on a default
-+ * "prefix" and the port GUID.
-+ *
-+ * NOTE: This is compatible with what gpxe does.
-+ */
-+ sprintf(client_id, "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x",
-+ default_prefix[0], default_prefix[1], default_prefix[2],
-+ default_prefix[3], default_prefix[4], default_prefix[5],
-+ default_prefix[6], default_prefix[7], default_prefix[8],
-+ default_prefix[9], default_prefix[10], default_prefix[11],
-+ hw->hbuf[1], hw->hbuf[2], hw->hbuf[3], hw->hbuf[4],
-+ hw->hbuf[5], hw->hbuf[6], hw->hbuf[7], hw->hbuf[8]);
-+
-+ arg_conf_len = asprintf(&arg_conf,
-+ "send dhcp-client-identifier %s;",
-+ client_id);
-+
-+ if ((arg_conf == 0) || (arg_conf_len <= 0))
-+ log_fatal("Unable to send option dhcp-client-identifier");
-+
-+ status = new_parse(&cfile, -1, arg_conf, arg_conf_len,
-+ "Automatic Infiniband client identifier", 0);
-+
-+ if ((status != ISC_R_SUCCESS) || (cfile->warnings_occurred))
-+ log_fatal("Failed to parse Infiniband client identifier");
-+
-+ parse_client_statement(cfile, NULL, ip->client->config);
-+
-+ if (cfile->warnings_occurred)
-+ log_fatal("Failed to parse Infiniband client identifier");
-+
-+ end_parse(&cfile);
- }
-
- /* Individual States:
deleted file mode 100644
@@ -1,49 +0,0 @@
-diff -up dhcp-4.3.0a1/client/dhc6.c.honor-expired dhcp-4.3.0a1/client/dhc6.c
---- dhcp-4.3.0a1/client/dhc6.c.honor-expired 2013-12-19 16:00:28.062183037 +0100
-+++ dhcp-4.3.0a1/client/dhc6.c 2013-12-19 16:00:28.076182842 +0100
-@@ -1351,6 +1351,32 @@ start_info_request6(struct client_state
- go_daemon();
- }
-
-+/* Run through the addresses in lease and return true if there's any unexpired.
-+ * Return false otherwise.
-+ */
-+isc_boolean_t
-+unexpired_address_in_lease(struct dhc6_lease *lease)
-+{
-+ struct dhc6_ia *ia;
-+ struct dhc6_addr *addr;
-+
-+ for (ia = lease->bindings ; ia != NULL ; ia = ia->next) {
-+ for (addr = ia->addrs ; addr != NULL ; addr = addr->next) {
-+ if (addr->flags & DHC6_ADDR_EXPIRED)
-+ continue;
-+
-+ if (addr->starts + addr->max_life > cur_time) {
-+ return ISC_TRUE;
-+ }
-+ }
-+ }
-+
-+ log_info("PRC: Previous lease is devoid of active addresses."
-+ " Re-initializing.");
-+
-+ return ISC_FALSE;
-+}
-+
- /*
- * start_confirm6() kicks off an "init-reboot" version of the process, at
- * startup to find out if old bindings are 'fair' and at runtime whenever
-@@ -1363,8 +1389,10 @@ start_confirm6(struct client_state *clie
-
- /* If there is no active lease, there is nothing to check. */
- if ((client->active_lease == NULL) ||
-- !active_prefix(client) ||
-- client->active_lease->released) {
-+ !active_prefix(client) ||
-+ client->active_lease->released ||
-+ !unexpired_address_in_lease(client->active_lease)) {
-+ dhc6_lease_destroy(&client->active_lease, MDL);
- start_init6(client);
- return;
- }
deleted file mode 100644
@@ -1,138 +0,0 @@
-diff -up dhcp-4.3.0a1/client/dhclient.c.improved-xid dhcp-4.3.0a1/client/dhclient.c
---- dhcp-4.3.0a1/client/dhclient.c.improved-xid 2013-12-20 13:29:41.836260810 +0100
-+++ dhcp-4.3.0a1/client/dhclient.c 2013-12-20 13:29:41.843260713 +0100
-@@ -894,6 +894,26 @@ main(int argc, char **argv) {
- }
- }
-
-+ /* We create a backup seed before rediscovering interfaces in order to
-+ have a seed built using all of the available interfaces
-+ It's interesting if required interfaces doesn't let us defined
-+ a really unique seed due to a lack of valid HW addr later
-+ (this is the case with DHCP over IB)
-+ We only use the last device as using a sum could broke the
-+ uniqueness of the seed among multiple nodes
-+ */
-+ unsigned backup_seed = 0;
-+ for (ip = interfaces; ip; ip = ip -> next) {
-+ int junk;
-+ if ( ip -> hw_address.hlen <= sizeof seed )
-+ continue;
-+ memcpy (&junk,
-+ &ip -> hw_address.hbuf [ip -> hw_address.hlen -
-+ sizeof seed], sizeof seed);
-+ backup_seed = junk;
-+ }
-+
-+
- /* At this point, all the interfaces that the script thinks
- are relevant should be running, so now we once again call
- discover_interfaces(), and this time ask it to actually set
-@@ -908,14 +928,36 @@ main(int argc, char **argv) {
- Not much entropy, but we're booting, so we're not likely to
- find anything better. */
- seed = 0;
-+ int seed_flag = 0;
- for (ip = interfaces; ip; ip = ip->next) {
- int junk;
-+ if ( ip -> hw_address.hlen <= sizeof seed )
-+ continue;
- memcpy(&junk,
- &ip->hw_address.hbuf[ip->hw_address.hlen -
- sizeof seed], sizeof seed);
- seed += junk;
-+ seed_flag = 1;
- }
-- srandom(seed + cur_time + (unsigned)getpid());
-+ if ( seed_flag == 0 ) {
-+ if ( backup_seed != 0 ) {
-+ seed = backup_seed;
-+ log_info ("xid: rand init seed (0x%x) built using all"
-+ " available interfaces",seed);
-+ }
-+ else {
-+ seed = cur_time^((unsigned) gethostid()) ;
-+ log_info ("xid: warning: no netdev with useable HWADDR found"
-+ " for seed's uniqueness enforcement");
-+ log_info ("xid: rand init seed (0x%x) built using gethostid",
-+ seed);
-+ }
-+ /* we only use seed and no current time as a broadcast reply */
-+ /* will certainly be used by the hwaddrless interface */
-+ srandom(seed);
-+ }
-+ else
-+ srandom(seed + cur_time + (unsigned)getpid());
-
- /* Setup specific Infiniband options */
- for (ip = interfaces; ip; ip = ip->next) {
-@@ -1460,7 +1502,7 @@ void dhcpack (packet)
- return;
- }
-
-- log_info ("DHCPACK from %s", piaddr (packet -> client_addr));
-+ log_info ("DHCPACK from %s (xid=0x%x)", piaddr (packet -> client_addr), client -> xid);
-
- lease = packet_to_lease (packet, client);
- if (!lease) {
-@@ -2171,7 +2213,7 @@ void dhcpnak (packet)
- return;
- }
-
-- log_info ("DHCPNAK from %s", piaddr (packet -> client_addr));
-+ log_info ("DHCPNAK from %s (xid=0x%x)", piaddr (packet -> client_addr), client -> xid);
-
- if (!client -> active) {
- #if defined (DEBUG)
-@@ -2298,10 +2340,10 @@ void send_discover (cpp)
- client -> packet.secs = htons (65535);
- client -> secs = client -> packet.secs;
-
-- log_info ("DHCPDISCOVER on %s to %s port %d interval %ld",
-+ log_info ("DHCPDISCOVER on %s to %s port %d interval %ld (xid=0x%x)",
- client -> name ? client -> name : client -> interface -> name,
- inet_ntoa (sockaddr_broadcast.sin_addr),
-- ntohs (sockaddr_broadcast.sin_port), (long)(client -> interval));
-+ ntohs (sockaddr_broadcast.sin_port), (long)(client -> interval), client -> xid);
-
- /* Send out a packet. */
- result = send_packet(client->interface, NULL, &client->packet,
-@@ -2570,10 +2612,10 @@ void send_request (cpp)
- client -> packet.secs = htons (65535);
- }
-
-- log_info ("DHCPREQUEST on %s to %s port %d",
-+ log_info ("DHCPREQUEST on %s to %s port %d (xid=0x%x)",
- client -> name ? client -> name : client -> interface -> name,
- inet_ntoa (destination.sin_addr),
-- ntohs (destination.sin_port));
-+ ntohs (destination.sin_port), client -> xid);
-
- if (destination.sin_addr.s_addr != INADDR_BROADCAST &&
- fallback_interface) {
-@@ -2613,10 +2655,10 @@ void send_decline (cpp)
-
- int result;
-
-- log_info ("DHCPDECLINE on %s to %s port %d",
-+ log_info ("DHCPDECLINE on %s to %s port %d (xid=0x%x)",
- client->name ? client->name : client->interface->name,
- inet_ntoa(sockaddr_broadcast.sin_addr),
-- ntohs(sockaddr_broadcast.sin_port));
-+ ntohs(sockaddr_broadcast.sin_port), client -> xid);
-
- /* Send out a packet. */
- result = send_packet(client->interface, NULL, &client->packet,
-@@ -2659,10 +2701,10 @@ void send_release (cpp)
- return;
- }
-
-- log_info ("DHCPRELEASE on %s to %s port %d",
-+ log_info ("DHCPRELEASE on %s to %s port %d (xid=0x%x)",
- client -> name ? client -> name : client -> interface -> name,
- inet_ntoa (destination.sin_addr),
-- ntohs (destination.sin_port));
-+ ntohs (destination.sin_port), client -> xid);
-
- if (fallback_interface) {
- result = send_packet(fallback_interface, NULL, &client->packet,
deleted file mode 100644
@@ -1,11 +0,0 @@
---- expanded_org/client/dhclient.c Wed Aug 06 23:35:00 2014
-+++ expanded_logpid/client/dhclient.c Mon Feb 16 13:35:31 2015
-@@ -142,7 +142,7 @@
- else if (fd != -1)
- close(fd);
-
-- openlog("dhclient", DHCP_LOG_OPTIONS, LOG_DAEMON);
-+ openlog("dhclient", LOG_NDELAY | LOG_PID, LOG_DAEMON);
-
- #if !(defined(DEBUG) || defined(__CYGWIN32__))
- setlogmask(LOG_UPTO(LOG_INFO));
deleted file mode 100644
@@ -1,585 +0,0 @@
-diff -up dhcp-4.3.1b1/client/dhclient.c.bmgpWV dhcp-4.3.1b1/client/dhclient.c
---- dhcp-4.3.1b1/client/dhclient.c.bmgpWV 2014-07-10 17:50:26.922402550 +0200
-+++ dhcp-4.3.1b1/client/dhclient.c 2014-07-10 17:53:43.629623477 +0200
-@@ -114,6 +114,8 @@ static int check_domain_name_list(const
- static int check_option_values(struct universe *universe, unsigned int opt,
- const char *ptr, size_t len);
-
-+static void setup_ib_interface(struct interface_info *ip);
-+
- #ifndef UNIT_TEST
- int
- main(int argc, char **argv) {
-@@ -937,6 +939,13 @@ main(int argc, char **argv) {
- }
- srandom(seed + cur_time + (unsigned)getpid());
-
-+ /* Setup specific Infiniband options */
-+ for (ip = interfaces; ip; ip = ip->next) {
-+ if (ip->client &&
-+ (ip->hw_address.hbuf[0] == HTYPE_INFINIBAND)) {
-+ setup_ib_interface(ip);
-+ }
-+ }
-
- /*
- * Establish a default DUID. We always do so for v6 and
-@@ -1230,6 +1239,29 @@ int find_subnet (struct subnet **sp,
- return 0;
- }
-
-+static void setup_ib_interface(struct interface_info *ip)
-+{
-+ struct group *g;
-+
-+ /* Set the broadcast flag */
-+ ip->client->config->bootp_broadcast_always = 1;
-+
-+ /*
-+ * Find out if a dhcp-client-identifier option was specified either
-+ * in the config file or on the command line
-+ */
-+ for (g = ip->client->config->on_transmission; g != NULL; g = g->next) {
-+ if ((g->statements != NULL) &&
-+ (strcmp(g->statements->data.option->option->name,
-+ "dhcp-client-identifier") == 0)) {
-+ return;
-+ }
-+ }
-+
-+ /* No client ID specified */
-+ log_fatal("dhcp-client-identifier must be specified for InfiniBand");
-+}
-+
- /* Individual States:
- *
- * Each routine is called from the dhclient_state_machine() in one of
-diff -up dhcp-4.3.1b1/common/bpf.c.bmgpWV dhcp-4.3.1b1/common/bpf.c
---- dhcp-4.3.1b1/common/bpf.c.bmgpWV 2014-07-10 17:48:03.797424616 +0200
-+++ dhcp-4.3.1b1/common/bpf.c 2014-07-10 17:52:57.705272295 +0200
-@@ -199,11 +199,44 @@ struct bpf_insn dhcp_bpf_filter [] = {
- BPF_STMT(BPF_RET+BPF_K, 0),
- };
-
-+/* Packet filter program for DHCP over Infiniband.
-+ *
-+ * XXX
-+ * Changes to the filter program may require changes to the constant offsets
-+ * used in lpf_gen_filter_setup to patch the port in the BPF program!
-+ * XXX
-+ */
-+struct bpf_insn dhcp_ib_bpf_filter [] = {
-+ /* Packet filter for Infiniband */
-+ /* Make sure it's a UDP packet... */
-+ BPF_STMT(BPF_LD + BPF_B + BPF_ABS, 9),
-+ BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, IPPROTO_UDP, 0, 6),
-+
-+ /* Make sure this isn't a fragment... */
-+ BPF_STMT(BPF_LD + BPF_H + BPF_ABS, 6),
-+ BPF_JUMP(BPF_JMP + BPF_JSET + BPF_K, 0x1fff, 4, 0),
-+
-+ /* Get the IP header length... */
-+ BPF_STMT(BPF_LDX + BPF_B + BPF_MSH, 0),
-+
-+ /* Make sure it's to the right port... */
-+ BPF_STMT(BPF_LD + BPF_H + BPF_IND, 2),
-+ BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, 67, 0, 1),
-+
-+ /* If we passed all the tests, ask for the whole packet. */
-+ BPF_STMT(BPF_RET + BPF_K, (u_int)-1),
-+
-+ /* Otherwise, drop it. */
-+ BPF_STMT(BPF_RET + BPF_K, 0),
-+};
-+
- #if defined (DEC_FDDI)
- struct bpf_insn *bpf_fddi_filter;
- #endif
-
- int dhcp_bpf_filter_len = sizeof dhcp_bpf_filter / sizeof (struct bpf_insn);
-+int dhcp_ib_bpf_filter_len = sizeof dhcp_ib_bpf_filter / sizeof (struct bpf_insn);
-+
- #if defined (HAVE_TR_SUPPORT)
- struct bpf_insn dhcp_bpf_tr_filter [] = {
- /* accept all token ring packets due to variable length header */
-diff -up dhcp-4.3.1b1/common/lpf.c.bmgpWV dhcp-4.3.1b1/common/lpf.c
---- dhcp-4.3.1b1/common/lpf.c.bmgpWV 2014-07-10 17:48:03.797424616 +0200
-+++ dhcp-4.3.1b1/common/lpf.c 2014-07-10 17:52:57.706272281 +0200
-@@ -46,6 +46,17 @@
- #if defined (USE_LPF_RECEIVE) || defined (USE_LPF_HWADDR)
- #include <sys/ioctl.h>
- #include <net/if.h>
-+#include <ifaddrs.h>
-+
-+/* Default broadcast address for IPoIB */
-+static unsigned char default_ib_bcast_addr[20] = {
-+ 0x00, 0xff, 0xff, 0xff,
-+ 0xff, 0x12, 0x40, 0x1b,
-+ 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00,
-+ 0xff, 0xff, 0xff, 0xff
-+};
-+
- #endif
-
- #if defined (USE_LPF_SEND) || defined (USE_LPF_RECEIVE)
-@@ -92,10 +103,21 @@ int if_register_lpf (info)
- struct sockaddr common;
- } sa;
- struct ifreq ifr;
-+ int type;
-+ int protocol;
-
- /* Make an LPF socket. */
-- if ((sock = socket(PF_PACKET, SOCK_RAW,
-- htons((short)ETH_P_ALL))) < 0) {
-+ get_hw_addr(info);
-+
-+ if (info->hw_address.hbuf[0] == HTYPE_INFINIBAND) {
-+ type = SOCK_DGRAM;
-+ protocol = ETHERTYPE_IP;
-+ } else {
-+ type = SOCK_RAW;
-+ protocol = ETH_P_ALL;
-+ }
-+
-+ if ((sock = socket(PF_PACKET, type, htons((short)protocol))) < 0) {
- if (errno == ENOPROTOOPT || errno == EPROTONOSUPPORT ||
- errno == ESOCKTNOSUPPORT || errno == EPFNOSUPPORT ||
- errno == EAFNOSUPPORT || errno == EINVAL) {
-@@ -118,6 +140,7 @@ int if_register_lpf (info)
- /* Bind to the interface name */
- memset (&sa, 0, sizeof sa);
- sa.ll.sll_family = AF_PACKET;
-+ sa.ll.sll_protocol = htons(protocol);
- sa.ll.sll_ifindex = ifr.ifr_ifindex;
- if (bind (sock, &sa.common, sizeof sa)) {
- if (errno == ENOPROTOOPT || errno == EPROTONOSUPPORT ||
-@@ -133,8 +156,6 @@ int if_register_lpf (info)
- log_fatal ("Bind socket to interface: %m");
- }
-
-- get_hw_addr(info->name, &info->hw_address);
--
- return sock;
- }
- #endif /* USE_LPF_SEND || USE_LPF_RECEIVE */
-@@ -189,6 +210,8 @@ void if_deregister_send (info)
- in bpf includes... */
- extern struct sock_filter dhcp_bpf_filter [];
- extern int dhcp_bpf_filter_len;
-+extern struct sock_filter dhcp_ib_bpf_filter [];
-+extern int dhcp_ib_bpf_filter_len;
-
- #if defined (HAVE_TR_SUPPORT)
- extern struct sock_filter dhcp_bpf_tr_filter [];
-@@ -206,11 +229,13 @@ void if_register_receive (info)
- /* Open a LPF device and hang it on this interface... */
- info -> rfdesc = if_register_lpf (info);
-
-- val = 1;
-- if (setsockopt (info -> rfdesc, SOL_PACKET, PACKET_AUXDATA, &val,
-- sizeof val) < 0) {
-- if (errno != ENOPROTOOPT)
-- log_fatal ("Failed to set auxiliary packet data: %m");
-+ if (info->hw_address.hbuf[0] != HTYPE_INFINIBAND) {
-+ val = 1;
-+ if (setsockopt (info -> rfdesc, SOL_PACKET, PACKET_AUXDATA,
-+ &val, sizeof val) < 0) {
-+ if (errno != ENOPROTOOPT)
-+ log_fatal ("Failed to set auxiliary packet data: %m");
-+ }
- }
-
- #if defined (HAVE_TR_SUPPORT)
-@@ -256,15 +281,28 @@ static void lpf_gen_filter_setup (info)
-
- memset(&p, 0, sizeof(p));
-
-- /* Set up the bpf filter program structure. This is defined in
-- bpf.c */
-- p.len = dhcp_bpf_filter_len;
-- p.filter = dhcp_bpf_filter;
--
-- /* Patch the server port into the LPF program...
-- XXX changes to filter program may require changes
-- to the insn number(s) used below! XXX */
-- dhcp_bpf_filter [8].k = ntohs ((short)local_port);
-+ if (info->hw_address.hbuf[0] == HTYPE_INFINIBAND) {
-+ /* Set up the bpf filter program structure. */
-+ p.len = dhcp_ib_bpf_filter_len;
-+ p.filter = dhcp_ib_bpf_filter;
-+
-+ /* Patch the server port into the LPF program...
-+ XXX
-+ changes to filter program may require changes
-+ to the insn number(s) used below!
-+ XXX */
-+ dhcp_ib_bpf_filter[6].k = ntohs ((short)local_port);
-+ } else {
-+ /* Set up the bpf filter program structure.
-+ This is defined in bpf.c */
-+ p.len = dhcp_bpf_filter_len;
-+ p.filter = dhcp_bpf_filter;
-+
-+ /* Patch the server port into the LPF program...
-+ XXX changes to filter program may require changes
-+ to the insn number(s) used below! XXX */
-+ dhcp_bpf_filter [8].k = ntohs ((short)local_port);
-+ }
-
- if (setsockopt (info -> rfdesc, SOL_SOCKET, SO_ATTACH_FILTER, &p,
- sizeof p) < 0) {
-@@ -321,6 +359,54 @@ static void lpf_tr_filter_setup (info)
- #endif /* USE_LPF_RECEIVE */
-
- #ifdef USE_LPF_SEND
-+ssize_t send_packet_ib(interface, packet, raw, len, from, to, hto)
-+ struct interface_info *interface;
-+ struct packet *packet;
-+ struct dhcp_packet *raw;
-+ size_t len;
-+ struct in_addr from;
-+ struct sockaddr_in *to;
-+ struct hardware *hto;
-+{
-+ unsigned ibufp = 0;
-+ double ih [1536 / sizeof (double)];
-+ unsigned char *buf = (unsigned char *)ih;
-+ ssize_t result;
-+
-+ union sockunion {
-+ struct sockaddr sa;
-+ struct sockaddr_ll sll;
-+ struct sockaddr_storage ss;
-+ } su;
-+
-+ assemble_udp_ip_header (interface, buf, &ibufp, from.s_addr,
-+ to->sin_addr.s_addr, to->sin_port,
-+ (unsigned char *)raw, len);
-+ memcpy (buf + ibufp, raw, len);
-+
-+ memset(&su, 0, sizeof(su));
-+ su.sll.sll_family = AF_PACKET;
-+ su.sll.sll_protocol = htons(ETHERTYPE_IP);
-+
-+ if (!(su.sll.sll_ifindex = if_nametoindex(interface->name))) {
-+ errno = ENOENT;
-+ log_error ("send_packet_ib: %m - failed to get if index");
-+ return -1;
-+ }
-+
-+ su.sll.sll_hatype = htons(HTYPE_INFINIBAND);
-+ su.sll.sll_halen = sizeof(interface->bcast_addr);
-+ memcpy(&su.sll.sll_addr, interface->bcast_addr, 20);
-+
-+ result = sendto(interface->wfdesc, buf, ibufp + len, 0,
-+ &su.sa, sizeof(su));
-+
-+ if (result < 0)
-+ log_error ("send_packet_ib: %m");
-+
-+ return result;
-+}
-+
- ssize_t send_packet (interface, packet, raw, len, from, to, hto)
- struct interface_info *interface;
- struct packet *packet;
-@@ -341,6 +427,11 @@ ssize_t send_packet (interface, packet,
- return send_fallback (interface, packet, raw,
- len, from, to, hto);
-
-+ if (interface->hw_address.hbuf[0] == HTYPE_INFINIBAND) {
-+ return send_packet_ib(interface, packet, raw, len, from,
-+ to, hto);
-+ }
-+
- if (hto == NULL && interface->anycast_mac_addr.hlen)
- hto = &interface->anycast_mac_addr;
-
-@@ -362,6 +453,42 @@ ssize_t send_packet (interface, packet,
- #endif /* USE_LPF_SEND */
-
- #ifdef USE_LPF_RECEIVE
-+ssize_t receive_packet_ib (interface, buf, len, from, hfrom)
-+ struct interface_info *interface;
-+ unsigned char *buf;
-+ size_t len;
-+ struct sockaddr_in *from;
-+ struct hardware *hfrom;
-+{
-+ int length = 0;
-+ int offset = 0;
-+ unsigned char ibuf [1536];
-+ unsigned bufix = 0;
-+ unsigned paylen;
-+
-+ length = read(interface->rfdesc, ibuf, sizeof(ibuf));
-+
-+ if (length <= 0)
-+ return length;
-+
-+ offset = decode_udp_ip_header(interface, ibuf, bufix, from,
-+ (unsigned)length, &paylen, 0);
-+
-+ if (offset < 0)
-+ return 0;
-+
-+ bufix += offset;
-+ length -= offset;
-+
-+ if (length < paylen)
-+ log_fatal("Internal inconsistency at %s:%d.", MDL);
-+
-+ /* Copy out the data in the packet... */
-+ memcpy(buf, &ibuf[bufix], paylen);
-+
-+ return (ssize_t)paylen;
-+}
-+
- ssize_t receive_packet (interface, buf, len, from, hfrom)
- struct interface_info *interface;
- unsigned char *buf;
-@@ -388,6 +515,10 @@ ssize_t receive_packet (interface, buf,
- };
- struct cmsghdr *cmsg;
-
-+ if (interface->hw_address.hbuf[0] == HTYPE_INFINIBAND) {
-+ return receive_packet_ib(interface, buf, len, from, hfrom);
-+ }
-+
- length = recvmsg (interface -> rfdesc, &msg, 0);
- if (length <= 0)
- return length;
-@@ -469,11 +600,33 @@ void maybe_setup_fallback ()
- #endif
-
- #if defined (USE_LPF_RECEIVE) || defined (USE_LPF_HWADDR)
--void
--get_hw_addr(const char *name, struct hardware *hw) {
-+struct sockaddr_ll *
-+get_ll (struct ifaddrs *ifaddrs, struct ifaddrs **ifa, char *name)
-+{
-+ for (*ifa = ifaddrs; *ifa != NULL; *ifa = (*ifa)->ifa_next) {
-+ if ((*ifa)->ifa_addr == NULL)
-+ continue;
-+
-+ if ((*ifa)->ifa_addr->sa_family != AF_PACKET)
-+ continue;
-+
-+ if ((*ifa)->ifa_flags & IFF_LOOPBACK)
-+ continue;
-+
-+ if (strcmp((*ifa)->ifa_name, name) == 0)
-+ return (struct sockaddr_ll *)(void *)(*ifa)->ifa_addr;
-+ }
-+ *ifa = NULL;
-+ return NULL;
-+}
-+
-+struct sockaddr_ll *
-+ioctl_get_ll(char *name)
-+{
- int sock;
- struct ifreq tmp;
-- struct sockaddr *sa;
-+ struct sockaddr *sa = NULL;
-+ struct sockaddr_ll *sll = NULL;
-
- if (strlen(name) >= sizeof(tmp.ifr_name)) {
- log_fatal("Device name too long: \"%s\"", name);
-@@ -487,16 +640,62 @@ get_hw_addr(const char *name, struct har
- memset(&tmp, 0, sizeof(tmp));
- strcpy(tmp.ifr_name, name);
- if (ioctl(sock, SIOCGIFHWADDR, &tmp) < 0) {
-- log_fatal("Error getting hardware address for \"%s\": %m",
-+ log_fatal("Error getting hardware address for \"%s\": %m",
- name);
- }
-+ close(sock);
-
- sa = &tmp.ifr_hwaddr;
-- switch (sa->sa_family) {
-+ // needs to be freed outside this function
-+ sll = dmalloc (sizeof (struct sockaddr_ll), MDL);
-+ if (!sll)
-+ log_fatal("Unable to allocate memory for link layer address");
-+ memcpy(&sll->sll_hatype, &sa->sa_family, sizeof (sll->sll_hatype));
-+ memcpy(sll->sll_addr, sa->sa_data, sizeof (sll->sll_addr));
-+ switch (sll->sll_hatype) {
-+ case ARPHRD_INFINIBAND:
-+ /* ioctl limits hardware addresses to 8 bytes */
-+ sll->sll_halen = 8;
-+ break;
-+ default:
-+ break;
-+ }
-+ return sll;
-+}
-+
-+void
-+get_hw_addr(struct interface_info *info)
-+{
-+ struct hardware *hw = &info->hw_address;
-+ char *name = info->name;
-+ struct ifaddrs *ifaddrs = NULL;
-+ struct ifaddrs *ifa = NULL;
-+ struct sockaddr_ll *sll = NULL;
-+ int sll_allocated = 0;
-+ char *dup = NULL;
-+ char *colon = NULL;
-+
-+ if (getifaddrs(&ifaddrs) == -1)
-+ log_fatal("Failed to get interfaces");
-+
-+ if ((sll = get_ll(ifaddrs, &ifa, name)) == NULL) {
-+ /*
-+ * We were unable to get link-layer address for name.
-+ * Fall back to ioctl(SIOCGIFHWADDR).
-+ */
-+ sll = ioctl_get_ll(name);
-+ if (sll != NULL)
-+ sll_allocated = 1;
-+ else
-+ // shouldn't happen
-+ log_fatal("Unexpected internal error");
-+ }
-+
-+ switch (sll->sll_hatype) {
- case ARPHRD_ETHER:
- hw->hlen = 7;
- hw->hbuf[0] = HTYPE_ETHER;
-- memcpy(&hw->hbuf[1], sa->sa_data, 6);
-+ memcpy(&hw->hbuf[1], sll->sll_addr, 6);
- break;
- case ARPHRD_IEEE802:
- #ifdef ARPHRD_IEEE802_TR
-@@ -504,18 +703,48 @@ get_hw_addr(const char *name, struct har
- #endif /* ARPHRD_IEEE802_TR */
- hw->hlen = 7;
- hw->hbuf[0] = HTYPE_IEEE802;
-- memcpy(&hw->hbuf[1], sa->sa_data, 6);
-+ memcpy(&hw->hbuf[1], sll->sll_addr, 6);
- break;
- case ARPHRD_FDDI:
- hw->hlen = 7;
- hw->hbuf[0] = HTYPE_FDDI;
-- memcpy(&hw->hbuf[1], sa->sa_data, 6);
-+ memcpy(&hw->hbuf[1], sll->sll_addr, 6);
-+ break;
-+ case ARPHRD_INFINIBAND:
-+ dup = strdup(name);
-+ /* Aliased infiniband interface is special case where
-+ * neither get_ll() nor ioctl_get_ll() get's correct hw
-+ * address, so we have to truncate the :0 and run
-+ * get_ll() again for the rest.
-+ */
-+ if ((colon = strchr(dup, ':')) != NULL) {
-+ *colon = '\0';
-+ if ((sll = get_ll(ifaddrs, &ifa, dup)) == NULL)
-+ log_fatal("Error getting hardware address for \"%s\": %m", name);
-+ }
-+ free (dup);
-+ /* For Infiniband, save the broadcast address and store
-+ * the port GUID into the hardware address.
-+ */
-+ if (ifa && (ifa->ifa_flags & IFF_BROADCAST)) {
-+ struct sockaddr_ll *bll;
-+
-+ bll = (struct sockaddr_ll *)ifa->ifa_broadaddr;
-+ memcpy(&info->bcast_addr, bll->sll_addr, 20);
-+ } else {
-+ memcpy(&info->bcast_addr, default_ib_bcast_addr,
-+ 20);
-+ }
-+
-+ hw->hlen = 1;
-+ hw->hbuf[0] = HTYPE_INFINIBAND;
-+ memcpy(&hw->hbuf[1], &sll->sll_addr[sll->sll_halen - 8], 8);
- break;
- #if defined(ARPHRD_PPP)
- case ARPHRD_PPP:
- if (local_family != AF_INET6)
-- log_fatal("Unsupported device type %d for \"%s\"",
-- sa->sa_family, name);
-+ log_fatal("local_family != AF_INET6 for \"%s\"",
-+ name);
- hw->hlen = 0;
- hw->hbuf[0] = HTYPE_RESERVED;
- /* 0xdeadbeef should never occur on the wire,
-@@ -528,10 +757,13 @@ get_hw_addr(const char *name, struct har
- break;
- #endif
- default:
-- log_fatal("Unsupported device type %ld for \"%s\"",
-- (long int)sa->sa_family, name);
-+ freeifaddrs(ifaddrs);
-+ log_fatal("Unsupported device type %hu for \"%s\"",
-+ sll->sll_hatype, name);
- }
-
-- close(sock);
-+ if (sll_allocated)
-+ dfree(sll, MDL);
-+ freeifaddrs(ifaddrs);
- }
- #endif
-diff -up dhcp-4.3.1b1/common/socket.c.bmgpWV dhcp-4.3.1b1/common/socket.c
---- dhcp-4.3.1b1/common/socket.c.bmgpWV 2014-07-02 19:58:38.000000000 +0200
-+++ dhcp-4.3.1b1/common/socket.c 2014-07-10 17:52:57.706272281 +0200
-@@ -322,7 +322,7 @@ void if_register_send (info)
- info->wfdesc = if_register_socket(info, AF_INET, 0, NULL);
- /* If this is a normal IPv4 address, get the hardware address. */
- if (strcmp(info->name, "fallback") != 0)
-- get_hw_addr(info->name, &info->hw_address);
-+ get_hw_addr(info);
- #if defined (USE_SOCKET_FALLBACK)
- /* Fallback only registers for send, but may need to receive as
- well. */
-@@ -385,7 +385,7 @@ void if_register_receive (info)
- #endif /* IP_PKTINFO... */
- /* If this is a normal IPv4 address, get the hardware address. */
- if (strcmp(info->name, "fallback") != 0)
-- get_hw_addr(info->name, &info->hw_address);
-+ get_hw_addr(info);
-
- if (!quiet_interface_discovery)
- log_info ("Listening on Socket/%s%s%s",
-@@ -499,7 +499,7 @@ if_register6(struct interface_info *info
- if (req_multi)
- if_register_multicast(info);
-
-- get_hw_addr(info->name, &info->hw_address);
-+ get_hw_addr(info);
-
- if (!quiet_interface_discovery) {
- if (info->shared_network != NULL) {
-@@ -555,7 +555,7 @@ if_register_linklocal6(struct interface_
- info->rfdesc = sock;
- info->wfdesc = sock;
-
-- get_hw_addr(info->name, &info->hw_address);
-+ get_hw_addr(info);
-
- if (!quiet_interface_discovery) {
- if (info->shared_network != NULL) {
-diff -up dhcp-4.3.1b1/includes/dhcpd.h.bmgpWV dhcp-4.3.1b1/includes/dhcpd.h
---- dhcp-4.3.1b1/includes/dhcpd.h.bmgpWV 2014-07-10 17:50:26.923402536 +0200
-+++ dhcp-4.3.1b1/includes/dhcpd.h 2014-07-10 17:52:57.707272266 +0200
-@@ -1248,6 +1248,7 @@ struct interface_info {
- struct shared_network *shared_network;
- /* Networks connected to this interface. */
- struct hardware hw_address; /* Its physical address. */
-+ u_int8_t bcast_addr[20]; /* Infiniband broadcast address */
- struct in_addr *addresses; /* Addresses associated with this
- * interface.
- */
-@@ -2439,7 +2440,7 @@ void print_dns_status (int, struct dhcp_
- #endif
- const char *print_time(TIME);
-
--void get_hw_addr(const char *name, struct hardware *hw);
-+void get_hw_addr(struct interface_info *info);
-
- /* socket.c */
- #if defined (USE_SOCKET_SEND) || defined (USE_SOCKET_RECEIVE) \
deleted file mode 100644
@@ -1,157 +0,0 @@
-diff -up dhcp-4.3.0a1/client/dhclient-script.8.man dhcp-4.3.0a1/client/dhclient-script.8
---- dhcp-4.3.0a1/client/dhclient-script.8.man 2013-12-11 01:01:02.000000000 +0100
-+++ dhcp-4.3.0a1/client/dhclient-script.8 2013-12-19 15:27:17.617118805 +0100
-@@ -48,7 +48,7 @@ customizations are needed, they should b
- exit hooks provided (see HOOKS for details). These hooks will allow the
- user to override the default behaviour of the client in creating a
- .B /etc/resolv.conf
--file.
-+file, and to handle DHCP options not handled by default.
- .PP
- No standard client script exists for some operating systems, even though
- the actual client may work, so a pioneering user may well need to create
-@@ -92,6 +92,26 @@ present. The
- .B ETCDIR/dhclient-exit-hooks
- script can modify the valid of exit_status to change the exit status
- of dhclient-script.
-+.PP
-+Immediately after dhclient brings an interface UP with a new IP address,
-+subnet mask, and routes, in the REBOOT/BOUND states, it will check for the
-+existence of an executable
-+.B ETCDIR/dhclient-up-hooks
-+script, and source it if found. This script can handle DHCP options in
-+the environment that are not handled by default. A per-interface.
-+.B ETCDIR/dhclient-${IF}-up-hooks
-+script will override the generic script and be sourced when interface
-+$IF has been brought up.
-+.PP
-+Immediately before dhclient brings an interface DOWN, removing its IP
-+address, subnet mask, and routes, in the STOP/RELEASE states, it will
-+check for the existence of an executable
-+.B ETCDIR/dhclient-down-hooks
-+script, and source it if found. This script can handle DHCP options in
-+the environment that are not handled by default. A per-interface
-+.B ETCDIR/dhclient-${IF}-down-hooks
-+script will override the generic script and be sourced when interface
-+$IF is about to be brought down.
- .SH OPERATION
- When dhclient needs to invoke the client configuration script, it
- defines a set of variables in the environment, and then invokes
-diff -up dhcp-4.3.0a1/client/dhclient.conf.5.man dhcp-4.3.0a1/client/dhclient.conf.5
---- dhcp-4.3.0a1/client/dhclient.conf.5.man 2013-12-11 01:01:02.000000000 +0100
-+++ dhcp-4.3.0a1/client/dhclient.conf.5 2013-12-19 15:27:17.617118805 +0100
-@@ -202,7 +202,8 @@ responding to the client send the client
- options. Only the option names should be specified in the request
- statement - not option parameters. By default, the DHCPv4 client
- requests the subnet-mask, broadcast-address, time-offset, routers,
--domain-name, domain-name-servers and host-name options while the DHCPv6
-+domain-search, domain-name, domain-name-servers, host-name, nis-domain,
-+nis-servers, ntp-servers and interface-mtu options while the DHCPv6
- client requests the dhcp6 name-servers and domain-search options. Note
- that if you enter a \'request\' statement, you over-ride these defaults
- and these options will not be requested.
-@@ -688,6 +689,17 @@ know the DHCP service(s) anycast MAC add
- client. The \fIlink-type\fR and \fImac-address\fR parameters are configured
- in a similar manner to the \fBhardware\fR statement.
- .PP
-+ \fBbootp-broadcast-always;\fR
-+.PP
-+The
-+.B bootp-broadcast-always
-+statement instructs dhclient to always set the bootp broadcast flag in
-+request packets, so that servers will always broadcast replies.
-+This is equivalent to supplying the dhclient -B argument, and has
-+the same effect as specifying 'always-broadcast' in the server's dhcpd.conf.
-+This option is provided as an extension to enable dhclient to work
-+on IBM s390 Linux guests.
-+.PP
- .SH SAMPLE
- The following configuration file is used on a laptop running NetBSD
- 1.3. The laptop has an IP alias of 192.5.5.213, and has one
-@@ -713,7 +725,7 @@ interface "ep0" {
- supersede domain-search "fugue.com", "rc.vix.com", "home.vix.com";
- prepend domain-name-servers 127.0.0.1;
- request subnet-mask, broadcast-address, time-offset, routers,
-- domain-name, domain-name-servers, host-name;
-+ domain-search, domain-name, domain-name-servers, host-name;
- require subnet-mask, domain-name-servers;
- script "CLIENTBINDIR/dhclient-script";
- media "media 10baseT/UTP", "media 10base2/BNC";
-diff -up dhcp-4.3.0a1/common/dhcp-options.5.man dhcp-4.3.0a1/common/dhcp-options.5
---- dhcp-4.3.0a1/common/dhcp-options.5.man 2013-12-11 01:25:12.000000000 +0100
-+++ dhcp-4.3.0a1/common/dhcp-options.5 2013-12-19 15:27:17.618118791 +0100
-@@ -914,6 +914,21 @@ classless IP routing - it does not inclu
- classless IP routing is now the most widely deployed routing standard,
- this option is virtually useless, and is not implemented by any of the
- popular DHCP clients, for example the Microsoft DHCP client.
-+.PP
-+NOTE to Fedora dhclient users:
-+.br
-+dhclient-script interprets trailing 0 octets of the target as indicating
-+the subnet class of the route, so for the following static-routes value:
-+.br
-+ option static-routes 172.0.0.0 172.16.2.254,
-+.br
-+ 192.168.0.0 192.168.2.254;
-+.br
-+dhclient-script will create routes:
-+.br
-+ 172/8 via 172.16.2.254 dev $interface
-+.br
-+ 192.168/16 via 192.168.2.254 dev $interface
- .RE
- .PP
- .nf
-diff -up dhcp-4.3.0a1/server/dhcpd.conf.5.man dhcp-4.3.0a1/server/dhcpd.conf.5
---- dhcp-4.3.0a1/server/dhcpd.conf.5.man 2013-12-13 21:49:44.000000000 +0100
-+++ dhcp-4.3.0a1/server/dhcpd.conf.5 2013-12-19 15:30:14.266670962 +0100
-@@ -527,6 +527,9 @@ pool {
- };
- .fi
- .PP
-+Dynamic BOOTP leases are not compatible with failover, and, as such,
-+you need to disallow BOOTP in pools that you are using failover for.
-+.PP
- The server currently does very little sanity checking, so if you
- configure it wrong, it will just fail in odd ways. I would recommend
- therefore that you either do failover or don't do failover, but don't
-@@ -541,9 +544,9 @@ primary server might look like this:
- failover peer "foo" {
- primary;
- address anthrax.rc.vix.com;
-- port 519;
-+ port 647;
- peer address trantor.rc.vix.com;
-- peer port 520;
-+ peer port 847;
- max-response-delay 60;
- max-unacked-updates 10;
- mclt 3600;
-@@ -1241,7 +1244,7 @@ the zone containing PTR records - for IS
- .PP
- .nf
- key DHCP_UPDATER {
-- algorithm HMAC-MD5.SIG-ALG.REG.INT;
-+ algorithm hmac-md5;
- secret pRP5FapFoJ95JEL06sv4PQ==;
- };
-
-@@ -1264,7 +1267,7 @@ dhcpd.conf file:
- .PP
- .nf
- key DHCP_UPDATER {
-- algorithm HMAC-MD5.SIG-ALG.REG.INT;
-+ algorithm hmac-md5;
- secret pRP5FapFoJ95JEL06sv4PQ==;
- };
-
-@@ -2539,7 +2542,8 @@ statement
- The \fInext-server\fR statement is used to specify the host address of
- the server from which the initial boot file (specified in the
- \fIfilename\fR statement) is to be loaded. \fIServer-name\fR should
--be a numeric IP address or a domain name.
-+be a numeric IP address or a domain name. If no \fInext-server\fR statement
-+applies to a given client, the address 0.0.0.0 is used.
- .RE
- .PP
- The
deleted file mode 100644
@@ -1,156 +0,0 @@
-diff -up dhcp-4.3.1b1/client/dhclient.c.dlTsyN dhcp-4.3.1b1/client/dhclient.c
---- dhcp-4.3.1b1/client/dhclient.c.dlTsyN 2014-07-10 17:49:49.882925843 +0200
-+++ dhcp-4.3.1b1/client/dhclient.c 2014-07-10 17:50:26.922402550 +0200
-@@ -1748,11 +1748,6 @@ int write_host (host)
- return 0;
- }
-
--void db_startup (testp)
-- int testp;
--{
--}
--
- void bootp (packet)
- struct packet *packet;
- {
-diff -up dhcp-4.3.1b1/includes/dhcpd.h.dlTsyN dhcp-4.3.1b1/includes/dhcpd.h
---- dhcp-4.3.1b1/includes/dhcpd.h.dlTsyN 2014-07-10 17:48:03.798424601 +0200
-+++ dhcp-4.3.1b1/includes/dhcpd.h 2014-07-10 17:50:26.923402536 +0200
-@@ -2866,7 +2866,11 @@ void commit_leases_timeout (void *);
- void commit_leases_readerdry(void *);
- int commit_leases (void);
- int commit_leases_timed (void);
-+#if defined (PARANOIA)
-+void db_startup (int, uid_t, gid_t);
-+#else
- void db_startup (int);
-+#endif /* PARANOIA */
- int new_lease_file (void);
- int group_writer (struct group_object *);
- int write_ia(const struct ia_xx *);
-diff -up dhcp-4.3.1b1/server/confpars.c.dlTsyN dhcp-4.3.1b1/server/confpars.c
---- dhcp-4.3.1b1/server/confpars.c.dlTsyN 2014-07-10 17:39:25.801764596 +0200
-+++ dhcp-4.3.1b1/server/confpars.c 2014-07-10 17:50:26.924402522 +0200
-@@ -219,7 +219,11 @@ void trace_conf_input (trace_type_t *tty
- }
-
- if (!leaseconf_initialized && ttype == trace_readleases_type) {
-+#if defined (PARANOIA)
-+ db_startup (0, 0, 0);
-+#else
- db_startup (0);
-+#endif /* PARANOIA */
- leaseconf_initialized = 1;
- postdb_startup ();
- }
-diff -up dhcp-4.3.1b1/server/db.c.dlTsyN dhcp-4.3.1b1/server/db.c
---- dhcp-4.3.1b1/server/db.c.dlTsyN 2014-07-10 17:39:25.801764596 +0200
-+++ dhcp-4.3.1b1/server/db.c 2014-07-10 17:50:26.925402508 +0200
-@@ -42,6 +42,10 @@ static int counting = 0;
- static int count = 0;
- TIME write_time;
- int lease_file_is_corrupt = 0;
-+#if defined (PARANOIA)
-+uid_t global_set_uid = 0;
-+gid_t global_set_gid = 0;
-+#endif /* PARANOIA */
-
- /* Write a single binding scope value in parsable format.
- */
-@@ -1046,8 +1050,11 @@ int commit_leases_timed()
- return (1);
- }
-
--void db_startup (testp)
-- int testp;
-+#if defined (PARANOIA)
-+void db_startup (int testp, uid_t set_uid, gid_t set_gid)
-+#else
-+void db_startup (int testp)
-+#endif /* PARANOIA */
- {
- isc_result_t status;
-
-@@ -1066,6 +1073,11 @@ void db_startup (testp)
- }
- #endif
-
-+#if defined (PARANOIA)
-+ global_set_uid = set_uid;
-+ global_set_gid = set_gid;
-+#endif /* PARANOIA */
-+
- #if defined (TRACING)
- /* If we're playing back, there is no lease file, so we can't
- append it, so we create one immediately (maybe this isn't
-@@ -1128,6 +1140,17 @@ int new_lease_file ()
- log_error ("Can't create new lease file: %m");
- return 0;
- }
-+
-+#if defined (PARANOIA)
-+ if (global_set_uid && !geteuid() &&
-+ global_set_gid && !getegid())
-+ if (fchown(db_fd, global_set_uid, global_set_gid)) {
-+ log_fatal ("Can't chown new lease file: %m");
-+ close(db_fd);
-+ goto fdfail;
-+ }
-+#endif /* PARANOIA */
-+
- if ((new_db_file = fdopen(db_fd, "we")) == NULL) {
- log_error("Can't fdopen new lease file: %m");
- close(db_fd);
-diff -up dhcp-4.3.1b1/server/dhcpd.8.dlTsyN dhcp-4.3.1b1/server/dhcpd.8
---- dhcp-4.3.1b1/server/dhcpd.8.dlTsyN 2014-07-02 19:58:39.000000000 +0200
-+++ dhcp-4.3.1b1/server/dhcpd.8 2014-07-10 17:50:26.925402508 +0200
-@@ -82,6 +82,18 @@ dhcpd - Dynamic Host Configuration Proto
- .I trace-output-file
- ]
- [
-+.B -user
-+.I user
-+]
-+[
-+.B -group
-+.I group
-+]
-+[
-+.B -chroot
-+.I dir
-+]
-+[
- .B -play
- .I trace-playback-file
- ]
-@@ -269,6 +281,15 @@ lease file.
- .TP
- .BI --version
- Print version number and exit.
-+.TP
-+.BI \-user \ user
-+Setuid to user after completing privileged operations, such as creating sockets that listen on privileged ports.
-+.TP
-+.BI \-group \ group
-+Setgid to group after completing privileged operations, such as creating sockets that listen on privileged ports.
-+.TP
-+.BI \-chroot \ dir
-+Chroot to directory after processing the command line arguments, but before reading the configuration file.
- .PP
- .I Modifying default file locations:
- The following options can be used to modify the locations
-diff -up dhcp-4.3.1b1/server/dhcpd.c.dlTsyN dhcp-4.3.1b1/server/dhcpd.c
---- dhcp-4.3.1b1/server/dhcpd.c.dlTsyN 2014-07-10 17:39:25.802764582 +0200
-+++ dhcp-4.3.1b1/server/dhcpd.c 2014-07-10 17:52:35.341588248 +0200
-@@ -628,7 +628,11 @@ main(int argc, char **argv) {
- group_write_hook = group_writer;
-
- /* Start up the database... */
-+#if defined (PARANOIA)
-+ db_startup (lftest, set_uid, set_gid);
-+#else
- db_startup (lftest);
-+#endif /* PARANOIA */
-
- if (lftest)
- exit (0);
deleted file mode 100644
@@ -1,44 +0,0 @@
---- expanded_org/includes/dhcpd.h Wed Aug 06 23:35:02 2014
-+++ expanded_patched_51_4_2_0_paths_patch/includes/dhcpd.h Mon Feb 16 13:22:11 2015
-@@ -1424,15 +1424,15 @@
- #else /* !DEBUG */
-
- #ifndef _PATH_DHCPD_CONF
--#define _PATH_DHCPD_CONF "/etc/dhcpd.conf"
-+#define _PATH_DHCPD_CONF "/etc/dhcp/dhcpd.conf"
- #endif /* DEBUG */
-
- #ifndef _PATH_DHCPD_DB
--#define _PATH_DHCPD_DB LOCALSTATEDIR"/db/dhcpd.leases"
-+#define _PATH_DHCPD_DB LOCALSTATEDIR"/dhcpd/dhcpd.leases"
- #endif
-
- #ifndef _PATH_DHCPD6_DB
--#define _PATH_DHCPD6_DB LOCALSTATEDIR"/db/dhcpd6.leases"
-+#define _PATH_DHCPD6_DB LOCALSTATEDIR"/dhcpd/dhcpd6.leases"
- #endif
-
- #ifndef _PATH_DHCPD_PID
-@@ -1446,7 +1446,7 @@
- #endif /* DEBUG */
-
- #ifndef _PATH_DHCLIENT_CONF
--#define _PATH_DHCLIENT_CONF "/etc/dhclient.conf"
-+#define _PATH_DHCLIENT_CONF "/etc/dhcp/dhclient.conf"
- #endif
-
- #ifndef _PATH_DHCLIENT_SCRIPT
-@@ -1462,11 +1462,11 @@
- #endif
-
- #ifndef _PATH_DHCLIENT_DB
--#define _PATH_DHCLIENT_DB LOCALSTATEDIR"/db/dhclient.leases"
-+#define _PATH_DHCLIENT_DB LOCALSTATEDIR"/dhclient/dhclient.leases"
- #endif
-
- #ifndef _PATH_DHCLIENT6_DB
--#define _PATH_DHCLIENT6_DB LOCALSTATEDIR"/db/dhclient6.leases"
-+#define _PATH_DHCLIENT6_DB LOCALSTATEDIR"/dhclient/dhclient6.leases"
- #endif
-
- #ifndef _PATH_RESOLV_CONF
deleted file mode 100644
@@ -1,85 +0,0 @@
-diff -up dhcp-4.3.0a1/client/dhclient.c.ifup dhcp-4.3.0a1/client/dhclient.c
---- dhcp-4.3.0a1/client/dhclient.c.ifup 2013-12-19 14:53:08.817760677 +0100
-+++ dhcp-4.3.0a1/client/dhclient.c 2013-12-19 15:05:16.290518574 +0100
-@@ -521,9 +521,81 @@ main(int argc, char **argv) {
- }
- }
- fclose(pidfd);
-+ } else {
-+ /* handle release for interfaces requested with Red Hat
-+ * /sbin/ifup - pidfile will be /var/run/dhclient-$interface.pid
-+ */
-+
-+ if ((path_dhclient_pid == NULL) || (*path_dhclient_pid == '\0'))
-+ path_dhclient_pid = "/var/run/dhclient.pid";
-+
-+ char *new_path_dhclient_pid;
-+ struct interface_info *ip;
-+ int pdp_len = strlen(path_dhclient_pid), pfx, dpfx;
-+
-+ /* find append point: beginning of any trailing '.pid'
-+ * or '-$IF.pid' */
-+ for (pfx=pdp_len; (pfx >= 0) && (path_dhclient_pid[pfx] != '.') && (path_dhclient_pid[pfx] != '/'); pfx--);
-+ if (pfx == -1)
-+ pfx = pdp_len;
-+
-+ if (path_dhclient_pid[pfx] == '/')
-+ pfx += 1;
-+
-+ for (dpfx=pfx; (dpfx >= 0) && (path_dhclient_pid[dpfx] != '-') && (path_dhclient_pid[dpfx] != '/'); dpfx--);
-+ if ((dpfx > -1) && (path_dhclient_pid[dpfx] != '/'))
-+ pfx = dpfx;
-+
-+ for (ip = interfaces; ip; ip = ip->next) {
-+ if (interfaces_requested && (ip->flags & (INTERFACE_REQUESTED))) {
-+ int n_len = strlen(ip->name);
-+
-+ new_path_dhclient_pid = (char*) malloc(pfx + n_len + 6);
-+ strncpy(new_path_dhclient_pid, path_dhclient_pid, pfx);
-+ sprintf(new_path_dhclient_pid + pfx, "-%s.pid", ip->name);
-+
-+ if ((pidfd = fopen(new_path_dhclient_pid, "r")) != NULL) {
-+ e = fscanf(pidfd, "%ld\n", &temp);
-+ oldpid = (pid_t)temp;
-+
-+ if (e != 0 && e != EOF) {
-+ if (oldpid) {
-+ if (kill(oldpid, SIGTERM) == 0)
-+ unlink(path_dhclient_pid);
-+ }
-+ }
-+
-+ fclose(pidfd);
-+ }
-+
-+ free(new_path_dhclient_pid);
-+ }
-+ }
-+ }
-+ } else {
-+ FILE *pidfp = NULL;
-+ long temp = 0;
-+ pid_t dhcpid = 0;
-+ int dhc_running = 0;
-+ char procfn[256] = "";
-+
-+ if ((pidfp = fopen(path_dhclient_pid, "r")) != NULL) {
-+ if ((fscanf(pidfp, "%ld", &temp)==1) && ((dhcpid=(pid_t)temp) > 0)) {
-+ snprintf(procfn,256,"/proc/%u",dhcpid);
-+ dhc_running = (access(procfn, F_OK) == 0);
-+ }
-+
-+ fclose(pidfp);
-+ }
-+
-+ if (dhc_running) {
-+ log_fatal("dhclient(%u) is already running - exiting. ", dhcpid);
-+ return(1);
- }
- }
-
-+ write_client_pid_file();
-+
- if (!quiet) {
- log_info("%s %s", message, PACKAGE_VERSION);
- log_info(copyright);
deleted file mode 100644
@@ -1,192 +0,0 @@
-diff -up dhcp-4.3.1b1/client/Makefile.am.brGmwh dhcp-4.3.1b1/client/Makefile.am
---- dhcp-4.3.1b1/client/Makefile.am.brGmwh 2014-07-02 19:58:38.000000000 +0200
-+++ dhcp-4.3.1b1/client/Makefile.am 2014-07-10 17:36:30.484250976 +0200
-@@ -10,8 +10,8 @@ dhclient_SOURCES = clparse.c dhclient.c
- scripts/bsdos scripts/freebsd scripts/linux scripts/macos \
- scripts/netbsd scripts/nextstep scripts/openbsd \
- scripts/solaris scripts/openwrt
--dhclient_LDADD = ../common/libdhcp.a ../omapip/libomapi.a ../bind/lib/libirs.a \
-- ../bind/lib/libdns.a ../bind/lib/libisccfg.a ../bind/lib/libisc.a
-+dhclient_LDADD = ../common/libdhcp.a ../omapip/libomapi.a \
-+ $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
- man_MANS = dhclient.8 dhclient-script.8 dhclient.conf.5 dhclient.leases.5
- EXTRA_DIST = $(man_MANS)
-
-diff -up dhcp-4.3.1b1/common/tests/Makefile.am.brGmwh dhcp-4.3.1b1/common/tests/Makefile.am
---- dhcp-4.3.1b1/common/tests/Makefile.am.brGmwh 2014-07-10 17:36:30.485250962 +0200
-+++ dhcp-4.3.1b1/common/tests/Makefile.am 2014-07-10 17:38:04.010924566 +0200
-@@ -13,21 +13,20 @@ ATF_TESTS += alloc_unittest dns_unittest
- alloc_unittest_SOURCES = test_alloc.c $(top_srcdir)/tests/t_api_dhcp.c
- alloc_unittest_LDADD = $(ATF_LDFLAGS)
- alloc_unittest_LDADD += ../libdhcp.a \
-- ../../omapip/libomapi.a ../../bind/lib/libirs.a \
-- ../../bind/lib/libdns.a ../../bind/lib/libisccfg.a ../../bind/lib/libisc.a
-+ ../../omapip/libomapi.a \
-+ $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
-
- dns_unittest_SOURCES = dns_unittest.c $(top_srcdir)/tests/t_api_dhcp.c
- dns_unittest_LDADD = $(ATF_LDFLAGS)
- dns_unittest_LDADD += ../libdhcp.a \
-- ../../omapip/libomapi.a ../../bind/lib/libirs.a \
-- ../../bind/lib/libdns.a ../../bind/lib/libisccfg.a ../../bind/lib/libisc.a
-+ ../../omapip/libomapi.a \
-+ $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
-
- misc_unittest_SOURCES = misc_unittest.c $(top_srcdir)/tests/t_api_dhcp.c
- misc_unittest_LDADD = $(ATF_LDFLAGS)
- misc_unittest_LDADD += ../libdhcp.a \
-- ../../omapip/libomapi.a ../../bind/lib/libirs.a \
-- ../../bind/lib/libdns.a ../../bind/lib/libisccfg.a ../../bind/lib/libisc.a
--
-+ ../../omapip/libomapi.a \
-+ $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
- check: $(ATF_TESTS)
- atf-run | atf-report
-
-diff -up dhcp-4.3.1b1/configure.ac.brGmwh dhcp-4.3.1b1/configure.ac
---- dhcp-4.3.1b1/configure.ac.brGmwh 2014-07-02 20:01:26.000000000 +0200
-+++ dhcp-4.3.1b1/configure.ac 2014-07-10 17:36:30.485250962 +0200
-@@ -562,20 +562,37 @@ AC_CHECK_MEMBER(struct msghdr.msg_contro
-
- libbind=
- AC_ARG_WITH(libbind,
-- AS_HELP_STRING([--with-libbind=PATH],[bind includes and libraries are in PATH
-- (default is ./bind)]),
-+ AS_HELP_STRING([--with-libbind=PATH],[bind includes are in PATH
-+ (default is ./bind/includes)]),
- use_libbind="$withval", use_libbind="no")
- case "$use_libbind" in
-+yes|no)
-+ libbind="\${top_srcdir}/bind/include"
-+ ;;
-+*)
-+ libbind="$use_libbind"
-+ ;;
-+esac
-+
-+BIND9_LIBDIR='-L$(top_builddir)/bind/lib'
-+AC_ARG_WITH(libbind-libs,
-+ AC_HELP_STRING([--with-libbind-libs=PATH],
-+ [bind9 export libraries are in PATH]),
-+ [libbind_libs="$withval"], [libbind_libs='no'])
-+case "$libbind_libs" in
- yes)
-- libbind="\${top_srcdir}/bind"
-+ AC_MSG_ERROR([Specify path to bind9 libraries])
- ;;
- no)
-- libbind="\${top_srcdir}/bind"
-+ BUNDLED_BIND=yes
- ;;
- *)
-- libbind="$use_libbind"
-+ BIND9_LIBDIR="-L$libbind_libs"
-+ BUNDLED_BIND=no
- ;;
- esac
-+AM_CONDITIONAL([BUNDLED_BIND], [test "$BUNDLED_BIND" = yes])
-+AC_SUBST([BIND9_LIBDIR])
-
- # OpenLDAP support.
- AC_ARG_WITH(ldap,
-@@ -610,7 +627,7 @@ fi
- CFLAGS="$CFLAGS $STD_CWARNINGS"
-
- # Try to add the bind include directory
--CFLAGS="$CFLAGS -I$libbind/include"
-+CFLAGS="$CFLAGS -I$libbind"
-
- case "$host" in
- *-darwin*)
-diff -up dhcp-4.3.1b1/dhcpctl/Makefile.am.brGmwh dhcp-4.3.1b1/dhcpctl/Makefile.am
---- dhcp-4.3.1b1/dhcpctl/Makefile.am.brGmwh 2014-07-02 19:58:38.000000000 +0200
-+++ dhcp-4.3.1b1/dhcpctl/Makefile.am 2014-07-10 17:36:30.485250962 +0200
-@@ -6,12 +6,9 @@ EXTRA_DIST = $(man_MANS)
-
- omshell_SOURCES = omshell.c
- omshell_LDADD = libdhcpctl.a ../common/libdhcp.a ../omapip/libomapi.a \
-- ../bind/lib/libirs.a ../bind/lib/libdns.a \
-- ../bind/lib/libisccfg.a ../bind/lib/libisc.a
--
-+ $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
- libdhcpctl_a_SOURCES = dhcpctl.c callback.c remote.c
-
- cltest_SOURCES = cltest.c
- cltest_LDADD = libdhcpctl.a ../common/libdhcp.a ../omapip/libomapi.a \
-- ../bind/lib/libirs.a ../bind/lib/libdns.a \
-- ../bind/lib/libisccfg.a ../bind/lib/libisc.a
-+ $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
-diff -up dhcp-4.3.1b1/Makefile.am.brGmwh dhcp-4.3.1b1/Makefile.am
---- dhcp-4.3.1b1/Makefile.am.brGmwh 2014-07-02 19:58:38.000000000 +0200
-+++ dhcp-4.3.1b1/Makefile.am 2014-07-10 17:36:30.484250976 +0200
-@@ -25,7 +25,13 @@ EXTRA_DIST = RELNOTES LICENSE \
- bind/Makefile bind/bind.tar.gz bind/version.tmp \
- common/tests/Atffile server/tests/Atffile
-
--SUBDIRS = bind includes tests common dst omapip client dhcpctl relay server
-+if BUNDLED_BIND
-+SUBDIRS = bind
-+else
-+SUBDIRS =
-+endif
-+
-+SUBDIRS += includes tests common dst omapip client dhcpctl relay server
-
- nobase_include_HEADERS = dhcpctl/dhcpctl.h
-
-diff -up dhcp-4.3.1b1/omapip/Makefile.am.brGmwh dhcp-4.3.1b1/omapip/Makefile.am
---- dhcp-4.3.1b1/omapip/Makefile.am.brGmwh 2014-07-02 19:58:39.000000000 +0200
-+++ dhcp-4.3.1b1/omapip/Makefile.am 2014-07-10 17:36:30.486250948 +0200
-@@ -10,6 +10,5 @@ man_MANS = omapi.3
- EXTRA_DIST = $(man_MANS)
-
- svtest_SOURCES = test.c
--svtest_LDADD = libomapi.a ../bind/lib/libirs.a ../bind/lib/libdns.a \
-- ../bind/lib/libisccfg.a ../bind/lib/libisc.a
--
-+svtest_LDADD = libomapi.a \
-+ $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
-diff -up dhcp-4.3.1b1/relay/Makefile.am.brGmwh dhcp-4.3.1b1/relay/Makefile.am
---- dhcp-4.3.1b1/relay/Makefile.am.brGmwh 2014-07-02 19:58:39.000000000 +0200
-+++ dhcp-4.3.1b1/relay/Makefile.am 2014-07-10 17:36:30.486250948 +0200
-@@ -3,8 +3,7 @@ AM_CPPFLAGS = -DLOCALSTATEDIR='"@localst
- sbin_PROGRAMS = dhcrelay
- dhcrelay_SOURCES = dhcrelay.c
- dhcrelay_LDADD = ../common/libdhcp.a ../omapip/libomapi.a \
-- ../bind/lib/libirs.a ../bind/lib/libdns.a \
-- ../bind/lib/libisccfg.a ../bind/lib/libisc.a
-+ $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
- man_MANS = dhcrelay.8
- EXTRA_DIST = $(man_MANS)
-
-diff -up dhcp-4.3.1b1/server/Makefile.am.brGmwh dhcp-4.3.1b1/server/Makefile.am
---- dhcp-4.3.1b1/server/Makefile.am.brGmwh 2014-07-02 19:58:39.000000000 +0200
-+++ dhcp-4.3.1b1/server/Makefile.am 2014-07-10 17:36:30.486250948 +0200
-@@ -13,10 +13,8 @@ dhcpd_SOURCES = dhcpd.c dhcp.c bootp.c c
- dhcpv6.c mdb6.c ldap.c ldap_casa.c
-
- dhcpd_CFLAGS = $(LDAP_CFLAGS)
--dhcpd_LDADD = ../common/libdhcp.a ../omapip/libomapi.a \
-- ../dhcpctl/libdhcpctl.a ../bind/lib/libirs.a \
-- ../bind/lib/libdns.a ../bind/lib/libisccfg.a ../bind/lib/libisc.a
--
-+dhcpd_LDADD = ../common/libdhcp.a ../omapip/libomapi.a ../dhcpctl/libdhcpctl.a \
-+ $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
- man_MANS = dhcpd.8 dhcpd.conf.5 dhcpd.leases.5
- EXTRA_DIST = $(man_MANS)
-
-diff -up dhcp-4.3.1b1/server/tests/Makefile.am.brGmwh dhcp-4.3.1b1/server/tests/Makefile.am
---- dhcp-4.3.1b1/server/tests/Makefile.am.brGmwh 2014-07-02 19:58:40.000000000 +0200
-+++ dhcp-4.3.1b1/server/tests/Makefile.am 2014-07-10 17:36:30.486250948 +0200
-@@ -18,9 +18,8 @@ DHCPSRC = ../dhcp.c ../bootp.c ../confpa
- ../ldap.c ../ldap_casa.c ../dhcpd.c
-
- DHCPLIBS = $(top_builddir)/common/libdhcp.a $(top_builddir)/omapip/libomapi.a \
-- $(top_builddir)/dhcpctl/libdhcpctl.a $(top_builddir)/bind/lib/libirs.a \
-- $(top_builddir)/bind/lib/libdns.a $(top_builddir)/bind/lib/libisccfg.a \
-- $(top_builddir)/bind/lib/libisc.a
-+ $(top_builddir)/dhcpctl/libdhcpctl.a \
-+ $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
-
- ATF_TESTS =
- TESTS =
deleted file mode 100644
@@ -1,405 +0,0 @@
-diff -up dhcp-4.3.0rc1/client/clparse.c.rfc3442 dhcp-4.3.0rc1/client/clparse.c
---- dhcp-4.3.0rc1/client/clparse.c.rfc3442 2014-01-29 10:05:48.474400352 +0100
-+++ dhcp-4.3.0rc1/client/clparse.c 2014-01-29 10:05:48.517399955 +0100
-@@ -31,7 +31,7 @@
-
- struct client_config top_level_config;
-
--#define NUM_DEFAULT_REQUESTED_OPTS 14
-+#define NUM_DEFAULT_REQUESTED_OPTS 15
- struct option *default_requested_options[NUM_DEFAULT_REQUESTED_OPTS + 1];
-
- static void parse_client_default_duid(struct parse *cfile);
-@@ -84,7 +84,11 @@ isc_result_t read_client_conf ()
- dhcp_universe.code_hash, &code, 0, MDL);
-
- /* 4 */
-- code = DHO_ROUTERS;
-+ /* The Classless Static Routes option code MUST appear in the parameter
-+ * request list prior to both the Router option code and the Static
-+ * Routes option code, if present. (RFC3442)
-+ */
-+ code = DHO_CLASSLESS_STATIC_ROUTES;
- option_code_hash_lookup(&default_requested_options[3],
- dhcp_universe.code_hash, &code, 0, MDL);
-
-@@ -138,6 +142,11 @@ isc_result_t read_client_conf ()
- option_code_hash_lookup(&default_requested_options[13],
- dhcp_universe.code_hash, &code, 0, MDL);
-
-+ /* 15 */
-+ code = DHO_ROUTERS;
-+ option_code_hash_lookup(&default_requested_options[14],
-+ dhcp_universe.code_hash, &code, 0, MDL);
-+
- for (code = 0 ; code < NUM_DEFAULT_REQUESTED_OPTS ; code++) {
- if (default_requested_options[code] == NULL)
- log_fatal("Unable to find option definition for "
-diff -up dhcp-4.3.0rc1/common/dhcp-options.5.rfc3442 dhcp-4.3.0rc1/common/dhcp-options.5
---- dhcp-4.3.0rc1/common/dhcp-options.5.rfc3442 2014-01-29 10:05:48.466400426 +0100
-+++ dhcp-4.3.0rc1/common/dhcp-options.5 2014-01-29 10:05:48.518399945 +0100
-@@ -111,6 +111,26 @@ hexadecimal, separated by colons. For e
- or
- option dhcp-client-identifier 43:4c:49:45:54:2d:46:4f:4f;
- .fi
-+.PP
-+The
-+.B destination-descriptor
-+describe the IP subnet number and subnet mask
-+of a particular destination using a compact encoding. This encoding
-+consists of one octet describing the width of the subnet mask,
-+followed by all the significant octets of the subnet number.
-+The following table contains some examples of how various subnet
-+number/mask combinations can be encoded:
-+.nf
-+.sp 1
-+Subnet number Subnet mask Destination descriptor
-+0 0 0
-+10.0.0.0 255.0.0.0 8.10
-+10.0.0.0 255.255.255.0 24.10.0.0
-+10.17.0.0 255.255.0.0 16.10.17
-+10.27.129.0 255.255.255.0 24.10.27.129
-+10.229.0.128 255.255.255.128 25.10.229.0.128
-+10.198.122.47 255.255.255.255 32.10.198.122.47
-+.fi
- .SH SETTING OPTION VALUES USING EXPRESSIONS
- Sometimes it's helpful to be able to set the value of a DHCP option
- based on some value that the client has sent. To do this, you can
-@@ -972,6 +992,29 @@ dhclient-script will create routes:
- .RE
- .PP
- .nf
-+.B option \fBclassless-static-routes\fR \fIdestination-descriptor ip-address\fR
-+ [\fB,\fR \fIdestination-descriptor ip-address\fR...]\fB;\fR
-+.fi
-+.RS 0.25i
-+.PP
-+This option (see RFC3442) specifies a list of classless static routes
-+that the client should install in its routing cache.
-+.PP
-+This option can contain one or more static routes, each of which
-+consists of a destination descriptor and the IP address of the router
-+that should be used to reach that destination.
-+.PP
-+Many clients may not implement the Classless Static Routes option.
-+DHCP server administrators should therefore configure their DHCP
-+servers to send both a Router option and a Classless Static Routes
-+option, and should specify the default router(s) both in the Router
-+option and in the Classless Static Routes option.
-+.PP
-+If the DHCP server returns both a Classless Static Routes option and
-+a Router option, the DHCP client ignores the Router option.
-+.RE
-+.PP
-+.nf
- .B option \fBstreettalk-directory-assistance-server\fR \fIip-address\fR
- [\fB,\fR \fIip-address\fR...]\fB;\fR
- .fi
-diff -up dhcp-4.3.0rc1/common/inet.c.rfc3442 dhcp-4.3.0rc1/common/inet.c
---- dhcp-4.3.0rc1/common/inet.c.rfc3442 2014-01-26 19:40:44.000000000 +0100
-+++ dhcp-4.3.0rc1/common/inet.c 2014-01-29 10:05:48.519399936 +0100
-@@ -521,6 +521,60 @@ free_iaddrcidrnetlist(struct iaddrcidrne
- return ISC_R_SUCCESS;
- }
-
-+static const char *
-+inet_ntopdd(const unsigned char *src, unsigned srclen, char *dst, size_t size)
-+{
-+ char tmp[sizeof("32.255.255.255.255")];
-+ int len;
-+
-+ switch (srclen) {
-+ case 2:
-+ len = sprintf (tmp, "%u.%u", src[0], src[1]);
-+ break;
-+ case 3:
-+ len = sprintf (tmp, "%u.%u.%u", src[0], src[1], src[2]);
-+ break;
-+ case 4:
-+ len = sprintf (tmp, "%u.%u.%u.%u", src[0], src[1], src[2], src[3]);
-+ break;
-+ case 5:
-+ len = sprintf (tmp, "%u.%u.%u.%u.%u", src[0], src[1], src[2], src[3], src[4]);
-+ break;
-+ default:
-+ return NULL;
-+ }
-+ if (len < 0)
-+ return NULL;
-+
-+ if (len > size) {
-+ errno = ENOSPC;
-+ return NULL;
-+ }
-+
-+ return strcpy (dst, tmp);
-+}
-+
-+/* pdestdesc() turns an iaddr structure into a printable dest. descriptor */
-+const char *
-+pdestdesc(const struct iaddr addr) {
-+ static char pbuf[sizeof("255.255.255.255.255")];
-+
-+ if (addr.len == 0) {
-+ return "<null destination descriptor>";
-+ }
-+ if (addr.len == 1) {
-+ return "0";
-+ }
-+ if ((addr.len >= 2) && (addr.len <= 5)) {
-+ return inet_ntopdd(addr.iabuf, addr.len, pbuf, sizeof(pbuf));
-+ }
-+
-+ log_fatal("pdestdesc():%s:%d: Invalid destination descriptor length %d.",
-+ MDL, addr.len);
-+ /* quell compiler warnings */
-+ return NULL;
-+}
-+
- /* piaddr() turns an iaddr structure into a printable address. */
- /* XXX: should use a const pointer rather than passing the structure */
- const char *
-diff -up dhcp-4.3.0rc1/common/options.c.rfc3442 dhcp-4.3.0rc1/common/options.c
---- dhcp-4.3.0rc1/common/options.c.rfc3442 2014-01-26 19:40:44.000000000 +0100
-+++ dhcp-4.3.0rc1/common/options.c 2014-01-29 10:05:48.520399927 +0100
-@@ -707,7 +707,11 @@ cons_options(struct packet *inpacket, st
- * packet.
- */
- priority_list[priority_len++] = DHO_SUBNET_MASK;
-- priority_list[priority_len++] = DHO_ROUTERS;
-+ if (lookup_option(&dhcp_universe, cfg_options,
-+ DHO_CLASSLESS_STATIC_ROUTES))
-+ priority_list[priority_len++] = DHO_CLASSLESS_STATIC_ROUTES;
-+ else
-+ priority_list[priority_len++] = DHO_ROUTERS;
- priority_list[priority_len++] = DHO_DOMAIN_NAME_SERVERS;
- priority_list[priority_len++] = DHO_HOST_NAME;
- priority_list[priority_len++] = DHO_FQDN;
-@@ -1688,6 +1692,7 @@ const char *pretty_print_option (option,
- unsigned long tval;
- isc_boolean_t a_array = ISC_FALSE;
- int len_used;
-+ unsigned int octets = 0;
-
- if (emit_commas)
- comma = ',';
-@@ -1696,6 +1701,7 @@ const char *pretty_print_option (option,
-
- memset (enumbuf, 0, sizeof enumbuf);
-
-+ if (option->format[0] != 'R') { /* see explanation lower */
- /* Figure out the size of the data. */
- for (l = i = 0; option -> format [i]; i++, l++) {
- if (l >= sizeof(fmtbuf) - 1)
-@@ -1870,6 +1876,33 @@ const char *pretty_print_option (option,
- if (numhunk < 0)
- numhunk = 1;
-
-+ } else { /* option->format[i] == 'R') */
-+ /* R (destination descriptor) has variable length.
-+ * We can find it only in classless static route option,
-+ * so we are for sure parsing classless static route option now.
-+ * We go through whole the option to check whether there are no
-+ * missing/extra bytes.
-+ * I didn't find out how to improve the existing code and that's the
-+ * reason for this separate 'else' where I do my own checkings.
-+ * I know it's little bit unsystematic, but it works.
-+ */
-+ numhunk = 0;
-+ numelem = 2; /* RI */
-+ fmtbuf[0]='R'; fmtbuf[1]='I'; fmtbuf[2]=0;
-+ for (i =0; i < len; i = i + octets + 5) {
-+ if (data[i] > 32) { /* subnet mask width */
-+ log_error ("wrong subnet mask width in destination descriptor");
-+ break;
-+ }
-+ numhunk++;
-+ octets = ((data[i]+7) / 8);
-+ }
-+ if (i != len) {
-+ log_error ("classless static routes option has wrong size or "
-+ "there's some garbage in format");
-+ }
-+ }
-+
- /* Cycle through the array (or hunk) printing the data. */
- for (i = 0; i < numhunk; i++) {
- if ((a_array == ISC_TRUE) && (i != 0) && (numelem > 0)) {
-@@ -2025,6 +2058,20 @@ const char *pretty_print_option (option,
- strcpy(op, piaddr(iaddr));
- dp += 4;
- break;
-+
-+ case 'R':
-+ if (dp[0] <= 32)
-+ iaddr.len = (((dp[0]+7)/8)+1);
-+ else {
-+ log_error ("wrong subnet mask width in destination descriptor");
-+ return "<error>";
-+ }
-+
-+ memcpy(iaddr.iabuf, dp, iaddr.len);
-+ strcpy(op, pdestdesc(iaddr));
-+ dp += iaddr.len;
-+ break;
-+
- case '6':
- iaddr.len = 16;
- memcpy(iaddr.iabuf, dp, 16);
-diff -up dhcp-4.3.0rc1/common/parse.c.rfc3442 dhcp-4.3.0rc1/common/parse.c
---- dhcp-4.3.0rc1/common/parse.c.rfc3442 2014-01-29 10:05:48.491400195 +0100
-+++ dhcp-4.3.0rc1/common/parse.c 2014-01-29 10:05:48.522399908 +0100
-@@ -335,6 +335,39 @@ int parse_ip_addr (cfile, addr)
- }
-
- /*
-+ * destination-descriptor :== NUMBER DOT NUMBER |
-+ * NUMBER DOT NUMBER DOT NUMBER |
-+ * NUMBER DOT NUMBER DOT NUMBER DOT NUMBER |
-+ * NUMBER DOT NUMBER DOT NUMBER DOT NUMBER DOT NUMBER
-+ */
-+
-+int parse_destination_descriptor (cfile, addr)
-+ struct parse *cfile;
-+ struct iaddr *addr;
-+{
-+ unsigned int mask_width, dest_dest_len;
-+ addr -> len = 0;
-+ if (parse_numeric_aggregate (cfile, addr -> iabuf,
-+ &addr -> len, DOT, 10, 8)) {
-+ mask_width = (unsigned int)addr->iabuf[0];
-+ dest_dest_len = (((mask_width+7)/8)+1);
-+ if (mask_width > 32) {
-+ parse_warn (cfile,
-+ "subnet mask width (%u) greater than 32.", mask_width);
-+ }
-+ else if (dest_dest_len != addr->len) {
-+ parse_warn (cfile,
-+ "destination descriptor with subnet mask width %u "
-+ "should have %u octets, but has %u octets.",
-+ mask_width, dest_dest_len, addr->len);
-+ }
-+
-+ return 1;
-+ }
-+ return 0;
-+}
-+
-+/*
- * Return true if every character in the string is hexadecimal.
- */
- static int
-@@ -713,8 +746,10 @@ unsigned char *parse_numeric_aggregate (
- if (count) {
- token = peek_token (&val, (unsigned *)0, cfile);
- if (token != separator) {
-- if (!*max)
-+ if (!*max) {
-+ *max = count;
- break;
-+ }
- if (token != RBRACE && token != LBRACE)
- token = next_token (&val,
- (unsigned *)0,
-@@ -1654,6 +1689,9 @@ int parse_option_code_definition (cfile,
- case IP_ADDRESS:
- type = 'I';
- break;
-+ case DESTINATION_DESCRIPTOR:
-+ type = 'R';
-+ break;
- case IP6_ADDRESS:
- type = '6';
- break;
-@@ -5071,6 +5109,15 @@ int parse_option_token (rv, cfile, fmt,
- }
- break;
-
-+ case 'R': /* destination descriptor */
-+ if (!parse_destination_descriptor (cfile, &addr)) {
-+ return 0;
-+ }
-+ if (!make_const_data (&t, addr.iabuf, addr.len, 0, 1, MDL)) {
-+ return 0;
-+ }
-+ break;
-+
- case '6': /* IPv6 address. */
- if (!parse_ip6_addr(cfile, &addr)) {
- return 0;
-@@ -5348,6 +5395,13 @@ int parse_option_decl (oc, cfile)
- goto exit;
- len = ip_addr.len;
- dp = ip_addr.iabuf;
-+ goto alloc;
-+
-+ case 'R': /* destination descriptor */
-+ if (!parse_destination_descriptor (cfile, &ip_addr))
-+ goto exit;
-+ len = ip_addr.len;
-+ dp = ip_addr.iabuf;
-
- alloc:
- if (hunkix + len > sizeof hunkbuf) {
-diff -up dhcp-4.3.0rc1/common/tables.c.rfc3442 dhcp-4.3.0rc1/common/tables.c
---- dhcp-4.3.0rc1/common/tables.c.rfc3442 2014-01-29 10:05:48.485400250 +0100
-+++ dhcp-4.3.0rc1/common/tables.c 2014-01-29 10:06:25.724038563 +0100
-@@ -46,6 +46,7 @@ HASH_FUNCTIONS (option_code, const unsig
- Format codes:
-
- I - IPv4 address
-+ R - destination descriptor (RFC3442)
- 6 - IPv6 address
- l - 32-bit signed integer
- L - 32-bit unsigned integer
-@@ -214,6 +215,7 @@ static struct option dhcp_options[] = {
- #endif
- { "subnet-selection", "I", &dhcp_universe, 118, 1 },
- { "domain-search", "D", &dhcp_universe, 119, 1 },
-+ { "classless-static-routes", "RIA", &dhcp_universe, 121, 1 },
- { "vivco", "Evendor-class.", &dhcp_universe, 124, 1 },
- { "vivso", "Evendor.", &dhcp_universe, 125, 1 },
- #if 0
-diff -up dhcp-4.3.0rc1/includes/dhcpd.h.rfc3442 dhcp-4.3.0rc1/includes/dhcpd.h
---- dhcp-4.3.0rc1/includes/dhcpd.h.rfc3442 2014-01-29 10:05:48.470400389 +0100
-+++ dhcp-4.3.0rc1/includes/dhcpd.h 2014-01-29 10:05:48.525399881 +0100
-@@ -2725,6 +2725,7 @@ isc_result_t range2cidr(struct iaddrcidr
- const struct iaddr *lo, const struct iaddr *hi);
- isc_result_t free_iaddrcidrnetlist(struct iaddrcidrnetlist **result);
- const char *piaddr (struct iaddr);
-+const char *pdestdesc (struct iaddr);
- char *piaddrmask(struct iaddr *, struct iaddr *);
- char *piaddrcidr(const struct iaddr *, unsigned int);
- u_int16_t validate_port(char *);
-@@ -2934,6 +2935,7 @@ void parse_client_lease_declaration (str
- int parse_option_decl (struct option_cache **, struct parse *);
- void parse_string_list (struct parse *, struct string_list **, int);
- int parse_ip_addr (struct parse *, struct iaddr *);
-+int parse_destination_descriptor (struct parse *, struct iaddr *);
- int parse_ip_addr_with_subnet(struct parse *, struct iaddrmatch *);
- void parse_reject_statement (struct parse *, struct client_config *);
-
-diff -up dhcp-4.3.0rc1/includes/dhcp.h.rfc3442 dhcp-4.3.0rc1/includes/dhcp.h
---- dhcp-4.3.0rc1/includes/dhcp.h.rfc3442 2014-01-26 19:40:44.000000000 +0100
-+++ dhcp-4.3.0rc1/includes/dhcp.h 2014-01-29 10:05:48.524399890 +0100
-@@ -159,6 +159,7 @@ struct dhcp_packet {
- #define DHO_ASSOCIATED_IP 92
- #define DHO_SUBNET_SELECTION 118 /* RFC3011! */
- #define DHO_DOMAIN_SEARCH 119 /* RFC3397 */
-+#define DHO_CLASSLESS_STATIC_ROUTES 121 /* RFC3442 */
- #define DHO_VIVCO_SUBOPTIONS 124
- #define DHO_VIVSO_SUBOPTIONS 125
-
-diff -up dhcp-4.3.0rc1/includes/dhctoken.h.rfc3442 dhcp-4.3.0rc1/includes/dhctoken.h
---- dhcp-4.3.0rc1/includes/dhctoken.h.rfc3442 2014-01-29 10:05:48.435400713 +0100
-+++ dhcp-4.3.0rc1/includes/dhctoken.h 2014-01-29 10:05:48.526399871 +0100
-@@ -368,7 +368,8 @@ enum dhcp_token {
- POOL6 = 669,
- V6RELAY = 670,
- V6RELOPT = 671,
-- BOOTP_BROADCAST_ALWAYS = 672
-+ BOOTP_BROADCAST_ALWAYS = 672,
-+ DESTINATION_DESCRIPTOR = 673
- };
-
- #define is_identifier(x) ((x) >= FIRST_TOKEN && \
deleted file mode 100644
@@ -1,231 +0,0 @@
-diff -up dhcp-4.3.0a1/client/dhc6.c.sendDecline dhcp-4.3.0a1/client/dhc6.c
---- dhcp-4.3.0a1/client/dhc6.c.sendDecline 2013-12-11 01:25:12.000000000 +0100
-+++ dhcp-4.3.0a1/client/dhc6.c 2013-12-19 15:56:18.297660118 +0100
-@@ -96,6 +96,8 @@ void do_select6(void *input);
- void do_refresh6(void *input);
- static void do_release6(void *input);
- static void start_bound(struct client_state *client);
-+static void start_decline6(struct client_state *client);
-+static void do_decline6(void *input);
- static void start_informed(struct client_state *client);
- void informed_handler(struct packet *packet, struct client_state *client);
- void bound_handler(struct packet *packet, struct client_state *client);
-@@ -2017,6 +2019,7 @@ start_release6(struct client_state *clie
- cancel_timeout(do_select6, client);
- cancel_timeout(do_refresh6, client);
- cancel_timeout(do_release6, client);
-+ cancel_timeout(do_decline6, client);
- client->state = S_STOPPED;
-
- /*
-@@ -2650,6 +2653,7 @@ dhc6_check_reply(struct client_state *cl
- break;
-
- case S_STOPPED:
-+ case S_DECLINED:
- action = dhc6_stop_action;
- break;
-
-@@ -2751,6 +2755,7 @@ dhc6_check_reply(struct client_state *cl
- break;
-
- case S_STOPPED:
-+ case S_DECLINED:
- /* Nothing critical to do at this stage. */
- break;
-
-@@ -3741,17 +3746,23 @@ reply_handler(struct packet *packet, str
- cancel_timeout(do_select6, client);
- cancel_timeout(do_refresh6, client);
- cancel_timeout(do_release6, client);
-+ cancel_timeout(do_decline6, client);
-
- /* If this is in response to a Release/Decline, clean up and return. */
-- if (client->state == S_STOPPED) {
-- if (client->active_lease == NULL)
-- return;
-+ if ((client->state == S_STOPPED) ||
-+ (client->state == S_DECLINED)) {
-+
-+ if (client->active_lease != NULL) {
-+ dhc6_lease_destroy(&client->active_lease, MDL);
-+ client->active_lease = NULL;
-+ /* We should never wait for nothing!? */
-+ if (stopping_finished())
-+ exit(0);
-+ }
-+
-+ if (client->state == S_DECLINED)
-+ start_init6(client);
-
-- dhc6_lease_destroy(&client->active_lease, MDL);
-- client->active_lease = NULL;
-- /* We should never wait for nothing!? */
-- if (stopping_finished())
-- exit(0);
- return;
- }
-
-@@ -4279,7 +4290,11 @@ start_bound(struct client_state *client)
- dhc6_marshall_values("new_", client, lease, ia, addr);
- script_write_requested6(client);
-
-- script_go(client);
-+ // when script returns 3, DAD failed
-+ if (script_go(client) == 3) {
-+ start_decline6(client);
-+ return;
-+ }
- }
-
- /* XXX: maybe we should loop on the old values instead? */
-@@ -4327,6 +4342,149 @@ start_bound(struct client_state *client)
- dhc6_check_times(client);
- }
-
-+/*
-+ * Decline addresses.
-+ */
-+void
-+start_decline6(struct client_state *client)
-+{
-+ /* Cancel any pending transmissions */
-+ cancel_timeout(do_confirm6, client);
-+ cancel_timeout(do_select6, client);
-+ cancel_timeout(do_refresh6, client);
-+ cancel_timeout(do_release6, client);
-+ cancel_timeout(do_decline6, client);
-+ client->state = S_DECLINED;
-+
-+ if (client->active_lease == NULL)
-+ return;
-+
-+ /* Set timers per RFC3315 section 18.1.7. */
-+ client->IRT = DEC_TIMEOUT * 100;
-+ client->MRT = 0;
-+ client->MRC = DEC_MAX_RC;
-+ client->MRD = 0;
-+
-+ dhc6_retrans_init(client);
-+ client->v6_handler = reply_handler;
-+
-+ client->refresh_type = DHCPV6_DECLINE;
-+ do_decline6(client);
-+}
-+
-+/*
-+ * do_decline6() creates a Decline packet and transmits it.
-+ */
-+static void
-+do_decline6(void *input)
-+{
-+ struct client_state *client;
-+ struct data_string ds;
-+ int send_ret;
-+ struct timeval elapsed, tv;
-+
-+ client = input;
-+
-+ if ((client->active_lease == NULL) || !active_prefix(client))
-+ return;
-+
-+ if ((client->MRC != 0) && (client->txcount > client->MRC)) {
-+ log_info("Max retransmission count exceeded.");
-+ goto decline_done;
-+ }
-+
-+ /*
-+ * Start_time starts at the first transmission.
-+ */
-+ if (client->txcount == 0) {
-+ client->start_time.tv_sec = cur_tv.tv_sec;
-+ client->start_time.tv_usec = cur_tv.tv_usec;
-+ }
-+
-+ /* elapsed = cur - start */
-+ elapsed.tv_sec = cur_tv.tv_sec - client->start_time.tv_sec;
-+ elapsed.tv_usec = cur_tv.tv_usec - client->start_time.tv_usec;
-+ if (elapsed.tv_usec < 0) {
-+ elapsed.tv_sec -= 1;
-+ elapsed.tv_usec += 1000000;
-+ }
-+
-+ memset(&ds, 0, sizeof(ds));
-+ if (!buffer_allocate(&ds.buffer, 4, MDL)) {
-+ log_error("Unable to allocate memory for Decline.");
-+ goto decline_done;
-+ }
-+
-+ ds.data = ds.buffer->data;
-+ ds.len = 4;
-+ ds.buffer->data[0] = DHCPV6_DECLINE;
-+ memcpy(ds.buffer->data + 1, client->dhcpv6_transaction_id, 3);
-+
-+ /* Form an elapsed option. */
-+ /* Maximum value is 65535 1/100s coded as 0xffff. */
-+ if ((elapsed.tv_sec < 0) || (elapsed.tv_sec > 655) ||
-+ ((elapsed.tv_sec == 655) && (elapsed.tv_usec > 350000))) {
-+ client->elapsed = 0xffff;
-+ } else {
-+ client->elapsed = elapsed.tv_sec * 100;
-+ client->elapsed += elapsed.tv_usec / 10000;
-+ }
-+
-+ client->elapsed = htons(client->elapsed);
-+
-+ log_debug("XMT: Forming Decline.");
-+ make_client6_options(client, &client->sent_options,
-+ client->active_lease, DHCPV6_DECLINE);
-+ dhcpv6_universe.encapsulate(&ds, NULL, NULL, client, NULL,
-+ client->sent_options, &global_scope,
-+ &dhcpv6_universe);
-+
-+ /* Append IA's (but don't release temporary addresses). */
-+ if (wanted_ia_na &&
-+ dhc6_add_ia_na(client, &ds, client->active_lease,
-+ DHCPV6_DECLINE) != ISC_R_SUCCESS) {
-+ data_string_forget(&ds, MDL);
-+ goto decline_done;
-+ }
-+ if (wanted_ia_pd &&
-+ dhc6_add_ia_pd(client, &ds, client->active_lease,
-+ DHCPV6_DECLINE) != ISC_R_SUCCESS) {
-+ data_string_forget(&ds, MDL);
-+ goto decline_done;
-+ }
-+
-+ /* Transmit and wait. */
-+ log_info("XMT: Decline on %s, interval %ld0ms.",
-+ client->name ? client->name : client->interface->name,
-+ (long int)client->RT);
-+
-+ send_ret = send_packet6(client->interface, ds.data, ds.len,
-+ &DHCPv6DestAddr);
-+ if (send_ret != ds.len) {
-+ log_error("dhc6: sendpacket6() sent %d of %d bytes",
-+ send_ret, ds.len);
-+ }
-+
-+ data_string_forget(&ds, MDL);
-+
-+ /* Wait RT */
-+ tv.tv_sec = cur_tv.tv_sec + client->RT / 100;
-+ tv.tv_usec = cur_tv.tv_usec + (client->RT % 100) * 10000;
-+ if (tv.tv_usec >= 1000000) {
-+ tv.tv_sec += 1;
-+ tv.tv_usec -= 1000000;
-+ }
-+ add_timeout(&tv, do_decline6, client, NULL, NULL);
-+ dhc6_retrans_advance(client);
-+ return;
-+
-+decline_done:
-+ dhc6_lease_destroy(&client->active_lease, MDL);
-+ client->active_lease = NULL;
-+ start_init6(client);
-+ return;
-+}
-+
- /* While bound, ignore packets. In the future we'll want to answer
- * Reconfigure-Request messages and the like.
- */
deleted file mode 100644
@@ -1,107 +0,0 @@
-diff -up dhcp-4.3.1b1/common/tests/Makefile.am.uCWMBl dhcp-4.3.1b1/common/tests/Makefile.am
---- dhcp-4.3.1b1/common/tests/Makefile.am.uCWMBl 2014-07-10 17:38:10.779828569 +0200
-+++ dhcp-4.3.1b1/common/tests/Makefile.am 2014-07-10 17:38:21.355678580 +0200
-@@ -13,19 +13,19 @@ ATF_TESTS += alloc_unittest dns_unittest
- alloc_unittest_SOURCES = test_alloc.c $(top_srcdir)/tests/t_api_dhcp.c
- alloc_unittest_LDADD = $(ATF_LDFLAGS)
- alloc_unittest_LDADD += ../libdhcp.a \
-- ../../omapip/libomapi.a \
-+ ../../omapip/libomapi.la \
- $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
-
- dns_unittest_SOURCES = dns_unittest.c $(top_srcdir)/tests/t_api_dhcp.c
- dns_unittest_LDADD = $(ATF_LDFLAGS)
--dns_unittest_LDADD += ../libdhcp.a \
-+dns_unittest_LDADD += ../libdhcp.la \
- ../../omapip/libomapi.a \
- $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
-
- misc_unittest_SOURCES = misc_unittest.c $(top_srcdir)/tests/t_api_dhcp.c
- misc_unittest_LDADD = $(ATF_LDFLAGS)
- misc_unittest_LDADD += ../libdhcp.a \
-- ../../omapip/libomapi.a \
-+ ../../omapip/libomapi.la \
- $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
- check: $(ATF_TESTS)
- atf-run | atf-report
-diff -up dhcp-4.3.1b1/configure.ac.uCWMBl dhcp-4.3.1b1/configure.ac
---- dhcp-4.3.1b1/configure.ac.uCWMBl 2014-07-10 17:38:10.766828753 +0200
-+++ dhcp-4.3.1b1/configure.ac 2014-07-10 17:38:10.779828569 +0200
-@@ -39,7 +39,8 @@ fi
- # Use this to define _GNU_SOURCE to pull in the IPv6 Advanced Socket API.
- AC_USE_SYSTEM_EXTENSIONS
-
--AC_PROG_RANLIB
-+# Use libtool to simplify building of shared libraries
-+AC_PROG_LIBTOOL
- AC_CONFIG_HEADERS([includes/config.h])
-
- # we sometimes need to know byte order for building packets
-diff -up dhcp-4.3.1b1/dhcpctl/Makefile.am.uCWMBl dhcp-4.3.1b1/dhcpctl/Makefile.am
---- dhcp-4.3.1b1/dhcpctl/Makefile.am.uCWMBl 2014-07-10 17:36:30.485250962 +0200
-+++ dhcp-4.3.1b1/dhcpctl/Makefile.am 2014-07-10 17:38:10.780828554 +0200
-@@ -1,14 +1,14 @@
- bin_PROGRAMS = omshell
--lib_LIBRARIES = libdhcpctl.a
-+lib_LTLIBRARIES = libdhcpctl.la
- noinst_PROGRAMS = cltest
- man_MANS = omshell.1 dhcpctl.3
- EXTRA_DIST = $(man_MANS)
-
- omshell_SOURCES = omshell.c
--omshell_LDADD = libdhcpctl.a ../common/libdhcp.a ../omapip/libomapi.a \
-+omshell_LDADD = libdhcpctl.la ../common/libdhcp.a ../omapip/libomapi.la \
- $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
--libdhcpctl_a_SOURCES = dhcpctl.c callback.c remote.c
-+libdhcpctl_la_SOURCES = dhcpctl.c callback.c remote.c
-
- cltest_SOURCES = cltest.c
--cltest_LDADD = libdhcpctl.a ../common/libdhcp.a ../omapip/libomapi.a \
-+cltest_LDADD = libdhcpctl.la ../common/libdhcp.a ../omapip/libomapi.la \
- $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
-diff -up dhcp-4.3.1b1/omapip/Makefile.am.uCWMBl dhcp-4.3.1b1/omapip/Makefile.am
---- dhcp-4.3.1b1/omapip/Makefile.am.uCWMBl 2014-07-10 17:36:30.486250948 +0200
-+++ dhcp-4.3.1b1/omapip/Makefile.am 2014-07-10 17:38:10.780828554 +0200
-@@ -1,7 +1,7 @@
--lib_LIBRARIES = libomapi.a
-+lib_LTLIBRARIES = libomapi.la
- noinst_PROGRAMS = svtest
-
--libomapi_a_SOURCES = protocol.c buffer.c alloc.c result.c connection.c \
-+libomapi_la_SOURCES = protocol.c buffer.c alloc.c result.c connection.c \
- errwarn.c listener.c dispatch.c generic.c support.c \
- handle.c message.c convert.c hash.c auth.c inet_addr.c \
- array.c trace.c toisc.c iscprint.c isclib.c
-@@ -10,5 +10,5 @@ man_MANS = omapi.3
- EXTRA_DIST = $(man_MANS)
-
- svtest_SOURCES = test.c
--svtest_LDADD = libomapi.a \
-+svtest_LDADD = libomapi.la \
- $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
-diff -up dhcp-4.3.1b1/server/Makefile.am.uCWMBl dhcp-4.3.1b1/server/Makefile.am
---- dhcp-4.3.1b1/server/Makefile.am.uCWMBl 2014-07-10 17:36:30.486250948 +0200
-+++ dhcp-4.3.1b1/server/Makefile.am 2014-07-10 17:38:10.780828554 +0200
-@@ -13,7 +13,7 @@ dhcpd_SOURCES = dhcpd.c dhcp.c bootp.c c
- dhcpv6.c mdb6.c ldap.c ldap_casa.c
-
- dhcpd_CFLAGS = $(LDAP_CFLAGS)
--dhcpd_LDADD = ../common/libdhcp.a ../omapip/libomapi.a ../dhcpctl/libdhcpctl.a \
-+dhcpd_LDADD = ../common/libdhcp.a ../omapip/libomapi.la ../dhcpctl/libdhcpctl.la \
- $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
- man_MANS = dhcpd.8 dhcpd.conf.5 dhcpd.leases.5
- EXTRA_DIST = $(man_MANS)
-diff -up dhcp-4.3.1b1/server/tests/Makefile.am.uCWMBl dhcp-4.3.1b1/server/tests/Makefile.am
---- dhcp-4.3.1b1/server/tests/Makefile.am.uCWMBl 2014-07-10 17:36:30.486250948 +0200
-+++ dhcp-4.3.1b1/server/tests/Makefile.am 2014-07-10 17:38:10.780828554 +0200
-@@ -17,8 +17,8 @@ DHCPSRC = ../dhcp.c ../bootp.c ../confpa
- ../ddns.c ../dhcpleasequery.c ../dhcpv6.c ../mdb6.c \
- ../ldap.c ../ldap_casa.c ../dhcpd.c
-
--DHCPLIBS = $(top_builddir)/common/libdhcp.a $(top_builddir)/omapip/libomapi.a \
-- $(top_builddir)/dhcpctl/libdhcpctl.a \
-+DHCPLIBS = $(top_builddir)/common/libdhcp.a $(top_builddir)/omapip/libomapi.la \
-+ $(top_builddir)/dhcpctl/libdhcpctl.la \
- $(BIND9_LIBDIR) -lirs -ldns -lisccfg -lisc
-
- ATF_TESTS =
deleted file mode 100644
@@ -1,48 +0,0 @@
-From 61fa3dd9e789997f66e848c7e3fb2f554ee374e2 Mon Sep 17 00:00:00 2001
-From: Jiri Popelka <jpopelka@redhat.com>
-Date: Thu, 18 Dec 2014 11:53:26 +0100
-Subject: [PATCH] Write DUID_LLT even in stateless mode.
-
-By default, DHCPv6 dhclient creates DUID-LL
-if it is running in stateless mode (-6 -S) and
-doesn't write it into leases file, most likely
-because the DUID-LL is always generated the same.
-
-It's however possible to specify DUID to be of type LLT instead of LL
-with '-D LLT'. Rfc 3315 says that:
-'Clients and servers using this type of DUID MUST
-store the DUID-LLT in stable storage.'
-That's not fulfiled in this case (-6 -S -D LLT),
-because it's generated each time again.
-
-It's not a big deal because the server doesn't store any
-info about 'stateless' clients, so it doesn't matter
-that the DUID-LLT is different each time.
-But there's a TAHI test which tests this, i.e. that
-DUID-LLT is still the same even in stateless mode.
-It's a test DHCP_CONF.7.1.9, part B.
-https://www.ipv6ready.org/docs/Phase2_DHCPv6_Conformance_Latest.pdf
-
-Signed-off-by: Jiri Popelka <jpopelka@redhat.com>
----
- client/dhclient.c | 4 +++-
- 1 file changed, 3 insertions(+), 1 deletion(-)
-
-diff --git a/client/dhclient.c b/client/dhclient.c
-index 5ef59cd..026e3fe 100644
---- a/client/dhclient.c
-+++ b/client/dhclient.c
-@@ -788,7 +788,9 @@ void run_stateless(int exit_mode)
- if (default_duid.buffer != NULL)
- data_string_forget(&default_duid, MDL);
-
-- form_duid(&default_duid, MDL);
-+ if (form_duid(&default_duid, MDL) == ISC_R_SUCCESS &&
-+ duid_type == DUID_LLT)
-+ write_duid(&default_duid);
- }
-
- /* Start a configuration state machine. */
-2.1.0
-
deleted file mode 100644
@@ -1,101 +0,0 @@
-diff -up dhcp-4.3.0a1/server/bootp.c.unicast dhcp-4.3.0a1/server/bootp.c
---- dhcp-4.3.0a1/server/bootp.c.unicast 2013-12-11 01:25:12.000000000 +0100
-+++ dhcp-4.3.0a1/server/bootp.c 2013-12-19 15:12:12.974671154 +0100
-@@ -59,6 +59,7 @@ void bootp (packet)
- char msgbuf [1024];
- int ignorep;
- int peer_has_leases = 0;
-+ int norelay = 0;
-
- if (packet -> raw -> op != BOOTREQUEST)
- return;
-@@ -74,7 +75,7 @@ void bootp (packet)
- ? inet_ntoa (packet -> raw -> giaddr)
- : packet -> interface -> name);
-
-- if (!locate_network (packet)) {
-+ if ((norelay = locate_network (packet)) == 0) {
- log_info ("%s: network unknown", msgbuf);
- return;
- }
-@@ -396,6 +397,15 @@ void bootp (packet)
-
- goto out;
- }
-+ } else if (norelay == 2) {
-+ to.sin_addr = raw.ciaddr;
-+ to.sin_port = remote_port;
-+ if (fallback_interface) {
-+ result = send_packet (fallback_interface, NULL, &raw,
-+ outgoing.packet_length, from,
-+ &to, &hto);
-+ goto out;
-+ }
-
- /* If it comes from a client that already knows its address
- and is not requesting a broadcast response, and we can
-diff -up dhcp-4.3.0a1/server/dhcp.c.unicast dhcp-4.3.0a1/server/dhcp.c
---- dhcp-4.3.0a1/server/dhcp.c.unicast 2013-12-13 21:50:38.000000000 +0100
-+++ dhcp-4.3.0a1/server/dhcp.c 2013-12-19 15:12:12.975671140 +0100
-@@ -4627,6 +4627,7 @@ int locate_network (packet)
- struct data_string data;
- struct subnet *subnet = (struct subnet *)0;
- struct option_cache *oc;
-+ int norelay = 0;
-
- /* See if there's a Relay Agent Link Selection Option, or a
- * Subnet Selection Option. The Link-Select and Subnet-Select
-@@ -4642,12 +4643,24 @@ int locate_network (packet)
- from the interface, if there is one. If not, fail. */
- if (!oc && !packet -> raw -> giaddr.s_addr) {
- if (packet -> interface -> shared_network) {
-- shared_network_reference
-- (&packet -> shared_network,
-- packet -> interface -> shared_network, MDL);
-- return 1;
-+ struct in_addr any_addr;
-+ any_addr.s_addr = INADDR_ANY;
-+
-+ if (!packet -> packet_type && memcmp(&packet -> raw -> ciaddr, &any_addr, 4)) {
-+ struct iaddr cip;
-+ memcpy(cip.iabuf, &packet -> raw -> ciaddr, 4);
-+ cip.len = 4;
-+ if (!find_grouped_subnet(&subnet, packet->interface->shared_network, cip, MDL))
-+ norelay = 2;
-+ }
-+
-+ if (!norelay) {
-+ shared_network_reference(&packet -> shared_network, packet -> interface -> shared_network, MDL);
-+ return 1;
-+ }
-+ } else {
-+ return 0;
- }
-- return 0;
- }
-
- /* If there's an option indicating link connection, and it's valid,
-@@ -4670,7 +4683,10 @@ int locate_network (packet)
- data_string_forget (&data, MDL);
- } else {
- ia.len = 4;
-- memcpy (ia.iabuf, &packet -> raw -> giaddr, 4);
-+ if (norelay)
-+ memcpy (ia.iabuf, &packet->raw->ciaddr, 4);
-+ else
-+ memcpy (ia.iabuf, &packet->raw->giaddr, 4);
- }
-
- /* If we know the subnet on which the IP address lives, use it. */
-@@ -4678,7 +4694,10 @@ int locate_network (packet)
- shared_network_reference (&packet -> shared_network,
- subnet -> shared_network, MDL);
- subnet_dereference (&subnet, MDL);
-- return 1;
-+ if (norelay)
-+ return norelay;
-+ else
-+ return 1;
- }
-
- /* Otherwise, fail. */
deleted file mode 100644
@@ -1,251 +0,0 @@
-diff -up dhcp-4.3.0rc1/common/bpf.c.xen dhcp-4.3.0rc1/common/bpf.c
---- dhcp-4.3.0rc1/common/bpf.c.xen 2014-01-29 10:03:27.503941664 +0100
-+++ dhcp-4.3.0rc1/common/bpf.c 2014-01-29 10:03:37.564812175 +0100
-@@ -481,7 +481,7 @@ ssize_t receive_packet (interface, buf,
- /* Decode the IP and UDP headers... */
- offset = decode_udp_ip_header(interface, interface->rbuf,
- interface->rbuf_offset,
-- from, hdr.bh_caplen, &paylen);
-+ from, hdr.bh_caplen, &paylen, 0);
-
- /* If the IP or UDP checksum was bad, skip the packet... */
- if (offset < 0) {
-diff -up dhcp-4.3.0rc1/common/dlpi.c.xen dhcp-4.3.0rc1/common/dlpi.c
---- dhcp-4.3.0rc1/common/dlpi.c.xen 2014-01-25 05:18:03.000000000 +0100
-+++ dhcp-4.3.0rc1/common/dlpi.c 2014-01-29 10:03:27.503941664 +0100
-@@ -691,7 +691,7 @@ ssize_t receive_packet (interface, buf,
- length -= offset;
- #endif
- offset = decode_udp_ip_header (interface, dbuf, bufix,
-- from, length, &paylen);
-+ from, length, &paylen, 0);
-
- /*
- * If the IP or UDP checksum was bad, skip the packet...
-diff -up dhcp-4.3.0rc1/common/lpf.c.xen dhcp-4.3.0rc1/common/lpf.c
---- dhcp-4.3.0rc1/common/lpf.c.xen 2014-01-25 05:18:03.000000000 +0100
-+++ dhcp-4.3.0rc1/common/lpf.c 2014-01-29 10:03:27.504941651 +0100
-@@ -29,14 +29,15 @@
-
- #include "dhcpd.h"
- #if defined (USE_LPF_SEND) || defined (USE_LPF_RECEIVE)
-+#include <sys/socket.h>
- #include <sys/uio.h>
- #include <errno.h>
-
- #include <asm/types.h>
- #include <linux/filter.h>
- #include <linux/if_ether.h>
-+#include <linux/if_packet.h>
- #include <netinet/in_systm.h>
--#include <net/if_packet.h>
- #include "includes/netinet/ip.h"
- #include "includes/netinet/udp.h"
- #include "includes/netinet/if_ether.h"
-@@ -51,6 +52,19 @@
- /* Reinitializes the specified interface after an address change. This
- is not required for packet-filter APIs. */
-
-+#ifndef PACKET_AUXDATA
-+#define PACKET_AUXDATA 8
-+
-+struct tpacket_auxdata
-+{
-+ __u32 tp_status;
-+ __u32 tp_len;
-+ __u32 tp_snaplen;
-+ __u16 tp_mac;
-+ __u16 tp_net;
-+};
-+#endif
-+
- #ifdef USE_LPF_SEND
- void if_reinitialize_send (info)
- struct interface_info *info;
-@@ -73,10 +87,14 @@ int if_register_lpf (info)
- struct interface_info *info;
- {
- int sock;
-- struct sockaddr sa;
-+ union {
-+ struct sockaddr_ll ll;
-+ struct sockaddr common;
-+ } sa;
-+ struct ifreq ifr;
-
- /* Make an LPF socket. */
-- if ((sock = socket(PF_PACKET, SOCK_PACKET,
-+ if ((sock = socket(PF_PACKET, SOCK_RAW,
- htons((short)ETH_P_ALL))) < 0) {
- if (errno == ENOPROTOOPT || errno == EPROTONOSUPPORT ||
- errno == ESOCKTNOSUPPORT || errno == EPFNOSUPPORT ||
-@@ -91,11 +109,17 @@ int if_register_lpf (info)
- log_fatal ("Open a socket for LPF: %m");
- }
-
-+ memset (&ifr, 0, sizeof ifr);
-+ strncpy (ifr.ifr_name, (const char *)info -> ifp, sizeof ifr.ifr_name);
-+ ifr.ifr_name[IFNAMSIZ-1] = '\0';
-+ if (ioctl (sock, SIOCGIFINDEX, &ifr))
-+ log_fatal ("Failed to get interface index: %m");
-+
- /* Bind to the interface name */
- memset (&sa, 0, sizeof sa);
-- sa.sa_family = AF_PACKET;
-- strncpy (sa.sa_data, (const char *)info -> ifp, sizeof sa.sa_data);
-- if (bind (sock, &sa, sizeof sa)) {
-+ sa.ll.sll_family = AF_PACKET;
-+ sa.ll.sll_ifindex = ifr.ifr_ifindex;
-+ if (bind (sock, &sa.common, sizeof sa)) {
- if (errno == ENOPROTOOPT || errno == EPROTONOSUPPORT ||
- errno == ESOCKTNOSUPPORT || errno == EPFNOSUPPORT ||
- errno == EAFNOSUPPORT || errno == EINVAL) {
-@@ -177,9 +201,18 @@ static void lpf_gen_filter_setup (struct
- void if_register_receive (info)
- struct interface_info *info;
- {
-+ int val;
-+
- /* Open a LPF device and hang it on this interface... */
- info -> rfdesc = if_register_lpf (info);
-
-+ val = 1;
-+ if (setsockopt (info -> rfdesc, SOL_PACKET, PACKET_AUXDATA, &val,
-+ sizeof val) < 0) {
-+ if (errno != ENOPROTOOPT)
-+ log_fatal ("Failed to set auxiliary packet data: %m");
-+ }
-+
- #if defined (HAVE_TR_SUPPORT)
- if (info -> hw_address.hbuf [0] == HTYPE_IEEE802)
- lpf_tr_filter_setup (info);
-@@ -301,7 +334,6 @@ ssize_t send_packet (interface, packet,
- double hh [16];
- double ih [1536 / sizeof (double)];
- unsigned char *buf = (unsigned char *)ih;
-- struct sockaddr_pkt sa;
- int result;
- int fudge;
-
-@@ -322,17 +354,7 @@ ssize_t send_packet (interface, packet,
- (unsigned char *)raw, len);
- memcpy (buf + ibufp, raw, len);
-
-- /* For some reason, SOCK_PACKET sockets can't be connected,
-- so we have to do a sentdo every time. */
-- memset (&sa, 0, sizeof sa);
-- sa.spkt_family = AF_PACKET;
-- strncpy ((char *)sa.spkt_device,
-- (const char *)interface -> ifp, sizeof sa.spkt_device);
-- sa.spkt_protocol = htons(ETH_P_IP);
--
-- result = sendto (interface -> wfdesc,
-- buf + fudge, ibufp + len - fudge, 0,
-- (const struct sockaddr *)&sa, sizeof sa);
-+ result = write (interface -> wfdesc, buf + fudge, ibufp + len - fudge);
- if (result < 0)
- log_error ("send_packet: %m");
- return result;
-@@ -349,14 +371,35 @@ ssize_t receive_packet (interface, buf,
- {
- int length = 0;
- int offset = 0;
-+ int nocsum = 0;
- unsigned char ibuf [1536];
- unsigned bufix = 0;
- unsigned paylen;
-+ unsigned char cmsgbuf[CMSG_LEN(sizeof(struct tpacket_auxdata))];
-+ struct iovec iov = {
-+ .iov_base = ibuf,
-+ .iov_len = sizeof ibuf,
-+ };
-+ struct msghdr msg = {
-+ .msg_iov = &iov,
-+ .msg_iovlen = 1,
-+ .msg_control = cmsgbuf,
-+ .msg_controllen = sizeof(cmsgbuf),
-+ };
-+ struct cmsghdr *cmsg;
-
-- length = read (interface -> rfdesc, ibuf, sizeof ibuf);
-+ length = recvmsg (interface -> rfdesc, &msg, 0);
- if (length <= 0)
- return length;
-
-+ for (cmsg = CMSG_FIRSTHDR(&msg); cmsg; cmsg = CMSG_NXTHDR(&msg, cmsg)) {
-+ if (cmsg->cmsg_level == SOL_PACKET &&
-+ cmsg->cmsg_type == PACKET_AUXDATA) {
-+ struct tpacket_auxdata *aux = (void *)CMSG_DATA(cmsg);
-+ nocsum = aux->tp_status & TP_STATUS_CSUMNOTREADY;
-+ }
-+ }
-+
- bufix = 0;
- /* Decode the physical header... */
- offset = decode_hw_header (interface, ibuf, bufix, hfrom);
-@@ -373,7 +416,7 @@ ssize_t receive_packet (interface, buf,
-
- /* Decode the IP and UDP headers... */
- offset = decode_udp_ip_header (interface, ibuf, bufix, from,
-- (unsigned)length, &paylen);
-+ (unsigned)length, &paylen, nocsum);
-
- /* If the IP or UDP checksum was bad, skip the packet... */
- if (offset < 0)
-diff -up dhcp-4.3.0rc1/common/nit.c.xen dhcp-4.3.0rc1/common/nit.c
---- dhcp-4.3.0rc1/common/nit.c.xen 2014-01-26 19:40:44.000000000 +0100
-+++ dhcp-4.3.0rc1/common/nit.c 2014-01-29 10:03:27.504941651 +0100
-@@ -363,7 +363,7 @@ ssize_t receive_packet (interface, buf,
-
- /* Decode the IP and UDP headers... */
- offset = decode_udp_ip_header (interface, ibuf, bufix,
-- from, length, &paylen);
-+ from, length, &paylen, 0);
-
- /* If the IP or UDP checksum was bad, skip the packet... */
- if (offset < 0)
-diff -up dhcp-4.3.0rc1/common/packet.c.xen dhcp-4.3.0rc1/common/packet.c
---- dhcp-4.3.0rc1/common/packet.c.xen 2013-12-11 01:01:02.000000000 +0100
-+++ dhcp-4.3.0rc1/common/packet.c 2014-01-29 10:03:27.504941651 +0100
-@@ -226,7 +226,7 @@ ssize_t
- decode_udp_ip_header(struct interface_info *interface,
- unsigned char *buf, unsigned bufix,
- struct sockaddr_in *from, unsigned buflen,
-- unsigned *rbuflen)
-+ unsigned *rbuflen, int nocsum)
- {
- unsigned char *data;
- struct ip ip;
-@@ -337,7 +337,7 @@ decode_udp_ip_header(struct interface_in
- 8, IPPROTO_UDP + ulen))));
-
- udp_packets_seen++;
-- if (usum && usum != sum) {
-+ if (!nocsum && usum && usum != sum) {
- udp_packets_bad_checksum++;
- if (udp_packets_seen > 4 &&
- (udp_packets_seen / udp_packets_bad_checksum) < 2) {
-diff -up dhcp-4.3.0rc1/common/upf.c.xen dhcp-4.3.0rc1/common/upf.c
---- dhcp-4.3.0rc1/common/upf.c.xen 2014-01-26 19:40:44.000000000 +0100
-+++ dhcp-4.3.0rc1/common/upf.c 2014-01-29 10:03:27.505941638 +0100
-@@ -314,7 +314,7 @@ ssize_t receive_packet (interface, buf,
-
- /* Decode the IP and UDP headers... */
- offset = decode_udp_ip_header (interface, ibuf, bufix,
-- from, length, &paylen);
-+ from, length, &paylen, 0);
-
- /* If the IP or UDP checksum was bad, skip the packet... */
- if (offset < 0)
-diff -up dhcp-4.3.0rc1/includes/dhcpd.h.xen dhcp-4.3.0rc1/includes/dhcpd.h
---- dhcp-4.3.0rc1/includes/dhcpd.h.xen 2014-01-29 10:03:27.489941844 +0100
-+++ dhcp-4.3.0rc1/includes/dhcpd.h 2014-01-29 10:03:27.506941626 +0100
-@@ -2861,7 +2861,7 @@ ssize_t decode_hw_header (struct interfa
- unsigned, struct hardware *);
- ssize_t decode_udp_ip_header (struct interface_info *, unsigned char *,
- unsigned, struct sockaddr_in *,
-- unsigned, unsigned *);
-+ unsigned, unsigned *, int);
-
- /* ethernet.c */
- void assemble_ethernet_header (struct interface_info *, unsigned char *,