public inbox for development@lists.ipfire.org
 help / color / mirror / Atom feed
From: Matthias Fischer <matthias.fischer@ipfire.org>
To: development@lists.ipfire.org
Subject: Re: [PATCH] dhcp: Update to 4.4.1
Date: Tue, 01 May 2018 18:10:59 +0200	[thread overview]
Message-ID: <8690394a-17a5-7dab-8fbc-8d745390e629@ipfire.org> (raw)
In-Reply-To: <1525173507.2479471.227.camel@ipfire.org>

[-- Attachment #1: Type: text/plain, Size: 191319 bytes --]

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(a)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(a)ipfire.org>                    
>>  #
>> +# Copyright (C) 2007-2018  IPFire Team  <info(a)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(a)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(a)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 *,
> 


  reply	other threads:[~2018-05-01 16:10 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <20180430130759.5789-1-matthias.fischer@ipfire.org>
2018-05-01 11:18 ` Michael Tremer
2018-05-01 16:10   ` Matthias Fischer [this message]
2018-06-01 17:54 Matthias Fischer
2018-06-04 15:41 ` Michael Tremer
2019-06-22 10:18 Stefan Schantl

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=8690394a-17a5-7dab-8fbc-8d745390e629@ipfire.org \
    --to=matthias.fischer@ipfire.org \
    --cc=development@lists.ipfire.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox