Print this page
7388 Support DHCP Client FQDN. Allow IAID/DUID for all v4.

*** 19,28 **** --- 19,29 ---- * CDDL HEADER END */ /* * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, Chris Fraire <cfraire@me.com>. */ #include <arpa/inet.h> #include <assert.h> #include <libdlaggr.h>
*** 31,40 **** --- 32,42 ---- #include <libnwam.h> #include <libscf.h> #include <netinet/in.h> #include <stdlib.h> #include <strings.h> + #include <sys/param.h> #include <sys/socket.h> #include <sys/time.h> #include <sys/types.h> #include <values.h> #include <zone.h>
*** 126,135 **** --- 128,148 ---- if ((err = nwam_ncu_get_prop_value(ncuh, prop, val)) != NWAM_SUCCESS) return (err); return (nwam_value_get_uint64_array(*val, uintval, cnt)); } + nwam_error_t + nwamd_get_ncu_boolean(nwam_ncu_handle_t ncuh, nwam_value_t *val, + boolean_t **boolval, uint_t *cnt, const char *prop) + { + nwam_error_t err; + + if ((err = nwam_ncu_get_prop_value(ncuh, prop, val)) != NWAM_SUCCESS) + return (err); + return (nwam_value_get_boolean_array(*val, boolval, cnt)); + } + /* * Run link/interface state machine in response to a state change * or enable/disable action event. */ static void
*** 731,747 **** static void populate_ip_ncu_properties(nwam_ncu_handle_t ncuh, nwamd_ncu_t *ncu_data) { nwamd_if_t *nif = &ncu_data->ncu_if; struct nwamd_if_address **nifa, *nifai, *nifait; ! boolean_t static_addr = B_FALSE; uint64_t *addrsrcvalue; nwam_value_t ncu_prop; nwam_error_t err; ipadm_addrobj_t ipaddr; ipadm_status_t ipstatus; ! char **addrvalue; uint_t numvalues; uint64_t *ipversion; int i; nif->nwamd_if_ipv4 = B_FALSE; --- 744,760 ---- static void populate_ip_ncu_properties(nwam_ncu_handle_t ncuh, nwamd_ncu_t *ncu_data) { nwamd_if_t *nif = &ncu_data->ncu_if; struct nwamd_if_address **nifa, *nifai, *nifait; ! boolean_t static_addr = B_FALSE, *boolvalue, dhcp_primary = B_FALSE; uint64_t *addrsrcvalue; nwam_value_t ncu_prop; nwam_error_t err; ipadm_addrobj_t ipaddr; ipadm_status_t ipstatus; ! char **addrvalue, ipreqhost[MAXNAMELEN]; uint_t numvalues; uint64_t *ipversion; int i; nif->nwamd_if_ipv4 = B_FALSE;
*** 774,783 **** --- 787,829 ---- } } nwam_value_free(ncu_prop); } + /* ip-primary */ + if ((err = nwamd_get_ncu_boolean(ncuh, &ncu_prop, &boolvalue, + &numvalues, NWAM_NCU_PROP_IP_PRIMARY)) != NWAM_SUCCESS) { + /* ip-primary is optional, so do not LOG_ERR */ + nlog(LOG_DEBUG, "populate_ip_ncu_properties: " + "could not get %s value: %s", + NWAM_NCU_PROP_IP_PRIMARY, nwam_strerror(err)); + } else { + if (numvalues > 0) + dhcp_primary = boolvalue[0]; + nwam_value_free(ncu_prop); + } + + /* ip-reqhost */ + *ipreqhost = '\0'; + + if ((err = nwamd_get_ncu_string(ncuh, &ncu_prop, &addrvalue, + &numvalues, NWAM_NCU_PROP_IP_REQHOST)) != NWAM_SUCCESS) { + /* ip-reqhost is optional, so do not LOG_ERR */ + nlog(LOG_DEBUG, "populate_ip_ncu_properties: " + "could not get %s value: %s", + NWAM_NCU_PROP_IP_REQHOST, nwam_strerror(err)); + } else { + if (numvalues > 0 && strlcpy(ipreqhost, addrvalue[0], + sizeof (ipreqhost)) >= sizeof (ipreqhost)) { + nlog(LOG_WARNING, "populate_ip_ncu_properties: " + "too long %s value: %s", + NWAM_NCU_PROP_IP_REQHOST, addrvalue[0]); + *ipreqhost = '\0'; + } + nwam_value_free(ncu_prop); + } + /* Free the old list. */ for (nifai = nif->nwamd_if_list; nifai != NULL; nifai = nifait) { nifait = nifai->next; nifai->next = NULL; ipadm_destroy_addrobj(nifai->ipaddr);
*** 826,835 **** --- 872,897 ---- "ipadm_set_wait_time failed for v4 dhcp: %s", ipadm_status2str(ipstatus)); ipadm_destroy_addrobj(ipaddr); goto skip_ipv4_dhcp; } + ipstatus = ipadm_set_primary(ipaddr, dhcp_primary); + if (ipstatus != IPADM_SUCCESS) { + nlog(LOG_ERR, "populate_ip_ncu_properties: " + "ipadm_set_primary failed for v4 dhcp: %s", + ipadm_status2str(ipstatus)); + ipadm_destroy_addrobj(ipaddr); + goto skip_ipv4_dhcp; + } + ipstatus = ipadm_set_reqhost(ipaddr, ipreqhost); + if (ipstatus != IPADM_SUCCESS) { + nlog(LOG_ERR, "populate_ip_ncu_properties: " + "ipadm_set_reqhost failed for v4 dhcp: %s", + ipadm_status2str(ipstatus)); + ipadm_destroy_addrobj(ipaddr); + goto skip_ipv4_dhcp; + } if ((*nifa = calloc(sizeof (**nifa), 1)) != NULL) { (*nifa)->family = AF_INET; (*nifa)->ipaddr_atype = IPADM_ADDR_DHCP; (*nifa)->ipaddr = ipaddr; nifa = &((*nifa)->next);
*** 846,856 **** /* ipv4-addr */ if (static_addr) { if ((err = nwamd_get_ncu_string(ncuh, &ncu_prop, &addrvalue, &numvalues, NWAM_NCU_PROP_IPV4_ADDR)) != NWAM_SUCCESS) { nlog(LOG_ERR, "populate_ip_ncu_properties: " ! "could not get %s value; %s", NWAM_NCU_PROP_IPV4_ADDR, nwam_strerror(err)); } else { for (i = 0; i < numvalues; i++) { ipstatus = ipadm_create_addrobj( IPADM_ADDR_STATIC, ncu_data->ncu_name, --- 908,918 ---- /* ipv4-addr */ if (static_addr) { if ((err = nwamd_get_ncu_string(ncuh, &ncu_prop, &addrvalue, &numvalues, NWAM_NCU_PROP_IPV4_ADDR)) != NWAM_SUCCESS) { nlog(LOG_ERR, "populate_ip_ncu_properties: " ! "could not get %s value: %s", NWAM_NCU_PROP_IPV4_ADDR, nwam_strerror(err)); } else { for (i = 0; i < numvalues; i++) { ipstatus = ipadm_create_addrobj( IPADM_ADDR_STATIC, ncu_data->ncu_name,
*** 993,1003 **** /* ipv6-addr */ if (static_addr) { if ((err = nwamd_get_ncu_string(ncuh, &ncu_prop, &addrvalue, &numvalues, NWAM_NCU_PROP_IPV6_ADDR)) != NWAM_SUCCESS) { nlog(LOG_ERR, "populate_ip_ncu_properties: " ! "could not get %s value; %s", NWAM_NCU_PROP_IPV6_ADDR, nwam_strerror(err)); } else { for (i = 0; i < numvalues; i++) { ipstatus = ipadm_create_addrobj( IPADM_ADDR_STATIC, ncu_data->ncu_name, --- 1055,1065 ---- /* ipv6-addr */ if (static_addr) { if ((err = nwamd_get_ncu_string(ncuh, &ncu_prop, &addrvalue, &numvalues, NWAM_NCU_PROP_IPV6_ADDR)) != NWAM_SUCCESS) { nlog(LOG_ERR, "populate_ip_ncu_properties: " ! "could not get %s value: %s", NWAM_NCU_PROP_IPV6_ADDR, nwam_strerror(err)); } else { for (i = 0; i < numvalues; i++) { ipstatus = ipadm_create_addrobj( IPADM_ADDR_STATIC, ncu_data->ncu_name,