libdllink.c revision 4ac67f0276a8313b5cefec38af347b94b7bfb526
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz * CDDL HEADER START
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz * The contents of this file are subject to the terms of the
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz * Common Development and Distribution License (the "License").
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz * You may not use this file except in compliance with the License.
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz * See the License for the specific language governing permissions
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz * and limitations under the License.
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz * When distributing Covered Code, include this CDDL HEADER in each
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz * If applicable, add the following below this CDDL HEADER, with the
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz * fields enclosed by brackets "[]" replaced with your own identifying
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz * information: Portions Copyright [yyyy] [name of copyright owner]
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz * CDDL HEADER END
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz * Use is subject to license terms.
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz * Return the attributes of the specified datalink from the DLD driver.
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeyi_dladm_info(dladm_handle_t handle, const datalink_id_t linkid,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey if (ioctl(dladm_dld_fd(handle), DLDIOC_ATTR, &dia) < 0)
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeydladm_usagelog(dladm_handle_t handle, dladm_logtype_t type,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey if (ioctl(dladm_dld_fd(handle), DLDIOC_USAGELOG, log_info) < 0)
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeydladm_start_usagelog(dladm_handle_t handle, dladm_logtype_t type,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey return (dladm_usagelog(handle, type, &log_info));
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeydladm_stop_usagelog(dladm_handle_t handle, dladm_logtype_t type)
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey return (dladm_usagelog(handle, type, &log_info));
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeyi_dladm_walk(dladm_handle_t handle, datalink_id_t linkid, void *arg)
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey if (dladm_datalink_id2info(handle, linkid, NULL, NULL, NULL, link,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Walk all datalinks.
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeydladm_walk(dladm_walkcb_t *fn, dladm_handle_t handle, void *arg,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey datalink_class_t class, datalink_media_t dmedia, uint32_t flags)
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey return (dladm_walk_datalink_id(i_dladm_walk, handle, &walk_arg,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeydladm_walk_hwgrp(dladm_handle_t handle, datalink_id_t linkid, void *arg,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if ((iomp = (dld_ioc_hwgrpget_t *)calloc(1, bufsize)) == NULL)
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return (-1);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng iomp->dih_size = nhwgrp * sizeof (dld_hwgrpinfo_t);
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey ret = ioctl(dladm_dld_fd(handle), DLDIOC_GETHWGRP, iomp);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng dhip->dhi_link_name, sizeof (attr.hg_link_name));
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * Invoke the specified callback for each MAC address entry defined on
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * the specified device.
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeydladm_walk_macaddr(dladm_handle_t handle, datalink_id_t linkid, void *arg,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if ((iomp = (dld_ioc_macaddrget_t *)calloc(1, bufsize)) == NULL)
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return (-1);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng iomp->dig_size = nmacaddr * sizeof (dld_macaddrinfo_t);
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey ret = ioctl(dladm_dld_fd(handle), DLDIOC_MACADDRGET, iomp);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * These routines are used by administration tools such as dladm(1M) to
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz * iterate through the list of MAC interfaces
f595a68a3b8953a12aa778c2abd7642df8da8c3ayztypedef struct dladm_mac_dev {
f595a68a3b8953a12aa778c2abd7642df8da8c3ayztypedef struct macadm_walk {
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz * Local callback invoked for each DDI_NT_NET node.
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz/* ARGSUSED */
f595a68a3b8953a12aa778c2abd7642df8da8c3ayzi_dladm_mac_walk(di_node_t node, di_minor_t minor, void *arg)
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz * Skip aggregations.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Skip softmacs.
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz * Skip duplicates.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Invoke the specified callback for each DDI_NT_NET node.
d62bc4badc1c1f1549c961cfb8b420e650e1272byzdladm_mac_walk(int (*fn)(const char *, void *arg), void *arg)
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz (void) di_walk_minor(root, DDI_NT_NET, DI_CHECK_ALIAS, &dmw,
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz for (dmdp = dmw.dmd_dev_list; dmdp != NULL; dmdp = next) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Get the current attributes of the specified datalink.
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeydladm_info(dladm_handle_t handle, datalink_id_t linkid, dladm_attr_t *dap)
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey return (i_dladm_info(handle, linkid, dap));
f595a68a3b8953a12aa778c2abd7642df8da8c3ayzconst char *
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz const char *s;
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz switch (state) {
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz s = "down";
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz s = "unknown";
f595a68a3b8953a12aa778c2abd7642df8da8c3ayzconst char *
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz const char *s;
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz switch (duplex) {
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz s = "full";
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz s = "half";
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz s = "unknown";
811fc8e17e28618ca5149abc18f576709fc5875byz * Set zoneid of a given link. Note that this function takes a link name
811fc8e17e28618ca5149abc18f576709fc5875byz * argument instead of a linkid, because a data-link (and its linkid) could
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * be created implicitly as the result of this function.
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeydladm_setzid(dladm_handle_t handle, const char *dlname, char *zone_name)
3bc21d0a9c7b31b1132c254e389a4114c23bcf00Aruna Ramakrishna - Sun Microsystems dladm_status_t status = DLADM_STATUS_OK;
3bc21d0a9c7b31b1132c254e389a4114c23bcf00Aruna Ramakrishna - Sun Microsystems /* If the link does not exist, it is a ppa-hacked vlan. */
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey status = dladm_name2info(handle, dlname, &linkid, NULL, NULL, NULL);
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey status = dladm_set_linkprop(handle, linkid, "zone", &zone_name, 1,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Case 1: rename an existing link1 to a link2 that does not exist.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Result: <linkid1, link2>
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeyi_dladm_rename_link_c1(dladm_handle_t handle, datalink_id_t linkid1,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey const char *link1, const char *link2, uint32_t flags)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Link is currently available. Check to see whether anything is
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * holding this link to prevent a rename operation.
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey if (ioctl(dladm_dld_fd(handle), DLDIOC_RENAME, &dir) < 0) {
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey status = dladm_remap_datalink_id(handle, linkid1, link2);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Flush the current mapping to persistent configuration.
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey (((status = dladm_read_conf(handle, linkid1, &conf)) !=
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey ((status = dladm_write_conf(handle, conf)) != DLADM_STATUS_OK))) {
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey (void) dladm_remap_datalink_id(handle, linkid1, link1);
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey (void) ioctl(dladm_dld_fd(handle), DLDIOC_RENAME, &dir);
d62bc4badc1c1f1549c961cfb8b420e650e1272byztypedef struct link_hold_arg_s {
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeyi_dladm_aggr_link_hold(dladm_handle_t handle, datalink_id_t aggrid, void *arg)
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey status = dladm_aggr_info(handle, aggrid, &ginfo, hold_arg->flags);
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeyi_dladm_vlan_link_hold(dladm_handle_t handle, datalink_id_t vlanid, void *arg)
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey status = dladm_vlan_info(handle, vlanid, &vinfo, hold_arg->flags);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Case 2: rename an available physical link link1 to a REMOVED physical link
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * link2. As a result, link1 directly inherits all datalinks configured
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * over link2 (linkid2).
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Result: <linkid2, link2, link1_phymaj, link1_phyinst, link1_devname,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * link2_other_attr>
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeyi_dladm_rename_link_c2(dladm_handle_t handle, datalink_id_t linkid1,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * First check if linkid1 is associated with any persistent
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * aggregations or VLANs. If yes, return BUSY.
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey (void) dladm_walk_datalink_id(i_dladm_aggr_link_hold, handle, &arg,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz DATALINK_CLASS_AGGR, DATALINK_ANY_MEDIATYPE, DLADM_OPT_PERSIST);
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey (void) dladm_walk_datalink_id(i_dladm_vlan_link_hold, handle, &arg,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz DATALINK_CLASS_VLAN, DATALINK_ANY_MEDIATYPE, DLADM_OPT_PERSIST);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Send DLDIOC_RENAME to request to rename link1's linkid to
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * be linkid2. This will check whether link1 is used by any
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * aggregations or VLANs, or is held by any application. If yes,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * return failure.
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey if (ioctl(dladm_dld_fd(handle), DLDIOC_RENAME, &dir) < 0)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Now change the phymaj, phyinst and devname associated with linkid1
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * to be associated with linkid2. Before doing that, the old active
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * linkprop of linkid1 should be deleted.
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey (void) dladm_set_linkprop(handle, linkid1, NULL, NULL, 0,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey if (((status = dladm_read_conf(handle, linkid1, &conf1)) !=
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey ((status = dladm_get_conf_field(handle, conf1, FDEVNAME, devname,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey ((status = dladm_get_conf_field(handle, conf1, FPHYMAJ, &phymaj,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey ((status = dladm_get_conf_field(handle, conf1, FPHYINST, &phyinst,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey ((status = dladm_read_conf(handle, linkid2, &conf2)) !=
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey (void) dladm_init_linkprop(handle, linkid1, B_FALSE);
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey (void) ioctl(dladm_dld_fd(handle), DLDIOC_RENAME, &dir);
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey (void) dladm_set_conf_field(handle, conf2, FDEVNAME, DLADM_TYPE_STR,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey (void) dladm_set_conf_field(handle, conf2, FPHYMAJ, DLADM_TYPE_UINT64,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey (void) dladm_set_conf_field(handle, conf2, FPHYINST,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Delete link1 and mark link2 up.
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey (void) dladm_destroy_datalink_id(handle, linkid1, DLADM_OPT_ACTIVE |
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey (void) dladm_up_datalink_id(handle, linkid2);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Now generate the RCM_RESOURCE_LINK_NEW sysevent which can be
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * consumed by the RCM framework to restore all the datalink and
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * IP configuration.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (rcm_alloc_handle(NULL, 0, NULL, &rcm_hdl) != RCM_SUCCESS)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (rcm_notify_event(rcm_hdl, RCM_RESOURCE_LINK_NEW, 0, nvl, NULL) ==
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * case 3: rename a non-existent link to a REMOVED physical link.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Set the removed physical link's device name to link1, so that
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * when link1 attaches, it inherits all the link configuration of
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * the removed physical link.
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeyi_dladm_rename_link_c3(dladm_handle_t handle, const char *link1,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey status = dladm_read_conf(handle, linkid2, &conf);
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey if ((status = dladm_set_conf_field(handle, conf, FDEVNAME,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey DLADM_TYPE_STR, link1)) == DLADM_STATUS_OK) {
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeydladm_rename_link(dladm_handle_t handle, const char *link1, const char *link2)
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey (void) dladm_name2info(handle, link1, &linkid1, &flags1, &class1,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey if ((dladm_name2info(handle, link2, &linkid2, &flags2, &class2,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey &media2) == DLADM_STATUS_OK) && (class2 == DATALINK_CLASS_PHYS) &&
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * see whether link2 is a removed physical link.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * case 1: rename an existing link to a link that
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * does not exist.
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey status = i_dladm_rename_link_c1(handle, linkid1, link1,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz } else if (remphy2) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * case 2: rename an available link to a REMOVED
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * physical link. Return failure if link1 is not
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * an active physical link.
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey status = i_dladm_rename_link_c2(handle, linkid1,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz } else if (remphy2) {
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey status = i_dladm_rename_link_c3(handle, link1, linkid2);
d62bc4badc1c1f1549c961cfb8b420e650e1272byztypedef struct consumer_del_phys_arg_s {
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeyi_dladm_vlan_link_del(dladm_handle_t handle, datalink_id_t vlanid, void *arg)
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey status = dladm_vlan_info(handle, vlanid, &vinfo, DLADM_OPT_PERSIST);
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey (void) dladm_vlan_delete(handle, vlanid, DLADM_OPT_PERSIST);
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeyi_dladm_aggr_link_del(dladm_handle_t handle, datalink_id_t aggrid, void *arg)
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey status = dladm_aggr_info(handle, aggrid, &ginfo, DLADM_OPT_PERSIST);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * First delete all the VLANs on this aggregation, then
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * delete the aggregation itself.
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey handle, &aggr_del_arg, DATALINK_CLASS_VLAN,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey (void) dladm_aggr_remove(handle, aggrid, 1, port,
d62bc4badc1c1f1549c961cfb8b420e650e1272byztypedef struct del_phys_arg_s {
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeyi_dladm_phys_delete(dladm_handle_t handle, datalink_id_t linkid, void *arg)
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey if ((status = dladm_datalink_id2info(handle, linkid, &flags, &class,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * see whether this link is a removed physical link.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if ((class != DATALINK_CLASS_PHYS) || !(flags & DLADM_OPT_PERSIST) ||
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey (void) dladm_walk_datalink_id(i_dladm_aggr_link_del, handle,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey &del_arg, DATALINK_CLASS_AGGR, DATALINK_ANY_MEDIATYPE,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey (void) dladm_walk_datalink_id(i_dladm_vlan_link_del, handle,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey &del_arg, DATALINK_CLASS_VLAN, DATALINK_ANY_MEDIATYPE,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey (void) dladm_destroy_datalink_id(handle, linkid, DLADM_OPT_PERSIST);
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeydladm_phys_delete(dladm_handle_t handle, datalink_id_t linkid)
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey (void) dladm_walk_datalink_id(i_dladm_phys_delete, handle, &arg,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey (void) i_dladm_phys_delete(handle, linkid, &arg);
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeydladm_phys_info(dladm_handle_t handle, datalink_id_t linkid,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz assert(flags == DLADM_OPT_ACTIVE || flags == DLADM_OPT_PERSIST);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz switch (flags) {
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey status = dladm_read_conf(handle, linkid, &conf);
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey status = dladm_get_conf_field(handle, conf, FDEVNAME,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey if (ioctl(dladm_dld_fd(handle), DLDIOC_PHYS_ATTR, &dip) < 0) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz (void) strlcpy(dpap->dp_dev, dip.dip_dev, MAXLINKNAMELEN);
d62bc4badc1c1f1549c961cfb8b420e650e1272byztypedef struct i_walk_dev_state_s {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz const char *devname;
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeyi_dladm_walk_dev2linkid(dladm_handle_t handle, datalink_id_t linkid, void *arg)
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey status = dladm_phys_info(handle, linkid, &dpa, DLADM_OPT_PERSIST);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Get the linkid from the physical device name.
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeydladm_dev2linkid(dladm_handle_t handle, const char *devname,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey (void) dladm_walk_datalink_id(i_dladm_walk_dev2linkid, handle, &state,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz DATALINK_CLASS_PHYS, DATALINK_ANY_MEDIATYPE, DLADM_OPT_PERSIST);
d62bc4badc1c1f1549c961cfb8b420e650e1272byzparse_devname(const char *devname, char *driver, uint_t *ppa, size_t maxlen)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * device name length must not be 0, and it must end with digit.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (((len = strlen(devname)) == 0) || !isdigit(devname[len - 1]))
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (0);
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeydladm_linkid2legacyname(dladm_handle_t handle, datalink_id_t linkid, char *dev,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey status = dladm_datalink_id2info(handle, linkid, NULL, &class, NULL,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * If this is a VLAN, we must first determine the class and linkid of
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * the link the VLAN has been created over.
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey status = dladm_vlan_info(handle, linkid, &dva,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey if ((status = dladm_datalink_id2info(handle, linkid, NULL,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey &class, NULL, NULL, 0)) != DLADM_STATUS_OK) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz switch (class) {
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey status = dladm_aggr_info(handle, linkid, &dga,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * If the key was not specified when the aggregation
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * is created, we cannot guess its /dev node name.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz (void) snprintf(devname, MAXLINKNAMELEN, "aggr%d", dga.lg_key);
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey status = dladm_phys_info(handle, linkid, &dpa,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (parse_devname(devname, drv, &ppa, MAXNAMELEN) != 0) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (snprintf(dev, len, "%s%d", drv, vid * 1000 + ppa) >= len)
e7801d59e8ceda0cde8ebdfdddd7582ee2ea96efsowminidladm_parselink(const char *dev, char *provider, uint_t *ppa)