libdlmgmt.c revision 4ac67f0276a8313b5cefec38af347b94b7bfb526
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * CDDL HEADER START
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 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * See the License for the specific language governing permissions
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * and limitations under the License.
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 * CDDL HEADER END
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Use is subject to license terms.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Table of data type sizes indexed by dladm_datatype_t.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz 0, /* DLADM_TYPE_STR, use strnlen() */
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeydladm_door_call(dladm_handle_t handle, void *arg, size_t asize, void *rbuf,
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)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * The size of the input rbuf is not big enough so that
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * the door allocate the rbuf itself. In this case, simply
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * think something wrong with the door call.
024b0a258461f282a92b1b1283c3b8b083f9f33fseb return (dladm_errno2status(((dlmgmt_retval_t *)rbuf)->lr_err));
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Allocate a new linkid with the given name. Return the new linkid.
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,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dlmgmt_flags = (flags & DLADM_OPT_ACTIVE) ? DLMGMT_ACTIVE : 0;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dlmgmt_flags |= (flags & DLADM_OPT_PERSIST) ? DLMGMT_PERSIST : 0;
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey if ((status = dladm_door_call(handle, &createid, sizeof (createid),
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey &retval, sizeof (retval))) == DLADM_STATUS_OK) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Destroy the given link ID.
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeydladm_destroy_datalink_id(dladm_handle_t handle, datalink_id_t linkid,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dlmgmt_flags = (flags & DLADM_OPT_ACTIVE) ? DLMGMT_ACTIVE : 0;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dlmgmt_flags |= ((flags & DLADM_OPT_PERSIST) ? DLMGMT_PERSIST : 0);
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey return (dladm_door_call(handle, &destroyid, sizeof (destroyid), &retval,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Remap a given link ID to a new name.
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeydladm_remap_datalink_id(dladm_handle_t handle, datalink_id_t linkid,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey return (dladm_door_call(handle, &remapid, sizeof (remapid), &retval,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Make a given link ID active.
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeydladm_up_datalink_id(dladm_handle_t handle, datalink_id_t linkid)
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey return (dladm_door_call(handle, &upid, sizeof (upid), &retval,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Create a new link with the given name. Return the new link's handle
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 (void) strlcpy(createconf.ld_link, link, MAXLINKNAMELEN);
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey if ((status = dladm_door_call(handle, &createconf, sizeof (createconf),
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().
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeyi_dladm_phys_status(dladm_handle_t handle, datalink_id_t linkid,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey status = dladm_phys_info(handle, linkid, &dpa, DLADM_OPT_ACTIVE);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * No active status, this link was removed. Update its status
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * in the daemon and delete all active linkprops.
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.
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey if ((status = dladm_destroy_datalink_id(handle, linkid,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey (void) dladm_set_linkprop(handle, linkid, NULL, NULL, 0,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Walk each entry in the data link configuration repository and
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * call fn on the linkid and arg.
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,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dlmgmt_flags = (flags & DLADM_OPT_ACTIVE) ? DLMGMT_ACTIVE : 0;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dlmgmt_flags |= ((flags & DLADM_OPT_PERSIST) ? DLMGMT_PERSIST : 0);
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey if ((status = dladm_door_call(handle, &getnext,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey sizeof (getnext), &retval, sizeof (retval))) !=
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * done with walking
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * An active physical link reported by the dlmgmtd
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * daemon might not be active anymore. Check its
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * real status.
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey if (fn(handle, linkid, argp) == DLADM_WALK_TERMINATE)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Get the link properties structure for the given link.
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeydladm_read_conf(dladm_handle_t handle, datalink_id_t linkid,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey if ((status = dladm_door_call(handle, &readconf, sizeof (readconf),
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Commit the given link to the data link configuration repository so
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * that it will persist across reboots.
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeydladm_write_conf(dladm_handle_t handle, dladm_conf_t conf)
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey return (dladm_door_call(handle, &writeconf, sizeof (writeconf), &retval,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Given a link ID and a key, get the matching information from
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * data link configuration repository.
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeydladm_get_conf_field(dladm_handle_t handle, dladm_conf_t conf, const char *attr,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey if ((status = dladm_door_call(handle, &getattr, sizeof (getattr),
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey &retval, sizeof (retval))) != DLADM_STATUS_OK) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Get the link ID that is associated with the given name.
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)
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey if ((status = dladm_door_call(handle, &getlinkid, sizeof (getlinkid),
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * An active physical link reported by the dlmgmtd daemon
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * might not be active anymore. Check and set its real status.
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey status = i_dladm_phys_status(handle, linkid, &retval.lr_flags);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz *flagp = retval.lr_flags & DLMGMT_ACTIVE ? DLADM_OPT_ACTIVE : 0;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Get the link name that is associated with the given id.
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,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if ((linkid == DATALINK_INVALID_LINKID) || (link != NULL && len == 0) ||
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey if ((status = dladm_door_call(handle, &getname, sizeof (getname),
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey &retval, sizeof (retval))) != DLADM_STATUS_OK) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * An active physical link reported by the dlmgmtd daemon
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * might not be active anymore. Check and set its real status.
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey status = i_dladm_phys_status(handle, linkid, &retval.lr_flags);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Set the given attr with the given attrval for the given link.
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeydladm_set_conf_field(dladm_handle_t handle, dladm_conf_t conf, const char *attr,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey return (dladm_door_call(handle, &setattr, sizeof (setattr), &retval,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Unset the given attr the given link.
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeydladm_unset_conf_field(dladm_handle_t handle, dladm_conf_t conf,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey return (dladm_door_call(handle, &unsetattr, sizeof (unsetattr), &retval,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Remove the given link ID and its entry from the data link configuration
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * repository.
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeydladm_remove_conf(dladm_handle_t handle, datalink_id_t linkid)
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey return (dladm_door_call(handle, &removeconf, sizeof (removeconf),
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Free the contents of the link structure.
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeydladm_destroy_conf(dladm_handle_t handle, dladm_conf_t conf)