Print this page
7388 Support DHCP Client FQDN. Allow IAID/DUID for all v4.
@@ -19,10 +19,11 @@
* CDDL HEADER END
*/
/*
* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright 2012 Nexenta Systems, Inc. All rights reserved.
+ * Copyright (c) 2016, Chris Fraire <cfraire@me.com>.
*/
#include <arpa/inet.h>
#include <errno.h>
#include <getopt.h>
#include <inet/ip.h>
@@ -86,11 +87,12 @@
/* address management related sub-commands */
{ "create-addr", do_create_addr,
"\tcreate-addr\t[-t] -T static [-d] "
"-a{local|remote}=addr[/prefixlen]\n\t\t\t<addrobj>\n"
- "\tcreate-addr\t[-t] -T dhcp [-w <seconds> | forever] <addrobj>\n"
+ "\tcreate-addr\t[-t] -T dhcp [-w <seconds> | forever]\n"
+ "\t\t\t[-1] [-h <hostname>] <addrobj>\n"
"\tcreate-addr\t[-t] -T addrconf [-i interface-id]\n"
"\t\t\t[-p {stateful|stateless}={yes|no}] <addrobj>" },
{ "down-addr", do_down_addr, "\tdown-addr\t[-t] <addrobj>" },
{ "up-addr", do_up_addr, "\tup-addr\t\t[-t] <addrobj>" },
{ "disable-addr", do_disable_addr, "\tdisable-addr\t-t <addrobj>" },
@@ -159,11 +161,13 @@
static const struct option addr_longopts[] = {
{"address", required_argument, 0, 'a' },
{"down", no_argument, 0, 'd' },
{"interface-id", required_argument, 0, 'i' },
+ {"primary", no_argument, 0, '1' },
{"prop", required_argument, 0, 'p' },
+ {"reqhost", required_argument, 0, 'h' },
{"temporary", no_argument, 0, 't' },
{"type", required_argument, 0, 'T' },
{"wait", required_argument, 0, 'w' },
{ 0, 0, 0, 0 }
};
@@ -630,12 +634,12 @@
return (_B_TRUE);
}
/*
* Properties to be displayed is in `statep->sps_proplist'. If it is NULL,
- * for all the properties for the specified object, relavant information, will
- * be displayed. Otherwise, for the selected property set, display relevant
+ * for all the properties for the specified object, display relevant
+ * information. Otherwise, for the selected property set, display relevant
* information
*/
static void
show_properties(void *arg, int prop_class)
{
@@ -1256,18 +1260,23 @@
char *atype = NULL;
char *static_arg = NULL;
char *addrconf_arg = NULL;
char *interface_id = NULL;
char *wait = NULL;
+ char *reqhost = NULL;
boolean_t s_opt = _B_FALSE; /* static addr options */
boolean_t auto_opt = _B_FALSE; /* Addrconf options */
boolean_t dhcp_opt = _B_FALSE; /* dhcp options */
+ boolean_t primary_opt = _B_FALSE; /* dhcp primary option */
opterr = 0;
- while ((option = getopt_long(argc, argv, ":T:a:di:p:w:t",
+ while ((option = getopt_long(argc, argv, ":1T:a:dh:i:p:w:t",
addr_longopts, NULL)) != -1) {
switch (option) {
+ case '1':
+ primary_opt = _B_TRUE;
+ break;
case 'T':
atype = optarg;
break;
case 'a':
static_arg = optarg;
@@ -1275,10 +1284,13 @@
break;
case 'd':
flags &= ~IPADM_OPT_UP;
s_opt = _B_TRUE;
break;
+ case 'h':
+ reqhost = optarg;
+ break;
case 'i':
interface_id = optarg;
auto_opt = _B_TRUE;
break;
case 'p':
@@ -1306,11 +1318,12 @@
/*
* Allocate and initialize the addrobj based on the address type.
*/
if (strcmp(atype, "static") == 0) {
- if (static_arg == NULL || auto_opt || dhcp_opt) {
+ if (static_arg == NULL || auto_opt || dhcp_opt
+ || reqhost != NULL || primary_opt) {
die("Invalid arguments for type %s\nusage: %s",
atype, use);
}
process_static_addrargs(use, static_arg, argv[optind]);
} else if (strcmp(atype, "dhcp") == 0) {
@@ -1343,17 +1356,31 @@
if (status != IPADM_SUCCESS) {
die("Error in setting wait time: %s",
ipadm_status2str(status));
}
}
+ if (primary_opt) {
+ status = ipadm_set_primary(ipaddr, _B_TRUE);
+ if (status != IPADM_SUCCESS) {
+ die("Error in setting primary flag: %s",
+ ipadm_status2str(status));
+ }
+ }
+ if (reqhost != NULL) {
+ status = ipadm_set_reqhost(ipaddr, reqhost);
+ if (status != IPADM_SUCCESS) {
+ die("Error in setting reqhost: %s",
+ ipadm_status2str(status));
+ }
+ }
} else if (strcmp(atype, "addrconf") == 0) {
- if (dhcp_opt || s_opt) {
+ if (dhcp_opt || s_opt || reqhost != NULL || primary_opt) {
die("Invalid arguments for type %s\nusage: %s",
atype, use);
}
- /* Initialize the addrobj for dhcp addresses. */
+ /* Initialize the addrobj for ipv6-addrconf addresses. */
status = ipadm_create_addrobj(IPADM_ADDR_IPV6_ADDRCONF,
argv[optind], &ipaddr);
if (status != IPADM_SUCCESS) {
die("Error in creating address object: %s",
ipadm_status2str(status));