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

Split Close
Expand all
Collapse all
          --- old/usr/src/cmd/cmd-inet/sbin/dhcpagent/init_reboot.c
          +++ new/usr/src/cmd/cmd-inet/sbin/dhcpagent/init_reboot.c
↓ open down ↓ 13 lines elided ↑ open up ↑
  14   14   * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15   15   * If applicable, add the following below this CDDL HEADER, with the
  16   16   * fields enclosed by brackets "[]" replaced with your own identifying
  17   17   * information: Portions Copyright [yyyy] [name of copyright owner]
  18   18   *
  19   19   * CDDL HEADER END
  20   20   */
  21   21  /*
  22   22   * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  23   23   * Use is subject to license terms.
       24 + * Copyright (c) 2016, Chris Fraire <cfraire@me.com>.
  24   25   *
  25   26   * INIT_REBOOT state of the DHCP client state machine.
  26   27   */
  27   28  
  28   29  #include <sys/types.h>
  29   30  #include <stdio.h>
  30      -#include <limits.h>
  31   31  #include <sys/socket.h>
  32   32  #include <netinet/in.h>
  33   33  #include <netinet/dhcp.h>
  34   34  #include <netinet/udp.h>
  35   35  #include <netinet/ip_var.h>
  36   36  #include <netinet/udp_var.h>
  37   37  #include <dhcpmsg.h>
  38   38  #include <string.h>
  39   39  
  40   40  #include "agent.h"
↓ open down ↓ 10 lines elided ↑ open up ↑
  51   51   *                        machine.
  52   52   *
  53   53   *   input: dhcp_smach_t *: the state machine to examine for reuse
  54   54   *  output: void
  55   55   */
  56   56  
  57   57  static void
  58   58  dhcp_init_reboot_v4(dhcp_smach_t *dsmp)
  59   59  {
  60   60          dhcp_pkt_t              *dpkt;
  61      -        const char              *reqhost;
  62      -        char                    hostfile[PATH_MAX + 1];
  63   61  
  64   62          /*
  65   63           * assemble DHCPREQUEST message.  The max dhcp message size
  66   64           * option is set to the interface max, minus the size of the udp and
  67   65           * ip headers.
  68   66           */
  69   67  
  70   68          dpkt = init_pkt(dsmp, REQUEST);
  71   69          (void) add_pkt_opt32(dpkt, CD_REQUESTED_IP_ADDR,
  72   70              dsmp->dsm_ack->pkt->yiaddr.s_addr);
  73   71  
  74   72          (void) add_pkt_opt32(dpkt, CD_LEASE_TIME, htonl(DHCP_PERM));
  75   73          (void) add_pkt_opt16(dpkt, CD_MAX_DHCP_SIZE,
  76   74              htons(dsmp->dsm_lif->lif_pif->pif_max - sizeof (struct udpiphdr)));
  77   75  
  78   76          if (class_id_len != 0)
  79   77                  (void) add_pkt_opt(dpkt, CD_CLASS_ID, class_id, class_id_len);
  80   78          (void) add_pkt_prl(dpkt, dsmp);
  81   79  
  82      -        /*
  83      -         * Set CD_HOSTNAME option if REQUEST_HOSTNAME is set and a hostname
  84      -         * is found in /etc/hostname.<ifname>
  85      -         */
  86      -        if (df_get_bool(dsmp->dsm_name, dsmp->dsm_isv6, DF_REQUEST_HOSTNAME)) {
  87      -                (void) snprintf(hostfile, sizeof (hostfile), "/etc/hostname.%s",
  88      -                    dsmp->dsm_name);
       80 +        if (dhcp_add_fqdn_opt(dpkt, dsmp) != 0)
       81 +                (void) dhcp_add_hostname_opt(dpkt, dsmp);
  89   82  
  90      -                if ((reqhost = iffile_to_hostname(hostfile)) != NULL) {
  91      -                        dhcpmsg(MSG_DEBUG, "dhcp_selecting: host %s", reqhost);
  92      -                        if ((dsmp->dsm_reqhost = strdup(reqhost)) != NULL)
  93      -                                (void) add_pkt_opt(dpkt, CD_HOSTNAME,
  94      -                                    dsmp->dsm_reqhost,
  95      -                                    strlen(dsmp->dsm_reqhost));
  96      -                        else
  97      -                                dhcpmsg(MSG_WARNING, "dhcp_selecting: cannot"
  98      -                                    " allocate memory for host name option");
  99      -                } else {
 100      -                        dhcpmsg(MSG_DEBUG,
 101      -                            "dhcp_selecting: no hostname for %s",
 102      -                            dsmp->dsm_name);
 103      -                }
 104      -        }
 105      -
 106   83          (void) add_pkt_opt(dpkt, CD_END, NULL, 0);
 107   84  
 108   85          (void) send_pkt(dsmp, dpkt, htonl(INADDR_BROADCAST), stop_init_reboot);
 109   86  }
 110   87  
 111   88  
 112   89  /*
 113   90   * dhcp_init_reboot_v6(): attempts to reuse a cached configuration for a state
 114   91   *                        machine.  Create a Confirm message and multicast it
 115   92   *                        out.
↓ open down ↓ 59 lines elided ↑ open up ↑
 175  152                          if (add_pkt_subopt(dpkt, popt, DHCPV6_OPT_IAADDR,
 176  153                              (char *)&d6ia + sizeof (*d6so),
 177  154                              sizeof (d6ia) - sizeof (*d6so)) == NULL)
 178  155                                  goto failure;
 179  156                  }
 180  157          }
 181  158  
 182  159          /* Add required Option Request option */
 183  160          (void) add_pkt_prl(dpkt, dsmp);
 184  161  
      162 +        /* Add FQDN if configured */
      163 +        (void) dhcp_add_fqdn_opt(dpkt, dsmp);
      164 +
 185  165          (void) send_pkt_v6(dsmp, dpkt, ipv6_all_dhcp_relay_and_servers,
 186  166              stop_init_reboot, DHCPV6_CNF_TIMEOUT, DHCPV6_CNF_MAX_RT);
 187  167  
 188  168          return;
 189  169  
 190  170  failure:
 191  171          if (!set_start_timer(dsmp))
 192  172                  dhcp_selecting(dsmp);
 193  173  }
 194  174  
↓ open down ↓ 96 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX