1dbed73cbSSangeeta Misra /*
2dbed73cbSSangeeta Misra  * CDDL HEADER START
3dbed73cbSSangeeta Misra  *
4dbed73cbSSangeeta Misra  * The contents of this file are subject to the terms of the
5dbed73cbSSangeeta Misra  * Common Development and Distribution License (the "License").
6dbed73cbSSangeeta Misra  * You may not use this file except in compliance with the License.
7dbed73cbSSangeeta Misra  *
8dbed73cbSSangeeta Misra  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9dbed73cbSSangeeta Misra  * or http://www.opensolaris.org/os/licensing.
10dbed73cbSSangeeta Misra  * See the License for the specific language governing permissions
11dbed73cbSSangeeta Misra  * and limitations under the License.
12dbed73cbSSangeeta Misra  *
13dbed73cbSSangeeta Misra  * When distributing Covered Code, include this CDDL HEADER in each
14dbed73cbSSangeeta Misra  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15dbed73cbSSangeeta Misra  * If applicable, add the following below this CDDL HEADER, with the
16dbed73cbSSangeeta Misra  * fields enclosed by brackets "[]" replaced with your own identifying
17dbed73cbSSangeeta Misra  * information: Portions Copyright [yyyy] [name of copyright owner]
18dbed73cbSSangeeta Misra  *
19dbed73cbSSangeeta Misra  * CDDL HEADER END
20dbed73cbSSangeeta Misra  */
21dbed73cbSSangeeta Misra 
22dbed73cbSSangeeta Misra /*
23*5df82708SSangeeta Misra  * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
24dbed73cbSSangeeta Misra  */
25dbed73cbSSangeeta Misra #ifndef _ILBD_H
26dbed73cbSSangeeta Misra #define	_ILBD_H
27dbed73cbSSangeeta Misra 
28dbed73cbSSangeeta Misra #ifdef __cplusplus
29dbed73cbSSangeeta Misra extern "C" {
30dbed73cbSSangeeta Misra #endif
31dbed73cbSSangeeta Misra 
32dbed73cbSSangeeta Misra #include <stdio.h>
33dbed73cbSSangeeta Misra #include <ucred.h>
34dbed73cbSSangeeta Misra #include <pwd.h>
35dbed73cbSSangeeta Misra #include <priv.h>
36dbed73cbSSangeeta Misra #include <stdarg.h>
37dbed73cbSSangeeta Misra #include <syslog.h>
38dbed73cbSSangeeta Misra #include <sys/list.h>
39dbed73cbSSangeeta Misra #include <libscf.h>
40dbed73cbSSangeeta Misra #include <libintl.h>
41dbed73cbSSangeeta Misra #include <locale.h>
42dbed73cbSSangeeta Misra #include <libinetutil.h>
43dbed73cbSSangeeta Misra #include <auth_list.h>
44dbed73cbSSangeeta Misra #include <bsm/adt.h>
45dbed73cbSSangeeta Misra #include <bsm/adt_event.h>
46dbed73cbSSangeeta Misra 
47dbed73cbSSangeeta Misra #define	SGNAME_SZ	80
48dbed73cbSSangeeta Misra #define	ILB_FMRI	"svc:/network/loadbalancer/ilb:default"
49dbed73cbSSangeeta Misra 
50dbed73cbSSangeeta Misra #define	HC_ACTION		ILB_SRV_DISABLED_HC
51dbed73cbSSangeeta Misra #define	ADMIN_ACTION		ILB_SRV_DISABLED_ADMIN
52dbed73cbSSangeeta Misra 
53dbed73cbSSangeeta Misra /* Max name and value length for scf properties */
54dbed73cbSSangeeta Misra #define	ILBD_MAX_NAME_LEN	ilbd_scf_limit(SCF_LIMIT_MAX_NAME_LENGTH)
55dbed73cbSSangeeta Misra #define	ILBD_MAX_VALUE_LEN	ilbd_scf_limit(SCF_LIMIT_MAX_VALUE_LENGTH)
56dbed73cbSSangeeta Misra 
57dbed73cbSSangeeta Misra /* Different events ILBD is interested in. */
58dbed73cbSSangeeta Misra typedef enum {
59dbed73cbSSangeeta Misra 	ILBD_EVENT_NEW_REQ,	/* New client request */
60dbed73cbSSangeeta Misra 	ILBD_EVENT_REQ,		/* Client request comes in */
61dbed73cbSSangeeta Misra 	ILBD_EVENT_REP_OK,	/* Reply channel to client is writeable */
62dbed73cbSSangeeta Misra 	ILBD_EVENT_PROBE,	/* A HC returns some result */
63dbed73cbSSangeeta Misra 	ILBD_EVENT_TIMER	/* ilbd_timer_q fired */
64dbed73cbSSangeeta Misra } ilbd_event_t;
65dbed73cbSSangeeta Misra 
66dbed73cbSSangeeta Misra typedef enum {
67dbed73cbSSangeeta Misra 	ILBD_SCF_RULE,	/* prop group for rules */
68dbed73cbSSangeeta Misra 	ILBD_SCF_SG,	/* prop group for servergroups */
69dbed73cbSSangeeta Misra 	ILBD_SCF_HC	/* prop group for healthchecks */
70dbed73cbSSangeeta Misra } ilbd_scf_pg_type_t;
71dbed73cbSSangeeta Misra 
72dbed73cbSSangeeta Misra typedef enum {
73dbed73cbSSangeeta Misra 	ILBD_SCF_CREATE,
74dbed73cbSSangeeta Misra 	ILBD_SCF_DESTROY,
75dbed73cbSSangeeta Misra 	ILBD_SCF_ENABLE_DISABLE
76dbed73cbSSangeeta Misra } ilbd_scf_cmd_t;
77dbed73cbSSangeeta Misra 
78dbed73cbSSangeeta Misra typedef enum {
79dbed73cbSSangeeta Misra 	ILBD_STRING,	/* string */
80dbed73cbSSangeeta Misra 	ILBD_INT,	/* int */
81dbed73cbSSangeeta Misra 	ILBD_ADDR_V4,	/* ipv4 addr */
82dbed73cbSSangeeta Misra 	ILBD_ADDR_V6	/* ipv6 addr */
83dbed73cbSSangeeta Misra } ilbd_scf_data_type_t;
84dbed73cbSSangeeta Misra 
85dbed73cbSSangeeta Misra typedef enum {
86dbed73cbSSangeeta Misra 	stat_enable_server,
87dbed73cbSSangeeta Misra 	stat_disable_server,
88dbed73cbSSangeeta Misra 	stat_declare_srv_dead,
89dbed73cbSSangeeta Misra 	stat_declare_srv_alive
90dbed73cbSSangeeta Misra } ilbd_srv_status_ind_t;
91dbed73cbSSangeeta Misra 
92dbed73cbSSangeeta Misra /*
93dbed73cbSSangeeta Misra  * All user struct pointer passed to port_associate() should have the first
94dbed73cbSSangeeta Misra  * field as ilbd_event_t.  The following struct can be used to find the
95dbed73cbSSangeeta Misra  * event.
96dbed73cbSSangeeta Misra  */
97dbed73cbSSangeeta Misra typedef struct {
98dbed73cbSSangeeta Misra 	ilbd_event_t	ev;
99dbed73cbSSangeeta Misra } ilbd_event_obj_t;
100dbed73cbSSangeeta Misra 
101dbed73cbSSangeeta Misra typedef struct {
102dbed73cbSSangeeta Misra 	ilbd_event_t	ev;
103dbed73cbSSangeeta Misra 	timer_t		timerid;
104dbed73cbSSangeeta Misra } ilbd_timer_event_obj_t;
105dbed73cbSSangeeta Misra 
106dbed73cbSSangeeta Misra typedef struct ilbd_srv {
107dbed73cbSSangeeta Misra 	list_node_t	isv_srv_link;
108dbed73cbSSangeeta Misra 	ilb_sg_srv_t	isv_srv;
109dbed73cbSSangeeta Misra #define	isv_addr	isv_srv.sgs_addr
110dbed73cbSSangeeta Misra #define	isv_minport	isv_srv.sgs_minport
111dbed73cbSSangeeta Misra #define	isv_maxport	isv_srv.sgs_maxport
112dbed73cbSSangeeta Misra #define	isv_flags	isv_srv.sgs_flags
113dbed73cbSSangeeta Misra #define	isv_id		isv_srv.sgs_id
114dbed73cbSSangeeta Misra #define	isv_srvID	isv_srv.sgs_srvID
115dbed73cbSSangeeta Misra } ilbd_srv_t;
116dbed73cbSSangeeta Misra 
117dbed73cbSSangeeta Misra #define	MAX_SRVCOUNT	1000
118dbed73cbSSangeeta Misra #define	MAX_SRVID	(MAX_SRVCOUNT - 1)
119dbed73cbSSangeeta Misra #define	BAD_SRVID	(-1)
120dbed73cbSSangeeta Misra 
121dbed73cbSSangeeta Misra typedef struct ilbd_sg {
122dbed73cbSSangeeta Misra 	list_t		isg_srvlist;	/* list of ilbd_srv_t */
123dbed73cbSSangeeta Misra 	char		isg_name[ILB_SGNAME_SZ];
124dbed73cbSSangeeta Misra 	int32_t		isg_srvcount;
125dbed73cbSSangeeta Misra 	int32_t		isg_max_id;
126dbed73cbSSangeeta Misra 	list_t		isg_rulelist;	/* list of ilbd_rule_t */
127dbed73cbSSangeeta Misra 	char		isg_id_arr[MAX_SRVCOUNT]; /* for server ID allocation */
128dbed73cbSSangeeta Misra 
129dbed73cbSSangeeta Misra 	list_node_t	isg_link;	/* linkage for sg list */
130dbed73cbSSangeeta Misra } ilbd_sg_t;
131dbed73cbSSangeeta Misra 
132dbed73cbSSangeeta Misra typedef struct ilbd_rule {
133dbed73cbSSangeeta Misra 	list_node_t		irl_link;
134dbed73cbSSangeeta Misra 	list_node_t		irl_sglink;
135dbed73cbSSangeeta Misra 	ilbd_sg_t		*irl_sg;
136dbed73cbSSangeeta Misra 	ilb_rule_info_t		irl_info;
137dbed73cbSSangeeta Misra #define	irl_flags	irl_info.rl_flags
138dbed73cbSSangeeta Misra #define	irl_name	irl_info.rl_name
139dbed73cbSSangeeta Misra #define	irl_vip		irl_info.rl_vip
140dbed73cbSSangeeta Misra #define	irl_proto	irl_info.rl_proto
141dbed73cbSSangeeta Misra #define	irl_ipversion	irl_info.rl_ipversion
142dbed73cbSSangeeta Misra #define	irl_minport	irl_info.rl_minport
143dbed73cbSSangeeta Misra #define	irl_maxport	irl_info.rl_maxport
144dbed73cbSSangeeta Misra #define	irl_algo	irl_info.rl_algo
145dbed73cbSSangeeta Misra #define	irl_topo	irl_info.rl_topo
146dbed73cbSSangeeta Misra #define	irl_nat_src_start	irl_info.rl_nat_src_start
147dbed73cbSSangeeta Misra #define	irl_nat_src_end	irl_info.rl_nat_src_end
148dbed73cbSSangeeta Misra #define	irl_stickymask	irl_info.rl_stickymask
149dbed73cbSSangeeta Misra #define	irl_conndrain	irl_info.rl_conndrain
150dbed73cbSSangeeta Misra #define	irl_nat_timeout	irl_info.rl_nat_timeout
151dbed73cbSSangeeta Misra #define	irl_sticky_timeout	irl_info.rl_sticky_timeout
152dbed73cbSSangeeta Misra #define	irl_hcport	irl_info.rl_hcport
153dbed73cbSSangeeta Misra #define	irl_hcpflag	irl_info.rl_hcpflag
154dbed73cbSSangeeta Misra #define	irl_sgname	irl_info.rl_sgname
155dbed73cbSSangeeta Misra #define	irl_hcname	irl_info.rl_hcname
156dbed73cbSSangeeta Misra } ilbd_rule_t;
157dbed73cbSSangeeta Misra 
158dbed73cbSSangeeta Misra /*
159dbed73cbSSangeeta Misra  * Health check related definitions
160dbed73cbSSangeeta Misra  */
161dbed73cbSSangeeta Misra 
162dbed73cbSSangeeta Misra /* Default health check probe program provided */
163dbed73cbSSangeeta Misra #define	ILB_PROBE_PROTO	"/usr/lib/inet/ilb/ilb_probe"
164dbed73cbSSangeeta Misra 
165dbed73cbSSangeeta Misra /* Command name (argv[0]) passed to ilb_probe to indicate a ping test */
166dbed73cbSSangeeta Misra #define	ILB_PROBE_PING	"ilb_ping"
167dbed73cbSSangeeta Misra 
168dbed73cbSSangeeta Misra /* Use the first character of the rule's hcname to decide if rule has HC. */
169dbed73cbSSangeeta Misra #define	RULE_HAS_HC(irl)	((irl)->irl_info.rl_hcname[0] != '\0')
170dbed73cbSSangeeta Misra 
171dbed73cbSSangeeta Misra /* Type of probe test */
172dbed73cbSSangeeta Misra typedef enum {
173dbed73cbSSangeeta Misra 	ILBD_HC_PING = 1,	/* ICMP Echo probe */
174dbed73cbSSangeeta Misra 	ILBD_HC_TCP,		/* TCP connect probe */
175dbed73cbSSangeeta Misra 	ILBD_HC_UDP,		/* UDP packet probe */
176dbed73cbSSangeeta Misra 	ILBD_HC_USER		/* User supplied probe */
177dbed73cbSSangeeta Misra } ilbd_hc_test_t;
178dbed73cbSSangeeta Misra 
179dbed73cbSSangeeta Misra /* Struct representing a hc object in ilbd */
180dbed73cbSSangeeta Misra typedef struct {
181dbed73cbSSangeeta Misra 	list_node_t	ihc_link;	/* List linkage */
182dbed73cbSSangeeta Misra 
183dbed73cbSSangeeta Misra 	ilb_hc_info_t	ihc_info;
184dbed73cbSSangeeta Misra /* Short hand for the fields inside ilb_hc_info_t */
185dbed73cbSSangeeta Misra #define	ihc_name	ihc_info.hci_name
186dbed73cbSSangeeta Misra #define	ihc_test	ihc_info.hci_test
187dbed73cbSSangeeta Misra #define	ihc_timeout	ihc_info.hci_timeout
188dbed73cbSSangeeta Misra #define	ihc_count	ihc_info.hci_count
189dbed73cbSSangeeta Misra #define	ihc_interval	ihc_info.hci_interval
190dbed73cbSSangeeta Misra #define	ihc_def_ping	ihc_info.hci_def_ping
191dbed73cbSSangeeta Misra 
192dbed73cbSSangeeta Misra 	ilbd_hc_test_t	ihc_test_type;	/* Type of probe test */
193dbed73cbSSangeeta Misra 	int		ihc_rule_cnt;	/* Num of rules associated with hc */
194dbed73cbSSangeeta Misra 	list_t		ihc_rules;	/* Rules associated with this hc */
195dbed73cbSSangeeta Misra } ilbd_hc_t;
196dbed73cbSSangeeta Misra 
197dbed73cbSSangeeta Misra struct ilbd_hc_srv_s;
198dbed73cbSSangeeta Misra 
199dbed73cbSSangeeta Misra /*
200dbed73cbSSangeeta Misra  * Struct representing a hc rule object
201dbed73cbSSangeeta Misra  *
202dbed73cbSSangeeta Misra  * hcr_link: list linkage
203dbed73cbSSangeeta Misra  * hcr_rule: pointer to the ilbd rule object
204dbed73cbSSangeeta Misra  * hcr_servers: list of servers of this rule
205dbed73cbSSangeeta Misra  */
206dbed73cbSSangeeta Misra typedef struct {
207dbed73cbSSangeeta Misra 	list_node_t		hcr_link;
208dbed73cbSSangeeta Misra 	ilbd_rule_t const 	*hcr_rule;
209dbed73cbSSangeeta Misra 	list_t			hcr_servers;
210dbed73cbSSangeeta Misra } ilbd_hc_rule_t;
211dbed73cbSSangeeta Misra 
212dbed73cbSSangeeta Misra struct ilbd_hc_srv_s;
213dbed73cbSSangeeta Misra 
214dbed73cbSSangeeta Misra /*
215dbed73cbSSangeeta Misra  * Struct representing a event of the probe process
216dbed73cbSSangeeta Misra  *
217dbed73cbSSangeeta Misra  * ihp_ev: the event type, which is ILBD_EVENT_PROBE
218dbed73cbSSangeeta Misra  * ihp_srv: pointer to the hc server object
219dbed73cbSSangeeta Misra  * ihp_pid: pid of the probe process
220dbed73cbSSangeeta Misra  * ihp_done: is ilbd done reading the output of the probe process
221dbed73cbSSangeeta Misra  */
222dbed73cbSSangeeta Misra typedef struct {
223dbed73cbSSangeeta Misra 	ilbd_event_t		ihp_ev;
224dbed73cbSSangeeta Misra 	struct ilbd_hc_srv_s	*ihp_srv;
225dbed73cbSSangeeta Misra 	pid_t			ihp_pid;
226dbed73cbSSangeeta Misra 	boolean_t		ihp_done;
227dbed73cbSSangeeta Misra } ilbd_hc_probe_event_t;
228dbed73cbSSangeeta Misra 
229dbed73cbSSangeeta Misra /*
230dbed73cbSSangeeta Misra  * ilbd_hc_srv_t state
231dbed73cbSSangeeta Misra  *
232dbed73cbSSangeeta Misra  * ihd_hc_def_pinging: the default ping should be run
233dbed73cbSSangeeta Misra  * ihd-hc_probing: the probe process should be started
234dbed73cbSSangeeta Misra  */
235dbed73cbSSangeeta Misra enum ilbd_hc_state {
236dbed73cbSSangeeta Misra 	ilbd_hc_def_pinging,
237dbed73cbSSangeeta Misra 	ilbd_hc_probing
238dbed73cbSSangeeta Misra };
239dbed73cbSSangeeta Misra 
240dbed73cbSSangeeta Misra /*
241dbed73cbSSangeeta Misra  * Struct representing a server associated with a hc object
242dbed73cbSSangeeta Misra  *
243dbed73cbSSangeeta Misra  * shc_srv_link: list linkage
244dbed73cbSSangeeta Misra  * shc_hc: pointer to the hc object
245dbed73cbSSangeeta Misra  * shc_hc_rule: pointer to the hc rule object
246dbed73cbSSangeeta Misra  * shc_sg_srv: pointer to the server group object
247dbed73cbSSangeeta Misra  * shc_tid: timeout ID
248dbed73cbSSangeeta Misra  * shc_cur_cnt: number of times the hc probe has been run
249dbed73cbSSangeeta Misra  * shc_fail_cnt: number of consecutive probe failure
250dbed73cbSSangeeta Misra  * shc_status: health status
251dbed73cbSSangeeta Misra  * shc_rtt: rtt (in micro sec) to the backend server
252dbed73cbSSangeeta Misra  * shc_lasttimer: last time a probe sequence is executed
253dbed73cbSSangeeta Misra  * shc_nexttime: next time a probe sequence is executed
254dbed73cbSSangeeta Misra  * shc_state: hc probe state
255dbed73cbSSangeeta Misra  * shc_child_pid: pid of the probe process
256dbed73cbSSangeeta Misra  * shc_child_fd: fd to the output of the probe process
257dbed73cbSSangeeta Misra  * shc_ev: event object of the probe process
258dbed73cbSSangeeta Misra  * shc_ev_port: event port of the event object
259dbed73cbSSangeeta Misra  */
260dbed73cbSSangeeta Misra typedef struct ilbd_hc_srv_s {
261dbed73cbSSangeeta Misra 	list_node_t		shc_srv_link;
262dbed73cbSSangeeta Misra 	ilbd_hc_t		*shc_hc;
263dbed73cbSSangeeta Misra 	ilbd_hc_rule_t		*shc_hc_rule;
264dbed73cbSSangeeta Misra 	ilb_sg_srv_t const	*shc_sg_srv;
265dbed73cbSSangeeta Misra 
266dbed73cbSSangeeta Misra 	iu_timer_id_t		shc_tid;
267dbed73cbSSangeeta Misra 	uint_t			shc_cur_cnt;
268dbed73cbSSangeeta Misra 	uint_t			shc_fail_cnt;
269dbed73cbSSangeeta Misra 	ilb_hc_srv_status_t	shc_status;
270dbed73cbSSangeeta Misra 	uint32_t		shc_rtt;
271dbed73cbSSangeeta Misra 	time_t			shc_lasttime;
272dbed73cbSSangeeta Misra 	time_t			shc_nexttime;
273dbed73cbSSangeeta Misra 
274dbed73cbSSangeeta Misra 	enum ilbd_hc_state	shc_state;
275dbed73cbSSangeeta Misra 	pid_t			shc_child_pid;
276dbed73cbSSangeeta Misra 	int			shc_child_fd;
277dbed73cbSSangeeta Misra 	ilbd_hc_probe_event_t	*shc_ev;
278dbed73cbSSangeeta Misra 	int			shc_ev_port;
279dbed73cbSSangeeta Misra } ilbd_hc_srv_t;
280dbed73cbSSangeeta Misra 
281dbed73cbSSangeeta Misra /*
282dbed73cbSSangeeta Misra  * Structure for holding audit server and servergroup event
283dbed73cbSSangeeta Misra  * data. Not all events use all members of the structure.
284dbed73cbSSangeeta Misra  */
285dbed73cbSSangeeta Misra typedef struct audit_sg_event_data {
286*5df82708SSangeeta Misra 	int32_t	ed_ipaddr_type;	/* ADT_IPv4 or ADT_IPv6 */
287*5df82708SSangeeta Misra 	uint32_t ed_server_address[4];  /* server's IP address */
288dbed73cbSSangeeta Misra 	char	*ed_serverid;   /* serverid. */
289dbed73cbSSangeeta Misra 	uint16_t	ed_minport;	/* server's minport */
290dbed73cbSSangeeta Misra 	uint16_t	ed_maxport;	/* server's maxport */
291dbed73cbSSangeeta Misra 	char		*ed_sgroup;	/* servergroup */
292dbed73cbSSangeeta Misra } audit_sg_event_data_t;
293dbed73cbSSangeeta Misra 
294dbed73cbSSangeeta Misra /* Struct to store client info */
295dbed73cbSSangeeta Misra typedef struct {
296dbed73cbSSangeeta Misra 	ilbd_event_t	cli_ev;
297dbed73cbSSangeeta Misra 	int	cli_sd;
298dbed73cbSSangeeta Misra 	struct passwd	cli_pw;
299dbed73cbSSangeeta Misra 	size_t		cli_pw_bufsz;
300dbed73cbSSangeeta Misra 	char		*cli_pw_buf;
301dbed73cbSSangeeta Misra 	ilbd_cmd_t	cli_cmd;
302dbed73cbSSangeeta Misra 	ilb_comm_t	*cli_saved_reply;
303dbed73cbSSangeeta Misra 	size_t		cli_saved_size;
304dbed73cbSSangeeta Misra 	ucred_t		*cli_peer_ucredp; /* needed for auditing */
305dbed73cbSSangeeta Misra } ilbd_client_t;
306dbed73cbSSangeeta Misra 
307dbed73cbSSangeeta Misra void		ilbd_reply_ok(uint32_t *, size_t *);
308dbed73cbSSangeeta Misra void		ilbd_reply_err(uint32_t *, size_t *, ilb_status_t);
309dbed73cbSSangeeta Misra 
310dbed73cbSSangeeta Misra ilb_status_t	ilbd_check_client_config_auth(const struct passwd *);
311dbed73cbSSangeeta Misra ilb_status_t	ilbd_check_client_enable_auth(const struct passwd *);
312dbed73cbSSangeeta Misra ilb_status_t	ilbd_retrieve_names(ilbd_cmd_t, uint32_t *, size_t *);
313dbed73cbSSangeeta Misra void		i_setup_sg_hlist(void);
314dbed73cbSSangeeta Misra void		i_setup_rule_hlist(void);
315dbed73cbSSangeeta Misra void		logperror(const char *);
316dbed73cbSSangeeta Misra ilb_status_t	ilbd_add_server_to_group(ilb_sg_info_t *, int,
317dbed73cbSSangeeta Misra 	const struct passwd *, ucred_t *);
318dbed73cbSSangeeta Misra ilb_status_t	ilbd_rem_server_from_group(ilb_sg_info_t *, int,
319dbed73cbSSangeeta Misra 	const struct passwd *, ucred_t *);
320dbed73cbSSangeeta Misra ilb_status_t	ilbd_create_sg(ilb_sg_info_t *, int,
321dbed73cbSSangeeta Misra 	const struct passwd *, ucred_t *);
322dbed73cbSSangeeta Misra 
323dbed73cbSSangeeta Misra ilb_status_t	ilbd_destroy_sg(const char *, const struct passwd *,
324dbed73cbSSangeeta Misra 		ucred_t *);
325dbed73cbSSangeeta Misra ilb_status_t	ilbd_retrieve_sg_hosts(const char *, uint32_t *, size_t *);
326dbed73cbSSangeeta Misra 
327dbed73cbSSangeeta Misra ilb_status_t	ilbd_enable_server(ilb_sg_info_t *, const struct passwd *,
328dbed73cbSSangeeta Misra 		ucred_t *);
329dbed73cbSSangeeta Misra ilb_status_t	ilbd_disable_server(ilb_sg_info_t *, const struct passwd *,
330dbed73cbSSangeeta Misra 		ucred_t *);
331dbed73cbSSangeeta Misra ilb_status_t	ilbd_k_Xable_server(const struct in6_addr *, const char *,
332dbed73cbSSangeeta Misra 		    ilbd_srv_status_ind_t);
333dbed73cbSSangeeta Misra 
334dbed73cbSSangeeta Misra ilb_status_t	i_add_srv2krules(list_t *, ilb_sg_srv_t *, int);
335dbed73cbSSangeeta Misra ilb_status_t	i_rem_srv_frm_krules(list_t *, ilb_sg_srv_t *, int);
336dbed73cbSSangeeta Misra int		ilbd_get_num_krules(void);
337dbed73cbSSangeeta Misra ilb_status_t	ilbd_get_krule_names(ilbd_namelist_t **, int);
338dbed73cbSSangeeta Misra ilb_status_t	ilb_get_krule_servers(ilb_sg_info_t *);
339dbed73cbSSangeeta Misra ilbd_sg_t	*i_find_sg_byname(const char *);
340dbed73cbSSangeeta Misra ilb_status_t	i_check_srv2rules(list_t *, ilb_sg_srv_t *);
341dbed73cbSSangeeta Misra 
342dbed73cbSSangeeta Misra ilb_status_t	ilbd_address_to_srvID(ilb_sg_info_t *, uint32_t *, size_t *);
343dbed73cbSSangeeta Misra ilb_status_t	ilbd_srvID_to_address(ilb_sg_info_t *, uint32_t *, size_t *);
344dbed73cbSSangeeta Misra 
345dbed73cbSSangeeta Misra ilb_status_t	do_ioctl(void *, ssize_t);
346dbed73cbSSangeeta Misra 
347dbed73cbSSangeeta Misra ilb_status_t	ilbd_create_rule(ilb_rule_info_t *, int, const struct passwd *,
348dbed73cbSSangeeta Misra 		ucred_t *);
349dbed73cbSSangeeta Misra ilb_status_t	ilbd_retrieve_rule(ilbd_name_t, uint32_t *, size_t *);
350dbed73cbSSangeeta Misra 
351dbed73cbSSangeeta Misra ilb_status_t	ilbd_destroy_rule(ilbd_name_t, const struct passwd *,
352dbed73cbSSangeeta Misra 		ucred_t *);
353dbed73cbSSangeeta Misra ilb_status_t	ilbd_enable_rule(ilbd_name_t, const struct passwd *, ucred_t *);
354dbed73cbSSangeeta Misra ilb_status_t	ilbd_disable_rule(ilbd_name_t, const struct passwd *,
355dbed73cbSSangeeta Misra 		ucred_t *);
356dbed73cbSSangeeta Misra 
357dbed73cbSSangeeta Misra boolean_t	is_debugging_on(void);
358dbed73cbSSangeeta Misra ilb_status_t	ilbd_sg_check_rule_port(ilbd_sg_t *, ilb_rule_info_t *);
359dbed73cbSSangeeta Misra 
360dbed73cbSSangeeta Misra void		ilbd_enable_debug(void);
361dbed73cbSSangeeta Misra ilb_status_t	ilb_map_errno2ilbstat(int);
362dbed73cbSSangeeta Misra 
363dbed73cbSSangeeta Misra ilb_status_t	i_attach_rule2sg(ilbd_sg_t *, ilbd_rule_t *);
364dbed73cbSSangeeta Misra 
365dbed73cbSSangeeta Misra /* Logging routine and macros */
366dbed73cbSSangeeta Misra void		ilbd_log(int, const char *, ...);
367dbed73cbSSangeeta Misra #define	logerr(...)	ilbd_log(LOG_ERR, __VA_ARGS__)
368dbed73cbSSangeeta Misra #define	logdebug(...)	ilbd_log(LOG_DEBUG, __VA_ARGS__)
369dbed73cbSSangeeta Misra 
370dbed73cbSSangeeta Misra /* Health check manipulation routines */
371dbed73cbSSangeeta Misra void		i_ilbd_setup_hc_list(void);
372dbed73cbSSangeeta Misra ilb_status_t	ilbd_create_hc(const ilb_hc_info_t *, int,
373dbed73cbSSangeeta Misra 		    const struct passwd *, ucred_t *);
374dbed73cbSSangeeta Misra ilb_status_t	ilbd_destroy_hc(const char *, const struct passwd *, ucred_t *);
375dbed73cbSSangeeta Misra ilbd_hc_t	*ilbd_get_hc(const char *);
376dbed73cbSSangeeta Misra ilb_status_t	ilbd_get_hc_info(const char *, uint32_t *, size_t *);
377dbed73cbSSangeeta Misra ilb_status_t	ilbd_get_hc_srvs(const char *, uint32_t *, size_t *);
378dbed73cbSSangeeta Misra ilb_status_t	ilbd_hc_associate_rule(const ilbd_rule_t *, int);
379dbed73cbSSangeeta Misra ilb_status_t	ilbd_hc_dissociate_rule(const ilbd_rule_t *);
380dbed73cbSSangeeta Misra ilb_status_t	ilbd_hc_add_server(const ilbd_rule_t *, const ilb_sg_srv_t *,
381dbed73cbSSangeeta Misra 		    int);
382dbed73cbSSangeeta Misra ilb_status_t	ilbd_hc_del_server(const ilbd_rule_t *, const ilb_sg_srv_t *);
383dbed73cbSSangeeta Misra ilb_status_t	ilbd_hc_enable_rule(const ilbd_rule_t *);
384dbed73cbSSangeeta Misra ilb_status_t	ilbd_hc_disable_rule(const ilbd_rule_t *);
385dbed73cbSSangeeta Misra ilb_status_t	ilbd_hc_enable_server(const ilbd_rule_t *,
386dbed73cbSSangeeta Misra 		    const ilb_sg_srv_t *);
387dbed73cbSSangeeta Misra ilb_status_t	ilbd_hc_disable_server(const ilbd_rule_t *,
388dbed73cbSSangeeta Misra 		    const ilb_sg_srv_t *);
389dbed73cbSSangeeta Misra 
390dbed73cbSSangeeta Misra /* Health check timer routines */
391dbed73cbSSangeeta Misra void		ilbd_hc_probe_return(int, int, int, ilbd_hc_probe_event_t *);
392dbed73cbSSangeeta Misra void		ilbd_hc_timer_init(int, ilbd_timer_event_obj_t *);
393dbed73cbSSangeeta Misra void		ilbd_hc_timeout(void);
394dbed73cbSSangeeta Misra void		ilbd_hc_timer_update(ilbd_timer_event_obj_t *);
395dbed73cbSSangeeta Misra 
396dbed73cbSSangeeta Misra /* Show NAT info routines */
397dbed73cbSSangeeta Misra ilb_status_t	ilbd_show_nat(void *, const ilb_comm_t *, uint32_t *,
398dbed73cbSSangeeta Misra 		    size_t *);
399dbed73cbSSangeeta Misra void		ilbd_show_nat_cleanup(void);
400dbed73cbSSangeeta Misra 
401dbed73cbSSangeeta Misra 
402dbed73cbSSangeeta Misra /* Show sticky info routines */
403dbed73cbSSangeeta Misra ilb_status_t	ilbd_show_sticky(void *, const ilb_comm_t *, uint32_t *,
404dbed73cbSSangeeta Misra 		    size_t *);
405dbed73cbSSangeeta Misra void		ilbd_show_sticky_cleanup(void);
406dbed73cbSSangeeta Misra 
407dbed73cbSSangeeta Misra ilb_status_t	ilbd_create_pg(ilbd_scf_pg_type_t, void *);
408dbed73cbSSangeeta Misra ilb_status_t	ilbd_destroy_pg(ilbd_scf_pg_type_t, const char *);
409dbed73cbSSangeeta Misra ilb_status_t	ilbd_change_prop(ilbd_scf_pg_type_t, const char *,
410dbed73cbSSangeeta Misra 		    const char *, void *);
411dbed73cbSSangeeta Misra void		ilbd_scf_str_to_ip(int, char *, struct in6_addr *);
412dbed73cbSSangeeta Misra ilb_status_t	ilbd_scf_ip_to_str(uint16_t, struct in6_addr *, scf_type_t *,
413dbed73cbSSangeeta Misra 		    char *);
414dbed73cbSSangeeta Misra ilb_status_t	ilbd_scf_add_srv(ilbd_sg_t *, ilbd_srv_t *);
415dbed73cbSSangeeta Misra ilb_status_t	ilbd_scf_del_srv(ilbd_sg_t *, ilbd_srv_t *);
416dbed73cbSSangeeta Misra int		ilbd_scf_limit(int);
417dbed73cbSSangeeta Misra 
418dbed73cbSSangeeta Misra ilb_status_t	ilbd_walk_rule_pgs(ilb_status_t (*)(ilb_rule_info_t *, int,
419dbed73cbSSangeeta Misra 		    const struct passwd *, ucred_t *), void *, void *);
420dbed73cbSSangeeta Misra ilb_status_t	ilbd_walk_sg_pgs(ilb_status_t (*)(ilb_sg_info_t *, int,
421dbed73cbSSangeeta Misra 		    const struct passwd *, ucred_t *), void *, void *);
422dbed73cbSSangeeta Misra ilb_status_t	ilbd_walk_hc_pgs(ilb_status_t (*)(const ilb_hc_info_t *, int,
423dbed73cbSSangeeta Misra 		    const struct passwd *, ucred_t *), void *, void *);
424dbed73cbSSangeeta Misra void		ilbd_algo_to_str(ilb_algo_t, char *);
425dbed73cbSSangeeta Misra void		ilbd_topo_to_str(ilb_topo_t, char *);
426dbed73cbSSangeeta Misra void		ilbd_ip_to_str(uint16_t, struct in6_addr *, char *);
427*5df82708SSangeeta Misra void		cvt_addr(uint32_t *, int32_t, struct in6_addr);
428dbed73cbSSangeeta Misra int		ilberror2auditerror(ilb_status_t);
429dbed73cbSSangeeta Misra 
430dbed73cbSSangeeta Misra #ifdef __cplusplus
431dbed73cbSSangeeta Misra }
432dbed73cbSSangeeta Misra #endif
433dbed73cbSSangeeta Misra 
434dbed73cbSSangeeta Misra #endif /* _ILBD_H */
435