diff --git a/RELNOTES b/RELNOTES index 25000f80..dd67d5b8 100644 --- a/RELNOTES +++ b/RELNOTES @@ -27,6 +27,12 @@ the README file. Changes since 3.1.0b1 +- A new server config option "fqdn-reply" specifies whether the server + should send out option 81 (FQDN). Defaults to "on". If set to "off", + the FQDN option is not sent, even if the client requested it. This is + needed because some clients misbehave otherwise. Thanks to Christof Chen + at Allianz. + - Allow trace output files (-tf option) to be overwritten, rather than crashing dhcpd if the file already exists diff --git a/includes/dhcpd.h b/includes/dhcpd.h index 276e50d9..c52a9125 100644 --- a/includes/dhcpd.h +++ b/includes/dhcpd.h @@ -552,6 +552,7 @@ struct lease_state { #define SV_LEASEQUERY 49 #define SV_ADAPTIVE_LEASE_TIME_THRESHOLD 50 #define SV_DO_REVERSE_UPDATES 51 +#define SV_FQDN_REPLY 52 #if !defined (DEFAULT_PING_TIMEOUT) # define DEFAULT_PING_TIMEOUT 1 diff --git a/server/ddns.c b/server/ddns.c index 7ef4fecd..3e833d63 100644 --- a/server/ddns.c +++ b/server/ddns.c @@ -34,7 +34,7 @@ #ifndef lint static char copyright[] = -"$Id: ddns.c,v 1.25 2007/04/03 16:46:03 dhankins Exp $ Copyright (c) 2004-2007 Internet Systems Consortium. All rights reserved.\n"; +"$Id: ddns.c,v 1.26 2007/04/27 22:48:00 each Exp $ Copyright (c) 2004-2007 Internet Systems Consortium. All rights reserved.\n"; #endif /* not lint */ #include "dhcpd.h" @@ -597,6 +597,21 @@ int ddns_updates (struct packet *packet, } noerror: + /* + * If fqdn-reply option is disabled in dhcpd.conf, then don't + * send the client an FQDN option at all, even if one was requested. + * (WinXP clients allegedly misbehave if the option is present, + * refusing to handle PTR updates themselves). + */ + if ((oc = lookup_option (&server_universe, state->options, + SV_FQDN_REPLY)) && + !evaluate_boolean_option_cache (&ignorep, packet, lease, + (struct client_state *)0, + packet->options, + state->options, + &lease->scope, oc, MDL)) { + goto badfqdn; + /* If we're ignoring client updates, then we tell a sort of 'white * lie'. We've already updated the name the server wants (per the * config written by the server admin). Now let the client do as @@ -605,7 +620,7 @@ int ddns_updates (struct packet *packet, * We only form an FQDN option this way if the client supplied an * FQDN option that had FQDN_SERVER_UPDATE set false. */ - if (client_ignorep && + } else if (client_ignorep && (oc = lookup_option(&fqdn_universe, packet->options, FQDN_SERVER_UPDATE)) && !evaluate_boolean_option_cache(&ignorep, packet, lease, NULL, diff --git a/server/stables.c b/server/stables.c index 011a9351..3d68e180 100644 --- a/server/stables.c +++ b/server/stables.c @@ -34,7 +34,7 @@ #ifndef lint static char copyright[] = -"$Id: stables.c,v 1.36 2007/04/03 16:46:03 dhankins Exp $ Copyright (c) 2004-2007 Internet Systems Consortium. All rights reserved.\n"; +"$Id: stables.c,v 1.37 2007/04/27 22:48:00 each Exp $ Copyright (c) 2004-2007 Internet Systems Consortium. All rights reserved.\n"; #endif /* not lint */ #include "dhcpd.h" @@ -237,6 +237,7 @@ static struct option server_options[] = { { "leasequery", "f", &server_universe, 49, 1 }, { "adaptive-lease-time-threshold", "B", &server_universe, 50, 1 }, { "do-reverse-updates", "f", &server_universe, 51, 1 }, + { "fqdn-reply", "f", &server_universe, 52, 1 }, { NULL, NULL, NULL, 0, 0 } };