Print this page
7388 Support DHCP Client FQDN. Allow IAID/DUID for all v4.
*** 18,27 ****
--- 18,28 ----
*
* CDDL HEADER END
*/
/*
* Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, Chris Fraire <cfraire@me.com>.
*
* This module contains core functions for managing DHCP state machine
* instances.
*/
*** 330,339 ****
--- 331,342 ----
free(dsmp->dsm_cid);
free(dsmp->dsm_prl);
free(dsmp->dsm_pil);
free(dsmp->dsm_routers);
free(dsmp->dsm_reqhost);
+ free(dsmp->dsm_msg_reqhost);
+ free(dsmp->dsm_reqfqdn);
free(dsmp);
/* no big deal if this fails */
if (global_smach_count == 0 && inactivity_id == -1) {
inactivity_id = iu_schedule_timer(tq, DHCP_INACTIVITY_WAIT,
*** 1047,1064 ****
/*
* There was either no user-specified Client ID value, or we were
* unable to parse it. We need to determine if a Client ID is required
* and, if so, generate one.
*
! * If it's IPv4, not in an IPMP group, and not a logical interface,
* then we need to preserve backward-compatibility by avoiding
* new-fangled DUID/IAID construction. (Note: even for IPMP test
* addresses, we construct a DUID/IAID since we may renew a lease for
* an IPMP test address on any functioning IP interface in the group.)
*/
if (!pif->pif_isv6 && pif->pif_grifname[0] == '\0' &&
! strchr(dsmp->dsm_name, ':') == NULL) {
if (pif->pif_hwtype == ARPHRD_IB) {
/*
* This comes from the DHCP over IPoIB specification.
* In the absence of an user specified client id, IPoIB
* automatically uses the required format, with the
--- 1050,1070 ----
/*
* There was either no user-specified Client ID value, or we were
* unable to parse it. We need to determine if a Client ID is required
* and, if so, generate one.
*
! * If it's IPv4, not in an IPMP group, not a logical interface,
! * and a DHCP default for DF_V4_DEFAULT_IAID_DUID is not affirmative,
* then we need to preserve backward-compatibility by avoiding
* new-fangled DUID/IAID construction. (Note: even for IPMP test
* addresses, we construct a DUID/IAID since we may renew a lease for
* an IPMP test address on any functioning IP interface in the group.)
*/
if (!pif->pif_isv6 && pif->pif_grifname[0] == '\0' &&
! strchr(dsmp->dsm_name, ':') == NULL &&
! !df_get_bool(dsmp->dsm_name, pif->pif_isv6,
! DF_V4_DEFAULT_IAID_DUID)) {
if (pif->pif_hwtype == ARPHRD_IB) {
/*
* This comes from the DHCP over IPoIB specification.
* In the absence of an user specified client id, IPoIB
* automatically uses the required format, with the
*** 1216,1225 ****
--- 1222,1240 ----
dsmp->dsm_ack = dsmp->dsm_orig_ack = NULL;
free(dsmp->dsm_reqhost);
dsmp->dsm_reqhost = NULL;
+ /*
+ * Do not reset dsm_msg_reqhost here. Unlike dsm_reqhost coming from
+ * /etc/host.*, dsm_msg_reqhost comes externally, and it survives until
+ * it is reset from another external message.
+ */
+
+ free(dsmp->dsm_reqfqdn);
+ dsmp->dsm_reqfqdn = NULL;
+
cancel_smach_timers(dsmp);
(void) set_smach_state(dsmp, INIT);
if (dsmp->dsm_isv6) {
dsmp->dsm_server = ipv6_all_dhcp_relay_and_servers;