1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 /*
  22  * Copyright (c) 1993, 2010, Oracle and/or its affiliates. All rights reserved.
  23  */
  24 
  25 #ifndef _DHCPD_H
  26 #define _DHCPD_H
  27 
  28 #ifdef  __cplusplus
  29 extern "C" {
  30 #endif
  31 
  32 /*
  33  * dhcpd.h -- common header file for all the modules of the in.dhcpd program.
  34  */
  35 
  36 #include <dhcp_svc_confopt.h>
  37 #include <dhcp_svc_private.h>
  38 #include <dhcp_svc_public.h>
  39 #include <dhcp_impl.h>
  40 #include <dhcp_symbol.h>
  41 #include <libinetutil.h>
  42 #include "hash.h"
  43 #include "per_dnet.h"
  44 
  45 /*
  46  * Raw encoded packet data. The final state. Note that 'code' not only
  47  * describes options: predefined: 1-60, site: 128-254, vendor: 42(*),
  48  * but it also defines packet fields for packet data as well.
  49  * Note that due to overlap of codes between various DSYM categories,
  50  * category must be used to distinguish (see libdhcputil).
  51  */
  52 typedef struct encoded {
  53         uchar_t         category; /* Option category */
  54         ushort_t        code;   /* Option code: 1--254, pkt loc */
  55         uchar_t         len;    /* len of data */
  56         uchar_t         *data;  /* Encoded DHCP packet field / option */
  57         struct encoded  *prev;  /* previous in list */
  58         struct encoded  *next;  /* next in list */
  59 } ENCODE;
  60 
  61 typedef struct {
  62         char    class[DSYM_CLASS_SIZE + 1];     /* client class */
  63         ENCODE  *head;                          /* options of this class */
  64 } VNDLIST;
  65 
  66 typedef struct {
  67         char    nm[DN_MAX_CID_LEN + 1];         /* Macro name */
  68         ENCODE  *head;                          /* head of encoded opts */
  69         int     classes;                        /* num of client classes */
  70         VNDLIST **list;                         /* table of client classes */
  71 } MACRO;
  72 
  73 /* logging message categories */
  74 typedef enum {
  75         L_ASSIGN =      0,      /* New assignment */
  76         L_REPLY =       1,      /* respond to existing client */
  77         L_RELEASE =     2,      /* client released IP */
  78         L_DECLINE =     3,      /* client declined IP */
  79         L_INFORM =      4,      /* client requested information only */
  80         L_NAK =         5,      /* client NAK'ed */
  81         L_ICMP_ECHO =   6,      /* Server detected IP in use */
  82         L_RELAY_REQ =   7,      /* Relay request to server(s) */
  83         L_RELAY_REP =   8       /* Relay reply to client */
  84 } DHCP_MSG_CATEGORIES;
  85 
  86 typedef enum {
  87         P_BOOTP =       0,      /* BOOT Protocol */
  88         P_DHCP =        1       /* DHC Protocol */
  89 } DHCP_PROTO;
  90 
  91 #define DHCPD                   "in.dhcpd"      /* daemon's name */
  92 #define DAEMON_VERS             "3.5"           /* daemon's version number */
  93 #define ENC_COPY                0               /* Copy encode list */
  94 #define ENC_DONT_COPY           1               /* don't copy encode list */
  95 #define DHCP_MAX_REPLY_SIZE     8192            /* should be big enough */
  96 #define DHCP_MIN_RECORDS        32              /* should be big enough */
  97 #define DHCP_ICMP_ATTEMPTS      1               /* Number of ping attempts */
  98 #define DHCP_ICMP_TIMEOUT       1000            /* Wait # millisecs for resp */
  99 #define DHCP_ARP_ADD            0               /* Add an ARP table entry */
 100 #define DHCP_ARP_DEL            1               /* Del an ARP table entry */
 101 #define DHCP_SCRATCH            128             /* scratch buffer size */
 102 #define NEW_DHCPTAB             0               /* load initial dhcptab */
 103 #define PRESERVE_DHCPTAB        1               /* preserve previous dhcptab */
 104 #define DEFAULT_LEASE           3600            /* Default if not specified */
 105 #define DHCP_RDCOP_RETRIES      3               /* Attempts to read options */
 106 #define HASHTABLESIZE           257             /* must be a prime number */
 107 #define DHCP_RESCAN_SCALE       60L             /* scale rescan_interval */
 108 
 109 #define DHCP_MIN_CLIENTS        32              /* minimum client structs */
 110 #define DHCP_DEFAULT_CLIENTS    1024            /* default client structs */
 111 #define DHCP_MINFREE_CLIENTS    8               /* minimum free clients */
 112 #define DHCP_NSS_LWP            32              /* free lwps for nss lib use */
 113 #define DHCP_NSS_TIME           3               /* name service cache time */
 114 #define DHCP_NO_NSU             (-1)            /* No Name service updates */
 115 
 116 /* load option flags */
 117 #define DHCP_DHCP_CLNT          1               /* It's a DHCP client */
 118 #define DHCP_SEND_LEASE         2               /* Send lease parameters */
 119 #define DHCP_NON_RFC1048        4               /* non-rfc1048 magic cookie */
 120 #define DHCP_OVRLD_CLR          ((uchar_t)0x00) /* SNAME/FILE clear */
 121 #define DHCP_OVRLD_FILE         ((uchar_t)0x01) /* FILE in use */
 122 #define DHCP_OVRLD_SNAME        ((uchar_t)0x02) /* SNAME in use */
 123 #define DHCP_OVRLD_ALL          ((uchar_t)0x03) /* All overload space in use */
 124 
 125 /* dhcp_lookup_dd_classify search flags */
 126 #define S_CID           0x01            /* find a client match */
 127 #define S_FREE          0x02            /* find a free record */
 128 #define S_LRU           0x04            /* find an lru record */
 129 
 130 /* DHCP client states */
 131 #define INIT_STATE              1
 132 #define INIT_REBOOT_STATE       2
 133 #define RENEW_REBIND_STATE      3
 134 
 135 extern int              debug;
 136 extern boolean_t        verbose;
 137 extern boolean_t        noping;
 138 extern boolean_t        no_dhcptab;
 139 extern boolean_t        server_mode;
 140 extern boolean_t        be_automatic;
 141 extern uchar_t          max_hops;
 142 extern int              log_local;
 143 extern int              icmp_tries;
 144 extern time_t           off_secs;
 145 extern time_t           cache_secs;
 146 extern time_t           renog_secs;
 147 extern time_t           min_lru;
 148 extern time_t           icmp_timeout;
 149 extern time_t           nsutimeout_secs;
 150 extern boolean_t        time_to_go;
 151 extern struct in_addr   server_ip;
 152 extern struct in_addr   *owner_ip;
 153 extern dsvc_datastore_t datastore;
 154 extern int              max_threads;    /* maximum number of threads per net */
 155 extern int              max_clients;    /* maximum number of clients per net */
 156 extern ushort_t         port_offset;    /* offset to port for multiple server */
 157 extern int              net_thresh;     /* secs to keep pernet reference */
 158 extern int              clnt_thresh;    /* secs to keep client reference */
 159 extern time_t           reinit_time;    /* reinitialization time */
 160 extern struct __res_state resolv_conf;
 161 #ifdef  DEBUG
 162 extern char             *dbg_net;       /* simulated debug net (see misc.c) */
 163 #endif  /* DEBUG */
 164 
 165 extern void     *reinitialize(void *);
 166 extern PKT      *gen_bootp_pkt(int, PKT *);
 167 extern int      initmtab(void);
 168 extern int      initntab(void);
 169 extern int      checktab(void);
 170 extern int      readtab(int);
 171 extern void     resettab(boolean_t);
 172 extern int      relay_agent_init(char *);
 173 extern void     dhcpmsg(int, const char *, ...);
 174 extern void     *smalloc(unsigned);
 175 extern void     *srealloc(void *, uint_t);
 176 extern struct in_addr   *match_ownerip(in_addr_t);
 177 extern void     *stack_create(unsigned int);
 178 extern ENCODE   *combine_encodes(ENCODE *, ENCODE *, int);
 179 extern void     open_macros(void);
 180 extern void     close_macros(void);
 181 extern MACRO    *get_macro(char *);
 182 extern ENCODE   *find_encode(ENCODE *, uchar_t, ushort_t);
 183 extern ENCODE   *dup_encode(ENCODE *);
 184 extern ENCODE   *make_encode(uchar_t, ushort_t, uchar_t, void *, int);
 185 extern ENCODE   *dup_encode_list(ENCODE *);
 186 extern void     free_encode_list(ENCODE *);
 187 extern void     free_encode(ENCODE *);
 188 extern void     replace_encode(ENCODE **, ENCODE *, int);
 189 extern ENCODE   *vendor_encodes(MACRO *, char *);
 190 extern char     *disp_cid(PKT_LIST *, char *, int);
 191 extern void     get_clnt_id(PKT_LIST *, uchar_t *, int, uchar_t *);
 192 extern char     *get_class_id(PKT_LIST *, char *, int);
 193 extern int      load_options(int, PKT_LIST *, PKT *, int, uchar_t *, ENCODE *,
 194                     ENCODE *);
 195 extern void     free_plp(PKT_LIST *);
 196 extern void     logtrans(DHCP_PROTO, DHCP_MSG_CATEGORIES, time_t,
 197                     struct in_addr, struct in_addr, PKT_LIST *);
 198 extern int      icmp_echo_check(struct in_addr *, boolean_t *);
 199 extern void     *monitor_client(void *);
 200 
 201 extern void     dhcp(dsvc_clnt_t *, PKT_LIST *);
 202 boolean_t       update_offer(dsvc_clnt_t *, dn_rec_list_t **, lease_t,
 203                     struct in_addr *, boolean_t);
 204 extern void     bootp(dsvc_clnt_t *, PKT_LIST *);
 205 extern void     get_netmask(struct in_addr *, struct in_addr *);
 206 extern boolean_t select_offer(dsvc_dnet_t *dbp, PKT_LIST *, dsvc_clnt_t *,
 207                     dn_rec_list_t **);
 208 
 209 extern int dhcp_open_dd(dsvc_handle_t *, dsvc_datastore_t *, dsvc_contype_t,
 210             const char *, uint_t);
 211 extern int dhcp_close_dd(dsvc_handle_t *);
 212 extern int dhcp_modify_dd_entry(dsvc_handle_t, const void *, void *);
 213 extern void dhcp_free_dd_list(dsvc_handle_t, void *);
 214 
 215 extern void *dhcp_lookup_dd_classify(dsvc_dnet_t *, boolean_t, uint_t, int,
 216             const dn_rec_t *, void **, int);
 217 
 218 extern dn_rec_list_t *detach_dnrec_from_list(dn_rec_list_t *, dn_rec_list_t *,
 219                         dn_rec_list_t **);
 220 
 221 extern int qualify_hostname(char *, const char *, const char *, int, int);
 222 
 223 #ifdef  __cplusplus
 224 }
 225 #endif
 226 
 227 #endif  /* _DHCPD_H */