summaryrefslogtreecommitdiff
path: root/common
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 /common
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]
Diffstat (limited to 'common')
-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
6 files changed, 18 insertions, 1 deletions
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,