[packages/dhcp] ignore-client-uids dhcpd configuration option added
jajcus
jajcus at pld-linux.org
Fri Jan 3 21:14:55 CET 2014
commit 1781d6df4e36ef64d8bedf3cbf1aef62e77192cd
Author: Jacek Konieczny <jajcus at jajcus.net>
Date: Fri Jan 3 21:11:41 2014 +0100
ignore-client-uids dhcpd configuration option added
This help in case multiple DHCP clients, using different client-uid
values are used on a single machine, sometimes during a single boot
process (BIOS PXE client, PXE bootloader, initramfs and final system –
four different DHCP clients). Using the 'ignore-client-uids on' option
will prevent for allocating several different IP addresses in this case,
by slightly breaking the DHCP protocol.
Release: 2
dhcp-ignore-client-uids.patch | 161 ++++++++++++++++++++++++++++++++++++++++++
dhcp.spec | 5 +-
2 files changed, 165 insertions(+), 1 deletion(-)
---
diff --git a/dhcp.spec b/dhcp.spec
index 5c11d8c..4e08da8 100644
--- a/dhcp.spec
+++ b/dhcp.spec
@@ -20,7 +20,7 @@ Summary(pl.UTF-8): Serwer DHCP
Summary(pt_BR.UTF-8): Servidor DHCP (Protocolo de configuração dinâmica de hosts)
Name: dhcp
Version: %{ver}%{pverdot}
-Release: 1
+Release: 2
Epoch: 4
License: MIT
Group: Networking/Daemons
@@ -49,6 +49,8 @@ Patch16: %{name}-default-requested-options.patch
Patch17: %{name}-xen-checksum.patch
Patch19: %{name}-manpages.patch
Patch20: %{name}-NetworkManager-crash.patch
+# http://www.csupomona.edu/~bldewolf/dhcp-uid/
+Patch21: %{name}-ignore-client-uids.patch
URL: http://www.isc.org/sw/dhcp/
BuildRequires: autoconf
BuildRequires: automake
@@ -213,6 +215,7 @@ komunikacji z działającym serwerem ISC DHCP i jego kontroli.
%patch17 -p1
%patch19 -p1
%patch20 -p1
+%patch21 -p1
# Copy in documentation and example scripts for LDAP patch to dhcpd
cp -a %{SOURCE11} README.ldap
diff --git a/dhcp-ignore-client-uids.patch b/dhcp-ignore-client-uids.patch
new file mode 100644
index 0000000..77ee1d9
--- /dev/null
+++ b/dhcp-ignore-client-uids.patch
@@ -0,0 +1,161 @@
+diff -dur -x '*~' -x '*.orig' dhcp-4.2.5-P1.orig/common/conflex.c dhcp-4.2.5-P1/common/conflex.c
+--- dhcp-4.2.5-P1.orig/common/conflex.c 2014-01-03 20:59:11.105475789 +0100
++++ dhcp-4.2.5-P1/common/conflex.c 2014-01-03 20:59:51.775476160 +0100
+@@ -1067,6 +1067,8 @@
+ return IF;
+ if (!strcasecmp (atom + 1, "s"))
+ return IS;
++ if (!strcasecmp (atom + 1, "gnore-client-uids"))
++ return IGNORE_CLIENT_UIDS;
+ if (!strcasecmp (atom + 1, "gnore"))
+ return IGNORE;
+ break;
+diff -dur -x '*~' -x '*.orig' dhcp-4.2.5-P1.orig/includes/dhcpd.h dhcp-4.2.5-P1/includes/dhcpd.h
+--- dhcp-4.2.5-P1.orig/includes/dhcpd.h 2014-01-03 20:59:11.115475790 +0100
++++ dhcp-4.2.5-P1/includes/dhcpd.h 2014-01-03 20:59:51.775476160 +0100
+@@ -763,6 +763,8 @@
+ #endif
+ #endif
+
++#define SV_IGNORE_CLIENT_UIDS 78
++
+ #if !defined (DEFAULT_DEFAULT_LEASE_TIME)
+ # define DEFAULT_DEFAULT_LEASE_TIME 43200
+ #endif
+diff -dur -x '*~' -x '*.orig' dhcp-4.2.5-P1.orig/includes/dhctoken.h dhcp-4.2.5-P1/includes/dhctoken.h
+--- dhcp-4.2.5-P1.orig/includes/dhctoken.h 2014-01-03 20:59:11.105475789 +0100
++++ dhcp-4.2.5-P1/includes/dhctoken.h 2014-01-03 21:00:27.588809818 +0100
+@@ -365,7 +365,8 @@
+ PRIMARY6 = 666,
+ SECONDARY6 = 667,
+ TOKEN_INFINIBAND = 668,
+- BOOTP_BROADCAST_ALWAYS = 669
++ BOOTP_BROADCAST_ALWAYS = 669,
++ IGNORE_CLIENT_UIDS = 670
+ };
+
+ #define is_identifier(x) ((x) >= FIRST_TOKEN && \
+diff -dur -x '*~' -x '*.orig' dhcp-4.2.5-P1.orig/server/confpars.c dhcp-4.2.5-P1/server/confpars.c
+--- dhcp-4.2.5-P1.orig/server/confpars.c 2013-03-04 19:35:09.000000000 +0100
++++ dhcp-4.2.5-P1/server/confpars.c 2014-01-03 20:59:51.775476160 +0100
+@@ -328,6 +328,7 @@
+ | ONE_LEASE_PER_CLIENT boolean
+ | GET_LEASE_HOSTNAMES boolean
+ | USE_HOST_DECL_NAME boolean
++ | IGNORE_CLIENT_UIDS boolean
+ | NEXT_SERVER ip-addr-or-hostname SEMI
+ | option_parameter
+ | SERVER-IDENTIFIER ip-addr-or-hostname SEMI
+@@ -4104,6 +4105,10 @@
+ code = SV_LEASEQUERY;
+ break;
+
++ case IGNORE_CLIENT_UIDS:
++ code = SV_IGNORE_CLIENT_UIDS;
++ break;
++
+ default:
+ parse_warn (cfile, "expecting allow/deny key");
+ skip_to_semi (cfile);
+diff -dur -x '*~' -x '*.orig' dhcp-4.2.5-P1.orig/server/dhcp.c dhcp-4.2.5-P1/server/dhcp.c
+--- dhcp-4.2.5-P1.orig/server/dhcp.c 2014-01-03 20:59:11.112142457 +0100
++++ dhcp-4.2.5-P1/server/dhcp.c 2014-01-03 20:59:51.778809492 +0100
+@@ -2337,31 +2337,42 @@
+ /* Update Client Last Transaction Time. */
+ lt->cltt = cur_time;
+
+- /* Record the uid, if given... */
+- oc = lookup_option (&dhcp_universe, packet -> options,
+- DHO_DHCP_CLIENT_IDENTIFIER);
+- if (oc &&
+- evaluate_option_cache (&d1, packet, lease,
++ /* Only record the uid if we're not ignoring them */
++ oc = lookup_option (&server_universe, state -> options,
++ SV_IGNORE_CLIENT_UIDS);
++ if (!oc ||
++ !evaluate_boolean_option_cache (&ignorep, packet, lease,
+ (struct client_state *)0,
+ packet -> options, state -> options,
+ &lease -> scope, oc, MDL)) {
+- if (d1.len <= sizeof lt -> uid_buf) {
+- memcpy (lt -> uid_buf, d1.data, d1.len);
+- lt -> uid = lt -> uid_buf;
+- lt -> uid_max = sizeof lt -> uid_buf;
+- lt -> uid_len = d1.len;
+- } else {
+- unsigned char *tuid;
+- lt -> uid_max = d1.len;
+- lt -> uid_len = d1.len;
+- tuid = (unsigned char *)dmalloc (lt -> uid_max, MDL);
+- /* XXX inelegant */
+- if (!tuid)
+- log_fatal ("no memory for large uid.");
+- memcpy (tuid, d1.data, lt -> uid_len);
+- lt -> uid = tuid;
++ /* Record the uid, if given... */
++ oc = lookup_option (&dhcp_universe, packet -> options,
++ DHO_DHCP_CLIENT_IDENTIFIER);
++ if (oc &&
++ evaluate_option_cache (&d1, packet, lease,
++ (struct client_state *)0,
++ packet -> options,
++ state -> options,
++ &lease -> scope, oc, MDL)) {
++ if (d1.len <= sizeof lt -> uid_buf) {
++ memcpy (lt -> uid_buf, d1.data, d1.len);
++ lt -> uid = lt -> uid_buf;
++ lt -> uid_max = sizeof lt -> uid_buf;
++ lt -> uid_len = d1.len;
++ } else {
++ unsigned char *tuid;
++ lt -> uid_max = d1.len;
++ lt -> uid_len = d1.len;
++ tuid = (unsigned char *)
++ dmalloc (lt -> uid_max, MDL);
++ /* XXX inelegant */
++ if (!tuid)
++ log_fatal ("no memory for large uid.");
++ memcpy (tuid, d1.data, lt -> uid_len);
++ lt -> uid = tuid;
++ }
++ data_string_forget (&d1, MDL);
+ }
+- data_string_forget (&d1, MDL);
+ }
+
+ if (host) {
+diff -dur -x '*~' -x '*.orig' dhcp-4.2.5-P1.orig/server/dhcpd.conf.5 dhcp-4.2.5-P1/server/dhcpd.conf.5
+--- dhcp-4.2.5-P1.orig/server/dhcpd.conf.5 2014-01-03 20:59:11.118809123 +0100
++++ dhcp-4.2.5-P1/server/dhcpd.conf.5 2014-01-03 20:59:51.778809492 +0100
+@@ -2338,6 +2338,20 @@
+ must be a constant value.
+ .RE
+ .PP
++The
++.I ignore-client-uids
++statement
++.RS 0.25i
++.PP
++.B ignore-client-uids \fIflag\fB;\fR
++.PP
++If the \fIignore-client-uids\fR statement is present and has a value of
++\fItrue\fR or \fIon\fR, clients will be handled as though they provided no UID
++and the actual provided UID will not be recorded. If this statement is not
++present or has a value of \fIfalse\fR or \fIoff\fR, then client UIDs will be
++parsed and used as normal.
++.RE
++.PP
+ The
+ .I infinite-is-reserved
+ statement
+diff -dur -x '*~' -x '*.orig' dhcp-4.2.5-P1.orig/server/stables.c dhcp-4.2.5-P1/server/stables.c
+--- dhcp-4.2.5-P1.orig/server/stables.c 2013-03-05 19:26:51.000000000 +0100
++++ dhcp-4.2.5-P1/server/stables.c 2014-01-03 20:59:51.778809492 +0100
+@@ -266,6 +266,7 @@
+ { "ldap-tls-randfile", "t", &server_universe, 77, 1 },
+ #endif /* LDAP_USE_SSL */
+ #endif /* LDAP_CONFIGURATION */
++ { "ignore-client-uids", "f", &server_universe, 78, 1 },
+ { NULL, NULL, NULL, 0, 0 }
+ };
+
================================================================
---- gitweb:
http://git.pld-linux.org/gitweb.cgi/packages/dhcp.git/commitdiff/1781d6df4e36ef64d8bedf3cbf1aef62e77192cd
More information about the pld-cvs-commit
mailing list