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 #include <stdlib.h>
28*10946SSangeeta.Misra@Sun.COM #include <strings.h>
29*10946SSangeeta.Misra@Sun.COM #include <sys/types.h>
30*10946SSangeeta.Misra@Sun.COM #include <sys/socket.h>
31*10946SSangeeta.Misra@Sun.COM #include <netinet/in.h>
32*10946SSangeeta.Misra@Sun.COM #include <stddef.h>
33*10946SSangeeta.Misra@Sun.COM #include <libilb_impl.h>
34*10946SSangeeta.Misra@Sun.COM #include <libilb.h>
35*10946SSangeeta.Misra@Sun.COM
36*10946SSangeeta.Misra@Sun.COM /*
37*10946SSangeeta.Misra@Sun.COM * Create a health check, returning a health check handle upon success.
38*10946SSangeeta.Misra@Sun.COM * Health check created will be recorded in persistent datastore.
39*10946SSangeeta.Misra@Sun.COM */
40*10946SSangeeta.Misra@Sun.COM ilb_status_t
ilb_create_hc(ilb_handle_t h,const ilb_hc_info_t * hc)41*10946SSangeeta.Misra@Sun.COM ilb_create_hc(ilb_handle_t h, const ilb_hc_info_t *hc)
42*10946SSangeeta.Misra@Sun.COM {
43*10946SSangeeta.Misra@Sun.COM ilb_status_t rc;
44*10946SSangeeta.Misra@Sun.COM ilb_comm_t *ic;
45*10946SSangeeta.Misra@Sun.COM size_t ic_sz;
46*10946SSangeeta.Misra@Sun.COM
47*10946SSangeeta.Misra@Sun.COM if (h == ILB_INVALID_HANDLE || hc == NULL || *hc->hci_name == '\0' ||
48*10946SSangeeta.Misra@Sun.COM hc->hci_timeout < 0 || hc->hci_count < 0 ||
49*10946SSangeeta.Misra@Sun.COM hc->hci_interval <= hc->hci_timeout * hc->hci_count)
50*10946SSangeeta.Misra@Sun.COM return (ILB_STATUS_EINVAL);
51*10946SSangeeta.Misra@Sun.COM
52*10946SSangeeta.Misra@Sun.COM if ((ic = i_ilb_alloc_req(ILBD_CREATE_HC, &ic_sz)) == NULL)
53*10946SSangeeta.Misra@Sun.COM return (ILB_STATUS_ENOMEM);
54*10946SSangeeta.Misra@Sun.COM
55*10946SSangeeta.Misra@Sun.COM (void) memcpy(&ic->ic_data, hc, sizeof (ilb_hc_info_t));
56*10946SSangeeta.Misra@Sun.COM
57*10946SSangeeta.Misra@Sun.COM rc = i_ilb_do_comm(h, ic, ic_sz, ic, &ic_sz);
58*10946SSangeeta.Misra@Sun.COM if (rc != ILB_STATUS_OK)
59*10946SSangeeta.Misra@Sun.COM goto out;
60*10946SSangeeta.Misra@Sun.COM
61*10946SSangeeta.Misra@Sun.COM if (ic->ic_cmd != ILBD_CMD_OK)
62*10946SSangeeta.Misra@Sun.COM rc = *(ilb_status_t *)&ic->ic_data;
63*10946SSangeeta.Misra@Sun.COM
64*10946SSangeeta.Misra@Sun.COM out:
65*10946SSangeeta.Misra@Sun.COM free(ic);
66*10946SSangeeta.Misra@Sun.COM return (rc);
67*10946SSangeeta.Misra@Sun.COM }
68*10946SSangeeta.Misra@Sun.COM
69*10946SSangeeta.Misra@Sun.COM /*
70*10946SSangeeta.Misra@Sun.COM * Given a health check handle, destroy the corresponding health check.
71*10946SSangeeta.Misra@Sun.COM * Persistent datastore will be updated as well.
72*10946SSangeeta.Misra@Sun.COM */
73*10946SSangeeta.Misra@Sun.COM ilb_status_t
ilb_destroy_hc(ilb_handle_t h,const char * hcname)74*10946SSangeeta.Misra@Sun.COM ilb_destroy_hc(ilb_handle_t h, const char *hcname)
75*10946SSangeeta.Misra@Sun.COM {
76*10946SSangeeta.Misra@Sun.COM ilb_status_t rc;
77*10946SSangeeta.Misra@Sun.COM ilb_comm_t *ic;
78*10946SSangeeta.Misra@Sun.COM size_t ic_sz;
79*10946SSangeeta.Misra@Sun.COM
80*10946SSangeeta.Misra@Sun.COM if (h == ILB_INVALID_HANDLE || hcname == NULL || *hcname == '\0')
81*10946SSangeeta.Misra@Sun.COM return (ILB_STATUS_EINVAL);
82*10946SSangeeta.Misra@Sun.COM
83*10946SSangeeta.Misra@Sun.COM if ((ic = i_ilb_alloc_req(ILBD_DESTROY_HC, &ic_sz)) == NULL)
84*10946SSangeeta.Misra@Sun.COM return (ILB_STATUS_ENOMEM);
85*10946SSangeeta.Misra@Sun.COM
86*10946SSangeeta.Misra@Sun.COM (void) strlcpy((char *)&ic->ic_data, hcname, sizeof (ilbd_name_t));
87*10946SSangeeta.Misra@Sun.COM
88*10946SSangeeta.Misra@Sun.COM rc = i_ilb_do_comm(h, ic, ic_sz, ic, &ic_sz);
89*10946SSangeeta.Misra@Sun.COM if (rc != ILB_STATUS_OK)
90*10946SSangeeta.Misra@Sun.COM goto out;
91*10946SSangeeta.Misra@Sun.COM
92*10946SSangeeta.Misra@Sun.COM if (ic->ic_cmd != ILBD_CMD_OK)
93*10946SSangeeta.Misra@Sun.COM rc = *(ilb_status_t *)&ic->ic_data;
94*10946SSangeeta.Misra@Sun.COM
95*10946SSangeeta.Misra@Sun.COM out:
96*10946SSangeeta.Misra@Sun.COM free(ic);
97*10946SSangeeta.Misra@Sun.COM return (rc);
98*10946SSangeeta.Misra@Sun.COM }
99*10946SSangeeta.Misra@Sun.COM
100*10946SSangeeta.Misra@Sun.COM /*
101*10946SSangeeta.Misra@Sun.COM * Given a health check name, get hc info associated with this handle
102*10946SSangeeta.Misra@Sun.COM */
103*10946SSangeeta.Misra@Sun.COM ilb_status_t
ilb_get_hc_info(ilb_handle_t h,const char * name,ilb_hc_info_t * hcp)104*10946SSangeeta.Misra@Sun.COM ilb_get_hc_info(ilb_handle_t h, const char *name, ilb_hc_info_t *hcp)
105*10946SSangeeta.Misra@Sun.COM {
106*10946SSangeeta.Misra@Sun.COM ilb_status_t rc;
107*10946SSangeeta.Misra@Sun.COM ilb_comm_t *ic, *rbuf;
108*10946SSangeeta.Misra@Sun.COM size_t ic_sz, rbufsz;
109*10946SSangeeta.Misra@Sun.COM
110*10946SSangeeta.Misra@Sun.COM if (h == ILB_INVALID_HANDLE || name == NULL || hcp == NULL)
111*10946SSangeeta.Misra@Sun.COM return (ILB_STATUS_EINVAL);
112*10946SSangeeta.Misra@Sun.COM
113*10946SSangeeta.Misra@Sun.COM if ((ic = i_ilb_alloc_req(ILBD_GET_HC_INFO, &ic_sz)) == NULL)
114*10946SSangeeta.Misra@Sun.COM return (ILB_STATUS_ENOMEM);
115*10946SSangeeta.Misra@Sun.COM rbufsz = sizeof (ilb_comm_t) + sizeof (ilb_hc_info_t);
116*10946SSangeeta.Misra@Sun.COM if ((rbuf = malloc(rbufsz)) == NULL) {
117*10946SSangeeta.Misra@Sun.COM free(ic);
118*10946SSangeeta.Misra@Sun.COM return (ILB_STATUS_ENOMEM);
119*10946SSangeeta.Misra@Sun.COM }
120*10946SSangeeta.Misra@Sun.COM
121*10946SSangeeta.Misra@Sun.COM (void) strlcpy((char *)&ic->ic_data, name, sizeof (ilbd_name_t));
122*10946SSangeeta.Misra@Sun.COM
123*10946SSangeeta.Misra@Sun.COM rc = i_ilb_do_comm(h, ic, ic_sz, rbuf, &rbufsz);
124*10946SSangeeta.Misra@Sun.COM if (rc != ILB_STATUS_OK)
125*10946SSangeeta.Misra@Sun.COM goto out;
126*10946SSangeeta.Misra@Sun.COM
127*10946SSangeeta.Misra@Sun.COM if (rbuf->ic_cmd != ILBD_CMD_OK) {
128*10946SSangeeta.Misra@Sun.COM rc = *(ilb_status_t *)&rbuf->ic_data;
129*10946SSangeeta.Misra@Sun.COM goto out;
130*10946SSangeeta.Misra@Sun.COM }
131*10946SSangeeta.Misra@Sun.COM (void) memcpy(hcp, &rbuf->ic_data, sizeof (*hcp));
132*10946SSangeeta.Misra@Sun.COM
133*10946SSangeeta.Misra@Sun.COM out:
134*10946SSangeeta.Misra@Sun.COM free(ic);
135*10946SSangeeta.Misra@Sun.COM free(rbuf);
136*10946SSangeeta.Misra@Sun.COM return (rc);
137*10946SSangeeta.Misra@Sun.COM }
138*10946SSangeeta.Misra@Sun.COM
139*10946SSangeeta.Misra@Sun.COM /*
140*10946SSangeeta.Misra@Sun.COM * Walk through all health checks, will need if we implement list-hc
141*10946SSangeeta.Misra@Sun.COM */
142*10946SSangeeta.Misra@Sun.COM ilb_status_t
ilb_walk_hc(ilb_handle_t h,hc_walkerfunc_t func,void * arg)143*10946SSangeeta.Misra@Sun.COM ilb_walk_hc(ilb_handle_t h, hc_walkerfunc_t func, void *arg)
144*10946SSangeeta.Misra@Sun.COM {
145*10946SSangeeta.Misra@Sun.COM ilb_status_t rc;
146*10946SSangeeta.Misra@Sun.COM ilb_hc_info_t hc_info;
147*10946SSangeeta.Misra@Sun.COM ilbd_namelist_t *hc_names;
148*10946SSangeeta.Misra@Sun.COM ilb_comm_t ic, *rbuf;
149*10946SSangeeta.Misra@Sun.COM size_t rbufsz;
150*10946SSangeeta.Misra@Sun.COM int i;
151*10946SSangeeta.Misra@Sun.COM
152*10946SSangeeta.Misra@Sun.COM rbufsz = ILBD_MSG_SIZE;
153*10946SSangeeta.Misra@Sun.COM if ((rbuf = malloc(rbufsz)) == NULL)
154*10946SSangeeta.Misra@Sun.COM return (ILB_STATUS_ENOMEM);
155*10946SSangeeta.Misra@Sun.COM ic.ic_cmd = ILBD_RETRIEVE_HC_NAMES;
156*10946SSangeeta.Misra@Sun.COM
157*10946SSangeeta.Misra@Sun.COM rc = i_ilb_do_comm(h, &ic, sizeof (ic), rbuf, &rbufsz);
158*10946SSangeeta.Misra@Sun.COM if (rc != ILB_STATUS_OK)
159*10946SSangeeta.Misra@Sun.COM goto out;
160*10946SSangeeta.Misra@Sun.COM if (rbuf->ic_cmd != ILBD_CMD_OK) {
161*10946SSangeeta.Misra@Sun.COM rc = *(ilb_status_t *)&rbuf->ic_data;
162*10946SSangeeta.Misra@Sun.COM goto out;
163*10946SSangeeta.Misra@Sun.COM }
164*10946SSangeeta.Misra@Sun.COM
165*10946SSangeeta.Misra@Sun.COM hc_names = (ilbd_namelist_t *)&rbuf->ic_data;
166*10946SSangeeta.Misra@Sun.COM for (i = 0; i < hc_names->ilbl_count; i++) {
167*10946SSangeeta.Misra@Sun.COM rc = ilb_get_hc_info(h, hc_names->ilbl_name[i], &hc_info);
168*10946SSangeeta.Misra@Sun.COM /*
169*10946SSangeeta.Misra@Sun.COM * Since getting the list of hc names and getting the info
170*10946SSangeeta.Misra@Sun.COM * of each of them are not atomic, some hc objects may have
171*10946SSangeeta.Misra@Sun.COM * been deleted. If this is the case, just skip them.
172*10946SSangeeta.Misra@Sun.COM */
173*10946SSangeeta.Misra@Sun.COM if (rc == ILB_STATUS_ENOENT) {
174*10946SSangeeta.Misra@Sun.COM rc = ILB_STATUS_OK;
175*10946SSangeeta.Misra@Sun.COM continue;
176*10946SSangeeta.Misra@Sun.COM } else if (rc != ILB_STATUS_OK) {
177*10946SSangeeta.Misra@Sun.COM break;
178*10946SSangeeta.Misra@Sun.COM }
179*10946SSangeeta.Misra@Sun.COM rc = func(h, &hc_info, arg);
180*10946SSangeeta.Misra@Sun.COM }
181*10946SSangeeta.Misra@Sun.COM
182*10946SSangeeta.Misra@Sun.COM out:
183*10946SSangeeta.Misra@Sun.COM free(rbuf);
184*10946SSangeeta.Misra@Sun.COM return (rc);
185*10946SSangeeta.Misra@Sun.COM }
186*10946SSangeeta.Misra@Sun.COM
187*10946SSangeeta.Misra@Sun.COM static ilb_status_t
ilb_get_hc_srvs(ilb_handle_t h,const char * rulename,ilb_comm_t ** rbuf,size_t * rbufsz)188*10946SSangeeta.Misra@Sun.COM ilb_get_hc_srvs(ilb_handle_t h, const char *rulename, ilb_comm_t **rbuf,
189*10946SSangeeta.Misra@Sun.COM size_t *rbufsz)
190*10946SSangeeta.Misra@Sun.COM {
191*10946SSangeeta.Misra@Sun.COM ilb_status_t rc;
192*10946SSangeeta.Misra@Sun.COM ilb_comm_t *ic, *tmp_rbuf;
193*10946SSangeeta.Misra@Sun.COM size_t ic_sz;
194*10946SSangeeta.Misra@Sun.COM
195*10946SSangeeta.Misra@Sun.COM if ((ic = i_ilb_alloc_req(ILBD_GET_HC_SRVS, &ic_sz)) == NULL)
196*10946SSangeeta.Misra@Sun.COM return (ILB_STATUS_ENOMEM);
197*10946SSangeeta.Misra@Sun.COM *rbufsz = ILBD_MSG_SIZE;
198*10946SSangeeta.Misra@Sun.COM if ((tmp_rbuf = malloc(*rbufsz)) == NULL) {
199*10946SSangeeta.Misra@Sun.COM free(ic);
200*10946SSangeeta.Misra@Sun.COM return (ILB_STATUS_ENOMEM);
201*10946SSangeeta.Misra@Sun.COM }
202*10946SSangeeta.Misra@Sun.COM
203*10946SSangeeta.Misra@Sun.COM (void) strlcpy((char *)&ic->ic_data, rulename,
204*10946SSangeeta.Misra@Sun.COM sizeof (ilbd_name_t));
205*10946SSangeeta.Misra@Sun.COM
206*10946SSangeeta.Misra@Sun.COM rc = i_ilb_do_comm(h, ic, ic_sz, tmp_rbuf, rbufsz);
207*10946SSangeeta.Misra@Sun.COM if (rc != ILB_STATUS_OK)
208*10946SSangeeta.Misra@Sun.COM goto out;
209*10946SSangeeta.Misra@Sun.COM
210*10946SSangeeta.Misra@Sun.COM if (tmp_rbuf->ic_cmd == ILBD_CMD_OK) {
211*10946SSangeeta.Misra@Sun.COM *rbuf = tmp_rbuf;
212*10946SSangeeta.Misra@Sun.COM return (rc);
213*10946SSangeeta.Misra@Sun.COM }
214*10946SSangeeta.Misra@Sun.COM rc = *(ilb_status_t *)&tmp_rbuf->ic_data;
215*10946SSangeeta.Misra@Sun.COM out:
216*10946SSangeeta.Misra@Sun.COM free(ic);
217*10946SSangeeta.Misra@Sun.COM free(tmp_rbuf);
218*10946SSangeeta.Misra@Sun.COM *rbuf = NULL;
219*10946SSangeeta.Misra@Sun.COM return (rc);
220*10946SSangeeta.Misra@Sun.COM }
221*10946SSangeeta.Misra@Sun.COM
222*10946SSangeeta.Misra@Sun.COM ilb_status_t
ilb_walk_hc_srvs(ilb_handle_t h,hc_srvwalkerfunc_t fn,const char * rulename,void * arg)223*10946SSangeeta.Misra@Sun.COM ilb_walk_hc_srvs(ilb_handle_t h, hc_srvwalkerfunc_t fn, const char *rulename,
224*10946SSangeeta.Misra@Sun.COM void *arg)
225*10946SSangeeta.Misra@Sun.COM {
226*10946SSangeeta.Misra@Sun.COM ilb_status_t rc;
227*10946SSangeeta.Misra@Sun.COM ilb_hc_rule_srv_t *srvs;
228*10946SSangeeta.Misra@Sun.COM int i, j;
229*10946SSangeeta.Misra@Sun.COM ilb_comm_t *rbuf;
230*10946SSangeeta.Misra@Sun.COM size_t rbufsz;
231*10946SSangeeta.Misra@Sun.COM
232*10946SSangeeta.Misra@Sun.COM if (rulename != NULL) {
233*10946SSangeeta.Misra@Sun.COM rc = ilb_get_hc_srvs(h, rulename, &rbuf, &rbufsz);
234*10946SSangeeta.Misra@Sun.COM if (rc != ILB_STATUS_OK)
235*10946SSangeeta.Misra@Sun.COM return (rc);
236*10946SSangeeta.Misra@Sun.COM srvs = (ilb_hc_rule_srv_t *)&rbuf->ic_data;
237*10946SSangeeta.Misra@Sun.COM for (i = 0; i < srvs->rs_num_srvs; i++) {
238*10946SSangeeta.Misra@Sun.COM rc = fn(h, &srvs->rs_srvs[i], arg);
239*10946SSangeeta.Misra@Sun.COM if (rc != ILB_STATUS_OK)
240*10946SSangeeta.Misra@Sun.COM break;
241*10946SSangeeta.Misra@Sun.COM }
242*10946SSangeeta.Misra@Sun.COM free(rbuf);
243*10946SSangeeta.Misra@Sun.COM } else {
244*10946SSangeeta.Misra@Sun.COM ilbd_namelist_t *names;
245*10946SSangeeta.Misra@Sun.COM ilb_comm_t *srv_rbuf;
246*10946SSangeeta.Misra@Sun.COM size_t srv_rbufsz;
247*10946SSangeeta.Misra@Sun.COM
248*10946SSangeeta.Misra@Sun.COM rc = i_ilb_retrieve_rule_names(h, &rbuf, &rbufsz);
249*10946SSangeeta.Misra@Sun.COM if (rc != ILB_STATUS_OK)
250*10946SSangeeta.Misra@Sun.COM return (rc);
251*10946SSangeeta.Misra@Sun.COM names = (ilbd_namelist_t *)&rbuf->ic_data;
252*10946SSangeeta.Misra@Sun.COM
253*10946SSangeeta.Misra@Sun.COM for (i = 0; i < names->ilbl_count; i++) {
254*10946SSangeeta.Misra@Sun.COM rc = ilb_get_hc_srvs(h, names->ilbl_name[i],
255*10946SSangeeta.Misra@Sun.COM &srv_rbuf, &srv_rbufsz);
256*10946SSangeeta.Misra@Sun.COM
257*10946SSangeeta.Misra@Sun.COM /* Not all rules have HC, so reset the error to OK. */
258*10946SSangeeta.Misra@Sun.COM if (rc == ILB_STATUS_RULE_NO_HC) {
259*10946SSangeeta.Misra@Sun.COM rc = ILB_STATUS_OK;
260*10946SSangeeta.Misra@Sun.COM continue;
261*10946SSangeeta.Misra@Sun.COM } else if (rc != ILB_STATUS_OK) {
262*10946SSangeeta.Misra@Sun.COM break;
263*10946SSangeeta.Misra@Sun.COM }
264*10946SSangeeta.Misra@Sun.COM
265*10946SSangeeta.Misra@Sun.COM srvs = (ilb_hc_rule_srv_t *)&srv_rbuf->ic_data;
266*10946SSangeeta.Misra@Sun.COM for (j = 0; j < srvs->rs_num_srvs; j++) {
267*10946SSangeeta.Misra@Sun.COM rc = fn(h, &srvs->rs_srvs[j], arg);
268*10946SSangeeta.Misra@Sun.COM if (rc != ILB_STATUS_OK)
269*10946SSangeeta.Misra@Sun.COM break;
270*10946SSangeeta.Misra@Sun.COM }
271*10946SSangeeta.Misra@Sun.COM free(srv_rbuf);
272*10946SSangeeta.Misra@Sun.COM }
273*10946SSangeeta.Misra@Sun.COM free(rbuf);
274*10946SSangeeta.Misra@Sun.COM }
275*10946SSangeeta.Misra@Sun.COM return (rc);
276*10946SSangeeta.Misra@Sun.COM }
277