d62bc4badc1c1f1549c961cfb8b420e650e1272byz/*
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * CDDL HEADER START
d62bc4badc1c1f1549c961cfb8b420e650e1272byz *
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * The contents of this file are subject to the terms of the
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Common Development and Distribution License (the "License").
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * You may not use this file except in compliance with the License.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz *
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * or http://www.opensolaris.org/os/licensing.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * See the License for the specific language governing permissions
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * and limitations under the License.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz *
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * When distributing Covered Code, include this CDDL HEADER in each
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * If applicable, add the following below this CDDL HEADER, with the
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * fields enclosed by brackets "[]" replaced with your own identifying
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * information: Portions Copyright [yyyy] [name of copyright owner]
d62bc4badc1c1f1549c961cfb8b420e650e1272byz *
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * CDDL HEADER END
d62bc4badc1c1f1549c961cfb8b420e650e1272byz */
d62bc4badc1c1f1549c961cfb8b420e650e1272byz/*
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz */
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz#include <door.h>
d62bc4badc1c1f1549c961cfb8b420e650e1272byz#include <errno.h>
d62bc4badc1c1f1549c961cfb8b420e650e1272byz#include <assert.h>
d62bc4badc1c1f1549c961cfb8b420e650e1272byz#include <stdio.h>
d62bc4badc1c1f1549c961cfb8b420e650e1272byz#include <stdlib.h>
d62bc4badc1c1f1549c961cfb8b420e650e1272byz#include <unistd.h>
d62bc4badc1c1f1549c961cfb8b420e650e1272byz#include <string.h>
d62bc4badc1c1f1549c961cfb8b420e650e1272byz#include <strings.h>
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy#include <zone.h>
d62bc4badc1c1f1549c961cfb8b420e650e1272byz#include <sys/types.h>
d62bc4badc1c1f1549c961cfb8b420e650e1272byz#include <sys/stat.h>
d62bc4badc1c1f1549c961cfb8b420e650e1272byz#include <sys/aggr.h>
82a2fc4751cef28c0bdc327d02012bf8796083b9James Carlson#include <sys/mman.h>
d62bc4badc1c1f1549c961cfb8b420e650e1272byz#include <fcntl.h>
d62bc4badc1c1f1549c961cfb8b420e650e1272byz#include <libdladm.h>
d62bc4badc1c1f1549c961cfb8b420e650e1272byz#include <libdladm_impl.h>
d62bc4badc1c1f1549c961cfb8b420e650e1272byz#include <libdllink.h>
d62bc4badc1c1f1549c961cfb8b420e650e1272byz#include <libdlmgmt.h>
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz/*
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Table of data type sizes indexed by dladm_datatype_t.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz */
d62bc4badc1c1f1549c961cfb8b420e650e1272byzstatic size_t dladm_datatype_size[] = {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz 0, /* DLADM_TYPE_STR, use strnlen() */
d62bc4badc1c1f1549c961cfb8b420e650e1272byz sizeof (boolean_t), /* DLADM_TYPE_BOOLEAN */
d62bc4badc1c1f1549c961cfb8b420e650e1272byz sizeof (uint64_t) /* DLADM_TYPE_UINT64 */
d62bc4badc1c1f1549c961cfb8b420e650e1272byz};
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byzstatic dladm_status_t
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeydladm_door_call(dladm_handle_t handle, void *arg, size_t asize, void *rbuf,
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou size_t *rsizep)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz{
d62bc4badc1c1f1549c961cfb8b420e650e1272byz door_arg_t darg;
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey int door_fd;
f689bed18bbb72c93b14a451e959b18f7ccfb7d1Rishi Srivatsavai dladm_status_t status;
f689bed18bbb72c93b14a451e959b18f7ccfb7d1Rishi Srivatsavai boolean_t reopen = B_FALSE;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz darg.data_ptr = arg;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz darg.data_size = asize;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz darg.desc_ptr = NULL;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz darg.desc_num = 0;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz darg.rbuf = rbuf;
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou darg.rsize = *rsizep;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
f689bed18bbb72c93b14a451e959b18f7ccfb7d1Rishi Srivatsavaireopen:
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey /* The door descriptor is opened if it isn't already */
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey if ((status = dladm_door_fd(handle, &door_fd)) != DLADM_STATUS_OK)
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey return (status);
f689bed18bbb72c93b14a451e959b18f7ccfb7d1Rishi Srivatsavai if (door_call(door_fd, &darg) == -1) {
f689bed18bbb72c93b14a451e959b18f7ccfb7d1Rishi Srivatsavai /*
f689bed18bbb72c93b14a451e959b18f7ccfb7d1Rishi Srivatsavai * Stale door descriptor is possible if dlmgmtd was re-started
f689bed18bbb72c93b14a451e959b18f7ccfb7d1Rishi Srivatsavai * since last door_fd open so try re-opening door file.
f689bed18bbb72c93b14a451e959b18f7ccfb7d1Rishi Srivatsavai */
f689bed18bbb72c93b14a451e959b18f7ccfb7d1Rishi Srivatsavai if (!reopen && errno == EBADF) {
f689bed18bbb72c93b14a451e959b18f7ccfb7d1Rishi Srivatsavai (void) close(handle->door_fd);
f689bed18bbb72c93b14a451e959b18f7ccfb7d1Rishi Srivatsavai handle->door_fd = -1;
f689bed18bbb72c93b14a451e959b18f7ccfb7d1Rishi Srivatsavai reopen = B_TRUE;
f689bed18bbb72c93b14a451e959b18f7ccfb7d1Rishi Srivatsavai goto reopen;
f689bed18bbb72c93b14a451e959b18f7ccfb7d1Rishi Srivatsavai }
d62bc4badc1c1f1549c961cfb8b420e650e1272byz status = dladm_errno2status(errno);
f689bed18bbb72c93b14a451e959b18f7ccfb7d1Rishi Srivatsavai }
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (status != DLADM_STATUS_OK)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (status);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (darg.rbuf != rbuf) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz /*
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * The size of the input rbuf is not big enough so that
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou * the door allocate the rbuf itself. In this case, return
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou * the required size to the caller.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz */
d62bc4badc1c1f1549c961cfb8b420e650e1272byz (void) munmap(darg.rbuf, darg.rsize);
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou *rsizep = darg.rsize;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (DLADM_STATUS_TOOSMALL);
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou } else if (darg.rsize != *rsizep) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (DLADM_STATUS_FAILED);
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou }
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
024b0a258461f282a92b1b1283c3b8b083f9f33fseb return (dladm_errno2status(((dlmgmt_retval_t *)rbuf)->lr_err));
d62bc4badc1c1f1549c961cfb8b420e650e1272byz}
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz/*
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Allocate a new linkid with the given name. Return the new linkid.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz */
d62bc4badc1c1f1549c961cfb8b420e650e1272byzdladm_status_t
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeydladm_create_datalink_id(dladm_handle_t handle, const char *link,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey datalink_class_t class, uint32_t media, uint32_t flags,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey datalink_id_t *linkidp)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz{
024b0a258461f282a92b1b1283c3b8b083f9f33fseb dlmgmt_door_createid_t createid;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dlmgmt_createid_retval_t retval;
024b0a258461f282a92b1b1283c3b8b083f9f33fseb uint32_t dlmgmt_flags;
024b0a258461f282a92b1b1283c3b8b083f9f33fseb dladm_status_t status;
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou size_t sz = sizeof (retval);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
024b0a258461f282a92b1b1283c3b8b083f9f33fseb if (link == NULL || class == DATALINK_CLASS_ALL ||
d62bc4badc1c1f1549c961cfb8b420e650e1272byz !(flags & (DLADM_OPT_ACTIVE | DLADM_OPT_PERSIST)) ||
d62bc4badc1c1f1549c961cfb8b420e650e1272byz linkidp == NULL) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (DLADM_STATUS_BADARG);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz }
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dlmgmt_flags = (flags & DLADM_OPT_ACTIVE) ? DLMGMT_ACTIVE : 0;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dlmgmt_flags |= (flags & DLADM_OPT_PERSIST) ? DLMGMT_PERSIST : 0;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz (void) strlcpy(createid.ld_link, link, MAXLINKNAMELEN);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz createid.ld_class = class;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz createid.ld_media = media;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz createid.ld_flags = dlmgmt_flags;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz createid.ld_cmd = DLMGMT_CMD_CREATE_LINKID;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz createid.ld_prefix = (flags & DLADM_OPT_PREFIX);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey if ((status = dladm_door_call(handle, &createid, sizeof (createid),
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou &retval, &sz)) == DLADM_STATUS_OK) {
024b0a258461f282a92b1b1283c3b8b083f9f33fseb *linkidp = retval.lr_linkid;
024b0a258461f282a92b1b1283c3b8b083f9f33fseb }
024b0a258461f282a92b1b1283c3b8b083f9f33fseb return (status);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz}
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz/*
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Destroy the given link ID.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz */
d62bc4badc1c1f1549c961cfb8b420e650e1272byzdladm_status_t
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeydladm_destroy_datalink_id(dladm_handle_t handle, datalink_id_t linkid,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey uint32_t flags)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz{
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dlmgmt_door_destroyid_t destroyid;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dlmgmt_destroyid_retval_t retval;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz uint32_t dlmgmt_flags;
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou size_t sz = sizeof (retval);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dlmgmt_flags = (flags & DLADM_OPT_ACTIVE) ? DLMGMT_ACTIVE : 0;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dlmgmt_flags |= ((flags & DLADM_OPT_PERSIST) ? DLMGMT_PERSIST : 0);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz destroyid.ld_cmd = DLMGMT_CMD_DESTROY_LINKID;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz destroyid.ld_linkid = linkid;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz destroyid.ld_flags = dlmgmt_flags;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou return (dladm_door_call(handle, &destroyid, sizeof (destroyid),
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou &retval, &sz));
d62bc4badc1c1f1549c961cfb8b420e650e1272byz}
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz/*
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Remap a given link ID to a new name.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz */
d62bc4badc1c1f1549c961cfb8b420e650e1272byzdladm_status_t
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeydladm_remap_datalink_id(dladm_handle_t handle, datalink_id_t linkid,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey const char *link)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz{
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dlmgmt_door_remapid_t remapid;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dlmgmt_remapid_retval_t retval;
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou size_t sz = sizeof (retval);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz remapid.ld_cmd = DLMGMT_CMD_REMAP_LINKID;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz remapid.ld_linkid = linkid;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz (void) strlcpy(remapid.ld_link, link, MAXLINKNAMELEN);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou return (dladm_door_call(handle, &remapid, sizeof (remapid),
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou &retval, &sz));
d62bc4badc1c1f1549c961cfb8b420e650e1272byz}
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz/*
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Make a given link ID active.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz */
d62bc4badc1c1f1549c961cfb8b420e650e1272byzdladm_status_t
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeydladm_up_datalink_id(dladm_handle_t handle, datalink_id_t linkid)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz{
024b0a258461f282a92b1b1283c3b8b083f9f33fseb dlmgmt_door_upid_t upid;
024b0a258461f282a92b1b1283c3b8b083f9f33fseb dlmgmt_upid_retval_t retval;
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou size_t sz = sizeof (retval);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz upid.ld_cmd = DLMGMT_CMD_UP_LINKID;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz upid.ld_linkid = linkid;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou return (dladm_door_call(handle, &upid, sizeof (upid), &retval, &sz));
d62bc4badc1c1f1549c961cfb8b420e650e1272byz}
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz/*
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Create a new link with the given name. Return the new link's handle
d62bc4badc1c1f1549c961cfb8b420e650e1272byz */
d62bc4badc1c1f1549c961cfb8b420e650e1272byzdladm_status_t
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeydladm_create_conf(dladm_handle_t handle, const char *link, datalink_id_t linkid,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz datalink_class_t class, uint32_t media, dladm_conf_t *confp)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz{
024b0a258461f282a92b1b1283c3b8b083f9f33fseb dlmgmt_door_createconf_t createconf;
024b0a258461f282a92b1b1283c3b8b083f9f33fseb dlmgmt_createconf_retval_t retval;
024b0a258461f282a92b1b1283c3b8b083f9f33fseb dladm_status_t status;
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou size_t sz = sizeof (retval);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
024b0a258461f282a92b1b1283c3b8b083f9f33fseb if (link == NULL || confp == NULL)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (DLADM_STATUS_BADARG);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz (void) strlcpy(createconf.ld_link, link, MAXLINKNAMELEN);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz createconf.ld_class = class;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz createconf.ld_media = media;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz createconf.ld_linkid = linkid;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz createconf.ld_cmd = DLMGMT_CMD_CREATECONF;
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou confp->ds_confid = DLADM_INVALID_CONF;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey if ((status = dladm_door_call(handle, &createconf, sizeof (createconf),
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou &retval, &sz)) == DLADM_STATUS_OK) {
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou confp->ds_readonly = B_FALSE;
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou confp->ds_confid = retval.lr_confid;
024b0a258461f282a92b1b1283c3b8b083f9f33fseb }
024b0a258461f282a92b1b1283c3b8b083f9f33fseb return (status);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz}
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz/*
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * An active physical link reported by the dlmgmtd daemon might not be active
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * anymore as this link might be removed during system shutdown. Check its
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * real status by calling dladm_phys_info().
d62bc4badc1c1f1549c961cfb8b420e650e1272byz */
d62bc4badc1c1f1549c961cfb8b420e650e1272byzdladm_status_t
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeyi_dladm_phys_status(dladm_handle_t handle, datalink_id_t linkid,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey uint32_t *flagsp)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz{
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dladm_phys_attr_t dpa;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dladm_status_t status;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz assert((*flagsp) & DLMGMT_ACTIVE);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey status = dladm_phys_info(handle, linkid, &dpa, DLADM_OPT_ACTIVE);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (status == DLADM_STATUS_NOTFOUND) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz /*
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * No active status, this link was removed. Update its status
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * in the daemon and delete all active linkprops.
2d4eecfa187a743d7823497136e21cb0568eb77dCathy Zhou *
2d4eecfa187a743d7823497136e21cb0568eb77dCathy Zhou * Note that the operation could fail. If it does, return
2d4eecfa187a743d7823497136e21cb0568eb77dCathy Zhou * failure now since otherwise dladm_set_linkprop() might
2d4eecfa187a743d7823497136e21cb0568eb77dCathy Zhou * call back to i_dladm_phys_status() recursively.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz */
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey if ((status = dladm_destroy_datalink_id(handle, linkid,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey DLADM_OPT_ACTIVE)) != DLADM_STATUS_OK)
2d4eecfa187a743d7823497136e21cb0568eb77dCathy Zhou return (status);
2d4eecfa187a743d7823497136e21cb0568eb77dCathy Zhou
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey (void) dladm_set_linkprop(handle, linkid, NULL, NULL, 0,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz DLADM_OPT_ACTIVE);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz (*flagsp) &= ~DLMGMT_ACTIVE;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz status = DLADM_STATUS_OK;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz }
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (status);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz}
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz/*
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Walk each entry in the data link configuration repository and
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * call fn on the linkid and arg.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz */
d62bc4badc1c1f1549c961cfb8b420e650e1272byzdladm_status_t
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeydladm_walk_datalink_id(int (*fn)(dladm_handle_t, datalink_id_t, void *),
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey dladm_handle_t handle, void *argp, datalink_class_t class,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey datalink_media_t dmedia, uint32_t flags)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz{
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dlmgmt_door_getnext_t getnext;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dlmgmt_getnext_retval_t retval;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz uint32_t dlmgmt_flags;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz datalink_id_t linkid = DATALINK_INVALID_LINKID;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dladm_status_t status = DLADM_STATUS_OK;
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou size_t sz = sizeof (retval);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (fn == NULL)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (DLADM_STATUS_BADARG);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dlmgmt_flags = (flags & DLADM_OPT_ACTIVE) ? DLMGMT_ACTIVE : 0;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dlmgmt_flags |= ((flags & DLADM_OPT_PERSIST) ? DLMGMT_PERSIST : 0);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz getnext.ld_cmd = DLMGMT_CMD_GETNEXT;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz getnext.ld_class = class;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz getnext.ld_dmedia = dmedia;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz getnext.ld_flags = dlmgmt_flags;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz do {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz getnext.ld_linkid = linkid;
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey if ((status = dladm_door_call(handle, &getnext,
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou sizeof (getnext), &retval, &sz)) != DLADM_STATUS_OK) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz /*
7363c184fede3193ea9aaf8446644dfaefdad5cbCathy Zhou * Done with walking. If no next datalink is found,
7363c184fede3193ea9aaf8446644dfaefdad5cbCathy Zhou * return success.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz */
7363c184fede3193ea9aaf8446644dfaefdad5cbCathy Zhou if (status == DLADM_STATUS_NOTFOUND)
7363c184fede3193ea9aaf8446644dfaefdad5cbCathy Zhou status = DLADM_STATUS_OK;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz break;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz }
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz linkid = retval.lr_linkid;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if ((retval.lr_class == DATALINK_CLASS_PHYS) &&
d62bc4badc1c1f1549c961cfb8b420e650e1272byz (retval.lr_flags & DLMGMT_ACTIVE)) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz /*
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * An active physical link reported by the dlmgmtd
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * daemon might not be active anymore. Check its
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * real status.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz */
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey if (i_dladm_phys_status(handle, linkid,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey &retval.lr_flags) != DLADM_STATUS_OK) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz continue;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz }
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (!(dlmgmt_flags & retval.lr_flags))
d62bc4badc1c1f1549c961cfb8b420e650e1272byz continue;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz }
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey if (fn(handle, linkid, argp) == DLADM_WALK_TERMINATE)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz break;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz } while (linkid != DATALINK_INVALID_LINKID);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (status);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz}
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz/*
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou * Get a handle of a copy of the link configuration (kept in the daemon)
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou * for the given link so it can be updated later by dladm_write_conf().
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou */
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhoudladm_status_t
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhoudladm_open_conf(dladm_handle_t handle, datalink_id_t linkid,
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou dladm_conf_t *confp)
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou{
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou dlmgmt_door_openconf_t openconf;
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou dlmgmt_openconf_retval_t retval;
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou dladm_status_t status;
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou size_t sz;
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou if (linkid == DATALINK_INVALID_LINKID || confp == NULL)
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou return (DLADM_STATUS_BADARG);
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou sz = sizeof (retval);
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou openconf.ld_linkid = linkid;
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou openconf.ld_cmd = DLMGMT_CMD_OPENCONF;
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou confp->ds_confid = DLADM_INVALID_CONF;
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou if ((status = dladm_door_call(handle, &openconf,
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou sizeof (openconf), &retval, &sz)) == DLADM_STATUS_OK) {
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou confp->ds_readonly = B_FALSE;
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou confp->ds_confid = retval.lr_confid;
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou }
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou return (status);
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou}
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou/*
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou * Get the handle of a local snapshot of the link configuration. Note that
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou * any operations with this handle are read-only, i.e., one can not update
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou * the configuration with this handle.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz */
d62bc4badc1c1f1549c961cfb8b420e650e1272byzdladm_status_t
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhoudladm_getsnap_conf(dladm_handle_t handle, datalink_id_t linkid,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey dladm_conf_t *confp)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz{
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou dlmgmt_door_getconfsnapshot_t snapshot;
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou dlmgmt_getconfsnapshot_retval_t *retvalp;
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou char *nvlbuf;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dladm_status_t status;
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou int err;
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou size_t sz;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (linkid == DATALINK_INVALID_LINKID || confp == NULL)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (DLADM_STATUS_BADARG);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou sz = sizeof (dlmgmt_getconfsnapshot_retval_t);
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou snapshot.ld_linkid = linkid;
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou snapshot.ld_cmd = DLMGMT_CMD_GETCONFSNAPSHOT;
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhouagain:
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou if ((retvalp = malloc(sz)) == NULL)
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou return (DLADM_STATUS_NOMEM);
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou if ((status = dladm_door_call(handle, &snapshot, sizeof (snapshot),
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou retvalp, &sz)) == DLADM_STATUS_TOOSMALL) {
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou free(retvalp);
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou goto again;
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou }
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou if (status != DLADM_STATUS_OK) {
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou free(retvalp);
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou return (status);
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou }
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou confp->ds_readonly = B_TRUE;
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou nvlbuf = (char *)retvalp + sizeof (dlmgmt_getconfsnapshot_retval_t);
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou if ((err = nvlist_unpack(nvlbuf, retvalp->lr_nvlsz,
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou &(confp->ds_nvl), NV_ENCODE_NATIVE)) != 0) {
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou status = dladm_errno2status(err);
024b0a258461f282a92b1b1283c3b8b083f9f33fseb }
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou free(retvalp);
024b0a258461f282a92b1b1283c3b8b083f9f33fseb return (status);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz}
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz/*
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Commit the given link to the data link configuration repository so
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * that it will persist across reboots.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz */
d62bc4badc1c1f1549c961cfb8b420e650e1272byzdladm_status_t
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeydladm_write_conf(dladm_handle_t handle, dladm_conf_t conf)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz{
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dlmgmt_door_writeconf_t writeconf;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dlmgmt_writeconf_retval_t retval;
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou size_t sz = sizeof (retval);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou if (conf.ds_confid == DLADM_INVALID_CONF)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (DLADM_STATUS_BADARG);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou if (conf.ds_readonly)
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou return (DLADM_STATUS_DENIED);
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou
d62bc4badc1c1f1549c961cfb8b420e650e1272byz writeconf.ld_cmd = DLMGMT_CMD_WRITECONF;
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou writeconf.ld_confid = conf.ds_confid;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou return (dladm_door_call(handle, &writeconf, sizeof (writeconf),
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou &retval, &sz));
d62bc4badc1c1f1549c961cfb8b420e650e1272byz}
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz/*
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou * Given a dladm_conf_t, get the specific configuration field
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou *
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou * If the specified dladm_conf_t is a read-only snapshot of the configuration,
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou * get a specific link propertie from that snapshot (nvl), otherwise, get
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou * the link protperty from the dlmgmtd daemon using the given confid.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz */
d62bc4badc1c1f1549c961cfb8b420e650e1272byzdladm_status_t
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeydladm_get_conf_field(dladm_handle_t handle, dladm_conf_t conf, const char *attr,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey void *attrval, size_t attrsz)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz{
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou dladm_status_t status = DLADM_STATUS_OK;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou if (attrval == NULL || attrsz == 0 || attr == NULL)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (DLADM_STATUS_BADARG);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou if (conf.ds_readonly) {
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou uchar_t *oattrval;
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou uint32_t oattrsz;
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou int err;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou if ((err = nvlist_lookup_byte_array(conf.ds_nvl, (char *)attr,
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou &oattrval, &oattrsz)) != 0) {
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou return (dladm_errno2status(err));
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou }
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou if (oattrsz > attrsz)
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou return (DLADM_STATUS_TOOSMALL);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou bcopy(oattrval, attrval, oattrsz);
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou } else {
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou dlmgmt_door_getattr_t getattr;
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou dlmgmt_getattr_retval_t retval;
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou size_t sz = sizeof (retval);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou if (conf.ds_confid == DLADM_INVALID_CONF)
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou return (DLADM_STATUS_BADARG);
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou getattr.ld_cmd = DLMGMT_CMD_GETATTR;
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou getattr.ld_confid = conf.ds_confid;
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou (void) strlcpy(getattr.ld_attr, attr, MAXLINKATTRLEN);
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou if ((status = dladm_door_call(handle, &getattr,
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou sizeof (getattr), &retval, &sz)) != DLADM_STATUS_OK) {
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou return (status);
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou }
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou if (retval.lr_attrsz > attrsz)
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou return (DLADM_STATUS_TOOSMALL);
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou bcopy(retval.lr_attrval, attrval, retval.lr_attrsz);
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou }
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou return (status);
62ee1d25bffb3d6d74798efe1199f7e86a29a14eArtem Kachitchkine}
62ee1d25bffb3d6d74798efe1199f7e86a29a14eArtem Kachitchkine
62ee1d25bffb3d6d74798efe1199f7e86a29a14eArtem Kachitchkine/*
62ee1d25bffb3d6d74798efe1199f7e86a29a14eArtem Kachitchkine * Get next property attribute from data link configuration repository.
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou * If last_attr is "", return the first property.
62ee1d25bffb3d6d74798efe1199f7e86a29a14eArtem Kachitchkine */
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou/* ARGSUSED */
62ee1d25bffb3d6d74798efe1199f7e86a29a14eArtem Kachitchkinedladm_status_t
62ee1d25bffb3d6d74798efe1199f7e86a29a14eArtem Kachitchkinedladm_getnext_conf_linkprop(dladm_handle_t handle, dladm_conf_t conf,
62ee1d25bffb3d6d74798efe1199f7e86a29a14eArtem Kachitchkine const char *last_attr, char *attr, void *attrval, size_t attrsz,
62ee1d25bffb3d6d74798efe1199f7e86a29a14eArtem Kachitchkine size_t *attrszp)
62ee1d25bffb3d6d74798efe1199f7e86a29a14eArtem Kachitchkine{
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou nvlist_t *nvl = conf.ds_nvl;
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou nvpair_t *last = NULL, *nvp;
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou uchar_t *oattrval;
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou uint32_t oattrsz;
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou int err;
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou if (nvl == NULL || attrval == NULL || attrsz == 0 || attr == NULL ||
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou !conf.ds_readonly)
62ee1d25bffb3d6d74798efe1199f7e86a29a14eArtem Kachitchkine return (DLADM_STATUS_BADARG);
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou while ((nvp = nvlist_next_nvpair(nvl, last)) != NULL) {
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou if (last_attr[0] == '\0')
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou break;
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou if (last != NULL && strcmp(last_attr, nvpair_name(last)) == 0)
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou break;
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou last = nvp;
62ee1d25bffb3d6d74798efe1199f7e86a29a14eArtem Kachitchkine }
62ee1d25bffb3d6d74798efe1199f7e86a29a14eArtem Kachitchkine
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou if (nvp == NULL)
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou return (DLADM_STATUS_NOTFOUND);
62ee1d25bffb3d6d74798efe1199f7e86a29a14eArtem Kachitchkine
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou if ((err = nvpair_value_byte_array(nvp, (uchar_t **)&oattrval,
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou &oattrsz)) != NULL) {
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou return (dladm_errno2status(err));
62ee1d25bffb3d6d74798efe1199f7e86a29a14eArtem Kachitchkine }
62ee1d25bffb3d6d74798efe1199f7e86a29a14eArtem Kachitchkine
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou *attrszp = oattrsz;
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou if (oattrsz > attrsz)
62ee1d25bffb3d6d74798efe1199f7e86a29a14eArtem Kachitchkine return (DLADM_STATUS_TOOSMALL);
62ee1d25bffb3d6d74798efe1199f7e86a29a14eArtem Kachitchkine
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou (void) strlcpy(attr, nvpair_name(nvp), MAXLINKATTRLEN);
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou bcopy(oattrval, attrval, oattrsz);
024b0a258461f282a92b1b1283c3b8b083f9f33fseb return (DLADM_STATUS_OK);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz}
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz/*
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Get the link ID that is associated with the given name.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz */
d62bc4badc1c1f1549c961cfb8b420e650e1272byzdladm_status_t
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeydladm_name2info(dladm_handle_t handle, const char *link, datalink_id_t *linkidp,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey uint32_t *flagp, datalink_class_t *classp, uint32_t *mediap)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz{
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dlmgmt_door_getlinkid_t getlinkid;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dlmgmt_getlinkid_retval_t retval;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz datalink_id_t linkid;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dladm_status_t status;
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou size_t sz = sizeof (retval);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz getlinkid.ld_cmd = DLMGMT_CMD_GETLINKID;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz (void) strlcpy(getlinkid.ld_link, link, MAXLINKNAMELEN);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey if ((status = dladm_door_call(handle, &getlinkid, sizeof (getlinkid),
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou &retval, &sz)) != DLADM_STATUS_OK) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (status);
024b0a258461f282a92b1b1283c3b8b083f9f33fseb }
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz linkid = retval.lr_linkid;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (retval.lr_class == DATALINK_CLASS_PHYS &&
d62bc4badc1c1f1549c961cfb8b420e650e1272byz retval.lr_flags & DLMGMT_ACTIVE) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz /*
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * An active physical link reported by the dlmgmtd daemon
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * might not be active anymore. Check and set its real status.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz */
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey status = i_dladm_phys_status(handle, linkid, &retval.lr_flags);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (status != DLADM_STATUS_OK)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (status);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz }
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (linkidp != NULL)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz *linkidp = linkid;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (flagp != NULL) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz *flagp = retval.lr_flags & DLMGMT_ACTIVE ? DLADM_OPT_ACTIVE : 0;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz *flagp |= (retval.lr_flags & DLMGMT_PERSIST) ?
d62bc4badc1c1f1549c961cfb8b420e650e1272byz DLADM_OPT_PERSIST : 0;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz }
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (classp != NULL)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz *classp = retval.lr_class;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (mediap != NULL)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz *mediap = retval.lr_media;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (DLADM_STATUS_OK);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz}
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz/*
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Get the link name that is associated with the given id.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz */
d62bc4badc1c1f1549c961cfb8b420e650e1272byzdladm_status_t
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeydladm_datalink_id2info(dladm_handle_t handle, datalink_id_t linkid,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey uint32_t *flagp, datalink_class_t *classp, uint32_t *mediap, char *link,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey size_t len)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz{
024b0a258461f282a92b1b1283c3b8b083f9f33fseb dlmgmt_door_getname_t getname;
024b0a258461f282a92b1b1283c3b8b083f9f33fseb dlmgmt_getname_retval_t retval;
024b0a258461f282a92b1b1283c3b8b083f9f33fseb dladm_status_t status;
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou size_t sz = sizeof (retval);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if ((linkid == DATALINK_INVALID_LINKID) || (link != NULL && len == 0) ||
d62bc4badc1c1f1549c961cfb8b420e650e1272byz (link == NULL && len != 0)) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (DLADM_STATUS_BADARG);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz }
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz getname.ld_cmd = DLMGMT_CMD_GETNAME;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz getname.ld_linkid = linkid;
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey if ((status = dladm_door_call(handle, &getname, sizeof (getname),
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou &retval, &sz)) != DLADM_STATUS_OK) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (status);
024b0a258461f282a92b1b1283c3b8b083f9f33fseb }
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
024b0a258461f282a92b1b1283c3b8b083f9f33fseb if (len != 0 && (strlen(retval.lr_link) + 1 > len))
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (DLADM_STATUS_TOOSMALL);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (retval.lr_class == DATALINK_CLASS_PHYS &&
d62bc4badc1c1f1549c961cfb8b420e650e1272byz retval.lr_flags & DLMGMT_ACTIVE) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz /*
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * An active physical link reported by the dlmgmtd daemon
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * might not be active anymore. Check and set its real status.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz */
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey status = i_dladm_phys_status(handle, linkid, &retval.lr_flags);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (status != DLADM_STATUS_OK)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (status);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz }
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (link != NULL)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz (void) strlcpy(link, retval.lr_link, len);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (classp != NULL)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz *classp = retval.lr_class;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (mediap != NULL)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz *mediap = retval.lr_media;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (flagp != NULL) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz *flagp = retval.lr_flags & DLMGMT_ACTIVE ?
d62bc4badc1c1f1549c961cfb8b420e650e1272byz DLADM_OPT_ACTIVE : 0;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz *flagp |= (retval.lr_flags & DLMGMT_PERSIST) ?
d62bc4badc1c1f1549c961cfb8b420e650e1272byz DLADM_OPT_PERSIST : 0;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz }
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (DLADM_STATUS_OK);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz}
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz/*
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Set the given attr with the given attrval for the given link.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz */
d62bc4badc1c1f1549c961cfb8b420e650e1272byzdladm_status_t
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeydladm_set_conf_field(dladm_handle_t handle, dladm_conf_t conf, const char *attr,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dladm_datatype_t type, const void *attrval)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz{
024b0a258461f282a92b1b1283c3b8b083f9f33fseb dlmgmt_door_setattr_t setattr;
024b0a258461f282a92b1b1283c3b8b083f9f33fseb dlmgmt_setattr_retval_t retval;
024b0a258461f282a92b1b1283c3b8b083f9f33fseb size_t attrsz;
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou size_t sz = sizeof (retval);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
024b0a258461f282a92b1b1283c3b8b083f9f33fseb if (attr == NULL || attrval == NULL)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (DLADM_STATUS_BADARG);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou if (conf.ds_readonly)
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou return (DLADM_STATUS_DENIED);
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (type == DLADM_TYPE_STR)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz attrsz = strlen(attrval) + 1;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz else
d62bc4badc1c1f1549c961cfb8b420e650e1272byz attrsz = dladm_datatype_size[type];
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
024b0a258461f282a92b1b1283c3b8b083f9f33fseb if (attrsz > MAXLINKATTRVALLEN)
024b0a258461f282a92b1b1283c3b8b083f9f33fseb return (DLADM_STATUS_TOOSMALL);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
024b0a258461f282a92b1b1283c3b8b083f9f33fseb setattr.ld_cmd = DLMGMT_CMD_SETATTR;
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou setattr.ld_confid = conf.ds_confid;
024b0a258461f282a92b1b1283c3b8b083f9f33fseb (void) strlcpy(setattr.ld_attr, attr, MAXLINKATTRLEN);
024b0a258461f282a92b1b1283c3b8b083f9f33fseb setattr.ld_attrsz = attrsz;
024b0a258461f282a92b1b1283c3b8b083f9f33fseb setattr.ld_type = type;
024b0a258461f282a92b1b1283c3b8b083f9f33fseb bcopy(attrval, &setattr.ld_attrval, attrsz);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou return (dladm_door_call(handle, &setattr, sizeof (setattr),
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou &retval, &sz));
d62bc4badc1c1f1549c961cfb8b420e650e1272byz}
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz/*
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Unset the given attr the given link.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz */
d62bc4badc1c1f1549c961cfb8b420e650e1272byzdladm_status_t
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeydladm_unset_conf_field(dladm_handle_t handle, dladm_conf_t conf,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey const char *attr)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz{
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dlmgmt_door_unsetattr_t unsetattr;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dlmgmt_unsetattr_retval_t retval;
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou size_t sz = sizeof (retval);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
024b0a258461f282a92b1b1283c3b8b083f9f33fseb if (attr == NULL)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (DLADM_STATUS_BADARG);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou if (conf.ds_readonly)
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou return (DLADM_STATUS_DENIED);
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou
d62bc4badc1c1f1549c961cfb8b420e650e1272byz unsetattr.ld_cmd = DLMGMT_CMD_UNSETATTR;
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou unsetattr.ld_confid = conf.ds_confid;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz (void) strlcpy(unsetattr.ld_attr, attr, MAXLINKATTRLEN);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou return (dladm_door_call(handle, &unsetattr, sizeof (unsetattr),
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou &retval, &sz));
d62bc4badc1c1f1549c961cfb8b420e650e1272byz}
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz/*
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Remove the given link ID and its entry from the data link configuration
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * repository.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz */
d62bc4badc1c1f1549c961cfb8b420e650e1272byzdladm_status_t
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeydladm_remove_conf(dladm_handle_t handle, datalink_id_t linkid)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz{
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dlmgmt_door_removeconf_t removeconf;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dlmgmt_removeconf_retval_t retval;
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou size_t sz = sizeof (retval);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz removeconf.ld_cmd = DLMGMT_CMD_REMOVECONF;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz removeconf.ld_linkid = linkid;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey return (dladm_door_call(handle, &removeconf, sizeof (removeconf),
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou &retval, &sz));
d62bc4badc1c1f1549c961cfb8b420e650e1272byz}
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz/*
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Free the contents of the link structure.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz */
d62bc4badc1c1f1549c961cfb8b420e650e1272byzvoid
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeydladm_destroy_conf(dladm_handle_t handle, dladm_conf_t conf)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz{
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou dlmgmt_door_destroyconf_t dconf;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dlmgmt_destroyconf_retval_t retval;
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou size_t sz = sizeof (retval);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou if (conf.ds_readonly) {
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou nvlist_free(conf.ds_nvl);
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou } else {
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou if (conf.ds_confid == DLADM_INVALID_CONF)
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou return;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou dconf.ld_cmd = DLMGMT_CMD_DESTROYCONF;
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou dconf.ld_confid = conf.ds_confid;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou (void) dladm_door_call(handle, &dconf, sizeof (dconf),
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou &retval, &sz);
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou }
d62bc4badc1c1f1549c961cfb8b420e650e1272byz}
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roydladm_status_t
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roydladm_zone_boot(dladm_handle_t handle, zoneid_t zoneid)
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy{
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy dlmgmt_door_zoneboot_t zoneboot;
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy dlmgmt_zoneboot_retval_t retval;
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou size_t sz = sizeof (retval);
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy zoneboot.ld_cmd = DLMGMT_CMD_ZONEBOOT;
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy zoneboot.ld_zoneid = zoneid;
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou return (dladm_door_call(handle, &zoneboot, sizeof (zoneboot),
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou &retval, &sz));
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy}
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roydladm_status_t
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roydladm_zone_halt(dladm_handle_t handle, zoneid_t zoneid)
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy{
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy dlmgmt_door_zonehalt_t zonehalt;
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy dlmgmt_zonehalt_retval_t retval;
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou size_t sz = sizeof (retval);
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy zonehalt.ld_cmd = DLMGMT_CMD_ZONEHALT;
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy zonehalt.ld_zoneid = zoneid;
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou return (dladm_door_call(handle, &zonehalt, sizeof (zonehalt),
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou &retval, &sz));
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy}