e11c3f44f531fdff80941ce57c065d2ae861cefcmeem/*
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem * CDDL HEADER START
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem *
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem * The contents of this file are subject to the terms of the
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem * Common Development and Distribution License (the "License").
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem * You may not use this file except in compliance with the License.
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem *
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem * or http://www.opensolaris.org/os/licensing.
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem * See the License for the specific language governing permissions
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem * and limitations under the License.
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem *
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem * When distributing Covered Code, include this CDDL HEADER in each
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem * If applicable, add the following below this CDDL HEADER, with the
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem * fields enclosed by brackets "[]" replaced with your own identifying
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem * information: Portions Copyright [yyyy] [name of copyright owner]
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem *
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem * CDDL HEADER END
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem *
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem * Use is subject to license terms.
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem */
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem/*
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem * IPMP administrative interfaces (see PSARC/2007/272).
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem */
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem#include <assert.h>
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem#include <errno.h>
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem#include <string.h>
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem#include <unistd.h>
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem#include <sys/time.h>
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem#include <sys/types.h>
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem#include "ipmp_impl.h"
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem#include "ipmp_mpathd.h"
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem#include "ipmp_admin.h"
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem
e11c3f44f531fdff80941ce57c065d2ae861cefcmeemstatic int
e11c3f44f531fdff80941ce57c065d2ae861cefcmeemipmp_command(ipmp_handle_t handle, const void *req, uint_t reqsize)
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem{
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem ipmp_state_t *statep = (ipmp_state_t *)handle;
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem mi_result_t result;
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem struct timeval end;
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem int save_errno;
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem int retval;
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem if (gettimeofday(&end, NULL) == -1)
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem return (IPMP_FAILURE);
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem end.tv_sec += IPMP_REQTIMEOUT;
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem assert(statep->st_fd == -1);
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem retval = ipmp_connect(&statep->st_fd);
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem if (retval != IPMP_SUCCESS)
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem return (retval);
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem retval = ipmp_write(statep->st_fd, req, reqsize);
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem if (retval != IPMP_SUCCESS)
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem goto out;
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem retval = ipmp_read(statep->st_fd, &result, sizeof (result), &end);
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem if (retval != IPMP_SUCCESS)
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem goto out;
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem errno = result.me_sys_error;
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem retval = result.me_mpathd_error;
e11c3f44f531fdff80941ce57c065d2ae861cefcmeemout:
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem save_errno = errno;
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem (void) close(statep->st_fd);
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem statep->st_fd = -1;
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem errno = save_errno;
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem return (retval);
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem}
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem
e11c3f44f531fdff80941ce57c065d2ae861cefcmeemint
e11c3f44f531fdff80941ce57c065d2ae861cefcmeemipmp_offline(ipmp_handle_t handle, const char *ifname, uint_t minred)
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem{
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem mi_offline_t mio;
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem mio.mio_command = MI_OFFLINE;
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem mio.mio_min_redundancy = minred;
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem (void) strlcpy(mio.mio_ifname, ifname, LIFNAMSIZ);
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem return (ipmp_command(handle, &mio, sizeof (mio)));
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem}
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem
e11c3f44f531fdff80941ce57c065d2ae861cefcmeemint
e11c3f44f531fdff80941ce57c065d2ae861cefcmeemipmp_undo_offline(ipmp_handle_t handle, const char *ifname)
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem{
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem mi_undo_offline_t miu;
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem miu.miu_command = MI_UNDO_OFFLINE;
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem (void) strlcpy(miu.miu_ifname, ifname, LIFNAMSIZ);
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem return (ipmp_command(handle, &miu, sizeof (miu)));
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem}
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem
e11c3f44f531fdff80941ce57c065d2ae861cefcmeemint
e11c3f44f531fdff80941ce57c065d2ae861cefcmeemipmp_ping_daemon(ipmp_handle_t handle)
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem{
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem mi_ping_t mip;
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem mip.mip_command = MI_PING;
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem return (ipmp_command(handle, &mip, sizeof (mip)));
e11c3f44f531fdff80941ce57c065d2ae861cefcmeem}