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 * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
22 * Use is subject to license terms.
23 */
24
25 /*
26 * IPMP administrative interfaces (see PSARC/2007/272).
27 */
28
29 #include <assert.h>
30 #include <errno.h>
31 #include <string.h>
32 #include <unistd.h>
33 #include <sys/time.h>
34 #include <sys/types.h>
35
36 #include "ipmp_impl.h"
37 #include "ipmp_mpathd.h"
38 #include "ipmp_admin.h"
39
40 static int
ipmp_command(ipmp_handle_t handle,const void * req,uint_t reqsize)41 ipmp_command(ipmp_handle_t handle, const void *req, uint_t reqsize)
42 {
43 ipmp_state_t *statep = (ipmp_state_t *)handle;
44 mi_result_t result;
45 struct timeval end;
46 int save_errno;
47 int retval;
48
49 if (gettimeofday(&end, NULL) == -1)
50 return (IPMP_FAILURE);
51 end.tv_sec += IPMP_REQTIMEOUT;
52
53 assert(statep->st_fd == -1);
54 retval = ipmp_connect(&statep->st_fd);
55 if (retval != IPMP_SUCCESS)
56 return (retval);
57
58 retval = ipmp_write(statep->st_fd, req, reqsize);
59 if (retval != IPMP_SUCCESS)
60 goto out;
61
62 retval = ipmp_read(statep->st_fd, &result, sizeof (result), &end);
63 if (retval != IPMP_SUCCESS)
64 goto out;
65
66 errno = result.me_sys_error;
67 retval = result.me_mpathd_error;
68 out:
69 save_errno = errno;
70 (void) close(statep->st_fd);
71 statep->st_fd = -1;
72 errno = save_errno;
73 return (retval);
74 }
75
76 int
ipmp_offline(ipmp_handle_t handle,const char * ifname,uint_t minred)77 ipmp_offline(ipmp_handle_t handle, const char *ifname, uint_t minred)
78 {
79 mi_offline_t mio;
80
81 mio.mio_command = MI_OFFLINE;
82 mio.mio_min_redundancy = minred;
83 (void) strlcpy(mio.mio_ifname, ifname, LIFNAMSIZ);
84 return (ipmp_command(handle, &mio, sizeof (mio)));
85 }
86
87 int
ipmp_undo_offline(ipmp_handle_t handle,const char * ifname)88 ipmp_undo_offline(ipmp_handle_t handle, const char *ifname)
89 {
90 mi_undo_offline_t miu;
91
92 miu.miu_command = MI_UNDO_OFFLINE;
93 (void) strlcpy(miu.miu_ifname, ifname, LIFNAMSIZ);
94 return (ipmp_command(handle, &miu, sizeof (miu)));
95 }
96
97 int
ipmp_ping_daemon(ipmp_handle_t handle)98 ipmp_ping_daemon(ipmp_handle_t handle)
99 {
100 mi_ping_t mip;
101
102 mip.mip_command = MI_PING;
103 return (ipmp_command(handle, &mip, sizeof (mip)));
104 }
105