xref: /onnv-gate/usr/src/lib/libilb/common/libilb.h (revision 10946:324bab2b3370)
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_H
28*10946SSangeeta.Misra@Sun.COM #define	_LIBILB_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 <netinet/in.h>
36*10946SSangeeta.Misra@Sun.COM #include <net/if.h>
37*10946SSangeeta.Misra@Sun.COM 
38*10946SSangeeta.Misra@Sun.COM /* make sure these values stay in sync with definitions in ilb.h! */
39*10946SSangeeta.Misra@Sun.COM #define	ILB_FLAGS_RULE_ENABLED	0x01
40*10946SSangeeta.Misra@Sun.COM #define	ILB_FLAGS_RULE_STICKY	0x02
41*10946SSangeeta.Misra@Sun.COM #define	ILB_FLAGS_RULE_ALLRULES	0x04
42*10946SSangeeta.Misra@Sun.COM #define	ILB_FLAGS_RESERVED	0x08	/* in use by kernel, don't overlay */
43*10946SSangeeta.Misra@Sun.COM 
44*10946SSangeeta.Misra@Sun.COM /*
45*10946SSangeeta.Misra@Sun.COM  * information whether we're interested in names or numerical information
46*10946SSangeeta.Misra@Sun.COM  */
47*10946SSangeeta.Misra@Sun.COM #define	ILB_FLAGS_SRV_HOSTNAME	0x01	/* a servers hostname was given */
48*10946SSangeeta.Misra@Sun.COM #define	ILB_FLAGS_SRV_PORTNAME	0x02	/* a port was spec'd by name */
49*10946SSangeeta.Misra@Sun.COM 
50*10946SSangeeta.Misra@Sun.COM /*
51*10946SSangeeta.Misra@Sun.COM  * server status information
52*10946SSangeeta.Misra@Sun.COM  */
53*10946SSangeeta.Misra@Sun.COM #define	ILB_FLAGS_SRV_ENABLED	0x10
54*10946SSangeeta.Misra@Sun.COM 
55*10946SSangeeta.Misra@Sun.COM /*
56*10946SSangeeta.Misra@Sun.COM  * macros to determine, and for some cases, set status of server
57*10946SSangeeta.Misra@Sun.COM  */
58*10946SSangeeta.Misra@Sun.COM #define	ILB_IS_SRV_ENABLED(f)		\
59*10946SSangeeta.Misra@Sun.COM 	((f & ILB_FLAGS_SRV_ENABLED) == ILB_FLAGS_SRV_ENABLED)
60*10946SSangeeta.Misra@Sun.COM #define	ILB_IS_SRV_DISABLED(f)	((f & ILB_FLAGS_SRV_ENABLED) == 0)
61*10946SSangeeta.Misra@Sun.COM 
62*10946SSangeeta.Misra@Sun.COM #define	ILB_SET_ENABLED(f)	(f |= ILB_FLAGS_SRV_ENABLED)
63*10946SSangeeta.Misra@Sun.COM #define	ILB_SET_DISABLED(f)	(f &= ~ILB_FLAGS_SRV_ENABLED)
64*10946SSangeeta.Misra@Sun.COM 
65*10946SSangeeta.Misra@Sun.COM #define	MAX_IP_SPREAD	0xff	/* largest ip addr. range */
66*10946SSangeeta.Misra@Sun.COM 
67*10946SSangeeta.Misra@Sun.COM #define	ILB_HC_STR_UDP	"udp"
68*10946SSangeeta.Misra@Sun.COM #define	ILB_HC_STR_TCP	"tcp"
69*10946SSangeeta.Misra@Sun.COM #define	ILB_HC_STR_PING	"ping"
70*10946SSangeeta.Misra@Sun.COM 
71*10946SSangeeta.Misra@Sun.COM #define	ILB_NAMESZ	20	/* keep in sync with kernel definition */
72*10946SSangeeta.Misra@Sun.COM #define	ILB_SGNAME_SZ	(ILB_NAMESZ - 5) /* 3 numeric digits, "." and "_" */
73*10946SSangeeta.Misra@Sun.COM 
74*10946SSangeeta.Misra@Sun.COM #define	ILB_SRVID_PREFIX  '_'	/* a valid serverID starts with this */
75*10946SSangeeta.Misra@Sun.COM 
76*10946SSangeeta.Misra@Sun.COM /* producers of these statuses are libilb and ilbd functions */
77*10946SSangeeta.Misra@Sun.COM typedef enum {
78*10946SSangeeta.Misra@Sun.COM 	ILB_STATUS_OK = 0,
79*10946SSangeeta.Misra@Sun.COM 	ILB_STATUS_INTERNAL,	/* an error internal to the library */
80*10946SSangeeta.Misra@Sun.COM 	ILB_STATUS_EINVAL,	/* invalid argument(s) */
81*10946SSangeeta.Misra@Sun.COM 	ILB_STATUS_ENOMEM,	/* not enough memory for operation */
82*10946SSangeeta.Misra@Sun.COM 	ILB_STATUS_ENOENT,	/* no such/no more element(s) */
83*10946SSangeeta.Misra@Sun.COM 	ILB_STATUS_SOCKET,	/* socket related failure */
84*10946SSangeeta.Misra@Sun.COM 	ILB_STATUS_READ,	/* read related failure */
85*10946SSangeeta.Misra@Sun.COM 	ILB_STATUS_WRITE,	/* write related failure */
86*10946SSangeeta.Misra@Sun.COM 	ILB_STATUS_TIMER,	/* healthcheck timer error */
87*10946SSangeeta.Misra@Sun.COM 	ILB_STATUS_INUSE,	/* item in use, cannot delete */
88*10946SSangeeta.Misra@Sun.COM 	ILB_STATUS_EEXIST,	/* scf item exist */
89*10946SSangeeta.Misra@Sun.COM 	ILB_STATUS_PERMIT,	/* no scf permit */
90*10946SSangeeta.Misra@Sun.COM 	ILB_STATUS_CALLBACK,	/* scf callback error */
91*10946SSangeeta.Misra@Sun.COM 	ILB_STATUS_EWOULDBLOCK,	/* operation is blocked - no error string */
92*10946SSangeeta.Misra@Sun.COM 	ILB_STATUS_INPROGRESS,	/* operation already in progress */
93*10946SSangeeta.Misra@Sun.COM 	ILB_STATUS_SEND,	/* send related failure */
94*10946SSangeeta.Misra@Sun.COM 	ILB_STATUS_GENERIC,	/* generic failure  - no error string */
95*10946SSangeeta.Misra@Sun.COM 	ILB_STATUS_ENOHCINFO,   /* missing healthcheck info */
96*10946SSangeeta.Misra@Sun.COM 	ILB_STATUS_INVAL_HCTESTTYPE,	/* invalid  health check */
97*10946SSangeeta.Misra@Sun.COM 	ILB_STATUS_INVAL_CMD, 	/* unknown command */
98*10946SSangeeta.Misra@Sun.COM 	ILB_STATUS_DUP_RULE,	/* rule name exists */
99*10946SSangeeta.Misra@Sun.COM 	ILB_STATUS_ENORULE,	/* rule does not exist */
100*10946SSangeeta.Misra@Sun.COM 	ILB_STATUS_MISMATCHSG,	/* addr family mismatch with sgroup */
101*10946SSangeeta.Misra@Sun.COM 	ILB_STATUS_MISMATCHH,	/* addr family mismatch with hosts/rule */
102*10946SSangeeta.Misra@Sun.COM 	ILB_STATUS_SGUNAVAIL,	/* cannot find sgroup in sggroup list */
103*10946SSangeeta.Misra@Sun.COM 	ILB_STATUS_SGINUSE,	/* server is un use, cannot remove */
104*10946SSangeeta.Misra@Sun.COM 	ILB_STATUS_SGEXISTS,	/* server exists */
105*10946SSangeeta.Misra@Sun.COM 	ILB_STATUS_SGFULL,   	/* cannot add any more servers */
106*10946SSangeeta.Misra@Sun.COM 	ILB_STATUS_SGEMPTY,  	/* sgroup is empty */
107*10946SSangeeta.Misra@Sun.COM 	ILB_STATUS_NAMETOOLONG,	/* a name is longer than allowed */
108*10946SSangeeta.Misra@Sun.COM 	ILB_STATUS_CFGAUTH,	/* config authoriz denied -no error string */
109*10946SSangeeta.Misra@Sun.COM 	ILB_STATUS_CFGUPDATE,	/* failed to update config! */
110*10946SSangeeta.Misra@Sun.COM 	ILB_STATUS_BADSG,	/* rules port range size does not match */
111*10946SSangeeta.Misra@Sun.COM 				/* that of the servers  */
112*10946SSangeeta.Misra@Sun.COM 	ILB_STATUS_INVAL_SRVR,   /* server port is incompatible with */
113*10946SSangeeta.Misra@Sun.COM 				/* rule port */
114*10946SSangeeta.Misra@Sun.COM 	ILB_STATUS_INVAL_ENBSRVR,   /* server  cannot be enabled since it's */
115*10946SSangeeta.Misra@Sun.COM 				    /* not being used by a rule */
116*10946SSangeeta.Misra@Sun.COM 	ILB_STATUS_BADPORT,	/* rules port value does not match */
117*10946SSangeeta.Misra@Sun.COM 				/* server's */
118*10946SSangeeta.Misra@Sun.COM 	ILB_STATUS_SRVUNAVAIL,	/* cannot find specified server */
119*10946SSangeeta.Misra@Sun.COM 	ILB_STATUS_RULE_NO_HC,	/* rule does not have hc info */
120*10946SSangeeta.Misra@Sun.COM 	ILB_STATUS_RULE_HC_MISMATCH,	/* rule and hc object mismatch */
121*10946SSangeeta.Misra@Sun.COM 	ILB_STATUS_HANDLE_CLOSING	/* library handle is being closed */
122*10946SSangeeta.Misra@Sun.COM } ilb_status_t;
123*10946SSangeeta.Misra@Sun.COM 
124*10946SSangeeta.Misra@Sun.COM typedef struct {
125*10946SSangeeta.Misra@Sun.COM 	int32_t		ia_af;		/* AF_INET or AF_INET6 */
126*10946SSangeeta.Misra@Sun.COM 	union {
127*10946SSangeeta.Misra@Sun.COM 		struct in_addr	v4;	/* network byte order */
128*10946SSangeeta.Misra@Sun.COM 		struct in6_addr	v6;	/* network byte order */
129*10946SSangeeta.Misra@Sun.COM 	} _au;
130*10946SSangeeta.Misra@Sun.COM #define	ia_v4	_au.v4
131*10946SSangeeta.Misra@Sun.COM #define	ia_v6	_au.v6
132*10946SSangeeta.Misra@Sun.COM } ilb_ip_addr_t;
133*10946SSangeeta.Misra@Sun.COM 
134*10946SSangeeta.Misra@Sun.COM /* Supported load balancing algorithm type */
135*10946SSangeeta.Misra@Sun.COM typedef enum {
136*10946SSangeeta.Misra@Sun.COM 	ILB_ALG_ROUNDROBIN = 1,
137*10946SSangeeta.Misra@Sun.COM 	ILB_ALG_HASH_IP,
138*10946SSangeeta.Misra@Sun.COM 	ILB_ALG_HASH_IP_SPORT,
139*10946SSangeeta.Misra@Sun.COM 	ILB_ALG_HASH_IP_VIP
140*10946SSangeeta.Misra@Sun.COM } ilb_algo_t;
141*10946SSangeeta.Misra@Sun.COM 
142*10946SSangeeta.Misra@Sun.COM /* Supported load balancing method */
143*10946SSangeeta.Misra@Sun.COM typedef enum {
144*10946SSangeeta.Misra@Sun.COM 	ILB_TOPO_DSR = 1,
145*10946SSangeeta.Misra@Sun.COM 	ILB_TOPO_NAT,
146*10946SSangeeta.Misra@Sun.COM 	ILB_TOPO_HALF_NAT
147*10946SSangeeta.Misra@Sun.COM } ilb_topo_t;
148*10946SSangeeta.Misra@Sun.COM 
149*10946SSangeeta.Misra@Sun.COM #define	ILB_INVALID_HANDLE ((void *) NULL)
150*10946SSangeeta.Misra@Sun.COM 
151*10946SSangeeta.Misra@Sun.COM /*
152*10946SSangeeta.Misra@Sun.COM  * note: pointer to a non-existant struct
153*10946SSangeeta.Misra@Sun.COM  */
154*10946SSangeeta.Misra@Sun.COM typedef struct ilb_handle *ilb_handle_t;
155*10946SSangeeta.Misra@Sun.COM 
156*10946SSangeeta.Misra@Sun.COM /*
157*10946SSangeeta.Misra@Sun.COM  * Health check related information
158*10946SSangeeta.Misra@Sun.COM  */
159*10946SSangeeta.Misra@Sun.COM 
160*10946SSangeeta.Misra@Sun.COM /* HC state of a server */
161*10946SSangeeta.Misra@Sun.COM typedef enum {
162*10946SSangeeta.Misra@Sun.COM 	ILB_HCS_UNINIT = -1,	/* Uninitialized */
163*10946SSangeeta.Misra@Sun.COM 	ILB_HCS_UNREACH = 0,	/* Unreachable, ping fails */
164*10946SSangeeta.Misra@Sun.COM 	ILB_HCS_ALIVE,		/* Probe succeeds */
165*10946SSangeeta.Misra@Sun.COM 	ILB_HCS_DEAD,		/* Probe fails */
166*10946SSangeeta.Misra@Sun.COM 	ILB_HCS_DISABLED	/* Server is disabled */
167*10946SSangeeta.Misra@Sun.COM } ilb_hc_srv_status_t;
168*10946SSangeeta.Misra@Sun.COM 
169*10946SSangeeta.Misra@Sun.COM /*
170*10946SSangeeta.Misra@Sun.COM  * Struct representing a server in a hc object
171*10946SSangeeta.Misra@Sun.COM  *
172*10946SSangeeta.Misra@Sun.COM  * hcs_rule_name: rule using this server
173*10946SSangeeta.Misra@Sun.COM  * hcs_ID: server ID
174*10946SSangeeta.Misra@Sun.COM  * hcs_hc_name: hc object this server is associated with
175*10946SSangeeta.Misra@Sun.COM  * hcs_IP: IP address of the server
176*10946SSangeeta.Misra@Sun.COM  * hcs_fail_cnt: number of fail hc probe
177*10946SSangeeta.Misra@Sun.COM  * hcs_status: hc status of the server
178*10946SSangeeta.Misra@Sun.COM  * hcs_rtt: (in microsec) smoothed average RTT to the server
179*10946SSangeeta.Misra@Sun.COM  * hcs_lasttime: last time hc test was done (as returned by time(2))
180*10946SSangeeta.Misra@Sun.COM  * hcs_nexttime: next time hc test will be done (as returned by (time(2))
181*10946SSangeeta.Misra@Sun.COM  */
182*10946SSangeeta.Misra@Sun.COM typedef struct {
183*10946SSangeeta.Misra@Sun.COM 	char		hcs_rule_name[ILB_NAMESZ];
184*10946SSangeeta.Misra@Sun.COM 	char		hcs_ID[ILB_NAMESZ];
185*10946SSangeeta.Misra@Sun.COM 	char		hcs_hc_name[ILB_NAMESZ];
186*10946SSangeeta.Misra@Sun.COM 	struct in6_addr hcs_IP;
187*10946SSangeeta.Misra@Sun.COM 	uint32_t	hcs_fail_cnt;
188*10946SSangeeta.Misra@Sun.COM 	ilb_hc_srv_status_t	hcs_status;
189*10946SSangeeta.Misra@Sun.COM 	uint32_t	hcs_rtt;
190*10946SSangeeta.Misra@Sun.COM 	time_t		hcs_lasttime;
191*10946SSangeeta.Misra@Sun.COM 	time_t		hcs_nexttime;
192*10946SSangeeta.Misra@Sun.COM } ilb_hc_srv_t;
193*10946SSangeeta.Misra@Sun.COM 
194*10946SSangeeta.Misra@Sun.COM /* Probe flags to be used in r_hcpflag in struct rule data. */
195*10946SSangeeta.Misra@Sun.COM typedef enum {
196*10946SSangeeta.Misra@Sun.COM 	ILB_HCI_PROBE_ANY = 0,	/* Probe any port in the server port range */
197*10946SSangeeta.Misra@Sun.COM 	ILB_HCI_PROBE_FIX	/* Probe a fixed port */
198*10946SSangeeta.Misra@Sun.COM } ilb_hcp_flags_t;
199*10946SSangeeta.Misra@Sun.COM 
200*10946SSangeeta.Misra@Sun.COM /*
201*10946SSangeeta.Misra@Sun.COM  * Struct representing a hc object
202*10946SSangeeta.Misra@Sun.COM  *
203*10946SSangeeta.Misra@Sun.COM  * hci_name: name of the hc object
204*10946SSangeeta.Misra@Sun.COM  * hci_test: hc test to be done, TCP, UDP, or user supplied path name
205*10946SSangeeta.Misra@Sun.COM  * hci_timeout: (in sec) test time out
206*10946SSangeeta.Misra@Sun.COM  * hci_interval: (in sec) test execution interval
207*10946SSangeeta.Misra@Sun.COM  * hci_def_ping: true if default ping is done; false otherwise
208*10946SSangeeta.Misra@Sun.COM  */
209*10946SSangeeta.Misra@Sun.COM typedef struct {
210*10946SSangeeta.Misra@Sun.COM 	char		hci_name[ILB_NAMESZ];
211*10946SSangeeta.Misra@Sun.COM 	char		hci_test[MAXPATHLEN];
212*10946SSangeeta.Misra@Sun.COM 	int32_t		hci_timeout;
213*10946SSangeeta.Misra@Sun.COM 	int32_t		hci_count;
214*10946SSangeeta.Misra@Sun.COM 	int32_t		hci_interval;
215*10946SSangeeta.Misra@Sun.COM 	boolean_t	hci_def_ping;
216*10946SSangeeta.Misra@Sun.COM } ilb_hc_info_t;
217*10946SSangeeta.Misra@Sun.COM 
218*10946SSangeeta.Misra@Sun.COM typedef struct rule_data {
219*10946SSangeeta.Misra@Sun.COM 	char		r_name[ILB_NAMESZ]; 	/* name of this rule */
220*10946SSangeeta.Misra@Sun.COM 	int32_t		r_flags;	/* opt: ILB_FLAGS_RULE_ENABLED etc. */
221*10946SSangeeta.Misra@Sun.COM 	ilb_ip_addr_t	r_vip;		/* vip, required for rule creation */
222*10946SSangeeta.Misra@Sun.COM 	uint16_t	r_proto;	/* protocol (tcp, udp) */
223*10946SSangeeta.Misra@Sun.COM 	in_port_t	r_minport;	/* port this rule refers to */
224*10946SSangeeta.Misra@Sun.COM 	in_port_t	r_maxport;	/* if != 0, defines port range */
225*10946SSangeeta.Misra@Sun.COM 	ilb_algo_t	r_algo;		/* round-robin, hash-ip, etc. */
226*10946SSangeeta.Misra@Sun.COM 	ilb_topo_t	r_topo;		/* dsr, NAT, etc */
227*10946SSangeeta.Misra@Sun.COM 	ilb_ip_addr_t	r_nat_src_start; /* required for NAT */
228*10946SSangeeta.Misra@Sun.COM 	ilb_ip_addr_t	r_nat_src_end;	/* required for NAT */
229*10946SSangeeta.Misra@Sun.COM 	ilb_ip_addr_t	r_stickymask;	/* netmask for persistence */
230*10946SSangeeta.Misra@Sun.COM 	uint32_t	r_conndrain;	/* opt: time for conn. draining (s) */
231*10946SSangeeta.Misra@Sun.COM 	uint32_t	r_nat_timeout;	/* opt: timeout for nat connections */
232*10946SSangeeta.Misra@Sun.COM 	uint32_t	r_sticky_timeout; /* opt: timeout for persistence */
233*10946SSangeeta.Misra@Sun.COM 	ilb_hcp_flags_t	r_hcpflag;	/* HC port flag */
234*10946SSangeeta.Misra@Sun.COM 	in_port_t	r_hcport;	/* opt with HC */
235*10946SSangeeta.Misra@Sun.COM 	char		r_sgname[ILB_SGNAME_SZ]; /* this rule's server grp. */
236*10946SSangeeta.Misra@Sun.COM 	char		r_hcname[ILB_NAMESZ];	/* HC name: optional */
237*10946SSangeeta.Misra@Sun.COM } ilb_rule_data_t;
238*10946SSangeeta.Misra@Sun.COM 
239*10946SSangeeta.Misra@Sun.COM /* not all fields are valid in all calls where this is used */
240*10946SSangeeta.Misra@Sun.COM typedef struct server_data {
241*10946SSangeeta.Misra@Sun.COM 	ilb_ip_addr_t	sd_addr;	/* a server's ip address */
242*10946SSangeeta.Misra@Sun.COM 	in_port_t	sd_minport;	/* port information */
243*10946SSangeeta.Misra@Sun.COM 	in_port_t	sd_maxport;	/* ... if != 0, defines a port range */
244*10946SSangeeta.Misra@Sun.COM 	uint32_t	sd_flags;	/* enabled, dis- */
245*10946SSangeeta.Misra@Sun.COM 	char 		sd_srvID[ILB_NAMESZ];	/* "name" for server */
246*10946SSangeeta.Misra@Sun.COM 					/* assigned by system, not user */
247*10946SSangeeta.Misra@Sun.COM } ilb_server_data_t;
248*10946SSangeeta.Misra@Sun.COM 
249*10946SSangeeta.Misra@Sun.COM /*
250*10946SSangeeta.Misra@Sun.COM  * Struct to represent a server group.
251*10946SSangeeta.Misra@Sun.COM  *
252*10946SSangeeta.Misra@Sun.COM  * sgd_name: server group name
253*10946SSangeeta.Misra@Sun.COM  * sgd_flags: flags
254*10946SSangeeta.Misra@Sun.COM  * sgd_srvcount: number of servers in the group (not used in sever group
255*10946SSangeeta.Misra@Sun.COM  *               creation); filled in when used by call back function for
256*10946SSangeeta.Misra@Sun.COM  *               ilb_walk_servergroups().
257*10946SSangeeta.Misra@Sun.COM  */
258*10946SSangeeta.Misra@Sun.COM typedef struct sg_data {
259*10946SSangeeta.Misra@Sun.COM 	char		sgd_name[ILB_SGNAME_SZ];
260*10946SSangeeta.Misra@Sun.COM 	int32_t		sgd_flags;
261*10946SSangeeta.Misra@Sun.COM 	int32_t		sgd_srvcount;
262*10946SSangeeta.Misra@Sun.COM } ilb_sg_data_t;
263*10946SSangeeta.Misra@Sun.COM 
264*10946SSangeeta.Misra@Sun.COM /*
265*10946SSangeeta.Misra@Sun.COM  * Struct to represent a NAT entry in kernel.
266*10946SSangeeta.Misra@Sun.COM  *
267*10946SSangeeta.Misra@Sun.COM  * nat_proto: transport protocol used in this NAT entry
268*10946SSangeeta.Misra@Sun.COM  *
269*10946SSangeeta.Misra@Sun.COM  * nat_out_global: IP address of client's request
270*10946SSangeeta.Misra@Sun.COM  * nat_out_global_port: port number of client's request
271*10946SSangeeta.Misra@Sun.COM  * nat_in_global: VIP of a rule for the NAT entry
272*10946SSangeeta.Misra@Sun.COM  * nat_in_global_port: port of a rule for the NAT entry
273*10946SSangeeta.Misra@Sun.COM  *
274*10946SSangeeta.Misra@Sun.COM  * nat_out_local: half NAT: IP address of client's request
275*10946SSangeeta.Misra@Sun.COM  *                full NAT: NAT'ed IP addres of client' request
276*10946SSangeeta.Misra@Sun.COM  * nat_out_local_port: half NAT: port number of client's request
277*10946SSangeeta.Misra@Sun.COM  *                     full NAT: NAT'ed port number of client's request
278*10946SSangeeta.Misra@Sun.COM  * nat_in_local: IP address of back end server handling this request
279*10946SSangeeta.Misra@Sun.COM  * nat_in_local_port: port number in back end server handling thi request
280*10946SSangeeta.Misra@Sun.COM  *
281*10946SSangeeta.Misra@Sun.COM  * (*) IPv4 address is represented as IPv4 mapped IPv6 address.
282*10946SSangeeta.Misra@Sun.COM  */
283*10946SSangeeta.Misra@Sun.COM typedef struct {
284*10946SSangeeta.Misra@Sun.COM 	uint32_t	nat_proto;
285*10946SSangeeta.Misra@Sun.COM 
286*10946SSangeeta.Misra@Sun.COM 	in6_addr_t	nat_in_local;
287*10946SSangeeta.Misra@Sun.COM 	in6_addr_t	nat_in_global;
288*10946SSangeeta.Misra@Sun.COM 	in6_addr_t	nat_out_local;
289*10946SSangeeta.Misra@Sun.COM 	in6_addr_t	nat_out_global;
290*10946SSangeeta.Misra@Sun.COM 
291*10946SSangeeta.Misra@Sun.COM 	in_port_t	nat_in_local_port;
292*10946SSangeeta.Misra@Sun.COM 	in_port_t	nat_in_global_port;
293*10946SSangeeta.Misra@Sun.COM 	in_port_t	nat_out_local_port;
294*10946SSangeeta.Misra@Sun.COM 	in_port_t	nat_out_global_port;
295*10946SSangeeta.Misra@Sun.COM } ilb_nat_info_t;
296*10946SSangeeta.Misra@Sun.COM 
297*10946SSangeeta.Misra@Sun.COM /*
298*10946SSangeeta.Misra@Sun.COM  * Struct to represet a persistent entry in kernel.
299*10946SSangeeta.Misra@Sun.COM  *
300*10946SSangeeta.Misra@Sun.COM  * rule_name: the name of rule for a persistent entry
301*10946SSangeeta.Misra@Sun.COM  * req_addr: the client's IP address (*)
302*10946SSangeeta.Misra@Sun.COM  * srv_addr: the server's IP address (*) handling the client's request
303*10946SSangeeta.Misra@Sun.COM  *
304*10946SSangeeta.Misra@Sun.COM  * (*) IPv4 address is represented as IPv4 mapped IPv6 address.
305*10946SSangeeta.Misra@Sun.COM  */
306*10946SSangeeta.Misra@Sun.COM typedef struct {
307*10946SSangeeta.Misra@Sun.COM 	char		persist_rule_name[ILB_NAMESZ];
308*10946SSangeeta.Misra@Sun.COM 	in6_addr_t	persist_req_addr;
309*10946SSangeeta.Misra@Sun.COM 	in6_addr_t	persist_srv_addr;
310*10946SSangeeta.Misra@Sun.COM } ilb_persist_info_t;
311*10946SSangeeta.Misra@Sun.COM 
312*10946SSangeeta.Misra@Sun.COM /*
313*10946SSangeeta.Misra@Sun.COM  * Function prototype of the call back function of those walker functions.
314*10946SSangeeta.Misra@Sun.COM  *
315*10946SSangeeta.Misra@Sun.COM  * Note: the storage of the data item parameter (ilb_sg_data_t/
316*10946SSangeeta.Misra@Sun.COM  * ilb_server_data_/ilb_rule_data_t/ilb_hc_info_t/ilb_hc_srv_t) will be
317*10946SSangeeta.Misra@Sun.COM  * freed after calling the call back function.  If the call back function
318*10946SSangeeta.Misra@Sun.COM  * needs to keep a copy of the data, it must copy the data content.
319*10946SSangeeta.Misra@Sun.COM  */
320*10946SSangeeta.Misra@Sun.COM typedef ilb_status_t	(* sg_walkerfunc_t)(ilb_handle_t, ilb_sg_data_t *,
321*10946SSangeeta.Misra@Sun.COM     void *);
322*10946SSangeeta.Misra@Sun.COM typedef ilb_status_t	(* srv_walkerfunc_t)(ilb_handle_t, ilb_server_data_t *,
323*10946SSangeeta.Misra@Sun.COM     const char *, void *);
324*10946SSangeeta.Misra@Sun.COM typedef ilb_status_t	(* rule_walkerfunc_t)(ilb_handle_t, ilb_rule_data_t *,
325*10946SSangeeta.Misra@Sun.COM     void *);
326*10946SSangeeta.Misra@Sun.COM typedef ilb_status_t	(* hc_walkerfunc_t)(ilb_handle_t, ilb_hc_info_t *,
327*10946SSangeeta.Misra@Sun.COM     void *);
328*10946SSangeeta.Misra@Sun.COM typedef ilb_status_t	(* hc_srvwalkerfunc_t)(ilb_handle_t, ilb_hc_srv_t *,
329*10946SSangeeta.Misra@Sun.COM     void *);
330*10946SSangeeta.Misra@Sun.COM 
331*10946SSangeeta.Misra@Sun.COM /*
332*10946SSangeeta.Misra@Sun.COM  * ilb_open creates a session handle that every caller into
333*10946SSangeeta.Misra@Sun.COM  * libilb needs to use
334*10946SSangeeta.Misra@Sun.COM  */
335*10946SSangeeta.Misra@Sun.COM ilb_status_t	ilb_open(ilb_handle_t *);
336*10946SSangeeta.Misra@Sun.COM 
337*10946SSangeeta.Misra@Sun.COM /*
338*10946SSangeeta.Misra@Sun.COM  * relinquish the session handle
339*10946SSangeeta.Misra@Sun.COM  */
340*10946SSangeeta.Misra@Sun.COM ilb_status_t	ilb_close(ilb_handle_t);
341*10946SSangeeta.Misra@Sun.COM 
342*10946SSangeeta.Misra@Sun.COM /* support and general functions */
343*10946SSangeeta.Misra@Sun.COM ilb_status_t	ilb_reset_config(ilb_handle_t);
344*10946SSangeeta.Misra@Sun.COM const char	*ilb_errstr(ilb_status_t);
345*10946SSangeeta.Misra@Sun.COM 
346*10946SSangeeta.Misra@Sun.COM /* rule-related functions */
347*10946SSangeeta.Misra@Sun.COM ilb_status_t	ilb_create_rule(ilb_handle_t, const ilb_rule_data_t *);
348*10946SSangeeta.Misra@Sun.COM ilb_status_t	ilb_destroy_rule(ilb_handle_t, const char *);
349*10946SSangeeta.Misra@Sun.COM ilb_status_t	ilb_disable_rule(ilb_handle_t, const char *);
350*10946SSangeeta.Misra@Sun.COM ilb_status_t	ilb_enable_rule(ilb_handle_t, const char *);
351*10946SSangeeta.Misra@Sun.COM ilb_status_t	ilb_walk_rules(ilb_handle_t, rule_walkerfunc_t, const char *,
352*10946SSangeeta.Misra@Sun.COM     void *);
353*10946SSangeeta.Misra@Sun.COM 
354*10946SSangeeta.Misra@Sun.COM /* servergroup functionality */
355*10946SSangeeta.Misra@Sun.COM ilb_status_t	ilb_create_servergroup(ilb_handle_t, const char *);
356*10946SSangeeta.Misra@Sun.COM ilb_status_t	ilb_destroy_servergroup(ilb_handle_t, const char *);
357*10946SSangeeta.Misra@Sun.COM ilb_status_t	ilb_add_server_to_group(ilb_handle_t, const char *,
358*10946SSangeeta.Misra@Sun.COM     ilb_server_data_t *);
359*10946SSangeeta.Misra@Sun.COM ilb_status_t	ilb_rem_server_from_group(ilb_handle_t, const char *,
360*10946SSangeeta.Misra@Sun.COM     ilb_server_data_t *);
361*10946SSangeeta.Misra@Sun.COM ilb_status_t	ilb_walk_servergroups(ilb_handle_t, sg_walkerfunc_t,
362*10946SSangeeta.Misra@Sun.COM     const char *, void *);
363*10946SSangeeta.Misra@Sun.COM ilb_status_t	ilb_walk_servers(ilb_handle_t, srv_walkerfunc_t,
364*10946SSangeeta.Misra@Sun.COM     const char *, void *);
365*10946SSangeeta.Misra@Sun.COM 
366*10946SSangeeta.Misra@Sun.COM /* functions for individual servers */
367*10946SSangeeta.Misra@Sun.COM ilb_status_t	ilb_enable_server(ilb_handle_t, ilb_server_data_t *, void *);
368*10946SSangeeta.Misra@Sun.COM ilb_status_t	ilb_disable_server(ilb_handle_t, ilb_server_data_t *, void *);
369*10946SSangeeta.Misra@Sun.COM ilb_status_t	ilb_srvID_to_address(ilb_handle_t, ilb_server_data_t *,
370*10946SSangeeta.Misra@Sun.COM     const char *);
371*10946SSangeeta.Misra@Sun.COM ilb_status_t	ilb_address_to_srvID(ilb_handle_t, ilb_server_data_t *,
372*10946SSangeeta.Misra@Sun.COM     const char *);
373*10946SSangeeta.Misra@Sun.COM 
374*10946SSangeeta.Misra@Sun.COM /* health check-related functions */
375*10946SSangeeta.Misra@Sun.COM ilb_status_t	ilb_create_hc(ilb_handle_t, const ilb_hc_info_t *);
376*10946SSangeeta.Misra@Sun.COM ilb_status_t	ilb_destroy_hc(ilb_handle_t, const char *);
377*10946SSangeeta.Misra@Sun.COM ilb_status_t	ilb_get_hc_info(ilb_handle_t, const char *, ilb_hc_info_t *);
378*10946SSangeeta.Misra@Sun.COM ilb_status_t	ilb_walk_hc(ilb_handle_t, hc_walkerfunc_t, void *);
379*10946SSangeeta.Misra@Sun.COM ilb_status_t	ilb_walk_hc_srvs(ilb_handle_t, hc_srvwalkerfunc_t,
380*10946SSangeeta.Misra@Sun.COM     const char *, void *);
381*10946SSangeeta.Misra@Sun.COM 
382*10946SSangeeta.Misra@Sun.COM /* To show NAT table entries of ILB */
383*10946SSangeeta.Misra@Sun.COM ilb_status_t	ilb_show_nat(ilb_handle_t, ilb_nat_info_t[], size_t *,
384*10946SSangeeta.Misra@Sun.COM     boolean_t *);
385*10946SSangeeta.Misra@Sun.COM 
386*10946SSangeeta.Misra@Sun.COM /* To show persistent table entries of ILB */
387*10946SSangeeta.Misra@Sun.COM ilb_status_t	ilb_show_persist(ilb_handle_t, ilb_persist_info_t[], size_t *,
388*10946SSangeeta.Misra@Sun.COM     boolean_t *);
389*10946SSangeeta.Misra@Sun.COM 
390*10946SSangeeta.Misra@Sun.COM /* PRIVATE */
391*10946SSangeeta.Misra@Sun.COM int ilb_cmp_ipaddr(ilb_ip_addr_t *, ilb_ip_addr_t *, int64_t *);
392*10946SSangeeta.Misra@Sun.COM int ilb_cmp_in6_addr(struct in6_addr *, struct in6_addr *, int64_t *);
393*10946SSangeeta.Misra@Sun.COM 
394*10946SSangeeta.Misra@Sun.COM #ifdef __cplusplus
395*10946SSangeeta.Misra@Sun.COM }
396*10946SSangeeta.Misra@Sun.COM #endif
397*10946SSangeeta.Misra@Sun.COM 
398*10946SSangeeta.Misra@Sun.COM #endif /* _LIBILB_H */
399