1*10946SSangeeta.Misra@Sun.COM /*
2*10946SSangeeta.Misra@Sun.COM  * CDDL HEADER START
3*10946SSangeeta.Misra@Sun.COM  *
4*10946SSangeeta.Misra@Sun.COM  * The contents of this file are subject to the terms of the
5*10946SSangeeta.Misra@Sun.COM  * Common Development and Distribution License (the "License").
6*10946SSangeeta.Misra@Sun.COM  * You may not use this file except in compliance with the License.
7*10946SSangeeta.Misra@Sun.COM  *
8*10946SSangeeta.Misra@Sun.COM  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*10946SSangeeta.Misra@Sun.COM  * or http://www.opensolaris.org/os/licensing.
10*10946SSangeeta.Misra@Sun.COM  * See the License for the specific language governing permissions
11*10946SSangeeta.Misra@Sun.COM  * and limitations under the License.
12*10946SSangeeta.Misra@Sun.COM  *
13*10946SSangeeta.Misra@Sun.COM  * When distributing Covered Code, include this CDDL HEADER in each
14*10946SSangeeta.Misra@Sun.COM  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*10946SSangeeta.Misra@Sun.COM  * If applicable, add the following below this CDDL HEADER, with the
16*10946SSangeeta.Misra@Sun.COM  * fields enclosed by brackets "[]" replaced with your own identifying
17*10946SSangeeta.Misra@Sun.COM  * information: Portions Copyright [yyyy] [name of copyright owner]
18*10946SSangeeta.Misra@Sun.COM  *
19*10946SSangeeta.Misra@Sun.COM  * CDDL HEADER END
20*10946SSangeeta.Misra@Sun.COM  */
21*10946SSangeeta.Misra@Sun.COM 
22*10946SSangeeta.Misra@Sun.COM /*
23*10946SSangeeta.Misra@Sun.COM  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
24*10946SSangeeta.Misra@Sun.COM  * Use is subject to license terms.
25*10946SSangeeta.Misra@Sun.COM  */
26*10946SSangeeta.Misra@Sun.COM 
27*10946SSangeeta.Misra@Sun.COM #ifndef _LIBILB_IMPL_H
28*10946SSangeeta.Misra@Sun.COM #define	_LIBILB_IMPL_H
29*10946SSangeeta.Misra@Sun.COM 
30*10946SSangeeta.Misra@Sun.COM #ifdef __cplusplus
31*10946SSangeeta.Misra@Sun.COM extern "C" {
32*10946SSangeeta.Misra@Sun.COM #endif
33*10946SSangeeta.Misra@Sun.COM 
34*10946SSangeeta.Misra@Sun.COM #include <sys/types.h>
35*10946SSangeeta.Misra@Sun.COM #include <sys/socket.h>
36*10946SSangeeta.Misra@Sun.COM #include <sys/note.h>
37*10946SSangeeta.Misra@Sun.COM #include <netinet/in.h>
38*10946SSangeeta.Misra@Sun.COM #include <netdb.h>
39*10946SSangeeta.Misra@Sun.COM #include <net/if.h>
40*10946SSangeeta.Misra@Sun.COM #include <inet/ilb.h>
41*10946SSangeeta.Misra@Sun.COM #include <libilb.h>
42*10946SSangeeta.Misra@Sun.COM #include <thread.h>
43*10946SSangeeta.Misra@Sun.COM #include <synch.h>
44*10946SSangeeta.Misra@Sun.COM 
45*10946SSangeeta.Misra@Sun.COM #if !defined max
46*10946SSangeeta.Misra@Sun.COM #define	max(a, b)	((a) > (b) ? (a) : (b))
47*10946SSangeeta.Misra@Sun.COM #endif
48*10946SSangeeta.Misra@Sun.COM 
49*10946SSangeeta.Misra@Sun.COM /* The UNIX domain socket path to talk to ilbd. */
50*10946SSangeeta.Misra@Sun.COM #define	SOCKET_PATH	"/var/run/daemon/ilb_sock"
51*10946SSangeeta.Misra@Sun.COM 
52*10946SSangeeta.Misra@Sun.COM /* The max message size for communicating with ilbd */
53*10946SSangeeta.Misra@Sun.COM #define	ILBD_MSG_SIZE	102400
54*10946SSangeeta.Misra@Sun.COM 
55*10946SSangeeta.Misra@Sun.COM /*
56*10946SSangeeta.Misra@Sun.COM  * moral equivalent of ntohl for IPv6 addresses, MSB and LSB (64 bit each),
57*10946SSangeeta.Misra@Sun.COM  * assign to uint64_t variables
58*10946SSangeeta.Misra@Sun.COM  */
59*10946SSangeeta.Misra@Sun.COM #define	INV6_N2H_MSB64(addr)				\
60*10946SSangeeta.Misra@Sun.COM 	(((uint64_t)ntohl((addr)->_S6_un._S6_u32[0]) << 32) + 	\
61*10946SSangeeta.Misra@Sun.COM 	    (ntohl((addr)->_S6_un._S6_u32[1])))
62*10946SSangeeta.Misra@Sun.COM 
63*10946SSangeeta.Misra@Sun.COM #define	INV6_N2H_LSB64(addr)				\
64*10946SSangeeta.Misra@Sun.COM 	(((uint64_t)ntohl((addr)->_S6_un._S6_u32[2]) << 32) + 	\
65*10946SSangeeta.Misra@Sun.COM 	    (ntohl((addr)->_S6_un._S6_u32[3])))
66*10946SSangeeta.Misra@Sun.COM 
67*10946SSangeeta.Misra@Sun.COM /*
68*10946SSangeeta.Misra@Sun.COM  * moral equiv. of htonl of MSB and LSB 64-bit portions to an IPv6 address
69*10946SSangeeta.Misra@Sun.COM  */
70*10946SSangeeta.Misra@Sun.COM #define	INV6_H2N_MSB64(addr, msb)				\
71*10946SSangeeta.Misra@Sun.COM 	(addr)->_S6_un._S6_u32[0] = htonl((msb) >> 32);		\
72*10946SSangeeta.Misra@Sun.COM 	(addr)->_S6_un._S6_u32[1] = htonl((msb) & 0xffffffff)
73*10946SSangeeta.Misra@Sun.COM 
74*10946SSangeeta.Misra@Sun.COM #define	INV6_H2N_LSB64(addr, lsb)				\
75*10946SSangeeta.Misra@Sun.COM 	(addr)->_S6_un._S6_u32[2] = htonl((lsb) >> 32);		\
76*10946SSangeeta.Misra@Sun.COM 	(addr)->_S6_un._S6_u32[3] = htonl((lsb) & 0xffffffff)
77*10946SSangeeta.Misra@Sun.COM 
78*10946SSangeeta.Misra@Sun.COM #define	IP_COPY_CLI_2_IMPL(_e, _i)				\
79*10946SSangeeta.Misra@Sun.COM 	bzero(_i, sizeof (*(_i)));				\
80*10946SSangeeta.Misra@Sun.COM 	if ((_e)->ia_af == AF_INET6)  				\
81*10946SSangeeta.Misra@Sun.COM 		(void) memcpy((_i), &(_e)->ia_v6, sizeof (*(_i)));	\
82*10946SSangeeta.Misra@Sun.COM 	else							\
83*10946SSangeeta.Misra@Sun.COM 		IN6_INADDR_TO_V4MAPPED(&(_e)->ia_v4, (_i))
84*10946SSangeeta.Misra@Sun.COM 
85*10946SSangeeta.Misra@Sun.COM #define	IP_COPY_IMPL_2_CLI(_i, _e)				\
86*10946SSangeeta.Misra@Sun.COM 	do {							\
87*10946SSangeeta.Misra@Sun.COM 		bzero(_e, sizeof (*(_e)));			\
88*10946SSangeeta.Misra@Sun.COM 		if (IN6_IS_ADDR_V4MAPPED(_i)) {			\
89*10946SSangeeta.Misra@Sun.COM 			(_e)->ia_af = AF_INET;			\
90*10946SSangeeta.Misra@Sun.COM 			IN6_V4MAPPED_TO_INADDR((_i), &(_e)->ia_v4); \
91*10946SSangeeta.Misra@Sun.COM 		} else {					\
92*10946SSangeeta.Misra@Sun.COM 			(_e)->ia_af = AF_INET6;			\
93*10946SSangeeta.Misra@Sun.COM 			(void) memcpy(&(_e)->ia_v6, (_i), 	\
94*10946SSangeeta.Misra@Sun.COM 			    sizeof ((_e)->ia_v6));		\
95*10946SSangeeta.Misra@Sun.COM 		}						\
96*10946SSangeeta.Misra@Sun.COM 		_NOTE(CONSTCOND)				\
97*10946SSangeeta.Misra@Sun.COM 	} while (0)
98*10946SSangeeta.Misra@Sun.COM 
99*10946SSangeeta.Misra@Sun.COM #define	GET_AF(_a) IN6_IS_ADDR_V4MAPPED(_a)?AF_INET:AF_INET6
100*10946SSangeeta.Misra@Sun.COM #define	IS_AF_VALID(_af) (_af == AF_INET || _af == AF_INET6)
101*10946SSangeeta.Misra@Sun.COM 
102*10946SSangeeta.Misra@Sun.COM typedef enum {
103*10946SSangeeta.Misra@Sun.COM 	ILBD_BAD_CMD = 0,
104*10946SSangeeta.Misra@Sun.COM 				/* servergroup commands */
105*10946SSangeeta.Misra@Sun.COM 	ILBD_CREATE_SERVERGROUP,
106*10946SSangeeta.Misra@Sun.COM 	ILBD_ADD_SERVER_TO_GROUP,
107*10946SSangeeta.Misra@Sun.COM 	ILBD_REM_SERVER_FROM_GROUP,
108*10946SSangeeta.Misra@Sun.COM 	ILBD_ENABLE_SERVER,
109*10946SSangeeta.Misra@Sun.COM 	ILBD_DISABLE_SERVER,
110*10946SSangeeta.Misra@Sun.COM 	ILBD_DESTROY_SERVERGROUP,
111*10946SSangeeta.Misra@Sun.COM 	ILBD_RETRIEVE_SG_NAMES,		/* names of all SGs registered */
112*10946SSangeeta.Misra@Sun.COM 	ILBD_RETRIEVE_SG_HOSTS,		/* all hosts for a given SG (hndl) */
113*10946SSangeeta.Misra@Sun.COM 	ILBD_SRV_ADDR2ID,	/* fill in serverID for given address */
114*10946SSangeeta.Misra@Sun.COM 	ILBD_SRV_ID2ADDR,	/* fill in address from given serverID */
115*10946SSangeeta.Misra@Sun.COM 				/* rule commands */
116*10946SSangeeta.Misra@Sun.COM 	ILBD_CREATE_RULE,
117*10946SSangeeta.Misra@Sun.COM 	ILBD_DESTROY_RULE,
118*10946SSangeeta.Misra@Sun.COM 	ILBD_ENABLE_RULE,
119*10946SSangeeta.Misra@Sun.COM 	ILBD_DISABLE_RULE,
120*10946SSangeeta.Misra@Sun.COM 	ILBD_RETRIEVE_RULE_NAMES,
121*10946SSangeeta.Misra@Sun.COM 	ILBD_RETRIEVE_RULE,
122*10946SSangeeta.Misra@Sun.COM 
123*10946SSangeeta.Misra@Sun.COM 	ILBD_CREATE_HC,
124*10946SSangeeta.Misra@Sun.COM 	ILBD_DESTROY_HC,
125*10946SSangeeta.Misra@Sun.COM 	ILBD_GET_HC_INFO,
126*10946SSangeeta.Misra@Sun.COM 	ILBD_GET_HC_SRVS,
127*10946SSangeeta.Misra@Sun.COM 	ILBD_GET_HC_RULES,
128*10946SSangeeta.Misra@Sun.COM 	ILBD_RETRIEVE_HC_NAMES,
129*10946SSangeeta.Misra@Sun.COM 
130*10946SSangeeta.Misra@Sun.COM 	ILBD_SHOW_NAT,		/* list the NAT table */
131*10946SSangeeta.Misra@Sun.COM 	ILBD_SHOW_PERSIST,	/* list the sticky table */
132*10946SSangeeta.Misra@Sun.COM 
133*10946SSangeeta.Misra@Sun.COM 	ILBD_CMD_OK,		/* Requested operation succeeds. */
134*10946SSangeeta.Misra@Sun.COM 	ILBD_CMD_ERROR		/* Rquested operation fails. */
135*10946SSangeeta.Misra@Sun.COM } ilbd_cmd_t;
136*10946SSangeeta.Misra@Sun.COM 
137*10946SSangeeta.Misra@Sun.COM typedef struct sg_srv {
138*10946SSangeeta.Misra@Sun.COM 	int32_t		sgs_flags;	/* enabled, dis- */
139*10946SSangeeta.Misra@Sun.COM 	struct in6_addr	sgs_addr;
140*10946SSangeeta.Misra@Sun.COM 	int32_t		sgs_minport;
141*10946SSangeeta.Misra@Sun.COM 	int32_t		sgs_maxport;
142*10946SSangeeta.Misra@Sun.COM 	int32_t		sgs_id;		/* numerical part of srvID */
143*10946SSangeeta.Misra@Sun.COM 	char		sgs_srvID[ILB_NAMESZ];	/* "name" given to server */
144*10946SSangeeta.Misra@Sun.COM } ilb_sg_srv_t;
145*10946SSangeeta.Misra@Sun.COM 
146*10946SSangeeta.Misra@Sun.COM typedef struct sg_info {
147*10946SSangeeta.Misra@Sun.COM 	int32_t		sg_flags;
148*10946SSangeeta.Misra@Sun.COM 	char		sg_name[ILB_SGNAME_SZ];
149*10946SSangeeta.Misra@Sun.COM 	int32_t		sg_srvcount;
150*10946SSangeeta.Misra@Sun.COM 	ilb_sg_srv_t	sg_servers[];
151*10946SSangeeta.Misra@Sun.COM } ilb_sg_info_t;
152*10946SSangeeta.Misra@Sun.COM 
153*10946SSangeeta.Misra@Sun.COM typedef char	ilbd_name_t[ILB_NAMESZ];
154*10946SSangeeta.Misra@Sun.COM 
155*10946SSangeeta.Misra@Sun.COM typedef struct ilbd_namelist {
156*10946SSangeeta.Misra@Sun.COM 	int32_t		ilbl_flags;
157*10946SSangeeta.Misra@Sun.COM 	int32_t		ilbl_count;
158*10946SSangeeta.Misra@Sun.COM 	ilbd_name_t	ilbl_name[];
159*10946SSangeeta.Misra@Sun.COM } ilbd_namelist_t;
160*10946SSangeeta.Misra@Sun.COM 
161*10946SSangeeta.Misra@Sun.COM #define	ILBL_NAME_OFFSET	(offsetof(ilbd_namelist_t, ilbl_name))
162*10946SSangeeta.Misra@Sun.COM 
163*10946SSangeeta.Misra@Sun.COM typedef struct rule_info {
164*10946SSangeeta.Misra@Sun.COM 	int32_t		rl_flags;
165*10946SSangeeta.Misra@Sun.COM 	char		rl_name[ILB_NAMESZ];
166*10946SSangeeta.Misra@Sun.COM 	struct in6_addr	rl_vip;
167*10946SSangeeta.Misra@Sun.COM 	uint16_t	rl_proto;
168*10946SSangeeta.Misra@Sun.COM 	uint16_t	rl_ipversion;
169*10946SSangeeta.Misra@Sun.COM 	int32_t		rl_minport;
170*10946SSangeeta.Misra@Sun.COM 	int32_t		rl_maxport;
171*10946SSangeeta.Misra@Sun.COM 	ilb_algo_t	rl_algo;
172*10946SSangeeta.Misra@Sun.COM 	ilb_topo_t	rl_topo;
173*10946SSangeeta.Misra@Sun.COM 	struct in6_addr	rl_nat_src_start;
174*10946SSangeeta.Misra@Sun.COM 	struct in6_addr	rl_nat_src_end;
175*10946SSangeeta.Misra@Sun.COM 	struct in6_addr	rl_stickymask;
176*10946SSangeeta.Misra@Sun.COM 	uint32_t	rl_conndrain;
177*10946SSangeeta.Misra@Sun.COM 	uint32_t	rl_nat_timeout;
178*10946SSangeeta.Misra@Sun.COM 	uint32_t	rl_sticky_timeout;
179*10946SSangeeta.Misra@Sun.COM 	in_port_t	rl_hcport;
180*10946SSangeeta.Misra@Sun.COM 	ilb_hcp_flags_t	rl_hcpflag;
181*10946SSangeeta.Misra@Sun.COM 	char		rl_sgname[ILB_SGNAME_SZ];
182*10946SSangeeta.Misra@Sun.COM 	char		rl_hcname[ILB_NAMESZ];
183*10946SSangeeta.Misra@Sun.COM } ilb_rule_info_t;
184*10946SSangeeta.Misra@Sun.COM 
185*10946SSangeeta.Misra@Sun.COM /*
186*10946SSangeeta.Misra@Sun.COM  * Struct to represent show NAT request and reply.
187*10946SSangeeta.Misra@Sun.COM  *
188*10946SSangeeta.Misra@Sun.COM  * sn_num: (request) indicates the number of entries wanted;
189*10946SSangeeta.Misra@Sun.COM  *         (reply) the number of entries returned;
190*10946SSangeeta.Misra@Sun.COM  * sn_data: NAT/persist able entries (is uint32_t aligned).
191*10946SSangeeta.Misra@Sun.COM  */
192*10946SSangeeta.Misra@Sun.COM typedef struct {
193*10946SSangeeta.Misra@Sun.COM 	uint32_t	sn_num;
194*10946SSangeeta.Misra@Sun.COM 	uint32_t	sn_data[];
195*10946SSangeeta.Misra@Sun.COM } ilb_show_info_t;
196*10946SSangeeta.Misra@Sun.COM 
197*10946SSangeeta.Misra@Sun.COM /*
198*10946SSangeeta.Misra@Sun.COM  * Struct to represent the set of servers associated with a hc object.
199*10946SSangeeta.Misra@Sun.COM  *
200*10946SSangeeta.Misra@Sun.COM  * rs_num_srvs: number of servers in this struct.
201*10946SSangeeta.Misra@Sun.COM  * rs_srvs: array of servers.
202*10946SSangeeta.Misra@Sun.COM  */
203*10946SSangeeta.Misra@Sun.COM typedef struct {
204*10946SSangeeta.Misra@Sun.COM 	uint32_t	rs_num_srvs;
205*10946SSangeeta.Misra@Sun.COM 	ilb_hc_srv_t	rs_srvs[];
206*10946SSangeeta.Misra@Sun.COM } ilb_hc_rule_srv_t;
207*10946SSangeeta.Misra@Sun.COM 
208*10946SSangeeta.Misra@Sun.COM typedef struct ilb_handle_impl {
209*10946SSangeeta.Misra@Sun.COM 	mutex_t		h_lock;
210*10946SSangeeta.Misra@Sun.COM 	cond_t		h_cv;
211*10946SSangeeta.Misra@Sun.COM 	boolean_t	h_busy;
212*10946SSangeeta.Misra@Sun.COM 	boolean_t	h_valid;
213*10946SSangeeta.Misra@Sun.COM 	boolean_t	h_closing;
214*10946SSangeeta.Misra@Sun.COM 	uint32_t	h_waiter;
215*10946SSangeeta.Misra@Sun.COM 	int		h_socket;
216*10946SSangeeta.Misra@Sun.COM 	ilb_status_t	h_error;	/* ... that caused invalidation */
217*10946SSangeeta.Misra@Sun.COM } ilb_handle_impl_t;
218*10946SSangeeta.Misra@Sun.COM 
219*10946SSangeeta.Misra@Sun.COM /*
220*10946SSangeeta.Misra@Sun.COM  * Communication flags used in ilb_comm_t.
221*10946SSangeeta.Misra@Sun.COM  *
222*10946SSangeeta.Misra@Sun.COM  * ILB_COMM_END: end of communication
223*10946SSangeeta.Misra@Sun.COM  */
224*10946SSangeeta.Misra@Sun.COM #define	ILB_COMM_END	0x1
225*10946SSangeeta.Misra@Sun.COM 
226*10946SSangeeta.Misra@Sun.COM /*
227*10946SSangeeta.Misra@Sun.COM  * The message structure used to communicate with ilbd.
228*10946SSangeeta.Misra@Sun.COM  *
229*10946SSangeeta.Misra@Sun.COM  * ic_cmd: the message type.
230*10946SSangeeta.Misra@Sun.COM  * ic_flags: communication flags
231*10946SSangeeta.Misra@Sun.COM  * ic_data: message data (is uint32_t aligned).
232*10946SSangeeta.Misra@Sun.COM  */
233*10946SSangeeta.Misra@Sun.COM typedef struct {
234*10946SSangeeta.Misra@Sun.COM 	ilbd_cmd_t	ic_cmd;
235*10946SSangeeta.Misra@Sun.COM 	int32_t		ic_flags;
236*10946SSangeeta.Misra@Sun.COM 	uint32_t	ic_data[];
237*10946SSangeeta.Misra@Sun.COM } ilb_comm_t;
238*10946SSangeeta.Misra@Sun.COM 
239*10946SSangeeta.Misra@Sun.COM ilb_status_t	i_check_ip_range(ilb_ip_addr_t *, ilb_ip_addr_t *);
240*10946SSangeeta.Misra@Sun.COM ilb_status_t	i_ilb_do_comm(ilb_handle_t, ilb_comm_t *, size_t, ilb_comm_t *,
241*10946SSangeeta.Misra@Sun.COM 		    size_t *);
242*10946SSangeeta.Misra@Sun.COM void		i_ilb_close_comm(ilb_handle_t);
243*10946SSangeeta.Misra@Sun.COM struct in6_addr	i_next_ip_addr(struct in6_addr *, int);
244*10946SSangeeta.Misra@Sun.COM 
245*10946SSangeeta.Misra@Sun.COM ilb_status_t	i_ilb_retrieve_rule_names(ilb_handle_t, ilb_comm_t **,
246*10946SSangeeta.Misra@Sun.COM 		    size_t *);
247*10946SSangeeta.Misra@Sun.COM ilb_comm_t 	*i_ilb_alloc_req(ilbd_cmd_t, size_t *);
248*10946SSangeeta.Misra@Sun.COM 
249*10946SSangeeta.Misra@Sun.COM #ifdef __cplusplus
250*10946SSangeeta.Misra@Sun.COM }
251*10946SSangeeta.Misra@Sun.COM #endif
252*10946SSangeeta.Misra@Sun.COM 
253*10946SSangeeta.Misra@Sun.COM #endif /* _LIBILB_IMPL_H */
254