Commit 0829d595 authored by David Hankins's avatar David Hankins
Browse files

- 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]
parent 4b97eaff
......@@ -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.
......
......@@ -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)
......
.\" $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";
......
......@@ -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,
......
......@@ -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"))
......
......@@ -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));
......
......@@ -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. */
......
......@@ -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]) -
......
......@@ -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,
......
......@@ -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 {
......
......@@ -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 && \
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment