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));