summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Hankins <dhankins@isc.org>2009-03-13 21:41:45 +0000
committerDavid Hankins <dhankins@isc.org>2009-03-13 21:41:45 +0000
commit0829d595f8f98ad4121cfc96870958e359c099cc (patch)
tree01078a188bf6ca45177c423dd299ed480eff3889
parent4b97eaff2f22bf1743ea67ac477c9aef72070ed4 (diff)
downloadisc-dhcp-0829d595f8f98ad4121cfc96870958e359c099cc.tar.gz
- If configured, dhclient may now transmit to an anycast MAC address,
rather than using a broadcast address. Thanks to a patch from David Cantrell at Red Hat. [ISC-Bugs #17740]
-rw-r--r--RELNOTES4
-rw-r--r--client/clparse.c11
-rw-r--r--client/dhclient.conf.528
-rw-r--r--common/bpf.c3
-rw-r--r--common/conflex.c2
-rw-r--r--common/dlpi.c5
-rw-r--r--common/lpf.c3
-rw-r--r--common/nit.c3
-rw-r--r--common/upf.c3
-rw-r--r--includes/dhcpd.h1
-rw-r--r--includes/dhctoken.h4
11 files changed, 63 insertions, 4 deletions
diff --git a/RELNOTES b/RELNOTES
index 28b08928..46c28b35 100644
--- a/RELNOTES
+++ b/RELNOTES
@@ -42,6 +42,10 @@ work on other platforms. Please report any problems and suggested fixes to
described in the -12 revision of the Failover draft (and assigned by
IANA). Thanks in part to a patch from David Cantrell at Red Hat.
+- If configured, dhclient may now transmit to an anycast MAC address,
+ rather than using a broadcast address. Thanks to a patch from David
+ Cantrell at Red Hat.
+
Changes since 4.1.0 (bug fixes)
- Validate the argument to the -p option.
diff --git a/client/clparse.c b/client/clparse.c
index 52a7db25..2cab5f93 100644
--- a/client/clparse.c
+++ b/client/clparse.c
@@ -541,6 +541,17 @@ void parse_client_statement (cfile, ip, config)
}
return;
+ case ANYCAST_MAC:
+ token = next_token(&val, NULL, cfile);
+ if (ip != NULL) {
+ parse_hardware_param(cfile, &ip->anycast_mac_addr);
+ } else {
+ parse_warn(cfile, "anycast mac address parameter "
+ "not allowed here.");
+ skip_to_semi (cfile);
+ }
+ return;
+
case REQUEST:
token = next_token (&val, (unsigned *)0, cfile);
if (config -> requested_options == default_requested_options)
diff --git a/client/dhclient.conf.5 b/client/dhclient.conf.5
index b1453309..189a4099 100644
--- a/client/dhclient.conf.5
+++ b/client/dhclient.conf.5
@@ -1,4 +1,4 @@
-.\" $Id: dhclient.conf.5,v 1.23 2009/01/22 21:22:42 dhankins Exp $
+.\" $Id: dhclient.conf.5,v 1.24 2009/03/13 21:41:45 dhankins Exp $
.\"
.\" Copyright (c) 2004,2007 by Internet Systems Consortium, Inc. ("ISC")
.\" Copyright (c) 1996-2003 by Internet Software Consortium
@@ -583,7 +583,6 @@ the subnet, counting the number of significant bits in the netmask starting
from the leftmost end. Example configuration syntax:
.PP
.I \fIreject\fR 192.168.0.0\fB/\fR16\fB,\fR 10.0.0.5\fB;\fR
-.RE
.PP
The above example would cause offers from any server identifier in the
entire RFC 1918 "Class C" network 192.168.0.0/16, or the specific
@@ -659,6 +658,30 @@ database and will record the media type used to acquire the address.
Whenever the client tries to renew the lease, it will use that same
media type. The lease must expire before the client will go back to
cycling through media types.
+.PP
+ \fBhardware\fR \fIlink-type mac-address\fR\fB;\fR
+.PP
+The
+.B hardware
+statement defines the hardware MAC address to use for this interface,
+for DHCP servers or relays to direct their replies. dhclient will determine
+the interface's MAC address automatically, so use of this parameter
+is not recommended. The \fIlink-type\fR corresponds to the interface's
+link layer type (example: 'ethernet'), while the \fImac-address\fR is
+a string of colon-separated hexadecimal values for octets.
+.PP
+ \fBanycast-mac\fR \fIlink-type mac-address\fR\fB;\fR
+.PP
+The
+.B anycast-mac
+statement over-rides the all-ones broadcast MAC address dhclient will use
+when it is transmitting packets to the all-ones limited broadcast IPv4
+address. This configuration parameter is useful to reduce the number of
+broadcast packets transmitted by DHCP clients, but is only useful if you
+know the DHCP service(s) anycast MAC address prior to configuring your
+client. The \fIlink-type\fR and \fImac-address\fR parameters are configured
+in a similar manner to the \fBhardware\fR statement.
+.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
@@ -678,6 +701,7 @@ reject 192.33.137.209;
interface "ep0" {
send host-name "andare.fugue.com";
+ hardware ethernet 00:a0:24:ab:fb:9c;
send dhcp-client-identifier 1:0:a0:24:ab:fb:9c;
send dhcp-lease-time 3600;
supersede domain-name "fugue.com rc.vix.com home.vix.com";
diff --git a/common/bpf.c b/common/bpf.c
index 08fbf242..f76fc27b 100644
--- a/common/bpf.c
+++ b/common/bpf.c
@@ -362,6 +362,9 @@ ssize_t send_packet (interface, packet, raw, len, from, to, hto)
return send_fallback (interface, packet, raw,
len, from, to, hto);
+ if (hto == NULL && interface->anycast_mac_addr.hlen)
+ hto = &interface->anycast_mac_addr;
+
/* Assemble the headers... */
assemble_hw_header (interface, (unsigned char *)hw, &hbufp, hto);
assemble_udp_ip_header (interface,
diff --git a/common/conflex.c b/common/conflex.c
index 176551d9..3625a78d 100644
--- a/common/conflex.c
+++ b/common/conflex.c
@@ -720,6 +720,8 @@ intern(char *atom, enum dhcp_token dfv) {
}
if (!strcasecmp (atom + 1, "nd"))
return AND;
+ if (!strcasecmp(atom + 1, "nycast-mac"))
+ return ANYCAST_MAC;
if (!strcasecmp (atom + 1, "ppend"))
return APPEND;
if (!strcasecmp (atom + 1, "llow"))
diff --git a/common/dlpi.c b/common/dlpi.c
index 6726e103..a2d5cb2d 100644
--- a/common/dlpi.c
+++ b/common/dlpi.c
@@ -538,6 +538,9 @@ ssize_t send_packet (interface, packet, raw, len, from, to, hto)
return send_fallback (interface, packet, raw,
len, from, to, hto);
+ if (hto == NULL && interface->anycast_mac_addr.hlen)
+ hto = &interface->anycast_mac_addr;
+
dbuflen = 0;
/* Assemble the headers... */
@@ -593,7 +596,7 @@ ssize_t send_packet (interface, packet, raw, len, from, to, hto)
else
memcpy ( phys, interface -> dlpi_broadcast_addr.hbuf,
interface -> dlpi_broadcast_addr.hlen);
-
+
if (sap_len < 0) {
memcpy ( dstaddr, phys, phys_len);
memcpy ( (char *) &dstaddr [phys_len], sap, ABS (sap_len));
diff --git a/common/lpf.c b/common/lpf.c
index 2269f019..dfcdb3d8 100644
--- a/common/lpf.c
+++ b/common/lpf.c
@@ -302,6 +302,9 @@ ssize_t send_packet (interface, packet, raw, len, from, to, hto)
return send_fallback (interface, packet, raw,
len, from, to, hto);
+ if (hto == NULL && interface->anycast_mac_addr.hlen)
+ hto = &interface->anycast_mac_addr;
+
/* Assemble the headers... */
assemble_hw_header (interface, (unsigned char *)hh, &hbufp, hto);
fudge = hbufp % 4; /* IP header must be word-aligned. */
diff --git a/common/nit.c b/common/nit.c
index 7d92733f..db39b761 100644
--- a/common/nit.c
+++ b/common/nit.c
@@ -298,6 +298,9 @@ ssize_t send_packet (interface, packet, raw, len, from, to, hto)
return send_fallback (interface, packet, raw,
len, from, to, hto);
+ if (hto == NULL && interface->anycast_mac_addr.hlen)
+ hto = &interface->anycast_mac_addr;
+
/* Start with the sockaddr struct... */
junk = (struct sockaddr *)&hh [0];
hbufp = (((unsigned char *)&junk -> sa_data [0]) -
diff --git a/common/upf.c b/common/upf.c
index 9c66a758..611ed23f 100644
--- a/common/upf.c
+++ b/common/upf.c
@@ -260,6 +260,9 @@ ssize_t send_packet (interface, packet, raw, len, from, to, hto)
return send_fallback (interface, packet, raw,
len, from, to, hto);
+ if (hto == NULL && interface->anycast_mac_addr.hlen)
+ hto = &interface->anycast_mac_addr;
+
/* Assemble the headers... */
assemble_hw_header (interface, (unsigned char *)hw, &hbufp, hto);
assemble_udp_ip_header (interface,
diff --git a/includes/dhcpd.h b/includes/dhcpd.h
index d1ca0fe2..8a014bc5 100644
--- a/includes/dhcpd.h
+++ b/includes/dhcpd.h
@@ -1156,6 +1156,7 @@ struct interface_info {
int dlpi_sap_length;
struct hardware dlpi_broadcast_addr;
# endif /* DLPI_SEND || DLPI_RECEIVE */
+ struct hardware anycast_mac_addr;
};
struct hardware_link {
diff --git a/includes/dhctoken.h b/includes/dhctoken.h
index 0f013885..f7382d25 100644
--- a/includes/dhctoken.h
+++ b/includes/dhctoken.h
@@ -352,7 +352,9 @@ enum dhcp_token {
ZEROLEN = 655,
TEMPORARY = 656,
PREFIX6 = 657,
- FIXED_PREFIX6 = 658
+ FIXED_PREFIX6 = 658,
+ ANYCAST_MAC = 659
+
};
#define is_identifier(x) ((x) >= FIRST_TOKEN && \