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 */