DHCP FQDN option tweaks.

This commit is contained in:
Roy Marples
2013-07-25 16:22:46 +01:00
committed by Simon Kelley
parent 1ecbaaa382
commit 3f3adae6bc
3 changed files with 20 additions and 9 deletions

View File

@@ -63,6 +63,11 @@ version 2.67
Allow hostnames to start with a number, as allowed in Allow hostnames to start with a number, as allowed in
RFC-1123. Thanks to Kyle Mestery for the patch. RFC-1123. Thanks to Kyle Mestery for the patch.
Fixes to DHCP FQDN option handling: don't terminate FQDN
if domain not known and allow a FQDN option with blank
name to request that a FQDN option is returned in the
reply. Thanks to Roy Marples for the patch.
version 2.66 version 2.66
Add the ability to act as an authoritative DNS Add the ability to act as an authoritative DNS

View File

@@ -615,7 +615,7 @@ size_t dhcp_reply(struct dhcp_context *context, char *iface_name, int int_index,
return message ? 0 : dhcp_packet_size(mess, agent_id, real_end); return message ? 0 : dhcp_packet_size(mess, agent_id, real_end);
} }
if ((opt = option_find(mess, sz, OPTION_CLIENT_FQDN, 4))) if ((opt = option_find(mess, sz, OPTION_CLIENT_FQDN, 3)))
{ {
/* http://tools.ietf.org/wg/dhc/draft-ietf-dhc-fqdn-option/draft-ietf-dhc-fqdn-option-10.txt */ /* http://tools.ietf.org/wg/dhc/draft-ietf-dhc-fqdn-option/draft-ietf-dhc-fqdn-option-10.txt */
int len = option_len(opt); int len = option_len(opt);
@@ -645,7 +645,7 @@ size_t dhcp_reply(struct dhcp_context *context, char *iface_name, int int_index,
} }
if (fqdn_flags & 0x04) if (fqdn_flags & 0x04)
while (*op != 0 && ((op + (*op) + 1) - pp) < len) while (*op != 0 && ((op + (*op)) - pp) < len)
{ {
memcpy(pq, op+1, *op); memcpy(pq, op+1, *op);
pq += *op; pq += *op;
@@ -2289,6 +2289,8 @@ static void do_options(struct dhcp_context *context,
if (domain) if (domain)
len += strlen(domain) + 1; len += strlen(domain) + 1;
else if (fqdn_flags & 0x04)
len--;
if ((p = free_space(mess, end, OPTION_CLIENT_FQDN, len))) if ((p = free_space(mess, end, OPTION_CLIENT_FQDN, len)))
{ {
@@ -2300,9 +2302,11 @@ static void do_options(struct dhcp_context *context,
{ {
p = do_rfc1035_name(p, hostname); p = do_rfc1035_name(p, hostname);
if (domain) if (domain)
{
p = do_rfc1035_name(p, domain); p = do_rfc1035_name(p, domain);
*p++ = 0; *p++ = 0;
} }
}
else else
{ {
memcpy(p, hostname, strlen(hostname)); memcpy(p, hostname, strlen(hostname));

View File

@@ -1299,17 +1299,19 @@ struct dhcp_netid *add_options(struct state *state, struct in6_addr *fallback, s
size_t len = strlen(state->hostname); size_t len = strlen(state->hostname);
if (state->send_domain) if (state->send_domain)
len += strlen(state->send_domain) + 1; len += strlen(state->send_domain) + 2;
o = new_opt6(OPTION6_FQDN); o = new_opt6(OPTION6_FQDN);
if ((p = expand(len + 3))) if ((p = expand(len + 2)))
{ {
*(p++) = state->fqdn_flags; *(p++) = state->fqdn_flags;
p = do_rfc1035_name(p, state->hostname); p = do_rfc1035_name(p, state->hostname);
if (state->send_domain) if (state->send_domain)
{
p = do_rfc1035_name(p, state->send_domain); p = do_rfc1035_name(p, state->send_domain);
*p = 0; *p = 0;
} }
}
end_opt6(o); end_opt6(o);
} }