xref: /onnv-gate/usr/src/cmd/cmd-inet/usr.lib/in.dhcpd/dhcpd.h (revision 12864:78ceb0079fba)
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 */
228