diff options
author | David Hankins <dhankins@isc.org> | 2009-03-13 21:41:45 +0000 |
---|---|---|
committer | David Hankins <dhankins@isc.org> | 2009-03-13 21:41:45 +0000 |
commit | 0829d595f8f98ad4121cfc96870958e359c099cc (patch) | |
tree | 01078a188bf6ca45177c423dd299ed480eff3889 /common | |
parent | 4b97eaff2f22bf1743ea67ac477c9aef72070ed4 (diff) | |
download | isc-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.c | 3 | ||||
-rw-r--r-- | common/conflex.c | 2 | ||||
-rw-r--r-- | common/dlpi.c | 5 | ||||
-rw-r--r-- | common/lpf.c | 3 | ||||
-rw-r--r-- | common/nit.c | 3 | ||||
-rw-r--r-- | common/upf.c | 3 |
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, |