[dhcp] option 97 - pxe-client-id (#1058674)

Jiří Popelka jpopelka at fedoraproject.org
Wed Dec 17 10:03:33 UTC 2014


commit 5d40954fa5b5430fc5a40f259748f84fdc7b1a3b
Author: Jiri Popelka <jpopelka at redhat.com>
Date:   Wed Dec 17 10:57:39 2014 +0100

    option 97 - pxe-client-id (#1058674)

 dhcp-option97-pxe-client-id.patch |  217 +++++++++++++++++++++++++++++++++++++
 dhcp.spec                         |   11 ++-
 2 files changed, 226 insertions(+), 2 deletions(-)
---
diff --git a/dhcp-option97-pxe-client-id.patch b/dhcp-option97-pxe-client-id.patch
new file mode 100644
index 0000000..a9150e2
--- /dev/null
+++ b/dhcp-option97-pxe-client-id.patch
@@ -0,0 +1,217 @@
+diff -up dhcp-4.3.1/common/options.c.option97 dhcp-4.3.1/common/options.c
+--- dhcp-4.3.1/common/options.c.option97	2014-12-17 10:49:23.364257702 +0100
++++ dhcp-4.3.1/common/options.c	2014-12-17 10:49:23.458256518 +0100
+@@ -4270,13 +4270,26 @@ int validate_packet(struct packet *packe
+ 				"a future version of ISC DHCP will reject this");
+ 		}
+ 	} else {
+-		/* 
+-		 * If hlen is 0 we don't have any identifier, we warn the user
+-		 * but continue processing the packet as we can.
+-		 */
+-		if (packet->raw->hlen == 0) {
+-			log_debug("Received DHCPv4 packet without client-id"
+-				  " option and empty hlen field.");
++		oc = lookup_option (&dhcp_universe, packet->options,
++				    DHO_PXE_CLIENT_ID);
++		if (oc) {
++			/* Let's check if pxe-client-id is sane */
++			if ((oc->data.len < 2) ||
++			    (oc->data.data[0] == '\0' &&
++			     oc->data.len != 17)) {
++				log_debug("Dropped DHCPv4 packet with wrong "
++				    "(len == %d) pxe-client-id", oc->data.len);
++				return (0);
++			}
++		} else {
++			/*
++			 * If hlen is 0 we don't have any identifier, we warn the user
++			 * but continue processing the packet as we can.
++			 */
++			if (packet->raw->hlen == 0) {
++				log_debug("Received DHCPv4 packet without client-id"
++						" option and empty hlen field.");
++			}
+ 		}
+ 	}
+ 
+diff -up dhcp-4.3.1/common/tables.c.option97 dhcp-4.3.1/common/tables.c
+--- dhcp-4.3.1/common/tables.c.option97	2014-12-17 10:49:23.365257689 +0100
++++ dhcp-4.3.1/common/tables.c	2014-12-17 10:49:23.459256505 +0100
+@@ -197,8 +197,9 @@ static struct option dhcp_options[] = {
+ 	/* Defined by RFC 4578 */
+ 	{ "pxe-system-type", "S",		&dhcp_universe,  93, 1 },
+ 	{ "pxe-interface-id", "BBB",		&dhcp_universe,  94, 1 },
+-	{ "pxe-client-id", "BX",		&dhcp_universe,  97, 1 },
+ #endif
++	{ "pxe-client-id", "BX",		&dhcp_universe,  97, 1 },
++
+ 	{ "uap-servers", "t",			&dhcp_universe,  98, 1 },
+ #if defined(RFC4776_OPTIONS)
+         { "geoconf-civic", "X",                 &dhcp_universe, 99, 1 },
+diff -up dhcp-4.3.1/includes/dhcp.h.option97 dhcp-4.3.1/includes/dhcp.h
+--- dhcp-4.3.1/includes/dhcp.h.option97	2014-12-17 10:49:23.377257538 +0100
++++ dhcp-4.3.1/includes/dhcp.h	2014-12-17 10:49:23.459256505 +0100
+@@ -159,6 +159,7 @@ struct dhcp_packet {
+ #define DHO_AUTHENTICATE			90  /* RFC3118, was 210 */
+ #define DHO_CLIENT_LAST_TRANSACTION_TIME	91
+ #define DHO_ASSOCIATED_IP			92
++#define DHO_PXE_CLIENT_ID			97  /* RFC4578 */
+ #define DHO_SUBNET_SELECTION			118 /* RFC3011! */
+ #define DHO_DOMAIN_SEARCH			119 /* RFC3397 */
+ #define DHO_CLASSLESS_STATIC_ROUTES		121 /* RFC3442 */
+diff -up dhcp-4.3.1/server/dhcp.c.option97 dhcp-4.3.1/server/dhcp.c
+--- dhcp-4.3.1/server/dhcp.c.option97	2014-12-17 10:49:23.409257135 +0100
++++ dhcp-4.3.1/server/dhcp.c	2014-12-17 10:49:23.460256492 +0100
+@@ -196,6 +196,10 @@ dhcp (struct packet *packet) {
+ 			oc = lookup_option (&dhcp_universe, packet -> options,
+ 					    DHO_DHCP_CLIENT_IDENTIFIER);
+ 			if (!oc)
++				oc = lookup_option (&dhcp_universe,
++						    packet -> options,
++						    DHO_PXE_CLIENT_ID);
++			if (!oc)
+ 				goto nolease;
+ 
+ 			memset (&data, 0, sizeof data);
+@@ -764,6 +768,9 @@ void dhcprelease (packet, ms_nulltp)
+ 
+ 	oc = lookup_option (&dhcp_universe, packet -> options,
+ 			    DHO_DHCP_CLIENT_IDENTIFIER);
++	if (!oc)
++		oc = lookup_option (&dhcp_universe, packet -> options,
++				    DHO_PXE_CLIENT_ID);
+ 	memset (&data, 0, sizeof data);
+ 	if (oc &&
+ 	    evaluate_option_cache (&data, packet, (struct lease *)0,
+@@ -1191,6 +1198,9 @@ void dhcpinform (packet, ms_nulltp)
+          */
+ 	oc = lookup_option(&dhcp_universe, packet->options,
+ 			   DHO_DHCP_CLIENT_IDENTIFIER);
++	if (!oc)
++		oc = lookup_option (&dhcp_universe, packet -> options,
++				    DHO_PXE_CLIENT_ID);
+ 	memset(&d1, 0, sizeof(d1));
+ 	if (oc &&
+ 	    evaluate_option_cache(&d1, packet, NULL, NULL,
+@@ -2144,6 +2154,9 @@ void ack_lease (packet, lease, offer, wh
+ 		   can be used. */
+ 		oc = lookup_option (&dhcp_universe, packet -> options,
+ 				    DHO_DHCP_CLIENT_IDENTIFIER);
++		if (!oc)
++			oc = lookup_option (&dhcp_universe, packet -> options,
++					    DHO_PXE_CLIENT_ID);
+ 		if (oc &&
+ 		    evaluate_option_cache (&d1, packet, lease,
+ 					   (struct client_state *)0,
+@@ -2715,6 +2728,9 @@ void ack_lease (packet, lease, offer, wh
+ 		/* Record the uid, if given... */
+ 		oc = lookup_option (&dhcp_universe, packet -> options,
+ 				    DHO_DHCP_CLIENT_IDENTIFIER);
++		if (!oc)
++			oc = lookup_option (&dhcp_universe, packet -> options,
++					    DHO_PXE_CLIENT_ID);
+ 		if (oc &&
+ 		    evaluate_option_cache(&d1, packet, lease, NULL,
+ 					  packet->options, state->options,
+@@ -3812,6 +3828,9 @@ int find_lease (struct lease **lp,
+ 	   specified unique client identifier. */
+ 	oc = lookup_option (&dhcp_universe, packet -> options,
+ 			    DHO_DHCP_CLIENT_IDENTIFIER);
++	if (!oc)
++		oc = lookup_option (&dhcp_universe, packet -> options,
++				    DHO_PXE_CLIENT_ID);
+ 	memset (&client_identifier, 0, sizeof client_identifier);
+ 	if (oc &&
+ 	    evaluate_option_cache (&client_identifier,
+diff -up dhcp-4.3.1/server/dhcpd.conf.5.option97 dhcp-4.3.1/server/dhcpd.conf.5
+--- dhcp-4.3.1/server/dhcpd.conf.5.option97	2014-12-17 10:49:23.325258193 +0100
++++ dhcp-4.3.1/server/dhcpd.conf.5	2014-12-17 10:49:23.461256480 +0100
+@@ -1559,10 +1559,12 @@ should be a name identifying the host.
+ not specified for the host, \fIhostname\fR is used.
+ .PP
+ \fIHost\fR declarations are matched to actual DHCP or BOOTP clients
+-by matching the \fRdhcp-client-identifier\fR option specified in the
++by matching the \fIdhcp-client-identifier\fR or \fIpxe-client-id\fR
++options specified in the
+ \fIhost\fR declaration to the one supplied by the client, or, if the
+ \fIhost\fR declaration or the client does not provide a
+-\fRdhcp-client-identifier\fR option, by matching the \fIhardware\fR
++\fIdhcp-client-identifier\fR or \fIpxe-client-id\fR options,
++by matching the \fIhardware\fR
+ parameter in the \fIhost\fR declaration to the network hardware
+ address supplied by the client.  BOOTP clients do not normally
+ provide a \fIdhcp-client-identifier\fR, so the hardware address must
+@@ -1574,7 +1576,8 @@ to identify hosts.
+ .PP
+ Please be aware that
+ .B only
+-the \fIdhcp-client-identifier\fR option and the hardware address can be
++the \fIdhcp-client-identifier\fR and \fIpxe-client-id\fR
++options and the hardware address can be
+ used to match a host declaration, or the \fIhost-identifier option\fR
+ parameter for DHCPv6 servers.  For example, it is not possible to
+ match a host declaration to a \fIhost-name\fR option.  This is
+diff -up dhcp-4.3.1/server/dhcpleasequery.c.option97 dhcp-4.3.1/server/dhcpleasequery.c
+--- dhcp-4.3.1/server/dhcpleasequery.c.option97	2014-08-07 00:35:02.000000000 +0200
++++ dhcp-4.3.1/server/dhcpleasequery.c	2014-12-17 10:49:23.457256530 +0100
+@@ -269,7 +269,7 @@ dhcpleasequery(struct packet *packet, in
+ 		 */
+ 
+ 		memset(&uid, 0, sizeof(uid));
+-		if (get_option(&uid, 
++		i = get_option(&uid,
+ 			       &dhcp_universe,
+ 			       packet,
+ 			       NULL,
+@@ -279,8 +279,20 @@ dhcpleasequery(struct packet *packet, in
+ 			       packet->options, 
+ 			       &global_scope,
+ 			       DHO_DHCP_CLIENT_IDENTIFIER,
+-			       MDL)) {
+-
++			       MDL);
++		if (!i)
++			i = get_option(&uid,
++				       &dhcp_universe,
++				       packet,
++				       NULL,
++				       NULL,
++				       packet->options,
++				       NULL,
++				       packet->options,
++				       &global_scope,
++				       DHO_PXE_CLIENT_ID,
++				       MDL);
++		if (i) {
+ 			snprintf(dbg_info, 
+ 				 sizeof(dbg_info), 
+ 				 "client-id %s",
+diff -up dhcp-4.3.1/server/failover.c.option97 dhcp-4.3.1/server/failover.c
+--- dhcp-4.3.1/server/failover.c.option97	2014-12-17 10:49:23.413257085 +0100
++++ dhcp-4.3.1/server/failover.c	2014-12-17 10:49:23.462256467 +0100
+@@ -5878,6 +5878,9 @@ int load_balance_mine (struct packet *pa
+ 
+ 	oc = lookup_option(&dhcp_universe, packet->options,
+ 			   DHO_DHCP_CLIENT_IDENTIFIER);
++	if (!oc)
++		oc = lookup_option(&dhcp_universe, packet -> options,
++				    DHO_PXE_CLIENT_ID);
+ 	memset(&ds, 0, sizeof ds);
+ 	if (oc &&
+ 	    evaluate_option_cache(&ds, packet, NULL, NULL,
+diff -up dhcp-4.3.1/server/mdb.c.option97 dhcp-4.3.1/server/mdb.c
+--- dhcp-4.3.1/server/mdb.c.option97	2014-08-07 00:35:03.000000000 +0200
++++ dhcp-4.3.1/server/mdb.c	2014-12-17 10:49:23.463256455 +0100
+@@ -130,8 +130,9 @@ static int find_uid_statement (struct ex
+ 	    esp -> data.option &&
+ 	    (esp -> data.option -> option -> universe ==
+ 	     &dhcp_universe) &&
+-	    (esp -> data.option -> option -> code ==
+-	     DHO_DHCP_CLIENT_IDENTIFIER)) {
++	    ((esp -> data.option -> option -> code ==
++						DHO_DHCP_CLIENT_IDENTIFIER) ||
++	     (esp -> data.option -> option -> code == DHO_PXE_CLIENT_ID))) {
+ 		if (condp) {
+ 			log_error ("dhcp client identifier may not be %s",
+ 				   "specified conditionally.");
diff --git a/dhcp.spec b/dhcp.spec
index eb3e4e4..a5bb68c 100644
--- a/dhcp.spec
+++ b/dhcp.spec
@@ -18,7 +18,7 @@
 Summary:  Dynamic host configuration protocol software
 Name:     dhcp
 Version:  4.3.1
-Release:  16%{?dist}
+Release:  17%{?dist}
 # NEVER CHANGE THE EPOCH on this package.  The previous maintainer (prior to
 # dcantrell maintaining the package) made incorrect use of the epoch and
 # that's why it is at 12 now.  It should have never been used, but it was.
@@ -77,7 +77,7 @@ Patch37:  dhcp-dhc6-life.patch
 Patch38:  dhcp-skip-vlan.patch
 Patch39:  dhcp-relay-hop-limit.patch
 Patch40:  dhcp-ldapgssapi.patch
-
+Patch41:  dhcp-option97-pxe-client-id.patch
 Patch100: dhcp-bind996.patch
 
 BuildRequires: autoconf
@@ -373,6 +373,10 @@ rm -rf includes/isc-dhcp
 # GSSAPI support for ldap authentication (#1150542)
 %patch40 -p1 -b .ldapgssapi
 
+# option 97 - pxe-client-id (#1058674)
+# (Submitted to dhcp-bugs at isc.org - [ISC-Bugs #38110])
+%patch41 -p1 -b .option97
+
 # to build against bind-9.9.6
 %patch100 -p1 -b .bind996
 
@@ -676,6 +680,9 @@ done
 %doc doc/html/
 
 %changelog
+* Wed Dec 17 2014 Jiri Popelka <jpopelka at redhat.com> - 12:4.3.1-17
+- option 97 - pxe-client-id (#1058674)
+
 * Wed Nov 19 2014 Jiri Popelka <jpopelka at redhat.com> - 12:4.3.1-16
 - amend post scriptlets for #1120656
 


More information about the scm-commits mailing list