f595a68a3b8953a12aa778c2abd7642df8da8c3ayz/*
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz * CDDL HEADER START
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz *
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 *
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz * or http://www.opensolaris.org/os/licensing.
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz * See the License for the specific language governing permissions
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz * and limitations under the License.
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz *
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 *
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz * CDDL HEADER END
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz */
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz/*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz */
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz#include <sys/types.h>
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz#include <unistd.h>
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz#include <errno.h>
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz#include <fcntl.h>
d62bc4badc1c1f1549c961cfb8b420e650e1272byz#include <assert.h>
d62bc4badc1c1f1549c961cfb8b420e650e1272byz#include <ctype.h>
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz#include <strings.h>
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz#include <sys/stat.h>
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz#include <sys/dld.h>
d62bc4badc1c1f1549c961cfb8b420e650e1272byz#include <sys/vlan.h>
3bc21d0a9c7b31b1132c254e389a4114c23bcf00Aruna Ramakrishna - Sun Microsystems#include <zone.h>
d62bc4badc1c1f1549c961cfb8b420e650e1272byz#include <librcm.h>
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz#include <libdlpi.h>
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz#include <libdevinfo.h>
d62bc4badc1c1f1549c961cfb8b420e650e1272byz#include <libdlaggr.h>
d62bc4badc1c1f1549c961cfb8b420e650e1272byz#include <libdlvlan.h>
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer#include <libdlvnic.h>
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala#include <libdlib.h>
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz#include <libdllink.h>
d62bc4badc1c1f1549c961cfb8b420e650e1272byz#include <libdlmgmt.h>
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz#include <libdladm_impl.h>
e7801d59e8ceda0cde8ebdfdddd7582ee2ea96efsowmini#include <libinetutil.h>
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz/*
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz * Return the attributes of the specified datalink from the DLD driver.
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz */
d62bc4badc1c1f1549c961cfb8b420e650e1272byzstatic dladm_status_t
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeyi_dladm_info(dladm_handle_t handle, const datalink_id_t linkid,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey dladm_attr_t *dap)
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz{
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz dld_ioc_attr_t dia;
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dia.dia_linkid = linkid;
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey if (ioctl(dladm_dld_fd(handle), DLDIOC_ATTR, &dia) < 0)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (dladm_errno2status(errno));
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz dap->da_max_sdu = dia.dia_max_sdu;
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (DLADM_STATUS_OK);
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz}
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz
da14cebe459d3275048785f25bd869cb09b5307fEric Chengstatic dladm_status_t
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeydladm_usagelog(dladm_handle_t handle, dladm_logtype_t type,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey dld_ioc_usagelog_t *log_info)
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng{
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if (type == DLADM_LOGTYPE_FLOW)
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng log_info->ul_type = MAC_LOGTYPE_FLOW;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng else
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng log_info->ul_type = MAC_LOGTYPE_LINK;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey if (ioctl(dladm_dld_fd(handle), DLDIOC_USAGELOG, log_info) < 0)
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return (DLADM_STATUS_IOERR);
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return (DLADM_STATUS_OK);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng}
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Chengdladm_status_t
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeydladm_start_usagelog(dladm_handle_t handle, dladm_logtype_t type,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey uint_t interval)
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng{
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng dld_ioc_usagelog_t log_info;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng log_info.ul_onoff = B_TRUE;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng log_info.ul_interval = interval;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey return (dladm_usagelog(handle, type, &log_info));
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng}
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Chengdladm_status_t
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeydladm_stop_usagelog(dladm_handle_t handle, dladm_logtype_t type)
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng{
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng dld_ioc_usagelog_t log_info;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng log_info.ul_onoff = B_FALSE;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng log_info.ul_interval = 0;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey return (dladm_usagelog(handle, type, &log_info));
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng}
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
d62bc4badc1c1f1549c961cfb8b420e650e1272byzstruct i_dladm_walk_arg {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dladm_walkcb_t *fn;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz void *arg;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz};
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz
f595a68a3b8953a12aa778c2abd7642df8da8c3ayzstatic int
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeyi_dladm_walk(dladm_handle_t handle, datalink_id_t linkid, void *arg)
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz{
d62bc4badc1c1f1549c961cfb8b420e650e1272byz struct i_dladm_walk_arg *walk_arg = arg;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz char link[MAXLINKNAMELEN];
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey if (dladm_datalink_id2info(handle, linkid, NULL, NULL, NULL, link,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz sizeof (link)) == DLADM_STATUS_OK) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (walk_arg->fn(link, walk_arg->arg));
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz }
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (DLADM_WALK_CONTINUE);
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz}
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz/*
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Walk all datalinks.
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz */
d62bc4badc1c1f1549c961cfb8b420e650e1272byzdladm_status_t
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)
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz{
d62bc4badc1c1f1549c961cfb8b420e650e1272byz struct i_dladm_walk_arg walk_arg;
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz walk_arg.fn = fn;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz walk_arg.arg = arg;
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey return (dladm_walk_datalink_id(i_dladm_walk, handle, &walk_arg,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz class, dmedia, flags));
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz}
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng#define MAXGRPPERLINK 64
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Chengint
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeydladm_walk_hwgrp(dladm_handle_t handle, datalink_id_t linkid, void *arg,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng boolean_t (*fn)(void *, dladm_hwgrp_attr_t *))
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng{
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey int bufsize, ret;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng int nhwgrp = MAXGRPPERLINK;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng dld_ioc_hwgrpget_t *iomp = NULL;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng bufsize = sizeof (dld_ioc_hwgrpget_t) +
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nhwgrp * sizeof (dld_hwgrpinfo_t);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if ((iomp = (dld_ioc_hwgrpget_t *)calloc(1, bufsize)) == NULL)
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return (-1);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng iomp->dih_size = nhwgrp * sizeof (dld_hwgrpinfo_t);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng iomp->dih_linkid = linkid;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey ret = ioctl(dladm_dld_fd(handle), DLDIOC_GETHWGRP, iomp);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if (ret == 0) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer int i;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer int j;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer dld_hwgrpinfo_t *dhip;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer dladm_hwgrp_attr_t attr;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng dhip = (dld_hwgrpinfo_t *)(iomp + 1);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng for (i = 0; i < iomp->dih_n_groups; i++) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng bzero(&attr, sizeof (attr));
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng (void) strlcpy(attr.hg_link_name,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng dhip->dhi_link_name, sizeof (attr.hg_link_name));
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng attr.hg_grp_num = dhip->dhi_grp_num;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng attr.hg_grp_type = dhip->dhi_grp_type;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng attr.hg_n_rings = dhip->dhi_n_rings;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer for (j = 0; j < dhip->dhi_n_rings; j++)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer attr.hg_rings[j] = dhip->dhi_rings[j];
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer dladm_sort_index_list(attr.hg_rings, attr.hg_n_rings);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng attr.hg_n_clnts = dhip->dhi_n_clnts;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng (void) strlcpy(attr.hg_client_names,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng dhip->dhi_clnts, sizeof (attr.hg_client_names));
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if (!(*fn)(arg, &attr))
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng break;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng dhip++;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng free(iomp);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return (ret);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng}
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng/*
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * Invoke the specified callback for each MAC address entry defined on
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * the specified device.
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng */
da14cebe459d3275048785f25bd869cb09b5307fEric Chengint
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeydladm_walk_macaddr(dladm_handle_t handle, datalink_id_t linkid, void *arg,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng boolean_t (*fn)(void *, dladm_macaddr_attr_t *))
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng{
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey int bufsize, ret;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng int nmacaddr = 1024;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng dld_ioc_macaddrget_t *iomp = NULL;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng bufsize = sizeof (dld_ioc_macaddrget_t) +
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nmacaddr * sizeof (dld_macaddrinfo_t);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if ((iomp = (dld_ioc_macaddrget_t *)calloc(1, bufsize)) == NULL)
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return (-1);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng iomp->dig_size = nmacaddr * sizeof (dld_macaddrinfo_t);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng iomp->dig_linkid = linkid;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey ret = ioctl(dladm_dld_fd(handle), DLDIOC_MACADDRGET, iomp);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if (ret == 0) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng int i;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng dld_macaddrinfo_t *dmip;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng dladm_macaddr_attr_t attr;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng dmip = (dld_macaddrinfo_t *)(iomp + 1);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng for (i = 0; i < iomp->dig_count; i++) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng bzero(&attr, sizeof (attr));
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng attr.ma_slot = dmip->dmi_slot;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng attr.ma_flags = 0;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if (dmip->dmi_flags & DLDIOCMACADDR_USED)
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng attr.ma_flags |= DLADM_MACADDR_USED;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng bcopy(dmip->dmi_addr, attr.ma_addr,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng dmip->dmi_addrlen);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng attr.ma_addrlen = dmip->dmi_addrlen;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng (void) strlcpy(attr.ma_client_name,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng dmip->dmi_client_name, MAXNAMELEN);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng attr.ma_client_linkid = dmip->dma_client_linkid;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if (!(*fn)(arg, &attr))
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng break;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng dmip++;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng free(iomp);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return (ret);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng}
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz/*
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * These routines are used by administration tools such as dladm(1M) to
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz * iterate through the list of MAC interfaces
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz */
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz
f595a68a3b8953a12aa778c2abd7642df8da8c3ayztypedef struct dladm_mac_dev {
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz char dm_name[MAXNAMELEN];
d62bc4badc1c1f1549c961cfb8b420e650e1272byz struct dladm_mac_dev *dm_next;
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz} dladm_mac_dev_t;
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz
f595a68a3b8953a12aa778c2abd7642df8da8c3ayztypedef struct macadm_walk {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dladm_mac_dev_t *dmd_dev_list;
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz} dladm_mac_walk_t;
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz/*
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz * Local callback invoked for each DDI_NT_NET node.
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz */
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz/* ARGSUSED */
f595a68a3b8953a12aa778c2abd7642df8da8c3ayzstatic int
f595a68a3b8953a12aa778c2abd7642df8da8c3ayzi_dladm_mac_walk(di_node_t node, di_minor_t minor, void *arg)
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz{
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz dladm_mac_walk_t *dmwp = arg;
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz dladm_mac_dev_t *dmdp = dmwp->dmd_dev_list;
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz dladm_mac_dev_t **last_dmdp = &dmwp->dmd_dev_list;
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz char mac[MAXNAMELEN];
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz (void) snprintf(mac, MAXNAMELEN, "%s%d",
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz di_driver_name(node), di_instance(node));
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz /*
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz * Skip aggregations.
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz */
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz if (strcmp("aggr", di_driver_name(node)) == 0)
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz return (DI_WALK_CONTINUE);
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz /*
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Skip softmacs.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz */
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (strcmp("softmac", di_driver_name(node)) == 0)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (DI_WALK_CONTINUE);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz while (dmdp) {
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz /*
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz * Skip duplicates.
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz */
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz if (strcmp(dmdp->dm_name, mac) == 0)
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz return (DI_WALK_CONTINUE);
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz last_dmdp = &dmdp->dm_next;
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz dmdp = dmdp->dm_next;
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz }
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz if ((dmdp = malloc(sizeof (*dmdp))) == NULL)
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz return (DI_WALK_CONTINUE);
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz (void) strlcpy(dmdp->dm_name, mac, MAXNAMELEN);
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz dmdp->dm_next = NULL;
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz *last_dmdp = dmdp;
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz return (DI_WALK_CONTINUE);
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz}
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz/*
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Invoke the specified callback for each DDI_NT_NET node.
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz */
d62bc4badc1c1f1549c961cfb8b420e650e1272byzdladm_status_t
d62bc4badc1c1f1549c961cfb8b420e650e1272byzdladm_mac_walk(int (*fn)(const char *, void *arg), void *arg)
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz{
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz di_node_t root;
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz dladm_mac_walk_t dmw;
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz dladm_mac_dev_t *dmdp, *next;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz boolean_t done = B_FALSE;
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz if ((root = di_init("/", DINFOCACHE)) == DI_NODE_NIL)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (dladm_errno2status(errno));
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz dmw.dmd_dev_list = NULL;
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz (void) di_walk_minor(root, DDI_NT_NET, DI_CHECK_ALIAS, &dmw,
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz i_dladm_mac_walk);
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz di_fini(root);
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz dmdp = dmw.dmd_dev_list;
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz for (dmdp = dmw.dmd_dev_list; dmdp != NULL; dmdp = next) {
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz next = dmdp->dm_next;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (!done &&
d62bc4badc1c1f1549c961cfb8b420e650e1272byz ((*fn)(dmdp->dm_name, arg) == DLADM_WALK_TERMINATE)) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz done = B_TRUE;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz }
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz free(dmdp);
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz }
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (DLADM_STATUS_OK);
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz}
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz/*
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Get the current attributes of the specified datalink.
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz */
d62bc4badc1c1f1549c961cfb8b420e650e1272byzdladm_status_t
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeydladm_info(dladm_handle_t handle, datalink_id_t linkid, dladm_attr_t *dap)
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz{
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey return (i_dladm_info(handle, linkid, dap));
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz}
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz
f595a68a3b8953a12aa778c2abd7642df8da8c3ayzconst char *
f595a68a3b8953a12aa778c2abd7642df8da8c3ayzdladm_linkstate2str(link_state_t state, char *buf)
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz{
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz const char *s;
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz switch (state) {
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz case LINK_STATE_UP:
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz s = "up";
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz break;
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz case LINK_STATE_DOWN:
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz s = "down";
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz break;
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz default:
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz s = "unknown";
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz break;
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz }
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz (void) snprintf(buf, DLADM_STRSIZE, "%s", s);
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz return (buf);
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz}
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz
f595a68a3b8953a12aa778c2abd7642df8da8c3ayzconst char *
f595a68a3b8953a12aa778c2abd7642df8da8c3ayzdladm_linkduplex2str(link_duplex_t duplex, char *buf)
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz{
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz const char *s;
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz switch (duplex) {
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz case LINK_DUPLEX_FULL:
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz s = "full";
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz break;
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz case LINK_DUPLEX_HALF:
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz s = "half";
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz break;
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz default:
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz s = "unknown";
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz break;
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz }
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz (void) snprintf(buf, DLADM_STRSIZE, "%s", s);
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz return (buf);
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz}
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz/*
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Case 1: rename an existing link1 to a link2 that does not exist.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Result: <linkid1, link2>
d62bc4badc1c1f1549c961cfb8b420e650e1272byz */
d62bc4badc1c1f1549c961cfb8b420e650e1272byzstatic dladm_status_t
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)
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz{
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dld_ioc_rename_t dir;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dladm_status_t status = DLADM_STATUS_OK;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz /*
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Link is currently available. Check to see whether anything is
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * holding this link to prevent a rename operation.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz */
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (flags & DLADM_OPT_ACTIVE) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dir.dir_linkid1 = linkid1;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dir.dir_linkid2 = DATALINK_INVALID_LINKID;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz (void) strlcpy(dir.dir_link, link2, MAXLINKNAMELEN);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey if (ioctl(dladm_dld_fd(handle), DLDIOC_RENAME, &dir) < 0) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz status = dladm_errno2status(errno);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (status);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz }
d62bc4badc1c1f1549c961cfb8b420e650e1272byz }
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey status = dladm_remap_datalink_id(handle, linkid1, link2);
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy if (status != DLADM_STATUS_OK && (flags & DLADM_OPT_ACTIVE)) {
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy (void) strlcpy(dir.dir_link, link1, MAXLINKNAMELEN);
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy (void) ioctl(dladm_dld_fd(handle), DLDIOC_RENAME, &dir);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz }
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (status);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz}
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byztypedef struct link_hold_arg_s {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz datalink_id_t linkid;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz datalink_id_t holder;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz uint32_t flags;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz} link_hold_arg_t;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byzstatic int
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeyi_dladm_aggr_link_hold(dladm_handle_t handle, datalink_id_t aggrid, void *arg)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz{
d62bc4badc1c1f1549c961cfb8b420e650e1272byz link_hold_arg_t *hold_arg = arg;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dladm_aggr_grp_attr_t ginfo;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dladm_status_t status;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz int i;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey status = dladm_aggr_info(handle, aggrid, &ginfo, hold_arg->flags);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (status != DLADM_STATUS_OK)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (DLADM_WALK_CONTINUE);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz for (i = 0; i < ginfo.lg_nports; i++) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (ginfo.lg_ports[i].lp_linkid == hold_arg->linkid) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz hold_arg->holder = aggrid;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (DLADM_WALK_TERMINATE);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz }
d62bc4badc1c1f1549c961cfb8b420e650e1272byz }
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (DLADM_WALK_CONTINUE);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz}
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byzstatic int
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeyi_dladm_vlan_link_hold(dladm_handle_t handle, datalink_id_t vlanid, void *arg)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz{
d62bc4badc1c1f1549c961cfb8b420e650e1272byz link_hold_arg_t *hold_arg = arg;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dladm_vlan_attr_t vinfo;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dladm_status_t status;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey status = dladm_vlan_info(handle, vlanid, &vinfo, hold_arg->flags);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (status != DLADM_STATUS_OK)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (DLADM_WALK_CONTINUE);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (vinfo.dv_linkid == hold_arg->linkid) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz hold_arg->holder = vlanid;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (DLADM_WALK_TERMINATE);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz }
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (DLADM_WALK_CONTINUE);
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz}
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz/*
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>
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz */
d62bc4badc1c1f1549c961cfb8b420e650e1272byzstatic dladm_status_t
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeyi_dladm_rename_link_c2(dladm_handle_t handle, datalink_id_t linkid1,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey datalink_id_t linkid2)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz{
d62bc4badc1c1f1549c961cfb8b420e650e1272byz rcm_handle_t *rcm_hdl = NULL;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz nvlist_t *nvl = NULL;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz link_hold_arg_t arg;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dld_ioc_rename_t dir;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dladm_conf_t conf1, conf2;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz char devname[MAXLINKNAMELEN];
d62bc4badc1c1f1549c961cfb8b420e650e1272byz uint64_t phymaj, phyinst;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dladm_status_t status = DLADM_STATUS_OK;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz /*
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * First check if linkid1 is associated with any persistent
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * aggregations or VLANs. If yes, return BUSY.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz */
d62bc4badc1c1f1549c961cfb8b420e650e1272byz arg.linkid = linkid1;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz arg.holder = DATALINK_INVALID_LINKID;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz arg.flags = DLADM_OPT_PERSIST;
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);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (arg.holder != DATALINK_INVALID_LINKID)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (DLADM_STATUS_LINKBUSY);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz arg.flags = 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 if (arg.holder != DATALINK_INVALID_LINKID)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (DLADM_STATUS_LINKBUSY);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz /*
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.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz */
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dir.dir_linkid1 = linkid1;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dir.dir_linkid2 = linkid2;
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey if (ioctl(dladm_dld_fd(handle), DLDIOC_RENAME, &dir) < 0)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz status = dladm_errno2status(errno);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (status != DLADM_STATUS_OK) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (status);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz }
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz /*
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.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz */
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey (void) dladm_set_linkprop(handle, linkid1, NULL, NULL, 0,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey DLADM_OPT_ACTIVE);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou if (((status = dladm_getsnap_conf(handle, linkid1, &conf1)) !=
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey DLADM_STATUS_OK) ||
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey ((status = dladm_get_conf_field(handle, conf1, FDEVNAME, devname,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz MAXLINKNAMELEN)) != DLADM_STATUS_OK) ||
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey ((status = dladm_get_conf_field(handle, conf1, FPHYMAJ, &phymaj,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz sizeof (uint64_t))) != DLADM_STATUS_OK) ||
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey ((status = dladm_get_conf_field(handle, conf1, FPHYINST, &phyinst,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz sizeof (uint64_t))) != DLADM_STATUS_OK) ||
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou ((status = dladm_open_conf(handle, linkid2, &conf2)) !=
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey DLADM_STATUS_OK)) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dir.dir_linkid1 = linkid2;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dir.dir_linkid2 = linkid1;
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey (void) dladm_init_linkprop(handle, linkid1, B_FALSE);
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey (void) ioctl(dladm_dld_fd(handle), DLDIOC_RENAME, &dir);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (status);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz }
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey dladm_destroy_conf(handle, conf1);
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey (void) dladm_set_conf_field(handle, conf2, FDEVNAME, DLADM_TYPE_STR,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey devname);
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey (void) dladm_set_conf_field(handle, conf2, FPHYMAJ, DLADM_TYPE_UINT64,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey &phymaj);
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey (void) dladm_set_conf_field(handle, conf2, FPHYINST,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz DLADM_TYPE_UINT64, &phyinst);
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey (void) dladm_write_conf(handle, conf2);
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey dladm_destroy_conf(handle, conf2);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz /*
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Delete link1 and mark link2 up.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz */
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy (void) dladm_remove_conf(handle, linkid1);
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey (void) dladm_destroy_datalink_id(handle, linkid1, DLADM_OPT_ACTIVE |
d62bc4badc1c1f1549c961cfb8b420e650e1272byz DLADM_OPT_PERSIST);
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey (void) dladm_up_datalink_id(handle, linkid2);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz /*
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 */
d62bc4badc1c1f1549c961cfb8b420e650e1272byz status = DLADM_STATUS_FAILED;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if ((nvlist_alloc(&nvl, 0, 0) != 0) ||
d62bc4badc1c1f1549c961cfb8b420e650e1272byz (nvlist_add_uint64(nvl, RCM_NV_LINKID, linkid2) != 0)) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz goto done;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz }
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (rcm_alloc_handle(NULL, 0, NULL, &rcm_hdl) != RCM_SUCCESS)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz goto done;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (rcm_notify_event(rcm_hdl, RCM_RESOURCE_LINK_NEW, 0, nvl, NULL) ==
d62bc4badc1c1f1549c961cfb8b420e650e1272byz RCM_SUCCESS) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz status = DLADM_STATUS_OK;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz }
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byzdone:
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (rcm_hdl != NULL)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz (void) rcm_free_handle(rcm_hdl);
aab83bb83be7342f6cfccaed8d5fe0b2f404855dJosef 'Jeff' Sipek nvlist_free(nvl);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (status);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz}
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz/*
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.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz */
d62bc4badc1c1f1549c961cfb8b420e650e1272byzstatic dladm_status_t
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeyi_dladm_rename_link_c3(dladm_handle_t handle, const char *link1,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey datalink_id_t linkid2)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz{
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dladm_conf_t conf;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dladm_status_t status;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (!dladm_valid_linkname(link1))
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (DLADM_STATUS_LINKINVAL);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou status = dladm_open_conf(handle, linkid2, &conf);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (status != DLADM_STATUS_OK)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz goto done;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey if ((status = dladm_set_conf_field(handle, conf, FDEVNAME,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey DLADM_TYPE_STR, link1)) == DLADM_STATUS_OK) {
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey status = dladm_write_conf(handle, conf);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz }
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey dladm_destroy_conf(handle, conf);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byzdone:
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (status);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz}
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byzdladm_status_t
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeydladm_rename_link(dladm_handle_t handle, const char *link1, const char *link2)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz{
d62bc4badc1c1f1549c961cfb8b420e650e1272byz datalink_id_t linkid1 = DATALINK_INVALID_LINKID;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz datalink_id_t linkid2 = DATALINK_INVALID_LINKID;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz uint32_t flags1, flags2;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz datalink_class_t class1, class2;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz uint32_t media1, media2;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz boolean_t remphy2 = B_FALSE;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dladm_status_t status;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey (void) dladm_name2info(handle, link1, &linkid1, &flags1, &class1,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey &media1);
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey if ((dladm_name2info(handle, link2, &linkid2, &flags2, &class2,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey &media2) == DLADM_STATUS_OK) && (class2 == DATALINK_CLASS_PHYS) &&
d62bc4badc1c1f1549c961cfb8b420e650e1272byz (flags2 == DLADM_OPT_PERSIST)) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz /*
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * see whether link2 is a removed physical link.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz */
d62bc4badc1c1f1549c961cfb8b420e650e1272byz remphy2 = B_TRUE;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz }
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (linkid1 != DATALINK_INVALID_LINKID) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (linkid2 == DATALINK_INVALID_LINKID) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz /*
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * case 1: rename an existing link to a link that
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * does not exist.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz */
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey status = i_dladm_rename_link_c1(handle, linkid1, link1,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey link2, flags1);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz } else if (remphy2) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz /*
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * case 2: rename an available link to a REMOVED
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * physical link. Return failure if link1 is not
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * an active physical link.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz */
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if ((class1 != class2) || (media1 != media2) ||
d62bc4badc1c1f1549c961cfb8b420e650e1272byz !(flags1 & DLADM_OPT_ACTIVE)) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz status = DLADM_STATUS_BADARG;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz } else {
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey status = i_dladm_rename_link_c2(handle, linkid1,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz linkid2);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz }
d62bc4badc1c1f1549c961cfb8b420e650e1272byz } else {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz status = DLADM_STATUS_EXIST;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz }
d62bc4badc1c1f1549c961cfb8b420e650e1272byz } else if (remphy2) {
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey status = i_dladm_rename_link_c3(handle, link1, linkid2);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz } else {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz status = DLADM_STATUS_NOTFOUND;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz }
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (status);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz}
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byztypedef struct consumer_del_phys_arg_s {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz datalink_id_t linkid;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz} consumer_del_phys_arg_t;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byzstatic int
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeyi_dladm_vlan_link_del(dladm_handle_t handle, datalink_id_t vlanid, void *arg)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz{
d62bc4badc1c1f1549c961cfb8b420e650e1272byz consumer_del_phys_arg_t *del_arg = arg;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dladm_vlan_attr_t vinfo;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dladm_status_t status;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey status = dladm_vlan_info(handle, vlanid, &vinfo, DLADM_OPT_PERSIST);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (status != DLADM_STATUS_OK)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (DLADM_WALK_CONTINUE);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (vinfo.dv_linkid == del_arg->linkid)
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey (void) dladm_vlan_delete(handle, vlanid, DLADM_OPT_PERSIST);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (DLADM_WALK_CONTINUE);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz}
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic int
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalai_dladm_part_link_del(dladm_handle_t handle, datalink_id_t partid, void *arg)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala{
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala consumer_del_phys_arg_t *del_arg = arg;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala dladm_part_attr_t pinfo;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala dladm_status_t status;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala status = dladm_part_info(handle, partid, &pinfo, DLADM_OPT_PERSIST);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (status != DLADM_STATUS_OK)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (DLADM_WALK_CONTINUE);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (pinfo.dia_physlinkid == del_arg->linkid)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) dladm_part_delete(handle, partid, DLADM_OPT_PERSIST);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (DLADM_WALK_CONTINUE);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala}
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
d62bc4badc1c1f1549c961cfb8b420e650e1272byzstatic int
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeyi_dladm_aggr_link_del(dladm_handle_t handle, datalink_id_t aggrid, void *arg)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz{
d62bc4badc1c1f1549c961cfb8b420e650e1272byz consumer_del_phys_arg_t *del_arg = arg;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dladm_aggr_grp_attr_t ginfo;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dladm_status_t status;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dladm_aggr_port_attr_db_t port[1];
d62bc4badc1c1f1549c961cfb8b420e650e1272byz int i;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey status = dladm_aggr_info(handle, aggrid, &ginfo, DLADM_OPT_PERSIST);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (status != DLADM_STATUS_OK)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (DLADM_WALK_CONTINUE);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz for (i = 0; i < ginfo.lg_nports; i++)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (ginfo.lg_ports[i].lp_linkid == del_arg->linkid)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz break;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (i != ginfo.lg_nports) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (ginfo.lg_nports == 1 && i == 0) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz consumer_del_phys_arg_t aggr_del_arg;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz /*
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * First delete all the VLANs on this aggregation, then
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * delete the aggregation itself.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz */
d62bc4badc1c1f1549c961cfb8b420e650e1272byz aggr_del_arg.linkid = aggrid;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz (void) dladm_walk_datalink_id(i_dladm_vlan_link_del,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey handle, &aggr_del_arg, DATALINK_CLASS_VLAN,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz DATALINK_ANY_MEDIATYPE, DLADM_OPT_PERSIST);
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey (void) dladm_aggr_delete(handle, aggrid,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey DLADM_OPT_PERSIST);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz } else {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz port[0].lp_linkid = del_arg->linkid;
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey (void) dladm_aggr_remove(handle, aggrid, 1, port,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz DLADM_OPT_PERSIST);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz }
d62bc4badc1c1f1549c961cfb8b420e650e1272byz }
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (DLADM_WALK_CONTINUE);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz}
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byztypedef struct del_phys_arg_s {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dladm_status_t rval;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz} del_phys_arg_t;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byzstatic int
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeyi_dladm_phys_delete(dladm_handle_t handle, datalink_id_t linkid, void *arg)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz{
d62bc4badc1c1f1549c961cfb8b420e650e1272byz uint32_t flags;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz datalink_class_t class;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz uint32_t media;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dladm_status_t status = DLADM_STATUS_OK;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz del_phys_arg_t *del_phys_arg = arg;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz consumer_del_phys_arg_t del_arg;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey if ((status = dladm_datalink_id2info(handle, linkid, &flags, &class,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz &media, NULL, 0)) != DLADM_STATUS_OK) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz goto done;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz }
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz /*
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * see whether this link is a removed physical link.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz */
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if ((class != DATALINK_CLASS_PHYS) || !(flags & DLADM_OPT_PERSIST) ||
d62bc4badc1c1f1549c961cfb8b420e650e1272byz (flags & DLADM_OPT_ACTIVE)) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz status = DLADM_STATUS_BADARG;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz goto done;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz }
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (media == DL_ETHER) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz del_arg.linkid = linkid;
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,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz DLADM_OPT_PERSIST);
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,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz DLADM_OPT_PERSIST);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala } else if (media == DL_IB) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala del_arg.linkid = linkid;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) dladm_walk_datalink_id(i_dladm_part_link_del, handle,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala &del_arg, DATALINK_CLASS_PART, DL_IB, DLADM_OPT_PERSIST);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz }
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey (void) dladm_remove_conf(handle, linkid);
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy (void) dladm_destroy_datalink_id(handle, linkid, DLADM_OPT_PERSIST);
d62bc4badc1c1f1549c961cfb8b420e650e1272byzdone:
d62bc4badc1c1f1549c961cfb8b420e650e1272byz del_phys_arg->rval = status;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (DLADM_WALK_CONTINUE);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz}
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byzdladm_status_t
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeydladm_phys_delete(dladm_handle_t handle, datalink_id_t linkid)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz{
d62bc4badc1c1f1549c961cfb8b420e650e1272byz del_phys_arg_t arg = {DLADM_STATUS_OK};
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (linkid == DATALINK_ALL_LINKID) {
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey (void) dladm_walk_datalink_id(i_dladm_phys_delete, handle, &arg,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz DATALINK_CLASS_PHYS, DATALINK_ANY_MEDIATYPE,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz DLADM_OPT_PERSIST);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (DLADM_STATUS_OK);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz } else {
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey (void) i_dladm_phys_delete(handle, linkid, &arg);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (arg.rval);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz }
d62bc4badc1c1f1549c961cfb8b420e650e1272byz}
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byzdladm_status_t
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeydladm_phys_info(dladm_handle_t handle, datalink_id_t linkid,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey dladm_phys_attr_t *dpap, uint32_t flags)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz{
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dladm_status_t status;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz assert(flags == DLADM_OPT_ACTIVE || flags == DLADM_OPT_PERSIST);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz switch (flags) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz case DLADM_OPT_PERSIST: {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dladm_conf_t conf;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou status = dladm_getsnap_conf(handle, linkid, &conf);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (status != DLADM_STATUS_OK)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (status);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey status = dladm_get_conf_field(handle, conf, FDEVNAME,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey dpap->dp_dev, MAXLINKNAMELEN);
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey dladm_destroy_conf(handle, conf);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (status);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz }
d62bc4badc1c1f1549c961cfb8b420e650e1272byz case DLADM_OPT_ACTIVE: {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dld_ioc_phys_attr_t dip;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dip.dip_linkid = linkid;
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey if (ioctl(dladm_dld_fd(handle), DLDIOC_PHYS_ATTR, &dip) < 0) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz status = dladm_errno2status(errno);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (status);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz }
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dpap->dp_novanity = dip.dip_novanity;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz (void) strlcpy(dpap->dp_dev, dip.dip_dev, MAXLINKNAMELEN);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (DLADM_STATUS_OK);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz }
d62bc4badc1c1f1549c961cfb8b420e650e1272byz default:
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (DLADM_STATUS_BADARG);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz }
d62bc4badc1c1f1549c961cfb8b420e650e1272byz}
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byztypedef struct i_walk_dev_state_s {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz const char *devname;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz datalink_id_t linkid;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz boolean_t found;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz} i_walk_dev_state_t;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
f595a68a3b8953a12aa778c2abd7642df8da8c3ayzint
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeyi_dladm_walk_dev2linkid(dladm_handle_t handle, datalink_id_t linkid, void *arg)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz{
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dladm_phys_attr_t dpa;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dladm_status_t status;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz i_walk_dev_state_t *statep = arg;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey status = dladm_phys_info(handle, linkid, &dpa, DLADM_OPT_PERSIST);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if ((status == DLADM_STATUS_OK) &&
d62bc4badc1c1f1549c961cfb8b420e650e1272byz (strcmp(statep->devname, dpa.dp_dev) == 0)) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz statep->found = B_TRUE;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz statep->linkid = linkid;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (DLADM_WALK_TERMINATE);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz }
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (DLADM_WALK_CONTINUE);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz}
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz/*
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Get the linkid from the physical device name.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz */
d62bc4badc1c1f1549c961cfb8b420e650e1272byzdladm_status_t
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeydladm_dev2linkid(dladm_handle_t handle, const char *devname,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey datalink_id_t *linkidp)
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz{
d62bc4badc1c1f1549c961cfb8b420e650e1272byz i_walk_dev_state_t state;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz state.found = B_FALSE;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz state.devname = devname;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey (void) dladm_walk_datalink_id(i_dladm_walk_dev2linkid, handle, &state,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz DATALINK_CLASS_PHYS, DATALINK_ANY_MEDIATYPE, DLADM_OPT_PERSIST);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (state.found == B_TRUE) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz *linkidp = state.linkid;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (DLADM_STATUS_OK);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz } else {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (dladm_errno2status(ENOENT));
d62bc4badc1c1f1549c961cfb8b420e650e1272byz }
d62bc4badc1c1f1549c961cfb8b420e650e1272byz}
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byzstatic int
d62bc4badc1c1f1549c961cfb8b420e650e1272byzparse_devname(const char *devname, char *driver, uint_t *ppa, size_t maxlen)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz{
d62bc4badc1c1f1549c961cfb8b420e650e1272byz char *cp, *tp;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz int len;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz /*
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * device name length must not be 0, and it must end with digit.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz */
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (((len = strlen(devname)) == 0) || !isdigit(devname[len - 1]))
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (EINVAL);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz (void) strlcpy(driver, devname, maxlen);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz cp = (char *)&driver[len - 1];
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz for (tp = cp; isdigit(*tp); tp--) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (tp <= driver)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (EINVAL);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz }
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz *ppa = atoi(tp + 1);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz *(tp + 1) = '\0';
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (0);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz}
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byzdladm_status_t
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskeydladm_linkid2legacyname(dladm_handle_t handle, datalink_id_t linkid, char *dev,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey size_t len)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz{
d62bc4badc1c1f1549c961cfb8b420e650e1272byz char devname[MAXLINKNAMELEN];
d62bc4badc1c1f1549c961cfb8b420e650e1272byz uint16_t vid = VLAN_ID_NONE;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz datalink_class_t class;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dladm_status_t status;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey status = dladm_datalink_id2info(handle, linkid, NULL, &class, NULL,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey NULL, 0);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (status != DLADM_STATUS_OK)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz goto done;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz /*
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * If this is a VLAN, we must first determine the class and linkid of
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * the link the VLAN has been created over.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz */
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (class == DATALINK_CLASS_VLAN) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dladm_vlan_attr_t dva;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey status = dladm_vlan_info(handle, linkid, &dva,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey DLADM_OPT_ACTIVE);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (status != DLADM_STATUS_OK)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz goto done;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz linkid = dva.dv_linkid;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz vid = dva.dv_vid;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey if ((status = dladm_datalink_id2info(handle, linkid, NULL,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey &class, NULL, NULL, 0)) != DLADM_STATUS_OK) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz goto done;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz }
d62bc4badc1c1f1549c961cfb8b420e650e1272byz }
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz switch (class) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz case DATALINK_CLASS_AGGR: {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dladm_aggr_grp_attr_t dga;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey status = dladm_aggr_info(handle, linkid, &dga,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey DLADM_OPT_ACTIVE);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (status != DLADM_STATUS_OK)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz goto done;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (dga.lg_key == 0) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz /*
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * If the key was not specified when the aggregation
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * is created, we cannot guess its /dev node name.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz */
d62bc4badc1c1f1549c961cfb8b420e650e1272byz status = DLADM_STATUS_BADARG;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz goto done;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz }
d62bc4badc1c1f1549c961cfb8b420e650e1272byz (void) snprintf(devname, MAXLINKNAMELEN, "aggr%d", dga.lg_key);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz break;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz }
d62bc4badc1c1f1549c961cfb8b420e650e1272byz case DATALINK_CLASS_PHYS: {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dladm_phys_attr_t dpa;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey status = dladm_phys_info(handle, linkid, &dpa,
4ac67f0276a8313b5cefec38af347b94b7bfb526Anurag S. Maskey DLADM_OPT_PERSIST);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (status != DLADM_STATUS_OK)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz goto done;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz (void) strlcpy(devname, dpa.dp_dev, MAXLINKNAMELEN);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz break;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz }
d62bc4badc1c1f1549c961cfb8b420e650e1272byz default:
d62bc4badc1c1f1549c961cfb8b420e650e1272byz status = DLADM_STATUS_BADARG;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz goto done;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz }
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (vid != VLAN_ID_NONE) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz char drv[MAXNAMELEN];
d62bc4badc1c1f1549c961cfb8b420e650e1272byz uint_t ppa;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (parse_devname(devname, drv, &ppa, MAXNAMELEN) != 0) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz status = DLADM_STATUS_BADARG;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz goto done;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz }
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (snprintf(dev, len, "%s%d", drv, vid * 1000 + ppa) >= len)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz status = DLADM_STATUS_TOOSMALL;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz } else {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (strlcpy(dev, devname, len) >= len)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz status = DLADM_STATUS_TOOSMALL;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz }
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byzdone:
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (status);
f595a68a3b8953a12aa778c2abd7642df8da8c3ayz}
e7801d59e8ceda0cde8ebdfdddd7582ee2ea96efsowmini
e7801d59e8ceda0cde8ebdfdddd7582ee2ea96efsowminidladm_status_t
e7801d59e8ceda0cde8ebdfdddd7582ee2ea96efsowminidladm_parselink(const char *dev, char *provider, uint_t *ppa)
e7801d59e8ceda0cde8ebdfdddd7582ee2ea96efsowmini{
e7801d59e8ceda0cde8ebdfdddd7582ee2ea96efsowmini ifspec_t ifsp;
e7801d59e8ceda0cde8ebdfdddd7582ee2ea96efsowmini
e7801d59e8ceda0cde8ebdfdddd7582ee2ea96efsowmini if (dev == NULL || !ifparse_ifspec(dev, &ifsp))
e7801d59e8ceda0cde8ebdfdddd7582ee2ea96efsowmini return (DLADM_STATUS_LINKINVAL);
e7801d59e8ceda0cde8ebdfdddd7582ee2ea96efsowmini
e7801d59e8ceda0cde8ebdfdddd7582ee2ea96efsowmini if (provider != NULL)
e7801d59e8ceda0cde8ebdfdddd7582ee2ea96efsowmini (void) strlcpy(provider, ifsp.ifsp_devnm, DLPI_LINKNAME_MAX);
e7801d59e8ceda0cde8ebdfdddd7582ee2ea96efsowmini
e7801d59e8ceda0cde8ebdfdddd7582ee2ea96efsowmini if (ppa != NULL)
e7801d59e8ceda0cde8ebdfdddd7582ee2ea96efsowmini *ppa = ifsp.ifsp_ppa;
e7801d59e8ceda0cde8ebdfdddd7582ee2ea96efsowmini
e7801d59e8ceda0cde8ebdfdddd7582ee2ea96efsowmini return (DLADM_STATUS_OK);
e7801d59e8ceda0cde8ebdfdddd7582ee2ea96efsowmini}